diff --git a/deploy-package-20260223-151231/README.txt b/deploy-package-20260223-151231/README.txt deleted file mode 100644 index 7a1b445..0000000 --- a/deploy-package-20260223-151231/README.txt +++ /dev/null @@ -1,23 +0,0 @@ -================================================================================ - ROA2WEB DEPLOYMENT PACKAGE - Generated: 2026-02-23 15:12:31 - From: Linux/LXC deployment script -================================================================================ - -CONTENTS: ---------- - backend/ Unified FastAPI backend - frontend/ Vue.js SPA (production build) - shared/ Shared Python modules - config/ Configuration templates - scripts/ PowerShell deployment scripts - -DEPLOYMENT: ------------ -Server will auto-deploy within 5 minutes (Check-And-Deploy.ps1 scheduled task) - -Or manually: - cd scripts - .\ROA2WEB-Console.ps1 -NonInteractive -Action DeployAll - -================================================================================ diff --git a/deploy-package-20260223-151231/backend/.env.example b/deploy-package-20260223-151231/backend/.env.example deleted file mode 100644 index e7a73bc..0000000 --- a/deploy-package-20260223-151231/backend/.env.example +++ /dev/null @@ -1,179 +0,0 @@ -# ============================================================================ -# ROA2WEB Unified Backend - Environment Configuration Template -# ============================================================================ -# Single backend process serving Reports, Data Entry, and Telegram modules -# -# SETUP INSTRUCTIONS: -# 1. Copy this template: cp .env.example .env.dev -# 2. Fill in your actual values in .env.dev -# 3. Run: ./start-dev.sh (auto-copies .env.dev to .env) -# -# ENVIRONMENT FILES: -# - .env.dev → Development config (committed to git with real values) -# - .env.test → Test config (committed to git) -# - .env.prod → Production config template (committed, use placeholders!) -# - .env → Active config (auto-generated, NOT committed) -# -# IMPORTANT: Never manually edit .env - edit .env.dev instead! - -# ============================================================================ -# ORACLE DATABASE CONFIGURATION -# ============================================================================ -# Single server: Use ORACLE_USER/HOST/PORT/SID -# Multi-server: Use ORACLE_SERVERS JSON (ignores single server vars) -# Passwords: secrets/{id}.oracle_pass -# SSH tunnels: ssh-tunnels.json (separate file) - -ORACLE_USER=CONTAFIN_ORACLE -ORACLE_PASSWORD=SET_IN_SECRETS_FILE -ORACLE_HOST=localhost -ORACLE_PORT=1521 -ORACLE_SID=ROA - -# Multi-server example (uncomment to use): -# ORACLE_SERVERS='[{"id":"server1","name":"Server 1","host":"localhost","port":1521,"user":"USER","sid":"ROA"}]' - -# ============================================================================ -# JWT AUTHENTICATION (REQUIRED - Shared by all modules) -# ============================================================================ -# Used for JWT token generation and validation (shared/auth/jwt_handler.py) -# Generate strong secret: python3 -c "import secrets; print(secrets.token_urlsafe(32))" - -JWT_SECRET_KEY=GENERATE_STRONG_SECRET_IN_PRODUCTION -JWT_ALGORITHM=HS256 - -# Token expiration settings (used by shared/auth/jwt_handler.py) -ACCESS_TOKEN_EXPIRE_MINUTES=30 -REFRESH_TOKEN_EXPIRE_DAYS=7 - -# ============================================================================ -# SESSION SECURITY - EMAIL 2FA (REQUIRED for Telegram email login) -# ============================================================================ -# Used by Telegram module for session token validation -# Generate with: python3 -c "import secrets; print(secrets.token_urlsafe(32))" - -AUTH_SESSION_SECRET=your-secure-random-secret-here-min-32-chars - -# ============================================================================ -# SERVER CONFIGURATION -# ============================================================================ -# Unified backend server settings - -API_HOST=0.0.0.0 -API_PORT=8000 -DEBUG=false - -# CORS Origins (comma-separated) -CORS_ORIGINS=http://localhost:3000,http://localhost:5173 - -# ============================================================================ -# REPORTS MODULE - CACHE CONFIGURATION (OPTIONAL - defaults provided) -# ============================================================================ -# Two-tier hybrid cache system (L1: in-memory LRU, L2: SQLite persistent) -# Used by backend/modules/reports/cache/config.py - -# Core Settings -REPORTS_CACHE_ENABLED=True -REPORTS_CACHE_TYPE=hybrid -REPORTS_CACHE_SQLITE_PATH=./data/cache/roa2web_cache.db -REPORTS_CACHE_MEMORY_MAX_SIZE=1000 -REPORTS_CACHE_DEFAULT_TTL=900 - -# TTL per Cache Type (seconds) -REPORTS_CACHE_TTL_SCHEMA=86400 -REPORTS_CACHE_TTL_COMPANIES=1800 -REPORTS_CACHE_TTL_DASHBOARD_SUMMARY=1800 -REPORTS_CACHE_TTL_DASHBOARD_TRENDS=1800 -REPORTS_CACHE_TTL_INVOICES=600 -REPORTS_CACHE_TTL_INVOICES_SUMMARY=900 -REPORTS_CACHE_TTL_TREASURY=600 - -# Maintenance -REPORTS_CACHE_CLEANUP_INTERVAL=3600 - -# Event-Based Invalidation (experimental) -REPORTS_CACHE_AUTO_INVALIDATE=False -REPORTS_CACHE_CHECK_INTERVAL=300 - -# Performance Tracking -REPORTS_CACHE_TRACK_PERFORMANCE=True -REPORTS_CACHE_BENCHMARK_ON_STARTUP=False - -# ============================================================================ -# DATA ENTRY MODULE - CONFIGURATION -# ============================================================================ -# Data Entry module settings (receipts, OCR, etc.) - -# SQLite Database -DATA_ENTRY_SQLITE_DATABASE_PATH=data/receipts/receipts.db - -# File uploads -DATA_ENTRY_UPLOAD_PATH=data/receipts/uploads -DATA_ENTRY_MAX_UPLOAD_SIZE_MB=10 - -# ============================================================================ -# OCR ENGINE CONFIGURATION -# ============================================================================ -# Control which OCR engines are loaded at startup. -# Disabling engines saves memory but limits available OCR modes. - -# Enable/disable PaddleOCR (set to 'false' to save ~800MB RAM) -# When disabled: 'paddleocr' engine unavailable -OCR_ENABLE_PADDLEOCR=false - -# Enable/disable Tesseract (set to 'false' to save ~50MB RAM) -# When disabled: 'tesseract' engine unavailable -OCR_ENABLE_TESSERACT=false - -# Default OCR engine when not specified in request -# Options: tesseract, doctr, doctr_plus, paddleocr -# Recommended: doctr_plus (2-tier sequential with early exit, ~7.5s avg) -OCR_DEFAULT_ENGINE=doctr_plus - -# Active OCR engines shown in frontend dropdown (comma-separated) -# Options: tesseract, doctr, doctr_plus, paddleocr -# doctr_plus: 73.3% perfect, 7.5s avg, 65% fast path (recommended) -# doctr: 63.3% perfect, simpler but faster -OCR_ACTIVE_ENGINES=tesseract,doctr,doctr_plus,paddleocr - -# OCR Worker Pool Configuration -# Number of parallel OCR workers (each loads ~1GB for docTR) -# Recommended: 2 for 8GB RAM, 3 for 16GB RAM -OCR_WORKERS=2 - -# Max tasks per worker before restart (0 = no restart, saves 40-60s warmup time) -# Set to 0 for testing, 10-20 for production (prevents memory leaks) -OCR_MAX_TASKS_PER_CHILD=0 - -# ============================================================================ -# TELEGRAM MODULE - BOT CONFIGURATION (REQUIRED for Telegram features) -# ============================================================================ -# Obtain bot token from @BotFather on Telegram - -TELEGRAM_BOT_TOKEN=your_bot_token_here - -# ============================================================================ -# TELEGRAM MODULE - EMAIL AUTHENTICATION (SMTP) (REQUIRED for email 2FA) -# ============================================================================ -# Required for email-based 2FA authentication flow -# Users can login with email + password instead of web app linking - -# SMTP Server Configuration -TELEGRAM_SMTP_HOST=mail.romfast.ro -TELEGRAM_SMTP_PORT=587 -TELEGRAM_SMTP_USER=ups@romfast.ro -TELEGRAM_SMTP_PASSWORD=your_smtp_password_here -TELEGRAM_SMTP_FROM_EMAIL=ups@romfast.ro -TELEGRAM_SMTP_FROM_NAME=ROA2WEB -TELEGRAM_SMTP_USE_TLS=true - -# Email Retry Settings -TELEGRAM_EMAIL_MAX_RETRIES=3 -TELEGRAM_EMAIL_RETRY_DELAY=2.0 - -# ============================================================================ -# TELEGRAM MODULE - DATABASE (SQLite for bot data) -# ============================================================================ -# Separate SQLite database for Telegram bot auth codes and sessions - -TELEGRAM_SQLITE_DATABASE_PATH=data/telegram/telegram.db diff --git a/deploy-package-20260223-151231/backend/ENV-SETUP.md b/deploy-package-20260223-151231/backend/ENV-SETUP.md deleted file mode 100644 index 9a808dd..0000000 --- a/deploy-package-20260223-151231/backend/ENV-SETUP.md +++ /dev/null @@ -1,212 +0,0 @@ -# Environment Configuration Guide - -## Overview - -The unified backend uses environment-specific configuration files that are automatically loaded by startup scripts. - -**SECURITY**: All `.env*` files (except `.env*.example`) contain real credentials and are **NEVER committed to git**. - -## File Structure - -``` -backend/ -├── .env.prod.example # Production template (COMMITTED - no credentials) -├── .env.test.example # Test template (COMMITTED - no credentials) -├── .env.prod.example # Production template (COMMITTED - no credentials) -├── .env.example # Generic template (COMMITTED) -├── .env.prod # Production config (IGNORED - real credentials) -├── .env.test # Test config (IGNORED - real credentials) -├── .env.prod # Production config (IGNORED - real credentials) -└── .env # Active config (IGNORED - auto-generated) -``` - -## First-Time Setup - -### Production -```bash -# 1. Copy template -cp backend/.env.prod.example backend/.env.prod - -# 2. Edit with your credentials -vim backend/.env.prod - -# 3. Fill in: -# - ORACLE_PASSWORD -# - JWT_SECRET_KEY (generate with: python3 -c "import secrets; print(secrets.token_urlsafe(32))") -# - AUTH_SESSION_SECRET (generate with: python3 -c "import secrets; print(secrets.token_urlsafe(32))") -# - TELEGRAM_BOT_TOKEN (from @BotFather) -# - SMTP_PASSWORD - -# 4. Start -./start.sh prod -``` - -### Test -```bash -# Same process with .env.test -cp backend/.env.test.example backend/.env.test -vim backend/.env.test -# Fill in TEST credentials (separate from dev!) -./start.sh test -``` - -### Production -```bash -# Same process with .env.prod -cp backend/.env.prod.example backend/.env.prod -vim backend/.env.prod -# Fill in PRODUCTION credentials (generate NEW secrets!) -./start-backend.sh start -``` - -## How It Works - -### Production -```bash -./start.sh prod # Checks for .env.prod → copies to .env → starts backend -``` - -### Test -```bash -./start.sh test # Checks for .env.test → copies to .env → starts backend -``` - -### Production -```bash -# Manual setup (one-time) -cp .env.prod.example .env.prod -vim .env.prod # Fill in credentials -# Then start -./start-backend.sh start -``` - -## Important Rules - -### ✅ DO -- Copy `.env.*.example` to `.env.*` and fill in real credentials -- Edit `.env.prod` for production changes -- Edit `.env.test` for test environment changes -- Edit `.env.prod` for production -- Generate **new** secrets for each environment -- Keep `.env.prod`, `.env.test`, `.env.prod` **local only** (never commit!) - -### ❌ DON'T -- Don't commit `.env`, `.env.prod`, `.env.test`, or `.env.prod` (they're in .gitignore) -- Don't manually edit `.env` (it's auto-generated!) -- Don't use same secrets across environments -- Don't share credentials via git (use secure channels) -- Don't put real credentials in `.env*.example` files - -## Environment Differences - -| Setting | .env.prod | .env.test | .env.prod | -|---------|----------|-----------|-----------| -| Oracle SID | `ROA` | `roa` | `ROA` | -| JWT Expire | 30 min | 480 min | 30 min | -| DEBUG | `true` | `true` | `false` | -| Cache DB | `roa2web_cache.db` | `roa2web_cache_test.db` | `roa2web_cache_prod.db` | -| Receipts DB | `receipts_dev.db` | `receipts_test.db` | `receipts_prod.db` | -| Telegram DB | `telegram.db` | `telegram_test.db` | `telegram_prod.db` | - -## Security Notes - -### Template Files (.env.*.example) -These contain **placeholders only**: -- ✅ Safe to commit to git -- ✅ Shared across team -- ✅ No real credentials -- 📖 Used as reference for first-time setup - -### Actual Config Files (.env.prod, .env.test, .env.prod) -These contain **real credentials**: -- ❌ **NEVER commit to git** (in .gitignore) -- ❌ Never share via email/chat -- ✅ Keep local only -- ✅ Generate unique secrets per environment -- 🔐 Share securely if needed (encrypted vault, 1Password, etc.) - -### Active Config (.env) -This is **auto-generated** and **ignored by git**: -- ❌ Never commit to git -- 🔄 Auto-overwritten by startup scripts -- 📝 Edit source files (.env.prod, .env.test) instead - -## Generating Secrets - -For `JWT_SECRET_KEY` and `AUTH_SESSION_SECRET`: -```bash -python3 -c "import secrets; print(secrets.token_urlsafe(32))" -``` - -Generate **different** secrets for dev, test, and production! - -## Quick Reference - -### First Time Setup -```bash -# 1. Copy template -cp backend/.env.prod.example backend/.env.prod - -# 2. Fill credentials -vim backend/.env.prod - -# 3. Start -./start.sh prod -``` - -### Changing Configuration -```bash -# 1. Edit source file -vim backend/.env.prod - -# 2. Restart to apply -./start.sh prod -``` - -### Production Deployment -```bash -# 1. Copy template -cp backend/.env.prod.example backend/.env.prod - -# 2. Fill in PRODUCTION values -vim backend/.env.prod - -# 3. Generate NEW secrets -python3 -c "import secrets; print(secrets.token_urlsafe(32))" - -# 4. Start backend -./start-backend.sh start -``` - -## Troubleshooting - -### "Wrong database" error -Check that you're using the correct startup script: -- Production: `./start.sh prod` (uses `.env.prod`) -- Test: `./start.sh test` (uses `.env.test`) - -### ".env.prod not found" error -First-time setup required: -```bash -cp backend/.env.prod.example backend/.env.prod -vim backend/.env.prod # Fill in your credentials -``` - -### Changes not taking effect -The `.env` file is regenerated on each start. Edit the source file (`.env.prod` or `.env.test`) instead. - -### Checking what will be committed -```bash -git status backend/.env* -# Should show: -# modified: .env.prod.example (if you changed template) -# nothing else! -``` - -## Team Sharing - -**Templates only** are committed to git: -- Share configuration structure via `.env*.example` -- Each developer creates their own `.env.prod` from template -- Never commit actual credentials -- Use secure channels for sharing sensitive values (1Password, encrypted vault, etc.) diff --git a/deploy-package-20260223-151231/backend/QUICK-ENV-REFERENCE.md b/deploy-package-20260223-151231/backend/QUICK-ENV-REFERENCE.md deleted file mode 100644 index cebdedf..0000000 --- a/deploy-package-20260223-151231/backend/QUICK-ENV-REFERENCE.md +++ /dev/null @@ -1,102 +0,0 @@ -# Quick Environment Reference - -## 🔒 SECURITY FIRST - -**All `.env*` files (except `.env*.example`) contain real credentials and are NEVER committed to git!** - -## 🚀 First-Time Setup - -```bash -# 1. Copy template with real credentials -cp backend/.env.prod.example backend/.env.prod - -# 2. Edit with YOUR credentials -vim backend/.env.prod - -# 3. Fill in the placeholders: -# - ORACLE_PASSWORD -# - JWT_SECRET_KEY -# - AUTH_SESSION_SECRET -# - TELEGRAM_BOT_TOKEN -# - SMTP_PASSWORD - -# 4. Start production -./start.sh prod -``` - -## 📋 Daily Usage - -```bash -# Production (uses .env.prod automatically) -./start.sh prod - -# Test Environment (uses .env.test automatically) -./start.sh test - -# Quick Restart (uses existing .env) -./start-backend.sh restart -``` - -## ✏️ Changing Configuration - -```bash -# 1. Edit the source file (NOT .env!) -vim backend/.env.prod # Production -vim backend/.env.test # Test - -# 2. Restart to apply changes -./start.sh prod -``` - -## 📁 Which File to Edit? - -| You Want To... | Edit This File | -|----------------|----------------| -| Change dev database password | `backend/.env.prod` | -| Update test server settings | `backend/.env.test` | -| Add new environment variable | Templates: `.env*.example` + your `.env.prod`/`.env.test` | -| Create production config | Copy `.env.prod.example` to `.env.prod` and fill secrets | - -## 🔑 Generating Secrets - -```bash -# For JWT_SECRET_KEY and AUTH_SESSION_SECRET -python3 -c "import secrets; print(secrets.token_urlsafe(32))" -``` - -**Generate DIFFERENT secrets for each environment (dev, test, prod)!** - -## ⚠️ Important - -- **Never edit** `backend/.env` directly (it's auto-generated!) -- **Always edit** `backend/.env.prod` or `.env.test` -- **Never commit** `.env`, `.env.prod`, `.env.test`, `.env.prod` -- **Only commit** `.env*.example` (templates with placeholders) -- Restart after changes for them to take effect - -## 🛡️ Git Behavior - -| File | Git Status | Contains | -|------|-----------|----------| -| `.env.prod.example` | ✅ Committed | Template (placeholders) | -| `.env.test.example` | ✅ Committed | Template (placeholders) | -| `.env.prod.example` | ✅ Committed | Template (placeholders) | -| `.env.example` | ✅ Committed | Generic template | -| `.env.prod` | ❌ Ignored | **Real dev credentials** | -| `.env.test` | ❌ Ignored | **Real test credentials** | -| `.env.prod` | ❌ Ignored | **Real prod credentials** | -| `.env` | ❌ Ignored | Auto-generated (current) | - -## ✅ Quick Check - -```bash -# See what git will commit -git status backend/.env* - -# Should show ONLY .env*.example files -# If .env.prod or .env.test appear, they're NOT properly ignored! -``` - -## 📖 More Info - -See `backend/ENV-SETUP.md` for complete documentation. diff --git a/deploy-package-20260223-151231/backend/TEST-OCR-WINDOWS.bat b/deploy-package-20260223-151231/backend/TEST-OCR-WINDOWS.bat deleted file mode 100644 index a6f6e74..0000000 --- a/deploy-package-20260223-151231/backend/TEST-OCR-WINDOWS.bat +++ /dev/null @@ -1,168 +0,0 @@ -@echo off -setlocal enabledelayedexpansion - -cd /d "%~dp0" - -REM Parse command line arguments for worker counts -REM Usage: TEST-OCR-WINDOWS.bat [worker_counts...] -REM Examples: -REM TEST-OCR-WINDOWS.bat -> tests 1,2,3 workers (default) -REM TEST-OCR-WINDOWS.bat 1 -> tests only 1 worker -REM TEST-OCR-WINDOWS.bat 3 6 -> tests 3 and 6 workers -REM TEST-OCR-WINDOWS.bat 1 2 3 4 5 6 -> tests all - -set "WORKER_LIST=%*" -if "%WORKER_LIST%"=="" set "WORKER_LIST=1 2 3" - -echo. -echo ========================================== -echo OCR Benchmark - Windows (Workers: %WORKER_LIST%) -echo ========================================== -echo. - -REM Check if Poppler is installed -where pdftoppm >nul 2>&1 -if errorlevel 1 ( - echo Checking for Poppler... - if exist "E:\poppler" ( - for /r "E:\poppler" %%i in (pdftoppm.exe) do ( - set "POPPLER_BIN=%%~dpi" - goto :found_poppler - ) - ) - echo. - echo ERROR: Poppler not found! - pause - exit /b 1 -) -:found_poppler -if defined POPPLER_BIN ( - echo Found Poppler at: %POPPLER_BIN% - set "PATH=%POPPLER_BIN%;%PATH%" -) - -REM Check venv -if not exist "venv-win\Scripts\python.exe" ( - echo ERROR: venv-win not found! - echo Run: python -m venv venv-win - echo Then: venv-win\Scripts\pip install -r requirements.txt - pause - exit /b 1 -) - -REM Set common environment -set JWT_SECRET_KEY=generate_with_secrets_token_urlsafe_32 -set ORACLE_HOST=10.0.20.121 -set ORACLE_PORT=1521 -set ORACLE_USER=CONTAFIN_ORACLE -set ORACLE_PASSWORD=ROMFASTSOFT -set ORACLE_SERVICE_NAME=ROA -set OCR_ENABLE_PADDLEOCR=false -set OCR_ENABLE_TESSERACT=false -set OCR_DEFAULT_ENGINE=hybrid-doctr -set OCR_MAX_TASKS_PER_CHILD=0 -set LOG_LEVEL=WARNING - -REM Results file with timestamp -for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /value') do set datetime=%%I -set RESULTS_FILE=ocr_benchmark_%datetime:~0,8%_%datetime:~8,4%.json - -echo Results will be saved to: %RESULTS_FILE% -echo. - -REM Delete old results file if exists -if exist "%RESULTS_FILE%" del "%RESULTS_FILE%" - -REM Run tests with specified workers -for %%W in (%WORKER_LIST%) do ( - call :run_test %%W -) - -goto :show_summary - -:run_test -set WORKERS=%1 -echo. -echo ############################################################ -echo STARTING TEST WITH %WORKERS% WORKER(S) -echo ############################################################ -echo. - -REM Kill existing processes on port 8006 -echo Cleaning up old processes... -for /f "tokens=5" %%a in ('netstat -ano ^| findstr :8006 ^| findstr LISTENING 2^>nul') do ( - taskkill /F /PID %%a >nul 2>&1 -) -taskkill /F /FI "WINDOWTITLE eq ROA2WEB Backend*" >nul 2>&1 -timeout /t 3 >nul - -REM Set workers count -set OCR_WORKERS=%WORKERS% - -echo Starting backend with %WORKERS% OCR worker(s)... - -REM Start backend in a new minimized window with all OCR env vars -start /min "ROA2WEB Backend %WORKERS% workers" cmd /c "set OCR_WORKERS=%WORKERS%&& set OCR_ENABLE_PADDLEOCR=false&& set OCR_ENABLE_TESSERACT=false&& set OCR_DEFAULT_ENGINE=hybrid-doctr&& set LOG_LEVEL=WARNING&& venv-win\Scripts\python.exe -m uvicorn main:app --host 0.0.0.0 --port 8006 --workers 1 2>&1" - -REM Wait for backend to be ready -echo Waiting for backend to start... -set attempts=0 -:wait_loop -timeout /t 3 >nul -set /a attempts+=1 -curl -s http://localhost:8006/health >nul 2>&1 -if errorlevel 1 ( - if !attempts! lss 40 ( - echo Waiting... !attempts!/40 - goto :wait_loop - ) - echo ERROR: Backend failed to start! - goto :eof -) - -echo Backend is ready! - -REM Wait for OCR warmup -echo Waiting for OCR worker warmup (30s)... -timeout /t 30 >nul - -echo. -echo Running OCR test with %WORKERS% worker(s)... -echo. - -venv-win\Scripts\python.exe ..\tests\ocr-validation\test_receipts_parallel_windows.py --port 8006 --workers %WORKERS% --output %RESULTS_FILE% - -REM Stop backend -echo. -echo Stopping backend... -taskkill /F /FI "WINDOWTITLE eq ROA2WEB Backend*" >nul 2>&1 -for /f "tokens=5" %%a in ('netstat -ano ^| findstr :8006 ^| findstr LISTENING 2^>nul') do ( - taskkill /F /PID %%a >nul 2>&1 -) - -REM Wait for memory to be released -echo Releasing memory (10s)... -timeout /t 10 >nul -goto :eof - -:show_summary -echo. -echo ############################################################ -echo ALL TESTS COMPLETE -echo ############################################################ -echo. -echo Results saved to: %RESULTS_FILE% -echo. - -REM Show summary from results file -if exist "%RESULTS_FILE%" ( - echo BENCHMARK SUMMARY: - echo ------------------ - venv-win\Scripts\python.exe -c "import json; data=json.load(open('%RESULTS_FILE%')); print(); [print(f\" {r['workers']} worker(s): {r['total_time']:.1f}s total, {r['avg_time']:.1f}s avg, {r.get('peak_memory_mb', 0):.0f}MB peak, {r['successful']}/{r['submitted']} success\") for r in data]" - echo. -) - -echo Press any key to exit... -pause >nul - -endlocal diff --git a/deploy-package-20260223-151231/backend/__init__.py b/deploy-package-20260223-151231/backend/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/config.py b/deploy-package-20260223-151231/backend/config.py deleted file mode 100644 index c1c2984..0000000 --- a/deploy-package-20260223-151231/backend/config.py +++ /dev/null @@ -1,296 +0,0 @@ -""" -Unified Configuration for ROA2WEB Backend -Consolidates settings from Reports, Data Entry, and Telegram modules -""" - -import os -import json -import logging -from pathlib import Path -from typing import List, Optional -from pydantic_settings import BaseSettings -from pydantic import BaseModel -from functools import lru_cache - -logger = logging.getLogger(__name__) - - -class OracleServerConfig(BaseModel): - """Configuration for a single Oracle server instance.""" - id: str # Unique identifier (e.g., "romfast", "client_a") - name: str # Human-readable name (e.g., "Romfast - Producție") - host: str = "localhost" - port: int = 1521 - user: str - password: str - sid: Optional[str] = None - service_name: Optional[str] = None - - def get_dsn(self) -> str: - """Build DSN string for this server.""" - if self.service_name: - return f"{self.host}:{self.port}/{self.service_name}" - elif self.sid: - return f"{self.host}:{self.port}:{self.sid}" - else: - return f"{self.host}:{self.port}/ROA" - - -class UnifiedSettings(BaseSettings): - """Unified application settings for all modules.""" - - # ============================================================================ - # GENERAL APPLICATION SETTINGS - # ============================================================================ - app_name: str = "ROA2WEB Unified Backend" - app_version: str = "1.0.0" - debug: bool = False - api_host: str = "0.0.0.0" - api_port: int = 8000 - - # ============================================================================ - # ORACLE DATABASE (Shared by all modules) - # ============================================================================ - # Legacy single-server configuration (backward compatible) - oracle_user: str = "" - oracle_password: str = "" - oracle_host: str = "localhost" - oracle_port: int = 1526 - oracle_sid: str = "ROA" - - # ============================================================================ - # MULTI-ORACLE SERVER CONFIGURATION (Optional) - # ============================================================================ - # JSON array of server configs. If not set, uses legacy single-server config. - # Example: ORACLE_SERVERS='[{"id": "romfast", "name": "Romfast", "host": "localhost", "port": 1521, "user": "USER", "password": "PASS", "sid": "ROA"}]' - oracle_servers: Optional[str] = None # Raw JSON string from env - - # Parsed server configurations (populated in model_post_init) - _oracle_servers_parsed: List[OracleServerConfig] = [] - - def model_post_init(self, __context) -> None: - """Parse ORACLE_SERVERS JSON and build server list. - - Oracle passwords are loaded from: - 1. secrets/{server_id}.oracle_pass file (preferred, more secure) - 2. password field in ORACLE_SERVERS JSON (fallback) - """ - servers = [] - secrets_dir = Path(__file__).parent / "secrets" - - if self.oracle_servers: - # Parse multi-server JSON configuration - try: - servers_data = json.loads(self.oracle_servers) - if not isinstance(servers_data, list): - raise ValueError("ORACLE_SERVERS must be a JSON array") - - for server_data in servers_data: - server_id = server_data.get("id", "default") - - # Try to load password from secrets file - pass_file = secrets_dir / f"{server_id}.oracle_pass" - if pass_file.exists(): - server_data["password"] = pass_file.read_text().strip() - logger.debug(f"Loaded Oracle password for '{server_id}' from {pass_file}") - elif "password" not in server_data: - logger.warning(f"No password found for server '{server_id}' - check secrets/{server_id}.oracle_pass") - - servers.append(OracleServerConfig(**server_data)) - - logger.info(f"Loaded {len(servers)} Oracle servers from ORACLE_SERVERS config") - for srv in servers: - logger.info(f" - {srv.id}: {srv.name} ({srv.host}:{srv.port})") - except json.JSONDecodeError as e: - logger.error(f"Failed to parse ORACLE_SERVERS JSON: {e}") - raise ValueError(f"Invalid ORACLE_SERVERS JSON format: {e}") - else: - # Backward compatibility: build default server from legacy config - if self.oracle_user: - # Try to load password from secrets file - password = self.oracle_password - pass_file = secrets_dir / "default.oracle_pass" - if pass_file.exists(): - password = pass_file.read_text().strip() - logger.debug(f"Loaded Oracle password from {pass_file}") - - default_server = OracleServerConfig( - id="default", - name="Default Server", - host=self.oracle_host, - port=self.oracle_port, - user=self.oracle_user, - password=password, - sid=self.oracle_sid, - ) - servers.append(default_server) - logger.info("Using legacy single-server Oracle configuration (ORACLE_USER/HOST/etc)") - logger.info(f" - default: {default_server.host}:{default_server.port}/{default_server.sid}") - - object.__setattr__(self, '_oracle_servers_parsed', servers) - - def get_oracle_servers(self) -> List[OracleServerConfig]: - """Get list of configured Oracle servers.""" - return self._oracle_servers_parsed - - def get_oracle_server(self, server_id: str) -> Optional[OracleServerConfig]: - """Get a specific Oracle server by ID.""" - for server in self._oracle_servers_parsed: - if server.id == server_id: - return server - return None - - def get_default_oracle_server(self) -> Optional[OracleServerConfig]: - """Get the default Oracle server (first in list or 'default').""" - if not self._oracle_servers_parsed: - return None - # Try to find server with id='default', otherwise return first - for server in self._oracle_servers_parsed: - if server.id == "default": - return server - return self._oracle_servers_parsed[0] - - # ============================================================================ - # JWT AUTHENTICATION (Shared by all modules) - # ============================================================================ - jwt_secret_key: str = "change-me-in-production" - jwt_algorithm: str = "HS256" - access_token_expire_minutes: int = 30 - refresh_token_expire_days: int = 7 - - # ============================================================================ - # SESSION SECURITY - EMAIL 2FA (Telegram module) - # ============================================================================ - auth_session_secret: str = "change-me-in-production" - - # ============================================================================ - # CORS - # ============================================================================ - cors_origins: str = "http://localhost:3000,http://localhost:5173" - - # ============================================================================ - # REPORTS MODULE - CACHE CONFIGURATION - # ============================================================================ - reports_cache_enabled: bool = True - reports_cache_type: str = "hybrid" - reports_cache_sqlite_path: str = "./data/cache/roa2web_cache.db" - reports_cache_memory_max_size: int = 1000 - reports_cache_default_ttl: int = 900 - - # Cache TTL per type (seconds) - reports_cache_ttl_schema: int = 86400 - reports_cache_ttl_companies: int = 1800 - reports_cache_ttl_dashboard_summary: int = 1800 - reports_cache_ttl_dashboard_trends: int = 1800 - reports_cache_ttl_invoices: int = 600 - reports_cache_ttl_invoices_summary: int = 900 - reports_cache_ttl_treasury: int = 600 - - # Cache maintenance - reports_cache_cleanup_interval: int = 3600 - reports_cache_auto_invalidate: bool = False - reports_cache_check_interval: int = 300 - reports_cache_track_performance: bool = True - reports_cache_benchmark_on_startup: bool = False - - # ============================================================================ - # DATA ENTRY MODULE - CONFIGURATION - # ============================================================================ - data_entry_sqlite_database_path: str = "data/receipts/receipts.db" - data_entry_upload_path: str = "data/receipts/uploads" - data_entry_max_upload_size_mb: int = 10 - data_entry_allowed_mime_types: List[str] = [ - "image/jpeg", - "image/png", - "image/gif", - "image/webp", - "application/pdf", - ] - - # ============================================================================ - # TELEGRAM MODULE - BOT CONFIGURATION - # ============================================================================ - telegram_bot_token: str = "" - telegram_smtp_host: str = "" - telegram_smtp_port: int = 587 - telegram_smtp_user: str = "" - telegram_smtp_password: str = "" - telegram_smtp_from_email: str = "" - telegram_smtp_from_name: str = "ROA2WEB" - telegram_smtp_use_tls: bool = True - telegram_email_max_retries: int = 3 - telegram_email_retry_delay: float = 2.0 - telegram_sqlite_database_path: str = "data/telegram/telegram.db" - - class Config: - env_file = ".env" - env_file_encoding = "utf-8" - extra = "ignore" - case_sensitive = False - - # ============================================================================ - # COMPUTED PROPERTIES - # ============================================================================ - - @property - def oracle_dsn(self) -> str: - """Get Oracle DSN string.""" - return f"{self.oracle_host}:{self.oracle_port}/{self.oracle_sid}" - - @property - def cors_origins_list(self) -> List[str]: - """Get CORS origins as list.""" - return [origin.strip() for origin in self.cors_origins.split(",")] - - # Data Entry properties - @property - def data_entry_database_url(self) -> str: - """Get SQLite database URL for async (Data Entry).""" - # Resolve to absolute path for Windows/IIS compatibility - abs_path = Path(self.data_entry_sqlite_database_path).resolve() - return f"sqlite+aiosqlite:///{abs_path}" - - @property - def data_entry_sync_database_url(self) -> str: - """Get SQLite database URL for sync operations (Alembic).""" - # Resolve to absolute path for Windows/IIS compatibility - abs_path = Path(self.data_entry_sqlite_database_path).resolve() - return f"sqlite:///{abs_path}" - - @property - def data_entry_upload_path_resolved(self) -> Path: - """Get resolved upload path.""" - path = Path(self.data_entry_upload_path) - path.mkdir(parents=True, exist_ok=True) - return path - - @property - def data_entry_max_upload_size_bytes(self) -> int: - """Get max upload size in bytes.""" - return self.data_entry_max_upload_size_mb * 1024 * 1024 - - # Reports cache properties - @property - def reports_cache_sqlite_path_resolved(self) -> Path: - """Get resolved cache SQLite path.""" - path = Path(self.reports_cache_sqlite_path) - path.parent.mkdir(parents=True, exist_ok=True) - return path - - # Telegram properties - @property - def telegram_sqlite_path_resolved(self) -> Path: - """Get resolved Telegram SQLite path.""" - path = Path(self.telegram_sqlite_database_path) - path.parent.mkdir(parents=True, exist_ok=True) - return path - - -@lru_cache() -def get_settings() -> UnifiedSettings: - """Get cached settings instance.""" - return UnifiedSettings() - - -# Convenience instance -settings = get_settings() diff --git a/deploy-package-20260223-151231/backend/data/README.md b/deploy-package-20260223-151231/backend/data/README.md deleted file mode 100644 index 83249c8..0000000 --- a/deploy-package-20260223-151231/backend/data/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# Backend Runtime Data - -This directory contains runtime data generated by the unified backend. - -## Directory Structure - -``` -data/ -├── cache/ # Reports module cache (hybrid L1+L2) -│ └── *.db # SQLite L2 cache database -├── receipts/ # Data Entry module data -│ ├── *.db # SQLite receipts database -│ └── uploads/ # User-uploaded files (receipts, attachments) -└── telegram/ # Telegram bot data - └── *.db # SQLite bot auth/session database -``` - -## Git Behavior - -- **Ignored**: All `*.db` files and `uploads/` contents -- **Committed**: Only `.gitkeep` files to preserve directory structure - -## Environment-Specific Databases - -Different environments use separate databases: - -- **Development** (`.env.prod`): - - Cache: `roa2web_cache.db` - - Receipts: `receipts_dev.db` - - Telegram: `telegram.db` - -- **Test** (`.env.test`): - - Cache: `roa2web_cache_test.db` - - Receipts: `receipts_test.db` - - Telegram: `telegram_test.db` - -- **Production** (`.env.prod`): - - Cache: `roa2web_cache_prod.db` - - Receipts: `receipts_prod.db` - - Telegram: `telegram_prod.db` - -## Auto-Created - -All databases and directories are created automatically on first run. -No manual setup required. diff --git a/deploy-package-20260223-151231/backend/data/cache/.gitkeep b/deploy-package-20260223-151231/backend/data/cache/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/data/receipts/.gitkeep b/deploy-package-20260223-151231/backend/data/receipts/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/002919e3-cba1-402d-b1e8-3795d0da0035.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/002919e3-cba1-402d-b1e8-3795d0da0035.pdf deleted file mode 100644 index 46981c2..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/002919e3-cba1-402d-b1e8-3795d0da0035.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/01728916-b497-499a-9831-578face9bb41.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/01728916-b497-499a-9831-578face9bb41.pdf deleted file mode 100644 index 359b5f0..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/01728916-b497-499a-9831-578face9bb41.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/05010088-0c7c-4493-9a62-51bb3ab83711.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/05010088-0c7c-4493-9a62-51bb3ab83711.pdf deleted file mode 100644 index 76fa159..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/05010088-0c7c-4493-9a62-51bb3ab83711.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/0588aad7-7568-4d66-9a21-18d0b52d3a4b.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/0588aad7-7568-4d66-9a21-18d0b52d3a4b.pdf deleted file mode 100644 index 52bbc88..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/0588aad7-7568-4d66-9a21-18d0b52d3a4b.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/0608e472-d732-449b-9742-42ceb9c24ed3.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/0608e472-d732-449b-9742-42ceb9c24ed3.pdf deleted file mode 100644 index 76fa159..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/0608e472-d732-449b-9742-42ceb9c24ed3.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/070b15e2-5a72-4202-bb9d-b22189d09269.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/070b15e2-5a72-4202-bb9d-b22189d09269.pdf deleted file mode 100644 index cc1c8c2..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/070b15e2-5a72-4202-bb9d-b22189d09269.pdf +++ /dev/null @@ -1,2552 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 0.0000 -792.0000 206.0116 0.0000 0.0000 792.0000 cm /Im0 Do Q q 0.1908 0.0000 0.0000 0.1908 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -35.283 0 0 46.25 1.82 3642 Tm -(Di:83460 ) Tj -28.1725 0 0 47.5 -1.15 3591 Tm -(P.ROIOR:ARIAN ) Tj -21.5449 0 0 47.5 210.95 3591 Tm -(VMLENTIN ) Tj -21.0402 0 0 47.5 350.97 3591 Tm -(UNGIREANU ) Tj -15.9575 0 0 46.25 0.81 3538 Tm -(-R ) Tj -23.1347 0 0 46.25 31.89 3538 Tm -(PO: ) Tj -35.9232 0 0 46.25 75.08 3538 Tm -(:C3S-C12 ) Tj -31.9778 0 0 51.25 0.81 3432 Tm -(LENI ) Tj -33.9707 0 0 51.25 88.64 3432 Tm -(C.U.1./C.LF.:RO1879856 ) Tj -21.4526 0 0 45 18.6 1993 Tm -(SUBTOIAL ) Tj -43.7464 0 0 52.5 3.93 3317 Tm -(UH: ) Tj -26.2254 0 0 52.5 93.51 3317 Tm -(SPAARE ) Tj -27.8232 0 0 52.5 202.87 3317 Tm -(PRBRIZE ) Tj -32.0602 0 0 52.5 325.81 3317 Tm -(ESTIVLP ) Tj -32.7778 0 0 65 17.8 3255 Tm -(E18:2X03-) Tj -26.5243 0 0 65 161.68 3255 Tm -(\(62507 ) Tj -34.6887 0 0 65 245.56 3255 Tm -(6-261550117 ) Tj -46.9609 0 0 47.5 10.89 3207 Tm -(AT: ) Tj -30.6398 0 0 47.5 103.78 3207 Tm -(I6 ) Tj -30.2736 0 0 47.5 140.82 3207 Tm -(ENIC ) Tj -22.6023 0 0 47.5 220.89 3207 Tm -(MRFUYATA ) Tj -21.0127 0 0 47.5 357.09 3207 Tm -(NARINO ) Tj -0 Tc -53.75 0 0 53.75 11.8 3150 Tm -(Z ) Tj --0.035 Tc -31.9656 0 0 53.75 41.66 3150 Tm -(00:7E3 ) Tj -28.8709 0 0 53.75 143.63 3150 Tm -(6422 ) Tj -31.364 0 0 53.75 199.66 3150 Tm -(76061637 ) Tj -45.6565 0 0 51.25 11.9 3102 Tm -(AT: ) Tj -23.8736 0 0 51.25 107.83 3102 Tm -(IG ) Tj -22.4127 0 0 51.25 141.87 3102 Tm -(ENICA ) Tj -20.8675 0 0 51.25 221.9 3102 Tm -(PARFUYATA ) Tj -19.6462 0 0 51.25 357.91 3102 Tm -(MARINO ) Tj -0 Tc -47.5 0 0 47.5 11.82 3047 Tm -(Z ) Tj --0.035 Tc -26.8469 0 0 47.5 40.87 3047 Tm -(H00:763 ) Tj -27.8016 0 0 47.5 143.65 3047 Tm -(6422 ) Tj -24.9965 0 0 47.5 201.73 3047 Tm -(763061 ) Tj -25.6155 0 0 47.5 277.67 3047 Tm -(637 ) Tj -0 Tc -47.5 0 0 47.5 11.77 3001 Tm -(P ) Tj --0.035 Tc -23.5179 0 0 47.5 40.95 3001 Tm -(AY ) Tj -22.9691 0 0 47.5 88.95 3001 Tm -(AIRCO, ) Tj -23.0586 0 0 47.5 183.76 3001 Tm -(CRATATOR ) Tj -19.2489 0 0 47.5 317.96 3001 Tm -(AER ) Tj -20.9591 0 0 47.5 371.78 3001 Tm -(CONDIT ) Tj -42.343 0 0 53.75 27.84 2950 Tm -(Z0 ) Tj -27.7502 0 0 53.75 95.65 2950 Tm -(697 ) Tj -30.7535 0 0 53.75 142.56 2950 Tm -(54|1 ) Tj -27.4792 0 0 53.75 200.04 2950 Tm -(183170704 ) Tj -28.683 0 0 48.75 41.83 2895 Tm -(ED. ) Tj -21.8521 0 0 48.75 89.77 2895 Tm -(CERE ) Tj -29.0073 0 0 48.75 170.59 2895 Tm -(58 ) Tj -25.7833 0 0 51.25 11.87 2849 Tm -(RJNOTIE ) Tj -23.516 0 0 51.25 163.89 2849 Tm -(BRI ) Tj -0 Tc -51.25 0 0 51.25 219.89 2849 Tm -(X ) Tj --0.035 Tc -23.0785 0 0 51.25 237.89 2849 Tm -(FEST ) Tj -19.9163 0 0 51.25 304.63 2849 Tm -(SOUCA ) Tj -32.3819 0 0 45 12.84 2799 Tm -(PAY ) Tj -25.1525 0 0 45 89.53 2799 Tm -(SILICON ) Tj -35.8912 0 0 45 198.57 2799 Tm -(300 ) Tj -23.5477 0 0 45 265.95 2799 Tm -(ANTISTATIC ) Tj -23.516 0 0 45 412.75 2799 Tm -(CIR ) Tj -0 Tc -52.5 0 0 52.5 31.68 2746 Tm -(E ) Tj --0.035 Tc -28.5987 0 0 52.5 44.67 2746 Tm -(900:018 ) Tj -30.7671 0 0 52.5 144.61 2746 Tm -(642689018499 ) Tj -42.0273 0 0 102.5001 21.94 1845 Tm -(UA ) Tj -22.1702 0 0 102.5001 91.87 1845 Tm -(LE ) Tj -28.7803 0 0 51.25 304.87 3943 Tm -(FIV\311-HILDIG ) Tj -28.0753 0 0 51.25 481.48 3943 Tm -(S.A. ) Tj -18.6536 0 0 47.5 223.96 3893 Tm -(AUD. ) Tj -21.362 0 0 47.5 290.77 3893 Tm -(COMSTANTA, ) Tj -17.8322 0 0 47.5 441.92 3893 Tm -(MUN. ) Tj -20.6943 0 0 47.5 509.78 3893 Tm -(CONSTANTA ) Tj -24.1963 0 0 43.75 291.55 3846 Tm -(STR. ) Tj -21.3258 0 0 43.75 363.74 3846 Tm -(\(ON ) Tj -20.3049 0 0 43.75 413.9 3846 Tm -(RONTA ) Tj -21.0452 0 0 43.75 496.09 3846 Tm -(NR. ) Tj -0 Tc -43.75 0 0 43.75 550.47 3846 Tm -(3 ) Tj --0.035 Tc -20.266 0 0 52.5 188.76 3796 Tm -(3INE ) Tj -23.9116 0 0 52.5 256.95 3796 Tm -(ATI ) Tj -24.87 0 0 52.5 305.94 3796 Tm -(VENII ) Tj -19.8947 0 0 52.5 391.86 3796 Tm -(IN ) Tj -22.1501 0 0 52.5 428.89 3796 Tm -(MIGAZINUL ) Tj -21.7888 0 0 52.5 565.9 3796 Tm -(BRICK ) Tj -28.7323 0 0 46.25 319.69 3745 Tm -(CIF: ) Tj -26.8208 0 0 46.25 387.87 3745 Tm -(RO10562600 ) Tj -21.21 0 0 45 13.67 2699 Tm -($P ) Tj -15.704 0 0 45 42.92 2699 Tm -(RAY ) Tj -20.5019 0 0 45 90.78 2699 Tm -(CL ) Tj -20.9445 0 0 45 131.61 2699 Tm -(SFUNA ) Tj -21.7017 0 0 45 212.95 2699 Tm -(ACTIVA ) Tj -20.5647 0 0 45 306.9 2699 Tm -(PENTRU ) Tj -18.8722 0 0 45 400.8 2699 Tm -(CURA ) Tj -33.9509 0 0 53.75 14.8 2639 Tm -(E18:2\242051 ) Tj -29.6673 0 0 53.75 185.58 2639 Tm -(52354 ) Tj -28.4045 0 0 53.75 254.64 2639 Tm -(6426489007929 ) Tj -39.4395 0 0 51.25 16.27 2590 Tm -(SA1 ) Tj -26.665 0 0 51.25 98.84 2590 Tm -(ENAJ ) Tj -32.5934 0 0 51.25 160.79 2590 Tm -(240. ) Tj -22.5813 0 0 51.25 227.87 2590 Tm -(ECOFRIEND ) Tj -32.8392 0 0 43.75 12.81 2544 Tm -(LZI0210162112 ) Tj -28.7846 0 0 43.75 228.48 2544 Tm -(8646809520908 ) Tj -33.1906 0 0 43.75 12.38 2495 Tm -(SAI ) Tj -28.3853 0 0 43.75 80.83 2495 Tm -(EAAJ ) Tj -21.0881 0 0 43.75 160.88 2495 Tm -(EXTRA ) Tj -25.9464 0 0 43.75 242.69 2495 Tm -(35L ) Tj -25.7198 0 0 43.75 296.64 2495 Tm -(508UC/SET ) Tj -27.6479 0 0 43.75 430.65 2495 Tm -(60 ) Tj -36.8407 0 0 41.25 10.86 2449 Tm -(ZI ) Tj -30.0217 0 0 41.25 49.68 2449 Tm -(02:1\2540021033182 ) Tj -28.0599 0 0 41.25 269.64 2449 Tm -(642276E020146 ) Tj -34.5182 0 0 51.25 9.36 2398 Tm -(SAI ) Tj -26.665 0 0 51.25 97.84 2398 Tm -(ENAJ ) Tj -21.0881 0 0 51.25 159.88 2398 Tm -(EXTRA ) Tj -26.6117 0 0 51.25 241.68 2398 Tm -(35L ) Tj -25.9359 0 0 51.25 296.63 2398 Tm -(508UC/SET ) Tj -25.5211 0 0 51.25 431.68 2398 Tm -(60 ) Tj -33.3391 0 0 57.5 10.88 2348 Tm -(ZI0221e082183102 ) Tj -28.0742 0 0 57.5 269.64 2348 Tm -(6402768028146 ) Tj -32.8904 0 0 61.25 11.39 2295 Tm -(SA:1 ) Tj -27.0066 0 0 61.25 80.96 2295 Tm -(UFER ) Tj -24.0942 0 0 61.25 170.75 2295 Tm -(OPTIN ) Tj -29.7118 0 0 61.25 256.64 2295 Tm -(35L\(15\) ) Tj -21.2168 0 0 61.25 365.96 2295 Tm -(ALBASTR ) Tj -32.3836 0 0 47.5 14.8 2247 Tm -(2:8210113106 ) Tj -28.0742 0 0 47.5 207.69 2247 Tm -(7290014006522 ) Tj -25.9154 0 0 47.5 15.85 2196 Tm -(LAAL ) Tj -22.2339 0 0 47.5 94.76 2196 Tm -(CFBLU ) Tj -22.8748 0 0 47.5 176.89 2196 Tm -(PUS ) Tj -18.7772 0 0 47.5 231.8 2196 Tm -(CU ) Tj -22.3278 0 0 47.5 271.95 2196 Tm -(ADEZIV ) Tj -19.7692 0 0 47.5 365.96 2196 Tm -(ALB ) Tj -24.6743 0 0 47.5 418.14 2196 Tm -(12X ) Tj -31.6492 0 0 56.25 10.81 2143 Tm -(EL/90:488 ) Tj -29.9402 0 0 56.25 151.62 2143 Tm -(6699 ) Tj -26.6369 0 0 56.25 213.88 2143 Tm -(490919743 ) Tj -22.1976 0 0 56.25 9.89 2093 Tm -(PUNGA ) Tj -19.133 0 0 56.25 96.91 2093 Tm -(MESTERLUL ) Tj -21.0926 0 0 56.25 218.78 2093 Tm -(CHSTOR ) Tj -23.8151 0 0 56.25 311.72 2093 Tm -(30X65CH ) Tj -21.6093 0 0 56.25 417.9 2093 Tm -(BRI ) Tj -31.4072 0 0 43.75 19.89 2051 Tm -(Z960:950 ) Tj -27.3474 0 0 43.75 149.84 2051 Tm -(EKI09022318 ) Tj -28.3496 0 0 42.5 12.83 1693 Tm -(EST ) Tj -37.7998 0 0 53.75 7.72 961 Tm -(ID ) Tj -31.0173 0 0 53.75 47.85 961 Tm -(B/: ) Tj -31.7444 0 0 56.25 9.89 1589 Tm -(10A. ) Tj -20.8382 0 0 56.25 85.82 1589 Tm -(TUA ) Tj -31.2455 0 0 56.25 139.93 1589 Tm -(AI-) Tj -21.2817 0 0 56.25 194.26 1589 Tm -(19% ) Tj -39.8436 0 0 45 10.57 1540 Tm -(0A. ) Tj -21.3464 0 0 45 80.81 1540 Tm -(TUA ) Tj -20.8001 0 0 45 132.88 1540 Tm -(EON ) Tj -0 Tc -58.75 0 0 58.75 19.7 1485 Tm -(R ) Tj --0.035 Tc -58.2617 0 0 58.75 28.71 1485 Tm -(PZ ) Tj -31.4416 0 0 58.75 114.85 1485 Tm -(M1. ) Tj -36.8051 0 0 58.75 174.73 1485 Tm -(IN ) Tj -22.5624 0 0 58.75 224.89 1485 Tm -(BON: ) Tj -36.4314 0 0 46.25 10.99 862 Tm -(/4:0:4700110\)7 ) Tj -27.1121 0 0 55 326.71 1151 Tm -(CKPOS-CT2183460 ) Tj -0 Tc -56.25 0 0 56.25 607.03 3270 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 56.25 622.9 3270 Tm -(BUC ) Tj -0 Tc -56.25 0 0 56.25 676.88 3270 Tm -(X ) Tj --0.035 Tc -30.7249 0 0 56.25 703.64 3270 Tm -(9.01= ) Tj -30.8624 0 0 56.25 784.64 3270 Tm -(9.01 ) Tj -0 Tc -56.25 0 0 56.25 852.87 3270 Tm -(A ) Tj --0.035 Tc -19.3223 0 0 47.5 364.91 758 Tm -(BON ) Tj -23.0709 0 0 47.5 417.89 758 Tm -(FISCAL ) Tj -0 Tc -46.25 0 0 46.25 288.73 711 Tm -(L ) Tj --0.035 Tc -28.3256 0 0 46.25 359.67 711 Tm -(9000221498 ) Tj -0 Tc -46.25 0 0 46.25 586.38 3176 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 46.25 596.56 3176 Tm -(SET ) Tj -0 Tc -46.25 0 0 46.25 650.9 3176 Tm -(X ) Tj --0.035 Tc -28.8653 0 0 46.25 677.99 3176 Tm -(16. ) Tj -25.3634 0 0 46.25 718.64 3176 Tm -(50= ) Tj -32.3752 0 0 46.25 772.87 3176 Tm -(16.50 ) Tj -0 Tc -46.25 0 0 46.25 853.9 3176 Tm -(A ) Tj -50 0 0 50 584.25 3075 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 50 597.56 3075 Tm -(SET ) Tj -0 Tc -50 0 0 50 651.9 3075 Tm -(X ) Tj --0.035 Tc -33.7631 0 0 50 678.82 3075 Tm -(16.50: ) Tj -32.3752 0 0 50 773.87 3075 Tm -(16.50 ) Tj -0 Tc -50 0 0 50 854.89 3075 Tm -(A ) Tj -52.5 0 0 52.5 579.16 2969 Tm -(1 ) Tj --0.035 Tc -21.912 0 0 52.5 597.9 2969 Tm -(BUC ) Tj -0 Tc -52.5 0 0 52.5 651.89 2969 Tm -(X ) Tj --0.035 Tc -35.0049 0 0 52.5 678.58 2969 Tm -(38.16-) Tj -33.7659 0 0 52.5 772.59 2969 Tm -(38.16 ) Tj -0 Tc -52.5 0 0 52.5 854.88 2969 Tm -(A ) Tj --0.035 Tc -31.7874 0 0 46.25 776.62 2916 Tm -(-1.91 ) Tj -0 Tc -46.25 0 0 46.25 856.9 2916 Tm -(A ) Tj -48.75 0 0 48.75 586.29 2763 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 48.75 599.9 2763 Tm -(BUC ) Tj -0 Tc -48.75 0 0 48.75 653.9 2763 Tm -(X ) Tj --0.035 Tc -29.2827 0 0 48.75 679.82 2763 Tm -(25. ) Tj -25.8258 0 0 48.75 720.73 2763 Tm -(07= ) Tj -32.0406 0 0 48.75 774.8 2763 Tm -(25.07 ) Tj -0 Tc -48.75 0 0 48.75 855.89 2763 Tm -(A ) Tj -46.25 0 0 46.25 584.38 2663 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 46.25 599.9 2663 Tm -(BUC ) Tj -0 Tc -46.25 0 0 46.25 653.9 2663 Tm -(X ) Tj --0.035 Tc -34.2379 0 0 46.25 679.8 2663 Tm -(14.99-) Tj -32.8658 0 0 46.25 774.85 2663 Tm -(14.99 ) Tj -0 Tc -46.25 0 0 46.25 855.9 2663 Tm -(A ) Tj -50 0 0 50 562.25 2557 Tm -(1 ) Tj --0.035 Tc -19.9028 0 0 50 588.9 2557 Tm -(ROLA ) Tj -0 Tc -50 0 0 50 654.9 2557 Tm -(X ) Tj --0.035 Tc -34.2776 0 0 50 683.8 2557 Tm -(10, ) Tj -26.7305 0 0 50 723.07 2557 Tm -(15= ) Tj -31.8847 0 0 50 774.88 2557 Tm -(10,15 ) Tj -0 Tc -50 0 0 50 855.89 2557 Tm -(A ) Tj -43.75 0 0 43.75 610.47 2458 Tm -(1 ) Tj --0.035 Tc -19.1969 0 0 43.75 628.91 2458 Tm -(BIJC ) Tj -0 Tc -43.75 0 0 43.75 681.91 2458 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 43.75 708.54 2458 Tm -(5.53-) Tj -31.6613 0 0 43.75 788.55 2458 Tm -(5.53 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2458 Tm -(A ) Tj --0.035 Tc -22.0252 0 0 50 616.8 2356 Tm -(TBUC ) Tj -0 Tc -50 0 0 50 690.9 2356 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 50 710.54 2356 Tm -(5.53-) Tj -28.5573 0 0 50 794.6 2356 Tm -(5.53 ) Tj -0 Tc -50 0 0 50 858.89 2356 Tm -(A ) Tj -52.5 0 0 52.5 614.16 2249 Tm -(1 ) Tj --0.035 Tc -21.0765 0 0 52.5 629.9 2249 Tm -(BLC ) Tj -0 Tc -52.5 0 0 52.5 682.89 2249 Tm -(X ) Tj --0.035 Tc -39.7318 0 0 52.5 709.43 2249 Tm -(5.94 ) Tj -32.9029 0 0 52.5 789.53 2249 Tm -(5,94 ) Tj -0 Tc -52.5 0 0 52.5 857.88 2249 Tm -(A ) Tj -43.75 0 0 43.75 589.8 2157 Tm -(4 ) Tj --0.035 Tc -18.8722 0 0 43.75 615.91 2157 Tm -(BARA ) Tj -0 Tc -43.75 0 0 43.75 680.91 2157 Tm -(X ) Tj --0.035 Tc -33.1889 0 0 43.75 707.79 2157 Tm -(2.24: ) Tj -31.6791 0 0 43.75 787.43 2157 Tm -(8.96 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2157 Tm -(A ) Tj -51.25 0 0 51.25 610.2 2050 Tm -(1 ) Tj --0.035 Tc -19.8736 0 0 51.25 628.91 2050 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 681.89 2050 Tm -(X ) Tj --0.035 Tc -30.213 0 0 51.25 708.68 2050 Tm -(0.72= ) Tj -32.6476 0 0 51.25 789.65 2050 Tm -(0.72 ) Tj -0 Tc -51.25 0 0 51.25 857.88 2050 Tm -(A ) Tj -52.5 0 0 52.5 215.88 658 Tm -(A ) Tj --0.035 Tc -19.0521 0 0 52.5 230.91 658 Tm -(RUGAH ) Tj -20.6877 0 0 52.5 310.62 658 Tm -(SA ) Tj -25.2082 0 0 52.5 350.88 658 Tm -(PESIRATI ) Tj -19.8147 0 0 52.5 470.91 658 Tm -(BONUL ) Tj -20.3024 0 0 52.5 549.91 658 Tm -(FISCAL ) Tj -19.4211 0 0 47.5 148.95 613 Tm -(VOCEA ) Tj -23.7876 0 0 47.5 228.75 613 Tm -(CLIENTULUI: ) Tj -33.6288 0 0 47.5 388.64 613 Tm -(0808 ) Tj -21.6271 0 0 47.5 468.9 613 Tm -(BiRICK; ) Tj -26.8317 0 0 47.5 562.72 613 Tm -(OBO032745 ) Tj -31.5442 0 0 51.25 162.72 556 Tm -(TIPRIT ) Tj -23.0709 0 0 51.25 268.89 556 Tm -(DIN ) Tj -22.3564 0 0 51.25 321.76 556 Tm -(COGITO ) Tj -22.2966 0 0 51.25 415.87 556 Tm -(ERP ) Tj -19.5136 0 0 51.25 468.93 556 Tm -(WWI. ) Tj -21.1535 0 0 51.25 521.78 556 Tm -(COGI ) Tj -24.7121 0 0 51.25 575.78 556 Tm -(TO-ERP. ) Tj -18.6521 0 0 51.25 668.81 556 Tm -(GO ) Tj -31.1552 0 0 42.5 788.91 2006 Tm -(155.15 ) Tj -34.7994 0 0 42.5 790.78 1748 Tm -(15i. ) Tj -31.334 0 0 42.5 844.9 1748 Tm -(15 ) Tj -32.0316 0 0 42.5 819.66 1697 Tm -(0.09 ) Tj -32.5188 0 0 43.75 806.8 1593 Tm -(24.77 ) Tj -31.5624 0 0 43.75 807.8 1541 Tm -(24.77 ) Tj -21.0452 0 0 51.25 703.09 993 Tm -(NR. ) Tj -19.5035 0 0 51.25 743.96 993 Tm -(AMEF ) Tj -35.7727 0 0 51.25 801.08 993 Tm -(:001 ) Tj -28.4541 0 0 77.5001 431.67 932 Tm -(90002214982024D02818480721100293 ) Tj -19.6793 0 0 50 232.9 909 Tm -(DATA: ) Tj -30.0086 0 0 50 312.81 909 Tm -(28-06-2024 ) Tj -20.3563 0 0 50 458.79 909 Tm -(ORA: ) Tj -31.196 0 0 50 525.91 909 Tm -(18:48:07 ) Tj -27.9768 0 0 43.75 852.02 1489 Tm -(12 ) Tj -21.6742 0 0 43.75 713.81 850 Tm -(TD: ) Tj -27.8567 0 0 43.75 753.7 850 Tm -(00665388 ) Tj -23.7415 0 0 48.75 753.75 798 Tm -(OASIER ) Tj -0 Tc -48.75 0 0 48.75 850.29 798 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF"ExifII*  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw88"2 ][i,ϩC?.t>ƾ"|ށ~(;yzt&\ڌ .̇ñ\esӳ*.  UebHY*UDBǗcɌ.3V"deM]|RI10DP#̌dWc2CnjdwZ̺5% Q -BE@R) ,RT(! ShX2hf  VCĖd*Ḧ"  1bd!@[2c,)1 A,2"rfV,y] 7[’V CHiYȠLXbVTIDh.* s(`{aDuLN1$\&BR) !2,$2pʎkV.7$`a$c( ,aAI!HHà! $k[(@E%IPc "1HEȖ%Y3Y}LRI)IEhQT Dh ` ,1 -fɬMLkdk0Q0m:2weWD+T|@{јij[ʾC=ugi^=ͤo+>j>WS˃t}+}+@7g$ dTY!C%+)AU! 0a$G ύ>\Ycl` pB"HA$aa -3cEc)FC ms$#BX!1&\@ *ĘlYe 1YkfIREhU$ T9 v5u̮W! 1!!"hR#c" - l"1HT*%4Yx$$V$U!D2E rT`", -ep¨ B&LC4ll f7Y#bu(549os} -3:c#PA$B!@r)W"q15+B !c=r x)L쾮c#fG2bvʨ\VhD%e@<6"XCB1RA!$VR@ #1AH`HBD+$0`AXLĈ̥` |X&<[8םyVA#)Q$$ aJBAW)F2trO 嬑J;cdb#BEJ -A G !@4B00I AZH BB"q  P@#) J" -Eq0B: d,=ir dC h) Ch "I 8cY LDHI!ʒH $!$)Y Y*:[P - Xq16*r,bC-E  $:Ȭ~ìu3rV(WTK"ZAT P0LaPP$Ej+ N,He00#+ȡ`$*1)ؙS EXb(ab +YD)Tca #@ a U>AOl<5ՓWg"P-*Yl굞էd̙ud 2>©_-vqU_v w+NJX  oBi1n&5SjV;ꭏ!uL=_g(W_2@%hG(vDL(B%^6]d+Y  D)TKﯛ?&Tlke<&baҴWI<د:rz)y-\C_6zpI `2BC R$,b@ٵhlX1d|,g82YTDȫ:BQcz "E+BѮ:1(/m|5vZ*kq:LNsBT@UcI@)``@CK! *HH x1:ʮB,Y/yuTtz1.P$0:C"@ b$X@  @CC -  d ciYD X&<1jIdIA͑3V1&Ȩd2jcuwR\}xQflpDL.ȥ -$`ȪdTK<-6VwwM1S#J`ŕ~}>)@,Wp{)K`̆W +D ,ȈUבg^ ;jd_V[ D1 !e0i1IjbzG&E# *IjKbcYF۷*;V>2  FL$kSWӺ$À<ۗΪi1vur13klY cU/< jaߐK@#^aMX!%j=N%s= P47x1kzTS:tma򐞡^EW{:r -&1eԩw|zMVpŋDV?ٳ6네K鉗X2QW4~/ xU߯,0[W,lyժ^l"]yws/Ks)%*a$!B8 0*dCM1I -FH!bq<2azˌAU]I!FR"4L9 JkӪ9[vezG%z&Ŗ,2wɬMLan]|oB㕆7 1 +IA" `0 -221Q\keH0A%g^pH)SnB"! `#rH!I +,< M!W$Ta@`@(V$P,JݜˑD zh&Nzmby8] /&@A. F WpQqfI|y;^5Yuc+cq+W -Mu+dVX)жXBFBioӄaneXDȁU!L)7 -0Gwus*QY2 H'fR WV WX@,L&s]Bl>ïDِ,Gɋ*dBGWa/raᖒy7V;  -C!5Լ;wgѾȬTbe,)ьYlFI2^YBeϢ&c,VI 2J@.@]r,XAJ6҅ԛ5 -`fl+,`z57t-5ޤr,b3rWYXI (H,$ -d|N, c1Dc*Qd0ܠ"U&c $r*C% $,]JH!$ bP,0!XB+AAZ, -T^Cq&C#c*!cFlfWLbQS"F8VVEլ[U$*:$ UXV @[dz^7SSשrl~VשTRK&g{F>AwW@cȈ* ߷[ߠzGj 2 I_?7"[իG{JηN: P4V 2 8r(=nPj7_=$aQ ? 'lc}ҵ;" !@NoikcGB-YH F82VMبFh3.K$ -c˶q\k欯"eɇ%1XjP,μ٬u>דb#f?C~*ZH :Ϻlz تCй"^aiq;6uVo۠V[,ggǣwy D k:g O}ν27<7w`حB? /C9~!#OۼPIZ\ԩ\huIT -yqseLk/YJa$4R3E@c8`͍ -=HBBe[Z3La6Z eDVIͥs_-o;7{4gWSfur$<8?[e %cf+UgwУ!SA X4B<AV0,+H $0 -iI*BI $ -q R0I! *C 1LI DD 0*<0uiH!5ȄGIaTQrc GuLl @2hcȐjBb*R*jv(X}U-|٪V($ .}U41b@AEr.jjV -C/qLy)c -+t1pl:˙7F3%Dˈ(21Ȱb"y@$WҸl29]70`CXȐ1nKl"AaH `qǭW4[+c2l!]c[u6ss뽙r{2Ι6ݔ+&68V:o~bhxCYک^2(WSKlIrSTAۍ}j_ۣP4EW+ uRf[zWwC8>U8>\!`uh0Bz:Bou| -Kdaj1u\" -$ a̢?V,[~/ٱ:xUm+Ot)[_'IRstDe(d2@I$0b#1XD G223c0j -4" ,`I #'Tlps/`T֦ߑ*y9.AD -@5rŷ/Z\BNWR2 a#:n >=k.byϣSLK91eEǛCɹ\^VoΒ羃YS.\n_&&\d{ tziz>]Ő%ddlfHa(ks-EۻCOPJup.^ :yf5p';:{\,9qy-OpZ=(ttUPHPd5jvtH !$dj,84qM$HF a -`HTG*ƥNδeDߋ3HE#+&sC(_P2 La6'HZ=`!MX+aHys ;@HHK5c _-ٴYdʇ*,[Z{N^E`Dt$F!`c u;)0B)BLp}ב@H!$$TD"@IH $"e*A$Jb0$R("!`@`I^d0Y ``dXqljsa( -SdYq(Zb *DeP`bE1)BdgƨC -GQU(1[ۅ^}Z5vżu "TCzXC!ݩAǕWA*B.}z3m!z|^@Z`2D)V^IG%2**u$ B _Y|&ª>wц<^*ݟ:kyA$&2*C,ϥUK!rǯ  K$٧3irkIY\dhcScY6ug|̧3&J؝X1L]cI -x 1Xˣ+;H LҹSU\XBDx';]  Lkv0B"HeX -T.*ECdd+ #" -H()X2Eȶ!dXƲ,0ەS;mjcKObCZ  W #Xe)*dtk OGF*Đe0r`edz2HiRnYJ'kCЏ,RnT(n"V,w2Dt``_}Zg?~Ij$:!.5k'Rx)e82`)d! &`FVQd A(0R,"Y$$Y/0=yY$a6%XK$$$K$R1  `k 2cr D %2&CKCUR eUVQ1e e"0D+,)5iE&<X_(?>JL\yaHPWU[Yu/Ov˼Bf+YDBd#  -UQ@$ cʭTJUQ⩐2WJ2AؘdˆT Ā@I2cS>5$e5`+a 0ˌe_%o4"5HLx羁Aζ,ܭEdr6tؚd;K/ z)τQfHdrD؊[=z6 Qd -H-ޥB,0Q$ f摇e#Ȅ)#49`S @YD&DKu}[d2@GǑ a dY"rc! K3Opg:ek##HHTV hr`CP4a*F40AqEFQbY0_TW{k1fyoGVdr)-׭8OHlYrCJkɥڊhdS]ZaqOb@J0HH``#)cc0#4 - RB2 YH_d*yI $!$ Z) X$I @ZEb"Ae!F ( -b@ H Jq"7Y A S!F2,EǑe2TP -"Ȫ`]WhaL)1ƨI,F60ͩ5|]'=GRsmI -aU_(w ,EtJ(ϥɎ2 QHPm%h @$0B0bA40$W-Z*H[7NZ !B^rlwwZ6 eqaveR1@LPV-XDfX@JdP$XFRVy/:2B  LD$R!!E, 0I$D@!&ԫgPc"F) - VS!Pd+cX!qgǕ:Phy&3+* j隐gz?cTln+*RFoa5'S_'m2'7LnG#?B^9`+ V {Zs3XH@ '#ߜ]N1r,)"@A@  }O}t !U 7{/F:zW}z~6 Z2@IXW*~zo^1ee as̞u*޷C7Hd[)6'e(~tӶWf9jW &VÑ2rŶvx+*Ryc  OWz{^eW10$`L$e6C*45ufYwD2qACAcA!Yc)yh0Ń rc\ԐV(!#  BI+K`*B`#)$" ! Bu!RIb$A$ &<^nJD2B2P@!"X,*ƪ lUP+yƙq,`,1d*RQ`> `lh=->osz:dX@r6*]}o+ն+f¼7Ƶs'y*e2 aAL|:94)2b!HC 2Hg 6ͽVo& -82xDz"P/ܣr 9#I a}^8_c,x^Qԣu8wd&L,Jd} +^sԩ -0Ho?M yvrEC -*WO[qA"CA$h `#E#@A -+$ g ˌzK`͊:ivQ #A*#3jgEyVbxz;ymn] 5̽2&s/v['a((UW-swQ6A%21O -AҘEPF ID`aA@bJh'^dHE`,$ `  !0D"BHA"!#Sh6(flYEVSdƊLF3eYV)I -2QFP$7Ac"Lc,.0 TJ+$ZEdGX9K3>6:r:2WiRJ4w`H -A"`̧ n'h.JQ)$$pcGcXt8*XIY`E(h$!"ٷR}Z+,4*P~uO=(Z.B1w[7nXD`NbfՂx&H.`r9ܜu)&XöMq|V2ʨ6L.^,$A!'0LbL8dej:)I) 0'X*HdA##H - YPU&X!q{ݭ{Ks6P&H!$:H q400,x+F#) h0$!!6j]]6F @59Q:Gt2$ьd{aߘ!` 2AX@" $%`A#I!(RBI!`"u9`ϣ("I  -Q:(&:V PAHbp(B&czb.Hva1X*4t\ּYq;Q YXuvf&LpP+Uжӑ否Z:+)|(bu>6=% !@X("$R -X -D cB0BL7mlre #%H`bUm[XX^0BA!Ay`ZaTIJ(er!!nWqv$2A=Y .{mC-Rά(uEL#cs7z Bc(~Wv7\vSf`כ2i` &,s}G5}\EE2 @ ZPaC+B!@a$$ 32F nO::axA T$A 0:>5H!05ɮwy83\l٨"AmjK'E~mާg)}t:{k.%+ ,2pdFPΫX,I I+k^bM%2ǛdHA$WPCFt a(Y!ri0 k|&9GcMjź+ ZtYH)#ՖD@dA E *@ !0DA -bT`$d0 *HDU|r&DQtmC*"1cVX`p -DHqdJ2UlphMΟ_v[eUFQQ\*CuG0 -D$`)LݛXIL1$m"vi{24 !H t!0*@@ G$#D y;տח5kRhq )%ٳT;f8) IY!B2H 1`HaCIC $Y H $Y"Lzr/ -ªR $QH\|҅ F(AQ@@L2ӫUϏ*!LpAYV*_שRd΂2[ǐuk9;:zu'4}GNgԸͅpFP[HUܳԭbHD TC-{__hw !E(;~d} -O/x7bFHA (Lr"+'zo*k'<[2NH$ 0gW霺m]$WQIHQ(״x*v|`B{YpǽzlBCŵ\k3cyyqg:ͣ\pwe@pҩɯ$ˮ&&2+w}Zcl>jzy޲ !P`zY^b@ASUԬtrtoG:Yb1V1LKm{NR]ˇzZ#) [)Rs8ʥCų7nx˗W:f|9+3azSzy[ws܏IR|&В 1NbMOC͊ YI08 8Dx2B"xF1`h eG$. B1jy4 b8R`H(qutAڡIk'7\{j(mcXìߜH`*4$*b $dSny$1<|)_+Tk0HD"Bc Y֬J !PE0Ude1(@@ *oZ@!UQdn/ b3d Qd8W٩5R>sdŖj6'CnVyߢ(w\ *^m{E '1~HU"`I <c3蚇k}Ŕ -`*CB "@&o1'JO*j4!XsGrʥ/v>?Xx Dˀ1ϻ֬eZ a!RةSʮVI^}@KR@ I|qv|Z쒟x0ͅϋ-E^8-Kbfǖ28:7(w*l:ѵj=bVwLQw ΡzTI0a%E0@8D%B@XCCDHPh3b0HD4dYZ3o:ս -0c@ aF Aƺ+ -5m;R2cEPX7W -zU}`Aue!B`ς52Tg[盵|!d#@I #+E 0ArR;;UzRJnRѲqv$$TY8{²brp1=sCzz5R.&LZ.-LsZb2&B:c>}yQ_èzY2SDH@IzV)ǒv!T* {C !"@RA$2BAI#l!E R0 ,! V\Df4%GTBBTB Bpg9{: 1>,fHD5vRюae,hs +Ҝ-v3L-[M%LR"F  !RZV2$ ȀR;:[~h_3Wˇscvܭ$H Z*u(KIBBV#a9Ӯmnv;fRPn4iŭ\w+ijuޏkk-%Yj b$$(VBD¡$VRCTHI THJ//+Sw3$,6<:zJV‚P" ZgySH$C" $Qa -1nht)$!e&7Q*,dUi4vWhofyQq͊&4Z[KRܥ.S:ljHJ" 㾕УUkv* -®J)\{'jrߓ>ۭrX1$ͽ&-ED/ n^x!LPd `fH*B -"Fs.x_yg}RM1`D(`x}<{CV>RC I DL -[Ԯwyb@h &o76epA$_422&6y1n`+>q@] %J<e!XF %I0 h!r -e!XdE,V FFB<4(#) $@$`)PˀUYΗ3nTeT7} <}:WLUC|#P]ٽeDZut&,22[#@I$S R2!@¦EdTpw8Տ.'BRZir;ԫ/~OHޔ1 ֕r)eQ HC$WB+3cʕ^_CܣU,VBUy7D*gWSp>l1ȼlG'V(u"*TCAYXS"I!$JKƭ{4gDK*E ZZ(+lۤ!×n[aJS +1cYl,"(J1",\c< -ej&D\x$*H2 `))D*/rz -P+ĽׇٽǞn]́р $*ioۏ -͖HPB)2(ʙ`JB -@!׋>SApт qd cbAH`-VGBu1N!d7ƲscK!ezǙ FFFB" ܻ 2Dj1x 0h@`t0`@Jq`!L 0Vb  DeC!HU\Ah%Xq%faqCi ]! HH -[cXUmڦ2#ɭhS H@SsJ!##|'Ac%D"#1NCՖHҬ20C.tG!FXJ){Nu~YSxNtU660nB ̦ -RPZH`  !P+"xBq8 lMhmYhw%fɲٰy Pףz]HH{R`BI$ JDHA $Y!EνaKe"+3*65\iPf.6&6uF ꩁ3*$2- E  J#BT*ŐPQb"jV:@ǕD&6AId)*Ȩ+H)(ŗ$P &,kck 4F,S@dHLy1VT%I a$b!"JBHV $! :2 :X!2+"S$$$R:1J$Fd(X! 2u(筼Ғh eeBbUVǑ$QKdr XHh%d$&D$Z,"$tK@d!Ii+ 1 )TKy<ˁ2`l FR%j9!65*p+cΘV A$Vac((*@D*gndrb&6F'XI1IND2VXTiX"0DY#^;vηC $R^BT,EdU$HXd!JV ) d XA &1U0`FRA$!²!8d9VSi Sj2*` +0r e9bc2Ș-ц|l T &E>9&rRZ̐b!F%HD!+DP@#LqrnPB1 P$ J%4hC !ɏȓ$ȦE% "$6 cˊ9zkW -cɎ\@ OFm4[>c=C7O,'O%SmOkFѠ|U} >+Shqß4]H@G"NgLU 1}lq:ԵSpvYa HDb`D20]Lk{%+@LX\W段垝f6:^Lg]1+T=HүW)- oWbΟS鍢p$ $$(ZY"@GA$QL!E,0(+e$ T@T$D%D jBEHDG,D @" B -@R-o-z\lY3cF #,Ve5!8!dHe1XFՔ Q8E0(cAAUS &BI&9UQ2BI$#F+0BH&Z5ѩI,h !CǙcRsdeedH޷?"Nd:yK]sלhvG; 옛"n5z4d$ @< $h`1-;˝W4 +Z@1X1F@C 2,  2H !Lyp(:n.nw{~rNTشV6FOcewi2+z+ߑ8` @ $D X.eͭH.䩑ua PUȭŋ.+]UcZcQY4Nom\H C$FFBDGC@d <#CEɮrzLYJ$Ǝ -(œDV찡*btYc  &6%ljl\:cWBI@ 2 FS "`P " WJ5I"WU%I$F*$"Jf THE 2a(,&"2gþ2AU*!!yM.l!2E!2E4`$*X2FX``VdC$H +)Hd)!G.H 0JBf%@Ԥ*d$0DAdH00q -*ĀH2 2VƜ7O"έ&.,\֙- -d4=.UdYY`RW]K.r-o lJG/1&bD1\\6*oLzB民j ʃWQb 57bQ{57;{joQQܫׅZ@$0$`"05y.uRlS&~νfɱf=\Տv$#NjNq?/<0Ȃ*Q~(AUG,Hdh6u+ɽ,i"ꍱfq{q.!ƫojgx `Y8Ji=;l&0cpTfRU *Y UZBFUMMiHjnTuWELnΫނqY#u! -EEY uqعq0 -00DC%@I!`@ X$@Z*Z m ,,~@D G"Qlm]h֜ jMZnyGAbCE$P[fV,&gWط?cm`6t3l.ݣܐ.>{GΦKxدK1ץZ<2$=sGD @$$H@QYC\X"&t\*nhmioח~U[mi+Wۣi\ݓNYV*ݗV,jߓ Kyۣ $,kSЧCЇ@C -!D6:ͥ1ύ0ÎTWAc%ďdGpUB\ -ejvF>ξś]^_OY**:FB BD2HH `("e * -20@HLhmF0+0 $ X40Y K: p<ZE-'QN`ŕ&XhAd&FYM$$ ,5U2 -`BrEebIA,Ar)$WIIb+Z$RA$$0J$H‹uW+nVZjzco܊d䀐@h02yQ5t9a2y/V *^\Bu3x]j}sg]&vmtgp#2byi}+xEzEyɠ8"EI&o>FQ  - $LHQ]Niҏ^ˆ;eJLvzzy=' -z<&zgY)^}q|wz ! -S U1<駧fƀ4X* -'+-) "Il12b"69W|q> *p@P2ɗM62_CydYl -ȂIR@!$!D)S"Q1LA R #A S, -c B) @ZL5ۑv0$Q*U9$"A " Xvl֖C2MGzڍpI6yb,$,Q[:t[Ҧe2fT22Unydj喗"EfGtH ZwŔ)#\E2BIC$e`(2c(`$S `Q hI -RRV -!@82u dJgH$A Ha18Z^v/Bi_g[4ICp,F*2pMAe[=X*{fiP3dF` !!2H@ -m·L=T'ZMfc5"V^O_S.uB $H@ I |~.=C蛳"mك=Z#ؼLz!xa l+6h wS',Z9oK.@W![n';0;A3& ei!Xk4㕯ZxsnI QuBNԶv\"]I/q:`P(! 8Ik:w<};X,bbO*׷fZs';=֡͢{K_4qƬ3`%0 +2.{%tۧ qlf=LB#\F#Çzd@+6U<ˣ~^eI-?HRTTes.lF䧍n{4l^?x!X1IcF?c}2E=Ww(vKQPHcTŊsdd $mGO*+aVGi #2{?NU;ߞ/<{S,L`!0Ԇ@Px"8 01 "b, Q)+ XD2*uR@ K0fZ!`*I 7:=7<0C.9@1d[y*xP2d+!*i؊v++LӃv>DTvÆ<߶W5Kv'n.zխn.LYroWf;Br|#9dE,0hE`(u@DM]>wr:X5r;ɐ<]KUK9y"UKiB(ȵ;w*gr凷XEnt6 XC_Ƚik"h쯩 P@[: kM[PT{&/7H|~%K2ʆa3/EQfG5@sj}2MK_@@%>*^s\]ѶݸbƿX^/W}?eXBHE!ӡ?wDB$HQ:+TZ<62+\7Oד3.6[vy~yORC $L D̏L,Rw3Ǘ\,ܲh9fnMts/>ܓrCEF]iE>㎸&VQ08}YB..T. P h2޿hW{4Qʠt:ַI]%Xp_™1y37+vR\ϕz`sNWn-{Hv5נy=7yJ]PDE`)(\{{by{p D#@y]>!H:h>"o[I$BHaK -ACBV*t.ВP 4E` ^y&*y'f5ޓɷ0IPpi~r:;5;^_W,2jyR޽'z^69UFr:N1{|^u_p#Ce_?{y濦,y R#Ϯ5^U+HHx Vkڶմ HwS"(@ kr>W>i'[6zIKZٰ厄DNl-Bu/>k9,)eJCSsƮ}K_<9_:"0O==׻@  R:$WZ^ıPDB!V! (x%p6u~?Sz<[V56LqgDeQW!1AP@T"7X@T*ve䷃˖"L5" ꤚľYh$[uPh+ S}J"y*WAy6>} -6jgеm׫80h_ty;ס$ HN%/.uS=oϺ)|R@Iq^?Էյ:7C0`5)c,%=һWMbyOWѠ -7?@>ux{Vlz[ DS#$x^u:+˴ςfvnIO1<[=O^~/hz'lڧ0KAb4WeدsҧۗC7—Hsst4-˗ՃSOUJ6[O5E|O-}W -=K)cQ{۸/:Pdq$Lf @`(1#a$H)X !$0fFS$CZ"6$x,2Db!91<4R VE -W-{{G\r$S $[<D7O8yL_9ݽ9W< |wղ00bQxr7$u~Co ,r#c'3HQHJ(`<뭩ӠۢΞcx ) 0ELdfdYYbzeu{9hymt8׮vg&CV_?6.CKm+JLiPgf"lڲ֖oˊ ,dyZH^{?πcuǏce. HA(wOVxOK cPZ(A\yJ61yǤb{FV#ḛvl)/سc<`X>G@.^U P4I{F*bRZ62I A ' -=7@Z&LpwR _RUU42T00qdr``(44璧C"F -a`Tbˆ^E1jpVę.(Hֽ^眨E^Z dJ;Q8oڋeƳjn14Ci%׸|v2m˞@9P5c$ xHsxcx+AyO>Z:5J?()7l!*Ti!QZĔǬ='{ioڬ[/})G yOԋ~+\Q4vދ>&ʴ\hr5P٣"4I랞)@ɂS69+2ű$)`b>qĸp*fn*ީV/\,{Qf< -D%P[1X__"_gf=UJFlc!*ZݧWgvz:.rI 2H(!+/1^}NrR[מw #UR$Y  _'_=^ zZ"U^f/9Xъk#|ίO$ f˫W;&_3%oKy侓]>n,󬻤w맴ioIu^7PXB> -,G^VXg]xu=Fj}n@ -eǯ7z<._RPFM]ihF_FM*ed#2J910큕К eH4ŀD"I$+(dQ+k #0R1H;,V X 0I!V X r|c<;tDT|P!G{vŻ~6clI`z-KO9y}7u+7{33TaJd|Rzj޵kҟX1b` a# -C$Jb4-}+69"$.E D  "D``n.mp,]G& \ ;9<׸i':a`^ڻlA$ !#)*bgV˳WfDZey}2FWkeEWՋY)C0؍|&LI_^_|kaH1PWȄuk"R"(@`4U`$2J1Ɗ^]-)|c=~ e^?Brn(`ɫ?Ti@ti0ffGZ]P9s=}]{N T010wy [z= DF $xI܃^)o "4*Lw/NAykǐPO͎RFn_*eB}CkegrLW픺KWgmWltt7v ^aP:5^礽=z͗=F<7חcԯó5 Sp;uŢnT2%3ֱqka0cP&[NzD@d T:"pw:WJfד<̾yGşy*W1v10yy1h7>nBcl{{˅ky@!-F -!,0VRN"J|zbN~8*,*TEaT{Pk.+zYNT} ;`Q2$1cL^uNnpgЬr<ѓ.jZnjrVIHws\摡G/"ƫ| -{:|rs9EdQ ԛ%)cS<Y -e/ω˺%23c`(|չ1B\~Ez8/V@оga[z%x6\Kd7"YAP8)e( +Kv/hw5˯R$scK9ǴR5}VE\pA\_K#v{-|Yzڮv.16TeǯۼONU>˾E=PE?=qm;ҪbL(b"e5:V;--.V:m:loѫ'7^-Mcϙr,U._YVvLu'Fx_vwGa]޵WV.?oG*5ۧ|٩32Okԧz2='{CFB!LU eMXq]kՋ.ZS/T-އ]cBDt8ysg\+ .fO>mKӵ q7<_zχE͡dBo[4JϔkX=n?c<;<ݴ[|z\^qɭO=9ܽ{ f#nҕZjbQ/q=;^Eޯ)qfǟ./4̾u%j1[U+zb_Fԙh1.ͩ{cLѴҮ\ӷ^FPI$ \PG0)V4V X;!EBFE̒H !ak1abCeF2D7}Úc~z۾:UɎT@HW)ܪ53fMG66yNGqp=|}[;TE.HF0:"&Qѡ!$V$@H`!02%/KpV$B0 `P€2#,CG= ys xƅӾ6dúqSvjwv^ĄӮTnnW^i2HX/ $X,"HVXI!T(d( `FB  UhP+]ס -p2vA4d$ _#)"P!|+gҪu+МЊ@TȚ((y:ɓWFe SlQ{2(ؓC6K^:fJl9꽯l1&Z@] ]np6zKwm]L|%e6 =2V%oyM -Ǧn<<3[au;: .c$(I>1xp\Ja{ޑ澡1GXuuVlXe=w~OsLgjܫbbצۓޗǰr<+=+ͽIXټXOwVǛ ǽS̗5f{<'6|^c3&xaK_y};OL;7[^]ԲEf!枧_U|輵ZٯXPoQ8]YY:QX.dǪ͖NxFus!8X^7kN*ܳ' 4חRwV5,a3x7tznȬde#|y8L -21HB##,a*̼ ŐzY)dju XҦQQWЭ]!K}k./>8a$^o Q(l᳓γHE RdNp%I! -7 b@a ޕ懤e)RD$hyVۛ٬XWiZrB$26*"EFR0*b[foc^#VoMٿyz c5T[.[ePNj.@&I/[7oO!)$DX@Ee@HT TˡFp\dI /_;Lutv[ PӘ!P$(U>}TVQb U#QQԩw]EGҗO枪]iэcV4emiP@ublU`h&o>x}ZTCޭ2B7z6i<}O]ŜItKT:ڽRo >S];[tlygBS"tq_>j}R>B4c"yg7XZoxd2Pwd^?k u6O0^OٵqȚ{:5x5_ГgfvVۛO>yw7< I a`E&HH@a!"I 9R@b0b´!$TȑAW;jNjw$TI -0FX* VVt|WѺ羅)Ll*kےnZ.Tx6\Mu&EJIߟzSY$hA$"Ҥ 0AI.}ËU o,1! `Q<[2cZpyv䫤YP.\~xzL|h`@A~O0|<iN,*((AqJR- $ʧ-yoDX -j"TFƼ1yÒF$ˀԪջX͜{|ԕWtMVJyWv]V-= oo=?Pkm-߸yl?g׻G;r"=`t3J\k_ҏ%XI᷋ O=߬t!BY#$UV>y7 -WZ\`I֧n"ϭkKUjK{OXO(GwEz_/f!χ5o^S|D\iR<:힅qrسFmlyyyzbRz5>yTzygZϦ?-s8β!*~ƭjݸ|dZn}2.5(ޥ-3i6bzF} JIK x{_D[G:=$ F *da0brx0S" -U@A!FRG8$>Gl8S#+ $AYJ|L+T/<$&?7AY6$@ehvR|./`J -bT ZNd{}[ *(2&5eT $*X܄킭*8wuu -J}mMGsq>5XZnhTϛVmiS̽CHͫo:UN'QS}[|֌T[EsB鐦ZY7ݚX|[udW:wΫr";~-ӓ9]Or0 L:;a[[3yxWY5$]2yNUUE4xR_ĞPkkz:Uf\f-n*RkE z6Ċ^k|C]Jsza{ʮk+fV-x 7תzҺU_N0&f-mL6<ˆᢵll3zʟ>[ny-szx4gNsՇNZ7+=}fɯuأ.֞1S];y;*]:{rq)^h׳uGKwNˇGeeH`HD"B Xs*m !2Ha$1 ,Αr&RI!).qƩOUNw۳v$2@'q}w_0V)~83:Ödk_^<9pzk/=%1mUF?>t׮vزi9*޵HZ3s:vO(mBr\uέgu0짞z^^=TrݚžDW!eŖyz[#+ H`X\-x`*HXth6Ly$&LYAHH(bRp>J9E0d(BI NK˗ݏq~mybukq+@[q7sm6moZM}Ğy=#)c5cϧbV"$,!RHbReŶZl5h;xcF:;U[lJi-,z^ՀuHvM>2HHI R "3)$, ȣݩWOW[5TZkM}|˃b-ˇW 4vy3&U[Fm[\դŇD[ -=֪[гVBǏ&(ةBZ[OY:tJնj^w@ONfDZ+ںr徜d\[z}UmByPENRH{,^0R{kd5OymJ"ٟgb{&Ş;mT-v<䓩9#_>}*Un<Ҩg_D%9ǏI&UZee)^Wv%׏ى]k-5WGK> zgl+͏^oTFVdw͡uFuȷWR!hPh`̤iDE $ c{\Ȧ@1VF+ 0B0Q+)Vlc2SΞKElޘHLjCZ(^j|1nUSvcyOrs3С JzsN 1WK?j%%q۱DfzXx_lYBH e02$9(0bАO<+s:Y0I$CJ\F*Dzp -{rt.F|ʡ!V(B|ldC^ nF0oc5Zs:ѭF*NV:gGw44 G3<[ڽ<@$2cI a6,P4@+d`HHH BHa ( "0B+Gꥳ]M8=3kei8$E"XѸxؼckg cdh ihQ {KSC[}g[˯V6tע ۚv^PnFZXS5mi஖G:dGsiFSd+)o"RaGOJK-?rm4yyu枵ֈdN!_sҸOfy`8>װXbK?ljDž:-,{WWlt(Zu_ף.= :~G^=z󥥎Dvt<$\s[.L(|+n[҉cYiz jtu?H;t*}T*txO`kl<_>}+;IJ5rTڝ-;]9)LdRZ*XAji˻Wu@Z GIXiSe Ϳ;h]дTܖڤJU9 kGI P#Ń! TGR8:IR;&i$XBB b1BFZ[Ζ n1 $LA"g$ؚ6ƼͶd@Ad!R$$44;98yӨMɑy,Yw^=/*yny9)vgB0^ a!P9x-q.>tUӷszC400b`&>\-)vѱٚ1#W +)|oBA !Ad=JeյL/dn &Psd`I?|O+ +)BH"|r`"D@ -`` -4R3p@HE1.Dhc%XT,0A?3PLb +p5򫷡.1תڗ.J$놟r7izPF\ф yA=2$M/3\&HxvZS*7+}񆭴ޢ681kw?ElxߤWMZwʣ5}s׸*[t8y,{uJιK|NnC " -ޞX!# $HAHDXPVI@!]TV C &Ah -@@D@@B D\ $@׉5X[jÞRϡ}BȮ.7r@C9ē?'յje%ɦmx\c}C-fe՗r6)I1:ud5?6c%VHS‘kVsz+(ҮZwR9=W6e¼촐>MBw>7AQ#Ewlɻ82S/FX737Ų幫Jm@[^Ǘu֤Zz}vRdN<:4ӣ]t×> .,Ԝ˩_=Ǒ3suG]Ovw୛,oܞ:k%;M⑇BSWl 1H^ d*B`I c -\,1V \CAY$# FDWX0"68ɍUە,XF.D)5a6/U=y/_=V.:V쐅`$V !8v]J>&ȭ*U5fJɖ.LS^]+}:3cc!RH"0%`LdI@~^d_:ؙ%!2I%d+ش7Vvzr#f !FW@2,JCW[8^~ X L1Dim̟M8 !a $ U+ $WYP@DR"$Ah%[ч8"FR $$ WB26Δ U`PB0J\7uO>)vgLLq}>#ƳEmwc(yitG+)WIDԢ'&Dyz;gXtiC^uk&~EOJZe覶y|Mgox=^A5:ڜ[{垠p{(^bϢy6{v0dQn$S+}K[ڗv(f`9|[^7fY4>myհQ/̹M>ͭ%-ҽh2+\d&U9V@5HeBTII Y`5 i@J9R(Ò^46)9.zίY #h=3K̻]^0(G(iX%0BVS @ HTb) H`$#*Bפ߀B*?#PIf]ŗxއY<15KrдqeWWWvK I -^S9gӫk.:=eOR^\۳wz=1hި[-+\J[b*M*X7NJx\ν(6UW> -8zU; mM Ϝ+"^K[Mu2.}^moj:d<&ҕwwe,ZšgK6ct>]UYbk[L^k4*XizdXOǷ_bK~i\;FwO.٥y%F^VfyZ4;L_);_ҥ0ֿ s:ކuxŰB RxŖ<ۖYjޒV 8 ȶG#CCf.|zKWn^Bz2"TvDf0HAH2h9p t[ͦhV$826mlJljER;ϝoj1l]>oG $ "I SWBlmW՘z>SqZxv>&Qѐ @RHBH4]pjdcDX $0A : Nyt[d׋LmuMS2H"0@HX@((4Q@ -J6<lM R 'hƯ$(X-.+VZMXw OQήT-$͞t[lPBTGبѱp{GKKd\^WM}y?׮jrxwS/mwwWavzQW}sgQ/zUWMޥg`yiuzmgjҙWMsKMڿ`9tKm[`ּ͙4/}c4&v+]%֋=K"J,4AೞzrڢmuШl|N1x_2 $R")Tq;i5(k;[Gpsm^ܾ/F%W{IC_B[}nd[i5IJa" J+ CGG c@" q8e ! 9;QI &ibٹR/sF e`$xuv:ٸ OUpM8 jI BHD a@C$!#*ВB+ Hsf$@ *BrD* "ȋ"B0`]C`B2I $ "*>[U2=&jQ/|ޠ L.O#-eKQmu69[|ۊeOrAQ(9y1Lƙq&:Ǭo/6d=bv2ch78_&qr=ڻ|siZۚȐV -@C o*Y{[jK3(p}6{э+vw$9>v{6XT1O@p'Zjq21SsЭYkp96popgQY*Jyִݵ|׼ݖΔnE.1<ԼnK񮙩~}"=#nYK60lw ZoGWl9ggP(׏_r[䞑ʾU'zN\(=!\F"A{NStW̽ANU_dArR;!`tRh  -1IrLtv\>1R:-|y(V2yz\JV%d\ɍzHT $ (`FRd UAGL0I `ezH!@N'jvCx/RB)HD^x_Үcu|WJn $2PB)px%dӊWOy)c'B.8HdJSsTR"ETDEǑ_Ľz aQ2LHfhz^KMCN{I)Z͖;ŇXڮضFYه/QAn 6Vc3^)niڕ" -U41u1חl؎h6Y4~ĕo[Ǔb:< ƥu4Wd0u7,+cC -k]ןUM266F)@Hňl].U>,k-[&-$d_yw高iI:M뮟S Zέ-8u253)Fܦ־Ytj7^CFj%*4Wm5jW6nmSWӶ]D'Y}"8MK#2-mpded%rQ*X&0]2#hH-X`!TZWt1!)^EF_<]@ܬVϥ +z͏>*:̣?z׋gW=nmOIlإBT@BJ)fR$!aa2P` A(̯P@s0`[-3_!f܀7%zұ[`0,0`0YηIlUvZ";ӁC 0 -,"2#, x,WaS2{uHVHHV/ѻtRr{yU(PaUf~>{>NDd1di!2,{g񹧧`̓9Iԓϵ٠ޓKܩjU=kpu8=؞}ugS>_:+I]Ɵ'jW^n.7s뿟qM^=lH -#9L -mr7kg -rޤSX폕*҆fzQ/++QC67^7oD*F#WE2h"Nbkէ>7$$< BF !0d>'L afR0!*$>ZQj^緒K!G^_Gq3\1@}I\ 9\2CObi2i"E$Xi200X!$ RH@Hb( luݼCA -\,1* -( 2ADX$C0 -YHAr@MH $J@H BJ Pr: -°TqUDkNUXV3+36dSKsVWѶ/}2fhB!+.1$uu*^vE{vwvƙV05{4U% -;ii{Hū-f*գp: ңޥJśӻ@Y;&_}C#a ȱPDN1#OPťCu6m@*|׬:Qykw9KE{h, y|.:kJŖ{ 5qlf=gӓӥ{.EKb~z}z]+PޝD%y_гb}OJ(^\TZ1dSdg "Y8TyiL9[h\Czqp{}eǓs{YЎ5n{t_:P&ג6}G}c{ o*ήzl.Sb-oj]yqӖ``:̮Ss/@s;*M!v͖|IuhHaҼ$bZ'KYuWq:fL9k`yǤu),8^1?W=_S*֊me*`0$h@L@X  VVdt24IP14idYB58Ke=N&޽G<L+z%h$ٱ릨de\o]G˒B  DL(e)`TC,ǐd+ÿmdEq$Q0i^YE("#H aU` "I%0b `D aA 1 e-tn&7O!fړA#;=Ձ5cz`oSTIft6[lCtZUA}?#)4꥞Ovɭu2ilMQ.+FCSgdlԤAi}*6=_-BөojA6!!uUr<+ܼ7;y,oG cL$ rai -e Z0 -@$(H -I]4UA:uq__91̊ 1XeU}N~iו9ٹ}Zkv #+T2J Re5+ &,Dj|X=Kn;X4 H$moQKY I $PXH! A @+ A"DB!Y%"BaɠP⣡ofKCD*罵%[sw+om}:2dEeg U`bլv]}7`+Vd4aAٛ];a56|9l%?V?0t+U Xӻ]SxңѵvV|[zm &Mg/#B$㆕ާuP_#-P}gi|OkzI+o3ڢv%Z)vӰsVD+J釉ޯ]'8usY ,U{;2hNo^Rz#='wֽ{w!<=x2Oҷ{Gͣ}/Y>Kk|3~?5)LO+yA=xc$}:>f 5} ->{y>=_#9<.9i:T;Q9ݍ3CҮm!||e̫mfNj;"8^CZ; ҪGT)>eq,j_cvdHa$ABIa0 ' ,1g:`l AƘD;09a9Mi&Rp)ږgKҸaWn'e>~֜tO?/L@XҰ$ 8]jW}څ"򸹬g|G-RdqBH)9 -C>]7 vV}eUKd,,29-lsɩ$HdVHI!B  2PH$HH $2,@JVB4$2.9%ȑ:E $/HoITN rEdBFiڐJ^|ؑ$UHu:Mhsdi$UFI@ȋ$&)#ߒI^K9$4Zri&7NJMY%ݒcrI#!HbK2<,͆BmHke7y53 Rv $ (I +$k4$D$ S$$$!HHMC$Ua$$$d $I! $_~HLrYC搛.v'ڐI$ג51I %kIK5Ē d$D2h$I %$I I1Lhd LpddF|2X%G7!I$I0erI3c $$rII02JBI*I,E~o$,om#Ԓ #G"uȞ[ّYj +$jޤImnq̒I!@HgI pɦ=) zj& #B@$42aVH*!S,2CI$d6$$i!d%<$>ăI2fIfؐc""L$d]D$2C +elDy$ A% A2H">9+GWtT=c֏O*6faSݡF/}k%?#G9hΤ.ѮZ*?c.9mb`}&:q湯ͭOCiçbI4G425S6sLPpz=齊$YLYNא螓 _κyY*4V -YκuԳU=ݚ%3},J̛eGy<:Xx1gO\XXyLJ8e[iS ^w؞qd94p]}&`=z#<Ɔy,8\ha:ytdOh]j6b=o-q%{IRn `i@NVn_'q( py ͔r^X} Z' G|]DN˽>^`! /bijVev: r{sM)J2t()OoVQi i(F;d:W0d  .vwXUtǒy58 dM8J~dX -m3oE -~_o2Q赚H)"J7#OĆ'Qz JVK uņ:r'2.c]OC)Mkʲ.ɠ3M0R{(*+sЮylYԩdA*laB!Ί-sM3ˠL胓^[\{17(B=}q΅su|%6/=P_\+hMiuΈ<{ oG^aLF0BtDiMY&:`鮧LDI55sIJ5}vMYf|1rwiNȰH]h#o%héV3`-5B^IeIFϰo26-th@} ,5XXR#mk`wf dӈW\$3L(`Đ:7OP}e-뜫 w>jsqq|,7};x8S_pս K» ~&tyn1 qL鸠[?Es9ƄKYQPB^5>O[!bl_|;*f7AR1NwXdhPh!Sŧ8fX_ A--O}+hz !,Z.Mas5Yz5e#\>Dh1#خ `> `'AζkdrG(=0qFU)?qz?ѡ "[a -jwb݉}$xWɢ8m@\Ή$V}qO卦#~I2TR>g'AfOۭ9ڞbl].Y3݊ } z8*D`K~r&@"3Fo=y'NS3h$:◹8]Xq? $={?.dE3HJ=aNmn+y0[V-b:#0֤)ʍ%uU&`NH4;җ/t%H]?:O 稩!u8lC h4ybIQ)}yUK,_cxK2/ɍeG;':Dɤ -CLl r -:#QtO ;}}}ccJ׮NTxMkD@4ПE#s#$'V?f hC]2H5;tJxf1)CgMUSC77uwYJ0g$$4j,|GN$)(DGr~""ҷԮB~O9D9~$ysGy))ډGҖXMy7/YvUSH}"ȑIۙC5~jAQZ?Ar[u%rMY?f^cT OWxM+B _ImUrД5)vʲIN3I8Jtݾ~Y:Ixt9Wg2ƅMh[s2MY^L[GŔk?6 -s p/ dR dohSA_]Nwo hEƚ$#m j|QV$x,ɫif'k2髝'{ycѰsl.`8`YWhHQ/}?%@3h!.cNܾpͬW>ÇAeVbS("gcnXظ(T@3Z3rEQlKEIc"J²xdFz3+Oa92*lEx:(e!D*2US{A ֳáeЎ!Olnѵ bHF_*A9x-5AO^'v0sV xΎJ^_&Nl6d*D}G qfYT4rޭdL,$qwYкz\C4Vg==E mb2-eanJRU--][*i;y=MM`Z|_u>"=;ҩ&(v#VyΉ I(Gjc_L*ivfg+=0TvhB@G_G&&P$ #U(:J.<Ҙ-W{AD+rb\fNckyōU9`,]_1=udo5y58+Ny|{ -xap3OI?2ȡz=oODQ/=_4I{D n68ii9xYo - FOI&mr -Wo5:ӝT.Z'RDa>UDu.ě#4)1$d w3hIO:JytwnuHYE\b $:OW6ns\_m*TF 醅u/5ڝ uu$ I+KS#; g^]b^3_[Uz(:Js>bjA-+˘It~ٞuM-()q{. Ұa,ٹszsȅ*,t2B5 8ﵳE PAQmK.7j`~ %\'ζ|fe<$b2< 2; +jZK!lM6ŨǂK|:mlsiŨ9(b2H0Ѣt7"L2>%"ٳ-nyЬxwbrAhF2RyNoyGׄ`6^AgӾK" -2=[fʅHQԷ3\R5~o2|_qLqN!b QKq̊-͹0}5ډ,FkX@)9%IXUjx{rK73h큮V,F~-<T[d91i?ȭJfj( -+3q|Ī2"3q_]iT{Kq#:ۊ)5=ZgVCv Q| ZI[qc1:D&xㅞDt4t4׶tgM[:z:{4zRx5kAuAf;(̞i c}SeR-r# B`~w|O\(r5i|oҵkC$Z -WH|+LjmsgΦ5d84@>m5>my-3j,@^4q zwHx@錴b5Dɑ\bj٧Kϵt䈌Ὢwo#GS$ty9#.ޫ,%W)Jv:s-En9e\ytFu^`-DlWMv*nXƠ2rDtJPHJCǦN^6בhѣz YNJU$Zд{X=&i/1#RIH.\I4֥ʭhI8oG'Jv9z3Cʎ2Vй"ҿ(6ҿ hRXuZU1:ނW4eKB0qZvje]/ ]$sd H.*_p|$KJ6ɪON{i5sʪgT+WO!8SbzOS.%rȩ:*9HMC:{3ۿYk]Y _UYJTvoxfl9,^ $ihPnÂDooW}v_ZJOg(ڴ1ډKS]Kx}CBCkOdASbq8F\i~aO.PfwyIW1OԳ]Nv!>a9}>_p!έj5VNn9>59jpg."SL1"} .u~F0VE\u4PI^"A+^9]ol8i*u Y>nG-TW]^LΎ -=kXs%Iuζ4kjx'-m9V?(s/Zy_Lе/x5dq|ZMsб /&IsˬgX!zʊR +Eqd"8rB6TGc҇_1}8~TIF~ו:KѿzC\2F=d@5(rkXKT`UI ҋJ>W-E^V؜D?cj$on~$8@Q\)m-GP;RضXp=\\p};ўnJ0?W1R$ȟǾ]uJ)*m?D`6otrzUCyY}2^CݖX`%݁|? IC'WCħY#T5)qi̭ P: :Jͦ }(X|/ BV>xlEi 07^vpkq{G%w4m}inŹH{GĢ-hw}9wr&+M[^ C UR=ae UXhǕ*^ݻ9|K#ˇW)Ǎd;pVT:;s9l@d6R3yS -aj8s PJ&4ס#L߸/z 8$^z# t\Gkϖ>,T= ɞh)Sn[)mttd@X_yrx -'>^W;_Fzb= qqXj7#LT׍Q&]guYe7nJv)h ~Fw_q"-vrp#QN+JR7+=:s;*YwG++ڊӑ@J=ͭ[6ml١ͧ493Cd5#AI,Q}k<rDVR3xFT?ܽ!`ݯ&퍶 $]O$f8UizRk,%v+Dq4s5P~%V*:t5"l<0hO{V!mx,رM٭p8 #RΒ-ZuqfvͼZ1]xHkq)Ya+#OFz&xu bhUs-A.P2%#@ێn9[N~ +naDS4>2G4,p$`Ț޾|fDaZY -/3@AS[&zC6+=ȜM徵#hƍW:g/_GDj3?lyacL3el[k:YκySOec<|Vr. ~PvGn}"Q}9#gȫ2K5pD˽-t>O9u|9Ü`rg'w۞HV[LrqD5jDk _@6nNpn9RsR3Fo\m'O<$PL~kD$>` 1]<j|PjhUE@}ʲ3M䐼~xƛɇNQ>?$B>VC14l f۽6+/;ė%ܫieTW[z}#p1Wϥ2Eӥ^O@}a UbO3::9Yή|&κL/ȷS ʧߪU,SC:^utsOG "&U~FV)v^5S螡;} / -izJUΎG1RHJ~z)wt+ MO1#%.y百ygg瘌}nğC#6uK=>4qNIQj - N4&4)aR+VrG^k֧59jsX>6m[ rƭrȑwsw:mށfܶ&j3=ef=礹~P@>MnJע]xA!QaK! Q :xMiz.«0xwPTњy2hURjtv(( ]S]3T0bmI:}g19I.:[YZRȧhaeMo:[yNΖtvpհE @pnv)|f', ~W(ڋ!6=oNv`-_s!SQ̶Tŏbqew NT$2_EsVeo?q\L49fͭ6h٣gϟ?9="aG2盇WT_eA+$Ǡ~uq$]̈́{ A6;)xY>id2W_ŸUw1 [s"u \6.pcLgR2cG#߷kDv8o[<ڮy%1دj@z'yfv#m>\KHʧTj' ~ԑ)`z!w.Ѳ`_Sag ^7voFa}Yx6rfh ,r ylXc>q&{x1"D<̀>eYUXUMe\~v`ٛFhaoa2 G2k ;DjΎLZ~l׺".W {JG=`.`mVJr̄a QS/&CZ=6Myb_M۬hP r.H4PM8%{eA xy`ȩ=`UۅGT -0F~V֐KQ]NjsSȉ,e$$=ᯤA#wjsqƂH$>m7!I }beMhU"׊=BrEmFPX$=K57ԨVȄ>|"nlp|e9@B.ͭ[6h٣g͟6|fjf[76nlٹҳ>Ngy@gS:V]d-~&n;$|c|g;i]7 rWif':gΕ:Ys:YFrg*r.r.rlY`O?bo2*}-F$yLK2ml뫞ٮLuZ!HHV9sNb;BV)S2#B2b%>2ۚ>=4ۛ}=L;Gz< ͇49׈"Of -;ue&E7kNў@P޽7#ERm 24[s6[mzٷ)`1]JGW *W΂E^8u۴aH:)mpض6k2^aiFm=tUa8T4#)iC?vU/SKh[1»ў973ɥQ~ -Y -hE ->P5pXcJL9[AB^K5p?/1d=I..3gR1($c⾃_4kWG6b7qr,gY6Ց+s݅JWGBu2n!_Tp%c/):VDQJhex}mOb܁ Ydꪟn}l*o4<=3{,0|0?nquX -H [-| Βt::%|`J aΆ!/<sW9ؚ^Bq'f~0ߍFZHڨ՗j.ՖY*wlwZy!(X|!LU9rTOFHao0h7%4iZ>6ǻan9--j[ -O˕7l\{trG6 mVc XA=+fY#>t2W5IӅEWN|eOnGӖvm\2Dp.hVs&&⋔zM^f:| \Κr/g"r/'`rlYf%xiijGZ_NdfD F[B',L/tiͭ[6h|mHC#G[ϿL*|e.N;*L?jsqNj}]zHu>_ytai8-ד3LV,N,7ĦȬٱ"}Yz1%!.>q4ܔ e̠3M>Z@ @wğ$pD5fF -uſYQ}b}0cO& - ֖f]K \sb֝dg.lnfKyxff̾3!H'ӕD<KtǿHi('+_nl X D !#]c׈EWʖ+B;#Vӫ,R}*F5p}Ib\C9\CZ'ղ\4ظ>=S] `o؏UcR/#w8tKĂˆy#-䜔іh$WM5c r\0dd1=fy9uqXWWO7pmFIҼ{߭(#pȲ{Ce{LkjsHs˓!,Srf>dxh]Ά!Pω3[8-wϥRVA u>|5-~T5v3l n!sr=|d":ȡђ:SG T4]9ˤ3G9s5,gKK:Jx+VƭSqD賢#Ѷ#ݬUiNtdRMPGsXXS Ýf ?]dGYQיsf5%7ɿZdJF~6oK!mw~XʻɭGHڟH>%4Iیz -9/r͆UfDKrfOV]4 e#yX/zbt>]kY| pyލS)L[Nhr(,[H(%Yd<',g7`{HgTG?QW:-&XA%h])\әlkNtYvH@6@ht)gjvO 9%6C@mENRgN]舆m5ŹU(gp|mMʏL?E=:}A[hr]C|RVFxKj(H ?R?þj۟6Q-y28d]Gf2yԛʑ9]`eA O8TyyF1#EP-Jk%m܋{zG,r~~z]>/~9wZ}7 ]wjΩ( ݚl3"35龜lE"5T07W3s9wrɘfGg8k#LJ@̭emELټNyH7sV5>'կ7|=q͛nl#%;D*8V}~T9ʃ9UGaέ ՘ HZ&l8TȐH6t-gDѾto>tG6tSgA.t` Ή*SM8ɛkm%)9>([t+op+ -MWvZASn(ʜE9'B7ƯnWR3QbD-)RF1n^6HO sĬ{q {5~L0&;)Yno&؂]sG!>-GGgJDf )!#ƒ‹E3}\'Bl5$8{0$YnV]P_6 =N]̞IiOnsៈ`eIo-4vkפ~a3iG.>c5j=,gMO:ZyΖtsItgIt᪹ -o#I&GU'x`٬QbJ9G}A>at͟&e -ˮ'&rͰmƦc$TƑ,QPe`Q԰KPe]uZ@Nº7Ayq<+hSтneN2@=+d=޳ YYX_Y($a >+0Re/4UD{c0Qoov,*' -G#@83CK F+i|v<\?+# 1עY:8~%<ܨxNZ-zy!N2Ez#&<=X\du -}E]IsgUk@{bxɉnMmњdC?1c[<ƶCb sS鴰#m~u󪩦,8Gݚ&>nrOgHܒ$}n:n?gݟ۳nióNxvmṳg/g/g'#OC:j TkUN̳lH6F /:jHr"{o$ˡاq3zBHß-L;ŵ#=ۤvI-8Ndj:#$0#??߆4o8EȲbGfoPF -Ser:x|co(  4qq,pNWN#ؒ켈bVۜHT -8DOgxB>TR$y45s-45GV~d*YJhY3ȿp׼Cf>͛2?=alگ̶l`ۈ1]pW8Tr Fno>?g;ᓋWjTOz?HsqG5ɣx!sf㛏Xc]=S}sa -Άt4 L$.>"@=aOK􎜠us n'mvK\u1g&,/a+,I4"9aqz=n~A7\F xJ4xFQ.RG -hiOn)s%/  } 3CgX?>MWN 9)C.ԩ1ԢG!m~t3‡T7sy퇿{f͚Der$kt$)v5;_~OLv+8uYrZ ' I?͘-ğЬˡ>Z:t-\4ΎtPgEt1@&yzg.yvynynyi-9.Sn#<[G:ʓDW7K -N>}9bWD:f򟖽V]^rB#2ucq+j#4V+,1t$Ѽ)܊4(R˓Ejd2Ž? %TX adMR>O$OqW5wMЗM /2_>+-6'Ӯ}ڼ~K?M=Yk]tgO6tg"\K3.r%Lɓ92g"\K)Ԅsʗ9R*\K@I.~\[xH'%c}=Y؝Gvy&$jDf (w65kcR ZLşjqn M@,W i!'[gH$D |}P>x3yܩ Ft7GI"&zw2  Z=uUV1xyC2EUQRVXaCJ~jXu*,8W9sW?zV:kxJ@( f xX˧g6fC*%g\/'\u:xμg^3׌צÂ~z3< R\=9,_:&$YQ0xM׮զY+]2y^M'85 -w}DU6>bg˟h!*ٮm{l?}b)_gOIF=AԬEa{Ӿ+Ű?5p}C2nUG:z^"r(.t=,OG:z9ΚtԳ=gKK J =JŘ%ee`C%$hU1$uk,Mrr {7s=֭kcUT3eYT|&}za&Izh<B\debŨ.*eVVcβ!Ýl9Cl9GtYCzg]ug]ug]ug_u+Y_7&z^dpҳ 1"ϾO|Hۙ`؛@vn}ő: saQ0,"΢<ǜstyΏ9g6,Ŝpooqyie&N5EeQuq$/.3^ʲ\KoL[JAƵrI=l4k`J@у/.l>L$S4~4"SctP! =ʯ_k:YȺ-G3HAE&r8PDMvy/{ֵ ٷl>2nDG5|kIt:H3:JΖt󤯝%| Ύ E_:hū z5cz9+ݬޫV 77z>4/P5E^BY<ɾ^!'b*Z'7TdH?-G HcC&"\ֆޒ,tO]HT#rO*[w%|yu-~ $>}fa}{ N. Mg:[Zss%,Oo:{yȷ=^o#~?|K ve?q-mL|;fJu钐N4!zy5+}sQO'ݳλWϵX-<L4AC!>h' 3;VӻE: a읽C"q5>2"$d}s{7nlٹ{Gvy# 9؀₞dO@߰zF3ІSi5x t~\9ˇƽ󬫝el*H_ 6VRti~En@L&JWa%as`o.HX+u #nYuIAe[#'w(oq')񵸦ņ.\c4$A.t΃<~Oy#=fgga36l6Oc9v3>r9ɗ9R*\˜2G|znu?udzQ$aۻFl`=-aa9 Vhy'Hƭw wMce}^ôKlc}0& I5cU{:k Cx+5+g?4݇B:'}++#"nXq|OͻgMo]>LǮr95$D[cdoyZb*3&0'=ztOsB |WǠ}|:K@F )Yb@Uon,14eK >7㚟 rT[; Ij`R-t2ܓp4c CLY-4]O9B/oT؊>:XD2!Xڌw -we˼$T0FG/98_ww qݯG@.k!hg.2Z;9UC̓9ɬm9 /<46m9igrN#>0Cųr$v@?xE%?\ WcaK_9ΑcE;t'9M4I4>t'tc:<Γ:FΑ|HzI"#ᅴx,FǘD -[EjCAd+͠ha{j$\1"$~΢%Zfgdk̵A<L㍛*dSSaQxgUw_?#Ů޶L/[ +loiLA?d/E_3VCt΃ѳ'p4'u2yQ'}xJ8d(ۼe6)R*7)''xK;~妟&Ө++N-ir|fs|9̇9g6 3_::WΪuUUlgU[#GbWm*~O#Yq*>R6)^B3Ĩy/j1 -#׀x甝-}t({,\}|0Trub -#z .(E2@T -gae^@X$x1XKyɯQQ&-f˷,AyN^;l^$ʿ;9Tڜ[Nm>2JcɖĮ"fp4 4J;#q#P1^??w^(FWوsG'46y`yxsaϢi4aEūyA[EkaH}{{!Fג8XL]?'LA"nQ,gIc:;9XΒt3gE6t3gC6t3gC6t2A.tg͞_6y|M]6E 5SbCʌwg]#h ͍fxllU+3[uel#ݩFFvu=4aaR6܉ָz{{fK"d߶rӴH/[sL'zL_.:;ЂhLe7UWu lî g=O#u[ZS me S SaEZQ r;Ρ.7t9σ&=y; -$E vj59HdhP@Ĝ_:T ZH$@GO㚟lԘ^CʻrD |8sxr8m@ہ#QGz]e~Aoky{/JΝZ\N5es4 -42Նo(I>ƞy?RcE&?49cfͧ]:TųQF'۞kK4ȧ6 !%px>O[56Y4dF>&z]ÆSj嵰U`;pZvUYHbFS&] gpdvCg-K1P koගۛO>K*vٱk}̒ -lߴӵ˕X-M6uV+@[]#Z+qYWQ'e $|4ZWZ!,pvp pk 6pv]އ'\d01.bV]ĥikQ/$eTA]kGr*7Ʋ>֫6=nd6I6.֖d*[G/ѝ<-td86l+s9_s6F|\DX fGJ&kS7T3_9c۝[99[ VTGw; p&巆[e9y: -sC0~\990D D|6,v q N6`sC(`OOwbD{/|͍3.rLʓ93aAɗ #Pfs Fh4K;. })ɶqJȗ!Q,<']-bLK[מZ $9r Ć2# sgͼKc+.O`B3[dvImL)˟d>o΢u7r g}y2J^ -pgC\ȷk4M!?.Bf&-Q#}B(srP`F >[:1n+?Ύ~"F$ -8d|ym'tl%^N)O)qxAMz]ޜ!9A4(o:׸4 <;ehǯ\UVszy<|ϟ>|-N `W:٨>pv4]uy5nY;WˍY6QwHWVVbGe0U(]:K5IWk&ݫP`3s|8!!|&å:IkN8N6q zVٷ!8"R?[_WIr|2H!r8bttw!Ƞ哆1ZXϳEwod@'7?뜵,[_r[M'[UF ZٱiT{F/Xv0~3ƿ+g2G%]ݣDѮI4ҷͦ3l[#U!A{N#'7E}~5ob~ -5(Nb2d6Xȼ>+/k;*WS<25; NC*ޣZ87*XVQhafyjVB*ȍӑ6k=;6fήuv3Ug<96lc7XlgVsaϮc !U\9ɇ9QEmw1~fKo /_:Aٮ6,WhYV$J-X1h!{ّ>[5$hcbѫO&^YnAv9qӃ+*9=8]tī_vǃebzɰ) w6SeC 0mYcEřH5"h`W:~JژQF # #A$D{!43̨gR"VcxMfCIc┣/7O ~'2ӘU|hd'PnҼ|5v3G:ŵLg>+Csma=8ͧ6&?OAZN9Ƚ~.ؼ@Hᑂ8+5 *[1$r S+'a7OY׈PBU\;~8SEjdQ8_7 oLqH|1ӋL65zY4uSߐ$6QzyLuYb<#Nʔ<ʉEܬf :VUsC[4#k`TSK?o !allٱ3Opy6l9gOiuẃg#\Cr?'c:FfBfAF2PIO::xUB|@kk4u.G]9j㞸-V͝]m3sg:so7g3g3333g3g3bH2^Ս UR-vZE:fvw},#s nO&%mXރN%]~Xh -+VɃ:Jر -Vy8 SY ^ij́L#HdS O~IjӇmM~`x O}Vۺ,ԏ0'F}uΖt3!]C6vߵ'Up,WK,R;p X`ɭ 2\V~Vs}0_6ה~fH-r.!A"UnR;'6s0?H䑷[9~9[fԷl.)'fJVft^' 9 }T_&o|pGޟ%wmJswϛ4"/jC!ՇS._SiڞMW:jUΞrz2,${,rqNjsS 奫Mhա~y7+ -U٫z;3L[wC.ؠ?K,踖V[,ԥa0,gOHqb'<甶/ -с--(I]Uz3:3@Q=/@@ׯ ZfcE:Noԕ+H]?!c+h㛛76nlճϛ>l>lѳF4l٣fg#?nl96_NO,`$*7؃BK<kN[OIN-hmbiPEn+OgK>[[*۔7+`PY5eB R^3VXDyLBeNT޷Hm~Gj,%~7 X3t2*DڷަG*T3b]+mO 8T28=Q0gȸtu f]fӅ\7Ȼc Vˇjݷ79~_˹8 {m$I,>xl.%]Ǣ@NAS-N J󦯛>x99|G $wT|Ec)k|w/ˊuZF&yDcL[~,#w!5țTa(tǶ&^ {K>l;F]E{aΦKtWEء|%Ȫ"= |kgC_QWU-_\h%`OTVh3}|2}˾- I1ye,yAfW3uIȀKlv:7*0u D[koȼ_mدY}J x!qO%'g%EN͈1.$+Jj+Xp7J)>YeP7<]1_9 R̯ovW144TǸ3pڼ##$~ÊG-RԹg t5(YSe}zX5.eJkCǿ<6$^Mu`q*Kc$BBRK\BWAӃh'ZX[ԈE+Zd\f=6|kaG81՚s/V=ۂԐ|/2Y篘uƶ U$РmDO##q ,z+]vtNMk=9'<lZӼϺExUg AH%d 앜,ݏF>0,lΕ|ۀ/ϓ/4?su\W7U3}L֞+SgoBI#M4OWx+#W$5RF̺;V ޼^J~hT1dWPˏ"nX󠉻shøn6$U'Β|'Ȣ3xF|ϋ9d:xmM*G\ra#+<\o}!g~W7A$%v؂ _2gGvɧ x~kC)CI>: ӯ)O-]C: -9ðq[r+zrIj]1ٲ%ifD HUiycL>&k]9ndqں{[gҐg9cppEXgO_:z@U&KO"330pNuybM6p節T 265cr2"K󴜱 !7Luv:s/fi]ӜȽ+Ζt󣵞_>y|XL󠰽«(sլͩZuiVjE=;r4ؠ}j fT eW4?cfFf=dMOjoA .H0(B}uh@n]L{i -r[/gH_)Ҋҙ]0N] sg‡ĩxIOkar3.%kѰXM55Vވޓmؿ9K 3< {ʑ1fKu:ʸ/W?t>+{AP8jegɐfFXW΄߹r -E!,q})a!Cͥ^Q*ۧ:htޑf$h*F!̟WLr_iXܲ!>߫3D7Hj`2$GVs6$XǐF-K(y3q'/F>;O|BSr9\?m+TiakqR0.?)so_W/𸲛q#gOŰVZ6ȁgX{/͠XHsKG&7^i`ȦYrz|3&܍xyTEnfyCjg8 -~mjVϛ;ZU9ëV&2t50F.! Aaoog+u@{]+2ʁΑNZIQ{ k4qH\HqK~qnkⲢ8+%XU bՈG ӆkS,VnNJ > ╛i%߿yfp9ͼC6 6^͗{9~V jq* \Jud}78ʆ즀JF/0s, u@ڊWcĀ7^`q ʚ=uq -ˏa kDZIpmh}#,L;O]yO av$+hǤ+gI6tkn|㣼RsO*HpN+ @ǃ9ppuic 3F4l[kKfGRrzG'[,ųųŰhǧfy~ Zr0sy9/U|0ӛTX A'8rEf)9':ǓbYHd -vI )ͧxWjsom3eHN'V݉4x7DZOa*`0#Ш\hpQ,yuL(&lW3Yל:qdg.0BOq -K8kO@ HsinWy#9DZ5M#=,Ȼc.rܰ4P3F5vTfZ֖df~½Z'%jȪr)"Yv#Of͂,I -aӜp҄wb'pF)}AwA%~6YxraXd$ $!q})>m|,<[p;>lϟ4lѳF|y̋7śd9̋9g6ÜȿO!y#F Ś 03B.(u`]IΨ۟nÞQN vW훾4'7ś,HenL{[Gn`[Lsd,vX]]Gˎv c< -5$HJt\G:>#NS|d7jzm*u1m@E?Rk#}9fhvCTϓ5Wj[s !\RB3c&ߡOk_Juotͩ9=``to*-{/g.la| sj~C* |dӉx28om}ԡ&AP߱/Ize9GZ/Nu0b=1tɝMlWGg=Nk@:(LSLN#[MԺ)WhŰ("!O6Eg`b#əx>T'̓RUy2E/m0UY6x UdsI%)z'_^%fU1!ey"3#:k@u;ao`؉+s -F۠1!3jˤZr8bT;]f1l:XGe ɆSg }l11g g!s󥯝5|K_:Z+3rbLYɋ91g"FDQVjyza'p8Bd!1@4JF:{}񴐺,]|H /kߓtLf^}r)^Mwxy|gA JWh45dқ2}ʩ$UqkVn*@|]A#1q%k|˸稳kglO59I#"35y 1k3i!\d̝gPF"TL4:j#+Lmވ < 7ƿ*5`OS69s_9+1sbe B.dz YQJ"=>9/(,y4˘Բe8eLyJG6uO $q-)>[E'&sn:ԻFm̻^Au%dL5%J.{/8l -LQM).u+An\;=.O[c<|~h!)fE%8ݷ#JeZydO -sFH<+a1iJTh?9u54֎M#%_O]tԕF\P1?aj>~ul3VQW.A Xi6tnNW:V3]ތ/g> [}op~5p[Ji#qmF]Rp†8#Fˏ"ACvHASϒޱ"%XI23*~!X\ʸCo|l:rGΣgQű4 - -Wv8̚`wN\hAqƳ -BywSTXǙC~2JsΞs%I -Vt8?7>,(u0A$*ANdmrV}Ļ;)A'Q\Β-UXz3BPmnRQ' t" -F8=sد*5y~B%8UԜ3DBӜ,gGg: : NmlsiW.uW6̾S8,sE3;Y;S[V*ւ/PɾRjKzWt=51:I5$H},]1@\6M-?^vKMj2 9hL̊i;Rc]_.ug[>Vq7 5( d]R=}5jlQ\6\9jT)M1mIXB%?,MjVw"+4'g̛Xz>'>x#Ҟ>=G مkDupl⠓T 0Ue725s#ZjrN T*t QFx55eu_E׈[B-0˯FKURQu!7gjhxR_ i"|VhFs,H}xd\>X-嚸wūvyQylxDj:k.$LUYۭex>If% WzU~g"xaX95駅"!aĭX c&ѿ;vI,·HS@f3ƌ5_ HAS+4=(Ev+"v+)[﫤H -0ԷCW Б_|^R oq qyFTKThin^-A-چo#'#R1=-ll̠j9pXCs6!s.I,iac)XsEg:)  UEb( )j*\ ay _NJgMOunc4**oS d3Q۔WYɫmi$,2 pKD)H{ GE]rW"Wþjsq%Au@ԂNL0%:ɮLNWSb vKBS_h<9ɳx 8/ LypF ۲Lhs\FI~JJ\$~ܡ x BGpY&5 -ԏQ5Xe8_OC[6llޭr{*$A,qǵ4tS_UPxv$ts -Q~ 'HF6yWָ{k0'~aŁvŀ<4G4w˯ξuְ[ޕ;ëxw1[ztճbd tLܥBuUx/]GJn -%`kׂqny8]g|Oey\GOV'7\qFKC9zXl[#@i̥.Q=#B`#9'Xh:@7EG~ByeQX֚ts##Y$pQBU|/ג -3h'Yq jwuzf-$:MC[S;U,g Ik pP0ґXSjO^(p"& z0{][LINKfڎ+`Tؗk&_v+~5:̾,}`b y]$ÍG&< ~tYϋ:s:3:Wζξ,ξ~<nAU3hˌgfZLvVGW4UT}g-A F#mJA";l%ݻ5WNs/Usk"k?T>};rY&-XaӗUSuy^?AտD2R#<L*` S^}I#ߝ3~ޤ\r9"cwY;iToĒGW 7+Zryu\rXRe{1mϧu6E,yrж9*"&JRYHI4Vސ<^)- rY9P Qn_'\OC wx[ lI2_y_&"pnӷO+a|g#Jb2iO -]^زԟ88e؜&@yMueL Z[t~\Q")GkHanJ0:s ?eyώHB*,j՘i*+*itl>V*D ~Bh{KvXKǵGBjSxO.^n$0//Vצ#tʫPĚMH K(1pSX<<Juwi>hӜ5hRΚtA\g. l6E 7fݚsq5?|[b<2|jaRòAQ8 =r ,ro9 -?,H#ȕrmNo D]yj疮yvDe?!u9Nj~>I–/ϫj34t_}X7igRĩegI#>U{V -l.l;5yD p*jt>kK<֞5gZ<{3Eɭ)>K;ʗet`h^['ΊIR4oׅKa"r2_nW#M"\[Su>=[3]\+baLEjw.Ю%E,Z{0H4jE;J\‡XF8cZ92DCV)`~= -̪0b;g)Wt~ՠD~YYY -OzďrG+Zb~4RoqTIZqV]VM1髾U3CRY8uF N>]D_ kf>[}M rj1L'\ʫ!LH9ܲֆ\F5D㛎jsiґ9.IkM4"z3hwHCV.4 RfGU$2LIQ2o Zr5oavApN'<;Lnka_:3.Vs:9n#,׉f%8lXx7geUƍʄ{c?V>B-wwAU:DAUpU+O-i1:Z 0UX{ ӈ~xy '376~>}ӫ! -9/׭vavu=]LkF$*_N!}Q=k59mpȗ$cD/&U:֋9{r͈eQ$J.ax_J2R;DɃ90BqmɪIL3Gp.TkEI,>ph!JE<-U6?ӯF¸ylEjՍG;GgWWLg_O"MF"lpċmcc}xp"Kf) .FӆWbv5hU4^]uQG9VMiKQ9yD|V*_ jW27'a,9:*rȉb:eAq錧Pëv'vvؓv6MmY+%_oX<_|I+ o_:V_.O\i؀FѺt|F[I\%rGS]J Y[Bkt]Lh\JT֦u<&ξ|ac:9YΪuV3UKs&set SX\tLYУ5\Ir w|3+Az`2SId.[Vw ?W/;(_C,/Y$00 Zܭeyo֌՘_Ief>" !,gIOM28vj6HRC0ԝ <.F:æLO0Wi%e]QQ/4HF$/iz2hQ(Ӗ+rYYB(Za:bѫ i -$튽f*bwO% -ct1b-)2^{G x| 5"$ l9#7'|Fr :OT64hA1Ζt3 ͝^syvyr&yrgG]ytYgC(u?e&]h$-9<*gYS:ʙĚ5ك+9g:  -^Z{sK_iЏ^%әΚt3![ 9=u|@'69dXm-F]r6IcnI.m1L.2 !Róכk-25~nBL Ď -NͺprP66 >`+GIZ2\<7!a]i/ԕJ50[Dq3,C 6WۛB$j觝U虇.[b:g*Q$@"L!(zȋE5jF&{u%r)8i"T S4Q7mÍm42@3s`U(y\->*=qqY=qdq R﵅+Dvkl ÈM75k8K7YRP -Pe)_scJiXw֭ygn[[Bj͜5@4Z&yY8X -6bu!2gh֌1?m #{pYUg:rIW&mX&}*UǸǂljDw}va`%׆ |XD$ u؄+4dcOf2϶H:xc^#{3Ѭ܇:v72 cC:kU"F\ZhXDi,Vx|_BMɣA{uѷ)W]s/ы5Y&Xtׯ]39׾ҟnu6{9^!q ^9ΚtsCkI9hI5ԉ"FX?U"$h|,$ Wcm3Lq49c4T8AiAØ{b(;,v{ӻ% sw:úPfk9v14[r"'VX;"u==|ӷI q|F﷓)++衿9$Tα?~u*Xnkn5Cm,: >@Y.O[>x3ip? zΑemzh&#O߃}+Oj<-[yt9WΊ0ؐ\&/f!d{yHI*զ$/CAȡyyKN))S_/_vC?jNN*ٰq;z ƼD!hPݺYӡhl >ib}ŻMNKX'`P#U_ -[O1K4bEɠO:vԊ8}zwPX|?Me ocf<$s2Wd2qRuJFOi -s5ͧ6p.i.xH`gB56?F5[)4߁I͇6s1w]! pDĈ #ݜ@ S\"S؉#}80YO,VR(lȡc:I:ҫ8=lPeK E} UYX\'tA&HZGz㮍tF˱ # 'AeOdJ1p蒡GT{EW,\<1P~w>sۆHeۨew2zog&3~kC9ԳELn<:`~<\̧2!#%-S֓ū#gg Vw[R5Szm|NmɃ(m0?\ێbNo*wOjO/BVlR}''QO!s?H&Iɗ,迣/KJ>4ȚvS3&rTRx/ZG}$~ΈSeu)5Ʊ![0Zn^ΡxTD~uj0[H -Z6 *@җA@#΢ ;(Yֻq q\q\Վee0rݸHyf/|` FOqfX˧.<\.JmM.xy!&ySg甯 -i] aQ3PNg5{-8Zޭ$@ -ڔbi)MfZ9,|dEꛔuNz%#i/q5iX[@RIυwq37և8%>akl4MX xOQ 9i+}@ L?ȊYZ TE*`ژ8@W&'@m\(V,LVgQ_ $Y9DL2hkBrJn1pPOA%H#`|''YITbw؉{$r'In?4Y.s8gȭ{*Ü3kOriZh+Se^Dz"Cj7,}1oִ/TC5j4AR8« Q/0LYkB6>rP<Βtv3:: }ly!Z88Lq/+~q4_5̓ -nbȍ\uŎ&m9rI"Tmt=;}wz ߹h~T*7E5}5d`z:ik~X g{A,!I9F!RwJÇ FIOMb(WW=&[Bq%?+ݽXgx<ĥ^1=?7_9rfX~|=I n2Yv#I$6 76ol٩n%YyljgfM L\T9n*\#]d|)éðJ/:I --Ѩv^fZnWתntղzԹMc6>Dί]ltBz:E) $sa]2R73LדNDВ܊O&$Ҭrc#Uv$6#tn]Yaȷo49cuĨYyd"$ڙ|3@Gâ1#7V-[_#(o%C,/& %%]Eږ.uAádWlsQ;wTPjI Rans*k4s\ssf6|fNm9sL&|o}Cjn Ξ L#5J*,Ė+r^l]#c?f%[_g!F9ZTbL'뵸lP= 29e,O_2ɞlt4_yQDj\.:qY 7 ҊH Oe'ʳʎyRq~|2 -Aq7= |2O C}dUZ'kVQ o 22FJ֭-U -1lJn(S鯻F!X -!i;v伐eKmoŪSD˔Ux,An\1uq -*[WTxq* he4cQ¼VJm_,q.j싇$UI t|[ȶyx9Űvon1Y}݈н:_a?b1ŵ'b._ -ONT2ixPf%x96jX_^u50ax3VY㛎o9 eGRC_u3 f$\?yڜ1)Na$5c}o{pN A(ux)xdp蜮/j4%}桫^%V')94bhed\S9pr*4 ,q*s!wcXԿ]G4R.UOLX F Lۛ^'y\h9˵Y?8o; -< ijİhqĆ<|IeqߖkE2zO -q.^-[5 - g")ʏ!i̯n*}{Rн;s|*bAuɗ|!>:zN6,~99w{9K.tgM}4YA=,ɣxnirOv}Mp}:qUÇÒU:}26c˓9rf;o)sӝIyMS Ĥ$ᇋ |Ӌ/k&MQsvn5>t=M59G{^CiC"F{W'} i- !]ɳr]ImH5\ݎؚ,U,s5(dg:=sfO姤ʲݠWZugU* cK͆&>ޣƺw'۷:8lpM>nc4XΎtV3˧.<|˦iGs}5Z&')@z<1:~y#julg][$[(,G\fUf stb0{u2?gL-F];<+dbz氟j ,_v[,d{J!Qn,88$6 2^.L"?Lpƭق"}*OƟQ܄"..C\^І&r+/ dB,\N,n*yW Flj浿o[ ztcdɚ3*9\Mlnw NT [n6ݱG\^m+'Gfv;z;(u^Yȁ_59: pKoIerh։/rg_K'N1iS*%J䍣]YPUVMm+Y̕c2ՅDkh$'0m|'ȓmPz!}+n-sc rU1d~nڤ]w}VgTvmr~ !7ǚU;͖9_Qf6#XםFc[&s$M暫 FIzӖ1H qԯ窏:d_1} d;vNZe6rNJ2)@wf3+u*2si$e}c N\5_i١kSަh/^yd`|22* u5쬤)NL:[)΂l&/l3\OS:zyʢ=Ӈf;?܋rt7~DFɝ5N#L)\gB ]?UU@+ͮ}%k>*YW:ei%÷OuΚts8f -ʏN+hcf{g]صɫq :e[V`ߝ}2JԖM>XWUr^3uz~YTjRDfNk9pdeL#킥4/:0"wc ?]<_R1xuڨ{SNe_{~8oV<,E@jvʸ#Q#yΤu<m; zpp'3IPӎvK?DoQ:*xmܼ sW]:|7lԿ2potm#6=FU':̈6qm&̒񬋌ȃsPbUnIģ Br9#ǎE*[WAhf8Dvso+;=8lXBcvCm[䛸9$ ʠjsq7vw*`߆RRU[ڰZW͖h!ܱU@"NdUlwc.'#{ᬋG"n_,#u'xfZY9M8|A#`:5?H,hHqz6hI,h^*?Y 3e:muRCSoё]9fͯl|پCd\s{SEf s3|y,Or?n}C7fцrTE04$ C]>>CK1Άɝz#mdb$ܞՖqyU\RN_`#l)3F b/3Kg rdAbE?:8|91`H/nC =5y]/ΪWo}o s\͞D{ۑjՉf>ޟ4 )Yk(wf{ޓdF4icM]U$ks-ݜثnNاicd+U}xm~8Ȓ?ebHSbdR7aJymLژxm\7q|2OVuDeQ(P 9(KE9^_P&9O7Nv9؀Fq:C'*(j^+ -ڳWg - _\{fJsH<E6yr|H;'7@Eˆ5;{ k_̗-δdsoL#QηJ*>'ֲ@#O })g20Ee!lLv5`ͳKb9r١񱿖ju,{5-6RR S[6IOܰUX_Pecs㱳cf͍xYlE^#ٛsy7:HX6vy_9g:YwFm[o:KOֲtKxٱ+H` -|q9]^&VDS'isT daHqRL1›S_͑?RgiJydڔs^nܭ VeRhIJ7>ly\YyU{xL:]llOA}cߦ=LQٻ Pu,Ϊ uαOT}tv;Q!%s:Z_[LkTd:ALt+qayr&3A3eގXLy#!&mNF`#.!oZJ؊4L+bA LY===MT{ u|mq S=2 1MÖB̩P_xm> kE7啳jtU(T];K2K+uVhEH$qi꼮EX*SL,;5į>)@6,m8 Ө}'M\fIM'Enͧ`3n`q/[o+{f7xFZ;gba>:Om\L)7D0.^u HWC!XE 'aR^(!r3"g7򣻵PC!cRɲw7C5buf 6m9;uQu;t~'ӚvY]PY:+t˶E~Nc휘󔙱Gu1ۮ5cDvLOeyK ٱcf=)i+>_y|)H$I4U#UM!>rZ(@V;ӛNhFDBPuEY:RB3ꑕHI_ۮl*(U#܇N_.yc8LyGMbf=xe؏ -;o#Gn5@Dʹz.1[>,ҜPgKt󦭂3r=>|wu+ܐNH$`&,W8jK>hy˦˗lE&Н$ʻ'$C!vaR$i捼%wr i9Sr7? )}O2RhX5kutY[r5x]*dQNI?v*l4y ĻhK+iF!oBu_O# Gc9 0#J̍8*̮AW3\ZkUɰtD^6< r/#JS^RnJ4AJrhZUytwGuɚENa&9 - bB"־!]I9Z$!Kգm5cQr7  4*ȳr>cTNuUun\gή΢C,Ͽѵ4I`oVfͿ:r8NXJ*q 14S.~g%ux -L$L.(Kçy]'38/+g\XnpkӶMjq݇JKv%ΊLpXǣ:9s"X݄E&/~EG'3F ʽ☃7_HvKYeV$ NnMlU PqD#Z5/AgIWc<49͇6*|]o17zsKeY=$9GvSю" )2omw&n\ܹzVd3:93]sP GolpoBG3~Xp}^c.yiβ7lno S|( =4β bε?v }kͽ9Yȼs-Kw!d>"+b}+|^wt#$U]sW\:%I| -Fn -6NS"1#8ׄ Fs,^$i|)ܹ>@]*:L=F%?0TgW_ ؒFO1P|2>7cچ3UET\LЈnxHФQUybEģPo͜W{I)|"#%Ik(CH4ue?n^KHk:l*Xhj*ȱΉ%i"TFo܀\i$.̳$xps8I?ozρ߱I{F<3q9ŵĚ^P|F =L;Ў0^2̗zxxb#֝jo0V+YqU κ.p2ð|Jɷ~I~d`&IB}Hb$_P][4#喊3CUΆ?҂Ns]gW{ ԏZټ"ư̓M;zmnunEAˤ3#۬tŇ/3Ny͞a6u]c:οۄy?8GoR{f?WiXg;boSqߪV#}H%"(ǧ!|0v?5HƯvJmO΃>\p}u<$@%PPGg]%XRދK_L΢ S_"6M -b'X9a<.U|y:D2pw&i%N.ٲl);4SSb̓-T՗GW^$\˳2 ]&Mcʥ%=PSHB1hw_QCb)+iW÷l37LKdV|]&ә_rk&~)9 ƕ<ҞrkXNG16sR2H+epy CAX^r췛,.W]mAhREպ̗"h85}v]W%5dG]:[6oq;*I/_7B%):9R_]_:.8-V$p_-Z¤gӱ;BV3ϕM+#)TN}-v߄$_Ec~a#M֬3D pj~h'Y5XkHk.tPu Xeae*׊qRy x_UQ%/0ֱ0:>eb]J,+*QqTKbHʢ's H-+d=}~!-WHѽ4CA2GiHj"nZ dҴ̍:TVyugoG=}Cxf*Z浳ke&HBaxrehE< xB?Ch -2-4,VDzs{660w"Uή%B:v#$ᯡ#׾E`.ˡ.< k!#?@shŪdtb/F9c[Ÿ،Ft{ KemI,QriLuHI*TD~\X;hskfӛNm9ss!T_eM=b29,r}.TGWh==sCk_Essr5GxFrT#>~NF.77i{xE#}/0ج0K i! -Nllrl=9.쮝Pc'I*G8%$κr7x&'__:3W{2#] _Yo v_%KR0[Pu]-3b۰Qj)|-v]<z iA^&xTeHY5K栍GΈt=dyElG#:5,M+A˵Ol:n9.YTGTv7ߛqMd48۶h݌TΚt3BvY ώq͛5>?=U\gWW:ڸ6ϗ%Tdm4o  adhlWt m8ꮯ%~\,^xYH<2Qbb $549x,'}=TӻY?0ad: ~m)oid_"$MFmm/b8F7SS.sbKٲr-?|: yÝ 9ÝVΒ%h:YʃjMtr;Cx%{f3 "]}vPTڧ*JVFGL"6 G$Bdͮ0O7*&|'I]Y8D䟾"X]ܘW\Zd:iY:pxQѵ]6t6#H= -yX4M4zRFJpu^b>o./<4tuDX/|5Ť$9$ՓUer9Xæ;*c@fٛNM,p*oLdw2Ob8!U$:N$pX՞x 쨤{1.1nW5LOQGj7-[QV+%DD56nWIgg_Or͉t[.$_5VMO5&!H 8BcFmPޝ$v>hZ~zJTCPPFqF 3*dPE"? 6ٴ[FBΣ#qP +Yz9ci2(p4+R3g@Uɹ|ENy}|:DuLilU΂%ZeZX+iHβjbM GU\$jn[Y[k=qH;/x2,j0.q4455s_CNm9kfÛ6sOFWPxrw~ !ĀE>ń4NUk6[~T.l&Ό܎ =na؅戠NieȈZV[CZhV:Eh)=϶sWI?ݧI[65A%v?87oa$ctsp$BX&Sp°Gqz#)]6/ -@js[<@ع? Y<3S qě#2u:n*CJ&KA6bU*U}=EW|4@w//)5IvݠN!<#o3nv#k\@llEp |\&>76o9P<>9ΆJ/8dEdKvq څ]t>PԬYW"pcMaj3~p \6snm|Zc M3֓z~2Y29VU޾3XY ~n,Cx'^Pp~b! OǃW9;6`W ut41_H -ٯdÝQ>LϴOneͷtkM,i1yx΂<"΂,~M,`#h)A_O99"]@DѮ t[221O/i,=f}/Ψ3Plk̍+D<3aFkpDqmnNe`~ C貧+?\=7xm -[B Wj3{Kkcn9N!_DFU +iskᖯA/F̐FbqR(ΪKrӐJB|[`5i^h_6>ߝhsC/;ܘE!, f=VKh8[#}X8pT,_*Mlfٱa hmX+V-/"m3AGhskfrُDV3XToAMrq~gX^g|yA{_" -#}wk9@5IY5ݺġ4$G6TsIPuB"t L)N"XW`õT;6@Nd͡ԫ-Ȣ%!^&ڧ0q|1u9͐چvھciZ=:r1f<*8xD县Ex%vī;4S$Bճj|P=ŷr5_xˁXdQsԘ=# rO&<dt8lB3:3R>^s.~7_wG qq9~0aQDsXE);_itFI r-b]RmN))@2*]WʠQ1+n8y⹯ +/QC^vr"S9)$xKjh ']lbV8k4Zh=ɹ\6hgȤYP:orRWIN:gb5MKq*雓hlI~s VO58;fgdF$p6(YnlrU"{tgtOoϘRx,94r+f}̯rˬCn; VXF2MĮ|4\UJqlyx=U`莹nՌbI)wKVtG/M67&e`6Ya5_8ۯPBU"6&O$]k< -?9É/sFyu~:?j:x{<jHJIq[@*R(XUuF2!t d6cߺDz]FcCçPWѕ58bA)lU Qn:?|Om,Wc sml8Vf!ݝޛ"7ԐƟKƒ (P/-Z.u~!6e}ZphR!@qFbΆs`S n<5ՖJؔMG$53i_<ξ)]>]rZHdPӓP3qvF"WF4 4Y{I.c eȠ -kf*IXM2\<-EjER$&Yc^%.EXB۸zi -=$p/2(@ŲSx؜HE8kA68hLTţK îJVo3Rtu7@ҭDL9uՁ40_Fe%&ı-9]FϺhpDIcw'Jmw UFXjea՛6yҝaN8^}$/̩M\3h<{ ]>q|j&gHл%3rQ݇8Ly@siͭOSʍ@ @D` Z,ډu;r -sE.t'Ύ kO[r\81湮n9OVhƑjA֣ )&T mow،c&˝jM|y}Gs3kj}WZ -ehs2(!U*u*|C~Zʳ -\YWS$wg8j| p 4HWO[90fsHd",vXªuq'Cfb^|.sȣtԿWL8\88mQh(3K^ML -g\ :w1xAw᫤dl>YW.`2T&UKEqq~0`N>g$YD-]q %B3ڜ;%+Xiw؋n㩻[.}f.LPx6 F1# -*$*mЌ)C5 pQ呭ir"n@)د[_Z܍2/60mO&kqBY؂#l -@=hD"09T*ȶ>s^->[4r %&N1`3Wy}WD5)#[Sgke}3G;h~`\'ci嫉:rigu4b&f*f/U&Ee/ ekھ'NZտ0Du,`bXuQ_O<W;{ 2iȘj(VΖhm\XK5Xlu2.Zbf<|X`fA;nMDUc]qkqH_+uxtR7lSgw~,uPo%^#kIjP\dޫ/ݖR,$7/Dqc,Zָ4^&mgpWD^'Q 92g.@RQ{j.f͝ -FZS~#͵O &='ZY[:ؓG'`!eZF0Bޮ:¨&Qڄ'j4abMyuɣN %d_ʃe݄Q@?vNg* VZF&%UQ}NW oPw99TVV:Zid cRfxrYH*'&ִt@xsk:ZFZ7j*vhM<]3nAWb*Zcԅ*;JƿOܱ1ß@XjiyӮ?X!4d f?mF4YI]cī{3to -+OY jbq -ҰA$&krQ߂lx]2vDHB;e ŢJ浲yQW!3FS s˪$))e2^S=;*Z.鏅Ƙr*\f7xP;s$k؆΃>Nǟsg:s澟.ɯȫ=S%L$qhk#$(i*:T&FUsJdtEOɷWm|V-r]tfo8,OeWR'HxԐj"<X:ÿ ]uŖ;Gw&0pp!Ej2pFӆgׇH)1Ď4sk6ym\6 -53ZQٮk'.rjo{xVǍ\h$ß4#}hGDZOsQᯉ6zȯ5\ }>DiCP47h5pʣSζuԳjşiQi - r)ZEԻ_sS]9uFndRf,ʀaJe06۩)|-YP(`hreYQM?JFbq44Ų]+$I&4t\hXb:LSi!<ӝ!Ttt"GR2>O07ЫXe XNÆ^R/M[:jVW}mOeFjqsT궞raeN7rZm${~A}.w|5ˀi%(BMHF'v,Bq٦?\b]N}NoYЁ -M r+١p^_bqasswF$K|49(#:Dy͹Oh~)k%7 @&s j6 -yqk\d9Tͥ7ɅW4 $F]<#U1dS_! w>[TwI٬=βu1X0z'YldY̏92, K3t<׶7._ x$7:Á>"^<9|[I72 y|W9'hAb "]E%j߇R fPCW-wIPgq?1[I_`|-ٶڍ:ÑRm'Yދiάg:h>X5q -xPskgU9TκZ~n]vorQmbgid۰GǦw2 O_A#ٺylMuyYʏ~ Y,Y˚v$h$뛆x<:5w˹#nFv1ـbfaz,C(si͍Nj49EÁѾ Y4D9?JA :gO -I+n? .NZypx l#z1D\LLLYɇ9iiqM.nF3Mp?ͳKV(8@6H:Bt1Cܝ/}a2:?O]nB_e.مuF V4J_oi<"BPg2/v}dqSbkqmlwYnY4s,M :Q9LM(0D!ݳ$HS{fw#%t o5 xv,[=WIlXb9RYz,40ij J[u6ksnib3}\[SYh8t09G9K%^!)=pYyL}"UWs?HWhrzrI\D!SIg2*NHd] I]"weN1;j vZ(+:eSsaƚ0Ol'v5(ACU5E$KS# l?* YK1+ Bwoi'bOv_O#71 -ք5k_J:xfKEϷIt#} 9}3CGij}Y/ݣBG,P)IΙˣhFr"}0Ns1) vtrxHWE`£HGYgUTgYOg /WfyP5n#Oa>koo53E\Yaslʭ$\OMr(8+%eyy3xOzs?&/lOk |Gpb^Dį[ߣ=oGFx_H{52ݧŧXrsW}*"اb,WoWTACgk0g˭n®@86?H/ZY!f^>\WoZem\^b=eFFkݽ֗&s2 /4MrConWs9^-*K(g<2USql bϛʖŮozAk6cYdjeC'Avk Nsf3v0,&fN!wdΚ?[XnēI#q~?^0]'ڽFI93Jʼg+i/`5dŻT()َ Uw.ZjA4Шv3aq5a~IG x,[0κlVuoK6Fw8OK -h&Y3Ap8"0]s>iOs Suӱe>tӚ kxE<]Odw,vONK:>[ u5f''MeJj7+V6[k,cEzEΓ:UΛ בpYMtsVG -[I,2Nwʈ4_ȓ y> `|}5hP+,1JHZL03n|2!RN9KBŗSK B5k'>nYLlQp -'b5LDc_IĜ6q+BMxIri ѡфkHKgǞY|_zVԦhШ4RNv͘P2x&6D5qS؉Ybp%'Pᔏ)F{iC$S'\Ĝy|v 4OD}{k|٧r|^eᆹgIW#(t,G !G>lykզZ^#O߈,4v>ej#K@/B;w9Vi 6nEsݱ5'MsVn>LYϏ7=)el*C\/è'fHMt=#]K -BW1#ݱaJ߰lsr=ɧ˂Z[-M H xM9Ni7\Icp3LBpy g} djzk&tݤ_y|9&w:ݥz}rޮjzzMklqdV5?C ijs{(ԼJ!'suܟϘ]S#\1LOʵ}FUЅyUAIN]dF/OV4j`2U"AR~~ E'8|/3ql$X{d-sFd$+ uRZv(7k;O_4F[ߚq'\Mc6q R\V \o4Q>6KO - E˽Ldh |,ٙXGOf;ܟyHc_ ^o5St|.FHؤCwӈɬ|ۯW8#;.馃~1;;gOtۑfrSM3=)#I6ATlȿ1ע; uF>@xl^tH#]*@u\sAmgx/F׺@4܃Nc^T-{jpn`pҦs.C$/kal&dӗ\&%۠:~}ck篃ıE&H6kY#~L%ۙ"_C-vK##%NB#;jsuve^.^Rь? 4Y-qWJQzYK~m+uu3_]o0sxƏP7$#b S;3B /ՍHQ- hw5\ g|5;pn =>vk3S6jp5ܫv_4sO:7Gءolja&Mbxk1vsM9Ni|qƨdkfH;g#8tleΆLdBB4ʒM 3ƅܕJ#aiF<|% ͹ydef3Fޏ}I.ؔ# ,<3 kjZȲ};40 ܴݍfweVgY[!_Z뛉SQxBĚJ.Vb"tV^"x}#ªo,IZn9"dZlb6.$Ca^E|&T@|ݻ5آZ|YXE>J.:$4%ov(XoCn5҄-EkӿU<$d+´D;M$ "07 ЍV\j+8a]¹.Gv+22H5N!8tq#VbbbۤqqHZтxZI -xmt] ֹ,l&]v)ihc8GGs-9R钱HdaI*,I:5 eS[}v`4|C=`pׇI= vrIp\sbo{ \EpȃqvxGP٭.` -8)$o+GrkC\q/MչJyt$]C"]]$[#AŊ/&8N1B(%4L9qusBvَyNi$yKVP+sK"ҭ^#|XR=v`ʩ*Fɳ.;.Nì8[@'CҥcG2J!aKdn㇤+ӝs3ijesŶܲg:"iï+[,9:-9|O7ɖè@EFIR~!6LӊgL30ΎY)ҹՍ$xÀ5$2J(>q%X'nw -V5:7?l/r}ϽTNk$]5DiY6FX*F$t؝D8uu'efQvε vPBbYkE1 #Y;C qcDXI#$W,2HcilSh3vz@;sAAaeLK*x[{)(v;aƱXea#* %~Loc4ηIdd)oDezZv ̈́ݻ- V r(DwZY ctM*/G^̶F>Cm-4uZ\kӱo~eWU?.dXtXcL!ꗇ daNq%G$CXn~W8>}q%VBBi.+Z:$QW+#᷾># Q]M,nuo'@s)cCãɼH'!!bѷ!/*2dފqY9nv_BVg"z3 djw"7MK@pq`3xC3<ƶylx3.^G8cU9k :Uu QmIk1^k.;q)c1Uu6d3UcBIҟ=^ "6_'Lo˺/&Bq쵢E]blB["|lU+Klוu&)dMZ`4dzpZ&`hbv$mڳæs=fafVʠ{f(lȃW:<Φ# t{2%墦HXF x,SȠXwr8#vhsCͭsl%t9d[ ^kfͭ66llٰ͍,:损6hg͟6hsL49hsCXQg2ϱ 2J.3ؚ,`$5tP"2sы"ws*8dƳTw I0{뙖Ft9ܢ׺ Ԏ8 Ul׈jǒe]%՟ӷ:[klc[V+> *ݺADl02q]䩓O}+H%(. -q~T -T[pGsg6m|V/)uϗ+z#ͭ_4lz`pQPi+%UP1(pRr{hȚX'](Qt!Fx#BU"E:i~m|VΪβsay9C<<uV36s|Λ9g:lMs.stΗ96\˜s6setΗ:6s<9'jβuu 70q;c5-ϛ9af>${e#B$qϛ:󩱝UYg:9XΦu63]gUc ':Xζuvsvξu󬵆ݣ塝Mg[k:ODO6st${s=>l͝MU 7s̮3\3-gXe/:8bb{y$S1umgYg 9af>{: 5]H|ض쯰WpqKco6y-R#K3%i6 QW[r΂R+\_XsxI_m'VL5e>i61Nmb=-m9|8fgSW :0ߋ<oǘKa6yζusD,ϛ9g:lKs.setΗ9:\M6s|ϟ:Yζuֳu_ky839yyYYCIb0gAa_:ξu󮭂S]LgWS:U5cί3s`l9̇92,ÜȰ2o]3L6skfͧ6ٵkfͭӛ[6hp~l9͇9gUW:Tξyx2c% !0@P1A"Q`qaI%I$QDp#y$K53S53S53Ql?3Qk5_{"Ю.G\v} 4]DbŸlm=-)_GF! @],_]D>sG"FU0`L"}Cb"ˢ?b0N.?HP`]|#=GC-B#. $ pYuQg8oQ#Bpw+m\gF2ӳd/\l٩|G['3j!AE#O}ucJfoa{!2# kȵvoiwNs(}ģªW"|쭇WwFDI4J.o|6!Y/TwW:;R4M&C43C40GT~T*jCnŨ-GSb$wK%FDdXo/u1܉'ȖjfjfjfjK%##4ܽ4Dx$+17U͝HZFQFjD|t]QU#jG~Fk4ǰID~qܡjE_Ol]&L2dɒ^tU}vd1UP㓞C;,\FiXU骨Q.h{]*z?V5"Q$$վ$lY!I:PUcUcَڌ|9p'ӾQ4G+?|\2Q$J%ɨl>*:ȝu}6wQFjFjCj8H̎$D ~j,{KvN-I!D"iGpD0&>HtDetkuXIG] kWS5R0(yoaQ -#fG&Id&i9ǁ+$21Ic6oc]ɚd͙+j/Bٞ͐@tLbTJHdlȘ5b$j;,ɢcgzigj5#Qk5?);&ēO͓`}VM!jvG!]$U}ו!ګ$؉?[80>R!R"7D4E{.ʍڑ,i!4E%A~C*jR>DSBDlc2I6[EAF ,Ji -89JFl#$ȏp7ۻY$bY[[btb0ctoZ5LLLL7'?+Id %mtVX%bI}: [R:1Ovո1I$K%cKfn[^Cْi* B06RY-I.3d(V6"b2P.q]I G if6@ŹfbK%M2&3Ю\%MT+:p` F F9^UbkJhӁ/rxaxȬ'W1R(gwiFi4A=ض'F,ؑ sHF&8Iё:*Q>]r+7č7F,p#]LY5ɑɎ)zh%EI+/DTBz*WkG6@]"T& E93̐A 5Y":4F(Br9x:$ٍ1_$.ѹyB5Lkfkfj|xF3GFLY,mLgʥ%x(bUrK;!:5uKEpbs,:ǺiDIĨaܙ-UI'a]+0`(GOM#Q׭'|d D:!T;ELnG[zDQ&QdbG8뢓#O$ő_fƈUlW?Q(I$guX9^sC:Eb0F!-}GD3$~I IbQ$d6BL؁p&Gf݊I}z%J%5, G .k5gܪQ -:xvLAnFV\uTvM%gQHёQADJ^Ȅɤdyѻfȳ2=>+6r&D!k&E -ҹ*} L}(hOG;GlY$] C,5d1&C!Y ,,d3C43CM&i4 I,CpC!EbغZI,y\.")PQąD -V!B*!dUޫP$BHh1D:uT&~膅DRXF"F4bt Q<`҈BH$DRҪDBD"҈D"ҍ(҈D"ҍ(J!H! ʼnA^(Ѕ  0@P!1A`v,Ez%b3B(qv~;OJŘ8FӑwCyX(((qH߶E9#GC 8 p4x7aN_<zGz Z("OC7q1G< Z?s%܌~ tq0:=ZCzWG=+%ft+|Rp dhSp-ː5xgXޅvx3?ù -c1|#jG(iQ(cح#7Ӄqq/4n0h'# F(O83p+ۣ>:xf|%C#fh>a9T,R|k; L=R|N8)uE@ⵊ8S!?5mQKZph:Gh9нcb e?cCC_3hXHt?A}#(bs#2cb`ЇιG``ʢQ5b}`>Qz䝢TVjv,t,?>"4!_'|x 8!=!)k{gQн5t=wBK3DY n8`wtF-[0cn㎏8IRtGzJ.A*v}0POA#1AҀEʷӱn:'w=pƶjH''="'@Rb48f08`4 -(y$ x -pb 4|elF!q^J-f֑0-CNE;6]uCcDi<(`(;`7zJK7OyzYv!РPy"=J,qNkCZԩdBB`53bwOPD0Cз烎 (+ѥ dmq9<^/bb0гB -c@1~"lX~4qN=G!01AQaq @"PR2Bbr`#p3CSs ?oc9[y=QfRL8Z;+Ge9S*Iz/3Mvi5٨j.B -Vv;U̔,@̔ @̔,(ے`4xv_(< @P*.Gܦ挝ޞ#N2SO=AQ ->E(_(&@>@mQE4@&L>db.Fs)5|zH+ϕp 8Cg}SOl@uC`l 7>G`ۿ#O_!5#GU Z -@yoةGC*u8R('VU!ȩq:v){7bFȸ>씈=5N}d$yd^ê)d=6LkT!Hr*Syǖ87b9"Ii:dH=Vq#]У@Dn>_֚ (\9jsF#QnҶRzl^O iCMϾU?Jѕԫ ;iq Ht8›o%fg> mTd4 ;&.`t?:TCX:) +'Ȧ})xF_PLk%BSDo?*F(#MZB(r]̐G̊#d9jU y( I(]L^PǒPҴMoA+QD~F2QPfHPjvڼo) )QCAFjnYY{pP4媯PÉPF0*̓h8jM P!CL FYJ7gTM -&m,1\3p_ 0{~b7WjĚQM)`5t]\pQKAҪV\' -mO'7T"ׂ@BSiAJhF~&&^?25](1w4EǛ\Rfi<+1^JEO]\UJKBu5ABGT/'MP?1Lfj6MμEzj7jV+gejNMkuUȍ 䭄z+ssVU|ժeh5+TM9)U4Sl&ΩM2cꦘzW<VV4٧8454sRy8G0+dekWk[e7d_ȟz=V(^\𸊽ZvJxx+>JJ) =j2VfUggoL`9xziSTOz{Ԏ[ -mP=7,/?SL jiw5C PPwP@*OOO%#}()^^2}ݾ+ChB3ثHդ}J>+g*ʵm[Ru>ʕY;)$DMq\x+3IDVcuV'ﻍ|6>Wቯ5޾]3$D_=ei|g#t6>^rJ^?*%BVe=>A[_Na኶5hCK# 3NKx< 1>p[^;'k7~?)rZ(Vw+4TSzӊo-M%89!*+Cꬅ{5Ƽq<a脃5 zK_m~m[xU9-QW}iL>LOoxotYn* ڡrc;4r >.QF}Shkm?>RFfj:s -duOxQFjWU43O~vUktm*>+;)YҪ;#; znj8op:o4Jb, 6 -۪{9(UCzn]be?2.u'jnݨ QIJp ST ݓ - -av+7cbsZ8T)dqL+ƵԌhͼ& - f;^bZ -uс1šѣuDޮ_A5X6 -ڥfjfS_m6VVCT࿮'TS&8,N+wz( -`@v*jvI+i WA_<1AQԑrFvPP7 -߂)(HF5ԏ:SQ>n=:E|I -aU 2(N4TnVNh{~:6}*X: ,0X\]?U'e(@:@652+BMi0_oP7# 9(oGY 21kUREcUdwԬOA%?2aMNd'4NF#^]NVZ rq´[)4 ƽ4<5Exq8+ -*ثgTW:OǛU+r&+o*ܦ{۰^u>N o-LΉ*j}FsMQMGrA - Fӭr3%gfIBU5S@STڂ?QPwMN#.Fs)jaM|ivʰ*QR;+جqjXw6 Yʳ5YЬDYؠ>SiEN7R4IEumdv&J1Nu] [H8!G#8ׂx1({y+!h&=1PnͽL(7"ꨥ2h j#Lj5p5+\F˧Ŵ9-z5›([ʚҘѵ_lwk~0C -a@rkS.V)MF.㺚N)vX87`iU9l4L++6E -vv&mwQz˜pkv9Jg\ PBOiLM}g'Wk.lSTYSSn*'4s)<[ߋn8ULrSVfp @x -FURQR533^̻NOͥRj=ݒlSo#%d%d$TAB#NX_< -0sSr5bzY\Tp>68SytnLBm5Tݱ0Ϛ0w^ 'e5Wx#F|4sէRhС d -)Pp֊~Ud -i!ԫ;A`pkk`PE,䡇%B=DQcz`GY4D;&ID\(w&۴]#SNŵs8o0;{92 -LФoSlM;+ T QS V:>nmkMuBv)O+ˆMa n2S?B}pSQrQ^`ڰ44PoB9Q{Ǣa5LS<檷:9[\E㇒i!9^k^GiW\~RHP>^bmouzSGZzamO&w!@:HpҬ#U?PV8㴡CMK/:&NFZ7"R;"N~J;dwe9iNZ\~W¤uד0)^|"2*ҵVڅ(nel)Fm㡄S3Gf)S7=WMFCy5q:dh)৆S4븄k+JSjz!ji=U@3*k?ʬO`oUPr+vKCܢof8e]UGk QS3533Sǚ{]Tީ*H,'8XVzy(#tBx9pGz)闲SvS5LQ{G+>cAV,7iisfjEG%zѿ8:-ڭ@Ვ`B;o +$$2R5;>+Dh!; 2ng5Ly^iR+W9NUVU pշ`PM Ҫ2:Rm1 }}L}U5rQ -xK}wɻTߙI/b!%({]XG?E/ Je8k?ڃZ_LezT17Y8XO -> -# 6/EFsA_Mlj/}6OǰdLf^@Eܦ C|i<$aiqVO{ -r*rP+-[chqۂGxYnNtzejuWz{?e3G_=(e")BłVjNZɯ$o15GbeS -YĹ0y4 =Ğ>:{z(8ԨS'PZ -{皴Phڧ.k}(4cBhJӖ=Uh 5z"Vʔi ĚO|*}: -5SL+Rpk Vyj*#0{vU*:@ $Tl0ƉAUiBSpԊc)J+S -KP.fڵ@Y]Eg9Wk%c+ܡ̊*G4˿QJKwQƈkz;fVj$~Bz"%iJ%L:Az}Nf)-nc0CTqGFGSZ96 -?x UZqF@$9=;Rk$lBs6۸|`j x:J»qG^{pR2Z -,@ܔ-P\uU$xe$ -Al:RgSފ{qN -nq~ӷATi.Sl[ZiT1HZvRI -կ4PT5g9jo^ZjAa@ i]sxWYGC@A  n)*t7aS8S?}I -IAT=?ݩiܘ}ϪTN.8b?+;R{ Tee.B. -=C@e^78nrzg$zSLQDxRMY ~ Sv+]0( -7ukzhfjݻ$Q8hEզa7fa[q\;\QS״t?e+R+R!R);'` d2MfKBS)ODrsR~7bj@<E8y -J57ȟ _:kC]+ݪ;5Y;ݽjN)خẉoUo -fOuGkujvLpS=ܚOD.5+LvD)]_uq? n wߎ0B(BVcVSVS*0Y՘d -+7`݂ -rP=B5_qg*OkVdiN4VUke:dtP㾚(rjxPcE74ךo5u=]`>p쓉TBx<'-JRlT=TZ#Ok Tܤq4ym -CrJLǎ]VwSzw/SU5ީT*ҧ\ۿ~mSmFU[6k6\AΓ$wE+*B!]WUcTaFMP@gj5YXUh#E\z&0h U\߂oB٩l dr!>'SpL۪!Tݻi+y> [S -R9tVj/ioT;r*Tn4W6WTwb*#~TRj~0LT51PnЧT*a+sR4x+1TCQ!T_JP2SvS?e)wBs4R7*46/Vd1mv; -0gjlOzV~+C3j2n:۳)ޭf/-]apjryu7]9)}8'UnDhssV{Sm7B}df#5QߔU4kMxš8r,y'hJ;yk=SR5+3R4ꨈE ҟS@B} -y?uFYPnhqCڋ6n󬯐U[#* S PJ=骝OONy&ț"Wê'D U .B( !+C=C >tB}hmTM1n P5@SZ+ʋzFJP~e}SoZc}( CR - =pVPiM-qT:^/GG-U<Tn5E/2'Woe+a.4"A(ͤo;N:cA՚(Qs ~lx ['?;O!-šKAx'9MN YXk+4yf%[T\|\fZFBZTkA -J-p[O*:Ua!׫餦6je-~棻Ux<) -8s@D9`sEv|bGw7Jk'uloLmz(7)O>& -5of=TW)εG8S DcJUIVZs*ҭ*vnjvjP;"K(s" - YWuR;$ H(58=DrѴ5KnSWRo5j?<;'CKFU+opIBP|Ɗ(o'av1J+ DWvJ1ݽ84sDU`Vp";B̨CkvE%p0 ܅jvTr؛xAQT4P=AAD[]jkqz*p?$;)1&5DAD3Q #5ACDsQaFTnLrɏLz:eVk怽|0PE{}ZҬ($mB?@FsA]2:H_(ל8#\5)1ZuVZȦF(O̭`IsU֛[|)D(5^ u[<(@6y?bdBtߪp.}Y\-S=9+/nJ@ ~9VИHuߪg;ic[MnWÇʄ$ t҇T;$pĩ˜W-SO;35;pFee0Si`V -l8S^>5]iQҨ?zgijLPP4p:=E#?gCߒBisI?TnRFq)Ԍ)7iOM;$(ѹq''S,[+l_wu= nrHVv3US$#)(jy&E|Z~Uٚ35ӉU$lxU;3Vfn.fpO'Ik -l^Zj͒ϳeOC31< -; עBePQ8Vr:|*m@) 5Nj1܊|{iyN?OYZ;+u5R/uO-Jq؊8hFE Sg_D3cadd1d p=vL&d=f? -=;\iSj:. yEuq9(.gdXX(}Sz HVx}!AκJjt_J,d -XgQ%^$!6wLl"̨?@ϬZ=keM`ijL7龴0Q-rmҪ +&N#ܶC}oSS5ة@x!FQRQ5BxlkGS{lբ\Bij1 }?ބ7 )Xh`Sfh7SU -qp f9Gr:+4+4( wTw`zX_yګ(pyX{ưcO1٣qLAV1邱~fcZ/.򪟸VZ;hVV*ҭ*ԭJ[;bVmVi.XAo?XcoUSnY:j{Í}aYXV_/!WfeVMTqjwS}ڵA#NvO#ޯ*]RG_{h4ާ%ifJ2VT@O -JI>"Njb0O'Q7ǸmBDq.=UHQSzybrV tD\}F\wQFgs9H7U]?5U%RR OQȠUy(Ue%Y{P&rdvLcj7aGW+AbSN au5uuy^WrN=u#B*R*sVLOq -;jUˆV'$_ -yOrsEwQHj5VnS_nJq@h+3T5dx~º7<|^(7%J -OPm_cyLiJ$+m5;iHOq})ٍW·8~݁[ |+G*+ī)Uvmԃ\6+#ϡVW6ÑV,"puN@gbh -\A@ 5`8:!Dcښܓ"5b5grT=Lpc~<"^vۧAB̔,4?%7h4Uiz+k[U3/7uF EHƷ5<+vVy)sRw)^z{q4߫4rί󦇊5bٮ'Q(PhSi=upVZ[?Si4u6\tQNffii VЍ0T P52'V~݀N0 -\N'W -(%!AOB~kطyЂkƬB{BxQHrO9'ݒ8I&&HǦ8acy:z#FADTAD3* ->FT}ʋQw*.Eܨj3i;YNjEt*=Fgχ\Q,g4cMn+UvҜ캘צmJgfJ&V.Sn?=׸W|v[Z̫y{u׎eZ \<T]_2?PVvdYْ٪.FHhg?g΀o-N..,:cnQ:Y689!٥oJplT:yT-J_KޭȫszV|CB(-[޿=[V⠐=@X5Iһ|#ftHU5UV/J2y-Â$ӎ~n)N액NT59NsShVZZek -PF:PqL7Fb|oe T QSK}ʌSqQw)wpqUJ#hm4w<]Q\v<E<׳Q>]1V9}}}}]ʋQw*.Gܨj3aFsQ*>>2}ѼK^:F=Jƾ葵 -:?SVz"\{i4$9T|:5DM-E_T1)\`/TO4Ӛ>EtVЭ'VdT~~n%>sR'ӢlYj`rgJͥ|@$8|Ѽ*sL9]9j3P*.FsQg5DsQg4f^'P4SVֻXJfvVt{( j}P)BO:i$1G -db< -(0Btj+{7;nf4R7u?u0ZSʴVi=դVZZUZj)QZbRH)#WLWbJ4N$M7d}_=}4jv(8ӷu6/d&J׾ iS$2L2-cvWWMqV?X²4,)xHN'+p׊H_iqŤ*SqN:IN: -qN)8Q:NÊ &;C]Q̃; w(cFy쓎I$ُ凡B=Oo{)"9vYE(S#d97@pޣ/Y*4;e|1{xFyީWCQvFjhw'J% R RvRvRvRvR %'e O =؝DT,dSFeF]X9Y!Vb> god< kd4;~ -w0UƥEu։4^'eRy q -"HR+wyM5UuUY@t x#Vv(᧚H)ù<3uhSU^dEȹ_䋑r.E4\NviNr.N~I,QXeX]ٹXOuo#q5V"791M!$WO9)JiOy(ےhCWj8+q_qVҭnw-2Ѕ)=J쓝^zd!ܶ%'/_Jl?GkW}_WQ$SL~E1(ݒ(ݒcLvH]K6xIw3&EDnGXuW1J<]DvLD{((A>%YAVoU@O9YsQ:IV%ei(PG=lաZb+d*q# cJy?}4tQV&5A5]]S%w%w%w%w%w%s"̊p=5q_jeXZ֑Md -RzŽt]Z:5>U}Xug#2q:DHiOpV7Z{&^ʒ'"IZnf QLkmAW3O|׉$If|ng<ߦFR&NNN$dݒyOr{ܜ^秽9Nzs]AJ*-S^fFN4r!0CpBb{:(B+_););#QpuVwVO_+K5E-6#tL/) 1DG+4Y$ %ǒʢ!QW_zb /*Z--Xx(8..EuFZi=ըQVEZZ -;SNhr9Z\NVqeTm-8ZWX_]6Dǣ#Bp1>TO*SrSǛ͈VF91 裍Ǣ߂d{0L4lVv]~/b q+b#5d*kVK"=kLz软e i{Ke[=UL̕lZޭ/SIJG^^W8x!PS?exW;vFfjVffjfjVBKIIIIIIة{/b]DlTƅHrNiSEGtA]E@}0QjrcGO##:NW;"].F<׍Kf8ToV -[ÊsST@LpOgdvRF}ZƇ -bՔ]$ PW՜fӴs^{0Jt$uک"-ZުH8|Dj5ȠA*Euٿ}v*/f#8y؉}P#RL(3WsEnh4[s3Nfi94fٚ{3DWP=kҪ(TӖlLt4Vs‰+Tp/k{^W\U -j3<‘XbfjSv*nMة7bT݊Sv(j+DzE~jEb9`V2:8if=Si4ÚmBd5mu:k;mNč_7Ŧs:+sպ\RH@ĖdQ&Ή\ΊWS,U{E踦 - ÚT]Р%SPۜӟ{B[b1eNςw!\wאڣ>b7S̫Mjp@O/w ʑ^ؽsO& O'ȈN|[6`V]0VCyUb*k@ -m7PvE|Ub5ÂaZ靅*kzœis䦔' ]KIUmSJgMkdFDW:c]e!>עj7bNkUNn5LUo)T=ʋQLQFGdJk٣|HƝ|I# -+IUQRPzp @>xQYIVq OQ]b -!T}m=P9GvuVUD)KrS3?{ET$dW[h TnDsM 8@Rpr{UUgQ4U1(5WvS50 -nZ8:pʮ -;nh=T,B̔,Dܐ*qձly#*_En t_\SOM5a*%))DZJQt=ێpS7e/bFZNJw)JcukrPw*m/jRwV)#7[!+Ln0tīLyLyC's^ -W^zm^J D(+!$qrWq*ӹBs*Pʊ6zg*Rө*ߣ}Ug4(o+5UTdUT'3)Z -֟#\w![mPFܓI&&j^N= ;" Cx8+=GUg-Lc¦ 8xU^CwR+e0ѰC 9j*FqsVި:^JZNt3k5k54|w`oNn7qN{OU {hLB(Qƃ SvUuݔ5y'WKԙ=lCZZkJCJ( -&eUD⾕ kx1OǢNTL#PRx-M鰜gb"=:i&;Œ^TAԬ*@=ʴ(ȟڥ|cOʹiRd/Q䃆&O DҊ@jwE ԯNWn*:ݯ۹0A0vX:[+[}U}E[=J#w=4m> r[o7j$a!rm+4*qC@COvW3VvE O$[CG-kCܨ{r}}Z)V~YmYUY+7eg -d - -0 -0 -0jA~NL|k['V) -% T]g#mB&)Vw -|MJ#+TǢמT*ӓT[wnS]{[^Z?QRO~muMv(L(Mq1;ѼS:i5]2'Ś۾ u#n(ذ]cM7 e'ШT*+*څ]GnVUkjjZ?IR=)jLj3Qw*Pw)U j(bLTOVµS -fp<r)ZOftiLhT]6 k# ->g*0+z.uAԗߢ -[JrVӒ;SLmht*#G`{!)'cp ڵz5JHvC*j}Nh5[|( rbngu+<_fjvLמe9n8('{=/sVGUl[a[OW 6}ZQw-2cMة{)ȩ1G6G4iӇ0(?5 1f:Ȅ_â+ c+$aYb!GssDz+U)+MT aT. -.&Kh=e SwS -grk=հVҭH^xTR=J$4:X]~n_Ü?33]Z#W1i -ԭ+We9w-.)>SNIQ<$Z4hVz՜+!46{f}ЏtGtAB@6VV<N_* j cu A#mn2Q-ThuռU:Q4S&zewۮ8oy*"JJh_-jM+IUJLNIT>kfԄRǪd̨C&eY̨dP>J;Wnʪܩs4>? Z8r@zMoeQ<(T-VP j4GU*#9DbMWL3հT͢Ӓpp[VP6@&9?)[FѥÚa0 ,u9Oz<PHr( *a<VV0|>nItLzwɂփ٫0Lz'^*9v]~ 90oLz\G],wbV^B*8`9/b熨lSnEZD1hנ*r*{'(lMc^h;#eظhJ͐pP۵4I5ίF>S e}{&J\(ɦQ7J\NhoGQ0ewiEҙTo3*(W4C~U!VR*(Ei!iЕfIVoU}%BZw5 OhVrB*ب֟7 ЍF%%2^׺+Rԫ'ԤN4uܭl#zMS}] +-4Ա=Z<.x}7+?OxGxlHS% R.4Ц8tMz($)S++sQ:֧F, -:tR54+OmSd1PZ2POTnWmBA|ecDu6"oڬBТj-2 agNI˭)ׇIZ^{BЭEkܚU~{FƊ`'s(Z-5(<|64U{hۿ}0N)Wqu m?Cm>SDa_]1k -SآwP"aԶo"U4@)yWnQ~5BP2Ǣ}v.N&ӗ#5+>+3R5+3R5+3R533S1HJNanjFYm}OaFsO8GqV=ygE-;7Z(efjV}JV}AJϨ)I祵r+@>g2S~Nw f j+jUi39)';$Mzxc}B_XV7NY}QShmrN -+P4rPYR{I].=TVWxO`'ldSb8(qU#n0#8})OyutHjm<էVfkS\\\3f5i5i=6a%90FUok(=ji]جPQ`/Jh4$`TW!4)vҪ/l7G=*xD\̅foҬG#?eES񺩀]֚L^*Vy[sR4ffjfffh9jkhw)jfNCCz_v7]njzL榗4瞥4T}}}}J!([(d@VhY#xx/(]6c='=^=|h8ENU -sPi{dNz{݁ߦ;j@))8̏U++(QPmHأp mT`4Vf}J(B!4vrVp8qP6QUrMzb{:)Zx#ԩ+Tn Ǩܡ%LOjvg}ZZjY2 -Y;)d쥗^IT'֟7ըB*)?6VU쓟~M2ZJhJW[]xyzNԠ;*JpхURa6V1 -K0jZGU!yQj7N/p~TnVZZ/4ͪ}hԍR0SZXjjiVZaN* (Ez+YM2߷IVI.|)nlyVf+;j9+32P-o  -;𵥽+ -bzMxxeT1Ò+Dnq:cLp<5 K<dNVUiEZT}VVhy#SȺي8R*ʱ]7-Z6&\< ʱz[cB̔ c] q؜w&c'5 -WDUjUꦑޥL+h[k%am*S3ѱ2=f>-W _NHPHT0VZ;1Iߒ(]م((aD~&w ]@F oLQpO9"]衻κV$d[;SNDzy6bxdByUJrUE7OqS0KqRaj-V5)jiTY`I+4NЦ%ةM,,8o cuZu7CTS|N[rT#QtEPAJfSG^jQ9ԇlV#Xua*êu?x;1d>E Y&t,qQ83 N;dt -ۮ⁡̪^U_袹\5M(Nj1bP֨P$oe)謅UDWT.oF U*ܔA)T96U5B}K -vZmR4 -Tg kVR5 -` LTڥF$:!O75H5[iƻR4pL5 N>ez{ڭ5S)w+Y?U%ZSdž%UQWt6NOMWM.#*F){UKa܁U'H3TKHrO9';$ צ5Lz7(ߩc]((Yk+ɶ&biE/t*v}C&BLh ,P +p{!QMٟn_4>ώ;;{^4/g -gjMJtVpͫi -&dnI5VnJtS/#g5FsFAUʅEuEE'Kv)ZO-ZKJS*cR$j4:O# ^PpzW8zaz';9ǁܬdjS)Uu*N򏻠B*6P#G6iO *N{'hx{oȒ.hʔnG:5NčF:6Ò|ޥuy}BީRi[U![r%ˆ+h\)^w#ȥ86N;_2^PwVCXueTWNZ6?*66 Gi%HY$/S\4VИ)u}U/n ڰiFLJGGܨ…dfJ&dܓBh@ >#^^(wV':ӊ}FkthFytnoҦ+|>;բ<էfJԭ')NGRvsնElztrR;$qr4w /PUI:*r*+*`୭գhEZ:xkxY\x-@uS356JSr[4:דiU5w);}L{JSup 6Ax&wN3QLS.9],yn/Wy\vhu V:+Sz)]e.jXQT -QY{)zlV4Kjf$t00*VdfZ^rս,V+K3VQ8/x7'QOkܛq0MqN%%x9#QthioMs:+8/M;]no(FB1߁xS5D6S0IAf9@)b0!1?F %v?vP[yYZ@a*dIH*B*BvjGfvjGfvjCDStVOԭMh?MX}U7*(/^`j j;#F#^zG´ -&b}6*U?e:.>!Z -vM+Wwo<:>1Vۃ -pE-GBaB|qӽ[0R!}7K;VT݊w?P)T+D68qѸ(H<f³zNN&yꬎcCj-R,mA/( -|h4 -DX8(qFZ\+8 G]KIr2LWsWsNj)yOr{'99qJ۸ &HrROC:)b5# 妗}? -1WP|~*gfJ(46M!8 -R5+3R4kߊ5WM oEh}yyF;Q -MW}2R-wJTS)iKySm(̠gzNWv54Y)Bvh -nblB5Jm!UDžti'/}wHO:D۷C YsBSZ8-GΈnh𮞴Wi4vT 8d ~eh530AVp/R5̫Knb-ǙS0t%ZQS_@*#UjA~W#z]㒥p}BϚ/h֋q -gD'Lx' E{!/eS^;uP(i~adhVAcoSnl"~%B2Qa^JJ~T=06@gbwIy'Tm:j`WrT9=H(HSܞtu;i_?2J'8RJ)E<{/k{'IR8:m)+EV{IS75# Q* -YX;5tV9)<[SSŸ =Nؤ=RZ[uoM)H씎R=97n-WӞ1Kֈ9ʏCܨNeA@4@ޡe(ZbaM%@2PBq7;JS7fjUZj.KoVn㊘ኵ>Js8)$NZvJ}tnU^; -5M8l - -G}PӴ5QWzW J/FEC-ꚧT5Exhtv Bjd[nRh7w6m* CMb@EORG2G4y(Iz8!"5F1p4ݮSM9[t}RuF&xtlX*~~[u~cMP?9MDFע٢Cx^Z]){1Vug -PDSd̐fH xyo<݊ẅYug??f\{6G-4K#mS%™xcA`hݩ}l߫ڡ)GVkUYؘu<2U< m<-8ׄM^[>dN.CzeIP涪vfmC3S.9+F*ij&THKAݔߤ5)\blr#G5Ej9+INrRݠqi2N'F˭mFPWjMNJ+/*x~fIVz7"5QPnIiTzʞ'3opWU1VorQ[ovE[*vh>1`uZx{w򦒿_F5hҧ%1up6gyi*%iy#Sʴ-]@TJO{]K ¾U-՘V4lLs -:(jakGfJPG<0̧B:Q88rс.^֋O'@2N0P =?A%XrW<Hq\K/9jx 1(]ih4[,9 -Q'ɉJrR%&=<VWmU&kA޺^9)kCLԩj*{Y̩|f sPEp۵wC[cObp[yLQ%Uo]m;(w88Wzssb0Pe=T8h4ZN@u[xUmU)pV#2㴊`%)V6+;}eG n8\Q51Q7Wi=k1DG-[К xD>Ɂd7ޢ~gՍYPēи~f\ qF]Ab sgb26s-hg -J4QF&ںF>RڟXٹEjdcnvTnj%v;rhw ;:F)]Gd((xSHVÕe6HVfSvZ*Fj|qUlQ1F?rR*s'l[0<NTl:?;sMz#wj.k+,'3@E ;(ُD(u<~MJTݓ>T)PT֩(iurMĨiF)Se)KЩӱ<;?*yN{5FM8qܙ"o)S]YmQGj7 +&(1Na"` -YIVz)#~e$\:o:ңݕvOJ#0ɫo㥯u7}tVWqpN -i( -l=ף2Rf3cl׹U+,yd htX'P -hw8陌y Ίʵʵ -sqOk. -ChӑSqn4Nۧe -;QO>w|\{Wv -օY}UTnew=teبB")Z -ԭEZդ5hV*BSt];Np;ԇ%)X2}P[8pպ,(F䣹'O5)8SvO'fFU+y+tV}*JJ#)ΊAX+9c M6XInH{/TEwCmV -hSE,Ԭ=4Y1Z V8mU%0y*GL}ѽ4vlA;*Se]&ެ~ J0ԊW"4Su1E+ڤKS~xQ<5ۊہڍN:7Jo -V{: kPiѶ{'dʃ{[KFimfMzcTnLLNP~PwL}M68Ph8B9 Z _i +Cywy!q^Ӂ aÏoTjx9nRHnc#_!Ǫ5穦*E!R9QQZs3Nfhyy+TuFEo)HrRʈm5 R(S3533Xf+++)֋o/~ךrQ˒d)j cA(MϚ3 w"S.>OĬ]ݱXrP%ciESeoN}z9.(4iM\g2ChJ,aiƵط|w~p%B wPw] 1nĕ#P*lh4^>_ŵ^>4{J~*h_õ +=N[*B`?Mvnڙ OJ(iƉupJ_ŷR:\ Z4UٿnVhWniсRt{Q[$A?1+5QO&Y:X>pDgDoQJj S #Bs]-袕HV7ҞV'g -]Q SnN#ڽP|\<4P5p>%FGEU6E\8>0AJCsbt)UieZGTO&uM pNMN`r9<Հk -F\T=Qo]}/n ªTݔܞicNFܕ:5A.ItK?)RcJ|JG}%N?J.J/N RIZ3duH\OIe$@AEf% L4E*{Tڢ夀w@Fk:={9i[*x5ko T+O;m4KZeBΥ@xpox .8~ h&i潦j:kN4fTg?^Ы'XYK#cz8~uVcՙއO;'͚kʌM,CJVh -AM? -w hq@QhO*/z'Ҝ@Ě)z'A8({G -\RVxr~.iMeAB<3xesy[^jYuSMRm(aV|9!oꨞЧ9,Яml&?0(Zc>rrlY+%pB|ɯ&,B̔, - 1YpToBc@쭧 2[-dh=TT/z@Vw7yoDǿ -~f4؂yhޥLzԣ#utܔM1S ׺8 Cn5R]o+jj]6:}2q wN_K4ڥ)'`=k%܅*m%I^[G5FG'K@Bu}݋mtLWپFudAo-B㴣yOk)@y ?\@*6JX>^䬿@=S<5T:]>7X;Պ{)qCvNǚ=(,]^m> Mz9wPޔFB!h5 -+_AuܚJvj(F&(xDno:Nճ8z)~=uO V;HL󪷏LռA+wͥ9&&q Nx}AZ2wXޤ =HT rW'Tic*7Njw( nۂycy{†;T!CVK=QkVH0mATEy 88SF{B*KixQ:+):ԕF {*UBixRv]SMWު}qSr -;irh],Rܜ窒xBʨ=5Q;0?PVw$~oK3JHCuti_'C WgUVh;?hB6%2O̧Ǣu)EEu8)B+HV*'tP7YBXڬ91U -yE.XbTNեYIQPdwunPQ:cS^k~*̓)UԨy`QКdkz9h8)5B)ݐVSzi82:]ϙ+YktVZLxV VzT(եnLӠѡYơYOȬq*f.HAibܡ+;2Vvd ѱYC0(oBj5iځ̠飼QWjӍ&{@P@۽ iSޞ90B'DqyԷ ॼzSCiV%7lW9ZK6SPdfzI5VHd$8;1]T)jTOrs);‰([&y;w(犅dj|RݕЦT7'ZVqoeQ3 `|g4e~R uA2ށ3Ua=ՈVNYR]Q{ǀ*}UChS sRzhyjI TOct) n -b_ qN;rVުfLI{٢M@h/ -Z7 2Mz+Tc}m^.tSlVDPT)\ynqܬOV+VԬ垺=ٰqS mHMnkxUʉA"QrX -K¿b1 {ohe-NZ(98:Za䢐c}8DFJI;)$iEpଲNn*8Px oѰL1ޛ"2BHiqj^5MciJJgcSjSdha* :1VCSYu9آe(C_Gu265hnjʴyt8j֭VHUVOQH:ww e[/]TRԧ 1p;SKkhÇk8ָz{Jot0nJ&dnHm[|l[ m[xy(zT=ʇL+.)ЯbA; bfT]m)[jpV׫[V?MEZ|զlӜZS^) 1x)p{N [n5L-'hrQ3$dVD#Njv'U+G 6ۭliFsՎufx#ftՑ׹QX]U}H_N6-ǘ_c+8+ѰmVxx֊[Q A -'Щ^葆PHhp7q曮7F 0ᤰB8{&ޚakvg(qvT]LQF4eWfi?ZJU/` -Rzf$*W?iRcS(ƻv:@Ocg:wJ56qQ{`GOJ lN>-L-5۝Z[}OE ݂`wuWAp -VDE(dYߩD6%쓣 -q~i!Z{+QZdZޭuW+ErQW8¶:{QR?:Rv)NzךF hx++"ǧ!u*UV'wPQ/(ҪvPm]}*'U}tY?edod¸w 2uTQ -otP$NeEOSU -zcczbT ႲMiPtWr`R/ -mQ^SMX/ -$S=AFSݳS=>y}jnS{iCzTTEKUk"s ;iLRv*^CyM;Op~پ!FOõ'=Q0^9PO:w f~RTsF\O4F>{MFܓEDFiR0zp>u'f -V- ꭁ<9|Vj}]&r((Yx)0):B)>*TF&Dy!WpGKO4Ǧ9CBEwvDz=Uմ>t<@*nT׉?)e, -s*W?MRVRJ{H3*gQE<6izEiFչsM91:[鶧b$U Ќ=v+f(y9'JLO|nu.4j{r.Y)\p$;UTn4Ӽ da}UesҊAN"A .Hڣs Rw%j8(Û`WMӽm:B'S.' SުxéM{YRis=9P gs`=^]-#/E_w8֏ [ժC :_y)VzUY^gm;ty -;(u -8 G"x)iN~!ܢ;).zUZJ~@OnnV{-w5@Un'+cVV:HS -haV=cܨҊOZ;+GdtETݔ%1 - 7FA=<{SޯH@-GCN_ <, -dnJdКF<ʉC -qR(@ -+[+k[xlQ#ҭ.g V+SFoSL<+{Q/7;i41Smপ4Ll@j@nIGʱ?E+TW\w 'N1Ӫ_jrN:6[AR:U|4D'V Hx(ZSz}I(|xF6]ܫyr>)}WBimAsOxp- ;)vhi~) +9VcADA)jܫINSܞ)DC3 Y{M([/kUhТT ;j:?Rut}ژ[2f`HL՗VC b)3N_]4u -z;T{L- qѹ6jRnITR5+T&1er̠ -Zoe{&+yDz#O'sVEjr"pB(BimMkS5T1AHrݥrFݛo+4Qʌ9;|4uwT-A TLrTCFixicT^z:oG@Q?}1SGrʴuO-,D(Zʞdt>x (n -˧Y*SY8c Jn𢎉F uC&|;sJm}PԢM,ukM-Ac 5ؿԭ=ʵw)Kt*PtFKyF==UjEZQRV!R_mq!HiSԫWr]ʵw*xyڜ_xh V_@צ>o8ܣQ Q(wiIFs*3Qk`ڢ5T,P144p.LgdeNVbqt 1kLފpjin# 椌dge34lS](ђ}Fu -;U6M:S8̍J;h|*wen 1dy<{IxSHoVwV+\t4Wh_UIB8y,2 -S % -WIqB22OJܧMSkAXXG <.Q7-]Vz͠i犲v*YIVqw-,!Yf?*7fih(q; -6mS fP)SG533O.ao*O)ׇ\ -xڧP))MFb 4mO>\E5 64U>Z}j~>Ryvͺ8TOQ=G"DׂtpEDqpD+hާUZ5l:ACIDi1ѽLDqS~!Oz.+T}ʄb~Mncu;3Squ榐嶚MLÉD -!M5YVzl6&FӶ[Puy&k@OvJST݊R)eh< 𴻐P -/C/0No\t4B[QRvK>,<<5{ܤ)&vNԱPhvQȣ>qt:NqE Ee~ -y fP'ѿ*AH;)E2F;Nᾪ@l!ON5)57)ZU3hy+Zsvia@^M 1F!& -M,E?eZVƜTG29@h)DN -74pO(za3 QiXJTݔݓjx-A*sM9珀hMdܓBhCK!1)#o*ºdhTfI-d,@̔ @̔ @T*.6Ͳډ8oE+ S#9($<8X=T,6yƃJZS7NBx0?$x]JPRQLxkapFJ,<.Wwnq^.>AqFZ^ZXЦ@ߡ-)^h7CEӖzމ)41wӕScTzrDŽ :A^SSSuU -q*xVS)G"43 ¥ky)m)"U4S4 V.-Z/8QBbh>BκU5‰Ft==W@Lw*A'ThOTBt -@.P4 i" -` `[M*vjv4nhj գ'f(\1x֚P3-,7j1L"58ךB݂;n"GSLN#@7j֌+) uEnGUM= tŇ?z 5y7 4~CR8+VOz{Squ SLݔZn\O]-\^ЧfQ_9*W+sS3533FZ(>p;+2+3R5+3R74tjV)=0LiTƎ`Y{'Vڜk :8B{:VVn;ż -N21։J4hw y4lMcc1H4tG1J{ QQL4H1cBKIoi;ѻ؜GEpWo5;1p•X&鹒cP˒c+(:=+<+4+,Uo$s ?V?ԬC]ͮw*@0ҜiJ4-mpZ, -}֦hvUshNmxMOISLқm9,]ک#oŠvO:kXpݩ{(]#k)J o|śW GȩS{7bM'QVߪpc URWM#jQ}㆜]cqsUX9 Vx=ɔpFF'y#J[SHե ƪQ/7p'%)Jr)HoIwN( pORJ;&4pѼQ.P/spp#Pjcw}(tQ -';<1ǚhn 9 u*ffnjVfzK(& AeuTDTBE_]AxP:%1Y%m;l)V3XY+n/*f 7 8z!AS9QY{f>ϊ"κD TGS)nԬ\7<Udt IRx<ꫮ@wx)D -+3Onh7iDz謕o[5SK\բlբlԲLjj*3yÂ|#ñDܔy]LiDƏD{i0-G$۽SfjFO 2⪞imFҟ6j2wd4=<;FᚻSS40f(LQ1mM \aq^B&D/T% !*6i:EJ2Oatcb' 8GU|h*dWДo6\PŚ uu 9茺[Zqw rP$U/rG=6eZʴ 4T&)J.7'HRnR©Gג{ԎRJ#MujMot(H١Wet7O)ݔ9SHa#9Zj -VƨD<1Q3$\N4S34Tͪ'Ti[{5LlrQ7%2Q7$S"w[SÿH(%1=Sk^:]D)\ - }NS53z}7QAXA}W_|.\UES#F C\x.SK6+.RamH/WyRGD~*jF)ٳsZKULqmuW*߽6.hpwP}](NeV*U;tÂkǢ5AhW5R4i>iqc c(u5[4 -4F<</o2 -FejoU(;uPDzB[x>z nDuŗ$zM? T2y:6' -zu `uB̕ӪZB֪f UdmѩuTПJ"pVb{K=+D4oLjD;+)VG+1*;qU~!邛5 GCS'5S5J;]?Ȯ&z <VW`x,R -!FƷ_qռQ=FtNBM(%ΟY fu$@=4zu0nID{qu)&fJӆ -dh=4fJdfJCJɌo4$YnJ&Ykw`Nr&ڂ)h;B4D]'[m4PQ^'+)DWXF0ߪ Wzx'w}Gp x{7=m N@*QwPW]`&iZdb￰` -{p~mrKWU@A{W}Bݮx>ImJ聯PoODkEZ*ӞgC@AJ`₎    &&h)nb{#ՌgT(cF(}]1 - -R+@Ncqb -)b>()v#Ko=ݔ6=qMi *aêaaNm&Kةf=By'uww([Aw7Zt`uNy9cwat`rSHhhu18D5cƘ޺JnJ?>9jo"ݨeFPPA(NAA -?y7QT eSp 5(6Bp=74Zfjբ<բcQDR5S,{>*VG姄XMcy^RtꙊDUL/e!#5PnIRJԯpR;4~jWTLL3S?53S?53S;5+R5+LS?53L1R3S?53JԥJ+R5+R5+R;5#Ovi?*W~jg~jw)e7`JHGdy(U;zjdR*GfJqR53RN5(Voԡpݒzٚ!QZm'[3 -f9if=TʴԂ*f#PSpLV4fjf;'8 ?B3Q1&$Rv -R*gvjW~jWvjGfvjGfvjGfvjGf~jW~jW~jWrJT^I' -JH3$dI1(ءjfFj9ܘǦA=_9HrR*^Kة{3TS3533S3533SǚJԍ>_ACLLϩLMة{k&=DsP~Q1+!1AQa 0q@P`?!Hs:-2Q򑞫}FvLa-To;k-f~20~4='Ѡ߬}sp]dH6ӊ hM95SvnFueuG Iqy'"-a<.a8 -ԂS|ӈ19F\9Uc 1Kpb8\hhpa28 9i_\k`Jd|<pC.@Ax, Bn\ <'G'Mf,\ ^SLtG[-܀Sτ'{' ΓXV!b /|CB{y5%G`fnFc>x_)\4*)Af !#C9W^8*|өa8N\|| 133P' |5#2-0B℉ӂCG8 Nj\c:um7؄Mb% h9x6Gd{O&M?\\489'P/ pe⁤| 8? Lj x^9Fbpp c8vb*5/_Q ;# q|?.KXx#!>R>_p<ӂ:@%ߖx'<8G"q%gffnGEXRTRU"e `q([K,溭ְ1_ W~( O8H.e!q.BŸ!˴g^ppۖ0XmT#rǗ!qgq\TS[58sӆ eA,a8\%~3pQEpsoh:x׋80]%ՂcHN_ xL`BR)|㋑Nʳ b#i#, D5#.!๳( B2VE:ʃ%nfpP(/_@E.oʛ?L.J>"6=h}|"<2}F &nD`uӽ81$ -Th>-WBqK<ƕ'% bȃ7S })D6qeJ +]g=ׁ4?p?'g~r$0U(H>sHEQ88=WHP"<>z/T#1djrL|%fT^l̚~cȳ KX8h8Փ# S!&T4|a-`x!\'%r9tE3R[ʑF}>t W,tF#f$sL}Or3JJՔ#!s$7#ߓ|&H>O^F`e0-x҄l41Toȭm&8PIEWcP*eBP 3>$L\*WXUhk ,ÓU(դoeŐ!ʥ~::IpӇh闖c2t48X2u`A<1A5 B#8I4rhHe8 -Q2:@%N"uVk`MσJqD!IR $Behfl&|fQP3D[Ltms -3aB`օ xy -Q"EA8k\//^&p -t +`kA ?'`҂.RuV f#!3+&|' `X9@re&"Jb$CH2y1p:+P1r B-Yi'|.!|~$pUAQ{*zm'`2ʣK\4s¸P)HVJ +B?L%zdy߼ C~xOpPCx{3F EЁ7 Ei^ *յ -tLAl -a [d (%N< *:B-`IVR2$Fw9XڈtHw/hQ=r= F" h!oXk N$ -%<J9q}&|L'AoZA%+b Z5lԫHua MPEAQȴ$zЄ6PJgM ߄A&e~`A ߳G]}H.d'@ -SD -d ө?ʠ 60,=qI.~N2_:|y $'D8'(EH@Yo4B )~d錘eHm_/ 9,O| -@ane:Rkxr9?_)̗+8G>8O!$f:U"6͋MFa6C -DEv~$ĒD8g&22G,:X~0prPKC~e\>]p"|hڙ&r|18"PqD)ⷍ,k=`@CTe  U53CTaD#.%q((oIerC~FQM(GJ 995q -E[ƄT+|eY>5|kk4Uh!¼4x>}\t.r;-|C*cj}3*uQb?FJ3B/0)B* q9*?Eԃ](SJ~Dӿn- A cFd7oܕX6~Wja|Ƹ$;Y dCL ͂"#BHsD2vpiD؞#bhEb#=62T0Kd&G.9 %Lrq3udK&@k&z #  PN1v<&`0VzIP/#Nurs@],2(KLxd,t+Kƛ7eKeK* 6P71QWd&tS M$B8`Xٌ3y!),@su)_+BUz^w!a_r}>zY-A`tϪH+>E-Bx-ra9tdx~J`?L(qkԉ${BޜKȷoA'ɓЊϒ  -|/oKƱꕖSQUPKY?3>;M|@(qmc&;*, &Sw Jl0iX3#uUFWMAl g2gZ{Cw@ѣU38ʤ*)@ -ʧ"wV&KB[!8O -TZH?l9b ɷTnxVZhFpCỳ#C()ø<^b#{f$g[" R`Td -/pA׀%]wU%)Lկ^2 JB'.r M D)(). -}zHxQGQ@􊶀4P9!BGtAFCXHUCժ6x⠚#m2'5.hcFF -fHAwM- -lTn3n'| \Rk? |5E TaSK f@>FVf\Ou չ)7K d0b5Q,]Il‘X=]DGXo}GH"b(v9٬Kq(4R'J/=fe3*EeJ%8S A0Jxg',?SgN9A( B)HU flH_!BvZ"s5Br43f!O|35zϑ~Tuq>0$q_!C|Kzq<lp,8$?~;BAD&e@K C"0 wc4`A0":'2L`BUW4!euK_ I %fFE:: -b^w=-A3@a)i7]Xw۬x:t*! +.k:G -jzumvsbn |e`͎M)l|A$C;F)[@QyRa/ zj(񫶊 72qǂ= -/ӟU2CBGu-IO=a^KP4BÐJE`ݔK0hJ"U?r'gpd+ -@ 8Nx*W<Ū`R;\T:aU*~!UOND+s>_p\EzA!Tج6TJx"1%At4ج h*Axbᠤ3Id -ACs[^.`)M& Hk-oX^qa^dDrELFgˎnc343^׍}bР. -^eD0Ti YƤ 6. -"ˑ]y6p.0 %{*@mGqpb*z9RX*GT0OΰM -s\OCĻ24,mi.GH{&{hu<寊0$'Á|}L]H^.,? ~ <<Ɖ] VJ3C[>>/8wd#i>?"&^CLoe0UlrW3 `.GS!`Lpp@ˆ(L,nX\P\Թh<.6AiZk `c8hN)D >׳BZ9paBv9v*. ,DJ"-7lV%4ц(@7xg&xWP&#@&r3,ݏ/j=*hy(T"&iOƈ¬IC8J/gLTe$?4\ALH6!% -Q 1ٟ_"Jџ,JQdQ>MG֛Q"Oփgi12 ^ja1%RTXVSK ,1[`9F& -qS ֪<τޠ[ ٵ0Ax>oyoYME C -r |@4RcYmyshEw@r )̥1'`;6C<$Cj^]@Kr;$IU*J Xzp.g/_PZ<[;2 yf/cRUQa>{qzxN9I.CaC|cnD*2830RE {f G6Љ ")[ N܀~HwJi)j/đ Fŕ=f [< Ѓ[BD"ᡅGhzEplpD*tt*h])|C(NAq)PpC Rakϣ0jX QAk*y!:% nP??>AS|{q-[c*2y%># k$AUSW C7E6H~Qb97 -Dp<9c>B3 H]c>qN}@ႵJ|c tYNi_xR߬ E0 &0R:cTcv8҈Ka3f>&`#<;P"tΨy"@0[ {!KkyP,cC\vw)ND$H+O7n t011} Rj$4&6fGIJG)ञCB7 $s0+.υ+P_UacB@DKV#sQ4@<s}P"a@@&ZBnA0cZoIabx.ب ϢXZ2b-Bcxv\A j45ZO 8|vy)opAʀ -#T0y39  V& Cⱨ"n%z ϒ,\gLRDEo ʸ̘ ç^*ZPKJеCr7k[ߍ,/ mī9pR_0N -ro-Q:Mi Ty*cR'OQ&Y/5)5iZ+3*zF/[Ҏz>/|j&W 2KQ}Pn#1>{Of0Ud&w %ˑkxAB A - <4 npY{vr9a\)KMi%1# PD1LsXqEKl5T !@Z@hO^R>0%w”8pCB :h@U噌 Fr*(+?!{ШyiGkCӇwaKY<ACm -)BP*MYV$Cy2 6D  '\7i,Axz\Bdz%E{ZA`X'ą=:@%B%,!N28EtN@J28 3s=! pXFQ" ({'BBX017ꈱLRZS! Ec*qB= !o: G1)0k1EpcXL6ѱPH}&23kx/B!,>QCX -כ[hW=f T;[3(e.ܓ2??U\K>Idn2`@cpf 30K9РDfXU*_3j :v,*o --eY`oʦpܡ@ @EK_̂` Xt6A c {YAZu`/ -=iټ(FdĘZE7'ao0χڛ w0c$1yRЃ(mB% "f7l0=[d@Z;CP+hЉFǬ,tF@ z!B vQWN7q &At4@5Vp¸ scaqa"%5%A:CZ0zCSNĢkBb9WO9= |t\#\?FNˠ31Wp#xM:@DavFx,=pP+T޵P'+[dΪg3-Ql<(@K0cdY2{|w rZ d!`9]Si!QG,W!6!lA:GΦG r:B`pZsox3x3!26f rUث'H( =YG;P!d0a1Hod:yY|A24x/h[4y1QKetTp*K&|(tZ/!V!L,SV{zϔ=S~ܑ1`c,/p)^"u76R!؀1 ʖo9?!b=d%Dq\~\k(+rIHWxn@ye  - 1^:q5YHJ9p{$@Ph?reZ -2-2@ȋR Lm0v"y~B%bZ$`UL!x8gXr^1Adg2IBn/1* ׃3QB]x9r|Ox#,2Mپ&o&6y6"2~) LBR €9\Ch[7׹vvhI_ 4iqU Bg>K# G |Ip4~<WAZC{K'G#J }O"`!pЙTZȁSj͙q =b>oI" -Ht<`ȍI+2[@0¢Η8`RMTwj<)j&`Vn` =D=JHIul!TCT؟[@!00B*<7c -2(y IxǏTQr;_)[|A mJZ<.CGZr( 3%\)ɇ)_b|B_q&AE"a01NBSNfSBGUqiw( :k)$e PRAM^R֣q4! \ȩ`h :dd$u3CLB* .@gX@]!qʆ):CJ]ԳHn1t78 ^ 2,;iX/,In*吙LŪ?'~D&yeeҋ5B=.$[}O}ϒ~=D%~4Jhm%=󿱃Ƿ[ p D9DU!zNxplylp fv'A)|ZWCW1$bFW]ԅ7Kq I9׀~xN4)% p&{KErˤFQ CMA]Uh ?hAmm1.C̹CiG:<@M z#cQ68a*)g/?cЍ;(uoBΈ-)H-PAǰ2EIԿ~a ohAIqpx+xB$p>yߐy o< > IXD2"̬8{&À>ǒD$A&UWD܊44:QW9%<+&;Pd']Ÿ<ߠ0j?JJ^ƨ?WVB4݄Y@( a.lD!R^c f)N5O8p1GE+9.a?xL{q.PgxF/.e6[0! '?W~ QA:{C\c }.I~'z1Z `v0/.!Bg0V%}nܷ(5lԯH7Ww~(dIfH*N=Mu󢵃mvG*zDhU [3冋hhYb*NWs$T(  <sB.e;Y)ŹGsGC*ci@">h;`4]aNx6G($h`rʹD95{>>>(yo /jX=s -2l <KgZ=gg@Go+9;C)=Bx|BN b!p#KRhCw':V4C0CWhO$YTՀKR a9lqHޠBFMr@([86o,A8 xTG8 -.pUg/A~:2UP#qyS -}$$]C6aC$'Åf).Bqx\(N)i@pTJ? I*"&f(V:5Kt\ 3znrސt̓p\ FI қ@Ym7 ՉrTBY<72v pF,J>08p @# - ReӒIKQ U&3=!mi O %RZ1X\'YDW&S8^7G0QuR*)[RVk+XЃfC )6L3blb߈uf;3:vu1FC[sx :{0 >đɼyP+gw dhJ V3SqcL]N?1"G_7N232\n#2ܕQ!hЕDt_L+\T[s.2GNyO'hs=懍 o>3O}wg>!$Na' }C("(|T1faB6Ew@Rȧ4X.et  7XD# z^0^z+%K?yNy yQYaٌ/hڏ`T9:_Ŋ . -]M.A! Kb8, uBTC \mNP8Ёn '%zi~H%.;D4x s Bz>Kՙ/z?^B0$= c,xk6M;2q0A#h$l|c0[B g֡OQ=Qt +0`m;%򀃭! @E6A6D,&[6h@ 8+{S* rb1OhY6_=& y(˟>}3Q>4J+8XA=biR0= -{s`0FfMDJ(xn+M, w Z}ib= E-~Z1b95B< `ưKnqњXnKq!-IFFvƥ+R 5g"va :i/ ,6&M\aXrAjkqrDΪVB(ڰƠ~ -*FH -T 39BHlt,9F0hW -̩n~P2cpBZTH>,>lR[}qiw9|+Z7^\iTv -=ώ="A O'ϡ@T+mz+(90 Mh _iD?E%PE57؉q7@tm}IQA=c\xzǣ*7=>M3T0:@bY:')8bcÀE)d`N~IƊj,PGbJP 9$K0!;.tAAx -g5% g^~QtT3:+ #; epgB\=,|ub!˼ȼ߅ D,i.2 '%ۂԇ#| ݫEH8 ()}oY7!AՃ 0 @E.9~zd=#\Ou31_ F.<,'+4n˓ZzOSX - g<9BdaaK! Oi?ɛ >XنTh/oE>Z=↘?j_ *[}% -ӂbhE5E -;X S ث AE ?)@(vkfbPv, 憰`ִCw HQ vGr'9fg9NY!{O=>{6TGC3LW'SMFlcxfX |@|ʗ]8  F -u!lXo'|{ d+@c`R]g؈? r!cPp/7˄-ć` \ -o%_Eԧ rb^'1 2s8i%؞HO YX1ƞ/rҞQyϷUc?v{r_ԔQa.\k_Ds?PzL/6FA&'_笣:y]:`r?H m.+kΛB_"8|xA!,ܦ5kƼ %3" @ 0e6@h2I1)I( A`a+=C(eɊ<:%aq00 j xͲx%e&,+- -qHK8WP~5ӛr^RD?(blhey 5Pp=icledyQF: !tIy;XO,F Qtg$̒lab=D8^FxJ=%6@)PAL]H:$sdobphܛo`?=CĖ 3{#FRs,n5)C/$+jWC'xN':o.ATiB pиx'C#-bC-M2>O)>ȟ<zwBBeopNHy32l*yXBo13 #7=3?cmBLYp:Q)MȠa/e C(8v 딴t䇃 Flp9EdT&IͨHJ9'4"8VYo_!Z>HtXD2D 8r{J -HyM5bH4\CfQCp(Uy%CdY@@35"]TYNQ9C a6"*m~4 Hw$y od.D@2;B0M~P!PC ԩUPH;_nio#s.eQT膡ӗX]96Cx Y5RK8G՝1JC\ - ! "_17#ahHN<O j)`!@-8Lzf8o |d*8WiHIAɔ X,a'PTf:C:^Y?ϭUԇq-Ci (nC/aM黆C3b8"}7vo'hGhgG#1n\JDx3ϰuu>]хx29VaK?H4?<0 . nצ@q@Cvs(9'a"h(*T0U[I#5R%8oQL5E D' -r1;ϽG|(*2Jj(_Ł݁(Rw2C6ܓ#R;)zs& tc+es)#[~77/Cq<\D* ;Gb JyJ:|s'@`t> $!' D)a ! -[l6Sk710&(>w|τf@%)/7BуۀDw-ySae# C'D1T*gRWa>Atf ?L"HZ5!Ӓ3$lH)69rH`Đ$CWxp -r)㇚aA\̎h aF,p -bQE `2D%+ZNl-33(aiB"}G(I -ЀH.4ƾBB#G8[P`g; `n8]hIJ0o<Meq#b!0dY>>| -+FX. gYμ+ cD?:m -TC[Kn G1ȗq)\1O -|iǯ"y?bΟDnsA8# zi^$;m:K/A0 _q_NKxDh^7n[x> v ng*,:$I4'Ty3.BYsuB$>7WJ" y80` ؘG` `0VX8+g, -z?IE7n0*[Okk 49Pta|)2f*!!"*Foxi6o Up1"\c ꁉb؄.H!-=PdKnz )dd}YhtPB$9+t<nnfbx(fWH -aLr̽TE RI~c(0Ӕ"p4,a{ (K&epn2aHByF8"{D4 Ϡ/U J@jF2(O!_}'|oy^Do1IB߸{8(Ġ闄qBl#)WE! h>A0A%ҍ"EaH rO:0DڹъQ]LdY n8*u ( k Ĭ/Xs-:AFzpWCz)jv046WaJg˥@Afػ,a J.W xK^6q -G2/~K<  @:ϟES`Q #'l.t+U @!; דRq|`!O X>S#eR+uxHL}'DH1"'D(PAv) )(^:p|9x !'BQ7x>$]=FQA00QIr2EI"_ Re0JG,6Rֿ=Xx0Z(wb_U3ƐwDQW 3nPrLu!jC>\@u?0W&Cf҇GG_ zM`ޣF<$"/I齠 `$fWR58{P@/+Umbez3EjjbBOfii)ߤAn޻-% NJ| 揑#}x;b[r{#`Cbkx h'J.BX'Pb<@ck@r ּN1 17l# -:zW P&P%BXey}|rw9ȪQ 6|4=AB֎&P/G}[}JAO `L/⋈%dx~B>..G%Y!>mx`]74.$F>o|̣JԎ3gϟ?>h5j?|a>H,B t@-EqK9fwcCVѨW!1!d0;G{J_?9XSHB,o8W |wT?% 6#,OĵdY _1Ze/יP^.(9GDj((1ϼ{}rF+8@]rrVՊg!6W89K؉T u/,cnWxQPC 8zqܾ$YگtO1) YP,߂u-C*zCgv3@ƢGE#BN53ӊhɃ V!R.ۂ.GG>>{M߃}3}3}3}͉oDHz2leE%@Ap9 @GT2܎b^(wA\Y^Se5H|yZ+TвԏxѴ&1.G`5r4R{#BYc;O H:}&Kiy ;eV7RMa 4$QQ7\\BG1J -p8["~SƷ(8,]wnfou17H" X? p5 88^q+LW䬇-ϊns{O{{{xggg`%~ӍU.t$ #x:ra{"UW\ʹ0 #w[:|_? 6!Ff+@\T.  -Q2(/E#s8ahD"Gf%.*tRf. -Ɍdr2},3ÜGX ̵jp&RlƫO4+ -G--QZ/בpxˈ3 ZbY}};`y >>>0{3RgrrO=5o0Uq?0 􃽝M:I -0q7O=wx-ڟA9/;'_A.Pq?r'`":>1O/耮FO8p_+|SWp %`"|ɾ13S%Ô~f@E9gccф>GWEx3FT/$,&ځ7AN: Eeߎ`[d ve ;0}8A=pKXg>}#}H0(QsHCSĩoNݙ%,H"(G Ed\ta4I!Bd>>3I=Lɂ9] 6}LxAf+b#*ž yaw*` +8c.8s7oF%  f`EmFx B `Li0|l -CwŦ ~x00$>,(g/m] b@bʯiMF17GF 'qTX/ 0iC -aaG3чs L W_A#UPL&g/oR:ՠ$e}CL*M0RRt\t%`G AK_< 5Ct@#F:` -~;%8wVZ 3/!_ JT% `/}p>ۛds!^0OODxx%9>V%=!a>(SN=FsiS7_W!2*|q>?VyAy `vqux -Q,@&C6##Fc&P &p|2S@/2sӤS~b<1dz5A0o6J\\k)ӌr^#-@ x)8T0S|O ~FWXxF}O,D ѻܧݧ&qZ&\C3-ɱ%|ͥ# HDU]'䍂x-+#*IF`'>C0:e0C?dXEY_ܪ_ e0^&2~0; C1R4g 3ߒwAc&7EmCx@76ԿB] !PfV`.L;C@x/aiJN$)# m9<;863>)P#̠m5.qW8P2MVmHGHCy}aS>ARM( T=`tH<&Nr#1 }Q -ϖ/gpK020;mj(Ya"fX tvot~LQ8+ 'Ujve;A]CA@gyqT{O=hm, DŽ `rpz4@հQOD=8lWp$O |> A`XR:%#HDоq&xMj111< -i\`J&aRwC)fs<:j^ zS&tSo+J^2مm$378y`1vDvxO~4H;u )Q{JĝS ~X:qr@{N2N5 9"S<b-Y x hh.F`,gJ12v,2D+]eռ00PaX*+&s_ +X*bKQ|7`xKpN[{"@)ib7(`?-kc 1HHWA`R(t 5 8Ϛ}kCٙvM"9~P}ӟx1]I@/.@Q>XI` #P`˘ DBxX/8 ]S=O|q}_T/\6ŸQW2 F]L{3[U{lƋB20Hs0BP& eC͌; -V&PVp>DC C*:*yT`DS*|TH@w dBJ~C ΉR?1bl:}C#" o(V9~hLBHh$GȋV4Y8 8-kX b8?_r r ro i2d"BP.   3xJ@gswS㛿O+Hu+*+tX?XH@ {P9h2o @ cSy(xFB쬻ʁ h븵1={4e쇯Xe.,4x@@ -h` .L \W;jPRS=@, W: A@aAS"a5a@aNo~s._'HN֕C*q>HnwFdC!qHt4 \0􁖞:`^|)ʲ::T]laB3h`"'l! ^09jp(K -)}07a׍r%e,'F'0сe P{r wUiAc1'V_#>b‘~z\` .Mp=2U؀yHU&0Od!>>>>>޽u\uHw;:;KDuJ} z|f!`HHL ԣ>~ɣذEBPJT^<¾.7&>7A2n=L|IU&:{xuQ/J%ax` VE*E= Q[S5қa D~S!َQ%Z,)^a%$R,>PιJ~WAL*>34,p0O>ex 1(j0 ڒH@c]Y g!\ -#Q7 aI]0;;Gj)^P7m$OXhB+1>! $Tz5W&%^p|U0`* 4r; .S+ 2،\<5 ,*l1p. C`2J O' F))ϋ2g|o3oOO?>?|_d(ߌAB"j€(@Ktk嵞-`Hb[¥(=~"!Kb!9+aP ȁqh? (*139T֌Yh ϗ3Y*wz!ҨkDI̘!NAgxγrn$ܼE3vo s#*Ǟ.<]! -Gg >4V4RedrpY A#H$pw[@ՂcJT~1BƘ\:,*Do})xYҼg@XP^x8'h( 6XGMa9q 6V܇h512Gf2eA1#tyCXm(E҅Ke`y`9;@{@uS p Tq8%1G $HL|\<(D'Oo>}ȀkMܷKy-ԷKu L8@--n"e .YM/j}+(zO mQyCl`YtB}2dfDe0sBF&0C/MP!t(4C4 %#tcfXB  pÌ? q6=U 6,,ÏJGMt"Q6x(cSDRF -*Ue9Tea#0ԙTxxsw( - -hqsF5tWc3Iw)ꃛ֮ \kz(xGAS!-`űԳ>_ c R̊:PyqExI3;$oPϲ5["2'eeοUV=awcs8`s1"Ɂ7_eB)z<'@Q i !F Pڴ& zH%4QOL7PTs7~K1$&O3>LeZ Cu|p_0j[Xb̌16Xo -J߶$zBʡdO D|դ -uo[hAױL+Yzt\H50˚g0FPq~A (θe~tr`7f4O&60}(˾Pai (W)Qf R9Pߗ0lCiH7rh)B(f*# 6v:e,+1Hٓ^`Sh\ W9]`5TBQFѲYB˂NPh~ Pj|ET 5|j|A5JG%uRA" D'V[r^EB@w| F[- 2W\* d ~]5!F 2G\+]= F\M>0Ό| -jHR$YdL -9%1`7 qzH\ٕP=cJ'yQ-/~zs(ax5fIuy&O%α(cC!:{,xkِkJ PWa1 2 '{JB\GAaʮNg;!V"Cno]a88d5J%骅͛GDeG CPeO>>> -v7iAvPAtB"! tgO?|Zyky>E7\lߐ3O ni*9@H|$6` 3ToI񀋮z+3 0p n^9W2zƴT|Rl~[Kv4a!݁Jy彧#ݘ/Jʹv9^-!؂^x k ->p9A*Jd[F'n0\1B {` CSS0b(IT - e:C8H) z ^` (mOOOOʪTԣ}K tF6GQxh?^920Վ%CUZUꝔ`k`/ZAC) -&:46] {;GB?ajK8`PQ|>#yi"*[@ ں䔬 $sG_]aW{Me>(gAMЋ{*L`2 %MxS?f@$اx ?@rF=!?>%J_ֲ(w.Pߊ }xxv0Z#MGenX,@M3J}Ua-D@1C 88xHvӐfjBcG>U'jŠg }FQzeS ) 4T?hof -la -_~K ׋잙8D!fΪKHB}&}F}, jB9`D 3O''@.&U֑ 8u@pVQ? I`nYc >TН D\{G"@&\J>#] Vݏ6U\fZKNA-u&ҽнGL4i\NQ-f krG0ECS ?ꡂҴ/H4E2 c^PF DَBv蒲gA8?Di(73"hC'F!C5m(؆+PĆ+ -*Lؗ- N4֟3GZn^Eo3{ʀKP` 94䊐kYOv*~!h9[?ԄܛA%FA[mE8HphaXT{ȎRۼl^X]ܒA*@\#Kf10(A}>`sՓBD_C7)eހ܈-3a?3ۀ!+ Xr -yq+Ԁw@0n:rCK]0L2 hdu'e72)^R}m5+q:X^Sh6̲,GR׀(d/ ,;K -{| ;p*#d̦; Pj9Hy, N4CVx,59 *ŨDX50SD" H1 Vj{3 q!SM m7;BB4`dmRlFR!(x {bk y4TV> {%QPnϼT$>x-UhPD jܓ `<ՕrQU>#0Djtx}}Wh [}6퀽%Hϟ8a2 Ta_LxD-[8i(÷+[ɛFWW׬{RYn$0J¦'a j e A ?Oy}IC@!y+/`? Rću+c -/Ź7 sbe&@.%Ұë=<U  -$gƵP`e\0p<>B{D&h ?r;"'it x%a)A2 --w|f6xaX| 0{~>xrEC>0O=oT*e gVV -' \x*>bi"ibAGǘxh8K($ǥang&%q>`}vU>bȠS] ,:Q /^\C*P@R3/ܑC/ܜwB & ДHRLl-R`_V -%!85EڄA.@"ZuH -̰dGU8w(^E(PR0M8z5%5\-Ȥπ}sQM|W+M#ΰpFf#iQ^1IN\<^hTMF$G 7+V0iHF!#p nFs#VinGTBdI+@^X&}2L)Vr -.ޣtQBXyc(rEҦUG#٬?&\ (z^[Fq -JjǁN9t@E\Xj(b dvDtY,\( @H@݈%<ܣ'r8D|̸#XK "yhI,I cn^]nPM8H#o?`}ݟi}p}irEzJEbgZX- {30{+9 _7BEWA,AhÉ:rh-T(;ƕς :1uZ"~­obEC``AJCP\t~OMHruxE;aO\ O% - 5|)gCGrKU9ܩ>_!kBe)->)OCKp3M@9:@ 68V5ϰOE@ĕ<-W,/Rg!B-1$h0D5TL%[t/H9f~F9}d%QkSfmHA(@KA:K"|# zaEQ.06Gt71ZM%jRaZGJUGA9y+ 1g׍_/lf nmiVRDmO: P\?nwCӗ0;L!qv4d qgxT+Ԅ*{AFG%E54޵0ϡ80s#Q5D d# H<"xd edˆzŀF5D@ ji6St!3q:JAf:@jr -^VZuAX )K,JRӮ'Ct[Ӥ||i)2rn@D8~!b(CF C %p@gt -1Av.*t8rcY]9P;-Dueӛ7>"|6>>9/h0! pouT<6Q-M%ա$.Xgg/bx[ΰb9)c)ۛ Ar]cO{M\}'CiK2?bzO߇2^`C - )B"r?;V;0&M> 200LC#|!> (  - -B7gsH\ t4p4m!!s㖀{JC0j{ ?՞-,I:& BRt]R0Qb_! %c&PR{PpMB~J:Q%518/Y&谛-z@4a{/agF \%eHoT#ho)'J`L7 #,7$" v&p YfpϙPpʷW*W0‡G"A5C=.2$E6 3B)Da3@Tejʫ6Ѫ^5q|NNFs#lCL -;[xL"ΰl#ߘ *g : ^SUF C8z$aY'G@a5$ a0\91%mgMwzKff9 oRΓ=O}>wkj SA` lV,PQ@Dw߸Dp j:Ee˥?+ - \-^9a q^W0lx݄xL`q#p Dv#mxM 9>79GdO>o,OХ`׌^nP;1\DD\sDȚfpτӴh2\EV5EF|dUhF5Hx$旋/'>Dȯ3 _1.h8zټEF/*5Ck>>lL_͘_C&4ydDG k!/| :OkƵ7nmͣ b[/|s2#7dƄhu4h^'6*lR|B`(q`&PVZuD` ,>-N;-`IL:,A#NʡR -kN2;C(QvFjV#I -xUu適>( @Q$tK/9FC ΈV]P3oU-ķR8N("@FN>Fܛua3ɲ-N|:Y-+zxO}.w±`}3U5E o,^060p2JF>ְtOU8HV%]&`[ӭ'ӽ>(v@lh%. %A=HA0P35wC,pQE2 -FU Hg]@%D`MJ*ԑ+R!(ڀ_^D@dK;s0qbx~ CpBIaD |c0c8:&x F0邊=( X;`n}Xu1w@̓7 DdpMX 4Нv3w!xt@HH@I%^WOP<#h%YdlO %Vguy.wfXߡг @eSJ LPGH_hIlF#HG,lF6&FH(SYv @IE%ʅ8(sRŢBKW›4V^ҩUBij]!7T l_6w9Lc"`Q6kQfN~px>`v"}G|&M *WH ˪@EK\]8r;a0S,ý~~c+1rB"=^ - -zFd>_+J9F2``B[I/{V8Rlγr63‚!RU}`"27[t~2WaX>H{lHIWI{@4?XpFwIx.p^'"-Pws #u:EA$u;V$,Z0'q+S]N?1K|j0ts{F~S=]-; CI)!.RbzE ZxmB8&iDD_+'󣀆`M b U9ò]f 1$89E2nΕU*ʣebQUVn'vrĽ3kq$P Ue&C4J l0V⢋P@T\M9#LtQ}C}@7*D>[>({OOOOd6q-1CHA|`Xuh3\g XiH7Q\6?iuB -o] *@CΘ(j^/JxbP@;nuk+87%gd; Ys29ƳV}nuPdAt:PKH9 G` AQO7rYNF`+ ʟD)E]W8$B(Q\N#? Xh{7ri4}p$= A&K{H0 ntAz@cAGn"iIvg^] ~l>0(ɋ! TNK F4%>D@^ $9Pw8iOA# }N (=%9JTNR L%_ c a$YuxkKs8`[?4q6CnCjaM iC*h4;Mߐ|huC@sϋއǶ) -f:LPGq]W9%2^6E!NE`x"n4;݇s;x€auOϫϩ@} v<2 A*m^cE)$돇i :3p8=\{@ajK -x>y`;$T p?Boi r$6*/B܂:!n=`[W# Ly(ϬWqt-aL P BX+;uGAyhNTC;E*Ux@`plx* -# XCzqi ݄=x ʪ0Y|OHe 4!07>Ahn(&O_ cf:H|A8k*nj_h;`8(#7(5!:Hw ՂB0pD| X`ʕht1uE@(˟ґ~q/rT.y\2Sn?Mh |@j!6P<8 -p9Mn) ` `y*.EMBYP1=`mQj9?xYY -$b*u*YHNCz_B<P{ p0JC\ Pq"h%:p\MiA4 't;lR0Df`JR˿p< ` e 8# D0#wOH!(P80cU_|a>tb/20mB.VXWS2\Np$" -XW7LODH<.eBmEn{<#MULebW]~8IIJI^~)zǶ0=Ji_HtF!8Us{A_%{,hZ -9>^>-؇x%Oz P*rXDPuNR JmTC!"蕡HRCeD܈# -Ru -/\ $nUfd8~v?B~%8FȨ@pn3TSe1{d l #>DX -Sp^u”*5%`Ñ/8k˖8s噖]Q.,u(VggҠ(t:o3 }}lIa3*O ή71AKai@K)Gb,9FHge2ꄜr[C:>R0NСTrܞF*+1eaFZ@_9GwR_Ġΰu?m)U!N@QO|t^\ Y-]Ph!Oxza%Ǹс ٢ A3 0]rW!G|{!u?W5~N.ګ| *JU6f "On I "gs5Sed *r=x>^,(4&д@P?q! \xHRaO({"ӣ-rҷ\+ %&}['h<''\Mʩ)c0T2Pp%I^Rl܃f H/@R \ucmX.@(iOZDž#d%r%9gl5-fO%:XL_]8pu`6~"l y&Z|LF8%3'%4A o¼ =ȚO7?~8:~7fPYŸh1N͘XgM'G|π`zXYT;'}LĻLK q@Z4ژYZ O缻. PI  -Ae2(g f3yReJ% {ԄyQ#dI(l\: Qʟf}}0+T 5p0>!1~t̓(^U0mI=SEL%o):fH|>y[4A-aH\>y2Uddb3 (# Ef^ p9Tm8;PX*e% #2""!IQ0@V+O^Qֆ"j߳69`C@@ ha%C /-g(& ZЏ5vѳ{+}^.V.d=([GT8,:C!^G1j'!%w ]즪#BebRW *g3扑G yAF~yp.p; -e -&Ͳ__}\a٢C SP?pu< cTG(@{ϔ:8/ čÓb7m -X@PYxO>Y\Or*T(MCW^}EPI Qy-R !.ӊ~ -7_j}^𦫩ِ0a6M3T4tFR01@ -?>yˇ]meGZEȦ#: -߲Wy0[=jҀs  2pKGJ( @rPU*o1ww zE  -;b .5yXs\- E*2q@hDs7haP] bj{# w. *i5V>@SPED^ˤф 08i-N#@/^QӂOPrD:zmQ! i tϕD5?Cu3UT)H, A Nꏜ;/)I`[r `x<_9T9)@u'9n o,xƄrV؂xJ9@?b3"|a>O(On=' ,]5! -J(m+N-(BTpC^Н[Q -I]b{/Խd,Wp:X?Ay@ 7_Am ևWŤzy-lBGɪ+Tf L&uq,n&TI?nPª&E< n0>ID`5X/0k0IW|ɯڌ"Sz~i FՉu?@"d 0TU!>\.0I6@~wY4?6\)E H\pEu_- @2T*!i_ DB pkOߌ%kو8O!}R7M,g&<#(oCl$.c X0&I 2,{C3 yƀDK XB--28FCK(l A80F!r --.YC -67A5P 2W"ePz˒2?ALRB;H%="YV^H*":u(P<|:LaCM h)su3 sDw+u50gZ(UrzJaROE)!_ΓK>4SBW @wL^i|(&2FP"b_,B`>3JuyEJKP \ :A,Hs -n ʆԄjF[Q -<GIBًf j A$myr0r_( \9E`0g*$O=7,1QOȟHKOQ@?'^QY gf%[̷.> _/.e*+"t엍"L3O5 ڤ>`RTmZeVpD r!%*ai7j3c*%r m;̀0H%+B4Sc$TOLެ+Xn],9<%61sq#䒠/ 9k(аcӮt 8-jnBQFC6=&(zCRX"% (DZj`t`{;A"o" + \&j\!TPa$-@Pl`o -~@ (3|R&5B -ނm;2Z N$z_QPgf3(֓0P:\(CTG1YQר\fLI  )`g6 ru7@ -_2⁈ -"0Ԇ(^)QXwI -Y8|ު L DCu0 i HFq`Q=c<"O#-?2Ԉ,8BEym --*gT-hsӨ I4W S= XS,^ -}p*+Z_0\{R0+8&Zt+ 2"^c/D.n#*9Ch]wlyIQh`܂ biɂ3"2+%0P'"Өg7|A{WHy -.JD$7kIF^ɈA`״Qؤ15xΏ YؕV$JS0gpZHXp{%4SdIXXKhVd=ZDu"ڪhI _ Ca>RAj7Y.!y٠'!_ -%.H@fl;êeRaԊ w%P\yiC^  B Qeg = Be*Wb$sXG)XzhQPJ&CBE•t(ڢdJmO8wH Nŕ -4 `ԑQY.F!O/ Lv9˸_Aģ/[rW ?U"dJKe bc L2y7 x6H7 -kϥ]EK>|A>($ 2?P&9~+c*?p[X7Izahfgf[d/z1QG_+J|BxѶ_DYâVrm[υLXxP@j0`d1rCPꚕa#M6`L.2⩨' ~D&}`] \YRHuC(\&Ļe0pWd%t(a m!<r`p=d$% PfP(O/x w7xx{ax\C+qز -!*8Y;xeZ0F=cp37Ny@x -]ʙU\ "l$C_U!3 c.*p+K$;@m%iC 7b CdC~+P膢plҹnөxhp2s-*be{S* ae2\Li#ӂ}_+t|wƴH $6:xBY'"-Vn2PkYnW4c5_p &Ii`K 鏚_Y1SlAߢ^P% D(Q5],p  h¬hg)*]E8EXSj oC،wxԴO,lpI MlTwyS֬U@CQ 0oLUNW5@}/Shpan.Ƙ%1p q\Lsѵ@wy@ IX6|LmaFȌƪ~=g۰f>> QwT `y5k:gCԏ+J|"^\>^ރ&@ԑ2EF4* o-0tDNE<289H4ӁJpq;Cp)N CB39xP&".^T.<)P&r8FR ` ؠpFl't8庪! s`Ix=#*Pj?I/>TUOKOxlWÁwzK8Z>0K0}o? mB Ue[>nZC![PuBMfiުj9`D9ol&p@{45ăQXFBW` `ҿ|>H>Ѕ K%CMdj !O셩0 !YHWLF+e;g ArT 1## -b -0o`=4;60fP&( j+C%%x  TT_f]䠁isdK'Sp%]%81"(#!U*n#&d2@D@s#JN?cـ@tbFb0fo @PXER9,=Lw\KAg -N2 >W.- DnM& ` ZXb0< -Jҽ pqiƸ>k&',io yhiᛒ: 7>|av U8Zy +ɦy|bjaMA7s[GW6b$盤"ӫ+dpCx\~?=`mT oH >H1 EQpIAC>>:M-,%ܰc({~(ɀO,ʂaWM{  -;ipa+Px -}&L`0 -1 B EJ454#. c7 L@_PpSRf^oxѨǂ*o bGj,ѬNDjx!X&#d=l1>ȅf G#CgÙ{}N._*;*(ю@(7G&F@@03xH.vǢB0?Va#zGQ< ѿsE[⁑`(䐶`΀R2MMF9Mڝ \eYljK$epEC(ˤSxP !hN"rh[ݽ=fڲG9/`[u0EXS<1VHz# ؅q2Ґ"u4!:$9]k*ʡPUQ [Xm3@#<AQT6,QS,)P "(:'HSXa'cVTB$ỖA!wAΐ`ݩSefw.p0.axArKh&@.5MQ WR> S&$79[>%'R@7zCJLA&= hh(&V /G@D2BJDW|Ƚn]YU薤bFg'|>)^TtAD}ntApgD&p`0##ƫ*'84p+޷bm9!ZYh5‰X:&!ڜW'E 4 PELp;^uDްAx-G(LH6 %SospleY˜dMAY¸<, d~$&CP>F,=p "^3\GU .#8L -(P yܦ>uqebtO6 `[fQFMvW Dg'*%)P3>81K0%avNE*c!I@'(SϨ7|>8uZX/0z@ L]!R@2v-] >@}@ !جW%sEIWJO  ]Yt|x?ĕ*lhGIXh.rhyR:3%Á( -KN` ް8hg -u{|a|<7`~A,@ifusM(f lr`qb&Lh>V*EX}&Xʆ rW^1p+ Op҅!f!_{՚pGhB6JUoPOCP[/]ajTyEu(:M+T,(Ѓ7'ҚN1?IJ{gUaP'zTe>leH\8Rb+hM$=>,KAEcB`樁M |Rצ Ô *}*}BM𰖴!C$(X`6!TBC ؟ ^-B xh81H4C 2+'|ĉ~@Ai5LQ^/hxT?Z~/h0V[ӫyyLleSƴ=(T.  E7cX8#l¨tnCff,_rls6COt&!g=p[#MKw= oo'l'Fn|Jd yUkg4 +\2U䠺Jo((RrR, ;2myC{H@M2xqVqx#M/=rH?r*'<{:&5Mqb-%NL:?yz|-ܾw5fHe=3"pi}hAcBc[1ʡC8W/GƖDH'@`AQHk:76YbZSg - -HLԓG˂)T -(&Q YM!-֌!bVM11"P,@..f%w5urf8LPQH|^pbZ e=?(E u qW@ Z$ ؤ JSu#KHaB!3~e>=ςf\-G=1#}X%&#ȃiH`\s5> ro!g;|$JIT×3!M ''(VnJ,O)F J\UH o3CfMhH-`}UXa4 -S#Gf pN,XCvEMYA:X"Xh L ԖbN,"46t)OiSRJ]a0"00!%H%/()ʖ*5&.dOGQ.H4W*U1ZAu XQ:([Y"x'Rh:yg&i 5%% 0reS'>_mz@}*mLSτD4廔M"|PdfHI[i 3)x!IZ!JƚCѦ%,MRCxAF.gO¯@;CF ID" ^ߩe(,KЈ Ic+Z([7x vH0l's 8wu6s3O#>>>4ːN/ˢ Ynk0~ Hm09%ߗۢs"$=(4F4ZjvF4@2tc(qp̜e *^ -Ƣa.[KfA`(":I4<0#!Zܨt3#iF).Ax8m /^ͩ`G;`U,+ WĜ<$ 0dDLADgxA. t%K{L2=EW<ШѥW 5>5[$!S 6Q  -U k޻4j+XTOP`XT!{0BZhuBPyo< @6‚CE!!衂0'ܽ"ٖ'>(o(7iYT*",y jΙ)zhU"uMMhEULs'>hT9`RSFWIAݟ#: C"`" -.N&˂>TοKo=0WCt`(I5Y%~Kwi'C0~rB d{ )~ 1\bp"WI@fQY"lP]"dQkW )jb&i 0hX+7SO >m=J+1 U#C;]e$OINW`Ŕl'brX([Ĵsה!E;x->X[?"X8ąt3yiM-~ T@bY5)t ^< jW(ؒACr`hv8rHDb>*vAI1_aw UO| -&DFpHx%8^'灄B Ac>`509"ua2>Դ/bduP a:2oL{tܱSS"|i`Blߜ ph@5 -t RR%Q$`?hA.ʔ p { e>~҆ El%ࡌ D|~WZ/2,miSX0dp<"4a(iG@Kl{J@[xUկ7<5X ̨HhF)D3uO3)rnF9qɃ>Qg.# --mFVmiZEGF -= D0?'m|P-OSQhP0W -U)5`B9 !@$ zmtiBGPw%% MW r?ry@ JIJ40Lka\)A?)B#)H/(K6H\>ԢT(3 0I0\m?gL~КוֺOh ,*E!v5;Ž&/3_Z7yG^0amn6*fcS̴8`΅ -"51|2=':AѾCs)ؕn}!Xul{I2 #3T.Po0r #@6$ yF5Z tH 2nde[)䛏 <7w@2f -<-f1QԱ  [Cܝ 5ʁz##HɅN - l~z"Y;8}JR.ɧJ&g-4p0"sB+2>`"ETBې(fO5`> -^ȉJ==6%-1}Q,t8FMH4z}H`lcAO"F`fMHVxs1jy#H-3:&?S.: i}. *fgIS6kv_2㖄5\"6'P6%Ov#3Qenagk~ #C 5 . W}G(0=}BRL5CiMg V'eFz[24{Óσ6z?L $$AChtpP`TwC+A^g p%4΄$;!VWUPؔoɄQ B8.X2ͩYLw0\RY -VnqBܲR)d#Xv ܝgB)^yٮ" -p CժE{XyMCr] $\hz߅ ?- J3=~U+x)]m{(% B 86a]72at`yDP6\yrJqK1&b{5X -"e4@jKƉiN }B4p5ڼ*|-YfY`;b%jȫdpU+ Ā+#5eК2naff"у\նiS@heOJ>ӺsU8"q F!tz}-.[@s@KlXuVZTpe LXZ#Ԅ@LvG qg1yg8Wi -$GY8ftDNmo!$z1CaR,Wx TPhjxxӰ?5PM `C,<~\HY RVACPC#xP) OX%Fcx6iKJ`IlHVV WingCP %HGR#31-P$R lnPOqT73 7h &A,nC?f`Aevȿ%w۰C_Ik Daқ'8 m#Q4SG QHC 8Hdq3􉌮ԃ17r Mp#F .9[X|ޑ.[`[{RZxit^=` -~3:]T"+~^@+UCl |("|(>?кXiD3 -_/-Κ:!np0 rV"c 5?Q-#gS`Dc+Tqa}S9HLpaE!vULjj<^׮V['J#(k;\0W6CPAASPԈ!4v8kTM@OA+<V:8#AZ(54G?DsDD,XJrh\& ႽaLCQbCM838d @ 2$@LRh@yEI^ך0 - -y$ҕ|ZTgהv̳i<6vTõ#,4Ń8/G99Mix <|p?s1 @R]<"ZݿL_h83Ѹ|9#hV:ݘ -Hl'pP<I!hJ&%齣 -OT†Hz P#nGAO" A<;|PAxx ֣&vgxBt0tr `.Zfm -ÏT\d(hAotX"Q -`m`vQ|="4-4^gM8(-2zP+Tթw A@(JFQ5ߔ!֭ 299"LM\S,0Iv,O"7L\6U -)bl3AaY`x% uD(F%*Qͅ@( -/P򗄗:>>-!(fP0 re(@1TA%qT=AS'%DA8w2P=i*+Cq:_dAz B @mNۡ9Dbm -1T֠L7q+;-T¸aU:W=rsoQ0ߋ; ;q&CMq XaQE`h\ۦ%VvI| -yP Wzug)m@@Qˉ`4TmA8D4B - Z20l - ]:AEcZtCaܡ tWFஸn%0 )U+[J_ x>ރ3@6h](A::2SBxsh(XgfE,K'ډc -zJM ah 6 -D;/ugTrr<;13$;(dZI$!a oHD˘rSSϧy2<#2p,Z P .aV39u l hE+pmcQ1.j$3@(Y$olA G\>1^"ʫuqDTu'giqwaûRN@({\l@8YKHB^As -nXR`5h؄1'ABgy`;CꅙFLIB-`#aFYm^ - rd?1Li - -נpA JD -:zB?0ԿhE=6xɀjZ E&Xz0 - 0uK $P|#eLGC -X$u H`l1$ Ѷy8B`" - I\_T2=FcX8)+ʐWFBp -a6F `_QiRʔ)A1nD!DWl U|'%p UA{طÞ@D1@H\3z)@$cI}rpV[J"fn510 ŋ,|ߌ)RA̅B@f|YIg1M=Ob&9؃=A_ys$Bs0hPs{?cRt̩^ --{MO7 5τ3),ljz :O1C̃.\1Ps/8ï P!Alg@mb>ZFU|Tq=DF萎6 wpp;r~/ ĥ HY$7+uQIx\@i ~@׎2"4(b:,器uߗTIEnum6aZ!2X6Q.'BL -L[LL$(] +Tρn1kpf }X/hu?P`Зр`ab& -8(rCtaM ]%E{JC/L50 -Gk7 O8وGxiX&tk_H NHLMe78܌Q=+H}U(:eWS ZDN"=(d%F BL xIϴO_4D( -Si Si"ȼ!=@AKTNpa)IxwcQaGUtxWF\`(ZY{d pz.7G & DQ,*3MZ2ns^'t -]HNHk*`~-ؤP" -( t @ I٧4bd.VFaj -Q'ڈtT2#݂*2xT/h+}> -̗0lψX=J5 -C -*_6 l=t %+H.O~̿sF ~w#)WJiBȿXilcgޕş8E$Zna@0l0QrPw=h}MEN -  (d%uw.oɱEC=9/xG{ {raeg-%"|f7M@'OX.ri & 0Rތ*[yK%I^|)Q㗐pg=P@! 2 -D@^,`5@?QYvTijȆDŽhta`xaS.Y$,41S$.HZԔ"P*R$sz!`< /hv+)bMܫL[3+kpvRĬ!l BY*exiRIJB -2axQt0-`XUCŅxk~[ƁƉDTsxx_Kʀ&Pia&BKy%Uh})qG#ͬ~S /KUL"eDzsx#lPN:^-vU Ss,VB@d:@pT}a*fflR>O5I ,.DYTBq f qds5KjB/T/!ޮ1GU*`G) o>_zN0%%AɃ;(Unc\C9@lBolC|B ʂU(w}oP7*ސ tE\M(g ,ʀO=7q -A p` 5%lM(G ts7zpoڍCΙ`,5 s 3guj-O){!'@hކ2^rs;{eIYTXy1BňNhVA a w"`m5Tuhi -C岻(&(H69tV! -{۸w)h0[d+CИ0(Βo \0n/+]RY- "y{SvBnp ђ&Sj=FX82eХ \ꃔ 3>JJ7 -XBM!bS|cX.o Dו f -F(R"E,+O -]`o" i2@XT|Kc`,u7h -^|.a 9/ -Y(?Ey`΅s`Z W @[ 0N8kB 316@j`bo.W. -nPe0` - -u5xܙR84ЊZP@OJWDEՙSQT= I"T*1Be_%yV܈P%eCˬʐReMr(GP.hP§8q@SVgc.T~Y!eXm.7)eHeND{.Ot>܏˔ -;?AWGG:YP[BD/80Z"Q Zh(mhtvWԃD -2˥ib8\ h"@OjzpATIR`(Ek,Vt8C -3`DcAZ"kIQQ\CDt8`Aΰ%oͿ|1>JJ\}nXx%"C)H3P3i - g*CKך^0H2Z([dJB )Y* -(oZ-(N(/wS7;*,G%=ńnDt0x/~HТ(W`%c πuPBcs 醅ڐA1*V6[JE^It{r&"3,~A~x -t@Gf^F^u%>a8+5E8J|?I44j0R- z̹ؠYeot " H1>'|g!j2E| -=VXi= ->=AB?g2VDn T3i$/A^=#Q:c|N0]& 0p<#@dŽxy4Ź~7"fN[:g("ٴ[`ʺ{8 8NоmE#@e_QX_]2l+e22\胯S:(ACx(P&#QHd52莓9FhQKb\«@0rX5֯-M1J~ȷ -wB*j3K1pRxC:a;qeֱޥ{{lGqg ș?:ωC` zQfX۠hif(2^%ԣRP( x|"8{L>0LI:[J$qR#iů U>?} 40 Qђg3$ˣG A!4>)r*)`-.|CYm;WzIR$E_O  {a% "*3ߏhl@A&EP>h@se|W `,5ӄy 7m^sÙ7/`l2f@ A8HHEoHlo=̇`)^I{R'С6K`0sr8MMwhM]p''0}7ĸ \WS}|iz(\.C^ @Eʧ%sFe@P<{O=+irb}8 !|#b6Q)% - P >|bQ 3p0psӆ&́QK 7uWUBk@RH@`H9FFtlCypJ #v0vEL*8Ҽ cpD5Qה -yOl=`iPe~,=~~,b:CNZ u R\"NG38 - *e ]@,N(G!0X?\cP _ @Lpf>;ѪKH]|GQ>x }Z/Sh%R -Uҳd+ `:#h}BGw~Q E?Y=Dw~Z[w;aoto#d$ ZBHQ(!@j=s !)h0q4 -|`UGV0 ->cwuҀ'x @)S?5<#8o! !pb` Ю뼪#gvPC0`vf32C0 jM!s.pM(t#XI5="כ -Fh8ZA`P 2S x@ROl  -K@ͥǬ&j|yD`2̕j?0֒Gƴ} M[6] :V..!D90k&.aE-Ifl ;J'^ѾAv=)Lkr-ÊŚ>3dZ 4MD =qsJZt!D2EF -oP@405MÕU] d( m(Zh7dF!PMq0P/ε')DO9=Һ2)dT) D,)h?]!iH.RHy70]i#+TS8 -97}v=LȓRƼπ :P=tQf)T#1SyR4˄/|CE; r!Є4#( ~YŌOγxpj`c3I`Cū(+T{V-$G -DŽ&B2Hä5+i)5.ru%2%.hUo(*m,'x]E)>uѲ(l[xϗy:ԟIZ҇S^6}ə"W8p" /*&FՖ HӯaO\&eQXC>N9Oh19(Ԯx%1vd`&W.BI`M#5ox2q(gA_;_kX'$0 "- -51]<_y^0v_xgqֈyMz&­$Q%n - {ϔ=0 SAM7VP5 Ǵ11# G QЁjxl{;y -`0)& -HQcDQRsX 񍯈ARI>0WSX WTjH)GQCE` M` E1CP8U…C} 0@LEb=a0> -1&LLq % Ahڄi퉠Q9@",OH `5P9釼q3TeS4`c~fWLƟ}@8Fa_>l Tw10 kx.{ϐ |`U>t~~V HW0 G?"|4-HTʉ9ۚjot_dl"i)%_^űLiN uYZ+nb(;$eEgY_,@z|· 7c;zG9M=14rMC^O6e&AǹQpYB4;X7q4u#9q䮸&_5ސ+){;uO{J+J&<i6p7Ή6Rr(4PdB>[` #p/>74Dfl#iZtEN#Eʼn $>ê0 ~atf2 5?F70B}bEU =ə !`%d3^ =]hzE{ gB;8i["|P it?ӍO>/|/t$. :s2w8%7+%D7iX oϰ> 4^#[!%Rx.U`8%by Q.;[6Aft_ʆJYC!w<> :7A,&#Z_DF)x߯3ۯnaR\ifGH~s;b5a? C5. -A"sY.dzSH @+) .X, ҐSr[[usl^7˥+evGԼ*%rpNA2 _i+1()8S - F_NU RRm%x!8Xn DVA 94z!~P @1rws_0s~^ ܗfL !v{ mzF>?y]jW\o)$XH'!?em@yEA }6>OX@φgՀ$aP:X* b rBah\%6X #C.X8пzCgliFC_I A&-x[ U -"S aBO g/]ܭ)g3@#+aXM`0F(w@-><1\me]y#.fh=D5JRɂR)%ZqJt끯gv¤|ZjN5"Ƿ5ZA8{MڝO5%Z η8?b-!> s~j)tY`Ao>HSQ\$I1#Tal~U\äN|0HBUD=v(1M@~_BpϠp~ @pzV)!Z8 R[ho(=qik $lʏsq?˖ɆlKARXc2 -T2Pr`Kb4wbTӳ - <:%=ari|䋇S {AD@ڎ헩aڍ - A1ʉAE絟y rO=]d${a=m:0jX,-Cp7xD}.VD]2<lhjAžАi2>2 @(m#Yo%7 -`sYCG0j N qEF.*Cj(@`(7&Mh" -oBАA>h<P9;~E}"C!qE* I6=MWhWHA5@֐XNS?zBOO>+|ݐ,;5٘d.#Q+"Ɍ8zѝfȼA_-zsUᅄ@x;&Wh/B &&@ĕ_؀ -63Iy71k me'/Ƕ -PTs*E/}E= '\jrLQ ߗƛ@O63Ha1 (2$o"G9@?`/6'ELU?N?  ˬ0iGR{ CIDT_EΊ)vi ^;ctH'P2"{$Jl-g 6d hMZ< +M҃Gťixᙄ `c2 -Ǭ|=bw(خPfxЅ&s>Ne[ByNCZT2XYkL )1K r@2¨A^YhIHK[ԩjb,O7,W&G 5kCXN8CTC9Bdi?nVZSTmTVriCe\uϦzڡaYS^j$@A_x -(ȨhcGz#:D؉,耶(ѧ5peAZ#)GheiWCq߂#b*I/E"d+(`A J;FOшX2 \L2<UqW05Md.dz?2߬$Rsʃ〲.nFUIFpԣʪ -$ dbyeˁx&(43Pd`+p٘YL^tV1pЫ -^LPV9BO3F=s°g!ˌP ̚@6U8^aBy}hk0H2\s"_=hϥ{ϫw;<%{Pbzs'ף򌲪%烕~&Rg'j1Ȫ~I_{)Q"XTnAx{ARu!H(@6`Fb3àwu,ZR9iX#ZԸh5 -w^[JsV+8Qd Q On5AC# `D9p>k=i5Ī/odvPj -{?Iw|CBg{-Á+4T*/x'yWnBĝBn"<6Ӽ8;"`m N_:peRO}1 kxSx36U@3lg| - F^P,Fcx (~,UssI*T\ ^El6ľX*âU'LCבPf"M{H&UAp'H - 锲#{`IrRz)f;C Mz"5;D 2wtx&]}0(=e-),B -Hs-`'LĜjZb;@<Bt7w>p' WD}*v;^:*;SBկoh3z[#aM*iJA6 tTinr}dkzt:ݹB3=bzZ-Q4t g"QQxNh  acȠ]|hgB+l5bEv 2k -&B}Oޕ$a+T}LQ\Oac xPPn/Pۂ` 5+m:cP٨ -<+q) .-k" -89x!~QZ9MjE)#ۋ;~cE `AX/? F;lL"=#ï/<i!^oS;zn=t$-()eM'KTVw$ Al\(ʁjU-T t!z(!(௣A0huM#VEk4 -Ad&Zsx?l@6"=dH~N()o - zkv{n:DĚ [Xg36/:83]@e l.UKt sP1B؅YED-JTyj2D`8Tc8 7X0Δ17@Ae7j'!Љ[ c|A)ԇR 6 V6Q*<1Ø#5=L3 .[Än7gL efX\  o~%B%B(po8ʠ |Q>HgpkZCQ"T7=7 EfӀ^L>qթa3-J_H8%cW*"lQ,@B> -Cc1RfEO!Kjha4΂;$et4b - 'F`/r`Ve )B͟:#tC8T$v0L¥˩^2j4\ֆ|Anߺ Q2 0T#+.&\:B5 9T ߅@'8$ 2ĄD G<\kGI]/ HrGc p{`(2KH}~Y<(x?\VA@T.ȃ" 2EpWa pj|>(Q|qPׂ<6^GEdx8TuB>\1W+"dX߄9Kc^!guP .a<0@ "T hERN)aPV1G -naB{42CウX<ȐZUP na I13.< Z+QFg8@ 3$ZRHs:R4 1y0KOۼb=aR X&S5: -zwBA7IJCFdfӢ03^{"0<]G!ϏA\Fz.ک*@\sd<%M7pha{XT" @&@\AqW9 dV`&d5]n&3}mCdsM~K{ޯO,AAbP:|d͊ℚ5/c&WJQ5dMLjMr†Y]@  -D5z>If.ހL@k}N\cfT2ӡLL^`M#)YLǗ{}iy!+)XnS{K7rra -jn '>cf#Q6,iJe7?hK`-p(Ю@<v -)/I0`A,03@0Pe;8Dd>OA}?c} 4m0I*o& -=cmB0@\;K "%z(PD(P&\(y2h2c"0kТVH DF1Aɠm!蝄 N⺎ ůc*~5BJ Zl60w9®5#Eꫩ8,6&e */hղ0{N8@8mdZ CzhyLͦyύa$f̚L{_; . ckh\TZY' 4.\&U-<*m} ڭ? O @ OX19p$] 1aQ *Pd2H8]Gxf9#Ch0!Hz42.Шc,S -ihIPUgêIp;*q,y[nS*'0bFf -PXI(o*[B X$Cd,̓*q2%e6UJSHgK&v qpl4( o+"6#g )b[qq">O GfA`};CȁD}1 :4|"PцlY$ - - W'6]K8\$lzBCA_4z) ϼ uyJګSFd8N2T_eL&Cip%b[Q*R'/oX3̡O>dDb=(IR; Yhfٳ -QK0\N\` bx+TX)l=yj} kh"*I"|gMFo+r}Z3d"·%ϴ-62$ }pNKha07^qACK\Zt $`)}z@ d`=*s̺JS.|G"_4Ba -\t-LC_lp ED Хј.BAH BYarp`8axADPbv s2Aʝ%5~.|`S4#b" =!g]  -ko q$xT@O3oY㌷/GPDFN!Q3@p+(RƖ&T{V$`vGl8 +M0$OŮ )T757@o>>>xмi|FΥ!X#Ӂ+(Nŀ%XI](>Szc{BzH9yCDT'|3nV%r, (P6I?B`ZV̩Y -͞ Y:XEŊA3'+w;CǴ=@%7`mTTٌ& &Ívv5hh,ü,܄dג$X0_OA'kj:2;pW>U5!bED2G`zR$6eJ֬y}\NB -?h[|Rn!>T TU -](|,۬feZ*)`C$ MQRl foiV;6B5$"NЪ(UEZg -7* L! r-j0gx#?/) @Zq ۞UYr+H~C]zV8hD*@sB 94CrKTK VN?PI`P1;A:Q O3@`K5\\, AKY؍K70,9\ @͆  Q a;ɀ1 d$j,`Nc ~ ]K('h <0䌼m. - Q0Ch:-jJ(gZC\F]Bb:ؠ w0 삁.*  Nj! ]L%4DX@ -mPb;Q̧I@ 4b-\蠉-@l 7aͧe;A@"@3sap "5ńZnʗt(Ro9yL/QƇ0 Љ -a(ݭν - BEFhcsȘAS~úfG\8ۈIGc4|ɚzYsƠ RDTI,Yh833xM=eVY &,aVxZH<ͭXoX< iK4 Ę&T%cbH[=Dd^L}=biʔ3Z& J)(̫`*o% .bF_f /Dž$Iz":Z Lq'ga5/  L?=c -5 [0\FC)e6evs2!6eE/|@ - -\HɣAzna' voE \[  . -0@ ]5ɲfQQlPPyn]a`C(u(ڱ1Ro HxC_5Z8t8TX2ՕY/>^ÌC}V?Ҥ$tE" a)CL\AЬ*kΩ>_Qzb`XNz7P rI֘A b+7 fTCˢWĜx%y0 AK.?IoP`)TWW= -~6>>L%AY 1.w b` %+hIpDQ@U=@_+!E[B\ d{W+R R)-9-t1:Aߨz~A -E?TMrFQư-:l=@ky(!6@GuBGLd[@)-Xt2L5! Xr 8f"eY&@'g|,Dir) v7mm2o0%8qMa}hikædc I|Nܱd)mMk,J{%*i$hZ8!1peu le D$2!8T ."+Q D: NM_[Ck~z]>)߀` ->!nTi.!>Qf_)]e= R[ׇNK@X0ǴosL~JaT^3J0De&H jn*mZ#L7%fL0&^:+ -Q "<MQ'VM+6p[(cR{N'@(p`4  i>?Ԯ (7O7R&C0^l2?\B%F/ zR!p%5`6(Nа$ΰH!)BA! 36W k[XW [L,aG~Q pb6B4I]!cӦ,3=,,J@ΞV&`v@h n>?d/:`E +RDI5vQbyOI@,OOXКkaCxqu+g)Rk\ WH`;#nϬ# #CbjJsC1FEcW!@\[hL) Y=eam`@6Cx0j\:tcMOD.{2*R)z;̄!}z"0aDF az_dq4wcQt 0a1D8#|!z#)*p Σ;h4^++?{X$U,T ܋YJyƄ_)/NQ#Y ڜqt6'lO_ܙ=5HCYvCE&b\fe4㪨>{Ox)$ &`$H]*t {CBBe,qNp Dt1 -UÇ8pB7/~>H?,F SQ@`0 !Ѐ0CIf@ OeQ\/򴖼$S4^m(˄ |%ͤu:ʷ I uX]5ga;_SzbXh`N&\XaϺ,/-} xz`q|"@ - pCyG#F_@Shze YRzG2O[PUϟBi^UTCee)V iȓQ4mN?BY7"K*/,O,V`{MȅI^PFLGBa1C7pR]8/SXIz^ d1M!uU^ &}Tn0+3^$-zbZ TH qvT 5>v3.` bA(4(ЄP5"+ !T= - g'C{ג#BEGUQP.%:&)4AB[/Xe[4ba86E2{@9Gd*8R,(sE(h*/®@ud^KU $ Wx ZPP>C|:m DHFP'XSL)Xfn - 7y3wf@t|EVna:JB1\;RK0QRP3AM ҄bF*URoLV4"L!A쫂&ԩS0ch51%rRYAYIILֻ4R]< '!8aVphUSw'8`Qb#_ Vdyb$ .j6JE"TX۔@wEL #p,ސ$7 F0d>c*.SIJl@GҠ{gjT!7M$24>scp*Pp 50>3`\R?C(ǁ ъT0Cώ}џx\jpƎA B!)G21hh cP^ GUj9T - =~#Bg>|>`4O"\.rAۀcLekhptTt< ( JĨ& -*@IepaA{ŠaԄ,cpw*eS#>3e1dIcuU 6ӷ)`dJ1hպEԒ+h -5nDq 9'+T@+? B0"  ̯VvkEF!B�Z@QtcāY -` WM~ -*\̋47#ip5*'''A=8õȆXôR1O_R87;gzAzf}0~s=^(Hy)LSV9|]gp}IIt^',~C)m:BPXdo/WPT"X#԰ +LR \N3|!wDŽIc X -!l9yZ1ZAys8yeL&feD6~t1O Pd# Lz HQ)=%BE#hA5Tt~z;Uw X"ZQ0 ԣ(&tb/djiAŬVeL' -X ^|uccA -h+T뙃$X$.zW f?f30c -)0+© fD$9{$aV{u o `chU*$VjRBsj"7cQ>i>(JV,**`I93{[:Q./xIn.23MXA8u*A1:+ywAWLۍ>8O\<@*!l9PoO;k IРS+)5͝FD0a*^Ox!K-" -Q8ӢjvcPIk-! ޲ =Iar/uHt`|wKkz4k L:%6 Y\`jQ?zx0d0WB%9w 7W_B8.vQۂ@w(#0Pٖ pnP&қ'UB&R>XnqD-`q$CM6f¸h98Bc!=7Ͳ 4+g31eϴ%cȜ7i}bnj) -ׄKsF!XD.Nl=Lh"j|B+#1V kp &|5$HEpNо.)tYژT*# xx .ЏxGS8qe@&L2/|_ ;+ |؃03xs wJ)^?.#hU8;LKXpC}fJ @k QBu҉ tPe %a`(,u;8нJT+l1mRZ01(LH m(pPE~uA*hR]LXG`XX 8P ~J 2ێ׻R`=HӉNtL@eE(PAxѧ ,h#&dG)+^3԰XJv=Bl*nėf6+05%xs(a"AP h<="o$9 suȰ%0F2Ci ŐbTui^5J85X m0q<#= z ̔NMHgҾ -%pn#*:v!.!O#QLX@2l:1čpI:V y.'U<m ࣟ><> QG%F lФ`M(x@`dS(?8rG=V Nh@";IϴCǴ"wCi\]5>A"g *Z .FF;W5)C֞4%G4)bmPͼ`KB\ 1?3ޣ $ h=vь!byk -#!=J.{3J -9*X)9_אVm#f< EHvBQOm_(K(|Vz)o1A9^+Tg2KF+5`Y P < D{ -`W ao3z`H7Ab - \I{KjP ;gh#AvO j\g g,HLP ":IA!& -RݔCglsޏDV_,yƄ"4P`wօ%WĦH,FXp=QF747ֽ`P]Rj:fI6?x4hU*BW(X%A4^`d'&%W-6H".ɡ&e/B1,A+ve" 暥?rK vi4URIU~0 (h0F@06d3V0uyF+U 3 6r;BI2殜CYP{LuN"a D#:Rg(A%M7}7w%Q -GT -"h;S}@ O0`VѦ6&,|}7Xf#\9I Q!Tuo /Yj@9*RfajZ@_kff+fmhK$Kilo?k(Y_/pY w $ײW[@` 8ίxBaXĝMh8UM9# r?`0ϱ7F`1-8GQ yT-I1NLXQ[CDh>ylȫxϔ" -| `(0c8D\I?% s r0%a@)MK Z!(Mh&VmI1ȂSndKa$>z̴yKF ~V3 603:rsD~b@8JxT 1Y*"t17@d@K! -d %S[BC|Btg]c(b#CuuSyY¦DϊSjlMuW#b^o0_eGWϦ*}1yߖl,V:=@?*~-LDOBW0RsF-yP)Q -| I"Pe PB7%t_0Z0Uj@ŀ -ư%WX胨< -U![FU?xcm#;9a%r&Xd& ,@;„ЇHGvSpNpl:c=t' i+rwꃛn!B}PT' bZ۟eaG31>}}}}}}}}}}}}}}}}> 1' -jG xX<@3Cs],5qkU HOBhCTz*-iMsb$g'_ )& B0Ű:z B{} ԗ#b$s0WD Ϻ@?s =쐖 ?}+v'ߠSP02 AN>R^%a'kO!)>>gggۥt)\gYnI"I$Ype733Xxk>xF'b_F?l)`tX~o|`?7GџgH?ʺh"5ۃ,I!ujdi(!mggC0X >:@4h>qw~1D:%Y4@Ѧ5j>Zyc**3 ?XUMDH%kG AGH5b Cճد?V{S0ϴ׿؟H'pmqqorz{gooyimymu~Bnx @r>>>>3>~miO'ǼQ>{[d^7c9_uOY\,$8?J6KQQ:3o :鼛ɼShQlOagЧMԈ8@L7f*!1AQaq 0@P?Av34Ucτ/S uwV8x,-S5O><'k|_~LΟs~,V-|#\.Ljg{ -ZZOUQ,ޠ-&rQEb+D%" WpOrFVRqD lʣ*6nŶf;{ *&H.9 Kn+ rո^#H\ -bP){*bf<IJKӂ3Gľ0 Sg/H>SQ@-"ԹeEpxkx7:T.Q]beDSr1-6M7U7eiu*e9wKi^cWR6X(&+LuH{s"Pk^d[#XxXkQG؛#P_!f=.!Y[cPG!ozq&`SڞI5m X e-o101QRj.U=i+Bw,VlU hf[u*-wpIML .UMIêw3\Tq@tQzjT(o2JGk=ˋPeؘe&մdŌ]K:qU*W -j) U J닍%h&&noLMpܪE\)·YV͔lS[˱OmaAQ?RގUd0%TW)|E'H_7ÖjWk˲E=r햌'RsPEVXS*XUOc7k/ |\r]@1s|AzqcR1)`,$q0#]GsXblRl˃m ^eK kmseJNvW|1 bf2zP -d2nBTFr9B8j/6K: Pʞ -R5+:dJ*"pq`%1AHdEl-0E6p=됲-cNmW i/*fu:K dŸb \ u.b$Nap4=#^w0#`\c+AıYLE~i 7)˫=j\%Qi|U"n.jZ4ܴj]TO\PY`:hHLܻ V1B&+ 2"3P"ϩA,E)EFH:%JL\]``0Oxj5/34Kơyҥ*4*Alۋ K;ff9[Ze˕RT3P! ԧÀSĮ;G Q - -JFާ̪௚!{UKԶl䡖Gdj[\- Ūj-w-fַS/3;qN3{u\YF_τd-\DHn<\3Q p(1q0/dS(ʸ<..C -*f5>W$cQfC)eF$1T1,c!%cž+ܸ+"$T bc1 5¸2b$F.pTPpAot2-C9'K\X5 ܵʳ Jp>#.TIU[t̑E1Ōlj|7hQl׾ qsX6P5l&q5Pljd8.6DbQ) Bjw P&B6S3/SB2&y7;{B,2MEIp8*V_Пq٧H*jKb\^.ø~~$.끃Y3>UB/8˨d8F7\_,pV9D`V]_ \K|qbj"T2xKǒ~7o؇hG709"rK,⸅C<Ɠ^رbʊe&eNԩ*h+R .qw*#SiǸIܺI|YYh~@ V EW^cMFcq[u/IJŚ\GPfRsSPҥ|<;tAqJW vAd\ʽB\5,YZ5M.%,:RZ1&ʍmD)C,`HUƈĘ"#|Xg<٣k-*)Fѩq'psP)CRUbA+9 WW GIVE2kF) /yK6YVԺcpF+,5%CV@|S83 Iv©L\Q9 U>qNa`+E;.,w~TCKTxhz> qhܾ7G~C0 ,x Ko/&cQ |beY\ő]-|.b(U=J:@<ɋ qpɗ.m,OΥJ1,Tn2DJ 2Xf`d|bu‚8-z 8.;8[eQc7\[djl#"C5AeXQ5W -u(5JAL95Uw0n(\KWhf%K&a,u.&Xe\VՆ!+Lrk}B͒bNb4\fRiru.oW4^j#R[eT|L -. Kc33>Jݘ1\j~% QcPܯq>`ύ̪|Jp}qF"f+2DUuS*8[0,F(*T-Q;K -_]'F3*oxu.et4pLD QpFXWryL54 ~ pk7/\NZ&!7fLƮX2'1+\f"L281Q%a.|T=İ"u Hˌxp#|i1X -jmjVk vgPᆥp2oYr/~Dn\%8 - /,̶,m^o%J@h7 *늈5YWQIa)'pR;33$%o -SKrarȱR,^TJbb8IkQbK.:%^#Ɨ#}J+5sD!_/B%_/:hE]θhxu CP qt 'r#Kp CԻ*LWwLȾnɑ1>wxX>-JjZ-%-*X) LԻ1rRn:Ĩ tl/#3r^Wi?UD0B@XL:vT̰Y[j4QPDB@QK#n)w/:ĩ`!CwFQ5 LC,(#rߙ@tQ1PV]#YSjfVW%̤Vpq\a;K*AXC:SgİX <`7Knpq43x23|u,W u U;KUi$rxb.,.\)"U<ኗAV\{l`Ը],TPy|cljRڨ~jWy5sR ̩W*Ts*)>咆:eL!*T1/&o˨Ԩ!IQ*0!3熙g,`nd*ܠ*le;|v\b61̹0|L$>x yԩ o] Lf xLE QMLߩ3(2p(5IPꥥETn*^fܨe8q. /9* zyArtKqVVJ4J=$E1WM$ĺ1PZ@DeDQjkQbRjUa2B/p*؅}eDQPCr0.^0$#h&TxB\A" z*5HU4J$b݌:d TЖQ,q0sa0pNȽraS0J8QTY>Q A[G:o\g)~#qspN:&yjθ,^z|ˎItT\bj5/p:Nxܾ1Q%DBa1*qx?\ x7edrWĮp< -<5$7k @UJKUDFcθnUKy7ŋq:b:5DBTIenF<LKoY7f !wqp4rTf縖MQ.0omJe\"BʖBeYJbqHeta{ n#::KB[c)̴O\\ԷV_-|Ge6,inTjxT}pnʬ1ܺH(AmG6Εp}]#>'bPr&+@CJQ({PT-t_0U ^j.#1UKc1(‘fnWݮ&Vg5._޵QAq-*#*sL9q".A0f@MyQ:]̿LьVʞ岛RK{GU5;@mI|MFɡT%lt" Nv#R YXS:O@,ex:ڰ_ HH_TCQ(s.ZI+h\ -B1s H<,YYxJ%Wxe\2/)=fUokui9i5 ]dc5+jJy38w;Pcr?Rܨ˗. Cp|1%$PԨB c1LM~.<%̃D e V[: 狲&- B>"!@J"W;>&APM .1 3 ?`Vb ܞu ]*xԼKqy˺Z>ɿ;cQX+RQ9O1.1Ѵ@?hʱJ:c+rꖱ Q.6STܺF䖌Ů2 ~wʛwÂkrĪl q Bb4 $Al{[hUNkA!j5oE3E7TRk)PUڥ' !s ;Z6Grx<4Q/J~wt\(6UPPT T!e_W$Ske6"*:xQXbȆagD6 kd͵Q` ;%ʔ@ie_fל'M+a -rE՞dL#5pYA2Dk*ʅX]v,ߴdM ļE X;"0" &r~X( -eR"3kfvDM:IQ@U3pϸ̂Y>+5G B& : NH+(@YNYƮłAJJ mT5x\ȋ脦oVٻ:òh-" <&>Ժ>d]*X;a2Lيܹ} MXX1}H#kD=rq\C)@Br_JLhb; jؕfc.[ÔM3 Կhp~#R,*ܺ䫍> F!i! /+upuz7|Q nq Ev˨%dO)Kj.41^C#e[&}4_A}#KTFڡ}֣% -)eS/MO,ǙQ#|eXwR9Wܮ3|7\&t f*5}!,4 aAZpGxwW(+7>$38ufyo&9I07if K67R˨UVV mα>b`ܯYe>bu34‚? %ི ܀$vJQ)ukD\ 7)3x"4@zzc-nGRKuhC+1`h-%4Zv2&'Ej`.u9QϽFX%j M1$/exv$hR-bVcJCT?s2rhbիNBw7oٸLp:ƵqɈ v.4KζGea3BP4*|~UڼT?y4 B)e|;?a4}C*|ef -r}cX|K㩣/H*%BYsPf'0-,0 T%]\b0isZ?#0u?$`mP-Z*G, eeDhPPۘ쎢 X$5zqD^"~awXirg.04qDd 4ÂqâmqyNYwOAe񁋊1|PAyaiG~%ɗKfo_r1\TxUb1q}T5M|3mRWHqB&c(*rMBed'0 ҧED!;gU+ٸo6rӁ5.Z QXpQ\>F[_ H[>,$$ -%MŲI1+# b B,r:Ff.ߘEu -bEK˸틦WZj\,FRJT?hfbq Tj mn]bUf%g CK@T!3@:D] b\B\ "5Mшj^$&%%OAHK+1:is* FUf%F"DžVb1EslŞo/55\H(IDѿ,&ڏ=e:a(J -%]xtM8~PQCWpDm9ho۹, M[78n!i9#КܯV~$EUWQ"p^Y~Yo"dϥ;FJ'jW;oqp}[ۨ $‰~#hVڱku"W)ݢ|ݭQED?P&a<š E-tD35(>&׍(q,jYqOpPb Ic7XY.+ ܫ$D_yZ>u T~$ _G -IRcD~Q% *ʽ%MC)/x:o| +n d[S+|RYne@Hgko <ߥmbقY\MK -Ç-u/1\o/ IQ"J'\YUi|rrk,w.-lY0} 6;Q_^܂)ϕLN»&a'I`1 K%ch9]Ĵ.0/\p7Ńj\G٢RnVɹG&ҢT].ae Cڵ>EHiEm,cDܪA -hzqWl: h+~$ -Nn`}pRʆ^BR,QTWֆ}nUfPDaEP()2ŽK3oJ5ntS @o%AYoz>j%6Ξf'g3){&ؘNA'._e ljuu^,Q6V\ak.,d ^yi >#.6`$ IkZ,\Pq>h%\oW釢wTT :cbH(c̜F:56;@!'Fs7֣%4{H- &SЁc9x]!-0Dl!=og@^T zu1 -[74w,vM~HCypFR8 ML qs[KjkuP)En_9e𜌧Y/*Jf$[>SpXԶrx. -KFŲOAH>حdH? vQݻ*Hä́t2?EBD1n¥JuQ5RPf40+)ڢI* --\*ApoR&wu3CNLmej YESv 4mT%n*X~\/]Ajj Ol ]Eu𭡰BnJjZADBC\QZĪWuvtfJ McEQTn}2w,7NCL,FP;wD)PF$6x:(aaw U^w PypBCAmnA\r۬Nw[LKIڳ%#npj,|&* DcP?a^`9C|y3+fe_Rzk,8YL s Q _N,6<@[c=@ 2Ww?w8nSmU˃/0[j|553*V? -#_rf3)z8ZRTWA| -a1Rܤ[/O=fqL<0E䒴o}mN AZơKl.wAB^\kd/̦z\Odm1fS+W)J ۡ!@Wè- \#\1ak#ji>-ni .rȚQaa #hi|2vPLRԶNJiQè)@xo[+*֖]>ٳ⤭aA\L#U0_jm)-kX^5 Y`td{3 -" =T{V0n!\@:UfS1-543U]YJ\(RKE@ψql/n#vbc 0খ.>_##N @n;wYAq1 ]/l{+! {@";e.\xJ`OT;+։c1&*U*Ge>M̸> 4eԩqBc-j2 K1ٰ:H tEq.R焂 we/5UWtwĨ\aA/h<h3 xӄeަ㞋GU8BFz.K/5.?ԽB(%ʉfX-HnXE#)ZY@a.<[C>wUA,0yad 0p≒UQ+zEܰ\˃aw(]J07hJ.WTK3 Lwe DKmZk y޶kՌXY3*|=l& 7lHT&NF%4WL& kl)C)e@nRk.n YDD_pP;Pf-*:.Td g](KT~i*?yΪfR%pB%MKeU5a> -|p0ll.:\!:SQ'\=8!hu-xQ IU:댐^"rW9|[Z}LG2x:^#,.5%=lRwbD2%ޖ.\%F{ wj&+FײF+gjRb3Sm~ĂӰ -c"beUb>=T>TeơRT##1grܜSPBn`wJiP^L_%EITوwnPJd2`h-%L3[VDPPCQp* qZ*c [h}?JLNUeeb\rP⪳E]Uee&8 {FRlߘC;!Q ;ݥ N0˗u(4kuCХe]S(nY>FZ hQ[.X -xY "_*xPMK 8R8k)`|N}єZV a JrRi`VFUE5LA`x׍x`~說pq3FFLX0KlA˶0#ij^Dĸbz D+e1_nVTɹ6Z"%b,j>~#ucOg88rZ̺B&njVsVdQe%:uZa1 v^U'GWųȺƾkVlbГiVL0_^4vy.뎡RQZLy] ֡ ]7xjT^hh&cx 64Q)۝j(F vǠ UH!8kK8.nii`OX0*j“q'B7[T|Q8IOȎT-z%O9#m Uߟb"'O#:"nI8^#+R)+op_([7}Cf췒:#4JI7Uޫ@UBā@N)_2͚ʹM/113}Oqs[ -Lƣ}e-3˩x+xlup8UH^1%2ohƃ!c{2(b` |ݓ0Fԉx<2+RX[N We+" 0o(Sג~P@yp.ѫessI"8=[֥C5UDg@z&ݎ"1H԰r{4c}Ta+nU52]qYlFc<0% ?&戉S/^y00;H{8^L}Gg [f߈JO8)F*K ql=f X,[. JM>¢Й<ڥ1[töڊ#*}J*ZGy_R-zs,owm8.4V):Z<*%]ʋ -)0Rq2Zn3J`x~uab]x42Cm*WJd \CBI1d_mHqΏ6l-fux/j4*aH)[Ͳ+RQq J -/ZBgw.%LVc#Yxqu.\\f<ïDX: u*_vf]bP-o<0pE{`GqCpRW[X{Ajs;k@V -)nVT {;1D1!X9hwhx*j02;LԦF7\ .5kN]:ľ8fQԢi1sS\ydji(1)ZuDtad[+$8(FY8ҠAJDxHq{eBs ЪbUh~;hHj)ֹGl+WǐVJ`ؚ@9;R#)\aaYB,]!qrBˍVc~e˫-߀7 cPV}2ƿJOA~R 'w*\ZLpuGeӎRyANH5I*-ew1#Vm|5E^AWw}~ -ikeLAtͷ/+ &}sZXf_,,.)otD4Ԑ[u3[KʕhMviX[T8. 5P uƀ;|@kL!Da*TUR u0J:hA5m2izw{%_Rښ"֙fW-kO胢FVHMl ϧіX8er+d#FChK5sDAm"ߝ"+Dc cqK*Iwթ]V+LEFT -)١SW2ut+/Wk7@-Da[zyש#+0RsZ?$Ũ񋻆nmfywp/||z[qy)3u/=0 Wm !m:Fڅp\*U_"Jy ( c|},x< Uw).e pؒ{7PPgpIrF+fkQ#6}ar @jFӷTك孹 2;:mѨ1/z`ql`׺ u5n =$9_-WB7gÇ$$93F{ /5*[6*WVu\0 S+{5.^*+OZ\qtƯȾke59w_¿QKzLTPzZ;LK\$/|J*?1x_rSju;f R9#rf .S15X.P*ℼuW)+bEfYn:ilfRjK!ٜ?1 -Jv)! esmc8,Т7˗/Sn\_1w*.1u [rqqj$c%sf,Zڈ!u9CAH.zz҆!R5cO$'tQJTåJ5FPRPy! N=|0a`TcZ -Pf@jcXjGaMrkCt}%!j6MLPIyZ]G dF%Z˺ 1Gpm2]⎜v *:DbwUSfІ\!Q^zV>f -H[[ɮo^bEJovxYDjnaW{Ko.izeX֩bYuK4ZD?ܔԒ©R("Խbb.jR3{,La@qC(wrޖrq^ -gKBՇ…;"e{ eFXS6ʼ%SRґa&jcCcSVU!'rO'$U- -aL*WiqVTi9.m^9U{VU.4Hj%dʧrO^jPe|\95\fa*RsথY 5R-rq]-6FǍNLv˶+uܬW[;X&}P(Ժ'aRq[`pbYu^VpEش$+/AMvfȉqrPz,,'=Tb+wA"rlܫФ@9*;`j.]" -K6ƫu\4‚DY_eҔf[x¤B֭/G2"-&#d{n'_p6l,M:ߚƨj.eʈ_o -+Jvݿr9عIn’\\` $ .{0 K]PīnRK 2F[  ېdҠ*0~.:,L˼NV"[0fC4KԶĈ숓6^p>Q -{V(%ٛ*^eb b[3# - 2I[a.0  XXhCcH Ԫ3Q:%[L+̿3K&%cRFgq6K9i%e35W -ޡS3,n"n$R /P8]uc0K%poƵM|=d tW8ep7_][Gd}fi?&QpR//wPp "jf m;8`to߭bevӦ臽f.ljSxz~vG!w -PU3MSamDfp%J#|J&\pE<.%SwUܪ+|AuL7Vxr’T~ˌ!DxIPbX7[21NOUt * _Q(Bψ"ۨI()57Bx&xVr*6*iSCmEQ1DFJ7- J E;ۅAuIq?7'44C=Wxk{ڼU{P:[/].3:!:m%=7o50j,D^SeJ*%aL+'JJgeRN.3-!ZKxzeK-(e;|]Qo}d~,%EJ\_Y/*|쟏|T']AEpxCW X|\/9j -i' -y bmJЅZWBݱ]J=dRjg9j|Eo\R%jge.Q[pLWr[, -+*rʦ#mH -#w1uGLPLBVRGJ`w1^ jYR@kkU@pVoJ8Xr娚n,R%@}JrPeBY~8H0Զ"U0-&\ O*U~;A]E #S=,BU -Yt|GK.󹍵"R^hНX[%xpj]ՄDT0L[%& IRѲ[ )X)=VZc(+DHC88necEΥ|Lp36 ds b52a6?W*Q[;!&/\cHR\d/u3xTQ11N(d&D]VHq,Dlg3ȡYLs8F^zQ'Uw-] Uj G7d8z\6֧$x,"ʢ,tFx ܨᗎԹYm^+S1lBz@׈er1@DpFFX"Ù|[mEVԺ1Qj=jU&UPj/U}K\$OM@9/egWw_}h tt3q TVf/${GxLpPeV.-"(MKg!8:F5HCf{7(\hC|̷9ϘVYAľ4}!ՒZAL)YԽ*x!@p3%2u5. 2Ŷ6$Du7+1*WQ - ҽNK_0+P>pڋkڹfqk 4pبJŻ*jE%@ Ąn ݵcҮ7Pz$D -\/5/Ցr ZP T")-QꦮWyJR \J.&jR\;\eɎFd||W!f - % 0˕OR\j7+ls~APO -n+R*3pe )LP{L/:ؽE37T:"%OqeqLib;m P$%mdnPc˨dK%ϩ.eMQq35.RՈj08%rt3ٺIl8ԫ]jmS_2.eP -:W}yJRB%?U Tip>/%9!W` -kP-!,`f8.%3\? /tKSĹQjuµ_~l`qyeJq -}L$~*<̹|T(% VAoe5 V,B70'PbRqEA+ 5 qV1!Vߨ%wfP0P'jDjq/.3L( j=JNSX"Wpyװ;w2C}[3{Xū\hćtZ}~J<`]xmrBO -RBr8XK \2P㻮\sGr|OR1baJ@fWq)UƸVJ_;1)OF|§wRbgkj.{10lk,w)̧ecG<-n t~n{#3Y%}seFQKz#SpOeԶ#)!kdw'q=ܤ{"I2;Jۨ haj-ͱ32r*Vew{1LI=HA+ IU)X`eb8p.~m,u1H|m1bc^)0$SAu|A5Z5u$g(֌ߘ%+5= pv%e?X`CQuȅ_dХU WQVnzb{`TpA \\;21jԸJmyn\,ff/oF3t\xFR%S3čk^%LLELF52#)8Xj7zũqRJV+.mnʏ"ߙ8xX4MjhLY\6,S"ЧL e)%L-cs,AO@x%)RfeXqKAhpp/XUAm$j4)r02U<#7ĎԐfx*5 RUJx5>xG P2)[щ  gL )rUZBU -xv6Tic -MׂgFt0y˺ -*ԋj:w5\J1.S-!ZV23 U)5R`:-Pqq BKF*1ocMՈ\f R4Y,t*-.-h# kw_ropj)A)υ?8yQaTsgmO \C*8{K @mܵo|c*b2NFj& JJqJ:&8/O$)1dk6dp\= +r,2JEVV#Te}U]R'I\a+\3W{6@rʸTG\TpÊn2\S[|  -Oi+F=]HksOSN>@=3X:I{0B^\'2%>a2[3RPe'`-@L[(QrLUV%Ա/Vn%C| np|dy8c[xQ1 įc!JuH&H̩\!Q"E,cu:ĩS:Jn>oK9԰ Y$5.|\ji$P oDOa*슿"`?oCR ø2$nXjk (YT@ŞÇqcUn4Sh._с Vq%l>pipآi,WL& s%VflVe>l"Ԓ9;?Z[f̂D[Ľğ0xO nbd|^c2:2@w~ﺡu?A_ c<"*Cr~WÂ\#A p>f]3\q901\Q p憒cZw  /g7KZ/zYɍp6d2<VY*Y ^ -` (kֵuEpn4u w 5U JvX!+0L鞡G5ȓRD\ -KW*|pqdmV0lur3 E\_/;&5 fG<:cg eqrKT\(n Da`n/DiP%j9/rĩOOwhKE.JKs=Ρ2cW>%p`"E *+щ^L(J3N+=+ymI]Kfˎ4ڔ> qq\R}!*$rܹDܺY B*|_": fʝ3jJ3˨_dZhl단|f\\znj*n74kCiHH>i7}_i(:٫Lqtŕ]t(z~z@EHq)V_rr>j6emKԍre2ZKQLb+U,[CYQbʅ 9Xj( &LbVeBu_Q4|7nRZ1&a=.@5]*uHL-*p)GS01IZ9S,&~q”e'pQĶذn[rٚ2;OL!RjW, 2\DT/Kž#+*[P#.^b.^bWM8HKW/\f/\). ."˖O)UQJf8e(7/,E Q̈\ӈ!k^g\(Gmr:|ɘSJ?|o!_fT`%n/ӌV; }S7 ^WQˌPYu1MmD^aa_,5.ٹIhh#]2\c0#\֦x<̋ N_W⏟;!ʺaFf2FSr02Aunx_ -oXwQ[#*[Z3odfb5bѶŅ/b;D^2}K1sI;1p]1S'Ҫ7Zzqܓ&N*نf3U seaU6YX&YeQ$l"˅5 dF^b|<_;kS[bfUcݳ{ ļslHcrNjf8~Zܵx(!fو,N2TqKIs~b,xw*.10\y_xpaT€2ؽ#,"@|͢`ڳv&"LXQc+Q- AMd_|r;-DA,QUnri%S$ևc -ٌ[Wx`Q%z5!a<_lS))O|5;ig5զ>֒hn"RKbj/dt -2h9oRf=yv!섾m0FWU;I|ƅ!70oASaEV!6]5 볷`JJH1uP\}E3nꍻbn7m]A"%7ҥ 뢬txT*^lN ,Q u -hI` -cBwlWz{Z78J*,a|Z]bX,*W2[PE(BM8Dcq3 -ƮkPng"K Srx ua7UB sfoH&(0n|q^GPS:ڊ@i}1a3Ҁ"-ܙ. -s1,X<]%d{{ >TzK?ڛ؂ma%x]Bv~ O*i FťjsFu V~?Hr%@*֑\4d[fьsBfijV]r eW eE/kKDY ߨIR.>x;-RYQqLX͢V$? -&.:'T3,pK)z't\9^\ubT-'wsW:`k /p9fG31)f4UnS2%Mfn6ii!nY?Q+QʗD̴OSBW/)[@/)8ZQcLFx - -,eC9ob$~6{b˗|1(qr?rU3RJq5ƁIk]p3\P3x -= wl>^%DOpQx\:7 -v 9a꽚 f#X_ %JT/D"&-PJM]et+eov#kA&tv#ՉTܨj:p;Fv<ЄA< HOZ 2}V4ǫR˨,Yjꢖ.Nl= :|p7/A Gfaun8\b6%`KeVJ{OLN-,\*Vzx<1YܷQ<2 - J+<%fs/{2/W3l.>9W=0K\ɻr<_6_K-7qb[qWRޡMpAH9LԳy|8\-RR?ZYE]e&?ZW%{~ߐzxXI&DŏcWMA*#cSќ;'_^)ׂKUK]JnV.7f|ķn+Y<:,${@N̠<8xmT=sz U(񁚈m(J˹|^!, b^jU*TJjd0JF"qUަXbeuydYN3ey'3x _;O Bo,ś%_j7r~,Lw/A+\WkpWdmP -R`[_HeT6苹^Y@3>-N.NR:qQd@k$[+ƱD)XKT.R4k^fa)L^5늄5Rۋ,R?\75pPġ 3d3_C/r[.T.u3<? \rA|3URuDwR/bb* W(;V$rOSX`V:-3]ŘJZjj3J-K6TPt⣗~HJT6$5vQ=mk4xx欕2ahPIKW]P-!dݥ)ٻu*cܵz| NW-;tU;BqN9 ,rGLĬl% -AIhnuO>m.tZQg0SP*[5 34+6@iV ?Z`ӯ4=\J7\Qu\R/re*̡Ր*si6K4@(gF-fm+/) aHʗC <2<"+Frnp%]9q.}.($v! *Ab\6Y.f07r3*c:qe%*Ձk|-<*T.u0K UpbjW"5.xYIr8Iu #-/jb2*phJjMl'~N?EVjc4ԠFBq=,nO -:YC-Yc+ܼW5|Oa. &TJRj+ij2E"OGR^× >,́VV{$#gw)JԸGwKu-w m JW*%gL%lj2E\9Ի+jnu.\UFWKR_Ǯ^,prC?qRwoR.kK4cң -K,cW==̷]KG5*#j# E1 ?\-#}Kyc5lB[ k#nxz6%gZBX 9 _og0F*Z\ - mC\z<1j[0/&OZ %D5ρb"ܫC!.Ae(Srd%jjRagܹl (]`fgհΈ-m.#;UΣmA%\.ҵ]3Wu+z%Nd3 Al]^\+&x1oz @h#KQsO%t@^t)7ZF3Qj.ImAm Qn_4*" -Ff eAZ.fT%YR 7AT*DqЁ\[pPu\> DE c n6⁧M\%m?{<F ZKAxe@yM@ftgU!/ˇM@7R,VCLj|:8q<{ES0NDžmʍ1RcҸ(\*) F5:#dԶKQ.TeL< oDc.W -_Ij]j>_@݄7X 'ؗGp>f01GENbֱa.YrAad6cXR.:IJK 9a-2bkr-HfUK Ρ+RC+SPexyQ$ -O4]͹VX7>bZ n䒠PǻDu_x[=*r~\o0ӷѹXef0wǹ/F&Ƅ!2>(6To%])@Ɩ{EUxW-x3Az̢.Ošz.7b5}FñƊp,FQ&v= ,2֥ԺQDzkܺB.̹/1sԮCMx+JfqEa[*J _g*0j5so~7LuÃTw.\%'+%eYme. M<JDڻf^L8ֽ1Jhp+ܧ7 17j?-hZXg<#5Ue5[3/pV\O3C@[hPc[LB*3/VxD xb\s01 .xE\ "|8U+U:ydIL4ޭ?^ ӎvjs QKzE:ij5Z(Qǝ M%4A pW4H*HKcMQsl Fca5#.Z0[pA$~?p]Jq6wWOܰܵoU>e4\ZǏ7'eV&`T1 pxb_4uQⷘ٨_qV-EG^Ί $.rNyNpQ15d܃ !plпlڨiz!W  u%S01noãڬT+/, osGň,=5GEYtjE`T`˾.Zb71Re*d9 -x]jznR1S 76%@U\ &OuZ -"MqܰwjŷIOv?'-}ͳQ|^ic_ea}njG!d7L#W\W|\xqkܸq3ImTn+ph0&3 Dsr8ze,U9h`ZMʁ1|++#*[W k|^++/0(sKSd`Q.]w7\6ԥngw3] -Kc5@aJnU5K%d5qY&nVp047Cs7\a(Γ05Sl&j:T_#<2P) 猪LDjmwFRFP+=:)Gjk >Z b#l{q3*'%=3'D6\cG,%x"[Q=_`Gh[(4ՐR#jP˨T-@*u JMRˆqs< θ!ۈ ʝWje#i.X(-;Y{OF5)u -xHDnZ%|1+zπ5F񎫈^j0D̹o&7d9@cڢ?Ok?lk4oLrm}X}NEғ73@1b*&+dWHnKfͱKWc/Tj|DԹM˛n EMt cmTdZE{ ({Н-d0s*c`?I1k3leZ7*#"ϲn]㛙K-M̃2j+ƂTeIҦw4-.`̧Pc1R;C<wXPzY{p(Lj0Tn6-|lĥ/엊u +!5Թ R]FTq#[┮%|Tt/7* C5wk<E<͟ܔ|;f( -<<߭4_?ŰUzc5ejbkpUZC::-KkCV'!P% -5Nn^"*ZvV`Q06\s *K=MzE#P%n\%eAeƨ~\?!`)Y|j,iK&k0}V% ?Ƿhҏ@faNa,u<Ϲk䗾-.i!*2MBE Yfn-B A[%qJ8WMB7 wMOpQYL-`<(M)e_4KF<~jQbr^M;. QGpZi*W4[H!qߘM{<6w)J'l -k31?T9OSXKXv> -`\ay|}"CqJ=ڵE󚎠$2wcKr8;n R\L^'fe b.Dj*4d*ťjJS 51Xpx8JFU0ػ9boDq!؁8-K|z>zO{? *46QL|5'B#_G҈LzTyviELP 3Tqx;*`%pUB< і&81d&x]}˙vc-{yeVjRxi oRa_˽MqP7 ϞUU|O pM$"%,w0#nRѿLY宫JZeZ"'evoq[5o -(?e0I?u?⹻/jw1 e}zՊᄳ3[{#N|%k8EW ^ls8$v E,rhD" /gsXZe˦8`M~d#Md_dE -̥H-͌45(#_YT O Uw)Hܖ4<&j0/4JG9~nZdAS :_ tt.brW)e<4NQyhRVag {ķdZ25S)_)TRpkb@mvʏ@J`Y"rRJ` ^]Jxh'P7 -EZT?3A N4I&JTItMkQ/4 FGjWQ`ywJ P+TRŌ -U; ŎP%&9"%.,HԹ|%T@fi*W5̦!R%-nfBWCKkoUXj]4_4 VSPQiAA-)3 G'% +b1Yvߩeq4|M˧\+Ժ0mJik],,=vXbCImD%dCbM@UpbM1~z3t`ŭXP_7 [갦s6e2Yxs9 (yh.TGFyZU+Wqh ͭz!ܪL6VA;6]tTѴ)p~q&}JzJ'2B -pU<_Pd~@Ot҅hPlMKhɶ?42೥P8Eo ۆ#錨df[fg\S)(D2NTq4ykLe=CU*b4!}C,JTqP!BĉnCl!G*6AԹ3$wrJ%Fh*QP-4WDu*b bUh&Gx,)ʫgO";OE4՜]5Q_jL3]jbJY3"հ,$ -:'~Ij+X!SI?F/>ʕk{K;V4aL\NYWQKS,[wʌ@ UD:xʮ -6`vncRQfԩAc1X, f;4SF}O>,[u\GQ74SMc̼:4l 7Mģ7RwaV9x\'c^JJn;,eT7)Y6Q_27p%KGԾ+0H\RyjfFLظ&w!+c6YX<7cVҥ@[uoTAQpIKYL8RԶ3p *R4S<-b-sq95bRu;eu—c]10$t`Q17!RO|<ьܪJ8n*00 :mexCbL!kF`o">4TAu *bYQ`md.sv%ŇuO4?W&-_0%KF=A+0+j_q 7|Qn>b8L"˗ nJDa[(RsSatL s(]Į -B94~&9AYp.47Jˌ&R+&*Pf5v2ڧrF5\;RȔqK3տ0ן?\ܹ9y)Ha> *{_ ?J  1nl/0nʥk5x0TM9ܴ^c$aQlϦ,h=$nYaYRjLJ1T1?=$}5[:l $(™D&" Mkd1KM%@n(qT0:`@-YrBt@:`VV_W0GpRiV`SO*vR`%Q>ώ +LĤVE -Ŏ]T[|ʐ1`݃Yf'dQ -)7+uUUMN{̡!.V!v45bd=NJn53%* =\V@lz?s|0FU5*SR]WREc,9Z)R HtK<0r/=o+N/rsѶ?L Exb2 }`x֡ZV c0 3u /r|x~eQM2T) D}qFf.fgpZL>c|6.Cg1r,sωkWҧXc-Rme -7H0 -YR#ԁA\(n$*홾 d~cah0K,Deo1b!-afe˾kqo,g0G>1㺄~eJa(IX!Q J˚epj[ ,B5tᆷ?N".5JL@}A YQQGuo gDbCVMv8R©cb/O`կdk:%w $ 1u IjpbW|#{*uP' !Q.])5^ϼBj.,kGHIlD[wk*gU@΢D -IC: E^Nf#L}6\@ -ƕ - ÉjKu_\JL|Q._.iˎ CCДS \'\2.^8U LCYt3+xg_lbqQU|4Ker+eNgKxNz8O+?dV3~$C>', .Na~]JTqɥk RΦ+p`bT˨pKԨC Szc+r%)]RJ z.ꤨcU}]"A1UTʼ0O?E{rDYrp0E`+fR|CGmctQ\b[^vf6k1:MuIk4*lji`Aݠ,4%Q &jAX+u'Ln`ql51ԡe ~կ1%J:Y`g~h쫶H -mJeLB%%f!XXA-  l,!Qf# -33e]ſuLc:AxK/(eTbsM%<,g\|̌_S3Dع dU|c&33G@nt.HC?@=$Hp|J⛋\fj\ -Y|BȐ*4 W[c5[錆]o|ぷ3(=fSFj^ :^A]0s11P."Bt1}'.+|NG:iVQ[M]ntqPa3 }G YaU*T0AӬw3nس n=;Gf,Uu ecY!SiRyd'@;L؋X{pSc(C^ ή&c|/抆^% ڰ3;!{.iW0@biu:5)| pÚ|ws5hTn f2fPB*] -?(%G LZ -w Pfzi-#|i5 *1%s`w%DŲFa%l:jV֣Y\@;EOmGFR(AD?3T+e?<u ֥2K5S -ێ;%Չ) ]i~h1bP[X)l,?]^W w<ї 2.T߉jL l.ԺTbD7VJD%6maVT0[E[\YN_ RP_ZgV Pҩno -R$[$#׀2ж$=~Ǘ95u:H!xc\荃ssrB}1p,SEpw4gJL/ʼn!i Kfop^⎥W0٩r*Ww;E. L%{#1HR*YS, ,LT'BzbQuMXJB⢡rDpO*v@\ g XA-yvJË'a2n -NYt #MW|[=o앑Y+[j:ezJLouB+bkRKơʹI c`i]oqFanhZaܳ-G -4Fkuǻtݖ_e\M.|Z‘_Lq1 P 2&| ܨzs\1.˃R \Rul]%B|d:~jz"*+2 -h0pj7(q)Ee˕,8#lo HC]t嵌)QD y -|RHF"KֺS}|]iRV(ZJNrTpBL1RQxRP8c~0qu5aTnSN,&5#kbJ>cR3b*xf7;D1k: h"<x 8|HҞ0Tvg"kM@hީ|pr!|.sP@qrrB_ -P=Ibڂl,F> ++QIgD{IDd׋'{K'.U6If -7kBT"̰R%ʩf#'i3x.UQC\[-\E*$oDx(z;@Gm_~r`0W`1m/RtK%lŪ(_X5cAC?}m}d"*ܩ?7K-K8U?iv$m L*J X%joqrNy^ zUNg[d-(Ǻ7eTYB[%y)E mu›jt2׈ʉRY0n'B+ FW7԰1>R -0c刘,xc3R%w1a *JƦ.\\G3Q-95+ĉX*2ڗP1n -ee%R 2׉HV!_Nvz&1y!`Xѕu..t "k1uW.JcUq!-`.0rK-pq.p(s.^&X|330%f*,A0g̻Rbw4qW,VV^(eA5}5\hb L=S!_b}?iwIs[.C_pM͌ ?#/-A}K7rx⸨/]B08bbTTfzUoCB!?*J+ `*2Y/ Qf* 4:Řd_bcyDk]imɯ,n?d.eZ),DѥoLg!ڄ:nUՖ{? YjZ|n֘03G ]Py)sA,3OT{**#,xfXL57 cڗN]2r+M -!}2*s[r!kf%YPTht\q7>cJzXfr\'S*RZKJYd 6K9*fciN9)Z\IA~_<&}:bB1u e̶8 VeƢJ(%y>pe(_ -R`(Y_wUb_ Ae-{OG߇M, -v{ 1=D_F ?!A({*LNϨd`Ԧ0¸ILEڭKr,O{\:DsS4ıKwIC Z:%5>+1]nkeChJ8Lԫ%ԸQ1,G T"ٱ: +ƅqY:iV>BF? -5 -^6ۥ"T72\YP^5: Tū"hdlz#_ʎc!. TJy'D-SH(E8*nR!82uI*;W51FeTa- -RW)!=U!M~b*5.)["trGr1(n7Rx".&Qr7A YH%xKV Ţ%[@ eF$Oq sˆV!) IOBdeSdaLj2fernffdwܶDO>}Z!;.CWgR8,MY #aگ䒎wE\۽\Pڱ@%ǪKR\TjiR w4*+T\ n)zyF::tARUKB[Z)ĝ}f?yFWDx[]!"N%KӸ5KN_q)ʍ$SHlW4V!.ZiGz./p-73 g2!60co+.384x&NIJ-J3BCQ) 7 5LZs+pT9&ng*z>&D4"Yb l"B\M>/AI2J.# 7(D=ƗQ!FXY6Wyry -/T,3)*"@ke|&,tb D -7|[&A$d@CT~&e TW7ʊJQlGEYjecRoJ2EbR7rDγ ܫc̦]A,=%M@1ɟCRRvSLÜXhôLv+%*YsH?[;WUL|3ՖmbR#fBgfDyNNЪ) Y ha>ڥh*ˇ̵n eWn6TQe ˉxqcO? xgw -TrS,39ܜ\vK|8NB@xkxs %;6=B  FAAyfyNqO0ޥ x0%p[O#9v]ϹnX:Uʈ7>cu.UaYT.\L3N o"K7ࢯv񤇿oO8~?,B{D$"o;'w(@cja&bzan -3ac כga3h;W/-RQ~έl"L!mb{_ؗ5\\+? *9ST 7qwLI3Oy{(E~;b@C^R:"0Bu^d #0c"DF֪.{Y9Txqrksz-1#x%BzpBc|_NjT@^Dc_jR1%4&1Dxfg,K0JJc:wrȳT p)qܷ_.A ;]L\eNf&%L-2Y/c~,f DTi \;fɊJr93w5ms$m%ʍܱ)ݕxA8n\,WlJ%_+~]sDBfrL3ᛃrK%8I`EK=.WAvĪZa~HUJR'Uu48,QΦg(j*: -. -55X9%10$3LFnj>n&ef|hw0\!fYnP y jˮ~JCs*%1azUP*4IJ+x:I~.% 9-s:Pn_L.[D@VC8%Eɕ\TPq+${Y( |C*ɁP6#.GOI<S:ӏ(y;H$G`G TPR]C,.㰷ͤYєyHoYu|@p`$)3*T}pGTD#l?i-"c۔}u߂dբF9v|*Tg`Dw G#SS\_qKF, i4,,&U[(@ˉKn;+5t^R98"s+ITψB\li\腬$0e~͖` \ķPw{ #-{LE]Fc m]:Rĵ{z*LUų fn[mq72b7c q_P_ALIMC4֣a pN}w9u a,Lʙ2L? .8cL6*dc5_zb [G+%L|x\9kS -LBvFK_YAS//e b0"|1|ḾgE zW)B< ^:JL:6\ {Ԣ?]MK@ /jMKfi*Tpp%R8jRD.Vd2ti4P[/X"*f-i#xՆ FZ"[ٯH?ӁRA7Qn)` ]mcUJ]ctH^1SB2m/ΊR1zK#Ar |51-.c#B0C'eoܢ!+1q>ef)/#:aL_%GDKQ3+FK%1E`/'5/Ml+1)6-j,\* -.͜PX@LQ0`!ƉW*+eWNNHULjl'pa730j0lF|g74@X`C(QpTG|Nj_R,1]Ĉ-Fe}@(Zc2n -ҝzÆohLPl>/hFz *xj8s93o|X%@i/sSd꽞ZZW -pS1.Nn14R2. BW!y_rƯQ6B-qbn[Ds2|q=R:!ㄊ@~,"e-eZ't7*8BA62gw%`UU Jßފ)@}44kB_.3Da*֥WQx$u;epYoYvb(u2iu^zpό\BQFqf '3Tz7c% 4A>`&P;D`:%Qٯ`GZ-3~"QnhpC -/0xb<'FN31>)EnjLè1:# &buy&+rLk!6>' eb\#e5Y. 3^k,3΂DJj [u|eQ>]C?ũ>ɨuP JD}wi{p~ %K4%/Dd8;⊔eQJ|,)X}DN%3rϸqɨ,٘b\0".+%||KQ2j [q_PHUd抝}eaJYrᚇ4a2pG7U&u2TEnUjTԹW..T7uu -4'p ^_peล,^SRR7R2L&jXKa-@bT? -%~gl&.So0GEmZ`c:T-&%L!>I/bƥ e"<-wXrsHvv+ 7[g~KP^R Dz=al=<ꗫ@ޕmZ^/ؙ 碈J Eý%9WҔz%9j~]ܿd~ B`V#$i3dG-*0^|VX7AyȖq- BXqZQFV:4)!TqRJ5 TFڪ*@* lW97-;SMiv$3e=E@YAv#)QY ;1Uc4JPI]fff^pǸa.lX⣆mFѪRpZY,2Ҍsy^ᙫ\L_'Jr2RTⅲD)rep^*oXKIJt%^-Ƹ-9VbLR%>'pvJ8MbԵ2[R|W jf*Ì7*(+\ùC *  T]b_r]Y2Vx&O eQP)vʣ{Z u-Lʽ*5* .s) BùખfPN,0R[ZĴax.j:fbTSvK/r`13WTYNf8Gr=^%T1 -:+TSEB&Kj9᪂.n+5DOʭ)ʇ7ze\c)QJ:벵/3+*z*/| աk`@% [^NOH0SYcO˚7 E3q1|xowM; jap1b&#}pj3-q"ֱ27-. pg t-ʌ8UጤdWq⚁7PQVND6AcIX Oe!2K@D 4(sST8Ծ \3 nUp*o]p)xa2JW\ Gpa?bp - BdSF8>+.f%FS -& ԯ.: c>` -̷ZRXhM/#]F.=˖L[R±KDˬ%5+17 s,]O! -`n`ВB|Ϲj/Se O,]%!.-IBi46Vm׉!nP~aiҭU~ :+yQT8/?x[AJ|E,@R!'ê!Mc9k\f뮀X_ (?n+ݢPXGW)ө[#&: %(Gܟ 冱.eELamұ;5f>ئA:ѣ#^ cKP|nkgF=ņJX &KuqE~tM5U A` tK={g ),†;=.euXĊ5.یfdPܲx ->~Zœ^Rշ=d>iH S-^YJWxEZ8 -g˰ES\WԩRʶBiYn6)9gfQv -J$Zv0]hnlȂ .TZ.OaTy2Ʈ'g.9H E z8ڬLǖ7Ș޹na6c}L38x*5.gLIfQkD '2eMuA#\;AuUlZ཭ER-E( |*Unf.-JYMg8{2)ap)l9%o. Q[ ~F2F)jA#QZ>Qa@PfԼ؇`Y(,, >;@EM=4lҪY{ܻC>}-V-bjoCS -qWtćΆQo.g[Xy#\TDU,16@Vë[d6k 3D0ނ"bNP\YCMe t:~"[k%!CtE]&> 0?ZbX)&4*+6>.bmbQI|fbـ[E{DQ;ʑZJ%2c -7>1ܿ1$1#q K)v -OܨFK|<QxyKZLSR+EǚU* p85*&85ԬMbkwRFPG - -A$/JcjyP, Bwpi\%RۋMhcgYf+3st&op+Y h/BU|Ei -*]:RAP .nv=.^tWl,(UBкJxe#d⃸b_@ ~gbf;Y1aɒ\fUKPA^.6xyaM1&lTwSցPmHc+-YOV]|9K{f*|tş -0sV~$etoFڟ)t˃mrcWjޯ'EsxݐeNÏњ߈gy+W0%= kvu+e,BrqpWp_ %ʾ,DxYp]0s@7{WTFQ(kͺ|;z}z[~Bئn~xҬ\ݞ&a$GeLcw)#Si܅mЦ5/9$ -_$ cx4 t؊:Nڹl%,RjUJW=\g&jA[FT2KGlcn45S]D%bTE]TНˊpANۛG\\T_|YPQ+~ -?ϾX]fcjQ[2LBSMJRGL)ڗ-c FPUszȞ fw,'! 0ɬԮnW=@*OHiA"B[6By^p7)%K`ܹDpAqxᐖ щ`)W:|}@AR|^u*Y,D7l#'2#]2RFرR20KX`AM:-I22xx%.xY%AhV=1qZ3 -%;D G -_K",PGѕZ),qFP^8`箼2KIi(&nRWI3Qǜ~EPK xx%u0}͢"ɌĶ c \u 닩~r؏L-U8tKa:8+r$ou1(tK(jQW.[?V?0;\;A"M*0>ؒB\w}q1~0(_\xTw;z0$ -)!DkFLqp8cuI,]CAqpd⟫ŗ^ :=N% o|1r ڭvQ @Go<@(x`uN%\d!x_x+?"C8^jgq3 -;_1xL-Rc`}}IS>s.+`{w,[X=ɶy=]C*>`0n -]kTL~pd5M˕4("PrMlT8~ NcVnikxY{9hQ~u,/=W]PQgkYu+Wmwtyy&* .= -/䍒d\*Z`Q[eyKV!>[ܜ [fxqU\x.>YoKX{RW R]. ꑻ%x&xxu+D-xq5:*4KQn >Z%<ʍ!E JSH>UjU\!\.}~ X奪[/ %e91sit\JZTḕ23wR]֥ # -pd%GK:ܯK9ݬL拔T2,Ы˸ TDkK5ܵ8iQ,ĭ1>q~GY)Ttas6 2ڱ4b 7>Hv`aⵈͷz[Eg:FVi.H1dKL^|AM˧Գr˰(n3*c*[o?3;fj*Z d)>8dZBD_B3gUUL a.<\_l? ʹ a֘9 ,q[ -0/~bȞ菬} 16XdTgVp^Ky Vng$]G: 9a`X*Q(? - #@DVL3e,"ھ&EQ@Oj74JPRV^Wslf!9cІW,"!Nk,q -x6E(S}rCPx,&eYzZ'\E)Ɏ/A|/7D[8-$uV7G3Ny`S6+EXś7y$D{Ȕiq uGRXsP~gP^@T0PD-; - qGai)MGPH'6j\XTRT7v։v^"J&o3/v0ҺA]+ .`JMG%È1 l,a]] @Q+)ʰPc2g-yP#٥T/5v IAX͘&&.U(L1*&\_Vr!.h##W!THohZ~cF -?C1+n?Vw+c&-$k$ɫ-r![YVX%x%}J:R׈IXAW6ٙAt Il[oV -0t<b /vca^Z rB%-#$qoļE >FnPEtlHVN(PZDB݄\+.θ -J(+T@ EZXXػl PAt`[n`F.koM%]Cs̹+}tKl˳T;F.z``sܼ$2طܯPj ISmjWpjJo?rӑ,!}0Ix[NUUY U2iZlF4χbZa̯=a,~!7yɴ5>t%;.ѝ%֟K2h^sAՌuD $n^!Q C+c脑RcYJF܊u;' S2Uuw~P0tK% ^Dg yiUGxYRTsS3)Wz":up/̑STʈYiu3|X.& N'1D^)&g蔥~\()jM b 'l_"X>҆!:-GmAQjs:Q5q;GW+TE"vn_\Kjj]ƹ# nok >Km1C>jIxȢqkEi -(So 7qp._攕fW ׍ ;3P)]Yi[\ %>e# -%D"͢u t& YiZчPF5UL 3Yc}]Þ.}`84^eԣV!TL*Ti-JMG}_ gQr.RgqZQ%=.ܖ*Usnȏc+'qj +4(d f+c1EȁnFQ2VW 2D?1\b% -KW4cP4b/%(Uo)[].X{gU}e|cA%»tlՌCIg[-˶DPlu-6]8xLJ9/;ctң°=Pd]{KD0m˸#@xkJrJ㎣r-c3,'eإV)Ԭo5a)cyS_ʌ|ʢvX MJtǻʸ=ŷ._!`VD|+eJKuYƒsm Sg_0"Ŵ3P+5_|^BVg`TxGd9P%'@7*cO ֧cNS-~ݪH!^.L| -"30TƄLZyeq/a?2-xz Q7S^mr\\c|{Ga#4*#۶?B" {lK'f1CQ2';gi*[S%w /vMBSorP-ꪑ iX#ďLlt )wp -,Vcvq< (fb2qK=y?O &doJ( - {0 -QZv O%;Эimܯ3fCHW+(1|n 0B\2B!3qJ)YIXYFj#)!&l1pY -pb]i -3kY - 7EF~bT幩q&<Ƴ%_ V+Ÿ3Mʣ WVcH3L=R@Š N@Q;@E6B"VBK^ j{R./ ȯLu>gR_l%*'"4 -Z~P'ʛkyY |nk&#U.u τr2B2bw5olDas8~`6\_nZAʮĉPs_;eÌ.W%}`Y~bpJ.cA-BNR˒ lH8y%FZ2Bܡ2?Ă,P(\ ef Cݟ#4_!Ъ*Y<2OueT}YOL[#vJKk+M ]*VA"r0IfMͅegGIyl3 *d @nUtk,N%^:Z C^uܭ7:aËm nL ,pj eL~}຋}0x>_T$ZqY|d#tθequ֭QZDΒY_H,尘ƸIU.)=/I|jH ߶F`N}k$qWQQ~{\+rU.'˯K>EE2zŎ\ 7^ -8t8BXrYkmY/});fC35 BNBּLK%ō1 ez$R1qRGi*b*l o0y!Gjʱ]mNg"HR cZ=o0 `1mYZwaGe2 0,GYۈ_ŋ늆`-QS텈JETd&)$ծϿ1 -I3SpT +1<8aHg 'ۅ8P7Z%8[K9mD!'epYZf[o!RvHI6x升IAj,/?[o!]ǃ@Ɇҩxr2f\簀%' (Ұu` ]nX@*8.ѯ`KD6j>Ox(]W=pa2:S &XآtK]H`n`wTC*K'Wg}`#QmsI.[1Oqu-7xs+hX$9οYhؿ\T v33F]Ԕ E`T}Zs7Lf!` -E2J)ālPrD eRp5*=ԭ(ۈ#NqP>5;pԸG#<|/̬1ƿf<ܾ{9l.;a8.`X^ȃ]Γ~FpSV  |ތRhX1ܨm.WRylBFnt?3ܗ\+w+a:}bJؔ,K=@ -o-r\SB_|~VtzY `Sϙb[,JFw%*"15XZ=v.9`\W}ͶemoFNߘ?U]DUć3ݟ1 2ThJmذҜNB$VEl~j߸&_qƸMAB%tOvlV]r$ܲ3%)<~ɺﶌ¬ryc'Y{/Bb\nPcKy"bRTkգ#7*wr1QmX̾߇)e@WJ[w.؜%+iXS D,E\zm]q|3IO^KgH+*4.?Eo "G $* )P*gxf t4\-p/d[urc#TVK=+6LoT%,3hifEf*/i w}6}s0m1] `\h*ޡ,EjeRWR(WC~_Whx ^ A#y\ % ,_\Թ[x ؜^tĥ#u-LLw.G^Dm[]VDh4RT.PsxTx*e pG5esd,3.R(itk`MY%?)%K[+yTi~% -[YH+?ղ.2ı.< K4FBS-Snn#ΏbVxʓ`qh PzYK̹XzgDc\*`Bwʚh 񢶕׺{W @eMA(xhP-+"*bF@n+?ҪKHuȔ- fUQ76d&sJ~i ǖ -MO Q]*6#Ya{-JY04^S6ӖNhXOzimBYg?W:CLyxab̔fVqW:l%fgWC-¼1xbyǿʎrmH{u2Y h:qkl[ #_sĹle|0Rȝ$=* F< ץ$i811p1n=%Ft!|6m,FU7>ܧYw -#ѣJ`* (&cR( ٿ]4-<+Ikٽa1ia'r8rU`Lo|J;0J!}Cݼij-a*]$ƅa߉s/ .5E|3PAeeΡ bDyZĩ, mkŨ_? ?XCS -?OۯJQ8rV -Veþn*]*[Ҍ*zDNyJӺ|0aƩPeUA|,|ycB`Eڛ7*0u۱OxE9%9fao<Fj;)EH jھYft@2)0 y>c*0q)gܚkWv^9? r]j#l(zj_,Z0X];".(v{D!Ew`iF4J ~!Q۪EʏAʊL*uO@'}|hvqXN #cd1"[hԍ]q6<'io1YBKqXoH/H7t $uM2En0 TDl wm`*/a 6KaCx/0^*+v*M*U[lP[]JH>%cDBtb_ы=e?Jg]C_wQ1 pHZ6c(e o,qA.k0 FeL8Z_MEvz~,lK,/Q`FBoۢa]T0oj)<[猟E??ْ@ةlN_Ò%wB4xa^~bϘs-~+)|8,ࢊD__1^Kb?xD6gC@MW! Ml̄?^`d?ѹ/4%59qbCV&uK qu?)*!0rbP/d] 0CL [9j"OS=`uF;V,qOxg~,a)vCK%Aa5/ p¦Oa͕PCoqN `)IΥa/1Iyb65ܲCUJL hZ[;;3|Rq<7.5*}A|uvǵK4Bq>'rR  yUb£)@e?-cx|ϩbRR|{}ƻWt`t* <<\sUpW@mwB[.:q, qM뀭UhªEVUeķ̶7eܾ%Ku=р6e8R&( e \6?ѵ*G d[h%xk_-Tp{'ѕeGǍ1*#a|N) ~ddoe*(ӎۘGU*<+ |QP,Z1[Um*KXQB0ݥ] `UW9 T!b,HJ2 5W.m5G\#eܺq,--4)UB6W]4CG;FtJk{VxVܨlx.٩rXIC n;+ݧj>ʼPwB TU'R&:0; oRONK, *ѳ;թ[HdlUI[WO%_5/1em7ԼFʘé{j){NbB~.deLsqISj' T)BX,M9ڷ&Xr۟MYŠñBC0ef1_{0ҹykuvYٕ+*]{׎_`)q=bv߹ в()诂0o%>CR4L]W,y?] ShbM8nSy|$_ k2dv=K{䩉zVXF&ֵʁ6rb @Tّl}zlḛ#/5(T1 Vg` pZ#%hV`i 97iS(3);gCײ|e$U B(gh9H|_rq0ZZX8g4 -@GFF8_,\PVw -F+odŪmV'sGa 0~gj ߁Sᙨ3OF˕0ԸG/)VHؑ[r5Ҍ}|qR;F7*  -r,~bs~k^nۘ% ]FɛZxi)Yp\*j-裣NJmYKkg蟸$>hJ|+*0Y\g-SUc%z"^uK%Ħ2]`k1GۿM@.nKX֣hQ"P*H!CIڍD)plư! K['nSNM㤺ߐHF{!}Ii/b +Sa(Fĉ.>fe$2e< KQ=˾Voň"T%SzP0NGz-h/eټ*h{\&K*L-Glrp6U/*5[Uu j%B6~f_Ԇj[w <t2Rh(*הSEHϖ^|C3*=,AX#"1` u ĊBn0 -䩖*,5͝Cc>窩!̤/WWf]WEJy%.yYу,9&4|.P"׌ -"vBW&2DQul6Y8 mqQ,@ʘ%˗nQ*̧_ wPicLٝuFgl;.O\fU1zIY_F6Y0 -`r --ʴL2ri`5,%"Q4P%ݗ@ Y:˩ad 2 -@iwT ..= [0kiN"E gZ0% lli-_͡x!Jx 8Tz5N,K"[]61nRcVT[ij^x%%)~jSpo,U\\>Ta|mGE@/@5#:]M{hQH2tkԏ}VZl_Fl[fe LbEGRw`c`A߂e%*fcL8yƥ9.,Q - Q==XS6 - "[|vDn~TjtϲhiN*X&*- !4(?jG.vQUhh7:H*f]Ƶ>n8KeE -7r_q3c`YO2/x ]45MSWb$pwUv]=˺{;02mQ^Xk)M3kLWV 1OgnWVf{ -a2][*0e]@uh0Gsp -m:Z)kY'm*_ ]]v&ᘨqPy# hqa-Z -3]dBUlD1oqe‡E%޻c Vg4j}Y`F\,c5?g6<" n[ `aurjUBMm\0hEh%bWv>fMN; -RSd L<&n X=Vt}mO(gJb-j]5*z}N>e0 DvF^>xl5p\,QDGjqq -Dj찖Vs?̔uemi1юe)KAScŪLcHkB+;/qԩS$̷,LQzK]a[LA L}5F˼m_1[) Ʋ&q/.+˾Ya~.wI<ʜ@0 \CogRꏕp5zD֠+ғ-?-;@WE?,Mg}Ypj*_ܪ:R^5.]u$nZw n ( (lKD%WكطXs^&J=3lTJ7q上-fK/jϨyJ #M~nqJ\Γv/R|f"A;5i!Ɓ9#}Tß:*o,3x<ٰ!.,l:GTKBf&,"4CaWl3j\Y -ո?IkmQbLU,B0o@[P8J`6@-hHXWj>o,G+!Jâ R(dGJE?-{/KZ-Ro Hf^-5E\%9<ƳS7rE6 |Vas,x\"MiɈ-ͭˍQ~0$[t} LO#7qq"IWws[Rk".x)dĵ*Z˖T H.\HG@!ރ%@J`)Jz:e `o3@`_<]ؚp0<āZ< -e?)a2R< -V9nrAK;Gk I>\Cp%Y7ɛ*SZ T"˃n>NF* Gޠؑo'oD E(K8Wu+.3ԱG1[=YE^,0B,bp[+3G2襖Pj\2e)eTnxa:wȺ1?dgȄ}hng|*Q3?bN 7eGsqIWj#!xw;r Zpxj2)9⪙|*ڇ'Cj5\O%Pj @Kh5^ A'go] ;;U: -h>m&7Qb,< Uu{1{KVPqcЫF\'n-{[ >].3U|XMv/CΤr"C4 ͑bl/ab_mND?5K|Oy7 +,Ax{E[O&byKuX]Dzt21s^42XZ,J?:4(u>aڔNI7uB[_La`{L #_k}dP\1dq% Q31KܣvP0Euhnjy d)wԹG+J/fPfh B_!w:!]D\OR]+pܦ(+0.w0MJ!7Q(zu< Ճũe՘#1)͐fgR֋+GtyPZ+tq_,LJo!@Yg -/iꌡYTX}@E댶V̡鶟Gw ERSMۤI?A0[}j&oqg.w.(l+a4_r;,[j_. -8(MQZS_og%PJnT]Í熂e.UJYx%GCD09y˄] 2b$B Q s܈(wQV{G{7o}9f"h$ 2-_JJJnEL[(--V(|\#(W~&OLh}R+ wh? )) ɽC+ -F%[Uf"(yWW)t6k0jSA=Ku`AP5.-$ƪW5ψ ڪ%CjwDK88fSP`ÙEǢdvEMܸb ,rM| aݫHT?ŵ@ AY.d\VA1(M1/t0v"-]#싷%]Y" ƺu-Uh!$29Y_ҟ fPXYK.'1&&HZ9p~G W۫FR*P`&7Siw':y Stve`S9l¥(w*aosM̷\h qt o#--+ gx"))Ilk+LD2џ?˄8;Yu踩!xQs7T>^/4)nd.{ewIrvHKzWJՖJ= lOGkEj % .E2lITZv3*A R-m*f_T -|9I/<ƥ֢\\DCm-,3/}w3uE5OeC\N\Uf5qW@Bj$#: /4V(SYlTø5p nesph]IM,3Hld!vupJƺa p5-Z3H+ T3Z4wg;>Y;TC-i |(n=Jc`T(5bD#%N4vp`{_X5eBIz°*<9q5(z38LL5vm )Fx*xk,n;6&4">U~|0(Z -!ru4 m+-d337#zD!MDt 0hRr-RTTGXgxC5PF\8+T 6ۦԹpxgu FgLws21fAo-"֥NK7ܜ 1ʘP%9eBowLRjגedRzJ.!-@BwD~RW3Բ /P. 8|X6.PWU3zKwfaqrӺRz%7wf -W5 -)PF3J%5o'l^lyL- PW̚++CCaQt7wJ -7Zxu}J}\n&K'C}0*)nHzڮQى@I҄T|<>I_pBJ{-6j~A)b3oc 7+ > q)* |LebMQNQ X@Eƨ5.DLf@ʶruJ-8x[{$f2]}"j҄+Xfb/촽JZLڻa!:~uGyf-%"!Rּ({ILH -U#gBmf-z4K+C[64QCLe;!~`%BpL >)YvMڼ]Ҥ]N+o `2Ө?W3;C=, !KBٙph\ -KNZu`2.zbvpM -a"0}*2q$ -JƣUL>ͻY zQ`*U]F\%0[T`T/% _5잿,յStn.Gu;l6^_)W{"c_htESW[P.%TxA3 e`+\"M\ɶtS3q#vQB=*5Sp$UmbȼܪN/Bu5<5 -sLGfa}X*Pz1GUpf]ؽBqYG-\UJ3 -8OqL.ܯp`YE^X{/Q:F5UEd,I}N5 X b ]鵀Hc9JBP*Uk/6Z<BV3V @Mɖ)4xLg4~ށclFUs] ^mȔRϊ# D瞂L -ul#]le8ˆ T5?L(xɞ -eIJ -uP wYQe!6sQfxRpS$sh׋p ˳p~.Q̬ClW f.TOrlYU[&$xY{ -jRl'сL+@`] t#iQ"ѽ(!u2~25W_.Zw㺕-m*WQ& M{m#)]n +?p~MJ4Fv>x F|S+.Rv4]J\ZhjYB^$IeSB_Q[>o -Buzp5ꨲ|xD =Phgr+(;Σ~q*i䩥jKGFm&sE4O9Ƙ -2S<]zYH]’b"kUgN~=Q6Je [W>i[dv"\ ),-\ -QϹYK1xڰAx,0UPGXf!pQX0U - TŦXR{nfgoQ;0j\4Y).XJEaq]\J<[K/2Ug{4|DhWRʄc0foJ|1WKXH:YZFU?'Ke]^;ky cWcQc<-ĵqҧK^^Sg۞_x2 o?"XPO x&7yn=q\MAʫWB#"QK&_HUO8qsAik-qXh@bmhuKpWkR?#?%r 1qZ{6ϑLr/U>,=sKl)48U_s~&`iùLԫBh/H#Jϡ_lu]Q 5njXmXR^&lvԶR/-|18KvƐUDwrq02PKRԺ %{E22bfE.eScwGRߪk5U6j\Y.FXh?m穠Ś4Fzb -D%-E>4zuwD@`X-B] P":M ZjU K_^FKR[V^W,`UB c8ag~2izp~PJ2Mt+ڕ-O )۶w2(n06~-(~j:_F(|h5C[3P*EzU``g c7@;W%:S>a -4h{W?o54LD֥w -%;DžDuP;Ftab"]2QK]1IiݶesX 7l,"^(w*_uA.CۮZ@K28,ATc-@n\Ul[MJTc.0S|"TnaP5|p6C]f|:jiIK>IXw_ṋP2Zi]?=nb43R=?d>-Y4 OԃaO K&tOP'gXGNf}+LψKG8G2*RT-C*u)kJpruMB[HDFQE,do$-t%0j"qRU\JL%FƻVD]%꒔կl IB -1 > GIF}}MQu APXcM=;'nk~ -kЍ#&ӌ“>D; MJ6qo0.K{2̕#H3e?0%Fݤ< OV)l e4qRS˭Fϐރ`s? L@~\/ܻQ"PPZT. +)lgg"Зg.i}c47]lxT*ƥCZG ,^7\jtn"b4w"^͏H fRJ! -ͺڀ:HCS5nI@8 <ؠZB=U7MC}MX:Q LI@1'6z$2:5q:VĖ26h]pfoPO^-u d_USVS-6DDl[atTwPd^،q.qn=a\GS+$:29!T(|P.QCL0e_AƸ:g ,"Vu>IbRĭ3on>͔Cpj?G{1eH[[i<1^5DnD,i)LmUf5sqJ:P{Ck DSʵa님[R)a Et<3[ѨkmAXdPۺD^R/5V;ݰVmEcmNBZͭ G,1\lkdKz){"崽7 Q)-d*{:@Eg#d]T Lm8IRJ)+C̬ Xad}33eC}MTMQ[YǔR9w*T.\_$ʁ` -hc Tyq ]x'cyζa(*@lzZg*^v {Tv*'7ԊK4 UR+(ܸLIJ3W DZr2cFτcl -y_(GoIynezX[yqj(5uqy`Q-}4|"LoT /01 -ܿrȢb¯eDZG)@`!^@% ^LVZUe[UlliU!`G\Iw,,0K1{sJ |i)Tж5 *M% K^˞9,!+ - {k,!+3AlB9SGjkV]]\Z_0TpHĐlv -C -#.vY㠂AÐ 4d+,4Ae[< -7҉R$DDNĦz&%T5`"WP:X%ttuy2 -@)p:jQLqJ$. x1Oc_R*_I=ޅ5o([X<ES+ Ȼkn#8P*4GdP ~Zn0҂>F~-;s8"!X3Z2i!B;#iU*\ m -9.*nxB;2 [C2-J&%V iԹaG3Z -J[ Fl1p%⇹^%Jb\/3Kx`NRԮhkԥ?7j0v>I1ɤb_~m~ 1H?,b w\>0\d#c#zeTbs$%;!-$o(ȪF1)ef wRx'W,TDTT -ⒽCXm>Fmgn$~UK*8 4wCcxpTsek3QHYEA -@s(ٴ&[|hB-hI҉ͳ\P3BϒˍF {la f8jC/a[\OH}Irz;9?D3UD_e0s n_j0a 2ȵù\s9T)ӆB'1@~I䅕f#ٜAgr6оkRʰ>X|WglHԉ;bPXCB5ܲXRr;j.J6H[X7Gݪ;*.3GO] qV#, -] Ymc=p< G{ |*` VY]\g1n+ )- !fJE}v bJ <Ա{дV)Mp/~[H렕~ۄ3%h뎥7*卲P_x[g̍ ; )F(l"D -hr˕)Cc޽3P0 -cEc'>d$:(ry*I0T  rI wY^XH!ddn6\o^z ,oԩsulr_Gsb,Q#/m`j_Vu7E^&IEpaHVf/Y Y9w"2rRh$G7kˠWsb(Ct+YhrٸM׃ = nں)3HZI}$r^kYa醐 :͕nHbE2Fd*ҀWYFiJ"ݑS\X"fڗ~ % -É}尓VJ.Y*M[{|Y'[x3+qiVH3'o523E 1:4RZIMGːV: \@PRfSbtR4͐rܷukܠs_@."B_]j(pZ䌧r0H3\KRaѤi ] ]Eu-ԮQ(.ֽK\#\L% aO@Jq\-/5#@mAj-m -G8{mW@ sw{|Mp|0f oj/h2(L8jy"J+w1Y$-K]|c}k`gSHA{pVw*2QlF2Bb(v@QH*am-;%F=8Ysg -CfZsmtJNgaJ/Tj-MbaVĩ,$P@p2;jc]V\?_P̩q/Lhǟ5}K"+vFnC[51zBFKƁNš3R[MJɪJEl1D Rՙ |=޶}Eh n8ה2m yKj#j+u"t=٫ER\U07>!-!m[ksdh PMKp&&(u~Ir> 2b3Cf$PƵ n[EpG#n.xflm:/(yeq`Vd.T\yvtUf9i V`r8Z後_tw -# B_(VmLaY\~eTgUFK]P%E:9e~f/fڬ?QvTc4n-ʭœ}USU+-JUekVv^-!#96x-CV+Ļ3 tX;R7l f +$NL-Ʉ -=p0״|EB7p%vR*Wb_G}o\6 )r^ 3˚SmA5lcG} :f=+ظf;sHak -4͐WcXBSd#-ijy-'X$K66]? X}m^f%m}vҟ4lB댫}Sh,MډMi4:\KT7Et%I ,OQM6)RN޻KmȲRLJMX-Ԩ nQnh7e %@u*7nd7 -n rOM Y%k1W//ˍBL}ˊ}}D] v!sIr>YKwuB)n^6&"S5Rڸ)/ͳ(?:Qi_:E"7S~b8[ ӣh) IQ.))YFB\IirĔQ80/arIr*$|K4x%3^ԤE/JAX縲¨e87%\^F .3[.Y4_ᔔhyj,+QZ"E AHL+Rϐ C\LgFZiOs7C>GX'5:ͬ=e)A>Px"Ij.? ̾T:>yw- .*tv!idm q ݳwb0K2 sHgbЗi噍8y6]UD4VV"EˍG9ٸwPL;`ED`]jjXT=e}Ȣկl#)/OSVU{V\lf⛙Ŝ"UCvp*[[(nvwzvKn@h KtP )_ĕqLt[ADeokE$}"3`*\ Yb0"t?J[D~b,jpxHjkLG[!(X}AT7DO_0wfT&}B2VݦHP'/05B3 UnxtFFE`-X,e'k+զO3R?u+Yӛ=X(RV$ oq R Q Gjʀ!E%K?l#_2S 醺+3P)s>Cfyt~0/pF視_D=ۨ7yiu2 . sѕ9F`\e!nY;]*M[hïY"~+(N?0IT"kw 8^@ -ї!DVc9}*!~PUEiB 5)Ng{<7-v|USֈ4Y4 &P 7<2喁hH%kw8acfc ldZ]WuE;@%(d{9~Hm.vawHs|KIqo( ӵcFj٦_0CTɈGn/!v6zjQ<ԴVV0%}wݸOXcWU}EdekB -r&*u)Y@1+W g NBvsM'Vjʗ]K-T+YpDMe闡;U֡AD1 - +XD+A]1 U -4JURJ|i31SJMlZ~-&'^2ZwC/ z10Yg *zN8HJus54w7|ukuk?Q)¬R}il(w3ϲɺ㧋eܻf[*\vwP|+/DkҎsA/EHɥSIG&JH_[sփ+P4]WA-"J-]@1}ˉ5| WQ -qkB!oN")#1#xX[/̳S%/2%MI+kREVYR*,˸wưA3oi<̲LP2lsUyjw j7)1KB#5,:Ġ2A0~ Cg q0X -RH # jI+螠 * OKm`(\@tN…_Q~) -m~r0X )vQ̮Γ膬 >A-6 ffj-FbD.Rv-.^Ϣ/ -ڥ=T)E 5Xf!vXoU6ZbH̍G`Ke&Oh,KՃj$VP[4bZCpXb0L헬T[ʨ%#ܴCme{.ft1 K -Pw.P&S*1TTV-ogaF*b,>pԷOſ!"[ R!.h^XÛ|Z*1{He=(̿xp}jL^0Cx{l{"^=AfvaQKYd)w:JHʛHvrCdbOjj7g6~ GxAMD~`Dks-IVwxLE@KEﴓpHb:e=Y״flڑv<--QTX掾ScږaHƵ I0 -Uп2!D*À/TՑC)G0νYƣm BB:7;T5&!haH,?2l54_h07ln \JZx..Xu)2f^hqd bQ) % aw.#4kϭ7Q=ql3PUς .*VC6հU8H]IA[yE@cN!l#=^x>KBrPW 5_qt~>_jwiH!E0:l*lHqP%r$ VQeb2VY*U}Jn*xeQۃo=c;J{epRb$:"UQߩ֠-8bܨĕmN.JngY^eקDTPQP^TesL;koyaymFDSi]b c:3.B+7p/ -n.BE;q_$-2 R9#,v*-Gh}.[/j e<3ef1eYPUphsQUj+/Tw)ẗp<$!jp, M`;ig{'Y^0E1R֭=K (рpۣ%;OƊAdcMxc{zNW q[t\YE|p)~ԗ<} iUdoXڱqE >EtDe|+?R[t&쑭_\v3{;Wu ~$f}?RPPX (`m̲S5JbwJ>YP. 튂p>*!-!\j Ws& ) 04լ=Sp+OWjMD,RVX"Ez豖a?VAQ5)J~pWݷY ¶՛dn|B菬ЃHSV(;bd=Ф%!#zbdo --!MZ)HlkadfǞջj\1& -_&,mP2HB+A| nnXAA:(,4Ia~hZ;pgCG]w -ыrEj%8-pR`0c]ڰIGΐ_W9\ȵy^us&Q%JzTj.[ȷ Srv1ݲb-h% -jjAƼa Mԯk\^8gX86qC T$Eiw}Mj|Eiq/Qp6Ã4];t? A7 x^% -yKԬJ3 W-Ki/ w2*-# -kbgmkuI DsxR$0ͣ?JRR[ɩEʶ>L-(9IJ7]k`8>HgD_ҭpgkQi?X 'EԂy%+aK f~ En{#(HaaR$ZN}!,5HK *E)8)2JQ&"[:QEtMV_hnl@Y6JX}. T.ԺnTGDX("HH[xwdW&W ,D_#J6xÈբ`q9\24I!wѠbj.hU1C/?eW0_K1H]2S5aUElU*`DY+A`)K-UhёPOg X!(էZ51( R/ozgI؅5Zhu¦ g ~Vf`l镂ȝ-Y٨Dqwh6mB7w`U0Zti,ɧ}`B4MueR#:ω56B>$彨q4VdQfT"K̽e\H7tTLWԲQ*;%T Lp^ Ip̤c|+N4Uڭupsn\aKO n ނjq(;KmCScܨ[Hj 1 T%D @SخciޕU ^^x>%蹬vŨL\[/\d &kZI-8 <g<Xao-RUAKP?K19yہ+(o3;%áry_p%4Ŕ<jYUK9o~j6$e sTTLA:bdSsQQ,7M/"gBDԑȯoܟaX 7xO c-^-D=uP\qU:m7䉰ڞ[X<M0mR{˙L;E+gZ=B2|li~xQ(ݟM:cGH@R3R--;colqpkVOGĻɯnWnGH$!0PIkeC7[ɬ{wD^~P/ꆪE<;@ -MJ -&YG6%J9;ٍRHpˎfernkdY%N pb FfQP\k@6+Z=u"G\e7* mPSZ3ih;hޣV`B8u380ɟ3w ܵmV.ȦvBeg#.O hȒ ~tDԸz+sG+ɭ`@Uͤjg+'Do|pi&. -H utP[@PRd6|o -^% +J# rs829cQB*CJ1I29\a -_b VEq! -7,y ԾS9n%`i,ݑߞ72b֕-܆vh ^ψyP,nRTګӣd`KSHƱ0ę&f! ׷iov̕IMDe3| -GG»NaR֖QuWczkRe:E 1ҡDY?pNjw - m Q+77@+a srp^!!\3-cOu2*Tx))jU`r -/|ꐿww7}WJˇDCsWCK\[U_ +V[|DnEB K ]^]S\vp;Uaf0E$US\7J2+a,Cq~l͓#,)7q+z*]u 9&(#C -΢%3PUJ1W}_YF'E{ -Ju5*)bWCN3' X>Y$]'1_Hq+}y*˜Av *Y0kD. -Kj-?Əi A.U p`!1~5(Q%gC3S3V}0@*b.ǭE1.Yx̬J%pYII躌X|ItɌ|4n m(fc7XF\BU-:MWszR:1-ޠb""FßDT }BBc{NS; R -WAaX)x_#7q'uԣVz2ϒ !Bvl\LV, o0O}ﮯ }\fif;Ʌ]j>eY]9][h|\exaeQ+*z7bTśolX%J/y_w\_fW'bJP%wc09 f&DǼ?䡻NtUw[.tLe#XLmVƈ -PF۹JUpMxF -u}02(G4%#.a'7oMRX7Ae*[2 -WlE-B*RlǶb:wjD -QV m0qcõeCcWQ:!1ʸT_{K^"Y6@ }Qa -Gf"[f4+UT&5:%5Il -FCHXo5(3[c|Z.5dl`FЉŨlߘu|^'1- ^:PtCtj!(mkHg舆bVd[Us,6ҹK>Ƀ}af E/Q&f<|݆Vhf*Գ9cY% -lk{7)C1[ugb,Q+ jO wt5|q"uQwѨ0U §V& -w;eq @%N.>ĩRą-#+!aymr奀'ZWb#%?1Tsj/`MUj5*_@LkuZ 7(o} H@C0\{Z0+SG@,R WMj-HzߺRis/a#ȋ5Mv>ƅ"uShJ宙_s/kB\\qrܨ˖ECEQkCl -#0JL $34U1)xZ;+hX}cmᵘZfnYxHGYXÌrS9{P 0(n@v Ҡ} ݽX6̺f#՝Gk30FQ f!D]>||,l)xo=vEqw,&;"R\lN#UvVD^wvBluc:)Q0Hӏj*f4 )vPg.|O&4@i1Լٜ)bb<h%*궻nQ ̊nFcJR7Ӣ,xWn:@Y?L%RUZ~*lGaS~Fi#J֟wxQŽ ewƭK j#PG4)>VM O?chldmp'`.`{l:FA^_̽AYP̮Z?W :!^)|"q+ճGD#~lAx֍Ś/r]ƈ'zđs/@@n[*[F[vRC;B\htc}> s"ۤkDE-!TNJ\=RFU887&:x -Hg(Ԭ.dCQMA]BȻ8x -h$5.u?<a~ưe?T\$LŘF;R)2\%ks>ef~Lqs lV7f{dwDe[A(ap8j~*G>,`}V )Y[.&JYqBWC&?*n Ӹ|ąp_@.⑖bjXp1t䎅1:/K!7`ú+B{#Չ®IU pܺ -8n1^.STƮT)?.w?>$F=o{ɂڔPb?s5#7; dI~]bf<WQ躁Q5< Mn',7?=Tke@tI|T ]&,/:әX:upTCOx=Ih5 V g|ü$ݢeV ޡGlQ`#ߗ>B#+V_uE2ˋ-g6zC*ԡnz/LoOChM̼km8e_ 3,{P3,Tu -{L{>act|XgץnQn Tj_L7qecVؤ3],5 :b]!b^T8h.n_/Th4a. E*>M ځ+%-5/ y?˦}x⥚{,~wk]EiEFǤS(#ҝbĦi3TB7 (jbK)#PeG͘xu*6zPhe(҆v@WĮW4ĥK\Mg cA*0YԪ{"4f|`@x,aDdٕrQV0 -U}pc%1Wfרt"jW PLUaH)X vP%P01aS ~>?l?.؇bamCh+&xGԋ"c -eSr -u7(gZjV5eg6lwңA8սGu|FeѷK0+Hj&V)*egs\ SP Pc[:X!u]jZԶU_=)baz4rޛZ+DF <RSމ^-G"?O<킉_1f pm!S$RǏe>8\*jSd}Lc)0KvZ6D~M%vWDEMiK*V!/8W;ٖ҈ .aeg̸,7 T.׫IT|ܶ:suď )~4%)Mt>JY - U3 0v(>L w|fԲeXi\|JqRsyrx,;Q7(\aJ -1 G~,ynZk/Qx&/**Kơ蕙sM2[AYsZaB7> b${2F̏ *1Hiecsl|`_j9(mh:.<渻€ /rj '[$RvR!X^i] -JIVP1c>Z3Du?#g/$9}4.gky,7 ڄLl$+xIEǡ FZ{ -1Z@PVز j 5v",Ow ~rȡuZKJje%rX \*;0{v\C^qau`!4\]]F P笿2kPPޫ -H#e-oRǎp[ -%v --Gٌd/k&-PiW L*bkHtQ൤<~U  UB3V3g 8mk/%_!b -*pڴ2UkMP%~ [L PD5G[J F݀Ty֚6OnJ;*DgxDm'oA}b0hhՈiKBVxg,j sP(wLpqy*X%F͐%b+Rr.\Q.TRbֶr>:5KmƢz~˹[׍Z>~M}!K̹D^ȒWK|T<).Ac5sPu͗tYuІ VۖIcȰ*C^a.S3TEj^#Lc/.ڶShy%r3k*P_`xHtr:I[ȥ{1R%bGBX/^v.1x^r %͑N|@Qdme4V f..Eu.-3R%a 61KwFH+!`1׋J!|@Vd=T1#~#J)KCm.TH\n-COA'LΥowm\ &s[sD*1fwRTcN*>akؑ Nܒ]_u?l2zDV[W#赝zNq -oAp`wgp_jo2fɜj~Z@;榃uCJ -6Cg{z6m6`T@kC -L(_2 mF>wEYP#bNS"gCRX$v֭GCH`kq~`Sis+-iJ'jjfP31[k aC:%pdĺƥf ;@lJ\ 0l؎ZF-= ꣮d z5\Cp˵3:w4P?,F6Z ?'Gr{KXw)sh87T sU+{4Kaf%a -fB(_P$0=FW2+tkIM nru -* 1d(B |$OMl+W~|Շ -8֞uib &2uъ?`d jG/MCϝl?sEWq_&W!97\+ʃB_17T_&]WR@*|`2Nn]up|K\JtJIRDd,tU๺dzK XD0H<)D{FMl`𚛉*r3§L"ĝj]JTMĨL^c;檖[ ~ϚܢK)rtˉ؍eEV9艶āW -Dek<at,WP8u? S"rܦ2]-8|&uᎧp-mn/ k̾FVw\-_Amenhqc5muQ/o$Dmr}`I]@)\qD\*RNF%_V‘HueJ;~j! -]킭jJS6^d#eY2rf$XGqt}BK"JU15c=xp7b>CnIw޷i%k]@ *[e_Mmkl T-Q}3itJ/Xh|NS*Y?L!a_j6e8Q`,)u%QvS7BE 5 L}E0 -Bqj̐GVɸR4(]Kyhu>0ehJ%v7,T6t_O{-o+XKަ 4uYDZU>ȤU|on"[lwܝO!#t/BR0;?V5dVX->z85Zk޷UvڧQ[: -_p=tkö;5<+c{pp_M}#0/"\?Z:4DH_ETo0*}iV3L 69k}"W`09 Fq/A_'O +NP Q!hwdcd9֢K"Qc*4B T ;#Gtifٯ.˪br+),Y$PSϰ&fs7(rOFSE/0EQ| @Q,ƉM!T籰 26M6*LT@u*CtEėH,峲6K¼(&\/Y)w])2,{ ]ƱD`.zŔǺ'ΡPD rKC2U$q\!o)DE1HjEY(HJVA $t~x,a)?(UVUΖk7 շҺ-%MT,]#Jm'?ҍf߅?.FC lsT'Y| K|+cSE*"l~fy:=Ł{+CۍR,yMLgRĉbD6:Xg'OȰvs,|-+exQƣ5șGKn b!G 3.7p\qi%d E55{ynX'K^Ʈ 3nCXQsa"LZ]2K;~p07WK LF!u!BQ*?C\-b]_ -b;xajKБ; =ia4  vҘ/1&(+d4qhPD -z4QJl< &XZNEP.&fՖO"꩙"D:1tMGS 5|]LGq0D*018[j%\ 0Ж׀+/LTkNoZ-hEڎk^ Es::l!;h1nɵx:{''#1VHv0(`&b -tuuwTmQ]"BZZ*5&%UYl>YS_I8HuWB-pM*o 2*s`8-:t>F*5>[x!v2}h efbH4u:%UV! - v1[LP] w>B[n;j&=#[S .Չ.Y}Y"֩ؖɻR=d>-Z/QrD;tQy8;7E4yXڱư ,U>0Ȩ&&d[Tw Dko ,9+Y!Am-@UR"-Q E'fnYO  `qƇRUmr7TU 2 DK(BzF3ۿi Eml;Lzbl2p YְDUr0/U^OŒI(j֒OZ 2õ*F}ا@ jY}u rZC~$X&ݖOnq!L¤* C1bCs8YT[؇}ܳ5گ@GUS7ODO&CCqEe,jH)7-TS9X\B_u_reUL8@He_A%t[qrv_5 Ŭ D/<]Gw T^2EZ1 -p懊{⸮MJ -B_I:eUpԼK)f8&͓_1h츶PgNQ^DW )m¥]Q}c4}ѐz!QCt%Ll A~{)O7Z'CGea ?断'p=j#{)o-{Tf:N&jC,x왌4;Lx"0|IL`+i1s;1Y-&#c\-Kx~_ -$5o⬖OE/ф:9ZWzPJ%:Ĥ1Ql % `eT- SJ&P/o(ZP - `^_)miJemgp 9Pj\ns8?,/<8i_!@-yf@7wŜ 4\xQsD*$cn85Ig5Ga ^KG>ڵZS+Ei7n+v,X/X*kq A -.[n8.x$Ln%Կ2\%n ܶnuLUH&b$ŰcƵy.)Ӆ# 7EOY[ƔnP o -_^_>)c(%kJ+*$LŮ i7`Z#s7eT* e*I-qQfSLȷ.bb]L #Qn~1lxh  0mՌMfl# ^DS|08vkBXF[o@Pf;%:$^-X~1dzkGG0/FX5zF9iؒz{iIND[Y49%LWP4ʰ.%sQQ)_%>{8|Z[/I map1[ZJ \k> -FQD &,P?¥nJ1}_;_\]$}.)^‚F?2GG+ sLljM,Ԩ12{X J|N̴ۡQA?:2w ٳ6%%-c=?A6ǴJIKpzd6U-Xw{F4j8%mH]CWt}KɨQnvv.(C@vġjlCP[QV5./nthlrX wITXc|B`] Ru^'Kcg~7p`Ah}veUn);& Fy$uIP+ Nˌ,..(#T1@ů~ N]AlNsqA~cfL%!0iǧFSN˸ҫuE@D|z]U@կcB=m12bj8"{)TYBT4lhxHnELtR]ѳcD|G/ ڨ.>%ԵfNT$%Z\֣F{,!^e<:%Աuė-H0s.Ӕ m3r7Q%y[qeU 厝J]TnnYKRqe#[/%/X]+YQU4Yb~_}>TY35׆3ӻ SǞ$Yҿc]#BdL" D -RnUULJ[:4qRhU g̩SCJe.%w"j͆ͻG*m($Ys&U\/LS5|+ԡ#p=R6=J04k{'ffeuurTw7vZ! -x+f0T6?LKBdoIq+:CC+ȩPhTkr*⺖Ti$4RM#ԦYpv2s86ʞ"D; -tGo\u U%f)*BSKp-[1u-E*\x('R G&j W嘵p+$|cĀϑ -ǽef -۩kQ]UfԸƺ0*\<ʼnd6Xa!z3LUJoeu5FҐ2/0DGp~ GS@cWעdHfiAHtje1ij.=J*RaDaq P`#aulz`a -x kaZT*fSFr[+SPD\:γ.^crbhE`ʿ64Ȕ^t.5Q?M=°'" asqOVj<# U˞3&wSrxEQ;pjªmWV71m]KH|#&S)5e{݄ rs}+1U6JSQ:q=Mb7X_G%|D'eƛH/pUZ%Ļ#UpT}1IVzpOwf0q`Ԭ3X$AEv,y]lyNⳛV.=jPV0@h8a5vO{0mR[¥IEIP c ڼnwoS41$}HX%"B"3EBKhX\l9Dcl  WU6 Ģ>H C׿Y"fꋕ,e6kzTHӗ[F*mlNi+B !L%zT:n$ hȢK |+qeqy`7W xJ+B.ڕ^6jSkXd].| C&`u;QZ2~HKRe^&a_.7E%)mt>l-ߕcft170Lj_<{m|jfSܩE\5ÍTwSU7u7edԭ蚋.]ƪf.=I 2'Ff3(^җ = C\SG -GEL5!bq** *DdD -EMyY3#"SPeeeARcouEczV 7I|b+6lUϠKtǺzF__d12|QD: BVPbJҺ4Rc2bP6S,'cU/BWh3Ԩy m8/JYc4U`4Sb|Lx\mNKKy\/bl׈@Կi4OVQ=D~UfHLK#t;5uی(m`XtQ=\(: ǂM C,?6(9bM!Kete1/VJm39D\:ǏlŴNӺFjZ~ENHqԗT-;PQiV| `JX¬Z!a%6F'1 4W -9 jݜ jdX[Z.8*wPt}ȣ?Gl -B@,~slNgp>qo0]K; SK0*o+RQsq)y(50sbc5p2!]{JcRUT4|rU;7?C`GOE(YR(Ќd? t`&+Fy`Dϫ;“2Tu{"IvWF.TЀ+k-3|( Y<qE 5Әa!Թn"X?1|rۓӕ gqmjt(04=/(vC6K;3Q)'a%HG;>!=N -t^ r"rƛ$Ƕ=APxΆmg?Qp=gLGDbVzFxlY GTWֱ57sew -|Ƹ M%u {RۨĨB`cg숔W&u]H}?A".vѫawS+s8.ul f/)bgu7Hp -g7Mot.62 BHZt6Sh`MvnBPHAfhgx7~#EQ]7 UCdʮ8S-|\"([ B֯h*[Tehܨz,c%PL m0<4ne0 B$7*%q<1+(Z&"xLiek+7)ny0̾T# -b{rS2/lR0HBR7`]Wܾ9fr|Lஞ-̣>eˢ,Bo'oP8 &EӮw7,uSRHG+X6@~,Y*Ɇ{YpA-hC GTEdP5 %םVTh~'&j% pbK},K -5:`2 Ԟ 2\YSEKE -Tob'6]gA`D_C$_%?B΅m$EIy -0#8(N -*QQ%bUrC/ԩT\7o &w ~;(i׹j Xv -?(IM7/EOrR¡.l2QWi͘ڡi$ls⽑ -2PbxK`e˔ql)3Cf\B2S_qH, ^*(?㗘%*?d{0@1mMu8&"N 5>aӳSVłOp۸+ʪ^&{嘶0n3bN]-"]K246%e; ,H0U"ElX1_qڮ-l(Ɉ}~GPndT-\bSr0/G s znSsAPR.4Pۚ|Q<ײA:aːa 09.-_2z=@Q-{U a4_ KE]M(u`N+wZ/W3>0jOv*˔BUc.e%Vr0;(ypFF%]%ԲTƢ¼pUq1, _T e%G@F.3r[0$ {n]\NI|.ek&~Y6{K+RQpVQ#e7~_bP#;Kj R\j.rKҟU$m:KRfus6ƻ1JD =OP˕T/1.1$W^vP"1b1ln=ʯ!HQ3*/6]ℱUP݄/CKIbTXI#A-hH) -VQ, ˀ-kv4kDC -] GUǥ~{|U1{-;X nI}J zn+ω|`o`}Y\WmB%xW+EVJ]Fu gLa(:IvΡ>Le|Z pJqsֵB:|\[䕝57, ֿK׺k|f7i"n*S``}2M2`U㻄haL -yjʼsL*j啧1Pp/M~P QP.+0-@ma4_*h'@XWZ<٪t4C/ZQ+5m~ją+6垟r^h2Kpo[̅"X60P>ph0 K. ""0|Kj,!7?Fqek v4'&2Rc -4bHeI#}_qBTK(U^EQajv -ܞ(Vy~Al9~ϷV.P*7VeBgCIYR!Q[V+S -G͵݋SW4rg7jT&0K@7)Q;t n`{,uZ]C,40,Ŗb* ܨF)Y狭b;Ġ|3KP~N ê]R:.__>b,=gˇVUx.%8b*o44>qLT&jj))U}KV_FT)6{&y+-C]**x -LRNvjk-b`ci -# XO#h[eH8q^g-ԔX_GZ -2 &z)SQ% -EXoD6|6$mծ[ط-JE:33XL5rZC!l U aDIbiUGo.{5D"+u4$ s5eW -]ʁ -A"5SXBSlضich$U eT\s 1|]DP8k,2̀SqU6 jfW:/5 -3G$F -uKYTr{`1%R3|T]SR?&&x c8#}N/5{ݒ(F%vxb@nel(M#)컠S9[R//5H,p]tK&*[DF*5 -R-}wtKjXPGj+4rp`7c)Ei6828|Cmzj5X,%Jx'W pm^*0GP`bj=q Cv2C_8j0OW=2_/"L e2pQm$c-n8Vї+"98v1طa89k~^-~eMUfLi!WU?uc1l-V(?C)>'wrP%H{e 32RYd⡫" VKh\ė+,%F1%T+tJ n'f F7:B*̝C=1 m֦ ]0cURk/ @6P1`DpuZNĪD! -E\u5;kP#7*a5|2ʞNM#\AotbO^i!F_qp%T,ጹiS<]: -NQ]F?$?j6:BbAƒ.Jk>zFݱ3ZzcYy S՚K_D~f,ȘUՆ,GPXE"i[UĘ41``U;ȑ;yjdjҡ,*&ZÀ-e(=` j)[u䴯6C$q&Y9] n#ۘ(Aev;nGMʪW1Q:[USw@&LycִTN.)ڸj>*5'e`* Y@|NZvz'Jnwh>00 KgzS_QVn}ϲSMÊ̹}MU4%d,XfbFU"_ar*; Җ1\A2FkYz8@;G̸mnQ2Y~+B@7S){!mVj^6 e"՟M\]ib1#Z iW(U.~aҷԭ+Ci1C>xic1d+Ŕׯ/V~1XZU/)ȁYeq}i!As` -[ZO -醙LN{%V(qBAo}4GNĻf ԥP9ѥ?mbCoU03a г,~T9vL9d]:%ip/`F( -R{;cU wzR "ή2_rWbA}F\ -A5BLQ/_@ČOv d Ǹ^"ΦIݱch5v;xL?&>56y2T"A5J:;cާA6EȨ6A Z KIg20pKIJ>%`wnTUVKJ.D(hA]KCZ.RAtG^~uծ=|LdI&f)mSn!aܮßo .u.7QCl3cFø1j,rq\l*&bBW%W/¦e%Q%qSS4,Lt -FT{#َ2b]vmor@"ȫW: X''pB5uU8\74"߶6!zKZU|JÅJډ/)[.xsPG|_ .-F}pax&cQ)lJXwPb/5+ 1*U<۹}~F&^c^0$&3#}j{mFMY -FވuޠR$n>IUAwXR~Jc\ܻvmv U|,.Nql<ľtWKBĉD K͏Kn7L` !J],A %.YT - e%}=T<\BڐUR5 -p^X,nϹxTdmLQJoܝz{ QMm8qsARܞܱ0[)\UjTڋn!sjUDOxBj\.[,uj6XZ:uv+utMERq7t5XuIXTjE<ӯv ^k+#Lvփ)^j-WV%eVAr (UW=quIk仵﹚Y\ pV %@dd]b%/I66v,0k{HyU}AzUkQJ[YڃieW t>:p{[}]c1^ -v`kWB %6U |ͪ{Zћ";OXy U%NAsjhUvK>>cD {r -Q|ƙF| M1Tˤ{KhK<ս P/ʭitpB/j% ¶Z^?t=qoNbF/uBnKXY{"k5pa>ݙ7]+z`@Wd2N SmS0=c_(i*iDPKTE>! {wR<.;yj oki.RʄhK)h{G@M[Bk/uY -ص%Vt.SjV=3ʱ4ui,2-+ڂXJBKS.Z,!Z|! 0f#u[]A]q9~Y'f3Jt<B .u5RB`XD[Y ܀qE&^<3%[_P!B&k-]0DdzhtP/0oV -"Va qFmD퍢~eͱZY#<y .Skj@eM0S9~"0%AGMav^٘^Xu{`mP ^e=Ю,$g,c+ٲljap`-Cicv#U# z*YCm&D>:q*i9z,5AWM'2;pG6 m P-}g 7ѕzؾբ hGEpʚTbjUT8|!Q7QHbnP5oQizͣ=be#:/⦳Ӫjm'ÿR:~pmK+o:R+k hT؂ T6`%8Vĕ-΃ՌJjFQ7Pe]'W5]y(ZL\nf4[_'tU*!y"MAL;n3 ->45t ~d@G'T[J'm]HbPT{T!o&,u)Y_.! QچL,x@RS#.aA-ڠ`ʴ,kӭz_i~AVc܌XHo,\ބ-G'#@bٲ'{jZ͍r|ڗ-Ae.lN@VWIQ4ԥG#OS5TLAaUSJ *M}uӅOLGlJ};[6pН63| 1˟2eT$cT*Pe#F`Չ) 8r09RTUsU ]m -o8ǝEdz?CP((yY.bʉP̨NNT8V\8nܫ5-j'MNcS)}qS+ƇI@;t[1wSC$#_A>xkE3oR2W/@FKN`o>.}dL1Y+2lJ.Wsm-eW>\)%~qA)vJj0I5. bʞlRGAC+3_3.\Ե,D*Z< m/<0Ca'HLS)6U~;VKl #-\]|n-X v"(vy0WT>w%S]S+B op6.HQAw۟آב9PE0n諉& \TmmQ -5PXt*Nf3>E[nu-55beu^un5dJe6X\0.V`ɼPa ~eBg4.t5mDRk9ӳi! XdG(6;Ԡ86Q1/>q7VD%ѦYڑ{+52TlV`R5)o3=\=S40m(ݣړXTR.)e̊0/_ɐf KlE"\~>nMp<~)^E{+iiaG,Vп/jFg}7ݟ}k/#",uD3@kbJa!OFQLe; ^["7*5Y?^hԗI677jXQng?CG vhZs20ۂ&䦫NI&L&*wںd &j }Z/T|qb" UHPفBn -^@+H-?p?2cZ+eCWfatD\~Z’K-σD+]%Bv$Gn@W Pň(MY۴fc&.WEe0 ,g`(@JטO6^(s0dR*@baD.^ `rK|f!\cCxe^rG'Co!FjYBQ -%(eQT!w3W+rī/|7w/-EX{>Sؤ~ D'MQ#c##T>;&-ޡiS`GwΜں2ݺi `V!UD!s ֿe.]3rOS73 2L]J-L̬Øtod*OaS#]t5}A -L_u4UW2#i20tw<26P*j H}r"ISLh{1!~e\YeVn_jFF8̵q M堪B(\R0H4.ZDΐ -}2#v?)eb$fUFTRڎ>0 -})VcjjzigN'3c, - b3>v肎P_P@=qs,F0j^vd(mXREeuc;e GR\EBaaڸy⦄~ ,*A5SA6*Ҵ{QbA[Vuࠛo,ٗJB .$+~dU5lt3j27Rm_QnՇ4*pRkEc1|'Lۗ0! --(PBWE -ϦaY+'$пP>H-TPcܤʫs|u'D×|QE@E)8X3?yEB7c>ޟ!޼eiU0*,S-3{!nSur y:5߹J'uԶ^ -l01Yn/DorDbo;p![./N(=Coe -`DMF=7N]UO[F\n.mAtp bU`?1*rC &+ٹqlWQ:L!sU*R8#~"4tMN^hU~N~+rZ\GuMFTQ֥l2|5a}(AfPE{(VbD57sl #8w&Yn; ܤyfpFr\Q|ܮQD(vxW|$. -*VLICwWYីHb7G 1YU.\r a u76 X0ߨQ$[2tJ#3UWaR+PmCc$:c rI'-wEQ"PKʼn -2ڪFRsUDO먓4`הusT΅bcVo!Wc"R.l^eu}Y;?^A+mꊊ6!?ǢcM`We/HleO&hZ}DA}u,E1{&n6V&!UEJȵXw+ٿmBu۱FJ'j8a-[UjYD?*e=@_?ԣߨmw8eY򄔔Fv7kV\A"S l([u2 -eB4K3,뵺TYj0_ A^ -(Ձ<2kim\RS[%.]yUk]k if$'w *D0{d0fP꭪hqD'{5x!Ȯ1>n~ I'T?"r?eH%+bCl gan]Į]p"W 𒹹dO<U^$=D >-ڈ!t9JP+PY^r@?UBS0;$%fgp1kULJ\.1jxcG90.xE% T;Ĩ.p_]ӱ, -K7WĶ^fUIqa3w0( -L /L-`JXH^&"Q4*!-˨Wr㰏"qpa W -%Ws/wPJ 1?qxIVK×9$&,!/qVf$;& ELXVQвLuFLKY}FkhU| -?USt;3`|Ӂ \"#R/GweLf1u27xteJc GFkKvTԬg0䘩Y8!h!-B.Wʝ:uf7Ejf`ˊY]EA#^b4 8bA710D(drJ~̾ lB1|X]pH/OkETZYe+ }H*^A;ZVqar1/&%g*jwg'5ƽ'Rog2ƪ0V&#]b!{.WsbuAGB_ ʌW%ø8U٣O\Km/*NC˶"zֈ˽˸g2RᴈC,,{_4$_\A tԩȬL%U:°KĻ suvC.GI{SQ)o![m)4^ yR:ͫtk}ؔip (r_l}}ZC(G[XX/DHK(z!) -!Z=L-`?.\,EeVe(RŽ!.̎M*(j_2ܰנ֧lԚD8[2Uei4^pW߅Vt=1`4@qVĥP FɏQp&棓J -#z445?Ҕ@.ʥiI"HOpQ#zPħʽu"`Ca=0WJhZx@kLWs~?1L!r޸$۳FjQ!ih_>sfVi:ջW:oKz.mPKP*v0W-++e'DaT,>j.[UWrmc~蒋J[fn9!(_ˉ #LV4̊lh֍^( 5d@.պ]Tpm\|闸ZԨu{u͟KQZѩᜍa%C+"gZ~ - # o#Mjv˗BS+حaJ(+dK`B=XRڶ"4Ьb Bn2vՆJ偈JOƸRCMT*<d WY/#UF#T)pf J ,Op豤?KE/ΕOkr?nzŒsfs>'dS%ƚfIl2놐{GoiXz8Pp*40%M?/T KԨxH5Sn3T^TĴWd%+'7-nY$8Tn5>fvK>5qyIJmK>!\)A+ )L^51Pxɺ9([k$_ N^FQ*@m)hY.dwSRmX7 6Clo`[#.,[mn8k" jrLxF$c?J R$5Q͆X{!z./OE:0zB%baؾM7l12#L&7)^ 2r0ZDk?ě, %eZ@Ngv#oeV1'_CqGC+?u7_IU_Ub],.gqMZ11p݌#_ݟTbe^zR>b 2B[Gl66Ew(|C.V}FU=]PڱruߘN7n/L(V -!Vg>TzYvr|1Wm12,>-U56H"UoF.9HhvTUԼݩE^}7(mkxQ|C_7R-ﰫef|]Y}ܺv1~^%?]'qùw SX&Fؚ`pjڰnN EQ*Q6 L A?` !@ BkҶ7hV$麀%W>d>LMNz qu`Mxsd$rjtԎ,0 7ڞRBtLdٯH-OP̎ܗCm*-R>y}wQģcu=!6K]`E am>VtCfoV1q۝O~e| N@syFjLWm }Kؿ18/YD╜CHo$܎FQt$Dl̃!wƗAaڋ/t؅ylw'@fb,4 1h6La?\ugY!F}Y6%QkWU {_7yV?'FP;-`p -"DR37,I'oH:T1UQ1b@kT5F'kG'J#2\gnq/g\= gzUH枵Ճ.(xN׋ՐKujSXԨLu^7- LZNDmWF+n%.Z*O]PG{ :"{Wԩ\wɮ1Z***ZAM2ɩv*.e:kc,_s8̊&mfuE >S9A',u]c=CL.㏘%C7`0./ < XQ.YW O~|:mXK2 @2ʇ%F\Xn LjhU0#reG]Jx7ѧ>GEmļ`%,}S<2Êpu\{ԨK0PO88dcS|Σ/pD c(ѿOϻn̅Te>h[<M^Fwh9Ba@(&$i?L^RT1t2>*%[,N#_g MMƽ^իA+ kWY <7DyAb -&]UQH_mǵ̒~,J) F6JMtLtU- F`3H1} \>db@BҰ҉"ms =N+HMǰOY v&-z{qe޼ml1T+C[z`Sքއ2&ۦEQlBڪY Ah({_ uA\s&d)UkB;ɥCCBڌ2zE~kڧCVWƀȲQWbnbiH\)ZH$7&Sb7} CށKB/p.ނba2VfBEV --rbD"stƢZV_s=C9Oʀ+i$gsyO d^Vŀht\n&"@"`vySMU(dƃ3}elcY>a~jH\}CTA7'jou6FW#k$ll(a -[KU ~ȪA$<;{*Q)ϛI  ˍ]FT/ -*yV --XUQKvv:Z g|RJC djThif5`3sɳk 7mCUFa+ -[tWԩl.6Yp=KYvWޝ_•Nb K5eE)*JmRBm{g2YEG,2v[B&0%Qpr]7tpDlG_&F&Mf JJt,1H(F Ţov%z\/Pm1+R+a٢ ` -~u T8hfʙP*69>s~]i:F%ǵ÷OFb" ڨA, j8ʖ lb+!:]"U@ZCkjHs:1dvf -h,Ic UJ0ʉ^PGQ1L'`&$(fN22[eX&!PPXA.~L~zl1p&Q E֬"cٔ0Yu$R#P \q|2w -ƌ֠)an01b2jwlbQo*MB",K!>"G#!us*Zs4߹MrQV.}3q)JP*5Uu݆J )kijɳ|8-/ E=FJuG -ȮL -- @I]@l65k/  h_,qlRvrX|*W_w@ee4W(})?JĢV[Q<@AX~ ) O^jWZQF}XmKrB$3)!n:I]ѯld?j6=ɳwbKڜ=*wdlvIQNT\ ?+π<Ib."') 4EbuJ Wz*hKXQ0C±*zaMbZ0(hmf2 RjO% =lj \!9Ii$w1i@L-QR0Fb\ k0}<{]|rDz˟wY7>wu;4r 0Od\Vfd&hH.Y]¡X \E2NRQGu/R J􌧳}oq:@R*a F0-V#w}AI?}S1ᐆ^C#bձaX07OįPNkkaQ FY*%ψsu)SJ+RE -<ŽhY*m" ЅZ#! ԸࡅKŤ;c IKll} p>aDvP筎rAFɘR\[,UA\%B^%"Zp]̢zd6(PKmArቤI\/9θjnw+Ufopg\Ys5".>R9eYRKvA"*6$j}D9#'DWȓ3:5XH?/P]!55TQߜ`jG{ w4qsbsZ-׍v@gV*ZFG ,1E[ܿ3 Z)BW K%U mD# CUlݳ³ 4b+VUQIҘP'@8-w6`5 -63 >$L*V?YTdY+=?mM<<+{k)nq -06ʑaiRIJ05[!7q0hZ.9T&jKaCWY1T0Y*j*.D0\R=j쀻rk E9'uPljC*]} Op70reݫSzңª[ -W2>T`IO -J\{ Iw$7t00\=&MKJ8G8 KETi8R*S׊c5 X|̕:`QbTwBKxAq.sZ6LN"% -'cDټ4ODKCl2;2)1*y2 -0hs4 -/YSL(#ŐRc"=|d̺[A'Ɯ~ -6udMfjWqܬ/`e< rH۹$.HX!Lx wU/D6AL@5 -R&7 J}AbQ/̾R]#/+h<˱CFv\R]$ًo¦K_ -yΥ7< gA 0p]jVD>N jΓ{n$ѵ-8 hTJ> x)lPV(* O ŲfqgqRSoRue7 -ĮKՋL}LXTуЭHcuV()݋4Na5 Գfbu,KU_ŏ[mXl d+*]E|\q D:Q_/&_PK4F|ʌ+ZHvwqn;e,&`~5)w5J8 L\de2ɊpD:Pklnƈ J ڀR;[@*(XgK*,fP=y_")~N  x Ӹmhmߩ5_$z!G\gRE/!Fu ZRܼnQW%sVS_Q%WPyCcՎíF? {w," -L_ -ʃ`.p1P_bb< @.zU@0n%1젿LdEaXE&+F5?X>1ԄWqL2gn@E A*7$ԇЃ8i/<:#K.'v o \eޣ711:#mAmX} -خ5XAՕE.h%RkK:LCpba}@*> :Z!?C{g.( xT iyK!"+E36PC#r LJ5d\ESQ7"-G@YMUh Rd[W ̱="y#b7P,FUn! -vl=XSl.dIBOLd{0 [GUZ@*F6JtCdvݱ]A(!~ݝP2"=S6VB* EnkOpnqbx ٕ>);_/Dy#\UbT7V$jZ) )`{(_Ņ*=v@@ѿE+'eWtBDiE٪O >%Ñ7SWl زj4u&HVaU|rU x$svb:7ewuzwI7]~ohۨYAӵڌ * -?lrWwMP(h+~NܳP(g7Լ/lAï#0c۟c -.ԁi]LAKīal#?d!IA|2t'e*6 a>tHUHIQ$#Kx`XEF!_}k2lro[;Z]oL y<r)1z UVi,3mRNCZUyW60tV؛IwduRqedsPIvKܑ6ynA/T'r]zGP_-6=CרYx.c)].daJYZޡ2z8eƗYYX~ -(>Qڭl-A[|B rCh;#?L\z'>o. _4߮4jp؊!:W,C)`a޶%m*jнYZ=c@tL<yYc0CBZ J[NpiK}0ڥdXn:x!;ahU`n9FR Z N?2 6M6 )|Ԫ>JJT8j%-FДt&*ѨG+wQڞ9ɇ r'_<_^.<8p RUTMQ+ECQ+E\0J -om~"R%5N]s2wƧq EcAX9aAoYC0612cmC}ݎn6KkⰗ~`A\n2n=EۃsS2ڥ1&%QClbܧsRr:|^{s0a8c.\&^#cdT5 p%u(gp!/|xH&_J̘g{3a&;SGȵꙪ}$zyK$ b}KBdiV/ >  R2uB?=X/)Q@J@!PSϵᗈe+6NJ \/FV/wPB|D}%WKI)+ ހ PzJLCmjCgcwnયPDFϴP%z>*.6U8۲bck<"w/̗yWUQu93ac0 wV萔'smR?0zdWClq!(ۺjvmY_0U4J -6(?j-|*=V}՛A>'9/ ^KUfUS?fo[wZm"C]hIʐDFTڻW̅j&C5͗zgT# M"{.Qഺ/RP5悅1zo5|EnjBoen|hW,'?ĄΚ];D|j E'"e*-Z߽>D t첋L 2[/V6̀r `hU8YJ-ٷgO^DR~"TWJ=t1E }͋+0χG΁o4_|(uXu\;_hD8K2zQQ cl1;fSډPx;>0-XE)'ux9/;f͚mYOE1΋^y_,RDcǯ - Y22i1:̛O!(.@yPi̼RDn_CU_S(p~y"[EѤC)Nd=7&hJ#w(Zp]>|J!`@p 0P! ?#Q3?,/{V{-ЌM ̬1b~gVybhDFfΉqzǶћ Ll!O7m{G#Ge37:<{:i71G<ߵM[{vR<QF9m!:38<.D>/}fu: >Gdr" F;Y3VpA>#m"# ">FL3}yVܖ^#338933x$y2`jag! IѤFv#ffy(ϙLH/pFp43Fu# ~8GlRg˂3:>m:.6ς|ngNPRDu}g$#I p ?6t.-0C NJ -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000013534 00000 n -0000440843 00000 n -0000440974 00000 n -0000441172 00000 n -trailer -<> -startxref -441309 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/07bec6d0-e5d9-4191-bc40-ab3d53e49736.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/07bec6d0-e5d9-4191-bc40-ab3d53e49736.pdf deleted file mode 100644 index 3f0b2db..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/07bec6d0-e5d9-4191-bc40-ab3d53e49736.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/1056c40f-8635-44a7-983b-33deb98d7ea6.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/1056c40f-8635-44a7-983b-33deb98d7ea6.pdf deleted file mode 100644 index 13fc82b..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/1056c40f-8635-44a7-983b-33deb98d7ea6.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/15f018f0-14a4-436d-ae6f-42fe54f76c85.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/15f018f0-14a4-436d-ae6f-42fe54f76c85.pdf deleted file mode 100644 index eaf45b2..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/15f018f0-14a4-436d-ae6f-42fe54f76c85.pdf +++ /dev/null @@ -1,2292 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 0.0000 -792.0000 272.3976 0.0000 0.0000 792.0000 cm /Im0 Do Q q 0.1968 0.0000 0.0000 0.1968 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -51.6498 0 0 62.5 102.04 3416 Tm -(S:3/946 ) Tj -51.4479 0 0 68.7501 394.69 3783 Tm -(JD. ) Tj -31.8504 0 0 68.7501 493.66 3783 Tm -(CONSTANTA, ) Tj -27.5589 0 0 68.7501 711.87 3783 Tm -(MUN. ) Tj -33.0138 0 0 68.7501 810.65 3783 Tm -(CINSTANTA ) Tj -32.9481 0 0 61.25 495.39 3717 Tm -(STR. ) Tj -30.1366 0 0 61.25 597.78 3717 Tm -(ION ) Tj -29.0936 0 0 61.25 671.86 3717 Tm -(ROATA ) Tj -27.4226 0 0 61.25 791.11 3717 Tm -(NR. ) Tj -0 Tc -61.25 0 0 61.25 872.26 3717 Tm -(3 ) Tj --0.035 Tc -34.4765 0 0 75 336.83 3643 Tm -(BINE ) Tj -36.4966 0 0 75 446.92 3643 Tm -(ATI ) Tj -39.293 0 0 75 517.9 3643 Tm -(VENIT ) Tj -51.7261 0 0 75 635.62 3643 Tm -(IN ) Tj -32.9459 0 0 75 691.84 3643 Tm -(MAGAZINIL ) Tj -34.5853 0 0 75 890.83 3643 Tm -(BRICK ) Tj -0 Tc -75 0 0 75 1012.5 3643 Tm -(! ) Tj --0.035 Tc -39.287 0 0 76.2501 537.58 3566 Tm -(CIF: ) Tj -34.3531 0 0 76.2501 636.83 3566 Tm -(RO105C ) Tj -40.1204 0 0 76.2501 776.43 3566 Tm -(500 ) Tj -35.3476 0 0 58.75 514.83 3852 Tm -(FIVE-HOLDING ) Tj -39.0613 0 0 58.75 773.27 3852 Tm -(S.A. ) Tj -43.6198 0 0 63.75 65.68 3355 Tm -(IFRTIR:FCRIAN ) Tj -31.8791 0 0 63.75 378.92 3355 Tm -(VALENTIN ) Tj -28.7849 0 0 63.75 575.96 3355 Tm -(UNGUREANU ) Tj -45.9871 0 0 73.7501 67.77 3139 Tm -(RENT ) Tj -44.6869 0 0 73.7501 203.52 3139 Tm -(C.U.1L/ ) Tj -42.5802 0 0 73.7501 377.54 3139 Tm -(C.I.F.:RO187985 ) Tj -52.3975 0 0 81.2501 82.02 2991 Tm -(SCI ) Tj -38.0489 0 0 81.2501 181.77 2991 Tm -(ENA ) Tj -33.9928 0 0 81.2501 293.8 2991 Tm -(EKTRA ) Tj -37.9217 0 0 81.2501 401.54 2991 Tm -(35L ) Tj -37.8232 0 0 81.2501 480.46 2991 Tm -(506UC/SET ) Tj -39.345 0 0 81.2501 675.5 2991 Tm -(60 ) Tj -50.042 0 0 63.75 69.63 2927 Tm -(IF ) Tj -41.6405 0 0 63.75 128.55 2927 Tm -(022100121038102 ) Tj -41.6158 0 0 63.75 441.47 2927 Tm -(6422768920146 ) Tj -55.8447 0 0 72.5001 75.96 2855 Tm -(SCI ) Tj -25.3004 0 0 72.5001 184.9 2855 Tm -(WENA ) Tj -33.0485 0 0 72.5001 295.8 2855 Tm -(EXTRA ) Tj -38.587 0 0 72.5001 402.54 2855 Tm -(35L ) Tj -36.0959 0 0 72.5001 481.49 2855 Tm -(50BUC/SET ) Tj -39.345 0 0 72.5001 676.5 2855 Tm -(60 ) Tj -0 Tc -62.5 0 0 62.5 70.62 2787 Tm -(E ) Tj --0.035 Tc -41.7836 0 0 62.5 130.55 2787 Tm -(022100021033102 ) Tj -41.6158 0 0 62.5 442.47 2787 Tm -(6422768320146 ) Tj -61.8461 0 0 63.75 73.62 2716 Tm -(E" ) Tj -37.9 0 0 63.75 155.77 2716 Tm -(ESELA ) Tj -52.879 0 0 63.75 287.25 2716 Tm -(5. ) Tj -30.0507 0 0 63.75 352.78 2716 Tm -(INTERMAR ) Tj -39.0208 0 0 63.75 522.94 2716 Tm -(UZ83829791160 ) Tj -49.434 0 0 60 75.3 2652 Tm -(501 ) Tj -37.0445 0 0 60 155.55 2652 Tm -(33-1026660 ) Tj -34.1789 0 0 62.5 76.83 2578 Tm -(PAICOP ) Tj -32.5007 0 0 62.5 212.84 2578 Tm -(HARTIE ) Tj -29.6798 0 0 62.5 348.85 2578 Tm -(ROLLOX ) Tj -42.6911 0 0 62.5 484.5 2578 Tm -(100 ) Tj -0 Tc -62.5 0 0 62.5 562.69 2578 Tm -(M ) Tj --0.035 Tc -30.4536 0 0 62.5 601.67 2578 Tm -(CELULO ) Tj -53.0458 0 0 60 78.8 2510 Tm -(W93415 ) Tj -40.6337 0 0 60 272.76 2510 Tm -(E944568000289 ) Tj -34.7343 0 0 62.5 80.83 2440 Tm -(HFRTIE ) Tj -33.434 0 0 62.5 219.7 2440 Tm -(TGIENICA ) Tj -29.8144 0 0 62.5 389.86 2440 Tm -(PARFUMATA ) Tj -0 Tc -62.5 0 0 62.5 583.25 2440 Tm -(3 ) Tj --0.035 Tc -32.4177 0 0 62.5 621.4 2440 Tm -(STR ) Tj -0 Tc -62.5 0 0 62.5 698.69 2440 Tm -(M ) Tj --0.035 Tc -49.3321 0 0 60 81.93 2373 Tm -(U904619 ) Tj -48.7767 0 0 60 275.38 2373 Tm -(62276806594 ) Tj -41.2209 0 0 60 83.79 2304 Tm -(HRTIE ) Tj -36.0569 0 0 60 222.74 2304 Tm -(IG. ) Tj -30.6377 0 0 60 295.85 2304 Tm -(PRRFUNATA ) Tj -0 Tc -60 0 0 60 489.28 2304 Tm -(3 ) Tj --0.035 Tc -38.6087 0 0 60 527.28 2304 Tm -(SIR ) Tj -37.7141 0 0 60 604.82 2304 Tm -(PIERSI ) Tj -50.0912 0 0 58.75 84.75 2236 Tm -(R034620 ) Tj -43.0825 0 0 58.75 278.45 2236 Tm -(622768C66907 ) Tj -40.6456 0 0 75 86.84 2162 Tm -(WRUE ) Tj -38.2657 0 0 75 233.72 2162 Tm -(IGIENICA ) Tj -31.2628 0 0 75 404.85 2162 Tm -(PERFUMATA ) Tj -0 Tc -75 0 0 75 604.09 2162 Tm -(3 ) Tj --0.035 Tc -31.8388 0 0 75 624.41 2162 Tm -(STR ) Tj -0 Tc -75 0 0 75 700.83 2162 Tm -(A ) Tj --0.035 Tc -55.518 0 0 58.75 88.35 2102 Tm -(90I4318 ) Tj -38.8769 0 0 58.75 281.5 2102 Tm -(6-422768065987 ) Tj -34.1303 0 0 61.25 90.83 2035 Tm -(HFRTIE ) Tj -35.6349 0 0 61.25 228.74 2035 Tm -(IGIENICA ) Tj -29.8107 0 0 61.25 397.86 2035 Tm -(PARFUNATA ) Tj -0 Tc -61.25 0 0 61.25 587.26 2035 Tm -(3 ) Tj --0.035 Tc -31.8388 0 0 61.25 625.41 2035 Tm -(STR ) Tj -0 Tc -61.25 0 0 61.25 701.86 2035 Tm -(A ) Tj --0.035 Tc -34.8856 0 0 60 91.8 1974 Tm -(LER0D4318 ) Tj -41.0978 0 0 60 282.48 1974 Tm -(6-22768065987 ) Tj -34.7873 0 0 57.5 93.35 1907 Tm -(SLBTDTL ) Tj -47.157 0 0 70 67.58 1365 Tm -(TCE. ) Tj -33.0361 0 0 70 194.7 1365 Tm -(TUA ) Tj -53.2445 0 0 70 261.88 1365 Tm -(A-) Tj -33.696 0 0 70 338.82 1365 Tm -(19% ) Tj -0.0369 Tc -60 0 0 60 68.46 1299 Tm -(TC. ) Tj --0.035 Tc -27.9536 0 0 60 186.75 1299 Tm -(TVA ) Tj -26.2584 0 0 60 261.87 1299 Tm -(BON ) Tj -38.5607 0 0 76.2501 149.81 1226 Tm -(P02. ) Tj -46.7772 0 0 76.2501 243.77 1226 Tm -(RT. ) Tj -35.8104 0 0 76.2501 352.74 1226 Tm -(IN ) Tj -33.6224 0 0 76.2501 402.84 1226 Tm -(BON: ) Tj -0.05 Tc -68.9394 0 0 62.5 106.56 627 Tm -(247 ) Tj --0.035 Tc -43.7946 0 0 62.5 237.79 627 Tm -(BF:C99 ) Tj -51.204 0 0 60 108.04 420 Tm -(S:84700011006 ) Tj -47.6263 0 0 61.25 109.77 356 Tm -(PSER ) Tj -40.2626 0 0 61.25 240.59 356 Tm -(1: ) Tj -34.3271 0 0 55 560.63 836 Tm -(C3POS-CT3N8G7043 ) Tj -0 Tc -73.7501 0 0 73.7501 945.41 2937 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 73.7501 967.86 2937 Tm -(BUC ) Tj -0 Tc -73.7501 0 0 73.7501 1053.84 2937 Tm -(X ) Tj --0.035 Tc -47.1501 0 0 73.7501 1096.33 2937 Tm -(5.53-) Tj -45.3278 0 0 73.7501 1203.35 2937 Tm -(5.E1 ) Tj -0 Tc -70 0 0 70 947.54 2798 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 70 966.86 2798 Tm -(BUC ) Tj -0 Tc -70 0 0 70 1044.85 2798 Tm -(X ) Tj --0.035 Tc -42.2151 0 0 70 1092.4 2798 Tm -(5.53 ) Tj -47.1816 0 0 70 1201.33 2798 Tm -(5,61 ) Tj -0 Tc -70 0 0 70 1305.84 2798 Tm -(A ) Tj --0.035 Tc -25.763 0 0 61.25 621.88 292 Tm -(BON ) Tj -30.0071 0 0 61.25 696.86 292 Tm -(FISCAL. ) Tj -0 Tc -73.7501 0 0 73.7501 547.83 224 Tm -(A ) Tj --0.035 Tc -39.862 0 0 73.7501 615.75 224 Tm -(2000221497 ) Tj -0 Tc -70 0 0 70 908.54 2658 Tm -(1 ) Tj --0.035 Tc -25.6592 0 0 70 926.88 2658 Tm -(BUIC ) Tj -0 Tc -70 0 0 70 1006.85 2658 Tm -(X ) Tj --0.035 Tc -36.9837 0 0 70 1048.7 2658 Tm -(19. ) Tj -36.0939 0 0 70 1105.6 2658 Tm -(79= ) Tj -45.1196 0 0 70 1179.42 2658 Tm -(15.7 ) Tj -0 Tc -70 0 0 70 1299.84 2658 Tm -(A ) Tj -70 0 0 70 901.54 2519 Tm -(1 ) Tj --0.035 Tc -30.8042 0 0 70 926.85 2519 Tm -(BLC ) Tj -0 Tc -70 0 0 70 1005.85 2519 Tm -(X ) Tj --0.035 Tc -49.6123 0 0 70 1041.26 2519 Tm -(12. ) Tj -44.792 0 0 70 1111.19 2519 Tm -(82-) Tj -47.9412 0 0 70 1178.32 2519 Tm -(12.E! ) Tj -0 Tc -70 0 0 70 1296.84 2519 Tm -(A ) Tj -68.7501 0 0 68.7501 899.59 2380 Tm -(1 ) Tj --0.035 Tc -34.1021 0 0 68.7501 925.37 2380 Tm -(SET ) Tj -0 Tc -68.7501 0 0 68.7501 1004.85 2380 Tm -(X ) Tj --0.035 Tc -43.6376 0 0 68.7501 1041.47 2380 Tm -(13.82= ) Tj -44.2149 0 0 68.7501 1177.45 2380 Tm -(13.&! ) Tj -0 Tc -68.7501 0 0 68.7501 1295.84 2380 Tm -(A ) Tj -71.2501 0 0 71.2501 907.5 2245 Tm -(1 ) Tj --0.035 Tc -33.5038 0 0 71.2501 925.38 2245 Tm -(SET ) Tj -0 Tc -71.2501 0 0 71.2501 1003.85 2245 Tm -(X ) Tj --0.035 Tc -43.6376 0 0 71.2501 1040.47 2245 Tm -(13.82= ) Tj -47.4365 0 0 71.2501 1176.34 2245 Tm -(13.E! ) Tj -0 Tc -71.2501 0 0 71.2501 1293.16 2245 Tm -(9 ) Tj -67.5001 0 0 67.5001 909.63 2109 Tm -(1 ) Tj --0.035 Tc -31.709 0 0 67.5001 925.41 2109 Tm -(SET ) Tj -0 Tc -67.5001 0 0 67.5001 1003.86 2109 Tm -(X ) Tj --0.035 Tc -34.2776 0 0 67.5001 1043.8 2109 Tm -(13. ) Tj -33.6101 0 0 67.5001 1108.39 2109 Tm -(82= ) Tj -42.5776 0 0 67.5001 1179.51 2109 Tm -(13.8 ) Tj -0 Tc -67.5001 0 0 67.5001 1293.85 2109 Tm -(A ) Tj -71.2501 0 0 71.2501 908.5 1969 Tm -(1 ) Tj --0.035 Tc -33.5038 0 0 71.2501 926.38 1969 Tm -(SET ) Tj -0 Tc -71.2501 0 0 71.2501 1004.85 1969 Tm -(X ) Tj --0.035 Tc -47.933 0 0 71.2501 1039.32 1969 Tm -(13.82-) Tj -43.7495 0 0 71.2501 1174.47 1969 Tm -(13.&! ) Tj -0 Tc -71.2501 0 0 71.2501 1292.84 1969 Tm -(A ) Tj --0.035 Tc -29.6916 0 0 68.7501 428.85 497 Tm -(DATA: ) Tj -43.6551 0 0 68.7501 541.53 497 Tm -(08-10-2024 ) Tj -30.9769 0 0 68.7501 750.68 497 Tm -(ORA: ) Tj -46.0218 0 0 68.7501 845.39 497 Tm -(19:30:12 ) Tj -46.1102 0 0 60 1236.38 1364 Tm -(16.33 ) Tj -50.0779 0 0 67.5001 713.68 563 Tm -(20021.4972241031930122<7CS ) Tj -46.6007 0 0 61.25 1232.37 1296 Tm -(16.30 ) Tj -29.9735 0 0 63.75 1092.12 633 Tm -(NR. ) Tj -35.4334 0 0 63.75 1149.92 633 Tm -(AIEF:CU31 ) Tj -28.9665 0 0 57.5 378.93 163 Tm -(VR ) Tj -29.2695 0 0 57.5 435.85 163 Tm -(RJGAM ) Tj -30.6177 0 0 57.5 548.43 163 Tm -(SA ) Tj -32.1177 0 0 57.5 605.85 163 Tm -(PASTRATI ) Tj -29.2071 0 0 57.5 776.86 163 Tm -(BONUI. ) Tj -34.1449 0 0 57.5 891.84 163 Tm -(FISCAL ) Tj -0 Tc -57.5 0 0 57.5 1027.58 163 Tm -(I ) Tj --0.035 Tc -28.2213 0 0 51.25 325.93 107 Tm -(VOCEA ) Tj -35.199 0 0 51.25 437.62 107 Tm -(CLIENTULU|: ) Tj -40.1985 0 0 51.25 663.57 107 Tm -(08008 ) Tj -33.8291 0 0 51.25 777.84 107 Tm -(BRICK: ) Tj -40.0996 0 0 51.25 910.57 107 Tm -(0300827425 ) Tj -35.7981 0 0 46.25 347.68 56 Tm -(TIPARIT ) Tj -35.4936 0 0 46.25 496.82 56 Tm -(DIN ) Tj -30.74 0 0 46.25 573.67 56 Tm -(COGITO ) Tj -31.4439 0 0 46.25 703.81 56 Tm -(ERP ) Tj -32.0492 0 0 46.25 778.88 56 Tm -(WW. ) Tj -33.6304 0 0 46.25 854.64 56 Tm -(COGITO-ERP.RO ) Tj -41.0396 0 0 60 1115.63 425 Tm -(TD:005771:0 ) Tj -32.5285 0 0 60 1173.65 362 Tm -(CASIEK ) Tj -0 Tc -60 0 0 60 1309.9 362 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF"ExifII*  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqwh"1 _ꪏG_~~y_mg+/`G ;9>dw{Wŝ8q벜-]M+Ty^.XaP[mf]OΟG7_+&enҍ?3ߨh~vbC ?F~4oʿU_f~V~5kc?b9ehQq~~,lVj*[3qHOŘkcYgb~gBOƋaL+슗>D~*?d,^C?Tk/Ɵґg ->>';oƼ|23u!9q3:Vo)$A|&4c~S>ߙq(\(!Q -$.>*AF9C&ITWȅhBR6yr{OK>O_~Pq!{."#ُߓɸ>_.ߣ?Kt|? Fꞣ%ߖo4x6-h5ѓ_ki_pg?Azh?U}#??YnW+L'.cץܤYD34m]f7flHGɓ8c(kgӏFl"> ->O诔>1|}GArBijV&kmGl}YjNht../!Pp3K_Ϳ7ciYyy~S!N':7/5|L ,b ZI}{s}U̎G*]{넟rR?;rYCg(~kY~ɇ_G2?Kg>mʣ$ƫT'L^~~ɫk\~ğ')?# ~H?Zc?'itE 1+#%gnN4u|1˞S۳G4XL&8@a-1T UMYW4X.,iU#K[D %, X -e-UJ,DTP$JQhh1TC%M6,.&_6,3-TnDiHfG7JQ-P1IL93比3}5_U|r}?-3O*\`r>L^|X}4yk7QDѪF.mtisNwiEQh]s7JG29^/8vH:vq]Xðwo,ğg~k?_?/وo_ I nRWgseu,G~“2l`徦U}Fh0ɚ1sJlrIsexĘ"ǒ `f( -` "M$C ZH@h4T (*IxDgɤ#H1`iV,iq43r3]qo7.{8/yoZyUjv'eO2Oٞ1!IP")ieڤi0VIr+Y"LUR&ИɌcQ GfƲf¤g)pBiqDcأ -0]=QQ.1 V"JB"@TɎb )RЂ ECn\ eu, +$SAdBj\1I&9`QV :LЇ#`RƘb.|WɝS‘R!i,+K`\bT44) lL@Մ $TiԴ X4ʖKQ Y3& &HBR Ub &!@ -"E.6%a#V4NMfϋ͋6*I3p$ 44 @@@&  rCCMȎXS#jHŠJT#aI -cR9HIGV5 "P*%p '@ H NQ0t>LYJV*˩Nьh MSPJMHqKR@ P d(8!RI$.1"icZJe8SIqu̔fDK`d0 Y1dL+QRڠa$%M&1c"U (jM'RE*@1TUC8Sr)!l1D0BPPLDP hq,c͆>|y#jЯ+]ufkzC,cuf;FW*%ȍiILL26PX-$R@ MEti( TY 7n,N@J&65," *\, L0sVCE@VܲiN*'zqeA"MB@M2%hC - &XQr3#O=^DY2L̾R}P!DXTy^v%qlzy~ۮե@>}.>k?._oVI<;HKd~NubZƪQEL*)`kI.eHIL4 R!1sQ> gud ׆˓u#)!N(@!#X1ؼ v1D cq'󯦼)6zK-<,x1,v)P@ 0ʑBM\n HHXA5,&e&1RT %hbJ-ʄb V i"U* H9)&0r|ʑ܂h`Y-X4nhcKB -%C@ C3SM!Ei\LdǏ.LJ>,XLbp}46ˑ8%  *Xrk+뚧|^lKBhCM*k=l~>Ο"4ETXȪxm_66}9=g0mRMƲ}qm'y޷ی˥ƲJ ϱ\4?qgP@* lMc=p~̙AiK)Dͳaeב Xpl~y&t~~锫>qrF;1K`=~_NlLv_>Mj R'#M,:>G=1xfRi>kV{`|l_֍1jKDVb =SX:6+,b'I#nޜԬ>S˗>-$H&RIκˑʘ45 7ƼܙRbvԓBEH Y)IM@S() fY&()(N"n"Fr\2q 9 hjdI`S9)0C1`TEzi&J&g"he-4 .F"ІB` Rrb`~i -N<| 1S0v nYiHVQ6*\fU#$XQ+(1/J?Ͽ_ߘ%C*rƀl~YGi&BӶǃd0PE4L`x5|R*>~G޿HTپi|c{>sm>ϣͼ_T4!|Ɉsh DMHd搁CJT"@CT& @9@д6|9rֲ%cmTyd=4y1.'_hǓbH(Q97Hיi*tPcK(Rdb BD% MI1))5KI8cA)1(&:1S]rTdh11 &IN@%hT@10iHXrX)Hb(L&UC@ CiB,`}%R۟<ymؐE'Hh*uމMϦHCHMB4&j*# 1Z]j}ǒZ -1x0Fk?,P$Q*)~\nI/TBbb;˅A*JFM)PRqh ohɟqY3Yf5rj&xMcl\aXKy#hC 9!ER.Bh&i$ʴHJ\%k[\B$5MV%88L$hi(bX"dBj% re C) hH 1J"˨kg3\cr^;RPHk5mm.-_|)e>'+(JF  K_?N!g~m>tJ~63+jJD!H5D&)I\TBE3q -*5(b!d -Rbcm I) j@ċ@1&@cQ"TJՌiG,Q &Ph6~?MBE 57JE|Z;?:9Z;4}Bu-ܲ1 }Z\@K JKP 5* -%$'(0*M@ h`U>̀JWtS |W][\i['ݭٳf#{oGծQ^DB1 Lv\Ʈ⹾^m^\gO<~ͮC!&* E"fSH9i!5,iKPb#\i#hq5#&ʁ6 ,X -",C -@D CCC& -@F lEheTa9 AR%`6=]E[&nX4 g9E(j\8aqMMKZӏ~EֺS4(VRN٤'u_}yɰm&h!x:8uz`"Q,lxu}-/ӃF'L~IA:>_B̟Ozջb9F'* Kݸ)S }KEH -+>Ckg//Rxީ/J! 0dxhgy3sE.A]O9Y uTrs_o}sX>Pf2E,ctueluBϛϝ& $Kb_=~HT6P 3(aYrv,\p:nA'díjeî.ظuɨX9?J> 9! ͘E#4Բ9Q4 -hrE\ -ABHrЀNF K^Ly+0}S Q$կ]&|]6Tڃ^f{*g]qIkzܺqr" 4!nnok{fy~}G޷'L7u#o.sރ`"h !h۾K[WZDpVeC$ 5t>>zK"G`~Y>5,B@䑄]0 Fa1I52i& 85+B "&6h,͇=͉ܼuw5jѰi2h{ֶG*6ߧ5=&8LhM,Og;ߜϏOFfn> z7~Їh5D5R#H@ ZBN`9r\D˘1&jLi̸KZ{ZԠ bLJT#H&1dtIR2@sV9E'HL `Al핰@&Th-ESp J3lc͋d%yY=φ/m7|_oL7?=,YpTrzus0<Y}ЛY)HB$h)@hrԠ%J -Cn0R*jT@ Rh@Zrh!@ې@T4JTB@H,h`U"MJ(@n%}9c5JBMj~3r-~daĶug, q:BpnsCfC 6<P~p驼שu6p=ԷSzp/`==lJȂh&~w/X| $H`@dJiP BHJK BE$H P`4 -rcl2A,hI1!M2QBoGnu`;0hh -J#?C\#s> DZ,=a'%6/@"BI|7q 4D~̑,MlF|_IuM2eM@4 TjF$.eLd$i d3ILYMJЁ|"%9LYL iA$Q(Lsrr -j@*J  -H11Q#J bhC2eÜϖ2.w%dkkmOoɚ[|O_J=O޳yOHO"k|k{l!l~-؆n%\ [sqiCP}gF7;gV_iIi-EL(L\.13IA1r($&PIDb -d/Yjl 4Aq(bP B$ J&H(mQ3DlIF}{B!0,` *Xɜ7,nA  -RE - _'|DUM*JdT0Lf<9K3b"ܯ5}H{ȷtL@bcA&Do_ﳛ-T$P M?*\4 Cįon -M%TˊF*h, &VlYyLҷ>Ksذe¢i@&*0B%,B4hHmK!!#r@}- @\-BqJIRR@S`C+TmZA)jHr  HЛr49(@BbV X9詭fheUe1dkd+tOٌ>fvƞF xM~`Bi#!0'K| }RІ4J% HBM@%H䙹̔y1Ó%R!99"/"51SLSS)RƀsR&9ȥ͔ڱA9 C!0 - 9ƜiRj KU!M0AR2@JBZ&nUБ&iV1S##8qY͌y4nV7=쩯%XaaduOGmVW}~*f{Sz=}񾚾-M\wϻ'JA\?)2YrTtwctsDE\9횎G:dNJ3T|k=_ Ϫ[k!J C<-mFWm>e2)0ͨU͟ --B% @B1*ѴWaDLDĜۧHi -h4YM%#BRXJ"4?ZJiX$D$flDi0MNV V*\7YmV62rSm_6121ԟ__!r1!PxGAyKyݰ U.QM T@C ͈R)ԡ$'1)UcU" c]m b!"e1Ҡ@0B`WU"bT)1BMhlM1 d7#vTX!HR&%m L`4%E ͒ ;(!)\˃l1k-ZG2f͵:Tf24J[  3)Շ_}PRTJdKI> z a%R&/:tM{vd7cPPT&n-yעxwo'}fhےtD:@啓uNk[.~١nZ -$HA[:oc몑\cMĎW\×WFO~O{6c>Ȝڱ4꾏g;V6٩jhL%4 `C%5 Q6J9!*U I̠R!U2BhB`*b -XjIle.%PIXM)eD}I]g\~|w;:;q{>˨駓⡈ `ۛChbSTӪvST6k?a}+o[LyWYvM -CA#ygC|dbc@j,c{Wptߛ%Hp#@(@DfI Ma2R MLԓ.W qj#Lkךz4 *Dh -nH(`HJrЀY,͢X2LiZX& )˦ycY]0`4 dPU"1rJ`D)[@6!stIS4GEɆC1*ɆYR7B+Mܨhvc&6d(\CLt45qj_5^9ձP -@ص-HϨzBhbEC *H'8/ -/D@$/?>t5 um)PˊԖA~|OνjR?4z$24F3wm+TԴQF H!cxh>o]-D3cSY߇ssދ9qTTKCP hJ!X!IbF8Zr#*P$>_)|Iir1!Rjҡn"n($h1H#ll./FLY xB.nqr-T|][iWϛ3vܙa}NzZ->8<,Xw;M7HtOcY!@܃Nę h&F'H*%9r0XBT%R%2WbG"g'$Êbɉq} R` -"*@ 0SS @d@E0 -AB\C 6ܴbb -iT9IJi@6%S L{2M!) cşie7/睛_FCf/  -ne9OivtҹfĄ`0r#m5P_ړP U$N,u}V}INX優q0&W3eyiUȒ.tLbwϹz(Y, blvTWчYc )}9IZO\L ҤFN  I@.$CB2A*h qRI"H`@JQ+$9h@,%<߃Ia,R*~v9T{3|r3_G='r~;xٽFbVS*2}7ѬXⴶW F@ﭖrwa*g={їO2j4P0K '% !@ RJw0 I&X@vS_WjrL39è};' f(b h@ J@HI*4 hRM h -Q% CT0E!*`! B!kKH14S*B -Kh Rc@0""{eHIr d?u^L@3=v:X&Jy_`joוqq63G^O S&r$M \F'Yl>K=e0} p}-9Z4s_UꡊZܱ;?om6߾86;C*k0nޤ7/EF6ACW6=bMݸڱ:5 QdFoCOujJ  KR&2MH!%H 1*IԴr<&Uz"ƮAł eZ&HA5))!Br -s -1NrJ^r`(cW]AzB^oAt#~>liiE_%g#dwR,4'sJ`#$ -ok9(v<Ǫ&r%E/r{m6&K6 2S'>9qpnW`yv&Eg -ܒ &Z!-hI0*) -XBb A !¡C|s9L} & 0 U*r*" ę$&$r_" -diR gddcq|u|ڐN][OX2?~#=HWvb4RY}?6{2vej47)  M汾rCr4uڼ?hQEE6(4`&Rh$)lpbB"jc$Gӓjy xk |Cq''wVdH!ˌC Rh&" *D& R2Jbh J % @(J4445\&PBD9-c1"R25n,%-0kOLC[RFHE@DQ#bUcEFW50× "ؚԯ& ˌtBj*@<԰W}2m "tPD Kz7(7#r-(HL(M DИ#+?;jߦ0.A4 -&|P>3Å `HДR6`GYTb(*AK>A+w" -ZY7Y'WQ:hO˟oJCyCJH 0$r4r'4U - -4$%g$ |K~OlBT%QP9b` sBjUm.d|B )aTBK}_-#/Z3h\M꥛CMXjzqwъ&H2(͋"}9U*ZUM[~?㦝 QchC@0CZ>_6!@$lHb7RE*M(Bi# W9#)̲ts?Ow>.ooXG5 5m_3=CO5wYdi"op!(P,r, 1!+\ )1YBPh* `y~DHB16HS! -5LVN]!Wٚ%8)l3YTԱ!T"f*Qe[w]M;WՎ`*4d\|tM:Va~fXˤؚviu,ϛhޭd2i9NG?Dqz_;g`M(״v~gKM *JYm(ذW3пCu-x~.G-$Ey[z\>HѺ>히a2DR\?i;7) &Ls7R%PH%iNA0I` 4 r,ĜrȇJ -&0_ܓ@B.4* -$r, (`4"fISh1,`bXHgZ^z?Wa~@OOgOԫؿa}{|?v$%J1Ŗs\Y6\^0# X(6Q{8xP4 h(@4#@`@ jE4ȌN!"F5&QRP#ꏛU:)˶~_SIӷ d-œ( ` 2@ 4؅BB&#3t5Ϝ{frRb©F)ZԻI}K>uV'e5SH \p -O ۦPJMHc -,جMUBR@4 Ldc?$h -CCW(b@,b#"ݖ1vq{=MfZU3LLU Zt5xW~rDY46HA##}$?k )+% K@ ψ"T*R+$҉1@ h!,X9F9J((T$ca-m&L~|bBX4$Hb&r1e jdBMIc *F QHLG0THK$CD +.rIPƵ=#УDx&ioFz;7Z27|$g/%}Y4 *"H}pe2\Tu4nI7F*4crnM_thg-6Oc7ܱX&0@9&rArɆrcʘHR<.oq΃kZo즣mW_"Kg7=^27dwlbq5j&%K9`KdR\L -(@=??߇ -/GҶ4C+I%!?cO]G\?nf֓*DPЗ{&PA0L -n;*mauJ Cr@ćmZWA""BpMIY弹/".)y=7peA1ܕ5z_5RJd J\^ýu8vd&:hI5Ӷ.M:޽ApXZrM͔E`*JH ^l>\WqeyK65䠩`@KF]^tUqI7싶}~'oq{&m|KE ! a-U.HW6$R%)CJcv_4s?ߓPټk<>vu}3"1I%_aISH1L ~5Wql}9WRQr4Xjj{v aԾ$C]`~/g&(dQRC U7 &jF-ŗVKX%b h' qJDSe@OΩ㬨x=UCG"ЀT1dfl+T[@UcakȾ]/'2:FiD /9׻>SMg}" 5 审|MW9t y{HmЁSDS~ -:U@4Yg9:fޓ=_m+#D M>Np(tIHdŗX**BQ,@$FjTr&ҀJ Q) -jFTLcl)4'")&1ʵ4RCAY3s::r(3SS^rV-WYAGZ/cwXs AAH`+>L9YwZǒn2ԱJ$(#u&ӗB:vhV@5݃>3-؏ eDDĩ"%qrNͫ]=:q`Ki41& U}Bq)Xφ&@`~*y>۫Vu ZF~Ii-?7ձW4ߎM9btdܮ&)7!$dMQs,MĜCM^y]{}aQ5`LdWa5Gf4^첝 <>jʠD0TnY?r͌B&JJ#4 XY&$hYr|, 9bʩ$ NZ=ꚐhE+.>ȱ?Q_~v @0 >3ꯈ2add *A'Vpﷴ rqo0LRX"3pyFO"L]yYщdd2d&eJ&F{^ΚRP離jߥh]7*~y IȜ ˌ݂tQ>1c~.%3/lj\˾ ,L0agwm:PLCbjU $@!ʀ,+I%i@*d@_Q @ r) -%PHE&3I *NaB@yOӀN!"J&2&6Ζ{~NWqôX;9O~n7vuf5a9ҾT_>]C6_orlOV[vhc15+vPZ ")EJ\x >;Ͼ/{ -ex@Ŕw7P^s$2cfo'ιm Z8K_eMTR;1h R!Zh*iЕˑ+%MyODH@$Pb&p4+5mA42⸂|8(rT ;X#) RDdU -&1ԄDde͐2%RB\ Km fG5+rZEĒ2,*5iTRU4PS\NѹbQ&0M -B'#l`1R -Iɬor5 ! M%ILfJ%JfabU(B%}eoHI0Jb$%4) JS!V0<6ᬉiRXb<K[O!T6zYfҵMN p= v^c5k/i˓bW"$u4^|?EfPYn-*[W%Wjհܰ`(@Ba}YO7otCwˎvH9>Ӡt* C -rdRHTC@*Jcœ,w+2ǟDokf:n+5M$g+Gw]rۏ|׶YS] 1)F0Z1$r@T̿[Ok$ѾkgaT=r'I>-;qӊ^^=/W}F"Źϓ1) -qG6ľ E7--)Zh@ -)!J.Bg6ǹȬn7 UR22(ZnS QgSRh4UjJd:B ,Jh¾n֥vfpݟc+T!s q}kt9h'|jm}=䠐LbPjFk8eS8jgu]Xhl} -#D4rIU2߯s*JS>W L@3&lVFrUd X\IHSH@qSjDH"(Ih4R(B}]o|D&4`@HCŢjhCBD4q>>fAM@C~x ߶>anj2 d% oʽK~ˣeÛh@/>GZ[Uqw]U㤯?uzM恀 LH4=uQҎqM7)GgqM7cz:,2hB 1-2bчp97#]o>OKm_+}sAmDHwvyqymM=&E,"䁍v,HI%-hD#%_}M}ۤ>QC8OzZgE4Wi}G$&:H)peAPEJJr (I DcI9r`ɏ-֠*@p堩eÕC!4܇S4fbbF4:Tu/KH9EI+OH%&# Hi*jP i Y%Y%4$ -QrihD4 -)"' $M B0MIDYh-$K2hHL >F, cP @$H4QH"JaTMP9jQ@JAH@J9Ҁr1@&!0I `LG˙e@HCG_x~xJV/ח2{5vEJoL)dףa>lJ/%rQFO}LYrKǒV umn5}:0cBim'ʷ>.s/ANZw~.mM/YiI J,NqCMl0MBRe4dI&i'ɏ.Dfbǒg&+W4} Kk:4&l}vr`TT1I/So/]B԰I0Lg<˷4&2efbDd 4.]BA(8*Zc Wv[6!=#\aH@0T. HR|Fi- L n7N`)ZG,ajTRmI#0L*@U42YNZm RIE@a#KrD@ -EZ&"P*rZ0$Qk#BPi5! \P 0gOL) @ P"$)'Z ) @i) r*Gk1oZ*($Pp!@&jXBrNH@91i"5uKM|.Q"}x9[/k}brǣI&W>=WZomO0oS#WSTx<k``Jp%AQX*q?B\|[ztSb'͐_kÆ]c!SDR dL䑈)UR!$aτ2ZetNI_ӂ1扟J7_#غ-]Vnzڷۗ7f>OQEռ;IhLi604OȾv绾\De]Kd"1&Z@H4( n;3ԉD );%)ėXH+hK|wQr]L\z>͉wm>|`_i1ŗƻֲ&4 h@ZϾܣwpu/>>(޹}1mq\<\u_[j;Gz7]vnD/ZSjv:QhU짴9c$jW$E8cb%X!125Cȥc4=}"hI]PJm0)=#yr42J0T%@i.*M:r( Sh0M NA4)Ii*Jj4cYi%'  P X0+`0y0Ul5!BE)NTN - ЪDhT -.Bv9rP-0X<~g~of!h@&DR* -D6j&nb$`CSJM&#ގwHDÎA/!BKB([:L!eRVJAr9]~|YDg?8W!5?OZ/C??>}9WߢyOW54&2Kw.*r1Tk;?y/鎊T0RV:%|_u} 2T1d RIL%06JX-.caldZY1XơS׽Z?z?:&n.}y'^xLÚv+ٽ24LLT5#Ia4E&jN#uz.FHɮ+>,qjSk=-_25)pplY+i|'ͶO5= XS#W^>nDę+ *4. -)v J%^6SRjV:V¥ʌ4F|>đ*L%1fFy2hM(B)+E"͐m*B*LX8&-*,SsjH2bDJuSFi bi0LT2B@@ CQkD(Ru *DT r4`dI܅&ʋj?Gу?LiU" -J#r & --K!K$)(hCv}ci!14*L%4i"%Z%TDRh[|h$ELʋU.u~n[sp8q'h\d`vzbì'2 0H-=>Ac4jgqExS`0hiTScu/_}%J>e.a + -R@H4ZMX"1}/͏ZLԑ{=hϷlZ׷GdN*b1Ddi4 &4! h۩Xi)h~?[(־վ>mYGm?gzobRI~yŠv/av 3&2@` Y\ qBhI!j@rKn)LM@ -rT*BBA*bHShtrjJr0V02P iiIDҪ -bd*"hBr9i%@ Eh6IH(i@҃P'  bBNN@Wr2 誆Q nZy.~s! Q@ - b$@@H0C%VK$b0HbfY YL$)! S!)R.HN)UIQҩfKF?O|0׫ŗr|-}91] 7ٗ<|6mtzFf{$dLC *Mv_O&VHfKZ-4w5OtCعA3JrKϵZ^+6~KgY޿&|bh)|}L^;n:FFh9 -CTL+B}NY'.:Ǜ|l?!V'Rz~>=/kjOO'/n~{tW~7K=k^>M_aw2CX a*@-{ך;M:Y1 SBmSWQ\/Z.pCY<4[=F%tItN]mrc 4.1!)"˼y?Ϙ%EG%Rh*,Ri&Q&¨7/6~*XP TR"rtSeQ-%i 2KGHCh(5H@T679HJ,bHLiʱ↑R 4 9(5H f:$ T`H'#Ѐ%\@ $ jJ*YB,)RLwq'ٵj0BNVb.dD! -6iLz IHB$HI-TiAd#ݴޟY3DfIk\<Ϸ^8ڬ'gG9995<66p&g~ -qM/ȕ˴ŐUC)@67ӽe^[tϩڳ_}:b*Xh fc7Κ:l^]xHsGjE{_땓Kyv_VVæ͸s΃>My*+Ol0y[Foa5]S2k}xR5X& h =mM-_#d,{ 9f~.#.8 ?_1=Zlƍx_W>? )FH9c&n|v#Wdɪ)61-O3`9a7#H y>P"fĆ"Q!E - E*T O J~4 䭑u>Ξ'wChE$ -7+ m 1D`4!MͪbH1@& PIRa@ 1҉e(`E0%rQeTֳ}_'׵쑠+@#p -D!4ID0_ " M<@ -FZCM2Bb>"$s -DR41F{|ar{YޑF[X%RZr-wcũ|Эx35eFJOY'V-\ڗ>KӠh_W|?.qE:}Q~ɂs~whnX SfF$7O=,~XIt}]ٿV$NwK%gkIA%V0wp0b-Ԗ0ɍjT3`F&jP#P`EA6 (K $IR )FE1]@=%:ϳ,1$C,U)o&0L!c%9Z&2iL4J4! D `hHCȁ@jh 9 -4cU`KrV,]ˬ?gmUbNJ$% W"r!0*%&X KJBT"4 \x'7W hV C\b D -*DmBU$*-P"ZVD7k?PuLW?+ƿ/?5q9H>O79r-Ol4yn7l~Yry&rk%MVLsNTdD4Ls/7k'_d\wRqݖ1w8?fQ-0H X,i "Tn<=5h>/ñfL?DesŖ^SuK'6O+L96#=2sQTb_|ǯLc񎅛A،lj"j/ai 1 M!O9i~Wg,FjQޣ^ɼ-;΃OEP}9ϯḩu7(Ow;Rc75KuݾNSWc$JqgVuLfT˘Jk$F,SQr{^NK&:JAaI.D0G?"*h!I*.bPa#``PG9*$ ]ؾ=L-R%r "*TLIl@r iFIb&D&J&i BxVH*@4@ :QP P@(Ñi4(ֳo! LH@&^8iTPM1!(hkP*D40s5夗R!cH@07a0H -D%JMzS$dIa V#Z?Ǿ昶Ml_)eq~u6gv}:nMK<hi&PVi&}gr茹*2-n̍\ I:Q,rr quɐϧ{=TRb BZ hyuӎqʎ'/Lڸ_xG}1tRӓZ@zׄyFܲs/`Ulhrn|knpc=3ˍN}{4^B ~]5zS & Q??dshRǯwؖ"\x|qn4o vΟSxW7Ef:Q߿W;FX:_Dީn'+쩡* Wר,ynP҉&8ғS.&#I6MW= K edF%s/?5~j!t2h9d*D^oYtK:nɯrK`Bo~fIs?W鳰k ~m]v^{ilH%rR4#k dr&Mt!J YAi9f>lvKa3rb!d0DDMQi:jZi 0_$*(R$4bx$DKJBTM.GkN]qWsGfeܾrA}y'=Ac٤VmN]|R_rʿk *D4BBZ5ͨgsyCo4}z_>g9GVyzv['|w Nnj= -M?pwv4o13Pgqw+ -& ȿg7z9zz\ЄÎsΉ*oen=ѽ?cV'>f]./y~NY3ؙK;*9poR -*I_<ϯgZBi=G~|UcWsH'%"2%DSɌ>h/\Lu1DNa7h|;37_GkG8GKײvǓg?~om֟.%V]Ol$< @4?nڗx7ar@DM䔚~%Lq;#+D(ie@XǑ5يbK@ ߜEN۹ɡ~ ƮdLbRIHE>c632jQR%+$B7 42ǚpe⊒hJT HGzy\riM `\"D@*TBM*i4iiP(1f E@V bb:H" Z5&61if!3|-Ƅ0`rp2q^OΟOͮ ^rHܗAy_rg|U7"CZFwjszQ$YC}>5|I4AڨQHh415F~mNqϣr^[+B -*@5!r@Ӳ%;r;~~ > tUo4*<@wh7CWK9ĝ`W`&+8e:Bg.}o^~-XEOlm1]IUnO/i^R\[ˉ2A>K9v79>tf^gsmy}|YH<_{Q%hi>~=tv\vX"}Hk]e4!c{|?z!ŀ2BV'k%?{<ovx`Fӕ* Z7{h\*&CuͳzFvŻ>m  Yǒ>yڿQSt uv~lCM2U8CF~nt%CQ4@411w%}wh& hF&dhF$N\ -@R*B.D 4W)p*T9(@1*M@r)a x5w.E.`@ |/[\&Vu}^CY{vyz%W2w關"rϳ?[ 6L>IrT(zU7m0SIlUi V `.ihG -'#>>í}[`Z` ANB S@htkGӹ=xѣa_giulngz|<Ǫ~O.x5|{:wl D1xfjUK0I$@j< IzurO6nk*f$ObcY"jGΞr[Dzz$w?X%5GdzgqwDiB-W$o_6;SӶMK4Hu6* *]OL-[Ȏ̾/)6>l!"sR y/^Lfq0.%sE,fh>[>DozgeD -_̈́5K7u|f=(i44 a}.-'Q@k>$0Tp\:5| W MFd}xA=crY2D -nUL_I̺΁s7EWFcQi9AiwXȉ4h nN)ZL"{EHЉM MD"SVIHId L4,NHIm @ƨwL{єL8cÝlnY)8 AHȓKhQhƲ@2eBO]K^r:ZXM.np2n\ϯCT6ϯo/H5SV]MQrYgBAbIbB}Eн$?[ƺNU '6) @ -ɬgU\̿&;!nߛ#tko^oU8t|Oʺc:^[GOo9T9a!;=CҀ$ 9_-<;~x3|n.4\} .S^\I|wvxs컵ˡ|?Lo6F=W~b`)). Ƽݎ?*Ѽ[UI68Icjd2f+koMgX5 zAjIW(T#-%Nh;ϙ,k3x {9/R|9OGޜ6+Օ񜏣k!?l_jI佋l|l+GڄWҽJ8Ov~X$hnAW!ꚺpԫqͺJ R##ǖу9;~8*  JoǶe4pk]t1dj$P|?Ls݃k}cYi2Ȫ`HMHML.xN|)"@Ť+B +GQi}jkrрiR4#@YH4BW$l@*ZRƆ%!CYP$+JK -jPHc C m4I*vh5(R\h$5OVs|EKN&Wm^i~cMX8nN[G9q+&,7IYa+ÙYĻ'`cd@*TE"JS`I+o'hrH !҄.iLbOf?t7O;mt?Uz7 Ok31t{I/(aZErlPϨō4BJXBg.Wb7kgڄ֏two>-x7j?d3[V7D) @̦6d%BjY@χ{onH(ADdcnNY= װE㒫K!.K{ k 4=u`^\n+Y$2bw>G$K_t~1{_/&^ts"v#.u~ѷ^w~x{G_θccS:wѹ5pܯa^s߹>NW?Q}{<ع}BFƒ@v[[>{8=@{%&Z'$Q`78ymyܽ$*BV-O"n65*\g qvtߺ8U⩛igOM?OsM9 hSi>ޙrc:L -ZT0CSr$ҪKITː Tn{Np*ȁ,dD &E(LMX4Q`qZD' m|Wk_$7>qkÃ*'w~8@r?NY 9Lh)*hzX}b7NoNNwTJ+JL"ˁ*@ Q4H\JNkҴ ~g{{ȾM,XcY DSD^Y۔:p\#޵=M[5Fo]?B,x;BMGbp ~Ok>vӾs^k/RU q6l$҉ȓi(7?keƥ¶O×6,no>}_|Wy쟞DYoonZV~9&uc8D]pں>,".WX;.{/%q$bsJ4y[Og^םOkU2@ȴ#CP6"DWi  I1fGb`;F4i YJ5+OSGHV+A6?di412*Q3#To7-ZH`CěV:@6.5rIP9`!(҇y1+"T,D $)4Jj@Bp 0ԓ4E"+T23I9G̢̰~g<|[hMʼw|dHWiǃ-)7}VԵQwHXj]ŃlY&NN>0b`E@U{ԜliN̜fۋfةTG, r:&'4!2FlNC#\)r`ay0LUnV٣\^_|>cm3=_<_ͭ%c&2ĝ-!-J)ǒGǦFi'æ.jdJSef >h+Jp;nK|cgǓY3^f;h>Cxb8 ;&CAZ?Luݗ525g4权YꅸRRRhb{/.+In]@m6Ni\u}=(#Û_'k=~V3 3A]ΉsʋSYoױwb9Il| զKwF7vзē>~E{G7{ƺru:>VqsqǤҭ]9*C`AhiuH!T\؁ 3Ay2{fļL> -tQaR -QC91+DeQ,XMcC vq˔M努 ~):@gË2$@`B@,S9; :+P$Г`5,JIcBCHP1$Ld  \&g *T%%D)STw.'ϥTR=lzhsW1~zf.OO5 #M٪erƶ.{/ϬɅv@HICD|M&[.zl"d!qy3vn$@0k{rA-vؼ<_UMNr“~1kǓ̓^_ s1Z款SǨ WU5k_?\C\P,M% |cygDL=Ij2P3x MK 0C!_ܝ^Jt NHG-@*)5d L鏙nω,[Գo8lS֏П/+`L9oAzY+ӑ #Wt=N۬+N2YQLuDy&xdYzږ_P  -C@4 -@!Zg&ۗռ~sͷ@^7e(@9`)$+\Ӥ8'um4mF^˥sj]z>ǛA'j~UtMcJg>,iED#7tb dEĘ&8gsy'`}w AS󟏹W6uiIl4j^/Fҩ~HON-{i͋IHҷ:kS>츲MYUͪV蜣j5@m@JA QJ*ieF5a!Mj[pX~۾psG;gJ>lM,F~U̵[orD;%׼~yҵݏ9>̘o6BJ塒!$'520I%dT%H RW(/:$brP) R3HB!(ȈW 1#=$A43M^-w]z}5g9}>_զzY0Ƥntk= 3Ph4֋mfGg+mP]$Y -4=v h`0iJ[M@C@WiG}gtW4@* T04&E e#>F$)ZhW6ThQ`I:.1%Tσѵ%oc<O|j"eLdžcHRv5q1H\KL.Ӱ Q[Q|;[6ɩj}iq.N1t:g -}k?}}(_գD7V4ܒhu*BHJgŖ2ǗQdfk&XUiѶPs@$ LPhk#ANI'ل5(JA66ʡ/v,nzu$U6O?b>lyG|^sύzoɣlIy~Zmy]+YRD.1vV$&JF0*_U0=S`yq,FI1Oww9~^x>KcvZVpowk[i] -_:UZ %b)ʲrRܵ&$_AjEmn}$M-!L@lh/mϵs+?GY$bqMG/?x~Og. 'FܼԱt4%uGl^EIzg(hkKܧ}]2<{&HW/~߀vxDx's_^Zq<ΰd:o*{_6'B&Z=m^4/D{\>n73uoY7}'ҥiRIW ,jJ -Ankqb^Λnyzgy5s.cɊ97_stuHϬ>2Wrnh"Vgĝ -~Fv]oduxueOz׷ŗ/% .6:;'19bk=O3]lQSNRv[CLCefÚeidj쫚W,ctiR)@4&C@$ZN97ߢB9$!2SHcM4UVă=4s|kǑVx|vפi~^Bz.{_լ.&n"\C3;CU2!"DJ\j5eey]{ 96 ͢8ܥ9jM .Z[i\m:u4D9`$\&ε}sE- i -BiMHi69y ɱmd z͋.˥{ͼ{{^}|PX[;g'6siٽv9baӵ/W}m34 :DQxm7cԶ T>ۙ1}~x6.]913Jk#`VVI# -l^g0%qlrxO:>| 馑yS'潗@7wWi>=&v.T˶ n Ml[ێmzw&[ٖNa4]fnks &gC{6.QLwŗ,hl ߓ뙔$hB/>g>\1JibŅR#9DH I!%SJ%R%V4hcRk{(j;N\ETCL-fJHW*!M8j[EĈ0!?&l/|cKy<~1Go}3P4 1ÙsR+&,dxˬYi+*i6}[h_qJ4@ -PM '}NyIc{H9rs}ہl?/6[x_gzkЫn>?>RS>nK{_x>IsN_t9/ZQ}-sKh[5NIh&H`o>XX_OY՜~fvAԫ)G"3;/wߕ?/}%u\|=sk -5!HTZ/;1;2mךu?ٯjpzO`nw9 0l|Cuc ٧FyYOgo>I{n~?4J޿W~>@ e2&:%gz_GASRd%'#B.IBLhT5 -i 9ie\`Iyb"$PqaHB%|׋5Rcs+vˬ`vo}/joGOy$w&=sz_;Z -ˋ2lHg ;tQ6 - @`!m (L.λTt3}K4",1XB I r -T @&R$ܹm6_?й5>S5d֍_п*DE@ 2bJBB@ !M"&*Mk-kdDDQ4n6о(lGֺr Bm~[fǔ)R*ULdD6]oǼ o6,5 T828v= 'ܸ3߿xW~G7)"Mcvy͌yyM7MLר -QN5#rt\:ORJ&qf[vг׻|H*RJbCȵ}]hm9wz̗z<_kdF2￟u1\_՟QCt_.nubv_R<o`_(p~y|F=2>v#tdܳL0_z$_8>jZ=։5/1y/$^k69wL4S%QpZC|~7{6c|#蟚>X#uꓖƍmy}侙,`@(bĊ!&Mj=)=>u>vg4AD hhTBT0L`LQ5#w/8 jK}~Wa?&{Ϋ{WѾ^qRL\9I,5٨[ -J\Ԉ@Bh$@>^,n>fN>NtZF9$I0)(_'K˦wcIϋ9|/0=ҤS|q{~ék5s\K'$EH #x " MHTL%c$'}Sl[vW(0s.K9U4!)L(Xn-Ei{#d`iIjƖY~k3yg_ۮlz9RJb!}/c=4i>taWV! -UumA-Bri=>U}G/oxu.TJ3`ŭKkصOXջ͵NAd17Uz,=wijr>+~3h5o{]LӚ]'\Ӵ;oν:-uy}/꺟?oo}nY#l֝wq>D=]u͚4y^vOj1:,'`-7b>Qs=Fn >u/=_s ^6ctL%Y1Z]c_}=sSL"F1Q-(HЌNir$ʊa1aMI */;;`ҷ@&U !P(4+P:ѷ 6DBWZCD&lֿekn+{>::@v?0員{Ϯ -?/U޽ua&d`&|?B*ʵZFeTZ!K4+! CBTXՇݽO_F1Q@',ܥ (! #!DhH9Nts $Ny̅ޱc0A2sg#}}M8̼$㹖FMvT- N@M!0MI(1k^27ܺ^Ciu[I4IOO@,;|PP%?DP Fij%pWa;h; f׬=7U|GϓkOm>橶ڹLJ:7w jh!H؄M&ޢrK|os΂eWOУzvn5YqqN<0qi۹{]_WO6nLLsu|_C~{ο3cgN%t1juD.yLw3'۷^o@>Y]kؾ^-zے>7'Lag/zq_7<| ~+||T_V EŒCYJ  -YI &!U$)*@Q@Dғ@F"A#I{rdD -"rJ '#U*oj˳o^҄5m¤̧*)5xWB[ڼ몸K8^˂9W߽$ϏGӦewHY2Mjdrd*증IB>8XTU d&Y4 }@Ē` !4*B[pM8Mctwѓv~Ynծ^YHIjJ36FI$h`TVW6dKp aBhi(Dr RT$1 j?ByOoM41,Ф FЎ/E1 @ cv}n-cd:9~ȉ*bLnC!f=(Me0bY"-З`K}&"кSĎqҹn:# _Sx}/hIJNkӐkM[^ZYY97Y2S ޶3YPJ! ӥIeϭ-znD?&9 )[Qzׅ9wӝlVl(%9eϛ_jwOSXzʍ6M?[=Gy0yM 0?}͓loa#o.gڻ9]?|2Ε. _wn|O>EVY<~9gm#ElldUϩ9{ YU 5@A 5!R-H\ H$!ϫ.3_f=vFybdD&W2][$j4)Գ4iHLBJj%O5 L3ӽ /t %2$jघGWW]0B4L+T9`}a5 I{K=wMm!~ M+HF73)>0gFSoCExNu/ ls;O:D d:N|n29g3>TK/!zb ~>?Y|[&BZM NZNWɨ˿>\EWCyX|ѿ=w4IgZWK}SIgk'#y4˺wZ#yw:/e㝒\+X}jguեejZ0ܮZW,KD4'4! JMԒ8 y<ϬkFioX!LJt@H9Xv9<6lxo?'5ݛuzu͇繷gu8"nULԁ5ـR%" 4hJdU!HdlwӸ.*o7M\Rjhun -!DT .fa2cW橱oɺ&HݓP>8/2Мqk3r&Vv~Ow<+ͮ NE{LcjwkޭFb)x٬1^-y:yOMX7~3?^KҾ+8mk]瞴|?rH( CTZ^\Yl~&(Sp0A#PHH[tH D&jJJAM*L'6$7<9ƩkqܤHq ɜa{}Dl^6!3 dVeRJi 9𯉋[z& >=*GKg[jO`:'@@3Q -9N/1Uz.7=2 X Ƞ,%6TBMOzbyd^w>0~t̩KE 7;&J9c@КłJjQ0HIHC@@ЕHMQ~W6NoCX:Lh{$BH p;^ǣV" !s}>Wsu2`69lf7R А*TH-<ߴ\{?6>uyTv9m=Wvx|ݯ9oIo#;>鉸SjsO,rz*}tK}v5xjO ?ÀU\/$::9w|~q'0yV+~>Qzax?ҹ;Gד{ׯl).&&mk#󞌒5( |χ/Lw&RՃ@@4KCBTp!rbH&,p%HR\~ONs<}eUH)dЬDΛ!D1 Ag>`ΙÛAz}vǦ}&P =~7Nfŕ2RbUsuT:,bbVXqɫ?kxN{=t8`PmQ -IDQs~sZ`7/!4 !F 6D6HJ&rBjjT#xG:Ub c-)q3SBHT )J"hNJ@I2$h*BЏٻj8oW.) VG -n(h@>t/1?pҺ< 4uI9D滅H~ -L:C ~`ȡmR 7dt2wO >jvyѣir[#G1iqKh\H_Jڿ^6J>iAZՀB aR0T›Dr?9>+S,֜O~^g٧KFIJo8~|Zo53rb~/:W]#Gg݃ƚب?eJ4|n].^ge>xoi_*,Z3_Wyؾ$~ 7e]ri"d qSI1J/.,Gђ/pUD4)\4 M(URS֒5RBmT`h;J LIm""@X\(P8Y -AԂ Ld߮~xg۬ CǟG|FU[ -tOHf_'Ս1$+7_Ceȯxu5WJu64ИD/ũ)A _GυMϧ޼]ܼf2Q& -m&i"|Ϭ}U6kW}O+擄) i1W+ *RK&"SBM4ʼOq6X*DQ K] H@ Sh)5P@, c*h4T CA-"`1IHCc%4R@۟-$TTXB|\c^? -}gl>W~]Fno씐ihgT5=!Ϸ J#r^|BL5]Kp"B`~ hO{}m[NVn)yr]fNq<+kze1־8M -:NmKm ->f-Śլt#L= 潛#]'K:+4zgzv ]ur]7Hy0Jds<~p.+r輞u71ؽܓ'[/3N1>V{6'É3}KÞ4??^Ӯ| z\|6U/z7_^_&L2Ni_~66wWi;17~_7[ܴ3mdDКPVL9>>ǓyhJ\Ķ"TBBɌnXH$h%C@ d@'#NF)jFIR: Y$/lJi ȉM=K HjkjI -zqS -! G͇upohN`] r^L{͏&lJ@bd&\y529˼T:N̒ĕHD|_`g:{ڗn>gg߳x;m5LC@$& XL7y{)RBV &TDRbˑ*8<3c\>cQhƲ!\&jdDhrUʠR4)e*N B -H!2S@&Di00-HIHJ* H4M щ\i'_y_Kx9^y61A<|9Zt醉T H}Kʟ1Y`nZRr㦩1@* z:R->9P>y_wHس=wds_7DksKni<|Hźǩrn>_Iݴk<+pֱw_5۹bsi:ԼsY߷,a̿/ϳfwNOU?=q^+yOR99ys>?o~J} pәmӷn9ϩnג7\O_8v٫mLmy%<Fy>(>{Fhif/;vM5psYL~=~kх>s =}G-fIA -mT T \9>/>3o4b"4 -C҈*T*U I H&%5!zMsjնBJ'D{y c>(nKVNRͪYr3^KӾ%9ngY -Tc>繣fs#9k6hLZˋ.M2A[KsU@t=C} -4yH9Ƚo8-)I -@D,%4x.נ&ׇ]וklmm$lRJb+M R -!4LgS4 FTM%SH ȀhĚ\c%,7*JRА LC@ @SiD4  @R[BCDR$$hTXJG.[kR{_xog>oxVdҦ5_?-(ңxi/7ҏ)guv[ĝ'BعBt%qof:^fwE/ſkړju:ʟjV/ڥ:nTy~%q*Doeu(yI6( -G]N]/u.HY32 -2(+L\F"_Q}}5M>ӓC&"~df?S\jO.6F"v_cy_t<NLRh~nuYߟm4n'y~}G>3Q|ZiݱhdZ49B>߷7ujI%PfĒHV EȢB`PU)L+6 Jʟ| TkzлVDZ(y鵮+5]S ~b'D"U3DԐ!T۳ tW6~ܻ$M)gI-l=/ldm\kf^?~K' "$'Y.d*}2W+70%RP$2c3F5N̿G7tEͅ7IT i-:`>|TNFliϙĨj -V$i}ye閛@ %#@$IVhCrh -MLw&yLTU{.Nqc~W)Zέ|O:tOqމNxIdtLAO/QvrD*@J!XkO2>V<d>?hӼxvw{Guf~o#š12cU3Y.I(DA&FwgYQ4:Ro5~vXmH0 !LD4 [Mo'WFGGͧn2f\\sN]' %* $АCH*HD -ja'&1HfMoaTR(X m& l Q hɡtFI @%B *6u}Y '>m{ZUi;ݢ9+M3];_rN~ϕ&ll^b˨lqⱂ*9|Fm-+xl1 )D>'ZGjѲn??雷Փ8ѣ:7n秸ɔ`ͽw*k}Gx^ިokzK})>>IL1h/ -w=Y`}NFs?;#C^N:v/$^qFMS^Hvsw -Kɏ}m~{~5.Oj|{=dw__SXtU=YDkp5OE?εޱNUwG]*/ku]) -+JxyixfrȔqe+@Ef>CX3|W;鏏ʽsopOOe "A4!%cT4$-BURE7+2zʤdF{ QPřG_|)5\kIt:Zӏ/KuOaϟOwqCm}sE@ʢTdgɎQ{[TCC$*ZR¢m)[4>|=2{äF$T[D4a[oOIڮkhrvszTBmM RY`7 R@1 -2I3j&.hI1q*&!4@] aQ4@@NA h%9) Y@SA-L&ml@$Đ 4 Q4*\:=0!69x^}a~<D{EC7̱{9>μNgetm9,o%"/ͩl^V*w 17|º-y|*qs)z^ iڎ1Nh̵)_G'U|#H@&_G6 qqe'Ūu͂˺xl.uAy^RD!@%"FJP4IH/_c F-{Y?AG)4B2ιg}'At ,x^NߨRsQ R*BhV\wYsq&;%M궩)\h#z<8Z$DbME"1q6Ze0ICs`2)BTƟQ@A, ;eѶ[{5]ͻ!ew&n~zW4z.zXsj~tg%c(HŬl_ͩƹ9GW\ -冥'AP ~G/nan|ҽ3e4->:9Oїq=;>[9Ϳj&?Gycnomx.!r^{{_?cxsޙOzB~r=ff<==N8g[ܧ7ѰZkC<¼~}c/; _?awcΣ}1^ь~y@A7c$&|\;v[/+Wu9ˊLX>/3az~tHгEêp=ʷ]֮c,95LfÛ)ƿDY#Լ6iW~jqH PܸҐ#D#` LZ~acC'&*8k/V_>|"9^ԭ5OpI1L ˅b|tKw8\ RTQ` PJH@`%fl\Ly4ɒ*e#MX4+A*dk0Q70$P%&Z%4 $Cx~>[6"<4R=D4!*BB@xrԲT 4i 52 TbȦ&n #Fofh1p"VlłL$!A-#!&& "k@0ITZA!'ǐ玍<ބW ޭI×G ס}‹?N磡06yat#`& -̚!_~a7C͔8Z2*x:}oZDl)*Sq}/g޲f76$O\zZĿWy@RG̱{Y/z#|ؼ?ikt6Tx~}/ sr/t$ab4R2FlU ҠCC)!܍h0M&>C>?i&&>ܰ[A8fWթs^ҹm;ޒno~q -&ֺ{TMH&S0@JC',"!CDBp6fd^ϫm!{8z?yYɴkY$z3:/|NƗ'c}7v|>y^ -oR wKgoLٹ"_eKz|_&?+#.#\2sF9LچҿLvlgO'x^_}^έ1tsof3çp᯻~uOk)[]4qR*GC][XL\Xw:,ky߻/ lv-%^+LzN yrŠh@QT*BT nh*2E )"qw(TUˎw~^&ji<'| ΓJǻ#\O֤m]<%Z'ME5*M5 -l& -i &)9j%6,6dZ( ` ЕI|j1is&׹yPꗕO+hW|6H  ǬY{NC}{z9A_-Zl&ϕtM!5 &*&6sR g&1*BNM7 LjĒ&2KQ!Mv;}qR Œ!ZsaRsr!1MH M@I );Pr @ s'̻4x?Bl5z'É ێ/;Vam_7ӢFMǐ쵱۴s߹:`'L@˺u|̧[!XL jk9Rt?+M+yѵez7Vbg]6B#bȻzѶO^mSw6`Lw)?<߿D_on5rV{2s_}=sJ}w7~Fxo똸bbDד{9Ƚg=ͽ5M)^;@^|x[#~W]mWnᛛtŗt -?F'*pn,F^]FjlínNg1ݳ/0:Z?4I7m&NF tOO|˦iy=%ͿO2-4)\\P:CRKr5RTH`0MM C022g2nojb-LCB Lw.,znfǛt_ -}}]]^\ @&*IOg۵Uc OCIs/$l!!If41qXYY.m!`dba2RXٜ%Ңk6N\U KhCPM)ҀRZF`Tk@PJH8@0W:enѩm&rZGxun?n03\w_yв/&7-||M+gN@Tݸd/ -2-Wlg@+~ -dYbLܑ!Rr~tMlGw7[idv9Zb_juMSpns}.ӲRoOJ)I=7k^v3*5 #_<0˴kl7,d~"h7ؗ]>>^c=OBW鉼Od}2f1zSԹ3kS{A̓C;N#_s+'޿NW^7Zv u5mjXϴB^@_w&qL+vgŲƵ;e_Ȼ }'[D J "JT?LJMH$rRR!*WBhI͎-M$/ߩ큇} j~Kb j+Wdƨ @Ri&@! @@/>;FkǓk`JMB!.RGo7>Uk>K)ˌvWl~l7|V0@&Kǫk>O|R{L:Vyyl^hMR~^auׯ{t~a -˂\:ꓐlzY%>(͵͖gɉ8]7/g,/*S"Igܜ˭|޻'֣pQ8_>WX~_sbǖ`vm^Jmɞ2|f֍LB{On>51;SS`JlCC/gɏ7^m˯Uz-:SwOU/#>MLKJKCyOUv]2{NfĿscm: 趛}HM/1\*I6#^~}acZ_tX?Ub|ɞb)qH R̍(i&*X 0 EȘ2fŚ/şyn-2JvjPh^w] #+_ɎW}Σ皑茣+hMcE^noOU#>Ul|˯lAY%"h!&Y@ CBTfRa*K ȱ܉2qK}2 Rc410D,I)jT&s (JZcjfQG"T36Zpg9i=/N>k9Wk"6_Qi{{n'?FϤ@4 -ۄu.G2kx=փw -bZ&1?gLvVz `_Bpʺ?׌mlGϮ<3rk8| ?sXŖm__S6zZ,y|}P>6_^tht5%~{͎EϜmZ5}^?!z<vƺ}k9GAͪl}ռyp닖fc=03gIH - "I=^esKxY^|MR$<yKpjK=俻l|~{~Ժ$Iz[][~\&H}?-}7 iĪĂ J` 0Sp4lC@*hɛhbͼ﬿(+Zb擴ǝzQu2_^s:ɨxZ_fi1z&mb:nkMb{Ybˍ">ƹ.f.+iz8l''}c#@Hgqa+. `y~|V\ߞ^sGif?'{fUT>otU> -{Ɏrc_'=?]W& :ɴv-'6}3/ӨmlƮ{xQZkL<= s4@'&#[q|yS pT9U/t~4s81i|6\2^g/K&Zu&"cj_Y3`]js.&(o Z@ Y)H%qDi^6;>_㑹g.b|S:'kQ-i^}!"=lJWγP&Lqe4GK21"Jj2F` P cχ1XJK4@1"_6_. /7Ŭ5}C4>vwbM-nvsCsQ&@r|c>m,>&ѮǢnҚ*nO٨)4P!L%P""@IE!e!+ (IQu -2^ӝ9j؉@14 D*%CIBZDt -NA#VK`fnf\)=~I#6?˿?X!IYMDȫ#1|kRoFܓ-KiJ폎=7>upy~^y'/>/KZW7o>/"_>L>il_#v-Hۧ|}N n{.lֶ3j U7/CݣqHO?T _Y=_V&<jFχ}jN=tuQy;>kt?b[6dxwS5=-[lAͺG]Act^o&O'G:*. us9y{Nzyg={WT+;Yu_x>C^NIo?>y'Y=5{ß -*)da__~?\79X,0]>Fl,}ޖ x\ RԒ'k&q*!'|<{?r5`I zGG#eˏ]6]9f>j𞿋j{`%^Տ3@E hPM F%R&lRM 3eǛ|dǗfP-Uje.-JjBIM N`M +DXr -H Ve Шc5$EiS -Sr JK H/X6B`SXLTD2NH##YYU* 4IB(&LR @60@RӖfTT 聁*|fM|.-y~ԏz9Enڱ"h Cy~TN -tP{@ϔ@-GoMDMguz0~*^~АAtNCY5+r&':h][|n9_c5wE3*MZڴ h56C5sr,/cRvo?txnO)]g'Ϻ>סO6#݊r=1v8^S/*^o㷔>G.wI`֙嘺ʳ>yeؼ7DY #j6f3"ieFJm\R}1 -2"FZȤL4 *"h"#"+> }GuZM"IR P *P!{!1Fy=L9DԶ3}=3l'؂n#>5w/+28Q|_5vKrI}7Py5G:t8N)ʼ.gSkUz^}f唙4%@X6JK!IA- 4 - yǖ/ыejA5 -0Y"JDC%R '2$o@1!RQI1"F"+j@CDRfLPišUH YQAYc@$CEX$C@ 5`Q`M %%D["_ڗ"N;Z9G& kg^KAꓔ~Ӓ ԉ11~?SM7Dֈ=X 0ŒPP>/Y`V}yW臍ֳpvdb}<_Laj3N&h Ȕ [sca(r4`InU$i@7,1DM )b k"! W"($jMPe Q)!bb($a}Oϟ/7ϗy"6c&1 K@KhƁR2L!RZ>8k=y{m膧س72?yRrҩO)Aġ,|?r>/Id UMY*Y$!9T@@ЀMi9,@ @زEσkY:f,Pʐ  Y%A+#MK$i#01 B hi$`qm1#J!DbETR+P!M !6Pc_D. .r -[NN 8?tԾ1`  bMd0% r @M 51 h *@5-KCAR4M1T40C&mAd2QJ4բL!`4REG4e $`6%E7*)RG,$HH) D0@HV`6ܨIW,l@!XZ.Z9V  !**DR NYbc̀[?tìwiDDD0E"S"FMC$M -M("ԩT$C edDR#A 6@Z$ J4PJQj%3$$Ҥ4  0Lr119cqq/,#շچ]og}ŚX>O~~5Cf" D&M**bDJ`K@bm- VC L¾32_\}!+X8~c<|guΙ =W8<^\KwcoIꯗgw3u/o|E)Ra2}y3<@?h<ʥ$ Hh  \҄$*R!$'64uB& ) 4 1-1SM 4iE Ei$JJ28h4 VL6 C0f) Ɖ4Q%MT(T%0 i(  - -\0CIY WSpV)`TIJTFH(rЂb*(-fF8>CO -+xwo;i޶.$@qHi"EJ L \rZSSSJ*I*d HTjIR8C@Ԃ*YU$*q#AR4!.+Z:%.>7>AiܵnF L@}">̭OC{yֻό^rWXyqqI]7 gr8[;^'Goś[ :&zu|:^>pGDpYЎzmuIy>DF\A Y*Ud\)\Fl:rIeLCTs H*|D7|˞>Q~ qj㲦agHРT0-'#P41rȱI&@hbcJ4  bP P`@@wV0`S`l!5M҅/=3O}jثn5,iy͸b: -Ptcc$G^9#%p|;S+m~f~k_ -?^hfO ~(M3~̈́~_ --{ŝv&&-#6f3Y>C2k>>kϯ}[juMȡc;S?}?DS:b=^~c.5H UR1+D@@KV sR$ISJXh"$%srJ -B *jL"aO|xڝoFvO3[+B:0v fY0e/>?rx+=/Zg=#ɟ|TYvc=P!rg'ȞCܟ"Ɏ_N+1Lb^|e<_a!%|G&$2}X3l>8K}XsV:#_}77߇_/%پ 1|P/? q>pB\R T )(@f X  3aMT}Ac ~7?|>*~_ BY2*'x&_+>@\,#A~$+P\E}|}I@e\b=o}XC'3 r|`'y%ppDf;! "01A#2@P$%3BQ`4pCaq5DRESb&matk[]"GK褺2̺3. -l~z4KF0DFe]tW]EYtQ]5ѢOF4KD4 x>B4KDˣ."Үatk Z]|&&s4=n&:|".qt]].Nmnq5nkKK[ r/arW+ar-ar-ar-a<37╽'\ζe\bu/ٗ<#{5܋buζ'\뗰&\\:ؙ=yr-ar+erW+erW)erlN99ewwYlYiwoQtgjYr;>ۺa&|,vlvu˒4mnFjvl68g懴3-)ɞ1;؈_J.ٌ=9bF@l/#g{0Hn -)v\e9-},v}]ܤR6Z9jvd"%Nn G!}ԭ鷗L -5ѭfݰS(AtXFUhW!Er%ErTW'I45j - ,YjZlֵַZjZ[:SkZԵkRԉ`ogм7pO eY=jJkK]2Q|t]%tJtᖙ>k,'i$l2ؙmJrud%h/mnL[3-bu:ٙl̴q7>o7Yn:KY-dKY-d[ZkuZk%ַZkZn:K[n[n-KRԵ:[N[nKSnK[N:S2Zktfp?/U/Ur+MrWNm.MtO0eۣ.뢒覺5,=E5qt]t]2闗N}}ݟK9䊭[3-V6hem뮙y6uE. `jU]6jtrn[RSNuunvOTUzt@ , ,[R~SG#lL.:Pw]>ut]lE%WF]"WI 6EN})N䨮N.^تL_b]k5fRԵ:Sn:KY-dY-dKQ-dSnu[UeY=jjdJd*kEӫ -WN>a'eNuh.At ]2T]253]"WG ]WH=U.fteWF]EuMtYWE> c]IMU.WMu\\ERNf[3-̫jU/oSW el>n͂E6 U]4) -iڝjuoۛku'WEgzYe>>]inU8DtMĺL MRMB>kJkb6ZֲZjuLNz3uf7Zk%Zj%Zku֥yW8CYrW/Qr\4).ViM pڳYЬ:on?KgGyMYoœd뿇X7Kv2O}R&vgݝjɳ!1vSm3{fNhef;ְO -FOdߚoɿ'Y:UPFz4yuˊդdLVI 4ND/8cJe_inpu,rF{\/Y?PhhCFq3x[^&z?H{7{V -{; 7{^hMsݍ ^ޣvNRok;͞>CKK'- #[dsO$q (&x37jGoȠ#g-[S&'vfc4?LA')'Uջ>$okK$S0f"re$RF1Ys5_߭IVt%}֒YȖ]f7خdy?*? ` ,2N!n4ؙd2L:nG.KD -cŨQLd27n* -u뻐zn M 2D7 w3/:wYsg]f8oldžkX 74E/3cl@v$7C4o.%$Fby&mr'c|S6L׬@#̓!L! [5·j1m]`f>]B9!{ܖhtC(I+ [Bmx3uzXB ?P@\ʣnju>޳CϥD}.;ҾSZG -mTЋE;QmREeKMsE.z$/vi $يn& dN>`ru$ G+JV*ޱةZM_PR5wv.杬i4-qnD0f٬j8nl\ -d+[vZ-mX6! -EZ16rQ65nՊPZnLmOfN=`'k$pGo!Ps.ӫz;6qB1Rӊs C$QLpdLJ7t> y0w휑@E9E?g+KzKJӱhg+ ɳI06Af)/\ɽF$dJT{ -! #f>Iի%W&Z {ozZU{"`~-U3v=vw~fp.d9`"4ecB ztf-[\ P9 =#eb(XdR!!*H%uZDS @:>H{jxd@cNN6ccF! >7Ş?eZfp96caHA;N&3ݱ>Dp-5}Ǐ1qUK?A7`/ǪBąu,Mlg"7o#Vfќ28]68*dR&VpeCgpgu۟d#'wL3e͠r0 0flV jafaRC  6`lˎ_?M'稧UG\dz]iudOLr?eftnA ʹOI% dxl:c& n|o C -Uɼsw,O,w𼑷Z('O;nٷN͟E}k1Y);:GGu4RG.i7LpU=j:c)C{ LnJDdg$sQh2zr95ms6[YI#ǒ,^fgwtu:9(gvrc)GT~Y>T%÷ւY;zzgS~Y~YnG8tjоqY'wi?fEmrr$ ]>o,\'x~CL6jQB>X:r?IX?ߒ!"')2ު̹#6B̂zku_36m՟ѐ}<&Od $1L`&AG% h`]4o(e"}1kQ)mJ3ˎ a 5>,gs95 (;nBFQe#'IVLZAi=uzMա=&wP1,&va Nϡ~6U͡L1gMN#rbO2)Wwpf;4<+i'zlx⇘x3vK `W,͟x' ag)`\Ff:"qSuqVɸYyvu,mgԞdkFX5BGbi['<=I>#WlEcȣ( g^^lZ?>h Sz/ V[5eٶOmF"ټ#-g+RPs)+eaRR~xEVYufuD1140>Az @n` ̞fy`ُ͓=?v]t+&ՐGm?S|Mۣ.,0NO٘Ygԏ{W7KZ[oeI%).P,)O8VIH\O -D!l*V@+T -UvKz"Ǡ#l:HDDR B6_}7T7"ٓ{?aO\6OZ Nr͉\ۛf9*ve 9dy&u -"4jl"(%ԯ afro#z^qfmu!Iym~3D:Qaќu_ P6)]Ճ"N`,K50v冰sf܀&u1 A{P\6gOv)HD.>Ppn: 9C&'yb<16hB9F9<7WqxOLG8h:F7'93TX+K:#Nb.fBQHf"dioI/3=fX^m'T\n]Yteu}W%bV2xA{NJg R4Q.zx!sF' +7MW\uiNZ~xUVbrCr(GA;bHm@o黰zF6WNvZcBA-E lh'M<3y"-˘^BgbJ'0报gI{.$ky3 pv&h%,q"ӫNiqY޹wbN^da17Pt 3wO yw+jam$1IҩۦW].:|> ;|pl2Sw֢Zftiy%XE[8rUި7v%iS4EE ;s36ussgfOx 8hFRIjRS/T lz}R\%St͓չ䵒V|<ǩS7r~E*@cPox&;pgu%:&vRabVv;32cyqZȰ۰J3b.^ZnHlaIMVUܩ͔axq#&n͛ZyKUѮ.mPrI-ag.g]ZUOoՒ8uWRF? sq/7`:\Ao'MreY6l<6ȑdP_vfkQ,Na!;xt}#MTd?K.g~eDuu:Ե-Kɞi?M$uZ*=rO81D18a>r>Mr/T.Y0tլ$,x4AJc$çr#=MqwYG_٥͖XƤ1Eo_#7f(l֛(%w%v~gEXp(p% A;Vfr5D$w_9$Z`^5zٶknQ@MٿڳGӅZla (G !%z)׵cT6@H+5j܀3}|;ez|kn<6Kh=cQ]bIvT}יw\ae{{az`דYz"kdA,=X]ٙyg ;eDm)? Hq1-nd+1$DmKvN⣐J{hv,?vfOrHq@f+wT,I`fsfT$B lK$n>F;8dqڤHgx q5;,]x'k9?v5Z5[М'y;>q.|}u:čG7Xv@dy:&O6fr ZI0)Ig0 ?IEZm`vd\OAn ~dB./ݡ6Nxqi?c8K8t*sz68 UF6mvmZ܆Ve"P\I^)[u-jYq AzQJ0MԸ_%]4"[jH?G~J)Suhjr]b5?\WwrtoVBr8,c4O]ѣC:F@0~ -b#''¬ jsR̦ *K4olN mu=)Zj[!.g=#3k8t/,A LDl>gSy 6BVqb9=w7uc "Iq -UaJ9",$t30":pN&nvLJeRAqš? 4or!r:ef6tXkh،\ E3$A̚%>{F}ʵ~SiMq-# nz_EzwgUWLߦE!}53 D7[* xH5wӵrYizԨ.Au+yoAyX'>IbZIhu}Y8fiD@p:79;0=* YEF '*ݘYGG 37 c݄Qa@o跂UwWylu'fdG`ul{.ډC&j8f`1!6\/Wok-NǑUÆ\%9Irw2tt 3!l$1&ZM2h~\)\)?c=:3uB~ANm N7<b-j՟dsD27HtxFUj5`&^HGZ;Y9M5,U)2 ry;l,qCqbꭋ# >;3ݟ -е9'Veի.Yuj9X@1F>'*yJLO-N/[h;kwQbA,'ؽF0y@^owȴ@\lY+Vmj$}nr*-6c|7~G55[X@FQNlV;ZDC(DbdG10шY \#!lK;HIrwv˱J3P!,/?vL8tG뾒'VUҳPpY*D^jX7WyLkDIoi+#yb(j딦ᅽ)2%8bICr}U)x"h*zdm%>`ڄc js>BUTe%Z.<aF6HpE LU!zOT2ĩ;uɊuLm#2VuGnxc\_XW8V5m7{d}ve]lBf;ra2iX&׵˯qfj$9|k^ȫ~iA9u7ݽ!C/;+ Lؖ♳zc9X})jn< fv ; Eޖ8 o0 8VGa&Ȼ3d߷2'Ygt7kä₽|86j`BT]#dZEWfɜyם>nu3k(uyǧ5S;MV|9)AvvwgRQ@> ;FFc'ËN*zL谆rUF"Sӎe$Xu3h3|*Gμ]GK8|Sqؽ|ŪҺֆS/v&AV5gv39&Uz;i0<&9A]Ii6VpHlZ[2^Ӏu]ʤ bM6 A-$Kiu֗Yp[;{գ'g~}k>^%jAYGK fMv]6CqH Mj;EebzvZ yQ2;RP/w #/Hc8;mؼC"ƣ&KǠpڲ$l6Τ|Ăi[ -,l/\Yar]i}06FRO+Vj y٪I6$ M]8`) 皊xxJ@nxLbaWˆ2EĊK XDLT*^p%(8ͅb{~3!yUs}/YkN )1rjp0hd:)+JOJ](KKfxdזCnY͡o!]K$!ymAL7͂3Uv9X6&ܚF1XKV{$+DEzRɵ *r=^bm3bm"*tuN@M]>֥Y;m&Fu)OHzsC$TU31uIjvtq\n[atuIE UL^I1=&r| #1[SoIbV;$G#04[JpYQ2uaٹ -YdmE.Ut.]t\KD\k|):KKr|rWW%wK3zdbg?" \^ ͢"oF]i*dпal|HmUlQ[2v9Emn?wh*.n%ٻl\L =?O2wtE0ްeBUؾU~Y\N)CmVUA8X7ڱ0') ٙ6X}cYع J#i#0Īn] 1}nKTO^y -(\ƕ뻰A~ l}~Ez.Ϟ^L'aN0tue/qa8jz=&S-.Œl M d&͹y M̺i9>PرeəזE ;4174e #7tq]WG%  |ۃf&6]Ve\5\5\5S]>uӪYt˧Ck'".b ۥô/ f=jh{6"Lݿgz fx6Lկfau ɷ!6V k GxT8~OTG*Z*k+ܭVQCNXAkB*s5=2vGpQGRk0FN燝'A3)9{hY)) &|ٰ%)*StBClbcVxO(:{c {Q}&gR[ݣsmgrV!ܴIpW'W'Z]iuiuNY? eSEba+: "h3BTzC9 .A|苓b)~Ɏ6JG)gZvsMr}wcc5hO}-Kkk1ivq&}68x arAV##R`7v3j4r Wٔw?IL -Zv)' K6riGbw+[o YH;"%nU8kwݖ!Un u5JӐ b:nsw͕yL:鵷-\͖ \b|8"hNxwx޵@٬#w7h_/E~з48޼ 6%HG^(?PZ]F~ꓧfM%wl,F?v$]PTuT]QuDؘ&?MRϳfzoX]$B:,RC/8yJXg<(^r;n#3ԣFO'2QhD?&_#s~{ -KAn ~s -ށoW[,ۆ'j: $"L~an(Ip3h(bVv8s-ח)fsP~ ase껈u -IʑjO(HC1QE&{~͛f9=Yz͚O|ߴ#r,no݊|c<>Ir=Ն\ݕX\Y\\\\\ZMz.zҎݓY7ޝ!ɩnihc RéMBBFtˤQK4X}wQ1 5fh )`o Gjw,䥎AŅ77n~#ӱŗ;_/ܞ@T _YC'}8Ȣ1fGlRCs61:%-RbB49$%.  ;O'R6`\KӞr8V 6 /f͞!k~OzA?O~7a6dq -F:=O0U)\ I}!RXe9X1|)ZӏS9c'ɋ"I7aEV3|Z{G~ {-Ğ9LfI[SO Bjyi\;.z+n4xbo8٥ԖDZNL\i" =6xBjS;ra^&oKԒ<3;h%𳼡7FSlomj.ZO=S!oϙFܮ_V3il38s%$nd/~0lĶq3戵jui%WNR.gl#пǭnv00+h+51 .:a"oI՚k>w/rs6` ɅL'q|2X<" -76&?Ոܽ9nJ?6ĮǤmpzn؍]SKz3Oh! -y5+uc]hPۭ.=l,Nܡ,#^;'8knF#ZZZNP%%u54 _Eg -fn~~U[Jӊrx1ӱqlKќw"-iy+3\H^6\1/*;U@U`KyiD,CBbCF4n韆B6rwLNȫ,Vx(GѰJ:dTpC ߤ@&.4)cWIKQ6M6ɽ&c(#6J?2 FydJ5cE`eLZ>6 +QA4,,J:a9u.u -X-|eV\eXLsH-Vlٿ1kVZmNîNHu t]$HM uWI]%t]6_ -)t])6bÚ#cM\rP2).B*-gk,⢳ S_d2uq:MT%xk%xaUZ]蓼$OFϊ7~y9KNšU( '9:yntd .Fv^Rvwnc6#ſCplоg5Hl;9ˤVRP(3f(a75ѫ(IM*;hI$2q%. d͗#܆HM]zzy~o͗Ҋcw?l@癪ٙj[-[Ane t-["[Eny5dw$ޛz>sz,^S3׌.JQ}d,}PɂjXfg`|܎Q+NlFQNNZ1$u%k%B \ 4W_H*.$ 5[Tk"?͛w'l7Hm~ W#Մ,\A!,LE%F%zr? 5y@a;צ] SFiFtщI;\.ӲzSG 2B jzFZwRܒܻEFwb?gz$U*ʯfj\\%Oޚ0ݷ`5܃uhC&וySw]ɠdeiNޛ~^'¢)'?s;*E&HXlBLիlx]@eOz d&u4",IJ0ڀLK&%oJ|6GF)\1@RD:gɰ뒆,hCSqPfwL5.w'.O&eҩQW }NdVcã<,>IfZpR_~Xt;sUieD-E@pDqj>-䧃hHjT:OXkIߧ`ޏŔ_l dY[q (- ;C~O~yIu C,&D19zL:FheށY]abٲVyiLůҺU5鮕MtkR]=,Y!|"voD>v.mѝtg]tgU(9x%[kn룺9(h=x ԭ%mC)"ff#6=2s/Z*,d凿g&|9gTəm_˙|቟w2jMMR_tU&a8JgffEѳ+C[ѝ`9QIfj穠9[0R6b;O%Uoml1D1ᓩ2(?>R\uMӪxYGn,,hga)K4j=|'~&'ofSjtfKSD1WuelbؐNTbC-w9/fdvӚkr 짚d:;g?υo uZHDxwP[y$)ٞ1 g3ۍk?~9沍d 鯢}%YjgkȳkjkWogl\:4U4NLټ_m,e[!tr,f`D61X3=\? jebm 4_kFoO/Vh hZ]e`.Ҍ^F{y.}P,b*19[5Y3 0%$:RxeY6Z dkIcJ^?o;i&|Ն=F.Ibv7hy~9+Kd7(D:9_oVg?hՙ,4Y69:~#xm+%~HNRRL[C1jlV-]6J3܌OviYv3PN37A>wyA(Zr,O:PM=3wa /뒽q\Vk#&lGkrطpo!M~ES>)/UucUlN^.YugO:~k#O:aPauGO2G=&vٷpaQg9 ܥ;d-c`m(fճj]5=Yh|Wtah &q g\;8wɳGݕ׳jV BG)ACFŷye<SX)X^ֳ15g^VG"ZI8WٕoL힂ϾFӻd vhp6ã7&lR.]MS0ȁ)֝>3/W6/.~xnG3vg%s[QQ"nɞs\p)wJ2ݯ$*ԅiZDCD|%#a%Y4?S39SdUz祽zM_ДfقuW!:oB\4 -W@HG']~U84ϒ;k &xs[nwaISnݳM'pFl`Ǎ'|.r?I,se$\')笚#qDْ}f^1+EvQ03GnpF1l!_g#3337za#5`hwPBvuvH=ZvRi%0s9gpq (^Fh|L2j\ -sé;372cJ2f³ 2 >N&UeYmW[P-1ea6YԵ-nKQ-d:b>w+uKQdX"Q2vxdĪWX>/X͘~c719 11%d0X b[l3[߲vnmP}kUi^i݉HU8O? gdTKTvϴT=mD~_3atI|zުk-~j2.r)ri~{QeԠ]F_Q6^oȺYDjǜ0y#jm`g -N #7 -h++ժzƛ#3+Vw|9Yc;Ю.Τe iQ#bFL-uNvTQ3yG'7[\%+ .Yk[(U"9)K^#/bhcϬ~߳V-PSR[IDOoݲ]::՗!Qr5#Ur5W%Qrt'Mr-MlV[5#,^G[p+,EAGdީT-q>@Pӆ'$Uk7avȊ9fF/~!59 Z62[yO f]ś7;3&ca5j}ɠ`ezS9v uj{C僖m4a0ߖtK._I,:Ld~YioblOYU*yE[j]?g=b9'W,9Ms;M59#\خi=\͇[Vm<$!k+U_R5\D޶^(>drV썘_#R - 0&)s.IR*LDbgQݽ]oV[ՑKPġ/H2DIgg;4$l-Qts3f -RCTB`]B1;H_3΂i)7Uz4ҕӸ4EkJmS}TU(!`%vB/&Cfc -fg^W@O%y_Q}EYE -ޅoBڬ˜ʋel6mC@tN[jݓ2jl37EsN&XN8Dl#>9\2*{ih6%U7ٰGӳLJ3,vP gn- NĎ*Fd<|4D#oe9څ!OFR.RQl?MI.V.Z)3ڂR%!vnJtvx+R/+--)NS/+<)oݹ )Ug|IG3 OlCBY2Yτm\E+'ĠA>j$A+d|Ui6$;=-ZXwg,֣rlOPMڑ7@RE\U#m"O[fN -E;#AV͏d.i깦fffnDS]*5Q!8 fGAg,jk #Eě m%j.Qtj -0W-a0h<2:PZD@XGR2OB"߀"ߺ8t YbIRPB0o'{3⏳x -$[MkLb<%Lߙ=iz_"fvjLϛÈAu%Hd@W^va3a/g7>$H3f6=Zݨɷ3dpŚ.R*E"2=.-aqi3gf&jfO%st3' - 0/K$U܀qf]fu%MW{:]\2 -ҸᴡJI4VWӍku=$[RSW)arvW%i5 Nul2R‹oNMhuW7LJD2_f^;"lɽFV1 ;n8JڙK<ƛع"݉rtxexlٻaajL~xzq Ńze4Jk2V6 ^ξ\@AXew;.p&M!U-L_+tɉ8azOO0~O׌ -aUm'.:5I!4o,N ^ܵ.3d|F5B8'\͗\͕~,?r&Lcsff6L+JZ[:۶7Jbo~َK\#ua8HP9iqL$$7ZsQbщ`'{v}'+f=Se H,mY֢]۔f1s%(C;v;%nvF]ȸS}b --::XmR -\WJY9?EqA䄵ׄ/*p -G_q$5wvCsҾIփ[R.^w\Z\[]6#3ISO5J,L#z[|RK4Ԏ-&n2.4kScsܞ6d<aг;+՟=-QՆ'84KSdw0> -巃HOknaD$ak[U,Z"PN%T'fwB]Ƒ3Xlh(7^@c3̐i&b0dc\"ǧ)KQ8v9a_\"#|R"V9޲`LG fWNvRvswV=r?"XtQ׈ +C _'9{!BGRgU8ݼa0ų-+Yks -egogIQ uS]Ful'u .&d\sߐU% zԂGuoÉfzA$"jz0͆LM~`~<8C*H" --fܗRQ'&Ey6 N āl˖|EQ5-ȩhc}<2Vv<5I\haO'a |qGd!rvm,##~&9qwZE )}cW趡|7,1:O]:՗#Uru'Qrt/U+-飅ΫF̵1 KTB{02ŷC[vggg 7YSŊy(bQ}Uw\%-Pe)(`xҫԜ.59Sƒ=j|4ĵ6I#rNz+.JKCgovtgzL$iȞ UoA҉IB8ʴ0쥩^gwr2!'ih,wNe1}N~Qܠ|0s-˖>n%VoȞVǜH#,VcxƬp 7&6tK].wjw'ԏr @&1YoW[&܌H0ۓO }Gu^;v ŏ O Z7<֯KV` -{}ty6RjWuŁl)xW.t]a3 -=¥6W!i83wS_Xbfhp7InIJZvb20ۓH{'DC|4duN]jу{du_Q6Bf\5SOz.YuSAS|1lRF2OeQԎvl0>ٗ=~W2%֌]1>,^ NKQ~4mmXt 單 -oUEiMuj MjLbY=BTA?dܫE mjKZsb iސcP17C~1òf vQXҳdXxq7e\]]:b[  -N*Z [12Ҳu''Nϴps]V˦aX7Yu -Sb#!͟[(ɽ=,e{}{3U&YYn/f/ۿ;v_~7ٝZk%R>j1#<6瓎`EH:NC$0} G^q)r\39uIoP\ jhicn%ӛ4Pݤi*WZ 8MJi -|bƢ83I2=!-'IoT[E[rIVMR}v't`VMڃ!8jϮm"?vy)e:Fg8U0jA3>1S>̣7uh}M^g.MցڱJOCCxâiu} 6v*FC&>9{Lri`6XP(xeOz9Ɉ+p'9^]ƍ`t]V]*¯ŢOd?S'Y:No);6U5 -:x+K,μεW1+.r{YuSxͳl|[q{srwifY8MQ&lּFXY',edH+Igv#؂j96v]Z4k: 6Yp4&hpn(/E+_P\|1`WO*iom;13[ob.ē~o,V)An:w~0UB)סHJErƖX{ 'hm04=[t7x|dçmU東wgg#?n 9\0صA.1WCF(q7C#3;Lo򘏳l 1fieScx: &|lC%b -k0es_#߬~ ?e;;Es?Eu -+,b6E㍣coY -.]uzˬC~"]uX%դPbE, 6Z]i%_ݧn"{uq5NlqLcҖP'շh3g[XÖk͐& vvY;eٴ.&vSk͇[_bfvcmC(l&Wݚ뷫/S[`MWOll4]X}ZE%&a6.8LٶlwNr-Br Zxrqd(lz>GnHŀsvxדAk7sŔ}fOY0[Jy)H? -DPCgo~"- FիmߖONMO+yRrp.ln7/Jы6]WFPɔd f U#]a;ۤ޳Kn./ѓ6jNhFQa;fLܫ_ud]È\ /Xk&<*:UsSӞI?H}ӝOԌ>|.6MVb^\ .ӮjNwq;R)܎NZ\3Өxej:_ ̤؟g+W\,}EU6o5Υ^8^LdjehfoĀʖ!B?I_3L/b4ݛ>IvɝѮDGa!m'ibN;Aa"ڕl̹K+KMMκT.\_/Bh|{x#H#o&[@_v_e~~%VG -'ه3 +>je`J[&6rx,Y1C03l{g4R"Q>`_VNkݛWD# 17b gvs`ϩ^daTsH272;[vgll6tU]"<&p?V#KԨEu*I:M *'>*r<9ݱZ˫]Z1ek|[WXuũ!aK~{Q;]֖C6kיyӿmί- c%br:鲓 e6SaۥZw]*DzK #D  ̘E۾J[ɥ( C8}9WNQtT]*NwrI$B(B(Jv\ $㼾bp.lNwsT:z{w!;~`|WNV귶^+|Y3yv\"]ݪ^혳w% Ge -mJjNq|r3&I#r}՚*)h;QgGxS,Zn'|#/6'Ozh1j;81mZnjaԵp[`}?uU\5\EON׮ߖz "=YeٌWQ0UEb6!/Yٟ_f `Q_bVjx#/pSb7a&ݎXr>nU![Pwl#S Ӕ !c D0ӊHkIv檷^)fsM#%'ogV(CfgU21KaX{Xh*tbofiwY{xenqNߊ6 -QaxݦEbri$7Aa]].l(zJ鐦f9]jY"Aᷡյ&$ߍ~[,\ܭkuU0h@ ~dS˕5VRSb7A\9ٓÉ.$4of vA hWf Zgt0aBv>KO6c`kQwo<Ֆ(hPGZ]iu'YZ80wz?{ *XvvmM b/+g,ևY3{$D^Vfm{-2|.Bs8z}YE}U#.IݶuXi gp̻vvY-;SOU|17/ݝ!{Ml,<1@2wwnfm#^ar~١]NzX]&4I:.J0DR0Qw [jUKQbUtkÜ+TwFHԍn+iޙn̞чRyCzvmW,-/ FA#gyιI۶x8.WuvOc. !o $7i#iI5.ʵGoTXUv7b(|( a&QO!v%tM>{\&캝Me' "d?C7)rWh*q|]2k$2*.v R dy[Wq}XĀա"&cg $1A;I]NJ a1]"tP3?G`IՓ )L* -28|*v&#Clo[ ^L6ﮤ'afwai^AP@u>A|lR`v K6?g";'zA,^e}hby yzc2 4{3\Fh\TMXҊiM Sgrh\3U x-_*7DPbR?q=Õx=nԧM;#{~1aRL@C- #5`WMuT*Nتjf}2Է k%]0I-fõ)+X,\uY=v^e8 3vG׳5ZIT;vxY CB>Nu4c.qVjnP@+f[0-f)ݟ'65مL0is%!hHL\I>G$D_UW(W4xu1hOveө! 棣V97oufzmSl٥ t+Pҧ 5D('Ky6}yt; Qfu%_Q}Ee5wLzcm?KtP@Zi1`~ގ=dil ͘p28͓b_f5nxY}*@.\Te&LԩD.N{1%Z)"q6%_x׊-xoؿm3dFm_ !aVv6v?h.'ъ Umb,K{mݳ2J.'Ub£؊ -Wo'u^e^tYdVĹ˖˳Gf:zXLeYMvj>(A)6}2IlQ]68O^6:rמm^,-Q=:n1&!D$JsZl7\45kFba!&Ȯn]rU6k&`yt!si{q`*_R|N筮vү4(ob!7ل09.l ɿ!kTr|\V*qTX*ŒgQlsOS'pY՛5IN-WPoZ*FbzR&.,-.*݇VyN3.Կ`x"cNG,wO%eBn4n;xA/FBC,atiS`.Jg9?3"~'TpmJ(I<v6vvgoZ֨U+nFG d)@ 8k2`?3 ϳ◑Y̘0V-G[F! Yy6u]auvPقHLHE^GRX铃\1fSqbg亼XbMGIK[ &ޯ4Rǜrׅ+s21u6í0˯Y)1@1;T'zBٺz[&[!Ob:êM6I,ٶjFn8FY5.MuJKSF,MBѱ[@Qѭo_`(jP aHFO$~$D5,6FRV,&\rf#~Z/d߳9w\lv!&}+Mv{6o̷dN6M\u,'])aa:._ dᅊ;.fM\3#0D/XkDߍ$B:,_|V6۟&4scs܊d8aA֫ۆbhpsab#A>ig0-oBO(#_%Q1GpwɝRZ+۳$/Hb-Лp*/_"u>k|,).z_oa."|&F˶Qֳ7Uvt͐qebl&wƺ).|6Q=B%fdžǝVI63PWg8kj jTwK wLd͐xq)(EKw ݊Ejf错^uDŽRoub9YP/fug-~ dčmd`$:31쟿 gX;>CU&_\Z,onTfȄʙZ (ʟ&입sY$W!ErW#Etzg՜>HͤVqM:<9,Jh"gŦKq$j77z9b89y 6Ē!aoYI7GM(DDD[ҕ3M8P[Z0RioՍ>+?StvTO"jAR eR4 |_4jBbG~f.M-ʹ;ȯQv,92o3;f!LĂZ>+1 -F@y3N|;batd=G݆VYiVY\kّ\Bk}>&v5044`I7ZSֈ_T\U7~MG,s5`{BSo燦UݗU鉈X a6/YٵuZkT]Zzlu9heībHXWv kx2Cx(VL@݆Hۧڋ -dCWKKq̫ah鐪^j<0e~r" 8z,߆k7;~pxZMKϥ~3)-T둴YMOtd=:jU+Ml[Uוo[ s#nčAN]{3~!&ȥ+:C.ɰvA@?p#e^gMZ.^ت8]6yڡFu=ܣxq&F "͖&lFfbm"҃-WnUk]Aky߅v%Zv⢂&rX2jU[p8fM MPG\bk5SQsP٪΀n3HU/~F)zЄqAıl'd'Z]d'=p+8y;O,vO?T]R0s3m.Wu$CmpN6!i[erJ84pɤz1Bó3FMiyU0߄mE$8'#zB9 qI+kL;LJO`,4傯E1M118>MfN:VSVyQ ~VCNۗ)+ڱRՍҰN1ëGfByBght$eƉizqrJh$mߎY񚤧mٙ2D@U xX@ FBoJꭚb7w`"61g瘝C\qz|8`x X;@ ,:<;.g\*YvQjُRou}\wZeeTkz %!(w6ݳ=`c_)27L8m@o8h(n_3I)2`;o` -BϔqЄ᭑M ]b>!?hZ[ol,f-kR~+}جPqv"۸J߄qإ09'#I~f ^DPHR9Hd&#d( gjBD7nښ;e:vq41m8Ro?LCӫF&U^VpbCH!4f >oЩR`e -{i7oR Q4#Ir5'QGnz_AY]1nbOZef]hM7aЪ4?ިVZ<nXPb6X]}erj6uffwvf:oݳS뿅ݛݝeYwrG8o"N^.Z٦7U*E\]kP>+7kDEZ -sAby R&v'~2HFb/V@o0͋xoW6Lm#wSnPc/T=2,c zyf$)4f< -:,"g@3](g1j^МDLzx9W,,Xc7V \8a}sk'XtU - #~Pgл1JMjuY]֒Z]dow.np[\tKL_)edWdN6snMOn{% er28|WPXO22BۍЁ:ݰ#Yd7n檮r'O%;3w]u Q]JTڥe(N15QVmr΅7ׇxY!Pq>Mty.MtjL&фIՉ3 |XA<*A|bU|͹Y3o4gGmi3pl:hyGZvvvgnP y/drfv2fy(dǎyE.VG͟ ?WB\GlgB8ojVDW_wVXġ6,س6EfyU Rӆi 'l=\,Y/#եvK'Mv(n5#gvEYvͲQ(W7쮄X\,&'y?B>affY2s}rjr%͊_~3iݢI7zQQl- -h#0[GZ#Zn/44~͈e&})ۄR$C'z߬A,r}Ō_t Vdu(IBٳ#\՜UlG'|:uNN<*S1>-xާcStwl*TJUEc0-p}.I5l'V:0 -Ue*範@×K&%j#V,ah})]Evo1P}G,\nNU4Zֹ$x3RWfUr8CS\~1C*Se~hy٦X Tb0ib(pLuy㌜l1e#꺙>k̟W7+6 z5GԈ4bSdu]h%Z;e>7eRVW?m%'u'"%i6i7M,W4둬손E(iM~,M݂Z ,;[2!amƦsW*[Bߗwiaa$nlIMl|y:eYӚXNUU#m)lWr-UrP;?z@[kʎ%+U^)$hcy^wmMN3fu+@q*Jvdt5/nRm.Bl6vWJ5L瓢g e]naBab',Uݟ#99qm1ĥK( ;6!/{>@,BAte6ḴX=1ߘ W%L{&>jJ2(Q!PzCEl C&~*<*RH~GqbQb1yfA42vg ջ! WNz4&,M$Ŗr@HLXҒ{_˞NGl2I?͓p|߬顺^9}16]T5㗏>Q;AtK Tvm['"1,.gYع$sxW8mwjLݙ̘c6evOvY囮]%1R_3R<'Z]d,.Z[e,ۆI>6sN+L[}Q8u؋Gdu=)%<*@mPՒvI40!b5Ah gUV&hP,6&IٸO7Pa1Xv<2{Q#2Ye-YVjUzK.f;72DR5OukP9A,˛X9;32ǩs.ifh@xq;ψ(kߊ}սLC/.VxH>kÈ(qU(lL%J.Ng6'fM ?$A'o^ ֗n*J{SO%N*l-M\ҶM\1 A5(5Yl{(>Ӎ,Mf>2:ĭN-ҽNf #6;HrbVWh Dޘ+k.]t˥VPᑤI'WnDqk 9=j7O0FI$~W㤼c3sۧ^u^t#6'gM Qm=M\럦iHX3f&|r77kSNZIh%օ]9Q&čZ#f?ɱʵͲ˷nQxc-A LُLkvbT 5GH.Y>#s}/Ó/:s< ,?R8W(k9 )w,{q' -r Dα.`btp]48¦67٬~گj˗94Չc ,>SPQCnCRc}/]:%թQY-X#")4f/VՑ>4NgiT5'ζ-1}j+,.#I6ȤNFxQשZx\^RIz+' ͤ N=Yԯ./ז Xax2n!j2"'cjn(c޿jWjڱ OIfiVFz'n;rCj47qx8[!'zwFgXUlgßyڳM۴8tm}> -ԫ4' R9C֎6ϕJWW#c_C^td P%^n,NjudL`*d(G BAzBI*dgݪYx5g=YUZ{AhȺu =CNM1jm]f~.BԪSZ%(mL˝Poh7à2ɤKXgfieըXZ3;>^ON2hzU̝ߐ:b(LJ5UP Ÿ겧ħ6Q[I瘽4u1oAUfij^ufWvev *A/EbXp|۪ 0ܘ]N$SֿS "Rsv}w֊m:f9Dt 3|4gh]O,@l7r79cbOfRي<&-->Ryg{TeDՖKa e<6hlķ-QcoX0i8bzS -iȢ z掸B9FfaxdbF!m0IMvy w sb\7Z3Djՠ\#P> ;YlJރuFÖaLfʤ1ŸYV?R¬?r gAfA.q'NIEbNSlT+" #dSޫ\D#.^"ͤrՓMfq"=*S`~1/KbS6 )B0bdeۄPIn}ة{mb2P44}իX6$9?gkm;,Jx.f7m쉱z\ʅ9"#OjalK9J>ޓwujYsdE`7؝%i6eavJ%琪k{,p_د ǥ~Ņyۺ,HkD-ߓLF1q~_GSH!Ie8ĥ.m.q3QW;VVYڱf8&P^]uX|NS&* spӔ~Z':?Q)Z@[5nKnYSmX[tˣ6 ="E$QDF #@֎8ɞ]ԕpĶ}pei<h) v~t(yIPF6%zb듙φ:L<(Uĝ,^3P+;%J8-_:-(0"n0US5uq1 U<:ye:HVD*4Q -fݖ1lŐnY,JmWcmv=|vV~70uT愁45UnR X?IsPZVuSa]VLQ*GC,*eoAr5ؘ|6#w'l2zTGo d兊i{ԛ۩WoncO%tC Pd/nX&xi&Y;24qaԘdٌ0M18h/ٛ/29HYv&fYR'p-׳6X?qlaʐ8ԅOy*ЋeWG,$k -@ y6!ڂ ikVtP@b,Je+GV$;\`;t_`h㓞` zv`{mavi#㕳3.ʵ@ŗ 7>S&E!pxoՈtU+3 2͛7~-~뫪0Ɵ.E(dԳtn[z p&3D,m1멋kE(nzӧa"&ɷZIfh,ߌB.fzݧ,.DZ̆?Gh@w"ڕ@ nV_*hNm5Zhcqztr8KOWOםЦu_jYi.ItK]*aafC1q6H]?u;+3 z}Fݠwx'ez0S{v8wSɉE'Ӧw&{ `ALU7.s:N8Ҭ8oO_c?p8IK]7!5q3hnΧ3)!% -\tg|/NHtq:#WR+t CF@ifk~3=Y91ڎqP7!;E2bQ z8؍;yz*+X90w0јs]&mY{#êJ ˦SOVpv 8 {)b@@4YivUR?Bl[Ud#BsUaofٯ{]n+2|B.|L3 >%?޴͂y$uEoz iGUdw\) +|ݗu, sEB9 ߋ ;JbgJI/bVd?j4n /[1vHB1gvG8y;ܷC f d.ثg,N>Dɠ+NSŨ} ?[?g VZ+#6Є۞yO.Je5 < #ݕ v_R|lJhOk;I:nvitĠLgp%]5Y8/^lٝo\}plOD3S֯+b=m6!NaUFQv՘;]a>1'Y$شL;39z"-B}˟؉4s 6zj&G>9v`sYx/[*LɸrkRDu9&>G8bY򝰭[2{ ŸP9p,Fs *Ǯ.R8[3J0dlf8 b -DBFZa7j3n,"Ĵ -ꄟO~ӮnޙgZ3f;eM /4>z}uUC A1vQӎ1]sUW7M5D_gʝ'%N Qa_qՒG̡ĩD: XHoiYb-Nb՘onKswbFi;3 VBDqRYc+,g4%-11d X3Y/bb-In;nԫ1pzX؆<$ 8Lw5>3iP:A`B&9댅> -yFV!\gXZыa̧}w$c i޻Sq,%I\5 F +~٬q06ɷQ0FD)Z@ >h`!RBa -%58r*Fs_[ʌ$X=L|vPL"~TIV]Mj0^G!gnm5^;߱01dd]?u]&[zL`2nJjtL]-M5 -̚V[G ,ٽ,|2%N"g&- oǒj4d44j[3Y9MIoǷm\اg۲f}/ -Hl\D_Mgmpݭ;vԒPϞ1,-ⱊSF?7o NY,2Nbko afۉ~+ cТdkLDJC Hrc -\y b=Zk> .KA+mQ!܉]Z-Tx3^2ŤKڔxl5e(t1]o$W'.Fݙ^Y6!M&Va,W'9m!zqɃ-:@r -Ցz={7 qZea>N0C%ęֶۗjK0<'b +tJ<*:.+ˆy>ETWڲffn VR)8pCK ,ty)'{&mSy+“ӻ? l刡=̣J+O\+_fplj+C Wp(?'U-s13Њss]!lpcEY$8ma|/j%֒Z i>TGnv.}sV]-8Z;?rGE #/ɱ d@ߋjZUl9#љda "a1I]޴zRQ̬wH2:i7ۻ乌Abc7qkpc7n='H?S(0!+fYj7erkX&1ICxsɳ]BWQVYr*T4j*!t ]8_+sj]8DgܗQQB1#iU IۄI Kbw~$:Q: i=VIV13.ШC/yGLq7Z14^u]?6a0႞|1ߪ?oS؄W.^[.Sw6`b7evaD,;JwOy-2ُ: p@@XU U=rŐRBC#ߪ˨SR2'\6i =?f- r,?8vNןXLDN]%]" zpOw3}Y͔ hZOZ̲D9?%ֵַZ;{V+3xaK ɭ+r%.GUdێk2Y? -|Wn9OlEֻ'y*٪HUΞ?Q uGc{Cj)ٿa뙉v7i2&M>F˰ fߣ|-.Pq B< -VP!7wjKB|}qgq;`@Ee*.Qtr}8~6oy .޾Ndng۾׉:"ښN; ;w|*Apf6k[H*3@/e-{lN!݈3%hV%fVg`nXmϳvP>aI7i-ڶX`ř8ζoQ> -SM<ƹ;1œ`vYoZ9O<˞HCXv쪽x_vLI M^\IHwe_1,Ěnp#䐬=a5{Uq ˹x 33fսZY6UW 1~K5I꼓Odw'>O [DP9_Nf$YE1]&F{T-l~1fMDyZ *ޤ-۞8:Ĭ|>!esV+"~4!woɚ@ٔs ~3Ҩok\5SMJ{~ Q܀#ViwlrO1wٿ=Mަ^r֠4A8[1Fgb7\̋|yw_hM '/efH6킝BQg;Mђ2ix$sR ۀfy4[2HXA"I|;rhf܈)5گO۫N[@d13'hb)-j;C84[vgqєGݧ.q󘒜 ``x[y39 dqb 46LlLCZ:qPs7fؾkG'6er9PLItrE'jGMVæea>zY|T|\JfX* yiuKK>Oj:j'YsèF#g)K(:m׎ػb= Vy/扺je;Xlzs1lSm2eF]e3~u/9e,R{ޯV*J X k?:˿\O&Ƒc/B䶊V?KVnЕ͎t}Mui{/l<u׭ձ9M [:¶6)G8i:VG> ?V#'Ɲl=eGjrdYf_yhXmU1t}VQQUb|r߯fr9Ke)vdULw&{܄[45CQb^(oO;/&[&LoʷXk觬?w;I?݋m^V fpQ`c])Ejb,ƽA7$l>jV p6`Xx% (mUaC<2>AI 0"eNLU^Xj)h`aUҡjKZ5Ui @ #6Y0z|:|WnHn6>c><jo$laF2W93 -^۝>~ 2V##A q%Q |4NG X@WP(J$\#L <>Itk]:V~Bl[VdZb297 H" o -\RS}xè$cwgύc1x,B!@|ɫp]Mׂ'A+K&tXmY]N@*Җ!rPT<-JPVyU U,RM c8"͇ɮt=ݔ&?mQ{?.i/-TE_PPmZvu4?nQ]nr6pNgx -&#l6M;u)#/*#Sݫ0hxV8FJ q?5h{77y4(8#I{3R!3I PQwڹF;8s{e8reaOYz3iQJ2g; jE>$?{2|k-#Fu,β@97ٻ}CDz .5fcv"/ -{@i˴U+iO^ݭRmRVWn%Z&4.;!1\%8NkLr?GVFjs-JAHxsImGNEr^a菺y̢F]7x=rAI'ɿan/j&_fg"<@Š=ԡe9>:l{?"%"ZBZbFbxńRQ -Qm_4#{7Nζ0sKkS&W&U]BEǗhX 𱭘J=E߶"o\zՊ'/ٚH19$;s8KU9.Ur<`,L,HMeZ7?bUֱԅ.IAz奲$A(h8 5cЫZ "N*{\5;9à5kY Q62kO֦]ZlNC߷9&!ɇ/|sNd&#fAk9UgfyAglDž=Q/$~b# ENi͐zw3O{ ]F]6U: 1pL0"- Ua\e~W6^z,J fS8؜;14׎wX䯐B48PhIwH4!~*LS1eqKfGFMHQ Uy=:+rg燜R4=DcuP㯅yABf11hIԗ?Iu*M'f]8ǞOS3ԫl̘#vMXKut4sYoa+R'9;rݛ͓ܪs?Muk3 ~_L7wϥpq IKVB5ao;n (ݘf{?iĤ3g5 BfB?N˘aB1c X*+F_8;mᴳsv]iu=`4^xN)a0Ǒ))LXHy&VXӍmh1Oe^Y -0ÓV߅j{Uw2ByjZqS҂ctxG Kb7|V _5k.Y3zGJLn[0WQPW9`j16Bju0^a9ߎO5v[VD2opbxGt0L}mӚƺm&]6It(#  8 )@vX5-1=tڲr=\ʼn1r_Vs Iik1MAbInit)D]m٘^ ` A(c4F XdB焳[Pxozv=I%Ztp5K[N֯#|%4x34m?T?T>VۨS5ɼ3'OZ}&.өZD.V"٩)Bc{-*jYXBqQ.ARb쥘#8HCbdٻ6~q'Wj'o[Jk<)ZhFl4'őC fqQ)?HlŽ9LK^+#!BM ۞<:R`h, ܬ,oE[1&fanNś?X/x^<<ÂXNHI#E ~c8;5ʔdss?NxHjh^qʕ*LMnM#ӫZcM9vN5D4'ou^RKnnspMZ0lufay5^1 -h%ar`kP*nϔ7j@ 1Ybpz堞V V_;y~ōӽ ZPG$x8Yؿ #^9+됽|>T,-~c*0k7%QZE*RkV8{Y MQrfjZ+x}].mBAZqCYd޶l,Ubf{ٿ;ԘY_̣ d\둙r.k4#X|'ΉF&K-p"O6Agll=[%P7 VCQrUg䩶a·Euvm󸣪gtLG*dv ][1,bpgJ 6YeĬ(/G(ObFaUh;0υE+]ac_E? RM[|XLXa*IiwE$dU"ovVh؞˻HaӣK.(JP #Xa2 ݥj!eܦn؇(mLP)&B[VerB Iz܎@>eBz oَV $LJi%0oHzݫnVYnb^.-Y>Be̚y)=hÇ݋ Q^Nfvn}xG4fӻes5;O6z|H"hŅ&bp933`$.YGSˉA(2)3/3l˩Td؍4Ek.]ڃ3Gky.=I'v@?Y-_%nd>w7=i0M@ B,8ׅXjxIՕs4&|JCא!bl ؙFd-3d?XatbKӳσ6j'ݢR.O3>vq9$bTn\/$ Bsn%wr*:׭6MZi?M\#lhI]y5lb%6# -욝f[0&ɸr~.Yx j|G0pxaS -獿 +U(j\D*'U QzC(,/'u4W`|ۨ>ggfvk7Yfpf(\bj)Q!/?-_DYӝz&NҮрYWG>l. 1 8p7ȴn:Eo#2]=OӁrff]`<> N^irL"2K!AWNxL]De5ӨVv¾)jرCM3Dߙ"O4x-P ƺD WQǢ>kZ0uD.-\:0$;/<<,Z{@G.^Xmr|Q8>dF9LG~M=H5,3![TeOr.I,ZIdžp%wx,b@>,QU3&Xt~($=V)'fX#!"53i,efu[ڪTe#nd^?Drfo`pr}=)9d]~#jZ]iuɿH{e.f۟@V/FtQeG ᤆ!{M2g'\* b"#t͇֛<8&c^)C4!iwYpIopNnA^ -B:ZV*V&gQ\',A c>BٛU}1ra#0NI) -N0vt2ݰI)1HCb?ֱB'f׋VByv˅<,mRwouwdmDr*<2,CbVra]?'ozl2>&L,) :t?aXUo=n8B1YRf #\TI6Y$뼙i9^!oƷ@&d -Zіx ;TJ7l=Rq5JgGV3#~Qtk]>Xͤ3GݱDqE&+D\7q$٧ e/:ȓ؝ iQsޮZ:JXϣnC/Yf&ه̹h -`nzE\?s|Rb 2uC.ZGly0H5a 3h3e(4DR3Чë])"V*k#:{x+oB뷼v" xcOG6la gkƋbv= {./`%-gQ22t><.HmXe'n[v% n پ%./1A^ ɣ>Jc 69lcY 1ЊHi>~ZZeXx -קa^z+tsPXc9m߭rxJlYy\^#h8/vwOjzq[qv\e+->408;D24!YasbhۍchX֪*PLZA|GT g$o!c P!իk8;EQ[Ӂ_b?țOV,sz[ui\0Uo,:1(]ϷK;Z6C,ovVpq2i6ѱPdSH$5!G߰dZjb6j#U6X/'ӹ-YB&r>eGo 6rS16O\dի2hnퟋK+rOj.~y3?޽g-+3dߔfHlSGn!?=IsVG+?yXG# 3d-uyG?[o8&aVhxߣƛV]"zp'x$'@1 !!o/gP@{e6 b O6y*-[;>J72HY" IsBգ:dIJqDl1f!:k}\S?E>xUX3+  o3&¥!g[TzwmiX [I>724"Qp(#6E%Ir/UrsL 'aQĤ a/Jzkي X)O+Yݔ!Ԓsօf.?{ bPA16?V9ǃ0<ڈEިHS86Y7IrD|5X"||nX+ׂ͖̳a3=/)f|e-Оfѝʍ> 蠸oc\sJv$b6NEXc-A =Z(.@ Ugl?g?IJ:|:H'hMk=zl.y!oVMv7ߺoZ.K†:o#I@kX!0{DBq\A#?m٠cZIbLCRB,l9[FG ;7^Li%,:mrg:k7ȅJ@/16#`1݃G33{xtٶZ i%8?rElI !b;ْe#9ȳu-F~8#׺{m?'xY$.E>%MSe nO؝GRujt٫UVFmp Et|k& 8Mvk7X!/9f K%|Y'vF6#p(IDPg<erl;+]ricJ.bXMCj@ՓY#(2 e%&4liǟ͙OIHI\>NC(ޜ6ʬN7)Yyvzݰ,zۗ;OWXKsm}ԶFFAS<e*ϹQMB.^x `sx\ƟVL[Wی\+0J-L@p0Z3cqp;Q zO#f"R87uKm:Nx?d|Ёڥa[0KI"({>!YMdB좨`yx'bgzV"}uP_J+xv"HT=R ~]>x(m۴1CA/6er%tPZ)tY)ԔTFO/UY3)&'é&é*J\[{Lz>NV f&blÆZjj%qQ".GPW^ay [d| +4[q1(mD,-GOy뱞'bp3yc<.R僳wBϩNʑƓ̤mHeh1Y}Kuc[8HPEV6fo/fPv%,l;6)aYh4w܁=FOC/8g~@˹~y*˗$×軮H_܅5p|;rB)-zNlG,jWlnSp&ͻ;,WDŽe!>YlKu*.U6M0-ԹZ]k.+q jMt+\$Wp͙ڑk=yd]FYZk. >,ӵpqr}$}&vuB u޶#M'4QT>)IW 'BjSܵ/(:'^lxwOnM8T1dV]wg-' fcA*|U b,{eH3$8*-۵쀳WtϋAj0Ӏh}H6 RTթmYӪ; ғX- |Jqj؜n |XYlU8\wρ2qF=ذtzZ-g;'JUeꮗUoruZIdA,޴U]G>%ZlCcwYf ݅,!ir}Nҋ"ٗ7Mަ8/>ͧ.䪦d,!Ҭ~vЉ!??b)$5DZ4?\Qr[p 1Ͼ3>#^#Є/N8oP#n,9xhuZipUq:í_c|7m Kou6"Bo5bqE~VbٰXb҅a|06E>Vxs=YDpl5lIg4$ -$Ԣ`b3^(4du Nɺ}MV.Z`>YR$ZK1ҳbw;lGGc?w/9Rğޞ%yHXHg}%љtpauA؟?O4QO̾{;xQR,y݁b{tsԐI?oV)(OEת1\)exd5L vfwvwz,Yq'Y,m+Y""">EP~_TXYyp"3L4WίћCdWZ5vݣ%^fê]s'Y:]#4lݠė/yY?J@i#0p3whFj{.RY(ÎY-.vo9𖍢7𷺜k[C`\xu&TUb㚧d+uJalV Ivđ[>iPZ!l iJruNQgޮekykrfhaǟ~y:G۲F:)>0g .MZg3}.K;E(wipzx.UfxcRԲf4&6?ǣ]RnݼG#F.75p+مŜvS3 Sda}qlo2.mGQz-ur\˷){$|~>N%Ӊtg bJ2qv\MjExqp6"5J]5 fO r-bgQ ׅ٤gf;4u0mI&+:gp4 OO5.k~B9y=VMrVY?sMNA|tѢ -+˓a}AĂ#[Vbجkx>朄[xė/tPY8ǩ΋쟝u[jWM6-C+٣~g!fT6|>J?`8pB1̌~F{rYrT-]e0y\}ͶowC~ $hUqo:[Yr-B{ .[ -(MoS~>OU\EEvm6فwqr+XGV֯J%-RRĩ;nX?gxkfY8\cah@\I\3\m^ - -Z-jYl1JYE涱4 ٛròelaǻ61n*Ť8O3<>n|[4CƇlٝY W>U6/_ F ПX=x'IK31n}np(BiKhrƖUJ֬N9ɨHX{Y0( YF@k`߄x -NpJiU\*Ity+|úi3vSXĘLiՈCQ&;g:r4wAۻŌ!Pf`,RXvwxrSî4fc+٬覨cj b!(^ 7+M%{Ry$Aаx:Ko ]dJ{mcQc]4ؽOA[$/?Q_8b5u&O&y&Gv|~^5e.!( r_4S7E_R8ڼ<,U7|FHHK$'xwޛ}T 5^Evv& 3+ -pdWjN!tHME*&©2(`|3܂8N[5j]ux6pŠ%i@dnqYy5=õy)p5&)f=eu9TfÖa7r|r|]Xían╳3ffh؇m3wV hx~B])0gO8"~&؀TEori:mr8sjt]qL_6#+v'vT&tY4qbo sǰgV3X|͑vv5x.%"r 1eFqc>zoZ60ER'!J{1ZsnMݙիbk;; 0s*kNJ jS-i^֋mvS4 KAy5[NyV w$)LUl6{+AN;֪_sU˖V[e¨?6j2b}xrZVdd·`[Փ8f<&+şnuK LECqifnmC˫ĥ^w<2i~b,QN9IVd霖n?mtPB< xWĕq'tծg? -vѱ^V"Q`-جA;Gݍ8uyi^|2 \U%>Z(¤4^avv,Qu:+dDcV~Fy"k2>Rel_&xhbq6S6'\4,[,eMVк,(G"4@H}ӨEt*8rg٪Dc]2̗yOl/z{3W(-FۇHVmWs7ߪUeS\$7;px wT]RWV)@L50 `Y:|bLue ZN/[ɟ[wbI⮞l]U|I>~3ʼn17ω8H bO"qŪ?.ضzA<0 nM1~,r9J: smER @2"6;XXIC\`g`.A Wmϗ ~F."&h&閗M6we^E-"➔SfKEoB]ׇ H~pG5ZVC=J~ PА(|.h7WY?.0i5F,=Xl6RE?aԕ>'@;'' q%*3C"Uj'F}2w\L0ߚ<2gc{FK5*֐,xM)6Y?ƧVlKZ4UạX(_ A4mdڞ}|<䡁ω ]*'I?Eu -+QLb -BۊSQ8Veի. -!,[;uO??UXuJd\ij+ӌ2A ^1oMp0Flюv )-߁ -oON sS6k|U]. >$inPzIS@.Z)d8cf`͖l,8q8%zg q5 -1bnҾ6.8{/ -\``V=Q؈v?s1mH.ӐYGhEݦ|Гq/O 8tO)^bN%_zW>Fz_:wMɗ=*v,Fj\ݼC$l!,to#}7/+E~9fxٲ?/;>Yih߆JR=/ݏ=%M~k^a=30ԣdȧ cu{Бlut9p*lO9+E7:]7OE fnhb+3 ٲfxxu?ë<˥MbghjXPMS]2,&Zrڂ:-^( =^ ۣp#jGm1KW%gbm83G 5-Y ´ɚ K82 wD:;u<}÷w~j6hfwyu=PpF+Eʩ8E'JU5)2əB3g[U[k 7+x[ꂻHD%jg>^ٿ ߆o]8#(:!sqD 1zN .*fӆ0Ӹ-9GK2'8c#l*]V"M!M#M HXݖd1/ǩy5ܩ/r藳oH~ǡdφ[M=_ww"Gjoyfg1v&⬵fb鮈 j _ /C's~IOG+Hd"<Mof콸~ '҈2c{?dնZpݙ|^2r"8`~& "O`tBwYтv~8z԰ \+\ r{6h.2 -E{"R%H~|Bt}[/N{PVӮlam,M+s[pqz7Xfdby?XGge. cٟE:g6$~IQXZ_Dp'WeUGUd؍6(Sr]rxnb -Z=). Rm,:q3j㇄C10bcx(|48w^. J e5ө2TP ;Glؑ컰90t͈=!tr~Khq1Oc[Ne#gurg\DPj_ӹ,qV Zb%$s [ S!Bg\kO:3 2τ՚~ fYf 2.6jYͼ^Lm38"Y}aÇlc<ٔ7c8dwNloN:ѡNduo}&rpĪK } 1C!m / |A͋?NܯNRHcaDcbAٕE*Kwnap3_]E-H}-oeLu WJ:XWHR ~.@Bdž,(AV\eNq0ɟ .UAfv$ /i:uӨ.ErF:cٵ{?lg z1U&RCdP_w/YrW߃+d!^Bz^hefm1gZK;u-K~%+!.;G8|8FEu`?ê9#T20ڮ,hQӦ>g۱dY;R&RIҝd?^WFqG!j:r׉dHFpp'sW@ouc-8>vlj:{]5 w\tעl<&ye0yˌx_w&l% nI&@ĝn`h̞F\4ZCiewY/6k7Zk&'%߶Fڎ9!52gvN ,J1h@v0;p'y 齂b^vY%,+%mBb͓qgRA -h!0 mdTiߣ d#U QdHVM^ٮ*꼐>]ج:l ddv5 Hˏ,<'"3HMUҪ(k#<"L~dxg#fŨy6ǰȣ$!6g56m͕[qϜ%q`wxN<VRs7 # #pv!vr/]l|pmO0fkfm, ΧԦl",{)Vh Xy;W};j{sԗP^iNOY?G2M6cE%#LJH7lwS{ h!fyDňn$0ҧ2iz^wZV[:źq&lX^ڒqDo$1HC;'Ԝwh/E(Z'hlť6D`3rnC 8TRJ. Y]\}&XC)NjX;gڷL$c2?&$vcˤJ.U*Mo_XĠI<% 5nv?w.~'\ MA,Ys4 9Ms.ru !QV/)k3L+HlA+H; pqglJ6\xmS8K,L.SYivåd =/9?UݛFOCGSꟐ -%Oꋱ6m¨&9E.)0/e_ |_hiq~%IφG&gM~{$ acTx. Ӕ0xF15\LnߋjsRG8ìlm`=Ñ5Ҡ]7' x pҹb$0^Vq&QϫlNR|s؂tg&A!#fόhXO5gbiw$-\&m7,6ďv-PAm1gdr032Eo'2@A[д6an N!p.oy]k-eǺKA-~&Css2>гwrLQRXlCah{t9EsW;Es}C9~7Oᒖj'M30CթW[r<3j؄쥰1ފ&~ +Uj_T-aLbٮK,pᆱ)H:byJ'݌TF9,M^eK<{+4'b:1q: -+U$aA22Xu_}꘍\ǡTm;:I$gsJgCGY/YYf/LPa#}Q lCe7)lY~48sL>W*q(+V.^hk(c_PpfXaك:l^g6v,pcl݇S2f'[^nA5+퓿KϤR- pGb8Awg&Zɠ1Ub!*lG3H|1"aנ-'+*TɼFkDORY.&5J ޤӔ},N'\Ip+522υvv9݁X ڝ,V/bc'\VGReN/(s,Wx٣g`#~zP,˥E^gyJC-:dԩ!Ql[`LZՠr;L86j*ўq$wlʼf>6,Xs&i8\qU>l;prZIi%^mzY<'m233,"8@ x)A\  Vaqn?A/{֦}Dou4I>BT-d<#x2Nafy#o)ST}i~wP)2rQC'v(Ո蟑V*ِ(ADU$Z)cN@ot깮Bj.B6̼G$-ZfٳCHT0U<&~Z.~'hlN =|6"ma+{'&/.!b8R^tX/ߓ-/aFf:ov*Ò1GPGtw@A䦷0[&7Y˲VpIeJ ))Xp$9XMRɞNIt+i51d [qr|*l5Wg!h߅C2͵[3DKqd6 a`esX9u +gx^֟V'v8].T4#}n4 ʼW ζeza݆ W6le -A 6D1>(۳v[ٲQy7n#4fd lё -ylgzܸte/6Z h%Z"|z$jCv <-O Uu:VOC1x&8\Bh~ijzVovU. yK+BO ?s1o-M27V_Ksbn㟀SVNu֒Y?ٻx;rڴm8wuLg}[eT\Dj0 dh9 nAԔ/YZ@iz+RRf@.(/< )B((zuqk0bC=]ԝWyd&ė!}rWNW-i{qM+ N}ωc|1@ /Yl@X~l0I$Zcr"^e 3j؋NӏeKI~ sd?|s%nI^{;R3ByҰ:_n;J< +Jdl a-c SGՊAHNmRqn06kr6GVsZ2pFQ i$M;(h2kj2x D}'40(? GmBBrY,> - nr*roznNw?]wKj1Ms4=I?Esٛfjc3f򍫥aD/!ȡn[[bbl5Iiα9刃@6|i?Zu[8{ӎ? _PP``O5\~jkEq:u4-t鮗Qtj*5a614;h&GsbWo-^ Z> *rbdE4ظXl?xlJw 8'/v*iAjM8A -l55lbMnn<.f}p6`XUx Oc4T%o8؝Mz']_" ӳmr0ՊѶvR0e41NFaKI$ur`2ox2wZId'FCA`PoBrWK&;fo,~kombJ&[p0sl 5H+e)asjgG<[2ic;6e^`Ku_ R˶j xZ5|7n`!zo]uWYb 5ن$9:lg]R\40qzGWX'rŋK$aJIYlC{ o:tӹG}*ghae覡EӦ$<$83BGxDTJfX&m!JVb#jȐŊm]mb5r匙y3zP U-5K冦,-YÄXnV6}+3lKu!ĥQᘳd7hwDWoi&GsbC`'Xpq0%8nk[ewT-8EW!s A1S6=*I٣\ Hkf&]V 8idj<,JC{|,VYpkUfcXKx]8j 3,m4Q-bPyc7$ +׫ mú֧N1i]d鏺ߗr XlMTߦJ~\ٶXlrGcyelZj.M6'IR0E齊>rg@F5όG1F܄*h*ARr5ЎfSR>Nϛq#IK/E;fəlmHç:.n1-lyO&K~tt;G.df}E~~zO'FRohl>z=;p]a|Thh>*kv,Ij)"I4Q7@Gx[so6)w{ؗqG 0ck3 6l2t# I j7rO?txT,#5k܎I_&>HmRlSuWWu;A>L;7wILس4ˬ4B%K\o 6Hٚ|:+&CNy>vύ>QFDyy㩈W/e.$_V,>L,OŅ@="k-Q)0> q7 C(+*NeŴQۺo+d<&P`97ˉH9)w_'fBex>~˞STs}&A^ۼBäDxvsϒDL"ρfD/|Q$OA,g#d l|6M!I:ѓxm!Q7]LEwY#!C&Z;ņ(h;G  {ѤC;H XjBq-#@jvqg:7bT7!rHz5 /_g%n81(!ꕔ30jP#?'/+=ϯ/+~/]&kr% -ˉU3wuGz?\1kAE)8{6{/?y}|x_!DW'줖([9::jL*l*{ItH6&$S\L%Mr+QGuèsjZv!If^ X5Z-L 4mFc[ k7YXOP!b%}Qdk"YΧ~=?~e Qw|z?H u*(Lݛ˪Pݎs E1D.I,O!?O; q>{Bػ{X&[8 -X,HN@ -/Ȇl%7u&]>ԗ!EGZE>{Y"ljˌv␜Q"HQM ceT^NǨ  {$/|Uy%!x'iAaf)0we'leq| 5$ٳ!fc[pbV OZF_h<ц !r)̫MS]:!MGVI>N5qOVN.^`a&;WJv@N~E >Rf{33|^6/~Z#[1oNb _B˴n6.6|یsl^G)iJ|7o̢=B T!;Kឥ'ԝv|>igTGZH0VW7.* `,".J= zZɻDiZVOl ÿu8 ,fDq@b6r=z{~ŖC$Ryr.ҢMA/Zڅ5өP#b1Gq܃VZL6acl9S^܌!6n,X) nf^hf=#v--qbҤp-1YbtkR/_G}ݛyHlӱ2/l"3%WyVh]Zp0"!XnDw?3;+H:DlD$Μ%o` @]dͥynۺA!h  Q0.V7Zwq 6Dլ}E.U>+1 ɛA.S7d%W"?&,Ő=?e=;$1OdZ`⒦}2q onx͉X&&"9k<:ݗKMM3 qvo6$lÄGZC0L.B Kq7>XLN'Z_y6j\Q 3lc9x)ar0 /44D3F_ % Sx@40yOQwo |wOAf͟j}6>&q.J{qvblbكfwl0 _K7YJSmOR 8LZ?—yzvÇЄ bf;>I{M 9{C2sl8ٸ%GG^ߟamLN9GJɣ\ˬ>fڲQM&6^nprs -3.ɔ2ERg|A& Ek-}֣e-$k']suK5] Alr/]eus\rkO V,YiqgY -XNhy|Y)..~/;n"jAp Ikb|gK]>(*CD燿e[>82,~$whe䏄C^M#'f@ر6d^&Mx报RMys^,/퓺vX;hy2z{?W*ZG9;p:Ov]Y7d'M.zrqxٵps,oM>d݂ H#e%,d=Y?Mz_Dz}NGa)@_'\ |Qc33x;o lQiv 'E$m4MLr31qp D6u\h4ǻiw Ngs\ԩ29YGh8\:qbx$?\)p &Luou|)2WA#L6sN HETT*Xv͝\5(hiTUCp}AKJy3Q2bmir`fQ̷M(Ypre\]FBGB:xdx˫VEuv~ 48D7/gO606/ǖ3bė%B FM' J̚~zUTeLqC ;Eg7ى 8fSAXТXou?R\/Q;Fex#wMqSw_!XɵY[/;'HNϝb[ށo@a|8HM3[^o 7%l9E;wQ?k qM2 ě0T&Mj.Uu -yٝX/9TM~QUZ_NbN+Ω4D~>|gP3kL8mH%mi20#w8YGV-s=Q 7]6ؾ7UmX0|.JmܓVXgy=,GTIZ6$U1 Ҭ}fjQM}QU0 у{8N CDtYKZse_D"LZ${1P>[#TuJJ PXշͰßXurPٻd{8ӹ-xՍ/*b;pHYTGoY|_kbiya9 h3֠ORo~E6'E>%Av,B6Y*>ck껔0E*Y*F'd5&ĥvzwM6/&Y1/ ?#X]*E[0|g6SpOf" "=(g&#xL\IkR\%SdjfD -K[Dnu-yٴrX{4{;ˌrAI&dMբMU|J0=lsE3gMIMᒼl^fؾ&yKrR&Λ /4BuiRb1F.«i0NщOVY A^}3Ob?b)bkľyQb6fe7;Z>x;rw9ErOm?^rk 6G:atK^) _QGf(l -գ&!~^(}VwP#t+RN"؁g.97n:Sݿ75f뿃Ln 듩+e(Hn]/@,9Il =wbOo _kY: aE^Ba3uN-A-.UwY|Jo+I9{O}3dI-6{Uߝꋩ@oVW=g$-Yit[ܧ ߞ>Tt؅?eSs7Q4\K8וd:KI-$t'Yx2Nu֗Y:KA-$JҲOf TI䁗1Us5ۨ˞keduHWTub.eu;KZ\VdۺWgO$vdKbdNWtSHOyr'Zdݗ,쫘,Y˛m)muyVu|6.}bV˿X}] Q]YU6/z.KHJLkV궗T--.qu K[ҧ9oYg,6NݻwC'Y:KK.H~j.ni|J: NꔗR%m/Ǔ=W21?Wşmukk]FPZvsfߝoLYp!qˎvP}C&˾b٬jk7T& $'aֳ]d/l 'u2LY2Ҵ- ՟g/L,Vd]ɲYx K.Y:ds7u,d˲_%ZYddvtZW OjZ{&n;d%vuײwY7N o)7wYwZWodɓC|pgY)jufYNuZdeݮzIR\hIuZiZ]^ -+.]bV\\ݕX[Sߎv/FCͩd;upzGrvdCNF$ѶO:[}ٱkgb/!M`.#͝Xb&dݖӫeg(̈́؅Cdůƍ&Ūd4؅\j:ޮF'A-$/d'Zhu>s}f\4i|N|R/_YOZtVȋrY,ZgN,d w^it8-.6:~ߋ/~%qҴ:?&ǀSfY?tJotNddL'Y|ۇKg]{qɝ\N,%fx3|47"HIystĴ̖Z {d{1' !0@P1`AQap"YɒM$K$KM%$]3kȝ("9G"Q$O7'I"`hAEdlY;g\I$9G#s99"n4lI$I$9#$NDIr9Isg&Lr$/sG4sG3G&ӎ_I$Y$r9I'"I%DM K93͒rdv\X"H=+]5*ֺO]5Ս;"EUi?ªMUBTWϓTڅz]G \ꊾ\dXyiUWr6Q^&7 l?cfQz1:7 -cv*.΋B1&7~)PH+'lB"u,]= nB2UV)==ĎᖇzqWF?E^AHgŐ$4OE7kV1߃P&6ZJ[e ȼ5^g"I$Q(J%^$cn|dE!Ƚnqjq7d.4d rdɓ&L2f??%w) yIC/F7I+`B BUiC$lKtíYD޷=A5iZ06-:A$-Rf2dɓ#jے)!}9|DI$D?:S&Ec;Fz е1\zC88N$5zj觺`m:E) "XQUhtb}Y3#JIa>_^"DW$+ݎUMGՔnI>mnC;Q V(H]XVzs顫ֈ,fL2dRAZUrн,2d` U]hvwk{^YAUt=xI.!z($_ F VÛz^ A|2EU[2?$]5/EY*;FI͐ozoBOe$M)lZ} ɦcؔz&Hd2 4QO*!nNE\Gf|Xީ3^[I$,dDJFOMJֶ$GEh+$jΥEԙ2dɓ4QA؆&:E`E(v-{`7Ar2fABYD-niVdviG;:3AH^[S$duG+ EI>nW*U Dq #I:_vLVITDtfng\$!lBbid$hid*vEMԙR AWUHMHF}FչW7:ŎoT͸1GUOUMbc1 hEkwήX!ZrԽL0J%I#Q֝LDMWi-^׹j" k҇H Q(ɓԞӦ hCM_A"UoDl+Q*q՝0GA` $q!檏ꋢ_buWv^]<^(h^6J%*'KGYc]9~:QXў^jBs^vLzb^A2fFDRuVB0;Я~TASڼC6"}hoHYE% D# D;* XO5ER+Z#B2dmBhCkl&E  $ɓ$ۗV:țߋ$b5S$C:I$Y,Qv*+ 2dSo$v/B#C!E#9Ud\8F҅W{&;J$&Hd1|GC&hl["5]5B^H䉦L~.(^{_W`b/JQ$K2d5ގHu_iy歷fܴ#XtR0J9KvsВhGv%v>J]UFFLY ĝx%L".B֙ 6.|.l?؞ VL\^G}et^NhQ܅`IfL/WdobOmغt+]w`NDXW/&=Jz?*kt3=(ؼH(K%>lųE7Ed;>N/  Dv$?2w;dG՞m TL (䉛flGR4:+ KbȲ4(rg&K'JюEFw V;l+g~4Y6$Vtd:I9 WZjwٚŎMNIjv]fb&:1rR˺U]3_њ  -IC4M-r _Qo0 Nd!ɑJ1bע7}EZD2
&H!YL_G$7ɮYh&DI5i&)csIS|s=B@!IPP",VjT tV!D  I (TtD:]X۹R(&;UC" !0@1AP`"1npf3mO88qqێ8㛎Q1QZiqqaG4 -}Sbӧqg{%V&QQ8b;q:q9կ3x]DTQg't88qNj9Oc{:b{wB!*ǥ .㎔^gԲxQx%xCc5\ϫ>W}o iSYoCc<Hbx.ІݎGN'7x& &TDT<1x(f9C8CǛ1q2|?PH#|gs\D@)/J9TD\0[8j1# }.1_=c(d\CǼ\yÃ8(5w4ryWfPdEٱOb C(`09w\wgEn< -tg㥘'x uQYQLlC#0|gόvqȡ'|ŋn 4Q`C= q ,VE=ga9|ĦyKst`o0D+FB5½Yk}Do& -j: OQs<ouVӃ~DX1qC|jf AD(2\J3ǡrpR䢵1QRx^ ,%}ӆJ''ڨ`(n8S_, F`"Ƈ7u}]+x{O ("(/ T&R!w -jG(8,Yq4ij' lt<5Cq9١{>:xxoB֠Pj(v:  -,oˈE@(!BHb?SF8qPYo̿h*t6"ׅیқ'>͉҄_"60:<(*#b=,vXn\1fogXo`,ETXq -}gOCPjv|So?g!n:\9jjn<byF 0v!jJ:Ma:[iͻp^py /;q_xK!p'#8#4QR%Va0NjPMlֲj!tڣBDd`}7(D@5fvṼN - G a& <S\M7Q^0G%(!"83t"sqxq QdiEV&|9QCقh蝪7 x(1hG1pT y#53~:QYLA[ǒM -<c&8}#;8?J!SX.K?!#80";0X|Ϛ9@+}#3)Extgo`5FCq5Lt`yQw㌙1*3C4(B`8|" &n3"湣n8pXꂥi\wfAh?Hz(N@D!}HBMx74hE ?7[mh-MpYqkt㧙@Y9'c1~Ax`s3 B# = ۭ_8 -"ȈAPq!u 1?"c1NDE T#"3 0(@Lx3Jl! -S9|b*X(}^oB:JGc!fqB>3 ssx3M1ƌ(w - -jp`!"bR)B0oP0MӃTPfpBFf[C)AF.hTX(8x+1КFlagХsSSV~XSy -8 -#@bf(UH`F8ň t80W  E<gy{Y&ݩc*pF`FhMZ9y  vij5nhv<Z}:pMkc>b/ jj!`s>qNs6=c𤋮MZۏ3q0|;0Fc8o _~#E EqP|g'n TQ`7>'ϔyO͎uq́o 4T)EX~m`J,9|BWqO=@f< в FnG r-#aCo2lw= x:4rJ}^AZҎ1 /1hCJC?8#> |Qz9 qXf00 |X()EC«3t~!G9+fP ]َG6lCCV CCEx8s@x1DXEY>(:}OiێpS8 EaSg5!^o7XCYqUf<.G5<k'gQB/T`1o!B}7noM[?rw O g]_.;8q|>bx1ŘRCO1QEO5s|bhs~:CGx0 T8NH!1AQaq "02@PBR`rbp#3SCc ?"MQjsS0LE?O*E?ފb*W)E?OS)Ίr*sW)^r:)Z=fX1 5W5A4juL S?U@T%BT.PB PE PE PE PE PE PE PEQ?EPE PEPB~7hv4(_(_PEPE PEQ?EPE PE PE PE PEM? -{4\v҄Y/gz}j>{vW 7BcO}S)j5Rf@Z=Z=R<7j:}TU@4PE4Q3DBhLn*l -@@lh@&iQEtQEtQ3E4PE4VvhP:ȤrGJ'14 /Dnx6'DO1~'~'~7~iQEQECcT,BtVvhfn?Têi*uh+CtSN#NfTY,\5A}T*P -r((ݢ&v'p 5.w);N3|h*PGtzh#>j3Vv4z(#&4y 6& B Q%x'H2"қ^2=F/@ Q3jSا+@Z=L3ԯE4ê -+;U+;4Vvhf&hfh[h@*xGQE6&7EgEz+;4P1@PJaj#ފas5WuQ/hŠ(@&DУj&Y٢+34VfhVv}T>,}TGUQU1ڦ;ULvjvzE3Բ)^zWަzsN#Ei+HZ4Vjf:=QUsT 05QC'P*(r(((ݢ&;OwePE@S=TE3)U zFG`phQHR*Dp -P)JGS!@(BSaQQQEQGh1&7EtPy+\Jt -Y5OU ɯ`6*z&7E@cx. BqvG>;1w@85wiЍMl?d$Tj*i~p FתhMT#W<δ$鲷NN2Lx4Eڣ5VE?ҥp#+E<՝o(?w 0' |GSKTB -f߇3h3GҭRɪsW+(^.tiVʊcY8 M\T+Z}S Y#U7mCcAk(Ǝ^4 4MBLO5hEs@y'TK0>  t.'qܭqZVnTᱵ x8)/%Z jI_6;!O Ț;C. M3Vo)(pr!'LABLa$qrߊ5_ 41R -xV_ҧouhEIɣp#eڮ[S^vceʌ[cNKR7rVryl0 k\ǹ5ʅr sBm1USknt4gutBJe}*4V+SբR^3"NǿU6+Eή)L鏸 -xNwb,Ymmj5ኵ:Pv@q_? L=SRQ}N|OjQ`> 0^Vo5)Tֻ!4#;(;PS-=٘w9B<8rA$ (nnUCfި`xkbqAUnZGlţsuS*a,̦<6&]<TɅrWSMܥfZS۪>#(am'}Ph~xq}na퐗Vic< w s; X낳ˣ}*T^{<hm}U}T}D' χS -T*Cg]gp=4{iΪ4*/"jLv_eʽJ5#ޥc#ژ;WrqH@sQ=0XIvYZjd|f9'ӪЧ;(H|o0& -̢CuA(OE *lm@X1>EyLu2} ps9皕Z'9"&GԄ|F^䬷r(`ǭmys̊Wcƕ_NOxҞ#UF* QSW -xdttNș^4VI -c2)ᶭ9K Xi -3hp))f9jƵ%Uj>R5滻.,|uz --MNc|ԍ=hfmn>t9L_QyOy`v{ 0Ylsi= )ɢ>]S(jkk'&{y6]]eJMTnS\O%xa7\Oǜ,qj:#蜜h|5s[+&ytSJ?ILq9Jym)ד!~#\T.ǘ3v^{ 3L+0 Xèq5Gv|AT>Du)oڵM+JW̧qMFPT9+uGE>*A[/y*dzvkc! -+) -aWOp*UhlsG(.pִŠ'~UѢt_jwO}>Tv2Vq^<QBr JEJ2ޙ?BL sI;mZ0|YB?DtCg@QЏq4빣5U=,P0.B9\PWH'h: @%D8c 㢄ڨV+UGRzj8 -m}R}l+Mm8P/VvhoL`a+ޅwHq>#傟"2&;TJ2Y٪> A xej2 !ܕh8shѐˆփc]@7S$c?FpB)D:mD1n -udˢv%O)V>ptWShUU_DOPGRix?#Q/%Fu*3kQPe1BhSEh:+HIzuFJƊshʘC{ʵpSj(tJxm@ˊ UjUg82뇇ZV(z'>)9O's ~irO¹'-*Pj9+@#x !,)fiJB*:kD˴4QEZSh=U' a(xɠ0f&hO |c@gj+jZ~$pu&^GGD{9#^I͢s]{No:"Rso'(*_D8%Wp׎xQD7O/[ԃ</rtU -up@aLPmnHp9?-8IiVy| "IT;"] (|C 6HST껗Ujvqz((t,qޢngfkp*.1{pN:A~tM;&5R*NAJX-hFǏ̦`8f>U-GxXQ^!54;Aq;c2o ЄPO 1['<8rNǸ,x˜OvTo5;S9IE'uvQe`NJdrc6XN5%p΢<~㔥Ry٪T2";˂~1kx7IiD{r>?_ܥ<~_+?F#ZV{WoVJHr e8'~0hiTêLvyrЫڦԫ'wr: -un\>8n&mCsZZǂvͪ>QGVNmVZ7,Ab_g=e<!u"{U[5mG߭vE+O1 -M"~O t+Kx)ڎ)ռkx-|qZ -L -wuF f7 8<,ky:JO'>wrczysދG%G iNqVw9Kyf{vmS5 <3VjfQ&4?Eb -dn(?V9-s -ַJ79) iJ5`>JFV-woR(k-PR9<9 .P_ ئ 7V7V颮-ߩ -AFv{eR%7R -xxaJ?@Q^vU1*7tP4+T̯j.5LY咵6 - -@MSӏL&FcC$L9˽*)TxVW3^Ouj崽E֜Tn-qA¼QPkT1LSmOӻWp MQ\]ڠFњ`P_\'5_WGԢ>d'<|Fp?rAN>`_PSS)oE(Kv:ch+< _LvӵVЭuJH >{.vႊ2VvhjH HN4Q=MpNzt -/Mx՝5B>6x5>E O3/D3̜G\v3VDy#S|1"NL޹(Giʑo5X ŚYpq'R*Q']NRPuR;JE1R)R)RQh -o>m24{9)c =օH: Dhz,(:hR/h9*fOҁ]l!i/9YOD=S=H1B:+Gҭ>4S9|*Ҭ蠈ef`WonmiUzBi!W +ʁn٘VU?և^W~ -#];]‰5Q:xGRyUCc7Z9Sj[V譮OkvT -sVl+\t-K ‡_Lʉ733?ߚVu8a±WHVu6>,pSSSХJ!0QDy*@f˞iRtwgw" 䣫JS05|IY^91UsUVз/V\p~˅ -0@TiOc)#PMڼ>&EiB4bj8oѹW,Q/T/g"9'UwS{DdJy -G9pE=Ӊ -\>]HB8]VBF'@@+[oV+s4Vߒĭ}TmTmTmT}Sξ_c}ef0jK/xW%$y| -G\qq,sYTMJ|1&11&?PaBAB5P TUCPz}kyYL:OP sj?L%@(?ⱷӳ+ƞ+4{ߎpQ-}@ث(FYDloW,h -0ѢhM!PT>UC*U -JJ@>#Q sAR]ly}KnQ]S cEtQEtQ51(ۢ&Zj+;4VvhYڠjB~+A*OB:'835SG)Jv%'xG.oOorO5)TxfKy'.w4NJmS+%\Cn^-!E(rL5(rʆ'nU%kQxl(SK,T5o)xe]~W_ao6&t:)ح@~;jWwY uGXJd~$Q8_g/ "wTP2U`zVf5co̬CV64t8x()449YTQ!<ˆ0W~ -j?JY~c}]UU#7N0! -zyw;'+P4?nYxCwiʪGoW\+jiZ =Gu9Nb{Xkb1"q}5kkOqhE?T*o[U "pӲGƉ"Y{PUZh>'UU}ʚ} ->#FmktQ2v;ْ4S-ZޭObo[ÇH!HO:)q7KGhUy#Q8i,:pFDo=3_E}Á\撥z+KUaBc+G53 vhTj8}ּ<3@Ѫ}TꤛU,IRMmTj6j6IOTRK|˪E,Ρʾ*x+Ttu]mSXsUsx \> 3h V+H.F`EZQZAo!0u*pJ|8y{d!J)”SU;S 2:CZz -4sRs*F샒q.wz T3AHӻpChySUi#Tʣ +:N,+ZQ F; )zM -:`TI-~^\ Vo7U*;Rwx"謵eYUYzzq}T^= -W)SΨDb1c_f}5q}mB54B4&t9#|WWDL'U VUg&(YC1R)sBtFeSӎg8|pPUjU@5Qe1Ugwwhɧa|b(:HOwOVy)؇M 0_&w{,N~%?*; if-8]2xi<{x WUj Wu\TTAꦊ mB/rӳ%Ynh{qfҬюW(;2 -J&;LT4UU^׿=ޡ4&i -蠗EeV94VYtL<{ET沧.WCΣpJl%EZaTno=v0Yi`7 ZOrvƃ{ -UvB@ET#QEңTJP))"0^/| -"ܛMF7^P^N߇MWznfhTRSJgT) Op}ѵb} -| .>+u -r -RS様yZd8ĵJ?nzȿdWuS9`+54}զUKR7*^T⥼ +Njh?ޝZoTUh,BZ|02V`sZ>룊2QD "{pP TMPi;_A\KQC<ÒăMG=˽]ɷ\96sWOScOҟ{wވM}KxHQx`wic_05nr\:(_sƩאQ$ӠMvD@GsVYy5YzwJ}YO ֊op*+ U$_k? )ῼ(TRQ&x iҞ~nEz;<ײ.sNqEm}UY]Mq*7 )_˒>WtA)A)M*c~T1ʢP*EEP( - -m)wZQBҠjǢ' !{ 邉r/WUR)Ls@ׁLsP5ra -~Z -`5PnQ|Awv7s -.❇瓰QExnZs5S `8/R!W*'XHRˢF9UztV9iXe4VVIP=(q&DlKRFK5#ڞ4OOORz)DxmqCƨ5N?Z @⥩@uy)s b:)O Q%uLvU^SxN($ޘSǂs֋.xG Ǐ'tClzk,ta~I~Ji«?ẕަTJTLTJTIRJQ)TOTTT}Q*.>7yB|AwUhT]D ҡ2 _a< P3EA=!vS0D=u)Z=Z>hSև4~ -qhuT_{Uru OFs}[O/c -g -Y 1ĖZ >RfBϔ0 -ii#Æ"P1@=T Ы;OD*2;;6G UjUf=9/rVa UjUf\g .)m)h@R;TqN()YB}Ee;D#mhVuqST潟`]^Ry&H{+VA碾'|''wէSz 5F{Ć -PY>&#sZ(FxNģ {|qx@l ꊚ~A"QԄ(%{.*RkΩTtSs+JCOkƉoZSx(%gc V<+֬Q'VQI!qܜHqIƴY"2Ecʕ̮֨tO H详TjTgUFuQJ@T,BLnPn]tWNJW -6(iMVW0gkAՎ1ULE jcA璎 -pMOH;t]FNM-:JJ얜X|*R4%DmU (%YYfXX\'UbV1gf(o51:eJ5XS)|QJt)>I9+dkzNTJ -6:>*tU[[[`'&=Gvjw5 #Pi_|K5 #PyNjk= -s39 Ǐ.pqUpGSDD`@m!9HC5SU;uS)Jt*CsUk)rws@%д4MÀM~ÏEgDmFW8E |򢔦ՖƂȨ<ʳYwؘOE4M >Pgj?Y٢EffˎBG-WenyZxVP>;W_&U|+7Vo@mV6גJZ+SxW=0By>CT>@C)$Ep%m! -}\N]auM**/˲6 >[Hoz!/SSFODV`vu8F<%.>~4j3El+bk.~TLLomymmBsZ7)nV4(P)} -F1ܥ WR9Qjuz㪛Lq¦=*O2urƜԘS*lJ*GT:MT j{ti!>uLhu5o7#H/k0~OG0(<1k?UԡPDj8qz!|jV)ZtN:&(PKUBT=|zxS*¼>-nԕjh軃uI߰o=PGNj'̭2S}JOz~?EA(B5QP1(0ş}kM8و&T5S< <n)!BTnM#Ú*!P5 6EQ5Pq/58a{uWWk - - Q6mSfBoDٽfW_Tê2'H".'`&M2oE|~×iϯ%dph<lqou7}ey(:Sch+9boq8vc``(Nx` -bj7VFS -riQ?4Yu8i-O|47EbBWPiPD T-@Phh%yB;_:ѷ*7hv7hv"*"WuNjP=j'z"GERJ8ؽWNȧvEÐVZ|ӚS fE}9a6伖6 e ۪SYa>CJ'5@ShM쳽h)@>C:-#B"B(OT*UFU')J\v )3ΨP hR -WiTf,*`Ո+mVwU+BrCv [>oexs -*Uz!8[`O5a7S+)wܟt#R%JGR\9i sQ-mwt E$ZhLq漾ho-5n]0k៽tLv'hr~]i^QϧQ hRW9XJ%GtF~a Q{r0? hU4YpRɪ\vЩ} -W{S+mm DTkFt 1pS8WSkH7#\{DM7wεB*c*l 7yGhUh栻uB1"0iDfִ=`UoAǯ8&PZ#p#h:'<|R~?C -P(^?4%{=)flQz h; -v -s%Nq*Jsrx/ޞ;5Mq -P-)-aW ޿ QJ0M nT{gVWgyV9UVYwOEeEcXVItPv+*HrYg\HmVY E}3ڡO%? p -q%C/iQ'S -&$z禝TgUDuP T Q0y&yi4!UƵ~VVN;nEZC+^Z_AVH^=ՂN!Y<+#xQXX5Mݢotko^RM&_ԥ⧻S(B'{5-^ 'ޮa h -vT:A0}$ਫ਼RK~4Nֽ$"?&2Vդ+lj=hɃ͏Gk_eݢ("@5sTY{)Ozڭ+]wuw'pxfVU UUN»AP}B~Rp(=9[EjhV;B%L7`ry(Ƌ͸&fA]vWF8NJ4\TjpgRU+uVzSSLviRҼJUhUhU<2۹=΀)" $eCث@xSd+N#v hWǘƊqQMx84ܜiOKթN#[EϊyRIVg'&s [w;pYm*(ƉD68'TjTKTBǨܡP TBv"B{|O*igB)0@];pW^N꬏j`B*A"s]Dqxura]zyÒusA5>Q2R'׫TD+k06HtRB:>o)E?oݢ<^߽a^>I.$?;#6C4dMzlMtD.|'nJ+woP҉ qVvS5f9W?M?T*`)ƊoE+OziFu*%tP7E0x0")JaW 9+CTB)m=Ui(Hҫ]XjW^YsM{\UJ]TkݰT(Io&ygqKUeuRY>e5U@ƴVS;efw̬{F4ګ9YΪ'؊謧VO'U*J5f VvV&c*!=&_ˊXX̬,Y㶡 -,(lS;Mi=tVUf|5PzNro^2r4VR -.:9xϺU*He % .P9@uYx_Uf0YFȬA "+M&^BO& -12r"Bs`]LOq9|HZhh -_@*g~Gk4A -y7&4vM:Juv<2NEH}y(+` i*mmNN'*(-CG/S؟Zp^4;?)lxvEI }nϙZcZ#LЬ=`>LR7US9yqN4ShimGE?{U8E?hYUnS -z+GhJrVZr<~>徟kZ8J#T4 -0ƨzSwxUY̬UgnT Q>V7OU?Y7t8P::<@ݪq={\ ='| /im]De<$Q"8:)G'ޢ7:,E{#ң4 -(szxE}h)E8U QaIc*˟#M`A֜ -hLSBbhQt}TF2vNU;G*VjnLKSby:BE$Iz'8)FuQTGR:@v`o'Tbk՟(AT'*5_D)~7TaJSޯ4ߵWWJGSvw!;htlUQ1F!TT;3ኘcGFydLUT^OD])PS̕f²0p7hǿΊXG2YJST=#T P5YۢbYY44r4cO/pP*Q}< >S٫:Z#~JV\x7?|L2ǪǪqJ;v*+q>_VӧU/EbIA5t{V֏DdqG+SOE$'諎dÚBz<<3Vg-MZ]{+RT$q<|Fޠˊ?aV`V#oo/;ށ@A>ϊmV2:Jy]7w'ySi>!{F3 ,"R$S/ NA y{w-qR+&~iK1OvtR'zGS='DTGT>Jw?:|JOrܬEQxѯ*7y -+꣯QJApGAV+ɩ$Sk_SbN(#ǵhU;o*bq. -6'rRP +ﻆIybҧ7wp*'ygRӭEÎ:+7wc'Uz$VNx*N(z輨ΪR -h`LjaEC?s.uQs+y+g\ޝ^~TߥO$~tV^RlGQ~UF^e26ӆ$栏Ez(hPM:WVqJIÓYRRR}Ήq;qDR -yk9Ny9IDC --wz;BݑEuڕj:gVwuZPedqN.ʱ2\چw-ƙo܈ 8_*eH NCd۪KRiiS -EhǢ>{^#$kWz>i(/{kC˵Q1Y³5qm~$PwEgf?ң&z&  4G_ɑo4s㐜;5SU0RqLzUFsD)zB|F>`mX٪G47- ? vލw앵%$kNJm[e*"=džq'H+̨Bha=Oh?*/LyT'Ue ->UލR}JP9{~AGJ&UDW8e/R*RtG pV&wjجLn=PU<]Y* .#$;y?j8J6/wΈU4Q,Q%{^\qدBȼ/#/h.ŨNYSOf+CtV #lj.Bok5iyꀯUZ7{rRPħ7U8Q7c7bU⯫Fu(VCmr -j(UA)\0Pgj -Y1̭hpPG=&Eb(]Tnx,85}<6,D -TLJcGCQFZ_1V3W+S*VPZ=-]dZ|:cTאӚwAޚ׏yh޴S}EJ>bS)JA' U򨾕 QA_@*Gc׷Q*潛1Fk[ -1Yݼ)٪{_&_M2y[j;[G T^(}B)F?!a -$ -ܤ?2SO֏7S3J;Uh.#]ƒ5kmyKJƥǐVG%%lB(3x;B^Ӵ_MsO1vV^7ԬVq# . :} +y"QXY³S*Ӑi2?MUEDzO H#R63{¥_%=Vg r w [8".&ȣw#&cħw&H9-*/7Ѝ?P4! -ԖEz xn*RvWQhv"LWSئS)|1lVKU׸?w* -joT*I(pꙏ5-1HOwU!Z9<œHFrsM::mܚŚuGMHMw*Э5h+Oًy+BJv -q)Ɖi[ǻnj2Ny'8ppOuy㗏~ɥS]:T|vwvwkARiȒm(1 Go+l;B*؟eRw)S4$.O =5E/R#>炭Ə5sC ׉;׎aE ԨCB~7ud*H>8Ԕ:)4 -|.h*!ARxef5%4|1z(JC+')RU#Dv'&(v#!WTê7]Oj-sDK9?2LV^ꅃ Jx-ZDBthNꬂGJ -QpWFk<ʕo0㒽+ǂMf>f'iQD0Yƪ>eg2Tߏ㰑h`w(&;JtW^'|$~!urͭVM M)פ]oSiVttpT틈%[chWnr*UOW 1ªZ#;*׫QH+*'J)Ɖz#'QЪ08sVv)6Y -MCjeAXit]{x?($&cD/DDsq|^f FtP~O*,1ϻD0JԨj(ރfI#1LP6w][6{.֋xD$kJsٽU&Ĭ>J(T -V1c'U|X̅0*!@ -Nx^}x՟骳*mz6b;$N9)̤}oHOCP%pyqC1z*A݊Yd=zᵽ -c  *]J\S9潜2z<ח:4p5 #Gvx"zU0b(MO| -QEZqja_PT#)ziO ^Wj@,d9Zc<):$}IRJ+ԯO~ -5]UgjSpJS(S?F~DMPV;P TMP~G~7U'^0@GtTTqS3U35w(( {TêaGT^6](VIJ}Yѥѣ(?:{djF%W~m(O >4l -[GʭJ ^j'̕)T˷{Vp8k&I+34L Z+5?iQT2v k88rA1v -Ҫ^B裨8sٸҹu -"wvEѻ)]{;pﮫ/TLE)2ʠj90m!O^(!}Ff;?pQihQ6`S5KU϶sQ8y/uVXP>:vnoD ٸ2UʭOq6gD~쀥C5SNA5!Ч52v+½n|aO^ꋫd4PM)u*y)٪8vO+h#qqUYJmM00̀6{4vB%&4󢌇r0krvȋ˒m*pQ_i»annI5_R3=現 |A LH-ohAµHG@#<]hwrN -F5;T<街EgEe}yଞԯS1z+TyU tL <@FRF_ pJ{wjvj!ET^ETC{k9]&A6M\:_SWR*L:ԍ<.jxwb^T`v,Hy4a#};2>F-+I/ӅAoؖRScuZ~դaصBˢIZQiTTӃ7@NWܬUTqf!Jf=6xSꤡH8[5h)0$u*Rn@y&Dj_D\ToQFwDtRJS׷9/P TDo#6og0R)55Js셒c;اr*P+ 8VYy(Bm6`[UCAŊUf -* ?iA(}UR7kʩsLZzX1y$l$^Rp;G5i{%#E1.qS1;55p6Ki8Bu+xq_p{ܡWt<#JN 2UeΊ0+57rzҠp BOA]IwvcQ;Em:F;n:<դW|cm<}rAy&޳!qێh +T)#RwO5u!Rhʴ}eL>b~AJvh2@_7aQc^.Vs=Sڵީ1M@6cPx`nT#*2:4#-(@pQ})@SẠ^a^X PxozR3U+RVs$2DOQW8ݼ -gjEA{{ʿWOE{{ƴM7Z#5Upj'Ǫ5nDED UTLZ=BxrѪ\M: NZ#ŠƩZF4^O,V?PVϨ+Aq|nG"k 5_kN8WcS9"a#S)ƊoE#=FjUԩz U8 TS4DQZZ֊+<ԭ>{Nvp+@Z+@Kb\G$usFxkۋFУC{C J/PdͥXf!V8 -_{֩#0] T{moU{PjU9(QkIq>*V\B(ڐ+h(TE)OqL:|Dޞ#Ԯ&"(EDXWmEsO,NGoW21L_2H =nZE q -@YmܪP%b DӞ0W ? vo 2%jKiT TԴ-s8PUmZ+iOo &\xOm:Z<I۩S{ӚWUhf\Vj,ZYUrRқOt hZ)qiZJt*g7+C"TU 1pn䭣VM -z+Mݦ$ZS% h i"8+;4Vvh@mڦ]`AĩMP9;ĖN4RuP늳E G`T NT<'Y}jW'4*-PzZT@Ae,Q4gm -`juܬ&.ZN$&J<Ӎ[Z]Y^a qUfG]qm7+#Y9+ ڦ]<6欣PenoXWv7%IN%H !I6HD' S=E\xJڔéN1Y){7BUjhh嵁T#DΔV_@ƻaהd"'cSB iYƪ5Vqzn-ÙA W -5E|yd)Qk2 Z1Z's%C5UURIExG8QBxiBE{}>de8jևsG!]UހjV5Sɪs0(&y*4Ξ#) ܉=vq܀hLkGAҞ̼?2U aU0@^W*jʵ}e[O>4*4V h'`G$kd+J2PCOi5UsC^ -Q/rT YIo 1W*rLa*!ܔDk}SP -ZPcDMj RTѿurVR_.uV S9L+ԯOy#y5v0OMV{V@<;^4Ni*vRZOSGlޅJBl SHOTNP TCJ{lըЧcvSx`O ǂscoB&PO -û(W5F9m»uw~ۮ8ԣb\4ߒ{\9vIΘo*VיRpަjaOP2DӞ!GՑ@uz9'qOx$"ٙiL!5 Pu՞'aTޅ;Lz7Jemğd#t U*T8g"S;q%>?aA Cxq@P?9?1Ugp\>ϙ -`Vvh/*ѼZ7=r1e1M{$$&n֡Ztn4^ުCEzG|_ʴQڦLq%Yۇ"wmJLF[8 Ә/j;=JQK_=-UTE(g -h<6pWMpRPpIZ|??^\#5ÌG& Sb_dO:&14E!R;eGwP梻 / -{T.<jˏꪀjn+co @"QRP!"<]~MWh*(\>E A.o+ 軚NϲF(;?iL)۪7SU -RRBq'PӪ|ʔpqNޥx Sh_iʴL@.<!)tQ;Ey/I_ܨ%EOQQ]+o9C,@^Y~-E+y.8|c2ETWzxۛTWuOsw<_=]ڔeZGUjT -֛֭9 -{Q7WK^MoDZr ΧDBh=Tdt*2g]D QһVWjNNF3EtqQv@:@ L ;A<^+xH5R U?8kAqS.%8Zٮ»j()ߢ*Iq4ߴjwjZ7*sYԮKI?Yډ4ࣩ4Ck(iF8&ӽD{]ZS]M;^*X:VM.BV_T*SNNלFI}2ODhM{r#p92'-({RSSƪ3P(FEj1VU9QLUьtj5'މTԩ8St$EU -# -h_ĦT:M겊nP3~i>_ &+=p4ߜi@TV V-F_58HHcUxpPJԧRQwwB䤾߽e׌1Wq@<_v*w(C {Fށ+-Gq*ɮUQ 7СiW-x37s:]ƪV%iU|m2`BM$ _nG:(PɁnY4Sf@(̬YV?8Y5ƘUY?Uwժ;*@]PW{4_AV›ܨWS,a^_oi"QJ<?YOάqJÎ؄\|YYwUc?7Z'TJl(g*UP@z5Z4VnO+TeDTA%/r'ޞ9RF;Uj;5RIҭVVE5%P5籵 -@GHOU*ip5ׯŸ"|'ȋYuȨDuB Ve!P}2;~t% -E { i~EwE<œE{3}hy='s;t*֊V5mpw3?>;q;նU%m[cV0T(۩]U++[5 z+9YVOl/W,k(y2Տ -)%S mJRIi\FEObfWESp+US -V7 +Z(\7+3P1Qju<7ƪh;.vNC[}꺻K$>JZ-+ѧeEaV^eYn}=wVKO3Eg zt :DZԅ,#D -a/74?]w9S ފG&JcB)BAk7QJBF*O5sN܂JX'$mJHjgjyou!4%DO4j)EFj ;A}kpw -SH4z3oBcK֛tVyV9<ՌꬣQ<GE}%@.O|SU>$G';=Y]Q61or?8p㱷Uff6HwCg+۸#,N)8*8=sM0m`V9ߩZZYi\M RUQrP҅)v׆(8oYTB5U53z* 94Ҡ -]nkkJq>KȣCTh74mЫ@ʴ}e9#L;EAܭ-o+GҭJ+UG.@2זƁO!'ׂګܛU uJ*w -%`Dhp*~갲袀4IYE?MS.;xs׽^ʯҁ#?ss!k}*ՇO:Q6x83 {T -Mv⬪0+E:+A*ST_z^JrϢ͢LOVg7pTͧDꝕ|NƊH;ZF&T?IU>+D&#pU7'b5;5Ok=*T=校Z?\OU4Q17P@w|0âsn W0+J8T,\s;M q?:Z~?YV)px@S5Z4STpbR*_´+ԯSچDgPUSh ׂ6jMjߕYiaJ()&MNqNCO?콢p7tsYWN:#NvƧ'DWy*/RӻnMZT-=BgC*ろ6Z)VP!ܦlo[kr$A0%&h;<4wԾ}ǚm+J~Wku,TUܢ/VCTj@ -UJuO2#L*a>J2*y'Ej7+I+FW8EDtZGKRTj6 kUQS@V] -x?4歑["d20־,Wr:)Ίg"I<|p񂍧FКF60[Ǹfvt NxCVRqQ3w0և%>=qOXOw;rǪtz( E* ;#(L-st;#vM[]Lk\*USX$!F5Eg3o *Ho =T]?3iwas~Z!YtӲQk䇆(}T?E`ޤ+c~ei*WQϢ;?ڧ)OyP]xA2O*SR#_ڍ#')hRHMرPeY դj6D v@D])|N[M ZfGZjJ^|isMhE饁٭juNq#*|(w(ZѮn\6g T L`9e8VY٢hn;ZDNLM -Q~>]DGo2FWn[|CGҭ2)|mM=IDTeFpRj=䇻ƘuL:JԦb9K*;L(j`/HSҼ{11gJzU$>U'/3/#ӟ!j$k{ՎbgW+9q =U؇<_RޛX(8$$q4VXIKCId k'%#.Ol5%SوЄQ4 -GXAB&><UUF1P7D1ۖe'la:&֙IĔj{\p]ÓG};[b9'Q<'wo;ifvkI5܍1} -}b'.C2P]P6MBQBp'k`<܊UT.&&A(ZGPjZuVg;umg+ĊSi[=S4>%Фy< D"(L}S=E69!@*oDU|EgJثO kJ>JQ(m>#kS߳oQr(YmfNjUjUg0$CW^c!W ryLlЧ)NO_בNPmi 4=-…B7~# }hB -ЬW E @uPz?yǴiJMݡ@sk (6#qW:crh -;79[ʴ;Jlo__YHQau7G'Z\ze?:RTp"kXXNAYC(Y<@Uiʉ~InU^1EHS#U===LJ \2齆 }7M#^˰ƝL`?U+2\.ȅ?Jp0VgU^ 51ϧQY~p2*G3B(#pҜ7ϲ(;kB4FxY{OC5O spGM)N 2taV9zk|*EL$WML^j@?+A0j%FaTiZG̭H^T>!3D}52B*Q抵HW?ec$QmJAJ)~_DjvoVLtWRO -x  -IO|IS+[ AP}gN K# -h(QTވ0jSk -Uq݆HF=2w&P~SKjFjs;a{Es*'+Ո?LwȚWiUPy*PNS[1NhEh)Nm.sNJu2 j.CT>CT>04m {67h 2V6gki״3c]ƪnCV+UhM>%<ZLFSR*sUhLJ1\sAIP}CT")Z5a`cVv2#8DښCf6>vKF(NajX:88C5Vj,?%9'Tw^k\iԕ&d6p"Kvjl)Vl -fv -IUMx -5@CԨ}T>@ Q[]@a)r ڦYp8,+#$_Φʖ*r O$fy).sDK028U# -rQ5y!Y+ں+R0'P(~7xS>1*bz!^'x8TMUjBzm)L}0 -5Vf[Ug i+3tVp8"D{۸2jN,JG Xh -ss]$RN[qEOB'qVq -*5jvxqz"}{FꧏUiUiffk`Gͪrw.x4êTgRAw<$V`,&ؒiz"B|J~u/wzoOJ⢾F:qGsTJz);)*W\v$)h8k'}y~G;Sz)]T9)跚GR: EJ}NZ)}UT5PAoU:Gm`hR$j=& z.IVo/U)7?B7@8(Y 1hShE-8{A{H|Y:)ƪS+GԭQO{Nq[Cq*`yn\3x+mp*LZ5wE債)S//M790Qܻ璃EsQ;a;U+;4Vvhs Xvtr&zlgE^h)U&5 -2*w VE6<ԃ^q]ҹR3S- Hi k|rA^,~뷐Cl?iʴP\jUoV*,SÇ-0FNhbZR;Bkliq8wQU:UXV{YiVq4(98Q PIhX|?k5ARUx=}2Cj'(OȚGW֋>À4;cKNziD 1QH';DUُ@?˼GSȦ ܉]'xW% TT`A54'(Nlb+Wl J{OC2TAGF}B#e+u#dSM봾 '=q4I֊f_[)y,ٛӀNu? !=׷UJ6ZkN;@ 9E)ze+ljim?dU( F&m*ՍX=UP^`\1`UmO%?}mݧtdN)&}x^.>v^{r*Ww(VaOԬj5PSfs"Lnu>++SYVqIޭ8y&ѵMW%_{w0Cx(䲮v4!1); %t#i-NM%٧0 kxqMǎ]kcAC .S L@zY?IXh-\y$ɏr2&)+YK_5%XTLoW+LCp=>D*@tO*oT *W+3Q:'?OR?rk!Z:h⃛Oƒc!O+C>MSO}iY[+t"ȜM7ˈQqd {VP7fVUbn)Yf6ٯa+_wV5eVv\+(Vqeg*0;Mӿ-!K4DqQEq=j{lrV1cnЬYZhHaMahBw(mkƁa'>Rq=硪! )UNR\X'4ަT6lAE\M2pJy^nӒ5SSGA41%hc{0j#@ΊlOu@ٻżW?}UK5C}w*vةu!5eiE{ ݯw`vƋЂآb6ZKmw;[dVuV 9ckn3T%jw -P|cUǝd>x(ޮRꭚ5Oh>j7x-W7R=-R`wHR_e_hcoGG{SȕңF6~,ڹF~ThM>/z'<|lu8(LMTj-붝Wȋ.sdAڳi]v4hMbkfmdhneD^!8'Hᵽd480OQnM(JxL'J,7qRJ [l@8Q3zuZi'zAQ5Z3mc EC0?YƪϙvXkZWEeM{ -Pz'Ip鵕R.;VJ,)qzIr= 1qF -dT޽s<׷)δ3|VE?@OVv+2{|ʗJ|zzdhШC0*3z*sAuFY7 <ʋBjm>-JO5?QAU@[?3>JwܬBO507ك4;A+b)DCZkǧ+΁[&ZZ['ZWaMxu}d y& -.#Fnm^i/Wa3;actM2X2cB?{nRW*9JCԦM4괮e~OZ+8Yƪ&Q2=x/ff߇r\͹êaBB`=O ps ~O+CJ$4<µW8[[M'79{i.'*I! U5*wi^kD˴{uU51hb em,$êb(N35R+#P+G@/{>H1j) -[iJJlmU޿^9(uH=F鱭>I>*tRcP9SIHOM9 -Dl T7)+9w4 TqPbpxe1cS)ð Z v6kaW*}*C|%G.oۄxco@Y+@Z_֭* SdV5Ҝ;i>rXw,x#yO<V|LdگyK$ʮl=*bB2M r9皳9^iT4^;(|oU+5R3.(B0ZmduT;>]ƌ(&DExw{%PlE`֬`11m(8P9yjp - -9[_w4-ƯSx{W% 7x9\Ԩ)˰vvAY⾘\]<nTGRkD˴4Cq;sY)N]J֪kײ@2N.;%v9#^Q G;gAFqC~NxklYF&#c~A] \ե譯VSU5|y(UGwʟʟU~UU_w -?R4êmpXE cEFU " &a%Myh%JЫDکeH$YMf֢73'I/L:Ϊis_g+ZLp-ʩ -n=kNc.<ՑBE8 -{%YTnj) -镧W?)J׍vVkRB Z}TnHE#Ԓ'?#A Qէ1UcXgh -79&oq -v'[2 ;0}nhGhIUjoJe<?T"Ut@?J=p94*&9{ѩ-QqE 9éPy1%DړQ -ʎIDz+cP燏98Z]_™wrSQƽG$ -5 9;B*y -6*sM& Ԩ}JgjW,*Zxn)pԠZ7m+0"+ĕ?U)n*1hS+Oҭ܏ =m -&hvB< ZʛЧTVPyǵ+dګ]VV#2(^kΟAʪ"~"65 -) _=֎Ή1PT~D, -V%|\TT))gL}UEw{Ȫ0 - -9 aw=F' -4-:P9YUGt = F xR7p<_4s<+i HxW0*9ޅcxÒȬR 'm*2׹7E7V&ӪyGwǖҏ`xOn¾DO-4ޭLVcUM~=L.UPzgj\`l~@mAw${1ڌ]G!J_Dw:&=6EA@S+TǠۖwBf"UZIPPS;2 ue;O:C>dC54?)C˶ -Gbzmñbck}l^-TMhd} ƶ[ΊU[+l[ծU#b7̭תJ<ծ_4Gȋ%(Ew`TkQ6'-QB4 kjkEuSE,A`1^#q\܏T|20xv9JԨT>:;wUP3EgEgD Sbh䦾 NRީ=SiTG ORo)?f= Rɪԅluy9Ju>iD(ΥD*Zly+D.i춵4TTq;#ŝVVj,LEW.^pNA{{,΅Jt)ODp?/PTU-U V_4qFԝowBRhB'^u1;{VU+BOo'UV+KUh~wpl$Q=Br2ޠւP4;kpBO'bQ;]qcɨA9hyΘ'H8n(?T]Vwvu#$,YE88R0Z Vwv{T8C5Vim4ġ5q.77 o HvJzrSk+(ЅgQ)ZfeeTLUۊvA>*-Qy|R1ABUׂbnRiʋ[uLnȢwȢYݚv~`YRqSt%ZT׹m}1Vօnj+{tV^OHދe;U5u\4Vjm;*ƬXUT ݆_z8@?gmxD@k(E_W -xEJl}M7%1wb P5@?gfPv<Ir$owQvҬPӡWڦr#jOTAd"Ga=LTꧏTnJSzòaGuߐX7 %g=Si60Sz)/mopͲx;ݩk4R -)]]v|劽z+W\軵5sJ!隊w#RE.$SI=z#"wt}ݭ2FIV|fn,{%DBhM 2*=T,ZYumЭDj|}E>5MǑ -_%f#Dav7XzTfZ >EwcUAA"=.9iBX_ꬎYI&]>+j>7  2"9*yvNeثՌ'ԬtBbb#opDH-+.U$ V:'Tx[Y v/J?<ψOʪ~d^Be -LgTLꃵEnM9+ڦΫ?2QI)2sOX *Bm$)K)Mk. =qKݾS:@uuR54ĩN3M)ڥX7+:!ЧVq99 -fNLxgf==`;F/!8'{OyuqJ'w)Zh=';HwN>Kܚ@W+ފ -}MtJ)QnzZ9mih:PGNVvh`=ӱ=W^zsiϲ<&OkٖrNLꍶƎJl?*Z/r]楿{ot@ߖтwf -0f&׵uqS6e=Qqp,*C5S7R^0ِAq{a/=h`uz4NVFjРm:evJZrk5S sy-Z*ii:R`6+x4bwB6eؐ8pQd'LDjKFM } qhNP+뜊vm)R=eǵJLE(&E.ZM1Y%Ȭr+V#ᵱ!LmR*}2.״ c:;*]er1R}AZ*̂8m}㻦Hpݴ6CyT -fЫEGN̮w-ݗU=ӟn״槏Uj4hrosj3TNhw4TuB -_E!<ȩ ;n-Q<OU*@|Xc{?7Z\HC3 sOzsӞĊf0V;k;*Gtq1x^w_EtM -+4jQx Kxف)k]AKWLi -lwR vuLyr`w5g)P}Y~K]rʐQ<5?Ԛ_C>p{@w):cT^j=SRo2\9_})OVKvޥ8~-"hw"}$Ql 8!N)VhBGTWzzl*TفsiTKuL:Ϊ3N&qf*Iw=i;A-OxnmkPVG!Vbwk;0*FIo R[w' -%9Rf>,:`& -,H;UET^ip*V5hoJϰCLtOqOv؄9܂N*sDgj++'VOBQ1Y:v8!@r^ꍔ=|F'˜%wM1#mpM:JKt -P3DG%tOzɢZWvg7a kil -[T۔›ZqE7{TaSlx<|Բj5RaLv}j4ǚn {bqcSBcEvGehS5C5N7UF~ EOWb2e½y h.<ղ[ߩZfI)l7ޛ"l7OV -w3ZZtQzdwE(RSS3Tv9(AL~?r8Ξvec -+@0Un.^ۧ2=Sk>Ugv+,gS5p8WFGU.Fڧ;7>7pQ&KӌT-D,Qs^q۱B*ǟn+橴/V*60&}ciA Q%OFYx]C ^uvͅ8cW=ViUd0 465v=xʭ9,F hf;rSK:|m;Rx襠西#S4%!FuQ"qA4B`zui.d3ak.e`ǴT`F:'ʟOjS#QċDzx4yC5V -T[EnYmFNmQ[ᶂΦ%Ph=?:{3r_Q>B?ryMo4}wT+CW{})]8^zNX7 N0*+'~V:^0P*m<7.3G^5_cU0nEIާ(lv{#qۈUdey⻯ᣚe'Us6@2<ա*_2{E\VOIi5n`xт#Q~]+ƝDrʹ)<ӃߺꞗwWr0;rD5DपYΪ;/+1EBӂtQ7D -!]G]ՖJ,SfSkZmȅ tP3EtM&)]UxW5VE%Y&n>An%f ,P7(ݓi Lw+!G=.$)ܥjiT(v\SR(6x+OX UgL&? GQQuPJe+UZn 轪b]ܦIHNjU=Tsm4STJB|&FKpcEcXdV9U8d1cE;?y3J54Wa2Ipm;xO'tL#KIh~Z):Xn]a -4(Egn!)R5ޅISGB?E -Lu@QiDjT4Sq3WG5#uR3U35S3TGSzj;٢U|ʮa%j&)^*@ CVg?c){[=iW)zTn?ïF8thBo8Q6&*-oAsRJG)|:5]˰K |_l7y=3X>W -@#eq5aNR+CՀ5bZ;ޭ-jyC\ObO4êTGR*:(2W -l WH岾HsG^*epb62J29 -N{a -5RΪJvגs@8*T$"f0!2pCCEuQSoU@!@,=9l;PW#D4Q(&|!܎#QSlSl:l?*#8=E>'Ȭ$LG'6/ͯ;F9!Ƽ {irXXUkp :'Wp*YuR˪]SH{%nv{0ܭr꥓T`mqᶸI3{!g`K 6:n0uS؝qXr Mdv){te;6OrLDz(cSk_¥j^o)OC~^ԂDJ=T_g`k%C\gexlz4a\ToE+R;Ejp›rd9VO7qlL8`(GJ_& 2;|>̫V[_h;AIuLШƉFiUiPŸAZ_[zRx֜F -)R4حzǽLp'hȴi7u< <' M^* -װ BLFz~m Wh&O=7dtIiGT_NUO#JQs^;3O>(4a%h+<@2όg;duXq䋁F׆hq^۟ @<{1qڨgk~0kq1wx0[ր7vi^hS1TsjIkLzMr x*c欎XOԠ,؎7 ̫)u>vև*)PaYO̬Q)%;<MTSމ<e?24*Ƭqڙsر; &A(Qa.[OU!ْ:)^zC -TWfEET>X* Z(Ɗ1&N<l #ZyL2P4OTB:#Q]6՞J}JuPR;YY(> ^wjoʡnˮD;sO0PRk]96Aty&I*(1B˻YYDo0&'4j[ܨۚjBZY+K5RD0]Z"E9+DƝ@(Wvɢ2hvF܊uӿ'kcx';E#h%c:V_8TaJKZ~~[OkM^B LljۑWaԨJ&[ZT5JZz?QSWW@ -=S.?o)OS;2\}hQ\VJ|¶+a>JEh8mcVVU5i5Q?PAGwϳ-(wF^Mwu*_ڬފZ()TުK#i5iEZ~GRʐ] -4Ӫc`)څaP5BGb:=PBB;챵fh -6ڧէ}hfhhC%hNEdhRעTI -D!jE!SԎAeP ?MNJ#SڈDvlAA6 D"ڤnVj)TD])QDPTMA+')RHQ0D֍D{d <]999wDa0sLiMh*!E0hP7UQ([ j0j`M +"4D'1S1S1R)RU+R;T|FA63G1N25^ - OJpR Y"Gq( !!8' S6vڧ -mΉhzcOP VqUD ЈN -R*GjSν>jQ5:G‘bCFшA 8'=H;5SU;5SNDhtE+NP@VqUZbc \+)=˜~W~WvNWhm jR% JST! J&8@NE!O:g1yv65D)٪ڧ -oE/{W^ר\:?@5P ShR)ܦ~g~W~Ģrgnh Pc-xE=LTI_$UBZfVjUA>6 jfڥOMzB R;TI}C,!1AQaq 0@P`p?!DP^~vJ819~|Ɯ;i!ڟE')&9RcgpA29a?ۂi^v}iaBaF=.0"~?X?L_p')?ƌGgs87𕿑?b'ZkG})*_u|0^%B{'aJrigs> g29^?~L"Z|Z{n?l[ÎA)(Q -ڷ,0S%TV5xU6Zx4 Qo9F #._hk<3k)7b -])D!vYPcN z51ŹzKt)fT&?KSKe/Iel9feZr(o r-\ۛ.AGm2&c7뎫:Ρ uAFV%1VZ2G(C q{x*wƂ:|.(!E ji}S%y)Z 3ipjk˵Lx3cE_4)Nϴod_/d:h/dӤ{A_%fSg͚;aʯdjmSXEw/4ԧC9ݗ:),0v՟ք㱀s (%OgQ -u΢tnL<)3.c5-sLk?bI58 ~[-'s|W-.\[--sδ'Ru{Qn$u< 'ZvBAȝ"a8} [KtڗN:$ggcoR<-hMm秤Va!#Z%iwEߕ?g݊h^IˉI~ ϟٛ-1~#({n )8b _:r~?|ȊoS>;^?H.o?ϝ%:{T%<-t"53M> Ex ^<+Ub/<0WaXZ*b -ѯY*hsj];yNtC-bQYupm,n\*虣{٢|u'= 5_!!& &p4SԿ>xDIhr"]tKy˗c٬O"平vrY'_/zzKc.s5%M33HYw;dtO(=' ?OK<Alt+b#W?c3ڼgd?XJ+lVKvd~I YH8;u'? qQ f5'_cN9~%~ys?EKb1ly*SLz? %Qߴ'+ϴF:io h~mHΝVu7Bj}cRrS=d~y~XO~-}`nNXu O^[3/|ϕ -( :oa^f~{ -&'βuz'Q: o՝ge%᱘ ,`#(o*$#R'^a=& Z[uX ̝t(3pU_,8[q> +Rp<_~?ǔ~ ŏ? xrx<|ox~ -rncrE#xϟ+xW\/~+x_o Nǒyįʟ|l,ӍTgOrSKTǐP'!zۤ9Jc:Q^e -U8I`'-tGkHV/D sg^*_ r>#>[_ =yr<1y+x'ヷ - |H&5>3112Ǥ}w; B / -y:QfR=,7o/.q|17%E)v%|e )W@ki5r]`hi/r\NM^<*bQ)Wzs݈W@Xԯ J3g0{Μy Ϗ/I|zprJ2ˊHpφ\i1Yaa ;Q?_I^Jm261(J6̹ɄyY ZBn#ޘfjUJ˟e\U´OXc18)pq/ɚ%.֡&)lGX&EC6h8BV ~M%CyYK5 ׍awk$r7IRB -^ QTI;d\KDR>٫(Tc\/J\A|u#p4R:Gv;ȸpg6]Ǡ2Ko,kj@!;FU9iTa%[bwW17Vr -;{CE 8mp:^:T2l W .^Qm[ʼn50!q@aguolciV~R[r,ơ]7oS˟Wq-o92,mֈ"J_j-X0eR~ert$ћ#3;I Zr!Sh :KZSjMs%(_0mRҶ‘&'&c -9h|󗤡h].;Hr'U+Ht⾾5v'5Z_D<pzJ 7cPiY˩n.!L7 jS$ E\-W^,S -, ^ *?3׆D\@305>wbQlL^cf_qoAWۡy.WBuM3qXƥ娘)&rO:*sR׽I8Na/hw͂b)]wri ׬@%V=%F_(f YKc C{B.xTS -J'=fZ($h!6GWòUKf?_[1/(ҥ̫jxgt1`dVv@Щ_f^v4|`xRv8 (_D S)֩6NnqmM A.!H7F-*j2yg.t.993l(1^n2 mռ^V:`R5GqAZw\R6kiżSՃɠO)^IIyWiTρ<7-3f\iC~z-(("991Hnҳv5%*K35+ 95S+gIR(Yj>!A:xX1;WG6HnڬsieAp_yG)І̮ӸY)FjGQ9~N>:@ehgAĖwA -UUSg(BIPhe|p9Z`)M@FƎ˴ex[ n6e[>N?>N?6)t _Xmb]9ӝt.*iǎQ3g߄?W5JJh,z&Vc;J8 -M&:vpE:E> bJ!ў|]JDMg Dab!!S5*_i>䁗[k CZN:S;ඤSmbjq.Ĥ/Moׂ牿 -`-¨YiEO'+`t{ӋP' YLv%`s.S&I乨Ф|ozBzFppprMSZL+Ej'9H^ t7^g]\W2o2ܦ|[5Y [K>2{Z\e[uu_.,6&_7fŵ,b>zp×cQzSIE%) wNز7Gg4%n俬WAbѵSFdsϗ{[;\ʿ3{?i_sgyn7=v%p5LӬt^]0序%oN]>,/Hyg`hf\=HlM .]]fj+o۞ Gr19ɣFO r _Rsi z"u1 }H^̍C <36_2)nG\࿸ekQMgʸ -:+0!ނ}SKǺ0xp\vf)9t©S ֘lux߾/,`hoR4D5&~i_Oz ܚ9_q/'*i~B |DO[/y_C:us]h&8かݜƵ4ӹ[1U Wn"G5%7՗9=P^"TBMGHp#,Ȧs D %g5 nƦ=hFy6PO|DLtD.Xg#AЖg#deÜ""\^k/ǨmhxmWBZki-V5;9jx4p8iZKU)z0#5p EY(f^W ϫ0` a̧iM:"`ij^U_Jrs KbJn''eH>_P2ק`g)(Qű}fzw̧oqG&?? F.RkbZ7Ӆy'ZBmNU%_K-bK!f%tEO=n u2:Q2855zd^68qW܋}/h AUAL LN^ݯ4E/m-0,gה QeˀNGUsoWf1t1;)ŤӞ ~mUKS ~>T89@}q -uˮV3s_1psΤќ(s4PMJz{O&(/|<3f׋F.&sD@9x/ȫ Q}& -s].I>`of?y-%$^!j|'=`YPal?d/5eM'G;RHvo=@!, @]P#׼a[YjG#C[oU塗\AC;w: U W 6`5^zuj5-\}Ԙ E46ބսW7&s[Vb _KS f/"eIMO7Ћx =h[> QE-n*GegQ3E:cͰHhu}zf0:/SFvt$:6]7d!ɲ{k <)yPÚG H'(kǯ~i'A8;SU-/2wlFjR - 7_dq?p 4.wWGv_Vڒ<X'3S:r(_^Ŀ/d^\X~Q T{E '(QBuY!7&i֛ V$gPaEH5!ό ,tcw<$٥iũ&Hv]^>{SUؠz={ -CñẎ.t[e;Jo2Z4|x[ q%);^]Ffsm+ne8偼%#I8J9k$}X2Wp/f#bm8oܵ\ex@q>SU~U)º|.?S6x*j31m/Ù$40F?S8?hy'\ʂ37ڏNhnh9ZRY]ʈE|&F8$\Jt\,ݬ(W4`F2f 1PuW!ޜ?140_~S[HچoփJNX7_$[خU /2Q{wXv4pNzT_K(DNT VpTMSFxT[As6CR訪%#F@!B*3T MU׌sKTI^|8>:Ҩ2,nDpyO}u| (i -NۙPJͯu&"22rDө -oj(4Y#^üԎ !\^rCHjMMk; 3ޣUPa<.E`U8PS\GWy^C*kdK%+~d."6j&6]~/p cٰ1aZ]*EMm-m.P\wNmn ٭Pih&]x=B=`20&EÎ&V%Fhz;ܱͨa`0.2Q Aw3FXԳNN}J,US, m7_-}幻u>kF7l::{yԘj oCXx/[G\3Wx9u&O[DʜIK$a^(=s-4 1eT陇5% o暉Fb2T%UP*úrz”-CʷoK}~ CfH{M8:R[ QSԩ4ע0K3.D iַG&=J'mo/jZU~]{nsjǖl 3)ԍT7-%pn5TvC9$B߶%.KIvBL@SJ^%@ -u[MTZ09jP@d;ưA_~E|PQ<^]فv;0j8WۚKRwzC]#b:D({ [J'fԚ&X/_I~xE郂XRptw&_^$) sȹbmO#l  -~uy?q6E|xx<@7uP\(U@6b2\U{Q% -Ҹ |d|6wՇ[2n0 -5Y`"vE7Kd[m|㢽ۺx/G.L%fm2vS)7rf\<Ŗ\ K}#tV <8)̯ydV͕X91b{Jde沼NoEN^ -э}m[Pv8?fe3O 3x QtM\ANI+L,_Hިi7ڀsMB9&HkqAkFj覓 OC=a Jl!0% |cWTkQovv#/jUk<:i>@\/IGfSOCs9 )3yRu{;A5LBpUzef; qS(,6DML%Q?DO'H=}N x&wHwbkl]URKsdpݿC +R\nPz1f,¸Z}A:Qn|sb15ZPiJr'NI }/) ǩ|9] rzr~  Z"JQ-|Tz] j+_uݒdF/a9 ha:s97q ܎77Ȩh6n4%K8x(g51)6Awy믩"YAWSع2g#gԖ@p(~q@v,bu\|)xO3Vf-: {c枱T[^.4Nݺ>S -1vE}JL_Pm)A_%59Dwf7c> B i)OD;p{m`%|y7Ws]c{3;>b]ݐü:|F}% -k78/KQYuy:񯏯xi/ O~OգF U#39c W%g -du_dy&avmSuTͼaTv5pFN|xHDVqDo:~ -<ʯe9戟Uq}:bE~+Y 7Kj\2kb!X=5tʾ oj`7ZPW&:@W|A'CdVza^3]#&yk 03jptfQxH^rR} mtJ05KvW4CnTx;Y;ϜM{[";AP{?DI1lp3iI~2NKv/h_i昶/'?Ȣ!`<=[ɨO=[8D~K29oOR-j.!z}ЍgRs%%-_ 6oyQ@h4VXgO˘uKƃ/U u t-a  9D;M='d)s Y錿0t߆#WC -v`f1RkDIך^ftDzr.Z:B| 41k77xCV6Ъ;gWikCKIn -I?*iMcÓ5.qCPW֎Q2o,ޞgJEMP``_'D!¦/LPmה|O;h^DXG+B8W& iU튇r%W;0o2s;vf#|培񺯗DyW'￉7\Ep~9+ȿ ZXL~_T ʚPd%Wuv\ś蚯24}&n* ;Y|[zZn&LP mg0, ȨW .h^XRR.0>%-^?.Rɩ/ /-eW%j k@Ayh,p. -HIiz#7ҥ7(] -͛%Oh 3ZLX+T(ZeZZp=gta[:Ko jc}Sf"SLs*$4\+ -fo#; 3 -g   xB5Zxjg>,1Ua\.J!; 5yhq†s_W~6<Oo'W:nhm_jeRa[VHU-s v!kQSdW)k3yA{yfeoRXKTue~{Lyf`؞m8WQxEzެD2i _^PˠmmAm2SXPnN=2A#IP+4msN$60 .;LZ\EO5T<&g"M3aVy\uK{{;[<}*QZ___CXNLZNt'BtB iYZW -Y^iP -PO;m_(*g UGBZ-nRg"|;F+SH X>7K5Yr=૴h|kީFI[Ɵw} -Ď(&z£ȁGM{yZDfx]^o˒*NabVbc톹ВY? rs.2P/&|`X%ǚ50Wtt>wws'9,E}*ݞM?i,"V+FRn$jmYcݣ;H -q?2W%T [PTY῝\o}dbt9R=nMMB-EYUG1 -ٺMĻbSs/(%/] -ٕ1Q ^ Hw箨t,&C6Ž/R`4< -^'jXGG?CK7!gz=q#G{Um| - wPsBk򘍷ű6g>H :8 hUX4ѿ9'0mZ~.LsBV/ծwBWMtdmʾmQ,F/ -il:xAr:Cikַ|ֈ>ujs|<-$ڰ|VI(ۆ|Do]>_閍}Jy?OOĸ˦vGD~hw"[KҪE*O*ꕯ+È5ԂS_g|.}~>ZPhJriR;'<-r yjB`v\"V#3'KoO &sw}{ZSl^#M&w'+*N) u|x E9OMD /)" yU2ΪDj xp'TTq4@bNԑٚbq-d[w/U^藃p'岞笫A2ݍhy$8 +1K+JS]PD;&W3_OhGP=#hJ -CYڏ'gYW(v;3c +x6b,^G60W6w“z~oI/h.Sgefډϼ+!y%XU -ir~S(>5>Еʏ;= -!@r^O^|O"W~=]u/ -e饔1|Icfg56NtwWfh8lq )[@u{}πX}4x[EBxyx\diQ+C[`ЛkҨp Ī˧x gPwe*xeʾ9,5jb #`v'67๯O#X RWiP%cBF:Ϊb.硎2TJfnw2ЫIR@D:݃԰hY f?Hk8Vc-`ІA`Qu:Ej2CdZߛ|p`WdHramзb'8CF~'ΈoNG-]m߾s;6吇ߊ֞{u{DU5?r/vs)AOT:mH+#3wEta9Fk%}K7_ 3/(p#Hd-n9Hṷ_C+4DۡA(Xhlko}z@#⩤tUÔEɬ=')G/+Ez>] -n%/o=~}Xw/_MʧȖDoH!iMP_ԋ{q7Bi֦:})ϞMTXҬSUOon{NpK]ja!A&;:kM~nv ` ylft9l- 8/)3t=_ѥNMjp_S )ni+ -q~9iMf3y_ELF147&PR5Q1uaE&aHv9نj-׃Ӆ=cT_/CO,fY7t)+oT3 -mbPHA>hD@n,L{%1|U*Im|߂c|c$/A ˼@%`$\LÓJ͗M"ԕ47 wO+~Y#/ V]Osirܿ@`?1@esFf49mW/q_s:e<Nn\&.6Q33+)\iуq1|#YX>K&fZ`Yg\ )I)N<04 u|iC,QÏO"Dcxz^es şpk%[(sq)N5#m}Q~a|8=>_H5_?O' ~?p'U@7p'wpt(}MRA&,}%rsDI'hLk -R)vQB19KWJ㬢67trsAdzBɊ{2XWj:01_:!V -4Z.<^Z֭´ES2%k:ա4j,G+w_8.#F7,k QŨG-^ɥªH:\A\V*rb>{}NLyrٖ&Z;-^ jOJ1c)s:,rʾrw9~iUkr.IϧXTԔ72tSxciNP3*yxvUIwdH/cټRsCART/:O9Ϥ&4!ko2ҏ8 3UwywKG\p{OLk4AGywWuz`yX;v_FhF\x˅q|6Os?>7"GJGx~ M8Nue"c|wC W0uuU -+=F -XK ln~؈׿0:g)Y+TW-M#\r.53LZnW؛ݼޙ^5jxȗEٕMyx90ΆW4˂oMܡDk5XeɾpU"Mt[j!v=1db<݈׾Ow 0*4w3yCOTɔ5>2Yp߈p=_9;P_z%hlQ/xyǓKYL)译ȶ'$+ia/: %dcU#M=}t9SNXTᏌ _xg{/ySV}PyY_Af\ -I6Or&5%Σ3:NfQ2@t&kTB ЊbfeߖŴuu7Q9lSKc^z+6ku;YAFhnΩƬ:sidޅng啀'shrYord^' ~|xQ=#Unڼ(\k~6y$71`(6yK]qS~KXVWTF@bF+VNK' -jD:y{̮Oߘy[On Y /lϑgӟ?qtr}7v"!֛a,Á8MwXE] ^AKG}c==28 4 CA%nCs6?YK>"P6GS?Gmg\$.Ӭ%ҟl2龱OOD NU}ғ^pIן?m6V05Wy+)P1L􇹊ObyhP|#b_ʮ&]ZdN">I]j{"Ai5K긥? {DJ2.i2 3;__ 7KY*^rTzΠb9be>u -pa]pD㧌!n~n\򷁶w#̑ Y=u+"KTcv=?ԅ)7Zk0aC&n?)1 |;xH__UAw~Ө{?o*ktf8;S2';ڒ̬ڼ):J@?$\_Db+]?,`+C^ wb;6<3HC٘31zwAԈ-snK VTeu򙻎W<sN:W5*&(hmx$)Х}ny|C`z tב? \Z_tNV<(6-k7gﴩ5h0<_&Mny,+@#Fhxvy R:.ٝG7qL'KʖiNS ځ&O{isP4ИRp† [eᒊY1: -̈́Rx, RC`D?4.376<(TPcy^̒ HWѽ.* S9ޓPs@V+1+h[Y柛'єWYNN_.[+jlj =bY,[R)u:n4o#9eѯ|h93(3:@S5v!,H'f|UV2h,vXVۣt3; y0B~B Okhu_vׂvrO ^>7,It_A0Ov.h ?KqML7|kb&2^8Y9{]pk>W,FEC^(QbrK6D~~%ZBᅵιFMBgQ~fAC&oǢzP5,Ʉ$j? (0u0|uv4~i°4V!Z(a -l7o ׳޿R \@FUs.GVry@Y(h>dnXD$7VcR5+-Oع8p60ӟi~.iњ淥X]/q{3$4XjZb[KolZCi}8ԯb="7NR&7]G\+w2rV-vVL3+\;:l>mڨ(8(\34_Ɋ/_.<Àxɳy6Onϴ ˴NwCnJQɝ~ [ rlǃ5[C ZBWd}]:e* Ew[* srJzk%tc ߄vCS;OZ+uT,>ɓgiSm peYg!O\!npBѻ_,e]u V4hl_"K3 . [wʠ;ۄ{ x_`uBLئi*T.~?%/dk\;v s? hx~/Wt>Xş%I|㿘hA-pQN Y/$Ε~WoFePy'.^!!NjRw'Ƽ7ċC)z2'R/)f $aZlqYy{q%rx(m?Okp/'Uz'_쎣>zI駣Γ:?|̧Åh'Z;Ghbtuj0"&sa 5"n !>-`ΦX>xn/kFw0eFb`şK8tvpF v(>7ֆsKMuUJSƼu1 -@CAcfeENE םm1Ǽa/̰JDr1^; -XKi;5߱\Na]= -eũTׂg:b`la?bWu}?y9cpt -jn),|C&^Q -N̴6?o&{LU2Mx߇Oi+8\6t͆x|K-;Z/5_-Y}ٚ:>CxxCyJ?, {t}{G>U xq+5 wb >EqKXn} _Ho|kZwg .ar0Ņ؀[<|Uu;ARVmW-\O'X|m!yeÌMDzQs?W~&O'W+l?7wׁN6 -̖=y -?O q6:N<(ji A\S1kݬ x~$fg-I,tnNEd [8QTu} j{'"ǖ'>o'jJlNKN߱J<XXݷKsoйՇ)*w‚ʁ5G9p3?>o?}'YV<3?T82} Yޟ~Lq~UBsVhijȇ -GC^}YYhhAo{!.oPѥ6:2FYݐ(^͹&݃\J>? =f0" W)*W§Ɗ(xEFX0FVa:dհ[Trh˨yt3Z13^AAJ|^4$Iy *V-kxo(tWPуtuw|o;fwDԨM2봡a8{yxfXyJHkz 12O5G E/L |-S8>.YlsR~/w}1&yI3쯴eL(~ 9oBeOj;sgý[sѶ=^uQuzxӥ*ORzjXE_ϑ\kɿNe!7xfy}}~x4&yڿ?)l}RWK n{Ě/YU?cA~$өs%xcZj_R F,Rߜ4P)؋=^>7Hjaw 2&@8ǃٽ@1'Dfy|B7#󙫨{S bsJ]8X]}RpY(=s8NjVr,t.=~τd"R"ˣ+.woXNH]p t،|*k t* lRe#U=@FQ*g ӧ(*~; c㟌?^<=7d<_N"c׍1GO ?-G~tJ3cF!T)aqEr7xj+hX3H_(ص&!+ y.c 7$w+`eCΌp__?MzTϠ_&1XoCS4YrR$X9+_q~8\~; 'o7a(_[z#׾S|H8>E.[mt؝Nz)?Пҕ#B>8J|k6J!v|`tGk[<P_8鵌%3 ]hm˭)w$iGi #{0~9g)_fZ%L2mu>[pހXxlPKk/`HG,GW7&61J),Û+É,]cm TsA-0fPܴssD0` qCy{h36t@+c -Ii] R#%zLu4?; .]î,8\X@K>rЖ`u*m>|_%m=]e![,.;9R\\hׂ3kzZ)У֪)X!Oz%<^5.}j&U' -?9/+nֱin?8#] abWywIr2" ;<s [05<Eۅ9kZ:q`OI*,MAv{|0hϬ:( ?ߤzd6E}UyCNXl[[{K'IlbpUg 1X8l6 -Ng1"N+Huʕǘks࿌<0ו8?׍gSWXiO'S N9c?:p7}% -6s'7DOm bE īZ`oiq* ; Pf?yC%^wsɛͅ#'h<\kLcr :Xm'S)v(Z T9}kٍVEƺ4e'F8FR.tˊ5%Khtik1F%i]\1WP8(ۙ[FxgMV9T~=a+4T7"K!^Vk]>厇O1L|'?G>}-tqJ">~µ5(nu=,~7GQ7 -;b1S8 -ߒ[ȠZxx]u/0/bXg/+V w)4-A50 KeS^ir ħFWcYI5?Gb_b*[fwÀY ^dʶCU50iH D4Ye._rLQr>ɍZmtG _ico:9}ƃ2 SL* {05 Yx}t:.CSgGX.[mGn#--:,{}}63Sy5%GWC}LNonHߴJ|bY0P rxsU UdnnGea|y_"׎>dҾqcxUrв- u2AtoT4*~:r ':_x@X˶Kw`(6&x㇫g8y}ȵno?Ɉ^FU2@QoJD#1L5 P ynhU9j MƮ-Ia*Cw -wi:. cLW .z1/^υk1:c%'-8M pF[ns󁦃df/f@u|[x A7R4_FyJ>{jp(6`nS;p. *7d W)eCc{k7fz6׍J%ZWXB+>[ e^jmfyM_+HkG^*avpP: _AV`+x,V>jyL,D>h4LԖ8'mD{.*_ƭkz/! myU/6&*1c0v1Bϡ4ֲ23 (ne6ogskZ*I:| -d&f K3" :Ȅpmg0iѸĥv.obk[yL@؋N_ uĩnYw>4éPgG. -aG -udcX@ -)^-G5[n$uڵ@w`l]oL\ڌ.}G R~!UaZ_fBϔsK@|+f`wc;F?ظϘǒ z*n ӵ74c2|+gA~\3& ^vlߕ^PC8T/ ->yƼ_oL1O>)~4ŚGœ;0f +_rVi0U9ʊvO eT2;pֶfr xk,eB}(:H G8V -I&o ,:;GHmp1kKcLaW' XܠmSBsl9:؄Wf`RJç\ 1[sʮ\2ޡ=x$" OS08ĩKН?m@ZC j3^sO|D~i\<50m}F{g# LޏFCNǜԌUCN6X"i!Y\F4|%{7d?Н5/:ǐͼfb/>lu+W[gk'7D^c4{r^H 'BД -˺GX_\_3y}gŽ^;}# QPۼeT{/&gVGƳsvAr]?X<ܵLQe"F=>ˏ_ -b@ -2jބN2biGdM45 a0}n -?l1P(3o:JPJl(go?*ϻMO _i4 l{.]$S=#ۯ.}uܼw3ZSUDp -[1=QĠߔSc̾fˮ\<\O wNLʞ -D{.X;w֜)1cR\?,h(zYSk,W |-B"wvkͿ.iCaE05Ϳ![ʃXXnVǖ8)-3ȄnKEkgp[P+,TGǷ>9:#zhiZzfR{!3taR clLES')[ЀлIDi`w`G P):#P[Df#q?0`oNW> -?]%~蟜JJr&G>U׭R@nP(PErG7b'zki3aWgX/V͝w%qϚ6eȞjQ?œ?M)SOb'~Ӕ:) c K|gP~37 cgUa8,@n0J1:eg ;:/.> -%B_˟e+292{H<>cޔJLH4J$ֆk<-ZJp%+ɎԂ\(j<:ܺn$vm='DJυtbnP0;u `ci'kcWP_Po9d5xK[Nb3~ (.P O2yOKV*W$&ˇ~u_ 1 פF᫤t>13Xq~ *s؋}U,VLM3oegVb -!(un(X`Uʭͽh!JP#43 -. ~ T:n&|ٻ#JOJT6q_9*S+pr,kmAU^:TnRTq6gKM  -YrZf*:dqsg>'Q ;ëRт̭3lbXUǃXҺ%A;N+g_9AV\gTTKќ6)va~m%%:Y 533P_"aEx)ɒW.D<p$ji._J^̘Fܤ>zN j𑜔08ȿ x|+>`U \h'Ko0c\]E)ߌ:OwLԦPAʘS9:>pƥx RBޑnj}"W~W}UO2 -vՋ~l XlOk03Vbb_ ?'TU2ʽ*öGz1ß337i~DBs?}S\N|k1HMo.zBBi<֛сl m6g;ZudX&4k|s8!}~rg3fõe5:ܦ7ii5⓭h\@IM>3$c-Vj|ʍ+/h^!!ZY5߬Lmcњ8/;7d9%Eh(5`F3mc?L0UZӎe奲֌L<>CIPͲw:蠳u& .fo69WR}̪rd25LyJ[ԛMs7uzzS"ھXIr}bsN 6\uvV.\ 5ߠSٷUa3?\i;{Do/BgH5H#rpD4֚d]Vk$4,r5+ࢮZeRW -X˼K3Dg@࿡(q$+IMqM{_Η*]n~?M~g+*t~STblfzL3S-o`#6>cZ׸QidM Y-s|m/Z4r&NT_Wiۈ49L"3Be.63o^nVubd~NuF{u9tM7颫Y" 1Jc. m9RTu1ŵn6ʆdft m-6˜?ηXu3ZT+7'H>i 򝼋qfa(-:M3[ %ZP1:>l?kYIWPɳ\ɑ -z3i[BJC,y!h)P"R~W+v {ȁh¼>ć@.HW%g&X~yZvls,l2ܥW\@;nƜN=k3o8J_:F wJ/iZDexw-cA,ۚ2lN.-h7K)M<,.MF'm'iQ -V~?DO&CTl&^:ҟ Ncy33oTЊdQ'T#Oֲ|1'v>\"O;qh{l6}D/i\!γ&2sYCo  >w#wB矀dd}uņԅ)Oʽ`._ʇT6=x~gmZ-%f(5lsnOhC7N=.fDf$K_NbyLɨ^zdvsHMC!(W)r|;iʣ&o0xIƬG"1qa4gKNt<#qH%W`F؊f ?%;>0-c`6^i]P򽬳e& #_OxCco_q`9#3rU^a Mm]aO(JaƝ(zg@d*ǀH{rJ5rVRbaN7Pt.,QQs.\@_#S5]?R-n6_xk<Է7~ Ϟ)uܳk$1Ѵu4EZH+|[N5T^]"&|1S"}p"1ĻfX`ey7"Hΐ֒n5A~ݺV¡xx1}(iFX $NkNkG<<8bjӹqRkqxCf\>X?cPܜr69X6Mۋ[a j0/Xt>MZ[oD&otXk5 -MB߁y\iEWx![ZW,*aHx#CZnW ;JUt'G8#)Cg*W:sq B'r| gݖV=nZCCɀpz/-@ l?+иs_2x掍Zd C L\x'#]Oy|4S)]{BkE$ꌾ/3߅W]x\n?",%e ڂ-A4vƳuϮBcߞ?Lu_R!y5EqrRM> 5k?0"t8=zM>%&<޳dSҸ1^Ls 1`T{ -RIUۃ;.ĮBcϷDf T%kS^q>E~܃Z£ePu*(oKժXsV d MECGXNC^] L "9fc'Ȓ\n;8̓+f=.n}~?ODїƬ`|g3J+,pX-(fCaL x [oT\%j/3$1ۼ);İEJARrڻC6i$ [K+6fJ5 P=& #J{Jh ->Z&EX͞B: kOiJAi eQ<H!I<.m|Y -|o%dȽe[Z]`0/0R 8sg#x_n R'w2#?D&/ukeo̼D'^+j_ R 3ePݫL^n)|'WF+H_=[ÝRNo9 ,ɐO*[NgqWa8U60OnFtt|ZX#=P {W+Y1g? R 4}ez-AFw;fX6ytu-dpY=BJe"^s |/h#]\tZRGnC-z@:@b:M=_@ uh_]~4pl0ֻŵT(0~c V_ a¥_ NWoTPrPӵ4 cz[tkGƽ W+! S*I4M<'ԅ|:v#<,Ѐ]8 ڌ2s˹ E7"v=3h3Z5 f5-WKob1/{eu+&NN`}sy/J|tte6o&NnsΥtL@q6C彼#+#k]w~[.W|ZenFz*eӬ3?dEm?k[H##{{:۪e3'hiiUnLaDeѕ{ iuzS -006\+U -/7ݎNBcV/}&Sh}eoi]zAwY);SxW^"M؇G4ä-e7pR;<:I-\BVs/\M^D]wj:fGbM~~/`VfW+!K+F@ph_x+MikEdjӛj23}{ 1;@Z.kTp6o.#L/QgD:.=Ii-\{*6 "Nr$*cq)f{* -ƳQ"s/Tp GE `Ջ hI̓}%m5Y1,ш)7naU@lELlt\>GzίvQ2^p?c?Aw}ѧ -ts=u!AŬp@L}5a@[H;h)\n/ZjnM$"zCV NNs_~P=v/JcGTzOB}Ρ|8:zԦ\Qcƶ;Nu(4ru jNʭR7~cD[ MjHkvΪ rft:l|} O,qW[\®ks qicV6t 9GI˙m4p-]/ -k9{Ғ'm11z5W1o58V dÆJ] pו~ ~QJMovg)a+IA[_&,%!? ӄGlkBK~5h#.GL<^"ϡ?n<'׆*>PrE?>vK*L*=}~wQ&Y3PѶ?0}vb52KTN'17\b\F.ң="X_Æ;<`{!޶he *Ҙ"R֏.W+oZÚKGe›\0f&}Q>>g: طJRN@N@V@loCVXn0.0r/NMc‹ \:*+{yʱ2na y yH?, Zmz%ҽvyANb^R\1oL av 'Rgj\t"SUO%TD*Og%%0E4 ˁ4Bhwtl- n;R+wDzGu?h+DNM0 $oOtgUAr9.d۠ILd :Ϲ/?S525{xo|.bg\ZDdYOTۥj%kۙmcY累e[z%ý5{JOK-$׃"ҀQg 1!z8ۆ[Mx.=.d]JE*>ս3M)-u=N}bQ_d[qd2@yf<Ym:. "GY n'Wj4λ7{Y|Y!ypJ%Lj/Q߾ҩ^=#|M5TgY4,9sFK6&v(u4³d1%oEHP~cb84 |Fǥz.Nw1õr|aNlǴG[?'`4{=?ìmʙ@Cl1\ -}\lz@84>q+&~1COi*~˾!'7xHpQ dz&v=Ղp^wi73ݒȒWYZ< nQA*eb\]ˬ\~4iQ&LzL6RxFKgxf[{`xi'cXsiS5S |.\rSDLg%G6xu** k3\!_v?py$7nF\=ʪ~O/"b1 4uS=¯mBKժ/GV/wjΓW}S&Ll ;ݿ5Ss~ڠfr0! zQ"9U:_r1,)9||b =ozQuWG" Ϭ*ѣyo)iCm#{}h^|՛@[pfǬSzc(R4:|t(9Kxez5:nR:Ѝ\fmH|_SxWFJ`t+aOGVej[^$Ӄǿ.wjV|wZXк|K3o>M\{ZH{co"v*}b.SqÀɭ_}%FxnqW)1=gHFs+;#@ `[;os*& #\ő`9-<ڦNG n рTՀ*ң7ej-Xg4[\a-3zkMt#KxSWR|7yO[tSC_&> y{̹rj\OYH޼N3K= ԽϤ@}8JЫw՝:x&\Tө.[' /AGwj_[W%K_]9Mlì(4e:}^hCUsc× Gi{/ߜ>mzwJϯn>Ȟ\c2rI͗maNO}xi:߼7:@=\*c4 X74#u=d䶒eך'J6:UCr\V3j6؆=XYD1d82ke;_ɿ(IW1j/GywVf70 _@$0] KDcvAsX}w9!Q-xQhքͺW(3ϬG# -T@& ieP>M(}J#v<"7yXE>r&ZÀ2[Hz-ڹbuF$+զ&Y2?ZW|࿠^ 7vfj s02~h]/"iWx;Wx34md?OU(>- -^g,lq?( K+HOwre|ДEw_1_I|WvXї\矎 H}<ᯈ76 LC7f9t~3Yl4Lg4XUMc3'uBwjO?=RTKٖE_q4:iv8jJ<'QI gك1KyTP+|g]'C Os˾DؔȦmO\ A<:-8'G4ETh<5V36th_J~>п E w(md.j/G̟zK>zl8UȦar^B>!6rFZ{X*o^mJTNh'JP]xFЉ1fz;K42#|[>e פߙ)Χ /;Ưu r.@5mkJ\x_[&p74guu_isc})C15C1% pֶ&27 -**G$|ei%E<ߒxTU^GҜ茵yf ~;Qpk/wcXӃտfzreyZ Bc)#> 5[kAQ^%hʸ|ƱU0©Xi_a?*(ZS5}R6o~Yo`M[h/qGMgR>1SA) J IQn2L#:~Ǒo8Wh5q\9t/=}2ΫAk3,aK>m+M^|V/}pܔ)M*Y,Pxn9f|}bI ZPaʺM>n'z{L_Ai!;Bdio3af].Gi~?lO ӣ[L(f2-mX}KbҠfgxsubm 28360W} kcB.^j{>eݳyބU(M { gw"Wj!tT=`Z-} |GqJ9ޔP!W ,U\(:C:q~Eg.n)׀j`C[lZze9SfG~jM-LTĦn6xmhh5^" :)e:ǝ-x""֋:WAWT ăHZJby8A){]c=i+ow:TП8⃴/u+Fjb};A_ =va­s3VH?ٵFo262L ѝfE n&;y}cr&㢱6 ܗ1^8#"*Ӭ˘0}~J1reIr[h.2Yև?ph5FK2^Bio-jh*Qp yЏ!H+3+Ʈ6דr:>Ep ]9BԌ\ Y3-cHA=g n .7kquk*jz?N]uo9|sW2οr?Nr`{}6[D K55 )ޚͰ:3م"ʡ¥p<|50>/nUI}j-Cw%KWf.(Xء_df'bW]TU?o3jG64O,qLA р+#&8M|Cꏟ*NeZf7}Js8ι]pwO%V?:HcR,8o c*:q5Qg4o -JWwh -<* 15^X/EK1sX4I@KVFxk cObdɎ[: kTvRMZD1ϑbζ?lXek)F]8.O3(%Q@>3Pt9#+ (iY_e9Yͯwgw.šKc]X2gF8 k/7/Gm*'劬ܚ.|;73|Zg^̇ խw1CAhv*XC?>yОs{&-2Vm|!>K `5ޠU5խUxi@ ]DLʼ;֧yo޷}^u+~Q5Dt2E_N}W\L e(wyEͥ1~[%^CCA-^ -%S f\yLeF^Yҽ']b֧+NoXS$}e>3eig5MdXAdӢBA%*'ǀyL(e(5uw%ѹL31:%+*`Ch9{ k1]Y D >\M|eG?fM~rSmƞL&<"-iaJ -[vYy}bw8K?j{.tX}kYg0"Ir Vha,/tQ]'OΉaE1\ C+W)mRmxzM:rf oӋ&Ѳ+BrC}LMKi<:B_:5p)T|93_7'3|!Goa>߲Qޝj<4j4˷{X?iَ;=ehOA/9"q*N|js-!dozpl U?xMarVttij+^W+UXz|rۗ7!7@hGw)^Ọk/ ]B\Ž@-ק1УVڌJ?'7̃.lTj2+"obc O Xw0 c{y #o5,>Y*lڳ{TE 1W׍ɗQZl vr3|o?sHV룄 -mui݌2hgLnzq>^/yvQY=t< S\h< gJ}#P0>,)OI~i0)s%]yv-x [_^DN|׆%d3o7aa6xsM1sYOz(\+O?tҢ5b>B˽ -.'ߟϜ2µ -[JZ'~y{V0\? -b3εWW]C.> |1 +j-_"w{!>?::F}/VwnNm=_/Oڢe>q}c#Qe.԰Px%4RUiͮl(EgUs}Go,bO"hW~)b8]lV2Uk+pJ*|&X [O5 /=dU-dKl+S,`jEH??5Mr!W )nY02wgfVh*OMp(~.Ԡ*uaFu%qU=\m-N(AfaSSiL6iNdmNU>ؘ-~ -G$!!Ǭ,X<ֶbVsӒh\|_SIs4v.}b]=@޿Jz2>Bǣ>Nq=SZObDNm_,yoq>55acMX|O#Dd=W\LNcmXc,yp33h2ԟ*evF52(~7'?3祇؛Bm9~XoKį [J{Nu+28k- -J]ZEioD \]Til.m6@7p'-#9hH^ u7rp9Q!wjHzbt3*Xy_Aya5HQW u#V/k Ίۯ =|8&˛ s׹-k`'hNZB;#a"h.=iZЕqE\.'vfdh{{oMe3Z^ɠkFeiE I8WV0)/t0.eW]%X AվQzNzǶ5 -Фp܌E۶7.Z*`ҙ"Tc{Bm -;CzvīTEy?Tɞ\Ki8_lW>qOFNd-zUTx{K`\ߎ&@ަ7Y=5S(vMǻt+Q -Ve]/M(pL®[&o8dabGHz%enTI^:ҙ,4#$={nm^2H=Si,gN+0ʴc&JV E[(ė/UHԪP~ Ew9tFM$H_jk>@~ $5ױƈvNE񶿱}bMunfVv]O~ECFq=pX<(xe ?3:rxNoUxc=Ϛ˦u?n?gc\1(yă53W?߆':(.z.k:^b&y=Rhu':-"5Wv>NwqN)R2|iIZiH12Ӧg ASqQySw!}(B5wiP鋊R F3Q}Q~-87<4<i::?yǘAJ8g94Y^KsC1H֢t/e0 ȗ*:nZg;b|)Q/2߸f=5zGճiԸ.]s[z1[k0O_u p1%b#8!ksXaեw L= .pSC.A\hrMCN2z[Qb[*j}):b';nұ*+y_AxeCD$HYƗc ;J@ne'̑_~)y-f<~%;o2HNi}xo+ Ny_5| -d[7=~*6xpŠDށO%Zg|4 -;v Gq- 'jJUq0-Ӕ,L_7izFrs]^_-ǧ"}~TNr%RWOֵ[('yZSݔk:1ʁ?U@_J] P;˔fк] (p2/P[X/X/&@" A 71ZYl'Fʊ0Ak1N޼5p_#G{M/XFMIGThu8jiѓL4qP?LC{JOiKb\5im{~'G;vW[gg>cQ.X9*UL[{DxS5G!_zxλgU㸀Nirn^2-)QtM= <[żJfj~j;{qh[wG℮M>hK&hU% bWm^ "Ro+=3MB$^N&(Dk7Rt_DߊYgXKa촦o) 3P? #tہ¹˯ /c>)iې|jA͟aчL͸3^'Dwgy݄aG[ޑiwYxObOQe4Lѳ@TfN uIwB'YYSt;gYMeGJxCZhE}K)Rq,+ؕ@ ,; -$L\ M~^Y{ƀr[ pr9+k^dͺTaj?}bQ5vY_@5zvk> -^R~vR)8jA+9 ?ȏ'H0:䍪msXUw!{"GImtq h+ں*Lw=e姝rJkx:Kx1[BY8@x/0S@s%)IrqʋD@;gr - ˭I"ffZ3љrTh.V-ܽ]bu);rwJ:2I_D(&S"n j$G?;ϭW` rNt2^,16fe2l]ng 4G]aŦ[\2[Զ1 m>!8$X#fAvм&T~zUE!m6ԯ{5vWHص"wjUao|~B6c0FLfH6xi’.N$1^ x+7t3#۳3'$<襓}x&آT -k5h(?L)s>T+88Ŵ0VN ֳf:ZGH+k@# vCVIa//"GVJT&>k ,ϗ\iؐ35&"1Kfu\eAX/h֊YVxo+`/NRwEҙ]EeDKE| Z;> VejK1( oϰs- -;gj%_8>/mP֐CWoYa]w%ǣzbi$JzXc`rzi|6깕#Wt@[\+Cl]gmO1=Ow Sx QB'l*rؿGx5\Vwp]uW7R^(%3މ叚'3đ`h,3(s=zǽoQ zC. YV{Ú5v. aݐa5QֳjQgZ/>trj!Bئ5o;噖y{iJ_}cA| /XỴ -*h%c JXoǫɃ(pM;C;"Hjdج6,$ Lk`hSS V Wxۺs ?)Tt{AޒwfUr@YTo3gp&>MOą694ca Z":]9M\⚗_Ycᄕ̿8AY_u;/UJ2b_8۵3/΋^iEǂ@z`S ?[at=_ 7j~R#Qn -=E-&ڣO/CܔCj~el(mH6-FU<(wZ*|s@zm݂ zu8{x= N*QIb(;}/)n19p+&;KU9C4GSIV1ˬ!. }ߑ?\Qizuwk}͝1\+cR[KEƪK; iIE# 49p:pog5PM#YΙӮeUָT4YH0`?YMMdyL*ss@nNޤՃxs~73/8S5;D=<@XiLSuXh rh:0(23BMʏc[ƝmQ0saZyFWԃr%#u}Lٻ Q2=>ڏ_ؾ- u.7֚?@0=]q~L(^A'tg6}9L7rEPJ~3prc-@MP)ԖZףs|XC8yZ& !Uܽa6+n4)ؚxER QWb\EAm.sȜS07^,MW._q2= 4WSH 47eFpof)=eq:ڂ;{d6%Mn^ ^QHiZ:0gU:P၄2=Ҭ1Wmp5*1 V6a}="(JTGc$/t }%Çĸޔ%^}\ه6CFDK/P<|݋doUk~~gA4e15FDm*)jO'9܍SB4jLF~޷(Po& ߁NE|壕 pYzfhEU Ӂèo½B[ XZU9:d& ->qKrrL%QE;TŏE+?y7b*t7Ǩ*E -U9gSwڸ-Vu 9I!#ws8JB~>n!L_M_|"v>>u,xj;h|Mv}EcӓB~({{)87: ܖ2 , aڼ!;? {'0,9 ;KQWNqiBw伞]Dؗieb{g0N"WNwܴqp=8S9 dqvG_y:<[3^?OͰV0R7 -LB腍 @߼Pi2jMNm^XJrԋjzq_(|Z$߇7_'A{`J`9DEP -8laep5Ar_ LOZ9龝Ezѣ>U\GF_U#ޢ9wJ.ֻ;5P۱_LK:)}IUh,%\bIe-4;k5NW$=\~*¢yÔ^:H=3NK;oy]O %Fwze|c w9Q-CZvbEgo1=z}f{߈7Ksu0 U0_ -x!܉g*QT,xfQswyjr~/['Y!**2Jch)QMx=0]>U ][5o{(n!oNj,?`lEM3c& 6y97SPPlP|?hzk->pBK}&|͘b"# -(S,ŁO xz@(Â*&<=[vTtص+ <^h;K,q'28=xdOo,4 b, L}n - J؅:} gt&Jϔoߗ5;n#)zMt{%0/j W>P{cP F3g Ht_Ёnҵ8}j`֐/fң9D ia8>iy~mRP&2;tQ):l ؁@1 <;"*zKG2:~ oɚv';wVWl09~s.ӠwAwv=;C.d'5gMb1f(ݙ`^'aCL ȭ5'fz%TmKc(>m >QC͠1΃o -e1X͕ :u2+nhVy)}ßO?> yz'્MD&Kzr;LVJ¡C^u{\Z=M}QAsviOY׈_9q:*VN rK D3Ogη4g>(7bWC1oN~S^_6B=a]}͗̊%T^uKh[ -ׯƻd_Hׅ&`E@*qZ.C{I -~:y4Z9T Swf]2e4}sH\i+F*ԟ9wrc)Xa7.%̍U5?HX{ף#b-~։w/E~qY 荁aOm:u0QFjزCv'x3 " зYQ$ ̀NirMu\dPbLF@Cc= 2-*:07K*ϱ&};EQ `k97R-~+87Nc1/{*aQȄצퟡ/ j-NLBq(!{˿k?C7z[_F!YGnJENKGnZ9 %dc[P[ԇfinφ&*^G+nK;q8iugk1ŮD[tn_![Puo?9aۃB}BdeIyւ_ -HLJ`1\C -b%3yXr80a -hYjWiQk q4]u.pb:, -"x_>>NO[E,#7ԛ2^\^טʭ+|=Brgiީ's~GS/.Uz?C>c'! eJSGu(k?5LKyK0ٙWH~sb/V}> =Β^(b yMjLٯh%3X0MҀ ?1+. :v]QiJ'@˶tmǵG'ˮ㽞@2u0WioYQZ]nwIb6t~DΑ9!5 Fakcp˹"bY!^d%`]:kzūWA/g˔7{.ع4#RZKijoO f6/iZk]o|gL61mx^ؐi**n [<:5XV4'"bQ> 9UUf:+p*DzUM#Fc|sK]xiME%~o eW7_".c : 7Jf5IbޣY~c{lWHo҃x -;*@"CS]0SMʷkѫT ̗>MΥMF -@VL[V2kSp4!&<6"-4*_H#T9P-*kQ0:Ӆcid;;+Dv:/^c6(-=0JMe2w)oբ0J,P~aã̳ox+L8_F5}Tso x6 9](5]D,x EE>?T}4S]׬r^%w75 _yգ8:oƷ3/K?rPo+L%aȉm!gB6@ ξ1BhߐF =DBm|V:hLd2sָ_N+s([IKs-.ȅJx^wNR7 -S/.wwwk,W4>ǫ}Ƞ5o2-_re7KkN1!diɓ/K=P=Uh#Jm}ZieRi+@GB&-eEK f_ c_#ZԵEXhlĕ]\/ǼYT2ϴv; n6)?bT^+Jnђf rKɮ5eK+2E}&xx iJAVrR`$Ý m&>5tӴpƭ޾7uUV;>ea k|N¹73*tD݆]IלkskAf| -AmRӧqmҗJFy;nC8m=KYTzEoTb!+qU݇w1u՝aή -zN%TT5;`zt^^UbQ,JIK:hyZ*j5u}YS(6㫏b&M؛{C`Awb=?8]ֈO<עW:~%b۲~H &yt(R|PX_0âK]ߨ! xO0GyG^zĩ{ٙs܋M(ۅ0s˛_)+rtJ!>Ww1,L-ѽ"wˠ]7@bT(b[ J{vdlk>P掯.F5G7|GE 5LC{Ma5m~ן (KڥΗ/=tgS.oϠ:xf#3l.I]4Oe6,oMWcJ7Dta=/OX,N;W's:z 2'۬W@k?4ang.fEҒJy1՗7aPx1w Ҟk'ΆkYJ@K}FV -mkA:7EovcWwr4923娚˻ }}_| ԛȖ'ge ھ>)ue}!u?a^%d\q4(_[MKreobb-}hOsܴTnLyLGp=jߤ$< -ўsՃcw1"(li.\8~Cz*{SuX</̺čbK@n W#!eZ*K .Síu:%G'O):kWO*n\wb,g=*R -[.פe̱u6(ۅZ19.]`chw{JJdt7ɉ׆[z>TpNe6tmRJز?rŌ_d3O?h9פľĥ 0%a@4 40Oj~d+57vT3 Yn&qFP~#6􉦁+3kL=ʞr_? Ր/LE0V4;Ak;?0pEBzNlG]a_)H+ͣjezמkׯ::ә?z6!Tso>Qy1j> ~[Y9LYd UV#B%-Iz[s_|9`v\V5`ӂX.%\oˏNC l^ѹӪa}-!)^CKap\H:FE.]' -x_?s) -6 gyjn-u*P}T:eY6صqn#.5w"3㑟@|)B3H5ODi3::APŢ \+DMڜ_SaoɁ,M|qe^ b%/7(f2X7˔pIL%Q-=F|c"!pˬB0teo^DT{U|{83LL%@׭I]Y=_b=e5.u1)nkHG Ft={NK| tYP-ϕlֵ7OtuHc{`q)*Mpht -L̟E }# 9`Cp.uMG |  p|7W)j* +7h&U<S)^גys3\0#/ +_Fia+Ql#1+,cb͌T￘<cvr@ Um`4Ogr>z" v05k<gW O6NU{ L/#fW0X)p9CELv3~R<5cdb[u5x -^z# + \71ؙO֓'Rsg'拺:Jb G-^!P]O+׆V+ʊ=4Xguk3Uc3p +$X{G7K*߳2}xR,JwPLHCWN [^CCL!%] ?4qiV#1v`6/!_2JҴқwv3ܫ߬epۉ-xokt1Ⱥ.EP7<3W wZ𜼰WkqtYtn=?X Ss5}W-z L/[\Eji?Kūq8'5(fYU#6շck0;ڏq+բ iz 5B 5*:H<`tc=5rd,ANjiqmy)2I[ϊխ9i?E -H4J)ү?%{Ue` a ,ZeɥQa.s\OR*r8,T#6S#:\ nr?3݂ ^ОrWY-|Fn t]+5l7 7\!z_I\3xПr|FcPAMtFybYu^~QĄ!i -7](L굢$6TuG>^49cpa?*HyE " %mvjBP쟉 k@hMHg˲ y:s0귡 eXK 2E3 COPpP  d:pNOyi/څ]l{B2va XI8l?EA(}1Ex߃(kiM$Ur+Moie|m҅Ռ Nk /uQ4h3!.GFsgܓ)?Ӈ) &X@!}aY*HS7>+G-#Jz٭"EϢcn*;1'OA_I]+#GR, *Ur{= >y-uœ x4c%o`ZD~ -8K9ᬬ41ǦO%]3 ~2ͼ\FUUÞ ~P:%XZ - Hk05=]X]]ß@=%K'* ҪwNUbjFY ]'U#}Kl?ddx1ޑpvC$Ifº9uj|EEL:P{& 1jw&j4ӆGU_wjVDh7XR.]f7!WGh~󒞑[) -ks`e?j"b:/fYC5TY_[s2u`v/loOy G 8q?G3@A&D5ueׁ]._igns8^6CZJ odmVf|e(~eQMjAZ'Y:p\ue/2 726Qi=7 vOT]+P-f0~W>d-Lf ToF -!^X0lؖ -$bJ:,&ic2*T耉y`Zn'KƭDɈ JS)x`&a[i"@OR9H[}Q/'[)-DF;bAˊ&fekf|9B5Q%kwk9>I"D<rur;'Y~odꟽWJjÔśMiנVWff.!ms1ʦH51YleS' zjF׆Knlk{4%{$Cq9_osscoRlF;awi L7G=au8*)ijbtHM ?|m(]/A]0bPO]=gױhٯq؂.ق7*\jw-zkP:_HX4 T,m곥;N @ -PN;.UXԘCFqޒ:FX`ii-!uބvJp:Ժ@;{}Wdttu%6q)kZTcC{ֿ@*Q*?.{ fGU|>a -2 -OXި>SpNqh|SLvæP%ـ#> L2\J!cL:v>e2/lgDpaRit9AvչE>_* vJ%u04?Gg?#9w '?dt>AlSSϙDxP w\WޱWCfT| Hw0 -K`No]e+7+% |t 4I;d;N &cIi[}aL&GH*QWcNGebZBv^eT=ƠV;O,#^!XR=V%>ptjn?JZh~0c5=ß[7|u5;"3JU6!C~@Lxi0B4rl^nk2{Bl´B -=13|$zfjoe';?};/V{9> "chzɣ@ U8'T3̣>\_~ -,_YA[!?n-_fC):@F)&& 8 9F},gzwL>i>Sğ -Xo YvN8+ȏ?x߅*3"kN%5=w /_\s=1i((0bˮ257O{cUZۻoKw>#T$`uE[l X<)֤N5K8*QjW7/EVZl;Mj9a$ʕkiXSnPwxVsv` ΃)$!_@RZ-R㹵Q_Cd*ҥFTxO6-%Xti.*U1JKxZ89$?NMPʶBT1h=42d)kKmTHQ̥㆚x((zD_\j]q3rc۝aV_{!th8TN\d,/ѫ살kF_ї=@/4\cI"-GAƬQ&7"OZc"wC{CōKunr cHb VyJg_؅gsOY#|WQhO~"z{iB:)-B%A9Q[!hmL<N'DT6KV' ?T kʩc;q0Lh6G،".*co9\Ӟ$Gwn=:̷9֝hi,]'(?k )W sb|3NrW?iR-HlAҀ "fx%ay_": CW,fviw4.<=%7\ڒH<Tԓ8EռGct0XeD~OIU[Cä>UecyVEk.)ڥWF -p4ή:Bu͘8f,v8_hA-~u#55FMO" BRR^Pyկ@KzF(?(ڱ*xtH]&V;pjke< -qma*dPx Xjn*,g,` J'WP0ve~fu\ "M - 3ucN{ c搇ȯ_>I%aIel鼷#_"v޲̾:rSՊ(ޘ%/i/8\jB5`W< F34ᷝCrAa3e暲WXhLeO!ЛSGStRs#3x̧ː>9\;&ś''4J믠OTOR =x>A-lMC)~ gw#h(h ,P1AtN7eCbc!HSQyHAR͆ۈgSo@Ե>fmԙv3z"ׯBUZ3*wF+hŽȱ/uԊ RgQ_06fEosNYv6J[]s.\Kr¸>mئV탼i0>xm+|^'Yi(1 PŊ&P -^uylu*"UxJh#߰A ZyG㇝tUgWu?vW$Sd@M)EupM(H} Oᔝ>I]4*i7T13cFegֵ²dnd"~+˾&W%ʙI|^SُDevoߕE/9Oī%H=(BO$/BT+v5)[͘ALQCct -!MѨbrK5~CkI@r/fx|/>cB^U:TnoI>_K0L{GYq.iN$.3s8@ :T}=Qf˷ -8`۱7!g-+ gpjg?$>Z5n[a0Sܝ_yDa8^6-Y덐K!}S3)*PaFsro -*bJ]AlF&iHc%ںi. [dO s??#HَpJ 2'cl_n5lFjz&z!n ]6QuC]Ό!y_x1 T'V#38l?-wY 1q*XuNO9%06ӤD~eP;oXNM]_6Vz[ 4r.8\Z_(ĪBP.lA/@`(ݯ -rhPy?Z\w"ޜ<0GIoӨt}ca9'O4ʯ5|+ HtG :*ϦWZzue]nZl9}FN_\X=("F/~7rV#%7On4Ú5Cu;M 5 ";?x/'&I_foe[3\+C˿}>YA\KsN ~bɞf,8so?{|WsxCsLMoq f?tpU@I~4'9^~WP(NfB\ ЅviU*O3#VqP zN]bNꝸ%ROI&vUjݜx63c-iL*jd3iƨnt> ~$/-sJ>Q ȝ/p4UưD߆u9 {=p5eLb.8֦֞iY̭enƇWtؗ5lpa~Y_A,Ц!g#2g(]>g30c C.8P@ӆ۶5#Pgk(\ز_XbƸk"cXe-n}{H,ruPZB^߄۳r↌e*7lOi~a::|r=)J^Ptk5*SSD􇊺-I'5 Fq@KuVm[M;oiJ#9Y=,dkw-e{%J͸g\wM hrJ?b;lSM ajQzX/t당F~1.bK{!m5;ylM>->z$ p N?N->߬dtK X 5ۂɅ%n-x8a~O?0YˆMv՘08G2?m右hKHim0zjSRXA*HrSSr7]cr/+~!ڑ/@x]yȡZ =j4֨=.hkK^q(oXYYT!wꐘAuQMxǴ{ؚߏE TjdvcV\KzVݩ{;U, ^Z-n_(}:ļ;TDH:SE9=7Wla-jr[j/ikޢ#IÚO_ٜ,aLb/,BSq2/JQ5;[&S9o=Z8C>k7h~>D -iu6|XDɯF > Y]fqp'SZMriNen]]ŚggGY+*t`By4eZw"R/Y&] jkIfw}!\'w ^D<ԉsk>~?4!S> ןaL^:mFqj -+h:b~@ Ƈ xwU`b"L*NB 5.p‡mܟ\q: li25UA4WAhxklVrE,}Ӱ,8%HuĿr:W9y`.VCbΫjMd.Uﶷ\7Bݣ"?9{ -~ؚv*,˃lS4!5.o~ev攓W\xA.+%* uAa:gڙaOb.}v L3o|ZvӍv!Ly\4uˁ,,k]4yLcy9 \Lgڛ S_:% F*' oY!l,v`z]3Dޖ]Y\.vt;wLe/l-wxþMYeu vo2l}c\ \j#~p>N 7K-ZbV8\ PK?i}߳H):o -ez>fSgU1Ү79(z_aT|nj)RYUx;X5Z{NHWT::WWvx碏@m>Z6D%bKNV2sص`zp'u,-c(P-h#3Zu9> ʚ~Uĺ?M}ezP`aN*z ^UB30׀4J\za_?RU5f 5X <nN+wgi-ruxs\m(E> Epf>S#\ <kOgЌvWЂmf! QڬAP&v2p5 +sX 1w]>[B/uUDۢwe>W+. SU{/ƤXAϱǩMewT\``IV_4]X{&#\RBn= wNw[Y KP\TٛΆem[ ы~˻}e/G @׿L!Ǔ\o|c3' ζu! -Uއ0bdUu{o;~hm.65I. cd t\<{ҽ6W/)WU(f;S3_wq5fCd0k}a J;K\2T+u_Ji=.n<Ӈ2p{l -xl_xnB/C0z+O3ω|6_:s<4|⺗pANZ4;sP &D4=9Oy&kM3@v1Ě*"kPKgG$-pJF4kD4J-?v:eMTukMZ&X@ƢڞǑȈ,?_/o6IӦA10Bò|V&IG=7X8$sQ%s*C )< _,J)-~c -&=U~5Xٷg5$ - -:Qu ?fDF%h;:?x[b7P9yv4b=` za5c2{?q?A[/u\o9rs׈j W6K?w89jW’C_1ˬQ=|^_oCۯsͤu '* a5u8 -"˪GS uNqcPjW<T~i?Yyo؄5{ݘf}b̽z .r硖9tXܿUn\k1(tJrIYGu'kngfw;&c҈,YBjU \NÉf3od!7h Xf&U)S9T[G4RAjG[G!Lv -҈|fƯ<ׁa!4!&|p]cB@#UUqt֤^MPx5alH8lSjAMx/%zK1=C+&7ڰ*{qGikZwJaG>FMF.mM y~nPZι?',^ gM,C3#)$spmrB4zgXPOzBq9G^ E =5:g?h{kbzϩLў]eN2l[EzLOS>Ӫ]oLҢ"Ҩ*#k5ʹGe)?TyjT25Q[ Mڝ*8+4Mx s1Ρ˛7 LӮ_LrTDn"y7%zA~cҿ8sۋ YE u< 9bg[jpCm5[l>]dfWéTఏ &v3 -S|-6 SHLy Պz-R9њ?vic`\^ΊWBeџkmroe u)=iYWP5c5T1b+&A* ;}e˗Q,{&o_`MRY*G(Um\)}PB\ >ku'(13!PFU'3wchJ'SS&=Q4. ۏG2ȽxIw3 -.r8l\&vt3E\7 -Mi/IJz,gMXʾRN~eQXAkK9W{<ٽ'tsN?.} -fws⚐钲lM^M4Gc =gva f~ȟ -Ȩ$DA>WvE^SΕ~(ίǃ~/{+xΏ:)_L޲Z֙_33"mcZ)Z=Jțe],a7IzKlyy -wt+h)g!kx?.@{<" K2/0Ol3AjZOeCGj1xu 0rL+ -.'\ƛxԏS> yG[U5TҺq g10eN@6%DN֋m'8r|c:cE8YҷSV'?2Ϸ _ vSB&˞ƣY4 H>p`<de㈙d-N\.yISgs'8+#K/;IURז\) .6hlvjRZ˗"]h-}-)yisȼ^Ҵ-&@ꕫT؀Wcm -^ )Qr 6H5/68uiAx.ELY M[."B(ͧWƹ\3zT{x))C 4rH,W 竩GjeJ,ԉ\y.]ZS-嵇n)eEr*R 9 %V9h,%laV=fZ`^0W]"jDlJ?)X0&/'>,5LZ+?gG#jl\'[e,hµ*v/G74PGd`"SIb5ރ5# jĩĭiϵc͚,f7%{M%{k=5N> ;dž9[qp dQ@EDXyA| -af8bĥ.cv] 9,o-YP{Tuչ@/ca~\u:=&\O&JB1U -8]qSZqk%|k3uv`1`ƢuB_~t~)+-#]9}f<%rD~jۋrC.pj}e3h~'[5:2FBլ8 T ,?ɅϞmo 9dҴrGᚕNU-$t@MK:tOJf^,e,joR)w~t]TotiD3yԤW qώIͦȎ[3p%kȶ?k>d˓*@}J%jnU?ps2=|/p,]~r'T¸bR2i~\tzk'Ino &u)\S O~:p ѵcI._ pcJBhg8ϴ "foQz6 -0eׂ k~mB`+J#-Vi(.8\~Z;YʅEvvYm֐H=uډI ؾj_-4. EvMT bwD7a " O0C "9p(ai{ʩzJ~SCX__EYb\:aFL%'W(:=QpxZ!>r<}{.)dt41`='j{r[ šu2|5֮|HϬSe$GWcn.\F`vP Uvwd?ß~ [Rg~5% &I3bkTS'>BwI\8k1^w$D'p5/%C=H c RXU6ZLJb'7niob\N{-4 8kJEom*HЇ1nW -H"6 *_>(ϟ^+v -4M1f]*F.>^fx܂j9FBZ:)"41y] [|U:__^FӜPxt,7((~-7DRj`mŻ#;e&.iCWHm-*spwqXnqSU/QBX$6aEk 4VFUй5cV\8ޅ̸rmDoζ]ُJI19Ǔ2 -n -ͪQ8ZyU*u( XS}LJa -P[+DEΜ(х=ٲX m頵7}__ .e\n.mӜ hdx 69%+Jã9c.B+db#T~X#.Pʺ<9i -nZpeuT&25at٠"ep=Ex/SrX7vL>BBHu8gcMr~NHMZ0EmM|>!}[^E Noe=jqancWnAΠ%5@)dהG#_(+ʮrJcKb| Iݘ%HZ@xRZѢp"5S)sldZ5&J S;Jem4p{%i &e2o -KULeZ0'9>$]\DׂTu\K*% +J+H*܄s|Rt=Q}fi}u<©qRy+G0@v˝z\rfsD\mQ ZrJ\m -m` #WXٕSMb+dR[ZXf/jBՉ!7$%_5Uh]@|^I^gW;3&IP2oBjF{^]G☇RͪqN6r{|yޒL^ AhCӈU1p5ڑ2@c_̲s$E'-c *Ե:q@ker۹>%kTrUa[L 2|d³5k̷b'*;qɨs4swi+X$\Yg5Fm&݉_G)ߌyt^>j03a\-`1 ͘Uczz^%Zp.lu|'f$"FDl ZEqMpߦ"^MaC|jciXvJj"c*ξ|_)N%UKAl;FO2L0<|W PQteE؉Zw`9ʚU+5%E睜[Y'~rOstZ,W;&U ^.]5`5OOnӗa@D|^y>t$v0uy _ҋx?PKN|ɗɃ{!asa29NM)R~twI@aɀ`P8u:; G/ {:WƳ{=Iޕ:qhoF1}}'pj,3fa:1ηOQeiYWQM`~;MaF^!A[P\*Z(yYI=jnO. yQxiZs }3SEbo_1N.Rֻn2kev!pv~<WN膒 n{QZE -SYNrkJ-Ih ҼDWsS b ~OtBgYo]CYvaڳS?1#Z<{e[JƜLC3vgAoNbz#Ѫrp&e9tZS.2V\z+q3q(9=Q$UM:qnUWÞpYy .[‚diaPD0@l$ )_-SٟϦɥ넙t -rW53] R#*kTm&'a³إ5 -uщFq:̰ܳGC1-]:i٘c*T-hw6jKHzbbis]5-;Bl7kh"K)zVW )~Jp(&i -n ـdY՛fo?g9Oirʑi&9M9;[pBN<PYg*[5t_&Ď\Y\3&*GTݳ%)FmHm[5&}g] veqGېkyO{ -̓Q 3TJM%oz t9nR 8[A9|5n,JYhj}y$ߕ7+z:CC2WS -3d5*e,=A{D}k7XK*ؓ&ޡ\̟>+|C[ηero _t:q`ts OVF --ky);y7!d/=S-ұ+y p3\Ӣӂ s?:9='p/"&62Z8A: 0Ѵʺ]Q-K/~'|~'o,"CF<9KF흘5X5lwxEd7G)uUWOM̜ͻϰ4!)f-t|,l u|1-+R,Qab`ڃKxoUΒNYJ\r fvu <c B ZjCe!9'MQjDΓhSi3MVHWbauJa~T}GhFS@4z7)>Ѯ~\#ʾ Zop&Vړ jXB1]kv=j^W۶DFR0G]*!;I\=_Yi ϖR-iL7 /k CMMGb]*㘾b  \Pa+E63 O$y3rTcW;~Tk3n5+C ,P DG~M֠L(ҍc6jqx -ZΤ=tsi dpAժ~ɤz$ӏu([6!^v-7tJrCRc_5RUjoLCe(GhvbǷVjm*ԮeR7jL3u44@+fNɢn=*:?0jn@oBӁؐWJ!`x n(WX=\Xٗgy: ](JFm>M:sWj\{,d61(h[q9&_$8X_B(8rp\ %<)ù.!hUqoBRi}ujmM"u2 lF}^c]Kd!/rBTиg py L%k{y`q[DCS}%}bї‹}ɜHC(jChPG 2OhM5ޥo%M#֚I{"ZFi9o9"3`Xo `&y_wY+3Gn{.Lht1oo]@:rJT=4]es -bt:;TwF?yl1ꐸCK\h{S]~~geIm~uf8sd_-_0qV/9z@o_ JIp 6A'#g=~&5rVW -Kxe'˻MmހY(-CcEAA ijk*nTۘ'- ԎFq8IX`tZ(fwπum$\:s- z@sY~M'q m̮㹇?u$ RT\pe: YY 9!\Ca j jj)}Ȇ^Vi>Jӆ[*q e|Jkc՜tcxS]yGyBxbSf4R@2jomf6Nfz!PnƲWj*a J*kŏ*[M"i֊ +/y#[doϦ]K(p; mXʵG}%i5mPCcZzƘ Rgs9B2l12ho#qGSo`ZXB`F;^ o冏X 4uH>$EѿnYACt=2^ 5f[仔8bhMO^̜QM?6}=٬us%y@/[x0%K/93HOj XtK@Nu«@NCu( 3xZ%Il6dvԡ)ٹv:& WT}W1ۓUq0A/IqU|ҽZ*x(8w~y׼8 y*~L(lMƮ ~eelDe>cJ|jjd->&MIquӢQ%KR34|7Ǔ9vr ljGϨw^WG)zY˃Ѥ3Tz'30i԰Lp;Ӎ?.LMMZ @| -m| 0O&8Wr \V vPpc*cAtD?}\:8U!8:p+y7]ي:6%<f%ǷGy*{[\\@iy=$fЍc3S-:ܛ8 qv]}Z9BQ0_ ^xoR_Wcg2Py6'0Ӂrcj@dORuVuuEkc,9Xm2T3S /F^7AeQ>c<32ٕ[gew6{#9j< ΋%C8Μ\k%" dgzјz嫆^'QT tDJ `RXQqkΓi1 ˎfߊٓ.zNO.Y*FMeM!+fڊY -]LUtmepqyM&샲i [:ё^ɂAW5DOX \#TICQ/NfKex0`)j*1x YE\2L{'j֣`jr|8;gٕ+)^HVe;X+o8kAЕ^+iPz1O!V+kZפ0Rw*oļCֹ ?6~VZWW-K#ly~c֕ĮU -DOX୓@#f,v}bva_%PkȤڻoµ=f{c0]Zl9P" L|M--ݬT -QODm3J\ -ilœ2ј~*ةO^fw⧟H{$2h'e=#qPi4nk54+]V~}Xq,G -b=f1ƺ0S4wsekӜXU l8tp(Gh5K؊JmNdqm=XM W[JfZ~/.*h@юiv{Q59oe~J+6Gc/yL285Ɯ#m=r-pQ,Xlq -eM}q-):7yOQmXlL 7[jxngjHQDATMqjfzpӃD62u)+q[V A#(}JV&(k_AV\0^$Qs=ƂIl2MXh@|]a,cDŽjg͵- -X郜 7Y`v -}g:_z Bz;oƟ |q+kd -hKQouBw%uԍ3l~^ײ.C4&Qz3|Vg> /\4%ϊOS?ZJfF"Soxj>7ϯVbW™4=]!+3l!G={O?XI0g3#>9zOvߦ.W] uVi8x f|%xtQ1B"% VxƕǛgZ|QUD.Y]~B):+bA-*ZK5"L- ynXeKx*g%Ĭh:x4iT/kκ!yl>t4yVuU%4ckhLZhg{VvkZԏ5 Sك\lL y&}I%6[]aYJW{<-i;2?WXHLm4]:K0dSH]*]UI#@ 3JZl&z +xC2u}'s)ǽ#K $y$u ˔^Α>e֤Cz0}"G+4\R:f}9Y%<`џVL93ߚS_"Rmx;Di> LrqXZN!Ǜfɖ*pً$LЕ ~g@fJI\P4TϤK5t@%VD9iPCgEwm/;8^;Y\.Ɋн]$3A~uŹg&#vCi z]Yb x`Zéy|giƣ>TIt):xu -7Il-֕sITd -reOiפ5w-5=ϬOM?npWIn{*=m5 ?Ħr\'d_N[U_48೰OHPR|Wwì5? zQ]p9CyډHO0 ۻV޳;\=81)U0M#EF.bԻ}rXt}7`R1)2u*/Vx_HG$h{ti@XҋΑBp-t8c{>P}fMtxsK/3O? G"Y`PVs3fN%^KŮ+32a\F7'xusj0^j#.IE)ex7sS6?ur kCT۞#U*84،w-w7kۦvH^Y*iUA[5('Y s -Øpݨz{zQ? !J~!t~AQp{E;en> 篱f~_I~M 4*}NO?f:V_RF]6\)Jo{I%za$߈yF,/Yqfo='t?L \i?:T3'C!@ yqm~7,Q]R}5 @ot,&-p!~:?B+TyFuf-̅ rvx0ݧxrueQ`Vn2kOR/F~Q|-x) F6XmU|2jygwdmT[8rJ`DT3蓐Dc䢳V.hpeH} 3*jٝrDG"BSvT599復~PpCk)W( ?GwZp&F E荠3Ht> trel眊=BXtL)a%6ƭL%7IRi:Pe6.B -T[GßK2ǕsǼ3uL\ɾG?nMtzORk^md]X V -[r q1sXܐ^?!؟QqIGF8-WN hx爬ƢKg7:!NGn&;:D]|7b">(C {ʜ.FD:&H/^Zaޒoj¥(hzKW*Acm^O?t~$ˡ=gӎxG8*vN؊T5^Q.SJCx -Bq8VWk\3M֯h%Z3eiz;8-Kng#Oa&i>N];px7qU"rz`+1_s Fd SKZL]Yn ˿U?Uҽ,X5)mFAT4{=2؏#J2Dw ^4JOAsX[MeZɎ0$:jj}a-UtKsQI17Qл'_p'?t.=e{z::%c̴|3ZWr0н%{'O3kHIikZ$8yU窃b}o!;MJSgSq("ZJs;ە'G:*;!3kKѼy/5wk9,= ׃ Y8j9ltj::TI05|k)?9W] d1pEzK{r;?g27Xb'}4}#FdN4@}?CU[]vxZ(wMܥ_3/Z@ -uebȩNJQF ]rC?c0-(DNs@mIjh6EuO/Ǐu;!yZ[ZcA%I?s}x)^GrVJ5\e:Í36]N JtT/,!_>u*Jv%u:/k3N2_o jtGaگD?_ ";>f- ՗ݮ ::OGb߀8:2iNs_rPݙxtλ˛Oˊ;F3.k~4 rV wGѯO 1/檇U,r)~y4\\4|}= Or~~u~Nu!AmI^,S))žRܥ -ut؟2-S%gֈ,0z^\ xA69?083Of|37%Χ~?O"=FtOg+f&]ߋ^[AT1ZKnĮ{WGI&aHv!PaK-'5JgY:lt PzΆW;P/څo 6׆N=Qj!5 9uJjš )ڎD&]:CX/PTFG2]\VdkJ,ryux^)-t'BuUyS9җ\|w07X}GPDߞjW -hUwiYHE}E+_2FAI Nc6i{oA,=(g>)5>T2&n7j%eX% 阑AuOnXΰ:pD\hphUk` -x1yE^|G1s9:|kN "kB̓FHVn+TfqZm[N `WLMF*RRpJ . -x_QS. p lǼL,-= -#r  tsU7?\77ݩ6:9oco؍e>_d[w[ ~/?~lg38^烁}_N(uM`jQRꕚqȆs f2B5bn5!$`\)|'DOrYﱂ͎Ir+ɩН)Ψ*)o+>1CG4Ou[\0i7JXƒ f%@ <.4΄u)#iLg|q(Zo)A:@b(îreʼ[Q 2p%3̗.eEFh5< 3)M0c`[1!['9 -^Y"ub !U”P\Xd@CX%ڙq*&"ddcm!_+ -+mE -~RhnOBm(F^_AT%>E،1;)bzKY,q/"1 [=dP)%5T9+ cBKq\,aпhm -\ӋV7sV[tKP8 -*?XސPg UiBmV,;’Ru -?uam%7!@tDBʜ=8(֢AQ-LՑw!"FU l"-׹x3SgNq6%p߹o,WJ{YaA|5p|SkcNTtARpR/qbԷj<7b$F5^,L- oܴn7&/L]jXF/ lm~Af׌-ajV}JUר/h< MLo20 Tɢ&||% a>+I;;)Òf -!#Wڈ:PLX^^= ֔Ȧ-leS[JA0P /Z? ?Tꍅ7 )V4Foވ)-#V!)y_r~ cF(R1p Q, -rmkG/r|wd\F_oN4Om QֳRJ\3?c(ΡPj No1>Q ,ÃbY \%F7%=ʛ*WrRB╁j_O)q%0Q#S<2CdV"10HM]za/;*-G9j,CX<8 J%FdXRWE{߶>\_q5}AraxF?R%?UP^2(gld|\V`=1H4SMZ[aq";:?oTJQ nS[m>UASG=9I{q#]ǠSًKeç;A%zAJq)=t뫜_n_n@!n*|^؍On+H?N.NȝCiR*QZȢ'P"ʯV!J| -ia<u>j 4}29~~IK - !":=Qckey%B_ԹW*'"6̿ .0OZu 0f;H5qFf^H\ܶ9<}KZYD b݉u^1iZY~1ao4wɇGyEj L܀2ot6ZiDcOF0aBOe"倘0x'gJ<[2kr{]MD*^e=njQ.n.UnfU0%JbW*-q}@3zOp/Łq 5*R tfA~__pR*m-;JxpuB䚃\q5BU_BQ 0Ssb` N>*]7;!f.ZwRZT8 2xn搹q7)%Yr0cH sx _*2¥WL8[^w)慘:B4j\.t b|k2+Pj .܍?ąwFPEXxv(wG+geO'")`ՀD萊E_#nbO -m ޅ+-W+gG`dE/45 CPQ7pWRjdqʧRߟ<$ka`METώq.V1𵇋Pq1n7.*j-urw.NȶJ P%Vb+D!D pbiJ> ?\ȕ.}ʔT+&-Sx=z 8LH2IR_4,c(q5crB\\>C:h_,T\i.-a0eJ99( -x;'l<9N^\g⡰ͳi`U9Q ? -%pN$S q,Qfxr-[1|I SYe/ŕsfS.u~X>5/TL.ہFU/9|"pc88\4w$wg㈱x%#"%PbeQ0P:yTA"/ZnrR˩aĹeˍL~摛_&~j*r\k-QƄ 0Oθ Wɫo?&]JEHqlK**h}K5/PV_/1sLFx=ūa} ʇ犋7*W\sQ+*Ư>x"0ฒQeqܹy -KSX<Թs.V8]~ -be/RԵRq^j*xXJn=&L |R]As^XU?i}A7-|.W5\'6 1,s[[ox.%Qp\qE#Hs +g.%1d0C\ʥ.L/SU$H՗&HeBJbeR@(֒@yY.~Da/:j(jY,QX.+++*3ƥ\Pps_L]JypC2Q>!P5_H -Yss\o>9Oeƪm⣈PʇJ]J#.$A1W7R -ww&Ƽ@;R$Qln -W#bܤ[Z4fm-SP/X eU1Sp<[ܳV:|(%L~FkWe,Nu0X&8nQ8Kfxx<R_quI\'ɋh } ( R)(+X/y)'| -7 z3GS,1s> ~ TFFar^|UyJ`U0l#'T s5"f|K|AKz|1NUBΙAWQ4m) $  fQ\wn% -SC5K`Fk-8?HK~5phϽLmMp,uҶ(W -ڰ`ݿA|,I^@1jF:#3 j+2qqD_ߦK -[%\SO\}P-Qji% P~.j+q\h1Ш aU".P-ָ3*cRCq/@q>Bx\ 6'|S,.'hZ S+T+1عPٸ[ xSTÆ}D–6<xq*'`IOP7.b\8V1S*!n%E#L;Ln=fAtؼ/z^Fn. WŸ~Ou ]®RqR&jƃ\~cJ335qb̺^yx|BPe#)b }fz8#%q?-5 &&f~ -,J:p&oj\u );^m!rX#7\%(嫕e,1e@P+3k3flcRJ~.ViQ} -^S'أVU)de焌aF/+gy `E`fqx3f t$u$M" @2h0o{ xp5Vڶw֞( 2P,q]45DLsy⬣+!ռM Fx& GVqpE|B?PRmPP}@]EƯAQg+` N̪Uh X%_jRlKw2Q"/B=fU /"L`k[e:yуs:QmZ :nxftb;{qD7FLmu[ԷUTc4kA)7hjX.R3Q7JKjbCS/ }p*k.\h7!𺄯Px3_ĩ] ~}ʗ*!}08WO.P8T .ru\ĤAc!ȘVVp%*9q+;{dg?;/'qxvx-b!)zG-SVP@` މC+|*8UJkn(c5*Jd26}^#ѥBCm/`\Y:pi!+a*_(]ߨ0ieiL>MuM8lG'h2MS p%R -ej"goܡ +YvxEԯ sUDڃOwfxrKأpT  HótU/)2#au,2{[ua2\8%B7UtUiw-rY RՌ4b@k:(ߋ>,@*آTx-p* 1VYP%t*;zrޢx #W+I_KzH~{{eS XZQUP5iAT\$Ahψi 6Ox;A4 xbuj~(#L>7V00lXxV@c F׏ST`5q\@Še|'BJ@jw:i%lXL=(X{*ܸ 31`ZUDfuØp^xܺw_X6rŎRWq |?ub2UaZ¸uYPq]|U,u \~NR .*8>5*Ad|LXgGxfsX*!ŕƥDkU~_F<\'-- ^ަuP -&id4- d6ŭqd~PT V>J;й(Jf@v{jU ?IBTCCkWp L]2>?PA_p1U60u)X/C'ayfo \V *^mmh;)U -Y@5\A P X g\,(rb$ Y<-W 6˗w??vk8 3Ǟu! ]JIEyICA,,8cԤ%6OSJ8y-/'7|-Ly  -Pn c> z(hy!5!Q;fJU+$\l2%G]J -\Q^]$+w/P(O!8ZBX3e|b6BDZLAxxQ,`=59Xp8y_ā0%pE#|!$r/pLyF\j$|%^u FdFNW4ȁ% _Ư uսM;*Sofn8do0r'd@ L/Z0n<+S6\ev|}N츐(bKrPe<.d#pݲ-~j!lX0X7ij&˸tauJ!P021/Xl?dQbXmy0P-@E>P|9kTV$}eQq~jVU ->jpSsJy8eP|x]MԪ3Se@SPb\-F8},; G5\W8b3\S9G\gs8%!3 0h\dmnV. 0|_VB?cw\}\xfe$j,Үp ɋ 5yC1AAD/髀0opJjʛJ:R2J =0vQbWԬ[/TMD8YRS8ϋLܐa%F2F5 -k1냀{Prz[^׎*5/| *%RU?x!p %pk0DZԺBՍ?oڣcRҥvÒG8T?A?}>0 O>%\D"_:(fJI堨QO!lW1T8sZCLodfXEH0>NM )ʖi۽@ԯ2<"GO˔e${1y{oʗ.$6 -VUC qbC@b>S6t j,B/Cn^gĭ^ b|Sx:G8bҼܿk5keMhFRX:1[w4L8UU+sb~9B @2?MS p^Qw,ꙕP`살qB'tjgԬFŢ(P6 -%֟qpNq1*(l*% AYkDxe07S=4PEsP#M1,g&IQ}ʅהc:y%RV7~e}? wc/ a!0HC8H_i8r^԰=(?`|'npJũ|l?ŨKeL/3lQ<0%g㑄S'fW%;G8_JWT0:X`U |G"eKnns [EEVnUʕDȤ[ȸ2ؿv8:gY{Bj)C셉K|2l!kvUxnN.qҊPT.xÄ% TxC*1P*\=q( $D'fNv!OU~`Ec-ΕřemhTZPO:}3(V?H@K[Q΢l,i0c튩lň$d JӃU+T{epR5ߪ]v=m:s]]ᙩfXeI|JM0 ]Uhɫ_6]L&GߎB2\S /l*vM_ vw.uVR D]K'4G*3oZOp|ELt2y_qp5䍢TByd&,n aVs=OMԖ LBY^O%uvAm'~ }iv J{qU4F=@L-0 T86ୟ0lESccS0s \U|f__^mᦡ=*"7=̚aj׈p[ =]iUPupЈ *u>=>|}uـ`R+HS\kk~bʾՃQ=?̖);ChS!Ԩ鹈cRy549(Z/C4 İS6S.ڋWԤڤ\XL#S'R8f: Hm_^-URݩvPl~څY-$fK aD@"7 Azn<-|3m?YG4qޗySLWd?ז^!P^M7;c1l4;TLnb==,c>V ,WQ|ƥKڧk;TT%_U?(녟p↚fx!)! J=- 0`W -{gzVD - ,3 ߁~cHڭnhWHL[ -v4n;:X7PLWW|Ō&1 .:.jʗGXFg uӏ:7C)3U{YTt8dcnHbFM% *|7Wy2\nf2[ >,v[-TgxA1Lz\q sqq W )jl` L7^7<\\vp8~q._,j \VuC-LSQ0J&*mmkE̾a&>WMA )!h? -_XS9*bԹ:TRm%+Iw^9fd@+e 0>3cFkw[QmLx|ȍ,dπu S?γG4E2cV/i;#>5K]a:~h;6"CV{ʄPXfN[Bq?0,r qSwv,bA3Ôx-Pe3wc{r>< yT;%3MpJ.?C5D[~-B>KEa k}S\nXuXqygLT(lkCKjTF-UqޡL/W=ua1Pɭ{]cYmYMFni*mA'ᮥ%`<ȗW?,GJ*&Ffx̓*XNaZqI%^'YRV*UP㛟q -X_=r|yCP+.Mb(CSL游?%8-巎\w 3^z0i/ſt;etp*nZW%LTfukD]lS\?P<pDW,uj33Opz%RM5o HGvW`-o5]kK*MA"J=JGqJ§sG&?`m>Ny%W<%qfnٞx!qqc/ś(/ogQSf[{1azh-Ćp&XS9?Z9|uXnuq|NO|]|.2ri犉qf|]W,7+u|lj !_.yabDn?+i]+J2QSA  -ě4ĭ,+;]‚資p=\aL2ʔo ڑ% )fwkG=}:U9.%3$`&=2sK {'rʌxj(Fz߾1Ű1ZEp<4u&Z' z`-A{WP_NCR ˗/|/pngp8r -pDeKT")4@X)NƂ{lr'_X -F~\''CyrpKz ռUJ WE֧֯f:j7bCVirQ"5sA pnW*~ Rjw{\Rb]? bg -K E^eV:brv-.^MҾ-]|%˖jb\ڢjJLg:%xQTTlPK͜4>S\BJ\h%tq25E-˜*#&4XP="9RPNm_wi.ce ]L#^j3zyuҺ-#v5QG8\fwu `K>B=p5Vj_ 8.!%q$Ľ -c#w"˨B31RS|Y2 jpQ*_esP7E)!U0!'pGk* bLw1VrqU/z(S<<V}kl"Y(žJ -bێGZWAzLS3Cゅm5=SZ"z`.U*<7-R3Ku H(Y1Q"jXq1PǏDqPò3f'p1~59ξ/y-Q]da57b'b|(LA\ƒp3®9*(JBt j) -x"&%fc KFիR>'3)̇E$jk:j -.Ƹ8r* xu[<i6mu+!mƣvĔ`@=5lxAQV(?PUv̐ g5?`] PNlGV*]c}M&Y fbwEа=rBRȮQ+Q%)Zxj6C[8'i ؟u5vQ = )wԺt0!kl#+"5P -;DzM_pfTD[/[U,. nCf%o$Ca b - -+Sdc8!bW ]k -l&kmSX[#ƱHQ<4\ R @MQ^UQ0C;_P]ʨKܲ/, ]Mŋ+~"h|33{YQ8b)+.P,b֊ iYqQpoQD; sP2Cm 1kA0[Q!΅8ZVz: 4بHe8 -PH fj$FQ\iP+ pk"-b$Pʆu|#ཋ-$yM[pQ,n5#m晍 D\ Rjdfmk]\j׈4l -fJ[e7\Yq"cy).`1q3_)/\fJ_O^c. .eJ.1?*or&@hW3+V7%rs\s?! ^u\*JH3*AyjGcQ%++a kjr]WD̽]b>QsТ(>.K> ]N*[s^(i^A -rwA@ݗjB7D焕erx'u\x`őXb1ǝ`,£ 3rYCĺ;>^xÒZL K,EoRB*ڼww/]BĢ ybl -[rޠ6KQ"T`*ɟ]V3IPک#vj=6@QJSZR05+~hE0X]-ub͊ojRV oX/F&؁CDe0rQ.M]sw~ᅗދ0)r\W!A* 1f8&.5R[7:RƧPqL 5Σ G| \jb|T~\?2!uBUJ#GbrWP\ YW\ 用%K̾sIéO -t}2Lqu_JR -c7k -$d*{PLk _+N 2@, >RKY6,9fyn2RaBZBX E Ԧ>W6[QPO3=ʄ-B؞Iw9Tl1\]kb+qOkU MyΥʋk'g] Thf57b_ӍvՌM\bvSH" 5dk=?}Y҄)+

sy9ԨFS+fW>&Q R_ e -W<\hqvT./0?AZi+W6pJx9^.(5 -G44.H*P|,Ȱ#[Ծ[8'Ss\cSW ʪpi;6m',M3¥27h'\%1#r5"jE5OJ#;u&%V2a4I1Fْlno -߹5a|g\LmƦ׾q,ȳX)mim6|K<8@a{H<<:͂hB_kRXLhZ\FFH45Kǎ]ACbqT%Cަ"|N3)f$(ش}K.k8N*f5jUfhbZ;|Jau/HIT|1ar e\% qq`vNU)S[3$PRuC)Hdڼ+pANשRl}vi,7h_ˆYYN;N]4?)?* ж) -R.ʱqsF¿e*qc픬'J-"Q4qQ.ˌ9y~؆%'1{:dK}4ƹa5¦!S7yj<\FU~xx+8G|ltU>+A0 Ȩ1÷xR8ۛErS:_= nWtWRm햞k]\_w "l Di+Ug^l@=F -0FmA&c|x넕WjWƏ1~9|к/ij.!l(PQx]ReEX;Nr+jmFsï|YpeqPcSJC=c"+:> Ό}Y]`WǶzZʹ?ʢlĪMK ˸_!ݦ%JcAݬJ9TK]# }cM&y%I ]eeRUJ_>(F`r̩6Qc5\n-qL|u7?5;'rSw|9ILY]uw7/\cr"'qS˾ -~_''+W=+qi3&n4?%oQ Y3~y G)|WY1)K50P1UF ˌи%단d*&][ޥPo*7 -{R{|z#ywqos hI l[bR-эvinNw _\7CK4vDīaq;TU-(!/ j[긼8TU0o*Pm-^j,&SQGAHfՔ#\_ j-1|ECgLpC6o!y1(%5< ĩ\301dbJ]DYj n[P5\ԳS{cwqP璆7 0(ϥ{C(ERMLss:.q?:Ng7âhu-]z>6$ya7eMŋt[k .Te`"nE̍XCQB+v_*1'D 늝u7e Gm{Rn:"Y:<2}|s\ws<2ߕ|nce 3eq[=JpL}|t\"gG*\rd\ 1/a|TyxYo\YBRru~?.;|]Tt5\/ |AX@p/zϹ/FJp!~p -[ BkMR0 ^W7Cاl4J$I ⫍7z)tmh#S$5ǞQ]1ZWJ egÚSJ{yxQ]E dž3J;|:Be>U;$qArg/W g|1灘 зC TM̍#:T {5Jno ~>V尲fΘdHGe+.FYf1U|ܿҍ{˶\dod!Ph7)П,V Tp(- Wp`ս6u)vq`-3WUR5Xj=/2+rUKrԐ4=:Y:BWy:P˟]pS) 9KEl-W<f!+Np@t6K7Dl/ Z:a8J"<؄vx/\Uoqx_5 c --̼LGG<0Ilojl[Wee\wrjff]򱹐g5S | XS:6RN AUiV0J0,cqn^{qVk݋uìNX Ew7Ԫe['^5gGz7_ A( OAo fopd,#ljc QJL}Kx,YUpˏ%Jืr C1M[.~\|8PQg+翍jơO D^j~yBkm`oݵbġʾ5K>9P i0 FS`VB](˪E {xVɫn[qb0 {/ڨK"82ͼO # &lb{9FjhEdlޓŬ"ae6"7.Y.YRVr зRiV>h%jcrR$UGC5l9} UPnW -%m0#eKPQX-&Ux%.7q1\yc<ߚEy GB,!jL#RIvqcK,?eKqUBڢJ!> DX]> L2.] R0ܬRhA,!W|D5p:cIkT# ݊[|p}G;[+/o"PyQdeơ7rpPZ<Q8q\cuS\xx0k*]`2; 1Wfk,,m@OtWqdQ孢1 + ן wp)*:6EF.Hz#K`]FS|]ET5+ -Լ@*yeQ S1LjR6AktD-IbP8og,x/iPsKCIBwYӡVg!aczk_w F%V -aigj*_MO E2R*_Xe; -*HJ-xC(7NkqT#O9E5S,Ψݬn; {A،)Hg#`Ƭ6А-Q~C*vE? -;GꙊq_b. JGq^/2.[𼳯\Ѫ&Ҩ251|θrqYZw/e38sq!5#2QF٪RuJb\dKgˎb,L ~7pUp=$"!j/XjiL"ĵ:ܥ"9!Y٫ 3O7Qނ 1%5; w2لD[~tE3TWQ/\*G)_ /S3|]D#TéLS< -upaԾVūA ˚'sþYY_Q5fGB \Y\vL"\Q.& stFZ;3o "]:(jy L]f-`ކ@Gg.9̸-JP"f#%Q ~ n/&bgmP?" ?! KȂ^7v#UN*yX3u` fDJfWKe&[ Z8jĢg3P2bRl<֠LҦ -|J:X hʪ+V*Y&'Bb0LH^MF7wCyGΚU+YdUqҋpl"^ Tޱ -^UR+ qLG nT;y~~IRd3atqǸtˏ`ˀ;p-aDʍPQeDE U 0 p"qiwbgxLrsGCªbhpS<1GxA1e2_qu!A>9({h6ޣ/;JtGfmaUY'`e -k&ܲ,s+eT7$DTcu7|${qREǂ3<qO)[uLjΡjG\W\W W| x*s@1-w/+Σ\<\9oo|kG w.[AdĚ8W/'c OLgF"5D>e.%ĊHQkha`jkk ,5E$Ho BdiXMүr鶛.?9Ur0_Z.12\^fUi?ES)Mxy.;b4k0ŖQeT:D̡ 4+Sj˻`V/h+,w e5ܭ )wlȏP(Uِ~Ӏ9fKr -k-'N(6 ZAݺSd[a5JVι@ku|Sխ5;6S3|*kh\X>`:r%()e΁|cFUw|4|/K* t|:(t~raLDޢ -NArˏ \\R6"5_OLJO'ؘZ''  &= VkGA#_#٨[P:*GV/p `ݞ`mT?pź_@]oFO .# ~ AQ P+f(#s\\eY }6[债HDG1b2 bUqԾ d{aJ.xX1 ru )0 ; k*WŝϿΣf+Ȱ`6R:lgDs#yps iBԶ3 -5\W$Eʚ߫EO-Ńq7RpUb69% ޠB% [Huo(P=E]=QȰj_M(J4X R-Ye;huDCW̠)rxp|]LmAsP3(rԧ|`c{je Ҹ-Qr8~P=3d[_KH6MΤh=K_7Α@R!}.[JRxK R\n`3u%b\1uXg\Q|ԡ*? -PHG˸D&W.\r\UU r2428\+xcb fe?geb5+^?cR.bVÏRaz)R(_1Qd.*e!x1t[F eڂǨD=(ُ/qK|13ťֹO%;jv~W:eQC.&y\M\;hLFx@,/F,#1.^8;n%rjXmx?48s#*at\UP* -/mG6BjqQ15 CPJ`6[TƂ=Ql/\G|8ЍM!m.*_.yeloVM0% %(&eb_E"R8ۮiQ@%˟J< Q3q#xr|pWdʚ,ulb_7%yRFV -Υ| R~%ćG.Ä-]|:1q Q:cLB\g 2Yqb". -8,p:Mmz.5zOj rm0Xi'epDa~'Pm3>" ZU.Sy$@h6*9j19?u zKYi\PwE\ RMf mU, o-̗*hPXUNm<-[):2,~[*bQ1m:4"/) {%ӿ16~KCs3y9V&o=k(J~Bzr|cQΥCO2~O$\$pr-B[ƒc8H{8W¡N.0RW;[C)y&gs>` . Jq\\s@H Ab |U{ % 7yދy/ 4D Hsi|"u -qXhkN.=q|\i)i)A%r6nnxupf eyEu*U\MEeUŸSW.;T=M%$xHbr˨K0\mZ;Z"Q{In\nl/OAO.~\}7- -]w,*')F  cY˕=&.buKBu̮Z>DgRʣ'rV1S<1M-ĿtVNW#|W#&nհ$ -6T-]qv30WQ>ާ>4nPf ,.+]%ˠ@k1ID4(H$2kB:.*WK&4ٱF̡epo6b Jpv3$*7y,%N)StJaҋ1樿(b -bL0UZ9q%Ju11,x>;Ŕe*fڗ3-Ep\c0v 50!~nY:DIT!Ylt~f$"P,B;o̚7,t11 -嚖uxw/⻝%|esqS>f\TўB`FNɷpܹpK`es\Qx/K6s˝K1ZL zD}叆3DJ7O~?E 8 -Bj;P&wOUh@ H$Mе!lfD)k:%2<K3r ۏ.#;&D*^%=AQZuK@{Ì\ |:ܺᰩM_ - ю=FTI\5w pPtr~aP[ ExA ̩Rr`|eב! ĈwŚp5Jg;_ a} PfN 2@x5Mp1 `\DBVs}{%,pbkQg+pjYXxE- tExquL)fDb[%L -LUZ%BcK}]X"nQTf:xQ*sK8%iD?e,d2UK%Ր .>U)b4K j,)3B 2M؁Uo"DھAoNZѫܥ(KnURWɻx ?vqli{HQgX@=5 -UK{xJ7 XfH\g3YY%\JBUH* Vyi}? Y<K9Kb8mO'7+!}OLyĤ0O=Jn,+H) 1t/5j[d#݅LGvXI_5WlIVU#) w-Ӌ`,xQ6u^UQbP+ --tYN'vhfyryM5ͼ*N:TYhL0uMgqn(|<g78U"_񠫃vv]qD=@a w/?- q\xcEn"g@tMʔ]pnUoL~J}KQLfS0u%qWܯ -q\J\hܻb.mD+X.u.P4/ -+eԻ,{(0KO[Cru^5ΔҞKYRi/]-)ZTReM]/̸fU(5j 6m[22qoȗ+B pԕ;;R߯-G_Wz -q|_++.xXĹr bW2wF%F+fjV"*'OM+<&EU@yC(ܫ!z%Y%-+hODIGPK(T0UFLvX<7L"g+kL+>.poƢ\5u7ȕxJ?Vn4pUpJȊ(-Vt'3 -ʦ`=,juJECᗸ9R`"Lep."mqޢv3)^uȤ; ͠#$a@tJnW J9! Ri-?żZ.ݽHD@ -qLljVW}[na;*j~⎦5o'W/ @(w3ƢN@ޣsHu0b胄G/bUԴ Xf~!w0dzJpX\p#֭w},^n,̮iC4Ii^ -ژjd "!]V2^N GTJg*}űHx0, :mU_/5Jpܤ<I-O> AATo؃V?5 -(h|,t2/ox>ufgZ$˹JJ&D ?qA,:-^ {~薴+b)&~/>7,R5-*pUe jsyJp|iTDBV'#m*˭iuUtNʍ_Vn_Öphy4q녟q aC -/ ;^!w j(\ UWES!}ZV*'wrMQwi -|sNO2ɗlj)v^RxH:]\SW-.+x}DEL}\2dO9ܯUqs/0aF)P9մ)}!>Ǟ K&'OD] -or@GsH 1 xup.a>*/*~e+,/=StTr kʁ*zv\eAhl2GhJa\jjP.QC|ln` '/Y]Eүe*>J4:".jtP3P~-KXf+Pc E4c ŭq;+m~ TDHKĩ]s$nco$KnfL虗<BO'tY2Vv)~Uvs g`vntK\|?ߓj_DZs˅BvNj 3TNzT.Jږ[o\*˟S,v@nd -\~RɆYtĶ_I|$R^jÖkU/dٻ-s5da֘S?&Xܕ-4ǻŸ$Yn3wR0,\BHB -!}BK)qRWY/L!_MAAD4j]n2L5ԸEΚnjG&@K6 1~|@0,9$,!}*;4q23*\.[C6Vcݸ/z%Yx]uT4eWW;r|OckQC⸷y;+ f;ek7R8\G#2A~8%s+hW/K[zbT!XZ);)ŵP:z3-eHaY \Vs1);R\C;PhoqS5-b28n *>~9z"HzhVDƸ5QXSkˈmTm¬`OZwPע]:"F/qXC|. TQվ  bbH<p~l??/J]uԸl;@?dE_"]KKx.Y<.;w(uISqp_8?fupp~8.;i udr9YL]1baŅ\=73/kp4 -ż\7qg"qQkűQҠϡ.+j"}Ib䢀ژWvOv -7G=OKH;#kw*K)O4WRmᓰ.]审3f PY."Jצa!4 je0@+2P?/*S T"L/%.p|.%UT(+@q9cu1e=wcMKV{LvE HQ!K-Qs 8#(ȋab ؑ).3拏/yQ;/w+f+ ._Wb`3x\Á2N5)U|:ˋj\x%GEFQ}ˇ1'\ иf/ Tӊ7Կ,.R|\, 6 qk,g(JƉla|=K爱'W,-W\7|]XӉtT٬ǂrda]Z@+o5pp!-W62[x1&<+A]xK%'*B-jTL.p@*og -AB:| ~ƞ8Ϗ):ħ*&}_32u-nd84@XAe1j:$T jv +t?R{}CϨ V_oN陁1稹E*\bYv,\<1 SwY-y%S4/[ -ipqV2 w H#uޫr-nX,^aXpQ ZDsU[,TJ\kGxľ.{8J8W.TqJ ^;^kx(ɠ8'1<^# - ugVSu|XPQ1qmDlj|JN26gbWQ$%E* ՃS-BTu #1 XT ^@4]R㢴ׄv* -OuB*<;e?2 l:<O$@ehWT9#)Z|<.f9J |,-RRqu`L4fMJ/P]!<˛D j{. ゾ :V::g>Q"0z@yG2/Ļ.^&iˉ(*]-<]RrgCl0iѹ%#udulʵW.Qhl}.m51ۜ@L XKTp7bYJNt'0zUSe弩EƲ,^_: >DܫWT˪U8 <9W N/,`~|pEY8\VUu$EWrBujZԳ"eu0U-<3ߎ1ľV?DA1t|xΟ6DR"#H|t\T!/aZGsDz QYcVhSP%#/lk -zO/], UdE@P-_F\W8q8Fk8c)|&cKgN4ܷw̙Y";VP#=Bqa֞ɿe{+{HlIJ=a.@NՑЈKļ:uKoa #).3ʙ_2ӊ"%b"J:jgA}pW Pjl&z \?<]-Dϥdr(f-NF17*#QBf@H\ك5MgiT9[d`%4WPMBptdb62rnkːO5.ġGګy>dsf?T&cͤ$&ԕKH'Okn~Xe -m : q]-e\ -}3P^qU!M{jG*')F|;)3z-mm #]wF& 7ԜI@2ʖ=Z.!fq,aڋhTGFyET¡J1rW/]Z\:#r }:K+1>@P~Ko1U_\ _҆BPlj>At}*CJ>)/r.}Þ:,~Nc,Q? I|$%\M$ ^b|6|5/K!^xc-usHwPJs|6_dN#ɀw~B4U?=45?A#b}lb}EƯ#&KRzmqd`u "K]r̬Q0&j'JJW"SLZNwaMvq8<4nS632dZm>!]1/2&8K81} Xs+$#`ZJc@u2]K- -a7Z) ]dߋ}˸_~S kmHkK{6Bd}FŞw`)%k~GepPs\8䟟^R %8-,e̦IeN^2B`T ~.!*lxb4er .u;(S늋>G̨lquq^`S/#1E. MpʨGQ ->b1iܰزlֵpxfLnI YX yVC9. F xI`U;X'cQI]@Kj yhl L-0Tݓ)h,J9&ZZfs"b)]grn}Wc(liWKIcc+V}ۼǸ˂ҭ -~EnU|o7yD~9^e_ LƼ˩v,Üz*?qTR'GU o)#Vx -ά#j*2^׏ @zkZS=[~uQ1@5>J<ZlEj}"BHQ\=T~m'7+DL#@DL4܌*`zz >ao{:`Rl"RK! \0  >uFǒ1.TVe$!H1x8>$rXsh+\((OûԹtJT&B du*?da(ڕl.!P+\%<(LU)c+q4-oTv26p,8w0K3 4=E`55QJnT+׉nfȉ hӾ&a}A,#NpyȰX̬b\gR -gCfơ3*(,_Ƨd9K@S_4_O쥦NڅPFXH"QRxf w^FSp_idTj@Yb-槇>b?2Tx6#/45ᖐ?inFZDݦdI6Z&EJUNȝ'KUxPMJy~;:g߶8qtV@GXú gEU,LQQDbDhq-@|рZ9!ԄfQD.02sJ+̉Dq-" 랋( mv|(ᘅK-]٢8*zқl4 -ƟrpCȂzK7q3R -ʪ D N.HQˢQr{!~A8Ov7T`0⍈]1gNQ3kh 6 -6T֥1ŧ$M-!|zvH&+P¾}n aBO3jWqf5xjX.u3 H]L;w:T>8z _\7q0ԵK>ujh?r*{^ iy)=|S5a`bE;Ix_.Wu0˥KMK)#j7 -N._-` -}:x }Z.YVQ:LCU1ʔôn10.=-(C|*<R YRݴ bi_3^%Ar .e 6}(^(f8*j~,E_HPVIώz/ǘ6k\$@P1nLdT> ss2h_a -2V}S7_9uh)'N`jIfþF;cfɛJC-1?p<_aHGҀDWۧ`UԤBǟP]JfҼp"KDjǣP9i,~6JD(-kC%:)T rp3Rq-WnzqV\>.TGހGR׏=%DǾ*  wmP552u3ޡ=K fS zb"`<7+W -%>eaΦG]oϷ6_\.恏K}Mo A:( mQ?`TGwg (W0pheU1fybE;H ނ.bj+qfïC^%A:@a|dR8%T 5f D Xŏ^k^;翂.^eH0ux<bNn1nXaXj?˕ pYhI|bhO$`PJṶ`XWS\d,5X8cEG[A֙ovKzZtJX1IQ$(Ecky@̍}T-ai*E04-Ј23cwYZk% Jw֘\ؖ*Ce#\σn#)u-,XcJJIT%\\lޑ%?u5"^U-&ƮWlc/p50^;?3W p7ɘqZfgxv;f0ܬRK%l^}Mon+1:H8xl A)INѿAJ0&D+ ʿ8FGqň#O'B? -QV^@ K?IR5=H+UǩAqo%p7\p|˃3ϯ`U#Wۡ"%Bb*n7B)hajE}*%_@;C8KF:umTt'ӪGM4tM:}.U0JX݆^Fغl.!hbo͗tS(`E.-}FiuM[cZ܌[$-3dy]s%Y3 7%ߘ.sL2_"F^YR\w^,*|: - 6oq\tp6D,CSk~(Gɐ}z g - 2~_:$ 1p{rKc Y ^"zL U,`Y\"pt<<--|[D'>F]L~zQu 5p\V]E,W}3jƁ(q*Lx> 7/<%5 WB~~]IUWa~YI2= ܶ1TU`!eAZ&삾ԭoMOYtǔ+2Ŕ U -B{s19ĺ.)/I+K1' jQ{ -¹h>vB9p.c6(LauP~o6$/*ߘAcaub+R"fXB\ (S+k1n8cw;8Ap ~R^wHwu><\"(#'P~oԈ\W}AawukfV]B}U^u"GUFr$e3|RrrM#⧂`5`eԱܢ}DbIb;aؾĢXE*_CzeG EKm_=Qe1 5| qx(jqWf40PW9ޫ}VZᑩpũR]=P7Q[ԣ ꋺ6[€DxqpžeԺ|O2N`۱TLkj<]AMPʲan;P3[cKqPUS+GWl3HKoh1?r+3)n^wŜx<7U{Hߏwż"BįތѶ6bSpmy]v #:}:,! a)Nj<@Ac~lP[-]c?nY>]-5\7pPtJwg -uMPr/kDTu$n/r;a-Xj[̈́}TQ*>ƍ v f=m+*T̶hh[$Q4zndʘ,DU1԰ - + K!\j^J86^q*+ʕdR)%00FS1XDdt3p[cEZ<7XyǠ_."SIX|h?)W1U[ ?mUDbΨ5 =|rRU'^]3P K;8ebVa+>+%Ҡ5,7\Ε0~k JZsx]DB؍5UJ -aJ,$y5Up: -Q,^e((M ,GP k/zb57ԻL ܹlS2CD*LNGƸZ pMw7ܷE(o늹Q]*y$ Uyc"p;I v?i쯤8;  8(p>`mlل|9NÊ p}ó݂ =Sz\POpSbv濟aŲ̃^(Lf˞K .j"-R, VOd5lw{Cu s7Fd=vF|B8$f-Sd~Sd>x]"\; -겨 8R{9yWC).kK/3Կv j\|\uhydU^wZ!!Se@Au~ CPo T9e_!g|XGU_rӼKc bXOm׳ser%Z995;]G7RrblR\"6"W\j^U–(f<~i5pbF ;'?ɚgmX&1D?ԝ^?`o%̻%UqyEq;G*ˆ\n \\#G(y\$(*K`>Ub6Xn]EXF$bFJQ~m$K/?J.1Xb9YBUhÚEKqN&J#iˁD"jJeSw⧢,2JĪYTF/I0fq|.-fu3 -NM]8⫝̸/0^Q$fqԧ2>M쮡eyQ6,x_~|j?*ϥh.;CP+<\2ȡ* c>>GZmK)[;}#靷r6 K"E0xAͺK i?1]̃ /\Zzz`5S*jWp1pdcLY=IPbfL欋| \/ir (!# 8Ҁ-51q+$}K{|[ˑ_hopU:1ys|n^#du-{%cdZ&1/JOM$u(OsaVbp>'PssR18OԨKe5eT-" rэkx;Ke,|u??]l\1ι a<ueKX"@T qa 7wl)Gr K%Vpu X:b>IpqaNi*{,!k\0 cAhy? Mg჊LE |oGo$q\H.?S "` b.f\14|_`|pr3qw :H@H|ZqsY낵 wW5O'7a씷&Z^`6΍>+'zXoQd#xEj A!$Kj\^$Zv}+U`;{ k{5˭5rc1쓆ot/Cn)vԟjYaw @.SXjVw)7VC׃P/s 1'ZE Eݞ}`P$+PV񵪾TK]QԵ HX4$f_Wu~ ^qbu-ᯅ>~U |wE|~q?y)Xga|JJF+UYy"ÁX1: `A_!u_\ L)rb2Wof5RFv0/rqYdn00ŷ|[PkX@\[8^h2҇Q!xÔ!n@яEjWrΡNJJ:}F,#|SP7R/mD2rn~c+OV&k&G/cC CWW±vqR-#ƌf%3'%n kmu) ?Z~3ҭ\LQ.\3jٿUT?#a(=%왨m<hb9' B݅@S$Q=@[FmzVffeUƨ*QK%pJÊ'S6B -L8%C? YL>5ze:cU^=TpL:|_ó"U_^^6{TnzQZ ~~E/"l;ޮ%oszt1jW;h Ug@QQqJh!^?3S(r~WB֣-2ڦ DIK=rV0/ԉUR}}%SX2 w E D^{J8ڶP*x:RcoԹv4JaIuP<Ξ*2Xukေu"eKr)VRejdbQ&: -zƹ̹{<ٲ_\V`|O_'P5*2W pX-DĪ7*2AD|jU.1eÊI|2\ZK客,[FV2 >%j5ˈwn;t -,updžHTͻ% -Cc*-F3h) -dntK{f~Y VJPne^kNg\U1 -nWlDf.[ -XL~vC3.lx_:Tfn\x~fɵ Wa\Wj)74ooX0Lܮ+|6wwNR9*BcPqw-e"TuqRmJJk*_\jgb&h8w31Qso˱ߞo*DN*=~2ry% CrK"71U;y R1#b>Ws0f{N7=~D8yiwb3/ԋgq: @_:m__ÿ`_kJ"uxw\8?p*s: jcqSKܮ - ]K.(\ r-Eqk$y}ϰ8tU\b] A/7ȜzR:7LÑfEJ҅P e?G|nKQ38zF]j^ 𘀳u޽ƒ[U7xS\gmO+ )"쮩'3EW0Tԣ2ӿzYPsفcFogJbTS's3.L[" k!gЂP~"+f\)IRo\WRb⌋v>aߖ&QA**V9x8.U~ Nu|/wŏS.a\jw._%w+\`Y'3W~/Ľ)V1+51!FL -zxv_4ᶘ bp*Qgq|tĕ_ -y~]WʏS+ -p&̫5*3~ep3[TKr}|SS`0pS/80#Q_&,"ZQ̷1{s)ۃ3C:'T| g9{:P?QD֙sd|Q$_V/Rp:ԁl9'O#Ww%Ar4K;R E-+A=DJ^ ,QZ*]E u(S#)h\`P.J*TÛ~1+g-T=a\'%nA{:o;Q4;*"pjjZjRBP,KN^⡄k+ I'? Ua2]SeG}(ib, -s-k -[[7qիn,6#T -P,6Lo#gı~%KS$/n]EM"*-Ȏ;/!5 f&BA!\QܻԾZV"FkT*̪7!\3|q(_f|\slRb]L398#?|ˮdU>'2(icewy3FZUp(I{ ):Ԭ@m@OЪe?/% 3Iur,[ƕt- -n-P)H"C;u6QJ &qp|W(x`0|w  -t`]L -]IU-l?I3Ɵԩ.!!8}BŞ #l]ˮk6#yOS2Ce? m<@[  J4QT֯l0RqK3ƾU+akAlGmc[zo?ZʔBȖ.I@󌺿pI[3-eX=QE KI`uhct5{a,2b}hn -óbIj{12l|ܸBY75S=yಂ SE33ԼžH\[hvGQ+ʷfpLP bT(,.*[)2Ëzu|A^_y$>gX0q|a a%V؏Cnd~Aww1G>t$LPnx|4|Ǜ`TzbRߩ/zd(+/<k4g\XLu35+~5: 8uWksB ~ۻ,q~Ȳ~PFlNWdQ];) P:q*&pD'ot@ @ceby>c̿lң=N60B~ `fB;bXtjHIхmc?7Uq:%wٖ'm[,YB[玉uR|] _ڟjvp a@Cbh<ܕt E)>6.x_ sQ.]05XnXQe[:c}K\X,J 9<-sGP,7/+xIs3/4a/\yQaܲ.fxn ,&+yEA4cQ]K%K K1܈hVyHS|j+Pef!{qSy\i*7TAs{stCPT]Pxq?u0t"(_h~ ?-KQlC~Չn,[_F&C]BѤ[}R@;A/}(-p0!& 4D)L췵bB?d)JF.PaKVH%ь4n8D6j? {LA'gw+D!m/"2W'>]U.]lj mȳPsiTc)Io\v@ \ynhtWn|IH[%6𕻿>Qc*84J)D?QԩTle<|Y9pYh,\C&4S|!1;,c"h,wuSe$ R ĦDΣQW =b(V@cSWp̹eVƥۃRk @PO ._6@{0y -!qT -@Do ZtĠ)g0^f-,WC -_n"Mb)C{c.ʏFZ`pKaEJΠQ |Ì;c H#Mb9 ,w(o#myfh~6&Ţa_pG,[|*K6szݢ?gCQeR0.\rQ?|1pW#L Q1l&5aU򈼄IY mthr/ԦPoY^˚m5U})PC^306[/KP㉪MUE:ƐqQÿy]|jUTx׹U._.`EY|R<HL"ۮŜCdʼD5\e8U. 1P]<8L KupP3V3S]90>!nW*05O\~`W.\KF\#/UQuq(b&o8 xr,OR/7g{nfz,,Va.1\zW2rvJ7]pdR\s Mכ<1Ծ:Fe⑸-pjkqP к-x8H wB ^j+-/*;%ZN|TSQ7ndFG%B D@@PBXVYbpMJ4īOo1^ z -'efao1q"Cqk踾"oGt:'ү~ l+u|?TG*UKwbF7pMJavֿ .Bj8& vUa@z)Y:!w`ԫRJmu|FکgWfuϻrİ/ԦY}L$p _ r_R`U8/|+0 |Os+L%b\.|#6(,GX:HElAE N~YPMLWT_ƊPB %]Ap^e+5 -9RrښvØPEl#AWRY3N*WB\l.zA hIQ'2^\@ -Zh}qb̾/s  HKer -VueEEd "sL?*1Uܦ&ylpd20 \WTP.^RԷɐEvJkԯ蚿ͤA9VZ=;>='U?@nd+84Unm2EH3@o zM5at-hdnb BP_`mT/pΡry<@ LA$<\y l̴1l@ 7Y0W٤OݖeyhI*h1˟Qi\bz%G*}LΛ`慧$>:?bnM鸀Q+"%1I1mTGM%5ܼVM%( wM@b~f1 KO[MxbiW.8 * F0\%Quش6-:Zƪb9ܩ# j_/T'g넬F=ǵ߉%d nh?D/VtD!+URu72J.W,?]|nW-` 9̀˨ny/[e]Ke -Yf}|ҮxԢezjAUR-D#!%@Ahuܸwd%p '20}"bN/+$z[dRc^ʡH hODwC-XցSZi1w PaM2.bg0Lʳ Po 䰝"W)mD%@W7o&`A)c$c,w\_\f8Ƨf%JfVn;LOrlr,.k9~ R5o -*Qjq,,.er7^LS*T\3r J&,CG.Gs3(!w2o7^ Rsx0R_ -Z"<8x1k[3q|RۘH,]~ aDfjgqr5ַtw@o~_cє_(}X%QKæ~?4ηWh.ALq 7:*ʀZBakO@=EMW+tbX}DX/C6B .T3/8 @WЕb++],٘rxG7"ٍؖܖf#[)E츩CWd tk;feƈ #+BC3D %Ƴ>%D R =`7h$TS1zV=,ERpv?<] ԙ:UmD*P(\}̍p`26$X2p_<2ʄ])T[ -U{a/1J,ͯ\SiqeܹYhs*jz_1Uɩj#[9#6:dL1O2ˤ{RNuwhsrixau*g; _(7o.2d!|1\Bq 5.5\4ָM1~gPa<;⋎p+O5(c.r끭a\qmUWܹ?Iu ~y-x#?|9橃G$F}H8&茖"~'x?L)A0&b/ + r>H0NM}* Qs\_$( taF΅<+A2IavDXǸ E2{UD Psq$7L>"& ChiV+[)n^T8Rxj(Rעqift.bfq_P>> `0WXM(n F^/DnoeRM?sJ[θgW£)Y>~ TuU*|r{YXh4}nQujnRaI&DBA .S;X0&:2TH~` -)șNbUL_fk$1!ŗ/TFT8B? }poq -VU.%YK{pEq|aa,%4#,mo*]t<O%!U*_6MW, xiD87\ 7y~)/D74 ,x%T8 -rx]q_%K[&7>l -q| Dw5xID3 24 c3Ì˖&z~xs7e̹uK"Mrбڭumi=Ho\}{ՖCZ -Ys=iB -A4ÏD*k+Rݼh`⒊(w#K6LFU K!<Cq^ʉ 0Ju4.VX~UƳѳ2ְEBM~c8ЖweuS WeC\~I%66&:9H bUcro1Ĵi%C5ӷdi͍68Ir\kпu* 'r۩VQW !` E!*D!z[>iKLՋ_zgWxjZ!zP lVd%暂]JϮ.}Se>2&j'ria`S_bnkCrETlV<:*{F6*KV -,thc/nS*4-)@|aRL$:?WEVx\*i m## <5Y#׫ȜuqvW#^q5ݢ¡cŭL[*C<0ʕ=㛯zΗtlFx?݃b(bm(CCL+qĥкm5-lέ}RD'e~zo|ӽ=w:WFP |p*Ў/H?ŀU6!T%VKe<zxC.|=ffBˢЛPdZ8_16D*T MmnZ6}Ldfa/p3!/sj+C)r\m*:HIGW\83-X0mXqΣ3*&oâer{Gxկ5E\~K@6o-.uFg;u)OTxx `㿅|.TaG¥}L7QY|&wPUKS8S][0~D7)v|1Y4%/SFucv/GQZhۖvÆ4e1 V c|3DqZegZ*VfCUVBk(|1D+RݯQic@go [w^i5}&wE7S&PdEm[J'E/C!p^ )]2y(DWˉJ&Y%\C(=ĕ+P0U< -X5MEAp, l 7P_{| )pK, KL؊1&S"}'D PтTT Sy alʈݱ.ԯr8Os d^ -\Һ"h!CJ P8%{QT1tC%;]\Bv@|źf<r$RTGpQ+M.FFw y\ ]t#~Y5ztˊJ;ep|K~Ua@߳$œ_sܖX -3Pb~# IT[ [Qܠ TqHqCSKɖZ -T |K\B]]Kp`1D5_J.cS_"=9XBFVk\ xy!ǢTSjf䖩 P )Rc m~ͱyJF\\:QxE*'(Cy*ٲ#~ H^|2r k?S͔5Pd̯¥MZ\6W 8Qnn0*[Zg)̨_PRf8\'%if`m!+R.7#uSĦ_QΡ qo >(G]W\0-* Va/(qP( ]R9.9`4>w1ˮ.Wc;[a'm:YOOL.|T-iޛ%SuR "G`P6hxT(zd>PO a/ PϿe,@B+J_"`I-e#` ^Jo0sG}0wGm.\ˊ!E?5s4#Y/㪊 S >hAv ę3Ġhn %択!Tj-w:_b`XۀX}۹X:'n!_%,V ={R@h0ܑkQe)آ"DZ?H{%$ڛnCЀl{nxrpQCW!1DiiPǩwъke4 Zg(Y+P*eڨX]]•o ]ԛil5l;Sǧ$|;]*@Dv-76\OjWO6iDͰxM Q,M 0{-!J-fW GnQ;gKA%8y#O.Hjc SRV E;F`SbZ!iϲV6#k}W-Tvz!p~ -mu/<1*%1qncgl/R*wVljrrGU$!9heBαoe2zVo\9 H|G7X2w*0W *wE* smŴ*diz2)T=R ĪFxoQ]35m2㤨A̦2fZ -e.^huǩ38 -M\H*QfjY.#_*8xcNZ` qN~(ͪ{}Vm+^cq[0~jjutE$J.!*<<gJeԪ mQ -£V;o7lԦP_`]U$U"Xq4@|zP\A!Wᯨ=7T JtkF ekd]F4*ˆB䆗1 upb!eдڬ|au<wY:2Q(#Bg,ڬٖU4kqR̥wSYU,r%soavn]Uz7 -(*AGlfCf:5j_,$t+_w[+gP&\9셤Ti 'YJb-E6E1j%@@=Źn$i˖͘l~ݲBIIW<ʵ<9Of?Zg%<|3DX% zE5W.G=`Pi_%]bQI[H%M Lҥ\+ɽF-R'[>" -nahL:rEb;{1 Y~YkܵiA <.\#p*#b2,UƊ䎡p􊻲`x2YןE(0-?o{a+^ܠrTUrod:\A=J-ŲU=- < Oi-Xtx*k+JHhJRfL.kg(aPc+K20fTeJ7q J|C?Lf+P%JN}[1583놸s)x{^](z\:ߋbqYu<2qEw@7n'*^iy`57Q,x`> EjKu)QL}CESgB@Oc3=)iN?zE6rە1E2,7.ݵom Qko ]!@ + OP6ex}Y|QrxxB1N30崳 x:iLN tm͞ '4CQ_Tyg*`T3UihbdaWliT\CS#K ίAk^ӆT/Cy - -X\aPawkV iP Q v'.H=m)0..45!n*(Aol0&U:OD"ڥ\13gt-gY\?$2mD;>{;*jr!LtXܩP)0[-yAnd/l+0 z-PGNh 5Agmf.%|O% -dD/dK@_EF,7$:A3 -pƗ'q⹪wɣwK -lG{5kYpH;'lΉ+DBĔ ԋy"ّߔt#`#=8WLvO PBygNjFfu {p/Qb\5F4- wU}:ܓdt!1*bI]1ׅ&Ώ9kdՖȈ5/QqlEGEL"vB?" LhԻoPz5R4upK"V+/W;鸂JӖ>j30NDՠ4x}|vSc?P*OGbol2+X7K%6Yx˦ kCV{c5R"Z_عt@Htbvm ve+aU`ؔj"U *W @nc-jEzKR V{o#|u |'TVMXX2>=]SiƐZY|蔹LoUݰlߝEmr+=-5?qز@d;%[Z?3_b/DBe`YcZځBO*4@vG02xx<=+5 mh jc&@] -UX<$_`JBih -#BYPR™K-.2&Wirsfju2w{ - iۣ -۽M.Y : &yI -}!Ye5*^/do^O*e+- H'/P^U>żue΢Ti%pj>;n\>5އQ^7 -6,J=:h(:!kp={}(4Y`+-kqBC:eL~e}rlg3b ?Ԧ[nPr_4b@CC7d[|ZO(K(յ<pS-j!N%uKp60Rd*7S|Z!Us{jt,4T,PLL u~~h{(1峓 "cޖk@T?!3tRHCrC,QN£\h`tP!|y!.r/~H`X- cY6E3&uZ8<cqEp̴A~瞿 -Sd8Iw¼yKgܸ6/>lIw.a_fBP*:~L5n•U&ղ\ -cqځYAݭ}{ A : -Pk)+ *JTh\i| 7E/pW7qԦ࣡齋'r@1l ϵn}$?fm] 4,u |?[8RyHTV͐S꤇ǭZi'0$ㅗ[]ruJY3KSM"&Toa@EP[IrK<%Q6h> \A#3 CE5en]e}J[b i4 ujҲ6E0/v,Df@2 T%资Avta<2?LDLwf޺#ܗ}6I#29M`āw"Rwh]FLC*_Q=+|āb+j#"97I@#`αђ1siIg@/] -`+V:zio:_u>d8 -_R*]BbP!*JSl) -%Z[s<ղ8oP(.ڠ,7œ& [!L2,Mt"FӂӺM'}piWFl3S*1UdfVt25U,1@YN>!SW%s0!n3~cg2%˅TyjxXs)aaXM9 [x(`^L܍?̇"E0Y Jʺ,-XO՗%#SIsbE%1lkP&HE%N! #kzнoq_2á 4, -% wP*Ρ8e5hh}Uu5Pj (pen+[˘[nYE]ĭpW,uxj;q}衖?IGX\2C`^QF-gq*%PT~!nR?ۋj(S#q.^ڟnZf5K!W!zK ^ĵ}33 /jJ4'9kg+?q*1bkL_/.~IҜ<. Q'Ddh}ͱl-~y2emT$+<\QZmz;|yd< ؼGpښr%A p}$jJAZbq -qJ5J79)W ->Xl%Լj,Չ^/w\S4fWG+Hk)ARE"jz!mDE]|"NjH wh_=4$=(V7D%&bgiw/)Tͱ#e\-(w-Xni2jd9ltḲmݦ#B)`%PESx^$q"lE&ȫe -~)?rۯ>KfQj-v,v|y_\a;fi"%L*Wt(!g/f'F5Ve{-l= : wPX@-w{b1 WQI#m8.,an3m!hl*>+^6Im ї-x; t|3T;Ŗ٧e6ymK~?ֆfe K~SgH NAM\l @+UpQV)z:p]Xy9bBT4VU\\$COchTfubP&r/MLSVWxV+ܪiao YVNsٛNПg]])}EV&t?%)o-'>ŴsS*0$ĻGjw0$ ~p%+̎|Q ND;IGW!6E5ˋW'/2!Ie'"$ebTCzpirJ{^Si_*fWpHn5lҁKL2p9%ChĹdr6,'qg\ӢHІ "TyZ` {yb:YwHje,zqo%W/4S'Š<⩛ſldXnPStQDfr"[ !N:x?^+|d㿪Y Lr8RQ {oA7O@ 29QT -ͩ-utݹj0p}7j>nh'ƯcQGL |PXn-m>l'PhH,JXjz`7BjἸ -B)vj gt:O*6ų.hWmָ/菈UGb:aqP+1|_/σىr3sL7R~>|LdSo]OQ%%J9IPwĪto5fwpwɥtX:DL+R&L e[bw,< B`_DܮR?"E, }"2!O cvPf¥ @D[ab"U&˖9upT0\rc7Ī̾)|I))F5X-z/Q0Ե(&vh%yi|X[={jᲮ2;JFFP`交J6A7jnP_"ޟE PwQ -:T`02,t - Bb& \p,G:ؔCiX|v0"WɷiVA_bh(+5!R n$a+\V5-B#|Q1!s\m3:nXH]*%6_65FANK.^%;7g$)a/%}WI[Tװi<=eZ7r:?0z]r+kYMF](2˭Bp\#*4fM&P͕En/e\.oJ*@Qe rʼn-n;n2}%'ʬddF[`55ђPDS ||∐3|bxuŚ -7='x<7$_` 7Âcչw08 l ȗ 14!p5 -/Cw0je# -"zIF”P(6=a5iFt 5?0ܯ\|eEsSM?=ՑŜ&Ц^\UAPq7&D6az1%iҠTZD\hTA0n.`cF82nG-H U!fm [i~ ;8pc׸ -A]~+l>( -TbTDɍGe2lL[L0҆2ڨ].6/f);Iz?xJ>j6\ -6xyc~dXW' $ -.HNXtʸ=S\y\B*VT=D++e!R*cqߥ\nHu A.m=Ca!.kOP) \"FQ򚊩9lXii(\OKy.:x72si%30 'Q.dvgAzRylK0j,bdW'a5e "!YR[g= -n[ZeTk$)& ߦY`*r,4BAUi@leͅCJ ~Qor9TEkPRdcTԧAPSq)o2anV+^{\VԕP/?"\ z3S~e+2RWROi`jjLTfv)^Ot(şxYU<1?,\zmzu.@WYbwwڕ̮ƦrL#r:iv֩#=N贫J %bwQc˓oVflO.nr._d;a,6B'Ƙ˄[\b2Cv|s_w -7|xfSqnU2>pʾ]ù{)6`#q@~p63VW0_X/PO]_%[-r.U -'j'Ac:lREtM_#߁ cn J猓JĪ- ~gr'x.y`-Gx4)lĪd篃S Qf<2$vAϦ/H{0v:,뾖d؊ݬU5L aMrF]E2eΦKԞۥ]D&TTQN#0XFMȕRso$3 -J#@( U]+NwvJ}z%<TupE!>ǘ_(drU}7 TK6] T-~Dۅ4ԪTSuKF"Ia5\`Cfr7iY߿K!vx0] )0ʌ,h^REPcq`2q;!t#Q*V0E@]W=2i3@ -UTRX0^'GQ*y~@BTJ=՛e*\~^W†|2MApaN3*]z:ߌ -VtD&5X@U=R* .cMbЅ`h-݀ _+q"&0ub蔖b5RQ - )1seZ~!QWV2y^Kbక?QLKbtz+zDNW.DSNB@Qzͫ(COkl=i0-F`$ -n0PADju?zrBTX;nw=̩^riG@{+ԩ\j?-ˋ_u7_n?ņdj,Vm_ ݿ݅Wl.ZA+ O#' ]WH*X07}u[&` `yuCE"/J4tv] xEbKmVp 3:b N(#iM6x`1HڑQP~wp5+20AJ8urj^%ɺCKxy%G/7j'zmDS BUPgL.1qT"se`$1a &P; ;/mJޘ8L#UFkq@ qF$Q>XT~޴i`ZU~dBBcD9V2T$fp3Ayh5Ʋ:@+f߭4ꠎQ5|? bgF -*`(qRpAS4PDf9%>V6uW*XGt9\; -ПAWe(/.wG|02=M˩'Jg6< -Cc+t76N!2(X -,\wLQآ'3ߞ*ۃYo{ A]]JbטQ^N37$gNsI5:R. BwSYŠに/ΎCiDuT>z.YZb4O;3V'qjp[x%6Be/+,VџmKq!i Q^TL72h.JPHkUw > vɚ쉱R -àrjyvQkHE6 Q \5pB1#S&feWBho]2"\.ejƨQwg["59qD75(@\Gr]+S/zX%*$+M M|6\/ow6]_!#t'[}@DL_;1-*e뒿?tۈ$|{F]be?S |!H)3ZM@W ^炤we[hEm@n .ω}w A:Ltg#KEAޠAh.Y\RWEp*/Vcj ;M"P?Dq7qJmV%<{͹H+fL-tW,]_5vyZmerj , {m$$(zF<,]RQhm :ffn+mRaP؋(%6.eyrYGW 6ʙ T -5eqxk;0Zɣ-߳rl38)+&|Eb]{_-+q\"f ƪI D޾ƙqOk0cq]K5chA 6S,?l@Hm&UTZ! D$Y3Kcnѷ#5f޻ie;+jFڊT^ -$_fX d F R^T(E\ h 鏃gdUJ(<$5ݤAU6@K˂͂իڋ} -T*V0Xs8526@Z,/RN= KǞuDYrĦm?FKQ[<-MeK hܶ[eJ%˕;/e&!LLryH-Ln'Qw_%LiR$D(HoSP"J}\Ԩb|cZcHB\;s0BUSIѺf\\JLa*Pfv*`˿ͣF\<@A%}2_`/%aO a׀ND" ׬FWepԳ .Ct3 )yO,WRP(-~a q+,ޮR~;9{9O2Vh%kXRh\wd`=3I51->Nb$ -¬|/&*"R06Co)CW SfT˄>["8xgapVE(sBFb1^ 1F lI; P|##M40W[)2V1qnX&Pq7\S$$3yHVRpj+VE2q$a֥3`Xc/4"!<:PB#Z4-G8c (xgߝH(6NZ1+;?X}ĊN09Fnj,Ze P7E~o^x MeVzEg%(/$U}yvV;[_j,r|vj -d+.QiQU_ $E׋t>B -{c1WDL +z%sGZJhȧ0d#?PU험ppw1`$ -\Kol+w1 q8W*; 0v6 핥<#'3ZP}iѐ>XɄ<?Cr`o wL -mbp]k쳠S"bn%S 0> .c22:Taqqy7"D"y0l_]  았pLv˃w5 2vSQ`ӓJDJ5qFWr+Xmq<-?0 oˆȯ> e*  Ú 7_% Oc"BWs*'UNnvXBVo-$FSgB<PbZw|:nؠl%^wAB =ǥ V+,hCQ/l`iZϼ-iZmxN|%a/s犽MDrSPpm0x:j7S1 Wp} %-HԵAD 1-)%;J -jH53F$NB;BڋDE{ b[ 9MA,ОHq"ܩR~d̺}EǸWmd?yԧ(4C4+"![¼D| d$iH_ {T<܃UCR?J~y1!c`)heA.ֵ-U^V2~1a*|jTQrbfAY B9[.=/쫠ĺ ޥk 88s0TT2L@L1:

d ˬ ❹Y!1$脦RNA|l i.y{句Lەx%IERv!G3êu'q -^}l>Y⡎)݅Gì 4t%PR"3,dsޡL`@s& N[y\{$11,H"<^9s̢Wqg'@-8-wyqL˟mWۛvL;bڑ(Aݚ'}vRR1- 0-T?\{ϹS|TP(?d EgSlp0W,uBɱ+k/ aF9:Ju0;~&ڜQҗȠ3x욂>ϻژ -@.&9R,LP/K /q>/OGM΁-lsq`p:*ye'W`$:n\ZX}WDZcpWp OרgATċUU+w<~?x',YJL5(`C3vIStKf:Yd_w -qc;_nMzd̛J嘚[Ej]{H+`^K˩y5 Pr|{%|uiԷG8~ ^b2gƦ%F.8厈x4 Q -j0z!0fu*1XL?sFD~Yo*KvPNqBXazBVv E` @ے%&RZowې` EBs> w -簗Rt^8\a|< s_ 5o#Bd ᆭ|-ⓡe;}K~ۨql3ISbB)\\.Sq|Ĉ2{<@Ac?eDr+#.YVv61/KJWl&MjlD:n=M|/0#zO<# H -FJ|QD :Ԙ1jb΂-b3U,+P16Xm=IBne" U"]VHnk=R,˖VeeX=i -\\+?+.rLm&mWT蹎JŃZ@"TVjnY ^[Tj|Iյ0NjUr.aʹcþ7-fXS1/rF %│#7tRXOm$1J#X:|*ousmk*h' UYuи\ab'zf@FuɓzU>ue#1TFֈMa)YJ1pcmm[OKFA0j<=wL=*7e0[U/̯ >h0ʕ5P,xjB W*T*;a-[ _e"0ceFۊ6e"݆5ycWrȅ,.Z*U%ԥ%ԥ -=CgJ;U:JbenwqU'tF73$x.SElz*V dذ ~.˗r$ -.˦5)+><8eKǾF\cCQHA{J+ws\Tq#)"ʌ%MzH̠d[e%W+:cka#r;ߢ0mpXC;E\- X/Æ܊8Pҙ_=E ]fD: - K,n ! }뢺=RB^4Ka*v5P/Wpj! \3n[R97+wǓt+QZh]ޫ˵ -D^|F-3g||Zx13#Ku.-B* -~Gx`U,#P`UcEOQ7!a=H_q!JjX m ]kZ&m{!]eZFU)GCPi.4,%n.x<I 6Y=]Q(‘9FCtЅ Y=ґ#BӁWkdSf^kJ OqxD5s$rl~ɖ˝WZB q*)eu% F-*v(eo>U6B6 *dT{*+P$ _fU\7@, BXj@UL$ctFxX\nPt@A[b?Yg("J+2^ ^njKpj\JAE}8=Jv [h%cEBv7\PE`#ZcH$܇" iV1#Ü WK!LDaO#ʸ-BiZc/+ɒ&hKPi^~VIw+BTޮZk~Yx؍\~xR mP:mU^UqxT< +/UoM6np$WW:)[B4ffT͇F^:ܪ#[KQqpX#0||T+q1LW$+dd0ğ\/ChԹSv#PM)~~O5SN}\`ThpǩoEe$R}4zs_Xᗆeqm5 l_Jhd5jѽE\}!skZ"AeÝ?M`LE|GGԕ_gkz+mkUJ-!u jv!Ҙ_rXɿJh`>. -)4Cf -ĕ5i)(f5 "d+[6F 5п78u$]LݑZs࿅TLT|VΦnw|P5nV$Q 1)(bEZ@ -V,T}5/R8vNzS;}lAol~hV61y/En6z3W/.IL&QeG??3 -"yA8'قʈ,֪Ya \] -z{z]ǀl6:R%yP*y%4p%C'|,2mơ `+m'NԬU#؀SV x1ݡJR¸!D̷Pj\> ^2u4WVJq\bUpN1PS=U@^i@'=%&#/8XI%ӷq7H Ip_ -%A%j(mPGdw]C$w=h yl*i`DZ'n9IWYHbB>ы}.-$[{_~ݎaD koMGcBI#ei.n'Sp -"4PZ[,Ԥ; iX+RLjI./˒`/pOFInp #E/a1}$Vje9LDԦµ gokLfniL> .&ˢYn~x,17-e.㲺 - &Ɫʚ~r؏i[S=jaA.: ԹvoWzFYZefBIT̂)H4湨j!+%\nf^OxSfbVcpsTq5sG]FT^%򀊊@G,u ljhc&ef$KKwnzR.<A3 ]V..UP -"*JK<2\^ - )?)̭Z)P8Tq[H[ -Ul`xY\P+xܣ >h5DSlPSH X[[xl:2o싟͈'|8)! ?jqj0DļjTq[]rˎ#Ej3¦U6jz᦭<)+Wg|QG c֊c6=K҃%.4c4!G$ibpSYЎa|4A:Īj^8ldya ^p.@Ž0 --Gu5HJ7uB+gD|eWR;w3u3wNܷW Ln*fZU\ه.\}-]PYkSU@"I=5UmWlwn[%AwT,3ZxK^O}3~ _ Ib5\S DuuP XPFr!5S+`gem)XvCV r^#U:+,R)&o tZ)5 Gx{C;-a$[S\WqQhQ ^_GtGw\'¥w ;op+o00M'?eFLfeJDj8𚼷9jae'EbphTθ8",׸#[缾׿rZ;T-?7&5~A¢ -\6e -~uٕZʯ2*'_H&Z| aJ) U#]1ABEp2YbfW|y@<˚¹*vGs6|=ciB^qTf?CEL캊lD9":[R|h[;=u0<<%EJPA@iN/ߊy%5nLAI) Kˁɺ`dm^g ؠIPmWԎƿBV}Cp T"`@[hA?f6l V>tƣxu땎; >2IțQBSD > MX~`'go#3q3ݙIT}ŏȬ(ҥp1 K8M6 6uf8^-!%B"7kRL :Nv>*Ct԰XiV8mm =ST_̹RF*/ǨFx 73i[{*E*zp#}<.mA_ 4^fg1 {%^x 1XW" 8^HԣzGqTV-rQKjrr"X "*wd̗~e9M*عp}^'j>,#aEfe  _JOhfV "B%:G)QJK`MoY܃.V:=?^߰"rĮ.Cp.8( M2&.Rn!%kQzs^rB-JK)@XF~b<Ǝ*Ww9gdP -0F9k, QQZH_+&L8ep)X_rKnMtj.l}.Bf_FZ`xRienTU@Xͼ/rŧQR -X_!mbFI7 3씻j֟~K?D J>:8X -)A5c哺5U YU"~\ bxq uݻDl_ߞio)ech0_&>6-)k=p)iHQ~)Q,zLP&;S - -$V|kgNO;e_R9ȾqQ਴%ЉAZ-(uh6/ E -8.6O]7K6=cLGyff==M7+ZmtANDPɂĥ8@ Dr-$ 15-T5JMBHGW `1 -eu*v-)UWEۂvL2/:pr1mDmDYSY,/JM[Uaf)ܧk.\ݏ~MF܇@u -Q.vpicl5SXQ)* NF7PR %To;jdʦu+4awJAf̾7{JmH<ܿquT%%41Ʌ]mR֢n=4_rMobja4U[tUL%b[:>teKjwr'ŖWj0EjO&M+-lid+ǯnor؊̉8Ftج '0AE7",U_X][B}¤ .a̩vfmop|,p|˘8>wP4)F)e$x -IVR.pԂ䭲e2pF-@^CO=. 0lupBec1_r&n t 1Rsԋ?Ѻ.k:+Ԧ!L4N.E%˙SC|3rArUzA_ipͶ=Yk}BYΙ^)TTcT% St.^NRv۟etJ@ef OOb?BdR]Հx^*CF+j/P 2,$o~";ϳ%F홪B0NuRFcuNX!aڕT(v}uuYP A_Pe@M*]0ndRwR̰2hvYj?K&baeq+ųd*#F"%E:RF DU#uB%Zr h閃9Ztcb7mּ9_,aM73*=>w)u+W\6[+Q> s,p.3 (s|+/;X";1|ܳR - +/2 Ko EP}E{J2<Ý]. =(8z~Ze4WeO]7: -qP!u떍pPK3i[/*ĢOpÍqqEl⬤T2.w/dei]ˉxnM2ngu O\VXpN.Љ3"rgM5M'%l7 +DBL }y(q[&2%f&M3Dqljj@W" -gHM_ i3, ق,+-Zj<+J;/8ȏqƣeϖilyv $V۩^L)/A,Jodx#n+ dĭMBsjamtIqj+2ܪ>5gWhG?ϲ]rYvnab,ngĵK. -\TRBtV 렱IHKՐƈzSK9A:Dec Uq}s'5RJhW5喉\keIԬ@0ROsOZRSiՐ(~5,ReX[/JjK;pLнĥڅuPQǸ;3~n]c 5/{V+<+bxߪhT`\0J٨FDpܧ}FDAlnQ#a%B଱+ZE"p#uuaynU9B;*o%=kG]۳bxS;&z!/i[? ץa1`aX/rڪR[Fõ%Yxpjڧ͸#Md TmV#)rC+ܱ @FicsYvܪG/P18!]Sr>":X˫!aw/ֈUqk1GgByֵӞ%HEosW󥻭KB˚Kmgac=Lv9]Erq}S@_3iP?yTKALU_ۘ-ÌXLTa0W0( y~p}b{sMROĶ'x*3[keX7n$Cl^TɊT3]N~z#/gl%b΋^ˢ IZ5=ìBiZcB=0WqeB&g]4p_~7UyG'vD@5 fm;M'/<y e.;7-ku{^XViu;\@N.'14$_:-Lɪ?كlSY|;Aew?&xNɮ@yDHX,08re&W.t_[[S~.bfmETTsU2ŢOz\G/(pDϜxq瀪p0+JNDpS (kPh/5KŶG'Zh4<^ -ų+ g9Ga;Ϟ=y`:Yժe[P_q lrU }Wy~uºĪg22f]i!EUn#Ju3@?_@-=˞vRv3=XТEfGG)-BU -ǩew!QKOD() HcL 5.yK'v?-sk2KR[ P Lap0o{Rz% j3;9aߕI>'K/a -L8.WD⥄sw(=Sd7Y'WKXm'c -_3/*\Ows5{BjTj[ $9qoEAUQo9GMt a0q̨|/?l"ܾ1;GS[oH@D#6)ULD4ɜpPC0XBKnc+s\^+W:3[|Gi Ks}Y.Iqܿ-暷2GWP98e 8/j]:.;GK~<$l"*vtmQ4 *{#XS -i#Mz~,Y|_d/hASƩzDQ~ 0nw="Ҹ&+.%W&gآJ|j+Q(ZLYwJ?&mA2I(%ybR*;+FUkNqaɩPZ0_Ԛx萟C!M^_y ~+,.8*de gu -pe7$7.AMqW,/y;yKǂKY>[@xPG f;뚒7L44Niw=wv0UZ,Csz='vXXʗtOA0٩3*=gEV>#*XYNv]ADqH;imv#3iHhPA:؁m@DSћ%P"^騜 ._S+t=\Nh1=K@B4\zni3pU -&VYx !y4Rڸv..e]qBy)5@**7_'"R=$Zid'Ld DRei>q慁M=^UEvA>5|']1E*P+E0 zQvIxΩ< uH$=gDrbyC2-l-=[.V5$<>K;Ѹg+0hٸ,f)F_@L]vKa.%(tP*.VEFsq[pWN"yOT֤a_VމgX.SmA -!:TA:}5|2J UmgsQ|S,bF +OõHP%S8^/_jk/ȫ6H:zMǢ&UX2k8=Nޞ`ԡ?SKbç0#‹P!n^YW@pgLY~ȍGIKƃ5 MMÃSBfSMgp=a̡pqK :J> dYl3C*U6\SxP2߿R߶y\ fԪĺ_PC#oNU4<{w6@`yjBtYEVj*03ر;E]qZ`w75 .ZWBZ߯E)_B6ILn/h\P9a̮ob(YQ PBf:!;_O2Y Eև[j'+^caFz([/dIj'[5/5 rIZPq'l'bK,LJԖETh܄FBe#zVEYOڐ#Z c(̏8tiuKd'YT V[;i(ďmg  -aAv4xܳG@P({eV\+kyC4M^o*9h_3s]TRI`G#ΑOvHgclvEUWcRG:jJ)`^Zkm`*c4^  lR]41S 58ɜ슥[ 4Ai+ғB%khbM[UnXqćaXD)m7e*s:VVሼXrt-q/Yzv՘?-$_"c.@-SKj*ofuV oaMcQ-xS #f*IEuNZh|i60[e5IUʤi{68 e}į^=L#7R'3’,?0h:na -/,+~~.xi<+_%+-kKdihz&?P'cީ7ߌ%|R(_EWwe3̈́B v_ a2BDSɸWP[Qn8pM֮`+.\Q1G1yXd!%1 -/m~x arC(GwpUC೨+gz'{BhpBulq -PgP7h蔳*A"!m$UwbO}`z.f!GEB4 x!VIq%EcSȋ`7v .URYyS)RֲZZ7/*fE˜.{i9nVQ~YbTMț7G̪d._rZVP,\"suFt?\+ETcbҥ$oq/ XQX5*:Ul_ m@TCyKjF`7L`&1u%<-2;l!ÿjnl#ۼas](w߼>'3v~=1V((zmNjP_l%5&%wj&JhO ޲׀h/lVhqr'vMJ 52e72p@q$_X3ܛG@o&!_4 g%B.%[FGKqTAhZ4vmIkqVvxuQI}jN5 8M΢K#}|. P*~9~`WW#,eJ&8opV6d$WFT(82> -s<.wY] mB6w3ۜVPbu+a3l=,j_dJf+x#?Im|W ,a3Lʽk3.i0Ra`e%[ LBùP!J1D4W|x/#Nʮ‰g䝒<=rzT=|R#\w1Z⯃HG|?3iRu) -pF9]x -ś?*[xwfx [ x|J[K,BψݿRϪA U7W5Ot!W| -KoomcS3晛 qc*˘Fۙ6JJ3&m>Dh:-"hMÅ ωb^ӍWRo!Ddl/TBCU?7pW?Z7-ʖ9NV(T$_#C?quƎ7R0)0,kn\uM| ,k(Fycpܲc\o\. ;kP#6 %TkoQɹ+"0ix~+Hpp%b~u >_!AuPL1~I\U08}G~3f<\b/.\x`lQ) [mbd6v Zoց+i/l#xbm.чPZH?] ZLK݄3ʛZ*ms.R<xqQ2B u5ЅRyUxY+.y/j u!%i>̨6< Y1n_Ԩ0Tn+k .^wsg;7Us4xT]&;$t -`'B$e8*b4-F buݶ%+9>&:Զ+\21LbWp UR( N(ka4 ̕n| -|&'URڂV(@ [%kͳ1䫰QqGٛon5x@+PfAL ܡ TOdsqqyXML /0Uʕ<kM\8r2EKrC{e>a,-ۅ.}~(/ -һ\*(cSŵP[hy5L̋vAu8Nn5 -"#]ou=<.")]5NlCPu.h>, \!>,,FHPl:T( 2Ku jT*e/P,<p*QF]Coa׌-6D]7It ϫt꡵f7(!MZ|O5RU֞1/tFm:PUz֠*"Oos u%̫aW|-{yp34C!T%3|+iq,:y'հÙtTe(hq( (!|k09 -(C*㭫@V3J-xj@n\yl^#=$Gd!3W;/;y,"[lY.^| ׺pcկe \ԬLl!Uu -Fn G 6K/, UοKR!p~(=G2+`KJ{bS(\Mzdk[XR|SȊH[0 Wk!~XG9Ki{(}HDt_B/cuB'SSId"uڏRE8f1h2jU`<:38W up'PTJ7WbmJ14j;o|*WT Еjv £k K,+*c+/W*&kc/̿.aT˺qNvv)G88O%Ḣ}l}kj/U.֧ѐ/'s-vB -QFʲt.7PF%]Ꮈ&8x}  -߭6J#+"n.PT)AFIBTagơKπ#' Iv*~Bٴ/[׬lnf~5)8a:Ԩ+n#-i1Kf)QmJ_.3\*W#%`6|N4_E{w"."QVKu4qVPә\W*2nK1H .4W%.5rVn *iirA }&LX OB mZ,W^1GM+R-'De~-%H1"V jў ݜ+UcÆq\up(RD^z5XVx0{9gSIԜ{:&nN:r,UV_7/az0ҧ! nKV=N٢>ː1/\RtGU.*b-?R檠t".Dr.ѝIxKJ|TE6y$|?X{n_j6ok`8A> 1iBG"?9HDԬBccHz-B$ީ{Ml,_R3BwCgU]mu?2H/ m -bZ݃W mH}=BOߨ-% ɶo{4̕h'`h#椒_ rjE-ƗPL%s7̞eDs:ÿr -=J^ԿmлCYkX -Ət=v$g]+"EV8|5U5B7S6LaggA\:3̓)uT-5%|3e7.hA9U"Wq@~,7.X/13(%CM|JghXq˴,,[ݖ}yu68cBTJUjs4Re]ɑ [G]ť`~nS:TLz5I0jط8X-g .-I-NHIY 9Vwij|5s*JƖa־La$NVye@]12n_R i/.8B^i,[׻F{Dy\TǸ|N啩LJ/pLTQP.EJe@d^㌱ZgLU{%e?$Zr &}+ IrA3`0)Q#j;xJ. iܬ^7%[&EDJpMk'㔗x^W勷'me.i[8*DFȄ IU[nڲ6;\1aLp'lJpK˾fHkj$w}x5d.53h8/P!0uqxu(._ -rj~x_ķ#D  ^ዧܸ(Tŷ$S ' ']Ǫ3P03Kju*Sa1(?+5w*5EJz*:>kx<(imؑQdۥZʦ+^TzDy*wYp@)Dz~ 4&Έmh^ j*qX a5>77tFnR=?i;RǷBRBT:ls|!:`KS|r̕{4˛N] E&,o.,2tyͷ\+r O d<%{l*<%J[ًnI-K Uɍs\@5 [3OHNTs Vza"m<&lU郖}r 7p ÆDMhҭf@Je{ܠf_A bRU;.ޣBw] -e2>*wߖd{d˺ܥ͛W6wq`]JnǕ,*|XoV qw⅖Cgmk,SMgeD 3KӺQ`-Pӕˤˆ1pcg¾wx­lm9 /lUjw\+I7Pn \FQFku[wBŧ]me0{zdߗŃuV)[N\HBòuW[⑒,aAr5S`˘wb2(i_1~PZ)|*eV%J*†:gjZM]\8 >KqFO1^0TeEPVѺ*o(Cc(G~zȲf,ݚ0^)S &8ز1'3 UuheIJo'Q?lq(8O{:+ #17ࡅ&v();[zfL)IBTܬEu*}@7* j\~ G'/|S,4HG[t:g DH@HوZ.Ue&}AR\^9.*詞:ĨGY~$r!y6cfϹTmʣv&㠬/,&u4Z܍%S2 ƒ6kHnm㼫:Sb[ X MDx \{'|D1<˘Ѫa2M66vAFbʇ-B fN*_qy~Yw5:]UxY= bTfV;9P3/ԧ.Gd)y'$!1yiYA-ds4 \;<*4/yC ЃV?PA6Sj+EJ|^"X aBxV B@'[TY}砆wR}Sgtnڀ靲՜6ֺlcj7K\B#B D :s ԗzgI^M=OeX<^BT? zq_5`O?EL(ty/(R*td?>3@ .-*P{^ڑ[gEepqZ't˟R&s6yբB+$qY%nWS^WGUAffb T\]FTf̌J*+ 1-^TZĵR`͞2Va ]s<_~!Cr\\'I?Dx73˗/ -b׈.+C$DAk[ `HtsmTeҭ%~J%b$c'n[ԸerɎ3*}y^8zT-Og!ŸS3\ n B{[xlphmҲ~@!K_7/_CMa51Zj`1(AѤI~ WЊ-5"y^U+UL6 jWQ*3r\+7|3|PAƙPխYc;CI{;?X7ȑg7>5&?`ctXBP J8|ǖ=@r.[ -BRW5*R76r7UjaN V2ii%ϨiyxsMW« -F{TVx@b2Q<~"4 olПx@Ѕ|v͒K&ǝ ^ƙE crSܼ -۝c&ȝF7H.Z[\Z['TRʃY@jhI0-yf$|?x^L B~;4%K\-rtl*bp[/R?͘Wd$Rl;S RJ+ZH9h]b^YzǹoF? -|$У `-dncذ"GF! xmj( -Ԯz}R_zʕ؂>z%a ʟuCPٌcʘf1=MeXUlϠcpfClH>g;+XP:(rW|Uj_Ǩ[pzxwnHRngyu\)/0F"J1*hXŹ+讳[V.1wmym!z6oj~漖 -{hQIVhG)g?i~Q~ɖ[p|E y0upw,x[˻ \!(;GS^f1rnWYd#4 -| /5\0щR}tK-]yz(4/>/PLKu9.f]onk[%"j3!iGj2F-̯4Jjeƿ*--p: -"Q<̃xa7!PKtб-linqO^3G3 _,CLb*=ٶJBG*:M7ɮ+tb9$zI*ḟ ,CUpN a~3bl ,AHc:g'7_ ZUV0AAgl֨GD1* e} d;n#yI -Cەh27p.7B >=K5u ~yvU¬/ JKx*Ww2/qR?*J%F 9JfOFv00Ӧ(-32ڒ37g=O` d0+;hA%WM P jz$D!{3ײƟʝH|`eg,K׽qSspjXOMX'6x8_LS[]ku=-ToіJFlnEU "{\&"06 K?<;} 9]"kұ=/;kl>N|Aqqg(̃]]yt7d@z/h%1͖FOK0bang 哝")2q\"4/x@v -HkCy dG'C Pƽp̫AnQ;'Ž>-,Ud*XtgHGgYjT&z,0%daD3P'R<_yψ?:'fZԼ\ͩubJǵV*E.דqҰAjp†=rˮ.ype+20U/Nji.Y3/RB^P?X t-jTtTƊUY0z͓H):\ĵ52F2Fun8k.F,ݘ}?O4giaʷ%3SPPflO1bˠSdX bbwnj`rV;s ntGzBQE4w}%RþjXE;Y/mNw~bIO k0WO<<Un\BSԴ3oͰPT-̿o=)Mґ6nbBtΉKY (X'I+݆faP)ݱ6qp ڹ7ۻ%u> lQ=C -:\Cww˩]K̵ʞe]aeP: - Gz61m]"ayt5D|m @ê@aغ,9KEw_RGY71R:b/41f@ps1_eB*V: G7|Q;u:lWk:f+b^vu={+P8FQʢ7/K(+pŞȭЌ6w\L p{ 0x8]u -#߆ʓ Z#E'۠ͱOe5D,-j|%ƢCX/_㳚_rGIc+G7bSXjRVO _HxEn+7* -5So@@(|ܫ+[ua>e{ Vl@0x1y"!q_*eVSB5<!k0Mh鄐 UV7wXQtNUN׆Søf$F_ТB$˶E4{EPS3pQ,ͶbF7nkPrMLeķV%E/6 -@Jyd 蕙\PZ@>X~sf MNSC<=S-F5{W]/[Cr2j:XmoWD=K.jVY -= t%6N7^]T AkGxΡQxM#cuWI޲T*sOkSz3V?//1ĻY%h6A@' aEkL:0:3LQ*viYHܥh8P≭lJxM@Y Ѵp5.)zP?pJ ȏ_O'BWCT(RJtPQgF5}V[,ڕ\+/ -숼Mu1b~KЀ&.sB;mD8Ϧ$ y5]|;_,[,`|+#cfx,V`䎴LT Gŗ wqK'+Uv{ҰթjM]Em.ŴGԬ8T|.EVѹQڌ RM -_e55MT~lPC2r00L";y -QF 1@ /5bxu?%*clPP|.4 eZrƸ.;F:yTenջs;('_}Y^]/n@iQ})KJ?qtU*VGRt j , Z[;VLKpppTeJeh\x0NO"Z= 嘛&*:2jԵEHǤ~b,"jI $rJj_RR˾+~GZ./fL#2-y8z8}Yn͘kݗ26@q(/3?qT\T\CKJ-\zN~z$G4P*nUً&BM5Hg,¨[v+r*HBoZ7аE\6 qգv+Fy݇Жyju0M616 6\T}SJ[Xkz֑+*ƥw@:n!Z) -څsOjo -MĘbߒ7Md -mZ ˎ:$\-wONHrᴌ2-5EyZ s/Abf3H^ -=(TtW³RB55RͤeϾ |>531V(+o;˸Q#v=f OS0WB$tgjE +.;iELmf5SSUթtyQǽ&|,mZ0QG8jZ3_ГBcCQF]hTX; R~J`u[h Aw~ YxM!px) r}pw2?Am-AEI7ZW @ttz5˝)t |Y:Ow҅&RBd}/ TWXM$^7B9̶b;O1c;/ziwxR uҺ'LlX5-c%Ym";4pfKzens -!R1cr#͉qW-A#$OxUp]x&n%A,rܲW lzeه8>  v긣ܾr2@XG Ke - .2F$U䎤(cK* rf^B"ogb6c\n8NMK1c,#Glj[$ -4ti:a܂OS?x`t},SkPbfaU+g|P*vSI~9 q+pȭ~bܻձPXE᮳=(a F3=1 Y*fa};H[.J?TX\}̳05nPJT*Uu,H5_ӡq7j")RR?}0ﷷ櫠̪Zǹc\ /Îr_CQc/{FdvRAL~Y-P`6[XYRIp6DQ6DǿJp2qJ¸x -WL h'_hi@D)y`2r@ILG-hCA^%p^ 4ǻDM9#HH%pM/9T{ aK{Y?Pg .F1_3zbh(KGܩ]C+lB22-J$ -cat@F>D,bkQ"ò4bЈU4M}4 -b BSܧ?B/.0)L`vOt(̫e |'GܵQq mLVP6 u6Ex,*y][/RVɵӣU#!.ʖ@|3s}ŭeM{-!%+BuTSvc=_ȋ[F}}_] ΃xY!퉅]ߙkq\({36F EZ,ZwQyJТ?8;ƪvܨZXn3 Lx˜+hTK!p&Z|¥sJE7 vػj(wvnj1sZL Xp>H:-nl!m4v6PGVFiξ# qy%aM] x-]ɱN/T'#7ˍ_Wq4Z:3w„?,qBS\W 7}#GTg4 fO뢲X_R @-&5c-mx~ZH^l²'ForXc6,JB+!R]vBڃ<([aCreZ%^)VgO)wM[Dl+7ԺaDܼ]w.O9u˷*@TBhmjd>-23R̽ff5YU -}J5 㤸yr`WQgB\.+^l&PAޛlWKq< pZ&c\#Q kuÿ74S4\k BdۓXF7b3SS+,T*O -mOGV[ B: -XT"mqKNNA@y#LԚH݅B:!^.^eKEHT/ơc)Aw]4`XcQ%<ذ v\^$A:&/M~ԙ^ꡩdTZ,(<(C-٢mࡁ E+n| _MP˵J͚SUsf[?\bpw1 ˔3G[3Sf-H -_,2E)|{ Jf(I>=(oqę9Q.f"s/])sDXNH!GoB̙L"1;vibرSIA&wP}7OnJ -V&$cT@ ^\'b>*Z.+ DB.[=ܨN{fMQiƨzg85VKAkwm XFODl}`M`Am0TݐT+p!'tIQnAGF9qICelL -0'F%u))Pw$\WR2O0> 1/qjXB2KkU\n!2.\(Jg CZW{g^w:G|j IDH)kdxڟ1Ι@QUþ\i~cch  p}}*36A~#q%F<TL_ 2J #k"m4{Qg㎹];DYO+*KX̻8.E!Kkw35;.g8/|3 l`e֊H߂Fc4Vd%=Ag{1;*Ȍq+152*ɹBQ M"ݫ-dҊ-He|qGQ88\T-p1}˩@4j?0=?MTU1K[̹_ӴJxW|-%Œ? \:lZvЕ奆.,]5&U Yk,ֲOAa -.Hۣܷ֭k00#e>vCXj+",g8YeʮGn"UIesd$Ml]i}i.-{5nXֵo X;;@ F|^^ydxO)}.R^0qR+EЛoȱɌ4R2nT!JO/Gt]9a$KA!>?*uP-{\X&\lg[u].vȜ Z=M:R3䨨>")j -~*Ӱ0QnA`YrCYZܯe\pLQΥxw kQA[d]Et.qYS6mJ>ZʾB2 GrڦݴJ }I_1cj M7lgㅹ5[?H첎1ěIڧD.:Za۝XAKqX2řg5ǩ7bۊKKƣsP8!9Iu#Cw9k4EV[/ ; - ńr;-0%,&jC}c3[FP| WԢA?Qp]D=?q^{ĹV;< N0i4F=ͅ@‹XW3 U*^jEYSf5K%UQMUɑ6!|CT6Ұ,TZe%lf9T._})Oxe.E (TApjo/Z -=Yrc g{B,0v4eR~K7g&cRzbIWl$`.xRסiM2j/8,2PW'S(k­5,iQ/<Ȱw!l~{aJs'pʻM51ﶠ@C̦$y@SS5?tXX:lF3+,.,)= my;Z󗨺ؼD 1*],Mcw[S -_qecboʢ +\{D -7Tb%wT?2~HNw# DR]|q{Oׁ1${H ,~@14Q)dHTq[7ZFpP ~EYSM'}M5w-BSE?#j<5c.z۶ LD "0C0ep'6Ks:#P%j_k{M~پ!Zi=k'Jw#\nd{跅bī[[ A[/L#hY1#(跍XAlLM5RKKjj[68 f4,^?nf;XEk#4t$7 KE%#\Z(򳸏M{ֱ,Q@ /6 {:dV.ضdl3PDaAFkݺ"ujXmH4wnfɲje}ٻDaJXrLa|ԨR jku!p8B[D̵fc_6Re5ƪhGqI%\:O@̱iRB|l<9=kdHE*j,hv oo˃5q಻ &G7~xAH-7)ian~Ek]nj4PB -U%lA ^ &8'3AZ)1ZJiUȾ (@f9qFl[ʴ!b7k`5uT\e:2]5B4JU4b* a,C` 0~gG~Oǟ`ab׆Yԫ׺Gm|FĚ6F (ty`y+"V6#4&C[hHH%bUXR+MZUjp{#UYfsPFAؙ#/ΰ+Fb'M.\9,EYqtNP5= -IbTvΠ8*RhU6TY(z!SSZXu&V5`_UyF6p MLQX c;/be!\UrJ]C("4T:_@aQ^u. -g -\Ց`V%֎lQ E>ME W?P&4l.Jft*&>vSY!/T*}ʞɝKU:D#7i*)j=)K?ZIGO?%ĹeLK:w>tBf -F>k~\"C;Vhw41TU 3`w-q]߮Ŝ=+|I\ݡlyΖ^Y-Xג,=\ĚM mh2.Yrp=VxVeDMŠ!"cq"LTbbksSj<+_%eVI+P[!ЗF%Ӌx@Flju!]\ 찺:eOne$.4̎ACJ*PL3oV)3hM\l˸Q6lmO4]m/HlBG+ԦjZ$qPN=oJeo!_+bؠRK*3Rl)(Hv,]+*/\Ged-9_ڗ%$I (p=Vb <tÇY`]^_^GL^B -e#fDJjx*}D$_x%b koZj -faFBza^bMWrM5b.BxWt+MCbyTjf jVlD4Լ-}Iq2;Cv>\v\ql/3 `!-'|Α(~SNU.林mbǣv?ZQ`4ZÜOBȀy"QnWωg/f\Z10Rz eqd#zH]D㞥 ]DyZ -T,g?^%Z|JfeZH+\Q2*QQU)A 5f=ԫ(l1A?Ԥ_D镎D"qi7c0.<13ir锝K|pM h :ߛOOXk(Q Z5pƼjcLBu?D {f . 4oDDA2!бs,慂YQ>aT΢镓yrUʝw*J+>Cc2H<Ţ`vX0.#Sepf{*RpF.3UV>HO#C{Un*wLb^`@ey⮵+eMY7ʘcfeQ=}E»fTU3M$:m(o'D>d犀\c(Mx**1I`̃0˒ w0 Lгk!n}S?K:wrb-_B%z;*^/jgemϺ>tm&Y &V7rGOp~q1۫cWrQ-*,VHuYד<`ݒ/YyvE0@2\fݛĤ+2YJ>&$/yELc~n_ v b~[3*{"SQ(L\Üf?O&wolՎ3f> þ-lG/"*j^_Ib-\B\,N)34r-` V:iA}]CLj(_mʫ~RRv@j ԧ/4x-`]& ;>H^2JDaUsʴDQ5 GڐL<ŵ-rrbJ x*VpUGSqiaDJ>!d3r7lA*aXfEh\ILjx+9Wr0Xqm~J'N0,XΛҝe+jbW_B2yyar4v GD{CCu~lw(WߋI0V<5._M5>joUv32kid*4sLۭ]/0)bĴ@ ܸ0ۗDkzٶlջw0m*k.ǓR$^I I1(F$|iDrvSۗ?m&bLԬـ7gf -W q*W/A!FF\G.s/KC,\Xj_Z8N: a6sgᩈ.%NHĉ13vwJ[u VH/)نNZF, kȎ1!폩[΢inѕmˉX*]T=F8SK)dj&&z㪕k[%5<!.@>߻?QKx#)1V"5k_M8H+^ -u(DHfNy> ,;N2 -\OTqˈDOeqSGq_|kp/xeJK7>.xi鯱1jVuz(%2_Y7栱G*Sqj.%@}ˆA{g;J\|Ō]gK>_ÉUq2%2|gzUǯM*&9"@clMӸ}R0nuQ?xTNxIJ;G -cJz?l3bȖ۴0?RG':W؊dkPPsಔWf[PiyZ&jJ1bk| -\Wp1W /jz>`h ͫ%]qUʖiIa&Е -qS b`j3y4s`nٕhtY3sdFTB\\bTmJ>JD#ںfCtABzieix`o[Mepk˓^+<ԭdv琣DU. D2J1ȡ\w;_LO c4E/AhW2Rc9U Uw]$"H#lwr#X -Y-TblFؖLjP"51\WT577FZü|0d[np¶ -bY%>ڔ" -ce㴏L<@c^@D{Va|E!y%|w3Y<xxvUTj"T%TS_S*\1ÌQ_ -% ГR*41R`)N\muM5,ۭK ؕQ8TPh-?]7Xr6E^.ZUkadH9e_F)G;! mUpD( -Ĥ+14Bi$ =-6vTm@u)󖝤*3嚸:*JؾJfc{džZ,-Fh/e/WL-z%s_0cRh4ER(Dku C6rb)\>%L -4.TŬ=}EQk$(- Q!ߓ2(?\h3<,fjf^#q-f:8o=/"g'/)o\3 >GmB>g[a_8 PKD %UcF?QU)2ݽ,9?IM3Aҋ5Jiʡ.>0WB"k:Ք?'ODA]# 0$X83i]/5S7C_jLM_Z`Q -UvAsQjP)BޫKlP۶5/tw(L/d$Q?>R%Fæ<[F5kg/̽aT6 e}&fqvBɰ3P{zRl -ZQڝluwLuEj["l6vI6XR'@';#JoꥯYhe[&]q[cB"~Yxi ~DXe'w.\X.#dd xYeO.; su¡= I rqQ@g۞qA4LCC.E1b_U/2[ uT;>D?J_!afBZR@#o"O !u.=H,K*-\a̼7p)eUʏr5H̹ -]rWMhM - -.g?kZ֖SD -R?zXG 8"1/~%2`4PA9X W(L   jP JV4u[}KCV_->sDh[" W84-,4PZ5>r| QDb/nrA*LGVfGoj qr!_l@M~ yHf評UjkN(0cmonIr?NL{E@K#/05XLٝHu0"!DBWaӇ~ ;I3e#|<%CS(j|\ZS8elH=$aT.0CA}1g!3* -ZAyLܪ dFsg69qP>i Jך&l)mcƻove[_āWgYܴs0['/ -Ĥa%Ex'HdI,{ZQ k*~Fҍ% ]x6n(->(*uaEmqoThyo2/Z4k++qU"ښwE] p.+.D|YdD)h^-V@zJ ~h3zmӡj~T5*KWP5-~%\Ke1tlX·WG5_W^b= .Ыrttb. Fy%QbybٻBV灯YSH4ֵm0JeK*થB]ŷm>w-hWcFk8tcIs1Q%Kgܽ 4[*#nZm0,!¹qPi+SVpTj;Q~1KpJedRo0H?})\s5>}T`?3F([XՔ˽."-s|Yi%S-9L87U #A8ĄGlqkԑ8F$6+Ho>5nSLmVMZ2gsfWiTFweyS] "W"j'è&;dgtqDxQ6`,֠-.0o-1;e1?"2=wsKxk(UK鬡HXD̚X -dAI&Vh5j'a$r;?tӿ,٥_1VTx:~ } 29GШl/ Zf/n`kLJ+¸cͽtYxTInߖⷼKM3;(M*'"Sºȶ \EZx@ԕ)eDWx,2s. T9GgRĶ1azp\ԨƳƥA*TxFI7x2FW>ιY:+ܵ\=bguлEvtTtr:ĤBC$Db5Gݬrxt0 ΎW0} >!u鋄!ڊt}U뇷X/v/2gruh };6F>%U7U ^B.  -Qc@p,umMȾp%x#4͞F V Q,ƫAS^Q^A_,[P Fa1.JGH' -%nXwuS+D]ߚ,K9Zoo}^377E6xjF% TQ?p';MeƅbGrdhi QOaLODЄM[ dwpWP\Y@)sXFOK{|VɊ6Bv>|px-aگQGrLF!rYc Wqzk~k9JM,^a%,z9dla;w,T7SaR)HYOd>!RFGV%PQYYNf4h_%^"61ۉfVŌS -ܱ*z7~%1Lgߕbm=ʡ[E"6buC6HtA{IYB~<)kӄ*SrN97*7kJb)2YgSOKETؓ9`n\X.*l5Tq5{]ZOPx7ڴ0Q(D8OzoO)RU1ǒ"No260DϘc<^z]!*T8Έbڊ(7wR$"3@D2|-˩r՛[⪷2v%ID%Y(#_%4VY"YE>#V}GP88W rGP@pqpn'H1'#L@UK1$jUu̦'7xGr׃:F Da6q;H:'<ʓٝ(ҳx-~8@4JJJ2ǫe8}pEfx1U:`G\f.%Թw%ݘM2|2Wj%O;Uq)N0.%ΧEeڛb)hjZ렲?(Ym)RK,^W"q ǙS+\1*%Ʃ; іJeՎdķ5 'c]1E,1 -Ȭ dUD á\\jj<YC5M .D0#8Mj-cF^톑k(کJ kAͪ06<#bzf7(ke/ΫKRl0֙.덐@-z;ըH{99Մ2(Q^;/F!w(ÂMkP[K0.lY -"Dc3^I+r vB1vYT`L5J3[PM!=JFiĭ _.`{CHt '_V# n -]uRݯ"MLUh*_*U0hGhO"+S u0~mdP;vE;[\Nn[j`&xS~`biRxOIf劬WaW?Q+Gy -WPaL 2 Bn+KBU(֮l`r'+/3^pije1^ "bXBK9(cK R$:9{Ur"#ƣ=1P ٲ ZG'~5Œ7.Łcof|b-bR)(D9CF&Hwnb]ClID0 U"P˿P5 -CDaIxB5tO8/+CEQ|,j/=͵j'mT:\\rb ~ Sj#H%cyg$N7鈥j#+n=`UWJLE^jl0PIڝTZEf2_%CA@.aL6A]ʂZƭ6t7 mf3nIɀX(mTx욍ZCӸa:f4 ~DxTx!w*qkYW:v,qL lXRRO&X9ժ-$y9}Ao˙SETg֟BQu+f?y$(caLB ? k]D_ʯ]ʄ0"`U6{(k |lp%1T׳Jcۃc6+*iR:T>҈j )к&X"77B%hJ' TXSq[ U -D!]㊢M5]B}G떍\ޥB+g~9 `hu_H^DT%} -ȸUR%b2e.VqP.7yx8q~*W%Дl\.5\X}q.\7gyW*7>s/n,>'SVWܺ/<1.<įs >:&[Ő£emҌէQ̃#g}H$zA>,YQW3(Kj[(|D!Λ>XWψ2 D}K' /Oxr :U>%/옍^y +nf8,i2BPFAjItĪ  d>I`^0'(Iư -!_@_-2DD&[z&?PP`kK#kL,ٿԓۚc06"-QIʝ-W4ܖʔIDʖJ!~ -,so3] wmv&eg\~ hSa.&c~XHE6$Z}0Ux{%"WG7T$׋5u,U_ - -4]纺{)S %-5< - `;\ucǮ@_ƑU11Ad:µI˲/P9/ -YjlvmV -Ң@CrSX;sK!3hcVYF_kn݄rU Lu:Tb c;Fn&0QgPRʠkX#Wme/<#U!LĻ+,8&Z` K, M#Huш-jգD)Yr R -E#KoVvˢ!/S7R0<e+KNba3/0؁8xZ-D/w(bTĴߞ*nwu>у PfV&f;Ԭ|r Zx9l$y^%M̨6#bʗZ'Kj +[jSx*/6wUf '.rŦ *W< Qݍv7[[ 1zR -ȵηd XI3|ox$#WJ0pTZqVj7{F"UB .u::Z=q~&iPs/dz]^Y\aɯxq)%㎢)PF;f])eѫ؆kkpWKW sp;"Oq2b⬇yeğԍHαZ`O0E6Sjч6JcLA!jcl.~:ܱ뭗R}6:P4w:.iKI3#5*0kP[Un4, -~N b'bBA2ER؊he/!-2OԲJ X,\7oTKV<% m kX]y#+#6&3B[;d ]h%hX݌ڇTY}De|~"}'\K1*S!o&'~6X#Qw2J5~b3 -c\\_xx*j,'FYվ#0;WO >=Bjf{|'gxyW\LB\8x9_ "~3EdyfvxAi^$F?=aTG:Rf'gv||_ ح{XhnڋD]|AYXXMHTYJUJ]C$ùz늉x ;qCHvZΘ?D E.noK%H$v JPa FLrER[1PCYRRTCa4=,ko} fuSP\rn6 Yl폜_[5,F7G^&pA0u`GKNorA ڬx, -ȴUZLG2AĪ1Dq-2'Z̭%jJ=[,(PNՈq|&)_]@]Ťv1>@RɥE.3D RT$JNYTɳ=z8lVLKsPKjK8XuisT2eEkBX 脝 Fe@s}tpʰ[%3m[Â.A%]fc0ݠ5N.-ꪏS 0`2٫\[DYR{lKuY- ܂UDhaCmnjGQ)kؘlcR4r\? YE+o\W 6BD0Q&-ZPk[2 odL->,#W|\ >D#ȷ+urJc*en="WQ*f+\2|1p1"^ Իx|de}wpG\;*\>+C-,'P%p]􉠀:{U/}ȇ)OA=+kA%WW@$Ww1ak<}Ŗ` {*{͵1*6]^8#s/MdJ4&F[@5se%p-Wzq5g5=;En6b2`tUkkA(*`֭L-3}{aY -EiZ_eT7_C@ 4ޫE(?iUD[ Nhq"O1*$Dp@5-vql UA^@/GV"!H:쀖+Ԓ5s]mf-jzQw+ 䒗'Pluxja=H -0.\_oWb5gp  e7+~8P:+!wJ*eB@ +Gd A`C^uvt{gEX5=w-vMʔOfC1|Zbd1W ncQc] AG: }B^yF~ ܨs2%Cp&/2WA#UuL%k3Or7-fW -{ -^㊗V^ضݡԔ-tjZjg%m~ [gM>mDkMq(0W[Aۯ}1U7X6?O=FҦ$K.$j*t: x St#:H {*}6w@joy[<' @trKkL{9Sxeэh6Lw.Yς$C*ş2qFG|:߼ <ěj]%Z`&l9CPokԱjS|Q¡t Gn8WĭM*Ui<@VaGr-AOWXUGN% ̑LOV ->9uJ"ZsT\xwPJTU8 | $\NGt%Ywڲ̐cݕ,Tz2b1hBmq6 ]U%w(8JyW,l!fڗ)6. E ڑ=p}X`U u,+ -(&bPwT.m~cȴ 4ʄ4>WQ5nwTFƶLM]ݣ`ɵ+VدH#P]B1~q|;MmL -ᙾ2Lnv_ (bqy*RZ)1QO,|Y3*3Iep__UuƮ-3'0RT~G -o \eSsfR}|*⧨\`*{\/\#+uX-:q4;j}qc>D~}r?4Vkn&xNIUFb3\蕬,ʱ29ik0M {Qq mڽɂG -*_ ~FQ" MMm ->c冋 <ܛ8@{$+o܅a(/߉@75h!p4O ,03 lᐙLf2P{h.c~L(A)OP!z*}dM-t1clGWReAU7lBט)S\oAG0$/Vu<k뒌%5trYZywƞaRL07d\5ӉV/,dpEy4%F煷?RPTJ0]6XW;L@C!_$B}f,~T<1~":yRJk_@!<^1(ԤU; Au|a},CE*U0*UDdu|4]cH'q, dx5 -o\_5;DR+:v܈ѩFC;.M3@Gj-I,+GJTK;∎*b. ^1:b\T0yp±6Uw;%Cp\CEEW ZMB}t'IߡAaGv{R %08 yg uT]7/NÅRUi^l#15d{ t@˨|jMMх VչoÖfB4YwrڱP|@qk/Ĺ؇#3;_@ -#^xnL5w;"`? -w:>d@nQ0$. -n}) U-èbJ5ՠf%:FXz4t}haHbZC3 qb -ew'zcjN/Dq}'QO2*7lVYSP1SazZ-I/Tֵ[7~0AU˿?løJ-bW/c%ЉR(pGe,U <ܪaQI_QQMEeNXU7ql"zɫbTtV -gͽ&d앩@Z<.;L^aW2y( )GMM~߾d;R\HyP;LA :ؖ mWE -,QV=I +M`j`L=Ʒr9My8:fHxl8èo\>] =WP~O@ʏ‡+ƣMݺ徉J2]hUpndK}C 0)Yf>@e|,&p AR% Ò*w8uQT[+1{rFF]8 -L$=8y` ((<;8t`05F,k2%E1OHaqs bZjBՈ CK' A%ш !/4Z[감 (5:)< H p_Q1\7u61`#d#qKR3φRdn_h,3K EqP%w:FeC_ -IA@e. tVb@Jb  (5b aa#pҘ= L!x6Yy" kUܼj-s%A{+Ll*i !B6 #0@VGERo--A4 TGz5J>AC7=-ϪP~z dP{ȑM쿍sieq#e!<ʦ -PG4F1 p.5?nI|/,⒂1QmТAUh@Uq](ʒ-!)]M- c8]>T:7kDÓ$yb6,PbVU膕=ktdMYNqV8f@eM_ 9"[ktQU#*TzWk仦JS3^\Kxj;ʏ -L|U~IʭB(vcYd --&@,X&ni6˜θ;= -{v}9>\jmD 53YTzEnI|/HYMT!FTIw%Jx-]IJ? K 05a&Ys -6_6Ӫ)VW -5xV1{09,ulh}BH{Oı8YG2wuK(8P,=θjb|DYN?ygW,rʹ\_ܾO㎸KYD2 oڲ\25JCow)G e>ۨH UӶyv jpcz ǍK,(~d2Zmu-w*T|jͳR#ΥƓ&Yl!Bcplu=2ʼn~H U2ɸȠq^-ZqlL,$pUTpP $ d0YcD0RP]petg$jy~)|PqA{*]gSo3^Lǘ5"6bJ\ kp%[>pҶӪsr+=A=/]"v3&!\̹~% 4[SiFXNB:Em -_Y4L vb>+RU,z.|=:/ ˬ ]fO!fl%u.ƦZ]5iG=lo5ɶ6xxp -AYH .Ny[DuLT+NQ2\1d~:׀B,0υwz%!q/qJyn4we;٪?R_3)) "ì{rG!GQIUI8A5V~Ov~R7sme1F jS*dknSqHD#R=D\b{'?O|sc);&ofxߨu|wÚlc068r}R1]vwu؉n~һKo9::_DpL%n_Rw@T#\ xP -\\A+zS{UKe!jiM u?LΨ;!H"Fc:0[LUWP4"DX"*3]qDz$-PA@VR7eԌmN|$ Xm,ꊝ6਺;"rĦNt_ſޅGU QOAGo¡&&c_)xu#5p?S?( H=%wl3T,^ߺ ÛS\e0dc%I_ЈYk(Öb*.iiR[<),޺⴨w9dU2V9pj춅ΚP#y|4X<{Li߄d2˦$)bn2z=$VYi(=5V&AWܫ-E2/ę۰5XArv\?FB4{*o -9"jqv4_;.$7j5ՈZׄtnDcQmxPM -Jj<߼!Gd ٩c1\sFcr-ħ? A? 6-Iڃ!m/̵;]qvjRo&뷍XƆ]i~ޫ 5. J޾NlטF$E|OW_B*1]:|I%Zf@v^IhYx65)R: ]TČ7NZL|$LiW(Oj/SZm{z_emn#'|~ii545 -e*4 4<;KK {*S!Z{)X PE2zT)!Q?*CV0wkUF ?t*hEK3@PZ#S VEVŗl ]e*;PFb,A} -~-eH5aY - Į`k+y*@Eltr92AB:T1rZS3J ;J8RYbk?/4H7AiJ#tGwM1ZjD|Y)ˌbQS+Yq `_} ]6NPGD\w"x^]G_us s"žp앣nYaw3eb']<F'Fp7+Wbfo(TăX]0ԗhoƛҲD0OO.fHu;7+ P"թ{t)D%&+Tu,($JP7^(ԩyVGq:S"_G%mĬu*Q&s}!W K91+cs5F/ +T$fQ_LQ%)Ƌ6YU< 3_i Xa8/8X -U˓IV$҄m& *) p5xzVvR}4Ab ސ ϓfR -U}_ -~m&*f:#2G ` m@ qBu3.\ekV >n6]>Cyr&PIԐcw05e2Ɓ/kA:-*,™2HMH(`UJ;* -IwKZ!( #j~ZꊃCͰ:_KQ& -?cIM 4<\F3jxCmrЛ_-cWC !u1)]TPAfqJؕ -;.EJ68aHZbStu$F557&)Q -kqsl`SD`66m#|'~(*[Pl# Ns/\S)ͥT^CWpݏCZ.^bqVCW³.WAsrOrdX_Cie3*QyxRc~>ւU+膱 lǙ=T+6Z梥̀W*+~9 ={XR8R~O =aMD ZypKYT=cm`,JTʼn$\oa=K6Bb w X_mSH!ZYQ|4DR%DOm~N$/Q޾G$!eit‰RT rWĮ,9QZ -Ug!N@. 45٩qWJ&5_O tY(Wؓg 3H"*V!is -L h 0RdRP`hi( -f~Y8TR^0 Eɨ2pOeeq஭OWU"B[1pw+h5e%!\ -'eƪ-fT4OjDa\V#]peNl2@tPr/ܯNQ3 !VgFvmL-Q% 3#kLUtJ<2SffXĭ&y$’ח5pg<Z)w(IQ([. p5^ei}FiؙVVT#}I*l%+5v#%_5r|-TeV &jjiJ9KLLY#cE=g2=Bj -r!UCs*07IGZOҚ̥GQj b2ub(&H@R߆CY︚*kFbZ5JODyJfp:R$}ky-ũwh~QqQe4Y*;0*e1"07< ̧vhQ0\w8mE -RZI=v\f̧/;Lq\n \E" x9)EĢ^()am)%3K9řC(_5a]U_ w߸zF[GgV]sPDpWyIFҊo х _,،*R wl*kfq6 HBi<O %OKepyhI\,UpFQIsܻ13|1(ܣż8cqĦf"F 7r0*W5(-~L|@%D6 A=HjQ vm'a,@{P}#gR* 5!Eo -9۵[8Tuma)XN{O%D3s -;}T% wڠShm.8~Ԉr7Ka`Vzr|NQ~d;), e䃊P& %@E٫ сvW[+ AH"bD=O5ji}(o5O1$ N NP.hTYxS;;" X%C,sՙٯYX &T;nbf<{Qt-m`?%;KG#}1 wa6ƚ]WDԛ)/l%c$^j&[VaGNx,qy:@[?_X3Xg ]^c_5kolAINF\IC)Pa"BkhQ'52_Q~U۱CP\ƣ}r>5((bk!3*論v׋8XZ\auQ6kQ2 JTHBr (Wc?T)kѰU`-^h<kkˊ+FpZA*!eH&ɚ|(?$ t N]zEjb}ծj _~0-ᮻ:cv!W -VGV +LUjT*M b_F5gq3t肢宦KW|?Aٔ6~.1+V,f(PM@:ůlgx*rFYt\⁵.[fPU?vC c\ rJҺ>,C'?lxIJVYon~l`q_,<NV5WX`(׉Sּ87Hᡌ0>8DDH:" L{렷|[) -@PJZ*JbCj;5'SZmeD ٘6[$eqP錻cfAt٭$O`__/+O~TtB>3-S=~UFFeV}5t4t@0w.E]x q쎩WAzPUqj)-éO AGctH $l~6 pZ%@1!V~*5q\!Il5 .TQƠfxJ}T62J8q"b7Q %x@14 q_ LCqᗨJXLk־*ט:Lq cork`eHzp -p[擋TFgu+& ⊁)xعU8qnb,2sr*?Ԫxi*tn ]C s9;!,,8#S8yl8jq]+ -YRƥ -: l/"M&~DEw,u$_A};!l)"ڧ<5;5 -,@+|3ƍԢYrøаt^[EeWN -3~FBjOj<]CG#z ?>nʀ}W. K(*2?z;TBvGfcbtUeQ|^@{tL"ʕiBn[*f9vˋ:(7.e>qQቍr^cVJ)e -C+̃b%mZ 1b6`0Ic?سTy"Cx>x54!|x^RdDZok>KMFb2Ql몀ScA;ԴlX.)-D~p`wh9E3IV*C֯N"; A۰ -q׃rt՗ /˄sW@QfFhXRbf5p(~74y^Vlc5P55m 5kpni-p;͒czBE@1)-ӄOha5>-Zŝr$醳Fo#G-L,Q3}bUz5Q'sD5q,YS̥Iw*WQq'%Nƹt@w*٨!r\uJL8"L㡨2L3R+3URe0|u,f8-Y:LnQ^ (!)|Ҭ+/O1j,ʄ!8M J`.6dU+T`\᮵ -np>묦UY u{ -+/]jRSdQoChiXC;eHѻJ2 KIW >ԧRZ7wx.,C`fRD*_bFWt}V&`5 -栲({ܪ0W14!b9k^x0{7 lB1 8v3n JА>0f]|jt_(4@recZ8=&,HD^鍜\tѥ- '#yj2񏅜0f3jRc1梴qpe'o`qP xԲ.'*#sWģ?ܷW=2O 3\U$x==|(?6C2wo$*W7rS0bf^$|hs~,aG>9{Rpz6HVT\1y `˗ZZOd/iRj0h dHPvP[gbΪ^/\p*#!a_4v+>'K%9'P 48E84wY\39-iU¯CW[u i淹E ?K~0!Kt]F>kn`II54RO۶ v`+!8.ۙb[IS-P}TIjh{\ wud`eYx6ӹVjWi0eAB<էAU.g~o+Prv)/>6 %b W3ÁP*JP}Ar(8f -R1x@$RRE3]Ww57sXKfkĸL/ٟe^f|+|85ZC3nwKTiƧqX]fR_+,dil(вՌu2ړlqo\1NX4+&KWM_a5Q%<9|[EԾ1ʔ@;_=\൚ī@8\~'%bMIuOfkR/l1fO# 0*TK~%eԸk㙂2K FTf_=W Ve& 97+G lSW̯f8|+8KN]yB~| TV$JҪh}/t|Lwh5JszҋO[F[MS{-{b*T/@=ǿމ}8,KFf -a8xq\6-K+/<ȥs6%{J/N$ `P+MUe;3;dE*WVX -rX(c$KC57JG#}TmP!TI) -h{io?IqX-U.xtE51Իcwͱ@|qo،^-ܩRN.}J%Mp|1\ya0upj!\*8棍7+%'.2o3>R}0[n\3U6uy?< |D#q8iBb{E]SsC̷wQ#}oBi12⍿iU`'I^+)JMz8bnY4otWGK[}C|ىQ'g?=ʎ79|c|˼ERQ#o,_ % "cc7eUMCsK3Sc n}N.±FużSUq:>8ԳQ3/Qx ,(oBkopy5/Y.#+kLs|uqi˚r? {=ApJ)Q ^JيafWV.mHF%ukaؑ꿨TB`btNo&T-  ]!KH~ %orG s \"o]JdɠUF :'pRϞ_Tq h%|3/Lc*\4dž~_!+:5|[ǯW9ᙨr˸ Mwlx.V'ZyN~!' UqW n,WR.cbXwc|L˭+p<S)%B:/Q&aFNF*==~ pN5;@}FE~cEm;\/ EG:Ep>'rdRb/Ÿ;9q lʿ _ĹGs: S2*^ Q-ؕ<ݕVtx"6&&>100@P bZeSFr{'fnL%)@D{%ī.oڶ } iX#jhMF,y㯁0o 'xMpy)K`ԡΧhx^ -i8W; u3b EJq(mk4A5?00UBfd+J21!%>4xD+֎La_cUE%Fɣ 1kas@r?K!=Hx?CF_M/$nf3kljVD5Njj1<\>nFj+p#8R$pzT"bd.[@ i)WK`w-1Pb HW~k\Wί ~;_-uYe²pjĸurIm%X~b&Iw7aj5^)Υ#/v0AG+ -Fqv>+q[$~1,/WeXraRTw/0 ?s/ypGaZlTzb7qd\lVd, P-5AҠ«0*UbU#('Oߨ⇱۹xQD }堿)AL7)Ijy/kp> VvDZ*'ϋ|_)[2T\L[4G^xW[8xME\ز P=&TN #Ic!=̲mL9?kqA}I,[Jq+H 4Ӧ.4X_(]J wq| EdDQ_HXMu"A5, [_+̮j%B%MDQ3ƒjL1О3$H1KKPf} -q#T#b5*$hePz1j*7*A~R{a+%'Ģa -`Zlf,-X#1+$9*X1p98NS.)xR/7\w.W1ʱL#f7/L燞inUcO֡Ci! 6Tq~SX>>b:ܨFn8;2pø7QwL:qfTG -\3X?p?q#!!~@EþXi0 -҈֤{uzJ_1~ca&ӉG7GҬn]3CMO"z?46mJ)Rc>yd ˯ԝ*z?j|"=~X.C=X,6jeJ+Q-?[.!lL@gc9+KVŽToqU{.|lʬ)J]/'H*]}CEIGqƗܫ:b.c73Ř=9?! r?n$d$ e@SS\p`Qb6N%pE橘*Q5_Tss\xc\|+"fb*VH KѹjQR[ll!>mg#?`?t.Qr{ƵQN5bʿRn=kȝtYKn~ e[E^0WK8 joaПLF!%⡞ڌo=B *$le׈YJJ@-h5 +0Tl R|ܱ킷 rRxDb>míh6Ewe0VƶQfZ^]imIpq0!Ŵ`B\42raK qvKbe]`.}C -#Va D.ETr^d74M!H*{ SjF >XU@`U\l,CmEaEԹHH5^ -ߋ5I@)4p*Ӆ\a0Lw,U@}*"ǖaۈMt)yx-zA.6,rc-J b`_QUCN+\**J98,T@#߈6Cf^Mk <歃 u0HSQIqHP09qjDu0 c(XV?ȊH#BcD1q0/50r9]ՕJSII*\ -)GS7And"-O"+Ru{Jo$-1sba3jxeR:;^<4P¿2xUhS!pU,dDA c;h#PXBtǵHh -sɗWʛ0ƋCeb.0&˪no*5heHb,Hy"4#p*0{֡-%4r&Aj#d05MJ*e " -RasRq*TRK M@>HQvEj8zyZe؂fsFW}JlU:u( Ü$wN*[@l.fPf)ISY4Gf; ֪[įU|„ \!hCh2Wp,4Cߙ\WbZ!p` 0P@ ?OBNz{cs'r|z9Fba݆3oK_GD$rmӶDZo3̰Fy Q l3i4׺(;<9k4όI_nsn:eI?I %,p@0P ?'ćĭ)k =afV#p&? -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000010057 00000 n -0000476482 00000 n -0000476613 00000 n -0000476811 00000 n -trailer -<> -startxref -476948 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/161e5557-18dc-4efa-8259-303d26870b97.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/161e5557-18dc-4efa-8259-303d26870b97.pdf deleted file mode 100644 index 3f0b2db..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/161e5557-18dc-4efa-8259-303d26870b97.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/167d327d-8de7-4455-b7d7-04565f267259.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/167d327d-8de7-4455-b7d7-04565f267259.pdf deleted file mode 100644 index 80423af..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/167d327d-8de7-4455-b7d7-04565f267259.pdf +++ /dev/null @@ -1,1370 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 178.3205 0.0000 0.0000 792.0000 0.0000 0.0000 cm /Im0 Do Q q 0.2008 0.0000 0.0000 0.2008 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -26.4373 0 0 53.75 33.72 3197 Tm -(CUMPARATOR: ) Tj -24.5399 0 0 53.75 240.75 3197 Tm -(ONCR ) Tj -26.7807 0 0 53.75 325.87 3197 Tm -(BLEUMARIN ) Tj -25.7374 0 0 53.75 496.73 3197 Tm -(CONSTANTA ) Tj -35.1824 0 0 56.25 50.62 3144 Tm -(CIF: ) Tj -34.2274 0 0 56.25 122.84 3144 Tm -(46598884 ) Tj -22.0822 0 0 53.75 38.97 3092 Tm -(UA ) Tj -22.634 0 0 53.75 90.89 3092 Tm -(RUGAM ) Tj -24.8252 0 0 53.75 192.54 3092 Tm -(SA ) Tj -28.276 0 0 53.75 251.86 3092 Tm -(DESCARCATI ) Tj -25.3555 0 0 53.75 430.85 3092 Tm -(EXEMPLARUL ) Tj -26.5191 0 0 53.75 616.73 3092 Tm -(ORIGINAL ) Tj -22.4599 0 0 52.5 41.95 3041 Tm -(AL ) Tj -31.2942 0 0 52.5 101.85 3041 Tm -(FACTURII ) Tj -35.1193 0 0 52.5 246.61 3041 Tm -(70005116259 ) Tj -0 Tc -52.5 0 0 52.5 449.98 3041 Tm -(/ ) Tj --0.035 Tc -39.8629 0 0 52.5 482.75 3041 Tm -(20.09.25 ) Tj -28.3949 0 0 46.25 44.86 2988 Tm -(DIN ) Tj -29.7334 0 0 46.25 111.45 2988 Tm -(SISTENUL ) Tj -22.2107 0 0 46.25 263.89 2988 Tm -(RO ) Tj -27.4739 0 0 46.25 313.84 2988 Tm -(E-FACTURA ) Tj -61.8391 0 0 65 288.69 3535 Tm -(DEDEMAN ) Tj -28.1591 0 0 58.75 180.84 3407 Tm -(LOC. ) Tj -29.3359 0 0 62.5 272.69 3400 Tm -(CONSTANTA, ) Tj -25.7498 0 0 57.5 463.88 3397 Tm -(MUN ) Tj -27.3243 0 0 62.5 529.71 3390 Tm -(CONSTANTA, ) Tj -27.1599 0 0 58.75 165.87 3354 Tm -(BD. ) Tj -27.7633 0 0 58.75 235.75 3354 Tm -(TOMIS ) Tj -39.6469 0 0 58.75 341.16 3354 Tm -(NR.385, ) Tj -30.4592 0 0 58.75 478.82 3354 Tm -(JUD. ) Tj -26.0852 0 0 58.75 564.72 3354 Tm -(CONSTANTA ) Tj -35.7687 0 0 56.25 335.62 3295 Tm -(CIF: ) Tj -31.6999 0 0 56.25 409.84 3295 Tm -(RO2816464 ) Tj -33.9929 0 0 47.5 51.63 2888 Tm -(7075929 ) Tj -28.7974 0 0 47.5 183.87 2888 Tm -(FOLIE ) Tj -20.4803 0 0 47.5 288.9 2888 Tm -(DEL ) Tj -36.7273 0 0 47.5 331.73 2888 Tm -(IMI ) Tj -25.7385 0 0 47.5 385.77 2888 Tm -(TARE ) Tj -23.9311 0 0 47.5 465.95 2888 Tm -(ALB ) Tj -27.1605 0 0 47.5 534.67 2888 Tm -(-ROSU ) Tj -32.8509 0 0 38.75 50.64 2851 Tm -(701M/500 ) Tj -0 Tc -38.75 0 0 38.75 199.81 2851 Tm -(M ) Tj --0.035 Tc -25.4774 0 0 93.7501 45.77 2496 Tm -(TOTRL ) Tj -28.139 0 0 93.7501 141.84 2496 Tm -(LE ) Tj -24.9113 0 0 38.75 43.73 2402 Tm -(CARD ) Tj -25.6993 0 0 37.5 43.87 2356 Tm -(REST ) Tj -35.1085 0 0 52.5 53.77 2763 Tm -(1050871 ) Tj -24.5917 0 0 52.5 181.88 2763 Tm -(HOFF ) Tj -25.7262 0 0 52.5 265.52 2763 Tm -(SET ) Tj -0 Tc -52.5 0 0 52.5 333.67 2763 Tm -(2 ) Tj --0.035 Tc -30.2064 0 0 52.5 367.85 2763 Tm -(BATERI| ) Tj -34.2055 0 0 52.5 499.8 2763 Tm -(LITIU ) Tj -31.2467 0 0 52.5 600.63 2763 Tm -(30 ) Tj -30.9371 0 0 37.5 45.67 2722 Tm -(CR2032 ) Tj -20.5684 0 0 27.5 331.79 3505 Tm -(OtoICAT ) Tj -19.5044 0 0 27.5 416.91 3505 Tm -(PLANURILOR ) Tj -14.8801 0 0 27.5 543.87 3505 Tm -(TALC ) Tj -26.0315 0 0 47.5 319.52 3461 Tm -(SC ) Tj -25.3645 0 0 47.5 371.87 3461 Tm -(DEDEMAN ) Tj -21.9978 0 0 47.5 511.59 3461 Tm -(SRL ) Tj -23.3562 0 0 48.75 46.79 2675 Tm -(TAXA ) Tj -27.5161 0 0 50 136.87 2670 Tm -(MEDIU ) Tj -32.7448 0 0 52.5 231.84 2663 Tm -(BATERI|: ) Tj -37.5756 0 0 48.75 383.6 2658 Tm -(0,02 ) Tj -31.6218 0 0 51.25 466.82 2652 Tm -(LEI/SET ) Tj -25.982 0 0 46.25 44.77 2256 Tm -(TOTAL ) Tj -23.8877 0 0 46.25 147.79 2256 Tm -(TUA ) Tj -0 Tc -46.25 0 0 46.25 215.77 2256 Tm -(D ) Tj -46.25 0 0 46.25 249.44 2256 Tm -(-) Tj --0.035 Tc -26.9481 0 0 46.25 281.83 2256 Tm -(21% ) Tj -26.3028 0 0 45 44.77 2209 Tm -(TOTAL ) Tj -23.3794 0 0 45 148.79 2209 Tm -(TUA ) Tj -23.2858 0 0 45 214.89 2209 Tm -(BON ) Tj -26.7848 0 0 45 45.11 2158 Tm -(NR. ) Tj -30.2332 0 0 45 112.85 2158 Tm -(POZ. ) Tj -26.6706 0 0 45 199.94 2158 Tm -(ART. ) Tj -23.8736 0 0 45 288.83 2158 Tm -(IN ) Tj -25.6592 0 0 45 333.88 2158 Tm -(BON: ) Tj -22.7903 0 0 43.75 48.76 2017 Tm -(COD ) Tj -30.0301 0 0 43.75 116.68 2017 Tm -(CLIENT: ) Tj -33.6628 0 0 43.75 253.82 2017 Tm -(14015414 ) Tj -38.3187 0 0 48.75 32.76 1313 Tm -(20-09-2025 ) Tj -23.8736 0 0 42.5 36.83 1270 Tm -(ID ) Tj -28.1962 0 0 42.5 82.75 1270 Tm -(TERMINAL: ) Tj -27.951 0 0 52.5 29.7 1214 Tm -(COMERCIANT: ) Tj -21.3943 0 0 42.5 53.6 646 Tm -(SUMA: ) Tj -25.4451 0 0 51.25 26.96 1119 Tm -(UANZARE ) Tj -27.2521 0 0 51.25 163.71 1119 Tm -(CONTACTLESS ) Tj -42.7735 0 0 46.25 41.69 316 Tm -(ID ) Tj -30.5528 0 0 46.25 90.85 316 Tm -(BF: ) Tj -21.7942 0 0 40 183.87 1832 Tm -(LA ) Tj -25.5751 0 0 43.75 233.88 1826 Tm -(PRODUS ) Tj -23.7411 0 0 40 350.56 1822 Tm -(SAU ) Tj -25.537 0 0 38.75 417.53 1819 Tm -(SE ) Tj -24.4085 0 0 41.25 467.88 1815 Tm -(POT ) Tj -30.1935 0 0 46.25 534.44 1807 Tm -(SOLICITA ) Tj -22.5725 0 0 38.75 684.87 1804 Tm -(LA ) Tj -26.9703 0 0 47.5 248.87 1780 Tm -(BIROUL ) Tj -31.4765 0 0 47.5 366.41 1780 Tm -(SERVICII ) Tj -31.8043 0 0 47.5 516.66 1780 Tm -(CLIENTI. ) Tj -29.3332 0 0 57.5 39.94 1019 Tm -(AID: ) Tj -34.3135 0 0 57.5 110.92 1019 Tm -(A0000000031010 ) Tj -28.8109 0 0 45 21.93 974 Tm -(VISA ) Tj -27.2945 0 0 45 107.87 974 Tm -(DEBIT ) Tj -31.6476 0 0 46.25 30.85 852 Tm -(BATCH:000434 ) Tj -33.4457 0 0 63.75 35.83 805 Tm -(RRU:526313235505 ) Tj -31.2435 0 0 58.75 39.93 770 Tm -(AUTH:806608 ) Tj -0.05 Tc -36.1143 0 0 33.75 110.24 928 Tm -(*ttk ) Tj --0.035 Tc -29.1515 0 0 33.75 204.39 928 Tm -(**** ) Tj --0.0232 Tc -33.75 0 0 33.75 286.52 928 Tm -(5110 ) Tj --0.035 Tc -35.1885 0 0 43.75 41.87 365 Tm -(Z:2348 ) Tj -23.168 0 0 43.75 158.89 365 Tm -(BF ) Tj -34.5101 0 0 43.75 197.12 365 Tm -(:0164 ) Tj -0 Tc -45 0 0 45 497.42 2834 Tm -(1 ) Tj --0.035 Tc -22.3296 0 0 45 516.89 2834 Tm -(ROL ) Tj -0 Tc -45 0 0 45 582.91 2834 Tm -(X ) Tj --0.035 Tc -35.841 0 0 45 616.84 2834 Tm -(49.01= ) Tj -37.7142 0 0 45 741.83 2834 Tm -(49.01 ) Tj -0 Tc -45 0 0 45 832.52 2834 Tm -(0 ) Tj --0.035 Tc -27.0588 0 0 48.75 83.87 1966 Tm -(PENTRU ) Tj -26.8315 0 0 51.25 200.87 1958 Tm -(PRODUSELE ) Tj -23.3509 0 0 43.75 367.86 1956 Tm -(LA ) Tj -24.0404 0 0 46.25 418.74 1951 Tm -(CARE ) Tj -25.5369 0 0 42.5 501.53 1950 Tm -(SE ) Tj -23.7672 0 0 47.5 551.95 1944 Tm -(ACORDA ) Tj -25.1705 0 0 50 668.74 1936 Tm -(GARANTIE ) Tj -23.9844 0 0 52.5 185.75 1912 Tm -(CONFORM ) Tj -31.3009 0 0 56.25 326.82 1902 Tm -(LEGISLATIEI ) Tj -23.8736 0 0 46.25 522.83 1901 Tm -(IN ) Tj -26.9165 0 0 52.5 567.93 1894 Tm -(VIGOARE. ) Tj -29.4677 0 0 56.25 101.69 1869 Tm -(CERTIFICATELE ) Tj -24.6249 0 0 56.25 335.54 1869 Tm -(SE ) Tj -26.3337 0 0 56.25 384.87 1869 Tm -(REGASESC ) Tj -22.8789 0 0 56.25 539.83 1869 Tm -(IN ) Tj -27.8369 0 0 56.25 584.7 1869 Tm -(CUTIE/ATASATE ) Tj -34.7421 0 0 62.5 276.63 1484 Tm -(000CT70005001122509 ) Tj -0 Tc -42.5 0 0 42.5 533.51 2701 Tm -(1 ) Tj --0.035 Tc -26.3245 0 0 46.25 563.51 2697 Tm -(SET ) Tj -0 Tc -42.5 0 0 42.5 619.91 2696 Tm -(X ) Tj --0.035 Tc -34.7593 0 0 47.5 651.84 2690 Tm -(4.69= ) Tj -36.8166 0 0 48.75 751.83 2683 Tm -(4.69 ) Tj -0 Tc -42.5 0 0 42.5 833.79 2683 Tm -(D ) Tj --0.035 Tc -34.3322 0 0 53.75 40.36 216 Tm -(S/N:DB4800000106 ) Tj -28.6021 0 0 43.75 40.69 176 Tm -(CASIER ) Tj -28.333 0 0 43.75 161.01 176 Tm -(1: ) Tj -28.3879 0 0 52.5 195.12 496 Tm -(NU ) Tj -27.4466 0 0 55 247.11 490 Tm -(NECES ) Tj -32.2725 0 0 53.75 330.76 487 Tm -(ITA ) Tj -38.6719 0 0 53.75 396.81 483 Tm -(PIN ) Tj -23.7411 0 0 51.25 460.56 481 Tm -(SAU ) Tj -24.2191 0 0 60 528.55 470 Tm -(SEMNATURA ) Tj -26.433 0 0 48.75 280.76 443 Tm -(TRANZACTIE ) Tj -25.1208 0 0 48.75 460.95 443 Tm -(APROBATA ) Tj -25.1602 0 0 47.5 309.85 395 Tm -(EXEMPLAR ) Tj -26.8305 0 0 47.5 460.71 395 Tm -(CLIENT ) Tj -39.0381 0 0 75 767.3 2460 Tm -(83.70 ) Tj -25.5486 0 0 46.25 191.87 264 Tm -(DATA: ) Tj -37.3953 0 0 51.25 292.76 255 Tm -(20-09-2025 ) Tj -25.6666 0 0 45 476.73 252 Tm -(ORA: ) Tj -38.3001 0 0 48.75 563.66 245 Tm -(16:17:35 ) Tj -23.7812 0 0 43.75 358.89 116 Tm -(BON ) Tj -28.3003 0 0 43.75 425.87 116 Tm -(FISCAL ) Tj -0 Tc -42.5 0 0 42.5 351.79 73 Tm -(R ) Tj --0.035 Tc -34.6801 0 0 42.5 377.79 73 Tm -(1000006302 ) Tj --0.0314 Tc -38.75 0 0 38.75 767.45 2358 Tm -(53.70 ) Tj -0.0016 Tc -37.5 0 0 37.5 783.6 2312 Tm -(0.00 ) Tj --0.0239 Tc -37.5 0 0 37.5 784.56 2219 Tm -(9.32 ) Tj --0.0331 Tc -38.75 0 0 38.75 783.55 2172 Tm -(9.32 ) Tj --0.035 Tc -20.6575 0 0 42.5 174.97 38 Tm -(UA ) Tj -23.8516 0 0 48.75 224.89 30 Tm -(MULTUMIM ) Tj -21.7816 0 0 41.25 374.77 28 Tm -(CA ) Tj -25.1701 0 0 42.5 425.95 24 Tm -(ATI ) Tj -25.5531 0 0 45 492.95 19 Tm -(ALES ) Tj -24.3296 0 0 47.5 575.88 12 Tm -(DEDENAN ) Tj -0 Tc -37.5 0 0 37.5 834.76 2125 Tm -(2 ) Tj --0.035 Tc -33.4627 0 0 50 684.84 802 Tm -(BON:000070 ) Tj -34.459 0 0 38.75 769.83 763 Tm -(RC:00 ) Tj -40.771 0 0 46.25 720.57 1279 Tm -(16:16:49 ) Tj -30.1968 0 0 46.25 717.85 1230 Tm -(DDO70005 ) Tj -31.332 0 0 46.25 718.84 1180 Tm -(DOO70000 ) Tj -31.1073 0 0 51.25 646.13 329 Tm -(NR.ANEF:0001 ) Tj -35.7057 0 0 78.7501 312.75 280 Tm -(10000063022025092016173523480164 ) Tj -40.4664 0 0 43.75 698.42 597 Tm -(53.70 ) Tj -24.0467 0 0 43.75 801.88 597 Tm -(RON ) Tj -33.19 0 0 52.5 663.7 189 Tm -(TD:00973230 ) Tj -31.5442 0 0 37.5 779.65 145 Tm -(7052 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqwhx"1 ;s뷳zVwd48I@A9E7֙✟l38}C}όrϋ6b#w3@|}HW{I>jy_;y>{>G - -'v%epdqOWU=="G6QDwQ=7$R}pj~5>r<3FCGh1Q%(LQ3$HBR0JBM  L -2$!H=c1( LLH-$1"M `(ND J(hB6HP 2)E (dI2Q$2d#!"0C BNE@ 5*Qe/Y`0Mq$A@`$1BV& ʂ.Lr" -HA -Ih Dh$HCC  ċR#` 0L"WqoFznĘ   $ 0M aiF& L EH(%$lM4&$!BPT4 *bp77b`0C@4& 0bD!E% i )B& 410N+",%ƘM# h,c4BQ0=B7J#@ &441(D&a M8n iHLB`$4,@$i3)! ` @2.g&@$$VE  D$4 Md"Dd"$ q4&H@hdFH!HH3$5@hiLCDCRHCbq!81b4B@M%(H#( V H"I$,HLL"Љ2 "$#49F@ 0@ȓD %(ȄFEDN +8i Df10N"f#$Ǐ&2m 4A&1"JNC&( 44@$dQ7Lf) !!@`) L @A@d^kz[P`J!8,g&IAxcYc r FTq i`@``@ I  -"1'SY4Z @4@N 4 HHCI44$%8LY8юH&& H 8&LNVA hADeAq",D&1FAH`2D EFHLB16,"d4" ƀb Bg,!( h rR@R@ 4b%!8T@bdH2Bqp&" & -2d"a$$)JI2@S2'(@$*H18P @f`y !)$&DX M& JICC1Xԡ" Ib JL" `HJ!' H̀JC` -QԐ) -34PJDz !HL#2df) q`8d d6Ic$3Li$LM@DBDf1#`"L@⑐8@ԥC8@cixɉ$* "IQ$\CY( 1&SH2cF2PD@CD$A @CML FK($' Z1 *9A$@"J&A1J#$)FY L[ Aa,yA A)X$ƪI(R1 48N19 !ȒDX$Lrh< "MDԄ8<0cǒDI)qhȀ%$E@ %=7` # I n(̆0ˍ%A8$NXI27 -HJp1 ##"hr-2XDIRps@3r3 q.X"B3D (d6BN3q 4'BI H EHXB%2 D @cr" b2D4 -LN@Bh2D -Qcĉ $ŏKw=h#щg{_[/ ")dq`4CTn`bÚBqq&I $ s182RD&@Qd Q2(j(2@$M$$IIqcgxL;7Rsg,1V m1`"BQfyHi D l $,d!`MR"MHDEi@ixhI>oӶ+<]ˎb>xz!s}ӛtI0q `% NP "hb#"1 "$d2!(rhj12L"e pFXHCC0D  R6,'5WYG۾1n&uC @,Lq`= o)& +hQ"H"0a !` y1|>|Ѧ>DK_ȖV69>~ʱ_l/y^M9c4[s1ҖeܤߟTתcy%;S䟤L!~ve ƶיm~Z?˝gž<ؠ>Λݾ7ix'?5}/_UW}>\+,A 0@2N@8i E ĀMB0Mhqu~lG㳳[fKkAq#- U3ngt|y_kG 7 GK\}cWOJAaҾu{(T|q][lrg]F0$Hj% @$04pb&E)XeǓV%\"~GaT+<9o&'=^2~Z?Bm6G O79?D8ջ0>^ !40`A0Bcb3LRZ`&` #J HE˜4yK  0CJCN#i1@0dI! &(H-F0LXMeE:e諭ҨD3oT 7vDLlRuey14hK-9l](Z9@4MW@<;&o4giӠk|U.DX[yѹRow:y[ίֆRDv>}UǓE/R&}#Y9?Z(=y-XRB$&E0JPd&ЅER@Ć hJ 4Ѡ)ƻ\nN*VIrè3i(./>meX*Ơ*-9(/|ey?DOwEH0(2qQh L0Ut Ri) "yh]{j]vT5^4t -Ƿjsg=EjAS5Po9j6 nkyX^r<)|"Lh56dKu]٭i7:3{kŷmze:`1+q``FH"2Q4! ` -Q LB8*Gh(d6 7!WE6C)^Z(y.Aؙ$OMAYʜ=Ĵ˞_a i<&ر=x6ؕDF b8 FL͋$70hLT1HM`& baWt饺67|H{K&Z&ĴdXܩ4;ATqZ[ щ-L@C4 !1@BF"AD@ !$&(V7 }R:=skkyzcr~-"Wea[=S^+6,40` ! hH@ELPPy}[RJ #Ȳ"FTD`$jd2q4S̢@̑DJxx5v8X qf"ġ+鶵mRy^KRxO.hͷhF&$4$1H$ IFkh 8):=,^!y2'VmH5/"ze0/8&9D\dLnIRb20&5Bi108\9%,Db@JN%Q 2BIPqd0L4$4;Փy?@!W` i-w!J&MV&}(k6 rYV$qb#&u5zz#.k3df|2#wmS7,{.WKZ<3jA" @5*"eXA7٢>4B_~֥%/} -Nz{I\t,K_spr}Kt)P`CbƁ 5 L>`{叩4rnz2KuZ--'^{3{Ӛ_:-{[]{L/|If]e]ߓ;_THR Ĥ Ԅ`&bQ #"P R !@CXZ0I%` h (1_+K϶6mJm):`X>qёŲ_V ŋX从_l:b]ՄpfVb b `$#`@&0 $L4 M -h>PP҆M GzךkcggeL#YFCfxM$4z@(R22NPUL@āŒ$ ŀ - @2CP0L@0C@eoջ2ORK7%7>$R.|R^+6+O$KJ ^`n$`HejYbZ#"ۈs\K@ִC(vcgTnyЇ&vi[ ;C} $>rjMK%/s0 -ō2xrJ 5o&c ,c&X(ɿK`|R_J`^qΏ,,::0MRz7Zkޛ&2<k0_sɺ pIY3eF%_vHy'O奂O:"V_@(pJI]N'e[oOW}Rwmv+wWmtR֤QkZ4H]T+, yzI-=m:f/MZ Aiiր 0P䯣`Kx Q,Fxc`x?XUboc+ďqg)^IV8yr^g/Py|6,鬡ZYr-B;dhƓPq&h`@/ʾ:ꬾ_B -,=\i]{d^o_EeWem7 :7?_'QjR-8_=xg⽙,91dk:!O|[cW9/Z'; :E6r ?K݋ױ]x1h}o`HB411,FRЋ8L&hN H -X L2?Qu0ZEٻbP]=9 rI_@yt*U5&SWu=5#X8dk=['\:V ]sBLP?Br;ʎuW](z}5y8I0($Q9E# %eJ@EI(!8Nb`&lv&8C.I& -qFIA c%qe1 rF<JŮ{EmeaQK]5' @"82hHY(FqhP1' -S>wY+[pn"1K^yFDŽO#x`m!lga1Lb ,ȱ9%?;L!rdd6'j$fPd2N %ՉdYdbJ- C`A% @ HH@ Awk;oD( Q"5,I9V,^$a0zy1{C&?xklÇjTlѭ˰F.&G~3Y3ɛ(Ig H) 3aX1B' qs />S,P(a#?.S)癕aNX'.G晚8C1&W&yA"5[רsbY#.3ň/<Jǀie/8dLY c2dfB*x2U3 !$œՈA$a8[$hI8QIJ42@1qq"! -J"1a4M IAps\֩]NmI[py<鴛_}iZz7CWtsڥ[.^@{j\reWm " WAL[#roJ:޷;/5Ydx)Z9TH>ϵ/f5){/k]^.fR\MN"cЖ) -d$!6c%dٕg NrL-+6(iFNo+^дmRb%o6oZk+_x0d jh&V%+N"RB$$Ʋ0ĸV`ff89Woo;@6/=˲jxywZ {uO<<Ԯ&Ng^NI*5ޯIJ!YH$i, bcI"D~_]MH_,jŖu rFR՛ **bQtݕ ج  gf\@ye^A1A0c۠4HpgI|]<ԏ@j ]kFKq+GD5{X@I  z*˓sݗe_U,:7q5m9v*ZyU\˦FZzMsޓJ5 AGtYGV&n6>83ٴ^f5z<2,g",OA7f~)#Ҽ=A}<=o#bz̠f0Ȣ %#J#" " CCDA&0*DC]_g֚ݓ4'_ҧl^BRx5b0=hXdd~h̏Z9I22ǕRq$b1"N $0B@EHXV<>ËC }(ŏ^Pf;̏;0q!8K$ y)*̋"ɐFQHM_85f͒LNuhkMJؽU&> UuΙb=s'D:m^MƵ -->˵͍2άGX't:B%iXk.3h6ǜo}t a`[-XWK -cמfۼ3FS@Oz6S$b EԒCJ$&J(%aaL L:`ϧI8/osuG..x҅ZPoګ6r7rQcGt,tzYnm2/Ի}|]E6}7sGi6{&k -W:"A:::#MhW :79:*˝JF[}QOUeFj6Ηr282 Ml"J#& hb& 1#&28sj9l -3_Qu-!dd[8IA -Qc1Xr4@zVw~WVK=F[e6S,DJ3,ƿ9:v\y_lz"ݟHA>SoDgSIAkw5Qt*٧Z%ƕ,P)xuqykHt(ig50|r-nwUt%P*gnZ,\* 0DdXJ$ cYQ=BOٳ TH15p#$bVlrc1~S2#(/ve[ڕΘNFtJQ^mҹKNes<ۧT`0Ic0L 0@Z(L@l( 0\}DȌesSP/9EM/3Ӧ'/{I2ifL$8A41 MC"`0C4 F(7h4zVxr3) >7T:.xglWyomuZFa#>pГt1ӒK6s3&,Fc 44&LC@#$!DLLAC}N62I"IC1@ bi@ hv!Q44C))!) M ` bC  0@ -!$JQKȠz̛]b(U\/$)d"ϋzU}X@&ȩ@N.n(l@ 1 -)ZhĘ"H@*#@ b4 Lȍ6RC,i0` Dz:ݮ$Q+MgFsmyee|kEdBl@4+@ mD`P` @ bI``h@$G `) `&I -JDHb+oMZ_P&AϺ1Nͯʷ^ًKsk #ŀ cCL L10BCH@0!4:@00C0JIXdZ!\jk+s}᧟hq%d10 0\ -C@!04DL`11 I$[0C@4T@0I%`mD6KBj[פe"-@R!LhCCDa@4LC@  4B@CC --fo|vFefyG]r#i >Ic21.E9i3|k]sRODeǛRPxǛϐȌc1Kq# 4@cPR`QD9 # CDF` A$i hhM4h`ĥcUdsg:zé:a >\7XE4ۖc-@+O`%$ &d !K> c1'"$BA( & FqFeY`8s&Fe R2L"BDd$I&Lb`iY!8RR8ANݓSTMDĜ d\sXɸ)┹0d&!ŕa*Pyf )T$e2Bdc8$(cɈ\d.  MI %W8%2.P2&@dd1mk5(|&yxϪÒro0FO'ś -= Ŝ˅³%3\RBχ, #'ϘPLȩ4!!^sޅ  -+Y']GOI]{?M9$y7O>.W9Z:/7ϝثsaWi}lZ9w~fDŽusk' Y/\+v0zZя/F܊&jʭMFI",QF`ԡ8p "rCN*4x^6dz|~~|;~} bqMJ]TJu 6/3B@ sM8dp(,3RNU)N b8谛#1!"#4)#F J&7Dp(8nȴq Q4 ԁdKzKJ몿*X5MF^fU+r<|۫ XtFR. ^xW5%zZԵ O6buZ}*o*bipfnu݆rK5”n>WlYuq@`L8 d%FI Lf#) jm5mH,@(~t2 >9صZJt02.<0!$I2$ŖRH̬![m7ȼCsCjHx6a5L`ZEVB(&cd)cq!5"h`& MR`NuRA^C*2}Gc2EN kzʉ%hm KS\>ptZpW܊XfQq& %$ʔ.2N g(48QjB dTDr2DHҝI 2k3y1N%<3Yᡠ4IxLkJ2P~|ZLZ+񉀁PE,yHDHH! %ǎiRnd-gNklaHE;&]9aN' V''I˩ۉKׯ+pEyf2 H* h@Rm5}vR$ &,92r") -qir@1@9",exdqep -HBq#$fbyN*4SnN -6Eꀼ~ĭص^dxTk #3 )#*2xKkiB> !zs.D2c4cD2 Ybf,s Ō P2!5"#8^LsJ&A!f@HQ',%&! 21bɏ%pfg, `*jl};wT-X$&2(JH6), d yqf9@!8M`RBX8Z1rQFpL4XdLpÐqcIA.,$JŒ@ " e1MdJA.Nf"h}jr\+s u%N}Ss~Y"SˋSNc6-c\yqeIC.3(4e¬!2F9P #8XQ $K8IDRi4x2F))@@!rL FR& DBQk'f AVROIt>_f4y|>B[9WTh{t.|%z7(-ci7w|r>qekkWRs̺Wuc,.,hP40pi`D@RR\Y8ȰS G !z!%(hCX@ y1 -m0p vt@溮#N.5t~7=ȱm9uͱ)\Rlr9v-.=κ/-cqc*]3UƎu9DSƾ#(S9 il P%D r$EJa$d%(JPLY1&HF V@}ew'pg|aɽNu~=8Gvu -v²Bb2<\esթǨ,H0gM+oX-׏͵aRʱ9cDBB`4Ef9x12U{3>DL4Ƈxd㝃,ǫ9jYmhkdfWYcy>v-ރI9н\G/=&& -QXJ`#.GHCBb$ H "án[-F4d(:m$q\y[#YBOB -VrU{ݳY,O?(:-tgs*^挵#ZM]}ͺW-.Rnåu7%aNgҹK{ -JHAz4VC+0 ܂*j"II"*hCd9Reʗ9CIkNohjy-dz#kw]b]N)u]pD aXƪ -^J?b:s -t,l^l}cTd:͙$7Y*6駓Ybqo@LP$"|揧V_T$S K0a3Ƚ^x31 lpwO#6ܫii|uSrDJ=uUKzs^fh+sqͼY(gK+ƷDzp_.i9tިFn̺Yչzglk=c}h -`f.ۥV.4xBhP"*J#G A-kߛH}m(瞫Jft}uNuoe{Z O1;!F,ʗʖ n#`>%s]t - :yCS..yOX>KټFAq#LJuA^Z xwKEHs&`kO7Bh r#Ȍk$LO(crƲq##1Wc/`P(f=nq@nɥNFsp*k%v:9sR߽䝎)IyOVRc5jc[6.Aڍ}g%{ͺ:/Mܗu l[o?]$[[TY[1CWke5b@fg02 -`5VN8orPPb ]U eC mv=t]M'.vjz"vg=~p͗ee+DY@^7JESKhpmM^='-F Y:οAJsn;W*MD}aXj;K%CG0ä/6{Ѝ&Qo6tsҟoi M2^6mj}(.Uv:ݏStqP6sNsw=YyZ"GAmiճ)-GGU8VG'baMfLTB`0f}E<~KDꡡqu&k=f(78z:zoSl~ʽMlHP};:/FĪrjOM]7wJ og$eḱmN KůŬ#O-!=x0J%M%+LvmlCl\sn3ϤaJߜrN[.k}K8sFXbBdX(O!zV]J6zTWo>`y7': -Lg=&rX<heT;RMCYh8u/Mt\Ǵ} hbj4(Xu&(eƗ*LqA$6LHC x!,v̶h/{%#vERs/7S??XFwG2Y{Z]OVGEhN}zVj/4x?9Ǫ{;<7؃kC/##;I -ž>ODL+1Hhcq"B&9 - !$`,I'mH@5 D$'J3]Zk Uv;V)OT!(X(nuMOH@4 -(4 2,hC"B&U$h@@YD4eP91ȑ& Hbj*L*dEL"Ib&)FHNd HP>"u($pYD2DC\89gR471;~ӉoαgH9ϧ/uB"JvF,OSzDHbr4ȰD$"K @\bchNP}'! &"|9TY=Z9w0JUG|yR bWB}(7Y9<,\W|t^O.USgWS͗:ͺU~]ljwy//}MԒrcy霻e}Gg8 t51Xc_~r;<2A|rcn;SY9_U>[c?㏢>y(Ed]N "Ϙ!rxb/t+yt#e];t-/R{Y:Mʝ^|Xq4O|*azNSoչd)K-~ߝS[v>Og|r:_\f}]W'Ḧ́|[չ1z.rx(?4_/O':S_{gڝQ5l#$!@&?E]_UM9W o/#_7Or^GNe,T@NЮ~K@Um6񏨾^S/{, 2K/J"tNuФ3=~ȾR:wI͟GW.:MWm5uu4,3no&SNa˿QI[zq_:|{BC_5[SfF&4@FIh`&HyrGOY}9~#|Hg|27O<}_^N20=ӝ\jG[ݟBjr"}{! 뜈|r{]y <}u^gӹl)_>^;R@210iI LbjI!$cd Hi@00+h 1eGփ 5˘koEZs~棔.AGt$sO}\8Mt{o:c N}ORd@M+I%$jȱ@ $8b,b $$H`(0%P>*⟶u2 a n,hbbdL4(tl>FCq4 ChMiHL%C 8$baj'M@bBM2zAŬnU ?]>y0*έ{{I0޴5#?Vq~Nsw[M#gC9Ӎ-,;؏9ŸzA5`19!}H+'& bC2!bT~SX/;O߷WQyGUѹck5|׍AxEQ(=k5@<^L/u9Q9z;m9MtIE.s=Ʒlz#!OQ`$`$@ &@(!$4 %I\gyy%plG"A<;Ys.Sg"qkCהڢr`憗zɟU 6|Xj &#$bbb1J!(j-$!@`dFB$FB$JPFEHHɸ 2#$PH (|/U  M$ HMl,F" `+a!b% " q`  -!r6 $D>hcPqc*j5|BH`"L*Ri I")i&D[Lb@C P $,9'#HimMMv.CziUv-`;e -ykZQFEӰwZӗAX:2KW,'216ȶ cTX C! @>mB jCd NQHHE# ` -9"ݘx56VW%aeOa -|ҏcO{ -hZj_͉%ܞyz aVo޻nlOeZL 5u!N,b` 0LR@@ F&Im 0hE@hV `b1$ G`)>@e\YVq<7Xyó4=y{*bo$`ƐrDd"M8n-ZX"A2@X0LL`#YF& hchr^:UHBh B dZ &6 - LC` 410h EL@ 0h` (zE -ЎO՟Y:R}oQq*oXa̫8ϔL)%L@0L b1`7(d]0@1M(!Šh0yvoqNV<'C^;E/0Ii<\x'դQ];qhC$4&`b!4 0`! LjڵL0<V/)45[)sNS#x:F`8ojɘ3(&R2V(1bDHb` 2, j@X9Y4{z-|jn4lv_'PZIu.)}@m>8k&ӔA3tTWyA.srsou;L2:G |-yVS2lzQBr%g&G &wo;֊7"뒰5az5UNTZwR9VWt3K>[/K<^]fwHXtۢtW $@ &rLBD8LEM -CA0S@ kCmy9;xKfU됬UKDN9N)Vr̅0_o<mQuEo%ZWgYIjudU#"!' @0h d6 4`LCBQ^K&~5w-ҍe rȽ",Nc2(2M0414 8%$EL!5IHVDDdXH0$$Ha@ "H@+& @M5+VZmcu榗rpޥʺiXx`g6_OP,gD0n2$)EІёrD\EI*d#CF SW%C,@  lA!4[@dM& [g!;pG-vx=7QjA_eg5VVqڱ dGP!1Cba4LC,\Q -$lx̂ C1MrD"HL2DIT1 Yq*II@ c4 @Ƅ00OWVn셋ϱys\$F & LC@ @ hb1` B`8`'*M8 ŌE8J1(bԈnk{fUZZBY!PFO>Omk}2k|VVv6d A"!$"Ii R!b!`@hQ"#C2Qe#,cD0/gbZ»bږUm'tC{wok2ubS-Mp+XΝ6o,Y(6``l!bI"&PDfD&"&1h0!Hb\pUeES^zK -0n [ZMg6I8>=DB.Y.rB!I_ZeZu GZn9+wE#xzsj`o)KfzV>8%dHdI XȱIMHLdG!$*@8LM@7=>bUs,<57kԎyɀhzoܹ]*6M[Q}֙p= pE5bRi<{j{v-OŮxams;IbTnռՠ񭤯x:v$L9O(`3%$ -PD`2"*BR)F2$@iFbp郈@' ȈG(F9Q>Cc7Z5]q 2@vӢ)#ɣ?x -Ro-Wt*i+SqEK>T:3sNXL cc$#(`D'mc$HR"0#8d!c hJJDAIR"F`8d$Q5Bl+\lq]\ܔF3 $$DDIF J 0 ō&C"`& -2H(LU$Ĥ ApVc@4d8̉(2$"Cq %&040L- IBM & bɝWjJjFFbAdDhL) 1) *``4&!%4g! %$)E $1iq0Rq&"HĐ IJ2 -t } 64>+ޝ2į{vq+{=V{bӮl2F:<'Rӧkϧns1TI30"rDId0$ D&&D4@c2&Vj=~3YJ6/=]Ί㖣^25^_:B>rzeR`$tK+FQAH" DC $I D"0$SBf&&CL $ Q/>"!Kv~sor]NI,N,s8_PcP' <κ Pͺ3&!! @!D0Cm H")TL,ڤؔ I 0C0M0LC3 A30<6(ynAULX%u?իq@@II! -Q0@``&1  D@`!MXhabEI(0C@!) % $E  D ;Eh 0@ @ `  RB"I QE0) m$$&Ȃ#C|w׹/dI0Ch4@*%$DІlD` @00@ L 8$!F@,F"LM(RDI h F3Da/N]qK\ꈼ) /;{S|eKЭj nT-'0dF 0JH@` !#B&q5"$&4 3 RnܛL$HdAH"6MjlaVzER/>ƻ\c{5E3ѹa..kU=O9}5YWwQ BK~WQ:L5 AQ6%&3Q=nLs`2 ƀ1``10hpB|}O@,i 60@"5}ȕ'ʎy¹jo~b;zsJGNoØt B="Gyݮ_fdtDth^}Z7μVm!)#}VWcojܖ],i1獾V1 @ P}wS4 -HqhbQD$d.xvh* iq*Rhr`" >m@/>ßw2)x(:ɴZ\+ljIOz%kMIaH)) ״qJ4$( -CC4Au9u^ wVUr@ɥ~sI3͏n=6ߟ/ciqÛ{eVY=<%g6NW+EU A$% c  &|qٸ/{˯RԆ&0H +@1qW0DIRbSޖskG2ds=?^R_8]y6R,d]3Nmirl[6>1OGi~QQ:,NgnY.uήխmkuidqp&$&Lb!! b0c_v)c +n bu=U -d5IJ2&\o2,%J2 chq4Y7lWgH5:P*x/u["\V<Ά۲n[Jʝh)9vU۱#fӦ(Ȕ%%1 Qqdj!"2$! 1Gw 9h}КWsu'`[)/5r+_}CRiV.zW} -#DdEř`Ŕ rHLXo$O&i:aq˙cJ00%CI(pdX`N3L D!>{W3xMnܑGiElϢ(\ZSYj5q-j爰U^c6M6qU[`xyVPz>9]/r]1Vl؉'hj&`EH` sԲJE`5&BFƨһ=ys-G4\QC Ye˝KsX4;<;,꫰i+~K@1abvCi74Cg7XnzN+Q|ɱi9gaK<.˳XwO^& 1O{ ԄL0M Ih'gS]6o:^,*ҩ[zΗ=aYlV^= Z4]Bz6ڗ)smxu+Xn~ʪ{Rf0s1@(֏Џ.p+V8jE"7'Yұe'=QƬWXY4KG);li5JH -UM$HH11AI"`3aZf ʬ,Su-#3it5

^t| "*w!GQ@Б$Řk(ax@H H1I dBD #R `FCHɨ4HϺ۝4M]Fy0z#s;}bYߑgFe_m;_x=:']}๚2WyAP8|bȄ`S!Zec 4(eB2TFG HDX -p(#pcC !$Dƚ"V`F d+~-}*NEǵF[fg=֛ۛ9yFFUg:q -]FEo]v[M?TS8SR25 i 8D' FdAXN9(`r  ԽhsM}6zlرqdx§K©/~hKa.L!i{eT4Q$ F@% M @@4Fq`"R"R `~6U8LCb6*q0G6vUye. W=tK Jҳt+9zlFꖳf ֛#,s' -}ЊF .$#6Em0c&@$D$D &!L܂j@ӡH _;/W8& d -d*eafם S3'|_aP::1\ks]~a=5;UGtSN<޿MQ}Ϻ7;0GRc {(wxʧ_}/tX%L%na.BPB[e--hN bEH1&( d1=vkz$E bB -$D<^Ԍ=lQ^DČ+S(~|n ߜ]<ա5Ys*bl=oR{J t|ӥP,R;^OJyRjՖsfM@羿E(K6{96*}ˋt* 4&!C@4`H5%>:w\@ b`4ȶ` -2@ H"0"`1Ӧ MHA%# 4O7~ &չg5B#Q'\nN[f@ZvWuNsu9mMS1`?2@P`C@E$ `I a  )D HP@ @SQ H@D -Q 0@$ @ yB9_F! "125#046@AQ$%3BP&R`CEFSaDTbUpVqdr FmNJ5$e)VATsepL~ ""6Jt HlpU,ŲehS}:ZFIHʜyc+M&( }+"2s-. -u#9"/>xNdf:Ҿꞿ]0 -vsC`ɽodfvAC0Z jTݒta<,R'pW/f^aLSIUG^!p4Y난|A&A֙831rqBvzPNKΊ94VOUtm:k:um8zUQ4 6YqFm4 hT0ImTҪq:7ʔÑ16}5 -Z! <ݥT!'g2D K&@ofـaxZUH_u1%hpW$AQs2ԯtGlOurZh.lx6nN8 Cg&"Ҝٻ2$lZ(.M0FI#x NvJad$_.ddde.e{2)v3)\XGFF;AVS*PkgU1H V씋UtᶉYY*"qŴEԏ7MTˮEnS**ZQ @PUY|qiZ5TӼTrNh̊!w(Mtt72Ima/P3gArk)/ ж:g%.K5u^Kf.˨pWmMhpVeY{Z!:?}e%&9twMlg>rJz??*c9r5^x #2nN+_ҖZPw09jUGJࡰZ1т(YCftVVugMHQ4"q t8 PFlWĕe;JAJW/k5]٬}rnYVVT-#D)#pƕcWGcR0ƕkLJ3 \6+C╀rOgU*YZk? Vwff>zrn]O]O~7_|c滿_1IF{^~5!>_%F_O㾿/Y=uSDޞ>:׭hg0?'_ONuSuܞzI_O+O=Y~e?]쓪 ~I?OdeIjR ֓?OhtU*M3^']=||u엮ٯ]i>A}LE ZNz֓~iWvhة*pNi~pZGs,[Mt##;ZQdcObH hqS'ݟhUJ1a2JKl)Oh @$Ho!ieBql*uf*r>~{;7v=gDH,Av. <2 wU\"촎%Fy+_cckbn"j1&\0$d2VaiJ$ESm?x%pUjsO*W:`w/O˦ס$gP؜D틄i3FU9 -J _ <2W'ѣE%ʝrlYG@M?IWalkZzODDΔ.ְ%yj]&hg3Lʷ %mE])K|\i (#5٬sܖ$m n6E%EZVU@k\ТЖpe#Ԧ'jnGij4M lEݝ٬k?5%m "R"&)5~L!D໎kF -% -w.DZ:Tiܞ̻Ld鋔WxJ/ -(Ay+kOfVԔKY 3Y$*UJu-#j.2Yx<cNC}'zkfbmj/ -|PmLBT\#vIhDt%[_:C[=sYݭqَMCA"k D -ddֽhP֭3<KƄE_,'b&j4aV&Tt?Ր_V"J [Z+ ˧SmP.S4 Ip iLtJ/u κ@ҀГtQqnJakz;A ̕Nj;ᓤ^+iJ2.vY&PQE[-| ŦN_/joʭlN#VE lb}6Y^gEpcڂ+HHh}TURjW5 {u3Q& <~fjv`bs:rQDuuM)6C%Sej0!jJ7h]KƋo^]\"D[Toj46ԕTٛ莕gWY#K"X_9]?HtYd%9{|]Q ZhڏLs XmYsZK@6J+lh]!('Aiggk[- m{q[~[`bBEq#PW$4)RbJpۖcO3)˩\{zyZN`0hTUUiZ\h'9V7"o5'2mrl۸ˊى6E#]CDVˬJ)ӆQg\/ۢUm0Q2U#Ib =R}T{+@n[,z8 _] Mp:zmB'(`L7/5tgbN\@k6VZfcdp8T[}Lhc[L\DsӚÆeUUr;<-u(MDM*#h(=`ըlkstx표&BNﵳŞЧ4ږq#%X<%iZ?ǹI<6XuT!A9l%~XU5J+ujk hP8}#s[>(6uiLԻfDk%ֈŌ:9lc#agg𞷝ς$-l sVG1\o1  3̜.M$ic&.-q#1(w:Qy:[z\F )m9k sn YqUM3WRW]f+fWf]8682&_ .\Mqj$s+fԽrL؂Θ62FOB =LoQ -R:8"i\D\VDu+4HUVԕ٬k; sJm&8i] ݻ7+YvW?0s&ejZgkA鋝Ҭ2+^ -1fq&K_""&)S .%.Dr$,2ۭ[O[JJ !ҐŒvahy jKA.rrt -lbRtz"J4iW.N[ffNplUџiMD‘6]uD^aHG,C+'u9o(T="(-B>& ^F8e 6[ºfLc+G9-["iUV>08Jnۦ/"WTX̷H :rD -IvqSň:!.l Qt.xD&UY̷5ץkt8O\?K!,g8&hMyk5uH=Ը^T()ܔ(Da_:Ln!w9H g9mVnMIr|Vqt7C,H˕,cjH%Up(Ƌʼnp(Yjٸ]sJ i*?ΛF=jJmBlWV:;qWjc(&/lu9=C@.Gw::13:3%/Usq^q?DJ쟉IU xMfyu#"Hy%L{>bTɢȫ*Y5^$r՚7$R TxWxt#T5,GVK F2G(o<ע:p'~C&k%,sb,f#ڑ ͵Rr)gGMI.1L7Jimd(x:w٘~Q BJDкNҍYC Sj!)^k+Gsé~ E{xYǜW3$?ܵzYk;0j} ?S1%+`dRQZH-33,vGF8Zqp%z\a%E脤 T7ɒkRF3Z0RgHe |K6S*0&l:]J lp&T6P"kE١֙=ۢ}Fzк%U>YiHoT(V-ED gSfPeK a4&PkKl[ jEJvOH/<J,δ ~(jT[n#D Gߊ{oGlUӸlxW%UWxT^lRMu[Ap1QDŽ W:pqDEUqHZ8ަHhH-jݩ+]f"kUfZRngmЯdjjڿšy5cM H^_JykFh2.d ;<T`řfˈh瀫g0J./ʸ8+ -EL%?QL[)Zzֱս6NJzVz;.'J[k:O\ ^~~^uuir 7qTHGdiqL2yaD?Z"t-_WWJXcWZv|ۂt7!.2I`ZK:h@#FVZVSVaO -G7MKQz7%Z\S0%+)}mj8YQS.MUX͹Rl/#ҢF\dm.CI )p*¸CE@"t/Հ4G~C RJ;=Ig<[6Y}>TX:)"y]#iq5 -7\RV+ȕ%*M{Θ ijp]\ {YJHMy{_ݧꙔ+d$+\}tbm(EJLk?*G4A_P~[ؕX?E꽫6 -㚳:ˊ-9vV)0T̀K)m (BY^zUW>**La@4YehS~Vmeԝ (\c: T0{ڴ :K %)t̑-8ۯEp&8 Xn3Ƙ%$uEs[^1pC,KM!")V+zTD^t&kUqZ5Hh"R8EG~+Jx?zBLҼ('9H T,LP'甽EG\*ˢ)Q;<[Cߊ,#ˣ׆:DM?W= ũA VFUʙEJ FYհEKM9LaT[.ͦ0j&>:i;W:.M-~fե>DywRApBmW\*l-JqT^ .z-/<6\yEM}ǐׇbipѸۘTwEqVo9 -C2v>![7tgB$JNJ}^eF(Z6ӽuaq{jƐ ٵ.4NW 0t7 U9tPEurޤ<驭d5\Ux*ƫ+‘4~.%qA@K|c^yxs ScnE1L `tob\g/M˹:p+@}aL(%i~24%44I (-'$D'U*,pOk9 #rh8TNoyZp8h ZEB;%\-"gy.+5BHE>x]h4jZf@:B҇!H{^^{eܞ)z)ꈩ@\ʮ(#]j>H \iv;B2fZPkUL,HcRL*M%ԪewK\M.VE(IΉ\  -oVSp}\.k5fY*i7./W;f>wg=O|YmBbc>4K[DSLȃpUi&*W,E]\!ԋeY% nи%Dк+JHJG~]UYk5uϱOX׀o*'Ъe0n/>].ecCO6Yׇe*[Z:++ts=TA;,p vbMCj'0bTaq\ՈI ֮ohY"4ey2y;oaMHjSQ@%o2%g&;&cͶB"<]o>ZEw?8[VU\`9ۂϻtQR^丵c:5ɋW(\P*5J/7 O}#ɝ9hLR:uvifYm_T;JtKWz]S0%%E%,T\6 諣YZ9$\)l[ISY$f]GˀV:+q޼Jُv}*nʚ:4̪la5vvpU"-NZÁCxVoM.7>t/Mʯgi4%AI"b9vM7j5dTaC(r%;sjj仒+P}7(+hukJv,}:L)3dXndb6WYɼ|l)պZJaJXܴmg 9_M:C0T)$8گiW \JG~OkVTj$RO<֞.2_IrEzڤ'V14*oIV8 MHgcZکL{An`_zzѥd0_wu.fƶwV*9b@p3#pME pnsµ݉7 m[(w;J%rjG"x]6gt=4+ UbVZ0T[J~53c*)}IQ+H({Ҵ,s$B仁#DBZ"cl6mT") FBWmdCoo^d0f+Ste[FC@Ǒ3̷qd<к4IG -ZW: LŒ d1VFKG9@7j2#ΒZ;-wBHYv=d*b΂F$E:o%+ N֜d".7H?Č+~2U1?YkZɵ|滾m-YR um>vo[@:WL#*-Nd_i{ԈXEVJ(+@8M9PI KBe+9+Z*֕+RVkRVkUj]Z5k5fYߞ}3 `,_w #.(Wm91|KN -xGtN!$zLO x1r+ko㴣pq05|%d|Y%N F]ZEg< -r\%zENZ暸z|عPWH~AicD'-½H4J'94Ks-4*-pTmz5%f.j1jAfǒs;T7qp.WRq7D`MPjTw@u2K* VOQ$Je]q;1p$ԸF:;yPE=WTmjO6Vm} -:t4L># ^ cˢZ1&{qSy^lnY1%S,)I_& S< ׯ1-Mq\᫶y 34R}ZsEGSsI$Ks4a$6OU*YD*].b9\P,mJm}R^ZwvG}$<c1Q$ѧɌ|idU2TwS!/Fq-Oܚp 4W;HlN+ϲW -΄DPsS '"y>88fF UBȌ۪˹hg LwKn.<@!(4}UjsR)t٭N PjJIUMZ6hmkN٣<*M ۸6#I9-)Gژ˱TaE?Otqa)p-XR~-VegWBM'E3*r=ѰY<8#р*3~{O/n|5+ylP&KúZlケGLd㔴fRANRq *Uϲ˾OՖ gshQyOATX_[[/bAYHt^]ރO#aEtM7kbRw%m9 {tR!y?DDxB"Ӡ硌MTf V.܉WDDBZ7*cBOPUk3W@C@*T8DTda*'oCDuV%lF763TbwVq̀M0In&IG"ak@ӎKL(&48#&p@ AL4ضQ-009,FJH۞dȚ[ƩR[<:d8mng (O=L( -^ tW EMeip -MkۄĘJ)!X6Zy qS͌'+{.dc$ŗ9:ӱi%TfUE^0`ajW-M$7b5>ss~QΚeNZ8JZf ?J5Gy>R Wz]@&iϥJ>lcj6+6Jks*Q} -pBqp:/\_?WpEh"i}kKrCgƫ呾Nx8%Vw~k4fYk5fYrg{@}PUs$BEDDL%#Mj3JOoq(p[PNBUQUт>4q#߸m7(#+ܣ0KqKl'ݚ⸒" EUr Oi8յ IOiHe(]Q[0RnEIZ"0ג$vG[]:+  ׺i 0#QU_,RGbR39[mQ&}(($_߳UU"vȢ|u'Kn:V j>' T MJp#r@mp5"Oc%JP*zJ6UJ M<.gJuSqwQ:is¹\P*%kO!qVZUjҭgvk5fVk5ϰgnDa51;?@M#DA q\iۦwȌD9cԨmDC%[FJ`2I&0HBvq]96 'wDk)M6:G" W-Hy5mrݙt**G4:jj˷F5zf$"hXmmh %l/y_Ru-vZw]Sj+6U`;9Ս9%d`KJHpm3dtyK$($'VpY #?2bxڿ-^;pR2 * B=ՍИ%MwUh@ɏ;:7)3Kʵb ґВÔˈj͔k\Li<I/'>"SpA$oMQJGqo2CƸLפ"'6Z/ uXH9MG4DRpIb^!1Zf?/u&juWtUhhfoz [|taWި,3o#Vǹf"K")EnkiNj4VHALX- ,jiƗc5p1(txw[/Ԧx̘TafZV ql\L4Q/|wZ& -Ej a8z}\hdKj7Q].aWԂX2C[ruBfHx'VN̹ zW\Wb> d|R7`LJX.Dt8iS' wCJ0sܫlR~UU.}*?+}LKzAzlYEyfjdҸ]͸Τ^V ˎ{ 2,ޥR L4ԵuFc-B+I+)^c6k2eEV.m}Y ѧRUzH`4m?5q*l';e3nd[,k;ZJ\R{H}HWM0BZRDZozGmIRTLTXmFצƄr2Njp'Lۛi.UVEx]ET/E.*E!ϢWANse8rU`pJhn@؏b650ܦbtX{ȍڎj ВKPcܟ}޴h!rjӫ'EHm|4ڳ ^sK( - )mRKi^y[b[Ify+zĉ)lʗnQhe[?$UzX3I`ul#D4]ڒY^{k4Y֪ZUfZUgfI5k;;Vw&EGe$9Ec Xl:Ed]LYjFi#4B-MqB(ivH;o7h¢۟ m^Lێ++Eهnu&PZ*6ڻӹ7-^u頰)͡ -%}VDU8JI۩Q]dG^wWO"SE꾱䆗./ D@ujU[1 fxh)_a4w)zʥLUdT Hz*EɘiC3WB\Q"hRhT."rh ;s3I1i(\ELӒm{f)MIEi&4J֕%jiZRVfZJ7@ЍVQȭl.%w\\rr N Zh_dV3f|DR+wǺ9"SH U^#=VS5QfW%]wVL ioʣz  1/BpGlFEN&V99oCʐB`fΔnBݚ_T=ԽnHPV޽z#+5}yvM3 D^9-]dHHG$8dGz{B .>q2lt2n-[d,5RoG3<j%$jEEvAR&XNr:T3V]i1S_Rd-@\b\R~kZE6=tz#R-ѥ8*\9œ?[6_62 LǦʂ {YJ&&\iD~ -a*9b*e*a - ]*1kS>;էؤkfbH*M,EU-totmhC8 oMƳD0/J8*K.uҪ+6V$eT%^SͼjGՄF]>oë>\ qw>Eˍ)UY;Q@7[[Z +bڄRXG0HҜDxl׳vT)1el׹Tfjw'nwj1V){@Tҕ@ XWT S-|U[ZjjQi0YU߭t$3QH&9SYƒUG0!`i\@J%$!N'8(%(%WmKq kfRP<,f&%;ⴙzcy5;1AJ_ZMI u0z -ƶF7LVXM6.w:PS(u4騑F(}ijM{ѢO6-::G[RyT)}I` aS^w<Ж[B#,OoINLc6 KLTdc -ۄ;x΍#; Qq)GVMk(I)։$jD{ؘ˸j=ɺv[{HCҥ@h`}_{3)+tZ> Z:uxo)+Nakg)\U**LE ѦKa{鹫~6ީAJ]K)9ٓh5nh|A\R*V_h\qN}T%" "wSN,SˆU4bؘL QJ3&Sh/"'4D)wćqoƓ%.%)4Pm%. =6ނLtqTg -N *" P:gP+IDFBfh{_R1H:_qu/ri ;!"ֱkZ} 5-e+5fHfVfYw& >7 -q G~Ǘڰ'ڴ(hiELbac#b;!BЎQ+zD\_ H4gBJª4-/}E< 2ch%^K\#Of:J~Zӹ)8E1NeqZitgMq?Vvss\D4Z'*$\A1_k!޵%jk5ϱ޿q[ȚSਭP8`/rݥ>ԈOpHhNVk9hE\ >A\/* UʔUQ9 ʱʴޱʰTUڠBjWw:"ZR"Ү+]*R)JZ5ZʳHiJsY$Z+U'U;IRlVrpq0{ J^{ܞ&', >%X $J޵)EҒ%kOkLRR!VyVe)7-f4z|{4I>Q=kE; Z.J5Ԉ?[BғYB\,k/4" ̎.pC~xi >9^d\G{lI'"7.FGptK>C[Aq0tH#H#WDYO6fM'L0q$q$MWxb#L#uY!*kqP-w%GQs\!Ҽ#0q35ZP.H9R.iJVfzir-'Qk;Yw&9tQ%< ai:E\Ҵ.L!rI_CGQ p4&poD[Vx;+Vu!LU7 j*ehZ?vi{Ti4+(В ")R K7 -U0qX䛐/w ;޲/u#Whgdjobur;dqF9<{^I1XRGG&OHj@ ґn-X6RӂCԖڸ]NA -1=Ք NcA:*:y6Hi\u?f>(ShCoteV^LMk8ǣ;ΣfEj.]}KS!м iHž$;1#Hs+ / Є鉹iVҕi#%*pa -{Gե?;]\S 5q?«8(>.@I8))Gr]I &\9U;qVORf4誔\n!Egp5c$L(~tnM|=R[T+J*eAM9ӽyDDw;rX&bi00LAu.ڱQ@\, C|GDb+<8¸DY,&QRas,ɍ![F]vB8cfT@NBÈmm/coft2HTum*shB#? 8Nti5vLr[GK* b-z4QV:FTHK1Z ZlM%UD]-찵rh%\VQ@_k.#uxQxjEx%FDFr#B9FU@8FGҟnbXV+MiV+bX{,u\V;"ChӆV&ͥ]bZG=ҵ֪jݚggv+S @K)S)GӱuNGE/眆Q扵Jb22nT.q*TbGhl(5%+*AdZ9LxHfsjHRۙTejofTGU;3d8c - Լ{ԨXxF,Y/ZPxsuu/ٖ^3y&RQqId ׆L)se2(pNBxފђa]4U3 jm=s28gY9So,9A%C Q% [,rZ'xHi%*ڔDҐ;b$XaNIBAm -rH-trH[`TFG r_󢪪qq,YU:LдG_U3VuLa*d`Ychp,t/XH|Y zhݜ 9Irct6R,rhUNV21yBgv+HY\o5jkU"3YfYgA;G]m:YSr"Ǧd3x2*m.UѺ&`:p7鷸WmkqpD8L v҄"\Jz|+Vpn -zm -i!ۄ&q̓\%82YdM RɖEWQ9SE''/CGƚ\.QTҘ.I2dlR-_1Q16XFRZbxZTHU N!&k=B\Vk]"SZ);i -r-E5;{6.sr6((|qs̃ͨw8W[GAibt%l`I в9&/G^,FԦFVV5!  RUf '1i}%/V^D}- -<[fըOR~_ qɏMA~Cf ; 'otlyŋ1QR-WH *w7>w`//|CZjlڸM $K%"}7ՈHs 9 -f*5*12Q Rqv~cm 6/1lշLe1E6~ro$`ZҲiW5)&$LLRnZxIu.p:gM{IM$ -#RvIJGj^`Wd4pdnr*YGyiW&Ἢofws,;(;Dp8TG2o(z -(-tPV8*G X%%4^Q ZQ2v7tVr.''CUt|YAwR4Z{q8i\̜vfInK&CJh65Q[UEi@uJaJpܑ[A\rM2fmf˫ȫz~=u\ -rꩮiQu^՛Oc!.0O.)Jq"Ut>#޵)'}qZ޳Zvk;Hy-#MN#91,=Pҭ[VYTBydjgmԖ93• #߻1αf1!1tH6K -Vڴڴ -pPhJ5ߦ?Rm>lEmi[E5C]9=qhB*=-h'PusNJ\' '3i1ƑpFj?JGhMqZ(}Rc5~U~f0aّEټ.+L'ڰiLb! Mtv1\ r+%KMAhBZ$s.y<DI5\hOҸZ#AqF5j?zfY,~{M)8iQ ffg,L%iOiE}Bc -FO}kI}~u}iuRjRsJZV{ VByErӎu%KLdJ~ D,RaD5X9~P3֘Gx xFq8xƥzF7Q$QBNts,WҵVTZU"fV"3f3xJ-hb9W:K\ZYiH+5)%fVk4lj$ózfPC*مFl%G0 ILK2u@h IX? ] #16 sW;c -&{y󽴎rדP%0jQYUe~D>B=wnfT8!RYfjM&IF F3J=BcQTdׅq jK쯸Qw8H"WGɳC$ &E\Q}!f=ZҐU"33xMJiObڱXJViO> L|鳦#.zOszd̊A㲎N`Bd7L5TLJvt4Fo8o5#R簋GxǦar',aU -ѩ1U[M[ִ5{HƝ$ahFꡒi{Љ.\heA )" HkuĔaI -+.[ W5olp֠s^DWfdxNp22䀒 Ġ.ۺ>w#[b ҦUt1KܵXxQԴەh2\&k -)i4?:(0ld\@#)c4+QT&LGQKR -<7L)K n,i.xd;I\K)VPUsOQ}?GLFe)]IMjEe0ElL&m3-lKVoyᆰqU({tTJ$BU+ehQ&`$E+VwI؀dܐiu?n祾s8 i23&5$c)Pp+NdU[mLFN~ܔ)B>8nx;-AEqL"Ď*WSM@)ʊ(n2MЦ)Pv, OvcA&2c{;F%߽pY *@k -42cݚuG&-'.h$ErLVDFQ{r8>4vvie9_6j'3VfUJJEEhFxVw^7\J- -St?Jx~ՁϘ N:SqU'-\`0vv1۽7ÞH}9hRJBEOixLf;䞆=FGt181X3jtD5iˉ,#>z~K'z\I kCSt[e냊[XZn*6ZW=ʔШ!.U&~ģґ}SyH(6b"Xa}\4{8Jqa5?Y'Q=,#{rJpk3lV$)UIh8Ͱ򺪤{8rQ$ǎs^%]I}|&sDD)V9jҘl#0/t[RyUJVBIf}e2k³n>]!"wQDwIbc &;0+ Z8:nxվACjѩ[} -KÊTjR1鶴Mk+{zGBT$Zs(ۤJlO{Ui7(uWD -9nZ1k5pݕ!%LoXc72?qP PԏK6"+m-V:X ͈dJŤ]}5_H4RTS:a C(WPRLeUSUI•!w-+/ֵbҭfY֪gvw*1Xޭ@L"R5 !}lt -w|}R">Ui9-S_L'v(Jsi@@q?Dd "ɖNa"ODx4t1>ˎ"h=5ѤN6i^ӍkpmNj/PSÖ{*S Ls[!T܆p$D@#DpWJ_THUEsKq3CFVUrK!-1#J@J(었hc Er.Him6Z9Y%$"GRupI`Zxda8xtƐESFtO6O'S* 7;KfEzEZfYݚgv}OElaFZSp4% `)'Fkf;mBb:'r:K9ZVH!ZY<*$ vԎʽDI ߊ."w%ku1أ2idiH_ARµL:4$ܵ/*7f6A5>:aMv?MpjV?j4)ܔ6H=ԬзJ dޑ -Uj=1?X\BcOW kv5dmTUJ}[ch6$y)co<" \WEtߚY0Vkq&3ZY_=Lϰ;z q[R'w TXژN}!%c4PԋQq%B%6׌A%EEgvQ+R;~ե+ڕTӣ7tR@Ʈf̾u)}xթW*CrA>-2sRHei -jL-)w!-"w!ޕQ;X:(G *3RY&6]aosVKl.8Gb㙳}֪6OBq\Bq\$Epx4⍆&il{>ruDž\Z"+&)d;׺l*J5~[>I>u+tB4@4(ı? -5X=og ܛ׺_'*sVo}U< -yծ~v޴p_Mu"sXjMisC֘ycauj|co0l;7Ks$']|Gv8&Z(#cc}2UZ&<+L.c4f_|vwbRJn0/i/G$ eZLQ|LJ94Z!&Z֕֙ˎGE>]E>!~qh rsNKw^Vs9S=9mKw~7^Ϲh)c +M1t)tltUZHӵj#SuD BqZGYgHZn~KV(n[Euu`Ό2S v'x4^[RX4iZ'3S_N@?knW1qP8 fXGKd_I(T~bִYX~dPi7cU{H=++ .*rVW"+`ZۏIܝemLQ5&w4m"ぺۊ߲Dypv(m8Q0=Wfۣ "~y[BfTuR$fK^EOg8Q={L%Zmc")G<)ڻVFeH`EC$ {QSMVF1`qxX4\'r"Ӆ-_bRn2A%4){6joTdMT[>\FOY䜈ڍyF LHjz|(W5uq[*2)G/ʞLz9P4mUOLBݸξL"RJҲmsn[̛\RĎ{Cĥ.uMحH*c,TROMǖ⸹BڂڀUCΒٷ!N6L -"%Mc8iMTMku -+e]E~k\G]3'ZRr΢m#Vxgy=zhgE%ҏ#jJR*jO9U\ΎQ|3FhK&A4əF%&N=lKċ-twI'<ԻKR^*;ki f5gcܸ"}߻julV3+r\bq%t -o9Ɠs7<:-_\˩˪ڰҫa8mI8Q:5Jm4 !V\ّ8}:2q#X9l*O?zsYF^;ЦK{H)JB1ߘ"A%^V2 *B*(C4uS# 5j&nL~*.02b6Ew%.MIEߍɽw'ZwjNs=mb_J]ܔTߝ:ZM]R]$ҋ :5&_oC=n4fFy5q2A UcCV8Ƞͪ&w}izKOeKOdtܛv:}+g4u|S;onaSr_ЉKE6Wݩ# նF˺Uc͟پ[&8)LJ\yP KE.ÜgY1 [][4æ0b(yqAy BQR.kiw&/U=ro]KIIK)wU=7+fn%w"[Lz j(Z_>RZm,hy=@m~ʮaQ o"e -.C{@ - i5l& ρ+{pew|<%\n]QpKfC"e]%D@t@Hiw%/U;bתR;-[-v}fJ4Bӥt'z/3(Iq2$uMǹ}cW[ c -wRYl;>r% wqmqA`)X!{ь"@b!.JI@W -NƑOBnrl' -:tfd-%-JUN&h]lI784:QLPrD޻vk4r|Ƒ^NǴF3p-}ۯa)쵞 &[%UPE,4wKĴy2!tN#qLx"E^u%&ITC j9aq.W<. [tΕ&II]T73ZMM]J_ ! -U~񯈝K!4 30i敹M:<%] Y<դu 4%ګZ >u& DMeIQnkb^mup"8Lj&XjKY%2:-W(SaI[ .l R(5 G"B&WSZtL #Vxh 9oZLڏ&Q e,\N]jZ? X,'C7_kQz1mMEm! z0N9e^E(b[d*s=nwζG|Us8Q D -s}]4f-,ծ+Gj{E /kYnDL ;4Ɍ"}+qdӨnG1FjTwq2)wD{Z-ndVvJDsĄN&|wjuTJl}7R&кӖ޵`L\wAv.I: bl4 -itr{~>QN]Ҭَf```ڊ]{Gj>{W9neGMw/L+q]ZFb˯$ ĸ\KA}Jrcj h Ā k7C+@2i[yp #{ G7J5抂l1RSlETOjEqFH(ܖ\8%N< ᠋w8/DJoSͣfv>5wϞxg@mMTC7Rc9ӡ!.e>-&QGe"64ضe@nD[GZqn[:kj67.'Z]ɽ=ub#pXmז#LWe{ ږ#IO;qK/aubUB[jEDT¦kE-P&AFKT -k'`W7$huS0˘L-źSnldwݸ4P - 6P/\E7[QYJdm{%y[R*el\lw!!iY-"2޵_b;i751ߚԍDUQ98ޗrս% )  |ocE: -VyD*Ԙ^"-/+g4>4+j7Ҭ~m{\GD;3sa`[)T٤&]EآX,'@WGcWX>7)Ih!]s(`K=۳k5S=l|7c/Q~@eN@e& ǵ6e旙@|NU`DKqCĩ:ja궏lsJ: Ao%§zN+7gvwخ˨ۭ&Q~C1Pp2kZԭ'Q3&DW".Q:l7c|&k5q'\Ԛh*</5E!te`ݏ!wK'xD1[㳵ُ%>uqYzQ:zDufSZpI7=!S]!=-:1+fC^nNh 5mf|/9 2:WtdFnSn2&6G7NK<*^,wmȈ%JeW-)ŵPt' eTdUR(:@ig~e-NC2b0&K h=a{io*9J#znŃR{rzk@A\utA6sX bGm4Ɓ$* FEr\VAؒ**e$˨&&gS.dG4e.: úƔq} *k:B\n~./,W85FTX*o'V*- -$]Z͎Vq*K*pRrVwVEֹZm[L0\"CeHq[a*dfKU7-D+av~GJ +S JKlW{l\NY_útpSfZ';&2JUe{)nΞS:Sm;)4e;v:g) -liB<]w˔6Iˠ`.G,!#ڗÁm6_TᣍRu^S`A+tŒ+i|U]Zw)ՀJҌXv̦Dz<ӶUUO%cU"k!UթSp/7$Ԟ*z[-;$bViͩbJ\67wtͲjV4>[m@`d&_$iET}*ʐf|펣6LkVzsk3Sj+W R]%Hjih >y.ēfa)$:LeYxr 4 `f1p.5b2FIsM|^2$VvN9'AO'H.ro!"[Qm}mUxh=;Dݮ+f8[[/EOcJ/^5{8LuԉVNjuH_жuZm 3M̌:*뇸K &ӏG8Y cq Q͖@'Nht[Rp^b -GeSnyTl -<&˾mv26WX>, -~UjڽXO. -">s DVJ* I\B$(w{4>Oʙo8$7f-(bH82I> -2Ō*8\Jp牺SdgEeKk,.J:3b o>풶DrCJC}G.Y?2o>O}yhlz>Sȿr vSX02b]ZF_\fx`Opc®7(-GhO `Su^5l;am>[٭'V7bQ ՏjsO]ŐmT6ѷ0Bz!a -eF`0h"_&0XW0 i@K.'fH8k?J.{R^]C/Fjx;:]Fq&d<*5fciw|Syʴޔ.c  Z<>kɏe2h[^#G(d"HHKNHeۍmYݟO]~5٬f}ݡܣDhfD'ۤ\[rYp]:<@&*$F"njVE)k (bB+O:KTϨ’!9"&mwima -Chݢɐ֦\1.ѝp:3!># ©dIi֍w -|us31_Zc.V(Wu&N\a:$8"(`᭘t~:DDMNtծ R8!6Z20E'l3V%!22J`"!BK# dI,]=KHrm]}?#bJpֻ]B#æ2@()=">ظѡKݽ:'ZȒĚx˝Qb"=uY/N}7UU7'چI0IJ[8Bئ7Kc6xTa]V]DCZ-ZKOo~Qq(%H;e2q1BZZ~;3%8*HI8IN{YݚE'f!,6 N)Tm@EϴOOcܴO޴jM"BHDW WJff;H;bSnj<9Zж*97D' [SVM0U$IY'g .̓S --ř -V($2g-MɹLM[ߐtu,>WXmoAj$T_di:맲JZEi=o].ؖLIĝ$Hq#bD[{.E.|8Nd -#I.4NH~Ӯ>nB"A>EnqPF-uMS#(:5d#(h/o__]y-'Q=s#%7~=LP_fUv\ǰ'Oj(U'_)6:h="r{Vi;{4맳ZObznOo!ht^jA eZJf7'e&ߌͻsMb YeG5<4N#hSLuyVwf}Weܛv7cڧN Zb@$Ѧa.e4W Ci(WVY;p]oA g kwq\4MWaww^"6q?O rEѝz!C&NvJhGęO4!4ZM5- x[ c)6ӆټޭ\ڐ~k&_Oh|uro^k5^huvJ ԃgf_*{^khJO&T&[$}=!&ضFMҵva6 -J8;:RZhW4QNrOvg3$x13$Yk_Mf.^Wq@b UM(ki -ʐhk~)lWi꓂e$2"Tꃴl3 -;}HSXdo sevx#qi+iuFQ)Y`È[>FIU⧴ONoU˷*luTy,[( -oǾK62±$v?&HK _}0MZPiDrACݴ0HG/nF*3Us:{0g93hHwtqoai&ؒEx.N,ie\_eZW5%\pvP|ORQɢo7l[qu ֛qTM [#[CKM6gZw- -hs4͙?sr}SwJ\&Rnb'uYi7&rS?021#7yUCJmɆȷpj!L*r7 H)LS#Nh@&*$g-jj L`@j -}AˌiڻST8+ b+ҟVׄXPQ@lǍmm;с^)4ڶ.3mlM0{FX iU]r,AaPr}*]B -of:[8`re/sg|%79ޛ[6P:T/JZO`fւLp9 p O+qZ[sh޵W%fGm: skqRiXAnj#\ì AYJnAyv~ӊǴk5V\uS~tI -MܗgDs*ia1[nxnDN2Km8N*(%ZJbq&fG9rLM7#j &2JiN܂L)\4ڃ#i"ǐM`\cmMר0L[|\IѦ7[h$bd7 :IqPgqX,k5gؕZD=!pCSUo{(D9^şj^б! nͽijsҷƫ2*Tڝ&azgu>ȵqL”P\M{.6%qpwEzU0@ -lnZ{iG .i:u7Ix{Dh1zl,"- -Ls* -\!+6Z>ޚ35;LleAz!z ȏtT¸hFG\_k&)r0z ;MfQ^Zp d:QF:tM3Ip{>wݍ^=+`)_nVs+/oW{ ɴEY\9(DiI[HȧE͸.IߓRBZkk4l Gnڵ['冕1?mL}HZth"r_4-;;S*Vy*;W_-Onw-G+h߹V)%Ho(ٓfE,jS}UlEݳy6rY#.."*pw]Hj ˱ vu]͖=$n˳"ܭƧu-m)$s[IA;pZ3ogg i+|taDBh D@Dk~ 6KUVÕoaq8ʴٙ%}u(a)䝴˂U IVwm}C m+ tY1m{i_eT[BHipwm1kE(IQ6 *%ZК]\Ӗo2ҝK!6ٲ5g5%M팪nԦw=0G|9zY,qɋlŭWٓK($0hM - ˟r%a1]2`4-6؍%։GBL0IOu+°cB:TflL- T{qN/Ǚ 3 ޮ<$+`̸On'H:sa$֜ӥj-GO["RVy`PRq;7>zHl¸4*f몦R_hMHTW ) SR&26ۼX ;虫n -$80&r٭Î $ŷ%쭗dGlٛ7%\;2̢'gM|猣 rKsƼj%h6NJɅEǴ̄ )!)n51aƍ^:'(\VOA_>+ Ġù.XmB᠋Rə ek))=k=s4Q1EZF2LTVEbi݊+#+o~HQ(,-\FksnHOŌxwJ/T@EK4Յ_}. FfB:WM:֌өb?o"e2UkJ֚X{h6YU'+ *zvmYHǴ+%}8[JZvJ$Z[:"쬍~6>B+vNwbXjvƷp}\!VL 3*s̘AFŴ68^^(|P+6 - .h6nua{UZʸṥlUqmzjSVD"2D~(]P[2Grl 8[w'!?iqeU9@3b5 SY)CL7Eİ"`!<:$hKQ^-V."DZqFHԓOW{k}_ЋYA/g|*7LOIO"ҏ%Bo'ٔxbk2![=Tw0e'sΟ$G HnTkFP\WyAh>bU"oOVV=V՚]%2hM9P=KߙƮ)wp^'g+B[=4@j> CdZ H:nMIiN3=@臎ݘ'ղ1EP/'lt DyB>btU f:KRF66C屑4SmA6*zV%JJ[=ﷺ[<[SViqMH7|W?.VP@{Q8wҶS9iS'UmYZYL_yktFkTJrISmƘ -g;:'JO&܍8$K eG8[}uH!]X,Ŵ\ӎ@Fd!{95!UDvSxLGd8ӎFиEai-@ܷz\mq,ahhBo9 f r ո| &ks Jo qgQ/ i#<D/-];G ->^.gk6޿L8=x$z7cbXV+v7PmQ-Df,drڕ$`ݴ.Ye(-G٫Z2ަVq,i00D$m q[')O N,̍@6---YIPඨEpCGi:h*ڟCJs_jHjݭ{!> e4Gд=[B,V!tњUf; gHպڷvztj<[a8Nͷ¢CÚa$ΞAg/qB<\K؇Ŧ&L"m']cB&=D2N2LjF5 "FpEUuYD'\N {7Y1ZhNХ#A8IN] SmeG$߭̊6LfLm*m kWY*(V%X ig;B*^ZXP/ -٥B-mf(G<8פ4N5YUU틇i`(5f+jwm_IHe0V3*"qTZnZ2L_ -T)nٹwF/5cǤ٫˺#H7\@Hw{lĄ2ѫki - Šhm96K<КG,w\W[\g-Lv];h^W܁kQٶI6J Hk]-kp#.Q s\@E’R/?mqĎ*y'jof:cJ%ME.yMo1Qb1LY )W2kPQR$VcjeLjly -i{zIMOL>^6CMZ!UG )czi&)+i'mVD4Ap5#OVLjV8gL]a+lYMka1AAq vwh孒_N0?u8Uc"T7,^B4fSqOjrn8tۺ:za-8qNfNG<4ۯ{\r5 78ߺ/O a.Rzkcu[F Leh,jykhUDWap^Ď4EWkeq2 ]{l xE&W5r0aԫ-q']gwL2b Њ߇W!H:(nSe%׈rW1.W ]}BQ - -P.%msbb=-xTDdF~i9pٝZ=iUtlPs_VQہӎmhfbҊÀӀblq3 j8Ds\u7Zēsp1. s- +DZ6n ?mV%.1]X|(Ӵwϔ/AJ\+ -^VֳW1n%Kjd}TC+A=vGdđFq $ynE=;eOl~lЛDݳ~+>}%>9aZO#EZVrPm b>gwj*~+EHPjTy+dlrj:ZѿodFI4B37yǡT2Vrjx ˨H5`NUHk_g>6\>9)SRhS= UỲx$<Z]1#H?vB,8ۯ0:&]BK -fR;tn - -5:+ˆeS -$:TQSAEEdsBK(hc)K9F+GoB mV M:\.el@=Kz"awcZ#2i8#mᏥ:}Rbm % /qpζM"D/Im9}LJwRq@ ke<-g+jXվBc7mu7Utqe@1_.|TlVvT[4^:ͨjV6 -RQL -'f1<28 [d% h0?'=q -JrCݲ<펹RQn-rÙkr32vւFGњzϟitÃovT]M9x=QZK_g[uQj5?94֘UW *Mmf[sիnXQ+P.nª,YIp4rmX27Zhu8b"܆Lf$+މB@JBrtmRDf)T*U֖֝mWk+%ŔĮ hqj[K(T*.ډVʹkC -'Wv$@T!Q -Jđz -֧Pt7N5+(^ Iha?:4do+)jWF$9{6,se,V3·|וbϢ -Q -iR`# - Oozk*iR%Jci,xf5fOv䭢LY&өفϧzĔ8mcE"!tӄ nf?Q <) lAwmn1[3 -oһBi|Û nJ  ;/pME6{n  ING%x[@J֌wRrؓaWlyv9lU;h̺MLy NrK@@` dIg枚M(hi4.Dݡ.u|N76# 0ZE$tl.i۠G`t>{Urz2> o;UtJa,5-n6ݮR|ůgq0/5Z, a泡eF{.-@0}%l,SgoAt]ssYS}+7v$' %ڀ(}z AXG26lJDlS;_}܈-UPv̘+S+ -za$)lW]-d}#vщY %>ueVы=A0}spQ -p G m\!htm$]CmwcQ"o=ړ?, q'CGКnpDc%@m"Ìܗ$zp#lAԗ4;oc<eūʼnnGBP,aHrAm>դʹFGr<'Mрx״ SXY䲋^tYVm'-L\gBlE_ڲvQdvE]a3vvmxavΦӰnVf78DHt94lzb4_ p;v[OqoHNVkd|E䳪θ̺WZ8=\*u=SjEZ/qWDGvɢ(m,F-fmf*Eċ6+r*2ɏȶ?zc<>b\dܲ" 'XJc@ؠuɳۥGz;Ĺ<hetݫHr)O&)5@4F~gyVA&#d_gK;Эl2 tqm4xxk o*6RS%h`[PJLgf ^m}yVO#-lIghD77@|7i;?cݵ_Զm<%l<_,6xnЯ <&z<meS]فd{ q=/v7vf)$)5_C**w5?ګhY&U nRl{?-di-vma2ZG>m!b1 Z(x'OqxXЕL;{Z/$blzGbݞ5:TRsUhs-rݳMm.Dw}#yNQa^n$e3\2Syt瀄t&m tf6Nk" %ɜ:xBX4&\sNjrnX d}KpA#bۢKZ^*\VVkꥆ_uF̔wY$2ӭ4fgpӚؓrqAT.1Qe 8Mrl}|iWs fn%rqK#Ww8VɇZglқaXo7J[4?J{ْCwLj qEP{` &%a#X.$twZrke= TRQpc!Z`{5ѝt˰z m !\lf,e<=g%oɨ3W֚bp Y6?:GëKhJٹ׾ USd ŰXh3{\i#O/iSqAbj> QS -AH8fC|7dË-6r$$5+BiW;+33K)fs}ؑNH'G 1`̓nk'ȖY~:FKn=oqV]j(k:=Ma0lݟ$s-6[)Qj\[< p¯Wg=ҹ+ڢݵ+5[BN - L W-`U`ٶg<-ݵU23 EƬQoܠʭ(I.ố)3Oizݚg/hHJ)HTI2(/4̸Ӊl 6Wi<*ZA~ḅlpd<-׸NN/m'no8\kfBj V Bٞ+@&(}Oζ^P26gCfCn.abϦ;j"^'Ս(Ô ܬii?>qɧ |d5'5S?'))>$LRlݘjv;:JmnHng!bT) "mV(ԳSY7Jh;dDボѿCML;x5$D-kzmoV>G>zI3!#vwgW2&82w1_""lO|]߈"9p6[-M$BkNihfJKKa:T'f&Q79Feq˄۲@KGi m-"'}.|V1RYDIojfпjOU2&9\?4j)eK[d\oy2kI/&ٗUg*\fKn?DrF[4U?iǛ"k -Ud*Sl&R' -y͇tO>jnNmlGKimKA?# -rUs)մQlJVWȢ/9Ucn[):y:_ R| - -OX_ ;O"Utq,<[Qr(XRoe.礡zTDW[B j-#+5+'`h$;5'Щj4eGnCKY2JWbC2ZGYq :CG?L*} Nk[)nF)|t:ݏtU\l|j)(l Ugw6%dl[!*kjUlvd+f|%6)Ueb[/7Ej~c -T7[fK"[WNv[;2s nmtmѲ߰;^(J_ -|u^pj絥[uJ|5f/[%Un35u,X*-l wczyvlWKVc-m$[Mvuƻ4rIT 5"{qBBS$)N6\"lT6n#HiٱpZq3Q H:?9-sH0gc{rsv͛(ߵo7z71؟.[7uZ[+,ylk=ЕfGMmWIHkgIv*yupӔej|%>A@lU?-mfV*Be׿aWoӕ+d+d9۟Zٯ^> /S򈵱@_ĭM[AkiB/4,'˅4ɘR^ewrT4Vvd7)rfm:n?E'^ R(WSn֝引mog[ȭmُͫ bGʝZkFM -%Q>2[Yoտ9crVHB۶j5ɑM/djxa-mm}|)[ >bK_RVZ-[ J5BMUw_~w -b|W[kL5>]*a|ڮbL^Vx.bV|G^~)}]k8>Wزޞd7vQU -|SkjmY"] l_?[3ץMχXT*j\lX< A[ZQKFZ3y**ݠb1kcfҷJs٪|`;a-+l+mRSSeq[ jiEť0kc|j}m]@d*gO!f{䚿v6vG*ٯsZ:U@ĽYoS[@ SU͡Td[Sޞ8NO#M='=j|Yme,oG[Ms)ձ£h:ew2ѡݧ*UZfOک*N'U1go[[S?V_s ->[:sc6tTTIw٪mk fZovWҥv"t_lgY-*ۯփ[RZ- -\:O"bdWVkf _&\U1?XElA~c!>]p-쎵$|3IM|SR~.W!v9J/% -?uWO2[K䶺vvq&)5ѭοV_(շۭm;VTklB+dgq[a?`حJJ>.V|Ca?߭Y3T?٭cgjZ۟׃[VЬ۩IVɧlxE*oUl5t¶&c[Oʮت3kd0j]ERQ7C;I-ZE}ç2f25r/dD_Twl+hmN$~JlKZuؕ̅l-HHsuvxq~EZuZ;[SwZ_+f࣫3+g<]Zn4~Qi[__RҊ3R󽟦1۵m/Ql2Vr5.؊SǭD-lIJ+nZm+*eFe-I[+1uBlם«?%m+cDll5Ʈ*:?/I?":{v1i-ZGl7Lwq5{{f[GSj𽮶Wș򧖮>a6-5̷[;zC*xCWϿέId~|Z,eT/$*Dwvf?k-?mOm?JO4bqa~ɈRV{?,uxZ[1z*_5[̀R+ -ۏ-[- -lol5®X ȥ t+[GZ#rۺ=Z?)[ S>^lVZ-j/w[+P=7-mͫ6ُ"[S]moZ˶am̙mu`mGJ}69Jdv1Jo=W'N˥m_ECu_e|AeoHԗI[eV *aW%oSFBJ^Fm׽C{=7d_ Yf~bU鍝[/簪%mƭ_+d{XukDS[*Z%ZjKKg;9X% -/i*ښvm+k|ڏܨݘ l;kn=%\;)n&E3zj1cDdƶ&ӬpGDjX[jֶuگޭ5s+Uj𭢶+-lrkm͊? 5X-"eQ+joҳll `/[iտ]kdJ&VEنҶc}l|V᭘1JoUPQki9di-knB-j,+c⶟emM 썽(r -D-ywX|WSVJmg=[r* -v?){5lgO󒭶F+lj-_>ՀV mZ~@lDpXi׶5 |Zح_ș\•Wm5{+$Nu*%j_ kbW؏6v¶{v䊿;c0٦Q*D_ȟJ!텫5im-XNl[M_W󉊕Sug@*n⸛ܶL9QW󽡭OJ/mQMEldUEZ4@[>ڤѪU 7T 8FI,|kk|6V|z5Cյfm'-~rZy:|U[[%kd?F൷oZBE>nuܬybΫ-C3r|-K ݳkHm:ԊVؒ CZ?~٧*%l_MkbA[)LVƯ'S+Uf8]!fF1Dv2n}^/Z֬ -yml2~c%~^d1`@=U1XLӶfȚ phD=lP߳ߚk.ͅc"Ô[{> ^%1w;V1`16BILt-7&d%d^TyLZ;JL~?&[qik6G@knȔ)BKk( 0$Qrkihn.IҢ8&Qrѣi[K' -ZEim`3L6rMX-mo0vI ۷hnw晛rH7iv26&ޘ`n1z=qN5Yb_ Q#T)Mr=!M؁q$Чbrf N]W6ˎ1J$(;E;VjAvRNnI20z뽲3'NbN!J$EER۾(`>7; -n8#2MlaT`D>ZϕO/+L וvOG34TlUuq D<.[4q>ݏCu֣DiF Zޑ--I2; -ɛ)1^Bl.nEI}nϜٻMqcX9\6Bm;0X`U=?}v,\/C1c֗ƁX&IaMژuZvP2/. k tcQvv~SjT 2ljܡU0ƣMu9cQy]̫d /S0*lvCZV踭9h<ԥlҢT@-jOgf-E.aMEZێ`*V֪"7y `AKIWAZu@R?)H0<6s-0f CY#8~ -dG\f%`qO#$D*(P}Y["8P340(?Z{w}4m:oGb: -ped&Aպ9סnwӐ>r[k۟ц*Ţ?nkBvͻ|0$m#fPP1)[.۹ߣݢtž5=3 崖2Fu zf!;,[etV'&ӛ]hT%}MA8s)rM1fkv{W }!l[43][67m6J|ԩb -0lDШ*gT!SJ $(k=nIzvuпlIXuWʈ\&А&\mAAB[(N66b U\jNl}IpF`0 6i z%ٙRZ$}s_q[pSvYxpud0w5x*4Cz1) 9 [E)#\\mU:CW3eVNEx4 (N@nOP,o57oJ@O, -+J}L!"|V@hѥ4Եt0΁@Ј\A -;Cd˪Uc6:٭3/?_vhq|?vdQ WeQGRzn8-ڥ;*;M8 94/4MA$0]΅! --rWc̺E~JqM.-j+B#~Zj,M6?Q!tl*+Lrtj)9^̐@m.D+$r}C-#|J*^ɆfXWƇBW],;kIL͌(_{<'dP4X̮Z`^_57# -kT#[b%#טԸG ІcS0&6hpk]ѥhX- j"n2#m8:况\mI-%E)j< 4WkK\ƟR/Ti)M.ZVQ~v(D=‰NjqT`Dl"SSvh .C!Ex΂3D,i>" 0t/$Ƹ'qSkItS#D\*5!| J 3DrEUy\.e+P?5n+ \0^Jw -%;9@j B4M'i3C3klI0ICԔ@EUPK:;8BT撝ҮW&zB:UL|) Nt$V()K>а%$ezIΑQԠIC W=q 2&,#o6 )2qHyfYhi+:(8: ?Y4\$p_XH -kQ%; 1 $Qd%i*SQ7^ϦptC?gO.4hCX$_Vm١&Q;֐{ofESz3fk#]$z- {m3‹M"&5Q+;BKb3mD)y"նǩ]pN+ -Ba;Xd=qp>e :M[/W9VmaT`^׳OUOʚߔJ2rU {1ٌȴ U˵h K$ܢmqWVP|9'el['<禮)Hyj ]X3 ]v3,+}VldrKʥHrp!w qd].\:0 -?l 7wpR9|-ݩf <ڮRG&ޚ&c!+{\rxsJ'іky)W5A{>FUzgψV~&ř*˜5c,*]<}YUˡXZoTha>lx 5B{=opVEfC*˃=$LxB6aFNJr;| mr .:j=n(်8w 7N8Pû\^Dl^%6VA.*4lˋ -,GuDiY@-$a3Ro"sp58&$Uy֤Kcc5%b3H(Mɹk5Uf7=2aJe/im43اC2=A2JF`E[6nn|,H~ɆT:bWXKxXh*t4M-W)q~iؽK4w%E]-pJWQs2rhëRQ.=D;r^n@ 8S.7U;/M9ߚfYlZuQ#9[9o&۫Z̍s;d5 `Cj taW-V7 ;JJ,kK4 G36| p^(BDz:K_]cۗM_$sw쉊ٚOR LQZ%L-l?KUh e6P%"<#X7FYq~WU[)lMAf9өܢ/eJ{U]K׼+[-2+hJܭ p68 I-GG6 gfd!VRwگs2EWwK*'Գiq;O$tuZ;w/U:Ƿ[5v®)<4>i.q2,"J%fjtiٿ(cH.m4nm3!.&Q4FVXO-x}SQ/E1;GxXq􋝐~*OYwm(n`z:DLDf]Wm@f4^E|Z9v/$`5*El&Mi`hm@ċlB61fl2E(<[p jHkFsY+Sa8KvbT+k75YW7Eux/qYzPn{Êޘc H}ǒ3AIuM2f#KH=m7͖ ;yH`.#%TAq1 ̈2 ƌt=o5]AEJrMn'{nG{N8Y",WbCptQP*㾒t%-(*ְէRjVb7ⱽ7b=gruS涇fգ T4K U4V) 0Ovњ-#/X魗W5aEk'ߒiQm,<|=m$+暉vsC.ܛqh~F*{-oދ<*gLd<řq}6N]E{jEƏzTa5AhQUA+_H{=#+%Na}+ -$7&D5*)V0[A,]X\!6|㾨ط_$mY A2=~V*jm80ﵵЫuU:tOxV;+QKdf[r!ίeNֺb%(!шD(.'wSqA:w:-PRLīgl2QjDl۽Q ԲLФvVK/rz &'w*nEڜUfU}5[_ W)mLz.DիBb -pVi!c0QzdA]cqNqm -`Qe>"ݖt!C -]n3b хJ3=4ٵg8-ڐe6NaM -@dwC|ʟv?XӶ83i" `$OVh^eOi5=YGjŷ]ble=+iue͹LAT |C -)6}Ҙ [W1iHWf"`&Ik]7 p1$ ͼ)\eŞM[RcT-v'ν\Н(Ѯ,ؘCJ\SN/ пJ]ݍXܜhM3dZh (*oEMEN*8h$d]G5JQZmo v߄4RFJ,q7%MAuj ^McMLZs! h҃hd?[@òm4dvZf3PY&7j`{;Mj(QR@aɂ=).IoR%km4w֔BՄˍ>|5t-6V<'QIƓ\Dv8mjC#bIG_<ԓv}b\!QZ{EOj3υ4f8hDiHp>諑aq\RsgPp;1ՇrfQZHtUuFC qǕOAZԾkrH -%mq[*O - - oM,K5zV|z.LvBs? m 1붞^uXeA-@+_ZMݻ3UʮM -mdwl(QjVQ t# ߙ^qM Z6jŕRymLLYIWW{DUMVԇ04_WzuS_ʿCIV5q90%MiڏnSӤsvxJݽ!2) !> bSUkiYhLფZuUtröSv6{ٜGC,;x׫;c#;U%[TIw[>7-iOmQlPQQ(66ض("C yXă2;S183Z.&[)DW$:ԖmCf 4nvew ;vdWWȘ.pFЛj -)FB7MGe^b4vfjd)BŇ -˳Ôp0JY">[;׍ Yi>s)fYIŽ V5b5b]̺.Ekh4ك 7'V>Izj C} `Uv-6kVTjRYIHL_Z!} iשrZDM.zyd:HQgT49>IIWwfazp _e.K#!%Ķcnv<]( dJzsLe -F}# -^̨-3=f&Ͱ:iKJEEL>, -JBZUEBLS/ -JΰhGi+h][mL߮[TT;RI`-m:1q^Z{G 'bLLM#r4/ti/L5mRjzđsIBQ2ݤVA@COR_I[)ۅ%L<_Q7Yj13"@cs1.̰1חnb)IN]\:{ uטH9C1bR<'=.X~L> )+dV@k[cZC&Lpƥc4"-m?Ўjҹ gϢH5l0yir5Kuekƿ)ֽmVU\Zf3m̎ -إF,v -j].["ߊmKS፺[Th][GwZSV Zo%[JZ)xei!PGNO I)kB}E4t{4& uEԉnnfYR Y>ꚙ̵RKp j\ǵ̸IwI̐b ;V|̘ b&n0s'vDOw>-OYn>'b#z1l @&gm::0p6\wp5}ӷ;Lv'V/:-_{bلfM%mْ^S:T{16*FXNB%^yD^1X5XJiEQ --#hJ}Sv"#,6Hb.c:df)B28v\PXbESQղޱeO|5wPQprm7` ;-8L2 2#zDJe#>AuE:P͔^ #hN¬nʵ|uCܕwI/ecn3gIvoBA.tI Bou0΢uW )x}3@!]k% y)HPrbp3YDSXMإJҔWS ؕܺmi -կU\e]*rdǒ'!tz%93ӕYȰ?l6!VqVqv#H[ʋ.R+eF8d&ThSd/寑9qaJ%wFi&(Lr㋢ xXͯbЏ:xKJK桯M\-*⸃)jnGg(fb'YdJzȃ%@c\ MϕN 6x}UT!}G=Ϲ*-0UcR (iظ^7K6>W5}Qd{NaZa}Vy,µ`t]v m_ -Ut&ե4!Y:Ǵ_Vا]S9mBiDFmTfyLrUvGI-;q0w[oN*$:ziڎ7Qb0emnOhِmUDJU* -Du_Q Jg;sISwد˯fZf5k>:I "Jڒbh*fͫ_i*$Ml\>gp&CX|Ly4ղ@Iq"QE"B;-WQ$\Ś]Q\לz %%$rPX|6\^Wq#5ZV\k_[KiNb:,MYps -ҙ^ -խ ^tHd4z+!N&]"v#.y)Q&'@hɒ,(.Y -ۥ̢mӦcU>rmteCE;Fm`L2؃xAq dE¥ڵ8 u- | э ݣ~JwmE> -@,N<'c2 -nϊչ "iZNkHQ39:C$`# ⊍CO+mSf;`#06=G⵴jivCiC斳W 0kߺJ[ciE\\%ͪ5!/>se -u&j\ԙ-'hUe:% ks (ԙ,F'K7b -*j":p$CL+V7cvbZijmWV+bZkMi5TZAb#-@531 %K2T* ndrA)qM QSLըCFRqj -2:*-Q(Nб[@9H[-U]A#u$/!*2W:~|w(ɲefI*{ A:%Y?+- ۇI*Tpj9h nS4%d(Tna HrVS'Pa9٢RwEJXЁ~_V(jz\ը.Wa/I1AΓ ѵ!~=1m?[t`)MjK&iS^r͛z$t>}QyZ.m4-lTvkGA5ʩT]W -Î˒1)Pa6+z>V!uF׳Sz to@ԏN*YƱIOGMJ%w6ՒMυr[L(u$w"rc@]ؤMجVDZ֔)|Sd0 (b)mh[P @ AmAi>U=P2}SwdOYx#mt!r{^BBuc6n -BJW*hP';ExqVO]]4GսNFV>q?ҦR+ (SŴc8.h`z.G̟c*S -ӕleS=~cZz^,/|2ưԻ2 ROאE#SeJNuB҇.h !QHe" !NߩtL[4'5> -o~+O)h`[28XS‰ G /uNjBDⰙ)X?ް\Ys씊ZViYE%,Ȋ jn.4nVۄi<9DxtYeZd]$Q\,9kdՌ0)[*,Jj"%HkKzϽ.k%3W 4?KZkJRk?j$blΑc1rV7A"撣O3kODRa$쉎H9_[ܱwE5PRӛKn(mlRT#Q -Znpu #\H/*n>lR-Ë%whl gvS-]ȐpG!RAi& -ȁМV(-;pZl5hlJ٧S7]%hմw 5%r!l6]b"˄:[IN1&Q\ae>櫧)[!(%Rt\b/[ cTͺg@Gq1:KDN$D!hw0L&ʳ;R7i wiHIOX#W,W3hy֣9 swx4-EHF?uLcG2\'\4nZ!n+ iD+i>ü3)"lju #b4h f9\`"4oh<\Al+S kWai-ǣz4ˊ[$zIXu1ZwVqO0(bR`ǒOcSRJ%خ*S8wY%-Kts!D^Y_v7"u\aE;`)V -_\xWȊ8sМe}d"KcIUWIGqpcZ_Ɣ @ YNPu.c<ג*֡sZ9#d4>Z?Zgڹ%|,7|ѫ$Uu2 |fgitL Mj>z?[[D6oҮj\%O5)Q}i[AKai%\C[@\܄ҋ<;nLASb(M{ȟTxws+p*ӏ@a%'UjlCt#֚+[@b Ca0,)!v0eTjJdIoiMKMJJ3K5d_ %%KekfǗWdUE8nUl\ۢ.ֶ2tӅ~XX1%ټmUj!gs\II>) ؜1 ԑ_z9}"Agim<12(&oMvCLa -s-EƭzHA[LGmq@pDmp IڏhԞ>Kqrj^jqB}mlz~jErT=?JvQ>dj?HHZb%{T{gPS!loh)ҷznOsjbUPx`r<[VN[3j疊*3Xm^Y t#wYkˊI]Fhf<[n`\֢yۓTZ(QJKS3ul|IھJsɮ*^i^t'ܲKUThd\+yPx[j+/6]p䑃F2b+-ŔDOuAֵwV -Y|7cbZQkB}MpGB:S O0)VAS(\A#4Un2FXXq ѕn};VTH}Xw"Fve2>`? ~D,VoW7tB?{V]օE33h{M(_E+6,*q:m^$ tUfDKdZcIuKP~Seua|r2[ML\mz5Ԕ%6ႂ lH"'JEL/{,nZDchU -a1 M0 ;(08bؿYU@_O}6(`䊭̸![e?èͭLݦdM'EoIA"WXˀ9Ӏv'L{ۅ!}/aw^C]6dx#AA 'u" dPG5d4k[;%[5.ji Ҹqi1c"%Ӣ;!{:Z#2 ío9*1W&Lˀ,#Y"{cR-lϸS{[CnEGz\1@ "0DIldƲ2UoehQ4K$MbI2a;kw \ߢuSyReW #$MدiJhN|c4*%44` qSq7Q&p]6qNZ!& ZAyzTpQ8LNtRӍvr ;Tv9Z\>&!yaz)ҏB{+\P~%;`RFQ*R3ʕSE;H]C)TMlp |k?%?+ߴbE -9WqRSw wd- -$6b 7fFۮ@@T@ќY 0J*U Kc;鳐 smu7^Al4V*d"u&m {ضgQQf+*GHѪJ'_f DbD-A$ gj1nq&Cma`6IƝe%2yPC^`F\:e֥Г/.VƖuDFЩ& Kp>jnGJM! -/i9٦9[*) a_]Sqv{IŒ/j{(1$yg8qw]fHˇr_I!4E&Z1&+KFZlHM%6<|HiWr$.T74 s'y:34i|E6>)9R0W7K(:D'-:kg0]8*."ۑ.I5RrW8aC9,BNSKMWk'*ӫ]Kءggrjij00%ExB5!(VN&'c,N016.& K72+mT8_ӵAUq ΊM$.֜+g1ٳ@w-I#箂tw%KhZڑڿ@JTYMǣ~t@>fgJ2=)Bض Bc#ߠ_|][/ȧ̐pu' BFN:4U=E]tSt:‚ ʚ`.jsɬ"-DMcZn dW)`QZ?zԟo&R -V)3ADkRҙFA VԌ #k%|ɲ(;Pc?4+\D>^sV^&Ґsʮ(~Rb)C)j [cYjSr5T[ENl2lm)"'bR -bd+F֞kcGP@HppY2e\M(/k'ћYW `CpkmG(bA8}ԖpMmBFq.T`3;~\\&I1 -9Y2Nv:RZMqHUsIκK/0ihum2㚆Kdqp6=*TnCQqT 1i}=="V)r*ʸc @ J ͓e(()HerZkcOR,C]٨M.Rq(,i[y+KÇi60EIW GZ2kcLn-*,i'fhQ-shr?ӛj%Zи'cXX1mK+iOR\RYISgKs;yhkj4(Ӯ, ^&hY=FJ_} )}.Q[$E<0頠\%;"eŔ7޵,|Ll%*Ou3OɎ4ӳJm-*ڂ؟hϣm{;>&="a1RwN;nVTW0VA i~ R$H'1O_d:X [r:R7BR6?jp*R` Aiճpr/Y:6 Bct-OC$#V ,}f3nd47f<}̛];)S}s[!QddbJŽh|#uf+dƀy1<-խR6h(*'))-in+KڔӮ/hl\9 s&qp%̝hU c8~ASM9ֱXLRVV(ƤHUQE>Yz: -n;9_E~ 9U,_*;ry)N;Qt~isFb0DJ%TJhtxI #C)*Ok$/PEwUNLEKƱrԻM[p nU(1{IwBw`VjDV鎷 x;79YN|%6tU'- - Օi{Viȍ8")|%[<gD՜5K5r7B%E;iQx641QnQSᭇFԶYd1Q&l8^k>B/W_G>'"VeUˢUί WP8t}LLqIzBVQ@5O?- %^1QA^]6>_6^m [\QU]"`[Jǫ7i&r!f+MZYr7HaQt=3µ|o 㔫8Jm߮k"gܥXϬ[6yU\J%rE5oCVUu8*)KJwīg*m8Q*㬴L9w~8P+H&\FWGt%*⭒79 $3:|p[@'Nj)${ 2ԳÌjG7&\\@k-WHs;$b2z(\'JpIWCVksaDVImx:O6uv6i ^Krً&+ȦFP'E u "HdP\ETT^UDsYݍ(<0myQ$BJ -5q`}'Ix}\܉zkL?<"i66]`P]iu4)R 0RDUUEkd=GR$vS!!U0wI#?p̙ Κv.5oɳ7:W&q;-|y\ʶytJ_~NvxQLJ})ݳ\fXoflZYI6<~QAU$:>Α&U;W$],WR!%Q*3!&ή[*߳ӹ#ҝogz0Ce4򵼤X -nhvǏpaӱEW"'.2\R] \z1#*[͉]G!Õ䂌l^jѴizY_L%$e $@kkf K(]iS(h]|uMbڑ; trADDHg{ELПjDleB3@z0"Uڪ;ngۣӥXL}eާ8=3w"ՇtO; [S{_1Ķ%7'Vv!6\e3ؤwtfTyaàsTf 4K ;>{ vY)Mnň80$rl|Pl| ]%y[L+W||-[}D;ʮ N*"*ԇJpaAK;B[@ZmW2i*1Қ^OkqiVdCRL0n6! ^Ro5qԪI(,rD9sW_M\SE1qȔ$w?;Srbۭ& SHkM]./q6!&vG'OFmmM(z&.ItbEj3<&Ӓ[lj`h*kt%<uo,w^}B^ŷ!%8S(Q$ɹL%LYlNH۠%ލn6sQA7FS\>e]:,;XQ[DAnG0DxwDj.j54*#]%at؅GSZ -VI-yMJ_Vbpf*-)ߦ;--8Jg6A1E 3[D?IL(>%:öT[8*+*/}?0nJHsZ,hb|Ɉ7:UЈ[&:nGmQ)mm=PEl$<%$\aGejCV(W#@_Ն߾dVsX7P$=RnHq03XLgY9ڈCI:wAƕ'V{#|HcV !N !w.k)C1XnTJ"RiJ(%*f%HiJ(x -ӬRthZ "4$eaեE,Q$ݸq" -XqTJԧ_lQa8^5!*V$LtZM-Iquy^9MZm0"/+\늩[;EY<]**DW)o Smwv -SQlf1S$; MTI3#f؟gm!Ku*4F'!%O )WqrUdRetFFT)-e -'L`Sa.(cR &Ȋc\ UrbQuYxf9S\xC`f@ׇs(]4;LU$\2)Hr-82ElH M2;hө3W{PН2m៍tȊ%lqGÎYV㝸\%|_ +a{~b,ˠRra*5"L2pk:ВCJH\zzH.[yKN/p2<\j"Cԉg\zu<X ҟj BJ@UI3Ffnv5'7PW2.#rt{2,C@wLM-M2T_HF-(ծ!Z%lB35wOK#3v) BPH\S/֒lڴyd*#hL vc2 -j4~\7 -KLRv2PtעEV3j\\FZEm'{iWGM?>cnU!:Shv2̖6IM=Sh$x"!by([V7|ޟYqev XQ:%TNڮsil:n`N#(*iTTaųjf25m۸3y"R'5>6cH)NNJ PUUpu\#q5&q5"bR&:EWR쏸?sJĸƇ#Pa73Fv;rpE; ' 6M@wƌޥؿFrDPӚw%M.eR3erZh/q:΁xsd)-~gѭ72/9A1eL9ǢkO:#y.ZELm,aY]xJǎ m-%Jdڵ尩khS0ƿm/®Ԟ<[c -i%AdcEez6/j]nm7ro? V'-S`A=EkKP"@O^$x;+sH'ӏDu׵a%0r2*ŴOHE"qdS2uܵɹy%'*T'P _R D9QlPS KEeJc 04I7 :owO'@j'6uɬJ`e?pe/!7:!˛RwM7miH];#ۣ7)lpcn)0nz!;3!Ȅا0.XiDE`^nʵp3)b`U>P@QIyߍ킝JK~Jⵣt_fט=JQ:<-&q\i dlZ%E>KɎ+I K#=u>R8}8$FF"NgNJrVs:-3pr<W萄AmJ72Aµaq8кcp4(GxZbbiZvLvI(,:* "W5NXߍجV+71XV+o!ERcr*<3D^ho0 [(ZٌIH(e^ FWPNAܬ3kkDKKnLFw|z#/^ %[ELsg\7 yYYSW矍?+[DZC$[b9'/fo=UtY5bp{.@L œ Xd٠VVΉqJ Dq,\nm˒" lfʗ%tٌ[&$3"K|gST7S%=:L+ظK&x,,أ7hc̥?=GDA|V=+DNy܈)Em@3YFAn\Nվ1o?3,pioFjB WWCm@ -v`ow=HyfKk[6gn)aJF_H% Od6 -:"e1Q|[:v;E544߭Vz]l5SkhX*1I6 ].vg6dN#@2mU!BNJbd9MUXű%#:!dDuDse;Pt.7T{Ȅ^} -j"Ufnw7vFhtY6U\vg&ZqpW( GUhueyGr6B ͢-ÌL1roOK]+ֶ|_'r'rUήqM]3W)P}-Zㅕ>L]ٜWIjt^2B nvwM{}l-feMm+VH);L !?RcpBҫj]1zͣM,#6szET\)_vԩ:]f9xh#P#:I]YS9]":hl~Rٷ^ -"GaS:'ӭTIus3Ro^字VM1q Sq-j3r)ҿ -Ƀ^孚'ǻ U9ȉzn4G%Jq=\nBP—Vt0i[kZ)|hW*ڱ|AEspY 慏$8=OHevfظ= fvRq S",v=W4(=:.pIc$Lkf$iq BKvq;3pkd}ܵF"I{nOD1 Rٙ]R,-&͙1~BCxy8/vIh-ziL(l\- -T511ɸ -7\4DzIM/ȧⱹ)RڈҖ;+ح() 0&+#X@NvaeF !.:q[#r:٣|H8V"o"r S9.㒒TwէJ6L\) .+g#?#bA,ndʝ%Uѷ_h$^ u8 +ݴj- Χ@nj6&D~E>[P燤kd$~7sVm():{,{9q\|E -2`F9!$ʟ:Gָ3jۀƎˢ:gKԈpֵ"䞐 -rEDT\UTpgZNuk[®Q_6b5+-@K'"01D)gRR:p;#R?ZOf}wU>D2>OsꚯVtNQj#nu[:ꕝ2ߓuRf7a[ȴri浲>#D5n;ƕl2HvfqSD6#mG}0ᾝSJ~PvqsnX©I8>S/-) LzpRIaqr>8>u`NE}G8#~+IY1Vt钡q9909U+^>AHaSBuugރ>#5)Ul=0+b?tVOe" 5_қ]{K'5.iq%ZF #)ҶۇV s%Γ.55KLn'=>ڻm{%'a>Ռ,8VBԆ6z07 W"c3>כRgx76a?)~#f- Is]?p#.*3rˌ.\` o[CSwu+:8uÇ9-(jٻSw& ZGܤ{u`Ggvo5Zmαő ȷ=&ҏEr37dL`n$0Ivq'̯$aGۃ8nɊ(N8K?ҬѝNhƔS5qJZXK?yBJs}}7b0ZGR9GUKܵ P0o8 1wB9)ntd0[%>٪˶7"Qt,q@զo:tD/]Vq>#|ٓ -NDr & V^޴ER%c~7cׅQs[#>wMCN=m9"շW_M}KF̈́N"]Apme9pcT9#ݓ.ynj [vd[Qw2cp Hhe8.5rbe[6|sk6މ#bkp2c0y%D߆mrxiXbYK[*qU rYQy/_Y[2yY=}n_Qnj̜%#\r(/ڙMr8 - iq>/ }2kUIPBV9}ŨX[VZ .?5&t͘[dژz?Mͭ\mxEgÇ!#@Dkb[[S9\YYIE'lHOXuW۾F '[Pxw.uQ fvN^.}K 5iArŲm[<lbh|؈g\oy/Zob;u*gikii+m5{ZfL muRmjk&K+e6**\u{pX<''7[hlI}}Koj@je=D"lGԬMxmgPbeWdt*"5Tv'* #)sCu蓙JinD Rە"B )pY23YkY=sFag@." -CtFEɹtw۸ݠD2YC0,l4(tٴd*DmL;y)zSV{RS΋,xXt_eC29{q[7QeƖ޶BMn) *"3JdN{3"JSF1ƘM&Sv磥pҚN]t{'o(a6[nلܰ..UvCܤ{w_,V,Qu+`:M,m 4:Ctgi -jL)zf|2- k=CzR -QVWlcKO6Ӈ^m(U#FW  Oi盎ѺX}[4P.<> [ܙ$$&B޵cV>Yq9V_b%ZXZ|<۫0`۝:rYK? ANͻί5~S_?rǛj긶ΧSJn4ԥٿ(b3[DmAaAoOgFD|4&rӡar `uUbc*K86%cs&ʹ; -31G Qnԅ nwyZm -}iY:{6D녁C"<(EppStӭ;ͳBE!Oܕ+ -(Gܤ|"(rYYRm$w=6_Ϧ}Ү^qei' wlh%oٯvW4Ej峩g4l~OjO&BkqAH"{-/qV!ňlL8fjR%[Ry6EZpŤ uh;Aoo I -FV٭A0xȒM gb2Sی%DMI.qz,q9l#yDϸq1"G.\nٸ3+$޴n2ALF8Ƽ%3ˉl0ȼD) H&)_AsDء.b*=0ʯr 6bcH$n=|u/$6^fTɔolҞFɦq%4ADr#RDQYq>>T^D6ٲGLvs#h\PkiڥJtffyyzIj#75{ :Dp:=N$Ҵ%Gu{ܽBQh⒚E2DpѦe4R-Aeл]\1^7=Uh":*as[8\7߻iG )>nE9m ~Q*cKwj&wsv{ZUQnZDDZ ثhB =QBAY6[g~8m, EJ4mOfQRؿ2D3[#)Dcsm6tYmmLsKΎt=gp[8ET KW)CQb!jt!pn;!n$BVC=%ln -1nrxA{& sFӯ:`Apڿ[!w%0v˕,N&Weҧ{{ \'9y;3N"5['ڍ)q_1r/Ҹat(dU2&_a(Beh^NdzOjH&[m6ZK .:"k6Ku m %%8Px\_t_zc~+ XVҵV+i:ZS+Zt2I3/ic1'/K!1AQaq "2@P`#BRr0bт3SsCcp ?BT y[LCJv |a3(Ĕ^@J슽PWPFN>j{ÊKbaL,\9ֈ(HB_Tˆ׵~Q5&PH(IrNJڝj +dd -uBB hZ4"waeLGsm\Vwyo+rfgp9)"S*a -+B{/JNgBn}QQ:7Ԉ+7' Rf#)(&iڶ'9@iDiRlܢw>΅ }ԣ[J7qԵݹ-ms_+m¼J:ogVUĮ /ڿj\-[jp:+)% 8y-V0\r -'rN!;Na~腽o+! ڿjhp\;[+Į%os^K\& _-?qX[uXYJ -׮v$'CnϙȺS2! h慭9jp~fI=8(Gaq[B}<ْldP0hM#. THSiq+猑>f~E]$uL+ -칭? -@z85D s1~j;bП+ĭG9JfN*Vx9;hN<uakDp_.(;Hp 0SA T -WgX|NX;B#lLЍr=Иnd+"'bT  e>X%~P@e:kCUܹˀ!_Af/X,aȫܗ ,BW+!Y<2 3P ӄ,@`y)<c*H xTM-rᰫ˽YTǂ:;B.⟯a[n~)SjNZ!bz,fsV DЉQa'BUE.lJU7o4jBsWgN\St#X[Ҧu/ҷ}Bq-[NJ2U Hw7! mG&Ay ܸE:2*8yɼ2#RXctM[;Jޡ_XJZpEa]dɵlWx(Ef Jkrsh^ҙP_: xa0U(b 4 -F_#^!Wu."rW{=ʦF{whv!e=|IIvU^@@#VˁPɭP$8&>ꩪ~FiBv@@=&3.%>kMPWUG",@Kud9%2Јy)b4&]jflB8.(S|:l)SY;KF#cA`晭m4Pj@ꡈmN F&%oCR:,CLyik4ȷ -KvG֟c.0Q8eTb5|,CkpN -7'{2o7r;B)}WYwbXNWN> aS*\$H| Je#)H Z<, z<2!V&FՈFk֑Zw,bP7cb))ַZMESoD5KyXnXW -6 7XUxq |4dLi):TB_]>6+PC'&dIM Xu+نK 4W 3ԮУ$Es49 -ce+'d&p"[2M:,?%bBw%I!]+20|WW܅ՌUİ:Mͧ|-vM3wygm -*'L@Y]_׵]U\ bB#4V˓Bc;B 8H;Ru X^?6j:s -"fS)9),ӴȐJ E֪ov|*h*%6^*R* *ڋZ -R_$*reCJBϷ3XW7 --h(6+eea 5T+ m6̔TB-!WPfALh.QS яs~Qd|B#}55걜voو+A\-Xnf -5Gڊڀ҆VHC&0ur5\A4nZiԕ!y -Re\*C ,p./('iEhA]fB -"?yDE0JlE\a1lB륻ʋ΄ -ؙb-x0-#lynt4X>\ pL`%2HE=c2M2,e@*>@'6QW4/irP~i+!u9ħ6TX]wuJo®mA(6;N]< -@M EӪu5ShgB3S$+7ǎ:ˑc ŁW{v7Djɟmqѳ4δuNc; PCAjm ?{ƾt5?{݂&q}ZvLBaV &'Cokޣ%@y.W/**[RULj%Q)=ߪF2%8:짘 ߛR`'h66!ewFa .*ua W6>h T,W"E&jVK|`o56c&| 0 쓻UY;ffu@ly@JDaԎu YAb}ȵ -WV5Ut%pXyhMwW -kUxRvqXScHQ`ڙW$V^)l5Va# - V3 Xg>WV!WjКLp( -* j"4&!Rv 2PEh'{ ֥4Tj\|h&OFW>g2TX|ڒDfmAb4d",w%qwV!0sXK g$Z$n,EuBme՗5S(|Z08Ă$7|{J1 -w$d>u+C0S{M|V)o(NrJ!jwߔ/;.GmIE($?ʅUPXD8 ɏ':2QiFƨE;aWbT '̡짙*J.O3)OS\^'ӆeJ~yݜv.@SJMZ5*Mi>IGx 4oZnΤƒ[6oGmu uŠŃw{ -,xXXz3 -BE#z D4MUEy -g$xQ ̓uTZR.6w&%S%1tOx(OUkZJ6ݔ6l 5NY -J, j&U r5#a uԝH,KJ,(ڞBVXgb*Fm%eaHlۆX}:X*pB @weGD4>x"U(tLҵNt &%0SN7=7hGR+(Ț8[iʻ^W!h-UꯄZ,]A_gFQKy+E,\ -v)׈#bp*c:zeǂRS4 N39+\Q,R 0]> XaOyOƎv nJ)@E(iVHQt*5{T@ tBu"Fq]dz[p67 jYt#TsפּJa{A\RJYQ -)W aj NV.Xc7ǐW}9'46QE*!;HJ 趦5u57,&3L<M,N!\ ܕI \>eaZbm杛l.;t ܐ (#걉F8P, -fpl -4;K@UL)SyaYG{+dT[nD&Go[ {**a1״lXP[)&s4e -fE]58*KUPTXgQl!b#(k._+% Y siH)Sď+M_b,vSBʆlj"V_D2ֵBI@SiŚ`MA\E"EȰ:,dB6D-1;R;( CH:aI%8&m3jܚ%t-ɪJq(60y0NKJAiLB(w$eDZj'Z+ ܔ' -BbK1}F~TT U/pN1@UaqHQado P2)#6Q~S 3M9ƥw^aEsXmX]D|iN "C +T&X~{Le5Q[vXy% RWV<;Әo4#V>,^(\?DAU0ZT |BWU (W*1Bwk #G Lzŕn HAb)Ĭ_ 1a -X5 -*ӳxJ-,L%6nY|½ -=rDDI6p^o5t`vցؐ -Psgw[gdG 35ҢIt8鼛nOt=b"͜Qހm+eqFl&Q҉go}U=(Ϣ Q>^ -3p,{s wf(Q Os\3BC+\;7""BsV]d)rX[]M@Q&WO0k\Zwi8ژஏ5 `tHX"[9ԣxv2$nY(F?Qإ;ȍ[OaD*ۄ+:u\FTBj-Fh,@DJ6jPÜIOxQbvI%FVE'\!ҮD+b..p?Sڅ -"eF0e<Ү^e#&v̳?6ގ+;TAy\% 7StD)&x ,Rm7,fls(OS SU-v˱VPJtX&v+,U hNgbٓ: !ۆ3NS浼,5 lQdQxBJ:GZ ͂Lq\QmM3k.?lnҽv.nǚ fnN+֥ -൙;; EG/;ѻb=nh(Pc Ii$"% fbc8ۦ$W]dk 7p u6\+#> !<:ԃZ8*ց(m*c -!Ҫwآx!T=m.*l"> }`NB4M S"i,v$i6?/&JnnE3D.)C@SC&M:Cx#Ub+sGz!a7c[ |. { oIcV() M+Vr -モnP@jAR!4B{bƲ&|4]4'jUn]<ҩP籈l=%( k -{εwyDGP#$ 鶛5r܅2%FH)!Rȧ9x~hQ;Pm7TdBb[pYn[Lg}W(ҽMiOyRqaO*NM{cǰls(GR*.ioVPbrs*O]7X`԰O3*7]i+ھ:Ÿ /;VB]q!26ޱO"Vb G<8Ae\ zU*2V7c޶1K;8!w~i:ءb\zzmT(fo Nx -vMU6 ;heҡc=\pON1nf>zD'TqH - v:LTvvBR6LhNҚfYL\P(QEd֛Iq]/?][^l1G˰J'4)ljXG4Z;1,AtQ9mVO4;!2H+tR~D?-j>y:5iBw.Ú`5HʥQBv/Lk'& ֈj~n'Wl_7<Og,Q>'lsfgZ{WgN*QyOoNoOck< '4Ob':[%BߣǼeЯ?])ZX;AVŗ9A*&wb;0>bu-?=Y{:-,D`gik6OxmULh{IKh3 -Lg*xl'b$^E~R;F) F]ghO7)аsYsArfrZ -s)'>(>7V+6T5ӹQcA8 -e'_vhkO-!ۦ{x"P MU%*j:m:*:+?0qmp*nS"{Q׷1 KӘE6.c˻ae͐5"cGaߘjNKQ:-divF4~9cM`5]E:Jma?K#"ܯCAk F6-vp@kFѭnihں3 R/qOm׀e0B_;$7'oz{lOܣ;#"Ɲ#xSזvjG]J:5&b`0HHdfֺcjq -,J-ƙGUww-'? -(9o3JjaDg[ϊw=4LuљށwN7КsѬjW;8 Y}J3T]l*I tl(!kCuBPTuU]`_2GXe=yoClhm&-@#Șt'I&@9=.бABaTty(F\Bmޝ -/RvcT AUA)wŝӥ FG0uom`,WT?.b0zPPȧֽl\nGD8[HUn >|u7Pk g]B}H.p~hWkrf$!TpDĞ8^wM:IlV+hl:mvLfҏf#,꿴 |X8jϟU %:3]!_:sNk+NDV7;nN?V↳ikA{Ndi{9.  #F$ѨiƅUoG`1alM)Z51͹wZ 3V/Dkܡ=TtJZ稢؉Vu&5=X2-!SsnưL*fЪT c\[ێv-x|ff8ZPۛMI߆kt;G`?Uwa7#[g"uʅ^%|8BrN -n妣 0:kUym6QRc$'tBԀiQ@氛~%3O/\8]m֏00%SObZ]aRc\F_cB& -&Cf֍vT\Ze" Aʳ -*|UFFƭ^g{L;s~ՓwYc!c:Y QZf5d1WGñZ[?hi3J=!D;&m7\r#5pZi6~IôT46i: -aӿ2q{a;DvKA"vuum'Rv/GSi BNWϹ:zR$aGj!ViX <55*LAb'hTڢtOc\[ocH:rMcx$xs)2vs3Ց؅0-}PXU/B~Fῳٝ=Uܰ_`~'L0CSz[Fcܰ_\\b-SއK!f' -1pOqW1i3Tq>&j?ȦSt_362CkD]U*hTZb< u? ݒV هr|{ @kJu&HQ.;͌[I׳G^ޕQreKXLUv3iuـI$RQskzn:Uޯri8]MBS",o)=os]N[ʮWXKB=u*3uz y(f?~*T1Z,kI> -c?i)lӽUh!a|jNIrT?OmȾ[y]֣\Bx!@NT&oOp6+xDY+h(|FҝmvS_b;ۼq ok#iоW~iIҙsԣ`AL,#G H툴?[ec6D`#$?wjӹ;O}oN.ctNNl9 4YiP0 𶓢?196Ѡt񣠦\,2Ъ,-~DJ#68ڎ8#@gkj\/ǂ-b]ny\핔Q?:B;-xoLXNBւ՚`ZiP$YgBk8ecDDA#lvFsk#BD7C k!S@h}rv!14m%5l?#@ԜF 61RͦN?,!W?Cc;|]mZHKr kL}t -;T'*P T)`OttY770*Z?[jT\|&t#?D ܚ`Jv|pMh-E3TY, emUStWU+ߌg@ISkFhw}0mqCe8*GDW@I)$8H61KOLfX&jO Ԛy.Mud`cX*??9'ϲFFLʧU'IU8|UӤ( cet齒g$XV3^׸*T׹B?E\SΔ&0BE4e>xtS0Ng RcnB*Iύj -pQR|]+Lf_4GU/ŀJ; R?Ku#vӨU M9;@Bk<ܤ64.J.?vԽ~@ \ƟvJ"\Jv*w)L`oiCxJscTX(3u8#64&6ȝ -~MsCXUj/מIn M#@ԶʍTCz`ȝFdCP9=0inF0bJ%qBG/ܘPYki*KnGvI8Ek І! on<]pOϊDJ^[H u@T/)SjW8 ܗ{{UkFprz_k\V!hUGNjMέ'-ݽUߪ{XZ&w\О3"S 2U)i'm@d]maз|xu833 pΔs~63Oop]d2aE@]am=;]ک<9sWGЬ1,X+? Ss¸$]9'P|䰟qf"cNNO p_v*n̈́Q0KtNM9UwStX$Oژ 0]Ө-vPQ2|PtO(Ak uLt,7Gw5TcSܺsIިM6 ,Grj(xu%h(M[TduJhp+F(?!\FNs4h)szlv:[zb<p:PM=hJe~' a92ZᰅZW{JHVRUy]ə^rgGT GΉ_ej{ {}xSIۨ2K6SYU*w\s|kaۊfWrPZcM.Kz-xTb 4\j>ASX g^'l++Qth? WF`dSU%2]#<6u(MOamلq78@#''9ğu6'{3?C֪2LxTK2_ȉA}jvqNӝM̺m-e -~Шwi֟M*Utp:p"BW=WWFs̚]o9Byy!Cg0.];2Wl1BMvUƦ:\tt{ cމ#SsKO #~tS1*|M)kG i ILx𱔞^fO#ozcKnO3!__}~kua}鲣Nhp૸بt@iU\@W:?EjtR~XzYԿ}uS(3{J-C*7DwYTsj8qpTKےEʄ׻N+T rXMAŸۚoHhyg;WR -Qp:IJ촃U -[h&]5RY淭n_<{wLBc ~_<-k!>KFCIvAc1Yr:ށ9 -JԮ^Ox#$e*l7 rKIo"̬_?Nm?UKنK S)au 9&{ Q)rέirFK?LMw^ Ncދ޲A]2Z|G 2#tj=3UmEU{w#=UtJWRsLjҪ)5 WGo[alp5 -v'!tWOìi~H8*!=m*9yO{FCPj뺣]S, AAJ{/K;ʯ7gN/]S:핖ύIԸL3-;* w#HMtieS;ҩ<$vR*w5w/o7/<=I~/؜$Jowv'<aw= ܕV C)97؍J}ύʗx8>] Ԥ󥻷)^8\`S _MIo]Ck!SycpUfvݤ>t/V,c U貗JZ˪ĬM` -J1ob4h]*5nM` ;rXwI{b_ZS+K5rX%ηzTrt,Gpuf;MގqG%և29p| j '&HsVpU*<4z.U~7oG:ܟTSɑ{w׫vQ0ʝG%if'?(S_kw GXS|!+Ɯ'I!Sm:yސt]Vaf=o9hH 2؟Ih\/*ŏ7 -w5ǀOFw\2Xp\n?&PO۠9rp]X ~Pbbַi]nP{m_I\Hˮ`#RI;a8֟c["2֝A>!P;|QSXHNa7u+-2h/-9 I.&2{qǀBn2!4z.ZC0;(lʈ\I͞",T_'*4yֆ4l nC}&BQWJr6Ek۾2wO?r}&i#Aܮ/i ΃⩋ OhXUٿ{&<+E@sa (z31kD^bo}9wf~0m'>e vt2Gcc0Y)XϲcyWJu(kN)+f;l+6\O}!&k8Y|fTxcx?V:v8H)CI^*f sCviZc1t͎];I~3gXw ȫa - ;ݛBB og .IZ)s:9)ˁ't2_EawM3P];\aGʣ]i7aG}ګVm!֓ -c51c 8Km)xYMʭ{uŎvS`:4hW}*θB{oFvJk9y,+W -5jS-M&ffzjbҚ],nuꊓ_?]qSq+tl[L¦X[Wuc)07 X4q?)FKj}6RdLiQHj sa2!Tl-qѱT9Q:C3aXNѽ t?P>~OQ@iLЫAGs$Z`j02vHRYDmn(ֽ{ )ܺ򷭻.V>6pF,r]+a/5 ϟXI)7. -Al(~⩸쬓uiiCٝ!WԘL6e]2 T7uz)]u͝o3KZ7Xz[T" hOft*==o y.K)]Q -OiinRnL+־,x&62Z{iz[O+5ke``s IleD*Kި!TallO]>N=er~nx> -[@3 nB\QˤLUz, &TCH%~m'fu!OOSQS]gY՚yb>}˭9u'Eh(gz=0**;&>3'%@ajv'h閖!LUʿjw X W}b,fsk]bܧu_E/R]ϼ.ؿBWcP䃩}u#.1=SiaAkmAJx^u72z}#p̫~}ޖ`X U< ,RhN,,zrwވx]cc,5,Z<a,TSXT,O޺oU]ϱ]X溱p9*U./fcqMy*UKGS6&iE|S4Qa)e`; *|jk.U_gT]e.W{K>]OWJJ5;aDϓWYgQKs+t cQa=uޫ=by~y;KzcX^5^UqCJYu3f3wVNwO֐t+ݐPџu,..Rڱ?]l*ϴk u/⮮?Ϲw]b4W]oP: K:o2ܺqu/X.]f>$Gܦ5k^?i]jy.GcE^ܺ_9+XW]P_ȮS]fܰ)KFwK]Tz|kB/,E, -gXn]G5ՇWIn; .euvs*󬊿h]nXz,+ ˩^uX`]fPEں˹^bh0b}Yi_.^W䮬z|ꮳXeb,|NKr:?U[/yBڿ)է̬O%J Eb.ﴮSTV/DJésقM_ufV?B,S%rAuE6a.Jxh,E/;]z^Kac/^g5gY꺵Our\oAϼ=}E?͝qT=!ܮ;u?⮿X9+uԻ+=%Չ.W&:]Uʸacz.XN?_+XGuJ_QORWKįzQWsP~5yVuj4>K5OwܱL7X މg^J[ܱaubUX-J_7V -.JV){y]nOš̨g0\]H>kE^j<~*j.GurzN_=X!Mg5땽U± /`zYzǢ 6οUb++>jP+y y,a^bz #*⻟hRjJgC.9._X95a3_,@_U8}W'ȦӨ'/wYr+ ϸ.%[ -NhrN>ac1X]NεQaaaRV^>X<]jSEX?u⺩?Ek?!L,W,_Dj7X1; -[G?ǭe^Pm1_O[꺽NJ>ł597/x -,ܗ]j]jj,&zf#+Կ͝eTV;Ow/@uU4,6ruzrWVs]hՀ]@}R滟rY**>ұr `W$o?[1Y 榟5Z꺵NK.ea;u⡿j?LSOMnK,EqWs]i ޫt,@5Mf"NKa3wqj%r% @T;o5V W;+t.yW-X.s _W,F]C~/f8XWg֫S.auf+% ++y,^5W4yV.g[_XTҰc" -߫,u\jYR?jkУ>k 4yV+uǯ]ϵK,EbfuT[PW[規5}Y,,&a`7X J>ŀOkkXXS~^5SPy.O_]Nε[`?QV!\5~zQW]*G氏'XnX溳y #W=Euu}B})PϵcS]C&u9!ZNyX갊ߵa5`kGqjދ5yʟ@WYXwK䦏ܺ9.lUVbKW0=GJ(hNyODiMmКa:w'<0>7q -%BwJyCAV.Eur1c?#I^u>r*j7XMXK+>g5}jX~'ܱܰJ- _u!l5KawFG[Zl<%Kٻ1T)t6V~,ZoڛT:^K#*m&n 5`3XKM]TrXV9U,K>C+1@Fcu+:_W)f@mњov܆*^i Ӽ+TXV+U7!.%b;$ގ+@u_rG _[:Uj`WɇYjIeMhXIpnQSxpԺHhD'h|ϖj͌:u||i+DH(i!|}UU(33t*osim=;G=Ug^ԩVu*mfXq'XW}+U=WԣZݞ%rz,؎;OKiZo" ɏ0]i* Շ=%`?g+ŭ&tRy|Qs\$l&  -LhD8P4S,JTʘX҆b -.LsuT(qSpȡ|8L_gIc]؃Iך -} %IWJu U*,']cG*^pPk'P)+5c9uSꮕ Ä^N?u4љ * zecJ};XMȅF|0?.IÜ ݄҃՟8A v7/ѻ~cMjU/r{]:ۭ`,x.Ro$ԫ=1WEaOahlk>rtVL"e>`גW>kUt9Ulo:\UC `֟SW} -aJ?ݒݖ u6|ڎsh!8A~ݻB:N3t'^UumOvZa6?7s2_UYgy)zUqNx3\ -DB&O>NHsΓ\H|yğ`#ͫGB2_o\ThqGrB$-q2Y~ +df&;, -V"GJQJv[ -"[wз=kc3[)+d/;B_!F[}__em MmMǏ6C܇t/g jsɕ}Wñ}+p7Y6j޶B { _#ll:Vg}~'7R}Ƒ*AhhU 6FBTL$tNVo8]n;fpSA-{U\lэb\iLmkுPI(}NKv,rZ;Cj#ӢQԎ߭ah~XQvϿt TS`2QˏU0d&Sk|%i1w~Zmf*sOÚ4頒w A̼Ht`MoiQ#c\_uٹة]{\&dP0`'[n$tar' ->(my!P6uBxKg0]m뭷;mXzʗ`o`@sr!Q/{ldF=1u(TKpWe?TtQU)3QI5&ݪ+.XeKWLi>Jq;Y;8M*˱^Z.OopBwy.TY.~ڏJgkxgz+@I` [nM^D'"&";.\]6sbCi>*v'+zahhu'S+_uyvYW &.o޿] X'zꂢm-Ycn?ͻ5'l!vp˵ðTJt-U -'B"A*%PwB]z.|ti%LEo/w:SLP$.>2Oh:Uԝ. n+ ԇ0WH~ s.»)نZ!0bU=#-[\;7E$SܩziL_;@#g6|q`3Oa=cқgHxzK~tϚш>Wlًer<0]Yt9*{BVS誘WIxot*3C80TZ`{^N 'gD -B~֚NPu -ޠrW)A氞:sԇH $l?5X -/ - # -uSіհ@UM/ GCXDy&@0yUtB~ 5V57}Mf*!-%zcBP<3 y._]u*mU XöTj;N*'_#z0\ >8(!tG<5J請ޚ$G˚4I3(^#ɽ -븇+o+/x[ڜsT4M}ףgrS[tʫ8N1) #;!3z$NPS>^D䪓w#Dв氛 Β~@? :I̽^j+*eB9wCS=BTL[pܣD'wR 2vj]߹a7kDMNh#HbH86#=Ne8ۤ*;\F rީ7=[)Wx*UP&nE7&PG6JM4g9ʣ@k4қZL|tQ!pҵNl:PGA[L*&UFK 4΍$oN =7X(w&xTJa5k;~XSv*tao%U {r>DŽsw58Mޜ1.0G4GU9py8m -Qv4˓FegN[&]P8]]Tz.WiS]W5yw$j(W}|UN(gc5+AW LǂHqy*$g&Û3J`F`Np8jem'1O9M -xp}WwCIF~K&g%V lVl3 +m]] Oo ύ*O "dvDqLˈM}FT]-U;ۊ֖j+ܩpUow 0x&v_Uw%?UV,rXLX45u%mj{UOeey1S\b<w{B+'6nۺxy؞bmyւ"bM>VSѽbGG$>JV] ԁqjk .r"nTW~jb8A:S߻Pir<#YJDd ϖῩ1'45N{&lj,gZ:9U[qp&h,L, &r&O;۲veRuWc3wi6IoLt r:C^xDX8 5SL^nB+%/v4@6Su=8Ү8;tX8 \f䰛~$ - cxX*5!v%tN>0T{S1S}BhAfa7NlNb9u ˌju@(Vԋ!#л? y ŹSi(ΐ¡QZ||<w?b).)|Sc3{c jT8!mGG2ޫvU1^L(^S =7&- -N[+ɷD{y|c-[?vYv_)1e*S#i;S ؍F85NS4fTe7nt<[| 9Vi*FM>LО>ʕp?}8M7vftM/ʡD 5w1\!I|>)@g|] lǮ'k%VMR'qHT\5Bph$tsD6zvR0x' ٚ;IڝTqq? -5;aݱS~!3:,qcb{n)҈T8O!6v(&=wbwLC -ykc-(eTm4lWw4!rcgRI;4 Q9FnI@}t"rЩGȧ@A+>}O5Os˚FIe\+ 4:ECKxʤi<>YO Pi-; -}zs  -'jqGEkrUZZ3}FК;۔KwtG> E^t݅HSnT'rsclOA}ڣֽ?*sTUచ<<ջ?ZaBGu$kGf4 {4dh;=:U'lz&ѤYCj,G,3hE>fqyUީ\m&=~nsge\lߛv@n[n"%9lJ,W pCQҷqwWmvJMJCnMp?P*f4¤'O-[(T#z@F>Vp8]Na 겦n;Ybx,?mH۬Krw$[>ARn[V313SSbdG!0CEUcYtx48LWϲ97 LҨBsK|'S+27 ~ncb~n -C}ޓ2'98%]gjOT,*Ub0XQL䎉)7<$3<4f%YhMThti>I # 2VC=p -_#Ulmg4pO)́pQ2ZQCO7T3u5G p^ +ηN@uF]hYt44@;d(]ij!(Rw%V^7i*Ǽ7a\iBv'2ZJv3 y -D<_wHWisP9Tr'|F*:NmC.ubq$ڍ( -jw%K[5ABKxm5@O$h2M*ZZU) H:1ҩMR(Q(NSD"äMh -#4֣D7_3U^VWGSxx6&\(i <i >(8:GMas~^ ܓ`9]XMH K~ОaJv#dJ&'W`i͇Jڢ&6EdNDߡjOF4l+z:rU_ -J%<ݧEp@DNGVS %P!g2}wFqvoT$QUPn퐚 xNqX> W0w55yXG)fV+̔ -ﱨ#f '׵S2(40X[zS<U)[675Gɭ ¿U7\au*i V+a9 --wOѡ8L,`z05],veGɦiaP V8!{L)[7 Qi7^ⰰsvOB@Qo4[*g8 Xbw&  -'!6ܱ}>3ysGeI{]XewBti`G7Ml"ߪuk!j$m'*Mnaڄ샷 #G8Ll{ -@F!c8B=ǚoW1aʺ~vRlE"*Too$ϨM]bg%?j=.<_}{\ٟw$S=o[=Ą% -{6u)G+GB )Շ*XXmX<˴V7\X-䦗ں-k*;f#X {C@aMqTaV%)\k_~i]q9f(L ~ՂK6S,hMHaN)Q:_aܺIE>>XQxs.B½\ݩπ\U*S󍊐ENSڮTIRvff}> ^;L;2Jl'ܪ{B5v7'ѽ\LuöS1HUxJV(؋{+嚹T{x'q8u&>!3#,WrLmu/F[x c44o)( k3̪,"v> o?5J\aL"&-#JsTZ,(N, l+'YXݡQN:IU:C^ ԜM|ҡ;M,$n_ ~҃sjYJe4ErpaH(L| 0gE07àY&ֳRptV1; LUyY߸&QNSѼU8HCje&Si=2#oaa*5WpQ⦘-"V7T~hD*ѩ03GB.+Si<{*n@.N.HRuBSR$8Lil2݄*- WuۧQAC4Uu "5'(iӾ8'OޟPN+9J8hU5?`M}9T(TK$cr,hN$.!9sTYBU_js]K.QA^v"Ï$)8%"|݈$dR{]x45#gwOoPd2S*U O -YtE] A -JgEy$&yؘ|s?鲐TcaY!~Vjmb -, 16uTʤٵ^쌋1ޡ7cX7.(muzlc!1<%Z'RQTshS[L$2{\npB4lWeKy#Uh4A77;$a -+6*; XA:; ~!i'i7 '*/Tj_QʦA#PB -%B%ƺ~Y+FU֔h6fGH2;AEb|~/ڰ_6%㺟 L]Ӧ7 ;BNKcE ȩT4p+ma>IgRyctkyk -R%Tim+맊:,&7S x5AAU:3T.^`EδOW{z<7^ N{8W.h8oG[jeLd7.lq2;Ӌiރ}rn]ҷXރxN芄lr/q]P]vn,[==6abj7.XOHQ}M&뼫{[|sS)\hvMB,wp[oYz\谜hϒe>T.}>"5t\V})Zi xYVR_jHZ9HY ^i4Z~00ª[x_vMk+*USvY nҧ77[&W껒9͇Bb|Y() -睧0_`3B+Pe0<\AH9mCXNNyrBKhW"dr-oTTQuO uЧ3ʎVڊaφѐ`yrC<+gc P%Կ}arh)iD"L+G~#ݴ7ಆ@ j<Bc|S.cJ-*_k$pTYUv8h*r {=swB-px.n;hf -#5~l}Z493 > xH↘ϰ7#YF%v2Mb#cz{ ,rM?ڪ^'^iDͭ%p*|2r ;1Unf&aVqMi*nj_: v||czt?EJ>& ][ӔT@<uKvڊ.E -rѫ5/RK.O׺<,k U^>)69 -1UYz볋i4'J9]tʅJ[m- #jt=tOc辶krG [zu -+5c{d0gB% -NKP:[_)WQP}J4IMatpU$t*Mc:gHs:lP7sJגcA%^2a~Uca7;q65ŧ7toOucn.j/Aw1y:@T^&]!TQyt|t퀛iPumPk )A9ȷ5c.S? UA`?+zkyY5#U܊Xl<sZCR Tm5Ik#sFտx8ul -:IQ$D(2 ,]ykIaޥw:ѭ({;T$8'-~p\V0Զ7*!1AQ aq0@P?x 7o*_)3U3tqgO&RȤ`B:B[T1PB϶TW@i`iP(@ m-݇02 -}J׹S{D80ܟ -<&p %1\XBSNvm&\ iT }K\[=*k0;EЂ6XKX{5 `Zg2EF7[DU,m01.pi1J4{6`kd O.-/JMyjM2lQVoq ]"D^׶ -7ަ*Q.5iU*/C3RVYQpqPv|-^MV .J[b YGKslFjkCH]WSL2e]\d ۰ \mg ڳ<)*@cեĩY @ge(Qk;{19?ٙ}'tM: (j*}6pJPѲ!j\'{!3l),7xX{* SLʗ-*…&T0lENU`EEn U2ҴT#(! $o*|.ט~Tm(-)~ a+jUwI@2j 9@V:[*606!Br۪C++2It2C٫tlX"Wk(̊)0hJf^Ei+wc4 a0:ܶ,W̉5un|\T7T+m71<ݕTS?ZzS7z%8± -\Q,[RCH_ sld-}_oܿ-.TlLv)b6#8i9tA13gAJ!FO, -oq.379-Arw -e%u ݈X#7ݡK2_dSܭ=RNjەIM#fp=LCl=VL ٚ܈EW6=.6fW6⸬ap:8wvnF{=fR-0mVlGbQ:0ֵ4N\M̼iĈbEҴbEiQ#wZs9N%ᗫ %9i>c#+Amq)KľYz0; s!3ZR˗.]"CBg2CV `n J5:£ iU@aP\oE3&s=iQA&n͐.%\:f!טЉ83F Ў;:TT 6 : M OZ kNgpF3&n'xsuw@FVtUav KB3&mF3Ά78%[ Ptvca:W2ێV1Hs kaORZ4 -Έ:!8@TW/D_TIP"m9FV!ja%&ӂ J@̦&bKyHֳ O \MF֍cfs>5I#w օ׍39*W Nv˗-aΘԸ8q>3hg2PhbJmWgWh%1Л_Q6Kif2Θ*c3,c^ x:oᶌvИfIVB7xsg9MƉSx`"' F9f5%f0!92APZoi h7N~ Άum.%fl0e3 -quaz\ 95w@X:6i;^tܸ{'8E`bP˙Gsm/R^2JTV:$$6i[Si)wS!)}sy`E 5;lH,:R$JLQ18iziytzyQ 97t1ZܿԤbKKrR<^(0ၸߘ- 4W %(x+hѢW*\@)8HgtK%{%}щ'ѳbv ]YCG+}] n,(nB"0~, QCCqA[`VfΧsf M==ŇVNK\wjVW[X3 [z"]~I+n]M+n+:31FlljuN7dM5jfMJީ*m|4moRY'|#_Sx% q4 - dٝk:Y(HA$QP6 FTE&Ѵ*ЌU_Ù\J3rybӝ94l׽7Zq Tw#֝l@Jcʍsµtv$Gb|P̀ð0y,mhIHhP|^rYZRn! -\ox&S7\ uC@-6 W&cOS*(J@ 2"r"ȀQf+8 KXg91Sӓ^^Τ kĨAn.wsa,M/hkU"@ nٹ.)J7[IB(bdPwK#c4GeD 6"9X4MzUh|*\&oJ1+oO-zoQ=v4R'$mQ9~707 `ZM-.!t$N` m9)E` ;JK0@w&%R[Խ@ b.f1P4ff,n$GҼ&CNeiZULWrx\UfV|m@|7chQ J F*' t_7K5 2#7 ]0 3%ZeL[4?$18PK%!5=+S{P2ZCnuJМz HirM!\7s.b%i x>iގ<8̲sg WW\JڥeGstUfz=+uCRtI(Ab; xX@&q"gUQ2`Rf_fmE. x%dŐ>{Vݢhk (dgLG(+lLbk.K1X;PD$< '>/JiTFיh>L4ZT>nB%C (M0s0;X% \`ejw.Cc˅te uxfj -;* =>"헎NH5DAvCaoh=yW^F\as ҡ\ y0Ն:ڼ1s'#{ec0)T{%B̽_0EWݩY2UpGᬀ naa"l 5b dԮ^ũq@bDErmnj\c\1127嚝Nefd#/L³8}|MXhˆt5&X|~Q/XmN_ŕƹdju2> -}$%46B,8˶ BtPx,Kzcs{P's/G\4vaqs&"5 -7UҚiy4%í;̼隝h4NakQt6'2zC\(rx&%|ncpjV4$= -_o*l a[ay>RſJz&p/܉OR-n8t޼y㶥ks2|J9ӟF,ӉѫǏ:{GvzCs+}_aj_5ej 7ZTwbu}}i:` -ΊBΘ1d4礉~ZJB7~4!Ӌ qF0i4$h:4Y/Z757$tGC-rBґ)_fj4Jl@b}9Ym <7(*6.3o*yE~-xhu4c vS -P'99 64&\MF:VD;HjD8X.TvZ%TtYsj\̹z ptO -Kc)^|8юq8M46&o;hT;Sʆ`Z:^ ұ8a+ґ]s+{d3.6-VwQLwq+8{T2LZ}7 }Z)x CFdǠh .. Q1HbeGf-b06DzoD+"5& 匯6#~&mK0pĪ9oنA)!-R𙟿~H4`),tg 7G7_9C;ʑ+vdPeE_d,@"@a'h&7JsјSq7т̟W3gb>c-m<$5E>Xu-9gn2iw\3:)T.ȆĞt\]OcÝqSo65/JnzsIsvd`>l- -vIZ>=}״5;3⬛9i]0AJCҗ.MN®odގIԤzpBlP|:_1^~bK[:[EePg,r2}%D)X}^ȧËk¡!? cgz۩"gBfq:+^!.&]jG\c0#DZc>?i=Cҥu D49Q!a/XR2(}rb58x3 +f7Q e} U[l!,[U6Lb@}US $ (/ں~=msZBAd^ŀ#9_sSLWRоl3b1'A&b+-C{;— 6éhg84K /zt q&2T"*ٰ1 siB1@hhkl.j *:Y98lz; l{KUͲޓ yH):bkaXakXÕ5Jv e>)On&d{ٝ9J7FBT;[>&8:gJ`8`^f)0 eVVYo1zY/KbSͦ05fHyP@Yo-F^n3S0k-C0ff&uAi -%Ku+n0ڤh3=ٟj'-&Ng/SVJԹTsZ3-# Å݆ ?uAo0^ٹeeqPNcuLj /- mClnՃ[Jb-@sو0 :Xу),|O"\^F)marSz"|`cpu[t!IEFCcÿ3^o}` %fd}δT7q+aqaJ t[Uj*:\8HYzSۻ%(XAq ` 7Әo7%QBk%OFr?KK6NpLmXGEn5Ŭ=a}*m/PS}͡g_#,/ZΛw<*R~`( ( Ƅj0m?lY -@eiPZo) -8օϹA@B*`r-< ppD,@Yr!}Նif(n,!:ٶ肣ћncX[2$xHDf![ q(`>R PYM;PJ1[J\ޙ:u *XNgGVWN4wQ͎ jUlˋsSJ8,!.T:kNݜ3=;vfiY%%eaV}(Y* )jԈ{XݕmHK2mLR"|"pX z ߸x0Ɨ+BaּigQm\4w|yqr7c^ ,)eˌ*Y^5fbt\ #:"څFT Cք ~)R!^YD:ʹ=ɛ,St3c҈_eUzsQkSmjh^&)M9X ;՗7Q%t-0/P̗Ň,1#tvj5윰GbDdfY(Jipm F`֥JjiteMN~.a5Μypn\&nLOz?Db+^T(]p,`Y91 a];a`e7XqW>Q4#•q9:IR&B4N(#(Uc#S@+1C֣kJ\yDžw'>WGÍMMBUם/]9 .B?)5F.lLG$M"=KAuz/s1mN tv$L&2,REx-eo)Iq92r$HU+u]pЏ ^43/_f4HaK>`ܛXz.RX -a͟h߷Bg1p*#w+,~p)}T;fS6Wj4BP#% 13йtjcÝZӮ4aMVa[3]t3yḡg=>*%h e2ߤb|LvA7 0t( T$9m -m#h>F -L{,?Csʹ>ὐ}?Qx -UJ@& #62I * #B9I!: -7\KCg[1}PҐWBԗxK7˭qips.Ԅ>s0Et< F:aQ;h)2  -xs@lFlLm7p^(A.^"hF\<:TIeBZtD\IwƤLxհ7b. U1(- na.g\mNZr \D(s-su-ĴOʌ !مd4Z$DVYykT*g b4,4ЎGsK0Z)0̽Շ4R#71 I6B.x ,X[TRlDZmaZYLfܭJ&#Pa/BޥTޞjAiUن l7(-*+!  Tˈ^cKҝ\346uDkLj+xdS2(<4mPd؛ U5eB]K6xB3M7(( -`VECX004Bm"]uo]%K"98E闦;M(a 9Ľ 7TŨ+N! - xRJ!3d, K2ٳAQĹ%X d -z0]4b/0"BƗU%iڝ.my#xԤJ -.&cmtJ,HEdXĩf"pR$GvlPJX{.\X^啩YCW:\pЌ=.u{ 4kuƊRw $ -}!X'{\N(X-GOYؖe+Ml.D!ۏ- w iQ RBBBP9^ck`(JuAWY7@/LW~*=*Vl!MKve4Sr QqmC;B!x 3˄"؋\ZPteut#Ƅa֔"A֡3HqG[ PpFKD@ !f1*#^1ss a -Q%§:fowx-nH.. ;%K0g JΘ~Nb:~b - -v$gh*84na,G/+r]UhX @wJx"D&]䬂3;#qQ)-c&6w7B]usgtAԚbIOę]̊B?ӈ–|{|#p_m$K /af?1N7̈Z%EFɭ߲Ah7I%I2hy(  JLo9g튢HE[zzsfշd\mi`["@]~JeuU*Y(6 3C3 Gg\/*1%Q8…%j^-2+4[@  -Q#ߐ*TX&k)fdW>n#\j[*\/`_ߑ<#L -k2D|iSӤԟjG( s/#с7 -ATW!x [zJuY~e\3}X$TpcV'DIMy-ڟGj+;\ EXRR)++z^/SKK -Prd -B@WD]PE-%CEVøsi{b.h{k8c.qG]ݠI~Vl\1>r@0W3xd&7ޣZc`J}$84Z0bΪ"/i(}R[DՔ47$6B@Lv7X41-;Yxi) EP` aI :(1U+bk,@Cvn!H( 3z|/ң}<$բăڊ%ø@^bP$w&aY0 W {x֎5RbXS-\H5ܵkzLm*C=.R* -ZQL+`\UZ^8K8Hpz@w`LԜa˩Fqho/C vӯ z54>etS`JY[$֑=$&eDEjwbCFUBU~gmẅf 6[g`ZU/&CL#>?BeW}~dX^OIRf<8xsrcP -F.(,]k RRO!:=--ÆZɏɘ I=n,4,foS ->B=if^,bg*=D|1Vx<DžJg{,:,fSA(KLtLD:[EE,"E`J7,!(8!>GctÝXx\}T6ۂ2nН'!1hUW=!ю6t`X -gERC.*XeM -VeK&Y,xk>lC~X?S"Jʲ~JvERyv@W0S*y8&2e$@ ߖB7z4/tb^ca1U'bYi4t3|'rqehX?d&T쵐6M( ontwYĸ0X6F%Qa){%`A%%Ǎ/ED -q)fH<-jap1a #'{qJ}WG$EUw1x ;kcu tJGOZ{ )B)K2^A`NDKS d2˗r7MEW 6řTLv ' /!Y=ʹƥД`\񄥥H - sr{[_]D+/%FicdS e=d;N]\cU5FLqfTdNWL=ABJ@zWId%~TXd}_"ɣve|5P7BQ2>tMH"7Rӑ$K&Vs䀵'We7gGQ̯afq({O8U1HЉp#!"WwfU~0C.wya)W"B63Es! oށ+a-z-^J>0Uk#p l"+i!ۖ}@$ FN-R4?Lv@%tZRdT$,g Wri;6B7H.D*Q P'4{1YVԲh&ȵo/ƜF`Cs6?dՓexnkhtJr{aXx4!m&=kmցn!j^d6鹚4oȒHD[,-܂> ckNsYq\U?2xjR?~I14VF;3X?n$;^&R ]d:7˚3l%v3PUܠe4z࣊wv {dU/2*עP& р_ 26A Q%DOSF*[OcR_pCBܕ>_3DGWa -@Q_h(@ 8V4!`z%h]LiWj)?8'qaM˞Wd(j^ɋBz_ۺ#k,舽x]BXih9t:ª"N#P%A"8vd+gAF1;yq?)xa@TE誔7all )B9q*^!-Dwb^73І^wia -ę 8 555>T:ht\a!2HtR9hvˆ^R C*P!cBX)Yp(Zz-+R܏~ V| BICNP%vA `)t/QAV(R#.W8}"Ky/7qJ6^uHshT&ߔX+ э hk Fh΍Z Q{\ pLLMj؊b}zɽᲁkTA6AlLo= DB0X#M,MَbF8g%/xf0 )! AXig!.c -TPܛB"fzZ=\irb{R^rnDyͽ 5Sf``4%ʓA_:q}4SR,^&X@>|Cc*oZ m5(;^E&oMB}L f8~IWpDjC1vBG PB<D}-n{ٙp"(bbܸ7QTf,|2$@4cG!4*ہ ,paE\dw)߁vSHaNcS;\ӸG}Pr>v5{jX -׸G|fd܋ 5d22 srdqӐ)6z;]ps4:ES5.f =J?&`ٔ -Iau T0Sf ,85˨u= -(SG6c:d}e p, b,&E -JQ ޮS1c˄@3{a &}k6/!*ne;3r鵙";|6W0k̽V+̚ (?\SMN935-oCnֵGF.Ztt*Ē6-1 Ɲc  *zCo`V_`hDWmܔKU{툱`%T8t vv^+hA˕Z_D'f%ة{VO H \V3% ~PSPlr~ /w:hea Y*(]-e@ -B51E/h0_r!˜2TV!lAciiAVИ(s𹙥,qn!I~~Mn -z^sH ͦ>S'jYx)SE-.cke1g՘Plncb6tPD] #dbLTŻc?K,و̪o(jtr2pp+aR+h?+4 LlV5B _lʲP?Y/ݮR(fxTɬx  oESCh U0`C>{+!cdd؍rإSÈ>65xbaawlOꊁ9uT= 5{Ps?Մ*ĶfXĻ/пVXP5$UHr*S1~>ڂ{:1QpqHŭ%)S,- $!;TkVܗ>vUK9Ku%aŶDGKЛU -%*k"F,[*dF>aϑ) QD~AfϠ7VlC0iыPt>g77F=nb/}2V -Sc -k" u{IJATI9VYc/=" -M20ȥb_$B2bXq&"77]Wca_2[ۭ -Urƣ'q(Bϲ rM{X } /~a_h}⾰VVP\%U#\07LBi$e7 emU>QTlKUqZ`l+f#LYw|!ܪ\/F3l:O3}}U%nPBjVō`PW -FbǼ=Gf]MEE$YdbU tHm3kQ.]ЇT8`4J;טGVn[]"[:|Iɭ1|jܤ@TjU.q92 Z41hHh*wbA,@A1VZ -9GUA*=[-Ub.)W)Vmb5"z0"q>eάd@e|ܬejKOizqhx029g(<] X}hef -?lMؒv/E˗.8C)qcK "\rń& r.,!7u {ȐLtROQ:'Q!T =X0U+Lh<8g{UыJ%`19n@!j9(I~7;H$f2YFӊ<./(zw%*ħcNݛ3q=!&N*b{#$Y.rl| Qn s%rB]K/aYbq .4F-xDeS8ЌWʉZRr&KJ5`" *f/b%l@H6*eRTl\{%FYS7n XZ(Pi\& 4XeM Q/f4f)HUXŗ\zcK#x::w0J啴12KGL.IGQ]OGPSJ@ucARRQ֤AY @mde}DlF P@3 ;r$p..c.fTE *$#.)a=TDQnց`6CS^uFno^< d+!+i\v'QmH^ymC!D1P!r] Ye E>\zZ,9M*1# L0 Ez&Q"1Ya*;C`S-G(&8=?m*$KPn!e$bguL0ml7q ]Ɩf`]vBkubYh \ ф"F=UP[>;GbJ Ύ -D"a"@T4 ]2^zok*=r\ͬ}ېf@%Eevz!Q1J/D_Јw)s%hȰKVcR"5 -.n|me4jx -`AKñ _9۔Aa"Rr%,m =3LR1Sc&fS -_bPą02!r4!!c RJ Ή*W:\X%CR GA}mh7RR!6Ř8TT>xqx`e[كFйW!O,uv/S -bթ,B }6%EaWP?sB0̭qEl[Dp/ @c?q-_Y=yJiOjsgv0Gkܗ*>ugg'4F,ü Ph]B(MSE sX qD u 7{UH1*UJQ<|׭Yĭx 1 wX^ - Nc*7 -I|ƃN*UJƂU_C (̌٪ -N$V##X!}0 PEv> jP1.YN,΢go-tF%#nX`Fҭ:JY!6:-[kmMF(EZ69lo2w TC l&vH7Ϭ|<)p+ _J7uTRJ*VL;\oun\է$]hxbPE7g";'2jVdr@ RiV6l [R%)e]39U"LM`4˕Hm _t{ؖ AwYf;#"~5ѿ/y\oK`^`63prBNlm <`!0W}Zm_*TiR25MRW0%BGTPTNЬd(PU z1LfC|H|a3v>zökdTإJE-j?#(wa  u㥋+&/`7RZexQ*+ZMAؘ%% j_ETT4ܪscgV{LiRxTI\#*Tt^+´0a>"x~J /^ /-M.{'gmhrGm ڱHN̦h萃?U+J,eŠSt:]8y:rf$:LP (M;ܤ FI&Pp`m!r9)p=B-K*f|<ħ3'$k -8?iBs\wbSilF,B oQT_[GʴIFbXJ }]s Rl -D*鎠/=1`$5FvZB<.YN9pCq`2(kZ aʨr_rᢥJva]\Tj$cÛ٬0-|xjԠY;MN!ȲST G&@mml.8P Gǘ:b cs}Ɨ *0 L)B_֔% ݘ0Ph0EL"$7wJ%BGh|r}/ImWMOit{j!DMA\$K&V\'1Y\wFU1)G e r݆ѕ-Z-u;okE~(2ES4ǫx%+n^0լlE,E`M#ΗD>MACFzC`V}?e$ܷ}qq^T~+e#Y*]JR6 YO^r-l%{^P Pu rf9t._ϢxTpT{vCxAI/-R3'}G#Dh *|] KyZm^쀕?! ^u;GxP ]P*| e)jfPVaH!A.L (l;rܻ!UklwhPD\sd5`6T>ȍ# ePX7kWp%\E4_+rYq!4qxWqT -BWBN |śݝ\#ل$ʤ }:-@& ~z{|md 6qB;Ti.,27BI"JejX_9yaG#(# xo3ߘ\)+rSrJFCWA9qfZ.\4Y^/YHGtODb1q)4k6j sMt̛1o -a P 聀]Da GP4bDvs9Qwk{jfޑp-+Xa7g }iά!N՟i+76e:dzeHŐ롣0 /.E$E/'zVhDVɠf -B`Zb0'墰s[ё˗.\.\u&Ƙz5E [<*RWDS~aҥO8ȣ03cdmUCC/5)IgRux%N+Cjl2] 8!qAWfC\ 4qΖA)o H:\N.])HIWD``тڇ"LzGV?iy>i˯LAnZ6J4SV^åu^j}+6Dbꆰ2H֝jLՒ͖_+!\ -2`,x;  -@#Y=&+ĕ>%/QJpB 7p ; /QuΗg0_h* dvq9E9xHtXkIp VUW,٬%@h[o?pg f2WCO,vc1 ?b~<ۧ?pSُċ>d dMEU坚Uh!{G̻jej^f%eB5DžxSGem5bp#У*^N# >,N -Rzp,|C(dU`MaB>f7%ۆ˲ j%Sѵ w+YCvd0ш6Al CP,b6PD+_qL?)*/b1ܯI/d5hiuh2yқ 2+nNjFe*bnf? 97ө[##q!:I(T^'8 x ~7/jizxXBg.\ț!ك;4;tΎB5 U]\eX)B b`/Cr3{1xVb751NB -47սT7OJt_@82XN4͞ cʳ6d)k$lX!Ẹ /:,%~DzTx3 woL<5c#/. sKz$1ŨbPK ,X ؓ>,I&YԨ X:r(:/U˗)&Z UDA*h^%.:Y_#CGF\h\]oS_СؑB(LFH6ktBpn~Q?I6e-1%¼4[ǥ-}1'yU=4eҗꄴ.nhzkU=:,J'@0|3#Fj! -[DLNz'xSe' R QHʓTqb)3nJ`!\:-,c2%%46PoWr,]V]|:2u bV0\?Ƃ%yf"[ 76ShX"!+ŇBoֵ7i`.wJ3ԶF{6ToMlfR{VJƮ,WC*oLj2arŪX)i ڝ=^73sf/ º}g4D3DJ'RGiNMDGAiE, y (JtQvX{.V0e IK#/2F0 iZ, F3}+ ,Fm-E-jm7.?]+b)wNYѧ4vSt,.uHˁUEp9eAsAΕt>TCXm7LA,&k.[5qTwv/)y5c2I'1rs8b6!IE^ Ls!-&IC!7` Hrf@.i)RZDhIl9coOtJ#\NdhA`Ϊ\:?mc%`¾wl((],{SFǐZq/:b0#T؛1׆!P/ }Z|QJw~#Ffu-u {~NVԣ.//y_Mqzcdm"ㅋm&/h A[!w] K:l5Ǧ:.70A`H k;N;# P𡰪%f 0Ov"6a򘷿?TXN&ڼF5B0rD5<#>˗\~,^448,NujQD*U͏B`],04V7u\AW)}?#ů-2EV˵f+~\-V2ɢ7FTwn ]xfwm(m/\N 娾%0IP5lC8F`P TC;1qyc`%2Epe\YqadR\]XNtQuܦVX`Q UkH-K"|7551DcC,4,<G%b*Dh~-'xWtXSZnFU;յ gQW7j ,!ĆGaN.-5V ؙ $i'K(J@.d# -b1D6F Yqt,xV!qΕ(9+T*7X<92T<0fXQtc. .#D}䵉)CA-`aD"ie63?CE|.r%&f爥ot62Lak -10 E/B˗.bY`qp/[fIZpF<\҉#J4VOSf|L|Q~>2?Hퟥ֫69\Yr˗kJjQbwjQFBN , r5LuAC$ses+JJP%@}6o67Dt6\.^4] aD'2MwHc/K+\vM JcWǶ5'1qW9hCơ쪹hY3GϿSgC͕@4hm7+3:&MF12ZԦ),K%EMǃ7ά#ĨQgD؏^@˄2[7\5. u~o K:1f=2ea6n⋸i+9C>P%:- < Mz+GL:cY+*6mkSP*rfZ9A xpWP6)*|H5 Suc$v(EP1m:{!loi͐KGF5,̥7q *W, Xض3//RoX@5t6޵^WL&B#117:.fC YR7*k28*mս2 zÕ*I +ySC 5p&A 4?MΡ:/ǩ<5s xVC۾C@ƀKe Kpݦ_#C2 {~ 631鴰@/, k\y%C\:_n@T}iYZ2!M׉ӽ/[՗>|*IxLbftNfg3i{AOǺݣF3r1Y B|uo1tٰXa)ƌ ,D~J!{ K6^`6n ‘](@L# .7"/GJC¼]ikF|Hbtq/mL~|%%@?- *S1xvA'|oJ|7hiE:*~ -`H@ll2d&#[ yhR6Vҝi·<M1]lK6c/L~d!m! 8&'i&\>/L-r O辻:ј\^}V#+a1aGh m>ɗ4F(E_P ѝ ţ -[9 _?L} >ޮ6s7iVfF&$nNi~-`‚vBfs\< -чh݃p$g!Ǒ 6<ǃ.To@Tg鎎V\ozm=̈Df{T:`=N͉F&_*nV({srտPjJoǛ| 7Ҿsx?6ұ)9+eJYh xn[wʠ Z"| 6$-ٓoEjBV3iF+ћhi~7/菍%ҩ׃91iSo=RehL膘"[AjM:,k\пGkZT?U.l֗/KoN^tk'hsUxq=-T} YZ ,_(!@.Tat&^1㶌26n?H6%t|$v/ C`cB0!w#(x.gH|f]IslE$cN:ր B,\,| h.;FM h3GN0kz Z2eJ ^``c%^Q&jܸߦ8M;`zJ\> u1mFҙ+@ac\INP#3+BцoChTAIr/¨UMU&:0ьEw&bLV8p̣M5#r2 -:HeїpʹLϼwFΗO{A&r`6!ި 0 Iz1!{ó.(\&C}inU˨m xMӡ"[^a2+ N"YEAǘ CtrFw3iHZ E 6g$Z&j4F "0<}0BES(:7Mٙ3d!H&ȹReMA:ŭ%S\l7gQ @4][Hȴ39br s3)Y,6P,R-}+s@!1^kTS3 ͓(A蹆ԶV\ Z8PSDT1[܆!ƛ#6jsfFYz 1"1 ֹ'/L06ъI ->`L~|:b88z;5V4}D{U؍7hĨY"q 1PM0MDR!B&%.d4fhu}Sq*D0}NXZ *l4y-|B5$h*:Cw%v7A,XC#7CƏV6!%,#0"d܁r`oQKzx{)uA/b*, vP*7).d]M,HbTm}NGԕvoL8t/ht6Bd`T(F"gMFЎTcB%" .&c/A` VCipK:[̷@ZS.zf\%xql Mnc3EH"kE7؊΄w^]{^txܿ)HrBhݎ^[3(6 ~hG4 8+82Ate4&ںx\\^Anu)ڻ:X_(7<>cզcqABET 9P:FliqעzGK}o 9'ZV&N̒)L'b(" )$_]d-E]D^!ELM};iKU< @q!)2Ͳ#PIpcNa1hsh+b_B*qВр CT: -`1.Eߔ XCt/ -:sn# IQ/>s"v V["Y04 $%N4f`B9ҍ9u ]yMq8DtW 3 Adt`&fp*+ZZKo! [u"<0fDl& -[QvЄ Vx^d.q)8>5Xvo:H5 %%ӗsCvaLQalr'BPL)Ĕ`D^/8X5+@K3iSxUxs+ꤦ![R`ʹB!Lu/jđe.n:!si.ݞU7 b!eTel|49?0vvĪG; nf3;=b]l;S^7 -M_jO'~㩊5gPBAY0/we=SȦ) - .| υK4G,J B^*q1?Io ; 5n+X9u`zkCD j>R5sQ.nR)_7HْhJj`RrvCQ#3o"Ёނ? *o3/]P&bn'@l2.o/C[ne\7KJgM,1PF,bQLx&N~!/'0\%wS-2'VTG* }C{?2<H>i>] mk}B$+ -C*T E6Rq0w5΃z+qX0hiZ.< OKY>eˁԂ `{-!-1Vl 'mW'Y1JX(!s4c]ʚ-7+rf zw/[Cr&Mdv "0<`}*[jw_vˍDB.BMmu9֔Fuh.^_NHPYcN@bA&{s6%X.]VgFWP)lwk᎙p!ꭇ_K} -2mMY.EZByx'hi_̱A\&l1  ~jwJ @ScR*Lu@jz 2m{fwu4>!{ޚW"wdWQ}LK50r~DlqA, iC=-c,d2VVAfaԱt4`,󩶜MeiHu^j4K;J qn&+Ax+^IY`vT(pUS O%>KV"MaPS0*Y)mE5P M5Ж}2;)jMЃJuӲT wifo{GqEw&QP"h`6x֙%入q/%'0U(Lގ|(7z72A!hn^ -f.ϜnK >S'Z$b$W%aAr @wQan9E 7V8#he;3&{G Bm880\\ 8dī\XF.hUF0@)]_lz%0V -boW=1DG"YFen`UY{K%J -2-)`X4KP?,PˌHMblE26t/f./MD.lm3+K3#$<= W1OZHmpTb"+a.2 ur+z$j)p#DEX7XicL&厒<^]J-'*7irkAKE =]H66J@&`w+8a0̭\ iTƩC{ *Q Pw<45&H.k<[Lf׍\eV a2P ^ P0#0#Jh~ЍH%9Yqԯ *3t9DꬨlhcîzicBu{(hi@[WF7y&tDhm`ONW a: .Xɍ;! -v`MBVHvh41ΖKƦ¡63982aJ4O.kbIF)v })lِ.D#s-Tg+]U6khF(%ھVX[)8;0/PPo)z ˗>Ey{oe2N+߶(ƈ}`@ܞho%֥*쒟'k=hH"ɒIؿh#߅Cm+J$KJ -MFѕ-m 2ͪsߖ/ ~d(B 6{/i^[K@^ô(P3mAqk*>ڗSW5DJR?mX5|\[8(HݝuXI`?&m[BPf.XۮS? 6HX4:&q2MS[JӉd#8Q6Ҷ,oVWwh}6 ߄ֵz2Ty">}P`k$|+(PJd>ЗVcNkhdywUn+1yxJ B0GO쏹eldi_ 9jfRB)M4XkRa'@xa nLThn5)Yp"R)jc*]ØNCPu3.[MļiSm9Ҧ 㴩+CL+mOC l@KD -$ @@xަ5!}ᶮ3*U@Pw \b/e0@K*\4^4ΛJ(Kt^Hk{xq >V}Ϸѽl7H(F_+41FT,8qǻ&qip,)b rF'29䩴0.0:b%@MނNn[KI@f+^A";K\<9k66ma cAplW3yXep ~%TB$ElOP.44.q*>AOP`ѧ0@(Zq1p#U Z$Jԁ m>DwQh 4O`@Vu&,KYlQKON!Fwh^S-PJ@7DJ˭b̆rT U1{;H#BbOxK&#QaDfܨg$-7VZE v -0.Rδ-T2/1ޮ@jC|+H>lkzgK4Gw*$`viCNg qgwh0iQ>rmUcS1TNi`fm@BeQhY -l@4E3HD7N2U"GMs +390SdN<#!F;.:^%ҝIq s/Łřfyrs~|J%CiXq%-D6c1+@]UN8o!w6z{v,"P=}) >H:_x( PxSUygRiP ]Xj)㸸0APϾJ49l/5ͺ&eŖGd6"bu:Er ^#9:S(44NIO{t+*$mTh`DJ+(yc32) vtf 2apoSQE{KQDڛh} -GNU4\؊C x`]!Sb -0sų{rQ63Ŗ ׸Jo ,eiAfk̯Q,jʍOm&9̺4a6F nѼLva ΛB3m -}3c#lӘE2+De\ RlIvVaDmxhhYSGyhB 30֣yұJD79Xܸh6ʹq }BdBm3v}&Zs]h -i9фRCA̽ j\5M#XCEDV|r w 6%xKN' @]Sh|Th ޼xeFܮĎ:չsEuҎ]AO0}SAW"dxUmm`@+ND5ӥ:Z\لt>jnB(.g!CL%{ B rc@)if,w 44aĂM+J9M;}c0:*@+Mc7?Q!8(}&xRV&`2~ glD8),@܇hh5% 'A2 TvE)E6 -l+K;NH{ߨq˖%)/'s1$`< Jqj+e|pO&_39\ZHYU~Y`o4V km*S)L&MՆql34yaMq iY*deu;MEZD3!4T*&BƩ0+ykJ9٢Ëi_`zb~xQK*k.bJm4Bdk2 -^"u{Cr2,*="p -T%z"쨩qv_cVXݾr銄`Eռe+1kB&ѠuΎT hM `x:T4RY.<.GN%Zu-'ö}(]1d—2(I(az W3fT4uOĕ p.tKRl ?1 cBM>)q2.sm)ꂘR# V:XGVS${B.h2T5tuq7!NxGN- tjO3BKՅ\Z%#dPz[T1Krc]?W7ˠc#d`*Wy[ShBZ(˞B+@ql bZʽ/JsdAG &|W]Fo.Eq,h"/JTJ< aZ$ 0*XJԢVt1LO;MK/ȲB:DlDžKօ:Kp >! E,P;h M]kd0Ͳ`"r6oF,0f2l0MDbb^IvB/h 3p`Rt0J'̪sJ`6yl\21#jIna-^m@ۤt.[l -C19?{9]1-NTmxvv a!v@*ԑO%;07V7PF=k=v J"[].^TXd-85Zq+fgCg,eEohRY,BpCU> ʍwҬPc -D8H?t4k_< XxyƜ)b'>  $Q{xDƠ2A;4Q!w -\d -#ϙmUf4–dY3bc)$ٻi8MT*e6',qY:V+M aφq754ʹUk~w5rvDw)]KJ&h@oUkP3u$A23ƻ4 O}z/]A/_a1HʶRJGSxeY 3q0 wd:$[~@yUM:'Ld 8+sc` G~W8Sg`%*reFm1dyWZB\],/JEFZWxzs7D?JBnxBm%˺6cc -Xbg/g:TlXޕovd)*Tܧ:6!7m9ULm 05kh ZS6̤)W\-xGFfWOb 4uF-%|h:"I}qx~6Y}%xR z1^P RTW~Ӊ]Lt@~(7XCT0,sQ6.cWmdBFa.XdX -.hQEss0 .U+#VY/]2^K0Ia Pe|; Ճ*&2BbhSaݩ) io¯7p2fh4[7W+Ic2(P,Q8(6/t< -b kQž,L8 -$£1uumȷpU -"E2nPIѴЗ -W8Lڦԣs@ب#AF {jXmDl3.e-8 -pxQk' q}. X֐82NwFiج<%z@PINorѿ8y1Poz;;Pn ˻NX s?-1k"`R#5QTRE>iHe?+W}/($/x{XLAKD_!ᾁ3}:c݅K;LJuemEu9kqKQJw #XZWw[Ax- -bEV B5KǙ꺑{- -3xLW - 1/)-RKSax>Oo}aّT *es_Gxg&XQ Wˏ0C/pykxaރX1BZaJSd1d'ϸV =8vwl?l؛C?c .@/.buC\2 iq1քmhM9fMɺgQ>Pa G{sa7G (&Y6gF-o;Ll@gxrBiR*TjV*T%3y`$-=,wäJ zT./uRtc|G+1obi@},2QilEAg+͔n }fg -.ꤢN7PCe ۳}"h/kW*.0>n[~,GgեiSf T&VhJ.踂" -4 @&ZR.T<* -7gvUd([n]*< -FW8rwKZ0V -oZI9M?®7X9ť%kRiZW~՚ _n&{뢂ГGf-g|chZArhc%GK}b"p hJŇE*L.>i`<\AJ2qʁm͆"]"Y6n*n!"\./pYɕ{:79[-%nY{)m' Rcfa3ۃ (.#fe>Nĕ-+Wsv,0JgnKG|P=D+z=s: oZ{'[{(쳭Ic<]"e*G:q2`#ߴ -@4MkQ f]5N =O|,7 dAMWKl~Ejl 4V7n[ʿÌ&R1Ḑf(0!M '߿[dzMzX0mo?v-wdHDIZ)5moy+ﰣlrާ¥]K`ۯى҃z w. [+Aݬ.5)_.1HmV_˸A 3.gK'6L.O|}`472;'Fۭ2De+ؑ](  kD,_ӯ -Q԰}o>F -ͫUtϴFAqѨ 5v3ǝJbA]^wTFϠEXZ p \.@VKe-^\ I͇6[bGoGd#USjW [B]76yC*-0 Y!t -\3+h'$zZnR6?߅§p*# - "9/B@^[/{Wl@ dY6Х%SvGzWD*{-%As8[틞Rac RJ^HTJ5ySh!f]l@ƫV`TmU:(6O:XcCNUnT;a ьwʢ3c1,#~:> AeXC7Xc»dl-?}te7RU:ۍӦ 8נ -Dp-VE 2 irKp`xQuv!X ?ǭWw܈%J eDt+o[|d""H;ZT{KS )&!zu?8,yuu 0KICpOE'.%}~lE{Jg'AKlwLW^ qJmYnyԎʙ" moEIZ],PØ -kVwmVaJMޣsq7:NB* #.~!4<M6*мwaz:9ÙJ)Z"P0+~/]ҀAWytg K`XHdpw!.;opJ0V^mjcBs$?>)RDB1On*|lc qd {>m nQ%M!MqՄhRBp4X۫?fU&fLrƣdN ̘<ݍO_eRbf:پ b-ܳA[2`؎zfT8D{No`ztZI! !]ZשEm[ ,gzF^kR84G7Hy/r`0ۘ mc8."UR}D$Ek# -.)c]ğ#g,݋/@6;A€D\1Ƶ*(5\\s챂.gDbPzٴ`фU2ʝ>TsZmC$ݽ'#j-ױ^a^c߈+SR:;[֏OL?г+i-ԃ𯸁τ4Wʛ.ZhDy 08SeaqW]8B "qGB:OַH&GZ\!c~==J䥀-w3(oaUqTz/l; ʋ&Ø(PĿP/%:0r#9`ISǙ$H_WǦ*OJ$`8Vl1DGD`,\#_Ŀ͎^ӳ78 M=TYi#GNv)fP:E u4c -퍼vsѳZHX _t迣_}!d;FLns?,CKf쏉P\!P:-\J(.Zy$'k3*-bt(JQUӑDV-EzaO 쌡*n"9H)]ͮj<=׭HCbBKdrbYni#NŁ/[tPKWD8ECJ϶nSpnmYg<[iE"Q2J^E[DUzvTUdSb*E6ȣ[Wn(砀:;9%3SE*T>uG4҅ezBx_E]~ͼ4u$ۧɷ:W]of~Oa䡸UKx~MԄ=GQX. oAb#!7Şd_Aߜz`fN6>dyٴE7P]*cJŎ]޸Gn|D hu}E`ZL9u1 -Fgxgځ|4 q{.0,$jDuhuB:1ƯΊ،`v$`+.<H;ڳ?Nלr)6gZ08H;F?(ᔢ*7Dpae9q=ݳY1D"/^+'⠷hL俭D\UW֩rN)n*FAdQf:p,u^FP*^$'a lRm~%Dw7VJE3: p?4b-X9wh@?HzS{a W7N +9uх-DLvK -#SusnP^&Dsg׋ -|7u܂,0+5t]L { *EWWdzCM4; ]gPi#HZKvOHNL:2Pwcͳr>5X2oG B0xT} 乙 -"Lܤ.\ngPX_Z:2鄭0^(KޘjE@Oց@}$bd]ݔۊGW6V(Vc8`NJ]#]e h!lR uu%_`PLtieklc/Jlx:)u~Q(ȏ ._գV6oIdcvehK!V2L%& %mzAWS-ņɒ>d,%[褺%-X]Pe,> ?e<~Qܻ {ĩCR2ʕGyi(VV ?DGGQoyl#>H0cB,[֪˗7cIp ͠"J*T\nD6}t!rgpF ~ʛC9E w 07-ʗ ,͌0,'22JĴH7/וJhĔ\3?!Kk2:l*Qޛ.\IB +;%4\ٍ$)S)A\D`we`)[~BSV᠋FVj}joe(e9V}3r~o,yzB:%?2oL=P-R|aIۜˌ̏wQ1jeQ0E937&BSc -ZGyPjSu-NYd+v{ڏFnYtJcv&MŴ=Fw2]llP)φsάLKkCxzYz,/?Cɗw÷*{b2+nrrA/?vYcJS7=|3Nøhhmp6ߙ_nC&M>$Il=#/vqւQt w9bet4 د y }ⴳgftR-T"O ] MņN&7׳Jc¦O.f}Nnό %1~E}f^8"IbлdV.)m>5IjMXZWX\MCpSM>h_b?fcC~&ē|STd1T8_)p.}|}lm\N-f]oݏX.VLM:\g˘4 lgTC1;O9缽w]cnw: 6'M0oR[W&)axt'gTXfn J]uPo> ???>`ԊΩfxq)e ~AJtsN?ǫ7n e~;} m3/i9_y$G/C[KpG2dʝʞb_o% +鐑2@!m|@B~p}a2 &Z3STޏ8\9?Ώ™?˼_>in׿݈y#?{C{a܈+XPv!͓gǒ}t?lM_|㮇ݍ9؞`q_W$IȺiygE"YiI:s5vY0>0/МK -92f0r}_y+%wrcc3 lm8X<=v&w[f}(֕^YNii]TB|x1k >C{c%ʙ^՘_2yʿve|'~ҙ^ÿ&nK»%W -J='o,wp0˳{EdBVWӂre\,~ /;+[Pq.˖I:3 BosVu:Nz sfkwr!CM.\[C|׳ ~8?}ur{s zSޑ4%m(d:7Dzfx c/G霽__pƽ)ޕp =w=ؿ6ߢ{-ٳ,NۭJy{p 9J) Qug&C'Q(]6_qfH4!snl;8?Kև$hASݘz? gzEOƋ/^XyBߓc1a*ӿߘ泇S=&ߩBBۯ(:y9Z_֙zi M׾`A#1u>+օ -<â]'D[.Eoʯ?#8@^0Iuԝcr,{(ȥc&EiO{n$%]iw(a޿Hu.&" /"P_}jۿ݆_2菍.fW6^ -nd&Ł';v?4k!ܡ7ތOt땅]OœqwԖF'"4ãi=/<z^lq]NMF*u1nR_8{>&_uTP!iW+]KϠfҥJԯ߾sX?]x|m. MkBGyY〭 #g)=o?*ƾiʰ -/fix咐w^߾BS$Ɲ &>׊o_[J|~PIAۢ hP?,D{ yN>T>))7\xS5IzXK3O=ϾCnڃ:nj?<_Q #wr>U?R˘م{e)z[Lߌx.`q9S8s?R`ަXޓ_WBng|)k˿֍wSuRu ̢d\~_TU%^#jMJ!ӣ2~YsxN(bD 㮏SKO󿼌{$@}7C%XwT!9,VC.Ŀ̢Go?5t0?nj>2ģu?9ulykw9);IE&,vˎ*+ęT w{?)='Nq(᱅Xca0ܴBI9|e tL(T؞ˠQW~ -˩] rxCwߢ5pI+ '"Ǡ2 -c`\k9~_u+] /.~ 7뒝SN-fێfgU%x')4>q/F?ǔʋӑ q/<+ hNVvZ =(2p*Dd`1Ɯ X`RÅ_uu%c I*@7 %:TZMDۏ^*([ "C;e`6}â?ICA;C_g懶s=ۙfY54,N4Wkl/DZ?~J X {|O#h 7fsK>6.FS9x@fq GUq2\'^iCJtF]Jj j69'mW96RN4h=)]M12 T F6%HZz2"?;" L5=p\ӎ.[cf>LS:]_d?@4˵̯NqN-S1HaH5a}' }JZ,׉P103Ŕs >bϙiRa6RB -XRSp=%f`ԩ|ԮނZݛ-M򔤋6 ",qLM6w簲QwkYy.S1X^^ՉA["u ӝ ^< 47%#8[X@V{ňV2)1nH^"F̣lk 1Ecp\.SīT(ni1N5x+̷0~7/͝}`cnjw1?ٍ Ɣ0s64B*k#CK+;q{WcG8&ʜƧCa>Ot>3+g^4*a/F:4+Mocb⚈KU}O7Bށjht4nY/CMOp30E1IoF j\LA[ D^'iK!(ݙdXF*kœa.ʗӖTSE -U\q/9-ѐCu fٗTrb/5rK$6kl<4Tr08=2B30Ǎu3~W\ݜ3Z+܂Fk0!׏7G;Tsq/R=KRm=) _b40Bb *2VdR5Y[5S\| ߈A^ $M%+j+ΘRR Ppe޽na2"]ׁl4L4Zŭׂ0dH,tuWBo%Hwq&mT rfG&z3oğ3h~RԷJ~\:"`\^f?g78qHB_8 9PD^2\-co (G:b6FtpqrMg}On"MM^F쭠7dJ#Hy;BTĨu[W#+Z*6gªZʅ! -Ux'd˙ǽ D7 )" x]'`1ț[lSpcG,ogR'ǼvHh1<~6]5ćV!oS\i)r 0A'i Csv#墠%L]{AD|3u_ZnE}JPl! Pڹ9'=Lˇ¥f&ʁZu4vtzr?uI8v}[Z!!*IQ[[&OlhiQ\t۟xQ0\5'zAc.^c.g^+p2K.3E.uB/| @.r7;CWFYpa2NtA˗źΙaS+AbM儸ӨM1trxshF GsmVnʘB\fXks4B'X/2P4ܼo ψ0xok+;i!庎ޒhm -Ϗhzc UN|uR5tfG3-B+2Ѓ]/ 6XkSBq)07| aR+V>a@Zԙ3*T5>2J[ZXt7 K'|Opd ءȯSٞjUZ<-c%Oy c˂_EPuP{z Fˇ)p%]S$%:֕?Lm)Jя.1֦YCB_?A.,,X*:Ix>ŁaۭoSr=Q!B{T;\ njWTFA|?+V"am2+47פg%JҼG i[(AyF|x˥3s.q/pTNRZ=tLFTr^t?hUՓ2fck텏X+8w%1[H B8"Qd$nRJ^ BA4> -9QE!szf4/N<fozT˂ћB:o 9MI q>D."dDۨQT*`긕Y (` -hn NV` ޶/)Jh(c/YnZe(Oc`0{. RKt RY8ЗWRdI&b;iP*$"Y3zwK7}zҥBbTey%\Cm -ef7uU;h\bio_PŐhk%cKlC"[M (m|#VVVaьiF &Ib;AMw&hyu9C\˯OOBIR ?C hDP7:PTRo5DZպ;,1Z IPz!`(KT6;$n^ cREtة'FLʌ-Z1 -2z%A*#W{abЄn ?ir Cd;bc4JJS/z9tSRM"d +3^!zĩHձ%PB<őy}3dXf(\7>*m,s i!W0MsT@**wbL%j*0qx+h0zma&6s7QúB2Gw3}c󥽙ښA\NvBdAgg8چ ~a_7*Hi.DIkR.-TYb[' :H"Ľ"vdQ*q7`C-lkz\4` @|v݅p-mҮ՘0ȯ I/~^s5:7h-2[Z嬍S1nQj:cyI8(&a,a?T)&C0ain 'sSDW0 32ցv"e44af8tS%Ma.&Ɔ9Ҡgʎ˃#9*q \h]MH.L^q D^qQa]-2z,l-|d6?9R"۽ԭPt%0w7vC#РnMu߭'yV hQXz)GX 0Jŷ(iXL/0pJtlN5 05 nῃ mԽPCRLnRV%cZfx-#IyLd _)i hUPhN!)*U;>p!Tw;5`0 -[qN%dw. b#U=HP.8e@hl" w@ieg$5t #:oA:7VJPȍ h\ɡQ`W9(:\;֚`@=`PCHPE="Z ٰtl B.5@Q#> ӄQGx4NwPA wB1s K/::B;K?(=SV^l/|20Z#ntЁVLLOR!.twXgPR8ؑMUҴo4/-4hp;K$siP5/0h؃v -%UzuPrIesᗞjUhDL5o0JӆTM LbҠo L4˖ډ> 6t4C#\XF;NFvHw؋K{XPaF>MVU@UQ:$"+~6>QC9GD Z3&L f#H>+QLkՉY}odbJ tsvnbFy2R>TD2)TxʝkPRV`@/N]EĶ_#™RB!b@+-s"4+G&Uc#at4#7z߹v}t^Hf+|I?0(轚fRe7V - -@>Bl Bx\_P e,*seݽƀ~߁^īt -]GB -ч2kZk|YԚ/ZZ8&_GDa2"6:'e{aYKb>'q#!l,Gc >CA~+ :$D]LliJ@Q-'{91*e꓂%&'bu h=B A?R~R~܄*`U>W -+\)Rv %iZ1Zto6@`FT Pj L[*9X0O`.y)aRՈO7Ԯ>7 @ K*-ːS|ALl§Sƨ*S?FZ:oj%nǻ17"'1|6=?Jd}%&̺h˽F[3}w|I_1VQ&B].Js%0P4iY^3m:aƕ*i¥QcSL.u0($.cKɡo(B~+C^>xUiP> -vpYn #{=DdgLitӰi ds%xd!o3qd1Ӑc;x(_HzZq>9SB?U+SfTV&MnoT`4^o/2˗\2mxV|7SE5i~B`8otܮ\Ef;/CddP.`z=Y:؄Ԇ1ÙS1+ خXJ!lsuh6 >}//:Y7ND]eI̙Y5X2OJe\=A7;9*s\nP$s7CsRd Nu4"RVCKcvG$ A NXCEuVt+Box1Nc. З,<._72gޤdzf(v~b: 28?i*=JiINP&[[[(2?7{x'cNb[ӉԩPTH$(^uyѦbĺX40ĕlkyf\4hu%bA. cV= P3fMYlTdcX+^, -fn&AJЃS3RFeu,n$֕ -Vlҵ>*UT9m7Ս #GMjsGԹR.!/Z˲fY.᭕ -+ -$0L>NzAT &;r8wp@ 6](vBЏ޹c0cN@VcUB>}Q3@*4IZV4Z7F?t0cǍ+:TCϯ6v8磂`[uTeXb-ED2 _P1K1C֙x}C"?FL.zcBeDITa3Q.C8x#a3P%xtt@ :}:ӯ -S`(c闾n:.\?+f }[_|:ȓKa{B[K/B-L)tX)܀jTEk_`+=ƄtY0U 7Z0~Z6hÍq+XϴFuAL*)2@%Aڜ${SlT`T{;HIݽ-$3 ;ap\YU]L-w 8_D#h,]e'>Avfj -Wog?Yt.U3A PYCdII )IBr: 0| 461 aXWY^:mᛓ&R(dBK`\iƆP4С157#F2n,Oi0۹'vڀWqETg(RktHjl1w#<.T,&@||`\%hbVΊ̨xmt̶ .\d%Bu::ի1ok,%ɌJĨ9ҫ:77/Qї*sNe83a!j;_D~yPrd̢_Q]щu0#f`Ƈ6 x/ZhjoL:]4dkƸPZp.캥&0tP)|S PR^RJqya[D(6%8) -!k1V.ZÝH -0qhy\yTZM*TL߁2Mnq#%^wFLo?&R=Bfuva\.$#t$< #6~l}}ECB>S=>P5(@!VgVs 6JqZHLW%cJMѠ)vFgWiNu^!5aZarem/KĖV";cgF?$60 gfP}s!1}!{pOW~ ¡ "J2G()t 9¢2^c-?@W{:$ uxlx44.!' -4leȌ7uYkcd.g/D9tVpU -[ v45uVE^8[+}G p6ŁF/iU5aRD# k2GĬ8#vB'14!MBq@e0iYZyqZ7*Dnm%B Ay%CRB bMg]3V,W[_:{/qH̺,Wq'_hg؇Ss yaJo ab x)7!e7˂ه-3rH e.l&Bl!R'!: }A^%z#eWc~A*2tDdC}`EwJ΁9BD>0(ц&z[AEo|Qb)gDDIE,}p-UxQඨaH7tƵ -Kahbls+AAs7q %@(BQw%U\.s !krywtH%NɥGfa( g"D<3K?^29#p|E"?n&77)vABP#}4̥`CYR|}NlĩROoטma *C]A~ 7!W1`ַ/LR8~}I@xlyj1c -b8,Х[$xWG<0xL4ClbbɡhD#F|*x ]uaCĭ%ѽ],yHd+׸%@ozEOU])̭W.`h2Ko9b z8VH^hM %gD P<.+@v2$rYvyDs7 jn$E8 8{Tpapwci ϤfL$E~5 j e2Yb212\XOxxqzޢlYM2pZ^ ظ7Gx$}lB>!9BPK=̕C@ --Vm2zu%.\VY/E.<^xs㊕0Z<3Px$ R -jiUr`''x|yA+tfT -r]fdjr N]pm uAi+BՁ6#J6G#{ڔY]aiAkE;Y d,ow/H5l{{W}B(K HEn $A . JSV'TMaF̢L -E1AT$H[d!"7 lü̱AI79R9ͭ(9x88{C_8(GĔ=)ܫ+,΃el΋ds7c9V0)%y;$CdM-}ޜcXn[~tEe0Vvա/1Z- 0i'ܼ^ܼ! h k1+He7|ư5 &hh4\N4'>өZTMBVexr奥^:D[-v#--8wK,s+0pp$.(h +J]O_Կt,2 rc&1_AϞ s4a݇[⿰<ҙ_BjWaq '>֯;`1e˲\g0q.^ epe˖Tbqa7*mW.8 -AFyIE}1 ]QdUw:tW{++FVFTdo -hʁLxN4VJQq!HGJv$flZ srXK4 RE1Zv# ;7Ln * -Ha# -Ӏ[8 s *)9>y}7^nJ*m~}3>74taɴB:QǍ-m_qGK ӆs?=騟 Mv9^V려XSu5b=U<ńݑ(t@u*Ҩ[ -Ѕp<(B% eVZt7Pv7n_GiǙWc 4R\xS܆J B5V_ ;!Q( -lC{B%aH@x(aZ6Z80u܁j%̞-4UjLA雋7]bs羵F:sC} iF3~}D:^-;@.&6qoR@f bc7 JpoL,/4-kG3Ph-ٺA$ J׏1PJ.vSxAibAjxV#Ui-z"Ŭ&O55/BY1I;ec r,\)@A2n\V5w*cGx2Ov4{ho$&x@p+ߦ}+#"!8c[/jm2^.4mҹ16Kf]>b%77kX $lE N9_F;C*xga6{*./D,MdDV*Vx^H"ZZF)+ ` 1Fx/7[Cе14pjt@7u$ >1@ cfN#cPh۶]b` -2% ǻ $ -Igb69T3Qq_P`d{"W If8kZD,8z˸5(j酈pNd`Ȩ.͛"&r0˨pTHM2bXu?SQfO˗.\LWhoi*,%bGDq6\e'(60ܵ1WLO+ma nQVT\4FVP9څ+m}nṘo6;WJ41rELu&t1F6#VE! Nnoz S L{2)͊ܫ`*K.De$B1R(YzD,NTBal 2ZJQŎǎM568.E vW3v|#xOɫ/5>Z-%NuP#|kJЩRҡ˗, jTrڐk 1^+9b@YM)P{S%܈q O.4kVIh2g9ץ?z$[eYXPs: >Ye$(ñ%Uǩ[$N- j0Cxu\C%54p&NA`D`Dd-L M-W8jUWbKrk$c ]x7}Jӈy02'ֵt]+JqA,F*l+j0j2*V'8BGuO&;v!)݅*}RYF-W;"̄քi"CnҊ@ZG}m*G ^7xZ¥ք5#vz/$W"\&Aj[-kw刪6w -x%q8 Ԭ&$PܨbR߀>jH{LidK-۔_we_m @ȭp*%F!pg?Dxe w`4@C6&Nb2 RpޝD!UMy<8ә΁hhxlNc3SJK`b`eJvV*d֑5{`[OS=_f:Xo.\M>ėvXbsVlm1i.7} 폻WQB.1!iQ܋9~AUoqqH9ܗSŁ t9t V *6hFUCGJDžQ! DqIF)le"$B ^k( RbЩecg_aعwxsUt}-X„*8 Np/ Wf@q쇁JV24:orlSiF B2F9O(3$nD[$DWl?q'! jV|i9֣ - -ta<׊-d+}۱^d$F,)6UG#-i%o(6/0 *Ȱ)1+S)wJLExJ1)A4KZFn -ypk&l[Τ5<. -RH8 X}2I8R$o`[܋L \l6b# {łݖ P%} B&*VoxsGW^uƕ*TBRSԃC|ohEmgTgYEŴ `Bڿ^<}gGC#Uf4l؄Hp[ Afڈ  ctg'(I[S~XoP+¥J+T)Fםsn_IRfVQzCGix*6^qFv[\78x$C'FfDwX$Th#(V$j&5 BpԿZVQ%iZso*:0a*jTDLb-ޥt'}֌hF>bS`ԥtCi -7X&LqAl" 0ʃ% DJX&Rrmg"Ѐ45ʕ]9>8 ZTĿv>  jESĥi^9.5u3SE ٻJ ' -RiQ5j$2q33qZ*FQ3mA(7ٻQs1Ws6Ms.ӡF "Mtm4eiQhd>5 -JI|9rVRb 0G͌?Zb3 NȪ$n 8 &t44sa E. WGOSDnV7-e#?^W;tj}z'HeSU{'d@lD5*82[T-"t(Hint4w -آ+CNhTQ4pyu)4V'ěM4 -JLT2_X`a=; UhHƵɅE=lC!"0 B.B_27c9B LK&j,cM1::gֵubNew+v|JͥT3^%4$%.Y6Y)Q*"%;;3hy#\Gg[!<6?*]`SE-`. r^Ūqnr>xs;j+Fq8ShԯOD.2;Bq)G)P7u+yQ2 -l[oj3/Rp}'SGhZIU*mK;sxi8։^D!CrqWn^7"x3}JnrBpZTmqԕqMLJU*7I֥^\I^8΅2'ZkF 3S0%T:ƅh&TZb:3x^>t̬GmBn2۲$`:7+, ƕq+ƕ,%cGB5$0q.Z붷.ʶE,aAӽoF 5Qh PaAقm#?lx/b,w4`f:^3%Jc5{>zӭ,3;өXƔ' Lهl~- 1؁+FdB! c>Tns3mlD(ԛGD]MqO>b ]8r7U}*:B)bH.#3s'Cn[V&_w:`& QծE __F{ 7P4[Z΁ގ,+`fv;8=Ixl̀a(r]Ǜ8+ZH%%E Q@3a.͸,ȗm7t7׍/(&<ߴ{9:2m eRu/Brj chKBc;r*VcrX7@nՖ;+TJulCW,d8ؐoιw ̘ iޕ+! lsxV45ݘSX|$@Xͤ -.тƟ,+AOp@mzB^r -.x) g_bl>4z,6r1Ccs^8bSנ6Tخ;S3 4Pa"FϜ~@^0vedZ2VSJxPSy0AMӅ .dbscz' &>s~!lK`bjHQRd?*-tW*Q Q s8g IRn!jlʪ -gEnoj:/V:hŐ=A|r0r.>8Xюk*RUqz>L[|)f 13_қIޠIk!4ӝ0(YET56 siצhg<^py%r?moWIR` tZTx*{jnBo-%JtM Z^;S$LbGdj\!(8F]oL&XZ#{j(2uLJxfE5ƥZ6SZmԗg:/D!w -;A! 6G~ _6b4=0 -7Nĥ/r_P;DhA\p|/)t05ŭ4T_k$[ -.;odڇ!!jU  -źۼq};"ԟjԁgq-$zK\WЌT'hoكD0xj˽93=y/8 - B;`}Bl0)k4p}4GbG*iSaQbt ~ylMBgfO`qI¿IUo&”-U,|';^;Xh=?ņښu J>Ȱ>SopЭe;asyETORBBe$@ -@.[~2qBo46ʹFYtH -"hXxS+:/QRe)] -mU2'fDTG6Kf"cL>?3nTwLo*s hNfE,oBfhjy.`! 6e˃.tG: Ɗ耉`ҥNjQqMjMdQ. -3Y"v0@^W~w(2U˻ -'j,s|>Cvp_%mi,nZwCh0\/@˵N̻VI3΋ H iԕ1KDKth.o%3%^S> FMRh_lj0BY|y_*:U9{`4w,+xRJ)j]`1T4 -_,,խ@`'.8 E5G]̴$# -`EwHV`aW jĥLi -7އ{ֺT |/Ԃ&/C+%z`ӎ zH 2P čcD(.߀ϸ*ڴw ^fTCEQ6]֤<̢=B.ZmcBx̾o pevC9@X7?|a_'iLi>hni??:TJsqŴSU.: X3.^i:T3ƕË{7k3y ֮Q3mIxQ3Ef6%/`Wk`,tV(q\s%tAL292EYq_Ж⊈\RЕv4MxmݰgAѓ1tGibU9/ZoJEM{\ڶ:B뵅vބ+-*Vwr k*"/AW#E,HLPL,PdZhN4#*phJ"GfD3'+C`+3$Q,L (wn@,M{VQ[VLʕr`qo(U QW.z0:DnTvІ|y ,hdGzj% 4}' DJq`ߘA6cˈBU"vA/xǀ HEVjheXb$hD5f.eS\ߑ$V_I7d6#/IS(Jm2drHAkRg2tp %hGB:΃.cG£Rǁ•E\ùѿ+3"/n7) Cvc^!J=LhB>[KPPܣmGw8ÓxU/|K2o{-VD&% Z85r1'::IP-[8> '֛T(*VS$)K_l6)BOM4s -ȝ%JTJ*VR'lޕ|ĎЄT ֜j@\AlVgzv;j`*$xv6eLp@A`  -#kxK+eC& -Ht; + lsW!`K>iJ+^O&*TRbUjN8"]+{3~[נwLLh[RIwV _^)@D`mN!ĪIL* 8ƸAق EzX,#D +xA򬛰 mK8nmƷ \JINj k R թ?bًȢto7zḤk_W2=Qy?J% -O{ A]#~@ `hݦ|ݞu'?I(v%uu-3*(6^-h^/* ņ&73m)<2290y\/![s"ҹ`"V¯o w%%,\ fg4:=LShMYbmQ&)d1H"{Cd@v N%¼TF#  L㕍`nd̰S_A)K0~KѕT' ~j8X)& _i-W;F1.Ε l;jʖOeЕ.ȉyq0/]K>H@ˢVB2s};J4 >?sa{܈;=L@r;_lECt=62U`>Z"I:!F wWdXS!BWy[wM%f_Jd*c ᝺t]=|ܿ&PYLpB6W !UA -A#ݢ,Z -@š] +JF*VPY=H&XF - *Y>em Z Fߤ#h_ -H\Lm-יƣyׁp*&6^F;Vq;fr -"s:2꬧_ ^J+ЄsC̑0OA(k^X,EFV* - -e=PhOabF!G&KpU8Wf~I2oJؠp.PU B(U 6cgʢBX+T{\TĻU*סYP'b{c\Fՙ`;ƂZ*^t4<b!s/@1=GÍLB:}JNtN| @R߰c ז]+j 3E9Rq 7/)kB ajjV3.\n*{p]A2q7^]cmپ0 T01 YǤ*QPL e wBH; F}0Y1ذN(RL[gAQKW"/f_ {u0{}̯#{Xlu3k1 slœT{0n+\'3uλ" bp -iCv{Ŀ& ͯt@H˂QC3i]>ȿ$- OOLHBLB|>19ЗXmɁYR3l)4uҷba%VD;A%q%=چ[ '3DRK ^&ݠͳmqm溍]9(Ti2I}*"* 0Xm&p/FxQT^s 4i Oڻ2#V[hU\me8th:(%A]"tYd*@CMs o 0nKX=qMls|.nZtF1s.3bnWb !2)Mx\uO u4R ɡ^A6#8bp?OcFKQ5!Ԃ?L`VƊC)N:2BAS>+u.f.<*CM<+mKZF:ltX T\эEЙ5N!#cbJ$56aڳFޫ0Aޑ_o˚OA A}:mkeߌ <k.UCܢ/⩿?WB%BANIkֱlD+Sc}52:RnWLؤq -t*Q5P1J"am-AE͈iВu84pl*#{"F -y/2[7{AMm\C}b0֥xQw P%U%)Y(&j$J7D$rJŇq"hþD ŗ*m]ܼCn 9PTjH >nPjB^灲v>?l (RK%{6TbXgo=8]h0r)tń}GRMMl᪽`Z0-otCz^Xnt0ymjEt  zg%_,z4_u_KKVTZ/cx-H7 p| J Q8  H Q-by+js Vꙉ)J@d:J B\M(ۨwUmR6i=MF1Ї-{#?}ŏی8vel)_rF݁ƈ-*A\sf)uIh!.]CqC1xd` VHK@C4aـ!YwvA-!!rNHiѼ (JţAkQcd ?P6م"&v㶁>NYuK ?56 Fb?t ^N9x%Fq^'PX~DRn;͘ +Q%IuIB~` dFDHi!H^':+iR*VJLJ+f5vAJ!I~>XV8s2WWDr˘XPGbic:iRUhjܔ6ܧ13 - lx :nĤ[zdx*#AAz%>v_0\&fb.AlrzvC-Q Jc@uk[Ic5F<ÉH`Q}0z1VVt`D|Z-®Uixс:0rҴvL:q-jF`71K>/0WQ:-pݬa%"t$P]@rLbQ$9,'R8%N_&.v-h2zwg4V!&GGV8oEJfҠY5)d"6AG8uӗd0_J "1 Aេ{$ƁL°gSV;bh3!+}iJZwFAyKTu1gtNas0qc݁w~#|LJwe˄J`.Avo`]:y,g0\M/%/iӧ0|>aHmP@kBi K ^+Ƙ Y<E[.0~(8I bTIMzX{|[OX!9ς|1˄|eB6 z9X٠r@%$T)kOTcnQKJ˽"PA8[f0-hV聅Z#hN̲Kԛts @ќf#8:_|GV0CDħ@<6MtA~P]ͥ6`s6>u>F&M5{x4ªfY@ ,v[ى;Z֢ c1ė1;.d dƊUj@m_;o+4>siSJ1ah;[Aj ze8 -|\@{QZGCdiT{uՁPgRB=@ #6 m_JhmYi $z^$ zhK6Kq`f/28m+RքN| ]Aay%r rk\P L)~DH`AY)ԛߠ\+́Zl@PTy$8Ѫ%\IP#fq2CBG@3ޛmi2c1l5r""L\CxBs8цJYP)%]8%@AE0҂h,;"Kg3xa;Kd_bB"!,7@,S@-6֕NecWzЬm3̶0f#SuSBsKaɽްʲVțlʉ3 R&LVa(,5 ]@T),L ]FA`mf*,hR2Ǚ{Gx,xZT<\< ҥif&%iƔJ3dĭ.8 +1YWP=bKlejIw_xFffgf\F -6L}ص7,Epvd3@/7_$bxYr*ؑPRZ2$Qd]V>e`B0<3z09Sm*nű]Y.s;s e2ۄn.mjㆺNbq«-=NUAi?YXdw|h%وmǥO*/7EHg  -X>zV͕”Y ejNe<`PCV1 ʶ VuiyfwSʕ(heCx7֤ܸwö-L_t; K9JX` TݧX}fMqDtb,r4'.QDU!XR[YKݵGҊQ6zƘ8Ii&:0C7x04n,C\ZUrROzD xo-[,j\ iXg\8ׯP}~Nl|~|*#zseA% -]z(HgӖ6~ljqqtnDC[]VHZ.T'Oi5gy.ֶnijP"Њ); ˜ˌ!FU#^xN7Ʒ¢ iT@?2jnb*[/!u9J;@hBЎ؊r(8+[i46gdnGP ) -@=BR1T L$,I,uS|)ZzF _솀㶨q`ۗe4D  0a](b̪+9ӈLeuAnحCN= -ށg=Y1֝{/ϔ;W+B-",>.+j3 Y (WgL*1aY|6GBAdbԲ^HikgŜ誁gEDЕ)qzsS -%@ڑ{ɏ=ŜN1qK?h+CyU Q*T{hXsu_1seR b(nj1~CLroc-qHNhzלdXqQYmc(F;H@d3h%0v -Ɉ@f~;YI?ہsOjkcxMMݟ;]tvq*V+@:@ފ+v0rT7 ԕRqk̸o%sDrT -x. -#Q=ۂlwHYa* "T]Yc;˳9%t}G*-K)"SN;"kH&"ܗ/GiƜ} HRB3m ! 2U:`|/bj3J%@ҠNbTRWɄ.l@ TeVFE ]GLmY. `"9]=q8l&H1:B. zK|˄!5o2E[ aNwi)Ƃmczdm$͒奥$im Gٞ - CǍ*'iHKa+ ԭoKІ.΋ a -Q45mY>$@AP 0`p!1Q?۫֨5TP9v‡pvovl*vOTt>>G7.+>^nG.Xh(ࢋ[AS0iqAGCQS0rQEVOZt -8P_.B(7]xQEUQX:qq#@ඹm[aqpƩ8g!6c^q0%b-1A;7+m}/T:]oL)v#EE1ޘ)ފGi0CEM0CEO1p47b*8϶O~x<#;fhff'p~AS05!5P .TQEE@"(EU^88dݝ |4 -z\ן ح %`7p,ǔ[QlLEPrTY!>HC}̞C11 bb~q 3 0$ P0@A!1`pQ?־x8?#/MZbsZ18w>:RQRZi;t㧊,{/`r oWd!GRElq>F0;2 x6> 먠 -^kQa<`>O!F0W{dYkыG1}mA { ,P{F{B a(V((hg' -L<ўWs̜qouy>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000009418 00000 n -0000256547 00000 n -0000256678 00000 n -0000256876 00000 n -trailer -<> -startxref -257013 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/16a8d9c2-0b9c-4da8-a39d-5e16c403d8e2.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/16a8d9c2-0b9c-4da8-a39d-5e16c403d8e2.pdf deleted file mode 100644 index 5b6d23e..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/16a8d9c2-0b9c-4da8-a39d-5e16c403d8e2.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/182607a2-03aa-4377-9418-7902067fda4a.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/182607a2-03aa-4377-9418-7902067fda4a.pdf deleted file mode 100644 index 76fa159..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/182607a2-03aa-4377-9418-7902067fda4a.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/1c8f5b43-9c11-4d07-99d2-fd8f0021e002.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/1c8f5b43-9c11-4d07-99d2-fd8f0021e002.pdf deleted file mode 100644 index 13fc82b..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/1c8f5b43-9c11-4d07-99d2-fd8f0021e002.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/1fcd21fa-ea59-4c3d-86db-f0e2e9f3a2b3.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/1fcd21fa-ea59-4c3d-86db-f0e2e9f3a2b3.pdf deleted file mode 100644 index 7e5107b..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/1fcd21fa-ea59-4c3d-86db-f0e2e9f3a2b3.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/249c656e-e187-4517-8d3f-7fd4b1ed1eb8.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/249c656e-e187-4517-8d3f-7fd4b1ed1eb8.pdf deleted file mode 100644 index 45e27cf..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/249c656e-e187-4517-8d3f-7fd4b1ed1eb8.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/2629a8c9-06b3-460c-900c-09e091b49dbf.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/2629a8c9-06b3-460c-900c-09e091b49dbf.pdf deleted file mode 100644 index 45e27cf..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/2629a8c9-06b3-460c-900c-09e091b49dbf.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/26e7fb3e-a1e8-4c84-8800-1595752ee609.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/26e7fb3e-a1e8-4c84-8800-1595752ee609.pdf deleted file mode 100644 index f41c0c5..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/26e7fb3e-a1e8-4c84-8800-1595752ee609.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/27a723b5-cfcd-4aa5-a5a5-f2bb5341cbe5.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/27a723b5-cfcd-4aa5-a5a5-f2bb5341cbe5.pdf deleted file mode 100644 index e4ab125..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/27a723b5-cfcd-4aa5-a5a5-f2bb5341cbe5.pdf +++ /dev/null @@ -1,1784 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 264.0000 0.0000 0.0000 792.0000 0.0000 0.0000 cm /Im0 Do Q q 0.2062 0.0000 0.0000 0.2062 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -60.6654 0 0 70 323.87 3722 Tm -(S.C. ) Tj -53.233 0 0 70 446.69 3722 Tm -(LDL ) Tj -63.7544 0 0 70 600.68 3722 Tm -(DISaNI ) Tj -63.0698 0 0 70 839.1 3722 Tm -(5.RL ) Tj -47.1763 0 0 70 285.58 3660 Tm -(TRADA ) Tj -53.3607 0 0 70 479 3660 Tm -(SDvEJA, ) Tj -23.9003 0 0 70 696.1 3660 Tm -(NE ) Tj -0.05 Tc -74.4933 0 0 70 795.1 3660 Tm -(35-) Tj --0.035 Tc -51.7186 0 0 70 926.38 3660 Tm -(35 ) Tj -0 Tc -70 0 0 70 1007.84 3660 Tm -(A ) Tj --0.035 Tc -39.6494 0 0 68.7501 327.58 3601 Tm -(CONSTAHEA ) Tj -39.3196 0 0 68.7501 622.76 3601 Tm -(JUD ) Tj -40.5189 0 0 68.7501 739.57 3601 Tm -(CONSTANTA ) Tj -45.7317 0 0 66.2501 177.51 3547 Tm -(Cod ) Tj -0.0316 Tc -66.2501 0 0 66.2501 291.6 3547 Tm -(Jdenti ) Tj --0.0103 Tc -66.2501 0 0 66.2501 465.24 3547 Tm -(fi ) Tj --0.035 Tc -59.7569 0 0 66.2501 540.37 3547 Tm -(are ) Tj -0.0246 Tc -66.2501 0 0 66.2501 639.68 3547 Tm -(Fiscala: ) Tj --0.035 Tc -55.2726 0 0 66.2501 872.72 3547 Tm -(R022891860 ) Tj --0.0018 Tc -57.5 0 0 57.5 63.93 3301 Tm -(Sazosa ) Tj --0.035 Tc -45.6489 0 0 57.5 266.92 3301 Tm -(ne1oL ) Tj -0.0281 Tc -55 0 0 55 203.07 3365 Tm -(1.000 ) Tj --0.035 Tc -39.7472 0 0 55 421.81 3365 Tm -(BUC ) Tj -0.05 Tc -70.0415 0 0 55 518.66 3365 Tm -(K0,81 ) Tj --0.035 Tc -60.8055 0 0 63.75 78.63 3176 Tm -(Ecotaxa ) Tj -61.5691 0 0 63.75 286.34 3176 Tm -(Cost ) Tj -57.2361 0 0 63.75 415.65 3176 Tm -(EEE ) Tj -61.3167 0 0 67.5001 200.85 3238 Tm -(1,000 ) Tj -38.2185 0 0 67.5001 415.81 3238 Tm -(BUC ) Tj -0 Tc -67.5001 0 0 67.5001 541.86 3238 Tm -(X ) Tj --0.035 Tc -62.8312 0 0 67.5001 604.32 3238 Tm -(0,18 ) Tj --0.0261 Tc -65 0 0 65 78.52 3047 Tm -(Inghetate ) Tj -0.0033 Tc -65 0 0 65 332.79 3047 Tm -(Scrie ) Tj -0 Tc -65 0 0 65 480.81 3047 Tm -(t ) Tj --0.035 Tc -42.9224 0 0 66.2501 79.78 2985 Tm -(Re ) Tj -61.3398 0 0 66.2501 131.39 2985 Tm -(ducere ) Tj -0.0118 Tc -66.2501 0 0 66.2501 315.61 2985 Tm -(Lial ) Tj --0.035 Tc -55.2245 0 0 66.2501 438.73 2985 Tm -(Pls1s ) Tj --0.0126 Tc -66.2501 0 0 66.2501 185.68 3113 Tm -(1.000 ) Tj --0.035 Tc -39.7472 0 0 66.2501 416.81 3113 Tm -(BUC ) Tj -0 Tc -66.2501 0 0 66.2501 525.74 3113 Tm -(x ) Tj --0.035 Tc -62.2978 0 0 66.2501 576.81 3113 Tm -(15,25 ) Tj -47.8352 0 0 52.5 65.76 2932 Tm -(DI ) Tj -38.5382 0 0 52.5 124.28 2932 Tm -(SCOUNT ) Tj -0.05 Tc -69.0829 0 0 55 66.59 2802 Tm -(Late ) Tj --0.035 Tc -50.5926 0 0 55 239.49 2802 Tm -(cor ) Tj -0.05 Tc -87.3549 0 0 55 317.73 2802 Tm -(su5% ) Tj -49.1237 0 0 45 202.28 2750 Tm -(1,0C0 ) Tj -0.0235 Tc -55 0 0 55 202.07 2870 Tm -(1,000 ) Tj --0.035 Tc -39.6836 0 0 55 416.76 2870 Tm -(EUC ) Tj -48.4724 0 0 55 591.31 2870 Tm -(5. ) Tj -54.0599 0 0 55 626.42 2870 Tm -(09 ) Tj -0.05 Tc -55.5111 0 0 52.5 67.73 2685 Tm -(Kefir ) Tj --0.035 Tc -51.4005 0 0 52.5 230.2 2685 Tm -(1,5% ) Tj -0.05 Tc -102.2722 0 0 57.5 32.09 2566 Tm -(Sne ) Tj --0.035 Tc -53.3927 0 0 57.5 225.47 2566 Tm -(de ) Tj -0.05 Tc -60.0934 0 0 57.5 305.89 2566 Tm -(ras ) Tj -0.0225 Tc -57.5 0 0 57.5 412.71 2566 Tm -(Hydo ) Tj --0.035 Tc -38.1218 0 0 46.25 69.59 1352 Tm -(CARD ) Tj -61.8072 0 0 65 202.83 2619 Tm -(1,000 ) Tj -40.7279 0 0 65 414.75 2619 Tm -(EUC ) Tj --0.0042 Tc -65 0 0 65 526.68 2619 Tm -(K6, ) Tj --0.035 Tc -35.1028 0 0 65 642.59 2619 Tm -(95 ) Tj -41.6721 0 0 60 56.79 415 Tm -(Hg ) Tj -40.7279 0 0 61.25 414.75 2744 Tm -(EUC ) Tj -0 Tc -61.25 0 0 61.25 522.76 2744 Tm -(x ) Tj --0.0114 Tc -61.25 0 0 61.25 574.13 2744 Tm -(5,99 ) Tj --0.0127 Tc -58.75 0 0 58.75 201.94 2505 Tm -(1.000 ) Tj --0.035 Tc -37.7089 0 0 58.75 414.82 2505 Tm -(BUC ) Tj -0 Tc -58.75 0 0 58.75 524.77 2505 Tm -(x ) Tj -0.0068 Tc -58.75 0 0 58.75 574.16 2505 Tm -(5.39 ) Tj --0.0155 Tc -60 0 0 60 198.9 2386 Tm -(1.000 ) Tj -0.05 Tc -63.5458 0 0 57.5 62.53 2322 Tm -(Iaart ) Tj -58.6745 0 0 57.5 223.9 2322 Tm -(natur ) Tj --0.035 Tc -43.1545 0 0 57.5 390.49 2322 Tm -(10% ) Tj -0.05 Tc -53.8133 0 0 47.5 198.11 2265 Tm -(1,000 ) Tj --0.035 Tc -67.6003 0 0 68.7501 61.67 2197 Tm -(Pasta ) Tj -53.3927 0 0 68.7501 225.47 2197 Tm -(de ) Tj -0.05 Tc -71.1591 0 0 68.7501 324.3 2197 Tm -(dirti ) Tj --0.035 Tc -63.0926 0 0 68.7501 467.82 2197 Tm -(Special ) Tj -37.7089 0 0 57.5 415.82 2380 Tm -(BUC ) Tj -0 Tc -57.5 0 0 57.5 526.78 2380 Tm -(x ) Tj -0.0015 Tc -57.5 0 0 57.5 576.74 2380 Tm -(4,99 ) Tj --0.035 Tc -43.4649 0 0 57.5 66.19 1829 Tm -(SU3TCTAL ) Tj -0.0074 Tc -61.25 0 0 61.25 62.7 2077 Tm -(Pasta ) Tj --0.035 Tc -53.3927 0 0 61.25 227.47 2077 Tm -(de ) Tj -0.0384 Tc -61.25 0 0 61.25 321.39 2077 Tm -(dinti ) Tj --0.0242 Tc -61.25 0 0 61.25 467.86 2077 Tm -(Special ) Tj -0.05 Tc -54.6541 0 0 47.5 201.08 2013 Tm -(1,000 ) Tj --0.035 Tc -37.0729 0 0 47.5 416.78 2013 Tm -(EUC ) Tj -0 Tc -47.5 0 0 47.5 526.82 2013 Tm -(x ) Tj -0.05 Tc -51.2908 0 0 47.5 577.2 2013 Tm -(16,93 ) Tj --0.0071 Tc -60 0 0 60 198.9 2133 Tm -(1,000 ) Tj --0.035 Tc -37.1993 0 0 60 414.82 2133 Tm -(BUC ) Tj -0 Tc -60 0 0 60 525.87 2133 Tm -(X ) Tj --0.0227 Tc -60 0 0 60 575.72 2133 Tm -(4,99 ) Tj --0.0237 Tc -57.5 0 0 57.5 63.72 1951 Tm -(Premum ) Tj -0.05 Tc -58.2073 0 0 57.5 287.72 1951 Tm -(Fusli ) Tj -0.043 Tc -57.5 0 0 57.5 457.16 1951 Tm -(sort. ) Tj --0.035 Tc -38.1172 0 0 57.5 414.77 2256 Tm -(EUC ) Tj -0 Tc -57.5 0 0 57.5 523.78 2256 Tm -(x ) Tj --0.0159 Tc -57.5 0 0 57.5 577.74 2256 Tm -(4,99 ) Tj --0.035 Tc -40.0957 0 0 55 67.64 1588 Tm -(TOTAL ) Tj -40.4194 0 0 55 228.64 1588 Tm -(TVE ) Tj -39.6433 0 0 63.75 76.64 1524 Tm -(TVA ) Tj -0.05 Tc -95.3326 0 0 63.75 142.78 1524 Tm -(A1,0C ) Tj --0.035 Tc -53.7969 0 0 57.5 69.67 239 Tm -(EJTRZ: ) Tj -48.7514 0 0 57.5 262.48 239 Tm -(00634 ) Tj -43.2666 0 0 52.5 493.54 1168 Tm -(Cu ) Tj -47.7434 0 0 52.5 582.72 1168 Tm -(Lic!1 ) Tj -0.05 Tc -53.3217 0 0 52.5 705.74 1168 Tm -(Pius ) Tj -55.2515 0 0 50 357.41 1111 Tm -(ati ) Tj -0.0233 Tc -50 0 0 50 451.45 1111 Tm -(economi ) Tj --0.035 Tc -19.0065 0 0 50 639.73 1111 Tm -(s, ) Tj -0 Tc -50 0 0 50 663.57 1111 Tm -(i ) Tj -50 0 0 50 686.86 1111 Tm -(t ) Tj -0.05 Tc -53.5963 0 0 50 731.24 1111 Tm -(5,78 ) Tj -53.6168 0 0 50 869.53 1111 Tm -(lei ) Tj --0.035 Tc -43.6182 0 0 48.75 498.89 943 Tm -(Va ) Tj -42.5805 0 0 48.75 576.9 943 Tm -(mul ) Tj -0.05 Tc -49.4335 0 0 48.75 655.86 943 Tm -(tumin ) Tj -73.4971 0 0 60 401.15 876 Tm -(fanty ) Tj -0.008 Tc -60 0 0 60 577.35 876 Tm -(Cunparaturile ) Tj -0.015 Tc -63.75 0 0 63.75 483.32 820 Tm -(agute ) Tj -0.05 Tc -64.0193 0 0 63.75 660.75 820 Tm -(1a ) Tj --0.035 Tc -53.6502 0 0 63.75 743.68 820 Tm -(Lid ) Tj -56.5425 0 0 65 414.02 415 Tm -(1Cas/POs ) Tj -0.05 Tc -49.8028 0 0 47.5 55.47 360 Tm -(0175 ) Tj -0.0427 Tc -47.5 0 0 47.5 247.39 360 Tm -(678864/355 ) Tj -0.05 Tc -56.6297 0 0 47.5 522.98 360 Tm -(/05 ) Tj --0.035 Tc -54.6271 0 0 60 451.72 124 Tm -(DATA:04,01/202 ) Tj -55.2996 0 0 57.5 1114.67 3394 Tm -(Lel ) Tj -0.05 Tc -51.982 0 0 33.75 640.18 79 Tm -(100072692 ) Tj -83.7239 0 0 56.25 413.59 21 Tm -(B0 ) Tj -96.6745 0 0 56.25 520.39 21 Tm -(NFIS ) Tj -0 Tc -56.25 0 0 56.25 765.4 21 Tm -(C ) Tj -56.25 0 0 56.25 825.87 21 Tm -(A ) Tj -56.25 0 0 56.25 869.67 21 Tm -(L ) Tj --0.035 Tc -58.4541 0 0 78.7501 1090.29 3267 Tm -(3,81 ) Tj -0 Tc -78.7501 0 0 78.7501 1228.82 3267 Tm -(A ) Tj --0.035 Tc -60.9416 0 0 66.2501 1090.26 3144 Tm -(3,18 ) Tj -0 Tc -66.2501 0 0 66.2501 1226.85 3144 Tm -(A ) Tj --0.035 Tc -58.864 0 0 75 1062.94 3025 Tm -(13,25 ) Tj -0 Tc -75 0 0 75 1227.83 3025 Tm -(A ) Tj --0.035 Tc -59.0028 0 0 83.7501 1090.29 2892 Tm -(3.76-A ) Tj -59.076 0 0 68.7501 1090.29 2778 Tm -(3.09 ) Tj -0 Tc -68.7501 0 0 68.7501 1224.66 2778 Tm -(B ) Tj --0.035 Tc -57.2104 0 0 72.5001 1089.31 2648 Tm -(3,99 ) Tj -0 Tc -72.5001 0 0 72.5001 1219.64 2648 Tm -(B ) Tj --0.015 Tc -58.75 0 0 58.75 1087.29 2532 Tm -(3,95 ) Tj --0.035 Tc -59.076 0 0 68.7501 1089.29 2407 Tm -(3,39 ) Tj -0 Tc -68.7501 0 0 68.7501 1221.66 2407 Tm -(B ) Tj --0.035 Tc -58.2929 0 0 66.2501 1087.73 2283 Tm -(4,99 ) Tj -0 Tc -66.2501 0 0 66.2501 1219.68 2283 Tm -(B ) Tj -48.75 0 0 48.75 1088.78 2172 Tm -(4 ) Tj -0.05 Tc -58.5311 0 0 48.75 1123.31 2172 Tm -(99 ) Tj -0 Tc -48.75 0 0 48.75 1222.89 2172 Tm -(A ) Tj --0.035 Tc -58.9065 0 0 61.25 1086.73 2039 Tm -(4.99 ) Tj -0 Tc -61.25 0 0 61.25 1220.86 2039 Tm -(A ) Tj --0.035 Tc -60.3356 0 0 67.5001 1055.88 1916 Tm -(13.99 ) Tj -0 Tc -67.5001 0 0 67.5001 1219.85 1916 Tm -(A ) Tj --0.035 Tc -58.502 0 0 63.75 1052.25 1801 Tm -(65.86 ) Tj -0.0231 Tc -72.5001 0 0 72.5001 931.56 1688 Tm -(ES5, ) Tj --0.035 Tc -70.9755 0 0 72.5001 1118.72 1688 Tm -(86 ) Tj -0.0389 Tc -53.75 0 0 53.75 1081.37 1564 Tm -(9,84 ) Tj -0.0264 Tc -53.75 0 0 53.75 1081.41 1504 Tm -(7,71 ) Tj -0.0169 Tc -55 0 0 55 1081.65 1444 Tm -(2.13 ) Tj -0.0297 Tc -48.75 0 0 48.75 1050.38 1330 Tm -(65 ) Tj -0.05 Tc -67.0018 0 0 48.75 1112.79 1330 Tm -(86 ) Tj --0.035 Tc -50.7313 0 0 66.2501 59.63 179 Tm -(ID ) Tj -49.7117 0 0 66.2501 139.92 179 Tm -(UNIC: ) Tj -56.1859 0 0 66.2501 309.03 179 Tm -(10000726922026010413500225830334 ) Tj -0.05 Tc -54.8245 0 0 50 68.73 134 Tm -(BF. ) Tj -0.0039 Tc -50 0 0 50 170.46 134 Tm -(C0634 ) Tj --0.035 Tc -65.8604 0 0 67.5001 1014.29 517 Tm -(Casier: ) Tj -58.1835 0 0 67.5001 1196.3 517 Tm -(35 ) Tj -39.3849 0 0 60 912.59 126 Tm -(ORA: ) Tj --0.0278 Tc -60 0 0 60 1020.9 126 Tm -(18-50-02 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw"3  %ʶɲPuiFlR$T"Z`@NcYN\Ƴ.yt*ԫӷgA{&9q lMHj%N_;.|x;+l.U2Uƕ^7>^Z>V̴6:Sd\]ӜfkeyGBfyw~nN[ky6"=M#0)tms -7,j;.ˑ%@hIiRHTs`LkDk6.{'dNgcjg@P'yqEq2PS!JsZq=Rp˛:Dvslu; LC3b3mք͢#Y4t#l+.(SC̪Uyle uӛ"D q@;fssuysqˏV<:muL$!M!/׽ Pc!%B1i -h5#\W DtSblFekxk1܉*nD5ZVw"!7e4J?lǛ^R'~:QG,uZu(MI446d\x9sLk}9iܘhIeqwtk5S)4=r%!~a4l -#\R#AT.Dh L`EXsA"bZ& -+dΙF1F6E5VvKb07h 'ώW = 5/^}BhZƣrƃuI!8u%P%LE$9lXkҍUI4iFzĸrs^~/~(?Yku @ @0%ך욊!le884:mQL/= -BGAϪ2U3:tԚ93F!ˤ -UJ]23L\289ȖGז㣧k~ح#:LLCL?L{^l)Q` idYRTC5EMİ(LHT܇1yEA5=OÏ\ >I3g霻 TןGz|(>|AL}LNn[&r MH2$',즔p`4C$ aP(Ӽvpۏz7~*/ 8k/_{e#ؗ>s59pl8=+E9[yޏeVz|w }<\"^-L\ؒ4T cI!XcF'&=psz7ƺ3מuTғ=0h*Z4v\!jB`R j -jB!$VsĐN"XPSX)I@sk1Bc1ϱ;UiP^3M1~OS p#/^c:^ttҐj-yue920i"ج΁I(Hh,)dAiTFktLqݞ5ݏ-acǧug˧,tgy*KL|iP4M&K$mPU U46%*&0*ʰ#N?B֏;ُ3{{I}e[o쉦&dh`Z硧vƐg:^,4p%>#h3rB^C-uuaO5vzøT ETǣ#?9yMŎSžjAY9ʩe倨'=1[Lwc/fzrߝïo?K_UhT]H$r8p -=VTأ\o3ʺ=_+>{>3N=O宬k7}P;H= qZ[,|9pWӼfz&c˅ptx=*=ݝ?/G7wzxtbaZ5vilwvUҝNŠTه_WtwsEgF\dUjIt`ïy1xyLq'Dߜ) Ŋ) Lb" Two1*Zg'r}7&1ޠ^GPpv-K +HY}FaG?!+Nuy9{|ZcEqz|<\TԶ^zD! iFYmF7| -r8CAiPEC!(LM.#HiIk|*, -͖MhJ8yawϩf[ -!gei - |zr?`c`4Nإ*DԊ&,TSBK*-*15,ґ R"HhTdSH쬍 #^Sd$&qSH1@,L@0LdFSN?cawyNOnz?Gr/|z><6i7[`) )|&k9`wZ8\LX'' #>ȲMOXy~nQ :.嫚Be TAP鹢ء2 6Lk6.ER&r,eq -͂j,HLkVw ,T+Nw$U7oΫ(495;:OC.CO/Ӯxaz?8u~Թ[_2=QRPAR 40)\M8h42DT#%Y)A)K`^Za@DM`ĚPCpꚸ@ !R ym'>'b!h3l6Kɭ4|=N;2EO'dke9gf9ˢw}bet8w9Hy=/>ܺ+n:J7|o8~^s̲Fg8}2(B1rrĚ He8"NS( b$͌BŒ& M"!5T\KB&K3FfE¢$62`Rq/YĬ2.m@K+ltph.bhN)C5"M4\8 ͬghԠܳJΊAY4ZI6eB,:4 ΁M8*~/%_[9ݜ`iV43S5~OGo6ϨO+z{r99/{j9k^AW>ͤ྅uBu33]8zȗ6mէR9Լu*AE3Ym`ux>;93^iW/E+:^i\&-T+L IV%F:HKAI#%sRx{,2GnfXNOW= ެk^-/ j5j -4\7#$PF%P-"ڊMM$!dͅP 4!u,Srf7B 2 AJ9f=y9p8/N/qpwYޡQ&krVl. G<:rru^wwsyZZu.`kzrGgoczЮ~!:#ETGy2WzIZzx~׍IdLҢ恄1gT2ĢNYnTR MM ˊI9U ʅ@ @&KAܰ$Ё#; -J-lbr`ifZ-LSdXɍ$RBv-E 3553*QƉdM"i -b )A2js缜ڈ=ybtdpCP.Hy\C SC4ɹaȮhCPuE&FRqB %ˊ@&40PlUKwzM#F8tj:i蒳2mś$A)PLCh'YX-HK(R)D1 \Ԓ4Q,AqDE1 0ZT*LeMIҳ)"jh=3€&Q`9 -p!PH I@K4K)11%͑i\dgx~}ιYZ@RfeRHl:bAA*$S*4=BD9 @hse&Ւe -H3ni" 4R*$`Q#Ҧp؆d#BDsBFvV@L9 291 ىA@4К,ba:B(LU eȦ"Pl"a7%Y-FE1 SLPEԱ .@@dP[(Jh4T b@)c @!Pl1 2 X(\Ǿ[V%QHTH\H c&jA7 #5 J @[M5AScsE!j X rR(*hIjH - L&J `9%AD l@I4d܌)ϟNT4!4I" -D0+c)uPtPTʚ.lf*@sZSn\4 -  a7X T $nh%v9`!%W$T - ` MTjJsDƙZeH)ZIG" l2M2e 9%-Q5( AŔ& Tz{㸕yvgiѝǢ@(Ʈh%1011P&,JU2Y@ 4:AI m6R)J [@*" 4Ij%Q4PJ4qe4E,TMXr*$.TPb+= - -CZA|{/o{~֙9Qy1ȡŬXX )T d*.EXFq?OW < -Jyk\FXnctc0G1WncU0&\bfmPFpt)M -d3E@& Ң唀L w%H*AFZXhh\H2( 4~WTG}W~\%Cr\Yu61(Ad\*U64"b/>N{= tn4& - z*x -qPR!G^Ch&+"߇hGsuivH@);) #Xܬ"B`i0@ 4MV14@i1향 N756qti ,(h@Nn*h2llvGہwӦGWyQcg&oj=n!iH  |GQcM4ZHNK貑ghc@ ThisETXbnl)ӁIR 33rW6NzB @ :A4ɠ4ٗ:ٰM:9N{"vA=L|9opbu5g^9zEI' -.a" .FPc%, F|⋊F(LT$H^t -t΍ @QEMM* -X0b! R=8{9{<D4> Z5zIUM*A`ĀSh%PPK8FydSu 5ВMM $$i9i0KLjdR8H JrH/\u)3!W@ 3 h3$cjAAIِc&^xoYyS~VkzFTxi.,zp K%4h.iC a>܏蠢0OC1I5E8{t65 3qzXeV]8J) 8Цc:ȳ:֥k&.Lw,ba76HƄ49a#@%Pi" eUMA-A% hXԟ7ՓixǞzt#.~H\hi2Fh<>}s.-מs&nMA]AZ ^3 %~=m8z|h30m1Bi##H!\ТІ/:8HLHC@R$NH)7DPҊMPT4(T+vqJH/Bj4 #It`9;e*& ^a&垔su3 衔@|{ɴBVC 1t_EA7GǻG!@QbiɢLw cϸ5CcR%.YSh@ -**!I0"\ -- NNF)&&|h.%8pUg@ (AP7|=eԅ&(*-jdЄ\fU鎦/\MATԃX2UJŒے5R+%0bh6F/IegrKm1&ɚjhc@HE W$`T -sBp1Pɍ3 Xg7#84;vY|\7^|V]Αww,6:v=`sGL\C6yfvc(ãxzg/>a;,z9Nsirp %H&&L D!6 \sy@lͰW,9ЄLsBBh@\6!ЁčUPL\i$S@Q1'Ź{]pntK6֎nC'?nq"=lы]g~4yS9GW"ۃҏ/&,;v\d49c^ǥ@)4HIBbYTfSNRijBSu4ްб2m @¦4H*L1XKj|esubj)" -`Rh玖Nd@eMԀedC(cE` mMrǞ:a3@Bq.3 FX]ٟ?k8:DAR0VwTZ[䔀TKH0c`R⒢uWZCEJ%&R34)rĪEJgo%L>^ƭn7cIj3IqM͌rT%0CAH9$A≮U,͟/@?=z:yZg`0@)16ClN^'=2H ؖi/}0LT e R4 -UT/:,J,LLhJ\9L뛬;Ύ[wu\hyѝG2\;4CPRd -2!cgx54_y۞rz>WuT٠GٷO a9yNffyU\SXQumeŊnL0Ӡ:ǫHC&A TڠiT2sE47<!h 4EFs7}͕ 9RHPefRhm8f H3\/ߡ,uYèŜ}VU*$LVEPpvy4ftg61g7^Zwmw'//r8 Hh42m0\STŞ DQH5 b\urDMa,sB@9mhfI׾^BK)FQ1&\t$S@f,2G6dP^4jE )7"SYZ;PDRʩ[A( -H`cE"6R$H 0B≃[UE NX4" 5 UMXC4σ| Mp kXShϛl/'|.tYgYDZagWg/V<+8z.31 &jjbJh#즀rIi TDj]nb(M$[, -傠M TH!ZS_=x;<Q@,TTQqA3H&n Zj4F~waŬ~=o=sy>?Hc'nfecݦƱl.nO#?Qz裯X Vw$ -UsgJlI=sIZdPI$"hBUFWȇ% iRQveukiZ8N'cxl9hL T -M -jX:.-A4Ts߳AKDMB*ESpgD -GpT4'4^3Q@3 4yhu nBC74DiM!fCNw `,$9MF%40dѤ4E7v\R3U"15-*GeyS/c/qk/s뀾LN} **f LOZJMHBD)` -N &HC^aWkzd$tk @+c ~~gi H-1p@ RSCT4eEMVD+D“ QR䫊.H 1 -u6(0` >=E,CQpyHMR hm1B%TZJr 4',&.$ P0JwUH6!k. AehEBsd@*Lh#@=N~͍/6#V|~IOvDwql_1:oeV0h4:K|N|Os*|^oٜoQZUif]\'>zٞ!KXL)0M ,a@)0@U*&nBБ5$LS;F)W@.4 0hPE sD0`&⬛+4yR!X"*390h4SQRhHRe*@Ӓܱb6VJn=h9fr+ixj&fK&*IMPԀ!bTQb i=J*䙩Dѡ!jDi5Ci$]c$53ni! ͍Ci":br:#^3wtLKYiLAI5CNJqE@5"tǬ<m%Iw@⦜R$B& +(biY)qCJHJR -> A@(I%^t1" ޱ[ʕ#:(\4RJzfyi{g\(ÈN}(K{ :9p;PA@JJ"4ӚC"/l44 O!Nt'=&RC)&&2%p12X%6 -A"pW$!6!Jr. -Pr)،g%F =G1Wu%SA4@#li"$"JK>)y+S -ThD펅FrܲUNX&\Nw`M"m&Vz3 i -TCmQJWqzR'>7>^:/CLqp U!w `-jr 𽸹RW>pvgWIh=#0ϯLj*B2м5wNs:=nN!k/7^{:?nzgo.^#BMeIU r CqEC%5(t Ċf@ӒC DfYP M%FͱMTJ愘eJRʑq14B<o4L{7~>{OAχ]!RYfyLβ)zpeϦsr˖ѥcVFGgɽM~ˮFѷIru H -K0p=r2JRL͖VAYA΍ARVlrIM,BhCD6RhrDP4#2&=@dlm+,Nf0TPCB=3cQRQW Hm##GqR3٫9 Eq 哮v]r4˖RP"""B)a5,LဂȳU($RXcB,bF AZH:@\6T#O@J+27}bIE;fQwqj\N5 DIiy#O?ОseWmrkH$O锆aih+3=k짬PFjG=SYo{d+gFE* 0c$w !bb5RYh/-$QTL&`bDZU  J#@ 2IdI0F7Z9pCu͵s;`ڣgfB -I\ԕ#U!j73p]1gg#[f7Mf-2n rİ4rE&c'YHCB +;k&r1RcML4X*4h -.`)0LDsY͹yD>q4^zփVk*MB'Py:',GqnhB5ȩr+1M@R0\=3i4 ( ˅4ǯ+D4 @*RlCC& rL) KI"kmR,0(Hb"j@(Mb= )DEȣHGf8|q=\tTTD88,Wq@` @占@z3tXDB@JBa Hbब.l"$ІE,TɵE=3% -l%Br4 aU",:;s|B\}?53V 9:kO3Ԍjy뫟˨\o<[ $9M -njZ\ L1 -RANH:YiPe&@ WBihSRM );t"Z[O3˩UHڊ8*\w11iHKTHMUT20Ϋ(rܓQcjM2&e j(@26 -EE(a56E&XMg`P\Y1崘p1l cC&)6DdE0g߁u#3ז;6԰dcFqqT\#$-r6l*qQ)\ 5j(6Ϲgy@jל=}#bׯ4ڌg\)]}{7w=WB w<_C؈c\h<<ޝj9/,o byԅ * nhi*ځ"\&$IL5Fq [&4*)TШuRM*hk=q%ʡː` 6IRuۘF+2嗫/'3<|c>oM珗+:6룗j cngjaw5b3_D<޽SAͽ(j4)?k?IIWw>m+ EM$;uLS 2y$&QPhIUSE2 r=3#- F5+doq\q_{D|wͅC3ϯ[;jte`:9::/2"Jh1FB9r1vqәۋgycgTF%hyq\y\>1D4przI]7g:Eaxo˜r9B8L)iĈ[cS61 -id))U7N@TW. 3$VDi -D%hBdVvDMɎ>’+=y7}'E!\Su}<}6u%Fy!݅soQ1s.3,Sre %L*!R( n,ۣH3zآ8;Qg \=f{`z*䠢PҨTԎ@yܙRs$"!BCrsTJ74)[eEf5Ap1zei UXBHGGr߯ci^u5xt>mwEfDHTR*caxUƁlE,)2&-TTgNZMJJ".)2Kia*@ EE7#B`*a9^d.Lt+bP* \[qaR 5hUpkI3y5x^ZTk"8UTO?O9z穡4~u8n[Q3z^NїtGFuYǮa18Gn?=X3 of4ZoӋjN6::3[lIyŷzݙpFyU=UFR4W:A5 9 e*ȸcD]KTj+2+:LNEC S@jBi!˒+UŶ:ɼVXI$TK n(qs[9YkGrFi7=:/Xsݙ3r*ng^?_ߎqm^q\v;֑@&tN\Q󧹯M_%Qќbw22ArCR鉊lT-eET2,$-JpԂaT 6'*T 1'& F< U'=tB,14! ;MR$*\ESr#N}Ύ>(Ϸ=ʫ5XkH}O/gpxחGGO.d{u^~y5GF>>8U'yi.B[= -8=,|W5|OǮڦ  `gI4 -KB#QdҥA3Vw!n*%Vci1̬Cs@"f拖R`ANlbdV4c9Vu:$} Ԓ0i}<5/a|<cGpG=>OK/HRr]S!2=8PNlsy<7n@}=~=zk羂87I&<_{t=/SB+-9$׎K̼>w~iOsv|T@$tsR phXh'HEHb)Y $Qyqe"PTǽQGvL|l\أYJ&J.%RUdԅ'U9G?WhCu3d`G߶y~?wkq3EVT1T|y7vGdyg^WviQt*Qx4EfꁐPKL1 LHeaiq.iMŒ(܂4sCT ͎234N$:GU4TaDg$W,be樕R@u) -7ITCj+5) (y$t`&5Py>: kтشh+TȲ"wgCj7 %VtEB$VH!0-b̳*HTX4ΆڅVu6SDAH*<=y9Mʹ#+\5Q{+,N8;΋nAea=*mS _74H '>q#WWLyi|Tj&FE:f!50*#^E1ʑJ'SRʼT4&ĀT%2,VD&Llnʂ#-i,Y@18 ;3}f^g➯؜އWg^'W cl4y>υ/9tN`z=MzП=5}u|uyOw;̩29s=slSyL8sאshS:qxdiٮ#<k(:&@y\zsAA'IgnG0.Ib&0c%xh3IM= 2¥{C⨝AyP "JBd&Nh4΋ -UEzM\PM/BQwx#Tx==1ݬ6xXehI! n%\XHNҨiZ[ftu~袉*=>+~ߝ='CRX@"XkAwr׵^9UBM׍g/O뉪<W8?_}2և@LqQP7SIËuH& S -Ay!4X -H"јѥbA,- h cDšFZ:A!BDP5U.+*isXӪQKC$nX>sԣ.J;9pFvUK؏/.Dxz3d/Bپ/zrrh)P1i CAL1 M% T"[ B%3H$ lB*aK5:R{uTU8h1 Ƃ0%Ih:"TgJtkͩpo=sʊNJI-I6Рt0 M qyC@#L DL3HhQhCD"&!QYj`:zcG17g2򸻇Wv7S9?=\}xn c=3Vro]xG6:s>~>~sNE[ f<5ftGZs4AQLe&}d8"Z\@54 % y C! @ܓiJH&.BjG2r E Ş=sk3g?G:9+\ޏqf}yɠe_97~U}⣟vxq>WSiY6C4"URS5YܔAʡ\2 c0 !&ZlV(pU2Vf2ZateS@0 XtTS -M3H@]O7NFhV -14DZh:HFc򢼝}xX2X!(n~}֧g5o-o]Dz0r{,w8*-c.$t2h.(I j` Q"Q2(@4U(tu*hJtHPv .H`7y}lT 8QN)TJDc4Tƀc@@*/4D@%twT0TH$&3 ]|"yDh2f*KP0eqR F-U',ZjLt`0ti,i& Sp1z~18{E'z=or^N]|}|1cnyk=I#y{ˑI枧4suWy!Ajp7=e8Ey>#,:3#4:̣=I)G>4qE2eZh:=**GR ->M =`1Ԣ]w lBha1aL -V cG"^NKsgï<OMҎ3肼?w=o {4.[zV^/GyqQ|>X??xі=7hR,VE茯- k'.JbҒƎhu49Ϊm4hsNVy퐈#H6V+L-`2(y8aPσ"O#Zdk6f48$ѪMHVgEi(%rhf4Őbr)-M-+M:JA_//OyRz7{_+Ӛя_<ޢO0ʹqMf0 -.Z&\F H^:biXE+!쌕ȦP2\&&B]+=S5Ji44U㺪ZMgMӈFfm#JPFv^u5)"@?qLWw{E!vȍGsgxIF+6rXL(oZ( 7Ӗ9zNӑ:Ś -Y*C"+S97Ӟ}Ϯ{ |LD\\Qj(Nj6Q9IdBd5cx\tὋ>zIwQ^a?AvaY(46hT3TE"ZW4!&2-F.ˬJBᰋGsYiARD:t\}wMvEg*$~nc2?TTFη>h3˧#m&܌^cR'}21ϗD^ǟ7嗤ѧv銗ԾJ/gZ!4DR!в7SqHMU j|$5qƺ碂FZIN'g>*gzRylyb^>ީr K]]ufҰFNy;#554nh $Q;TVC4D- \=sӇpg8飋y}zm|kOzO䞳~Οt_#?AM-*-gf:8~lhC~#ߍ* NZgfcI;6QQuQQ69Z8wQl㭨Wnޥ'Otiޣ>sWO9uv|W$?u]wo?}Dhy9s9顗kY2,J &3DT2U 9&ay4ФE 2F)icPhIS%[% 0d\ --2 -.DѕE@;c@TتB\CؕT1\h]E{{X5B=/?]}ϡ|.>,M`ʖ ʪ`jhDLch -('P! 2iM l̩P;%4Q!Syh-2jFE"*΄LI,$4!n59A2j,v"D8@b '%T$C45@pR* S@APR -7 L4S$T h@,483d6ؕɞ\9fĪ.IƉNJ -&\JIj(6TRiRU&wc*pjP.,,4&A6F@bf8 M dr740  R!LԊj8hIĘ"lH9j-a7 @H -v nJ$uMC&CVBaSP)rd( e;7C;J!V`Htu jD =IP\Y%fjMrYf0^d**@d$pwwU#3玸`!y.=7YIUqx^ث~L -a K -j#4R*(QA4<.+!#.LA[Dch6 3ؒXhIQB*@VNn0eM"="s*Μ - N,A#`DеTZ؄sEH4#3[ psA{^1~z(Z{WgLRhHiz9My~+<_""5I@f -qg"h@@#CF649JVؗP-^QN(S, dZf -@r72S -@T|}!BSyAEMӌJ)gyΤi.pʜ*h6GG6Ӹ0\#ZW0.X$CY`Pvk5}XQ%yH˸ãؾ$C`(Ax b2F{ +: -\ɹ`\ͱL1)ADi6 K(dBsRk#csd+̢BrvuT11eЉb/Ll`љ*t J% <[͏S=&}:z#_ЯЯd)MrW{l!fS,<OJ3O,sۈ~ט>J>@ @6HDE m1I;y U4Qh@EW\&k3I7TT$-  -A9+Dpv=Fq?t6:І&":'=!yR-U 0vqsXK<M)Do-hd<'<.>cwyNy^3>MoQ#:(@l&D;͖M1 R@d*VVv~u@P 颳4(„:el: -JcBksa Pr.(ykgA;3,JlE4ɤ -E j4 :G>ö5?:ov:;PJ; ^#/}lSgg,z..6i,\HT%h@[QЌF`EE8BT`4%RT":fwQ,@4VA&iP&)R +L鉡!ZK~A>Fk^'X-y=GhH'` j;jn$U*˛G״N8-yޝoOYguTjE`2X& ',` gd*̵ 1RT@ @ʨ -ydX :ΐCItsh&ўv'&fJ H&,D!*FOW;WwU??FW?>oz> q{6lѠ*$@ -u,2"є\zfT`SX+2$jQJY VH2Ѣ5,HBS! -0IYU:SBFMs@DgE.\j812 7Ɛ[dХQ:8δ9=SJ8~o2/1wgOjG:%4gH*X JjlL5+z9MLG'gu:u ǝۢJ;l@taI.8t^^R!h-Pi5!5%V(@P44U6pBR&:+6E'FqfsYMMԆd9J:ZCs@r6ӂٜU;2c"i6DzC448 I3")F\'XMX,h,4Ĺ]ʐ9{0CD@R&ARD ܑh(LTvDi  eB2N[f91QhX2U:T:ɈvBL)Q4&ɠ \QU4JhsPzB5 '= NIpvu#4%8"*-,T0U IR,LXnPӒ+3H`01͕468E砧L5L::(d̩ CF%:[@e bi;9&C97-AP"XTsvrWoWWߩQHM0zKAhh&&c) -n,X9@ h@E@٥H\Щ,J-M*K3'!Cf޲ԩ)0$*e@ˋr&]EQhj7AVZZ&h)Gze|G>^sٳ,\jت/7%iMiy|땚u, F@hg+hu!NATQ7 eLE"\ -l| -Tn3&N(A@HFw,` HTNBf<%4H4RhJInv,T&Af\&:f4*P484 :mcBbt[HH&DjqH:dƬ 颹; fc7?8{L2Jqu\e}8AY8fMYgc1]ysG؝mV];& ڼ͎#'5|pwߛI9;rX)16m$͔4 apdJ$9i`Vet>m<ZeIUhMrIeZ:%yU#`VzH!%d$R31*BRr!cKbY(34$ʊZA:I'D a, NlL,Z@2v#.A賋}(/{{o:LD ɁYcV2ՆlkՕlEUguT6c:A Q:gb*B11¢ 8 4" -7w=DQ>Ն}/Gxz;ǟ?9UW쏘=\=>^ OO+֡8hQAYi$L\h)*ZfM( *3b*. X'=+ *\R`hQ8iï~~~u)6ÇM3+xqU-˭+6^: (EyK) 4& -"xrAy{:Mxߐzx=g7z'^uAzޝTsی*[>,bQ$Hu(B1MADu LFmP⠰AqFi"H{BlֺW:g'feo4iyQ@ I b\tqB) Q, cd(*FHP`&F Ɔe"VF%BPXEe & - ::ԙ -T8 -%84BHay%0JBi3pu&upt{:/1;h*,:20 PJAtM1vk:SBi"=-|R:ۊuRs -#`2HCDtS5rn,2nA;#ΨjЖ=pc-jp~^s"C*Zf3Ҵh3 !ȸWDxEV|xީw!]<7\=\_W=9vtӘ}^IOyc}az~7gi{<5_E1|yׅ>gH{y^)ԄǓrv. QDЊLXg1CcxcʖyE)pTAYheA9GC`L%0s4ΪRj7:s&ec=㞹8LӮQ{aTeToxiVEiq(;p蓗:JYdiGreK1^vQ(쓇W^_:'ܗgMsvw:ΝttEhM?s#+=;+isc(o;) k1uUB@$2nyuSDMEH4(9Ӓ+~/}\r6+ĩ ͳ+Lր4P,q($"VHԐH*;鸢ʇ#sdMfSBe D-h%RSn -e| L٣ARe ,΋hΆW&cܱWgX 9In. IWrWG,k>}D+# fD: `L;,Srf+=MkF嬜]deԈ}9-h91kAţ-*yt}EpT_Fu\wfkZ Nq3~C^3# gMg{cN|Ϗg9.YNBEVl ܀ GwT Fʧ41l57KHf*z19fJjj)t+2mwkY!R z}tzW:S$QRQyV4":+LqrKLPi:AnllT=4%Z}Iæ̍6좼F`~W EKR#1zl4PdmUtA՝deK-s|RG5H&)Te:kLдHr{EPK)aW@"Pgs:h؊r.hRfE;!]*H#TdPV{)-$pz6MqQtT^X2ٙsuJ;YkFK%Xج:hwG$uX3-L"${ =9N΍@Ykwi77^%stsc.shdyTpQf#o+>DvK2c<瞼!~oi̎+RulB k;1-0hXo%T;$ZRTrBkyLHa4,!-ӷ/]]"#^Ra-Z\\ l6C-HfmY%>!S*wa H -WQ@M&XE&%aU$M*dhUL0[G`7yz"D9;pǠ`:oٕaўyv󝧙azDbtVv0C̐γy;&˖Ԁ1laG?LTrs*%XVj*(3dt1hAtL-19f󥎹D 0i5H -T02UHȢP: @!TIP0ZE$ LL`8̈́a*>#q@8o 1b@.m p#7JP$“ AD*E撠NѴ Q6  %y|{ǝ]?3Oagtkz/r}od&3ۿaKCh"o3JBTVzHif,T P@Ӑ *M/ Lq58s^Wo T!@.*.\ j*1ӑ!i1a-F@ CUSR',IBwz?:z7W((g ҽl=+mhax{|z7Qa/'7|v=UhT2b$0-9됩YB i %JTCH*b 9v›Dc>5ךIQcnW"N h0ǯ4"YBc`CprXECpB$)9ֆ:NXqsN,֎wӱyoL3t9aueT-h]Y%FK`nE6`Dٶi&R CTph"tH߇}LT0RԸbdMR-dјɛt%DL$RFA%*,pHDt9FBY=tdsÂf -Ѵ\T : t-5ϓ(")qSflbTgL$ qZH5A4U 04MSD6R -P6X֣9vVzeNVtBAS QҤ0!5d:5FFD]F]FS2m<>gg͔__7fY:/sǦO#9}?+#Nnx=􌼿Kcx?G\1gUp~7y_O&e'Gu-=h;1zkdJ3.^flΡP5 ꈦ)eVTrJIL4dDCC3tZ##I:3Z"XC03QP./C<+(|<q0{^X}VMx|}qG.hp>x]v\+9GQٟ9\xC|vz;cFH3п?}l#,=#Ԋ@P)`R`0MgI$(jE#'UXF+Fe;HɵP#8=,S)܃l!*FD9sSQB:((E` 0Sa1ɦU"ʸALɋ:66hB7qhNl!TU|\ bXBpٜk&tMIi*(FT134T:)7\\;5j VD)Ɇ`A%R6Y*6`$h30IsK3<;h>c? uB惮4I?ozEig6fF]ysl*3 CLi* .YNXH hu449 @f*X.YB# J!1SDPpE@n -/=;ȫT:TPEE1Ph -B -$Vpz_vW{U=בxGK?Weɰz=zayʟa7vrwp;GGx银{5$iM LI%T#x!%M!Q%KdTX*bLbt*Arƚ:cIX`Ę4T1"^'@ , @僸TњJhІƀR -BTPeQ;+븽 9w";}ɏT)bN25|50oyn`!ѡ"8:;w<.Z h@4! -hdCdQr4Τ`Z@&\1C 7DsPL@¦QPg5NSg 6MT LA%^v1 `Rc\ɚk¦Lh "H4MLL -3tnE")0VftA`aF7VgL;AP -YT!8"Eiyr49`jIUK5e&TTwt|_ؔҳ>[ N \{ 0WmDy^ebt..^6YtKz3EE t,2#A<:8 -xlhMփ23ƀ%TzhIȪYsH\1* рKȭؚhmT (bNBT-21M8ؘ -&S TP .#O?.%חϊ.><~c#ׁ_N(K#~~o#Ӯ_/%?32VW^qyޗ/Ayw}ƸWW㞧7W)w|\=/?H)~ >Sտ"o.=y;zOӗ=_oG²[mO_Ҫ\h)ƪHY4 *) r BM4Q 4 de *Dt R1QHQ3JHʸqjTJ<'>'xҾ/>},oez|]ܧݖ^Ǘz~o~~u/ߠ|_{z~Wbo\uaGm>qe v~'X'H)*(H!*B - H"Мԉ94UIm )r&E4ƥ$ЊD ID<F _Ն³@_}v$_?0.S=%ĘC̯[lN{;<~_>.;^Oͱ?aS}wW_&k>G'_yqx֟~G꘾wgW\f/y~eWю_fVj$S- 4 E!܉ThR0HHP4Xd, u,Њ΀LyjX j$Kh,E2cH<{7寗x~} ޳|\n%>#븻8>oףW=p{'Wo4y?KQ/QMcO?5/o#ϖ&:x+sOп= /ͿFi:o7)Onmb:4|o`9>?~Uzz9;L:@ڜTsR1TLa܀1 Sp0 -^FYܒ7D (-T] `ZLcU! mwos<9{{1ܧy~hr_z=]gOa[rz|r/d~kz\arw|aM垷~_7NG.~SOh>|v̿U,Ε{94e~W'Ǘ|Ͳg`85 49TY Z1 hcDTآ3fԎ@LeQhVc*X.\JiHS@ V⥁MPТtbD6s%Ha&EILb(8Ifu"E%eR 4adu˹gdցw3< u5>?YMz!ihTQR%HbeARɚ@*!S":*)4[9! &82S=4E%@P\mK:`;WJhY$鞤fEI`STL:0).U 4&H*Bן@ n HMCA^v6p*HHHb -zA 0q4ʑH Q@CZs` -GOXSt4jeTKC(!HEk47WdR-*NIse2A͑4h! -HBX!̥Bs -tA-T60$"rJ &$)䒤sP& SUAS%"-2MU*C,V/SR$9{M1dQRji&@U" -$ MK 0 -iS 唞c K$4,E@*BLTL\4̆JMpKLbbjJi H!hC)*:qХrJRUz>uwWQOɍ~ wԍ -FTh*Zm"qC"&L6ѪHt*@UhagsS2 U%˥:dX!1 ) Q߇ HTmdnML0J)TP`9C E$;@sdzrrC U&%HA4P!aqaM,@΂@1ɠNhhHƫ2.V*jћN1PSq"Yk23r&33HkkP "拊Q7rAE&tAz"G\% -jA& 3|vߗTsws;'$a'z<J1d5͸g:a,aP-IRh2h -%M l/1)\6* Q ʖCs&GYhhbWpʖ5 \J s:bcR07yH@b"m H25&@ڨN]J`M"-hVαF;@c,32nFm3j@L2C)Mj< )+;TtAT'9tB&`4D$P V"2{/(ZG'/'g)aђeKCABeϞ=|G7Dtrzb.+3;,9+&\}\X'cML%E.^=~}ͯ>[=gE U\Yd(EgH]E,TP1MH悜 !M!ԃ(,MybC) !11!RTQd%]M '׃xv*A<{~_㞦@"(/4{<ޗ{'od~7Q~_|z}˔>~+63o]xA`ôsǠҢ7=*T5A)q"(&; @ܲ3H`@Ą 4#4@)hIhP /Lnh.i9 $)ɖ'k*gx=ɜS۠}'$LcA,jgxF=뤞?^y~Wϭa[Az2si3scT‰jD U `UgERTt<&$ˇ8l* -#0 -910c%lw #Ʈ `*d6iP^; (H! ɨrͫsd޿zybhϏoCٌήC -|k({ϡ}?4;8}L'`^<֤rX - -i ARC4ۛhbr6Q4\T 0f5hzf$4,IP:E4L;68PlL%65r;Z *AsC&\s9V~O;=N :~{</NGɧOIўxH#?мW#щ{wg??%!BsD&`h,bpͼPJ6mqtW9aQc97-0C*ȝ Tȯ=FF$ -MH0R)f1Q46@LC)Pʖ"9/KvrҐ7&wHaKlY#ɲJTa lʩM*AM* H% Tc&[k+1t d-AahhQ#D XO-H#)f >suőuDʹ0` lM`&   0 -Ωܫ4 4\c|䣩Gf&7{ؘ~_hpsvsuU^gk&9z ׂ; ;O?/X8N.oO=àldoYt^>Zݿ륯)W&9\棲:s﷓^z)<^{6ã6xjyݜ~+,Ky~e]YGscмv8to 9qǣxr\'c$fjXb GIc, 8p=nNpyQyށF؝>zy~~_gqlUy>\DZι=>y=?ty~Y{yKօSa}~s|)~-^,Q:S=~A/F~7K}O q+[Ҽ<ʡxfuUYUε 9ְgT -3Z+* W@ MN;Dh9xqupe͏e-oRil&0nh[`ƛA4c5D'p6<ޓzNv@OtK$ -w)Иwz~gmn#v4 HU0"x#09%ycLy\ɱHhT+ 2\ß+:ן{zsskqvIw z0MdAmX -MgT-ThhGz D|ko}4č -jhg|>G:'nGtTbz)0 e -) `8>n<~{؎`ysÙO/*_ޟ^dy>ö{=_1G e57y^z~:<=DTе <O'}7Kοg~\=\S>kH|sp4<:]_!ӧutB8fjX 1t5YcNhF^g̻}uqz3؆&4h\]G9<~ty4]rtyo$y>Lj}>]{w$kx})F=~.iŷQވ<]rQIx~5})Oawrǣ;_<}xgVrupF/9h$h #IͳnCNSTD2,0u!I #CNIh1KHipgkS -IѮSDT.~O^Tkwd w48}0FU t34#%EaThhN -聓MC`MQH#PI) xc>H8h\}s}>gIڪ !c Bv R*TP"L"TR&YКH@&0]o=I떁.A40ekL.t -El⑰ \Z /6RqԽCts#s#;ϮxO-ە痠Vl8=F[Ǣil>piwfg.lt3b~Bs۳ ]:A6=SMu8{R>m*= D]>P$PJP3yY$'i3AT@SM'i~ҙ &]m*ܝ -vXr%71PLXd')Ԡ"JlrL8O'dW}mM3tTr{M:QM3`gM>l]gdTt=QgFSvmrY&蟘@@a!B,AnЎ -c#ⅣD J㢐U&DeSaT:ٰ&n@=.Z c\%b>ig2$8$FP}rCjqȔݠ}H+4L*ͩ ei/ 'f'hS ]mCryqjP=\GC @` PEuRf'7R@Q922=4@Y@濰Y#02ꌺ9Xlsa 3;'M׹=e7OKP8ͳDByOt'?DMD ؘ@ϖ=bFX)M!BF~ҩa<O%4B~ң Z?QY *!-ӭSbsEœӳjnп pbԣMNO\P9j$ʅ̹/=Dfzz'SL(ZZ L6 i~Svv6s DHY]D]f nr~Ɲjor>rqo%;#Ӝ6yꩉQ9ba㦩Zţc;fɦ@U3z J0,L=S5O3GnQN 8Z+$y*{S5)Q&v34=5)TSmL:nm:&5(jVڋME8O? -; 0T䛢~©lSžLwgB.D!@*ŝe!4vs"9MrfY3h~=7yU4SaT d@!0ay 7~ҩlA%a OQ;22-)>T2Yd!7yZELXBZ;`3(XewnW=sXV^{;)Έǐ xn6&:%S5=_9sp(ME% ɶ;Er:Tz1!i0'd&TvU>zjCAfmPD#`1ޠ7h֠"E^3@掶m7Scw{!q4{PiX&H0aawaȦN8WmP͊PnO7'LͶnWE?XNڙķ^ݢf-Z:7DZjnz nPSrz&7$A@ L PՐ2E$N-WNsg0 -&eIL4!:D"$ *z1$&N4-MXmQq]Sv㠛;~vkag r MEMX[DflV$!`#g -h'b9QtY΄&Jq̢¦S9DpI ElhlA,",7"Va)5y)JpX$S6o6!vf[؉ طB([XI@B-EL8arjmCD36J!r+@@DJPj"Bj0,J&?~0s?a5 *oAt 뷟][sgjIE2MpS銻ݵɡ#S5>^,T(;SM[֐V4,ъ}E9 Wr`&O*f[j-CDY؂8Op.'r7 :'  -J?iM,U=δg=cĜ@C -b?qoKOm;N_]٧wh-OKWu^fsᜠpLo9[T&uڥ4@J"Bx졢1n[S@Da(u 3[Jb'wڔY(X`:c4sCBnSDZl('E7hXnb%a*4FK2O +TSd2:xPSLayqIecM2SڋTSg)^9Nͳ"2LgbsReN}6詉ĩd\S'8USvOj';76~b!if_7jf_(ڦqj{,St`= QDH -D"AhЀط -:Y%4fV+oLޯV: ("S6e*.:ͳЁB*JšERFv L⛸NӒ69 e{h hPڊnxͦ\tFh%Q&jm76pU8Ъ{o_:K@3XuYu@舴(˽;3qFlʇ,  :PLg,5驵7DtC ΧqR؛GDviMӦsUGe4GIZLnP00wsD>.u GBfIU3oSD*3u !vJsf:X虢SyIST؜T9Ddq:jmCh?)g虷f≳Mکzl: -9*a:bP>,l>|AԹMY&w@Z'cnL)u-z 9CNZlL#Jlf -3Y͜%pn*Q<(nV<Sؔ: LЦmq@O TgS)XI4͜Ӊ / b2#( -og:"bN-=$ѹ9 m9 -9 ,-mOs1rP3pϡsQM@"D8*XD& -|C-N4ecMM2}ݴl*N1 HM2,$L2L@oVX]ǶW鳶Obf"]c T&lo= SS4݂lU5XCK3W}T+TEO2*JSHia!Cmm!r͜ATlb;@Q<(@Bĵ 3( 2]fDڧ;bkeAy2#~L7a ELN,Vd&6q(@JoUN -%5B -PiܡӬ*Kz8CD)Z:J}ԐsBb%`@(S8ĵ_ӚKh. TbapX,PPALģ*Pڟl57ΈLaL.~֋}]V,S zvSڛPN=MDF?nSxF?aL:j%MP܃D ATфUtjQS9@sEЪbg5SA:*zY_HsgC豯O,s*lw7qN,tO-[l=|i\yTSD1c)rCɖt"WˎV>7;Dir,Nn%{d*{MϓDUM2"lu9m*>n`lAP=2; /%;jGΔK/Zl)E(ڋSw}g7ͨ0s3z!7zut8u(̂LB";MNrpb,tT)Rz+*zucJ>l](#;~x:Nlv%bhAanǠD3#.= HQG U[ tWA4OoiҀ:4DS A媜bauHS=ѳ.L:mW4&/Cm)a -'=sy0p=쏵@b$,/a'hOxTJ2Nn$q睒qS( sEC1ݷy 7jeK=%J}̝hSt3.>~'EKmb$:KotS7~*GXf+CJx$+RdBse25oIЪ[lOXU-T -%?sQU6*2_WN;9t( -nN"OJy Jx\,!hN((ЧQ(Gf2 -SL%7#m &D4!Jx+ {" -/u[]db fbs L9&-=Dg% :g8E3t].B&yS.i7oO";6F`!]vٽ&F5X虤驵3h-M3sqaT8S*)oY݃&9YلNi}IA~ghilRArtAT6叙> XshJ -k iγS4g+jڕ*b->r><%/CES)GEM͵GƉy⾾u [Z"Fj0RШY)bӻEAg9# 4Z$)8t #P9y'K*ڄEOotU-XTSuOM3%O8BB: dF0L|=576# -nvSflOS _,;L:M 8:2L3!J*Ladq#$,cs':Jg!J`̔wJgZvDgEu`- v#"$BdzFh駔kӄ- 6ϴr;Ή 3yvInr Zb) 浶`R#1~=KOL惇@|Tb{`uݢ&"lR p8\Vڄ:IL=$3 +#(t ,]1|J!>= Pw`^{iD@Z Bn(U[04t -EN+@~2 D=1t*`lsjsUS蠇ewDcwOd)CK/NЧjAMڋ@6P!F1GE]BM2KyDoUjvi"T7hS76b TU6v Fe5D":'QMB:a HM+2AvHVcbm/@E2)B>n}.|@E AdE 8SC9Q:@j*X]E2} -̄Uv8:r\1QӒfB KMzFI#*R`͘* ]\ -`G'J3U4{YF` ì9 ,:KqfG_rM9"sXOH7r0{o$t@䰎{ EPCNX&YlJc_M \}2Pb֞c}w+"AIގυY8>w9@}zECw0:s%hPLgO,B( m9—d),Yf -أX:A̦I b#ʼn"Ol NpGْ nMX{:)PL̟šghRqڦ_ڍq36n ;{BZ'4[0T䊈Tw9]3xˤα(AϲB68`\E?,2GgT\o6p:6~؉ -M7- jnz:1UMIsyN'7.}`wxNnwڞ ]̐D QohA$,?=KflJ.w~OjJ`8ZXJЕ!CWt[%?cD,5JeW -"s-P;PâwǩJh$檍*L諱 ϵB7q2ED@wFK6R:*LCJ΂B#jd찈gJN%i8ÁS|߄X8BˊQBcL%?(Rc% E^[ \y|p|؜Gh]GttT>rl(li43L3]9It)3Ph9Z6$OfFA:UzjU-Rۚ-WjnEPѥUQ1I76 9IC C6Bnabf߄49On$ }RC _-qA8U pjSlDH 3b%JsA5de*HA@T+_T2 ¾^zċjpSiV'MSܾuY0&630&wt}@GڦϫMf$XKtQ[ z}?`th'?Hq cm~{|͂ViraNJd)9dgHtLIQ6U',-0F3S,ӈ, >GiL,] -LhFT[lۛLI6> ENH4NQЛu`'B3ToKO`OUo70W3<ϖuW>QNЦm6wxERwgj U%OjvO"mOΚfSaT0Tپ14<`9٠˄ pm`"mTNn JBgej"IN6Hф[oy d?+`i\!1#шee6"Vs wՠ#qfZ0ԩ PmAmX:@ʏK|w\DϕS}>uOڬLRhNttBq}]fB' 3DP*Bd*3-~ڬ@%Rv!ըc#Uā3ZQ0˻+- A= 헌i!ICVTZ@쪌xl譫SuC>|AA-*&f`!?HAT -d?iTOu -abVO4,}2&B4;"rL``T3To/jy[[@;Bm*'݂k)Ш3u#oU&j˔sQkTq)s&io(fgǧl< 45fZo.<-魱#rwUB1Bl)퐱TuSiTHM clJ5Toc:Zza FILv!&c9'>WÝGHan,)ŧ'3,L5 Ts9x N b!X0!|L{-a826&,al'jkNx -bO(wΜb GӒJs`"W}oS6R3Z|S y,eSrdOQ -|OI~Ҙ{bc Heg0BMP kŹ{`#<)#wI+쪼.k S,m{ -r;t1 -5L e8Oׂ-9&F]/8Dp)IL8N`sSY-0 kQavlKھ`ȬOmf ѹj,H?HroEG@«Ln -t*5V [Bd4Ž=a1؂$PM~,q#4Xلbl|"P"Opޮ;܏[~ҙ\+ӈ"*BdŘc$SmmTsلRkp'QҸOU-GeP*YYa!PTA!|O{~`«~SF'7M6CivAhmP,mr.bС)Z$JK Cو! Ujs[+rфt9),S$*[T? -e*o:^ J0amwJgiʡhK  -XӢ}& W6vdiDU/zsץ ՙ(:tP.uLnz2hgn May_\Ck*-69ĪU5秏#ǚkqUΓ۫"0T`jm;79C̅SL;Q凡\:jvj FF6a4ĴKgOJ}ǕаT14 _Y)iЈa{6U-M8᪇.Sv'uL]Pv G抗 ۸-{fPy] 5Ks11p$.i'Py᪋n:#UYƠ _@0 CϷ=.ЦmE3y MSrh*koB*ǰ Fw"&iO+;!gT q=hЍ ɴMOc#Jjm)B<&mЇmS -SlSTZ!ƨ5e '498T'-g6- vyVs-5Ge CMhhZ.W`UȺW= *lQ=O!ݟ h:iM[j_2 ˪T5ٖ WfeNIt=45{P=b-U{<D2?7>בj0Ue|nL2N]uM؄QOr; -99ny=`r[DZ[XIUD8'q%Ocz3'z:0c+s=|q~-ǨM-E-ajv4@0 +?>悰A.feGrE:pM3Əl]6 6(>7\w|ƎPO=GN;-G=t)ΤqP*Ʀje3>'dn>q#zJ'mφGm9TR#U9s]D"16 -h h6su7-y9: ^8:à `X;xthuST]23 H K -׾w%W(\iR(S{z /MԘG;B݁3jUa,jkCB8諵=-,\f7# + +U h-T̳9E#2ݘS"T]ŜRy AEmA%&/3~<{7:#oņ'Ef2_ޟa3j9ٛ2>iWe фJU -tV~rNc$=Dj4:*[OK ΉΪ>B !PKWDӡx=y Tjg; e| Q@9)S'9Ka (egҒ5ES4 -=TTHh*rA4*MpeFrT5 - G~-[D6;Bx!U\SYxJp $'kePnTwT?d dw\ NS6.'Ty$0/`LJN!'Wy; S~ֳhB-A5ߞ56RlJkp%/Iǹ -<Jw*cJٽН N@[>?㫄;n;x\tD|QhiIi?'2v(A"eU{`ftTU<>6ec*S_g  fsNisr|nm& YmBʠ^yYg+s.wlUG|=@F&ҧTGbq6yVRTDD$zt jJ*t)}<!} iǤk !K4.nPlD= -,b -FYQ?Q uTL罏R.qq5빍vf|2>ݱ/dpɎO>Ϫ[WyMMJib4E? J{&V'V-W'n,+>hG>{ۢn:7|qӑŠLђ"D,?9S)mVb1>{z}eW7qq!P]9x+Om7֪~Xr \]B2]()) -r!ǡ{^:ytsxC+ŸI_aoF3QEp7a%c%SL+E -tDԩ9{e<Iz]QHPs;9v2 a6-U4KS"IXnJ?|U#a'{Aٱ|ƚ^1pW@X1bњ!Q(8D \4}2*:*T#Dd)*2ŀ{,RՋREM \L 1?~O՚߂8F8ƒb rhTi6$ S&QL-TU _bsRKdd) - -&X̪u=; "SKsGEO6sޞ: ~ GuHX;'Я1_\̖:1RDi%TǨ}oPqKnKF+2%t;UU"phJœD.. ':[)k*},n -lk] <ߘF~"q+uio!;=mT|eOY./0Յع^G !\&=S)Ǡqpߏ#uNHw/^}|_5Gsܬx9=^c?87磛sfG'чVc_=<jiJʅ폕(zlf -D N.ND *mM`ivq B-ϩ͕MK53sM~? yN:9˔Q#ל,y=[IgnЎܑTvva@S&^™uaM,Dd$G@(TI'\ LLzYN׸:!$(Z=+g7ҭ_ S8+NwG V7$*ї%Y{G0D4T6GC T`9SvsEQ!zYbC>٨&-Q3sjG1\a8\tǗʤ}3 4L=ԅV]E@bgg -!9!EmLO"f08â`, 'ʍ:9[8{糅 .J4C%Xg GȔ(kr`zӼ㧎>+S0G134Keh|qQsŸ>Z!oza0ah0;ǖZH-:uOr)9MdIp!8ex]޷㣞P.-|;&`NJjv)MDO_WjcTvHdCT:jN)[=GIQ8 I'H -d$W BalƼ7#٨LqJg6=g\/P\،.B?{StTڃR t`"ܧgBfxGEI;2 aXYΈUvsi6oFC=Os>w_v(6,*l譵5Á -nB2iM*M9parU6'U'4doǕ㯏)uG|w.#0bnl󅲛&|hAyo:BF>̎)oy䛷tܽhFH`f?B BjSD{ARTF^=GӯS˞$Bu'JQ0 *tiTϙz$Bm  -} Nn&,jX&,=PGAG:wTSnRwsK*p}NV:[!<ȵW;kU:XDcSaT :(yg\zq5spRe -uq MޥJp DJJnqC5IsCk)XD+/V:z8=y,{:ǡu}W=w|X.~<:^>o.mH8\yAs'̅ϓK ޮkI juCLɨ'4F*&q\M -|rJ=+:y3uaŪx(h?C1HJۇ`YPM']#|~(bЛSie诠M/ogHf~ɬ.2QšrgܳGPӽьy./ǖ~ǡovW>mE#=|/kÿ8'=&чײ>kʏE|2{Sx>wt1;a,c}ǭŹN)ičz` RR&n]åH@ow"z0/=AEQ&܅flS2C-(<J/! d{Ⱦ&A RZV!yQ|>b/[(0X֖/,"FP`@ XLh3#;Tfܕۛ\)t&(8X%3lCb1s/Cf߼!l#`*9D[]'錗{)cHQr2Nl م۝Tm9uOoPD"SDuRƟ^{[}{$ A{D.=~P=fK` UGeSNM}Ehl֫U|2v" J:_>")ΐ?D́T 夋DX ̧)Jo4|⏯wP#nzw~Z? -(/d <DbchSiwZsSe1pp"PB(fMA7=lPgͥc>sYX,yZsZV6Ց"/!H2BC- aC+B-&c:3]{\. D]@ؼcA`0flHXm6B؀X ~x!@P(!B#XSEK;8l]  ׏Pf S(G0!ѧؽJj_R{)W =9$CCh&n LIAs -{qb2M|4Ȟ?M2L11lBbϧG%4u5eUsTl7hCh6CqUvGuLھЦPN4 -Fq'hlNXn6{6ږb4N=]%?jJ!OH)7'Ya,@M yyS`nWm -oW7{}J# -69SڋTQؾR+mn(ЦJO7'hU'}6:*}_1|F@Uj_UQ SSaSfпUW Bf*ZCj)کJ{k-GaUz7W"u?jB~~UMY2;}\e|>{?iM ܣ'*x|>j:;b*Oup|kПBWa-j=fЩU>ݾ#@Bi*:KGCA>>3QG_U,,^oQT~:|6~[@&n>1Gj}JWaL~ҿPTPܟU3IxkwK3WfU-__Uv&al}ṵ]7hM[hNi~_PQT1+@d[V;7umS(TW* jWa_|N&xUhm_ ͩ|>KGCO;aT/Cu5ER|F}Ū6nci'b~m[b5));p+XT7hUO?SmU <* Թ|ccO;`LJR]|6:O`TG*Bn|NM;dU/}*;¥=;BNT__J*کqʩ_AV؆Л|SjJw]|> oOUO;:/Qvb!VvY5WZ*yUv3h_U]|6_rfЙ9V hj{b'x >hbmM -fCpNRؾ#Pgj)$WWb} -ܘeݡ7W&6|'*Mr~R؝;ͱ|>~K:*.PVJoUS* -mxL?ʷ/ھj:&n#iT|T4E+M7hU_njvPޟT*SvVUv/Ъ)!];T7*Mr~S$c_U -0'[pmSM*)_֩oUv3hCUvoL|W*_GEOy*KN?Y}!W"2 J?Oj#vvuoRCB#hնLjJT7*MoNLڟic}GBhlWiU~£Xx֩ -HfU]!S* -m7͡7{m/ھK0vʡTrvhCSĈ\USnSiTfJT[xDv3T  -CB'@KUڸrTQ1C*4 jLڟOvRfr+@j4]aU*"?UmKx¨3hL[@v/j{ʡS'CO#9X7D(X͊#(Tم;Dh6aEFsb ( ",ARn%p"l)ÊP!*pBk`hv<Wa_7@W|FM=|>T;r:'7 x!RfoMALnNqW&#>|0P?מCAf6PFڸsTؓlc@l <QrIpObU19Ld>*\ 7edOp}Ȅ$ iFHTMc - OS$0'r -{`Y(}Sd%@ab6ǜfV.*2_()(9.o}Q .^e/ -5@]YT{& -$〃3BqY3nl읒vN0p~2M|@CDT&N_-C@hrU)e(]hG4ܟ"!ش̮ԦJpM - ]pvaL;wu 3pAzLGh - |HNt.^y`>:'˛BacE;hسE gǡOfSJ(|QyA2J.Z =;⟹,O l 3JqvmQ)A`>$t:! XdVե8QT ,$Ybi#WZ(H?O`s۱4&G"lPb*`@TiDj#v8TR}љh0g;"&Z`g6(6ߔ: fSD"&rC ܛˁ!A:QS[oG+\z6*N2AL\O|AK$Pr*rAD$M3baoslbbűغR-!boOn,bvi -\"WÍ\P3n7:Y<'@ !.g';.Uj0G[eĹTvBvPP"'wET"O3|b%4s2g9#TtN,~aPNtkc}Ξ.a IUD᱖qڧU؆lbi|SjJ].ZݣfU*T4&Nm -C@%ODvg:!Vիbr ҈loA8DmS{m[jfvۙ)4v)YȵBp7 l*`#>͗O YbtYڒhna8,ψL3s&)8Bv=Q0vpAѪ}H&㽎.D#(?}/W>6p pӢܟd(BOv(8XIISÜLh#2l@FLf)f>DLZm\OmMikTU? *{O4J" ?u0䡸3{{[X1s9ŋ惁I1v'P@ YA&&Jbr*Y&8PM:][Xq O'@*gPS!BuiZP 5S3#۪C@8!LΖMdMإTfGqTv4U3CjN`)R̗"aFr䍎 vߛ39,(imۓ)e*gS$K.#MKmK7:*T){j*DGF"\SvL^s7@MpЬMKC\2)9K=X;;#E;@Bcp*&; -nn+-Wb*(mjM>q5KCA_m uAlfg +ftڟ6'ZjmO7)#oP^#D*{j90;rEQrÜ>Hx޶ q( Gšec3&JL'@PmL:1$"%, 2 :7'P( iL= 9Mn8)BF;KИަҸEME}*9XBumW?ƛO ؂͏WE8m˓P2*MSI!5 %=O~; <& 9!hUj3`]3z5ĴHص9hCK U7|2Rϧ?<qt, <sN+7B2L8ߥ9H^GSqq땍ݢӥwPmlrᎷ,'\fSD :sBqa7-M9'dH.lȅ.'\dӯÔtaAr=A70SPMQ}4ŅE=BsN~p)Dn9,*yN(!1A Q0aq@P`?!Щ#nDJDXLgFH8Q\,Cj|V2v@{1RŔY<[$s B! \*5LTȤt'.Q.&&ݏy>\O𩮼9jt0"4&${",.Db#\U_MTz(uxv9EA - яT, -Y,`M3Ōhk&w#~KQ9Ff𛓂ѸɢbbxbZnf k1Ѫ2JڂdbV::"(aRj xnQ47cT9845F:+XT F.*~D4^,n" 2ě -ȂDQMoo| Uc Jl{ -♰\4@٤hXTDMvIК"F:Xވэ |_*ɳ|%t p;8*1 \y܊ J.<ǎ:Ʃ<R.3B[ Q -+5Y"WS'E"aMQ p?cɣFjG|gly z4O5덆7c\q%, -&DnEX; ̱&tdJ#2rƆ2|b᱐#tE.o"AhhhcD"伨S|7K #T{t$ĺ'q!@+ߕX8D GX[:4h-#*vj$NY$$;t;YH5, o\4*'#(oEm؂a"%陏ΈFB[1|gi1`xrYz& ;'(-ii:d^UX# E5q&+r!!#cdO=݁7妏 ؔhlbA.͔]!u491؊$%!H3U,,C,DbDDf115^/)bp' 9EQV81*4 T^\P\.P^ UoT* -0}m:) hfb&xF&FBڸݤYast+m=cFkP]ބM5KB4qd6sx .Eid,gvb6IT\14&"φne)$!23$\Bp(4ѿRW-N ]"FX \aA`\;cV6CtBB!K TpX5E:Hub l (cr5BU͚5H @C;7LْNv#p:(z7B9fAr'gk1$p2`i0 tHrHFnX$6+AL"f:ȲBT"A>NTU&Yϡaf1U7D ^.\)h~ѿ&rsEH54H'M -ʎA7B)"iXcV+ &͑5- *?kdFQTF ^Ll㪃t\>Ǥ&-CYF8]{'#f/ĩ8/ qd\F^MxUut6[Ĩ ' zK!M&{RXCY1oC'&+Бh1~ - q1ィJWp'ɡnد] ]Ц]uq5v$Z$HhZ2+Qr{jUL|p~[Un 5Ɣ/ vF,49tFFP`äU&XjK.]h..\&`Y7M'lHClKhAbdo H= 3aa\cw%g\H!N$y9;@FeL9Li=$ hߪ2=H~ N,{  -vtUuxWbu'6d#;"2FR2BcЎC$1#ĕ}F 2gCPLS]0~.cKKEƬM>!LQqڐH^ESc:h|tз~M%D:s= -֯CP8fl[BDgAԈ^ r[|@ 'FOL0I31v6{pr5#Bat%,Fبf2jZϒh,<]qߕ9Ulw=:㙰4l`H dC v'*#% DhX2Ԅ4! h(ȓ&(ChEtA0-'C -D5"Ķjaby,fc!Cb!$BX9>O@ -|{%eMHHU& ')S5;2#RFI: 80!ĊK -&3{WĆ.B)T!EhؓllWMt#TzUQ ?Ma1LD!O]Q^Z(eXSL !!_6\a -9]EE*kjU斢YVn8@4h]L;~'$lVN0pI6AˮTS[$և' CЅ I:ؕᑙ -5= v^&p[Ey؎/cx_^Mj2ir:#!*:H(C,!h"vIDhIt2NP%cDrn"t؆d%# }"%Ťv_s#L)iB AïǏ+U4_·fBC! rL:!MZO(X^;ȼ kDNGZrL!7mȲF%h/7ny⩱hߛ\P@vNKWBWU$Sb5 Ie/Ku~B.*ƬaU5qoT.(>Z -Tw/(K5u٪MNF>s ԇ :?D>/XEː(4#7\ɺu\:7|^W+-\=q&$ ~s]窷] h׍?Tubs]bѣ,dro3o -euf 'f7pYZnW ߁q\_ *Ǟz!rT~}y>k<utB['Gtt4T ]ꪶ.k||G~D x5?/?oUfaALLXcoɖ:sr|_4?.a . Kky׍c̮,7ߛt m^?VpZ鉍R16% -.J!bč(C'<3Y p&3)-J#\ЅB"Lb2ЈgR _" O kN ||m&ꨗ.*Ǒ~7\2+bc;펊L -oEd<ԡ&y&?E"č38/יՋïT6,Py\f&X  ̽S'8#3,VHuRKD$OoǾj~&/\5DͬE/n.'\5j6~LQ*%,P&+=Zy.D-(ΜWkǪO~港U^ueC0DRU "jXDmE 74lCV>o^mBnkþhݳЄɅKE|v=~6lߍy5wꎫμ{?"UxCR77c|Ny*l\g2B)DpBM`x&X 7]vDġɀ%JR3xR@^7FFUxp0&;kGyu.W5"xY&heHI-e&g$LДhHV ,[[Jh8K3ؗ:pf>%/tߕQ*l^5Eظc, E QAB'`MW$Lғ,h_4tS'&Mr/>? -Wn OpFK[Ec6$v@mJD [\ -' E#ocUIxYl F) /7u~7\BtY8ұ)@W U?Ņ5 -⩯# Z*D#W /7Iw\м %^"tHiJMrbEuU5|Dt\jQ.67$ QbC1~RW-`حeb|G7ɊiK)01QkR\csHWqr|A_6iaMRDȞt~GE\kW\+Ϳ2઼TD:*2xLYnJ݉JkW/u"weɖ-ɣ' 7&&M#d6M[&~D/eƲE0'q4xDŽ2#pH}"%h* ji"S$wnG<12cjxBu#24!}-)MA)a4HX*`Z LE& á bIH+pcȱш;U$Ox>O,b$1CrnNI'`:Mp\DmQr TH]P\_n ߍs|^"" -2I -Gi0]GBC,!=6jYG&I*F,Ё"n,R -{H %ifTg?r+L'y%3[+=RTk\(X(@F(IV!R(+Q%b4ZPJRL dl va UunP> e`~-@|ׁUp\gz\kGas}qe؟3 ll/~IThp5Zc2 +0| ͿbtA04 %,u^$vhNhZ&Tʎo RJ8،$YP-mq\G&:1"#zt! 2bj{Q{e/ФM'8dh3lBJp')r7I^(5iGwTv$.ߕ_ xꛪ. Is t7oOFC;?*AA "3XP@'|"-'>n? t^]x\<=oՌbXI750%l9OZ"E(-~jFФ%D_N) &~fk01BEܖh6kd)xYhI!&L;D\T`)'& -D$515l׆MxUq|7dn&$XT#H%B$H2yH:VTiQ]~ ,q_ʸ,pߑp\&M $*Ƹ:ſ~j7 -ê`BGT*Mi5>q'65渿/63'SI$+[LIx.!R cRiCw)X$MO9{!$TLW.pĔ~I$F1G:&ٷfdfMH 4*)D)Qv4 Jqa-P.bh[Ģ, ]k~l\_Y*(`biŸxωx ?EI?2i~Mc| -MRbǚY$-4ҫrtLX Ȳ (p -o+:5Qm#l@ƅ${<+Љrd,UD81edɘFu&PɏIZ1 J1`XG&N$!E:2q%)H0MЉuZю\*g$-D*J!2k<,Uz 4qQũLF5ĔM&Ť;ȞLp=x__?|_ɑ͓h"?7Œ*)m"|~6HM> $\GF67Ft@xI2 eQIɈA ǘO5:Md{i6ȗѥW0JII ttcIԈ  r**/LrbdIqWCʓ$ Ncp$&a#I#Lrҭ?J1ydB; #gc,&M̿)lc,Q+t~9E}te~bX[,E{.ƒ ԁ^$KEqf \{Cљ&I -TБij(u׃_ׁ ˴o|7I.b>Ƿ4B6p(au/9TQmY\__tTt,220Ռ Af7Hf% r^E(b㳣2tIB$ N,1^"˅i-(ij'E\CSf+\ (dXcgUc2SHA’,DL6,Y{_=rfo 5HGrD]> {|xW7 ;~&5gU'©xM˱4xR,@li5 jM$^-x? T\ߎE9]⓱SwEbn3,ijRI20m1~ʬ,Gy4:mD! Uד~H*Ud/ -TbAe!ph7s$ MOREe0Q)$a%'(BBy,lJCNJlBIHAb Fi@gMRܑN\..I'0 'ʼn Xbe - #w&3>eM[b&>LB ӿME"G(;Dk$0$'O~IlEP? xhy'xK(NwM v5KbC9$Єÿ\ӯttF6MWiNoFhj t'-,L_`FW9 -? U T~WɍjD"q$㠤LEBѣ|cwg.Z$(,>|dI .&"P&\&8mk4B$ѓEbи]t>L\] ly2"F- -stCbi>Z6nD7Q(I25+(#sԗkbe ׷k$H -#0I `W|o5| x9~Gq~^5F:n D .~WE~,ϑ$u hk~m覻6>y*?MYDM&Ohu㛓EŌ,&>X !80E׉s Qp82uSm"K(iTБJ$ȑp*IFF4L/a&12FȀ I!-d`oÔ ; 1r\"*sthkFIT± - wcؿJ@TǂI'h[0"ZM%b,>nTuV"69e 5H[P$c7rxM5uk&tG" ð&HXD`B aM]b=Ktj#+O>7pY,=QM 4ߡX8"_h %UG*쉽#U|D^ - -U-jcmh8)9Ln -fifU9JcBbɄ%ąFFd2a5׆̸Gc.9n6b[BK˕7~ S#;>k> |[ark"աNck DHXkP`qFKI&jeE5ϓEB깮3*-,vC7ˁFbb*c׃ -C!m.dL$-$s&.k¹W|)k$'N-Y)! 8?TIbvW\::F#EIȖQٿ+/Uj⫑xLx\^ddD6(Lk"yT:.K/>Kh͊✖c\Wf*{2XOQ -Ny$ƈ<'\h\dF\&*Y:6joo GDsG+!'zKa - $*$%79mN)_.&H)$Nj -2bIz1ú:> -\"2XYXܛJ+Ka쉍pWE|:h|ufEfMӾ- -XF@"$"ҏ^/|Do)+r:\{2Z$^E"*&#BB3 -FU#|Ws|Q!W%`cAѪty|pv`X99.dCJ -ճW7GdJk"*@'I %FM9uBɬHIyYގGd~ QS\pA"=Vj:3$.JX12:,ٳl&]R-cvɨ{6MXKHn 6 =yw(..6tlWJL: Oc%JhjA"J"Pڢ'a/v/Lɛzhy.fuF]sfQ6*<ç)䎅"$F K0jMga4CY숰!QzS&s6\J$F^C49C6@hIu莆Ori?A&~g/%+\l!cŊ*l xFUqftN|{-|rsa\YqXdpM"Y&]B=dH6\$nl/ac ,Azd&OcZFƬ>,v7UҴ( ]f\8nusl5GuK-bR0'sHiclЛd7td/qR.X$4끠B'0Bmvl! bRqM+"ꊙ>ĝG"QyC#2#4^-BIHAJw ڌ߇FEX~C#**,7NtHifD ?K6;d^lCN'r$^WD.+DžgUcJf(!D{c[>dDYU&n|;U5*HѪ;6hA5afȬ,nfB] (2f D:Rc&ĈX|r x jo4Mdut1 SU U3HiGTъ$IAY# OXQidi pX9Zv3'cpΩoc93gKAtF3T2jfttBQ#5*7[%qcpFYdD4'ZC -HAX6VBWȩB>&,$9J娑v6"I'4ԧac{bJeꍩGKtSBC4,r^ ՚4*iD$=WtnfM- P11w!Y;HCGE[^(l1nh"j6֎0&SƟސDy2QIխ$sn M!ض^2mnàM5(S+awM7jC"T%]tzH -=4BɑM$EC7Іct'1Ђ}y0ghm'C&tB)e{3{I@ڏdUz/ƯV -қd#Ұlq~s}תluwS\.:1ȫ81r}HC7wxoĨmI r?J;C 􋆜"1#Dm= -8k_%dLѲ,THMUc1͎%l !^sJLb: 1T+u_.7c5YȔAeϡSd QGi~2v,zyEpi@)Zd͈BU4-ق(nɥ˸`<7Mh%z<0KsFbſv/;EMTj%LfX,V& #(\# Sn5c`N7F "K" -Jh G|oB銮ٱ7&}>;2,6(JioYP. -bD[s"HNI'VTRD޸g3kp|U_yq8(M, u[-͏%XM'c?JKlD25#+ݟ9;BB23#͆IkCKbib/ qܑS<|ZMդ Fq,fI""NY@161/B>-7|`E:B-uY~Kmf c>'bZbÖSq+\s aNr"V챤(MEVXryB3I4پ(X -5MV6 -F!W63GFɮ[p"FTtFX -iJ7"[+cM89<7"b4x^/<ɧ3x [`DD9 ѮYC;]pиꙣ8S0X3MSuz(eGB/bI"wI -n2)*luѺ*#8R#"<X0fr8`-ЎbV1GgC;&DV$ ~M4ȷ v{qɥKxnzd$آ]mG]p[,*l]hj$-I깤φi1y*df|.[J nQd"@RV=, JL *%aSӷ |{qqThy]e:3$E~"(1@5ɜݾ,'_cE<4*> KUo4jlY *j=MJ!* \j:؅WF͛wK:cn)) Ft[ 1H@VԱ4Ycg5;UpwnlBU|'*$UmfY\L6SYHcEiQ.9Ht,3GTuDc䍔1ȍULBs"N#%5W:Ǘ|vv+ƒ[hؙFt,b&ढ़)%P#WجE0jnēa 1Xa6#iZ.: ESMR)\4V]jNPV<$$ 4^66@ķ.9"hvO.Т_*:AżFE%_DVf^DAjtI`9-ZT?B8̇Ȝ^T] jSji*sgY2:YSb#AeږYguѺ1v6#0(+Q{0>˴DQf), XoŦe{?Cَ3`q&8t bɌ(i7=\,We`g\ s/$& 䗹$L6y4);5aD.1LYr1FlM{h(EjjB} )[&dl&NuIYwЙuQ.'MC6lfPOӃ1嵡1Gre`؎} &23M -).vICaQܵHؤ9T< !R<q&̈́hFNxHiCty?!;(#XPjQ4..P鐆&!+[FUypg,{^EnXl1^#0*.T> i4jhbC轇1(tgBp(uW.J#R:\ t\t6eu Bv ІlYؐǸ%2T9,kMZ-,bƭmh;FSܱ*`VCTaL/ ^*9kϴB̗?yEkrk5S:5z`u`!VADZ %ccBeUGb:zM͛;3r)}Q둏<b'u,5uzښI^I-f)5<|)7#4+*\NƸOEZM3r21v͑. -LLGT3 x- 3 -Qt]іU~%1ݲIi`p %oX&R)%)&&XhNxMH4w"%E BHم6$s:ۖqu$fű(䣳LҢFĴ;2th5FRk]gTR(t7M #NŊ'M:|BEy&(d.\lLMdGJX&IP?*=+L$(K!5 -:)_Cd!a(dGK+"?< -5aladU skB'΋nrN* - -QHJb7.âXi fv-[! ddѳa\fi%+6k5^M~>. -SDfA0BՈ$_HT;R)tE**h bؓby& 2l~j-}3̯e2H~..>Cԍ` -[ )z6Тҁ#1Zd:Rǡ[W2CeZRk14FJq2$E4=xfH7M*QsUĒUyI(^D86JclI:":rZ_D/Z%>හ]& K3sІD{ivA Z+ՕJlq~*I-BJTmO?Q q5k2?p/JY8wEuMٳ v1Tf LQV~ -͛Gd٢X 94-hjW wMSBVVܴn@UUsN\Of]Q(3]\^MDeD2@G[/Ć< kA% -6=PغS;c4,٦/LZ1bdaXф6h T[CGKSmǣ< -E8ݎ6%tzPLl !rBL -^[?n6:I&bkd)5x K)cBr.<Ӯ >щjhX\UYr2oM\y:%I -,5V:n۳;Ibbjp5( d lD)<^)iY~MVzq|%;HAN81gt~/fsjjoa"^,6#tv tSYn>fjL6&Q4\DhOZz"1$EFmg a[li kEǢnLJYذ"p4\ -9+%Ki2@ЩQ;4Bd )%bf)t걙^-#fhٍѺv,,ؒe?d-=QlHP,6]Eի+>˱жjdv\ YRMb-R D`^V92)E4ZēbJiY&WfX (4{茁ІXdZ/I~ ,_ =\`}w,9FzF6.Ȗ}DJl)'+ & ޖ5{ɱY<7fCGSF飡 ==vbCWj?i&|?J*gxf]cͷ<5N%u&~xm_ Q&Xthg"r엵ْlbiEFz2=ua -dFκ挌0c= IhMm͠y$K;4ɤBMdCf I80iU[=%P{Ǔt(,X !}#xg9WMs#D\o)s#fW&R؄ 1Xl*&ƭEJ,[,rv>< ]x,Rʑb(<lѫz/r(Do̮/ ժDFadDjxG[e*H#h"B)$@ ()И PEa>BX pvfb;3!E$ eBq A_,V14w} bEwY-M8=.+6'b!NB$Dži/fV?tԳ$y yTf!-Hf3C&SfM_.gC7Gf(ر_6nYc|_/X2=ܗ",:=Vj1a1BǑ)C9~ rtJؽRpȿc&aM6G鞅&abdT]TVL^D6bdW>T٪86l5I STڣ )%]#L\MwMRx#MUf:v.w]\AZ`h~̦t5cHȖ2;tfNĽZDt[l}bƔ<8B ,z>Oѹ-,bl؍Gb!+MD:4:.F'cO(U5EXn%BirH8eSbsE]-"Y*G6oxEfx;A2 IxKr|5)i; -nؤBZ 8h膆:1]?47F?tX!4,)"9XT`꿪4mqtdx$ǢQԪ<zAknQcvBː-&HƆ EOEr''^aeO٘i{(VX285Ei;4n)YMp!ďy3EtnG36؇A}ͫK'c_V4cqv02,M q:d=_@d0Q6>Ab>f)"%Q'=qcL{ &bHvt1 -SddǼwB/E"4lrrw\Z\7H웋( - _E$ze;ur ܙlbˢ.TxbP#p3DQf6,!1D(H/]IdұJP0X} -6ɉj4|Dh5T-#ɕǀ]R-G*դY?ك_r`Xv$4 ZcSh7Y1iz_EA5Ld(zʚC ^*i 6lF6;Q?B}#6*\,AqGxt**v^IgDE -/H`1q CD] Q\fK]dK!X)݅ -a1IDIڟ14z?D/[}TbE#_KHM @ش8&%>l Жq4FCV snbFՆv*h+I:u#x:WH1#.켏*4=tlٙ,Hl*.9"D7FYXQ"8.C蘫ahPMpd^ɒ3mGb)1hyTz FF[m$7 Nw789rĸW"1G"GKCNVXHn2SILĖ|+Ӱv;DS=Mq&ܷc1WezN 4İ<َ6JL7ف26^aH쐇RVg*r jOeeŭ=l<޿p7ɰZf蒣\oEzwjk5-FC52 )Rќl-Sst.l&'pGj: 9j=QwH7 &݃A,дJ$+1f`a\,Kwj^Tzp<b4Άth8P\AcwK,MaIRۓa} -B%RzRtXbNl!qX5H2K7dǑ&Y;4k!ݴ]hXzQж^EֈF!24V - I,Re!*teoiRJIH ĉ{/S##-:2_GhIٙvp6cf$B/◒PC R H\2oM滱UآFȥ2-qB6bbVygъ\{aꉟCL$fx# `Ei"B;Y<ÂtXb`IhMÑ♽.i0Цv6/D.a -&SyeɆK8YcX.-+4_s/FC. MKu[D*lcѥ4ٳF?ej6M٤;C1u%VFti錭=j&)H@UjF3wD.U1Z ^){mC2 w6+f2FVGrzJll\-bfF&VLӐ\Ib.نD#7&.bpddy>A&WcGj3;l̢)xh"EEj5Rdq$я/ (!1!t,R8uiSx%OPh ŧqW]5\d{Wq&~Lc,3'XJdEZشDGG5) O"V24Wٵ&&l;6z<ؼ1t7 >׫ɤEFtMG WF*cSb_$YxuŪΦ&ꘓTVdKtrL v&-%D\z|%#hT<3f%H-L,DSQ=_I,+te^^ $e"Ej$Ƚ*}Eǣ(ck6itM&nft8"с-sU_F q6't ce]1r$mѼٓa`%؉L5ӵ=97E-:"]"#E k.Ƭ|AFCب"nn R'r[UBѾ#wL@hTɩNGOGE{$O5vjgeEv,ZRet`Q-;4!av=ib͙4eEl9г,̳Bdzb輌wKduI{w&0tlMT 8**\H?Aj2dl:4Lq+{q 6,x2bn/ l ,hc\ZH tu1{?!55)%m-]kYnGtbRjv 4*X]^ (]< *٤I, Ui3"GMENrpҦ'L˧*C5a+Vy)eK ńX¦dL%B$ ͰDU/^KƐ؋ *H&Ubc1)Z?D/g1*#IhݰfHܰD;k#)%m`ꪗt=%RjXZ'ljCNL"f(tl`в(sHWL#DdKXZ$@R(WJp+Nė豗;5|+QB(Q 4HuXDzzBȤmlh贍5` c]Q)-2)K,X,`En`}Sv)6CЕiz= -'s/%,WWwJ2DaC.\H]i⛻$y1}gB,HiAg"Ȫ(K!B#z"sSCR#t$UUWafFKfE3X< hj?Lw>'eSy1U5&E7tj2쎉RI#^Hh+6(,m$boeF=Xn-r6YSmB\WB\t9HriM^_KȬR9S^NH P;'11n6MɳeRDɦ^DhWg$J$U @ɢ1+hdgu^lĘ!j}0hT^pbR.b^(v^%!䕱\6MI-؟-;Ң!%ĒLX4'eCI^SPto!9RI#@}݀ m"[/ Q`B '3ڄVI&[DM$ &'(ЅM+6 -KCo8SC"wL8 P}6X[cڲ+* wMA}Q Yɱ;؋hzM,|i HP40CTn!FCW Em1~ƬV,LdtB*?d.2!N -ҋDRDIHpfsءXCOVd@jKɴ!+Nh k -T9X6pe¸Zp'#bx-Ď`[HCChe>2!InBIC%vJ%vOb{hS%+DlVWѲ4~XNXF d: ɨdMtW,bf\h5t+$8ќ #01ae .cX#LR' )'I%!:~;DSJ,rB!ayEFȺpi.RMhl  I">.̋#nb£.,b6;Ss>T {GT3BNBv;OH-'tȱss&dU iDIB >馨LBV")0Wd, XEA#ٕl*me tbCzK4gDBSƒg hQt'X:J @i](q!IH^ 4%cPhe8,9- ]<y6T iiTʆs%PM,,WhOf;! -K(7ZI?AڣвE6cĘ~u Lb; K:$m{& \]_nt4G8bz >V#鞠 `kC C;:~pФč-|?X=&-h534V -̉wi螙MzCKa#QDcZ[E6`Rb4]h;vLsG"a$\K٪K输nDz{6"n,ԣ$(J][sَ!=S5+}gGN\EjXɎ KhPetfٲiff艴2SMӘIg9C?I%/Lht<20E%9XEa61'rԴ%lcLHnF.5'6cزfBlx#d cBTD,ūQZ XefXZE6D~XR9RHrfDz,dRՒ?C"I Lm.VJl\C Zm@$fj{dDLTd~#H͢Co"x,)Q(Z).Bxն(苍wF-У$-K$j:]TŪ2 AS#""dFhZgM44gf J0!;vhH!f6b݂eÇf<"\2+@& i$+E#fh#CX츩iCC-ԙX"mE|md,?TqjR̍ 5kڟK p?u̱$W,G,2,F48ct`B`IM?tw4OZ)%ɇs*E=lY/tMA{ x.hÄj.(M"J+-eEz|'J% \s92r!`YXIp,^qN a=tbiɨCC$!2F~̠S&aVР6U&V遛iVDhr#lI-}"lCI va?F(&p`ܙ<=wTHȚ<,Iv$ - -,,L2Pb}Z~@&}H'u=fi4dFtv7X]E^?DK#B4mZ[uhE)W/M}w>SR9 ȝ5zl~ݢΩn/ztСޙBpy9lhIa(6#dEsWFJ10R biczɱLSg).lt¤r~ŒoY\ӣ5LQdtF, f4趍0NٳbgS #|Q蜍g4|6ˉ"8ed"ic X3Mphu v`rD]M~GO[7r)ޟ$lI{G6ȁ= Vmc\n,8z,Q,;&"RMȲRč;]b̳dj#S,~b {/ '%jY;m^/Sj+M`B/Wc}-;<ǔ>.-Ql|*^8j(DhN4$y"Ý -iz2o&-[#F:0Ҳˣ@f~2oYV %p7nVQ/JbrhY1(^ő'z%$Ew$)n]43١-ńNJCd|ѳx6+3.ãTc5H8,錒أ '4K{Y\D}6)>RKG -G}Zha,ȓXR|Bo#WɬLrt٩}1L7LA*ZVJ[68m/ؘl.'v_؈']2%ئaM2a~̓vlFœtܟ;pThꎋfR(4`F%\ `knEӱ?T_%إq/(͘;b"͌H.fdd12$ZIEm@zYmYQF0I$OQ,\3эT,w nJ&aaғƉJa!2;K\ wEFߋ\RDt)b -Lv`ʥ[V65yK[CTz,nhw5хO#j1HIhD)C!Vtd.D6287=ClDlR(;ŦtI 4$M!"n|FPY. Y,юeaدdk4^ŢK/UúPDƤ Kyaj@;LlLe7$!3eb>њ{$ŏD 7M<i%\iؙ]`L: ț-sRf6&c0$+&# !y6aChLGE]\>W/4Ѿv&ň O7 ۱vJ 1hBḍ\ƛ4ȶ0y=]rMRPnMp]W5Mʢfzmn MgErR[>$q;t="ZuE$mH^DŽlyt86mXɴ <*k0kݘOLu1! Iӣ-H^x9EB4|244DU- eXH2O62`Vp{ҐB12`a91[a oL0ŵI1^'2}/ X <SpGSqcc}%xh645|.ɸuX Zk"5JИ~K ::빣lDAnUjA 48^Z$tC| Q''np{U>-cEP/@v!(4`ܐ :b?Gñ8fQfTlYISg$Rl̎b輎B&3"v{F5fv:3a/by;bћɴ7g-6:Pcmȝ!q%@H ]*dcx$S~t \*TڱqQ7ܰYh݇&@Ȍ !qBc 6@d82L@tc*MMFɁJ LtA=FcB]i$^'e&’!fiѱ!IzP,݊YHˣ v;2Um9b7DK";%maoPzbXEe1 uQfѣDXݩ2Q9Xh d݈nBz\l>e!8+]k48;Ajb6jHtGjRDvnJ[G[%Ki%F0j)]#14~/4 ̃B*/+^R4wEx!NKv$-\ۧb%36&ZlvY‚t2ئƮ<X{&ѧ+7&clbB4m# Cz6- -F|D6KG"e'|Fg\,ۚJ,`AXt)dt-Mv6BhЄ,, nU|/IcCnڈ&Tѫ旱sn)<䲣b4Q%@QK(/.p6e%ضll2̶&_&ˋ`7sy,HqQ=67e\=y%F!i -y j([HNSkt-2?HȻ3bc m@gvf.>raI쁐@3tI!R|4< -z'sHm`qZI'$!S2=Hh- D4&хhOBIa3 t=$|A2\K.C1X/*eJJ1z?UUQ<F#YU4+nL.]&3#dlƽeQd_0ft(fE.bCWNGsd̰6/],.w\"h~%*Z sG͎-$nFzŲE&ƓɀؔuU?C^]qGUa^R[kq-٪nɪl^2K hw.試b΄X% $. - ٣ -1dgjdiy0*\n\Q{>/HNۮWUu#:܋3E:=W,u\ѫc `DFٳgsPl\yFѲD^i#͋1!M,>e%BҠi%A;ȟEhS EEs*$CC͇؈UE:)+I eGQQ>-WTЇ8t|p%f7b 97zoƏ5- \%j5$eREYBbYu:3L -o.0)]cp[5@W>!!WMdR}9ThMJ,͐̉J !ؘWbgpJxg 6bF,XQO1t^R-mʑZIrvE;Y$WBBh\cQ ش"Eܱ.;\жhw%vj{? 熏L\ORȷ rARo% gb?e1%˟D̑ \FL3ܗl lMOfn΍-ey>*/5ԙȢHv ?hˌ؂TE(A+7 x,)wrly0/KU|"R "XT .r2G"UۊZNMPP4"~ᙹefйD 4L@ƩjKXjn1sOc {Y"fԛwI=@+3:nLBe -mFb8z-bn2Dt;]#{B4$ҢQ(ic4ec ,hֆG^CD`?NPBY 6\t-&͉d4ц8p$2bW3spod=OPid+(.,{B0B~wI#ؕˋQ&lv2f - i!3rrG'bȋc9ުk$xbqmI1$Ȝ%' -V&؈vhYk'M-gDłljR^O8h uNגoÅbř!b6.{#y.B?fPab. KJ-ؠFŠ AAgz>Ū4FBhE&jd#{ؓ!Đ@bD{]uA6$7! -Ji~MjoNd;\c O3%3Ic(5k*ZlYKg[2dvg -.I+0!E~iB)@V,ϣ.%f lE(a{6+&F$'dq;MnM?8"*$w]VclQ cj`Hhe`L$k!&T7Y3ѓGLp;a˱I{'!ف̋ DFqxC7&o.wKSHT)%斒MNnhKNIJzdaLXwI$7hp$f`7-9 L^YIЧtfQr.:"ԔZIEXS&OѡK43K Q,? t^7=#R,*; -E=.,I7:FCat,-У 6bL"D!Sl8E$gğ7$\k:@:b{0MOU$uRca/(I=zLq -ݲ.8);I6@2):"P,4$J3vJ٣WȬEǪdk؏c8,D#G1Z;v4IK(آYpi-PEɮ2M P.;W6ZXlVԋoj61yB8PqQ~͗R)%-T"% md3xNINZɬ,lt $kwd'fgM(4BSc1蒭(aR$#PF^Di7lz7,kenKM'6/M՘Y>AL{Ǥ|hp2K&x4aMEhY'G.tl%dXC*5FUE7if^EV7\ +4 :'FS^#\=5TluF8\$NY ߡ*L<Bت:Ad v%w2duDnGrV7VR6U z"Fܙ2fn4ɘaR%?ggIhqh vZ :X&taWmё5.Dl] -cSIBM \U 4EmM f5/к+Q_(qq${ L4kFO\wFY[Fj;@Od.Cd ],DLA9.»bhHPN$lCXC3D]^nPInXb4ɺ7K)дN 6ń2PXl6Eiy^TՉD¶4ǡH<4jTY02S D̩!d7z.D,ZݎlZĨQICO" -'y./MѴ&Ftݐ R3LtlbE'FHvPɧfrRgT(LoB^L閁h4:*2P,_ʳN Sv.LՋpN))e )KPYhi, WCbWMo$iE2]lҒlJΆ`cEQ.yC,&gDj6`_Dк!clbfŚ@/THQKUnF66 -tPhls4ɮ1ITW]^ A4L e`i -%77$&K[dgwLzYl/Dj끩h,13:$zEMS5\4hK6g[re$eY~!V߾ DI+I6.V+l 8E٢KhffcTʧ,0h4& Z1,<4ɱyEkLaڒU,"q5wUrךї UΨyAV;M5?f⮖>KAi/MȋMMS o&?GYEy$J//.0, ˤ;BTtdvfŶJ"qGwTԛe[)=#mxVb{8$j*n^Msx%vY8fˣ]0n$-їdjł+&!#c, RQSl',!{W-%jbtԟtM"Dy-3GEEj'e[cݕӡIQMW!d6":M=WExM^p^V8hFɂx/dlP^SC_IeuNe,6ђ/-Tr͌Hb!Sqx/t8%I䨮%)'/ɺlp^GT"nz.l ozE?΂eH=b l.tǁEGܘg濺Niثh5NK+ 0,p7`^Q+F{XSMlIdfR|-tѣ0boU\4e -&v4gٖȵF=ʫoFZOCtWC"e6*A fU݅q+chYM '֏BA$ʛYҠtCJQ-uuFE)Ob&ؚ.= -/5\Bˢ0~MvŊ\x=&tc"HnWQrh":!:H h*d6L*QʹGNՅYW -'"NC'U麻rx.3dtZ z#jODlg=thM+J龄vX,CF1^1tGVcG|c hfdн,uagjb'sL莄w"dlo2V.lv͛E1Gó:tuwfByhB6BrDOuFnn2"ǂ9~1S| Oি+37OE!XbP[FG+tZbOyGX|2ZI1bkU^KSEIIdQ! -"ra:^KTShD5~֎Hɒ9+B[^FX 62O{D'GTy1cpz24iVX6E 7'dT.Of2p\e 2Ġ}K^Qe+,j*brGEF9*gWUTcѱy>4v@nlh-aO/0< "}&aph/07\]<,HCEbCK5Ef35tIE6cxC#WCf[$\qIbȔ:`7D 4lx-t@20Rijl>xTsTc&y.(7MfaU+ Tx˚/\Vfpb\dѴHdDS`ܒNJ)ɽmKj*b<Ctsht ^S`w_Uc!HWY6o5Kpo&;7 Bqp3c&bh$ST%y2/GbDR:X8jTtjuLh^=PT?FѱlD*t3BX&Df/#'n tNح.Rn߆̝ChrX+4v!!^BWŇq؋ .\_RqR3դ]w)1v|KiBB.;46(苳5N..JteXTy\7z]6t`&$,^d-XWE⩄١KQϴP9T ZXqZ'+8?X!'w4MHcڹ HgIڥ+ z1\B))#1 qB5ٳb7Tf $d,:-dȄ' 4hNPTj5"%eV7#vy#|$!܄2YR bA,Q񗁽 -sHg/uuUҬStB=GavjP`fiMف9S Ya3.|/Fǁ*C?UjbsCC t xOT[4lCaCf0EȰcCІP&'b&`Ff-wE\Sw3fOՈMIfp:ߒ͓GLkg}%.duc$\z_ sc4t1Ɋopq8GMSMI.$p؟eo?,1cQcJMHxD GFNP˪ɺ*^v:_y91M3F\u10941<.G|6h_C. c$R0͒'b]/B؈*Ry%*g? -pb]|-Xe'&ѱ^T5KR~i,&\ٯ!୯Qz<NOc6tO> ,>ADf\LM4|4NK*jUr<WfGz3GIYuj -GxO DpT(Du*j] -Tn LX74/jhK7B Xt6H&dj5 &rCr,"Yz7]Ssh\ܛ7Ѳ88fUaR -2 î*¸;DRizy.cM**jIǪJi46#yoVrzntuM[ᱩLHB#64ܵ<2j;.Na&I'}j!u(R,HQ6@ɸ="I 7{AC -0-g@g*eM۷Kځѡ\x)umd bUhvX!𿍪EPZm7"8(;1::/7 iEyⴼ,R$5ߢaR7%=oB,L- K0BNH2ā -A&.,+Vilr%4tDO3b6p E"cQzͩ\]&+cHuh;lB4Uѣu"hgt5fkt./ሻ4cF6L'.͖7H'{5,% Oq)&BSBY.\;E{[(ߖHdZ&"VD' !5"Be:Sv20::OЖH%qlCUGHGDQx6nۡy`Xzp%T.dFYLŤQexVH%0984褄 &'𬥦8;A%mB &nҬBa%r*vcBr -E$h1&$`5jXr[d[dm#"X]UWR JhLb[zCV!"P cEcX1(FEͅj:dJ)83c\Ћbta8^m8F%Q&ǚhX|6M`6YpѪꎽQ >Dة*׎MUcׅ -_ -be #4**15U/F4FbK<e@NWF42<:*W;-U\!2!1mf/b:n\~{M*o\PTt`u\ ,EEL\:dEl!]KS4ĝѠSX*Bcv"ęEIRJWk @\7\]7tgFϊ-S\cZ\1x^$ZI$Hŭ 3>"J6D!t}DDMH,FA9̌ho#6 -jղ"AGek ɢ -H4ݘ^l^%P -%Wq?MydGtE-HcxEĩNѡY jJZ rbKឡTTl B0-\$ r8Sجx&;6#r rrhՋDܐ})8"Vn2DMҹ`b$NXdapv8&&!K)e3crcGdx"d4oZ&ƸnS4 U!MGxw "3I{d=Jh8!0BB?#7&i*Q*h+L\#D,\^1W\D7-*PD+m Up(8 iq%ɍ4[:,}?\uTɮZ\^) "rW1p2O3וq1_4:.hCF>Un㺿\7Io -}pz!~KɗD<÷L8ʘ!;daE|;]xVh!-5;}pU$X^ .XjNX`hsd;|C',I!b?6"Dl24\F892/?dڒvk/|7MXJ^] X>RjR)gLnDdN߱gٖmƦDP.Թ L[վUz MeDz^uLc"ؚ"_.&X|UV/^F99l$,b-4uaEl_- fPw<1⹢I?f,J=j -(QzeݫpUTuO>-sz cC|P -4E] ѐ%$@Y -"IX ILQHLۣ:&c,:{5ዑD -x~ϾQuWhN5T,r5z< D_^% -U:[]? ŢO -H.D!U CC܊@{mOS"jIrMamQIbZw%nWН,I 3c8= xO#z4HS Gh+EPHxcx7 ,z $@X 1 j9בb$J-Ϣ: F$%B0Ax04+$Zo&1M} NJK dؿPOd.\x(?,@HRDVȣ+8"9+dV -V)A xE`EbQI2E wMz&"T0A7qOKd CYmbknGdwƉAݡR[ՄAтevIKYb*.&!lYLb_jkdH,ST^E*8թUwc^%[: -JT EF@Ѹ 5D ($R%F "))v^P“ڐu)Y -X -D'\=UKw[t~&^ -@"\3hfX/2Z>JWG~$gu$\dy\7TDGs׏߅Q"OŪLdBOjJYb pB#v8$*33ýAKp|3|w\?ҶD;%X.3cJhwGz Pi? Բ[*-w(ɚʢXЄ} Mi?A2a ?QV=%aUƜ%(/tY2U3iTn*RC^UO|^k{UT\]Wn) \dLjZʌv"pcnlB(Ҭ`ī?kJ6(F,Tk_k1U5'Ke@ف! 6KXv28{R/bc:keHd7uV(5fe}WuMu~UיcojUd=ݼ:=V@Ž_6,]A%Ts^'W]~ -k#l~BJ-!"I\c_|6kڌDs׌~ -*y_#.:O ⯃n꼝x7uHD74<JZꐲnCN'e$'d9\Jlt.}~^y.\.`D& T$ku"A-*XHL-ehWY@M3*bPYP6 TjIW^ˉHVHIk`6[X2&aћ ( ,BRFNi0nir~eD*oTv.;*xĨ; zZD(!p$hdp%j є -Hvv%nfIRYB$'DLk Ap3VPbL ’ vZ$\SIqv 6aFXu7GĨoX(|XjQd<f d$C!CdQ( @z,*\P7r='9 $NR.d^p\xwz[/#%P.:. \~toy]L~dEZhV,*XS^mpV9h7辎b1O1$lTNn)LdеSD&vSlBw.cWf.j"=_v4؅i4:@FG?l1"K ȍ S7oTg -"߉6H24EdᏲgJ3_Bmhc>} ]im@P Hɕ% > -LICQqz4= Ecdr@cƗ<~$vLFwKa(If)L<1`:a,_ )E3#%4z9BN#`/lI[Xp_ xorKE`wJ;F[#iF1Z?Fi6_i߱j8GvXEʯoA,33T7&a1-qwXg?7=Y'.ƷF>j[,K_/ -ªιosߍr5y20="X}0 >M۴d:.U1)O\~P(ޏX/ 2h_<2W?a[?]5PC?H|Nb=r|4?u\WTlB# rv2/_B:=GK?8ffnlRcꕿq-g8ҷ7`e.ai/<3'ZO2 MK,A#̃V?F# fC/LxKjOQQ?Ik*Yȑgs! pRd2?gO-(0 $LK]L3{1?m&`Əџ鎅^uE-ʃ,WU赨2qAaf#Ek?B~1-a5t_:X-j qФ*c-_{PhyOeoܞW<D=-X̨McC -nI71??KaXtd#T3|~U9 #^<2稱8?EK -L2V -JʍX$Å#YniJfymdgC3Ȉd18|~?f<^)ɰf NR-IJhSLJ3c/u_K䨖ENxB蹿 z H\c,1d!" -*NJ%]\"(YvJܸXPH[TĚwBY2)\gT1--sF#qEe -Nټ?aSho_Y3< V<Ȫ?.C(+U$Z bH#DA I N@$劅=Hf-L#D\ybbWtbTа:4^U|r^_IwU.y4%H92!Q2 %j5qj1^ <(Xθ1pT./LptOo^9U|/7+1^ >;]W~: uGlɾ+Tux%:\#:]?5E/и]Wd/ #T1c"iW^9G٪buy^9+>/*@ cd܌6Qɢt:B d~mp ;.1H[ úo}O'c#"$ .Wg-:4C.Ǵe5W~&kx/Tוx7\x#'ˮlF,;?X&rF$vy%~H?CYclF qMs떹:/ ǿ#I{[SBE'!W~'<:5EF -F1*]Txdj*VD@q@bXdv"BtNʹ|V|nK!"^pB[b}צU\UxW_F c1XrhL2.cHTjFqxO|W.(\XΫjΊ͘԰B5>~,+s"i3K!\ȡ=švJVfaZ"b! Jj\V]j9Ϣ}#4y>H\NRD,*1,A"H'X:7QwMp\7iѮ+o>Dd+(t;t䞛(^M; %*f xedaY~FϮ[=p_u|^9M4@ jH!~¨ -:'@j QV@p!\'^ś]WuXrɱljr^x.,v}/&Pr*161x7FtBurt~U 3^c㪿%Ǯ&nĿ7ctzw:0?O%j¸`%E~MQѱ*kǿ#λ|_7UίGBȞLl^ Gr=ꮚ <;7]qV5]U_Up| T_'`Bͺ D C&Vj]w:Ev3Fl\ԛ`L)a)8p"K5Penș% k Q1"dL+< i:44u kY#Tb;1ywMy4*[yD3mӶzX ݭ!.f$SXkq\Ά/"G!ʽv!(Hl}O׉&j̚H~E̖?GB -qmhL_MJ q"sBO¨Te?YH~. +h-^ ғ#,+gXHBf.2Wf7TcQ B.Wd(x a <+E4@L2Yk4R km`KDb*B.-X"T /bQ$1/VF)@ + -$ IBGkBQH KqJE#TCa/wJUB𡏆TyCu#%ɉb87 /ƿ c+©+U1/>WU^~Edѣ\YO'MQqA4.oWѳE >k;k(.9f :nɢ>Kú? -$'tɿ1 -k ~l6tEM>[5/E/W.ni3Ẻ -^gٿu/ ~n_4o?"xߋb{X+&4r#VԌ`AsYbHqoA3d(]cg\B&d\g7sA,~;opLxȵb͉qbCKzL '$bOʹ{BRRbz !#d2)|MGRǡ~[Ǫ 4;RXlDAx$k؅TD%q!Sgta<\H&EQ7`7яF3T*$UT~e|P \Wx)Q"R6*fNF(ـ+RĴѮu{#蔒lhZ"!I9dwLpa((VO&^2b\4 Q^d6ס\%E,^i!_ -RNIBH Ud6ftu,- -#`* FD!2)7NGD;.>+¹[Y"\.qX:j5_| 6@lb/>:6>ppbF96>Z5G|0,pt Y.|Q" 8Y`a"pJB 7i)c^՝fw5d 苑 -n0[wEF зBj9&qY \t|0á!I dBXkr_6NĂA'p2)ϣB$m DFaѱ4QdV)N)@J,bbEBf!jPߢ2C8_iͳ] 9CP'|(oE$BI4e”lC&+Y`')bHͧ|St27_#؄%ǒl>dHNKI*!dߏ~9O% D OUt-ރMMhF%S14H/GdkH?bC_  shؐV/" -Lc$saq䜏؆&u#Ƈ $l#N#@g4P:+$$"(#ٍ|/ XM1!%KsdI=u"E5^̍2%уءd, g*G4m+#X[-=1wOJ1B6gѿM^28JX jeI!44g#(SD BXm9_/_TYRp#h"z[O'2!$DZgD}ٙ6kb|6F; ,Hfȍm{jC$J#쥙Mh" $!IRѲvCŘij{.$' J֌0j h.#2qeH 8[DRH-16qA$둢 Vr"@9!+B4N&P6_^i%e 2ᒢlRD%eNhX¦6sdXr4[$zhnR+>!Yz/D&v*;ʪ"U2Q LcʃevWbPMf9!1ALbMYp9hKd,f M oJ,"H;4cD Q4 d/F5! r-,.3"Af!Pf,V<?`jXuj!%j*輏8oR.Y Ԗ9!-%Д9aGB$K r*wK(nGc0,^hb\Q D6A px;lyg.x3Vx#ةؚxf鱚 -J/VI.x+H\t.klHGqU퐳ԒYvWWsUuv8cv0.Ɛ4p9X8PD@ѫB=IdP10liRG \b'w 3(kB)C{HwyBxoO#BCApN' ` UVI!1Ѭ撧"5U\b_kdE%i'P-2 8K1 PضIBP"bޮZ -.Zh[NCI~*J-A89/q[5q͒!%)2}Aisy6Y2D -"L˦fdDh EGI] &#$'AM80۟$!e욒l$vdJ:̫1M4dVeHGaȂӳܨ\ lWh،兒i1FU!?FఄǞHVۼTLd bŴ4 )\!%d@R[}٥{b`BFx"5(MpƮ7@D_: O -aI!nz$Eق -A0't"{⃻. 5HQ"d8WF߆e}D9F*G r@1ZF%P$Rb wlIP:JLHL6JAb]D˶D9ogaЕ^~٬,] -k=.&,YEL/<bB8d+! źuL\e2vz'`!jňXhsK$ӳ1TAxA?M+/-I/ Cv;nP'ٙhJ@5(ZВX"ź$$XF'IZZ"@k#2Eǁ"ȦLIgbQtWmWIM%$,e31\&w;l38 - TbB,i7%lMk(HrWha?WBK@䡣\7Fة;@ǚ:d-XJqrĵ0B&& !QE;L5F*AuYAͤ$hKrɋ%,qz*qt\EE вhPȸ$B. 5MM\E]WH#^yB%a Neꎓ5ŚáS?p7qdi6Eh\C)**,bK kY4hv;m$  diHEBDA1$@V4.ZsߒY3;n;P {8⍗1+1ROfd ?LrMM$CrHoD}DMSM$RD(H[,_6з -!$I"ʵs>OF(UB$k]xF/x}tL> lfD!Ңxt7= !Cʳ"?koaTLv{U/!. }!DQ1lMhJ3MTU涎k~-pk|#䫾J,/$^Nv%ZUz/M h잇xпa p)ӒPĿC Av[6-?Em5E͌\Wr |'W?|V'CމlʼnRj n!XXIjHY Jr T"--@,[&v7)$62̒/#9 V1H1"t< %MUt -"kq|_sDExv@t,Fo T  <"\uNo]t> &pb㱝xVM_ɌxQ( DīF* \ -$bnUZQfdӊ6:jF77%t^HhpV|-ըhtPJOв:3@oś Y`CIO"%+.+"d-aQ p{ ,IA+6?Tњ"oߔqyW $<,Sesc΂xdNK)~XT*lg"$!?dp|"Pa⣥ekS|.wSuv]B~5>j5ztYǎ gA]1Jlبi &=XD̂{X ]+"%cg[r (VvN#mPBh\SgH [Hбx }acKIfpIJŢ_*bLCS-bHru  B /($]hG&qfuJAdE0ZʣWrGy0wy WÑsSA{6 )r0,M=&M6a|J3v`HJ@&K}Eu?1rOvW?k,R4@4`lIV=nt\_f_]O[~Óq]_e䢚Oc -h#i9(dB2౵xL/CKJ4GRʋe14.!<\]?ص07m9DjXGC%l,0Ñr"Me6R,FT iX)s(hc AMo1ER9fvZЖa^ R˰aF1bI (pvQϩEĉ_.|FJ99O%ȖMNI|1g*fr` 7]"|>;wy2D%X>,cO"m*uK,H,C؃K^ - "@((r\.Lz*U.X(,.yEA̔MS82: S{ZIy iv!85Eef+@-|3w ID7-"Q% -%e T"cd`l RĪ7Xp -wPafpy)N4XPH]JEU@EL=oHUF0 -_Xt\;9DIr=Bi*VUD`v&Qb YL -)FٿJ<%Gnh& ,:!)йf SNB-ak`ZcJ@u ؋c^,m5-rQaf>2#Rocele+;hc ^FrTnXkSSm%; kb}GeDY>kJp쫕)|]ClLn%JUqPAݚvaS*WTZɥ\R G4tQW#w -;Br:!eTԮSq'}V=z1h(\59,ЇY^!`͈pY5dBe:V=S>"jGHL^Ll I#^ vq,.VTZl-Rρ'vDiyO镙pE,ZfΓ( #ؙ4|^. v |iSe }p6fq _%;Du,4߹xF>.YvheF&=lىe[Iw7mNЗŖiyRccAU/,2(9OI(X=;4`G" JIG\`*XN{Sr QT.sG͝gL(~ }@y"l=N;lD*R%8Kbn@`%m)JՎAv^de.UҡƧV}.کcN2U,@%l>lUeg BEu g04jKs[p;(|i0+ -Tf36 ber?Aɡ0S-ts-P<bQ)qDOEɘz`b?`j6Ģ ALN] Qɵ Č9;߆@2 9%#P2F @NGR4j"60 E`C9=&Jؒ ;r6B`&"n5a1!qF .%(˂'pȚBaG -Pk%7b|jX>\V]ȾP@RdNmH ADaDf *kO%e _qR )D&\&Ή؜E q( %@{ˤصW&?;L%_ IJx\aqϏ*yQPD7>}ڗCd/"{1e kORC)S1w7qPqH1*N15|،F̖7 } >Z 'e63G03W,EQuq5݌mmZ4VaoajUĿC#4pOˁ(EO!OvlN"Sj =ow?آTUJ'Hy"ULlO#t"6hc\qԦ@C;Oao`}?'/chn]45&9+gTK :І?`ݬ1ĭa()c lϩ](Bz.لQlV܂`smρ 007QA -|zCemJuț gLK *ݟ"C { [8D9Y )GQNKe1[=JYc=xDT }TϵNکLXTs |-Q'WSG -_WCtn 4,*M|64dey/L!ۇM:M^&PZ" l"}My7WQiPbJvSmY--Q]rRD0;D1`YՔFQOԓ E\%Q,iQLhJTQB, I"Bm.;pZ<'r$On+Q,{`5@,h;(/l]AP ?DWDZZpX>姙<>NȟYeXZZʗ.c䷚' /BrpiHFn!~)hEGC.Ug_nde ;'f'.M K4ʜk2=9sd~Uț72l,~ /b9 e "؉XgļGԺ-m?YC0*S-R@%75 /q;?v-e9d|/)p&w$ZN'HPQt^$ q˄]'\~v!U$ }e_9*u1;\VN ZF3,Q-ȶU j^ġak/b!iUm)4hc %}̮NU:e.>^΁v~D] *(ի"Wsf%vVk&O,$,BWsr}9ױ(O^P vsՠHV !!i622kK@ej%D!+7K"*~M?"ZK"xx3J%S^ -la2Y,#Thda#{*Bar;#TCRfv}%.YnNdZ YGj9qQGw=pA,%rj(Qʗ/ ]y2طMG܈)\,+]ÍCQ:"a,dbF**#-4B,% dN_yRK.aQ1+MPr'Z@,[)ۜ { 7Eũevur+eO߆Wr]CejhGLt29Kq?/)o:nzCbԣR+AHSdfSb&2 a&I*6!b(*S_<*9WjI.Vzq, -r\Qrrp,ؗ1)vݕ80ʖ1smA@v3P7Ĺ4Sh5294@+,wcEy(nyi)i%͝~*tJ]a%۳cKMۄ gYb"v I4%+c#[Z?ga*߆y.rΩ\BPb/!m& H%5ظ0zźg3CaCuK(t*Hc8=L64VHYpەEXVVCwX:K'\7`ȋv! s&T@3}fE5 F9'=LOgQ#0]DP1 k+S` =}C*x Ky-%pq /ur2U u8.R9<\;8v#~Kge\y=!`W.M~{vY)gJ ~Naܮ5S̔ dN X e'qy=JPT/g{*8a-|Tvq*Xqr߼ܦ栟N35Ա -b/3q30 WTMl=q.p٤o]|_sw |ǭP(Y."m׹o`qTaHn#p,%M1%{\fby+{W @*_"ȶC!U 0xʞ% Ju:ԩ \cpDAry3x5-z3S%-Xn("I:K nÿde %yDa= Ԫ^1LK++Qs'z䬎ys/g Z_jN%e| -Ñpj6P;jOn,|*zE_ .Ao~hWir)g//юV@Ҽ -ΙHQO"dmY?C?nRE1.?ߊ!rS'j!E6)= PnnAhGOb3ZARNlC ^ 3$/#3l?MP z0%yu+WNʝMN3-ElEl{iuF܈"(I`8Mʗ`eYL1v.bbfNT3qm -g`PEl( |rXdR3_RA(*^Ԭ.Q,:0 =K콨TT!rQagR}zƲmmEյPhyr*;;pt'YPK/s@>w@@{Rhcp0zY `[b`~21JOnU|VAnԞ"2]յ#Y6Jtw"Q1POe?d0M U /ʨ6]V4Tn{* -#=\ )5Ribj/"^|9DB,DB`iŞ| " -%^H].-MEQlzt( -z|]OkLU,?7S~Y÷p"EY1>B4цi&efZ X jT)({@\8OgI+Hdd`B*r!|2|y*Oمv~{)1>Ѧ4S.̆É]$nKPJ/D1lV<;=YJ.(R?H_=F{+[f*`28ļ#Oj%iVQsHT&}+qe':Qlc5m/6lӟ 4|y:0bȬ}#k0v&;er -,\.R!WTAt-S0Uc ![K'_ЂF젯Czb0YSnEw2WB.̂5Q'XDr<'Eۋpד%:@{( sόD>)ln E,2ckr*R@^Cg<[K6R bڔK7lջ3Ki5Zlm[\Ua߰xvSʶƐ4O%n+Ej*PR”U0F#K 3zR3L~^;y0߅E,`B |))~KTEȐ$Z.;DVT$q-F0PFQXpqKJeJy*}IvM!>E\(M˶xG/9T)JfJD>( 吺l]]@J6~l6 [#QOeq%/|LlDD1i>" ڗˈ?2e;8W9P -Ot *_i܀ -W(RjjӰR^NW-W#`}yjw,VZaDШ!q_|X9q6 ΡG Ur?8 j上lJkM^L:KWɁc!(ks%C| cw.x"U.o3&Yn8ZNďer!lJρW{g%{s8(K_`w -a=z8i<&K<0EbJFs!GVnP 2&zu"j3 ;Y -/ mQ\$[x@"0wY}%r]B,JTDg#abʔ!ػ2S.,+d( Tᒈ`R`%'nmn\Gey#߃ ?k9dQAOPRP>tgCN$*K`0Ea9ڀX>]tz\Ag%;t؆aΩ)CPBĥvxa]D}ܻ{*@952"m**?ςәL@~A֜a<&2-TLGe]Zs o5SJKet!.{.2yiLȻ:Xkwy8& hogSs#uqJniaχa_ +p!n2}|**xΰu oa ;ώE*r]0?*2}OX8l_eimbDu)%_cŅbBE>FZԲ_!oC;^q"pz@ )s/-ઓT>6VqApngqgq|E1ȴ9*,!8$wpW8M *eh?`eÔ)YĩyQNs"{ )Z'k †AY9;9&PA޲4`en( -!vv1s!Z#;#U<[4Ȇ[]/õ/#}B|}e͢x WHC|&1×}!ڨMmO(\Zr -ȺΒ7:rbԦ6и` ;)W +4:]ű◩H_H%ITmԭ%6H|LTD6ܴaV78>$ ,}Rтy/,zGGme% NN;2m-ʬ%Gӑ3+PwؾFOjuf ٵd6~VVChju\OjT\ -Ia VX7Pi.jA`K(xD#B[/ -z~.DV?ƈe$ev%PQ.xpTS߅펎AY[":GO@o%[hw,%x:Jr8rqGB˒|Ҹ A+L"JwSnFaݕf' 2^16{ Kzbv{ -Z/4 UxIZK-݁V++gSu,Kȥq{rp{RoѶ GjVe k8|`-":E~e2[yn :L7S*@Q."Q1>v\*4i_'"&T.?1|U'NB1=$'nq:e -DϨm*}%0tj"/He.FvZdz\l&0\ ӤrQr.c]>!+U gH :a<;)\WyPO-+-X7qx@Y-,UEp~󋎛3al@a4r䢣 K >U\GIY#+y(%r5^!kW<6/{˧ϹCP-b[u/,_ s޾ j?dpV\cPjYHI؅Gg +1[c *G*{l%M^,xEchkp|`{ - 5uQJȃB*hFuYW1Y)Aw8fC -KF;`BV_2+cɗ"T(|H"2rR(Gf?Ի`hAh; KtĽ-أ.}Gf CP?QP'`|b,A Ɇv؇x_Rn0~C\ҳQ9*XfĨ:۳Ob30``֘U&@_QL~W6]?GJ)?Gnj{*<u#*8e:o nHl+?&^жQr=aVeu3IߩB8_Rkq' \3(&HT58V#b2.SO#^ڽYV<*8%ˀ"3:J0e$ 7}Wtz@IgQl CL_"TzOM?#rQT窱0)bO]rv34Rh;`-ND5͒éSbm?M@ D-jV:͔`¯VW#ˏRYQ >¡*#z2@Wn JJ fC:(ĩv֧YŗJ9ˇS,.lϿ}_7τcz0um#C\7kbZj6UKث*+/AȲ*ea]'  }AZ0Վ,a^wD.$JɴԴ9iЁ}-?M -&1훨y-k0+aB\>0%(c#i=HZv^բ2r]t*WGV;v?` ʅKbqoOlZY/X=8#8zlGe{sݏ݂Ag.aT:y56?8C߯kᎨﲥDI1N0{:ce|[XL9 nQv/J~   Ma-N`! W"DQS}3yX"SQh+Ccsǿ&[WBJfď5/}6*o[`}̣Ulwp/ -,>%6Ȥ26DP"6h*m=g߂'C*>9 S!PײACLoÏéBB=GTF˗yu3>yZf<[Z%cFJd/ řVېiȖe`esqyS<#F"@0GLa+ex *r*}EO%Qr<.*h߹OeJKҧW,0,Vy^CSU̩2YD>.!+ntB|* =TeR@/ZieN8°F6Qh+ g˞On;p HbJ;ƨ.jn%1{5\76}ضrK<[G{>nq ufZ>2r =ɢ姒_ܻ}>=y-r?g=[RfK>ʞ3S -}>k~>et>,CH5~4wՃFAU^Ţx] 9=.3V̜u "|\V]ǐcPЕ&2~Ҽ>=#Sc%|0Kj'gd%Χf ۜWg+ч>NvLnjߊ-\yws~0h"2?3Ժy50~$eK~DsπV%E£{53`ec {Sj -|}rX<\/<@-j{); - jOalb/Sς|V|zISǑT|lV$Yd\BJ.`Yy e$pzcA!'דKXÓ]Jor_VH!!<`3r%]2%SdG 7t,#Z geKvbdn8(9 -#SF' \Naǣ.ۍ1n qdL evͮE!)zóԾ>"| ParzKUSПQN?%v\=XY < ` e`ۏ6\'~Moǟ+yy7h'NO% 3e`>K"{ȿQS_D, Țe7 p I 2&ܮ0`;R5&*) -}Y2-6[+Q=pj{/GXB;p(9`49Gmc|_JMWY]ʥ ~W -qqϾN'ta:2hW`ďj*UB2py^CKT} Ogܶe\0qZ%geFV^qeŴM! I{SG}ژvc>4"Y4F(\*/a~!qgeϯ/$ڕv9#;[ߩCDW2.-<ˋWyGg [s-SCvn~[B?=DQ]n5s1>S G Tpqjes|>N,\W7a;?rÊ"8ÑVlG{5W4>xmO@.݄Z%{peٍJ}A.Ea,#lmCX[ RN'OcsAd6 !˞)WaPo,vnBtv@[bu#TH]̻.CGK}6ly+/gH_v;uOϏ2?Sy_c3Օ9?Ϩ4KڅǹP%**[H%|Y Xcg=C2ɴOR\r>7OPߏV@XfZߌB<ȓ0|6iUYUKV)qvc/j%0Hk%.^|3ẩpWߏϯ\cσgGrRY(GbvR6 q4v15q&͗Yc?-l!pYmI+n<_PucїL;+6:'1aGF#~Du=I9G'/aP~y/AZ,*(\`YD1c.fIj,[cbC'{+paETk"53C|; Z5yBv=YğTwg > -k8OE|pYj`wbfc] ayXT"q{\# -Iv.K*{qaePge.e9,S[/2>IKᨑC5P\`Q!.6,Z"TbPGLZ 0X@.Cț:;( -#~T=f2T@ʉa9;R1a8EU#TG݌.=cxaZ 1|\`eQV,N,Cn6~7-ñ"S\qvhr!g r -0߆-Y/t%63cpҥms>r{qDR4¥Z0̞%AYoɰR䣐Np jJ*|+Da͜.)=TK,.=SxUB+@TI -=nWJa >9_g:_ -M.Xcgt2a7U=%=[V9 -/*VD27ʋMpf _6C -~<Ð{_F2¾F4 sEk%R GFvoR\~ʿ~˺'pdUBcKmG*We,q7KA'~k_H%E(i[gP@S5p:J_"_%WX9F41\fi@8)/Pf嬵25[5O;a?"/qXgB;-K -cT`X,O9>Gev@_#ڔ.ї9Q6R -P- -Y -2m/&F$0g+⣔T.W|u P|\&OIT̬|+.)Dr^6\:\Hnj"3۔Z o=h"҈ۜיw6oðV|Ѹ7Tb% y-{Ed~QDp%Any -E`_LGJmKKiƵ" }Nfj -c˗y>oQiه6laAD,Kc՞.W6"z2vF 9.a! =!Rgj^JO"VKr]>_/֢B$>_KJEΘrtʢ̙d~ -r8B\..b_awp -{Z,pqW",Qؤ"s9]Orv\W -{+*݋7E{JK* X_!gcr!scwR#Pŕ?nf9? U`Y_r ,%O9=%qYɐ&s>Rѷ"'me5cK}MJ 5::\nYsj"_L;<\8֒17_d>&^Bz6VYgzCcJųtyDň'uaLB\85MA->`#)ww [bi_ՉqCvT6ٜc-O*W#ߋ}OnuWσ;:7.v7 ? |ip'@=߂%=D!:ʜcEŕfLT4KslB< Yf!Q=Wu+MivƷǣsbWʼ -1e ˌK-P K`)y-9d@'-ɫFUg.*w U14= N GmKF$hCweB{, -[I/gLF+d#d?PՄhyH+g$$f2zH5@ElZ2) z -qUHm@P쾬c o,."?kDG,M'&RXv$iv">d&Q %dy<;g<ϩa#ftxO0ȘD13qr'͸_/Ͻ>ǐ_p/`FnqQUګ/s \.=Cĩ)#ΑdmtG^Ceq%-S%Xs /"+98I,2< %fK)./Pā?#X3$nB;N [RlOY=K|:1ܗᏒ&1KPI`Pi6vyl#D;+aJ|QZAAn$>nQb; -Tc GnUǏ;^E*8] &]:TʖVFB vyp[vmÄʖi|:K?'' 02T`csL{e<rm^? W_GN'rOryqG69<4?v~xK$Sq `TD臬 >1Wr>/"͔gn~E!_#A2U)gv/.= ->Yq_,yC!0DeD;5-[%[%nHFz̭VYbؿ|w/CFhش=B&i+H俊,~<VU ka66Eq9qlyC#.d}+mr?']Lzk'x -$+&AEj׉9 zF`?&@̊؊DQ0ώ& ͇,O=>i6h2#/+L%#j8>.1ʘn -aeD}BY표PNXd J;*fĝۅ.~ᬻ ߂=l[a>(~܆Ć\~j=2rM|^|=BW!Hwyڑ4&y)0%_H^sqgS#bl=6ì=Ncd}OR|JE6Ywɝ-j;]J4?xLaؾaF,(tg Woh ]Ɖry6Rױjtq_ȕT;v.b5?{ˎKGC쁓߂/~/e&95cl?ܧC9v\+sm%Cy; \~þDa) >|\|m#"'2*9.br\YeF^×JZyۘ琣1sTVT!ј T 'pε:q88Nv{L0fDOeR}+n?vy.Y|~k#c!]|;B [K8̯pc>O\ ʇ%{FyUM4nF #e~Cqv( YZ| %A\XKD0"SхKإAL`*䴟{(P0lC9LYO~9Ys|?'}*$F/25ߊ&#AρH2K+L';3ό^Fܰ|0fJPgcqʜȹSiSoǿVA -QD뒥#/ԁ5BT-Qg7)-\%*\ +?i}Xȣ;\7,!цAa#DzX.C-eӰQR ʢGSjȪ/a`PZ% )X uuy]Obşp<>(͆!5dic`|!u2qEeDC6eLv:c=|ylY zU2lƫ9V!R-O8Q0F9XvRF bزJNd"j׬vZ4rsK֧0'y@ c3Cئ{3 `8 ˔:ť pЌ@L:Fk~9qf^cA[~ƹdOE|%ʁ&ϵv.<>?>z18*/nypơ-z@9*zF0*Jd+.\XQ|C.Gk\5䲗Rl -qwc!Ew"M!\Fv9*d[y6KW^MhmuW2BÁ].MfC}0; QS^ϨR߃ѹ\!=; {5'1J!? )x}DJa~+?-T5?|p7}+ 8g)pe! S2!W6k }J^Al4.R[5}M1@EJ4=}!@2?ѹQp@n쯻(1S%hO3Y͗ʈF9e9N"~L͝?RYmgˢOߓC#+G2rzMOa>?p|ygϗrHK#c?`] 䭞M|5`!qvg ҢC K \ǯPp -J"]N x|eSOTV6\k208;;q$!/2b"!. `|jo -0"hܭFDz9qDR(Q(&HH@'s0?Ħ~X>(QWXfE%K=I\"ïq{+(|n={QxA%0W$3c7[ ?%9eQIPEZx_ϰ_aNG Hs͖}Cӱv3Rg*osceBReuqs<`% ߃eLjA eFA)l6TJG2=yx­I>)Z7Sb)C:˿y Ǔ> \ّl%~~`r\a|&.Ri8W!rT>FlF ˩_ISMl;4r"=>m\U|.Aò'Z9p`ra\/ g:eJ80H^LT]} WYWF5!]"LaClFm@bn& -%K[?e+XXe7az:-y@*#A( *@-+ef{*~fK}6_eǖ|8K`E2N{.CvzJ% D{ߏ1jj]CYơڿ1 awŇ2%Ry1Bک+LϹäI1!0\t6BݟS߅Ϣ=X;w*$Eo:J§D.u.0JWL+_݂zDدY .`ZI .?4{Stz1ڧnq wjŸ2Ƒ4#"f,',uP_p9B{.G ''݄9+~!*JYqd=2O\v߃Qj}1+@+%g'`b|tql} ^ZcďWGS1%I@̀u/ ct#쭂eIß$sC .dz|WQ* J%~%2˟URR. 9\%zY_yvz>R]yg!9 ;qG>ˆ|Q#]$V=&|\7g Dx|zdH|+`A!:>*i~X .79P=#(?l\}N,$! WȓNKڝj$`ـ &G~[}Q*bcFaI2»)#O9 -x|r3}gC~j2%lIPyS&6ӐB ~<@6lxp-'zO~ -#_~[Mf%03*Pn=%Tj^ܼH|c^Etߑ^\]LԢp=)%UE

oܕʕZP -P ̏MVTuG7mIGc'9,Wc"|D8F\j-Z> -/D5~/>=sr`# >Hu/&|cY*l_ Ð=e!/cv5l`kƆy,+TiPpgC2GHWǿDzȻ.Q,C=f#>\~'@3gUؔU&F`X395#Չ_qDŽ{4b]@ϋU< G[`B1 p;L8G|{yW-vت;=r1=>>?|59%BtezC*7.yyPg%'d0/#Q\#p,F0g8'Pធy}G>g>+c+.y]0%B8K ~oϳarٓ.lW!}rsL0C`;pd!J@gz1v&(=zΌ q>idb!?PIY/R9r.{p\A˗n`=ct1_gZ|/X4ߏ>2\[Y'U"~SOI[;+@K+߂[U+5:5.K\yB9a Mf|V_noŢC>6\ ~!?q^j=7ɱ);P;oDz͞MMKe!XHM5VaH f!jhÑ-=#Rð:H)D P (ͩE~r $c؆PV/^ג҈Q Aڜ.*{Q!=t]Š|e6ZQ'I}ϭeBܻ_/!'*r S7ln } pgaֿR'E-]]>F-Tw>"AvQ)6<#yD;/=d40E r?:K,Y Vqcu+ў|{ \RyK2b^Cn~ŴG| sgoT\ișS>"-hOt#U P=T;D@ PINFyG_PWɍnT%H'%ˈ}$ʗkYyDN\{cٕWQ;|}ÒF}D %$B9?~*5= }[*gNA[nA&syKcFR/ZNL%Oe\T98<[=ͪ~=`m,W9R_ KY$6:}b`KdFD6BĹaQZoɟ q'Ւ>v"w*AaĀO_ϊ7P >D {7~|~ ;s! %y9;%r[@RfEWZ;yȼK*:ʁ6]K9qJZS).=y$d {tG؊3́e|$l{?? [@겣+$^DU.1ز%_)Q1RW fo 쯏2}Fnj> -$C>:K[ST}%=sr>@>Mj ~vk/gpbDŽ0 uZ^p 8_H$dV0y 6}Dp`QtMe>6a5BkM_HRvd#c` nB"Tmy+QH  2O1Ќ}1h.E}!;CZBUGZe_T{LmV|>!63 ]'+T93Gv(%|{R; -\%"!<<>-1D- &ȕuJšrg*7R? AOcR51ٌVu~JȈ,\ljj;G='i7)bGz˪>˞"ÃB9ƢE|h%$#}f7Uj*=3]ﴀjaa7~T;=F:z2ˌ&0N_a*q~+㤮#/'Զ\a8eð8AOP&듟W2Z3k32TaKnV wߊMXz@]MPjň.w!QmE_@Hx  #/#=$Q7M".dcLw>H2TAPXn;*EZbA#a#G ̬T8!*yb|yr#ٟ,%B<>|gyoϡg!OXKJfs>.l#ڜuφd0-LV@cLB4 ja5 -\3Q  ]n*_Ƚ¨i(кc:䡻h} %^4$,[RS]8̂Q}M. - FԵ3f?FsODXTɥ}Ez<2=:In1_'1C.M[߆~˲\ n^yP?e|ϢTW+fˇ~/D9S_!c*f%\brT_e%eÒu{ T%G#]Sϔ\e|QG f=&+lfCF7L1,?Sā@Ce*d|߃ܲ+P¾ďW*wBc>Mjw\"<'c䨗>OlX{>:ճ1y.7|o0L[(qv7gݲ,yϟb_`w}\:%ܩ첡WԦP:|?B˅dV[*ū~#_ tɗc|i\}*/a4ǭ0A)YO!Ncd6:By\7km c(57Fqw % \7e\\x.ِ%[4Y/ciy > =%PF+ʏg DC u -%N^@'=Nݕr}F_|C6>6\Ķv7Ҿ@mgh=`S{.rWhy AQ_cRv_ɗpοnϏ^DRa8H@6HFp k  -Ū% ?1ЊG%ݨ2  [YG~M9.jOb74e˱`YZ -'>$'lu B{χ5>yd8YD' G,#R/˞g/a8 `V̿0W+Z\^v97658d&K2u R'Ruc{#M* 9Vd&K`5= %a5v310G:Q:GӋ"MQ`<(߹l)m4rPNyGQۏ&J%FS)fQ(1~cq<~=YrUnx/!ScS |lan- Z!teDxGJ/߆5R ȂNpar&"K,\cWC.4L{0v -\؜`b 0.AU K:62ΐu Dq `&-zK/*r]ĩۑUI`pֲ^CaLT9 )+]\/BmAbA,e\˕KO%,.*x|ߊy??VpT\H6KxŜOc9.2sؙ0%-!sɗP1 -(zCaF8s>-dy *d騼Wg3`~E aQB݈`TMCD7؄eC͛6}t*Ul=ITGHDw`Xr^%l C>TeJea1-*>C;.ᶗ2[壑27l9\>/K.`e#2TbQ |q3=>]<i. +Ov-0Y ;Je먕bp.0ijZlrܹ0˞3JYT=qʋɖM?St{;|0"a(kI7b0La|kr>>2ڠ~vKD=_%۬=6\ :FAYɵߌQ8_ 6!R;>.L8LJ=%<ȟp* B !+& }Bw=W? 'fq(!}6&%|8Bx?DdO"uaYPKZJ>?"^DAìk`o#b8͞%/7yS #{P62}@b| m,/HBԲ/+n͔8˃G1y>=YY-߃Q>: ˞00lM? -}*m|ȵP۹dQԨd68]#OL=^ 9i7:ñC63˂_eNK>/bp8 /GjM%SBӧљ~+%Y*MJkV~ gBL)ؘ1-Ğ5) /m!:_A𫸽EH'n.)>D _ -G^FЋp+6_yvonj|r=>غKJ61Qk@^'xFnLXS*de_URO,n -FqT'|RHو4<|b[.{7،ˈ]JjTϨn?Rz]}l^Ka*v=%8QSU/vrq1]! --G{6qW ZOH=aV@gIo>&+; -KTD, bB]h֦JڛɕS?d f)-e c5.GjS7K6*3{='*[9HHؿP>D鐲탚ͥ+w Z~$VySs?L Ke!*+*],˗Dk*a'34~U˂u/`\9+5Iя('Md7;f;*~Gʏaۛy- }EH_=H`䩩Lv~@,>ϓXqAk̀5q~BlF=J '.+6]8ʍlk[)㒀=Dne>B3Y'ߜ?J#! .lbxd`qʰK wIF"#q"Tk\#Ԧ*LZ V򏀔y6B;X<|eP[j"y,p<%_#&*\pJn_Ȯ.U:icٌtlSf=Y7nVOdGgsG+ysᬛRptρDHMw6+a/*>z`6LPd>hc%QTK#"k u9PpJ0-F0NZ3 R%v -&A^`X艵QH2x-zJ{ -%o\7ʪh6ʅ.Q3U'CiU6ݍ z]@ŗص.<3!,'ϸuʈ=2\\ULOÌ3x&6&[*~'gA#|L f\eu';*߅u.ĎBŅ_:=?7r.j~Ro! -|-Qb*P ߂Gr^Ư fܺM?!r&[soĶW'02ײl)1OKQ}۰֥eźQ)nm .βȎl8uuQSbDo=&?7>%Ph`%ǟXڟL ċQ -漃n1_!pT pFC95Q;Ԫ3_ ib\3ݕDiT v?!;.{rcV]ˆ,*.͇9+gl N%?>.vp]%O[ -\,>%#Irr:R y(+Kn A/<$S_ٵ9 NQCũ{n.S)1. =HڙT9+u9b|=#[Q,%{)/TMϏc*%dL/ԚOZgY^ʅsD,;8r8g"eXg˕q2mE8JghO=#vʎ\Z8AI| dmV5/h< ^: -)s/Dj}H q. xr ځ+{ [ږi -pK,,m>?$(~_; "_{3Ѕ\v Γ)uȩe۳.<͟r~{ -a(kL9''E̅1p3H _~,'qeq} U­`&O bǒQcRP^,Y_hH"Y=YH6RTh TP.Xz-ىZPPFiAdJ.-rϨ/| NXK&D;_lkWE8Ka{>g6 sV*=9>>/'[6-Aϧ2y -a/αRMaTW{Do5&]=&琻>B}{+m!Bݘ'ZO?~ɴBy3ځW.U{qI.S,B<{  Yo$o``Pܭ"ί)=uA>T;7.} v¾:7y>#X/+dŞ'Eʋ>= 3sbgO"_B4B[Qem.fGJbjZ0TW6?"G @#NTy8bMƾd`2n^BI|F흇ٽ)30J-[ aq.!Y/{@pg64evH&d\1/Zr*{K粋v[gǏc%m6 &]_w+y C~NG8MzKݍ-.x332]Ml~,ȾO%3HN.d-SP|gjPKh%7\Ŭ&_:#f-ȡ:Ms2d\tφ5ΘxKZwZX 0?)U"lSevU  -E+{PblvGƵmnj[9;z]EYj]1{R;<n== -DK -PLYIgbg߁80y0G33apn-A5H1琎5*yR `] 6ȶ۞O&'G鏑G;1x?NMfzǯd+X]E99&5*k2V }xF_%XIhDǰGSpCAMj!j-1ˏ1Q?1 eS\U!/(NET5nFtr8قPkdʅ+dl'y+R}$Kǝ 0M3L=.m,: `Ss/zǬ* f5s_'^JjQyL xJ+Q60 ]1}T%?0ȧ%4/"PNfꏦmԹƌVWNj{sYHDH7'f -ZR\!dHxɯ1.a%=%$iSksrdcNEZ$ +oG%Bl#S͔G}!"Nrf4*{wr~.-9;0; !?{ǸFtPFsFT#9%C'mɛp|}˦lXJ!ٹ .R"8LⵈV" -ժkϺaJٌl!*5 pzȏjY p\Y,H-|#Z6Bj(hxTH?!n/`I>0N?SeUG=dTxJ4ʁ9=}Dkn{gԢL~>S+TK!vˁ`2nyɬNGʆMe~- *? 9*ٖ7USla{ʕ'=} -o*?feUsb -T6 ߍB&)fS0O`!mT(PB^K1}>(j%)e.X"jۖPHŵ箱%06UB%'r~>_òˋ)0#l9=B_͙ =XM`M#;MdmI>\F ).pB yϊVYpU£MB;80;Rau#G} /ϩu;rHw'5~ n_6{Kn>HRvRF>3jD_S -%\p73%((YsȤN"'0OIsR~!ˆg%:eOj>//q? [ pW%䶥%Aorx|;q_s=yp.y!@j+lceL*b$0v_Y ؏F'φ/|~_vQ _P'fX G7D;a! 7S/D;Q|f%g˝2ZQrkyc(*$yR++u #S,!줛W8]B+$5BT#IB:6\buB5d%<#l)E/ԫ!ʏ!ɋ~@Ptpj{r#\3`gǑÌzFB+p؛:nl$!ȷϋei2G .:F5,ðqq'dbx55|Tzί[*+=26)d%6u 8 q ʲ~м_"/H bOUC 5Uc(llF>ԯ`ρeζ{dj9RF!T6^PJ*TH+@.ijlڄ' ȳ b7s鿄ʸ~<-T g`+ (OĖiaZc2HKfCяʺk1%=Z*?Ql\?*ªW+fOх4co_+S#VJW -yP|&3]rz&GR{oc;PP"̖X>.=:6%DH:}MIzF}Ge!>BSWfF}?C_x;"qq]F]Y+rb|Q-}b'cF5YRrVFu`J 5x{v0;2**G\XU*g!_bFXjVYyK-w'OmaDtO TA̝UȓW!6=sRIBq}9].xFYW; -=7n">8QNڏ'j~>u/ndZH‰-(01s螢ρRvȚy9<>96g'dۃKA+w|P>peQژF,m@lSsVZ.mM.dpCT 1z tBuzB˟G,BSw6L#*RKbŢ%W!SeCW uHב.!~ى9ػ%ήeJVKf3]+er{3L<\l!8NV -)A,( oacR ! -D-QB?nMKu|\e2<#`Z1mfĩP#l5Q4Ԫ;F)EUF>Prb(JTdjNuzI*&ntVncn=5Mo=ORf^xUx\+|mB~,t8NT@QdqKU\g\إLyjeŲyO -~alHKIwɦj{95#j -RR}}f_coì -^Gr%Pt*Qc|_~s`콩kyY0 du2f"P-%-ʼn'ԩAV0UCԜڕnCdEgEҀ2RVߢl qc2 -VC^K.<&_~֫Rl(IP-!-L y9u4bÑNDqB«"X#g#F/&ͮ -y.yȿlX#d6B: !$Q=:Y [/أģەIQ #!fΙ(6?e=.>G;X?Y-IaE&.}q`TD]m@%쥑iYZ%q.<`KDbQq&{Uq2s)RT=n'ªTȩ_ #c/hDCLLM6.ZF]CǓ6\ƮeR-!+v4Q1;^!,1/x9,6A6 ddJy1}cz!O9cԮl.9<\瓌O&+yQ'*'r=bL+Q-?֎(_6&RH;#Av RH - GޚBm?ůFT<.?R0~Af!]dz Khn?,# ʉz|_=sa҈×<*F(1V\fxSWyy6i#elKIGL˩ܳ_Nd#2by% OϢ<*.E|2y`@;/YP -#<.Vv)eo)UGn2.vXvZ؎1\,Z( L d@Hu[d*D%@v>qMB-#7f -a)Kyx E_%_'ܪ琇Wf1 |9HՃw,%ϯ*j!χ _$GRƮk* ZBjԫ~CvjN)M>۹enev?#dLSv*w}Wgj~" -FT~/B,M{X0VzJJٻs^LC?gȴfpAnv 0Qh>O -S.& / E#/n )=O^fS>W8dbW#H'do 9k9=A\Wܖlhf\rUkp{$AE;]y?[c~44-WZٴW i ^yp4fl4;6>TB$n5;iIZy A. B,:\B =?%\{ - =Pj(gH[(3j{b&,?ȓ?~(᪖SU>n\X1qzPAĜ_<NgGO~Pr,QfZe?oNh"Q}|5sԅ:^򽛕2-4T4e;TH,T~ dβvT]͏&L/Ó> 2seОCӓچ[e: V{? UTZTDFd+g` I]} u -9 W%t5iM%S)SX.]̩y7/`} V`c7HU?.\X4 I!{jU&͋a>Inl3"0j=> \g-q780 ,찞Cb\ <9ʦJ.9u)m\JJgU*gQKBa0~lk%D*y I9=Y1B0+ҌUkxlz:Bv-ĸr_6, ҨAQȁrUMAR^X4*8">(gK}\:CcU9siq\u9L)<. J+W><. -9.:>}Bb <^L| -~ -G @[qó2ˇ[%ߓu?%YH1/r^Gñˇv7/7v>De, E0y!.sd4NsK6nObA[ǬLU4!Ϲ6r|R=y Taq[D19mh7%ʅ1ڜ%ň%FۉIF/a*RJڂÞLFqF tt}K&\*mAfDrA#)ᖆB א|Kaݙ2ueOOYZH}wg/C/K]rў{ql1.9>}(]]TQy'*gNJ#? iWeIvb 9 -laTRff%ȖE -4ަL1je,FCbjJcձ@ ;&MT.246GȠ6ai!4 pVL\ 훛 -_#plȆQ)/N2m\\ =g`c>lCC ]\X HlP><"i-keM6Dƪy?#W#eb[#Bib..}CTUϊ˪Hl*W%J* bk2'yp1.^~_--J̡r9{4ς($* >J0 -Z\9y;&J74A%1 ҮY%n<%6n$HWܛWR0._3-I *L.Xń5!ԃID_΀A,mSڜneĮKuIPк Yh%m熘qCx[_:I(X%CؑPXpگv<5԰Dυ&͂}Cr=[P v*21RҞNYrW^T.9?#|>'Y^Be|GˉNʬd2}`+-cy. -UyEKK\c%܆J1Zɗ8WC!YěŷKQZDJ?G[S3gILz(kgL:U9!W+c~^rG U2v" ?Pp'KOt|.8|<(MG8M8GTX -O<'~%#`0ʹA;n _إDpHSDϴrFhҹ ua*%|YBavx 0F4gy!_Oȵ-܂9KSU[@+@0,fG'FK&NBiQ!ñ6P#~(x'W.R3"LCGBȸƪpN[4 q߰v2% iI0JbR}Zߊ丸 $"w"?qЩ\)qw(*SY* Yq.bvBu%Wh_;?ke%tM'f\ki;Z\䧓 [L`>:X|s,%`֦L\YKmC>A>Ž#ejZ8ˣ'݀W;QTv,bȴkЉMm5("4}l95v);ʾTڋaE9Y*գ-5P/ؚf{e@6]̟D\.}cڗrrmT=?'zr`f/͢(Q5qr\(?+K,LYEVVM xL wpd0 ̸A -.q۳H%l@ DݖK6Xk^aI?jG.aȰaB)m1@#b:Dp__Dj< .UAZ3Z$ vdp)-#ktV e#@ÄZgI_տ&v4װOq#E6nd*P{ -/J~GcrD:OE[04adZ+Cv28vX&-ypʦ;(үIz% ZzMTz`>J&| ]i}EPn_- -'FiYJ_vfaqhqs T#߳=I˜;(gAR RʘvUYxM =.Vix#Ɖ&ȍPǕ㐼*8. TJO̮J{\M$>J*!& Yd.;IK(Yzب!YEK,r[Tc ^]l+rb-y Kћv0 -/ - m,C(92L\5se+d[A: Co-!(KjAy<`U6QRM%F1OU.)F7(* NrS/XHXغ y n=!u*-^ 2N -!ȟPRy푥ܱBD>D[ow^p.W/[c(ʄ|iDA_L6:YuGjԴOj? cH{Qm$?yxG* (Acq_*w8~E^8jm ma`u;a/&SǰݍgIdb;Lbk%,l!CNZ8x58DýL1K[YQT4XtT [. YBZ ı#dak \KOj5Kwc.ءaMB ]C\dž | f~n"G* -(QgcvpBSe QWSCLҠXNG"Iԁ3L3k^D0:Nk)71؅οLZbR @ wte2[ aSPQv2φ^š\gw&hG&%Uvqiaer b6e7$X'_vȔQJ-jqRgU E[iP'Բ#DOfܘ TMmMI2>DUr˚8+g%1ŕ E -AgQVW ٖ;ۺT(eA_$ޫZ *"_X8.r -;%Ҋ<@F+vUآX,'b) auu'8,N'?Jt*wiʞ1W¬'b9-^J/ D CbMOdzͦ2}tedo1Z.ƾ`x( -eVDpAK+֪ >^A1ED؋däó[Y#ZB69;=/^vlOQߎDr;=bj~.W}Xvt8aȚ`O.ڵ!u@{S= rۈ. [iB;U! -_}%J*mC QvzKH{= *߇y ®pdiQK6ۤ;=x }EvWcH*A_} \D0F;p2~gZ,aKɼ%+c+#MkLĂ\K&pd丢$F2'$ebb DĂx2L.dFp=w*T;). s+G%h 5aMCVE G/"{,e FeG?P>cȶr'"lCEYJch|cYSҠVٗPvR,J ›3׈3PatY-!5t./O{,`EjN {+M@aQ -IAF{ .vDrxJzJRM R02Xm MB*<. 9 -|+A es2tn`k%MէH#+Z C1CseZ$}Lpp(,dT'V*J=8]SC Sg/JALe.WjEG{죷1A -qp*=/+$ME×UK6**qk˜{sc #@J<ވ1B{x] G;Lp*/LL]S.)6FSEBjdYPfYAB PZ Iy֐ATCZOR;X.y!a* -XnD:Gj ]!ZP`2T(_. ;rqy2%QD? oHnP+H:LK@ѰYCR|  -?B&T0/IPʞ:k+d]uCyIND\YFQ_""ڡ"0,>"AT%_ÁgDeOYE -DQvtPKd]TðmClهv7,U{P-8\9I?2pjA#)9:ϲep\k>.obTS NV2js@JS`bdj(Pk̲[#T-SM(%o ̈ݬ^ <ebFءr6/jR8JMr ͮ!{eF}P*?e 9;RVRإM,R%K40%G/#3c-dgRGMy~ʦ MS0DKʁü2eT .~BeP2gf'83`Y 5][*9’[rTא;?W| $E`iF7GfmԀ͚OT%VPVZxJ&Qq8y:Et1ɺQ}biY_w`Ar>tԬcny6AA#b1(/Njk%|_ {2eY =uTd.5ArXSH6i[ lc -">`Vq%DŽf^D.\ -ID_e_\i+-N1>T`~uYdBuaq)=gO\m#U,0I3s8!.A3[yi7LJ*gN9aɥ JMM\FRwzA6U`UONΩQ[9u5*n,2aʞ#{451l -v .`İN e,]F9*ps*-]n?PUU;\b9aP#Wl^kce,B Ztv\`ݕ.c%ܦbJ-TSF\*UgM&%$"qtt.Xþzݡpu E,@V՚r6"JGmX JR!YݸilcNŸ*~ƾoL5;eMZ 8#鰋A•>QKeU"tRƺ% mu9)Zݑh"QKҢT^JIb&IkDUU"A`n.etalݲ>[;!AXV"~OL0'a &z3q*->#Nv;WsA ݗ VR[y;e8pD|ɤ`W -aìT9~j~;PFFCzJڀ)j`lƦu1Xd}EcSx"ze |6a"L*ؿ.!rDO@#Ғz+)276@ -*@B>{ȇ) vV\{xE¹_'ar-E.ǝn#-8TNDԱ*UD,Py6ƈT{^T]rgp7M^,N*{b-HN~XTL+ u3T 5Civp -@UerKR=#QQw*4c-Ds[Yaܺbi 1J7裱LMrn0EƢvƬfzN%K l5DžJ3Q6Q_#=^B݌Pj*Bs=fiC@.V\1 f]&HruV/F1-YpDDLK -4)P^J||֓b&4mUFnڋ@T3s9-ܨZ[ icRU߱0}6Wn[@mm]JJt%^ -K+MJXjҧ:9'@nr*%aHn/N:䪕,.YRn}vWHWz &f \=[g%[~Mb];j9M j%Kt_&TH%A/I.Ȼ)2(F](H?% W1~0huvR##w;,&JBβ -ad^⸽e W+iG Oz.0LVB0I$\cuh5aMy-j/Kn!P5?+ʲ%rQ T@i -bSEnvͅBqsUk])$eP71lbױZ'VWD4܊72XG]vsb%5P;V^]%%ge*5px2R -Qc:-QAip͍bqԸ \F-֧]de -AT.ȬxF b^&3 y_%DN,Ew,m/ѿg %'6 |Se/iW6_%KD˝OЍ'PTa*g=3Zr&JEjW!zATt-].h&uGI8KD"xbo$Z[H.U{(تQˢ*("aVKGg@_Xj(k=i`Z`:2 Y)5p%F8UpctE7{5nV*kfUJ&@8swH{/ȣ'K(}n&1@-YTB7c* TdX ;!)-NO!h+rWv\Z>FKjױ0UE. 9;hZ {'س@-gw=]G{ʅxKŏ'FfZT$ɥ%սuӲ-xUHA-S8 ʒ _x¡Z~r5t?s>EQq/Ll%f@ -)"rѪWJ%&\{rfnɠq ob= c?jإO%.cev}NjÈv+Y(BY0vxša#Ĕf."%i OA[(3HU eʎ'ϱAuA,`BIa l u[R?݂`<ȓ&ϳ^TGS̟H})w{,hr8GeA['m0+bOcG&MG hqp_aZJdeک`ʊiPpm'I*?JJU,YN% @q#ܛfȹNT{[5XUlR<&jʗK[g[-[B0N[DPX7e#…0R֨bg_X4OVKiuTؒjQ\ϩEPw" gSaX.؏ -۞H,7;k.Z95:3Ϳ CVKUݟn;ώ^dhUM .-U@{eCA1G-T$ 7W2c<ͮ8\2*tC?2-bG=aLM[sB{>+ؽ,,'Gy3{ipF'>#=*_.xjeRNF cTdž@j)%(=;8aT P]cW0-}1է"TVc=b腣 -="9\q)*n\ʔwJ¥ ōQ2ȸ^rܰ3IV#Ee5<9RP,vX#Cc^A e|.Dʢe~JXf!DoA?RՁȋ F+YN}T;!`L1yrKLzJ0*=R+ *SWGxż [[g5JJƊ'@(Hx30v*,cߴr3]a3rΑ`4E29,4)u(,a9ä l.ȸP[JSPwKn;=!v22`P}TcWbyRaU*ڌTXr|cDEP7!Fv:?Տfh"uq m3&P!k?aH [cieKS/q*klz$6/@O(PRא@fb_%r8֮,PQ;-³&nrk^0P,>m/\/W Vݱ]Ek&6QN1l#GC5 -6\ GWfQgpwG>j<RבWArgLQƀ,'U2vRS:/4PjȨptFV>D,"W*T:K;PJG_XOJe3QDyV$omUKeM#|opM~"PE-oSx94*gSj7E̲P"3l2"0A@@X9\(ʭX7L&v;'4W91J^4'iG觰օBQ"{.{.vN aRa=d]2Vb\W(#jg(98r,;B&#)u`|o.=rSh ʚG Ǡ0qwp𔻫HDQ7 a - -Ծ-dXbZJ1gg5KXؘQoܦ4)u1AH{2NOԧEz͑|yQwoQq#sȁXA h[HsЍ"'eL>tڄPzNq`]`_ܢ'!>,o%P~ӚI}` V}`2ߘ"×I485r.%"jFHe p eNF;_I2u͐?[$ pU0A*-IzWNN*%o#佊T{+rV#WζpD.}D-dP hʪg1 #.}(fwʈmq Ap>)-B.-5Ib5Y2jc& o% - -gn@qv#D,%e)]]OT|:8E_4j"B17ߗ"sF4,pE^@pGa[`f`)]ˌSYT2ZqH"-{ -J>~cJ\R**i)(4L5I+2PFX1s_+"UhBgDUiu!5<)1+xbT]EG)br㑑)UNWޒ<\BҹM{s -:/g4MvmÓc^JUAA4ͿVj`A.W`C߂/`Q l@)VuV/ko6rqZ`mP%2?ׯELMBMc<2=TJg<2isHL=ܼ qzDM%u#cC"~T>3bˮ0z"@x6 -C  J|1,J6qAC0Ц5Pkf0E6hR[]RRs— !C/Ĉo4c"ie +PQʧA/Bݿ[W*4E][JeA+" )i \逡m~,&B cbGHZ!sLX*tlRhuJs:=eliߩ%l5jj^:u߱Xa)s +,]3N+` Tpv~ھ*7?!: 3e1C4B]c>FedXwQ"G}ܨͺS(edN8}W'K'\b&@ `#,ћRD];!ŨPKoZf+ - M]欥aw)X±}A% -2x=R$]g -16y*K^O)L[%bR'TVYDyǬ8GIKvnԪ -؃>"(,׌,8mÒfiar;P-y<,o*!T+'ViO< -'Pl"UsM=@O(At([[|i')FB]{6y6y*˽c:teΚn hUJz3Vـ "u &ʇ]#P -kf@ 0-oI1eB T&b;Rp:WZ9J(hCCŮA@cNBpX`(#eVT4RbUQa]Q(}E1iUܽ< hKpC im$Gؠy6/h; -L6`邩g#l+"? tT!Wbڰ!BdA"y ELAs c``&EX<=6R, -c-a&ɒڢ~%`mҕ#ҭA~K8Zua̦4nK9Kb)9(eNJfʁ 1eMDia[XMJ{tgS'uoYCYX)lK?YZƲ}k@(.w -sJK,RaUݱ]?xu&~`$.†fp޹ YCT(XEvs%]>-j!@}R65ɫ*e{y3:ʭDf*볾SX–)]&2-l!8oNNJe *}F6]b'( 좍tR(Vg\j QJZf2/)>E u4E>y+حf3reRTqL*a{w L6mBƥm9 -{@C.*Hdq>J@* -QPYK*U @ؾ!IZy\c)I w P誎Pi6YD,rL{&ћ -@Vϸ7ҢQxɭDy=(Ql|H]70q{ 3Ћc"`$BAcY6*p:7v,h)*4#nB{֣( -nYm&vA1YB{DSjaK{-@ݬlKۛk|_U-=Vk63/!t%A*^Ó3q@_!v#nNeEt_JLȶCyV{'KH\aq,kp_qFVGȁv=_eʳ'KcsK nc6gŴ">+,\~(AKV*EԴj-Ve O@ - S-ʫrE+@ ;0 nk2` up\]EBOK.>A;] 近R<ۙT ہqLuqdi xG߯-ˏm%HةJmǚMBAŪr^a=4AJd_r8"`WhjTEX*-cGzư܍1 tcj4wEL#b(.kRuxlGjJnv@+2'DQgh\1LMnytF* -2qL;xS0N3*OB?#<ܨ+y0pLL@wشRD*_/KSeC2=V'|#f7䪐^b7@DK);όEovbbhLn0N{0fjjT ؚxTD6l#2ERX&ig%-iK~nMet|Jn`}: F75 L)>zb6'Q;˻z PVV![M 9B^%A~Zv CfX cguIY7~FE!X -IM jʯQD7HD3j*)L(]$ekv*""f_DU@xyRe.q̀ifELnXR)H/j ! U A?بC-\XȚFz`W$!ڎZqXS8\/!l&ᜅ>wAt Xxv4+GN -,>U H7DĀ~qv(]D܋h@DoƑԘ IiR Ƃ߸ooH[Xۂ X‹D4j#zlv>ZgV -8YJ;4+"4Qc'k؁KY\jثܢpɑH`++ڋ(iz%O+'<~d)$ RrTT. fAC -YOɻ)"6oLŤbw-Ը:/RfJZeF\i_dlhKΰ`-xA -ˁFgErs=7.Hj˸'GNUZq%Q -Blh4`ik et4#>$菉+%4aII hS}OrVͨ;wi|)bujׄ +ìC,KD7YPK=.Fn:A=e+zDM\x8#O\/P?we,b AFi6!B`{>ڢ$ 6؅דnu㯲)ĨshD9ڃT~P ,)h=v,>ӞGj2 -KlJDZ%(%S.(f l*0Jf)^F -<)^CRۊh;5^L2Q鷰e%5YKuΏU]7AWA 7J8gVm@ߢ(8&B@<37Yy^ܺn8/!p1JtFK1AdmQ/eefL&|UY [dEf(K I4彍{ -t<.!R)4̋@J{N2YQQ貝$3^9 - e%)IGϵkZxTZQ9 iSIi{ȵv6ʩuvd;\"W!)c%Eq4d2J4v[d+ԖM˴b rh(#-  eeJ]JSRO;(j?H~1%Á.7İP &&*rIq/X,pڻ -H&q[+.Rfɀ7Li,H\C,DȀrX(S("gX`\]nK*%cVn4 -ljrY-t`r'JeHO;>ÑQ TQؔm9[Q3FAi5 -2td;z,tg nhnOA(&tGb3 \#wDRL.i`.KN[%`Q-E^MĦv}H=YKX9RhM4W W:,߁5 XNʐN..oUB],dկf&y:4(@]孙 \4O7%/AP mRHCOy=U1 `zl:\{RB>a3\M6 -y%voTNT='EirA- >HB+#k -) [H7p>R,tK%?.0.t9P-:F;=WwK*8BUx7>Jj 9l:Xr,@ů"DR(n8Ƨ_ jUW0~@,{"e+S٣dgR!ԠC$X*pjU0>zZB&>Wُ*@%epy"ݳM/CnQj8Yjh&X][c}\+BS:JRdN y`Ms4^>݇lbPTU)b. -2%K:Mv$}c6 -ZgP2w!+bm3йs,:DktXVAЍyTBRO/#Ui:!uLGږ -B3Ĕmg=nyp-P%p\r]-jSIOyȫp'ɼe_pmaXg''A~oX>J?eN9{wKCk~(&c1b/X(.NN؀E!pAF% x+7 5UP@Kc=AM#>+mTjjή  -?L1|㇯ -pj͉dZشIH߹\ DjQh@'i/Xr{c@PsL7I:i6c)7J W NxTNDTZ J>pVnH؅ Fa**BacK~8 Ze/B^lV;J౉A=&J  SmmFl:D6 Ya)a9'@]=teYbKrXJqpp#HXl:UAK}Bw)zſR&846QQ%|";@9W VZ>v(K\M\lث. DWc1ag"RXX.^5$4Q&EY>r(HYqDظA ytSR՞t.\ӓ2ԅ/%-Pl7(0[I^Λ͘vy8J|R7>xv*4~"@*#v̔jj뽘7zAW?، ;VK TGw+[y)?0b7] -A_}4T6X.cs@=Q#SEz(-ċ9eQ꘷;ciR\qW"QdنX)V4䴳EL -(%KeR%]k niZD5M{bUǰ,4_eax";r}ڍ]̢G.R!hJ0 y"Ey Eh7'Xk=e%,W Qnƨiѹ¿ŕu9mp8&3N"b6_~vb4yO|}Ԫ\JN:Iq Y\B) -<UB,}֯%J}Ab_ATZ{*^jl@ iUr7fڗp -PwRѧ=pKg-묵yPP~ܳj)Qɏ*#RU!vΪ%RF={,yQmPtmЃ욲xW"v v mpPobQhɕR?一cuTHBNJګzJq*Rj a2 nܙC6ZQ-71TVaˇkiH/d6V_#ȸTuLaOb (l}UM k*ځi%PD - +Chې5KϹKjm }ܰluĚ.dtr>J9Dxṋ_%핰K+Y.+B8~suȑݭ)P0EcXbap;v -3fX 9(az6D \CG]BR-]bK-rZ\I_v&ڕFD[-FN΄U@MQ9h76t}}A (#62'? U)QU&o5ELۓJz#e#S^ű}d?`n]qB͖B}}LBOt}l fKKP{Q(\<ȼb֪bn≸?b8 }1VKͅe(-M+`!r,.aU Ѝ5TݟH -bimJP[ ZKªZ;oZZX}!\98DZQ)IJ(uij4I\5l* Ua4e%?FXb~JS5U䫍Ad0l^KG XH1a; )4+VGXFZR]j!xH-^n8[$g&V$)'ۂ;.*lk8LxgTŤ@kPvxg@Cip5TQX'fSg nGI#Z -\S^8MOb~hbe}Arj_e ʬ<j}(UFEA;(*vS:K. DToLUAݲMsDTLb nՈ\VHWs}`k)O6o+#uom-Y -"؛G qh(찵hC-K#~''WqU٧aKF.le3W -- NR QLU"W.<7ʒŌR&2h]fќr %\??Hڤh -TTJ+GƢ؁ SH -2W[[}wE! P*"+U6B M +V?N@EbB7mRi5LK]jo"OeW.ƮenO_w ڿk0:PS`hCnx%: ^˾3ujmak9mhTQ.^2^`"YʊjfEZ<v + -= AH6l'q¥%kfAԠ2$9r, -QOU+OaDjCW+YrWme?J OJ,k/PmrWSԌ9K:͊9 @"I:EM -ciHq!7x)4*j PMQ#,hK9r\l"b -k ;\g4v ճD\f?vǸ9AA#<&|f.N'Ҙ-Rט4 -"..B -یA -wMI|j1X4CJFeQNϨqj^!4*_Zm -4QY *>Z `q}M@Si.PU}SY:laA/NTAto}jTFn%J`ADL;zi-HO!m@6G~6! ըJC ,&DqƄj`zŬUƮ]ƫވ_!Q -IòzAGCmT6)[s}hd,[!}#8Zh`,>QY3#BS7.ƥ0Y-UWp{"imFr]L(B -[ct(ZtmA9 F8 e,`Ŏ'-]N4TH䣺RyKRk@R2fE,@^1y:l/'Իw*@`8@{R%dUJ!x; -Bq\-~vR B۸RnŕcbX oJ֖jO:kfUF AL&FZ'V/4'tRvZA ~q%& J!DZ jpoeJe '% JJ%r @| `lD,5fCAF1RtjW_#A`>e+߸@JzE-_BRDQ\ -'B3DŽ$Y-U mb(蹅} +ajʕ}eƌ\Zـ/#Oe ȅϐ咩ƪ -UZx/т.ʊcvVKPJ]=ob-؆y4%j(iUu"cDC@>#BouakȤ qDtGeTk -u'͖{N16?"ͅ}Y2)%6#b^E-(ג[4Ak<(cpԫ]IJV#o"\q4V)QĪhЊ1'J{".A -[,hޣ**KDDM`JT@6fP+}T\xHiS U*WNJ)ZʠT,4+c^T+`(;7H\bQwؘmK(7ws"_N_g bF*6±VcGU(:J&"rШmYCM,%¥GRXYAC)D?"?ٌHVtY/T[!"r}GDYY h䯤E["%AH64Lfض cfyj#J6]?`%Rk@h).!D:IGCMK-iGc ɰ? cAGu!q/&bp67A6ª"ЉJ$yRn(T!i=6b^A."j߂ܘՃ>`ϳ>a>qꀂp QeȣEײ)C}/&`15 -* H¶Nkl/\E K4%ki՗>Ā9`x\ġa!d =.[ ",%P<2iE;LXiLl -B#OJ -r -[X)8K}Kh=AȽ"kщ!eR9CE0X/wyMfհx@Z8Kp<&;6D6(X4c``r Ja -3-|OyHLlV5:dR[QPȊdy^%Z%R*[E K -%e`XOBJC%e*PP*U(uLԴ?j=01>GZb_ȻEPGBK?vؕ\FȠ,j-l_XPSn@[ݥL Jkaq`0aT`T0d(MisBd^P7J#E\~GALFSEB9C=m.5UzX掍k!SMi`pd(بض|˅W[Z:v!i4um[`Ǝ(2 UQ舄7p.f)⪩}FXn5.R!R~ij=Y/#H[80 Z/?| s`"p(k6nW&60.gA`õIJ#p@]Bɜ*V&4QcBS ˅5cۊeg%&B X%<{V#Pԡ`Y#_J;mϐ^y# l)%ܣobJy+y"6kuFP=e#Auח˕l2*ؖQam>W,^MjIN -,$dolm -`CB*Ж-E<E!` ST(}hSj6 7g(4 2UJ5W@] _Bsۖ4o` sE7T.hܡU/^\;p%SX]`e_~ k;e#.]#Y0WnUaGYl?B(]r/jXyBnY')TDU@]C&͎G1,F&Z7*?0l7Xv(>{V…a[ss@Ja>C~ y;>MM7k ]Ȏň9 -LLr{{*ұPxE8C$x{,aydFTM+ndVvAj`6Ԯ`ĦVVQ,r"ĨB^ UX4 \;x6H[x`-؅эDfJQ#QY(#9ڶ ֢˘Zb',JP/6ڨnn.9_ȴWՕi5[l-wp2DIy9W;|}I1 -A>hnC -Qll46ٙO4gaLG&egP1EW&W* bϨ^ A qmF 2BDt#b4i -xEW/ /ME]It?ah߹+k1 -;YE QLĔn6by?, -d-c"cb rg*RzBwROlHi=`rH*٬Rbv˞FבeX[b7R>K!We)[o}lPV][N:Ȅ7SXh1tF.ض#DR,v@FZ_;}a1W"}f+Z#rt?q(GnL-7-E;>p# =W5"Q JFP'5+?<6UI~``zBD!ڏAV-ep#hc`bCnšڿ rT%(|jɭX(JԳ*ɂeЉj*Դ:A `wC|]7Ȱ^GPM^* Qm~)J=  $/o{6؟x1|Xi:H -R7)4m2%2fRPzVaWP5uH@ȭJ -'C6k+ur*k7&,*L,K -M*)( 咊}; CUcT,^>u(tn]scGkILې p(P!+֮&Lkb1,T)j+ \* r -J Ҧ1H#U7J DRcl.0\<@K>Ì%Q2Vg$jԋ_t7T؀ H[x˦@ x+YȮNRײʨP^Df.ƲT+‡2\aic]ƩZȁ^Vbf:AEװ0XZYp,D ?Pk% $q(}B aģ&qkcv}}Jo\KExL7H -X #)syp,ZH_ 'Ш £IhVSTt~SzK̽*Mo is~"#i | ؉GWBLʫW'BmJ!: -di+aQ*5p!!O"ZmKB(ah"*)0V "%'{1 e650 s䷐ uΈu|`(K#djNE-mKZ&T(bN.Om `1]GH W%Zǰ}UBn+t2R o"٦y F">CP^٩ۘ(K`+H8ecGejF#raqּkȍDv>7\#-)tJn/Dn?*V4T9!PV -,Ta:=~q]N-f -4H$NK#YdF5kZbu J%Sab'E>%]f:]Qhfo#FܜyWl]\j^7 ?%D]awX -&.+ʞDErsw`EPATۑc6 -CC,Kh8YNCfZ v*̔4@AG=mm l۞(+D=ٳIY*)r*6 -²zI)\ -rps,O`W&T(&+`H#(wP\6;".hL\_YHPU>6A/؅.- E̊`6(]ڢo`YW)qjUwDgY(rU[qK).>a!v,H(^M^dVUo\vX{b '$Puu1%_ iH DAYw\xgeTTfaɖGUDZBĺkR=2\*n1l¶lv:+al9 Wb#\7 + e%"i4 i}\m'=IOn qeiLkv*İh"2U9;*rFSNJ!}` -F)t"AEmq@5HP#Doܫ/ -J(=ӐDqQ -B˙g-˭K/UbM@6!-0- (,A8 qw E˺(+p>. j oljZ+Ka ZrQ-RGi3좩l{#u4v7 ?gZȫENbٓKb"&VPtUPZ[|w=P1x@c^(e8JΥڃmF޲wR؝K#듫٤e=kmQhXN%\Ooe@4R7?lKiӲJhWmUe:*W%wn CcE]|fA_?QGg%R}JqmW^FOZH RBCa!aqJTT6M%9ZUvKuVBVȋL8\`F@J`cnШ5䶼S W3r)ɝU2|c~ Z]4ϩZPn)#A|;A^l j/-*fJ UoX3FuTF9ȦYr>`慨\M aKi8 >@hsR: J6O4R~&(m_)`]/P_q'[ɋ@oV[5VX@ e]c:*e(5Y)z^`*PrXӫ`]_IJ@'G&XU[ !Hz^zJ*rZʿ Z]v2hp T jJ8>˭&8+฼a*wnYCځ ,(`R'G. $۫m1E<[(;l"%O bZ`3VwcXnsx*Vb3u"}/FMر\9`RaJEvz?^۟ _Ry8/Cy)'P#}"5:{CnT=n{*'+ng*{%G``:O"1fNOU9`[e@"kإ3S45WN lOt1[2QW+ޢlJLR#z,( -t 8MwXPk)P_"Qp!'IJz[bK^/SAmorTrm\ cTHE 4e,VNu?"^L#y:)X)*cŬ %Wf]BhTrЍ-+8_ B%RGjWʅPbdlxFF؇ȫَ{-U1-k }Ԥr U`1`zKyI}TɁR/m97xE3);P®K;ˮZ*dT3fܢo0 9ޒ 4+i&PЩBˀ)WdjF[6U -5>I V% $KRg6b".)\US߅IQU[E-H@jr48Xmnx,\:B8$R6SFd\ʒ"!p޹ 軇ٍ'mlR>b0\5h!v?"1.REKxr`W҉e":fݺG:M `'*)QJ,+Ӥ-L6>g -"].;jɰ 2J-܅ -i,!2ahPYĶZ`Y"/'KV@.EP7f;GkU~2ȋ^b``ΔU%ZS@}&lIc@ulH9bPR=lgEw"XaF;Ʀe]t>K3Rʃ(y,xȴӡl=TetZq*Pj%_JUg1ۅ{} ˔UBD[EZ -Lk*\TWD_gamZRhٿXE4좩J ;Mf'%XKDSe[z TjvϕAV\=w$D2Af=܁WB}Wj+%ikX` -R'M[( jY@V1KfRW*P`*˪3|{JaThi)L`0x/_P^yth)Mꓒ*[v#*בBe0% v[BҢfx)rۈ Tlev-W|J -bJ/*)b+lBn޾XgAB!AĔβ3HnFQ:Ab8euHIQ,qr *܅5.09)-[p.Lќm9/5qi1a-L~.s.Z=(ƣȗ[/aGpy-n د++%ڄ'~@HEGՕiE N1T<@ߨ v"TĄ1,}g*nF;=oYQHv97da#T'!g+ -ʖ(5)wLCX٪R+B4~rz¡}6AMP. -^X ٱjF"P )QS}b:Zi Mab+b6@b Ț)ƛ~O~;E^JU.ͮԴxfK^G [=Kiu)qtSis)9ܴ \}V/k~@˂aA ͲvZ;Ȯ.R[ ;w~zs7ZK'YJ;X %ۘX%S d"78_BS#hRl0.}L5,kd U2(VKq(=E)C8W%#j͎^yq¢]h -%ځTA-& -; /r2J5LK'd.4oL!6tSм"Xa)JatxƂE>ƬEK*vzţ{עW&z\&HϬᜥՖ#h II.v9lڹo"[3 Q.%(~ź50&'pSz&X(El>q--}AؠW"6Y/W η!dFT}mElrTl;q6 B+Iʢn -يtlYwnw"!`N@Q|Pd/PjBrbEVIJw%1HZcWV>yQW IzPd_B -YDMP@i+jJ 1e bjf+M Mq4 hAA) &?H6S#ARr礶ī wk&V4f N,Ԣ 4s%4tڱD -2股W !-^ܷݾ8D:PRה*ԄJ@al- - I-⩨hQ䲆|)~OI8y0W)aQ'@P -|bI\PFA\ 0>Je2ẅ|b@S}}ˋrGIg}gIˍulCЉƚȋn:d`XApղzQ$^BFyYEl%YmMα yLXz8:KjvnV7>#tVQ:zxf(W!bP*v - -ci!^nYMdXDս %r404TB(4T,r+K4"U6UAmJX)Pn.LJ"{\WT)b] h=mA| ({*lr,hC5.u NGCQټke!s ;ݨ+p -IfׄbmsSEKtbflUZ.2QpMIYV@Ɛ%Fh QIOe v0vqOZP%C,Z,1E)H[UE ~ /,kٵ, UEEA{dʝ#jP.؄\ -X,9+(uhjqW4}j1]\\a -Uu-Y%#ov fK +Y iͷp[ )\mё_kU.9``koYI]7 S>y WTQ(*1[r tdx,щV(sm[{(Zv[:Yv#@ȅHg=5CD KFvQ_fgb.0+'LN,v8WLPH&D/#}xF([k&u]n6Jvg#^B"_@%llH> Qf#1!A`nBK^hυŒلh)0Oe[Sm-7m)c@'Bm.Xe)Kє ^ˆ +UTKAt+'(\0TVU~O!@ uQYe#@b#VظWW>[3{K%W:촸qb͈]|v9d@c#T%{js!vJhYVA,˱y/cC*Q.A)T,c'fcD%Mzk ʛn-ܤXdr♜ E6M1 W͔k͇mZJYW T*} y-#E|bhe(?SXl<,:N2J$9?\{C6OG@pR=RÕuHljQ--r\2\bR86Q^4)EƓ#HS66zWbf0j FNXӑa\y.; -,b ~T,;j_"PN`T>2UGrTy`=:pLa'r+_ʩan#bJDn#:EFoNRB_^EjLrE@qIbQj7՚h@C2&߹3`G2bRPTP2#q#>}hB)t:KCj\ v}ubp5@A}<)%RK%EzT)Im3x( ?*5a 4_VR -CJcY2,y߁ TS,f$-&}Jcɵef]JIx糼nRrlrB<"X1TiD) 0 @d#igO(oO%FHcLk  Qȃh'~&7-9(59+Ϩ[DHD@qJ -يp8ʣQD+D ؗҢ* VKGO%" @hIn\"D,s8.}kfmOAΈ壑0KC9UERujK{TpMDE::[aN ')ӄS,Kpl-3F0tNeQAdb\ L B7`L6glrBiCp-B6F `u"ImUVΛo"ȼH#u, (d,`iFUF/PF슿gH!t_|@7nOD$6+;JjfbSX(YVvU7p suv@QuM,~ -b(JTqR2!JZ--Y5JkC!ϣVylHao6XÞ衖 e^ЌoO%c7hO݁F*3TZys6-c| xٶ_k/]@O-`w(r%#0< -\߇2<""`c?}ytԘ."jԷ qCadj Idٿ vc F: E\llCkm4 *%$r&㒂ڬuh4C٨ Te#[䦟b8`NJKM}=qf?p-am}Y-r'`.2L7n bҖY&[ v}  /<Z K!*qEEʖmDTg:DK͚я iD=;CۤlنFU_n3* r)ttA20P -ɖr}@\GP@xmJ -(W-[ -/srD; Kb;/lEij% -XF O%yaa6V/rQKv{.<=`B6*qإ @K,SDv~!qtރ5x HPm$3Y lM.4U ث-*=}vmdTXYM8D4H8 f2F^̳MpTCsre -gXZf^B\(\صaO:'cruFLc&l_C]ePܳbSvr}Z_Q2H:ZZ4j- -= Z'Ho(rP%uP۞]첔H{B(UAR(eQ=iX؊URu-teW h&P(O-TG -_!% bAaQC*0[ W 3r_nĻ)o'm|T%(`ѿX}R:C]ݢK]V2#mBaWuP0P)ɨ),u^t-,}F$=W ߓH/A+C -nPԍrBӬiE60f" -t&+e ! CE Tom#[A}l] UR%:.?[ `(|Ӛ*YIR1wXS)#r> ͅ*۶.<. 6L[!d pAƢXG8K#Qv>åUcaΔ %%Zf\*XQ)+Z)X7);&Q -ye"Zm~-iu~(YTV5_ zL -Bil@\·^7 Cp*v& Mn4S1EPz̸v[PQЂ -R#~ t <]) akpAti*-+I8K)b*X2&ϲl*7eOfIv$11)VSGc`8; Ras^;+{/k@Vj!e4[(+`){ w["iD._/V}Iy(Ev -?L:۶}eQw(F.5=:\mp 0n7P>%=E` N-SR ~--*,X\U6m. kw-n)ȊmlS4/sZAp:%0_[o{#EQ$e[ IRudbVKEn7n"{ gŠR`^SrbYm -@| b< 0F^jBtG<ų Yi -ДZ8J}O>LeL:$ j}7ePSQ(jVJyC%ȯ@UbTc^sf u - :;(VҨ'1^G%PdB+(mK^ܥi.wb .Ef{eq K )YAښ)BWW6BU薆r-:K,4a/äTl/8!Va5\q1lG]nAN1UJ&QXWT7]AwOhDq* -U -(yhD7ꩼtwah4/gU*Zo@V(}5@ -%hXYC(T"-)][q9) -}V`vbHƥ>志HUs䵻scDeJjZ-ްYJ=KkbOy \)](OcpAʍ,RGd]2M { 6: b[FC -/yIF\R(\ Y]~.ظP~,*jQR{GUZ&"ZefT%t:Qq}>s*ReV" cji0 b# 6r]&'p!{2}ٶy,}EŒĕP!6R!vٵ 'P)T1VY,(((&~aDVWc1Q fRds%*bJI>Q\_IQJEn+ -4?^dg+ĎbРQrPLH0"[1XG -% =eN?BSlL^+=@덵+׸!U\DOuA( /G}JyFu jhS,i9QDܗ?F:vCRJƙ疚uЅA5f8];*IwQ ʔ6pg h[AǸ_..aF>w1h9 -ˏ0Wa\5>1!pWL9Ok-?qЧ,L>ALJJ\Bg8ZP3gK AF7 {lYQ-K,` Jby/h^2J:&TkVwRL:InQ -a/' f-R/Fp&m)K [pGVGPm% _̛J4.(Ma0Yt簧ȈDEm"EP~ -9P& -6W ۏ# -*,c# 2P%X>'PK@zA7U*EڃkKm -T Q|QکDE"@*_YU ӕkKWyvTDS.4ȕ(~`؂ۯ tcX2;sz[wR.P7 xk@,6߬LxTK4z+ *DKa7480s4;b` bYyUr. Ǒ' \{qA Bʁw -rAvk -[b -yi m9 [@{e |HظpG=.4 װV^ť~$販:K1̮6r=?')[xR<cX  EK%R-hϢr͈Jvh* (IdUT-hOyr*Qm@ZT0ӪĹ -KJ%ZX` -UVԠ!OMoJ\ {,;,;9PrQc0jJb 2=U[V*-!-U*eԶ6#m N}~tǏ~;v?K綄!cx3Ҍk{:BJ.q6ܤ[癁{r$3؍\yk "r-GXRp!*ܦ͟M*ƋuU1ؐNpm{PX }ezVZej:svtgFN~Q ng!X{" -7V8I]2AQT裐joIeh}W%Ydp2)uRFt@lVƲẅLQ-j~ }XDhfF]^AG`/HJ:ǚ&QJ̓VKbT+`~ب8,n)iihV@0`Ԍ[`"Љ-\/7%P2\oFag#} =m-/e=-P @Z%݄K8΢bDVu#B.0)Ub(uJd~!yiA ]E-6rٹ^URZlhQvT]FZ!z?ɺ?loo[}aT_968q,̨QVoؔ*ޘ?qAF7-t3i_LVԬU͘)-ò؅J >Q@ P(jy.,˕LJfNGcPmŠi>[h=lu lr* DVf@#Kh!b:l*<KC=sT<_ -tXcLm6M;Q\Ko-\~A>#w}+\\" -d/SXx!ke^J؄;AP(jFͶP_e%,A6TTUv,ZTjAi%z1!~KU6T=V'?~'%Ǘe;Gژ4رF#w,P0?`P>P7 z~K@x?Nl- -)Te#Ah6cSU -*Z0U -(#\$:PTG>b,BJéTEztin2ۏ[UM#d͊c~ش+*"1H'X^+1tr]| l(Hl2O WC$/¦p8QJ:"n/>Îr-95qp ìBj!%lTVrujv¡G|Ⱥ*R- GL&6R?eM\t>'bv5.)DU-(}XϤ4;,L4 -eP]DGHu(S[uP XԬ)u#Vi--F(pm?mfTɏ:1"D pS;!ʆq{2E7di+2wچ++h$)i.TMZCKT{]lETK+ Ś`p&dW~KBB&E@ːUF [Q -` .7l-,Q6FhƄAR]˾Kib}L7 -k6 tb1BBd@%PEz od1R6DOg!S 瓛S. qǠ \zJ_T(M_(7؅zU ˋ GLn*ȒՓ!/+F>[춍PjT V -.Ǒ@*5aCy(pҜe K]<-!j=JlM9Z'%;,䪥챦eLE[nmݗ+o;9_r8ژ-+؎KeyPYƳݫKPqZhS%Ӗ&}qJ%lFP,J|fQV-k -T'P!\)`YYta8V՜!kV&tSZH>,3u}̼ray p\8|.Q&6_qZ6|T ~3 K tª~F0rYnJg.rYh8mr s^pŏK(]83``o%"`߶]#g1r@ m _HXv]㐪lKP@}2SLB,<-kJ VK=oyf,UPkvOU[Qe"Ie% SK%HA/d_A=eXـ e)NvT.U1$JDccTNFkH26dL4*Ë m@ ۀbT`ጭ]0 K"<{)՘1d~bp.qO%i'StAYYF%l'A/9t.B]̬`.1>EeȖT*R%̃FJ@fzlœۡ\,J:g_HԽ#t9*Y,񩒼@˘Ug KDmAbDZX*vfZ`0mXSThؖ -Miaӵ*ԪLԣb ?b YZ&Ei.!{d~=jyT0v*Q>|c 5T-#PʿFW4BW}e_ D;?laZ4 %Tؾ&3ʔ; *}3=R -ѳ}D \՞>z@i`;Pm$(wy7^njGan!mOcK!p( c a)OY3n-QM\tTP( -\O&(^D.UWUm!EK'bp;7W%H{*0g ʙElKMKr(.KJĪ5Ym$_qJcV*l3/e$|aX6xRlmF<3i#B 8wYHX} w|ۙ4$~-?S.n [䤅sYݹJ64:1F/Q>jVȮS-F~W:U }7Di2tP i(/&,=Kdnjڍ!ʨm)ۗ }dci|d?;QDV[<"i(]n9?DEvT5fJAd/:M(f`SRͪ XE\..h4hǀF?‹EM w6컙o!hۆSWG2a#ړ؅ 7x\ DZ<@7 V>r@=ϦE.ߩC٠4E/%fen1 "Um7b v3 {+Sbs3sEe2ub鴌^; -T,y - FnP!Ψ<$ٲiVUl(dRA eDJCUmeYqy_5cºFɳqo2U܇jUE+.mP-ZDJ -rS?n64HfgezW H%a aU"c+')tuQru0>Ӷa`Y킆ڂo`Mƺ9H$"kKl@ GYf4!]'}LcSz?P* :nAExƋBXVy6'ܾL{Vme>t[(x 'NH_؎i -%P*EG.y U"1pPa~%b~ǭ-FLBJݱ8AD,^ĮB+"" - GЉ(Lo!gOu @۝]K-+,ߓɊ]Y*[䱙5ZY8X6pzM^_Ȱfj[jX>̘TM; !^F"چM۲"fksF@Uyݮ - -_,+)q=[Q)X|BMEo0 6%jis8f9=Ȇ\$rŊlZW쥩8 -XVhzxKyܠpT6 I+e7!?p~MdE:GA/n^{.*!₸s)rLFM%Y@F f@{*1M0sS9bEj -sEB/VR / e >y.a6KK~rdc=.JBxuMFub]\jئ+ŽeVZk)- g,/Z8Դ(sOXW  ߩoe\ږUxr> [ҍTMg ld*֣" i_fav+θ]Ժ]lF'WCbI2jSȍ6}Kc@Tѯ%2nTv`BAaMn[&LJc:vgGԪuɤ^ZT/F(D]e6*^I;l'Coe bjø@4 *!'Υn|,RWT)]Y?.aSqYՇ%+eyW%R 1.ۆDU(-L]H-m-8˧C2%B$0X|6<t5il/ j7T(.xoDw#6 фZae\{idr])eK]ҘpE1V3CfDRUJzM+s+`uߐxU'CC>/aE0U[\alӓ'LMD ZTYQ,WizN6(LP(W:C BIn jPO%"!ZFOd*wXhOX -ªucU ot74JotL~Zj~̫e%ݬf1!1(ZpP䶄DK҇P*&Ee3XF0R5*V/+h$L -zl" V:W%5Qj] -2T}WƠ nQѷ>ݕA.0o߆[?u;\=.7q@lzOݣ"%P#Fny(ed'y-Wvݭeǵ@ }LMQL;2*".Q0KuZJEk%5 \Ge="+(.1]l*%L\E`CPoV-኿qCy'Ip1I l-ih'nj_;}%` J"Ad2 G@"PK6kUʌ,*0rܘ~QtYp}(b&R,h*-1-j(PJh XJ؂۹%@GR=(Ԕ*(i[/^' [<2SP X)jrk*IJ9ؕr$vƙh*gP`~|VHOb,cҲ,lF+1r-D 2% {˖ 2z#K%z _91uR}`G5+hjk!ΝjVVH̎:BITKІ oeC>5);*m:R5VǼvPI`ؽX/JMu+GԺ ZHe`ۖrAzފ1y%@nA>}TxT*w=.6]6A8DH*ܼ>#6]xY-iS[ڧ.r)X*ؠs@Y{ -(tKAQEM;Zo P%}/#Tv1QodQSѕe0DGXeHYg5C2-zr~ ~y4, 7A,ḰwdJPJwۈ1)w,ͭp2څ*~,ͨRMDB8%B++`'㰢Wۚ[pUǴO*m*LV7u!bE0- M 7EeXc5Ex,r=%E2>ȸx@@ˁpmj(^@9*jLU~ˤ?rdۃfƊ\KA0/;0>@cfEgP\䭰}e*.>¨}QL7@;f>bgZi-)ȼR,g}KaO\cHUY1[YVkR[pGԢDKܲgliRԿLe95gD+ -{ߨ 5"A+}\ky-SlpTD=V!z`d2UY?JEESFV{&ev[oV!YdS@e -cU%\0 hгbeTl -2jṘè]\wʋ4K98]IUvV #CW6#'X[6ެG#]تe?R'5k0z1VQR- y)RӉ*R06Lv,vG+O6:|]UEKizKdJzJ?؏^ʆ ޾hz Z.m9(Oథqn.u6o>(k,t,Qj_c!'8}0bhRW.QZ-K,NO,(IȠM*T]="99ap+&bWԣ-6ߨln-%|GPڎ`~4mD=.ho_9DŎAIP[1lSī7҈nUR"JXTvXu"\,TNA=lBPpFn_v;nD7XnEj 4 ~B'6y5AiǗ_۳NDl]aBDoT - 7arSʤi?͔U' e5=$tB^o.Xht˩e(;(KeEvL _ _ n8 -pۉf d|R Z?P -K/}!i˺؞5NJ-ؗD%__[ -g0XzDD%%*"eK~Yz<x -My(9KEGح yg}Q}s+` ځQ{.S[zN dFJ6*UrĻ'mqEfuqaP;= BQ25DΰM,9~qX540RU1r<ԸҾw4lXM0KZ%6˼4%hŅ8cz@P(X(Y'R ±~GD;^T4O;DKi9,jPvA7FwlM6bHQ˔J jtU PC)r2e -U7ؕR -/[>y -J)s,:#q}Jj̮L>;ٗ,%AЫuYDD=qcr0dTj^qo#ژpvˏhKVs5\8,D%kD۔`N6+lnt\BTU Ek㳎­jrXRAaPPX; [@6k}."=8b! -ZKOX?%ave.¥О͢6-[( XV5}=76MZ&,mEB-?qj`auۋEdJCؖ1`'Mv.–.9lFW*dkۂ >Ǖqʿ GR\V#  `ZJlv/b, ޟ{+RsmJmMuD,+ ,nX]mKhM|mDӒUėdryc!@>YcDnC\&ýp&M%-\qȷFpЧ+%w`CiqLQE0)Ij Ɋݜ&?DeHVGq&{?jcHUJxR\i4uQ8EnF5njQ:'f>JWW R´\1l/~<Ve$6 eS"ieӶeFD#əx_l_XG-C-k\'%g7TE#ȏ? !@Wׄ*Xrwq+iwmJU.S% )j- vu d{1]r c@-EbGXK -w\fCKM#=%|J Q5]1ciU4A>uQ^#wvaD]p`TdbV| 0p:gI2؃`oNY-zyXka(k4-QYQfm+R}$-5Q-0[!6Ha%.[嶁ZV^GB"%?e>64Vl,χr?߇Tr'd9%;@?;3pap6f¥o)Q t=YaK`B6)4$EGs(Uge Q}2fnktK]c݆W؅Z^"u m0zXJ*٣ hbR.ĠfA.=T!ĿZ8'NL]D4LT;@il]L)6&Y[At2\V2QBvY_RYtT\JV}*^LG;ɋ?a*QS}~g> l"9)eǐPvbVZ;,FlNHi}˥iXOO9KmD\yBҼ`\iw*ƼV=e_ -Q;Qyr}NȏR*i`ZUATA܂e"6Fr'RE49zQɁ PGr ߩԬdD` t%Ja5P@pS+2+6 -n00 BO^,ZN4)jpjuiEqB=%H#N9Q -?dF5Gx))\( -oYDNLRخ9A3}E{; -!PȌVp.cN/`\ TD̖nf<*R䫇f &Ph'.%(ac uM@]:*K9”K|s#ypf3S p)U -L 1g*pP72$RbAj+* uPG{_'ώJ~Qz,.YlʏgfcicEc?cOg2y91[ PRCb^jbRnu% _g*Dub1nEPWPC {* #BJDŹTߩTyG}iDGù͎B|#p-Ui\0$Ps>EŔ=H*[[L/%5{KHBHVHDn5n=IT\.E|iP[w }Y6Z&W354%5qYAHm v!; -T -aCX9H~J3~ OΰcXO`o~+S`@#˳L"HZEVܯߋa_;k"cDZ~ʝfame|3q(U{3ufCO#OY3h#6^-J]Z3 nrTͽ)=5;eaT{6UIyGgǥdLy B vz%ȝAw;ؔ鋦m  SFnJ; lD5_eA1.~3exKKN+W|a tO dۙ/BO9,VWS+&U3]4w U)RVsUi !C{ \f) Kjl<$Oa|Hstȴ-[ﱚǒӻ8-TZ9BV)D޵ -\T9@F¨ڹH LR`iU͹\!_n _ep>¿Dд0Ӂk/˄46GȨ -ڨ:}GsT6\[KW9KV9TB"8kW̷a΂UT;ClM2Q{2ʺS}NREeg!kɁzvd)v,\9.sYQ%a~@B(*nA#f3r$cL\%ط5`mFόMVI\FkЅn{*T!xJlmWD_X\c{O1mNQ9di2LA -CQDT\"~ ʽy"/('IS%Ym@S4amB]c Lv4^AZ̓ -ߡg. !Ĥ/VISW s:#ȥQw%xL[:i -7}*K+.Ry nJx9 - f~ Ŀj5QiY{)doݢQSGilԳy8ETP5} uT6W։"*<Rrd^+%'%,de}Uɐu( Tk3)b/- w --/#}6*J?hTS>Ī@%׌l Pyim[\znmHT ?R xE/K -}TmrS8rU_ ȔYp*v- *[Va}A0G6.0^"_ "UAKZ/DYzvgK6e-l˻.,B`D t9Be9.- -~"lO>z$8FU>P 3OkE~+ AY֑r*%6aCFQ>y%:sK?1!j=)ח`>nJbƪlm!HJyqZ25k] -Xrѣ+rWI) Hʚ"5h@tSB΂Z^-hF-_.%ɩo~KMNm{6jL+'˰=NJVUGQ'zC/U9b/xZA_f}Ã"UJxLy)%D*NR3X2lg.b2 KHcdUO3P? jk9[}Vʡ{Nkoa-:*?bRTjWP Z7`Whf)dZ,_-d PBe>=h4dQV,sȱJA2vZ* -k-MBŗjR`d(ZhJ 00)\]լ Uo%vuȂ~)e^-I{CJzNK\qN -oȠuU1,F+J\p);S+E˵[P971>]X`,2;hpݳS?˾8ȫkrQȉwUȫ*e]±ҹ*;/*%b ݇J~s١ps吢%d L؏"HՏAتiWSƳ8+^M W"PF)eƲn + ll.Vg:Or>mV &5 -b‰ا-3ٮFJ\'i)i ғ!hW4ة^qlB:]uO`J8LJ uQ)l 4U*}ia:`V%*Beeت[D!$E.(l:7AUgcٷ/φB֥:K *6܇@J YAoAbY]}%=@ͺ#'*) cLJs!U8Lx>?be݇%)rLXoC}#c5.*e )=j12Zc2;H:_%Tγ,Ԥ] EYyj+d\9s="M;6Fx|ym'2 DYn`GwI a-u jz@πQuU_5ao-z)JI-[_ʎ!ۋbb3Spt^H%Yt&pbe.^2%hLQӄZ?5`b*$/'ri(TB>WmŔcPN,D -YS`YSڈѸ. -`~в{ȢҮ1 粇Ixj da*"ςuf,V~Bvs1amp6_N@#TJ&sĄA>Fb[bzƂAP3QԠJigP- %ˁ֤CLX6Yo,1lG@mXJ~<< -xFo.*"3aPg zpB(y /U @(`l^C-EI+sHHr,m 4uš]B 멈l/mre -_h+Qtm2Ri AUܭ*KGm37H4" MKrW".Ul'[pGb2ד}1йu6Vw939s.;zYK&d>1g -UDZ*F0d l!=/=|"G.5b8G gj B6SijR̗%YΣ&3{Q5p}\%r';5q?{*$/ipF䱔9]` Hb)u:*Y1V^ P_O⾳cLi`E09.ũ="vB9C&;~C .ycNˊZ)o|`!WS(H@BQƆT0BUKR)6P8Ȝ`5ݟ[ xu:\r/ba6 |%\~0h!ul(Ll ~e"jASˉGT^2+u OcdrҐ,2q~pJXF kK}GAgs+"9*&*@֬7:i!T\Ј4 v8`9pJEJ.4^0DV2t[R:U8 |yoUBhjC -IJk=GVZɖ;dEc-ʾ [ - -U@{iq#j~PH%ˬy- 9_PA0Ա,D(o \^_߹Q?`u0F%®ԯd TC*u60,27_RdW|gK*` ͺIW?.7 ;pT5X \Dk&mKNB:IE@ b\Ǭ*!w^' c}A-܍Q]館;pߤ˄.&(v6V-R0̜vXNK%S5(6=b`@D(>  %ecMBuU؈m,e.&xd哤>/?b;Vd ڧ#bh˃mnƬY]8FU-ŮGĬ/'p}n8\`ʭQsa 1EpCFBz{*Tle}\UD*U%Jdvndh\cQ6v8c;DJDYLYD͕AirUț| @(P]7;ʍŅ~r3wSI+@͓,vd~:}'EU~L鰌I^SٯB9KDM т}Ѝm2@yKǐ ׸ vtVzCm -:U1_.Ƃo*X _1jƲ.>:dBR^c11"'BH% -"&Z;1Zn.(,тq7)K>z䪁&c(UXMԃ-mF.`):GeC\K|.>J<π=!|UBFԖX&A r C胕*fpL">)V%_HD!)Nqi -v\BGS¥CrURmFцK*WB#ܟs(_q4:Дl`.Yy}@ e>i%ZA/%]r8SgJ}DH\^pŐz"nJ8|Dk` -Y+z`` ~ @I؁[p{USqK[6BI1D_ږ/,JDo [BB>"]b!q| -EIy,Pa.T!ˍX;#UalQl[}ARUO].\.{tmQ쩰Rl~0%j/LٸAMj!lZ6lRWmȶRj eŵ \Z!V\c{Ϧ XO eNvmK*%gaQ)GIBs\TU1'LFW;%T:4qRß@.U-mBqpZRѴOv=ԫTn+T €ERYv=6'qMn7̩[!-ԉ{AF:@,߃!ޤeE'!-c\jw c>OGɀWX(H66qe; ҜU'+T3I Xl-2NL*g=%8o⩕TIJryWثdDWoK9yKX9sԫJI{F?OdsWj tF<%ocȏT5W{,D{p#wfTwE%b< 3c6mi[,[ ,XSoLS}IKoӲy"@PiwL=Woϩ-`O=>sjmLX "ofZ.J.]r7 PCUo˃J%uğ*D*;H[=*'ОL_@ȼ[^Yo V"}xCkd,/ ͛asʞ# PS%Ȼٗ_C`gFqkwy+oۃRp@!Qr7 k(i!bQ+" 5 Y]KI $-{>D\UTK*|@&q .?!6ܫg>(%m* J»# b"Vр6…^Dk[TZCK~5wŷv[Bm`alwe 7G4nDz@K;ʍX((JM ht@Qc09bjTa/쟽XJ}B1ߨCم.>:;3'X_]tHv4r=(Yt^v[]ٲj j$j!DD;8H};A1*W y~c%Ŀ%I 2~"7LK>rvPZ+Di"d&Ჳ&>,KmJ[ h dYT΀́ZU=0RF"Vl5*m Mi8K%j4mNG^;})RRjVvv!e9$TX!vi`F/p%eD%Y)x HJifF] .%y6zqMN1*vl􋿓2a =#r _0*<͖RGS)D{(\xǯ|&fw/;|}B=hZ6T6}$.'gA7f@|w.,V!ecTkn2U27WW؈g -U6Vw(iC/=#L5IPj)WIQ|v5Ej?f[ *!P wIK-vUYay*o$± -KFRGELTy屎V[Q|L2S5c-MJ2WD;mʄ5 |W.e㯯ۆDŽ6ŧߓIj gX9w>_\`9WThTZyR/ P6xƬO0:>)^J78P{):` .Dv 5r+=v<'r!r68uOUĴ3(C[:RӜ 9H4*`MrnJ@]2iG`F%1IK$BYf+b1t Lv&?D/v&$qJrq?8t{*PQ!xFR!=cqyʦyR'ȱZl04X8@;nL Jvf8@nd|{ -E{.R/:S*~_ L\v0.ǿaσ4+-kv]CM.4B9?Me@X2bk*Ɛ!+6E/jmNge|TO52@,U{ی֪oܶF5*,k&!}T,UOv_!?!t+65nǂx&NFWJ)f5+!oH>8LXICoy(!; -<ǤXKg]bYF0t.S"N6r=;XOP7e5m c4mr nQc5ʧsMK!h1Bc2}MQ.}_PG *: -]ǓbQ,Zge[ve促,'CjbșQ_d.pMʅ;qGb;Z2Hݽ( Hא˲R, |Ä2<]󽂞N}``N2~F .ˆ0@yqH|ys˜ -B_pE| Ш~ȷE2×/myV( `VP$,8ݎ,u.U1bQ^r6T@&WRI W8N11jC=O(6Õ }}E eyWb,#&. -W*4q}t~ظL 3z6ߑDƂ$/0sGm261{H\{Y(rƲ^4D: ,~6nd{P dz*^ln#>!q f|i=.7-<#ҡ{J2ȋ}AFL"?`6\"~&K2T]mC%9/\sYϸ`!&ÿ jT~ly=U.\U/tA2MNC:<D_gnS8=ŕ-[l w S`*11PD-{Nhٜnkɓ"=A\6:³ذ_ZJKtIk/+cܔLP'*$;R59 ytl`dW \MCnC?O'?eů'I2ߚ,i#/%#yY;xQ.&jkDw(ll+E в )Yٛ"ZR( - %P}<$oe l{͔;A`V{G%Lg`Ku;/e.++V([ja25|Ru;\U+;D+Wk LE9;qp\1HƂVDr 3*_8 |}}FX0{%Nb5p]|+2C!(+&rBk5n;S%JiERt=#  &:ՇRWc䭹CJnxϏϊ.U.46ϸl'jec*2YCbȢ`\!=cU wavK3ry+ clPTð~DOXέB?Ge*˸qg1FRt]aPy -G"yS'\4+,cPD՗˝~-p}re~AȔrt}82GXlr&,~v1obr.˳>=+'9\>ؐq|vSod&#r>5۞N$j2ªm4ͨ-9=9*$yLdHvVԫe ŕO!@.`"T7M1L$Ȁ4P. ]StӺ ]EM! pɈ!xjYc܈.ћ [/rvT+(SaaJ"]+HN6/੥n1Pz'%NW8F .hH$+ؾ8ͣ=#j$G 7H ˞|VF H-ʜͧ<Y_ ÒL]UsSq2u -!sWJ1؆>*ղ6UJLMjՉ-goԻoZDύ#r)G@V5[,#@0نDqS&RZuDPQj tب5֠(*k* -0QPP켗Qo"HF> / NÄ=U*6cĤ>Z_rqPRY -Ųy~&#KAM5-D0ʿ WY ,%44f2+y*K{T.TT5FX* - - 98) =+%/UM"RǩAȫF-n\K;Ėjɛid5 _&O@:$GՇTmBB -3ZbK%]3#dyW20ZX#[LF,-̶zS )w`+ObWK&A!(dA{>ܾ) V@u 9k_ɺMr$ #:#"o l#D>:{4p9sK9*^TH~ue>=&/%q -W% }q+cB6dvyDOځg##_Uw UYrL`0Ĕ.@q<`. jX(T" Gr+H`QSDVL/R.c@Y `>t W5As }Hʍ{4J]-rQDB|%6>L@]b>4AqXnUSPg>\F=M3R'ԅʇg3ǐ?~*u]5=cLKh0|φ97u XK'e7Wd[m'\`!Ydx̯y3P]Bm\]FPH t@l쫿'ԨN"ؘr@[b%w.!%l222̾Y*#\GPF|>Dqed=fё5̊ʻ_V'3u,[K:2ͪAXXʁ{+`\ew-%Q?į&By(@@r=(j -Y(!We!E6+%\%EG*cd|jYEO'Q/&G;/?}K`>N%CH%:ߊE:~߳Lv!-R5xTg9X%J&TQy8).3̓Fτ u6d7RV}̲,,GrecRF>GGeFPPj]d3߁Io@wqcc<Ҁ4qYX # 2^N8#sϋɕڇ5^r>8˫MWgJ %S9#l0*"u"Kyع=~ CTiE ; >=e c@$0r'K) V{jTM"+TW:ugLQK+7}KrR+j7e?PO.;jQV/+eM$>v/O!M|Q[2q6~#j]Aˆmw>+6ؖTP#KǤP><>T[wg>:1n®V,Yel -dl -;2 0 L$cCӨaaB.kvő yMwL}CQ^uʖ`ufObQQ9mCᅤEK?EddTG}`2T R>|Qm[aM!phUC%SȌq-"id `z61oihJU#ȅj\`d bFQ6*< "TL}5F@>˨Fp[.5[==[>2cogX%R=XC@ոyr.ǰ'";7hl"><(/.[/^# -SыҧDl -y0JC!DǑ%vQ=gنqk C<@erQgƑQ,tJG{ߏʟX*L:OH{Z>* KXiɵDFÓ*OYDOI[qݏOyi=VĞJ6=>)~ÄaQ+켩{dHqϤ4!O rqz̉a O)c@B0?qQga^ څ~>邰%.-A.leeNjnrRDb[W͞|T[>}KCA\qev#^ðs\qN25ndhJJ T>3͕K_ 4\R5p*^ƈ}N7JU+DM;2yQl`[c5 OeB-8q*WjMaR0 p{ -LYtQ ٟq0+{.TIyP*}LˏeKaScVM*O9;-FۈK!{slʏ<25WÒrv[ݍT3! #|W*H#z`p{ gj`Og^("fQ,BTgQπ Fl/᠕lð%q^AcMב-eLCr`qS2]*?#GVTD\ B![س`~MEږAtKS*(MѸFe7ӕk+4=hK -dozMllK)ƣr̀Gp؀Lr#4la;;)e\y#p:!|=sh” -9Qc/4*`)0p\2=FT[ V3 |e@ -~@݀[) -c'J ,V`]MD쥺"J"@*j,0<цc[H!5jMXԮZeGfخF @} Kc 8eI'}G(_}( 큃ZV[o~"".|iEhL*ҡh \A4B^4Bm0Yl䈗cTDҗ%4p9+u. qgYgWS]ΉP}>K"gݒ֢9C6ZaT6\)^[% 4{=LISߊ@.@)<\Ar]D(&*y -|U܌ @.-JiJgr2ā_ Jj0H>C &*IyS͎9* @ Et,EQQ"C>L4RfcK\UW+8v`\]&װWhElgWit[2~ !:P#Q>)=?NNUpjD~AfzG@2\L0W.rUsa˶YLK ̝\ E\yq2ڹpUcET`>v- ;(#ߊ13;OGrt΄]?𰝘9 -eO)#xΠO:"u4OH[3X9BVK6Wp(NCF0l`d^k(%'0r)m c䳒HثHyo$NZ#eY-*=#v[߁˔Wy.eѧ 6<ȵRJ ~ Xaō)-mrTc\!H7CQ|LLynC/ V,.va*-rTt!:1jrW B'IS;8/ 7b!%U|gL;8?#_\aR2mePdvBxTz͊*eO1T -Rq?&Ҿ;LHUm*~2DΡsΐK!tw,#;aXhd6SOǬw?b=3j 9O' ˊ+E_jrVکO£< !)2=]^ExZ`nP2͞0 uL,7,G{, -y,V'l k.nذ=4DJjqc%Զe`YJ --®h+P0>ۄ.}s'l$Ng.=jQ.SXrpn?xfB\(*S=<"w_u~*lQYlJr07=ٞKԉ8vS<"0\GzߨB.Eb\r%|gC(G -Upa S_:`:%B|Og%ً`}_̊F'KO1aBƈf j'Vkg[>%_ØwVwe%:Ӽ3ZwN5R' %y5qc(œTgT=7qaUSs`E.*!f{6pTo f2?{dʞ5r+~\O\્j<%!gZ!y<>IQj%흟;Uj=#m?b.x ~C7%>Eb}Ax22ǯ/GhA\kQ^)=Zi1Ih˵JwɤV}(ekosk-%JGg첶,zc{fYC8O -Z`>=S]B[quB"~nrPe `I܎||4saίِ9)r&E/e>OL&,zbʈNϲԫ2^3 -V+e#YE6˙qaφa65>,rb{߂W(/䪕zǃg(QE~6^O h6kP[-GsJy! 9#+e8fN_%<3Kc$"{B}W MJ -}aRJR휤%їGUo Q~Eߦ 0uY;`PSUH^u?m kQaCV[ 2Z>`ĿVZdeAw SW ->m'-eڝJ>0Ara;;=ܮC.T:{|ggcY('NAE0O-Ke\,H|*P܈{5Ne{*tQY@mK# 9#d2T.{+Ño&C [}ȋ`HV½\UeO3-~37x#̝~DQO*V!/zR*AH̸9C.ܟ\ů~ -(^O!q_cIGȱU)A V]>9$c4ShD&E U%2^4 14BF?jp_XDSF܌ؠ~6/eqSi_KLTr|*Ѹ1Es3O Z:Wwe2?Cvoo~jA,#{ctABJ}N:Lex" ŘzGNY>Jvv,"%{3kB3bsQ1LyC6}#ϰ0}K_ -Tʈ904%_Wk).Q̄+`C 5y%ώjhvSr?&r(l~z|bg|s!:rrTy*HV~,ưϏru1mv5 4K}Kq%BAme/V;;5-y*>@C@ϼLԖ3T@͕9}o+[%ťnS2SK*#''_JQ볿̟찟"ba1p:_dD,L:mW5ϲ)yl?ɵbȟZ;UP?s|e|_Pكw&Dm25R\ei_!)߃HԲ -Èʯq?a{),. -qM?V987Ȏg _7MR9v"~@{~ߤ.j W\hyAW cl`(M{s7>+SND8ŏٔ2 kVEA4U 7 VDa$a⭾TA_!f3+oigY$.' \IavdKOC.T_@{ȫF~g/jwpʸRZcUrw;Bt~%f}vL[&AߎȧnxSSTg ԅXh>Q-XQw?b@^ƲpWf_"(쯎<)@uٰM]ECB*0u({-lj=ڔ0̠cy3kcac,PH(^cZi f6Ȩx0QOb8N? ;RQ6?\;~~:,?*2-6@/?pJjK0Zȵ<\"5S> y~K7A:2^MKFLKGq\6lr;-;E'Յ Gn;Pk#g%:TH༘%'FMSq~8~Gk!nGB-g>Ucr>YИj@JU`@% -}hJB04~£"_5j[Sn))ɑiP2t>Xy\Xu[ǕH\@.*G@ͷ jӂpwebUaR!]sTܼxq\~TrWQmU#A)Am&T*)@"Xg= K'sP!^Q*f"SBp(ҼfʟE&|SctʖWA׼ m=πnYR(ee-<!Ep\.-QB<a8%gzKôvL=컀%D'DzExN)[y>C%&N+ M3́R'P!w\xc>DVe<1p8쫁<:2嗐DŞK.HGGb}G #j'Vt-H8l9<"[xY/%0b0 c\U~/ge(&T4L(SS|V\6@Qt}¡9K+}^Et|* O>*,YpM3y;ac -@ad'-DO*^FWřsH~!>Y+k6|;; +2 0/Ϟ>ry1Ab~`w E[=zTbBDzvrlT -켨;˩r%-V[W -*XU&aXˀ?HTr.De\gŠ7UGEX".{s/%Fql~M\;*Yy2rj)ՐJjR$ ˆ*.:˯dzis_}t>ˊraTG%5#>ve7N`oYPv&(GQGGφ,\#s}4aogyڃ(߹v)k?FA}W-t:0.ZTCG#rbdػ2x`}|\[#W8\HS>|䯸ʵ.n1?eM+'AҡZKrV}#pTasr9yυ^Lm/EGG $nuQMCԋl(ʉs}|W %ODz Pvc=G "M$*[qC&JS'K -^A]+#Q̃ٗd\5>žǑj\ڕ 4Cˁة+p!f~EsiTT=Mn >c䫉%^4Wl@hPZ1r -Rjw+^<6$TjCHmbTy^˘T<<ۍU<{zN3x&4rYr\ylp!`ػ_KMA":mZU]OHRm~E;P 9Hg̪CŢ-X6*)gܨc6yXUO!~ϸAԫkoa[3Q9'D*)A}DcM/a^^pOЋN|/TEJ{9qz'¢m9(0Of:7vϨ܏g#Yk*y,uĨRAjʖ5xo(>*h Y+⽁ڀPpI# ~<3 qTofP-aU% bX)A)y=8Th(Ыu( dؑ˥r{ʸN^Fs/YؕmBmnPU;ܨCrV )f\xZ -gY[pr/aڞ[R'Fs̔&vW8?a عdX韤(H̙XǷ쿹Te #y(#!~ll1d&jQ*9VDG楏 B[)T9GlK{QXu\8Wg¯52Y;:`mPðv+/ `"r %EQN(*Bh?a:˅u#R]O乗dqj}\{Pt͍LjźR6- 4K T?%cz#{%>:-(C՘7{.%r/}#LQmCu4)=ŕ-2#tE\ȔL -O]-*.=DxF~+`g*~``!H_N%3l??gȔY˪쨁`@b0ۍ$*g+LA%%zcbioO3n Dp#p܆ _s5qqn*zMVy<*g|d ;=-18c}gzÐ-W&*tN Nڏ{e3cYKJĎT?LȽHtZ\n8T"ʌ;qa{28d%aq鳙+qK;;QFz|3 mOg,Ū w+M Rq! $&U @9Gy*ŨrX A:*U-'Rr@H#sZ[|v`\Gv  5,J\>3͎C'V@}v K\Gs2JIJ]@;a3!8MI&r^r_aR'>y^ygv-"erc?%FyU< \IƖ+l. Bp-زㄸs'nTwܯQP5Y2pG\`Wr[+bBn^lM*nke:A y2߇ro!#=W5&R}g~<g _2-C P -mNM)Hlqy6y9{sjezC2?p"3%Aaa% bN.yelLXQHeŠ݌{6c6%^%>?<';rdAOIgTeT1*S-r]},ٰˇ'UّiLI.&tC핟VhAfA\n7G!ND{{;+%\ZWsCTq6-S#!v߀Tel;9Q"JhYQ/gtK~.y.Pǒ{~n3=*<v]|^ G`S]5:&`c={RnWdz# m|]B|^Ocڟ.Cͨ$+y(`o0>1P#-SkKjL9[/c!r pHu7=g\:G+e`xAؾ3BmD\N%r rّozTrKԗ#vř;qsy }oˑtDMl{a.87bNρ<6bϨU~L<.z7jYS*-亗%)qg.> YQcӑc.˃;Sp=3a|y9<'!}cP|>G|p6nBxUW%UͲu,a ߹d.*5DTcq伌Ks>ȀoDj 9Puc^9Mu7 OcLH/g%Dݼ MB|nxh\`Mgq -rP+/,t'E qj0fC gW`Q8T?ǓPTg#F7; -'.~QRHgzNv0{{??b}O~ -/f\ϒ}|QqaʂT䕰K[=*÷4Gu{b{ Y_]d2/]dk# Α!|N#t9/Dp: 30&=ߏO#7lU*S:"y0Q|jcD%QHBDD[ -U:dHPPxLEBkv"W9YKzfᘈ\o%jˤ*?3%~y da-[|' #Ԇga>.=C'g#6Bxwćx&m37pP[ɛ4B.TryȊqRaփH G>Rz~w4j p<ވQ< -U<*wUɽ`Wk*""> -F\,ssk dsOOʄ:Jࠗ/~ -jb Ü|eJ\+;òdyqeʨMLT578$&By>Rw /'dc8O)g=蕫7v 8|`ar^N\0}D~X{u#)RÄ"WXAc쀨Y3ԨRNT<`{r** UH|A\Crj)ǐ2\g_''_*,jIc}DM=KX'^d#~?I}_B~A̚ 5#?"ٺR v`v瓲xDdֲ^N~ 5TpF,0ȦˆdU%\gSu쭃Qߍv8y݈GS-wcѸc[yV0* d%C`c G2,Ok=wfO PTZ#f;8Gír簮$o8O/*p|rDj~<ы:NdzJIDŽH--|/4#DNٌ۟V9_lTGfBW@PNC.2bq)} cmS 6 q%7 nr\\w>Y3~@N*Αar=*t"Y_44P?ߎ\!G}[Lvl=n\ |~37|VdBγy^4QKբ:@)}3ŷPJE40}K[*# /V!4v -҈ `"Kj~6{P5lcT8Dsq Vfq;p~v'Zu4m3x0*>Ð+IGa8߆ш-#|Z# 0~8`B]=r}"؟(iVA*Wd#XN5wȹ=kmv݌ -Z%:B])4DAFUȹW -TvvK}(߄R2-<(R𦧥GpἘǽIOOPwe\b\J& -[_ -TDȵ  -a8Hn7G0'Y6,"nr#.~ ly%l"D%!u(gr4|Gt7퓉[>({al q }D=MXK'eɨ-Q!T)j9u'j?7UEb⹬TjXv a<Լi>Jbʊ,e(%EPu5fMg<܋QƤv'C&CBY_j0сi`H -} RDBc L䬄T~,{.c=&eG:OeTy d˃CQ"h0.v\E Z?ς{V9/9=";sq#0rdl$gAcPwgaUA/Dm:|Yȴ?nDr}2a>%.r?"~i"u>E_>OЌj[$l+#?fk[& GK`+Э -%wr/e1 A/xn_R."}Gedʌʕi?O"_Pk9Qj4rIܱ93 rR>.J[NN?a)ˋ MUΥ0^b% -K.H~v"- BյUƒ̲*COr/2]{Dr~LVy96~Asc![VSkUvzD"0Vm \%d!G0L=>!χ,ߋkmFi4O>=cy>{2]"l!Qgo#{dZk<|q/>8a'4r-oQA - P{Te$q WH@`aٗ,݄'_ `=gL23|:; y aWdDbbWrfE˅;* -.,n.8J>@J$/3eu =Ykydz,Bx^Jwf~ª,<'ܼ%$a^C`ʆ%WťVJ# }%Գ𱼄w~cSev 8\{?_Oen1LeNy+'uUu+\A' ͉ce > CT`!j^˳"uDd#0{~ X%-G1Q1_3Y:l9(%|yQ>9#̵ Mߕ-m6qp>= x|VY|\0f4GJ&$%@N3#ļea0L.ؖ#Ϗyu-e]-F*/e~.qvR#tCTer3Fq!='S~;M{Qm_ĞL6NJ乳jsCʌNOnc?5%; -. X5xȐ,]ż4MB=6e\2H?=*m'6jFrPɟa!qJʗ˖Y^g'#Y_+gbq¥u"GՃDٟǤبۖY*t@w6Cq]O}E[Ccp_=aOc{=b/ OatV>.Fr{7s|}TNNFS8!1\O"T{8a0cD',#\m*'99φ\h~DV'<#l#4>KI=3[ t=DblaeT̃{ٓ>tw nj;y;W=O_neKL#k!zT͸R%D= q&.{7_IB "P"Br -,Yrlu0˨Ĕaao#=#_AmK cK)[ė|`˨g=8\!ave@mK7#gǐ^Ou4+D {+ðx aAć*q&T?k$"KblM /a¹Cыj`*nF6j+J߅TYsNN.6%|4G{ =`'8Jx^\K~, d~\|Hlq&%|paMCeZ h8#iƌjCQ,2OIOmk6Y1/%C^Bx<m0QwDz"""K%lwF \Ωc@$¨.)_4L>_ --S%DL3n,I?q/ʅŨݍA[ #\ڋ{ϊ#O!),R3ȭx*f3N1xTyQV.\V +1UB/'9X =Xw)]+V>5 R>}E5:„KK3`8Md'Sn^ %H*Ut|!륢Z -$JA|}NLK~2ϧjQ*.i6{ -O_&@'g{:.& rm\X6hܫsd'~P&n>a@O l#C{EK+qp=w) fªOa*a]DawR/_1g_ YyϏ~Yq!Ծ\(j<# Ը_ ^͸L/%? \CE#\%e0ںl:61EzaQVpYeʩ=n\PBF2T r*| N+@>=I.0t\RC͏)c!ۅŸ*qQ2~T,%O5Y/*5I^ ٓ#!N=/³v{;c*d"Q:V# -?+>:VLKY*Edv~¡6!4˞%} l?=f.Wegb3 ~-Ze4 ]gSԻ~ǐ >ەZ`=<>Txfz(s?BY+':@[e(MȍʇYT\ -,؈Z^gN7g.?fZ:ٵ\6 - nfܬ!؎Au ф0B8cjVݤQtQZNZ57>"hGs~=c~="ra|1c⡸k&ʔij_#ဖ\`bA{=̗PEe,ZZQ;9 5o_|Hz:1q gnP{}~c+P!;s͝.%i1Z>+Qұy !-ɿх.D ޢFۢ^xRdMe, -Q]5D} -Sj!(4$-Ai0D=k!Ժs\KA r(.JyޱMU0AxA)M5P' q(J_CP(\qK]JwaAh,?@kfQ(Z0 Y%*aRՆ.\KNlIez,!y \r>*>T_R}9l)3{@apm 'X]?CB2/7SgeE#ힲldv?LGO.dVN<>*riXOQL`] IzJd xF[Ma{K -0/tAY`DA%% YVyJmӲlkN0M{mWL7eZcY"@D$M)Qcd?Xgb;cf]}t:"ўFY"乇Y*v?3)[qkׄecB֠jDDhᶪn5CJ]!`:5*X5JǿܣE"ar*DYC隂0_ -{*&~TN F_ P-\rQ+ b+T'owK/7)P1buPm!DZ,\da2,"+α4=l{Jm#E 蒤ؖ!0.0mVWદEgBARq -ʳ ->QD\~AOeūa|et moizEmwjlzOcʨz:H0+ؐ6'9 -dsZ%2~PU玑^f ;nK݆k3EmZ"Z։o2 逈y6(rz&3*oJ䶦| -WPO_4+hv+RDntOJ=>=4JYQWEOؒYF%$}qKJUQ WH4 -lQj_. P ڈųۗha5+m9dk6"-T/;eh -8 -5Dlrٛl?őh`.،-]T>cT)45nJ[ يY64!#AY:,Z_XፕpDB7xI/Hǿڢ2Exʨ ]AaGpS}"s⋈C6[!Ͽ&8;=B-tvj*b eqp*i0\`”1( -U`P*QK`D45s޶}3Vڷ&)#j-&!v-U@БWԪ4* -tcc(& o[r)p{J,{/2|ʧ㼟 d` H{Y>/[2$Cˋ9[.''˕,҈DTJ0>%\JDK@YRtXļR؀Jҡƙ, ^|VXl*GH Qf2|y`,\k⛨aw[2PfvUˉpJ۟u9TI BJہx ADbʞb? v9Nj[HA@T=Oe_\%Ny -g#ND+;(cuJڟoy2y2@iX;7&ۏ8[JEr_=*0;s -ت<"}N>[`m{rA)B-^@i*v g`?کϸ5Mv`'6*5sD%M~8oR,$lsW*@M\ -Ԫ "X"n\.UTcg(TL%yXDۉؒ[{πȮ(l%(|%;`[MZB~(X'`kkJe-ĸ0%G Nu -j -B-ujzWn1VGȓC٦MmKIX'̓c4}9hVTYh5>(k^˜ɵ)-Zhv$\?agr0 YqҺ -7L"FG,|. +xBh -9p 'q -uyo"U8TR3~,A@m`ed;{jI%2ɱe.*'߆ r5P@RJ ۋC-~\NY*/k /XO,>p -_`?`:(5{;4im[=#PrgEUJO0R/'eq_ ե]4TSuT[oapUp-*",="NG RV!qeVJDy&Bpf\aq!QxF!8W9>s~K5CS c"v;h)֐ |&(%Zˢ:B>%$},1$zL%X}!oXDrp6[(,EpPsJ$-cϢiCa(}tV{7p^N)xEa~IרT%W)SO󗃈,"M&@(T3busOZ?Ĥ#ZCؔ_~N}Gہ(TiB= q\n+i"!GhMU5 0(°N S?" B!_5y#ʇn W9{ԏ7 =kpk+ߵ*5舕bBPl_mG5xj㑁PϤq)L7`lPE_r_|#qMz}AlCԿ:-5;#7}3'qK~ILLhAl#)H&N L`>z[K&$ImU(m-bk@8Q~+9*yK.j-"yl c #Dd> +)S>G!-Fc0`Sg'Cs%쨲(Eˇ -&~;=k%GIWhBP^l€0fgi>1~K Օ X8.P2*awEKQ qP`9H~x\g4@<=e q(jQxQEVUNV=F(".Z*Q;0r ʘW.#qCǐv機vJ3:2j+%_Ϳ#6ȂŮ`#SQ?aHc.u)S -am+PebEeĝ7sQeB LnRqS5<GvWܺ/W:3_Ūl3ۯ j(;xJTk(+HV,!#W)˨.{ jXWW 0*UMYq -TgKڃ; uP+ r,ySPo*ߞ͂(=9HՕZ(b[(!n8^쿑cg]ʉ<; lj *SEʍBs!eg*yP7{[ci[{[S -Bz}!&cҢ.ș]O{.=*dp"blr\ ]ʦvS%5}GvS`bZ!%70hc( -X+2;*nєNr @Jȶv!-ݹkpi.< bPlaAbu (~ec -x}u` -#( ^‡N "EEE (P!OH?"KQ9l8/sU -Qe@TC, wTfḰ%Tew1u_XƑ6 Ý$ϊU.eeB͉YU\VADr]8"Yv9>k?!eO'<. -ֱ\Q{^Cۗ%fC㥱TAru -wq| Ó*H*; SgA_xwaAGi ݈JE4 Y=laG$ٗ_t~GxG .V{.p PJEAȔNcaSĆRd{J)k{ CK .{-I{"T:"=%MJhaMSEqV?X̲o%\ySt\UUͨ[\tKdV.۞Ưڙ-m1"yDIjݕqUKd#!.D&REHf0uE٣*8 #e>E(lCC̔]h|0SfU!):Gj)uS/ĩ (l/ga5+V)Tn1rp_~*z)Y-Gj5J`kg9R! -sf4" %qY]-aڟ"G=pNaNS@NΏ@,*;qh\C9'یU!5+=qʽy֦cM;(۩y9SՐTli%׵-+W-ܸ0̗)QPx50;iJ¢?-=NEF(X]qJ!)f]:Tv8@&.anpY29 -_ [>Gm~"[C(6bjX.u>vcgvue! D0)V"9.vx3K%buakCcַ,q{" í%Էf4GT%˫ x˩`H؆||ԭ`S|{>9#jxEn:vyQ> P!yqDRl%kbZǰ҅ago=!cm[={ڢݍ/'Y3'av!|n-$$ed^D%6>v,a$*HoK[8ˆ%lB}l5x=r6B)d`V+[0}BvyA&N%hϼZƭ2;*% +42荅i4M)nf7v"L9߅DŽE|~%Ůu|Jb&lڅ\p>Nˌf .;k'.چ9 /b:eqkn*y,+p.eSeq)ݢ8a9>*zÐ<좂bڜYc K/C|.Y1HUt="L%ϫ -ȄyP%Bqۏ`SHY9K:Q]w&S@xˌnib{g}D -fry_S?)F3|!ŕl;^|^(ah1 *[c J!0XT8WBG2&3꾣J|U#=L9UD.[^%L@F3;r` ñ`:,ˏ6\DbT[Yᾩ]\8s/*;,DAla+f_eĞSsƧ*ǟ'K Br[d]!(t"v )Hʲ -Īig 盧U,#H,Qn۶(Ğr[QZ&? -Yggc˭ g0ߑ2mF#"dajJ}ag*5ʞN5ќ>6;ňg- 0AP`1@pB!2Q3?VE2"FdEt?G(MI?P#-T|J*Xڔ5ÙU%T nU%tn+S+t5lht5YAtP:vvFj`htQ Y:v"πNkē༆++.bV[=z d,yzjl܉Zl2²|"/b^x[xc'E\Aoy渪YHblYHb ^>#d.Nv\9f+t7i)x")B'ׄ2rԮyWn!Oe)츅=|lQm}/lt?:ZQ[ f1x騡ql+o[ -Չϕ*Sd1]ХV9bbdyjSbG[[tNQH1]\ ~X}ڕZb55ωGw)?tڕZvw4(tR-M`ԪMM #SKOB4(C4<*//*nS$OԮ*^?u0+`P01p 2@A!"BQ?׮˲ -=Y+?ѵ=aڶ5¥vw=Wa)A }`jyXUQ>tB:y<0ST6e5b0=$4>$ mmח\,Gz4Ҩ{cu^_ b_}*^0Gn[!;Y108;޶H0ܘhxgv -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000009713 00000 n -0000293123 00000 n -0000293254 00000 n -0000293452 00000 n -trailer -<> -startxref -293589 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/28e83a87-1efc-4ac1-bbf1-3a7a090ac75f.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/28e83a87-1efc-4ac1-bbf1-3a7a090ac75f.pdf deleted file mode 100644 index 311cbee..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/28e83a87-1efc-4ac1-bbf1-3a7a090ac75f.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/2f0faaaa-24d0-47a7-bf12-908be8615667.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/2f0faaaa-24d0-47a7-bf12-908be8615667.pdf deleted file mode 100644 index 47b76c3..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/2f0faaaa-24d0-47a7-bf12-908be8615667.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/3166a220-9de9-4a83-a283-e821bebbd1b0.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/3166a220-9de9-4a83-a283-e821bebbd1b0.pdf deleted file mode 100644 index 7e5107b..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/3166a220-9de9-4a83-a283-e821bebbd1b0.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/34cb050d-270a-40be-b1ca-4e87131420a3.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/34cb050d-270a-40be-b1ca-4e87131420a3.pdf deleted file mode 100644 index 4f632a8..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/34cb050d-270a-40be-b1ca-4e87131420a3.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/39ad167f-1bb5-4a34-b665-0448695fc85b.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/39ad167f-1bb5-4a34-b665-0448695fc85b.pdf deleted file mode 100644 index 3f0b2db..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/39ad167f-1bb5-4a34-b665-0448695fc85b.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/41b43c51-652f-4a8c-8931-26fbc91578bb.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/41b43c51-652f-4a8c-8931-26fbc91578bb.pdf deleted file mode 100644 index 76fa159..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/41b43c51-652f-4a8c-8931-26fbc91578bb.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4336b007-4e3a-4870-a80d-947008426f19.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4336b007-4e3a-4870-a80d-947008426f19.pdf deleted file mode 100644 index 80423af..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4336b007-4e3a-4870-a80d-947008426f19.pdf +++ /dev/null @@ -1,1370 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 178.3205 0.0000 0.0000 792.0000 0.0000 0.0000 cm /Im0 Do Q q 0.2008 0.0000 0.0000 0.2008 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -26.4373 0 0 53.75 33.72 3197 Tm -(CUMPARATOR: ) Tj -24.5399 0 0 53.75 240.75 3197 Tm -(ONCR ) Tj -26.7807 0 0 53.75 325.87 3197 Tm -(BLEUMARIN ) Tj -25.7374 0 0 53.75 496.73 3197 Tm -(CONSTANTA ) Tj -35.1824 0 0 56.25 50.62 3144 Tm -(CIF: ) Tj -34.2274 0 0 56.25 122.84 3144 Tm -(46598884 ) Tj -22.0822 0 0 53.75 38.97 3092 Tm -(UA ) Tj -22.634 0 0 53.75 90.89 3092 Tm -(RUGAM ) Tj -24.8252 0 0 53.75 192.54 3092 Tm -(SA ) Tj -28.276 0 0 53.75 251.86 3092 Tm -(DESCARCATI ) Tj -25.3555 0 0 53.75 430.85 3092 Tm -(EXEMPLARUL ) Tj -26.5191 0 0 53.75 616.73 3092 Tm -(ORIGINAL ) Tj -22.4599 0 0 52.5 41.95 3041 Tm -(AL ) Tj -31.2942 0 0 52.5 101.85 3041 Tm -(FACTURII ) Tj -35.1193 0 0 52.5 246.61 3041 Tm -(70005116259 ) Tj -0 Tc -52.5 0 0 52.5 449.98 3041 Tm -(/ ) Tj --0.035 Tc -39.8629 0 0 52.5 482.75 3041 Tm -(20.09.25 ) Tj -28.3949 0 0 46.25 44.86 2988 Tm -(DIN ) Tj -29.7334 0 0 46.25 111.45 2988 Tm -(SISTENUL ) Tj -22.2107 0 0 46.25 263.89 2988 Tm -(RO ) Tj -27.4739 0 0 46.25 313.84 2988 Tm -(E-FACTURA ) Tj -61.8391 0 0 65 288.69 3535 Tm -(DEDEMAN ) Tj -28.1591 0 0 58.75 180.84 3407 Tm -(LOC. ) Tj -29.3359 0 0 62.5 272.69 3400 Tm -(CONSTANTA, ) Tj -25.7498 0 0 57.5 463.88 3397 Tm -(MUN ) Tj -27.3243 0 0 62.5 529.71 3390 Tm -(CONSTANTA, ) Tj -27.1599 0 0 58.75 165.87 3354 Tm -(BD. ) Tj -27.7633 0 0 58.75 235.75 3354 Tm -(TOMIS ) Tj -39.6469 0 0 58.75 341.16 3354 Tm -(NR.385, ) Tj -30.4592 0 0 58.75 478.82 3354 Tm -(JUD. ) Tj -26.0852 0 0 58.75 564.72 3354 Tm -(CONSTANTA ) Tj -35.7687 0 0 56.25 335.62 3295 Tm -(CIF: ) Tj -31.6999 0 0 56.25 409.84 3295 Tm -(RO2816464 ) Tj -33.9929 0 0 47.5 51.63 2888 Tm -(7075929 ) Tj -28.7974 0 0 47.5 183.87 2888 Tm -(FOLIE ) Tj -20.4803 0 0 47.5 288.9 2888 Tm -(DEL ) Tj -36.7273 0 0 47.5 331.73 2888 Tm -(IMI ) Tj -25.7385 0 0 47.5 385.77 2888 Tm -(TARE ) Tj -23.9311 0 0 47.5 465.95 2888 Tm -(ALB ) Tj -27.1605 0 0 47.5 534.67 2888 Tm -(-ROSU ) Tj -32.8509 0 0 38.75 50.64 2851 Tm -(701M/500 ) Tj -0 Tc -38.75 0 0 38.75 199.81 2851 Tm -(M ) Tj --0.035 Tc -25.4774 0 0 93.7501 45.77 2496 Tm -(TOTRL ) Tj -28.139 0 0 93.7501 141.84 2496 Tm -(LE ) Tj -24.9113 0 0 38.75 43.73 2402 Tm -(CARD ) Tj -25.6993 0 0 37.5 43.87 2356 Tm -(REST ) Tj -35.1085 0 0 52.5 53.77 2763 Tm -(1050871 ) Tj -24.5917 0 0 52.5 181.88 2763 Tm -(HOFF ) Tj -25.7262 0 0 52.5 265.52 2763 Tm -(SET ) Tj -0 Tc -52.5 0 0 52.5 333.67 2763 Tm -(2 ) Tj --0.035 Tc -30.2064 0 0 52.5 367.85 2763 Tm -(BATERI| ) Tj -34.2055 0 0 52.5 499.8 2763 Tm -(LITIU ) Tj -31.2467 0 0 52.5 600.63 2763 Tm -(30 ) Tj -30.9371 0 0 37.5 45.67 2722 Tm -(CR2032 ) Tj -20.5684 0 0 27.5 331.79 3505 Tm -(OtoICAT ) Tj -19.5044 0 0 27.5 416.91 3505 Tm -(PLANURILOR ) Tj -14.8801 0 0 27.5 543.87 3505 Tm -(TALC ) Tj -26.0315 0 0 47.5 319.52 3461 Tm -(SC ) Tj -25.3645 0 0 47.5 371.87 3461 Tm -(DEDEMAN ) Tj -21.9978 0 0 47.5 511.59 3461 Tm -(SRL ) Tj -23.3562 0 0 48.75 46.79 2675 Tm -(TAXA ) Tj -27.5161 0 0 50 136.87 2670 Tm -(MEDIU ) Tj -32.7448 0 0 52.5 231.84 2663 Tm -(BATERI|: ) Tj -37.5756 0 0 48.75 383.6 2658 Tm -(0,02 ) Tj -31.6218 0 0 51.25 466.82 2652 Tm -(LEI/SET ) Tj -25.982 0 0 46.25 44.77 2256 Tm -(TOTAL ) Tj -23.8877 0 0 46.25 147.79 2256 Tm -(TUA ) Tj -0 Tc -46.25 0 0 46.25 215.77 2256 Tm -(D ) Tj -46.25 0 0 46.25 249.44 2256 Tm -(-) Tj --0.035 Tc -26.9481 0 0 46.25 281.83 2256 Tm -(21% ) Tj -26.3028 0 0 45 44.77 2209 Tm -(TOTAL ) Tj -23.3794 0 0 45 148.79 2209 Tm -(TUA ) Tj -23.2858 0 0 45 214.89 2209 Tm -(BON ) Tj -26.7848 0 0 45 45.11 2158 Tm -(NR. ) Tj -30.2332 0 0 45 112.85 2158 Tm -(POZ. ) Tj -26.6706 0 0 45 199.94 2158 Tm -(ART. ) Tj -23.8736 0 0 45 288.83 2158 Tm -(IN ) Tj -25.6592 0 0 45 333.88 2158 Tm -(BON: ) Tj -22.7903 0 0 43.75 48.76 2017 Tm -(COD ) Tj -30.0301 0 0 43.75 116.68 2017 Tm -(CLIENT: ) Tj -33.6628 0 0 43.75 253.82 2017 Tm -(14015414 ) Tj -38.3187 0 0 48.75 32.76 1313 Tm -(20-09-2025 ) Tj -23.8736 0 0 42.5 36.83 1270 Tm -(ID ) Tj -28.1962 0 0 42.5 82.75 1270 Tm -(TERMINAL: ) Tj -27.951 0 0 52.5 29.7 1214 Tm -(COMERCIANT: ) Tj -21.3943 0 0 42.5 53.6 646 Tm -(SUMA: ) Tj -25.4451 0 0 51.25 26.96 1119 Tm -(UANZARE ) Tj -27.2521 0 0 51.25 163.71 1119 Tm -(CONTACTLESS ) Tj -42.7735 0 0 46.25 41.69 316 Tm -(ID ) Tj -30.5528 0 0 46.25 90.85 316 Tm -(BF: ) Tj -21.7942 0 0 40 183.87 1832 Tm -(LA ) Tj -25.5751 0 0 43.75 233.88 1826 Tm -(PRODUS ) Tj -23.7411 0 0 40 350.56 1822 Tm -(SAU ) Tj -25.537 0 0 38.75 417.53 1819 Tm -(SE ) Tj -24.4085 0 0 41.25 467.88 1815 Tm -(POT ) Tj -30.1935 0 0 46.25 534.44 1807 Tm -(SOLICITA ) Tj -22.5725 0 0 38.75 684.87 1804 Tm -(LA ) Tj -26.9703 0 0 47.5 248.87 1780 Tm -(BIROUL ) Tj -31.4765 0 0 47.5 366.41 1780 Tm -(SERVICII ) Tj -31.8043 0 0 47.5 516.66 1780 Tm -(CLIENTI. ) Tj -29.3332 0 0 57.5 39.94 1019 Tm -(AID: ) Tj -34.3135 0 0 57.5 110.92 1019 Tm -(A0000000031010 ) Tj -28.8109 0 0 45 21.93 974 Tm -(VISA ) Tj -27.2945 0 0 45 107.87 974 Tm -(DEBIT ) Tj -31.6476 0 0 46.25 30.85 852 Tm -(BATCH:000434 ) Tj -33.4457 0 0 63.75 35.83 805 Tm -(RRU:526313235505 ) Tj -31.2435 0 0 58.75 39.93 770 Tm -(AUTH:806608 ) Tj -0.05 Tc -36.1143 0 0 33.75 110.24 928 Tm -(*ttk ) Tj --0.035 Tc -29.1515 0 0 33.75 204.39 928 Tm -(**** ) Tj --0.0232 Tc -33.75 0 0 33.75 286.52 928 Tm -(5110 ) Tj --0.035 Tc -35.1885 0 0 43.75 41.87 365 Tm -(Z:2348 ) Tj -23.168 0 0 43.75 158.89 365 Tm -(BF ) Tj -34.5101 0 0 43.75 197.12 365 Tm -(:0164 ) Tj -0 Tc -45 0 0 45 497.42 2834 Tm -(1 ) Tj --0.035 Tc -22.3296 0 0 45 516.89 2834 Tm -(ROL ) Tj -0 Tc -45 0 0 45 582.91 2834 Tm -(X ) Tj --0.035 Tc -35.841 0 0 45 616.84 2834 Tm -(49.01= ) Tj -37.7142 0 0 45 741.83 2834 Tm -(49.01 ) Tj -0 Tc -45 0 0 45 832.52 2834 Tm -(0 ) Tj --0.035 Tc -27.0588 0 0 48.75 83.87 1966 Tm -(PENTRU ) Tj -26.8315 0 0 51.25 200.87 1958 Tm -(PRODUSELE ) Tj -23.3509 0 0 43.75 367.86 1956 Tm -(LA ) Tj -24.0404 0 0 46.25 418.74 1951 Tm -(CARE ) Tj -25.5369 0 0 42.5 501.53 1950 Tm -(SE ) Tj -23.7672 0 0 47.5 551.95 1944 Tm -(ACORDA ) Tj -25.1705 0 0 50 668.74 1936 Tm -(GARANTIE ) Tj -23.9844 0 0 52.5 185.75 1912 Tm -(CONFORM ) Tj -31.3009 0 0 56.25 326.82 1902 Tm -(LEGISLATIEI ) Tj -23.8736 0 0 46.25 522.83 1901 Tm -(IN ) Tj -26.9165 0 0 52.5 567.93 1894 Tm -(VIGOARE. ) Tj -29.4677 0 0 56.25 101.69 1869 Tm -(CERTIFICATELE ) Tj -24.6249 0 0 56.25 335.54 1869 Tm -(SE ) Tj -26.3337 0 0 56.25 384.87 1869 Tm -(REGASESC ) Tj -22.8789 0 0 56.25 539.83 1869 Tm -(IN ) Tj -27.8369 0 0 56.25 584.7 1869 Tm -(CUTIE/ATASATE ) Tj -34.7421 0 0 62.5 276.63 1484 Tm -(000CT70005001122509 ) Tj -0 Tc -42.5 0 0 42.5 533.51 2701 Tm -(1 ) Tj --0.035 Tc -26.3245 0 0 46.25 563.51 2697 Tm -(SET ) Tj -0 Tc -42.5 0 0 42.5 619.91 2696 Tm -(X ) Tj --0.035 Tc -34.7593 0 0 47.5 651.84 2690 Tm -(4.69= ) Tj -36.8166 0 0 48.75 751.83 2683 Tm -(4.69 ) Tj -0 Tc -42.5 0 0 42.5 833.79 2683 Tm -(D ) Tj --0.035 Tc -34.3322 0 0 53.75 40.36 216 Tm -(S/N:DB4800000106 ) Tj -28.6021 0 0 43.75 40.69 176 Tm -(CASIER ) Tj -28.333 0 0 43.75 161.01 176 Tm -(1: ) Tj -28.3879 0 0 52.5 195.12 496 Tm -(NU ) Tj -27.4466 0 0 55 247.11 490 Tm -(NECES ) Tj -32.2725 0 0 53.75 330.76 487 Tm -(ITA ) Tj -38.6719 0 0 53.75 396.81 483 Tm -(PIN ) Tj -23.7411 0 0 51.25 460.56 481 Tm -(SAU ) Tj -24.2191 0 0 60 528.55 470 Tm -(SEMNATURA ) Tj -26.433 0 0 48.75 280.76 443 Tm -(TRANZACTIE ) Tj -25.1208 0 0 48.75 460.95 443 Tm -(APROBATA ) Tj -25.1602 0 0 47.5 309.85 395 Tm -(EXEMPLAR ) Tj -26.8305 0 0 47.5 460.71 395 Tm -(CLIENT ) Tj -39.0381 0 0 75 767.3 2460 Tm -(83.70 ) Tj -25.5486 0 0 46.25 191.87 264 Tm -(DATA: ) Tj -37.3953 0 0 51.25 292.76 255 Tm -(20-09-2025 ) Tj -25.6666 0 0 45 476.73 252 Tm -(ORA: ) Tj -38.3001 0 0 48.75 563.66 245 Tm -(16:17:35 ) Tj -23.7812 0 0 43.75 358.89 116 Tm -(BON ) Tj -28.3003 0 0 43.75 425.87 116 Tm -(FISCAL ) Tj -0 Tc -42.5 0 0 42.5 351.79 73 Tm -(R ) Tj --0.035 Tc -34.6801 0 0 42.5 377.79 73 Tm -(1000006302 ) Tj --0.0314 Tc -38.75 0 0 38.75 767.45 2358 Tm -(53.70 ) Tj -0.0016 Tc -37.5 0 0 37.5 783.6 2312 Tm -(0.00 ) Tj --0.0239 Tc -37.5 0 0 37.5 784.56 2219 Tm -(9.32 ) Tj --0.0331 Tc -38.75 0 0 38.75 783.55 2172 Tm -(9.32 ) Tj --0.035 Tc -20.6575 0 0 42.5 174.97 38 Tm -(UA ) Tj -23.8516 0 0 48.75 224.89 30 Tm -(MULTUMIM ) Tj -21.7816 0 0 41.25 374.77 28 Tm -(CA ) Tj -25.1701 0 0 42.5 425.95 24 Tm -(ATI ) Tj -25.5531 0 0 45 492.95 19 Tm -(ALES ) Tj -24.3296 0 0 47.5 575.88 12 Tm -(DEDENAN ) Tj -0 Tc -37.5 0 0 37.5 834.76 2125 Tm -(2 ) Tj --0.035 Tc -33.4627 0 0 50 684.84 802 Tm -(BON:000070 ) Tj -34.459 0 0 38.75 769.83 763 Tm -(RC:00 ) Tj -40.771 0 0 46.25 720.57 1279 Tm -(16:16:49 ) Tj -30.1968 0 0 46.25 717.85 1230 Tm -(DDO70005 ) Tj -31.332 0 0 46.25 718.84 1180 Tm -(DOO70000 ) Tj -31.1073 0 0 51.25 646.13 329 Tm -(NR.ANEF:0001 ) Tj -35.7057 0 0 78.7501 312.75 280 Tm -(10000063022025092016173523480164 ) Tj -40.4664 0 0 43.75 698.42 597 Tm -(53.70 ) Tj -24.0467 0 0 43.75 801.88 597 Tm -(RON ) Tj -33.19 0 0 52.5 663.7 189 Tm -(TD:00973230 ) Tj -31.5442 0 0 37.5 779.65 145 Tm -(7052 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqwhx"1 ;s뷳zVwd48I@A9E7֙✟l38}C}όrϋ6b#w3@|}HW{I>jy_;y>{>G - -'v%epdqOWU=="G6QDwQ=7$R}pj~5>r<3FCGh1Q%(LQ3$HBR0JBM  L -2$!H=c1( LLH-$1"M `(ND J(hB6HP 2)E (dI2Q$2d#!"0C BNE@ 5*Qe/Y`0Mq$A@`$1BV& ʂ.Lr" -HA -Ih Dh$HCC  ċR#` 0L"WqoFznĘ   $ 0M aiF& L EH(%$lM4&$!BPT4 *bp77b`0C@4& 0bD!E% i )B& 410N+",%ƘM# h,c4BQ0=B7J#@ &441(D&a M8n iHLB`$4,@$i3)! ` @2.g&@$$VE  D$4 Md"Dd"$ q4&H@hdFH!HH3$5@hiLCDCRHCbq!81b4B@M%(H#( V H"I$,HLL"Љ2 "$#49F@ 0@ȓD %(ȄFEDN +8i Df10N"f#$Ǐ&2m 4A&1"JNC&( 44@$dQ7Lf) !!@`) L @A@d^kz[P`J!8,g&IAxcYc r FTq i`@``@ I  -"1'SY4Z @4@N 4 HHCI44$%8LY8юH&& H 8&LNVA hADeAq",D&1FAH`2D EFHLB16,"d4" ƀb Bg,!( h rR@R@ 4b%!8T@bdH2Bqp&" & -2d"a$$)JI2@S2'(@$*H18P @f`y !)$&DX M& JICC1Xԡ" Ib JL" `HJ!' H̀JC` -QԐ) -34PJDz !HL#2df) q`8d d6Ic$3Li$LM@DBDf1#`"L@⑐8@ԥC8@cixɉ$* "IQ$\CY( 1&SH2cF2PD@CD$A @CML FK($' Z1 *9A$@"J&A1J#$)FY L[ Aa,yA A)X$ƪI(R1 48N19 !ȒDX$Lrh< "MDԄ8<0cǒDI)qhȀ%$E@ %=7` # I n(̆0ˍ%A8$NXI27 -HJp1 ##"hr-2XDIRps@3r3 q.X"B3D (d6BN3q 4'BI H EHXB%2 D @cr" b2D4 -LN@Bh2D -Qcĉ $ŏKw=h#щg{_[/ ")dq`4CTn`bÚBqq&I $ s182RD&@Qd Q2(j(2@$M$$IIqcgxL;7Rsg,1V m1`"BQfyHi D l $,d!`MR"MHDEi@ixhI>oӶ+<]ˎb>xz!s}ӛtI0q `% NP "hb#"1 "$d2!(rhj12L"e pFXHCC0D  R6,'5WYG۾1n&uC @,Lq`= o)& +hQ"H"0a !` y1|>|Ѧ>DK_ȖV69>~ʱ_l/y^M9c4[s1ҖeܤߟTתcy%;S䟤L!~ve ƶיm~Z?˝gž<ؠ>Λݾ7ix'?5}/_UW}>\+,A 0@2N@8i E ĀMB0Mhqu~lG㳳[fKkAq#- U3ngt|y_kG 7 GK\}cWOJAaҾu{(T|q][lrg]F0$Hj% @$04pb&E)XeǓV%\"~GaT+<9o&'=^2~Z?Bm6G O79?D8ջ0>^ !40`A0Bcb3LRZ`&` #J HE˜4yK  0CJCN#i1@0dI! &(H-F0LXMeE:e諭ҨD3oT 7vDLlRuey14hK-9l](Z9@4MW@<;&o4giӠk|U.DX[yѹRow:y[ίֆRDv>}UǓE/R&}#Y9?Z(=y-XRB$&E0JPd&ЅER@Ć hJ 4Ѡ)ƻ\nN*VIrè3i(./>meX*Ơ*-9(/|ey?DOwEH0(2qQh L0Ut Ri) "yh]{j]vT5^4t -Ƿjsg=EjAS5Po9j6 nkyX^r<)|"Lh56dKu]٭i7:3{kŷmze:`1+q``FH"2Q4! ` -Q LB8*Gh(d6 7!WE6C)^Z(y.Aؙ$OMAYʜ=Ĵ˞_a i<&ر=x6ؕDF b8 FL͋$70hLT1HM`& baWt饺67|H{K&Z&ĴdXܩ4;ATqZ[ щ-L@C4 !1@BF"AD@ !$&(V7 }R:=skkyzcr~-"Wea[=S^+6,40` ! hH@ELPPy}[RJ #Ȳ"FTD`$jd2q4S̢@̑DJxx5v8X qf"ġ+鶵mRy^KRxO.hͷhF&$4$1H$ IFkh 8):=,^!y2'VmH5/"ze0/8&9D\dLnIRb20&5Bi108\9%,Db@JN%Q 2BIPqd0L4$4;Փy?@!W` i-w!J&MV&}(k6 rYV$qb#&u5zz#.k3df|2#wmS7,{.WKZ<3jA" @5*"eXA7٢>4B_~֥%/} -Nz{I\t,K_spr}Kt)P`CbƁ 5 L>`{叩4rnz2KuZ--'^{3{Ӛ_:-{[]{L/|If]e]ߓ;_THR Ĥ Ԅ`&bQ #"P R !@CXZ0I%` h (1_+K϶6mJm):`X>qёŲ_V ŋX从_l:b]ՄpfVb b `$#`@&0 $L4 M -h>PP҆M GzךkcggeL#YFCfxM$4z@(R22NPUL@āŒ$ ŀ - @2CP0L@0C@eoջ2ORK7%7>$R.|R^+6+O$KJ ^`n$`HejYbZ#"ۈs\K@ִC(vcgTnyЇ&vi[ ;C} $>rjMK%/s0 -ō2xrJ 5o&c ,c&X(ɿK`|R_J`^qΏ,,::0MRz7Zkޛ&2<k0_sɺ pIY3eF%_vHy'O奂O:"V_@(pJI]N'e[oOW}Rwmv+wWmtR֤QkZ4H]T+, yzI-=m:f/MZ Aiiր 0P䯣`Kx Q,Fxc`x?XUboc+ďqg)^IV8yr^g/Py|6,鬡ZYr-B;dhƓPq&h`@/ʾ:ꬾ_B -,=\i]{d^o_EeWem7 :7?_'QjR-8_=xg⽙,91dk:!O|[cW9/Z'; :E6r ?K݋ױ]x1h}o`HB411,FRЋ8L&hN H -X L2?Qu0ZEٻbP]=9 rI_@yt*U5&SWu=5#X8dk=['\:V ]sBLP?Br;ʎuW](z}5y8I0($Q9E# %eJ@EI(!8Nb`&lv&8C.I& -qFIA c%qe1 rF<JŮ{EmeaQK]5' @"82hHY(FqhP1' -S>wY+[pn"1K^yFDŽO#x`m!lga1Lb ,ȱ9%?;L!rdd6'j$fPd2N %ՉdYdbJ- C`A% @ HH@ Awk;oD( Q"5,I9V,^$a0zy1{C&?xklÇjTlѭ˰F.&G~3Y3ɛ(Ig H) 3aX1B' qs />S,P(a#?.S)癕aNX'.G晚8C1&W&yA"5[רsbY#.3ň/<Jǀie/8dLY c2dfB*x2U3 !$œՈA$a8[$hI8QIJ42@1qq"! -J"1a4M IAps\֩]NmI[py<鴛_}iZz7CWtsڥ[.^@{j\reWm " WAL[#roJ:޷;/5Ydx)Z9TH>ϵ/f5){/k]^.fR\MN"cЖ) -d$!6c%dٕg NrL-+6(iFNo+^дmRb%o6oZk+_x0d jh&V%+N"RB$$Ʋ0ĸV`ff89Woo;@6/=˲jxywZ {uO<<Ԯ&Ng^NI*5ޯIJ!YH$i, bcI"D~_]MH_,jŖu rFR՛ **bQtݕ ج  gf\@ye^A1A0c۠4HpgI|]<ԏ@j ]kFKq+GD5{X@I  z*˓sݗe_U,:7q5m9v*ZyU\˦FZzMsޓJ5 AGtYGV&n6>83ٴ^f5z<2,g",OA7f~)#Ҽ=A}<=o#bz̠f0Ȣ %#J#" " CCDA&0*DC]_g֚ݓ4'_ҧl^BRx5b0=hXdd~h̏Z9I22ǕRq$b1"N $0B@EHXV<>ËC }(ŏ^Pf;̏;0q!8K$ y)*̋"ɐFQHM_85f͒LNuhkMJؽU&> UuΙb=s'D:m^MƵ -->˵͍2άGX't:B%iXk.3h6ǜo}t a`[-XWK -cמfۼ3FS@Oz6S$b EԒCJ$&J(%aaL L:`ϧI8/osuG..x҅ZPoګ6r7rQcGt,tzYnm2/Ի}|]E6}7sGi6{&k -W:"A:::#MhW :79:*˝JF[}QOUeFj6Ηr282 Ml"J#& hb& 1#&28sj9l -3_Qu-!dd[8IA -Qc1Xr4@zVw~WVK=F[e6S,DJ3,ƿ9:v\y_lz"ݟHA>SoDgSIAkw5Qt*٧Z%ƕ,P)xuqykHt(ig50|r-nwUt%P*gnZ,\* 0DdXJ$ cYQ=BOٳ TH15p#$bVlrc1~S2#(/ve[ڕΘNFtJQ^mҹKNes<ۧT`0Ic0L 0@Z(L@l( 0\}DȌesSP/9EM/3Ӧ'/{I2ifL$8A41 MC"`0C4 F(7h4zVxr3) >7T:.xglWyomuZFa#>pГt1ӒK6s3&,Fc 44&LC@#$!DLLAC}N62I"IC1@ bi@ hv!Q44C))!) M ` bC  0@ -!$JQKȠz̛]b(U\/$)d"ϋzU}X@&ȩ@N.n(l@ 1 -)ZhĘ"H@*#@ b4 Lȍ6RC,i0` Dz:ݮ$Q+MgFsmyee|kEdBl@4+@ mD`P` @ bI``h@$G `) `&I -JDHb+oMZ_P&AϺ1Nͯʷ^ًKsk #ŀ cCL L10BCH@0!4:@00C0JIXdZ!\jk+s}᧟hq%d10 0\ -C@!04DL`11 I$[0C@4T@0I%`mD6KBj[פe"-@R!LhCCDa@4LC@  4B@CC --fo|vFefyG]r#i >Ic21.E9i3|k]sRODeǛRPxǛϐȌc1Kq# 4@cPR`QD9 # CDF` A$i hhM4h`ĥcUdsg:zé:a >\7XE4ۖc-@+O`%$ &d !K> c1'"$BA( & FqFeY`8s&Fe R2L"BDd$I&Lb`iY!8RR8ANݓSTMDĜ d\sXɸ)┹0d&!ŕa*Pyf )T$e2Bdc8$(cɈ\d.  MI %W8%2.P2&@dd1mk5(|&yxϪÒro0FO'ś -= Ŝ˅³%3\RBχ, #'ϘPLȩ4!!^sޅ  -+Y']GOI]{?M9$y7O>.W9Z:/7ϝثsaWi}lZ9w~fDŽusk' Y/\+v0zZя/F܊&jʭMFI",QF`ԡ8p "rCN*4x^6dz|~~|;~} bqMJ]TJu 6/3B@ sM8dp(,3RNU)N b8谛#1!"#4)#F J&7Dp(8nȴq Q4 ԁdKzKJ몿*X5MF^fU+r<|۫ XtFR. ^xW5%zZԵ O6buZ}*o*bipfnu݆rK5”n>WlYuq@`L8 d%FI Lf#) jm5mH,@(~t2 >9صZJt02.<0!$I2$ŖRH̬![m7ȼCsCjHx6a5L`ZEVB(&cd)cq!5"h`& MR`NuRA^C*2}Gc2EN kzʉ%hm KS\>ptZpW܊XfQq& %$ʔ.2N g(48QjB dTDr2DHҝI 2k3y1N%<3Yᡠ4IxLkJ2P~|ZLZ+񉀁PE,yHDHH! %ǎiRnd-gNklaHE;&]9aN' V''I˩ۉKׯ+pEyf2 H* h@Rm5}vR$ &,92r") -qir@1@9",exdqep -HBq#$fbyN*4SnN -6Eꀼ~ĭص^dxTk #3 )#*2xKkiB> !zs.D2c4cD2 Ybf,s Ō P2!5"#8^LsJ&A!f@HQ',%&! 21bɏ%pfg, `*jl};wT-X$&2(JH6), d yqf9@!8M`RBX8Z1rQFpL4XdLpÐqcIA.,$JŒ@ " e1MdJA.Nf"h}jr\+s u%N}Ss~Y"SˋSNc6-c\yqeIC.3(4e¬!2F9P #8XQ $K8IDRi4x2F))@@!rL FR& DBQk'f AVROIt>_f4y|>B[9WTh{t.|%z7(-ci7w|r>qekkWRs̺Wuc,.,hP40pi`D@RR\Y8ȰS G !z!%(hCX@ y1 -m0p vt@溮#N.5t~7=ȱm9uͱ)\Rlr9v-.=κ/-cqc*]3UƎu9DSƾ#(S9 il P%D r$EJa$d%(JPLY1&HF V@}ew'pg|aɽNu~=8Gvu -v²Bb2<\esթǨ,H0gM+oX-׏͵aRʱ9cDBB`4Ef9x12U{3>DL4Ƈxd㝃,ǫ9jYmhkdfWYcy>v-ރI9н\G/=&& -QXJ`#.GHCBb$ H "án[-F4d(:m$q\y[#YBOB -VrU{ݳY,O?(:-tgs*^挵#ZM]}ͺW-.Rnåu7%aNgҹK{ -JHAz4VC+0 ܂*j"II"*hCd9Reʗ9CIkNohjy-dz#kw]b]N)u]pD aXƪ -^J?b:s -t,l^l}cTd:͙$7Y*6駓Ybqo@LP$"|揧V_T$S K0a3Ƚ^x31 lpwO#6ܫii|uSrDJ=uUKzs^fh+sqͼY(gK+ƷDzp_.i9tިFn̺Yչzglk=c}h -`f.ۥV.4xBhP"*J#G A-kߛH}m(瞫Jft}uNuoe{Z O1;!F,ʗʖ n#`>%s]t - :yCS..yOX>KټFAq#LJuA^Z xwKEHs&`kO7Bh r#Ȍk$LO(crƲq##1Wc/`P(f=nq@nɥNFsp*k%v:9sR߽䝎)IyOVRc5jc[6.Aڍ}g%{ͺ:/Mܗu l[o?]$[[TY[1CWke5b@fg02 -`5VN8orPPb ]U eC mv=t]M'.vjz"vg=~p͗ee+DY@^7JESKhpmM^='-F Y:οAJsn;W*MD}aXj;K%CG0ä/6{Ѝ&Qo6tsҟoi M2^6mj}(.Uv:ݏStqP6sNsw=YyZ"GAmiճ)-GGU8VG'baMfLTB`0f}E<~KDꡡqu&k=f(78z:zoSl~ʽMlHP};:/FĪrjOM]7wJ og$eḱmN KůŬ#O-!=x0J%M%+LvmlCl\sn3ϤaJߜrN[.k}K8sFXbBdX(O!zV]J6zTWo>`y7': -Lg=&rX<heT;RMCYh8u/Mt\Ǵ} hbj4(Xu&(eƗ*LqA$6LHC x!,v̶h/{%#vERs/7S??XFwG2Y{Z]OVGEhN}zVj/4x?9Ǫ{;<7؃kC/##;I -ž>ODL+1Hhcq"B&9 - !$`,I'mH@5 D$'J3]Zk Uv;V)OT!(X(nuMOH@4 -(4 2,hC"B&U$h@@YD4eP91ȑ& Hbj*L*dEL"Ib&)FHNd HP>"u($pYD2DC\89gR471;~ӉoαgH9ϧ/uB"JvF,OSzDHbr4ȰD$"K @\bchNP}'! &"|9TY=Z9w0JUG|yR bWB}(7Y9<,\W|t^O.USgWS͗:ͺU~]ljwy//}MԒrcy霻e}Gg8 t51Xc_~r;<2A|rcn;SY9_U>[c?㏢>y(Ed]N "Ϙ!rxb/t+yt#e];t-/R{Y:Mʝ^|Xq4O|*azNSoչd)K-~ߝS[v>Og|r:_\f}]W'Ḧ́|[չ1z.rx(?4_/O':S_{gڝQ5l#$!@&?E]_UM9W o/#_7Or^GNe,T@NЮ~K@Um6񏨾^S/{, 2K/J"tNuФ3=~ȾR:wI͟GW.:MWm5uu4,3no&SNa˿QI[zq_:|{BC_5[SfF&4@FIh`&HyrGOY}9~#|Hg|27O<}_^N20=ӝ\jG[ݟBjr"}{! 뜈|r{]y <}u^gӹl)_>^;R@210iI LbjI!$cd Hi@00+h 1eGփ 5˘koEZs~棔.AGt$sO}\8Mt{o:c N}ORd@M+I%$jȱ@ $8b,b $$H`(0%P>*⟶u2 a n,hbbdL4(tl>FCq4 ChMiHL%C 8$baj'M@bBM2zAŬnU ?]>y0*έ{{I0޴5#?Vq~Nsw[M#gC9Ӎ-,;؏9ŸzA5`19!}H+'& bC2!bT~SX/;O߷WQyGUѹck5|׍AxEQ(=k5@<^L/u9Q9z;m9MtIE.s=Ʒlz#!OQ`$`$@ &@(!$4 %I\gyy%plG"A<;Ys.Sg"qkCהڢr`憗zɟU 6|Xj &#$bbb1J!(j-$!@`dFB$FB$JPFEHHɸ 2#$PH (|/U  M$ HMl,F" `+a!b% " q`  -!r6 $D>hcPqc*j5|BH`"L*Ri I")i&D[Lb@C P $,9'#HimMMv.CziUv-`;e -ykZQFEӰwZӗAX:2KW,'216ȶ cTX C! @>mB jCd NQHHE# ` -9"ݘx56VW%aeOa -|ҏcO{ -hZj_͉%ܞyz aVo޻nlOeZL 5u!N,b` 0LR@@ F&Im 0hE@hV `b1$ G`)>@e\YVq<7Xyó4=y{*bo$`ƐrDd"M8n-ZX"A2@X0LL`#YF& hchr^:UHBh B dZ &6 - LC` 410h EL@ 0h` (zE -ЎO՟Y:R}oQq*oXa̫8ϔL)%L@0L b1`7(d]0@1M(!Šh0yvoqNV<'C^;E/0Ii<\x'դQ];qhC$4&`b!4 0`! LjڵL0<V/)45[)sNS#x:F`8ojɘ3(&R2V(1bDHb` 2, j@X9Y4{z-|jn4lv_'PZIu.)}@m>8k&ӔA3tTWyA.srsou;L2:G |-yVS2lzQBr%g&G &wo;֊7"뒰5az5UNTZwR9VWt3K>[/K<^]fwHXtۢtW $@ &rLBD8LEM -CA0S@ kCmy9;xKfU됬UKDN9N)Vr̅0_o<mQuEo%ZWgYIjudU#"!' @0h d6 4`LCBQ^K&~5w-ҍe rȽ",Nc2(2M0414 8%$EL!5IHVDDdXH0$$Ha@ "H@+& @M5+VZmcu榗rpޥʺiXx`g6_OP,gD0n2$)EІёrD\EI*d#CF SW%C,@  lA!4[@dM& [g!;pG-vx=7QjA_eg5VVqڱ dGP!1Cba4LC,\Q -$lx̂ C1MrD"HL2DIT1 Yq*II@ c4 @Ƅ00OWVn셋ϱys\$F & LC@ @ hb1` B`8`'*M8 ŌE8J1(bԈnk{fUZZBY!PFO>Omk}2k|VVv6d A"!$"Ii R!b!`@hQ"#C2Qe#,cD0/gbZ»bږUm'tC{wok2ubS-Mp+XΝ6o,Y(6``l!bI"&PDfD&"&1h0!Hb\pUeES^zK -0n [ZMg6I8>=DB.Y.rB!I_ZeZu GZn9+wE#xzsj`o)KfzV>8%dHdI XȱIMHLdG!$*@8LM@7=>bUs,<57kԎyɀhzoܹ]*6M[Q}֙p= pE5bRi<{j{v-OŮxams;IbTnռՠ񭤯x:v$L9O(`3%$ -PD`2"*BR)F2$@iFbp郈@' ȈG(F9Q>Cc7Z5]q 2@vӢ)#ɣ?x -Ro-Wt*i+SqEK>T:3sNXL cc$#(`D'mc$HR"0#8d!c hJJDAIR"F`8d$Q5Bl+\lq]\ܔF3 $$DDIF J 0 ō&C"`& -2H(LU$Ĥ ApVc@4d8̉(2$"Cq %&040L- IBM & bɝWjJjFFbAdDhL) 1) *``4&!%4g! %$)E $1iq0Rq&"HĐ IJ2 -t } 64>+ޝ2į{vq+{=V{bӮl2F:<'Rӧkϧns1TI30"rDId0$ D&&D4@c2&Vj=~3YJ6/=]Ί㖣^25^_:B>rzeR`$tK+FQAH" DC $I D"0$SBf&&CL $ Q/>"!Kv~sor]NI,N,s8_PcP' <κ Pͺ3&!! @!D0Cm H")TL,ڤؔ I 0C0M0LC3 A30<6(ynAULX%u?իq@@II! -Q0@``&1  D@`!MXhabEI(0C@!) % $E  D ;Eh 0@ @ `  RB"I QE0) m$$&Ȃ#C|w׹/dI0Ch4@*%$DІlD` @00@ L 8$!F@,F"LM(RDI h F3Da/N]qK\ꈼ) /;{S|eKЭj nT-'0dF 0JH@` !#B&q5"$&4 3 RnܛL$HdAH"6MjlaVzER/>ƻ\c{5E3ѹa..kU=O9}5YWwQ BK~WQ:L5 AQ6%&3Q=nLs`2 ƀ1``10hpB|}O@,i 60@"5}ȕ'ʎy¹jo~b;zsJGNoØt B="Gyݮ_fdtDth^}Z7μVm!)#}VWcojܖ],i1獾V1 @ P}wS4 -HqhbQD$d.xvh* iq*Rhr`" >m@/>ßw2)x(:ɴZ\+ljIOz%kMIaH)) ״qJ4$( -CC4Au9u^ wVUr@ɥ~sI3͏n=6ߟ/ciqÛ{eVY=<%g6NW+EU A$% c  &|qٸ/{˯RԆ&0H +@1qW0DIRbSޖskG2ds=?^R_8]y6R,d]3Nmirl[6>1OGi~QQ:,NgnY.uήխmkuidqp&$&Lb!! b0c_v)c +n bu=U -d5IJ2&\o2,%J2 chq4Y7lWgH5:P*x/u["\V<Ά۲n[Jʝh)9vU۱#fӦ(Ȕ%%1 Qqdj!"2$! 1Gw 9h}КWsu'`[)/5r+_}CRiV.zW} -#DdEř`Ŕ rHLXo$O&i:aq˙cJ00%CI(pdX`N3L D!>{W3xMnܑGiElϢ(\ZSYj5q-j爰U^c6M6qU[`xyVPz>9]/r]1Vl؉'hj&`EH` sԲJE`5&BFƨһ=ys-G4\QC Ye˝KsX4;<;,꫰i+~K@1abvCi74Cg7XnzN+Q|ɱi9gaK<.˳XwO^& 1O{ ԄL0M Ih'gS]6o:^,*ҩ[zΗ=aYlV^= Z4]Bz6ڗ)smxu+Xn~ʪ{Rf0s1@(֏Џ.p+V8jE"7'Yұe'=QƬWXY4KG);li5JH -UM$HH11AI"`3aZf ʬ,Su-#3it5

^t| "*w!GQ@Б$Řk(ax@H H1I dBD #R `FCHɨ4HϺ۝4M]Fy0z#s;}bYߑgFe_m;_x=:']}๚2WyAP8|bȄ`S!Zec 4(eB2TFG HDX -p(#pcC !$Dƚ"V`F d+~-}*NEǵF[fg=֛ۛ9yFFUg:q -]FEo]v[M?TS8SR25 i 8D' FdAXN9(`r  ԽhsM}6zlرqdx§K©/~hKa.L!i{eT4Q$ F@% M @@4Fq`"R"R `~6U8LCb6*q0G6vUye. W=tK Jҳt+9zlFꖳf ֛#,s' -}ЊF .$#6Em0c&@$D$D &!L܂j@ӡH _;/W8& d -d*eafם S3'|_aP::1\ks]~a=5;UGtSN<޿MQ}Ϻ7;0GRc {(wxʧ_}/tX%L%na.BPB[e--hN bEH1&( d1=vkz$E bB -$D<^Ԍ=lQ^DČ+S(~|n ߜ]<ա5Ys*bl=oR{J t|ӥP,R;^OJyRjՖsfM@羿E(K6{96*}ˋt* 4&!C@4`H5%>:w\@ b`4ȶ` -2@ H"0"`1Ӧ MHA%# 4O7~ &չg5B#Q'\nN[f@ZvWuNsu9mMS1`?2@P`C@E$ `I a  )D HP@ @SQ H@D -Q 0@$ @ yB9_F! "125#046@AQ$%3BP&R`CEFSaDTbUpVqdr FmNJ5$e)VATsepL~ ""6Jt HlpU,ŲehS}:ZFIHʜyc+M&( }+"2s-. -u#9"/>xNdf:Ҿꞿ]0 -vsC`ɽodfvAC0Z jTݒta<,R'pW/f^aLSIUG^!p4Y난|A&A֙831rqBvzPNKΊ94VOUtm:k:um8zUQ4 6YqFm4 hT0ImTҪq:7ʔÑ16}5 -Z! <ݥT!'g2D K&@ofـaxZUH_u1%hpW$AQs2ԯtGlOurZh.lx6nN8 Cg&"Ҝٻ2$lZ(.M0FI#x NvJad$_.ddde.e{2)v3)\XGFF;AVS*PkgU1H V씋UtᶉYY*"qŴEԏ7MTˮEnS**ZQ @PUY|qiZ5TӼTrNh̊!w(Mtt72Ima/P3gArk)/ ж:g%.K5u^Kf.˨pWmMhpVeY{Z!:?}e%&9twMlg>rJz??*c9r5^x #2nN+_ҖZPw09jUGJࡰZ1т(YCftVVugMHQ4"q t8 PFlWĕe;JAJW/k5]٬}rnYVVT-#D)#pƕcWGcR0ƕkLJ3 \6+C╀rOgU*YZk? Vwff>zrn]O]O~7_|c滿_1IF{^~5!>_%F_O㾿/Y=uSDޞ>:׭hg0?'_ONuSuܞzI_O+O=Y~e?]쓪 ~I?OdeIjR ֓?OhtU*M3^']=||u엮ٯ]i>A}LE ZNz֓~iWvhة*pNi~pZGs,[Mt##;ZQdcObH hqS'ݟhUJ1a2JKl)Oh @$Ho!ieBql*uf*r>~{;7v=gDH,Av. <2 wU\"촎%Fy+_cckbn"j1&\0$d2VaiJ$ESm?x%pUjsO*W:`w/O˦ס$gP؜D틄i3FU9 -J _ <2W'ѣE%ʝrlYG@M?IWalkZzODDΔ.ְ%yj]&hg3Lʷ %mE])K|\i (#5٬sܖ$m n6E%EZVU@k\ТЖpe#Ԧ'jnGij4M lEݝ٬k?5%m "R"&)5~L!D໎kF -% -w.DZ:Tiܞ̻Ld鋔WxJ/ -(Ay+kOfVԔKY 3Y$*UJu-#j.2Yx<cNC}'zkfbmj/ -|PmLBT\#vIhDt%[_:C[=sYݭqَMCA"k D -ddֽhP֭3<KƄE_,'b&j4aV&Tt?Ր_V"J [Z+ ˧SmP.S4 Ip iLtJ/u κ@ҀГtQqnJakz;A ̕Nj;ᓤ^+iJ2.vY&PQE[-| ŦN_/joʭlN#VE lb}6Y^gEpcڂ+HHh}TURjW5 {u3Q& <~fjv`bs:rQDuuM)6C%Sej0!jJ7h]KƋo^]\"D[Toj46ԕTٛ莕gWY#K"X_9]?HtYd%9{|]Q ZhڏLs XmYsZK@6J+lh]!('Aiggk[- m{q[~[`bBEq#PW$4)RbJpۖcO3)˩\{zyZN`0hTUUiZ\h'9V7"o5'2mrl۸ˊى6E#]CDVˬJ)ӆQg\/ۢUm0Q2U#Ib =R}T{+@n[,z8 _] Mp:zmB'(`L7/5tgbN\@k6VZfcdp8T[}Lhc[L\DsӚÆeUUr;<-u(MDM*#h(=`ըlkstx표&BNﵳŞЧ4ږq#%X<%iZ?ǹI<6XuT!A9l%~XU5J+ujk hP8}#s[>(6uiLԻfDk%ֈŌ:9lc#agg𞷝ς$-l sVG1\o1  3̜.M$ic&.-q#1(w:Qy:[z\F )m9k sn YqUM3WRW]f+fWf]8682&_ .\Mqj$s+fԽrL؂Θ62FOB =LoQ -R:8"i\D\VDu+4HUVԕ٬k; sJm&8i] ݻ7+YvW?0s&ejZgkA鋝Ҭ2+^ -1fq&K_""&)S .%.Dr$,2ۭ[O[JJ !ҐŒvahy jKA.rrt -lbRtz"J4iW.N[ffNplUџiMD‘6]uD^aHG,C+'u9o(T="(-B>& ^F8e 6[ºfLc+G9-["iUV>08Jnۦ/"WTX̷H :rD -IvqSň:!.l Qt.xD&UY̷5ץkt8O\?K!,g8&hMyk5uH=Ը^T()ܔ(Da_:Ln!w9H g9mVnMIr|Vqt7C,H˕,cjH%Up(Ƌʼnp(Yjٸ]sJ i*?ΛF=jJmBlWV:;qWjc(&/lu9=C@.Gw::13:3%/Usq^q?DJ쟉IU xMfyu#"Hy%L{>bTɢȫ*Y5^$r՚7$R TxWxt#T5,GVK F2G(o<ע:p'~C&k%,sb,f#ڑ ͵Rr)gGMI.1L7Jimd(x:w٘~Q BJDкNҍYC Sj!)^k+Gsé~ E{xYǜW3$?ܵzYk;0j} ?S1%+`dRQZH-33,vGF8Zqp%z\a%E脤 T7ɒkRF3Z0RgHe |K6S*0&l:]J lp&T6P"kE١֙=ۢ}Fzк%U>YiHoT(V-ED gSfPeK a4&PkKl[ jEJvOH/<J,δ ~(jT[n#D Gߊ{oGlUӸlxW%UWxT^lRMu[Ap1QDŽ W:pqDEUqHZ8ަHhH-jݩ+]f"kUfZRngmЯdjjڿšy5cM H^_JykFh2.d ;<T`řfˈh瀫g0J./ʸ8+ -EL%?QL[)Zzֱս6NJzVz;.'J[k:O\ ^~~^uuir 7qTHGdiqL2yaD?Z"t-_WWJXcWZv|ۂt7!.2I`ZK:h@#FVZVSVaO -G7MKQz7%Z\S0%+)}mj8YQS.MUX͹Rl/#ҢF\dm.CI )p*¸CE@"t/Հ4G~C RJ;=Ig<[6Y}>TX:)"y]#iq5 -7\RV+ȕ%*M{Θ ijp]\ {YJHMy{_ݧꙔ+d$+\}tbm(EJLk?*G4A_P~[ؕX?E꽫6 -㚳:ˊ-9vV)0T̀K)m (BY^zUW>**La@4YehS~Vmeԝ (\c: T0{ڴ :K %)t̑-8ۯEp&8 Xn3Ƙ%$uEs[^1pC,KM!")V+zTD^t&kUqZ5Hh"R8EG~+Jx?zBLҼ('9H T,LP'甽EG\*ˢ)Q;<[Cߊ,#ˣ׆:DM?W= ũA VFUʙEJ FYհEKM9LaT[.ͦ0j&>:i;W:.M-~fե>DywRApBmW\*l-JqT^ .z-/<6\yEM}ǐׇbipѸۘTwEqVo9 -C2v>![7tgB$JNJ}^eF(Z6ӽuaq{jƐ ٵ.4NW 0t7 U9tPEurޤ<驭d5\Ux*ƫ+‘4~.%qA@K|c^yxs ScnE1L `tob\g/M˹:p+@}aL(%i~24%44I (-'$D'U*,pOk9 #rh8TNoyZp8h ZEB;%\-"gy.+5BHE>x]h4jZf@:B҇!H{^^{eܞ)z)ꈩ@\ʮ(#]j>H \iv;B2fZPkUL,HcRL*M%ԪewK\M.VE(IΉ\  -oVSp}\.k5fY*i7./W;f>wg=O|YmBbc>4K[DSLȃpUi&*W,E]\!ԋeY% nи%Dк+JHJG~]UYk5uϱOX׀o*'Ъe0n/>].ecCO6Yׇe*[Z:++ts=TA;,p vbMCj'0bTaq\ՈI ֮ohY"4ey2y;oaMHjSQ@%o2%g&;&cͶB"<]o>ZEw?8[VU\`9ۂϻtQR^丵c:5ɋW(\P*5J/7 O}#ɝ9hLR:uvifYm_T;JtKWz]S0%%E%,T\6 諣YZ9$\)l[ISY$f]GˀV:+q޼Jُv}*nʚ:4̪la5vvpU"-NZÁCxVoM.7>t/Mʯgi4%AI"b9vM7j5dTaC(r%;sjj仒+P}7(+hukJv,}:L)3dXndb6WYɼ|l)պZJaJXܴmg 9_M:C0T)$8گiW \JG~OkVTj$RO<֞.2_IrEzڤ'V14*oIV8 MHgcZکL{An`_zzѥd0_wu.fƶwV*9b@p3#pME pnsµ݉7 m[(w;J%rjG"x]6gt=4+ UbVZ0T[J~53c*)}IQ+H({Ҵ,s$B仁#DBZ"cl6mT") FBWmdCoo^d0f+Ste[FC@Ǒ3̷qd<к4IG -ZW: LŒ d1VFKG9@7j2#ΒZ;-wBHYv=d*b΂F$E:o%+ N֜d".7H?Č+~2U1?YkZɵ|滾m-YR um>vo[@:WL#*-Nd_i{ԈXEVJ(+@8M9PI KBe+9+Z*֕+RVkRVkUj]Z5k5fYߞ}3 `,_w #.(Wm91|KN -xGtN!$zLO x1r+ko㴣pq05|%d|Y%N F]ZEg< -r\%zENZ暸z|عPWH~AicD'-½H4J'94Ks-4*-pTmz5%f.j1jAfǒs;T7qp.WRq7D`MPjTw@u2K* VOQ$Je]q;1p$ԸF:;yPE=WTmjO6Vm} -:t4L># ^ cˢZ1&{qSy^lnY1%S,)I_& S< ׯ1-Mq\᫶y 34R}ZsEGSsI$Ks4a$6OU*YD*].b9\P,mJm}R^ZwvG}$<c1Q$ѧɌ|idU2TwS!/Fq-Oܚp 4W;HlN+ϲW -΄DPsS '"y>88fF UBȌ۪˹hg LwKn.<@!(4}UjsR)t٭N PjJIUMZ6hmkN٣<*M ۸6#I9-)Gژ˱TaE?Otqa)p-XR~-VegWBM'E3*r=ѰY<8#р*3~{O/n|5+ylP&KúZlケGLd㔴fRANRq *Uϲ˾OՖ gshQyOATX_[[/bAYHt^]ރO#aEtM7kbRw%m9 {tR!y?DDxB"Ӡ硌MTf V.܉WDDBZ7*cBOPUk3W@C@*T8DTda*'oCDuV%lF763TbwVq̀M0In&IG"ak@ӎKL(&48#&p@ AL4ضQ-009,FJH۞dȚ[ƩR[<:d8mng (O=L( -^ tW EMeip -MkۄĘJ)!X6Zy qS͌'+{.dc$ŗ9:ӱi%TfUE^0`ajW-M$7b5>ss~QΚeNZ8JZf ?J5Gy>R Wz]@&iϥJ>lcj6+6Jks*Q} -pBqp:/\_?WpEh"i}kKrCgƫ呾Nx8%Vw~k4fYk5fYrg{@}PUs$BEDDL%#Mj3JOoq(p[PNBUQUт>4q#߸m7(#+ܣ0KqKl'ݚ⸒" EUr Oi8յ IOiHe(]Q[0RnEIZ"0ג$vG[]:+  ׺i 0#QU_,RGbR39[mQ&}(($_߳UU"vȢ|u'Kn:V j>' T MJp#r@mp5"Oc%JP*zJ6UJ M<.gJuSqwQ:is¹\P*%kO!qVZUjҭgvk5fVk5ϰgnDa51;?@M#DA q\iۦwȌD9cԨmDC%[FJ`2I&0HBvq]96 'wDk)M6:G" W-Hy5mrݙt**G4:jj˷F5zf$"hXmmh %l/y_Ru-vZw]Sj+6U`;9Ս9%d`KJHpm3dtyK$($'VpY #?2bxڿ-^;pR2 * B=ՍИ%MwUh@ɏ;:7)3Kʵb ґВÔˈj͔k\Li<I/'>"SpA$oMQJGqo2CƸLפ"'6Z/ uXH9MG4DRpIb^!1Zf?/u&juWtUhhfoz [|taWި,3o#Vǹf"K")EnkiNj4VHALX- ,jiƗc5p1(txw[/Ԧx̘TafZV ql\L4Q/|wZ& -Ej a8z}\hdKj7Q].aWԂX2C[ruBfHx'VN̹ zW\Wb> d|R7`LJX.Dt8iS' wCJ0sܫlR~UU.}*?+}LKzAzlYEyfjdҸ]͸Τ^V ˎ{ 2,ޥR L4ԵuFc-B+I+)^c6k2eEV.m}Y ѧRUzH`4m?5q*l';e3nd[,k;ZJ\R{H}HWM0BZRDZozGmIRTLTXmFצƄr2Njp'Lۛi.UVEx]ET/E.*E!ϢWANse8rU`pJhn@؏b650ܦbtX{ȍڎj ВKPcܟ}޴h!rjӫ'EHm|4ڳ ^sK( - )mRKi^y[b[Ify+zĉ)lʗnQhe[?$UzX3I`ul#D4]ڒY^{k4Y֪ZUfZUgfI5k;;Vw&EGe$9Ec Xl:Ed]LYjFi#4B-MqB(ivH;o7h¢۟ m^Lێ++Eهnu&PZ*6ڻӹ7-^u頰)͡ -%}VDU8JI۩Q]dG^wWO"SE꾱䆗./ D@ujU[1 fxh)_a4w)zʥLUdT Hz*EɘiC3WB\Q"hRhT."rh ;s3I1i(\ELӒm{f)MIEi&4J֕%jiZRVfZJ7@ЍVQȭl.%w\\rr N Zh_dV3f|DR+wǺ9"SH U^#=VS5QfW%]wVL ioʣz  1/BpGlFEN&V99oCʐB`fΔnBݚ_T=ԽnHPV޽z#+5}yvM3 D^9-]dHHG$8dGz{B .>q2lt2n-[d,5RoG3<j%$jEEvAR&XNr:T3V]i1S_Rd-@\b\R~kZE6=tz#R-ѥ8*\9œ?[6_62 LǦʂ {YJ&&\iD~ -a*9b*e*a - ]*1kS>;էؤkfbH*M,EU-totmhC8 oMƳD0/J8*K.uҪ+6V$eT%^SͼjGՄF]>oë>\ qw>Eˍ)UY;Q@7[[Z +bڄRXG0HҜDxl׳vT)1el׹Tfjw'nwj1V){@Tҕ@ XWT S-|U[ZjjQi0YU߭t$3QH&9SYƒUG0!`i\@J%$!N'8(%(%WmKq kfRP<,f&%;ⴙzcy5;1AJ_ZMI u0z -ƶF7LVXM6.w:PS(u4騑F(}ijM{ѢO6-::G[RyT)}I` aS^w<Ж[B#,OoINLc6 KLTdc -ۄ;x΍#; Qq)GVMk(I)։$jD{ؘ˸j=ɺv[{HCҥ@h`}_{3)+tZ> Z:uxo)+Nakg)\U**LE ѦKa{鹫~6ީAJ]K)9ٓh5nh|A\R*V_h\qN}T%" "wSN,SˆU4bؘL QJ3&Sh/"'4D)wćqoƓ%.%)4Pm%. =6ނLtqTg -N *" P:gP+IDFBfh{_R1H:_qu/ri ;!"ֱkZ} 5-e+5fHfVfYw& >7 -q G~Ǘڰ'ڴ(hiELbac#b;!BЎQ+zD\_ H4gBJª4-/}E< 2ch%^K\#Of:J~Zӹ)8E1NeqZitgMq?Vvss\D4Z'*$\A1_k!޵%jk5ϱ޿q[ȚSਭP8`/rݥ>ԈOpHhNVk9hE\ >A\/* UʔUQ9 ʱʴޱʰTUڠBjWw:"ZR"Ү+]*R)JZ5ZʳHiJsY$Z+U'U;IRlVrpq0{ J^{ܞ&', >%X $J޵)EҒ%kOkLRR!VyVe)7-f4z|{4I>Q=kE; Z.J5Ԉ?[BғYB\,k/4" ̎.pC~xi >9^d\G{lI'"7.FGptK>C[Aq0tH#H#WDYO6fM'L0q$q$MWxb#L#uY!*kqP-w%GQs\!Ҽ#0q35ZP.H9R.iJVfzir-'Qk;Yw&9tQ%< ai:E\Ҵ.L!rI_CGQ p4&poD[Vx;+Vu!LU7 j*ehZ?vi{Ti4+(В ")R K7 -U0qX䛐/w ;޲/u#Whgdjobur;dqF9<{^I1XRGG&OHj@ ґn-X6RӂCԖڸ]NA -1=Ք NcA:*:y6Hi\u?f>(ShCoteV^LMk8ǣ;ΣfEj.]}KS!м iHž$;1#Hs+ / Є鉹iVҕi#%*pa -{Gե?;]\S 5q?«8(>.@I8))Gr]I &\9U;qVORf4誔\n!Egp5c$L(~tnM|=R[T+J*eAM9ӽyDDw;rX&bi00LAu.ڱQ@\, C|GDb+<8¸DY,&QRas,ɍ![F]vB8cfT@NBÈmm/coft2HTum*shB#? 8Nti5vLr[GK* b-z4QV:FTHK1Z ZlM%UD]-찵rh%\VQ@_k.#uxQxjEx%FDFr#B9FU@8FGҟnbXV+MiV+bX{,u\V;"ChӆV&ͥ]bZG=ҵ֪jݚggv+S @K)S)GӱuNGE/眆Q扵Jb22nT.q*TbGhl(5%+*AdZ9LxHfsjHRۙTejofTGU;3d8c - Լ{ԨXxF,Y/ZPxsuu/ٖ^3y&RQqId ׆L)se2(pNBxފђa]4U3 jm=s28gY9So,9A%C Q% [,rZ'xHi%*ڔDҐ;b$XaNIBAm -rH-trH[`TFG r_󢪪qq,YU:LдG_U3VuLa*d`Ychp,t/XH|Y zhݜ 9Irct6R,rhUNV21yBgv+HY\o5jkU"3YfYgA;G]m:YSr"Ǧd3x2*m.UѺ&`:p7鷸WmkqpD8L v҄"\Jz|+Vpn -zm -i!ۄ&q̓\%82YdM RɖEWQ9SE''/CGƚ\.QTҘ.I2dlR-_1Q16XFRZbxZTHU N!&k=B\Vk]"SZ);i -r-E5;{6.sr6((|qs̃ͨw8W[GAibt%l`I в9&/G^,FԦFVV5!  RUf '1i}%/V^D}- -<[fըOR~_ qɏMA~Cf ; 'otlyŋ1QR-WH *w7>w`//|CZjlڸM $K%"}7ՈHs 9 -f*5*12Q Rqv~cm 6/1lշLe1E6~ro$`ZҲiW5)&$LLRnZxIu.p:gM{IM$ -#RvIJGj^`Wd4pdnr*YGyiW&Ἢofws,;(;Dp8TG2o(z -(-tPV8*G X%%4^Q ZQ2v7tVr.''CUt|YAwR4Z{q8i\̜vfInK&CJh65Q[UEi@uJaJpܑ[A\rM2fmf˫ȫz~=u\ -rꩮiQu^՛Oc!.0O.)Jq"Ut>#޵)'}qZ޳Zvk;Hy-#MN#91,=Pҭ[VYTBydjgmԖ93• #߻1αf1!1tH6K -Vڴڴ -pPhJ5ߦ?Rm>lEmi[E5C]9=qhB*=-h'PusNJ\' '3i1ƑpFj?JGhMqZ(}Rc5~U~f0aّEټ.+L'ڰiLb! Mtv1\ r+%KMAhBZ$s.y<DI5\hOҸZ#AqF5j?zfY,~{M)8iQ ffg,L%iOiE}Bc -FO}kI}~u}iuRjRsJZV{ VByErӎu%KLdJ~ D,RaD5X9~P3֘Gx xFq8xƥzF7Q$QBNts,WҵVTZU"fV"3f3xJ-hb9W:K\ZYiH+5)%fVk4lj$ózfPC*مFl%G0 ILK2u@h IX? ] #16 sW;c -&{y󽴎rדP%0jQYUe~D>B=wnfT8!RYfjM&IF F3J=BcQTdׅq jK쯸Qw8H"WGɳC$ &E\Q}!f=ZҐU"33xMJiObڱXJViO> L|鳦#.zOszd̊A㲎N`Bd7L5TLJvt4Fo8o5#R簋GxǦar',aU -ѩ1U[M[ִ5{HƝ$ahFꡒi{Љ.\heA )" HkuĔaI -+.[ W5olp֠s^DWfdxNp22䀒 Ġ.ۺ>w#[b ҦUt1KܵXxQԴەh2\&k -)i4?:(0ld\@#)c4+QT&LGQKR -<7L)K n,i.xd;I\K)VPUsOQ}?GLFe)]IMjEe0ElL&m3-lKVoyᆰqU({tTJ$BU+ehQ&`$E+VwI؀dܐiu?n祾s8 i23&5$c)Pp+NdU[mLFN~ܔ)B>8nx;-AEqL"Ď*WSM@)ʊ(n2MЦ)Pv, OvcA&2c{;F%߽pY *@k -42cݚuG&-'.h$ErLVDFQ{r8>4vvie9_6j'3VfUJJEEhFxVw^7\J- -St?Jx~ՁϘ N:SqU'-\`0vv1۽7ÞH}9hRJBEOixLf;䞆=FGt181X3jtD5iˉ,#>z~K'z\I kCSt[e냊[XZn*6ZW=ʔШ!.U&~ģґ}SyH(6b"Xa}\4{8Jqa5?Y'Q=,#{rJpk3lV$)UIh8Ͱ򺪤{8rQ$ǎs^%]I}|&sDD)V9jҘl#0/t[RyUJVBIf}e2k³n>]!"wQDwIbc &;0+ Z8:nxվACjѩ[} -KÊTjR1鶴Mk+{zGBT$Zs(ۤJlO{Ui7(uWD -9nZ1k5pݕ!%LoXc72?qP PԏK6"+m-V:X ͈dJŤ]}5_H4RTS:a C(WPRLeUSUI•!w-+/ֵbҭfY֪gvw*1Xޭ@L"R5 !}lt -w|}R">Ui9-S_L'v(Jsi@@q?Dd "ɖNa"ODx4t1>ˎ"h=5ѤN6i^ӍkpmNj/PSÖ{*S Ls[!T܆p$D@#DpWJ_THUEsKq3CFVUrK!-1#J@J(었hc Er.Him6Z9Y%$"GRupI`Zxda8xtƐESFtO6O'S* 7;KfEzEZfYݚgv}OElaFZSp4% `)'Fkf;mBb:'r:K9ZVH!ZY<*$ vԎʽDI ߊ."w%ku1أ2idiH_ARµL:4$ܵ/*7f6A5>:aMv?MpjV?j4)ܔ6H=ԬзJ dޑ -Uj=1?X\BcOW kv5dmTUJ}[ch6$y)co<" \WEtߚY0Vkq&3ZY_=Lϰ;z q[R'w TXژN}!%c4PԋQq%B%6׌A%EEgvQ+R;~ե+ڕTӣ7tR@Ʈf̾u)}xթW*CrA>-2sRHei -jL-)w!-"w!ޕQ;X:(G *3RY&6]aosVKl.8Gb㙳}֪6OBq\Bq\$Epx4⍆&il{>ruDž\Z"+&)d;׺l*J5~[>I>u+tB4@4(ı? -5X=og ܛ׺_'*sVo}U< -yծ~v޴p_Mu"sXjMisC֘ycauj|co0l;7Ks$']|Gv8&Z(#cc}2UZ&<+L.c4f_|vwbRJn0/i/G$ eZLQ|LJ94Z!&Z֕֙ˎGE>]E>!~qh rsNKw^Vs9S=9mKw~7^Ϲh)c +M1t)tltUZHӵj#SuD BqZGYgHZn~KV(n[Euu`Ό2S v'x4^[RX4iZ'3S_N@?knW1qP8 fXGKd_I(T~bִYX~dPi7cU{H=++ .*rVW"+`ZۏIܝemLQ5&w4m"ぺۊ߲Dypv(m8Q0=Wfۣ "~y[BfTuR$fK^EOg8Q={L%Zmc")G<)ڻVFeH`EC$ {QSMVF1`qxX4\'r"Ӆ-_bRn2A%4){6joTdMT[>\FOY䜈ڍyF LHjz|(W5uq[*2)G/ʞLz9P4mUOLBݸξL"RJҲmsn[̛\RĎ{Cĥ.uMحH*c,TROMǖ⸹BڂڀUCΒٷ!N6L -"%Mc8iMTMku -+e]E~k\G]3'ZRr΢m#Vxgy=zhgE%ҏ#jJR*jO9U\ΎQ|3FhK&A4əF%&N=lKċ-twI'<ԻKR^*;ki f5gcܸ"}߻julV3+r\bq%t -o9Ɠs7<:-_\˩˪ڰҫa8mI8Q:5Jm4 !V\ّ8}:2q#X9l*O?zsYF^;ЦK{H)JB1ߘ"A%^V2 *B*(C4uS# 5j&nL~*.02b6Ew%.MIEߍɽw'ZwjNs=mb_J]ܔTߝ:ZM]R]$ҋ :5&_oC=n4fFy5q2A UcCV8Ƞͪ&w}izKOeKOdtܛv:}+g4u|S;onaSr_ЉKE6Wݩ# նF˺Uc͟پ[&8)LJ\yP KE.ÜgY1 [][4æ0b(yqAy BQR.kiw&/U=ro]KIIK)wU=7+fn%w"[Lz j(Z_>RZm,hy=@m~ʮaQ o"e -.C{@ - i5l& ρ+{pew|<%\n]QpKfC"e]%D@t@Hiw%/U;bתR;-[-v}fJ4Bӥt'z/3(Iq2$uMǹ}cW[ c -wRYl;>r% wqmqA`)X!{ь"@b!.JI@W -NƑOBnrl' -:tfd-%-JUN&h]lI784:QLPrD޻vk4r|Ƒ^NǴF3p-}ۯa)쵞 &[%UPE,4wKĴy2!tN#qLx"E^u%&ITC j9aq.W<. [tΕ&II]T73ZMM]J_ ! -U~񯈝K!4 30i敹M:<%] Y<դu 4%ګZ >u& DMeIQnkb^mup"8Lj&XjKY%2:-W(SaI[ .l R(5 G"B&WSZtL #Vxh 9oZLڏ&Q e,\N]jZ? X,'C7_kQz1mMEm! z0N9e^E(b[d*s=nwζG|Us8Q D -s}]4f-,ծ+Gj{E /kYnDL ;4Ɍ"}+qdӨnG1FjTwq2)wD{Z-ndVvJDsĄN&|wjuTJl}7R&кӖ޵`L\wAv.I: bl4 -itr{~>QN]Ҭَf```ڊ]{Gj>{W9neGMw/L+q]ZFb˯$ ĸ\KA}Jrcj h Ā k7C+@2i[yp #{ G7J5抂l1RSlETOjEqFH(ܖ\8%N< ᠋w8/DJoSͣfv>5wϞxg@mMTC7Rc9ӡ!.e>-&QGe"64ضe@nD[GZqn[:kj67.'Z]ɽ=ub#pXmז#LWe{ ږ#IO;qK/aubUB[jEDT¦kE-P&AFKT -k'`W7$huS0˘L-źSnldwݸ4P - 6P/\E7[QYJdm{%y[R*el\lw!!iY-"2޵_b;i751ߚԍDUQ98ޗrս% )  |ocE: -VyD*Ԙ^"-/+g4>4+j7Ҭ~m{\GD;3sa`[)T٤&]EآX,'@WGcWX>7)Ih!]s(`K=۳k5S=l|7c/Q~@eN@e& ǵ6e旙@|NU`DKqCĩ:ja궏lsJ: Ao%§zN+7gvwخ˨ۭ&Q~C1Pp2kZԭ'Q3&DW".Q:l7c|&k5q'\Ԛh*</5E!te`ݏ!wK'xD1[㳵ُ%>uqYzQ:zDufSZpI7=!S]!=-:1+fC^nNh 5mf|/9 2:WtdFnSn2&6G7NK<*^,wmȈ%JeW-)ŵPt' eTdUR(:@ig~e-NC2b0&K h=a{io*9J#znŃR{rzk@A\utA6sX bGm4Ɓ$* FEr\VAؒ**e$˨&&gS.dG4e.: úƔq} *k:B\n~./,W85FTX*o'V*- -$]Z͎Vq*K*pRrVwVEֹZm[L0\"CeHq[a*dfKU7-D+av~GJ +S JKlW{l\NY_útpSfZ';&2JUe{)nΞS:Sm;)4e;v:g) -liB<]w˔6Iˠ`.G,!#ڗÁm6_TᣍRu^S`A+tŒ+i|U]Zw)ՀJҌXv̦Dz<ӶUUO%cU"k!UթSp/7$Ԟ*z[-;$bViͩbJ\67wtͲjV4>[m@`d&_$iET}*ʐf|펣6LkVzsk3Sj+W R]%Hjih >y.ēfa)$:LeYxr 4 `f1p.5b2FIsM|^2$VvN9'AO'H.ro!"[Qm}mUxh=;Dݮ+f8[[/EOcJ/^5{8LuԉVNjuH_жuZm 3M̌:*뇸K &ӏG8Y cq Q͖@'Nht[Rp^b -GeSnyTl -<&˾mv26WX>, -~UjڽXO. -">s DVJ* I\B$(w{4>Oʙo8$7f-(bH82I> -2Ō*8\Jp牺SdgEeKk,.J:3b o>풶DrCJC}G.Y?2o>O}yhlz>Sȿr vSX02b]ZF_\fx`Opc®7(-GhO `Su^5l;am>[٭'V7bQ ՏjsO]ŐmT6ѷ0Bz!a -eF`0h"_&0XW0 i@K.'fH8k?J.{R^]C/Fjx;:]Fq&d<*5fciw|Syʴޔ.c  Z<>kɏe2h[^#G(d"HHKNHeۍmYݟO]~5٬f}ݡܣDhfD'ۤ\[rYp]:<@&*$F"njVE)k (bB+O:KTϨ’!9"&mwima -Chݢɐ֦\1.ѝp:3!># ©dIi֍w -|us31_Zc.V(Wu&N\a:$8"(`᭘t~:DDMNtծ R8!6Z20E'l3V%!22J`"!BK# dI,]=KHrm]}?#bJpֻ]B#æ2@()=">ظѡKݽ:'ZȒĚx˝Qb"=uY/N}7UU7'چI0IJ[8Bئ7Kc6xTa]V]DCZ-ZKOo~Qq(%H;e2q1BZZ~;3%8*HI8IN{YݚE'f!,6 N)Tm@EϴOOcܴO޴jM"BHDW WJff;H;bSnj<9Zж*97D' [SVM0U$IY'g .̓S --ř -V($2g-MɹLM[ߐtu,>WXmoAj$T_di:맲JZEi=o].ؖLIĝ$Hq#bD[{.E.|8Nd -#I.4NH~Ӯ>nB"A>EnqPF-uMS#(:5d#(h/o__]y-'Q=s#%7~=LP_fUv\ǰ'Oj(U'_)6:h="r{Vi;{4맳ZObznOo!ht^jA eZJf7'e&ߌͻsMb YeG5<4N#hSLuyVwf}Weܛv7cڧN Zb@$Ѧa.e4W Ci(WVY;p]oA g kwq\4MWaww^"6q?O rEѝz!C&NvJhGęO4!4ZM5- x[ c)6ӆټޭ\ڐ~k&_Oh|uro^k5^huvJ ԃgf_*{^khJO&T&[$}=!&ضFMҵva6 -J8;:RZhW4QNrOvg3$x13$Yk_Mf.^Wq@b UM(ki -ʐhk~)lWi꓂e$2"Tꃴl3 -;}HSXdo sevx#qi+iuFQ)Y`È[>FIU⧴ONoU˷*luTy,[( -oǾK62±$v?&HK _}0MZPiDrACݴ0HG/nF*3Us:{0g93hHwtqoai&ؒEx.N,ie\_eZW5%\pvP|ORQɢo7l[qu ֛qTM [#[CKM6gZw- -hs4͙?sr}SwJ\&Rnb'uYi7&rS?021#7yUCJmɆȷpj!L*r7 H)LS#Nh@&*$g-jj L`@j -}AˌiڻST8+ b+ҟVׄXPQ@lǍmm;с^)4ڶ.3mlM0{FX iU]r,AaPr}*]B -of:[8`re/sg|%79ޛ[6P:T/JZO`fւLp9 p O+qZ[sh޵W%fGm: skqRiXAnj#\ì AYJnAyv~ӊǴk5V\uS~tI -MܗgDs*ia1[nxnDN2Km8N*(%ZJbq&fG9rLM7#j &2JiN܂L)\4ڃ#i"ǐM`\cmMר0L[|\IѦ7[h$bd7 :IqPgqX,k5gؕZD=!pCSUo{(D9^şj^б! nͽijsҷƫ2*Tڝ&azgu>ȵqL”P\M{.6%qpwEzU0@ -lnZ{iG .i:u7Ix{Dh1zl,"- -Ls* -\!+6Z>ޚ35;LleAz!z ȏtT¸hFG\_k&)r0z ;MfQ^Zp d:QF:tM3Ip{>wݍ^=+`)_nVs+/oW{ ɴEY\9(DiI[HȧE͸.IߓRBZkk4l Gnڵ['冕1?mL}HZth"r_4-;;S*Vy*;W_-Onw-G+h߹V)%Ho(ٓfE,jS}UlEݳy6rY#.."*pw]Hj ˱ vu]͖=$n˳"ܭƧu-m)$s[IA;pZ3ogg i+|taDBh D@Dk~ 6KUVÕoaq8ʴٙ%}u(a)䝴˂U IVwm}C m+ tY1m{i_eT[BHipwm1kE(IQ6 *%ZК]\Ӗo2ҝK!6ٲ5g5%M팪nԦw=0G|9zY,qɋlŭWٓK($0hM - ˟r%a1]2`4-6؍%։GBL0IOu+°cB:TflL- T{qN/Ǚ 3 ޮ<$+`̸On'H:sa$֜ӥj-GO["RVy`PRq;7>zHl¸4*f몦R_hMHTW ) SR&26ۼX ;虫n -$80&r٭Î $ŷ%쭗dGlٛ7%\;2̢'gM|猣 rKsƼj%h6NJɅEǴ̄ )!)n51aƍ^:'(\VOA_>+ Ġù.XmB᠋Rə ek))=k=s4Q1EZF2LTVEbi݊+#+o~HQ(,-\FksnHOŌxwJ/T@EK4Յ_}. FfB:WM:֌өb?o"e2UkJ֚X{h6YU'+ *zvmYHǴ+%}8[JZvJ$Z[:"쬍~6>B+vNwbXjvƷp}\!VL 3*s̘AFŴ68^^(|P+6 - .h6nua{UZʸṥlUqmzjSVD"2D~(]P[2Grl 8[w'!?iqeU9@3b5 SY)CL7Eİ"`!<:$hKQ^-V."DZqFHԓOW{k}_ЋYA/g|*7LOIO"ҏ%Bo'ٔxbk2![=Tw0e'sΟ$G HnTkFP\WyAh>bU"oOVV=V՚]%2hM9P=KߙƮ)wp^'g+B[=4@j> CdZ H:nMIiN3=@臎ݘ'ղ1EP/'lt DyB>btU f:KRF66C屑4SmA6*zV%JJ[=ﷺ[<[SViqMH7|W?.VP@{Q8wҶS9iS'UmYZYL_yktFkTJrISmƘ -g;:'JO&܍8$K eG8[}uH!]X,Ŵ\ӎ@Fd!{95!UDvSxLGd8ӎFиEai-@ܷz\mq,ahhBo9 f r ո| &ks Jo qgQ/ i#<D/-];G ->^.gk6޿L8=x$z7cbXV+v7PmQ-Df,drڕ$`ݴ.Ye(-G٫Z2ަVq,i00D$m q[')O N,̍@6---YIPඨEpCGi:h*ڟCJs_jHjݭ{!> e4Gд=[B,V!tњUf; gHպڷvztj<[a8Nͷ¢CÚa$ΞAg/qB<\K؇Ŧ&L"m']cB&=D2N2LjF5 "FpEUuYD'\N {7Y1ZhNХ#A8IN] SmeG$߭̊6LfLm*m kWY*(V%X ig;B*^ZXP/ -٥B-mf(G<8פ4N5YUU틇i`(5f+jwm_IHe0V3*"qTZnZ2L_ -T)nٹwF/5cǤ٫˺#H7\@Hw{lĄ2ѫki - Šhm96K<КG,w\W[\g-Lv];h^W܁kQٶI6J Hk]-kp#.Q s\@E’R/?mqĎ*y'jof:cJ%ME.yMo1Qb1LY )W2kPQR$VcjeLjly -i{zIMOL>^6CMZ!UG )czi&)+i'mVD4Ap5#OVLjV8gL]a+lYMka1AAq vwh孒_N0?u8Uc"T7,^B4fSqOjrn8tۺ:za-8qNfNG<4ۯ{\r5 78ߺ/O a.Rzkcu[F Leh,jykhUDWap^Ď4EWkeq2 ]{l xE&W5r0aԫ-q']gwL2b Њ߇W!H:(nSe%׈rW1.W ]}BQ - -P.%msbb=-xTDdF~i9pٝZ=iUtlPs_VQہӎmhfbҊÀӀblq3 j8Ds\u7Zēsp1. s- +DZ6n ?mV%.1]X|(Ӵwϔ/AJ\+ -^VֳW1n%Kjd}TC+A=vGdđFq $ynE=;eOl~lЛDݳ~+>}%>9aZO#EZVrPm b>gwj*~+EHPjTy+dlrj:ZѿodFI4B37yǡT2Vrjx ˨H5`NUHk_g>6\>9)SRhS= UỲx$<Z]1#H?vB,8ۯ0:&]BK -fR;tn - -5:+ˆeS -$:TQSAEEdsBK(hc)K9F+GoB mV M:\.el@=Kz"awcZ#2i8#mᏥ:}Rbm % /qpζM"D/Im9}LJwRq@ ke<-g+jXվBc7mu7Utqe@1_.|TlVvT[4^:ͨjV6 -RQL -'f1<28 [d% h0?'=q -JrCݲ<펹RQn-rÙkr32vւFGњzϟitÃovT]M9x=QZK_g[uQj5?94֘UW *Mmf[sիnXQ+P.nª,YIp4rmX27Zhu8b"܆Lf$+މB@JBrtmRDf)T*U֖֝mWk+%ŔĮ hqj[K(T*.ډVʹkC -'Wv$@T!Q -Jđz -֧Pt7N5+(^ Iha?:4do+)jWF$9{6,se,V3·|וbϢ -Q -iR`# - Oozk*iR%Jci,xf5fOv䭢LY&өفϧzĔ8mcE"!tӄ nf?Q <) lAwmn1[3 -oһBi|Û nJ  ;/pME6{n  ING%x[@J֌wRrؓaWlyv9lU;h̺MLy NrK@@` dIg枚M(hi4.Dݡ.u|N76# 0ZE$tl.i۠G`t>{Urz2> o;UtJa,5-n6ݮR|ůgq0/5Z, a泡eF{.-@0}%l,SgoAt]ssYS}+7v$' %ڀ(}z AXG26lJDlS;_}܈-UPv̘+S+ -za$)lW]-d}#vщY %>ueVы=A0}spQ -p G m\!htm$]CmwcQ"o=ړ?, q'CGКnpDc%@m"Ìܗ$zp#lAԗ4;oc<eūʼnnGBP,aHrAm>դʹFGr<'Mрx״ SXY䲋^tYVm'-L\gBlE_ڲvQdvE]a3vvmxavΦӰnVf78DHt94lzb4_ p;v[OqoHNVkd|E䳪θ̺WZ8=\*u=SjEZ/qWDGvɢ(m,F-fmf*Eċ6+r*2ɏȶ?zc<>b\dܲ" 'XJc@ؠuɳۥGz;Ĺ<hetݫHr)O&)5@4F~gyVA&#d_gK;Эl2 tqm4xxk o*6RS%h`[PJLgf ^m}yVO#-lIghD77@|7i;?cݵ_Զm<%l<_,6xnЯ <&z<meS]فd{ q=/v7vf)$)5_C**w5?ګhY&U nRl{?-di-vma2ZG>m!b1 Z(x'OqxXЕL;{Z/$blzGbݞ5:TRsUhs-rݳMm.Dw}#yNQa^n$e3\2Syt瀄t&m tf6Nk" %ɜ:xBX4&\sNjrnX d}KpA#bۢKZ^*\VVkꥆ_uF̔wY$2ӭ4fgpӚؓrqAT.1Qe 8Mrl}|iWs fn%rqK#Ww8VɇZglқaXo7J[4?J{ْCwLj qEP{` &%a#X.$twZrke= TRQpc!Z`{5ѝt˰z m !\lf,e<=g%oɨ3W֚bp Y6?:GëKhJٹ׾ USd ŰXh3{\i#O/iSqAbj> QS -AH8fC|7dË-6r$$5+BiW;+33K)fs}ؑNH'G 1`̓nk'ȖY~:FKn=oqV]j(k:=Ma0lݟ$s-6[)Qj\[< p¯Wg=ҹ+ڢݵ+5[BN - L W-`U`ٶg<-ݵU23 EƬQoܠʭ(I.ố)3Oizݚg/hHJ)HTI2(/4̸Ӊl 6Wi<*ZA~ḅlpd<-׸NN/m'no8\kfBj V Bٞ+@&(}Oζ^P26gCfCn.abϦ;j"^'Ս(Ô ܬii?>qɧ |d5'5S?'))>$LRlݘjv;:JmnHng!bT) "mV(ԳSY7Jh;dDボѿCML;x5$D-kzmoV>G>zI3!#vwgW2&82w1_""lO|]߈"9p6[-M$BkNihfJKKa:T'f&Q79Feq˄۲@KGi m-"'}.|V1RYDIojfпjOU2&9\?4j)eK[d\oy2kI/&ٗUg*\fKn?DrF[4U?iǛ"k -Ud*Sl&R' -y͇tO>jnNmlGKimKA?# -rUs)մQlJVWȢ/9Ucn[):y:_ R| - -OX_ ;O"Utq,<[Qr(XRoe.礡zTDW[B j-#+5+'`h$;5'Щj4eGnCKY2JWbC2ZGYq :CG?L*} Nk[)nF)|t:ݏtU\l|j)(l Ugw6%dl[!*kjUlvd+f|%6)Ueb[/7Ej~c -T7[fK"[WNv[;2s nmtmѲ߰;^(J_ -|u^pj絥[uJ|5f/[%Un35u,X*-l wczyvlWKVc-m$[Mvuƻ4rIT 5"{qBBS$)N6\"lT6n#HiٱpZq3Q H:?9-sH0gc{rsv͛(ߵo7z71؟.[7uZ[+,ylk=ЕfGMmWIHkgIv*yupӔej|%>A@lU?-mfV*Be׿aWoӕ+d+d9۟Zٯ^> /S򈵱@_ĭM[AkiB/4,'˅4ɘR^ewrT4Vvd7)rfm:n?E'^ R(WSn֝引mog[ȭmُͫ bGʝZkFM -%Q>2[Yoտ9crVHB۶j5ɑM/djxa-mm}|)[ >bK_RVZ-[ J5BMUw_~w -b|W[kL5>]*a|ڮbL^Vx.bV|G^~)}]k8>Wزޞd7vQU -|SkjmY"] l_?[3ץMχXT*j\lX< A[ZQKFZ3y**ݠb1kcfҷJs٪|`;a-+l+mRSSeq[ jiEť0kc|j}m]@d*gO!f{䚿v6vG*ٯsZ:U@ĽYoS[@ SU͡Td[Sޞ8NO#M='=j|Yme,oG[Ms)ձ£h:ew2ѡݧ*UZfOک*N'U1go[[S?V_s ->[:sc6tTTIw٪mk fZovWҥv"t_lgY-*ۯփ[RZ- -\:O"bdWVkf _&\U1?XElA~c!>]p-쎵$|3IM|SR~.W!v9J/% -?uWO2[K䶺vvq&)5ѭοV_(շۭm;VTklB+dgq[a?`حJJ>.V|Ca?߭Y3T?٭cgjZ۟׃[VЬ۩IVɧlxE*oUl5t¶&c[Oʮت3kd0j]ERQ7C;I-ZE}ç2f25r/dD_Twl+hmN$~JlKZuؕ̅l-HHsuvxq~EZuZ;[SwZ_+f࣫3+g<]Zn4~Qi[__RҊ3R󽟦1۵m/Ql2Vr5.؊SǭD-lIJ+nZm+*eFe-I[+1uBlם«?%m+cDll5Ʈ*:?/I?":{v1i-ZGl7Lwq5{{f[GSj𽮶Wș򧖮>a6-5̷[;zC*xCWϿέId~|Z,eT/$*Dwvf?k-?mOm?JO4bqa~ɈRV{?,uxZ[1z*_5[̀R+ -ۏ-[- -lol5®X ȥ t+[GZ#rۺ=Z?)[ S>^lVZ-j/w[+P=7-mͫ6ُ"[S]moZ˶am̙mu`mGJ}69Jdv1Jo=W'N˥m_ECu_e|AeoHԗI[eV *aW%oSFBJ^Fm׽C{=7d_ Yf~bU鍝[/簪%mƭ_+d{XukDS[*Z%ZjKKg;9X% -/i*ښvm+k|ڏܨݘ l;kn=%\;)n&E3zj1cDdƶ&ӬpGDjX[jֶuگޭ5s+Uj𭢶+-lrkm͊? 5X-"eQ+joҳll `/[iտ]kdJ&VEنҶc}l|V᭘1JoUPQki9di-knB-j,+c⶟emM 썽(r -D-ywX|WSVJmg=[r* -v?){5lgO󒭶F+lj-_>ՀV mZ~@lDpXi׶5 |Zح_ș\•Wm5{+$Nu*%j_ kbW؏6v¶{v䊿;c0٦Q*D_ȟJ!텫5im-XNl[M_W󉊕Sug@*n⸛ܶL9QW󽡭OJ/mQMEldUEZ4@[>ڤѪU 7T 8FI,|kk|6V|z5Cյfm'-~rZy:|U[[%kd?F൷oZBE>nuܬybΫ-C3r|-K ݳkHm:ԊVؒ CZ?~٧*%l_MkbA[)LVƯ'S+Uf8]!fF1Dv2n}^/Z֬ -yml2~c%~^d1`@=U1XLӶfȚ phD=lP߳ߚk.ͅc"Ô[{> ^%1w;V1`16BILt-7&d%d^TyLZ;JL~?&[qik6G@knȔ)BKk( 0$Qrkihn.IҢ8&Qrѣi[K' -ZEim`3L6rMX-mo0vI ۷hnw晛rH7iv26&ޘ`n1z=qN5Yb_ Q#T)Mr=!M؁q$Чbrf N]W6ˎ1J$(;E;VjAvRNnI20z뽲3'NbN!J$EER۾(`>7; -n8#2MlaT`D>ZϕO/+L וvOG34TlUuq D<.[4q>ݏCu֣DiF Zޑ--I2; -ɛ)1^Bl.nEI}nϜٻMqcX9\6Bm;0X`U=?}v,\/C1c֗ƁX&IaMژuZvP2/. k tcQvv~SjT 2ljܡU0ƣMu9cQy]̫d /S0*lvCZV踭9h<ԥlҢT@-jOgf-E.aMEZێ`*V֪"7y `AKIWAZu@R?)H0<6s-0f CY#8~ -dG\f%`qO#$D*(P}Y["8P340(?Z{w}4m:oGb: -ped&Aպ9סnwӐ>r[k۟ц*Ţ?nkBvͻ|0$m#fPP1)[.۹ߣݢtž5=3 崖2Fu zf!;,[etV'&ӛ]hT%}MA8s)rM1fkv{W }!l[43][67m6J|ԩb -0lDШ*gT!SJ $(k=nIzvuпlIXuWʈ\&А&\mAAB[(N66b U\jNl}IpF`0 6i z%ٙRZ$}s_q[pSvYxpud0w5x*4Cz1) 9 [E)#\\mU:CW3eVNEx4 (N@nOP,o57oJ@O, -+J}L!"|V@hѥ4Եt0΁@Ј\A -;Cd˪Uc6:٭3/?_vhq|?vdQ WeQGRzn8-ڥ;*;M8 94/4MA$0]΅! --rWc̺E~JqM.-j+B#~Zj,M6?Q!tl*+Lrtj)9^̐@m.D+$r}C-#|J*^ɆfXWƇBW],;kIL͌(_{<'dP4X̮Z`^_57# -kT#[b%#טԸG ІcS0&6hpk]ѥhX- j"n2#m8:况\mI-%E)j< 4WkK\ƟR/Ti)M.ZVQ~v(D=‰NjqT`Dl"SSvh .C!Ex΂3D,i>" 0t/$Ƹ'qSkItS#D\*5!| J 3DrEUy\.e+P?5n+ \0^Jw -%;9@j B4M'i3C3klI0ICԔ@EUPK:;8BT撝ҮW&zB:UL|) Nt$V()K>а%$ezIΑQԠIC W=q 2&,#o6 )2qHyfYhi+:(8: ?Y4\$p_XH -kQ%; 1 $Qd%i*SQ7^ϦptC?gO.4hCX$_Vm١&Q;֐{ofESz3fk#]$z- {m3‹M"&5Q+;BKb3mD)y"նǩ]pN+ -Ba;Xd=qp>e :M[/W9VmaT`^׳OUOʚߔJ2rU {1ٌȴ U˵h K$ܢmqWVP|9'el['<禮)Hyj ]X3 ]v3,+}VldrKʥHrp!w qd].\:0 -?l 7wpR9|-ݩf <ڮRG&ޚ&c!+{\rxsJ'іky)W5A{>FUzgψV~&ř*˜5c,*]<}YUˡXZoTha>lx 5B{=opVEfC*˃=$LxB6aFNJr;| mr .:j=n(်8w 7N8Pû\^Dl^%6VA.*4lˋ -,GuDiY@-$a3Ro"sp58&$Uy֤Kcc5%b3H(Mɹk5Uf7=2aJe/im43اC2=A2JF`E[6nn|,H~ɆT:bWXKxXh*t4M-W)q~iؽK4w%E]-pJWQs2rhëRQ.=D;r^n@ 8S.7U;/M9ߚfYlZuQ#9[9o&۫Z̍s;d5 `Cj taW-V7 ;JJ,kK4 G36| p^(BDz:K_]cۗM_$sw쉊ٚOR LQZ%L-l?KUh e6P%"<#X7FYq~WU[)lMAf9өܢ/eJ{U]K׼+[-2+hJܭ p68 I-GG6 gfd!VRwگs2EWwK*'Գiq;O$tuZ;w/U:Ƿ[5v®)<4>i.q2,"J%fjtiٿ(cH.m4nm3!.&Q4FVXO-x}SQ/E1;GxXq􋝐~*OYwm(n`z:DLDf]Wm@f4^E|Z9v/$`5*El&Mi`hm@ċlB61fl2E(<[p jHkFsY+Sa8KvbT+k75YW7Eux/qYzPn{Êޘc H}ǒ3AIuM2f#KH=m7͖ ;yH`.#%TAq1 ̈2 ƌt=o5]AEJrMn'{nG{N8Y",WbCptQP*㾒t%-(*ְէRjVb7ⱽ7b=gruS涇fգ T4K U4V) 0Ovњ-#/X魗W5aEk'ߒiQm,<|=m$+暉vsC.ܛqh~F*{-oދ<*gLd<řq}6N]E{jEƏzTa5AhQUA+_H{=#+%Na}+ -$7&D5*)V0[A,]X\!6|㾨ط_$mY A2=~V*jm80ﵵЫuU:tOxV;+QKdf[r!ίeNֺb%(!шD(.'wSqA:w:-PRLīgl2QjDl۽Q ԲLФvVK/rz &'w*nEڜUfU}5[_ W)mLz.DիBb -pVi!c0QzdA]cqNqm -`Qe>"ݖt!C -]n3b хJ3=4ٵg8-ڐe6NaM -@dwC|ʟv?XӶ83i" `$OVh^eOi5=YGjŷ]ble=+iue͹LAT |C -)6}Ҙ [W1iHWf"`&Ik]7 p1$ ͼ)\eŞM[RcT-v'ν\Н(Ѯ,ؘCJ\SN/ пJ]ݍXܜhM3dZh (*oEMEN*8h$d]G5JQZmo v߄4RFJ,q7%MAuj ^McMLZs! h҃hd?[@òm4dvZf3PY&7j`{;Mj(QR@aɂ=).IoR%km4w֔BՄˍ>|5t-6V<'QIƓ\Dv8mjC#bIG_<ԓv}b\!QZ{EOj3υ4f8hDiHp>諑aq\RsgPp;1ՇrfQZHtUuFC qǕOAZԾkrH -%mq[*O - - oM,K5zV|z.LvBs? m 1붞^uXeA-@+_ZMݻ3UʮM -mdwl(QjVQ t# ߙ^qM Z6jŕRymLLYIWW{DUMVԇ04_WzuS_ʿCIV5q90%MiڏnSӤsvxJݽ!2) !> bSUkiYhLფZuUtröSv6{ٜGC,;x׫;c#;U%[TIw[>7-iOmQlPQQ(66ض("C yXă2;S183Z.&[)DW$:ԖmCf 4nvew ;vdWWȘ.pFЛj -)FB7MGe^b4vfjd)BŇ -˳Ôp0JY">[;׍ Yi>s)fYIŽ V5b5b]̺.Ekh4ك 7'V>Izj C} `Uv-6kVTjRYIHL_Z!} iשrZDM.zyd:HQgT49>IIWwfazp _e.K#!%Ķcnv<]( dJzsLe -F}# -^̨-3=f&Ͱ:iKJEEL>, -JBZUEBLS/ -JΰhGi+h][mL߮[TT;RI`-m:1q^Z{G 'bLLM#r4/ti/L5mRjzđsIBQ2ݤVA@COR_I[)ۅ%L<_Q7Yj13"@cs1.̰1חnb)IN]\:{ uטH9C1bR<'=.X~L> )+dV@k[cZC&Lpƥc4"-m?Ўjҹ gϢH5l0yir5Kuekƿ)ֽmVU\Zf3m̎ -إF,v -j].["ߊmKS፺[Th][GwZSV Zo%[JZ)xei!PGNO I)kB}E4t{4& uEԉnnfYR Y>ꚙ̵RKp j\ǵ̸IwI̐b ;V|̘ b&n0s'vDOw>-OYn>'b#z1l @&gm::0p6\wp5}ӷ;Lv'V/:-_{bلfM%mْ^S:T{16*FXNB%^yD^1X5XJiEQ --#hJ}Sv"#,6Hb.c:df)B28v\PXbESQղޱeO|5wPQprm7` ;-8L2 2#zDJe#>AuE:P͔^ #hN¬nʵ|uCܕwI/ecn3gIvoBA.tI Bou0΢uW )x}3@!]k% y)HPrbp3YDSXMإJҔWS ؕܺmi -կU\e]*rdǒ'!tz%93ӕYȰ?l6!VqVqv#H[ʋ.R+eF8d&ThSd/寑9qaJ%wFi&(Lr㋢ xXͯbЏ:xKJK桯M\-*⸃)jnGg(fb'YdJzȃ%@c\ MϕN 6x}UT!}G=Ϲ*-0UcR (iظ^7K6>W5}Qd{NaZa}Vy,µ`t]v m_ -Ut&ե4!Y:Ǵ_Vا]S9mBiDFmTfyLrUvGI-;q0w[oN*$:ziڎ7Qb0emnOhِmUDJU* -Du_Q Jg;sISwد˯fZf5k>:I "Jڒbh*fͫ_i*$Ml\>gp&CX|Ly4ղ@Iq"QE"B;-WQ$\Ś]Q\לz %%$rPX|6\^Wq#5ZV\k_[KiNb:,MYps -ҙ^ -խ ^tHd4z+!N&]"v#.y)Q&'@hɒ,(.Y -ۥ̢mӦcU>rmteCE;Fm`L2؃xAq dE¥ڵ8 u- | э ݣ~JwmE> -@,N<'c2 -nϊչ "iZNkHQ39:C$`# ⊍CO+mSf;`#06=G⵴jivCiC斳W 0kߺJ[ciE\\%ͪ5!/>se -u&j\ԙ-'hUe:% ks (ԙ,F'K7b -*j":p$CL+V7cvbZijmWV+bZkMi5TZAb#-@531 %K2T* ndrA)qM QSLըCFRqj -2:*-Q(Nб[@9H[-U]A#u$/!*2W:~|w(ɲefI*{ A:%Y?+- ۇI*Tpj9h nS4%d(Tna HrVS'Pa9٢RwEJXЁ~_V(jz\ը.Wa/I1AΓ ѵ!~=1m?[t`)MjK&iS^r͛z$t>}QyZ.m4-lTvkGA5ʩT]W -Î˒1)Pa6+z>V!uF׳Sz to@ԏN*YƱIOGMJ%w6ՒMυr[L(u$w"rc@]ؤMجVDZ֔)|Sd0 (b)mh[P @ AmAi>U=P2}SwdOYx#mt!r{^BBuc6n -BJW*hP';ExqVO]]4GսNFV>q?ҦR+ (SŴc8.h`z.G̟c*S -ӕleS=~cZz^,/|2ưԻ2 ROאE#SeJNuB҇.h !QHe" !NߩtL[4'5> -o~+O)h`[28XS‰ G /uNjBDⰙ)X?ް\Ys씊ZViYE%,Ȋ jn.4nVۄi<9DxtYeZd]$Q\,9kdՌ0)[*,Jj"%HkKzϽ.k%3W 4?KZkJRk?j$blΑc1rV7A"撣O3kODRa$쉎H9_[ܱwE5PRӛKn(mlRT#Q -Znpu #\H/*n>lR-Ë%whl gvS-]ȐpG!RAi& -ȁМV(-;pZl5hlJ٧S7]%hմw 5%r!l6]b"˄:[IN1&Q\ae>櫧)[!(%Rt\b/[ cTͺg@Gq1:KDN$D!hw0L&ʳ;R7i wiHIOX#W,W3hy֣9 swx4-EHF?uLcG2\'\4nZ!n+ iD+i>ü3)"lju #b4h f9\`"4oh<\Al+S kWai-ǣz4ˊ[$zIXu1ZwVqO0(bR`ǒOcSRJ%خ*S8wY%-Kts!D^Y_v7"u\aE;`)V -_\xWȊ8sМe}d"KcIUWIGqpcZ_Ɣ @ YNPu.c<ג*֡sZ9#d4>Z?Zgڹ%|,7|ѫ$Uu2 |fgitL Mj>z?[[D6oҮj\%O5)Q}i[AKai%\C[@\܄ҋ<;nLASb(M{ȟTxws+p*ӏ@a%'UjlCt#֚+[@b Ca0,)!v0eTjJdIoiMKMJJ3K5d_ %%KekfǗWdUE8nUl\ۢ.ֶ2tӅ~XX1%ټmUj!gs\II>) ؜1 ԑ_z9}"Agim<12(&oMvCLa -s-EƭzHA[LGmq@pDmp IڏhԞ>Kqrj^jqB}mlz~jErT=?JvQ>dj?HHZb%{T{gPS!loh)ҷznOsjbUPx`r<[VN[3j疊*3Xm^Y t#wYkˊI]Fhf<[n`\֢yۓTZ(QJKS3ul|IھJsɮ*^i^t'ܲKUThd\+yPx[j+/6]p䑃F2b+-ŔDOuAֵwV -Y|7cbZQkB}MpGB:S O0)VAS(\A#4Un2FXXq ѕn};VTH}Xw"Fve2>`? ~D,VoW7tB?{V]օE33h{M(_E+6,*q:m^$ tUfDKdZcIuKP~Seua|r2[ML\mz5Ԕ%6ႂ lH"'JEL/{,nZDchU -a1 M0 ;(08bؿYU@_O}6(`䊭̸![e?èͭLݦdM'EoIA"WXˀ9Ӏv'L{ۅ!}/aw^C]6dx#AA 'u" dPG5d4k[;%[5.ji Ҹqi1c"%Ӣ;!{:Z#2 ío9*1W&Lˀ,#Y"{cR-lϸS{[CnEGz\1@ "0DIldƲ2UoehQ4K$MbI2a;kw \ߢuSyReW #$MدiJhN|c4*%44` qSq7Q&p]6qNZ!& ZAyzTpQ8LNtRӍvr ;Tv9Z\>&!yaz)ҏB{+\P~%;`RFQ*R3ʕSE;H]C)TMlp |k?%?+ߴbE -9WqRSw wd- -$6b 7fFۮ@@T@ќY 0J*U Kc;鳐 smu7^Al4V*d"u&m {ضgQQf+*GHѪJ'_f DbD-A$ gj1nq&Cma`6IƝe%2yPC^`F\:e֥Г/.VƖuDFЩ& Kp>jnGJM! -/i9٦9[*) a_]Sqv{IŒ/j{(1$yg8qw]fHˇr_I!4E&Z1&+KFZlHM%6<|HiWr$.T74 s'y:34i|E6>)9R0W7K(:D'-:kg0]8*."ۑ.I5RrW8aC9,BNSKMWk'*ӫ]Kءggrjij00%ExB5!(VN&'c,N016.& K72+mT8_ӵAUq ΊM$.֜+g1ٳ@w-I#箂tw%KhZڑڿ@JTYMǣ~t@>fgJ2=)Bض Bc#ߠ_|][/ȧ̐pu' BFN:4U=E]tSt:‚ ʚ`.jsɬ"-DMcZn dW)`QZ?zԟo&R -V)3ADkRҙFA VԌ #k%|ɲ(;Pc?4+\D>^sV^&Ґsʮ(~Rb)C)j [cYjSr5T[ENl2lm)"'bR -bd+F֞kcGP@HppY2e\M(/k'ћYW `CpkmG(bA8}ԖpMmBFq.T`3;~\\&I1 -9Y2Nv:RZMqHUsIκK/0ihum2㚆Kdqp6=*TnCQqT 1i}=="V)r*ʸc @ J ͓e(()HerZkcOR,C]٨M.Rq(,i[y+KÇi60EIW GZ2kcLn-*,i'fhQ-shr?ӛj%Zи'cXX1mK+iOR\RYISgKs;yhkj4(Ӯ, ^&hY=FJ_} )}.Q[$E<0頠\%;"eŔ7޵,|Ll%*Ou3OɎ4ӳJm-*ڂ؟hϣm{;>&="a1RwN;nVTW0VA i~ R$H'1O_d:X [r:R7BR6?jp*R` Aiճpr/Y:6 Bct-OC$#V ,}f3nd47f<}̛];)S}s[!QddbJŽh|#uf+dƀy1<-խR6h(*'))-in+KڔӮ/hl\9 s&qp%̝hU c8~ASM9ֱXLRVV(ƤHUQE>Yz: -n;9_E~ 9U,_*;ry)N;Qt~isFb0DJ%TJhtxI #C)*Ok$/PEwUNLEKƱrԻM[p nU(1{IwBw`VjDV鎷 x;79YN|%6tU'- - Օi{Viȍ8")|%[<gD՜5K5r7B%E;iQx641QnQSᭇFԶYd1Q&l8^k>B/W_G>'"VeUˢUί WP8t}LLqIzBVQ@5O?- %^1QA^]6>_6^m [\QU]"`[Jǫ7i&r!f+MZYr7HaQt=3µ|o 㔫8Jm߮k"gܥXϬ[6yU\J%rE5oCVUu8*)KJwīg*m8Q*㬴L9w~8P+H&\FWGt%*⭒79 $3:|p[@'Nj)${ 2ԳÌjG7&\\@k-WHs;$b2z(\'JpIWCVksaDVImx:O6uv6i ^Krً&+ȦFP'E u "HdP\ETT^UDsYݍ(<0myQ$BJ -5q`}'Ix}\܉zkL?<"i66]`P]iu4)R 0RDUUEkd=GR$vS!!U0wI#?p̙ Κv.5oɳ7:W&q;-|y\ʶytJ_~NvxQLJ})ݳ\fXoflZYI6<~QAU$:>Α&U;W$],WR!%Q*3!&ή[*߳ӹ#ҝogz0Ce4򵼤X -nhvǏpaӱEW"'.2\R] \z1#*[͉]G!Õ䂌l^jѴizY_L%$e $@kkf K(]iS(h]|uMbڑ; trADDHg{ELПjDleB3@z0"Uڪ;ngۣӥXL}eާ8=3w"ՇtO; [S{_1Ķ%7'Vv!6\e3ؤwtfTyaàsTf 4K ;>{ vY)Mnň80$rl|Pl| ]%y[L+W||-[}D;ʮ N*"*ԇJpaAK;B[@ZmW2i*1Қ^OkqiVdCRL0n6! ^Ro5qԪI(,rD9sW_M\SE1qȔ$w?;Srbۭ& SHkM]./q6!&vG'OFmmM(z&.ItbEj3<&Ӓ[lj`h*kt%<uo,w^}B^ŷ!%8S(Q$ɹL%LYlNH۠%ލn6sQA7FS\>e]:,;XQ[DAnG0DxwDj.j54*#]%at؅GSZ -VI-yMJ_Vbpf*-)ߦ;--8Jg6A1E 3[D?IL(>%:öT[8*+*/}?0nJHsZ,hb|Ɉ7:UЈ[&:nGmQ)mm=PEl$<%$\aGejCV(W#@_Ն߾dVsX7P$=RnHq03XLgY9ڈCI:wAƕ'V{#|HcV !N !w.k)C1XnTJ"RiJ(%*f%HiJ(x -ӬRthZ "4$eaեE,Q$ݸq" -XqTJԧ_lQa8^5!*V$LtZM-Iquy^9MZm0"/+\늩[;EY<]**DW)o Smwv -SQlf1S$; MTI3#f؟gm!Ku*4F'!%O )WqrUdRetFFT)-e -'L`Sa.(cR &Ȋc\ UrbQuYxf9S\xC`f@ׇs(]4;LU$\2)Hr-82ElH M2;hө3W{PН2m៍tȊ%lqGÎYV㝸\%|_ +a{~b,ˠRra*5"L2pk:ВCJH\zzH.[yKN/p2<\j"Cԉg\zu<X ҟj BJ@UI3Ffnv5'7PW2.#rt{2,C@wLM-M2T_HF-(ծ!Z%lB35wOK#3v) BPH\S/֒lڴyd*#hL vc2 -j4~\7 -KLRv2PtעEV3j\\FZEm'{iWGM?>cnU!:Shv2̖6IM=Sh$x"!by([V7|ޟYqev XQ:%TNڮsil:n`N#(*iTTaųjf25m۸3y"R'5>6cH)NNJ PUUpu\#q5&q5"bR&:EWR쏸?sJĸƇ#Pa73Fv;rpE; ' 6M@wƌޥؿFrDPӚw%M.eR3erZh/q:΁xsd)-~gѭ72/9A1eL9ǢkO:#y.ZELm,aY]xJǎ m-%Jdڵ尩khS0ƿm/®Ԟ<[c -i%AdcEez6/j]nm7ro? V'-S`A=EkKP"@O^$x;+sH'ӏDu׵a%0r2*ŴOHE"qdS2uܵɹy%'*T'P _R D9QlPS KEeJc 04I7 :owO'@j'6uɬJ`e?pe/!7:!˛RwM7miH];#ۣ7)lpcn)0nz!;3!Ȅا0.XiDE`^nʵp3)b`U>P@QIyߍ킝JK~Jⵣt_fט=JQ:<-&q\i dlZ%E>KɎ+I K#=u>R8}8$FF"NgNJrVs:-3pr<W萄AmJ72Aµaq8кcp4(GxZbbiZvLvI(,:* "W5NXߍجV+71XV+o!ERcr*<3D^ho0 [(ZٌIH(e^ FWPNAܬ3kkDKKnLFw|z#/^ %[ELsg\7 yYYSW矍?+[DZC$[b9'/fo=UtY5bp{.@L œ Xd٠VVΉqJ Dq,\nm˒" lfʗ%tٌ[&$3"K|gST7S%=:L+ظK&x,,أ7hc̥?=GDA|V=+DNy܈)Em@3YFAn\Nվ1o?3,pioFjB WWCm@ -v`ow=HyfKk[6gn)aJF_H% Od6 -:"e1Q|[:v;E544߭Vz]l5SkhX*1I6 ].vg6dN#@2mU!BNJbd9MUXű%#:!dDuDse;Pt.7T{Ȅ^} -j"Ufnw7vFhtY6U\vg&ZqpW( GUhueyGr6B ͢-ÌL1roOK]+ֶ|_'r'rUήqM]3W)P}-Zㅕ>L]ٜWIjt^2B nvwM{}l-feMm+VH);L !?RcpBҫj]1zͣM,#6szET\)_vԩ:]f9xh#P#:I]YS9]":hl~Rٷ^ -"GaS:'ӭTIus3Ro^字VM1q Sq-j3r)ҿ -Ƀ^孚'ǻ U9ȉzn4G%Jq=\nBP—Vt0i[kZ)|hW*ڱ|AEspY 慏$8=OHevfظ= fvRq S",v=W4(=:.pIc$Lkf$iq BKvq;3pkd}ܵF"I{nOD1 Rٙ]R,-&͙1~BCxy8/vIh-ziL(l\- -T511ɸ -7\4DzIM/ȧⱹ)RڈҖ;+ح() 0&+#X@NvaeF !.:q[#r:٣|H8V"o"r S9.㒒TwէJ6L\) .+g#?#bA,ndʝ%Uѷ_h$^ u8 +ݴj- Χ@nj6&D~E>[P燤kd$~7sVm():{,{9q\|E -2`F9!$ʟ:Gָ3jۀƎˢ:gKԈpֵ"䞐 -rEDT\UTpgZNuk[®Q_6b5+-@K'"01D)gRR:p;#R?ZOf}wU>D2>OsꚯVtNQj#nu[:ꕝ2ߓuRf7a[ȴri浲>#D5n;ƕl2HvfqSD6#mG}0ᾝSJ~PvqsnX©I8>S/-) LzpRIaqr>8>u`NE}G8#~+IY1Vt钡q9909U+^>AHaSBuugރ>#5)Ul=0+b?tVOe" 5_қ]{K'5.iq%ZF #)ҶۇV s%Γ.55KLn'=>ڻm{%'a>Ռ,8VBԆ6z07 W"c3>כRgx76a?)~#f- Is]?p#.*3rˌ.\` o[CSwu+:8uÇ9-(jٻSw& ZGܤ{u`Ggvo5Zmαő ȷ=&ҏEr37dL`n$0Ivq'̯$aGۃ8nɊ(N8K?ҬѝNhƔS5qJZXK?yBJs}}7b0ZGR9GUKܵ P0o8 1wB9)ntd0[%>٪˶7"Qt,q@զo:tD/]Vq>#|ٓ -NDr & V^޴ER%c~7cׅQs[#>wMCN=m9"շW_M}KF̈́N"]Apme9pcT9#ݓ.ynj [vd[Qw2cp Hhe8.5rbe[6|sk6މ#bkp2c0y%D߆mrxiXbYK[*qU rYQy/_Y[2yY=}n_Qnj̜%#\r(/ڙMr8 - iq>/ }2kUIPBV9}ŨX[VZ .?5&t͘[dژz?Mͭ\mxEgÇ!#@Dkb[[S9\YYIE'lHOXuW۾F '[Pxw.uQ fvN^.}K 5iArŲm[<lbh|؈g\oy/Zob;u*gikii+m5{ZfL muRmjk&K+e6**\u{pX<''7[hlI}}Koj@je=D"lGԬMxmgPbeWdt*"5Tv'* #)sCu蓙JinD Rە"B )pY23YkY=sFag@." -CtFEɹtw۸ݠD2YC0,l4(tٴd*DmL;y)zSV{RS΋,xXt_eC29{q[7QeƖ޶BMn) *"3JdN{3"JSF1ƘM&Sv磥pҚN]t{'o(a6[nلܰ..UvCܤ{w_,V,Qu+`:M,m 4:Ctgi -jL)zf|2- k=CzR -QVWlcKO6Ӈ^m(U#FW  Oi盎ѺX}[4P.<> [ܙ$$&B޵cV>Yq9V_b%ZXZ|<۫0`۝:rYK? ANͻί5~S_?rǛj긶ΧSJn4ԥٿ(b3[DmAaAoOgFD|4&rӡar `uUbc*K86%cs&ʹ; -31G Qnԅ nwyZm -}iY:{6D녁C"<(EppStӭ;ͳBE!Oܕ+ -(Gܤ|"(rYYRm$w=6_Ϧ}Ү^qei' wlh%oٯvW4Ej峩g4l~OjO&BkqAH"{-/qV!ňlL8fjR%[Ry6EZpŤ uh;Aoo I -FV٭A0xȒM gb2Sی%DMI.qz,q9l#yDϸq1"G.\nٸ3+$޴n2ALF8Ƽ%3ˉl0ȼD) H&)_AsDء.b*=0ʯr 6bcH$n=|u/$6^fTɔolҞFɦq%4ADr#RDQYq>>T^D6ٲGLvs#h\PkiڥJtffyyzIj#75{ :Dp:=N$Ҵ%Gu{ܽBQh⒚E2DpѦe4R-Aeл]\1^7=Uh":*as[8\7߻iG )>nE9m ~Q*cKwj&wsv{ZUQnZDDZ ثhB =QBAY6[g~8m, EJ4mOfQRؿ2D3[#)Dcsm6tYmmLsKΎt=gp[8ET KW)CQb!jt!pn;!n$BVC=%ln -1nrxA{& sFӯ:`Apڿ[!w%0v˕,N&Weҧ{{ \'9y;3N"5['ڍ)q_1r/Ҹat(dU2&_a(Beh^NdzOjH&[m6ZK .:"k6Ku m %%8Px\_t_zc~+ XVҵV+i:ZS+Zt2I3/ic1'/K!1AQaq "2@P`#BRr0bт3SsCcp ?BT y[LCJv |a3(Ĕ^@J슽PWPFN>j{ÊKbaL,\9ֈ(HB_Tˆ׵~Q5&PH(IrNJڝj +dd -uBB hZ4"waeLGsm\Vwyo+rfgp9)"S*a -+B{/JNgBn}QQ:7Ԉ+7' Rf#)(&iڶ'9@iDiRlܢw>΅ }ԣ[J7qԵݹ-ms_+m¼J:ogVUĮ /ڿj\-[jp:+)% 8y-V0\r -'rN!;Na~腽o+! ڿjhp\;[+Į%os^K\& _-?qX[uXYJ -׮v$'CnϙȺS2! h慭9jp~fI=8(Gaq[B}<ْldP0hM#. THSiq+猑>f~E]$uL+ -칭? -@z85D s1~j;bП+ĭG9JfN*Vx9;hN<uakDp_.(;Hp 0SA T -WgX|NX;B#lLЍr=Иnd+"'bT  e>X%~P@e:kCUܹˀ!_Af/X,aȫܗ ,BW+!Y<2 3P ӄ,@`y)<c*H xTM-rᰫ˽YTǂ:;B.⟯a[n~)SjNZ!bz,fsV DЉQa'BUE.lJU7o4jBsWgN\St#X[Ҧu/ҷ}Bq-[NJ2U Hw7! mG&Ay ܸE:2*8yɼ2#RXctM[;Jޡ_XJZpEa]dɵlWx(Ef Jkrsh^ҙP_: xa0U(b 4 -F_#^!Wu."rW{=ʦF{whv!e=|IIvU^@@#VˁPɭP$8&>ꩪ~FiBv@@=&3.%>kMPWUG",@Kud9%2Јy)b4&]jflB8.(S|:l)SY;KF#cA`晭m4Pj@ꡈmN F&%oCR:,CLyik4ȷ -KvG֟c.0Q8eTb5|,CkpN -7'{2o7r;B)}WYwbXNWN> aS*\$H| Je#)H Z<, z<2!V&FՈFk֑Zw,bP7cb))ַZMESoD5KyXnXW -6 7XUxq |4dLi):TB_]>6+PC'&dIM Xu+نK 4W 3ԮУ$Es49 -ce+'d&p"[2M:,?%bBw%I!]+20|WW܅ՌUİ:Mͧ|-vM3wygm -*'L@Y]_׵]U\ bB#4V˓Bc;B 8H;Ru X^?6j:s -"fS)9),ӴȐJ E֪ov|*h*%6^*R* *ڋZ -R_$*reCJBϷ3XW7 --h(6+eea 5T+ m6̔TB-!WPfALh.QS яs~Qd|B#}55걜voو+A\-Xnf -5Gڊڀ҆VHC&0ur5\A4nZiԕ!y -Re\*C ,p./('iEhA]fB -"?yDE0JlE\a1lB륻ʋ΄ -ؙb-x0-#lynt4X>\ pL`%2HE=c2M2,e@*>@'6QW4/irP~i+!u9ħ6TX]wuJo®mA(6;N]< -@M EӪu5ShgB3S$+7ǎ:ˑc ŁW{v7Djɟmqѳ4δuNc; PCAjm ?{ƾt5?{݂&q}ZvLBaV &'Cokޣ%@y.W/**[RULj%Q)=ߪF2%8:짘 ߛR`'h66!ewFa .*ua W6>h T,W"E&jVK|`o56c&| 0 쓻UY;ffu@ly@JDaԎu YAb}ȵ -WV5Ut%pXyhMwW -kUxRvqXScHQ`ڙW$V^)l5Va# - V3 Xg>WV!WjКLp( -* j"4&!Rv 2PEh'{ ֥4Tj\|h&OFW>g2TX|ڒDfmAb4d",w%qwV!0sXK g$Z$n,EuBme՗5S(|Z08Ă$7|{J1 -w$d>u+C0S{M|V)o(NrJ!jwߔ/;.GmIE($?ʅUPXD8 ɏ':2QiFƨE;aWbT '̡짙*J.O3)OS\^'ӆeJ~yݜv.@SJMZ5*Mi>IGx 4oZnΤƒ[6oGmu uŠŃw{ -,xXXz3 -BE#z D4MUEy -g$xQ ̓uTZR.6w&%S%1tOx(OUkZJ6ݔ6l 5NY -J, j&U r5#a uԝH,KJ,(ڞBVXgb*Fm%eaHlۆX}:X*pB @weGD4>x"U(tLҵNt &%0SN7=7hGR+(Ț8[iʻ^W!h-UꯄZ,]A_gFQKy+E,\ -v)׈#bp*c:zeǂRS4 N39+\Q,R 0]> XaOyOƎv nJ)@E(iVHQt*5{T@ tBu"Fq]dz[p67 jYt#TsפּJa{A\RJYQ -)W aj NV.Xc7ǐW}9'46QE*!;HJ 趦5u57,&3L<M,N!\ ܕI \>eaZbm杛l.;t ܐ (#걉F8P, -fpl -4;K@UL)SyaYG{+dT[nD&Go[ {**a1״lXP[)&s4e -fE]58*KUPTXgQl!b#(k._+% Y siH)Sď+M_b,vSBʆlj"V_D2ֵBI@SiŚ`MA\E"EȰ:,dB6D-1;R;( CH:aI%8&m3jܚ%t-ɪJq(60y0NKJAiLB(w$eDZj'Z+ ܔ' -BbK1}F~TT U/pN1@UaqHQado P2)#6Q~S 3M9ƥw^aEsXmX]D|iN "C +T&X~{Le5Q[vXy% RWV<;Әo4#V>,^(\?DAU0ZT |BWU (W*1Bwk #G Lzŕn HAb)Ĭ_ 1a -X5 -*ӳxJ-,L%6nY|½ -=rDDI6p^o5t`vցؐ -Psgw[gdG 35ҢIt8鼛nOt=b"͜Qހm+eqFl&Q҉go}U=(Ϣ Q>^ -3p,{s wf(Q Os\3BC+\;7""BsV]d)rX[]M@Q&WO0k\Zwi8ژஏ5 `tHX"[9ԣxv2$nY(F?Qإ;ȍ[OaD*ۄ+:u\FTBj-Fh,@DJ6jPÜIOxQbvI%FVE'\!ҮD+b..p?Sڅ -"eF0e<Ү^e#&v̳?6ގ+;TAy\% 7StD)&x ,Rm7,fls(OS SU-v˱VPJtX&v+,U hNgbٓ: !ۆ3NS浼,5 lQdQxBJ:GZ ͂Lq\QmM3k.?lnҽv.nǚ fnN+֥ -൙;; EG/;ѻb=nh(Pc Ii$"% fbc8ۦ$W]dk 7p u6\+#> !<:ԃZ8*ց(m*c -!Ҫwآx!T=m.*l"> }`NB4M S"i,v$i6?/&JnnE3D.)C@SC&M:Cx#Ub+sGz!a7c[ |. { oIcV() M+Vr -モnP@jAR!4B{bƲ&|4]4'jUn]<ҩP籈l=%( k -{εwyDGP#$ 鶛5r܅2%FH)!Rȧ9x~hQ;Pm7TdBb[pYn[Lg}W(ҽMiOyRqaO*NM{cǰls(GR*.ioVPbrs*O]7X`԰O3*7]i+ھ:Ÿ /;VB]q!26ޱO"Vb G<8Ae\ zU*2V7c޶1K;8!w~i:ءb\zzmT(fo Nx -vMU6 ;heҡc=\pON1nf>zD'TqH - v:LTvvBR6LhNҚfYL\P(QEd֛Iq]/?][^l1G˰J'4)ljXG4Z;1,AtQ9mVO4;!2H+tR~D?-j>y:5iBw.Ú`5HʥQBv/Lk'& ֈj~n'Wl_7<Og,Q>'lsfgZ{WgN*QyOoNoOck< '4Ob':[%BߣǼeЯ?])ZX;AVŗ9A*&wb;0>bu-?=Y{:-,D`gik6OxmULh{IKh3 -Lg*xl'b$^E~R;F) F]ghO7)аsYsArfrZ -s)'>(>7V+6T5ӹQcA8 -e'_vhkO-!ۦ{x"P MU%*j:m:*:+?0qmp*nS"{Q׷1 KӘE6.c˻ae͐5"cGaߘjNKQ:-divF4~9cM`5]E:Jma?K#"ܯCAk F6-vp@kFѭnihں3 R/qOm׀e0B_;$7'oz{lOܣ;#"Ɲ#xSזvjG]J:5&b`0HHdfֺcjq -,J-ƙGUww-'? -(9o3JjaDg[ϊw=4LuљށwN7КsѬjW;8 Y}J3T]l*I tl(!kCuBPTuU]`_2GXe=yoClhm&-@#Șt'I&@9=.бABaTty(F\Bmޝ -/RvcT AUA)wŝӥ FG0uom`,WT?.b0zPPȧֽl\nGD8[HUn >|u7Pk g]B}H.p~hWkrf$!TpDĞ8^wM:IlV+hl:mvLfҏf#,꿴 |X8jϟU %:3]!_:sNk+NDV7;nN?V↳ikA{Ndi{9.  #F$ѨiƅUoG`1alM)Z51͹wZ 3V/Dkܡ=TtJZ稢؉Vu&5=X2-!SsnưL*fЪT c\[ێv-x|ff8ZPۛMI߆kt;G`?Uwa7#[g"uʅ^%|8BrN -n妣 0:kUym6QRc$'tBԀiQ@氛~%3O/\8]m֏00%SObZ]aRc\F_cB& -&Cf֍vT\Ze" Aʳ -*|UFFƭ^g{L;s~ՓwYc!c:Y QZf5d1WGñZ[?hi3J=!D;&m7\r#5pZi6~IôT46i: -aӿ2q{a;DvKA"vuum'Rv/GSi BNWϹ:zR$aGj!ViX <55*LAb'hTڢtOc\[ocH:rMcx$xs)2vs3Ց؅0-}PXU/B~Fῳٝ=Uܰ_`~'L0CSz[Fcܰ_\\b-SއK!f' -1pOqW1i3Tq>&j?ȦSt_362CkD]U*hTZb< u? ݒV هr|{ @kJu&HQ.;͌[I׳G^ޕQreKXLUv3iuـI$RQskzn:Uޯri8]MBS",o)=os]N[ʮWXKB=u*3uz y(f?~*T1Z,kI> -c?i)lӽUh!a|jNIrT?OmȾ[y]֣\Bx!@NT&oOp6+xDY+h(|FҝmvS_b;ۼq ok#iоW~iIҙsԣ`AL,#G H툴?[ec6D`#$?wjӹ;O}oN.ctNNl9 4YiP0 𶓢?196Ѡt񣠦\,2Ъ,-~DJ#68ڎ8#@gkj\/ǂ-b]ny\핔Q?:B;-xoLXNBւ՚`ZiP$YgBk8ecDDA#lvFsk#BD7C k!S@h}rv!14m%5l?#@ԜF 61RͦN?,!W?Cc;|]mZHKr kL}t -;T'*P T)`OttY770*Z?[jT\|&t#?D ܚ`Jv|pMh-E3TY, emUStWU+ߌg@ISkFhw}0mqCe8*GDW@I)$8H61KOLfX&jO Ԛy.Mud`cX*??9'ϲFFLʧU'IU8|UӤ( cet齒g$XV3^׸*T׹B?E\SΔ&0BE4e>xtS0Ng RcnB*Iύj -pQR|]+Lf_4GU/ŀJ; R?Ku#vӨU M9;@Bk<ܤ64.J.?vԽ~@ \ƟvJ"\Jv*w)L`oiCxJscTX(3u8#64&6ȝ -~MsCXUj/מIn M#@ԶʍTCz`ȝFdCP9=0inF0bJ%qBG/ܘPYki*KnGvI8Ek І! on<]pOϊDJ^[H u@T/)SjW8 ܗ{{UkFprz_k\V!hUGNjMέ'-ݽUߪ{XZ&w\О3"S 2U)i'm@d]maз|xu833 pΔs~63Oop]d2aE@]am=;]ک<9sWGЬ1,X+? Ss¸$]9'P|䰟qf"cNNO p_v*n̈́Q0KtNM9UwStX$Oژ 0]Ө-vPQ2|PtO(Ak uLt,7Gw5TcSܺsIިM6 ,Grj(xu%h(M[TduJhp+F(?!\FNs4h)szlv:[zb<p:PM=hJe~' a92ZᰅZW{JHVRUy]ə^rgGT GΉ_ej{ {}xSIۨ2K6SYU*w\s|kaۊfWrPZcM.Kz-xTb 4\j>ASX g^'l++Qth? WF`dSU%2]#<6u(MOamلq78@#''9ğu6'{3?C֪2LxTK2_ȉA}jvqNӝM̺m-e -~Шwi֟M*Utp:p"BW=WWFs̚]o9Byy!Cg0.];2Wl1BMvUƦ:\tt{ cމ#SsKO #~tS1*|M)kG i ILx𱔞^fO#ozcKnO3!__}~kua}鲣Nhp૸بt@iU\@W:?EjtR~XzYԿ}uS(3{J-C*7DwYTsj8qpTKےEʄ׻N+T rXMAŸۚoHhyg;WR -Qp:IJ촃U -[h&]5RY淭n_<{wLBc ~_<-k!>KFCIvAc1Yr:ށ9 -JԮ^Ox#$e*l7 rKIo"̬_?Nm?UKنK S)au 9&{ Q)rέirFK?LMw^ Ncދ޲A]2Z|G 2#tj=3UmEU{w#=UtJWRsLjҪ)5 WGo[alp5 -v'!tWOìi~H8*!=m*9yO{FCPj뺣]S, AAJ{/K;ʯ7gN/]S:핖ύIԸL3-;* w#HMtieS;ҩ<$vR*w5w/o7/<=I~/؜$Jowv'<aw= ܕV C)97؍J}ύʗx8>] Ԥ󥻷)^8\`S _MIo]Ck!SycpUfvݤ>t/V,c U貗JZ˪ĬM` -J1ob4h]*5nM` ;rXwI{b_ZS+K5rX%ηzTrt,Gpuf;MގqG%և29p| j '&HsVpU*<4z.U~7oG:ܟTSɑ{w׫vQ0ʝG%if'?(S_kw GXS|!+Ɯ'I!Sm:yސt]Vaf=o9hH 2؟Ih\/*ŏ7 -w5ǀOFw\2Xp\n?&PO۠9rp]X ~Pbbַi]nP{m_I\Hˮ`#RI;a8֟c["2֝A>!P;|QSXHNa7u+-2h/-9 I.&2{qǀBn2!4z.ZC0;(lʈ\I͞",T_'*4yֆ4l nC}&BQWJr6Ek۾2wO?r}&i#Aܮ/i ΃⩋ OhXUٿ{&<+E@sa (z31kD^bo}9wf~0m'>e vt2Gcc0Y)XϲcyWJu(kN)+f;l+6\O}!&k8Y|fTxcx?V:v8H)CI^*f sCviZc1t͎];I~3gXw ȫa - ;ݛBB og .IZ)s:9)ˁ't2_EawM3P];\aGʣ]i7aG}ګVm!֓ -c51c 8Km)xYMʭ{uŎvS`:4hW}*θB{oFvJk9y,+W -5jS-M&ffzjbҚ],nuꊓ_?]qSq+tl[L¦X[Wuc)07 X4q?)FKj}6RdLiQHj sa2!Tl-qѱT9Q:C3aXNѽ t?P>~OQ@iLЫAGs$Z`j02vHRYDmn(ֽ{ )ܺ򷭻.V>6pF,r]+a/5 ϟXI)7. -Al(~⩸쬓uiiCٝ!WԘL6e]2 T7uz)]u͝o3KZ7Xz[T" hOft*==o y.K)]Q -OiinRnL+־,x&62Z{iz[O+5ke``s IleD*Kި!TallO]>N=er~nx> -[@3 nB\QˤLUz, &TCH%~m'fu!OOSQS]gY՚yb>}˭9u'Eh(gz=0**;&>3'%@ajv'h閖!LUʿjw X W}b,fsk]bܧu_E/R]ϼ.ؿBWcP䃩}u#.1=SiaAkmAJx^u72z}#p̫~}ޖ`X U< ,RhN,,zrwވx]cc,5,Z<a,TSXT,O޺oU]ϱ]X溱p9*U./fcqMy*UKGS6&iE|S4Qa)e`; *|jk.U_gT]e.W{K>]OWJJ5;aDϓWYgQKs+t cQa=uޫ=by~y;KzcX^5^UqCJYu3f3wVNwO֐t+ݐPџu,..Rڱ?]l*ϴk u/⮮?Ϲw]b4W]oP: K:o2ܺqu/X.]f>$Gܦ5k^?i]jy.GcE^ܺ_9+XW]P_ȮS]fܰ)KFwK]Tz|kB/,E, -gXn]G5ՇWIn; .euvs*󬊿h]nXz,+ ˩^uX`]fPEں˹^bh0b}Yi_.^W䮬z|ꮳXeb,|NKr:?U[/yBڿ)է̬O%J Eb.ﴮSTV/DJésقM_ufV?B,S%rAuE6a.Jxh,E/;]z^Kac/^g5gY꺵Our\oAϼ=}E?͝qT=!ܮ;u?⮿X9+uԻ+=%Չ.W&:]Uʸacz.XN?_+XGuJ_QORWKįzQWsP~5yVuj4>K5OwܱL7X މg^J[ܱaubUX-J_7V -.JV){y]nOš̨g0\]H>kE^j<~*j.GurzN_=X!Mg5땽U± /`zYzǢ 6οUb++>jP+y y,a^bz #*⻟hRjJgC.9._X95a3_,@_U8}W'ȦӨ'/wYr+ ϸ.%[ -NhrN>ac1X]NεQaaaRV^>X<]jSEX?u⺩?Ek?!L,W,_Dj7X1; -[G?ǭe^Pm1_O[꺽NJ>ł597/x -,ܗ]j]jj,&zf#+Կ͝eTV;Ow/@uU4,6ruzrWVs]hՀ]@}R滟rY**>ұr `W$o?[1Y 榟5Z꺵NK.ea;u⡿j?LSOMnK,EqWs]i ޫt,@5Mf"NKa3wqj%r% @T;o5V W;+t.yW-X.s _W,F]C~/f8XWg֫S.auf+% ++y,^5W4yV.g[_XTҰc" -߫,u\jYR?jkУ>k 4yV+uǯ]ϵK,EbfuT[PW[規5}Y,,&a`7X J>ŀOkkXXS~^5SPy.O_]Nε[`?QV!\5~zQW]*G氏'XnX溳y #W=Euu}B})PϵcS]C&u9!ZNyX갊ߵa5`kGqjދ5yʟ@WYXwK䦏ܺ9.lUVbKW0=GJ(hNyODiMmКa:w'<0>7q -%BwJyCAV.Eur1c?#I^u>r*j7XMXK+>g5}jX~'ܱܰJ- _u!l5KawFG[Zl<%Kٻ1T)t6V~,ZoڛT:^K#*m&n 5`3XKM]TrXV9U,K>C+1@Fcu+:_W)f@mњov܆*^i Ӽ+TXV+U7!.%b;$ގ+@u_rG _[:Uj`WɇYjIeMhXIpnQSxpԺHhD'h|ϖj͌:u||i+DH(i!|}UU(33t*osim=;G=Ug^ԩVu*mfXq'XW}+U=WԣZݞ%rz,؎;OKiZo" ɏ0]i* Շ=%`?g+ŭ&tRy|Qs\$l&  -LhD8P4S,JTʘX҆b -.LsuT(qSpȡ|8L_gIc]؃Iך -} %IWJu U*,']cG*^pPk'P)+5c9uSꮕ Ä^N?u4љ * zecJ};XMȅF|0?.IÜ ݄҃՟8A v7/ѻ~cMjU/r{]:ۭ`,x.Ro$ԫ=1WEaOahlk>rtVL"e>`גW>kUt9Ulo:\UC `֟SW} -aJ?ݒݖ u6|ڎsh!8A~ݻB:N3t'^UumOvZa6?7s2_UYgy)zUqNx3\ -DB&O>NHsΓ\H|yğ`#ͫGB2_o\ThqGrB$-q2Y~ +df&;, -V"GJQJv[ -"[wз=kc3[)+d/;B_!F[}__em MmMǏ6C܇t/g jsɕ}Wñ}+p7Y6j޶B { _#ll:Vg}~'7R}Ƒ*AhhU 6FBTL$tNVo8]n;fpSA-{U\lэb\iLmkுPI(}NKv,rZ;Cj#ӢQԎ߭ah~XQvϿt TS`2QˏU0d&Sk|%i1w~Zmf*sOÚ4頒w A̼Ht`MoiQ#c\_uٹة]{\&dP0`'[n$tar' ->(my!P6uBxKg0]m뭷;mXzʗ`o`@sr!Q/{ldF=1u(TKpWe?TtQU)3QI5&ݪ+.XeKWLi>Jq;Y;8M*˱^Z.OopBwy.TY.~ڏJgkxgz+@I` [nM^D'"&";.\]6sbCi>*v'+zahhu'S+_uyvYW &.o޿] X'zꂢm-Ycn?ͻ5'l!vp˵ðTJt-U -'B"A*%PwB]z.|ti%LEo/w:SLP$.>2Oh:Uԝ. n+ ԇ0WH~ s.»)نZ!0bU=#-[\;7E$SܩziL_;@#g6|q`3Oa=cқgHxzK~tϚш>Wlًer<0]Yt9*{BVS誘WIxot*3C80TZ`{^N 'gD -B~֚NPu -ޠrW)A氞:sԇH $l?5X -/ - # -uSіհ@UM/ GCXDy&@0yUtB~ 5V57}Mf*!-%zcBP<3 y._]u*mU XöTj;N*'_#z0\ >8(!tG<5J請ޚ$G˚4I3(^#ɽ -븇+o+/x[ڜsT4M}ףgrS[tʫ8N1) #;!3z$NPS>^D䪓w#Dв氛 Β~@? :I̽^j+*eB9wCS=BTL[pܣD'wR 2vj]߹a7kDMNh#HbH86#=Ne8ۤ*;\F rީ7=[)Wx*UP&nE7&PG6JM4g9ʣ@k4қZL|tQ!pҵNl:PGA[L*&UFK 4΍$oN =7X(w&xTJa5k;~XSv*tao%U {r>DŽsw58Mޜ1.0G4GU9py8m -Qv4˓FegN[&]P8]]Tz.WiS]W5yw$j(W}|UN(gc5+AW LǂHqy*$g&Û3J`F`Np8jem'1O9M -xp}WwCIF~K&g%V lVl3 +m]] Oo ύ*O "dvDqLˈM}FT]-U;ۊ֖j+ܩpUow 0x&v_Uw%?UV,rXLX45u%mj{UOeey1S\b<w{B+'6nۺxy؞bmyւ"bM>VSѽbGG$>JV] ԁqjk .r"nTW~jb8A:S߻Pir<#YJDd ϖῩ1'45N{&lj,gZ:9U[qp&h,L, &r&O;۲veRuWc3wi6IoLt r:C^xDX8 5SL^nB+%/v4@6Su=8Ү8;tX8 \f䰛~$ - cxX*5!v%tN>0T{S1S}BhAfa7NlNb9u ˌju@(Vԋ!#л? y ŹSi(ΐ¡QZ||<w?b).)|Sc3{c jT8!mGG2ޫvU1^L(^S =7&- -N[+ɷD{y|c-[?vYv_)1e*S#i;S ؍F85NS4fTe7nt<[| 9Vi*FM>LО>ʕp?}8M7vftM/ʡD 5w1\!I|>)@g|] lǮ'k%VMR'qHT\5Bph$tsD6zvR0x' ٚ;IڝTqq? -5;aݱS~!3:,qcb{n)҈T8O!6v(&=wbwLC -ykc-(eTm4lWw4!rcgRI;4 Q9FnI@}t"rЩGȧ@A+>}O5Os˚FIe\+ 4:ECKxʤi<>YO Pi-; -}zs  -'jqGEkrUZZ3}FК;۔KwtG> E^t݅HSnT'rsclOA}ڣֽ?*sTUచ<<ջ?ZaBGu$kGf4 {4dh;=:U'lz&ѤYCj,G,3hE>fqyUީ\m&=~nsge\lߛv@n[n"%9lJ,W pCQҷqwWmvJMJCnMp?P*f4¤'O-[(T#z@F>Vp8]Na 겦n;Ybx,?mH۬Krw$[>ARn[V313SSbdG!0CEUcYtx48LWϲ97 LҨBsK|'S+27 ~ncb~n -C}ޓ2'98%]gjOT,*Ub0XQL䎉)7<$3<4f%YhMThti>I # 2VC=p -_#Ulmg4pO)́pQ2ZQCO7T3u5G p^ +ηN@uF]hYt44@;d(]ij!(Rw%V^7i*Ǽ7a\iBv'2ZJv3 y -D<_wHWisP9Tr'|F*:NmC.ubq$ڍ( -jw%K[5ABKxm5@O$h2M*ZZU) H:1ҩMR(Q(NSD"äMh -#4֣D7_3U^VWGSxx6&\(i <i >(8:GMas~^ ܓ`9]XMH K~ОaJv#dJ&'W`i͇Jڢ&6EdNDߡjOF4l+z:rU_ -J%<ݧEp@DNGVS %P!g2}wFqvoT$QUPn퐚 xNqX> W0w55yXG)fV+̔ -ﱨ#f '׵S2(40X[zS<U)[675Gɭ ¿U7\au*i V+a9 --wOѡ8L,`z05],veGɦiaP V8!{L)[7 Qi7^ⰰsvOB@Qo4[*g8 Xbw&  -'!6ܱ}>3ysGeI{]XewBti`G7Ml"ߪuk!j$m'*Mnaڄ샷 #G8Ll{ -@F!c8B=ǚoW1aʺ~vRlE"*Too$ϨM]bg%?j=.<_}{\ٟw$S=o[=Ą% -{6u)G+GB )Շ*XXmX<˴V7\X-䦗ں-k*;f#X {C@aMqTaV%)\k_~i]q9f(L ~ՂK6S,hMHaN)Q:_aܺIE>>XQxs.B½\ݩπ\U*S󍊐ENSڮTIRvff}> ^;L;2Jl'ܪ{B5v7'ѽ\LuöS1HUxJV(؋{+嚹T{x'q8u&>!3#,WrLmu/F[x c44o)( k3̪,"v> o?5J\aL"&-#JsTZ,(N, l+'YXݡQN:IU:C^ ԜM|ҡ;M,$n_ ~҃sjYJe4ErpaH(L| 0gE07àY&ֳRptV1; LUyY߸&QNSѼU8HCje&Si=2#oaa*5WpQ⦘-"V7T~hD*ѩ03GB.+Si<{*n@.N.HRuBSR$8Lil2݄*- WuۧQAC4Uu "5'(iӾ8'OޟPN+9J8hU5?`M}9T(TK$cr,hN$.!9sTYBU_js]K.QA^v"Ï$)8%"|݈$dR{]x45#gwOoPd2S*U O -YtE] A -JgEy$&yؘ|s?鲐TcaY!~Vjmb -, 16uTʤٵ^쌋1ޡ7cX7.(muzlc!1<%Z'RQTshS[L$2{\npB4lWeKy#Uh4A77;$a -+6*; XA:; ~!i'i7 '*/Tj_QʦA#PB -%B%ƺ~Y+FU֔h6fGH2;AEb|~/ڰ_6%㺟 L]Ӧ7 ;BNKcE ȩT4p+ma>IgRyctkyk -R%Tim+맊:,&7S x5AAU:3T.^`EδOW{z<7^ N{8W.h8oG[jeLd7.lq2;Ӌiރ}rn]ҷXރxN芄lr/q]P]vn,[==6abj7.XOHQ}M&뼫{[|sS)\hvMB,wp[oYz\谜hϒe>T.}>"5t\V})Zi xYVR_jHZ9HY ^i4Z~00ª[x_vMk+*USvY nҧ77[&W껒9͇Bb|Y() -睧0_`3B+Pe0<\AH9mCXNNyrBKhW"dr-oTTQuO uЧ3ʎVڊaφѐ`yrC<+gc P%Կ}arh)iD"L+G~#ݴ7ಆ@ j<Bc|S.cJ-*_k$pTYUv8h*r {=swB-px.n;hf -#5~l}Z493 > xH↘ϰ7#YF%v2Mb#cz{ ,rM?ڪ^'^iDͭ%p*|2r ;1Unf&aVqMi*nj_: v||czt?EJ>& ][ӔT@<uKvڊ.E -rѫ5/RK.O׺<,k U^>)69 -1UYz볋i4'J9]tʅJ[m- #jt=tOc辶krG [zu -+5c{d0gB% -NKP:[_)WQP}J4IMatpU$t*Mc:gHs:lP7sJגcA%^2a~Uca7;q65ŧ7toOucn.j/Aw1y:@T^&]!TQyt|t퀛iPumPk )A9ȷ5c.S? UA`?+zkyY5#U܊Xl<sZCR Tm5Ik#sFտx8ul -:IQ$D(2 ,]ykIaޥw:ѭ({;T$8'-~p\V0Զ7*!1AQ aq0@P?x 7o*_)3U3tqgO&RȤ`B:B[T1PB϶TW@i`iP(@ m-݇02 -}J׹S{D80ܟ -<&p %1\XBSNvm&\ iT }K\[=*k0;EЂ6XKX{5 `Zg2EF7[DU,m01.pi1J4{6`kd O.-/JMyjM2lQVoq ]"D^׶ -7ަ*Q.5iU*/C3RVYQpqPv|-^MV .J[b YGKslFjkCH]WSL2e]\d ۰ \mg ڳ<)*@cեĩY @ge(Qk;{19?ٙ}'tM: (j*}6pJPѲ!j\'{!3l),7xX{* SLʗ-*…&T0lENU`EEn U2ҴT#(! $o*|.ט~Tm(-)~ a+jUwI@2j 9@V:[*606!Br۪C++2It2C٫tlX"Wk(̊)0hJf^Ei+wc4 a0:ܶ,W̉5un|\T7T+m71<ݕTS?ZzS7z%8± -\Q,[RCH_ sld-}_oܿ-.TlLv)b6#8i9tA13gAJ!FO, -oq.379-Arw -e%u ݈X#7ݡK2_dSܭ=RNjەIM#fp=LCl=VL ٚ܈EW6=.6fW6⸬ap:8wvnF{=fR-0mVlGbQ:0ֵ4N\M̼iĈbEҴbEiQ#wZs9N%ᗫ %9i>c#+Amq)KľYz0; s!3ZR˗.]"CBg2CV `n J5:£ iU@aP\oE3&s=iQA&n͐.%\:f!טЉ83F Ў;:TT 6 : M OZ kNgpF3&n'xsuw@FVtUav KB3&mF3Ά78%[ Ptvca:W2ێV1Hs kaORZ4 -Έ:!8@TW/D_TIP"m9FV!ja%&ӂ J@̦&bKyHֳ O \MF֍cfs>5I#w օ׍39*W Nv˗-aΘԸ8q>3hg2PhbJmWgWh%1Л_Q6Kif2Θ*c3,c^ x:oᶌvИfIVB7xsg9MƉSx`"' F9f5%f0!92APZoi h7N~ Άum.%fl0e3 -quaz\ 95w@X:6i;^tܸ{'8E`bP˙Gsm/R^2JTV:$$6i[Si)wS!)}sy`E 5;lH,:R$JLQ18iziytzyQ 97t1ZܿԤbKKrR<^(0ၸߘ- 4W %(x+hѢW*\@)8HgtK%{%}щ'ѳbv ]YCG+}] n,(nB"0~, QCCqA[`VfΧsf M==ŇVNK\wjVW[X3 [z"]~I+n]M+n+:31FlljuN7dM5jfMJީ*m|4moRY'|#_Sx% q4 - dٝk:Y(HA$QP6 FTE&Ѵ*ЌU_Ù\J3rybӝ94l׽7Zq Tw#֝l@Jcʍsµtv$Gb|P̀ð0y,mhIHhP|^rYZRn! -\ox&S7\ uC@-6 W&cOS*(J@ 2"r"ȀQf+8 KXg91Sӓ^^Τ kĨAn.wsa,M/hkU"@ nٹ.)J7[IB(bdPwK#c4GeD 6"9X4MzUh|*\&oJ1+oO-zoQ=v4R'$mQ9~707 `ZM-.!t$N` m9)E` ;JK0@w&%R[Խ@ b.f1P4ff,n$GҼ&CNeiZULWrx\UfV|m@|7chQ J F*' t_7K5 2#7 ]0 3%ZeL[4?$18PK%!5=+S{P2ZCnuJМz HirM!\7s.b%i x>iގ<8̲sg WW\JڥeGstUfz=+uCRtI(Ab; xX@&q"gUQ2`Rf_fmE. x%dŐ>{Vݢhk (dgLG(+lLbk.K1X;PD$< '>/JiTFיh>L4ZT>nB%C (M0s0;X% \`ejw.Cc˅te uxfj -;* =>"헎NH5DAvCaoh=yW^F\as ҡ\ y0Ն:ڼ1s'#{ec0)T{%B̽_0EWݩY2UpGᬀ naa"l 5b dԮ^ũq@bDErmnj\c\1127嚝Nefd#/L³8}|MXhˆt5&X|~Q/XmN_ŕƹdju2> -}$%46B,8˶ BtPx,Kzcs{P's/G\4vaqs&"5 -7UҚiy4%í;̼隝h4NakQt6'2zC\(rx&%|ncpjV4$= -_o*l a[ay>RſJz&p/܉OR-n8t޼y㶥ks2|J9ӟF,ӉѫǏ:{GvzCs+}_aj_5ej 7ZTwbu}}i:` -ΊBΘ1d4礉~ZJB7~4!Ӌ qF0i4$h:4Y/Z757$tGC-rBґ)_fj4Jl@b}9Ym <7(*6.3o*yE~-xhu4c vS -P'99 64&\MF:VD;HjD8X.TvZ%TtYsj\̹z ptO -Kc)^|8юq8M46&o;hT;Sʆ`Z:^ ұ8a+ґ]s+{d3.6-VwQLwq+8{T2LZ}7 }Z)x CFdǠh .. Q1HbeGf-b06DzoD+"5& 匯6#~&mK0pĪ9oنA)!-R𙟿~H4`),tg 7G7_9C;ʑ+vdPeE_d,@"@a'h&7JsјSq7т̟W3gb>c-m<$5E>Xu-9gn2iw\3:)T.ȆĞt\]OcÝqSo65/JnzsIsvd`>l- -vIZ>=}״5;3⬛9i]0AJCҗ.MN®odގIԤzpBlP|:_1^~bK[:[EePg,r2}%D)X}^ȧËk¡!? cgz۩"gBfq:+^!.&]jG\c0#DZc>?i=Cҥu D49Q!a/XR2(}rb58x3 +f7Q e} U[l!,[U6Lb@}US $ (/ں~=msZBAd^ŀ#9_sSLWRоl3b1'A&b+-C{;— 6éhg84K /zt q&2T"*ٰ1 siB1@hhkl.j *:Y98lz; l{KUͲޓ yH):bkaXakXÕ5Jv e>)On&d{ٝ9J7FBT;[>&8:gJ`8`^f)0 eVVYo1zY/KbSͦ05fHyP@Yo-F^n3S0k-C0ff&uAi -%Ku+n0ڤh3=ٟj'-&Ng/SVJԹTsZ3-# Å݆ ?uAo0^ٹeeqPNcuLj /- mClnՃ[Jb-@sو0 :Xу),|O"\^F)marSz"|`cpu[t!IEFCcÿ3^o}` %fd}δT7q+aqaJ t[Uj*:\8HYzSۻ%(XAq ` 7Әo7%QBk%OFr?KK6NpLmXGEn5Ŭ=a}*m/PS}͡g_#,/ZΛw<*R~`( ( Ƅj0m?lY -@eiPZo) -8օϹA@B*`r-< ppD,@Yr!}Նif(n,!:ٶ肣ћncX[2$xHDf![ q(`>R PYM;PJ1[J\ޙ:u *XNgGVWN4wQ͎ jUlˋsSJ8,!.T:kNݜ3=;vfiY%%eaV}(Y* )jԈ{XݕmHK2mLR"|"pX z ߸x0Ɨ+BaּigQm\4w|yqr7c^ ,)eˌ*Y^5fbt\ #:"څFT Cք ~)R!^YD:ʹ=ɛ,St3c҈_eUzsQkSmjh^&)M9X ;՗7Q%t-0/P̗Ň,1#tvj5윰GbDdfY(Jipm F`֥JjiteMN~.a5Μypn\&nLOz?Db+^T(]p,`Y91 a];a`e7XqW>Q4#•q9:IR&B4N(#(Uc#S@+1C֣kJ\yDžw'>WGÍMMBUם/]9 .B?)5F.lLG$M"=KAuz/s1mN tv$L&2,REx-eo)Iq92r$HU+u]pЏ ^43/_f4HaK>`ܛXz.RX -a͟h߷Bg1p*#w+,~p)}T;fS6Wj4BP#% 13йtjcÝZӮ4aMVa[3]t3yḡg=>*%h e2ߤb|LvA7 0t( T$9m -m#h>F -L{,?Csʹ>ὐ}?Qx -UJ@& #62I * #B9I!: -7\KCg[1}PҐWBԗxK7˭qips.Ԅ>s0Et< F:aQ;h)2  -xs@lFlLm7p^(A.^"hF\<:TIeBZtD\IwƤLxհ7b. U1(- na.g\mNZr \D(s-su-ĴOʌ !مd4Z$DVYykT*g b4,4ЎGsK0Z)0̽Շ4R#71 I6B.x ,X[TRlDZmaZYLfܭJ&#Pa/BޥTޞjAiUن l7(-*+!  Tˈ^cKҝ\346uDkLj+xdS2(<4mPd؛ U5eB]K6xB3M7(( -`VECX004Bm"]uo]%K"98E闦;M(a 9Ľ 7TŨ+N! - xRJ!3d, K2ٳAQĹ%X d -z0]4b/0"BƗU%iڝ.my#xԤJ -.&cmtJ,HEdXĩf"pR$GvlPJX{.\X^啩YCW:\pЌ=.u{ 4kuƊRw $ -}!X'{\N(X-GOYؖe+Ml.D!ۏ- w iQ RBBBP9^ck`(JuAWY7@/LW~*=*Vl!MKve4Sr QqmC;B!x 3˄"؋\ZPteut#Ƅa֔"A֡3HqG[ PpFKD@ !f1*#^1ss a -Q%§:fowx-nH.. ;%K0g JΘ~Nb:~b - -v$gh*84na,G/+r]UhX @wJx"D&]䬂3;#qQ)-c&6w7B]usgtAԚbIOę]̊B?ӈ–|{|#p_m$K /af?1N7̈Z%EFɭ߲Ah7I%I2hy(  JLo9g튢HE[zzsfշd\mi`["@]~JeuU*Y(6 3C3 Gg\/*1%Q8…%j^-2+4[@  -Q#ߐ*TX&k)fdW>n#\j[*\/`_ߑ<#L -k2D|iSӤԟjG( s/#с7 -ATW!x [zJuY~e\3}X$TpcV'DIMy-ڟGj+;\ EXRR)++z^/SKK -Prd -B@WD]PE-%CEVøsi{b.h{k8c.qG]ݠI~Vl\1>r@0W3xd&7ޣZc`J}$84Z0bΪ"/i(}R[DՔ47$6B@Lv7X41-;Yxi) EP` aI :(1U+bk,@Cvn!H( 3z|/ң}<$բăڊ%ø@^bP$w&aY0 W {x֎5RbXS-\H5ܵkzLm*C=.R* -ZQL+`\UZ^8K8Hpz@w`LԜa˩Fqho/C vӯ z54>etS`JY[$֑=$&eDEjwbCFUBU~gmẅf 6[g`ZU/&CL#>?BeW}~dX^OIRf<8xsrcP -F.(,]k RRO!:=--ÆZɏɘ I=n,4,foS ->B=if^,bg*=D|1Vx<DžJg{,:,fSA(KLtLD:[EE,"E`J7,!(8!>GctÝXx\}T6ۂ2nН'!1hUW=!ю6t`X -gERC.*XeM -VeK&Y,xk>lC~X?S"Jʲ~JvERyv@W0S*y8&2e$@ ߖB7z4/tb^ca1U'bYi4t3|'rqehX?d&T쵐6M( ontwYĸ0X6F%Qa){%`A%%Ǎ/ED -q)fH<-jap1a #'{qJ}WG$EUw1x ;kcu tJGOZ{ )B)K2^A`NDKS d2˗r7MEW 6řTLv ' /!Y=ʹƥД`\񄥥H - sr{[_]D+/%FicdS e=d;N]\cU5FLqfTdNWL=ABJ@zWId%~TXd}_"ɣve|5P7BQ2>tMH"7Rӑ$K&Vs䀵'We7gGQ̯afq({O8U1HЉp#!"WwfU~0C.wya)W"B63Es! oށ+a-z-^J>0Uk#p l"+i!ۖ}@$ FN-R4?Lv@%tZRdT$,g Wri;6B7H.D*Q P'4{1YVԲh&ȵo/ƜF`Cs6?dՓexnkhtJr{aXx4!m&=kmցn!j^d6鹚4oȒHD[,-܂> ckNsYq\U?2xjR?~I14VF;3X?n$;^&R ]d:7˚3l%v3PUܠe4z࣊wv {dU/2*עP& р_ 26A Q%DOSF*[OcR_pCBܕ>_3DGWa -@Q_h(@ 8V4!`z%h]LiWj)?8'qaM˞Wd(j^ɋBz_ۺ#k,舽x]BXih9t:ª"N#P%A"8vd+gAF1;yq?)xa@TE誔7all )B9q*^!-Dwb^73І^wia -ę 8 555>T:ht\a!2HtR9hvˆ^R C*P!cBX)Yp(Zz-+R܏~ V| BICNP%vA `)t/QAV(R#.W8}"Ky/7qJ6^uHshT&ߔX+ э hk Fh΍Z Q{\ pLLMj؊b}zɽᲁkTA6AlLo= DB0X#M,MَbF8g%/xf0 )! AXig!.c -TPܛB"fzZ=\irb{R^rnDyͽ 5Sf``4%ʓA_:q}4SR,^&X@>|Cc*oZ m5(;^E&oMB}L f8~IWpDjC1vBG PB<D}-n{ٙp"(bbܸ7QTf,|2$@4cG!4*ہ ,paE\dw)߁vSHaNcS;\ӸG}Pr>v5{jX -׸G|fd܋ 5d22 srdqӐ)6z;]ps4:ES5.f =J?&`ٔ -Iau T0Sf ,85˨u= -(SG6c:d}e p, b,&E -JQ ޮS1c˄@3{a &}k6/!*ne;3r鵙";|6W0k̽V+̚ (?\SMN935-oCnֵGF.Ztt*Ē6-1 Ɲc  *zCo`V_`hDWmܔKU{툱`%T8t vv^+hA˕Z_D'f%ة{VO H \V3% ~PSPlr~ /w:hea Y*(]-e@ -B51E/h0_r!˜2TV!lAciiAVИ(s𹙥,qn!I~~Mn -z^sH ͦ>S'jYx)SE-.cke1g՘Plncb6tPD] #dbLTŻc?K,و̪o(jtr2pp+aR+h?+4 LlV5B _lʲP?Y/ݮR(fxTɬx  oESCh U0`C>{+!cdd؍rإSÈ>65xbaawlOꊁ9uT= 5{Ps?Մ*ĶfXĻ/пVXP5$UHr*S1~>ڂ{:1QpqHŭ%)S,- $!;TkVܗ>vUK9Ku%aŶDGKЛU -%*k"F,[*dF>aϑ) QD~AfϠ7VlC0iыPt>g77F=nb/}2V -Sc -k" u{IJATI9VYc/=" -M20ȥb_$B2bXq&"77]Wca_2[ۭ -Urƣ'q(Bϲ rM{X } /~a_h}⾰VVP\%U#\07LBi$e7 emU>QTlKUqZ`l+f#LYw|!ܪ\/F3l:O3}}U%nPBjVō`PW -FbǼ=Gf]MEE$YdbU tHm3kQ.]ЇT8`4J;טGVn[]"[:|Iɭ1|jܤ@TjU.q92 Z41hHh*wbA,@A1VZ -9GUA*=[-Ub.)W)Vmb5"z0"q>eάd@e|ܬejKOizqhx029g(<] X}hef -?lMؒv/E˗.8C)qcK "\rń& r.,!7u {ȐLtROQ:'Q!T =X0U+Lh<8g{UыJ%`19n@!j9(I~7;H$f2YFӊ<./(zw%*ħcNݛ3q=!&N*b{#$Y.rl| Qn s%rB]K/aYbq .4F-xDeS8ЌWʉZRr&KJ5`" *f/b%l@H6*eRTl\{%FYS7n XZ(Pi\& 4XeM Q/f4f)HUXŗ\zcK#x::w0J啴12KGL.IGQ]OGPSJ@ucARRQ֤AY @mde}DlF P@3 ;r$p..c.fTE *$#.)a=TDQnց`6CS^uFno^< d+!+i\v'QmH^ymC!D1P!r] Ye E>\zZ,9M*1# L0 Ez&Q"1Ya*;C`S-G(&8=?m*$KPn!e$bguL0ml7q ]Ɩf`]vBkubYh \ ф"F=UP[>;GbJ Ύ -D"a"@T4 ]2^zok*=r\ͬ}ېf@%Eevz!Q1J/D_Јw)s%hȰKVcR"5 -.n|me4jx -`AKñ _9۔Aa"Rr%,m =3LR1Sc&fS -_bPą02!r4!!c RJ Ή*W:\X%CR GA}mh7RR!6Ř8TT>xqx`e[كFйW!O,uv/S -bթ,B }6%EaWP?sB0̭qEl[Dp/ @c?q-_Y=yJiOjsgv0Gkܗ*>ugg'4F,ü Ph]B(MSE sX qD u 7{UH1*UJQ<|׭Yĭx 1 wX^ - Nc*7 -I|ƃN*UJƂU_C (̌٪ -N$V##X!}0 PEv> jP1.YN,΢go-tF%#nX`Fҭ:JY!6:-[kmMF(EZ69lo2w TC l&vH7Ϭ|<)p+ _J7uTRJ*VL;\oun\է$]hxbPE7g";'2jVdr@ RiV6l [R%)e]39U"LM`4˕Hm _t{ؖ AwYf;#"~5ѿ/y\oK`^`63prBNlm <`!0W}Zm_*TiR25MRW0%BGTPTNЬd(PU z1LfC|H|a3v>zökdTإJE-j?#(wa  u㥋+&/`7RZexQ*+ZMAؘ%% j_ETT4ܪscgV{LiRxTI\#*Tt^+´0a>"x~J /^ /-M.{'gmhrGm ڱHN̦h萃?U+J,eŠSt:]8y:rf$:LP (M;ܤ FI&Pp`m!r9)p=B-K*f|<ħ3'$k -8?iBs\wbSilF,B oQT_[GʴIFbXJ }]s Rl -D*鎠/=1`$5FvZB<.YN9pCq`2(kZ aʨr_rᢥJva]\Tj$cÛ٬0-|xjԠY;MN!ȲST G&@mml.8P Gǘ:b cs}Ɨ *0 L)B_֔% ݘ0Ph0EL"$7wJ%BGh|r}/ImWMOit{j!DMA\$K&V\'1Y\wFU1)G e r݆ѕ-Z-u;okE~(2ES4ǫx%+n^0լlE,E`M#ΗD>MACFzC`V}?e$ܷ}qq^T~+e#Y*]JR6 YO^r-l%{^P Pu rf9t._ϢxTpT{vCxAI/-R3'}G#Dh *|] KyZm^쀕?! ^u;GxP ]P*| e)jfPVaH!A.L (l;rܻ!UklwhPD\sd5`6T>ȍ# ePX7kWp%\E4_+rYq!4qxWqT -BWBN |śݝ\#ل$ʤ }:-@& ~z{|md 6qB;Ti.,27BI"JejX_9yaG#(# xo3ߘ\)+rSrJFCWA9qfZ.\4Y^/YHGtODb1q)4k6j sMt̛1o -a P 聀]Da GP4bDvs9Qwk{jfޑp-+Xa7g }iά!N՟i+76e:dzeHŐ롣0 /.E$E/'zVhDVɠf -B`Zb0'墰s[ё˗.\.\u&Ƙz5E [<*RWDS~aҥO8ȣ03cdmUCC/5)IgRux%N+Cjl2] 8!qAWfC\ 4qΖA)o H:\N.])HIWD``тڇ"LzGV?iy>i˯LAnZ6J4SV^åu^j}+6Dbꆰ2H֝jLՒ͖_+!\ -2`,x;  -@#Y=&+ĕ>%/QJpB 7p ; /QuΗg0_h* dvq9E9xHtXkIp VUW,٬%@h[o?pg f2WCO,vc1 ?b~<ۧ?pSُċ>d dMEU坚Uh!{G̻jej^f%eB5DžxSGem5bp#У*^N# >,N -Rzp,|C(dU`MaB>f7%ۆ˲ j%Sѵ w+YCvd0ш6Al CP,b6PD+_qL?)*/b1ܯI/d5hiuh2yқ 2+nNjFe*bnf? 97ө[##q!:I(T^'8 x ~7/jizxXBg.\ț!ك;4;tΎB5 U]\eX)B b`/Cr3{1xVb751NB -47սT7OJt_@82XN4͞ cʳ6d)k$lX!Ẹ /:,%~DzTx3 woL<5c#/. sKz$1ŨbPK ,X ؓ>,I&YԨ X:r(:/U˗)&Z UDA*h^%.:Y_#CGF\h\]oS_СؑB(LFH6ktBpn~Q?I6e-1%¼4[ǥ-}1'yU=4eҗꄴ.nhzkU=:,J'@0|3#Fj! -[DLNz'xSe' R QHʓTqb)3nJ`!\:-,c2%%46PoWr,]V]|:2u bV0\?Ƃ%yf"[ 76ShX"!+ŇBoֵ7i`.wJ3ԶF{6ToMlfR{VJƮ,WC*oLj2arŪX)i ڝ=^73sf/ º}g4D3DJ'RGiNMDGAiE, y (JtQvX{.V0e IK#/2F0 iZ, F3}+ ,Fm-E-jm7.?]+b)wNYѧ4vSt,.uHˁUEp9eAsAΕt>TCXm7LA,&k.[5qTwv/)y5c2I'1rs8b6!IE^ Ls!-&IC!7` Hrf@.i)RZDhIl9coOtJ#\NdhA`Ϊ\:?mc%`¾wl((],{SFǐZq/:b0#T؛1׆!P/ }Z|QJw~#Ffu-u {~NVԣ.//y_Mqzcdm"ㅋm&/h A[!w] K:l5Ǧ:.70A`H k;N;# P𡰪%f 0Ov"6a򘷿?TXN&ڼF5B0rD5<#>˗\~,^448,NujQD*U͏B`],04V7u\AW)}?#ů-2EV˵f+~\-V2ɢ7FTwn ]xfwm(m/\N 娾%0IP5lC8F`P TC;1qyc`%2Epe\YqadR\]XNtQuܦVX`Q UkH-K"|7551DcC,4,<G%b*Dh~-'xWtXSZnFU;յ gQW7j ,!ĆGaN.-5V ؙ $i'K(J@.d# -b1D6F Yqt,xV!qΕ(9+T*7X<92T<0fXQtc. .#D}䵉)CA-`aD"ie63?CE|.r%&f爥ot62Lak -10 E/B˗.bY`qp/[fIZpF<\҉#J4VOSf|L|Q~>2?Hퟥ֫69\Yr˗kJjQbwjQFBN , r5LuAC$ses+JJP%@}6o67Dt6\.^4] aD'2MwHc/K+\vM JcWǶ5'1qW9hCơ쪹hY3GϿSgC͕@4hm7+3:&MF12ZԦ),K%EMǃ7ά#ĨQgD؏^@˄2[7\5. u~o K:1f=2ea6n⋸i+9C>P%:- < Mz+GL:cY+*6mkSP*rfZ9A xpWP6)*|H5 Suc$v(EP1m:{!loi͐KGF5,̥7q *W, Xض3//RoX@5t6޵^WL&B#117:.fC YR7*k28*mս2 zÕ*I +ySC 5p&A 4?MΡ:/ǩ<5s xVC۾C@ƀKe Kpݦ_#C2 {~ 631鴰@/, k\y%C\:_n@T}iYZ2!M׉ӽ/[՗>|*IxLbftNfg3i{AOǺݣF3r1Y B|uo1tٰXa)ƌ ,D~J!{ K6^`6n ‘](@L# .7"/GJC¼]ikF|Hbtq/mL~|%%@?- *S1xvA'|oJ|7hiE:*~ -`H@ll2d&#[ yhR6Vҝi·<M1]lK6c/L~d!m! 8&'i&\>/L-r O辻:ј\^}V#+a1aGh m>ɗ4F(E_P ѝ ţ -[9 _?L} >ޮ6s7iVfF&$nNi~-`‚vBfs\< -чh݃p$g!Ǒ 6<ǃ.To@Tg鎎V\ozm=̈Df{T:`=N͉F&_*nV({srտPjJoǛ| 7Ҿsx?6ұ)9+eJYh xn[wʠ Z"| 6$-ٓoEjBV3iF+ћhi~7/菍%ҩ׃91iSo=RehL膘"[AjM:,k\пGkZT?U.l֗/KoN^tk'hsUxq=-T} YZ ,_(!@.Tat&^1㶌26n?H6%t|$v/ C`cB0!w#(x.gH|f]IslE$cN:ր B,\,| h.;FM h3GN0kz Z2eJ ^``c%^Q&jܸߦ8M;`zJ\> u1mFҙ+@ac\INP#3+BцoChTAIr/¨UMU&:0ьEw&bLV8p̣M5#r2 -:HeїpʹLϼwFΗO{A&r`6!ި 0 Iz1!{ó.(\&C}inU˨m xMӡ"[^a2+ N"YEAǘ CtrFw3iHZ E 6g$Z&j4F "0<}0BES(:7Mٙ3d!H&ȹReMA:ŭ%S\l7gQ @4][Hȴ39br s3)Y,6P,R-}+s@!1^kTS3 ͓(A蹆ԶV\ Z8PSDT1[܆!ƛ#6jsfFYz 1"1 ֹ'/L06ъI ->`L~|:b88z;5V4}D{U؍7hĨY"q 1PM0MDR!B&%.d4fhu}Sq*D0}NXZ *l4y-|B5$h*:Cw%v7A,XC#7CƏV6!%,#0"d܁r`oQKzx{)uA/b*, vP*7).d]M,HbTm}NGԕvoL8t/ht6Bd`T(F"gMFЎTcB%" .&c/A` VCipK:[̷@ZS.zf\%xql Mnc3EH"kE7؊΄w^]{^txܿ)HrBhݎ^[3(6 ~hG4 8+82Ate4&ںx\\^Anu)ڻ:X_(7<>cզcqABET 9P:FliqעzGK}o 9'ZV&N̒)L'b(" )$_]d-E]D^!ELM};iKU< @q!)2Ͳ#PIpcNa1hsh+b_B*qВр CT: -`1.Eߔ XCt/ -:sn# IQ/>s"v V["Y04 $%N4f`B9ҍ9u ]yMq8DtW 3 Adt`&fp*+ZZKo! [u"<0fDl& -[QvЄ Vx^d.q)8>5Xvo:H5 %%ӗsCvaLQalr'BPL)Ĕ`D^/8X5+@K3iSxUxs+ꤦ![R`ʹB!Lu/jđe.n:!si.ݞU7 b!eTel|49?0vvĪG; nf3;=b]l;S^7 -M_jO'~㩊5gPBAY0/we=SȦ) - .| υK4G,J B^*q1?Io ; 5n+X9u`zkCD j>R5sQ.nR)_7HْhJj`RrvCQ#3o"Ёނ? *o3/]P&bn'@l2.o/C[ne\7KJgM,1PF,bQLx&N~!/'0\%wS-2'VTG* }C{?2<H>i>] mk}B$+ -C*T E6Rq0w5΃z+qX0hiZ.< OKY>eˁԂ `{-!-1Vl 'mW'Y1JX(!s4c]ʚ-7+rf zw/[Cr&Mdv "0<`}*[jw_vˍDB.BMmu9֔Fuh.^_NHPYcN@bA&{s6%X.]VgFWP)lwk᎙p!ꭇ_K} -2mMY.EZByx'hi_̱A\&l1  ~jwJ @ScR*Lu@jz 2m{fwu4>!{ޚW"wdWQ}LK50r~DlqA, iC=-c,d2VVAfaԱt4`,󩶜MeiHu^j4K;J qn&+Ax+^IY`vT(pUS O%>KV"MaPS0*Y)mE5P M5Ж}2;)jMЃJuӲT wifo{GqEw&QP"h`6x֙%入q/%'0U(Lގ|(7z72A!hn^ -f.ϜnK >S'Z$b$W%aAr @wQan9E 7V8#he;3&{G Bm880\\ 8dī\XF.hUF0@)]_lz%0V -boW=1DG"YFen`UY{K%J -2-)`X4KP?,PˌHMblE26t/f./MD.lm3+K3#$<= W1OZHmpTb"+a.2 ur+z$j)p#DEX7XicL&厒<^]J-'*7irkAKE =]H66J@&`w+8a0̭\ iTƩC{ *Q Pw<45&H.k<[Lf׍\eV a2P ^ P0#0#Jh~ЍH%9Yqԯ *3t9DꬨlhcîzicBu{(hi@[WF7y&tDhm`ONW a: .Xɍ;! -v`MBVHvh41ΖKƦ¡63982aJ4O.kbIF)v })lِ.D#s-Tg+]U6khF(%ھVX[)8;0/PPo)z ˗>Ey{oe2N+߶(ƈ}`@ܞho%֥*쒟'k=hH"ɒIؿh#߅Cm+J$KJ -MFѕ-m 2ͪsߖ/ ~d(B 6{/i^[K@^ô(P3mAqk*>ڗSW5DJR?mX5|\[8(HݝuXI`?&m[BPf.XۮS? 6HX4:&q2MS[JӉd#8Q6Ҷ,oVWwh}6 ߄ֵz2Ty">}P`k$|+(PJd>ЗVcNkhdywUn+1yxJ B0GO쏹eldi_ 9jfRB)M4XkRa'@xa nLThn5)Yp"R)jc*]ØNCPu3.[MļiSm9Ҧ 㴩+CL+mOC l@KD -$ @@xަ5!}ᶮ3*U@Pw \b/e0@K*\4^4ΛJ(Kt^Hk{xq >V}Ϸѽl7H(F_+41FT,8qǻ&qip,)b rF'29䩴0.0:b%@MނNn[KI@f+^A";K\<9k66ma cAplW3yXep ~%TB$ElOP.44.q*>AOP`ѧ0@(Zq1p#U Z$Jԁ m>DwQh 4O`@Vu&,KYlQKON!Fwh^S-PJ@7DJ˭b̆rT U1{;H#BbOxK&#QaDfܨg$-7VZE v -0.Rδ-T2/1ޮ@jC|+H>lkzgK4Gw*$`viCNg qgwh0iQ>rmUcS1TNi`fm@BeQhY -l@4E3HD7N2U"GMs +390SdN<#!F;.:^%ҝIq s/Łřfyrs~|J%CiXq%-D6c1+@]UN8o!w6z{v,"P=}) >H:_x( PxSUygRiP ]Xj)㸸0APϾJ49l/5ͺ&eŖGd6"bu:Er ^#9:S(44NIO{t+*$mTh`DJ+(yc32) vtf 2apoSQE{KQDڛh} -GNU4\؊C x`]!Sb -0sų{rQ63Ŗ ׸Jo ,eiAfk̯Q,jʍOm&9̺4a6F nѼLva ΛB3m -}3c#lӘE2+De\ RlIvVaDmxhhYSGyhB 30֣yұJD79Xܸh6ʹq }BdBm3v}&Zs]h -i9фRCA̽ j\5M#XCEDV|r w 6%xKN' @]Sh|Th ޼xeFܮĎ:չsEuҎ]AO0}SAW"dxUmm`@+ND5ӥ:Z\لt>jnB(.g!CL%{ B rc@)if,w 44aĂM+J9M;}c0:*@+Mc7?Q!8(}&xRV&`2~ glD8),@܇hh5% 'A2 TvE)E6 -l+K;NH{ߨq˖%)/'s1$`< Jqj+e|pO&_39\ZHYU~Y`o4V km*S)L&MՆql34yaMq iY*deu;MEZD3!4T*&BƩ0+ykJ9٢Ëi_`zb~xQK*k.bJm4Bdk2 -^"u{Cr2,*="p -T%z"쨩qv_cVXݾr銄`Eռe+1kB&ѠuΎT hM `x:T4RY.<.GN%Zu-'ö}(]1d—2(I(az W3fT4uOĕ p.tKRl ?1 cBM>)q2.sm)ꂘR# V:XGVS${B.h2T5tuq7!NxGN- tjO3BKՅ\Z%#dPz[T1Krc]?W7ˠc#d`*Wy[ShBZ(˞B+@ql bZʽ/JsdAG &|W]Fo.Eq,h"/JTJ< aZ$ 0*XJԢVt1LO;MK/ȲB:DlDžKօ:Kp >! E,P;h M]kd0Ͳ`"r6oF,0f2l0MDbb^IvB/h 3p`Rt0J'̪sJ`6yl\21#jIna-^m@ۤt.[l -C19?{9]1-NTmxvv a!v@*ԑO%;07V7PF=k=v J"[].^TXd-85Zq+fgCg,eEohRY,BpCU> ʍwҬPc -D8H?t4k_< XxyƜ)b'>  $Q{xDƠ2A;4Q!w -\d -#ϙmUf4–dY3bc)$ٻi8MT*e6',qY:V+M aφq754ʹUk~w5rvDw)]KJ&h@oUkP3u$A23ƻ4 O}z/]A/_a1HʶRJGSxeY 3q0 wd:$[~@yUM:'Ld 8+sc` G~W8Sg`%*reFm1dyWZB\],/JEFZWxzs7D?JBnxBm%˺6cc -Xbg/g:TlXޕovd)*Tܧ:6!7m9ULm 05kh ZS6̤)W\-xGFfWOb 4uF-%|h:"I}qx~6Y}%xR z1^P RTW~Ӊ]Lt@~(7XCT0,sQ6.cWmdBFa.XdX -.hQEss0 .U+#VY/]2^K0Ia Pe|; Ճ*&2BbhSaݩ) io¯7p2fh4[7W+Ic2(P,Q8(6/t< -b kQž,L8 -$£1uumȷpU -"E2nPIѴЗ -W8Lڦԣs@ب#AF {jXmDl3.e-8 -pxQk' q}. X֐82NwFiج<%z@PINorѿ8y1Poz;;Pn ˻NX s?-1k"`R#5QTRE>iHe?+W}/($/x{XLAKD_!ᾁ3}:c݅K;LJuemEu9kqKQJw #XZWw[Ax- -bEV B5KǙ꺑{- -3xLW - 1/)-RKSax>Oo}aّT *es_Gxg&XQ Wˏ0C/pykxaރX1BZaJSd1d'ϸV =8vwl?l؛C?c .@/.buC\2 iq1քmhM9fMɺgQ>Pa G{sa7G (&Y6gF-o;Ll@gxrBiR*TjV*T%3y`$-=,wäJ zT./uRtc|G+1obi@},2QilEAg+͔n }fg -.ꤢN7PCe ۳}"h/kW*.0>n[~,GgեiSf T&VhJ.踂" -4 @&ZR.T<* -7gvUd([n]*< -FW8rwKZ0V -oZI9M?®7X9ť%kRiZW~՚ _n&{뢂ГGf-g|chZArhc%GK}b"p hJŇE*L.>i`<\AJ2qʁm͆"]"Y6n*n!"\./pYɕ{:79[-%nY{)m' Rcfa3ۃ (.#fe>Nĕ-+Wsv,0JgnKG|P=D+z=s: oZ{'[{(쳭Ic<]"e*G:q2`#ߴ -@4MkQ f]5N =O|,7 dAMWKl~Ejl 4V7n[ʿÌ&R1Ḑf(0!M '߿[dzMzX0mo?v-wdHDIZ)5moy+ﰣlrާ¥]K`ۯى҃z w. [+Aݬ.5)_.1HmV_˸A 3.gK'6L.O|}`472;'Fۭ2De+ؑ](  kD,_ӯ -Q԰}o>F -ͫUtϴFAqѨ 5v3ǝJbA]^wTFϠEXZ p \.@VKe-^\ I͇6[bGoGd#USjW [B]76yC*-0 Y!t -\3+h'$zZnR6?߅§p*# - "9/B@^[/{Wl@ dY6Х%SvGzWD*{-%As8[틞Rac RJ^HTJ5ySh!f]l@ƫV`TmU:(6O:XcCNUnT;a ьwʢ3c1,#~:> AeXC7Xc»dl-?}te7RU:ۍӦ 8נ -Dp-VE 2 irKp`xQuv!X ?ǭWw܈%J eDt+o[|d""H;ZT{KS )&!zu?8,yuu 0KICpOE'.%}~lE{Jg'AKlwLW^ qJmYnyԎʙ" moEIZ],PØ -kVwmVaJMޣsq7:NB* #.~!4<M6*мwaz:9ÙJ)Z"P0+~/]ҀAWytg K`XHdpw!.;opJ0V^mjcBs$?>)RDB1On*|lc qd {>m nQ%M!MqՄhRBp4X۫?fU&fLrƣdN ̘<ݍO_eRbf:پ b-ܳA[2`؎zfT8D{No`ztZI! !]ZשEm[ ,gzF^kR84G7Hy/r`0ۘ mc8."UR}D$Ek# -.)c]ğ#g,݋/@6;A€D\1Ƶ*(5\\s챂.gDbPzٴ`фU2ʝ>TsZmC$ݽ'#j-ױ^a^c߈+SR:;[֏OL?г+i-ԃ𯸁τ4Wʛ.ZhDy 08SeaqW]8B "qGB:OַH&GZ\!c~==J䥀-w3(oaUqTz/l; ʋ&Ø(PĿP/%:0r#9`ISǙ$H_WǦ*OJ$`8Vl1DGD`,\#_Ŀ͎^ӳ78 M=TYi#GNv)fP:E u4c -퍼vsѳZHX _t迣_}!d;FLns?,CKf쏉P\!P:-\J(.Zy$'k3*-bt(JQUӑDV-EzaO 쌡*n"9H)]ͮj<=׭HCbBKdrbYni#NŁ/[tPKWD8ECJ϶nSpnmYg<[iE"Q2J^E[DUzvTUdSb*E6ȣ[Wn(砀:;9%3SE*T>uG4҅ezBx_E]~ͼ4u$ۧɷ:W]of~Oa䡸UKx~MԄ=GQX. oAb#!7Şd_Aߜz`fN6>dyٴE7P]*cJŎ]޸Gn|D hu}E`ZL9u1 -Fgxgځ|4 q{.0,$jDuhuB:1ƯΊ،`v$`+.<H;ڳ?Nלr)6gZ08H;F?(ᔢ*7Dpae9q=ݳY1D"/^+'⠷hL俭D\UW֩rN)n*FAdQf:p,u^FP*^$'a lRm~%Dw7VJE3: p?4b-X9wh@?HzS{a W7N +9uх-DLvK -#SusnP^&Dsg׋ -|7u܂,0+5t]L { *EWWdzCM4; ]gPi#HZKvOHNL:2Pwcͳr>5X2oG B0xT} 乙 -"Lܤ.\ngPX_Z:2鄭0^(KޘjE@Oց@}$bd]ݔۊGW6V(Vc8`NJ]#]e h!lR uu%_`PLtieklc/Jlx:)u~Q(ȏ ._գV6oIdcvehK!V2L%& %mzAWS-ņɒ>d,%[褺%-X]Pe,> ?e<~Qܻ {ĩCR2ʕGyi(VV ?DGGQoyl#>H0cB,[֪˗7cIp ͠"J*T\nD6}t!rgpF ~ʛC9E w 07-ʗ ,͌0,'22JĴH7/וJhĔ\3?!Kk2:l*Qޛ.\IB +;%4\ٍ$)S)A\D`we`)[~BSV᠋FVj}joe(e9V}3r~o,yzB:%?2oL=P-R|aIۜˌ̏wQ1jeQ0E937&BSc -ZGyPjSu-NYd+v{ڏFnYtJcv&MŴ=Fw2]llP)φsάLKkCxzYz,/?Cɗw÷*{b2+nrrA/?vYcJS7=|3Nøhhmp6ߙ_nC&M>$Il=#/vqւQt w9bet4 د y }ⴳgftR-T"O ] MņN&7׳Jc¦O.f}Nnό %1~E}f^8"IbлdV.)m>5IjMXZWX\MCpSM>h_b?fcC~&ē|STd1T8_)p.}|}lm\N-f]oݏX.VLM:\g˘4 lgTC1;O9缽w]cnw: 6'M0oR[W&)axt'gTXfn J]uPo> ???>`ԊΩfxq)e ~AJtsN?ǫ7n e~;} m3/i9_y$G/C[KpG2dʝʞb_o% +鐑2@!m|@B~p}a2 &Z3STޏ8\9?Ώ™?˼_>in׿݈y#?{C{a܈+XPv!͓gǒ}t?lM_|㮇ݍ9؞`q_W$IȺiygE"YiI:s5vY0>0/МK -92f0r}_y+%wrcc3 lm8X<=v&w[f}(֕^YNii]TB|x1k >C{c%ʙ^՘_2yʿve|'~ҙ^ÿ&nK»%W -J='o,wp0˳{EdBVWӂre\,~ /;+[Pq.˖I:3 BosVu:Nz sfkwr!CM.\[C|׳ ~8?}ur{s zSޑ4%m(d:7Dzfx c/G霽__pƽ)ޕp =w=ؿ6ߢ{-ٳ,NۭJy{p 9J) Qug&C'Q(]6_qfH4!snl;8?Kև$hASݘz? gzEOƋ/^XyBߓc1a*ӿߘ泇S=&ߩBBۯ(:y9Z_֙zi M׾`A#1u>+օ -<â]'D[.Eoʯ?#8@^0Iuԝcr,{(ȥc&EiO{n$%]iw(a޿Hu.&" /"P_}jۿ݆_2菍.fW6^ -nd&Ł';v?4k!ܡ7ތOt땅]OœqwԖF'"4ãi=/<z^lq]NMF*u1nR_8{>&_uTP!iW+]KϠfҥJԯ߾sX?]x|m. MkBGyY〭 #g)=o?*ƾiʰ -/fix咐w^߾BS$Ɲ &>׊o_[J|~PIAۢ hP?,D{ yN>T>))7\xS5IzXK3O=ϾCnڃ:nj?<_Q #wr>U?R˘م{e)z[Lߌx.`q9S8s?R`ަXޓ_WBng|)k˿֍wSuRu ̢d\~_TU%^#jMJ!ӣ2~YsxN(bD 㮏SKO󿼌{$@}7C%XwT!9,VC.Ŀ̢Go?5t0?nj>2ģu?9ulykw9);IE&,vˎ*+ęT w{?)='Nq(᱅Xca0ܴBI9|e tL(T؞ˠQW~ -˩] rxCwߢ5pI+ '"Ǡ2 -c`\k9~_u+] /.~ 7뒝SN-fێfgU%x')4>q/F?ǔʋӑ q/<+ hNVvZ =(2p*Dd`1Ɯ X`RÅ_uu%c I*@7 %:TZMDۏ^*([ "C;e`6}â?ICA;C_g懶s=ۙfY54,N4Wkl/DZ?~J X {|O#h 7fsK>6.FS9x@fq GUq2\'^iCJtF]Jj j69'mW96RN4h=)]M12 T F6%HZz2"?;" L5=p\ӎ.[cf>LS:]_d?@4˵̯NqN-S1HaH5a}' }JZ,׉P103Ŕs >bϙiRa6RB -XRSp=%f`ԩ|ԮނZݛ-M򔤋6 ",qLM6w簲QwkYy.S1X^^ՉA["u ӝ ^< 47%#8[X@V{ňV2)1nH^"F̣lk 1Ecp\.SīT(ni1N5x+̷0~7/͝}`cnjw1?ٍ Ɣ0s64B*k#CK+;q{WcG8&ʜƧCa>Ot>3+g^4*a/F:4+Mocb⚈KU}O7Bށjht4nY/CMOp30E1IoF j\LA[ D^'iK!(ݙdXF*kœa.ʗӖTSE -U\q/9-ѐCu fٗTrb/5rK$6kl<4Tr08=2B30Ǎu3~W\ݜ3Z+܂Fk0!׏7G;Tsq/R=KRm=) _b40Bb *2VdR5Y[5S\| ߈A^ $M%+j+ΘRR Ppe޽na2"]ׁl4L4Zŭׂ0dH,tuWBo%Hwq&mT rfG&z3oğ3h~RԷJ~\:"`\^f?g78qHB_8 9PD^2\-co (G:b6FtpqrMg}On"MM^F쭠7dJ#Hy;BTĨu[W#+Z*6gªZʅ! -Ux'd˙ǽ D7 )" x]'`1ț[lSpcG,ogR'ǼvHh1<~6]5ćV!oS\i)r 0A'i Csv#墠%L]{AD|3u_ZnE}JPl! Pڹ9'=Lˇ¥f&ʁZu4vtzr?uI8v}[Z!!*IQ[[&OlhiQ\t۟xQ0\5'zAc.^c.g^+p2K.3E.uB/| @.r7;CWFYpa2NtA˗źΙaS+AbM儸ӨM1trxshF GsmVnʘB\fXks4B'X/2P4ܼo ψ0xok+;i!庎ޒhm -Ϗhzc UN|uR5tfG3-B+2Ѓ]/ 6XkSBq)07| aR+V>a@Zԙ3*T5>2J[ZXt7 K'|Opd ءȯSٞjUZ<-c%Oy c˂_EPuP{z Fˇ)p%]S$%:֕?Lm)Jя.1֦YCB_?A.,,X*:Ix>ŁaۭoSr=Q!B{T;\ njWTFA|?+V"am2+47פg%JҼG i[(AyF|x˥3s.q/pTNRZ=tLFTr^t?hUՓ2fck텏X+8w%1[H B8"Qd$nRJ^ BA4> -9QE!szf4/N<fozT˂ћB:o 9MI q>D."dDۨQT*`긕Y (` -hn NV` ޶/)Jh(c/YnZe(Oc`0{. RKt RY8ЗWRdI&b;iP*$"Y3zwK7}zҥBbTey%\Cm -ef7uU;h\bio_PŐhk%cKlC"[M (m|#VVVaьiF &Ib;AMw&hyu9C\˯OOBIR ?C hDP7:PTRo5DZպ;,1Z IPz!`(KT6;$n^ cREtة'FLʌ-Z1 -2z%A*#W{abЄn ?ir Cd;bc4JJS/z9tSRM"d +3^!zĩHձ%PB<őy}3dXf(\7>*m,s i!W0MsT@**wbL%j*0qx+h0zma&6s7QúB2Gw3}c󥽙ښA\NvBdAgg8چ ~a_7*Hi.DIkR.-TYb[' :H"Ľ"vdQ*q7`C-lkz\4` @|v݅p-mҮ՘0ȯ I/~^s5:7h-2[Z嬍S1nQj:cyI8(&a,a?T)&C0ain 'sSDW0 32ցv"e44af8tS%Ma.&Ɔ9Ҡgʎ˃#9*q \h]MH.L^q D^qQa]-2z,l-|d6?9R"۽ԭPt%0w7vC#РnMu߭'yV hQXz)GX 0Jŷ(iXL/0pJtlN5 05 nῃ mԽPCRLnRV%cZfx-#IyLd _)i hUPhN!)*U;>p!Tw;5`0 -[qN%dw. b#U=HP.8e@hl" w@ieg$5t #:oA:7VJPȍ h\ɡQ`W9(:\;֚`@=`PCHPE="Z ٰtl B.5@Q#> ӄQGx4NwPA wB1s K/::B;K?(=SV^l/|20Z#ntЁVLLOR!.twXgPR8ؑMUҴo4/-4hp;K$siP5/0h؃v -%UzuPrIesᗞjUhDL5o0JӆTM LbҠo L4˖ډ> 6t4C#\XF;NFvHw؋K{XPaF>MVU@UQ:$"+~6>QC9GD Z3&L f#H>+QLkՉY}odbJ tsvnbFy2R>TD2)TxʝkPRV`@/N]EĶ_#™RB!b@+-s"4+G&Uc#at4#7z߹v}t^Hf+|I?0(轚fRe7V - -@>Bl Bx\_P e,*seݽƀ~߁^īt -]GB -ч2kZk|YԚ/ZZ8&_GDa2"6:'e{aYKb>'q#!l,Gc >CA~+ :$D]LliJ@Q-'{91*e꓂%&'bu h=B A?R~R~܄*`U>W -+\)Rv %iZ1Zto6@`FT Pj L[*9X0O`.y)aRՈO7Ԯ>7 @ K*-ːS|ALl§Sƨ*S?FZ:oj%nǻ17"'1|6=?Jd}%&̺h˽F[3}w|I_1VQ&B].Js%0P4iY^3m:aƕ*i¥QcSL.u0($.cKɡo(B~+C^>xUiP> -vpYn #{=DdgLitӰi ds%xd!o3qd1Ӑc;x(_HzZq>9SB?U+SfTV&MnoT`4^o/2˗\2mxV|7SE5i~B`8otܮ\Ef;/CddP.`z=Y:؄Ԇ1ÙS1+ خXJ!lsuh6 >}//:Y7ND]eI̙Y5X2OJe\=A7;9*s\nP$s7CsRd Nu4"RVCKcvG$ A NXCEuVt+Box1Nc. З,<._72gޤdzf(v~b: 28?i*=JiINP&[[[(2?7{x'cNb[ӉԩPTH$(^uyѦbĺX40ĕlkyf\4hu%bA. cV= P3fMYlTdcX+^, -fn&AJЃS3RFeu,n$֕ -Vlҵ>*UT9m7Ս #GMjsGԹR.!/Z˲fY.᭕ -+ -$0L>NzAT &;r8wp@ 6](vBЏ޹c0cN@VcUB>}Q3@*4IZV4Z7F?t0cǍ+:TCϯ6v8磂`[uTeXb-ED2 _P1K1C֙x}C"?FL.zcBeDITa3Q.C8x#a3P%xtt@ :}:ӯ -S`(c闾n:.\?+f }[_|:ȓKa{B[K/B-L)tX)܀jTEk_`+=ƄtY0U 7Z0~Z6hÍq+XϴFuAL*)2@%Aڜ${SlT`T{;HIݽ-$3 ;ap\YU]L-w 8_D#h,]e'>Avfj -Wog?Yt.U3A PYCdII )IBr: 0| 461 aXWY^:mᛓ&R(dBK`\iƆP4С157#F2n,Oi0۹'vڀWqETg(RktHjl1w#<.T,&@||`\%hbVΊ̨xmt̶ .\d%Bu::ի1ok,%ɌJĨ9ҫ:77/Qї*sNe83a!j;_D~yPrd̢_Q]щu0#f`Ƈ6 x/ZhjoL:]4dkƸPZp.캥&0tP)|S PR^RJqya[D(6%8) -!k1V.ZÝH -0qhy\yTZM*TL߁2Mnq#%^wFLo?&R=Bfuva\.$#t$< #6~l}}ECB>S=>P5(@!VgVs 6JqZHLW%cJMѠ)vFgWiNu^!5aZarem/KĖV";cgF?$60 gfP}s!1}!{pOW~ ¡ "J2G()t 9¢2^c-?@W{:$ uxlx44.!' -4leȌ7uYkcd.g/D9tVpU -[ v45uVE^8[+}G p6ŁF/iU5aRD# k2GĬ8#vB'14!MBq@e0iYZyqZ7*Dnm%B Ay%CRB bMg]3V,W[_:{/qH̺,Wq'_hg؇Ss yaJo ab x)7!e7˂ه-3rH e.l&Bl!R'!: }A^%z#eWc~A*2tDdC}`EwJ΁9BD>0(ц&z[AEo|Qb)gDDIE,}p-UxQඨaH7tƵ -Kahbls+AAs7q %@(BQw%U\.s !krywtH%NɥGfa( g"D<3K?^29#p|E"?n&77)vABP#}4̥`CYR|}NlĩROoטma *C]A~ 7!W1`ַ/LR8~}I@xlyj1c -b8,Х[$xWG<0xL4ClbbɡhD#F|*x ]uaCĭ%ѽ],yHd+׸%@ozEOU])̭W.`h2Ko9b z8VH^hM %gD P<.+@v2$rYvyDs7 jn$E8 8{Tpapwci ϤfL$E~5 j e2Yb212\XOxxqzޢlYM2pZ^ ظ7Gx$}lB>!9BPK=̕C@ --Vm2zu%.\VY/E.<^xs㊕0Z<3Px$ R -jiUr`''x|yA+tfT -r]fdjr N]pm uAi+BՁ6#J6G#{ڔY]aiAkE;Y d,ow/H5l{{W}B(K HEn $A . JSV'TMaF̢L -E1AT$H[d!"7 lü̱AI79R9ͭ(9x88{C_8(GĔ=)ܫ+,΃el΋ds7c9V0)%y;$CdM-}ޜcXn[~tEe0Vvա/1Z- 0i'ܼ^ܼ! h k1+He7|ư5 &hh4\N4'>өZTMBVexr奥^:D[-v#--8wK,s+0pp$.(h +J]O_Կt,2 rc&1_AϞ s4a݇[⿰<ҙ_BjWaq '>֯;`1e˲\g0q.^ epe˖Tbqa7*mW.8 -AFyIE}1 ]QdUw:tW{++FVFTdo -hʁLxN4VJQq!HGJv$flZ srXK4 RE1Zv# ;7Ln * -Ha# -Ӏ[8 s *)9>y}7^nJ*m~}3>74taɴB:QǍ-m_qGK ӆs?=騟 Mv9^V려XSu5b=U<ńݑ(t@u*Ҩ[ -Ѕp<(B% eVZt7Pv7n_GiǙWc 4R\xS܆J B5V_ ;!Q( -lC{B%aH@x(aZ6Z80u܁j%̞-4UjLA雋7]bs羵F:sC} iF3~}D:^-;@.&6qoR@f bc7 JpoL,/4-kG3Ph-ٺA$ J׏1PJ.vSxAibAjxV#Ui-z"Ŭ&O55/BY1I;ec r,\)@A2n\V5w*cGx2Ov4{ho$&x@p+ߦ}+#"!8c[/jm2^.4mҹ16Kf]>b%77kX $lE N9_F;C*xga6{*./D,MdDV*Vx^H"ZZF)+ ` 1Fx/7[Cе14pjt@7u$ >1@ cfN#cPh۶]b` -2% ǻ $ -Igb69T3Qq_P`d{"W If8kZD,8z˸5(j酈pNd`Ȩ.͛"&r0˨pTHM2bXu?SQfO˗.\LWhoi*,%bGDq6\e'(60ܵ1WLO+ma nQVT\4FVP9څ+m}nṘo6;WJ41rELu&t1F6#VE! Nnoz S L{2)͊ܫ`*K.De$B1R(YzD,NTBal 2ZJQŎǎM568.E vW3v|#xOɫ/5>Z-%NuP#|kJЩRҡ˗, jTrڐk 1^+9b@YM)P{S%܈q O.4kVIh2g9ץ?z$[eYXPs: >Ye$(ñ%Uǩ[$N- j0Cxu\C%54p&NA`D`Dd-L M-W8jUWbKrk$c ]x7}Jӈy02'ֵt]+JqA,F*l+j0j2*V'8BGuO&;v!)݅*}RYF-W;"̄քi"CnҊ@ZG}m*G ^7xZ¥ք5#vz/$W"\&Aj[-kw刪6w -x%q8 Ԭ&$PܨbR߀>jH{LidK-۔_we_m @ȭp*%F!pg?Dxe w`4@C6&Nb2 RpޝD!UMy<8ә΁hhxlNc3SJK`b`eJvV*d֑5{`[OS=_f:Xo.\M>ėvXbsVlm1i.7} 폻WQB.1!iQ܋9~AUoqqH9ܗSŁ t9t V *6hFUCGJDžQ! DqIF)le"$B ^k( RbЩecg_aعwxsUt}-X„*8 Np/ Wf@q쇁JV24:orlSiF B2F9O(3$nD[$DWl?q'! jV|i9֣ - -ta<׊-d+}۱^d$F,)6UG#-i%o(6/0 *Ȱ)1+S)wJLExJ1)A4KZFn -ypk&l[Τ5<. -RH8 X}2I8R$o`[܋L \l6b# {łݖ P%} B&*VoxsGW^uƕ*TBRSԃC|ohEmgTgYEŴ `Bڿ^<}gGC#Uf4l؄Hp[ Afڈ  ctg'(I[S~XoP+¥J+T)Fםsn_IRfVQzCGix*6^qFv[\78x$C'FfDwX$Th#(V$j&5 BpԿZVQ%iZso*:0a*jTDLb-ޥt'}֌hF>bS`ԥtCi -7X&LqAl" 0ʃ% DJX&Rrmg"Ѐ45ʕ]9>8 ZTĿv>  jESĥi^9.5u3SE ٻJ ' -RiQ5j$2q33qZ*FQ3mA(7ٻQs1Ws6Ms.ӡF "Mtm4eiQhd>5 -JI|9rVRb 0G͌?Zb3 NȪ$n 8 &t44sa E. WGOSDnV7-e#?^W;tj}z'HeSU{'d@lD5*82[T-"t(Hint4w -آ+CNhTQ4pyu)4V'ěM4 -JLT2_X`a=; UhHƵɅE=lC!"0 B.B_27c9B LK&j,cM1::gֵubNew+v|JͥT3^%4$%.Y6Y)Q*"%;;3hy#\Gg[!<6?*]`SE-`. r^Ūqnr>xs;j+Fq8ShԯOD.2;Bq)G)P7u+yQ2 -l[oj3/Rp}'SGhZIU*mK;sxi8։^D!CrqWn^7"x3}JnrBpZTmqԕqMLJU*7I֥^\I^8΅2'ZkF 3S0%T:ƅh&TZb:3x^>t̬GmBn2۲$`:7+, ƕq+ƕ,%cGB5$0q.Z붷.ʶE,aAӽoF 5Qh PaAقm#?lx/b,w4`f:^3%Jc5{>zӭ,3;өXƔ' Lهl~- 1؁+FdB! c>Tns3mlD(ԛGD]MqO>b ]8r7U}*:B)bH.#3s'Cn[V&_w:`& QծE __F{ 7P4[Z΁ގ,+`fv;8=Ixl̀a(r]Ǜ8+ZH%%E Q@3a.͸,ȗm7t7׍/(&<ߴ{9:2m eRu/Brj chKBc;r*VcrX7@nՖ;+TJulCW,d8ؐoιw ̘ iޕ+! lsxV45ݘSX|$@Xͤ -.тƟ,+AOp@mzB^r -.x) g_bl>4z,6r1Ccs^8bSנ6Tخ;S3 4Pa"FϜ~@^0vedZ2VSJxPSy0AMӅ .dbscz' &>s~!lK`bjHQRd?*-tW*Q Q s8g IRn!jlʪ -gEnoj:/V:hŐ=A|r0r.>8Xюk*RUqz>L[|)f 13_қIޠIk!4ӝ0(YET56 siצhg<^py%r?moWIR` tZTx*{jnBo-%JtM Z^;S$LbGdj\!(8F]oL&XZ#{j(2uLJxfE5ƥZ6SZmԗg:/D!w -;A! 6G~ _6b4=0 -7Nĥ/r_P;DhA\p|/)t05ŭ4T_k$[ -.;odڇ!!jU  -źۼq};"ԟjԁgq-$zK\WЌT'hoكD0xj˽93=y/8 - B;`}Bl0)k4p}4GbG*iSaQbt ~ylMBgfO`qI¿IUo&”-U,|';^;Xh=?ņښu J>Ȱ>SopЭe;asyETORBBe$@ -@.[~2qBo46ʹFYtH -"hXxS+:/QRe)] -mU2'fDTG6Kf"cL>?3nTwLo*s hNfE,oBfhjy.`! 6e˃.tG: Ɗ耉`ҥNjQqMjMdQ. -3Y"v0@^W~w(2U˻ -'j,s|>Cvp_%mi,nZwCh0\/@˵N̻VI3΋ H iԕ1KDKth.o%3%^S> FMRh_lj0BY|y_*:U9{`4w,+xRJ)j]`1T4 -_,,խ@`'.8 E5G]̴$# -`EwHV`aW jĥLi -7އ{ֺT |/Ԃ&/C+%z`ӎ zH 2P čcD(.߀ϸ*ڴw ^fTCEQ6]֤<̢=B.ZmcBx̾o pevC9@X7?|a_'iLi>hni??:TJsqŴSU.: X3.^i:T3ƕË{7k3y ֮Q3mIxQ3Ef6%/`Wk`,tV(q\s%tAL292EYq_Ж⊈\RЕv4MxmݰgAѓ1tGibU9/ZoJEM{\ڶ:B뵅vބ+-*Vwr k*"/AW#E,HLPL,PdZhN4#*phJ"GfD3'+C`+3$Q,L (wn@,M{VQ[VLʕr`qo(U QW.z0:DnTvІ|y ,hdGzj% 4}' DJq`ߘA6cˈBU"vA/xǀ HEVjheXb$hD5f.eS\ߑ$V_I7d6#/IS(Jm2drHAkRg2tp %hGB:΃.cG£Rǁ•E\ùѿ+3"/n7) Cvc^!J=LhB>[KPPܣmGw8ÓxU/|K2o{-VD&% Z85r1'::IP-[8> '֛T(*VS$)K_l6)BOM4s -ȝ%JTJ*VR'lޕ|ĎЄT ֜j@\AlVgzv;j`*$xv6eLp@A`  -#kxK+eC& -Ht; + lsW!`K>iJ+^O&*TRbUjN8"]+{3~[נwLLh[RIwV _^)@D`mN!ĪIL* 8ƸAق EzX,#D +xA򬛰 mK8nmƷ \JINj k R թ?bًȢto7zḤk_W2=Qy?J% -O{ A]#~@ `hݦ|ݞu'?I(v%uu-3*(6^-h^/* ņ&73m)<2290y\/![s"ҹ`"V¯o w%%,\ fg4:=LShMYbmQ&)d1H"{Cd@v N%¼TF#  L㕍`nd̰S_A)K0~KѕT' ~j8X)& _i-W;F1.Ε l;jʖOeЕ.ȉyq0/]K>H@ˢVB2s};J4 >?sa{܈;=L@r;_lECt=62U`>Z"I:!F wWdXS!BWy[wM%f_Jd*c ᝺t]=|ܿ&PYLpB6W !UA -A#ݢ,Z -@š] +JF*VPY=H&XF - *Y>em Z Fߤ#h_ -H\Lm-יƣyׁp*&6^F;Vq;fr -"s:2꬧_ ^J+ЄsC̑0OA(k^X,EFV* - -e=PhOabF!G&KpU8Wf~I2oJؠp.PU B(U 6cgʢBX+T{\TĻU*סYP'b{c\Fՙ`;ƂZ*^t4<b!s/@1=GÍLB:}JNtN| @R߰c ז]+j 3E9Rq 7/)kB ajjV3.\n*{p]A2q7^]cmپ0 T01 YǤ*QPL e wBH; F}0Y1ذN(RL[gAQKW"/f_ {u0{}̯#{Xlu3k1 slœT{0n+\'3uλ" bp -iCv{Ŀ& ͯt@H˂QC3i]>ȿ$- OOLHBLB|>19ЗXmɁYR3l)4uҷba%VD;A%q%=چ[ '3DRK ^&ݠͳmqm溍]9(Ti2I}*"* 0Xm&p/FxQT^s 4i Oڻ2#V[hU\me8th:(%A]"tYd*@CMs o 0nKX=qMls|.nZtF1s.3bnWb !2)Mx\uO u4R ɡ^A6#8bp?OcFKQ5!Ԃ?L`VƊC)N:2BAS>+u.f.<*CM<+mKZF:ltX T\эEЙ5N!#cbJ$56aڳFޫ0Aޑ_o˚OA A}:mkeߌ <k.UCܢ/⩿?WB%BANIkֱlD+Sc}52:RnWLؤq -t*Q5P1J"am-AE͈iВu84pl*#{"F -y/2[7{AMm\C}b0֥xQw P%U%)Y(&j$J7D$rJŇq"hþD ŗ*m]ܼCn 9PTjH >nPjB^灲v>?l (RK%{6TbXgo=8]h0r)tń}GRMMl᪽`Z0-otCz^Xnt0ymjEt  zg%_,z4_u_KKVTZ/cx-H7 p| J Q8  H Q-by+js Vꙉ)J@d:J B\M(ۨwUmR6i=MF1Ї-{#?}ŏی8vel)_rF݁ƈ-*A\sf)uIh!.]CqC1xd` VHK@C4aـ!YwvA-!!rNHiѼ (JţAkQcd ?P6م"&v㶁>NYuK ?56 Fb?t ^N9x%Fq^'PX~DRn;͘ +Q%IuIB~` dFDHi!H^':+iR*VJLJ+f5vAJ!I~>XV8s2WWDr˘XPGbic:iRUhjܔ6ܧ13 - lx :nĤ[zdx*#AAz%>v_0\&fb.AlrzvC-Q Jc@uk[Ic5F<ÉH`Q}0z1VVt`D|Z-®Uixс:0rҴvL:q-jF`71K>/0WQ:-pݬa%"t$P]@rLbQ$9,'R8%N_&.v-h2zwg4V!&GGV8oEJfҠY5)d"6AG8uӗd0_J "1 Aេ{$ƁL°gSV;bh3!+}iJZwFAyKTu1gtNas0qc݁w~#|LJwe˄J`.Avo`]:y,g0\M/%/iӧ0|>aHmP@kBi K ^+Ƙ Y<E[.0~(8I bTIMzX{|[OX!9ς|1˄|eB6 z9X٠r@%$T)kOTcnQKJ˽"PA8[f0-hV聅Z#hN̲Kԛts @ќf#8:_|GV0CDħ@<6MtA~P]ͥ6`s6>u>F&M5{x4ªfY@ ,v[ى;Z֢ c1ė1;.d dƊUj@m_;o+4>siSJ1ah;[Aj ze8 -|\@{QZGCdiT{uՁPgRB=@ #6 m_JhmYi $z^$ zhK6Kq`f/28m+RքN| ]Aay%r rk\P L)~DH`AY)ԛߠ\+́Zl@PTy$8Ѫ%\IP#fq2CBG@3ޛmi2c1l5r""L\CxBs8цJYP)%]8%@AE0҂h,;"Kg3xa;Kd_bB"!,7@,S@-6֕NecWzЬm3̶0f#SuSBsKaɽްʲVțlʉ3 R&LVa(,5 ]@T),L ]FA`mf*,hR2Ǚ{Gx,xZT<\< ҥif&%iƔJ3dĭ.8 +1YWP=bKlejIw_xFffgf\F -6L}ص7,Epvd3@/7_$bxYr*ؑPRZ2$Qd]V>e`B0<3z09Sm*nű]Y.s;s e2ۄn.mjㆺNbq«-=NUAi?YXdw|h%وmǥO*/7EHg  -X>zV͕”Y ejNe<`PCV1 ʶ VuiyfwSʕ(heCx7֤ܸwö-L_t; K9JX` TݧX}fMqDtb,r4'.QDU!XR[YKݵGҊQ6zƘ8Ii&:0C7x04n,C\ZUrROzD xo-[,j\ iXg\8ׯP}~Nl|~|*#zseA% -]z(HgӖ6~ljqqtnDC[]VHZ.T'Oi5gy.ֶnijP"Њ); ˜ˌ!FU#^xN7Ʒ¢ iT@?2jnb*[/!u9J;@hBЎ؊r(8+[i46gdnGP ) -@=BR1T L$,I,uS|)ZzF _솀㶨q`ۗe4D  0a](b̪+9ӈLeuAnحCN= -ށg=Y1֝{/ϔ;W+B-",>.+j3 Y (WgL*1aY|6GBAdbԲ^HikgŜ誁gEDЕ)qzsS -%@ڑ{ɏ=ŜN1qK?h+CyU Q*T{hXsu_1seR b(nj1~CLroc-qHNhzלdXqQYmc(F;H@d3h%0v -Ɉ@f~;YI?ہsOjkcxMMݟ;]tvq*V+@:@ފ+v0rT7 ԕRqk̸o%sDrT -x. -#Q=ۂlwHYa* "T]Yc;˳9%t}G*-K)"SN;"kH&"ܗ/GiƜ} HRB3m ! 2U:`|/bj3J%@ҠNbTRWɄ.l@ TeVFE ]GLmY. `"9]=q8l&H1:B. zK|˄!5o2E[ aNwi)Ƃmczdm$͒奥$im Gٞ - CǍ*'iHKa+ ԭoKІ.΋ a -Q45mY>$@AP 0`p!1Q?۫֨5TP9v‡pvovl*vOTt>>G7.+>^nG.Xh(ࢋ[AS0iqAGCQS0rQEVOZt -8P_.B(7]xQEUQX:qq#@ඹm[aqpƩ8g!6c^q0%b-1A;7+m}/T:]oL)v#EE1ޘ)ފGi0CEM0CEO1p47b*8϶O~x<#;fhff'p~AS05!5P .TQEE@"(EU^88dݝ |4 -z\ן ح %`7p,ǔ[QlLEPrTY!>HC}̞C11 bb~q 3 0$ P0@A!1`pQ?־x8?#/MZbsZ18w>:RQRZi;t㧊,{/`r oWd!GRElq>F0;2 x6> 먠 -^kQa<`>O!F0W{dYkыG1}mA { ,P{F{B a(V((hg' -L<ўWs̜qouy>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000009418 00000 n -0000256547 00000 n -0000256678 00000 n -0000256876 00000 n -trailer -<> -startxref -257013 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/43f8352e-6474-48bc-b418-5f11149e7328.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/43f8352e-6474-48bc-b418-5f11149e7328.pdf deleted file mode 100644 index 3143458..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/43f8352e-6474-48bc-b418-5f11149e7328.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/452f480c-c80f-4d32-8b23-04ed312ddd85.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/452f480c-c80f-4d32-8b23-04ed312ddd85.pdf deleted file mode 100644 index 9ffaf2f..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/452f480c-c80f-4d32-8b23-04ed312ddd85.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/491a0ea9-ac59-4e5c-ac9d-8f7296e94736.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/491a0ea9-ac59-4e5c-ac9d-8f7296e94736.pdf deleted file mode 100644 index 359b5f0..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/491a0ea9-ac59-4e5c-ac9d-8f7296e94736.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4af1ef5b-f523-4d5c-a3b4-43e3c7dad6d7.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4af1ef5b-f523-4d5c-a3b4-43e3c7dad6d7.pdf deleted file mode 100644 index 7e5107b..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4af1ef5b-f523-4d5c-a3b4-43e3c7dad6d7.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4c7f454b-6378-4018-a024-b65273f1a9fc.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4c7f454b-6378-4018-a024-b65273f1a9fc.pdf deleted file mode 100644 index eaf45b2..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4c7f454b-6378-4018-a024-b65273f1a9fc.pdf +++ /dev/null @@ -1,2292 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 0.0000 -792.0000 272.3976 0.0000 0.0000 792.0000 cm /Im0 Do Q q 0.1968 0.0000 0.0000 0.1968 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -51.6498 0 0 62.5 102.04 3416 Tm -(S:3/946 ) Tj -51.4479 0 0 68.7501 394.69 3783 Tm -(JD. ) Tj -31.8504 0 0 68.7501 493.66 3783 Tm -(CONSTANTA, ) Tj -27.5589 0 0 68.7501 711.87 3783 Tm -(MUN. ) Tj -33.0138 0 0 68.7501 810.65 3783 Tm -(CINSTANTA ) Tj -32.9481 0 0 61.25 495.39 3717 Tm -(STR. ) Tj -30.1366 0 0 61.25 597.78 3717 Tm -(ION ) Tj -29.0936 0 0 61.25 671.86 3717 Tm -(ROATA ) Tj -27.4226 0 0 61.25 791.11 3717 Tm -(NR. ) Tj -0 Tc -61.25 0 0 61.25 872.26 3717 Tm -(3 ) Tj --0.035 Tc -34.4765 0 0 75 336.83 3643 Tm -(BINE ) Tj -36.4966 0 0 75 446.92 3643 Tm -(ATI ) Tj -39.293 0 0 75 517.9 3643 Tm -(VENIT ) Tj -51.7261 0 0 75 635.62 3643 Tm -(IN ) Tj -32.9459 0 0 75 691.84 3643 Tm -(MAGAZINIL ) Tj -34.5853 0 0 75 890.83 3643 Tm -(BRICK ) Tj -0 Tc -75 0 0 75 1012.5 3643 Tm -(! ) Tj --0.035 Tc -39.287 0 0 76.2501 537.58 3566 Tm -(CIF: ) Tj -34.3531 0 0 76.2501 636.83 3566 Tm -(RO105C ) Tj -40.1204 0 0 76.2501 776.43 3566 Tm -(500 ) Tj -35.3476 0 0 58.75 514.83 3852 Tm -(FIVE-HOLDING ) Tj -39.0613 0 0 58.75 773.27 3852 Tm -(S.A. ) Tj -43.6198 0 0 63.75 65.68 3355 Tm -(IFRTIR:FCRIAN ) Tj -31.8791 0 0 63.75 378.92 3355 Tm -(VALENTIN ) Tj -28.7849 0 0 63.75 575.96 3355 Tm -(UNGUREANU ) Tj -45.9871 0 0 73.7501 67.77 3139 Tm -(RENT ) Tj -44.6869 0 0 73.7501 203.52 3139 Tm -(C.U.1L/ ) Tj -42.5802 0 0 73.7501 377.54 3139 Tm -(C.I.F.:RO187985 ) Tj -52.3975 0 0 81.2501 82.02 2991 Tm -(SCI ) Tj -38.0489 0 0 81.2501 181.77 2991 Tm -(ENA ) Tj -33.9928 0 0 81.2501 293.8 2991 Tm -(EKTRA ) Tj -37.9217 0 0 81.2501 401.54 2991 Tm -(35L ) Tj -37.8232 0 0 81.2501 480.46 2991 Tm -(506UC/SET ) Tj -39.345 0 0 81.2501 675.5 2991 Tm -(60 ) Tj -50.042 0 0 63.75 69.63 2927 Tm -(IF ) Tj -41.6405 0 0 63.75 128.55 2927 Tm -(022100121038102 ) Tj -41.6158 0 0 63.75 441.47 2927 Tm -(6422768920146 ) Tj -55.8447 0 0 72.5001 75.96 2855 Tm -(SCI ) Tj -25.3004 0 0 72.5001 184.9 2855 Tm -(WENA ) Tj -33.0485 0 0 72.5001 295.8 2855 Tm -(EXTRA ) Tj -38.587 0 0 72.5001 402.54 2855 Tm -(35L ) Tj -36.0959 0 0 72.5001 481.49 2855 Tm -(50BUC/SET ) Tj -39.345 0 0 72.5001 676.5 2855 Tm -(60 ) Tj -0 Tc -62.5 0 0 62.5 70.62 2787 Tm -(E ) Tj --0.035 Tc -41.7836 0 0 62.5 130.55 2787 Tm -(022100021033102 ) Tj -41.6158 0 0 62.5 442.47 2787 Tm -(6422768320146 ) Tj -61.8461 0 0 63.75 73.62 2716 Tm -(E" ) Tj -37.9 0 0 63.75 155.77 2716 Tm -(ESELA ) Tj -52.879 0 0 63.75 287.25 2716 Tm -(5. ) Tj -30.0507 0 0 63.75 352.78 2716 Tm -(INTERMAR ) Tj -39.0208 0 0 63.75 522.94 2716 Tm -(UZ83829791160 ) Tj -49.434 0 0 60 75.3 2652 Tm -(501 ) Tj -37.0445 0 0 60 155.55 2652 Tm -(33-1026660 ) Tj -34.1789 0 0 62.5 76.83 2578 Tm -(PAICOP ) Tj -32.5007 0 0 62.5 212.84 2578 Tm -(HARTIE ) Tj -29.6798 0 0 62.5 348.85 2578 Tm -(ROLLOX ) Tj -42.6911 0 0 62.5 484.5 2578 Tm -(100 ) Tj -0 Tc -62.5 0 0 62.5 562.69 2578 Tm -(M ) Tj --0.035 Tc -30.4536 0 0 62.5 601.67 2578 Tm -(CELULO ) Tj -53.0458 0 0 60 78.8 2510 Tm -(W93415 ) Tj -40.6337 0 0 60 272.76 2510 Tm -(E944568000289 ) Tj -34.7343 0 0 62.5 80.83 2440 Tm -(HFRTIE ) Tj -33.434 0 0 62.5 219.7 2440 Tm -(TGIENICA ) Tj -29.8144 0 0 62.5 389.86 2440 Tm -(PARFUMATA ) Tj -0 Tc -62.5 0 0 62.5 583.25 2440 Tm -(3 ) Tj --0.035 Tc -32.4177 0 0 62.5 621.4 2440 Tm -(STR ) Tj -0 Tc -62.5 0 0 62.5 698.69 2440 Tm -(M ) Tj --0.035 Tc -49.3321 0 0 60 81.93 2373 Tm -(U904619 ) Tj -48.7767 0 0 60 275.38 2373 Tm -(62276806594 ) Tj -41.2209 0 0 60 83.79 2304 Tm -(HRTIE ) Tj -36.0569 0 0 60 222.74 2304 Tm -(IG. ) Tj -30.6377 0 0 60 295.85 2304 Tm -(PRRFUNATA ) Tj -0 Tc -60 0 0 60 489.28 2304 Tm -(3 ) Tj --0.035 Tc -38.6087 0 0 60 527.28 2304 Tm -(SIR ) Tj -37.7141 0 0 60 604.82 2304 Tm -(PIERSI ) Tj -50.0912 0 0 58.75 84.75 2236 Tm -(R034620 ) Tj -43.0825 0 0 58.75 278.45 2236 Tm -(622768C66907 ) Tj -40.6456 0 0 75 86.84 2162 Tm -(WRUE ) Tj -38.2657 0 0 75 233.72 2162 Tm -(IGIENICA ) Tj -31.2628 0 0 75 404.85 2162 Tm -(PERFUMATA ) Tj -0 Tc -75 0 0 75 604.09 2162 Tm -(3 ) Tj --0.035 Tc -31.8388 0 0 75 624.41 2162 Tm -(STR ) Tj -0 Tc -75 0 0 75 700.83 2162 Tm -(A ) Tj --0.035 Tc -55.518 0 0 58.75 88.35 2102 Tm -(90I4318 ) Tj -38.8769 0 0 58.75 281.5 2102 Tm -(6-422768065987 ) Tj -34.1303 0 0 61.25 90.83 2035 Tm -(HFRTIE ) Tj -35.6349 0 0 61.25 228.74 2035 Tm -(IGIENICA ) Tj -29.8107 0 0 61.25 397.86 2035 Tm -(PARFUNATA ) Tj -0 Tc -61.25 0 0 61.25 587.26 2035 Tm -(3 ) Tj --0.035 Tc -31.8388 0 0 61.25 625.41 2035 Tm -(STR ) Tj -0 Tc -61.25 0 0 61.25 701.86 2035 Tm -(A ) Tj --0.035 Tc -34.8856 0 0 60 91.8 1974 Tm -(LER0D4318 ) Tj -41.0978 0 0 60 282.48 1974 Tm -(6-22768065987 ) Tj -34.7873 0 0 57.5 93.35 1907 Tm -(SLBTDTL ) Tj -47.157 0 0 70 67.58 1365 Tm -(TCE. ) Tj -33.0361 0 0 70 194.7 1365 Tm -(TUA ) Tj -53.2445 0 0 70 261.88 1365 Tm -(A-) Tj -33.696 0 0 70 338.82 1365 Tm -(19% ) Tj -0.0369 Tc -60 0 0 60 68.46 1299 Tm -(TC. ) Tj --0.035 Tc -27.9536 0 0 60 186.75 1299 Tm -(TVA ) Tj -26.2584 0 0 60 261.87 1299 Tm -(BON ) Tj -38.5607 0 0 76.2501 149.81 1226 Tm -(P02. ) Tj -46.7772 0 0 76.2501 243.77 1226 Tm -(RT. ) Tj -35.8104 0 0 76.2501 352.74 1226 Tm -(IN ) Tj -33.6224 0 0 76.2501 402.84 1226 Tm -(BON: ) Tj -0.05 Tc -68.9394 0 0 62.5 106.56 627 Tm -(247 ) Tj --0.035 Tc -43.7946 0 0 62.5 237.79 627 Tm -(BF:C99 ) Tj -51.204 0 0 60 108.04 420 Tm -(S:84700011006 ) Tj -47.6263 0 0 61.25 109.77 356 Tm -(PSER ) Tj -40.2626 0 0 61.25 240.59 356 Tm -(1: ) Tj -34.3271 0 0 55 560.63 836 Tm -(C3POS-CT3N8G7043 ) Tj -0 Tc -73.7501 0 0 73.7501 945.41 2937 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 73.7501 967.86 2937 Tm -(BUC ) Tj -0 Tc -73.7501 0 0 73.7501 1053.84 2937 Tm -(X ) Tj --0.035 Tc -47.1501 0 0 73.7501 1096.33 2937 Tm -(5.53-) Tj -45.3278 0 0 73.7501 1203.35 2937 Tm -(5.E1 ) Tj -0 Tc -70 0 0 70 947.54 2798 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 70 966.86 2798 Tm -(BUC ) Tj -0 Tc -70 0 0 70 1044.85 2798 Tm -(X ) Tj --0.035 Tc -42.2151 0 0 70 1092.4 2798 Tm -(5.53 ) Tj -47.1816 0 0 70 1201.33 2798 Tm -(5,61 ) Tj -0 Tc -70 0 0 70 1305.84 2798 Tm -(A ) Tj --0.035 Tc -25.763 0 0 61.25 621.88 292 Tm -(BON ) Tj -30.0071 0 0 61.25 696.86 292 Tm -(FISCAL. ) Tj -0 Tc -73.7501 0 0 73.7501 547.83 224 Tm -(A ) Tj --0.035 Tc -39.862 0 0 73.7501 615.75 224 Tm -(2000221497 ) Tj -0 Tc -70 0 0 70 908.54 2658 Tm -(1 ) Tj --0.035 Tc -25.6592 0 0 70 926.88 2658 Tm -(BUIC ) Tj -0 Tc -70 0 0 70 1006.85 2658 Tm -(X ) Tj --0.035 Tc -36.9837 0 0 70 1048.7 2658 Tm -(19. ) Tj -36.0939 0 0 70 1105.6 2658 Tm -(79= ) Tj -45.1196 0 0 70 1179.42 2658 Tm -(15.7 ) Tj -0 Tc -70 0 0 70 1299.84 2658 Tm -(A ) Tj -70 0 0 70 901.54 2519 Tm -(1 ) Tj --0.035 Tc -30.8042 0 0 70 926.85 2519 Tm -(BLC ) Tj -0 Tc -70 0 0 70 1005.85 2519 Tm -(X ) Tj --0.035 Tc -49.6123 0 0 70 1041.26 2519 Tm -(12. ) Tj -44.792 0 0 70 1111.19 2519 Tm -(82-) Tj -47.9412 0 0 70 1178.32 2519 Tm -(12.E! ) Tj -0 Tc -70 0 0 70 1296.84 2519 Tm -(A ) Tj -68.7501 0 0 68.7501 899.59 2380 Tm -(1 ) Tj --0.035 Tc -34.1021 0 0 68.7501 925.37 2380 Tm -(SET ) Tj -0 Tc -68.7501 0 0 68.7501 1004.85 2380 Tm -(X ) Tj --0.035 Tc -43.6376 0 0 68.7501 1041.47 2380 Tm -(13.82= ) Tj -44.2149 0 0 68.7501 1177.45 2380 Tm -(13.&! ) Tj -0 Tc -68.7501 0 0 68.7501 1295.84 2380 Tm -(A ) Tj -71.2501 0 0 71.2501 907.5 2245 Tm -(1 ) Tj --0.035 Tc -33.5038 0 0 71.2501 925.38 2245 Tm -(SET ) Tj -0 Tc -71.2501 0 0 71.2501 1003.85 2245 Tm -(X ) Tj --0.035 Tc -43.6376 0 0 71.2501 1040.47 2245 Tm -(13.82= ) Tj -47.4365 0 0 71.2501 1176.34 2245 Tm -(13.E! ) Tj -0 Tc -71.2501 0 0 71.2501 1293.16 2245 Tm -(9 ) Tj -67.5001 0 0 67.5001 909.63 2109 Tm -(1 ) Tj --0.035 Tc -31.709 0 0 67.5001 925.41 2109 Tm -(SET ) Tj -0 Tc -67.5001 0 0 67.5001 1003.86 2109 Tm -(X ) Tj --0.035 Tc -34.2776 0 0 67.5001 1043.8 2109 Tm -(13. ) Tj -33.6101 0 0 67.5001 1108.39 2109 Tm -(82= ) Tj -42.5776 0 0 67.5001 1179.51 2109 Tm -(13.8 ) Tj -0 Tc -67.5001 0 0 67.5001 1293.85 2109 Tm -(A ) Tj -71.2501 0 0 71.2501 908.5 1969 Tm -(1 ) Tj --0.035 Tc -33.5038 0 0 71.2501 926.38 1969 Tm -(SET ) Tj -0 Tc -71.2501 0 0 71.2501 1004.85 1969 Tm -(X ) Tj --0.035 Tc -47.933 0 0 71.2501 1039.32 1969 Tm -(13.82-) Tj -43.7495 0 0 71.2501 1174.47 1969 Tm -(13.&! ) Tj -0 Tc -71.2501 0 0 71.2501 1292.84 1969 Tm -(A ) Tj --0.035 Tc -29.6916 0 0 68.7501 428.85 497 Tm -(DATA: ) Tj -43.6551 0 0 68.7501 541.53 497 Tm -(08-10-2024 ) Tj -30.9769 0 0 68.7501 750.68 497 Tm -(ORA: ) Tj -46.0218 0 0 68.7501 845.39 497 Tm -(19:30:12 ) Tj -46.1102 0 0 60 1236.38 1364 Tm -(16.33 ) Tj -50.0779 0 0 67.5001 713.68 563 Tm -(20021.4972241031930122<7CS ) Tj -46.6007 0 0 61.25 1232.37 1296 Tm -(16.30 ) Tj -29.9735 0 0 63.75 1092.12 633 Tm -(NR. ) Tj -35.4334 0 0 63.75 1149.92 633 Tm -(AIEF:CU31 ) Tj -28.9665 0 0 57.5 378.93 163 Tm -(VR ) Tj -29.2695 0 0 57.5 435.85 163 Tm -(RJGAM ) Tj -30.6177 0 0 57.5 548.43 163 Tm -(SA ) Tj -32.1177 0 0 57.5 605.85 163 Tm -(PASTRATI ) Tj -29.2071 0 0 57.5 776.86 163 Tm -(BONUI. ) Tj -34.1449 0 0 57.5 891.84 163 Tm -(FISCAL ) Tj -0 Tc -57.5 0 0 57.5 1027.58 163 Tm -(I ) Tj --0.035 Tc -28.2213 0 0 51.25 325.93 107 Tm -(VOCEA ) Tj -35.199 0 0 51.25 437.62 107 Tm -(CLIENTULU|: ) Tj -40.1985 0 0 51.25 663.57 107 Tm -(08008 ) Tj -33.8291 0 0 51.25 777.84 107 Tm -(BRICK: ) Tj -40.0996 0 0 51.25 910.57 107 Tm -(0300827425 ) Tj -35.7981 0 0 46.25 347.68 56 Tm -(TIPARIT ) Tj -35.4936 0 0 46.25 496.82 56 Tm -(DIN ) Tj -30.74 0 0 46.25 573.67 56 Tm -(COGITO ) Tj -31.4439 0 0 46.25 703.81 56 Tm -(ERP ) Tj -32.0492 0 0 46.25 778.88 56 Tm -(WW. ) Tj -33.6304 0 0 46.25 854.64 56 Tm -(COGITO-ERP.RO ) Tj -41.0396 0 0 60 1115.63 425 Tm -(TD:005771:0 ) Tj -32.5285 0 0 60 1173.65 362 Tm -(CASIEK ) Tj -0 Tc -60 0 0 60 1309.9 362 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF"ExifII*  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqwh"1 _ꪏG_~~y_mg+/`G ;9>dw{Wŝ8q벜-]M+Ty^.XaP[mf]OΟG7_+&enҍ?3ߨh~vbC ?F~4oʿU_f~V~5kc?b9ehQq~~,lVj*[3qHOŘkcYgb~gBOƋaL+슗>D~*?d,^C?Tk/Ɵґg ->>';oƼ|23u!9q3:Vo)$A|&4c~S>ߙq(\(!Q -$.>*AF9C&ITWȅhBR6yr{OK>O_~Pq!{."#ُߓɸ>_.ߣ?Kt|? Fꞣ%ߖo4x6-h5ѓ_ki_pg?Azh?U}#??YnW+L'.cץܤYD34m]f7flHGɓ8c(kgӏFl"> ->O诔>1|}GArBijV&kmGl}YjNht../!Pp3K_Ϳ7ciYyy~S!N':7/5|L ,b ZI}{s}U̎G*]{넟rR?;rYCg(~kY~ɇ_G2?Kg>mʣ$ƫT'L^~~ɫk\~ğ')?# ~H?Zc?'itE 1+#%gnN4u|1˞S۳G4XL&8@a-1T UMYW4X.,iU#K[D %, X -e-UJ,DTP$JQhh1TC%M6,.&_6,3-TnDiHfG7JQ-P1IL93比3}5_U|r}?-3O*\`r>L^|X}4yk7QDѪF.mtisNwiEQh]s7JG29^/8vH:vq]Xðwo,ğg~k?_?/وo_ I nRWgseu,G~“2l`徦U}Fh0ɚ1sJlrIsexĘ"ǒ `f( -` "M$C ZH@h4T (*IxDgɤ#H1`iV,iq43r3]qo7.{8/yoZyUjv'eO2Oٞ1!IP")ieڤi0VIr+Y"LUR&ИɌcQ GfƲf¤g)pBiqDcأ -0]=QQ.1 V"JB"@TɎb )RЂ ECn\ eu, +$SAdBj\1I&9`QV :LЇ#`RƘb.|WɝS‘R!i,+K`\bT44) lL@Մ $TiԴ X4ʖKQ Y3& &HBR Ub &!@ -"E.6%a#V4NMfϋ͋6*I3p$ 44 @@@&  rCCMȎXS#jHŠJT#aI -cR9HIGV5 "P*%p '@ H NQ0t>LYJV*˩Nьh MSPJMHqKR@ P d(8!RI$.1"icZJe8SIqu̔fDK`d0 Y1dL+QRڠa$%M&1c"U (jM'RE*@1TUC8Sr)!l1D0BPPLDP hq,c͆>|y#jЯ+]ufkzC,cuf;FW*%ȍiILL26PX-$R@ MEti( TY 7n,N@J&65," *\, L0sVCE@VܲiN*'zqeA"MB@M2%hC - &XQr3#O=^DY2L̾R}P!DXTy^v%qlzy~ۮե@>}.>k?._oVI<;HKd~NubZƪQEL*)`kI.eHIL4 R!1sQ> gud ׆˓u#)!N(@!#X1ؼ v1D cq'󯦼)6zK-<,x1,v)P@ 0ʑBM\n HHXA5,&e&1RT %hbJ-ʄb V i"U* H9)&0r|ʑ܂h`Y-X4nhcKB -%C@ C3SM!Ei\LdǏ.LJ>,XLbp}46ˑ8%  *Xrk+뚧|^lKBhCM*k=l~>Ο"4ETXȪxm_66}9=g0mRMƲ}qm'y޷ی˥ƲJ ϱ\4?qgP@* lMc=p~̙AiK)Dͳaeב Xpl~y&t~~锫>qrF;1K`=~_NlLv_>Mj R'#M,:>G=1xfRi>kV{`|l_֍1jKDVb =SX:6+,b'I#nޜԬ>S˗>-$H&RIκˑʘ45 7ƼܙRbvԓBEH Y)IM@S() fY&()(N"n"Fr\2q 9 hjdI`S9)0C1`TEzi&J&g"he-4 .F"ІB` Rrb`~i -N<| 1S0v nYiHVQ6*\fU#$XQ+(1/J?Ͽ_ߘ%C*rƀl~YGi&BӶǃd0PE4L`x5|R*>~G޿HTپi|c{>sm>ϣͼ_T4!|Ɉsh DMHd搁CJT"@CT& @9@д6|9rֲ%cmTyd=4y1.'_hǓbH(Q97Hיi*tPcK(Rdb BD% MI1))5KI8cA)1(&:1S]rTdh11 &IN@%hT@10iHXrX)Hb(L&UC@ CiB,`}%R۟<ymؐE'Hh*uމMϦHCHMB4&j*# 1Z]j}ǒZ -1x0Fk?,P$Q*)~\nI/TBbb;˅A*JFM)PRqh ohɟqY3Yf5rj&xMcl\aXKy#hC 9!ER.Bh&i$ʴHJ\%k[\B$5MV%88L$hi(bX"dBj% re C) hH 1J"˨kg3\cr^;RPHk5mm.-_|)e>'+(JF  K_?N!g~m>tJ~63+jJD!H5D&)I\TBE3q -*5(b!d -Rbcm I) j@ċ@1&@cQ"TJՌiG,Q &Ph6~?MBE 57JE|Z;?:9Z;4}Bu-ܲ1 }Z\@K JKP 5* -%$'(0*M@ h`U>̀JWtS |W][\i['ݭٳf#{oGծQ^DB1 Lv\Ʈ⹾^m^\gO<~ͮC!&* E"fSH9i!5,iKPb#\i#hq5#&ʁ6 ,X -",C -@D CCC& -@F lEheTa9 AR%`6=]E[&nX4 g9E(j\8aqMMKZӏ~EֺS4(VRN٤'u_}yɰm&h!x:8uz`"Q,lxu}-/ӃF'L~IA:>_B̟Ozջb9F'* Kݸ)S }KEH -+>Ckg//Rxީ/J! 0dxhgy3sE.A]O9Y uTrs_o}sX>Pf2E,ctueluBϛϝ& $Kb_=~HT6P 3(aYrv,\p:nA'díjeî.ظuɨX9?J> 9! ͘E#4Բ9Q4 -hrE\ -ABHrЀNF K^Ly+0}S Q$կ]&|]6Tڃ^f{*g]qIkzܺqr" 4!nnok{fy~}G޷'L7u#o.sރ`"h !h۾K[WZDpVeC$ 5t>>zK"G`~Y>5,B@䑄]0 Fa1I52i& 85+B "&6h,͇=͉ܼuw5jѰi2h{ֶG*6ߧ5=&8LhM,Og;ߜϏOFfn> z7~Їh5D5R#H@ ZBN`9r\D˘1&jLi̸KZ{ZԠ bLJT#H&1dtIR2@sV9E'HL `Al핰@&Th-ESp J3lc͋d%yY=φ/m7|_oL7?=,YpTrzus0<Y}ЛY)HB$h)@hrԠ%J -Cn0R*jT@ Rh@Zrh!@ې@T4JTB@H,h`U"MJ(@n%}9c5JBMj~3r-~daĶug, q:BpnsCfC 6<P~p驼שu6p=ԷSzp/`==lJȂh&~w/X| $H`@dJiP BHJK BE$H P`4 -rcl2A,hI1!M2QBoGnu`;0hh -J#?C\#s> DZ,=a'%6/@"BI|7q 4D~̑,MlF|_IuM2eM@4 TjF$.eLd$i d3ILYMJЁ|"%9LYL iA$Q(Lsrr -j@*J  -H11Q#J bhC2eÜϖ2.w%dkkmOoɚ[|O_J=O޳yOHO"k|k{l!l~-؆n%\ [sqiCP}gF7;gV_iIi-EL(L\.13IA1r($&PIDb -d/Yjl 4Aq(bP B$ J&H(mQ3DlIF}{B!0,` *Xɜ7,nA  -RE - _'|DUM*JdT0Lf<9K3b"ܯ5}H{ȷtL@bcA&Do_ﳛ-T$P M?*\4 Cįon -M%TˊF*h, &VlYyLҷ>Ksذe¢i@&*0B%,B4hHmK!!#r@}- @\-BqJIRR@S`C+TmZA)jHr  HЛr49(@BbV X9詭fheUe1dkd+tOٌ>fvƞF xM~`Bi#!0'K| }RІ4J% HBM@%H䙹̔y1Ó%R!99"/"51SLSS)RƀsR&9ȥ͔ڱA9 C!0 - 9ƜiRj KU!M0AR2@JBZ&nUБ&iV1S##8qY͌y4nV7=쩯%XaaduOGmVW}~*f{Sz=}񾚾-M\wϻ'JA\?)2YrTtwctsDE\9횎G:dNJ3T|k=_ Ϫ[k!J C<-mFWm>e2)0ͨU͟ --B% @B1*ѴWaDLDĜۧHi -h4YM%#BRXJ"4?ZJiX$D$flDi0MNV V*\7YmV62rSm_6121ԟ__!r1!PxGAyKyݰ U.QM T@C ͈R)ԡ$'1)UcU" c]m b!"e1Ҡ@0B`WU"bT)1BMhlM1 d7#vTX!HR&%m L`4%E ͒ ;(!)\˃l1k-ZG2f͵:Tf24J[  3)Շ_}PRTJdKI> z a%R&/:tM{vd7cPPT&n-yעxwo'}fhےtD:@啓uNk[.~١nZ -$HA[:oc몑\cMĎW\×WFO~O{6c>Ȝڱ4꾏g;V6٩jhL%4 `C%5 Q6J9!*U I̠R!U2BhB`*b -XjIle.%PIXM)eD}I]g\~|w;:;q{>˨駓⡈ `ۛChbSTӪvST6k?a}+o[LyWYvM -CA#ygC|dbc@j,c{Wptߛ%Hp#@(@DfI Ma2R MLԓ.W qj#Lkךz4 *Dh -nH(`HJrЀY,͢X2LiZX& )˦ycY]0`4 dPU"1rJ`D)[@6!stIS4GEɆC1*ɆYR7B+Mܨhvc&6d(\CLt45qj_5^9ձP -@ص-HϨzBhbEC *H'8/ -/D@$/?>t5 um)PˊԖA~|OνjR?4z$24F3wm+TԴQF H!cxh>o]-D3cSY߇ssދ9qTTKCP hJ!X!IbF8Zr#*P$>_)|Iir1!Rjҡn"n($h1H#ll./FLY xB.nqr-T|][iWϛ3vܙa}NzZ->8<,Xw;M7HtOcY!@܃Nę h&F'H*%9r0XBT%R%2WbG"g'$Êbɉq} R` -"*@ 0SS @d@E0 -AB\C 6ܴbb -iT9IJi@6%S L{2M!) cşie7/睛_FCf/  -ne9OivtҹfĄ`0r#m5P_ړP U$N,u}V}INX優q0&W3eyiUȒ.tLbwϹz(Y, blvTWчYc )}9IZO\L ҤFN  I@.$CB2A*h qRI"H`@JQ+$9h@,%<߃Ia,R*~v9T{3|r3_G='r~;xٽFbVS*2}7ѬXⴶW F@ﭖrwa*g={їO2j4P0K '% !@ RJw0 I&X@vS_WjrL39è};' f(b h@ J@HI*4 hRM h -Q% CT0E!*`! B!kKH14S*B -Kh Rc@0""{eHIr d?u^L@3=v:X&Jy_`joוqq63G^O S&r$M \F'Yl>K=e0} p}-9Z4s_UꡊZܱ;?om6߾86;C*k0nޤ7/EF6ACW6=bMݸڱ:5 QdFoCOujJ  KR&2MH!%H 1*IԴr<&Uz"ƮAł eZ&HA5))!Br -s -1NrJ^r`(cW]AzB^oAt#~>liiE_%g#dwR,4'sJ`#$ -ok9(v<Ǫ&r%E/r{m6&K6 2S'>9qpnW`yv&Eg -ܒ &Z!-hI0*) -XBb A !¡C|s9L} & 0 U*r*" ę$&$r_" -diR gddcq|u|ڐN][OX2?~#=HWvb4RY}?6{2vej47)  M汾rCr4uڼ?hQEE6(4`&Rh$)lpbB"jc$Gӓjy xk |Cq''wVdH!ˌC Rh&" *D& R2Jbh J % @(J4445\&PBD9-c1"R25n,%-0kOLC[RFHE@DQ#bUcEFW50× "ؚԯ& ˌtBj*@<԰W}2m "tPD Kz7(7#r-(HL(M DИ#+?;jߦ0.A4 -&|P>3Å `HДR6`GYTb(*AK>A+w" -ZY7Y'WQ:hO˟oJCyCJH 0$r4r'4U - -4$%g$ |K~OlBT%QP9b` sBjUm.d|B )aTBK}_-#/Z3h\M꥛CMXjzqwъ&H2(͋"}9U*ZUM[~?㦝 QchC@0CZ>_6!@$lHb7RE*M(Bi# W9#)̲ts?Ow>.ooXG5 5m_3=CO5wYdi"op!(P,r, 1!+\ )1YBPh* `y~DHB16HS! -5LVN]!Wٚ%8)l3YTԱ!T"f*Qe[w]M;WՎ`*4d\|tM:Va~fXˤؚviu,ϛhޭd2i9NG?Dqz_;g`M(״v~gKM *JYm(ذW3пCu-x~.G-$Ey[z\>HѺ>히a2DR\?i;7) &Ls7R%PH%iNA0I` 4 r,ĜrȇJ -&0_ܓ@B.4* -$r, (`4"fISh1,`bXHgZ^z?Wa~@OOgOԫؿa}{|?v$%J1Ŗs\Y6\^0# X(6Q{8xP4 h(@4#@`@ jE4ȌN!"F5&QRP#ꏛU:)˶~_SIӷ d-œ( ` 2@ 4؅BB&#3t5Ϝ{frRb©F)ZԻI}K>uV'e5SH \p -O ۦPJMHc -,جMUBR@4 Ldc?$h -CCW(b@,b#"ݖ1vq{=MfZU3LLU Zt5xW~rDY46HA##}$?k )+% K@ ψ"T*R+$҉1@ h!,X9F9J((T$ca-m&L~|bBX4$Hb&r1e jdBMIc *F QHLG0THK$CD +.rIPƵ=#УDx&ioFz;7Z27|$g/%}Y4 *"H}pe2\Tu4nI7F*4crnM_thg-6Oc7ܱX&0@9&rArɆrcʘHR<.oq΃kZo즣mW_"Kg7=^27dwlbq5j&%K9`KdR\L -(@=??߇ -/GҶ4C+I%!?cO]G\?nf֓*DPЗ{&PA0L -n;*mauJ Cr@ćmZWA""BpMIY弹/".)y=7peA1ܕ5z_5RJd J\^ýu8vd&:hI5Ӷ.M:޽ApXZrM͔E`*JH ^l>\WqeyK65䠩`@KF]^tUqI7싶}~'oq{&m|KE ! a-U.HW6$R%)CJcv_4s?ߓPټk<>vu}3"1I%_aISH1L ~5Wql}9WRQr4Xjj{v aԾ$C]`~/g&(dQRC U7 &jF-ŗVKX%b h' qJDSe@OΩ㬨x=UCG"ЀT1dfl+T[@UcakȾ]/'2:FiD /9׻>SMg}" 5 审|MW9t y{HmЁSDS~ -:U@4Yg9:fޓ=_m+#D M>Np(tIHdŗX**BQ,@$FjTr&ҀJ Q) -jFTLcl)4'")&1ʵ4RCAY3s::r(3SS^rV-WYAGZ/cwXs AAH`+>L9YwZǒn2ԱJ$(#u&ӗB:vhV@5݃>3-؏ eDDĩ"%qrNͫ]=:q`Ki41& U}Bq)Xφ&@`~*y>۫Vu ZF~Ii-?7ձW4ߎM9btdܮ&)7!$dMQs,MĜCM^y]{}aQ5`LdWa5Gf4^첝 <>jʠD0TnY?r͌B&JJ#4 XY&$hYr|, 9bʩ$ NZ=ꚐhE+.>ȱ?Q_~v @0 >3ꯈ2add *A'Vpﷴ rqo0LRX"3pyFO"L]yYщdd2d&eJ&F{^ΚRP離jߥh]7*~y IȜ ˌ݂tQ>1c~.%3/lj\˾ ,L0agwm:PLCbjU $@!ʀ,+I%i@*d@_Q @ r) -%PHE&3I *NaB@yOӀN!"J&2&6Ζ{~NWqôX;9O~n7vuf5a9ҾT_>]C6_orlOV[vhc15+vPZ ")EJ\x >;Ͼ/{ -ex@Ŕw7P^s$2cfo'ιm Z8K_eMTR;1h R!Zh*iЕˑ+%MyODH@$Pb&p4+5mA42⸂|8(rT ;X#) RDdU -&1ԄDde͐2%RB\ Km fG5+rZEĒ2,*5iTRU4PS\NѹbQ&0M -B'#l`1R -Iɬor5 ! M%ILfJ%JfabU(B%}eoHI0Jb$%4) JS!V0<6ᬉiRXb<K[O!T6zYfҵMN p= v^c5k/i˓bW"$u4^|?EfPYn-*[W%Wjհܰ`(@Ba}YO7otCwˎvH9>Ӡt* C -rdRHTC@*Jcœ,w+2ǟDokf:n+5M$g+Gw]rۏ|׶YS] 1)F0Z1$r@T̿[Ok$ѾkgaT=r'I>-;qӊ^^=/W}F"Źϓ1) -qG6ľ E7--)Zh@ -)!J.Bg6ǹȬn7 UR22(ZnS QgSRh4UjJd:B ,Jh¾n֥vfpݟc+T!s q}kt9h'|jm}=䠐LbPjFk8eS8jgu]Xhl} -#D4rIU2߯s*JS>W L@3&lVFrUd X\IHSH@qSjDH"(Ih4R(B}]o|D&4`@HCŢjhCBD4q>>fAM@C~x ߶>anj2 d% oʽK~ˣeÛh@/>GZ[Uqw]U㤯?uzM恀 LH4=uQҎqM7)GgqM7cz:,2hB 1-2bчp97#]o>OKm_+}sAmDHwvyqymM=&E,"䁍v,HI%-hD#%_}M}ۤ>QC8OzZgE4Wi}G$&:H)peAPEJJr (I DcI9r`ɏ-֠*@p堩eÕC!4܇S4fbbF4:Tu/KH9EI+OH%&# Hi*jP i Y%Y%4$ -QrihD4 -)"' $M B0MIDYh-$K2hHL >F, cP @$H4QH"JaTMP9jQ@JAH@J9Ҁr1@&!0I `LG˙e@HCG_x~xJV/ח2{5vEJoL)dףa>lJ/%rQFO}LYrKǒV umn5}:0cBim'ʷ>.s/ANZw~.mM/YiI J,NqCMl0MBRe4dI&i'ɏ.Dfbǒg&+W4} Kk:4&l}vr`TT1I/So/]B԰I0Lg<˷4&2efbDd 4.]BA(8*Zc Wv[6!=#\aH@0T. HR|Fi- L n7N`)ZG,ajTRmI#0L*@U42YNZm RIE@a#KrD@ -EZ&"P*rZ0$Qk#BPi5! \P 0gOL) @ P"$)'Z ) @i) r*Gk1oZ*($Pp!@&jXBrNH@91i"5uKM|.Q"}x9[/k}brǣI&W>=WZomO0oS#WSTx<k``Jp%AQX*q?B\|[ztSb'͐_kÆ]c!SDR dL䑈)UR!$aτ2ZetNI_ӂ1扟J7_#غ-]Vnzڷۗ7f>OQEռ;IhLi604OȾv绾\De]Kd"1&Z@H4( n;3ԉD );%)ėXH+hK|wQr]L\z>͉wm>|`_i1ŗƻֲ&4 h@ZϾܣwpu/>>(޹}1mq\<\u_[j;Gz7]vnD/ZSjv:QhU짴9c$jW$E8cb%X!125Cȥc4=}"hI]PJm0)=#yr42J0T%@i.*M:r( Sh0M NA4)Ii*Jj4cYi%'  P X0+`0y0Ul5!BE)NTN - ЪDhT -.Bv9rP-0X<~g~of!h@&DR* -D6j&nb$`CSJM&#ގwHDÎA/!BKB([:L!eRVJAr9]~|YDg?8W!5?OZ/C??>}9WߢyOW54&2Kw.*r1Tk;?y/鎊T0RV:%|_u} 2T1d RIL%06JX-.caldZY1XơS׽Z?z?:&n.}y'^xLÚv+ٽ24LLT5#Ia4E&jN#uz.FHɮ+>,qjSk=-_25)pplY+i|'ͶO5= XS#W^>nDę+ *4. -)v J%^6SRjV:V¥ʌ4F|>đ*L%1fFy2hM(B)+E"͐m*B*LX8&-*,SsjH2bDJuSFi bi0LT2B@@ CQkD(Ru *DT r4`dI܅&ʋj?Gу?LiU" -J#r & --K!K$)(hCv}ci!14*L%4i"%Z%TDRh[|h$ELʋU.u~n[sp8q'h\d`vzbì'2 0H-=>Ac4jgqExS`0hiTScu/_}%J>e.a + -R@H4ZMX"1}/͏ZLԑ{=hϷlZ׷GdN*b1Ddi4 &4! h۩Xi)h~?[(־վ>mYGm?gzobRI~yŠv/av 3&2@` Y\ qBhI!j@rKn)LM@ -rT*BBA*bHShtrjJr0V02P iiIDҪ -bd*"hBr9i%@ Eh6IH(i@҃P'  bBNN@Wr2 誆Q nZy.~s! Q@ - b$@@H0C%VK$b0HbfY YL$)! S!)R.HN)UIQҩfKF?O|0׫ŗr|-}91] 7ٗ<|6mtzFf{$dLC *Mv_O&VHfKZ-4w5OtCعA3JrKϵZ^+6~KgY޿&|bh)|}L^;n:FFh9 -CTL+B}NY'.:Ǜ|l?!V'Rz~>=/kjOO'/n~{tW~7K=k^>M_aw2CX a*@-{ך;M:Y1 SBmSWQ\/Z.pCY<4[=F%tItN]mrc 4.1!)"˼y?Ϙ%EG%Rh*,Ri&Q&¨7/6~*XP TR"rtSeQ-%i 2KGHCh(5H@T679HJ,bHLiʱ↑R 4 9(5H f:$ T`H'#Ѐ%\@ $ jJ*YB,)RLwq'ٵj0BNVb.dD! -6iLz IHB$HI-TiAd#ݴޟY3DfIk\<Ϸ^8ڬ'gG9995<66p&g~ -qM/ȕ˴ŐUC)@67ӽe^[tϩڳ_}:b*Xh fc7Κ:l^]xHsGjE{_땓Kyv_VVæ͸s΃>My*+Ol0y[Foa5]S2k}xR5X& h =mM-_#d,{ 9f~.#.8 ?_1=Zlƍx_W>? )FH9c&n|v#Wdɪ)61-O3`9a7#H y>P"fĆ"Q!E - E*T O J~4 䭑u>Ξ'wChE$ -7+ m 1D`4!MͪbH1@& PIRa@ 1҉e(`E0%rQeTֳ}_'׵쑠+@#p -D!4ID0_ " M<@ -FZCM2Bb>"$s -DR41F{|ar{YޑF[X%RZr-wcũ|Эx35eFJOY'V-\ڗ>KӠh_W|?.qE:}Q~ɂs~whnX SfF$7O=,~XIt}]ٿV$NwK%gkIA%V0wp0b-Ԗ0ɍjT3`F&jP#P`EA6 (K $IR )FE1]@=%:ϳ,1$C,U)o&0L!c%9Z&2iL4J4! D `hHCȁ@jh 9 -4cU`KrV,]ˬ?gmUbNJ$% W"r!0*%&X KJBT"4 \x'7W hV C\b D -*DmBU$*-P"ZVD7k?PuLW?+ƿ/?5q9H>O79r-Ol4yn7l~Yry&rk%MVLsNTdD4Ls/7k'_d\wRqݖ1w8?fQ-0H X,i "Tn<=5h>/ñfL?DesŖ^SuK'6O+L96#=2sQTb_|ǯLc񎅛A،lj"j/ai 1 M!O9i~Wg,FjQޣ^ɼ-;΃OEP}9ϯḩu7(Ow;Rc75KuݾNSWc$JqgVuLfT˘Jk$F,SQr{^NK&:JAaI.D0G?"*h!I*.bPa#``PG9*$ ]ؾ=L-R%r "*TLIl@r iFIb&D&J&i BxVH*@4@ :QP P@(Ñi4(ֳo! LH@&^8iTPM1!(hkP*D40s5夗R!cH@07a0H -D%JMzS$dIa V#Z?Ǿ昶Ml_)eq~u6gv}:nMK<hi&PVi&}gr茹*2-n̍\ I:Q,rr quɐϧ{=TRb BZ hyuӎqʎ'/Lڸ_xG}1tRӓZ@zׄyFܲs/`Ulhrn|knpc=3ˍN}{4^B ~]5zS & Q??dshRǯwؖ"\x|qn4o vΟSxW7Ef:Q߿W;FX:_Dީn'+쩡* Wר,ynP҉&8ғS.&#I6MW= K edF%s/?5~j!t2h9d*D^oYtK:nɯrK`Bo~fIs?W鳰k ~m]v^{ilH%rR4#k dr&Mt!J YAi9f>lvKa3rb!d0DDMQi:jZi 0_$*(R$4bx$DKJBTM.GkN]qWsGfeܾrA}y'=Ac٤VmN]|R_rʿk *D4BBZ5ͨgsyCo4}z_>g9GVyzv['|w Nnj= -M?pwv4o13Pgqw+ -& ȿg7z9zz\ЄÎsΉ*oen=ѽ?cV'>f]./y~NY3ؙK;*9poR -*I_<ϯgZBi=G~|UcWsH'%"2%DSɌ>h/\Lu1DNa7h|;37_GkG8GKײvǓg?~om֟.%V]Ol$< @4?nڗx7ar@DM䔚~%Lq;#+D(ie@XǑ5يbK@ ߜEN۹ɡ~ ƮdLbRIHE>c632jQR%+$B7 42ǚpe⊒hJT HGzy\riM `\"D@*TBM*i4iiP(1f E@V bb:H" Z5&61if!3|-Ƅ0`rp2q^OΟOͮ ^rHܗAy_rg|U7"CZFwjszQ$YC}>5|I4AڨQHh415F~mNqϣr^[+B -*@5!r@Ӳ%;r;~~ > tUo4*<@wh7CWK9ĝ`W`&+8e:Bg.}o^~-XEOlm1]IUnO/i^R\[ˉ2A>K9v79>tf^gsmy}|YH<_{Q%hi>~=tv\vX"}Hk]e4!c{|?z!ŀ2BV'k%?{<ovx`Fӕ* Z7{h\*&CuͳzFvŻ>m  Yǒ>yڿQSt uv~lCM2U8CF~nt%CQ4@411w%}wh& hF&dhF$N\ -@R*B.D 4W)p*T9(@1*M@r)a x5w.E.`@ |/[\&Vu}^CY{vyz%W2w關"rϳ?[ 6L>IrT(zU7m0SIlUi V `.ihG -'#>>í}[`Z` ANB S@htkGӹ=xѣa_giulngz|<Ǫ~O.x5|{:wl D1xfjUK0I$@j< IzurO6nk*f$ObcY"jGΞr[Dzz$w?X%5GdzgqwDiB-W$o_6;SӶMK4Hu6* *]OL-[Ȏ̾/)6>l!"sR y/^Lfq0.%sE,fh>[>DozgeD -_̈́5K7u|f=(i44 a}.-'Q@k>$0Tp\:5| W MFd}xA=crY2D -nUL_I̺΁s7EWFcQi9AiwXȉ4h nN)ZL"{EHЉM MD"SVIHId L4,NHIm @ƨwL{єL8cÝlnY)8 AHȓKhQhƲ@2eBO]K^r:ZXM.np2n\ϯCT6ϯo/H5SV]MQrYgBAbIbB}Eн$?[ƺNU '6) @ -ɬgU\̿&;!nߛ#tko^oU8t|Oʺc:^[GOo9T9a!;=CҀ$ 9_-<;~x3|n.4\} .S^\I|wvxs컵ˡ|?Lo6F=W~b`)). Ƽݎ?*Ѽ[UI68Icjd2f+koMgX5 zAjIW(T#-%Nh;ϙ,k3x {9/R|9OGޜ6+Օ񜏣k!?l_jI佋l|l+GڄWҽJ8Ov~X$hnAW!ꚺpԫqͺJ R##ǖу9;~8*  JoǶe4pk]t1dj$P|?Ls݃k}cYi2Ȫ`HMHML.xN|)"@Ť+B +GQi}jkrрiR4#@YH4BW$l@*ZRƆ%!CYP$+JK -jPHc C m4I*vh5(R\h$5OVs|EKN&Wm^i~cMX8nN[G9q+&,7IYa+ÙYĻ'`cd@*TE"JS`I+o'hrH !҄.iLbOf?t7O;mt?Uz7 Ok31t{I/(aZErlPϨō4BJXBg.Wb7kgڄ֏two>-x7j?d3[V7D) @̦6d%BjY@χ{onH(ADdcnNY= װE㒫K!.K{ k 4=u`^\n+Y$2bw>G$K_t~1{_/&^ts"v#.u~ѷ^w~x{G_θccS:wѹ5pܯa^s߹>NW?Q}{<ع}BFƒ@v[[>{8=@{%&Z'$Q`78ymyܽ$*BV-O"n65*\g qvtߺ8U⩛igOM?OsM9 hSi>ޙrc:L -ZT0CSr$ҪKITː Tn{Np*ȁ,dD &E(LMX4Q`qZD' m|Wk_$7>qkÃ*'w~8@r?NY 9Lh)*hzX}b7NoNNwTJ+JL"ˁ*@ Q4H\JNkҴ ~g{{ȾM,XcY DSD^Y۔:p\#޵=M[5Fo]?B,x;BMGbp ~Ok>vӾs^k/RU q6l$҉ȓi(7?keƥ¶O×6,no>}_|Wy쟞DYoonZV~9&uc8D]pں>,".WX;.{/%q$bsJ4y[Og^םOkU2@ȴ#CP6"DWi  I1fGb`;F4i YJ5+OSGHV+A6?di412*Q3#To7-ZH`CěV:@6.5rIP9`!(҇y1+"T,D $)4Jj@Bp 0ԓ4E"+T23I9G̢̰~g<|[hMʼw|dHWiǃ-)7}VԵQwHXj]ŃlY&NN>0b`E@U{ԜliN̜fۋfةTG, r:&'4!2FlNC#\)r`ay0LUnV٣\^_|>cm3=_<_ͭ%c&2ĝ-!-J)ǒGǦFi'æ.jdJSef >h+Jp;nK|cgǓY3^f;h>Cxb8 ;&CAZ?Luݗ525g4权YꅸRRRhb{/.+In]@m6Ni\u}=(#Û_'k=~V3 3A]ΉsʋSYoױwb9Il| զKwF7vзē>~E{G7{ƺru:>VqsqǤҭ]9*C`AhiuH!T\؁ 3Ay2{fļL> -tQaR -QC91+DeQ,XMcC vq˔M努 ~):@gË2$@`B@,S9; :+P$Г`5,JIcBCHP1$Ld  \&g *T%%D)STw.'ϥTR=lzhsW1~zf.OO5 #M٪erƶ.{/ϬɅv@HICD|M&[.zl"d!qy3vn$@0k{rA-vؼ<_UMNr“~1kǓ̓^_ s1Z款SǨ WU5k_?\C\P,M% |cygDL=Ij2P3x MK 0C!_ܝ^Jt NHG-@*)5d L鏙nω,[Գo8lS֏П/+`L9oAzY+ӑ #Wt=N۬+N2YQLuDy&xdYzږ_P  -C@4 -@!Zg&ۗռ~sͷ@^7e(@9`)$+\Ӥ8'um4mF^˥sj]z>ǛA'j~UtMcJg>,iED#7tb dEĘ&8gsy'`}w AS󟏹W6uiIl4j^/Fҩ~HON-{i͋IHҷ:kS>츲MYUͪV蜣j5@m@JA QJ*ieF5a!Mj[pX~۾psG;gJ>lM,F~U̵[orD;%׼~yҵݏ9>̘o6BJ塒!$'520I%dT%H RW(/:$brP) R3HB!(ȈW 1#=$A43M^-w]z}5g9}>_զzY0Ƥntk= 3Ph4֋mfGg+mP]$Y -4=v h`0iJ[M@C@WiG}gtW4@* T04&E e#>F$)ZhW6ThQ`I:.1%Tσѵ%oc<O|j"eLdžcHRv5q1H\KL.Ӱ Q[Q|;[6ɩj}iq.N1t:g -}k?}}(_գD7V4ܒhu*BHJgŖ2ǗQdfk&XUiѶPs@$ LPhk#ANI'ل5(JA66ʡ/v,nzu$U6O?b>lyG|^sύzoɣlIy~Zmy]+YRD.1vV$&JF0*_U0=S`yq,FI1Oww9~^x>KcvZVpowk[i] -_:UZ %b)ʲrRܵ&$_AjEmn}$M-!L@lh/mϵs+?GY$bqMG/?x~Og. 'FܼԱt4%uGl^EIzg(hkKܧ}]2<{&HW/~߀vxDx's_^Zq<ΰd:o*{_6'B&Z=m^4/D{\>n73uoY7}'ҥiRIW ,jJ -Ankqb^Λnyzgy5s.cɊ97_stuHϬ>2Wrnh"Vgĝ -~Fv]oduxueOz׷ŗ/% .6:;'19bk=O3]lQSNRv[CLCefÚeidj쫚W,ctiR)@4&C@$ZN97ߢB9$!2SHcM4UVă=4s|kǑVx|vפi~^Bz.{_լ.&n"\C3;CU2!"DJ\j5eey]{ 96 ͢8ܥ9jM .Z[i\m:u4D9`$\&ε}sE- i -BiMHi69y ɱmd z͋.˥{ͼ{{^}|PX[;g'6siٽv9baӵ/W}m34 :DQxm7cԶ T>ۙ1}~x6.]913Jk#`VVI# -l^g0%qlrxO:>| 馑yS'潗@7wWi>=&v.T˶ n Ml[ێmzw&[ٖNa4]fnks &gC{6.QLwŗ,hl ߓ뙔$hB/>g>\1JibŅR#9DH I!%SJ%R%V4hcRk{(j;N\ETCL-fJHW*!M8j[EĈ0!?&l/|cKy<~1Go}3P4 1ÙsR+&,dxˬYi+*i6}[h_qJ4@ -PM '}NyIc{H9rs}ہl?/6[x_gzkЫn>?>RS>nK{_x>IsN_t9/ZQ}-sKh[5NIh&H`o>XX_OY՜~fvAԫ)G"3;/wߕ?/}%u\|=sk -5!HTZ/;1;2mךu?ٯjpzO`nw9 0l|Cuc ٧FyYOgo>I{n~?4J޿W~>@ e2&:%gz_GASRd%'#B.IBLhT5 -i 9ie\`Iyb"$PqaHB%|׋5Rcs+vˬ`vo}/joGOy$w&=sz_;Z -ˋ2lHg ;tQ6 - @`!m (L.λTt3}K4",1XB I r -T @&R$ܹm6_?й5>S5d֍_п*DE@ 2bJBB@ !M"&*Mk-kdDDQ4n6о(lGֺr Bm~[fǔ)R*ULdD6]oǼ o6,5 T828v= 'ܸ3߿xW~G7)"Mcvy͌yyM7MLר -QN5#rt\:ORJ&qf[vг׻|H*RJbCȵ}]hm9wz̗z<_kdF2￟u1\_՟QCt_.nubv_R<o`_(p~y|F=2>v#tdܳL0_z$_8>jZ=։5/1y/$^k69wL4S%QpZC|~7{6c|#蟚>X#uꓖƍmy}侙,`@(bĊ!&Mj=)=>u>vg4AD hhTBT0L`LQ5#w/8 jK}~Wa?&{Ϋ{WѾ^qRL\9I,5٨[ -J\Ԉ@Bh$@>^,n>fN>NtZF9$I0)(_'K˦wcIϋ9|/0=ҤS|q{~ék5s\K'$EH #x " MHTL%c$'}Sl[vW(0s.K9U4!)L(Xn-Ei{#d`iIjƖY~k3yg_ۮlz9RJb!}/c=4i>taWV! -UumA-Bri=>U}G/oxu.TJ3`ŭKkصOXջ͵NAd17Uz,=wijr>+~3h5o{]LӚ]'\Ӵ;oν:-uy}/꺟?oo}nY#l֝wq>D=]u͚4y^vOj1:,'`-7b>Qs=Fn >u/=_s ^6ctL%Y1Z]c_}=sSL"F1Q-(HЌNir$ʊa1aMI */;;`ҷ@&U !P(4+P:ѷ 6DBWZCD&lֿekn+{>::@v?0員{Ϯ -?/U޽ua&d`&|?B*ʵZFeTZ!K4+! CBTXՇݽO_F1Q@',ܥ (! #!DhH9Nts $Ny̅ޱc0A2sg#}}M8̼$㹖FMvT- N@M!0MI(1k^27ܺ^Ciu[I4IOO@,;|PP%?DP Fij%pWa;h; f׬=7U|GϓkOm>橶ڹLJ:7w jh!H؄M&ޢrK|os΂eWOУzvn5YqqN<0qi۹{]_WO6nLLsu|_C~{ο3cgN%t1juD.yLw3'۷^o@>Y]kؾ^-zے>7'Lag/zq_7<| ~+||T_V EŒCYJ  -YI &!U$)*@Q@Dғ@F"A#I{rdD -"rJ '#U*oj˳o^҄5m¤̧*)5xWB[ڼ몸K8^˂9W߽$ϏGӦewHY2Mjdrd*증IB>8XTU d&Y4 }@Ē` !4*B[pM8Mctwѓv~Ynծ^YHIjJ36FI$h`TVW6dKp aBhi(Dr RT$1 j?ByOoM41,Ф FЎ/E1 @ cv}n-cd:9~ȉ*bLnC!f=(Me0bY"-З`K}&"кSĎqҹn:# _Sx}/hIJNkӐkM[^ZYY97Y2S ޶3YPJ! ӥIeϭ-znD?&9 )[Qzׅ9wӝlVl(%9eϛ_jwOSXzʍ6M?[=Gy0yM 0?}͓loa#o.gڻ9]?|2Ε. _wn|O>EVY<~9gm#ElldUϩ9{ YU 5@A 5!R-H\ H$!ϫ.3_f=vFybdD&W2][$j4)Գ4iHLBJj%O5 L3ӽ /t %2$jघGWW]0B4L+T9`}a5 I{K=wMm!~ M+HF73)>0gFSoCExNu/ ls;O:D d:N|n29g3>TK/!zb ~>?Y|[&BZM NZNWɨ˿>\EWCyX|ѿ=w4IgZWK}SIgk'#y4˺wZ#yw:/e㝒\+X}jguեejZ0ܮZW,KD4'4! JMԒ8 y<ϬkFioX!LJt@H9Xv9<6lxo?'5ݛuzu͇繷gu8"nULԁ5ـR%" 4hJdU!HdlwӸ.*o7M\Rjhun -!DT .fa2cW橱oɺ&HݓP>8/2Мqk3r&Vv~Ow<+ͮ NE{LcjwkޭFb)x٬1^-y:yOMX7~3?^KҾ+8mk]瞴|?rH( CTZ^\Yl~&(Sp0A#PHH[tH D&jJJAM*L'6$7<9ƩkqܤHq ɜa{}Dl^6!3 dVeRJi 9𯉋[z& >=*GKg[jO`:'@@3Q -9N/1Uz.7=2 X Ƞ,%6TBMOzbyd^w>0~t̩KE 7;&J9c@КłJjQ0HIHC@@ЕHMQ~W6NoCX:Lh{$BH p;^ǣV" !s}>Wsu2`69lf7R А*TH-<ߴ\{?6>uyTv9m=Wvx|ݯ9oIo#;>鉸SjsO,rz*}tK}v5xjO ?ÀU\/$::9w|~q'0yV+~>Qzax?ҹ;Gד{ׯl).&&mk#󞌒5( |χ/Lw&RՃ@@4KCBTp!rbH&,p%HR\~ONs<}eUH)dЬDΛ!D1 Ag>`ΙÛAz}vǦ}&P =~7Nfŕ2RbUsuT:,bbVXqɫ?kxN{=t8`PmQ -IDQs~sZ`7/!4 !F 6D6HJ&rBjjT#xG:Ub c-)q3SBHT )J"hNJ@I2$h*BЏٻj8oW.) VG -n(h@>t/1?pҺ< 4uI9D滅H~ -L:C ~`ȡmR 7dt2wO >jvyѣir[#G1iqKh\H_Jڿ^6J>iAZՀB aR0T›Dr?9>+S,֜O~^g٧KFIJo8~|Zo53rb~/:W]#Gg݃ƚب?eJ4|n].^ge>xoi_*,Z3_Wyؾ$~ 7e]ri"d qSI1J/.,Gђ/pUD4)\4 M(URS֒5RBmT`h;J LIm""@X\(P8Y -AԂ Ld߮~xg۬ CǟG|FU[ -tOHf_'Ս1$+7_Ceȯxu5WJu64ИD/ũ)A _GυMϧ޼]ܼf2Q& -m&i"|Ϭ}U6kW}O+擄) i1W+ *RK&"SBM4ʼOq6X*DQ K] H@ Sh)5P@, c*h4T CA-"`1IHCc%4R@۟-$TTXB|\c^? -}gl>W~]Fno씐ihgT5=!Ϸ J#r^|BL5]Kp"B`~ hO{}m[NVn)yr]fNq<+kze1־8M -:NmKm ->f-Śլt#L= 潛#]'K:+4zgzv ]ur]7Hy0Jds<~p.+r輞u71ؽܓ'[/3N1>V{6'É3}KÞ4??^Ӯ| z\|6U/z7_^_&L2Ni_~66wWi;17~_7[ܴ3mdDКPVL9>>ǓyhJ\Ķ"TBBɌnXH$h%C@ d@'#NF)jFIR: Y$/lJi ȉM=K HjkjI -zqS -! G͇upohN`] r^L{͏&lJ@bd&\y529˼T:N̒ĕHD|_`g:{ڗn>gg߳x;m5LC@$& XL7y{)RBV &TDRbˑ*8<3c\>cQhƲ!\&jdDhrUʠR4)e*N B -H!2S@&Di00-HIHJ* H4M щ\i'_y_Kx9^y61A<|9Zt醉T H}Kʟ1Y`nZRr㦩1@* z:R->9P>y_wHس=wds_7DksKni<|Hźǩrn>_Iݴk<+pֱw_5۹bsi:ԼsY߷,a̿/ϳfwNOU?=q^+yOR99ys>?o~J} pәmӷn9ϩnג7\O_8v٫mLmy%<Fy>(>{Fhif/;vM5psYL~=~kх>s =}G-fIA -mT T \9>/>3o4b"4 -C҈*T*U I H&%5!zMsjնBJ'D{y c>(nKVNRͪYr3^KӾ%9ngY -Tc>繣fs#9k6hLZˋ.M2A[KsU@t=C} -4yH9Ƚo8-)I -@D,%4x.נ&ׇ]וklmm$lRJb+M R -!4LgS4 FTM%SH ȀhĚ\c%,7*JRА LC@ @SiD4  @R[BCDR$$hTXJG.[kR{_xog>oxVdҦ5_?-(ңxi/7ҏ)guv[ĝ'BعBt%qof:^fwE/ſkړju:ʟjV/ڥ:nTy~%q*Doeu(yI6( -G]N]/u.HY32 -2(+L\F"_Q}}5M>ӓC&"~df?S\jO.6F"v_cy_t<NLRh~nuYߟm4n'y~}G>3Q|ZiݱhdZ49B>߷7ujI%PfĒHV EȢB`PU)L+6 Jʟ| TkzлVDZ(y鵮+5]S ~b'D"U3DԐ!T۳ tW6~ܻ$M)gI-l=/ldm\kf^?~K' "$'Y.d*}2W+70%RP$2c3F5N̿G7tEͅ7IT i-:`>|TNFliϙĨj -V$i}ye閛@ %#@$IVhCrh -MLw&yLTU{.Nqc~W)Zέ|O:tOqމNxIdtLAO/QvrD*@J!XkO2>V<d>?hӼxvw{Guf~o#š12cU3Y.I(DA&FwgYQ4:Ro5~vXmH0 !LD4 [Mo'WFGGͧn2f\\sN]' %* $АCH*HD -ja'&1HfMoaTR(X m& l Q hɡtFI @%B *6u}Y '>m{ZUi;ݢ9+M3];_rN~ϕ&ll^b˨lqⱂ*9|Fm-+xl1 )D>'ZGjѲn??雷Փ8ѣ:7n秸ɔ`ͽw*k}Gx^ިokzK})>>IL1h/ -w=Y`}NFs?;#C^N:v/$^qFMS^Hvsw -Kɏ}m~{~5.Oj|{=dw__SXtU=YDkp5OE?εޱNUwG]*/ku]) -+JxyixfrȔqe+@Ef>CX3|W;鏏ʽsopOOe "A4!%cT4$-BURE7+2zʤdF{ QPřG_|)5\kIt:Zӏ/KuOaϟOwqCm}sE@ʢTdgɎQ{[TCC$*ZR¢m)[4>|=2{äF$T[D4a[oOIڮkhrvszTBmM RY`7 R@1 -2I3j&.hI1q*&!4@] aQ4@@NA h%9) Y@SA-L&ml@$Đ 4 Q4*\:=0!69x^}a~<D{EC7̱{9>μNgetm9,o%"/ͩl^V*w 17|º-y|*qs)z^ iڎ1Nh̵)_G'U|#H@&_G6 qqe'Ūu͂˺xl.uAy^RD!@%"FJP4IH/_c F-{Y?AG)4B2ιg}'At ,x^NߨRsQ R*BhV\wYsq&;%M궩)\h#z<8Z$DbME"1q6Ze0ICs`2)BTƟQ@A, ;eѶ[{5]ͻ!ew&n~zW4z.zXsj~tg%c(HŬl_ͩƹ9GW\ -冥'AP ~G/nan|ҽ3e4->:9Oїq=;>[9Ϳj&?Gycnomx.!r^{{_?cxsޙOzB~r=ff<==N8g[ܧ7ѰZkC<¼~}c/; _?awcΣ}1^ь~y@A7c$&|\;v[/+Wu9ˊLX>/3az~tHгEêp=ʷ]֮c,95LfÛ)ƿDY#Լ6iW~jqH PܸҐ#D#` LZ~acC'&*8k/V_>|"9^ԭ5OpI1L ˅b|tKw8\ RTQ` PJH@`%fl\Ly4ɒ*e#MX4+A*dk0Q70$P%&Z%4 $Cx~>[6"<4R=D4!*BB@xrԲT 4i 52 TbȦ&n #Fofh1p"VlłL$!A-#!&& "k@0ITZA!'ǐ玍<ބW ޭI×G ס}‹?N磡06yat#`& -̚!_~a7C͔8Z2*x:}oZDl)*Sq}/g޲f76$O\zZĿWy@RG̱{Y/z#|ؼ?ikt6Tx~}/ sr/t$ab4R2FlU ҠCC)!܍h0M&>C>?i&&>ܰ[A8fWթs^ҹm;ޒno~q -&ֺ{TMH&S0@JC',"!CDBp6fd^ϫm!{8z?yYɴkY$z3:/|NƗ'c}7v|>y^ -oR wKgoLٹ"_eKz|_&?+#.#\2sF9LچҿLvlgO'x^_}^έ1tsof3çp᯻~uOk)[]4qR*GC][XL\Xw:,ky߻/ lv-%^+LzN yrŠh@QT*BT nh*2E )"qw(TUˎw~^&ji<'| ΓJǻ#\O֤m]<%Z'ME5*M5 -l& -i &)9j%6,6dZ( ` ЕI|j1is&׹yPꗕO+hW|6H  ǬY{NC}{z9A_-Zl&ϕtM!5 &*&6sR g&1*BNM7 LjĒ&2KQ!Mv;}qR Œ!ZsaRsr!1MH M@I );Pr @ s'̻4x?Bl5z'É ێ/;Vam_7ӢFMǐ쵱۴s߹:`'L@˺u|̧[!XL jk9Rt?+M+yѵez7Vbg]6B#bȻzѶO^mSw6`Lw)?<߿D_on5rV{2s_}=sJ}w7~Fxo똸bbDד{9Ƚg=ͽ5M)^;@^|x[#~W]mWnᛛtŗt -?F'*pn,F^]FjlínNg1ݳ/0:Z?4I7m&NF tOO|˦iy=%ͿO2-4)\\P:CRKr5RTH`0MM C022g2nojb-LCB Lw.,znfǛt_ -}}]]^\ @&*IOg۵Uc OCIs/$l!!If41qXYY.m!`dba2RXٜ%Ңk6N\U KhCPM)ҀRZF`Tk@PJH8@0W:enѩm&rZGxun?n03\w_yв/&7-||M+gN@Tݸd/ -2-Wlg@+~ -dYbLܑ!Rr~tMlGw7[idv9Zb_juMSpns}.ӲRoOJ)I=7k^v3*5 #_<0˴kl7,d~"h7ؗ]>>^c=OBW鉼Od}2f1zSԹ3kS{A̓C;N#_s+'޿NW^7Zv u5mjXϴB^@_w&qL+vgŲƵ;e_Ȼ }'[D J "JT?LJMH$rRR!*WBhI͎-M$/ߩ큇} j~Kb j+Wdƨ @Ri&@! @@/>;FkǓk`JMB!.RGo7>Uk>K)ˌvWl~l7|V0@&Kǫk>O|R{L:Vyyl^hMR~^auׯ{t~a -˂\:ꓐlzY%>(͵͖gɉ8]7/g,/*S"Igܜ˭|޻'֣pQ8_>WX~_sbǖ`vm^Jmɞ2|f֍LB{On>51;SS`JlCC/gɏ7^m˯Uz-:SwOU/#>MLKJKCyOUv]2{NfĿscm: 趛}HM/1\*I6#^~}acZ_tX?Ub|ɞb)qH R̍(i&*X 0 EȘ2fŚ/şyn-2JvjPh^w] #+_ɎW}Σ皑茣+hMcE^noOU#>Ul|˯lAY%"h!&Y@ CBTfRa*K ȱ܉2qK}2 Rc410D,I)jT&s (JZcjfQG"T36Zpg9i=/N>k9Wk"6_Qi{{n'?FϤ@4 -ۄu.G2kx=փw -bZ&1?gLvVz `_Bpʺ?׌mlGϮ<3rk8| ?sXŖm__S6zZ,y|}P>6_^tht5%~{͎EϜmZ5}^?!z<vƺ}k9GAͪl}ռyp닖fc=03gIH - "I=^esKxY^|MR$<yKpjK=俻l|~{~Ժ$Iz[][~\&H}?-}7 iĪĂ J` 0Sp4lC@*hɛhbͼ﬿(+Zb擴ǝzQu2_^s:ɨxZ_fi1z&mb:nkMb{Ybˍ">ƹ.f.+iz8l''}c#@Hgqa+. `y~|V\ߞ^sGif?'{fUT>otU> -{Ɏrc_'=?]W& :ɴv-'6}3/ӨmlƮ{xQZkL<= s4@'&#[q|yS pT9U/t~4s81i|6\2^g/K&Zu&"cj_Y3`]js.&(o Z@ Y)H%qDi^6;>_㑹g.b|S:'kQ-i^}!"=lJWγP&Lqe4GK21"Jj2F` P cχ1XJK4@1"_6_. /7Ŭ5}C4>vwbM-nvsCsQ&@r|c>m,>&ѮǢnҚ*nO٨)4P!L%P""@IE!e!+ (IQu -2^ӝ9j؉@14 D*%CIBZDt -NA#VK`fnf\)=~I#6?˿?X!IYMDȫ#1|kRoFܓ-KiJ폎=7>upy~^y'/>/KZW7o>/"_>L>il_#v-Hۧ|}N n{.lֶ3j U7/CݣqHO?T _Y=_V&<jFχ}jN=tuQy;>kt?b[6dxwS5=-[lAͺG]Act^o&O'G:*. us9y{Nzyg={WT+;Yu_x>C^NIo?>y'Y=5{ß -*)da__~?\79X,0]>Fl,}ޖ x\ RԒ'k&q*!'|<{?r5`I zGG#eˏ]6]9f>j𞿋j{`%^Տ3@E hPM F%R&lRM 3eǛ|dǗfP-Uje.-JjBIM N`M +DXr -H Ve Шc5$EiS -Sr JK H/X6B`SXLTD2NH##YYU* 4IB(&LR @60@RӖfTT 聁*|fM|.-y~ԏz9Enڱ"h Cy~TN -tP{@ϔ@-GoMDMguz0~*^~АAtNCY5+r&':h][|n9_c5wE3*MZڴ h56C5sr,/cRvo?txnO)]g'Ϻ>סO6#݊r=1v8^S/*^o㷔>G.wI`֙嘺ʳ>yeؼ7DY #j6f3"ieFJm\R}1 -2"FZȤL4 *"h"#"+> }GuZM"IR P *P!{!1Fy=L9DԶ3}=3l'؂n#>5w/+28Q|_5vKrI}7Py5G:t8N)ʼ.gSkUz^}f唙4%@X6JK!IA- 4 - yǖ/ыejA5 -0Y"JDC%R '2$o@1!RQI1"F"+j@CDRfLPišUH YQAYc@$CEX$C@ 5`Q`M %%D["_ڗ"N;Z9G& kg^KAꓔ~Ӓ ԉ11~?SM7Dֈ=X 0ŒPP>/Y`V}yW臍ֳpvdb}<_Laj3N&h Ȕ [sca(r4`InU$i@7,1DM )b k"! W"($jMPe Q)!bb($a}Oϟ/7ϗy"6c&1 K@KhƁR2L!RZ>8k=y{m膧س72?yRrҩO)Aġ,|?r>/Id UMY*Y$!9T@@ЀMi9,@ @زEσkY:f,Pʐ  Y%A+#MK$i#01 B hi$`qm1#J!DbETR+P!M !6Pc_D. .r -[NN 8?tԾ1`  bMd0% r @M 51 h *@5-KCAR4M1T40C&mAd2QJ4բL!`4REG4e $`6%E7*)RG,$HH) D0@HV`6ܨIW,l@!XZ.Z9V  !**DR NYbc̀[?tìwiDDD0E"S"FMC$M -M("ԩT$C edDR#A 6@Z$ J4PJQj%3$$Ҥ4  0Lr119cqq/,#շچ]og}ŚX>O~~5Cf" D&M**bDJ`K@bm- VC L¾32_\}!+X8~c<|guΙ =W8<^\KwcoIꯗgw3u/o|E)Ra2}y3<@?h<ʥ$ Hh  \҄$*R!$'64uB& ) 4 1-1SM 4iE Ei$JJ28h4 VL6 C0f) Ɖ4Q%MT(T%0 i(  - -\0CIY WSpV)`TIJTFH(rЂb*(-fF8>CO -+xwo;i޶.$@qHi"EJ L \rZSSSJ*I*d HTjIR8C@Ԃ*YU$*q#AR4!.+Z:%.>7>AiܵnF L@}">̭OC{yֻό^rWXyqqI]7 gr8[;^'Goś[ :&zu|:^>pGDpYЎzmuIy>DF\A Y*Ud\)\Fl:rIeLCTs H*|D7|˞>Q~ qj㲦agHРT0-'#P41rȱI&@hbcJ4  bP P`@@wV0`S`l!5M҅/=3O}jثn5,iy͸b: -Ptcc$G^9#%p|;S+m~f~k_ -?^hfO ~(M3~̈́~_ --{ŝv&&-#6f3Y>C2k>>kϯ}[juMȡc;S?}?DS:b=^~c.5H UR1+D@@KV sR$ISJXh"$%srJ -B *jL"aO|xڝoFvO3[+B:0v fY0e/>?rx+=/Zg=#ɟ|TYvc=P!rg'ȞCܟ"Ɏ_N+1Lb^|e<_a!%|G&$2}X3l>8K}XsV:#_}77߇_/%پ 1|P/? q>pB\R T )(@f X  3aMT}Ac ~7?|>*~_ BY2*'x&_+>@\,#A~$+P\E}|}I@e\b=o}XC'3 r|`'y%ppDf;! "01A#2@P$%3BQ`4pCaq5DRESb&matk[]"GK褺2̺3. -l~z4KF0DFe]tW]EYtQ]5ѢOF4KD4 x>B4KDˣ."Үatk Z]|&&s4=n&:|".qt]].Nmnq5nkKK[ r/arW+ar-ar-ar-a<37╽'\ζe\bu/ٗ<#{5܋buζ'\뗰&\\:ؙ=yr-ar+erW+erW)erlN99ewwYlYiwoQtgjYr;>ۺa&|,vlvu˒4mnFjvl68g懴3-)ɞ1;؈_J.ٌ=9bF@l/#g{0Hn -)v\e9-},v}]ܤR6Z9jvd"%Nn G!}ԭ鷗L -5ѭfݰS(AtXFUhW!Er%ErTW'I45j - ,YjZlֵַZjZ[:SkZԵkRԉ`ogм7pO eY=jJkK]2Q|t]%tJtᖙ>k,'i$l2ؙmJrud%h/mnL[3-bu:ٙl̴q7>o7Yn:KY-dKY-d[ZkuZk%ַZkZn:K[n[n-KRԵ:[N[nKSnK[N:S2Zktfp?/U/Ur+MrWNm.MtO0eۣ.뢒覺5,=E5qt]t]2闗N}}ݟK9䊭[3-V6hem뮙y6uE. `jU]6jtrn[RSNuunvOTUzt@ , ,[R~SG#lL.:Pw]>ut]lE%WF]"WI 6EN})N䨮N.^تL_b]k5fRԵ:Sn:KY-dY-dKQ-dSnu[UeY=jjdJd*kEӫ -WN>a'eNuh.At ]2T]253]"WG ]WH=U.fteWF]EuMtYWE> c]IMU.WMu\\ERNf[3-̫jU/oSW el>n͂E6 U]4) -iڝjuoۛku'WEgzYe>>]inU8DtMĺL MRMB>kJkb6ZֲZjuLNz3uf7Zk%Zj%Zku֥yW8CYrW/Qr\4).ViM pڳYЬ:on?KgGyMYoœd뿇X7Kv2O}R&vgݝjɳ!1vSm3{fNhef;ְO -FOdߚoɿ'Y:UPFz4yuˊդdLVI 4ND/8cJe_inpu,rF{\/Y?PhhCFq3x[^&z?H{7{V -{; 7{^hMsݍ ^ޣvNRok;͞>CKK'- #[dsO$q (&x37jGoȠ#g-[S&'vfc4?LA')'Uջ>$okK$S0f"re$RF1Ys5_߭IVt%}֒YȖ]f7خdy?*? ` ,2N!n4ؙd2L:nG.KD -cŨQLd27n* -u뻐zn M 2D7 w3/:wYsg]f8oldžkX 74E/3cl@v$7C4o.%$Fby&mr'c|S6L׬@#̓!L! [5·j1m]`f>]B9!{ܖhtC(I+ [Bmx3uzXB ?P@\ʣnju>޳CϥD}.;ҾSZG -mTЋE;QmREeKMsE.z$/vi $يn& dN>`ru$ G+JV*ޱةZM_PR5wv.杬i4-qnD0f٬j8nl\ -d+[vZ-mX6! -EZ16rQ65nՊPZnLmOfN=`'k$pGo!Ps.ӫz;6qB1Rӊs C$QLpdLJ7t> y0w휑@E9E?g+KzKJӱhg+ ɳI06Af)/\ɽF$dJT{ -! #f>Iի%W&Z {ozZU{"`~-U3v=vw~fp.d9`"4ecB ztf-[\ P9 =#eb(XdR!!*H%uZDS @:>H{jxd@cNN6ccF! >7Ş?eZfp96caHA;N&3ݱ>Dp-5}Ǐ1qUK?A7`/ǪBąu,Mlg"7o#Vfќ28]68*dR&VpeCgpgu۟d#'wL3e͠r0 0flV jafaRC  6`lˎ_?M'稧UG\dz]iudOLr?eftnA ʹOI% dxl:c& n|o C -Uɼsw,O,w𼑷Z('O;nٷN͟E}k1Y);:GGu4RG.i7LpU=j:c)C{ LnJDdg$sQh2zr95ms6[YI#ǒ,^fgwtu:9(gvrc)GT~Y>T%÷ւY;zzgS~Y~YnG8tjоqY'wi?fEmrr$ ]>o,\'x~CL6jQB>X:r?IX?ߒ!"')2ު̹#6B̂zku_36m՟ѐ}<&Od $1L`&AG% h`]4o(e"}1kQ)mJ3ˎ a 5>,gs95 (;nBFQe#'IVLZAi=uzMա=&wP1,&va Nϡ~6U͡L1gMN#rbO2)Wwpf;4<+i'zlx⇘x3vK `W,͟x' ag)`\Ff:"qSuqVɸYyvu,mgԞdkFX5BGbi['<=I>#WlEcȣ( g^^lZ?>h Sz/ V[5eٶOmF"ټ#-g+RPs)+eaRR~xEVYufuD1140>Az @n` ̞fy`ُ͓=?v]t+&ՐGm?S|Mۣ.,0NO٘Ygԏ{W7KZ[oeI%).P,)O8VIH\O -D!l*V@+T -UvKz"Ǡ#l:HDDR B6_}7T7"ٓ{?aO\6OZ Nr͉\ۛf9*ve 9dy&u -"4jl"(%ԯ afro#z^qfmu!Iym~3D:Qaќu_ P6)]Ճ"N`,K50v冰sf܀&u1 A{P\6gOv)HD.>Ppn: 9C&'yb<16hB9F9<7WqxOLG8h:F7'93TX+K:#Nb.fBQHf"dioI/3=fX^m'T\n]Yteu}W%bV2xA{NJg R4Q.zx!sF' +7MW\uiNZ~xUVbrCr(GA;bHm@o黰zF6WNvZcBA-E lh'M<3y"-˘^BgbJ'0报gI{.$ky3 pv&h%,q"ӫNiqY޹wbN^da17Pt 3wO yw+jam$1IҩۦW].:|> ;|pl2Sw֢Zftiy%XE[8rUި7v%iS4EE ;s36ussgfOx 8hFRIjRS/T lz}R\%St͓չ䵒V|<ǩS7r~E*@cPox&;pgu%:&vRabVv;32cyqZȰ۰J3b.^ZnHlaIMVUܩ͔axq#&n͛ZyKUѮ.mPrI-ag.g]ZUOoՒ8uWRF? sq/7`:\Ao'MreY6l<6ȑdP_vfkQ,Na!;xt}#MTd?K.g~eDuu:Ե-Kɞi?M$uZ*=rO81D18a>r>Mr/T.Y0tլ$,x4AJc$çr#=MqwYG_٥͖XƤ1Eo_#7f(l֛(%w%v~gEXp(p% A;Vfr5D$w_9$Z`^5zٶknQ@MٿڳGӅZla (G !%z)׵cT6@H+5j܀3}|;ez|kn<6Kh=cQ]bIvT}יw\ae{{az`דYz"kdA,=X]ٙyg ;eDm)? Hq1-nd+1$DmKvN⣐J{hv,?vfOrHq@f+wT,I`fsfT$B lK$n>F;8dqڤHgx q5;,]x'k9?v5Z5[М'y;>q.|}u:čG7Xv@dy:&O6fr ZI0)Ig0 ?IEZm`vd\OAn ~dB./ݡ6Nxqi?c8K8t*sz68 UF6mvmZ܆Ve"P\I^)[u-jYq AzQJ0MԸ_%]4"[jH?G~J)Suhjr]b5?\WwrtoVBr8,c4O]ѣC:F@0~ -b#''¬ jsR̦ *K4olN mu=)Zj[!.g=#3k8t/,A LDl>gSy 6BVqb9=w7uc "Iq -UaJ9",$t30":pN&nvLJeRAqš? 4or!r:ef6tXkh،\ E3$A̚%>{F}ʵ~SiMq-# nz_EzwgUWLߦE!}53 D7[* xH5wӵrYizԨ.Au+yoAyX'>IbZIhu}Y8fiD@p:79;0=* YEF '*ݘYGG 37 c݄Qa@o跂UwWylu'fdG`ul{.ډC&j8f`1!6\/Wok-NǑUÆ\%9Irw2tt 3!l$1&ZM2h~\)\)?c=:3uB~ANm N7<b-j՟dsD27HtxFUj5`&^HGZ;Y9M5,U)2 ry;l,qCqbꭋ# >;3ݟ -е9'Veի.Yuj9X@1F>'*yJLO-N/[h;kwQbA,'ؽF0y@^owȴ@\lY+Vmj$}nr*-6c|7~G55[X@FQNlV;ZDC(DbdG10шY \#!lK;HIrwv˱J3P!,/?vL8tG뾒'VUҳPpY*D^jX7WyLkDIoi+#yb(j딦ᅽ)2%8bICr}U)x"h*zdm%>`ڄc js>BUTe%Z.<aF6HpE LU!zOT2ĩ;uɊuLm#2VuGnxc\_XW8V5m7{d}ve]lBf;ra2iX&׵˯qfj$9|k^ȫ~iA9u7ݽ!C/;+ Lؖ♳zc9X})jn< fv ; Eޖ8 o0 8VGa&Ȼ3d߷2'Ygt7kä₽|86j`BT]#dZEWfɜyם>nu3k(uyǧ5S;MV|9)AvvwgRQ@> ;FFc'ËN*zL谆rUF"Sӎe$Xu3h3|*Gμ]GK8|Sqؽ|ŪҺֆS/v&AV5gv39&Uz;i0<&9A]Ii6VpHlZ[2^Ӏu]ʤ bM6 A-$Kiu֗Yp[;{գ'g~}k>^%jAYGK fMv]6CqH Mj;EebzvZ yQ2;RP/w #/Hc8;mؼC"ƣ&KǠpڲ$l6Τ|Ăi[ -,l/\Yar]i}06FRO+Vj y٪I6$ M]8`) 皊xxJ@nxLbaWˆ2EĊK XDLT*^p%(8ͅb{~3!yUs}/YkN )1rjp0hd:)+JOJ](KKfxdזCnY͡o!]K$!ymAL7͂3Uv9X6&ܚF1XKV{$+DEzRɵ *r=^bm3bm"*tuN@M]>֥Y;m&Fu)OHzsC$TU31uIjvtq\n[atuIE UL^I1=&r| #1[SoIbV;$G#04[JpYQ2uaٹ -YdmE.Ut.]t\KD\k|):KKr|rWW%wK3zdbg?" \^ ͢"oF]i*dпal|HmUlQ[2v9Emn?wh*.n%ٻl\L =?O2wtE0ްeBUؾU~Y\N)CmVUA8X7ڱ0') ٙ6X}cYع J#i#0Īn] 1}nKTO^y -(\ƕ뻰A~ l}~Ez.Ϟ^L'aN0tue/qa8jz=&S-.Œl M d&͹y M̺i9>PرeəזE ;4174e #7tq]WG%  |ۃf&6]Ve\5\5\5S]>uӪYt˧Ck'".b ۥô/ f=jh{6"Lݿgz fx6Lկfau ɷ!6V k GxT8~OTG*Z*k+ܭVQCNXAkB*s5=2vGpQGRk0FN燝'A3)9{hY)) &|ٰ%)*StBClbcVxO(:{c {Q}&gR[ݣsmgrV!ܴIpW'W'Z]iuiuNY? eSEba+: "h3BTzC9 .A|苓b)~Ɏ6JG)gZvsMr}wcc5hO}-Kkk1ivq&}68x arAV##R`7v3j4r Wٔw?IL -Zv)' K6riGbw+[o YH;"%nU8kwݖ!Un u5JӐ b:nsw͕yL:鵷-\͖ \b|8"hNxwx޵@٬#w7h_/E~з48޼ 6%HG^(?PZ]F~ꓧfM%wl,F?v$]PTuT]QuDؘ&?MRϳfzoX]$B:,RC/8yJXg<(^r;n#3ԣFO'2QhD?&_#s~{ -KAn ~s -ށoW[,ۆ'j: $"L~an(Ip3h(bVv8s-ח)fsP~ ase껈u -IʑjO(HC1QE&{~͛f9=Yz͚O|ߴ#r,no݊|c<>Ir=Ն\ݕX\Y\\\\\ZMz.zҎݓY7ޝ!ɩnihc RéMBBFtˤQK4X}wQ1 5fh )`o Gjw,䥎AŅ77n~#ӱŗ;_/ܞ@T _YC'}8Ȣ1fGlRCs61:%-RbB49$%.  ;O'R6`\KӞr8V 6 /f͞!k~OzA?O~7a6dq -F:=O0U)\ I}!RXe9X1|)ZӏS9c'ɋ"I7aEV3|Z{G~ {-Ğ9LfI[SO Bjyi\;.z+n4xbo8٥ԖDZNL\i" =6xBjS;ra^&oKԒ<3;h%𳼡7FSlomj.ZO=S!oϙFܮ_V3il38s%$nd/~0lĶq3戵jui%WNR.gl#пǭnv00+h+51 .:a"oI՚k>w/rs6` ɅL'q|2X<" -76&?Ոܽ9nJ?6ĮǤmpzn؍]SKz3Oh! -y5+uc]hPۭ.=l,Nܡ,#^;'8knF#ZZZNP%%u54 _Eg -fn~~U[Jӊrx1ӱqlKќw"-iy+3\H^6\1/*;U@U`KyiD,CBbCF4n韆B6rwLNȫ,Vx(GѰJ:dTpC ߤ@&.4)cWIKQ6M6ɽ&c(#6J?2 FydJ5cE`eLZ>6 +QA4,,J:a9u.u -X-|eV\eXLsH-Vlٿ1kVZmNîNHu t]$HM uWI]%t]6_ -)t])6bÚ#cM\rP2).B*-gk,⢳ S_d2uq:MT%xk%xaUZ]蓼$OFϊ7~y9KNšU( '9:yntd .Fv^Rvwnc6#ſCplоg5Hl;9ˤVRP(3f(a75ѫ(IM*;hI$2q%. d͗#܆HM]zzy~o͗Ҋcw?l@癪ٙj[-[Ane t-["[Eny5dw$ޛz>sz,^S3׌.JQ}d,}PɂjXfg`|܎Q+NlFQNNZ1$u%k%B \ 4W_H*.$ 5[Tk"?͛w'l7Hm~ W#Մ,\A!,LE%F%zr? 5y@a;צ] SFiFtщI;\.ӲzSG 2B jzFZwRܒܻEFwb?gz$U*ʯfj\\%Oޚ0ݷ`5܃uhC&וySw]ɠdeiNޛ~^'¢)'?s;*E&HXlBLիlx]@eOz d&u4",IJ0ڀLK&%oJ|6GF)\1@RD:gɰ뒆,hCSqPfwL5.w'.O&eҩQW }NdVcã<,>IfZpR_~Xt;sUieD-E@pDqj>-䧃hHjT:OXkIߧ`ޏŔ_l dY[q (- ;C~O~yIu C,&D19zL:FheށY]abٲVyiLůҺU5鮕MtkR]=,Y!|"voD>v.mѝtg]tgU(9x%[kn룺9(h=x ԭ%mC)"ff#6=2s/Z*,d凿g&|9gTəm_˙|቟w2jMMR_tU&a8JgffEѳ+C[ѝ`9QIfj穠9[0R6b;O%Uoml1D1ᓩ2(?>R\uMӪxYGn,,hga)K4j=|'~&'ofSjtfKSD1WuelbؐNTbC-w9/fdvӚkr 짚d:;g?υo uZHDxwP[y$)ٞ1 g3ۍk?~9沍d 鯢}%YjgkȳkjkWogl\:4U4NLټ_m,e[!tr,f`D61X3=\? jebm 4_kFoO/Vh hZ]e`.Ҍ^F{y.}P,b*19[5Y3 0%$:RxeY6Z dkIcJ^?o;i&|Ն=F.Ibv7hy~9+Kd7(D:9_oVg?hՙ,4Y69:~#xm+%~HNRRL[C1jlV-]6J3܌OviYv3PN37A>wyA(Zr,O:PM=3wa /뒽q\Vk#&lGkrطpo!M~ES>)/UucUlN^.YugO:~k#O:aPauGO2G=&vٷpaQg9 ܥ;d-c`m(fճj]5=Yh|Wtah &q g\;8wɳGݕ׳jV BG)ACFŷye<SX)X^ֳ15g^VG"ZI8WٕoL힂ϾFӻd vhp6ã7&lR.]MS0ȁ)֝>3/W6/.~xnG3vg%s[QQ"nɞs\p)wJ2ݯ$*ԅiZDCD|%#a%Y4?S39SdUz祽zM_ДfقuW!:oB\4 -W@HG']~U84ϒ;k &xs[nwaISnݳM'pFl`Ǎ'|.r?I,se$\')笚#qDْ}f^1+EvQ03GnpF1l!_g#3337za#5`hwPBvuvH=ZvRi%0s9gpq (^Fh|L2j\ -sé;372cJ2f³ 2 >N&UeYmW[P-1ea6YԵ-nKQ-d:b>w+uKQdX"Q2vxdĪWX>/X͘~c719 11%d0X b[l3[߲vnmP}kUi^i݉HU8O? gdTKTvϴT=mD~_3atI|zުk-~j2.r)ri~{QeԠ]F_Q6^oȺYDjǜ0y#jm`g -N #7 -h++ժzƛ#3+Vw|9Yc;Ю.Τe iQ#bFL-uNvTQ3yG'7[\%+ .Yk[(U"9)K^#/bhcϬ~߳V-PSR[IDOoݲ]::՗!Qr5#Ur5W%Qrt'Mr-MlV[5#,^G[p+,EAGdީT-q>@Pӆ'$Uk7avȊ9fF/~!59 Z62[yO f]ś7;3&ca5j}ɠ`ezS9v uj{C僖m4a0ߖtK._I,:Ld~YioblOYU*yE[j]?g=b9'W,9Ms;M59#\خi=\͇[Vm<$!k+U_R5\D޶^(>drV썘_#R - 0&)s.IR*LDbgQݽ]oV[ՑKPġ/H2DIgg;4$l-Qts3f -RCTB`]B1;H_3΂i)7Uz4ҕӸ4EkJmS}TU(!`%vB/&Cfc -fg^W@O%y_Q}EYE -ޅoBڬ˜ʋel6mC@tN[jݓ2jl37EsN&XN8Dl#>9\2*{ih6%U7ٰGӳLJ3,vP gn- NĎ*Fd<|4D#oe9څ!OFR.RQl?MI.V.Z)3ڂR%!vnJtvx+R/+--)NS/+<)oݹ )Ug|IG3 OlCBY2Yτm\E+'ĠA>j$A+d|Ui6$;=-ZXwg,֣rlOPMڑ7@RE\U#m"O[fN -E;#AV͏d.i깦fffnDS]*5Q!8 fGAg,jk #Eě m%j.Qtj -0W-a0h<2:PZD@XGR2OB"߀"ߺ8t YbIRPB0o'{3⏳x -$[MkLb<%Lߙ=iz_"fvjLϛÈAu%Hd@W^va3a/g7>$H3f6=Zݨɷ3dpŚ.R*E"2=.-aqi3gf&jfO%st3' - 0/K$U܀qf]fu%MW{:]\2 -ҸᴡJI4VWӍku=$[RSW)arvW%i5 Nul2R‹oNMhuW7LJD2_f^;"lɽFV1 ;n8JڙK<ƛع"݉rtxexlٻaajL~xzq Ńze4Jk2V6 ^ξ\@AXew;.p&M!U-L_+tɉ8azOO0~O׌ -aUm'.:5I!4o,N ^ܵ.3d|F5B8'\͗\͕~,?r&Lcsff6L+JZ[:۶7Jbo~َK\#ua8HP9iqL$$7ZsQbщ`'{v}'+f=Se H,mY֢]۔f1s%(C;v;%nvF]ȸS}b --::XmR -\WJY9?EqA䄵ׄ/*p -G_q$5wvCsҾIփ[R.^w\Z\[]6#3ISO5J,L#z[|RK4Ԏ-&n2.4kScsܞ6d<aг;+՟=-QՆ'84KSdw0> -巃HOknaD$ak[U,Z"PN%T'fwB]Ƒ3Xlh(7^@c3̐i&b0dc\"ǧ)KQ8v9a_\"#|R"V9޲`LG fWNvRvswV=r?"XtQ׈ +C _'9{!BGRgU8ݼa0ų-+Yks -egogIQ uS]Ful'u .&d\sߐU% zԂGuoÉfzA$"jz0͆LM~`~<8C*H" --fܗRQ'&Ey6 N āl˖|EQ5-ȩhc}<2Vv<5I\haO'a |qGd!rvm,##~&9qwZE )}cW趡|7,1:O]:՗#Uru'Qrt/U+-飅ΫF̵1 KTB{02ŷC[vggg 7YSŊy(bQ}Uw\%-Pe)(`xҫԜ.59Sƒ=j|4ĵ6I#rNz+.JKCgovtgzL$iȞ UoA҉IB8ʴ0쥩^gwr2!'ih,wNe1}N~Qܠ|0s-˖>n%VoȞVǜH#,VcxƬp 7&6tK].wjw'ԏr @&1YoW[&܌H0ۓO }Gu^;v ŏ O Z7<֯KV` -{}ty6RjWuŁl)xW.t]a3 -=¥6W!i83wS_Xbfhp7InIJZvb20ۓH{'DC|4duN]jу{du_Q6Bf\5SOz.YuSAS|1lRF2OeQԎvl0>ٗ=~W2%֌]1>,^ NKQ~4mmXt 單 -oUEiMuj MjLbY=BTA?dܫE mjKZsb iސcP17C~1òf vQXҳdXxq7e\]]:b[  -N*Z [12Ҳu''Nϴps]V˦aX7Yu -Sb#!͟[(ɽ=,e{}{3U&YYn/f/ۿ;v_~7ٝZk%R>j1#<6瓎`EH:NC$0} G^q)r\39uIoP\ jhicn%ӛ4Pݤi*WZ 8MJi -|bƢ83I2=!-'IoT[E[rIVMR}v't`VMڃ!8jϮm"?vy)e:Fg8U0jA3>1S>̣7uh}M^g.MցڱJOCCxâiu} 6v*FC&>9{Lri`6XP(xeOz9Ɉ+p'9^]ƍ`t]V]*¯ŢOd?S'Y:No);6U5 -:x+K,μεW1+.r{YuSxͳl|[q{srwifY8MQ&lּFXY',edH+Igv#؂j96v]Z4k: 6Yp4&hpn(/E+_P\|1`WO*iom;13[ob.ē~o,V)An:w~0UB)סHJErƖX{ 'hm04=[t7x|dçmU東wgg#?n 9\0صA.1WCF(q7C#3;Lo򘏳l 1fieScx: &|lC%b -k0es_#߬~ ?e;;Es?Eu -+,b6E㍣coY -.]uzˬC~"]uX%դPbE, 6Z]i%_ݧn"{uq5NlqLcҖP'շh3g[XÖk͐& vvY;eٴ.&vSk͇[_bfvcmC(l&Wݚ뷫/S[`MWOll4]X}ZE%&a6.8LٶlwNr-Br Zxrqd(lz>GnHŀsvxדAk7sŔ}fOY0[Jy)H? -DPCgo~"- FիmߖONMO+yRrp.ln7/Jы6]WFPɔd f U#]a;ۤ޳Kn./ѓ6jNhFQa;fLܫ_ud]È\ /Xk&<*:UsSӞI?H}ӝOԌ>|.6MVb^\ .ӮjNwq;R)܎NZ\3Өxej:_ ̤؟g+W\,}EU6o5Υ^8^LdjehfoĀʖ!B?I_3L/b4ݛ>IvɝѮDGa!m'ibN;Aa"ڕl̹K+KMMκT.\_/Bh|{x#H#o&[@_v_e~~%VG -'ه3 +>je`J[&6rx,Y1C03l{g4R"Q>`_VNkݛWD# 17b gvs`ϩ^daTsH272;[vgll6tU]"<&p?V#KԨEu*I:M *'>*r<9ݱZ˫]Z1ek|[WXuũ!aK~{Q;]֖C6kיyӿmί- c%br:鲓 e6SaۥZw]*DzK #D  ̘E۾J[ɥ( C8}9WNQtT]*NwrI$B(B(Jv\ $㼾bp.lNwsT:z{w!;~`|WNV귶^+|Y3yv\"]ݪ^혳w% Ge -mJjNq|r3&I#r}՚*)h;QgGxS,Zn'|#/6'Ozh1j;81mZnjaԵp[`}?uU\5\EON׮ߖz "=YeٌWQ0UEb6!/Yٟ_f `Q_bVjx#/pSb7a&ݎXr>nU![Pwl#S Ӕ !c D0ӊHkIv檷^)fsM#%'ogV(CfgU21KaX{Xh*tbofiwY{xenqNߊ6 -QaxݦEbri$7Aa]].l(zJ鐦f9]jY"Aᷡյ&$ߍ~[,\ܭkuU0h@ ~dS˕5VRSb7A\9ٓÉ.$4of vA hWf Zgt0aBv>KO6c`kQwo<Ֆ(hPGZ]iu'YZ80wz?{ *XvvmM b/+g,ևY3{$D^Vfm{-2|.Bs8z}YE}U#.IݶuXi gp̻vvY-;SOU|17/ݝ!{Ml,<1@2wwnfm#^ar~١]NzX]&4I:.J0DR0Qw [jUKQbUtkÜ+TwFHԍn+iޙn̞чRyCzvmW,-/ FA#gyιI۶x8.WuvOc. !o $7i#iI5.ʵGoTXUv7b(|( a&QO!v%tM>{\&캝Me' "d?C7)rWh*q|]2k$2*.v R dy[Wq}XĀա"&cg $1A;I]NJ a1]"tP3?G`IՓ )L* -28|*v&#Clo[ ^L6ﮤ'afwai^AP@u>A|lR`v K6?g";'zA,^e}hby yzc2 4{3\Fh\TMXҊiM Sgrh\3U x-_*7DPbR?q=Õx=nԧM;#{~1aRL@C- #5`WMuT*Nتjf}2Է k%]0I-fõ)+X,\uY=v^e8 3vG׳5ZIT;vxY CB>Nu4c.qVjnP@+f[0-f)ݟ'65مL0is%!hHL\I>G$D_UW(W4xu1hOveө! 棣V97oufzmSl٥ t+Pҧ 5D('Ky6}yt; Qfu%_Q}Ee5wLzcm?KtP@Zi1`~ގ=dil ͘p28͓b_f5nxY}*@.\Te&LԩD.N{1%Z)"q6%_x׊-xoؿm3dFm_ !aVv6v?h.'ъ Umb,K{mݳ2J.'Ub£؊ -Wo'u^e^tYdVĹ˖˳Gf:zXLeYMvj>(A)6}2IlQ]68O^6:rמm^,-Q=:n1&!D$JsZl7\45kFba!&Ȯn]rU6k&`yt!si{q`*_R|N筮vү4(ob!7ل09.l ɿ!kTr|\V*qTX*ŒgQlsOS'pY՛5IN-WPoZ*FbzR&.,-.*݇VyN3.Կ`x"cNG,wO%eBn4n;xA/FBC,atiS`.Jg9?3"~'TpmJ(I<v6vvgoZ֨U+nFG d)@ 8k2`?3 ϳ◑Y̘0V-G[F! Yy6u]auvPقHLHE^GRX铃\1fSqbg亼XbMGIK[ &ޯ4Rǜrׅ+s21u6í0˯Y)1@1;T'zBٺz[&[!Ob:êM6I,ٶjFn8FY5.MuJKSF,MBѱ[@Qѭo_`(jP aHFO$~$D5,6FRV,&\rf#~Z/d߳9w\lv!&}+Mv{6o̷dN6M\u,'])aa:._ dᅊ;.fM\3#0D/XkDߍ$B:,_|V6۟&4scs܊d8aA֫ۆbhpsab#A>ig0-oBO(#_%Q1GpwɝRZ+۳$/Hb-Лp*/_"u>k|,).z_oa."|&F˶Qֳ7Uvt͐qebl&wƺ).|6Q=B%fdžǝVI63PWg8kj jTwK wLd͐xq)(EKw ݊Ejf错^uDŽRoub9YP/fug-~ dčmd`$:31쟿 gX;>CU&_\Z,onTfȄʙZ (ʟ&입sY$W!ErW#Etzg՜>HͤVqM:<9,Jh"gŦKq$j77z9b89y 6Ē!aoYI7GM(DDD[ҕ3M8P[Z0RioՍ>+?StvTO"jAR eR4 |_4jBbG~f.M-ʹ;ȯQv,92o3;f!LĂZ>+1 -F@y3N|;batd=G݆VYiVY\kّ\Bk}>&v5044`I7ZSֈ_T\U7~MG,s5`{BSo燦UݗU鉈X a6/YٵuZkT]Zzlu9heībHXWv kx2Cx(VL@݆Hۧڋ -dCWKKq̫ah鐪^j<0e~r" 8z,߆k7;~pxZMKϥ~3)-T둴YMOtd=:jU+Ml[Uוo[ s#nčAN]{3~!&ȥ+:C.ɰvA@?p#e^gMZ.^ت8]6yڡFu=ܣxq&F "͖&lFfbm"҃-WnUk]Aky߅v%Zv⢂&rX2jU[p8fM MPG\bk5SQsP٪΀n3HU/~F)zЄqAıl'd'Z]d'=p+8y;O,vO?T]R0s3m.Wu$CmpN6!i[erJ84pɤz1Bó3FMiyU0߄mE$8'#zB9 qI+kL;LJO`,4傯E1M118>MfN:VSVyQ ~VCNۗ)+ڱRՍҰN1ëGfByBght$eƉizqrJh$mߎY񚤧mٙ2D@U xX@ FBoJꭚb7w`"61g瘝C\qz|8`x X;@ ,:<;.g\*YvQjُRou}\wZeeTkz %!(w6ݳ=`c_)27L8m@o8h(n_3I)2`;o` -BϔqЄ᭑M ]b>!?hZ[ol,f-kR~+}جPqv"۸J߄qإ09'#I~f ^DPHR9Hd&#d( gjBD7nښ;e:vq41m8Ro?LCӫF&U^VpbCH!4f >oЩR`e -{i7oR Q4#Ir5'QGnz_AY]1nbOZef]hM7aЪ4?ިVZ<nXPb6X]}erj6uffwvf:oݳS뿅ݛݝeYwrG8o"N^.Z٦7U*E\]kP>+7kDEZ -sAby R&v'~2HFb/V@o0͋xoW6Lm#wSnPc/T=2,c zyf$)4f< -:,"g@3](g1j^МDLzx9W,,Xc7V \8a}sk'XtU - #~Pgл1JMjuY]֒Z]dow.np[\tKL_)edWdN6snMOn{% er28|WPXO22BۍЁ:ݰ#Yd7n檮r'O%;3w]u Q]JTڥe(N15QVmr΅7ׇxY!Pq>Mty.MtjL&фIՉ3 |XA<*A|bU|͹Y3o4gGmi3pl:hyGZvvvgnP y/drfv2fy(dǎyE.VG͟ ?WB\GlgB8ojVDW_wVXġ6,س6EfyU Rӆi 'l=\,Y/#եvK'Mv(n5#gvEYvͲQ(W7쮄X\,&'y?B>affY2s}rjr%͊_~3iݢI7zQQl- -h#0[GZ#Zn/44~͈e&})ۄR$C'z߬A,r}Ō_t Vdu(IBٳ#\՜UlG'|:uNN<*S1>-xާcStwl*TJUEc0-p}.I5l'V:0 -Ue*範@×K&%j#V,ah})]Evo1P}G,\nNU4Zֹ$x3RWfUr8CS\~1C*Se~hy٦X Tb0ib(pLuy㌜l1e#꺙>k̟W7+6 z5GԈ4bSdu]h%Z;e>7eRVW?m%'u'"%i6i7M,W4둬손E(iM~,M݂Z ,;[2!amƦsW*[Bߗwiaa$nlIMl|y:eYӚXNUU#m)lWr-UrP;?z@[kʎ%+U^)$hcy^wmMN3fu+@q*Jvdt5/nRm.Bl6vWJ5L瓢g e]naBab',Uݟ#99qm1ĥK( ;6!/{>@,BAte6ḴX=1ߘ W%L{&>jJ2(Q!PzCEl C&~*<*RH~GqbQb1yfA42vg ջ! WNz4&,M$Ŗr@HLXҒ{_˞NGl2I?͓p|߬顺^9}16]T5㗏>Q;AtK Tvm['"1,.gYع$sxW8mwjLݙ̘c6evOvY囮]%1R_3R<'Z]d,.Z[e,ۆI>6sN+L[}Q8u؋Gdu=)%<*@mPՒvI40!b5Ah gUV&hP,6&IٸO7Pa1Xv<2{Q#2Ye-YVjUzK.f;72DR5OukP9A,˛X9;32ǩs.ifh@xq;ψ(kߊ}սLC/.VxH>kÈ(qU(lL%J.Ng6'fM ?$A'o^ ֗n*J{SO%N*l-M\ҶM\1 A5(5Yl{(>Ӎ,Mf>2:ĭN-ҽNf #6;HrbVWh Dޘ+k.]t˥VPᑤI'WnDqk 9=j7O0FI$~W㤼c3sۧ^u^t#6'gM Qm=M\럦iHX3f&|r77kSNZIh%օ]9Q&čZ#f?ɱʵͲ˷nQxc-A LُLkvbT 5GH.Y>#s}/Ó/:s< ,?R8W(k9 )w,{q' -r Dα.`btp]48¦67٬~گj˗94Չc ,>SPQCnCRc}/]:%թQY-X#")4f/VՑ>4NgiT5'ζ-1}j+,.#I6ȤNFxQשZx\^RIz+' ͤ N=Yԯ./ז Xax2n!j2"'cjn(c޿jWjڱ OIfiVFz'n;rCj47qx8[!'zwFgXUlgßyڳM۴8tm}> -ԫ4' R9C֎6ϕJWW#c_C^td P%^n,NjudL`*d(G BAzBI*dgݪYx5g=YUZ{AhȺu =CNM1jm]f~.BԪSZ%(mL˝Poh7à2ɤKXgfieըXZ3;>^ON2hzU̝ߐ:b(LJ5UP Ÿ겧ħ6Q[I瘽4u1oAUfij^ufWvev *A/EbXp|۪ 0ܘ]N$SֿS "Rsv}w֊m:f9Dt 3|4gh]O,@l7r79cbOfRي<&-->Ryg{TeDՖKa e<6hlķ-QcoX0i8bzS -iȢ z掸B9FfaxdbF!m0IMvy w sb\7Z3Djՠ\#P> ;YlJރuFÖaLfʤ1ŸYV?R¬?r gAfA.q'NIEbNSlT+" #dSޫ\D#.^"ͤrՓMfq"=*S`~1/KbS6 )B0bdeۄPIn}ة{mb2P44}իX6$9?gkm;,Jx.f7m쉱z\ʅ9"#OjalK9J>ޓwujYsdE`7؝%i6eavJ%琪k{,p_د ǥ~Ņyۺ,HkD-ߓLF1q~_GSH!Ie8ĥ.m.q3QW;VVYڱf8&P^]uX|NS&* spӔ~Z':?Q)Z@[5nKnYSmX[tˣ6 ="E$QDF #@֎8ɞ]ԕpĶ}pei<h) v~t(yIPF6%zb듙φ:L<(Uĝ,^3P+;%J8-_:-(0"n0US5uq1 U<:ye:HVD*4Q -fݖ1lŐnY,JmWcmv=|vV~70uT愁45UnR X?IsPZVuSa]VLQ*GC,*eoAr5ؘ|6#w'l2zTGo d兊i{ԛ۩WoncO%tC Pd/nX&xi&Y;24qaԘdٌ0M18h/ٛ/29HYv&fYR'p-׳6X?qlaʐ8ԅOy*ЋeWG,$k -@ y6!ڂ ikVtP@b,Je+GV$;\`;t_`h㓞` zv`{mavi#㕳3.ʵ@ŗ 7>S&E!pxoՈtU+3 2͛7~-~뫪0Ɵ.E(dԳtn[z p&3D,m1멋kE(nzӧa"&ɷZIfh,ߌB.fzݧ,.DZ̆?Gh@w"ڕ@ nV_*hNm5Zhcqztr8KOWOםЦu_jYi.ItK]*aafC1q6H]?u;+3 z}Fݠwx'ez0S{v8wSɉE'Ӧw&{ `ALU7.s:N8Ҭ8oO_c?p8IK]7!5q3hnΧ3)!% -\tg|/NHtq:#WR+t CF@ifk~3=Y91ڎqP7!;E2bQ z8؍;yz*+X90w0јs]&mY{#êJ ˦SOVpv 8 {)b@@4YivUR?Bl[Ud#BsUaofٯ{]n+2|B.|L3 >%?޴͂y$uEoz iGUdw\) +|ݗu, sEB9 ߋ ;JbgJI/bVd?j4n /[1vHB1gvG8y;ܷC f d.ثg,N>Dɠ+NSŨ} ?[?g VZ+#6Є۞yO.Je5 < #ݕ v_R|lJhOk;I:nvitĠLgp%]5Y8/^lٝo\}plOD3S֯+b=m6!NaUFQv՘;]a>1'Y$شL;39z"-B}˟؉4s 6zj&G>9v`sYx/[*LɸrkRDu9&>G8bY򝰭[2{ ŸP9p,Fs *Ǯ.R8[3J0dlf8 b -DBFZa7j3n,"Ĵ -ꄟO~ӮnޙgZ3f;eM /4>z}uUC A1vQӎ1]sUW7M5D_gʝ'%N Qa_qՒG̡ĩD: XHoiYb-Nb՘onKswbFi;3 VBDqRYc+,g4%-11d X3Y/bb-In;nԫ1pzX؆<$ 8Lw5>3iP:A`B&9댅> -yFV!\gXZыa̧}w$c i޻Sq,%I\5 F +~٬q06ɷQ0FD)Z@ >h`!RBa -%58r*Fs_[ʌ$X=L|vPL"~TIV]Mj0^G!gnm5^;߱01dd]?u]&[zL`2nJjtL]-M5 -̚V[G ,ٽ,|2%N"g&- oǒj4d44j[3Y9MIoǷm\اg۲f}/ -Hl\D_Mgmpݭ;vԒPϞ1,-ⱊSF?7o NY,2Nbko afۉ~+ cТdkLDJC Hrc -\y b=Zk> .KA+mQ!܉]Z-Tx3^2ŤKڔxl5e(t1]o$W'.Fݙ^Y6!M&Va,W'9m!zqɃ-:@r -Ցz={7 qZea>N0C%ęֶۗjK0<'b +tJ<*:.+ˆy>ETWڲffn VR)8pCK ,ty)'{&mSy+“ӻ? l刡=̣J+O\+_fplj+C Wp(?'U-s13Њss]!lpcEY$8ma|/j%֒Z i>TGnv.}sV]-8Z;?rGE #/ɱ d@ߋjZUl9#љda "a1I]޴zRQ̬wH2:i7ۻ乌Abc7qkpc7n='H?S(0!+fYj7erkX&1ICxsɳ]BWQVYr*T4j*!t ]8_+sj]8DgܗQQB1#iU IۄI Kbw~$:Q: i=VIV13.ШC/yGLq7Z14^u]?6a0႞|1ߪ?oS؄W.^[.Sw6`b7evaD,;JwOy-2ُ: p@@XU U=rŐRBC#ߪ˨SR2'\6i =?f- r,?8vNןXLDN]%]" zpOw3}Y͔ hZOZ̲D9?%ֵַZ;{V+3xaK ɭ+r%.GUdێk2Y? -|Wn9OlEֻ'y*٪HUΞ?Q uGc{Cj)ٿa뙉v7i2&M>F˰ fߣ|-.Pq B< -VP!7wjKB|}qgq;`@Ee*.Qtr}8~6oy .޾Ndng۾׉:"ښN; ;w|*Apf6k[H*3@/e-{lN!݈3%hV%fVg`nXmϳvP>aI7i-ڶX`ř8ζoQ> -SM<ƹ;1œ`vYoZ9O<˞HCXv쪽x_vLI M^\IHwe_1,Ěnp#䐬=a5{Uq ˹x 33fսZY6UW 1~K5I꼓Odw'>O [DP9_Nf$YE1]&F{T-l~1fMDyZ *ޤ-۞8:Ĭ|>!esV+"~4!woɚ@ٔs ~3Ҩok\5SMJ{~ Q܀#ViwlrO1wٿ=Mަ^r֠4A8[1Fgb7\̋|yw_hM '/efH6킝BQg;Mђ2ix$sR ۀfy4[2HXA"I|;rhf܈)5گO۫N[@d13'hb)-j;C84[vgqєGݧ.q󘒜 ``x[y39 dqb 46LlLCZ:qPs7fؾkG'6er9PLItrE'jGMVæea>zY|T|\JfX* yiuKK>Oj:j'YsèF#g)K(:m׎ػb= Vy/扺je;Xlzs1lSm2eF]e3~u/9e,R{ޯV*J X k?:˿\O&Ƒc/B䶊V?KVnЕ͎t}Mui{/l<u׭ձ9M [:¶6)G8i:VG> ?V#'Ɲl=eGjrdYf_yhXmU1t}VQQUb|r߯fr9Ke)vdULw&{܄[45CQb^(oO;/&[&LoʷXk觬?w;I?݋m^V fpQ`c])Ejb,ƽA7$l>jV p6`Xx% (mUaC<2>AI 0"eNLU^Xj)h`aUҡjKZ5Ui @ #6Y0z|:|WnHn6>c><jo$laF2W93 -^۝>~ 2V##A q%Q |4NG X@WP(J$\#L <>Itk]:V~Bl[VdZb297 H" o -\RS}xè$cwgύc1x,B!@|ɫp]Mׂ'A+K&tXmY]N@*Җ!rPT<-JPVyU U,RM c8"͇ɮt=ݔ&?mQ{?.i/-TE_PPmZvu4?nQ]nr6pNgx -&#l6M;u)#/*#Sݫ0hxV8FJ q?5h{77y4(8#I{3R!3I PQwڹF;8s{e8reaOYz3iQJ2g; jE>$?{2|k-#Fu,β@97ٻ}CDz .5fcv"/ -{@i˴U+iO^ݭRmRVWn%Z&4.;!1\%8NkLr?GVFjs-JAHxsImGNEr^a菺y̢F]7x=rAI'ɿan/j&_fg"<@Š=ԡe9>:l{?"%"ZBZbFbxńRQ -Qm_4#{7Nζ0sKkS&W&U]BEǗhX 𱭘J=E߶"o\zՊ'/ٚH19$;s8KU9.Ur<`,L,HMeZ7?bUֱԅ.IAz奲$A(h8 5cЫZ "N*{\5;9à5kY Q62kO֦]ZlNC߷9&!ɇ/|sNd&#fAk9UgfyAglDž=Q/$~b# ENi͐zw3O{ ]F]6U: 1pL0"- Ua\e~W6^z,J fS8؜;14׎wX䯐B48PhIwH4!~*LS1eqKfGFMHQ Uy=:+rg燜R4=DcuP㯅yABf11hIԗ?Iu*M'f]8ǞOS3ԫl̘#vMXKut4sYoa+R'9;rݛ͓ܪs?Muk3 ~_L7wϥpq IKVB5ao;n (ݘf{?iĤ3g5 BfB?N˘aB1c X*+F_8;mᴳsv]iu=`4^xN)a0Ǒ))LXHy&VXӍmh1Oe^Y -0ÓV߅j{Uw2ByjZqS҂ctxG Kb7|V _5k.Y3zGJLn[0WQPW9`j16Bju0^a9ߎO5v[VD2opbxGt0L}mӚƺm&]6It(#  8 )@vX5-1=tڲr=\ʼn1r_Vs Iik1MAbInit)D]m٘^ ` A(c4F XdB焳[Pxozv=I%Ztp5K[N֯#|%4x34m?T?T>VۨS5ɼ3'OZ}&.өZD.V"٩)Bc{-*jYXBqQ.ARb쥘#8HCbdٻ6~q'Wj'o[Jk<)ZhFl4'őC fqQ)?HlŽ9LK^+#!BM ۞<:R`h, ܬ,oE[1&fanNś?X/x^<<ÂXNHI#E ~c8;5ʔdss?NxHjh^qʕ*LMnM#ӫZcM9vN5D4'ou^RKnnspMZ0lufay5^1 -h%ar`kP*nϔ7j@ 1Ybpz堞V V_;y~ōӽ ZPG$x8Yؿ #^9+됽|>T,-~c*0k7%QZE*RkV8{Y MQrfjZ+x}].mBAZqCYd޶l,Ubf{ٿ;ԘY_̣ d\둙r.k4#X|'ΉF&K-p"O6Agll=[%P7 VCQrUg䩶a·Euvm󸣪gtLG*dv ][1,bpgJ 6YeĬ(/G(ObFaUh;0υE+]ac_E? RM[|XLXa*IiwE$dU"ovVh؞˻HaӣK.(JP #Xa2 ݥj!eܦn؇(mLP)&B[VerB Iz܎@>eBz oَV $LJi%0oHzݫnVYnb^.-Y>Be̚y)=hÇ݋ Q^Nfvn}xG4fӻes5;O6z|H"hŅ&bp933`$.YGSˉA(2)3/3l˩Td؍4Ek.]ڃ3Gky.=I'v@?Y-_%nd>w7=i0M@ B,8ׅXjxIՕs4&|JCא!bl ؙFd-3d?XatbKӳσ6j'ݢR.O3>vq9$bTn\/$ Bsn%wr*:׭6MZi?M\#lhI]y5lb%6# -욝f[0&ɸr~.Yx j|G0pxaS -獿 +U(j\D*'U QzC(,/'u4W`|ۨ>ggfvk7Yfpf(\bj)Q!/?-_DYӝz&NҮрYWG>l. 1 8p7ȴn:Eo#2]=OӁrff]`<> N^irL"2K!AWNxL]De5ӨVv¾)jرCM3Dߙ"O4x-P ƺD WQǢ>kZ0uD.-\:0$;/<<,Z{@G.^Xmr|Q8>dF9LG~M=H5,3![TeOr.I,ZIdžp%wx,b@>,QU3&Xt~($=V)'fX#!"53i,efu[ڪTe#nd^?Drfo`pr}=)9d]~#jZ]iuɿH{e.f۟@V/FtQeG ᤆ!{M2g'\* b"#t͇֛<8&c^)C4!iwYpIopNnA^ -B:ZV*V&gQ\',A c>BٛU}1ra#0NI) -N0vt2ݰI)1HCb?ֱB'f׋VByv˅<,mRwouwdmDr*<2,CbVra]?'ozl2>&L,) :t?aXUo=n8B1YRf #\TI6Y$뼙i9^!oƷ@&d -Zіx ;TJ7l=Rq5JgGV3#~Qtk]>Xͤ3GݱDqE&+D\7q$٧ e/:ȓ؝ iQsޮZ:JXϣnC/Yf&ه̹h -`nzE\?s|Rb 2uC.ZGly0H5a 3h3e(4DR3Чë])"V*k#:{x+oB뷼v" xcOG6la gkƋbv= {./`%-gQ22t><.HmXe'n[v% n پ%./1A^ ɣ>Jc 69lcY 1ЊHi>~ZZeXx -קa^z+tsPXc9m߭rxJlYy\^#h8/vwOjzq[qv\e+->408;D24!YasbhۍchX֪*PLZA|GT g$o!c P!իk8;EQ[Ӂ_b?țOV,sz[ui\0Uo,:1(]ϷK;Z6C,ovVpq2i6ѱPdSH$5!G߰dZjb6j#U6X/'ӹ-YB&r>eGo 6rS16O\dի2hnퟋK+rOj.~y3?޽g-+3dߔfHlSGn!?=IsVG+?yXG# 3d-uyG?[o8&aVhxߣƛV]"zp'x$'@1 !!o/gP@{e6 b O6y*-[;>J72HY" IsBգ:dIJqDl1f!:k}\S?E>xUX3+  o3&¥!g[TzwmiX [I>724"Qp(#6E%Ir/UrsL 'aQĤ a/Jzkي X)O+Yݔ!Ԓsօf.?{ bPA16?V9ǃ0<ڈEިHS86Y7IrD|5X"||nX+ׂ͖̳a3=/)f|e-Оfѝʍ> 蠸oc\sJv$b6NEXc-A =Z(.@ Ugl?g?IJ:|:H'hMk=zl.y!oVMv7ߺoZ.K†:o#I@kX!0{DBq\A#?m٠cZIbLCRB,l9[FG ;7^Li%,:mrg:k7ȅJ@/16#`1݃G33{xtٶZ i%8?rElI !b;ْe#9ȳu-F~8#׺{m?'xY$.E>%MSe nO؝GRujt٫UVFmp Et|k& 8Mvk7X!/9f K%|Y'vF6#p(IDPg<erl;+]ricJ.bXMCj@ՓY#(2 e%&4liǟ͙OIHI\>NC(ޜ6ʬN7)Yyvzݰ,zۗ;OWXKsm}ԶFFAS<e*ϹQMB.^x `sx\ƟVL[Wی\+0J-L@p0Z3cqp;Q zO#f"R87uKm:Nx?d|Ёڥa[0KI"({>!YMdB좨`yx'bgzV"}uP_J+xv"HT=R ~]>x(m۴1CA/6er%tPZ)tY)ԔTFO/UY3)&'é&é*J\[{Lz>NV f&blÆZjj%qQ".GPW^ay [d| +4[q1(mD,-GOy뱞'bp3yc<.R僳wBϩNʑƓ̤mHeh1Y}Kuc[8HPEV6fo/fPv%,l;6)aYh4w܁=FOC/8g~@˹~y*˗$×軮H_܅5p|;rB)-zNlG,jWlnSp&ͻ;,WDŽe!>YlKu*.U6M0-ԹZ]k.+q jMt+\$Wp͙ڑk=yd]FYZk. >,ӵpqr}$}&vuB u޶#M'4QT>)IW 'BjSܵ/(:'^lxwOnM8T1dV]wg-' fcA*|U b,{eH3$8*-۵쀳WtϋAj0Ӏh}H6 RTթmYӪ; ғX- |Jqj؜n |XYlU8\wρ2qF=ذtzZ-g;'JUeꮗUoruZIdA,޴U]G>%ZlCcwYf ݅,!ir}Nҋ"ٗ7Mަ8/>ͧ.䪦d,!Ҭ~vЉ!??b)$5DZ4?\Qr[p 1Ͼ3>#^#Є/N8oP#n,9xhuZipUq:í_c|7m Kou6"Bo5bqE~VbٰXb҅a|06E>Vxs=YDpl5lIg4$ -$Ԣ`b3^(4du Nɺ}MV.Z`>YR$ZK1ҳbw;lGGc?w/9Rğޞ%yHXHg}%љtpauA؟?O4QO̾{;xQR,y݁b{tsԐI?oV)(OEת1\)exd5L vfwvwz,Yq'Y,m+Y""">EP~_TXYyp"3L4WίћCdWZ5vݣ%^fê]s'Y:]#4lݠė/yY?J@i#0p3whFj{.RY(ÎY-.vo9𖍢7𷺜k[C`\xu&TUb㚧d+uJalV Ivđ[>iPZ!l iJruNQgޮekykrfhaǟ~y:G۲F:)>0g .MZg3}.K;E(wipzx.UfxcRԲf4&6?ǣ]RnݼG#F.75p+مŜvS3 Sda}qlo2.mGQz-ur\˷){$|~>N%Ӊtg bJ2qv\MjExqp6"5J]5 fO r-bgQ ׅ٤gf;4u0mI&+:gp4 OO5.k~B9y=VMrVY?sMNA|tѢ -+˓a}AĂ#[Vbجkx>朄[xė/tPY8ǩ΋쟝u[jWM6-C+٣~g!fT6|>J?`8pB1̌~F{rYrT-]e0y\}ͶowC~ $hUqo:[Yr-B{ .[ -(MoS~>OU\EEvm6فwqr+XGV֯J%-RRĩ;nX?gxkfY8\cah@\I\3\m^ - -Z-jYl1JYE涱4 ٛròelaǻ61n*Ť8O3<>n|[4CƇlٝY W>U6/_ F ПX=x'IK31n}np(BiKhrƖUJ֬N9ɨHX{Y0( YF@k`߄x -NpJiU\*Ity+|úi3vSXĘLiՈCQ&;g:r4wAۻŌ!Pf`,RXvwxrSî4fc+٬覨cj b!(^ 7+M%{Ry$Aаx:Ko ]dJ{mcQc]4ؽOA[$/?Q_8b5u&O&y&Gv|~^5e.!( r_4S7E_R8ڼ<,U7|FHHK$'xwޛ}T 5^Evv& 3+ -pdWjN!tHME*&©2(`|3܂8N[5j]ux6pŠ%i@dnqYy5=õy)p5&)f=eu9TfÖa7r|r|]Xían╳3ffh؇m3wV hx~B])0gO8"~&؀TEori:mr8sjt]qL_6#+v'vT&tY4qbo sǰgV3X|͑vv5x.%"r 1eFqc>zoZ60ER'!J{1ZsnMݙիbk;; 0s*kNJ jS-i^֋mvS4 KAy5[NyV w$)LUl6{+AN;֪_sU˖V[e¨?6j2b}xrZVdd·`[Փ8f<&+şnuK LECqifnmC˫ĥ^w<2i~b,QN9IVd霖n?mtPB< xWĕq'tծg? -vѱ^V"Q`-جA;Gݍ8uyi^|2 \U%>Z(¤4^avv,Qu:+dDcV~Fy"k2>Rel_&xhbq6S6'\4,[,eMVк,(G"4@H}ӨEt*8rg٪Dc]2̗yOl/z{3W(-FۇHVmWs7ߪUeS\$7;px wT]RWV)@L50 `Y:|bLue ZN/[ɟ[wbI⮞l]U|I>~3ʼn17ω8H bO"qŪ?.ضzA<0 nM1~,r9J: smER @2"6;XXIC\`g`.A Wmϗ ~F."&h&閗M6we^E-"➔SfKEoB]ׇ H~pG5ZVC=J~ PА(|.h7WY?.0i5F,=Xl6RE?aԕ>'@;'' q%*3C"Uj'F}2w\L0ߚ<2gc{FK5*֐,xM)6Y?ƧVlKZ4UạX(_ A4mdڞ}|<䡁ω ]*'I?Eu -+QLb -BۊSQ8Veի. -!,[;uO??UXuJd\ij+ӌ2A ^1oMp0Flюv )-߁ -oON sS6k|U]. >$inPzIS@.Z)d8cf`͖l,8q8%zg q5 -1bnҾ6.8{/ -\``V=Q؈v?s1mH.ӐYGhEݦ|Гq/O 8tO)^bN%_zW>Fz_:wMɗ=*v,Fj\ݼC$l!,to#}7/+E~9fxٲ?/;>Yih߆JR=/ݏ=%M~k^a=30ԣdȧ cu{Бlut9p*lO9+E7:]7OE fnhb+3 ٲfxxu?ë<˥MbghjXPMS]2,&Zrڂ:-^( =^ ۣp#jGm1KW%gbm83G 5-Y ´ɚ K82 wD:;u<}÷w~j6hfwyu=PpF+Eʩ8E'JU5)2əB3g[U[k 7+x[ꂻHD%jg>^ٿ ߆o]8#(:!sqD 1zN .*fӆ0Ӹ-9GK2'8c#l*]V"M!M#M HXݖd1/ǩy5ܩ/r藳oH~ǡdφ[M=_ww"Gjoyfg1v&⬵fb鮈 j _ /C's~IOG+Hd"<Mof콸~ '҈2c{?dնZpݙ|^2r"8`~& "O`tBwYтv~8z԰ \+\ r{6h.2 -E{"R%H~|Bt}[/N{PVӮlam,M+s[pqz7Xfdby?XGge. cٟE:g6$~IQXZ_Dp'WeUGUd؍6(Sr]rxnb -Z=). Rm,:q3j㇄C10bcx(|48w^. J e5ө2TP ;Glؑ컰90t͈=!tr~Khq1Oc[Ne#gurg\DPj_ӹ,qV Zb%$s [ S!Bg\kO:3 2τ՚~ fYf 2.6jYͼ^Lm38"Y}aÇlc<ٔ7c8dwNloN:ѡNduo}&rpĪK } 1C!m / |A͋?NܯNRHcaDcbAٕE*Kwnap3_]E-H}-oeLu WJ:XWHR ~.@Bdž,(AV\eNq0ɟ .UAfv$ /i:uӨ.ErF:cٵ{?lg z1U&RCdP_w/YrW߃+d!^Bz^hefm1gZK;u-K~%+!.;G8|8FEu`?ê9#T20ڮ,hQӦ>g۱dY;R&RIҝd?^WFqG!j:r׉dHFpp'sW@ouc-8>vlj:{]5 w\tעl<&ye0yˌx_w&l% nI&@ĝn`h̞F\4ZCiewY/6k7Zk&'%߶Fڎ9!52gvN ,J1h@v0;p'y 齂b^vY%,+%mBb͓qgRA -h!0 mdTiߣ d#U QdHVM^ٮ*꼐>]ج:l ddv5 Hˏ,<'"3HMUҪ(k#<"L~dxg#fŨy6ǰȣ$!6g56m͕[qϜ%q`wxN<VRs7 # #pv!vr/]l|pmO0fkfm, ΧԦl",{)Vh Xy;W};j{sԗP^iNOY?G2M6cE%#LJH7lwS{ h!fyDňn$0ҧ2iz^wZV[:źq&lX^ڒqDo$1HC;'Ԝwh/E(Z'hlť6D`3rnC 8TRJ. Y]\}&XC)NjX;gڷL$c2?&$vcˤJ.U*Mo_XĠI<% 5nv?w.~'\ MA,Ys4 9Ms.ru !QV/)k3L+HlA+H; pqglJ6\xmS8K,L.SYivåd =/9?UݛFOCGSꟐ -%Oꋱ6m¨&9E.)0/e_ |_hiq~%IφG&gM~{$ acTx. Ӕ0xF15\LnߋjsRG8ìlm`=Ñ5Ҡ]7' x pҹb$0^Vq&QϫlNR|s؂tg&A!#fόhXO5gbiw$-\&m7,6ďv-PAm1gdr032Eo'2@A[д6an N!p.oy]k-eǺKA-~&Css2>гwrLQRXlCah{t9EsW;Es}C9~7Oᒖj'M30CթW[r<3j؄쥰1ފ&~ +Uj_T-aLbٮK,pᆱ)H:byJ'݌TF9,M^eK<{+4'b:1q: -+U$aA22Xu_}꘍\ǡTm;:I$gsJgCGY/YYf/LPa#}Q lCe7)lY~48sL>W*q(+V.^hk(c_PpfXaك:l^g6v,pcl݇S2f'[^nA5+퓿KϤR- pGb8Awg&Zɠ1Ub!*lG3H|1"aנ-'+*TɼFkDORY.&5J ޤӔ},N'\Ip+522υvv9݁X ڝ,V/bc'\VGReN/(s,Wx٣g`#~zP,˥E^gyJC-:dԩ!Ql[`LZՠr;L86j*ўq$wlʼf>6,Xs&i8\qU>l;prZIi%^mzY<'m233,"8@ x)A\  Vaqn?A/{֦}Dou4I>BT-d<#x2Nafy#o)ST}i~wP)2rQC'v(Ո蟑V*ِ(ADU$Z)cN@ot깮Bj.B6̼G$-ZfٳCHT0U<&~Z.~'hlN =|6"ma+{'&/.!b8R^tX/ߓ-/aFf:ov*Ò1GPGtw@A䦷0[&7Y˲VpIeJ ))Xp$9XMRɞNIt+i51d [qr|*l5Wg!h߅C2͵[3DKqd6 a`esX9u +gx^֟V'v8].T4#}n4 ʼW ζeza݆ W6le -A 6D1>(۳v[ٲQy7n#4fd lё -ylgzܸte/6Z h%Z"|z$jCv <-O Uu:VOC1x&8\Bh~ijzVovU. yK+BO ?s1o-M27V_Ksbn㟀SVNu֒Y?ٻx;rڴm8wuLg}[eT\Dj0 dh9 nAԔ/YZ@iz+RRf@.(/< )B((zuqk0bC=]ԝWyd&ė!}rWNW-i{qM+ N}ωc|1@ /Yl@X~l0I$Zcr"^e 3j؋NӏeKI~ sd?|s%nI^{;R3ByҰ:_n;J< +Jdl a-c SGՊAHNmRqn06kr6GVsZ2pFQ i$M;(h2kj2x D}'40(? GmBBrY,> - nr*roznNw?]wKj1Ms4=I?Esٛfjc3f򍫥aD/!ȡn[[bbl5Iiα9刃@6|i?Zu[8{ӎ? _PP``O5\~jkEq:u4-t鮗Qtj*5a614;h&GsbWo-^ Z> *rbdE4ظXl?xlJw 8'/v*iAjM8A -l55lbMnn<.f}p6`XUx Oc4T%o8؝Mz']_" ӳmr0ՊѶvR0e41NFaKI$ur`2ox2wZId'FCA`PoBrWK&;fo,~kombJ&[p0sl 5H+e)asjgG<[2ic;6e^`Ku_ R˶j xZ5|7n`!zo]uWYb 5ن$9:lg]R\40qzGWX'rŋK$aJIYlC{ o:tӹG}*ghae覡EӦ$<$83BGxDTJfX&m!JVb#jȐŊm]mb5r匙y3zP U-5K冦,-YÄXnV6}+3lKu!ĥQᘳd7hwDWoi&GsbC`'Xpq0%8nk[ewT-8EW!s A1S6=*I٣\ Hkf&]V 8idj<,JC{|,VYpkUfcXKx]8j 3,m4Q-bPyc7$ +׫ mú֧N1i]d鏺ߗr XlMTߦJ~\ٶXlrGcyelZj.M6'IR0E齊>rg@F5όG1F܄*h*ARr5ЎfSR>Nϛq#IK/E;fəlmHç:.n1-lyO&K~tt;G.df}E~~zO'FRohl>z=;p]a|Thh>*kv,Ij)"I4Q7@Gx[so6)w{ؗqG 0ck3 6l2t# I j7rO?txT,#5k܎I_&>HmRlSuWWu;A>L;7wILس4ˬ4B%K\o 6Hٚ|:+&CNy>vύ>QFDyy㩈W/e.$_V,>L,OŅ@="k-Q)0> q7 C(+*NeŴQۺo+d<&P`97ˉH9)w_'fBex>~˞STs}&A^ۼBäDxvsϒDL"ρfD/|Q$OA,g#d l|6M!I:ѓxm!Q7]LEwY#!C&Z;ņ(h;G  {ѤC;H XjBq-#@jvqg:7bT7!rHz5 /_g%n81(!ꕔ30jP#?'/+=ϯ/+~/]&kr% -ˉU3wuGz?\1kAE)8{6{/?y}|x_!DW'줖([9::jL*l*{ItH6&$S\L%Mr+QGuèsjZv!If^ X5Z-L 4mFc[ k7YXOP!b%}Qdk"YΧ~=?~e Qw|z?H u*(Lݛ˪Pݎs E1D.I,O!?O; q>{Bػ{X&[8 -X,HN@ -/Ȇl%7u&]>ԗ!EGZE>{Y"ljˌv␜Q"HQM ceT^NǨ  {$/|Uy%!x'iAaf)0we'leq| 5$ٳ!fc[pbV OZF_h<ц !r)̫MS]:!MGVI>N5qOVN.^`a&;WJv@N~E >Rf{33|^6/~Z#[1oNb _B˴n6.6|یsl^G)iJ|7o̢=B T!;Kឥ'ԝv|>igTGZH0VW7.* `,".J= zZɻDiZVOl ÿu8 ,fDq@b6r=z{~ŖC$Ryr.ҢMA/Zڅ5өP#b1Gq܃VZL6acl9S^܌!6n,X) nf^hf=#v--qbҤp-1YbtkR/_G}ݛyHlӱ2/l"3%WyVh]Zp0"!XnDw?3;+H:DlD$Μ%o` @]dͥynۺA!h  Q0.V7Zwq 6Dլ}E.U>+1 ɛA.S7d%W"?&,Ő=?e=;$1OdZ`⒦}2q onx͉X&&"9k<:ݗKMM3 qvo6$lÄGZC0L.B Kq7>XLN'Z_y6j\Q 3lc9x)ar0 /44D3F_ % Sx@40yOQwo |wOAf͟j}6>&q.J{qvblbكfwl0 _K7YJSmOR 8LZ?—yzvÇЄ bf;>I{M 9{C2sl8ٸ%GG^ߟamLN9GJɣ\ˬ>fڲQM&6^nprs -3.ɔ2ERg|A& Ek-}֣e-$k']suK5] Alr/]eus\rkO V,YiqgY -XNhy|Y)..~/;n"jAp Ikb|gK]>(*CD燿e[>82,~$whe䏄C^M#'f@ر6d^&Mx报RMys^,/퓺vX;hy2z{?W*ZG9;p:Ov]Y7d'M.zrqxٵps,oM>d݂ H#e%,d=Y?Mz_Dz}NGa)@_'\ |Qc33x;o lQiv 'E$m4MLr31qp D6u\h4ǻiw Ngs\ԩ29YGh8\:qbx$?\)p &Luou|)2WA#L6sN HETT*Xv͝\5(hiTUCp}AKJy3Q2bmir`fQ̷M(Ypre\]FBGB:xdx˫VEuv~ 48D7/gO606/ǖ3bė%B FM' J̚~zUTeLqC ;Eg7ى 8fSAXТXou?R\/Q;Fex#wMqSw_!XɵY[/;'HNϝb[ށo@a|8HM3[^o 7%l9E;wQ?k qM2 ě0T&Mj.Uu -yٝX/9TM~QUZ_NbN+Ω4D~>|gP3kL8mH%mi20#w8YGV-s=Q 7]6ؾ7UmX0|.JmܓVXgy=,GTIZ6$U1 Ҭ}fjQM}QU0 у{8N CDtYKZse_D"LZ${1P>[#TuJJ PXշͰßXurPٻd{8ӹ-xՍ/*b;pHYTGoY|_kbiya9 h3֠ORo~E6'E>%Av,B6Y*>ck껔0E*Y*F'd5&ĥvzwM6/&Y1/ ?#X]*E[0|g6SpOf" "=(g&#xL\IkR\%SdjfD -K[Dnu-yٴrX{4{;ˌrAI&dMբMU|J0=lsE3gMIMᒼl^fؾ&yKrR&Λ /4BuiRb1F.«i0NщOVY A^}3Ob?b)bkľyQb6fe7;Z>x;rw9ErOm?^rk 6G:atK^) _QGf(l -գ&!~^(}VwP#t+RN"؁g.97n:Sݿ75f뿃Ln 듩+e(Hn]/@,9Il =wbOo _kY: aE^Ba3uN-A-.UwY|Jo+I9{O}3dI-6{Uߝꋩ@oVW=g$-Yit[ܧ ߞ>Tt؅?eSs7Q4\K8וd:KI-$t'Yx2Nu֗Y:KA-$JҲOf TI䁗1Us5ۨ˞keduHWTub.eu;KZ\VdۺWgO$vdKbdNWtSHOyr'Zdݗ,쫘,Y˛m)muyVu|6.}bV˿X}] Q]YU6/z.KHJLkV궗T--.qu K[ҧ9oYg,6NݻwC'Y:KK.H~j.ni|J: NꔗR%m/Ǔ=W21?Wşmukk]FPZvsfߝoLYp!qˎvP}C&˾b٬jk7T& $'aֳ]d/l 'u2LY2Ҵ- ՟g/L,Vd]ɲYx K.Y:ds7u,d˲_%ZYddvtZW OjZ{&n;d%vuײwY7N o)7wYwZWodɓC|pgY)jufYNuZdeݮzIR\hIuZiZ]^ -+.]bV\\ݕX[Sߎv/FCͩd;upzGrvdCNF$ѶO:[}ٱkgb/!M`.#͝Xb&dݖӫeg(̈́؅Cdůƍ&Ūd4؅\j:ޮF'A-$/d'Zhu>s}f\4i|N|R/_YOZtVȋrY,ZgN,d w^it8-.6:~ߋ/~%qҴ:?&ǀSfY?tJotNddL'Y|ۇKg]{qɝ\N,%fx3|47"HIystĴ̖Z {d{1' !0@P1`AQap"YɒM$K$KM%$]3kȝ("9G"Q$O7'I"`hAEdlY;g\I$9G#s99"n4lI$I$9#$NDIr9Isg&Lr$/sG4sG3G&ӎ_I$Y$r9I'"I%DM K93͒rdv\X"H=+]5*ֺO]5Ս;"EUi?ªMUBTWϓTڅz]G \ꊾ\dXyiUWr6Q^&7 l?cfQz1:7 -cv*.΋B1&7~)PH+'lB"u,]= nB2UV)==ĎᖇzqWF?E^AHgŐ$4OE7kV1߃P&6ZJ[e ȼ5^g"I$Q(J%^$cn|dE!Ƚnqjq7d.4d rdɓ&L2f??%w) yIC/F7I+`B BUiC$lKtíYD޷=A5iZ06-:A$-Rf2dɓ#jے)!}9|DI$D?:S&Ec;Fz е1\zC88N$5zj觺`m:E) "XQUhtb}Y3#JIa>_^"DW$+ݎUMGՔnI>mnC;Q V(H]XVzs顫ֈ,fL2dRAZUrн,2d` U]hvwk{^YAUt=xI.!z($_ F VÛz^ A|2EU[2?$]5/EY*;FI͐ozoBOe$M)lZ} ɦcؔz&Hd2 4QO*!nNE\Gf|Xީ3^[I$,dDJFOMJֶ$GEh+$jΥEԙ2dɓ4QA؆&:E`E(v-{`7Ar2fABYD-niVdviG;:3AH^[S$duG+ EI>nW*U Dq #I:_vLVITDtfng\$!lBbid$hid*vEMԙR AWUHMHF}FչW7:ŎoT͸1GUOUMbc1 hEkwήX!ZrԽL0J%I#Q֝LDMWi-^׹j" k҇H Q(ɓԞӦ hCM_A"UoDl+Q*q՝0GA` $q!檏ꋢ_buWv^]<^(h^6J%*'KGYc]9~:QXў^jBs^vLzb^A2fFDRuVB0;Я~TASڼC6"}hoHYE% D# D;* XO5ER+Z#B2dmBhCkl&E  $ɓ$ۗV:țߋ$b5S$C:I$Y,Qv*+ 2dSo$v/B#C!E#9Ud\8F҅W{&;J$&Hd1|GC&hl["5]5B^H䉦L~.(^{_W`b/JQ$K2d5ގHu_iy歷fܴ#XtR0J9KvsВhGv%v>J]UFFLY ĝx%L".B֙ 6.|.l?؞ VL\^G}et^NhQ܅`IfL/WdobOmغt+]w`NDXW/&=Jz?*kt3=(ؼH(K%>lųE7Ed;>N/  Dv$?2w;dG՞m TL (䉛flGR4:+ KbȲ4(rg&K'JюEFw V;l+g~4Y6$Vtd:I9 WZjwٚŎMNIjv]fb&:1rR˺U]3_њ  -IC4M-r _Qo0 Nd!ɑJ1bע7}EZD2

&H!YL_G$7ɮYh&DI5i&)csIS|s=B@!IPP",VjT tV!D  I (TtD:]X۹R(&;UC" !0@1AP`"1npf3mO88qqێ8㛎Q1QZiqqaG4 -}Sbӧqg{%V&QQ8b;q:q9կ3x]DTQg't88qNj9Oc{:b{wB!*ǥ .㎔^gԲxQx%xCc5\ϫ>W}o iSYoCc<Hbx.ІݎGN'7x& &TDT<1x(f9C8CǛ1q2|?PH#|gs\D@)/J9TD\0[8j1# }.1_=c(d\CǼ\yÃ8(5w4ryWfPdEٱOb C(`09w\wgEn< -tg㥘'x uQYQLlC#0|gόvqȡ'|ŋn 4Q`C= q ,VE=ga9|ĦyKst`o0D+FB5½Yk}Do& -j: OQs<ouVӃ~DX1qC|jf AD(2\J3ǡrpR䢵1QRx^ ,%}ӆJ''ڨ`(n8S_, F`"Ƈ7u}]+x{O ("(/ T&R!w -jG(8,Yq4ij' lt<5Cq9١{>:xxoB֠Pj(v:  -,oˈE@(!BHb?SF8qPYo̿h*t6"ׅیқ'>͉҄_"60:<(*#b=,vXn\1fogXo`,ETXq -}gOCPjv|So?g!n:\9jjn<byF 0v!jJ:Ma:[iͻp^py /;q_xK!p'#8#4QR%Va0NjPMlֲj!tڣBDd`}7(D@5fvṼN - G a& <S\M7Q^0G%(!"83t"sqxq QdiEV&|9QCقh蝪7 x(1hG1pT y#53~:QYLA[ǒM -<c&8}#;8?J!SX.K?!#80";0X|Ϛ9@+}#3)Extgo`5FCq5Lt`yQw㌙1*3C4(B`8|" &n3"湣n8pXꂥi\wfAh?Hz(N@D!}HBMx74hE ?7[mh-MpYqkt㧙@Y9'c1~Ax`s3 B# = ۭ_8 -"ȈAPq!u 1?"c1NDE T#"3 0(@Lx3Jl! -S9|b*X(}^oB:JGc!fqB>3 ssx3M1ƌ(w - -jp`!"bR)B0oP0MӃTPfpBFf[C)AF.hTX(8x+1КFlagХsSSV~XSy -8 -#@bf(UH`F8ň t80W  E<gy{Y&ݩc*pF`FhMZ9y  vij5nhv<Z}:pMkc>b/ jj!`s>qNs6=c𤋮MZۏ3q0|;0Fc8o _~#E EqP|g'n TQ`7>'ϔyO͎uq́o 4T)EX~m`J,9|BWqO=@f< в FnG r-#aCo2lw= x:4rJ}^AZҎ1 /1hCJC?8#> |Qz9 qXf00 |X()EC«3t~!G9+fP ]َG6lCCV CCEx8s@x1DXEY>(:}OiێpS8 EaSg5!^o7XCYqUf<.G5<k'gQB/T`1o!B}7noM[?rw O g]_.;8q|>bx1ŘRCO1QEO5s|bhs~:CGx0 T8NH!1AQaq "02@PBR`rbp#3SCc ?"MQjsS0LE?O*E?ފb*W)E?OS)Ίr*sW)^r:)Z=fX1 5W5A4juL S?U@T%BT.PB PE PE PE PE PE PE PEQ?EPE PEPB~7hv4(_(_PEPE PEQ?EPE PE PE PE PEM? -{4\v҄Y/gz}j>{vW 7BcO}S)j5Rf@Z=Z=R<7j:}TU@4PE4Q3DBhLn*l -@@lh@&iQEtQEtQ3E4PE4VvhP:ȤrGJ'14 /Dnx6'DO1~'~'~7~iQEQECcT,BtVvhfn?Têi*uh+CtSN#NfTY,\5A}T*P -r((ݢ&v'p 5.w);N3|h*PGtzh#>j3Vv4z(#&4y 6& B Q%x'H2"қ^2=F/@ Q3jSا+@Z=L3ԯE4ê -+;U+;4Vvhf&hfh[h@*xGQE6&7EgEz+;4P1@PJaj#ފas5WuQ/hŠ(@&DУj&Y٢+34VfhVv}T>,}TGUQU1ڦ;ULvjvzE3Բ)^zWަzsN#Ei+HZ4Vjf:=QUsT 05QC'P*(r(((ݢ&;OwePE@S=TE3)U zFG`phQHR*Dp -P)JGS!@(BSaQQQEQGh1&7EtPy+\Jt -Y5OU ɯ`6*z&7E@cx. BqvG>;1w@85wiЍMl?d$Tj*i~p FתhMT#W<δ$鲷NN2Lx4Eڣ5VE?ҥp#+E<՝o(?w 0' |GSKTB -f߇3h3GҭRɪsW+(^.tiVʊcY8 M\T+Z}S Y#U7mCcAk(Ǝ^4 4MBLO5hEs@y'TK0>  t.'qܭqZVnTᱵ x8)/%Z jI_6;!O Ț;C. M3Vo)(pr!'LABLa$qrߊ5_ 41R -xV_ҧouhEIɣp#eڮ[S^vceʌ[cNKR7rVryl0 k\ǹ5ʅr sBm1USknt4gutBJe}*4V+SբR^3"NǿU6+Eή)L鏸 -xNwb,Ymmj5ኵ:Pv@q_? L=SRQ}N|OjQ`> 0^Vo5)Tֻ!4#;(;PS-=٘w9B<8rA$ (nnUCfި`xkbqAUnZGlţsuS*a,̦<6&]<TɅrWSMܥfZS۪>#(am'}Ph~xq}na퐗Vic< w s; X낳ˣ}*T^{<hm}U}T}D' χS -T*Cg]gp=4{iΪ4*/"jLv_eʽJ5#ޥc#ژ;WrqH@sQ=0XIvYZjd|f9'ӪЧ;(H|o0& -̢CuA(OE *lm@X1>EyLu2} ps9皕Z'9"&GԄ|F^䬷r(`ǭmys̊Wcƕ_NOxҞ#UF* QSW -xdttNș^4VI -c2)ᶭ9K Xi -3hp))f9jƵ%Uj>R5滻.,|uz --MNc|ԍ=hfmn>t9L_QyOy`v{ 0Ylsi= )ɢ>]S(jkk'&{y6]]eJMTnS\O%xa7\Oǜ,qj:#蜜h|5s[+&ytSJ?ILq9Jym)ד!~#\T.ǘ3v^{ 3L+0 Xèq5Gv|AT>Du)oڵM+JW̧qMFPT9+uGE>*A[/y*dzvkc! -+) -aWOp*UhlsG(.pִŠ'~UѢt_jwO}>Tv2Vq^<QBr JEJ2ޙ?BL sI;mZ0|YB?DtCg@QЏq4빣5U=,P0.B9\PWH'h: @%D8c 㢄ڨV+UGRzj8 -m}R}l+Mm8P/VvhoL`a+ޅwHq>#傟"2&;TJ2Y٪> A xej2 !ܕh8shѐˆփc]@7S$c?FpB)D:mD1n -udˢv%O)V>ptWShUU_DOPGRix?#Q/%Fu*3kQPe1BhSEh:+HIzuFJƊshʘC{ʵpSj(tJxm@ˊ UjUg82뇇ZV(z'>)9O's ~irO¹'-*Pj9+@#x !,)fiJB*:kD˴4QEZSh=U' a(xɠ0f&hO |c@gj+jZ~$pu&^GGD{9#^I͢s]{No:"Rso'(*_D8%Wp׎xQD7O/[ԃ</rtU -up@aLPmnHp9?-8IiVy| "IT;"] (|C 6HST껗Ujvqz((t,qޢngfkp*.1{pN:A~tM;&5R*NAJX-hFǏ̦`8f>U-GxXQ^!54;Aq;c2o ЄPO 1['<8rNǸ,x˜OvTo5;S9IE'uvQe`NJdrc6XN5%p΢<~㔥Ry٪T2";˂~1kx7IiD{r>?_ܥ<~_+?F#ZV{WoVJHr e8'~0hiTêLvyrЫڦԫ'wr: -un\>8n&mCsZZǂvͪ>QGVNmVZ7,Ab_g=e<!u"{U[5mG߭vE+O1 -M"~O t+Kx)ڎ)ռkx-|qZ -L -wuF f7 8<,ky:JO'>wrczysދG%G iNqVw9Kyf{vmS5 <3VjfQ&4?Eb -dn(?V9-s -ַJ79) iJ5`>JFV-woR(k-PR9<9 .P_ ئ 7V7V颮-ߩ -AFv{eR%7R -xxaJ?@Q^vU1*7tP4+T̯j.5LY咵6 - -@MSӏL&FcC$L9˽*)TxVW3^Ouj崽E֜Tn-qA¼QPkT1LSmOӻWp MQ\]ڠFњ`P_\'5_WGԢ>d'<|Fp?rAN>`_PSS)oE(Kv:ch+< _LvӵVЭuJH >{.vႊ2VvhjH HN4Q=MpNzt -/Mx՝5B>6x5>E O3/D3̜G\v3VDy#S|1"NL޹(Giʑo5X ŚYpq'R*Q']NRPuR;JE1R)R)RQh -o>m24{9)c =օH: Dhz,(:hR/h9*fOҁ]l!i/9YOD=S=H1B:+Gҭ>4S9|*Ҭ蠈ef`WonmiUzBi!W +ʁn٘VU?և^W~ -#];]‰5Q:xGRyUCc7Z9Sj[V譮OkvT -sVl+\t-K ‡_Lʉ733?ߚVu8a±WHVu6>,pSSSХJ!0QDy*@f˞iRtwgw" 䣫JS05|IY^91UsUVз/V\p~˅ -0@TiOc)#PMڼ>&EiB4bj8oѹW,Q/T/g"9'UwS{DdJy -G9pE=Ӊ -\>]HB8]VBF'@@+[oV+s4Vߒĭ}TmTmTmT}Sξ_c}ef0jK/xW%$y| -G\qq,sYTMJ|1&11&?PaBAB5P TUCPz}kyYL:OP sj?L%@(?ⱷӳ+ƞ+4{ߎpQ-}@ث(FYDloW,h -0ѢhM!PT>UC*U -JJ@>#Q sAR]ly}KnQ]S cEtQEtQ51(ۢ&Zj+;4VvhYڠjB~+A*OB:'835SG)Jv%'xG.oOorO5)TxfKy'.w4NJmS+%\Cn^-!E(rL5(rʆ'nU%kQxl(SK,T5o)xe]~W_ao6&t:)ح@~;jWwY uGXJd~$Q8_g/ "wTP2U`zVf5co̬CV64t8x()449YTQ!<ˆ0W~ -j?JY~c}]UU#7N0! -zyw;'+P4?nYxCwiʪGoW\+jiZ =Gu9Nb{Xkb1"q}5kkOqhE?T*o[U "pӲGƉ"Y{PUZh>'UU}ʚ} ->#FmktQ2v;ْ4S-ZޭObo[ÇH!HO:)q7KGhUy#Q8i,:pFDo=3_E}Á\撥z+KUaBc+G53 vhTj8}ּ<3@Ѫ}TꤛU,IRMmTj6j6IOTRK|˪E,Ρʾ*x+Ttu]mSXsUsx \> 3h V+H.F`EZQZAo!0u*pJ|8y{d!J)”SU;S 2:CZz -4sRs*F샒q.wz T3AHӻpChySUi#Tʣ +:N,+ZQ F; )zM -:`TI-~^\ Vo7U*;Rwx"謵eYUYzzq}T^= -W)SΨDb1c_f}5q}mB54B4&t9#|WWDL'U VUg&(YC1R)sBtFeSӎg8|pPUjU@5Qe1Ugwwhɧa|b(:HOwOVy)؇M 0_&w{,N~%?*; if-8]2xi<{x WUj Wu\TTAꦊ mB/rӳ%Ynh{qfҬюW(;2 -J&;LT4UU^׿=ޡ4&i -蠗EeV94VYtL<{ET沧.WCΣpJl%EZaTno=v0Yi`7 ZOrvƃ{ -UvB@ET#QEңTJP))"0^/| -"ܛMF7^P^N߇MWznfhTRSJgT) Op}ѵb} -| .>+u -r -RS様yZd8ĵJ?nzȿdWuS9`+54}զUKR7*^T⥼ +Njh?ޝZoTUh,BZ|02V`sZ>룊2QD "{pP TMPi;_A\KQC<ÒăMG=˽]ɷ\96sWOScOҟ{wވM}KxHQx`wic_05nr\:(_sƩאQ$ӠMvD@GsVYy5YzwJ}YO ֊op*+ U$_k? )ῼ(TRQ&x iҞ~nEz;<ײ.sNqEm}UY]Mq*7 )_˒>WtA)A)M*c~T1ʢP*EEP( - -m)wZQBҠjǢ' !{ 邉r/WUR)Ls@ׁLsP5ra -~Z -`5PnQ|Awv7s -.❇瓰QExnZs5S `8/R!W*'XHRˢF9UztV9iXe4VVIP=(q&DlKRFK5#ڞ4OOORz)DxmqCƨ5N?Z @⥩@uy)s b:)O Q%uLvU^SxN($ޘSǂs֋.xG Ǐ'tClzk,ta~I~Ji«?ẕަTJTLTJTIRJQ)TOTTT}Q*.>7yB|AwUhT]D ҡ2 _a< P3EA=!vS0D=u)Z=Z>hSև4~ -qhuT_{Uru OFs}[O/c -g -Y 1ĖZ >RfBϔ0 -ii#Æ"P1@=T Ы;OD*2;;6G UjUf=9/rVa UjUf\g .)m)h@R;TqN()YB}Ee;D#mhVuqST潟`]^Ry&H{+VA碾'|''wէSz 5F{Ć -PY>&#sZ(FxNģ {|qx@l ꊚ~A"QԄ(%{.*RkΩTtSs+JCOkƉoZSx(%gc V<+֬Q'VQI!qܜHqIƴY"2Ecʕ̮֨tO H详TjTgUFuQJ@T,BLnPn]tWNJW -6(iMVW0gkAՎ1ULE jcA璎 -pMOH;t]FNM-:JJ얜X|*R4%DmU (%YYfXX\'UbV1gf(o51:eJ5XS)|QJt)>I9+dkzNTJ -6:>*tU[[[`'&=Gvjw5 #Pi_|K5 #PyNjk= -s39 Ǐ.pqUpGSDD`@m!9HC5SU;uS)Jt*CsUk)rws@%д4MÀM~ÏEgDmFW8E |򢔦ՖƂȨ<ʳYwؘOE4M >Pgj?Y٢EffˎBG-WenyZxVP>;W_&U|+7Vo@mV6גJZ+SxW=0By>CT>@C)$Ep%m! -}\N]auM**/˲6 >[Hoz!/SSFODV`vu8F<%.>~4j3El+bk.~TLLomymmBsZ7)nV4(P)} -F1ܥ WR9Qjuz㪛Lq¦=*O2urƜԘS*lJ*GT:MT j{ti!>uLhu5o7#H/k0~OG0(<1k?UԡPDj8qz!|jV)ZtN:&(PKUBT=|zxS*¼>-nԕjh軃uI߰o=PGNj'̭2S}JOz~?EA(B5QP1(0ş}kM8و&T5S< <n)!BTnM#Ú*!P5 6EQ5Pq/58a{uWWk - - Q6mSfBoDٽfW_Tê2'H".'`&M2oE|~×iϯ%dph<lqou7}ey(:Sch+9boq8vc``(Nx` -bj7VFS -riQ?4Yu8i-O|47EbBWPiPD T-@Phh%yB;_:ѷ*7hv7hv"*"WuNjP=j'z"GERJ8ؽWNȧvEÐVZ|ӚS fE}9a6伖6 e ۪SYa>CJ'5@ShM쳽h)@>C:-#B"B(OT*UFU')J\v )3ΨP hR -WiTf,*`Ո+mVwU+BrCv [>oexs -*Uz!8[`O5a7S+)wܟt#R%JGR\9i sQ-mwt E$ZhLq漾ho-5n]0k៽tLv'hr~]i^QϧQ hRW9XJ%GtF~a Q{r0? hU4YpRɪ\vЩ} -W{S+mm DTkFt 1pS8WSkH7#\{DM7wεB*c*l 7yGhUh栻uB1"0iDfִ=`UoAǯ8&PZ#p#h:'<|R~?C -P(^?4%{=)flQz h; -v -s%Nq*Jsrx/ޞ;5Mq -P-)-aW ޿ QJ0M nT{gVWgyV9UVYwOEeEcXVItPv+*HrYg\HmVY E}3ڡO%? p -q%C/iQ'S -&$z禝TgUDuP T Q0y&yi4!UƵ~VVN;nEZC+^Z_AVH^=ՂN!Y<+#xQXX5Mݢotko^RM&_ԥ⧻S(B'{5-^ 'ޮa h -vT:A0}$ਫ਼RK~4Nֽ$"?&2Vդ+lj=hɃ͏Gk_eݢ("@5sTY{)Ozڭ+]wuw'pxfVU UUN»AP}B~Rp(=9[EjhV;B%L7`ry(Ƌ͸&fA]vWF8NJ4\TjpgRU+uVzSSLviRҼJUhUhU<2۹=΀)" $eCث@xSd+N#v hWǘƊqQMx84ܜiOKթN#[EϊyRIVg'&s [w;pYm*(ƉD68'TjTKTBǨܡP TBv"B{|O*igB)0@];pW^N꬏j`B*A"s]Dqxura]zyÒusA5>Q2R'׫TD+k06HtRB:>o)E?oݢ<^߽a^>I.$?;#6C4dMzlMtD.|'nJ+woP҉ qVvS5f9W?M?T*`)ƊoE+OziFu*%tP7E0x0")JaW 9+CTB)m=Ui(Hҫ]XjW^YsM{\UJ]TkݰT(Io&ygqKUeuRY>e5U@ƴVS;efw̬{F4ګ9YΪ'؊謧VO'U*J5f VvV&c*!=&_ˊXX̬,Y㶡 -,(lS;Mi=tVUf|5PzNro^2r4VR -.:9xϺU*He % .P9@uYx_Uf0YFȬA "+M&^BO& -12r"Bs`]LOq9|HZhh -_@*g~Gk4A -y7&4vM:Juv<2NEH}y(+` i*mmNN'*(-CG/S؟Zp^4;?)lxvEI }nϙZcZ#LЬ=`>LR7US9yqN4ShimGE?{U8E?hYUnS -z+GhJrVZr<~>徟kZ8J#T4 -0ƨzSwxUY̬UgnT Q>V7OU?Y7t8P::<@ݪq={\ ='| /im]De<$Q"8:)G'ޢ7:,E{#ң4 -(szxE}h)E8U QaIc*˟#M`A֜ -hLSBbhQt}TF2vNU;G*VjnLKSby:BE$Iz'8)FuQTGR:@v`o'Tbk՟(AT'*5_D)~7TaJSޯ4ߵWWJGSvw!;htlUQ1F!TT;3ኘcGFydLUT^OD])PS̕f²0p7hǿΊXG2YJST=#T P5YۢbYY44r4cO/pP*Q}< >S٫:Z#~JV\x7?|L2ǪǪqJ;v*+q>_VӧU/EbIA5t{V֏DdqG+SOE$'諎dÚBz<<3Vg-MZ]{+RT$q<|Fޠˊ?aV`V#oo/;ށ@A>ϊmV2:Jy]7w'ySi>!{F3 ,"R$S/ NA y{w-qR+&~iK1OvtR'zGS='DTGT>Jw?:|JOrܬEQxѯ*7y -+꣯QJApGAV+ɩ$Sk_SbN(#ǵhU;o*bq. -6'rRP +ﻆIybҧ7wp*'ygRӭEÎ:+7wc'Uz$VNx*N(z輨ΪR -h`LjaEC?s.uQs+y+g\ޝ^~TߥO$~tV^RlGQ~UF^e26ӆ$栏Ez(hPM:WVqJIÓYRRR}Ήq;qDR -yk9Ny9IDC --wz;BݑEuڕj:gVwuZPedqN.ʱ2\چw-ƙo܈ 8_*eH NCd۪KRiiS -EhǢ>{^#$kWz>i(/{kC˵Q1Y³5qm~$PwEgf?ң&z&  4G_ɑo4s㐜;5SU0RqLzUFsD)zB|F>`mX٪G47- ? vލw앵%$kNJm[e*"=džq'H+̨Bha=Oh?*/LyT'Ue ->UލR}JP9{~AGJ&UDW8e/R*RtG pV&wjجLn=PU<]Y* .#$;y?j8J6/wΈU4Q,Q%{^\qدBȼ/#/h.ŨNYSOf+CtV #lj.Bok5iyꀯUZ7{rRPħ7U8Q7c7bU⯫Fu(VCmr -j(UA)\0Pgj -Y1̭hpPG=&Eb(]Tnx,85}<6,D -TLJcGCQFZ_1V3W+S*VPZ=-]dZ|:cTאӚwAޚ׏yh޴S}EJ>bS)JA' U򨾕 QA_@*Gc׷Q*潛1Fk[ -1Yݼ)٪{_&_M2y[j;[G T^(}B)F?!a -$ -ܤ?2SO֏7S3J;Uh.#]ƒ5kmyKJƥǐVG%%lB(3x;B^Ӵ_MsO1vV^7ԬVq# . :} +y"QXY³S*Ӑi2?MUEDzO H#R63{¥_%=Vg r w [8".&ȣw#&cħw&H9-*/7Ѝ?P4! -ԖEz xn*RvWQhv"LWSئS)|1lVKU׸?w* -joT*I(pꙏ5-1HOwU!Z9<œHFrsM::mܚŚuGMHMw*Э5h+Oًy+BJv -q)Ɖi[ǻnj2Ny'8ppOuy㗏~ɥS]:T|vwvwkARiȒm(1 Go+l;B*؟eRw)S4$.O =5E/R#>炭Ə5sC ׉;׎aE ԨCB~7ud*H>8Ԕ:)4 -|.h*!ARxef5%4|1z(JC+')RU#Dv'&(v#!WTê7]Oj-sDK9?2LV^ꅃ Jx-ZDBthNꬂGJ -QpWFk<ʕo0㒽+ǂMf>f'iQD0Yƪ>eg2Tߏ㰑h`w(&;JtW^'|$~!urͭVM M)פ]oSiVttpT틈%[chWnr*UOW 1ªZ#;*׫QH+*'J)Ɖz#'QЪ08sVv)6Y -MCjeAXit]{x?($&cD/DDsq|^f FtP~O*,1ϻD0JԨj(ރfI#1LP6w][6{.֋xD$kJsٽU&Ĭ>J(T -V1c'U|X̅0*!@ -Nx^}x՟骳*mz6b;$N9)̤}oHOCP%pyqC1z*A݊Yd=zᵽ -c  *]J\S9潜2z<ח:4p5 #Gvx"zU0b(MO| -QEZqja_PT#)ziO ^Wj@,d9Zc<):$}IRJ+ԯO~ -5]UgjSpJS(S?F~DMPV;P TMP~G~7U'^0@GtTTqS3U35w(( {TêaGT^6](VIJ}Yѥѣ(?:{djF%W~m(O >4l -[GʭJ ^j'̕)T˷{Vp8k&I+34L Z+5?iQT2v k88rA1v -Ҫ^B裨8sٸҹu -"wvEѻ)]{;pﮫ/TLE)2ʠj90m!O^(!}Ff;?pQihQ6`S5KU϶sQ8y/uVXP>:vnoD ٸ2UʭOq6gD~쀥C5SNA5!Ч52v+½n|aO^ꋫd4PM)u*y)٪8vO+h#qqUYJmM00̀6{4vB%&4󢌇r0krvȋ˒m*pQ_i»annI5_R3=現 |A LH-ohAµHG@#<]hwrN -F5;T<街EgEe}yଞԯS1z+TyU tL <@FRF_ pJ{wjvj!ET^ETC{k9]&A6M\:_SWR*L:ԍ<.jxwb^T`v,Hy4a#};2>F-+I/ӅAoؖRScuZ~դaصBˢIZQiTTӃ7@NWܬUTqf!Jf=6xSꤡH8[5h)0$u*Rn@y&Dj_D\ToQFwDtRJS׷9/P TDo#6og0R)55Js셒c;اr*P+ 8VYy(Bm6`[UCAŊUf -* ?iA(}UR7kʩsLZzX1y$l$^Rp;G5i{%#E1.qS1;55p6Ki8Bu+xq_p{ܡWt<#JN 2UeΊ0+57rzҠp BOA]IwvcQ;Em:F;n:<դW|cm<}rAy&޳!qێh +T)#RwO5u!Rhʴ}eL>b~AJvh2@_7aQc^.Vs=Sڵީ1M@6cPx`nT#*2:4#-(@pQ})@SẠ^a^X PxozR3U+RVs$2DOQW8ݼ -gjEA{{ʿWOE{{ƴM7Z#5Upj'Ǫ5nDED UTLZ=BxrѪ\M: NZ#ŠƩZF4^O,V?PVϨ+Aq|nG"k 5_kN8WcS9"a#S)ƊoE#=FjUԩz U8 TS4DQZZ֊+<ԭ>{Nvp+@Z+@Kb\G$usFxkۋFУC{C J/PdͥXf!V8 -_{֩#0] T{moU{PjU9(QkIq>*V\B(ڐ+h(TE)OqL:|Dޞ#Ԯ&"(EDXWmEsO,NGoW21L_2H =nZE q -@YmܪP%b DӞ0W ? vo 2%jKiT TԴ-s8PUmZ+iOo &\xOm:Z<I۩S{ӚWUhf\Vj,ZYUrRқOt hZ)qiZJt*g7+C"TU 1pn䭣VM -z+Mݦ$ZS% h i"8+;4Vvh@mڦ]`AĩMP9;ĖN4RuP늳E G`T NT<'Y}jW'4*-PzZT@Ae,Q4gm -`juܬ&.ZN$&J<Ӎ[Z]Y^a qUfG]qm7+#Y9+ ڦ]<6欣PenoXWv7%IN%H !I6HD' S=E\xJڔéN1Y){7BUjhh嵁T#DΔV_@ƻaהd"'cSB iYƪ5Vqzn-ÙA W -5E|yd)Qk2 Z1Z's%C5UURIExG8QBxiBE{}>de8jևsG!]UހjV5Sɪs0(&y*4Ξ#) ܉=vq܀hLkGAҞ̼?2U aU0@^W*jʵ}e[O>4*4V h'`G$kd+J2PCOi5UsC^ -Q/rT YIo 1W*rLa*!ܔDk}SP -ZPcDMj RTѿurVR_.uV S9L+ԯOy#y5v0OMV{V@<;^4Ni*vRZOSGlޅJBl SHOTNP TCJ{lըЧcvSx`O ǂscoB&PO -û(W5F9m»uw~ۮ8ԣb\4ߒ{\9vIΘo*VיRpަjaOP2DӞ!GՑ@uz9'qOx$"ٙiL!5 Pu՞'aTޅ;Lz7Jemğd#t U*T8g"S;q%>?aA Cxq@P?9?1Ugp\>ϙ -`Vvh/*ѼZ7=r1e1M{$$&n֡Ztn4^ުCEzG|_ʴQڦLq%Yۇ"wmJLF[8 Ә/j;=JQK_=-UTE(g -h<6pWMpRPpIZ|??^\#5ÌG& Sb_dO:&14E!R;eGwP梻 / -{T.<jˏꪀjn+co @"QRP!"<]~MWh*(\>E A.o+ 軚NϲF(;?iL)۪7SU -RRBq'PӪ|ʔpqNޥx Sh_iʴL@.<!)tQ;Ey/I_ܨ%EOQQ]+o9C,@^Y~-E+y.8|c2ETWzxۛTWuOsw<_=]ڔeZGUjT -֛֭9 -{Q7WK^MoDZr ΧDBh=Tdt*2g]D QһVWjNNF3EtqQv@:@ L ;A<^+xH5R U?8kAqS.%8Zٮ»j()ߢ*Iq4ߴjwjZ7*sYԮKI?Yډ4ࣩ4Ck(iF8&ӽD{]ZS]M;^*X:VM.BV_T*SNNלFI}2ODhM{r#p92'-({RSSƪ3P(FEj1VU9QLUьtj5'މTԩ8St$EU -# -h_ĦT:M겊nP3~i>_ &+=p4ߜi@TV V-F_58HHcUxpPJԧRQwwB䤾߽e׌1Wq@<_v*w(C {Fށ+-Gq*ɮUQ 7СiW-x37s:]ƪV%iU|m2`BM$ _nG:(PɁnY4Sf@(̬YV?8Y5ƘUY?Uwժ;*@]PW{4_AV›ܨWS,a^_oi"QJ<?YOάqJÎ؄\|YYwUc?7Z'TJl(g*UP@z5Z4VnO+TeDTA%/r'ޞ9RF;Uj;5RIҭVVE5%P5籵 -@GHOU*ip5ׯŸ"|'ȋYuȨDuB Ve!P}2;~t% -E { i~EwE<œE{3}hy='s;t*֊V5mpw3?>;q;նU%m[cV0T(۩]U++[5 z+9YVOl/W,k(y2Տ -)%S mJRIi\FEObfWESp+US -V7 +Z(\7+3P1Qju<7ƪh;.vNC[}꺻K$>JZ-+ѧeEaV^eYn}=wVKO3Eg zt :DZԅ,#D -a/74?]w9S ފG&JcB)BAk7QJBF*O5sN܂JX'$mJHjgjyou!4%DO4j)EFj ;A}kpw -SH4z3oBcK֛tVyV9<ՌꬣQ<GE}%@.O|SU>$G';=Y]Q61or?8p㱷Uff6HwCg+۸#,N)8*8=sM0m`V9ߩZZYi\M RUQrP҅)v׆(8oYTB5U53z* 94Ҡ -]nkkJq>KȣCTh74mЫ@ʴ}e9#L;EAܭ-o+GҭJ+UG.@2זƁO!'ׂګܛU uJ*w -%`Dhp*~갲袀4IYE?MS.;xs׽^ʯҁ#?ss!k}*ՇO:Q6x83 {T -Mv⬪0+E:+A*ST_z^JrϢ͢LOVg7pTͧDꝕ|NƊH;ZF&T?IU>+D&#pU7'b5;5Ok=*T=校Z?\OU4Q17P@w|0âsn W0+J8T,\s;M q?:Z~?YV)px@S5Z4STpbR*_´+ԯSچDgPUSh ׂ6jMjߕYiaJ()&MNqNCO?콢p7tsYWN:#NvƧ'DWy*/RӻnMZT-=BgC*ろ6Z)VP!ܦlo[kr$A0%&h;<4wԾ}ǚm+J~Wku,TUܢ/VCTj@ -UJuO2#L*a>J2*y'Ej7+I+FW8EDtZGKRTj6 kUQS@V] -x?4歑["d20־,Wr:)Ίg"I<|p񂍧FКF60[Ǹfvt NxCVRqQ3w0և%>=qOXOw;rǪtz( E* ;#(L-st;#vM[]Lk\*USX$!F5Eg3o *Ho =T]?3iwas~Z!YtӲQk䇆(}T?E`ޤ+c~ei*WQϢ;?ڧ)OyP]xA2O*SR#_ڍ#')hRHMرPeY դj6D v@D])|N[M ZfGZjJ^|isMhE饁٭juNq#*|(w(ZѮn\6g T L`9e8VY٢hn;ZDNLM -Q~>]DGo2FWn[|CGҭ2)|mM=IDTeFpRj=䇻ƘuL:JԦb9K*;L(j`/HSҼ{11gJzU$>U'/3/#ӟ!j$k{ՎbgW+9q =U؇<_RޛX(8$$q4VXIKCId k'%#.Ol5%SوЄQ4 -GXAB&><UUF1P7D1ۖe'la:&֙IĔj{\p]ÓG};[b9'Q<'wo;ifvkI5܍1} -}b'.C2P]P6MBQBp'k`<܊UT.&&A(ZGPjZuVg;umg+ĊSi[=S4>%Фy< D"(L}S=E69!@*oDU|EgJثO kJ>JQ(m>#kS߳oQr(YmfNjUjUg0$CW^c!W ryLlЧ)NO_בNPmi 4=-…B7~# }hB -ЬW E @uPz?yǴiJMݡ@sk (6#qW:crh -;79[ʴ;Jlo__YHQau7G'Z\ze?:RTp"kXXNAYC(Y<@Uiʉ~InU^1EHS#U===LJ \2齆 }7M#^˰ƝL`?U+2\.ȅ?Jp0VgU^ 51ϧQY~p2*G3B(#pҜ7ϲ(;kB4FxY{OC5O spGM)N 2taV9zk|*EL$WML^j@?+A0j%FaTiZG̭H^T>!3D}52B*Q抵HW?ec$QmJAJ)~_DjvoVLtWRO -x  -IO|IS+[ AP}gN K# -h(QTވ0jSk -Uq݆HF=2w&P~SKjFjs;a{Es*'+Ո?LwȚWiUPy*PNS[1NhEh)Nm.sNJu2 j.CT>CT>04m {67h 2V6gki״3c]ƪnCV+UhM>%<ZLFSR*sUhLJ1\sAIP}CT")Z5a`cVv2#8DښCf6>vKF(NajX:88C5Vj,?%9'Tw^k\iԕ&d6p"Kvjl)Vl -fv -IUMx -5@CԨ}T>@ Q[]@a)r ڦYp8,+#$_Φʖ*r O$fy).sDK028U# -rQ5y!Y+ں+R0'P(~7xS>1*bz!^'x8TMUjBzm)L}0 -5Vf[Ug i+3tVp8"D{۸2jN,JG Xh -ss]$RN[qEOB'qVq -*5jvxqz"}{FꧏUiUiffk`Gͪrw.x4êTgRAw<$V`,&ؒiz"B|J~u/wzoOJ⢾F:qGsTJz);)*W\v$)h8k'}y~G;Sz)]T9)跚GR: EJ}NZ)}UT5PAoU:Gm`hR$j=& z.IVo/U)7?B7@8(Y 1hShE-8{A{H|Y:)ƪS+GԭQO{Nq[Cq*`yn\3x+mp*LZ5wE債)S//M790Qܻ璃EsQ;a;U+;4Vvhs Xvtr&zlgE^h)U&5 -2*w VE6<ԃ^q]ҹR3S- Hi k|rA^,~뷐Cl?iʴP\jUoV*,SÇ-0FNhbZR;Bkliq8wQU:UXV{YiVq4(98Q PIhX|?k5ARUx=}2Cj'(OȚGW֋>À4;cKNziD 1QH';DUُ@?˼GSȦ ܉]'xW% TT`A54'(Nlb+Wl J{OC2TAGF}B#e+u#dSM봾 '=q4I֊f_[)y,ٛӀNu? !=׷UJ6ZkN;@ 9E)ze+ljim?dU( F&m*ՍX=UP^`\1`UmO%?}mݧtdN)&}x^.>v^{r*Ww(VaOԬj5PSfs"Lnu>++SYVqIޭ8y&ѵMW%_{w0Cx(䲮v4!1); %t#i-NM%٧0 kxqMǎ]kcAC .S L@zY?IXh-\y$ɏr2&)+YK_5%XTLoW+LCp=>D*@tO*oT *W+3Q:'?OR?rk!Z:h⃛Oƒc!O+C>MSO}iY[+t"ȜM7ˈQqd {VP7fVUbn)Yf6ٯa+_wV5eVv\+(Vqeg*0;Mӿ-!K4DqQEq=j{lrV1cnЬYZhHaMahBw(mkƁa'>Rq=硪! )UNR\X'4ަT6lAE\M2pJy^nӒ5SSGA41%hc{0j#@ΊlOu@ٻżW?}UK5C}w*vةu!5eiE{ ݯw`vƋЂآb6ZKmw;[dVuV 9ckn3T%jw -P|cUǝd>x(ޮRꭚ5Oh>j7x-W7R=-R`wHR_e_hcoGG{SȕңF6~,ڹF~ThM>/z'<|lu8(LMTj-붝Wȋ.sdAڳi]v4hMbkfmdhneD^!8'Hᵽd480OQnM(JxL'J,7qRJ [l@8Q3zuZi'zAQ5Z3mc EC0?YƪϙvXkZWEeM{ -Pz'Ip鵕R.;VJ,)qzIr= 1qF -dT޽s<׷)δ3|VE?@OVv+2{|ʗJ|zzdhШC0*3z*sAuFY7 <ʋBjm>-JO5?QAU@[?3>JwܬBO507ك4;A+b)DCZkǧ+΁[&ZZ['ZWaMxu}d y& -.#Fnm^i/Wa3;actM2X2cB?{nRW*9JCԦM4괮e~OZ+8Yƪ&Q2=x/ff߇r\͹êaBB`=O ps ~O+CJ$4<µW8[[M'79{i.'*I! U5*wi^kD˴{uU51hb em,$êb(N35R+#P+G@/{>H1j) -[iJJlmU޿^9(uH=F鱭>I>*tRcP9SIHOM9 -Dl T7)+9w4 TqPbpxe1cS)ð Z v6kaW*}*C|%G.oۄxco@Y+@Z_֭* SdV5Ҝ;i>rXw,x#yO<V|LdگyK$ʮl=*bB2M r9皳9^iT4^;(|oU+5R3.(B0ZmduT;>]ƌ(&DExw{%PlE`֬`11m(8P9yjp - -9[_w4-ƯSx{W% 7x9\Ԩ)˰vvAY⾘\]<nTGRkD˴4Cq;sY)N]J֪kײ@2N.;%v9#^Q G;gAFqC~NxklYF&#c~A] \ե譯VSU5|y(UGwʟʟU~UU_w -?R4êmpXE cEFU " &a%Myh%JЫDکeH$YMf֢73'I/L:Ϊis_g+ZLp-ʩ -n=kNc.<ՑBE8 -{%YTnj) -镧W?)J׍vVkRB Z}TnHE#Ԓ'?#A Qէ1UcXgh -79&oq -v'[2 ;0}nhGhIUjoJe<?T"Ut@?J=p94*&9{ѩ-QqE 9éPy1%DړQ -ʎIDz+cP燏98Z]_™wrSQƽG$ -5 9;B*y -6*sM& Ԩ}JgjW,*Zxn)pԠZ7m+0"+ĕ?U)n*1hS+Oҭ܏ =m -&hvB< ZʛЧTVPyǵ+dګ]VV#2(^kΟAʪ"~"65 -) _=֎Ή1PT~D, -V%|\TT))gL}UEw{Ȫ0 - -9 aw=F' -4-:P9YUGt = F xR7p<_4s<+i HxW0*9ޅcxÒȬR 'm*2׹7E7V&ӪyGwǖҏ`xOn¾DO-4ޭLVcUM~=L.UPzgj\`l~@mAw${1ڌ]G!J_Dw:&=6EA@S+TǠۖwBf"UZIPPS;2 ue;O:C>dC54?)C˶ -Gbzmñbck}l^-TMhd} ƶ[ΊU[+l[ծU#b7̭תJ<ծ_4Gȋ%(Ew`TkQ6'-QB4 kjkEuSE,A`1^#q\܏T|20xv9JԨT>:;wUP3EgEgD Sbh䦾 NRީ=SiTG ORo)?f= Rɪԅluy9Ju>iD(ΥD*Zly+D.i춵4TTq;#ŝVVj,LEW.^pNA{{,΅Jt)ODp?/PTU-U V_4qFԝowBRhB'^u1;{VU+BOo'UV+KUh~wpl$Q=Br2ޠւP4;kpBO'bQ;]qcɨA9hyΘ'H8n(?T]Vwvu#$,YE88R0Z Vwv{T8C5Vim4ġ5q.77 o HvJzrSk+(ЅgQ)ZfeeTLUۊvA>*-Qy|R1ABUׂbnRiʋ[uLnȢwȢYݚv~`YRqSt%ZT׹m}1Vօnj+{tV^OHދe;U5u\4Vjm;*ƬXUT ݆_z8@?gmxD@k(E_W -xEJl}M7%1wb P5@?gfPv<Ir$owQvҬPӡWڦr#jOTAd"Ga=LTꧏTnJSzòaGuߐX7 %g=Si60Sz)/mopͲx;ݩk4R -)]]v|劽z+W\軵5sJ!隊w#RE.$SI=z#"wt}ݭ2FIV|fn,{%DBhM 2*=T,ZYumЭDj|}E>5MǑ -_%f#Dav7XzTfZ >EwcUAA"=.9iBX_ꬎYI&]>+j>7  2"9*yvNeثՌ'ԬtBbb#opDH-+.U$ V:'Tx[Y v/J?<ψOʪ~d^Be -LgTLꃵEnM9+ڦΫ?2QI)2sOX *Bm$)K)Mk. =qKݾS:@uuR54ĩN3M)ڥX7+:!ЧVq99 -fNLxgf==`;F/!8'{OyuqJ'w)Zh=';HwN>Kܚ@W+ފ -}MtJ)QnzZ9mih:PGNVvh`=ӱ=W^zsiϲ<&OkٖrNLꍶƎJl?*Z/r]楿{ot@ߖтwf -0f&׵uqS6e=Qqp,*C5S7R^0ِAq{a/=h`uz4NVFjРm:evJZrk5S sy-Z*ii:R`6+x4bwB6eؐ8pQd'LDjKFM } qhNP+뜊vm)R=eǵJLE(&E.ZM1Y%Ȭr+V#ᵱ!LmR*}2.״ c:;*]er1R}AZ*̂8m}㻦Hpݴ6CyT -fЫEGN̮w-ݗU=ӟn״槏Uj4hrosj3TNhw4TuB -_E!<ȩ ;n-Q<OU*@|Xc{?7Z\HC3 sOzsӞĊf0V;k;*Gtq1x^w_EtM -+4jQx Kxف)k]AKWLi -lwR vuLyr`w5g)P}Y~K]rʐQ<5?Ԛ_C>p{@w):cT^j=SRo2\9_})OVKvޥ8~-"hw"}$Ql 8!N)VhBGTWzzl*TفsiTKuL:Ϊ3N&qf*Iw=i;A-OxnmkPVG!Vbwk;0*FIo R[w' -%9Rf>,:`& -,H;UET^ip*V5hoJϰCLtOqOv؄9܂N*sDgj++'VOBQ1Y:v8!@r^ꍔ=|F'˜%wM1#mpM:JKt -P3DG%tOzɢZWvg7a kil -[T۔›ZqE7{TaSlx<|Բj5RaLv}j4ǚn {bqcSBcEvGehS5C5N7UF~ EOWb2e½y h.<ղ[ߩZfI)l7ޛ"l7OV -w3ZZtQzdwE(RSS3Tv9(AL~?r8Ξvec -+@0Un.^ۧ2=Sk>Ugv+,gS5p8WFGU.Fڧ;7>7pQ&KӌT-D,Qs^q۱B*ǟn+橴/V*60&}ciA Q%OFYx]C ^uvͅ8cW=ViUd0 465v=xʭ9,F hf;rSK:|m;Rx襠西#S4%!FuQ"qA4B`zui.d3ak.e`ǴT`F:'ʟOjS#QċDzx4yC5V -T[EnYmFNmQ[ᶂΦ%Ph=?:{3r_Q>B?ryMo4}wT+CW{})]8^zNX7 N0*+'~V:^0P*m<7.3G^5_cU0nEIާ(lv{#qۈUdey⻯ᣚe'Us6@2<ա*_2{E\VOIi5n`xт#Q~]+ƝDrʹ)<ӃߺꞗwWr0;rD5DपYΪ;/+1EBӂtQ7D -!]G]ՖJ,SfSkZmȅ tP3EtM&)]UxW5VE%Y&n>An%f ,P7(ݓi Lw+!G=.$)ܥjiT(v\SR(6x+OX UgL&? GQQuPJe+UZn 轪b]ܦIHNjU=Tsm4STJB|&FKpcEcXdV9U8d1cE;?y3J54Wa2Ipm;xO'tL#KIh~Z):Xn]a -4(Egn!)R5ޅISGB?E -Lu@QiDjT4Sq3WG5#uR3U35S3TGSzj;٢U|ʮa%j&)^*@ CVg?c){[=iW)zTn?ïF8thBo8Q6&*-oAsRJG)|:5]˰K |_l7y=3X>W -@#eq5aNR+CՀ5bZ;ޭ-jyC\ObO4êTGR*:(2W -l WH岾HsG^*epb62J29 -N{a -5RΪJvגs@8*T$"f0!2pCCEuQSoU@!@,=9l;PW#D4Q(&|!܎#QSlSl:l?*#8=E>'Ȭ$LG'6/ͯ;F9!Ƽ {irXXUkp :'Wp*YuR˪]SH{%nv{0ܭr꥓T`mqᶸI3{!g`K 6:n0uS؝qXr Mdv){te;6OrLDz(cSk_¥j^o)OC~^ԂDJ=T_g`k%C\gexlz4a\ToE+R;Ejp›rd9VO7qlL8`(GJ_& 2;|>̫V[_h;AIuLШƉFiUiPŸAZ_[zRx֜F -)R4حzǽLp'hȴi7u< <' M^* -װ BLFz~m Wh&O=7dtIiGT_NUO#JQs^;3O>(4a%h+<@2όg;duXq䋁F׆hq^۟ @<{1qڨgk~0kq1wx0[ր7vi^hS1TsjIkLzMr x*c欎XOԠ,؎7 ̫)u>vև*)PaYO̬Q)%;<MTSމ<e?24*Ƭqڙsر; &A(Qa.[OU!ْ:)^zC -TWfEET>X* Z(Ɗ1&N<l #ZyL2P4OTB:#Q]6՞J}JuPR;YY(> ^wjoʡnˮD;sO0PRk]96Aty&I*(1B˻YYDo0&'4j[ܨۚjBZY+K5RD0]Z"E9+DƝ@(Wvɢ2hvF܊uӿ'kcx';E#h%c:V_8TaJKZ~~[OkM^B LljۑWaԨJ&[ZT5JZz?QSWW@ -=S.?o)OS;2\}hQ\VJ|¶+a>JEh8mcVVU5i5Q?PAGwϳ-(wF^Mwu*_ڬފZ()TުK#i5iEZ~GRʐ] -4Ӫc`)څaP5BGb:=PBB;챵fh -6ڧէ}hfhhC%hNEdhRעTI -D!jE!SԎAeP ?MNJ#SڈDvlAA6 D"ڤnVj)TD])QDPTMA+')RHQ0D֍D{d <]999wDa0sLiMh*!E0hP7UQ([ j0j`M +"4D'1S1S1R)RU+R;T|FA63G1N25^ - OJpR Y"Gq( !!8' S6vڧ -mΉhzcOP VqUD ЈN -R*GjSν>jQ5:G‘bCFшA 8'=H;5SU;5SNDhtE+NP@VqUZbc \+)=˜~W~WvNWhm jR% JST! J&8@NE!O:g1yv65D)٪ڧ -oE/{W^ר\:?@5P ShR)ܦ~g~W~Ģrgnh Pc-xE=LTI_$UBZfVjUA>6 jfڥOMzB R;TI}C,!1AQaq 0@P`p?!DP^~vJ819~|Ɯ;i!ڟE')&9RcgpA29a?ۂi^v}iaBaF=.0"~?X?L_p')?ƌGgs87𕿑?b'ZkG})*_u|0^%B{'aJrigs> g29^?~L"Z|Z{n?l[ÎA)(Q -ڷ,0S%TV5xU6Zx4 Qo9F #._hk<3k)7b -])D!vYPcN z51ŹzKt)fT&?KSKe/Iel9feZr(o r-\ۛ.AGm2&c7뎫:Ρ uAFV%1VZ2G(C q{x*wƂ:|.(!E ji}S%y)Z 3ipjk˵Lx3cE_4)Nϴod_/d:h/dӤ{A_%fSg͚;aʯdjmSXEw/4ԧC9ݗ:),0v՟ք㱀s (%OgQ -u΢tnL<)3.c5-sLk?bI58 ~[-'s|W-.\[--sδ'Ru{Qn$u< 'ZvBAȝ"a8} [KtڗN:$ggcoR<-hMm秤Va!#Z%iwEߕ?g݊h^IˉI~ ϟٛ-1~#({n )8b _:r~?|ȊoS>;^?H.o?ϝ%:{T%<-t"53M> Ex ^<+Ub/<0WaXZ*b -ѯY*hsj];yNtC-bQYupm,n\*虣{٢|u'= 5_!!& &p4SԿ>xDIhr"]tKy˗c٬O"平vrY'_/zzKc.s5%M33HYw;dtO(=' ?OK<Alt+b#W?c3ڼgd?XJ+lVKvd~I YH8;u'? qQ f5'_cN9~%~ys?EKb1ly*SLz? %Qߴ'+ϴF:io h~mHΝVu7Bj}cRrS=d~y~XO~-}`nNXu O^[3/|ϕ -( :oa^f~{ -&'βuz'Q: o՝ge%᱘ ,`#(o*$#R'^a=& Z[uX ̝t(3pU_,8[q> +Rp<_~?ǔ~ ŏ? xrx<|ox~ -rncrE#xϟ+xW\/~+x_o Nǒyįʟ|l,ӍTgOrSKTǐP'!zۤ9Jc:Q^e -U8I`'-tGkHV/D sg^*_ r>#>[_ =yr<1y+x'ヷ - |H&5>3112Ǥ}w; B / -y:QfR=,7o/.q|17%E)v%|e )W@ki5r]`hi/r\NM^<*bQ)Wzs݈W@Xԯ J3g0{Μy Ϗ/I|zprJ2ˊHpφ\i1Yaa ;Q?_I^Jm261(J6̹ɄyY ZBn#ޘfjUJ˟e\U´OXc18)pq/ɚ%.֡&)lGX&EC6h8BV ~M%CyYK5 ׍awk$r7IRB -^ QTI;d\KDR>٫(Tc\/J\A|u#p4R:Gv;ȸpg6]Ǡ2Ko,kj@!;FU9iTa%[bwW17Vr -;{CE 8mp:^:T2l W .^Qm[ʼn50!q@aguolciV~R[r,ơ]7oS˟Wq-o92,mֈ"J_j-X0eR~ert$ћ#3;I Zr!Sh :KZSjMs%(_0mRҶ‘&'&c -9h|󗤡h].;Hr'U+Ht⾾5v'5Z_D<pzJ 7cPiY˩n.!L7 jS$ E\-W^,S -, ^ *?3׆D\@305>wbQlL^cf_qoAWۡy.WBuM3qXƥ娘)&rO:*sR׽I8Na/hw͂b)]wri ׬@%V=%F_(f YKc C{B.xTS -J'=fZ($h!6GWòUKf?_[1/(ҥ̫jxgt1`dVv@Щ_f^v4|`xRv8 (_D S)֩6NnqmM A.!H7F-*j2yg.t.993l(1^n2 mռ^V:`R5GqAZw\R6kiżSՃɠO)^IIyWiTρ<7-3f\iC~z-(("991Hnҳv5%*K35+ 95S+gIR(Yj>!A:xX1;WG6HnڬsieAp_yG)І̮ӸY)FjGQ9~N>:@ehgAĖwA -UUSg(BIPhe|p9Z`)M@FƎ˴ex[ n6e[>N?>N?6)t _Xmb]9ӝt.*iǎQ3g߄?W5JJh,z&Vc;J8 -M&:vpE:E> bJ!ў|]JDMg Dab!!S5*_i>䁗[k CZN:S;ඤSmbjq.Ĥ/Moׂ牿 -`-¨YiEO'+`t{ӋP' YLv%`s.S&I乨Ф|ozBzFppprMSZL+Ej'9H^ t7^g]\W2o2ܦ|[5Y [K>2{Z\e[uu_.,6&_7fŵ,b>zp×cQzSIE%) wNز7Gg4%n俬WAbѵSFdsϗ{[;\ʿ3{?i_sgyn7=v%p5LӬt^]0序%oN]>,/Hyg`hf\=HlM .]]fj+o۞ Gr19ɣFO r _Rsi z"u1 }H^̍C <36_2)nG\࿸ekQMgʸ -:+0!ނ}SKǺ0xp\vf)9t©S ֘lux߾/,`hoR4D5&~i_Oz ܚ9_q/'*i~B |DO[/y_C:us]h&8かݜƵ4ӹ[1U Wn"G5%7՗9=P^"TBMGHp#,Ȧs D %g5 nƦ=hFy6PO|DLtD.Xg#AЖg#deÜ""\^k/ǨmhxmWBZki-V5;9jx4p8iZKU)z0#5p EY(f^W ϫ0` a̧iM:"`ij^U_Jrs KbJn''eH>_P2ק`g)(Qű}fzw̧oqG&?? F.RkbZ7Ӆy'ZBmNU%_K-bK!f%tEO=n u2:Q2855zd^68qW܋}/h AUAL LN^ݯ4E/m-0,gה QeˀNGUsoWf1t1;)ŤӞ ~mUKS ~>T89@}q -uˮV3s_1psΤќ(s4PMJz{O&(/|<3f׋F.&sD@9x/ȫ Q}& -s].I>`of?y-%$^!j|'=`YPal?d/5eM'G;RHvo=@!, @]P#׼a[YjG#C[oU塗\AC;w: U W 6`5^zuj5-\}Ԙ E46ބսW7&s[Vb _KS f/"eIMO7Ћx =h[> QE-n*GegQ3E:cͰHhu}zf0:/SFvt$:6]7d!ɲ{k <)yPÚG H'(kǯ~i'A8;SU-/2wlFjR - 7_dq?p 4.wWGv_Vڒ<X'3S:r(_^Ŀ/d^\X~Q T{E '(QBuY!7&i֛ V$gPaEH5!ό ,tcw<$٥iũ&Hv]^>{SUؠz={ -CñẎ.t[e;Jo2Z4|x[ q%);^]Ffsm+ne8偼%#I8J9k$}X2Wp/f#bm8oܵ\ex@q>SU~U)º|.?S6x*j31m/Ù$40F?S8?hy'\ʂ37ڏNhnh9ZRY]ʈE|&F8$\Jt\,ݬ(W4`F2f 1PuW!ޜ?140_~S[HچoփJNX7_$[خU /2Q{wXv4pNzT_K(DNT VpTMSFxT[As6CR訪%#F@!B*3T MU׌sKTI^|8>:Ҩ2,nDpyO}u| (i -NۙPJͯu&"22rDө -oj(4Y#^üԎ !\^rCHjMMk; 3ޣUPa<.E`U8PS\GWy^C*kdK%+~d."6j&6]~/p cٰ1aZ]*EMm-m.P\wNmn ٭Pih&]x=B=`20&EÎ&V%Fhz;ܱͨa`0.2Q Aw3FXԳNN}J,US, m7_-}幻u>kF7l::{yԘj oCXx/[G\3Wx9u&O[DʜIK$a^(=s-4 1eT陇5% o暉Fb2T%UP*úrz”-CʷoK}~ CfH{M8:R[ QSԩ4ע0K3.D iַG&=J'mo/jZU~]{nsjǖl 3)ԍT7-%pn5TvC9$B߶%.KIvBL@SJ^%@ -u[MTZ09jP@d;ưA_~E|PQ<^]فv;0j8WۚKRwzC]#b:D({ [J'fԚ&X/_I~xE郂XRptw&_^$) sȹbmO#l  -~uy?q6E|xx<@7uP\(U@6b2\U{Q% -Ҹ |d|6wՇ[2n0 -5Y`"vE7Kd[m|㢽ۺx/G.L%fm2vS)7rf\<Ŗ\ K}#tV <8)̯ydV͕X91b{Jde沼NoEN^ -э}m[Pv8?fe3O 3x QtM\ANI+L,_Hިi7ڀsMB9&HkqAkFj覓 OC=a Jl!0% |cWTkQovv#/jUk<:i>@\/IGfSOCs9 )3yRu{;A5LBpUzef; qS(,6DML%Q?DO'H=}N x&wHwbkl]URKsdpݿC +R\nPz1f,¸Z}A:Qn|sb15ZPiJr'NI }/) ǩ|9] rzr~  Z"JQ-|Tz] j+_uݒdF/a9 ha:s97q ܎77Ȩh6n4%K8x(g51)6Awy믩"YAWSع2g#gԖ@p(~q@v,bu\|)xO3Vf-: {c枱T[^.4Nݺ>S -1vE}JL_Pm)A_%59Dwf7c> B i)OD;p{m`%|y7Ws]c{3;>b]ݐü:|F}% -k78/KQYuy:񯏯xi/ O~OգF U#39c W%g -du_dy&avmSuTͼaTv5pFN|xHDVqDo:~ -<ʯe9戟Uq}:bE~+Y 7Kj\2kb!X=5tʾ oj`7ZPW&:@W|A'CdVza^3]#&yk 03jptfQxH^rR} mtJ05KvW4CnTx;Y;ϜM{[";AP{?DI1lp3iI~2NKv/h_i昶/'?Ȣ!`<=[ɨO=[8D~K29oOR-j.!z}ЍgRs%%-_ 6oyQ@h4VXgO˘uKƃ/U u t-a  9D;M='d)s Y錿0t߆#WC -v`f1RkDIך^ftDzr.Z:B| 41k77xCV6Ъ;gWikCKIn -I?*iMcÓ5.qCPW֎Q2o,ޞgJEMP``_'D!¦/LPmה|O;h^DXG+B8W& iU튇r%W;0o2s;vf#|培񺯗DyW'￉7\Ep~9+ȿ ZXL~_T ʚPd%Wuv\ś蚯24}&n* ;Y|[zZn&LP mg0, ȨW .h^XRR.0>%-^?.Rɩ/ /-eW%j k@Ayh,p. -HIiz#7ҥ7(] -͛%Oh 3ZLX+T(ZeZZp=gta[:Ko jc}Sf"SLs*$4\+ -fo#; 3 -g   xB5Zxjg>,1Ua\.J!; 5yhq†s_W~6<Oo'W:nhm_jeRa[VHU-s v!kQSdW)k3yA{yfeoRXKTue~{Lyf`؞m8WQxEzެD2i _^PˠmmAm2SXPnN=2A#IP+4msN$60 .;LZ\EO5T<&g"M3aVy\uK{{;[<}*QZ___CXNLZNt'BtB iYZW -Y^iP -PO;m_(*g UGBZ-nRg"|;F+SH X>7K5Yr=૴h|kީFI[Ɵw} -Ď(&z£ȁGM{yZDfx]^o˒*NabVbc톹ВY? rs.2P/&|`X%ǚ50Wtt>wws'9,E}*ݞM?i,"V+FRn$jmYcݣ;H -q?2W%T [PTY῝\o}dbt9R=nMMB-EYUG1 -ٺMĻbSs/(%/] -ٕ1Q ^ Hw箨t,&C6Ž/R`4< -^'jXGG?CK7!gz=q#G{Um| - wPsBk򘍷ű6g>H :8 hUX4ѿ9'0mZ~.LsBV/ծwBWMtdmʾmQ,F/ -il:xAr:Cikַ|ֈ>ujs|<-$ڰ|VI(ۆ|Do]>_閍}Jy?OOĸ˦vGD~hw"[KҪE*O*ꕯ+È5ԂS_g|.}~>ZPhJriR;'<-r yjB`v\"V#3'KoO &sw}{ZSl^#M&w'+*N) u|x E9OMD /)" yU2ΪDj xp'TTq4@bNԑٚbq-d[w/U^藃p'岞笫A2ݍhy$8 +1K+JS]PD;&W3_OhGP=#hJ -CYڏ'gYW(v;3c +x6b,^G60W6w“z~oI/h.Sgefډϼ+!y%XU -ir~S(>5>Еʏ;= -!@r^O^|O"W~=]u/ -e饔1|Icfg56NtwWfh8lq )[@u{}πX}4x[EBxyx\diQ+C[`ЛkҨp Ī˧x gPwe*xeʾ9,5jb #`v'67๯O#X RWiP%cBF:Ϊb.硎2TJfnw2ЫIR@D:݃԰hY f?Hk8Vc-`ІA`Qu:Ej2CdZߛ|p`WdHramзb'8CF~'ΈoNG-]m߾s;6吇ߊ֞{u{DU5?r/vs)AOT:mH+#3wEta9Fk%}K7_ 3/(p#Hd-n9Hṷ_C+4DۡA(Xhlko}z@#⩤tUÔEɬ=')G/+Ez>] -n%/o=~}Xw/_MʧȖDoH!iMP_ԋ{q7Bi֦:})ϞMTXҬSUOon{NpK]ja!A&;:kM~nv ` ylft9l- 8/)3t=_ѥNMjp_S )ni+ -q~9iMf3y_ELF147&PR5Q1uaE&aHv9نj-׃Ӆ=cT_/CO,fY7t)+oT3 -mbPHA>hD@n,L{%1|U*Im|߂c|c$/A ˼@%`$\LÓJ͗M"ԕ47 wO+~Y#/ V]Osirܿ@`?1@esFf49mW/q_s:e<Nn\&.6Q33+)\iуq1|#YX>K&fZ`Yg\ )I)N<04 u|iC,QÏO"Dcxz^es şpk%[(sq)N5#m}Q~a|8=>_H5_?O' ~?p'U@7p'wpt(}MRA&,}%rsDI'hLk -R)vQB19KWJ㬢67trsAdzBɊ{2XWj:01_:!V -4Z.<^Z֭´ES2%k:ա4j,G+w_8.#F7,k QŨG-^ɥªH:\A\V*rb>{}NLyrٖ&Z;-^ jOJ1c)s:,rʾrw9~iUkr.IϧXTԔ72tSxciNP3*yxvUIwdH/cټRsCART/:O9Ϥ&4!ko2ҏ8 3UwywKG\p{OLk4AGywWuz`yX;v_FhF\x˅q|6Os?>7"GJGx~ M8Nue"c|wC W0uuU -+=F -XK ln~؈׿0:g)Y+TW-M#\r.53LZnW؛ݼޙ^5jxȗEٕMyx90ΆW4˂oMܡDk5XeɾpU"Mt[j!v=1db<݈׾Ow 0*4w3yCOTɔ5>2Yp߈p=_9;P_z%hlQ/xyǓKYL)译ȶ'$+ia/: %dcU#M=}t9SNXTᏌ _xg{/ySV}PyY_Af\ -I6Or&5%Σ3:NfQ2@t&kTB ЊbfeߖŴuu7Q9lSKc^z+6ku;YAFhnΩƬ:sidޅng啀'shrYord^' ~|xQ=#Unڼ(\k~6y$71`(6yK]qS~KXVWTF@bF+VNK' -jD:y{̮Oߘy[On Y /lϑgӟ?qtr}7v"!֛a,Á8MwXE] ^AKG}c==28 4 CA%nCs6?YK>"P6GS?Gmg\$.Ӭ%ҟl2龱OOD NU}ғ^pIן?m6V05Wy+)P1L􇹊ObyhP|#b_ʮ&]ZdN">I]j{"Ai5K긥? {DJ2.i2 3;__ 7KY*^rTzΠb9be>u -pa]pD㧌!n~n\򷁶w#̑ Y=u+"KTcv=?ԅ)7Zk0aC&n?)1 |;xH__UAw~Ө{?o*ktf8;S2';ڒ̬ڼ):J@?$\_Db+]?,`+C^ wb;6<3HC٘31zwAԈ-snK VTeu򙻎W<sN:W5*&(hmx$)Х}ny|C`z tב? \Z_tNV<(6-k7gﴩ5h0<_&Mny,+@#Fhxvy R:.ٝG7qL'KʖiNS ځ&O{isP4ИRp† [eᒊY1: -̈́Rx, RC`D?4.376<(TPcy^̒ HWѽ.* S9ޓPs@V+1+h[Y柛'єWYNN_.[+jlj =bY,[R)u:n4o#9eѯ|h93(3:@S5v!,H'f|UV2h,vXVۣt3; y0B~B Okhu_vׂvrO ^>7,It_A0Ov.h ?KqML7|kb&2^8Y9{]pk>W,FEC^(QbrK6D~~%ZBᅵιFMBgQ~fAC&oǢzP5,Ʉ$j? (0u0|uv4~i°4V!Z(a -l7o ׳޿R \@FUs.GVry@Y(h>dnXD$7VcR5+-Oع8p60ӟi~.iњ淥X]/q{3$4XjZb[KolZCi}8ԯb="7NR&7]G\+w2rV-vVL3+\;:l>mڨ(8(\34_Ɋ/_.<Àxɳy6Onϴ ˴NwCnJQɝ~ [ rlǃ5[C ZBWd}]:e* Ew[* srJzk%tc ߄vCS;OZ+uT,>ɓgiSm peYg!O\!npBѻ_,e]u V4hl_"K3 . [wʠ;ۄ{ x_`uBLئi*T.~?%/dk\;v s? hx~/Wt>Xş%I|㿘hA-pQN Y/$Ε~WoFePy'.^!!NjRw'Ƽ7ċC)z2'R/)f $aZlqYy{q%rx(m?Okp/'Uz'_쎣>zI駣Γ:?|̧Åh'Z;Ghbtuj0"&sa 5"n !>-`ΦX>xn/kFw0eFb`şK8tvpF v(>7ֆsKMuUJSƼu1 -@CAcfeENE םm1Ǽa/̰JDr1^; -XKi;5߱\Na]= -eũTׂg:b`la?bWu}?y9cpt -jn),|C&^Q -N̴6?o&{LU2Mx߇Oi+8\6t͆x|K-;Z/5_-Y}ٚ:>CxxCyJ?, {t}{G>U xq+5 wb >EqKXn} _Ho|kZwg .ar0Ņ؀[<|Uu;ARVmW-\O'X|m!yeÌMDzQs?W~&O'W+l?7wׁN6 -̖=y -?O q6:N<(ji A\S1kݬ x~$fg-I,tnNEd [8QTu} j{'"ǖ'>o'jJlNKN߱J<XXݷKsoйՇ)*w‚ʁ5G9p3?>o?}'YV<3?T82} Yޟ~Lq~UBsVhijȇ -GC^}YYhhAo{!.oPѥ6:2FYݐ(^͹&݃\J>? =f0" W)*W§Ɗ(xEFX0FVa:dհ[Trh˨yt3Z13^AAJ|^4$Iy *V-kxo(tWPуtuw|o;fwDԨM2봡a8{yxfXyJHkz 12O5G E/L |-S8>.YlsR~/w}1&yI3쯴eL(~ 9oBeOj;sgý[sѶ=^uQuzxӥ*ORzjXE_ϑ\kɿNe!7xfy}}~x4&yڿ?)l}RWK n{Ě/YU?cA~$өs%xcZj_R F,Rߜ4P)؋=^>7Hjaw 2&@8ǃٽ@1'Dfy|B7#󙫨{S bsJ]8X]}RpY(=s8NjVr,t.=~τd"R"ˣ+.woXNH]p t،|*k t* lRe#U=@FQ*g ӧ(*~; c㟌?^<=7d<_N"c׍1GO ?-G~tJ3cF!T)aqEr7xj+hX3H_(ص&!+ y.c 7$w+`eCΌp__?MzTϠ_&1XoCS4YrR$X9+_q~8\~; 'o7a(_[z#׾S|H8>E.[mt؝Nz)?Пҕ#B>8J|k6J!v|`tGk[<P_8鵌%3 ]hm˭)w$iGi #{0~9g)_fZ%L2mu>[pހXxlPKk/`HG,GW7&61J),Û+É,]cm TsA-0fPܴssD0` qCy{h36t@+c -Ii] R#%zLu4?; .]î,8\X@K>rЖ`u*m>|_%m=]e![,.;9R\\hׂ3kzZ)У֪)X!Oz%<^5.}j&U' -?9/+nֱin?8#] abWywIr2" ;<s [05<Eۅ9kZ:q`OI*,MAv{|0hϬ:( ?ߤzd6E}UyCNXl[[{K'IlbpUg 1X8l6 -Ng1"N+Huʕǘks࿌<0ו8?׍gSWXiO'S N9c?:p7}% -6s'7DOm bE īZ`oiq* ; Pf?yC%^wsɛͅ#'h<\kLcr :Xm'S)v(Z T9}kٍVEƺ4e'F8FR.tˊ5%Khtik1F%i]\1WP8(ۙ[FxgMV9T~=a+4T7"K!^Vk]>厇O1L|'?G>}-tqJ">~µ5(nu=,~7GQ7 -;b1S8 -ߒ[ȠZxx]u/0/bXg/+V w)4-A50 KeS^ir ħFWcYI5?Gb_b*[fwÀY ^dʶCU50iH D4Ye._rLQr>ɍZmtG _ico:9}ƃ2 SL* {05 Yx}t:.CSgGX.[mGn#--:,{}}63Sy5%GWC}LNonHߴJ|bY0P rxsU UdnnGea|y_"׎>dҾqcxUrв- u2AtoT4*~:r ':_x@X˶Kw`(6&x㇫g8y}ȵno?Ɉ^FU2@QoJD#1L5 P ynhU9j MƮ-Ia*Cw -wi:. cLW .z1/^υk1:c%'-8M pF[ns󁦃df/f@u|[x A7R4_FyJ>{jp(6`nS;p. *7d W)eCc{k7fz6׍J%ZWXB+>[ e^jmfyM_+HkG^*avpP: _AV`+x,V>jyL,D>h4LԖ8'mD{.*_ƭkz/! myU/6&*1c0v1Bϡ4ֲ23 (ne6ogskZ*I:| -d&f K3" :Ȅpmg0iѸĥv.obk[yL@؋N_ uĩnYw>4éPgG. -aG -udcX@ -)^-G5[n$uڵ@w`l]oL\ڌ.}G R~!UaZ_fBϔsK@|+f`wc;F?ظϘǒ z*n ӵ74c2|+gA~\3& ^vlߕ^PC8T/ ->yƼ_oL1O>)~4ŚGœ;0f +_rVi0U9ʊvO eT2;pֶfr xk,eB}(:H G8V -I&o ,:;GHmp1kKcLaW' XܠmSBsl9:؄Wf`RJç\ 1[sʮ\2ޡ=x$" OS08ĩKН?m@ZC j3^sO|D~i\<50m}F{g# LޏFCNǜԌUCN6X"i!Y\F4|%{7d?Н5/:ǐͼfb/>lu+W[gk'7D^c4{r^H 'BД -˺GX_\_3y}gŽ^;}# QPۼeT{/&gVGƳsvAr]?X<ܵLQe"F=>ˏ_ -b@ -2jބN2biGdM45 a0}n -?l1P(3o:JPJl(go?*ϻMO _i4 l{.]$S=#ۯ.}uܼw3ZSUDp -[1=QĠߔSc̾fˮ\<\O wNLʞ -D{.X;w֜)1cR\?,h(zYSk,W |-B"wvkͿ.iCaE05Ϳ![ʃXXnVǖ8)-3ȄnKEkgp[P+,TGǷ>9:#zhiZzfR{!3taR clLES')[ЀлIDi`w`G P):#P[Df#q?0`oNW> -?]%~蟜JJr&G>U׭R@nP(PErG7b'zki3aWgX/V͝w%qϚ6eȞjQ?œ?M)SOb'~Ӕ:) c K|gP~37 cgUa8,@n0J1:eg ;:/.> -%B_˟e+292{H<>cޔJLH4J$ֆk<-ZJp%+ɎԂ\(j<:ܺn$vm='DJυtbnP0;u `ci'kcWP_Po9d5xK[Nb3~ (.P O2yOKV*W$&ˇ~u_ 1 פF᫤t>13Xq~ *s؋}U,VLM3oegVb -!(un(X`Uʭͽh!JP#43 -. ~ T:n&|ٻ#JOJT6q_9*S+pr,kmAU^:TnRTq6gKM  -YrZf*:dqsg>'Q ;ëRт̭3lbXUǃXҺ%A;N+g_9AV\gTTKќ6)va~m%%:Y 533P_"aEx)ɒW.D<p$ji._J^̘Fܤ>zN j𑜔08ȿ x|+>`U \h'Ko0c\]E)ߌ:OwLԦPAʘS9:>pƥx RBޑnj}"W~W}UO2 -vՋ~l XlOk03Vbb_ ?'TU2ʽ*öGz1ß337i~DBs?}S\N|k1HMo.zBBi<֛сl m6g;ZudX&4k|s8!}~rg3fõe5:ܦ7ii5⓭h\@IM>3$c-Vj|ʍ+/h^!!ZY5߬Lmcњ8/;7d9%Eh(5`F3mc?L0UZӎe奲֌L<>CIPͲw:蠳u& .fo69WR}̪rd25LyJ[ԛMs7uzzS"ھXIr}bsN 6\uvV.\ 5ߠSٷUa3?\i;{Do/BgH5H#rpD4֚d]Vk$4,r5+ࢮZeRW -X˼K3Dg@࿡(q$+IMqM{_Η*]n~?M~g+*t~STblfzL3S-o`#6>cZ׸QidM Y-s|m/Z4r&NT_Wiۈ49L"3Be.63o^nVubd~NuF{u9tM7颫Y" 1Jc. m9RTu1ŵn6ʆdft m-6˜?ηXu3ZT+7'H>i 򝼋qfa(-:M3[ %ZP1:>l?kYIWPɳ\ɑ -z3i[BJC,y!h)P"R~W+v {ȁh¼>ć@.HW%g&X~yZvls,l2ܥW\@;nƜN=k3o8J_:F wJ/iZDexw-cA,ۚ2lN.-h7K)M<,.MF'm'iQ -V~?DO&CTl&^:ҟ Ncy33oTЊdQ'T#Oֲ|1'v>\"O;qh{l6}D/i\!γ&2sYCo  >w#wB矀dd}uņԅ)Oʽ`._ʇT6=x~gmZ-%f(5lsnOhC7N=.fDf$K_NbyLɨ^zdvsHMC!(W)r|;iʣ&o0xIƬG"1qa4gKNt<#qH%W`F؊f ?%;>0-c`6^i]P򽬳e& #_OxCco_q`9#3rU^a Mm]aO(JaƝ(zg@d*ǀH{rJ5rVRbaN7Pt.,QQs.\@_#S5]?R-n6_xk<Է7~ Ϟ)uܳk$1Ѵu4EZH+|[N5T^]"&|1S"}p"1ĻfX`ey7"Hΐ֒n5A~ݺV¡xx1}(iFX $NkNkG<<8bjӹqRkqxCf\>X?cPܜr69X6Mۋ[a j0/Xt>MZ[oD&otXk5 -MB߁y\iEWx![ZW,*aHx#CZnW ;JUt'G8#)Cg*W:sq B'r| gݖV=nZCCɀpz/-@ l?+иs_2x掍Zd C L\x'#]Oy|4S)]{BkE$ꌾ/3߅W]x\n?",%e ڂ-A4vƳuϮBcߞ?Lu_R!y5EqrRM> 5k?0"t8=zM>%&<޳dSҸ1^Ls 1`T{ -RIUۃ;.ĮBcϷDf T%kS^q>E~܃Z£ePu*(oKժXsV d MECGXNC^] L "9fc'Ȓ\n;8̓+f=.n}~?ODїƬ`|g3J+,pX-(fCaL x [oT\%j/3$1ۼ);İEJARrڻC6i$ [K+6fJ5 P=& #J{Jh ->Z&EX͞B: kOiJAi eQ<H!I<.m|Y -|o%dȽe[Z]`0/0R 8sg#x_n R'w2#?D&/ukeo̼D'^+j_ R 3ePݫL^n)|'WF+H_=[ÝRNo9 ,ɐO*[NgqWa8U60OnFtt|ZX#=P {W+Y1g? R 4}ez-AFw;fX6ytu-dpY=BJe"^s |/h#]\tZRGnC-z@:@b:M=_@ uh_]~4pl0ֻŵT(0~c V_ a¥_ NWoTPrPӵ4 cz[tkGƽ W+! S*I4M<'ԅ|:v#<,Ѐ]8 ڌ2s˹ E7"v=3h3Z5 f5-WKob1/{eu+&NN`}sy/J|tte6o&NnsΥtL@q6C彼#+#k]w~[.W|ZenFz*eӬ3?dEm?k[H##{{:۪e3'hiiUnLaDeѕ{ iuzS -006\+U -/7ݎNBcV/}&Sh}eoi]zAwY);SxW^"M؇G4ä-e7pR;<:I-\BVs/\M^D]wj:fGbM~~/`VfW+!K+F@ph_x+MikEdjӛj23}{ 1;@Z.kTp6o.#L/QgD:.=Ii-\{*6 "Nr$*cq)f{* -ƳQ"s/Tp GE `Ջ hI̓}%m5Y1,ш)7naU@lELlt\>GzίvQ2^p?c?Aw}ѧ -ts=u!AŬp@L}5a@[H;h)\n/ZjnM$"zCV NNs_~P=v/JcGTzOB}Ρ|8:zԦ\Qcƶ;Nu(4ru jNʭR7~cD[ MjHkvΪ rft:l|} O,qW[\®ks qicV6t 9GI˙m4p-]/ -k9{Ғ'm11z5W1o58V dÆJ] pו~ ~QJMovg)a+IA[_&,%!? ӄGlkBK~5h#.GL<^"ϡ?n<'׆*>PrE?>vK*L*=}~wQ&Y3PѶ?0}vb52KTN'17\b\F.ң="X_Æ;<`{!޶he *Ҙ"R֏.W+oZÚKGe›\0f&}Q>>g: طJRN@N@V@loCVXn0.0r/NMc‹ \:*+{yʱ2na y yH?, Zmz%ҽvyANb^R\1oL av 'Rgj\t"SUO%TD*Og%%0E4 ˁ4Bhwtl- n;R+wDzGu?h+DNM0 $oOtgUAr9.d۠ILd :Ϲ/?S525{xo|.bg\ZDdYOTۥj%kۙmcY累e[z%ý5{JOK-$׃"ҀQg 1!z8ۆ[Mx.=.d]JE*>ս3M)-u=N}bQ_d[qd2@yf<Ym:. "GY n'Wj4λ7{Y|Y!ypJ%Lj/Q߾ҩ^=#|M5TgY4,9sFK6&v(u4³d1%oEHP~cb84 |Fǥz.Nw1õr|aNlǴG[?'`4{=?ìmʙ@Cl1\ -}\lz@84>q+&~1COi*~˾!'7xHpQ dz&v=Ղp^wi73ݒȒWYZ< nQA*eb\]ˬ\~4iQ&LzL6RxFKgxf[{`xi'cXsiS5S |.\rSDLg%G6xu** k3\!_v?py$7nF\=ʪ~O/"b1 4uS=¯mBKժ/GV/wjΓW}S&Ll ;ݿ5Ss~ڠfr0! zQ"9U:_r1,)9||b =ozQuWG" Ϭ*ѣyo)iCm#{}h^|՛@[pfǬSzc(R4:|t(9Kxez5:nR:Ѝ\fmH|_SxWFJ`t+aOGVej[^$Ӄǿ.wjV|wZXк|K3o>M\{ZH{co"v*}b.SqÀɭ_}%FxnqW)1=gHFs+;#@ `[;os*& #\ő`9-<ڦNG n рTՀ*ң7ej-Xg4[\a-3zkMt#KxSWR|7yO[tSC_&> y{̹rj\OYH޼N3K= ԽϤ@}8JЫw՝:x&\Tө.[' /AGwj_[W%K_]9Mlì(4e:}^hCUsc× Gi{/ߜ>mzwJϯn>Ȟ\c2rI͗maNO}xi:߼7:@=\*c4 X74#u=d䶒eך'J6:UCr\V3j6؆=XYD1d82ke;_ɿ(IW1j/GywVf70 _@$0] KDcvAsX}w9!Q-xQhքͺW(3ϬG# -T@& ieP>M(}J#v<"7yXE>r&ZÀ2[Hz-ڹbuF$+զ&Y2?ZW|࿠^ 7vfj s02~h]/"iWx;Wx34md?OU(>- -^g,lq?( K+HOwre|ДEw_1_I|WvXї\矎 H}<ᯈ76 LC7f9t~3Yl4Lg4XUMc3'uBwjO?=RTKٖE_q4:iv8jJ<'QI gك1KyTP+|g]'C Os˾DؔȦmO\ A<:-8'G4ETh<5V36th_J~>п E w(md.j/G̟zK>zl8UȦar^B>!6rFZ{X*o^mJTNh'JP]xFЉ1fz;K42#|[>e פߙ)Χ /;Ưu r.@5mkJ\x_[&p74guu_isc})C15C1% pֶ&27 -**G$|ei%E<ߒxTU^GҜ茵yf ~;Qpk/wcXӃտfzreyZ Bc)#> 5[kAQ^%hʸ|ƱU0©Xi_a?*(ZS5}R6o~Yo`M[h/qGMgR>1SA) J IQn2L#:~Ǒo8Wh5q\9t/=}2ΫAk3,aK>m+M^|V/}pܔ)M*Y,Pxn9f|}bI ZPaʺM>n'z{L_Ai!;Bdio3af].Gi~?lO ӣ[L(f2-mX}KbҠfgxsubm 28360W} kcB.^j{>eݳyބU(M { gw"Wj!tT=`Z-} |GqJ9ޔP!W ,U\(:C:q~Eg.n)׀j`C[lZze9SfG~jM-LTĦn6xmhh5^" :)e:ǝ-x""֋:WAWT ăHZJby8A){]c=i+ow:TП8⃴/u+Fjb};A_ =va­s3VH?ٵFo262L ѝfE n&;y}cr&㢱6 ܗ1^8#"*Ӭ˘0}~J1reIr[h.2Yև?ph5FK2^Bio-jh*Qp yЏ!H+3+Ʈ6דr:>Ep ]9BԌ\ Y3-cHA=g n .7kquk*jz?N]uo9|sW2οr?Nr`{}6[D K55 )ޚͰ:3م"ʡ¥p<|50>/nUI}j-Cw%KWf.(Xء_df'bW]TU?o3jG64O,qLA р+#&8M|Cꏟ*NeZf7}Js8ι]pwO%V?:HcR,8o c*:q5Qg4o -JWwh -<* 15^X/EK1sX4I@KVFxk cObdɎ[: kTvRMZD1ϑbζ?lXek)F]8.O3(%Q@>3Pt9#+ (iY_e9Yͯwgw.šKc]X2gF8 k/7/Gm*'劬ܚ.|;73|Zg^̇ խw1CAhv*XC?>yОs{&-2Vm|!>K `5ޠU5խUxi@ ]DLʼ;֧yo޷}^u+~Q5Dt2E_N}W\L e(wyEͥ1~[%^CCA-^ -%S f\yLeF^Yҽ']b֧+NoXS$}e>3eig5MdXAdӢBA%*'ǀyL(e(5uw%ѹL31:%+*`Ch9{ k1]Y D >\M|eG?fM~rSmƞL&<"-iaJ -[vYy}bw8K?j{.tX}kYg0"Ir Vha,/tQ]'OΉaE1\ C+W)mRmxzM:rf oӋ&Ѳ+BrC}LMKi<:B_:5p)T|93_7'3|!Goa>߲Qޝj<4j4˷{X?iَ;=ehOA/9"q*N|js-!dozpl U?xMarVttij+^W+UXz|rۗ7!7@hGw)^Ọk/ ]B\Ž@-ק1УVڌJ?'7̃.lTj2+"obc O Xw0 c{y #o5,>Y*lڳ{TE 1W׍ɗQZl vr3|o?sHV룄 -mui݌2hgLnzq>^/yvQY=t< S\h< gJ}#P0>,)OI~i0)s%]yv-x [_^DN|׆%d3o7aa6xsM1sYOz(\+O?tҢ5b>B˽ -.'ߟϜ2µ -[JZ'~y{V0\? -b3εWW]C.> |1 +j-_"w{!>?::F}/VwnNm=_/Oڢe>q}c#Qe.԰Px%4RUiͮl(EgUs}Go,bO"hW~)b8]lV2Uk+pJ*|&X [O5 /=dU-dKl+S,`jEH??5Mr!W )nY02wgfVh*OMp(~.Ԡ*uaFu%qU=\m-N(AfaSSiL6iNdmNU>ؘ-~ -G$!!Ǭ,X<ֶbVsӒh\|_SIs4v.}b]=@޿Jz2>Bǣ>Nq=SZObDNm_,yoq>55acMX|O#Dd=W\LNcmXc,yp33h2ԟ*evF52(~7'?3祇؛Bm9~XoKį [J{Nu+28k- -J]ZEioD \]Til.m6@7p'-#9hH^ u7rp9Q!wjHzbt3*Xy_Aya5HQW u#V/k Ίۯ =|8&˛ s׹-k`'hNZB;#a"h.=iZЕqE\.'vfdh{{oMe3Z^ɠkFeiE I8WV0)/t0.eW]%X AվQzNzǶ5 -Фp܌E۶7.Z*`ҙ"Tc{Bm -;CzvīTEy?Tɞ\Ki8_lW>qOFNd-zUTx{K`\ߎ&@ަ7Y=5S(vMǻt+Q -Ve]/M(pL®[&o8dabGHz%enTI^:ҙ,4#$={nm^2H=Si,gN+0ʴc&JV E[(ė/UHԪP~ Ew9tFM$H_jk>@~ $5ױƈvNE񶿱}bMunfVv]O~ECFq=pX<(xe ?3:rxNoUxc=Ϛ˦u?n?gc\1(yă53W?߆':(.z.k:^b&y=Rhu':-"5Wv>NwqN)R2|iIZiH12Ӧg ASqQySw!}(B5wiP鋊R F3Q}Q~-87<4<i::?yǘAJ8g94Y^KsC1H֢t/e0 ȗ*:nZg;b|)Q/2߸f=5zGճiԸ.]s[z1[k0O_u p1%b#8!ksXaեw L= .pSC.A\hrMCN2z[Qb[*j}):b';nұ*+y_AxeCD$HYƗc ;J@ne'̑_~)y-f<~%;o2HNi}xo+ Ny_5| -d[7=~*6xpŠDށO%Zg|4 -;v Gq- 'jJUq0-Ӕ,L_7izFrs]^_-ǧ"}~TNr%RWOֵ[('yZSݔk:1ʁ?U@_J] P;˔fк] (p2/P[X/X/&@" A 71ZYl'Fʊ0Ak1N޼5p_#G{M/XFMIGThu8jiѓL4qP?LC{JOiKb\5im{~'G;vW[gg>cQ.X9*UL[{DxS5G!_zxλgU㸀Nirn^2-)QtM= <[żJfj~j;{qh[wG℮M>hK&hU% bWm^ "Ro+=3MB$^N&(Dk7Rt_DߊYgXKa촦o) 3P? #tہ¹˯ /c>)iې|jA͟aчL͸3^'Dwgy݄aG[ޑiwYxObOQe4Lѳ@TfN uIwB'YYSt;gYMeGJxCZhE}K)Rq,+ؕ@ ,; -$L\ M~^Y{ƀr[ pr9+k^dͺTaj?}bQ5vY_@5zvk> -^R~vR)8jA+9 ?ȏ'H0:䍪msXUw!{"GImtq h+ں*Lw=e姝rJkx:Kx1[BY8@x/0S@s%)IrqʋD@;gr - ˭I"ffZ3љrTh.V-ܽ]bu);rwJ:2I_D(&S"n j$G?;ϭW` rNt2^,16fe2l]ng 4G]aŦ[\2[Զ1 m>!8$X#fAvм&T~zUE!m6ԯ{5vWHص"wjUao|~B6c0FLfH6xi’.N$1^ x+7t3#۳3'$<襓}x&آT -k5h(?L)s>T+88Ŵ0VN ֳf:ZGH+k@# vCVIa//"GVJT&>k ,ϗ\iؐ35&"1Kfu\eAX/h֊YVxo+`/NRwEҙ]EeDKE| Z;> VejK1( oϰs- -;gj%_8>/mP֐CWoYa]w%ǣzbi$JzXc`rzi|6깕#Wt@[\+Cl]gmO1=Ow Sx QB'l*rؿGx5\Vwp]uW7R^(%3މ叚'3đ`h,3(s=zǽoQ zC. YV{Ú5v. aݐa5QֳjQgZ/>trj!Bئ5o;噖y{iJ_}cA| /XỴ -*h%c JXoǫɃ(pM;C;"Hjdج6,$ Lk`hSS V Wxۺs ?)Tt{AޒwfUr@YTo3gp&>MOą694ca Z":]9M\⚗_Ycᄕ̿8AY_u;/UJ2b_8۵3/΋^iEǂ@z`S ?[at=_ 7j~R#Qn -=E-&ڣO/CܔCj~el(mH6-FU<(wZ*|s@zm݂ zu8{x= N*QIb(;}/)n19p+&;KU9C4GSIV1ˬ!. }ߑ?\Qizuwk}͝1\+cR[KEƪK; iIE# 49p:pog5PM#YΙӮeUָT4YH0`?YMMdyL*ss@nNޤՃxs~73/8S5;D=<@XiLSuXh rh:0(23BMʏc[ƝmQ0saZyFWԃr%#u}Lٻ Q2=>ڏ_ؾ- u.7֚?@0=]q~L(^A'tg6}9L7rEPJ~3prc-@MP)ԖZףs|XC8yZ& !Uܽa6+n4)ؚxER QWb\EAm.sȜS07^,MW._q2= 4WSH 47eFpof)=eq:ڂ;{d6%Mn^ ^QHiZ:0gU:P၄2=Ҭ1Wmp5*1 V6a}="(JTGc$/t }%Çĸޔ%^}\ه6CFDK/P<|݋doUk~~gA4e15FDm*)jO'9܍SB4jLF~޷(Po& ߁NE|壕 pYzfhEU Ӂèo½B[ XZU9:d& ->qKrrL%QE;TŏE+?y7b*t7Ǩ*E -U9gSwڸ-Vu 9I!#ws8JB~>n!L_M_|"v>>u,xj;h|Mv}EcӓB~({{)87: ܖ2 , aڼ!;? {'0,9 ;KQWNqiBw伞]Dؗieb{g0N"WNwܴqp=8S9 dqvG_y:<[3^?OͰV0R7 -LB腍 @߼Pi2jMNm^XJrԋjzq_(|Z$߇7_'A{`J`9DEP -8laep5Ar_ LOZ9龝Ezѣ>U\GF_U#ޢ9wJ.ֻ;5P۱_LK:)}IUh,%\bIe-4;k5NW$=\~*¢yÔ^:H=3NK;oy]O %Fwze|c w9Q-CZvbEgo1=z}f{߈7Ksu0 U0_ -x!܉g*QT,xfQswyjr~/['Y!**2Jch)QMx=0]>U ][5o{(n!oNj,?`lEM3c& 6y97SPPlP|?hzk->pBK}&|͘b"# -(S,ŁO xz@(Â*&<=[vTtص+ <^h;K,q'28=xdOo,4 b, L}n - J؅:} gt&Jϔoߗ5;n#)zMt{%0/j W>P{cP F3g Ht_Ёnҵ8}j`֐/fң9D ia8>iy~mRP&2;tQ):l ؁@1 <;"*zKG2:~ oɚv';wVWl09~s.ӠwAwv=;C.d'5gMb1f(ݙ`^'aCL ȭ5'fz%TmKc(>m >QC͠1΃o -e1X͕ :u2+nhVy)}ßO?> yz'્MD&Kzr;LVJ¡C^u{\Z=M}QAsviOY׈_9q:*VN rK D3Ogη4g>(7bWC1oN~S^_6B=a]}͗̊%T^uKh[ -ׯƻd_Hׅ&`E@*qZ.C{I -~:y4Z9T Swf]2e4}sH\i+F*ԟ9wrc)Xa7.%̍U5?HX{ף#b-~։w/E~qY 荁aOm:u0QFjزCv'x3 " зYQ$ ̀NirMu\dPbLF@Cc= 2-*:07K*ϱ&};EQ `k97R-~+87Nc1/{*aQȄצퟡ/ j-NLBq(!{˿k?C7z[_F!YGnJENKGnZ9 %dc[P[ԇfinφ&*^G+nK;q8iugk1ŮD[tn_![Puo?9aۃB}BdeIyւ_ -HLJ`1\C -b%3yXr80a -hYjWiQk q4]u.pb:, -"x_>>NO[E,#7ԛ2^\^טʭ+|=Brgiީ's~GS/.Uz?C>c'! eJSGu(k?5LKyK0ٙWH~sb/V}> =Β^(b yMjLٯh%3X0MҀ ?1+. :v]QiJ'@˶tmǵG'ˮ㽞@2u0WioYQZ]nwIb6t~DΑ9!5 Fakcp˹"bY!^d%`]:kzūWA/g˔7{.ع4#RZKijoO f6/iZk]o|gL61mx^ؐi**n [<:5XV4'"bQ> 9UUf:+p*DzUM#Fc|sK]xiME%~o eW7_".c : 7Jf5IbޣY~c{lWHo҃x -;*@"CS]0SMʷkѫT ̗>MΥMF -@VL[V2kSp4!&<6"-4*_H#T9P-*kQ0:Ӆcid;;+Dv:/^c6(-=0JMe2w)oբ0J,P~aã̳ox+L8_F5}Tso x6 9](5]D,x EE>?T}4S]׬r^%w75 _yգ8:oƷ3/K?rPo+L%aȉm!gB6@ ξ1BhߐF =DBm|V:hLd2sָ_N+s([IKs-.ȅJx^wNR7 -S/.wwwk,W4>ǫ}Ƞ5o2-_re7KkN1!diɓ/K=P=Uh#Jm}ZieRi+@GB&-eEK f_ c_#ZԵEXhlĕ]\/ǼYT2ϴv; n6)?bT^+Jnђf rKɮ5eK+2E}&xx iJAVrR`$Ý m&>5tӴpƭ޾7uUV;>ea k|N¹73*tD݆]IלkskAf| -AmRӧqmҗJFy;nC8m=KYTzEoTb!+qU݇w1u՝aή -zN%TT5;`zt^^UbQ,JIK:hyZ*j5u}YS(6㫏b&M؛{C`Awb=?8]ֈO<עW:~%b۲~H &yt(R|PX_0âK]ߨ! xO0GyG^zĩ{ٙs܋M(ۅ0s˛_)+rtJ!>Ww1,L-ѽ"wˠ]7@bT(b[ J{vdlk>P掯.F5G7|GE 5LC{Ma5m~ן (KڥΗ/=tgS.oϠ:xf#3l.I]4Oe6,oMWcJ7Dta=/OX,N;W's:z 2'۬W@k?4ang.fEҒJy1՗7aPx1w Ҟk'ΆkYJ@K}FV -mkA:7EovcWwr4923娚˻ }}_| ԛȖ'ge ھ>)ue}!u?a^%d\q4(_[MKreobb-}hOsܴTnLyLGp=jߤ$< -ўsՃcw1"(li.\8~Cz*{SuX</̺čbK@n W#!eZ*K .Síu:%G'O):kWO*n\wb,g=*R -[.פe̱u6(ۅZ19.]`chw{JJdt7ɉ׆[z>TpNe6tmRJز?rŌ_d3O?h9פľĥ 0%a@4 40Oj~d+57vT3 Yn&qFP~#6􉦁+3kL=ʞr_? Ր/LE0V4;Ak;?0pEBzNlG]a_)H+ͣjezמkׯ::ә?z6!Tso>Qy1j> ~[Y9LYd UV#B%-Iz[s_|9`v\V5`ӂX.%\oˏNC l^ѹӪa}-!)^CKap\H:FE.]' -x_?s) -6 gyjn-u*P}T:eY6صqn#.5w"3㑟@|)B3H5ODi3::APŢ \+DMڜ_SaoɁ,M|qe^ b%/7(f2X7˔pIL%Q-=F|c"!pˬB0teo^DT{U|{83LL%@׭I]Y=_b=e5.u1)nkHG Ft={NK| tYP-ϕlֵ7OtuHc{`q)*Mpht -L̟E }# 9`Cp.uMG |  p|7W)j* +7h&U<S)^גys3\0#/ +_Fia+Ql#1+,cb͌T￘<cvr@ Um`4Ogr>z" v05k<gW O6NU{ L/#fW0X)p9CELv3~R<5cdb[u5x -^z# + \71ؙO֓'Rsg'拺:Jb G-^!P]O+׆V+ʊ=4Xguk3Uc3p +$X{G7K*߳2}xR,JwPLHCWN [^CCL!%] ?4qiV#1v`6/!_2JҴқwv3ܫ߬epۉ-xokt1Ⱥ.EP7<3W wZ𜼰WkqtYtn=?X Ss5}W-z L/[\Eji?Kūq8'5(fYU#6շck0;ڏq+բ iz 5B 5*:H<`tc=5rd,ANjiqmy)2I[ϊխ9i?E -H4J)ү?%{Ue` a ,ZeɥQa.s\OR*r8,T#6S#:\ nr?3݂ ^ОrWY-|Fn t]+5l7 7\!z_I\3xПr|FcPAMtFybYu^~QĄ!i -7](L굢$6TuG>^49cpa?*HyE " %mvjBP쟉 k@hMHg˲ y:s0귡 eXK 2E3 COPpP  d:pNOyi/څ]l{B2va XI8l?EA(}1Ex߃(kiM$Ur+Moie|m҅Ռ Nk /uQ4h3!.GFsgܓ)?Ӈ) &X@!}aY*HS7>+G-#Jz٭"EϢcn*;1'OA_I]+#GR, *Ur{= >y-uœ x4c%o`ZD~ -8K9ᬬ41ǦO%]3 ~2ͼ\FUUÞ ~P:%XZ - Hk05=]X]]ß@=%K'* ҪwNUbjFY ]'U#}Kl?ddx1ޑpvC$Ifº9uj|EEL:P{& 1jw&j4ӆGU_wjVDh7XR.]f7!WGh~󒞑[) -ks`e?j"b:/fYC5TY_[s2u`v/loOy G 8q?G3@A&D5ueׁ]._igns8^6CZJ odmVf|e(~eQMjAZ'Y:p\ue/2 726Qi=7 vOT]+P-f0~W>d-Lf ToF -!^X0lؖ -$bJ:,&ic2*T耉y`Zn'KƭDɈ JS)x`&a[i"@OR9H[}Q/'[)-DF;bAˊ&fekf|9B5Q%kwk9>I"D<rur;'Y~odꟽWJjÔśMiנVWff.!ms1ʦH51YleS' zjF׆Knlk{4%{$Cq9_osscoRlF;awi L7G=au8*)ijbtHM ?|m(]/A]0bPO]=gױhٯq؂.ق7*\jw-zkP:_HX4 T,m곥;N @ -PN;.UXԘCFqޒ:FX`ii-!uބvJp:Ժ@;{}Wdttu%6q)kZTcC{ֿ@*Q*?.{ fGU|>a -2 -OXި>SpNqh|SLvæP%ـ#> L2\J!cL:v>e2/lgDpaRit9AvչE>_* vJ%u04?Gg?#9w '?dt>AlSSϙDxP w\WޱWCfT| Hw0 -K`No]e+7+% |t 4I;d;N &cIi[}aL&GH*QWcNGebZBv^eT=ƠV;O,#^!XR=V%>ptjn?JZh~0c5=ß[7|u5;"3JU6!C~@Lxi0B4rl^nk2{Bl´B -=13|$zfjoe';?};/V{9> "chzɣ@ U8'T3̣>\_~ -,_YA[!?n-_fC):@F)&& 8 9F},gzwL>i>Sğ -Xo YvN8+ȏ?x߅*3"kN%5=w /_\s=1i((0bˮ257O{cUZۻoKw>#T$`uE[l X<)֤N5K8*QjW7/EVZl;Mj9a$ʕkiXSnPwxVsv` ΃)$!_@RZ-R㹵Q_Cd*ҥFTxO6-%Xti.*U1JKxZ89$?NMPʶBT1h=42d)kKmTHQ̥㆚x((zD_\j]q3rc۝aV_{!th8TN\d,/ѫ살kF_ї=@/4\cI"-GAƬQ&7"OZc"wC{CōKunr cHb VyJg_؅gsOY#|WQhO~"z{iB:)-B%A9Q[!hmL<N'DT6KV' ?T kʩc;q0Lh6G،".*co9\Ӟ$Gwn=:̷9֝hi,]'(?k )W sb|3NrW?iR-HlAҀ "fx%ay_": CW,fviw4.<=%7\ڒH<Tԓ8EռGct0XeD~OIU[Cä>UecyVEk.)ڥWF -p4ή:Bu͘8f,v8_hA-~u#55FMO" BRR^Pyկ@KzF(?(ڱ*xtH]&V;pjke< -qma*dPx Xjn*,g,` J'WP0ve~fu\ "M - 3ucN{ c搇ȯ_>I%aIel鼷#_"v޲̾:rSՊ(ޘ%/i/8\jB5`W< F34ᷝCrAa3e暲WXhLeO!ЛSGStRs#3x̧ː>9\;&ś''4J믠OTOR =x>A-lMC)~ gw#h(h ,P1AtN7eCbc!HSQyHAR͆ۈgSo@Ե>fmԙv3z"ׯBUZ3*wF+hŽȱ/uԊ RgQ_06fEosNYv6J[]s.\Kr¸>mئV탼i0>xm+|^'Yi(1 PŊ&P -^uylu*"UxJh#߰A ZyG㇝tUgWu?vW$Sd@M)EupM(H} Oᔝ>I]4*i7T13cFegֵ²dnd"~+˾&W%ʙI|^SُDevoߕE/9Oī%H=(BO$/BT+v5)[͘ALQCct -!MѨbrK5~CkI@r/fx|/>cB^U:TnoI>_K0L{GYq.iN$.3s8@ :T}=Qf˷ -8`۱7!g-+ gpjg?$>Z5n[a0Sܝ_yDa8^6-Y덐K!}S3)*PaFsro -*bJ]AlF&iHc%ںi. [dO s??#HَpJ 2'cl_n5lFjz&z!n ]6QuC]Ό!y_x1 T'V#38l?-wY 1q*XuNO9%06ӤD~eP;oXNM]_6Vz[ 4r.8\Z_(ĪBP.lA/@`(ݯ -rhPy?Z\w"ޜ<0GIoӨt}ca9'O4ʯ5|+ HtG :*ϦWZzue]nZl9}FN_\X=("F/~7rV#%7On4Ú5Cu;M 5 ";?x/'&I_foe[3\+C˿}>YA\KsN ~bɞf,8so?{|WsxCsLMoq f?tpU@I~4'9^~WP(NfB\ ЅviU*O3#VqP zN]bNꝸ%ROI&vUjݜx63c-iL*jd3iƨnt> ~$/-sJ>Q ȝ/p4UưD߆u9 {=p5eLb.8֦֞iY̭enƇWtؗ5lpa~Y_A,Ц!g#2g(]>g30c C.8P@ӆ۶5#Pgk(\ز_XbƸk"cXe-n}{H,ruPZB^߄۳r↌e*7lOi~a::|r=)J^Ptk5*SSD􇊺-I'5 Fq@KuVm[M;oiJ#9Y=,dkw-e{%J͸g\wM hrJ?b;lSM ajQzX/t당F~1.bK{!m5;ylM>->z$ p N?N->߬dtK X 5ۂɅ%n-x8a~O?0YˆMv՘08G2?m右hKHim0zjSRXA*HrSSr7]cr/+~!ڑ/@x]yȡZ =j4֨=.hkK^q(oXYYT!wꐘAuQMxǴ{ؚߏE TjdvcV\KzVݩ{;U, ^Z-n_(}:ļ;TDH:SE9=7Wla-jr[j/ikޢ#IÚO_ٜ,aLb/,BSq2/JQ5;[&S9o=Z8C>k7h~>D -iu6|XDɯF > Y]fqp'SZMriNen]]ŚggGY+*t`By4eZw"R/Y&] jkIfw}!\'w ^D<ԉsk>~?4!S> ןaL^:mFqj -+h:b~@ Ƈ xwU`b"L*NB 5.p‡mܟ\q: li25UA4WAhxklVrE,}Ӱ,8%HuĿr:W9y`.VCbΫjMd.Uﶷ\7Bݣ"?9{ -~ؚv*,˃lS4!5.o~ev攓W\xA.+%* uAa:gڙaOb.}v L3o|ZvӍv!Ly\4uˁ,,k]4yLcy9 \Lgڛ S_:% F*' oY!l,v`z]3Dޖ]Y\.vt;wLe/l-wxþMYeu vo2l}c\ \j#~p>N 7K-ZbV8\ PK?i}߳H):o -ez>fSgU1Ү79(z_aT|nj)RYUx;X5Z{NHWT::WWvx碏@m>Z6D%bKNV2sص`zp'u,-c(P-h#3Zu9> ʚ~Uĺ?M}ezP`aN*z ^UB30׀4J\za_?RU5f 5X <nN+wgi-ruxs\m(E> Epf>S#\ <kOgЌvWЂmf! QڬAP&v2p5 +sX 1w]>[B/uUDۢwe>W+. SU{/ƤXAϱǩMewT\``IV_4]X{&#\RBn= wNw[Y KP\TٛΆem[ ы~˻}e/G @׿L!Ǔ\o|c3' ζu! -Uއ0bdUu{o;~hm.65I. cd t\<{ҽ6W/)WU(f;S3_wq5fCd0k}a J;K\2T+u_Ji=.n<Ӈ2p{l -xl_xnB/C0z+O3ω|6_:s<4|⺗pANZ4;sP &D4=9Oy&kM3@v1Ě*"kPKgG$-pJF4kD4J-?v:eMTukMZ&X@ƢڞǑȈ,?_/o6IӦA10Bò|V&IG=7X8$sQ%s*C )< _,J)-~c -&=U~5Xٷg5$ - -:Qu ?fDF%h;:?x[b7P9yv4b=` za5c2{?q?A[/u\o9rs׈j W6K?w89jW’C_1ˬQ=|^_oCۯsͤu '* a5u8 -"˪GS uNqcPjW<T~i?Yyo؄5{ݘf}b̽z .r硖9tXܿUn\k1(tJrIYGu'kngfw;&c҈,YBjU \NÉf3od!7h Xf&U)S9T[G4RAjG[G!Lv -҈|fƯ<ׁa!4!&|p]cB@#UUqt֤^MPx5alH8lSjAMx/%zK1=C+&7ڰ*{qGikZwJaG>FMF.mM y~nPZι?',^ gM,C3#)$spmrB4zgXPOzBq9G^ E =5:g?h{kbzϩLў]eN2l[EzLOS>Ӫ]oLҢ"Ҩ*#k5ʹGe)?TyjT25Q[ Mڝ*8+4Mx s1Ρ˛7 LӮ_LrTDn"y7%zA~cҿ8sۋ YE u< 9bg[jpCm5[l>]dfWéTఏ &v3 -S|-6 SHLy Պz-R9њ?vic`\^ΊWBeџkmroe u)=iYWP5c5T1b+&A* ;}e˗Q,{&o_`MRY*G(Um\)}PB\ >ku'(13!PFU'3wchJ'SS&=Q4. ۏG2ȽxIw3 -.r8l\&vt3E\7 -Mi/IJz,gMXʾRN~eQXAkK9W{<ٽ'tsN?.} -fws⚐钲lM^M4Gc =gva f~ȟ -Ȩ$DA>WvE^SΕ~(ίǃ~/{+xΏ:)_L޲Z֙_33"mcZ)Z=Jțe],a7IzKlyy -wt+h)g!kx?.@{<" K2/0Ol3AjZOeCGj1xu 0rL+ -.'\ƛxԏS> yG[U5TҺq g10eN@6%DN֋m'8r|c:cE8YҷSV'?2Ϸ _ vSB&˞ƣY4 H>p`<de㈙d-N\.yISgs'8+#K/;IURז\) .6hlvjRZ˗"]h-}-)yisȼ^Ҵ-&@ꕫT؀Wcm -^ )Qr 6H5/68uiAx.ELY M[."B(ͧWƹ\3zT{x))C 4rH,W 竩GjeJ,ԉ\y.]ZS-嵇n)eEr*R 9 %V9h,%laV=fZ`^0W]"jDlJ?)X0&/'>,5LZ+?gG#jl\'[e,hµ*v/G74PGd`"SIb5ރ5# jĩĭiϵc͚,f7%{M%{k=5N> ;dž9[qp dQ@EDXyA| -af8bĥ.cv] 9,o-YP{Tuչ@/ca~\u:=&\O&JB1U -8]qSZqk%|k3uv`1`ƢuB_~t~)+-#]9}f<%rD~jۋrC.pj}e3h~'[5:2FBլ8 T ,?ɅϞmo 9dҴrGᚕNU-$t@MK:tOJf^,e,joR)w~t]TotiD3yԤW qώIͦȎ[3p%kȶ?k>d˓*@}J%jnU?ps2=|/p,]~r'T¸bR2i~\tzk'Ino &u)\S O~:p ѵcI._ pcJBhg8ϴ "foQz6 -0eׂ k~mB`+J#-Vi(.8\~Z;YʅEvvYm֐H=uډI ؾj_-4. EvMT bwD7a " O0C "9p(ai{ʩzJ~SCX__EYb\:aFL%'W(:=QpxZ!>r<}{.)dt41`='j{r[ šu2|5֮|HϬSe$GWcn.\F`vP Uvwd?ß~ [Rg~5% &I3bkTS'>BwI\8k1^w$D'p5/%C=H c RXU6ZLJb'7niob\N{-4 8kJEom*HЇ1nW -H"6 *_>(ϟ^+v -4M1f]*F.>^fx܂j9FBZ:)"41y] [|U:__^FӜPxt,7((~-7DRj`mŻ#;e&.iCWHm-*spwqXnqSU/QBX$6aEk 4VFUй5cV\8ޅ̸rmDoζ]ُJI19Ǔ2 -n -ͪQ8ZyU*u( XS}LJa -P[+DEΜ(х=ٲX m頵7}__ .e\n.mӜ hdx 69%+Jã9c.B+db#T~X#.Pʺ<9i -nZpeuT&25at٠"ep=Ex/SrX7vL>BBHu8gcMr~NHMZ0EmM|>!}[^E Noe=jqancWnAΠ%5@)dהG#_(+ʮrJcKb| Iݘ%HZ@xRZѢp"5S)sldZ5&J S;Jem4p{%i &e2o -KULeZ0'9>$]\DׂTu\K*% +J+H*܄s|Rt=Q}fi}u<©qRy+G0@v˝z\rfsD\mQ ZrJ\m -m` #WXٕSMb+dR[ZXf/jBՉ!7$%_5Uh]@|^I^gW;3&IP2oBjF{^]G☇RͪqN6r{|yޒL^ AhCӈU1p5ڑ2@c_̲s$E'-c *Ե:q@ker۹>%kTrUa[L 2|d³5k̷b'*;qɨs4swi+X$\Yg5Fm&݉_G)ߌyt^>j03a\-`1 ͘Uczz^%Zp.lu|'f$"FDl ZEqMpߦ"^MaC|jciXvJj"c*ξ|_)N%UKAl;FO2L0<|W PQteE؉Zw`9ʚU+5%E睜[Y'~rOstZ,W;&U ^.]5`5OOnӗa@D|^y>t$v0uy _ҋx?PKN|ɗɃ{!asa29NM)R~twI@aɀ`P8u:; G/ {:WƳ{=Iޕ:qhoF1}}'pj,3fa:1ηOQeiYWQM`~;MaF^!A[P\*Z(yYI=jnO. yQxiZs }3SEbo_1N.Rֻn2kev!pv~<WN膒 n{QZE -SYNrkJ-Ih ҼDWsS b ~OtBgYo]CYvaڳS?1#Z<{e[JƜLC3vgAoNbz#Ѫrp&e9tZS.2V\z+q3q(9=Q$UM:qnUWÞpYy .[‚diaPD0@l$ )_-SٟϦɥ넙t -rW53] R#*kTm&'a³إ5 -uщFq:̰ܳGC1-]:i٘c*T-hw6jKHzbbis]5-;Bl7kh"K)zVW )~Jp(&i -n ـdY՛fo?g9Oirʑi&9M9;[pBN<PYg*[5t_&Ď\Y\3&*GTݳ%)FmHm[5&}g] veqGېkyO{ -̓Q 3TJM%oz t9nR 8[A9|5n,JYhj}y$ߕ7+z:CC2WS -3d5*e,=A{D}k7XK*ؓ&ޡ\̟>+|C[ηero _t:q`ts OVF --ky);y7!d/=S-ұ+y p3\Ӣӂ s?:9='p/"&62Z8A: 0Ѵʺ]Q-K/~'|~'o,"CF<9KF흘5X5lwxEd7G)uUWOM̜ͻϰ4!)f-t|,l u|1-+R,Qab`ڃKxoUΒNYJ\r fvu <c B ZjCe!9'MQjDΓhSi3MVHWbauJa~T}GhFS@4z7)>Ѯ~\#ʾ Zop&Vړ jXB1]kv=j^W۶DFR0G]*!;I\=_Yi ϖR-iL7 /k CMMGb]*㘾b  \Pa+E63 O$y3rTcW;~Tk3n5+C ,P DG~M֠L(ҍc6jqx -ZΤ=tsi dpAժ~ɤz$ӏu([6!^v-7tJrCRc_5RUjoLCe(GhvbǷVjm*ԮeR7jL3u44@+fNɢn=*:?0jn@oBӁؐWJ!`x n(WX=\Xٗgy: ](JFm>M:sWj\{,d61(h[q9&_$8X_B(8rp\ %<)ù.!hUqoBRi}ujmM"u2 lF}^c]Kd!/rBTиg py L%k{y`q[DCS}%}bї‹}ɜHC(jChPG 2OhM5ޥo%M#֚I{"ZFi9o9"3`Xo `&y_wY+3Gn{.Lht1oo]@:rJT=4]es -bt:;TwF?yl1ꐸCK\h{S]~~geIm~uf8sd_-_0qV/9z@o_ JIp 6A'#g=~&5rVW -Kxe'˻MmހY(-CcEAA ijk*nTۘ'- ԎFq8IX`tZ(fwπum$\:s- z@sY~M'q m̮㹇?u$ RT\pe: YY 9!\Ca j jj)}Ȇ^Vi>Jӆ[*q e|Jkc՜tcxS]yGyBxbSf4R@2jomf6Nfz!PnƲWj*a J*kŏ*[M"i֊ +/y#[doϦ]K(p; mXʵG}%i5mPCcZzƘ Rgs9B2l12ho#qGSo`ZXB`F;^ o冏X 4uH>$EѿnYACt=2^ 5f[仔8bhMO^̜QM?6}=٬us%y@/[x0%K/93HOj XtK@Nu«@NCu( 3xZ%Il6dvԡ)ٹv:& WT}W1ۓUq0A/IqU|ҽZ*x(8w~y׼8 y*~L(lMƮ ~eelDe>cJ|jjd->&MIquӢQ%KR34|7Ǔ9vr ljGϨw^WG)zY˃Ѥ3Tz'30i԰Lp;Ӎ?.LMMZ @| -m| 0O&8Wr \V vPpc*cAtD?}\:8U!8:p+y7]ي:6%<f%ǷGy*{[\\@iy=$fЍc3S-:ܛ8 qv]}Z9BQ0_ ^xoR_Wcg2Py6'0Ӂrcj@dORuVuuEkc,9Xm2T3S /F^7AeQ>c<32ٕ[gew6{#9j< ΋%C8Μ\k%" dgzјz嫆^'QT tDJ `RXQqkΓi1 ˎfߊٓ.zNO.Y*FMeM!+fڊY -]LUtmepqyM&샲i [:ё^ɂAW5DOX \#TICQ/NfKex0`)j*1x YE\2L{'j֣`jr|8;gٕ+)^HVe;X+o8kAЕ^+iPz1O!V+kZפ0Rw*oļCֹ ?6~VZWW-K#ly~c֕ĮU -DOX୓@#f,v}bva_%PkȤڻoµ=f{c0]Zl9P" L|M--ݬT -QODm3J\ -ilœ2ј~*ةO^fw⧟H{$2h'e=#qPi4nk54+]V~}Xq,G -b=f1ƺ0S4wsekӜXU l8tp(Gh5K؊JmNdqm=XM W[JfZ~/.*h@юiv{Q59oe~J+6Gc/yL285Ɯ#m=r-pQ,Xlq -eM}q-):7yOQmXlL 7[jxngjHQDATMqjfzpӃD62u)+q[V A#(}JV&(k_AV\0^$Qs=ƂIl2MXh@|]a,cDŽjg͵- -X郜 7Y`v -}g:_z Bz;oƟ |q+kd -hKQouBw%uԍ3l~^ײ.C4&Qz3|Vg> /\4%ϊOS?ZJfF"Soxj>7ϯVbW™4=]!+3l!G={O?XI0g3#>9zOvߦ.W] uVi8x f|%xtQ1B"% VxƕǛgZ|QUD.Y]~B):+bA-*ZK5"L- ynXeKx*g%Ĭh:x4iT/kκ!yl>t4yVuU%4ckhLZhg{VvkZԏ5 Sك\lL y&}I%6[]aYJW{<-i;2?WXHLm4]:K0dSH]*]UI#@ 3JZl&z +xC2u}'s)ǽ#K $y$u ˔^Α>e֤Cz0}"G+4\R:f}9Y%<`џVL93ߚS_"Rmx;Di> LrqXZN!Ǜfɖ*pً$LЕ ~g@fJI\P4TϤK5t@%VD9iPCgEwm/;8^;Y\.Ɋн]$3A~uŹg&#vCi z]Yb x`Zéy|giƣ>TIt):xu -7Il-֕sITd -reOiפ5w-5=ϬOM?npWIn{*=m5 ?Ħr\'d_N[U_48೰OHPR|Wwì5? zQ]p9CyډHO0 ۻV޳;\=81)U0M#EF.bԻ}rXt}7`R1)2u*/Vx_HG$h{ti@XҋΑBp-t8c{>P}fMtxsK/3O? G"Y`PVs3fN%^KŮ+32a\F7'xusj0^j#.IE)ex7sS6?ur kCT۞#U*84،w-w7kۦvH^Y*iUA[5('Y s -Øpݨz{zQ? !J~!t~AQp{E;en> 篱f~_I~M 4*}NO?f:V_RF]6\)Jo{I%za$߈yF,/Yqfo='t?L \i?:T3'C!@ yqm~7,Q]R}5 @ot,&-p!~:?B+TyFuf-̅ rvx0ݧxrueQ`Vn2kOR/F~Q|-x) F6XmU|2jygwdmT[8rJ`DT3蓐Dc䢳V.hpeH} 3*jٝrDG"BSvT599復~PpCk)W( ?GwZp&F E荠3Ht> trel眊=BXtL)a%6ƭL%7IRi:Pe6.B -T[GßK2ǕsǼ3uL\ɾG?nMtzORk^md]X V -[r q1sXܐ^?!؟QqIGF8-WN hx爬ƢKg7:!NGn&;:D]|7b">(C {ʜ.FD:&H/^Zaޒoj¥(hzKW*Acm^O?t~$ˡ=gӎxG8*vN؊T5^Q.SJCx -Bq8VWk\3M֯h%Z3eiz;8-Kng#Oa&i>N];px7qU"rz`+1_s Fd SKZL]Yn ˿U?Uҽ,X5)mFAT4{=2؏#J2Dw ^4JOAsX[MeZɎ0$:jj}a-UtKsQI17Qл'_p'?t.=e{z::%c̴|3ZWr0н%{'O3kHIikZ$8yU窃b}o!;MJSgSq("ZJs;ە'G:*;!3kKѼy/5wk9,= ׃ Y8j9ltj::TI05|k)?9W] d1pEzK{r;?g27Xb'}4}#FdN4@}?CU[]vxZ(wMܥ_3/Z@ -uebȩNJQF ]rC?c0-(DNs@mIjh6EuO/Ǐu;!yZ[ZcA%I?s}x)^GrVJ5\e:Í36]N JtT/,!_>u*Jv%u:/k3N2_o jtGaگD?_ ";>f- ՗ݮ ::OGb߀8:2iNs_rPݙxtλ˛Oˊ;F3.k~4 rV wGѯO 1/檇U,r)~y4\\4|}= Or~~u~Nu!AmI^,S))žRܥ -ut؟2-S%gֈ,0z^\ xA69?083Of|37%Χ~?O"=FtOg+f&]ߋ^[AT1ZKnĮ{WGI&aHv!PaK-'5JgY:lt PzΆW;P/څo 6׆N=Qj!5 9uJjš )ڎD&]:CX/PTFG2]\VdkJ,ryux^)-t'BuUyS9җ\|w07X}GPDߞjW -hUwiYHE}E+_2FAI Nc6i{oA,=(g>)5>T2&n7j%eX% 阑AuOnXΰ:pD\hphUk` -x1yE^|G1s9:|kN "kB̓FHVn+TfqZm[N `WLMF*RRpJ . -x_QS. p lǼL,-= -#r  tsU7?\77ݩ6:9oco؍e>_d[w[ ~/?~lg38^烁}_N(uM`jQRꕚqȆs f2B5bn5!$`\)|'DOrYﱂ͎Ir+ɩН)Ψ*)o+>1CG4Ou[\0i7JXƒ f%@ <.4΄u)#iLg|q(Zo)A:@b(îreʼ[Q 2p%3̗.eEFh5< 3)M0c`[1!['9 -^Y"ub !U”P\Xd@CX%ڙq*&"ddcm!_+ -+mE -~RhnOBm(F^_AT%>E،1;)bzKY,q/"1 [=dP)%5T9+ cBKq\,aпhm -\ӋV7sV[tKP8 -*?XސPg UiBmV,;’Ru -?uam%7!@tDBʜ=8(֢AQ-LՑw!"FU l"-׹x3SgNq6%p߹o,WJ{YaA|5p|SkcNTtARpR/qbԷj<7b$F5^,L- oܴn7&/L]jXF/ lm~Af׌-ajV}JUר/h< MLo20 Tɢ&||% a>+I;;)Òf -!#Wڈ:PLX^^= ֔Ȧ-leS[JA0P /Z? ?Tꍅ7 )V4Foވ)-#V!)y_r~ cF(R1p Q, -rmkG/r|wd\F_oN4Om QֳRJ\3?c(ΡPj No1>Q ,ÃbY \%F7%=ʛ*WrRB╁j_O)q%0Q#S<2CdV"10HM]za/;*-G9j,CX<8 J%FdXRWE{߶>\_q5}AraxF?R%?UP^2(gld|\V`=1H4SMZ[aq";:?oTJQ nS[m>UASG=9I{q#]ǠSًKeç;A%zAJq)=t뫜_n_n@!n*|^؍On+H?N.NȝCiR*QZȢ'P"ʯV!J| -ia<u>j 4}29~~IK - !":=Qckey%B_ԹW*'"6̿ .0OZu 0f;H5qFf^H\ܶ9<}KZYD b݉u^1iZY~1ao4wɇGyEj L܀2ot6ZiDcOF0aBOe"倘0x'gJ<[2kr{]MD*^e=njQ.n.UnfU0%JbW*-q}@3zOp/Łq 5*R tfA~__pR*m-;JxpuB䚃\q5BU_BQ 0Ssb` N>*]7;!f.ZwRZT8 2xn搹q7)%Yr0cH sx _*2¥WL8[^w)慘:B4j\.t b|k2+Pj .܍?ąwFPEXxv(wG+geO'")`ՀD萊E_#nbO -m ޅ+-W+gG`dE/45 CPQ7pWRjdqʧRߟ<$ka`METώq.V1𵇋Pq1n7.*j-urw.NȶJ P%Vb+D!D pbiJ> ?\ȕ.}ʔT+&-Sx=z 8LH2IR_4,c(q5crB\\>C:h_,T\i.-a0eJ99( -x;'l<9N^\g⡰ͳi`U9Q ? -%pN$S q,Qfxr-[1|I SYe/ŕsfS.u~X>5/TL.ہFU/9|"pc88\4w$wg㈱x%#"%PbeQ0P:yTA"/ZnrR˩aĹeˍL~摛_&~j*r\k-QƄ 0Oθ Wɫo?&]JEHqlK**h}K5/PV_/1sLFx=ūa} ʇ犋7*W\sQ+*Ư>x"0ฒQeqܹy -KSX<Թs.V8]~ -be/RԵRq^j*xXJn=&L |R]As^XU?i}A7-|.W5\'6 1,s[[ox.%Qp\qE#Hs +g.%1d0C\ʥ.L/SU$H՗&HeBJbeR@(֒@yY.~Da/:j(jY,QX.+++*3ƥ\Pps_L]JypC2Q>!P5_H -Yss\o>9Oeƪm⣈PʇJ]J#.$A1W7R -ww&Ƽ@;R$Qln -W#bܤ[Z4fm-SP/X eU1Sp<[ܳV:|(%L~FkWe,Nu0X&8nQ8Kfxx<R_quI\'ɋh } ( R)(+X/y)'| -7 z3GS,1s> ~ TFFar^|UyJ`U0l#'T s5"f|K|AKz|1NUBΙAWQ4m) $  fQ\wn% -SC5K`Fk-8?HK~5phϽLmMp,uҶ(W -ڰ`ݿA|,I^@1jF:#3 j+2qqD_ߦK -[%\SO\}P-Qji% P~.j+q\h1Ш aU".P-ָ3*cRCq/@q>Bx\ 6'|S,.'hZ S+T+1عPٸ[ xSTÆ}D–6<xq*'`IOP7.b\8V1S*!n%E#L;Ln=fAtؼ/z^Fn. WŸ~Ou ]®RqR&jƃ\~cJ335qb̺^yx|BPe#)b }fz8#%q?-5 &&f~ -,J:p&oj\u );^m!rX#7\%(嫕e,1e@P+3k3flcRJ~.ViQ} -^S'أVU)de焌aF/+gy `E`fqx3f t$u$M" @2h0o{ xp5Vڶw֞( 2P,q]45DLsy⬣+!ռM Fx& GVqpE|B?PRmPP}@]EƯAQg+` N̪Uh X%_jRlKw2Q"/B=fU /"L`k[e:yуs:QmZ :nxftb;{qD7FLmu[ԷUTc4kA)7hjX.R3Q7JKjbCS/ }p*k.\h7!𺄯Px3_ĩ] ~}ʗ*!}08WO.P8T .ru\ĤAc!ȘVVp%*9q+;{dg?;/'qxvx-b!)zG-SVP@` މC+|*8UJkn(c5*Jd26}^#ѥBCm/`\Y:pi!+a*_(]ߨ0ieiL>MuM8lG'h2MS p%R -ej"goܡ +YvxEԯ sUDڃOwfxrKأpT  HótU/)2#au,2{[ua2\8%B7UtUiw-rY RՌ4b@k:(ߋ>,@*آTx-p* 1VYP%t*;zrޢx #W+I_KzH~{{eS XZQUP5iAT\$Ahψi 6Ox;A4 xbuj~(#L>7V00lXxV@c F׏ST`5q\@Še|'BJ@jw:i%lXL=(X{*ܸ 31`ZUDfuØp^xܺw_X6rŎRWq |?ub2UaZ¸uYPq]|U,u \~NR .*8>5*Ad|LXgGxfsX*!ŕƥDkU~_F<\'-- ^ަuP -&id4- d6ŭqd~PT V>J;й(Jf@v{jU ?IBTCCkWp L]2>?PA_p1U60u)X/C'ayfo \V *^mmh;)U -Y@5\A P X g\,(rb$ Y<-W 6˗w??vk8 3Ǟu! ]JIEyICA,,8cԤ%6OSJ8y-/'7|-Ly  -Pn c> z(hy!5!Q;fJU+$\l2%G]J -\Q^]$+w/P(O!8ZBX3e|b6BDZLAxxQ,`=59Xp8y_ā0%pE#|!$r/pLyF\j$|%^u FdFNW4ȁ% _Ư uսM;*Sofn8do0r'd@ L/Z0n<+S6\ev|}N츐(bKrPe<.d#pݲ-~j!lX0X7ij&˸tauJ!P021/Xl?dQbXmy0P-@E>P|9kTV$}eQq~jVU ->jpSsJy8eP|x]MԪ3Se@SPb\-F8},; G5\W8b3\S9G\gs8%!3 0h\dmnV. 0|_VB?cw\}\xfe$j,Үp ɋ 5yC1AAD/髀0opJjʛJ:R2J =0vQbWԬ[/TMD8YRS8ϋLܐa%F2F5 -k1냀{Prz[^׎*5/| *%RU?x!p %pk0DZԺBՍ?oڣcRҥvÒG8T?A?}>0 O>%\D"_:(fJI堨QO!lW1T8sZCLodfXEH0>NM )ʖi۽@ԯ2<"GO˔e${1y{oʗ.$6 -VUC qbC@b>S6t j,B/Cn^gĭ^ b|Sx:G8bҼܿk5keMhFRX:1[w4L8UU+sb~9B @2?MS p^Qw,ꙕP`살qB'tjgԬFŢ(P6 -%֟qpNq1*(l*% AYkDxe07S=4PEsP#M1,g&IQ}ʅהc:y%RV7~e}? wc/ a!0HC8H_i8r^԰=(?`|'npJũ|l?ŨKeL/3lQ<0%g㑄S'fW%;G8_JWT0:X`U |G"eKnns [EEVnUʕDȤ[ȸ2ؿv8:gY{Bj)C셉K|2l!kvUxnN.qҊPT.xÄ% TxC*1P*\=q( $D'fNv!OU~`Ec-ΕřemhTZPO:}3(V?H@K[Q΢l,i0c튩lň$d JӃU+T{epR5ߪ]v=m:s]]ᙩfXeI|JM0 ]Uhɫ_6]L&GߎB2\S /l*vM_ vw.uVR D]K'4G*3oZOp|ELt2y_qp5䍢TByd&,n aVs=OMԖ LBY^O%uvAm'~ }iv J{qU4F=@L-0 T86ୟ0lESccS0s \U|f__^mᦡ=*"7=̚aj׈p[ =]iUPupЈ *u>=>|}uـ`R+HS\kk~bʾՃQ=?̖);ChS!Ԩ鹈cRy549(Z/C4 İS6S.ڋWԤڤ\XL#S'R8f: Hm_^-URݩvPl~څY-$fK aD@"7 Azn<-|3m?YG4qޗySLWd?ז^!P^M7;c1l4;TLnb==,c>V ,WQ|ƥKڧk;TT%_U?(녟p↚fx!)! J=- 0`W -{gzVD - ,3 ߁~cHڭnhWHL[ -v4n;:X7PLWW|Ō&1 .:.jʗGXFg uӏ:7C)3U{YTt8dcnHbFM% *|7Wy2\nf2[ >,v[-TgxA1Lz\q sqq W )jl` L7^7<\\vp8~q._,j \VuC-LSQ0J&*mmkE̾a&>WMA )!h? -_XS9*bԹ:TRm%+Iw^9fd@+e 0>3cFkw[QmLx|ȍ,dπu S?γG4E2cV/i;#>5K]a:~h;6"CV{ʄPXfN[Bq?0,r qSwv,bA3Ôx-Pe3wc{r>< yT;%3MpJ.?C5D[~-B>KEa k}S\nXuXqygLT(lkCKjTF-UqޡL/W=ua1Pɭ{]cYmYMFni*mA'ᮥ%`<ȗW?,GJ*&Ffx̓*XNaZqI%^'YRV*UP㛟q -X_=r|yCP+.Mb(CSL游?%8-巎\w 3^z0i/ſt;etp*nZW%LTfukD]lS\?P<pDW,uj33Opz%RM5o HGvW`-o5]kK*MA"J=JGqJ§sG&?`m>Ny%W<%qfnٞx!qqc/ś(/ogQSf[{1azh-Ćp&XS9?Z9|uXnuq|NO|]|.2ri犉qf|]W,7+u|lj !_.yabDn?+i]+J2QSA  -ě4ĭ,+;]‚資p=\aL2ʔo ڑ% )fwkG=}:U9.%3$`&=2sK {'rʌxj(Fz߾1Ű1ZEp<4u&Z' z`-A{WP_NCR ˗/|/pngp8r -pDeKT")4@X)NƂ{lr'_X -F~\''CyrpKz ռUJ WE֧֯f:j7bCVirQ"5sA pnW*~ Rjw{\Rb]? bg -K E^eV:brv-.^MҾ-]|%˖jb\ڢjJLg:%xQTTlPK͜4>S\BJ\h%tq25E-˜*#&4XP="9RPNm_wi.ce ]L#^j3zyuҺ-#v5QG8\fwu `K>B=p5Vj_ 8.!%q$Ľ -c#w"˨B31RS|Y2 jpQ*_esP7E)!U0!'pGk* bLw1VrqU/z(S<<V}kl"Y(žJ -bێGZWAzLS3Cゅm5=SZ"z`.U*<7-R3Ku H(Y1Q"jXq1PǏDqPò3f'p1~59ξ/y-Q]da57b'b|(LA\ƒp3®9*(JBt j) -x"&%fc KFիR>'3)̇E$jk:j -.Ƹ8r* xu[<i6mu+!mƣvĔ`@=5lxAQV(?PUv̐ g5?`] PNlGV*]c}M&Y fbwEа=rBRȮQ+Q%)Zxj6C[8'i ؟u5vQ = )wԺt0!kl#+"5P -;DzM_pfTD[/[U,. nCf%o$Ca b - -+Sdc8!bW ]k -l&kmSX[#ƱHQ<4\ R @MQ^UQ0C;_P]ʨKܲ/, ]Mŋ+~"h|33{YQ8b)+.P,b֊ iYqQpoQD; sP2Cm 1kA0[Q!΅8ZVz: 4بHe8 -PH fj$FQ\iP+ pk"-b$Pʆu|#ཋ-$yM[pQ,n5#m晍 D\ Rjdfmk]\j׈4l -fJ[e7\Yq"cy).`1q3_)/\fJ_O^c. .eJ.1?*or&@hW3+V7%rs\s?! ^u\*JH3*AyjGcQ%++a kjr]WD̽]b>QsТ(>.K> ]N*[s^(i^A -rwA@ݗjB7D焕erx'u\x`őXb1ǝ`,£ 3rYCĺ;>^xÒZL K,EoRB*ڼww/]BĢ ybl -[rޠ6KQ"T`*ɟ]V3IPک#vj=6@QJSZR05+~hE0X]-ub͊ojRV oX/F&؁CDe0rQ.M]sw~ᅗދ0)r\W!A* 1f8&.5R[7:RƧPqL 5Σ G| \jb|T~\?2!uBUJ#GbrWP\ YW\ 用%K̾sIéO -t}2Lqu_JR -c7k -$d*{PLk _+N 2@, >RKY6,9fyn2RaBZBX E Ԧ>W6[QPO3=ʄ-B؞Iw9Tl1\]kb+qOkU MyΥʋk'g] Thf57b_ӍvՌM\bvSH" 5dk=?}Y҄)+

sy9ԨFS+fW>&Q R_ e -W<\hqvT./0?AZi+W6pJx9^.(5 -G44.H*P|,Ȱ#[Ծ[8'Ss\cSW ʪpi;6m',M3¥27h'\%1#r5"jE5OJ#;u&%V2a4I1Fْlno -߹5a|g\LmƦ׾q,ȳX)mim6|K<8@a{H<<:͂hB_kRXLhZ\FFH45Kǎ]ACbqT%Cަ"|N3)f$(ش}K.k8N*f5jUfhbZ;|Jau/HIT|1ar e\% qq`vNU)S[3$PRuC)Hdڼ+pANשRl}vi,7h_ˆYYN;N]4?)?* ж) -R.ʱqsF¿e*qc픬'J-"Q4qQ.ˌ9y~؆%'1{:dK}4ƹa5¦!S7yj<\FU~xx+8G|ltU>+A0 Ȩ1÷xR8ۛErS:_= nWtWRm햞k]\_w "l Di+Ug^l@=F -0FmA&c|x넕WjWƏ1~9|к/ij.!l(PQx]ReEX;Nr+jmFsï|YpeqPcSJC=c"+:> Ό}Y]`WǶzZʹ?ʢlĪMK ˸_!ݦ%JcAݬJ9TK]# }cM&y%I ]eeRUJ_>(F`r̩6Qc5\n-qL|u7?5;'rSw|9ILY]uw7/\cr"'qS˾ -~_''+W=+qi3&n4?%oQ Y3~y G)|WY1)K50P1UF ˌи%단d*&][ޥPo*7 -{R{|z#ywqos hI l[bR-эvinNw _\7CK4vDīaq;TU-(!/ j[긼8TU0o*Pm-^j,&SQGAHfՔ#\_ j-1|ECgLpC6o!y1(%5< ĩ\301dbJ]DYj n[P5\ԳS{cwqP璆7 0(ϥ{C(ERMLss:.q?:Ng7âhu-]z>6$ya7eMŋt[k .Te`"nE̍XCQB+v_*1'D 늝u7e Gm{Rn:"Y:<2}|s\ws<2ߕ|nce 3eq[=JpL}|t\"gG*\rd\ 1/a|TyxYo\YBRru~?.;|]Tt5\/ |AX@p/zϹ/FJp!~p -[ BkMR0 ^W7Cاl4J$I ⫍7z)tmh#S$5ǞQ]1ZWJ egÚSJ{yxQ]E dž3J;|:Be>U;$qArg/W g|1灘 зC TM̍#:T {5Jno ~>V尲fΘdHGe+.FYf1U|ܿҍ{˶\dod!Ph7)П,V Tp(- Wp`ս6u)vq`-3WUR5Xj=/2+rUKrԐ4=:Y:BWy:P˟]pS) 9KEl-W<f!+Np@t6K7Dl/ Z:a8J"<؄vx/\Uoqx_5 c --̼LGG<0Ilojl[Wee\wrjff]򱹐g5S | XS:6RN AUiV0J0,cqn^{qVk݋uìNX Ew7Ԫe['^5gGz7_ A( OAo fopd,#ljc QJL}Kx,YUpˏ%Jืr C1M[.~\|8PQg+翍jơO D^j~yBkm`oݵbġʾ5K>9P i0 FS`VB](˪E {xVɫn[qb0 {/ڨK"82ͼO # &lb{9FjhEdlޓŬ"ae6"7.Y.YRVr зRiV>h%jcrR$UGC5l9} UPnW -%m0#eKPQX-&Ux%.7q1\yc<ߚEy GB,!jL#RIvqcK,?eKqUBڢJ!> DX]> L2.] R0ܬRhA,!W|D5p:cIkT# ݊[|p}G;[+/o"PyQdeơ7rpPZ<Q8q\cuS\xx0k*]`2; 1Wfk,,m@OtWqdQ孢1 + ן wp)*:6EF.Hz#K`]FS|]ET5+ -Լ@*yeQ S1LjR6AktD-IbP8og,x/iPsKCIBwYӡVg!aczk_w F%V -aigj*_MO E2R*_Xe; -*HJ-xC(7NkqT#O9E5S,Ψݬn; {A،)Hg#`Ƭ6А-Q~C*vE? -;GꙊq_b. JGq^/2.[𼳯\Ѫ&Ҩ251|θrqYZw/e38sq!5#2QF٪RuJb\dKgˎb,L ~7pUp=$"!j/XjiL"ĵ:ܥ"9!Y٫ 3O7Qނ 1%5; w2لD[~tE3TWQ/\*G)_ /S3|]D#TéLS< -upaԾVūA ˚'sþYY_Q5fGB \Y\vL"\Q.& stFZ;3o "]:(jy L]f-`ކ@Gg.9̸-JP"f#%Q ~ n/&bgmP?" ?! KȂ^7v#UN*yX3u` fDJfWKe&[ Z8jĢg3P2bRl<֠LҦ -|J:X hʪ+V*Y&'Bb0LH^MF7wCyGΚU+YdUqҋpl"^ Tޱ -^UR+ qLG nT;y~~IRd3atqǸtˏ`ˀ;p-aDʍPQeDE U 0 p"qiwbgxLrsGCªbhpS<1GxA1e2_qu!A>9({h6ޣ/;JtGfmaUY'`e -k&ܲ,s+eT7$DTcu7|${qREǂ3<qO)[uLjΡjG\W\W W| x*s@1-w/+Σ\<\9oo|kG w.[AdĚ8W/'c OLgF"5D>e.%ĊHQkha`jkk ,5E$Ho BdiXMүr鶛.?9Ur0_Z.12\^fUi?ES)Mxy.;b4k0ŖQeT:D̡ 4+Sj˻`V/h+,w e5ܭ )wlȏP(Uِ~Ӏ9fKr -k-'N(6 ZAݺSd[a5JVι@ku|Sխ5;6S3|*kh\X>`:r%()e΁|cFUw|4|/K* t|:(t~raLDޢ -NArˏ \\R6"5_OLJO'ؘZ''  &= VkGA#_#٨[P:*GV/p `ݞ`mT?pź_@]oFO .# ~ AQ P+f(#s\\eY }6[债HDG1b2 bUqԾ d{aJ.xX1 ru )0 ; k*WŝϿΣf+Ȱ`6R:lgDs#yps iBԶ3 -5\W$Eʚ߫EO-Ńq7RpUb69% ޠB% [Huo(P=E]=QȰj_M(J4X R-Ye;huDCW̠)rxp|]LmAsP3(rԧ|`c{je Ҹ-Qr8~P=3d[_KH6MΤh=K_7Α@R!}.[JRxK R\n`3u%b\1uXg\Q|ԡ*? -PHG˸D&W.\r\UU r2428\+xcb fe?geb5+^?cR.bVÏRaz)R(_1Qd.*e!x1t[F eڂǨD=(ُ/qK|13ťֹO%;jv~W:eQC.&y\M\;hLFx@,/F,#1.^8;n%rjXmx?48s#*at\UP* -/mG6BjqQ15 CPJ`6[TƂ=Ql/\G|8ЍM!m.*_.yeloVM0% %(&eb_E"R8ۮiQ@%˟J< Q3q#xr|pWdʚ,ulb_7%yRFV -Υ| R~%ćG.Ä-]|:1q Q:cLB\g 2Yqb". -8,p:Mmz.5zOj rm0Xi'epDa~'Pm3>" ZU.Sy$@h6*9j19?u zKYi\PwE\ RMf mU, o-̗*hPXUNm<-[):2,~[*bQ1m:4"/) {%ӿ16~KCs3y9V&o=k(J~Bzr|cQΥCO2~O$\$pr-B[ƒc8H{8W¡N.0RW;[C)y&gs>` . Jq\\s@H Ab |U{ % 7yދy/ 4D Hsi|"u -qXhkN.=q|\i)i)A%r6nnxupf eyEu*U\MEeUŸSW.;T=M%$xHbr˨K0\mZ;Z"Q{In\nl/OAO.~\}7- -]w,*')F  cY˕=&.buKBu̮Z>DgRʣ'rV1S<1M-ĿtVNW#|W#&nհ$ -6T-]qv30WQ>ާ>4nPf ,.+]%ˠ@k1ID4(H$2kB:.*WK&4ٱF̡epo6b Jpv3$*7y,%N)StJaҋ1樿(b -bL0UZ9q%Ju11,x>;Ŕe*fڗ3-Ep\c0v 50!~nY:DIT!Ylt~f$"P,B;o̚7,t11 -嚖uxw/⻝%|esqS>f\TўB`FNɷpܹpK`es\Qx/K6s˝K1ZL zD}叆3DJ7O~?E 8 -Bj;P&wOUh@ H$Mе!lfD)k:%2<K3r ۏ.#;&D*^%=AQZuK@{Ì\ |:ܺᰩM_ - ю=FTI\5w pPtr~aP[ ExA ̩Rr`|eב! ĈwŚp5Jg;_ a} PfN 2@x5Mp1 `\DBVs}{%,pbkQg+pjYXxE- tExquL)fDb[%L -LUZ%BcK}]X"nQTf:xQ*sK8%iD?e,d2UK%Ր .>U)b4K j,)3B 2M؁Uo"DھAoNZѫܥ(KnURWɻx ?vqli{HQgX@=5 -UK{xJ7 XfH\g3YY%\JBUH* Vyi}? Y<K9Kb8mO'7+!}OLyĤ0O=Jn,+H) 1t/5j[d#݅LGvXI_5WlIVU#) w-Ӌ`,xQ6u^UQbP+ --tYN'vhfyryM5ͼ*N:TYhL0uMgqn(|<g78U"_񠫃vv]qD=@a w/?- q\xcEn"g@tMʔ]pnUoL~J}KQLfS0u%qWܯ -q\J\hܻb.mD+X.u.P4/ -+eԻ,{(0KO[Cru^5ΔҞKYRi/]-)ZTReM]/̸fU(5j 6m[22qoȗ+B pԕ;;R߯-G_Wz -q|_++.xXĹr bW2wF%F+fjV"*'OM+<&EU@yC(ܫ!z%Y%-+hODIGPK(T0UFLvX<7L"g+kL+>.poƢ\5u7ȕxJ?Vn4pUpJȊ(-Vt'3 -ʦ`=,juJECᗸ9R`"Lep."mqޢv3)^uȤ; ͠#$a@tJnW J9! Ri-?żZ.ݽHD@ -qLljVW}[na;*j~⎦5o'W/ @(w3ƢN@ޣsHu0b胄G/bUԴ Xf~!w0dzJpX\p#֭w},^n,̮iC4Ii^ -ژjd "!]V2^N GTJg*}űHx0, :mU_/5Jpܤ<I-O> AATo؃V?5 -(h|,t2/ox>ufgZ$˹JJ&D ?qA,:-^ {~薴+b)&~/>7,R5-*pUe jsyJp|iTDBV'#m*˭iuUtNʍ_Vn_Öphy4q녟q aC -/ ;^!w j(\ UWES!}ZV*'wrMQwi -|sNO2ɗlj)v^RxH:]\SW-.+x}DEL}\2dO9ܯUqs/0aF)P9մ)}!>Ǟ K&'OD] -or@GsH 1 xup.a>*/*~e+,/=StTr kʁ*zv\eAhl2GhJa\jjP.QC|ln` '/Y]Eүe*>J4:".jtP3P~-KXf+Pc E4c ŭq;+m~ TDHKĩ]s$nco$KnfL虗<BO'tY2Vv)~Uvs g`vntK\|?ߓj_DZs˅BvNj 3TNzT.Jږ[o\*˟S,v@nd -\~RɆYtĶ_I|$R^jÖkU/dٻ-s5da֘S?&Xܕ-4ǻŸ$Yn3wR0,\BHB -!}BK)qRWY/L!_MAAD4j]n2L5ԸEΚnjG&@K6 1~|@0,9$,!}*;4q23*\.[C6Vcݸ/z%Yx]uT4eWW;r|OckQC⸷y;+ f;ek7R8\G#2A~8%s+hW/K[zbT!XZ);)ŵP:z3-eHaY \Vs1);R\C;PhoqS5-b28n *>~9z"HzhVDƸ5QXSkˈmTm¬`OZwPע]:"F/qXC|. TQվ  bbH<p~l??/J]uԸl;@?dE_"]KKx.Y<.;w(uISqp_8?fupp~8.;i udr9YL]1baŅ\=73/kp4 -ż\7qg"qQkűQҠϡ.+j"}Ib䢀ژWvOv -7G=OKH;#kw*K)O4WRmᓰ.]审3f PY."Jצa!4 je0@+2P?/*S T"L/%.p|.%UT(+@q9cu1e=wcMKV{LvE HQ!K-Qs 8#(ȋab ؑ).3拏/yQ;/w+f+ ._Wb`3x\Á2N5)U|:ˋj\x%GEFQ}ˇ1'\ иf/ Tӊ7Կ,.R|\, 6 qk,g(JƉla|=K爱'W,-W\7|]XӉtT٬ǂrda]Z@+o5pp!-W62[x1&<+A]xK%'*B-jTL.p@*og -AB:| ~ƞ8Ϗ):ħ*&}_32u-nd84@XAe1j:$T jv +t?R{}CϨ V_oN陁1稹E*\bYv,\<1 SwY-y%S4/[ -ipqV2 w H#uޫr-nX,^aXpQ ZDsU[,TJ\kGxľ.{8J8W.TqJ ^;^kx(ɠ8'1<^# - ugVSu|XPQ1qmDlj|JN26gbWQ$%E* ՃS-BTu #1 XT ^@4]R㢴ׄv* -OuB*<;e?2 l:<O$@ehWT9#)Z|<.f9J |,-RRqu`L4fMJ/P]!<˛D j{. ゾ :V::g>Q"0z@yG2/Ļ.^&iˉ(*]-<]RrgCl0iѹ%#udulʵW.Qhl}.m51ۜ@L XKTp7bYJNt'0zUSe弩EƲ,^_: >DܫWT˪U8 <9W N/,`~|pEY8\VUu$EWrBujZԳ"eu0U-<3ߎ1ľV?DA1t|xΟ6DR"#H|t\T!/aZGsDz QYcVhSP%#/lk -zO/], UdE@P-_F\W8q8Fk8c)|&cKgN4ܷw̙Y";VP#=Bqa֞ɿe{+{HlIJ=a.@NՑЈKļ:uKoa #).3ʙ_2ӊ"%b"J:jgA}pW Pjl&z \?<]-Dϥdr(f-NF17*#QBf@H\ك5MgiT9[d`%4WPMBptdb62rnkːO5.ġGګy>dsf?T&cͤ$&ԕKH'Okn~Xe -m : q]-e\ -}3P^qU!M{jG*')F|;)3z-mm #]wF& 7ԜI@2ʖ=Z.!fq,aڋhTGFyET¡J1rW/]Z\:#r }:K+1>@P~Ko1U_\ _҆BPlj>At}*CJ>)/r.}Þ:,~Nc,Q? I|$%\M$ ^b|6|5/K!^xc-usHwPJs|6_dN#ɀw~B4U?=45?A#b}lb}EƯ#&KRzmqd`u "K]r̬Q0&j'JJW"SLZNwaMvq8<4nS632dZm>!]1/2&8K81} Xs+$#`ZJc@u2]K- -a7Z) ]dߋ}˸_~S kmHkK{6Bd}FŞw`)%k~GepPs\8䟟^R %8-,e̦IeN^2B`T ~.!*lxb4er .u;(S늋>G̨lquq^`S/#1E. MpʨGQ ->b1iܰزlֵpxfLnI YX yVC9. F xI`U;X'cQI]@Kj yhl L-0Tݓ)h,J9&ZZfs"b)]grn}Wc(liWKIcc+V}ۼǸ˂ҭ -~EnU|o7yD~9^e_ LƼ˩v,Üz*?qTR'GU o)#Vx -ά#j*2^׏ @zkZS=[~uQ1@5>J<ZlEj}"BHQ\=T~m'7+DL#@DL4܌*`zz >ao{:`Rl"RK! \0  >uFǒ1.TVe$!H1x8>$rXsh+\((OûԹtJT&B du*?da(ڕl.!P+\%<(LU)c+q4-oTv26p,8w0K3 4=E`55QJnT+׉nfȉ hӾ&a}A,#NpyȰX̬b\gR -gCfơ3*(,_Ƨd9K@S_4_O쥦NڅPFXH"QRxf w^FSp_idTj@Yb-槇>b?2Tx6#/45ᖐ?inFZDݦdI6Z&EJUNȝ'KUxPMJy~;:g߶8qtV@GXú gEU,LQQDbDhq-@|рZ9!ԄfQD.02sJ+̉Dq-" 랋( mv|(ᘅK-]٢8*zқl4 -ƟrpCȂzK7q3R -ʪ D N.HQˢQr{!~A8Ov7T`0⍈]1gNQ3kh 6 -6T֥1ŧ$M-!|zvH&+P¾}n aBO3jWqf5xjX.u3 H]L;w:T>8z _\7q0ԵK>ujh?r*{^ iy)=|S5a`bE;Ix_.Wu0˥KMK)#j7 -N._-` -}:x }Z.YVQ:LCU1ʔôn10.=-(C|*<R YRݴ bi_3^%Ar .e 6}(^(f8*j~,E_HPVIώz/ǘ6k\$@P1nLdT> ss2h_a -2V}S7_9uh)'N`jIfþF;cfɛJC-1?p<_aHGҀDWۧ`UԤBǟP]JfҼp"KDjǣP9i,~6JD(-kC%:)T rp3Rq-WnzqV\>.TGހGR׏=%DǾ*  wmP552u3ޡ=K fS zb"`<7+W -%>eaΦG]oϷ6_\.恏K}Mo A:( mQ?`TGwg (W0pheU1fybE;H ނ.bj+qfïC^%A:@a|dR8%T 5f D Xŏ^k^;翂.^eH0ux<bNn1nXaXj?˕ pYhI|bhO$`PJṶ`XWS\d,5X8cEG[A֙ovKzZtJX1IQ$(Ecky@̍}T-ai*E04-Ј23cwYZk% Jw֘\ؖ*Ce#\σn#)u-,XcJJIT%\\lޑ%?u5"^U-&ƮWlc/p50^;?3W p7ɘqZfgxv;f0ܬRK%l^}Mon+1:H8xl A)INѿAJ0&D+ ʿ8FGqň#O'B? -QV^@ K?IR5=H+UǩAqo%p7\p|˃3ϯ`U#Wۡ"%Bb*n7B)hajE}*%_@;C8KF:umTt'ӪGM4tM:}.U0JX݆^Fغl.!hbo͗tS(`E.-}FiuM[cZ܌[$-3dy]s%Y3 7%ߘ.sL2_"F^YR\w^,*|: - 6oq\tp6D,CSk~(Gɐ}z g - 2~_:$ 1p{rKc Y ^"zL U,`Y\"pt<<--|[D'>F]L~zQu 5p\V]E,W}3jƁ(q*Lx> 7/<%5 WB~~]IUWa~YI2= ܶ1TU`!eAZ&삾ԭoMOYtǔ+2Ŕ U -B{s19ĺ.)/I+K1' jQ{ -¹h>vB9p.c6(LauP~o6$/*ߘAcaub+R"fXB\ (S+k1n8cw;8Ap ~R^wHwu><\"(#'P~oԈ\W}AawukfV]B}U^u"GUFr$e3|RrrM#⧂`5`eԱܢ}DbIb;aؾĢXE*_CzeG EKm_=Qe1 5| qx(jqWf40PW9ޫ}VZᑩpũR]=P7Q[ԣ ꋺ6[€DxqpžeԺ|O2N`۱TLkj<]AMPʲan;P3[cKqPUS+GWl3HKoh1?r+3)n^wŜx<7U{Hߏwż"BįތѶ6bSpmy]v #:}:,! a)Nj<@Ac~lP[-]c?nY>]-5\7pPtJwg -uMPr/kDTu$n/r;a-Xj[̈́}TQ*>ƍ v f=m+*T̶hh[$Q4zndʘ,DU1԰ - + K!\j^J86^q*+ʕdR)%00FS1XDdt3p[cEZ<7XyǠ_."SIX|h?)W1U[ ?mUDbΨ5 =|rRU'^]3P K;8ebVa+>+%Ҡ5,7\Ε0~k JZsx]DB؍5UJ -aJ,$y5Up: -Q,^e((M ,GP k/zb57ԻL ܹlS2CD*LNGƸZ pMw7ܷE(o늹Q]*y$ Uyc"p;I v?i쯤8;  8(p>`mlل|9NÊ p}ó݂ =Sz\POpSbv濟aŲ̃^(Lf˞K .j"-R, VOd5lw{Cu s7Fd=vF|B8$f-Sd~Sd>x]"\; -겨 8R{9yWC).kK/3Կv j\|\uhydU^wZ!!Se@Au~ CPo T9e_!g|XGU_rӼKc bXOm׳ser%Z995;]G7RrblR\"6"W\j^U–(f<~i5pbF ;'?ɚgmX&1D?ԝ^?`o%̻%UqyEq;G*ˆ\n \\#G(y\$(*K`>Ub6Xn]EXF$bFJQ~m$K/?J.1Xb9YBUhÚEKqN&J#iˁD"jJeSw⧢,2JĪYTF/I0fq|.-fu3 -NM]8⫝̸/0^Q$fqԧ2>M쮡eyQ6,x_~|j?*ϥh.;CP+<\2ȡ* c>>GZmK)[;}#靷r6 K"E0xAͺK i?1]̃ /\Zzz`5S*jWp1pdcLY=IPbfL欋| \/ir (!# 8Ҁ-51q+$}K{|[ˑ_hopU:1ys|n^#du-{%cdZ&1/JOM$u(OsaVbp>'PssR18OԨKe5eT-" rэkx;Ke,|u??]l\1ι a<ueKX"@T qa 7wl)Gr K%Vpu X:b>IpqaNi*{,!k\0 cAhy? Mg჊LE |oGo$q\H.?S "` b.f\14|_`|pr3qw :H@H|ZqsY낵 wW5O'7a씷&Z^`6΍>+'zXoQd#xEj A!$Kj\^$Zv}+U`;{ k{5˭5rc1쓆ot/Cn)vԟjYaw @.SXjVw)7VC׃P/s 1'ZE Eݞ}`P$+PV񵪾TK]QԵ HX4$f_Wu~ ^qbu-ᯅ>~U |wE|~q?y)Xga|JJF+UYy"ÁX1: `A_!u_\ L)rb2Wof5RFv0/rqYdn00ŷ|[PkX@\[8^h2҇Q!xÔ!n@яEjWrΡNJJ:}F,#|SP7R/mD2rn~c+OV&k&G/cC CWW±vqR-#ƌf%3'%n kmu) ?Z~3ҭ\LQ.\3jٿUT?#a(=%왨m<hb9' B݅@S$Q=@[FmzVffeUƨ*QK%pJÊ'S6B -L8%C? YL>5ze:cU^=TpL:|_ó"U_^^6{TnzQZ ~~E/"l;ޮ%oszt1jW;h Ug@QQqJh!^?3S(r~WB֣-2ڦ DIK=rV0/ԉUR}}%SX2 w E D^{J8ڶP*x:RcoԹv4JaIuP<Ξ*2Xukေu"eKr)VRejdbQ&: -zƹ̹{<ٲ_\V`|O_'P5*2W pX-DĪ7*2AD|jU.1eÊI|2\ZK客,[FV2 >%j5ˈwn;t -,updžHTͻ% -Cc*-F3h) -dntK{f~Y VJPne^kNg\U1 -nWlDf.[ -XL~vC3.lx_:Tfn\x~fɵ Wa\Wj)74ooX0Lܮ+|6wwNR9*BcPqw-e"TuqRmJJk*_\jgb&h8w31Qso˱ߞo*DN*=~2ry% CrK"71U;y R1#b>Ws0f{N7=~D8yiwb3/ԋgq: @_:m__ÿ`_kJ"uxw\8?p*s: jcqSKܮ - ]K.(\ r-Eqk$y}ϰ8tU\b] A/7ȜzR:7LÑfEJ҅P e?G|nKQ38zF]j^ 𘀳u޽ƒ[U7xS\gmO+ )"쮩'3EW0Tԣ2ӿzYPsفcFogJbTS's3.L[" k!gЂP~"+f\)IRo\WRb⌋v>aߖ&QA**V9x8.U~ Nu|/wŏS.a\jw._%w+\`Y'3W~/Ľ)V1+51!FL -zxv_4ᶘ bp*Qgq|tĕ_ -y~]WʏS+ -p&̫5*3~ep3[TKr}|SS`0pS/80#Q_&,"ZQ̷1{s)ۃ3C:'T| g9{:P?QD֙sd|Q$_V/Rp:ԁl9'O#Ww%Ar4K;R E-+A=DJ^ ,QZ*]E u(S#)h\`P.J*TÛ~1+g-T=a\'%nA{:o;Q4;*"pjjZjRBP,KN^⡄k+ I'? Ua2]SeG}(ib, -s-k -[[7qիn,6#T -P,6Lo#gı~%KS$/n]EM"*-Ȏ;/!5 f&BA!\QܻԾZV"FkT*̪7!\3|q(_f|\slRb]L398#?|ˮdU>'2(icewy3FZUp(I{ ):Ԭ@m@OЪe?/% 3Iur,[ƕt- -n-P)H"C;u6QJ &qp|W(x`0|w  -t`]L -]IU-l?I3Ɵԩ.!!8}BŞ #l]ˮk6#yOS2Ce? m<@[  J4QT֯l0RqK3ƾU+akAlGmc[zo?ZʔBȖ.I@󌺿pI[3-eX=QE KI`uhct5{a,2b}hn -óbIj{12l|ܸBY75S=yಂ SE33ԼžH\[hvGQ+ʷfpLP bT(,.*[)2Ëzu|A^_y$>gX0q|a a%V؏Cnd~Aww1G>t$LPnx|4|Ǜ`TzbRߩ/zd(+/<k4g\XLu35+~5: 8uWksB ~ۻ,q~Ȳ~PFlNWdQ];) P:q*&pD'ot@ @ceby>c̿lң=N60B~ `fB;bXtjHIхmc?7Uq:%wٖ'm[,YB[玉uR|] _ڟjvp a@Cbh<ܕt E)>6.x_ sQ.]05XnXQe[:c}K\X,J 9<-sGP,7/+xIs3/4a/\yQaܲ.fxn ,&+yEA4cQ]K%K K1܈hVyHS|j+Pef!{qSy\i*7TAs{stCPT]Pxq?u0t"(_h~ ?-KQlC~Չn,[_F&C]BѤ[}R@;A/}(-p0!& 4D)L췵bB?d)JF.PaKVH%ь4n8D6j? {LA'gw+D!m/"2W'>]U.]lj mȳPsiTc)Io\v@ \ynhtWn|IH[%6𕻿>Qc*84J)D?QԩTle<|Y9pYh,\C&4S|!1;,c"h,wuSe$ R ĦDΣQW =b(V@cSWp̹eVƥۃRk @PO ._6@{0y -!qT -@Do ZtĠ)g0^f-,WC -_n"Mb)C{c.ʏFZ`pKaEJΠQ |Ì;c H#Mb9 ,w(o#myfh~6&Ţa_pG,[|*K6szݢ?gCQeR0.\rQ?|1pW#L Q1l&5aU򈼄IY mthr/ԦPoY^˚m5U})PC^306[/KP㉪MUE:ƐqQÿy]|jUTx׹U._.`EY|R<HL"ۮŜCdʼD5\e8U. 1P]<8L KupP3V3S]90>!nW*05O\~`W.\KF\#/UQuq(b&o8 xr,OR/7g{nfz,,Va.1\zW2rvJ7]pdR\s Mכ<1Ծ:Fe⑸-pjkqP к-x8H wB ^j+-/*;%ZN|TSQ7ndFG%B D@@PBXVYbpMJ4īOo1^ z -'efao1q"Cqk踾"oGt:'ү~ l+u|?TG*UKwbF7pMJavֿ .Bj8& vUa@z)Y:!w`ԫRJmu|FکgWfuϻrİ/ԦY}L$p _ r_R`U8/|+0 |Os+L%b\.|#6(,GX:HElAE N~YPMLWT_ƊPB %]Ap^e+5 -9RrښvØPEl#AWRY3N*WB\l.zA hIQ'2^\@ -Zh}qb̾/s  HKer -VueEEd "sL?*1Uܦ&ylpd20 \WTP.^RԷɐEvJkԯ蚿ͤA9VZ=;>='U?@nd+84Unm2EH3@o zM5at-hdnb BP_`mT/pΡry<@ LA$<\y l̴1l@ 7Y0W٤OݖeyhI*h1˟Qi\bz%G*}LΛ`慧$>:?bnM鸀Q+"%1I1mTGM%5ܼVM%( wM@b~f1 KO[MxbiW.8 * F0\%Quش6-:Zƪb9ܩ# j_/T'g넬F=ǵ߉%d nh?D/VtD!+URu72J.W,?]|nW-` 9̀˨ny/[e]Ke -Yf}|ҮxԢezjAUR-D#!%@Ahuܸwd%p '20}"bN/+$z[dRc^ʡH hODwC-XցSZi1w PaM2.bg0Lʳ Po 䰝"W)mD%@W7o&`A)c$c,w\_\f8Ƨf%JfVn;LOrlr,.k9~ R5o -*Qjq,,.er7^LS*T\3r J&,CG.Gs3(!w2o7^ Rsx0R_ -Z"<8x1k[3q|RۘH,]~ aDfjgqr5ַtw@o~_cє_(}X%QKæ~?4ηWh.ALq 7:*ʀZBakO@=EMW+tbX}DX/C6B .T3/8 @WЕb++],٘rxG7"ٍؖܖf#[)E츩CWd tk;feƈ #+BC3D %Ƴ>%D R =`7h$TS1zV=,ERpv?<] ԙ:UmD*P(\}̍p`26$X2p_<2ʄ])T[ -U{a/1J,ͯ\SiqeܹYhs*jz_1Uɩj#[9#6:dL1O2ˤ{RNuwhsrixau*g; _(7o.2d!|1\Bq 5.5\4ָM1~gPa<;⋎p+O5(c.r끭a\qmUWܹ?Iu ~y-x#?|9橃G$F}H8&茖"~'x?L)A0&b/ + r>H0NM}* Qs\_$( taF΅<+A2IavDXǸ E2{UD Psq$7L>"& ChiV+[)n^T8Rxj(Rעqift.bfq_P>> `0WXM(n F^/DnoeRM?sJ[θgW£)Y>~ TuU*|r{YXh4}nQujnRaI&DBA .S;X0&:2TH~` -)șNbUL_fk$1!ŗ/TFT8B? }poq -VU.%YK{pEq|aa,%4#,mo*]t<O%!U*_6MW, xiD87\ 7y~)/D74 ,x%T8 -rx]q_%K[&7>l -q| Dw5xID3 24 c3Ì˖&z~xs7e̹uK"Mrбڭumi=Ho\}{ՖCZ -Ys=iB -A4ÏD*k+Rݼh`⒊(w#K6LFU K!<Cq^ʉ 0Ju4.VX~UƳѳ2ְEBM~c8ЖweuS WeC\~I%66&:9H bUcro1Ĵi%C5ӷdi͍68Ir\kпu* 'r۩VQW !` E!*D!z[>iKLՋ_zgWxjZ!zP lVd%暂]JϮ.}Se>2&j'ria`S_bnkCrETlV<:*{F6*KV -,thc/nS*4-)@|aRL$:?WEVx\*i m## <5Y#׫ȜuqvW#^q5ݢ¡cŭL[*C<0ʕ=㛯zΗtlFx?݃b(bm(CCL+qĥкm5-lέ}RD'e~zo|ӽ=w:WFP |p*Ў/H?ŀU6!T%VKe<zxC.|=ffBˢЛPdZ8_16D*T MmnZ6}Ldfa/p3!/sj+C)r\m*:HIGW\83-X0mXqΣ3*&oâer{Gxկ5E\~K@6o-.uFg;u)OTxx `㿅|.TaG¥}L7QY|&wPUKS8S][0~D7)v|1Y4%/SFucv/GQZhۖvÆ4e1 V c|3DqZegZ*VfCUVBk(|1D+RݯQic@go [w^i5}&wE7S&PdEm[J'E/C!p^ )]2y(DWˉJ&Y%\C(=ĕ+P0U< -X5MEAp, l 7P_{| )pK, KL؊1&S"}'D PтTT Sy alʈݱ.ԯr8Os d^ -\Һ"h!CJ P8%{QT1tC%;]\Bv@|źf<r$RTGpQ+M.FFw y\ ]t#~Y5ztˊJ;ep|K~Ua@߳$œ_sܖX -3Pb~# IT[ [Qܠ TqHqCSKɖZ -T |K\B]]Kp`1D5_J.cS_"=9XBFVk\ xy!ǢTSjf䖩 P )Rc m~ͱyJF\\:QxE*'(Cy*ٲ#~ H^|2r k?S͔5Pd̯¥MZ\6W 8Qnn0*[Zg)̨_PRf8\'%if`m!+R.7#uSĦ_QΡ qo >(G]W\0-* Va/(qP( ]R9.9`4>w1ˮ.Wc;[a'm:YOOL.|T-iޛ%SuR "G`P6hxT(zd>PO a/ PϿe,@B+J_"`I-e#` ^Jo0sG}0wGm.\ˊ!E?5s4#Y/㪊 S >hAv ę3Ġhn %択!Tj-w:_b`XۀX}۹X:'n!_%,V ={R@h0ܑkQe)آ"DZ?H{%$ڛnCЀl{nxrpQCW!1DiiPǩwъke4 Zg(Y+P*eڨX]]•o ]ԛil5l;Sǧ$|;]*@Dv-76\OjWO6iDͰxM Q,M 0{-!J-fW GnQ;gKA%8y#O.Hjc SRV E;F`SbZ!iϲV6#k}W-Tvz!p~ -mu/<1*%1qncgl/R*wVljrrGU$!9heBαoe2zVo\9 H|G7X2w*0W *wE* smŴ*diz2)T=R ĪFxoQ]35m2㤨A̦2fZ -e.^huǩ38 -M\H*QfjY.#_*8xcNZ` qN~(ͪ{}Vm+^cq[0~jjutE$J.!*<<gJeԪ mQ -£V;o7lԦP_`]U$U"Xq4@|zP\A!Wᯨ=7T JtkF ekd]F4*ˆB䆗1 upb!eдڬ|au<wY:2Q(#Bg,ڬٖU4kqR̥wSYU,r%soavn]Uz7 -(*AGlfCf:5j_,$t+_w[+gP&\9셤Ti 'YJb-E6E1j%@@=Źn$i˖͘l~ݲBIIW<ʵ<9Of?Zg%<|3DX% zE5W.G=`Pi_%]bQI[H%M Lҥ\+ɽF-R'[>" -nahL:rEb;{1 Y~YkܵiA <.\#p*#b2,UƊ䎡p􊻲`x2YןE(0-?o{a+^ܠrTUrod:\A=J-ŲU=- < Oi-Xtx*k+JHhJRfL.kg(aPc+K20fTeJ7q J|C?Lf+P%JN}[1583놸s)x{^](z\:ߋbqYu<2qEw@7n'*^iy`57Q,x`> EjKu)QL}CESgB@Oc3=)iN?zE6rە1E2,7.ݵom Qko ]!@ + OP6ex}Y|QrxxB1N30崳 x:iLN tm͞ '4CQ_Tyg*`T3UihbdaWliT\CS#K ίAk^ӆT/Cy - -X\aPawkV iP Q v'.H=m)0..45!n*(Aol0&U:OD"ڥ\13gt-gY\?$2mD;>{;*jr!LtXܩP)0[-yAnd/l+0 z-PGNh 5Agmf.%|O% -dD/dK@_EF,7$:A3 -pƗ'q⹪wɣwK -lG{5kYpH;'lΉ+DBĔ ԋy"ّߔt#`#=8WLvO PBygNjFfu {p/Qb\5F4- wU}:ܓdt!1*bI]1ׅ&Ώ9kdՖȈ5/QqlEGEL"vB?" LhԻoPz5R4upK"V+/W;鸂JӖ>j30NDՠ4x}|vSc?P*OGbol2+X7K%6Yx˦ kCV{c5R"Z_عt@Htbvm ve+aU`ؔj"U *W @nc-jEzKR V{o#|u |'TVMXX2>=]SiƐZY|蔹LoUݰlߝEmr+=-5?qز@d;%[Z?3_b/DBe`YcZځBO*4@vG02xx<=+5 mh jc&@] -UX<$_`JBih -#BYPR™K-.2&Wirsfju2w{ - iۣ -۽M.Y : &yI -}!Ye5*^/do^O*e+- H'/P^U>żue΢Ti%pj>;n\>5އQ^7 -6,J=:h(:!kp={}(4Y`+-kqBC:eL~e}rlg3b ?Ԧ[nPr_4b@CC7d[|ZO(K(յ<pS-j!N%uKp60Rd*7S|Z!Us{jt,4T,PLL u~~h{(1峓 "cޖk@T?!3tRHCrC,QN£\h`tP!|y!.r/~H`X- cY6E3&uZ8<cqEp̴A~瞿 -Sd8Iw¼yKgܸ6/>lIw.a_fBP*:~L5n•U&ղ\ -cqځYAݭ}{ A : -Pk)+ *JTh\i| 7E/pW7qԦ࣡齋'r@1l ϵn}$?fm] 4,u |?[8RyHTV͐S꤇ǭZi'0$ㅗ[]ruJY3KSM"&Toa@EP[IrK<%Q6h> \A#3 CE5en]e}J[b i4 ujҲ6E0/v,Df@2 T%资Avta<2?LDLwf޺#ܗ}6I#29M`āw"Rwh]FLC*_Q=+|āb+j#"97I@#`αђ1siIg@/] -`+V:zio:_u>d8 -_R*]BbP!*JSl) -%Z[s<ղ8oP(.ڠ,7œ& [!L2,Mt"FӂӺM'}piWFl3S*1UdfVt25U,1@YN>!SW%s0!n3~cg2%˅TyjxXs)aaXM9 [x(`^L܍?̇"E0Y Jʺ,-XO՗%#SIsbE%1lkP&HE%N! #kzнoq_2á 4, -% wP*Ρ8e5hh}Uu5Pj (pen+[˘[nYE]ĭpW,uxj;q}衖?IGX\2C`^QF-gq*%PT~!nR?ۋj(S#q.^ڟnZf5K!W!zK ^ĵ}33 /jJ4'9kg+?q*1bkL_/.~IҜ<. Q'Ddh}ͱl-~y2emT$+<\QZmz;|yd< ؼGpښr%A p}$jJAZbq -qJ5J79)W ->Xl%Լj,Չ^/w\S4fWG+Hk)ARE"jz!mDE]|"NjH wh_=4$=(V7D%&bgiw/)Tͱ#e\-(w-Xni2jd9ltḲmݦ#B)`%PESx^$q"lE&ȫe -~)?rۯ>KfQj-v,v|y_\a;fi"%L*Wt(!g/f'F5Ve{-l= : wPX@-w{b1 WQI#m8.,an3m!hl*>+^6Im ї-x; t|3T;Ŗ٧e6ymK~?ֆfe K~SgH NAM\l @+UpQV)z:p]Xy9bBT4VU\\$COchTfubP&r/MLSVWxV+ܪiao YVNsٛNПg]])}EV&t?%)o-'>ŴsS*0$ĻGjw0$ ~p%+̎|Q ND;IGW!6E5ˋW'/2!Ie'"$ebTCzpirJ{^Si_*fWpHn5lҁKL2p9%ChĹdr6,'qg\ӢHІ "TyZ` {yb:YwHje,zqo%W/4S'Š<⩛ſldXnPStQDfr"[ !N:x?^+|d㿪Y Lr8RQ {oA7O@ 29QT -ͩ-utݹj0p}7j>nh'ƯcQGL |PXn-m>l'PhH,JXjz`7BjἸ -B)vj gt:O*6ų.hWmָ/菈UGb:aqP+1|_/σىr3sL7R~>|LdSo]OQ%%J9IPwĪto5fwpwɥtX:DL+R&L e[bw,< B`_DܮR?"E, }"2!O cvPf¥ @D[ab"U&˖9upT0\rc7Ī̾)|I))F5X-z/Q0Ե(&vh%yi|X[={jᲮ2;JFFP`交J6A7jnP_"ޟE PwQ -:T`02,t - Bb& \p,G:ؔCiX|v0"WɷiVA_bh(+5!R n$a+\V5-B#|Q1!s\m3:nXH]*%6_65FANK.^%;7g$)a/%}WI[Tװi<=eZ7r:?0z]r+kYMF](2˭Bp\#*4fM&P͕En/e\.oJ*@Qe rʼn-n;n2}%'ʬddF[`55ђPDS ||∐3|bxuŚ -7='x<7$_` 7Âcչw08 l ȗ 14!p5 -/Cw0je# -"zIF”P(6=a5iFt 5?0ܯ\|eEsSM?=ՑŜ&Ц^\UAPq7&D6az1%iҠTZD\hTA0n.`cF82nG-H U!fm [i~ ;8pc׸ -A]~+l>( -TbTDɍGe2lL[L0҆2ڨ].6/f);Iz?xJ>j6\ -6xyc~dXW' $ -.HNXtʸ=S\y\B*VT=D++e!R*cqߥ\nHu A.m=Ca!.kOP) \"FQ򚊩9lXii(\OKy.:x72si%30 'Q.dvgAzRylK0j,bdW'a5e "!YR[g= -n[ZeTk$)& ߦY`*r,4BAUi@leͅCJ ~Qor9TEkPRdcTԧAPSq)o2anV+^{\VԕP/?"\ z3S~e+2RWROi`jjLTfv)^Ot(şxYU<1?,\zmzu.@WYbwwڕ̮ƦrL#r:iv֩#=N贫J %bwQc˓oVflO.nr._d;a,6B'Ƙ˄[\b2Cv|s_w -7|xfSqnU2>pʾ]ù{)6`#q@~p63VW0_X/PO]_%[-r.U -'j'Ac:lREtM_#߁ cn J猓JĪ- ~gr'x.y`-Gx4)lĪd篃S Qf<2$vAϦ/H{0v:,뾖d؊ݬU5L aMrF]E2eΦKԞۥ]D&TTQN#0XFMȕRso$3 -J#@( U]+NwvJ}z%<TupE!>ǘ_(drU}7 TK6] T-~Dۅ4ԪTSuKF"Ia5\`Cfr7iY߿K!vx0] )0ʌ,h^REPcq`2q;!t#Q*V0E@]W=2i3@ -UTRX0^'GQ*y~@BTJ=՛e*\~^W†|2MApaN3*]z:ߌ -VtD&5X@U=R* .cMbЅ`h-݀ _+q"&0ub蔖b5RQ - )1seZ~!QWV2y^Kbక?QLKbtz+zDNW.DSNB@Qzͫ(COkl=i0-F`$ -n0PADju?zrBTX;nw=̩^riG@{+ԩ\j?-ˋ_u7_n?ņdj,Vm_ ݿ݅Wl.ZA+ O#' ]WH*X07}u[&` `yuCE"/J4tv] xEbKmVp 3:b N(#iM6x`1HڑQP~wp5+20AJ8urj^%ɺCKxy%G/7j'zmDS BUPgL.1qT"se`$1a &P; ;/mJޘ8L#UFkq@ qF$Q>XT~޴i`ZU~dBBcD9V2T$fp3Ayh5Ʋ:@+f߭4ꠎQ5|? bgF -*`(qRpAS4PDf9%>V6uW*XGt9\; -ПAWe(/.wG|02=M˩'Jg6< -Cc+t76N!2(X -,\wLQآ'3ߞ*ۃYo{ A]]JbטQ^N37$gNsI5:R. BwSYŠに/ΎCiDuT>z.YZb4O;3V'qjp[x%6Be/+,VџmKq!i Q^TL72h.JPHkUw > vɚ쉱R -àrjyvQkHE6 Q \5pB1#S&feWBho]2"\.ejƨQwg["59qD75(@\Gr]+S/zX%*$+M M|6\/ow6]_!#t'[}@DL_;1-*e뒿?tۈ$|{F]be?S |!H)3ZM@W ^炤we[hEm@n .ω}w A:Ltg#KEAޠAh.Y\RWEp*/Vcj ;M"P?Dq7qJmV%<{͹H+fL-tW,]_5vyZmerj , {m$$(zF<,]RQhm :ffn+mRaP؋(%6.eyrYGW 6ʙ T -5eqxk;0Zɣ-߳rl38)+&|Eb]{_-+q\"f ƪI D޾ƙqOk0cq]K5chA 6S,?l@Hm&UTZ! D$Y3Kcnѷ#5f޻ie;+jFڊT^ -$_fX d F R^T(E\ h 鏃gdUJ(<$5ݤAU6@K˂͂իڋ} -T*V0Xs8526@Z,/RN= KǞuDYrĦm?FKQ[<-MeK hܶ[eJ%˕;/e&!LLryH-Ln'Qw_%LiR$D(HoSP"J}\Ԩb|cZcHB\;s0BUSIѺf\\JLa*Pfv*`˿ͣF\<@A%}2_`/%aO a׀ND" ׬FWepԳ .Ct3 )yO,WRP(-~a q+,ޮR~;9{9O2Vh%kXRh\wd`=3I51->Nb$ -¬|/&*"R06Co)CW SfT˄>["8xgapVE(sBFb1^ 1F lI; P|##M40W[)2V1qnX&Pq7\S$$3yHVRpj+VE2q$a֥3`Xc/4"!<:PB#Z4-G8c (xgߝH(6NZ1+;?X}ĊN09Fnj,Ze P7E~o^x MeVzEg%(/$U}yvV;[_j,r|vj -d+.QiQU_ $E׋t>B -{c1WDL +z%sGZJhȧ0d#?PU험ppw1`$ -\Kol+w1 q8W*; 0v6 핥<#'3ZP}iѐ>XɄ<?Cr`o wL -mbp]k쳠S"bn%S 0> .c22:Taqqy7"D"y0l_]  았pLv˃w5 2vSQ`ӓJDJ5qFWr+Xmq<-?0 oˆȯ> e*  Ú 7_% Oc"BWs*'UNnvXBVo-$FSgB<PbZw|:nؠl%^wAB =ǥ V+,hCQ/l`iZϼ-iZmxN|%a/s犽MDrSPpm0x:j7S1 Wp} %-HԵAD 1-)%;J -jH53F$NB;BڋDE{ b[ 9MA,ОHq"ܩR~d̺}EǸWmd?yԧ(4C4+"![¼D| d$iH_ {T<܃UCR?J~y1!c`)heA.ֵ-U^V2~1a*|jTQrbfAY B9[.=/쫠ĺ ޥk 88s0TT2L@L1:

d ˬ ❹Y!1$脦RNA|l i.y{句Lەx%IERv!G3êu'q -^}l>Y⡎)݅Gì 4t%PR"3,dsޡL`@s& N[y\{$11,H"<^9s̢Wqg'@-8-wyqL˟mWۛvL;bڑ(Aݚ'}vRR1- 0-T?\{ϹS|TP(?d EgSlp0W,uBɱ+k/ aF9:Ju0;~&ڜQҗȠ3x욂>ϻژ -@.&9R,LP/K /q>/OGM΁-lsq`p:*ye'W`$:n\ZX}WDZcpWp OרgATċUU+w<~?x',YJL5(`C3vIStKf:Yd_w -qc;_nMzd̛J嘚[Ej]{H+`^K˩y5 Pr|{%|uiԷG8~ ^b2gƦ%F.8厈x4 Q -j0z!0fu*1XL?sFD~Yo*KvPNqBXazBVv E` @ے%&RZowې` EBs> w -簗Rt^8\a|< s_ 5o#Bd ᆭ|-ⓡe;}K~ۨql3ISbB)\\.Sq|Ĉ2{<@Ac?eDr+#.YVv61/KJWl&MjlD:n=M|/0#zO<# H -FJ|QD :Ԙ1jb΂-b3U,+P16Xm=IBne" U"]VHnk=R,˖VeeX=i -\\+?+.rLm&mWT蹎JŃZ@"TVjnY ^[Tj|Iյ0NjUr.aʹcþ7-fXS1/rF %│#7tRXOm$1J#X:|*ousmk*h' UYuи\ab'zf@FuɓzU>ue#1TFֈMa)YJ1pcmm[OKFA0j<=wL=*7e0[U/̯ >h0ʕ5P,xjB W*T*;a-[ _e"0ceFۊ6e"݆5ycWrȅ,.Z*U%ԥ%ԥ -=CgJ;U:JbenwqU'tF73$x.SElz*V dذ ~.˗r$ -.˦5)+><8eKǾF\cCQHA{J+ws\Tq#)"ʌ%MzH̠d[e%W+:cka#r;ߢ0mpXC;E\- X/Æ܊8Pҙ_=E ]fD: - K,n ! }뢺=RB^4Ka*v5P/Wpj! \3n[R97+wǓt+QZh]ޫ˵ -D^|F-3g||Zx13#Ku.-B* -~Gx`U,#P`UcEOQ7!a=H_q!JjX m ]kZ&m{!]eZFU)GCPi.4,%n.x<I 6Y=]Q(‘9FCtЅ Y=ґ#BӁWkdSf^kJ OqxD5s$rl~ɖ˝WZB q*)eu% F-*v(eo>U6B6 *dT{*+P$ _fU\7@, BXj@UL$ctFxX\nPt@A[b?Yg("J+2^ ^njKpj\JAE}8=Jv [h%cEBv7\PE`#ZcH$܇" iV1#Ü WK!LDaO#ʸ-BiZc/+ɒ&hKPi^~VIw+BTޮZk~Yx؍\~xR mP:mU^UqxT< +/UoM6np$WW:)[B4ffT͇F^:ܪ#[KQqpX#0||T+q1LW$+dd0ğ\/ChԹSv#PM)~~O5SN}\`ThpǩoEe$R}4zs_Xᗆeqm5 l_Jhd5jѽE\}!skZ"AeÝ?M`LE|GGԕ_gkz+mkUJ-!u jv!Ҙ_rXɿJh`>. -)4Cf -ĕ5i)(f5 "d+[6F 5п78u$]LݑZs࿅TLT|VΦnw|P5nV$Q 1)(bEZ@ -V,T}5/R8vNzS;}lAol~hV61y/En6z3W/.IL&QeG??3 -"yA8'قʈ,֪Ya \] -z{z]ǀl6:R%yP*y%4p%C'|,2mơ `+m'NԬU#؀SV x1ݡJR¸!D̷Pj\> ^2u4WVJq\bUpN1PS=U@^i@'=%&#/8XI%ӷq7H Ip_ -%A%j(mPGdw]C$w=h yl*i`DZ'n9IWYHbB>ы}.-$[{_~ݎaD koMGcBI#ei.n'Sp -"4PZ[,Ԥ; iX+RLjI./˒`/pOFInp #E/a1}$Vje9LDԦµ gokLfniL> .&ˢYn~x,17-e.㲺 - &Ɫʚ~r؏i[S=jaA.: ԹvoWzFYZefBIT̂)H4湨j!+%\nf^OxSfbVcpsTq5sG]FT^%򀊊@G,u ljhc&ef$KKwnzR.<A3 ]V..UP -"*JK<2\^ - )?)̭Z)P8Tq[H[ -Ul`xY\P+xܣ >h5DSlPSH X[[xl:2o싟͈'|8)! ?jqj0DļjTq[]rˎ#Ej3¦U6jz᦭<)+Wg|QG c֊c6=K҃%.4c4!G$ibpSYЎa|4A:Īj^8ldya ^p.@Ž0 --Gu5HJ7uB+gD|eWR;w3u3wNܷW Ln*fZU\ه.\}-]PYkSU@"I=5UmWlwn[%AwT,3ZxK^O}3~ _ Ib5\S DuuP XPFr!5S+`gem)XvCV r^#U:+,R)&o tZ)5 Gx{C;-a$[S\WqQhQ ^_GtGw\'¥w ;op+o00M'?eFLfeJDj8𚼷9jae'EbphTθ8",׸#[缾׿rZ;T-?7&5~A¢ -\6e -~uٕZʯ2*'_H&Z| aJ) U#]1ABEp2YbfW|y@<˚¹*vGs6|=ciB^qTf?CEL캊lD9":[R|h[;=u0<<%EJPA@iN/ߊy%5nLAI) Kˁɺ`dm^g ؠIPmWԎƿBV}Cp T"`@[hA?f6l V>tƣxu땎; >2IțQBSD > MX~`'go#3q3ݙIT}ŏȬ(ҥp1 K8M6 6uf8^-!%B"7kRL :Nv>*Ct԰XiV8mm =ST_̹RF*/ǨFx 73i[{*E*zp#}<.mA_ 4^fg1 {%^x 1XW" 8^HԣzGqTV-rQKjrr"X "*wd̗~e9M*عp}^'j>,#aEfe  _JOhfV "B%:G)QJK`MoY܃.V:=?^߰"rĮ.Cp.8( M2&.Rn!%kQzs^rB-JK)@XF~b<Ǝ*Ww9gdP -0F9k, QQZH_+&L8ep)X_rKnMtj.l}.Bf_FZ`xRienTU@Xͼ/rŧQR -X_!mbFI7 3씻j֟~K?D J>:8X -)A5c哺5U YU"~\ bxq uݻDl_ߞio)ech0_&>6-)k=p)iHQ~)Q,zLP&;S - -$V|kgNO;e_R9ȾqQ਴%ЉAZ-(uh6/ E -8.6O]7K6=cLGyff==M7+ZmtANDPɂĥ8@ Dr-$ 15-T5JMBHGW `1 -eu*v-)UWEۂvL2/:pr1mDmDYSY,/JM[Uaf)ܧk.\ݏ~MF܇@u -Q.vpicl5SXQ)* NF7PR %To;jdʦu+4awJAf̾7{JmH<ܿquT%%41Ʌ]mR֢n=4_rMobja4U[tUL%b[:>teKjwr'ŖWj0EjO&M+-lid+ǯnor؊̉8Ftج '0AE7",U_X][B}¤ .a̩vfmop|,p|˘8>wP4)F)e$x -IVR.pԂ䭲e2pF-@^CO=. 0lupBec1_r&n t 1Rsԋ?Ѻ.k:+Ԧ!L4N.E%˙SC|3rArUzA_ipͶ=Yk}BYΙ^)TTcT% St.^NRv۟etJ@ef OOb?BdR]Հx^*CF+j/P 2,$o~";ϳ%F홪B0NuRFcuNX!aڕT(v}uuYP A_Pe@M*]0ndRwR̰2hvYj?K&baeq+ųd*#F"%E:RF DU#uB%Zr h閃9Ztcb7mּ9_,aM73*=>w)u+W\6[+Q> s,p.3 (s|+/;X";1|ܳR - +/2 Ko EP}E{J2<Ý]. =(8z~Ze4WeO]7: -qP!u떍pPK3i[/*ĢOpÍqqEl⬤T2.w/dei]ˉxnM2ngu O\VXpN.Љ3"rgM5M'%l7 +DBL }y(q[&2%f&M3Dqljj@W" -gHM_ i3, ق,+-Zj<+J;/8ȏqƣeϖilyv $V۩^L)/A,Jodx#n+ dĭMBsjamtIqj+2ܪ>5gWhG?ϲ]rYvnab,ngĵK. -\TRBtV 렱IHKՐƈzSK9A:Dec Uq}s'5RJhW5喉\keIԬ@0ROsOZRSiՐ(~5,ReX[/JjK;pLнĥڅuPQǸ;3~n]c 5/{V+<+bxߪhT`\0J٨FDpܧ}FDAlnQ#a%B଱+ZE"p#uuaynU9B;*o%=kG]۳bxS;&z!/i[? ץa1`aX/rڪR[Fõ%Yxpjڧ͸#Md TmV#)rC+ܱ @FicsYvܪG/P18!]Sr>":X˫!aw/ֈUqk1GgByֵӞ%HEosW󥻭KB˚Kmgac=Lv9]Erq}S@_3iP?yTKALU_ۘ-ÌXLTa0W0( y~p}b{sMROĶ'x*3[keX7n$Cl^TɊT3]N~z#/gl%b΋^ˢ IZ5=ìBiZcB=0WqeB&g]4p_~7UyG'vD@5 fm;M'/<y e.;7-ku{^XViu;\@N.'14$_:-Lɪ?كlSY|;Aew?&xNɮ@yDHX,08re&W.t_[[S~.bfmETTsU2ŢOz\G/(pDϜxq瀪p0+JNDpS (kPh/5KŶG'Zh4<^ -ų+ g9Ga;Ϟ=y`:Yժe[P_q lrU }Wy~uºĪg22f]i!EUn#Ju3@?_@-=˞vRv3=XТEfGG)-BU -ǩew!QKOD() HcL 5.yK'v?-sk2KR[ P Lap0o{Rz% j3;9aߕI>'K/a -L8.WD⥄sw(=Sd7Y'WKXm'c -_3/*\Ows5{BjTj[ $9qoEAUQo9GMt a0q̨|/?l"ܾ1;GS[oH@D#6)ULD4ɜpPC0XBKnc+s\^+W:3[|Gi Ks}Y.Iqܿ-暷2GWP98e 8/j]:.;GK~<$l"*vtmQ4 *{#XS -i#Mz~,Y|_d/hASƩzDQ~ 0nw="Ҹ&+.%W&gآJ|j+Q(ZLYwJ?&mA2I(%ybR*;+FUkNqaɩPZ0_Ԛx萟C!M^_y ~+,.8*de gu -pe7$7.AMqW,/y;yKǂKY>[@xPG f;뚒7L44Niw=wv0UZ,Csz='vXXʗtOA0٩3*=gEV>#*XYNv]ADqH;imv#3iHhPA:؁m@DSћ%P"^騜 ._S+t=\Nh1=K@B4\zni3pU -&VYx !y4Rڸv..e]qBy)5@**7_'"R=$Zid'Ld DRei>q慁M=^UEvA>5|']1E*P+E0 zQvIxΩ< uH$=gDrbyC2-l-=[.V5$<>K;Ѹg+0hٸ,f)F_@L]vKa.%(tP*.VEFsq[pWN"yOT֤a_VމgX.SmA -!:TA:}5|2J UmgsQ|S,bF +OõHP%S8^/_jk/ȫ6H:zMǢ&UX2k8=Nޞ`ԡ?SKbç0#‹P!n^YW@pgLY~ȍGIKƃ5 MMÃSBfSMgp=a̡pqK :J> dYl3C*U6\SxP2߿R߶y\ fԪĺ_PC#oNU4<{w6@`yjBtYEVj*03ر;E]qZ`w75 .ZWBZ߯E)_B6ILn/h\P9a̮ob(YQ PBf:!;_O2Y Eև[j'+^caFz([/dIj'[5/5 rIZPq'l'bK,LJԖETh܄FBe#zVEYOڐ#Z c(̏8tiuKd'YT V[;i(ďmg  -aAv4xܳG@P({eV\+kyC4M^o*9h_3s]TRI`G#ΑOvHgclvEUWcRG:jJ)`^Zkm`*c4^  lR]41S 58ɜ슥[ 4Ai+ғB%khbM[UnXqćaXD)m7e*s:VVሼXrt-q/Yzv՘?-$_"c.@-SKj*ofuV oaMcQ-xS #f*IEuNZh|i60[e5IUʤi{68 e}į^=L#7R'3’,?0h:na -/,+~~.xi<+_%+-kKdihz&?P'cީ7ߌ%|R(_EWwe3̈́B v_ a2BDSɸWP[Qn8pM֮`+.\Q1G1yXd!%1 -/m~x arC(GwpUC೨+gz'{BhpBulq -PgP7h蔳*A"!m$UwbO}`z.f!GEB4 x!VIq%EcSȋ`7v .URYyS)RֲZZ7/*fE˜.{i9nVQ~YbTMț7G̪d._rZVP,\"suFt?\+ETcbҥ$oq/ XQX5*:Ul_ m@TCyKjF`7L`&1u%<-2;l!ÿjnl#ۼas](w߼>'3v~=1V((zmNjP_l%5&%wj&JhO ޲׀h/lVhqr'vMJ 52e72p@q$_X3ܛG@o&!_4 g%B.%[FGKqTAhZ4vmIkqVvxuQI}jN5 8M΢K#}|. P*~9~`WW#,eJ&8opV6d$WFT(82> -s<.wY] mB6w3ۜVPbu+a3l=,j_dJf+x#?Im|W ,a3Lʽk3.i0Ra`e%[ LBùP!J1D4W|x/#Nʮ‰g䝒<=rzT=|R#\w1Z⯃HG|?3iRu) -pF9]x -ś?*[xwfx [ x|J[K,BψݿRϪA U7W5Ot!W| -KoomcS3晛 qc*˘Fۙ6JJ3&m>Dh:-"hMÅ ωb^ӍWRo!Ddl/TBCU?7pW?Z7-ʖ9NV(T$_#C?quƎ7R0)0,kn\uM| ,k(Fycpܲc\o\. ;kP#6 %TkoQɹ+"0ix~+Hpp%b~u >_!AuPL1~I\U08}G~3f<\b/.\x`lQ) [mbd6v Zoց+i/l#xbm.чPZH?] ZLK݄3ʛZ*ms.R<xqQ2B u5ЅRyUxY+.y/j u!%i>̨6< Y1n_Ԩ0Tn+k .^wsg;7Us4xT]&;$t -`'B$e8*b4-F buݶ%+9>&:Զ+\21LbWp UR( N(ka4 ̕n| -|&'URڂV(@ [%kͳ1䫰QqGٛon5x@+PfAL ܡ TOdsqqyXML /0Uʕ<kM\8r2EKrC{e>a,-ۅ.}~(/ -һ\*(cSŵP[hy5L̋vAu8Nn5 -"#]ou=<.")]5NlCPu.h>, \!>,,FHPl:T( 2Ku jT*e/P,<p*QF]Coa׌-6D]7It ϫt꡵f7(!MZ|O5RU֞1/tFm:PUz֠*"Oos u%̫aW|-{yp34C!T%3|+iq,:y'հÙtTe(hq( (!|k09 -(C*㭫@V3J-xj@n\yl^#=$Gd!3W;/;y,"[lY.^| ׺pcկe \ԬLl!Uu -Fn G 6K/, UοKR!p~(=G2+`KJ{bS(\Mzdk[XR|SȊH[0 Wk!~XG9Ki{(}HDt_B/cuB'SSId"uڏRE8f1h2jU`<:38W up'PTJ7WbmJ14j;o|*WT Еjv £k K,+*c+/W*&kc/̿.aT˺qNvv)G88O%Ḣ}l}kj/U.֧ѐ/'s-vB -QFʲt.7PF%]Ꮈ&8x}  -߭6J#+"n.PT)AFIBTagơKπ#' Iv*~Bٴ/[׬lnf~5)8a:Ԩ+n#-i1Kf)QmJ_.3\*W#%`6|N4_E{w"."QVKu4qVPә\W*2nK1H .4W%.5rVn *iirA }&LX OB mZ,W^1GM+R-'De~-%H1"V jў ݜ+UcÆq\up(RD^z5XVx0{9gSIԜ{:&nN:r,UV_7/az0ҧ! nKV=N٢>ː1/\RtGU.*b-?R檠t".Dr.ѝIxKJ|TE6y$|?X{n_j6ok`8A> 1iBG"?9HDԬBccHz-B$ީ{Ml,_R3BwCgU]mu?2H/ m -bZ݃W mH}=BOߨ-% ɶo{4̕h'`h#椒_ rjE-ƗPL%s7̞eDs:ÿr -=J^ԿmлCYkX -Ət=v$g]+"EV8|5U5B7S6LaggA\:3̓)uT-5%|3e7.hA9U"Wq@~,7.X/13(%CM|JghXq˴,,[ݖ}yu68cBTJUjs4Re]ɑ [G]ť`~nS:TLz5I0jط8X-g .-I-NHIY 9Vwij|5s*JƖa־La$NVye@]12n_R i/.8B^i,[׻F{Dy\TǸ|N啩LJ/pLTQP.EJe@d^㌱ZgLU{%e?$Zr &}+ IrA3`0)Q#j;xJ. iܬ^7%[&EDJpMk'㔗x^W勷'me.i[8*DFȄ IU[nڲ6;\1aLp'lJpK˾fHkj$w}x5d.53h8/P!0uqxu(._ -rj~x_ķ#D  ^ዧܸ(Tŷ$S ' ']Ǫ3P03Kju*Sa1(?+5w*5EJz*:>kx<(imؑQdۥZʦ+^TzDy*wYp@)Dz~ 4&Έmh^ j*qX a5>77tFnR=?i;RǷBRBT:ls|!:`KS|r̕{4˛N] E&,o.,2tyͷ\+r O d<%{l*<%J[ًnI-K Uɍs\@5 [3OHNTs Vza"m<&lU郖}r 7p ÆDMhҭf@Je{ܠf_A bRU;.ޣBw] -e2>*wߖd{d˺ܥ͛W6wq`]JnǕ,*|XoV qw⅖Cgmk,SMgeD 3KӺQ`-Pӕˤˆ1pcg¾wx­lm9 /lUjw\+I7Pn \FQFku[wBŧ]me0{zdߗŃuV)[N\HBòuW[⑒,aAr5S`˘wb2(i_1~PZ)|*eV%J*†:gjZM]\8 >KqFO1^0TeEPVѺ*o(Cc(G~zȲf,ݚ0^)S &8ز1'3 UuheIJo'Q?lq(8O{:+ #17ࡅ&v();[zfL)IBTܬEu*}@7* j\~ G'/|S,4HG[t:g DH@HوZ.Ue&}AR\^9.*詞:ĨGY~$r!y6cfϹTmʣv&㠬/,&u4Z܍%S2 ƒ6kHnm㼫:Sb[ X MDx \{'|D1<˘Ѫa2M66vAFbʇ-B fN*_qy~Yw5:]UxY= bTfV;9P3/ԧ.Gd)y'$!1yiYA-ds4 \;<*4/yC ЃV?PA6Sj+EJ|^"X aBxV B@'[TY}砆wR}Sgtnڀ靲՜6ֺlcj7K\B#B D :s ԗzgI^M=OeX<^BT? zq_5`O?EL(ty/(R*td?>3@ .-*P{^ڑ[gEepqZ't˟R&s6yբB+$qY%nWS^WGUAffb T\]FTf̌J*+ 1-^TZĵR`͞2Va ]s<_~!Cr\\'I?Dx73˗/ -b׈.+C$DAk[ `HtsmTeҭ%~J%b$c'n[ԸerɎ3*}y^8zT-Og!ŸS3\ n B{[xlphmҲ~@!K_7/_CMa51Zj`1(AѤI~ WЊ-5"y^U+UL6 jWQ*3r\+7|3|PAƙPխYc;CI{;?X7ȑg7>5&?`ctXBP J8|ǖ=@r.[ -BRW5*R76r7UjaN V2ii%ϨiyxsMW« -F{TVx@b2Q<~"4 olПx@Ѕ|v͒K&ǝ ^ƙE crSܼ -۝c&ȝF7H.Z[\Z['TRʃY@jhI0-yf$|?x^L B~;4%K\-rtl*bp[/R?͘Wd$Rl;S RJ+ZH9h]b^YzǹoF? -|$У `-dncذ"GF! xmj( -Ԯz}R_zʕ؂>z%a ʟuCPٌcʘf1=MeXUlϠcpfClH>g;+XP:(rW|Uj_Ǩ[pzxwnHRngyu\)/0F"J1*hXŹ+讳[V.1wmym!z6oj~漖 -{hQIVhG)g?i~Q~ɖ[p|E y0upw,x[˻ \!(;GS^f1rnWYd#4 -| /5\0щR}tK-]yz(4/>/PLKu9.f]onk[%"j3!iGj2F-̯4Jjeƿ*--p: -"Q<̃xa7!PKtб-linqO^3G3 _,CLb*=ٶJBG*:M7ɮ+tb9$zI*ḟ ,CUpN a~3bl ,AHc:g'7_ ZUV0AAgl֨GD1* e} d;n#yI -Cەh27p.7B >=K5u ~yvU¬/ JKx*Ww2/qR?*J%F 9JfOFv00Ӧ(-32ڒ37g=O` d0+;hA%WM P jz$D!{3ײƟʝH|`eg,K׽qSspjXOMX'6x8_LS[]ku=-ToіJFlnEU "{\&"06 K?<;} 9]"kұ=/;kl>N|Aqqg(̃]]yt7d@z/h%1͖FOK0bang 哝")2q\"4/x@v -HkCy dG'C Pƽp̫AnQ;'Ž>-,Ud*XtgHGgYjT&z,0%daD3P'R<_yψ?:'fZԼ\ͩubJǵV*E.דqҰAjp†=rˮ.ype+20U/Nji.Y3/RB^P?X t-jTtTƊUY0z͓H):\ĵ52F2Fun8k.F,ݘ}?O4giaʷ%3SPPflO1bˠSdX bbwnj`rV;s ntGzBQE4w}%RþjXE;Y/mNw~bIO k0WO<<Un\BSԴ3oͰPT-̿o=)Mґ6nbBtΉKY (X'I+݆faP)ݱ6qp ڹ7ۻ%u> lQ=C -:\Cww˩]K̵ʞe]aeP: - Gz61m]"ayt5D|m @ê@aغ,9KEw_RGY71R:b/41f@ps1_eB*V: G7|Q;u:lWk:f+b^vu={+P8FQʢ7/K(+pŞȭЌ6w\L p{ 0x8]u -#߆ʓ Z#E'۠ͱOe5D,-j|%ƢCX/_㳚_rGIc+G7bSXjRVO _HxEn+7* -5So@@(|ܫ+[ua>e{ Vl@0x1y"!q_*eVSB5<!k0Mh鄐 UV7wXQtNUN׆Søf$F_ТB$˶E4{EPS3pQ,ͶbF7nkPrMLeķV%E/6 -@Jyd 蕙\PZ@>X~sf MNSC<=S-F5{W]/[Cr2j:XmoWD=K.jVY -= t%6N7^]T AkGxΡQxM#cuWI޲T*sOkSz3V?//1ĻY%h6A@' aEkL:0:3LQ*viYHܥh8P≭lJxM@Y Ѵp5.)zP?pJ ȏ_O'BWCT(RJtPQgF5}V[,ڕ\+/ -숼Mu1b~KЀ&.sB;mD8Ϧ$ y5]|;_,[,`|+#cfx,V`䎴LT Gŗ wqK'+Uv{ҰթjM]Em.ŴGԬ8T|.EVѹQڌ RM -_e55MT~lPC2r00L";y -QF 1@ /5bxu?%*clPP|.4 eZrƸ.;F:yTenջs;('_}Y^]/n@iQ})KJ?qtU*VGRt j , Z[;VLKpppTeJeh\x0NO"Z= 嘛&*:2jԵEHǤ~b,"jI $rJj_RR˾+~GZ./fL#2-y8z8}Yn͘kݗ26@q(/3?qT\T\CKJ-\zN~z$G4P*nUً&BM5Hg,¨[v+r*HBoZ7аE\6 qգv+Fy݇Жyju0M616 6\T}SJ[Xkz֑+*ƥw@:n!Z) -څsOjo -MĘbߒ7Md -mZ ˎ:$\-wONHrᴌ2-5EyZ s/Abf3H^ -=(TtW³RB55RͤeϾ |>531V(+o;˸Q#v=f OS0WB$tgjE +.;iELmf5SSUթtyQǽ&|,mZ0QG8jZ3_ГBcCQF]hTX; R~J`u[h Aw~ YxM!px) r}pw2?Am-AEI7ZW @ttz5˝)t |Y:Ow҅&RBd}/ TWXM$^7B9̶b;O1c;/ziwxR uҺ'LlX5-c%Ym";4pfKzens -!R1cr#͉qW-A#$OxUp]x&n%A,rܲW lzeه8>  v긣ܾr2@XG Ke - .2F$U䎤(cK* rf^B"ogb6c\n8NMK1c,#Glj[$ -4ti:a܂OS?x`t},SkPbfaU+g|P*vSI~9 q+pȭ~bܻձPXE᮳=(a F3=1 Y*fa};H[.J?TX\}̳05nPJT*Uu,H5_ӡq7j")RR?}0ﷷ櫠̪Zǹc\ /Îr_CQc/{FdvRAL~Y-P`6[XYRIp6DQ6DǿJp2qJ¸x -WL h'_hi@D)y`2r@ILG-hCA^%p^ 4ǻDM9#HH%pM/9T{ aK{Y?Pg .F1_3zbh(KGܩ]C+lB22-J$ -cat@F>D,bkQ"ò4bЈU4M}4 -b BSܧ?B/.0)L`vOt(̫e |'GܵQq mLVP6 u6Ex,*y][/RVɵӣU#!.ʖ@|3s}ŭeM{-!%+BuTSvc=_ȋ[F}}_] ΃xY!퉅]ߙkq\({36F EZ,ZwQyJТ?8;ƪvܨZXn3 Lx˜+hTK!p&Z|¥sJE7 vػj(wvnj1sZL Xp>H:-nl!m4v6PGVFiξ# qy%aM] x-]ɱN/T'#7ˍ_Wq4Z:3w„?,qBS\W 7}#GTg4 fO뢲X_R @-&5c-mx~ZH^l²'ForXc6,JB+!R]vBڃ<([aCreZ%^)VgO)wM[Dl+7ԺaDܼ]w.O9u˷*@TBhmjd>-23R̽ff5YU -}J5 㤸yr`WQgB\.+^l&PAޛlWKq< pZ&c\#Q kuÿ74S4\k BdۓXF7b3SS+,T*O -mOGV[ B: -XT"mqKNNA@y#LԚH݅B:!^.^eKEHT/ơc)Aw]4`XcQ%<ذ v\^$A:&/M~ԙ^ꡩdTZ,(<(C-٢mࡁ E+n| _MP˵J͚SUsf[?\bpw1 ˔3G[3Sf-H -_,2E)|{ Jf(I>=(oqę9Q.f"s/])sDXNH!GoB̙L"1;vibرSIA&wP}7OnJ -V&$cT@ ^\'b>*Z.+ DB.[=ܨN{fMQiƨzg85VKAkwm XFODl}`M`Am0TݐT+p!'tIQnAGF9qICelL -0'F%u))Pw$\WR2O0> 1/qjXB2KkU\n!2.\(Jg CZW{g^w:G|j IDH)kdxڟ1Ι@QUþ\i~cch  p}}*36A~#q%F<TL_ 2J #k"m4{Qg㎹];DYO+*KX̻8.E!Kkw35;.g8/|3 l`e֊H߂Fc4Vd%=Ag{1;*Ȍq+152*ɹBQ M"ݫ-dҊ-He|qGQ88\T-p1}˩@4j?0=?MTU1K[̹_ӴJxW|-%Œ? \:lZvЕ奆.,]5&U Yk,ֲOAa -.Hۣܷ֭k00#e>vCXj+",g8YeʮGn"UIesd$Ml]i}i.-{5nXֵo X;;@ F|^^ydxO)}.R^0qR+EЛoȱɌ4R2nT!JO/Gt]9a$KA!>?*uP-{\X&\lg[u].vȜ Z=M:R3䨨>")j -~*Ӱ0QnA`YrCYZܯe\pLQΥxw kQA[d]Et.qYS6mJ>ZʾB2 GrڦݴJ }I_1cj M7lgㅹ5[?H첎1ěIڧD.:Za۝XAKqX2řg5ǩ7bۊKKƣsP8!9Iu#Cw9k4EV[/ ; - ńr;-0%,&jC}c3[FP| WԢA?Qp]D=?q^{ĹV;< N0i4F=ͅ@‹XW3 U*^jEYSf5K%UQMUɑ6!|CT6Ұ,TZe%lf9T._})Oxe.E (TApjo/Z -=Yrc g{B,0v4eR~K7g&cRzbIWl$`.xRסiM2j/8,2PW'S(k­5,iQ/<Ȱw!l~{aJs'pʻM51ﶠ@C̦$y@SS5?tXX:lF3+,.,)= my;Z󗨺ؼD 1*],Mcw[S -_qecboʢ +\{D -7Tb%wT?2~HNw# DR]|q{Oׁ1${H ,~@14Q)dHTq[7ZFpP ~EYSM'}M5w-BSE?#j<5c.z۶ LD "0C0ep'6Ks:#P%j_k{M~پ!Zi=k'Jw#\nd{跅bī[[ A[/L#hY1#(跍XAlLM5RKKjj[68 f4,^?nf;XEk#4t$7 KE%#\Z(򳸏M{ֱ,Q@ /6 {:dV.ضdl3PDaAFkݺ"ujXmH4wnfɲje}ٻDaJXrLa|ԨR jku!p8B[D̵fc_6Re5ƪhGqI%\:O@̱iRB|l<9=kdHE*j,hv oo˃5q಻ &G7~xAH-7)ian~Ek]nj4PB -U%lA ^ &8'3AZ)1ZJiUȾ (@f9qFl[ʴ!b7k`5uT\e:2]5B4JU4b* a,C` 0~gG~Oǟ`ab׆Yԫ׺Gm|FĚ6F (ty`y+"V6#4&C[hHH%bUXR+MZUjp{#UYfsPFAؙ#/ΰ+Fb'M.\9,EYqtNP5= -IbTvΠ8*RhU6TY(z!SSZXu&V5`_UyF6p MLQX c;/be!\UrJ]C("4T:_@aQ^u. -g -\Ց`V%֎lQ E>ME W?P&4l.Jft*&>vSY!/T*}ʞɝKU:D#7i*)j=)K?ZIGO?%ĹeLK:w>tBf -F>k~\"C;Vhw41TU 3`w-q]߮Ŝ=+|I\ݡlyΖ^Y-Xג,=\ĚM mh2.Yrp=VxVeDMŠ!"cq"LTbbksSj<+_%eVI+P[!ЗF%Ӌx@Flju!]\ 찺:eOne$.4̎ACJ*PL3oV)3hM\l˸Q6lmO4]m/HlBG+ԦjZ$qPN=oJeo!_+bؠRK*3Rl)(Hv,]+*/\Ged-9_ڗ%$I (p=Vb <tÇY`]^_^GL^B -e#fDJjx*}D$_x%b koZj -faFBza^bMWrM5b.BxWt+MCbyTjf jVlD4Լ-}Iq2;Cv>\v\ql/3 `!-'|Α(~SNU.林mbǣv?ZQ`4ZÜOBȀy"QnWωg/f\Z10Rz eqd#zH]D㞥 ]DyZ -T,g?^%Z|JfeZH+\Q2*QQU)A 5f=ԫ(l1A?Ԥ_D镎D"qi7c0.<13ir锝K|pM h :ߛOOXk(Q Z5pƼjcLBu?D {f . 4oDDA2!бs,慂YQ>aT΢镓yrUʝw*J+>Cc2H<Ţ`vX0.#Sepf{*RpF.3UV>HO#C{Un*wLb^`@ey⮵+eMY7ʘcfeQ=}E»fTU3M$:m(o'D>d犀\c(Mx**1I`̃0˒ w0 Lгk!n}S?K:wrb-_B%z;*^/jgemϺ>tm&Y &V7rGOp~q1۫cWrQ-*,VHuYד<`ݒ/YyvE0@2\fݛĤ+2YJ>&$/yELc~n_ v b~[3*{"SQ(L\Üf?O&wolՎ3f> þ-lG/"*j^_Ib-\B\,N)34r-` V:iA}]CLj(_mʫ~RRv@j ԧ/4x-`]& ;>H^2JDaUsʴDQ5 GڐL<ŵ-rrbJ x*VpUGSqiaDJ>!d3r7lA*aXfEh\ILjx+9Wr0Xqm~J'N0,XΛҝe+jbW_B2yyar4v GD{CCu~lw(WߋI0V<5._M5>joUv32kid*4sLۭ]/0)bĴ@ ܸ0ۗDkzٶlջw0m*k.ǓR$^I I1(F$|iDrvSۗ?m&bLԬـ7gf -W q*W/A!FF\G.s/KC,\Xj_Z8N: a6sgᩈ.%NHĉ13vwJ[u VH/)نNZF, kȎ1!폩[΢inѕmˉX*]T=F8SK)dj&&z㪕k[%5<!.@>߻?QKx#)1V"5k_M8H+^ -u(DHfNy> ,;N2 -\OTqˈDOeqSGq_|kp/xeJK7>.xi鯱1jVuz(%2_Y7栱G*Sqj.%@}ˆA{g;J\|Ō]gK>_ÉUq2%2|gzUǯM*&9"@clMӸ}R0nuQ?xTNxIJ;G -cJz?l3bȖ۴0?RG':W؊dkPPsಔWf[PiyZ&jJ1bk| -\Wp1W /jz>`h ͫ%]qUʖiIa&Е -qS b`j3y4s`nٕhtY3sdFTB\\bTmJ>JD#ںfCtABzieix`o[Mepk˓^+<ԭdv琣DU. D2J1ȡ\w;_LO c4E/AhW2Rc9U Uw]$"H#lwr#X -Y-TblFؖLjP"51\WT577FZü|0d[np¶ -bY%>ڔ" -ce㴏L<@c^@D{Va|E!y%|w3Y<xxvUTj"T%TS_S*\1ÌQ_ -% ГR*41R`)N\muM5,ۭK ؕQ8TPh-?]7Xr6E^.ZUkadH9e_F)G;! mUpD( -Ĥ+14Bi$ =-6vTm@u)󖝤*3嚸:*JؾJfc{džZ,-Fh/e/WL-z%s_0cRh4ER(Dku C6rb)\>%L -4.TŬ=}EQk$(- Q!ߓ2(?\h3<,fjf^#q-f:8o=/"g'/)o\3 >GmB>g[a_8 PKD %UcF?QU)2ݽ,9?IM3Aҋ5Jiʡ.>0WB"k:Ք?'ODA]# 0$X83i]/5S7C_jLM_Z`Q -UvAsQjP)BޫKlP۶5/tw(L/d$Q?>R%Fæ<[F5kg/̽aT6 e}&fqvBɰ3P{zRl -ZQڝluwLuEj["l6vI6XR'@';#JoꥯYhe[&]q[cB"~Yxi ~DXe'w.\X.#dd xYeO.; su¡= I rqQ@g۞qA4LCC.E1b_U/2[ uT;>D?J_!afBZR@#o"O !u.=H,K*-\a̼7p)eUʏr5H̹ -]rWMhM - -.g?kZ֖SD -R?zXG 8"1/~%2`4PA9X W(L   jP JV4u[}KCV_->sDh[" W84-,4PZ5>r| QDb/nrA*LGVfGoj qr!_l@M~ yHf評UjkN(0cmonIr?NL{E@K#/05XLٝHu0"!DBWaӇ~ ;I3e#|<%CS(j|\ZS8elH=$aT.0CA}1g!3* -ZAyLܪ dFsg69qP>i Jך&l)mcƻove[_āWgYܴs0['/ -Ĥa%Ex'HdI,{ZQ k*~Fҍ% ]x6n(->(*uaEmqoThyo2/Z4k++qU"ښwE] p.+.D|YdD)h^-V@zJ ~h3zmӡj~T5*KWP5-~%\Ke1tlX·WG5_W^b= .Ыrttb. Fy%QbybٻBV灯YSH4ֵm0JeK*થB]ŷm>w-hWcFk8tcIs1Q%Kgܽ 4[*#nZm0,!¹qPi+SVpTj;Q~1KpJedRo0H?})\s5>}T`?3F([XՔ˽."-s|Yi%S-9L87U #A8ĄGlqkԑ8F$6+Ho>5nSLmVMZ2gsfWiTFweyS] "W"j'è&;dgtqDxQ6`,֠-.0o-1;e1?"2=wsKxk(UK鬡HXD̚X -dAI&Vh5j'a$r;?tӿ,٥_1VTx:~ } 29GШl/ Zf/n`kLJ+¸cͽtYxTInߖⷼKM3;(M*'"Sºȶ \EZx@ԕ)eDWx,2s. T9GgRĶ1azp\ԨƳƥA*TxFI7x2FW>ιY:+ܵ\=bguлEvtTtr:ĤBC$Db5Gݬrxt0 ΎW0} >!u鋄!ڊt}U뇷X/v/2gruh };6F>%U7U ^B.  -Qc@p,umMȾp%x#4͞F V Q,ƫAS^Q^A_,[P Fa1.JGH' -%nXwuS+D]ߚ,K9Zoo}^377E6xjF% TQ?p';MeƅbGrdhi QOaLODЄM[ dwpWP\Y@)sXFOK{|VɊ6Bv>|px-aگQGrLF!rYc Wqzk~k9JM,^a%,z9dla;w,T7SaR)HYOd>!RFGV%PQYYNf4h_%^"61ۉfVŌS -ܱ*z7~%1Lgߕbm=ʡ[E"6buC6HtA{IYB~<)kӄ*SrN97*7kJb)2YgSOKETؓ9`n\X.*l5Tq5{]ZOPx7ڴ0Q(D8OzoO)RU1ǒ"No260DϘc<^z]!*T8Έbڊ(7wR$"3@D2|-˩r՛[⪷2v%ID%Y(#_%4VY"YE>#V}GP88W rGP@pqpn'H1'#L@UK1$jUu̦'7xGr׃:F Da6q;H:'<ʓٝ(ҳx-~8@4JJJ2ǫe8}pEfx1U:`G\f.%Թw%ݘM2|2Wj%O;Uq)N0.%ΧEeڛb)hjZ렲?(Ym)RK,^W"q ǙS+\1*%Ʃ; іJeՎdķ5 'c]1E,1 -Ȭ dUD á\\jj<YC5M .D0#8Mj-cF^톑k(کJ kAͪ06<#bzf7(ke/ΫKRl0֙.덐@-z;ըH{99Մ2(Q^;/F!w(ÂMkP[K0.lY -"Dc3^I+r vB1vYT`L5J3[PM!=JFiĭ _.`{CHt '_V# n -]uRݯ"MLUh*_*U0hGhO"+S u0~mdP;vE;[\Nn[j`&xS~`biRxOIf劬WaW?Q+Gy -WPaL 2 Bn+KBU(֮l`r'+/3^pije1^ "bXBK9(cK R$:9{Ur"#ƣ=1P ٲ ZG'~5Œ7.Łcof|b-bR)(D9CF&Hwnb]ClID0 U"P˿P5 -CDaIxB5tO8/+CEQ|,j/=͵j'mT:\\rb ~ Sj#H%cyg$N7鈥j#+n=`UWJLE^jl0PIڝTZEf2_%CA@.aL6A]ʂZƭ6t7 mf3nIɀX(mTx욍ZCӸa:f4 ~DxTx!w*qkYW:v,qL lXRRO&X9ժ-$y9}Ao˙SETg֟BQu+f?y$(caLB ? k]D_ʯ]ʄ0"`U6{(k |lp%1T׳Jcۃc6+*iR:T>҈j )к&X"77B%hJ' TXSq[ U -D!]㊢M5]B}G떍\ޥB+g~9 `hu_H^DT%} -ȸUR%b2e.VqP.7yx8q~*W%Дl\.5\X}q.\7gyW*7>s/n,>'SVWܺ/<1.<įs >:&[Ő£emҌէQ̃#g}H$zA>,YQW3(Kj[(|D!Λ>XWψ2 D}K' /Oxr :U>%/옍^y +nf8,i2BPFAjItĪ  d>I`^0'(Iư -!_@_-2DD&[z&?PP`kK#kL,ٿԓۚc06"-QIʝ-W4ܖʔIDʖJ!~ -,so3] wmv&eg\~ hSa.&c~XHE6$Z}0Ux{%"WG7T$׋5u,U_ - -4]纺{)S %-5< - `;\ucǮ@_ƑU11Ad:µI˲/P9/ -YjlvmV -Ң@CrSX;sK!3hcVYF_kn݄rU Lu:Tb c;Fn&0QgPRʠkX#Wme/<#U!LĻ+,8&Z` K, M#Huш-jգD)Yr R -E#KoVvˢ!/S7R0<e+KNba3/0؁8xZ-D/w(bTĴߞ*nwu>у PfV&f;Ԭ|r Zx9l$y^%M̨6#bʗZ'Kj +[jSx*/6wUf '.rŦ *W< Qݍv7[[ 1zR -ȵηd XI3|ox$#WJ0pTZqVj7{F"UB .u::Z=q~&iPs/dz]^Y\aɯxq)%㎢)PF;f])eѫ؆kkpWKW sp;"Oq2b⬇yeğԍHαZ`O0E6Sjч6JcLA!jcl.~:ܱ뭗R}6:P4w:.iKI3#5*0kP[Un4, -~N b'bBA2ER؊he/!-2OԲJ X,\7oTKV<% m kX]y#+#6&3B[;d ]h%hX݌ڇTY}De|~"}'\K1*S!o&'~6X#Qw2J5~b3 -c\\_xx*j,'FYվ#0;WO >=Bjf{|'gxyW\LB\8x9_ "~3EdyfvxAi^$F?=aTG:Rf'gv||_ ح{XhnڋD]|AYXXMHTYJUJ]C$ùz늉x ;qCHvZΘ?D E.noK%H$v JPa FLrER[1PCYRRTCa4=,ko} fuSP\rn6 Yl폜_[5,F7G^&pA0u`GKNorA ڬx, -ȴUZLG2AĪ1Dq-2'Z̭%jJ=[,(PNՈq|&)_]@]Ťv1>@RɥE.3D RT$JNYTɳ=z8lVLKsPKjK8XuisT2eEkBX 脝 Fe@s}tpʰ[%3m[Â.A%]fc0ݠ5N.-ꪏS 0`2٫\[DYR{lKuY- ܂UDhaCmnjGQ)kؘlcR4r\? YE+o\W 6BD0Q&-ZPk[2 odL->,#W|\ >D#ȷ+urJc*en="WQ*f+\2|1p1"^ Իx|de}wpG\;*\>+C-,'P%p]􉠀:{U/}ȇ)OA=+kA%WW@$Ww1ak<}Ŗ` {*{͵1*6]^8#s/MdJ4&F[@5se%p-Wzq5g5=;En6b2`tUkkA(*`֭L-3}{aY -EiZ_eT7_C@ 4ޫE(?iUD[ Nhq"O1*$Dp@5-vql UA^@/GV"!H:쀖+Ԓ5s]mf-jzQw+ 䒗'Pluxja=H -0.\_oWb5gp  e7+~8P:+!wJ*eB@ +Gd A`C^uvt{gEX5=w-vMʔOfC1|Zbd1W ncQc] AG: }B^yF~ ܨs2%Cp&/2WA#UuL%k3Or7-fW -{ -^㊗V^ضݡԔ-tjZjg%m~ [gM>mDkMq(0W[Aۯ}1U7X6?O=FҦ$K.$j*t: x St#:H {*}6w@joy[<' @trKkL{9Sxeэh6Lw.Yς$C*ş2qFG|:߼ <ěj]%Z`&l9CPokԱjS|Q¡t Gn8WĭM*Ui<@VaGr-AOWXUGN% ̑LOV ->9uJ"ZsT\xwPJTU8 | $\NGt%Ywڲ̐cݕ,Tz2b1hBmq6 ]U%w(8JyW,l!fڗ)6. E ڑ=p}X`U u,+ -(&bPwT.m~cȴ 4ʄ4>WQ5nwTFƶLM]ݣ`ɵ+VدH#P]B1~q|;MmL -ᙾ2Lnv_ (bqy*RZ)1QO,|Y3*3Iep__UuƮ-3'0RT~G -o \eSsfR}|*⧨\`*{\/\#+uX-:q4;j}qc>D~}r?4Vkn&xNIUFb3\蕬,ʱ29ik0M {Qq mڽɂG -*_ ~FQ" MMm ->c冋 <ܛ8@{$+o܅a(/߉@75h!p4O ,03 lᐙLf2P{h.c~L(A)OP!z*}dM-t1clGWReAU7lBט)S\oAG0$/Vu<k뒌%5trYZywƞaRL07d\5ӉV/,dpEy4%F煷?RPTJ0]6XW;L@C!_$B}f,~T<1~":yRJk_@!<^1(ԤU; Au|a},CE*U0*UDdu|4]cH'q, dx5 -o\_5;DR+:v܈ѩFC;.M3@Gj-I,+GJTK;∎*b. ^1:b\T0yp±6Uw;%Cp\CEEW ZMB}t'IߡAaGv{R %08 yg uT]7/NÅRUi^l#15d{ t@˨|jMMх VչoÖfB4YwrڱP|@qk/Ĺ؇#3;_@ -#^xnL5w;"`? -w:>d@nQ0$. -n}) U-èbJ5ՠf%:FXz4t}haHbZC3 qb -ew'zcjN/Dq}'QO2*7lVYSP1SazZ-I/Tֵ[7~0AU˿?løJ-bW/c%ЉR(pGe,U <ܪaQI_QQMEeNXU7ql"zɫbTtV -gͽ&d앩@Z<.;L^aW2y( )GMM~߾d;R\HyP;LA :ؖ mWE -,QV=I +M`j`L=Ʒr9My8:fHxl8èo\>] =WP~O@ʏ‡+ƣMݺ徉J2]hUpndK}C 0)Yf>@e|,&p AR% Ò*w8uQT[+1{rFF]8 -L$=8y` ((<;8t`05F,k2%E1OHaqs bZjBՈ CK' A%ш !/4Z[감 (5:)< H p_Q1\7u61`#d#qKR3φRdn_h,3K EqP%w:FeC_ -IA@e. tVb@Jb  (5b aa#pҘ= L!x6Yy" kUܼj-s%A{+Ll*i !B6 #0@VGERo--A4 TGz5J>AC7=-ϪP~z dP{ȑM쿍sieq#e!<ʦ -PG4F1 p.5?nI|/,⒂1QmТAUh@Uq](ʒ-!)]M- c8]>T:7kDÓ$yb6,PbVU膕=ktdMYNqV8f@eM_ 9"[ktQU#*TzWk仦JS3^\Kxj;ʏ -L|U~IʭB(vcYd --&@,X&ni6˜θ;= -{v}9>\jmD 53YTzEnI|/HYMT!FTIw%Jx-]IJ? K 05a&Ys -6_6Ӫ)VW -5xV1{09,ulh}BH{Oı8YG2wuK(8P,=θjb|DYN?ygW,rʹ\_ܾO㎸KYD2 oڲ\25JCow)G e>ۨH UӶyv jpcz ǍK,(~d2Zmu-w*T|jͳR#ΥƓ&Yl!Bcplu=2ʼn~H U2ɸȠq^-ZqlL,$pUTpP $ d0YcD0RP]petg$jy~)|PqA{*]gSo3^Lǘ5"6bJ\ kp%[>pҶӪsr+=A=/]"v3&!\̹~% 4[SiFXNB:Em -_Y4L vb>+RU,z.|=:/ ˬ ]fO!fl%u.ƦZ]5iG=lo5ɶ6xxp -AYH .Ny[DuLT+NQ2\1d~:׀B,0υwz%!q/qJyn4we;٪?R_3)) "ì{rG!GQIUI8A5V~Ov~R7sme1F jS*dknSqHD#R=D\b{'?O|sc);&ofxߨu|wÚlc068r}R1]vwu؉n~һKo9::_DpL%n_Rw@T#\ xP -\\A+zS{UKe!jiM u?LΨ;!H"Fc:0[LUWP4"DX"*3]qDz$-PA@VR7eԌmN|$ Xm,ꊝ6਺;"rĦNt_ſޅGU QOAGo¡&&c_)xu#5p?S?( H=%wl3T,^ߺ ÛS\e0dc%I_ЈYk(Öb*.iiR[<),޺⴨w9dU2V9pj춅ΚP#y|4X<{Li߄d2˦$)bn2z=$VYi(=5V&AWܫ-E2/ę۰5XArv\?FB4{*o -9"jqv4_;.$7j5ՈZׄtnDcQmxPM -Jj<߼!Gd ٩c1\sFcr-ħ? A? 6-Iڃ!m/̵;]qvjRo&뷍XƆ]i~ޫ 5. J޾NlטF$E|OW_B*1]:|I%Zf@v^IhYx65)R: ]TČ7NZL|$LiW(Oj/SZm{z_emn#'|~ii545 -e*4 4<;KK {*S!Z{)X PE2zT)!Q?*CV0wkUF ?t*hEK3@PZ#S VEVŗl ]e*;PFb,A} -~-eH5aY - Į`k+y*@Eltr92AB:T1rZS3J ;J8RYbk?/4H7AiJ#tGwM1ZjD|Y)ˌbQS+Yq `_} ]6NPGD\w"x^]G_us s"žp앣nYaw3eb']<F'Fp7+Wbfo(TăX]0ԗhoƛҲD0OO.fHu;7+ P"թ{t)D%&+Tu,($JP7^(ԩyVGq:S"_G%mĬu*Q&s}!W K91+cs5F/ +T$fQ_LQ%)Ƌ6YU< 3_i Xa8/8X -U˓IV$҄m& *) p5xzVvR}4Ab ސ ϓfR -U}_ -~m&*f:#2G ` m@ qBu3.\ekV >n6]>Cyr&PIԐcw05e2Ɓ/kA:-*,™2HMH(`UJ;* -IwKZ!( #j~ZꊃCͰ:_KQ& -?cIM 4<\F3jxCmrЛ_-cWC !u1)]TPAfqJؕ -;.EJ68aHZbStu$F557&)Q -kqsl`SD`66m#|'~(*[Pl# Ns/\S)ͥT^CWpݏCZ.^bqVCW³.WAsrOrdX_Cie3*QyxRc~>ւU+膱 lǙ=T+6Z梥̀W*+~9 ={XR8R~O =aMD ZypKYT=cm`,JTʼn$\oa=K6Bb w X_mSH!ZYQ|4DR%DOm~N$/Q޾G$!eit‰RT rWĮ,9QZ -Ug!N@. 45٩qWJ&5_O tY(Wؓg 3H"*V!is -L h 0RdRP`hi( -f~Y8TR^0 Eɨ2pOeeq஭OWU"B[1pw+h5e%!\ -'eƪ-fT4OjDa\V#]peNl2@tPr/ܯNQ3 !VgFvmL-Q% 3#kLUtJ<2SffXĭ&y$’ח5pg<Z)w(IQ([. p5^ei}FiؙVVT#}I*l%+5v#%_5r|-TeV &jjiJ9KLLY#cE=g2=Bj -r!UCs*07IGZOҚ̥GQj b2ub(&H@R߆CY︚*kFbZ5JODyJfp:R$}ky-ũwh~QqQe4Y*;0*e1"07< ̧vhQ0\w8mE -RZI=v\f̧/;Lq\n \E" x9)EĢ^()am)%3K9řC(_5a]U_ w߸zF[GgV]sPDpWyIFҊo х _,،*R wl*kfq6 HBi<O %OKepyhI\,UpFQIsܻ13|1(ܣż8cqĦf"F 7r0*W5(-~L|@%D6 A=HjQ vm'a,@{P}#gR* 5!Eo -9۵[8Tuma)XN{O%D3s -;}T% wڠShm.8~Ԉr7Ka`Vzr|NQ~d;), e䃊P& %@E٫ сvW[+ AH"bD=O5ji}(o5O1$ N NP.hTYxS;;" X%C,sՙٯYX &T;nbf<{Qt-m`?%;KG#}1 wa6ƚ]WDԛ)/l%c$^j&[VaGNx,qy:@[?_X3Xg ]^c_5kolAINF\IC)Pa"BkhQ'52_Q~U۱CP\ƣ}r>5((bk!3*論v׋8XZ\auQ6kQ2 JTHBr (Wc?T)kѰU`-^h<kkˊ+FpZA*!eH&ɚ|(?$ t N]zEjb}ծj _~0-ᮻ:cv!W -VGV +LUjT*M b_F5gq3t肢宦KW|?Aٔ6~.1+V,f(PM@:ůlgx*rFYt\⁵.[fPU?vC c\ rJҺ>,C'?lxIJVYon~l`q_,<NV5WX`(׉Sּ87Hᡌ0>8DDH:" L{렷|[) -@PJZ*JbCj;5'SZmeD ٘6[$eqP錻cfAt٭$O`__/+O~TtB>3-S=~UFFeV}5t4t@0w.E]x q쎩WAzPUqj)-éO AGctH $l~6 pZ%@1!V~*5q\!Il5 .TQƠfxJ}T62J8q"b7Q %x@14 q_ LCqᗨJXLk־*ט:Lq cork`eHzp -p[擋TFgu+& ⊁)xعU8qnb,2sr*?Ԫxi*tn ]C s9;!,,8#S8yl8jq]+ -YRƥ -: l/"M&~DEw,u$_A};!l)"ڧ<5;5 -,@+|3ƍԢYrøаt^[EeWN -3~FBjOj<]CG#z ?>nʀ}W. K(*2?z;TBvGfcbtUeQ|^@{tL"ʕiBn[*f9vˋ:(7.e>qQቍr^cVJ)e -C+̃b%mZ 1b6`0Ic?سTy"Cx>x54!|x^RdDZok>KMFb2Ql몀ScA;ԴlX.)-D~p`wh9E3IV*C֯N"; A۰ -q׃rt՗ /˄sW@QfFhXRbf5p(~74y^Vlc5P55m 5kpni-p;͒czBE@1)-ӄOha5>-Zŝr$醳Fo#G-L,Q3}bUz5Q'sD5q,YS̥Iw*WQq'%Nƹt@w*٨!r\uJL8"L㡨2L3R+3URe0|u,f8-Y:LnQ^ (!)|Ҭ+/O1j,ʄ!8M J`.6dU+T`\᮵ -np>묦UY u{ -+/]jRSdQoChiXC;eHѻJ2 KIW >ԧRZ7wx.,C`fRD*_bFWt}V&`5 -栲({ܪ0W14!b9k^x0{7 lB1 8v3n JА>0f]|jt_(4@recZ8=&,HD^鍜\tѥ- '#yj2񏅜0f3jRc1梴qpe'o`qP xԲ.'*#sWģ?ܷW=2O 3\U$x==|(?6C2wo$*W7rS0bf^$|hs~,aG>9{Rpz6HVT\1y `˗ZZOd/iRj0h dHPvP[gbΪ^/\p*#!a_4v+>'K%9'P 48E84wY\39-iU¯CW[u i淹E ?K~0!Kt]F>kn`II54RO۶ v`+!8.ۙb[IS-P}TIjh{\ wud`eYx6ӹVjWi0eAB<էAU.g~o+Prv)/>6 %b W3ÁP*JP}Ar(8f -R1x@$RRE3]Ww57sXKfkĸL/ٟe^f|+|85ZC3nwKTiƧqX]fR_+,dil(вՌu2ړlqo\1NX4+&KWM_a5Q%<9|[EԾ1ʔ@;_=\൚ī@8\~'%bMIuOfkR/l1fO# 0*TK~%eԸk㙂2K FTf_=W Ve& 97+G lSW̯f8|+8KN]yB~| TV$JҪh}/t|Lwh5JszҋO[F[MS{-{b*T/@=ǿމ}8,KFf -a8xq\6-K+/<ȥs6%{J/N$ `P+MUe;3;dE*WVX -rX(c$KC57JG#}TmP!TI) -h{io?IqX-U.xtE51Իcwͱ@|qo،^-ܩRN.}J%Mp|1\ya0upj!\*8棍7+%'.2o3>R}0[n\3U6uy?< |D#q8iBb{E]SsC̷wQ#}oBi12⍿iU`'I^+)JMz8bnY4otWGK[}C|ىQ'g?=ʎ79|c|˼ERQ#o,_ % "cc7eUMCsK3Sc n}N.±FużSUq:>8ԳQ3/Qx ,(oBkopy5/Y.#+kLs|uqi˚r? {=ApJ)Q ^JيafWV.mHF%ukaؑ꿨TB`btNo&T-  ]!KH~ %orG s \"o]JdɠUF :'pRϞ_Tq h%|3/Lc*\4dž~_!+:5|[ǯW9ᙨr˸ Mwlx.V'ZyN~!' UqW n,WR.cbXwc|L˭+p<S)%B:/Q&aFNF*==~ pN5;@}FE~cEm;\/ EG:Ep>'rdRb/Ÿ;9q lʿ _ĹGs: S2*^ Q-ؕ<ݕVtx"6&&>100@P bZeSFr{'fnL%)@D{%ī.oڶ } iX#jhMF,y㯁0o 'xMpy)K`ԡΧhx^ -i8W; u3b EJq(mk4A5?00UBfd+J21!%>4xD+֎La_cUE%Fɣ 1kas@r?K!=Hx?CF_M/$nf3kljVD5Njj1<\>nFj+p#8R$pzT"bd.[@ i)WK`w-1Pb HW~k\Wί ~;_-uYe²pjĸurIm%X~b&Iw7aj5^)Υ#/v0AG+ -Fqv>+q[$~1,/WeXraRTw/0 ?s/ypGaZlTzb7qd\lVd, P-5AҠ«0*UbU#('Oߨ⇱۹xQD }堿)AL7)Ijy/kp> VvDZ*'ϋ|_)[2T\L[4G^xW[8xME\ز P=&TN #Ic!=̲mL9?kqA}I,[Jq+H 4Ӧ.4X_(]J wq| EdDQ_HXMu"A5, [_+̮j%B%MDQ3ƒjL1О3$H1KKPf} -q#T#b5*$hePz1j*7*A~R{a+%'Ģa -`Zlf,-X#1+$9*X1p98NS.)xR/7\w.W1ʱL#f7/L燞inUcO֡Ci! 6Tq~SX>>b:ܨFn8;2pø7QwL:qfTG -\3X?p?q#!!~@EþXi0 -҈֤{uzJ_1~ca&ӉG7GҬn]3CMO"z?46mJ)Rc>yd ˯ԝ*z?j|"=~X.C=X,6jeJ+Q-?[.!lL@gc9+KVŽToqU{.|lʬ)J]/'H*]}CEIGqƗܫ:b.c73Ř=9?! r?n$d$ e@SS\p`Qb6N%pE橘*Q5_Tss\xc\|+"fb*VH KѹjQR[ll!>mg#?`?t.Qr{ƵQN5bʿRn=kȝtYKn~ e[E^0WK8 joaПLF!%⡞ڌo=B *$le׈YJJ@-h5 +0Tl R|ܱ킷 rRxDb>míh6Ewe0VƶQfZ^]imIpq0!Ŵ`B\42raK qvKbe]`.}C -#Va D.ETr^d74M!H*{ SjF >XU@`U\l,CmEaEԹHH5^ -ߋ5I@)4p*Ӆ\a0Lw,U@}*"ǖaۈMt)yx-zA.6,rc-J b`_QUCN+\**J98,T@#߈6Cf^Mk <歃 u0HSQIqHP09qjDu0 c(XV?ȊH#BcD1q0/50r9]ՕJSII*\ -)GS7And"-O"+Ru{Jo$-1sba3jxeR:;^<4P¿2xUhS!pU,dDA c;h#PXBtǵHh -sɗWʛ0ƋCeb.0&˪no*5heHb,Hy"4#p*0{֡-%4r&Aj#d05MJ*e " -RasRq*TRK M@>HQvEj8zyZe؂fsFW}JlU:u( Ü$wN*[@l.fPf)ISY4Gf; ֪[įU|„ \!hCh2Wp,4Cߙ\WbZ!p` 0P@ ?OBNz{cs'r|z9Fba݆3oK_GD$rmӶDZo3̰Fy Q l3i4׺(;<9k4όI_nsn:eI?I %,p@0P ?'ćĭ)k =afV#p&? -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000010057 00000 n -0000476482 00000 n -0000476613 00000 n -0000476811 00000 n -trailer -<> -startxref -476948 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4d3543c8-8371-4b90-9ae7-5311685f835c.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4d3543c8-8371-4b90-9ae7-5311685f835c.pdf deleted file mode 100644 index 4f632a8..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4d3543c8-8371-4b90-9ae7-5311685f835c.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4d48d455-acb5-4581-af68-1d1f8d7a7c53.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4d48d455-acb5-4581-af68-1d1f8d7a7c53.pdf deleted file mode 100644 index 76fa159..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/4d48d455-acb5-4581-af68-1d1f8d7a7c53.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/50d4f009-b639-47cd-8368-f5f2fcff2d97.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/50d4f009-b639-47cd-8368-f5f2fcff2d97.pdf deleted file mode 100644 index 52bbc88..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/50d4f009-b639-47cd-8368-f5f2fcff2d97.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/54b698ff-a476-4107-8628-b7bc8d135bcc.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/54b698ff-a476-4107-8628-b7bc8d135bcc.pdf deleted file mode 100644 index 46981c2..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/54b698ff-a476-4107-8628-b7bc8d135bcc.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/5505ceb5-8d16-4a5f-8b3e-48b1cd53eca4.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/5505ceb5-8d16-4a5f-8b3e-48b1cd53eca4.pdf deleted file mode 100644 index f41c0c5..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/5505ceb5-8d16-4a5f-8b3e-48b1cd53eca4.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/5582771f-e000-4b9a-b3bf-bda2983c0150.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/5582771f-e000-4b9a-b3bf-bda2983c0150.pdf deleted file mode 100644 index 66c5449..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/5582771f-e000-4b9a-b3bf-bda2983c0150.pdf +++ /dev/null @@ -1,2312 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 264.0000 0.0000 0.0000 792.0000 0.0000 0.0000 cm /Im0 Do Q q 0.2062 0.0000 0.0000 0.2062 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -32.688 0 0 45 1.13 3176 Tm -(NDS: ) Tj -40.701 0 0 45 78.57 3176 Tm -(1378448 ) Tj -31.8171 0 0 50 0.67 3128 Tm -(OPERATOR: ) Tj -30.037 0 0 50 173.85 3128 Tm -(DORINA ) Tj -27.8093 0 0 50 301.86 3128 Tm -(ROMULUS ) Tj -0.05 Tc -28.5108 0 0 27.5 -0.89 3064 Tm -(NR ) Tj -31.5197 0 0 27.5 57.85 3064 Tm -(POS:C3POS-CT2 ) Tj --0.035 Tc -31.7547 0 0 65 263.85 3379 Tm -(BINE ) Tj -29.5748 0 0 65 354.94 3379 Tm -(ATI ) Tj -30.5222 0 0 65 427.92 3379 Tm -(VENIT ) Tj -32.8262 0 0 65 545.76 3379 Tm -(IN ) Tj -26.2087 0 0 65 600.87 3379 Tm -(MAGAZINUL ) Tj -31.8185 0 0 65 772.85 3379 Tm -(BRICK ) Tj -38.7006 0 0 66.2501 458.59 3311 Tm -(CIF: ) Tj -34.7092 0 0 66.2501 538.83 3311 Tm -(RO10562600 ) Tj -33.9852 0 0 57.5 0.64 2939 Tm -(CLIENT ) Tj -36.9025 0 0 57.5 135.6 2939 Tm -(C.U. ) Tj -55.3299 0 0 57.5 214.06 2939 Tm -(1./ ) Tj -43.0693 0 0 57.5 297.54 2939 Tm -(C.1.F. ) Tj -39.9795 0 0 57.5 393.97 2939 Tm -(:R01879855 ) Tj -36.1842 0 0 106.2501 6.68 1674 Tm -(TUTA ) Tj -37.3959 0 0 106.2501 119.78 1674 Tm -(LEI ) Tj -32.3647 0 0 62.5 423.85 3572 Tm -(FIVE-HOLDING ) Tj -37.8406 0 0 62.5 660.3 3572 Tm -(S.A. ) Tj -31.4745 0 0 63.75 316.81 3506 Tm -(JUD. ) Tj -29.6711 0 0 63.75 405.68 3506 Tm -(CONSTANTA, ) Tj -25.1272 0 0 63.75 608.88 3506 Tm -(MUN. ) Tj -28.5198 0 0 63.75 697.7 3506 Tm -(CONSTANTA ) Tj -32.4333 0 0 60 408.4 3443 Tm -(STR. ) Tj -28.3639 0 0 60 504.79 3443 Tm -(ION ) Tj -26.9722 0 0 60 572.87 3443 Tm -(ROATA ) Tj -28.698 0 0 60 681.12 3443 Tm -(NR. ) Tj -0 Tc -60 0 0 60 753.28 3443 Tm -(3 ) Tj --0.035 Tc -30.3737 0 0 60 2.85 2814 Tm -(BURETE ) Tj -31.3595 0 0 60 135.42 2814 Tm -(SUPRAFETE ) Tj -31.8083 0 0 60 321.84 2814 Tm -(DELICATE ) Tj -31.0879 0 0 60 488.93 2814 Tm -(ARGINTI ) Tj -38.3719 0 0 50 1.94 2754 Tm -(UZ1024010809 ) Tj -39.7992 0 0 50 247.49 2754 Tm -(6422768014664 ) Tj -27.709 0 0 63.75 2.87 2691 Tm -(BANDA ) Tj -28.4138 0 0 63.75 116.86 2691 Tm -(MASCARE ) Tj -29.4468 0 0 63.75 267.82 2691 Tm -(25MNX45M ) Tj -39.0569 0 0 63.75 433.44 2691 Tm -(520703 ) Tj -26.3134 0 0 63.75 561.94 2691 Tm -(ANK ) Tj -36.7077 0 0 48.75 3.78 2632 Tm -(LVO501020402 ) Tj -39.5316 0 0 48.75 248.44 2632 Tm -(5948941004730 ) Tj -29.3877 0 0 61.25 2.86 2568 Tm -(PRONO ) Tj -32.2815 0 0 61.25 117.4 2568 Tm -(SACI ) Tj -32.363 0 0 61.25 225.4 2568 Tm -(SUPER ) Tj -34.2524 0 0 61.25 336.83 2568 Tm -(REZISTENTI ) Tj -45.236 0 0 61.25 537.46 2568 Tm -(35/15 ) Tj -38.5402 0 0 52.5 1.94 2507 Tm -(UZ2210109185 ) Tj -32.6734 0 0 52.5 250.84 2507 Tm -(BKOOO194086 ) Tj -27.9441 0 0 66.2501 3.87 2442 Tm -(PROMO ) Tj -36.4921 0 0 66.2501 124.32 2442 Tm -(SACI ) Tj -31.0004 0 0 66.2501 214.42 2442 Tm -(SUPER ) Tj -35.5626 0 0 66.2501 332.82 2442 Tm -(REZISTENTI ) Tj -42.8552 0 0 66.2501 527.48 2442 Tm -(35/15 ) Tj -38.5402 0 0 52.5 2.94 2383 Tm -(UZ2210109185 ) Tj -32.6734 0 0 52.5 251.84 2383 Tm -(BKOOO194086 ) Tj -30.9161 0 0 61.25 4.85 2316 Tm -(BURETE ) Tj -29.117 0 0 61.25 139.69 2316 Tm -(CANELAT ) Tj -27.9122 0 0 61.25 290.7 2316 Tm -(COLOR ) Tj -34.0652 0 0 61.25 399.81 2316 Tm -(10BUC/SET ) Tj -37.7115 0 0 61.25 582.55 2316 Tm -(33 ) Tj -38.4177 0 0 57.5 6.94 2254 Tm -(UZ102401100109 ) Tj -38.9735 0 0 57.5 290.5 2254 Tm -(6422768022638 ) Tj -31.2182 0 0 62.5 9.85 2188 Tm -(PROSOP ) Tj -34.6149 0 0 62.5 143.84 2188 Tm -(4STR. ) Tj -31.203 0 0 62.5 256.85 2188 Tm -(PROFESIONAL ) Tj -28.578 0 0 62.5 476.47 2188 Tm -(STAR ) Tj -38.4177 0 0 58.75 12.94 2124 Tm -(UZ434101137344 ) Tj -37.4359 0 0 58.75 295.52 2124 Tm -(64256670O0530 ) Tj -33.076 0 0 57.5 14.84 2062 Tm -(HARTIE ) Tj -33.787 0 0 57.5 151.82 2062 Tm -(1GIENICA ) Tj -32.1644 0 0 57.5 315.84 2062 Tm -(BRICK ) Tj -0 Tc -57.5 0 0 57.5 425.31 2062 Tm -(3 ) Tj --0.035 Tc -29.7474 0 0 57.5 461.45 2062 Tm -(STRATURI ) Tj -37.6085 0 0 58.75 18.94 2000 Tm -(UZ9005335 ) Tj -38.6432 0 0 58.75 208.51 2000 Tm -(6425667001247 ) Tj -32.5007 0 0 58.75 23.84 1941 Tm -(HARTIE ) Tj -34.2 0 0 58.75 159.75 1941 Tm -(IGIENICA ) Tj -31.4727 0 0 58.75 320.85 1941 Tm -(BRICK ) Tj -0 Tc -58.75 0 0 58.75 429.29 1941 Tm -(3 ) Tj --0.035 Tc -29.3131 0 0 58.75 464.46 1941 Tm -(STRATURI ) Tj -36.7288 0 0 42.5 21.95 1894 Tm -(UZ9005335 ) Tj -37.9827 0 0 42.5 209.52 1894 Tm -(6425667001247 ) Tj -30.5764 0 0 46.25 13.43 1841 Tm -(SUBTOTAL ) Tj -29.4406 0 0 57.5 4.69 1536 Tm -(CARD ) Tj -33.409 0 0 51.25 3.83 1479 Tm -(REST ) Tj -30.1519 0 0 53.75 5.73 1365 Tm -(TOTAL ) Tj -28.4619 0 0 53.75 122.75 1365 Tm -(TUA ) Tj -0.0299 Tc -53.75 0 0 53.75 198.88 1365 Tm -(A-) Tj --0.035 Tc -32.1083 0 0 53.75 275.8 1365 Tm -(21% ) Tj -30.4727 0 0 51.25 5.73 1304 Tm -(TOTAL ) Tj -28.9701 0 0 51.25 121.74 1304 Tm -(TUA ) Tj -28.2402 0 0 51.25 198.86 1304 Tm -(BON ) Tj -31.249 0 0 50 6.13 1248 Tm -(NR. ) Tj -33.2069 0 0 50 83.84 1248 Tm -(POZ. ) Tj -31.8175 0 0 50 179.93 1248 Tm -(ART. ) Tj -31.8315 0 0 50 280.77 1248 Tm -(IN ) Tj -29.6408 0 0 50 331.86 1248 Tm -(BON: ) Tj -41.115 0 0 51.25 10.85 633 Tm -(Z:0217 ) Tj -40.7052 0 0 51.25 141.8 633 Tm -(BF:0126 ) Tj -43.7682 0 0 63.75 17.68 559 Tm -(ID ) Tj -34.816 0 0 63.75 67.83 559 Tm -(BF: ) Tj --0.0088 Tc -37.5 0 0 37.5 9.3 449 Tm -(S/N:DB4700011007 ) Tj --0.035 Tc -33.965 0 0 52.5 9.64 382 Tm -(CASIER ) Tj -44.7362 0 0 52.5 143.43 382 Tm -(1: ) Tj -34.631 0 0 42.5 442.63 827 Tm -(C3POS-CT2N1378448 ) Tj -0 Tc -65 0 0 65 835.72 2745 Tm -(1 ) Tj --0.035 Tc -25.479 0 0 65 854.88 2745 Tm -(BUC ) Tj -0 Tc -65 0 0 65 926.86 2745 Tm -(X ) Tj --0.035 Tc -45.643 0 0 65 961.45 2745 Tm -(3.99-) Tj -42.286 0 0 65 1074.49 2745 Tm -(3.99 ) Tj -0 Tc -65 0 0 65 1164.85 2745 Tm -(A ) Tj -63.75 0 0 63.75 839.76 2625 Tm -(1 ) Tj --0.035 Tc -24.9694 0 0 63.75 856.88 2625 Tm -(BUC ) Tj -0 Tc -63.75 0 0 63.75 926.86 2625 Tm -(X ) Tj --0.035 Tc -44.5517 0 0 63.75 962.2 2625 Tm -(8.14-) Tj -42.2387 0 0 63.75 1074.24 2625 Tm -(8.14 ) Tj -0 Tc -63.75 0 0 63.75 1165.86 2625 Tm -(A ) Tj --0.035 Tc -25.2676 0 0 57.5 516.88 326 Tm -(BON ) Tj -28.5644 0 0 57.5 588.87 326 Tm -(FISCAL. ) Tj -0 Tc -61.25 0 0 61.25 479.61 265 Tm -(2 ) Tj --0.035 Tc -37.7675 0 0 61.25 510.56 265 Tm -(9000221498 ) Tj -0 Tc -61.25 0 0 61.25 831.85 2506 Tm -(1 ) Tj --0.035 Tc -30.5124 0 0 61.25 857.43 2506 Tm -(SET ) Tj -0 Tc -61.25 0 0 61.25 928.87 2506 Tm -(X ) Tj --0.035 Tc -40.2265 0 0 61.25 964.27 2506 Tm -(8.37= ) Tj -41.6176 0 0 61.25 1075.25 2506 Tm -(8,37 ) Tj -0 Tc -61.25 0 0 61.25 1167.86 2506 Tm -(A ) Tj -62.5 0 0 62.5 841.81 2381 Tm -(1 ) Tj --0.035 Tc -33.5038 0 0 62.5 867.38 2381 Tm -(SET ) Tj -0 Tc -62.5 0 0 62.5 930.87 2381 Tm -(X ) Tj --0.035 Tc -40.2265 0 0 62.5 966.27 2381 Tm -(8.37= ) Tj -41.6176 0 0 62.5 1078.25 2381 Tm -(8.37 ) Tj -0 Tc -62.5 0 0 62.5 1169.86 2381 Tm -(A ) Tj -65 0 0 65 806.72 2252 Tm -(1 ) Tj --0.035 Tc -25.9886 0 0 65 821.88 2252 Tm -(BUC ) Tj -0 Tc -65 0 0 65 895.86 2252 Tm -(X ) Tj --0.035 Tc -44.5092 0 0 65 929.44 2252 Tm -(10.49-) Tj -42.6764 0 0 65 1058.5 2252 Tm -(10.49 ) Tj -0 Tc -65 0 0 65 1169.85 2252 Tm -(A ) Tj -63.75 0 0 63.75 796.76 2129 Tm -(1 ) Tj --0.035 Tc -25.9886 0 0 63.75 820.88 2129 Tm -(BUC ) Tj -0 Tc -63.75 0 0 63.75 893.86 2129 Tm -(X ) Tj --0.035 Tc -44.0812 0 0 63.75 927.46 2129 Tm -(19.55-) Tj -42.6764 0 0 63.75 1055.5 2129 Tm -(19,55 ) Tj -0 Tc -63.75 0 0 63.75 1164.86 2129 Tm -(A ) Tj -61.25 0 0 61.25 802.85 2007 Tm -(1 ) Tj --0.035 Tc -25.9886 0 0 61.25 818.88 2007 Tm -(BUC ) Tj -0 Tc -61.25 0 0 61.25 890.87 2007 Tm -(X ) Tj --0.035 Tc -43.6533 0 0 61.25 924.47 2007 Tm -(13.54-) Tj -42.6764 0 0 61.25 1050.5 2007 Tm -(13.54 ) Tj -0 Tc -61.25 0 0 61.25 1156.86 2007 Tm -(A ) Tj -51.25 0 0 51.25 794.2 1896 Tm -(1 ) Tj --0.035 Tc -27.0078 0 0 51.25 817.87 1896 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 890.89 1896 Tm -(X ) Tj --0.035 Tc -39.7414 0 0 51.25 924.61 1896 Tm -(13.54= ) Tj -43.6575 0 0 51.25 1050.47 1896 Tm -(13.54 ) Tj -0 Tc -51.25 0 0 51.25 1158.88 1896 Tm -(A ) Tj --0.035 Tc -29.0011 0 0 55 331.86 521 Tm -(DATA: ) Tj -41.8264 0 0 55 440.53 521 Tm -(14-12-2025 ) Tj -28.3217 0 0 55 639.71 521 Tm -(ORA: ) Tj -42.9331 0 0 55 727.5 521 Tm -(13:02:56 ) Tj -43.3757 0 0 46.25 1092.22 1838 Tm -(85.99 ) Tj -43.3757 0 0 47.5 1095.22 1540 Tm -(85.99 ) Tj -43.1195 0 0 51.25 1114.54 1479 Tm -(0.00 ) Tj -24.9575 0 0 61.25 277.94 209 Tm -(VA ) Tj -25.1488 0 0 61.25 333.88 209 Tm -(RUGAM ) Tj -28.1352 0 0 61.25 444.48 209 Tm -(SA ) Tj -30.1242 0 0 61.25 498.85 209 Tm -(PASTRATI ) Tj -25.6067 0 0 61.25 659.88 209 Tm -(BONUL ) Tj -31.0688 0 0 61.25 764.85 209 Tm -(FISCAL ) Tj -0 Tc -61.25 0 0 61.25 888.96 209 Tm -(! ) Tj --0.035 Tc -27.9179 0 0 60 221.93 145 Tm -(VOCEA ) Tj -33.798 0 0 60 334.64 145 Tm -(CLIENTULU|: ) Tj -37.6326 0 0 60 552.6 145 Tm -(08008 ) Tj -30.9568 0 0 60 659.85 145 Tm -(BRICK: ) Tj -37.0975 0 0 60 782.6 145 Tm -(0800827425 ) Tj -35.7981 0 0 67.5001 241.68 76 Tm -(TIPARIT ) Tj -31.3527 0 0 67.5001 391.84 76 Tm -(DIN ) Tj -32.6962 0 0 67.5001 471.65 76 Tm -(COGITO ) Tj -29.7288 0 0 67.5001 590.82 76 Tm -(ERP ) Tj -52.1135 0 0 67.5001 661.8 76 Tm -(W. ) Tj -30.2193 0 0 67.5001 730.68 76 Tm -(COGI ) Tj -32.8611 0 0 67.5001 805.71 76 Tm -(TO-ERP.RO ) Tj -44.148 0 0 51.25 1093.45 1362 Tm -(14.92 ) Tj -43.167 0 0 51.25 1092.49 1304 Tm -(14.92 ) Tj --0.0276 Tc -37.5 0 0 37.5 604.56 593 Tm -(90002214982025121413025602170126 ) Tj -0 Tc -42.5 0 0 42.5 1162.23 1253 Tm -(8 ) Tj --0.035 Tc -28.0603 0 0 56.25 958.12 651 Tm -(NR. ) Tj -32.5071 0 0 56.25 1011.93 651 Tm -(AMEF:0001 ) Tj -30.2126 0 0 47.5 974.73 471 Tm -(TD: ) Tj -38.303 0 0 47.5 1028.59 471 Tm -(00046924 ) Tj -31.5815 0 0 53.75 1029.66 409 Tm -(CASIER ) Tj -0 Tc -53.75 0 0 53.75 1154.12 409 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw"1 ~sxߺh@<@XkrŽZ*#|8H^+A0گZJJEzD֤ղFZ=kJzh%҉rCF=zV.J)z~Zyy:l慫Sʉ|%`5=p_]JpXxz.o;KJм-j^hMkbV(D5R0"CҴZ:z5cK"=vEM\w->OZ+eh!iEKE$3Ũb؀a\"Aʗ@- -Ujע pU Y5\`Q Ȣ,Drkr[[]\/N=l*I!-ʲH+,aجOD@h1\ex"evTn,WBPWk+r2Xj4 BHĭ*" 00YaX<$ejڤd`B+T/UOMK@zW%c64528YM8i5`^gKY -V XJ@KeV0ua(-##°T]E4l&9mX=pmVMUH*ExbAaQ00@J0*x+BX0S EadB@8VHc!RRV6-itJUU`ՔD!bY іPD,*#)$!RJ@0Ԕc[[z @IY6J@GEqK!eafkyhB#XQmnW )aJYYeSXDh##DF-CՕ )(abi %BA dae P02V [Ta#,Ĵy*dWPidhV! P -b00Q"Yc:mh Vt U U YlZ,\pb0bg|KPPj0%X;o" SbS)e,H W `%Z9Xz%HT5ŕ @cV5qRFXe+[*),YPla2@kidhV %a*dF"Ս 0²MQ#oZaRGW,/2!~'1PB\k[X4 - D`RY[*1m`XT+|" {X|zJeq\<w^tI:nZ$&ї#:z5WX0w镵y ~ ^J5^˺eixF$*(ajHT0#G6fT!}o۫uHt.#x&r7O -XEC+`5]w`N,^z-(4}';Ը},uhnMչEuGk׫shZnΏʶ\|ko`. -JΥ GF@HQbkz*$tx@$Jk" COenJl6VF5AZEZް(DEkFVB\ 5, U1BDP)*exOO[.;&tN>3rȅ7Q>yVqϡV4 >7iӴ1m8Ӓ;V4x u|Q.X Yͅƙ1t,A򮱆Kux ..&fءFeaB21) JD0$ WP%L W@ !Gl붍AMZK2EC%EjʎR [PΐUIL0Ix[_g#ڷw^Rsjlcm[0< Xl(|Ӻ; X0abGX}{t6G4|}-'ͱz̿3ɡo>Y];539ΐtW&dX ߏjQm^YPbf@8 .": %Y$#)#,`XayصU B%TIZDe* Um 2XՌk!Y R55p)B@,X!X2B-b"A*bMCp'$2j[UZf%Ƣ?JR:A-U:cUP|ʏM`?<~z[ji`gЎ?J1zS `t[ D&HB -C 4¡`1T: `HQU%V*VXȪ0D )CAX*dXDd(,j5Q$Czx,YʙQ{5< -U74WW:+5]K7O5ZN#,,!x|ܮ^ݬl;~l4?,utõe_&W^Ӻz9滿jA`:iǺ1G7ěvNE !G4Y:v:-۲_d*e*Y%@a k#D%,2U\@ ]1 -XdBՋ]&ƌՂUS$0 H VWUJ^X,R/ڸ{BqMK4'=;yS_6s%yk9GΓk#?=st γ8]GL,{hv;Ow:qƱힹ}ӱr^mp[rM'?ܴ{V7lvN+b}Y`(^{_5 nmI\d:ŷp*bXW`(J VH "dR!& -Z)aYaJ)ڄWXkzȵFWP#VUq[+X"ZQ]ȨFUc؇wJa>܎aCfg`szkmxrmܔ>AcE߈jmsV NF<, -=Pj_8-4`TArQlCf7z[=vRAJbԖc=;UqsV"8 $$d"RU2\P !VaյVc*(ȦEnXO86KP -!kD^ŐNJu_OϑJwyD` T (@H@Caq8t. ۆ/(6~@[]͋'.|x]պvP}UfOz^p{;yl6Eu - Zo]%0(aH$*Ra - " 0!!$%IR[\JÈD m=S,\At([ILa9*mkAipɐWRIgEE5,,p$bhA:'9k?kg[G w+7nYvW:а`o<+x:ln'm46ߪ׷8yXFφyrŖ袅zo$C tPF*&ŌCÉ+G md*։ -+$K*!F [q$aΠ&YK)*gVXEy!q`%i0BEECG#P 4 W!ZXb`8ӪVunQ9 e|31:2ׄuI<~LuZf%LћOٵSs[6k3:"bŅ,-bB$11VŰ: oY!J؂ ,p䲫Bh,[!Th2PUa [$"B4lE0X`b«,Y, -Q+0\JXڥ ],@dH@ʤq 8U@ XEj油@hIS9(K0Z1T,(h T вt 2X`aZƅQPbBJHR0X&X@H)j (epb\ -C) ŌF$%HLG,5TImz؈VPƷ`)е.#G $z\J(krN$,z--XY|УS%b)l72,<4o@h]mbpy:%,s\@jI5Am -AՁ [ZW&3U1f WP6\lє?1'V5DqqކQh;zq~QjF]0޼njd[&'jv-X_"z+9{l%Vy3Ź`oNaӰ qw;>$]&s*$Xyq}ZV/ #bdy} ˖_/39MA=| BDž}d[sIH/;m~4^_R>utN#PY2D]5fhKJA7_G9kW&?9һG&4.ڼ:k\6l~s&W]QF"-pa!-WHX%tU@E+ (F \.(alAcY !$½ a [ݘM=CIX,$(P0 @)}`#VF@*9)`dDt#,kD+ 2e -sLoZbN7/5kd׵[O/~V{W9nd^eHtmMk\Sԥ@*XX@-4.:]̾2\,gV!uY }eePp,rSs@ ]يK-Ў.%B@eJ -VnJ*(E@X"+@k -:#]D*О,)]TYYW#6:q,V3V5ΩZ7˾+'NagKQڪz18/sx۷.ux^w%dz0y>S:W-:P] J_hCh盲XOb _5Nr.羉<"%hi #ekAPEYaEvf@Y Cʘ+(,"H! - ;W 1V *!b:1dV,A&(  (,Pc -JHlT&EB#XHUWJb#bs/_Wϻ'u5ͺ)fcr}9'CE&mM7f,50`ġ -" -%7SUH טYs5+6UK&YIeV2<6Ed% Xbb D1, -BE`I $ 0*Cd @aB@*1!D,WT!uUu(c_G.:\+ 绱}g-ïLcaV$,H  -䌲!H! ZZWdx#+FRE"3+-°kI=ZVd9`gZ͎;'&:ɷ {㽛|s0O~0<'eq9b;W<9=Z6\MƯYo󣕫̂A@HGQQ*TAcC. a%HP,@+BjY1`UZX,0݇oֲH^Al6myO`95tsv~>v N >/E'ι>5tݤJoHr9+ 05l76R kCg'LWm,,bޖ]؁MÂ;+N9Ok} R\ԢPVWZłǀB mvC0+ZlV R9K *$ XaiT\]E#^K,Vba"¢bXafU/:r>N] OT='[yؽh5qERPުj@ -B$3$DX<# -LnicwZB;\VQmN9}%EX#K̺^u%xfcyWF&θ)o -)]R]] $u#PL-ky+mcvQS82IPTY"YZE+( -֥W>T*Itky o3T.Gt#,$yGGdx ,z숮t*k+bWe@ -H \Xšİ6)L.XFG؄ d+V`BaJa`MI6B`Um)We *)QW -Q+eh mgz3^6<޺4[:Ea6;?S68?@7E$[:5CqգpIzEazf}M/;hx_z9<>pn63zr{5xp&fu1߮e#1!`6E ,"(:C 9GLVE@xD 1e"DFYna $VP"I $!ZZypV!c!mܯ̺> 9Fj'_?<#ǰ͇vrGָaz/3+y7¨r.qgsvk9gA9I=dϏ2l\sSri;qyO~G0%vnsѹ溽нQұ f@V SVK -]n"0%=%x0A^Ftd$FS2 -#:PbxVCM *; jD.Z8D[ -9Xqܮ*6 ogKb>s Y"pVn]U]Ap,bj;x4 VVkyoi"==+<Ul?JgcK9grf#o_OST9eK|W@4,1zJ^X\;%I/o-O-Go#5|{EMqa1\eR*ed" -B @e0ec0ٓs.`珉V s+C D{/d=[Zc[3"rޫ]io][+0|57n ktRdl`@dYn:ɋ'a`/|x|f2xFn29&m\tj~c Rhоlk>,m\fkKt_vi\ænFx -WtŪm8}洌QгGQ~?g 6=SuCq^"ti5߹u]0 }sҎ{GΧ5[Qz6׍.8B-)*qPb[j5um*8V蕑 JA,. ť -,[P %M[4W2[të[>0Y:c/ir9ONiej!8wU܃`0ƇϚ3V>j>5_5R|wfL2{/5Ϛ#z%*ra嘾FC" 'Pzv-0{-Ik;G$`5,Vpܳnj>9nӭt#mzr]OR[|e*ZW Ml@ -$XV m̳) -VbU6)BIHXh2h!++) X0`e`GCCyf7L[v\ܸ'zr+v*s惏@A0n+^n\SK9b Ju>{q7&{/w>wm.+{sÌy}8Sz'$ZP7M3s=/3ӠnFĭ\_?Yw]7tUC{?dZ)I]?Ŗ$0Cxd)]:u^O89 Xoo#qٳn.M݋mO<>~=H2Wht؜ֺoVpg3ͻ">9g'N1^9wKs\sLm<ۀWj=LX2BUbEz$,!dW [ -GXMqX+Sz$;:7پkM̦PhΔg [*u:UWnڎ/uiG\wM8|~o-r!<^e;?7s·wg_v6n79k0;ϣVUH I:6o'?m2{45=+ǭ: [!LKnJ[Ge zrn@."7NV+qnǣw:Yp'X3;z1cVa¥zQ HdX)RuaB`L -i"bVYeJBҫG ! -17Kj/"DDFT{ݵicz.ܼ3gӧU/R:DH.BE$y_<ظ&6ܼl6q⎟98>Upssɸm3uwvaRFM;'|\2Gt+x#4/kJp߇6豣ۣvӏGkpDq~~Ersx.6wq׎xj$,(w].̇5'\eGy/T}1WLfQ2矎}+HSNG׹/[/xlHU^D@ Xsa<~us-?9Sz-NKH"mĆ[&@q#]0! -yo Б #0(Jh!#%Cwf ]B SMpU`]BT8ÃT>4sZ.=~cxں^|Ǩ|Nf_GS%y6cqGCF|<_VrrQq]:ty& R7@ݶu{ֹAoO97PrӋ̜kb2FL8ݴLaL>vjΦѡj5$ -Z-ImJ1ՉX.h -jtSZ45:l[@䀤 j^Y(VPYaHeSFrweԱ>JҲ< L PX -FDdiK)IIuIOP۹^4h옎`v̳&F6W ֖#(:SNp;4)(Uz e֖:Y pd!dCrڲKExj.EY.E{[q{=]V#K uʣQ -` +@3Av 1ޙ=Z֎g ϟp=yo k1]OC=,*ݧJmBn7ɺ&5b2F-G]bM/9YWWf+Kh0o{[Ca7:aXzķۖ'[y=aCl PY/92rޏ=Y _]9uzxhFS!Rt{o[޳9/=f{NuK_ -D">o뛲ބb]]u]/kij\NMxy`s[Gg-ܬe,FjjaڧMQ -Yx+"SE՞=#QeWXHKhX59槳\U87kyFT[%}=^oBYLJų̻*9&ᶚ6l\~D)dQa+4XΪ9ظvXQg2w;]m;W'r'PL&^_zfug;׃NS{<ZZ6GI⽛QեݓvC.?Ra.1*g#c\Q{s?ŹUiCW+]U\ʉhR*B;Wb7 +X,ZT@ V -0!X1А 6H@VLK (9=^mWayv|<{JGa=U٣){xMp!jx\Cګ8CPic],eIe={=<[UI`B&n+Xدu=!IɺH*EZUѾ}Z5.9бUVXShZZU\RQX)=t0Pʈ)yВH9HJD` #4,P$`)\ۋb=+cp~c؃d獫<7oD֓UȜ -\63g6D3tV>\|Gk~# ׫nǻ=ǭ8;E֫o9gS+^ADZ)$T5AR›+%jhX*t%91&k:=zEJ'pZӗgs:FS9?VC3Q?l u5X2R\ P mP5VPLz}w0?`9׫⪍/qz7@QvY}YmNZGtg1^w8mdKZ/KƦ-PHKj2,B+_@Eť |WtNQcH* ޴qbobL7z{7.+7$V̻Oz?k_{H܍x.ŻGG2GYz;^qzgLދfd.7oۯgCEJ I#ʬ4Jk^#Sӌ9u9C~)ٸR{Ga&z)+\?񬑝빳ePPVj̴unWMgq7m+/0Hyey_?z4KT9ԭԚt%RRjRKk⫒PaG9V+0e`*ڌ&orv\雟ڌ9bVv=}~c48J7 A4掛Eů柠5$;!Yk8~fن5[km~USb4ͦOhdt}kc1]NYق2pJ|u"q O*598ˍk9`=f&W!ߎ{{)Ѷ]`̦ughx ˨S욏F5J},__Ms̞FbIt=p?ꉤ5ެbv hp7Fl~k\^ݐFHA Ǩ԰fT kb[ISApѽ9|܅us7G%#x2|:>Cjt̺w&6Uy avW|14 RÓLv -kcΗ5 Va:/6G35| _f0Bt sdxN !2 -u^ko# -U{cpmC,fgMH'Swk'rN?yևGYJ7IuS.ήKIi`E[泒\tt,yռM,8o.ny|ܟ9tV^nG qRd=l9_EYy$ l ,Ց`u@9F$EX@#H0@ -Ց YHUadB0Pr !e#It`X2Ғ[+ٸlf{9ii;okb-[NuMCaAxOG׌_aӵ#p]X2&ώкF7:we#Ӷyo1&`NͲӣyM4W&Ӄk&;}z!Rrx9|75Ys@զ ˩솕Թxo8LbWFH0R@ -@FdPBFQ)a `j -a!XIX1(Y`3FK%p0)l R 3Vɵp?8wL :;zW, 2'fp* Ƿn\-Szהѷ-HrtM4b͇ʝGq]c#:$Fy7[|9Wϕ1{G[]o L7S4pçQ9h(a)ּu# i:z".: \,(ƻW:/3\rSsN^:;?{ƑS9t^1x=^9uq8OA+GY~bt݆й99Q\gbś6}3r8&Lj^CDX|w?StbtfA3ln|xcmkf0!p)x"إr$v*Gf -Ū$h$xk>jjZ6)zA(/߹B=ќu&ynikb3h;EQp ^dnFN}st 3Gmx#zda@5em5g^ 7ɾz=Wj'M@@U" YI$ d|::63!uMAj}dw=ͺ)_nfTq0;'7mtcXش=2O<u&լftV+Uƛw0b2zIhA;niGmSZu9fOgzM5!_(:/V\ft qu;\!sΆBHDtaXr -cV*@YCpj SXhQBU,U`p1 `Ml:H:`e'_[írNz.G-|Sr7noѹyΏ6Ht^h{zxNlunz1ӡt n/,gTڵSHf3WvhۦZE UMj6uc.ϭʌwMt*'㲣s5gl{nqH RB=LXj#ʈML̿On3ԏfϧFd72E5s%qC^ڲ{ }ߥ;ecOuu^W2]Pxt}B 4"2 Gv83gatLg4ӖGY~hy /^lmy4gg$Sݵ߾H [8v3HmIks/>9KzGE}= kcwlAzLW@T1$h,`,x, bBId\dzmGȞlNv:J1cH1kjAf4o)y&'y_Y%й5 i8E^.o盟v.pe3Ն=ٯo0J|z_A_d}ׇY}w휢2=:_\\CpOyyN{.g.'7L汻[O54»JdMZw tQq9-M@蜗l֍`кExgecSvZϡI'KcϒMup snr:xYYc@뇖zkPbHA#¹tZˊ+2/=q31p{jKר0Yyцaz=˲^'{t<# Cƾx[$=u~|َgFrnHEUEi6}Ѹs#~lqwGfSɘ5m}"qOf/p7}-\},kwgarvm&sƟwH#_T3^ǔAk瞀R= ygGzIKDCnQ=XL _c1tv5 /.;sފ֎ ݹsQq>;b8wmp.}muWOO>ͤt#߿hؤۇ8pߢ89#cزXvݫ{ivo~=1`U oŒMӞm<6 !nuIٶխMZ!5~kT}4 ɲ _1"|Z s1f][߸uӹ/X%y)s]sGnڑ7>rpc8w/Y -ؑCC -    ,@ -LIasV9& ][w!(1H -rs})j{rÓux@D$n8f+xa恿'5MϜ>7餘#QW@QLaC\Avty`p5cg_9>ZԴcO[:kMHI!$  `I!$!$HI!$I,HI!$IdFI!b ,*b$H"$ CV4aP4$Z9ҧI79{! `#Aa>NsrڗSW?2]K9Ck؎sپ}܍7^Y" DHB!$HI!$HI!$!$HI!$HI$BAXV $ BF - @(UisY$ID "C 0efm/.pLΡ~t:N?xtHHC z{8ӹ<ջL\HTWg(pד>}3OįUm?pI$$@ ђI@ ",1H<1`1H`VR F A`,!h AeHHV F ea!  !aBV63h盹pf?ΝpkY>3耄h YH`*M󮄏 hh``$V ep$, 5@`TGd -T:8XXir@; %dsT, DuiQ[J+["\dx`a`H0P0"@XV4VrjD R@V B0M6e2LO7d׺q×{:84|T'ؐ6䌁 Mpʞ0J0(HMn+DB\," 5a@@"XVY+%PH̰( T -1mXa"0ʁ\FY!F2 FZZI5Y!fBqԉC]tBe`B]/ -2QAa(!BC4 (h!P6S`ՈYЌ(0Xk,Ҧ0LnPR{21ZzdR43}~u60v"Kj -ftۉ'$.Im,_'Q64|4&'#cwU[6Fcڱ7o2 o}k]J&Ҿ-Kk{ҳW܀7_ZZkGcLS:E%>+vsQkZiƭurYڜ晝±9ϲ^0Σz<įNooTz43{<>lجrqSxkg_Z6̬9o *2 `!RrN„8|4,K!Ucv0yW#a([k_-^$u72$p' +sU@DBE`"[PX!dBTjadR#DR3h`A"1mʃ H)1HV"Y§WQKY,-[+- [Q<,by^VSV\YiO$䆰p2 ! -fnXj`pcF: -4VXT+uF"Y4+G -EGA`a -\mo.@$bL$V- 1 r:gK@ c. CQ QA 9MEBY%LbJ $ -Jˈʥ 90է?buMߴg[D oN$ooqgLjhz9Zn;G=ϛ M -e=BYo!oqbsײ&eNH J@H DX L9B * ł ze("JTGPB mn#A.KG Jd$8J S:bmlu5yTCqj@; P:A\ͣt^vc9Qum7o.8]2++ :gp1hƨm/No؁{u dUtZ VeFDU"+»  MaZHV$9" `* qa#V%*#@ ed%UG"ee @H$X RIj",6LyFy|ѫzK&QE! -+ٰxU= +\g+hqTj+t5BAJS   uC%Xf8D21#!8 ʬ"5c`V)Wi[H!c`@ b)C b!#XH"#Jc3,@ -ʱXh*) -Ն`Ŋ{yv-OW6`=F3ٚ 6e8t֪"ļ6~ʷ2k;Ϣ6G@@Qp"<++WI`B+p0T-)h#֤)EFfHA S@:ژ+ZA-"*lIБH`V18Ni{Զtx=3p8Ԋ2ף>4iu?׹ ?WSd#_vb)|s/I*|1Sj9lY\($00 HF"TՌDh,p@kT\Tm%V؀XVKjH+)X*Qb4`t daPvE 8,z Pi!AZ oq=8a汗9q HEx%^|✣aI3Ta+$f,+6E2l(/aZflæ5~w7M\*^6s&VO^Y h>׭lWo@ .VF%NJj+KUTABV:#b#! 0#D%E(c`@A!"Xq24 X01R=bBfmFAoAXb!2%&O}JHj6MG-A2,gc!M.]u3ugԊZAÏv.MffV[kI7a׶#D !e@Hq${LTC@vYMBD ` S $+V -4B1Ei\KBY-9,VDdb CTUb80XRrXZn (0M3t֏ft Ȭ ˩ jrBHUk>TT&bVn樶5}ɤVZc6뼟}\h:1 6r@Uߢprh&]!=^TԻG}~k[?͛ Izg4鵭"\s0Y8L!R#ttjY֏<}s/}!ҧ.JW7w|)5]M+sNft]@]t|wW9Ju7$ss;5Wۏg=(snh[A=ɡo[ZfyHɿEz+Ԭ5p#H*a - )$,<I -TzE%+TDCrqy|>Ӧs^s.9jNXax.4i~.l̖69?K}2VgJMb3nDirc8`0?t/tØ{|Ӝџ:}s=>__y6}snwN8|^uWpYEߦcE߹scrnNm ɯ쑬Xk5mNWκ78+:@N{[[윀^[yJ&C t]4nk9gXc -W FX%A"4!h`" ~CRI뼰 -޺G?nz^ZN߫mj[g+Ry}s.Sy##Va3;'<é',<é/8tоU}I[Y;uΖk>952iOu#ͺW=]NTn.v? s/Cw7κ;Eߴ=w];зtw),Se+FK V}9<:j3R\QfHfŰFRC QI$ e20/@޿>Hv R *KkF&śXm=kuH+tsLҷ )VS7_8#ovѬmw7Kdph=+;'M5ZrHԳx,r{AꜻG܏W$|s]оsU51>Ö'|'_Co4^rlϩsEyWVG[3z|9#nzi0ѷzK9F΍.i;z.nr3s~ #-4o8; /QRUrj+ "+`A ˑF`Al8(WWU`qD%F d*R T2n XaӹR9B}M7Et2κM^<'5?_5>N׭m&iѝ${uozgs3m6rظ_g^5p7QV9/XRCz_й_3}.s*n,SQ̾~<h[;ygp9F2\_J";~G_nvຎ/#MxѷsNK=/t5RQu yOW'FMunFO;}ӟot&y:+P58"i 0wapVEVׯ8bzL\Z0皦׫TSjrޫzZW?4ywX]3͓>sgގժmƳ 3|17;8vkhOڣlҼgf9OVM9H9/9ՠ/O'g,?O| `:w1ҿ5})o2d<&3ɡgMu^m|ǩN%8}^?i%;?f}h[ͺ3.4 Ct5-Uw=Wn|s>%O?C2ԾNz)SMWQ \V3 -D! +dITjE>fP TJ]PVD,c&fcp6ɵkRzԜãhZN~%j64Y[>\rwCPFNjc fuܸbYu|6_h58pL7T}V^YyTNCd+oJ91}?תUWQ//`W9R鳙ssX3ƅJ6]yq>͏xmgrUyK!V&WszYz79_^nfYm:n_ԏ>3<Ϻo3f˺,]h}{ -Nzs{9E4/+soyܴ4Wٗi;~cquܿ-=~;)4_~x*9NhtHu^W0V-S )9bsC*)jVbIP,g}^Jp(YU\mA!b - -i\Gjf6㽟sv;c[u=yxd~o -;Nˢsh}cusrgp1g=Ż;>ï˨bs=VWw^S[ꜷɺ(3?hۣs:%?1\]zkuONAg,O rz~k엍Yu.W3ϧbrkcSLuݘ[t9wSl|˪rGw w\;*s_Z:7<1_TNcyLSMM'e솵ə#Fߝo/|Se3?Ϡה]DN,QՍ`U*ۨq$$AJ#$g+#('투R(!,WTbWkygu*k6*Ccw|Q~^I56ul~ۈ>hX-CV_l7yۗi>hzF9^vU_[N)}v|Ѷ||/)~SX|/&?>v+Ϧeq]8WN،b5.tJ [_YoGS=5p#/uuCD|&c5-wII/87E2N0wDZDϒCd0G>)~ Ԝg̭!d3FF$@ D̢r‡\PW 0+23 2:,!<$DX, X( d+6¦b1QlbRWj:TZ -ָ]0OV^a}e6(_KY`*+ R -' ,b=Jy(kz!IfrWJUVid% -9H_YBYXcX#*+ B(Fla`YY, AZ8$1Jypձ/3Lfsct'@s ]F9kW\'/Nn/QaR$ BQR{"ڂ_L)oL1 -JJĨZ -V-R69J=\ˍ= h+f!UrV,aU+X) -V+H-Wy,`:AAcG@H"@A4ÎBPS4tv ;և7SKQ렿GMewmy_umg$杬8[J`  -[+׶/97-N gYݪl;GjxɳS5sn^5h=XSF퍳teQa2 `,J͵RBbkC,A)P"WeEA$prYSfFHHl4HGX[A{^&7={`0t O\^ζ=x/{w -M{ Qf|>tG-XVB3+FRP(ϩʺW.1Ln7m9_Gה{Q׹gUkyMftBuOӹ ?njx,]8J}<:=4I*,D`QШbMK)#BT$,Vd*BE%B,`QǬ)`Y+#ݪYlbJ9"y)b \1U``5ն92;70Mc|NOZy9q jǻbK-znG-m{9{4lN]թ^IW2d晫uȸ+VWd! +tzHV;$ $y -TR@* ]VxUA^tgߒw|W3ʛp1zٻO8ɪLM[Ƨ=GP8J2ǑKcN5%zZRk^ɳz9Q,F׎o%QBMtK˧JCVW Ayպ-ů:ZRXk@Ѻ;nSuW .buvWx&?v;إKGdr2 $=/g>޹OF9IѱԃS.-o?:->s$f EfB)QB`@b#  k#@DʥJAK` L^SLLc6}so^W8kN}h/ 8?fg0Y.Nz{fnZ%cgf5~D}Ә[y;zQ׎uչnXJV2 ҽf7rrjSSw &R^zJrMUլ Uڵϵs̶K?腊* $,ub$܏\ޅZ#1y=^E~߾ه|[_9~9x,DY(ApGF $5$XD,jD1BL:j+ .td`M5ˆ֫{8=6Y'!.oe?s -0k=ţvJ7eژ,Տ.Sf4mƙE繝V+Hy -BWl'Y1~`%^UWE֧y b -tZ0>7kٶZL+'UږÑ@Dr*) -*S@0X9%I#I$ !z DdR /b{I]^UQҴL*BMU\5-H~0;vEUގgдM -4\*y}gʬ ,$ E(*HȨ!%vF uŲ+6Y P04Hb ,"-V Cb`J鼈 6RHZ)+z[* kjqA, Ha$RH½d1.Vb -ŀ@@BXP@$E`YL>zq}_sNQ*2X]_n{Zf_7J"Jq=h$U=`,:Xq  -eWt0[YaH*(i*"3CBh#(*ju =n[mA VDd*XRHXk4 AQ!G ] [! ua+D hGP"5%uiI D]2Ttn\ݜ&SjS匓sJ(3Vj^{Mh8өZ07}njV5B +z)B,"FkI,J(Vy%,0UrVb`BR-tRHZ ŽK5\bX !Ņ漱jQEaĂ0%pD+AI+ -?o=dδN+t%XrO.ys=6{wN7o0^o'M9 }ÙaL912)ʟ'+KԞ'}~R40Q% +%VKmąQQƄ2H bW $ `Cc$@V -J쨊( ̰#F$6#Eb  -Y`je+a1?ͱVW{p\GM#s9FSoZ9ji={ ^oY:77柇 +/b:{Ǧ.<I}2yD - hVZ,W h4q 0B@"@C*BKX#ŋ. E jQᬭ, K* -2F -JBI,Pâz%DҢ\j>ug4:ұ|\y {R٥:G9o -h[T)d=vJ@zzV_-+G -h\CgQ paKdBD!*]XBVCI :P@ -yjAQ,A#(T"(V*Y+:BY#"8 P0d6a/+̛,;^' ]yEfXϑ\z jqrv]&WZlntեa^s~|iy:L&uD:j~3u^Pdz`Q]_z /)4_?W5 u"J,5-[q`ȕkjkV%vVHR %()p(p"RIĘO-w,T)kd"5bWD[$%@CLD"(;.&?[Xno/Ec]Vwa9 KicFֶ8z^]4ljyaѸSs7CvL'?7 À7>s9Cշق=7tVm1շ-<]كbvbz+5;WM=L;5ȺHU9IЎmwʃu6aZ1\uHHXCTт+ -C*WBՂ85說FlCH`Q-" $h#漕lF2pͯ+d1>UmF?FW.[] ؏75h]b>ێwfy3_mݵ.:/5NƷhGmYeY3Ti~y[39yeӷCwU=x_-(6oWny%{j2YaqG EJ@-Qi@V$\`)"p#F8Y %e,0w)+B)KV,Bd e@j/Ԅ$Rhb ~1CziI˩Lv{:"45uhtLy˭Խp9X^ow:O6: e`H bAp -؎I!"* CKJ DYXM(E5a `nAa`3GڍC r=Q:vV.yT^SָcJ9LGN]O/e}?C3~}Tt=XCҹF9z3^#i{ezD]3ͺ?7MI׳˞aiGV#fRiDƟ Fv.yߔzc.7%6zMSՑxA4lAvl&dNhe{1>lύ2:'B .9OWӏՊ_>xw T~nFɓ9V9~q5O^sz Zji+K+H 5Na6PF "@ ^=q7(jQAjj$*:[ !laSd\1K׶;՟л\rlצiFn<}ޞ{]/L)9yr:ɰ~<^^BRUMg'SS|f/J_]uP-TaApvJIi@ZkRЌ{<^ -붒p h$ĪYksуr\=v 0*-U-w *,%qVjԡ ,s0}֋OIج.0旓ד} # -FhV/%V,F#'N gאQc<-5ZYPABBi UVa - -4ԦADh"[XKVmbĸ6b -;(k x !B$V CCA`bj-<ղ"ǰsj*=9#:Heq F@,B`NR-*\?4d<ya X \, Z 1TƢ !HDxI m+#iJX -Ajث}dxYd Z,EڠbX3VaB2!d0h$(B[?#-N[u]fX[`F@IM p1b R4Z· 'EC@@hi $#i 8`hPC0S=V jGbE_ftd%[]ʭc"A@+,jj - P;) B!IHKIZpDENz^K2% S= eU [W{K< 0.I ƒX1=y/JPШ`r=dKMNY+ab\UiTIQڲ\QJlB=$?ԠT"AX[jK\JPP ah,_:X3+FFd^c&MklW`3xAC,D<>+ד6s5gz^ZT-̈́`/?Pz[0V  D*q *=3VjT|engTF6=am ^gLx}cz9RlVsi_!вT@匫{f y|?534!12 #$05P`"@A%EpDBCF4O>Fuٮ5ƿ;_u `#dO?G덓=D|#4{s~)?Ƕ^'Ou=;]mOݧ}_YN7]~??ܵk g|>I~nOS4G_Om?/?/4$ɧg8d(c32)::ikD{׷[zC˺an*a ˬ2T K_3q϶#3~Uů6X۠$wsIֹ#HV^J]kOLo0BYs/l/AA:YY_TmN[76*uZT wr鑊LeXg-._,T~bSV2US΢ŗE }~6?OoRB+ s ͽ?,<۠/fik<8YgG gR1v5j9gCQ'v}^#VZc1П3^^8(zAlXr褔! -횤+l?겦U3-\f +y6-̎b≨H(q}^-R6~ORZqfXV !v`,b-@Q(@HPlw8G5ٯ5~mq5"7Ip0ٮ']1 .aNEkE.:Z?O"q51 -'K IW2Æiū0v0Zd1k*/%P(/bo\STo&`ZZX鲒\:2E r.)>cό(ݥ#\#ViO{YݰBN]uJi-UםJSN n2v3?v˗ʦde^~ybU9[~e}[c OuIݿ,4V6D7.t)Z.oGc<.nto/, [QᤃH\f"҈ -IJėӇ7k/_, -*XLӥ UTabu>*f$P5$U-P:%+`F>ݯf W]ZsqI3sYx}T{YnfrXr:ZJV D@LDX:^l~Xd5&q;#?G``-s!`C^iL'Rx,б"{aF qgd8+3#1155Qfɳf#sG<.ٖ5ۦ܏/*K. 3<ôbkE`tӿ^`^^ŕ/e}+l[PU:j2/fM*\kD|5soZ.]@B/fxΞSzu3P1n>.8Пz%ر?KZf13ezE V\3w 9jCُޮj VJ[zr,0YVi]MPU.48O= úg.\؉.w%?Θg;exlF4,o1Ӡ`jMpNۛaEK嫎2Jeywkzwy5rtv`@ĦyI]XSQ+Myc8oml|cRHjͰԱ(mDrl+\?)O&TS(E,|-.2Xg|}]>v ܨbٛGXfS˻C+B|= j@e{Qai%Gnw{sR:)~yl{}|}T]_]8Ү3"1oJvfu>ťO¾[z "N\N9[^7ob{` Ƴwn n|d/c0\nT -MswEDZ@J7BGERK.ֶ+qĪ8^'Vbmwuƿk=vw]va@-W$%ke -l7Kc7>"C]=}kgLkDlaVěž"ڤ|EpqYMF+6Z([lw]y(Uk].N"ia-;+mWca6K]1;'A8.D;"Ao;[VZS,@` -" X"5-GdUW`+ 2'[0Zzɬh&)udrGئ}i[φ[poXk2$='+X`&lƘ, )a,FXIl/j<`ǂZa(]l,*YLX2cIb͌H0]mR) M"3KSmFؚę,U\XwC\CMC -F6BK %a`+ o -$Dil.*JZ#;.f́R8$Q11t˯6۳͖`Uk nq81Ɉk-7̸bGde]G~q?\kkvkq]\Ic\L{dn&pVD\׈l \kqq@BY 4T!nxjt9E)q̈́q4^['3weOεzg`۳+]O/mM%e3g 1lp\&[s*66Q~ O%/*^tSf -E[R9wiı -s{đD4U.m&a(eT'Z\ǹ-z '}&ɪq*Y.l.,(\G1"sL"kO˵fZ6qe}щ[y>Y 1ċ,scTe728^, -HEJ.&@~"G 1SU!.f:޾Z2(%( %PY-+*ۅ"Un]q5Ƹ?LA̻c4bhDkH8τGf]`"`Zl8+Fhl';5a\T:Ƶ+Y#AHrËӌĤTUf]ٴʶZ.v>kk ۯ8\kh[g2fp|~="he2 k*旻V]ɣkxwT3}gCv{O٪p}#K*}FNu\ _Kh7ſtqWM-٦>fYe33܀iYԩ׶JMtB7Kwʺ9!(ΖB9b\ kRJm]_:vDaԏ*O5 _#Z0kZV7 JW%MN +WKehRөV] QfOll.tS9kC&Px3c3 &sxH$5"aFcm Ř|2[.*fԠqYR6*bV_>qq-?-ZܧVWv:߁DF}Z(0cc*xČ.j|kekMq}0V1'Y1Vw؋CnG g.QP%7voVM0%Wwh^8Ba g6}cVZ=`usSf5ICNL͢8V{iU oF5gE6?;KN`D6,oݮ^0T9lQ;[C(hb3 kN[-p6i{S>Ql6YMb팷`fm}D^pk|XN/|1zavwNGZ׬;/C;>_(:,2@&nfVLE(]\Q/9>m຋  -*a;\xRQrJrjQa%3ևi߭zٕPʪoNvY#ƃPR +McO-1ypiXH"BarRK٤[X@_iF"8/Azyl8 2LX#lX1ɉKNG&0!s(gF^#Vv;: t lj""6pSZv1*f&0g"]%lb+ XvMTj`gx{},pQQڂle8kXk&'{@c,MdND#aU9"rS*qgƸ]:vۋI 8X(Ł#f*hlSZ`"`6smd`^jfBbël]s!\$}:^((.$X$C15ٮpEz'pƊwE1kjv/Rgt_ZNp?TSسt+fkôDMz;^YdĕB%A^ΡKp*8zS}6^:.p1?uFpw[)P`yQc22SՓZ5prf̧6^'f}{e+{Mt&\,HVm}FC*_9rqocH - -~7-}rt&ۅKB彦'W5WI!鈈yeY#Ӳ};'=e6Y򾁼gmPFjەgnZzEX] y+쫃p hA6˔)[Z:z;F\bīe3_vi9iE,+_R.R,؆E_զqӔzso(s,oFx8wǻn/*>"Nv b Tq 2M{9_-Ǹ̼ew&ܭE|:%9wl3SŇE]\+} -< ʣ\YWG6džm|G^Qn[&c…Vm1 rqvVʮ7'ne$0YH&Bj(h5Ux47yo7ZGS7AtVSLdܲh07:f%'8;ӡQ5ze]%D&[n>ª$7N%HRB'55Ɉ -3:ru[T*)S)duҕWQ\eqSZ%HZp->}u.@twAk_Fdc_5ƾ|'ۏε5ƻgUs(GVk-p2328/$ ݽ;^%#sm)ڰ)ztɟ pZ͖U8H0^ +jZgȘ -0Rc-r <epbl[ҩN5sH&`7㈽bv3gLq`Ҳ(G`h-al}Ld8N(L1\Z<[|,d썓1^Σ05N"#ܷqqDcHN!)X29*Ӆ(; -Jy*Zp_ Jk *֍"q^";ti SXZC2Stvx#X Xⵒt[W$7f 1+lrNө,>M)l _ak~fu5Ƹ]bN6X)7dY_pvvcAX#ؙuƾָZ\N55,)dDS0<fr0U2 >?m,- ?ӪM=YʽX3ϸ! -ks+J6>9Ҷ9*6ȉmƾ1рB@q'!F&Myk+˒1K?3 %޼[~'aG6MҳUER)VWߓ3k hf5Uc ˀg]@p u\kq5ٮvq3D#Ȯ@XˁYo,@N8p- &49m .hg0Nan.( Ƃ9@8ScŗG!`$$ - -0E}vLgnhff:pv,zՅ^Q턇 6uh[2:`('y` nRP&*J+@Ս4mI!`5 e#b?(规ziզMXe{ _Agc02 !vx,x -2 (8ÌUUWlwAzG:nbh..Ncٓ5uA`bդ[ o\&P1Jٹ-}{-Yt$23mp#Sͼ Vlx"- - -RtRf= */ҹf_k3e>{d=Ohh#B Cmƛl(`C;\Qnu,ǵSZ\fWyVA s$lYD5%umHT|G'7Z`fv|S7qx"͇2b:3{ϷiV\߰Qv,!y}}>5Ľ;֭Ƒ[0/Î~ݤJ)0WO\#z7YF2޵H:Аqjw1(k5ƸٚtKVqhnV@澫wBSI[rVe1؍keJjv5^czΪ`9zᵯ Ֆ\!/Pwl(o1˒A[eMmpB${n7O -o /m:IO;9zAyekTcryq;3]xJlhq2yiQnSBH/#bS齳5@p+Frޯ#!bSUgrܡbdi`{+ ӪqmfyǗ˻L;zsl}y: .Uf76Ts_1{w- t[XȚ W~Ɍ;5 B-$`JZFh՜ -+;j-taTUV%Co!ҕҫR-h©jf۶f$tUe=ݸ 2OC8K5kP}yB ⢯Jh&`V3֮[UF50nWg6Q)rޫH+D ː}u?`H,tt}~v:_jDK85VŃF<1P -P2xKOYx6X4pG/CVh4KӪ3\i5ƸLN78&'X\ K^fZ z۰HލF$I"~Vλ&vm"LM:ċ-'V/jY,qŘǹcn3'F-=zn2iפVC.au<eSJ[/Yף2\fbi7e=jÙRIڵ7 TIek187X)X%I,ő8lsE@iF!ߍZϳu58SsU48R!7,-Z`nZc~B-S}kt1vnPyzM.VĘElvfm@yivY,(;fXk_w_[@YZzT[ě - {xIVޜL3Pʩ_=…%kgBT}Ֆ}VjS]^aWC~_G쿾V-IDufCSt}6 Eq{KZbĮ%ֱ%^d]+ýR lP>`yhV+Z'J9g`0 {r D#Ifm$I ِ̮@VqmW-C9u'.{`}סXwQ7Qž \*]fl]:^g/C,mua{)Fa|YFZt`Dvq"A_eZt])HĝeZ!=vU zL'e{Df68A^d,[BC34L,:uY{.K_eq`gUf_͖ŊXkDj9O&xY0809Xܻpxצ 5kZ:\Wٜ|5֨x9Wf;~[ڈ9K\ZkCDaS>YbA8:VR.'Rٙ3~$S=l{JbT*)U-Xb4FB'Rt&`ao:3yJu(G<8ُj}MtF9ne}ye>yK)Y[vt%۸1PJ$)1?#I$u]B$_*YìwբjeF8G UL `BoW:1 3ZO!/4ṕsك2~,Cۙ^-ʧq)gm?{v3cW-٘kxo>I@Χ%{VկffDnv_)MWq4t3&e{|f=.#<ӄ|=Up.c[;S`3OS˅v#- ٗsTdTyW+nUu*sAe[}&Ň^NUCG{r\0;6 qίkoS0(ZzOcOlrA8j XWUT!15"bx^8u[SdFs26]C3aڼj;.-KRt.jc f5)W ܸGq}ۈl (q%o1 -ʫ]ƒ9Qxvج`5໶U]Ļ23`\N) 0w8rf'(H ]KcfݒnVWӉ:vR;aaj­B#q9FVQTa?Tڷ7C/1bqN~?1|wõaKN8dkDsSZm28,.aڷ -P/0j*C/nџhkΫy: -QjMnSj<}9W>{sD@ -,OBǿ'L%.]˻OG'sLsd|SU+<ӣ__rNk }Bo0X챧p8?M^Xz׹17Fham[EWxi$:ޭZӔ)lUGsU^ -KWTeXYmXж8\7*9 UL6ecq1Rx0WGzӣXk(e3sl^[A[a"}_Nόe()q-@Ň*[YRIu!dl8+nJFkNXv+FQՉ*(Z,̘i bbb}һ:PVkabiU>ƻ5bv56Xb";u7c3fdgf"k׍PstKt-M0؛v!\`q˝ioՁ?0-QA]v`İF eo۶xA6n*ST]֙]hSBz""~#YE E_jfe4!zPC*W -yO59y.̭v_G5󋊔e^swf5'Kَ.(Wne{z6nzrv!9y@M9ٛtB\͑L9NW,G-5ۙ8Q c;-^^h-o鸜^|?bz?H{0 mb^_Tw+w*&f< (f}4goʻ|Ӭ.]L2Ǐ0lwyaM vq%b[gfiA)A@6 - -?f4F@-}BC*$hk)֤D&gcn\NK/b sYnaNuB9눣jA@K^o[/\08CYY/3&j3pꐪi̢jM̭v'yKrm­иʹhnF6l+f>fiOCa_N,YO5裷(5zәujM4J9w.b_͡8Jy:T'+~?J^ 3^漥W a|yLkki~l6GSl=<]4;3nm9zՉʺoMцzײf:M漶Bo09 b|>fk?VajQLD.9X 8 '{unʺOWL]ikNڜe]LМ9pu&y3vق*pe In>k?[naY`pb[ñ­ւLlj3rb4fuٮub婯 Dھ%bqjŪfiJ6FLeqc0)'YcYbtA"Sp_UuWJ8?S٘3uFgЫ;I㦺Im˧#ý :Ҳ =xs nx9}m `Gyaf rcV-󮼐f {A`gm}j9deUSC=k`3_)s?yZ#[SҷWe}Ro|o)}S\k`y|LV_ շs$]o\f} -ݵp8mzPCɱV< 3?_UᑣT<8ke] U%_+~Śt -uY'p/4,]BUu%h+}W-`%مhY)eh˫p팫z?D'4q*~iz1bts4z9T֝0<ƾ.>RJk]fQQ5l+\{ZkBF1e4/FVGo0>a.r1mgtrxeٚtY( PfK9B,O+Ӌlq< ]6Cy{׭ -kUhm3m֌nS;#(,ڨ _&EJ%Wm2`ƽ~\6"цN+!2|@[11 q8q0-8V^15IV( WYa^el^6h׃]vVu8~~bb8 -K4W9};VT\PVs_YupSCHx~#]kk}}5 -ׁJJ#B{M կB/Q![5; ,V+֖*vO2*Wfe%zWDl_t\EB 3XQf2NŹb7X`Pg}.+.6 }閺^_l*9{e5-L"Ͷ"E̟O-i*S@6jojP56k -ݷb7+T"uR*1s`3-f ¡-yw_M-m3;-Mv\:um^۸)V] u6hAY [.XB%P¦9LZtQvֻx/Xf?PK5ʫv24+n->Lr]pQҠ.%Owtb%Hf^k2gCypuer<Fs-*.xN3 ƻZÜul2e!\c3fl'cA"+tӢRbepk<^_E0h?WJLp6Fܝ+rJ)|>grWrVi?3^ca|TgMj+*94j5u+Rկˮ}lw2!~n730>ԓRĥQ)f{f7CwrC`#4(b[iNϠbplJ^diHŝ!>Ɇ+wu%,Mp2eș48Lo1b=W+oDEY+T -Wkv>>l{ h(($z@ ^k< hViѭ\"#2egmW;e!^@b -3/{\^rGpMg7{ƪʔn/e^ٱƑV;6^}Dp.wۚtgmR /L^v/f'Ŏ+!yX9y~bVw%83)D 06s' EnV}/otkv־eЕ;z FH -_G2OU:5oU-[Ϻ/w\²bwлK^W{Z( j}p&~u&JbМҲ.\b/YJ`.baȦF&b홧Ae#˂HhU Jcov;M:p&Fw9rI~_ڳ\Hme}&2m e+ƵȽe։totjM[S `@\9 -]Jh2pi8I(̈` ;v\Ox[-r󭊎SB Y|g,tJ<2L#0,u`,ODM@bT- fqDNbIiW= ]1cDDŽFR兡B -gN%IR"U``DLKVWWrײ*[Gj\ݓKT#-EP3}i1eu/(/;F"eK*uP n4ţ<5SA\c0叞u,kLcp8ZD VlFbuTN#O5ƻ56"}q%N} Slo'%Ćf[&t3ioū+2-떉;w$ ?1n&.uva57]U -M߇UVSjC`e&y~8tH][/i 6\Œgqk2J3B7ksV s6-ɒiw5w }G/K vZpH?R5L:{G:b˥AҵyuDܪX/rգy㈀TO-_mҽɔp2bSwOYgϿ̺(_Ӎ>LCo(^8ޟ;:=c)@b,]^)n]Hܢ*HFKONjd|uإԱeƻ5!yvRˢxV]Z6[ӗCnǡG.0V\krv\~Ca\:3o2f^֏k`./x^Jx.~lS3b#R|,*l}JlJ"8ܯi&V+Ʊ]:E'Qk_S÷w_ ը)eN-J>UM*=k8lخ;{81Tf]%PI/YFm2g=].e侌&[F1Sz5evЏH4nN"0-S0߷F5/mӡ$j42_]\kq7vk_N/{KKX2|_qi}Jv[O,{fO۳kWڰjLyF3J:;ǣVu1Ӟ e W-r := Ӳ1W*SvV'5B1VܵeD]JYc-lg-Ap qt+Z,Uu(jZzJo+@-Vc>8xyb5X:f -Id~Ʊ\D{`#1Xbn1>EՑ0pKl ZF°!1#ۼ"8 #1)5`\xWm"8(f|@Z`{x@qUeF9qmN-Xľ">%۱+¦I-`i6O,xe6ZXQ)+=Ū1Sg R*'cİXS-y`M))[ &v*@œ> wH5!RHQX=#.+ѭjJ7e{rb(xk3nL -ޛgOuTl~V7"* mIxkxF!vۥ}1<Gڳg0Rj4Va[6X1*}v` -N,nKӝOCE4}z x!{9N.)dž"꽉`Tcs!A+.}Qը9g;,)N>leSY!vO=[g?.G-aҭ:־z.׹B~煖an35̋s//t)Xҫ-vnټ'WnvI;YC] _&j( `f|l EY 6yNU =jS5H]a@@n-X_ -H +K.L"l -k1Ww]i.)꽅Ʃ}(,kl[[,#LXP3ɥiv:]2Hab.=jݐ`$]kP^-o{6CV-kۀ -̳V -Ⱥ/x]E+$ui8is(7* SX"U||X1ej);+Y$*֬=緣OD,.IWaX;+1# u׉Ja#EqaRkO[ ]ѩ>d=z'kݖyZ)@+8AٳX5c|pU{lKUO80zX -h4-p -WeCJ+#-_uV #Mu RێMx]&KX*vt@#8YcAxik\H Y``C]\l2\ X-eCDHF!-Ŏ"`D`ސ7_ ji#+1`Uvn~K0dA. wTdJ@gb`G.){VKl8 lύ \h*|TV"r/K8b߾wO|N+ zƱzt`[SōzCA[ȳoSVZ~IL8^e U^{KTQ0OAtoA1j(jYW. MQ)9i9|ķ0+.b8gjR+f*p(-i.4WJu[z1f$M$ -=]|V=hc\G;lq+9kП8`XC{&"au FoOevR]'Z+ZZT*(JvFFB`8w;F!+L8+ŒoO֣lϳdun2ΰw<l* ]qzCSԤ9\Džͥ;$P -ݮ>~ -]%yX.N˴)U+ }>^ݻ@n61+_(=;z]PҋrmN/8*⻸fV\=0;@u)m8Q j}q;V۷У9lyWeh -ma)5~0`bMIDQDK냣1"yIB jZ"mR Ymbۇ*t+%p` 4b6^ pÈ , FP¦Z+ F<@!>HO?/O>|D'`8'BX&,g"bv@h& mF"Jq#Y!^! lQ,,k5L %Xc ޅgv64`Kυ-3XJAQiC+sV 8;9 #JIpUOXGwWP+W-'WyTa Zqlmyby_e I%~/Dꇳiq,ʧ7ujddӃ]y :H#{jR 5~9%côpV@Uia$)!m>#v!p{[L9D\*a&(:qR* pktqgWHV64  0:jDģYa>wNXrEJ>  -ŶY$uƪ -|Vc\*n`o.uP${kE!\1[%1{N]Cղ!,\5#?M+`O=<\ Vݘ)oN;j!Ud [vizi`W+KkpthlЫљݲn-Rd MW&x )td -[Z[Jx ;GAyӉm-ؤ2lO|aMgwT˧fk##+l.,|+ Y8jt -:QHo[ {*EE]<5ׯ+чFkd(9zuTuHm? I.:y*k#Yp -AC_$]/Ul];=ub6FV= -1 - Ox)+>7 cǯOc:j9TəlÕ [Ë=9m:o7t(q75jAo\aDK0ΡO:U'bJk^&5ץ?>HKCk7mX(UX'z&n8CKJ?~~6"!tc 1sػOR>BCeqԵu%M"WX*Ok X.,O2MgͿҨ$0X&ȧe")"tzi[AL8%@J֤?cZVb)WIUK1]Ǿ5eŞ>Eβ -᥺F. -i-žaB%)'SPF\c(#hDUX,q31 LH`Dd07B'd1 kxc\xkkUE 4(N"FJ +#9!`EB8UA%C+rmiDF-뢢ajV$6qщwr:s(aV.ڙ8Li . -&$yoaV!U2v9¬sNs! |LcN%Q mfv88' lYQrb)0=NH/ǃ1Z( *q*=Y_%Ff9:҃j01_ZD-#MZO]\vZL$1{hYE3R HyơG/"p 2ŚNR -E~6++ hˤT^8j`(*IʀYa*|j9v/><YZ(kC:<0bF}<Ζd`ڍQRֵLuZ{v)7N~wN"8*8A' pM6 Dez:3ܘᷦ}:SmwSXQ\1£EYho؋8>o(=#) W.c0VL8Ž'_{)M,ѩ\ -BP0VeQSg} -](Io'ޒN UnT|a}'LpR{-#L Ӳ|V~Щѱ3󻉶Rk>ड/} QM -Y"@bJk? ﱘ` ̖3@֫Jq:bM`C;Iw5j$LHUfK(kص۶2K(ŕ˿ O*6Q,ܮhHNOcĮBW^ -7 Bmm7;=e3襋zJ78$bFbհp~,,RwV7_k x?>Ο/M~3X]0GpX -#Չp#1xA73Zlە{B}SPof)x_r@zd53np9 {m(7į-dde< qmL)ݹ7-8IXnk`EG[ q)b$-w~e {-k4)UVRD ؓ*DiP#oyq6AqH#ewت1EZ ߾ SR8WjD뀗w1iF!]MYXnMe޽" x]U/vIpl6t ZgzM7+D9<(tӇv)T Xl؍ԧ%y58-4wiF``f' -اq&ߤw`3OgOcOoO14ƛ4ƘcLi14ƘƘcLi14ƘcLi6i14٦4Ƙfyhn-.LY$J9;65]c0pY=V|3c;WTR!*Ro¤tm۸iH^`v0Ч$j q*:4Uwu犪Lͫ$hu3 :&]]\f?/LiLiiLiLi6147q47q7q7qnw7qnw7qnw7171ns717'T' –,fx1&I jOryf>[1GB~oO;GOGL 10LUrej7ä^0\MZZ!:8‹ٌ{ -ar~ѣۄcӋ^hPߨO6iLi14ƘlcLi14ƘƘ7qnw7qinwcLi1nwcw7qnw8x㇍ncsdGwcwƘcLi14ۦ4ƘcLi14ƘcLi14ƘcwcLi14Ƙnݜi14ƘlcLiLi14ۦ4ۦ4ƛ4Ƙc٦4ƘcLi14ƘKi5eFz`%`Bcm,ΑWEX}3;j=f8~͈nw&$p,IXNCV1Si)jVF1wY*&X Ϳrc4ƘkA nŜiJY3;7.J͵Q4kwM}tZQx̔L(,3C -V%Ѳ5bl~٦L -KiDTTccLi14ƘcLi=6i>^4t٦<"/^?mFt٦4FcI^y o5e:sQ/CإncwEĜE̵/H"Om1ءbzj=sXxT%/lsfDE;Qeez o\'Jp;K&_`vkύ+ڴe -Rʾg0Ni6r֥ƌ8#(ֳ,̄A.Pi)WeqB8Z>,I-?f]Z:RkA+B3+2׬ ѤfBSii >6f1S]3~clFˍUuNWs ·j>7+8UMyefQ! {xFW V-+tnؗK7l1VTϸ -V-jfdo:/rhuZ&V1Hn+!Vo0fjZ]e6R -\9m ޠ):2(ZMeШJ`1ksj(^iG3fݞ_p6\Dnrk֨fu*jB@;e̲H(Ummn\jrƵ71͌)U=$_o-&Łuv+u(sl5H0>w7Z7Ҵ1j-ٜ\U`]:2n!u -spib#/+I5r/*-̼,ಷ9$rLb$V)U-DD#E1gej9TAXUAR?K:5 *%*#LEZ8* -VPKh Ҫ`DF&"`Tjf5 vRUYRo_ՕX0Tol6x鬙B~jCcHLɰV"bbv@^wZ+tmf7 -Z+ (~cddk+"rY;*Ј@G53&l)Ѱ@Wr T;llPP(?~kac.6h{Fmt*坝O1)ivYh89j\[^*J\l̷j^oc2ucKbYKG2ԬbxˡN!Oh5=ڔvqfeخ?(WAՓk˕dU/gfi,_r ծQ̃5]XY&;uMTW6N:UOGAY7s>qEM.GgՓ5*3 c7=V/pT1`k @xºԲ21S1|Y%P2N,&)`L,M56̹LLei^T]cEkaySãlսʏ16 Waּ:Ub Mz10jS0 -Zmm8 l-OO@+e]9Sumfc8,,3Ac3żp۬Uf4^aYW*Ūł!Ma<>zj ݪdVͺ `u:_-vxbc]Z T<~W5p4)2NKs#B(aO X~k_qvk ޵z:_mb*kXaX`u6@3}JøHz6ܶH,n%[ˌğ_5u6j"7er?j\j~7+˻-çu4͘u"5;_[j٘]Q6f67 ;k&R"fmg3^֗ikfmg2lid2VQE3V^kƇ0̫.JkM0ߙiU㙗Qͻj~Y>wTvkv(Kzs:Vk⿩9WwT^oЩڇox}X -a-R>ۯk}~^'2/ khX/1ivʼ:DV傼ݺ\~WoS}빱x7>-}5?.$*)Lw/l#e'~9Ok. ìv]s):T];kk-1?36V9kOԶfInhZ,e~'\km8_Ye=*}m[Tٗi6ۯƻ޿t|3="ciK]J)0Yo_zҏZoVc`]N3/e}ο3\kLJۧ~;}i=?zb?'it{Zl6޿x}>?7]$kA c1l)ntIO̟x}\x:cV"K1#BcT$Z-n& p:MUW;䇩DV Zk;[2+x(~^a ZQyq n|.YOxfkaOxk|BasϺ:/1emZl֩-r_HFd-ebRZF,(7C ,\M{|L_vC5˴ -`SW ?}YLE֝lq pԣvSPE5YahcE[bF5(W-78k p4ꐑR(Jf&0 -vk_u/uK//^Ⱦ,Zw2rt.]jUk4ʵy)W>ï[l46DG\iL)g/2"jr38e<Փ^Yg0ǻOq~^c]je5+vN2MNu ec>-ԕCg4u޿31rmSvvUᭅ_c,^PΕ ^{oyEUY&@_tV"Nͩ'_^% qzʹ.i䋄p -ɧM|l-KTRRθ8i 6O<b%OPH -`EoS1&0{T"&b n'ep[,>Wt1Yݼ2ӥB8Mk6KeСs PWc[t(^-V^)NM#Lace -Řm-9&ouN"V`bfAf51c,l!&Rt$~06rUq>yf㗊䝀v̙mw1bNݢTm#a0G`pKTD1f«s)FX`xbaLAR Z〝톰<A,#H b#`,a΢3-xbfnծf)c\Am1P Cg5 ZNd b#qR)g0Xذ8捌*2j۱LPW T$[૨5֝ɚVdA;"0@$K~G< ; ĔVZa!dèHb* :0$!,1OsUf!nOoI.0bqb&5XV8!5bh0YAnD&w*&|m-dt6 n 5(YM^D嚁èS5SD B:>'v)~b#mx:"uѪ$8a|tWtX}YJoD{Dt=6:9K1.::eoJ(˷!ǥ_|ix~u ҷoO'i,]eʓ5|EPNn,EJ&F%  -"ɸdk"舁d4?S5cr&DG%o ̧ 3 kU'bQb$9{t861+ s;*"^S3xe?Xۦ -6[lyFn*pAImcr*UzH.uo -E{>4vA<,x`Ć[t(Ԟz0a/T`wå_N2cѫV/:Gp;J]<^ޘkN߽v-w_ vdt?(<闺idƱå#'gU{=-5F@*ƕ>aEeB'4#Vt?(?CDKeMuOϿѯ ˺Fl@;JLW Jm;]c-p]h[{p* rVa }On11Aqg -=XXOFa3c{O Eq)*_ sXeA9rP< V$jZD Dg-~>[òfBX3bgۉY)vqk5[SI-KKٲP+RZ'b&I 0yA>2S wQcX[Qhgu8C]E[V"kbmh G.>dSJ8t1Pƈf=-zNґ._ӬaDH2Jwz:DH.; -]bi,(g߄_`wj}׵kz2[ԩAic~Aޅ{$(-?>ݳVӘzJ ݰ*-t5WwU(ޗjoٷ:W6to`oۨ"1>z5kmN:I^A̻p~v8t^Ң1*hn1 ػb{{Si[>xwML.c Ln[?o>E -k6b2JVL~%vXe,t7jr>vVÒ9Փ5hk`dUD>1[K._+Nq#AcXk<"F -q %DG,%j˪vT*K!d-czt3УlXB -m[ Ll[V^`-(,.v:&p$JY ] 61#(0Ĕ VA$#&&>>șw{0Qjv5 flb(܉ -0<}-pn ]t"6;- Wb[[;-rQE.Qrup£dU^SC*c+,80\;  yF`ʗ"`*^"0#+dN"<\HYT H>1<e2 bӲ]9 ]Œ%1"b`}?:|D 6s; - oX.$l -| NY6,9cc%LTQ);"LU5rE"lt^lT 9;/`QXT{9qDDD ->Ve"%B6kL* -5^ ]D91T]B{n Kf6n,~t_O|G/z|El~*Y熸F(d@0f `KCذN9,=eM#T0rM0Z .WPrjq2J Ҏfݩ(JIw'DP)ֱn9, O0[a -mv΋b>i+]W036+5 kfY&}2#`x1Pa>{[X8nK=E"]ҒsV`6 -.{ P iK'l=$| -I/)י$"g|ScŮqORsy=;(c/a~Ÿi]NX{WY맣uwzJ^Q?GW.q{w|ҿ[zTXoOW}wj֧[%L]2U^Bmq{GgSU~K=tp]]}LkJ^[5* = -ZnFu]E~kOޥe e18WVqj}5G»* hq[g+j/tѽңwVYL[| ;W/{ыS}ӗw:ر/q{KcW_/^X~>u_U]}ַň.Fw8b{/}L]_eK=u˝ -,wS/tuu]YybGΣEtmqZ['vz1KgZA}L=sL~3-1c0/8ֿOVS -t-ubF]=nw{[=UzF/}W|WVBF<}7kb~W%KDw;lY?*]k=zoC^Rh8Wk#Zv\RYU.z=s[rfs䮬ֿ* XҳOF1[+CU^zsw>]FյЫ;:^-tF y/#Щbu8JZ^mc\Li4|Gj#o5z{ڟo{_.qsf]0.oegC.vé_jv8GF]=nu{S=tcƯPQ{w]fkt*#:^:v4za//dc_PꧾЧb߅aF^^lP}SQ?][vb;{`pNmKׯbBw8N3U.z=s[YO0P_pn>okҎ+lNOF1W_+GޥTEΥ[΍)t1^޸vƧmoѿ֯bFw8c1R/;\.c2fs䮤nܟ>bsWWFN⧨C꽁^WR]{}NbuG̽Qb<.thu>^^G:t:3 }>gv0y_SKoK:[ԏ?t=mQ7ƕHkq0=^޸vŸmoпׯc/ΏD=yԟ;\-c_N|ԜYq>p}+:qΧ^|E%ƋӣQO9`=WԳwF^oWVy<8ҡ y{}JB|>3ӌ}z:{]^#~(uluTmt0=>v\e }03/Uz q{es -]{z=0#ywlgŸkoƾ#^=|>1*X:;·A~a2ye˱{N!y+>vǩ[}>p uUH}\},CGʟ|ԾRz;*v:Fufc/?0ǝ^eϖ#YFp?RJ|zozՏyolgŸkw~= -;\Ǹ,\g{eCc_q{c,e-Y䮤yku? p>upt:#0PH0zv^ެh*>c1׽93f,?RЏ=9C^K?^[]Գ|iFiVmԻ};=ڇke{̽T:A}KW11yq2WԜZל̺[] W4rUF)s Ga衂Q -~!>k_/{=WoT/QЌQ⏧]}Vww?Ќ  1eaއk2'hv?Xz[.yg֝k^qb~Gscs\<՗יzԜf\-^[2,2% ˫[uqos./\*w"na8QROK^܎ -:13h?aU_byK.~S^k3<t2h2?^Yz{}~O(;ZcVqt.wwf~^e'W21l,n3/9_Rqs^k2U=|Gөv{1_ިz1OOπƃDž N|Կ_RfƷ,)u_◠|Y>-?rު{w8ˣu4;FC3/-zoV^c_cusO.intC{ݖ2ޅqs/9gU?R1sf~_e#\hƕ?>匷 eK={=nmus;jcVq;ž|?]9e3?Réy徜ӈWTwyqM]YbA.F2:]LcRRϚj^W3Q解>:Կ˼̈&g:s;;i3[}Nu/,eLeu5k?evt{K}1k?ooqG/Ԝf\,ezrex1>JN.w_1`~Kܳ~ʝSusY(zKGO/տԯvڏ_0#+Ǭ[˽_af}YշUKyY]R[~*쿹2isf=y eݽ#3?Zfqb51c4/^wcs]~c}6mwgaWt?=%ӥz=[ZsvzAey>c]ޮa}_af#e:"tL0+(&1n4LOt-x11q<~qF(zݶeť031q=AW*Srf9˴2ƭ~_U*14$Čn. DMj$\V#h4/UM|WDta+k =Z`5pP)` `+F `iLicH2DDDG;cnt٧'fޘ ?xG{pBSnbVm(anf0כtSa ->D ?NոCl].r.(nYQ*-f*[N˖NNb9cj\b|ͩxAf9o3( 1^ՊZJ,븆pG/Oݳ9Hj,~}c leV"+F#3bR5GTP<n0QLᢀȦU? bNm\n⬯6\6rea'ٞ?0jQY$ב=1i]_|r+ ~'-MۈPeCV*nlF_;AXPlbA$x0 -KOlgu`y|8fM~>s?J G_5"81?ON9kS700g<4U2/k-*NCGw9/( !=H9 -¬Fr؊)–*>_g=?6Q%83͞daހ^ŠԞ.Wt#HÕ %"053DK5"#dƱ0;H"#O'd@80Ymk9QaX-5»8Z,HʄegkYخlrxP81c -fƋ ^+>.`Y.@4JxAF! -smv8cABz򇁥:hɇ," 5"Q8a34Ƙ'114Ƙ]?>_9oKñ9cAlO6G`{E+CD6>*#o ee6CTv+_^3}S1F5NO֪x޶#ouf~-I -q\( Ƶj¬R!'xfR=oP)zٷ3?11_pƖĘ6Rrtbn gqκKvֹ˺W{ϞpC kPeЁǼ3mYaRIVx[.^# ULae-u K0NR5h@?}1s QIc*6f~i+E.3lFõ#kzn9 wNSjߺ5J\)U'KvpD7k짧33, Xƹz'QXBQrx-Z8\/vULb'\f^qMUk[Pa,i<ooj1-ea UҀ)M :5|[m"#d aW}ѣqSṞ1\gUnŸ%9gKK %# PTJVf? - ^* -XXURR5%{k!uԹ! - -cF'+|M -0%/vfA\ã_)݊ݴM\`V?QmwӅ7kNrΏ61x+Q^l]C\ky`cdf=n&nWY1mcKs,f,(+8:35$\vJDŽAF%F!8< Ɵ> ("5м0^X_tmM)@36iLi ǎ `2Vam#1Xđ9‘病0Yּ)2(0ŗFJ j')l`W1^d:֏ aZ|84ky(G1 ߵbf:hر` -֌6,]|f5og%W)L[ -D`X -(|# A.hpNћ`&[ [`SL&f@u(^߅+PM}.ߧˆ&W+x4lYa4ަ5yw.Di"=oکo6b̼#8|.(Fo*F`iJjeǽa${:u/8kb-;d4}v K\SPT<|U*i'§o nȽ): q$`8vwO[rTlVӱ>ݮڗom4\:V]{FWM!{&kSfUk5*\%/ª1W`[ݫ߿fSݘp(~6X6X[Z`8uĠm"[~!V{j=_(XYF5”\{}>ׄ.DZ#BXk//.UmyǤ "<]b۰po۲`f*Ջѩ8b X$w{wxO^0yyݾ_wF̣w] 2ųD,-tOհ +u2> ar@žڟAܹb؅AF ֿBiQ̺1[e>~fxyn.݊^T6: a_zh&fk@5ѽ lL۷h\6|!'ZaqT l`qZ'-w2;SDބ{bA*_X"ڢyV#wBy;39[ejBC ROg*t7wl\>|a5Vq )Eo۱ 3JHFEi(,QXi);dv|HKۊd RHہ'oUR^r ۊ+\D 4Nɶ~qHb`cqm;а5 .+@^)Q Q .F0BLi14lik@*֎bq B˺8hjПnƱnn4*p]Pl6ja+L\:,~,a7ecvTyoW|8>f s -D/M]p8\Km+~ͷc.-<EhI2]% D"N `"Ȼ!V×En y,q ⭦6~42Ղ]E챂ek -d6!#[i)CU]ƛlxu*fie^rǸ^y; `X˧]F+Pc'qM&fXQœAtG#ܾ{<#SGFyy ^H7rt!ockO-=B؍rfv):"Cku!w}n=>*_[j헗3 ?@5Ů˸+) -χy -H{߹nt)?Uf?_hζ bs.uS,چsvwOi -~y"XҘLtduE''zv3fJB/ժcj se3+N[1x}0U$x^8֓ \>wOyr -=4sF4xZx[Sܟq/95N1fMh,+3VpsSx} kAFz 8Zeظh1iYRwT4&눧xj}@-@V3 Gytѩ5"aiZ𱀿;rxH/.>t*_LCT]աݲl_MӇVߏ*-!X EF'{ldJR, -6G0Nq6`N! -5%V -5 -0Q#1"6>3M m+%mh/w BVUc]xHbűTIZrlkGP -^FIUcfA9x 빈 'e.7! Tݴw1rXo.;w_|6`f -%`,ˣ__:צ[ՑU -wrŰ-0hȣp"akG;% mQN`8/΋1`յ-+6!<&4MmbȪDhXBcᐞ>%Z+ GC,ǣ_[ʥ;|w~#g2WNSˣݻHfm&A0UJi-oz\(M^Y(eUkPw Y-"$`t*6d6U -Ƞm"#75VHOvfb8*\)U4k3N? O|vc֭eѭF0=X@+8,7073W-`d$N)E119iF -,nX̌t~,ֈpF]fs7*W%6NodJ~> {"7F Ss2W -%is^ԗON-k]#xUwƗ`b#R#uNKz:Sb 1-X9+n:hUB&Q Xi"D8Vא!1{l=O ,#W:tXPǸ׈0lw.x~Ku4׸۟gOcOcOFN`e㘞ߙo2_ӷ O׉TvAPL;YFcP^c`85bqs\l@Tx <#Ne8_"lڜOn?5{2<͉Rakpk XfhQT `& D`Fc4tum{ cl6-[< -껌~;LZhоb510V%f]cT0$R8 "qOcOkM~N_:nvZIF.UeJbx_я:e#E81B+DZޟ?8m۴$-1swBJ)*&,mcdzt`LK` cl< Eђ{"|cI֊MF-zݼV_:z`9K=Oy -$K`;`9uAP2$]lOeMXtH6Yoo9S}uMiY͋s}E7KnU)[yyx\̆ -[R+ДXnNOZ  6D %Jײqbp-Գ,WX ƘbVŒr!'twL=Ȑj bí…lex xV2on[`}]ҷf|V/|* 0 *$#밁mY<]'KE)EYZLgdJG֘l}Xپ㊨c@8`~[.Oblq[RuJ* hpaNPtTMa$fK*?.F] [*}-.Gh_]Q+M!1lAZ].voOraR4EO -KW;jQf>/ulZks\bU>Mlq!s?W;e\ᦚpd/bBCzlA-,q˃̙Wbdj0T *! -0*x`!aF  1X pu4cLiv#F9b-"pL8>.k@S3w`֢SX]4!u,oY'=K,{m}b1 }Wy8TJ5:!/ Vl{$8V_ -ej8qqcnDa-ebI1\dl,0>=N/bYW%`"c0oKcyufaү0#]ҷ݁HwQѭf"W۽RMTzXze2u++̙@qqdLߔiٮs;' $bk[&$:j&(\; ~o\4RR"o?JQR -V,1V`pC(ވ 8V,T4 @x+' mr,"W,XFD_ ;({ -5F1#cLi1#lFΛ4ۧݢ?ycqf"`l@yG5ǰF!`x-x*q77S$DK +` Le%2x>הq;H.#>qT]6O*Ż| V+ -̓Y -XtLasj!(n)XD.6^l\Q1v:$%*)\)hn[͈LsoeZlU,1q򸚦+"ZOlϞ3?(dEAnߵ:W0UX&Ztm?-V_3*ZXfx+ OqCDzrak[],~|*3S]RF.veSTعR7-~4.d!?tŇ& -XyXƒ/[BU l vrP .V*x}?7]໵X'qv]zr;,6gfa^& {g>x_з'Ɏa8fU_M ց&tmv8uʪD1s+3(@KvmKLbدaYsY.F4;c]T-&ɘ}P9slVj.D-]ڻ뽹?ں ܝ,|,bZvfsY0Rdo^#%bmc7;ݻO칧38}pv`GeU*5qӇFk?{b} ]Y־.vmZrZ.v{x0Qo+RYT@2Xw@0utܹdܯM|4djSxY}4n)>t.۟ktIeqrDžmg nN8˶O/gX+{\yw|T0N'W2=*g闉4|\iˠuuq*g֏mpedƙSc2pszWg`EsyO^7RrGc -QU'.&?8ak4}l TqUwF^3V"g0Xm5^[jb-(Ŝ[Ŋ]ř(eM#$qvbⅩcmYo -H*ic@;0hm uxꮄLٗ˚VNd\%iŸ<̀r DW(lHJ Sj g44p]fau\ k,MCAġ5~ZVYwk]DX6l0 N*)G,*\-mH6M@SY1ɌpU0;'l{cLicr7161 X9ĀM  -%,F4'O6i1|>ϙǞv Bpd"#y2P#p$&&[^lfsvCd-Rpbqwp. f & -Df#0XqRr 18k8Mv5%"]U˴qJ͎8Pne4 -|Xlu. 6ڦb6ȭ_>$LX8dVw1<[kb32kn&إf^fd:V1A8ݗT@~o -bšUE2:ۗo r]xb0c~Wlu[ -)T&R@ݽ.i)2lBVwA -jԗUs#N-պ];1Xr{A) [U a*{ڔD]Ѽ+Ej.fteB A?G}~~e,F;Z1QeǺ];[]n2yJczۊY{ں=]ͱ,cz4gLWbn \4vt̶&1^(ػ; -d#SF.U]_ƩFuf#jFt+wJ{zP9n=5i$uaöjSwG̶eެ 4'WO85/@v -u-O0euwC.úK[`U|C;b`0#@ixeqtkC]h{ݭ#{gCP*PAqTk1B5P·GUGk-k9r#[l~ģE -( m\^c%|'rKNwHǂ2ޮ/vVf>eѣTAZkk^]+K'ٙ 92"vwm™JQ˦%wZ]O "ZMgt2E"X -!q+yOw.buLMi v;wLwF+2 `G.|MTZFBp֕qctP}adS2BV*p&82^Q& 4K3YZIh+8iRbi2nU݊^ mmEYw+#5Yu9Kp)+TTE65+Iźx.,a)*28X'b8뮾nV̎OpX@\kqoc\kqq|?=Fii14ƞΛt٦4Ƙl{ZcO%coc{}q'f$kiJ>$%'\kk,k_5Ƹ\O#y{G~Ů75ƻ5q?c\k]?ϟ&q5ƿjF'Ȍiq?lf&1>_f\ N%Ɉ,maXdmc:1V :F8sWTc^92C8߱}v>94E8X UcMF9cF9b,'/8X'1Na3*^ qI!1AQqr"2a B3R`b0P#@psS4Cc°?W'd97Nx^6rW/KjV1TpwJ{ N%)a򣺣 O`_âO[1K7sѿY*j9(;Ԟy-0O\S-+[{--: -}J|\.TvROfSIG929VTT-4x"+7{SRvžf>Ts+}T;/1>]xԽHs~jRW[)y;3ܓ=/2,Mz"zՇ[qQ"=J|lK{s#ⵏbWZ]/ʜ'OE'2sv֩;'h!M͞+9mJ乿WUGhE~Ԋ\Ug͚)QMd(CʎRf<Њ0FWYj[N;ՉR6&PVd;D*Xl]hq^շéFVՕ*>ݐS_[Тݳ#%2WEKEXXhG$`9FKxVkv^hy5[ GTd#Å&I֊0CQ.v/s LxbE:ȌӸd>n3ԈΤ<,g/aC3Bvr>^_/3g IVHq /;B%1Svl)s1h2S#!Ŕ~#$1ì11)Cc'7{'wTv -ey*W)MmMTv)Z"~+֢(Y^n#sA=Y[.o[Z!?vտd=L YI|;_y_y ^["q[ODMŔ:;o{b/_ -۬_ w(+)zT7;'XJZYzm_\ -ܬ -7͇lkا܊Uٓ>2)Vq%rH>df-E'QE~CQORnQ4Q|=E)SP/rեpߏErRV㶽)ԶqCWc)ڭ>oU}Bvo뢧OrJ|pVCZF2(}Q#(eR5S(t*r|fzT;7)SKz.^r^h4''BqWE"VvY&VdЕX7¿ͅ^g6c?/21Q^X7wd8~$95}GgY[цZ۹Fw3GhٸD)-rn_ uF;$܉6XΊK"qܙ^vQv_GGo^Rډ]| %$j_xO}FbpވҖcV:V:)0Jk%<e5ELEn?3qddI;AGKdtCx(r ^fo#wk\E(*h(j?g*X--%7SGh\.TTdHȊ -QlN梽)kd͚)W_.(R?-)ZhvPbNڟ#oS0ow) o\'4[dehC2n_)f1׳%*/ -ܬNx ay?_b'ХV:BKW -ffbK0)-V*]ySQ.?LWbȩ?5zCʾ -IqDU(s$8iRQ;пͅ^\E giC#Hmr| -KS(*S{C2)%[1G⠗1ڸ)ru>"*r|z[̭cDx"Cb*$M%7-za;ebVQԴvk)2]Y-d0#8l"XR+j--&և OrFbZW,T"M*47v;kd[-z2+YI5S#mfvҭ|&/huܧDZ$$7Wy -ԇ1Ԏţ BKRyg٢i- -[EFWe3z2 -rG=z8ݵؼG=š9KPobt'a+-D)^L'zQBN>1_+)+h;=_'.bhG&Eks:Ǚ;.<"~R"?V6ôRkoۈb0˙ڒ/buepeGh}HʴRmG;EOu?lV.,dv -Z:U7#k((um)}<J?OIqEx -S-#J&GϨЫFZ+aR rȣyYOE:{?=LKyoE~tCZc9/G(حŝ\ -ƵB[吸OsEܫAn;wKᐩ.#ȬE.UįBT/qVFAL"kz0xwr-aO}ӼN'u dтSXN`sI7;Կ%| -KS)=uK^نLjҡW -[/yzHDkJRݰCgk;RޡL%%=1íe|/ҷڙS-ONzE:0=cH܎&c:qM0_1ElDҤ-$aMx٢vc;H:akcِr7zhPr͗lCl4թdsږ1='9RSۨ_8\K JWz{ݥ -+fE0kJY4(Zpcɯ.FaOv0rMV{+Kx٦ceצgv޶F;J~'/^$jQGz,d8^\f4թ4 %CCµQWcmY&=%CB]LW*WR^#E=g%-ڬN!Ky7-(,&?A)#Tm9S2XdQ9dC-U!Q'{^Hй悔ݑw<_D6PŧZ_1ӶV* n[r0o)'N׌uTaB^f( C;g)( o"Qތ-0vUW=t(iJ^=d$N;BK)/8Oq[Qy]QSGqtN_#_4Z̸{_jq?jCZ#QEn}GV/6řhyH_cRjZwVkYIF+'S۔9Jڌ-Gh)mȉ+sc~=eN.JZ˩G°+zI;7+Hc_(Mlv)8jWN~lQvW;ԗE8+'QRUfҊ$ގS_켈++9TRU;NHvmbO;j+el+)Sgfǘr&Z'JE5O;~+DvܪQ^g#xSÇnL{+a#D8+*s9 k!Im#,.Z;R/@R[;"3L [{" -Vvx&"Gj:;'t# -G7<0/8\ca/8x#{ëi9Knm+*} Bp -t\ڳBűL=fyn8IxDȽ(/EZHb B5~bh7Bh~ -n9|%|%*9mz#aQe5}ȼ^9C*YTI"o -Rm1_+H%imR,묷S~r~4RqvBVm1$J6aYGтJJ['M^,T!9U-zaӞ-–kS%NY;F_GjF[q^T*,-d^ُ1ft4y4Z+dJإs"1(>\Y*xN1k(ir̛ >*sYOc -/nGg8~̌M# -zsvDgug9= RIxt4}h/ `E3ұl5?Ii5PW㉴?i1K\4&w5sȌ\q vGƭJMfb{:xvd܊y/)?Jۨ=3_#}ؔ^VM2=t#F=ۺCd\)fG./BR<4^+Ec0ݦVزtҖIf7h_=IJZ#9,֊W^e/4r%vgt*gg 2 %.,R+\YO <+r2|)Џ]5ݾQC#?a?RQhd=8Sp{ -mg`:)68On:ŋaR޻G{'QkxNQY=W0IdkbUIˣ: ;vĜg󓃅a)NOYF54WkITS'+nwщ3W-Vxe_!-zp_28ixGmcuKZj告FwfxKF)k,.y-W6AV'm _es -ߧ=w5zirG[mOaV*2g~6t-9]ŎW16 <_G٢񍞜N<o{hik~1ϱŽyX8jqkӛFOMe%}S)'3Ϧg^gbvu GQVKMLvi :N6gFNeQM-/ KQhbl"iF٢~gMyL1rէ >c´p5W-E-9WS>`~"FZ|M#̕඘c9ѾD+SW<|u./ >?i1M\tZ{hx-f,r̦iJ¦]ZRʟ*p -D䝠M-iu)U'-j -WUj'QoD*ȣ*<$|ث&^|{,~8cdXxY -Oi/# V"ڙ)%V h&uh^.u>?Ə :*Rvrފ -081О-"fTbOiySGhTש;}=+8H;J#PDȩܧ}_DR!vwY)J3* R[bWOІ eX?™#蒎BP#*T]#'SQ:w75K<KJŪؔm!F_*&T)BFe"qĵϱy>V/Rm4zvbi7rէUcYg-\HӔseDKEN齤i>nV}E;g,6+K\ʜ'}UQҖY/9pcŭdV:YXbE=9YSԃ֣]֕VyPͅLNEZ벱x]Zq%^dC=Mܫʫ#:iX0]JW<4=u)zQDjeo TeNaFRɿٕ9YUշP[Mz~nV}O>b0ֳ!mi>(QB;ҕJȟR> VZ{URZHʊ -JP}vu1(+- JO5,밢M'ą4 *9\]E?ӧ+p [E< EdG}T 2"*'OqBQyU驪B+? FHm>}ʜ oJnԧʊ܌\_J+NL R;1Jv4d,*b;OpiiB;U&Wvu~w)rmNd-̚ifclM|?2Zv/y;+DI_#{r.Z!)Os={%Y֢*s:\qWs9+ݾcy_ -ԑhcU#zlQEB fT ^6%gcS#~Q5<&L)2hc e8ղ*^iP&뵒.N - -axn*z'E: ~b١ -vܣZ™BW2R/bhN![tWN*Nnգإ[$*z#NSXP+ נeN?a,v6[4 j-!:Yl&hFԉUZޟ)K{Xqӝo#"*DaKUŝ/=V%*Mk~+Ghx^EO㝊wh" ^\՝޻lkʕKs:y - fUZيPFs,uM\O{2]jk;9RK!v?5tyKEY k3(Z:-ba{20_J~*|V["TN9gQNXs#%-;>JyӲzia!Nֹ7X}Re֜'7_D5}71AsybO"Kj(C9.G|U}N2w55;BoT搒٢Bw-jKVB%M/>wZ9?,:'LQoj&ŝ8=rzh#{mIjµ?ab -U)j)ɾZ~7J%zoo#]K(t+rIl -[aq)Y_׊^U)#wԊu#/HODBPԊ4o4JꐝY -3Zծ5v܇RzY^bjnxxȥ^XٝHKjfZeE]9HJq4vWbxvZiu;et睋EY+}^y?GW;}Qw5|, ;ٶN_43ӖdqZ0)AZ>b*+qevS~oTv-en䍊TMlţ~^cRGh0&/~rTBK!Էiĥʎݎ9# -wJ\vbnv]"tW;w.,.݌8|=VQ2xWM`6U3Agh9j;?q_#I/[b&V Oq*EhNY|v~+r2Jkn hvQ'hVU^M6ys;Tk'^yV9 =*W>(SR~Z)q)eפʫ -dT>[̵?”wіbQڟQu6N{9YXS*čdUǕܑJ흅h휄x|*͟bpj(NK(1՞&S)(MXte?! -rGif,0Ed8k 7g215|%X88崍j)Єg):U eZ쩍xd(E E>b";ULRhU T^EQsÏ;Rۀ_%ŕEDVRxvyWIoEXճRyOxvCˢvY+"W'-QȊ^v]EjٙRRy"?qhT_}RKij;b*lIon)asb!Gk%'!ԌJOb1ZّK*1Iغէ/į%A)B~S}%;L+ޣìHSB(l,Ա^;`F9M,_"0TGz#KnxIG=E'-r8&+!QEgʨeZ*N~i;o<_*U-e&is} 7/K*w?ЇA-Xq̭OiUӣ|cOwIC/4s7z# -5Tjs~&;v+BʉRz9%E]xӻz+M)Mk;=HN;;A;l‡'[΅{-d]yaliYNyE)uYJ+d0Y{cu8J2`QC(r[GQH?!,=J6F)}}mT6}mdN+rK捈z禝eXPd4gr]%,6ݖ3)劣;ak wZ{o=hP2Ql/4tU^GgGm:Q׷q׾gn=΅n'ċ[/"QەQE-m_. r`[,v>z|^Zޭd*E9SsWgN2;G)pLmn%ES%,_ 3K)>2.ܖ)_6CnR5QdšW½zeiIqE>d*B_|ʤ ;hVoY y蕵GGOR'V{yVqBr܉Ҿ_գԏ IqEvG+dU%{Qҗ\US)I[T.,ܛPXoWE'y=FkaQmYHQ髊p!f*BY9fuN* +7ω(=LȝJHRE+[Zb^T_e.^)zSOT͚Y](Ӌ+=r)s%v3+Q{*#S&Fmj*oUӠ˝eDeLy<aە2_ :F7Q8Lx6bFQ7rz>QRJ.ţ,Q~1Eeb -Wċ6\ ldp D\v0bb tYydžhdz1KF V:BBV={mr'U't:e'fxk]ݕR}wJrm01Mm/fWR׋܍ZZ22޴Ok:xZ,(,bRvbįRWJQVXXeWeUSISB3w;VVs_Xa ".ֺ*_2#=䠡qo'6c% {EJ -$Qvn+A']<ƎМjxy[$ -4%Fm̫v_\޷!gWюn#hAbJlK&7VwuG\(u:h'|)m QŻD"hu\m;l6~N;W ѓzَ/ÿfȹFHOјUg9J6"vxK.,WZ(gE^Ne -үzIɬkR%RY=3FMdW)*j]^GDd /\_OV2w;FYv|Wh? {̼V⒎1꩷-lxP&BYeaU1 u#}ţ]zz7"*+pgig(r+%ͧrONQݑ6vBnjkqdS"gy)ΟCUz{Rɕlr8cvIK^"˴fQJ~(feU."(-E8ZF:/XW[n$ێYEww0wvȯХ=؏O> -!|v6AwF˩Vb'%O-:{8OR<_lK 6W\埑(ʊҎ2()U`=[OTE87vu;DjC'.;2XuؓkWQ̼"ZqOxW-8=9Eա+8%(G9h~ ,KqZo Bh5-Zlb_u)r/9[8'%#d+XdRF+bڊmEYI_N)[ֳOR E EfJlŁ[5!ҩ;?O~gUq;z#*t:еŵHMXUo/2ɤ}Q4}?Rњ|4k*ifJ{5UvXW^ٲUgz?:՘ÜlJMeNc<[e8;5k>*TrdT(:Sr1N[qXX\pÕ+#|ggQ <8gZXNi٥6yT)x9FRշLtSO,T\j^hi/w鐟g+aIjKGuqet}N1ʒx}?:!DA},_1)'Gc'MG dPwXrvKRCHR+!SkdJZ_Ua(TV0)KRW8/V~6Emz-X;7}'iyVeNbcEnQ RVKvYz% -zE9pnly3ElLZ(u(K8ث^ڴ1Äwuaqd؊3-掞t#üm\KiN/Zoԥʎ|*RfSVTܨ^8|)Fs bjٕY>ba;^Tr8_WJeB2X9G)V"&3K;7.k^ܣSP՘ik$S؊}&v8S -֖EHHS-eP|De+/͒%,K^H|0ɰ5y̾6/r،mvL݈}E.DTVK硒L!*Y)l>%.Tu4bKŸ޽?4M?&^]s)(\Xx"aVs9VޤecQ;D̫٪kEk{GgU/I-h6r85F߱[W)==cYNIB2RvM'y,'h{/-w?V.( =b2kM>b/\1NYlGw:M=-}idJ)xo^F:)PSZkԣʎ'cz\O/(R[> -)>bcU7lrк^Y\PsK"ux䓇*1ҰD)R4ʘlԧD%xb*eu_qͽOS'W8]a -,NSķe_twccoӍҲ(A-B dXJvW̏ 5'% -5 ޻gí;VLWڊ+zW)mkw**|Dvj{DlYdyZ6/R\(Xd|v{L'kvq_YRX|9Ĕ^O1T5=m _P?Cs~$z>?h#W_쳊ыf,Z;Kĵ2ud~s}O&ſ_B_y1+y2Vrrgv^uN7ǬrY^giqiM&^.{{&b_K)8|RHI>!F3[^ט+4]SXQ'~^?C }[} ^uU*weTOq;en=JU:sÖSmew9Uvi)Z؃wFBF$Fiٮ:qMfxkS/&i\Um0y(!d'oH,SZ{:W)G'%o왲ziY -Qrz,aınF(צIf)E/в{FF<058B & 霣qOn! -RBf:IP#|7x=H)݌rYgE*(J{J9c; Sn 1+j;%YNOlVUK'=RM'c\"^}߷fC:75]C;hJtaGuW^8qgG#[wn^!2;Z&##Sj1IDdw2y3|̭ y#*ʣ#*zRqClekorњoMNTvCQArI-)p*Ԯ2!r)WR{dl'^1I4{oўv,:^'""IQ^!EN>gs;=/MnVK2ՋN;+ Vڬ(-M_)%(Gq[̴ޤxtV;8M-ZqM V.TC&)SMJ7y,}29xjnE&*C/S>y&j+pD9\o{e^JT"6-F9K4NNԧ,SڴTcYؕ#g9J4KԫQGX?sí; Ivfmf<9VrRRÜȴ3Ց -ܧL{5/-'ⷦF1PTˏ!GM[/Dv;i5xc>qjM$*]B{b*! -:XsL ;Ztu -ܤ)WNn1Ju~:Zάlyȩ%\s/юj+sh\X_ĥeNr.?W(#^؍EdnM76R;#ekП9Cr"F61̈uWO/dehɻg9'8H# |;شRzʔ7/4u/R|H";垗%b*)}#J۫B,5EjD{<`[9\^9<!>([*%NS8ܞ7e=:{2|$Vק(4O{$j'U%8򱥭fOYcrKc)ׁ ҝ\هm;K޿rQe7/(-4-Vl>™B4e^>iQ_A_fZ*Ekqd5(~Q|yIŴbМNqZj#m+Y.b̿Q%Nim)R>s21[ -❤أݲu "jEd=KELhqQMoQRV:rQzIXsj1'BR뀒ԴJ̪; -"uod-q{͢Id7Y -R7/$I6o^KJٖ>?'(db$wFMjJZz$'ļ)j%xf,px.M -+Rey`NTNFI|B q=5[2J2DߩR|Qq۰j;YqY=u'EʹͳosA/VeݷqF97{ -c3VI^;ߔb rq$עª+<߱uz0s fQІ}5-:vvZ0eaU^<oAxTBR~$dqN$*&*V;m+p~!IXiiB_ӆ>gwԞJtޯQӟ$'fS12.Z;u;QYNj(j,o*^9_uFߡYzH:su -=Q[#UCm!B:C{G-'.(wn*/vSNѾ+pyR}&Յ5vFqf%}gv^rx)։ZJm5!'{[!RKp ^x -V| q0?4~ -Qb)[*q#5ܣ (浔lZ8k2(: -~/[9t#Őq3rsu4}U 04aS%QdԦg_SX7uȊWrr~{Zea-mITʼnGS~_ۭpqZ3jv3!S"JYZZ\d'aRRIx".%8Yk1sGCܲ(0X*me> | oBXTN;q!|YYsַuiޱdwƶ܉CRrhG"Zb#Ժrr;=MEK%SȔKi;HW -1eb|t'-N܇=} zn⮉){?M7۰)МYKE("2ٱS~'mxRlF_ԫʽ -;:E7F?tO`Iw(m$E!m*z܄JdK2ޤY"*a6d[E$ě~Yjz9UV#*sEģ)=H0B?~=D백XIjKNR|tƿCeFCIr0Qs&SBtlDS،6I?YO.&}i*T؏s)맯H_TeNy GTO\T*0٬P[5tSdxq#E_ܗAz'ԏ1KՓGjɸٔtG,b4ֶ%ha^R܎>>,)QEu2=G{-S*qmm,b/ - u*E?[,NޑQq&St'X)GnĹLaw:SZ%x~M2˘c_t'XW8XŋfjԊrKVIJJ{WԳ&֬:~D0kQ& Q_= LųY&1)<;2٨sK!Zb(`-wZ~ܫuArj&j)? 77 -'Iz«(1F1w>*p%KRJtE$)iY9J6FQO;| +p31bm5s`7ODκxX{&O'1DnQA.u,5MI.#VDǴq_y ▉@^uqtn<:#$Z;>-s-cE aњfQ-c(%tќVS<1HrpVk (Oy_[3yij#O4?y\GyyX6v+d8of -{IDj'R(y2Q?q -<Rv`2} B,YdC"Icf$SE)BrQI~5;lD/NkMRNԮU\>x-#Su e}V;JZKП],XUTKШ)>ac+p>%NR}:gg$ -޿܊R E>1*e^[}Q5Yc?Bi -"xVa”^CC%~yJH?T"RY -Dc-c>S*|J|.o2[S%utn+.?屗Z}Ļ;IfRa[kvVt';"qSJ|Jqvby~s(pweOS3-:Dȭ?/o+Aq!Q"REE>xkLʜЄ=q>O;H%'d`Oi>8cK)yYQz!/D[Q_ -& v/RǓ'fId#ħf.B /Dy| hhԊl).(R*rFKfTZGʽ -]E-6S1J?yK)}B{bX٢q[QQZⷙ_Q1f<_l|RJ3Z?PD*}ŒQYw7db"Ubs<;x%5sE - R| -RDWX6 t]YQ׾d*_$J;qū,K=I#$I##iM/Oo[f$<߰1IŢ،woزgV<2OFR_ڜV}(ķ -iht&IY8.ByoXHi;O*wy)f'w(־YmJOa)7m?4aZ^LZV(CR#7n#ymC,\Ml#+E9>+Kxވ۰K#-Q[Iޢ&KJ+3wHzي&*Qi^4{?0#z4U&73R/^T-0FSq!D4Ռ~9'du8 C{OQÙg鳑tKKTYcQp'-؜o - -{˙QG{D-lֽ zI ⶡN=LT'- kRDCP#aKudr)Cˬs6LR mS V+m-w#'r\$.:aĎ+`\JG_1.3[x.a·W!*G 3|HDOCK<1COy&6ه֥ԥʅm'VG"Q,YQ)Kr(֞héD #N;F\uҭFاo=Z'¼z.$Ao.u*G?\⥿1ITO$NkQjSyO*.HGY.%.eTq":eF(1DtZK!$:K[#ħ>1ihENVZ& D[uy\ -# QhR&xYvgO̫Чԏ}Hοƈs{oE_EB[LMj⓻!(y"~ [*z-$q)K%NR\>0BK1K| -Q'_xHˢ/ԡ9Is`G?6adX(;I_BpۥDGwNEg >%z"["&>cTz݉q-2')hie*l˨%QF~5ufyq$_4Z%/ZJ+k#Qei.Aq$ћSpV*t!8G'f9=Z>]IP2,_+&8K}rKIz?<.Q{%Џ>%^VTZ:g\JIS5A_"]Hh1Ȩ֫S8=ODO D=;tҠ4O;F>:[*t)*rG>r.S"}Hkf-v/+tBк[FQ6ݗV+mmlpXcS_0MŮaMj2I![1;jxScѼ.b¯Z:E>,)>>=QGxa$z/i\Q"<9Jܬ|EJZu. ՈEw*}Z)KU}N#+gr)%R%ćQx"hp)R";Bz>I_6S)M,Eb)S Nϋj\$&hs3?m2dy\ -WbU(ەd("q QBY1IjbY-ҎnVV^*ljۙ G-['V/k}jjceQ/NqzB - -Rr{ s-k3_*696`[$S(d"F\$0ŵSSY,=p݄R6ݢPz5+zEmO{K;El*;|8|^ّĬcwF2zQ'U;ml/YQW#r+5S(EXz Ut'W}bԇWF)C1$/%^Tkdf~sVzQӗ/_-RJ9<-٢9OBhZ,[JN%ݽzUhyrDy;^R'M;\&6k-]ik+u JTJz)eGMxu$Ԟ}OMjt<ȃ7Da'7vmH{BWCdʊSEVdRw RJ;6lI+Y J gk nTt1d0)=|HRjr#?)O%s}Y̍IYcEG;o'(J؆)g}į:gͼIj#v{#ȭ_>F=[ 'ZwJ7vޤzS(wpdZiJl**.ɊQwX(?Ȏʼ )`;$z$%/rd:EVoR'ڪm򝮔JIѩyq:W%YVvN)O&.Og]^?WڪzJd{=?Y -kb(׷ kQW,b*sQp[JyPCו«@R5lĩ/{IK-)Fk4ѕn(Ֆ-VQׯU5iP^b4vaV2('$e/bղ8s4wR`סW|]Е~cn.C =dÄNNTg{骷ܿݑI_$U*SRMzj4_8~燰ϫrTeYb-df/c;QM*ZT\B\s+Q.n<9ʇitgUJXf0Fڦ/zpԅ1VZh/B#Ծ.&q0)/CMb[t4uF wEaqb**Cj#"?xz?Ԧħ|4F :8ݧD!Oh 販O$)GS)w1T&*Kc#PvxJ}*5/!ҫ 5Q(wi [c]aݴXWeN21kн9_K- -z]jhIڕ7m/FGUFLEY}ȝzwaU=IlKYgmsksÕALNtjqIiCa_w!xej J>5w -Nj7Eov_yآ):GˮdQ_fo| b&vY"q\irg,TOf,8J2Yu;U/RS4e -+tI7/{)^I,'}%4Uov\KZyoe(vĪveW#foƵz{'Eys$_5o,;i}הS55Xe;;W+jgGitNKLQZ8v؍ -;[YݮFax0 MtT!ӓv{thj$1T|QX6gBGE▴xrWh?Ќ"iUW2I#:GSX7l0-ޘUUqURbuPwO v̿sN4hw5̂k5̕s!~bcO#XK A8z}Kwa9e=-*vDr5 -J)}5Ɣ~r$y.yx"#"Tu -P_EnVJ-{V7+ZFK<1Vߊ:_3':VR*4JЦ1GW -UmC|~F &}ƒųQWV3^}eHĴ56a+t.T}Kث -^VUq׈޶7qmPQ^cWx1ožs'P*SG,<V9j 1%dB[%="|bk^QWi/A~Ekd`QB̜b)9j29eՏ'擹^N1vm)qw{^}IFoGQ=*# ٨-7U7Ɯo1(gX#k"S|9I)xdcGHpv( wÙtf}Q#)o#JZ' O%iHX#5_u*xߧC%Щ~0㐢zqSZ\()SWy}:*Ì{1+y<;Ld_Fu<#&vrMz0[2njkO;}bӷĔ`9n/o~T޽i)+]3)v3}ü%$@_ܜܷ byw#JEQKeHu?hB|MzO -IlU*t)r?y+X裡]mu[jvbO -vCOu)./GUu]L1a x/ -QS -YSHG#tߕB)%颧 -vki;hnvN򢵅V̌%XQ[?BwY~pExb>?xIޜRvE5|֜.YRZ^O#'(_7*[LJj%cޘɟ+2wZV8XuwJ6iw $?b=ػG''嶙awR~1kz!|,qڊ_L|2Ȍw-S;r{7]1>a9ŸV7w{boAIjԏ 7WҮݻ"ј=7e^s}qZ# -~]c -zVU.==UiTQSqQ%x8 lKJ;tӶ9ze)Oh-QJ٘ir'_Pjb }5 uib)`WZV%{2Y쵙Z*^lҧ-ڋ4a)JzUKx"m-[l9XQeB=)Z1Z%-&\(++Ʀ.RۦP[EͼM´<:>$xa䣛xqE+-.fxoI]~#&⮴z8#ӍxEhW-lQI##<2LXkzc/)X/]aNR&7k - ] O|F:)p:^VOʾS)(&ŕziW|m=W*C ;G)̇ 6eZ.T}qSb ()pzNVMz"ֻ#U]ߘxhqڬ_R(E^VUJOaR^ˉosQQԈ/R #cby|z1O㽢v9|>hi$NzD8ĝXLT?Bxfe4Ue^e*m8Q7o`b[Kt+mbkR~ׇ1OJoSGu -94$ZtoIG+,+Čդ棖DU^{ܬN+h׷q9C[ WQlTܠB1<^gCKZ/g~_R漇f٢<8Q>28뢧\-O -{J&oƶXj|I:Y -kS_ -Vͽ>r]62\> A-ezQ?lG G z6/ B4z~ Rwo#ooj|%{SdJG;zGG{O<$ױJWd);Dn/OQZK[d&qRrы༵1Yx|Fjbfy -E<1HMh4 -"^MZى78bܶ9Ry>i|Eg})GYL'"i^-e-z?T`brȔiEӿJ]=-)j"鼌(Gf8oŏۡ-%mTF*iv蔷#q)ƚzE;$/K{H'{-0Q1S)锧=tCt?AEl8r.,ٹZ0a^JWwb,Eh{fxg%)z#_,g^alQɊ20u3Ú%RZ^,igOdL,ԿFcy -kSk;o;B[։M> -qN^gXucFŧRYp$eZ--mL7TahVy[)e#cwyݙJIjZ/b1èriu^fpchi,G?9¬Z+;{>aCHS6kn,hqzLql,] -|]/I>.:hD8HqDs-H:x"BQ(l#DtLħEO1O%| -IqKE1C9EC6Np!E2Chq'ܑ hDy:ap!4L\ "GJ П]J}=R -88Je^4t**)eOrq DeN%>*}E^y|1.WKkE1CyE^Q%ćtS!Ip*u$G]=S"z R}R -8!hS*!W*)E<q D| -J|4TQb*!ė|J -IqOE>STd92:*}Dyp!KC.N뢗O}\BdH 'M%ė|HGB#'ЏS'GRӢ -xxS'ħUOhChR=G.QS#SD8O>~#㢘}H(9Y$S$.4S)Ohq%B9?OREDOM.R*W*^9\1>+b GDGEN8KhR/h}M/}\L\HGЗ| q%uCG>S%GR$@TR룡[WOZ(>yJ|NCPZ)p*sVJWb*!ğ\I"!8yY}W!ğ\DSS)yNN:鞊}HDL\J|#K>O:|'ܗ8Iu.b%2V2B] -WKE܏)OCC"<\ -̥ʴT|J}sQ%N -下L\Hp!̊(]~rJ qLE2.ݣt'ꊄz^)u"pK:O.#Oܖ!ԟOs\E>]2$s- -e^= - - -+xZ(>!؇R)p*sVWĦQ%NT+\H@2(*tUq*p%E> R'y_}Z)O.>t.OG)'R]2%2%2E܏p"I \ -.UOy>%N -BC$OWr+ K!ST%E> D -Db!K* /D8Υ.8\ d>N$8"_rz:zR+%DOOE. GL -en= - )u2G!\4KC2=4RTe.U+)u)WxC$8K* >()*HOy_R뢛G!q)}>8h\Y>TC!ܞ|m#ŕyOQ>'P}PE. C)#hS+t)uиp)-~r< -|ECTGp*s2._Iq)^*q!U@|Q+=%Ĩ=")172G]HE]J]=p| %ďSK>#>C6ʼxD9GGK*|qZ([Knn.Ch})#ˡHu*颟)S;GQUS[DxC#U@|HhФT:Licn*[ARD,K\ q&O.N$z飡:h7ʤxD(pKTSC\[K~n.ChS.]JHT .~%.Hq*Qs"qDq)}>^tVE.B)DS;0TO}#)p!p%ę>$8\ qZ:$to!ԩ܏}(բ|E)p*SC\ -= _WGЇ2r< -|H7TGE.TTS\ĥԏ+t%ĨUdC(!ħ8#SUPĤS*pc/aP]:{ԏBJ\p# q&O%T."\VI4gfC*ϥO{ćS!̴vrVR\tt++t(Vϻ/r -|EˡHu*t#**s2<4v%~%$EzW.%BqD8DxST.y|*t)u* pLyp&T!E)usW.8GB\JTGKGMJqgҊVP}P\=SUGL2@]t.~zs->".?NtR*q#Evv%.)*T*2 CSCP\V -hG#ĢH8/%C=R"<䟡W?B< -|颡>fOSK$}:?ϼCP}( hQ}Q}SH2)Z;9K*.~| -|Gg\=| -|Hԩ؆\NfGR"RJ!̈p!̅ā>GʴTRU!̴G%Sb| :D9p*)2:hO&TGKt#\^8ENԡdSCh. Чp++}%BE܇<%m)*颗)SZ+"QGĪUdCO8O:)r:2OhKQ T࿻C}uGGsTṘEB|Y"3!УʉqZ)ΚST!QSu(}>(>)*E>9R -lH\ - -ICZ;?Or -|ytKC*颗)Sᢳ;GQFU* -|\ -|Ht!SZ*t)peRGGDT࿻C>_R]'ĥʎhK23(ET>+B#?>N8ENԣ褖墟(2D\ -_CЇ2ٸS.T#E.R3)Q"R.%R!̈p)#S@}$y|EN>RDxPA:vĩ{}tQ}Q8p)!P3&Te(ȇh\x2G}}ʄ8E^ԣs"eK*>:#ЯСD9CO.J}JK9Kh}gh^)u*.%R2ȃŸ;ebo´TĬSj7'u\]hRJl,rENݩ*r\QGO̿z!OSK ̇ER\JNfQGйHeSyOS,Ob hQ}P<^$9KeRVSp+WPKDb-!_" hRyXԇFk;39;%DYcj:{=_u*_s(K((Z!;Չ8wj"MOFS%w{xrOM܅$Q Ρܘ]w>s;Cq(o# y*r؍lIlugі:l0qGf)Zb8-+ϲihx| ~--µ>ĥ+%QITҔro|ݴ[ #<`n]V/(a}O"tj&}BZ,4m|jsIEZldw_Sކ>ٟk -HŎca -|*'UVF.+kݧx iFo20^]HSzBbJz]*^aөDaOŎ[^Ū#4؝lk&Ȥlvb^VCqҩaڗ2~-*p%^VTbOEفO=,lj,FM~|EvRyo -KZC -o²#,Y!QjЏFU}E -Hmjqj~Y%q4&`JFKi*t#'ch1K 'Z_rmʿ}*)E;2}u(>%'厈_|J/͑͞aBܶr)A+jDy\ȇhsdcآ}ЫSW!Jdc[a[’v-9d+ny;'<ћ3Z3vӉfNO'\1MZK¼R2Cq9X:{(  -4Mz ҡO[5刢yI,ݯ$D{/b+%RVc)_3QMWq[%垭4nËJ{}މzBMp*^yQ^ף-9<b]+dOS~U%厭//PQKQJQ{Lw^fJOb*Ֆ܇Q5fASE^)Rcy\N[ђRvbc™G2>-KډBQϡQ_]{%;+8.)j#L5Z[(tK -VD,֡<>>O܂;5I(Ya+O1m,YI\B=LM 9گռO!SߧQ4d5*U-1Ni8VeRN(^1$ThX-搤ƅhpUd=%vWe'-qGz9W -^mbZJ2` LtyXLđgY~Y)<%UZiu<.^ډhq{Fv_yzS_zQY:}PrJrWwC䔦$fdz%A;/JImvRhQj#L- FZm%NzÊDdCltgxucseB.M;E^$i1FK)OII%Q -G -SOZ3Gyrnfo)bGBբ8"RrN6b:o0M7J/"o~_2Kc*r|J]H-a:~E.1%'*]>bT.%/D O"Imqm^ҤJt1[c—IkcL?6$FnҟSV+[(_;܂ƌ1R}OA[̳%yB1w -xUĿkRo7™EJR=K=fuMNVM%Y#$ -8B5YJڶ"ʫø+lm#Qх_\MEVw0vTCx%rZɔrZYuWnNU -kև9%ojKnh0e -j\jn+}^HQ(+~r#%͢S[nB/Zi+^}^VKEI~f`N2xQ}{$Ue?Z,֌1MPlM{oq;-K yd$*+l_O[Y?J?F7?̕9+ - 'fSew^MN;,XRԵzh|Zߊ')*^^j/pj{Y"#%b+}^jZ ޻i -\ŕzS#b|О'bC0C[.K+tYgvqz+B<(ro.'ʝ Z㼧Ċ]=Άk$d.R -y+pZ0o2QDЃ(Cz̩OEM MkF~eh'ݢYegRFa}Knhoxc.klJ-\lRZ;jJawk0Lx'`kdע[J׼)O4 $e,:7wtI[NN# A/3W@P:G!Ԅ핍v_DTWR;Sdx.}%v*)u0?}̽OF`)ubZbϡ["6z_{>xԿ׌+ѝ๘u20 dzu>x0B`Qme;;F[5dMɼ?_~ ((rObG#{YN.E-vY6[cBíu_+~oTAP)r*;J.b:riD!˯#K;~~^RdcZ_{2~*Ci٦IX_5rv쉯A-?,tSIlйJ;<}BzHl%ۺx]EQNS/+b^VOM*(I[뢧)(_;܄﨩ԏ1Kh9O jɿS'qM-D1kÙ5btN-셶T>mx?}2Bׇ16#FE}H?^RJ6;u?2Pﰭ̊\\? Ud"yDdcyIoGq<[H4ͅ{Rt~dMcDygKgNֽE_1 _+U{S%S\*~_)YV/dN 7WE?#vn*o{؟B!vnX|yY.mu#}GvF"RO\r(3W4h=0ÿjN)%^VT^UNYYTl޲Yf`q{nUS/a>zVJY ȩR<.#RE^FO܈F.TTޣtN;c|J|bT%͢Lqz%IܩubPSG"X_yR+lGQ(޼amBNJ!DkfrcqJ0EkyZeii-E*bedgX-%/yI[Ռ7!;1,xr]AnEFXilK{L+CZl,>?ؤURvGRu^Rżޘmk6,6!TbXeY/"1o9jhIr.:bEQWg،5cg^%QY=|'y|cW#%8j%CKQ)cx[B(AmF,^!b{lEhP_%-Sŗ]rgyPwoAZ$3B;z z#82OН _{?dS[E ,98hܪ#%ģŋn:-cHt+Yb搛yC͆d;̕ʝ=u,VhT映oVRYFyUu+yV]/(V#ԯmMHö0춈j9=J.PI)e|:uj W( e Ы?BM>^j}F)nJ:i:.RW'Ж)W)p^hm*2|HQBOjF$Inؓ'ħЩ >i%}ƿͅN:{k%F? -}]Jrob1NʷyJ|B-DnYSԇ^[­kkdiG#Hxu8,㨌?R?̿T%SLBG7X[xU'!E^e.]4 'KEzxR)>bO]=ʼJ==Fqi9JI&IS%E?ԇ\Q jOdY:b!h)ܵi-ճ+>!)Ga[Ľ -W^bw&FbH"))KR8;)m/N8zD]p;T׫&IRzS_z}n*+Z#8̴U -)Y~KSLQG|tycȏ"­|{ rvv%)mZ;:N/Uʎ?'|ZvI{u -KRA`fgyQ_+n*O*1+T+}'Z*Bb{eW.2KЩԧR;%rIz*!8,aZSTen89[\M^&9a#V}fv$F)p;W-MD9\|CVd";$ =eU1Z"2EHfbÞ4:=D*;Gzhoq7h}nV-tUd}RʹF/?ƊУK|˧?sObGim.(ԩʽpMyYSbTE>Kq(Bs\܊v(BVxr9zdR'k~3->>V\ --G[HWSvB^LU\m̮֯vU|4/ ɢk|Z*nJIe8Y~c-gy.QO6O|_?c F99z21ܬUx%ڌO~5MДS~"*J̚ޙW^ -͒rh[Q+Sy &?N>dPbX 7&g)_ӽ j[HB[TXx8* qYkuP$af =1mv_KCkbV0܅]Sh{X/{k^T7u&>gzePo<s#i9ԏYMt7xbvfS_iK h~>?#M~?6T+>Pg~~~t}c~3\Q9Oe%Hƶyc?OGDyOd+!1 AQaq0@P`?!Xi5VޤފMI$7F"k$ri%$ؚK$I$fK$I$a4c7hS=KHčNLbIDCtc7T&sq6$j9 c$DzoEJT6I"'D"i4"cdI$&I$I$KEcLzLlluqFKVIבߤFuII-TZiacN4 -7m+ґIֵȍ#&c0N% 4[NMf:檋[$n1\S 3J5(v؉՝]6H[V):.mY7CIcJ1I0*\RUNj&k7^$ޒMjizƍEMUfK,1Q#/EGҽ55jڗޣbb5:M{jy HњԶ'EjwE:#n TzƍzXowKаYiFȕHbTA蚱4oSqՌsG\zLzKa=sK詽/PV):1*o[! -T-UVn֍*-%64O$:$K -[R:R"鉣/IM3dNNtD:72OxqET- -)$6&ԑ2)HΆɢѰBF1ڌ׮uuI&7$dX;\mhDXBB$*E*`DqmDojoKVFFͩ4ԩ:dbdc(=P76Rt-Oz*"}UMǥVN؜V $괌NCZ $)7\C6ҍlb*1UoZ &M$^uoEꥮ+tdz$ܑVF:E:_њA"4uz1OqP֔ϺstbXJ:N"nL><&,I3Wм=#Ь o7t^ B"]AR5v&說MDR:vM7Ԩ訬::$\·Lъz:HhGSNcz2 -hfx"IR /e~ %:[,]#nX?LE}f| 'BD k4n{ʮzDɅl(^瑥m CI4KB ZQbڝZ4-PF[NdBf9 @~D62L\]w?qk[C~|`r6'Ɛ~.D3 q/? {σoKPh{WQMkhS#н'ER dz"1"2i! r7z$y4Q¥&~#9 fXE sVDŽc:Sd$XtD9LO6%/Xߘ3zJ}IZ`~ $_T3hǡTZ֩ޗhfY2̳"ҷÂWe˛'l# quE3M#1J8)B2@ZIhق;{($/bN}Pȓ6 E +!큮4̲0N,$cK8b3Rq\s R#VΘƆߤbh7I4=SIPCtFѶ9w$`MdIv%u!Q*+Q:&$2q\-/dXH{iAh?U+4EђIDiIͨ:ksc!!FYamBhqhUH)hB\$I$)# -$ɈgW0ፕ^☌^a7<*ԃC}R!Ҹ~n??ʫ&:9{hk$}61`UCcлVi8d3Ln B*Ns,ͅBM=Fi4[^I4zǥ1 X7tB# ;߳'^獐nTdN-C`ӂΩ&3EۖxlLD,r`A!w"t-#qTGq1YZ;EB$6?2zg}{OUƼɗU_Gka%_/K3zej$Fgp}&^7$~t~ 4<:IQdk;W$R#֚N^^Xv<&سqа@߱$sEKѝw#A-ݣUCWC~14v>v頄6]9ҏ@ן1'Q"$5$C,ϲM?gF6F^o_cM}E*=-_AwO1Pz? -7 fޓmKuomTg5BX5az\Q^BVt:9l<-O ;F'TcvfD(# j--9hE#˱#๡sJE$9d^&#˙NQ|߻7#v)OFY[ UFr~^Kyf˞ZKia3 HY}2]9wo\")I'Næg:]#̝MF12=ߏOO?Dy?m0ycs}l=w1U$0@j/i~X̓~<ɸ;e6;{ y̟ wm{$vO0]'"2_%<}w&Ks/3O߂e| Nb_fuCFBSQn=zmW*G$hެtc#&k"0:8425oW:\X~yrwt2M~PT[UmK®x%BԙrЈM}Oy^SP۔Q -n av6Ja̾EV3Aф;< u;iBF}Lݸv<ʫ©1oXY0딤96PRN#$} ϩю tc}g묉D2 b:!aJz !vV{ճXdNra򡉷 ~:MlibD'7,DI$"Rw&j8ĉiDHZ'Z7_TI61XhA-)VN-z[9tؾ:$nK&d&-LTTv*Cv&¦$z,pN'${Z:&-}V][/U=7$M&ȎdoO`t:j!J!7s"刔ܹH[E(ur! =Kc \5|dPG)d(f:JtkFޝWj*1hcqNSϤNևvHc{JpD*<87 -z |?D.oJ9ܑ~SU_"{)6c-^sҢl"QooV7o0}H 3[EFG4ᨤ4%qhdCia*b-::i}NuG,F!VPƁr;9uZRf?P׺J92OemɭV!3?oBr']"yB{R730#LG<*ΉSnF)XcfЕTOrh! nQ"lD;C:텡wqR -u%!<:mt|"fea>?{)~K@Yռ^%-=寀b,/rrqŽ#cc$Nޓoz ci НO& Q!-OCV .Wa ԺՉSjG(!'ymOp\ -H%~NN1ӥ[\#$TJ. n-THZfӱyMm1Hu4/AR'L [b찾P#^ߖح(γ⩛B,þbYu 9rfd!IWYыr_6eY!UfY߰Y;w$ONq_|6,l_gp~Z#x<H7QiٱOMeߋjs?3ߑJeM?[{ ,O謜6S퉱gČ VE|VgȥNpCgxɢ&Epl$mus7opűyx$)x\M%YbdiDu]LRG"Аl-|8a(.C>B6BIv`љ %|Xg~iʿyM2F؏1gTCOq/o.ǁIQT.B[6/4/pMfoqH`B\R]]S#a9iN7< ټV;ԠS;U]#\ܾ.`5,Iʻ$߸e2|lKG5E(#$ݎGD|k9q]"0(h2s1 #MJ!ʒ[*2tژcFձiڐoBDhHK -D\C" GwN#Fb2tdd!hXG#ئ0W9/";شY8fSP`qq{#H2L]B$2eD Ao&\5v-\\P0D-Ču$,ali' Ȓb(HK:J۾ -D.G$"ЩzmETZuqhz:R(Ȭ hTHJb R%۴B .XhB!"%1q0Vb$I3j2G'a2hGԹԛNU#smnz'UԴĉ71'?&C)BRgd0{&X65H.ǃw ]ĝt Kִ@r[5RtošG" hڑH0%r%Tn&lA1HD!.[Jt?RG|0K)2۰GMgya }!M<}M~avɁ vaǬN_271a˳g l[e䜍K I3Y2!zRIbMĽ[0=,,4VEU HJbŮ4*l!CN~ΧrGavZ"ġRTPڌL1irȂ 彯?.ጄdJJ+o`Vym7EEA<ԓuJ@Ђ4EU:n*eX/[hUtnF[,MFa~ڢDD•\.ԯK!"Ni¢>d$ɔuFw46o;޾FofH^3lӃSm -Cw7U1z.NY$ME _DQsYMA1 Iv~D-PÝ ,̧M -:R _#" }$5N<Ø{Wt",{mYk/=E0eA"7"zAR4&!U鉬WqVi$lIъ5aUz$AqdU) -la!`)D`]Fe_ZPѾ&'D7IM$!i4I4I5UY-*:V})ރcI$Q%ŵI$YI$I$k}2MfV$l"i$D7I$EQ=oZ"#Dѽzl1XI&b{Sz7ULw2cFoQI&K$hr$nBvmi$ѲnHNj9&Iҭv$::gEztN4nH4ލF؉$x7IIچ@^ o~ 'Lѽ Ck՝2z"C&D-+ׂ+:'DII:\:ph݌=ll ##jU7)?)D,C-&!-/aV?3Y&.Gޫj:-+CB -K3މ$WD)21+,~%" IBpEp!c/*1Xдw̪'$H`ͽ auGD$]mh%TJ?RhRR1D3}%EX"XпLjn=KTѺI$HmM{QA 6m1Lnb#fo>$i .薔g䝈q|b\x '[cD5WaUQ!UzDCgdtnK҆HőTp WF;@c6Q pR1-l:k{ɒV`j5vQΟ{|ok j ßbqaSO ƿo -kSzhK՝ daCjofQez -HF4L6,hН; j[ȏA$:\cF -fOD&p aٻ6]}?p?Ȅ_KKqB6-r+VHN%Iu_lG7i1 Be>G^'Rf-[O,94 G?G]o!<,dc| 6MI $R)"uY ؽGLmQWvŽѓh!4Ȍ#DAWJҊW2P,Ы2tv6<ʰ쓟5إ3k|>d2'.chBV6H۸\'fg NBh .-e;&Zj LQ07acC5@\Qb\APCG2&Bř%hM]*.FyG -劂`PIdܳɌ"F&I:ѽ&DzMU64DQ-*dEqzUtmFAJi=AQ<ۈ%jV$T\.]Bh@Ԧń\mܷO!)$$}df»0\?Z9t77Ez?ƅ:LhAFbuv0`U ldM5H&K["I$wȓݎ vlO$gXyHK-:FUV c}.6b= &6I#ؗ:,97۱kk{ar1t{Q}nH/i -{lcۨ )\!y5z=iC7CiZWSjǬ(#adKtL_)'bڲ2+ȜCJPu[x]k?,c5f[}"d;Q)X$O8f4%AcFC*uuo4NNHଋӚN국4oMī#[[hFB&Q-Eu+[o ifq\<-^VJVa'Xs -:%F:M$Hx$TɪtH:N$rH(\h2!d -W>e 0W,wxO#p"HNdLC$q6!N8)wd.!Epϴ4ŕn(9܉cg\[,E=J",mqIUizkȪX}Ek}E}GF鸅F/e|+vE˕ gzذtSL.''%NH{!4*؂{” \묛OCԝH0 3acVޓ)T{ ЏE-IQ`ؒtdkНJɎ!Ҋ K ;ҍmJ8yDRSKvԫ5.:j~ϣOF4&%bA -J\=5L^EďVĉVũm}U>D6NҞZEE6BI)$MH"FZ& ͟BXdHBi[y4%.h$DQѻ /qM$lQT+CI>^dz\xKiފTEH$,'V<"@vۉEal͊U kr6`a+H'%, vE2ԑ5$ѩOK~؊*/Xޮ"ܬĹb91/F(nB R_ZlIW8n-n|!6jfkLT$]u|/&|1RQA0PuhVJ#I)m"sbQļNm]z LZ6Viv'[4H)jEe16MII@ +bS2J9Oz`_q-BeI7TEd2ԓs/OQVv_cVD*нx SwI1"@m]B.I ^%۩q xąB~XJK5_Fk:gR#T걝Nҫ4!=3VC- v#-ȩ QLҡIҬy{Ǽ?jܥt'w9 Sd!xsaIly`H24|38?wBF@ǼIw!vR(Ijt}D~~#Fxk(Gkg㙹$w ynxvLTi"])5/}v,ZMɦ,lM/m{kY^ǭ,XZW申DZ;B&Sa/pǏa챬s\0%؊L΢Q<µEGq<_cnX=919EN'XX'lq[1K?OCuGfnLP{Cӽ7$̋C^dUB"{ W؎Y*H%jԪǙz1iz#~һ XF+yjnx]14W8$ND({d,_@@ĭtR>Pol& C98)Fw3y%{!. v-T24H|E3B{VRB% -蔑|Խq"#bR{\/fF} -CAK,n$n.39 BʗkINߡ:.twKHڏJb(xЃp?WQ>)beMC%xe"\Zk>}&ooZ1:;ԬK")3q$$P.62\mWUFjIM!Ia54@BLI*1wSzdgzNaƍGC#Եy? v 'wa{uI -䚴Qo'[2ċ(I`F۷hNF!,Qz XTK77QTBT T7!lTM0:-*).øm"s \R]$I$I5-Y&NhއH#afN ⻓IQ#:QWbI2*Xc-H6QΩ$6hDɤ6H#I$ XtNY7$dEuXެuUǡQ KuhEI:#ԍdUe: vp*nXǦ$#xT)t'vs (HIܓy pwIVnHuM7.#j6#ܛo[7Ԓuk$y5:<Ķ-A,ܕimbR4/^'zPӓYj,S6n윶]_m%!&nqxhUlr&/bXI-Y*^Z"D|*>r/5"QN!if{ 0Е$NIw'EZ=NcКZ޶r$jEl $1Jl.ɱ -8 -DkD -Xcd/F$ܚM$v 'D6$i$C2I&'"5C}WЅ:sD#I2[DKV(rbS!\,;$ :VŽK-c}S%s]т$].2.u]|0Z$dŚHؘ" ؘJtaoEqViMеlnGDӦ/UAUR*=whRR_SX5L _ :m)(؞_qȔF.NXơn25d$:dbA\C4vӳ"G>oi0DbܣgaW-NH1ָŏ>坋WZ.Y5\la7lD1!9`*p<1B bՒ( } v"Uq .E${ ?B *1trIS gD(@ T9V8?lAԻ.nj" +p{~YKcq3KCXm$f  d/J짙?2EWHa[|Lu@)`?$UqI*?pV)%AX\VO؆ %;y.Ws@r ӔcI]zbm>FIU-дFWr)kBд@EU#C&BBH#̇T3ܟ3vzq8,3",l)-D -7[/5cד.nG2gYq ϽD|e d - )~$D:Ĥ)F/.A|nT_ H~1GRi,N]ڵp/7GMۧ;h?wB -V:MKNO`]#c˴[ha7tnI:6:$UUM]1VIQQQzAIeDM -<;B!|MP~(2,`VPӯL?_`IĘzY؂__f$u|a2k-1N+$? kՠ)LJGYǑPVsA?3qO߰ӦO]EGI8[Ip{b<6-˴;uQjZЎ*TM$MfH"Cubt䲶~FpS܄nA[,tL=m}%䶰eڂz}}JFfЕ p_C e)Jی0&H -I4@LyR1^lj:6 @?kO^:iO-RȷbB#yG/V[dܓ"0rF-?9I̤?k@Ojw7nT z^uTp1\k:M[GRTa'G= G=iMQ?FdüIH);>" `{i"'X= <aܵeo37dE[qdBͅ$ՎJpIX$q7¬Л "Z 6.|G"¾A=&B߰!aeq-rFmiOw^ǽ-I FSMId$I$a!kldz-g+?8巴M nD+wDAtr0&qTV 0]`lmUd$gszIu&i7&N&dɁeFf#[\I&dCzQ!hJUz4\Gqѷ5tMv$Qԃ.~dPlLV$%#bDոIDG -St%вz0,JE@dU$ a-Ii߰`%)h$^is-\J ͛4I"b ђu"-W# B['bFDH,Nw$KA9''ZІ7I&>$M&DF¦ ;W܁FB]W{Y LpJNn/rU edw10nNP7Jo"PqВMJ7ɥ]KٌQg0s $S/d%o~Ꮟ6?bqs?=! [C$z- Z`x"51cjXa#:!Nsn*2I! {d'oH C}ќqڝX_Dͽ|&I MLFRn8%i&qdOk[!u1ba/KKY1{bX/fF~s,m5/cn3A? ۭ/uÝȌ0_)BgN/̣gV[h1[W)"n쾙K$Qy,OL0vuͻadvDdAB,M >o69VYk;PZ[(o!_?ԧ/d׳R;[ ;[VЩH[B d\ 6FNI8b7YS- DM2L608jbp/#wCs_`"6\9vg%ld#7"`l=6۷7b"bXQaJ&Mάg?" -A A\/abaQO1xl:tceϑ: | $Kawh⮹?IpsU4-UH7dDJ5gn鵆gRjz j"\gؕ(՟W̏ſ2< 3,/'1 N6)o 1 X/g p̑2a<a*4@s"b(pZOG<ūKv?z(֪(+%CCAhC,~+7XTSkB;\ҿ-'n>O&?Gń)[L+e]rgboɸ,6/{|1evvk?Qd+Z&/@{TٔK>}2g'Q%*{KաEn~rsB8w$Û~ -'_D O0%MH~V] ^ n}?cx(W e2JŇ{ J "> -16kBc9=}ػl[x$AyàXb%o.m{ $H#?cMʥtyiJs vϹ' Ȯw7 d -a= c6\0‰'؁,ahҖxhE-[IZv : ;q>?aJU͸eCbl'$&V2d -Hd!$/A-,,zIRD-ha7?=|G8 -$nE`pp(J׻*Bv:E }m"FȺȢweQ -Yؤ]EGEEbA֛Ғ'I2*͉ztt Bilc!9*#qv-Ɂ[ - G6P ,#Z cb`iv<&"Iذ"IHF 'qQ ,˭2<墓C\~%mh2)/a]p+I0؃x%f&׸0fZaݙlveKMsԜ-{C|es vdV6S?C)Zٲ+w\+H̑Ë R끸ZKb1o5~ETMu6b ud"i$ZIDܘi~M4$Lt,Da")Y-*hCX̖ LݟwP5Ib}!j=) Y0;nǸ@5mÓͶcyr= D|l= }}s)]FpE%!C{LVxbY%P.ldsFbJZ}d6d87p4FMcM/o %gK,g3m5\b5tB2GE'4lM+_lm1W0l+ĀP @Qьڊ&jn\BdM&'K biXfY$b}q #%WaHkx+' V'| vbpt_فN|B3Kց\8g EH?"Z?qۢVfP%dm?|F5K ݑw66g oȉ,_tE7\es; " ?(́ne]$V"XngpJ+xa~. `ap lyx+ȇqšۢǢ&hl4oLղtG]^`bPҦBt3TwSDUmo r$E yRxPeygt7RHGsa%dgSzb" -FqpIBݷ]jĖ.X0b_~' I%~RLMy)-HOaZl> WCģYl2.yLn 7:O툒i?BԘLMz3_Ҿ<5;#-۴WD`tC.-wM8$&=ˈzz*tNF>ndX# ȼ>F٦QoպAvo$Gq,M~Ҏx/? Qåx!lB/>I6G">\<%)Hֿl~ 7 O'd%p"FaxK w6i'%cQ1k~^ZF"\ʟo`S~ZeաYm>F{.WS_G cVe9EShhFuXlзxw_{ Xw%$TʦM77o8LRc*IGZAs o\Q< -Q 1 Y"*03$raJ%!Fr}Gi5/鑦+'rt <zCeg۵̩~RnlKG"[QYtb'.{ch e.$RNE r} Q);S:"q9Xǩ_:L1+ -s˧M&IrDI5I(Hl@/I{AD9ܥUDH$HL18I ʤ7DVj - -$oR#q4EЪuM2-9W -%/~wXcRMI ?0 w]џq;$UMOܞjWR RCB~N\ -S%:3vcb6=ˣ!Fۢ GK,qC&CD*f%ShI^ڛN7!ivpAf^T&N `Ni&\!4DЖHK)L{&l#y .IRRcE4 Vnt>x|ҥ|$IAt;>bΔ;iHAmXiELp7P!LZL '>&VM` &ĭhB/D<90I$U<%}%V ̡7q-&nF7 SKS3 -THvpA?.[ ԪKDlJRHE>[_$ūǡU$l%7cDLeer2۬1=@YK*!ɜ{yv| -;?WbC"}ٖɾ F+x^~)#7^&[* iqXĎ;neo{~?2͐&De -ŔLg.%D#N "FBJXjwؒR˟qJTK)YjdYb7l/ RԵ2K =d@ڙ mlny.S<ܔ ћlJbkkSc"[ݞS)c<~fԛWү4ͦ /\OcMfv&LȀXOywQt 5E9O{l'BY7ۊ曐;([wϑI#uGGvB_:6@w'EGԥىBHsd&Ꮳl{4ziť[>W}0'y;x_H[?[9p[]伛Ӈ}HZӖ[6}M]coŊH: cP!J CC?z$_qw#6ZwVI~?z%y"P \MYG'Xݟlgw -eLiTSݼa"er& ;wkQl僣K5Jf/K1}q)O;~,'*\O܄')ed+E4q5< -̼1G3!L/a*?Hg@,gi>aqѸ%O8Ii,&Gn]ᵘOW1x0Ig  bmR9į#Hh0}/1.]ϒQںk(4s7QLbV2 -tâq@H<_Y< b>Bl flB8aż-Uz6liDzt!uArQ[CD,MDVeXVR5wԟ"Ȃ؁#8;E^ <3y3MbdnܦmݳaeDlf#ס5*͞ (ہ,#ؒz!,(Kvbh򋓱(^I5DrI{&r'w%W¤RēއJ5*Hg_f-夲\@;4涇4-쁛K6R% -w&ҖNa"_I4|=O}a`pHZBZp'3'+v&#kT(+V1ϗ 2e.MRiO Q z#cZAf |m6Nv;sOn'{kPRI|K$T2lHp@$lM(#2(0L˱UOY6кގ\6$ f$URdbD6TRՒIcw?!fGqy`c]DĜU?]O ,.= E/~ u @Ac!]vĒ}&GěFD-4S`bC}2օf5v;lnmg#n{g̚#vY6;P7\n&BӚ}Mpmp9?q0AȍI#܉6ȕ$6iގD{Vh*މ$aвNcRjS3(2bܨفi\5oh,nI=I%0$VMB)KLq5M@H7PSzam *:xAjr\Ay5uq/BS܉-5J|AK_<ﰏmAlc|W%ISyyv"#W#Iӂ⶯]L܄)i3IY1C×˹ )Eô*dGodSG~!45́Q`]:m/ѓ6ZAPp1bB%DFG}j\C$i>䗏JGRлsZq+v -)>G -MYRYmJQ>9A7{XG+cea(2vHM]LeZ9?wWmHtz^k&lsh 4DI1K [չ4Ct2*p0V"ZȆǥo5VR.}I/ +cq>YyD*M'; -Ÿ!_R @r_v~ ȹgŏ+3m"<]$ѳ.s;p'fcrI}5U@R,&%’y9' FNIU'@m ^ 6v{%'%-)Xw#zX,! dB(Ԝr9i+g~"({(~֧KSuY{T}42I;J -f=67-h|UQ8\`yφ4˪Mߙgp2 f~8znt96?gs9#Mݞ+ؒ S<;8be)'`+):~Drϐ˥, u_f,kl7!̇7"f>hR -ab'ߋ6=Ƞo7{{q`¤^k.;y_M<\/io rgQ0$VEbm-b(rƗ]Geݎy2X{oO}y3aD JX5jd^_DCVC6 -^ؗJ f"XiTǾNaWbcL2$,N * ڮXA=?zQ ssMoDbd͹l?[: ^%+r%R'],ߩ dy# -{Ӊ⿒$^ ;,*ZdK$41Eݩn7Q0D'&9vlp@b+EA$q("z1&1Չ ݇r.ʲ!čKu=EEH`zPޮKt-uN(_s#Dvd~ XAnVŲKoag%+4@1q^JHa$;ĪI/Ad<"5HbI& ¢&tЇD7H6Ѷ؝ozIIªdZ'B%Rk}fj[ZԅbkD)J_+/C'C22jnčN);6@#w3~);d԰!)!W-SF.:@ؐHp28'$ ,WϺ=>©Xӹl+5>&Rn5me -+3B7M#bDXBISU,ecIr%C8)pr|#,'Mw ]QL&ԛamEdlzz2`I%!Hl"#"%Õ 7F8n2.8j N%-#[([e^5)6B$ic\,WtL3C!(3"Jk'BII~l be?dOxB>!( ?y<ۯxԎ-_I$-ӝHMhctBնl,dUKIrK*ވmm\E,9DϠ1>ĩ7aL06tDBIlGQyHttA'-rơhC;L yg""&FfēQ-K -&"]iٟLw#”$HAXn?w>cKo&q0L3,mP - ?:I%uvߢ]]2O˳2l?%qcKեH `j?7FNJOqnF6p't,9Y/%%ڏ}U<_O[G7 [4eyٲ) LnНbpw&C\юB BT=',Q/RҋOyF,^ P$c }-^ Ov.P8rmn"&n\S#}$'2NpȎLU瀙n$;2i"O$?*mrmN*K@7TUYc*Lςw,&q,s&AgX3ϰݩ1q=ѐC6Kzcl;{#dm~$UiFBr.rdy/.4K';f&%5 #v*x:Vw!c9}4DJs:p#Izw$96FCW|"(i6VsG :3-\ۻyM+ -OuϹ -J-!oX[1Ci:Q7@mr"!H a "^Jɯ\Q=k# 'XbE{hU/c-e=B=sIRf7%$$˺^I ؒ#w"S<>YJvL_і IL= ѩҞab{vVb[E= DPDBJ8n/21X2h|ʹW\ *9D?r]ld6A_$A\o-2HqC{Ѥx*؉a$M$$& dHڛ 22{I1rEC,7~ͭA" MI68q6cf&rILQI3?;u6c|=gV\chÌl[4n浰ilblUx?Wr-a( ڐ, ="w.~Ҕqw PJXTK9&Y$M M q1$̊g8،6fzKas QA9t:Cd3rZ$I4\NiqE-s#$CF -j}|;/ď؏hpvsJ}bD9z~D'-r!s)LEk'6߃bVIŻ7u+NEtޖD@K>"-ݓ^m瑈x&@rrynL6KeeDa&T }DٍK+ -2[#lD#;eMcJ,oc0'"J`?fC2M9ML܎OVTJdGRTI:[$[bVAhKGUtmr`@W5aIѿ},O= -U3pcWuIRGS9t6z.Hc/c;A$%>jzs d>~AW"xOacb|+=W[`K1ǣɰ2i`iqn^%>|~JJvȣ8Hፊ̮1%_Ѭew'hTB WyiHT]`{Ans&ė8W EwU.w$Dč4EZoKz"k (DT%t[^#҃doy,*j;nb{{/6v"Gx3tE"'+>fCѸ鎉X> -s)rfok<OJZ&~ }ݒǘVUg\u<5 7l.12I@WNxgF7>%>V-)v>3[P; -AUgvEKD){' 9-qeÝQ*7Y ]h$g#5މEEj, Iu6۫7m#xbͤ^G2ᓩko?;KĤn1)|Y$MgMq$7#qeʻ{Lڞޜ/wpNF\ -S{]}(]H_^*†1Ϸ_(Ympe$!0jomc۵ AsD+:za҅2~/ _C0= BtUI$nI} Xr{6nnMe[3 [qA<W$RrI%* R$!6~ ;_9'%ع{*c7 w^Y82߰8E2D̴1JԾ̈ K>c36bs}#yv6y }r%ܓԳnoh5+#~Ј5/D͂7BbL.DĨdT\ jM/ۂ}ԉ268B -M?/Arp ) Jҥ/dZ>YzPr%W,Yqg,O績µ3u~tYruDqeǘyYexSz|<9 !s6۴|F ɰ8O22YSP3wz⴦N iFFn$ڃ");+FCcaL02?Au7Hh -59i7H53}սE者rr3[d]l]𨉉n%+SVyv_t"dP!Y0#btv" 龉$+,isLNVŏ|W'P"iʼnAu@y$$|mQT O  (C'x_(\ni"dM0I"ъ*CnhޙcF*u#nV$u39"N#b$M[,M=s`r6\W T,M *@Y4DK^F"6NhI2h&XXުhmNņMĔI½*Dtx!RW$+&jT$nM-3]4dîbfEV%ܮ6{puM($pÑ1 eȆ_gľ-v6}WFgČ -&96tO]ym17@s+%;i¡H\Ìd?7F7X)r[mqIS/zʠ2ٶDCs$ɍDM-I:Z2BUSrI/Vbԙ[$hL!>;G'c˥fȖ}jTyD$IN i90X#GI6=1ES }mAE Ws'oo[3;R(%&$&\t/֦zI}erNiu(d(_g[g QΫ^$bt34}c_A i6)sohS)FIJur lcǻ`F@~ނYZœMvC].WÓgK&c;L$#|i٨C3_v. pbpI`HO`DŏLNA@Rd7tJ&Dbl(q*'AM/%ŏb.X\]SYw<&_G,%XZDn2&@g#2ǮK4>'*|hl+DB^ -\nXXLQ]i1coOH5><XΦ0nD+t=R6=ؗIf.( V.#=,u|ڲk$]XB -'8b%Dҩ2ܶCpm2ZpYљԈ S->FS$0lp\nG98u_(_P i`:Zmѥ$6|ɴt -Bցk ğ2|rd1RlY1d-J ڋrc5R1tloZN -_,== m -SٿNG<J!P\ȴŶ.O { -w]xs%"tV(+0LgJ )ݻ_ȳ9DA$ 0%u+R;rrg52BTYA2[@䜲4AzVxeDI&e% BEAoCX7C Xod{u0HF{FUxɸ)M$R$$4I:4)ĸ$v[!1$"A&CB,jT;8s҈a?4 -"w|aCLah3?M$;3qױ>Y:8Ua- ɳa*nnOA)+$KR"Id'tr2Eb&"]I*tMi6d[*K⑁0\F7n7DtD6*In2l\$lwCdj ð*YCpdYP-#a"vHF'"V.4bd#>J؄7X ",cd,M'LrId[anlvzLJhI@r -[E>_"bXi0f6Hލ6&NΗ4I3:ت"=zM̒7IhjI4TMU#;ȄFK4 $$Dݱ,k@fBAw^»0itfRh)n1R7#ؑh M,M@畹2:Ҽ E(#bo6 ~ c M|3\[F -w]MpCk lN&[ =ul9ޑ8#.Xi85՝Ծ]ap 4FlY$G(\N`ӆ _ Qz;bVr|7)1:KoIsDMD&ؒx.L$[\#bhlLLK4I5T)$ؒlKcd&=F$)b"`I1i#H&Đֺ .0F *L#DV)ℎV@'NQ[ܬGu1/#O8E`W`M(rK?GF~W p&wlaQg5K8= ؑuNl&F?_ADkc/sb4|dVJQ>Ġzlٓ'y|}/q-d!mEȍ^0Yr)q~$\:-lZIEMIE-OQ2I$ܒQ.t$PH$UI&Ol$ |ɱ$!4G/QPud~@䇳7#w=/ \U5Eb -;'nZM0Lqw+b8ؑLA_BIrj?'F~dLy?c| Dy$ C60+OE>'F_2a~UJpAD>kbl=QM%[vq>ɌzqvܐF~.?oR )O-]$=$pLkmPX6ɱ dBEE.I!Қz?"&%,ʣKN madvo JI)zMdq%˙eH_Ր臙I):#q}BDfL?}R:GMI+C&) &5LH$I"u#.H?_+V.gW -k:%w7yoם[1} 7,9xE bDRG"<#M5=ZZ| SN1 @},-)P!Sw"T"D˭1ʈܢm!SA!yV~Bv%kA%AQESFȝ0)h.Xڐ&bE2Y}'׊ܢZ,߸d3}^C'\ sWfKS# m"zRF4L@i.IDF&M$bIpI$7֍ޤ{ɂd'E$&aRdDbȠ(HD`,`_^ ZUQ46&&6&I$QI7M&oI2&[$trIv6>ؒLڸ/_Ecf`:Q ВhY[dIѱ8&IR$I&&TXI(K+I::Mi$*H:J=6Ae98z$LFJ{H[cC>ocla׋"HgrOֈˋvDU->9$m}`gE"D""m<2hꨯYtaDM$lEI&JtM[aYf pف8 fz >4jQmRNՍmur"XX,'4Djt_oeEH$K$2kWK*UhY /'MILI3v9|E1j!YugK"*-oV9Ӡ;X0yǫw؉e=4 -wl&y -96t y]fpZ[p? -~N]~Ԧ!zfo$XS%>KXQEALʒ?d(6|Vo"aw/7D|v'h"ݧ2[8J ơ*IMwВQͤ"lEoJd 7&)~^%6&|;ѯu}!<1e^'ۏʛ'/q FcaJH(m񓅲ړKClOt -D*.II {u/? ÑbiCvt{KMVwdINlLԌ]p$Ewq-p)Hy|'ܑ{#g?WSpP^): +hK!?#ْR)*R@a`̚nl}E=ؔ#0AŻ))g0䯓$ czoCT!WT-Ei27zɘԃz"k:IjIvڜ܌?숭CdP-5F2C2]$ri}ޫ5Ͱ1<>$_+ o +ɍ pMq凉=逛$.$LCE| -P3fuºN28K=-޳=XC="7|]2}ZQD_ѓ&FSP=CpmOm ]=),ڒHaCaOь&?蓲 -Y'> ~'7~LODnWNIqOeHx'hs9OgBP@2Um%+9]vY?`Ѿmn yf ;ZY/9h|!ß~:9{Fbn8h wIWe]Ķ1n)7-YlE<I<6d`۸?.- [Gh\,¸ȴ_*6T7\X oV}2cHbβW;{RxB7wKh^VxϦM!,]q$ xo%:F6 -hJ,~S>t"Oo+'T|Oe{nȸ!<9gu!e/~ҩ ¯{<-cl^*~O,hB&{;;j2u6I2J~D3>TOzdN翲׏ṉ I -n>ٛnxhhA9 ?K\H*Td'_#np"IN篲_CwPfۓCݵ}n6&+mLhxaM|/*;k !}x Wo/d1J̋; ad:g5b|?ef<@>z/mLbG%]Ja17:kHdm+{SP!7ˡq߻MܱG[Y>(٨`r^“y';^'v*: -VP"hS!O +e/;aOa2[W-W2bcQ„ݐ>UM6Mr*2If<%<ĀY䕶rb,$١J 176-'"fn-í"04?SkɶRbHBV&G)a -nв~RnbZ$_:)(lWR~(ϛ1IƄMi=_ M{x b2zlxu:ۛ/{YAK.%CDn1*L@k}-gw$vwXЦymwy,qeXj[9.r{ӖҜY ItqrbV̓_U/e-3Iߥ#сX#oՃj5=SY0gHCL#~$ IgaW -tFD{v9wjQrYss;lVҹYm#-.E<țINjh8?wB"ƥdk.Zþ|d{?<Q(qٷz_1Fof3i>ya\7 _ z{{4)&j } Cj-Sc[Ϡ4kD.tCy,ğ.OǤ -|XHڤ8xEȽN]caᐚg6b5b)bƜ05%C?gAa!JScI)nyߡKhr[/ūeI<: -#9u0Kv!ptf& ~.] 'Яys[TсR*SGmF_cpJ\Č)}bYY:ə0sæ& ZBJHI^3{I>$o;BAv=ǟ?SeeFr=E>^E5'9gD wP?W<L?fK=na+ab^_m=J]ߎY2L~%4ycJ~dd^jֽiS. x#+ -;I:GܝR7I7[19+Ma2cEȴmdKJ@f˰#/`&7,0AD4>J˒s8Kǡ6.eͩ&"XDx`^O#NxxxPJa)б"8PHcEqf<@!dbAef[t'OmؑaȒ̔X[V7Iqφf̏^uN.%dI$B>RHMx$M'FhoC$fInZ eW!IToi1Ґ+ FA9p-{6GK::[>I b{N0[C|^,622Z ߺ3w~G HC1cjY*Yw %*.OнfQmXyee|n1q6%J-L=U>`iTYP51)-,Rzs_`#TS)8rA4D;ȱAA3~Ofca 6d[p*{'nc*rٜ7m݋K9mAHl=bl>%w knAml,i srfFLv$] \;hMn8A<=LW{ol&qXtJKsP 𾨜2Q;hNN* - ~%K#3< - ^6aVĞܗNgs4'RךΙcv[濺E7Mn\zj>IJ [' )i2PyoL=H7XwѸݧ1FxO).r5V:osZ-0Ԫ伒}I'jAw2X,ʵud\-S 5gm{Zp/F$2vsYߒL[[{_r}! 1Y!ݶk?wd?/]GQGm^BRVEd>ƺ d 'pk A&'&حWxs!k%=ͱ;..$Dr KGqSi?"3!I %7c"X0!z93]D?cl9Qɑ$l3Ώq^Єc&;-%@ Vڒ1{0O>""?c8-NN&dCdk'd?C݈Gx.Kx q|h,S?ksrQO^e)#w Nsf|m^$ ddOi9' sض)tj/Ml{"o}\1['6Tɥv!g+&bkuuqC<1VbF -rO ٸ${IRХ{DV)yc}O~f1dmT,~ -FktA-S$_A?^RGϵc\&h>j\] ]=w1 ^mJ>d}aZ.euՙz0|?8[õw+ǎM{B3"C{ Vscށ -D~Wåy?GBK>`[/*k Ğv-2[J..)K胐{hcYd8;{r,G4h+  -u/Q/b\'=n>X t:RKܷo$0ԓ!V wK7k翺9BC0~n]6ICܔt&m5.vhq9aW#gy -e*9sJ%K-*Q"_)aHG[I$P,!='3lJ!C=(j%KOѿz:;GtOȯCK eClWI(W #$R Y8B< WB; l~^RJ׃&~n@7$]a7W#Y.fT[.I4d_(՝>FMLLiN=i&b,,+~̟da|sGF-l.H]q*uQ3bEwf˨@3l; i#״pofK.Lj@t EE-*N;Q̲npZ]E&2Zbؓ`ƞWH YQFH9䑶2jhy8 wR&i5nv0' -.8b90 D?`#ytF.4#gIj] )z&ab b^'abfy, sG)DR.+>a@HX&6.fXܚv7Ga ɧ H$w) EhI5v(.!p ‡J㥀'Q䫔$Q(AC -y= MOab/'D8i~,(D!,!=J7s˹o < ӘI/v7ǣz:/UhN%mH޼RIu>.[(]\! JΕq tA -P.!r:ka$a7 AeV_6dq F7:n1joMSzܟG=1XF#M>I4%Ϡ$g81y1;PS%62{ЉdY!'t:ϕ⒟7 n0 dېpe1O/w&zyR!"x$\[U7,{}{Ir/&tt]l/cYe͋$/4No-;.eXC>U([ZZ|g{se><]L\F4EI編$tNI5l} $kSIUH4 -7Dݽ] 6o. P<o-S0G9e/Kh>UKrL{1uj:a\MA31c>}Y oɢr[6#!W.+e/&/-x&Qx>ͮ&" GSVL0o囋d!dվ){vf|~ĴJnF)=SpЅ9Ad&.t%2=~AzY4$Z_>; Sd?c"||dg0ǎkyn1fS<'$\v<*9:1O4\V@v,FYe+WbوX,Q?k~ .5+Ⱥ4g3 D\F]ީ&wv;qCrCL#Sߘgyq!N,syI4UmFi4Ed2N$QI!xR6BE5΢vD v쥣-_n )( F(WxfC%jΑɽV?n'W܅~ǘ'u$uSD'qӑ{/ܳɒ<?/F2Е8Vh0ޓ0aa?am 6\&<~-R~\X˾YeFb轲q`>ǐȉvh<{=>Y5uxtgq]+el4_ثjrq_$NĔ9aAY[PYk32^A"0ߍ691".X I&\aU%gD\&ɟb+f|JF蹃 Q2BgTн"NYfhvO'a0ý@ N3,=dR(ٮPV.%pKá+GW^Fm6&HAqv$DׄY $M}萛a[ؗ%lwMВ{M l!JdEI$ZYq=s ˱%.< "yρ+{ua3xz[QsOL JDc-=tt.\Ei:8[$ܙ#wlyC&qPh$>\Oq }[yZg9$<Y_Dxa(KZHNK؉mI$%17|FPƌ-Z!eio3L5sȜm] Xm -GϢE|~ڛ Hsv!,I!5>%$ Hn^[r[})9(zB9:$DMget)Q',xٰ?BJ:'D(n@@,t 'lcu(GlL!t)P;ImA'͑xID.e Ů,Jx̹b8EgkFPԶS%2ȬKarB$%d^vRn~ĒI% lggQn O#L%mG(w(0H,!I.ғҒOJDjSix %nyiY%h ,\\$s ƥxQ-pnKl{h۲KYn7\r,\M\b#o6,1,UsG͏j<aNid%2kV( AV )6,u9I{F4-Н#aLrv#3!r6_n)7*wJj)7d&I?bĉ uIfEu6"0w#b=ۓ Ycl`ҪbՐG.'. rkF&@9:φ/5/yŽsIN1,i $K.CEAAH R "Xj)GҶSВ,FO Br }bcƏ2p iKtvߗ;qei$~"Hh9DKXē߶ZՕ.շRV"׸4.a}-yqʲK&g'zZ'"W$3Kr}+FAoQD6%W.{>e0z{|?aBtEADi" ))AAAAT(EA  ( -fWXݩE*] QxuL 1ϋp~Nx"$ra#Ivfx[NXvegz"n0X+L>ig"]g<6]QaWE2#,GoLKڅò>-cpr}V.QWqnM!:5Ջ2G(VRD Oya?N8Kr3:w ^ (( (AATvizKAoR %B(H[~|$3E ,D"LV %+oHl -ͳ_01 ¾G>"]6 Ie!3Q8ϴE>Nց$C^JӢXȐ"ΞWȿaI oP_! -,H^}F[5Ú{> dJg/abCTٞ5~ނ }tg.R]$"Ht)ATAAc@-v-i*WUZ4 ; . "d{3{aMq6=dvI6Aׁjrz`~rĔAG6>YejtOK1%dz+d}ne) w4P\.ha!X2 7b\ GIM {$Z}K-,4E7 -`Mg$&h-$t~<jo3B_H9iag3cA.o%W7C3e)Á. /DQ&)>K%*da^&>H v~i#g/.^ 08)TotX[x2Rt%F󑫲i -[!ζ!"pKRa2xja$& Ƿ- wLu:1eU2_?; ~1gA1E&3qtȖTa߂ѥI Q:WCӥM'#r۠*6,2#;]Y$Z7䅡=z]8z1S"S[. uՕ"nv$N/ę$}z-l ȳ57t-@rKax=dH B'"O{Jt1pXwhPu3,;EItЭ#˜NetM"Av?y.AhK-"D{GCfq{ߘ.$JPl^K)Ed6VX*VJʜ"a!$[gb,n0qSG aNEWCtʅ !.G:'E `QLS c[~2Hl2YCQ" oR.D  AD}H 4El=$A1&/DG']@-bb\S3*zEt&MQ$[]Ԙ"CBD- l"CB)\U<vU,@qʥ:%$rYۑ;[*iΘ'ՀD, ІA# 8;PIlHȞl"ScD3*>M3je[;tu2R e8] 2DNsZbI1Dpm~,l桘/#ѝ̏ĉD-hƺ!KtLFsI;rzd#jYRBB>bլyE;ߒ׼n`ndAb2(Sr2"۹*[)uCE#HH]؜m7ϽzE!j+")V$G2"z?̔ Żu2`oyw9oHkUQ|8 F~l6F-"o7XO)fps -MVdPhVROxR!7"g6;1(+’9*S1s ~++02h,kgK/Q -}\cGvR}>%L¾3&w( -JK6ȥҚ bH %lj٢:HKOdrdXH'],2`3ȑkĻt%,.%jNM;NW(^hɟF,~L rbx!p:!34Z;Ϳo3+؁VX(%i3eUߤet,TCw܅7aD&~;aq9'W9{81-r;} --Roؙ%,>p,/=NJ޻&/ldl g?tr`?-RN.] ߈dk"'\K12{il^7hUl_aїL59aӒm#B5M:vv0#lHEoc^ux`؂1Q /_|-m\ ?5r2QUG2sI9fU)SiH=]e}/z0$ 6C >6Jd|Qr)sqEvsA<6* :Sa(Ipn9򰻼M27Oϡ5IzsO*=D-3&tmqwd7"&@xiq"3EQZ܉I/jV2YKI&lmYTN'Cz&It=/DjmOz[UKBAdl7 it`H95o-V#$A[0t6\F ^N>ot'鶭%I'WotZ&2I$rI&I'\tM&RuN4rI5ˤI$ugUvuM=zmkoRtI4D2H:I'ҹD'Z$]=ȡ't!&tr}&M/tM3F$.H{Ej=SMfRMͨOt!!tg5I5-R uΙfL5fRNI4Ή$I:gВI6$H$bFac вegaapBɔLw[&ӜuelD3\%\o[Գdk:'Re>} Wb}+I$霒I5I$nOI6.I:dbk:/2I4IF$$Y$Rɬ+b}*O:$I$^Q*I2I$ܒ`li$I$\{$L$h&ԚX&7I$Mɬk'.MfHg[d蝩4mVI,EWaRI¤I$K&J: dԖ@N:I&Vɤ/I:-Y$ږ$n(M$Vi4I$^J[ՒYVK.I$HI$&ēIF*$n*HДNܒI'Zy!Du&J5LI4I& j4L$lH˾G"E#Xe"Z) oqV] $3 b9e aͅr]e"i'% Й424Ii4I$lkaK=$lI551p6bM- h.K$ڳG$\4'm"ueI&$HԗQ2挡o'C6^9'[zHZ|gpȚ[~e:6WCd cgD nDXqIDXHlK䕥YВk#6$osMU$L* hI$F Ҷ,MdMA:$k,,\n&Y>uԐ"`RIDd')Ӳ'#ۮ6Fzw(_u;I4*$d8qTsav&QXG?[l_~mb]5RIto0{#e3C$d$urW=75C2IҚCLEKH@=d(خ$I$\lH$D0OZo~$ hjٮ&r*>e)Gc{H-C)> IJD]UtT,¾R+W6cst;56aH-s@nӓmO=; wOcq u2Y"S&ek}S'?[Xwv,GM&Od5G`C&}'IhA)DW-EЃ -1@IձQF,H\VSah$W0U2I&Ղ*Eő氨LRjM2$Φٰڑ4ȩe $wE,MlXM$dRK$K"֫}l6M8$W-$" RKAbj=2^"SAb-PEjI/IDщF-GK"DJ:QaΎ+rM$fMe\80mW: }˛QOb.Eh\IܙbP%@I$M/4;R;Ѿ :M*C{FzЩaIA})*!V,Z -wbrcJm遝!Ahg4ڏet^DjtDQޓIeI5GUGlFSzt,q4Ax"綷j"dIBb,7ijI$iU$oZzlMv#VēIިD_c$2\l|4lp`G n\՚n\Pz^\z`=p"Y: APS rcG'R .F'm3Y.7Y3z N2bQRIЇR$LLH#Cu&LR`4܂S˴$Ήd!HKbHdf=^RI$V!Xa@ciZGXa钱j[h)$z&ȝ&k#92+ Η LYj^SL]&4LƈI:i$ز҇It"m r+N;9,̫͆{&,=8''_I2JNQVfմ`$=Kan"O]\ޒIY44I'L4izvM=ƦJbir)&.M$'d'E5"ly/-Jr0[,HD_A6Ē) ԡ#/o5|#.hb:d.6M`mh~dЖ$O^4J&a@6:nnIr@(6$Ni6ݍ5v$M.KDwobDLw:3Qj[\5gIM$lDKh0I:$P(؉z7bx$vͩ8DI7 ر,=|lVїQ*mMܚI%؄_8~;xިXrhDZ-o$w$ Ym%Kaܐ= Fڕ$oJ%Q=I&uڙɢDi:$<EjMoTɱ# \4ړFJG3[G&i"w ȫigc 9P$Y:Ex4tYLf&~xo#IDv-0w}4$4ǂwњ7ҳH&Iu#>irKR0&*M QlbH82ve湬&H$BO%Kyp\)d~e8A_ˑ/ ՑX|WɰV8[C 6s,yw&LnB| >6NRAa.sd&Pܺ&`hjګНpE/dBmfI,t49zRI4LUh؂3 ŸIŴ %6/8g60#neS|Hm4:QGKRHڝ&¢zت+As5fcѵ`}&F&<4$2v `BGq[}n_űGȉ.7c 66/4YM鴄YiIԿrKfL3Z&"b -UA䝹wB;ƍ$6{+j/A}>\gH!ݿ߫ ≝9 =X -J`et6Rz+' J>ˏ-.)1/{vS*p dBm4挞IJfE&&:RKވtrM"2L"V ]˄r2WeG,1\8?ѽQ"*7(Il14`L\vD7^O4;sڍľH1C.dR"?龉t%"FԷ=4'I)7}NYcBս%M&5z:FO4QI:UTIJ4mIЉ/!Y$Hxtzs=9.$Ws7ڲZ=K$Ot=8R^WЁ Zب1H"2o[YNЙ:fI+tf1hdN'i !mIbIBevՃ6[6GFd%"U#%G`٤sNkp7# -W-|ꞄBԶ h./I2")Dݍu7w;1ܱX ΘC3S#dxtIY]ˤ -$˹ZCj(\7X;;DUk ,H/2e7l,'kIyRo:gƺr7%.ΩVn82hO lryd͙1(%ȸKDnh!FIҴ.$ɬ7jF|&L.2(4g]j'\س}MN룵:5;E܂Hy>uCh%*B?gATd%D)RQ?Ap7Y`QF8!'f}e1i$A-Ei>tNVIF-M ,QD՛"bIMCw%0yZ|QH|7b~ ?8< .`YjAb)K@˝nXFo~Q֎lZuhoM\d{/Kp^]"Xu~}р$hE1H!F1")&`UL%TZ)&LA= {mm: 6 W+(< [n &l9hBWb+dLg)Wpd8Smig4dvBܖ0,0L}Y_"WJkz xk߁Dp+X>w~֧)nXoĚ:4Adz[(hzjo"DIՋQBڲ6"Dzӵ+6B`e(7h  V,h-5V^P ۿX턽dix+{ > =9Ii; Q]ɍF37"o[s}Q|[`{M$Ev]aPý6&/#vN/!nzRo|C|*F4oI,n\DhbDC|μ=# -6D]3J.W%Rf{-K1q)NB/Yh].L^.sa~؄=!4O{06bZ@KIpnDlWU&/ij3zbi؁SXOrKMEYoEV7Q2Dv ֩>ޛԚ2dBHF迩jMb걢 t7#dzέƨVtX\!imEG_$蛓%:K%XtnFVC,LVa9,;smζ=+֟^=yrf2+gdP8:N:HҲЇ_?'2_ hn]."AY V2}'pΝx۹ڰr`^cl fpl; ;2~D?qb׃q7(m'LOj"tJz&"T5\pA;JeGLJ$~Nk3;Isژlu(i;z 5+dI;A{rE37[D{6]b"-tKL"P-L$>%fCM F^aEYzuoG'D5ڨz=ς5@!iM˓1Vf>1qT7Cԕ'\c G=IdYZVi!DҒ]6ir=y?[M""- hbY:TH" -ѷ}nI~=U&\g+',nI#NURl@~6JKmֈ'P#qhI'W2ɵ2L?Úh\̊ƃ_#L3W[c:8bF67ZM4Q-j7'ÖˤʒIK;HW]TӘi,-MՊcDR9U^"]$Vd$)qOㄚ %fKI*2C +nRggH#U0 gAt Sr=rLl~K&Zd)בdlnRp?eɄٕ>u/.׌aUNz0joeZr}9곒ʆcwސOt6.bv\"1 @KؙPH= X˻g=') @iQm > YWʱBMGZ3W]S L+!.KJ*fF-z_27Ix'S$>"H93D9#\ؿm$B 4[Ѝ)zR芙5VɬsFhMX,n{4H/KOoN)iV6䌒ΫVH%[Ҩ^ړ#M!;W~~W&lG1t3}ߺx!IpO#~Az/uV8}SSy?{!,~3:vG}g7v?S3'qq?nsiR%~~7顳GVy),՞Z>9<翺;;ї{]cO~DUTi"rѰdC'Sٙ݇}w!a(^/CbsT4R|>/~N><>x%u޵QIhɘ}}B̏OҾ՞PYC 4^}Fw/y?wJ{~'<~=:yϽ*OZgozR;cRh?]7~>I˱ܟYϸwz7a}_/QhG/=՞K?iϲc_ycLǀp1|п+I?`pj(O.\_ى='a}]GWB 5cQ\#IvP?OߙȉP˖#L!V^ro 'Mp~Y>yb<gpy'r~NUE8N˱>R,A RzIm3izt>ȥ_LX>;Nlaޏdq#hYb<#W;ڂO!wvf{z~5XBؔGf}4p=X<_Oq%0?s*a~ۧaNfr<%< 3_E%|'/>Pg<Ʀ^!zsWhFz(/ЌCQL; eE<7ًQBrxi ,xA?n -5ɏZ? -i&)7x$x44wޛ!o=SZ.iVa^3ub`c>XO9*I儕tpi"yꖓ#CXːFQSUڭJ Hz tUTP1zcZcVZyW#'x#<Oxa*OW"|QOeQOd0Y}HX M!2O~nDҝ<.36r_Ƶ'΢Di^ODWyj%?7CWYXG;ħtG9eLy?<\ ?hJӇo~~]?9 Uѯǔ\ZNa%YT$tG]!Ág?+W<翣}[JF <"nU'z+DhoT=F~y>*#_^% (p O<ԤTLO?V"|j\O[Яo};Ţ.fB&ݢ?{ϟԳHn~hX;?3KLS,QO՟*>=C~'? ~$vL& G ?"</xB#T V4" Ljc (@1|+NMC%WA<<ٙcV{?)$d}ģtG9B<ú<E?WE>+'rd+l~δy?SK_\0CbZcp3yry=47!>ጆ0ˆmRh솴|(yG4!ƗB?ڈC$QW'>O#AM/(?F"|?{ht|L~|_ٽCFFi^O}tGOi~&GRG?K8Oܟ3Z= -_۫W*FՐseH2?'F~'ϱ߱Ж/\0ngn Rt$Cd[ݾ?3?NC210bH}JOЇ~'pNtv<:r!=G~':%Kݳ#͐grmf/7|dPͰ~>ə>$xc*3Z-~$<6W۠'<7]$4~KhgHr}}3ch{ɽ^>ӹabi:-'F~jtEAuu3?Wcb?wJbE.D?ɑ>O៣'œW -?Q~)H΂_,yO~$zk-?<}ϣ6?SnyCd~δy;~._3sƞO'7w-<\>b*; FP1?"x#OyH25+!gNsFNOs%L. dId`ݝ -c=kXM6J^-FibD&Z=,{z1YYsrz2;4?WCZt`c;7Oi||RZP>i?&%gI<<3찾$G!FbDj p4Y/#jirb!ݖ 8AQTHqVXCr-,I$!]pY%w3t9$G0Z>N i;a@],, -∔,@aj7pXܿ)LkoNʞWaa(ii7k: |C ($B7`%X;7 MU͙ p^p5anb Oa`HrŅّ~¦젂J{3G#K]v 6Y]BY/ޔ.<~p#Oﲃ C ǑT-<ߑdRKӞ ,.ow jʒ8Ӡ*'7R&# -nuޛjZW $Q+TV qHj2Mh&$/]͈ؒӄjO'xDsF$ȡ$: a -h-*CC;%LS$mvz]$鶝еǡeGZcu&ftIIhڈHtqI-hpގtU[SF^#C/]>ǬN cckJ>i:!'Z:{Rk4hlE[%WRUk LI& 1dRNW6Mp#ru*GNǢ(9tI5KXtN;z Ӌ`aiMҧ>ivtH.=M]=ǢsJcC8h7'74IӸՋKOrL6"D1ri6ԒGzҶj?Q3AoU>Z^ ս1iqî"媙C`OÓ8z=rdp&ԑ4Ѭt&"6#6 ,L -ֹ\=3}Y_њN,1+S:_s+qMpȠc3Ɏf佄,!_1L, G;]yEAv;@Ʀ,!mA,&v9voA^j-'@(ٻ}dؚ"v[=i`^+Mg֝Z/j/Hj$M&C$:n%1֧؂zIܥ{jNp~Q,w@~ M̄`#G'z _! ffH$ٞd-lte$^9"6blvi } h囄ɘQ"86߻ZmrlMdP*ū:fsNj"JF;wO |1~'[|D4tD6uZ> #rg} _?̳]gg~`m>Y(;{1qYuB.b06BY^*EAFf՚_D]* Rckc:ش6?FI'NKv7URxx\3K"sobQ% i##.BJ-:= -2ͲGWsm}_:ct.kߢ?somKG6rn5 Cb1jN:G nIo{ m P.hI7Idx8&u蚷*/MaB>X$޹/E"5'!ͷ/jHv"t4$CӠ!+B,p/"\o"E"i)$۰FgDH6e,5$*hMCC= ?^Bdu=E߉߰iȖԿ$/Bڗ]/q qmjOFHMS:Y&޲nXj&kxi4z&y^mbȇt g,B:蘟o\؋VX/]#ozcC)A(BP"QS~t*7ITj9FFp7z,((*^W {Qi:],ZTI'TջןmDEj֒krIdjNk"ǤMTLzZ:&ӍR:v@Ѻ,M$Iزj2G"$SzM'Bu<32E:&gCz&^UrF#c$$67ϣ5DLtI%$i7W֓+ҟSjGväjmt6Ork:UMU1tؒI$"I^QzQm 4UE]z$Ebl"zfԒLdbIH߭:rRiUVF&oB׽W"ъEbAZz&M$=1M$Gh$E -I:j#З-4Fk:4(SR]duZ:1*A࡭)i-cJ^RlNH:&YzhdDmTM$%صS kW$QjoB+ԑGDR+E:]6ю}RdHة5lVm +YzLiZo4UގNzzDkR) t!RQi[EY-.幤Īs#+JҵlM7蘬gւGiTZ`~ӹ-T1H(ΐFDŐ+% 8K\3->0M"GJQky JKJ2xbffv@\&J!iAn{OԟbTHi+5Uw <77jA&N*=SjQ&C7@A2+)ːAG l$ 6pƨ9vH#N(4c?oJϺFYtcs\4o&a:OuVV+lI/`" -bjScBn¦ܵ$$"T(DRHVEz0:*ЍwI&ƄnA -3$/M)~̍h%g]Cڳ\%ȐP65a>KMw=nw,} ˼50"ӟP7Npǎ~(K@Cb5.WQjm3Bٟ,ZNXb6đ~#̺=п1iCDhX*΢SH$oҗ4Ƭ<+cjǚ?>MHډզo ȅb,Lr؉ࣜ1w8Qc" J4@HP !+4ƜiUYhZ`#C\EԘ vhAA;)AR"@޽T5GI MhDX0 di1HVHrV5Ecf2/, ^VO',emBrM̶ji0 չn!%0bоDNY2l33j$YD{rM -v>lFx1r\/2rA/AQ A"XAH- H؁%[#ҁ#Qau/C9--d&bo0;-e鈾ɒ=#,{Ռc~d-lwa&v$e-u؆[&d$2OqhJαH "؂ ܢ$Gq7hr8+C% Dd29MI]:ū[9֩}jcsa`?ftǐ`<Fj&%E6RYqȁzZ #fCo #6EnnB~| 66Tځeɀ mT'mV?Z%QIm#|KcRFq&JBYX5k)097Q\6Cd_LIˌ,], R? udGHƷV--Q^hz~3ݩBxx{︩ |I]EOLK\ ;" ; dy?G ޖuS :Cս -2Ņ e~ {8~ftH?z/t$:F^GwZh}繍 ֫dVn,zY'Kz'ax&io+r6BJx<_K> ge"%!e"29( SSEnw}-%xL,p-E1 FxE"Zr~G'?av3'?KH(dĉP,H83qGљ8?x{N磆#g_/ڵc:gf!K_ˊz;VtsEt剓[kZbzMKė*oRa$!F$KА qCa j7{}>/GIwỹ$!Sܸ#"%sk:ȵ&(I,VĒI!G_#cF߱&2M Ii):r|x-+Be#.b:L؆)h?JϪH޼j΋zK\\jHE CKR4-2苓39r{z[|]Z$ w-%msgpJ.[^I{ {1H':2@i?n./g΁&8`tؗoúˣvj'ș4B&U;RXȚMNXٮ"PR/a/QCREYL12L[hiixtTQe [R --{& - WwD"Ir` K>IJBp\C9dG#R+\;PjI>}Ѻ/A\r0%MdgR|n\]p68HE(0 - J' -ܗH^Y܌:BIIt !ұfw6R1kx'i#K K~REr+[)E0C\Jqʤ~@@f&K]>t~үs:!P8_#Dz B \ӵY&v$lM&-TZ'T QN!̄rIxmt ݮIo0!n6X59%W 3/E^_H']Ge6; ?wzClAMGQQӚ5%$caH(Z67ܒο肜*dU5<Py%3.ςx""#[8Ӕ$C_hH&P.6ҽ$/hUWUĴ"|dK| J )!S}OZ7kxaq;Vq./4& QaOw^dzͱXM~+O{aãBKsd%Rd/B#KbDKbn,Z+xybGU=Ep~2Lj`ã"9D? Xt j:n:[ri5t:^NܝOV,7~ '(X_:{~?&9dy'ya8ّl&U䌸\H̼O"GR?a+ĥ!r~~ꌱ˦:n~΃~]MBW%h]$sŎ }wcn*L[ !b -B3~۽O>fO0~Y#_'5cXEF{ѱztZ?Uw_q=H.g@l8ѱKBƽ:mK·!RWK1L4D']GIϏy72D%RZ,^ɲ{ȋtJWE$"r^AL{- ;E?^Gr؏&f# .}5̾7o}XM˿tM2aWHnC;)`n'w9?rg-jN`47j'䳉QZjq]ãaXG?J%ii/fsW)&ā-dyoBнh&\ M \VSN2;^ }X)}v%;+t0;y?b︂d BwaƧ!52+ -N 2KvZMlm9;a_\ȟ5lM[3hcIH -JP#4toB(IDhX4 ( X{1>Z -i $Ei,°IBQBQ$,16ZuǓ?~,ǀaI뒫F 4\9)z#&Vij;Ts. pjCD8Ff%PEwC(%; Kc&T 0X(- J#zd (T25{@,zWң/ŐE`1~0;Q붶.lr")uED#LUBūoMzJFhSK2[y4".d|yNJlo%h*BmrI>Z`zlnsTH7CVEi}YÚ@SZ[HGD В&5޳ JѸ/Ǭԉ F14lzdءFr<)3MռA#}$R#`{~mv.dBZa7V+rܺ#w+s?p@nR] bBBTF= :n{O5($k3 ֩j< X>wImmؚldϱb|\\'qӏƆv\0; ݣ4Ԛbs)6(!O `$od,ݐɷsN "lބF 2q>鯄XKCf<*\KjXC Y&QCh∎Vx$1=퇵^`X<Hޯr`Ȫ`Do3-GEH DQhڍ GD.eUhT>g).F/~Gi}{Gw_j*%beDԱl.n㤱)^7ȇ՛1XoGjs{Qg'+H_JBb"H-cPvg~k\w,V/JG@ ?v!S)/L-ZVt!qr(= -te:=*]3oؗa6Qsb:߹ 瀣k &Ձ}l75b+%4RLjYsm`y 5 ,j{/=wGpq?O1̽7ܙܤfTI-R)*z#O_#dΓWKe)3oǁѵݿb]"۔2Km.ZA]ޗ塘 .kX#f?aXTF"U%QT;CIM9<$K} b|0~3}ǻ_ x,sxO:?'ā$gAU^X}>ҿ; @~qwZ9~r#3y˂F'ɤ_3 y$f$I$I56 Mݹvd熡sGN %Di= F{C7! p{EXoCzhi&ޓǮjX?#kq\x}x 뜣mm -?%Z ϓITu|R~D!ϒ$ĮF{4(:~kI9=Č:C]ۤЙUǫpܓ_$L:xQ.Cs;wm Bm̉ TVB b=TiG:$tUVup=qT-ޱ.H07A#=AQDX|EN|[rYFrF2u!#~ Š1!" 5:b%=jt itB&E R=DF)T- ŒXq#e$FG%T w9b/IܻYpjFLRtAdqb3"Qi`QR݅gEXToZi0$4$@O};zPA2U-/B ȕE [rQ3ˎ4HW׳8WvE#0nMa׶_cчO6Fmu.p8Krȸh;o0zūzES&Tu=/7Q=hfGic*Czw4B)m3I7B Wq\>} mXS0'p&.4vj 'IF/Ԍ/ۡ&OK7%XW-$60ЄTcҢ7ܴ)`66pD_A, ~2$aJߡjBQ,Ḳa.:mձ#S#dcW2DĮSِf@ǻ_%vל1{ 3Χ&F3GQ滍MjDQ [$g~~'!1XX8G$HQe\G>3$% l[T[g1nqw[]VH--&q a$^7"D$߇FՓwSN{wGb8ZI2d=&Y]i ;J+ -9'俔vG]97'ܱO9#e0|yľ^|(VJoJ6ֻFQqhoFXI~7balm= xs{! ӈPb,%.H& ?,Kr:\]owe\Uɶ8Oq(o7dC1-_A$ۨB{ ?ӏp$7{dFS!tvH[#-Г.ya'?'Sm ȇFbw}ɄNJGQ֓zB&hqO\εD4!Xk'OqIuE ˶՗9"3yQ65ÅZj"rDD,r7+0S"ubۂHLsR@-K<\O\o=1fY#x@czAn'`[; <: -<MkfKu܏bk=SM:M"MϦ}i"WD" "XG} JІ@IJ3g`YD)_gcH0 --/n\7nb1*$2eȻ?xeqIM(~GEo/Wys - -@CCP$]2$`bSSȑ$غD 6$a2S1LM? +fI)ǭQ21-HX8zytC9_aKm7ʙD^q^u7f%x -ws'pEg:MPN|M~%. ~yƉf]du:3%Sy$Х1%UÀލ4߰H6z_DV.;tzkluCƆ}$sԈ'2F9&B p{ _B|6ɧ+ +|::!˼(FZ&Hy"r,:"P^F ,b?32lJW>ahvN{ǡ[4z,Mui0(Кu /}X!$adP0i-tV1")( BZxR_iԃ%[cx 7jYq!'%@GݓUWDfZftZF< $JM'K9P"Vд"U$#'z6#6"~ٷjPFH?UQךN"\׍l~:z xODэ:UWj"hnDҴ Vb xL8ܻd -WTKǠkmcw7[ؓS}FQ@dbf(79עFt?w!j2A0"cZКEy]R&0fʓ:CC5ͲSuVŚ'E -6m ڍՕzubґjDEWEN/ؘ:ͼboPCaϻi&G[盯ьCNA%^G]F[-tܲϕ!#:-(Fb/X]d~zc=7m7/F=-Sθԕ]vpM<ϱ'6&_6DCR3;>I'H/Gy_a%0V $}1> Y'CҰ,W8W]/OC&Djo4I:UǧmTi}A\C.[I kO#3u1K7C:/`GiGGgKe -&tΈ=eE#F_HhtEW7F붉"{aJn>*>?$}dOhNSytG"b81e|m -juwԄ*} ~ ZWaA*hI3ފcSp)3b߉dıoǙ2ya\;:|`[9t䇁fa=/#O([OTd4Ԏgz -advFڰ=PAX -薔E;QiF#K$dt1 I ?PD|8%bm/bL $.>.A%*,zґbi)ZFM5z6>'RߥR( y 5MU^9Ђ4=@ ^= TV=c/4NƎu[Љu:u A1I۴t{ nwn"lpdk@d "wbH+tYxewxDžics($xćQE6gc[u2{Tfl-joI'D\TV8+Zlt~ܾ#tad$L]/Hd[Hp/a^6osȮtͯ0")!wk^ohdmw/g&{!n7 Xs"<{r&{Q.6r<2kX]^jJ޼.Nc:[VoT"=-LCMP$$||0(׌_#n}:n#!uIl*K'SV$!kgnb_v;'awiuFA|lFR#CLA[т3H붋I:Vi#> ZmWfF'LW \UHJr)rs;.GCDЖBCByvj>@)??Mm#(VNwۛ>˗(rHbl[Rmٶ;xJ~E^)JM$ZN'R ǭoV(VgR,{ ]ΙzcyM my3ÎOP¹F@R=L'{mv":r/w Kx,61?> 2gvH%Wҿga-? ڈX>*lbDtz6%5,'KĨiz$'C[ѹbh3HRP>I>rOVw7! sS/ v: e ݼ>[ˠwsZG5n%ѹ P䕾pX"=K i%tMDUja Tq@FM'[:`3ȑAA-,hHhCSSU -a/Us-4[%RzBu:IFɊM'WvGLz*KaH!9Bu6/0`KD06uI.)f7l!A[ȝԮ{uAz:n?fZޜ'GM̞d\z/Klm -(o !m+A'$/Iqa 7xbvc-I+et>]s˭͆,),nBU'4sY((RJXxb\ ӣm?t^mC`NfBڨLe2&NsWԳ6.L.Dq`WOOTs>fO~o.P_O?F~O# [ ߰^tGya| IqO+6#EA{_&L?;.ԸVz׬X1M3EzCIF:EE|SߡzIW,6ґogHC]3t=A<'$쾅0Zt- IvL.ٖ&Y Ec>vp)nX,OBھ/3-rxt~BdRAG/#~&tRIb~{n{ݝFAcE1lBBB"f[@-'^p~M ޲Ļ ۰Kgw>ǔ<89I(r dP>1r&L?̃MOKSg Lq5m*:{䋷#]{} A:uEnK!~X?SʟF%݆O7ljZO ~$!S8,Q[u܋7+'EtJv4l~ّs'cFELA!$BR#=8sNcbޕ%کm%"G-2|ȳ%Ņ>px2+M6 dE#8PO;GZf*myy )ྙzg{!I-h -nO2rBd~.'ߦZ(8#bI{wEg'TY{rE[DCč |7|@.DDGB6GCSgUks¼v_Ǥ붇GHͽ'F5~x'vIaљG7nJ9"ȂVݕLk/B2dŭ똸H% (e-EČiNEBP$?qe66d PZFSWBH thRЈ*9b- -ޔ Tzu~=;\UHHVGr)H솄QVX HBT;hz`;e3),r̶=@r3lz&> SLU~ՕT&EðՔR$2!%I!g%eaNC*,QHSwފuO)Md%'OmH&FZ_F?b$_: *jgaކ@e;S9)}Swdq$Dd{LO 'ɚF?',d,[? (,_~D&I_˱=v1U-m\o ϋOКk?ΉՄixJ+5C9qpDXZm1LA^s$! -x|y1YߤC%|!ϥÜg{DlVq[px4b朱s`=K5/2wC|d{)|h4,[n{hy Nw۰߽l67_31"M>oه,4ѵ"<]Oai$]K#*[0qOq4 -EM2++Ac4ͥn9{c^|? l坓(_ %6*$6swb1=Mf鹑#$tEUZ?CAӗx= N3o LW?Q`_GD$L,e:)E- ED\ϑokkl f_<(7rO&_J_8DecC'c>k݃ @iN!Toy~ hJA+2z T~{n_`LPNo/)b >'bIh`4ԱL-[zVN7[UVX& 9o.㋮GWd\u݉2p\D(b,@_#2Ą; 7q$Ґ*H+mcX -;[ -ܸ -†c;r:Rmw'F&Jhko6 -e x?$nh|,9z`B9ɈXm-rw%b]IE`YI[JF{Ib;# vf/ގDػ]d8knaT&Obà?$] 1~؂Lc l"ܒr< -# -6b,GɌ9MX~KgMG!$|6FX6H#ڛޛkM:n1Hht6^H = -cWQ[(O+ Bp:e+D%JB$21B:(]A)wfMn?[VTԛ*54EE Q!Pn%ZC#b HJA"(ƽEIoADMXɶ/B ff!IbQi*MTz&V)N=F;ht'TjM~Ѕ/C {{1l_Ȁ\:+TȦ@9863S/u|ź r/V r{96:!bN(l&%arI4. BhmrL6wtub5埅nbSMlI6ԋw&8%F+;ercW~op'cz #]\ -.,9؍T-¼ep$Xjzm+]"K$\qt3X N7F$6IРtp^1*,VIj.K<%#grI]Gf\6 ,󱲈~~py2<[S7 ~!m?;&B r)2#7o)#D'q;w4y6Aqbu#f"~ngE{LP큹 _cED8iI73(c0JOKQ<?;߭,KOzFwQؗk`K.S9OqMeWig܇[Q츗la~oژ~pGX7(~#Dgǫ5Ɔ&Df7cvPL o/!S2b zQ#ROzHfI/TM55l;*oy; ڍٮIvB[1=6d2L'DerKXPO陆~qW1ݸ$~)g6Rww R} &yY'@/B@I4tU/K-S˫ƴ#B׵1V"Ċ$F+*E͆2؂*;!BB d""0wRBDB"BCSR(P !D!]Ý=bI2#dԊF蛏.ZW#ZF=:VuzvЗꅣĴ.`Uz2DO4ҒhRnd&MiZ`z4պ?NimD7Kic1b-+NڣNڤ:ų$Ee4äzz*^-s-Z3M/ίa~4=&:EEΈ#Eص*Ɖ&- h$B2I4Z#RE4nז*I:'*$ЌjcQmDBD}Izj:*O4L2ԚƋF]$֏j/Et7nF^t?AQKԹ%5LtpJME!GcґKFtbu/ERif2hCхTbdDtR24mQM>%j2"Tb#\U [z&댰ؒI%ig -ȉcGjڈl$ToCfF[kϫ$M`5=TM$ sG (7HJItK8M'T^މ2Li6(HKU'Bd[ -I$C$nFYNj C"M/Y;i4DRNۛMR14 5Sm7i$k&h0+H)FWi"AO3LXa!7fS#$vLF?%oU/kBW t!] +xqq+!&s)@8d.9$\rCd6f|!4[J[pni܇?KGݧg?5DddnKJT:ʻ @ionQ?Hk/?&R9'D -[ICE)&O/zg@ e*!1AQaq @P`? @B(~b. R`us*"Dc:24\i;DSZ_[DTŇˎH c˲ \R4^cVXAjSUpX:K+Y38",R̜S%Wv^P %O3lJS;EKe9en#K/XK.ue]@Zʃgdd%x|s#n˄QDDE}5K.-b]t[ap.r5ȁ{bb">1u q/?xlr$O1i:ىK d݂2H>`. Ñ*Bl|.]WL FGK6KFF eڱhߌBXCdpZCbZT%(/Y#5/gR%2K.=1$3^[2Y5,|l+S(beɬYQ5\p] -_Ws) R;,3 n`TVXt؉<-"]C_-1:z thx2]ej;TcKKvC#ŗȾiW-M%B˩w.+LTN+4'YpvȋNGbA6kv} 9l6kK{,v5.<@XR@SM)ˇK<9)J+!plՖ \Q-%,{cU!b25ڶ.NZ‹Y{> GXGyPߋʁ^em]F|DI3kv .V -Z+̺`#oĽgbϸ -qKD Ip6s#<.^fe5/T3KGBJuN-*vGQk.^/_̲|FJYQ]zQsfe, -gb"me(RSd(Tش,W,b Wyu1Y%E-_Jd*rt(Q)3n څ,%gbе ۖa)!+pik^5jy,g]Tb=,TPۗe |\i9<˷/RQ[_s\@`6㩵S&x6D[mJ+2ET -*&(R[B,9,";6~:v=eă tKkeUBe& "gp - B94Aq Y*QyK0ˢeZA;>|M1!ٝy\ G'?Q䬘M:sbxE$Zr=#[טYF[/60J:r`B,)8(>f Y^ :UB*\-g \bnv? -#ZTU f6"-vup=UB.nY2 ܢ"e8"i0`P /tkȋkFd1AA,D̍]T+>7܏nYr1<$zYwJ -Bš_&`0T\9~3fCRc*c --kp*sN/=&ّDQ(ܾ˃{g.02PJۘIDgԮ(CG[ kf* +E_FO 2"8ƣq4 -mY"9S֥#vUDWƥ,I(1ܵȉ<%)c -VFl%N2% :K+eF9|4%| ][|Q>*J=ʧ; *2i"eξ-s`\E^\tK7#?SDLB@ s"f?)]Er*_n"o#Jj0?S9)`#q)nF9ExrY<d^[n[uPiaٲhȯYkQe[ rG&TȔn#("*A*8H'Vskvw-mhNӵp -BZ(PU^%ɫ J -au+!aq\ZCl.t.OrnUTf; g!: -xmO=TWbܵC82_9{cb"jB2e"PD.q|Ty؂۔e༟|d̋kp<~ 䥰<pHSJAr=f#w-7<'.-栱)RE̳'iKAQ qc8%UP& DܽX )H)?}SKk8 lDj%a.veBX†.ƣf_y:% ظc9Rߏsk."(fKlx*\M-Xn -{LJ*elǰe|Dˌ0 ѳn*k]e R l#dY9<ʷb -V#A(V.(dCOQUF1¬Z&oM<fbkD -yd$3ZL\Tqƀ/!V͋P4|7cw|KaT\^!6F -ge[+Q.(q;OWY6İ,1?oŊ05ly,eʠb*TF[ -J%遷}\TV݄v+`@Qs7ȵPbEBt# -`][Yñ8T@ԍR6`HT}'ʞFԽO rA@;i|]Jrje6"Q 6ضn"+X׹e&_.Ta-rFe 0bTr&x-rtC Q#E]A,-5؁LVP`VJzMK#]BU`/ER -6XuTTƘe]Mq "Ȧ[Ɩg?CKEI[p}+fUZπP949nC'a6"Yp؊bŧ&C*Fnug[~A癴^€rv)(eْY2g ->.V&T\uK c@gB('ht.4UF 6PaUO6kQVt.!j啋 ZJ%3q&c]>) El uj,9,sBV U$D cLzORX*)/!Q`gk%0Qeh@!UY˨\yk|%Z0[:୏*H\c)yTR\ jȠ[.C;K eJfDʕseB\v ۖ](Dc c^6X^K"*1S^3Fܼ%`WȫW3bj[ZeK"EbQj-SrSg7!+: @ lOQS&Pmv.UNJ1τD%? D̽I G. -UU+"o%Fi KUVͬlh*ڿqJ)8qPZۍ{ q |W+Rʼ Z9: -٫/.0^T<-Q- - -/`*(!l e4y*A|Je DS:MDDRS4"fn9 p4ȖmHۄP* .(ŀx!v,$C+6 .Un+2j|]Nbog&g/-.]gh%n,F:*Iu,\VT*"1nQ#"ݱǚoj>HAMr+zJƔ2UPu"| $Z[`D]W>+!30kZ`)ͺ\%'nԋ -k.>[ BIaݸ"v6V\#ggG*T< -8B, mʁڋl*(Dz>"l Yo>XPCu<3V0]Nv+6uJG'A AQ*%l<ī(BgL߹[ՆUwBD9ߊf@jTvQ@pKJo(`\u5 b{ >%Lj07~]hܺ+--KbN'8O51 >.%1@s.IgRv)g7ԯnReO uWʜ[ rz׈ llbN*1`A^*~[vDLE_"BxELOk,lE6,..CFZS}N1ωT85Żs -V> 2wu*>7aQ`F6\`T}5*-Ͻ@[.ޘE4SH6Op6Kmt^dEKv)3J {-:#`~^@2r 扈c7bբՁr 8>ʊ1րe#+Fa.ʕσyU-5fl-9Qsei-єuD@[,ioeJm[[/v}WA)nXE*KmyRSgTTZ%J}J28dȦN .M\KNv@ wi] ba;P+MX"2"ͺS'CJ`Ky >1K@ EvfdX+B`e&ޔn6\%bhsׯSm65x$M'z`&R_ T(c!j{vo=p1#XV"VQlض:@IFO=]J[3"s艐e۞I3r>3k%<.TJ+&ln7Zm K26A}ōp/x Z^i\ Vbꡈ,2}mʏ(ׄ@kKWeMjp´W'~'F yG2-Zl-eT>"w.)wpdu\pW]`PGL5iywp ޶Ť#g/y_q=dۢ_s :JM`D0?ہABF硎?owxsu96ZF+J>15.*~'g5(bql`ħ`Ok2adƮL9):U˙K')/x2Fn {PĔ/"P<Puw-ME~X?(YEeMa"q -.̶D87'eQ?aVũ¨AԮ,aw #U\bۀV%ʿV"C9D>sdxHU}tƭ|TZCn ?ޛwҘ%;TJh o(!@,\9JB Ơ[^jT}ܿ?2ؕC3e~KO2<*8W ն.}C c , -e2C9/j[q/.qOQ@@>.m\܏!n yvg\&Ԥ~Xcz*7*pGY oܦÐYQi#TE6?e}l2]y,$k6Yh.WYPGa)!x -a[["h^ H O*H9˚ήQsj]ŬTaB7R^5>7IJr-e :y+1S(բ ѱLR,=cPM -mʊC .rڛz_Pc*:G¾K۔R*-vRLUyةjW_̪ύ{+QduPp؏39 ~! -nމs)XA.Ψl UJ\ԯ&2cw?hdrpY)6_WlCp[Aflr cT|Uš!% -EܻڝgD2d -14AB ?(1t؟}2-vyOrF%P\#CVM`R -;8[7+rx)*6חZ.]-2 FV0=!,}y\gY*︈0 :bBBQ[Ь> =4cTּ~|4(}n+R1B FpʅJwTl3Ǟuʩ˛kLg~\SYrc')b "ʏI{ryC˨y>-Щ|bˁ8K!]M@DD%莜BlȶDU8"ű1|6 1rYp"p9nnbKg`M :GLo`J_$n86dWJPC)ĕy[kͨЎn&aY^ı)tU!غ=@JNڸybz`،f%z%c;b_w`2Wopaϴe-a5P[ܥŶv#b5CKs.[& a{^UTLy\Z{3>a[IeL\v~R,6v2A -XR!в_nd5AܬȚ!ߋ9=[ypm~ONŰia@}P1e}?+9יtYǩ9'n T.S< s%`Tkp@CUo/qe[T/|`zAqF\ )/AؿB-b쪸,&z_7k;lWUN[2^ |,%kFZ:F(96=O'b?iTUl߆JkHٞ"Z V0T<)q3gl"m<E]i*oKLLRWCv"9bhq<JAs[_ /8 - 7e11зxcPPژs)[EC'ξ՝kWy~w -bG>PԢm>-H<6Krްy㓬ķ?zocm ٗy8(1=_+֑ގG Qj -ۗ3~訁I˞" pa,ԽH{yv̈a`CRPo&%[ ar]X"p% C.רQ:>߆'e IizNcp1a-JC Ijpe@|E, VʁڢA%lT%Mkbk[#V+d)50iIqED#C"g(HQ|=lU -࠻Qi,nrsy23/̓?lǧ+~:nR56|ZKo2rpovF={BQ2d<"ih'y_:~ʨE>0rjHE;y fm&hr/VP^C}:6G!rbJKV1}:j jQlk1vgˉeZb-vՆ4x I_>u%Lx"_IdXU*}GP<|(vYO2,%|8ˎF{eƦL:<ѵԖi~QE,1`BaȽƢpNvwq5ŶM KC[15.n0˽l2EFNEm œ ~s/MX۪B -71y A3#~I8m[bagbW*:fѧ֥p #._Q͑XQE -mMNy!^'v-C- 6zZa B%|_\؈RS:Uy4Ej}lJEG̏>+"n\r<?0X n?D|3yc=2"#-`1gg]aU6]s,L;).Tޑv3`@j) -y@Zi|"ԕּPJLT1%:RAkeB pR[r]( -J״]Cq$v<#]ZW M 7~P?#S})F(jl4@kj^8j"eN}ukjf4)99<Ő -h+qEgJ'PoedbQ4KYQ6矆<ihyED2AP%TSp}&ur>+r61?ܙMUJ<ܦ70 -vYckE0_n+%.y';( LhmeN\īkczZ0Ǵ2>%tƣ)F-o -\zTxs7!},4-2NS|nZItL崾@'U[xmE|`vza\p!W Q16P2h~*3v y"ʉY@`~}ˎ*2|rŖmBJ.͙-;:b\Oǝb|" z'PYIV2lkY<_S%eȼe ,{a#p'(.tk3}OŔSߒӂ]O_iLtw<1 ,Yl@?%]W);yiʜ~XVKlH-#s"8-źO7aF9p͏Ubj0`Z]?Rq -,PڏX>*9!TyvQk+U܀B[SJU8vUTT{YL -$x 9RRƆJW%[45u.mX'L`63G RؚܳZ/tʡX}G + ݌X,iJ7wPK 88[&R#fZ)Śf4HO %AP98~\`m7~/0yA"DTH{'n1mQL\ˍ@ ښ6+eC0OR,;*LGa~ &KϿ_ŗw\vAPlEAvG, 3S&[clt%jb͈UʗͅT^F˃g*dԾcʍ#٘Gw-<@_7dC#~IdYڃ{t6б"ax* -7d[X ^.iVJ `B"4 -5fߴUCމ 0 -&:Tԥk \5uԥ̓rYY/K= Sm"73& gE '<͗pb_w/%2Ww.I,.e6 aBש,xgb.hL\RbʞKJ'(7Tt"c2^%`d|XvmP\A`#B$kĻ`Y_JR8[7⼐%0$2FDbĀJTVa\1T+S76e=˛qKAo}]%8/E~"*LS6i eYXmb? ʕ)">b|²<~ BZЂXŤ6DJİc>vT Hg=GP8, wN !dPW%1b>݅磢1S]Ԇ؍i>a5% -ĢG.cy"#k9BPfIkqO&.W: qnϘEܺV㇒qI>Gn`5WLg~&#k9ێv^n̔:Qw ~½Q -J>hlP>*=A/b`q݋K,PjQca -˝b+[gp&"1*J "/U/qj#ѩ[pgJF|+JmcrD_b֠X@+*Vφ ciGW|Yޘ>@DQ? Nx3qL_S~&_6vҋB7PH l6< !_l_'a䂂XKc's?|R/J}Fft.58Gp#bbr 7Q()@q#AN?CP~ --3[Uҿ^;eߗ JyWʏp[r;N'ꐖO2."kiwG+%kypKE<KTMz%򽟔Q{d#-h&fwjm7v>/n7_ -LVH.1W Ck ] KPA,5q/J <ԖRK텾 j;.Tk߽.6ye?ĄJ!"?hj{ȮNw)vꠠa!_ (Mߤ@RbN\|E7/&&%?qst?(xio2all61d׎_Q#l匒V"Iwkn [F% p < 6OܞzV;PA䥑yG] Wc2awTD.YM>+ YAN!.dKZK+gNUL JG$J#6p@W Xrֳta$\ @PU\Bޣn֬j_\tH-Rc次Ҁp}$@b.9("aP~~[y7q[t>=DK-c./V"uMʞXS!_3 YEߘu9y*؄j j+iJ5Q WvA ``zl:>G> S-U"WH -bcrədP7!F]tV[]%V[id牌v  guN %SғNdc+嗇*7 -y" apgJà#|t1aZ-hY;1 (KU\Y-Rʀ薆*QM Eڹg]h#l]MKCSi/vw];HK:5 "6F7u.$6HY.S"˃Q`6Xe0ZS-!o,W7#7< -SC -~p&Kٞ!eqy -SK;/Vs|"TJzٗ71xؕQ7j\Of]g+enJȊTcifr'hkJnm #B;Yq/Bj{:cmA_R 멣Hܚ )er+ҙbcFS[CPTrwh5Q>݊EZp^Ōh>\,2@[f9LKɺ%R+T.kSY P|$|kGUznġ6_܇rwʗkJ)@PAܚʂ'l}8 gj-F{ {~`ͰYQb%˞J>zEY[,'f*( ײÒW(A*dkEyˀJiQɨ ba-EZRD%E&, -Wyf%-Nx࿁b8L:5 Vƒ":_bB(͗mO_ܯPWŊD̜%2$_yuw?jWAXkfmh MMkDL7i g1?ێuk1C,.%L+o~.`2{^"\DYcwUX4aLlMj8(5Nc~eunxtFUKe? ?@ >)x4(%} n]VD JʫS8Jd `SY+R2b[ۈQ;WJfn\pZљ>c͔+*j[ˎl+}RGg>wwaV`ƍH \{пNBS}N̹ibȉ -#oS3TvԸ QSy_*C[>,/cϪ>ȫ?J,>D#@ {+jWPڰȱK+[/ʉL -ga%X:x#伲TqSQjuZ2x_#K `F oƤTǜ0qLm S !2ka$#KP%7ǘi`Uz8G/,i]}\ҫ kp eK2madA\ߋhKc!@JX0 -"B'Hzgi6B&au@frSF|l##0/։eEw)bI]%r?rبaUc .R;_3X%S,ged%.0QYv|:JΓY.f @Ð'$:AaQ؉KX1Dపe+2xO-Q2\W*%/P\dEmJ#WU-n˨Su(m - %#czA֪UlqK \>J՟z(/Ov^B*XCg'Dr+D\M(ﲖŸD"r C/ܱV8DQu!W%|Ti1 O-*=W&MX.RT|Ddtw@0(b|]ٮ-WCF0|O!ʀ*9:5(xns./ULVqRQ4a!~[r) (|@J%ʃT -ur΄<^& 97b] -V@=PrY0cU~+3 l_Ʒ'Ľ#`rdv#kd%٘qJ&\RmzG!Dx4N!:FVAv WENG-(+!]+ue~*ِ^O+)T|yiR4ax*>)5ȩ8JPߊM@Ig|\?$TlMy1X -q.V3¶_w!U|rXۈ.ArɐB^Lj9a] j,' 0IҲΥe4Qr*-50T|/ԞKQÑ N5p˹:Ans*ɲ|k.% tsaq6H(DO˶AVR[:K(?02QU0?=ьUPy+!?fW/ȩz|mƗ.ƊRݍeeBR!A\)s/%*r>+ a -Yo`(r)l.8*X1cn;,z]\Ĺu zv v,W(] -7܅{MKDU1R[[ yCeOF4 \->j)qv(Xu]qL^|oƁ._V,nOC-mʢ)sK 3J4*~E`V\)rRB@p<4@X7/D:n)t%jǡjxDcأGqV^IRTSb%/ hu!&~8ˍzԤhJԠFnuWABp -EF WPPT1:}3o NzYRHNv٧V>Wun)Bfa;H]C[HYKKVD6 ZgwVuR -J"+P٘˵V퍇Pa]N6i}Z&RG&\KPikqA*!SQ;* 8KY.THTĔ P@O|%@meN~Ro.GRB~BI}G^Bv}RhNr%A( 7e'v$I=:X)NnpQʎ2*pS]zBM؉WqQa*,[?Ranl_R!jA%|eKpKe -٥eزeZRݞm1߇=eAeB4).\fo2eŮlP`7lI0ښ?qQh-!^E!͚GeHexgiE^ ŝJT& /fE>&D_N- Uqp-qll_OzKqe[.-`"Ĩ~og) M˸{k.:c؝ʉr+KENp1їiLL[0'K@eZJ{|DZ -ƻ7lJt([iKA/S -`Q߅2M pr raSɓA;;.&J*Pe˔ve# -6Sf[o1gR@) .!Q[w˘mˀwY2UvEAR`j r.\ydY -|GWR{: qdՓ-rv$'az[5qr693u{ ݜl іE@g'< enMY+ZyWĸO0)dGZ!GIKC'Zsܭ;o˹̏e\TK3eԳ˽joY_\ڹ1QA擤)D -/bL[rt^J A[(Q.WeWg5-p/n)#.]PfffhU_s Ů1nEȐK'ܺςu|D9rꞰųx+ %r_œ: ŋDFW.ڞb7a`%`RˇxRR}ȐeQ۾& ..1nlBۿqfȭ5KGEkfLy_%J\O,I˂ B!j/[V{f|7U5㌥r{ڜ]K(7ZYS|~.v\5ݛlPie|bkK"laæVn a4\ZЍ_bZTЗcK1uJ.7y`uAEQy#u_ g -6?Lld T 7I;k)Z ǬE.I ^]W|!r/qVX vܨӉ&[h?#F%~*5 B0irejl; +kK;|TEf%hAۖ;:l,S{&L}KV -s,b'"ECJ֑Ε,J]Nr^Ɇ_$ Yw%5D|J./QYEK`Og@7`k"pulSv~eǷmRu:oDSpYc.f6T IuNLX\a *?sŜBXa7 -8*%LZr) LX:unT ,6"4e A'&r0JE"]T DOH L *UKڬ#q!F u=JwpVv*2˕_d^rǢL x!ڈb* lKQ"/>CbryڕaWU+BdUN!ZR bK QQl/S)SŽ8B9;O* }@EYzf%Adq+/jYQ"Ke Oı|ش\+X0L%NNwWq`K;) ՉQZ.%VRJe2Z$ڕQqVoEa(]BrC{.zfOE_7(rP*E|vyj)+e5vj-ʔ`epn"lByb,F<ώ4PdjظFusjt?P9:~"rRfvi6z!:쫻<_$SxȬ{NB -iZZ6ľ1 +cYC* ͈VWE Y2uD Kq֫܆T {H؂/72ݕn$Gd -z䕫V}!=/t % .^uHCUCDs -D?pW^l~#g?];UX'd&?IKyA}Īo#P=*zNSi/TMK\Uem,dIq[/)O\%׸,~hiPO0Y-!{ަ% 3b %RMa?F$_ښVFK;b ^цʼnɄ*nc>(L,ąVE{dyy2_s?@~/)ְ~h=Eb A֚4z%iD~${M]_A&Ef#^vp\* -pRhGK(g5V9bc%7p'24nLC~lAH]Ta,*~f \!#w!ط*ߍy>-UXr(JR?1niD:! i"Z P9"[+""ݩg ?p(˅+7G[ -yێ|*e0YLC3)dxZSː> `WG[ozց~T:) yPjfjW2Iژ WPaAW`;!pinVٗԂcpҡ4I( DѢhxC/=aFPpJȩtu`-J 켨6RDYs.5q'څ Mlhq]di:A{hPu:=VC.Z ]\;j (7g!ڕ1X>/&vX[O?xJbeTK@aʔ rZ\B-J^e /J\i?C_3߲;d7Xt2im,j;+;X5TSFYWi+D(Yel "wyR\rݚx*Ymu. |^",fKYrP9'f-kܯVܡcp*U׉I(bgedTxʪآU.Ǖ(0l;/efd):ƈqHKV#M:DZib7HK䩽wP)ȏP唪Wܢĺh!ҟ,4Գ-c0z\5f|ر Nz"XaE56WCrl~%u& vk1w^"UM'Pr+|;H/"|RT% '(QڍD}vX7[KyIG>S%*lTk~{`Xf -N&ҠV7 u Pc>(]" ڀ ]auT*"/YP+erǨ2,W*W]Go+~-l2ԗuw3z!0]/T380wJ5cc >*{#u"`ңd57t_l{P+n#nJ:H_]ܼj%E}6LiО@0+S֦QwojJFU MPUOrygQi|0 ͍"rJrO˰&\fe0yj!wP& 9rHn^L /¸o%*q7> 7,n&MsXńPEP^)*ӑP>|+?rD^go|mxP(Xp|)[Ȋzae°8Ҭ*Ws#mdy)ӧu~||iQ CXIcz(TB~1%Ց-g+0]jW֯ ks7;b2嵑_˕}ɨݞD52K/XϯXue|z` ٗ6Y])q/#eV 'mJF7*<"spK`5gXuŀbܫ+ar|uvz{f[˛Q7{֒a)Ժȹ4,Zfi%o;q -/g) [ɑd_cU|dL݄d# -x0tx?r5>RWaUB{aJSh)R~gENupuO BRاBrTgѧEV鱚0]#-W4o2]節mRÏ<߈gj2)~T[ga0-m1Qơ(=͉eJ3t@6xDvi/'rqPf\ Idy kPEdqW# -5ߋ%9Sv7);k{*ls>qה*mcfʕq^ -),,! -sjo(9%n婀yoUf^0?s0JWAy'cfo59S l~H~ R&?J$Ba˖EV|h\-NG5` ج!vKj씺ruQPipPr] |\\zF8#w/.d_>!A #Q<\SVx&Pćy-We܄Ci]6-[̕&ŝ;(dG\܁JA5C 0j=M ]*5rd@īp% =$֗_H|bKm|0EOY!ױ82 ,,qPB -W$Qjʲ Z9P5,s<9~k,۝!W 4H%eSYwpylj>wd҈#LTTZ(p\'16k>'?)d5n_S3v"[[ɩs%RP3a8r%ؿQ_;R4~JpW&*Re|=AY>UʁR@!߀yX- ]NgRR.-cw*c;c4ԑ67@_S-M'$O G=EWL`'iFϊh;Ռ1̧_Ak Gf`65s~huh6TÕW߃Ք^l*+,}\<^Ÿ -LO[Po"Ի8ߙ+xS*=b+CT;S 2)SOvػ<3ļezDQjBeTW,x͉p h>9SS,B>f9+'#e@gbǰ+R̽P,JQErZ9,XAˮJ_QEj-5m. +)%AhKXpU_{T[WIN*UDІnUTnd.K[K,R/Q/ hĶTol#3|g-Nas |WܕG ZADRЋsY5%F<ܺaϟ6 :xZܰ%-?~Ҳ r_W -y -*P@՗-L*>eQ0H( HyeTؕXñP[0yտt-1i -ګ R{;zFNj?QKjѐp%Ծ\T{X)&cynDЄeE]f۱"*\QA6@W[c2"m| e -~ e$$;-Y qTZ."jTBxϪ}RvYnE>/.㈏12n[l郋0XTb*A[%@ש} WmH\F5 j,ҕ:'<,ܶyJ0|&vUvxDwuJX+Qʩises~&'EK09 B6g#p|Lp.U7\6ESi?QUCAGh6W&`K[ 9qfdۨlp|%yړ_jgSc۔lǘD~>V_~@]3o &yqP(^^@%n8*,B ۿ8Tl#,/*0!A,&x@;fD7D_zԽRk)!^M$( )bjŴ.E -:; RsyH1uM"MLc4ֲ[if-yx_m7TԼTۄ-&T} "h\/?D߈Dtf?XtHXjR{%@+uXA_7ZlYۍ&AB:Z"!_)}D˥~Y ږUu搨*Yk4F࠴J0 n1Zh 8TSε67)mqn*iwn), ry@͉?oزeYBٺw6듄9D 2Rrtֱ|bq"2IK!E];>@7oc .f|d;k#PRV-]F>r# -᧷'l⮋ʁ%ŚI \gԣj!RʠvvʍʹTAj־Tn:K6b0}o5Ep"EWbKEF&%۷*ʊOf`˻Z`4.r!휞*#sZ\˶#rqQ$L[hL 7?M!V `5U x+PNK֌öhVU,(L U`4ƈ#RND7 SڂQtLBP-E}D),gڵ L۵K"~EJBv,\[HqQZr-%kìxc.yO #8P(,BXTg~Pwb~[9u* r}]AnM6ξ;[t̨Vm3Ql!ž+=vZyAQbL%SnrhvZKe LP".->U_@&A+̺řDvnǵ7#`^{na^+0hXQYQT-KO:(`h\ZT/Y)yoqRlhUDݘū!!ܽ)əkJeMqA!6jPTBq1r`2x!dYb{Ge , oXCjx[.%c''ۗ['fd[q_,&i%*)S*lYd(|CY-QԵ໰mGvfGJ\_oxT7*Y鋦Gˋ,*Wu-2cԼE#{/okd5WCy8#ID`Ʃ6vB-у,\UX0 -?pVay5b"ȹ6{VZUd-:v&2Sq_0 z~x쾓h$!# -rZ ˶]\<܉)Nd -᪔_y42W`3r!;pnnlaMȻW.vU2 [_Ĵ`&r(Nv!bE0 T`amK\+w%B:*rP>*/z{t]֢6J -5=1Փg{͐2ljE'Jz˓ʽluRTR|eEbuӭf]U11!iŢ -g| `GQZE'hQhM0q1%!#*.yٰԾШV1?URy~-];a9dgYrγ%NJBze_yGe#*bʿS-L*-uW,ggû+ Zj~H>($(Ũ\5n?m6yJ.Th,.Rų -YF5jbX'QOPD* -$yDӵD{4kxC6?[rȂ^pmbz_@=gJU3XmT.7>|1 -vZq: EP -`N6 ;m:gmZT Ft + -u(ę?#FUe\DW*`FesS{*.KyP`|#*=LBMZ}cTA\kouA?B9 -h CβSlr^ңQIHRJ %Ltu0vyr+rt0%!ر K]g݋Aթ\*7 n#_F7r˻Cn~݇VKYrJ E:sLk=3+dZY<x?2doˠJ~ -`_2R`K+v iYV,b/͂-sn(V~E*`:f[ܵEPy@`X!?R0%v/]P/bdG\_QI,</Lo*#L&O n-r[r^`U2D^Or"2A@jqr ucRaUELgTB!tVP̢4 5~N7fq„"qoUs|ݕ?ecvp&.k%5?=M6ee!ioP^? wo6 K8`G6Фb}#¡ዩH$LHzX_4mZdުu]6023JO Sw0?p:=*.ܽųHT2vxJnOnu@/Ř8^GKV-Ru[QRj י$/<\B@.`(j0ADxԾ*^c ^$;fLJf皉b%ݱ#a^%--rܵ>˓]???[~{K:w#;PaG -+ŀb"/z]䤫(pcIO 3q/C,N<My`oI? "G \o.+$DsrgZ "t2 -55jΦ 4` IXVZ#F9ˢdHR~ VAz@q.T;;jLJ %׉pd*v;~h;Dl/-IZBYt*8 k~ -F/|BC+KsC$>U 9)rS+nT5R=|ٹ-l> _ʞIa8ƣQsVUMK_/] z01(2ؽ -~/[=\ǒj0U(:ѹ@ȸ%<R[ņZNya>Y q/̍-U#I%*P< 5s~OV*+TÐ( B;,mܸ ^F/$DK^ceBNy :QRwhG,"*Be(6_ s$mK2PVĢ)sYe-{aˋip\Z.=T8K#\[XY wYU9*<%%c |J#]@_fع!o0!Ր -lF*&"<½Ij$ ^KՏz1c#QLK -Eϻ*ǃ̵Tpk]R3@wp-r -m- YT<$TNe0y˓^zQG ^` 1lJnKAZc*ڞfQ- %#[,:sYUj1Y4 -T2_BA:P.j%j(@DCI~嵴|*xX#p7u3A9 \35 -tlqbӗ텊й&܃e|9&a& -D(`G!\PUl\,Yⶾ2Ȳ/&_R}hHRYKac9z)u U -'c -~KJx&2[W^c⬆x {Q@8ܫgrY]?^%,ZU{QiLp Qu _im3"k2cUWJTf[+]#ˎԬ ,B"Ep 4CCG -,,)_nڋRhHĴ(M$V-vzB6IR{0e]|ι6j͟ Pbv/HzE0&VI R-?ضa-)v -1 ܘsS @IʩukMpPwDEq +? kV`d@/_Kh.W \El3n>o(Oūmpc w,i-e"_Bhfae0~>`4'˄[a"sLd,|Qw 8˽sYi"(^M2T.cL$"L -J2BO-aea.+Xu8ofy%D]luԩ˿؀+B[7lx("idk!^.q R`d%m_G^FNʛDzw w%bRamh.͟5ɩ8v\ۗ])J(S -IWU07)j!Q܎=f1KK; R `ODm%£z#ى4 W YiYP71UyǚYYGJݕ@,;Dn@a5l4eLSRW@x A*W}ƈml76L Jj-}NƎ@ѳv; Jf"C@@5ĖrY򍾋,{D-#d6Oҹ:DX aêINIٵ҄H§;rg-˫?P A7EZMP%*FhTS.iZxl$oΉqCF$V,|%ԡ =s=WiQe:$]} -"c@v]"EwMڤA`X0OłQ4K@pN\ed~ cTθAmGA!¥+vtFR13`+Q7P8塬 P"<M*ZmK X- ? LѥɃO%Ah95D.r帒)2Db -nmvcsOհih KEbHhߦQLw➙EM"E$kW/J -J.H0bO({H\hjU^ -(>4vG-xAn75RaR6KUC?e Sg(璟Inی)ՑBW4?>IaD42E -g7꿫kX@ӆ^^dWB1`ž6Tu į6EGۉh{,:D)mjV(QlXˢmph6\ XZʨJs_pQ +><ʫ0 v/EE#%YS}TX"?s_Hj6U J2f+ʞ&fQڀH[Ua\%4K>@ԥԴؒƂ7_Rb^nV`"UnC-:z>ȱ=5Ң݈hUT37eL3C,ph}Iɲ #fblK X{ ;P -]~a -\-j߈6[gZhļ+o8``C,{5"BGR w%=.vQ=ڹ pE*0KmQyW%]˗؋̖ļ|Pє=5(d8K+Yca~?%>VY."|Jr6U*(n]Pa3?B^S\Rī톙%`"&=ȤsAWB6eWV*+(>S]Af -N㉠[|Nw#Xl+y%q:¾0-9 D%`UFI?8~Iv:BViEt6°mO/I)x kT:Zxu7 aJ'Z5&%g[H V6^{/UY>r$7v*meJmEbC_gg:T W0=dx px8{e>OTVJRvϣ.ȹcw%dË 8r*PUDmpZj-<شu)m8"DbIdb`3`dhNCIXKp,4[UQ. [U?rO̟k 7k`T -:fYS +8,ʘF_#-l` r඾+`aE=1F*XrQϨwˢ$&EEA. - -طQNA;>>u|ԖDQɑnexq3.͎Kb&8ҳPCZ] ՋREpo_@H.iD$"!&\Y@PLjT-l", ˰W@>%DZjZmJYdQ{K`a{/{D3{̬#e#H+j$CS N5T/)7#臶-MK ^LhT8Ưc|a\kYW:u/W ،rU\ؖDyNV|ɦpķt - K Y~ jŢ[V[PU,W٬~%F!Gr#]ŎSR̃v6J BpJ\,_,Qȝå=h@`_'hmty.Jg^/%J*cPZ/z}L6yD/-r".(0F q}"3b (Z N> ኶n{ -t\/i%uy,.<7Z[Nh?UmyOʰgV IJ}O:i!p%-?ija^$ V -^ تVNDd4XNӿ MUiȡLUBVA?q<+dpAVrЙݧ*rѨ= MA^KUK+S(M,^%Yv"Vˎur!LԨS4B2d{ ڋXgV>-?6w,|SlkXR&t*5jR ~8zDeQJcpQAE%CSOld.6 -[6 شL6wn%yOL1urUEKIΌGI0JX|# kM]t#/=^ m>˖T -{nWTf[yq:jR{a)fK=(D,'c8 e-Xk2p HKfd!Q}&mA{MJQ%j1Ҋ ~a7*w$""iQyA,4ا9N8+ t4m?PaaU7l)VLb-/DPDq -kePOj^h?L^M+`nxzYy/'rM ?3Lpbhy2F -2͢Ӭ*E'޲R?5^bB9edBE2/ODfJDF|C¸@'AaU< v IטV^ެNTKJ!-5U-b۝EWAqTkRhpb_XMCl`G9JHx my*\U6]K.ls*XUŋ[/.`Qmy\\Ŷ#j_l#f[񐙥1=ޥצz0zQ5oWTJJEĠ=D%s -O!Z2 R&(VF#M}k2XRMAu)qnm'\[LT\e-*)<03Qa j[h>ؕVC_\d{IS.TzIF~z#2J oVr?}V#e -+ ڪ99w0<[ |/ԿS7CZjZCר2hY*+ʁG6S0]3-n82je"h%ihPı֪5+e#/f/p-1k O:a-\L|5*(0^k|L|S{7ǐ WwPod!i-s;pZe޽i9 4oa3t/[, i*5d?H 7j96+.ڞQoxe,~-Xw4nbCI,Z#Jb_qy& - } -^'s+;e[jn.@11%Id$r&P_{^0~*ꡤJSvZ͗OIe6~6K(0fY -jJ2<{0DT&-Ly.ay36y@JY,II*,Y - #0&!ʃa|JkqIJ,EZ@y P6=pMe1'Ձ&/1DC oecgk-HO#B4SR B` n!e j.7Wk٫gMqDVOD.&oŰűaONJmFFQlGG`a(fl_=Iv:~ԥͅmw^撦 DCfT^샳+MvV1}Ҽ1zbjME}3j$CQ)lԹv#e%-[mlဤ9Ϊ1 yfs[L -EaQv wm l>ȡBtb֓*[u]Xka= 8 -ZC Ur67܀A6?r["Yy;It]y7=Խ|q57*d\^Mv-!)lj@̹Rׂ-lf6?(rΦYnV, ZȶؖhvJmi p HEMSj -%1#RS".yv0bh -#F] jR&k/boC/!*/r#p{ls*jfyQxQAH7 $[la<3`ljT"C*U"֕,(e }Edk (dQ^+?x@,-dUC m>W"5-6eRN0+ek ^Tu9%=))VJ*poenOY? ~si*[g7_9YG"bkv= R zSA(dT1P6" o 7n&vk vT -!R.Y[OD-a(x`]BFGxE|& KXXX1 ; Q(툝;-aKd)*]J˃L`QiP.TTة`e. Rj"YN|V-@K蕐 *7u-aA/`Crn(-v!rg԰+P-bYU2cnNS`vaUŹD9Fհ.>L@G|.;5%z -yVhPؠ|#=C۔u)`uQdDp,V)! VK;Ii(3moԱcSMUr9BbV^YBd M PȾsY˭6/d a$i7@JgtnD\m;Aً* JjviJtgX'vܲbB6EEU1.y+B#B `;ܨ)۲嚚,2%.S,k/8ΡWOYd0,n<"b^ і 9ӄ S'KY>fռ%5Z)fw$P3*W -O=~P_~%RC)+tx%5D4:lл%X. @lj^PE E>Tl=Eفr./Op +2{W` _YɦY]*kiח@ DX):cdT$_ 4ϚzԻu>(H(Ǿ!^9oVzTU/=U:\͏#ۭ1T *5k5UP='-5U|[Io!n @h*+Ye"vߞenG$ƕo o]^R__(: j#K5jw "/j\/MQ8Xi2.mrPBgv g:ˁ'l?kYA/.O!uQJ* U=vr -ƼN''n}DP9%طˀn°Lđyỗ tDU`^=+S 쳑Qj [P_%+,eF?taz˷&..[V:tj]*E 8/0"yJGQ7׎(P@2q! -)i%atʻF}?я-./Hfw}g+:Ř a~Mlv{ ORhEZʫFa+f`}a/x@)QVe4#YCv!k0|1Di:=V!v rp\T4`x 󳄉d% zUyða]9 s̸R|@ -X[ۈ xϼvX/qVonXA{~قԥuK ~嫲ˉjq` -"lJ"S,Bv>˰"&%|p -r<)eS?i7̖yk\1_\/y[LK)O Dɲ- HcݏNo?,y6McD&+gb)q%le):97(FgpET,F}|I~Y-e.6%ϊSp7W/T ښ]Xg/5 T:#/\Qz Gva' {XFևP2~ߖxbT5/ ~s^3C}Z$Tt% -9#N#TP *o@[ - -핛jS;uMP K>kI夅>a|0A A8s'u[Q h+42 aɳ_98!*bk9W 4Wר-dc否`d|/V`5 BZvo%Wɝ^>.]䬳P0v LO/,[R !͇A' ފd g|Ƚ۳nlH*SX1)|7KYS -),;ydHG_i|,a_=%niq+T&q ,Oz #̅m qܼe̱ѰF?}'JVq6T,'1BVxao%U&7zf -uS{-Z.P:#H?J(A,._j!-`jThPKǴ2p˒i<նGmFFKP._c%_#.Y^YHYPiq?:6j~g?`PtE6kȶ( >Uщ?tߎDwR2N eSqV H%%6s՛ 4& -<ܱ_PgƧԬ.9KB4((ӆ 0w*⋹ -)>Ga9/%*".S ]-Xl6A:̎hDpc.=}=:\\d~ۭc69@c,T}պ,fȢ&HR_p}*bG 67hFqR[KQJbL]>l=D=\)AkPepZ6(Qs*^oy.9nXሲXe -1.5L]\f;yL +** - 'Uh@ME#7 JH2Bތ:_|,܈ o`@y,^y Ğ"̼e -o*fTS Pjڂ kAi\WlXE -.Kd6湕v[1Z.-}@8[W#TQ *-z1lzT؅ȳW[ BAoy ) ^^A9u87/+^jK -x4)LA/L}͛ 6U E(K6|ĥ?{TMF`, e4K7WDQb׫p=%ؘ(fnG E6m\ # -ib1z  -FW6镬ݭi*of*YAB bdywD󋫑rKjfmph+͂ _'Mo@ZS{#%c, -蕵H 3&F-XT+ĴU.cy)e}n)?O=%m - N0*$J ~6&ٸWy9sL.]DZ ek8Qa}c0׈FʤLO+Rv +!); 咋;zOu3oƢD,Iy6v-zukr'W?!dUr,.Z;jG -宓K9>x` T)oeez٫B^r)~#/%ĸ! .m#Sg"eٕs L,O%dE8P _ pn@/խyTrV24 Hpumcc[ʍ} -ܥ:kfղ%<4(cL\~>@<4T$X`jm~pIW -qgk>1 lK`ʔֲlr,jJPZߢcLETprڧ*k{ j3j*M5$g/„ЈۙV&/t}vtXsSVU8^қ*~CPS7JhP(W' C/D,?;,c)_pTQ؈ibu _G[c` i撰k[K[{B=iBMk-PhRnL6q%hbT.YH'k}v@%N+ 'AusK/۱h^g-_6/R)<H/X&; V~ EoFzUr~g|7J/Y)E7؏A2RP*? >\5O,)1FT>ߕSm(ED>\jPb[+5/x {tM8I*#W#1 d Hvh!o[ٯ?,^xCա~BITݕFXW:a-A_uNA&&ʙW2oԺW4__ k_A`ԓte97m^TQ`*\웗l/:"]Ax',2TJw]RNS5RSfyfK 4f(;QC'%iX\Ջ Al@em -CK=İO"#CKEE,/U\u 5Y7eo<PRٔ=qcĈ쫦k?˚sT'*)Ȼ4M_pu?]&B"pJfIo֍M 򠳩 0"f>~'HЎvLy \Pcm" <\5Ki+A9dp0{O1Ub U~LtzgpTtd 11({npP}+zˣ붇f}S-M ̀۷#^0ndwxQ,SSU}0ZR\u}")4Cećb.gYc$Nz}e" S>dA>[`0(r-1ViT!(.\}zC Pw)P%ږe3ȅ&J2'P R*"l(KH5aPڐOΟX#cb5ܞwT*<ᙂg/D֣TW/?x@K?ϙyzZ5N)sد.]A&`}t"y˖ G-X2_x۟._Ǹ9SHyflP #)h_BQ: ¿*P߀ڄլNp؁ו 3Ce<Pܚ'b"F`3* Kh)Kc6~[j2pUB 4mbr1[pls3a,k*EN@̓?UelClnv 184nvY-S )j,TSj,[ ]%WqRl`iQ_E;@+jP˃Q/hBԥuD+@ Yp7 eS&<[MkK@ӳڹ% Œaiz2)[A" ((s8%Kj>e[CQ2Ԇ5(k+Zĝ -SPm)+: ʛQs>/%ctx ؊5=L8,#uhEsv\iȴ?nL,"u`X1W  uZہ* ղԭ.HV/ U^ -p -Ɣ[4I'.6qj+]}\J/H*U1zCzNۆ AV -5S(sQa&.!nb*)&dL:{t+)H}/8bV )Q3]'IEjO%dUtЬ r̍/@ Hjr&Wʌ*VL!yxX# -b%n= -!t"<ƒp -bZ˛Mf WTeY>r6 Y0UA]췒/ܶ[` `DzGxkJ/jDzsl.)]>q] 62ոݕZ_U bDLi*kEˬ[X9)-="h17*TV@G jGuAV$3RۭG{Ag{Kq;%"=ZuX8u"i@3i2/_(SCUV.MbX],Ǯ[mrg/8?Q8A}y~ -*,GruTX_(<ѳQ9ax2^\xkaB\SHE^g] _"1 -՟38>N3$bBe7Jd6Y܈GR9)mϺUۈ07VYLZt/ܪ#A\ڢpLh L+v厐Gَ D[glBl薱Xd2r쵘m@REaXM6^ʩx> -sHꊒک^RZ<1z $ĥZVW~캫5UUw㒐9GfX󺵶{ Qr][k>3؆ER"nTR\v?(+#LpV7O!n@X^ -,d]-M*m&]H'_6gwCBr3虇 .ۨ՟Y*E[v![fB̶-4gR/b<]Y5dJ7G1IJK#EҩXڦSC-NmEPSDW Yl6b.r!O*FVW\^`9)8jO\J6㬑*'OQre*T7ՄtS䦊cE2?Rr{tEم@rZ ["*=L(`t5lq"8c+ -EQ#wL#qK1[xQNi\< j} -.C!~B~` *WP|f>Y -]̎l; -DJHߝ{Mx ҳxO!a,S}k1S tš i"! ^\3"85JsywSȫkye~2ۏ-*I/W @}boHV;uf9ZjKCc@GyE1O,9,] dmңwZv 0GHTR#rTX. hvoƝ#ݎTQ v42M?( &D_Ѡ?k D^>wO_~YE-Y3$/.sAAYYv"F˥^7{` }Oo(vL3`h"W1h׬/V)Ѐ”\qZʏ}eeKjU 3?-(0/P? %[PW* 4Φ95X]#p&&n2A"q䫈Y ]G 9Eľ#Fż% --$mGRvMa@K,[Tqj/K{{\\o1>d27xųz*]sX;%YR&d*"(:_H:Zt= ̚C;}U(2h84Uce6@6cDRliQ._R?'4 ?{[QִI\L}ۚ<*Snr;#I UK$cFBDau(|#0ў!lR2 -da᩹ -4M]W~,UM6B,5!tGBpzh lj.[Q Wstk*ʚ l|K ӱxˬte%_wp(%5@Ez*P ٌ;@pP2US0 -[h3e7-O^JnHS-^`mi@.ˢm%¦[>&E]e |% d!iY,b~`ד 39A@ -iI8<^m JZircY`e[Xы5*ՔYDRu}?W~‘ :nCϞp"Zx2i5]UAk*˵LgPݟo}$ Wt\+D'jLd/ &4GZ ->8mX\f&1&!OZ|6E!ձhv -#>b>4RՉJs\b[lmYgJCBjJf)KPHzCpݚz$j>M^Xit0`#&"? DpLrˆ6*8eTTv; LQEQrb W`UD$MHHfRQ(QQV%8Q T:M(3 -cU8۳YS9,q/% O[,47EUTL/@R Zi忔X(ykX}X=[T -WE]IsMϲ&aK0 F 7UN+ Yo !sVc+!/tūGf]5|g*3,1_">KE-&oTիrD+*fLW1TH*lnb[~bٻS7gU%1J"hasV`/X͔/,Mb"\nAhNZT T2MJy![S%D7>9y(KH&pd/ -\iY -P[ۏ gn懜0Dox P9ەK`"&pB((h -iRڣnN jʞX.10 GER‰kCgrUS.m [z?Db}JV.^$UiM~!#2`Sp\:(%qN̄NNxN&5*֭C`sU`eQ%yTA:U%Ve~|/tGNDqʬWP 6Ո+m̄C#򡮕T%҃c!́>EF4-Hy.cMԵ^0j YW8{R3/?g5GkĵlG䈟kl*[5(6˨„_072gU)"\pn$e>!JA+!bH/GU@5Q(SBV@vq*VDen"4ME`g/ D]oD7"iңL~Ւ*B)Q*Td?[̒cce SRfؖ-)-G:Usө\[jsI+O+j4PWA3?35\mOPK.y)Eᓵ7q+B!Kmz0*2jZnTJ*>X#G@#F/̝ؓ$o#O9z9rEeC&>H\ZeAq2*Rr-rSOb]tK{,/&K ,^2EijMpBˈ[sNZ\8!)¬hAr%Fدk+D;DW@-D +P2}Ye((%QnPt3rkT#mB[cEK\n\u4uN--)P(x ;,c,mv»2`T xw ~NKd6Fp^@, -]=֣{H҈Z.0+qZ2IuԸpðS:Ou+Nد@^K%86C*צS Q:e稀GɀP Xw@Wԏ nlm,\~+=d'O:cUhF`eݤlmv-9^2~9(eE{ũ~>  #l*91"4ե -53PM%Qi`;µZHּƗsT+=ˈ%Th(0Ah%eKد.RP'kD@fڅf,Qvр6%w%O>_\l^KZan RtisTn)DB6B:P)2YQڜ{%a -+׈]B݆.Bl#r"߉X_(<wPwx\3B\ǒR/L$+X,RDy.,*$J€ 1ltO[JPC#o=Mg[DeR=ub,!n*܇kz^|[RH h>q8~p6#)K(xH?(*/rR\/W/3aBe#:UEʑ|nna_P#DZU츸jC{|usj읙֗g̶r5m 2!T&}Uu4[.kU;U2Qи0]FPK#j/G:!/T 6'%*JV("aCCahu`%LeA+!JUpe .hv;PI[nN䫪.rb *KQSW3]elk=Fnn "Z› rvW#7˂[ie^\~W8dQ -i  C2iUՖ"#~゗lҷV8/<aPB!-/?Z؞3V5vK +wkl}%Bc`L^ֈk`DZYD->9}}j#jBƄz1w"]W{X551Uow=u n7Q~׌Dy[g*Y -3YѪ_{6L+HκB!*o -'Itr)Q -ЂEơ' [v]gv+WDU`D,ȕ&VA췉@O n&9+Q˺Cx UNju~` iW/_QYavPia9YY4P\'CԾZA>';P1u S׉-q>vPj`?Ύ[  &ljiD,L2YU@z!Rp(7ǒL%hQOEz %Љ\}æ'+ p%*YwmDE %jmf'g>5fOU+aroF:Um -u?a8/T[5U]w5%?ʶ +nXV}r>*ۜ}@Qzœ)0\brV_.)\-V}CyN U -lBFʮL¯ckYR[;q+PK ^JṄ`#Vb[~C& r![ȿ)L1)6w#?-^C^ vo!9ڀZ -_(OdU -Gw]MJm__>i˽BB.b5*]UMhM4ʀoCrhHVxv:m ?AwWB9Օ }~8+Lf>*)/~]ŶDٛEs$?싫 +替S!6fGqFo@~eno~RtJ!Q;Eae=2gS:|5 zf`w<*TCTZ{ -2b1|irGKn9e -uɅن3B 2<6T4˥૔/ 0oYd1'R\lPeIJ e#FCae춠ˎւW9ZOԫǔ /LVG?xP^w3J#&VsJ?6SU:k8iwP֘G^5]8FGggQ20agnK-N$>MRnD.Q1rMDZVUޣ6[+S~m0*Ċ뱡d$WP6]nhT{6*Tu<9G`8YTFL[ /qyk/C6XE_"|xDpz)5f)'s5$VKvVI1e@?ke1 :=場|h}v.qPo[E-c>Xo#"*leK,[0nۃ:_k`XXT<dG7yKiY "~T@LeBvRJkERȶK.XT1 %F^L`T/OЇwSHdY%A-ODb2iʊSk^xCau7)u*Pa5)K1j\]˚]bݴx]!b UηȐyT NH$ϧ@Kf(b^Ъҗ{V -n1˖Ee.VvZ6J ]e:GR\p- -b&<{%%=*[y+n7WpbTKlpBtE.UxCA[G{-O{-Z -&\w l ~P,% e)b >|ۜ @R:I^nX{V /#BڔTA,-@^!PGmzح%;snpD]Jf4#`Ye+̾Ӈ#aؠeծ%v7$ vvZ=%{vsO3Wry^!<R_1v!nG eZ NyyT*lO3R` ܕhKgn`̟MԠZR&d -K(JQՇuƨVAUVcJ#P[񁬦P}ϥ.e!aImɧ")VlrsebO%gXj*b#E QHv7.T7lU(~&™@!MR*2\Ф!9r V;2h`Zej}T:bT muD%4[F ո.ΜcrӵUBvjryu¢z#egk6}*6,4xATUp *HU?؆^+ILbGK2Ɖ䥲*KjDVjxdTFװR#YHlodPU-癕[;FfV!6[9C/k:4%i4TKlvл05qYT*ml&*b[^]Sey05Ȋ&o:_yzxm/VRjiّTPQ|rq*Vl/rPEQ&`beKT>,JC CGn4>R'ªҊ.8­zpE{sٟUGN,^M΢ppj߶wO^'7.үߍˋU{5a{F kZ[F,pU rp%}U,VlS:i#d*M-{f mE`U^#lq@-4[k镾|.)Tlԕ?\W}0#KN|ڔ6h(}Q,T%%aTe{wXIh&ܢBסU*VLH\QtD >-1Gyb4<=i.(V>QYظ "֘5H˷3 Y([)-H* Ҹ/O}N(Z?Gփ~<VDH #yVgWqq'Dh|QZoo,«`rfLU!*@|Έƫ2_lr_2z/Jlo_c7IK(U9e;lFqэU`k1`@+ Ne_ ! 03DWf)NAd"n6H԰)n,^_"v-wߺMrlSw&JA{ckz]ɇ;('E+e'ʌ(='ZEdY}.!ֺjL'Ķ4B67mčwþeh5Pr( ]Kxs+T+p7EN^ 9ovFV譅`5ap - -@;Rxp۴,%g%]Z9_ű̽eNgN+,԰.gw ̩U+6T|-eV˛D@Bajc -&?/%?cD g%gN~ }V!geEfy K|VTf h(+MN4% յ4B)_vc記olHXto#yӹG\* ޑz>X@ Yr<\xE^B-_LLHG_,SpRӺFZPˈrnx7̶% S8N%ZJ@qa~] Var6 ]S*yS6 -֪)E[a?Hzi&uKBɷnUal3XU~T~$Lߪ\<ב˛h/'>T,| vR=rYx=m_BT7.> $ҰcnFCU9(7y ky3uթzM"?2/Ț-6ZF_`Ty?Z}vp9D>H4 -'tH}/am~'Ur?KP?RVq Ϡ!Hs_#_@g$wuX]Jil+LIۡh oMk 7OĄޮht,n+yVrE*glJgNx%3M>!nM[+4b J u^z͂je5&6`fUo5ThFT=˱aTðLJ.IuX ufQ_2>Wܖ,E]vaLX@K˥ezdo4Q/"ר$2%¶vDv)`T0u-+#=H_cyYGVi@hH5*cլ#ocͶ.xy@<+BW5eb4s|m׊8^A)j(/胭>`8̊ݘ h_~UWcb׉UۋwPY= 5U=ucҳ#H5s.>!P9T2^$.~kLv+|kADfF'[b#溓W7ãh>/uy,e5qK+51"% -v0 Y'Pf1- ǤaҢUص]FjLu}`%Wjj:b ,^Q٠T-pL7vGb8ʪ 9WLzv\~)p5 P k*X4c%t ?L^,wm3XQ͖ g yjwwnZhvUV^eaq-([xE+!b3e4CFTP5MAkSGdH\%PYZmga}imgvM%o,MH̯ݵEV^k,L&r *c4(;0T@}c&V=1>/F۩7v˭a]3NW\ NeJKO &p$WuqRV&V>4(F)G#Kb+XV*vmEZ^Fy[lJ1K{q>,5%E1[tJVSRe'lMS|J^K=@w:E -K`uaBW%K M\"}KVJUeFՊ̾:cfb|YLt2ȆŌ1kn٭F߈- -G<S:r,Uk` [p# wvWu!Ӄf8F^%ZM-M53[ʭcvES g XA}pmDjeEs&*Vysy1ѝ˥b`ш"} #TzD*jbEALCB, R鞛Pf/R]si@6d^r E"Ud@7'(L3KC) CL0K JZ!S jlYb9)˹Y8EQEj @ 8 ؂T.>5P-M_(-Kp%;EFҐRp:KvzejSMny&J0|&V'h%F"CRr׬j 0<oVD^LK+X˺ XQhiKoglfaT+-Vĺ8˜l'zzKv:۶G6[< *\A-L R +%p*U3y4e~ y.rHbP -]oW4f-@K4Q=K57rVyRf~Q`pqsikh|8;҈Dy4he9LNܗ9Zw[Kvtl9R¯YvPW[!TW{P4bQΗ3HǶ bfP?4u5ԙ׶чX]kV૔Π6x"%*X=Q{^@oH/_Bw3Х\׾ ^OTӿ/ih(C0eJzi`D9/qS-oıl.v璋2r3=Zh( 7Ns,Bت>^as, -҈SHHl)i0rJpX4Tib\o}|A%3^K;}-zd͐E!W/{Nm*O c5r:*2KV!xx)iFAP(՚UƪC6$4QԜ7ga,|/~uy_l/EX %ⴇi~  (:#MRU5VJ|Q. OXQ]ISiGP*O_a?IQkҜܥ}d߁{?>ܒI5?]O?]$0ܿR50: w ? -(ǥstxJ% lK*`wDs{xk(AO: ,2 'PJL>߈hwUlUijlBF;ZnFm1{s򸅎ܸZ"y?6<-;0/Pإ`I}K7%dR "K|Cv蔰$,=/͇%vϷ*~DYP^#ci.Ey-̀ZbJiWvK?O/Q~iZ% uG|ZDPHhgAw/v>[#_qA/gEד6ĕ{*KlM( M;3 Ygg)e>a,mmEճ,A:ˈ=G^]kXZlYw5u%څI`'+-]lx^kq]5+TB.Խ5Pn d.-2쫁F("4M n]J6 (umWլY?%~nX,)h :&J>lSX-0뭸w(o4;ns(.IUX -} -"fzMZBM-#s.";gI(d~r討m3?7EÃ%D -"Tԕ/tn-Eċ j耏fŢQ8C.iB0wqw/ԙAEZVyE`Nv4 rT] Dŗ>jzb? jg^B j6.;̄,M<A&b|GW[((P>%ua咠 xA>õ2X0Qe:\(bhzbdJ=%*.TÓ̭G?v;ƣ ZGl AJԲFt죲Yvo}wbBF^?C,Z+V9%˯ru9{pOMuZZŘ4/o^aHw -\rGte0BU/Si.ى0Yt!peǪrѪoKL&EZ0[l@W,,8xV-\ fS9l,_ tZKiR.E6cG D -ǥݛQNVE|˪L#Jv_z C5ٳCԹo{1Eek dԸJE>. -]}lRmU-ys;R*`egjn6kW[0^iREc"E1VKҘ&F M.Z52&;QvwgBY:&j&PKf )?QQ#(,Mw8Am ٸ>WH -6PyX+٩5mPzkH`?z%?5< M:Z\xS -@uUvX ԟsNƋؘherT0=93K26 _$b9!gh ͊Ş!CRkFe+CYRpY$-Ba]on7^oܪ*\^4Qu X 6$."vE6^\ %> 6ܸjB]9P/F+fb'Zʇ6RB_ʻ,H ; .2-̋C )`C|jeC'/$ڧPzu-E)SfU獓m h1\)>B4+qޫu#]ܪ}@Rs=[\tze7_;b -@9~{^hYLQU?Ej@\/(+Z4Hnz9h+ax>ze3l%}1ktpjJ`*-*)y_ʏ_~dmC%R+A!^a E\4'Fi*$%5u yc^_/)ۍ)lQV{#`Oc.ieeFU/IF.[ ve9[ :dbgg`n52tE˯1w4vZYu([~Qkwu6,dFWo؏?QmVRNw| RangKUe TFgvTa>o£ܥTܧveaFSu"V*'#֣~m*7{{dJQ|ŴPί+@U -= ˸9"`n$Tlܕ9Q?MU1J'}Wլt+IY/Y02[z<޷EbGRGħk -U-ZyV {&e~@U/ΘR {nدỰ$3+੸)L+d`?qcg7v7#y4ydHGk0V/X@g28+qYxNc1*"R]x@Qnj/_ͯ)ܘ+iS .@ - [?nu[.^[[Urǥ <.Xe +2=L&)}TҧFy6!~e.v(hS/AcJtZ}6YڧEK,17m*X%EbIfƻ{Ym/˶Z?A?YwX@&~9<=E~:ǿڪ**H$Qjn-DR -`nȬoBd)~U7=FWڥ8E~.rVM"Ąk@w=; t+l.c -@9tˢ:S~,m,dÛD#DƲF$9noR-?%_ő}-2 -~57⨱{S=Er -y,mDCPSw.=n*$Ris"7*ulٜlf^E̞C-r~^L# 6QN{eu_WԽoא>-Q'O^%8W<,=,v+5(L;SXyH5KߍuNqWЁ(Fn `凯/2*y8v|Zò:({ew`߸eYY\e䒯?;TLDRl}/XEPD$x_7D-?+oG/^Ub}v%_5:CmKM{a:9g1auj~_dGEKQAJ]WQi8ݲΊ*Ve,e櫼[3lZ?͙x@50:h^QF^=?Ŋlվq1߂$6/&=Od 1Bt

HK1츾kSIH=gS͋)`#€iQ{Raj5|AZRsjwjIPǂ,E;,Fۯ7xL j,( JX )A1<9ڄj$\+% pj%ѫz>9M#v 4lJ -!Ez[(Fa?iྠ;", -{kT͔yNYcQ X]tۊ;6M )lc.j[*uׂ'B)z8|}5۹.yQ)1U)Do/m8 -^-vB菉HGV}fʷ]m֥pi*(wTlq9e)4*1O-#-? (GUtK~ve@A # %H%>vnfMY2x=8c蜜;y -߄TK* -%eTR9#ogg -lW+>l13o ]\,߉~XpO>(.\sMN+>2wgrJgq/Hz\+U*#|2 rŎYY 8> 6HLeKۨ+`i򯍸%NV|VˌbQr$0 .%gc)> P(UPlY~*xnዩgFg8 e|N*/O&>eXUC퀶e -1h^6V iS}B5~ -[ْw BNPJhX.e+-eӺ.sq,”ĉl'z͗ÐqMcAo `agKG -{O֜hH?#?Q":69KB0vj #F.&Dk_V*%$jW/?&lߏ2L{Qu%-ra(BmA^a[ώ3Y{SooaZK@JyZY1{rDYe2GU2_L\6Z)a@cG/H -ndGvd;?l6=017ftGHw`ypI>m*!T(-beq֌~& 4m&p)"%ěO{Ni} ? Vԟ‚p١{ɒ>icw!emDHgRbr%[QWdƯ.`''E_pFD~ϟH>>"Yݤ#x&7Q4+E7*)/M &fn0^),2α^y%D+n.EW ؙP N~<#ŗQvIuipؘ'np.#UP>|YKw~S'_"r_6#%͏S/Z"k1ڨyOMXch"Trkp}Db{E@fY3Mgbaժ$Aֈ?<Ϥz_(`'u;=~ 1?}UsPVerM['9HKcƸ\ohg(|}4#RcPU?jnMO!z^~y?PzO5}$w2=tBJ?d;91q!SVםŻ?L{E~%?h6C jkYEA,-d ޑxŬ{Q J`]v'CK3E^?r_ -"h5CƝ2$\R8%q_FQ.rzcG&i}PeU]Dڦ`-PW`L5Y,i4S;-/ef{V2y䫙ŒZ.[eT.qp|qUó1wb=c2.FS̽ʥUڝA_(ѽIk T{¼*#l屻Z{pD˥ŽZ P+p>0hyZnTKݲ!Q c0mW,FSqWeXo3:*cdKzG^_U%1=F$^9Ac=Ґ2xY.uJQPbOXmGR%7Qp6c5F-,5#^鋑B-Zu*+sqe"xF0J"Rm)E~o􂙉?zB@~(wM<1uX.\j=Qol`E,EI2X0H*gweewp|vn/&yܳge牌!.SU^ŅW<́z}!7A& kNE劖_}7+W0J+ -VeWGWb-ݵST~dZN7ңKfk^шu^U?/+dq_h~1mj(J.hE,H^*!uŴQXkBj~geu7v֪6ͨ)hh2ҵ{$\t F`AU V/׊%[*. kvs -cfb?FFiJPـ+ kPVػ+ܰbƥ˗ eED#l*]'rQ*Pk:9sNBROg|'irEhʌl[2t&x~.?:˄"xsb>WjC]vY]M.:ʖ*b{rgi#hQD(&x9bb>,cj,d\*U4qb)RTw-X.g5ȗC.8!loX.3,/H-2Fֲ7xˌ>@¢O1M|KOkĶeeEhFܨ3ͲnSk-! E+!r/K\Qqp.\l͞HU_BJ(Jx0IoQSK9쁮^b~# L7l=Od4eSKɄ骔B 1"7v Z<5dMVfQP5fʃi/ҥu O>a*aB )v)znD' Ub@jm.5(rhO1VdڔٛsQSfʅõ 'F`hjiBdž}ˏ*j7 KldYaXz`iUE-\ -f] q=T%`|.-.Gz F+)M4pK8+ws.,#OV$yaUJVr.?Wa/\?aVKSb!^"`3.(pk-P-Cf5PTWVx#ԕMZh_q-7R[\@=``ĨXuKhl`ùAr{%ZQ Vz"Q$UDG+gIl-03e AŸĻՕ+^Hx -T ;p@+++vVJGʉ3^ a5T'Щ_ -&B! /TO"1`lEXilD ,E!;,<~ ]>ڎlUltWAL*G|6,0v0-lY)B2M?d ۄxohT\PQ|0]O#`(ԥ+2_2 {rB @׎0ܰ'B:_% -!>O-|Y ږa5-DRQ%;=y* -;-7˽GUqUsJĦk{^:l\-tWJ`UB?EDnBpO|6b#z }}CJ_%^%e ^XJfWT~L5Q Du+""ѵ6^ @Y%%^vsעZ) Q}F/)uN(͟DiEx)5bvSB:jk0߅*W\ -KTA>/̟hjB埊?o+&Nһ*uBM!bEOtsf90:¿.FS[Ba0kS{?k c}5ʤFCʒ@/ƶTN+d `OjrT_@E>Ă=*_VA֟#3^}Qo(WX.ɳj܈m9gc{3O1 -krs(^ |J ܩ_VP.ZŒԁqRJM1f>? >%yj HDe9Pt>L% ߻qoSşz@ )**|)=@]RB BXIڭ_jK,tuMp4sxBqDDeOJP@xOi 7:WOK2~Tk w/Y>vK"'tjZ8?X Y.CiLORYtc!-M*陡yh"T~>G Ly?_ɔ5okA*[ѿлex@+(~oT:e/(1-o{g.2:u!  U~1S4@gMe`"Ө~@XH@P,]`VC%5}r -GcnZRV{=$5PCh6ȅTxJ@IT"M^BJewF|{?<.Lqv,"K:ĹR>V-X#H&hq۴UR`0?|+SR%9.t*Tz߈9VK &>ɦ?u_mgc/W%㤼o5jZ_ )gK@RkKp/Q U`"moֹG.kE**ʕj* c&%?(% Q6ڇ 7ꮮ!m=U.g.j o!/ss׺$_ e,x?h"*2ۃ$R"nu/@1 BJ%_cK0(1e/1rF73"u:l~r+'en*%zKXidD`*"cq))NFQ ^.͉JZn:H.K6{=DDD`\Fu%0?>|_ޓW4GV9J 3A&Vx)OgE}Ѡ&]H2o0D?Ӱ@`1Xƽγ=M_ Ĺo%KT%lg= j*5(n }JTE`$E1[55)6PWp~ɮNXj.zdFc6f }2HghA}Qҩ >Ŋ-ms@olTlG q,j= -*2f lPE {"l@Ge\P,F>PJdN*U1RpV* xOFJQaGbSt,43}_=cURjNjf^E69x9CQVJ)aۃGgkH5rQwSROW v)Vʕ!Of,2Y2.ly`RZ[:˨Zo`\ʉpjK߇ CPojdVBra?ŗE|`iA=WIze״мc<*}GqN(j `mjS}}(aUbƤtŶ)tUc.QwlP!ψܡIĞ.{WY\a۸Zd˷tƁ0U6 -?$5~^)J Fa]NFo]>7ԹeGр]ۂwy..˵Lv NBY+ȸ@\O]KVKKMW~CHZōG h^2P^oy&D<-۹P2 8^}I)`Qn. Փ 3< -#>H⟼wG@CkzNr2/EKX!*bSWEJK*foҍo#+TYgۧShq-zԌګKrèG)V^5Qp vu PnoWS/J-,XQ䝗ӌ.t]<]Qm\e ACi dd}THP"?$4pk/U]y-uء-H.[K0v\ L qc6OĠׂvr‹҉p>J9EKҗq3h&G (dKXR+Jb(V[UuwI ڪoi?'"DH7###ꦿ _c&YE60ͪڪ4\ -?@D\%&JOB -3g=aF2N+}יwm̉CϺ32O5qעXOQiU'/EUG<KbSn*&`dv,Ũ%<| Pr]ȭ2Iiu-{:/~|9l%VrGU*]2.\ی%˩qf% " /Q`A.<@Fޥi[7͠|(\^ljOdeD:ؓJtcf0riCd[?V3v:HWĔ̠eUgEx1"/OHat~1st@+=#p|S)~Q"eƫW>@:,Q1L y /HI ĆZJ"*ڡVM 3jMG($5-vU1~n.rR⺗(WWu'JgfNr>*_\$2,[]_ú*װ kl[e[][ -T4 j(sX?~T0CAgIBģ87{% *Zk ,N_ mPA(X'-Ej -T)furp -UJ(]^`:/@5B저V-DntWL)RUZJ.n6a(daxO^8eL706=/\ Kk0{y»/-!  jGo#/[RQ{ ,}Gek'&1V_ŗe>5Ϝ~{G\ۨݰ6Ų0gK LD稾#0VchŅA4YX\OX)SI64i㼊 ZTo[MEhe[IgشKgj͔\X컉ylg1zPxRr%ꥮ%YUc6fˆyAH5ˏ'aC&O5h7)G t,We^&f,UOA- h>;j瘝U@ܸ'fS0@!A=:F*?l"Wf f§&)xnZ-B׋|_ǘ"V|$6Z 2U3D`se7 >T'mKo+Z0洩kx-i;o0L9J{b.j]3Q}h=zKaA[`DybYJ"FE*#ݟQbnC5Piոb5#؄7[}M#o3*K5K'%ЖpW+WKyevh@ ZټG(CJ+r)\4X"|lWhG]\YiIJuH<Gf9*ʎܨH/(w>āc) ? QYB10+Vx,ʛi[ %^.c|F1B}TgejA'g1<'ŅrGkcݖ [oža5W -Y) weuU$GFZ|yq;UOكIc0(=\" -165Z2jUen ʮȒ[#JXhTF-Zqkp~6$"o6{5vD:TP0,Ϊ;{yEA)T]yhjlmIWE=YG%̴ !5y*$_.v5'y>rG!Ⱥ*pJ/%g+<0*f=F@Bx02v_F@'Dl#|(TBy/e@7XވC`6&}7 mk K}30!ExZl<:!"bqPHBFN,_UiH{t:^H]咔B62lŦ?Rl5Xu44>v\5%˯Wa5l'L,r^_Z38Qկ(Gm;>U,GooΈoqsM%6njC%2nq2vŐ3'yGvϟ? ~o NAmO:tOH3'*mz oEG?P"@U? 8*u$;̈́sN*ʈ >QB<JjE*qɵ8DkgV kޠ! -j ܘ#I/2?ȿ -dDByO4)U~TG,v<ʶ'^ G-UG邏lKK \zO@ʣQLhĠ~m*5p)µ Q,NT4ptPa+CW1ߣac5Cv[_@(VZ -QgJ?.Mo?d4}VP -.2}M% ;h*8hh0х.jeV GS5{\5)eV j߹v\ ^II\* d̨Mp_PFVJ''n䤹|+&Skm*τ/mgU%p* jE)X^ռ3Tׇϥڽ`,%dz梠I"^CQ;zZPڥs'$jR*X_ghg}bȜ\*}JUY2W5c4t6B|^"'u6nOFFܣ)ּ!hДG7(d jۈ9>m~TFj0WgC0aRu+Vqd%)-7[od[.aTBPk۔@#DJ-]-PUQRE%HE_5S>hN_}۔A'T%8!pҏx-ꐢڛ]I(b@1D -:+aeb,zZb> y jRϸYHC! -a9m\ ّ GK' G#w\Zn-9U+^ūEԴ6cB -g_@a4 -Z2w -Xa6'Y ӗʎ5w:leDTKKN%&TYT|NsOn(ZPb,%K,;`ޭ8Jw`C?oRq5H^@KSOL ӊb"1t5إ ̒4XYĆݐ"#V,6- _ @B`?F%@q=Gw1؞FWl*&%wܫl3"r4/Į3HTiꡏT^Z0ȋ@!`|HqUOBPJx #% 1C@%ᣴSbD|*NۆOk_*ʯ?.<d &:w⛙ɇQ*+;*+3e FR(YMbTPʜ<h-CnhzigFY(٨ܫߕ Ӳǃ?1'Z>"X*!nGes0^WYAf,s+be\_&9B5rQDaqx&Ft @P#QYu*# #%DIQZ뇫3p𢍱,TnҠ-je;.U<ܕnz2<=D% -@2^TķK mR1'!ٻbbRB R̪T1 Uc+R -gjoa7\Kю|*1BmBG{A)3L{D(g.^bp u;v2k%R/aWD]1>XYU-*PҦX,_gP. -A*L{lҬ?$fl'ZVBh{e,{3RQQR 4&8뼸]xGk`/PȑD…1.rU;Q2KƽcJ j3}XORhQRz:|"xHr#7Y[)\ioNߋZB74J[Ӿرe˲|PKBybW,r%mEEL%dE\6aJeЍ~')񩏂:)-<|*$P_QQ)((iSĨD l1U*TB>Uv^݆K%xE3u\C6P1i\]\}|IrHDd"*ilv)1N{Ժ}ԩYA/ƚv|^(5|/wW0,'G4l%! ^dMa׭e^ *J>wVmTD$s֊ _*E.H$;%2¿BCOGjo#'”BA 1^[+Hi5ڈJ%aOxCDy1 ٝLQW5|X)5AG{>q5?X{SsC#q~8v0fX[28/5GrGywvmBs' {w%ȍ4BS""6V( zE多FK.GJ+=jOqol: g5p}94< %G,B8m*ԧc'ؑC)lm}/auUq)N -ş|X}rx8\<.򈢺AW)OjBnmSm\"+~!&q}.\e#'ЕN>eJfFVKۑQex oQd%"ĹE->}Od!%=E*j.ܗjX^[Ծ~ĆRɾq;qU~h7:?Z.uDRZ+8='іP *KP C4 WǧVhVVedB:4RoehiLQiS U&+}qZUD )W[ - U(2 ^{a]Bԧ|?Ĥ?ǚ>[Ъۅy0 /1.`aLaLӐo%*K6`%PkK~EdFTQy742v4j}OZ432(閊F&{H+2Yв +-+.u~,E.PԌ&ُV"˲=ǐ?Rpٟv'JvB`kK/`X!qkۏ_ -.G*1:޷ 9$-g)GzO~-MV4_.\ mB:A%۠D`ږ2"4ǕQ2 un\UL0?rjv,$aM촶t9U]|Iճ"|UR-c59pKjbD\|%vVFSŨWĽېw:!OR#Ɵis D5 v%*p,TNYQAN & SU b"4Kޮ?[߉PJz>eoS%HJS IL έD|BW z\&"hL?Y?Nq -| Wapl*$G7[b\ (a 㔙1LIFJ7d]>_f/m_xZ5p/rܡTHsR[DK̯gIpxs(`+bz0H9+OQ|0SVد!9{H; n73!E Bɒ`ҙѐ\t|%'pl fivC !Я͉hޭ)fD#/y;JpMNɹ;'!0J2iVjRbp)EYQ0'U:ҡLUO :s``KS*~{[)*!TK̩Qdu*؇^앗03a^B ;5Ĺk5{ToTn{J7%T &R[),9S&|KʥCIOS6XPpp<H\Efҧ[%Z$b(WT, - ppɬ>1#!]K*)PS* -Hmɷ bPlY<@+B-&40Gě4##kIWȩL;SVmpC:.iVF2Quin'+ {Hf((֒]D!S+%~\o5 jr &#Q- -_ gڿ(U`ߊj갱|#2T#>< ku9{^/767BBެ$?o,_(}ir~XV3je% '̩ZBK${-[(&@,°Hs;%mXuJgRʕ-}Aj -m|˖zƲڅј6{"6 7| X3iJOE\_XN{g(y&%Zg(ڴ2ze8ai3D64Hr<:%KB>ea -ҒZ-\ya|gNb4ےC `݆T=Y S'.H&96QLOR/Vd`aM؋N/:ve,;+ďTsl@Ru -헳. K >Hy]`ݮL~0\ݞo׉Ej\Hj75Z@5 yL;9?#P^-Ed - ٩>_JP_XQ RyGiJ/KA/3ssW#wq)3(]}gQ 7 O> ^!GxNTy*2 GYeJAPO؋uۄ":.)*/h3dD (bP<I!0oᄣ; %-ø{2Օ-2PV{g*|MebJS1pjjP(e7Ȕtֳd0DXoAxJkr9]$b@ FƂ?_R>B0jShU8e0Tz. /ȵ\l(k>ɉ l-^Fncc -?a-( `wGUW3i^Y* A\yQ`K[UYp5ۧwCSf;:~@ǚ @;yBlH~`t\Ѓ/,}#0Z*@C538_wzO^UyA˭{4@丹Wsܿ,{-cXL_A{eYw~rф+`[*񂞙Ōݞr!K=Mub16&&g]ɓ}|~a={}ev.ͬd;hSt>4&|WufR\u2X២AlsuY@V|Y<B>+<_}4Wp{$'q+ u`ڹb -{%Ũ_e2_l}蹵r[Op+y~/*쳌; ۨ5όMnͩ/NE:>]-|"1:YUUDyy~, RW$Z:Ř$uWPxY|[ b|ʴoO3 *}aBoFT_18}\#_HrmmG YK<2ɕXv)[SU v,ڣm,c!Ī M+L7yߋ!xe4 -äNMlϲcUjGm2 \҅JiiL+7D,=!jwl9p6̃ CK.~ 4"7iѯȳ-~R:'(қm1}9{gvS p+Cԙ~W6ye.-A_S.۝HT rZ%gϋInoj_ع [۲g'3b'˙vg49pwId-Z1FYp6U=;F<qkȠ5_fk a~#X,Zon*SZT5Y۩$5R/W#u%Bs#W"~/~%ũCx9>eG-qYY(閸%ȋey -|Ɛw.&~إ -YiO2o.-K Ź,FxrRx!Q}h.l~-Er?i qdFReݞ *_`-ңDȶqqҠ/Xv^⇻!TZ3o?ȋs0˩d 6t\=K94 0Sm)*m!Ֆx&YXE7[U%/T}2,Bo t``-..CH%mf|`Q.,*8Pn\ i{.,.\7./Z{kk>{.sp _lcI.d<d[a6˹e.$GbAy>1/?3Tj䵛X*{jاhy췕Y,f &cxozRکnSb=S5XBb98Z:/e1j2˟I -Sl܌>tn*^v[ -/^e"c]iqv :˃佃;rd->P\l<[Y -c'fܻVkĸ5.ŝ G˖ۊE\ lЋ;n[,Wq}C2̩VJ\`{Y+^qEeiR{{4T 'ڠYaS\!l/pkX{ax;eDAB%]]\`]M@m]e:,/cbK1EmCI#5.ۗP`aUQ 1lD;w -F[ -j]K@!S#0i/v%6ٛ|Ks[(R0% a*]vc%n _*L5Oam2Bbg|*\"wJ`^fP|,XIGFػW:B˪*l5N6vYZPl]`E7SV.:e2T ` X,#I%oyR!S~\GUt*bW_UBfK.5AX;-mVA͗P_@VX YoJ~Ѱ.`KĆAUVL(v^%YJl*5b-Ĭ`Ur |yGe\©D<;-c7HZolB7QlZMA|31;EШ} 8A|Ǡm*{95J lS#ZMȠ٤K.jqyl.b2͘qrYfH jcn -r[6,1D`Jr P>ٶHfG~&Y@_6eڕHT

x2 -DCk n_xrţB fyXi HURx䧈'X ~r=ы,^AcLN/!|]٧]edgXIaQR@2Q>r}DeV`,ctKSLa5Go\*+jb_1|;ld+ܾlRE]쳷qXEWă}LV-)% -2H\au5d mHS;kXa@(_LBotOQhҚx问SxnyRa|`TYRϡrʈumU_UϕUU(VGǡT/ʢʨ[8Zx#ffAs(v/W3`-9-LATBX/m2#3Ư5#U\7:O 2EFA؀.qcɇ6{J)gTƒ6%X*aح!0vmdha, %aW*a}Hu0Ʈ]Zݎ킱0eb+m[Rř C7{Yu5}kJ*S"QdD3}3ߓȰ]ZʋVx<:Q+mպˀTmFe>V.\|% CFWpd`?R>?\?x,}"`xYL+b J%KҚ-Cr1exYq[梀*[ñgKzüj]a ķ% ԲE(\kıy. -v -\r1}3ʼnPElVS ټ􊨖w.` YuPܱr肓Z&y;CƫԺL- MvYkeKnEk-4m,hW-h.Z,b1k<Dca;WۊgL.g\ qmS#m5™x|;f|^UzmBa;%56;f>c1` %Z=\W*]5K6t$y\)Yؤ2Y`lx`-Ő)bRؗاYw)S"B}ALW'G.mp P Ɠ^uPPj'`$E 0Mp߆,`ehy"@ `ViW> 8s̲xTD(&(1YߢNX~"̑Ϧŭv?A/SqjAPĻ^1@aner^rEݳo#aFˑOQDt-"R@ZVhF@~Sm ӿ³ /{;Za\8,2^7]XEp)K2")fwQH+Ba&%Т&{YP܌IYQq,T,x%nyX7"6`7[ܾdG -= ܩyL'WD[d< .~l̋;Y2!,ƹvѨ n\[9QٸC"IS{PDZbb"mbT._U[r(@.1ER`]k~" vQKڰx,tWU1YEW)ڂWy !E5Y5Uƈ`0%lZA๜c{")DÔA;tEJJ6l?kAr,_L/I} - kB-˶0{ vh-Ma" yKJ?(kش*.F|7X L!kHTZ1#Ciqh؞ͫ73BiDB2 ZX;*'ej]TJ54`oED-f&3Uq -?xJŮs'18l*މfTǨ-eCW)uan\JxKxoB዇!{B|?-_#['D{K&F UȥA\F@^nA8] w!*FϸBz\[,d%Jȩ44Q<28FưEr(Q*Uʜ%>26 H Z8ZRKr -y+.J%Ѡ+@<˸i\] j'%D-W=EMl )ԶP+`' tO%RbDf 1> ]jFVVloal_i?hJ]웡ZR*')tNŦg$ ]ٷ{.*pߎGEM/n_BYa7.QK,ߨέj'lCݾ%* >–_V᱄y-y*<";:'%V?Y]QT?j=֬&QQR>.L'kExERELH( -sv>}_Ê,H,AQ"qi^&4<$QVYq-uyZ""+Mij[B€y5[FaVVW"~@0nNf"_AU-˪|6]EZλKʹITq/ Q2ZaPE8&Qh6EA\s{JYbur6@GIip/ YV%] k.ƢV>}Wc(уQMPvWRbۘJ=% -peu-b j6*h#hk֥X8,b(%iḻdv~"lRY e6 = c$eI*fhAEl<ģ%Eu5),oujVxV]|QG-U., Ywb]S: @e-?-d!z[AkS vژ# -)ۚ c%QA;;,^%j_?rb%|[Kavx).gAT%2SVR{e(IUoqJj{ŀ6fͦ]tFM dȪ~+LH)u87حXO B4KgA׈eE=/uZʣr\s}:3I/]O(ENUPT\Pj(uPP)-A%,,ʋ.\] -˜&va̖+Q-TUY*QL.8,56GNxYƱۂ^xn+8{RՄAKZDۖpy\Ac'EE6ԽX-g@&uql5ffr&1c;sz|<ʴA uurŽԱvS<6Ӭ̹~Wyșp!w4b_n{9lU\u-Vy-ȱԖj) 2T.kQP K_1E+#JVF"1dKWM94H=5?]ZBi %ȠSU(gI^@^*-XF}M.zTʸ''Ur -qc`*nhQn}KP\Je`61EȠ6VawB G. ƒIP|;R۪AN؏4Wܨ -9XDni(cg?sD,YJzF=v -J i/TVs¤3l:l\QsF6^P.T\n(lWVqF^|OXZl,#.Z1V[, ~y8bj d{(4C%JpC)jV>h2՞SpU9QF6]]*jFqnhO743*޷ٗB5\:Kbry3ĥqu*2Ee"%&\sXD 2Rew,jj P{3T#kTkm1Q*y+LU[cN4e w\.CΑ6mNy6DҺ*teF - %f.٧ b>haPtn H1#TWR+rn+bN" '.G+ȭc YȷĶr Fp lnB:4ZOJps%]JQKTeKrz؃XKf~Ęv t )/JAiv]ؔUν>%1>V^T6k|F#RaIl- cd]fv {4˼{QᨁvZEр&7{Υ1$K̨2D{6.*.GZ{TʰЎMMyF'"`'7>w^l`4yf -mh];0 (yC6cWb -VJ\tO 1>|E*J͇P:Q!BGk - {Iڢ\\{?,r췗+Ш Uu| `ч/6ۚ$"T0'pKjVbUA صؿPoQnA6?H`P Yg*d5t@Jed:1j%PŸ.@"[%C+}ܷiaG. e>iP-y:1h4PR08=9.w9qeW(KVB_.Qɖ.VCC+uJ*+dA^%cR߇5]lanUrwX/ڪzFDU; t7 WNK9Q`c1dzB.> XAk+" 4 djx[H%[PA4%u4.`%*&L|QDtsAc7Xnŷ^N Dn}0cU߈R~Yށ?L+%/-y+<0{e_e"Jnl.$V٦"j]4L`' /+ 0Vc\D*UU1L'~t1+iFƊ FjtGe".l 1 J@'5Ph3VX|KocAIJ\-8ʵe-/`WKSqk5 fԾJʋ'%O%EՐSf[67ua/e2KcZc2ؘW.qt!zD1O5X b1"0{%Y'@*_iZ\%On`Ę6@Ty^ =~.Rx\gRX~ WвT})RV-'^eQCk8K:@ Ib_ :KUf/ rseLTI͸489mpMg, "{RS9W(#@EE^vYۨUŖ:G-i K2͕hfS(j֙Ak=ۃ>(;1b=BARY|v:)gU-cGQD'ٗ,vK@<Ƙ첹SDC}P=ʂToD V+\% -%LφlUؽ3/*B8?}%GV/ꥆ1ey0*vu|""fݗ+xAPHeIw/c/z\v(.j=ҝKe$V/G -גoj]0P# ut[ QMo4cprV]Tǒ},XM}0JU{XDbD0M -55:Y*#NY0j- =N `UR -WP8,|]LŗMw.9.? K/ijW%zXw5(yK}[Kxiz@5mj4I̘6.̲H-ƙP#'o9+tj qʴ_;Ue*vc ¬:SQU|ε`]FPvD.oYW_HuiGUp>H--r/B[0zrUn{_!OWea S|k?KW ͳXFj+)VS=jQ,K-v* -cgP6R{pl,Eu!j.X-vRuc+(ۊ.TUu9=Nq,[*Zjف@[Tc -(൪Pˈc-4q]#hf,4ci.V-[6-C?sek,--Ok%+PnYa&QEQx#y ycpE %Z[-(^x^EjoMWȎ2xl -YDm b(QPen!.]=«`ptb58.{U8v⯐>W~bͩ"߈YQ3j˴NQ;tBഺe-\7Q|VLBqKcNBE]0N W\QF -@rUJacB@֑'4\mzѪ\b[(26EyIZȀRؐD %챞eK0/jr}ƚxFi-`ݬqD^*%캀x{EUER>'Z9)ׂaj-dp]l܅BrόW#0Wj}"QJαh02>JvӫHKb_;)kyKb\͆ ێQ-TlIpMmNB۽}f,j"`2 -r7VO )Fm5Pe۲~mCPn64G"Sɼ -qDH۴@:!KJ^IEIR"V(ULRc`KW{ʕm;+md, -P{"ok^"j?J[eEscU[EvS]E6_z|Sym_}\ yGC &8@:h+g&-Pw|Fv4Ø5.,heKU= u@:W"p p{Caq/NdÒxiۆq_ru+Y]*lif5u*.RKCEW} -cEPeʋ]*rXE[lKC_CU جXr8Xv1 Z+D#VO;u+}pUD{.T&cp'yHj#$3 dSR* *Udp~ga֢\6ߩy  703K7UcGRJ.96[kyUdٯ9dweJ*WHRA2-ςĻYcmS(*\.-3 #nKr̠{smPAԪUkfG6\X E}^ ZP? bRv˜ Wp^7 -C~aMbϲ u0 R U G7OdCApIvYR9.' +#-‰e+6T(%[ˇ^L%~/WvUC%bᜆ~]穝)0>eRƘF`dLP]eb@*[/QS FQ.)0ߓĨ >&*eX|.>frD:ǀC<Ϥq eǽ}D"@ti骊I,WO!o@51 -A!n>,$ogЅmD36Vme){P~qiC0ϲSbSPEU:1!lFk1el%O+c]d'/.^|D8fRr]—Оw<īfQK(E\`$RoH6Cܲ4fmZ\Ȝ\ 쪸% `>c`g|V53 EWb e7߁Ĕ]ri0&Y8:~u]=ޒ%Bu -1O3=9-'_uQ26* ̝5OF -'6;mIv#Cl %[phMX+ {R2Wbce0`K~Lڶ7Q TRɶ{фv0R\4J_pyX!{H.W{'r_ ,Cf IcU U\-PDQْ\vf[ - (l%Udp`x九a'ȦNFɖ%oru^8UsaALEN[er7Szȏ%%6cQDF ؗ )x&8+ Yz OLgs}ܹ.6caB[,hĽ?p dorȶ e*69 WQZ3H /'єd$ q/pqUGmsNk,ddU/+ VJ.@]݀.E+" JMgŧtʘRE˩?$~hWZ[K*hٌ(Z?T&Zky -o 4D2= -\pN՘%K=`Jj틘_о;6b)cmw_0 5 `{oAR -xSFW*[D3UZ*y^o.p"kGtg@i]pHd!ljUf+/ܬT SE-H3npU(Zk2 -r<ƥ0RR `,{g.u⡣O*Vm|> UQ6"ZTJE VzPq3LZ)l|\CPDOH(j!+4;j)CL5Fb6k7mpԂc|+bh@M/,jԨC!# Ä JF$7>+٧{w|U+=З&٩ P&LO('iT+tZjSa) ,6Z6m7¾;dѮ3HZm*`)LWQ\ab|5R֬Sv3j03Oq+vIZ[r[PKVJfi -$t -*Mf 8֛Y:ߔ]a̢(Ħ IBX20ׂ[Ez&eAJbvVyeFhJeGc4&^+DJ *ƥ|c[j`cw*(Xvvl%Y83)0'DtˉP{Rdlbe٪ʘV_lv2 KݎuAwJ*_䥨Ok }CS|SUxEF66ɞXhyUuرn4rHщBЍ.ޔ[*3rrߢ]?{}(U,V-)xDqTC>AkA !s2dp`fk2hb! +ZvƒgZעi8FF5Z5__S L KQgDg,BY`_0u0L 6ql'Y(e -XK&TqlIB@ # aSJܵ[bmEK\ #3ޱdO`J UJx/-1- sf]0cNL_BiLfjB]x.Kݖ-.n0db0}i ULҮsAvrv&Km\y*%J.A˨QR -Z1]c+sHܥ1(k1GUq)uwem˨8-. -W:Y TaQ"+۞Lϝra <ԼOK؈r]P -Y -^&]݁JQٰ7+F`AQ~0“A1]UƓe/;. nS+- -B|zKNE*e: o 1ܥebLdX غ-Y.]{svJ f;=/ ^±Z=Ü"DP ؊Y~e#(Q0FmB/K.[ndS- -q KF^e }tvX*U,nYqM ,jq\lU -jdGo>&rYR䭹m3EKh5bv d`dL{2\O WM5p2 / fNm\{Jnh=Q #ʶY#\)BU&Q#6/`3V$ى\BQd5$;.^/mWœ=JfјQ>EG\M -BYlo#?r|,`A*] -0yJfh/:Z~/s?*tXb" %Z۰M& -&Buljײ[r_ "8^bfS {"AVYrۇ%ɖxCqB4ibSşfD- L/Ri <*W6CltT"Rwr!R_RĠ@ڢ, EErYa;_e:DB1RlݟS0ub&\éDvX6# -!?.Dco~ZW*lL j%@]:w \uպz-T{b>N1+VA{[=p5V -'ڠϑ4)e샄vY"4UiA%̡JZTruYETO`lg8tW!BErlDR!R"r^[X1KE|QȅE< DeK9&W6}l:=b'a^eY]CP*WP<WD-K}nOgZ1q+X?PWue86j3IcQeGѸ@r@nU!5E'0~Z{S-rw - i 'akij4?5~PJ5LDMJ LjA!.7wLRGUÑe" O}7:tFVHgWo'V}`G-p\ 7b:~+r~Co&f3LFT@{Pd]S15[\}4O"/ -0Ur-*-)\څ2gF&M<춾 - B%v)<.E+^`li72*EbPnJ"]㰳M@mZ"MrUG!eʢ'SdW#{ ػ̙XNe91`xa[QY? [}Sw?S {_MXmWV -d=/lRtlNk ~%T KnWeŇl+U/yX8}"1Ku<ݭD0AYGVsKfݍvšu -m݊b!GX8E> aVpӟ VNLYsoujin@ہW/kjZi!^K`>X~ ~.^i{WN4`2R*UlJV3*ضiX@Z - -*ên _2q樋V^MVOy"d(*Re͟SLji3TnT97Y _*0~=FϿL&RLc* S]LRt}O@:%ʏZ?1?ew V6.a}x4TpWeFiA[B -DN_ &͖l~%CvF|jJ`-7Ijv^Tⷑ%˅*JX/P25K1 PQJ^W%F;(ZKKSK ݶD`.g./*DVəmJeIKE? >Ľƥ+e,߆5'`(#P>J`}9/Wg\'or<~clJ(?SMa|BuQ3؈68JG6Vtwe22Jy:Jߨ[;-,0&<=9yʦ/*:PEG\wPr8}-x-n-85sGN];(~vpC)*QAiO*`RW( Hku,@jgOإT~:Q.IJ麩XyR3@Ђpjr=`P^#nYYG'VmK){b-ey -!uab둊XGU6/O4sNENRڅQ?~n1Xܧoe]CrQ -eTP+PV3Rs̷{ JߋPf޴ -+R .)2!E 9QOi`pb˯Sבֶ%m!~eS˫eW-z%+(B31!xɡ~,p)~,(TBr §7"U nk\DAn Xѝ2ZdшԥKvȠJ*iO${qBg%cV58B-(bFʎ(#M -2AeH3 ue Ɛ<`lZO[%Qmó2 =-`q2kp["/ Oe'{E/jPfK.ed Gv *9QǀDlX.gQڙYJɶ|JLHYEC#J/) -vTlp_ -ܦ-DggrcДz(w0s"8ugn՚uZaUa"Wѩf޶֚ -TVExrRya{PKeԽ|rӴ -|6ğD)ض(RF\v}e%jɃ vV@Lܫ6u9Jؑ&?#k,VW#sT,%a<5{6ыK/b<76,TG(;:1xڛڦA-J"%_@ċ;-\j]j^U'ʈBMX!p*\)'"69,jমq#DȔm٦ܦ伯&u`J?T<jnY T/0|),2^!/i<~; PNooڲ"E[(?;fM%}-֙ Z"f6# 7r͇Kws#%‘g0d<v 7qo)m+ -M\7Tk%]7,lKUyɊƕ0w: L)R͵>;r*:4jA C<PPw%@[ u-4x'̬ų>)ڡK8ވeA5<?xj4k,xyU2bŋ-ON.?Tc av[/"YQIY{2/%ʹCvēKa+nVwBeъBz PNFlaS&XBʝRdl(/c;)"H[9*P )q(^E^A/+T[`j%3H5Z[+YNA* _D^0ߨ܅;ZYSEjl0 _, %_f -/Y]릎%j_o̓rPLye,McXdL<,z益 ]yG_tHnR],Kp.(mFK+bE9-jY`+ ,ШpaK[pr&"ZJp ˗!ֹ0 QAAun _y|nتb3&SlYU[L("JzL,EqedS tW!A_Z2UKe {m߆Fۨ擄]>X_%o" @R^32f:ߪ$Ҭ0P Y:r -=*xl.8 -P&:}0j~6ZE+*&lF4Zm -oOQ,ڙY-YD%XńUُܥ4u׭_{0/J7}ڲq(|0z }TU&,8A+/>*Er~ XLts`~ -٤Ae׈m20V `zJ> -<'M .ȆlCrǒ1i J { 2XW#98Ku.Q2BXxqSWl`7e41YY2j"4r ׳L;0aBEtɔls%<6z7%;.JȬ-j!g?s<ؖC/y5f\a>.Z(v-Zy3Q#ӰTţ̪}KeY.ʁ8GyS=>˵R";d. J/zT-F;H(q,[D%*gPK5hL^˔&߸%@9lQ¢^Q - ߀%&2V\ Jk@W6צ\p狟eԖu>N@ղ;?Y(trkEتGcA׍ڗKQ\ \o+%cvAjyJ_')xEW%$݇ab0^m]BOdw)zFW4շ/ "T"\yȜ,JjC9իDu[,0ZM 6"3@bp%)ud@%%2SMV g]z>/,x݊(]<Tp-jxܴsgk;˲ȁr vR/aZ܋XU죇>H[<\iOq×.piٶM5]lKr\~ mƮ]VB$RTq W" L aH8ܩ]@L#f>7SM9l@Kfukʺu/-jVLD+~ KhǕ*I[+%=|@D,AAJ.eǒcP;iAg0P.dj-[lVLWLU0<}4!5R[jwQ*j?P+Eʕ?TkCP -a{{9(Kj~(8əH(ZePch&ӌ,լٿ3AY)wAV}26w?p;Oew'ZLE4_ہQ| Y5-vF8egb[߆UūBRT,RnqéM.Ũ4EG [-ȷ,2I _^|(}[DH }%H\|#UEE{BהQ+'#W[]A(˶cr.mJ#allD}&G^PbT"-}A؆&~~焒CjݚWمۖ.GEYy[ooה2m/.rw5B,kV5&i5**yʗeQYx NKvԤSȾcβ2o"c~9/n@ٜk^ '3Yr"MYۊ(afeÐke/LnGƜByRe!ƣHm?#:Wwfr{zP/3P +3oS?±l?'ߨ~X4v<ڍ`*ԣĎ/XEF:JIF*5=A_Ĵa;sB.ࢡ:`2+ir\\!]1q'&ˍJ&_ ɵ8K lK-#ض b3A*`oa5l˿#w˔, -渐PFG ݽeIe|m.6FY;_7WELQ5U)y# WŤ+* j/`J|B8?s@]ZSUztňMj12*c*,ۛ?b(D}0UzE"NL[zEO ~\,}cym}f"iXJuP~ #m {5%sp5GF |M65/8~HB7BԯQ-mb LYwljXI &ORg"ӱȯ,PEݜY,9T?ecp͔ˏHudVR9F@*5nrRZEd.?Y~%!˒̖@\ l# vsp< `O4^>"i^χñV -?gN F~%F`P#/(첱6Dwћس/Ҙ]:*ށ ޿&;L+X(7Oi12gQڞnV4-]9"mx\k8& FSU*dS |fѧ -=A_(Y]L^-8jޡ-8H8A - OLlp%L,I T Q9-J%2P^0̶quB :FQLnʨEy7&KK[< q\Ay˙6+5ʖ=Ĥۉw~ !fq?"]d-j4VCkJ"ٹ7P\tcLb:*'BTtjJ1`x lE[ 1CcZn uk {DVM! lm_]E -Pxku \^+ˋu\*} *Yl_{Ukn`@Kl@!ikj0$"ހeƣ#j/ui3Jv&#Ҡ:uGԽax,7m)괎hl+ ZyUvM~Quq݁B JI ڵBgeHO҉w5nFʹ:FGwǔw8hkaEa,>Who -o*lCmԻolysJ$s[G-)`b#)n:DC -gkŧ!g* E;  r&.mxKn*-^14Vv@^\u[xP bPTt"dCƘN펥~J[ym /!H /.Æ;\qrG"-Uo\ ~al7DU A9*~<@* -v*0揶o vJ7in6*0j iVk[ - - -.d<ꮫ<Q0Myv@Xy.\ K0/4CDE j 3dj!v+W%W6TG%ҥWano]>\:r -[#៘_mTu1bxB!p\=VɩDO$%Ѱ DT]Wab [6G40RV[ \/n5\͕.{,>iK~V"Ifmv5Z5*Nʎ3 q{Y~M1˿.۪} FfP~d^ r,bo erQԥ|i)/UlI?|X8vxn>&~O% }L;05qZr[l+o|Wg9SX+^-UJ,\ó*0<ۇN3ñ kijVo+xZJf1EHZˍrz8bL@jS).xbd/̴ǘ$V|aՄ8(1t#YrÄ̰'L.^lZEc,rus>.F-02+Zh'Ioj&DYebx#rwL̲QaԔϨ%}ˉ͎Fc2T>.rEK+jUj"y ?"j[tQ ,wȊ[,+`/[eA)DRSlԫb%7| dgڦ.]|a_2nT -7'{ZD*ړ4 B/[_}LmaR˗l.+˗aBWjIoWMbuHP]Kd(o!.SpѢ_W 0.سgYߨKiql2/Ό+eEG".g3Un@xaor%XYɑItC 扦0iĺ_BV-@G& -}C?1N^Ař<> }\SvxDX ~;/gc_rda@S=V}K`n/ԺE.~f`{/SC~iG]{".J|yl*x% [ɾHreR+)eE\%%kS4'7ʋ?2ۦ- ꧛f:v]TT#a.^O y=ᗛ. n r/-V܈aP-b e U5R"\R9FK;1O,_QFUl!/>\<h1,ʟbcPidhxķ7Vo* B -p(0~媈وyW9g͍f|=+%KmM.< ۋ[Ķ6{5TԿeAqɮ -7 O(X 0= N;ʈK.wb P ocl""Zw):eY*_ISΙ1| ]J/xF L ~<4f E2#̢] \U).M-`vP @rٱ 5LmU.3v/XP4| 0Ƿ :vU؛ʁˍHIImL&8yP56O~6#υLO:7 4y<Z7\!ە́|UUEdzarȌ'^B+&c Wv_P.&KΥz\:)XT-zZ+@Ts⠓Ic - ʂQ{GJ T{/)Qj<ԔeE}츰BO_nU\rdN&n+*Hd"49YA|LJ),W ӴJtP+V@ZcL/N -Ɵ.0eh!VXrъETo4e*r5m閄[*:]J1q+R.2*oKY"PTDhBmS .. ;uT W6XWk/F* ktE"9E  mrԟHwgj -j ٻ{11Lo V/04SC;˃؍gUj}![f >p5jXuz:2zÌ>%ݏĆޒ/*>?bo@6J-`p!UJZeV@Ceu34)jߌH`Ypl,EF30$4 ij*7aqx_X DZ]\`ߣ!x[e2%aJKtQp!o*%Yuz%s>& ZpD7&P \剈L*9iښ+mP*h[BxRE-I[[#W-Dz_cWe1vAҁH~HRm!$JZս >04|!U.$xePzn~(}␼F`u#=H /`P??g> |wTo4H@B?t2Ą}x,>hL1E)ӝ߷~6=4),/`Wb/XTd.*=#Bʣt S-^Vj\R},jΊ#cN9X5Y FoPwu.~g,H6<7 <"N@)Jw R1h>ýHk+RH}4~~&Ϳ05S7ԍ}G*^g Kq;T,2Y`(Ïp}9pP?j YN?ÐJNʟ3toſW*V?űÄ4nS7"xEKzU0?Cgb' Y[5\Y/<4@DlPO.⫔rnhC%~7n$%[sJcbG|R|;"WAh~22e]NQo4O pSQW|B%?^$O^[gdG~,W $~+!HgGX?,D;#R_$c&v^Ev{?ʍ?3uד)Z7ihn~l6ާo#8lD |P{ [F|lȯ`B$S$E?|:Dcuc[Մ:0Pa*[ieГbpG`_ng'X>4s"Y?> T|ڿ#PxS?}0?oH ,N?Gs"*%YY4ނ7FO ;''QGj &ai=IWA E)q{$WdJ$-LROCUu?FCX|?A&؟O7_ZU{TSר'#u1I{^ f:X^TQ(Ɗn%% 8*9w}@*O ]\<n&fEP_fp(oX/bA_}"9B~?mkDŽGI <|Ks|lJ|& 6n3B _T~ j/З`[e|MQgCܕaіCJ}gbCc_ Mc~?F,/bЇDuBe]%}G? |~[TƯz'DJȁOPu,b~A!5z Wl,B1rv{E -F4-AArgmIJ>{"ے+ylnZd?`7f?7Y Y -JR&è۝v$Y*6Teo#-m nu"&o4Sר+.dU&ŹOZ|4 Q^o_nȟ6.FT&Qg$~&W&Ge֖^F%P~)_Q\nBf(tNťU1 %vaˆmJuZ7߸oQ_h,X{%E)Ȫd2{qgc鍸|߆?љw|#jYʝ ϛ'!'" -^g~ -jFc~{0*#?0ŸkY"(,O<| 3?vi84CLL‰GxOj_{AB ~?r?^_H|n=YV4}1,=?{l򽏏Q6XA~"J+{+B}EeFws5o^R@\6s+fRU!jA_iLKZ:~ + H DZ_CQO*WAG⶿j?ѿ򰣝4>?DO{5AQV;"(oFOF \/?(B~^EWWQ_V󋭀:,Q6s"M.?g嫆ÉkzAe3 -nwtx9We %iv, ۋ2=PA`,R٧a? eۖL~U­Zɝf?4nQT>veYo##O6_H@s 2WYb}MʟК)dM )`sÊO5ngR;1FyHj>]_q '/_yX1kJ+ HqO[4'ڏpQoSL?]O1Ÿ5=N~!V&4R#tzA*=I/g}SH?9`1 u$q? 5OLςm˦ӛȄJ}&yiװq oe_pu#HA GC.˗lMpnb=% 'Ma._;nH H9F4Y1t@v8i?.k ɿ&Vd*[VP `{Lqۏk's?7`a] -sAq)~TqpDO}(} -}}uBZ~,yfxݧpeUvǀX%kWP?R)?>3ݟ"22!MIG~[t 2]iMfQsKbFlJ"7 m;TQ<[ղn"ʂA/Qy -܁6瘁SԨD#C*-J#f?:߈9zLQ0 XkZ*473`Ɔ7*@z`c𿭕|=O75N[/*[vq>*g*6ο;W Hsu*ɓ?J0:q~7xk?Ko>TAqM߫=7騟-0(AG Ca>@E -~+ȟ{Jl VJ~F(cEmWmC^sL9Sson9? -HU `}cb5K0/v6G`cnNk*\JYRLR/+"'Liqx @8"6S35.ܢ -7+GPZ23|X&+ouiܟop⋶ -8C_|H֗ӉhY.LkeyuCF//M||To?3??UoWl@ū-={pxJy:'/z9a1u*سJ%?6?2qB$ j7=K{x Z$Ԧ<,eyy`6Q+x=˩K.;Q\eDY!t.T2\.5 ReJhK_?*ZvgܘMd}B:^=;+_Spmn -*V>h$nߕhW㮷w?> -$27M*TDBm?y>6oFyEz3owSgK'=CdY5<(=tx"\vw,e/툟ܾâ+?KWyk=,jwlB}L~GٚſϏEM,7}Z -˖~S Z,?J?#]24ռ??=+@PNUG2_{'u_;__7~PeFU;}.Gg0#,{aH>'DLxg Jy;D*RPJ!hv˴ۗETT(U2v[(ݨ0B @}NrpO7 )gz̼4I3Zw!|km3oA_/s _CVSgyrQ ??ɃW^YVp5b_3M?OP3d([?҈ .fO#O..28_71Lu6ϐG)aHc9c!Oü~"?="k#BJ|%~>>e QPi'oȕML &x%'!t6a\ˠlBr[\EZ\(eWeC%!aj}؆ơP+W‰_RQ(%amI8k+JIr[قIO#U~!?t1jWg?i*+ޙw/ }?yMo;efVbш/ݧg C7QGS?[B~㘿eK%+'/Q嶯 =aCJdvG -DLar邿ߘn]=;/A?~D̃T 9dWzː.b ?$}9tS V|zyaۙkPWN_fJo7ϤhC ߊf~MIw-䎟΀3!L=Zue#:T4V=AȄl`ߴ!sPJ6Cnh~]{5q'i8߃ٔ^Hm_+I/mE?˘?1}A Z?d2,{LPe 8W  -_:-lk o9O*U_="  #VC'k6.$@ȪZ"쵊a.=Ì - eי^1U;"]c -vQr MiUQ?GS_hwg>U x"ˊ߄"Hg_tm|_撑/WH>>t6faUgeJi'*Ȋ>3;Du =&>~ CɈW]KU7w?Iwܟ}! r̀[)E?-vaiDQ˵3\?4bkd PO-cO/}>l -YAY U]d[(skyg\? DƑqحTVmۄRd灄p*o!||d$ ^~s*<;GLCg}_ʿ=|:R9E?pI5:7G\'Ck5=I%o{'Ke9oY 9?d1A~3>SqRo`>}b?O+[;u5Na>?t*A𗸅|Z`PCRO<.E?߉_%?L [pYu/1@.lV*iql#b%^aUa.^Kb.4ȔfC_ʼn$JIR6Q#l\6nا%O?C'~u Ho_Xs>D#{>?U f j!|g5OO&Lj *όwh=%b6_xg_Lk2➾ԎTX7``>kY'SD_,~lǴu1ڟl 'X}vXCi_A3[2%1i0A[}EpkVumH#˨T+DB+{ܥj2>xg~uq&RWH̜?ϓOOyE^_n. Y?E_O~8W?ahWXmY5?Jƣ\|:W+ȭV K1e/X]%6#A3T3LHQ!UiJVaC,'hkƦ>'+wS}ޗKE?'iց0 X_OXW\VSpHEW2B Pb0j[^Pkog  ˔FbU'Z(,-*Ohp99}°<\E -A`2e*Pۂ}f1NKbScs(R뼗dW ۖ#}Hs%Ss/,aR 5I -*kmw*"|PECjMJ򔄢aT7Z~Y&fdI0NUE( --@=e9!%xԨ6&>2uuJ^bZe9Z l{FFV-4EyXËevO2\7_«\{(1&'ز;KL7+Y%[l1e\^\Q=3~Zc cEDg\w(# ^ E@DQh ܡ94.'%lř5]=K@b%Rʍ1- YCܡWෙ)w cS2 |ѵn41G:%]7Zi} 'u6HTiUU-}B=؇j6ܬm.-E%xrزpeHzq_"J|e%FJnVTU([oX`M_O6;R(JBrMcݨ80B-cr[NDĺ"K`n#˩tVW(D;6Mv-nڹ1rc.~-S+e銡WD򾧂S(7/KD~eeG嘖xZO1R~ķҶZ]K|#GWDWE3JVBx& S ՕrUr]}z豞Yz\Zr˗}NKI̊x.Mdn[sc-w&~It|vU2 1c.}З^\:mw7q p12Yezv: Aeklȯ0jYcRi.pYز5\)w%ab "K&[FY6<{Pe˕O!ew&䧫r]^!Qj>0Ҳ#ȝ>ςg"ZbԢ{*eœ-#Wuz.u|oܯ7 W>Tt|\ƪ_JD—_Qh}S-JaE)`RT] xfڛ17RQegpMa5!^I!   j"چ7Qb]N-ߨ%#K~EeAe17VGg?06zJRCKe2P%p^ō,-%Xcd &S+>RP_Ly%k%ܻyl+j=}佔ūP2&U^%{n8r!cȨElo,.[ Y)MYC (?q"Ѝ9_RTk04e u^|C^Mm%[~xu.TˁY[p W>D_?yQ(~?\v~,' -]a0'my 聭@L²`u6*[<_%:ve0,Jv.Hk3%9(E Uk)\%h-rɮU郢nQت)}h|3WF(Ŧk)z܂Y -E:jpg/:J't-9]u'K#+&lĹevi->29GepiQyU+2*S`6{nd6#)xru6Z "킽 ȝ%";-jOgI7cَCwU ,K_QEs,.˾ -+l[fu,_DD3ڢR9z1+z;@e}m LfU,F>P ^%Y5|[apR7eO՗/ޒ`LNzPV:O]+g.?{-qXug퍴VA6=\-I' --VF@KqAPI(*?A7i_ؕ]^\ho#oY]_yn - -&'Z F Y蛑Co+ʘx\"<#+EEZKQwKЎlP&Vor8B rfvAGKזSZKAˢpܕ,|ƃ*x# m.4P^̋{ )?~U`HrBښ@,VLe+@}/lJԳkҺ -ۍӳ(8]0;W, p!6#tWaAX G_\Qva16纁A=.> ]LLG#Mim#Q{KeMbߚG\.yYm;*`7:[N~f5Qr[#AJT:/-MVjWȘP^gUˆ2B>gDJ{X[qWbVKCɕNJmˇT#dW#& IoS:RFO7"[E%IbQhPR(Z*|>ՓyS -R㊣cg3E1苧D?pIi*jkx y=Zo}YMJ%lgKJqHߙp@v`^ykṷ+TKsI*(TZ;*q QqM1K{qf\HiMTtK3OR%^N {KUKbWfZHQiTW[xG`e*Xdۊ-_j)r!U˦juYR - jTXhZ~^!'V_鹬42>,C\刖Ճ٨:R؎LXmύAw6==x%'P} ]CMO +$cXn\"SLbyR!ʇq0Bz_!(TVFL୯nq9p^xעa@q»RlREo.<{RU#l?D.uLA1L U)ɾ~9T)q~"_Ѹnxr eED]΢p0^K:8eŅ\^DͦW]\%K=<,DMT^RE rse~/F`t#p§pr)AQ#b-#Cj?@Ĩ$bKub BJXKѥSp -£JTPZ' ZPOxu]4>joJQ*`!R%0O)̖L;Uv3>[__){k Q]92){-% C%Mr[.]Ը˃e˗s-| K`יݶ(1Xˣ.]UAW# mgYdb췿 ;#fZez2;Q i/K,\`2?zKrDTPufɐP`~ײ#j@K7 r@$χl~D%="6YLVlT+En]JL寐P+[}ԳሴkFS-#o;/D$Ư!Cb]*2&C[glv!J}'XGEs -"A2T2qj5vl|pvbb ٨kܞC aD1#U ef\YiGlir-Tc&$1{^o !E^Ķ2,j2,)^eٷ܊J$7ڜKX#Ii/֥,.3wXKZp>ˋr-7Uv˘q.)?_ k6莺OKa8,zkҧ.wcwu17SarU\@j8{L cU"}DX-*S>\`ql勊y pH1X!vhy ŗۖTl,.^A`xC qƙd[k7gT,;,7'w_Rń݅,> ˎ Oߊah**9Q%)zdJ'LeŔUወ[v6],,; B\U5Mqr.Q.U]K2Ywq| &Knὗ;&,Uר@/LYEKغ}sU[98E%K!jWl'!r.9",ƣ茢fCfA6 nTnG̹rQh;4ȔUu7qAl'IMT B"]KI`ܣ%##,e!lع~`nϳ",٤ I}1%ʹK\{RTu# ES%Gr_hɽr]OXhCj.xbayyzl!K~%Kqa?]^WǙ?sY_n,M[[A[g%Ke@XLڝA>Q}@qT%Q)( |0*SPo)*WGԱn/EdXSAL,nò<1Xy%+LY&L{R\z%]JYG?12lR6VN\M@JgM]IJx%>ZLhSp`DP@ڌ`ad"i\RQȝvNPQ[c|4Ri?rn@r˟#N1ob]BɿvqC{j/E3&6X{c%#Uw`_1j)EDr$]xEe/}Ȓ]>*&~ 2E3#+*r9>;:vX\ rTjTa+V@"US28v;D ZP(*χ;1o&Kn5+\RʔDZHb2YD/.ljg8俨lheC^`oi,0jW .+ieXK|Oh,* K#0mmZK۩w/vQKv+[xqt]g2TK6<;nvj^6W2l -rJr=Ě2YQg*V4@>+␆6;(ZfL-͗ U -/lQrU@1-'&l2";bpڸm",E -OEeq [U(E0wR𙖾`LKK#ev},ԡc4*a_oM\zKĿAo/#NAQH5L7)6ȡU*ioQZ@ `}N;eYrPDWl SJJ P .Qmiʋ}Asҕe -6]ů H -<B὏q7y^xWٞY+1ّ8<{;u+M0[glfQ,0bEEE׽ O4,A>bbYSb? -ϐY .5r`! j,۟dk*,eRUSwN( M1˰AaDc( - `Dʝ1 QJlʊQ2F\ -0bqf jf*Q%3>ԩW{;+d4ADKrS2ɶRZ :1980n0 V,I^+TVxv \l|—[h+KbQC06'e^,m%i 6T\? ܭجvƕTGV!BȊ#wK7\TX)!6G TUQ -$SC#nR*XROi6eePq]noUHտ%VkR#cM0QjJ Ă2Eգc2> -%\g#B DNGx@']ۤǿò΋pZog%qu;JѺY{@)ښnW`IG*YQmDvWR%MdXYɲ+)["OͤT;sn/U'h;Z -`M"UT!U},BD7jlKn\}@h> mbNU@J.QIrQ!13ia)VBZLC 1Ĺj@[eDtJsȵʕ^D",VvTyKB Uu:'M] -6LBbT%oDo -HJt䪇̚\ȕLХ`@yĶ@CXǒyL<~@ #ڟP7T\ vRVqXN 8a)jdF5S/`e_bYg5 -Nd=<.P l%\DF9n:}<UjK.v@T WUQDKCo㌞dksMU`%.tnY ̶?yE Rr+~n4K%&k9#_db -?qDs*=hd: o3<2ߋ1Xl O%:ʀVSD*:rmDi G,2,mUñ4Q˹G!êۈW#~PT3' Z`o>W#sЁ~ lFOdԦvmn`YL x|BF'<íľJYUZǷ6 -4FgS~l φyԯPb\ 6*%bܢr;HZH l^c2ճ(:R=(RͰz Wʔh W./Sl^֘?E}>XJe.R"n;kRz.qk?R3ǫDfں5^W -mG\FvMǐgqMGH&@l-o*6y)V.\$hr\d!doԯ^t 2Ul -g)lhFX)Uʜ` ܔ\ET3L -=JbP,W Yq@p6}p[ǻ =Ɛ!UYY+fFger&x2Y_rޠnPeJY\S2]2?ɘ*#Nijд~yJDE2cݑ8?<Д7: -k˯jh -#`T&-L ,AH%%Bki-:$Hd1Lj> Z.3Qk wTEp\/DQQT 3Fb'={졫-?*ĵCnY]NTA/c% 'ukO)+ `Guq]ש[56t<e^DAF`lU'|<&&]>!?a\&=-_GF<@aR~R-"f9%3)]= O;:o>Q0@ml ƕZnfK zl rPg Ȱԗ__̴ , d6lqᖆ|P>.~C3GH=#N2K*Qa;?;?krn%q#s -^~Ի 1l4Z8 -{iVMY}}rPl;ҩӀ?5+};U-c0!T:Dry 1eDh oR1]RuY~-?.53xٯeY 0WZ@_A؋$d ie&,FY0rkX%r' -W)ipj0qr*tUUEXbĿ0Ycq^%16;=Km2+p~Bx>*2T˻;tbx<~ cREVYSOE^(S,;zv -j ӿo"m'bHZ;^KFV aM72'$KwxljH,btF!"8J`|xb)KyC;_oYKI/ V&ScBO=f>tnV~":GV(8ߚTJw\j%*dp#DScb^ _J~Z¦q7ś6z cƽdEYtuOQT> |y-UqS ñ&F>R lW[~+5ۉdl -wYls]Kfe -&.[[c"#?y;}\e].^L*DKD/* (0*J:*yٗˋH2XUd.ulltLTT-4|fRJ1yC?qJ,9 _oT!F&9 ^UZ.ŸR)Cx^mc)xT=i9#eo*&7еe*ќH, -8`Y^+b? f gN(ژ_e࿏?3F#\!<4T_7dAw<\YE]:iU8Bx}`E*R]`*XJo!} d>!&Mځ1rDEԹgT7J"C]MdK8v,e~ZK*`l(:Q0K'3"z.T\k=JUXAxk :B:KW(̡bP4FL؃Rvc-R6Q-hD@}!.2ʨ j}EJ&ǽz$*C?AQW!U8[48V)J(݉Bq+QL3}e,Z fM(a[C< ?)Ic͇HZ2O02jk*.*bۗSFx!!ۗe-l -@*`B"CaDeZSUÓ} WGZR{{7ǁP[,u U" hOX,Gn{x.`{[ O5fULu즚:xR݈zţ5߮yFgJC{M6MEk%;P# i ӧR;D1ݖܻl!(jU[E(O)'6@ pw!nC<"\1`W>}HWG9.a7F(žܗQASB=^ 6U!POVAwnR؝\دr{(%kUo/Y`\_y~[M~ؼQMw"}2iE!q~ucӁ [6aw; -_Q t#}ٿsSe5N,p!?b+\oP*ظA&*W l-(osN) mED,ũpm,04W6 -R&jQ#UhIziDӔ.vO%l7.2,?l*`Jna*)6QCZ,TYtKV1Y 09@E1@kTA 3lp.U,l# -i \J.uR#P#`_ʧ#-Xmݟ` Dpr4~MOP ->Y -imSCږ'&73_k5Ŝ}aPX&چ;rO"mP,+~cT|v(V Ц+L8W>coSZCCc$~3b;[/5_*Qn؞#RNJG-0Áesqd(l!zV_ v>v ISUA _4oz*Om%.A;t\wپz? -ud”OQWfH}wbW¶Q+f_ -f'dӏnLEWY❍r6[}FC`| [J˖of U4 -,k%*ŗGţ-,oTQV]EJ - ]\ԹYw-mAԿ HUF;/#>^J_,5sU?4L'ظ;!O?@>+bV>ShTs9<5B#;`X/Х.@*y/ƃ.MʦиD}jg/fSp"L_R PCև.TU/*k.!Dv~Zٖ5PlT/.E>M6 XLj]9)f`*'`,˥P`.غE1싐kkjG?*y-|CHiLdKqjbFX|{~⦈KJ˨jmXźAQXy%Ub|>.Zڞe%%Fe! 5yʁQHZ F؇%D*"QӒq.(F$U7RsIC W>gXWQ Wb3Y3*yYc9.3.& Jy -؃_M -2mp`;mM+-< uXke,pn=}VfV/W7QzjbՕs "-џG {9w;5bZ\.⢼vye >|E)|;<Z \%B Ǚ_Qf*6P EPF%%\,ZD%5VřZBmmHta&kT#ҤK8e lX D> -P \)~t]w<EJke2)(3d:27cQK|Ua-\Igf*Ȓ|0T.UPܽnRJKXgb ĵQ\]/H|#g!*- - Ex?]`PjP>^Y.\,+8d-NW𸱝D+ -Р,Z OjjĈ>8AŅiPl"vCi#ױ3 -ukjGVa@("|]QI6r#hn/KJ OtŔMuVk%0H3߳RhRhHcIKo"-Գ!PjG'Fy)> ~ل(Y -|2N*u}z#m .D2:HnŖ4Efe|(fO&!_;4@}(%xXZ~MSfUmL*|W!35EU!H$ӮV*V`BcO,7(\0ѺU_?97JhV]^xo_D},tT? \Á3[ ijP\wd-֐o,r,~ujطd6#1jPT/ÐY;_+dk&÷2U>A~eKc'čdVƊjS~&dn;qk4Pw@WaY2/~Ʈ嘽bakw,BK(@v//c.S[U|T\[)LƁA,,JW\}:Q|lܩ={W(Tnm b3W9kFPxӬ!P}{H3Ju\\:Q,ʰ„b8>WwRag^ʂ nBܱ_mYȍBܿ[ѓJȰ jaߔ0(WV `p0bKcUm + um{a -^Rnv0qJ֖P=ߏPh n<'1E ©nYr<ߋMM~.&;,/䤬%MʁJ:FM;9-Trp.ԗp\ce\q"g aJ.T%uزp6+n8w?U=ry+ǬhPX^%瘆̏gڥڿTzgSV1} ӍШ^$[[NKSPnbly:VnEsJ;PC6Qʆh7ۄ,,S֌žvf!1x@HmU0\ -}Z+> %ؚjk D%%Z3ISN)ktFC2XJ̅x*V a}u|E^ Oc|鋷<ÓZɄ}E.hd U&6k&L;cy -gh<=QԻ mۅ*{Xk =`tg04@ʉϊV~Tqp]أE39!\|_"vX7O@f5+!Qt{7-RҲ%i -Z_?4(E -AbD} 5q.0 U.Q FCRHIJPFW YVVe(Ey!dSȿQ@5zWRqI_]5Ie_\@@@.CަR +n?Ȫ-8J\DlFV^x4!jejG$jmJ< /$ ?LIB6U nx|OP-ws2ד+)R5~* u{b..] ׈92*aMAscȚ(7i(/lI: [5(D0-F)~+e6\^=c]E(TO[)r -Q%Quv;*|rܺ*]E> -azg -fJGfJjrpkA>a}+VGrӷH(ДiIvO#-\iqS -iD*&2! 9u Yo2j ^M'.ŭ|Qtba]!8 Fy{LD6Vp VLYe" CY:„]^\YIUu7nYmG4ر+6E[%|Q%Ts Q%KRTP_Ja{Y,ScKe=̀g򆲴%"u`nv2+xrk>-Ql2ke d.+ FA-|r{z?3OȿrEl}r٤u0.83]B)TBdwhJn/<<Ũ-6L^PX[-ĥ}YNmdLq% -!( - 'Ezg cXlJg `VpEǕ6`ߑ=i("t X4F/2YdwȺO7h;{֟*'C.5Mư>y^^bXt vð;j -¾(~ ]P0~ᱲi"r&myL7 #@? Rܨ]miXqgU" L8!$ vcc>%sH:D!J\S+8\2Z_OKT=9X ,*_6f3\z#<Ѥ%ܞL-[e> +CUUi -?AppZpߖsPTOP0c,;'`<"/Vqxj@ܙzTۯ?[4 Ig[5 L"1Mo.~寚sQ!r'*W'L -X,.xzy.yH>۞)vW-]&3;sSՏlcEm̹qCjT HE:>%1U$0Gs-ғK%T(J#G>*-)/XwvzeVکkר8u -@Ld vxsl&FJ=)Z7Yls/鳬E(pKP -3JQȇYdrC/e5*3~0sRdS2X58j獬@o: 됔 o"MR56IkX˿eqg6!/{?eolv%i_ -_YRxAxn_7}-P(.}@VԬI1++ĜW`CzH`T`q@uuJ [. O ԧc a< z>rX[qe2 Q+eO1$*\ԌS,`Ge#ۇAP +{++.)Gܰ +%rL`PrX`KWiK,Bˈq0R*y}ER+\7EAh+gթ'op .ڙ"p8U|o*U)"?&&vpoA,,kF_&+z>^ ,uKAV -`U0t~!60יL)YU[K*Uʬ.}NH82'nRXm*Jd%.ξ_&R7Y̝%W -lsc1k {YȀ=E-[:kOKۖQ9eI:[\V2VN3^xKOLOJ-.!ƹZZW]銞*R ƯۘHj/jE)AQmUsG?}eBbG2ޗ`S>Vn%Vw[pO&靋֏-F - *W")]"5&"T'ʩnj3Q@]4V JCڀ4k++B *7ɫqݍSPD|KڨQqlE-0.O5HxW[w!r4D⋨#(l"\>r/^D -|8D c ~o. rS<͛m˲p.Zܱ?_#HGYw,vNس5׾(}>(0⽋!KG~^2•yl[Zb.JxZJ:(fP=uMHAd|XPJ%VW/U`ֹrse^wSuacs{h7i>uE$to~0>D.)PKDT5mQSN|b$UFʃd1s.=bRJ.q4Bi`\-$~(I$..!Qc9u5O͖;..Y~.Q~&A(Oe!/5iTş##>S -heĂ嚸ģe'A.R6W)PAX\u쾏ʣb\v+V 1GVcq2SEowP-_&"(H\ߊCLMa[7`Wwt3fR0\7aȉyq{TaieV}D-(?@0 m@ILJ_E  C -TC}G]'࠺JLn 1L -/}#Ux(Ab$<6*D pXC8\bnjja)gLǀ4kؾ5s,LaPo"-rN7 Wy܊E+-Y0~਌Bې-rWcx)+JŀՍ %lie\1^34'w\+ !骾w# .%a,c~,]h gNqII`[8Cq|]ʥ}T@wĈYXQ.ݔ ;<*踱Ge5U -+y"/ d#.V)rSP,ȷ ^U9ʘ* f@݃1vP瘄..Bhw%- vڝmS5nQv)  90~v9Up.4ظCl[lK"ٷ.e`4ªmCN(͔n,ObogE -{:i 5c e v_8%555 r!0 J'77!b@ [W)4߄)\6 -f6qZ*l .-Q :A6~W`5DjƐap1}pUGTT&V|S0>FpnY&L> j~eN]n&ᓄ9&KA;*|Ul9ՙ_h&Yd -V.狽_˗I[\3(Q@|؃l˗l#e*r 6K 0 /|So6_r 0i͕tURcɥ$n%ܢrT+-% -\@r,.a8>pi/Wl - 2⍸}x6&U)nƃg6TUM=R~P_VC6´ݪ5tU, N -T5K;U]l&dPJ1 -:QMw1+)aB]/~WM)iRܸ6ke`LƸա5.Hmjgfõ*'Mj*>%N.\nk^#VV^~)yIK_$.RV"̉ _r,AUVåv9Rbh-7XEN9vQQzGT5#ATò`)gV=HyX"%fFXB%Ao%ybD)';%&5r }<{lۺCNeArkG#SLwM_jƆ&<>lʮ8 -'|~Ѕlۨ)hvS`,IpLj[Ud isNʸ+tG.rMO2S|WsIS ?nYP*p9M*d -5BT ԟ/d#t@ +5<d5pKzDQ(ȯXTy&pU3*vf-̈Y춳pKc+H yrgM:ͻ=KLhzDŽXK%.˨(Xs6b{n@˷r!iw#c?yq?Ww8Ș+A,PCFb'oQ jU.PJ^K8]lba鉄lȕ4B MHJkbW G apLe\x! A k?0Ѐ=d]2Y{.jRiqvS @>R[q%=A -coJ``YKMġj2Yr'~/X?Q+^K\_yEMK ]w:U=A -VZg9 v╡Mk(O኎yW6鿽"Bߐ -b~;h-`Pl(*(2 [Lȳ+gb\YJ5,_YbLcvVeM+9KWa[ЛS{vpb54]B -c3>`rx}]¤/y,2ݐ%@f _c8KOB\}MF ȵ*Wy (Cܻ0cϿTX3sc~{ x`'h>e2= -: "Ax+?$qIeirE_{2~PWR+#=XGIwP@hd*\/ȦM_Y5aq -߄*ەEԺ߂t{r*n]5Y(yVu)'eդ|NGx ĩqh^+L*Y+o~Q}g)|i,t7\bT؎pJr#+nipL[VUq\ -09tk;r9Ʉv|^9s=H'㉗rƾJbUGsl(J6P(`:YY(b<Ʈt'XzBY,ٿ'v/lo.6iK(}˺ʂ<"tڸZ⽍_"nR/}|쨔v}1ȏ] ;WyH r)~ajס4O -^M,h YazBׇ9L-LtغV1+*yfW|+26tR7G;MuITxUll1vG㊨典 -rXB {%Q) O0% l(~猏3bh#:Ed/bbQC@pYfeŋ5 ^,saq_fGy +~ʝ䴸Ùk[si-*N`•.kyf-b.9Q`儯 >$Di%AL΁YP*ZEaQv Dȿ ,7bk.~R?DBe p inxjaiH ݓhEET5b2Uʱ& -U0 M!uu Ff (n(RlIo ș[ _82^Y^K3b]6ª,W"Jϊ.R&@Kkl='`>*ni۬0GUT'"[D -ms²YX++2n^¡ ζW`1k@~wVH75G_UT6XYzHXBIݚX!#k䌹\s_łw[ !U_V E/Sðis +eR 5 ט|P$v 6xb\o%4ljUA^*62Gd{d%%apTyoicoaLm,rO\+ẫJd -( iRV%Eu<|jTƔv[̸4M3C 1;K6@XX J̢~б Xˋjuޑ8Y8:ߎpY+bᄊEc1[dSr`|\.y/{:uBW&䆦79v_XjC҉A6653 -eTO'UEVLԯo T;TGH,Ie}Kw xʦJʯĮdf~*\|Fb\^YB-%*"[+Q4mȗSAL#mF8ů#E6&bm{rE]s_w4a\\KlmGGm$9w<.\ -OnKB 4v:q$}b$b!yGu|R23_O~*8_0t2n|?<[ՒUC -)D ^O*͡OK0B>(YI'&0ۏ`.y<((qK`djq~(}L)>E܆O D -j :lKuX(e,sO'+ԹyP;,ʂ\+dcjTW6'Vy2+b0>,Pz6(%Zad*)rXw7eK~nq{!>9y+)87Q.{bD*ʛ 'A C d/06%@p\=oƦ#+AmQu矆\6|4>w35)u{?TK0sny*fBǂ(ܸH5|U l?T th4*N )L!lq\a<.$ɽֿ ڐjȦ +\DgWu0J\unnW򖋫S Q/z8 -L51 m,8" -aqI&EĊyQ\Բgʋ&\nQKOcZE@ƾЈ`_U PƸBlቷAݶ}!+J~$/6V@8EXBl:',j(ra+d,(T$>_ 1zc]smiS>h|iB3JLPha?C-Яq܁S?(JOS`>%O#aa5-c{k Wo -F2 * lj._ .| [)̎Ce+*9  j ,>*N\iˈĻ_ gd#ʗ|`>|W>R|/7Gn) -k&>Ю|eD<_"zoyJƘZTbj-s{ (4{qu(]^h -uO^]Bh)'B -_TKj bm!g~c%(r&dSkЈ jWe0i:.v3{. )iwap2^US9C m[<|l_~v;2~Pf!طar2&DX KE`Gug%Ua >/%"2tQ b 7ɖ&P AStKCA5[Ȓ2g/ nVD+k)l Km'c~dR UeakK55_.(%2_(C+f]^fiZ j)1}Z9dŕ}\v۴C - -myU=] q2 L|˥؟}|] Kc{1Y&8y'D"dʆ1hܶ:h+ܭq! X7ΟP](uׇ`V`Z3rM`z߶wk G#( -  -;"+A([!v<߮6b2öeZzCHW `FۍBxՍ.?Yk,oZ&l7=4>_Ŕ{OHYԋuR0jGn%yR.0yE)n],ːJBE‰qc춶\|)>Lc. nqՓ"W-ov7q<5ZWˑx!ިCйIo cuJ )&xmX?ĔklQeguRKq  w1]N1U9o#W*iUc/sLL<%7iAMkdtו&UbHNo~`RDrVEG(<\X9U}@A֠?(*\@AuCP?d>s$} -ʕXC2Jb/`\cDŽ)+DB;ҿR]/!4<@LG;p9'T(0}5\j.ƕ)t%>oLjoKUWLL AMw>6͹O){Ř*żOyL%[ -2#(iBbxR/}5P+4QxA/4y1p.*|SrKŪa.Y&S:PYr /mK3X é.>%x~22V\m QeX/N,a`oF}P0cYPJ}o9>F~Թ3[pGTINhWc-BxXP~C@o:7{AG`0T9嘱i3<+ 27$;?F=r m)`7<]K.~%-@-~ # .awdiXJP2gRV,1v)a1칳5,e{ &^l\uhVHl'/2 kg7G^~IdVHҟKʕ`*7qkz,ԉQ "?%HȢmy +?H>YWQnx?>嗠%ܱiHk[2Е}H{>>w0(a R /Q?pE64;&bp\DjIN#}Lyt:̆.vT[z&#Y*;S~\O#@ao5i_PƌK9[v1W -\,(~$n CM#(vG>UibxcaZwnqQ;+Yj£̎ -Cl} -bٵ@nų8C97K@ ̶\ج,hV(j)]\ۙV -3#jAỐ\O ªM"I"_Yh¸M@*wH\FqiWU!( yU-zpVF8^@s^uUPU%~ Km/gB.ޱ[K+QV%CY' d00,XUu \9!&yHk-%9[单c5(P^؞t -}FW ~Ztˡ?{X h/p6ҫV2ZҎzym'$Lja 1NKVDdœ#fVYdB4z>BTZ+t"q Yk9$\}Uel*կ%R$+zW -XkܱE֣ܨyo -*^UM)JCMH…TxCC}7-A -TsHpIQWC+  P2T*70&e#vlZSAJ~@@QA(PۂfDZ: be䊺FWSEANB*AL]Z C.F֔(xd$(J)DcU[TAV%{\FnÙU)>.sSR}ԟ:^~``;t4T .^T -, ;S,.EqX -%s` -e@< ]ƣj_Qeшk!F85e kqEOYue,fDK΋٢^!7c {?;X-0P1pUs. c-QgY.7 -nmZЖfJ4RE|suP6cDaW'QEnIؐT@Up%.%ٜ0.r7ၭYUنRۓfǞDᶟjF ̄Ju$va-|u@ Z ZT"-%Y{刏&-1p{'v26j$kvBRP<xPjVm _/ץI(kϧ얥3CժYTlLp~b>B>WuQ|^JW)ժ -כdS.P0xBmM41~62m7`^gu] `mM{eJMb5yPhE9QyDZx&qR9xfai@v>~9R=bkھdZ3VRڂ,٦RDG9eT]u׷)Ϊ- \ @ iG?2E<#c֋gfήk -{2B9ʯƗHc(nWZa v]ڙgHV/?{pf GXt] -IJk_hfKN*=Իb?@aZ jцNqs>tDeڥe'* W/Ӄ)J? ]|CH[?yfh-ګ?n'TMVRMӟ'D ^עJ =_ e"\$Vbs$ċz@12y@ e0&¹N"1\J\9(,jUK.x'5i]캨v?Y߅7wyn@j(B¦W zژ0>U*!ȿ^](g?^_1SᴵT&bu_"8J?ZKCs}nw3 w;-B\JBT,X(HOF/b|R?qjf >m.)!6~~͵w*=O֭ĥ' -gjlɗ[`& q}|XE?5~IfMCU.0 &K1q?U=!DChj3Nz!L_ķW4*x{,cȱ ,0"ٶY 'D-Yq9<ܽ_Wٱyea+Xya ;OCE>@F"uKBCI03K\U} T_!Z^NGo?XCJٯ}gGI9+u_1FpFvoQNVO+{:ʉ7Q)=Jk<ܫ~P=T .pPB͞򱚶bS砳FM^ct'Eni.C̽=NKTa'`6T@/KGؠMcŸ%5RqFh#ÚQ62ҖгSl`SOǔϼ[~<`UZ?ZmtDEpĽ-aP#-9UH.KWBRT*i)#x_ugG0JёGh[ 6#qr.LIaUxFϪ3?g/ Eʖ/)b*WRcWDr}~c` jNԬAe5yon?ˉ9l/%mVyG픶Zlb}6eu{Sv{!`k-N.eف%iL -ejV]1~]ed3գ*Pښ/`bP8?ee%笠BW*6^Ŷ| ՌUً(V-.TD1p_RځyQW#2|+tjYfEBoC+jy62ʕCIgy9Ҙ fU~%e#~ɿ#ASΙW*⒪tIߺ!L"-)jDXJ. YR%FoS[1].T~7^Lаlv"TM}Cna{`״ :JܹE6jTk7e3S)"i3(/uեW(li V" q!]EDYf5/x3tz0BM/VXK2(a% J j4’VVv (Ʒ]V&HǒGTy3Gژ|_@ -a/^"mGWYB|ܖ\@طq^ưi{߇%Q b/͏I4ǐ+ 6WPƩ -Vv".BDFV |\"'"[ʸQȧv%A .Q/,ո/%&Mw~5nmN]RT?"Sa)*HTbJe  0 Mk}QMRʝyRPTo b -}D]a"cDA| X.%*]kbBpXy-FȠx%J|0ؼ(ܦ -ԳYL!HvQXls=Ţ rJ_joL<,瓑l#n 9 gV=.ʺYBX+%ș< #7b=Ĕ/R!lTe`B: `l\Cb- &1r44j+ܲvUmT7/X}Ŵ!rZAY߄='g%#[1qpҹTMmf^%Q2XPdlMkfD.)u /cY>eU?u`EJ7GglX5 tQ e\)1i(N{ d0.젩i1ͩ~!||]CK(Jv? *l]A -*݊[*iM0JJ!^ .S`;+² VF%,Z6 ە 6+9o4l{d@K6%VCQ IehZA (oOoD@s&'IW -b*<}‡6 KPke#lFvY, dہM =}5!7v).Zͫ).*㒭s̋.7-@ m*Qrꊋk?1J]ԣZ)F#rAh5rLegǓ|nS#KGkn -'cLRQRMb.b@u>ˍ2'GbDnh)cvõIU=x6ys(XY -mpli܋9RonPP+[᥷*ط˳ ]r7epw- ثR%aQJNAwrkUeK^J - (v_ʍF,Cd%"%[^!bϹpZK,IMv6=L1w%59)e F?Sĥ_I% ՞e<*c*j,.CN=%˖]Ki"-,av'a-9cNE󿩐pqLπN]V0Y.` mpA8qy)0?i8\3F L̩ܕ iy~bŋBuf SSY< -A.\I^.AH Ư"Lc.<7.-C㊽QW\P~ b]/nRTدRY-1E]rmƽFϱ sЀ*_ _ -6VZCe|~b.Ї"WYP2_#.??Ə btY_ӲĦQ[w7|@:?Čk<3e*&Tl=ϸJ"n';psnG7ݸ-Y;--SPįy[/6YUY3Q"*qi-؇D s"H!B)HV) ,UU-tj=@BxEct[y"@ln˙v<>'Mڈ!b7$U|EP -!VË1L8\i"FQ0^ -2-ܵ%bcZT7S܉7 v%Jd+MIrnm4>JfXHY.yakqlY*_emɨEШ% <7d]ܦm[T!+v=v KR1b.90>6{RRV LK:0%F1u2 D\ xa!wy)T;qɥI1*%l}-pv]`SE;`P*zYQ#EhS(latѕvzFW[CM TQ8uYG<XpZj+kbu~4OпO=pjyOawax-M$kߺ])#WHdQL7a?1%_7WG -2ڊaY U%=`$UaxY"e?bi@;% @AP`0p!1Q?_;~~P k\U9jh9^#<f>ִ&Z~ړ L!Ds|@V&,ݛ PBszvOz}Iޞm< 4f oCp{#*11up(Pf +5%lvB -(PaB -(P^*J^Çx8u8su=;:N/ ~.4 ߝf+&cb%bWy>sA+ΌL@&|&fCn=,_<\9% -JƮl ᐬi݈*ݞ5MzpwnnNS]9ϩk\@> 3:xWǞ/F -ϒ7noHu -+ĭ -֌T.N>tJb.4G~/TUR䇁d&d$'(y6$YffF FLb0cLLjE׍Fµ"A 0@P`p? _ u/Ʌhm/#"%_s-$I$I$I$,fgAG{/ܜ-OwV(H}R沅Z챕ᖻ,xl/eieV/7Fᲊzo|/7> νǏ" -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000010064 00000 n -0000445565 00000 n -0000445696 00000 n -0000445894 00000 n -trailer -<> -startxref -446031 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/56272302-541b-4387-bfdf-d560345e4394.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/56272302-541b-4387-bfdf-d560345e4394.pdf deleted file mode 100644 index 52bbc88..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/56272302-541b-4387-bfdf-d560345e4394.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/56f6f58b-5811-4ebb-9c19-d0db45c095b5.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/56f6f58b-5811-4ebb-9c19-d0db45c095b5.pdf deleted file mode 100644 index 345ca56..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/56f6f58b-5811-4ebb-9c19-d0db45c095b5.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/57544493-4218-471e-a656-2d7bf77d63dd.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/57544493-4218-471e-a656-2d7bf77d63dd.pdf deleted file mode 100644 index 66c5449..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/57544493-4218-471e-a656-2d7bf77d63dd.pdf +++ /dev/null @@ -1,2312 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 264.0000 0.0000 0.0000 792.0000 0.0000 0.0000 cm /Im0 Do Q q 0.2062 0.0000 0.0000 0.2062 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -32.688 0 0 45 1.13 3176 Tm -(NDS: ) Tj -40.701 0 0 45 78.57 3176 Tm -(1378448 ) Tj -31.8171 0 0 50 0.67 3128 Tm -(OPERATOR: ) Tj -30.037 0 0 50 173.85 3128 Tm -(DORINA ) Tj -27.8093 0 0 50 301.86 3128 Tm -(ROMULUS ) Tj -0.05 Tc -28.5108 0 0 27.5 -0.89 3064 Tm -(NR ) Tj -31.5197 0 0 27.5 57.85 3064 Tm -(POS:C3POS-CT2 ) Tj --0.035 Tc -31.7547 0 0 65 263.85 3379 Tm -(BINE ) Tj -29.5748 0 0 65 354.94 3379 Tm -(ATI ) Tj -30.5222 0 0 65 427.92 3379 Tm -(VENIT ) Tj -32.8262 0 0 65 545.76 3379 Tm -(IN ) Tj -26.2087 0 0 65 600.87 3379 Tm -(MAGAZINUL ) Tj -31.8185 0 0 65 772.85 3379 Tm -(BRICK ) Tj -38.7006 0 0 66.2501 458.59 3311 Tm -(CIF: ) Tj -34.7092 0 0 66.2501 538.83 3311 Tm -(RO10562600 ) Tj -33.9852 0 0 57.5 0.64 2939 Tm -(CLIENT ) Tj -36.9025 0 0 57.5 135.6 2939 Tm -(C.U. ) Tj -55.3299 0 0 57.5 214.06 2939 Tm -(1./ ) Tj -43.0693 0 0 57.5 297.54 2939 Tm -(C.1.F. ) Tj -39.9795 0 0 57.5 393.97 2939 Tm -(:R01879855 ) Tj -36.1842 0 0 106.2501 6.68 1674 Tm -(TUTA ) Tj -37.3959 0 0 106.2501 119.78 1674 Tm -(LEI ) Tj -32.3647 0 0 62.5 423.85 3572 Tm -(FIVE-HOLDING ) Tj -37.8406 0 0 62.5 660.3 3572 Tm -(S.A. ) Tj -31.4745 0 0 63.75 316.81 3506 Tm -(JUD. ) Tj -29.6711 0 0 63.75 405.68 3506 Tm -(CONSTANTA, ) Tj -25.1272 0 0 63.75 608.88 3506 Tm -(MUN. ) Tj -28.5198 0 0 63.75 697.7 3506 Tm -(CONSTANTA ) Tj -32.4333 0 0 60 408.4 3443 Tm -(STR. ) Tj -28.3639 0 0 60 504.79 3443 Tm -(ION ) Tj -26.9722 0 0 60 572.87 3443 Tm -(ROATA ) Tj -28.698 0 0 60 681.12 3443 Tm -(NR. ) Tj -0 Tc -60 0 0 60 753.28 3443 Tm -(3 ) Tj --0.035 Tc -30.3737 0 0 60 2.85 2814 Tm -(BURETE ) Tj -31.3595 0 0 60 135.42 2814 Tm -(SUPRAFETE ) Tj -31.8083 0 0 60 321.84 2814 Tm -(DELICATE ) Tj -31.0879 0 0 60 488.93 2814 Tm -(ARGINTI ) Tj -38.3719 0 0 50 1.94 2754 Tm -(UZ1024010809 ) Tj -39.7992 0 0 50 247.49 2754 Tm -(6422768014664 ) Tj -27.709 0 0 63.75 2.87 2691 Tm -(BANDA ) Tj -28.4138 0 0 63.75 116.86 2691 Tm -(MASCARE ) Tj -29.4468 0 0 63.75 267.82 2691 Tm -(25MNX45M ) Tj -39.0569 0 0 63.75 433.44 2691 Tm -(520703 ) Tj -26.3134 0 0 63.75 561.94 2691 Tm -(ANK ) Tj -36.7077 0 0 48.75 3.78 2632 Tm -(LVO501020402 ) Tj -39.5316 0 0 48.75 248.44 2632 Tm -(5948941004730 ) Tj -29.3877 0 0 61.25 2.86 2568 Tm -(PRONO ) Tj -32.2815 0 0 61.25 117.4 2568 Tm -(SACI ) Tj -32.363 0 0 61.25 225.4 2568 Tm -(SUPER ) Tj -34.2524 0 0 61.25 336.83 2568 Tm -(REZISTENTI ) Tj -45.236 0 0 61.25 537.46 2568 Tm -(35/15 ) Tj -38.5402 0 0 52.5 1.94 2507 Tm -(UZ2210109185 ) Tj -32.6734 0 0 52.5 250.84 2507 Tm -(BKOOO194086 ) Tj -27.9441 0 0 66.2501 3.87 2442 Tm -(PROMO ) Tj -36.4921 0 0 66.2501 124.32 2442 Tm -(SACI ) Tj -31.0004 0 0 66.2501 214.42 2442 Tm -(SUPER ) Tj -35.5626 0 0 66.2501 332.82 2442 Tm -(REZISTENTI ) Tj -42.8552 0 0 66.2501 527.48 2442 Tm -(35/15 ) Tj -38.5402 0 0 52.5 2.94 2383 Tm -(UZ2210109185 ) Tj -32.6734 0 0 52.5 251.84 2383 Tm -(BKOOO194086 ) Tj -30.9161 0 0 61.25 4.85 2316 Tm -(BURETE ) Tj -29.117 0 0 61.25 139.69 2316 Tm -(CANELAT ) Tj -27.9122 0 0 61.25 290.7 2316 Tm -(COLOR ) Tj -34.0652 0 0 61.25 399.81 2316 Tm -(10BUC/SET ) Tj -37.7115 0 0 61.25 582.55 2316 Tm -(33 ) Tj -38.4177 0 0 57.5 6.94 2254 Tm -(UZ102401100109 ) Tj -38.9735 0 0 57.5 290.5 2254 Tm -(6422768022638 ) Tj -31.2182 0 0 62.5 9.85 2188 Tm -(PROSOP ) Tj -34.6149 0 0 62.5 143.84 2188 Tm -(4STR. ) Tj -31.203 0 0 62.5 256.85 2188 Tm -(PROFESIONAL ) Tj -28.578 0 0 62.5 476.47 2188 Tm -(STAR ) Tj -38.4177 0 0 58.75 12.94 2124 Tm -(UZ434101137344 ) Tj -37.4359 0 0 58.75 295.52 2124 Tm -(64256670O0530 ) Tj -33.076 0 0 57.5 14.84 2062 Tm -(HARTIE ) Tj -33.787 0 0 57.5 151.82 2062 Tm -(1GIENICA ) Tj -32.1644 0 0 57.5 315.84 2062 Tm -(BRICK ) Tj -0 Tc -57.5 0 0 57.5 425.31 2062 Tm -(3 ) Tj --0.035 Tc -29.7474 0 0 57.5 461.45 2062 Tm -(STRATURI ) Tj -37.6085 0 0 58.75 18.94 2000 Tm -(UZ9005335 ) Tj -38.6432 0 0 58.75 208.51 2000 Tm -(6425667001247 ) Tj -32.5007 0 0 58.75 23.84 1941 Tm -(HARTIE ) Tj -34.2 0 0 58.75 159.75 1941 Tm -(IGIENICA ) Tj -31.4727 0 0 58.75 320.85 1941 Tm -(BRICK ) Tj -0 Tc -58.75 0 0 58.75 429.29 1941 Tm -(3 ) Tj --0.035 Tc -29.3131 0 0 58.75 464.46 1941 Tm -(STRATURI ) Tj -36.7288 0 0 42.5 21.95 1894 Tm -(UZ9005335 ) Tj -37.9827 0 0 42.5 209.52 1894 Tm -(6425667001247 ) Tj -30.5764 0 0 46.25 13.43 1841 Tm -(SUBTOTAL ) Tj -29.4406 0 0 57.5 4.69 1536 Tm -(CARD ) Tj -33.409 0 0 51.25 3.83 1479 Tm -(REST ) Tj -30.1519 0 0 53.75 5.73 1365 Tm -(TOTAL ) Tj -28.4619 0 0 53.75 122.75 1365 Tm -(TUA ) Tj -0.0299 Tc -53.75 0 0 53.75 198.88 1365 Tm -(A-) Tj --0.035 Tc -32.1083 0 0 53.75 275.8 1365 Tm -(21% ) Tj -30.4727 0 0 51.25 5.73 1304 Tm -(TOTAL ) Tj -28.9701 0 0 51.25 121.74 1304 Tm -(TUA ) Tj -28.2402 0 0 51.25 198.86 1304 Tm -(BON ) Tj -31.249 0 0 50 6.13 1248 Tm -(NR. ) Tj -33.2069 0 0 50 83.84 1248 Tm -(POZ. ) Tj -31.8175 0 0 50 179.93 1248 Tm -(ART. ) Tj -31.8315 0 0 50 280.77 1248 Tm -(IN ) Tj -29.6408 0 0 50 331.86 1248 Tm -(BON: ) Tj -41.115 0 0 51.25 10.85 633 Tm -(Z:0217 ) Tj -40.7052 0 0 51.25 141.8 633 Tm -(BF:0126 ) Tj -43.7682 0 0 63.75 17.68 559 Tm -(ID ) Tj -34.816 0 0 63.75 67.83 559 Tm -(BF: ) Tj --0.0088 Tc -37.5 0 0 37.5 9.3 449 Tm -(S/N:DB4700011007 ) Tj --0.035 Tc -33.965 0 0 52.5 9.64 382 Tm -(CASIER ) Tj -44.7362 0 0 52.5 143.43 382 Tm -(1: ) Tj -34.631 0 0 42.5 442.63 827 Tm -(C3POS-CT2N1378448 ) Tj -0 Tc -65 0 0 65 835.72 2745 Tm -(1 ) Tj --0.035 Tc -25.479 0 0 65 854.88 2745 Tm -(BUC ) Tj -0 Tc -65 0 0 65 926.86 2745 Tm -(X ) Tj --0.035 Tc -45.643 0 0 65 961.45 2745 Tm -(3.99-) Tj -42.286 0 0 65 1074.49 2745 Tm -(3.99 ) Tj -0 Tc -65 0 0 65 1164.85 2745 Tm -(A ) Tj -63.75 0 0 63.75 839.76 2625 Tm -(1 ) Tj --0.035 Tc -24.9694 0 0 63.75 856.88 2625 Tm -(BUC ) Tj -0 Tc -63.75 0 0 63.75 926.86 2625 Tm -(X ) Tj --0.035 Tc -44.5517 0 0 63.75 962.2 2625 Tm -(8.14-) Tj -42.2387 0 0 63.75 1074.24 2625 Tm -(8.14 ) Tj -0 Tc -63.75 0 0 63.75 1165.86 2625 Tm -(A ) Tj --0.035 Tc -25.2676 0 0 57.5 516.88 326 Tm -(BON ) Tj -28.5644 0 0 57.5 588.87 326 Tm -(FISCAL. ) Tj -0 Tc -61.25 0 0 61.25 479.61 265 Tm -(2 ) Tj --0.035 Tc -37.7675 0 0 61.25 510.56 265 Tm -(9000221498 ) Tj -0 Tc -61.25 0 0 61.25 831.85 2506 Tm -(1 ) Tj --0.035 Tc -30.5124 0 0 61.25 857.43 2506 Tm -(SET ) Tj -0 Tc -61.25 0 0 61.25 928.87 2506 Tm -(X ) Tj --0.035 Tc -40.2265 0 0 61.25 964.27 2506 Tm -(8.37= ) Tj -41.6176 0 0 61.25 1075.25 2506 Tm -(8,37 ) Tj -0 Tc -61.25 0 0 61.25 1167.86 2506 Tm -(A ) Tj -62.5 0 0 62.5 841.81 2381 Tm -(1 ) Tj --0.035 Tc -33.5038 0 0 62.5 867.38 2381 Tm -(SET ) Tj -0 Tc -62.5 0 0 62.5 930.87 2381 Tm -(X ) Tj --0.035 Tc -40.2265 0 0 62.5 966.27 2381 Tm -(8.37= ) Tj -41.6176 0 0 62.5 1078.25 2381 Tm -(8.37 ) Tj -0 Tc -62.5 0 0 62.5 1169.86 2381 Tm -(A ) Tj -65 0 0 65 806.72 2252 Tm -(1 ) Tj --0.035 Tc -25.9886 0 0 65 821.88 2252 Tm -(BUC ) Tj -0 Tc -65 0 0 65 895.86 2252 Tm -(X ) Tj --0.035 Tc -44.5092 0 0 65 929.44 2252 Tm -(10.49-) Tj -42.6764 0 0 65 1058.5 2252 Tm -(10.49 ) Tj -0 Tc -65 0 0 65 1169.85 2252 Tm -(A ) Tj -63.75 0 0 63.75 796.76 2129 Tm -(1 ) Tj --0.035 Tc -25.9886 0 0 63.75 820.88 2129 Tm -(BUC ) Tj -0 Tc -63.75 0 0 63.75 893.86 2129 Tm -(X ) Tj --0.035 Tc -44.0812 0 0 63.75 927.46 2129 Tm -(19.55-) Tj -42.6764 0 0 63.75 1055.5 2129 Tm -(19,55 ) Tj -0 Tc -63.75 0 0 63.75 1164.86 2129 Tm -(A ) Tj -61.25 0 0 61.25 802.85 2007 Tm -(1 ) Tj --0.035 Tc -25.9886 0 0 61.25 818.88 2007 Tm -(BUC ) Tj -0 Tc -61.25 0 0 61.25 890.87 2007 Tm -(X ) Tj --0.035 Tc -43.6533 0 0 61.25 924.47 2007 Tm -(13.54-) Tj -42.6764 0 0 61.25 1050.5 2007 Tm -(13.54 ) Tj -0 Tc -61.25 0 0 61.25 1156.86 2007 Tm -(A ) Tj -51.25 0 0 51.25 794.2 1896 Tm -(1 ) Tj --0.035 Tc -27.0078 0 0 51.25 817.87 1896 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 890.89 1896 Tm -(X ) Tj --0.035 Tc -39.7414 0 0 51.25 924.61 1896 Tm -(13.54= ) Tj -43.6575 0 0 51.25 1050.47 1896 Tm -(13.54 ) Tj -0 Tc -51.25 0 0 51.25 1158.88 1896 Tm -(A ) Tj --0.035 Tc -29.0011 0 0 55 331.86 521 Tm -(DATA: ) Tj -41.8264 0 0 55 440.53 521 Tm -(14-12-2025 ) Tj -28.3217 0 0 55 639.71 521 Tm -(ORA: ) Tj -42.9331 0 0 55 727.5 521 Tm -(13:02:56 ) Tj -43.3757 0 0 46.25 1092.22 1838 Tm -(85.99 ) Tj -43.3757 0 0 47.5 1095.22 1540 Tm -(85.99 ) Tj -43.1195 0 0 51.25 1114.54 1479 Tm -(0.00 ) Tj -24.9575 0 0 61.25 277.94 209 Tm -(VA ) Tj -25.1488 0 0 61.25 333.88 209 Tm -(RUGAM ) Tj -28.1352 0 0 61.25 444.48 209 Tm -(SA ) Tj -30.1242 0 0 61.25 498.85 209 Tm -(PASTRATI ) Tj -25.6067 0 0 61.25 659.88 209 Tm -(BONUL ) Tj -31.0688 0 0 61.25 764.85 209 Tm -(FISCAL ) Tj -0 Tc -61.25 0 0 61.25 888.96 209 Tm -(! ) Tj --0.035 Tc -27.9179 0 0 60 221.93 145 Tm -(VOCEA ) Tj -33.798 0 0 60 334.64 145 Tm -(CLIENTULU|: ) Tj -37.6326 0 0 60 552.6 145 Tm -(08008 ) Tj -30.9568 0 0 60 659.85 145 Tm -(BRICK: ) Tj -37.0975 0 0 60 782.6 145 Tm -(0800827425 ) Tj -35.7981 0 0 67.5001 241.68 76 Tm -(TIPARIT ) Tj -31.3527 0 0 67.5001 391.84 76 Tm -(DIN ) Tj -32.6962 0 0 67.5001 471.65 76 Tm -(COGITO ) Tj -29.7288 0 0 67.5001 590.82 76 Tm -(ERP ) Tj -52.1135 0 0 67.5001 661.8 76 Tm -(W. ) Tj -30.2193 0 0 67.5001 730.68 76 Tm -(COGI ) Tj -32.8611 0 0 67.5001 805.71 76 Tm -(TO-ERP.RO ) Tj -44.148 0 0 51.25 1093.45 1362 Tm -(14.92 ) Tj -43.167 0 0 51.25 1092.49 1304 Tm -(14.92 ) Tj --0.0276 Tc -37.5 0 0 37.5 604.56 593 Tm -(90002214982025121413025602170126 ) Tj -0 Tc -42.5 0 0 42.5 1162.23 1253 Tm -(8 ) Tj --0.035 Tc -28.0603 0 0 56.25 958.12 651 Tm -(NR. ) Tj -32.5071 0 0 56.25 1011.93 651 Tm -(AMEF:0001 ) Tj -30.2126 0 0 47.5 974.73 471 Tm -(TD: ) Tj -38.303 0 0 47.5 1028.59 471 Tm -(00046924 ) Tj -31.5815 0 0 53.75 1029.66 409 Tm -(CASIER ) Tj -0 Tc -53.75 0 0 53.75 1154.12 409 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw"1 ~sxߺh@<@XkrŽZ*#|8H^+A0گZJJEzD֤ղFZ=kJzh%҉rCF=zV.J)z~Zyy:l慫Sʉ|%`5=p_]JpXxz.o;KJм-j^hMkbV(D5R0"CҴZ:z5cK"=vEM\w->OZ+eh!iEKE$3Ũb؀a\"Aʗ@- -Ujע pU Y5\`Q Ȣ,Drkr[[]\/N=l*I!-ʲH+,aجOD@h1\ex"evTn,WBPWk+r2Xj4 BHĭ*" 00YaX<$ejڤd`B+T/UOMK@zW%c64528YM8i5`^gKY -V XJ@KeV0ua(-##°T]E4l&9mX=pmVMUH*ExbAaQ00@J0*x+BX0S EadB@8VHc!RRV6-itJUU`ՔD!bY іPD,*#)$!RJ@0Ԕc[[z @IY6J@GEqK!eafkyhB#XQmnW )aJYYeSXDh##DF-CՕ )(abi %BA dae P02V [Ta#,Ĵy*dWPidhV! P -b00Q"Yc:mh Vt U U YlZ,\pb0bg|KPPj0%X;o" SbS)e,H W `%Z9Xz%HT5ŕ @cV5qRFXe+[*),YPla2@kidhV %a*dF"Ս 0²MQ#oZaRGW,/2!~'1PB\k[X4 - D`RY[*1m`XT+|" {X|zJeq\<w^tI:nZ$&ї#:z5WX0w镵y ~ ^J5^˺eixF$*(ajHT0#G6fT!}o۫uHt.#x&r7O -XEC+`5]w`N,^z-(4}';Ը},uhnMչEuGk׫shZnΏʶ\|ko`. -JΥ GF@HQbkz*$tx@$Jk" COenJl6VF5AZEZް(DEkFVB\ 5, U1BDP)*exOO[.;&tN>3rȅ7Q>yVqϡV4 >7iӴ1m8Ӓ;V4x u|Q.X Yͅƙ1t,A򮱆Kux ..&fءFeaB21) JD0$ WP%L W@ !Gl붍AMZK2EC%EjʎR [PΐUIL0Ix[_g#ڷw^Rsjlcm[0< Xl(|Ӻ; X0abGX}{t6G4|}-'ͱz̿3ɡo>Y];539ΐtW&dX ߏjQm^YPbf@8 .": %Y$#)#,`XayصU B%TIZDe* Um 2XՌk!Y R55p)B@,X!X2B-b"A*bMCp'$2j[UZf%Ƣ?JR:A-U:cUP|ʏM`?<~z[ji`gЎ?J1zS `t[ D&HB -C 4¡`1T: `HQU%V*VXȪ0D )CAX*dXDd(,j5Q$Czx,YʙQ{5< -U74WW:+5]K7O5ZN#,,!x|ܮ^ݬl;~l4?,utõe_&W^Ӻz9滿jA`:iǺ1G7ěvNE !G4Y:v:-۲_d*e*Y%@a k#D%,2U\@ ]1 -XdBՋ]&ƌՂUS$0 H VWUJ^X,R/ڸ{BqMK4'=;yS_6s%yk9GΓk#?=st γ8]GL,{hv;Ow:qƱힹ}ӱr^mp[rM'?ܴ{V7lvN+b}Y`(^{_5 nmI\d:ŷp*bXW`(J VH "dR!& -Z)aYaJ)ڄWXkzȵFWP#VUq[+X"ZQ]ȨFUc؇wJa>܎aCfg`szkmxrmܔ>AcE߈jmsV NF<, -=Pj_8-4`TArQlCf7z[=vRAJbԖc=;UqsV"8 $$d"RU2\P !VaյVc*(ȦEnXO86KP -!kD^ŐNJu_OϑJwyD` T (@H@Caq8t. ۆ/(6~@[]͋'.|x]պvP}UfOz^p{;yl6Eu - Zo]%0(aH$*Ra - " 0!!$%IR[\JÈD m=S,\At([ILa9*mkAipɐWRIgEE5,,p$bhA:'9k?kg[G w+7nYvW:а`o<+x:ln'm46ߪ׷8yXFφyrŖ袅zo$C tPF*&ŌCÉ+G md*։ -+$K*!F [q$aΠ&YK)*gVXEy!q`%i0BEECG#P 4 W!ZXb`8ӪVunQ9 e|31:2ׄuI<~LuZf%LћOٵSs[6k3:"bŅ,-bB$11VŰ: oY!J؂ ,p䲫Bh,[!Th2PUa [$"B4lE0X`b«,Y, -Q+0\JXڥ ],@dH@ʤq 8U@ XEj油@hIS9(K0Z1T,(h T вt 2X`aZƅQPbBJHR0X&X@H)j (epb\ -C) ŌF$%HLG,5TImz؈VPƷ`)е.#G $z\J(krN$,z--XY|УS%b)l72,<4o@h]mbpy:%,s\@jI5Am -AՁ [ZW&3U1f WP6\lє?1'V5DqqކQh;zq~QjF]0޼njd[&'jv-X_"z+9{l%Vy3Ź`oNaӰ qw;>$]&s*$Xyq}ZV/ #bdy} ˖_/39MA=| BDž}d[sIH/;m~4^_R>utN#PY2D]5fhKJA7_G9kW&?9һG&4.ڼ:k\6l~s&W]QF"-pa!-WHX%tU@E+ (F \.(alAcY !$½ a [ݘM=CIX,$(P0 @)}`#VF@*9)`dDt#,kD+ 2e -sLoZbN7/5kd׵[O/~V{W9nd^eHtmMk\Sԥ@*XX@-4.:]̾2\,gV!uY }eePp,rSs@ ]يK-Ў.%B@eJ -VnJ*(E@X"+@k -:#]D*О,)]TYYW#6:q,V3V5ΩZ7˾+'NagKQڪz18/sx۷.ux^w%dz0y>S:W-:P] J_hCh盲XOb _5Nr.羉<"%hi #ekAPEYaEvf@Y Cʘ+(,"H! - ;W 1V *!b:1dV,A&(  (,Pc -JHlT&EB#XHUWJb#bs/_Wϻ'u5ͺ)fcr}9'CE&mM7f,50`ġ -" -%7SUH טYs5+6UK&YIeV2<6Ed% Xbb D1, -BE`I $ 0*Cd @aB@*1!D,WT!uUu(c_G.:\+ 绱}g-ïLcaV$,H  -䌲!H! ZZWdx#+FRE"3+-°kI=ZVd9`gZ͎;'&:ɷ {㽛|s0O~0<'eq9b;W<9=Z6\MƯYo󣕫̂A@HGQQ*TAcC. a%HP,@+BjY1`UZX,0݇oֲH^Al6myO`95tsv~>v N >/E'ι>5tݤJoHr9+ 05l76R kCg'LWm,,bޖ]؁MÂ;+N9Ok} R\ԢPVWZłǀB mvC0+ZlV R9K *$ XaiT\]E#^K,Vba"¢bXafU/:r>N] OT='[yؽh5qERPުj@ -B$3$DX<# -LnicwZB;\VQmN9}%EX#K̺^u%xfcyWF&θ)o -)]R]] $u#PL-ky+mcvQS82IPTY"YZE+( -֥W>T*Itky o3T.Gt#,$yGGdx ,z숮t*k+bWe@ -H \Xšİ6)L.XFG؄ d+V`BaJa`MI6B`Um)We *)QW -Q+eh mgz3^6<޺4[:Ea6;?S68?@7E$[:5CqգpIzEazf}M/;hx_z9<>pn63zr{5xp&fu1߮e#1!`6E ,"(:C 9GLVE@xD 1e"DFYna $VP"I $!ZZypV!c!mܯ̺> 9Fj'_?<#ǰ͇vrGָaz/3+y7¨r.qgsvk9gA9I=dϏ2l\sSri;qyO~G0%vnsѹ溽нQұ f@V SVK -]n"0%=%x0A^Ftd$FS2 -#:PbxVCM *; jD.Z8D[ -9Xqܮ*6 ogKb>s Y"pVn]U]Ap,bj;x4 VVkyoi"==+<Ul?JgcK9grf#o_OST9eK|W@4,1zJ^X\;%I/o-O-Go#5|{EMqa1\eR*ed" -B @e0ec0ٓs.`珉V s+C D{/d=[Zc[3"rޫ]io][+0|57n ktRdl`@dYn:ɋ'a`/|x|f2xFn29&m\tj~c Rhоlk>,m\fkKt_vi\ænFx -WtŪm8}洌QгGQ~?g 6=SuCq^"ti5߹u]0 }sҎ{GΧ5[Qz6׍.8B-)*qPb[j5um*8V蕑 JA,. ť -,[P %M[4W2[të[>0Y:c/ir9ONiej!8wU܃`0ƇϚ3V>j>5_5R|wfL2{/5Ϛ#z%*ra嘾FC" 'Pzv-0{-Ik;G$`5,Vpܳnj>9nӭt#mzr]OR[|e*ZW Ml@ -$XV m̳) -VbU6)BIHXh2h!++) X0`e`GCCyf7L[v\ܸ'zr+v*s惏@A0n+^n\SK9b Ju>{q7&{/w>wm.+{sÌy}8Sz'$ZP7M3s=/3ӠnFĭ\_?Yw]7tUC{?dZ)I]?Ŗ$0Cxd)]:u^O89 Xoo#qٳn.M݋mO<>~=H2Wht؜ֺoVpg3ͻ">9g'N1^9wKs\sLm<ۀWj=LX2BUbEz$,!dW [ -GXMqX+Sz$;:7پkM̦PhΔg [*u:UWnڎ/uiG\wM8|~o-r!<^e;?7s·wg_v6n79k0;ϣVUH I:6o'?m2{45=+ǭ: [!LKnJ[Ge zrn@."7NV+qnǣw:Yp'X3;z1cVa¥zQ HdX)RuaB`L -i"bVYeJBҫG ! -17Kj/"DDFT{ݵicz.ܼ3gӧU/R:DH.BE$y_<ظ&6ܼl6q⎟98>Upssɸm3uwvaRFM;'|\2Gt+x#4/kJp߇6豣ۣvӏGkpDq~~Ersx.6wq׎xj$,(w].̇5'\eGy/T}1WLfQ2矎}+HSNG׹/[/xlHU^D@ Xsa<~us-?9Sz-NKH"mĆ[&@q#]0! -yo Б #0(Jh!#%Cwf ]B SMpU`]BT8ÃT>4sZ.=~cxں^|Ǩ|Nf_GS%y6cqGCF|<_VrrQq]:ty& R7@ݶu{ֹAoO97PrӋ̜kb2FL8ݴLaL>vjΦѡj5$ -Z-ImJ1ՉX.h -jtSZ45:l[@䀤 j^Y(VPYaHeSFrweԱ>JҲ< L PX -FDdiK)IIuIOP۹^4h옎`v̳&F6W ֖#(:SNp;4)(Uz e֖:Y pd!dCrڲKExj.EY.E{[q{=]V#K uʣQ -` +@3Av 1ޙ=Z֎g ϟp=yo k1]OC=,*ݧJmBn7ɺ&5b2F-G]bM/9YWWf+Kh0o{[Ca7:aXzķۖ'[y=aCl PY/92rޏ=Y _]9uzxhFS!Rt{o[޳9/=f{NuK_ -D">o뛲ބb]]u]/kij\NMxy`s[Gg-ܬe,FjjaڧMQ -Yx+"SE՞=#QeWXHKhX59槳\U87kyFT[%}=^oBYLJų̻*9&ᶚ6l\~D)dQa+4XΪ9ظvXQg2w;]m;W'r'PL&^_zfug;׃NS{<ZZ6GI⽛QեݓvC.?Ra.1*g#c\Q{s?ŹUiCW+]U\ʉhR*B;Wb7 +X,ZT@ V -0!X1А 6H@VLK (9=^mWayv|<{JGa=U٣){xMp!jx\Cګ8CPic],eIe={=<[UI`B&n+Xدu=!IɺH*EZUѾ}Z5.9бUVXShZZU\RQX)=t0Pʈ)yВH9HJD` #4,P$`)\ۋb=+cp~c؃d獫<7oD֓UȜ -\63g6D3tV>\|Gk~# ׫nǻ=ǭ8;E֫o9gS+^ADZ)$T5AR›+%jhX*t%91&k:=zEJ'pZӗgs:FS9?VC3Q?l u5X2R\ P mP5VPLz}w0?`9׫⪍/qz7@QvY}YmNZGtg1^w8mdKZ/KƦ-PHKj2,B+_@Eť |WtNQcH* ޴qbobL7z{7.+7$V̻Oz?k_{H܍x.ŻGG2GYz;^qzgLދfd.7oۯgCEJ I#ʬ4Jk^#Sӌ9u9C~)ٸR{Ga&z)+\?񬑝빳ePPVj̴unWMgq7m+/0Hyey_?z4KT9ԭԚt%RRjRKk⫒PaG9V+0e`*ڌ&orv\雟ڌ9bVv=}~c48J7 A4掛Eů柠5$;!Yk8~fن5[km~USb4ͦOhdt}kc1]NYق2pJ|u"q O*598ˍk9`=f&W!ߎ{{)Ѷ]`̦ughx ˨S욏F5J},__Ms̞FbIt=p?ꉤ5ެbv hp7Fl~k\^ݐFHA Ǩ԰fT kb[ISApѽ9|܅us7G%#x2|:>Cjt̺w&6Uy avW|14 RÓLv -kcΗ5 Va:/6G35| _f0Bt sdxN !2 -u^ko# -U{cpmC,fgMH'Swk'rN?yևGYJ7IuS.ήKIi`E[泒\tt,yռM,8o.ny|ܟ9tV^nG qRd=l9_EYy$ l ,Ց`u@9F$EX@#H0@ -Ց YHUadB0Pr !e#It`X2Ғ[+ٸlf{9ii;okb-[NuMCaAxOG׌_aӵ#p]X2&ώкF7:we#Ӷyo1&`NͲӣyM4W&Ӄk&;}z!Rrx9|75Ys@զ ˩솕Թxo8LbWFH0R@ -@FdPBFQ)a `j -a!XIX1(Y`3FK%p0)l R 3Vɵp?8wL :;zW, 2'fp* Ƿn\-Szהѷ-HrtM4b͇ʝGq]c#:$Fy7[|9Wϕ1{G[]o L7S4pçQ9h(a)ּu# i:z".: \,(ƻW:/3\rSsN^:;?{ƑS9t^1x=^9uq8OA+GY~bt݆й99Q\gbś6}3r8&Lj^CDX|w?StbtfA3ln|xcmkf0!p)x"إr$v*Gf -Ū$h$xk>jjZ6)zA(/߹B=ќu&ynikb3h;EQp ^dnFN}st 3Gmx#zda@5em5g^ 7ɾz=Wj'M@@U" YI$ d|::63!uMAj}dw=ͺ)_nfTq0;'7mtcXش=2O<u&լftV+Uƛw0b2zIhA;niGmSZu9fOgzM5!_(:/V\ft qu;\!sΆBHDtaXr -cV*@YCpj SXhQBU,U`p1 `Ml:H:`e'_[írNz.G-|Sr7noѹyΏ6Ht^h{zxNlunz1ӡt n/,gTڵSHf3WvhۦZE UMj6uc.ϭʌwMt*'㲣s5gl{nqH RB=LXj#ʈML̿On3ԏfϧFd72E5s%qC^ڲ{ }ߥ;ecOuu^W2]Pxt}B 4"2 Gv83gatLg4ӖGY~hy /^lmy4gg$Sݵ߾H [8v3HmIks/>9KzGE}= kcwlAzLW@T1$h,`,x, bBId\dzmGȞlNv:J1cH1kjAf4o)y&'y_Y%й5 i8E^.o盟v.pe3Ն=ٯo0J|z_A_d}ׇY}w휢2=:_\\CpOyyN{.g.'7L汻[O54»JdMZw tQq9-M@蜗l֍`кExgecSvZϡI'KcϒMup snr:xYYc@뇖zkPbHA#¹tZˊ+2/=q31p{jKר0Yyцaz=˲^'{t<# Cƾx[$=u~|َgFrnHEUEi6}Ѹs#~lqwGfSɘ5m}"qOf/p7}-\},kwgarvm&sƟwH#_T3^ǔAk瞀R= ygGzIKDCnQ=XL _c1tv5 /.;sފ֎ ݹsQq>;b8wmp.}muWOO>ͤt#߿hؤۇ8pߢ89#cزXvݫ{ivo~=1`U oŒMӞm<6 !nuIٶխMZ!5~kT}4 ɲ _1"|Z s1f][߸uӹ/X%y)s]sGnڑ7>rpc8w/Y -ؑCC -    ,@ -LIasV9& ][w!(1H -rs})j{rÓux@D$n8f+xa恿'5MϜ>7餘#QW@QLaC\Avty`p5cg_9>ZԴcO[:kMHI!$  `I!$!$HI!$I,HI!$IdFI!b ,*b$H"$ CV4aP4$Z9ҧI79{! `#Aa>NsrڗSW?2]K9Ck؎sپ}܍7^Y" DHB!$HI!$HI!$!$HI!$HI$BAXV $ BF - @(UisY$ID "C 0efm/.pLΡ~t:N?xtHHC z{8ӹ<ջL\HTWg(pד>}3OįUm?pI$$@ ђI@ ",1H<1`1H`VR F A`,!h AeHHV F ea!  !aBV63h盹pf?ΝpkY>3耄h YH`*M󮄏 hh``$V ep$, 5@`TGd -T:8XXir@; %dsT, DuiQ[J+["\dx`a`H0P0"@XV4VrjD R@V B0M6e2LO7d׺q×{:84|T'ؐ6䌁 Mpʞ0J0(HMn+DB\," 5a@@"XVY+%PH̰( T -1mXa"0ʁ\FY!F2 FZZI5Y!fBqԉC]tBe`B]/ -2QAa(!BC4 (h!P6S`ՈYЌ(0Xk,Ҧ0LnPR{21ZzdR43}~u60v"Kj -ftۉ'$.Im,_'Q64|4&'#cwU[6Fcڱ7o2 o}k]J&Ҿ-Kk{ҳW܀7_ZZkGcLS:E%>+vsQkZiƭurYڜ晝±9ϲ^0Σz<įNooTz43{<>lجrqSxkg_Z6̬9o *2 `!RrN„8|4,K!Ucv0yW#a([k_-^$u72$p' +sU@DBE`"[PX!dBTjadR#DR3h`A"1mʃ H)1HV"Y§WQKY,-[+- [Q<,by^VSV\YiO$䆰p2 ! -fnXj`pcF: -4VXT+uF"Y4+G -EGA`a -\mo.@$bL$V- 1 r:gK@ c. CQ QA 9MEBY%LbJ $ -Jˈʥ 90է?buMߴg[D oN$ooqgLjhz9Zn;G=ϛ M -e=BYo!oqbsײ&eNH J@H DX L9B * ł ze("JTGPB mn#A.KG Jd$8J S:bmlu5yTCqj@; P:A\ͣt^vc9Qum7o.8]2++ :gp1hƨm/No؁{u dUtZ VeFDU"+»  MaZHV$9" `* qa#V%*#@ ed%UG"ee @H$X RIj",6LyFy|ѫzK&QE! -+ٰxU= +\g+hqTj+t5BAJS   uC%Xf8D21#!8 ʬ"5c`V)Wi[H!c`@ b)C b!#XH"#Jc3,@ -ʱXh*) -Ն`Ŋ{yv-OW6`=F3ٚ 6e8t֪"ļ6~ʷ2k;Ϣ6G@@Qp"<++WI`B+p0T-)h#֤)EFfHA S@:ژ+ZA-"*lIБH`V18Ni{Զtx=3p8Ԋ2ף>4iu?׹ ?WSd#_vb)|s/I*|1Sj9lY\($00 HF"TՌDh,p@kT\Tm%V؀XVKjH+)X*Qb4`t daPvE 8,z Pi!AZ oq=8a汗9q HEx%^|✣aI3Ta+$f,+6E2l(/aZflæ5~w7M\*^6s&VO^Y h>׭lWo@ .VF%NJj+KUTABV:#b#! 0#D%E(c`@A!"Xq24 X01R=bBfmFAoAXb!2%&O}JHj6MG-A2,gc!M.]u3ugԊZAÏv.MffV[kI7a׶#D !e@Hq${LTC@vYMBD ` S $+V -4B1Ei\KBY-9,VDdb CTUb80XRrXZn (0M3t֏ft Ȭ ˩ jrBHUk>TT&bVn樶5}ɤVZc6뼟}\h:1 6r@Uߢprh&]!=^TԻG}~k[?͛ Izg4鵭"\s0Y8L!R#ttjY֏<}s/}!ҧ.JW7w|)5]M+sNft]@]t|wW9Ju7$ss;5Wۏg=(snh[A=ɡo[ZfyHɿEz+Ԭ5p#H*a - )$,<I -TzE%+TDCrqy|>Ӧs^s.9jNXax.4i~.l̖69?K}2VgJMb3nDirc8`0?t/tØ{|Ӝџ:}s=>__y6}snwN8|^uWpYEߦcE߹scrnNm ɯ쑬Xk5mNWκ78+:@N{[[윀^[yJ&C t]4nk9gXc -W FX%A"4!h`" ~CRI뼰 -޺G?nz^ZN߫mj[g+Ry}s.Sy##Va3;'<é',<é/8tоU}I[Y;uΖk>952iOu#ͺW=]NTn.v? s/Cw7κ;Eߴ=w];зtw),Se+FK V}9<:j3R\QfHfŰFRC QI$ e20/@޿>Hv R *KkF&śXm=kuH+tsLҷ )VS7_8#ovѬmw7Kdph=+;'M5ZrHԳx,r{AꜻG܏W$|s]оsU51>Ö'|'_Co4^rlϩsEyWVG[3z|9#nzi0ѷzK9F΍.i;z.nr3s~ #-4o8; /QRUrj+ "+`A ˑF`Al8(WWU`qD%F d*R T2n XaӹR9B}M7Et2κM^<'5?_5>N׭m&iѝ${uozgs3m6rظ_g^5p7QV9/XRCz_й_3}.s*n,SQ̾~<h[;ygp9F2\_J";~G_nvຎ/#MxѷsNK=/t5RQu yOW'FMunFO;}ӟot&y:+P58"i 0wapVEVׯ8bzL\Z0皦׫TSjrޫzZW?4ywX]3͓>sgގժmƳ 3|17;8vkhOڣlҼgf9OVM9H9/9ՠ/O'g,?O| `:w1ҿ5})o2d<&3ɡgMu^m|ǩN%8}^?i%;?f}h[ͺ3.4 Ct5-Uw=Wn|s>%O?C2ԾNz)SMWQ \V3 -D! +dITjE>fP TJ]PVD,c&fcp6ɵkRzԜãhZN~%j64Y[>\rwCPFNjc fuܸbYu|6_h58pL7T}V^YyTNCd+oJ91}?תUWQ//`W9R鳙ssX3ƅJ6]yq>͏xmgrUyK!V&WszYz79_^nfYm:n_ԏ>3<Ϻo3f˺,]h}{ -Nzs{9E4/+soyܴ4Wٗi;~cquܿ-=~;)4_~x*9NhtHu^W0V-S )9bsC*)jVbIP,g}^Jp(YU\mA!b - -i\Gjf6㽟sv;c[u=yxd~o -;Nˢsh}cusrgp1g=Ż;>ï˨bs=VWw^S[ꜷɺ(3?hۣs:%?1\]zkuONAg,O rz~k엍Yu.W3ϧbrkcSLuݘ[t9wSl|˪rGw w\;*s_Z:7<1_TNcyLSMM'e솵ə#Fߝo/|Se3?Ϡה]DN,QՍ`U*ۨq$$AJ#$g+#('투R(!,WTbWkygu*k6*Ccw|Q~^I56ul~ۈ>hX-CV_l7yۗi>hzF9^vU_[N)}v|Ѷ||/)~SX|/&?>v+Ϧeq]8WN،b5.tJ [_YoGS=5p#/uuCD|&c5-wII/87E2N0wDZDϒCd0G>)~ Ԝg̭!d3FF$@ D̢r‡\PW 0+23 2:,!<$DX, X( d+6¦b1QlbRWj:TZ -ָ]0OV^a}e6(_KY`*+ R -' ,b=Jy(kz!IfrWJUVid% -9H_YBYXcX#*+ B(Fla`YY, AZ8$1Jypձ/3Lfsct'@s ]F9kW\'/Nn/QaR$ BQR{"ڂ_L)oL1 -JJĨZ -V-R69J=\ˍ= h+f!UrV,aU+X) -V+H-Wy,`:AAcG@H"@A4ÎBPS4tv ;և7SKQ렿GMewmy_umg$杬8[J`  -[+׶/97-N gYݪl;GjxɳS5sn^5h=XSF퍳teQa2 `,J͵RBbkC,A)P"WeEA$prYSfFHHl4HGX[A{^&7={`0t O\^ζ=x/{w -M{ Qf|>tG-XVB3+FRP(ϩʺW.1Ln7m9_Gה{Q׹gUkyMftBuOӹ ?njx,]8J}<:=4I*,D`QШbMK)#BT$,Vd*BE%B,`QǬ)`Y+#ݪYlbJ9"y)b \1U``5ն92;70Mc|NOZy9q jǻbK-znG-m{9{4lN]թ^IW2d晫uȸ+VWd! +tzHV;$ $y -TR@* ]VxUA^tgߒw|W3ʛp1zٻO8ɪLM[Ƨ=GP8J2ǑKcN5%zZRk^ɳz9Q,F׎o%QBMtK˧JCVW Ayպ-ů:ZRXk@Ѻ;nSuW .buvWx&?v;إKGdr2 $=/g>޹OF9IѱԃS.-o?:->s$f EfB)QB`@b#  k#@DʥJAK` L^SLLc6}so^W8kN}h/ 8?fg0Y.Nz{fnZ%cgf5~D}Ә[y;zQ׎uչnXJV2 ҽf7rrjSSw &R^zJrMUլ Uڵϵs̶K?腊* $,ub$܏\ޅZ#1y=^E~߾ه|[_9~9x,DY(ApGF $5$XD,jD1BL:j+ .td`M5ˆ֫{8=6Y'!.oe?s -0k=ţvJ7eژ,Տ.Sf4mƙE繝V+Hy -BWl'Y1~`%^UWE֧y b -tZ0>7kٶZL+'UږÑ@Dr*) -*S@0X9%I#I$ !z DdR /b{I]^UQҴL*BMU\5-H~0;vEUގgдM -4\*y}gʬ ,$ E(*HȨ!%vF uŲ+6Y P04Hb ,"-V Cb`J鼈 6RHZ)+z[* kjqA, Ha$RH½d1.Vb -ŀ@@BXP@$E`YL>zq}_sNQ*2X]_n{Zf_7J"Jq=h$U=`,:Xq  -eWt0[YaH*(i*"3CBh#(*ju =n[mA VDd*XRHXk4 AQ!G ] [! ua+D hGP"5%uiI D]2Ttn\ݜ&SjS匓sJ(3Vj^{Mh8өZ07}njV5B +z)B,"FkI,J(Vy%,0UrVb`BR-tRHZ ŽK5\bX !Ņ漱jQEaĂ0%pD+AI+ -?o=dδN+t%XrO.ys=6{wN7o0^o'M9 }ÙaL912)ʟ'+KԞ'}~R40Q% +%VKmąQQƄ2H bW $ `Cc$@V -J쨊( ̰#F$6#Eb  -Y`je+a1?ͱVW{p\GM#s9FSoZ9ji={ ^oY:77柇 +/b:{Ǧ.<I}2yD - hVZ,W h4q 0B@"@C*BKX#ŋ. E jQᬭ, K* -2F -JBI,Pâz%DҢ\j>ug4:ұ|\y {R٥:G9o -h[T)d=vJ@zzV_-+G -h\CgQ paKdBD!*]XBVCI :P@ -yjAQ,A#(T"(V*Y+:BY#"8 P0d6a/+̛,;^' ]yEfXϑ\z jqrv]&WZlntեa^s~|iy:L&uD:j~3u^Pdz`Q]_z /)4_?W5 u"J,5-[q`ȕkjkV%vVHR %()p(p"RIĘO-w,T)kd"5bWD[$%@CLD"(;.&?[Xno/Ec]Vwa9 KicFֶ8z^]4ljyaѸSs7CvL'?7 À7>s9Cշق=7tVm1շ-<]كbvbz+5;WM=L;5ȺHU9IЎmwʃu6aZ1\uHHXCTт+ -C*WBՂ85說FlCH`Q-" $h#漕lF2pͯ+d1>UmF?FW.[] ؏75h]b>ێwfy3_mݵ.:/5NƷhGmYeY3Ti~y[39yeӷCwU=x_-(6oWny%{j2YaqG EJ@-Qi@V$\`)"p#F8Y %e,0w)+B)KV,Bd e@j/Ԅ$Rhb ~1CziI˩Lv{:"45uhtLy˭Խp9X^ow:O6: e`H bAp -؎I!"* CKJ DYXM(E5a `nAa`3GڍC r=Q:vV.yT^SָcJ9LGN]O/e}?C3~}Tt=XCҹF9z3^#i{ezD]3ͺ?7MI׳˞aiGV#fRiDƟ Fv.yߔzc.7%6zMSՑxA4lAvl&dNhe{1>lύ2:'B .9OWӏՊ_>xw T~nFɓ9V9~q5O^sz Zji+K+H 5Na6PF "@ ^=q7(jQAjj$*:[ !laSd\1K׶;՟л\rlצiFn<}ޞ{]/L)9yr:ɰ~<^^BRUMg'SS|f/J_]uP-TaApvJIi@ZkRЌ{<^ -붒p h$ĪYksуr\=v 0*-U-w *,%qVjԡ ,s0}֋OIج.0旓ד} # -FhV/%V,F#'N gאQc<-5ZYPABBi UVa - -4ԦADh"[XKVmbĸ6b -;(k x !B$V CCA`bj-<ղ"ǰsj*=9#:Heq F@,B`NR-*\?4d<ya X \, Z 1TƢ !HDxI m+#iJX -Ajث}dxYd Z,EڠbX3VaB2!d0h$(B[?#-N[u]fX[`F@IM p1b R4Z· 'EC@@hi $#i 8`hPC0S=V jGbE_ftd%[]ʭc"A@+,jj - P;) B!IHKIZpDENz^K2% S= eU [W{K< 0.I ƒX1=y/JPШ`r=dKMNY+ab\UiTIQڲ\QJlB=$?ԠT"AX[jK\JPP ah,_:X3+FFd^c&MklW`3xAC,D<>+ד6s5gz^ZT-̈́`/?Pz[0V  D*q *=3VjT|engTF6=am ^gLx}cz9RlVsi_!вT@匫{f y|?534!12 #$05P`"@A%EpDBCF4O>Fuٮ5ƿ;_u `#dO?G덓=D|#4{s~)?Ƕ^'Ou=;]mOݧ}_YN7]~??ܵk g|>I~nOS4G_Om?/?/4$ɧg8d(c32)::ikD{׷[zC˺an*a ˬ2T K_3q϶#3~Uů6X۠$wsIֹ#HV^J]kOLo0BYs/l/AA:YY_TmN[76*uZT wr鑊LeXg-._,T~bSV2US΢ŗE }~6?OoRB+ s ͽ?,<۠/fik<8YgG gR1v5j9gCQ'v}^#VZc1П3^^8(zAlXr褔! -횤+l?겦U3-\f +y6-̎b≨H(q}^-R6~ORZqfXV !v`,b-@Q(@HPlw8G5ٯ5~mq5"7Ip0ٮ']1 .aNEkE.:Z?O"q51 -'K IW2Æiū0v0Zd1k*/%P(/bo\STo&`ZZX鲒\:2E r.)>cό(ݥ#\#ViO{YݰBN]uJi-UםJSN n2v3?v˗ʦde^~ybU9[~e}[c OuIݿ,4V6D7.t)Z.oGc<.nto/, [QᤃH\f"҈ -IJėӇ7k/_, -*XLӥ UTabu>*f$P5$U-P:%+`F>ݯf W]ZsqI3sYx}T{YnfrXr:ZJV D@LDX:^l~Xd5&q;#?G``-s!`C^iL'Rx,б"{aF qgd8+3#1155Qfɳf#sG<.ٖ5ۦ܏/*K. 3<ôbkE`tӿ^`^^ŕ/e}+l[PU:j2/fM*\kD|5soZ.]@B/fxΞSzu3P1n>.8Пz%ر?KZf13ezE V\3w 9jCُޮj VJ[zr,0YVi]MPU.48O= úg.\؉.w%?Θg;exlF4,o1Ӡ`jMpNۛaEK嫎2Jeywkzwy5rtv`@ĦyI]XSQ+Myc8oml|cRHjͰԱ(mDrl+\?)O&TS(E,|-.2Xg|}]>v ܨbٛGXfS˻C+B|= j@e{Qai%Gnw{sR:)~yl{}|}T]_]8Ү3"1oJvfu>ťO¾[z "N\N9[^7ob{` Ƴwn n|d/c0\nT -MswEDZ@J7BGERK.ֶ+qĪ8^'Vbmwuƿk=vw]va@-W$%ke -l7Kc7>"C]=}kgLkDlaVěž"ڤ|EpqYMF+6Z([lw]y(Uk].N"ia-;+mWca6K]1;'A8.D;"Ao;[VZS,@` -" X"5-GdUW`+ 2'[0Zzɬh&)udrGئ}i[φ[poXk2$='+X`&lƘ, )a,FXIl/j<`ǂZa(]l,*YLX2cIb͌H0]mR) M"3KSmFؚę,U\XwC\CMC -F6BK %a`+ o -$Dil.*JZ#;.f́R8$Q11t˯6۳͖`Uk nq81Ɉk-7̸bGde]G~q?\kkvkq]\Ic\L{dn&pVD\׈l \kqq@BY 4T!nxjt9E)q̈́q4^['3weOεzg`۳+]O/mM%e3g 1lp\&[s*66Q~ O%/*^tSf -E[R9wiı -s{đD4U.m&a(eT'Z\ǹ-z '}&ɪq*Y.l.,(\G1"sL"kO˵fZ6qe}щ[y>Y 1ċ,scTe728^, -HEJ.&@~"G 1SU!.f:޾Z2(%( %PY-+*ۅ"Un]q5Ƹ?LA̻c4bhDkH8τGf]`"`Zl8+Fhl';5a\T:Ƶ+Y#AHrËӌĤTUf]ٴʶZ.v>kk ۯ8\kh[g2fp|~="he2 k*旻V]ɣkxwT3}gCv{O٪p}#K*}FNu\ _Kh7ſtqWM-٦>fYe33܀iYԩ׶JMtB7Kwʺ9!(ΖB9b\ kRJm]_:vDaԏ*O5 _#Z0kZV7 JW%MN +WKehRөV] QfOll.tS9kC&Px3c3 &sxH$5"aFcm Ř|2[.*fԠqYR6*bV_>qq-?-ZܧVWv:߁DF}Z(0cc*xČ.j|kekMq}0V1'Y1Vw؋CnG g.QP%7voVM0%Wwh^8Ba g6}cVZ=`usSf5ICNL͢8V{iU oF5gE6?;KN`D6,oݮ^0T9lQ;[C(hb3 kN[-p6i{S>Ql6YMb팷`fm}D^pk|XN/|1zavwNGZ׬;/C;>_(:,2@&nfVLE(]\Q/9>m຋  -*a;\xRQrJrjQa%3ևi߭zٕPʪoNvY#ƃPR +McO-1ypiXH"BarRK٤[X@_iF"8/Azyl8 2LX#lX1ɉKNG&0!s(gF^#Vv;: t lj""6pSZv1*f&0g"]%lb+ XvMTj`gx{},pQQڂle8kXk&'{@c,MdND#aU9"rS*qgƸ]:vۋI 8X(Ł#f*hlSZ`"`6smd`^jfBbël]s!\$}:^((.$X$C15ٮpEz'pƊwE1kjv/Rgt_ZNp?TSسt+fkôDMz;^YdĕB%A^ΡKp*8zS}6^:.p1?uFpw[)P`yQc22SՓZ5prf̧6^'f}{e+{Mt&\,HVm}FC*_9rqocH - -~7-}rt&ۅKB彦'W5WI!鈈yeY#Ӳ};'=e6Y򾁼gmPFjەgnZzEX] y+쫃p hA6˔)[Z:z;F\bīe3_vi9iE,+_R.R,؆E_զqӔzso(s,oFx8wǻn/*>"Nv b Tq 2M{9_-Ǹ̼ew&ܭE|:%9wl3SŇE]\+} -< ʣ\YWG6džm|G^Qn[&c…Vm1 rqvVʮ7'ne$0YH&Bj(h5Ux47yo7ZGS7AtVSLdܲh07:f%'8;ӡQ5ze]%D&[n>ª$7N%HRB'55Ɉ -3:ru[T*)S)duҕWQ\eqSZ%HZp->}u.@twAk_Fdc_5ƾ|'ۏε5ƻgUs(GVk-p2328/$ ݽ;^%#sm)ڰ)ztɟ pZ͖U8H0^ +jZgȘ -0Rc-r <epbl[ҩN5sH&`7㈽bv3gLq`Ҳ(G`h-al}Ld8N(L1\Z<[|,d썓1^Σ05N"#ܷqqDcHN!)X29*Ӆ(; -Jy*Zp_ Jk *֍"q^";ti SXZC2Stvx#X Xⵒt[W$7f 1+lrNө,>M)l _ak~fu5Ƹ]bN6X)7dY_pvvcAX#ؙuƾָZ\N55,)dDS0<fr0U2 >?m,- ?ӪM=YʽX3ϸ! -ks+J6>9Ҷ9*6ȉmƾ1рB@q'!F&Myk+˒1K?3 %޼[~'aG6MҳUER)VWߓ3k hf5Uc ˀg]@p u\kq5ٮvq3D#Ȯ@XˁYo,@N8p- &49m .hg0Nan.( Ƃ9@8ScŗG!`$$ - -0E}vLgnhff:pv,zՅ^Q턇 6uh[2:`('y` nRP&*J+@Ս4mI!`5 e#b?(规ziզMXe{ _Agc02 !vx,x -2 (8ÌUUWlwAzG:nbh..Ncٓ5uA`bդ[ o\&P1Jٹ-}{-Yt$23mp#Sͼ Vlx"- - -RtRf= */ҹf_k3e>{d=Ohh#B Cmƛl(`C;\Qnu,ǵSZ\fWyVA s$lYD5%umHT|G'7Z`fv|S7qx"͇2b:3{ϷiV\߰Qv,!y}}>5Ľ;֭Ƒ[0/Î~ݤJ)0WO\#z7YF2޵H:Аqjw1(k5ƸٚtKVqhnV@澫wBSI[rVe1؍keJjv5^czΪ`9zᵯ Ֆ\!/Pwl(o1˒A[eMmpB${n7O -o /m:IO;9zAyekTcryq;3]xJlhq2yiQnSBH/#bS齳5@p+Frޯ#!bSUgrܡbdi`{+ ӪqmfyǗ˻L;zsl}y: .Uf76Ts_1{w- t[XȚ W~Ɍ;5 B-$`JZFh՜ -+;j-taTUV%Co!ҕҫR-h©jf۶f$tUe=ݸ 2OC8K5kP}yB ⢯Jh&`V3֮[UF50nWg6Q)rޫH+D ː}u?`H,tt}~v:_jDK85VŃF<1P -P2xKOYx6X4pG/CVh4KӪ3\i5ƸLN78&'X\ K^fZ z۰HލF$I"~Vλ&vm"LM:ċ-'V/jY,qŘǹcn3'F-=zn2iפVC.au<eSJ[/Yף2\fbi7e=jÙRIڵ7 TIek187X)X%I,ő8lsE@iF!ߍZϳu58SsU48R!7,-Z`nZc~B-S}kt1vnPyzM.VĘElvfm@yivY,(;fXk_w_[@YZzT[ě - {xIVޜL3Pʩ_=…%kgBT}Ֆ}VjS]^aWC~_G쿾V-IDufCSt}6 Eq{KZbĮ%ֱ%^d]+ýR lP>`yhV+Z'J9g`0 {r D#Ifm$I ِ̮@VqmW-C9u'.{`}סXwQ7Qž \*]fl]:^g/C,mua{)Fa|YFZt`Dvq"A_eZt])HĝeZ!=vU zL'e{Df68A^d,[BC34L,:uY{.K_eq`gUf_͖ŊXkDj9O&xY0809Xܻpxצ 5kZ:\Wٜ|5֨x9Wf;~[ڈ9K\ZkCDaS>YbA8:VR.'Rٙ3~$S=l{JbT*)U-Xb4FB'Rt&`ao:3yJu(G<8ُj}MtF9ne}ye>yK)Y[vt%۸1PJ$)1?#I$u]B$_*YìwբjeF8G UL `BoW:1 3ZO!/4ṕsك2~,Cۙ^-ʧq)gm?{v3cW-٘kxo>I@Χ%{VկffDnv_)MWq4t3&e{|f=.#<ӄ|=Up.c[;S`3OS˅v#- ٗsTdTyW+nUu*sAe[}&Ň^NUCG{r\0;6 qίkoS0(ZzOcOlrA8j XWUT!15"bx^8u[SdFs26]C3aڼj;.-KRt.jc f5)W ܸGq}ۈl (q%o1 -ʫ]ƒ9Qxvج`5໶U]Ļ23`\N) 0w8rf'(H ]KcfݒnVWӉ:vR;aaj­B#q9FVQTa?Tڷ7C/1bqN~?1|wõaKN8dkDsSZm28,.aڷ -P/0j*C/nџhkΫy: -QjMnSj<}9W>{sD@ -,OBǿ'L%.]˻OG'sLsd|SU+<ӣ__rNk }Bo0X챧p8?M^Xz׹17Fham[EWxi$:ޭZӔ)lUGsU^ -KWTeXYmXж8\7*9 UL6ecq1Rx0WGzӣXk(e3sl^[A[a"}_Nόe()q-@Ň*[YRIu!dl8+nJFkNXv+FQՉ*(Z,̘i bbb}һ:PVkabiU>ƻ5bv56Xb";u7c3fdgf"k׍PstKt-M0؛v!\`q˝ioՁ?0-QA]v`İF eo۶xA6n*ST]֙]hSBz""~#YE E_jfe4!zPC*W -yO59y.̭v_G5󋊔e^swf5'Kَ.(Wne{z6nzrv!9y@M9ٛtB\͑L9NW,G-5ۙ8Q c;-^^h-o鸜^|?bz?H{0 mb^_Tw+w*&f< (f}4goʻ|Ӭ.]L2Ǐ0lwyaM vq%b[gfiA)A@6 - -?f4F@-}BC*$hk)֤D&gcn\NK/b sYnaNuB9눣jA@K^o[/\08CYY/3&j3pꐪi̢jM̭v'yKrm­иʹhnF6l+f>fiOCa_N,YO5裷(5zәujM4J9w.b_͡8Jy:T'+~?J^ 3^漥W a|yLkki~l6GSl=<]4;3nm9zՉʺoMцzײf:M漶Bo09 b|>fk?VajQLD.9X 8 '{unʺOWL]ikNڜe]LМ9pu&y3vق*pe In>k?[naY`pb[ñ­ւLlj3rb4fuٮub婯 Dھ%bqjŪfiJ6FLeqc0)'YcYbtA"Sp_UuWJ8?S٘3uFgЫ;I㦺Im˧#ý :Ҳ =xs nx9}m `Gyaf rcV-󮼐f {A`gm}j9deUSC=k`3_)s?yZ#[SҷWe}Ro|o)}S\k`y|LV_ շs$]o\f} -ݵp8mzPCɱV< 3?_UᑣT<8ke] U%_+~Śt -uY'p/4,]BUu%h+}W-`%مhY)eh˫p팫z?D'4q*~iz1bts4z9T֝0<ƾ.>RJk]fQQ5l+\{ZkBF1e4/FVGo0>a.r1mgtrxeٚtY( PfK9B,O+Ӌlq< ]6Cy{׭ -kUhm3m֌nS;#(,ڨ _&EJ%Wm2`ƽ~\6"цN+!2|@[11 q8q0-8V^15IV( WYa^el^6h׃]vVu8~~bb8 -K4W9};VT\PVs_YupSCHx~#]kk}}5 -ׁJJ#B{M կB/Q![5; ,V+֖*vO2*Wfe%zWDl_t\EB 3XQf2NŹb7X`Pg}.+.6 }閺^_l*9{e5-L"Ͷ"E̟O-i*S@6jojP56k -ݷb7+T"uR*1s`3-f ¡-yw_M-m3;-Mv\:um^۸)V] u6hAY [.XB%P¦9LZtQvֻx/Xf?PK5ʫv24+n->Lr]pQҠ.%Owtb%Hf^k2gCypuer<Fs-*.xN3 ƻZÜul2e!\c3fl'cA"+tӢRbepk<^_E0h?WJLp6Fܝ+rJ)|>grWrVi?3^ca|TgMj+*94j5u+Rկˮ}lw2!~n730>ԓRĥQ)f{f7CwrC`#4(b[iNϠbplJ^diHŝ!>Ɇ+wu%,Mp2eș48Lo1b=W+oDEY+T -Wkv>>l{ h(($z@ ^k< hViѭ\"#2egmW;e!^@b -3/{\^rGpMg7{ƪʔn/e^ٱƑV;6^}Dp.wۚtgmR /L^v/f'Ŏ+!yX9y~bVw%83)D 06s' EnV}/otkv־eЕ;z FH -_G2OU:5oU-[Ϻ/w\²bwлK^W{Z( j}p&~u&JbМҲ.\b/YJ`.baȦF&b홧Ae#˂HhU Jcov;M:p&Fw9rI~_ڳ\Hme}&2m e+ƵȽe։totjM[S `@\9 -]Jh2pi8I(̈` ;v\Ox[-r󭊎SB Y|g,tJ<2L#0,u`,ODM@bT- fqDNbIiW= ]1cDDŽFR兡B -gN%IR"U``DLKVWWrײ*[Gj\ݓKT#-EP3}i1eu/(/;F"eK*uP n4ţ<5SA\c0叞u,kLcp8ZD VlFbuTN#O5ƻ56"}q%N} Slo'%Ćf[&t3ioū+2-떉;w$ ?1n&.uva57]U -M߇UVSjC`e&y~8tH][/i 6\Œgqk2J3B7ksV s6-ɒiw5w }G/K vZpH?R5L:{G:b˥AҵyuDܪX/rգy㈀TO-_mҽɔp2bSwOYgϿ̺(_Ӎ>LCo(^8ޟ;:=c)@b,]^)n]Hܢ*HFKONjd|uإԱeƻ5!yvRˢxV]Z6[ӗCnǡG.0V\krv\~Ca\:3o2f^֏k`./x^Jx.~lS3b#R|,*l}JlJ"8ܯi&V+Ʊ]:E'Qk_S÷w_ ը)eN-J>UM*=k8lخ;{81Tf]%PI/YFm2g=].e侌&[F1Sz5evЏH4nN"0-S0߷F5/mӡ$j42_]\kq7vk_N/{KKX2|_qi}Jv[O,{fO۳kWڰjLyF3J:;ǣVu1Ӟ e W-r := Ӳ1W*SvV'5B1VܵeD]JYc-lg-Ap qt+Z,Uu(jZzJo+@-Vc>8xyb5X:f -Id~Ʊ\D{`#1Xbn1>EՑ0pKl ZF°!1#ۼ"8 #1)5`\xWm"8(f|@Z`{x@qUeF9qmN-Xľ">%۱+¦I-`i6O,xe6ZXQ)+=Ū1Sg R*'cİXS-y`M))[ &v*@œ> wH5!RHQX=#.+ѭjJ7e{rb(xk3nL -ޛgOuTl~V7"* mIxkxF!vۥ}1<Gڳg0Rj4Va[6X1*}v` -N,nKӝOCE4}z x!{9N.)dž"꽉`Tcs!A+.}Qը9g;,)N>leSY!vO=[g?.G-aҭ:־z.׹B~煖an35̋s//t)Xҫ-vnټ'WnvI;YC] _&j( `f|l EY 6yNU =jS5H]a@@n-X_ -H +K.L"l -k1Ww]i.)꽅Ʃ}(,kl[[,#LXP3ɥiv:]2Hab.=jݐ`$]kP^-o{6CV-kۀ -̳V -Ⱥ/x]E+$ui8is(7* SX"U||X1ej);+Y$*֬=緣OD,.IWaX;+1# u׉Ja#EqaRkO[ ]ѩ>d=z'kݖyZ)@+8AٳX5c|pU{lKUO80zX -h4-p -WeCJ+#-_uV #Mu RێMx]&KX*vt@#8YcAxik\H Y``C]\l2\ X-eCDHF!-Ŏ"`D`ސ7_ ji#+1`Uvn~K0dA. wTdJ@gb`G.){VKl8 lύ \h*|TV"r/K8b߾wO|N+ zƱzt`[SōzCA[ȳoSVZ~IL8^e U^{KTQ0OAtoA1j(jYW. MQ)9i9|ķ0+.b8gjR+f*p(-i.4WJu[z1f$M$ -=]|V=hc\G;lq+9kП8`XC{&"au FoOevR]'Z+ZZT*(JvFFB`8w;F!+L8+ŒoO֣lϳdun2ΰw<l* ]qzCSԤ9\Džͥ;$P -ݮ>~ -]%yX.N˴)U+ }>^ݻ@n61+_(=;z]PҋrmN/8*⻸fV\=0;@u)m8Q j}q;V۷У9lyWeh -ma)5~0`bMIDQDK냣1"yIB jZ"mR Ymbۇ*t+%p` 4b6^ pÈ , FP¦Z+ F<@!>HO?/O>|D'`8'BX&,g"bv@h& mF"Jq#Y!^! lQ,,k5L %Xc ޅgv64`Kυ-3XJAQiC+sV 8;9 #JIpUOXGwWP+W-'WyTa Zqlmyby_e I%~/Dꇳiq,ʧ7ujddӃ]y :H#{jR 5~9%côpV@Uia$)!m>#v!p{[L9D\*a&(:qR* pktqgWHV64  0:jDģYa>wNXrEJ>  -ŶY$uƪ -|Vc\*n`o.uP${kE!\1[%1{N]Cղ!,\5#?M+`O=<\ Vݘ)oN;j!Ud [vizi`W+KkpthlЫљݲn-Rd MW&x )td -[Z[Jx ;GAyӉm-ؤ2lO|aMgwT˧fk##+l.,|+ Y8jt -:QHo[ {*EE]<5ׯ+чFkd(9zuTuHm? I.:y*k#Yp -AC_$]/Ul];=ub6FV= -1 - Ox)+>7 cǯOc:j9TəlÕ [Ë=9m:o7t(q75jAo\aDK0ΡO:U'bJk^&5ץ?>HKCk7mX(UX'z&n8CKJ?~~6"!tc 1sػOR>BCeqԵu%M"WX*Ok X.,O2MgͿҨ$0X&ȧe")"tzi[AL8%@J֤?cZVb)WIUK1]Ǿ5eŞ>Eβ -᥺F. -i-žaB%)'SPF\c(#hDUX,q31 LH`Dd07B'd1 kxc\xkkUE 4(N"FJ +#9!`EB8UA%C+rmiDF-뢢ajV$6qщwr:s(aV.ڙ8Li . -&$yoaV!U2v9¬sNs! |LcN%Q mfv88' lYQrb)0=NH/ǃ1Z( *q*=Y_%Ff9:҃j01_ZD-#MZO]\vZL$1{hYE3R HyơG/"p 2ŚNR -E~6++ hˤT^8j`(*IʀYa*|j9v/><YZ(kC:<0bF}<Ζd`ڍQRֵLuZ{v)7N~wN"8*8A' pM6 Dez:3ܘᷦ}:SmwSXQ\1£EYho؋8>o(=#) W.c0VL8Ž'_{)M,ѩ\ -BP0VeQSg} -](Io'ޒN UnT|a}'LpR{-#L Ӳ|V~Щѱ3󻉶Rk>ड/} QM -Y"@bJk? ﱘ` ̖3@֫Jq:bM`C;Iw5j$LHUfK(kص۶2K(ŕ˿ O*6Q,ܮhHNOcĮBW^ -7 Bmm7;=e3襋zJ78$bFbհp~,,RwV7_k x?>Ο/M~3X]0GpX -#Չp#1xA73Zlە{B}SPof)x_r@zd53np9 {m(7į-dde< qmL)ݹ7-8IXnk`EG[ q)b$-w~e {-k4)UVRD ؓ*DiP#oyq6AqH#ewت1EZ ߾ SR8WjD뀗w1iF!]MYXnMe޽" x]U/vIpl6t ZgzM7+D9<(tӇv)T Xl؍ԧ%y58-4wiF``f' -اq&ߤw`3OgOcOoO14ƛ4ƘcLi14ƘƘcLi14ƘcLi6i14٦4Ƙfyhn-.LY$J9;65]c0pY=V|3c;WTR!*Ro¤tm۸iH^`v0Ч$j q*:4Uwu犪Lͫ$hu3 :&]]\f?/LiLiiLiLi6147q47q7q7qnw7qnw7qnw7171ns717'T' –,fx1&I jOryf>[1GB~oO;GOGL 10LUrej7ä^0\MZZ!:8‹ٌ{ -ar~ѣۄcӋ^hPߨO6iLi14ƘlcLi14ƘƘ7qnw7qinwcLi1nwcw7qnw8x㇍ncsdGwcwƘcLi14ۦ4ƘcLi14ƘcLi14ƘcwcLi14Ƙnݜi14ƘlcLiLi14ۦ4ۦ4ƛ4Ƙc٦4ƘcLi14ƘKi5eFz`%`Bcm,ΑWEX}3;j=f8~͈nw&$p,IXNCV1Si)jVF1wY*&X Ϳrc4ƘkA nŜiJY3;7.J͵Q4kwM}tZQx̔L(,3C -V%Ѳ5bl~٦L -KiDTTccLi14ƘcLi=6i>^4t٦<"/^?mFt٦4FcI^y o5e:sQ/CإncwEĜE̵/H"Om1ءbzj=sXxT%/lsfDE;Qeez o\'Jp;K&_`vkύ+ڴe -Rʾg0Ni6r֥ƌ8#(ֳ,̄A.Pi)WeqB8Z>,I-?f]Z:RkA+B3+2׬ ѤfBSii >6f1S]3~clFˍUuNWs ·j>7+8UMyefQ! {xFW V-+tnؗK7l1VTϸ -V-jfdo:/rhuZ&V1Hn+!Vo0fjZ]e6R -\9m ޠ):2(ZMeШJ`1ksj(^iG3fݞ_p6\Dnrk֨fu*jB@;e̲H(Ummn\jrƵ71͌)U=$_o-&Łuv+u(sl5H0>w7Z7Ҵ1j-ٜ\U`]:2n!u -spib#/+I5r/*-̼,ಷ9$rLb$V)U-DD#E1gej9TAXUAR?K:5 *%*#LEZ8* -VPKh Ҫ`DF&"`Tjf5 vRUYRo_ՕX0Tol6x鬙B~jCcHLɰV"bbv@^wZ+tmf7 -Z+ (~cddk+"rY;*Ј@G53&l)Ѱ@Wr T;llPP(?~kac.6h{Fmt*坝O1)ivYh89j\[^*J\l̷j^oc2ucKbYKG2ԬbxˡN!Oh5=ڔvqfeخ?(WAՓk˕dU/gfi,_r ծQ̃5]XY&;uMTW6N:UOGAY7s>qEM.GgՓ5*3 c7=V/pT1`k @xºԲ21S1|Y%P2N,&)`L,M56̹LLei^T]cEkaySãlսʏ16 Waּ:Ub Mz10jS0 -Zmm8 l-OO@+e]9Sumfc8,,3Ac3żp۬Uf4^aYW*Ūł!Ma<>zj ݪdVͺ `u:_-vxbc]Z T<~W5p4)2NKs#B(aO X~k_qvk ޵z:_mb*kXaX`u6@3}JøHz6ܶH,n%[ˌğ_5u6j"7er?j\j~7+˻-çu4͘u"5;_[j٘]Q6f67 ;k&R"fmg3^֗ikfmg2lid2VQE3V^kƇ0̫.JkM0ߙiU㙗Qͻj~Y>wTvkv(Kzs:Vk⿩9WwT^oЩڇox}X -a-R>ۯk}~^'2/ khX/1ivʼ:DV傼ݺ\~WoS}빱x7>-}5?.$*)Lw/l#e'~9Ok. ìv]s):T];kk-1?36V9kOԶfInhZ,e~'\km8_Ye=*}m[Tٗi6ۯƻ޿t|3="ciK]J)0Yo_zҏZoVc`]N3/e}ο3\kLJۧ~;}i=?zb?'it{Zl6޿x}>?7]$kA c1l)ntIO̟x}\x:cV"K1#BcT$Z-n& p:MUW;䇩DV Zk;[2+x(~^a ZQyq n|.YOxfkaOxk|BasϺ:/1emZl֩-r_HFd-ebRZF,(7C ,\M{|L_vC5˴ -`SW ?}YLE֝lq pԣvSPE5YahcE[bF5(W-78k p4ꐑR(Jf&0 -vk_u/uK//^Ⱦ,Zw2rt.]jUk4ʵy)W>ï[l46DG\iL)g/2"jr38e<Փ^Yg0ǻOq~^c]je5+vN2MNu ec>-ԕCg4u޿31rmSvvUᭅ_c,^PΕ ^{oyEUY&@_tV"Nͩ'_^% qzʹ.i䋄p -ɧM|l-KTRRθ8i 6O<b%OPH -`EoS1&0{T"&b n'ep[,>Wt1Yݼ2ӥB8Mk6KeСs PWc[t(^-V^)NM#Lace -Řm-9&ouN"V`bfAf51c,l!&Rt$~06rUq>yf㗊䝀v̙mw1bNݢTm#a0G`pKTD1f«s)FX`xbaLAR Z〝톰<A,#H b#`,a΢3-xbfnծf)c\Am1P Cg5 ZNd b#qR)g0Xذ8捌*2j۱LPW T$[૨5֝ɚVdA;"0@$K~G< ; ĔVZa!dèHb* :0$!,1OsUf!nOoI.0bqb&5XV8!5bh0YAnD&w*&|m-dt6 n 5(YM^D嚁èS5SD B:>'v)~b#mx:"uѪ$8a|tWtX}YJoD{Dt=6:9K1.::eoJ(˷!ǥ_|ix~u ҷoO'i,]eʓ5|EPNn,EJ&F%  -"ɸdk"舁d4?S5cr&DG%o ̧ 3 kU'bQb$9{t861+ s;*"^S3xe?Xۦ -6[lyFn*pAImcr*UzH.uo -E{>4vA<,x`Ć[t(Ԟz0a/T`wå_N2cѫV/:Gp;J]<^ޘkN߽v-w_ vdt?(<闺idƱå#'gU{=-5F@*ƕ>aEeB'4#Vt?(?CDKeMuOϿѯ ˺Fl@;JLW Jm;]c-p]h[{p* rVa }On11Aqg -=XXOFa3c{O Eq)*_ sXeA9rP< V$jZD Dg-~>[òfBX3bgۉY)vqk5[SI-KKٲP+RZ'b&I 0yA>2S wQcX[Qhgu8C]E[V"kbmh G.>dSJ8t1Pƈf=-zNґ._ӬaDH2Jwz:DH.; -]bi,(g߄_`wj}׵kz2[ԩAic~Aޅ{$(-?>ݳVӘzJ ݰ*-t5WwU(ޗjoٷ:W6to`oۨ"1>z5kmN:I^A̻p~v8t^Ң1*hn1 ػb{{Si[>xwML.c Ln[?o>E -k6b2JVL~%vXe,t7jr>vVÒ9Փ5hk`dUD>1[K._+Nq#AcXk<"F -q %DG,%j˪vT*K!d-czt3УlXB -m[ Ll[V^`-(,.v:&p$JY ] 61#(0Ĕ VA$#&&>>șw{0Qjv5 flb(܉ -0<}-pn ]t"6;- Wb[[;-rQE.Qrup£dU^SC*c+,80\;  yF`ʗ"`*^"0#+dN"<\HYT H>1<e2 bӲ]9 ]Œ%1"b`}?:|D 6s; - oX.$l -| NY6,9cc%LTQ);"LU5rE"lt^lT 9;/`QXT{9qDDD ->Ve"%B6kL* -5^ ]D91T]B{n Kf6n,~t_O|G/z|El~*Y熸F(d@0f `KCذN9,=eM#T0rM0Z .WPrjq2J Ҏfݩ(JIw'DP)ֱn9, O0[a -mv΋b>i+]W036+5 kfY&}2#`x1Pa>{[X8nK=E"]ҒsV`6 -.{ P iK'l=$| -I/)י$"g|ScŮqORsy=;(c/a~Ÿi]NX{WY맣uwzJ^Q?GW.q{w|ҿ[zTXoOW}wj֧[%L]2U^Bmq{GgSU~K=tp]]}LkJ^[5* = -ZnFu]E~kOޥe e18WVqj}5G»* hq[g+j/tѽңwVYL[| ;W/{ыS}ӗw:ر/q{KcW_/^X~>u_U]}ַň.Fw8b{/}L]_eK=u˝ -,wS/tuu]YybGΣEtmqZ['vz1KgZA}L=sL~3-1c0/8ֿOVS -t-ubF]=nw{[=UzF/}W|WVBF<}7kb~W%KDw;lY?*]k=zoC^Rh8Wk#Zv\RYU.z=s[rfs䮬ֿ* XҳOF1[+CU^zsw>]FյЫ;:^-tF y/#Щbu8JZ^mc\Li4|Gj#o5z{ڟo{_.qsf]0.oegC.vé_jv8GF]=nu{S=tcƯPQ{w]fkt*#:^:v4za//dc_PꧾЧb߅aF^^lP}SQ?][vb;{`pNmKׯbBw8N3U.z=s[YO0P_pn>okҎ+lNOF1W_+GޥTEΥ[΍)t1^޸vƧmoѿ֯bFw8c1R/;\.c2fs䮤nܟ>bsWWFN⧨C꽁^WR]{}NbuG̽Qb<.thu>^^G:t:3 }>gv0y_SKoK:[ԏ?t=mQ7ƕHkq0=^޸vŸmoпׯc/ΏD=yԟ;\-c_N|ԜYq>p}+:qΧ^|E%ƋӣQO9`=WԳwF^oWVy<8ҡ y{}JB|>3ӌ}z:{]^#~(uluTmt0=>v\e }03/Uz q{es -]{z=0#ywlgŸkoƾ#^=|>1*X:;·A~a2ye˱{N!y+>vǩ[}>p uUH}\},CGʟ|ԾRz;*v:Fufc/?0ǝ^eϖ#YFp?RJ|zozՏyolgŸkw~= -;\Ǹ,\g{eCc_q{c,e-Y䮤yku? p>upt:#0PH0zv^ެh*>c1׽93f,?RЏ=9C^K?^[]Գ|iFiVmԻ};=ڇke{̽T:A}KW11yq2WԜZל̺[] W4rUF)s Ga衂Q -~!>k_/{=WoT/QЌQ⏧]}Vww?Ќ  1eaއk2'hv?Xz[.yg֝k^qb~Gscs\<՗יzԜf\-^[2,2% ˫[uqos./\*w"na8QROK^܎ -:13h?aU_byK.~S^k3<t2h2?^Yz{}~O(;ZcVqt.wwf~^e'W21l,n3/9_Rqs^k2U=|Gөv{1_ިz1OOπƃDž N|Կ_RfƷ,)u_◠|Y>-?rު{w8ˣu4;FC3/-zoV^c_cusO.intC{ݖ2ޅqs/9gU?R1sf~_e#\hƕ?>匷 eK={=nmus;jcVq;ž|?]9e3?Réy徜ӈWTwyqM]YbA.F2:]LcRRϚj^W3Q解>:Կ˼̈&g:s;;i3[}Nu/,eLeu5k?evt{K}1k?ooqG/Ԝf\,ezrex1>JN.w_1`~Kܳ~ʝSusY(zKGO/տԯvڏ_0#+Ǭ[˽_af}YշUKyY]R[~*쿹2isf=y eݽ#3?Zfqb51c4/^wcs]~c}6mwgaWt?=%ӥz=[ZsvzAey>c]ޮa}_af#e:"tL0+(&1n4LOt-x11q<~qF(zݶeť031q=AW*Srf9˴2ƭ~_U*14$Čn. DMj$\V#h4/UM|WDta+k =Z`5pP)` `+F `iLicH2DDDG;cnt٧'fޘ ?xG{pBSnbVm(anf0כtSa ->D ?NոCl].r.(nYQ*-f*[N˖NNb9cj\b|ͩxAf9o3( 1^ՊZJ,븆pG/Oݳ9Hj,~}c leV"+F#3bR5GTP<n0QLᢀȦU? bNm\n⬯6\6rea'ٞ?0jQY$ב=1i]_|r+ ~'-MۈPeCV*nlF_;AXPlbA$x0 -KOlgu`y|8fM~>s?J G_5"81?ON9kS700g<4U2/k-*NCGw9/( !=H9 -¬Fr؊)–*>_g=?6Q%83͞daހ^ŠԞ.Wt#HÕ %"053DK5"#dƱ0;H"#O'd@80Ymk9QaX-5»8Z,HʄegkYخlrxP81c -fƋ ^+>.`Y.@4JxAF! -smv8cABz򇁥:hɇ," 5"Q8a34Ƙ'114Ƙ]?>_9oKñ9cAlO6G`{E+CD6>*#o ee6CTv+_^3}S1F5NO֪x޶#ouf~-I -q\( Ƶj¬R!'xfR=oP)zٷ3?11_pƖĘ6Rrtbn gqκKvֹ˺W{ϞpC kPeЁǼ3mYaRIVx[.^# ULae-u K0NR5h@?}1s QIc*6f~i+E.3lFõ#kzn9 wNSjߺ5J\)U'KvpD7k짧33, Xƹz'QXBQrx-Z8\/vULb'\f^qMUk[Pa,i<ooj1-ea UҀ)M :5|[m"#d aW}ѣqSṞ1\gUnŸ%9gKK %# PTJVf? - ^* -XXURR5%{k!uԹ! - -cF'+|M -0%/vfA\ã_)݊ݴM\`V?QmwӅ7kNrΏ61x+Q^l]C\ky`cdf=n&nWY1mcKs,f,(+8:35$\vJDŽAF%F!8< Ɵ> ("5м0^X_tmM)@36iLi ǎ `2Vam#1Xđ9‘病0Yּ)2(0ŗFJ j')l`W1^d:֏ aZ|84ky(G1 ߵbf:hر` -֌6,]|f5og%W)L[ -D`X -(|# A.hpNћ`&[ [`SL&f@u(^߅+PM}.ߧˆ&W+x4lYa4ަ5yw.Di"=oکo6b̼#8|.(Fo*F`iJjeǽa${:u/8kb-;d4}v K\SPT<|U*i'§o nȽ): q$`8vwO[rTlVӱ>ݮڗom4\:V]{FWM!{&kSfUk5*\%/ª1W`[ݫ߿fSݘp(~6X6X[Z`8uĠm"[~!V{j=_(XYF5”\{}>ׄ.DZ#BXk//.UmyǤ "<]b۰po۲`f*Ջѩ8b X$w{wxO^0yyݾ_wF̣w] 2ųD,-tOհ +u2> ar@žڟAܹb؅AF ֿBiQ̺1[e>~fxyn.݊^T6: a_zh&fk@5ѽ lL۷h\6|!'ZaqT l`qZ'-w2;SDބ{bA*_X"ڢyV#wBy;39[ejBC ROg*t7wl\>|a5Vq )Eo۱ 3JHFEi(,QXi);dv|HKۊd RHہ'oUR^r ۊ+\D 4Nɶ~qHb`cqm;а5 .+@^)Q Q .F0BLi14lik@*֎bq B˺8hjПnƱnn4*p]Pl6ja+L\:,~,a7ecvTyoW|8>f s -D/M]p8\Km+~ͷc.-<EhI2]% D"N `"Ȼ!V×En y,q ⭦6~42Ղ]E챂ek -d6!#[i)CU]ƛlxu*fie^rǸ^y; `X˧]F+Pc'qM&fXQœAtG#ܾ{<#SGFyy ^H7rt!ockO-=B؍rfv):"Cku!w}n=>*_[j헗3 ?@5Ů˸+) -χy -H{߹nt)?Uf?_hζ bs.uS,چsvwOi -~y"XҘLtduE''zv3fJB/ժcj se3+N[1x}0U$x^8֓ \>wOyr -=4sF4xZx[Sܟq/95N1fMh,+3VpsSx} kAFz 8Zeظh1iYRwT4&눧xj}@-@V3 Gytѩ5"aiZ𱀿;rxH/.>t*_LCT]աݲl_MӇVߏ*-!X EF'{ldJR, -6G0Nq6`N! -5%V -5 -0Q#1"6>3M m+%mh/w BVUc]xHbűTIZrlkGP -^FIUcfA9x 빈 'e.7! Tݴw1rXo.;w_|6`f -%`,ˣ__:צ[ՑU -wrŰ-0hȣp"akG;% mQN`8/΋1`յ-+6!<&4MmbȪDhXBcᐞ>%Z+ GC,ǣ_[ʥ;|w~#g2WNSˣݻHfm&A0UJi-oz\(M^Y(eUkPw Y-"$`t*6d6U -Ƞm"#75VHOvfb8*\)U4k3N? O|vc֭eѭF0=X@+8,7073W-`d$N)E119iF -,nX̌t~,ֈpF]fs7*W%6NodJ~> {"7F Ss2W -%is^ԗON-k]#xUwƗ`b#R#uNKz:Sb 1-X9+n:hUB&Q Xi"D8Vא!1{l=O ,#W:tXPǸ׈0lw.x~Ku4׸۟gOcOcOFN`e㘞ߙo2_ӷ O׉TvAPL;YFcP^c`85bqs\l@Tx <#Ne8_"lڜOn?5{2<͉Rakpk XfhQT `& D`Fc4tum{ cl6-[< -껌~;LZhоb510V%f]cT0$R8 "qOcOkM~N_:nvZIF.UeJbx_я:e#E81B+DZޟ?8m۴$-1swBJ)*&,mcdzt`LK` cl< Eђ{"|cI֊MF-zݼV_:z`9K=Oy -$K`;`9uAP2$]lOeMXtH6Yoo9S}uMiY͋s}E7KnU)[yyx\̆ -[R+ДXnNOZ  6D %Jײqbp-Գ,WX ƘbVŒr!'twL=Ȑj bí…lex xV2on[`}]ҷf|V/|* 0 *$#밁mY<]'KE)EYZLgdJG֘l}Xپ㊨c@8`~[.Oblq[RuJ* hpaNPtTMa$fK*?.F] [*}-.Gh_]Q+M!1lAZ].voOraR4EO -KW;jQf>/ulZks\bU>Mlq!s?W;e\ᦚpd/bBCzlA-,q˃̙Wbdj0T *! -0*x`!aF  1X pu4cLiv#F9b-"pL8>.k@S3w`֢SX]4!u,oY'=K,{m}b1 }Wy8TJ5:!/ Vl{$8V_ -ej8qqcnDa-ebI1\dl,0>=N/bYW%`"c0oKcyufaү0#]ҷ݁HwQѭf"W۽RMTzXze2u++̙@qqdLߔiٮs;' $bk[&$:j&(\; ~o\4RR"o?JQR -V,1V`pC(ވ 8V,T4 @x+' mr,"W,XFD_ ;({ -5F1#cLi1#lFΛ4ۧݢ?ycqf"`l@yG5ǰF!`x-x*q77S$DK +` Le%2x>הq;H.#>qT]6O*Ż| V+ -̓Y -XtLasj!(n)XD.6^l\Q1v:$%*)\)hn[͈LsoeZlU,1q򸚦+"ZOlϞ3?(dEAnߵ:W0UX&Ztm?-V_3*ZXfx+ OqCDzrak[],~|*3S]RF.veSTعR7-~4.d!?tŇ& -XyXƒ/[BU l vrP .V*x}?7]໵X'qv]zr;,6gfa^& {g>x_з'Ɏa8fU_M ց&tmv8uʪD1s+3(@KvmKLbدaYsY.F4;c]T-&ɘ}P9slVj.D-]ڻ뽹?ں ܝ,|,bZvfsY0Rdo^#%bmc7;ݻO칧38}pv`GeU*5qӇFk?{b} ]Y־.vmZrZ.v{x0Qo+RYT@2Xw@0utܹdܯM|4djSxY}4n)>t.۟ktIeqrDžmg nN8˶O/gX+{\yw|T0N'W2=*g闉4|\iˠuuq*g֏mpedƙSc2pszWg`EsyO^7RrGc -QU'.&?8ak4}l TqUwF^3V"g0Xm5^[jb-(Ŝ[Ŋ]ř(eM#$qvbⅩcmYo -H*ic@;0hm uxꮄLٗ˚VNd\%iŸ<̀r DW(lHJ Sj g44p]fau\ k,MCAġ5~ZVYwk]DX6l0 N*)G,*\-mH6M@SY1ɌpU0;'l{cLicr7161 X9ĀM  -%,F4'O6i1|>ϙǞv Bpd"#y2P#p$&&[^lfsvCd-Rpbqwp. f & -Df#0XqRr 18k8Mv5%"]U˴qJ͎8Pne4 -|Xlu. 6ڦb6ȭ_>$LX8dVw1<[kb32kn&إf^fd:V1A8ݗT@~o -bšUE2:ۗo r]xb0c~Wlu[ -)T&R@ݽ.i)2lBVwA -jԗUs#N-պ];1Xr{A) [U a*{ڔD]Ѽ+Ej.fteB A?G}~~e,F;Z1QeǺ];[]n2yJczۊY{ں=]ͱ,cz4gLWbn \4vt̶&1^(ػ; -d#SF.U]_ƩFuf#jFt+wJ{zP9n=5i$uaöjSwG̶eެ 4'WO85/@v -u-O0euwC.úK[`U|C;b`0#@ixeqtkC]h{ݭ#{gCP*PAqTk1B5P·GUGk-k9r#[l~ģE -( m\^c%|'rKNwHǂ2ޮ/vVf>eѣTAZkk^]+K'ٙ 92"vwm™JQ˦%wZ]O "ZMgt2E"X -!q+yOw.buLMi v;wLwF+2 `G.|MTZFBp֕qctP}adS2BV*p&82^Q& 4K3YZIh+8iRbi2nU݊^ mmEYw+#5Yu9Kp)+TTE65+Iźx.,a)*28X'b8뮾nV̎OpX@\kqoc\kqq|?=Fii14ƞΛt٦4Ƙl{ZcO%coc{}q'f$kiJ>$%'\kk,k_5Ƹ\O#y{G~Ů75ƻ5q?c\k]?ϟ&q5ƿjF'Ȍiq?lf&1>_f\ N%Ɉ,maXdmc:1V :F8sWTc^92C8߱}v>94E8X UcMF9cF9b,'/8X'1Na3*^ qI!1AQqr"2a B3R`b0P#@psS4Cc°?W'd97Nx^6rW/KjV1TpwJ{ N%)a򣺣 O`_âO[1K7sѿY*j9(;Ԟy-0O\S-+[{--: -}J|\.TvROfSIG929VTT-4x"+7{SRvžf>Ts+}T;/1>]xԽHs~jRW[)y;3ܓ=/2,Mz"zՇ[qQ"=J|lK{s#ⵏbWZ]/ʜ'OE'2sv֩;'h!M͞+9mJ乿WUGhE~Ԋ\Ug͚)QMd(CʎRf<Њ0FWYj[N;ՉR6&PVd;D*Xl]hq^շéFVՕ*>ݐS_[Тݳ#%2WEKEXXhG$`9FKxVkv^hy5[ GTd#Å&I֊0CQ.v/s LxbE:ȌӸd>n3ԈΤ<,g/aC3Bvr>^_/3g IVHq /;B%1Svl)s1h2S#!Ŕ~#$1ì11)Cc'7{'wTv -ey*W)MmMTv)Z"~+֢(Y^n#sA=Y[.o[Z!?vտd=L YI|;_y_y ^["q[ODMŔ:;o{b/_ -۬_ w(+)zT7;'XJZYzm_\ -ܬ -7͇lkا܊Uٓ>2)Vq%rH>df-E'QE~CQORnQ4Q|=E)SP/rեpߏErRV㶽)ԶqCWc)ڭ>oU}Bvo뢧OrJ|pVCZF2(}Q#(eR5S(t*r|fzT;7)SKz.^r^h4''BqWE"VvY&VdЕX7¿ͅ^g6c?/21Q^X7wd8~$95}GgY[цZ۹Fw3GhٸD)-rn_ uF;$܉6XΊK"qܙ^vQv_GGo^Rډ]| %$j_xO}FbpވҖcV:V:)0Jk%<e5ELEn?3qddI;AGKdtCx(r ^fo#wk\E(*h(j?g*X--%7SGh\.TTdHȊ -QlN梽)kd͚)W_.(R?-)ZhvPbNڟ#oS0ow) o\'4[dehC2n_)f1׳%*/ -ܬNx ay?_b'ХV:BKW -ffbK0)-V*]ySQ.?LWbȩ?5zCʾ -IqDU(s$8iRQ;пͅ^\E giC#Hmr| -KS(*S{C2)%[1G⠗1ڸ)ru>"*r|z[̭cDx"Cb*$M%7-za;ebVQԴvk)2]Y-d0#8l"XR+j--&և OrFbZW,T"M*47v;kd[-z2+YI5S#mfvҭ|&/huܧDZ$$7Wy -ԇ1Ԏţ BKRyg٢i- -[EFWe3z2 -rG=z8ݵؼG=š9KPobt'a+-D)^L'zQBN>1_+)+h;=_'.bhG&Eks:Ǚ;.<"~R"?V6ôRkoۈb0˙ڒ/buepeGh}HʴRmG;EOu?lV.,dv -Z:U7#k((um)}<J?OIqEx -S-#J&GϨЫFZ+aR rȣyYOE:{?=LKyoE~tCZc9/G(حŝ\ -ƵB[吸OsEܫAn;wKᐩ.#ȬE.UįBT/qVFAL"kz0xwr-aO}ӼN'u dтSXN`sI7;Կ%| -KS)=uK^نLjҡW -[/yzHDkJRݰCgk;RޡL%%=1íe|/ҷڙS-ONzE:0=cH܎&c:qM0_1ElDҤ-$aMx٢vc;H:akcِr7zhPr͗lCl4թdsږ1='9RSۨ_8\K JWz{ݥ -+fE0kJY4(Zpcɯ.FaOv0rMV{+Kx٦ceצgv޶F;J~'/^$jQGz,d8^\f4թ4 %CCµQWcmY&=%CB]LW*WR^#E=g%-ڬN!Ky7-(,&?A)#Tm9S2XdQ9dC-U!Q'{^Hй悔ݑw<_D6PŧZ_1ӶV* n[r0o)'N׌uTaB^f( C;g)( o"Qތ-0vUW=t(iJ^=d$N;BK)/8Oq[Qy]QSGqtN_#_4Z̸{_jq?jCZ#QEn}GV/6řhyH_cRjZwVkYIF+'S۔9Jڌ-Gh)mȉ+sc~=eN.JZ˩G°+zI;7+Hc_(Mlv)8jWN~lQvW;ԗE8+'QRUfҊ$ގS_켈++9TRU;NHvmbO;j+el+)Sgfǘr&Z'JE5O;~+DvܪQ^g#xSÇnL{+a#D8+*s9 k!Im#,.Z;R/@R[;"3L [{" -Vvx&"Gj:;'t# -G7<0/8\ca/8x#{ëi9Knm+*} Bp -t\ڳBűL=fyn8IxDȽ(/EZHb B5~bh7Bh~ -n9|%|%*9mz#aQe5}ȼ^9C*YTI"o -Rm1_+H%imR,묷S~r~4RqvBVm1$J6aYGтJJ['M^,T!9U-zaӞ-–kS%NY;F_GjF[q^T*,-d^ُ1ft4y4Z+dJإs"1(>\Y*xN1k(ir̛ >*sYOc -/nGg8~̌M# -zsvDgug9= RIxt4}h/ `E3ұl5?Ii5PW㉴?i1K\4&w5sȌ\q vGƭJMfb{:xvd܊y/)?Jۨ=3_#}ؔ^VM2=t#F=ۺCd\)fG./BR<4^+Ec0ݦVزtҖIf7h_=IJZ#9,֊W^e/4r%vgt*gg 2 %.,R+\YO <+r2|)Џ]5ݾQC#?a?RQhd=8Sp{ -mg`:)68On:ŋaR޻G{'QkxNQY=W0IdkbUIˣ: ;vĜg󓃅a)NOYF54WkITS'+nwщ3W-Vxe_!-zp_28ixGmcuKZj告FwfxKF)k,.y-W6AV'm _es -ߧ=w5zirG[mOaV*2g~6t-9]ŎW16 <_G٢񍞜N<o{hik~1ϱŽyX8jqkӛFOMe%}S)'3Ϧg^gbvu GQVKMLvi :N6gFNeQM-/ KQhbl"iF٢~gMyL1rէ >c´p5W-E-9WS>`~"FZ|M#̕඘c9ѾD+SW<|u./ >?i1M\tZ{hx-f,r̦iJ¦]ZRʟ*p -D䝠M-iu)U'-j -WUj'QoD*ȣ*<$|ث&^|{,~8cdXxY -Oi/# V"ڙ)%V h&uh^.u>?Ə :*Rvrފ -081О-"fTbOiySGhTש;}=+8H;J#PDȩܧ}_DR!vwY)J3* R[bWOІ eX?™#蒎BP#*T]#'SQ:w75K<KJŪؔm!F_*&T)BFe"qĵϱy>V/Rm4zvbi7rէUcYg-\HӔseDKEN齤i>nV}E;g,6+K\ʜ'}UQҖY/9pcŭdV:YXbE=9YSԃ֣]֕VyPͅLNEZ벱x]Zq%^dC=Mܫʫ#:iX0]JW<4=u)zQDjeo TeNaFRɿٕ9YUշP[Mz~nV}O>b0ֳ!mi>(QB;ҕJȟR> VZ{URZHʊ -JP}vu1(+- JO5,밢M'ą4 *9\]E?ӧ+p [E< EdG}T 2"*'OqBQyU驪B+? FHm>}ʜ oJnԧʊ܌\_J+NL R;1Jv4d,*b;OpiiB;U&Wvu~w)rmNd-̚ifclM|?2Zv/y;+DI_#{r.Z!)Os={%Y֢*s:\qWs9+ݾcy_ -ԑhcU#zlQEB fT ^6%gcS#~Q5<&L)2hc e8ղ*^iP&뵒.N - -axn*z'E: ~b١ -vܣZ™BW2R/bhN![tWN*Nnգإ[$*z#NSXP+ נeN?a,v6[4 j-!:Yl&hFԉUZޟ)K{Xqӝo#"*DaKUŝ/=V%*Mk~+Ghx^EO㝊wh" ^\՝޻lkʕKs:y - fUZيPFs,uM\O{2]jk;9RK!v?5tyKEY k3(Z:-ba{20_J~*|V["TN9gQNXs#%-;>JyӲzia!Nֹ7X}Re֜'7_D5}71AsybO"Kj(C9.G|U}N2w55;BoT搒٢Bw-jKVB%M/>wZ9?,:'LQoj&ŝ8=rzh#{mIjµ?ab -U)j)ɾZ~7J%zoo#]K(t+rIl -[aq)Y_׊^U)#wԊu#/HODBPԊ4o4JꐝY -3Zծ5v܇RzY^bjnxxȥ^XٝHKjfZeE]9HJq4vWbxvZiu;et睋EY+}^y?GW;}Qw5|, ;ٶN_43ӖdqZ0)AZ>b*+qevS~oTv-en䍊TMlţ~^cRGh0&/~rTBK!Էiĥʎݎ9# -wJ\vbnv]"tW;w.,.݌8|=VQ2xWM`6U3Agh9j;?q_#I/[b&V Oq*EhNY|v~+r2Jkn hvQ'hVU^M6ys;Tk'^yV9 =*W>(SR~Z)q)eפʫ -dT>[̵?”wіbQڟQu6N{9YXS*čdUǕܑJ흅h휄x|*͟bpj(NK(1՞&S)(MXte?! -rGif,0Ed8k 7g215|%X88崍j)Єg):U eZ쩍xd(E E>b";ULRhU T^EQsÏ;Rۀ_%ŕEDVRxvyWIoEXճRyOxvCˢvY+"W'-QȊ^v]EjٙRRy"?qhT_}RKij;b*lIon)asb!Gk%'!ԌJOb1ZّK*1Iغէ/į%A)B~S}%;L+ޣìHSB(l,Ա^;`F9M,_"0TGz#KnxIG=E'-r8&+!QEgʨeZ*N~i;o<_*U-e&is} 7/K*w?ЇA-Xq̭OiUӣ|cOwIC/4s7z# -5Tjs~&;v+BʉRz9%E]xӻz+M)Mk;=HN;;A;l‡'[΅{-d]yaliYNyE)uYJ+d0Y{cu8J2`QC(r[GQH?!,=J6F)}}mT6}mdN+rK捈z禝eXPd4gr]%,6ݖ3)劣;ak wZ{o=hP2Ql/4tU^GgGm:Q׷q׾gn=΅n'ċ[/"QەQE-m_. r`[,v>z|^Zޭd*E9SsWgN2;G)pLmn%ES%,_ 3K)>2.ܖ)_6CnR5QdšW½zeiIqE>d*B_|ʤ ;hVoY y蕵GGOR'V{yVqBr܉Ҿ_գԏ IqEvG+dU%{Qҗ\US)I[T.,ܛPXoWE'y=FkaQmYHQ髊p!f*BY9fuN* +7ω(=LȝJHRE+[Zb^T_e.^)zSOT͚Y](Ӌ+=r)s%v3+Q{*#S&Fmj*oUӠ˝eDeLy<aە2_ :F7Q8Lx6bFQ7rz>QRJ.ţ,Q~1Eeb -Wċ6\ ldp D\v0bb tYydžhdz1KF V:BBV={mr'U't:e'fxk]ݕR}wJrm01Mm/fWR׋܍ZZ22޴Ok:xZ,(,bRvbįRWJQVXXeWeUSISB3w;VVs_Xa ".ֺ*_2#=䠡qo'6c% {EJ -$Qvn+A']<ƎМjxy[$ -4%Fm̫v_\޷!gWюn#hAbJlK&7VwuG\(u:h'|)m QŻD"hu\m;l6~N;W ѓzَ/ÿfȹFHOјUg9J6"vxK.,WZ(gE^Ne -үzIɬkR%RY=3FMdW)*j]^GDd /\_OV2w;FYv|Wh? {̼V⒎1꩷-lxP&BYeaU1 u#}ţ]zz7"*+pgig(r+%ͧrONQݑ6vBnjkqdS"gy)ΟCUz{Rɕlr8cvIK^"˴fQJ~(feU."(-E8ZF:/XW[n$ێYEww0wvȯХ=؏O> -!|v6AwF˩Vb'%O-:{8OR<_lK 6W\埑(ʊҎ2()U`=[OTE87vu;DjC'.;2XuؓkWQ̼"ZqOxW-8=9Eա+8%(G9h~ ,KqZo Bh5-Zlb_u)r/9[8'%#d+XdRF+bڊmEYI_N)[ֳOR E EfJlŁ[5!ҩ;?O~gUq;z#*t:еŵHMXUo/2ɤ}Q4}?Rњ|4k*ifJ{5UvXW^ٲUgz?:՘ÜlJMeNc<[e8;5k>*TrdT(:Sr1N[qXX\pÕ+#|ggQ <8gZXNi٥6yT)x9FRշLtSO,T\j^hi/w鐟g+aIjKGuqet}N1ʒx}?:!DA},_1)'Gc'MG dPwXrvKRCHR+!SkdJZ_Ua(TV0)KRW8/V~6Emz-X;7}'iyVeNbcEnQ RVKvYz% -zE9pnly3ElLZ(u(K8ث^ڴ1Äwuaqd؊3-掞t#üm\KiN/Zoԥʎ|*RfSVTܨ^8|)Fs bjٕY>ba;^Tr8_WJeB2X9G)V"&3K;7.k^ܣSP՘ik$S؊}&v8S -֖EHHS-eP|De+/͒%,K^H|0ɰ5y̾6/r،mvL݈}E.DTVK硒L!*Y)l>%.Tu4bKŸ޽?4M?&^]s)(\Xx"aVs9VޤecQ;D̫٪kEk{GgU/I-h6r85F߱[W)==cYNIB2RvM'y,'h{/-w?V.( =b2kM>b/\1NYlGw:M=-}idJ)xo^F:)PSZkԣʎ'cz\O/(R[> -)>bcU7lrк^Y\PsK"ux䓇*1ҰD)R4ʘlԧD%xb*eu_qͽOS'W8]a -,NSķe_twccoӍҲ(A-B dXJvW̏ 5'% -5 ޻gí;VLWڊ+zW)mkw**|Dvj{DlYdyZ6/R\(Xd|v{L'kvq_YRX|9Ĕ^O1T5=m _P?Cs~$z>?h#W_쳊ыf,Z;Kĵ2ud~s}O&ſ_B_y1+y2Vrrgv^uN7ǬrY^giqiM&^.{{&b_K)8|RHI>!F3[^ט+4]SXQ'~^?C }[} ^uU*weTOq;en=JU:sÖSmew9Uvi)Z؃wFBF$Fiٮ:qMfxkS/&i\Um0y(!d'oH,SZ{:W)G'%o왲ziY -Qrz,aınF(צIf)E/в{FF<058B & 霣qOn! -RBf:IP#|7x=H)݌rYgE*(J{J9c; Sn 1+j;%YNOlVUK'=RM'c\"^}߷fC:75]C;hJtaGuW^8qgG#[wn^!2;Z&##Sj1IDdw2y3|̭ y#*ʣ#*zRqClekorњoMNTvCQArI-)p*Ԯ2!r)WR{dl'^1I4{oўv,:^'""IQ^!EN>gs;=/MnVK2ՋN;+ Vڬ(-M_)%(Gq[̴ޤxtV;8M-ZqM V.TC&)SMJ7y,}29xjnE&*C/S>y&j+pD9\o{e^JT"6-F9K4NNԧ,SڴTcYؕ#g9J4KԫQGX?sí; Ivfmf<9VrRRÜȴ3Ց -ܧL{5/-'ⷦF1PTˏ!GM[/Dv;i5xc>qjM$*]B{b*! -:XsL ;Ztu -ܤ)WNn1Ju~:Zάlyȩ%\s/юj+sh\X_ĥeNr.?W(#^؍EdnM76R;#ekП9Cr"F61̈uWO/dehɻg9'8H# |;شRzʔ7/4u/R|H";垗%b*)}#J۫B,5EjD{<`[9\^9<!>([*%NS8ܞ7e=:{2|$Vק(4O{$j'U%8򱥭fOYcrKc)ׁ ҝ\هm;K޿rQe7/(-4-Vl>™B4e^>iQ_A_fZ*Ekqd5(~Q|yIŴbМNqZj#m+Y.b̿Q%Nim)R>s21[ -❤أݲu "jEd=KELhqQMoQRV:rQzIXsj1'BR뀒ԴJ̪; -"uod-q{͢Id7Y -R7/$I6o^KJٖ>?'(db$wFMjJZz$'ļ)j%xf,px.M -+Rey`NTNFI|B q=5[2J2DߩR|Qq۰j;YqY=u'EʹͳosA/VeݷqF97{ -c3VI^;ߔb rq$עª+<߱uz0s fQІ}5-:vvZ0eaU^<oAxTBR~$dqN$*&*V;m+p~!IXiiB_ӆ>gwԞJtޯQӟ$'fS12.Z;u;QYNj(j,o*^9_uFߡYzH:su -=Q[#UCm!B:C{G-'.(wn*/vSNѾ+pyR}&Յ5vFqf%}gv^rx)։ZJm5!'{[!RKp ^x -V| q0?4~ -Qb)[*q#5ܣ (浔lZ8k2(: -~/[9t#Őq3rsu4}U 04aS%QdԦg_SX7uȊWrr~{Zea-mITʼnGS~_ۭpqZ3jv3!S"JYZZ\d'aRRIx".%8Yk1sGCܲ(0X*me> | oBXTN;q!|YYsַuiޱdwƶ܉CRrhG"Zb#Ժrr;=MEK%SȔKi;HW -1eb|t'-N܇=} zn⮉){?M7۰)МYKE("2ٱS~'mxRlF_ԫʽ -;:E7F?tO`Iw(m$E!m*z܄JdK2ޤY"*a6d[E$ě~Yjz9UV#*sEģ)=H0B?~=D백XIjKNR|tƿCeFCIr0Qs&SBtlDS،6I?YO.&}i*T؏s)맯H_TeNy GTO\T*0٬P[5tSdxq#E_ܗAz'ԏ1KՓGjɸٔtG,b4ֶ%ha^R܎>>,)QEu2=G{-S*qmm,b/ - u*E?[,NޑQq&St'X)GnĹLaw:SZ%x~M2˘c_t'XW8XŋfjԊrKVIJJ{WԳ&֬:~D0kQ& Q_= LųY&1)<;2٨sK!Zb(`-wZ~ܫuArj&j)? 77 -'Iz«(1F1w>*p%KRJtE$)iY9J6FQO;| +p31bm5s`7ODκxX{&O'1DnQA.u,5MI.#VDǴq_y ▉@^uqtn<:#$Z;>-s-cE aњfQ-c(%tќVS<1HrpVk (Oy_[3yij#O4?y\GyyX6v+d8of -{IDj'R(y2Q?q -<Rv`2} B,YdC"Icf$SE)BrQI~5;lD/NkMRNԮU\>x-#Su e}V;JZKП],XUTKШ)>ac+p>%NR}:gg$ -޿܊R E>1*e^[}Q5Yc?Bi -"xVa”^CC%~yJH?T"RY -Dc-c>S*|J|.o2[S%utn+.?屗Z}Ļ;IfRa[kvVt';"qSJ|Jqvby~s(pweOS3-:Dȭ?/o+Aq!Q"REE>xkLʜЄ=q>O;H%'d`Oi>8cK)yYQz!/D[Q_ -& v/RǓ'fId#ħf.B /Dy| hhԊl).(R*rFKfTZGʽ -]E-6S1J?yK)}B{bX٢q[QQZⷙ_Q1f<_l|RJ3Z?PD*}ŒQYw7db"Ubs<;x%5sE - R| -RDWX6 t]YQ׾d*_$J;qū,K=I#$I##iM/Oo[f$<߰1IŢ،woزgV<2OFR_ڜV}(ķ -iht&IY8.ByoXHi;O*wy)f'w(־YmJOa)7m?4aZ^LZV(CR#7n#ymC,\Ml#+E9>+Kxވ۰K#-Q[Iޢ&KJ+3wHzي&*Qi^4{?0#z4U&73R/^T-0FSq!D4Ռ~9'du8 C{OQÙg鳑tKKTYcQp'-؜o - -{˙QG{D-lֽ zI ⶡN=LT'- kRDCP#aKudr)Cˬs6LR mS V+m-w#'r\$.:aĎ+`\JG_1.3[x.a·W!*G 3|HDOCK<1COy&6ه֥ԥʅm'VG"Q,YQ)Kr(֞héD #N;F\uҭFاo=Z'¼z.$Ao.u*G?\⥿1ITO$NkQjSyO*.HGY.%.eTq":eF(1DtZK!$:K[#ħ>1ihENVZ& D[uy\ -# QhR&xYvgO̫Чԏ}Hοƈs{oE_EB[LMj⓻!(y"~ [*z-$q)K%NR\>0BK1K| -Q'_xHˢ/ԡ9Is`G?6adX(;I_BpۥDGwNEg >%z"["&>cTz݉q-2')hie*l˨%QF~5ufyq$_4Z%/ZJ+k#Qei.Aq$ћSpV*t!8G'f9=Z>]IP2,_+&8K}rKIz?<.Q{%Џ>%^VTZ:g\JIS5A_"]Hh1Ȩ֫S8=ODO D=;tҠ4O;F>:[*t)*rG>r.S"}Hkf-v/+tBк[FQ6ݗV+mmlpXcS_0MŮaMj2I![1;jxScѼ.b¯Z:E>,)>>=QGxa$z/i\Q"<9Jܬ|EJZu. ՈEw*}Z)KU}N#+gr)%R%ćQx"hp)R";Bz>I_6S)M,Eb)S Nϋj\$&hs3?m2dy\ -WbU(ەd("q QBY1IjbY-ҎnVV^*ljۙ G-['V/k}jjceQ/NqzB - -Rr{ s-k3_*696`[$S(d"F\$0ŵSSY,=p݄R6ݢPz5+zEmO{K;El*;|8|^ّĬcwF2zQ'U;ml/YQW#r+5S(EXz Ut'W}bԇWF)C1$/%^Tkdf~sVzQӗ/_-RJ9<-٢9OBhZ,[JN%ݽzUhyrDy;^R'M;\&6k-]ik+u JTJz)eGMxu$Ԟ}OMjt<ȃ7Da'7vmH{BWCdʊSEVdRw RJ;6lI+Y J gk nTt1d0)=|HRjr#?)O%s}Y̍IYcEG;o'(J؆)g}į:gͼIj#v{#ȭ_>F=[ 'ZwJ7vޤzS(wpdZiJl**.ɊQwX(?Ȏʼ )`;$z$%/rd:EVoR'ڪm򝮔JIѩyq:W%YVvN)O&.Og]^?WڪzJd{=?Y -kb(׷ kQW,b*sQp[JyPCו«@R5lĩ/{IK-)Fk4ѕn(Ֆ-VQׯU5iP^b4vaV2('$e/bղ8s4wR`סW|]Е~cn.C =dÄNNTg{骷ܿݑI_$U*SRMzj4_8~燰ϫrTeYb-df/c;QM*ZT\B\s+Q.n<9ʇitgUJXf0Fڦ/zpԅ1VZh/B#Ծ.&q0)/CMb[t4uF wEaqb**Cj#"?xz?Ԧħ|4F :8ݧD!Oh 販O$)GS)w1T&*Kc#PvxJ}*5/!ҫ 5Q(wi [c]aݴXWeN21kн9_K- -z]jhIڕ7m/FGUFLEY}ȝzwaU=IlKYgmsksÕALNtjqIiCa_w!xej J>5w -Nj7Eov_yآ):GˮdQ_fo| b&vY"q\irg,TOf,8J2Yu;U/RS4e -+tI7/{)^I,'}%4Uov\KZyoe(vĪveW#foƵz{'Eys$_5o,;i}הS55Xe;;W+jgGitNKLQZ8v؍ -;[YݮFax0 MtT!ӓv{thj$1T|QX6gBGE▴xrWh?Ќ"iUW2I#:GSX7l0-ޘUUqURbuPwO v̿sN4hw5̂k5̕s!~bcO#XK A8z}Kwa9e=-*vDr5 -J)}5Ɣ~r$y.yx"#"Tu -P_EnVJ-{V7+ZFK<1Vߊ:_3':VR*4JЦ1GW -UmC|~F &}ƒųQWV3^}eHĴ56a+t.T}Kث -^VUq׈޶7qmPQ^cWx1ožs'P*SG,<V9j 1%dB[%="|bk^QWi/A~Ekd`QB̜b)9j29eՏ'擹^N1vm)qw{^}IFoGQ=*# ٨-7U7Ɯo1(gX#k"S|9I)xdcGHpv( wÙtf}Q#)o#JZ' O%iHX#5_u*xߧC%Щ~0㐢zqSZ\()SWy}:*Ì{1+y<;Ld_Fu<#&vrMz0[2njkO;}bӷĔ`9n/o~T޽i)+]3)v3}ü%$@_ܜܷ byw#JEQKeHu?hB|MzO -IlU*t)r?y+X裡]mu[jvbO -vCOu)./GUu]L1a x/ -QS -YSHG#tߕB)%颧 -vki;hnvN򢵅V̌%XQ[?BwY~pExb>?xIޜRvE5|֜.YRZ^O#'(_7*[LJj%cޘɟ+2wZV8XuwJ6iw $?b=ػG''嶙awR~1kz!|,qڊ_L|2Ȍw-S;r{7]1>a9ŸV7w{boAIjԏ 7WҮݻ"ј=7e^s}qZ# -~]c -zVU.==UiTQSqQ%x8 lKJ;tӶ9ze)Oh-QJ٘ir'_Pjb }5 uib)`WZV%{2Y쵙Z*^lҧ-ڋ4a)JzUKx"m-[l9XQeB=)Z1Z%-&\(++Ʀ.RۦP[EͼM´<:>$xa䣛xqE+-.fxoI]~#&⮴z8#ӍxEhW-lQI##<2LXkzc/)X/]aNR&7k - ] O|F:)p:^VOʾS)(&ŕziW|m=W*C ;G)̇ 6eZ.T}qSb ()pzNVMz"ֻ#U]ߘxhqڬ_R(E^VUJOaR^ˉosQQԈ/R #cby|z1O㽢v9|>hi$NzD8ĝXLT?Bxfe4Ue^e*m8Q7o`b[Kt+mbkR~ׇ1OJoSGu -94$ZtoIG+,+Čդ棖DU^{ܬN+h׷q9C[ WQlTܠB1<^gCKZ/g~_R漇f٢<8Q>28뢧\-O -{J&oƶXj|I:Y -kS_ -Vͽ>r]62\> A-ezQ?lG G z6/ B4z~ Rwo#ooj|%{SdJG;zGG{O<$ױJWd);Dn/OQZK[d&qRrы༵1Yx|Fjbfy -E<1HMh4 -"^MZى78bܶ9Ry>i|Eg})GYL'"i^-e-z?T`brȔiEӿJ]=-)j"鼌(Gf8oŏۡ-%mTF*iv蔷#q)ƚzE;$/K{H'{-0Q1S)锧=tCt?AEl8r.,ٹZ0a^JWwb,Eh{fxg%)z#_,g^alQɊ20u3Ú%RZ^,igOdL,ԿFcy -kSk;o;B[։M> -qN^gXucFŧRYp$eZ--mL7TahVy[)e#cwyݙJIjZ/b1èriu^fpchi,G?9¬Z+;{>aCHS6kn,hqzLql,] -|]/I>.:hD8HqDs-H:x"BQ(l#DtLħEO1O%| -IqKE1C9EC6Np!E2Chq'ܑ hDy:ap!4L\ "GJ П]J}=R -88Je^4t**)eOrq DeN%>*}E^y|1.WKkE1CyE^Q%ćtS!Ip*u$G]=S"z R}R -8!hS*!W*)E<q D| -J|4TQb*!ė|J -IqOE>STd92:*}Dyp!KC.N뢗O}\BdH 'M%ė|HGB#'ЏS'GRӢ -xxS'ħUOhChR=G.QS#SD8O>~#㢘}H(9Y$S$.4S)Ohq%B9?OREDOM.R*W*^9\1>+b GDGEN8KhR/h}M/}\L\HGЗ| q%uCG>S%GR$@TR룡[WOZ(>yJ|NCPZ)p*sVJWb*!ğ\I"!8yY}W!ğ\DSS)yNN:鞊}HDL\J|#K>O:|'ܗ8Iu.b%2V2B] -WKE܏)OCC"<\ -̥ʴT|J}sQ%N -下L\Hp!̊(]~rJ qLE2.ݣt'ꊄz^)u"pK:O.#Oܖ!ԟOs\E>]2$s- -e^= - - -+xZ(>!؇R)p*sVWĦQ%NT+\H@2(*tUq*p%E> R'y_}Z)O.>t.OG)'R]2%2%2E܏p"I \ -.UOy>%N -BC$OWr+ K!ST%E> D -Db!K* /D8Υ.8\ d>N$8"_rz:zR+%DOOE. GL -en= - )u2G!\4KC2=4RTe.U+)u)WxC$8K* >()*HOy_R뢛G!q)}>8h\Y>TC!ܞ|m#ŕyOQ>'P}PE. C)#hS+t)uиp)-~r< -|ECTGp*s2._Iq)^*q!U@|Q+=%Ĩ=")172G]HE]J]=p| %ďSK>#>C6ʼxD9GGK*|qZ([Knn.Ch})#ˡHu*颟)S;GQUS[DxC#U@|HhФT:Licn*[ARD,K\ q&O.N$z飡:h7ʤxD(pKTSC\[K~n.ChS.]JHT .~%.Hq*Qs"qDq)}>^tVE.B)DS;0TO}#)p!p%ę>$8\ qZ:$to!ԩ܏}(բ|E)p*SC\ -= _WGЇ2r< -|H7TGE.TTS\ĥԏ+t%ĨUdC(!ħ8#SUPĤS*pc/aP]:{ԏBJ\p# q&O%T."\VI4gfC*ϥO{ćS!̴vrVR\tt++t(Vϻ/r -|EˡHu*t#**s2<4v%~%$EzW.%BqD8DxST.y|*t)u* pLyp&T!E)usW.8GB\JTGKGMJqgҊVP}P\=SUGL2@]t.~zs->".?NtR*q#Evv%.)*T*2 CSCP\V -hG#ĢH8/%C=R"<䟡W?B< -|颡>fOSK$}:?ϼCP}( hQ}Q}SH2)Z;9K*.~| -|Gg\=| -|Hԩ؆\NfGR"RJ!̈p!̅ā>GʴTRU!̴G%Sb| :D9p*)2:hO&TGKt#\^8ENԡdSCh. Чp++}%BE܇<%m)*颗)SZ+"QGĪUdCO8O:)r:2OhKQ T࿻C}uGGsTṘEB|Y"3!УʉqZ)ΚST!QSu(}>(>)*E>9R -lH\ - -ICZ;?Or -|ytKC*颗)Sᢳ;GQFU* -|\ -|Ht!SZ*t)peRGGDT࿻C>_R]'ĥʎhK23(ET>+B#?>N8ENԣ褖墟(2D\ -_CЇ2ٸS.T#E.R3)Q"R.%R!̈p)#S@}$y|EN>RDxPA:vĩ{}tQ}Q8p)!P3&Te(ȇh\x2G}}ʄ8E^ԣs"eK*>:#ЯСD9CO.J}JK9Kh}gh^)u*.%R2ȃŸ;ebo´TĬSj7'u\]hRJl,rENݩ*r\QGO̿z!OSK ̇ER\JNfQGйHeSyOS,Ob hQ}P<^$9KeRVSp+WPKDb-!_" hRyXԇFk;39;%DYcj:{=_u*_s(K((Z!;Չ8wj"MOFS%w{xrOM܅$Q Ρܘ]w>s;Cq(o# y*r؍lIlugі:l0qGf)Zb8-+ϲihx| ~--µ>ĥ+%QITҔro|ݴ[ #<`n]V/(a}O"tj&}BZ,4m|jsIEZldw_Sކ>ٟk -HŎca -|*'UVF.+kݧx iFo20^]HSzBbJz]*^aөDaOŎ[^Ū#4؝lk&Ȥlvb^VCqҩaڗ2~-*p%^VTbOEفO=,lj,FM~|EvRyo -KZC -o²#,Y!QjЏFU}E -Hmjqj~Y%q4&`JFKi*t#'ch1K 'Z_rmʿ}*)E;2}u(>%'厈_|J/͑͞aBܶr)A+jDy\ȇhsdcآ}ЫSW!Jdc[a[’v-9d+ny;'<ћ3Z3vӉfNO'\1MZK¼R2Cq9X:{(  -4Mz ҡO[5刢yI,ݯ$D{/b+%RVc)_3QMWq[%垭4nËJ{}މzBMp*^yQ^ף-9<b]+dOS~U%厭//PQKQJQ{Lw^fJOb*Ֆ܇Q5fASE^)Rcy\N[ђRvbc™G2>-KډBQϡQ_]{%;+8.)j#L5Z[(tK -VD,֡<>>O܂;5I(Ya+O1m,YI\B=LM 9گռO!SߧQ4d5*U-1Ni8VeRN(^1$ThX-搤ƅhpUd=%vWe'-qGz9W -^mbZJ2` LtyXLđgY~Y)<%UZiu<.^ډhq{Fv_yzS_zQY:}PrJrWwC䔦$fdz%A;/JImvRhQj#L- FZm%NzÊDdCltgxucseB.M;E^$i1FK)OII%Q -G -SOZ3Gyrnfo)bGBբ8"RrN6b:o0M7J/"o~_2Kc*r|J]H-a:~E.1%'*]>bT.%/D O"Imqm^ҤJt1[c—IkcL?6$FnҟSV+[(_;܂ƌ1R}OA[̳%yB1w -xUĿkRo7™EJR=K=fuMNVM%Y#$ -8B5YJڶ"ʫø+lm#Qх_\MEVw0vTCx%rZɔrZYuWnNU -kև9%ojKnh0e -j\jn+}^HQ(+~r#%͢S[nB/Zi+^}^VKEI~f`N2xQ}{$Ue?Z,֌1MPlM{oq;-K yd$*+l_O[Y?J?F7?̕9+ - 'fSew^MN;,XRԵzh|Zߊ')*^^j/pj{Y"#%b+}^jZ ޻i -\ŕzS#b|О'bC0C[.K+tYgvqz+B<(ro.'ʝ Z㼧Ċ]=Άk$d.R -y+pZ0o2QDЃ(Cz̩OEM MkF~eh'ݢYegRFa}Knhoxc.klJ-\lRZ;jJawk0Lx'`kdע[J׼)O4 $e,:7wtI[NN# A/3W@P:G!Ԅ핍v_DTWR;Sdx.}%v*)u0?}̽OF`)ubZbϡ["6z_{>xԿ׌+ѝ๘u20 dzu>x0B`Qme;;F[5dMɼ?_~ ((rObG#{YN.E-vY6[cBíu_+~oTAP)r*;J.b:riD!˯#K;~~^RdcZ_{2~*Ci٦IX_5rv쉯A-?,tSIlйJ;<}BzHl%ۺx]EQNS/+b^VOM*(I[뢧)(_;܄﨩ԏ1Kh9O jɿS'qM-D1kÙ5btN-셶T>mx?}2Bׇ16#FE}H?^RJ6;u?2Pﰭ̊\\? Ud"yDdcyIoGq<[H4ͅ{Rt~dMcDygKgNֽE_1 _+U{S%S\*~_)YV/dN 7WE?#vn*o{؟B!vnX|yY.mu#}GvF"RO\r(3W4h=0ÿjN)%^VT^UNYYTl޲Yf`q{nUS/a>zVJY ȩR<.#RE^FO܈F.TTޣtN;c|J|bT%͢Lqz%IܩubPSG"X_yR+lGQ(޼amBNJ!DkfrcqJ0EkyZeii-E*bedgX-%/yI[Ռ7!;1,xr]AnEFXilK{L+CZl,>?ؤURvGRu^Rżޘmk6,6!TbXeY/"1o9jhIr.:bEQWg،5cg^%QY=|'y|cW#%8j%CKQ)cx[B(AmF,^!b{lEhP_%-Sŗ]rgyPwoAZ$3B;z z#82OН _{?dS[E ,98hܪ#%ģŋn:-cHt+Yb搛yC͆d;̕ʝ=u,VhT映oVRYFyUu+yV]/(V#ԯmMHö0춈j9=J.PI)e|:uj W( e Ы?BM>^j}F)nJ:i:.RW'Ж)W)p^hm*2|HQBOjF$Inؓ'ħЩ >i%}ƿͅN:{k%F? -}]Jrob1NʷyJ|B-DnYSԇ^[­kkdiG#Hxu8,㨌?R?̿T%SLBG7X[xU'!E^e.]4 'KEzxR)>bO]=ʼJ==Fqi9JI&IS%E?ԇ\Q jOdY:b!h)ܵi-ճ+>!)Ga[Ľ -W^bw&FbH"))KR8;)m/N8zD]p;T׫&IRzS_z}n*+Z#8̴U -)Y~KSLQG|tycȏ"­|{ rvv%)mZ;:N/Uʎ?'|ZvI{u -KRA`fgyQ_+n*O*1+T+}'Z*Bb{eW.2KЩԧR;%rIz*!8,aZSTen89[\M^&9a#V}fv$F)p;W-MD9\|CVd";$ =eU1Z"2EHfbÞ4:=D*;Gzhoq7h}nV-tUd}RʹF/?ƊУK|˧?sObGim.(ԩʽpMyYSbTE>Kq(Bs\܊v(BVxr9zdR'k~3->>V\ --G[HWSvB^LU\m̮֯vU|4/ ɢk|Z*nJIe8Y~c-gy.QO6O|_?c F99z21ܬUx%ڌO~5MДS~"*J̚ޙW^ -͒rh[Q+Sy &?N>dPbX 7&g)_ӽ j[HB[TXx8* qYkuP$af =1mv_KCkbV0܅]Sh{X/{k^T7u&>gzePo<s#i9ԏYMt7xbvfS_iK h~>?#M~?6T+>Pg~~~t}c~3\Q9Oe%Hƶyc?OGDyOd+!1 AQaq0@P`?!Xi5VޤފMI$7F"k$ri%$ؚK$I$fK$I$a4c7hS=KHčNLbIDCtc7T&sq6$j9 c$DzoEJT6I"'D"i4"cdI$&I$I$KEcLzLlluqFKVIבߤFuII-TZiacN4 -7m+ґIֵȍ#&c0N% 4[NMf:檋[$n1\S 3J5(v؉՝]6H[V):.mY7CIcJ1I0*\RUNj&k7^$ޒMjizƍEMUfK,1Q#/EGҽ55jڗޣbb5:M{jy HњԶ'EjwE:#n TzƍzXowKаYiFȕHbTA蚱4oSqՌsG\zLzKa=sK詽/PV):1*o[! -T-UVn֍*-%64O$:$K -[R:R"鉣/IM3dNNtD:72OxqET- -)$6&ԑ2)HΆɢѰBF1ڌ׮uuI&7$dX;\mhDXBB$*E*`DqmDojoKVFFͩ4ԩ:dbdc(=P76Rt-Oz*"}UMǥVN؜V $괌NCZ $)7\C6ҍlb*1UoZ &M$^uoEꥮ+tdz$ܑVF:E:_њA"4uz1OqP֔ϺstbXJ:N"nL><&,I3Wм=#Ь o7t^ B"]AR5v&說MDR:vM7Ԩ訬::$\·Lъz:HhGSNcz2 -hfx"IR /e~ %:[,]#nX?LE}f| 'BD k4n{ʮzDɅl(^瑥m CI4KB ZQbڝZ4-PF[NdBf9 @~D62L\]w?qk[C~|`r6'Ɛ~.D3 q/? {σoKPh{WQMkhS#н'ER dz"1"2i! r7z$y4Q¥&~#9 fXE sVDŽc:Sd$XtD9LO6%/Xߘ3zJ}IZ`~ $_T3hǡTZ֩ޗhfY2̳"ҷÂWe˛'l# quE3M#1J8)B2@ZIhق;{($/bN}Pȓ6 E +!큮4̲0N,$cK8b3Rq\s R#VΘƆߤbh7I4=SIPCtFѶ9w$`MdIv%u!Q*+Q:&$2q\-/dXH{iAh?U+4EђIDiIͨ:ksc!!FYamBhqhUH)hB\$I$)# -$ɈgW0ፕ^☌^a7<*ԃC}R!Ҹ~n??ʫ&:9{hk$}61`UCcлVi8d3Ln B*Ns,ͅBM=Fi4[^I4zǥ1 X7tB# ;߳'^獐nTdN-C`ӂΩ&3EۖxlLD,r`A!w"t-#qTGq1YZ;EB$6?2zg}{OUƼɗU_Gka%_/K3zej$Fgp}&^7$~t~ 4<:IQdk;W$R#֚N^^Xv<&سqа@߱$sEKѝw#A-ݣUCWC~14v>v頄6]9ҏ@ן1'Q"$5$C,ϲM?gF6F^o_cM}E*=-_AwO1Pz? -7 fޓmKuomTg5BX5az\Q^BVt:9l<-O ;F'TcvfD(# j--9hE#˱#๡sJE$9d^&#˙NQ|߻7#v)OFY[ UFr~^Kyf˞ZKia3 HY}2]9wo\")I'Næg:]#̝MF12=ߏOO?Dy?m0ycs}l=w1U$0@j/i~X̓~<ɸ;e6;{ y̟ wm{$vO0]'"2_%<}w&Ks/3O߂e| Nb_fuCFBSQn=zmW*G$hެtc#&k"0:8425oW:\X~yrwt2M~PT[UmK®x%BԙrЈM}Oy^SP۔Q -n av6Ja̾EV3Aф;< u;iBF}Lݸv<ʫ©1oXY0딤96PRN#$} ϩю tc}g묉D2 b:!aJz !vV{ճXdNra򡉷 ~:MlibD'7,DI$"Rw&j8ĉiDHZ'Z7_TI61XhA-)VN-z[9tؾ:$nK&d&-LTTv*Cv&¦$z,pN'${Z:&-}V][/U=7$M&ȎdoO`t:j!J!7s"刔ܹH[E(ur! =Kc \5|dPG)d(f:JtkFޝWj*1hcqNSϤNևvHc{JpD*<87 -z |?D.oJ9ܑ~SU_"{)6c-^sҢl"QooV7o0}H 3[EFG4ᨤ4%qhdCia*b-::i}NuG,F!VPƁr;9uZRf?P׺J92OemɭV!3?oBr']"yB{R730#LG<*ΉSnF)XcfЕTOrh! nQ"lD;C:텡wqR -u%!<:mt|"fea>?{)~K@Yռ^%-=寀b,/rrqŽ#cc$Nޓoz ci НO& Q!-OCV .Wa ԺՉSjG(!'ymOp\ -H%~NN1ӥ[\#$TJ. n-THZfӱyMm1Hu4/AR'L [b찾P#^ߖح(γ⩛B,þbYu 9rfd!IWYыr_6eY!UfY߰Y;w$ONq_|6,l_gp~Z#x<H7QiٱOMeߋjs?3ߑJeM?[{ ,O謜6S퉱gČ VE|VgȥNpCgxɢ&Epl$mus7opűyx$)x\M%YbdiDu]LRG"Аl-|8a(.C>B6BIv`љ %|Xg~iʿyM2F؏1gTCOq/o.ǁIQT.B[6/4/pMfoqH`B\R]]S#a9iN7< ټV;ԠS;U]#\ܾ.`5,Iʻ$߸e2|lKG5E(#$ݎGD|k9q]"0(h2s1 #MJ!ʒ[*2tژcFձiڐoBDhHK -D\C" GwN#Fb2tdd!hXG#ئ0W9/";شY8fSP`qq{#H2L]B$2eD Ao&\5v-\\P0D-Ču$,ali' Ȓb(HK:J۾ -D.G$"ЩzmETZuqhz:R(Ȭ hTHJb R%۴B .XhB!"%1q0Vb$I3j2G'a2hGԹԛNU#smnz'UԴĉ71'?&C)BRgd0{&X65H.ǃw ]ĝt Kִ@r[5RtošG" hڑH0%r%Tn&lA1HD!.[Jt?RG|0K)2۰GMgya }!M<}M~avɁ vaǬN_271a˳g l[e䜍K I3Y2!zRIbMĽ[0=,,4VEU HJbŮ4*l!CN~ΧrGavZ"ġRTPڌL1irȂ 彯?.ጄdJJ+o`Vym7EEA<ԓuJ@Ђ4EU:n*eX/[hUtnF[,MFa~ڢDD•\.ԯK!"Ni¢>d$ɔuFw46o;޾FofH^3lӃSm -Cw7U1z.NY$ME _DQsYMA1 Iv~D-PÝ ,̧M -:R _#" }$5N<Ø{Wt",{mYk/=E0eA"7"zAR4&!U鉬WqVi$lIъ5aUz$AqdU) -la!`)D`]Fe_ZPѾ&'D7IM$!i4I4I5UY-*:V})ރcI$Q%ŵI$YI$I$k}2MfV$l"i$D7I$EQ=oZ"#Dѽzl1XI&b{Sz7ULw2cFoQI&K$hr$nBvmi$ѲnHNj9&Iҭv$::gEztN4nH4ލF؉$x7IIچ@^ o~ 'Lѽ Ck՝2z"C&D-+ׂ+:'DII:\:ph݌=ll ##jU7)?)D,C-&!-/aV?3Y&.Gޫj:-+CB -K3މ$WD)21+,~%" IBpEp!c/*1Xдw̪'$H`ͽ auGD$]mh%TJ?RhRR1D3}%EX"XпLjn=KTѺI$HmM{QA 6m1Lnb#fo>$i .薔g䝈q|b\x '[cD5WaUQ!UzDCgdtnK҆HőTp WF;@c6Q pR1-l:k{ɒV`j5vQΟ{|ok j ßbqaSO ƿo -kSzhK՝ daCjofQez -HF4L6,hН; j[ȏA$:\cF -fOD&p aٻ6]}?p?Ȅ_KKqB6-r+VHN%Iu_lG7i1 Be>G^'Rf-[O,94 G?G]o!<,dc| 6MI $R)"uY ؽGLmQWvŽѓh!4Ȍ#DAWJҊW2P,Ы2tv6<ʰ쓟5إ3k|>d2'.chBV6H۸\'fg NBh .-e;&Zj LQ07acC5@\Qb\APCG2&Bř%hM]*.FyG -劂`PIdܳɌ"F&I:ѽ&DzMU64DQ-*dEqzUtmFAJi=AQ<ۈ%jV$T\.]Bh@Ԧń\mܷO!)$$}df»0\?Z9t77Ez?ƅ:LhAFbuv0`U ldM5H&K["I$wȓݎ vlO$gXyHK-:FUV c}.6b= &6I#ؗ:,97۱kk{ar1t{Q}nH/i -{lcۨ )\!y5z=iC7CiZWSjǬ(#adKtL_)'bڲ2+ȜCJPu[x]k?,c5f[}"d;Q)X$O8f4%AcFC*uuo4NNHଋӚN국4oMī#[[hFB&Q-Eu+[o ifq\<-^VJVa'Xs -:%F:M$Hx$TɪtH:N$rH(\h2!d -W>e 0W,wxO#p"HNdLC$q6!N8)wd.!Epϴ4ŕn(9܉cg\[,E=J",mqIUizkȪX}Ek}E}GF鸅F/e|+vE˕ gzذtSL.''%NH{!4*؂{” \묛OCԝH0 3acVޓ)T{ ЏE-IQ`ؒtdkНJɎ!Ҋ K ;ҍmJ8yDRSKvԫ5.:j~ϣOF4&%bA -J\=5L^EďVĉVũm}U>D6NҞZEE6BI)$MH"FZ& ͟BXdHBi[y4%.h$DQѻ /qM$lQT+CI>^dz\xKiފTEH$,'V<"@vۉEal͊U kr6`a+H'%, vE2ԑ5$ѩOK~؊*/Xޮ"ܬĹb91/F(nB R_ZlIW8n-n|!6jfkLT$]u|/&|1RQA0PuhVJ#I)m"sbQļNm]z LZ6Viv'[4H)jEe16MII@ +bS2J9Oz`_q-BeI7TEd2ԓs/OQVv_cVD*нx SwI1"@m]B.I ^%۩q xąB~XJK5_Fk:gR#T걝Nҫ4!=3VC- v#-ȩ QLҡIҬy{Ǽ?jܥt'w9 Sd!xsaIly`H24|38?wBF@ǼIw!vR(Ijt}D~~#Fxk(Gkg㙹$w ynxvLTi"])5/}v,ZMɦ,lM/m{kY^ǭ,XZW申DZ;B&Sa/pǏa챬s\0%؊L΢Q<µEGq<_cnX=919EN'XX'lq[1K?OCuGfnLP{Cӽ7$̋C^dUB"{ W؎Y*H%jԪǙz1iz#~һ XF+yjnx]14W8$ND({d,_@@ĭtR>Pol& C98)Fw3y%{!. v-T24H|E3B{VRB% -蔑|Խq"#bR{\/fF} -CAK,n$n.39 BʗkINߡ:.twKHڏJb(xЃp?WQ>)beMC%xe"\Zk>}&ooZ1:;ԬK")3q$$P.62\mWUFjIM!Ia54@BLI*1wSzdgzNaƍGC#Եy? v 'wa{uI -䚴Qo'[2ċ(I`F۷hNF!,Qz XTK77QTBT T7!lTM0:-*).øm"s \R]$I$I5-Y&NhއH#afN ⻓IQ#:QWbI2*Xc-H6QΩ$6hDɤ6H#I$ XtNY7$dEuXެuUǡQ KuhEI:#ԍdUe: vp*nXǦ$#xT)t'vs (HIܓy pwIVnHuM7.#j6#ܛo[7Ԓuk$y5:<Ķ-A,ܕimbR4/^'zPӓYj,S6n윶]_m%!&nqxhUlr&/bXI-Y*^Z"D|*>r/5"QN!if{ 0Е$NIw'EZ=NcКZ޶r$jEl $1Jl.ɱ -8 -DkD -Xcd/F$ܚM$v 'D6$i$C2I&'"5C}WЅ:sD#I2[DKV(rbS!\,;$ :VŽK-c}S%s]т$].2.u]|0Z$dŚHؘ" ؘJtaoEqViMеlnGDӦ/UAUR*=whRR_SX5L _ :m)(؞_qȔF.NXơn25d$:dbA\C4vӳ"G>oi0DbܣgaW-NH1ָŏ>坋WZ.Y5\la7lD1!9`*p<1B bՒ( } v"Uq .E${ ?B *1trIS gD(@ T9V8?lAԻ.nj" +p{~YKcq3KCXm$f  d/J짙?2EWHa[|Lu@)`?$UqI*?pV)%AX\VO؆ %;y.Ws@r ӔcI]zbm>FIU-дFWr)kBд@EU#C&BBH#̇T3ܟ3vzq8,3",l)-D -7[/5cד.nG2gYq ϽD|e d - )~$D:Ĥ)F/.A|nT_ H~1GRi,N]ڵp/7GMۧ;h?wB -V:MKNO`]#c˴[ha7tnI:6:$UUM]1VIQQQzAIeDM -<;B!|MP~(2,`VPӯL?_`IĘzY؂__f$u|a2k-1N+$? kՠ)LJGYǑPVsA?3qO߰ӦO]EGI8[Ip{b<6-˴;uQjZЎ*TM$MfH"Cubt䲶~FpS܄nA[,tL=m}%䶰eڂz}}JFfЕ p_C e)Jی0&H -I4@LyR1^lj:6 @?kO^:iO-RȷbB#yG/V[dܓ"0rF-?9I̤?k@Ojw7nT z^uTp1\k:M[GRTa'G= G=iMQ?FdüIH);>" `{i"'X= <aܵeo37dE[qdBͅ$ՎJpIX$q7¬Л "Z 6.|G"¾A=&B߰!aeq-rFmiOw^ǽ-I FSMId$I$a!kldz-g+?8巴M nD+wDAtr0&qTV 0]`lmUd$gszIu&i7&N&dɁeFf#[\I&dCzQ!hJUz4\Gqѷ5tMv$Qԃ.~dPlLV$%#bDոIDG -St%вz0,JE@dU$ a-Ii߰`%)h$^is-\J ͛4I"b ђu"-W# B['bFDH,Nw$KA9''ZІ7I&>$M&DF¦ ;W܁FB]W{Y LpJNn/rU edw10nNP7Jo"PqВMJ7ɥ]KٌQg0s $S/d%o~Ꮟ6?bqs?=! [C$z- Z`x"51cjXa#:!Nsn*2I! {d'oH C}ќqڝX_Dͽ|&I MLFRn8%i&qdOk[!u1ba/KKY1{bX/fF~s,m5/cn3A? ۭ/uÝȌ0_)BgN/̣gV[h1[W)"n쾙K$Qy,OL0vuͻadvDdAB,M >o69VYk;PZ[(o!_?ԧ/d׳R;[ ;[VЩH[B d\ 6FNI8b7YS- DM2L608jbp/#wCs_`"6\9vg%ld#7"`l=6۷7b"bXQaJ&Mάg?" -A A\/abaQO1xl:tceϑ: | $Kawh⮹?IpsU4-UH7dDJ5gn鵆gRjz j"\gؕ(՟W̏ſ2< 3,/'1 N6)o 1 X/g p̑2a<a*4@s"b(pZOG<ūKv?z(֪(+%CCAhC,~+7XTSkB;\ҿ-'n>O&?Gń)[L+e]rgboɸ,6/{|1evvk?Qd+Z&/@{TٔK>}2g'Q%*{KաEn~rsB8w$Û~ -'_D O0%MH~V] ^ n}?cx(W e2JŇ{ J "> -16kBc9=}ػl[x$AyàXb%o.m{ $H#?cMʥtyiJs vϹ' Ȯw7 d -a= c6\0‰'؁,ahҖxhE-[IZv : ;q>?aJU͸eCbl'$&V2d -Hd!$/A-,,zIRD-ha7?=|G8 -$nE`pp(J׻*Bv:E }m"FȺȢweQ -Yؤ]EGEEbA֛Ғ'I2*͉ztt Bilc!9*#qv-Ɂ[ - G6P ,#Z cb`iv<&"Iذ"IHF 'qQ ,˭2<墓C\~%mh2)/a]p+I0؃x%f&׸0fZaݙlveKMsԜ-{C|es vdV6S?C)Zٲ+w\+H̑Ë R끸ZKb1o5~ETMu6b ud"i$ZIDܘi~M4$Lt,Da")Y-*hCX̖ LݟwP5Ib}!j=) Y0;nǸ@5mÓͶcyr= D|l= }}s)]FpE%!C{LVxbY%P.ldsFbJZ}d6d87p4FMcM/o %gK,g3m5\b5tB2GE'4lM+_lm1W0l+ĀP @Qьڊ&jn\BdM&'K biXfY$b}q #%WaHkx+' V'| vbpt_فN|B3Kց\8g EH?"Z?qۢVfP%dm?|F5K ݑw66g oȉ,_tE7\es; " ?(́ne]$V"XngpJ+xa~. `ap lyx+ȇqšۢǢ&hl4oLղtG]^`bPҦBt3TwSDUmo r$E yRxPeygt7RHGsa%dgSzb" -FqpIBݷ]jĖ.X0b_~' I%~RLMy)-HOaZl> WCģYl2.yLn 7:O툒i?BԘLMz3_Ҿ<5;#-۴WD`tC.-wM8$&=ˈzz*tNF>ndX# ȼ>F٦QoպAvo$Gq,M~Ҏx/? Qåx!lB/>I6G">\<%)Hֿl~ 7 O'd%p"FaxK w6i'%cQ1k~^ZF"\ʟo`S~ZeաYm>F{.WS_G cVe9EShhFuXlзxw_{ Xw%$TʦM77o8LRc*IGZAs o\Q< -Q 1 Y"*03$raJ%!Fr}Gi5/鑦+'rt <zCeg۵̩~RnlKG"[QYtb'.{ch e.$RNE r} Q);S:"q9Xǩ_:L1+ -s˧M&IrDI5I(Hl@/I{AD9ܥUDH$HL18I ʤ7DVj - -$oR#q4EЪuM2-9W -%/~wXcRMI ?0 w]џq;$UMOܞjWR RCB~N\ -S%:3vcb6=ˣ!Fۢ GK,qC&CD*f%ShI^ڛN7!ivpAf^T&N `Ni&\!4DЖHK)L{&l#y .IRRcE4 Vnt>x|ҥ|$IAt;>bΔ;iHAmXiELp7P!LZL '>&VM` &ĭhB/D<90I$U<%}%V ̡7q-&nF7 SKS3 -THvpA?.[ ԪKDlJRHE>[_$ūǡU$l%7cDLeer2۬1=@YK*!ɜ{yv| -;?WbC"}ٖɾ F+x^~)#7^&[* iqXĎ;neo{~?2͐&De -ŔLg.%D#N "FBJXjwؒR˟qJTK)YjdYb7l/ RԵ2K =d@ڙ mlny.S<ܔ ћlJbkkSc"[ݞS)c<~fԛWү4ͦ /\OcMfv&LȀXOywQt 5E9O{l'BY7ۊ曐;([wϑI#uGGvB_:6@w'EGԥىBHsd&Ꮳl{4ziť[>W}0'y;x_H[?[9p[]伛Ӈ}HZӖ[6}M]coŊH: cP!J CC?z$_qw#6ZwVI~?z%y"P \MYG'Xݟlgw -eLiTSݼa"er& ;wkQl僣K5Jf/K1}q)O;~,'*\O܄')ed+E4q5< -̼1G3!L/a*?Hg@,gi>aqѸ%O8Ii,&Gn]ᵘOW1x0Ig  bmR9į#Hh0}/1.]ϒQںk(4s7QLbV2 -tâq@H<_Y< b>Bl flB8aż-Uz6liDzt!uArQ[CD,MDVeXVR5wԟ"Ȃ؁#8;E^ <3y3MbdnܦmݳaeDlf#ס5*͞ (ہ,#ؒz!,(Kvbh򋓱(^I5DrI{&r'w%W¤RēއJ5*Hg_f-夲\@;4涇4-쁛K6R% -w&ҖNa"_I4|=O}a`pHZBZp'3'+v&#kT(+V1ϗ 2e.MRiO Q z#cZAf |m6Nv;sOn'{kPRI|K$T2lHp@$lM(#2(0L˱UOY6кގ\6$ f$URdbD6TRՒIcw?!fGqy`c]DĜU?]O ,.= E/~ u @Ac!]vĒ}&GěFD-4S`bC}2օf5v;lnmg#n{g̚#vY6;P7\n&BӚ}Mpmp9?q0AȍI#܉6ȕ$6iގD{Vh*މ$aвNcRjS3(2bܨفi\5oh,nI=I%0$VMB)KLq5M@H7PSzam *:xAjr\Ay5uq/BS܉-5J|AK_<ﰏmAlc|W%ISyyv"#W#Iӂ⶯]L܄)i3IY1C×˹ )Eô*dGodSG~!45́Q`]:m/ѓ6ZAPp1bB%DFG}j\C$i>䗏JGRлsZq+v -)>G -MYRYmJQ>9A7{XG+cea(2vHM]LeZ9?wWmHtz^k&lsh 4DI1K [չ4Ct2*p0V"ZȆǥo5VR.}I/ +cq>YyD*M'; -Ÿ!_R @r_v~ ȹgŏ+3m"<]$ѳ.s;p'fcrI}5U@R,&%’y9' FNIU'@m ^ 6v{%'%-)Xw#zX,! dB(Ԝr9i+g~"({(~֧KSuY{T}42I;J -f=67-h|UQ8\`yφ4˪Mߙgp2 f~8znt96?gs9#Mݞ+ؒ S<;8be)'`+):~Drϐ˥, u_f,kl7!̇7"f>hR -ab'ߋ6=Ƞo7{{q`¤^k.;y_M<\/io rgQ0$VEbm-b(rƗ]Geݎy2X{oO}y3aD JX5jd^_DCVC6 -^ؗJ f"XiTǾNaWbcL2$,N * ڮXA=?zQ ssMoDbd͹l?[: ^%+r%R'],ߩ dy# -{Ӊ⿒$^ ;,*ZdK$41Eݩn7Q0D'&9vlp@b+EA$q("z1&1Չ ݇r.ʲ!čKu=EEH`zPޮKt-uN(_s#Dvd~ XAnVŲKoag%+4@1q^JHa$;ĪI/Ad<"5HbI& ¢&tЇD7H6Ѷ؝ozIIªdZ'B%Rk}fj[ZԅbkD)J_+/C'C22jnčN);6@#w3~);d԰!)!W-SF.:@ؐHp28'$ ,WϺ=>©Xӹl+5>&Rn5me -+3B7M#bDXBISU,ecIr%C8)pr|#,'Mw ]QL&ԛamEdlzz2`I%!Hl"#"%Õ 7F8n2.8j N%-#[([e^5)6B$ic\,WtL3C!(3"Jk'BII~l be?dOxB>!( ?y<ۯxԎ-_I$-ӝHMhctBնl,dUKIrK*ވmm\E,9DϠ1>ĩ7aL06tDBIlGQyHttA'-rơhC;L yg""&FfēQ-K -&"]iٟLw#”$HAXn?w>cKo&q0L3,mP - ?:I%uvߢ]]2O˳2l?%qcKեH `j?7FNJOqnF6p't,9Y/%%ڏ}U<_O[G7 [4eyٲ) LnНbpw&C\юB BT=',Q/RҋOyF,^ P$c }-^ Ov.P8rmn"&n\S#}$'2NpȎLU瀙n$;2i"O$?*mrmN*K@7TUYc*Lςw,&q,s&AgX3ϰݩ1q=ѐC6Kzcl;{#dm~$UiFBr.rdy/.4K';f&%5 #v*x:Vw!c9}4DJs:p#Izw$96FCW|"(i6VsG :3-\ۻyM+ -OuϹ -J-!oX[1Ci:Q7@mr"!H a "^Jɯ\Q=k# 'XbE{hU/c-e=B=sIRf7%$$˺^I ؒ#w"S<>YJvL_і IL= ѩҞab{vVb[E= DPDBJ8n/21X2h|ʹW\ *9D?r]ld6A_$A\o-2HqC{Ѥx*؉a$M$$& dHڛ 22{I1rEC,7~ͭA" MI68q6cf&rILQI3?;u6c|=gV\chÌl[4n浰ilblUx?Wr-a( ڐ, ="w.~Ҕqw PJXTK9&Y$M M q1$̊g8،6fzKas QA9t:Cd3rZ$I4\NiqE-s#$CF -j}|;/ď؏hpvsJ}bD9z~D'-r!s)LEk'6߃bVIŻ7u+NEtޖD@K>"-ݓ^m瑈x&@rrynL6KeeDa&T }DٍK+ -2[#lD#;eMcJ,oc0'"J`?fC2M9ML܎OVTJdGRTI:[$[bVAhKGUtmr`@W5aIѿ},O= -U3pcWuIRGS9t6z.Hc/c;A$%>jzs d>~AW"xOacb|+=W[`K1ǣɰ2i`iqn^%>|~JJvȣ8Hፊ̮1%_Ѭew'hTB WyiHT]`{Ans&ė8W EwU.w$Dč4EZoKz"k (DT%t[^#҃doy,*j;nb{{/6v"Gx3tE"'+>fCѸ鎉X> -s)rfok<OJZ&~ }ݒǘVUg\u<5 7l.12I@WNxgF7>%>V-)v>3[P; -AUgvEKD){' 9-qeÝQ*7Y ]h$g#5މEEj, Iu6۫7m#xbͤ^G2ᓩko?;KĤn1)|Y$MgMq$7#qeʻ{Lڞޜ/wpNF\ -S{]}(]H_^*†1Ϸ_(Ympe$!0jomc۵ AsD+:za҅2~/ _C0= BtUI$nI} Xr{6nnMe[3 [qA<W$RrI%* R$!6~ ;_9'%ع{*c7 w^Y82߰8E2D̴1JԾ̈ K>c36bs}#yv6y }r%ܓԳnoh5+#~Ј5/D͂7BbL.DĨdT\ jM/ۂ}ԉ268B -M?/Arp ) Jҥ/dZ>YzPr%W,Yqg,O績µ3u~tYruDqeǘyYexSz|<9 !s6۴|F ɰ8O22YSP3wz⴦N iFFn$ڃ");+FCcaL02?Au7Hh -59i7H53}սE者rr3[d]l]𨉉n%+SVyv_t"dP!Y0#btv" 龉$+,isLNVŏ|W'P"iʼnAu@y$$|mQT O  (C'x_(\ni"dM0I"ъ*CnhޙcF*u#nV$u39"N#b$M[,M=s`r6\W T,M *@Y4DK^F"6NhI2h&XXުhmNņMĔI½*Dtx!RW$+&jT$nM-3]4dîbfEV%ܮ6{puM($pÑ1 eȆ_gľ-v6}WFgČ -&96tO]ym17@s+%;i¡H\Ìd?7F7X)r[mqIS/zʠ2ٶDCs$ɍDM-I:Z2BUSrI/Vbԙ[$hL!>;G'c˥fȖ}jTyD$IN i90X#GI6=1ES }mAE Ws'oo[3;R(%&$&\t/֦zI}erNiu(d(_g[g QΫ^$bt34}c_A i6)sohS)FIJur lcǻ`F@~ނYZœMvC].WÓgK&c;L$#|i٨C3_v. pbpI`HO`DŏLNA@Rd7tJ&Dbl(q*'AM/%ŏb.X\]SYw<&_G,%XZDn2&@g#2ǮK4>'*|hl+DB^ -\nXXLQ]i1coOH5><XΦ0nD+t=R6=ؗIf.( V.#=,u|ڲk$]XB -'8b%Dҩ2ܶCpm2ZpYљԈ S->FS$0lp\nG98u_(_P i`:Zmѥ$6|ɴt -Bցk ğ2|rd1RlY1d-J ڋrc5R1tloZN -_,== m -SٿNG<J!P\ȴŶ.O { -w]xs%"tV(+0LgJ )ݻ_ȳ9DA$ 0%u+R;rrg52BTYA2[@䜲4AzVxeDI&e% BEAoCX7C Xod{u0HF{FUxɸ)M$R$$4I:4)ĸ$v[!1$"A&CB,jT;8s҈a?4 -"w|aCLah3?M$;3qױ>Y:8Ua- ɳa*nnOA)+$KR"Id'tr2Eb&"]I*tMi6d[*K⑁0\F7n7DtD6*In2l\$lwCdj ð*YCpdYP-#a"vHF'"V.4bd#>J؄7X ",cd,M'LrId[anlvzLJhI@r -[E>_"bXi0f6Hލ6&NΗ4I3:ت"=zM̒7IhjI4TMU#;ȄFK4 $$Dݱ,k@fBAw^»0itfRh)n1R7#ؑh M,M@畹2:Ҽ E(#bo6 ~ c M|3\[F -w]MpCk lN&[ =ul9ޑ8#.Xi85՝Ծ]ap 4FlY$G(\N`ӆ _ Qz;bVr|7)1:KoIsDMD&ؒx.L$[\#bhlLLK4I5T)$ؒlKcd&=F$)b"`I1i#H&Đֺ .0F *L#DV)ℎV@'NQ[ܬGu1/#O8E`W`M(rK?GF~W p&wlaQg5K8= ؑuNl&F?_ADkc/sb4|dVJQ>Ġzlٓ'y|}/q-d!mEȍ^0Yr)q~$\:-lZIEMIE-OQ2I$ܒQ.t$PH$UI&Ol$ |ɱ$!4G/QPud~@䇳7#w=/ \U5Eb -;'nZM0Lqw+b8ؑLA_BIrj?'F~dLy?c| Dy$ C60+OE>'F_2a~UJpAD>kbl=QM%[vq>ɌzqvܐF~.?oR )O-]$=$pLkmPX6ɱ dBEE.I!Қz?"&%,ʣKN madvo JI)zMdq%˙eH_Ր臙I):#q}BDfL?}R:GMI+C&) &5LH$I"u#.H?_+V.gW -k:%w7yoם[1} 7,9xE bDRG"<#M5=ZZ| SN1 @},-)P!Sw"T"D˭1ʈܢm!SA!yV~Bv%kA%AQESFȝ0)h.Xڐ&bE2Y}'׊ܢZ,߸d3}^C'\ sWfKS# m"zRF4L@i.IDF&M$bIpI$7֍ޤ{ɂd'E$&aRdDbȠ(HD`,`_^ ZUQ46&&6&I$QI7M&oI2&[$trIv6>ؒLڸ/_Ecf`:Q ВhY[dIѱ8&IR$I&&TXI(K+I::Mi$*H:J=6Ae98z$LFJ{H[cC>ocla׋"HgrOֈˋvDU->9$m}`gE"D""m<2hꨯYtaDM$lEI&JtM[aYf pف8 fz >4jQmRNՍmur"XX,'4Djt_oeEH$K$2kWK*UhY /'MILI3v9|E1j!YugK"*-oV9Ӡ;X0yǫw؉e=4 -wl&y -96t y]fpZ[p? -~N]~Ԧ!zfo$XS%>KXQEALʒ?d(6|Vo"aw/7D|v'h"ݧ2[8J ơ*IMwВQͤ"lEoJd 7&)~^%6&|;ѯu}!<1e^'ۏʛ'/q FcaJH(m񓅲ړKClOt -D*.II {u/? ÑbiCvt{KMVwdINlLԌ]p$Ewq-p)Hy|'ܑ{#g?WSpP^): +hK!?#ْR)*R@a`̚nl}E=ؔ#0AŻ))g0䯓$ czoCT!WT-Ei27zɘԃz"k:IjIvڜ܌?숭CdP-5F2C2]$ri}ޫ5Ͱ1<>$_+ o +ɍ pMq凉=逛$.$LCE| -P3fuºN28K=-޳=XC="7|]2}ZQD_ѓ&FSP=CpmOm ]=),ڒHaCaOь&?蓲 -Y'> ~'7~LODnWNIqOeHx'hs9OgBP@2Um%+9]vY?`Ѿmn yf ;ZY/9h|!ß~:9{Fbn8h wIWe]Ķ1n)7-YlE<I<6d`۸?.- [Gh\,¸ȴ_*6T7\X oV}2cHbβW;{RxB7wKh^VxϦM!,]q$ xo%:F6 -hJ,~S>t"Oo+'T|Oe{nȸ!<9gu!e/~ҩ ¯{<-cl^*~O,hB&{;;j2u6I2J~D3>TOzdN翲׏ṉ I -n>ٛnxhhA9 ?K\H*Td'_#np"IN篲_CwPfۓCݵ}n6&+mLhxaM|/*;k !}x Wo/d1J̋; ad:g5b|?ef<@>z/mLbG%]Ja17:kHdm+{SP!7ˡq߻MܱG[Y>(٨`r^“y';^'v*: -VP"hS!O +e/;aOa2[W-W2bcQ„ݐ>UM6Mr*2If<%<ĀY䕶rb,$١J 176-'"fn-í"04?SkɶRbHBV&G)a -nв~RnbZ$_:)(lWR~(ϛ1IƄMi=_ M{x b2zlxu:ۛ/{YAK.%CDn1*L@k}-gw$vwXЦymwy,qeXj[9.r{ӖҜY ItqrbV̓_U/e-3Iߥ#сX#oՃj5=SY0gHCL#~$ IgaW -tFD{v9wjQrYss;lVҹYm#-.E<țINjh8?wB"ƥdk.Zþ|d{?<Q(qٷz_1Fof3i>ya\7 _ z{{4)&j } Cj-Sc[Ϡ4kD.tCy,ğ.OǤ -|XHڤ8xEȽN]caᐚg6b5b)bƜ05%C?gAa!JScI)nyߡKhr[/ūeI<: -#9u0Kv!ptf& ~.] 'Яys[TсR*SGmF_cpJ\Č)}bYY:ə0sæ& ZBJHI^3{I>$o;BAv=ǟ?SeeFr=E>^E5'9gD wP?W<L?fK=na+ab^_m=J]ߎY2L~%4ycJ~dd^jֽiS. x#+ -;I:GܝR7I7[19+Ma2cEȴmdKJ@f˰#/`&7,0AD4>J˒s8Kǡ6.eͩ&"XDx`^O#NxxxPJa)б"8PHcEqf<@!dbAef[t'OmؑaȒ̔X[V7Iqφf̏^uN.%dI$B>RHMx$M'FhoC$fInZ eW!IToi1Ґ+ FA9p-{6GK::[>I b{N0[C|^,622Z ߺ3w~G HC1cjY*Yw %*.OнfQmXyee|n1q6%J-L=U>`iTYP51)-,Rzs_`#TS)8rA4D;ȱAA3~Ofca 6d[p*{'nc*rٜ7m݋K9mAHl=bl>%w knAml,i srfFLv$] \;hMn8A<=LW{ol&qXtJKsP 𾨜2Q;hNN* - ~%K#3< - ^6aVĞܗNgs4'RךΙcv[濺E7Mn\zj>IJ [' )i2PyoL=H7XwѸݧ1FxO).r5V:osZ-0Ԫ伒}I'jAw2X,ʵud\-S 5gm{Zp/F$2vsYߒL[[{_r}! 1Y!ݶk?wd?/]GQGm^BRVEd>ƺ d 'pk A&'&حWxs!k%=ͱ;..$Dr KGqSi?"3!I %7c"X0!z93]D?cl9Qɑ$l3Ώq^Єc&;-%@ Vڒ1{0O>""?c8-NN&dCdk'd?C݈Gx.Kx q|h,S?ksrQO^e)#w Nsf|m^$ ddOi9' sض)tj/Ml{"o}\1['6Tɥv!g+&bkuuqC<1VbF -rO ٸ${IRХ{DV)yc}O~f1dmT,~ -FktA-S$_A?^RGϵc\&h>j\] ]=w1 ^mJ>d}aZ.euՙz0|?8[õw+ǎM{B3"C{ Vscށ -D~Wåy?GBK>`[/*k Ğv-2[J..)K胐{hcYd8;{r,G4h+  -u/Q/b\'=n>X t:RKܷo$0ԓ!V wK7k翺9BC0~n]6ICܔt&m5.vhq9aW#gy -e*9sJ%K-*Q"_)aHG[I$P,!='3lJ!C=(j%KOѿz:;GtOȯCK eClWI(W #$R Y8B< WB; l~^RJ׃&~n@7$]a7W#Y.fT[.I4d_(՝>FMLLiN=i&b,,+~̟da|sGF-l.H]q*uQ3bEwf˨@3l; i#״pofK.Lj@t EE-*N;Q̲npZ]E&2Zbؓ`ƞWH YQFH9䑶2jhy8 wR&i5nv0' -.8b90 D?`#ytF.4#gIj] )z&ab b^'abfy, sG)DR.+>a@HX&6.fXܚv7Ga ɧ H$w) EhI5v(.!p ‡J㥀'Q䫔$Q(AC -y= MOab/'D8i~,(D!,!=J7s˹o < ӘI/v7ǣz:/UhN%mH޼RIu>.[(]\! JΕq tA -P.!r:ka$a7 AeV_6dq F7:n1joMSzܟG=1XF#M>I4%Ϡ$g81y1;PS%62{ЉdY!'t:ϕ⒟7 n0 dېpe1O/w&zyR!"x$\[U7,{}{Ir/&tt]l/cYe͋$/4No-;.eXC>U([ZZ|g{se><]L\F4EI編$tNI5l} $kSIUH4 -7Dݽ] 6o. P<o-S0G9e/Kh>UKrL{1uj:a\MA31c>}Y oɢr[6#!W.+e/&/-x&Qx>ͮ&" GSVL0o囋d!dվ){vf|~ĴJnF)=SpЅ9Ad&.t%2=~AzY4$Z_>; Sd?c"||dg0ǎkyn1fS<'$\v<*9:1O4\V@v,FYe+WbوX,Q?k~ .5+Ⱥ4g3 D\F]ީ&wv;qCrCL#Sߘgyq!N,syI4UmFi4Ed2N$QI!xR6BE5΢vD v쥣-_n )( F(WxfC%jΑɽV?n'W܅~ǘ'u$uSD'qӑ{/ܳɒ<?/F2Е8Vh0ޓ0aa?am 6\&<~-R~\X˾YeFb轲q`>ǐȉvh<{=>Y5uxtgq]+el4_ثjrq_$NĔ9aAY[PYk32^A"0ߍ691".X I&\aU%gD\&ɟb+f|JF蹃 Q2BgTн"NYfhvO'a0ý@ N3,=dR(ٮPV.%pKá+GW^Fm6&HAqv$DׄY $M}萛a[ؗ%lwMВ{M l!JdEI$ZYq=s ˱%.< "yρ+{ua3xz[QsOL JDc-=tt.\Ei:8[$ܙ#wlyC&qPh$>\Oq }[yZg9$<Y_Dxa(KZHNK؉mI$%17|FPƌ-Z!eio3L5sȜm] Xm -GϢE|~ڛ Hsv!,I!5>%$ Hn^[r[})9(zB9:$DMget)Q',xٰ?BJ:'D(n@@,t 'lcu(GlL!t)P;ImA'͑xID.e Ů,Jx̹b8EgkFPԶS%2ȬKarB$%d^vRn~ĒI% lggQn O#L%mG(w(0H,!I.ғҒOJDjSix %nyiY%h ,\\$s ƥxQ-pnKl{h۲KYn7\r,\M\b#o6,1,UsG͏j<aNid%2kV( AV )6,u9I{F4-Н#aLrv#3!r6_n)7*wJj)7d&I?bĉ uIfEu6"0w#b=ۓ Ycl`ҪbՐG.'. rkF&@9:φ/5/yŽsIN1,i $K.CEAAH R "Xj)GҶSВ,FO Br }bcƏ2p iKtvߗ;qei$~"Hh9DKXē߶ZՕ.շRV"׸4.a}-yqʲK&g'zZ'"W$3Kr}+FAoQD6%W.{>e0z{|?aBtEADi" ))AAAAT(EA  ( -fWXݩE*] QxuL 1ϋp~Nx"$ra#Ivfx[NXvegz"n0X+L>ig"]g<6]QaWE2#,GoLKڅò>-cpr}V.QWqnM!:5Ջ2G(VRD Oya?N8Kr3:w ^ (( (AATvizKAoR %B(H[~|$3E ,D"LV %+oHl -ͳ_01 ¾G>"]6 Ie!3Q8ϴE>Nց$C^JӢXȐ"ΞWȿaI oP_! -,H^}F[5Ú{> dJg/abCTٞ5~ނ }tg.R]$"Ht)ATAAc@-v-i*WUZ4 ; . "d{3{aMq6=dvI6Aׁjrz`~rĔAG6>YejtOK1%dz+d}ne) w4P\.ha!X2 7b\ GIM {$Z}K-,4E7 -`Mg$&h-$t~<jo3B_H9iag3cA.o%W7C3e)Á. /DQ&)>K%*da^&>H v~i#g/.^ 08)TotX[x2Rt%F󑫲i -[!ζ!"pKRa2xja$& Ƿ- wLu:1eU2_?; ~1gA1E&3qtȖTa߂ѥI Q:WCӥM'#r۠*6,2#;]Y$Z7䅡=z]8z1S"S[. uՕ"nv$N/ę$}z-l ȳ57t-@rKax=dH B'"O{Jt1pXwhPu3,;EItЭ#˜NetM"Av?y.AhK-"D{GCfq{ߘ.$JPl^K)Ed6VX*VJʜ"a!$[gb,n0qSG aNEWCtʅ !.G:'E `QLS c[~2Hl2YCQ" oR.D  AD}H 4El=$A1&/DG']@-bb\S3*zEt&MQ$[]Ԙ"CBD- l"CB)\U<vU,@qʥ:%$rYۑ;[*iΘ'ՀD, ІA# 8;PIlHȞl"ScD3*>M3je[;tu2R e8] 2DNsZbI1Dpm~,l桘/#ѝ̏ĉD-hƺ!KtLFsI;rzd#jYRBB>bլyE;ߒ׼n`ndAb2(Sr2"۹*[)uCE#HH]؜m7ϽzE!j+")V$G2"z?̔ Żu2`oyw9oHkUQ|8 F~l6F-"o7XO)fps -MVdPhVROxR!7"g6;1(+’9*S1s ~++02h,kgK/Q -}\cGvR}>%L¾3&w( -JK6ȥҚ bH %lj٢:HKOdrdXH'],2`3ȑkĻt%,.%jNM;NW(^hɟF,~L rbx!p:!34Z;Ϳo3+؁VX(%i3eUߤet,TCw܅7aD&~;aq9'W9{81-r;} --Roؙ%,>p,/=NJ޻&/ldl g?tr`?-RN.] ߈dk"'\K12{il^7hUl_aїL59aӒm#B5M:vv0#lHEoc^ux`؂1Q /_|-m\ ?5r2QUG2sI9fU)SiH=]e}/z0$ 6C >6Jd|Qr)sqEvsA<6* :Sa(Ipn9򰻼M27Oϡ5IzsO*=D-3&tmqwd7"&@xiq"3EQZ܉I/jV2YKI&lmYTN'Cz&It=/DjmOz[UKBAdl7 it`H95o-V#$A[0t6\F ^N>ot'鶭%I'WotZ&2I$rI&I'\tM&RuN4rI5ˤI$ugUvuM=zmkoRtI4D2H:I'ҹD'Z$]=ȡ't!&tr}&M/tM3F$.H{Ej=SMfRMͨOt!!tg5I5-R uΙfL5fRNI4Ή$I:gВI6$H$bFac вegaapBɔLw[&ӜuelD3\%\o[Գdk:'Re>} Wb}+I$霒I5I$nOI6.I:dbk:/2I4IF$$Y$Rɬ+b}*O:$I$^Q*I2I$ܒ`li$I$\{$L$h&ԚX&7I$Mɬk'.MfHg[d蝩4mVI,EWaRI¤I$K&J: dԖ@N:I&Vɤ/I:-Y$ږ$n(M$Vi4I$^J[ՒYVK.I$HI$&ēIF*$n*HДNܒI'Zy!Du&J5LI4I& j4L$lH˾G"E#Xe"Z) oqV] $3 b9e aͅr]e"i'% Й424Ii4I$lkaK=$lI551p6bM- h.K$ڳG$\4'm"ueI&$HԗQ2挡o'C6^9'[zHZ|gpȚ[~e:6WCd cgD nDXqIDXHlK䕥YВk#6$osMU$L* hI$F Ҷ,MdMA:$k,,\n&Y>uԐ"`RIDd')Ӳ'#ۮ6Fzw(_u;I4*$d8qTsav&QXG?[l_~mb]5RIto0{#e3C$d$urW=75C2IҚCLEKH@=d(خ$I$\lH$D0OZo~$ hjٮ&r*>e)Gc{H-C)> IJD]UtT,¾R+W6cst;56aH-s@nӓmO=; wOcq u2Y"S&ek}S'?[Xwv,GM&Od5G`C&}'IhA)DW-EЃ -1@IձQF,H\VSah$W0U2I&Ղ*Eő氨LRjM2$Φٰڑ4ȩe $wE,MlXM$dRK$K"֫}l6M8$W-$" RKAbj=2^"SAb-PEjI/IDщF-GK"DJ:QaΎ+rM$fMe\80mW: }˛QOb.Eh\IܙbP%@I$M/4;R;Ѿ :M*C{FzЩaIA})*!V,Z -wbrcJm遝!Ahg4ڏet^DjtDQޓIeI5GUGlFSzt,q4Ax"綷j"dIBb,7ijI$iU$oZzlMv#VēIިD_c$2\l|4lp`G n\՚n\Pz^\z`=p"Y: APS rcG'R .F'm3Y.7Y3z N2bQRIЇR$LLH#Cu&LR`4܂S˴$Ήd!HKbHdf=^RI$V!Xa@ciZGXa钱j[h)$z&ȝ&k#92+ Η LYj^SL]&4LƈI:i$ز҇It"m r+N;9,̫͆{&,=8''_I2JNQVfմ`$=Kan"O]\ޒIY44I'L4izvM=ƦJbir)&.M$'d'E5"ly/-Jr0[,HD_A6Ē) ԡ#/o5|#.hb:d.6M`mh~dЖ$O^4J&a@6:nnIr@(6$Ni6ݍ5v$M.KDwobDLw:3Qj[\5gIM$lDKh0I:$P(؉z7bx$vͩ8DI7 ر,=|lVїQ*mMܚI%؄_8~;xިXrhDZ-o$w$ Ym%Kaܐ= Fڕ$oJ%Q=I&uڙɢDi:$<EjMoTɱ# \4ړFJG3[G&i"w ȫigc 9P$Y:Ex4tYLf&~xo#IDv-0w}4$4ǂwњ7ҳH&Iu#>irKR0&*M QlbH82ve湬&H$BO%Kyp\)d~e8A_ˑ/ ՑX|WɰV8[C 6s,yw&LnB| >6NRAa.sd&Pܺ&`hjګНpE/dBmfI,t49zRI4LUh؂3 ŸIŴ %6/8g60#neS|Hm4:QGKRHڝ&¢zت+As5fcѵ`}&F&<4$2v `BGq[}n_űGȉ.7c 66/4YM鴄YiIԿrKfL3Z&"b -UA䝹wB;ƍ$6{+j/A}>\gH!ݿ߫ ≝9 =X -J`et6Rz+' J>ˏ-.)1/{vS*p dBm4挞IJfE&&:RKވtrM"2L"V ]˄r2WeG,1\8?ѽQ"*7(Il14`L\vD7^O4;sڍľH1C.dR"?龉t%"FԷ=4'I)7}NYcBս%M&5z:FO4QI:UTIJ4mIЉ/!Y$Hxtzs=9.$Ws7ڲZ=K$Ot=8R^WЁ Zب1H"2o[YNЙ:fI+tf1hdN'i !mIbIBevՃ6[6GFd%"U#%G`٤sNkp7# -W-|ꞄBԶ h./I2")Dݍu7w;1ܱX ΘC3S#dxtIY]ˤ -$˹ZCj(\7X;;DUk ,H/2e7l,'kIyRo:gƺr7%.ΩVn82hO lryd͙1(%ȸKDnh!FIҴ.$ɬ7jF|&L.2(4g]j'\س}MN룵:5;E܂Hy>uCh%*B?gATd%D)RQ?Ap7Y`QF8!'f}e1i$A-Ei>tNVIF-M ,QD՛"bIMCw%0yZ|QH|7b~ ?8< .`YjAb)K@˝nXFo~Q֎lZuhoM\d{/Kp^]"Xu~}р$hE1H!F1")&`UL%TZ)&LA= {mm: 6 W+(< [n &l9hBWb+dLg)Wpd8Smig4dvBܖ0,0L}Y_"WJkz xk߁Dp+X>w~֧)nXoĚ:4Adz[(hzjo"DIՋQBڲ6"Dzӵ+6B`e(7h  V,h-5V^P ۿX턽dix+{ > =9Ii; Q]ɍF37"o[s}Q|[`{M$Ev]aPý6&/#vN/!nzRo|C|*F4oI,n\DhbDC|μ=# -6D]3J.W%Rf{-K1q)NB/Yh].L^.sa~؄=!4O{06bZ@KIpnDlWU&/ij3zbi؁SXOrKMEYoEV7Q2Dv ֩>ޛԚ2dBHF迩jMb걢 t7#dzέƨVtX\!imEG_$蛓%:K%XtnFVC,LVa9,;smζ=+֟^=yrf2+gdP8:N:HҲЇ_?'2_ hn]."AY V2}'pΝx۹ڰr`^cl fpl; ;2~D?qb׃q7(m'LOj"tJz&"T5\pA;JeGLJ$~Nk3;Isژlu(i;z 5+dI;A{rE37[D{6]b"-tKL"P-L$>%fCM F^aEYzuoG'D5ڨz=ς5@!iM˓1Vf>1qT7Cԕ'\c G=IdYZVi!DҒ]6ir=y?[M""- hbY:TH" -ѷ}nI~=U&\g+',nI#NURl@~6JKmֈ'P#qhI'W2ɵ2L?Úh\̊ƃ_#L3W[c:8bF67ZM4Q-j7'ÖˤʒIK;HW]TӘi,-MՊcDR9U^"]$Vd$)qOㄚ %fKI*2C +nRggH#U0 gAt Sr=rLl~K&Zd)בdlnRp?eɄٕ>u/.׌aUNz0joeZr}9곒ʆcwސOt6.bv\"1 @KؙPH= X˻g=') @iQm > YWʱBMGZ3W]S L+!.KJ*fF-z_27Ix'S$>"H93D9#\ؿm$B 4[Ѝ)zR芙5VɬsFhMX,n{4H/KOoN)iV6䌒ΫVH%[Ҩ^ړ#M!;W~~W&lG1t3}ߺx!IpO#~Az/uV8}SSy?{!,~3:vG}g7v?S3'qq?nsiR%~~7顳GVy),՞Z>9<翺;;ї{]cO~DUTi"rѰdC'Sٙ݇}w!a(^/CbsT4R|>/~N><>x%u޵QIhɘ}}B̏OҾ՞PYC 4^}Fw/y?wJ{~'<~=:yϽ*OZgozR;cRh?]7~>I˱ܟYϸwz7a}_/QhG/=՞K?iϲc_ycLǀp1|п+I?`pj(O.\_ى='a}]GWB 5cQ\#IvP?OߙȉP˖#L!V^ro 'Mp~Y>yb<gpy'r~NUE8N˱>R,A RzIm3izt>ȥ_LX>;Nlaޏdq#hYb<#W;ڂO!wvf{z~5XBؔGf}4p=X<_Oq%0?s*a~ۧaNfr<%< 3_E%|'/>Pg<Ʀ^!zsWhFz(/ЌCQL; eE<7ًQBrxi ,xA?n -5ɏZ? -i&)7x$x44wޛ!o=SZ.iVa^3ub`c>XO9*I儕tpi"yꖓ#CXːFQSUڭJ Hz tUTP1zcZcVZyW#'x#<Oxa*OW"|QOeQOd0Y}HX M!2O~nDҝ<.36r_Ƶ'΢Di^ODWyj%?7CWYXG;ħtG9eLy?<\ ?hJӇo~~]?9 Uѯǔ\ZNa%YT$tG]!Ág?+W<翣}[JF <"nU'z+DhoT=F~y>*#_^% (p O<ԤTLO?V"|j\O[Яo};Ţ.fB&ݢ?{ϟԳHn~hX;?3KLS,QO՟*>=C~'? ~$vL& G ?"</xB#T V4" Ljc (@1|+NMC%WA<<ٙcV{?)$d}ģtG9B<ú<E?WE>+'rd+l~δy?SK_\0CbZcp3yry=47!>ጆ0ˆmRh솴|(yG4!ƗB?ڈC$QW'>O#AM/(?F"|?{ht|L~|_ٽCFFi^O}tGOi~&GRG?K8Oܟ3Z= -_۫W*FՐseH2?'F~'ϱ߱Ж/\0ngn Rt$Cd[ݾ?3?NC210bH}JOЇ~'pNtv<:r!=G~':%Kݳ#͐grmf/7|dPͰ~>ə>$xc*3Z-~$<6W۠'<7]$4~KhgHr}}3ch{ɽ^>ӹabi:-'F~jtEAuu3?Wcb?wJbE.D?ɑ>O៣'œW -?Q~)H΂_,yO~$zk-?<}ϣ6?SnyCd~δy;~._3sƞO'7w-<\>b*; FP1?"x#OyH25+!gNsFNOs%L. dId`ݝ -c=kXM6J^-FibD&Z=,{z1YYsrz2;4?WCZt`c;7Oi||RZP>i?&%gI<<3찾$G!FbDj p4Y/#jirb!ݖ 8AQTHqVXCr-,I$!]pY%w3t9$G0Z>N i;a@],, -∔,@aj7pXܿ)LkoNʞWaa(ii7k: |C ($B7`%X;7 MU͙ p^p5anb Oa`HrŅّ~¦젂J{3G#K]v 6Y]BY/ޔ.<~p#Oﲃ C ǑT-<ߑdRKӞ ,.ow jʒ8Ӡ*'7R&# -nuޛjZW $Q+TV qHj2Mh&$/]͈ؒӄjO'xDsF$ȡ$: a -h-*CC;%LS$mvz]$鶝еǡeGZcu&ftIIhڈHtqI-hpގtU[SF^#C/]>ǬN cckJ>i:!'Z:{Rk4hlE[%WRUk LI& 1dRNW6Mp#ru*GNǢ(9tI5KXtN;z Ӌ`aiMҧ>ivtH.=M]=ǢsJcC8h7'74IӸՋKOrL6"D1ri6ԒGzҶj?Q3AoU>Z^ ս1iqî"媙C`OÓ8z=rdp&ԑ4Ѭt&"6#6 ,L -ֹ\=3}Y_њN,1+S:_s+qMpȠc3Ɏf佄,!_1L, G;]yEAv;@Ʀ,!mA,&v9voA^j-'@(ٻ}dؚ"v[=i`^+Mg֝Z/j/Hj$M&C$:n%1֧؂zIܥ{jNp~Q,w@~ M̄`#G'z _! ffH$ٞd-lte$^9"6blvi } h囄ɘQ"86߻ZmrlMdP*ū:fsNj"JF;wO |1~'[|D4tD6uZ> #rg} _?̳]gg~`m>Y(;{1qYuB.b06BY^*EAFf՚_D]* Rckc:ش6?FI'NKv7URxx\3K"sobQ% i##.BJ-:= -2ͲGWsm}_:ct.kߢ?somKG6rn5 Cb1jN:G nIo{ m P.hI7Idx8&u蚷*/MaB>X$޹/E"5'!ͷ/jHv"t4$CӠ!+B,p/"\o"E"i)$۰FgDH6e,5$*hMCC= ?^Bdu=E߉߰iȖԿ$/Bڗ]/q qmjOFHMS:Y&޲nXj&kxi4z&y^mbȇt g,B:蘟o\؋VX/]#ozcC)A(BP"QS~t*7ITj9FFp7z,((*^W {Qi:],ZTI'TջןmDEj֒krIdjNk"ǤMTLzZ:&ӍR:v@Ѻ,M$Iزj2G"$SzM'Bu<32E:&gCz&^UrF#c$$67ϣ5DLtI%$i7W֓+ҟSjGväjmt6Ork:UMU1tؒI$"I^QzQm 4UE]z$Ebl"zfԒLdbIH߭:rRiUVF&oB׽W"ъEbAZz&M$=1M$Gh$E -I:j#З-4Fk:4(SR]duZ:1*A࡭)i-cJ^RlNH:&YzhdDmTM$%صS kW$QjoB+ԑGDR+E:]6ю}RdHة5lVm +YzLiZo4UގNzzDkR) t!RQi[EY-.幤Īs#+JҵlM7蘬gւGiTZ`~ӹ-T1H(ΐFDŐ+% 8K\3->0M"GJQky JKJ2xbffv@\&J!iAn{OԟbTHi+5Uw <77jA&N*=SjQ&C7@A2+)ːAG l$ 6pƨ9vH#N(4c?oJϺFYtcs\4o&a:OuVV+lI/`" -bjScBn¦ܵ$$"T(DRHVEz0:*ЍwI&ƄnA -3$/M)~̍h%g]Cڳ\%ȐP65a>KMw=nw,} ˼50"ӟP7Npǎ~(K@Cb5.WQjm3Bٟ,ZNXb6đ~#̺=п1iCDhX*΢SH$oҗ4Ƭ<+cjǚ?>MHډզo ȅb,Lr؉ࣜ1w8Qc" J4@HP !+4ƜiUYhZ`#C\EԘ vhAA;)AR"@޽T5GI MhDX0 di1HVHrV5Ecf2/, ^VO',emBrM̶ji0 չn!%0bоDNY2l33j$YD{rM -v>lFx1r\/2rA/AQ A"XAH- H؁%[#ҁ#Qau/C9--d&bo0;-e鈾ɒ=#,{Ռc~d-lwa&v$e-u؆[&d$2OqhJαH "؂ ܢ$Gq7hr8+C% Dd29MI]:ū[9֩}jcsa`?ftǐ`<Fj&%E6RYqȁzZ #fCo #6EnnB~| 66Tځeɀ mT'mV?Z%QIm#|KcRFq&JBYX5k)097Q\6Cd_LIˌ,], R? udGHƷV--Q^hz~3ݩBxx{︩ |I]EOLK\ ;" ; dy?G ޖuS :Cս -2Ņ e~ {8~ftH?z/t$:F^GwZh}繍 ֫dVn,zY'Kz'ax&io+r6BJx<_K> ge"%!e"29( SSEnw}-%xL,p-E1 FxE"Zr~G'?av3'?KH(dĉP,H83qGљ8?x{N磆#g_/ڵc:gf!K_ˊz;VtsEt剓[kZbzMKė*oRa$!F$KА qCa j7{}>/GIwỹ$!Sܸ#"%sk:ȵ&(I,VĒI!G_#cF߱&2M Ii):r|x-+Be#.b:L؆)h?JϪH޼j΋zK\\jHE CKR4-2苓39r{z[|]Z$ w-%msgpJ.[^I{ {1H':2@i?n./g΁&8`tؗoúˣvj'ș4B&U;RXȚMNXٮ"PR/a/QCREYL12L[hiixtTQe [R --{& - WwD"Ir` K>IJBp\C9dG#R+\;PjI>}Ѻ/A\r0%MdgR|n\]p68HE(0 - J' -ܗH^Y܌:BIIt !ұfw6R1kx'i#K K~REr+[)E0C\Jqʤ~@@f&K]>t~үs:!P8_#Dz B \ӵY&v$lM&-TZ'T QN!̄rIxmt ݮIo0!n6X59%W 3/E^_H']Ge6; ?wzClAMGQQӚ5%$caH(Z67ܒο肜*dU5<Py%3.ςx""#[8Ӕ$C_hH&P.6ҽ$/hUWUĴ"|dK| J )!S}OZ7kxaq;Vq./4& QaOw^dzͱXM~+O{aãBKsd%Rd/B#KbDKbn,Z+xybGU=Ep~2Lj`ã"9D? Xt j:n:[ri5t:^NܝOV,7~ '(X_:{~?&9dy'ya8ّl&U䌸\H̼O"GR?a+ĥ!r~~ꌱ˦:n~΃~]MBW%h]$sŎ }wcn*L[ !b -B3~۽O>fO0~Y#_'5cXEF{ѱztZ?Uw_q=H.g@l8ѱKBƽ:mK·!RWK1L4D']GIϏy72D%RZ,^ɲ{ȋtJWE$"r^AL{- ;E?^Gr؏&f# .}5̾7o}XM˿tM2aWHnC;)`n'w9?rg-jN`47j'䳉QZjq]ãaXG?J%ii/fsW)&ā-dyoBнh&\ M \VSN2;^ }X)}v%;+t0;y?b︂d BwaƧ!52+ -N 2KvZMlm9;a_\ȟ5lM[3hcIH -JP#4toB(IDhX4 ( X{1>Z -i $Ei,°IBQBQ$,16ZuǓ?~,ǀaI뒫F 4\9)z#&Vij;Ts. pjCD8Ff%PEwC(%; Kc&T 0X(- J#zd (T25{@,zWң/ŐE`1~0;Q붶.lr")uED#LUBūoMzJFhSK2[y4".d|yNJlo%h*BmrI>Z`zlnsTH7CVEi}YÚ@SZ[HGD В&5޳ JѸ/Ǭԉ F14lzdءFr<)3MռA#}$R#`{~mv.dBZa7V+rܺ#w+s?p@nR] bBBTF= :n{O5($k3 ֩j< X>wImmؚldϱb|\\'qӏƆv\0; ݣ4Ԛbs)6(!O `$od,ݐɷsN "lބF 2q>鯄XKCf<*\KjXC Y&QCh∎Vx$1=퇵^`X<Hޯr`Ȫ`Do3-GEH DQhڍ GD.eUhT>g).F/~Gi}{Gw_j*%beDԱl.n㤱)^7ȇ՛1XoGjs{Qg'+H_JBb"H-cPvg~k\w,V/JG@ ?v!S)/L-ZVt!qr(= -te:=*]3oؗa6Qsb:߹ 瀣k &Ձ}l75b+%4RLjYsm`y 5 ,j{/=wGpq?O1̽7ܙܤfTI-R)*z#O_#dΓWKe)3oǁѵݿb]"۔2Km.ZA]ޗ塘 .kX#f?aXTF"U%QT;CIM9<$K} b|0~3}ǻ_ x,sxO:?'ā$gAU^X}>ҿ; @~qwZ9~r#3y˂F'ɤ_3 y$f$I$I56 Mݹvd熡sGN %Di= F{C7! p{EXoCzhi&ޓǮjX?#kq\x}x 뜣mm -?%Z ϓITu|R~D!ϒ$ĮF{4(:~kI9=Č:C]ۤЙUǫpܓ_$L:xQ.Cs;wm Bm̉ TVB b=TiG:$tUVup=qT-ޱ.H07A#=AQDX|EN|[rYFrF2u!#~ Š1!" 5:b%=jt itB&E R=DF)T- ŒXq#e$FG%T w9b/IܻYpjFLRtAdqb3"Qi`QR݅gEXToZi0$4$@O};zPA2U-/B ȕE [rQ3ˎ4HW׳8WvE#0nMa׶_cчO6Fmu.p8Krȸh;o0zūzES&Tu=/7Q=hfGic*Czw4B)m3I7B Wq\>} mXS0'p&.4vj 'IF/Ԍ/ۡ&OK7%XW-$60ЄTcҢ7ܴ)`66pD_A, ~2$aJߡjBQ,Ḳa.:mձ#S#dcW2DĮSِf@ǻ_%vל1{ 3Χ&F3GQ滍MjDQ [$g~~'!1XX8G$HQe\G>3$% l[T[g1nqw[]VH--&q a$^7"D$߇FՓwSN{wGb8ZI2d=&Y]i ;J+ -9'俔vG]97'ܱO9#e0|yľ^|(VJoJ6ֻFQqhoFXI~7balm= xs{! ӈPb,%.H& ?,Kr:\]owe\Uɶ8Oq(o7dC1-_A$ۨB{ ?ӏp$7{dFS!tvH[#-Г.ya'?'Sm ȇFbw}ɄNJGQ֓zB&hqO\εD4!Xk'OqIuE ˶՗9"3yQ65ÅZj"rDD,r7+0S"ubۂHLsR@-K<\O\o=1fY#x@czAn'`[; <: -<MkfKu܏bk=SM:M"MϦ}i"WD" "XG} JІ@IJ3g`YD)_gcH0 --/n\7nb1*$2eȻ?xeqIM(~GEo/Wys - -@CCP$]2$`bSSȑ$غD 6$a2S1LM? +fI)ǭQ21-HX8zytC9_aKm7ʙD^q^u7f%x -ws'pEg:MPN|M~%. ~yƉf]du:3%Sy$Х1%UÀލ4߰H6z_DV.;tzkluCƆ}$sԈ'2F9&B p{ _B|6ɧ+ +|::!˼(FZ&Hy"r,:"P^F ,b?32lJW>ahvN{ǡ[4z,Mui0(Кu /}X!$adP0i-tV1")( BZxR_iԃ%[cx 7jYq!'%@GݓUWDfZftZF< $JM'K9P"Vд"U$#'z6#6"~ٷjPFH?UQךN"\׍l~:z xODэ:UWj"hnDҴ Vb xL8ܻd -WTKǠkmcw7[ؓS}FQ@dbf(79עFt?w!j2A0"cZКEy]R&0fʓ:CC5ͲSuVŚ'E -6m ڍՕzubґjDEWEN/ؘ:ͼboPCaϻi&G[盯ьCNA%^G]F[-tܲϕ!#:-(Fb/X]d~zc=7m7/F=-Sθԕ]vpM<ϱ'6&_6DCR3;>I'H/Gy_a%0V $}1> Y'CҰ,W8W]/OC&Djo4I:UǧmTi}A\C.[I kO#3u1K7C:/`GiGGgKe -&tΈ=eE#F_HhtEW7F붉"{aJn>*>?$}dOhNSytG"b81e|m -juwԄ*} ~ ZWaA*hI3ފcSp)3b߉dıoǙ2ya\;:|`[9t䇁fa=/#O([OTd4Ԏgz -advFڰ=PAX -薔E;QiF#K$dt1 I ?PD|8%bm/bL $.>.A%*,zґbi)ZFM5z6>'RߥR( y 5MU^9Ђ4=@ ^= TV=c/4NƎu[Љu:u A1I۴t{ nwn"lpdk@d "wbH+tYxewxDžics($xćQE6gc[u2{Tfl-joI'D\TV8+Zlt~ܾ#tad$L]/Hd[Hp/a^6osȮtͯ0")!wk^ohdmw/g&{!n7 Xs"<{r&{Q.6r<2kX]^jJ޼.Nc:[VoT"=-LCMP$$||0(׌_#n}:n#!uIl*K'SV$!kgnb_v;'awiuFA|lFR#CLA[т3H붋I:Vi#> ZmWfF'LW \UHJr)rs;.GCDЖBCByvj>@)??Mm#(VNwۛ>˗(rHbl[Rmٶ;xJ~E^)JM$ZN'R ǭoV(VgR,{ ]ΙzcyM my3ÎOP¹F@R=L'{mv":r/w Kx,61?> 2gvH%Wҿga-? ڈX>*lbDtz6%5,'KĨiz$'C[ѹbh3HRP>I>rOVw7! sS/ v: e ݼ>[ˠwsZG5n%ѹ P䕾pX"=K i%tMDUja Tq@FM'[:`3ȑAA-,hHhCSSU -a/Us-4[%RzBu:IFɊM'WvGLz*KaH!9Bu6/0`KD06uI.)f7l!A[ȝԮ{uAz:n?fZޜ'GM̞d\z/Klm -(o !m+A'$/Iqa 7xbvc-I+et>]s˭͆,),nBU'4sY((RJXxb\ ӣm?t^mC`NfBڨLe2&NsWԳ6.L.Dq`WOOTs>fO~o.P_O?F~O# [ ߰^tGya| IqO+6#EA{_&L?;.ԸVz׬X1M3EzCIF:EE|SߡzIW,6ґogHC]3t=A<'$쾅0Zt- IvL.ٖ&Y Ec>vp)nX,OBھ/3-rxt~BdRAG/#~&tRIb~{n{ݝFAcE1lBBB"f[@-'^p~M ޲Ļ ۰Kgw>ǔ<89I(r dP>1r&L?̃MOKSg Lq5m*:{䋷#]{} A:uEnK!~X?SʟF%݆O7ljZO ~$!S8,Q[u܋7+'EtJv4l~ّs'cFELA!$BR#=8sNcbޕ%کm%"G-2|ȳ%Ņ>px2+M6 dE#8PO;GZf*myy )ྙzg{!I-h -nO2rBd~.'ߦZ(8#bI{wEg'TY{rE[DCč |7|@.DDGB6GCSgUks¼v_Ǥ붇GHͽ'F5~x'vIaљG7nJ9"ȂVݕLk/B2dŭ똸H% (e-EČiNEBP$?qe66d PZFSWBH thRЈ*9b- -ޔ Tzu~=;\UHHVGr)H솄QVX HBT;hz`;e3),r̶=@r3lz&> SLU~ՕT&EðՔR$2!%I!g%eaNC*,QHSwފuO)Md%'OmH&FZ_F?b$_: *jgaކ@e;S9)}Swdq$Dd{LO 'ɚF?',d,[? (,_~D&I_˱=v1U-m\o ϋOКk?ΉՄixJ+5C9qpDXZm1LA^s$! -x|y1YߤC%|!ϥÜg{DlVq[px4b朱s`=K5/2wC|d{)|h4,[n{hy Nw۰߽l67_31"M>oه,4ѵ"<]Oai$]K#*[0qOq4 -EM2++Ac4ͥn9{c^|? l坓(_ %6*$6swb1=Mf鹑#$tEUZ?CAӗx= N3o LW?Q`_GD$L,e:)E- ED\ϑokkl f_<(7rO&_J_8DecC'c>k݃ @iN!Toy~ hJA+2z T~{n_`LPNo/)b >'bIh`4ԱL-[zVN7[UVX& 9o.㋮GWd\u݉2p\D(b,@_#2Ą; 7q$Ґ*H+mcX -;[ -ܸ -†c;r:Rmw'F&Jhko6 -e x?$nh|,9z`B9ɈXm-rw%b]IE`YI[JF{Ib;# vf/ގDػ]d8knaT&Obà?$] 1~؂Lc l"ܒr< -# -6b,GɌ9MX~KgMG!$|6FX6H#ڛޛkM:n1Hht6^H = -cWQ[(O+ Bp:e+D%JB$21B:(]A)wfMn?[VTԛ*54EE Q!Pn%ZC#b HJA"(ƽEIoADMXɶ/B ff!IbQi*MTz&V)N=F;ht'TjM~Ѕ/C {{1l_Ȁ\:+TȦ@9863S/u|ź r/V r{96:!bN(l&%arI4. BhmrL6wtub5埅nbSMlI6ԋw&8%F+;ercW~op'cz #]\ -.,9؍T-¼ep$Xjzm+]"K$\qt3X N7F$6IРtp^1*,VIj.K<%#grI]Gf\6 ,󱲈~~py2<[S7 ~!m?;&B r)2#7o)#D'q;w4y6Aqbu#f"~ngE{LP큹 _cED8iI73(c0JOKQ<?;߭,KOzFwQؗk`K.S9OqMeWig܇[Q츗la~oژ~pGX7(~#Dgǫ5Ɔ&Df7cvPL o/!S2b zQ#ROzHfI/TM55l;*oy; ڍٮIvB[1=6d2L'DerKXPO陆~qW1ݸ$~)g6Rww R} &yY'@/B@I4tU/K-S˫ƴ#B׵1V"Ċ$F+*E͆2؂*;!BB d""0wRBDB"BCSR(P !D!]Ý=bI2#dԊF蛏.ZW#ZF=:VuzvЗꅣĴ.`Uz2DO4ҒhRnd&MiZ`z4պ?NimD7Kic1b-+NڣNڤ:ų$Ee4äzz*^-s-Z3M/ίa~4=&:EEΈ#Eص*Ɖ&- h$B2I4Z#RE4nז*I:'*$ЌjcQmDBD}Izj:*O4L2ԚƋF]$֏j/Et7nF^t?AQKԹ%5LtpJME!GcґKFtbu/ERif2hCхTbdDtR24mQM>%j2"Tb#\U [z&댰ؒI%ig -ȉcGjڈl$ToCfF[kϫ$M`5=TM$ sG (7HJItK8M'T^މ2Li6(HKU'Bd[ -I$C$nFYNj C"M/Y;i4DRNۛMR14 5Sm7i$k&h0+H)FWi"AO3LXa!7fS#$vLF?%oU/kBW t!] +xqq+!&s)@8d.9$\rCd6f|!4[J[pni܇?KGݧg?5DddnKJT:ʻ @ionQ?Hk/?&R9'D -[ICE)&O/zg@ e*!1AQaq @P`? @B(~b. R`us*"Dc:24\i;DSZ_[DTŇˎH c˲ \R4^cVXAjSUpX:K+Y38",R̜S%Wv^P %O3lJS;EKe9en#K/XK.ue]@Zʃgdd%x|s#n˄QDDE}5K.-b]t[ap.r5ȁ{bb">1u q/?xlr$O1i:ىK d݂2H>`. Ñ*Bl|.]WL FGK6KFF eڱhߌBXCdpZCbZT%(/Y#5/gR%2K.=1$3^[2Y5,|l+S(beɬYQ5\p] -_Ws) R;,3 n`TVXt؉<-"]C_-1:z thx2]ej;TcKKvC#ŗȾiW-M%B˩w.+LTN+4'YpvȋNGbA6kv} 9l6kK{,v5.<@XR@SM)ˇK<9)J+!plՖ \Q-%,{cU!b25ڶ.NZ‹Y{> GXGyPߋʁ^em]F|DI3kv .V -Z+̺`#oĽgbϸ -qKD Ip6s#<.^fe5/T3KGBJuN-*vGQk.^/_̲|FJYQ]zQsfe, -gb"me(RSd(Tش,W,b Wyu1Y%E-_Jd*rt(Q)3n څ,%gbе ۖa)!+pik^5jy,g]Tb=,TPۗe |\i9<˷/RQ[_s\@`6㩵S&x6D[mJ+2ET -*&(R[B,9,";6~:v=eă tKkeUBe& "gp - B94Aq Y*QyK0ˢeZA;>|M1!ٝy\ G'?Q䬘M:sbxE$Zr=#[טYF[/60J:r`B,)8(>f Y^ :UB*\-g \bnv? -#ZTU f6"-vup=UB.nY2 ܢ"e8"i0`P /tkȋkFd1AA,D̍]T+>7܏nYr1<$zYwJ -Bš_&`0T\9~3fCRc*c --kp*sN/=&ّDQ(ܾ˃{g.02PJۘIDgԮ(CG[ kf* +E_FO 2"8ƣq4 -mY"9S֥#vUDWƥ,I(1ܵȉ<%)c -VFl%N2% :K+eF9|4%| ][|Q>*J=ʧ; *2i"eξ-s`\E^\tK7#?SDLB@ s"f?)]Er*_n"o#Jj0?S9)`#q)nF9ExrY<d^[n[uPiaٲhȯYkQe[ rG&TȔn#("*A*8H'Vskvw-mhNӵp -BZ(PU^%ɫ J -au+!aq\ZCl.t.OrnUTf; g!: -xmO=TWbܵC82_9{cb"jB2e"PD.q|Ty؂۔e༟|d̋kp<~ 䥰<pHSJAr=f#w-7<'.-栱)RE̳'iKAQ qc8%UP& DܽX )H)?}SKk8 lDj%a.veBX†.ƣf_y:% ظc9Rߏsk."(fKlx*\M-Xn -{LJ*elǰe|Dˌ0 ѳn*k]e R l#dY9<ʷb -V#A(V.(dCOQUF1¬Z&oM<fbkD -yd$3ZL\Tqƀ/!V͋P4|7cw|KaT\^!6F -ge[+Q.(q;OWY6İ,1?oŊ05ly,eʠb*TF[ -J%遷}\TV݄v+`@Qs7ȵPbEBt# -`][Yñ8T@ԍR6`HT}'ʞFԽO rA@;i|]Jrje6"Q 6ضn"+X׹e&_.Ta-rFe 0bTr&x-rtC Q#E]A,-5؁LVP`VJzMK#]BU`/ER -6XuTTƘe]Mq "Ȧ[Ɩg?CKEI[p}+fUZπP949nC'a6"Yp؊bŧ&C*Fnug[~A癴^€rv)(eْY2g ->.V&T\uK c@gB('ht.4UF 6PaUO6kQVt.!j啋 ZJ%3q&c]>) El uj,9,sBV U$D cLzORX*)/!Q`gk%0Qeh@!UY˨\yk|%Z0[:୏*H\c)yTR\ jȠ[.C;K eJfDʕseB\v ۖ](Dc c^6X^K"*1S^3Fܼ%`WȫW3bj[ZeK"EbQj-SrSg7!+: @ lOQS&Pmv.UNJ1τD%? D̽I G. -UU+"o%Fi KUVͬlh*ڿqJ)8qPZۍ{ q |W+Rʼ Z9: -٫/.0^T<-Q- - -/`*(!l e4y*A|Je DS:MDDRS4"fn9 p4ȖmHۄP* .(ŀx!v,$C+6 .Un+2j|]Nbog&g/-.]gh%n,F:*Iu,\VT*"1nQ#"ݱǚoj>HAMr+zJƔ2UPu"| $Z[`D]W>+!30kZ`)ͺ\%'nԋ -k.>[ BIaݸ"v6V\#ggG*T< -8B, mʁڋl*(Dz>"l Yo>XPCu<3V0]Nv+6uJG'A AQ*%l<ī(BgL߹[ՆUwBD9ߊf@jTvQ@pKJo(`\u5 b{ >%Lj07~]hܺ+--KbN'8O51 >.%1@s.IgRv)g7ԯnReO uWʜ[ rz׈ llbN*1`A^*~[vDLE_"BxELOk,lE6,..CFZS}N1ωT85Żs -V> 2wu*>7aQ`F6\`T}5*-Ͻ@[.ޘE4SH6Op6Kmt^dEKv)3J {-:#`~^@2r 扈c7bբՁr 8>ʊ1րe#+Fa.ʕσyU-5fl-9Qsei-єuD@[,ioeJm[[/v}WA)nXE*KmyRSgTTZ%J}J28dȦN .M\KNv@ wi] ba;P+MX"2"ͺS'CJ`Ky >1K@ EvfdX+B`e&ޔn6\%bhsׯSm65x$M'z`&R_ T(c!j{vo=p1#XV"VQlض:@IFO=]J[3"s艐e۞I3r>3k%<.TJ+&ln7Zm K26A}ōp/x Z^i\ Vbꡈ,2}mʏ(ׄ@kKWeMjp´W'~'F yG2-Zl-eT>"w.)wpdu\pW]`PGL5iywp ޶Ť#g/y_q=dۢ_s :JM`D0?ہABF硎?owxsu96ZF+J>15.*~'g5(bql`ħ`Ok2adƮL9):U˙K')/x2Fn {PĔ/"P<Puw-ME~X?(YEeMa"q -.̶D87'eQ?aVũ¨AԮ,aw #U\bۀV%ʿV"C9D>sdxHU}tƭ|TZCn ?ޛwҘ%;TJh o(!@,\9JB Ơ[^jT}ܿ?2ؕC3e~KO2<*8W ն.}C c , -e2C9/j[q/.qOQ@@>.m\܏!n yvg\&Ԥ~Xcz*7*pGY oܦÐYQi#TE6?e}l2]y,$k6Yh.WYPGa)!x -a[["h^ H O*H9˚ήQsj]ŬTaB7R^5>7IJr-e :y+1S(բ ѱLR,=cPM -mʊC .rڛz_Pc*:G¾K۔R*-vRLUyةjW_̪ύ{+QduPp؏39 ~! -nމs)XA.Ψl UJ\ԯ&2cw?hdrpY)6_WlCp[Aflr cT|Uš!% -EܻڝgD2d -14AB ?(1t؟}2-vyOrF%P\#CVM`R -;8[7+rx)*6חZ.]-2 FV0=!,}y\gY*︈0 :bBBQ[Ь> =4cTּ~|4(}n+R1B FpʅJwTl3Ǟuʩ˛kLg~\SYrc')b "ʏI{ryC˨y>-Щ|bˁ8K!]M@DD%莜BlȶDU8"ű1|6 1rYp"p9nnbKg`M :GLo`J_$n86dWJPC)ĕy[kͨЎn&aY^ı)tU!غ=@JNڸybz`،f%z%c;b_w`2Wopaϴe-a5P[ܥŶv#b5CKs.[& a{^UTLy\Z{3>a[IeL\v~R,6v2A -XR!в_nd5AܬȚ!ߋ9=[ypm~ONŰia@}P1e}?+9יtYǩ9'n T.S< s%`Tkp@CUo/qe[T/|`zAqF\ )/AؿB-b쪸,&z_7k;lWUN[2^ |,%kFZ:F(96=O'b?iTUl߆JkHٞ"Z V0T<)q3gl"m<E]i*oKLLRWCv"9bhq<JAs[_ /8 - 7e11зxcPPژs)[EC'ξ՝kWy~w -bG>PԢm>-H<6Krްy㓬ķ?zocm ٗy8(1=_+֑ގG Qj -ۗ3~訁I˞" pa,ԽH{yv̈a`CRPo&%[ ar]X"p% C.רQ:>߆'e IizNcp1a-JC Ijpe@|E, VʁڢA%lT%Mkbk[#V+d)50iIqED#C"g(HQ|=lU -࠻Qi,nrsy23/̓?lǧ+~:nR56|ZKo2rpovF={BQ2d<"ih'y_:~ʨE>0rjHE;y fm&hr/VP^C}:6G!rbJKV1}:j jQlk1vgˉeZb-vՆ4x I_>u%Lx"_IdXU*}GP<|(vYO2,%|8ˎF{eƦL:<ѵԖi~QE,1`BaȽƢpNvwq5ŶM KC[15.n0˽l2EFNEm œ ~s/MX۪B -71y A3#~I8m[bagbW*:fѧ֥p #._Q͑XQE -mMNy!^'v-C- 6zZa B%|_\؈RS:Uy4Ej}lJEG̏>+"n\r<?0X n?D|3yc=2"#-`1gg]aU6]s,L;).Tޑv3`@j) -y@Zi|"ԕּPJLT1%:RAkeB pR[r]( -J״]Cq$v<#]ZW M 7~P?#S})F(jl4@kj^8j"eN}ukjf4)99<Ő -h+qEgJ'PoedbQ4KYQ6矆<ihyED2AP%TSp}&ur>+r61?ܙMUJ<ܦ70 -vYckE0_n+%.y';( LhmeN\īkczZ0Ǵ2>%tƣ)F-o -\zTxs7!},4-2NS|nZItL崾@'U[xmE|`vza\p!W Q16P2h~*3v y"ʉY@`~}ˎ*2|rŖmBJ.͙-;:b\Oǝb|" z'PYIV2lkY<_S%eȼe ,{a#p'(.tk3}OŔSߒӂ]O_iLtw<1 ,Yl@?%]W);yiʜ~XVKlH-#s"8-źO7aF9p͏Ubj0`Z]?Rq -,PڏX>*9!TyvQk+U܀B[SJU8vUTT{YL -$x 9RRƆJW%[45u.mX'L`63G RؚܳZ/tʡX}G + ݌X,iJ7wPK 88[&R#fZ)Śf4HO %AP98~\`m7~/0yA"DTH{'n1mQL\ˍ@ ښ6+eC0OR,;*LGa~ &KϿ_ŗw\vAPlEAvG, 3S&[clt%jb͈UʗͅT^F˃g*dԾcʍ#٘Gw-<@_7dC#~IdYڃ{t6б"ax* -7d[X ^.iVJ `B"4 -5fߴUCމ 0 -&:Tԥk \5uԥ̓rYY/K= Sm"73& gE '<͗pb_w/%2Ww.I,.e6 aBש,xgb.hL\RbʞKJ'(7Tt"c2^%`d|XvmP\A`#B$kĻ`Y_JR8[7⼐%0$2FDbĀJTVa\1T+S76e=˛qKAo}]%8/E~"*LS6i eYXmb? ʕ)">b|²<~ BZЂXŤ6DJİc>vT Hg=GP8, wN !dPW%1b>݅磢1S]Ԇ؍i>a5% -ĢG.cy"#k9BPfIkqO&.W: qnϘEܺV㇒qI>Gn`5WLg~&#k9ێv^n̔:Qw ~½Q -J>hlP>*=A/b`q݋K,PjQca -˝b+[gp&"1*J "/U/qj#ѩ[pgJF|+JmcrD_b֠X@+*Vφ ciGW|Yޘ>@DQ? Nx3qL_S~&_6vҋB7PH l6< !_l_'a䂂XKc's?|R/J}Fft.58Gp#bbr 7Q()@q#AN?CP~ --3[Uҿ^;eߗ JyWʏp[r;N'ꐖO2."kiwG+%kypKE<KTMz%򽟔Q{d#-h&fwjm7v>/n7_ -LVH.1W Ck ] KPA,5q/J <ԖRK텾 j;.Tk߽.6ye?ĄJ!"?hj{ȮNw)vꠠa!_ (Mߤ@RbN\|E7/&&%?qst?(xio2all61d׎_Q#l匒V"Iwkn [F% p < 6OܞzV;PA䥑yG] Wc2awTD.YM>+ YAN!.dKZK+gNUL JG$J#6p@W Xrֳta$\ @PU\Bޣn֬j_\tH-Rc次Ҁp}$@b.9("aP~~[y7q[t>=DK-c./V"uMʞXS!_3 YEߘu9y*؄j j+iJ5Q WvA ``zl:>G> S-U"WH -bcrədP7!F]tV[]%V[id牌v  guN %SғNdc+嗇*7 -y" apgJà#|t1aZ-hY;1 (KU\Y-Rʀ薆*QM Eڹg]h#l]MKCSi/vw];HK:5 "6F7u.$6HY.S"˃Q`6Xe0ZS-!o,W7#7< -SC -~p&Kٞ!eqy -SK;/Vs|"TJzٗ71xؕQ7j\Of]g+enJȊTcifr'hkJnm #B;Yq/Bj{:cmA_R 멣Hܚ )er+ҙbcFS[CPTrwh5Q>݊EZp^Ōh>\,2@[f9LKɺ%R+T.kSY P|$|kGUznġ6_܇rwʗkJ)@PAܚʂ'l}8 gj-F{ {~`ͰYQb%˞J>zEY[,'f*( ײÒW(A*dkEyˀJiQɨ ba-EZRD%E&, -Wyf%-Nx࿁b8L:5 Vƒ":_bB(͗mO_ܯPWŊD̜%2$_yuw?jWAXkfmh MMkDL7i g1?ێuk1C,.%L+o~.`2{^"\DYcwUX4aLlMj8(5Nc~eunxtFUKe? ?@ >)x4(%} n]VD JʫS8Jd `SY+R2b[ۈQ;WJfn\pZљ>c͔+*j[ˎl+}RGg>wwaV`ƍH \{пNBS}N̹ibȉ -#oS3TvԸ QSy_*C[>,/cϪ>ȫ?J,>D#@ {+jWPڰȱK+[/ʉL -ga%X:x#伲TqSQjuZ2x_#K `F oƤTǜ0qLm S !2ka$#KP%7ǘi`Uz8G/,i]}\ҫ kp eK2madA\ߋhKc!@JX0 -"B'Hzgi6B&au@frSF|l##0/։eEw)bI]%r?rبaUc .R;_3X%S,ged%.0QYv|:JΓY.f @Ð'$:AaQ؉KX1Dపe+2xO-Q2\W*%/P\dEmJ#WU-n˨Su(m - %#czA֪UlqK \>J՟z(/Ov^B*XCg'Dr+D\M(ﲖŸD"r C/ܱV8DQu!W%|Ti1 O-*=W&MX.RT|Ddtw@0(b|]ٮ-WCF0|O!ʀ*9:5(xns./ULVqRQ4a!~[r) (|@J%ʃT -ur΄<^& 97b] -V@=PrY0cU~+3 l_Ʒ'Ľ#`rdv#kd%٘qJ&\RmzG!Dx4N!:FVAv WENG-(+!]+ue~*ِ^O+)T|yiR4ax*>)5ȩ8JPߊM@Ig|\?$TlMy1X -q.V3¶_w!U|rXۈ.ArɐB^Lj9a] j,' 0IҲΥe4Qr*-50T|/ԞKQÑ N5p˹:Ans*ɲ|k.% tsaq6H(DO˶AVR[:K(?02QU0?=ьUPy+!?fW/ȩz|mƗ.ƊRݍeeBR!A\)s/%*r>+ a -Yo`(r)l.8*X1cn;,z]\Ĺu zv v,W(] -7܅{MKDU1R[[ yCeOF4 \->j)qv(Xu]qL^|oƁ._V,nOC-mʢ)sK 3J4*~E`V\)rRB@p<4@X7/D:n)t%jǡjxDcأGqV^IRTSb%/ hu!&~8ˍzԤhJԠFnuWABp -EF WPPT1:}3o NzYRHNv٧V>Wun)Bfa;H]C[HYKKVD6 ZgwVuR -J"+P٘˵V퍇Pa]N6i}Z&RG&\KPikqA*!SQ;* 8KY.THTĔ P@O|%@meN~Ro.GRB~BI}G^Bv}RhNr%A( 7e'v$I=:X)NnpQʎ2*pS]zBM؉WqQa*,[?Ranl_R!jA%|eKpKe -٥eزeZRݞm1߇=eAeB4).\fo2eŮlP`7lI0ښ?qQh-!^E!͚GeHexgiE^ ŝJT& /fE>&D_N- Uqp-qll_OzKqe[.-`"Ĩ~og) M˸{k.:c؝ʉr+KENp1їiLL[0'K@eZJ{|DZ -ƻ7lJt([iKA/S -`Q߅2M pr raSɓA;;.&J*Pe˔ve# -6Sf[o1gR@) .!Q[w˘mˀwY2UvEAR`j r.\ydY -|GWR{: qdՓ-rv$'az[5qr693u{ ݜl іE@g'< enMY+ZyWĸO0)dGZ!GIKC'Zsܭ;o˹̏e\TK3eԳ˽joY_\ڹ1QA擤)D -/bL[rt^J A[(Q.WeWg5-p/n)#.]PfffhU_s Ů1nEȐK'ܺςu|D9rꞰųx+ %r_œ: ŋDFW.ڞb7a`%`RˇxRR}ȐeQ۾& ..1nlBۿqfȭ5KGEkfLy_%J\O,I˂ B!j/[V{f|7U5㌥r{ڜ]K(7ZYS|~.v\5ݛlPie|bkK"laæVn a4\ZЍ_bZTЗcK1uJ.7y`uAEQy#u_ g -6?Lld T 7I;k)Z ǬE.I ^]W|!r/qVX vܨӉ&[h?#F%~*5 B0irejl; +kK;|TEf%hAۖ;:l,S{&L}KV -s,b'"ECJ֑Ε,J]Nr^Ɇ_$ Yw%5D|J./QYEK`Og@7`k"pulSv~eǷmRu:oDSpYc.f6T IuNLX\a *?sŜBXa7 -8*%LZr) LX:unT ,6"4e A'&r0JE"]T DOH L *UKڬ#q!F u=JwpVv*2˕_d^rǢL x!ڈb* lKQ"/>CbryڕaWU+BdUN!ZR bK QQl/S)SŽ8B9;O* }@EYzf%Adq+/jYQ"Ke Oı|ش\+X0L%NNwWq`K;) ՉQZ.%VRJe2Z$ڕQqVoEa(]BrC{.zfOE_7(rP*E|vyj)+e5vj-ʔ`epn"lByb,F<ώ4PdjظFusjt?P9:~"rRfvi6z!:쫻<_$SxȬ{NB -iZZ6ľ1 +cYC* ͈VWE Y2uD Kq֫܆T {H؂/72ݕn$Gd -z䕫V}!=/t % .^uHCUCDs -D?pW^l~#g?];UX'd&?IKyA}Īo#P=*zNSi/TMK\Uem,dIq[/)O\%׸,~hiPO0Y-!{ަ% 3b %RMa?F$_ښVFK;b ^цʼnɄ*nc>(L,ąVE{dyy2_s?@~/)ְ~h=Eb A֚4z%iD~${M]_A&Ef#^vp\* -pRhGK(g5V9bc%7p'24nLC~lAH]Ta,*~f \!#w!ط*ߍy>-UXr(JR?1niD:! i"Z P9"[+""ݩg ?p(˅+7G[ -yێ|*e0YLC3)dxZSː> `WG[ozց~T:) yPjfjW2Iژ WPaAW`;!pinVٗԂcpҡ4I( DѢhxC/=aFPpJȩtu`-J 켨6RDYs.5q'څ Mlhq]di:A{hPu:=VC.Z ]\;j (7g!ڕ1X>/&vX[O?xJbeTK@aʔ rZ\B-J^e /J\i?C_3߲;d7Xt2im,j;+;X5TSFYWi+D(Yel "wyR\rݚx*Ymu. |^",fKYrP9'f-kܯVܡcp*U׉I(bgedTxʪآU.Ǖ(0l;/efd):ƈqHKV#M:DZib7HK䩽wP)ȏP唪Wܢĺh!ҟ,4Գ-c0z\5f|ر Nz"XaE56WCrl~%u& vk1w^"UM'Pr+|;H/"|RT% '(QڍD}vX7[KyIG>S%*lTk~{`Xf -N&ҠV7 u Pc>(]" ڀ ]auT*"/YP+erǨ2,W*W]Go+~-l2ԗuw3z!0]/T380wJ5cc >*{#u"`ңd57t_l{P+n#nJ:H_]ܼj%E}6LiО@0+S֦QwojJFU MPUOrygQi|0 ͍"rJrO˰&\fe0yj!wP& 9rHn^L /¸o%*q7> 7,n&MsXńPEP^)*ӑP>|+?rD^go|mxP(Xp|)[Ȋzae°8Ҭ*Ws#mdy)ӧu~||iQ CXIcz(TB~1%Ց-g+0]jW֯ ks7;b2嵑_˕}ɨݞD52K/XϯXue|z` ٗ6Y])q/#eV 'mJF7*<"spK`5gXuŀbܫ+ar|uvz{f[˛Q7{֒a)Ժȹ4,Zfi%o;q -/g) [ɑd_cU|dL݄d# -x0tx?r5>RWaUB{aJSh)R~gENupuO BRاBrTgѧEV鱚0]#-W4o2]節mRÏ<߈gj2)~T[ga0-m1Qơ(=͉eJ3t@6xDvi/'rqPf\ Idy kPEdqW# -5ߋ%9Sv7);k{*ls>qה*mcfʕq^ -),,! -sjo(9%n婀yoUf^0?s0JWAy'cfo59S l~H~ R&?J$Ba˖EV|h\-NG5` ج!vKj씺ruQPipPr] |\\zF8#w/.d_>!A #Q<\SVx&Pćy-We܄Ci]6-[̕&ŝ;(dG\܁JA5C 0j=M ]*5rd@īp% =$֗_H|bKm|0EOY!ױ82 ,,qPB -W$Qjʲ Z9P5,s<9~k,۝!W 4H%eSYwpylj>wd҈#LTTZ(p\'16k>'?)d5n_S3v"[[ɩs%RP3a8r%ؿQ_;R4~JpW&*Re|=AY>UʁR@!߀yX- ]NgRR.-cw*c;c4ԑ67@_S-M'$O G=EWL`'iFϊh;Ռ1̧_Ak Gf`65s~huh6TÕW߃Ք^l*+,}\<^Ÿ -LO[Po"Ի8ߙ+xS*=b+CT;S 2)SOvػ<3ļezDQjBeTW,x͉p h>9SS,B>f9+'#e@gbǰ+R̽P,JQErZ9,XAˮJ_QEj-5m. +)%AhKXpU_{T[WIN*UDІnUTnd.K[K,R/Q/ hĶTol#3|g-Nas |WܕG ZADRЋsY5%F<ܺaϟ6 :xZܰ%-?~Ҳ r_W -y -*P@՗-L*>eQ0H( HyeTؕXñP[0yտt-1i -ګ R{;zFNj?QKjѐp%Ծ\T{X)&cynDЄeE]f۱"*\QA6@W[c2"m| e -~ e$$;-Y qTZ."jTBxϪ}RvYnE>/.㈏12n[l郋0XTb*A[%@ש} WmH\F5 j,ҕ:'<,ܶyJ0|&vUvxDwuJX+Qʩises~&'EK09 B6g#p|Lp.U7\6ESi?QUCAGh6W&`K[ 9qfdۨlp|%yړ_jgSc۔lǘD~>V_~@]3o &yqP(^^@%n8*,B ۿ8Tl#,/*0!A,&x@;fD7D_zԽRk)!^M$( )bjŴ.E -:; RsyH1uM"MLc4ֲ[if-yx_m7TԼTۄ-&T} "h\/?D߈Dtf?XtHXjR{%@+uXA_7ZlYۍ&AB:Z"!_)}D˥~Y ږUu搨*Yk4F࠴J0 n1Zh 8TSε67)mqn*iwn), ry@͉?oزeYBٺw6듄9D 2Rrtֱ|bq"2IK!E];>@7oc .f|d;k#PRV-]F>r# -᧷'l⮋ʁ%ŚI \gԣj!RʠvvʍʹTAj־Tn:K6b0}o5Ep"EWbKEF&%۷*ʊOf`˻Z`4.r!휞*#sZ\˶#rqQ$L[hL 7?M!V `5U x+PNK֌öhVU,(L U`4ƈ#RND7 SڂQtLBP-E}D),gڵ L۵K"~EJBv,\[HqQZr-%kìxc.yO #8P(,BXTg~Pwb~[9u* r}]AnM6ξ;[t̨Vm3Ql!ž+=vZyAQbL%SnrhvZKe LP".->U_@&A+̺řDvnǵ7#`^{na^+0hXQYQT-KO:(`h\ZT/Y)yoqRlhUDݘū!!ܽ)əkJeMqA!6jPTBq1r`2x!dYb{Ge , oXCjx[.%c''ۗ['fd[q_,&i%*)S*lYd(|CY-QԵ໰mGvfGJ\_oxT7*Y鋦Gˋ,*Wu-2cԼE#{/okd5WCy8#ID`Ʃ6vB-у,\UX0 -?pVay5b"ȹ6{VZUd-:v&2Sq_0 z~x쾓h$!# -rZ ˶]\<܉)Nd -᪔_y42W`3r!;pnnlaMȻW.vU2 [_Ĵ`&r(Nv!bE0 T`amK\+w%B:*rP>*/z{t]֢6J -5=1Փg{͐2ljE'Jz˓ʽluRTR|eEbuӭf]U11!iŢ -g| `GQZE'hQhM0q1%!#*.yٰԾШV1?URy~-];a9dgYrγ%NJBze_yGe#*bʿS-L*-uW,ggû+ Zj~H>($(Ũ\5n?m6yJ.Th,.Rų -YF5jbX'QOPD* -$yDӵD{4kxC6?[rȂ^pmbz_@=gJU3XmT.7>|1 -vZq: EP -`N6 ;m:gmZT Ft + -u(ę?#FUe\DW*`FesS{*.KyP`|#*=LBMZ}cTA\kouA?B9 -h CβSlr^ңQIHRJ %Ltu0vyr+rt0%!ر K]g݋Aթ\*7 n#_F7r˻Cn~݇VKYrJ E:sLk=3+dZY<x?2doˠJ~ -`_2R`K+v iYV,b/͂-sn(V~E*`:f[ܵEPy@`X!?R0%v/]P/bdG\_QI,</Lo*#L&O n-r[r^`U2D^Or"2A@jqr ucRaUELgTB!tVP̢4 5~N7fq„"qoUs|ݕ?ecvp&.k%5?=M6ee!ioP^? wo6 K8`G6Фb}#¡ዩH$LHzX_4mZdުu]6023JO Sw0?p:=*.ܽųHT2vxJnOnu@/Ř8^GKV-Ru[QRj י$/<\B@.`(j0ADxԾ*^c ^$;fLJf皉b%ݱ#a^%--rܵ>˓]???[~{K:w#;PaG -+ŀb"/z]䤫(pcIO 3q/C,N<My`oI? "G \o.+$DsrgZ "t2 -55jΦ 4` IXVZ#F9ˢdHR~ VAz@q.T;;jLJ %׉pd*v;~h;Dl/-IZBYt*8 k~ -F/|BC+KsC$>U 9)rS+nT5R=|ٹ-l> _ʞIa8ƣQsVUMK_/] z01(2ؽ -~/[=\ǒj0U(:ѹ@ȸ%<R[ņZNya>Y q/̍-U#I%*P< 5s~OV*+TÐ( B;,mܸ ^F/$DK^ceBNy :QRwhG,"*Be(6_ s$mK2PVĢ)sYe-{aˋip\Z.=T8K#\[XY wYU9*<%%c |J#]@_fع!o0!Ր -lF*&"<½Ij$ ^KՏz1c#QLK -Eϻ*ǃ̵Tpk]R3@wp-r -m- YT<$TNe0y˓^zQG ^` 1lJnKAZc*ڞfQ- %#[,:sYUj1Y4 -T2_BA:P.j%j(@DCI~嵴|*xX#p7u3A9 \35 -tlqbӗ텊й&܃e|9&a& -D(`G!\PUl\,Yⶾ2Ȳ/&_R}hHRYKac9z)u U -'c -~KJx&2[W^c⬆x {Q@8ܫgrY]?^%,ZU{QiLp Qu _im3"k2cUWJTf[+]#ˎԬ ,B"Ep 4CCG -,,)_nڋRhHĴ(M$V-vzB6IR{0e]|ι6j͟ Pbv/HzE0&VI R-?ضa-)v -1 ܘsS @IʩukMpPwDEq +? kV`d@/_Kh.W \El3n>o(Oūmpc w,i-e"_Bhfae0~>`4'˄[a"sLd,|Qw 8˽sYi"(^M2T.cL$"L -J2BO-aea.+Xu8ofy%D]luԩ˿؀+B[7lx("idk!^.q R`d%m_G^FNʛDzw w%bRamh.͟5ɩ8v\ۗ])J(S -IWU07)j!Q܎=f1KK; R `ODm%£z#ى4 W YiYP71UyǚYYGJݕ@,;Dn@a5l4eLSRW@x A*W}ƈml76L Jj-}NƎ@ѳv; Jf"C@@5ĖrY򍾋,{D-#d6Oҹ:DX aêINIٵ҄H§;rg-˫?P A7EZMP%*FhTS.iZxl$oΉqCF$V,|%ԡ =s=WiQe:$]} -"c@v]"EwMڤA`X0OłQ4K@pN\ed~ cTθAmGA!¥+vtFR13`+Q7P8塬 P"<M*ZmK X- ? LѥɃO%Ah95D.r帒)2Db -nmvcsOհih KEbHhߦQLw➙EM"E$kW/J -J.H0bO({H\hjU^ -(>4vG-xAn75RaR6KUC?e Sg(璟Inی)ՑBW4?>IaD42E -g7꿫kX@ӆ^^dWB1`ž6Tu į6EGۉh{,:D)mjV(QlXˢmph6\ XZʨJs_pQ +><ʫ0 v/EE#%YS}TX"?s_Hj6U J2f+ʞ&fQڀH[Ua\%4K>@ԥԴؒƂ7_Rb^nV`"UnC-:z>ȱ=5Ң݈hUT37eL3C,ph}Iɲ #fblK X{ ;P -]~a -\-j߈6[gZhļ+o8``C,{5"BGR w%=.vQ=ڹ pE*0KmQyW%]˗؋̖ļ|Pє=5(d8K+Yca~?%>VY."|Jr6U*(n]Pa3?B^S\Rī톙%`"&=ȤsAWB6eWV*+(>S]Af -N㉠[|Nw#Xl+y%q:¾0-9 D%`UFI?8~Iv:BViEt6°mO/I)x kT:Zxu7 aJ'Z5&%g[H V6^{/UY>r$7v*meJmEbC_gg:T W0=dx px8{e>OTVJRvϣ.ȹcw%dË 8r*PUDmpZj-<شu)m8"DbIdb`3`dhNCIXKp,4[UQ. [U?rO̟k 7k`T -:fYS +8,ʘF_#-l` r඾+`aE=1F*XrQϨwˢ$&EEA. - -طQNA;>>u|ԖDQɑnexq3.͎Kb&8ҳPCZ] ՋREpo_@H.iD$"!&\Y@PLjT-l", ˰W@>%DZjZmJYdQ{K`a{/{D3{̬#e#H+j$CS N5T/)7#臶-MK ^LhT8Ưc|a\kYW:u/W ،rU\ؖDyNV|ɦpķt - K Y~ jŢ[V[PU,W٬~%F!Gr#]ŎSR̃v6J BpJ\,_,Qȝå=h@`_'hmty.Jg^/%J*cPZ/z}L6yD/-r".(0F q}"3b (Z N> ኶n{ -t\/i%uy,.<7Z[Nh?UmyOʰgV IJ}O:i!p%-?ija^$ V -^ تVNDd4XNӿ MUiȡLUBVA?q<+dpAVrЙݧ*rѨ= MA^KUK+S(M,^%Yv"Vˎur!LԨS4B2d{ ڋXgV>-?6w,|SlkXR&t*5jR ~8zDeQJcpQAE%CSOld.6 -[6 شL6wn%yOL1urUEKIΌGI0JX|# kM]t#/=^ m>˖T -{nWTf[yq:jR{a)fK=(D,'c8 e-Xk2p HKfd!Q}&mA{MJQ%j1Ҋ ~a7*w$""iQyA,4ا9N8+ t4m?PaaU7l)VLb-/DPDq -kePOj^h?L^M+`nxzYy/'rM ?3Lpbhy2F -2͢Ӭ*E'޲R?5^bB9edBE2/ODfJDF|C¸@'AaU< v IטV^ެNTKJ!-5U-b۝EWAqTkRhpb_XMCl`G9JHx my*\U6]K.ls*XUŋ[/.`Qmy\\Ŷ#j_l#f[񐙥1=ޥצz0zQ5oWTJJEĠ=D%s -O!Z2 R&(VF#M}k2XRMAu)qnm'\[LT\e-*)<03Qa j[h>ؕVC_\d{IS.TzIF~z#2J oVr?}V#e -+ ڪ99w0<[ |/ԿS7CZjZCר2hY*+ʁG6S0]3-n82je"h%ihPı֪5+e#/f/p-1k O:a-\L|5*(0^k|L|S{7ǐ WwPod!i-s;pZe޽i9 4oa3t/[, i*5d?H 7j96+.ڞQoxe,~-Xw4nbCI,Z#Jb_qy& - } -^'s+;e[jn.@11%Id$r&P_{^0~*ꡤJSvZ͗OIe6~6K(0fY -jJ2<{0DT&-Ly.ay36y@JY,II*,Y - #0&!ʃa|JkqIJ,EZ@y P6=pMe1'Ձ&/1DC oecgk-HO#B4SR B` n!e j.7Wk٫gMqDVOD.&oŰűaONJmFFQlGG`a(fl_=Iv:~ԥͅmw^撦 DCfT^샳+MvV1}Ҽ1zbjME}3j$CQ)lԹv#e%-[mlဤ9Ϊ1 yfs[L -EaQv wm l>ȡBtb֓*[u]Xka= 8 -ZC Ur67܀A6?r["Yy;It]y7=Խ|q57*d\^Mv-!)lj@̹Rׂ-lf6?(rΦYnV, ZȶؖhvJmi p HEMSj -%1#RS".yv0bh -#F] jR&k/boC/!*/r#p{ls*jfyQxQAH7 $[la<3`ljT"C*U"֕,(e }Edk (dQ^+?x@,-dUC m>W"5-6eRN0+ek ^Tu9%=))VJ*poenOY? ~si*[g7_9YG"bkv= R zSA(dT1P6" o 7n&vk vT -!R.Y[OD-a(x`]BFGxE|& KXXX1 ; Q(툝;-aKd)*]J˃L`QiP.TTة`e. Rj"YN|V-@K蕐 *7u-aA/`Crn(-v!rg԰+P-bYU2cnNS`vaUŹD9Fհ.>L@G|.;5%z -yVhPؠ|#=C۔u)`uQdDp,V)! VK;Ii(3moԱcSMUr9BbV^YBd M PȾsY˭6/d a$i7@JgtnD\m;Aً* JjviJtgX'vܲbB6EEU1.y+B#B `;ܨ)۲嚚,2%.S,k/8ΡWOYd0,n<"b^ і 9ӄ S'KY>fռ%5Z)fw$P3*W -O=~P_~%RC)+tx%5D4:lл%X. @lj^PE E>Tl=Eفr./Op +2{W` _YɦY]*kiח@ DX):cdT$_ 4ϚzԻu>(H(Ǿ!^9oVzTU/=U:\͏#ۭ1T *5k5UP='-5U|[Io!n @h*+Ye"vߞenG$ƕo o]^R__(: j#K5jw "/j\/MQ8Xi2.mrPBgv g:ˁ'l?kYA/.O!uQJ* U=vr -ƼN''n}DP9%طˀn°Lđyỗ tDU`^=+S 쳑Qj [P_%+,eF?taz˷&..[V:tj]*E 8/0"yJGQ7׎(P@2q! -)i%atʻF}?я-./Hfw}g+:Ř a~Mlv{ ORhEZʫFa+f`}a/x@)QVe4#YCv!k0|1Di:=V!v rp\T4`x 󳄉d% zUyða]9 s̸R|@ -X[ۈ xϼvX/qVonXA{~قԥuK ~嫲ˉjq` -"lJ"S,Bv>˰"&%|p -r<)eS?i7̖yk\1_\/y[LK)O Dɲ- HcݏNo?,y6McD&+gb)q%le):97(FgpET,F}|I~Y-e.6%ϊSp7W/T ښ]Xg/5 T:#/\Qz Gva' {XFևP2~ߖxbT5/ ~s^3C}Z$Tt% -9#N#TP *o@[ - -핛jS;uMP K>kI夅>a|0A A8s'u[Q h+42 aɳ_98!*bk9W 4Wר-dc否`d|/V`5 BZvo%Wɝ^>.]䬳P0v LO/,[R !͇A' ފd g|Ƚ۳nlH*SX1)|7KYS -),;ydHG_i|,a_=%niq+T&q ,Oz #̅m qܼe̱ѰF?}'JVq6T,'1BVxao%U&7zf -uS{-Z.P:#H?J(A,._j!-`jThPKǴ2p˒i<նGmFFKP._c%_#.Y^YHYPiq?:6j~g?`PtE6kȶ( >Uщ?tߎDwR2N eSqV H%%6s՛ 4& -<ܱ_PgƧԬ.9KB4((ӆ 0w*⋹ -)>Ga9/%*".S ]-Xl6A:̎hDpc.=}=:\\d~ۭc69@c,T}պ,fȢ&HR_p}*bG 67hFqR[KQJbL]>l=D=\)AkPepZ6(Qs*^oy.9nXሲXe -1.5L]\f;yL +** - 'Uh@ME#7 JH2Bތ:_|,܈ o`@y,^y Ğ"̼e -o*fTS Pjڂ kAi\WlXE -.Kd6湕v[1Z.-}@8[W#TQ *-z1lzT؅ȳW[ BAoy ) ^^A9u87/+^jK -x4)LA/L}͛ 6U E(K6|ĥ?{TMF`, e4K7WDQb׫p=%ؘ(fnG E6m\ # -ib1z  -FW6镬ݭi*of*YAB bdywD󋫑rKjfmph+͂ _'Mo@ZS{#%c, -蕵H 3&F-XT+ĴU.cy)e}n)?O=%m - N0*$J ~6&ٸWy9sL.]DZ ek8Qa}c0׈FʤLO+Rv +!); 咋;zOu3oƢD,Iy6v-zukr'W?!dUr,.Z;jG -宓K9>x` T)oeez٫B^r)~#/%ĸ! .m#Sg"eٕs L,O%dE8P _ pn@/խyTrV24 Hpumcc[ʍ} -ܥ:kfղ%<4(cL\~>@<4T$X`jm~pIW -qgk>1 lK`ʔֲlr,jJPZߢcLETprڧ*k{ j3j*M5$g/„ЈۙV&/t}vtXsSVU8^қ*~CPS7JhP(W' C/D,?;,c)_pTQ؈ibu _G[c` i撰k[K[{B=iBMk-PhRnL6q%hbT.YH'k}v@%N+ 'AusK/۱h^g-_6/R)<H/X&; V~ EoFzUr~g|7J/Y)E7؏A2RP*? >\5O,)1FT>ߕSm(ED>\jPb[+5/x {tM8I*#W#1 d Hvh!o[ٯ?,^xCա~BITݕFXW:a-A_uNA&&ʙW2oԺW4__ k_A`ԓte97m^TQ`*\웗l/:"]Ax',2TJw]RNS5RSfyfK 4f(;QC'%iX\Ջ Al@em -CK=İO"#CKEE,/U\u 5Y7eo<PRٔ=qcĈ쫦k?˚sT'*)Ȼ4M_pu?]&B"pJfIo֍M 򠳩 0"f>~'HЎvLy \Pcm" <\5Ki+A9dp0{O1Ub U~LtzgpTtd 11({npP}+zˣ붇f}S-M ̀۷#^0ndwxQ,SSU}0ZR\u}")4Cećb.gYc$Nz}e" S>dA>[`0(r-1ViT!(.\}zC Pw)P%ږe3ȅ&J2'P R*"l(KH5aPڐOΟX#cb5ܞwT*<ᙂg/D֣TW/?x@K?ϙyzZ5N)sد.]A&`}t"y˖ G-X2_x۟._Ǹ9SHyflP #)h_BQ: ¿*P߀ڄլNp؁ו 3Ce<Pܚ'b"F`3* Kh)Kc6~[j2pUB 4mbr1[pls3a,k*EN@̓?UelClnv 184nvY-S )j,TSj,[ ]%WqRl`iQ_E;@+jP˃Q/hBԥuD+@ Yp7 eS&<[MkK@ӳڹ% Œaiz2)[A" ((s8%Kj>e[CQ2Ԇ5(k+Zĝ -SPm)+: ʛQs>/%ctx ؊5=L8,#uhEsv\iȴ?nL,"u`X1W  uZہ* ղԭ.HV/ U^ -p -Ɣ[4I'.6qj+]}\J/H*U1zCzNۆ AV -5S(sQa&.!nb*)&dL:{t+)H}/8bV )Q3]'IEjO%dUtЬ r̍/@ Hjr&Wʌ*VL!yxX# -b%n= -!t"<ƒp -bZ˛Mf WTeY>r6 Y0UA]췒/ܶ[` `DzGxkJ/jDzsl.)]>q] 62ոݕZ_U bDLi*kEˬ[X9)-="h17*TV@G jGuAV$3RۭG{Ag{Kq;%"=ZuX8u"i@3i2/_(SCUV.MbX],Ǯ[mrg/8?Q8A}y~ -*,GruTX_(<ѳQ9ax2^\xkaB\SHE^g] _"1 -՟38>N3$bBe7Jd6Y܈GR9)mϺUۈ07VYLZt/ܪ#A\ڢpLh L+v厐Gَ D[glBl薱Xd2r쵘m@REaXM6^ʩx> -sHꊒک^RZ<1z $ĥZVW~캫5UUw㒐9GfX󺵶{ Qr][k>3؆ER"nTR\v?(+#LpV7O!n@X^ -,d]-M*m&]H'_6gwCBr3虇 .ۨ՟Y*E[v![fB̶-4gR/b<]Y5dJ7G1IJK#EҩXڦSC-NmEPSDW Yl6b.r!O*FVW\^`9)8jO\J6㬑*'OQre*T7ՄtS䦊cE2?Rr{tEم@rZ ["*=L(`t5lq"8c+ -EQ#wL#qK1[xQNi\< j} -.C!~B~` *WP|f>Y -]̎l; -DJHߝ{Mx ҳxO!a,S}k1S tš i"! ^\3"85JsywSȫkye~2ۏ-*I/W @}boHV;uf9ZjKCc@GyE1O,9,] dmңwZv 0GHTR#rTX. hvoƝ#ݎTQ v42M?( &D_Ѡ?k D^>wO_~YE-Y3$/.sAAYYv"F˥^7{` }Oo(vL3`h"W1h׬/V)Ѐ”\qZʏ}eeKjU 3?-(0/P? %[PW* 4Φ95X]#p&&n2A"q䫈Y ]G 9Eľ#Fż% --$mGRvMa@K,[Tqj/K{{\\o1>d27xųz*]sX;%YR&d*"(:_H:Zt= ̚C;}U(2h84Uce6@6cDRliQ._R?'4 ?{[QִI\L}ۚ<*Snr;#I UK$cFBDau(|#0ў!lR2 -da᩹ -4M]W~,UM6B,5!tGBpzh lj.[Q Wstk*ʚ l|K ӱxˬte%_wp(%5@Ez*P ٌ;@pP2US0 -[h3e7-O^JnHS-^`mi@.ˢm%¦[>&E]e |% d!iY,b~`ד 39A@ -iI8<^m JZircY`e[Xы5*ՔYDRu}?W~‘ :nCϞp"Zx2i5]UAk*˵LgPݟo}$ Wt\+D'jLd/ &4GZ ->8mX\f&1&!OZ|6E!ձhv -#>b>4RՉJs\b[lmYgJCBjJf)KPHzCpݚz$j>M^Xit0`#&"? DpLrˆ6*8eTTv; LQEQrb W`UD$MHHfRQ(QQV%8Q T:M(3 -cU8۳YS9,q/% O[,47EUTL/@R Zi忔X(ykX}X=[T -WE]IsMϲ&aK0 F 7UN+ Yo !sVc+!/tūGf]5|g*3,1_">KE-&oTիrD+*fLW1TH*lnb[~bٻS7gU%1J"hasV`/X͔/,Mb"\nAhNZT T2MJy![S%D7>9y(KH&pd/ -\iY -P[ۏ gn懜0Dox P9ەK`"&pB((h -iRڣnN jʞX.10 GER‰kCgrUS.m [z?Db}JV.^$UiM~!#2`Sp\:(%qN̄NNxN&5*֭C`sU`eQ%yTA:U%Ve~|/tGNDqʬWP 6Ո+m̄C#򡮕T%҃c!́>EF4-Hy.cMԵ^0j YW8{R3/?g5GkĵlG䈟kl*[5(6˨„_072gU)"\pn$e>!JA+!bH/GU@5Q(SBV@vq*VDen"4ME`g/ D]oD7"iңL~Ւ*B)Q*Td?[̒cce SRfؖ-)-G:Usө\[jsI+O+j4PWA3?35\mOPK.y)Eᓵ7q+B!Kmz0*2jZnTJ*>X#G@#F/̝ؓ$o#O9z9rEeC&>H\ZeAq2*Rr-rSOb]tK{,/&K ,^2EijMpBˈ[sNZ\8!)¬hAr%Fدk+D;DW@-D +P2}Ye((%QnPt3rkT#mB[cEK\n\u4uN--)P(x ;,c,mv»2`T xw ~NKd6Fp^@, -]=֣{H҈Z.0+qZ2IuԸpðS:Ou+Nد@^K%86C*צS Q:e稀GɀP Xw@Wԏ nlm,\~+=d'O:cUhF`eݤlmv-9^2~9(eE{ũ~>  #l*91"4ե -53PM%Qi`;µZHּƗsT+=ˈ%Th(0Ah%eKد.RP'kD@fڅf,Qvр6%w%O>_\l^KZan RtisTn)DB6B:P)2YQڜ{%a -+׈]B݆.Bl#r"߉X_(<wPwx\3B\ǒR/L$+X,RDy.,*$J€ 1ltO[JPC#o=Mg[DeR=ub,!n*܇kz^|[RH h>q8~p6#)K(xH?(*/rR\/W/3aBe#:UEʑ|nna_P#DZU츸jC{|usj읙֗g̶r5m 2!T&}Uu4[.kU;U2Qи0]FPK#j/G:!/T 6'%*JV("aCCahu`%LeA+!JUpe .hv;PI[nN䫪.rb *KQSW3]elk=Fnn "Z› rvW#7˂[ie^\~W8dQ -i  C2iUՖ"#~゗lҷV8/<aPB!-/?Z؞3V5vK +wkl}%Bc`L^ֈk`DZYD->9}}j#jBƄz1w"]W{X551Uow=u n7Q~׌Dy[g*Y -3YѪ_{6L+HκB!*o -'Itr)Q -ЂEơ' [v]gv+WDU`D,ȕ&VA췉@O n&9+Q˺Cx UNju~` iW/_QYavPia9YY4P\'CԾZA>';P1u S׉-q>vPj`?Ύ[  &ljiD,L2YU@z!Rp(7ǒL%hQOEz %Љ\}æ'+ p%*YwmDE %jmf'g>5fOU+aroF:Um -u?a8/T[5U]w5%?ʶ +nXV}r>*ۜ}@Qzœ)0\brV_.)\-V}CyN U -lBFʮL¯ckYR[;q+PK ^JṄ`#Vb[~C& r![ȿ)L1)6w#?-^C^ vo!9ڀZ -_(OdU -Gw]MJm__>i˽BB.b5*]UMhM4ʀoCrhHVxv:m ?AwWB9Օ }~8+Lf>*)/~]ŶDٛEs$?싫 +替S!6fGqFo@~eno~RtJ!Q;Eae=2gS:|5 zf`w<*TCTZ{ -2b1|irGKn9e -uɅن3B 2<6T4˥૔/ 0oYd1'R\lPeIJ e#FCae춠ˎւW9ZOԫǔ /LVG?xP^w3J#&VsJ?6SU:k8iwP֘G^5]8FGggQ20agnK-N$>MRnD.Q1rMDZVUޣ6[+S~m0*Ċ뱡d$WP6]nhT{6*Tu<9G`8YTFL[ /qyk/C6XE_"|xDpz)5f)'s5$VKvVI1e@?ke1 :=場|h}v.qPo[E-c>Xo#"*leK,[0nۃ:_k`XXT<dG7yKiY "~T@LeBvRJkERȶK.XT1 %F^L`T/OЇwSHdY%A-ODb2iʊSk^xCau7)u*Pa5)K1j\]˚]bݴx]!b UηȐyT NH$ϧ@Kf(b^Ъҗ{V -n1˖Ee.VvZ6J ]e:GR\p- -b&<{%%=*[y+n7WpbTKlpBtE.UxCA[G{-O{-Z -&\w l ~P,% e)b >|ۜ @R:I^nX{V /#BڔTA,-@^!PGmzح%;snpD]Jf4#`Ye+̾Ӈ#aؠeծ%v7$ vvZ=%{vsO3Wry^!<R_1v!nG eZ NyyT*lO3R` ܕhKgn`̟MԠZR&d -K(JQՇuƨVAUVcJ#P[񁬦P}ϥ.e!aImɧ")VlrsebO%gXj*b#E QHv7.T7lU(~&™@!MR*2\Ф!9r V;2h`Zej}T:bT muD%4[F ո.ΜcrӵUBvjryu¢z#egk6}*6,4xATUp *HU?؆^+ILbGK2Ɖ䥲*KjDVjxdTFװR#YHlodPU-癕[;FfV!6[9C/k:4%i4TKlvл05qYT*ml&*b[^]Sey05Ȋ&o:_yzxm/VRjiّTPQ|rq*Vl/rPEQ&`beKT>,JC CGn4>R'ªҊ.8­zpE{sٟUGN,^M΢ppj߶wO^'7.үߍˋU{5a{F kZ[F,pU rp%}U,VlS:i#d*M-{f mE`U^#lq@-4[k镾|.)Tlԕ?\W}0#KN|ڔ6h(}Q,T%%aTe{wXIh&ܢBסU*VLH\QtD >-1Gyb4<=i.(V>QYظ "֘5H˷3 Y([)-H* Ҹ/O}N(Z?Gփ~<VDH #yVgWqq'Dh|QZoo,«`rfLU!*@|Έƫ2_lr_2z/Jlo_c7IK(U9e;lFqэU`k1`@+ Ne_ ! 03DWf)NAd"n6H԰)n,^_"v-wߺMrlSw&JA{ckz]ɇ;('E+e'ʌ(='ZEdY}.!ֺjL'Ķ4B67mčwþeh5Pr( ]Kxs+T+p7EN^ 9ovFV譅`5ap - -@;Rxp۴,%g%]Z9_ű̽eNgN+,԰.gw ̩U+6T|-eV˛D@Bajc -&?/%?cD g%gN~ }V!geEfy K|VTf h(+MN4% յ4B)_vc記olHXto#yӹG\* ޑz>X@ Yr<\xE^B-_LLHG_,SpRӺFZPˈrnx7̶% S8N%ZJ@qa~] Var6 ]S*yS6 -֪)E[a?Hzi&uKBɷnUal3XU~T~$Lߪ\<ב˛h/'>T,| vR=rYx=m_BT7.> $ҰcnFCU9(7y ky3uթzM"?2/Ț-6ZF_`Ty?Z}vp9D>H4 -'tH}/am~'Ur?KP?RVq Ϡ!Hs_#_@g$wuX]Jil+LIۡh oMk 7OĄޮht,n+yVrE*glJgNx%3M>!nM[+4b J u^z͂je5&6`fUo5ThFT=˱aTðLJ.IuX ufQ_2>Wܖ,E]vaLX@K˥ezdo4Q/"ר$2%¶vDv)`T0u-+#=H_cyYGVi@hH5*cլ#ocͶ.xy@<+BW5eb4s|m׊8^A)j(/胭>`8̊ݘ h_~UWcb׉UۋwPY= 5U=ucҳ#H5s.>!P9T2^$.~kLv+|kADfF'[b#溓W7ãh>/uy,e5qK+51"% -v0 Y'Pf1- ǤaҢUص]FjLu}`%Wjj:b ,^Q٠T-pL7vGb8ʪ 9WLzv\~)p5 P k*X4c%t ?L^,wm3XQ͖ g yjwwnZhvUV^eaq-([xE+!b3e4CFTP5MAkSGdH\%PYZmga}imgvM%o,MH̯ݵEV^k,L&r *c4(;0T@}c&V=1>/F۩7v˭a]3NW\ NeJKO &p$WuqRV&V>4(F)G#Kb+XV*vmEZ^Fy[lJ1K{q>,5%E1[tJVSRe'lMS|J^K=@w:E -K`uaBW%K M\"}KVJUeFՊ̾:cfb|YLt2ȆŌ1kn٭F߈- -G<S:r,Uk` [p# wvWu!Ӄf8F^%ZM-M53[ʭcvES g XA}pmDjeEs&*Vysy1ѝ˥b`ш"} #TzD*jbEALCB, R鞛Pf/R]si@6d^r E"Ud@7'(L3KC) CL0K JZ!S jlYb9)˹Y8EQEj @ 8 ؂T.>5P-M_(-Kp%;EFҐRp:KvzejSMny&J0|&V'h%F"CRr׬j 0<oVD^LK+X˺ XQhiKoglfaT+-Vĺ8˜l'zzKv:۶G6[< *\A-L R +%p*U3y4e~ y.rHbP -]oW4f-@K4Q=K57rVyRf~Q`pqsikh|8;҈Dy4he9LNܗ9Zw[Kvtl9R¯YvPW[!TW{P4bQΗ3HǶ bfP?4u5ԙ׶чX]kV૔Π6x"%*X=Q{^@oH/_Bw3Х\׾ ^OTӿ/ih(C0eJzi`D9/qS-oıl.v璋2r3=Zh( 7Ns,Bت>^as, -҈SHHl)i0rJpX4Tib\o}|A%3^K;}-zd͐E!W/{Nm*O c5r:*2KV!xx)iFAP(՚UƪC6$4QԜ7ga,|/~uy_l/EX %ⴇi~  (:#MRU5VJ|Q. OXQ]ISiGP*O_a?IQkҜܥ}d߁{?>ܒI5?]O?]$0ܿR50: w ? -(ǥstxJ% lK*`wDs{xk(AO: ,2 'PJL>߈hwUlUijlBF;ZnFm1{s򸅎ܸZ"y?6<-;0/Pإ`I}K7%dR "K|Cv蔰$,=/͇%vϷ*~DYP^#ci.Ey-̀ZbJiWvK?O/Q~iZ% uG|ZDPHhgAw/v>[#_qA/gEד6ĕ{*KlM( M;3 Ygg)e>a,mmEճ,A:ˈ=G^]kXZlYw5u%څI`'+-]lx^kq]5+TB.Խ5Pn d.-2쫁F("4M n]J6 (umWլY?%~nX,)h :&J>lSX-0뭸w(o4;ns(.IUX -} -"fzMZBM-#s.";gI(d~r討m3?7EÃ%D -"Tԕ/tn-Eċ j耏fŢQ8C.iB0wqw/ԙAEZVyE`Nv4 rT] Dŗ>jzb? jg^B j6.;̄,M<A&b|GW[((P>%ua咠 xA>õ2X0Qe:\(bhzbdJ=%*.TÓ̭G?v;ƣ ZGl AJԲFt죲Yvo}wbBF^?C,Z+V9%˯ru9{pOMuZZŘ4/o^aHw -\rGte0BU/Si.ى0Yt!peǪrѪoKL&EZ0[l@W,,8xV-\ fS9l,_ tZKiR.E6cG D -ǥݛQNVE|˪L#Jv_z C5ٳCԹo{1Eek dԸJE>. -]}lRmU-ys;R*`egjn6kW[0^iREc"E1VKҘ&F M.Z52&;QvwgBY:&j&PKf )?QQ#(,Mw8Am ٸ>WH -6PyX+٩5mPzkH`?z%?5< M:Z\xS -@uUvX ԟsNƋؘherT0=93K26 _$b9!gh ͊Ş!CRkFe+CYRpY$-Ba]on7^oܪ*\^4Qu X 6$."vE6^\ %> 6ܸjB]9P/F+fb'Zʇ6RB_ʻ,H ; .2-̋C )`C|jeC'/$ڧPzu-E)SfU獓m h1\)>B4+qޫu#]ܪ}@Rs=[\tze7_;b -@9~{^hYLQU?Ej@\/(+Z4Hnz9h+ax>ze3l%}1ktpjJ`*-*)y_ʏ_~dmC%R+A!^a E\4'Fi*$%5u yc^_/)ۍ)lQV{#`Oc.ieeFU/IF.[ ve9[ :dbgg`n52tE˯1w4vZYu([~Qkwu6,dFWo؏?QmVRNw| RangKUe TFgvTa>o£ܥTܧveaFSu"V*'#֣~m*7{{dJQ|ŴPί+@U -= ˸9"`n$Tlܕ9Q?MU1J'}Wլt+IY/Y02[z<޷EbGRGħk -U-ZyV {&e~@U/ΘR {nدỰ$3+੸)L+d`?qcg7v7#y4ydHGk0V/X@g28+qYxNc1*"R]x@Qnj/_ͯ)ܘ+iS .@ - [?nu[.^[[Urǥ <.Xe +2=L&)}TҧFy6!~e.v(hS/AcJtZ}6YڧEK,17m*X%EbIfƻ{Ym/˶Z?A?YwX@&~9<=E~:ǿڪ**H$Qjn-DR -`nȬoBd)~U7=FWڥ8E~.rVM"Ąk@w=; t+l.c -@9tˢ:S~,m,dÛD#DƲF$9noR-?%_ő}-2 -~57⨱{S=Er -y,mDCPSw.=n*$Ris"7*ulٜlf^E̞C-r~^L# 6QN{eu_WԽoא>-Q'O^%8W<,=,v+5(L;SXyH5KߍuNqWЁ(Fn `凯/2*y8v|Zò:({ew`߸eYY\e䒯?;TLDRl}/XEPD$x_7D-?+oG/^Ub}v%_5:CmKM{a:9g1auj~_dGEKQAJ]WQi8ݲΊ*Ve,e櫼[3lZ?͙x@50:h^QF^=?Ŋlվq1߂$6/&=Od 1Bt

HK1츾kSIH=gS͋)`#€iQ{Raj5|AZRsjwjIPǂ,E;,Fۯ7xL j,( JX )A1<9ڄj$\+% pj%ѫz>9M#v 4lJ -!Ez[(Fa?iྠ;", -{kT͔yNYcQ X]tۊ;6M )lc.j[*uׂ'B)z8|}5۹.yQ)1U)Do/m8 -^-vB菉HGV}fʷ]m֥pi*(wTlq9e)4*1O-#-? (GUtK~ve@A # %H%>vnfMY2x=8c蜜;y -߄TK* -%eTR9#ogg -lW+>l13o ]\,߉~XpO>(.\sMN+>2wgrJgq/Hz\+U*#|2 rŎYY 8> 6HLeKۨ+`i򯍸%NV|VˌbQr$0 .%gc)> P(UPlY~*xnዩgFg8 e|N*/O&>eXUC퀶e -1h^6V iS}B5~ -[ْw BNPJhX.e+-eӺ.sq,”ĉl'z͗ÐqMcAo `agKG -{O֜hH?#?Q":69KB0vj #F.&Dk_V*%$jW/?&lߏ2L{Qu%-ra(BmA^a[ώ3Y{SooaZK@JyZY1{rDYe2GU2_L\6Z)a@cG/H -ndGvd;?l6=017ftGHw`ypI>m*!T(-beq֌~& 4m&p)"%ěO{Ni} ? Vԟ‚p١{ɒ>icw!emDHgRbr%[QWdƯ.`''E_pFD~ϟH>>"Yݤ#x&7Q4+E7*)/M &fn0^),2α^y%D+n.EW ؙP N~<#ŗQvIuipؘ'np.#UP>|YKw~S'_"r_6#%͏S/Z"k1ڨyOMXch"Trkp}Db{E@fY3Mgbaժ$Aֈ?<Ϥz_(`'u;=~ 1?}UsPVerM['9HKcƸ\ohg(|}4#RcPU?jnMO!z^~y?PzO5}$w2=tBJ?d;91q!SVםŻ?L{E~%?h6C jkYEA,-d ޑxŬ{Q J`]v'CK3E^?r_ -"h5CƝ2$\R8%q_FQ.rzcG&i}PeU]Dڦ`-PW`L5Y,i4S;-/ef{V2y䫙ŒZ.[eT.qp|qUó1wb=c2.FS̽ʥUڝA_(ѽIk T{¼*#l屻Z{pD˥ŽZ P+p>0hyZnTKݲ!Q c0mW,FSqWeXo3:*cdKzG^_U%1=F$^9Ac=Ґ2xY.uJQPbOXmGR%7Qp6c5F-,5#^鋑B-Zu*+sqe"xF0J"Rm)E~o􂙉?zB@~(wM<1uX.\j=Qol`E,EI2X0H*gweewp|vn/&yܳge牌!.SU^ŅW<́z}!7A& kNE劖_}7+W0J+ -VeWGWb-ݵST~dZN7ңKfk^шu^U?/+dq_h~1mj(J.hE,H^*!uŴQXkBj~geu7v֪6ͨ)hh2ҵ{$\t F`AU V/׊%[*. kvs -cfb?FFiJPـ+ kPVػ+ܰbƥ˗ eED#l*]'rQ*Pk:9sNBROg|'irEhʌl[2t&x~.?:˄"xsb>WjC]vY]M.:ʖ*b{rgi#hQD(&x9bb>,cj,d\*U4qb)RTw-X.g5ȗC.8!loX.3,/H-2Fֲ7xˌ>@¢O1M|KOkĶeeEhFܨ3ͲnSk-! E+!r/K\Qqp.\l͞HU_BJ(Jx0IoQSK9쁮^b~# L7l=Od4eSKɄ骔B 1"7v Z<5dMVfQP5fʃi/ҥu O>a*aB )v)znD' Ub@jm.5(rhO1VdڔٛsQSfʅõ 'F`hjiBdž}ˏ*j7 KldYaXz`iUE-\ -f] q=T%`|.-.Gz F+)M4pK8+ws.,#OV$yaUJVr.?Wa/\?aVKSb!^"`3.(pk-P-Cf5PTWVx#ԕMZh_q-7R[\@=``ĨXuKhl`ùAr{%ZQ Vz"Q$UDG+gIl-03e AŸĻՕ+^Hx -T ;p@+++vVJGʉ3^ a5T'Щ_ -&B! /TO"1`lEXilD ,E!;,<~ ]>ڎlUltWAL*G|6,0v0-lY)B2M?d ۄxohT\PQ|0]O#`(ԥ+2_2 {rB @׎0ܰ'B:_% -!>O-|Y ږa5-DRQ%;=y* -;-7˽GUqUsJĦk{^:l\-tWJ`UB?EDnBpO|6b#z }}CJ_%^%e ^XJfWT~L5Q Du+""ѵ6^ @Y%%^vsעZ) Q}F/)uN(͟DiEx)5bvSB:jk0߅*W\ -KTA>/̟hjB埊?o+&Nһ*uBM!bEOtsf90:¿.FS[Ba0kS{?k c}5ʤFCʒ@/ƶTN+d `OjrT_@E>Ă=*_VA֟#3^}Qo(WX.ɳj܈m9gc{3O1 -krs(^ |J ܩ_VP.ZŒԁqRJM1f>? >%yj HDe9Pt>L% ߻qoSşz@ )**|)=@]RB BXIڭ_jK,tuMp4sxBqDDeOJP@xOi 7:WOK2~Tk w/Y>vK"'tjZ8?X Y.CiLORYtc!-M*陡yh"T~>G Ly?_ɔ5okA*[ѿлex@+(~oT:e/(1-o{g.2:u!  U~1S4@gMe`"Ө~@XH@P,]`VC%5}r -GcnZRV{=$5PCh6ȅTxJ@IT"M^BJewF|{?<.Lqv,"K:ĹR>V-X#H&hq۴UR`0?|+SR%9.t*Tz߈9VK &>ɦ?u_mgc/W%㤼o5jZ_ )gK@RkKp/Q U`"moֹG.kE**ʕj* c&%?(% Q6ڇ 7ꮮ!m=U.g.j o!/ss׺$_ e,x?h"*2ۃ$R"nu/@1 BJ%_cK0(1e/1rF73"u:l~r+'en*%zKXidD`*"cq))NFQ ^.͉JZn:H.K6{=DDD`\Fu%0?>|_ޓW4GV9J 3A&Vx)OgE}Ѡ&]H2o0D?Ӱ@`1Xƽγ=M_ Ĺo%KT%lg= j*5(n }JTE`$E1[55)6PWp~ɮNXj.zdFc6f }2HghA}Qҩ >Ŋ-ms@olTlG q,j= -*2f lPE {"l@Ge\P,F>PJdN*U1RpV* xOFJQaGbSt,43}_=cURjNjf^E69x9CQVJ)aۃGgkH5rQwSROW v)Vʕ!Of,2Y2.ly`RZ[:˨Zo`\ʉpjK߇ CPojdVBra?ŗE|`iA=WIze״мc<*}GqN(j `mjS}}(aUbƤtŶ)tUc.QwlP!ψܡIĞ.{WY\a۸Zd˷tƁ0U6 -?$5~^)J Fa]NFo]>7ԹeGр]ۂwy..˵Lv NBY+ȸ@\O]KVKKMW~CHZōG h^2P^oy&D<-۹P2 8^}I)`Qn. Փ 3< -#>H⟼wG@CkzNr2/EKX!*bSWEJK*foҍo#+TYgۧShq-zԌګKrèG)V^5Qp vu PnoWS/J-,XQ䝗ӌ.t]<]Qm\e ACi dd}THP"?$4pk/U]y-uء-H.[K0v\ L qc6OĠׂvr‹҉p>J9EKҗq3h&G (dKXR+Jb(V[UuwI ڪoi?'"DH7###ꦿ _c&YE60ͪڪ4\ -?@D\%&JOB -3g=aF2N+}יwm̉CϺ32O5qעXOQiU'/EUG<KbSn*&`dv,Ũ%<| Pr]ȭ2Iiu-{:/~|9l%VrGU*]2.\ی%˩qf% " /Q`A.<@Fޥi[7͠|(\^ljOdeD:ؓJtcf0riCd[?V3v:HWĔ̠eUgEx1"/OHat~1st@+=#p|S)~Q"eƫW>@:,Q1L y /HI ĆZJ"*ڡVM 3jMG($5-vU1~n.rR⺗(WWu'JgfNr>*_\$2,[]_ú*װ kl[e[][ -T4 j(sX?~T0CAgIBģ87{% *Zk ,N_ mPA(X'-Ej -T)furp -UJ(]^`:/@5B저V-DntWL)RUZJ.n6a(daxO^8eL706=/\ Kk0{y»/-!  jGo#/[RQ{ ,}Gek'&1V_ŗe>5Ϝ~{G\ۨݰ6Ų0gK LD稾#0VchŅA4YX\OX)SI64i㼊 ZTo[MEhe[IgشKgj͔\X컉ylg1zPxRr%ꥮ%YUc6fˆyAH5ˏ'aC&O5h7)G t,We^&f,UOA- h>;j瘝U@ܸ'fS0@!A=:F*?l"Wf f§&)xnZ-B׋|_ǘ"V|$6Z 2U3D`se7 >T'mKo+Z0洩kx-i;o0L9J{b.j]3Q}h=zKaA[`DybYJ"FE*#ݟQbnC5Piոb5#؄7[}M#o3*K5K'%ЖpW+WKyevh@ ZټG(CJ+r)\4X"|lWhG]\YiIJuH<Gf9*ʎܨH/(w>āc) ? QYB10+Vx,ʛi[ %^.c|F1B}TgejA'g1<'ŅrGkcݖ [oža5W -Y) weuU$GFZ|yq;UOكIc0(=\" -165Z2jUen ʮȒ[#JXhTF-Zqkp~6$"o6{5vD:TP0,Ϊ;{yEA)T]yhjlmIWE=YG%̴ !5y*$_.v5'y>rG!Ⱥ*pJ/%g+<0*f=F@Bx02v_F@'Dl#|(TBy/e@7XވC`6&}7 mk K}30!ExZl<:!"bqPHBFN,_UiH{t:^H]咔B62lŦ?Rl5Xu44>v\5%˯Wa5l'L,r^_Z38Qկ(Gm;>U,GooΈoqsM%6njC%2nq2vŐ3'yGvϟ? ~o NAmO:tOH3'*mz oEG?P"@U? 8*u$;̈́sN*ʈ >QB<JjE*qɵ8DkgV kޠ! -j ܘ#I/2?ȿ -dDByO4)U~TG,v<ʶ'^ G-UG邏lKK \zO@ʣQLhĠ~m*5p)µ Q,NT4ptPa+CW1ߣac5Cv[_@(VZ -QgJ?.Mo?d4}VP -.2}M% ;h*8hh0х.jeV GS5{\5)eV j߹v\ ^II\* d̨Mp_PFVJ''n䤹|+&Skm*τ/mgU%p* jE)X^ռ3Tׇϥڽ`,%dz梠I"^CQ;zZPڥs'$jR*X_ghg}bȜ\*}JUY2W5c4t6B|^"'u6nOFFܣ)ּ!hДG7(d jۈ9>m~TFj0WgC0aRu+Vqd%)-7[od[.aTBPk۔@#DJ-]-PUQRE%HE_5S>hN_}۔A'T%8!pҏx-ꐢڛ]I(b@1D -:+aeb,zZb> y jRϸYHC! -a9m\ ّ GK' G#w\Zn-9U+^ūEԴ6cB -g_@a4 -Z2w -Xa6'Y ӗʎ5w:leDTKKN%&TYT|NsOn(ZPb,%K,;`ޭ8Jw`C?oRq5H^@KSOL ӊb"1t5إ ̒4XYĆݐ"#V,6- _ @B`?F%@q=Gw1؞FWl*&%wܫl3"r4/Į3HTiꡏT^Z0ȋ@!`|HqUOBPJx #% 1C@%ᣴSbD|*NۆOk_*ʯ?.<d &:w⛙ɇQ*+;*+3e FR(YMbTPʜ<h-CnhzigFY(٨ܫߕ Ӳǃ?1'Z>"X*!nGes0^WYAf,s+be\_&9B5rQDaqx&Ft @P#QYu*# #%DIQZ뇫3p𢍱,TnҠ-je;.U<ܕnz2<=D% -@2^TķK mR1'!ٻbbRB R̪T1 Uc+R -gjoa7\Kю|*1BmBG{A)3L{D(g.^bp u;v2k%R/aWD]1>XYU-*PҦX,_gP. -A*L{lҬ?$fl'ZVBh{e,{3RQQR 4&8뼸]xGk`/PȑD…1.rU;Q2KƽcJ j3}XORhQRz:|"xHr#7Y[)\ioNߋZB74J[Ӿرe˲|PKBybW,r%mEEL%dE\6aJeЍ~')񩏂:)-<|*$P_QQ)((iSĨD l1U*TB>Uv^݆K%xE3u\C6P1i\]\}|IrHDd"*ilv)1N{Ժ}ԩYA/ƚv|^(5|/wW0,'G4l%! ^dMa׭e^ *J>wVmTD$s֊ _*E.H$;%2¿BCOGjo#'”BA 1^[+Hi5ڈJ%aOxCDy1 ٝLQW5|X)5AG{>q5?X{SsC#q~8v0fX[28/5GrGywvmBs' {w%ȍ4BS""6V( zE多FK.GJ+=jOqol: g5p}94< %G,B8m*ԧc'ؑC)lm}/auUq)N -ş|X}rx8\<.򈢺AW)OjBnmSm\"+~!&q}.\e#'ЕN>eJfFVKۑQex oQd%"ĹE->}Od!%=E*j.ܗjX^[Ծ~ĆRɾq;qU~h7:?Z.uDRZ+8='іP *KP C4 WǧVhVVedB:4RoehiLQiS U&+}qZUD )W[ - U(2 ^{a]Bԧ|?Ĥ?ǚ>[Ъۅy0 /1.`aLaLӐo%*K6`%PkK~EdFTQy742v4j}OZ432(閊F&{H+2Yв +-+.u~,E.PԌ&ُV"˲=ǐ?Rpٟv'JvB`kK/`X!qkۏ_ -.G*1:޷ 9$-g)GzO~-MV4_.\ mB:A%۠D`ږ2"4ǕQ2 un\UL0?rjv,$aM촶t9U]|Iճ"|UR-c59pKjbD\|%vVFSŨWĽېw:!OR#Ɵis D5 v%*p,TNYQAN & SU b"4Kޮ?[߉PJz>eoS%HJS IL έD|BW z\&"hL?Y?Nq -| Wapl*$G7[b\ (a 㔙1LIFJ7d]>_f/m_xZ5p/rܡTHsR[DK̯gIpxs(`+bz0H9+OQ|0SVد!9{H; n73!E Bɒ`ҙѐ\t|%'pl fivC !Я͉hޭ)fD#/y;JpMNɹ;'!0J2iVjRbp)EYQ0'U:ҡLUO :s``KS*~{[)*!TK̩Qdu*؇^앗03a^B ;5Ĺk5{ToTn{J7%T &R[),9S&|KʥCIOS6XPpp<H\Efҧ[%Z$b(WT, - ppɬ>1#!]K*)PS* -Hmɷ bPlY<@+B-&40Gě4##kIWȩL;SVmpC:.iVF2Quin'+ {Hf((֒]D!S+%~\o5 jr &#Q- -_ gڿ(U`ߊj갱|#2T#>< ku9{^/767BBެ$?o,_(}ir~XV3je% '̩ZBK${-[(&@,°Hs;%mXuJgRʕ-}Aj -m|˖zƲڅј6{"6 7| X3iJOE\_XN{g(y&%Zg(ڴ2ze8ai3D64Hr<:%KB>ea -ҒZ-\ya|gNb4ےC `݆T=Y S'.H&96QLOR/Vd`aM؋N/:ve,;+ďTsl@Ru -헳. K >Hy]`ݮL~0\ݞo׉Ej\Hj75Z@5 yL;9?#P^-Ed - ٩>_JP_XQ RyGiJ/KA/3ssW#wq)3(]}gQ 7 O> ^!GxNTy*2 GYeJAPO؋uۄ":.)*/h3dD (bP<I!0oᄣ; %-ø{2Օ-2PV{g*|MebJS1pjjP(e7Ȕtֳd0DXoAxJkr9]$b@ FƂ?_R>B0jShU8e0Tz. /ȵ\l(k>ɉ l-^Fncc -?a-( `wGUW3i^Y* A\yQ`K[UYp5ۧwCSf;:~@ǚ @;yBlH~`t\Ѓ/,}#0Z*@C538_wzO^UyA˭{4@丹Wsܿ,{-cXL_A{eYw~rф+`[*񂞙Ōݞr!K=Mub16&&g]ɓ}|~a={}ev.ͬd;hSt>4&|WufR\u2X២AlsuY@V|Y<B>+<_}4Wp{$'q+ u`ڹb -{%Ũ_e2_l}蹵r[Op+y~/*쳌; ۨ5όMnͩ/NE:>]-|"1:YUUDyy~, RW$Z:Ř$uWPxY|[ b|ʴoO3 *}aBoFT_18}\#_HrmmG YK<2ɕXv)[SU v,ڣm,c!Ī M+L7yߋ!xe4 -äNMlϲcUjGm2 \҅JiiL+7D,=!jwl9p6̃ CK.~ 4"7iѯȳ-~R:'(қm1}9{gvS p+Cԙ~W6ye.-A_S.۝HT rZ%gϋInoj_ع [۲g'3b'˙vg49pwId-Z1FYp6U=;F<qkȠ5_fk a~#X,Zon*SZT5Y۩$5R/W#u%Bs#W"~/~%ũCx9>eG-qYY(閸%ȋey -|Ɛw.&~إ -YiO2o.-K Ź,FxrRx!Q}h.l~-Er?i qdFReݞ *_`-ңDȶqqҠ/Xv^⇻!TZ3o?ȋs0˩d 6t\=K94 0Sm)*m!Ֆx&YXE7[U%/T}2,Bo t``-..CH%mf|`Q.,*8Pn\ i{.,.\7./Z{kk>{.sp _lcI.d<d[a6˹e.$GbAy>1/?3Tj䵛X*{jاhy췕Y,f &cxozRکnSb=S5XBb98Z:/e1j2˟I -Sl܌>tn*^v[ -/^e"c]iqv :˃佃;rd->P\l<[Y -c'fܻVkĸ5.ŝ G˖ۊE\ lЋ;n[,Wq}C2̩VJ\`{Y+^qEeiR{{4T 'ڠYaS\!l/pkX{ax;eDAB%]]\`]M@m]e:,/cbK1EmCI#5.ۗP`aUQ 1lD;w -F[ -j]K@!S#0i/v%6ٛ|Ks[(R0% a*]vc%n _*L5Oam2Bbg|*\"wJ`^fP|,XIGFػW:B˪*l5N6vYZPl]`E7SV.:e2T ` X,#I%oyR!S~\GUt*bW_UBfK.5AX;-mVA͗P_@VX YoJ~Ѱ.`KĆAUVL(v^%YJl*5b-Ĭ`Ur |yGe\©D<;-c7HZolB7QlZMA|31;EШ} 8A|Ǡm*{95J lS#ZMȠ٤K.jqyl.b2͘qrYfH jcn -r[6,1D`Jr P>ٶHfG~&Y@_6eڕHT

x2 -DCk n_xrţB fyXi HURx䧈'X ~r=ы,^AcLN/!|]٧]edgXIaQR@2Q>r}DeV`,ctKSLa5Go\*+jb_1|;ld+ܾlRE]쳷qXEWă}LV-)% -2H\au5d mHS;kXa@(_LBotOQhҚx问SxnyRa|`TYRϡrʈumU_UϕUU(VGǡT/ʢʨ[8Zx#ffAs(v/W3`-9-LATBX/m2#3Ư5#U\7:O 2EFA؀.qcɇ6{J)gTƒ6%X*aح!0vmdha, %aW*a}Hu0Ʈ]Zݎ킱0eb+m[Rř C7{Yu5}kJ*S"QdD3}3ߓȰ]ZʋVx<:Q+mպˀTmFe>V.\|% CFWpd`?R>?\?x,}"`xYL+b J%KҚ-Cr1exYq[梀*[ñgKzüj]a ķ% ԲE(\kıy. -v -\r1}3ʼnPElVS ټ􊨖w.` YuPܱr肓Z&y;CƫԺL- MvYkeKnEk-4m,hW-h.Z,b1k<Dca;WۊgL.g\ qmS#m5™x|;f|^UzmBa;%56;f>c1` %Z=\W*]5K6t$y\)Yؤ2Y`lx`-Ő)bRؗاYw)S"B}ALW'G.mp P Ɠ^uPPj'`$E 0Mp߆,`ehy"@ `ViW> 8s̲xTD(&(1YߢNX~"̑Ϧŭv?A/SqjAPĻ^1@aner^rEݳo#aFˑOQDt-"R@ZVhF@~Sm ӿ³ /{;Za\8,2^7]XEp)K2")fwQH+Ba&%Т&{YP܌IYQq,T,x%nyX7"6`7[ܾdG -= ܩyL'WD[d< .~l̋;Y2!,ƹvѨ n\[9QٸC"IS{PDZbb"mbT._U[r(@.1ER`]k~" vQKڰx,tWU1YEW)ڂWy !E5Y5Uƈ`0%lZA๜c{")DÔA;tEJJ6l?kAr,_L/I} - kB-˶0{ vh-Ma" yKJ?(kش*.F|7X L!kHTZ1#Ciqh؞ͫ73BiDB2 ZX;*'ej]TJ54`oED-f&3Uq -?xJŮs'18l*މfTǨ-eCW)uan\JxKxoB዇!{B|?-_#['D{K&F UȥA\F@^nA8] w!*FϸBz\[,d%Jȩ44Q<28FưEr(Q*Uʜ%>26 H Z8ZRKr -y+.J%Ѡ+@<˸i\] j'%D-W=EMl )ԶP+`' tO%RbDf 1> ]jFVVloal_i?hJ]웡ZR*')tNŦg$ ]ٷ{.*pߎGEM/n_BYa7.QK,ߨέj'lCݾ%* >–_V᱄y-y*<";:'%V?Y]QT?j=֬&QQR>.L'kExERELH( -sv>}_Ê,H,AQ"qi^&4<$QVYq-uyZ""+Mij[B€y5[FaVVW"~@0nNf"_AU-˪|6]EZλKʹITq/ Q2ZaPE8&Qh6EA\s{JYbur6@GIip/ YV%] k.ƢV>}Wc(уQMPvWRbۘJ=% -peu-b j6*h#hk֥X8,b(%iḻdv~"lRY e6 = c$eI*fhAEl<ģ%Eu5),oujVxV]|QG-U., Ywb]S: @e-?-d!z[AkS vژ# -)ۚ c%QA;;,^%j_?rb%|[Kavx).gAT%2SVR{e(IUoqJj{ŀ6fͦ]tFM dȪ~+LH)u87حXO B4KgA׈eE=/uZʣr\s}:3I/]O(ENUPT\Pj(uPP)-A%,,ʋ.\] -˜&va̖+Q-TUY*QL.8,56GNxYƱۂ^xn+8{RՄAKZDۖpy\Ac'EE6ԽX-g@&uql5ffr&1c;sz|<ʴA uurŽԱvS<6Ӭ̹~Wyșp!w4b_n{9lU\u-Vy-ȱԖj) 2T.kQP K_1E+#JVF"1dKWM94H=5?]ZBi %ȠSU(gI^@^*-XF}M.zTʸ''Ur -qc`*nhQn}KP\Je`61EȠ6VawB G. ƒIP|;R۪AN؏4Wܨ -9XDni(cg?sD,YJzF=v -J i/TVs¤3l:l\QsF6^P.T\n(lWVqF^|OXZl,#.Z1V[, ~y8bj d{(4C%JpC)jV>h2՞SpU9QF6]]*jFqnhO743*޷ٗB5\:Kbry3ĥqu*2Ee"%&\sXD 2Rew,jj P{3T#kTkm1Q*y+LU[cN4e w\.CΑ6mNy6DҺ*teF - %f.٧ b>haPtn H1#TWR+rn+bN" '.G+ȭc YȷĶr Fp lnB:4ZOJps%]JQKTeKrz؃XKf~Ęv t )/JAiv]ؔUν>%1>V^T6k|F#RaIl- cd]fv {4˼{QᨁvZEр&7{Υ1$K̨2D{6.*.GZ{TʰЎMMyF'"`'7>w^l`4yf -mh];0 (yC6cWb -VJ\tO 1>|E*J͇P:Q!BGk - {Iڢ\\{?,r췗+Ш Uu| `ч/6ۚ$"T0'pKjVbUA صؿPoQnA6?H`P Yg*d5t@Jed:1j%PŸ.@"[%C+}ܷiaG. e>iP-y:1h4PR08=9.w9qeW(KVB_.Qɖ.VCC+uJ*+dA^%cR߇5]lanUrwX/ڪzFDU; t7 WNK9Q`c1dzB.> XAk+" 4 djx[H%[PA4%u4.`%*&L|QDtsAc7Xnŷ^N Dn}0cU߈R~Yށ?L+%/-y+<0{e_e"Jnl.$V٦"j]4L`' /+ 0Vc\D*UU1L'~t1+iFƊ FjtGe".l 1 J@'5Ph3VX|KocAIJ\-8ʵe-/`WKSqk5 fԾJʋ'%O%EՐSf[67ua/e2KcZc2ؘW.qt!zD1O5X b1"0{%Y'@*_iZ\%On`Ę6@Ty^ =~.Rx\gRX~ WвT})RV-'^eQCk8K:@ Ib_ :KUf/ rseLTI͸489mpMg, "{RS9W(#@EE^vYۨUŖ:G-i K2͕hfS(j֙Ak=ۃ>(;1b=BARY|v:)gU-cGQD'ٗ,vK@<Ƙ첹SDC}P=ʂToD V+\% -%LφlUؽ3/*B8?}%GV/ꥆ1ey0*vu|""fݗ+xAPHeIw/c/z\v(.j=ҝKe$V/G -גoj]0P# ut[ QMo4cprV]Tǒ},XM}0JU{XDbD0M -55:Y*#NY0j- =N `UR -WP8,|]LŗMw.9.? K/ijW%zXw5(yK}[Kxiz@5mj4I̘6.̲H-ƙP#'o9+tj qʴ_;Ue*vc ¬:SQU|ε`]FPvD.oYW_HuiGUp>H--r/B[0zrUn{_!OWea S|k?KW ͳXFj+)VS=jQ,K-v* -cgP6R{pl,Eu!j.X-vRuc+(ۊ.TUu9=Nq,[*Zjف@[Tc -(൪Pˈc-4q]#hf,4ci.V-[6-C?sek,--Ok%+PnYa&QEQx#y ycpE %Z[-(^x^EjoMWȎ2xl -YDm b(QPen!.]=«`ptb58.{U8v⯐>W~bͩ"߈YQ3j˴NQ;tBഺe-\7Q|VLBqKcNBE]0N W\QF -@rUJacB@֑'4\mzѪ\b[(26EyIZȀRؐD %챞eK0/jr}ƚxFi-`ݬqD^*%캀x{EUER>'Z9)ׂaj-dp]l܅BrόW#0Wj}"QJαh02>JvӫHKb_;)kyKb\͆ ێQ-TlIpMmNB۽}f,j"`2 -r7VO )Fm5Pe۲~mCPn64G"Sɼ -qDH۴@:!KJ^IEIR"V(ULRc`KW{ʕm;+md, -P{"ok^"j?J[eEscU[EvS]E6_z|Sym_}\ yGC &8@:h+g&-Pw|Fv4Ø5.,heKU= u@:W"p p{Caq/NdÒxiۆq_ru+Y]*lif5u*.RKCEW} -cEPeʋ]*rXE[lKC_CU جXr8Xv1 Z+D#VO;u+}pUD{.T&cp'yHj#$3 dSR* *Udp~ga֢\6ߩy  703K7UcGRJ.96[kyUdٯ9dweJ*WHRA2-ςĻYcmS(*\.-3 #nKr̠{smPAԪUkfG6\X E}^ ZP? bRv˜ Wp^7 -C~aMbϲ u0 R U G7OdCApIvYR9.' +#-‰e+6T(%[ˇ^L%~/WvUC%bᜆ~]穝)0>eRƘF`dLP]eb@*[/QS FQ.)0ߓĨ >&*eX|.>frD:ǀC<Ϥq eǽ}D"@ti骊I,WO!o@51 -A!n>,$ogЅmD36Vme){P~qiC0ϲSbSPEU:1!lFk1el%O+c]d'/.^|D8fRr]—Оw<īfQK(E\`$RoH6Cܲ4fmZ\Ȝ\ 쪸% `>c`g|V53 EWb e7߁Ĕ]ri0&Y8:~u]=ޒ%Bu -1O3=9-'_uQ26* ̝5OF -'6;mIv#Cl %[phMX+ {R2Wbce0`K~Lڶ7Q TRɶ{фv0R\4J_pyX!{H.W{'r_ ,Cf IcU U\-PDQْ\vf[ - (l%Udp`x九a'ȦNFɖ%oru^8UsaALEN[er7Szȏ%%6cQDF ؗ )x&8+ Yz OLgs}ܹ.6caB[,hĽ?p dorȶ e*69 WQZ3H /'єd$ q/pqUGmsNk,ddU/+ VJ.@]݀.E+" JMgŧtʘRE˩?$~hWZ[K*hٌ(Z?T&Zky -o 4D2= -\pN՘%K=`Jj틘_о;6b)cmw_0 5 `{oAR -xSFW*[D3UZ*y^o.p"kGtg@i]pHd!ljUf+/ܬT SE-H3npU(Zk2 -r<ƥ0RR `,{g.u⡣O*Vm|> UQ6"ZTJE VzPq3LZ)l|\CPDOH(j!+4;j)CL5Fb6k7mpԂc|+bh@M/,jԨC!# Ä JF$7>+٧{w|U+=З&٩ P&LO('iT+tZjSa) ,6Z6m7¾;dѮ3HZm*`)LWQ\ab|5R֬Sv3j03Oq+vIZ[r[PKVJfi -$t -*Mf 8֛Y:ߔ]a̢(Ħ IBX20ׂ[Ez&eAJbvVyeFhJeGc4&^+DJ *ƥ|c[j`cw*(Xvvl%Y83)0'DtˉP{Rdlbe٪ʘV_lv2 KݎuAwJ*_䥨Ok }CS|SUxEF66ɞXhyUuرn4rHщBЍ.ޔ[*3rrߢ]?{}(U,V-)xDqTC>AkA !s2dp`fk2hb! +ZvƒgZעi8FF5Z5__S L KQgDg,BY`_0u0L 6ql'Y(e -XK&TqlIB@ # aSJܵ[bmEK\ #3ޱdO`J UJx/-1- sf]0cNL_BiLfjB]x.Kݖ-.n0db0}i ULҮsAvrv&Km\y*%J.A˨QR -Z1]c+sHܥ1(k1GUq)uwem˨8-. -W:Y TaQ"+۞Lϝra <ԼOK؈r]P -Y -^&]݁JQٰ7+F`AQ~0“A1]UƓe/;. nS+- -B|zKNE*e: o 1ܥebLdX غ-Y.]{svJ f;=/ ^±Z=Ü"DP ؊Y~e#(Q0FmB/K.[ndS- -q KF^e }tvX*U,nYqM ,jq\lU -jdGo>&rYR䭹m3EKh5bv d`dL{2\O WM5p2 / fNm\{Jnh=Q #ʶY#\)BU&Q#6/`3V$ى\BQd5$;.^/mWœ=JfјQ>EG\M -BYlo#?r|,`A*] -0yJfh/:Z~/s?*tXb" %Z۰M& -&Buljײ[r_ "8^bfS {"AVYrۇ%ɖxCqB4ibSşfD- L/Ri <*W6CltT"Rwr!R_RĠ@ڢ, EErYa;_e:DB1RlݟS0ub&\éDvX6# -!?.Dco~ZW*lL j%@]:w \uպz-T{b>N1+VA{[=p5V -'ڠϑ4)e샄vY"4UiA%̡JZTruYETO`lg8tW!BErlDR!R"r^[X1KE|QȅE< DeK9&W6}l:=b'a^eY]CP*WP<WD-K}nOgZ1q+X?PWue86j3IcQeGѸ@r@nU!5E'0~Z{S-rw - i 'akij4?5~PJ5LDMJ LjA!.7wLRGUÑe" O}7:tFVHgWo'V}`G-p\ 7b:~+r~Co&f3LFT@{Pd]S15[\}4O"/ -0Ur-*-)\څ2gF&M<춾 - B%v)<.E+^`li72*EbPnJ"]㰳M@mZ"MrUG!eʢ'SdW#{ ػ̙XNe91`xa[QY? [}Sw?S {_MXmWV -d=/lRtlNk ~%T KnWeŇl+U/yX8}"1Ku<ݭD0AYGVsKfݍvšu -m݊b!GX8E> aVpӟ VNLYsoujin@ہW/kjZi!^K`>X~ ~.^i{WN4`2R*UlJV3*ضiX@Z - -*ên _2q樋V^MVOy"d(*Re͟SLji3TnT97Y _*0~=FϿL&RLc* S]LRt}O@:%ʏZ?1?ew V6.a}x4TpWeFiA[B -DN_ &͖l~%CvF|jJ`-7Ijv^Tⷑ%˅*JX/P25K1 PQJ^W%F;(ZKKSK ݶD`.g./*DVəmJeIKE? >Ľƥ+e,߆5'`(#P>J`}9/Wg\'or<~clJ(?SMa|BuQ3؈68JG6Vtwe22Jy:Jߨ[;-,0&<=9yʦ/*:PEG\wPr8}-x-n-85sGN];(~vpC)*QAiO*`RW( Hku,@jgOإT~:Q.IJ麩XyR3@Ђpjr=`P^#nYYG'VmK){b-ey -!uab둊XGU6/O4sNENRڅQ?~n1Xܧoe]CrQ -eTP+PV3Rs̷{ JߋPf޴ -+R .)2!E 9QOi`pb˯Sבֶ%m!~eS˫eW-z%+(B31!xɡ~,p)~,(TBr §7"U nk\DAn Xѝ2ZdшԥKvȠJ*iO${qBg%cV58B-(bFʎ(#M -2AeH3 ue Ɛ<`lZO[%Qmó2 =-`q2kp["/ Oe'{E/jPfK.ed Gv *9QǀDlX.gQڙYJɶ|JLHYEC#J/) -vTlp_ -ܦ-DggrcДz(w0s"8ugn՚uZaUa"Wѩf޶֚ -TVExrRya{PKeԽ|rӴ -|6ğD)ض(RF\v}e%jɃ vV@Lܫ6u9Jؑ&?#k,VW#sT,%a<5{6ыK/b<76,TG(;:1xڛڦA-J"%_@ċ;-\j]j^U'ʈBMX!p*\)'"69,jমq#DȔm٦ܦ伯&u`J?T<jnY T/0|),2^!/i<~; PNooڲ"E[(?;fM%}-֙ Z"f6# 7r͇Kws#%‘g0d<v 7qo)m+ -M\7Tk%]7,lKUyɊƕ0w: L)R͵>;r*:4jA C<PPw%@[ u-4x'̬ų>)ڡK8ވeA5<?xj4k,xyU2bŋ-ON.?Tc av[/"YQIY{2/%ʹCvēKa+nVwBeъBz PNFlaS&XBʝRdl(/c;)"H[9*P )q(^E^A/+T[`j%3H5Z[+YNA* _D^0ߨ܅;ZYSEjl0 _, %_f -/Y]릎%j_o̓rPLye,McXdL<,z益 ]yG_tHnR],Kp.(mFK+bE9-jY`+ ,ШpaK[pr&"ZJp ˗!ֹ0 QAAun _y|nتb3&SlYU[L("JzL,EqedS tW!A_Z2UKe {m߆Fۨ擄]>X_%o" @R^32f:ߪ$Ҭ0P Y:r -=*xl.8 -P&:}0j~6ZE+*&lF4Zm -oOQ,ڙY-YD%XńUُܥ4u׭_{0/J7}ڲq(|0z }TU&,8A+/>*Er~ XLts`~ -٤Ae׈m20V `zJ> -<'M .ȆlCrǒ1i J { 2XW#98Ku.Q2BXxqSWl`7e41YY2j"4r ׳L;0aBEtɔls%<6z7%;.JȬ-j!g?s<ؖC/y5f\a>.Z(v-Zy3Q#ӰTţ̪}KeY.ʁ8GyS=>˵R";d. J/zT-F;H(q,[D%*gPK5hL^˔&߸%@9lQ¢^Q - ߀%&2V\ Jk@W6צ\p狟eԖu>N@ղ;?Y(trkEتGcA׍ڗKQ\ \o+%cvAjyJ_')xEW%$݇ab0^m]BOdw)zFW4շ/ "T"\yȜ,JjC9իDu[,0ZM 6"3@bp%)ud@%%2SMV g]z>/,x݊(]<Tp-jxܴsgk;˲ȁr vR/aZ܋XU죇>H[<\iOq×.piٶM5]lKr\~ mƮ]VB$RTq W" L aH8ܩ]@L#f>7SM9l@Kfukʺu/-jVLD+~ KhǕ*I[+%=|@D,AAJ.eǒcP;iAg0P.dj-[lVLWLU0<}4!5R[jwQ*j?P+Eʕ?TkCP -a{{9(Kj~(8əH(ZePch&ӌ,լٿ3AY)wAV}26w?p;Oew'ZLE4_ہQ| Y5-vF8egb[߆UūBRT,RnqéM.Ũ4EG [-ȷ,2I _^|(}[DH }%H\|#UEE{BהQ+'#W[]A(˶cr.mJ#allD}&G^PbT"-}A؆&~~焒CjݚWمۖ.GEYy[ooה2m/.rw5B,kV5&i5**yʗeQYx NKvԤSȾcβ2o"c~9/n@ٜk^ '3Yr"MYۊ(afeÐke/LnGƜByRe!ƣHm?#:Wwfr{zP/3P +3oS?±l?'ߨ~X4v<ڍ`*ԣĎ/XEF:JIF*5=A_Ĵa;sB.ࢡ:`2+ir\\!]1q'&ˍJ&_ ɵ8K lK-#ض b3A*`oa5l˿#w˔, -渐PFG ݽeIe|m.6FY;_7WELQ5U)y# WŤ+* j/`J|B8?s@]ZSUztňMj12*c*,ۛ?b(D}0UzE"NL[zEO ~\,}cym}f"iXJuP~ #m {5%sp5GF |M65/8~HB7BԯQ-mb LYwljXI &ORg"ӱȯ,PEݜY,9T?ecp͔ˏHudVR9F@*5nrRZEd.?Y~%!˒̖@\ l# vsp< `O4^>"i^χñV -?gN F~%F`P#/(첱6Dwћس/Ҙ]:*ށ ޿&;L+X(7Oi12gQڞnV4-]9"mx\k8& FSU*dS |fѧ -=A_(Y]L^-8jޡ-8H8A - OLlp%L,I T Q9-J%2P^0̶quB :FQLnʨEy7&KK[< q\Ay˙6+5ʖ=Ĥۉw~ !fq?"]d-j4VCkJ"ٹ7P\tcLb:*'BTtjJ1`x lE[ 1CcZn uk {DVM! lm_]E -Pxku \^+ˋu\*} *Yl_{Ukn`@Kl@!ikj0$"ހeƣ#j/ui3Jv&#Ҡ:uGԽax,7m)괎hl+ ZyUvM~Quq݁B JI ڵBgeHO҉w5nFʹ:FGwǔw8hkaEa,>Who -o*lCmԻolysJ$s[G-)`b#)n:DC -gkŧ!g* E;  r&.mxKn*-^14Vv@^\u[xP bPTt"dCƘN펥~J[ym /!H /.Æ;\qrG"-Uo\ ~al7DU A9*~<@* -v*0揶o vJ7in6*0j iVk[ - - -.d<ꮫ<Q0Myv@Xy.\ K0/4CDE j 3dj!v+W%W6TG%ҥWano]>\:r -[#៘_mTu1bxB!p\=VɩDO$%Ѱ DT]Wab [6G40RV[ \/n5\͕.{,>iK~V"Ifmv5Z5*Nʎ3 q{Y~M1˿.۪} FfP~d^ r,bo erQԥ|i)/UlI?|X8vxn>&~O% }L;05qZr[l+o|Wg9SX+^-UJ,\ó*0<ۇN3ñ kijVo+xZJf1EHZˍrz8bL@jS).xbd/̴ǘ$V|aՄ8(1t#YrÄ̰'L.^lZEc,rus>.F-02+Zh'Ioj&DYebx#rwL̲QaԔϨ%}ˉ͎Fc2T>.rEK+jUj"y ?"j[tQ ,wȊ[,+`/[eA)DRSlԫb%7| dgڦ.]|a_2nT -7'{ZD*ړ4 B/[_}LmaR˗l.+˗aBWjIoWMbuHP]Kd(o!.SpѢ_W 0.سgYߨKiql2/Ό+eEG".g3Un@xaor%XYɑItC 扦0iĺ_BV-@G& -}C?1N^Ař<> }\SvxDX ~;/gc_rda@S=V}K`n/ԺE.~f`{/SC~iG]{".J|yl*x% [ɾHreR+)eE\%%kS4'7ʋ?2ۦ- ꧛f:v]TT#a.^O y=ᗛ. n r/-V܈aP-b e U5R"\R9FK;1O,_QFUl!/>\<h1,ʟbcPidhxķ7Vo* B -p(0~媈وyW9g͍f|=+%KmM.< ۋ[Ķ6{5TԿeAqɮ -7 O(X 0= N;ʈK.wb P ocl""Zw):eY*_ISΙ1| ]J/xF L ~<4f E2#̢] \U).M-`vP @rٱ 5LmU.3v/XP4| 0Ƿ :vU؛ʁˍHIImL&8yP56O~6#υLO:7 4y<Z7\!ە́|UUEdzarȌ'^B+&c Wv_P.&KΥz\:)XT-zZ+@Ts⠓Ic - ʂQ{GJ T{/)Qj<ԔeE}츰BO_nU\rdN&n+*Hd"49YA|LJ),W ӴJtP+V@ZcL/N -Ɵ.0eh!VXrъETo4e*r5m閄[*:]J1q+R.2*oKY"PTDhBmS .. ;uT W6XWk/F* ktE"9E  mrԟHwgj -j ٻ{11Lo V/04SC;˃؍gUj}![f >p5jXuz:2zÌ>%ݏĆޒ/*>?bo@6J-`p!UJZeV@Ceu34)jߌH`Ypl,EF30$4 ij*7aqx_X DZ]\`ߣ!x[e2%aJKtQp!o*%Yuz%s>& ZpD7&P \剈L*9iښ+mP*h[BxRE-I[[#W-Dz_cWe1vAҁH~HRm!$JZս >04|!U.$xePzn~(}␼F`u#=H /`P??g> |wTo4H@B?t2Ą}x,>hL1E)ӝ߷~6=4),/`Wb/XTd.*=#Bʣt S-^Vj\R},jΊ#cN9X5Y FoPwu.~g,H6<7 <"N@)Jw R1h>ýHk+RH}4~~&Ϳ05S7ԍ}G*^g Kq;T,2Y`(Ïp}9pP?j YN?ÐJNʟ3toſW*V?űÄ4nS7"xEKzU0?Cgb' Y[5\Y/<4@DlPO.⫔rnhC%~7n$%[sJcbG|R|;"WAh~22e]NQo4O pSQW|B%?^$O^[gdG~,W $~+!HgGX?,D;#R_$c&v^Ev{?ʍ?3uד)Z7ihn~l6ާo#8lD |P{ [F|lȯ`B$S$E?|:Dcuc[Մ:0Pa*[ieГbpG`_ng'X>4s"Y?> T|ڿ#PxS?}0?oH ,N?Gs"*%YY4ނ7FO ;''QGj &ai=IWA E)q{$WdJ$-LROCUu?FCX|?A&؟O7_ZU{TSר'#u1I{^ f:X^TQ(Ɗn%% 8*9w}@*O ]\<n&fEP_fp(oX/bA_}"9B~?mkDŽGI <|Ks|lJ|& 6n3B _T~ j/З`[e|MQgCܕaіCJ}gbCc_ Mc~?F,/bЇDuBe]%}G? |~[TƯz'DJȁOPu,b~A!5z Wl,B1rv{E -F4-AArgmIJ>{"ے+ylnZd?`7f?7Y Y -JR&è۝v$Y*6Teo#-m nu"&o4Sר+.dU&ŹOZ|4 Q^o_nȟ6.FT&Qg$~&W&Ge֖^F%P~)_Q\nBf(tNťU1 %vaˆmJuZ7߸oQ_h,X{%E)Ȫd2{qgc鍸|߆?љw|#jYʝ ϛ'!'" -^g~ -jFc~{0*#?0ŸkY"(,O<| 3?vi84CLL‰GxOj_{AB ~?r?^_H|n=YV4}1,=?{l򽏏Q6XA~"J+{+B}EeFws5o^R@\6s+fRU!jA_iLKZ:~ + H DZ_CQO*WAG⶿j?ѿ򰣝4>?DO{5AQV;"(oFOF \/?(B~^EWWQ_V󋭀:,Q6s"M.?g嫆ÉkzAe3 -nwtx9We %iv, ۋ2=PA`,R٧a? eۖL~U­Zɝf?4nQT>veYo##O6_H@s 2WYb}MʟК)dM )`sÊO5ngR;1FyHj>]_q '/_yX1kJ+ HqO[4'ڏpQoSL?]O1Ÿ5=N~!V&4R#tzA*=I/g}SH?9`1 u$q? 5OLςm˦ӛȄJ}&yiװq oe_pu#HA GC.˗lMpnb=% 'Ma._;nH H9F4Y1t@v8i?.k ɿ&Vd*[VP `{Lqۏk's?7`a] -sAq)~TqpDO}(} -}}uBZ~,yfxݧpeUvǀX%kWP?R)?>3ݟ"22!MIG~[t 2]iMfQsKbFlJ"7 m;TQ<[ղn"ʂA/Qy -܁6瘁SԨD#C*-J#f?:߈9zLQ0 XkZ*473`Ɔ7*@z`c𿭕|=O75N[/*[vq>*g*6ο;W Hsu*ɓ?J0:q~7xk?Ko>TAqM߫=7騟-0(AG Ca>@E -~+ȟ{Jl VJ~F(cEmWmC^sL9Sson9? -HU `}cb5K0/v6G`cnNk*\JYRLR/+"'Liqx @8"6S35.ܢ -7+GPZ23|X&+ouiܟop⋶ -8C_|H֗ӉhY.LkeyuCF//M||To?3??UoWl@ū-={pxJy:'/z9a1u*سJ%?6?2qB$ j7=K{x Z$Ԧ<,eyy`6Q+x=˩K.;Q\eDY!t.T2\.5 ReJhK_?*ZvgܘMd}B:^=;+_Spmn -*V>h$nߕhW㮷w?> -$27M*TDBm?y>6oFyEz3owSgK'=CdY5<(=tx"\vw,e/툟ܾâ+?KWyk=,jwlB}L~GٚſϏEM,7}Z -˖~S Z,?J?#]24ռ??=+@PNUG2_{'u_;__7~PeFU;}.Gg0#,{aH>'DLxg Jy;D*RPJ!hv˴ۗETT(U2v[(ݨ0B @}NrpO7 )gz̼4I3Zw!|km3oA_/s _CVSgyrQ ??ɃW^YVp5b_3M?OP3d([?҈ .fO#O..28_71Lu6ϐG)aHc9c!Oü~"?="k#BJ|%~>>e QPi'oȕML &x%'!t6a\ˠlBr[\EZ\(eWeC%!aj}؆ơP+W‰_RQ(%amI8k+JIr[قIO#U~!?t1jWg?i*+ޙw/ }?yMo;efVbш/ݧg C7QGS?[B~㘿eK%+'/Q嶯 =aCJdvG -DLar邿ߘn]=;/A?~D̃T 9dWzː.b ?$}9tS V|zyaۙkPWN_fJo7ϤhC ߊf~MIw-䎟΀3!L=Zue#:T4V=AȄl`ߴ!sPJ6Cnh~]{5q'i8߃ٔ^Hm_+I/mE?˘?1}A Z?d2,{LPe 8W  -_:-lk o9O*U_="  #VC'k6.$@ȪZ"쵊a.=Ì - eי^1U;"]c -vQr MiUQ?GS_hwg>U x"ˊ߄"Hg_tm|_撑/WH>>t6faUgeJi'*Ȋ>3;Du =&>~ CɈW]KU7w?Iwܟ}! r̀[)E?-vaiDQ˵3\?4bkd PO-cO/}>l -YAY U]d[(skyg\? DƑqحTVmۄRd灄p*o!||d$ ^~s*<;GLCg}_ʿ=|:R9E?pI5:7G\'Ck5=I%o{'Ke9oY 9?d1A~3>SqRo`>}b?O+[;u5Na>?t*A𗸅|Z`PCRO<.E?߉_%?L [pYu/1@.lV*iql#b%^aUa.^Kb.4ȔfC_ʼn$JIR6Q#l\6nا%O?C'~u Ho_Xs>D#{>?U f j!|g5OO&Lj *όwh=%b6_xg_Lk2➾ԎTX7``>kY'SD_,~lǴu1ڟl 'X}vXCi_A3[2%1i0A[}EpkVumH#˨T+DB+{ܥj2>xg~uq&RWH̜?ϓOOyE^_n. Y?E_O~8W?ahWXmY5?Jƣ\|:W+ȭV K1e/X]%6#A3T3LHQ!UiJVaC,'hkƦ>'+wS}ޗKE?'iց0 X_OXW\VSpHEW2B Pb0j[^Pkog  ˔FbU'Z(,-*Ohp99}°<\E -A`2e*Pۂ}f1NKbScs(R뼗dW ۖ#}Hs%Ss/,aR 5I -*kmw*"|PECjMJ򔄢aT7Z~Y&fdI0NUE( --@=e9!%xԨ6&>2uuJ^bZe9Z l{FFV-4EyXËevO2\7_«\{(1&'ز;KL7+Y%[l1e\^\Q=3~Zc cEDg\w(# ^ E@DQh ܡ94.'%lř5]=K@b%Rʍ1- YCܡWෙ)w cS2 |ѵn41G:%]7Zi} 'u6HTiUU-}B=؇j6ܬm.-E%xrزpeHzq_"J|e%FJnVTU([oX`M_O6;R(JBrMcݨ80B-cr[NDĺ"K`n#˩tVW(D;6Mv-nڹ1rc.~-S+e銡WD򾧂S(7/KD~eeG嘖xZO1R~ķҶZ]K|#GWDWE3JVBx& S ՕrUr]}z豞Yz\Zr˗}NKI̊x.Mdn[sc-w&~It|vU2 1c.}З^\:mw7q p12Yezv: Aeklȯ0jYcRi.pYز5\)w%ab "K&[FY6<{Pe˕O!ew&䧫r]^!Qj>0Ҳ#ȝ>ςg"ZbԢ{*eœ-#Wuz.u|oܯ7 W>Tt|\ƪ_JD—_Qh}S-JaE)`RT] xfڛ17RQegpMa5!^I!   j"چ7Qb]N-ߨ%#K~EeAe17VGg?06zJRCKe2P%p^ō,-%Xcd &S+>RP_Ly%k%ܻyl+j=}佔ūP2&U^%{n8r!cȨElo,.[ Y)MYC (?q"Ѝ9_RTk04e u^|C^Mm%[~xu.TˁY[p W>D_?yQ(~?\v~,' -]a0'my 聭@L²`u6*[<_%:ve0,Jv.Hk3%9(E Uk)\%h-rɮU郢nQت)}h|3WF(Ŧk)z܂Y -E:jpg/:J't-9]u'K#+&lĹevi->29GepiQyU+2*S`6{nd6#)xru6Z "킽 ȝ%";-jOgI7cَCwU ,K_QEs,.˾ -+l[fu,_DD3ڢR9z1+z;@e}m LfU,F>P ^%Y5|[apR7eO՗/ޒ`LNzPV:O]+g.?{-qXug퍴VA6=\-I' --VF@KqAPI(*?A7i_ؕ]^\ho#oY]_yn - -&'Z F Y蛑Co+ʘx\"<#+EEZKQwKЎlP&Vor8B rfvAGKזSZKAˢpܕ,|ƃ*x# m.4P^̋{ )?~U`HrBښ@,VLe+@}/lJԳkҺ -ۍӳ(8]0;W, p!6#tWaAX G_\Qva16纁A=.> ]LLG#Mim#Q{KeMbߚG\.yYm;*`7:[N~f5Qr[#AJT:/-MVjWȘP^gUˆ2B>gDJ{X[qWbVKCɕNJmˇT#dW#& IoS:RFO7"[E%IbQhPR(Z*|>ՓyS -R㊣cg3E1苧D?pIi*jkx y=Zo}YMJ%lgKJqHߙp@v`^ykṷ+TKsI*(TZ;*q QqM1K{qf\HiMTtK3OR%^N {KUKbWfZHQiTW[xG`e*Xdۊ-_j)r!U˦juYR - jTXhZ~^!'V_鹬42>,C\刖Ճ٨:R؎LXmύAw6==x%'P} ]CMO +$cXn\"SLbyR!ʇq0Bz_!(TVFL୯nq9p^xעa@q»RlREo.<{RU#l?D.uLA1L U)ɾ~9T)q~"_Ѹnxr eED]΢p0^K:8eŅ\^DͦW]\%K=<,DMT^RE rse~/F`t#p§pr)AQ#b-#Cj?@Ĩ$bKub BJXKѥSp -£JTPZ' ZPOxu]4>joJQ*`!R%0O)̖L;Uv3>[__){k Q]92){-% C%Mr[.]Ը˃e˗s-| K`יݶ(1Xˣ.]UAW# mgYdb췿 ;#fZez2;Q i/K,\`2?zKrDTPufɐP`~ײ#j@K7 r@$χl~D%="6YLVlT+En]JL寐P+[}ԳሴkFS-#o;/D$Ư!Cb]*2&C[glv!J}'XGEs -"A2T2qj5vl|pvbb ٨kܞC aD1#U ef\YiGlir-Tc&$1{^o !E^Ķ2,j2,)^eٷ܊J$7ڜKX#Ii/֥,.3wXKZp>ˋr-7Uv˘q.)?_ k6莺OKa8,zkҧ.wcwu17SarU\@j8{L cU"}DX-*S>\`ql勊y pH1X!vhy ŗۖTl,.^A`xC qƙd[k7gT,;,7'w_Rń݅,> ˎ Oߊah**9Q%)zdJ'LeŔUወ[v6],,; B\U5Mqr.Q.U]K2Ywq| &Knὗ;&,Uר@/LYEKغ}sU[98E%K!jWl'!r.9",ƣ茢fCfA6 nTnG̹rQh;4ȔUu7qAl'IMT B"]KI`ܣ%##,e!lع~`nϳ",٤ I}1%ʹK\{RTu# ES%Gr_hɽr]OXhCj.xbayyzl!K~%Kqa?]^WǙ?sY_n,M[[A[g%Ke@XLڝA>Q}@qT%Q)( |0*SPo)*WGԱn/EdXSAL,nò<1Xy%+LY&L{R\z%]JYG?12lR6VN\M@JgM]IJx%>ZLhSp`DP@ڌ`ad"i\RQȝvNPQ[c|4Ri?rn@r˟#N1ob]BɿvqC{j/E3&6X{c%#Uw`_1j)EDr$]xEe/}Ȓ]>*&~ 2E3#+*r9>;:vX\ rTjTa+V@"US28v;D ZP(*χ;1o&Kn5+\RʔDZHb2YD/.ljg8俨lheC^`oi,0jW .+ieXK|Oh,* K#0mmZK۩w/vQKv+[xqt]g2TK6<;nvj^6W2l -rJr=Ě2YQg*V4@>+␆6;(ZfL-͗ U -/lQrU@1-'&l2";bpڸm",E -OEeq [U(E0wR𙖾`LKK#ev},ԡc4*a_oM\zKĿAo/#NAQH5L7)6ȡU*ioQZ@ `}N;eYrPDWl SJJ P .Qmiʋ}Asҕe -6]ů H -<B὏q7y^xWٞY+1ّ8<{;u+M0[glfQ,0bEEE׽ O4,A>bbYSb? -ϐY .5r`! j,۟dk*,eRUSwN( M1˰AaDc( - `Dʝ1 QJlʊQ2F\ -0bqf jf*Q%3>ԩW{;+d4ADKrS2ɶRZ :1980n0 V,I^+TVxv \l|—[h+KbQC06'e^,m%i 6T\? ܭجvƕTGV!BȊ#wK7\TX)!6G TUQ -$SC#nR*XROi6eePq]noUHտ%VkR#cM0QjJ Ă2Eգc2> -%\g#B DNGx@']ۤǿò΋pZog%qu;JѺY{@)ښnW`IG*YQmDvWR%MdXYɲ+)["OͤT;sn/U'h;Z -`M"UT!U},BD7jlKn\}@h> mbNU@J.QIrQ!13ia)VBZLC 1Ĺj@[eDtJsȵʕ^D",VvTyKB Uu:'M] -6LBbT%oDo -HJt䪇̚\ȕLХ`@yĶ@CXǒyL<~@ #ڟP7T\ vRVqXN 8a)jdF5S/`e_bYg5 -Nd=<.P l%\DF9n:}<UjK.v@T WUQDKCo㌞dksMU`%.tnY ̶?yE Rr+~n4K%&k9#_db -?qDs*=hd: o3<2ߋ1Xl O%:ʀVSD*:rmDi G,2,mUñ4Q˹G!êۈW#~PT3' Z`o>W#sЁ~ lFOdԦvmn`YL x|BF'<íľJYUZǷ6 -4FgS~l φyԯPb\ 6*%bܢr;HZH l^c2ճ(:R=(RͰz Wʔh W./Sl^֘?E}>XJe.R"n;kRz.qk?R3ǫDfں5^W -mG\FvMǐgqMGH&@l-o*6y)V.\$hr\d!doԯ^t 2Ul -g)lhFX)Uʜ` ܔ\ET3L -=JbP,W Yq@p6}p[ǻ =Ɛ!UYY+fFger&x2Y_rޠnPeJY\S2]2?ɘ*#Nijд~yJDE2cݑ8?<Д7: -k˯jh -#`T&-L ,AH%%Bki-:$Hd1Lj> Z.3Qk wTEp\/DQQT 3Fb'={졫-?*ĵCnY]NTA/c% 'ukO)+ `Guq]ש[56t<e^DAF`lU'|<&&]>!?a\&=-_GF<@aR~R-"f9%3)]= O;:o>Q0@ml ƕZnfK zl rPg Ȱԗ__̴ , d6lqᖆ|P>.~C3GH=#N2K*Qa;?;?krn%q#s -^~Ի 1l4Z8 -{iVMY}}rPl;ҩӀ?5+};U-c0!T:Dry 1eDh oR1]RuY~-?.53xٯeY 0WZ@_A؋$d ie&,FY0rkX%r' -W)ipj0qr*tUUEXbĿ0Ycq^%16;=Km2+p~Bx>*2T˻;tbx<~ cREVYSOE^(S,;zv -j ӿo"m'bHZ;^KFV aM72'$KwxljH,btF!"8J`|xb)KyC;_oYKI/ V&ScBO=f>tnV~":GV(8ߚTJw\j%*dp#DScb^ _J~Z¦q7ś6z cƽdEYtuOQT> |y-UqS ñ&F>R lW[~+5ۉdl -wYls]Kfe -&.[[c"#?y;}\e].^L*DKD/* (0*J:*yٗˋH2XUd.ulltLTT-4|fRJ1yC?qJ,9 _oT!F&9 ^UZ.ŸR)Cx^mc)xT=i9#eo*&7еe*ќH, -8`Y^+b? f gN(ژ_e࿏?3F#\!<4T_7dAw<\YE]:iU8Bx}`E*R]`*XJo!} d>!&Mځ1rDEԹgT7J"C]MdK8v,e~ZK*`l(:Q0K'3"z.T\k=JUXAxk :B:KW(̡bP4FL؃Rvc-R6Q-hD@}!.2ʨ j}EJ&ǽz$*C?AQW!U8[48V)J(݉Bq+QL3}e,Z fM(a[C< ?)Ic͇HZ2O02jk*.*bۗSFx!!ۗe-l -@*`B"CaDeZSUÓ} WGZR{{7ǁP[,u U" hOX,Gn{x.`{[ O5fULu즚:xR݈zţ5߮yFgJC{M6MEk%;P# i ӧR;D1ݖܻl!(jU[E(O)'6@ pw!nC<"\1`W>}HWG9.a7F(žܗQASB=^ 6U!POVAwnR؝\دr{(%kUo/Y`\_y~[M~ؼQMw"}2iE!q~ucӁ [6aw; -_Q t#}ٿsSe5N,p!?b+\oP*ظA&*W l-(osN) mED,ũpm,04W6 -R&jQ#UhIziDӔ.vO%l7.2,?l*`Jna*)6QCZ,TYtKV1Y 09@E1@kTA 3lp.U,l# -i \J.uR#P#`_ʧ#-Xmݟ` Dpr4~MOP ->Y -imSCږ'&73_k5Ŝ}aPX&چ;rO"mP,+~cT|v(V Ц+L8W>coSZCCc$~3b;[/5_*Qn؞#RNJG-0Áesqd(l!zV_ v>v ISUA _4oz*Om%.A;t\wپz? -ud”OQWfH}wbW¶Q+f_ -f'dӏnLEWY❍r6[}FC`| [J˖of U4 -,k%*ŗGţ-,oTQV]EJ - ]\ԹYw-mAԿ HUF;/#>^J_,5sU?4L'ظ;!O?@>+bV>ShTs9<5B#;`X/Х.@*y/ƃ.MʦиD}jg/fSp"L_R PCև.TU/*k.!Dv~Zٖ5PlT/.E>M6 XLj]9)f`*'`,˥P`.غE1싐kkjG?*y-|CHiLdKqjbFX|{~⦈KJ˨jmXźAQXy%Ub|>.Zڞe%%Fe! 5yʁQHZ F؇%D*"QӒq.(F$U7RsIC W>gXWQ Wb3Y3*yYc9.3.& Jy -؃_M -2mp`;mM+-< uXke,pn=}VfV/W7QzjbՕs "-џG {9w;5bZ\.⢼vye >|E)|;<Z \%B Ǚ_Qf*6P EPF%%\,ZD%5VřZBmmHta&kT#ҤK8e lX D> -P \)~t]w<EJke2)(3d:27cQK|Ua-\Igf*Ȓ|0T.UPܽnRJKXgb ĵQ\]/H|#g!*- - Ex?]`PjP>^Y.\,+8d-NW𸱝D+ -Р,Z OjjĈ>8AŅiPl"vCi#ױ3 -ukjGVa@("|]QI6r#hn/KJ OtŔMuVk%0H3߳RhRhHcIKo"-Գ!PjG'Fy)> ~ل(Y -|2N*u}z#m .D2:HnŖ4Efe|(fO&!_;4@}(%xXZ~MSfUmL*|W!35EU!H$ӮV*V`BcO,7(\0ѺU_?97JhV]^xo_D},tT? \Á3[ ijP\wd-֐o,r,~ujطd6#1jPT/ÐY;_+dk&÷2U>A~eKc'čdVƊjS~&dn;qk4Pw@WaY2/~Ʈ嘽bakw,BK(@v//c.S[U|T\[)LƁA,,JW\}:Q|lܩ={W(Tnm b3W9kFPxӬ!P}{H3Ju\\:Q,ʰ„b8>WwRag^ʂ nBܱ_mYȍBܿ[ѓJȰ jaߔ0(WV `p0bKcUm + um{a -^Rnv0qJ֖P=ߏPh n<'1E ©nYr<ߋMM~.&;,/䤬%MʁJ:FM;9-Trp.ԗp\ce\q"g aJ.T%uزp6+n8w?U=ry+ǬhPX^%瘆̏gڥڿTzgSV1} ӍШ^$[[NKSPnbly:VnEsJ;PC6Qʆh7ۄ,,S֌žvf!1x@HmU0\ -}Z+> %ؚjk D%%Z3ISN)ktFC2XJ̅x*V a}u|E^ Oc|鋷<ÓZɄ}E.hd U&6k&L;cy -gh<=QԻ mۅ*{Xk =`tg04@ʉϊV~Tqp]أE39!\|_"vX7O@f5+!Qt{7-RҲ%i -Z_?4(E -AbD} 5q.0 U.Q FCRHIJPFW YVVe(Ey!dSȿQ@5zWRqI_]5Ie_\@@@.CަR +n?Ȫ-8J\DlFV^x4!jejG$jmJ< /$ ?LIB6U nx|OP-ws2ד+)R5~* u{b..] ׈92*aMAscȚ(7i(/lI: [5(D0-F)~+e6\^=c]E(TO[)r -Q%Quv;*|rܺ*]E> -azg -fJGfJjrpkA>a}+VGrӷH(ДiIvO#-\iqS -iD*&2! 9u Yo2j ^M'.ŭ|Qtba]!8 Fy{LD6Vp VLYe" CY:„]^\YIUu7nYmG4ر+6E[%|Q%Ts Q%KRTP_Ja{Y,ScKe=̀g򆲴%"u`nv2+xrk>-Ql2ke d.+ FA-|r{z?3OȿrEl}r٤u0.83]B)TBdwhJn/<<Ũ-6L^PX[-ĥ}YNmdLq% -!( - 'Ezg cXlJg `VpEǕ6`ߑ=i("t X4F/2YdwȺO7h;{֟*'C.5Mư>y^^bXt vð;j -¾(~ ]P0~ᱲi"r&myL7 #@? Rܨ]miXqgU" L8!$ vcc>%sH:D!J\S+8\2Z_OKT=9X ,*_6f3\z#<Ѥ%ܞL-[e> +CUUi -?AppZpߖsPTOP0c,;'`<"/Vqxj@ܙzTۯ?[4 Ig[5 L"1Mo.~寚sQ!r'*W'L -X,.xzy.yH>۞)vW-]&3;sSՏlcEm̹qCjT HE:>%1U$0Gs-ғK%T(J#G>*-)/XwvzeVکkר8u -@Ld vxsl&FJ=)Z7Yls/鳬E(pKP -3JQȇYdrC/e5*3~0sRdS2X58j獬@o: 됔 o"MR56IkX˿eqg6!/{?eolv%i_ -_YRxAxn_7}-P(.}@VԬI1++ĜW`CzH`T`q@uuJ [. O ԧc a< z>rX[qe2 Q+eO1$*\ԌS,`Ge#ۇAP +{++.)Gܰ +%rL`PrX`KWiK,Bˈq0R*y}ER+\7EAh+gթ'op .ڙ"p8U|o*U)"?&&vpoA,,kF_&+z>^ ,uKAV -`U0t~!60יL)YU[K*Uʬ.}NH82'nRXm*Jd%.ξ_&R7Y̝%W -lsc1k {YȀ=E-[:kOKۖQ9eI:[\V2VN3^xKOLOJ-.!ƹZZW]銞*R ƯۘHj/jE)AQmUsG?}eBbG2ޗ`S>Vn%Vw[pO&靋֏-F - *W")]"5&"T'ʩnj3Q@]4V JCڀ4k++B *7ɫqݍSPD|KڨQqlE-0.O5HxW[w!r4D⋨#(l"\>r/^D -|8D c ~o. rS<͛m˲p.Zܱ?_#HGYw,vNس5׾(}>(0⽋!KG~^2•yl[Zb.JxZJ:(fP=uMHAd|XPJ%VW/U`ֹrse^wSuacs{h7i>uE$to~0>D.)PKDT5mQSN|b$UFʃd1s.=bRJ.q4Bi`\-$~(I$..!Qc9u5O͖;..Y~.Q~&A(Oe!/5iTş##>S -heĂ嚸ģe'A.R6W)PAX\u쾏ʣb\v+V 1GVcq2SEowP-_&"(H\ߊCLMa[7`Wwt3fR0\7aȉyq{TaieV}D-(?@0 m@ILJ_E  C -TC}G]'࠺JLn 1L -/}#Ux(Ab$<6*D pXC8\bnjja)gLǀ4kؾ5s,LaPo"-rN7 Wy܊E+-Y0~਌Bې-rWcx)+JŀՍ %lie\1^34'w\+ !骾w# .%a,c~,]h gNqII`[8Cq|]ʥ}T@wĈYXQ.ݔ ;<*踱Ge5U -+y"/ d#.V)rSP,ȷ ^U9ʘ* f@݃1vP瘄..Bhw%- vڝmS5nQv)  90~v9Up.4ظCl[lK"ٷ.e`4ªmCN(͔n,ObogE -{:i 5c e v_8%555 r!0 J'77!b@ [W)4߄)\6 -f6qZ*l .-Q :A6~W`5DjƐap1}pUGTT&V|S0>FpnY&L> j~eN]n&ᓄ9&KA;*|Ul9ՙ_h&Yd -V.狽_˗I[\3(Q@|؃l˗l#e*r 6K 0 /|So6_r 0i͕tURcɥ$n%ܢrT+-% -\@r,.a8>pi/Wl - 2⍸}x6&U)nƃg6TUM=R~P_VC6´ݪ5tU, N -T5K;U]l&dPJ1 -:QMw1+)aB]/~WM)iRܸ6ke`LƸա5.Hmjgfõ*'Mj*>%N.\nk^#VV^~)yIK_$.RV"̉ _r,AUVåv9Rbh-7XEN9vQQzGT5#ATò`)gV=HyX"%fFXB%Ao%ybD)';%&5r }<{lۺCNeArkG#SLwM_jƆ&<>lʮ8 -'|~Ѕlۨ)hvS`,IpLj[Ud isNʸ+tG.rMO2S|WsIS ?nYP*p9M*d -5BT ԟ/d#t@ +5<d5pKzDQ(ȯXTy&pU3*vf-̈Y춳pKc+H yrgM:ͻ=KLhzDŽXK%.˨(Xs6b{n@˷r!iw#c?yq?Ww8Ș+A,PCFb'oQ jU.PJ^K8]lba鉄lȕ4B MHJkbW G apLe\x! A k?0Ѐ=d]2Y{.jRiqvS @>R[q%=A -coJ``YKMġj2Yr'~/X?Q+^K\_yEMK ]w:U=A -VZg9 v╡Mk(O኎yW6鿽"Bߐ -b~;h-`Pl(*(2 [Lȳ+gb\YJ5,_YbLcvVeM+9KWa[ЛS{vpb54]B -c3>`rx}]¤/y,2ݐ%@f _c8KOB\}MF ȵ*Wy (Cܻ0cϿTX3sc~{ x`'h>e2= -: "Ax+?$qIeirE_{2~PWR+#=XGIwP@hd*\/ȦM_Y5aq -߄*ەEԺ߂t{r*n]5Y(yVu)'eդ|NGx ĩqh^+L*Y+o~Q}g)|i,t7\bT؎pJr#+nipL[VUq\ -09tk;r9Ʉv|^9s=H'㉗rƾJbUGsl(J6P(`:YY(b<Ʈt'XzBY,ٿ'v/lo.6iK(}˺ʂ<"tڸZ⽍_"nR/}|쨔v}1ȏ] ;WyH r)~ajס4O -^M,h YazBׇ9L-LtغV1+*yfW|+26tR7G;MuITxUll1vG㊨典 -rXB {%Q) O0% l(~猏3bh#:Ed/bbQC@pYfeŋ5 ^,saq_fGy +~ʝ䴸Ùk[si-*N`•.kyf-b.9Q`儯 >$Di%AL΁YP*ZEaQv Dȿ ,7bk.~R?DBe p inxjaiH ݓhEET5b2Uʱ& -U0 M!uu Ff (n(RlIo ș[ _82^Y^K3b]6ª,W"Jϊ.R&@Kkl='`>*ni۬0GUT'"[D -ms²YX++2n^¡ ζW`1k@~wVH75G_UT6XYzHXBIݚX!#k䌹\s_łw[ !U_V E/Sðis +eR 5 ט|P$v 6xb\o%4ljUA^*62Gd{d%%apTyoicoaLm,rO\+ẫJd -( iRV%Eu<|jTƔv[̸4M3C 1;K6@XX J̢~б Xˋjuޑ8Y8:ߎpY+bᄊEc1[dSr`|\.y/{:uBW&䆦79v_XjC҉A6653 -eTO'UEVLԯo T;TGH,Ie}Kw xʦJʯĮdf~*\|Fb\^YB-%*"[+Q4mȗSAL#mF8ů#E6&bm{rE]s_w4a\\KlmGGm$9w<.\ -OnKB 4v:q$}b$b!yGu|R23_O~*8_0t2n|?<[ՒUC -)D ^O*͡OK0B>(YI'&0ۏ`.y<((qK`djq~(}L)>E܆O D -j :lKuX(e,sO'+ԹyP;,ʂ\+dcjTW6'Vy2+b0>,Pz6(%Zad*)rXw7eK~nq{!>9y+)87Q.{bD*ʛ 'A C d/06%@p\=oƦ#+AmQu矆\6|4>w35)u{?TK0sny*fBǂ(ܸH5|U l?T th4*N )L!lq\a<.$ɽֿ ڐjȦ +\DgWu0J\unnW򖋫S Q/z8 -L51 m,8" -aqI&EĊyQ\Բgʋ&\nQKOcZE@ƾЈ`_U PƸBlቷAݶ}!+J~$/6V@8EXBl:',j(ra+d,(T$>_ 1zc]smiS>h|iB3JLPha?C-Яq܁S?(JOS`>%O#aa5-c{k Wo -F2 * lj._ .| [)̎Ce+*9  j ,>*N\iˈĻ_ gd#ʗ|`>|W>R|/7Gn) -k&>Ю|eD<_"zoyJƘZTbj-s{ (4{qu(]^h -uO^]Bh)'B -_TKj bm!g~c%(r&dSkЈ jWe0i:.v3{. )iwap2^US9C m[<|l_~v;2~Pf!طar2&DX KE`Gug%Ua >/%"2tQ b 7ɖ&P AStKCA5[Ȓ2g/ nVD+k)l Km'c~dR UeakK55_.(%2_(C+f]^fiZ j)1}Z9dŕ}\v۴C - -myU=] q2 L|˥؟}|] Kc{1Y&8y'D"dʆ1hܶ:h+ܭq! X7ΟP](uׇ`V`Z3rM`z߶wk G#( -  -;"+A([!v<߮6b2öeZzCHW `FۍBxՍ.?Yk,oZ&l7=4>_Ŕ{OHYԋuR0jGn%yR.0yE)n],ːJBE‰qc춶\|)>Lc. nqՓ"W-ov7q<5ZWˑx!ިCйIo cuJ )&xmX?ĔklQeguRKq  w1]N1U9o#W*iUc/sLL<%7iAMkdtו&UbHNo~`RDrVEG(<\X9U}@A֠?(*\@AuCP?d>s$} -ʕXC2Jb/`\cDŽ)+DB;ҿR]/!4<@LG;p9'T(0}5\j.ƕ)t%>oLjoKUWLL AMw>6͹O){Ř*żOyL%[ -2#(iBbxR/}5P+4QxA/4y1p.*|SrKŪa.Y&S:PYr /mK3X é.>%x~22V\m QeX/N,a`oF}P0cYPJ}o9>F~Թ3[pGTINhWc-BxXP~C@o:7{AG`0T9嘱i3<+ 27$;?F=r m)`7<]K.~%-@-~ # .awdiXJP2gRV,1v)a1칳5,e{ &^l\uhVHl'/2 kg7G^~IdVHҟKʕ`*7qkz,ԉQ "?%HȢmy +?H>YWQnx?>嗠%ܱiHk[2Е}H{>>w0(a R /Q?pE64;&bp\DjIN#}Lyt:̆.vT[z&#Y*;S~\O#@ao5i_PƌK9[v1W -\,(~$n CM#(vG>UibxcaZwnqQ;+Yj£̎ -Cl} -bٵ@nų8C97K@ ̶\ج,hV(j)]\ۙV -3#jAỐ\O ªM"I"_Yh¸M@*wH\FqiWU!( yU-zpVF8^@s^uUPU%~ Km/gB.ޱ[K+QV%CY' d00,XUu \9!&yHk-%9[单c5(P^؞t -}FW ~Ztˡ?{X h/p6ҫV2ZҎzym'$Lja 1NKVDdœ#fVYdB4z>BTZ+t"q Yk9$\}Uel*կ%R$+zW -XkܱE֣ܨyo -*^UM)JCMH…TxCC}7-A -TsHpIQWC+  P2T*70&e#vlZSAJ~@@QA(PۂfDZ: be䊺FWSEANB*AL]Z C.F֔(xd$(J)DcU[TAV%{\FnÙU)>.sSR}ԟ:^~``;t4T .^T -, ;S,.EqX -%s` -e@< ]ƣj_Qeшk!F85e kqEOYue,fDK΋٢^!7c {?;X-0P1pUs. c-QgY.7 -nmZЖfJ4RE|suP6cDaW'QEnIؐT@Up%.%ٜ0.r7ၭYUنRۓfǞDᶟjF ̄Ju$va-|u@ Z ZT"-%Y{刏&-1p{'v26j$kvBRP<xPjVm _/ץI(kϧ얥3CժYTlLp~b>B>WuQ|^JW)ժ -כdS.P0xBmM41~62m7`^gu] `mM{eJMb5yPhE9QyDZx&qR9xfai@v>~9R=bkھdZ3VRڂ,٦RDG9eT]u׷)Ϊ- \ @ iG?2E<#c֋gfήk -{2B9ʯƗHc(nWZa v]ڙgHV/?{pf GXt] -IJk_hfKN*=Իb?@aZ jцNqs>tDeڥe'* W/Ӄ)J? ]|CH[?yfh-ګ?n'TMVRMӟ'D ^עJ =_ e"\$Vbs$ċz@12y@ e0&¹N"1\J\9(,jUK.x'5i]캨v?Y߅7wyn@j(B¦W zژ0>U*!ȿ^](g?^_1SᴵT&bu_"8J?ZKCs}nw3 w;-B\JBT,X(HOF/b|R?qjf >m.)!6~~͵w*=O֭ĥ' -gjlɗ[`& q}|XE?5~IfMCU.0 &K1q?U=!DChj3Nz!L_ķW4*x{,cȱ ,0"ٶY 'D-Yq9<ܽ_Wٱyea+Xya ;OCE>@F"uKBCI03K\U} T_!Z^NGo?XCJٯ}gGI9+u_1FpFvoQNVO+{:ʉ7Q)=Jk<ܫ~P=T .pPB͞򱚶bS砳FM^ct'Eni.C̽=NKTa'`6T@/KGؠMcŸ%5RqFh#ÚQ62ҖгSl`SOǔϼ[~<`UZ?ZmtDEpĽ-aP#-9UH.KWBRT*i)#x_ugG0JёGh[ 6#qr.LIaUxFϪ3?g/ Eʖ/)b*WRcWDr}~c` jNԬAe5yon?ˉ9l/%mVyG픶Zlb}6eu{Sv{!`k-N.eف%iL -ejV]1~]ed3գ*Pښ/`bP8?ee%笠BW*6^Ŷ| ՌUً(V-.TD1p_RځyQW#2|+tjYfEBoC+jy62ʕCIgy9Ҙ fU~%e#~ɿ#ASΙW*⒪tIߺ!L"-)jDXJ. YR%FoS[1].T~7^Lаlv"TM}Cna{`״ :JܹE6jTk7e3S)"i3(/uեW(li V" q!]EDYf5/x3tz0BM/VXK2(a% J j4’VVv (Ʒ]V&HǒGTy3Gژ|_@ -a/^"mGWYB|ܖ\@طq^ưi{߇%Q b/͏I4ǐ+ 6WPƩ -Vv".BDFV |\"'"[ʸQȧv%A .Q/,ո/%&Mw~5nmN]RT?"Sa)*HTbJe  0 Mk}QMRʝyRPTo b -}D]a"cDA| X.%*]kbBpXy-FȠx%J|0ؼ(ܦ -ԳYL!HvQXls=Ţ rJ_joL<,瓑l#n 9 gV=.ʺYBX+%ș< #7b=Ĕ/R!lTe`B: `l\Cb- &1r44j+ܲvUmT7/X}Ŵ!rZAY߄='g%#[1qpҹTMmf^%Q2XPdlMkfD.)u /cY>eU?u`EJ7GglX5 tQ e\)1i(N{ d0.젩i1ͩ~!||]CK(Jv? *l]A -*݊[*iM0JJ!^ .S`;+² VF%,Z6 ە 6+9o4l{d@K6%VCQ IehZA (oOoD@s&'IW -b*<}‡6 KPke#lFvY, dہM =}5!7v).Zͫ).*㒭s̋.7-@ m*Qrꊋk?1J]ԣZ)F#rAh5rLegǓ|nS#KGkn -'cLRQRMb.b@u>ˍ2'GbDnh)cvõIU=x6ys(XY -mpli܋9RonPP+[᥷*ط˳ ]r7epw- ثR%aQJNAwrkUeK^J - (v_ʍF,Cd%"%[^!bϹpZK,IMv6=L1w%59)e F?Sĥ_I% ՞e<*c*j,.CN=%˖]Ki"-,av'a-9cNE󿩐pqLπN]V0Y.` mpA8qy)0?i8\3F L̩ܕ iy~bŋBuf SSY< -A.\I^.AH Ư"Lc.<7.-C㊽QW\P~ b]/nRTدRY-1E]rmƽFϱ sЀ*_ _ -6VZCe|~b.Ї"WYP2_#.??Ə btY_ӲĦQ[w7|@:?Čk<3e*&Tl=ϸJ"n';psnG7ݸ-Y;--SPįy[/6YUY3Q"*qi-؇D s"H!B)HV) ,UU-tj=@BxEct[y"@ln˙v<>'Mڈ!b7$U|EP -!VË1L8\i"FQ0^ -2-ܵ%bcZT7S܉7 v%Jd+MIrnm4>JfXHY.yakqlY*_emɨEШ% <7d]ܦm[T!+v=v KR1b.90>6{RRV LK:0%F1u2 D\ xa!wy)T;qɥI1*%l}-pv]`SE;`P*zYQ#EhS(latѕvzFW[CM TQ8uYG<XpZj+kbu~4OпO=pjyOawax-M$kߺ])#WHdQL7a?1%_7WG -2ڊaY U%=`$UaxY"e?bi@;% @AP`0p!1Q?_;~~P k\U9jh9^#<f>ִ&Z~ړ L!Ds|@V&,ݛ PBszvOz}Iޞm< 4f oCp{#*11up(Pf +5%lvB -(PaB -(P^*J^Çx8u8su=;:N/ ~.4 ߝf+&cb%bWy>sA+ΌL@&|&fCn=,_<\9% -JƮl ᐬi݈*ݞ5MzpwnnNS]9ϩk\@> 3:xWǞ/F -ϒ7noHu -+ĭ -֌T.N>tJb.4G~/TUR䇁d&d$'(y6$YffF FLb0cLLjE׍Fµ"A 0@P`p? _ u/Ʌhm/#"%_s-$I$I$I$,fgAG{/ܜ-OwV(H}R沅Z챕ᖻ,xl/eieV/7Fᲊzo|/7> νǏ" -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000010064 00000 n -0000445565 00000 n -0000445696 00000 n -0000445894 00000 n -trailer -<> -startxref -446031 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/579bc3e9-41fa-4aa1-8fc3-c9589fa2f0f1.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/579bc3e9-41fa-4aa1-8fc3-c9589fa2f0f1.pdf deleted file mode 100644 index 5d78f89..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/579bc3e9-41fa-4aa1-8fc3-c9589fa2f0f1.pdf +++ /dev/null @@ -1,1139 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 284.5049 0.0000 0.0000 792.0000 0.0000 0.0000 cm /Im0 Do Q q 0.1922 0.0000 0.0000 0.1922 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -30.386 0 0 47.5 65.13 3457 Tm -(NOS: ) Tj -39.1475 0 0 47.5 138.63 3457 Tm -(1029812 ) Tj -31.8513 0 0 50 63.67 3401 Tm -(OPERATOR:ELEN? ) Tj -28.3739 0 0 50 338.47 3401 Tm -(SOARE ) Tj -25.8674 0 0 63.75 65.11 3324 Tm -(NR ) Tj -33.6573 0 0 63.75 117.84 3324 Tm -(POS: ) Tj -33.1591 0 0 63.75 196.65 3324 Tm -(C3POS-) Tj -31.4652 0 0 63.75 315.66 3324 Tm -(CT3 ) Tj -0 Tc -61.25 0 0 61.25 316.32 3783 Tm -(e ) Tj --0.035 Tc -30.9668 0 0 58.75 379.81 3790 Tm -(JUD. ) Tj -30.0064 0 0 48.75 468.68 3804 Tm -(CONSTANTA, ) Tj -25.9378 0 0 58.75 672.88 3810 Tm -(MUN. ) Tj -29.7371 0 0 48.75 765.68 3824 Tm -(CONSTANTA ) Tj -32.9481 0 0 56.25 468.39 3753 Tm -(STR. ) Tj -30.1366 0 0 56.25 566.78 3753 Tm -(ION ) Tj -28.1844 0 0 56.25 635.86 3753 Tm -(ROATA ) Tj -28.698 0 0 56.25 749.12 3753 Tm -(NR. ) Tj -0 Tc -56.25 0 0 56.25 823.32 3753 Tm -(3 ) Tj --0.035 Tc -33.0909 0 0 58.75 61.65 3186 Tm -(CLIENT ) Tj -32.9284 0 0 63.75 203.65 3193 Tm -(C.U. ) Tj -0.0087 Tc -63.75 0 0 63.75 263.53 3198 Tm -(I./ ) Tj --0.035 Tc -53.6974 0 0 58.75 338.42 3208 Tm -(CLF. ) Tj -40.4222 0 0 51.25 444.96 3222 Tm -(:RO1879855 ) Tj -26.9316 0 0 57.5 55.5 2521 Tm -(SUBTOTAL ) Tj -34.0229 0 0 63.75 322.84 3659 Tm -(BINE ) Tj -33.9796 0 0 65 423.93 3665 Tm -(ATI ) Tj -32.978 0 0 61.25 485.92 3672 Tm -(VENIT ) Tj -33.8209 0 0 65 602.75 3676 Tm -(IN ) Tj -25.6086 0 0 62.5 660.88 3682 Tm -(MAGAZ ) Tj -31.7559 0 0 63.75 751.77 3687 Tm -(INUL ) Tj -33.5478 0 0 61.25 839.84 3695 Tm -(BRICK ) Tj -0 Tc -67.5001 0 0 67.5001 955.75 3697 Tm -(! ) Tj --0.035 Tc -39.8733 0 0 43.75 503.57 3626 Tm -(CIF: ) Tj -37.4702 0 0 43.75 595.81 3626 Tm -(RO10562600 ) Tj -27.3716 0 0 62.5 57.86 3052 Tm -(HEY ) Tj -30.4245 0 0 57.5 129.92 3061 Tm -(VESELA ) Tj -33.628 0 0 62.5 254.52 3065 Tm -(5L ) Tj -38.7587 0 0 53.75 314.72 3076 Tm -(INTERIR ) Tj -37.1044 0 0 46.25 476.95 3094 Tm -(UZ&5829791160 ) Tj -0.0231 Tc -35 0 0 35 55.5 3004 Tm -(5701334020560 ) Tj --0.035 Tc -26.4211 0 0 56.25 55.72 2186 Tm -(CARD ) Tj -28.2692 0 0 57.5 54.86 2119 Tm -(REST ) Tj -36.7184 0 0 58.75 499.61 3872 Tm -(CUE ) Tj -28.8561 0 0 58.75 590.86 3872 Tm -(HOLDING ) Tj -37.8406 0 0 58.75 729.3 3872 Tm -(S.A. ) Tj -29.8245 0 0 52.5 55.86 2924 Tm -(PROSOP ) Tj -33.7908 0 0 52.5 180.85 2932 Tm -(4STR. ) Tj -31.827 0 0 43.75 289.85 2947 Tm -(PROFESIONAL ) Tj -32.7197 0 0 52.5 512.39 2954 Tm -(STAR ) Tj -36.9624 0 0 43.75 55.95 2883 Tm -(UZ434101137344 ) Tj -40.1295 0 0 43.75 325.49 2883 Tm -(6425667000530 ) Tj -29.2671 0 0 56.25 56.86 2791 Tm -(PROSOP ) Tj -33.7908 0 0 56.25 179.85 2797 Tm -(4STR. ) Tj -31.827 0 0 50 288.85 2808 Tm -(PROFESIONAL ) Tj -31.063 0 0 58.75 512.42 2813 Tm -(STAR ) Tj -36.8169 0 0 47.5 56.95 2743 Tm -(UZ434101137344 ) Tj -40.1295 0 0 47.5 326.49 2743 Tm -(6425667000530 ) Tj -30.5273 0 0 63.75 56.86 2672 Tm -(FIERASTRAU ) Tj -34.8558 0 0 63.75 262.83 2672 Tm -(MIC ) Tj -28.1152 0 0 63.75 327.86 2672 Tm -(DE ) Tj -25.515 0 0 63.75 382.88 2672 Tm -(MANA ) Tj -42.315 0 0 63.75 476.81 2672 Tm -(400M ) Tj -52.4414 0 0 63.75 589.67 2672 Tm -(220 ) Tj -34.4063 0 0 65 55.83 2600 Tm -(ME9001424 ) Tj -35.3216 0 0 65 240.5 2600 Tm -(5905061 ) Tj -38.168 0 0 65 369.59 2600 Tm -(034740 ) Tj -39.6333 0 0 52.5 55.85 1201 Tm -(Z:0297 ) Tj -38.8688 0 0 52.5 182.81 1201 Tm -(BF:0160 ) Tj -29.842 0 0 56.25 61.78 1129 Tm -(ID ) Tj -35.5265 0 0 56.25 110.83 1129 Tm -(BF: ) Tj -27.9066 0 0 61.25 55.75 1985 Tm -(TOTAL ) Tj -26.9371 0 0 61.25 165.76 1985 Tm -(TUA ) Tj -0 Tc -61.25 0 0 61.25 238.86 1985 Tm -(A ) Tj -61.25 0 0 61.25 276.26 1985 Tm -(-) Tj --0.035 Tc -31.535 0 0 61.25 311.8 1985 Tm -(21% ) Tj -27.2651 0 0 56.25 55.76 1922 Tm -(TOTAL ) Tj -26.4289 0 0 56.25 164.76 1922 Tm -(TUA ) Tj -26.7539 0 0 56.25 236.87 1922 Tm -(BON ) Tj -27.4226 0 0 58.75 55.11 1854 Tm -(NR. ) Tj -31.2244 0 0 58.75 126.85 1854 Tm -(POZ. ) Tj -29.478 0 0 58.75 218.94 1854 Tm -(ART. ) Tj -29.842 0 0 58.75 315.78 1854 Tm -(IN ) Tj -30.5256 0 0 58.75 364.85 1854 Tm -(BON: ) Tj -38.9622 0 0 50 54.27 1004 Tm -(S/N:D84700011006 ) Tj -33.0263 0 0 56.25 54.65 938 Tm -(CRSIER ) Tj -41.7538 0 0 56.25 182.54 938 Tm -(1: ) Tj -30.2988 0 0 62.5 490.68 1402 Tm -(C3POS ) Tj -37.5439 0 0 62.5 579.55 1402 Tm -(-CT3#1029812 ) Tj -0 Tc -67.5001 0 0 67.5001 851.63 3026 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 67.5001 873.86 3026 Tm -(BUC ) Tj -0 Tc -67.5001 0 0 67.5001 949.86 3026 Tm -(X ) Tj --0.035 Tc -46.0425 0 0 67.5001 987.71 3026 Tm -(20.53-) Tj -45.9089 0 0 67.5001 1121.71 3026 Tm -(20.53 ) Tj -0 Tc -67.5001 0 0 67.5001 1236.85 3026 Tm -(A ) Tj -68.7501 0 0 68.7501 849.59 2889 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 68.7501 871.86 2889 Tm -(BUC ) Tj -0 Tc -68.7501 0 0 68.7501 947.85 2889 Tm -(X ) Tj --0.035 Tc -42.4687 0 0 68.7501 986.51 2889 Tm -(19.55= ) Tj -45.6196 0 0 68.7501 1120.4 2889 Tm -(19.55 ) Tj -0 Tc -68.7501 0 0 68.7501 1234.84 2889 Tm -(A ) Tj --0.035 Tc -26.2584 0 0 58.75 549.87 877 Tm -(BON ) Tj -30.4536 0 0 58.75 623.86 877 Tm -(FISCAL ) Tj --0.0224 Tc -50 0 0 50 447.75 816 Tm -(R2000221497 ) Tj -0 Tc -67.5001 0 0 67.5001 851.63 2750 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 67.5001 869.86 2750 Tm -(BUC ) Tj -0 Tc -67.5001 0 0 67.5001 945.86 2750 Tm -(X ) Tj --0.035 Tc -40.5919 0 0 67.5001 984.58 2750 Tm -(19. ) Tj -43.1315 0 0 67.5001 1041.39 2750 Tm -(55-) Tj -46.1102 0 0 67.5001 1118.38 2750 Tm -(19.55 ) Tj -0 Tc -67.5001 0 0 67.5001 1233.85 2750 Tm -(A ) Tj -68.7501 0 0 68.7501 853.59 2613 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 68.7501 867.86 2613 Tm -(BUC ) Tj -0 Tc -68.7501 0 0 68.7501 943.85 2613 Tm -(X ) Tj --0.035 Tc -42.3228 0 0 68.7501 981.81 2613 Tm -(40.46= ) Tj -41.2123 0 0 68.7501 1115.81 2613 Tm -(40. ) Tj -42.1185 0 0 68.7501 1173.81 2613 Tm -(46 ) Tj -0 Tc -68.7501 0 0 68.7501 1231.84 2613 Tm -(A ) Tj --0.035 Tc -27.9653 0 0 66.2501 368.86 1069 Tm -(DATA: ) Tj -41.7812 0 0 66.2501 477.74 1069 Tm -(22-12-2025 ) Tj -27.8792 0 0 66.2501 680.71 1069 Tm -(ORA: ) Tj -43.8597 0 0 66.2501 772.46 1069 Tm -(14:27:53 ) Tj -40.6712 0 0 57.5 1135.58 2548 Tm -(100. ) Tj -41.34 0 0 57.5 1210.56 2548 Tm -(09 ) Tj -31.3424 0 0 68.7501 317.95 743 Tm -(UA ) Tj -24.3105 0 0 68.7501 367.88 743 Tm -(RUGAM ) Tj -27.3077 0 0 68.7501 477.49 743 Tm -(SA ) Tj -31.6239 0 0 68.7501 531.85 743 Tm -(PRSTRAIT ) Tj -25.9115 0 0 68.7501 696.88 743 Tm -(BONUL ) Tj -32.2992 0 0 68.7501 805.85 743 Tm -(FISCAL ) Tj -0 Tc -68.7501 0 0 68.7501 937.49 743 Tm -(I ) Tj --0.035 Tc -27.1534 0 0 70 257.96 677 Tm -(UOCER ) Tj -37.4292 0 0 73.7501 381.6 671 Tm -(CLIENTLUI: ) Tj -37.6326 0 0 68.7501 586.6 669 Tm -(08008 ) Tj -31.5951 0 0 68.7501 696.85 666 Tm -(BRICK: ) Tj -36.1034 0 0 71.2501 834.61 661 Tm -(0800827 ) Tj -33.9295 0 0 67.5001 957.85 660 Tm -(405 ) Tj -34.1081 0 0 73.7501 277.7 613 Tm -(TIPRRIT ) Tj -30.1696 0 0 70 422.85 611 Tm -(DIN ) Tj -30.1811 0 0 73.7501 495.68 606 Tm -(COGITO ) Tj -29.1571 0 0 71.2501 623.83 604 Tm -(ERP ) Tj -0 Tc -71.2501 0 0 71.2501 695.49 601 Tm -(. ) Tj --0.035 Tc -34.2253 0 0 71.2501 771.63 599 Tm -(00GI ) Tj -34.3697 0 0 73.7501 839.69 595 Tm -(TO-ERP. ) Tj -25.9125 0 0 71.2501 970.87 593 Tm -(RO ) Tj -0.006 Tc -53.75 0 0 53.75 1132.12 2213 Tm -(10. ) Tj --0.035 Tc -42.4 0 0 53.75 1206.55 2213 Tm -(09 ) Tj -46.1994 0 0 57.5 1170.5 2142 Tm -(0.00 ) Tj -46.1102 0 0 58.75 1151.38 2003 Tm -(17.37 ) Tj -46.6007 0 0 60 1150.37 1934 Tm -(17.37 ) Tj -39.8763 0 0 102.5001 645.75 1108 Tm -(20002214972025122214275302970160 ) Tj -0 Tc -55 0 0 55 1229.75 1866 Tm -(4 ) Tj --0.035 Tc -26.1471 0 0 62.5 1015.11 1191 Tm -(NR. ) Tj -34.7737 0 0 62.5 1071.92 1191 Tm -(ANEF:0001 ) Tj -39.1032 0 0 80 1032.65 969 Tm -(TD:00064686 ) Tj -33.6323 0 0 68.7501 1086.64 904 Tm -(CRSIER ) Tj -0 Tc -68.7501 0 0 68.7501 1220.59 904 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw"1 2W/>|n?N_#g'/fOv?|<m6IxgYs>8= sXBE `bY@J ,F6*İXPPX@aYDARl I&Q`$Lcan4XX DPP@!PYa -@ -IeB(Y@5,ڟKKKK -e, ,e",RⰨ" `2Qe@Iq,e$H"X Q@X(EbRk깎",( (PHRB(", ,Y2 -( (Y`%YJE(@% F+"@ ,($, ->K}&-QeX% -J(!,R(" -@B,",)bX@,V$LrƀJ1(DX@E a,ȀKP  ! - -J"D_]P*, B%"K!+$@ -$X I $KUfD(X@&XQPQbJ" -BJ%(B EEQ`Snq@.%A` XPED%Ya h -!(. "Bİ\le @[e* - `(X!RJ@T%`QeReQ,K( ,gofń,@@J\r%E -@P%T!WY *n9bTDV4,,K Ae@(DA."AF+%U6y%X!`(e%DPK!`ZJ @ `,@ ,KJ[12x|9:.K#_}7jK1,BAB, !H.%JT0(J%@x=%!` -J`cBD,@ J J"'SM.|Wlx+_厓䓩zaWhqz9S|9k7ܚeҽuNY/w@ V%)Hc$$% BY , @",,!(BJ1AJ\rXE),G%^[>vm9Ώ>ћ˶v{7߿Mg x]mOv]>ϑ}vDvG-v%\{vz~2Km<=L7 -`F $(% XXEE d%Q% `QowI$PTXI,BKPe'&e/?U__wq|v|?WKs5;E>=4[Һ;c}=w5ڗCKFoe|^}(Q(AXJ1X%X, -,B -JbK -@` w>' - $,c&6SK,!7=i?p{%}_?||bk>rPDHe%gDjr1|,,?-zZCOgkK9{;UgrXX%(E)Q,@ק,QX( `2ƟKTC+),E>n1d{ZmvڷN_TNףsjQ;7+-Ff,ﹾQiwRWu:WA֟qFQEo9ޗ]!w\6Ggտ/n۝9^#ԙbJD` DX!a%9ARbfDQ|~b,K@!PPb* ,,1gqa N8궼v6YE1xCwO}Wwn1~xEXIarƉ`J@%DDK"#ĥ%B 辟1c!(EQ V)VY٣MW\*e,dp}.P4[ /Au>pvT3~/G!>!|y}v¾]KlmCs^S:s,?o١բza}$ahYbK*z,@ q*R`@!RX,J1YD* ,6YD1J BXKH( Z?&_]Os~FXɯhS}zl;/X112He1,Ɖ!,ϣgY퍌~'c|ޑrgSq~ggߍJ 9_/Wv{-NR%@,`H. 2 ",XDIDXPEtL3 ,* @(@ %B - E㐰d$|~ܹsw}z\/rkzw|Jn\Hz:mo=T rÃt;Ovs,R,*R%-J `PAq1DX)%X`XPTA -'iO\zksvnNj,]Yq ww&k4Oo|Qy]՚<8-ߢl>/nu98g۟-$1o;mXX%PX -bAbD `!n4 @:1 D,X%X@TYAX%(ETAPXX<ޞD?5f]jx~]Lj$ןχu2}^fϞﭯ?͔i{}/A\eG)Һ C݈6}A`V#&9 !XɈ -J%YD BLP@DXA`IU(%e*`TyΊfo,=_AG `Q2* BRن4wQ3j%}1|ӧQxu>-v7^xoazokx|CL֗wQ"TD `X)E%K), *R"@(9J `JEBPbi~Uha|qin~~n?DiJRW -,(łR,X,VYPI`*EƉ`P(".%BeN__淎vY7_彧8sݍz?/7y.a;>[sz7+~Nk+uo~]|a\~J7 9^Kk*y/dQk=xaaƙbPBXKP *J X\jP"R,TH`eR\h, ,J%BaB=~O8뫝t$6rl>M&Ktۑ`Y!bdD2cCLe槢ys}Ǖ.9n4,",Wiyi}F)].qV=N9-3<}7!G7+˼涇An9|} k7- :GuKvRKA,Ee .5@ňXY%Zb B BU@Q!X@PYD D\A -(% BX* -B%%BK+{k>_?gz|>~SM'ķ蹫5_Y<7ov|wa\ߞ?>,z=fI.׭Kup{ u+S0i0?/f6-O_O_+קxOmZz}Et&4 P%eQ a`E!RAHXI`AH ȒOP&}: [(|2t9w*z6F,MnEf۞K|4z90%5oP ?*cB-1RDQ( )PQB,!T DQ,S DX% `XXT12XGDc^KIy -4Mܫ݅cLK\B" -*"İ -EA+@* ,, -TBPX@T( K , (A !0K> 3f}kդ[xv).cDQXI `XT dX -B -X aAHYa X -"PE,BPABJ@t-Ls񞌹OLticr et xry~[מ?W;6|ZnY2HqΖ'qÚmDy<5kbRaRF  -iA`(*Br  D Y@K( - XtꈢL ,1e%,KReA`!KY b%` T@q cJ  -J,XI -@ib `Q!n4 *R -%HQ%J Tq`Ya% -EUTJ@%)BUE l, Qʴ@QR ` qJ@ Ab(AR X !@ -""KOyl<ǭy-:o}͓ܛ;֝S<^]] (@ BPA (,X*JJX.XT!  ,@  -B,Y@1,!PPIA Q(X,DXKs]/gWLm{4//.o^+i=|=;.ǛO_TzuZ=w%Kts{Rʄ K"D) -@JK)@+E؅XP%@(X% DXPX6 @ \Y(qhMNNx]Ei_'ۤˮmuekwv&G5U٧ݓ\]+D*,K  ,e21\T`  -%XK( ,%PPBXPX, -Duȓ(ARX8˖g\sf_Wg?Mk:k4u^D9ksK^oaEE(,BFH+e$Ʌ2 ! -ADE@@ 2KPBR,%Y`P\K - KBX*Q,b@UI1}>_h|>*%[ae10ȸ$bO>ώI|_=I 1=Of\C1N{h( b Je` - ARdXXX!AXT!PPJ)T$GݸuFk>#vmqVw͠Kui'5Jϯתcsl#gG?1Ot{>f;ifu:o⻎ c8͞C~w AHX DP(@@ * -@e H - AEJ(JTuhU"ǔ= }r]r\f̟L>^éΟ]w =W^O?vs,9Nz5p}vg5zD * J*P. XTPR a!aKPY` -[A"ZQ,0^&γx[گ1z8{u57mqw>Y9lMyr']C\{;tp?X&P "`%%Iq€$ @AP"LT* -Ҡ (*`1RKr_-f_{sg^/kϿAl~26>=7 };a]GIMG`iN_mSMaKK9^myyްhw%%(, AHT@Ac -$%dX ?a^s}+\n۵Ԕ6YjFIqMK/=M/%&-a* L!cK'<^>|ޅHWזG()OIƖK@b9Ώx>g-_ui7W8jãQ zs(Xb-@,"K -DKq&RUcqCgp̓/A yM&?PK 1s/<OD* /1Oh(x^LyP= >^ l) `@DX-1A,"KA@A `""*\ %S!/~Iƌq9:wد/Pz>}XM>9>oI4MX|[kIK VXEe9BKq%V#&͆zMmTA l -"((@%(Q -Qb()BX R-AX%&+}wDƢ_B,XD,IX n a%J1"# Ec5Ts6oܛoohaatFVƛ6[pgRXRET@Aqba -`cJI2X1d1e PKbKi!VDQ%e(RR(( -\A2a2@K*,K %cBYKc|?s퍁y<ϙr偡q/u BX,{u۝Nk?_ΗM~{}^٪xwkr4].zMLn1Rձ!X  -+cPP\BYH%RPPa-PXIJdm`Q*K$ -EV2?9hsGV7hyKw'UxK sOٖm?CgeL3ͦ??'%cp,Uz<{{9-^奔:>vNSyޜYg5j='7G?f.l~J@Q!P\B @, - EAR@YAX(c"(E%P((KF4$EQbuȒ+9Og8ۜMjuB{Q|3R(K(B5d,* (T -E`)E$J@[E(,*"iR9I1XIDVgeѭMoUuvRu7a֛q,Sb\8>;g˞%NggӬxΡr񽆋xk~/i$\l^[>L2!!AI,X*RT,DEH "D -D U`)``!T(XJ,,iPI," -ÀNo,u6z'^ ]$cD:+KdM^h7?Y^?VR09̡e!% B!ahARYq?3}DCt2 O[f}ˮ o4kqȌ5ѧٟdxf}<E?|=(}=mor6jfvM^/h=8,r]-zc\o3BiPvX e@ a(!$KJ1!%BJX+&%B>qꍻO2A诓>?_!A鲯CG_T|/HeEHT,40O0cizgT{c5M1QCgO`d% pcBX -;C8I,2* $2b+R(X( (!@ @ alE,TJe!,X* -c$X MsϨs%TE@K PbBX\K$2 HY12|}`}g?M7Kt_v~}:_Flvz5SghX][M_ס>9h<[wq~i5ysv|xO7ĠTQjRAD -Ƃ́ e*P EJ%RYDYDX, %Lh,(@ ,IeEĩ`ATW&8IIX ݯ6-. tpn? 6^gMt?קyfi? ->op&w³fMLrǞy]_!gWAI] οoSeo]VwKoq]j6'gkt9ӪzF7~M1V:yΔ|;CnOAtKtD+r=A>hw:zhK%I-Je *PK"JP%",%( 1UIa|߆oU]MUs7+[n3 ݬv'/M%/m[u;Gy8/gK?@}Yƌyiut\ޏuafӄB#o9_n宗~7MMkpu:73˙ϠʴNr~#x.Cb_C?eQ8w_\ӝ*~=v' {\fX D-DPJ an9@E -J )@J BX -l D)x V˛凃gn5;|6鵖/ =MEGǀ3ϑW+ivX:]N]}s6eV|umwWWך㻏 -GmM~V4^9ߢ v0XYLXPK% d4B )PQE2ƖJ1 ᑕTAR 4YOM}I7 6W>_B#mqF+Xϯ˲|:95ou;ӧ=5G#~+E}W0yw$M~߿W $$, 1Y@@"\@(,1! e -> 'ֺ%F>(-[G3KtO= %}t?silf5 :}Vpz|W-zc'ϝ{t7jW)m9_^; KnBΓ4Ç9O^[-9RGc, -n]KʀI "+T ><>cmTo&ޞo,$HX%XB!% -, $XbaR!@ `XUd ?uD"g,tMr_ݧ6hn{;9fzNC֦:Jvw`fqLt_ N_uf폵|4oBuy᜾MMM'=og\9.c)PZ쥂1y<kH:t^#mn8m_uugyv _io4m19S--:wg_m:MKɝ5.$$K (, JcabJ1XPTI IH aPƞ fW],XoeYO&ޗhs7GνOaޓN3zj.7=;5WO涇?m6:랧y{btO_;s8#Mn(('b@qޭokgS<^:6]/)漛at -|rr?| 'o< zh~;=ҦP Z}8A7'?t ~X-P <-Mg o_?*L3<吊$JPNPLr[qM5+yu|vQ˯aGߤp{=ooV3-B}?E^{GwmÓaX9|w-|~[=ꄲe1% APYe(%A" L q*R2J!RX((!@ -BDR( -`@ -(P K.%@-c'3,{6y>ce2u%qߡcYWv]>?W+_!81 \n" - O|[= g5Cs&$%:K/<6Qu|ay$n6Jo%ARPY@I@"AP*Q, e"HP e R `.$eIqP - /s/n1&ppjYwY$~OFߧ>洿~~No]9ޛNGi赛6^.ԕ|NKvuWqc\4vOI=:eBRDXX -PP`*RAI@YL@@P -!R (K()Eq@x<b<ھ_ԟt'mCu[cUxA羋K2A+z|ݟ5}Gnlnۙ~gYxL:ë;ώ÷vn9ޗgw'1q#6>OYkl9:M=gi eQ,iR -P@ZJ @XQTE`,K!R,V9BXLAA`P!`0i~>njlz-^KkLr<=IxY2=mK5-i:{xÓo;>#s])igo/1yk>G;~6n/={oYcG|y~s}\>\onSm&pF$(a`J (PJRP AlX% (DX@Le(@QEDP(TJ}~J6kppS}eflQj~qy&ǫF8nA}v -z(F> 9JC;\I#Ez %cC1ELn%b(!n4J$Pd* -K -X -T% )3Ox=36oKQf_86,j٪k˝8n6bJ=T):0y׃-O̶݇Ӌ?K1TDKq\csĦ$! Ē#2ϼpjߟw!鮕Ѱ>gOspٝƻQu>>onvo,ct˖}z_a^Ha%PRQ,DA@(>Gq^s{#5h{:in9 vz?o䯗כ>]7翠tvK-JϏCG+n 6U\j?{~4jnb;.cY/=ߟy9Gg5\ "$\#7;njs'-]N> bogsg}{9>^.]=Gկˏ!qj/o~wWgEtqy>:5;ItߧzO?yuyy|z}:_棳A%P[)h"JI%PX|wv{%^7k_Oi{^+_U)y=N|;n78·ͿSs.Ӎ_{9VО;FRŜGqpި|=_+嗓tjzcdu@g>9z*K'Ui=yVL|=)/i?ܑz6g_<$W9п?zoOg˪rCϟ>z}]/9q{5Uy>9^.]Ix~]wKsτn=S亞Z;4JXBUJ)deJ B"BsR9nso'GjvWeYz97$k=}s8~׌_}t9.U厓xuz A+WWK6=cR[9Y,Qu|#9N.ߜelNGͽ~sOe7iv'#mPq1r=w(mj4= o;GWGyN;^+e_cgi~>nȻ&Gh_xv=G~+Kgӫw (@X-+- E,7l$G>5{LwC^O]4mޔn>}E>r&د7h0ȉ,(.9PYBR*Q(T -!`}GowkuߞgNAOzu~yܜ^[}frw˝y7{Í>t8~U&u+1lt?HF}!Xc2, J1X@EXI`llȥ(X ((,`PXb(*,J - ,E(Pq圇5EI?>yXx|>I1bLr[ĸH1D^ǩ,1?@rcGcis9<\tqx|C<6[ViƧriK%Q*)br( , -K(*@ (E!@P" a%|񯬘_s<3jrF-Ӝ7_.+_g~n_ېcCpݝ%5G{MSvht^ό#<>ץl}2s;.;Y<ĝN۪~{)apݗ7𮿐x8~7{/]^͒*r-2LD,,(R@("PY@ BU@, ׄa%olu/ <1g#tc-Kc+"_vͶ5_hq7kgiBY˜7gSudv<lz;˅l |8mygyG+~{^}{/ |}MW/&l篯1ʶDt7qȞ'};,}/6K 9\h -KQe P,R,* - -Pe "KX@_x[lWuӰ~_Ӯڷ ? p_ 'Ofq=G+ ; +x8l9~{}zng;^#Wg|zr>_zފ[>[u(cZdΰ_=E#ucw^ja%QY2ƙY@* - JYEаe - .$d", ([+I ?9ؚR@Ia`LqU-Yй=isz+?WQv\o kq>7Nǒ{"B DXB-,r(({/#Wv<؝_#rq8̟L2|o_dl<?ts>o_ךktW*Rc:/Vu(q]ג8^7㺮;|ns/cenvq_Lz4J((I'!qV[W%ޞ: isC^S_=w8jxձ[nIp i#;4ӫxeo%8#p}-Nߐsy}z=ncWQ|i6}W=W无nB:7ɞ͒)jl?Zןu/KǺg>A\JFV%J ,N8ֳ#6CN~اӯ56c{cWݷӓcuu:GjX79gkƩo9\?>:&t=_Cfs:+k=߯'MQTeB'i]xOM-07&{I$eFVd2@. @"s?;Z/VΧEK젅Ə >_xL>1T(%`2@Bμ@Q|֒Ͽչ}Z~Q5o/̿B}6 'ӞqotI|l9,Iىrg TID$ -KB2cD!!RvdZQ(,TX,([!`(cJ( -"A`(ʈBd%횾?l>k9BD"eb YF,q3 `Vƻ*L2MET>Go'>;4:p/^2ːyҫ6a}>i2o3;??CSR9NSX>49x]ǖ%<3Ee((`H* -P% -(Q(PJ*XeB넉`c.%hy;yl3an}o1.}|Fo>|fל<޼]_%FYcK.% -Ee -( -X,X( -, -,H,!Wc,J1^P qVnnۈ[,i}.=>=|]G:9csl:6U%͞s??ֿO9suvU×iw,{ƫ 4_/eR E P ` q -DPXPPTRe",* -J¥Q`cb* Q%~tˬ|6k:G❟{t?7CݢfSN~6Gy?OZyE̹Ooթv`7kq{G#=Q p6l̽U#vڪߡj/' 6 ﷮=M},"r^ s^9_hxy.eUs';Q\h -* -$(B, -J"b,PB"K(Z,aezhY~s;tzZ}|lYKY{bh~qLr<}xw8y a11"Q1e%!`%cj!lrƙeq -!Ll @!@V9X[_k_ "0irÃQ(Kυ10X,kp};Ȋ9iv{:oo!~M,]z"J"lTbq[,lb\DyΎaϝda H -rj=IA'%;o:?'t%|:?ϿAO,VTAP 1"*Z<3)a2DX%5.R'فƣmW[v\2{>]zerFG=ts!ίy(}6ϩze ٯ8ޥ4ߠ/ԑ7|=*^3vkͿIU%XI,X%ox]}~m?6_oe7_~'ZwnO17nw~7WDZvny~]_wg޶w_C۷x9^ h;~sӬ>6Z^U+toxo3XD c,AR,e9Be(1B9Krsɬ(x~7=7;K>ڳ꽲s;Wŧgvv]X>ku -uW4Nkg3x~><~Ym&$i{Kxx>[qb2~ˬOmiM5!ׯ?-vz9-hrf /K^c廔|+̻UtiWNx5}/m=λEg3prWɹ|lnSX@@E2,$J R.xdgq`.9bK(PPz|9eaX1|Zӝ-^dVmWW{.j{4^>F>]x7w6#6@+9]/*-fy>㴿S>-?AX-K N,OϺnk9j5Yyow~sG)Kv5y:睚>q?7w^27rMMYM7˯4]g=]/3}u2=V|1lw>]Fs$xicޏdIa%X@Lr+Rbe -P4J 3/t(k_,={~"" -Ɩ㑒 VT[) -X@X -eU jv̅"a8>7´?>_.~M܎kmq&:-8ܻx=f}Y,<{!ЀL3!c$%XB q,Ā `!**2!A -BQ((&P(*PƖ,UIF9)?9>NDm5]7Gy<ѯn9Zh}a=-)jLe rAQY>Gysϑ`KAD!HKa%X@"JIq ,1BP% `YHEZX3[(EJ%T`)&XD`P[(XPxOx3oηQ/7C:xλ28|?GT>h{iY%jyݮC>o&v}9tx'ex%K,1aq$A, $ , $,K -r- ̶RI`PX,Q1YLˀ8>ǃ8ٶv1~63Υ&{yBQO:5 a\SioQӧz<:W4__8Ϳ蟝.1%L` qI` .%B DXEˈX@EQan4ee.Xil D,JJ(,XEAPrn%{2q8|NDR^#1o=ܳ`%s)py0}>~^bjK5>/wr=g_wc5,I`,LVa%%X1XXca%$U*2!eX(@K -@(),Td"%X(-Ư fPc ]lI8op;&trN1>~Xg,ē(Iq$K X\F6X@E\Ac $PYBYr"* X@P@J[(QRPJ"2$UA ()&P`RĢ5?BIF+Z%(%K!%bIa%XEX&XXI$Ae ,$K(e.x (Q,* -@BPX,`}ZѲk4s`yiuW9q;:xӰNW;;LyW؝gɒX][(AH D A@a%2% l ,$(b.""UIQ%UJ `e62)*`!R, X>Jhݫ]ލOb?c n;Ex#<>Oyb((I*㑣`>YY@@EX"XHe fXJ1bLr b l"(DK,1,IPBK9E eJ")HP@ `(AR%AHT  ee]R!(A(.$̱@%Xc,$K Tc(K(K .# -KQ(@ qW+2RL)%APP TJ,B -IK, %& , ,! ,X@% fX",$b9CaJ"X$! -,-̢(ID !n9@PTK,[( - Q?!MA]}=c6Ore+,r9żLV6 BYQD!b a% rċ 2"K ,$K ,$@ .#.! eDPeQ"j@EX(X[(J - w;ƻAѧ)?8M&K8S[9χiʔ'LNu,K\w%_;g?VǚW9!_#'=Ojsi覣{&P\DB@$@$,K % - A,R( 2 ,%b 9E, @TJPT!(~QzuBip -wԗu܁rG*tzْRێG,Ö.OF4{I;h)ےiC/C}L?K fX% $ ,"@@2b%DQDAe\3)X+( aPTPB$YBP@  V4e]}I}>_ѥGc-VUg[#?W4!r#w~OV9S{~5]Ԝ?AKፖׯYLgQG ۟/pߨvoZ}1K V(E`X%|rQF (" )s((Q(%"(S`J%H(y9N^#'7oĝƮgovT *.X_ ;PzMs8`10 c3*1d1 &PŐŕ>w111QX2,6FBd,dR(&9-1d1d0d1XYi!&CD 2@R,$U"((EBRs~ft[9u_=:?4*5~{&{s\ښ(e,~":\yJ/7mztێfOи^넮ELeM_K 9-?,1e fPa&P(c(d18a3,(E1e Y,L>_OPE D1!Z"ee32QE*1 Ycm1Y fp}a}7|A}>o>OϬ5U[2X " rĄ剌L! ˈ@K@A,LKYEe(,rTPP!(ZX*P@,%@"  -P _A鹝Or|~U}uߛ5 -zOƀK_GLⳝSGZ?<^}oʿV?1Oy-ǒޣ府iχL1R|~ =OG#YF}[K"!%$K e (,! , A@YQaJ -\r>` e R(" ` Q@ -A`MG=>'r9g?`~_?G[K`~|:gb^XD]^ tGC~9'_=5lc5.&+9BK H b,1Xc,"@@E1K % (`.X,rXYb` EJ%Q@T(Q,(Al( !@12cbyv - +J$V{}p=.]ca%1XBe K ,$3X @@c, "` (4J\"@YEDPRH`BR61}wvXKדjL6>_/4 -V -K3rTcѝs7ޛJ\F6XI$b1BK eCac2XP#;2Xҁ2@ -RL(J`J,()x^~Ϗ;.^>_h:nT[_{԰\r8o? PgN'?GE~EzKIq",$.6K $XH.$X\l%YD*,"YFXeFi`P`, `X  -P @-}gt:r}L>7vcaJ)N5[ - ?5]q]ko!Sr]ԖDe ,I`X.2@D&9bc,&9BK , %B*@%.R,rX( ,XPR `Al,@!WRh7k/=ށAHIylcRRAMVœ滤Vp=&9OaF2BAdˈELr±bEX1XP IaQ K( )9J%(YKe9X, -"R(!e) -B - Y@@ `(J9٬L,@Q&C1U"K Ia1ĖBc$K$a,,1(JX1,  -(Rc \QlJ*J BP - @J PYD X*+T`(q(ZS`^YRXb$KXEQL(QF3(Ibbc,"K ,TLl2I#>jX-{#+9̭ߵK7,Lqcyܫjˎ91c{+In~-c~dO!eؓ;z|#hs=9a߯dluʶԏWiFj9gIyv/M^[Y :NՑ|ɵȹc|ѯ>AmzGP}zc=@}BJ1A fB2D@)IA(\hBRAAɫy]DYO'qnYK7CrkvC纃>M5 d>?RW@a!%9!0L!&C畂,)I`XPRFYcRP@(D2J q*eE -Q©*SF,AD!"BUbDI.51) KX%XID\JRJ ¥)a9ʴH@ -(*R(cJ`"T( P%QlJ%)>ꚏJ{.ϟЖQb9a?Q,$P "ca%9A bH\jKA "h%$KRDP YB%JfX -@B,)( -XaXAn4>.>OO7\ܮ&Wm9¾%+dXY2ʟ?cl,uO4{~V~y-D]fi;Jxx;q=L{qg,1!/9?ߠ/1bn>?nQe@"X@ P@,ERX.4(c+FWƖU( r% AI(X* -A`#oLIڟhd?39nqJTG2Pb l>sݿWY1{jsޭQEpWq]t<}:2W>%<޶cMUv<_lr~ŖT 2K D%(JPJYcLR,!`@ `, (T7厏ƣ/AƓ;*r31lJKovh{N+9LjGiۜО?ѿ2$AXp]'%_EhwYu]I"ˡ+Zj9Q% %TQ%Q`X FV#,( X,","YH,BBy=|~x|><ޥ7%SnM!n5?ij5zNC݂Y/9|~y|j=IG?SJ,%uo}!xW`%P," -,,* Te`"JBA` @ƈ*P%Qgכ796̓I퍅GU>UY@9 ԥ E02\e\D'cL@|yDb}}$,@ @[, J\"( - "* (X-$G?9;rK߅r{_/rߡy眶L9YeO?LFtxN۝_՞@kXtX/NG)Fۖйܼqْ\eK (\iX1XIE EY@<3eI BX* -%"S.3=^OT~ߕYT}/q_t9Bۍ.XӗGLYIF٪ 8ދt}_27gZKcn;~/[Vve~Zmw=-V>Dn8~GEpqٽ2 ,I,,! I`Q%Xܱȱr"a,*,!RA@L@(c"X[ /IS$sz]=^~owef/Q`APP(cae` B[ -%*Q`B@HPK(rfPT(:Oe"U(|y~H|_\IP>yXL3G͜>O-B ̆ EDH"J1e@ B EXIaEUÉa -Pc2T(% - J",(J! -Hah EPMR'5XHdK ,&XD!@c0XIDX%IF8  D,Lhee`@R, ؞)3+7>YC6Oܦ5Ԣx|k f{B.O ۼ^¦&WS=<#e,?>B,-}̒}<Ǫ>k(Pr]39JK>ezl`|Ϥzv$I4P&*-\llytgI5[AX)V4n!u -K2rSx}y|6o 559`i>l=?:/{7*#U貭>b}#_69c.!pZE?]4^͊|7GoE9EO&~9}eO7у/R>>F{_սavj,-es1{u"ݎ)VGÐVE(9F Tb"{g3KYy?s?AH>}|jGCю;BE뱭6,I؍ D}gUGM7C˝mkt89jFsvA%ucQoO@,T*X(e( - qbsAbQ,"aq* tlI_/Nȝ-rz]h?gg'4gM~qZ{?a#?t}._~|ly>#,u:W=_r[_^}4}5"?KW>4~Nν~ GU?'A&6/f 2u~~9F7~;h6:iwZCߐ~xˠk}in[c/k>?-J_ɿOR(~k?~կjo!?O%Y}|Uܗ]7[L./埴/Mzi*QaD% )V #b B `@B"\A~%oA_O%uz~~[&?3/u?5/e幎Ngtu{]m~__~bluv?~j|sOEs]1ڬhK5~?woh93yݟ`z-KK;⫤OWՋp ~1?`nөOϿA,;Dêzs궲}1=o;ߠLMy?=o?$~gߘg_.:m~W.^:.w7y> u|U?=꘲*U -`-Tplq9BXT* DC?j~˻nr=w$t t[Ge^Wy9/lu7䟬~N~ig{%~/Oggj}v;O[^Uyo/~rw+6Z͙4xw'uO} :펾<ߚ~/7{9"w?\|~i?? mu[s]>uk6gG_az>>4?>~lknλg[V//#~G_kQ~g4?gn59|oa;9'E7<ힴChuՓ9.MT",!(" -(JsQ, REi%~cnOgr2^vn?8Y?g^cy9?2~W~wr~37eSmޝNk͚mƖo_7h:>sͩco4#?x*b8^O_?JS/4_~3gZ_ϿBSeo;3r}FukvGI~?z}>lп8gz3f_Iz?Vx{MKe?;?kuӌ8?`zS:ⷼCu[mYu|Q.j~?HO?d=͊"RU@XJp ]s9԰ ! ,7 -T q[ @~3'㚟z|ntۓ<톶L6M?~/1iۏ4;r'CT?/dolJͶ[7+$:wkm5Y]Aֻ٣َk:W>~qgk=_?k6Zz~`*f6+=gkmk29k׳%sy=~ֳγW˿R9&Uh7[o?ٞ,~?鿘~g~qG~ׯs+p9UԝMuY-L~k?ߴqR@ A) BXXp [i,I,K, $(yOѽ/Yhwy>:}v\y]~3~w7ߴ/1hۏ_}T#_.kmF}_ѿ6N{u65fYSsiۙGr}w#f8:C{g7柦kxsy,2~wkmΚk%s}/:kf1y?20|ޏt:=?5lu?L>ǿa{S俬~wg k/~賬y.O3xot4vW+_i=߷/~'aVlEE!i J> bcibI`%(@ 1L<~Χ75}<[ɯGSϺn?7َWKh//?s?9:>j _?F_=lonRͦQ3ok'I"z:s=fðY/? t=Fq.G,p=_xpZ~"]zw;y:Zr׳,矠}ݙ\wagz^]-C'׿#S/9~\ğH6c=~]~q??eoYʿVN[Wo?9Ig_.K+orv햧GҝIrOi2ퟋ~}ћ`dP -".%* - C6.Y%%BK ,<ߎ~|{=\Yȝ7_Qudcm6Rg~~stş~Er>whwz~;o?F.裪9MY|?ۿ9ǐ37~w]#k@4WC?03=/ÝG͝O⿶g9~m7zMpY:.w߳l=X?JqFQӟjcgOǿ^Y~W俨[s}:r}g%_r]o-{7==>~s/}#y~mO_ef @X@PP@1qtT@ HBXy?C~{/l5iw2~5_k?~K6ڳOyoǿbv_>w.6[R:K}QW蹛<>_F:_cR;&2k_8p_g~}:7I~~.Nsο?AY4ۓx:ncgls~Kͯ?!]s,| NjO{9y]ޏ|_b};G_̦7״TS_/]}g']/_}0ߚVwv|o`a]$l:o9'~y~70ʺVQ'?WyyAZϧQɿX7;*ΓμmS+tosau܁vEο7?4W%,R,e@,QeD0t21Dc$XXBD!Ry?MO=/|j>_-gSϖQ?A{Oοh[t?G/g꿏~{g?o]~"l7Z=Fw_~oznkKgYs&?f9NӉsy];S?BNͧq~,~Ƴ?,g}Oٵ-noGt~-G㔼~iwWf.覶^>Kǧk~3~SxcwO?(}gQG~yG⟵K~u\5m:p7<gƟecW3a -e(RPR(#?ƤDD F5`%B\E_w^5;/הc쵆;m>sừ?6ڎ[KG~su\~A\~淿~7vahN_?7MIhƣm\'mǥzm۩}IKoOw<~hGItGjv WO꿔;< ɿZ?2?eK?rOMOx.|/gS;?V궙~_]^ _ƿf2Y ,J*ETGOf';%$AX!` YQ`I)x([mNaFUr}g(uZ}Ɯn5;S?i_ntg_|M꟏~~?z~_i?*z.SϢh7':|A/c3Z ?ƿe9~3gtv|^M5~y?-7?~ɭzNSN_ڿYpz\Wcx?ͻ\{$~E{v]Gwz~^)?i4XO6_p]ߏ~_s=;v<~5֧?|}>p/_ݬ//ذJ%2,D* -j˘:cpKqA -c`Y `ǃ?"C붋9\^:6LglO?B?:؎GK~mu\~7'kp~>qYyMΝ;_ͿEz-^GfVɰYNK:oFlu;}a&c6€J *"X,@X-1![\~2ǖc"XBT\A @Xog}z]fg~MDJTI?q=LhYF2ʄK,,(@XY% ,$ ` e (*P -T$ )J2U -%P@J@C( RXI - - *,UD#Du9BTB a D ABIPK "Xl *dE - -I``1l% - IJ(X.4@E*R"(%BYVe.4@L3}?us) &RB !"*C)%XX,!PX!2DX2TP,ɍ*C&0̀ɍ.X $șAA -ƕSg0c乾d>c6&4Fl)H2|2S& -ɈɈɈ2+DYW`.4 -A~Hgig:%ƬbYAXd27}1ɀ0l1>}g}&L!|`>}&ɀ0.SFR VQqI 1b,͍2cK|s2\Cd>.lƛ5q<b\iq"TPBcLEK1b-dƕɊ pFWL S6>c;0K/GY1913bYC&#) -)!bd. !@P%QQR `_BuX_jSk6G ]8h,=>u=AʺnX> -:Vit&Wacomuo1 eX X,a, QPEPPX,!PXH_X2tk=$(c2K, H9@ -IDQEYIP,MU/G.l}s}!Ԟ]=_sYg]v}>YzK7:Nӳe~otYil}4=Zm~_6[߇Yx=\Kae!JEPh JPZ pb~TW=XA,P@(,(P{|Z}m9c}Tr}^m]FY4oYٵ&py{m<:>{_c<='7_>G{֞W#U>?E>w2ar)SCD>o0}?1<}<ފ ",,RK -@ 2JPJ1X>_Lȕ< @RTIeEDXEHP%X)%Q%BQ(#(XK(,&PRRAHX)IJAqQPK2X) -A @PXJ*1F3L2ǝc#j@,Sƈ,1Xe`B("TD,Q -@ -ID6eXKAaK`",X,"A`E(%T(KXJE,X T0NYr@YIQ@@%eAI`X@J( A("P%RPIBj qHQE (KaK,2% @`B.W;0\@K (%LB,BDQ@`QEP)* -R,XYb,ȋPJ$(B @a@XJ - F*""P e?dއ=LrĀjTAeDDKJ%)(%PT,( e(JBP,PB `R,$ ,,R,%RJ - X%Y`RM?%X%(@%PJEF4HXQ, -1e BP e -XXl,TJ!@* U"ƖQPYD ( -J!LeAaX҅,,/Uˏ=bD%$@Ka,,*P ,%SDApylO]CFRI}OmNn}.xk'_?qeijOdIq-LTKD%`X,QIi q-1TAB(J ( ([pƘRDA䳩xi6\oS[FR1D2}=ZlOh[Y_{M,M_sOU쉭E_ BP=#d.lDv}ڙYMgk? izR}^{ }TG᱇2/4 챜l4hYcO3矞^ lc~:YQaF" BPŔ%e% @( -eP -HU@XPVT*R ."P PK(AA% DQA@ DRc)s` n!׹>W7MWϾY9cneP֏ˠoK:ۣ)@ J%, -%HfF4BRjReU)$Q P&PJe))|ᯫ?|=OZwC˦m.AlOk5}oL>CK=f$w>Mzb>]KIFezϰ~t_ʄRXJP@(,((XQ"!( @ fCͩp=ٰ4%͚=fiԝfnuon^~b:e/ǘ۴9]I<I}7[IV''L~9&9b|ymm~z~wM>s/;sdUK}z>fӢc^_=Ctr6~_O#ttoUɯiݛlk4z\NL=鬬"|%~=EQ%z._齞|\^~llu}-T=lyIy|O6}~{]9wq^s_%YBTDK!HBTU`J@U*P.%J -c@@R`Y@%, XYDWt΁>އ l3.xzBkI}8иy3pCmt?19n:^k]YV\?o |]qPϨŐ?>yeOOOA1d"Ri(Ed$(P@ (" -K -{|u5yj~f׮2=-^iK!,ɍZ@#(b``&P|x$WG{SO8-GWל瞑tܵ|>]s-tZt[teձ#/_θ-`A]_'i5[Ij|̜Ο/WYB,KBR,-PJX`(kٰ\=ZyStngDZ0kniɻ:aϟΧaW>pekt82Jyosۨ|znvMg]Mi*E!`AP X, ( ARIP%5?N/7gaw\>n{}^>;>^ѢjA%}56hwR^emOgtzymntSos=oO|]=^n{jqps9n g_ɦPgkM᭏:Nm~܆GAez{?ᮾ[k>U^fpQlCrByymϽ溳e} Σm3=IAJI @ -PKeP-@%,bs;aeluY{yڕ>4/¹CNKWǗWukqի/_^]x}M믿դ>}Gkvuku\׺5]>vT'ի_ }:K{Fםfk:m|^Ut=qm[}Ei3jQj?Ѩm?9yɣ~ ᜷~_SC囖CET* ( -K q@X aS"J$I2Ā"jX@b6dŐ%#"Ϩ(I<3Mgv WL9E+n!ӍwM7K4}$s.zMoFC5:l]SQ=KgCx ƻϼۻ&O؞^W~~.徾?R{oXllz:c!RQQ,%UY `! -Q )7w={ggs#bmFDx9fyAgM] T֞q?~z}d]&}Nm1ϙ7^S]&\?,-:|*1 BT s,,>W8|y|OS#Yq[''ԎC|~vx:^`ur}Fxq&fFwNlѝX5E~:c0R(@)`He,}6gYYyQǟ?VV(ZƖX:c%g=K2%R%(D@! - (P\>ku{ nKl|Rycf;?Fu5c(h7=~<{oٸ;.:>/~6nej}U|}O'I;.Dx.녳kNn_wAe 8׉^XO1jrWVmXE8?:ڛ|~O@`,L -(KP&Be JX ` P-Atۍ=utZ%&Xҁ`JQ( D*X -XBsIxku(?3QN; nYUgjmtXՕuz񝮭>{O'~q zmWs~&۰Ǜ]_׫t['aofnN_@u}AP1CGʼZyt=ly>*u\睍Žμk=Nk~L% ) q -PB(H D,JT,! -JJ -EA`P -In5lBX!I,Jj f}ϤE #!2ٌ>TB㐜aj~R. >Qo.|>yH('Z#x`@\2%zkc7ߵxu%klzDy.^577=W]W>\tm6ZXXWk~>N=Ȓj( JE%X(%DPAPTP- +l]grK˧z =}6:rv9܁K~N -(PT @)RX[Y` D,E%X)R"k4{ O]_'qo[iKy殟Y#uNϊW ذ@ PDRX3* P@FX -@"Q, Ys(a ]R@%Ƃ ()%b@ `PA%Q1`[eP!ReK nfi=B?cPyp:ע9zuoMϿ(X(@e P `YH**RX- V4K -\8NNr")(TaPJ ,"R( , -1HBK 1+3z}aOd}lT`BeRUl -C(AR[`X 2 -\{j~f7k)"T(TD` -@H!HB3g3~ӽ0h;/r&3%Y2|fk;>-.x?gg X,\J%JE (Q( -RT -D(JJX aR~}Q1=?7ז;̼I3:ruQ~2HT )H -ETP1XY`X,(% Y`), -5?8d?,sX -` H -* q#+%JV4""P}S)ƽ/cَ՛_H,<DzhU_`3cJX(*RS(XQ,(%K(X.4T)eX.4_ҿ4x4o?, -%KWB -(-"K @*Sŗ+>k<fnQz>:_}\c}w's]]Tn9t5>}ٮ}5ոKt>ku=dE=WWY9ⴻ%k=oV=: &OyRعjg~) pi@!bX.4 -R@D2AeARJR@iW[p~QvXTTPX(R( ` K,x}zNGfxu|s]/.o6ls~{Cy:7s}?nvU.o-7{}J5^En֙yM=;'Adl~nSkZ-;o^Yˡ\[]z>/Ev\]{͜GtycZMۦ )m]B͵&gur.6[>~ -XR)(%5 - q(~gg:ql[j{QJ1aP `A`.$ -c!bG[u=:^K|>^:K7?7Ǫ;3=l.L].ՠ}cl|SfB8|lu?|3gOKm>^ Mfr~==4_?ekC^^|J>z0'ҟj},|j>}1"L \m$:|phg׻{\OC\e^MNI=KiOauȚ|34{3+!@!*  2@,X),w8ɬGÞ ,U -ARgaꚏqy|ٟQ lm}y+A/og!tV^u|FVT|ӧ]9΂ft-/:ilsr:Sp/6>_cAE)Zf>_UO^|5[rnֿgrW{ -RhT (\h APT'ages԰T AB㐗J YGUY4z?Yϡ:e跋n{ͷC7|t:'臛4u 7_wo>XiIt{ -=gl%M#4E\`P-$` %,ƀ, -ADc鿚jq [b9*RX d -b`% Q*؊Ǧh,iwNys]Nu|yIcqƴ;-fs4GYf=^OUtݯ:y\H]ƫmt{7۝>t}}w||-i}?ˣNW,z^w-YoߪK}lFk;<}uYzu}Mt_/7Χs|߯ ƻcO7/yқoOaYZ|zcO\=z;I]gdt,,$ (T aTa鿖Y2o?d礰S!RX,!R!Pd Ǜuj2ϥ揎ᮮe.Ej{=-Ͷo&uVKw3O{c}Vk} }ot~\/gcg)>_hqNZ]g=z/-iy|=u_^oik6͜zWӎlo6tOh Bq!b R?*ӕI9J - -`- tlM$o|I][:O1䮫uf7Oo\tΓ/N7|U57_lZEt}:>8}GWϚO5u<şv^h7Xy>9iM-)[w S_FWΒxFy>b321e fha/Yl0_(cÔYyK}IaXX -ERT(D[տ$ӘGLFÖ¢B,,X2A,!vڍgѲz=Ͼr!3si%ߞq}>o]|ۗ6}4g}ś3^sF>g`T@K(XʱDd$d,79wѼE9,*RT, %K -@!=s7}&^$ίϴkl9,2KYOuʓvݝXezKvs##omk>o/fS;-UφNck?mN7ǧiKchwZgI򍏷P:\_YR! KķʨAAHRAlLCD*L ,* -,*P - *Ov/ͤsii%leK.V|O>(h u4ͥ9-/V5<~ʚqi8xSU ExѷK}=MN.|߷6-W[=|E&Uћ.~嶙~jEfy|Ǫ|w1뫝k7yk:~iJ@("%,HDLTPx(_N|o?ÞHd13e$+P -ƕIDFXHd(K&Q(RY@ % "@"TƁjJ -q<}Nj>V8جp/c<5=Lޡ0Mֻ#|~qb QJ+) B!X'~Uύ6J)I`K1XLC$EEQ JR qdƗ .X҅@*LX lX rJ1 p☲.,<}۵L+S$,,* - -@B7_jh_6 qJ.4   (22! -e1P\L ȩ@*A!BQ,, -P$2A` LrĹa@e%$)V,€% ,,X* @,Q~S亚Vmۆ\QD !APP"R qb,P2ep\h(\h)(PRXՑxٗ%% H,)e (, EL (YE `X2J `%%Yտ*Ұo?gnk~YVYaPYPJ%, `cKE(YB¬cKPXТ\r -Q(dEP-XJbq(%B*JAAPRA`E]'j} 5oIgܟe?>~g~꿡v[>kx})- ,[,"*P -R*+&6* PR()IB -RL% DP T*X,!"B-ƭRJ1 , -%,Z!`6)S6X@@| T s (|z/}g#O[ !/Ы@3DhX C (Z@@1J @@, `($ -[F9 !04@$%1235P"#`A&6pBCEDF$c@YƊ0:=+S ]mCJRtWJ{'##_䤅u1( %%tAyp9=ξJa*ӍtJ^\曋!:LwΌ)DG+3V?Ӗ,XړldV4 ڬi &j]J.o\Ʊ1vDŽJ}a6R4p,! -G.t\G3Bt\>ZX·0R#@ƑVLm #m~Fߖt6?It6vҍhCI"Уjӡ(@ƺ&k\:πV{'K-4UK+:CJv; @|0SվsR[HΝs3TڲQmwgkHM0MPRS#@ cX @/.u{h:6i ƓGS] hBuf5@κȁDkkpγD=`GӏJO0ޥN!zOsIg庙 3jTKla֟}(;GǤO=v0~_>aG,xG؎w8$ }y<#?>HTmACSi|qnOBt<:4`vU_*"=^<\~xyNNi{Q[PROO3>|2tTTo!2 2óf/ƒS4&et5e?? [On3f""t<ԉew+ȿȅ4,&"#lm5-0CIԩE OiВp#mYj%.I1U=K}FMz_t 'O3N^? U%nآ B9CT}iv!㹏GW9{MmYk[|TR+$͹P:W6nMX ;3qTOjBlƗw8f=-Qo8[qc؃,ʐ-Yun@T^d|q^C>ηO8$g: ֗ot]Ki=pږ ?O5DoJaAaם Ik v̅ Xj't{w/Y3Xh$;$ȫr")Ȋ#? uɿ_ѶǾޜWVDݘ9Dغjg71m~ou.G ]9|I: Dtr'Z][^>SOIro Bg\4x ЯYT44MN - b%1[֔fpW۝vQ)v -8YFTF+l!(,s&,6KCImeq~KCuS"d*rCq9K4W 2[`7k8iԸ8nRXRIlu9m0ɇTԪ!-HL -V(*}ULi4i"-{OuY{9q4<| -յbE5 ve9x;4aHYw^͊ -BGIz;j3*#!l$(3:γNasNHCi]DZXrJB !LX6cLKKx,\wwv_LǷdEE9k6WYi'ߨ$}P[ǭWgW *_, -ZM\r FapG /Bp!]f)!:gAm'<;;G UAk?V+~*Bnaį\Bpu ᝷"!p҄Dܧ*yHVij J PcrW":ݮlRMj -^`HLkT?K˰#3b_Ns'C)?LK'P!n^+APp,)`]LU Ji^o/}DZ[װZu`O CٓR1U5V}e~[kwxZS6_q\gܽuݔR\;>"Hpp̝;,@p+O#B ڿ?6Qj"  OKda,5c(~.\r5{1ucn:hKq`t ?Hx;"8j;u~zf>BlyY"R-_O"R죇Xy=/r~;oدܭ?b6xfw-͓jȋVvjBѡ!m% :5YBH0"!Fp'VaM׭At 4!uC\v'aC! 6֮AbV}+O s8gICZd3M߲߱ Gn쭨S۔̗.!Yea-OS0lv)-֦T:]tu:%a%Ɣd'*:jק9-,=J7#`Ƨ-Ջ%pu.d 7eyS]zބϦ.w{1m(S-ȴjyeQvos -5x\ 1_o-bJYM՟m=޴bM͛!ص-ncbCFDu5Sq~zn4|V`|sC<3JP:QƺD(vP('@`$54,Ki ̵ɧrdz.S[K_(T(>R׾ճܾFu3$._qԥtN6m нn:䎶#4g1

ڜ@~]P ݌}W`aњ2tݞL1uanaԟgugD:+AqXiɳkGTaބ!7:Lo/\.>?Z;V%jѺPg㹼vڂ!% eb$W>E]Xx;u[I+as'>Fy,UԠɗ>|Nm8fD; "ߛ@!KmnXXO9FL㈻la넕A-[LlҡI:̞6e։-ٲ7 Ej,HmGPN+oVҕ$9H9Z.jD*R{Wn8Zy 0*f5^b [Km).ۧ~7W#v71~óEro6Hv.a IJOCAcE͏)mt,Jw`tۡF,mϸzD= E5 -,SYYDu71\UNXLQ"R -#׆deoYXE\KMQZeR+[uhFⶵv+o( 0AnCZ}_&07ӈ~ZC|:w}q$Ý/?_ݍ8JoDRȶ^6%S(C7G՚Ir/taP6W'6mqs2ty RPz[1_Rl兾0X6SM -ۇZ")y[YmІqTCHHд4k>!v8?(úGiw"w|6-Y/š!qk嶾05;܍aXE\1-M*=إu.:kؼe٦m֢rCB\piNġalG,ʫy9Pjf=;50Df@Ci@#0a~-PBVN!~<]+Ы#it3X -qqmEd1ZMRi)V1ave!@Js: $:γu|Aj|}MY=:cZeC.^lꁋQs99|;ld?.P2FiO{XVP)9Ԅ -L>8_LCpCvLыD}kq -BD5<jv`%5u /?ӟAy8`?nۏZX^?F{mn7)N$njBRm!K4;*}92SkS9"1:2tee %]tuk㲡zp,Ӽlar5[#'Y2Dȋ[K+Jy_yPRE4~ $c#-i[ 1[}Pm<HJ{XcGγdsγ:`=:c:'Cuuu==qmg44UN+a -<X@躐Gq)p88>:}&u$ p8XMTu,u#y/ZB!k*BBG -J \VtHYBOZ?юuJTДi':ˎ)R-)89 ]]|ejk.JP*oJ*#Ra=X!?=ug4n*}qr8;),>Jd{np䣢Z{RV+ +H=nP<h,h'];|%CZkHڃn!|gȋh`kY(1Ŭ|Ch-牖 -&~jcuj<.\џF}|:&X%ִgOgfJ!!MN!R[4 S("-9C 3iWJsĝi0H\8?p;ԏB{'xgYggDYVN͢P:RtЍ3%3NޒU$!31NtuCońPٯnZDdm-)`Ԧ%XڳI~e*)ΥS!R"4)i\?>瑩"a:ja>Ƥ?\6[e~;YSa`UWzm v--/Fkօ6BCYMu*aY9$mo7Ҫ0)[6؝İ/:m LiVpX-m-_t EVXN%fIom:r0P 1[> j,wyT)sVP+J2 ʪL&XV j[b% CC=^E|^|H Fmjys,R#=_τ?ˏ rC3K9o naVK;_/XRO5` !7[RgJa/WU[|Hep6 9 #4 -E4G$]ODɲUN1yRc^19tG-іX,jrE;;r& Rᆭ{FY\Kb]r‘*@Nc6iW -Y2igQ":^atRb4%$tpγ:γ:΁v=;6̩jJJF5ʝ`M{@\Xy#Nm"4Ԕ:jKRIuL?F|L<3ugY:ݱ >qQJ V2N7N%6P3)}\X[r%o#ق -QS N`B,*Ty1kJb~s̥ڪ"+0Q4liVkjWW.sCVolN"".JKd5]=%Iӷ|u|1nt|M0$AZI1$Ũw ڹӿaŸR|e[}!W(SFyqS ;)BGOAn?0ٓZm ܄ 'R.Ι [{1r 2G.E4h m -VjόFbX[%P,ُV@m۰AdXۍ &*PzIFC -"ա-8 LUGm5P?n2GHvޘ|PrbN`Ms:0u m S -եr~**jd{("c - 7)r04DVP46JT M*sϢG=(USXn8`E&Of(Ktf e2c4Ɣ@ -Nxγ: >~{Ys3 6NqQҝJtRњHu%&|q2RԫVc6JCARu.'YhN UN[ڴbg-TiVY1a5%mvz뛼@єtԦ]<uJ"eY1r􉍴g-UJc )v -CZuMDS)ZTH~M\:g5Z캓b5/:Wp,v`C(yy2lÝ^M\]0qMKgDy26yqH3O="Ұ%HmX83)ՋK @fh86(*–ݹ. 5nSmg[kGu8&:52, Yꎷt}a"N?8i]ѴX^eѹ;Ȅu(*ar"m/E] pTi$5&2#y Ëy0ڔS&$JJ+s%}ucN6.&{YU؝nsàuq%ܲs>p{UqDxV.f@ {]_sy -2VU;S8+JvqWx:Qꐸ`ƬKGr5@V5YGnCs+[UNY{\DjbzgcZyP4Z28¢Nm5!cA{ͬΊgugYNγ'Y쓠{{utc::qc-YH] ['閎f6ۡWQeX"8ˍCf1dC}qʙ& 6ݬ|U&KoXCL>:\ϫCU1c&;\\@ L=F}utu'JyM 4\HΒ$NZ]wUj{n(|:[XP2}Ty 8 m*M$pvKm`i(xZB4m@iGRLcM+q-2tRt8ZQGx]q6x8t$6t7 EPam tTHb- [F*>$aN$3S-LF}*^#.qlDeV%=Jx籞tt\NI -DMc i))SU7|tZL6@:NFιq)JXd0OEN:}騬2x(d*e2H˧FL6ipu4"4d 4Ii<P8(d&i(O(T:XޙO#-i5`z qĆbGJDEkA;e -Bx>1Gu'Yt8ߠG%F5/=JWzd՘)= +5γáϫ>!s'\ -tlFcXa8JT_-e* 7;G} :'ggN цӇߕ+1ܰZGJikE{ {,|Co:n v's<ci6q|;Kp~ x: LZ?>gͮnÏ!GO6代 9Jj,tdd04u\Ήgǀ x - -f%'#G* 7.Ε75nuk%RbCDQ[sBQ2gu͠k\+Ke%SӣIfͧWяJPIۥm OWVcA v3uͬ\Kp'HXXRGl).ոr2laq%Y&;(@W" -!80N;xOh=kh,v3jb%7Ti<&ءHdlz{4jR^K[V_f5GYb+l6ڙmlPf2e'!Av 이)\(zL[Bl2J F{Gc{855c5 }yOu69unIiO a -ÂAncc@alLX͠C=z#Q5ָ%ٞfL]FXLM UB)y0ᰈ5oêor$.ϬƏ k|=u6TL#_m$n+ &c)pW˝1,.CuQWFy i2٫csFt26K,!I2e4^<*PQZu+Nz>6`|3Ǡ=uͮqtV4ut͹\,P5)\\v(esf1Z·^%9.$$^8j7WeQn3bE_ObN\\w5Hy{ `+r,§ myk-R}kSY٫ܶqr,S1k Y#E ~kkQW-˦qknS[C+I\ZcПF=8:c7IsX}R+W5Zq]'s8j\m*9u#5a)f^#nN>|ckq su(XRu* RVBl=냍>z$ɘ3W/QZ-3aXn3j4FfP1?u}).!/ZeVjBZEe ԠEtnw7DpW~N^~ 69Zɜ3m/EĔ=z`-;OY+I5rܐsZAC<]ӮcH-tm?lyOre_#|WOpMmܣ%&|ʚs[xfW~u|\\Xp]d؃̜U0^njc*\-%9`=F}Zbsv.Bly}/缓6 [jPSg(FH HWUnDVP닲j cC msf rux[y '\- 6\%UnS (.ĭ6$8Ny%N:mGLBńDuSCBU`,L[0ei t,!=}71|*S [*n-i13+ZS)7)8>Fd,˚'<:~2 hMzꑴe W*'HȞCam⤅h0κ8:8ǡ>=ugt(%+e%mi9:%j"K|jcMCep tmxY0?St8֒r8KC{[E yHV#mi )):AtO:SdkA@uav1Qknt (<rqe$ÊLHBS?<|:*Aĝ2e5F [rBUIKuq_Jg:φ}qu2(n%I,.$Eyo7\sٝ@f[|ejXPƘuh}v{YxgYugEZVA}k@:Vuu͠?J^u;uXe,!ƀ sh+\q(cMKei*ZnEMWkB \ĴwBrϰS$ΚAnLЮd 91c51RY* YX*>0j3?:γ:γgD\\E`ko %Á֦YyF ΒMaJ/‡V,ůj6d)RDAPȥٷ1Z1cp4se!< [ R\zB$Ɯe\[0LxfbMk:3e'gY{YuNM'FcZJjH\S]Le'$ܨ7h-@j3l[K(nud)`F;|Q.&;H>í!_a+դOEhDy bjcҒsYƋYdhGbS}Ie3KW&t7/SYX$M D*ɴ ̪=cȐmׁ_T%BA!,FYEHh.OZ]VYm-9#9ɷ9+V딹ʺqn%C{]ɭdAS3e!QTϑۣu>UGpXTُ\ hdVgY{Ysk\+Zt%ah-XIk -^tF6.KT2zKZfN'WGt9ѿS12`WƬ,MyV!Я59yԢV-b5aP4]Kb4>OyOF1>WnSi:9 ii}ڒ+=P6ZRf{e8;+u[ٵKV bcO0ze5"[r^U+H2GKEv*lзM[PkT"cC0b\G"L"-SjCDjŻ1TdYW`bG'M As3&H0#,:V!mfs0luhYa$D_gm W)wWdBjs;QXYKwj o`ܷbFӀƄuoh>W-{.kUb[ͧ;"Ԯn 'pu$ Y(泟=qIiP.L V뜌<)#4EM2 ']z*u5rX: 28BTR -i @$4xWYfkMwB]K9Vpk[ -zjyN5[Ț-K"T\ -ˊ5j5b%3o#y}H_F)闫r<5'[=gyzH -m֋mnVh6Kalqp>qB*a9X22&zO-{mꇠs'YxgYgYNՈ024!aiiW!S)1e:Vx^Uij$ݥ*ʾJר!X\WCo,w3f;W˟`j p:Cel"㹘 Ca.2BaFNi"|gxYggYu:tV4mrAL\FkOk>Hؗ9E -(p( ).a fSOi&3[sI9:/aR Kf"Jm6:%' i)Krdؑ-b QIJ{iq -Yfbr5$"%: 6lSlAQ .*oK\U{B5C5m)#!Z%@qj$~r_-0!-rF'Ōt/a4-'~N%/6⾴Q@@b;L%m6xǵgu`Oco$$q8.pS0 Ư} G_hG V2^(oh|U#spǐԧ:ntsNH%Մ!$Ο8!Ym >OSFcV4,bQ[ShHAsZ.[Kdžt|L:: -:+A@-#Iy΅BCZ&Z¹nA~J[CUcc(~\oЧ%!ƫ!(Bآ؛]$ϔf*8H+fbDŽ ڽ+9gcŗtGD)<fjXff\Ta1`F#ԑՔDiӿh0^*[@:tNm7!Bu 6Aԩhd>DllgYqv:}QV{$(FU 3U66QsPMfOTO_>u[~:l-RBNG -bհ=2dpZ.Ki njyyBYWx-A:BW|,hjN@B8Lx2kKYokRP9*sW= Wҹ' iߵfltOtd."iL˴FPݫ -&FTYmJ[%nw.ETY!mnKY]nX,"$TJ߶!e5 `[foJnUe<ƣDtćlVH+iㅡ=?Ƚ! DŽ:Hu T}md.]*d#Җ7ѰU}(B.bBJE Hi/< DiT01ټ$1]=E]do|i 7O&ϔgܷtR{ڟ㖄-bn VH2O Q#M!RChoBmNTƱvϦ:!,UDZmp6u=p/AWvpOĥhuW6rɋR -7lǀyn_uS&F%z9fm^Ba $CXFqi1.^;cD$*gqib0Jgt}0!/p\6]HLɐd]#ߟƊ-cuxf5f_vCS%LZڈyL]D~l$hm3*":γ z:RG5ձTgt[Z+g-%Lmֹ eI| -AG۬L+k{PqA)4Ɛ@ Hh>6{9<9uŽY1#Df=G]МƥN n^uȋO1#`bapX8Fp 6*I9 nHmn '㎟}ꔍE?γ'YVD(TX[֖=IV۵?q9믤Ҡ؞q -$Ϳ{! -kk_V bpGB r%0Dn!PD iZ껁)+#jLjKUJy ;IĨG%jsYΆ̘ybN>i81G؜o6Ԧ.7 H}bySq4ug)1@L-\U3ޣߜ{]xk%ObVAzJNj˥h^X>3ecm[dZY5ln )0 ---;ze v`; '0h85Ķ"QٙJ-6 -j}LGqld2a+.!Fyӥ|u5/Hۖ s9c.X9[O&p.:v%W2d*5D7m-7|g np5$e7cb,= U`قYy=n&/Xi]Z{" VʡwF&b4-+,-5E7GR*k+ޏ*|s&:(Kuf%7-y"-lh݂JP)I4PcA)*F@qU|"{bUr mYuĉ LR\+ [Da2-mge&MӨ]%*ATR_x{.GJčxpeNYALf8K:2Pm1LtjƝ3b6E!x7[ J`hcFƓιͮa4s+[0lk% @)J񏅞VTg֌u -fKo6V*XxtSwro FڨuΫ;UJ[P]2Y~et3Dǭga>,xȔUTCcWli["0XD']Dy-uxT1KKY%r -]f!+L 7[7 2y_K6޲"J -mi6(9O 1SKS)|IA3\<̋\+n=:~ZUۡ1i;~<3 . **m'MmHQl#uԶLYս/)QyeĴi nyR"m;~!n-CÌϫqO4,42_Hi:":Xdo8<!l#u8Cp%ΗC-:i垵rPkO4wE`.bFMy m)>S{mq_1rs핈{lan&$QzтYe `qi*5TNi r 1JQ0V҆@M~Z}=񝰔ьDc:: LJƐk*V52,EW\Fp$CL*8wVvhg<e,6OZi /cբ6u4ɱt& ܔ4!ADDxTUBRFl$s75f5~zP]"U_&ZV:slveX_P.qS%lIJfqz֯c! -J2>EL8_DLD ~=?_q}IkX -nLy0I5m߷DFR"$fⲕHV6y˖bڷbFPlQw=kJtQ!-m%;-Fm Syo*SHZՀԽ#7Jeńm)vm~eՄXMյ!d*B#59 myHTnOXT\P:/)N^0ӒUk+j]Ԯu UCtҷEذK-U?ak2a\()qQub#Isj -7rd+=4t+ -:uB r3bGWV|;pSc06}Ɛbp#3ӣp:q@Ge_q\b[hM8Lcem#)OGCBz;3qzЈ@(r.T7RbX~tˢɠy[փ+JjeΕŻnK]|L3=2%N&&ZTMIXFO\mT=x9S WX:VܶkՌ9V͸0[fUܾHCJKk$DrWt U`>YV:wwQ;HJR [Aa^Ct;Q䍸< -z}Q=;jէ8zYn'шzJm%1Ue޸>SJG]4C#_rFRU9b88/6Q`ʂ~QaMLY-EH >WhIszhe\mKeJG-C2tVAXrkC2ZMT֕iؤ }r"Z/5 -)`L^V'.ۇ3P 8Av3cw&Ի"`Um}oQ.=QnM^WTmmNtMi-&ψutf}i[䎗ޚy8Gq~K)*#b܈VӮm09[1/ef"Tatr\fl2^Ɏ7p7 Vߊa/L"* -Bb͛%yt7ċk^QQZ5jSpL‰2[`"iƃ&[*y"͔Uu -99ŔC EmMźYix4!#N4Q3#l謾Q %(Jd$5vF-շ-]=Eb2,/fwPTscq} TGۅ[1|C{juLv(\dW3gK\|te3Kzs,E%Ut$Ig`Ymiu{uڤHo=(jDfMZ_R$Į 8\ȃ̆[MIeI(ư=0=BVcIik(IJG5+D~'p~Dv s4H*-* ZV)n9ˉ?ckyˑ_@ u=ni%9[a=*z)nb.LveBML)RByմJ-1uQfiPIԝ.Ҋ("0Nv ~x Zp"Y{ukn-'V(jQ흉cfۑ +}%bJIclI2 ZWC['X*ݍ7VspcuX#7!lB*&:m@h q '}jz RAQt--dQ50CJP.KFCL4B<#3 k 5ӳaܶZaLOOeqRESN +92eP,e*0Ynjg4 RH#ΈAư4N{D]+zIӒkIzΝ)E-M4ۦ#zNiKfU۩rܷng-^K2l6ܱ,ꤕLW,8rP+2".\Ro"Pmi:Fb4&Lktt]E<ԡ o E3u RАSca1|^i*͋l9m3UVϲ}šWnVG$X :f桺*ij\F1m舕km\V&>jM!=\y֥*=A}6-#TK m @0_R5. Q41#YP7`tUXEBPz[l%2&n_jĶwު܊}ԐCK9B#\rjLfOeFYV*Mk~'bU ,>GBUa-ZnEr^P= -zÕQ5)[Xf\#'>җ5@DDM%>qEY]RHRẅ^ZDZ;C &4lKAիWvE\md3q)tv F~PIisޓe>uzeVP7*#,¹q}R[tt/.d "kщeUmM`q .

/'FDD(#e\_ARkum51"Ä\A2 -fG%>FPH踄:h$>ҿ3cRQ2,E÷jR[^ðRgY&ޖKҒ2-ʫ^3gk'uA42fS,M]e,2_;OqVKm[`%*fS4 qdrzdYb Jd.1uHN#gl. -&N+p@IhLmmJmuM: ԾZ9=gD#YtA:}KNp9F6NC}f3s,] - K/YY8#T!j[}=t -ʤO\¹"S1b"K_N_1">R3L(5q٨i,V!3kW-W˅*4wX^}؞^r#tObeWTu -MCU<8Fcn 5[X,Z*cKnaDbcHW2sKhS4þ&Ry6#ƮS0&d~F)VQpFb_CAޏ<3$hsh;6;%y*PmNnq&KqۓKm}Vm -E-,WnN$&|coTg[-Es@ՊU:}+I,!3̛ [ ᴎʰ"[ -U-5)4!Zyǣv8fnC +1XUM?~M.9}K(\XX<`/6zWm-ESqR{G>%pJgU2ú.UJPKi1% wEvT -B蜻CXZ꣨iF',wX3-yڤvJ?LfX/ShOzs=\-}ZdoWMsz/3aDqQ MK"E3$N6#16yڨCP|H4[q -7!vT4K*cii10_qh 3KOXQmBbݣޡ1]I[Sy+kujƙ E}ŋG%V1ܓikb"&Y]mv 6Je mI@D,%CF~ kq\R5l7[,8ê G̗B9lf½[|bGcoNm~A,m-̥jcDžVd#x1h,^0c2\Jp6#EwKlm1VSc!SwGV%Zg܈ -̈́LBk1kNcXדz91ĵ|J" Qtl!o!QU>^~R^BcLҙBcZέ!Vf>4޷D9Ȑ5:F^ujޓ.KA.ߧbO ŹJ u? JCmY%DKun@ҙKT-W mU3r~>e5O4nmʜ4rBqIiin(%1Sׯ5%@92(ݜpln& s_IpKHTjTtrreĠuz Ǵ$Wc'm'+o.F$[%:K/"d9aSbsU3ۧTxXP,Z}y s)S2Zꐕ~g,cT>M11TdfZaXLҢжW&;!Ql͔&*će*HD3C¥qZ>6NUa =Q24LXe"}i -vXuL,<5&3R(Va𚘨-Bm‘n0z~o1Ύ>`)SN-%OGb߳hb)g_J`{8>β ]_'[E0({t!ۉ"<=@P:CeCCl.|<\HZOQH՝SѝZ4U8 ]Z8\Mfؙl8"%s9""#`>.ə>UG`gA()tM6B_opuƞKⳀ_yd'pKZJKY^8˱fD!Ϸ->m\l%)ɃWȗ.ƹY[ Cۙj5ktۻ.JNsOdqZ솚kWhUfE͕7QE3vciz!mWʞ.}w+jsm, 9nSl.`1eo࣫\ctc9U)ě2q Wm>\4-) )գB[ya Do EP~9'O[tWuSt,;=q= }$W1p\l:5̈́96VSl۬"bEکŅus I]$IeZW5 վVaKA62ž9lCp6]aj"EJLQلؓ?!rN. "UȒ{ȽXBO<6 JT~hhh:cu0ۊvտ#gz+B!a*QY1UIw%1#qcSfpMjշ^Ox+{YĤRJi>q 8RMn[!ACqJkO& vIʆͭL_A؏ qǖ@嶸($!iX7ԔGyLQ/+d@n!zT !Iا1vHp䔊u^yvˋ=h5/la}|9†*RaW?xBu`O7)9L+ >u;]{1ImEHcs3ik_9e<8vb2]#Nrq5TʺP«6dwbnh Ern:T?#vy1[l]@?w$3ep-\ӿ]^)HN1PM՗7z89,kPiXvIq#"lt jqa -!mA%ZثaLǵ{=/c;,Ɣ-ʞMC#-SꡇVҟFu.$6cWOۯ1](C00.7Zס(i$v&fŹ!-M.vbzN劈{qKeΞht(*AaBi-Ȯ9Sl߅F՜IЁW%6U$-YICzPf-yNX[eRC#-%ak5`q:ƏQT:(AF޹GIBP8WÚ: V\ -D銫xo#lGsEMʯ1 l-{<;WEbEq3 -cRD*hKsS.;1 1YC~/8P -U H㲽!N;8gg$ s +BK!=rF$'끴DZKu@cn48k O +TډC~]Z߰Huqٱ+^!ٝ6Q -*+r5QyBR"SH^H:)=ϧ>(òΓaD,֛.)XJ%,HϜrb}K,KذX뱱sU=a=yul3PdTp/lz43`9lRr7 S+U3\G-g8pfńЌz a>3:'AaZ'\(uCc\) ͲڷCzz.1`67<#hzSU 8߭Zv٬]aTl8 eSk_SѸ^!Hq%P)y1ٗ T0c"w'rfjdOCtՍJuk坾W;))Rʂ# }4S"Jbo,h$0k#Ɏ}m\s|\H)rJk3dEě KF0Qj<ݵ&Տ򢘁P"J*Q:]pj=7?OV!. d]W+Ar. jCo7eo0L:#w=[b˒J \MTXiㆠW>ނ×U2u[cu!r] dC8=-,GF=FV#Z8q+V':vvV Ij9jyi=e0ClR}sUoopiNa饤)qR+_lƇIgh2ؐnG/ 6&UÓ9ăwV5Vg`Rn)ӥ?3X4->&*vh\m̃4{5V-Bs!xvȲ_}Qj9!)L=~_RCuʕէZiT GQ۞Kr9~qp>Ժ;y -*2cé7JzVq]=8 6O} c<%z_1 -uS !LH>#77QTWBcM9 ~Nm2'H |hp8YfwpԖ%svlSd}4ZO $Q"9̚LXS.OIl h)'KDʉndk0jq]6[F.3> #pm)P[FF#m Gyn6|g|TX{pYE`DG0ά+B3vrbȋRK"7iWL;XdP2[Yəl'bգ3j)ܝBWNz7̯`Dpy 1s*uI  -]jRbȗH|Qc= .|LV'o fz_?ߣ^ejC -F([IvS>ͣt8ZC2om>"lO`F:{"9eԺK(K(ӂ:X0HP* ~-ȩa-uPua.E^3%;=5R 6}: [֏Ex-A^*-S_X"vx6ꌵ1%Gj;i,E!&8ҭ,f#DqL[>OJ gp 4jնP'n$ ZBbP| -fH6|#p0{Db1Uaխ*'Cb`6yiCN_>ڑLz>1F婓xݯm)H~$NX.*3Re׾=pSQOFZ\z0bҽO*RIbuj \&[Ez:p꘍_mBEV!mzC(G2S5ʞ5cԬ+s=jNجaYoVӶeVfna&Vt![o#Naz(74H؛o/lLHי5r`5ei*|>OK8MmK܎;_YxVr%2U [6 uTSX0!A )t(tuf[e Ƃ5\;C@>=g\h8wvդ<,.dBnBu-7Av>ݧ[mb}uh6s"k.ҍR X0_GPӡr$i05pԘ,RRa"f4YQKhN\up2bm}=ՋÕ@|2Nctŏj8(mfG5hJy뭱T.;zK%Կ\}qgrJoe6]Z9S@T m#saZRzuvR^,vdGM nxbbB՞TEÿZKMtY .Qb(=Lk @S2kTU(5c}s^HH;pΊ$oe-m&e^ھRrֆ;q۟G$.X4J ~!5sIb;hYqg*bo{Opt$#W7K.޼إh YZ" oFm&Ki&сm#7vD -{[t|+u~}1m޲]7?G}ۆﺷiy g٬.%Z8b{ 4ŅCȕJ1,'5a E꾸GՕSrX0b&;}S^ѦZil_p9U;c V4 -tVnȣ՟KBV|gҎ#*x`k<8<ON4M:O-Ϳ6-7Jlv;nUnoɧ+/o W[a7uG c1dq \)zc&@tgp21 wnM}7O2''rE16O=ep3j =X n[#q_1r=ӏЍYTo  ۶Kv/ m-(4yYHqZKBFEj@m mCaYkM|D ~~055=?JzCߍ::γ:β5at:FDh>H!+ -\Пߍ8m>ԏjG˳:jͷKoBݭ79.mڍ΍tr/LZPwb"{Jiԙfd(~vP©O/I8Lfb5SeQnWycdp Rfb :}֛T}Ƅ6=Bt0 6UhDdi11amtMF$ r\*uʝrr*^`?ˎ+ן@`?d?Oꏢ`ܿ܏]+q?ӊ>zA뇢γ@V+qCCCgҺDD'SULҔ%v Jk2"4:V[tU5&;#[zqۜ(I*nű$GkdLFuO8쇠Ȅ<Z~ŇCv}aQG4<11J6t1)%{Be'1k!1XWSIӪn:41-t{j":)r'`k{+ݼ<:2uΝŽO!&ryK Oxc<^8fvzqr/mn0ğ>AI^"wvCxOV._rW)9uqYEm2Ld`$欠o,R~;Oa,ݣ45m<s79wp18g7F$5} %^@Mkp7#ݤOIuލʞY͜>'J#8l197)׫f>/]SY#Em\ɲ[?.lg+wd_IYpz=[eE6RvD3fH8;r\]n [snИPQU|ꎕ>Fn1؞k;8b` ̬Vъ,f!s&Ʊے2V%noDڧ_ḯSW\! .i?|p~UgV ӌWx8cc;85<h><㷍c5c5cX5cX5cX5cX5cX5cX55cX5cX5ˬk 2t=h8#K ˄)n3k T6ҀR)X(Vci-qjB#ۯW( rjUMU{sn5T$rx'BQC=LڅCt bGX 5cƱ5cX5cX5cX5cX5cX5cX5cX5rX5cX.kƱkX5cXԤFOx6gk&茩oBcjrCN#'v(nts8"non=5di[޳}6XXBUud(:>,::>v xc8XcX5cXc K(϶m{9* -quM6 c7,8_iFeȖDܑ qƅ/6Zwp;ZV;[> ]p6f-CqL1Q6)}f9 )z(yX齐#Xq{_'o2+;>?l8-3;Wu>u!K퓖qM |͢sU/)Za&0L]DN\HOa%}OGqy7)3~!䎎?կ!tm2;j8%f0o,X}ħfͨ:ˁ>x*.~qGC?#{_ghG#x6'# W[cVL)׹C?D%۟KWUe|UHmtwe *vcK&@>qJ\]u.H- -9 -ɾxemY"k9׶HږCJ^B3{Xhd"&XU~T:b߾_f~/>(vڜa;Ĉ#L5NCbƜ4tU/)U qJqۊɑ~;{EJrUxT2MTkmԭn{\.$i*FTD(/yёN\j8qpZi 'p=gk8DgSR86j|H2T|{[QrŨLjՖ-G (ոXBbu=XGT~5F!p9NVzuvZ}3]y򘙃f7\wPR`]NY\Q [婸n,ę.3po |8N8~Ju'UK۵8kٓ[OO܏uª &#&꭮ˎ- i0S׎ n3rGF7mT=Eg o@ nl -SMqIeV]MIiwoځȏEzҚջBK*c.X! IO;Θ㦵BpݔiOFgy +n\ޝ#y)H\D]KU(=[q.#v=[%%ۨ-%,򈓙XSջza1J?j6=yw+TAeդZcn l-қ݇P{g> h+[۰h"ErX%![!賛U[G4Z\ zCRn8cX8c>|q]?3Z{gΆadq*A@qRB_iZS<%iWVJ}.e"S+y -W!"s$c(CNL[s^- -wE:U!p"-ʛ Tp3By_O3:F4 !׮z@d&͵J P*GBݟJOv;6'HQ H 6QaDJ8 }٪m0]S"TBsCVjp0[Am qiÄ)KvPXG F^yb<2cEIK::䘯^𚕭^BG#<$Cq*5[5 -[p8DzP|CB}e+wY2X*i")|W+m"|3᪍jD>8|,dhdk:NIϭ{ -}0^WS饞 -Ͳ% "X(̴e wOmń!7 ̦5+rŊ7lE&dn y4%v,d:oĺ}F[f3ӱ/;2i-o6Hɟ1@XuЄFKy\KJ= GKvzQoF!\%bݣ5=#rԴZ -%Vați؟sOVvJYjP- PܰLDvBuA;~*^N掆sZWFlۧGn݅?(i6sJۧemXe.7ʵTT;[e^SV*3-l6cr6Qj%nkwTvη0m7uj! ܳcm^G%3).v |u ƨ~?8H۟X"ŷ^j1k:Xmݘ-6t}Ԟfj+|rmnE1*'CH+m'/+ G=3r`}?GFHwrރFگ6E:8J۠W#.L*VzR;݄V (v4)e`\Ry\n&D45h8A kG8r'\XH: Heh<ə`UZ7%|eXM]2➖;'HI%:F;>g 牢,\b]r$f+8:Fۆ*zH7^W*| Gaa saRGNΌrA: -E'IZT-Iee^!W?LJ.7XqRĈ,X"ybη,ۍZ`aM;þ$5>kq,ʰLH{U=mN۲eArRʰ,zxذ&kga+njl^.ęRx<Ε}KlH͡κU-%*;m[? n\R B\6HTibm'#[ܮ,!5p@䶕5JgݦSt4$GntAOٯאW)!ДRٝf"75\>8Ϲq-*%*ރ4Sjop-2̈́DTgf,!!iu|-f9& -be56zX״3`څ+\׺?ӵa6oCTkbvwGsN#mӸScΪTO*urdSI 6ʙl%Q׀M{I㐦Qʹa-nH.&ȋA ) pRzo%K*\v0*T??٪#]]]8anŤ9jKk OT%i]d%\G +O<ƝZlJ`{||n.HM(ť~9bEgtb+ovJ@'b w?P3۞{oy)D*cH@:NtO+;s|nenֹ^ja(*a>,YQm,V2"io1UDZyDV61%uS֜Qg&goNA^豪fkmm 68IQĄDqRAl4q:VBBBABNi:hw  54 `h1qd~ |}<#O?GϮƱ%'Ҟ#>1O$ aӂ.G@{ -q'#O8m6-v4ҹp Kd" 8՛.4<&On bHmopuԲWL-nNi)mai*ѶE C2P6sPRSf91.Qm[ӚLԾ -PHE ZmB-2[u| ]l%* -:m:fʸ:Nt\||Yq FNx!XՔwJ䴐GvCiIq' &dUp -Mc툌<8I$f1[icCO4Sܢ*t%5l7az:vuʢ!k4VXw"ʚG"4*yNTL*lXT ogo>:\'0җf QJDȐp¾`I3(gy2gLtKrG KZ0f&6skDur퓍**Sq<%njy Im-ȏo Y.uԴ-h!Ah҈˖sQKlG 71]DY6p#0mJ|0W 6Rr(9gKq]W[w/Qg -Ճe%Q=RN6ꥺSm5^)lFkMeo6)U$!*4̔VKdi:ʔi Ok=lj5#@vyE : Jxc] yDM6% OkiQRǀumbkL-QʷKz{ %' PZ*4*@A/Q:?'Ҩ ToBBiBaa+% Q0,e&$TUtMvn8{93n'!|mBl1#Ju -61mai2QGX|M]$D,BfjÖM% i Kۋ125*SqдĦ% 0,#HRe4->#mA/ĠДXc^ԇ.6͌ۉq.>@Ot\BuΑ kh:N:hg@nϷGx<3::D#Eh -q5r-mk5YJ>^aʈoibSd]uM֙ϫT=N==eЮs#ҐvsiUm2U_xk㈛{N+fW,]s6w`-'wF9f[__+?O|EfEE8V^bnYQ~;wy` 2];yU8>勳rNp;Gkw+"Uutlo]2ZgD>9

E߷ct]}١QWY6Tn|? :}.Fa߳<|BtIZqi?s7QW)4f6mq]S ~w$rX$kkAng1jSߵ@ߓ~V(L|@|Av]ϫu}u&BV_qRGayo]Ϭ [~C/ 1n<w>VNj+}z/ݞz|BU4oii٬[\wkt/}娱 jcܜE +bwM}1W?%CI4XLm!6?ӳԬOR!nffi~NϹXgvT/)qϓaϢ*~a7n?O#Is>jԑ;l og}>#fT#]Vm]jRc`yjԬGGݬ۸,鼍L~m},jҫVXz!ʋmaζy՘7 r!"s^5Dj,!}> HnWŗT5`^OoW/.*r%w@uQu;mn`Xk\5!V]p?pm!o|cR>ыvSQJr˟Eush;7߬|t_ƪO| -o$۸>~!UEHzqE my~v?)f.#eU ԒXAڳ>:MeG-nn걭_t \a -m+P͟ j>vcHS[| jc?j> 2͊}u~zX渰u7_vN[ܧT}3)6~X>DjesF1ÛG_+1tֳR n,bXle_t9b?ٸ,`[Yfko6D.?ZJnUY+6<-LNVgqwkgs/j Bd+<ÈG.nsѭR`nLogu)1 5?>ԋ*}g½㷂bW|Kї2l@8ڣ6[ؼc5l`˴8?#׍_V ŗwi^[W^im(ӟE? cᣖP1eAϻ@_ a{&9\3ȝ>8ŝ}U\+Vd7#1){b6TҀnkͤ~'1g"4sp~BR7x./6 HCyjBJ/! C[C;|F`z1[G;P W$&F>5n]dbS糼~#K7oWGW?N݀uV/@5?9DګT$o5 FRCE+)&?oApߑ &9WvgᔞQϷq綠ܝ7Oi;DdsYtOv ûTO3b5{A>Ã6v͎8,IԿ\܇:??\c r9/Q"Oj`%9ovy}pj#7Psփߵ|_,|*+/%P*325f];VweG_>8/|;_ 3uy ~'nmp n;Y筇*7eGsS-8^[W)̖>Ϳ)17u1𘟕JvcEb;2jTU"lv"~;8NM9W-{qi!Ds2f|qs>VIRȁUUVwE“:s6osyu\;_Q6dn՛- gy&Ji]noci# -+Y0Xm/(&]€?=}΋{1t.Fdns0v7;/[Gl5#3F`3Wiqww'J?5@ڽ/-up}?ظ>]E}MF#iq</O<(tŏbݳܝvx̉>)N=x n9Ry|Q#0.[MCv)%7(}_T5!Ⱦ]b߲iĶ䷩!Zپsw~GhBk&]ܿζ~~8>U6SЌGζ}va G/ߵاF`]윲z$ꍦ3duma=rno%窈mC6Ǣlj}L3-u:8[ ơ oj.}1gFwɃ巀T/Nﭤ}/?[FCӳ47^R";8uڇ9'8-ÎJ>勵^1_MͥI "^8[t[~PjRH'DN[G-;܎}l9#Vs -P}0w4~/#UYy*qv8aњ5*!=m:/3R1ۛk Yku_o/fWھC[g>RM뷪ǃjjt|&n:caNxo%G`m+|_MR -Gs\~y@NO)|>;EǕ9٠t۰o8-2f#%GTm2GWICJ4.HwXp ?`30f=҅YnY~ھKrĪ' 9|G~~IT =_<ڮUJC}[OnR:N(8z$*Tc7I,;۔SN,1?x ?>OٛkG_T!Wyo+C(԰"wy^[wyÉߍ?:C]֒N+Ϸo 緗Ѵ~3v^y:o'Xn}~i?+bpE6AT܆]xDrί!Smy 3/ -l93P -9R=ʁ[X|;qw50+ m {6sS'?Cr"=vH>{4Ь{7= -?{#o$u$_x6܅ut}?سJp6۸z|,S?,sw_;ab_PXi@{I?Mϖ7ۯW{IT?-7Zj_.pB~R?Ox뼦]-OΓSe'ʻ!#,nN -AijRy=6wպ:gtcO2{/'{V?k/=x99xJl7_unVr/7o33L<̛-]unz\6h?G˾rN܇ 9:3&kk~:uwɱ~?ۿv^8^;˝[3fw~$ʿ->^Ww9m-~)_IW'?x|.}g6ęktwsvÉOr -+# Xfy]nj;xy-;檿%d3<,s*PF;TÛ*%hav6[zޝ|m9N@rU&G>gxME?؞{VV;_Y?qnPx}E õvj}LÛyy5^Ys7{<.99>MFtKx}ݝ Fq|WrZ=FZrYݩ~՟9|~'N+ ?v|ڶǴ:y׶o zӘsSpYmǯ4͍%H=Bs`{^x=fwoumWhn}b'}]N#y>WwՊk(&ѸN!R-v݇+g?fkqp|M3W,˱O-4f5{w?uwP&|w"^7}f Y=Qoٸ[0|6X=giv{;u9jN2N~?[[2|8z1'dsidzy]Ue@A_eFFRьgѭ{3<Ş}Hk2un}sh#9]Nj E onI?~CW䷇ٽN*uO{CM7Ty.9U?#[}yF+;6䷏ݍyyZw*O]M;.9}7n}(R_.lvw֝mD┙4N#U9Sk;m䶁[o㢤98H=g[{W:bmQ,Zy=&(0mw#[|Bۊ*w -͖ﱺY 뷧sNIU5^̱l~g[yzR:E s~"unͦO"ftaۃsk#U߷ycǿ>N,jl|ӳ6qigod|hkpD]YNlwxLsqJo2WY|R+!sc49ݶnYmOldkgdvo -"5W|)WjSj"&{P !Pǒ? ycnV%ehqWo/1{/)?&yDٞ`k{}0ڬ'0o5O-sno~Je U=|_}߱<Ć>έO3wK*rkF>?F8~fAdrMϢ;a@Of {!{s>b&[K纎gUj^^ɱ qQ?' -he=gMl>Qí+mp)Wk7vYmAM5<9ӊ媼[ƶ"xնp=vw|Zj_y -~t#7cຫ8m -W){0d;}?k{aʷv[p>)GW;J"űzѭ2GSOUy[4է}]ݜC*߁wy't5'r{{;,6wx܍> y矉#=(|{@={lƯB 1b=ɠD3Q7m`]OGoJ7~rvf<_˸ROלß6ro;6$un8X1|MEZNݠ=>/^O]y6@Ud[U gG%)O=!pgzy}?ZpwW|OiN1Gs7W[9A}v?'vfym?7]J/(ڴOŔ>Z>* on߿ ju?`sbes{>y{L{63o!6պGUlZj)Qr&5dN)䷈š? Eڱ?p(&f8r/Z׻ڕ69ډ[/n o{_okmʰ$EQ2|Odw*n'U*"8y;˽sTq~yٿF?ۿ? |T< v'vtZ?oc--M]o}_enfD!۴G{tU4b|.˯]֛78Ņ櫱Lڀ$}(!o׺iևGϵt4/-b3 Gr by:hZW'iy+fnT"< -npGu0Ɍ2ŃaZ)j9;r{,rEdolUʄ%r3`0IDi16 -ݹ5BiޙX"U I%!gwn:XC2lͦm~Ou]u| <{GM>wzrNPN9}X(fC}#)dJR-i-[-RBFJ)mЦ-/B+IHI8ƹu544R4]il]I[,VCğ)N?2lգMp@[R:kU֬,ޒ50ٖ*# :Ν?׸N'p'g'0JnLo-k= i*Kj%f\d3fĨhTjq8nBzxL RJZCiu.ɵu(&cb4U%!1vH LZĄ|oķ!|1:jvHdD - -=[l7=>ČMV!U6'2[axu) -I!>̘SS%EQkp*Sg6թ$ l+ đrĴNab-Z@,2[z}،4LqM6b85jCiK/'-pLkmjn}<1~\:6+ U -Bm:Y }tJeYpDY>Y*1-|Ul͑ѷ*ќUD3*.?ݴ~Ɋm??1?m:%v<zkirvΡۍĘ0m܌1 -ěG(8fMW/A@G/;v琵j(VeK΃c1lz;Ʒg_DKl69Hv,GLj f u3I S}+FuSE$eʆCiDKѫbuX2IUuieL]aO^1LUZmk -T7(RjnR jy=}7&lCA5'Qk )U5! -Z5ڊzr3ka!#)c@c\ 5 c@k&tSh:ӤRA $=+"3(Wg> &tS]cXcC;X;X7 D?TlΏ`==GG_Ѹ<F?P5N}QcsJ}hSjoGV?~D}Aϭwޫ߻'8B}H8?|g`ǣ?? 72?>ұ7ҟԏxY8HWߐ>P?RƟZ)N!e4Ć CQgس}: '@cNuѧ@(H.ƀFcƱčcXg;;kC/`BBGb꽝Liԕ!Ũm!ag}bh8;-`p?kFz=gYrc1Yu9nu )?HS,JMj3j*KqOD1v+E甗go-c3j9CgR%Vn[m!,FȨHxjDT1-n 0;P@ӛ0pRFc =;wm{_ڤNGp̢Fq Am~H2u2.)RP33*y€Uj3۷JW9ZY*T0G"joA17㠡T%.$ƎI 2glOAY)[ WT 08_fQ/Fl=&ْV48S&PdB E鱔Jƒ?f- -W عNIp{AܩS*;}h -xA:p5zqmHZ)Cwi䫕5qfwNr(+jt:!õ;Yֻj=&B% Nգk<ƚXJimğFpSk Lv6XBZ@lJ2ӕ1c7SΖ#֔**QkJll!)D4W؜D۩Ʒ\nv\\5o!R4dCݷ'|s[ָ>R F1=R:UB^Dj?;S̾&4$NiH &)ƱƱkƱk#X':,Gx楐3!hvȔ[jX|<6!3h8\&͠YCHAAARJ ugY1hyc.uc@k ƊPm%Z1ZV}&+)"#IXt*e5%g5lYpO"1oR,U|ݮa`4l ђ_izSNW#GA%s&4,U-碓f򊛎J1%0)QbAm 1qoɓ fQ'%b$]:mdJq:YqI[2` s$%3 XIbBCiil%ŭ6pSR[u m E.%iR@X:ιѬ:KcDv.]hғcq=~+RX,<~j[R}4Gq+j,kx] -9LP"ۯf2BU2tDX(K@B^<舞i5S*r^xTg0W+uH(PC[Xj]-_5O$Z7μ<Ę= -+@lc-Km`X2"W5-ir'8A!o:n Ż;JTaUCE%2 )nM֦iMBvи4w15d4M%}20%*>ҭsh(CYxgY6( jyjqmIrƤ}V*G|] 6XkL^pKp=i찀5d+5L45rZ؊ۣqa)tM^n@ z O0 耴3^lGe+jbe0ZS1[RV\&exezd*u5Y[*A!d){LJUeX7ٔɓ` YIyI)Oک>k婾}?ZI6Lz]:h4Uʖe!x?EW9%GKin5LsI3LhLǩ:GJ5tڐ춛 HU=`MZfǐrWP+T=- MPcV]жGE>@P\'fr}mvH0Հ%/TfV}&T#S8M@Gk &0D=̥% "Am1fOv$ V_= -V}( G3aV3R jPUs?-=X -b\H?֡6DDi /͋"aٴ>˾GyZd˞Ou=i.c1!x?WU b: (U΍}C)[糝RFR06В CƢ7|ݏ^km*+i%[QƗm-RZƯou:y, 孨PkIm8opsV/tmAcj\0HHq=iHՠ~ҞKO8 -y\Fz:y S9iLDBӸ]tnDo:G"!G9edzC-k5rc4 ,?LFպVu+f}Ҙ', O,)pwt-)X#,I"?+u) $x#uˬh r c\ƹuˢr r$cJHPJp12-pY$Xʵ6䢾@ 0h]cuV..smF~ZܒíJ"DQkp`ŷذ }Nx% Y,kdŢ[l,4$B@,6`%^nrI܈.y)%9m J弡RQF?jsÆ*T ݌$ɂct5΀TcP5ٳ=8zqt `!#B4(l'}QЁxX kA:.u5ˢNHJqCm ZEdtm%ڐ°KYiZ~Rr#H16pa":t4p;Tiٳ |_>c]Bk5FߖwvΑpj݌ɋO䱄G)#ݪMbƤ@ګ$݁ƱO=gYOc 5c4S4RI zDfR1ڸ?4K%HBQvZ5+Q;lb>5)Ŝ p!ee- -5 BcS7:`zcV5*9e(Y9,P"5=4MW29q4Zj3rPdf9;l:&`G6c0 (sPY )a&tzc=jc E\H՚9n{8tmpWTZ Mh#5cX;7Cdw?`{'8}xŚU%KnEgc^yj -P*դb(ar8,A@w4>Gw:(6"ŝ&I$'qZ-1O"svU*\l\ޙ%BcHpJbUe۴epPG&5f RNj,5_M1e'%mhϏNˋD6So! 8RhAHtP5'Ii)Ӎ%ZTF%Q.@vɊ"uoo3^ڛˬ`M^%a@XEdv=ɍ;]ܖE0T`;'?8}Ǣ)9҆t:#CDg@hcS]c\`cDkXxƱkqvqpoCF8.u(@2"xcDjҡ_EL#^F;&P}t8gҟG;%9 .`6|^BZm Ez#8gP-_Q*ݜ"Ay -w ]C3ɯIfFg#ut.[]" -\u4ZB"YsUlغb9\[@B`qyUڏr^ 9 $ɔٷN:Z.(0Tݎ%%ӄNbD8#BψZ?$vFCX2ZȆDI}.CEf%8 7)+:ͷbK -WSTq\KBz_/N=f-/ڛ\d;|k :>Os1;A˖`1\v o E/Ls% IR>ABW&8,%tR&u -Ru'q2 >JTr) CKMFCŏ"d:Nu548cX4.qĤc@p#@kƱ4c1lp'Lm}N3ýj(C2#G{CSFoT=tNoNb2)Cd|e%ݗ1O[ Q8Զ LqNjzL~x:j:K1DHS-nɆ4"Ky:lvۦPCN'Ѭ*jRBZ}(Cq38e`ն"٠ybn0k|gsFys$h:4B$R4Y[BMQEVa5.;tJ?L4|3eHuVJ#X%.Q+Ƭlj4>l>ͳ6CcuLd1=} -U"bzLGgX8Qt.zZlCQتC*:Y/Ez&-p!,5?I#YqƱ]c\\E r. -i$cJ5tu3^mL|y_yFjTxnj -;NEqj9-堕0>IZw\5݈m<=^$q<l۾YbBzǮσ'X8cX..tS0ڴ^"`Xuk:(tF`Gq.&gE}ƔٶFB*-18> Tv3>K ^ dvr58W_϶8Yb7!FJd&TeC驒=פc%Lҁ-`$7); r7u^py Y? ha}*cIjTyOZ2hwjGx-I%-:Y[JB뫣]i#E( r=!iȶ?.[=q1HO:'9hR0~ŪM]>3!o5*}e58-ZZrdu1GS< uRUŷ,9)ܔ,ZuHs+~dupO7>xD\.*Rrߔ :\o%1 jgتEӋi][?mz둜T(1ջ+Dk;N&ٌdBA} -֞j/ؔkEJTRceahn>on_c8Zyζs[lg9r*ݩNr=zҸDz9[mሕ(=uw>xvIL,)LWhv4Ω톛錘d[SBlAXFcu|ßϦ>ro"+rO4:S45dݣSY^YyJ<6\nH;WpƱrcJa$=@BR4[Ύ[{'[XedxG;Yέa(1^Qq~|t%0Z5ڷ0,bӌGyaqXqhv*~"NҸpH!wi⩴$cu{'?|ug)xg 5Pzhm'Sm;cj>ͻb(-Uʽ)a ⸕={_||S?eWAb"UkKHf#Nޭ*f=_GO6Wh>ZQJ,-!S`Dq.yDR $5I~S?=hhkX5c@xGl,C6'\<γ:*0Vtg2BCAp:[Fr4HKQSFVT'IZOn|菄82 tEh+HHG][2k4938e2RZyOO:Ö&4"uO;İ-cjtphOO)aR"Bُ=S_t8D?Svqʐ>:XAȴh;y'k%/ -!*h6RXb: $sZ=,= jyi; !\H] #/Ɲ g,_0PQsn9DDBA賬ηr(뇅.ZXM.kq$t M5 k+^߮ GH Vk \Ԗ_矄@82ʡ_pOOa.rZj.3a ^}YBgH-Ѽv nFǎv;[1fx?%-&ܭĻ̺M3Z/ 6Xa u%-5.T>e2צ'O{ڂXt-CiXHؒTK&oQ;MQ['gw*;cGp<[E%LHyJmsbC˥mה=`hvq$dc@;U#)"'o(~Y;'|l*8Գd@j+7i~3%د*5l5X#-\WL`KuhH#[4c&HOW*XuEx: -K.ԀܒXymVuN"݅G.lFZ]V%;#-Ʈh~`~v>z| -Kע21u}H$u~k%?FqÈM)(CeQh*,a&ZLt$YHVkA $ 2i'A)Ch !=nu#G(I{DcHκ$t H Fpp:ƱvgƱς|cgݺH#Ǐ{Dς<1#Cg}t=(=^{G底}8''ugF4c@!i:*4u5#FtDiAћ Bm84ν]e% CeR=hZu'hĦ! 2aG<2;G`z|1ʾ[ >$*IatN=b6)I\ j5$]-Ţmd8˙Ѷl"[-G -vlAg[YWZ"DOq\F\EpS oÑ6cJym)% MAjGT$Iv0j,Ab0'Ya<.r-bM;PZCR&lZg8y)8:3ϫ|WOlvsEgV'kfH<.OsQf&!ɝ?VT)Iuߕ*KW1]0 -6'USJ|ISi؆v#P"c)O`3S,%߱Oɵoxyc1-͋ L=h{8{2iTs?5Rv&̚ʎud6EUi.%`8:΁}i[!x?υj2i9f Өn? \ш`7R3`IPKUxXYr4{w+0 $::bDQ&!IP?jf,86*_2ϻU_f^SO.IasE{Wuh [yk=Iq!K%֢v4llJZss@{Gӎ*n#ӏ}3.>Z[|doV &/?°KT\7SLa#vtpzRzO&88$')_]7͠m1 %z]ϹdqMj!InC%U -95uj<%bBBZvY[I+SH6>Lx[c0܆T0ޫSg]m- e -eR|I W<3N ^ ҍ:Lk,Ӱfh:j8Ō.YHKeN-[~{Ϳȉh OHQ@ WyM/脎kj{Z1P -fmO+Wm,%Q!/|~OS=|jn$ntuvS^9IPiUMۃGKaf2q+fiF 1;F>\b'_Gth+?R0hy -i9~I2eg"l&$I>{ާ>j3b>z+n8(s liϢ+ Z!Kf%1Zà"ȊB$5[jC6m)0u0ZyMU[ Xʙt[Ml)=i6-k^Z̋E%1jH\PDLvPNT -Ƴ_(8]-ˊ*^Wpt.mxe5?!Ϧ'|9YҾ[/>K0۰Tܿ0ӣYgmPR^VԀڌzGt~l -by2M2X^)dNNX:J + KhJ@5-rC8] Јj'Gc[u*->Y.8^7'`*s(Sr[s\Ait`v;DAOdsvϏ;U*׹Q~ĎQ|ÍiZEYOFH"WX8[}P 1GWj؜@G{E"K·`T{,d|e4d?>ԓ*F:H`3V.(#L */)rϕA)fyfm -ap$GCuOA Rݱ+c[v @?ʕi Ŕ2> ItrB`LZ.@\{WҵHHBZI1ҧ%լ+Y3C>Ɍ/H{yt;S~gܵy}ρnV^"34\-8svWrcrtumqRƿe1t U. HHS4 )#/V2js Gm֚A(!12J0ݐq@V@pj<$.2B 2l6o_|>Pˊ/gTPIODӀ"Bݞ,3[cݞμYy135/m"ىK$AXV3q3 S?`uMCGD+W*gfVfftp8"7-ۯ)R9$w5 NY^bLuR;lrl%E8s-d;TlA#2',$iZ?rGE\gjWy%iՔ^ .AK(Eet;wa~h:HL -̊3:7Ҋ),TԈӒL7'4GQUL THہ'Q[h S@ LHiɌe!8D"!FD j6\fA i惍Ƃr8$"2"h= h ![HVZ r'Euՙ[Jx Pu0ȟsbqeLEqmI\Hn1Kla9=MW8>UpLt80F#N$)%߭h5S̝H{4:0,Bo ʚJPV\v`Siܲ RV>\dp>~ȯC k#Xk1 kƱkk p#XFpM[8XZ4Rz--0&XZl'Jmm$7xHЖKBDĭK_*zpq*q) 糞{x4Fu4[Jՙ:\dDv:>#R GBRʋ 6%G7!aBY6W03=)ՒGW@12Bګ%8Z+ -r̞Q,`Z9Fj\{W\2aA%iVhvH8 фΓ J:1`%H|GJ6}:!z_nz1+~0K=c}hHu?Q@SQR+߳M$>@:8R2jk;& (!}GKWZ/L51jY\a:un% V/X1E#K>kOYG 45 4BtT"9̋E&=12aqIv,6Jt=CȿGy'uh!eXhv08䧧CgJkeq䖑ʋ1}"l/W[-,&-0;aeMhM~BBQ˘h{16ce+ gFgHwkv:9AZ&SqPl;U6-8=?sO}#o FkwhC+}'V{F-־~c9n(FթP<ӟDD1 h2,%;1 :ߒ˛*$?SPdY%s!JH+_OV) rGnjHTg:t<ڀ9)b\¦'$%V̤ǘހ;/w;GG /p''v'oV*;A󡣩Jd8(V >Bbtv(N@H$@bts*\! ?>r-D 6by=˜NIKKW%򚵌=Ժ0,>Iop-.g3 -[ae u{̧y:E/A~7c?e_!XeMm&2Ґ̆-cIu.1I%N&:4 HOS@Vѩ)A-y#xgY hRNJF4|gT9 -{<]#q#t:?'J0+B0iPyPRbۜ,íZU*9tGomeoRj95]6*%˨D(1@/; YNRTgTLvԄ;R˫,u4!Қ#R/4< M.\%:!FfbrʚP{8(b$zLӇ4K,-#g m>ڍ/ VñSHl5 sRmh@V~Zp'C80cQĄ}>w92ǃpƱƱkX5v1p)h5pXGk1cƱv NF:S`CMb-T!ܬłȒ~9Zs9a_$yt9iϡiץ|摂,;C!IdU&R!,|+QȐ0i^iG|3R&Qg;yН@;'8@t[1%-%v+nCiPHSg8ةF4%7d%'(qeэ߃g(U{=>xxY gYg4;#Y3C=c=τ{5c@p:rN+٬hNԈdsSx]'G1$GF,GBK5vg=q'R~>9c@pƊtR4Pt%*HzUΦ}<#=I;xg|hc=ς.<1>uE;kLJxC>I#'Eaihmt γ{G`x'|31p:CڶA鱍5ꃹR曵`ٰt'΄Yuggp> k< X;6n!XXu#H0gIEh]J7,Q/ hn47j4ކ썤zF脽bhB&i7NYȝDIuұ$>{F`k=ko:1GNE`iZNtt%ZΊI:YҴ4 E@:9kXy&KЗ#BlN/r4?CtNN|:FXz 7^b:Fℭ z7t/`h\E׶bcBH]n6 <:5Νts\C;y4<,}Y={'C|Y 5>!1qr"AQa 2b0P`p3@BR#sSc$?v0-rSٝnBܷ`Z33ZRR50fy>jsB[O3[}Rg&i^O@Q͝ 7%|fxY)b4NUDgK3a%4k=>ZL*Q14'D<6MgiH4C@kff3Xf){K+(IS]7ݔZ#DrO3hJhu ՕYVQM/DL}2mll_$o&eh8bEhj R[I͕v"qi5leEq~hE2/R"TR' QR6\?6UR!K~[xF,űnSY$+^ u.&UT"86&056ir*\3I,fїnّOb"lp书U/陲rzO{kԫijW9%^Qok6kdGb -ޚrN^WK,ry%zF8C.R.HK_߻c*b%8LFm}KEՑihD|_[?Tʸ|c%K-g  /v/Ю0%(dܟ5:సNqq)oz\L7E}rK,ZK/XCM$l\T+yC\t6vN0YyB㇒91Bv>fJ;YJ,VZ0E6ħcQܜ%8czsY-#L! XBk"S#,hra Nfe$ 83ELs (('bDs.Iףb9|/ RҞFUTSA(GeZDc8$!xP2eUq~Rm, 8(N̫ᷫ*Ymџ pcui!'LX*xYh5:,)_ -R6_Rђ !dޯ^eX8/"\WE-.mMz"-?6c.mF;QZՓY$6r=ׯvИL$36%,zK9>$!&+^R(S1F='nUĐ D#|؟h7]oW9ůRQ -lOs5k(uظX6~0,o6\Ժdl\˙>yҾ9RD%ؤW6bǩeRTKgn)?Yd%^➍"ZĞ"ji},$.EjCKf<Ė˻PNYflV%)K+R6&Y'ͣet6Nkg=r[qGiID}ElIJ^}O|͟^#K,1+F\ _?~q*k!)<K ɐ|'tX|2)_b^6md%ue -L'H ͤ[b^Rfl% v3hePgIy,_= t'ͫͩ5*$*o쑵~d&+Kءz`]c)sgudrPU6ߪd+)^I"ǛҮÂF왴2Ms6~fӋ^]edm=z+\A),|jy,Iv3j-g bHFpi&lQQ^У'G Qm;1v/+hl{3Kz3iBĹ?] !U+$&|'|idC^كQ#刢0$Az#sJX|Hs_&pJkD(Hd;8W˲ cͧOGCdh]>"dmE.yiilsRHyev3hd[Ʀυ͛_i8^1kKY2]ȄV[yf)_,}l J-K$)GۏsrLWԢqK80|LO1.G -jWSINV?m=}ȥ}/_gerrZDq$)esԂ(V|i`{DZ^%UlFæ&ƣ!PAj’[y)Ev, + mpB)!,dKC -WXB+ɡBOv|л=%EDU|B`1 -BSQ3Aaf!, a En#Y1%a,!q8|JĴOY% -=?-EQ{I<3)aܹ!F 0^$GKbb*;KwMEciKc\OVFO -ؗ5 #g)~OF!4pJRCzz&64m~)J7u @ylñQhlwJ:/#FimdF}LXԞW(IdI>x" @R4"bVDںBql3؟ߢ&a Z~8H<"Yvwsj RZ}%]z'Ͳ_k6.MQ\BF+ Q5szE_{s;7ɯcj{KkCk-3/s:wjޟ%*_˙43W]ؕ0'Hv|6AܭbkU] &6C(EE?]`_hz`Ȼw3?)$ AWjh-^Ee_:Eem/<m|I ox+]?lIBrb)Bf(^ J< 8SX\!K9I6lv"}R\6 kHV-fXFx摈؛8V[k,qWq/TUZo,^uk^܊Qr!ՐLoOߴv2Vdmm6l?૱^kvyw?aV uԄ=._[$Lt꙳"V_*EIh2!/,y-fHٟ!$%M.LM>So OG{5VK,z,7pa7Rտhe]ß$V8Pde2Qh_ފwQx]e#Q/oO26&W4IPFI Xf*f%t.ٗw\AOj"VXw>H(/L CEʼnSG"QJ$swY#E, -pz tp,Y'8Y+c2!7YY4Q.2mOݲ/o; Wl+i`mKgȹWSf^_r+6fU|V)7/W\b\c'|]Cj$} EBIk.BT=ńq7iPoPO"M#-xYF [)I2Z1< -Ryh!!M_"~}E)Eq4g<}˻YemcF/#gb#v3k[BվzŗSSW@/C/ R-!U/r+6QCЈG-*6OfNZ%QʔVpa7x.)SPŖ\1&2Y1٤"he򨧙`[՗1[D&<+\-c}=PPo%ڻvv7![#g_҆.}K3}B>Rh_$a\[-48c^,Q;%%6edGu3Ó - "`Wdnarbٛ|I+r[8a{_ -ˊfN"m=۶VWھDBMj84(Մg$ՎVE%8Y_&=fUeлY{fUھJQ؈M-2I{f-eF-_2٬иXq&Jp(8Dd[lRKGXwۍse9$W8x7k|+FS#G G3$y*RpIFܕ=fFR2k#Y> sÌrm jU$*o ZdkQi#Z͌%UQy,YItFD)!0 J~I)qL_<"g(| sTsb$Ͳs~HJI.hcBnRlpQY'W6vM2-~;(F -Mභ2/'^4%܈ue<<2lB,^n\J_qOqd'T%\ߏ+-ɜr LYoMǫ.oYGg#vEbL)8.m`#BE j'"m%}̧i(pEЏ%ܮMWl^يQgVK/fнKS?o{Yx"ډ4~GԪ.gM.fIw%T3†\_ж~vOv/">5XeyQODԮ/?/,+_qGnIM<|_q\IU'eg?N~iR^DGL#y-'IX6F|\͜.&oh3/=!3,*%7Q,nMIJ>}}+RΤazKG%5dױnbcDpxlr>q9T/# hir|<4~p'!)!EQiog1,ZɘKi)lq2ؚ'ʒS\ul[$%FT%&\_w3H&d5NLJmD%9\UM᎘ȍ7<\7A$>mouV1#>-.eN&S_ - =l-S6FyɲoHpX8J璥9Tޱ"EAX#ƭD/I&G/bGo+;Ƒgpv?R&Kf<%KQM 焝-2m{G+%9ZH {v/o[xK/Y/cgKT×MqZ%B喋:NKR)^ovlLҖD'ZxL6qducZvEq)z"M$A%FȽ_j^_;=scuβudD洖2fr&14(zr뗪&19y"_LZȱtKrQl-R,h&+̲(U JU,SEkDd|Y,Eh#ح-$%pC֌n\;8٬KS _ dX[HE~.5 #q8,Kv_5h┰Rc#T7lXɫFFghℓ_' -՜27\[' $:)#sQ2NMJ'y7Ñg/fvf80YbcPlYK{~ŰUh)Y*\ -!&fWSeI)Rl {[e8evֱ,M)( _Ͷ+H^%\sm0-Mɥ脼Lܢ9KT8C)BO'M`L%d4VKc'"dYK[B؜6.gZ{q.Md}b*6ej&%l}PO^WY͖BSijNy~)G.QԺ-Djo%=7T8yL|KX $l/Ѳm=Y+>|i㉓ffhOFY郓/Yb(NI5S,KvWж{B+6l:H9iDZ,:!Or-|,6bT055mXm6m)vEv:B]՗/RbCϘ5\쨬~̹/vr+ލuueͪ&Axt+2S66lb6/ITl2`6iJO ĉ.ԇj-Ƞ\ܱ1d9qXK]1m)J;M?w.eYT|HyGBMsHusΆӺ=ۺuћ*Q؊ݎ|$']pզQ>" ><`澤pL\J+ +SXbnÅ<ȯ,R1Suhiy;J; ^ ohgKeiI2>mgE+|$̅\) R_ͣ+#82ɢq{%*™7# bV)t+gy2s"^R+册+J&6- |G E"GHkh\2)-٭YII'qIF c&1±8YpuA)&N~[YL|QK75|f3ˊFS_zhaسOAшKs'ZcN/~f|<,E)leJٷ )rk#'zW-$8! Ÿ&qt3_|)='^xH+|;MdM3o 6ȬWe"4qb,u2M9o٣F1#l.f- Ea9BX̊Ub$SkB3rHYC>5 -Uh5QdmRfϗRO1Yen1ѱ.H|?VV(fF$y6̈ٺA4CV߲wv2C%oRP#ПeKT[~iɛJQ(-bGe³Ns/MdW<˥)x!VޥkF؍&nPg -qTt[foGcEM5K,4,"z{`<զm=~m,>$PזyWj񯒬sx#ǩbQfԙDg,6zReĻZWe#%冀n]9pS/dJMEO}6F9P!i(`(G,5D:Lk? -U)O V ޤg:= M>luVe_2` ,𣌗VJ2S,zU:ۖ1˦m[uCh)IFr2YLbhK&3'&cqQK~pg8.2Ff##M dO~$9g=o34&FO;I?y2ҹ2J2D|߳/4!|mFȻ'q5x"ahG)~o#)oĥ1,iU%8͚F!r_.GEUFc[8ֳ07Lʈjrc[3Eu9o՚Io{G̩1-lٔ7bjlKWFB>q#v|Ksq\)bG{2M&fR%o̲y8ѕ,KzicQ7-´d#45Ş, {<و/'bɔH5 ;oo\(_O>Eg]cRB<V5,1Hg?$8%^7Xm"|;ɟS3~ǧ}hYF#?]1x<^-Jx$r S[υ!(PG'sՙv6(oru8_e4bSHK#lʡ|ud!w&)/3&V%^Q,N0_Oe)ySI/3)#Kd%"9Rn,M*lZ&N$S8<1^9pkȜ>R$\[y#22\>1*F&($Y)~u:xȔY.4/Y>rTR)x %mɩ"˛)Ⱥi)h#&OY5̝K<;_qJ_JWRR>>(gy/F̮RB+ T,V;)_j!7)/ZjB$E"Q8%Ú>,v}LsZ['*C'˜)~~htyz[ef)zE=Q/t.h%1hC߳G!to׹Wj1#=^{Y3-q.[к^VO+te6W$VG[.*8_6V2~HO8hs\' Vl~\LF)n -__Oh4ͮ_v>}ӲXXb<+ OmR+^.tGٿf o}TղH.W<[j-e.+DB/_$l|5Y3%fݿghilcOC,6lKX]/%/DY/~͞Ka|;")Ǒ9!_%khvS 틌aG998|[~ln8dQeW,6n}`:L_;g䒆,KLTouweč1 dvX)PRIC1#Dx by/}yDz<&LKt},fg͞q霖%8Yə,KNr|D,Y2G4K,MR)!Y_&,Y1q<$q/],~w0 bK{Tu38PV7V֣3et1'^>F#8Óf&jؒ#\k(š4{iZ0'Ԏ&$< Ńx1p3'o# _?wc81 0x,o⤌K;K'xk>}+ɬQəE3FcᬣZѕfu1ɣKY6UQھX*F$eݥH0Di$9`˟ 6Gԛ*bM8[Or!ȤN}JOEywB}ۨSڊ'deE(U\ʡv?V[;lχ{o^"/^"[ڙiVqiJu,M>l[[Y"Tպ΅LJrP}= -!{'4][{m8?6VKqEzVDpCܫh 5fU$dT3daƴE' ,z^CG2|D5h18n% +,MIc]U4˛'I5线bCEW .bJDV?M]G_(hetK;Y*353ei$&31({bʡ)/nhG)^vҥ{G%ؿrj'GEJE"IyJoqƾC6[ry!cؗl[8rhƃpI[r[ꌨ-ؒ07x%?90L %dpٳ*e#eRb̈#ǵX)o_$!8 -E4+ș % fH[*6Vd8FPWjj(E]ȔKZj][Ԏ"p71U2pdבl8gφËz#|bORO2IJHy"#ԣ4m; -<͞ QOj,%^CVuM{G,j-l-5}+XDk4FKW'cƠMeU ~Úɣ⦲g{cEL)?LIdM?e&BJChQbQŠ(U4c4d .'#J (–;xjЫ4THE3 -$r+E/d|SyFS~c.GqΨ_-8/#)rfxt^+" -8,B\ -x_>&|[~3mg͑LSa2ygQ%%E6()oɄ%%p<4n+%)}Ls^HWgdMN>JbFȬ4/8žMt.dde\2Aqb-1Qg6*SS8q *}̛Yɦp(Q|1qYZ :b e"ǒd:ndox!ZJzNm8k♅V~JF7Ȱbx$%<^F<Ht?9/WcSUے2$_#ț䔙Z :"+ d<2=7K'/VXh}$$I&c#p!<*FZė:2ܥkC<,V"Kw %ZшLݢjz¨9>HhK™OyO./&M/}ҋ#)~Ĕ$m.?]}JY*>WKR4QE==>-.kpLyfv<)r]c cTm$לB=J!2} 7qBYF$6y6&ޜ&Ғbi&JSٮKš#)MgK.[֨2Z"{M{E 5N>m9gxЍq'|,$+X!d|IbPX-K_K!d[QB$vyE/t\ETבMJGOB+8IX[~Lӱg.*efUxIM>Ha^Rg &e~\?\y9R(Ie47[pֆ3U&B)-ܿk#[49ܛ2o&+# r8'L.D湢S%FR\(mi()2=>K$22aE(Z -⢲[Q N\s䆝Gi^"Jsm؏ b[,3ž..q!ԧ]I6n%.H&Ɩ%Q,HRѶ'&(H!k..culYucgzKF+8 -']Vmi|L  +㜓MG|zSE L+F[#yhZӈO +n#0kv'lP &9Y8j ɡ$JLqN)rθкE[7(,E HGά\RhRneH5%EO:pu끗>{9H$RH<3(mڤȣ1iq#fD:|d-bNU'͢C< 9eܹ% ~tJD,.9KvK1lCn>OYzmS6k'[lT]z)dw(H_)cUW3iQ\h -2圊 X*m)q7_ -j)4WVCe-i|-.-^|M塪EJ\օ}JW@KtGb|SSfτlIŏ/\"Wvf>Yqcɲ/nμ8J iODm=nQJI*~mGE-2F+Qڈ!Vɽq]Xx6HUKu]Q.,>&qc|/QF+D[Ge,)c3*e;B6FQp{6\,kźBOBrr-OЗq] -$dXQ.y^ǡYIDN'P$M<&BI] xeI -ݝ{sxJ&״Axu69dim3dKɢ`SB[&6V;Q ج船Ũy%#y@RJ9R<&ʥSԟi&d,)1|v}ۨ(&[Oˑ9KdKƴ,~M}R\tr -+.l"!Y'Pg"sN͜ -rG6x#əA3kY$j$S,mo+pvR8#$ߚZDx؊"#upm\%YKĤSӖJ{Wq>i^Fϴ ->%^h-yqdlŗ18#3rLN 1[8&b1Iz/?Rufx"f /6[Ol%VIz9FOWv.5G RX.ebW_rlM+6.I-3b)3ZRݗMY|9$}h34,G^W!9E(P>+HP=I2??B^T$EZ|Oh=GқLlR%]S|,v]"W̓HHhd#qIv#MxZTFCdbqMsz`jzLMj(xN%?S'BK*C( OMX%$92r8c,OeMF'0m1b͌POish申TJq<4VEgIxW{/Î2pXŽ'RȔRH%8,d·MphZ!F51XMdug FC+M@S(Z[T=9+@PۉI5ʟ'G#("sy4D!EJ֤T=J|(I:&sd⾛нM&Buu+*YѐrBBOԛIILO\}(┒8dȦO%Tc2=giko- -!*'*źބ6FSelSFDS&fnrDV>{Wdl;ix#ő?hUđ]UxB7&]FtEe8N#qM38F\V;X9QCM,,$j*O ^'\}ߤKWµ*} r~d"2Q%ԩ:*F\V~ElG I,, -) N1Bu#GkÑ>e|T_&clK+)% /:+rLJićO\w5&Ð'Lt#x7\{5\IMc߱uyd)R\8'$a=nd[ƣ^rMx#9"j߬>=bW>Qֹe*( HU,mHǑ|=\F٭d*.d-/4*DRʻF,|ȓ>q.I{1drW*e KgJ^$G%16h6A}Yc,[]u*1E-W=E=зRqJW/rӃ:2F&'_q)z!U%&8'L6}+凳?8ZdE#qnjU\Dk#ThixL4g&j[S'z-^xlO>yp76]9,{ -"D#.i|&qF)I!ŜsMY1b&e@J+ |ig/vy{]؋zOfb\Y'=TJEԙYC6(p9%"} S2V6FkEQGĭrXE¶[)[;&ruK2:3e*e#KrRO %XS̎1tR͐H3dLS8lfKvFn_)_'Џ RݬQKce;47 -"6W򈭇ذcfQU)eV[̳ EI=W3f5qcmot:*NݡT<c[x?_8N8Zep|SE%?QiiJ3 -9#Hؚ3Myӄ'ft9 -O$:K+< "ڹ 3gp&km4N.hc,6=i%_tosB8RlU>3gd_q*Ggl(ʘK-6Y ,k"Dglb{^$`n{¿"FraI69I!<6X<!AXcaщׁf/oglu%C)1F&WiHhGŹɤjm/M1|llQ<(qX)EDe\!96C9zh Msy'}xl DD:|5Yu#G`}98TYjQLM KM6;"g1ŎRi}3Nu->Ӓ'ӑXI.b⎬rUTiO\35Aq"JiJϪK׹%2SFTlN+в4i4b+pKzcudַNئf-49$8!bɓcSUL8>9g hD)0|9"ZF-9M8G^fc+\o[B,6͗*MiF!fx2FqWR:=Y|_:7SbV6(ԍ,ee}V6gමLcՎ<N+FmT)7Gy &ٱH)B,ǹw%S#RBw]S%&9oFѶ[I]vf9QȚ~?5()͐@%Нt&ǵMB^L]IW%ݥd9q86dJҊ6NJ|+(i2= -;KbD;VꟹOTC|t,z@-l#ݙ{rQ6`ٵ)I/ bv![f͟qQ{ň} lBy+.QNԲreG rW'"~彬eq'L?N9jL?REx>+ e㖣ݳu+D.IG7!ɮl{+=grB9N\^Uoq%*h -d`8ŴB/ -|9\F>𒔑$Y.5g<kQ,^7nPsgl]%?ѤslJ\mi:?W6Y%K%˩^61͡[-IFrHV2"l^)s'tofWa)(H?TE%r~coJ*'ԊdhE{pRC}ߓ[)+EI?rRD[-e% )"F1R&d))Aeز<,"ߒX m/QO:^{ "l}H +IءU4h야"ȯb=M5i?Ux*szI6̧8?}Lm`JF"k1ͬhII0f -1-OYJm& +X=7p)xKROE&ԏiNb5d%HOMI%ȶS#RrԄbZD./xĤEWȦRrB_ir' g(Ǔ%س$d$Fm>)ܮU86*d~6Z#ZTNMsc3%&86##̨# oĐrЗl};KR&zKɬK!$3X|^\0-ۭ\)~i[fʑ>lOCyKͬ"l՚3gr6ihp_oe6 VY&6/6Ǚ4BszWx+k)MJ2˒,UUq2h/DrW"N -x:c;o^!N#SR%hs8#$qbho&!8?ə1sJBxy#3|'eHJSP<~B_&52dG<1K%EF/iyMk-X__Ċ [ZISlVgiuR6ޯr* Y88rY8m͔&qxh"jH+\ѱ9 gzkDi}Ot8c2<'q7e}Bs")c8̇#-),%. ')ne*j-(<-dIy!Bp4F"t_,%%Zrˈ}ҋ BtN+-N+ʡ%O'9UgK*g4JppQLҸui*\XL4˭^gFv~G#|z4ˆnqDy㲴\TV(&j_.2YF](QRCfhn?*j/8?ܚGĥ,dM39x;$8bFτ;H1O'¦9bWDS8!T^+3*򳽱”lp9b&[ VXdp8ٕ2xFb,d>L_i - -bkŒ8F6Gs^HjY(EV5S>Ch%G$ojlCM*)Z.پ|\yE9Epj*f¾=~J\ME}f̷f/+|z6,^#s,ZX߹OT-?+ ,,^ŝw1%g6e|K%^S~{!ԏhݾM: jO0G8Un,ma_KG!dUju6;f(wԤ:?TU6u!ڋUD˟;,e fh{v|/r+?oiw1d$B޲8[s[BO,ZYԇRMEOnWʤEje3Ȼb  |\i\xxÞ!-pbh눸-p8+_DJ`-3e^)K.ޤe2ҹ= -;B6)ȚoV@z.!u&57qZbrQ[MYuD[9yd}Q)E>ʡz-ڠ#~N^D2E1o--wi>cy29\n u0Q>~_HQ#1b_qs6GܓCUZͻ!Ex͕yE D iEu/$l1LK66+KV,\|)sR #LZX砡\wYPP58||Xǻ 9~v5h\%bFbk{>zM|vkaŋ\8Y,JXq#9 e!?,o\?!:b)[ؓ4pGgv%ls^Q$pSbq{&qI --nrdG^) [XoRz'̍ɬjbOT8̟idII22="y`$p\3Z6-_IWDA#Z3ʺ"QjE}{,~H>EoTTߩs5f8I!Ir{%5ą͊^8h%d#>*~D9!A엒$hP~Gzɟ'2J3\By߲͒٪m![n*vz Ep69>mNpFpX!'x'C؜v HP[gk(Ȫ+mjA zա{$bMhO M͘%C"^ vJwNmk[/y],4/MIROInk_gÌw"$bvKW,K ]ybyrHImBn,˳}D6g'Ks^\R)cY+)ienKh5\b3gџJ_Ft|泉Sl`[87;-o2%]2,oвdY6 )73N+'EĊcC~ |o zIܘ咨cԆBީ1E {")q\(P8Dđu6bպOjOT""oV3}.DlҥáNrm˞UU,9hɩmXUhp9r_ADq'ݺ#+~[E"(Ϳ-Ⱗnl9d1̦UdǩmOe" -YE-h咫1yPORzn_E˛WK!Ԫ)kV5qKVaivt, }%LϹoBeάՒ'&Y)fνYa>?&pCJ_BrZpǖVY55S"~F'uRqcn$N rT:OOsm| -"!ɶqgW#`_tJ䠋%/- L9T!bsXJ*ZEu 56+k0ee|;dPl~H̴X6YuAږDU"`/KKW&"n^hD~HL+!L}HGdk,eG΄HoKoBl HOobiG3eYFg)/w#ɒ=UrHPHqO,_.J( h|k"gDҎ#9#k$aErdSM싞9(JMVhl|>7Z@6+͆OP\f'"ͮ*%9<%wX\Kvn:/RŹ7ÂHrlщDiap"d(VPYи{2Ҿ*,QDq||i;1S,ym,%HF2Mϟv'R ՟1xȠ G䏁B[-2J&xadVp(c\)˄s2SIHk3Z -Z֌B81%xV7OB˔|\'#Idu>hqvx 1hڦ#a^+ik-^ TJn+z˙YrhuƦ;"Źdz3K%0L٥.I"SX6ɲ[>lU),ɐmrHQ3^2| eĶmǎG Jds;Q".1KK\"KD%*;a.d`n/$bq2a#3<3gbYE}ۨroNmy<\dr!^|NF),a(]H,F z$/5fuպK؝O*|IU,6/QYRDTX$MKiˊgPQ%;d% Jz -Cc$q5(Ea-ؒKC±h~’sYKBՖF^Z|QGU ddN{4[\˅=r:KAД$k\%ͽx5{+xEo31-u R5Gҿ]ƨ4'(,ql.MoJpr'U\ELWN}K泵 sd4N)s?RLk(ʪ&3(&"_8hQ.~M˔Y"(TNh4Te88 ~k;_PK,]O?&˺kٗވveI_okGwԷxDe=8&i&ס<B.^-uEyҴm58^TK>y+$wg)x}FS3ٖr8<8M`"k4# -(Q#9rۛ~s5s7nl)z!nyhѡMW%7䏅'?(]̳lW*Ebgk6zXzcѕgE}~ \ ilUgƥ[*cp~7ȮSǙ;8'ͦ {Dʥ(a&J/G[|>h٣#d_r!@[fleؗFU_j_Į>.IJ&WTV6B8 -fD,$QWѤRjo7Qؗ.?})l5KKRAk̷+r[_ߤѲ[hƜ&OSko>Y~[t]kd*hQ^Hko/92VH([(٫O4 -_WIHحڋ}/aIo~">XFȾl'nIgQ\0Q>X2^߅'jճh^6yH"?r-/yKueo{YzDYBZ^Wl0]?Me}xVrlpע-ǤIKe6}$qk(~aGݏb jY|+x_ͼEq[,~UlєDi}esDel7Wf_伦_a5KaHl6z/cE&}s0YBF/J{Q"A^,6{ﰩ:Ѳբ^=^f_,6~ax\}[6fSԑl͟/}<,E_q^] -_媉e+%.h|&lQoDHRT^M!75ws{mt+l]}66xİ.^le=ȣRO TFZ\9evr!F6VH4_il=Qeqr卥>8^0|I/m߅'mlܤثR!ڍL[l2}}؆^3 F/"1%7A -3VQ nvJ)Hqgl[/Y~ ۧ6K^EʌM~_)zɛqEJ$0%lFfMlPX8z'\ԹE`ǐao_)9j!F+1>] 3h^3͟2~?4sTnhN&aj(edsFbyNBS>&Gj14jhߑ(2y;&؜[q[?D6KyԺ=Hʭ*Z'S#h I DM&N n}%_54|HɉX11b97fԬ1^fe纸$v,"'&Gj% GI8ews,Mo"8Hi-Z&ynp&d/VNmx]諵n~Y'[qBm'RZA;c/E}]Q/.9!GDU߲ N$ޢqh^Q#gxYtW%ǦqqEK' W&j?}< }<$ -jv8o(i"%̜p\ഗ#^EDYei"_#GŧFFDFw"3&lH5&P H6? 7T18,Fx$ - -BBwk62أGj6[U\~#҆RG v/h^q9xK6!eE|#L\t٢ETת+6N --ߧ6HyGGV,\M)g "y7yGji8|(>{M!ct:Oc.^$JqZI}(oвzÙ  I ~ӧOc'ei]Vԗ҉$imjI"*K6Ux~r W%T^(ٝi@QS|GPI>d?7™EhKH_4&[49rY3G$&om*FxlјMg{lN'$).O ܠ5%1|^d!MCQ䏉! '|'$c;dߑF1#9 BBos$q&ex)aѳy"I6Gox3 71yD`7ryG B:#_|]_˩^g3G$ 1ſ,4Ɇ^[㉈lh/^Kdɗedđ;.G#"[r[TaoFVOQ_'#|~VS|.^fz͎ TƦdy=+-3Y>KzijĮ[ʖ 18R|DYຶ9>[%$Ş[ۉƛ#E?M|e|{\b[ڏ3/鹎LBy~7dbCQ9/ +OCRof"/TZcQ#ZrxVþ<~G 8ɘ328bQMpF`ˬM$ngsg2bh`OKKhŒJG f>?bœOYl&f#T=\l~쿠0mBĚ6>Z;WiTɒ/Z69\tɩzجN$r*~ϏTSAyjGEkZ ϙ8<1z|9d'.lMDM{y6{a>4l=z/g()<"2<"vOeͯbx׉ɿrޅ,)_q#'2F$ݙ,[QGɁ7_wh/Dc9p|VdM/37yM邾+ BY6~[xC/O[dV %^5K+D)XzIѴc2\>Ue47 Ek4YlyH%ɎrHqK! I͉JȌ#-&8Ln 5KĜΣr2<)CIV4Uo/f?8P)UQ-+~x%8m3\͠.k\UԥNi54Fpdg!##UYDBpo,s^-eZJ1')<ωSھl~gOTl?l<܄mJ0XIoќ1d`Y %7# |92bhd>zt#+mJ#m1E]F]LA8 >m~KQ+W[ͣA4OeB} Ԟ2SzY<[g䫩WB%E{D ,3N)r3RȜ~k*#[#*k<%K.ܑ֢gZhR^bj9qRy)OQ ++9Ǟ_٤4=fM吪IDpY I"HL/G1Evppk,6pֲk #̒o?,~xD+#tVP{!JRm 5hL+ɴ ^?nK' Q$|EFG/-/ۖn_o㘜Ys1jЌ`n^(jإ빲Y^̦q#kL޸[0 S$p?QK:JH|>[s)eyS\HGo~Xނ7*IliIsX2ĚFc$%dF_GK1Rc#Y!=͎<)s8biNS)? -3\N;"0r8r1)>[CO\z - |Va$b<9K;Zxɖ"(}72S# O-N+y-yK{k3[f-X䞥t B/[$6'mچr(*ű"$'QR8<9X[g6'7>QMs1m;3'שyDV!LQa3~/TKY3XE7O$6Z -(21=\Ã\*)[7m1+q\nWB{O{fqp8)qf(ї' -;4\/i"2S#sk,PzVKZOF$f/(33'q7 -nXX&qE1yFHxF;flդh9GkZ>'94 #XN7 =Q'De'ʒ<c'Ig_[/rR[ɐdx0{K KPIJY-iqd}oin|*L!'_*NmHϤS0&I,\Q#%)%, JO6(ZlN[M஼A|DViǂ xo2qǑ%R\).LK%x>2(`_QL'|;֚>3MzE!oJвx$ȌGœCͬHaGѭ~o؟B+:) ?1GRDu] - -L}w\xNblzZKu]t{Ke XRKse̥}reM"ExaﬧF??%2Q}JWnInC<М\D{I?vB)6v_䣩%3ȶOɦ$2DeG{-+#ze+)CCWB]ω}=GpKt"**[ˉAv,_RȇQnbeJ{V"$"ASވ$i+}yq!t+e]+$?fK>.O;ʍCn?^'іԒ4CϪufCWRO|D!܊v"¾{JI{Wiok6MI*Y\cБ2^Z.-eU}D7ݟRWݺ芛&n)^.s=$OјU&v]e=ue}ԗR] :v~쨣R.90p DHeo؁wqyO2V;t1WBoD⮄2e]]7SڊA%"Cʺt.enr-^Rɕ?r}D7Oٗu*܈y>ѿuK#/أ ?⮟ϯgЗz?RUue} Bo JC_)%ۺ>CD eEeL'lSXT#HzA?uOܫgh_`ȭE]tWj*hK%v_\؊XޛpAk]_ݹ/i`uWj*oФnb";к#e]?]BO1Y_MՐKta_zT;_MnIt,&WHRLuB^c-ݺ*YFG$:?dVo -^2TLvnGRެGR%}E>=n:GqOj1C R>;g-dWDW Y_Bdtw>)>>kد{ЇioRUЇ}ORn{t,ܙZZ,^LOiI_j}>va"ܣK2k-ϫ-iqv*7 ]/S#ԯJ'پ}tܙGqkٞ_z?6JʻwVWL%ђ?CRʊ;&OD{D"}+^t; >0\2ݺUY}dQ[Wigk.>=l]]I/KJQok/."΅K:=d[͠ٲݺzu%ٺ7ne= -UڊvIwQv7zGX>>cTWu,Ɨ.ȿ:YOQ)ţz?^KOpJK.VІD]QhGqVUзȉvJHw"KTdE] - -PR/ϩwQgAn}:t^-fԻлWvw[ovn)E])j*dY.L!M6u#+~ϿgЗz:Dl }It&c#)J{Y #t_.GVЏ \Z#$w\DLAHꊺrިڊn?R%eiOj./6= -V^}JݬC-fԴ ߾.w!ftE]TL~}O;~(.#ۺ%Oܯ'eXUF@n&Й% ue, l!KatBDYS zh.)b;B( **,{R}VuE]/RicQOTGu+E}dYg=/DLC K-e7D"]Zm_BRO޽̿]GT5섽X{(w1viYWo^ϡ%#uE]u,%ԗA(Ԩ Q܇%ԇa/{DuiS-~}/b=./uIWik"!܊Qok6ysJE[FP>>U]ͣpw[ЌCaok6f} TM!%ԩ}yWDUԏR "+u+k ͛7yw?Ww {!2պHq.^7Sފ Gq.ѕ?舓mTLB̷PGu =l%} z_PG/DA_r*-/IGeeE] v^< ni"X^gM oizj{ڈڲ]J܉vn?r=Jz {!?Ey僢(-tMO]FTV"LBF=k#c )DԣRO=eFҒΣaws'ЩBeEAq*Eݤ?%J>r TV;Yu-ǔ_JTWj#ԗBYV{Yw{3On껊{K{Y{,Os˻Yw˻Kt:q'{7L/*EO UШ]P]>}~{B}D?nD:$>?%> "?nv -_zDz!_]$2/.^匧}H6Eh -KY[F ȭvh.)FʽZOCg+DZOXS[6;C,ORޏ{$˻Yu-~췡Ry=)3 u´WTSТ+&=KvXWچ2RЩ:>Boj%Ԩ ~#gWr+E{?y]D:-\..{YsW+.B.ވt3JKE@_r*E ]٢lJQŝ),/ɴu!7Oi[ d{YweݥUڊ{ nk%a[)!܊?t<|BE}"Bq_.RՕbCKhw" -;#+_i5E} w"Τ-yl:wiA!܊ڋ;Y{.Oj6y" vڊ -Pgio=sh#U+S[ͥ[͡ue mH}OQu+G7e/bAD7e%ܞ -چH_CvdQ!Б.B,!$J܊6~?hyEt>JoRrD{Kz~"БyY}۠Wл%Ѓ+*_r*-/m6nT{ME]> -;Qb6h#SVmKznw][z3ib!Ч/Qމ-ϡUЯ"TMKܜ:erP?qK%VW]:"{Й>⮥=诡Q܇1?HTG>FQ} ޥ"=ԭeeW%"5Azŕv//yJQF}QfT.O/Jͣk(oivsKe&mD:Dn{J{J_r*U7C*, -P -:#=:/va}HL}It&G{!]:w"w2>BojE}] -$C{{"=V@DM9/]:+^Ž=%C E]ywyKHGiJ+D:vOj$tHv(.fн7A\]Փ-o;J?z' ϴQZOiRD;-YIki_j%аI:;oij{PBC~ dd:YOz+A}̣d;I.ѓEЁb$A}Ž}Q^׹gDz^+XTdKiOBU[^͟3t6vUڈr] {_QcY/!Qu;Gԫwc6CwiVZ.6l}vމt)WBUЭ2Ot;aYaaB’]~ ;gBVtR!h}It$G>%+CGz%1/HEڷO+/$Anŝ4GV\GGqu+]W2 -Wj-e-)E}OE+ܫDYo EC>,~i#S_͡!m/oBطl)_BUV2eܩ] -Iv_lI麲7VtK܏a^+eOE}w]D.}h6O.,uB2:?y~+[B rkOإE]{l u EL'_җm/6fϺGl.WB ܙok6?D v޷'"SV{"$JW%п_FRK#BR|ذ"7Vt$K/wVʻ_B&މv]]It.? D=G^ퟸA{e} H$%ȩ}?Sh(j6f"Qڊz:2Y)JQwk6ifB=WSڋY{-Y_]USGr#7g%)WiYJOi_RYukECe] /*(D -GvCD0VCB= nAz~#GWBYGz%ٹt&D{.4G"%eFވ%/wZ. Q?d.ҢUڋYv#g麎f+CDY?J{KM]7]{QjYs^GeQ{ew{WDln}w.]eȭ}:w뺮1t,D>@ Ͼ̗$:ntF Y_r+'Qif2~1-XG&E.eDznYx6] /Miwk ++E=J.yOj6eM6rFq>[͟//?{>}R]{-n= F ?f[ԨٗG[Cn]_]*DgDz1z"OQv9%;>[D!t:=7"] =eh}"މvn]3>;Y2Ō /DQ"Q_BҿPj.f~)E:rT= -a(l +B̒,aA%p8j- bLDrK(⮗(sXyW[ĊZ x@_V^Lk-bR ݳ)_~CJP;Lࠟ]ww t'пϮ:XA CDzD2KѤЇ{#>VQފ߱މ a'Eۢ⾨CQh~SN"H'77U²EHKOTd"X#'tHV4IAsT[~xc J)q0>[|3G ?,!+jP8Me2Pa2R>DM7sd+| S|#EwO "1i;>ƪ$e:2 (Pn%RuIE>m_i"nII{+';ٟDR5 _1/wV"hMIh%Xd0(c^J -DWd1 -JI#:eVZQIRK棁ŅŒ4] [9O2Gtl38'5v2JN,,4$(K+L8#n˂2Y?܂[lS88Z\0\(vI,FRo)>hk"0[ordnWcዧĺq!/vE3& 9K8r|jCj8hqhROA#0Y>i$VO(< L|gSc]%On[,OՒYz198eɑ\ЬVIR3G)/u QXqDҚ'd#et8ֲK#8de(Lv$:lm~A -|DW)<6WTS8id/"FNZ9-d(.LR~/"%PMc%I’EUÚ<#ghKYw:Lg{kMH6vlN'8}&Գ,sD<rv?Ы!7[b]F>m'(ĎV愞Bu;\D:nKX< XFiR*/qWz)D:0tÚ*fΡ4FmxD3ok#ןw9+ǦI%˗<ȃkAy2RaS<\#6H[͡ni,6bd5*mʻ{QWz'ǞC("ɤ:_^tE{bJb; ȯK,DWK\a#gQ؊س~AN,KЛK/:R\*_j6K+ǔ擊ma< 3FlOSdCi࿡ǜcDKXu AGT$s_IYx/_Qi`w"HN_Sp>X+dWZ.\(U #[*}ek%5%)ɓN<:#mN%ktbd+Q!o\1Io;HCwj'Z<1fFy-H\qɥHN0IK]n%ВBq>} BYq>} } OcBq>9œ -kĦ4s3 YÍ~ĸq%p6 nQ|6(ƚVr-f,M7 29[Tf/+{}cpw$},w@>IFxLKNK|p<9w7(8)OM)&15cO,ѱAo1)É-g_'$rlhʂO{G&.b[%kY4嗽|$1G& - 74i4eoI#I/'л *ֻ}Le Aq+{CAG{sޔG8߃Fr2&7ѥƳoo BV-~5qK'6xɭFOw?r_//?J0G#0sv| g$jF1<59_ϡ{Q-~ cn,_q>ߒ}K~wi&j#)bL,՘pĞIgpֲcs[ӏ1NYq*'G!^{ίƛvH^-y%3\4FzS~skQ'ƴK-Qэg\r\perK'5mAlM1X1/Y ۢ9ꄟ6./3&LJxgxWRdbT/hc5f<|YCɑWL4{m")Hq,~kz3oiɴOZK{G KFq!Hd!Mo؛%$<$"Oh|/V/4yIhrM8f̍y Lc緡s2R8"أI1ZdtD}!ZE{o 'S'ICE:+DK?RZzO$f4 IDg+-eQZORջ985Y<R|R'1O_΅R8RܐA" jSG8ϑVN|E]kȌV76Tߡ{IvYб%ݬlL! -cdek%9M$pg,2\*dbH׈XƦ - 2=Fߡ/rSb= {^Oc&ő}$D&E$E)?AO_%bJK)%b8f;:'pG -!%Q3,c#qĥ^ʭu\ě;їm;6j*E~x1$F\B. gvG !$Kjy!4L1'~brx<,B[hHw tx%⾄ƾY[\^_R|X6L2*щ^kls\bmU3ϹmY$_ћGq5~fpXߡtӂoܯ%^QH9M8Q49I+$$dQ)"M2/2dNYEsx F1VFM /*l_!-f4L̤p·Lh}gаd+} |>cɢ~d+H^Q(z?W6g͓"l=0ͤTU'9HC1~or6~T&KJs"ݎ-Y:"J>/ܥ -zVO!YƽK/=\ܼWT~6DbB9?"5_r^1ψ dS|bOsƨO EGԮ慧/1N/pi!=Q޸ԚGòZr0⹉N,I,)$t,s,>E]xN4G,S#~f'&EC8YL"͖mhFf9gO-{{Y1%=S-}`L"²PmĐ&[зWq[oE5#%lr 8"ȒCly䄌"fG͓xׅxHQЙ!SV'u˜LTà#%8ԮMykbkr TRR󑈯"냍 /UOgs-%^rLW>9ձb< 5lCQD)4q,kTхx;#NņEEyQ5Y^X> 2)Q,,EkmoePO̦nrz"c,5Uub|(ƬmjbKtzv3|1%|*JK]ЩrDR\Y$#B^b %ɔȯd%3.Mгس^rG H])/1eaq~DDi,^frc%dJs{潉a4,F$XuBK{c&Tu8I,#K Frc`NסR9hK#cj/ iKԥ?B"~fDXz}+ա/bVT>96]&Jr$7Ź:}l&~)+y?K:Hn&FGʰ]b&!K泡g_ i_&eE%TiE.4$f)<3Q=Wj䅺/"ܦI.|1R8󻉧'EŦy G\gB΢=<+"TW~} =9>|D%YЛ~5f?VaXs54{FS5gܞ |E9?/0Ʊ>}ܸ^$x$o R: -UČ\5p+c98"JOj_$eyz8.}|d^D-]5r88&cqE(hi k9G X78}G97MomA?=ʚoPzGIG^%ZbĽ¨<6'=qڛf%3Bq5*mz꥿3xBy=0Y2HI~I>h3S(MQ3.{"ZdDZ8lLrqB$b"id׻O#LYxbmy= )YW8ioD )Q g/.(KزvGōrUƗK=_"{P)>E 4&Һڑ שAV⏆G7QRyhS`|N,$N>ia1<SVߦN0#QPT}+v4d毹BiᲆQ$׹wBzȫGi\}<i>$L)I&gziORפˆ떲WፉҌ^e- 2dOqWi/\%%8:`_-b/S)KD}ʞWҷJMXGć]ғJaM.+-KYznkԎ|p,} 3I(VC2~T^o$uDT0gM M&"7̪Iaqn%͋Սr&8Eʵ2ovXpOmv?ڙR.~ĥ-cl1gǩ)-'2Or?JbX);̗c䆽("] rbhD8&C?fK"T\79еy Y WVe'?Dpl[QgOl*".KПqJ_WLce%'(IK~lkL{9&~M}̛dJKKD9|G<)XM2s\aL/RcePoSH<[,e&cMy!Je*(J5. sT6(o_ Ia)/!4_ʻQŎr8ddת)^Z! y< M$7|'-c͐7#E`_r-Qю Gz"O'/;⠳'N\ĝc|8mOsGIg#' 8&}LȫɢIv_Μi -&"XVDZu<tci]1>Y8LՑOeȡ(()EdJI`2љOS>GzoQr%DE&ۈ59e)2U~K$%$J2ܡCROUF#L_,V 8SxL%5<~1K"Ъ1[xr<-JkW"= KKD^ić.C=_4Y.)he,8c"S -%pE)4C"ٿdDH*~-^.!Пs,K>c A -DcnQ8Z3%Y.pXskVA^LIeDУ렬Fп%d:օkm?tkv?t.h߻)h{rS#ɉ<᳙=D Ǔ 7JK Mc94߇%_.;1D#Z$9G3WО=H'K>NV&Vȷg2] W1Bv]]eJzv,"sD_#FL W,%Y9vh+vgy<5\`1`IqW~gk&HR6'Q~Eb_h_R}dȭ2|ؒ>YԂc6Y8Lds$gZ؏.?s20ip.dJ>F<~[\иN j)X$NE̋·4JkY1ţZ -(f#Y.hH#8RnIhִbFELJZL3Ex,ii8q?QjZ21LR49 z1(r8Iȡk_:} OYpA2 "{IgW# R%ԚYLxӊYiG|v?efr٤d2ُe3,Y<#[ .9`ni Oq4_#0GF ?EI,<O ZDɏ8I9X sO}? So%""ūY>$&$68ɋ\ij.q<0Kslc9!BeƤqn-Vރ<p'?RVߓ"$ɐ IVI$M#&!46쎱4_=BC̭&Eܲ)"eH ( 8$OW. -3YCk{|Ţb}?뽺kmY8%K%aE"άXc|8T^= >GîLVJrx)$$,s1$k1f,$,m" K_hߩ>Iz3,=~O! -0zObI&pYy!:G$t#6В8x8y#W|'̛#9V<-j>lQ$G` -e}Lqcc߮_OLI8R8(z) -V6b6E?#!FHK GGy^'%&J}wR1oBOG FW)^uNK_kvFv&W#2f!-ڙ쾲HѤ#-i$Fƪȕ2=NE,1K#p91F|ː+,z=Ht[[?FKNYL1uMGc&x#<)SOO6%7-$NSDdZ2 !K~ȓ'VB^XF beyʽ[# E⾥} 2V~]ߡΣeY\З>Ma&/6FR^'BP^REz7#Ut%d= e CK'6^EavG&Jbl&f#<' /ϡ$ar,,7&Rȿvln[E}'q,q?2F"_# F2\d(tF,grvJ*X8gVF1aBlb"{ F-2K 9i`y'VVJXElyEE+!9JՑ7X=L+HMsCS##p8'W%Ph^oAf'(p8餵bq$FqEcZg%jXM!\44.)< {CqHO9f䥆a<݃<&NpOЍHTha/8¾^HQdWg?hѭ4jG*HĮ4&]%x㎣Nxj^^DߞdiyB9IV44wYE\GAJ<R8h47<B3q/%-K_|N'ЗyD 4#'(̌VN19I4O\cgeԚ~o(%73Ū2ȷ~xVt-}“,ъ7Ď'G"k.dHO͎. J sDv&W(Ǔ!^E{p1&{-n%WnX6?Yqz4JyZXWԯl\Q/r{,gmm#94RiE$$*!zM`)/]#D8$FifB-(q8y,1T^<ȻWn81Jl97 1Y:fK܂!?&Ep&[_T-Y~坬"y׬Q >Y?=WR|rOdؔVdEI%GdkV.c4`8Ó{#bZ>i ŝO7".mt  %Kt{DECMp83ŝ%[܈̑!K%Ւ^ѳg}]Ֆ|jx& ܯ= 5Yu!`sƄ>{hAߑǁׂ*IuBYՖ K{)- k\!պ] ^{++Z:zY5%A%B-jQ$shs|A[zRb^ y9dN\VMG&iϩ `h%\Yr'2Y{WoQsH\X, /&c6e5cB0>'&8RnQ#ΣN-{LGf [ܔR{FZ0# cvoKX"RSbRcx;ԯI}$2)2}#qXEoAcֹa#[308EVLe} rEK3=ڳI-ؔ<2Ov&S޸$eAhKsG#{q0 Ɇ(gd| |pωh߉ɑRDe)1dROCGOY1d`8ԝi脛bsG cm8a<Λ◙,6\[d 2/i.CbhdPD<+t$O2'б|BD:^LY'~eenO Mi1{0s~H#Bfu Dב_͆ 9RH!D:u#i=1c| -Ƣ^|z_>}}VGK"λG5,[E=XC0%%VJms&y䭑b x-z\E“8GF^坥1Ǒ䳾 ܇O&"=H%u{xȺocdzͤ>>C"VS&J+%4qF9F'KG SO~_33͑"C>LCݏt9&}4'{2H!4V$Oud{I?r B}؛d:!е{YБ?ivKɽUISbd:WI^[!қ'?9jǨD6 E9$*a2Rғxʼn3ƵQ=ȿ!fi4Y%C#{9~&o"}H$DHZ SD}3%crk5)$i4MG=R'?BhIo D\GuI%|ӗ!|)P0g‹b|129zdko19 z FBLrE~EqZ-~"KĹݢ݄q47Qo3'o1ɭ=} -Ivcos }Ia,Q~M.y4 HK⑚|]X>m3In(yzzL:1~M.\jxXŽ&xQMJYG{_3#8x2f"63'HC#6e<%Ilp+b\:zK[[b˖.78x2*MP{׸(M-504 = 4rq1~M._5p-"Cz1TlI6B|ouJOà)Eܙ9Łk%(R>';9>y#(aI|-=ąda#!iIE}D^DGWM/tij+5J)!/"Oz%R6EF~;VzLcvyt$: "H'ԑ29D@A(&HG# u*<,~} MY ϸĈndFXcrIȜWБ}>0G$<1#'ZLlcL=Dfp67j $p&?K/ʢWЗA%[~4' -׸%)6ĈOb.$M{DdC\tn:OđV@cd Gs,2%"-e,qTZ^1^Y8cHQD::jdyY[8,՜@B}Dj";t%nc,!N>b8r*彳flճ'd*D:"D}F4B^ET%2D -k[4!)15b&x9C$%c" 32x̅)9!#4WG6" 'wfԞZ"Dc>ag6%Fm)1nb!LIfHQ!~M!U`isb3{ BLP8F/arp&I"BnqcjxF[̫  Ym&TGS -&ZK,>Ϯ!yןԡ4?вW/#IBȕREhFPyWeвP,8[bExZOy]E]FqȲǓGi^ ):? l6ReyBg~Lѩ07ХdqC ,Kz+į,LF/ĪLG+yG LYg]r?XM9hXb,ayLY -iMt/4B)X˝YQ~/e -P臟D9B1F!y8C臟BQs[8y8?BJ^&!l#F2]]TБEV*(ѳg5F`ل,8!BȿU&hSl '#SX4!,aɉ8΋Y68F/eGc9?XQBC(cȟ袊j7f0W&,9e_~őͣ68F+HY?.f/L]ѡlbCY~8smZET](pX! -l~8QbYB ~ߴU4QSSWFB!=hP(?H]lqUP -m)|:ыu|5Q]iB-!P㭍_1tP; ש׽QECT2Z(qQER2<xR=74)pz6_cxS^ -(Уp͌" śt(8Bh Z}c)x}1B5%P~FF(}Pc?+Pk/=% # Mz-uC腑%Ҋ(pfv9Bƍn>G4f͞+.Y㥖\_WD_KQE־wcN8 (C6y1Xx^a/Kh"dQbbǁ 1c;Ye_ֲ_UE9j<QSE -CֺQ(KC1]#4?ҸJ8B,1`QFkcC}]4>Xe,je4WE}*QQEB< K_*PurQEE -\ -]4hp #ȍ_e}6?1FB,7Jp |;n%Ƅ,Nly|6\Oq 9]RE -/E;$PwC鲇͗6_Eu؇뭖\KQEQEzU6_̽uzǮz3cM zu]Qs}u]WTlQUŸ}z3?ZRCk&Q]+- -N -t(&Yse]jǁ`Ϫ|7NX_5J'ju]k੮?DX}/7u/SQr. rur.Ϣ]KQN>K_F+];tr*o;Լt],vetPԨ1qJ_+⹿Uܷs~ucV=uzՏJR 4lJƊ**+X͌BWl^F3Ga`؎00b,F<#ɨAcc4,ز,Y6,hilX7My< "61 GQ,|x4#p1df8Eb6l1hX7X7MǃHЅ`в!c#BɳqAcRBXhlYMY6rŃf&lf8#PbNC#BɳqAc]7 3ebMhX &Ńb8xOybF< dٸ?F9 &őd؅g!4jlFǃQ`Q#9 4,\j9}zBGEbȲl1FBDn03#BɳfG/t8FHbXdYEdcаlF87vlY63Fply؇Xdٳc?thХz6r"ٱMhX4,B6qlY61ѣ #ر1ɣM6j_:.q6lF͋"fB!eض#gc#GGb6#cdвlY6j_?]qX&͈؅g!4,l[8Mx4hc,B&lr R1ٱBȲl1XbEbزlx 8 #c"Ⱥr}Xr!l؆,&1,1`ء&<4q!dF3B?EC_}BC8E "ɱx_8[.4Xڄ"Z9}_.e__F<8b}_h^j5.n6xFmWkDe.,up?B]R*+ qtlYKX1FBU`N\_[,J4hB͎V}.'E2ަo⨮W]BhЍ<.ǁB먯g5;?q}X8g#4X !5+?Wo#sCc5+?zEQR+Yen&ghQ] -5B(}!}Y#F>QqCq9pˇݱ4xġMCLJ}AzQ^?Pa#PxȰ,=(b鼨**+*nY}PlBF"/fѱ1yE5+= BW6\Yevgfjt'7s٘FQF#!*n9ceh)<]vHhF*|*n_9];8F0# *V7] L(Ye]4%҅5884qT5 -R4hXsy8`y2hxP̡ȒlGqySpR}?aBß8Yc^0PhP`~Fh8Q&U!dK1?fqZ./j8ETJ*+ᢦESG thEqtvC8L<[%d,cȲ4mвExgiMO _S|=wR((S5EEQE1$ 0`@AP1!p?BB -('@( P(P( ~j]C\?ΎuA RzCK(1p߭ c~kWU -{ "@(PxŽqCI(Ao0CDwB+A:Wk*6 yDWz5v }yRt*Whl[ ۏJ\EE@"_(xP?PpͣhQ(1Qĕ*TzҊ(?OJ+-&CF|Ԕ(T$`2 ! -Rzg]<^P8>9 $(2 lJ9 -4q9-8J*ZT䆎Y⟹>P"ܮ`ÕZTOpT(PŎECǀxi~qv -tb/BAB<~Oڔl,h|Bva>4(P(P(]tt]4_K -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000008216 00000 n -0000205041 00000 n -0000205172 00000 n -0000205370 00000 n -trailer -<> -startxref -205507 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/5e167877-96c4-4ebd-b85a-07b723ddf962.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/5e167877-96c4-4ebd-b85a-07b723ddf962.pdf deleted file mode 100644 index cc1c8c2..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/5e167877-96c4-4ebd-b85a-07b723ddf962.pdf +++ /dev/null @@ -1,2552 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 0.0000 -792.0000 206.0116 0.0000 0.0000 792.0000 cm /Im0 Do Q q 0.1908 0.0000 0.0000 0.1908 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -35.283 0 0 46.25 1.82 3642 Tm -(Di:83460 ) Tj -28.1725 0 0 47.5 -1.15 3591 Tm -(P.ROIOR:ARIAN ) Tj -21.5449 0 0 47.5 210.95 3591 Tm -(VMLENTIN ) Tj -21.0402 0 0 47.5 350.97 3591 Tm -(UNGIREANU ) Tj -15.9575 0 0 46.25 0.81 3538 Tm -(-R ) Tj -23.1347 0 0 46.25 31.89 3538 Tm -(PO: ) Tj -35.9232 0 0 46.25 75.08 3538 Tm -(:C3S-C12 ) Tj -31.9778 0 0 51.25 0.81 3432 Tm -(LENI ) Tj -33.9707 0 0 51.25 88.64 3432 Tm -(C.U.1./C.LF.:RO1879856 ) Tj -21.4526 0 0 45 18.6 1993 Tm -(SUBTOIAL ) Tj -43.7464 0 0 52.5 3.93 3317 Tm -(UH: ) Tj -26.2254 0 0 52.5 93.51 3317 Tm -(SPAARE ) Tj -27.8232 0 0 52.5 202.87 3317 Tm -(PRBRIZE ) Tj -32.0602 0 0 52.5 325.81 3317 Tm -(ESTIVLP ) Tj -32.7778 0 0 65 17.8 3255 Tm -(E18:2X03-) Tj -26.5243 0 0 65 161.68 3255 Tm -(\(62507 ) Tj -34.6887 0 0 65 245.56 3255 Tm -(6-261550117 ) Tj -46.9609 0 0 47.5 10.89 3207 Tm -(AT: ) Tj -30.6398 0 0 47.5 103.78 3207 Tm -(I6 ) Tj -30.2736 0 0 47.5 140.82 3207 Tm -(ENIC ) Tj -22.6023 0 0 47.5 220.89 3207 Tm -(MRFUYATA ) Tj -21.0127 0 0 47.5 357.09 3207 Tm -(NARINO ) Tj -0 Tc -53.75 0 0 53.75 11.8 3150 Tm -(Z ) Tj --0.035 Tc -31.9656 0 0 53.75 41.66 3150 Tm -(00:7E3 ) Tj -28.8709 0 0 53.75 143.63 3150 Tm -(6422 ) Tj -31.364 0 0 53.75 199.66 3150 Tm -(76061637 ) Tj -45.6565 0 0 51.25 11.9 3102 Tm -(AT: ) Tj -23.8736 0 0 51.25 107.83 3102 Tm -(IG ) Tj -22.4127 0 0 51.25 141.87 3102 Tm -(ENICA ) Tj -20.8675 0 0 51.25 221.9 3102 Tm -(PARFUYATA ) Tj -19.6462 0 0 51.25 357.91 3102 Tm -(MARINO ) Tj -0 Tc -47.5 0 0 47.5 11.82 3047 Tm -(Z ) Tj --0.035 Tc -26.8469 0 0 47.5 40.87 3047 Tm -(H00:763 ) Tj -27.8016 0 0 47.5 143.65 3047 Tm -(6422 ) Tj -24.9965 0 0 47.5 201.73 3047 Tm -(763061 ) Tj -25.6155 0 0 47.5 277.67 3047 Tm -(637 ) Tj -0 Tc -47.5 0 0 47.5 11.77 3001 Tm -(P ) Tj --0.035 Tc -23.5179 0 0 47.5 40.95 3001 Tm -(AY ) Tj -22.9691 0 0 47.5 88.95 3001 Tm -(AIRCO, ) Tj -23.0586 0 0 47.5 183.76 3001 Tm -(CRATATOR ) Tj -19.2489 0 0 47.5 317.96 3001 Tm -(AER ) Tj -20.9591 0 0 47.5 371.78 3001 Tm -(CONDIT ) Tj -42.343 0 0 53.75 27.84 2950 Tm -(Z0 ) Tj -27.7502 0 0 53.75 95.65 2950 Tm -(697 ) Tj -30.7535 0 0 53.75 142.56 2950 Tm -(54|1 ) Tj -27.4792 0 0 53.75 200.04 2950 Tm -(183170704 ) Tj -28.683 0 0 48.75 41.83 2895 Tm -(ED. ) Tj -21.8521 0 0 48.75 89.77 2895 Tm -(CERE ) Tj -29.0073 0 0 48.75 170.59 2895 Tm -(58 ) Tj -25.7833 0 0 51.25 11.87 2849 Tm -(RJNOTIE ) Tj -23.516 0 0 51.25 163.89 2849 Tm -(BRI ) Tj -0 Tc -51.25 0 0 51.25 219.89 2849 Tm -(X ) Tj --0.035 Tc -23.0785 0 0 51.25 237.89 2849 Tm -(FEST ) Tj -19.9163 0 0 51.25 304.63 2849 Tm -(SOUCA ) Tj -32.3819 0 0 45 12.84 2799 Tm -(PAY ) Tj -25.1525 0 0 45 89.53 2799 Tm -(SILICON ) Tj -35.8912 0 0 45 198.57 2799 Tm -(300 ) Tj -23.5477 0 0 45 265.95 2799 Tm -(ANTISTATIC ) Tj -23.516 0 0 45 412.75 2799 Tm -(CIR ) Tj -0 Tc -52.5 0 0 52.5 31.68 2746 Tm -(E ) Tj --0.035 Tc -28.5987 0 0 52.5 44.67 2746 Tm -(900:018 ) Tj -30.7671 0 0 52.5 144.61 2746 Tm -(642689018499 ) Tj -42.0273 0 0 102.5001 21.94 1845 Tm -(UA ) Tj -22.1702 0 0 102.5001 91.87 1845 Tm -(LE ) Tj -28.7803 0 0 51.25 304.87 3943 Tm -(FIV\311-HILDIG ) Tj -28.0753 0 0 51.25 481.48 3943 Tm -(S.A. ) Tj -18.6536 0 0 47.5 223.96 3893 Tm -(AUD. ) Tj -21.362 0 0 47.5 290.77 3893 Tm -(COMSTANTA, ) Tj -17.8322 0 0 47.5 441.92 3893 Tm -(MUN. ) Tj -20.6943 0 0 47.5 509.78 3893 Tm -(CONSTANTA ) Tj -24.1963 0 0 43.75 291.55 3846 Tm -(STR. ) Tj -21.3258 0 0 43.75 363.74 3846 Tm -(\(ON ) Tj -20.3049 0 0 43.75 413.9 3846 Tm -(RONTA ) Tj -21.0452 0 0 43.75 496.09 3846 Tm -(NR. ) Tj -0 Tc -43.75 0 0 43.75 550.47 3846 Tm -(3 ) Tj --0.035 Tc -20.266 0 0 52.5 188.76 3796 Tm -(3INE ) Tj -23.9116 0 0 52.5 256.95 3796 Tm -(ATI ) Tj -24.87 0 0 52.5 305.94 3796 Tm -(VENII ) Tj -19.8947 0 0 52.5 391.86 3796 Tm -(IN ) Tj -22.1501 0 0 52.5 428.89 3796 Tm -(MIGAZINUL ) Tj -21.7888 0 0 52.5 565.9 3796 Tm -(BRICK ) Tj -28.7323 0 0 46.25 319.69 3745 Tm -(CIF: ) Tj -26.8208 0 0 46.25 387.87 3745 Tm -(RO10562600 ) Tj -21.21 0 0 45 13.67 2699 Tm -($P ) Tj -15.704 0 0 45 42.92 2699 Tm -(RAY ) Tj -20.5019 0 0 45 90.78 2699 Tm -(CL ) Tj -20.9445 0 0 45 131.61 2699 Tm -(SFUNA ) Tj -21.7017 0 0 45 212.95 2699 Tm -(ACTIVA ) Tj -20.5647 0 0 45 306.9 2699 Tm -(PENTRU ) Tj -18.8722 0 0 45 400.8 2699 Tm -(CURA ) Tj -33.9509 0 0 53.75 14.8 2639 Tm -(E18:2\242051 ) Tj -29.6673 0 0 53.75 185.58 2639 Tm -(52354 ) Tj -28.4045 0 0 53.75 254.64 2639 Tm -(6426489007929 ) Tj -39.4395 0 0 51.25 16.27 2590 Tm -(SA1 ) Tj -26.665 0 0 51.25 98.84 2590 Tm -(ENAJ ) Tj -32.5934 0 0 51.25 160.79 2590 Tm -(240. ) Tj -22.5813 0 0 51.25 227.87 2590 Tm -(ECOFRIEND ) Tj -32.8392 0 0 43.75 12.81 2544 Tm -(LZI0210162112 ) Tj -28.7846 0 0 43.75 228.48 2544 Tm -(8646809520908 ) Tj -33.1906 0 0 43.75 12.38 2495 Tm -(SAI ) Tj -28.3853 0 0 43.75 80.83 2495 Tm -(EAAJ ) Tj -21.0881 0 0 43.75 160.88 2495 Tm -(EXTRA ) Tj -25.9464 0 0 43.75 242.69 2495 Tm -(35L ) Tj -25.7198 0 0 43.75 296.64 2495 Tm -(508UC/SET ) Tj -27.6479 0 0 43.75 430.65 2495 Tm -(60 ) Tj -36.8407 0 0 41.25 10.86 2449 Tm -(ZI ) Tj -30.0217 0 0 41.25 49.68 2449 Tm -(02:1\2540021033182 ) Tj -28.0599 0 0 41.25 269.64 2449 Tm -(642276E020146 ) Tj -34.5182 0 0 51.25 9.36 2398 Tm -(SAI ) Tj -26.665 0 0 51.25 97.84 2398 Tm -(ENAJ ) Tj -21.0881 0 0 51.25 159.88 2398 Tm -(EXTRA ) Tj -26.6117 0 0 51.25 241.68 2398 Tm -(35L ) Tj -25.9359 0 0 51.25 296.63 2398 Tm -(508UC/SET ) Tj -25.5211 0 0 51.25 431.68 2398 Tm -(60 ) Tj -33.3391 0 0 57.5 10.88 2348 Tm -(ZI0221e082183102 ) Tj -28.0742 0 0 57.5 269.64 2348 Tm -(6402768028146 ) Tj -32.8904 0 0 61.25 11.39 2295 Tm -(SA:1 ) Tj -27.0066 0 0 61.25 80.96 2295 Tm -(UFER ) Tj -24.0942 0 0 61.25 170.75 2295 Tm -(OPTIN ) Tj -29.7118 0 0 61.25 256.64 2295 Tm -(35L\(15\) ) Tj -21.2168 0 0 61.25 365.96 2295 Tm -(ALBASTR ) Tj -32.3836 0 0 47.5 14.8 2247 Tm -(2:8210113106 ) Tj -28.0742 0 0 47.5 207.69 2247 Tm -(7290014006522 ) Tj -25.9154 0 0 47.5 15.85 2196 Tm -(LAAL ) Tj -22.2339 0 0 47.5 94.76 2196 Tm -(CFBLU ) Tj -22.8748 0 0 47.5 176.89 2196 Tm -(PUS ) Tj -18.7772 0 0 47.5 231.8 2196 Tm -(CU ) Tj -22.3278 0 0 47.5 271.95 2196 Tm -(ADEZIV ) Tj -19.7692 0 0 47.5 365.96 2196 Tm -(ALB ) Tj -24.6743 0 0 47.5 418.14 2196 Tm -(12X ) Tj -31.6492 0 0 56.25 10.81 2143 Tm -(EL/90:488 ) Tj -29.9402 0 0 56.25 151.62 2143 Tm -(6699 ) Tj -26.6369 0 0 56.25 213.88 2143 Tm -(490919743 ) Tj -22.1976 0 0 56.25 9.89 2093 Tm -(PUNGA ) Tj -19.133 0 0 56.25 96.91 2093 Tm -(MESTERLUL ) Tj -21.0926 0 0 56.25 218.78 2093 Tm -(CHSTOR ) Tj -23.8151 0 0 56.25 311.72 2093 Tm -(30X65CH ) Tj -21.6093 0 0 56.25 417.9 2093 Tm -(BRI ) Tj -31.4072 0 0 43.75 19.89 2051 Tm -(Z960:950 ) Tj -27.3474 0 0 43.75 149.84 2051 Tm -(EKI09022318 ) Tj -28.3496 0 0 42.5 12.83 1693 Tm -(EST ) Tj -37.7998 0 0 53.75 7.72 961 Tm -(ID ) Tj -31.0173 0 0 53.75 47.85 961 Tm -(B/: ) Tj -31.7444 0 0 56.25 9.89 1589 Tm -(10A. ) Tj -20.8382 0 0 56.25 85.82 1589 Tm -(TUA ) Tj -31.2455 0 0 56.25 139.93 1589 Tm -(AI-) Tj -21.2817 0 0 56.25 194.26 1589 Tm -(19% ) Tj -39.8436 0 0 45 10.57 1540 Tm -(0A. ) Tj -21.3464 0 0 45 80.81 1540 Tm -(TUA ) Tj -20.8001 0 0 45 132.88 1540 Tm -(EON ) Tj -0 Tc -58.75 0 0 58.75 19.7 1485 Tm -(R ) Tj --0.035 Tc -58.2617 0 0 58.75 28.71 1485 Tm -(PZ ) Tj -31.4416 0 0 58.75 114.85 1485 Tm -(M1. ) Tj -36.8051 0 0 58.75 174.73 1485 Tm -(IN ) Tj -22.5624 0 0 58.75 224.89 1485 Tm -(BON: ) Tj -36.4314 0 0 46.25 10.99 862 Tm -(/4:0:4700110\)7 ) Tj -27.1121 0 0 55 326.71 1151 Tm -(CKPOS-CT2183460 ) Tj -0 Tc -56.25 0 0 56.25 607.03 3270 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 56.25 622.9 3270 Tm -(BUC ) Tj -0 Tc -56.25 0 0 56.25 676.88 3270 Tm -(X ) Tj --0.035 Tc -30.7249 0 0 56.25 703.64 3270 Tm -(9.01= ) Tj -30.8624 0 0 56.25 784.64 3270 Tm -(9.01 ) Tj -0 Tc -56.25 0 0 56.25 852.87 3270 Tm -(A ) Tj --0.035 Tc -19.3223 0 0 47.5 364.91 758 Tm -(BON ) Tj -23.0709 0 0 47.5 417.89 758 Tm -(FISCAL ) Tj -0 Tc -46.25 0 0 46.25 288.73 711 Tm -(L ) Tj --0.035 Tc -28.3256 0 0 46.25 359.67 711 Tm -(9000221498 ) Tj -0 Tc -46.25 0 0 46.25 586.38 3176 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 46.25 596.56 3176 Tm -(SET ) Tj -0 Tc -46.25 0 0 46.25 650.9 3176 Tm -(X ) Tj --0.035 Tc -28.8653 0 0 46.25 677.99 3176 Tm -(16. ) Tj -25.3634 0 0 46.25 718.64 3176 Tm -(50= ) Tj -32.3752 0 0 46.25 772.87 3176 Tm -(16.50 ) Tj -0 Tc -46.25 0 0 46.25 853.9 3176 Tm -(A ) Tj -50 0 0 50 584.25 3075 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 50 597.56 3075 Tm -(SET ) Tj -0 Tc -50 0 0 50 651.9 3075 Tm -(X ) Tj --0.035 Tc -33.7631 0 0 50 678.82 3075 Tm -(16.50: ) Tj -32.3752 0 0 50 773.87 3075 Tm -(16.50 ) Tj -0 Tc -50 0 0 50 854.89 3075 Tm -(A ) Tj -52.5 0 0 52.5 579.16 2969 Tm -(1 ) Tj --0.035 Tc -21.912 0 0 52.5 597.9 2969 Tm -(BUC ) Tj -0 Tc -52.5 0 0 52.5 651.89 2969 Tm -(X ) Tj --0.035 Tc -35.0049 0 0 52.5 678.58 2969 Tm -(38.16-) Tj -33.7659 0 0 52.5 772.59 2969 Tm -(38.16 ) Tj -0 Tc -52.5 0 0 52.5 854.88 2969 Tm -(A ) Tj --0.035 Tc -31.7874 0 0 46.25 776.62 2916 Tm -(-1.91 ) Tj -0 Tc -46.25 0 0 46.25 856.9 2916 Tm -(A ) Tj -48.75 0 0 48.75 586.29 2763 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 48.75 599.9 2763 Tm -(BUC ) Tj -0 Tc -48.75 0 0 48.75 653.9 2763 Tm -(X ) Tj --0.035 Tc -29.2827 0 0 48.75 679.82 2763 Tm -(25. ) Tj -25.8258 0 0 48.75 720.73 2763 Tm -(07= ) Tj -32.0406 0 0 48.75 774.8 2763 Tm -(25.07 ) Tj -0 Tc -48.75 0 0 48.75 855.89 2763 Tm -(A ) Tj -46.25 0 0 46.25 584.38 2663 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 46.25 599.9 2663 Tm -(BUC ) Tj -0 Tc -46.25 0 0 46.25 653.9 2663 Tm -(X ) Tj --0.035 Tc -34.2379 0 0 46.25 679.8 2663 Tm -(14.99-) Tj -32.8658 0 0 46.25 774.85 2663 Tm -(14.99 ) Tj -0 Tc -46.25 0 0 46.25 855.9 2663 Tm -(A ) Tj -50 0 0 50 562.25 2557 Tm -(1 ) Tj --0.035 Tc -19.9028 0 0 50 588.9 2557 Tm -(ROLA ) Tj -0 Tc -50 0 0 50 654.9 2557 Tm -(X ) Tj --0.035 Tc -34.2776 0 0 50 683.8 2557 Tm -(10, ) Tj -26.7305 0 0 50 723.07 2557 Tm -(15= ) Tj -31.8847 0 0 50 774.88 2557 Tm -(10,15 ) Tj -0 Tc -50 0 0 50 855.89 2557 Tm -(A ) Tj -43.75 0 0 43.75 610.47 2458 Tm -(1 ) Tj --0.035 Tc -19.1969 0 0 43.75 628.91 2458 Tm -(BIJC ) Tj -0 Tc -43.75 0 0 43.75 681.91 2458 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 43.75 708.54 2458 Tm -(5.53-) Tj -31.6613 0 0 43.75 788.55 2458 Tm -(5.53 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2458 Tm -(A ) Tj --0.035 Tc -22.0252 0 0 50 616.8 2356 Tm -(TBUC ) Tj -0 Tc -50 0 0 50 690.9 2356 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 50 710.54 2356 Tm -(5.53-) Tj -28.5573 0 0 50 794.6 2356 Tm -(5.53 ) Tj -0 Tc -50 0 0 50 858.89 2356 Tm -(A ) Tj -52.5 0 0 52.5 614.16 2249 Tm -(1 ) Tj --0.035 Tc -21.0765 0 0 52.5 629.9 2249 Tm -(BLC ) Tj -0 Tc -52.5 0 0 52.5 682.89 2249 Tm -(X ) Tj --0.035 Tc -39.7318 0 0 52.5 709.43 2249 Tm -(5.94 ) Tj -32.9029 0 0 52.5 789.53 2249 Tm -(5,94 ) Tj -0 Tc -52.5 0 0 52.5 857.88 2249 Tm -(A ) Tj -43.75 0 0 43.75 589.8 2157 Tm -(4 ) Tj --0.035 Tc -18.8722 0 0 43.75 615.91 2157 Tm -(BARA ) Tj -0 Tc -43.75 0 0 43.75 680.91 2157 Tm -(X ) Tj --0.035 Tc -33.1889 0 0 43.75 707.79 2157 Tm -(2.24: ) Tj -31.6791 0 0 43.75 787.43 2157 Tm -(8.96 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2157 Tm -(A ) Tj -51.25 0 0 51.25 610.2 2050 Tm -(1 ) Tj --0.035 Tc -19.8736 0 0 51.25 628.91 2050 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 681.89 2050 Tm -(X ) Tj --0.035 Tc -30.213 0 0 51.25 708.68 2050 Tm -(0.72= ) Tj -32.6476 0 0 51.25 789.65 2050 Tm -(0.72 ) Tj -0 Tc -51.25 0 0 51.25 857.88 2050 Tm -(A ) Tj -52.5 0 0 52.5 215.88 658 Tm -(A ) Tj --0.035 Tc -19.0521 0 0 52.5 230.91 658 Tm -(RUGAH ) Tj -20.6877 0 0 52.5 310.62 658 Tm -(SA ) Tj -25.2082 0 0 52.5 350.88 658 Tm -(PESIRATI ) Tj -19.8147 0 0 52.5 470.91 658 Tm -(BONUL ) Tj -20.3024 0 0 52.5 549.91 658 Tm -(FISCAL ) Tj -19.4211 0 0 47.5 148.95 613 Tm -(VOCEA ) Tj -23.7876 0 0 47.5 228.75 613 Tm -(CLIENTULUI: ) Tj -33.6288 0 0 47.5 388.64 613 Tm -(0808 ) Tj -21.6271 0 0 47.5 468.9 613 Tm -(BiRICK; ) Tj -26.8317 0 0 47.5 562.72 613 Tm -(OBO032745 ) Tj -31.5442 0 0 51.25 162.72 556 Tm -(TIPRIT ) Tj -23.0709 0 0 51.25 268.89 556 Tm -(DIN ) Tj -22.3564 0 0 51.25 321.76 556 Tm -(COGITO ) Tj -22.2966 0 0 51.25 415.87 556 Tm -(ERP ) Tj -19.5136 0 0 51.25 468.93 556 Tm -(WWI. ) Tj -21.1535 0 0 51.25 521.78 556 Tm -(COGI ) Tj -24.7121 0 0 51.25 575.78 556 Tm -(TO-ERP. ) Tj -18.6521 0 0 51.25 668.81 556 Tm -(GO ) Tj -31.1552 0 0 42.5 788.91 2006 Tm -(155.15 ) Tj -34.7994 0 0 42.5 790.78 1748 Tm -(15i. ) Tj -31.334 0 0 42.5 844.9 1748 Tm -(15 ) Tj -32.0316 0 0 42.5 819.66 1697 Tm -(0.09 ) Tj -32.5188 0 0 43.75 806.8 1593 Tm -(24.77 ) Tj -31.5624 0 0 43.75 807.8 1541 Tm -(24.77 ) Tj -21.0452 0 0 51.25 703.09 993 Tm -(NR. ) Tj -19.5035 0 0 51.25 743.96 993 Tm -(AMEF ) Tj -35.7727 0 0 51.25 801.08 993 Tm -(:001 ) Tj -28.4541 0 0 77.5001 431.67 932 Tm -(90002214982024D02818480721100293 ) Tj -19.6793 0 0 50 232.9 909 Tm -(DATA: ) Tj -30.0086 0 0 50 312.81 909 Tm -(28-06-2024 ) Tj -20.3563 0 0 50 458.79 909 Tm -(ORA: ) Tj -31.196 0 0 50 525.91 909 Tm -(18:48:07 ) Tj -27.9768 0 0 43.75 852.02 1489 Tm -(12 ) Tj -21.6742 0 0 43.75 713.81 850 Tm -(TD: ) Tj -27.8567 0 0 43.75 753.7 850 Tm -(00665388 ) Tj -23.7415 0 0 48.75 753.75 798 Tm -(OASIER ) Tj -0 Tc -48.75 0 0 48.75 850.29 798 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF"ExifII*  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw88"2 ][i,ϩC?.t>ƾ"|ށ~(;yzt&\ڌ .̇ñ\esӳ*.  UebHY*UDBǗcɌ.3V"deM]|RI10DP#̌dWc2CnjdwZ̺5% Q -BE@R) ,RT(! ShX2hf  VCĖd*Ḧ"  1bd!@[2c,)1 A,2"rfV,y] 7[’V CHiYȠLXbVTIDh.* s(`{aDuLN1$\&BR) !2,$2pʎkV.7$`a$c( ,aAI!HHà! $k[(@E%IPc "1HEȖ%Y3Y}LRI)IEhQT Dh ` ,1 -fɬMLkdk0Q0m:2weWD+T|@{јij[ʾC=ugi^=ͤo+>j>WS˃t}+}+@7g$ dTY!C%+)AU! 0a$G ύ>\Ycl` pB"HA$aa -3cEc)FC ms$#BX!1&\@ *ĘlYe 1YkfIREhU$ T9 v5u̮W! 1!!"hR#c" - l"1HT*%4Yx$$V$U!D2E rT`", -ep¨ B&LC4ll f7Y#bu(549os} -3:c#PA$B!@r)W"q15+B !c=r x)L쾮c#fG2bvʨ\VhD%e@<6"XCB1RA!$VR@ #1AH`HBD+$0`AXLĈ̥` |X&<[8םyVA#)Q$$ aJBAW)F2trO 嬑J;cdb#BEJ -A G !@4B00I AZH BB"q  P@#) J" -Eq0B: d,=ir dC h) Ch "I 8cY LDHI!ʒH $!$)Y Y*:[P - Xq16*r,bC-E  $:Ȭ~ìu3rV(WTK"ZAT P0LaPP$Ej+ N,He00#+ȡ`$*1)ؙS EXb(ab +YD)Tca #@ a U>AOl<5ՓWg"P-*Yl굞էd̙ud 2>©_-vqU_v w+NJX  oBi1n&5SjV;ꭏ!uL=_g(W_2@%hG(vDL(B%^6]d+Y  D)TKﯛ?&Tlke<&baҴWI<د:rz)y-\C_6zpI `2BC R$,b@ٵhlX1d|,g82YTDȫ:BQcz "E+BѮ:1(/m|5vZ*kq:LNsBT@UcI@)``@CK! *HH x1:ʮB,Y/yuTtz1.P$0:C"@ b$X@  @CC -  d ciYD X&<1jIdIA͑3V1&Ȩd2jcuwR\}xQflpDL.ȥ -$`ȪdTK<-6VwwM1S#J`ŕ~}>)@,Wp{)K`̆W +D ,ȈUבg^ ;jd_V[ D1 !e0i1IjbzG&E# *IjKbcYF۷*;V>2  FL$kSWӺ$À<ۗΪi1vur13klY cU/< jaߐK@#^aMX!%j=N%s= P47x1kzTS:tma򐞡^EW{:r -&1eԩw|zMVpŋDV?ٳ6네K鉗X2QW4~/ xU߯,0[W,lyժ^l"]yws/Ks)%*a$!B8 0*dCM1I -FH!bq<2azˌAU]I!FR"4L9 JkӪ9[vezG%z&Ŗ,2wɬMLan]|oB㕆7 1 +IA" `0 -221Q\keH0A%g^pH)SnB"! `#rH!I +,< M!W$Ta@`@(V$P,JݜˑD zh&Nzmby8] /&@A. F WpQqfI|y;^5Yuc+cq+W -Mu+dVX)жXBFBioӄaneXDȁU!L)7 -0Gwus*QY2 H'fR WV WX@,L&s]Bl>ïDِ,Gɋ*dBGWa/raᖒy7V;  -C!5Լ;wgѾȬTbe,)ьYlFI2^YBeϢ&c,VI 2J@.@]r,XAJ6҅ԛ5 -`fl+,`z57t-5ޤr,b3rWYXI (H,$ -d|N, c1Dc*Qd0ܠ"U&c $r*C% $,]JH!$ bP,0!XB+AAZ, -T^Cq&C#c*!cFlfWLbQS"F8VVEլ[U$*:$ UXV @[dz^7SSשrl~VשTRK&g{F>AwW@cȈ* ߷[ߠzGj 2 I_?7"[իG{JηN: P4V 2 8r(=nPj7_=$aQ ? 'lc}ҵ;" !@NoikcGB-YH F82VMبFh3.K$ -c˶q\k欯"eɇ%1XjP,μ٬u>דb#f?C~*ZH :Ϻlz تCй"^aiq;6uVo۠V[,ggǣwy D k:g O}ν27<7w`حB? /C9~!#OۼPIZ\ԩ\huIT -yqseLk/YJa$4R3E@c8`͍ -=HBBe[Z3La6Z eDVIͥs_-o;7{4gWSfur$<8?[e %cf+UgwУ!SA X4B<AV0,+H $0 -iI*BI $ -q R0I! *C 1LI DD 0*<0uiH!5ȄGIaTQrc GuLl @2hcȐjBb*R*jv(X}U-|٪V($ .}U41b@AEr.jjV -C/qLy)c -+t1pl:˙7F3%Dˈ(21Ȱb"y@$WҸl29]70`CXȐ1nKl"AaH `qǭW4[+c2l!]c[u6ss뽙r{2Ι6ݔ+&68V:o~bhxCYک^2(WSKlIrSTAۍ}j_ۣP4EW+ uRf[zWwC8>U8>\!`uh0Bz:Bou| -Kdaj1u\" -$ a̢?V,[~/ٱ:xUm+Ot)[_'IRstDe(d2@I$0b#1XD G223c0j -4" ,`I #'Tlps/`T֦ߑ*y9.AD -@5rŷ/Z\BNWR2 a#:n >=k.byϣSLK91eEǛCɹ\^VoΒ羃YS.\n_&&\d{ tziz>]Ő%ddlfHa(ks-EۻCOPJup.^ :yf5p';:{\,9qy-OpZ=(ttUPHPd5jvtH !$dj,84qM$HF a -`HTG*ƥNδeDߋ3HE#+&sC(_P2 La6'HZ=`!MX+aHys ;@HHK5c _-ٴYdʇ*,[Z{N^E`Dt$F!`c u;)0B)BLp}ב@H!$$TD"@IH $"e*A$Jb0$R("!`@`I^d0Y ``dXqljsa( -SdYq(Zb *DeP`bE1)BdgƨC -GQU(1[ۅ^}Z5vżu "TCzXC!ݩAǕWA*B.}z3m!z|^@Z`2D)V^IG%2**u$ B _Y|&ª>wц<^*ݟ:kyA$&2*C,ϥUK!rǯ  K$٧3irkIY\dhcScY6ug|̧3&J؝X1L]cI -x 1Xˣ+;H LҹSU\XBDx';]  Lkv0B"HeX -T.*ECdd+ #" -H()X2Eȶ!dXƲ,0ەS;mjcKObCZ  W #Xe)*dtk OGF*Đe0r`edz2HiRnYJ'kCЏ,RnT(n"V,w2Dt``_}Zg?~Ij$:!.5k'Rx)e82`)d! &`FVQd A(0R,"Y$$Y/0=yY$a6%XK$$$K$R1  `k 2cr D %2&CKCUR eUVQ1e e"0D+,)5iE&<X_(?>JL\yaHPWU[Yu/Ov˼Bf+YDBd#  -UQ@$ cʭTJUQ⩐2WJ2AؘdˆT Ā@I2cS>5$e5`+a 0ˌe_%o4"5HLx羁Aζ,ܭEdr6tؚd;K/ z)τQfHdrD؊[=z6 Qd -H-ޥB,0Q$ f摇e#Ȅ)#49`S @YD&DKu}[d2@GǑ a dY"rc! K3Opg:ek##HHTV hr`CP4a*F40AqEFQbY0_TW{k1fyoGVdr)-׭8OHlYrCJkɥڊhdS]ZaqOb@J0HH``#)cc0#4 - RB2 YH_d*yI $!$ Z) X$I @ZEb"Ae!F ( -b@ H Jq"7Y A S!F2,EǑe2TP -"Ȫ`]WhaL)1ƨI,F60ͩ5|]'=GRsmI -aU_(w ,EtJ(ϥɎ2 QHPm%h @$0B0bA40$W-Z*H[7NZ !B^rlwwZ6 eqaveR1@LPV-XDfX@JdP$XFRVy/:2B  LD$R!!E, 0I$D@!&ԫgPc"F) - VS!Pd+cX!qgǕ:Phy&3+* j隐gz?cTln+*RFoa5'S_'m2'7LnG#?B^9`+ V {Zs3XH@ '#ߜ]N1r,)"@A@  }O}t !U 7{/F:zW}z~6 Z2@IXW*~zo^1ee as̞u*޷C7Hd[)6'e(~tӶWf9jW &VÑ2rŶvx+*Ryc  OWz{^eW10$`L$e6C*45ufYwD2qACAcA!Yc)yh0Ń rc\ԐV(!#  BI+K`*B`#)$" ! Bu!RIb$A$ &<^nJD2B2P@!"X,*ƪ lUP+yƙq,`,1d*RQ`> `lh=->osz:dX@r6*]}o+ն+f¼7Ƶs'y*e2 aAL|:94)2b!HC 2Hg 6ͽVo& -82xDz"P/ܣr 9#I a}^8_c,x^Qԣu8wd&L,Jd} +^sԩ -0Ho?M yvrEC -*WO[qA"CA$h `#E#@A -+$ g ˌzK`͊:ivQ #A*#3jgEyVbxz;ymn] 5̽2&s/v['a((UW-swQ6A%21O -AҘEPF ID`aA@bJh'^dHE`,$ `  !0D"BHA"!#Sh6(flYEVSdƊLF3eYV)I -2QFP$7Ac"Lc,.0 TJ+$ZEdGX9K3>6:r:2WiRJ4w`H -A"`̧ n'h.JQ)$$pcGcXt8*XIY`E(h$!"ٷR}Z+,4*P~uO=(Z.B1w[7nXD`NbfՂx&H.`r9ܜu)&XöMq|V2ʨ6L.^,$A!'0LbL8dej:)I) 0'X*HdA##H - YPU&X!q{ݭ{Ks6P&H!$:H q400,x+F#) h0$!!6j]]6F @59Q:Gt2$ьd{aߘ!` 2AX@" $%`A#I!(RBI!`"u9`ϣ("I  -Q:(&:V PAHbp(B&czb.Hva1X*4t\ּYq;Q YXuvf&LpP+Uжӑ否Z:+)|(bu>6=% !@X("$R -X -D cB0BL7mlre #%H`bUm[XX^0BA!Ay`ZaTIJ(er!!nWqv$2A=Y .{mC-Rά(uEL#cs7z Bc(~Wv7\vSf`כ2i` &,s}G5}\EE2 @ ZPaC+B!@a$$ 32F nO::axA T$A 0:>5H!05ɮwy83\l٨"AmjK'E~mާg)}t:{k.%+ ,2pdFPΫX,I I+k^bM%2ǛdHA$WPCFt a(Y!ri0 k|&9GcMjź+ ZtYH)#ՖD@dA E *@ !0DA -bT`$d0 *HDU|r&DQtmC*"1cVX`p -DHqdJ2UlphMΟ_v[eUFQQ\*CuG0 -D$`)LݛXIL1$m"vi{24 !H t!0*@@ G$#D y;տח5kRhq )%ٳT;f8) IY!B2H 1`HaCIC $Y H $Y"Lzr/ -ªR $QH\|҅ F(AQ@@L2ӫUϏ*!LpAYV*_שRd΂2[ǐuk9;:zu'4}GNgԸͅpFP[HUܳԭbHD TC-{__hw !E(;~d} -O/x7bFHA (Lr"+'zo*k'<[2NH$ 0gW霺m]$WQIHQ(״x*v|`B{YpǽzlBCŵ\k3cyyqg:ͣ\pwe@pҩɯ$ˮ&&2+w}Zcl>jzy޲ !P`zY^b@ASUԬtrtoG:Yb1V1LKm{NR]ˇzZ#) [)Rs8ʥCų7nx˗W:f|9+3azSzy[ws܏IR|&В 1NbMOC͊ YI08 8Dx2B"xF1`h eG$. B1jy4 b8R`H(qutAڡIk'7\{j(mcXìߜH`*4$*b $dSny$1<|)_+Tk0HD"Bc Y֬J !PE0Ude1(@@ *oZ@!UQdn/ b3d Qd8W٩5R>sdŖj6'CnVyߢ(w\ *^m{E '1~HU"`I <c3蚇k}Ŕ -`*CB "@&o1'JO*j4!XsGrʥ/v>?Xx Dˀ1ϻ֬eZ a!RةSʮVI^}@KR@ I|qv|Z쒟x0ͅϋ-E^8-Kbfǖ28:7(w*l:ѵj=bVwLQw ΡzTI0a%E0@8D%B@XCCDHPh3b0HD4dYZ3o:ս -0c@ aF Aƺ+ -5m;R2cEPX7W -zU}`Aue!B`ς52Tg[盵|!d#@I #+E 0ArR;;UzRJnRѲqv$$TY8{²brp1=sCzz5R.&LZ.-LsZb2&B:c>}yQ_èzY2SDH@IzV)ǒv!T* {C !"@RA$2BAI#l!E R0 ,! V\Df4%GTBBTB Bpg9{: 1>,fHD5vRюae,hs +Ҝ-v3L-[M%LR"F  !RZV2$ ȀR;:[~h_3Wˇscvܭ$H Z*u(KIBBV#a9Ӯmnv;fRPn4iŭ\w+ijuޏkk-%Yj b$$(VBD¡$VRCTHI THJ//+Sw3$,6<:zJV‚P" ZgySH$C" $Qa -1nht)$!e&7Q*,dUi4vWhofyQq͊&4Z[KRܥ.S:ljHJ" 㾕УUkv* -®J)\{'jrߓ>ۭrX1$ͽ&-ED/ n^x!LPd `fH*B -"Fs.x_yg}RM1`D(`x}<{CV>RC I DL -[Ԯwyb@h &o76epA$_422&6y1n`+>q@] %J<e!XF %I0 h!r -e!XdE,V FFB<4(#) $@$`)PˀUYΗ3nTeT7} <}:WLUC|#P]ٽeDZut&,22[#@I$S R2!@¦EdTpw8Տ.'BRZir;ԫ/~OHޔ1 ֕r)eQ HC$WB+3cʕ^_CܣU,VBUy7D*gWSp>l1ȼlG'V(u"*TCAYXS"I!$JKƭ{4gDK*E ZZ(+lۤ!×n[aJS +1cYl,"(J1",\c< -ej&D\x$*H2 `))D*/rz -P+ĽׇٽǞn]́р $*ioۏ -͖HPB)2(ʙ`JB -@!׋>SApт qd cbAH`-VGBu1N!d7ƲscK!ezǙ FFFB" ܻ 2Dj1x 0h@`t0`@Jq`!L 0Vb  DeC!HU\Ah%Xq%faqCi ]! HH -[cXUmڦ2#ɭhS H@SsJ!##|'Ac%D"#1NCՖHҬ20C.tG!FXJ){Nu~YSxNtU660nB ̦ -RPZH`  !P+"xBq8 lMhmYhw%fɲٰy Pףz]HH{R`BI$ JDHA $Y!EνaKe"+3*65\iPf.6&6uF ꩁ3*$2- E  J#BT*ŐPQb"jV:@ǕD&6AId)*Ȩ+H)(ŗ$P &,kck 4F,S@dHLy1VT%I a$b!"JBHV $! :2 :X!2+"S$$$R:1J$Fd(X! 2u(筼Ғh eeBbUVǑ$QKdr XHh%d$&D$Z,"$tK@d!Ii+ 1 )TKy<ˁ2`l FR%j9!65*p+cΘV A$Vac((*@D*gndrb&6F'XI1IND2VXTiX"0DY#^;vηC $R^BT,EdU$HXd!JV ) d XA &1U0`FRA$!²!8d9VSi Sj2*` +0r e9bc2Ș-ц|l T &E>9&rRZ̐b!F%HD!+DP@#LqrnPB1 P$ J%4hC !ɏȓ$ȦE% "$6 cˊ9zkW -cɎ\@ OFm4[>c=C7O,'O%SmOkFѠ|U} >+Shqß4]H@G"NgLU 1}lq:ԵSpvYa HDb`D20]Lk{%+@LX\W段垝f6:^Lg]1+T=HүW)- oWbΟS鍢p$ $$(ZY"@GA$QL!E,0(+e$ T@T$D%D jBEHDG,D @" B -@R-o-z\lY3cF #,Ve5!8!dHe1XFՔ Q8E0(cAAUS &BI&9UQ2BI$#F+0BH&Z5ѩI,h !CǙcRsdeedH޷?"Nd:yK]sלhvG; 옛"n5z4d$ @< $h`1-;˝W4 +Z@1X1F@C 2,  2H !Lyp(:n.nw{~rNTشV6FOcewi2+z+ߑ8` @ $D X.eͭH.䩑ua PUȭŋ.+]UcZcQY4Nom\H C$FFBDGC@d <#CEɮrzLYJ$Ǝ -(œDV찡*btYc  &6%ljl\:cWBI@ 2 FS "`P " WJ5I"WU%I$F*$"Jf THE 2a(,&"2gþ2AU*!!yM.l!2E!2E4`$*X2FX``VdC$H +)Hd)!G.H 0JBf%@Ԥ*d$0DAdH00q -*ĀH2 2VƜ7O"έ&.,\֙- -d4=.UdYY`RW]K.r-o lJG/1&bD1\\6*oLzB民j ʃWQb 57bQ{57;{joQQܫׅZ@$0$`"05y.uRlS&~νfɱf=\Տv$#NjNq?/<0Ȃ*Q~(AUG,Hdh6u+ɽ,i"ꍱfq{q.!ƫojgx `Y8Ji=;l&0cpTfRU *Y UZBFUMMiHjnTuWELnΫނqY#u! -EEY uqعq0 -00DC%@I!`@ X$@Z*Z m ,,~@D G"Qlm]h֜ jMZnyGAbCE$P[fV,&gWط?cm`6t3l.ݣܐ.>{GΦKxدK1ץZ<2$=sGD @$$H@QYC\X"&t\*nhmioח~U[mi+Wۣi\ݓNYV*ݗV,jߓ Kyۣ $,kSЧCЇ@C -!D6:ͥ1ύ0ÎTWAc%ďdGpUB\ -ejvF>ξś]^_OY**:FB BD2HH `("e * -20@HLhmF0+0 $ X40Y K: p<ZE-'QN`ŕ&XhAd&FYM$$ ,5U2 -`BrEebIA,Ar)$WIIb+Z$RA$$0J$H‹uW+nVZjzco܊d䀐@h02yQ5t9a2y/V *^\Bu3x]j}sg]&vmtgp#2byi}+xEzEyɠ8"EI&o>FQ  - $LHQ]Niҏ^ˆ;eJLvzzy=' -z<&zgY)^}q|wz ! -S U1<駧fƀ4X* -'+-) "Il12b"69W|q> *p@P2ɗM62_CydYl -ȂIR@!$!D)S"Q1LA R #A S, -c B) @ZL5ۑv0$Q*U9$"A " Xvl֖C2MGzڍpI6yb,$,Q[:t[Ҧe2fT22Unydj喗"EfGtH ZwŔ)#\E2BIC$e`(2c(`$S `Q hI -RRV -!@82u dJgH$A Ha18Z^v/Bi_g[4ICp,F*2pMAe[=X*{fiP3dF` !!2H@ -m·L=T'ZMfc5"V^O_S.uB $H@ I |~.=C蛳"mك=Z#ؼLz!xa l+6h wS',Z9oK.@W![n';0;A3& ei!Xk4㕯ZxsnI QuBNԶv\"]I/q:`P(! 8Ik:w<};X,bbO*׷fZs';=֡͢{K_4qƬ3`%0 +2.{%tۧ qlf=LB#\F#Çzd@+6U<ˣ~^eI-?HRTTes.lF䧍n{4l^?x!X1IcF?c}2E=Ww(vKQPHcTŊsdd $mGO*+aVGi #2{?NU;ߞ/<{S,L`!0Ԇ@Px"8 01 "b, Q)+ XD2*uR@ K0fZ!`*I 7:=7<0C.9@1d[y*xP2d+!*i؊v++LӃv>DTvÆ<߶W5Kv'n.zխn.LYroWf;Br|#9dE,0hE`(u@DM]>wr:X5r;ɐ<]KUK9y"UKiB(ȵ;w*gr凷XEnt6 XC_Ƚik"h쯩 P@[: kM[PT{&/7H|~%K2ʆa3/EQfG5@sj}2MK_@@%>*^s\]ѶݸbƿX^/W}?eXBHE!ӡ?wDB$HQ:+TZ<62+\7Oד3.6[vy~yORC $L D̏L,Rw3Ǘ\,ܲh9fnMts/>ܓrCEF]iE>㎸&VQ08}YB..T. P h2޿hW{4Qʠt:ַI]%Xp_™1y37+vR\ϕz`sNWn-{Hv5נy=7yJ]PDE`)(\{{by{p D#@y]>!H:h>"o[I$BHaK -ACBV*t.ВP 4E` ^y&*y'f5ޓɷ0IPpi~r:;5;^_W,2jyR޽'z^69UFr:N1{|^u_p#Ce_?{y濦,y R#Ϯ5^U+HHx Vkڶմ HwS"(@ kr>W>i'[6zIKZٰ厄DNl-Bu/>k9,)eJCSsƮ}K_<9_:"0O==׻@  R:$WZ^ıPDB!V! (x%p6u~?Sz<[V56LqgDeQW!1AP@T"7X@T*ve䷃˖"L5" ꤚľYh$[uPh+ S}J"y*WAy6>} -6jgеm׫80h_ty;ס$ HN%/.uS=oϺ)|R@Iq^?Էյ:7C0`5)c,%=һWMbyOWѠ -7?@>ux{Vlz[ DS#$x^u:+˴ςfvnIO1<[=O^~/hz'lڧ0KAb4WeدsҧۗC7—Hsst4-˗ՃSOUJ6[O5E|O-}W -=K)cQ{۸/:Pdq$Lf @`(1#a$H)X !$0fFS$CZ"6$x,2Db!91<4R VE -W-{{G\r$S $[<D7O8yL_9ݽ9W< |wղ00bQxr7$u~Co ,r#c'3HQHJ(`<뭩ӠۢΞcx ) 0ELdfdYYbzeu{9hymt8׮vg&CV_?6.CKm+JLiPgf"lڲ֖oˊ ,dyZH^{?πcuǏce. HA(wOVxOK cPZ(A\yJ61yǤb{FV#ḛvl)/سc<`X>G@.^U P4I{F*bRZ62I A ' -=7@Z&LpwR _RUU42T00qdr``(44璧C"F -a`Tbˆ^E1jpVę.(Hֽ^眨E^Z dJ;Q8oڋeƳjn14Ci%׸|v2m˞@9P5c$ xHsxcx+AyO>Z:5J?()7l!*Ti!QZĔǬ='{ioڬ[/})G yOԋ~+\Q4vދ>&ʴ\hr5P٣"4I랞)@ɂS69+2ű$)`b>qĸp*fn*ީV/\,{Qf< -D%P[1X__"_gf=UJFlc!*ZݧWgvz:.rI 2H(!+/1^}NrR[מw #UR$Y  _'_=^ zZ"U^f/9Xъk#|ίO$ f˫W;&_3%oKy侓]>n,󬻤w맴ioIu^7PXB> -,G^VXg]xu=Fj}n@ -eǯ7z<._RPFM]ihF_FM*ed#2J910큕К eH4ŀD"I$+(dQ+k #0R1H;,V X 0I!V X r|c<;tDT|P!G{vŻ~6clI`z-KO9y}7u+7{33TaJd|Rzj޵kҟX1b` a# -C$Jb4-}+69"$.E D  "D``n.mp,]G& \ ;9<׸i':a`^ڻlA$ !#)*bgV˳WfDZey}2FWkeEWՋY)C0؍|&LI_^_|kaH1PWȄuk"R"(@`4U`$2J1Ɗ^]-)|c=~ e^?Brn(`ɫ?Ti@ti0ffGZ]P9s=}]{N T010wy [z= DF $xI܃^)o "4*Lw/NAykǐPO͎RFn_*eB}CkegrLW픺KWgmWltt7v ^aP:5^礽=z͗=F<7חcԯó5 Sp;uŢnT2%3ֱqka0cP&[NzD@d T:"pw:WJfד<̾yGşy*W1v10yy1h7>nBcl{{˅ky@!-F -!,0VRN"J|zbN~8*,*TEaT{Pk.+zYNT} ;`Q2$1cL^uNnpgЬr<ѓ.jZnjrVIHws\摡G/"ƫ| -{:|rs9EdQ ԛ%)cS<Y -e/ω˺%23c`(|չ1B\~Ez8/V@оga[z%x6\Kd7"YAP8)e( +Kv/hw5˯R$scK9ǴR5}VE\pA\_K#v{-|Yzڮv.16TeǯۼONU>˾E=PE?=qm;ҪbL(b"e5:V;--.V:m:loѫ'7^-Mcϙr,U._YVvLu'Fx_vwGa]޵WV.?oG*5ۧ|٩32Okԧz2='{CFB!LU eMXq]kՋ.ZS/T-އ]cBDt8ysg\+ .fO>mKӵ q7<_zχE͡dBo[4JϔkX=n?c<;<ݴ[|z\^qɭO=9ܽ{ f#nҕZjbQ/q=;^Eޯ)qfǟ./4̾u%j1[U+zb_Fԙh1.ͩ{cLѴҮ\ӷ^FPI$ \PG0)V4V X;!EBFE̒H !ak1abCeF2D7}Úc~z۾:UɎT@HW)ܪ53fMG66yNGqp=|}[;TE.HF0:"&Qѡ!$V$@H`!02%/KpV$B0 `P€2#,CG= ys xƅӾ6dúqSvjwv^ĄӮTnnW^i2HX/ $X,"HVXI!T(d( `FB  UhP+]ס -p2vA4d$ _#)"P!|+gҪu+МЊ@TȚ((y:ɓWFe SlQ{2(ؓC6K^:fJl9꽯l1&Z@] ]np6zKwm]L|%e6 =2V%oyM -Ǧn<<3[au;: .c$(I>1xp\Ja{ޑ澡1GXuuVlXe=w~OsLgjܫbbצۓޗǰr<+=+ͽIXټXOwVǛ ǽS̗5f{<'6|^c3&xaK_y};OL;7[^]ԲEf!枧_U|輵ZٯXPoQ8]YY:QX.dǪ͖NxFus!8X^7kN*ܳ' 4חRwV5,a3x7tznȬde#|y8L -21HB##,a*̼ ŐzY)dju XҦQQWЭ]!K}k./>8a$^o Q(l᳓γHE RdNp%I! -7 b@a ޕ懤e)RD$hyVۛ٬XWiZrB$26*"EFR0*b[foc^#VoMٿyz c5T[.[ePNj.@&I/[7oO!)$DX@Ee@HT TˡFp\dI /_;Lutv[ PӘ!P$(U>}TVQb U#QQԩw]EGҗO枪]iэcV4emiP@ublU`h&o>x}ZTCޭ2B7z6i<}O]ŜItKT:ڽRo >S];[tlygBS"tq_>j}R>B4c"yg7XZoxd2Pwd^?k u6O0^OٵqȚ{:5x5_ГgfvVۛO>yw7< I a`E&HH@a!"I 9R@b0b´!$TȑAW;jNjw$TI -0FX* VVt|WѺ羅)Ll*kےnZ.Tx6\Mu&EJIߟzSY$hA$"Ҥ 0AI.}ËU o,1! `Q<[2cZpyv䫤YP.\~xzL|h`@A~O0|<iN,*((AqJR- $ʧ-yoDX -j"TFƼ1yÒF$ˀԪջX͜{|ԕWtMVJyWv]V-= oo=?Pkm-߸yl?g׻G;r"=`t3J\k_ҏ%XI᷋ O=߬t!BY#$UV>y7 -WZ\`I֧n"ϭkKUjK{OXO(GwEz_/f!χ5o^S|D\iR<:힅qrسFmlyyyzbRz5>yTzygZϦ?-s8β!*~ƭjݸ|dZn}2.5(ޥ-3i6bzF} JIK x{_D[G:=$ F *da0brx0S" -U@A!FRG8$>Gl8S#+ $AYJ|L+T/<$&?7AY6$@ehvR|./`J -bT ZNd{}[ *(2&5eT $*X܄킭*8wuu -J}mMGsq>5XZnhTϛVmiS̽CHͫo:UN'QS}[|֌T[EsB鐦ZY7ݚX|[udW:wΫr";~-ӓ9]Or0 L:;a[[3yxWY5$]2yNUUE4xR_ĞPkkz:Uf\f-n*RkE z6Ċ^k|C]Jsza{ʮk+fV-x 7תzҺU_N0&f-mL6<ˆᢵll3zʟ>[ny-szx4gNsՇNZ7+=}fɯuأ.֞1S];y;*]:{rq)^h׳uGKwNˇGeeH`HD"B Xs*m !2Ha$1 ,Αr&RI!).qƩOUNw۳v$2@'q}w_0V)~83:Ödk_^<9pzk/=%1mUF?>t׮vزi9*޵HZ3s:vO(mBr\uέgu0짞z^^=TrݚžDW!eŖyz[#+ H`X\-x`*HXth6Ly$&LYAHH(bRp>J9E0d(BI NK˗ݏq~mybukq+@[q7sm6moZM}Ğy=#)c5cϧbV"$,!RHbReŶZl5h;xcF:;U[lJi-,z^ՀuHvM>2HHI R "3)$, ȣݩWOW[5TZkM}|˃b-ˇW 4vy3&U[Fm[\դŇD[ -=֪[гVBǏ&(ةBZ[OY:tJնj^w@ONfDZ+ںr徜d\[z}UmByPENRH{,^0R{kd5OymJ"ٟgb{&Ş;mT-v<䓩9#_>}*Un<Ҩg_D%9ǏI&UZee)^Wv%׏ى]k-5WGK> zgl+͏^oTFVdw͡uFuȷWR!hPh`̤iDE $ c{\Ȧ@1VF+ 0B0Q+)Vlc2SΞKElޘHLjCZ(^j|1nUSvcyOrs3С JzsN 1WK?j%%q۱DfzXx_lYBH e02$9(0bАO<+s:Y0I$CJ\F*Dzp -{rt.F|ʡ!V(B|ldC^ nF0oc5Zs:ѭF*NV:gGw44 G3<[ڽ<@$2cI a6,P4@+d`HHH BHa ( "0B+Gꥳ]M8=3kei8$E"XѸxؼckg cdh ihQ {KSC[}g[˯V6tע ۚv^PnFZXS5mi஖G:dGsiFSd+)o"RaGOJK-?rm4yyu枵ֈdN!_sҸOfy`8>װXbK?ljDž:-,{WWlt(Zu_ף.= :~G^=z󥥎Dvt<$\s[.L(|+n[҉cYiz jtu?H;t*}T*txO`kl<_>}+;IJ5rTڝ-;]9)LdRZ*XAji˻Wu@Z GIXiSe Ϳ;h]дTܖڤJU9 kGI P#Ń! TGR8:IR;&i$XBB b1BFZ[Ζ n1 $LA"g$ؚ6ƼͶd@Ad!R$$44;98yӨMɑy,Yw^=/*yny9)vgB0^ a!P9x-q.>tUӷszC400b`&>\-)vѱٚ1#W +)|oBA !Ad=JeյL/dn &Psd`I?|O+ +)BH"|r`"D@ -`` -4R3p@HE1.Dhc%XT,0A?3PLb +p5򫷡.1תڗ.J$놟r7izPF\ф yA=2$M/3\&HxvZS*7+}񆭴ޢ681kw?ElxߤWMZwʣ5}s׸*[t8y,{uJιK|NnC " -ޞX!# $HAHDXPVI@!]TV C &Ah -@@D@@B D\ $@׉5X[jÞRϡ}BȮ.7r@C9ē?'յje%ɦmx\c}C-fe՗r6)I1:ud5?6c%VHS‘kVsz+(ҮZwR9=W6e¼촐>MBw>7AQ#Ewlɻ82S/FX737Ų幫Jm@[^Ǘu֤Zz}vRdN<:4ӣ]t×> .,Ԝ˩_=Ǒ3suG]Ovw୛,oܞ:k%;M⑇BSWl 1H^ d*B`I c -\,1V \CAY$# FDWX0"68ɍUە,XF.D)5a6/U=y/_=V.:V쐅`$V !8v]J>&ȭ*U5fJɖ.LS^]+}:3cc!RH"0%`LdI@~^d_:ؙ%!2I%d+ش7Vvzr#f !FW@2,JCW[8^~ X L1Dim̟M8 !a $ U+ $WYP@DR"$Ah%[ч8"FR $$ WB26Δ U`PB0J\7uO>)vgLLq}>#ƳEmwc(yitG+)WIDԢ'&Dyz;gXtiC^uk&~EOJZe覶y|Mgox=^A5:ڜ[{垠p{(^bϢy6{v0dQn$S+}K[ڗv(f`9|[^7fY4>myհQ/̹M>ͭ%-ҽh2+\d&U9V@5HeBTII Y`5 i@J9R(Ò^46)9.zίY #h=3K̻]^0(G(iX%0BVS @ HTb) H`$#*Bפ߀B*?#PIf]ŗxއY<15KrдqeWWWvK I -^S9gӫk.:=eOR^\۳wz=1hި[-+\J[b*M*X7NJx\ν(6UW> -8zU; mM Ϝ+"^K[Mu2.}^moj:d<&ҕwwe,ZšgK6ct>]UYbk[L^k4*XizdXOǷ_bK~i\;FwO.٥y%F^VfyZ4;L_);_ҥ0ֿ s:ކuxŰB RxŖ<ۖYjޒV 8 ȶG#CCf.|zKWn^Bz2"TvDf0HAH2h9p t[ͦhV$826mlJljER;ϝoj1l]>oG $ "I SWBlmW՘z>SqZxv>&Qѐ @RHBH4]pjdcDX $0A : Nyt[d׋LmuMS2H"0@HX@((4Q@ -J6<lM R 'hƯ$(X-.+VZMXw OQήT-$͞t[lPBTGبѱp{GKKd\^WM}y?׮jrxwS/mwwWavzQW}sgQ/zUWMޥg`yiuzmgjҙWMsKMڿ`9tKm[`ּ͙4/}c4&v+]%֋=K"J,4AೞzrڢmuШl|N1x_2 $R")Tq;i5(k;[Gpsm^ܾ/F%W{IC_B[}nd[i5IJa" J+ CGG c@" q8e ! 9;QI &ibٹR/sF e`$xuv:ٸ OUpM8 jI BHD a@C$!#*ВB+ Hsf$@ *BrD* "ȋ"B0`]C`B2I $ "*>[U2=&jQ/|ޠ L.O#-eKQmu69[|ۊeOrAQ(9y1Lƙq&:Ǭo/6d=bv2ch78_&qr=ڻ|siZۚȐV -@C o*Y{[jK3(p}6{э+vw$9>v{6XT1O@p'Zjq21SsЭYkp96popgQY*Jyִݵ|׼ݖΔnE.1<ԼnK񮙩~}"=#nYK60lw ZoGWl9ggP(׏_r[䞑ʾU'zN\(=!\F"A{NStW̽ANU_dArR;!`tRh  -1IrLtv\>1R:-|y(V2yz\JV%d\ɍzHT $ (`FRd UAGL0I `ezH!@N'jvCx/RB)HD^x_Үcu|WJn $2PB)px%dӊWOy)c'B.8HdJSsTR"ETDEǑ_Ľz aQ2LHfhz^KMCN{I)Z͖;ŇXڮضFYه/QAn 6Vc3^)niڕ" -U41u1חl؎h6Y4~ĕo[Ǔb:< ƥu4Wd0u7,+cC -k]ןUM266F)@Hňl].U>,k-[&-$d_yw高iI:M뮟S Zέ-8u253)Fܦ־Ytj7^CFj%*4Wm5jW6nmSWӶ]D'Y}"8MK#2-mpded%rQ*X&0]2#hH-X`!TZWt1!)^EF_<]@ܬVϥ +z͏>*:̣?z׋gW=nmOIlإBT@BJ)fR$!aa2P` A(̯P@s0`[-3_!f܀7%zұ[`0,0`0YηIlUvZ";ӁC 0 -,"2#, x,WaS2{uHVHHV/ѻtRr{yU(PaUf~>{>NDd1di!2,{g񹧧`̓9Iԓϵ٠ޓKܩjU=kpu8=؞}ugS>_:+I]Ɵ'jW^n.7s뿟qM^=lH -#9L -mr7kg -rޤSX폕*҆fzQ/++QC67^7oD*F#WE2h"Nbkէ>7$$< BF !0d>'L afR0!*$>ZQj^緒K!G^_Gq3\1@}I\ 9\2CObi2i"E$Xi200X!$ RH@Hb( luݼCA -\,1* -( 2ADX$C0 -YHAr@MH $J@H BJ Pr: -°TqUDkNUXV3+36dSKsVWѶ/}2fhB!+.1$uu*^vE{vwvƙV05{4U% -;ii{Hū-f*գp: ңޥJśӻ@Y;&_}C#a ȱPDN1#OPťCu6m@*|׬:Qykw9KE{h, y|.:kJŖ{ 5qlf=gӓӥ{.EKb~z}z]+PޝD%y_гb}OJ(^\TZ1dSdg "Y8TyiL9[h\Czqp{}eǓs{YЎ5n{t_:P&ג6}G}c{ o*ήzl.Sb-oj]yqӖ``:̮Ss/@s;*M!v͖|IuhHaҼ$bZ'KYuWq:fL9k`yǤu),8^1?W=_S*֊me*`0$h@L@X  VVdt24IP14idYB58Ke=N&޽G<L+z%h$ٱ릨de\o]G˒B  DL(e)`TC,ǐd+ÿmdEq$Q0i^YE("#H aU` "I%0b `D aA 1 e-tn&7O!fړA#;=Ձ5cz`oSTIft6[lCtZUA}?#)4꥞Ovɭu2ilMQ.+FCSgdlԤAi}*6=_-BөojA6!!uUr<+ܼ7;y,oG cL$ rai -e Z0 -@$(H -I]4UA:uq__91̊ 1XeU}N~iו9ٹ}Zkv #+T2J Re5+ &,Dj|X=Kn;X4 H$moQKY I $PXH! A @+ A"DB!Y%"BaɠP⣡ofKCD*罵%[sw+om}:2dEeg U`bլv]}7`+Vd4aAٛ];a56|9l%?V?0t+U Xӻ]SxңѵvV|[zm &Mg/#B$㆕ާuP_#-P}gi|OkzI+o3ڢv%Z)vӰsVD+J釉ޯ]'8usY ,U{;2hNo^Rz#='wֽ{w!<=x2Oҷ{Gͣ}/Y>Kk|3~?5)LO+yA=xc$}:>f 5} ->{y>=_#9<.9i:T;Q9ݍ3CҮm!||e̫mfNj;"8^CZ; ҪGT)>eq,j_cvdHa$ABIa0 ' ,1g:`l AƘD;09a9Mi&Rp)ږgKҸaWn'e>~֜tO?/L@XҰ$ 8]jW}څ"򸹬g|G-RdqBH)9 -C>]7 vV}eUKd,,29-lsɩ$HdVHI!B  2PH$HH $2,@JVB4$2.9%ȑ:E $/HoITN rEdBFiڐJ^|ؑ$UHu:Mhsdi$UFI@ȋ$&)#ߒI^K9$4Zri&7NJMY%ݒcrI#!HbK2<,͆BmHke7y53 Rv $ (I +$k4$D$ S$$$!HHMC$Ua$$$d $I! $_~HLrYC搛.v'ڐI$ג51I %kIK5Ē d$D2h$I %$I I1Lhd LpddF|2X%G7!I$I0erI3c $$rII02JBI*I,E~o$,om#Ԓ #G"uȞ[ّYj +$jޤImnq̒I!@HgI pɦ=) zj& #B@$42aVH*!S,2CI$d6$$i!d%<$>ăI2fIfؐc""L$d]D$2C +elDy$ A% A2H">9+GWtT=c֏O*6faSݡF/}k%?#G9hΤ.ѮZ*?c.9mb`}&:q湯ͭOCiçbI4G425S6sLPpz=齊$YLYNא螓 _κyY*4V -YκuԳU=ݚ%3},J̛eGy<:Xx1gO\XXyLJ8e[iS ^w؞qd94p]}&`=z#<Ɔy,8\ha:ytdOh]j6b=o-q%{IRn `i@NVn_'q( py ͔r^X} Z' G|]DN˽>^`! /bijVev: r{sM)J2t()OoVQi i(F;d:W0d  .vwXUtǒy58 dM8J~dX -m3oE -~_o2Q赚H)"J7#OĆ'Qz JVK uņ:r'2.c]OC)Mkʲ.ɠ3M0R{(*+sЮylYԩdA*laB!Ί-sM3ˠL胓^[\{17(B=}q΅su|%6/=P_\+hMiuΈ<{ oG^aLF0BtDiMY&:`鮧LDI55sIJ5}vMYf|1rwiNȰH]h#o%héV3`-5B^IeIFϰo26-th@} ,5XXR#mk`wf dӈW\$3L(`Đ:7OP}e-뜫 w>jsqq|,7};x8S_pս K» ~&tyn1 qL鸠[?Es9ƄKYQPB^5>O[!bl_|;*f7AR1NwXdhPh!Sŧ8fX_ A--O}+hz !,Z.Mas5Yz5e#\>Dh1#خ `> `'AζkdrG(=0qFU)?qz?ѡ "[a -jwb݉}$xWɢ8m@\Ή$V}qO卦#~I2TR>g'AfOۭ9ڞbl].Y3݊ } z8*D`K~r&@"3Fo=y'NS3h$:◹8]Xq? $={?.dE3HJ=aNmn+y0[V-b:#0֤)ʍ%uU&`NH4;җ/t%H]?:O 稩!u8lC h4ybIQ)}yUK,_cxK2/ɍeG;':Dɤ -CLl r -:#QtO ;}}}ccJ׮NTxMkD@4ПE#s#$'V?f hC]2H5;tJxf1)CgMUSC77uwYJ0g$$4j,|GN$)(DGr~""ҷԮB~O9D9~$ysGy))ډGҖXMy7/YvUSH}"ȑIۙC5~jAQZ?Ar[u%rMY?f^cT OWxM+B _ImUrД5)vʲIN3I8Jtݾ~Y:Ixt9Wg2ƅMh[s2MY^L[GŔk?6 -s p/ dR dohSA_]Nwo hEƚ$#m j|QV$x,ɫif'k2髝'{ycѰsl.`8`YWhHQ/}?%@3h!.cNܾpͬW>ÇAeVbS("gcnXظ(T@3Z3rEQlKEIc"J²xdFz3+Oa92*lEx:(e!D*2US{A ֳáeЎ!Olnѵ bHF_*A9x-5AO^'v0sV xΎJ^_&Nl6d*D}G qfYT4rޭdL,$qwYкz\C4Vg==E mb2-eanJRU--][*i;y=MM`Z|_u>"=;ҩ&(v#VyΉ I(Gjc_L*ivfg+=0TvhB@G_G&&P$ #U(:J.<Ҙ-W{AD+rb\fNckyōU9`,]_1=udo5y58+Ny|{ -xap3OI?2ȡz=oODQ/=_4I{D n68ii9xYo - FOI&mr -Wo5:ӝT.Z'RDa>UDu.ě#4)1$d w3hIO:JytwnuHYE\b $:OW6ns\_m*TF 醅u/5ڝ uu$ I+KS#; g^]b^3_[Uz(:Js>bjA-+˘It~ٞuM-()q{. Ұa,ٹszsȅ*,t2B5 8ﵳE PAQmK.7j`~ %\'ζ|fe<$b2< 2; +jZK!lM6ŨǂK|:mlsiŨ9(b2H0Ѣt7"L2>%"ٳ-nyЬxwbrAhF2RyNoyGׄ`6^AgӾK" -2=[fʅHQԷ3\R5~o2|_qLqN!b QKq̊-͹0}5ډ,FkX@)9%IXUjx{rK73h큮V,F~-<T[d91i?ȭJfj( -+3q|Ī2"3q_]iT{Kq#:ۊ)5=ZgVCv Q| ZI[qc1:D&xㅞDt4t4׶tgM[:z:{4zRx5kAuAf;(̞i c}SeR-r# B`~w|O\(r5i|oҵkC$Z -WH|+LjmsgΦ5d84@>m5>my-3j,@^4q zwHx@錴b5Dɑ\bj٧Kϵt䈌Ὢwo#GS$ty9#.ޫ,%W)Jv:s-En9e\ytFu^`-DlWMv*nXƠ2rDtJPHJCǦN^6בhѣz YNJU$Zд{X=&i/1#RIH.\I4֥ʭhI8oG'Jv9z3Cʎ2Vй"ҿ(6ҿ hRXuZU1:ނW4eKB0qZvje]/ ]$sd H.*_p|$KJ6ɪON{i5sʪgT+WO!8SbzOS.%rȩ:*9HMC:{3ۿYk]Y _UYJTvoxfl9,^ $ihPnÂDooW}v_ZJOg(ڴ1ډKS]Kx}CBCkOdASbq8F\i~aO.PfwyIW1OԳ]Nv!>a9}>_p!έj5VNn9>59jpg."SL1"} .u~F0VE\u4PI^"A+^9]ol8i*u Y>nG-TW]^LΎ -=kXs%Iuζ4kjx'-m9V?(s/Zy_Lе/x5dq|ZMsб /&IsˬgX!zʊR +Eqd"8rB6TGc҇_1}8~TIF~ו:KѿzC\2F=d@5(rkXKT`UI ҋJ>W-E^V؜D?cj$on~$8@Q\)m-GP;RضXp=\\p};ўnJ0?W1R$ȟǾ]uJ)*m?D`6otrzUCyY}2^CݖX`%݁|? IC'WCħY#T5)qi̭ P: :Jͦ }(X|/ BV>xlEi 07^vpkq{G%w4m}inŹH{GĢ-hw}9wr&+M[^ C UR=ae UXhǕ*^ݻ9|K#ˇW)Ǎd;pVT:;s9l@d6R3yS -aj8s PJ&4ס#L߸/z 8$^z# t\Gkϖ>,T= ɞh)Sn[)mttd@X_yrx -'>^W;_Fzb= qqXj7#LT׍Q&]guYe7nJv)h ~Fw_q"-vrp#QN+JR7+=:s;*YwG++ڊӑ@J=ͭ[6ml١ͧ493Cd5#AI,Q}k<rDVR3xFT?ܽ!`ݯ&퍶 $]O$f8UizRk,%v+Dq4s5P~%V*:t5"l<0hO{V!mx,رM٭p8 #RΒ-ZuqfvͼZ1]xHkq)Ya+#OFz&xu bhUs-A.P2%#@ێn9[N~ +naDS4>2G4,p$`Ț޾|fDaZY -/3@AS[&zC6+=ȜM徵#hƍW:g/_GDj3?lyacL3el[k:YκySOec<|Vr. ~PvGn}"Q}9#gȫ2K5pD˽-t>O9u|9Ü`rg'w۞HV[LrqD5jDk _@6nNpn9RsR3Fo\m'O<$PL~kD$>` 1]<j|PjhUE@}ʲ3M䐼~xƛɇNQ>?$B>VC14l f۽6+/;ė%ܫieTW[z}#p1Wϥ2Eӥ^O@}a UbO3::9Yή|&κL/ȷS ʧߪU,SC:^utsOG "&U~FV)v^5S螡;} / -izJUΎG1RHJ~z)wt+ MO1#%.y百ygg瘌}nğC#6uK=>4qNIQj - N4&4)aR+VrG^k֧59jsX>6m[ rƭrȑwsw:mށfܶ&j3=ef=礹~P@>MnJע]xA!QaK! Q :xMiz.«0xwPTњy2hURjtv(( ]S]3T0bmI:}g19I.:[YZRȧhaeMo:[yNΖtvpհE @pnv)|f', ~W(ڋ!6=oNv`-_s!SQ̶Tŏbqew NT$2_EsVeo?q\L49fͭ6h٣gϟ?9="aG2盇WT_eA+$Ǡ~uq$]̈́{ A6;)xY>id2W_ŸUw1 [s"u \6.pcLgR2cG#߷kDv8o[<ڮy%1دj@z'yfv#m>\KHʧTj' ~ԑ)`z!w.Ѳ`_Sag ^7voFa}Yx6rfh ,r ylXc>q&{x1"D<̀>eYUXUMe\~v`ٛFhaoa2 G2k ;DjΎLZ~l׺".W {JG=`.`mVJr̄a QS/&CZ=6Myb_M۬hP r.H4PM8%{eA xy`ȩ=`UۅGT -0F~V֐KQ]NjsSȉ,e$$=ᯤA#wjsqƂH$>m7!I }beMhU"׊=BrEmFPX$=K57ԨVȄ>|"nlp|e9@B.ͭ[6h٣g͟6|fjf[76nlٹҳ>Ngy@gS:V]d-~&n;$|c|g;i]7 rWif':gΕ:Ys:YFrg*r.r.rlY`O?bo2*}-F$yLK2ml뫞ٮLuZ!HHV9sNb;BV)S2#B2b%>2ۚ>=4ۛ}=L;Gz< ͇49׈"Of -;ue&E7kNў@P޽7#ERm 24[s6[mzٷ)`1]JGW *W΂E^8u۴aH:)mpض6k2^aiFm=tUa8T4#)iC?vU/SKh[1»ў973ɥQ~ -Y -hE ->P5pXcJL9[AB^K5p?/1d=I..3gR1($c⾃_4kWG6b7qr,gY6Ց+s݅JWGBu2n!_Tp%c/):VDQJhex}mOb܁ Ydꪟn}l*o4<=3{,0|0?nquX -H [-| Βt::%|`J aΆ!/<sW9ؚ^Bq'f~0ߍFZHڨ՗j.ՖY*wlwZy!(X|!LU9rTOFHao0h7%4iZ>6ǻan9--j[ -O˕7l\{trG6 mVc XA=+fY#>t2W5IӅEWN|eOnGӖvm\2Dp.hVs&&⋔zM^f:| \Κr/g"r/'`rlYf%xiijGZ_NdfD F[B',L/tiͭ[6h|mHC#G[ϿL*|e.N;*L?jsqNj}]zHu>_ytai8-ד3LV,N,7ĦȬٱ"}Yz1%!.>q4ܔ e̠3M>Z@ @wğ$pD5fF -uſYQ}b}0cO& - ֖f]K \sb֝dg.lnfKyxff̾3!H'ӕD<KtǿHi('+_nl X D !#]c׈EWʖ+B;#Vӫ,R}*F5p}Ib\C9\CZ'ղ\4ظ>=S] `o؏UcR/#w8tKĂˆy#-䜔іh$WM5c r\0dd1=fy9uqXWWO7pmFIҼ{߭(#pȲ{Ce{LkjsHs˓!,Srf>dxh]Ά!Pω3[8-wϥRVA u>|5-~T5v3l n!sr=|d":ȡђ:SG T4]9ˤ3G9s5,gKK:Jx+VƭSqD賢#Ѷ#ݬUiNtdRMPGsXXS Ýf ?]dGYQיsf5%7ɿZdJF~6oK!mw~XʻɭGHڟH>%4Iیz -9/r͆UfDKrfOV]4 e#yX/zbt>]kY| pyލS)L[Nhr(,[H(%Yd<',g7`{HgTG?QW:-&XA%h])\әlkNtYvH@6@ht)gjvO 9%6C@mENRgN]舆m5ŹU(gp|mMʏL?E=:}A[hr]C|RVFxKj(H ?R?þj۟6Q-y28d]Gf2yԛʑ9]`eA O8TyyF1#EP-Jk%m܋{zG,r~~z]>/~9wZ}7 ]wjΩ( ݚl3"35龜lE"5T07W3s9wrɘfGg8k#LJ@̭emELټNyH7sV5>'կ7|=q͛nl#%;D*8V}~T9ʃ9UGaέ ՘ HZ&l8TȐH6t-gDѾto>tG6tSgA.t` Ή*SM8ɛkm%)9>([t+op+ -MWvZASn(ʜE9'B7ƯnWR3QbD-)RF1n^6HO sĬ{q {5~L0&;)Yno&؂]sG!>-GGgJDf )!#ƒ‹E3}\'Bl5$8{0$YnV]P_6 =N]̞IiOnsៈ`eIo-4vkפ~a3iG.>c5j=,gMO:ZyΖtsItgIt᪹ -o#I&GU'x`٬QbJ9G}A>at͟&e -ˮ'&rͰmƦc$TƑ,QPe`Q԰KPe]uZ@Nº7Ayq<+hSтneN2@=+d=޳ YYX_Y($a >+0Re/4UD{c0Qoov,*' -G#@83CK F+i|v<\?+# 1עY:8~%<ܨxNZ-zy!N2Ez#&<=X\du -}E]IsgUk@{bxɉnMmњdC?1c[<ƶCb sS鴰#m~u󪩦,8Gݚ&>nrOgHܒ$}n:n?gݟ۳nióNxvmṳg/g/g'#OC:j TkUN̳lH6F /:jHr"{o$ˡاq3zBHß-L;ŵ#=ۤvI-8Ndj:#$0#??߆4o8EȲbGfoPF -Ser:x|co(  4qq,pNWN#ؒ켈bVۜHT -8DOgxB>TR$y45s-45GV~d*YJhY3ȿp׼Cf>͛2?=alگ̶l`ۈ1]pW8Tr Fno>?g;ᓋWjTOz?HsqG5ɣx!sf㛏Xc]=S}sa -Άt4 L$.>"@=aOK􎜠us n'mvK\u1g&,/a+,I4"9aqz=n~A7\F xJ4xFQ.RG -hiOn)s%/  } 3CgX?>MWN 9)C.ԩ1ԢG!m~t3‡T7sy퇿{f͚Der$kt$)v5;_~OLv+8uYrZ ' I?͘-ğЬˡ>Z:t-\4ΎtPgEt1@&yzg.yvynynyi-9.Sn#<[G:ʓDW7K -N>}9bWD:f򟖽V]^rB#2ucq+j#4V+,1t$Ѽ)܊4(R˓Ejd2Ž? %TX adMR>O$OqW5wMЗM /2_>+-6'Ӯ}ڼ~K?M=Yk]tgO6tg"\K3.r%Lɓ92g"\K)Ԅsʗ9R*\K@I.~\[xH'%c}=Y؝Gvy&$jDf (w65kcR ZLşjqn M@,W i!'[gH$D |}P>x3yܩ Ft7GI"&zw2  Z=uUV1xyC2EUQRVXaCJ~jXu*,8W9sW?zV:kxJ@( f xX˧g6fC*%g\/'\u:xμg^3׌צÂ~z3< R\=9,_:&$YQ0xM׮զY+]2y^M'85 -w}DU6>bg˟h!*ٮm{l?}b)_gOIF=AԬEa{Ӿ+Ű?5p}C2nUG:z^"r(.t=,OG:z9ΚtԳ=gKK J =JŘ%ee`C%$hU1$uk,Mrr {7s=֭kcUT3eYT|&}za&Izh<B\debŨ.*eVVcβ!Ýl9Cl9GtYCzg]ug]ug]ug_u+Y_7&z^dpҳ 1"ϾO|Hۙ`؛@vn}ő: saQ0,"΢<ǜstyΏ9g6,Ŝpooqyie&N5EeQuq$/.3^ʲ\KoL[JAƵrI=l4k`J@у/.l>L$S4~4"SctP! =ʯ_k:YȺ-G3HAE&r8PDMvy/{ֵ ٷl>2nDG5|kIt:H3:JΖt󤯝%| Ύ E_:hū z5cz9+ݬޫV 77z>4/P5E^BY<ɾ^!'b*Z'7TdH?-G HcC&"\ֆޒ,tO]HT#rO*[w%|yu-~ $>}fa}{ N. Mg:[Zss%,Oo:{yȷ=^o#~?|K ve?q-mL|;fJu钐N4!zy5+}sQO'ݳλWϵX-<L4AC!>h' 3;VӻE: a읽C"q5>2"$d}s{7nlٹ{Gvy# 9؀₞dO@߰zF3ІSi5x t~\9ˇƽ󬫝el*H_ 6VRti~En@L&JWa%as`o.HX+u #nYuIAe[#'w(oq')񵸦ņ.\c4$A.t΃<~Oy#=fgga36l6Oc9v3>r9ɗ9R*\˜2G|znu?udzQ$aۻFl`=-aa9 Vhy'Hƭw wMce}^ôKlc}0& I5cU{:k Cx+5+g?4݇B:'}++#"nXq|OͻgMo]>LǮr95$D[cdoyZb*3&0'=ztOsB |WǠ}|:K@F )Yb@Uon,14eK >7㚟 rT[; Ij`R-t2ܓp4c CLY-4]O9B/oT؊>:XD2!Xڌw -we˼$T0FG/98_ww qݯG@.k!hg.2Z;9UC̓9ɬm9 /<46m9igrN#>0Cųr$v@?xE%?\ WcaK_9ΑcE;t'9M4I4>t'tc:<Γ:FΑ|HzI"#ᅴx,FǘD -[EjCAd+͠ha{j$\1"$~΢%Zfgdk̵A<L㍛*dSSaQxgUw_?#Ů޶L/[ +loiLA?d/E_3VCt΃ѳ'p4'u2yQ'}xJ8d(ۼe6)R*7)''xK;~妟&Ө++N-ir|fs|9̇9g6 3_::WΪuUUlgU[#GbWm*~O#Yq*>R6)^B3Ĩy/j1 -#׀x甝-}t({,\}|0Trub -#z .(E2@T -gae^@X$x1XKyɯQQ&-f˷,AyN^;l^$ʿ;9Tڜ[Nm>2JcɖĮ"fp4 4J;#q#P1^??w^(FWوsG'46y`yxsaϢi4aEūyA[EkaH}{{!Fג8XL]?'LA"nQ,gIc:;9XΒt3gE6t3gC6t3gC6t2A.tg͞_6y|M]6E 5SbCʌwg]#h ͍fxllU+3[uel#ݩFFvu=4aaR6܉ָz{{fK"d߶rӴH/[sL'zL_.:;ЂhLe7UWu lî g=O#u[ZS me S SaEZQ r;Ρ.7t9σ&=y; -$E vj59HdhP@Ĝ_:T ZH$@GO㚟lԘ^CʻrD |8sxr8m@ہ#QGz]e~Aoky{/JΝZ\N5es4 -42Նo(I>ƞy?RcE&?49cfͧ]:TųQF'۞kK4ȧ6 !%px>O[56Y4dF>&z]ÆSj嵰U`;pZvUYHbFS&] gpdvCg-K1P koගۛO>K*vٱk}̒ -lߴӵ˕X-M6uV+@[]#Z+qYWQ'e $|4ZWZ!,pvp pk 6pv]އ'\d01.bV]ĥikQ/$eTA]kGr*7Ʋ>֫6=nd6I6.֖d*[G/ѝ<-td86l+s9_s6F|\DX fGJ&kS7T3_9c۝[99[ VTGw; p&巆[e9y: -sC0~\990D D|6,v q N6`sC(`OOwbD{/|͍3.rLʓ93aAɗ #Pfs Fh4K;. })ɶqJȗ!Q,<']-bLK[מZ $9r Ć2# sgͼKc+.O`B3[dvImL)˟d>o΢u7r g}y2J^ -pgC\ȷk4M!?.Bf&-Q#}B(srP`F >[:1n+?Ύ~"F$ -8d|ym'tl%^N)O)qxAMz]ޜ!9A4(o:׸4 <;ehǯ\UVszy<|ϟ>|-N `W:٨>pv4]uy5nY;WˍY6QwHWVVbGe0U(]:K5IWk&ݫP`3s|8!!|&å:IkN8N6q zVٷ!8"R?[_WIr|2H!r8bttw!Ƞ哆1ZXϳEwod@'7?뜵,[_r[M'[UF ZٱiT{F/Xv0~3ƿ+g2G%]ݣDѮI4ҷͦ3l[#U!A{N#'7E}~5ob~ -5(Nb2d6Xȼ>+/k;*WS<25; NC*ޣZ87*XVQhafyjVB*ȍӑ6k=;6fήuv3Ug<96lc7XlgVsaϮc !U\9ɇ9QEmw1~fKo /_:Aٮ6,WhYV$J-X1h!{ّ>[5$hcbѫO&^YnAv9qӃ+*9=8]tī_vǃebzɰ) w6SeC 0mYcEřH5"h`W:~JژQF # #A$D{!43̨gR"VcxMfCIc┣/7O ~'2ӘU|hd'PnҼ|5v3G:ŵLg>+Csma=8ͧ6&?OAZN9Ƚ~.ؼ@Hᑂ8+5 *[1$r S+'a7OY׈PBU\;~8SEjdQ8_7 oLqH|1ӋL65zY4uSߐ$6QzyLuYb<#Nʔ<ʉEܬf :VUsC[4#k`TSK?o !allٱ3Opy6l9gOiuẃg#\Cr?'c:FfBfAF2PIO::xUB|@kk4u.G]9j㞸-V͝]m3sg:so7g3g3333g3g3bH2^Ս UR-vZE:fvw},#s nO&%mXރN%]~Xh -+VɃ:Jر -Vy8 SY ^ij́L#HdS O~IjӇmM~`x O}Vۺ,ԏ0'F}uΖt3!]C6vߵ'Up,WK,R;p X`ɭ 2\V~Vs}0_6ה~fH-r.!A"UnR;'6s0?H䑷[9~9[fԷl.)'fJVft^' 9 }T_&o|pGޟ%wmJswϛ4"/jC!ՇS._SiڞMW:jUΞrz2,${,rqNjsS 奫Mhա~y7+ -U٫z;3L[wC.ؠ?K,踖V[,ԥa0,gOHqb'<甶/ -с--(I]Uz3:3@Q=/@@ׯ ZfcE:Noԕ+H]?!c+h㛛76nlճϛ>l>lѳF4l٣fg#?nl96_NO,`$*7؃BK<kN[OIN-hmbiPEn+OgK>[[*۔7+`PY5eB R^3VXDyLBeNT޷Hm~Gj,%~7 X3t2*DڷަG*T3b]+mO 8T28=Q0gȸtu f]fӅ\7Ȼc Vˇjݷ79~_˹8 {m$I,>xl.%]Ǣ@NAS-N J󦯛>x99|G $wT|Ec)k|w/ˊuZF&yDcL[~,#w!5țTa(tǶ&^ {K>l;F]E{aΦKtWEء|%Ȫ"= |kgC_QWU-_\h%`OTVh3}|2}˾- I1ye,yAfW3uIȀKlv:7*0u D[koȼ_mدY}J x!qO%'g%EN͈1.$+Jj+Xp7J)>YeP7<]1_9 R̯ovW144TǸ3pڼ##$~ÊG-RԹg t5(YSe}zX5.eJkCǿ<6$^Mu`q*Kc$BBRK\BWAӃh'ZX[ԈE+Zd\f=6|kaG81՚s/V=ۂԐ|/2Y篘uƶ U$РmDO##q ,z+]vtNMk=9'<lZӼϺExUg AH%d 앜,ݏF>0,lΕ|ۀ/ϓ/4?su\W7U3}L֞+SgoBI#M4OWx+#W$5RF̺;V ޼^J~hT1dWPˏ"nX󠉻shøn6$U'Β|'Ȣ3xF|ϋ9d:xmM*G\ra#+<\o}!g~W7A$%v؂ _2gGvɧ x~kC)CI>: ӯ)O-]C: -9ðq[r+zrIj]1ٲ%ifD HUiycL>&k]9ndqں{[gҐg9cppEXgO_:z@U&KO"330pNuybM6p節T 265cr2"K󴜱 !7Luv:s/fi]ӜȽ+Ζt󣵞_>y|XL󠰽«(sլͩZuiVjE=;r4ؠ}j fT eW4?cfFf=dMOjoA .H0(B}uh@n]L{i -r[/gH_)Ҋҙ]0N] sg‡ĩxIOkar3.%kѰXM55Vވޓmؿ9K 3< {ʑ1fKu:ʸ/W?t>+{AP8jegɐfFXW΄߹r -E!,q})a!Cͥ^Q*ۧ:htޑf$h*F!̟WLr_iXܲ!>߫3D7Hj`2$GVs6$XǐF-K(y3q'/F>;O|BSr9\?m+TiakqR0.?)so_W/𸲛q#gOŰVZ6ȁgX{/͠XHsKG&7^i`ȦYrz|3&܍xyTEnfyCjg8 -~mjVϛ;ZU9ëV&2t50F.! Aaoog+u@{]+2ʁΑNZIQ{ k4qH\HqK~qnkⲢ8+%XU bՈG ӆkS,VnNJ > ╛i%߿yfp9ͼC6 6^͗{9~V jq* \Jud}78ʆ즀JF/0s, u@ڊWcĀ7^`q ʚ=uq -ˏa kDZIpmh}#,L;O]yO av$+hǤ+gI6tkn|㣼RsO*HpN+ @ǃ9ppuic 3F4l[kKfGRrzG'[,ųųŰhǧfy~ Zr0sy9/U|0ӛTX A'8rEf)9':ǓbYHd -vI )ͧxWjsom3eHN'V݉4x7DZOa*`0#Ш\hpQ,yuL(&lW3Yל:qdg.0BOq -K8kO@ HsinWy#9DZ5M#=,Ȼc.rܰ4P3F5vTfZ֖df~½Z'%jȪr)"Yv#Of͂,I -aӜp҄wb'pF)}AwA%~6YxraXd$ $!q})>m|,<[p;>lϟ4lѳF|y̋7śd9̋9g6ÜȿO!y#F Ś 03B.(u`]IΨ۟nÞQN vW훾4'7ś,HenL{[Gn`[Lsd,vX]]Gˎv c< -5$HJt\G:>#NS|d7jzm*u1m@E?Rk#}9fhvCTϓ5Wj[s !\RB3c&ߡOk_Juotͩ9=``to*-{/g.la| sj~C* |dӉx28om}ԡ&AP߱/Ize9GZ/Nu0b=1tɝMlWGg=Nk@:(LSLN#[MԺ)WhŰ("!O6Eg`b#əx>T'̓RUy2E/m0UY6x UdsI%)z'_^%fU1!ey"3#:k@u;ao`؉+s -F۠1!3jˤZr8bT;]f1l:XGe ɆSg }l11g g!s󥯝5|K_:Z+3rbLYɋ91g"FDQVjyza'p8Bd!1@4JF:{}񴐺,]|H /kߓtLf^}r)^Mwxy|gA JWh45dқ2}ʩ$UqkVn*@|]A#1q%k|˸稳kglO59I#"35y 1k3i!\d̝gPF"TL4:j#+Lmވ < 7ƿ*5`OS69s_9+1sbe B.dz YQJ"=>9/(,y4˘Բe8eLyJG6uO $q-)>[E'&sn:ԻFm̻^Au%dL5%J.{/8l -LQM).u+An\;=.O[c<|~h!)fE%8ݷ#JeZydO -sFH<+a1iJTh?9u54֎M#%_O]tԕF\P1?aj>~ul3VQW.A Xi6tnNW:V3]ތ/g> [}op~5p[Ji#qmF]Rp†8#Fˏ"ACvHASϒޱ"%XI23*~!X\ʸCo|l:rGΣgQű4 - -Wv8̚`wN\hAqƳ -BywSTXǙC~2JsΞs%I -Vt8?7>,(u0A$*ANdmrV}Ļ;)A'Q\Β-UXz3BPmnRQ' t" -F8=sد*5y~B%8UԜ3DBӜ,gGg: : NmlsiW.uW6̾S8,sE3;Y;S[V*ւ/PɾRjKzWt=51:I5$H},]1@\6M-?^vKMj2 9hL̊i;Rc]_.ug[>Vq7 5( d]R=}5jlQ\6\9jT)M1mIXB%?,MjVw"+4'g̛Xz>'>x#Ҟ>=G مkDupl⠓T 0Ue725s#ZjrN T*t QFx55eu_E׈[B-0˯FKURQu!7gjhxR_ i"|VhFs,H}xd\>X-嚸wūvyQylxDj:k.$LUYۭex>If% WzU~g"xaX95駅"!aĭX c&ѿ;vI,·HS@f3ƌ5_ HAS+4=(Ev+"v+)[﫤H -0ԷCW Б_|^R oq qyFTKThin^-A-چo#'#R1=-ll̠j9pXCs6!s.I,iac)XsEg:)  UEb( )j*\ ay _NJgMOunc4**oS d3Q۔WYɫmi$,2 pKD)H{ GE]rW"Wþjsq%Au@ԂNL0%:ɮLNWSb vKBS_h<9ɳx 8/ LypF ۲Lhs\FI~JJ\$~ܡ x BGpY&5 -ԏQ5Xe8_OC[6llޭr{*$A,qǵ4tS_UPxv$ts -Q~ 'HF6yWָ{k0'~aŁvŀ<4G4w˯ξuְ[ޕ;ëxw1[ztճbd tLܥBuUx/]GJn -%`kׂqny8]g|Oey\GOV'7\qFKC9zXl[#@i̥.Q=#B`#9'Xh:@7EG~ByeQX֚ts##Y$pQBU|/ג -3h'Yq jwuzf-$:MC[S;U,g Ik pP0ґXSjO^(p"& z0{][LINKfڎ+`Tؗk&_v+~5:̾,}`b y]$ÍG&< ~tYϋ:s:3:Wζξ,ξ~<nAU3hˌgfZLvVGW4UT}g-A F#mJA";l%ݻ5WNs/Usk"k?T>};rY&-XaӗUSuy^?AտD2R#<L*` S^}I#ߝ3~ޤ\r9"cwY;iToĒGW 7+Zryu\rXRe{1mϧu6E,yrж9*"&JRYHI4Vސ<^)- rY9P Qn_'\OC wx[ lI2_y_&"pnӷO+a|g#Jb2iO -]^زԟ88e؜&@yMueL Z[t~\Q")GkHanJ0:s ?eyώHB*,j՘i*+*itl>V*D ~Bh{KvXKǵGBjSxO.^n$0//Vצ#tʫPĚMH K(1pSX<<Juwi>hӜ5hRΚtA\g. l6E 7fݚsq5?|[b<2|jaRòAQ8 =r ,ro9 -?,H#ȕrmNo D]yj疮yvDe?!u9Nj~>I–/ϫj34t_}X7igRĩegI#>U{V -l.l;5yD p*jt>kK<֞5gZ<{3Eɭ)>K;ʗet`h^['ΊIR4oׅKa"r2_nW#M"\[Su>=[3]\+baLEjw.Ю%E,Z{0H4jE;J\‡XF8cZ92DCV)`~= -̪0b;g)Wt~ՠD~YYY -OzďrG+Zb~4RoqTIZqV]VM1髾U3CRY8uF N>]D_ kf>[}M rj1L'\ʫ!LH9ܲֆ\F5D㛎jsiґ9.IkM4"z3hwHCV.4 RfGU$2LIQ2o Zr5oavApN'<;Lnka_:3.Vs:9n#,׉f%8lXx7geUƍʄ{c?V>B-wwAU:DAUpU+O-i1:Z 0UX{ ӈ~xy '376~>}ӫ! -9/׭vavu=]LkF$*_N!}Q=k59mpȗ$cD/&U:֋9{r͈eQ$J.ax_J2R;DɃ90BqmɪIL3Gp.TkEI,>ph!JE<-U6?ӯF¸ylEjՍG;GgWWLg_O"MF"lpċmcc}xp"Kf) .FӆWbv5hU4^]uQG9VMiKQ9yD|V*_ jW27'a,9:*rȉb:eAq錧Pëv'vvؓv6MmY+%_oX<_|I+ o_:V_.O\i؀FѺt|F[I\%rGS]J Y[Bkt]Lh\JT֦u<&ξ|ac:9YΪuV3UKs&set SX\tLYУ5\Ir w|3+Az`2SId.[Vw ?W/;(_C,/Y$00 Zܭeyo֌՘_Ief>" !,gIOM28vj6HRC0ԝ <.F:æLO0Wi%e]QQ/4HF$/iz2hQ(Ӗ+rYYB(Za:bѫ i -$튽f*bwO% -ct1b-)2^{G x| 5"$ l9#7'|Fr :OT64hA1Ζt3 ͝^syvyr&yrgG]ytYgC(u?e&]h$-9<*gYS:ʙĚ5ك+9g:  -^Z{sK_iЏ^%әΚt3![ 9=u|@'69dXm-F]r6IcnI.m1L.2 !Róכk-25~nBL Ď -NͺprP66 >`+GIZ2\<7!a]i/ԕJ50[Dq3,C 6WۛB$j觝U虇.[b:g*Q$@"L!(zȋE5jF&{u%r)8i"T S4Q7mÍm42@3s`U(y\->*=qqY=qdq R﵅+Dvkl ÈM75k8K7YRP -Pe)_scJiXw֭ygn[[Bj͜5@4Z&yY8X -6bu!2gh֌1?m #{pYUg:rIW&mX&}*UǸǂljDw}va`%׆ |XD$ u؄+4dcOf2϶H:xc^#{3Ѭ܇:v72 cC:kU"F\ZhXDi,Vx|_BMɣA{uѷ)W]s/ы5Y&Xtׯ]39׾ҟnu6{9^!q ^9ΚtsCkI9hI5ԉ"FX?U"$h|,$ Wcm3Lq49c4T8AiAØ{b(;,v{ӻ% sw:úPfk9v14[r"'VX;"u==|ӷI q|F﷓)++衿9$Tα?~u*Xnkn5Cm,: >@Y.O[>x3ip? zΑemzh&#O߃}+Oj<-[yt9WΊ0ؐ\&/f!d{yHI*զ$/CAȡyyKN))S_/_vC?jNN*ٰq;z ƼD!hPݺYӡhl >ib}ŻMNKX'`P#U_ -[O1K4bEɠO:vԊ8}zwPX|?Me ocf<$s2Wd2qRuJFOi -s5ͧ6p.i.xH`gB56?F5[)4߁I͇6s1w]! pDĈ #ݜ@ S\"S؉#}80YO,VR(lȡc:I:ҫ8=lPeK E} UYX\'tA&HZGz㮍tF˱ # 'AeOdJ1p蒡GT{EW,\<1P~w>sۆHeۨew2zog&3~kC9ԳELn<:`~<\̧2!#%-S֓ū#gg Vw[R5Szm|NmɃ(m0?\ێbNo*wOjO/BVlR}''QO!s?H&Iɗ,迣/KJ>4ȚvS3&rTRx/ZG}$~ΈSeu)5Ʊ![0Zn^ΡxTD~uj0[H -Z6 *@җA@#΢ ;(Yֻq q\q\Վee0rݸHyf/|` FOqfX˧.<\.JmM.xy!&ySg甯 -i] aQ3PNg5{-8Zޭ$@ -ڔbi)MfZ9,|dEꛔuNz%#i/q5iX[@RIυwq37և8%>akl4MX xOQ 9i+}@ L?ȊYZ TE*`ژ8@W&'@m\(V,LVgQ_ $Y9DL2hkBrJn1pPOA%H#`|''YITbw؉{$r'In?4Y.s8gȭ{*Ü3kOriZh+Se^Dz"Cj7,}1oִ/TC5j4AR8« Q/0LYkB6>rP<Βtv3:: }ly!Z88Lq/+~q4_5̓ -nbȍ\uŎ&m9rI"Tmt=;}wz ߹h~T*7E5}5d`z:ik~X g{A,!I9F!RwJÇ FIOMb(WW=&[Bq%?+ݽXgx<ĥ^1=?7_9rfX~|=I n2Yv#I$6 76ol٩n%YyljgfM L\T9n*\#]d|)éðJ/:I --Ѩv^fZnWתntղzԹMc6>Dί]ltBz:E) $sa]2R73LדNDВ܊O&$Ҭrc#Uv$6#tn]Yaȷo49cuĨYyd"$ڙ|3@Gâ1#7V-[_#(o%C,/& %%]Eږ.uAádWlsQ;wTPjI Rans*k4s\ssf6|fNm9sL&|o}Cjn Ξ L#5J*,Ė+r^l]#c?f%[_g!F9ZTbL'뵸lP= 29e,O_2ɞlt4_yQDj\.:qY 7 ҊH Oe'ʳʎyRq~|2 -Aq7= |2O C}dUZ'kVQ o 22FJ֭-U -1lJn(S鯻F!X -!i;v伐eKmoŪSD˔Ux,An\1uq -*[WTxq* he4cQ¼VJm_,q.j싇$UI t|[ȶyx9Űvon1Y}݈н:_a?b1ŵ'b._ -ONT2ixPf%x96jX_^u50ax3VY㛎o9 eGRC_u3 f$\?yڜ1)Na$5c}o{pN A(ux)xdp蜮/j4%}桫^%V')94bhed\S9pr*4 ,q*s!wcXԿ]G4R.UOLX F Lۛ^'y\h9˵Y?8o; -< ijİhqĆ<|IeqߖkE2zO -q.^-[5 - g")ʏ!i̯n*}{Rн;s|*bAuɗ|!>:zN6,~99w{9K.tgM}4YA=,ɣxnirOv}Mp}:qUÇÒU:}26c˓9rf;o)sӝIyMS Ĥ$ᇋ |Ӌ/k&MQsvn5>t=M59G{^CiC"F{W'} i- !]ɳr]ImH5\ݎؚ,U,s5(dg:=sfO姤ʲݠWZugU* cK͆&>ޣƺw'۷:8lpM>nc4XΎtV3˧.<|˦iGs}5Z&')@z<1:~y#julg][$[(,G\fUf stb0{u2?gL-F];<+dbz氟j ,_v[,d{J!Qn,88$6 2^.L"?Lpƭق"}*OƟQ܄"..C\^І&r+/ dB,\N,n*yW Flj浿o[ ztcdɚ3*9\Mlnw NT [n6ݱG\^m+'Gfv;z;(u^Yȁ_59: pKoIerh։/rg_K'N1iS*%J䍣]YPUVMm+Y̕c2ՅDkh$'0m|'ȓmPz!}+n-sc rU1d~nڤ]w}VgTvmr~ !7ǚU;͖9_Qf6#XםFc[&s$M暫 FIzӖ1H qԯ窏:d_1} d;vNZe6rNJ2)@wf3+u*2si$e}c N\5_i١kSަh/^yd`|22* u5쬤)NL:[)΂l&/l3\OS:zyʢ=Ӈf;?܋rt7~DFɝ5N#L)\gB ]?UU@+ͮ}%k>*YW:ei%÷OuΚts8f -ʏN+hcf{g]صɫq :e[V`ߝ}2JԖM>XWUr^3uz~YTjRDfNk9pdeL#킥4/:0"wc ?]<_R1xuڨ{SNe_{~8oV<,E@jvʸ#Q#yΤu<m; zpp'3IPӎvK?DoQ:*xmܼ sW]:|7lԿ2potm#6=FU':̈6qm&̒񬋌ȃsPbUnIģ Br9#ǎE*[WAhf8Dvso+;=8lXBcvCm[䛸9$ ʠjsq7vw*`߆RRU[ڰZW͖h!ܱU@"NdUlwc.'#{ᬋG"n_,#u'xfZY9M8|A#`:5?H,hHqz6hI,h^*?Y 3e:muRCSoё]9fͯl|پCd\s{SEf s3|y,Or?n}C7fцrTE04$ C]>>CK1Άɝz#mdb$ܞՖqyU\RN_`#l)3F b/3Kg rdAbE?:8|91`H/nC =5y]/ΪWo}o s\͞D{ۑjՉf>ޟ4 )Yk(wf{ޓdF4icM]U$ks-ݜثnNاicd+U}xm~8Ȓ?ebHSbdR7aJymLژxm\7q|2OVuDeQ(P 9(KE9^_P&9O7Nv9؀Fq:C'*(j^+ -ڳWg - _\{fJsH<E6yr|H;'7@Eˆ5;{ k_̗-δdsoL#QηJ*>'ֲ@#O })g20Ee!lLv5`ͳKb9r١񱿖ju,{5-6RR S[6IOܰUX_Pecs㱳cf͍xYlE^#ٛsy7:HX6vy_9g:YwFm[o:KOֲtKxٱ+H` -|q9]^&VDS'isT daHqRL1›S_͑?RgiJydڔs^nܭ VeRhIJ7>ly\YyU{xL:]llOA}cߦ=LQٻ Pu,Ϊ uαOT}tv;Q!%s:Z_[LkTd:ALt+qayr&3A3eގXLy#!&mNF`#.!oZJ؊4L+bA LY===MT{ u|mq S=2 1MÖB̩P_xm> kE7啳jtU(T];K2K+uVhEH$qi꼮EX*SL,;5į>)@6,m8 Ө}'M\fIM'Enͧ`3n`q/[o+{f7xFZ;gba>:Om\L)7D0.^u HWC!XE 'aR^(!r3"g7򣻵PC!cRɲw7C5buf 6m9;uQu;t~'ӚvY]PY:+t˶E~Nc휘󔙱Gu1ۮ5cDvLOeyK ٱcf=)i+>_y|)H$I4U#UM!>rZ(@V;ӛNhFDBPuEY:RB3ꑕHI_ۮl*(U#܇N_.yc8LyGMbf=xe؏ -;o#Gn5@Dʹz.1[>,ҜPgKt󦭂3r=>|wu+ܐNH$`&,W8jK>hy˦˗lE&Н$ʻ'$C!vaR$i捼%wr i9Sr7? )}O2RhX5kutY[r5x]*dQNI?v*l4y ĻhK+iF!oBu_O# Gc9 0#J̍8*̮AW3\ZkUɰtD^6< r/#JS^RnJ4AJrhZUytwGuɚENa&9 - bB"־!]I9Z$!Kգm5cQr7  4*ȳr>cTNuUun\gή΢C,Ͽѵ4I`oVfͿ:r8NXJ*q 14S.~g%ux -L$L.(Kçy]'38/+g\XnpkӶMjq݇JKv%ΊLpXǣ:9s"X݄E&/~EG'3F ʽ☃7_HvKYeV$ NnMlU PqD#Z5/AgIWc<49͇6*|]o17zsKeY=$9GvSю" )2omw&n\ܹzVd3:93]sP GolpoBG3~Xp}^c.yiβ7lno S|( =4β bε?v }kͽ9Yȼs-Kw!d>"+b}+|^wt#$U]sW\:%I| -Fn -6NS"1#8ׄ Fs,^$i|)ܹ>@]*:L=F%?0TgW_ ؒFO1P|2>7cچ3UET\LЈnxHФQUybEģPo͜W{I)|"#%Ik(CH4ue?n^KHk:l*Xhj*ȱΉ%i"TFo܀\i$.̳$xps8I?ozρ߱I{F<3q9ŵĚ^P|F =L;Ў0^2̗zxxb#֝jo0V+YqU κ.p2ð|Jɷ~I~d`&IB}Hb$_P][4#喊3CUΆ?҂Ns]gW{ ԏZټ"ư̓M;zmnunEAˤ3#۬tŇ/3Ny͞a6u]c:οۄy?8GoR{f?WiXg;boSqߪV#}H%"(ǧ!|0v?5HƯvJmO΃>\p}u<$@%PPGg]%XRދK_L΢ S_"6M -b'X9a<.U|y:D2pw&i%N.ٲl);4SSb̓-T՗GW^$\˳2 ]&Mcʥ%=PSHB1hw_QCb)+iW÷l37LKdV|]&ә_rk&~)9 ƕ<ҞrkXNG16sR2H+epy CAX^r췛,.W]mAhREպ̗"h85}v]W%5dG]:[6oq;*I/_7B%):9R_]_:.8-V$p_-Z¤gӱ;BV3ϕM+#)TN}-v߄$_Ec~a#M֬3D pj~h'Y5XkHk.tPu Xeae*׊qRy x_UQ%/0ֱ0:>eb]J,+*QqTKbHʢ's H-+d=}~!-WHѽ4CA2GiHj"nZ dҴ̍:TVyugoG=}Cxf*Z浳ke&HBaxrehE< xB?Ch -2-4,VDzs{660w"Uή%B:v#$ᯡ#׾E`.ˡ.< k!#?@shŪdtb/F9c[Ÿ،Ft{ KemI,QriLuHI*TD~\X;hskfӛNm9ss!T_eM=b29,r}.TGWh==sCk_Essr5GxFrT#>~NF.77i{xE#}/0ج0K i! -Nllrl=9.쮝Pc'I*G8%$κr7x&'__:3W{2#] _Yo v_%KR0[Pu]-3b۰Qj)|-v]<z iA^&xTeHY5K栍GΈt=dyElG#:5,M+A˵Ol:n9.YTGTv7ߛqMd48۶h݌TΚt3BvY ώq͛5>?=U\gWW:ڸ6ϗ%Tdm4o  adhlWt m8ꮯ%~\,^xYH<2Qbb $549x,'}=TӻY?0ad: ~m)oid_"$MFmm/b8F7SS.sbKٲr-?|: yÝ 9ÝVΒ%h:YʃjMtr;Cx%{f3 "]}vPTڧ*JVFGL"6 G$Bdͮ0O7*&|'I]Y8D䟾"X]ܘW\Zd:iY:pxQѵ]6t6#H= -yX4M4zRFJpu^b>o./<4tuDX/|5Ť$9$ՓUer9Xæ;*c@fٛNM,p*oLdw2Ob8!U$:N$pX՞x 쨤{1.1nW5LOQGj7-[QV+%DD56nWIgg_Or͉t[.$_5VMO5&!H 8BcFmPޝ$v>hZ~zJTCPPFqF 3*dPE"? 6ٴ[FBΣ#qP +Yz9ci2(p4+R3g@Uɹ|ENy}|:DuLilU΂%ZeZX+iHβjbM GU\$jn[Y[k=qH;/x2,j0.q4455s_CNm9kfÛ6sOFWPxrw~ !ĀE>ń4NUk6[~T.l&Ό܎ =na؅戠NieȈZV[CZhV:Eh)=϶sWI?ݧI[65A%v?87oa$ctsp$BX&Sp°Gqz#)]6/ -@js[<@ع? Y<3S qě#2u:n*CJ&KA6bU*U}=EW|4@w//)5IvݠN!<#o3nv#k\@llEp |\&>76o9P<>9ΆJ/8dEdKvq څ]t>PԬYW"pcMaj3~p \6snm|Zc M3֓z~2Y29VU޾3XY ~n,Cx'^Pp~b! OǃW9;6`W ut41_H -ٯdÝQ>LϴOneͷtkM,i1yx΂<"΂,~M,`#h)A_O99"]@DѮ t[221O/i,=f}/Ψ3Plk̍+D<3aFkpDqmnNe`~ C貧+?\=7xm -[B Wj3{Kkcn9N!_DFU +iskᖯA/F̐FbqR(ΪKrӐJB|[`5i^h_6>ߝhsC/;ܘE!, f=VKh8[#}X8pT,_*Mlfٱa hmX+V-/"m3AGhskfrُDV3XToAMrq~gX^g|yA{_" -#}wk9@5IY5ݺġ4$G6TsIPuB"t L)N"XW`õT;6@Nd͡ԫ-Ȣ%!^&ڧ0q|1u9͐چvھciZ=:r1f<*8xD县Ex%vī;4S$Bճj|P=ŷr5_xˁXdQsԘ=# rO&<dt8lB3:3R>^s.~7_wG qq9~0aQDsXE);_itFI r-b]RmN))@2*]WʠQ1+n8y⹯ +/QC^vr"S9)$xKjh ']lbV8k4Zh=ɹ\6hgȤYP:orRWIN:gb5MKq*雓hlI~s VO58;fgdF$p6(YnlrU"{tgtOoϘRx,94r+f}̯rˬCn; VXF2MĮ|4\UJqlyx=U`莹nՌbI)wKVtG/M67&e`6Ya5_8ۯPBU"6&O$]k< -?9É/sFyu~:?j:x{<jHJIq[@*R(XUuF2!t d6cߺDz]FcCçPWѕ58bA)lU Qn:?|Om,Wc sml8Vf!ݝޛ"7ԐƟKƒ (P/-Z.u~!6e}ZphR!@qFbΆs`S n<5ՖJؔMG$53i_<ξ)]>]rZHdPӓP3qvF"WF4 4Y{I.c eȠ -kf*IXM2\<-EjER$&Yc^%.EXB۸zi -=$p/2(@ŲSx؜HE8kA68hLTţK îJVo3Rtu7@ҭDL9uՁ40_Fe%&ı-9]FϺhpDIcw'Jmw UFXjea՛6yҝaN8^}$/̩M\3h<{ ]>q|j&gHл%3rQ݇8Ly@siͭOSʍ@ @D` Z,ډu;r -sE.t'Ύ kO[r\81湮n9OVhƑjA֣ )&T mow،c&˝jM|y}Gs3kj}WZ -ehs2(!U*u*|C~Zʳ -\YWS$wg8j| p 4HWO[90fsHd",vXªuq'Cfb^|.sȣtԿWL8\88mQh(3K^ML -g\ :w1xAw᫤dl>YW.`2T&UKEqq~0`N>g$YD-]q %B3ڜ;%+Xiw؋n㩻[.}f.LPx6 F1# -*$*mЌ)C5 pQ呭ir"n@)د[_Z܍2/60mO&kqBY؂#l -@=hD"09T*ȶ>s^->[4r %&N1`3Wy}WD5)#[Sgke}3G;h~`\'ci嫉:rigu4b&f*f/U&Ee/ ekھ'NZտ0Du,`bXuQ_O<W;{ 2iȘj(VΖhm\XK5Xlu2.Zbf<|X`fA;nMDUc]qkqH_+uxtR7lSgw~,uPo%^#kIjP\dޫ/ݖR,$7/Dqc,Zָ4^&mgpWD^'Q 92g.@RQ{j.f͝ -FZS~#͵O &='ZY[:ؓG'`!eZF0Bޮ:¨&Qڄ'j4abMyuɣN %d_ʃe݄Q@?vNg* VZF&%UQ}NW oPw99TVV:Zid cRfxrYH*'&ִt@xsk:ZFZ7j*vhM<]3nAWb*Zcԅ*;JƿOܱ1ß@XjiyӮ?X!4d f?mF4YI]cī{3to -+OY jbq -ҰA$&krQ߂lx]2vDHB;e ŢJ浲yQW!3FS s˪$))e2^S=;*Z.鏅Ƙr*\f7xP;s$k؆΃>Nǟsg:s澟.ɯȫ=S%L$qhk#$(i*:T&FUsJdtEOɷWm|V-r]tfo8,OeWR'HxԐj"<X:ÿ ]uŖ;Gw&0pp!Ej2pFӆgׇH)1Ď4sk6ym\6 -53ZQٮk'.rjo{xVǍ\h$ß4#}hGDZOsQᯉ6zȯ5\ }>DiCP47h5pʣSζuԳjşiQi - r)ZEԻ_sS]9uFndRf,ʀaJe06۩)|-YP(`hreYQM?JFbq44Ų]+$I&4t\hXb:LSi!<ӝ!Ttt"GR2>O07ЫXe XNÆ^R/M[:jVW}mOeFjqsT궞raeN7rZm${~A}.w|5ˀi%(BMHF'v,Bq٦?\b]N}NoYЁ -M r+١p^_bqasswF$K|49(#:Dy͹Oh~)k%7 @&s j6 -yqk\d9Tͥ7ɅW4 $F]<#U1dS_! w>[TwI٬=βu1X0z'YldY̏92, K3t<׶7._ x$7:Á>"^<9|[I72 y|W9'hAb "]E%j߇R fPCW-wIPgq?1[I_`|-ٶڍ:ÑRm'Yދiάg:h>X5q -xPskgU9TκZ~n]vorQmbgid۰GǦw2 O_A#ٺylMuyYʏ~ Y,Y˚v$h$뛆x<:5w˹#nFv1ـbfaz,C(si͍Nj49EÁѾ Y4D9?JA :gO -I+n? .NZypx l#z1D\LLLYɇ9iiqM.nF3Mp?ͳKV(8@6H:Bt1Cܝ/}a2:?O]nB_e.مuF V4J_oi<"BPg2/v}dqSbkqmlwYnY4s,M :Q9LM(0D!ݳ$HS{fw#%t o5 xv,[=WIlXb9RYz,40ij J[u6ksnib3}\[SYh8t09G9K%^!)=pYyL}"UWs?HWhrzrI\D!SIg2*NHd] I]"weN1;j vZ(+:eSsaƚ0Ol'v5(ACU5E$KS# l?* YK1+ Bwoi'bOv_O#71 -ք5k_J:xfKEϷIt#} 9}3CGij}Y/ݣBG,P)IΙˣhFr"}0Ns1) vtrxHWE`£HGYgUTgYOg /WfyP5n#Oa>koo53E\Yaslʭ$\OMr(8+%eyy3xOzs?&/lOk |Gpb^Dį[ߣ=oGFx_H{52ݧŧXrsW}*"اb,WoWTACgk0g˭n®@86?H/ZY!f^>\WoZem\^b=eFFkݽ֗&s2 /4MrConWs9^-*K(g<2USql bϛʖŮozAk6cYdjeC'Avk Nsf3v0,&fN!wdΚ?[XnēI#q~?^0]'ڽFI93Jʼg+i/`5dŻT()َ Uw.ZjA4Шv3aq5a~IG x,[0κlVuoK6Fw8OK -h&Y3Ap8"0]s>iOs Suӱe>tӚ kxE<]Odw,vONK:>[ u5f''MeJj7+V6[k,cEzEΓ:UΛ בpYMtsVG -[I,2Nwʈ4_ȓ y> `|}5hP+,1JHZL03n|2!RN9KBŗSK B5k'>nYLlQp -'b5LDc_IĜ6q+BMxIri ѡфkHKgǞY|_zVԦhШ4RNv͘P2x&6D5qS؉Ybp%'Pᔏ)F{iC$S'\Ĝy|v 4OD}{k|٧r|^eᆹgIW#(t,G !G>lykզZ^#O߈,4v>ej#K@/B;w9Vi 6nEsݱ5'MsVn>LYϏ7=)el*C\/è'fHMt=#]K -BW1#ݱaJ߰lsr=ɧ˂Z[-M H xM9Ni7\Icp3LBpy g} djzk&tݤ_y|9&w:ݥz}rޮjzzMklqdV5?C ijs{(ԼJ!'suܟϘ]S#\1LOʵ}FUЅyUAIN]dF/OV4j`2U"AR~~ E'8|/3ql$X{d-sFd$+ uRZv(7k;O_4F[ߚq'\Mc6q R\V \o4Q>6KO - E˽Ldh |,ٙXGOf;ܟyHc_ ^o5St|.FHؤCwӈɬ|ۯW8#;.馃~1;;gOtۑfrSM3=)#I6ATlȿ1ע; uF>@xl^tH#]*@u\sAmgx/F׺@4܃Nc^T-{jpn`pҦs.C$/kal&dӗ\&%۠:~}ck篃ıE&H6kY#~L%ۙ"_C-vK##%NB#;jsuve^.^Rь? 4Y-qWJQzYK~m+uu3_]o0sxƏP7$#b S;3B /ՍHQ- hw5\ g|5;pn =>vk3S6jp5ܫv_4sO:7Gءolja&Mbxk1vsM9Ni|qƨdkfH;g#8tleΆLdBB4ʒM 3ƅܕJ#aiF<|% ͹ydef3Fޏ}I.ؔ# ,<3 kjZȲ};40 ܴݍfweVgY[!_Z뛉SQxBĚJ.Vb"tV^"x}#ªo,IZn9"dZlb6.$Ca^E|&T@|ݻ5آZ|YXE>J.:$4%ov(XoCn5҄-EkӿU<$d+´D;M$ "07 ЍV\j+8a]¹.Gv+22H5N!8tq#VbbbۤqqHZтxZI -xmt] ֹ,l&]v)ihc8GGs-9R钱HdaI*,I:5 eS[}v`4|C=`pׇI= vrIp\sbo{ \EpȃqvxGP٭.` -8)$o+GrkC\q/MչJyt$]C"]]$[#AŊ/&8N1B(%4L9qusBvَyNi$yKVP+sK"ҭ^#|XR=v`ʩ*Fɳ.;.Nì8[@'CҥcG2J!aKdn㇤+ӝs3ijesŶܲg:"iï+[,9:-9|O7ɖè@EFIR~!6LӊgL30ΎY)ҹՍ$xÀ5$2J(>q%X'nw -V5:7?l/r}ϽTNk$]5DiY6FX*F$t؝D8uu'efQvε vPBbYkE1 #Y;C qcDXI#$W,2HcilSh3vz@;sAAaeLK*x[{)(v;aƱXea#* %~Loc4ηIdd)oDezZv ̈́ݻ- V r(DwZY ctM*/G^̶F>Cm-4uZ\kӱo~eWU?.dXtXcL!ꗇ daNq%G$CXn~W8>}q%VBBi.+Z:$QW+#᷾># Q]M,nuo'@s)cCãɼH'!!bѷ!/*2dފqY9nv_BVg"z3 djw"7MK@pq`3xC3<ƶylx3.^G8cU9k :Uu QmIk1^k.;q)c1Uu6d3UcBIҟ=^ "6_'Lo˺/&Bq쵢E]blB["|lU+Klוu&)dMZ`4dzpZ&`hbv$mڳæs=fafVʠ{f(lȃW:<Φ# t{2%墦HXF x,SȠXwr8#vhsCͭsl%t9d[ ^kfͭ66llٰ͍,:损6hg͟6hsL49hsCXQg2ϱ 2J.3ؚ,`$5tP"2sы"ws*8dƳTw I0{뙖Ft9ܢ׺ Ԏ8 Ul׈jǒe]%՟ӷ:[klc[V+> *ݺADl02q]䩓O}+H%(. -q~T -T[pGsg6m|V/)uϗ+z#ͭ_4lz`pQPi+%UP1(pRr{hȚX'](Qt!Fx#BU"E:i~m|VΪβsay9C<<uV36s|Λ9g:lMs.stΗ96\˜s6setΗ:6s<9'jβuu 70q;c5-ϛ9af>${e#B$qϛ:󩱝UYg:9XΦu63]gUc ':Xζuvsvξu󬵆ݣ塝Mg[k:ODO6st${s=>l͝MU 7s̮3\3-gXe/:8bb{y$S1umgYg 9af>{: 5]H|ض쯰WpqKco6y-R#K3%i6 QW[r΂R+\_XsxI_m'VL5e>i61Nmb=-m9|8fgSW :0ߋ<oǘKa6yζusD,ϛ9g:lKs.setΗ9:\M6s|ϟ:Yζuֳu_ky839yyYYCIb0gAa_:ξu󮭂S]LgWS:U5cί3s`l9̇92,ÜȰ2o]3L6skfͧ6ٵkfͭӛ[6hp~l9͇9gUW:Tξyx2c% !0@P1A"Q`qaI%I$QDp#y$K53S53S53Ql?3Qk5_{"Ю.G\v} 4]DbŸlm=-)_GF! @],_]D>sG"FU0`L"}Cb"ˢ?b0N.?HP`]|#=GC-B#. $ pYuQg8oQ#Bpw+m\gF2ӳd/\l٩|G['3j!AE#O}ucJfoa{!2# kȵvoiwNs(}ģªW"|쭇WwFDI4J.o|6!Y/TwW:;R4M&C43C40GT~T*jCnŨ-GSb$wK%FDdXo/u1܉'ȖjfjfjfjK%##4ܽ4Dx$+17U͝HZFQFjD|t]QU#jG~Fk4ǰID~qܡjE_Ol]&L2dɒ^tU}vd1UP㓞C;,\FiXU骨Q.h{]*z?V5"Q$$վ$lY!I:PUcUcَڌ|9p'ӾQ4G+?|\2Q$J%ɨl>*:ȝu}6wQFjFjCj8H̎$D ~j,{KvN-I!D"iGpD0&>HtDetkuXIG] kWS5R0(yoaQ -#fG&Id&i9ǁ+$21Ic6oc]ɚd͙+j/Bٞ͐@tLbTJHdlȘ5b$j;,ɢcgzigj5#Qk5?);&ēO͓`}VM!jvG!]$U}ו!ګ$؉?[80>R!R"7D4E{.ʍڑ,i!4E%A~C*jR>DSBDlc2I6[EAF ,Ji -89JFl#$ȏp7ۻY$bY[[btb0ctoZ5LLLL7'?+Id %mtVX%bI}: [R:1Ovո1I$K%cKfn[^Cْi* B06RY-I.3d(V6"b2P.q]I G if6@ŹfbK%M2&3Ю\%MT+:p` F F9^UbkJhӁ/rxaxȬ'W1R(gwiFi4A=ض'F,ؑ sHF&8Iё:*Q>]r+7č7F,p#]LY5ɑɎ)zh%EI+/DTBz*WkG6@]"T& E93̐A 5Y":4F(Br9x:$ٍ1_$.ѹyB5Lkfkfj|xF3GFLY,mLgʥ%x(bUrK;!:5uKEpbs,:ǺiDIĨaܙ-UI'a]+0`(GOM#Q׭'|d D:!T;ELnG[zDQ&QdbG8뢓#O$ő_fƈUlW?Q(I$guX9^sC:Eb0F!-}GD3$~I IbQ$d6BL؁p&Gf݊I}z%J%5, G .k5gܪQ -:xvLAnFV\uTvM%gQHёQADJ^Ȅɤdyѻfȳ2=>+6r&D!k&E -ҹ*} L}(hOG;GlY$] C,5d1&C!Y ,,d3C43CM&i4 I,CpC!EbغZI,y\.")PQąD -V!B*!dUޫP$BHh1D:uT&~膅DRXF"F4bt Q<`҈BH$DRҪDBD"҈D"ҍ(҈D"ҍ(J!H! ʼnA^(Ѕ  0@P!1A`v,Ez%b3B(qv~;OJŘ8FӑwCyX(((qH߶E9#GC 8 p4x7aN_<zGz Z("OC7q1G< Z?s%܌~ tq0:=ZCzWG=+%ft+|Rp dhSp-ː5xgXޅvx3?ù -c1|#jG(iQ(cح#7Ӄqq/4n0h'# F(O83p+ۣ>:xf|%C#fh>a9T,R|k; L=R|N8)uE@ⵊ8S!?5mQKZph:Gh9нcb e?cCC_3hXHt?A}#(bs#2cb`ЇιG``ʢQ5b}`>Qz䝢TVjv,t,?>"4!_'|x 8!=!)k{gQн5t=wBK3DY n8`wtF-[0cn㎏8IRtGzJ.A*v}0POA#1AҀEʷӱn:'w=pƶjH''="'@Rb48f08`4 -(y$ x -pb 4|elF!q^J-f֑0-CNE;6]uCcDi<(`(;`7zJK7OyzYv!РPy"=J,qNkCZԩdBB`53bwOPD0Cз烎 (+ѥ dmq9<^/bb0гB -c@1~"lX~4qN=G!01AQaq @"PR2Bbr`#p3CSs ?oc9[y=QfRL8Z;+Ge9S*Iz/3Mvi5٨j.B -Vv;U̔,@̔ @̔,(ے`4xv_(< @P*.Gܦ挝ޞ#N2SO=AQ ->E(_(&@>@mQE4@&L>db.Fs)5|zH+ϕp 8Cg}SOl@uC`l 7>G`ۿ#O_!5#GU Z -@yoةGC*u8R('VU!ȩq:v){7bFȸ>씈=5N}d$yd^ê)d=6LkT!Hr*Syǖ87b9"Ii:dH=Vq#]У@Dn>_֚ (\9jsF#QnҶRzl^O iCMϾU?Jѕԫ ;iq Ht8›o%fg> mTd4 ;&.`t?:TCX:) +'Ȧ})xF_PLk%BSDo?*F(#MZB(r]̐G̊#d9jU y( I(]L^PǒPҴMoA+QD~F2QPfHPjvڼo) )QCAFjnYY{pP4媯PÉPF0*̓h8jM P!CL FYJ7gTM -&m,1\3p_ 0{~b7WjĚQM)`5t]\pQKAҪV\' -mO'7T"ׂ@BSiAJhF~&&^?25](1w4EǛ\Rfi<+1^JEO]\UJKBu5ABGT/'MP?1Lfj6MμEzj7jV+gejNMkuUȍ 䭄z+ssVU|ժeh5+TM9)U4Sl&ΩM2cꦘzW<VV4٧8454sRy8G0+dekWk[e7d_ȟz=V(^\𸊽ZvJxx+>JJ) =j2VfUggoL`9xziSTOz{Ԏ[ -mP=7,/?SL jiw5C PPwP@*OOO%#}()^^2}ݾ+ChB3ثHդ}J>+g*ʵm[Ru>ʕY;)$DMq\x+3IDVcuV'ﻍ|6>Wቯ5޾]3$D_=ei|g#t6>^rJ^?*%BVe=>A[_Na኶5hCK# 3NKx< 1>p[^;'k7~?)rZ(Vw+4TSzӊo-M%89!*+Cꬅ{5Ƽq<a脃5 zK_m~m[xU9-QW}iL>LOoxotYn* ڡrc;4r >.QF}Shkm?>RFfj:s -duOxQFjWU43O~vUktm*>+;)YҪ;#; znj8op:o4Jb, 6 -۪{9(UCzn]be?2.u'jnݨ QIJp ST ݓ - -av+7cbsZ8T)dqL+ƵԌhͼ& - f;^bZ -uс1šѣuDޮ_A5X6 -ڥfjfS_m6VVCT࿮'TS&8,N+wz( -`@v*jvI+i WA_<1AQԑrFvPP7 -߂)(HF5ԏ:SQ>n=:E|I -aU 2(N4TnVNh{~:6}*X: ,0X\]?U'e(@:@652+BMi0_oP7# 9(oGY 21kUREcUdwԬOA%?2aMNd'4NF#^]NVZ rq´[)4 ƽ4<5Exq8+ -*ثgTW:OǛU+r&+o*ܦ{۰^u>N o-LΉ*j}FsMQMGrA - Fӭr3%gfIBU5S@STڂ?QPwMN#.Fs)jaM|ivʰ*QR;+جqjXw6 Yʳ5YЬDYؠ>SiEN7R4IEumdv&J1Nu] [H8!G#8ׂx1({y+!h&=1PnͽL(7"ꨥ2h j#Lj5p5+\F˧Ŵ9-z5›([ʚҘѵ_lwk~0C -a@rkS.V)MF.㺚N)vX87`iU9l4L++6E -vv&mwQz˜pkv9Jg\ PBOiLM}g'Wk.lSTYSSn*'4s)<[ߋn8ULrSVfp @x -FURQR533^̻NOͥRj=ݒlSo#%d%d$TAB#NX_< -0sSr5bzY\Tp>68SytnLBm5Tݱ0Ϛ0w^ 'e5Wx#F|4sէRhС d -)Pp֊~Ud -i!ԫ;A`pkk`PE,䡇%B=DQcz`GY4D;&ID\(w&۴]#SNŵs8o0;{92 -LФoSlM;+ T QS V:>nmkMuBv)O+ˆMa n2S?B}pSQrQ^`ڰ44PoB9Q{Ǣa5LS<檷:9[\E㇒i!9^k^GiW\~RHP>^bmouzSGZzamO&w!@:HpҬ#U?PV8㴡CMK/:&NFZ7"R;"N~J;dwe9iNZ\~W¤uד0)^|"2*ҵVڅ(nel)Fm㡄S3Gf)S7=WMFCy5q:dh)৆S4븄k+JSjz!ji=U@3*k?ʬO`oUPr+vKCܢof8e]UGk QS3533Sǚ{]Tީ*H,'8XVzy(#tBx9pGz)闲SvS5LQ{G+>cAV,7iisfjEG%zѿ8:-ڭ@Ვ`B;o +$$2R5;>+Dh!; 2ng5Ly^iR+W9NUVU pշ`PM Ҫ2:Rm1 }}L}U5rQ -xK}wɻTߙI/b!%({]XG?E/ Je8k?ڃZ_LezT17Y8XO -> -# 6/EFsA_Mlj/}6OǰdLf^@Eܦ C|i<$aiqVO{ -r*rP+-[chqۂGxYnNtzejuWz{?e3G_=(e")BłVjNZɯ$o15GbeS -YĹ0y4 =Ğ>:{z(8ԨS'PZ -{皴Phڧ.k}(4cBhJӖ=Uh 5z"Vʔi ĚO|*}: -5SL+Rpk Vyj*#0{vU*:@ $Tl0ƉAUiBSpԊc)J+S -KP.fڵ@Y]Eg9Wk%c+ܡ̊*G4˿QJKwQƈkz;fVj$~Bz"%iJ%L:Az}Nf)-nc0CTqGFGSZ96 -?x UZqF@$9=;Rk$lBs6۸|`j x:J»qG^{pR2Z -,@ܔ-P\uU$xe$ -Al:RgSފ{qN -nq~ӷATi.Sl[ZiT1HZvRI -կ4PT5g9jo^ZjAa@ i]sxWYGC@A  n)*t7aS8S?}I -IAT=?ݩiܘ}ϪTN.8b?+;R{ Tee.B. -=C@e^78nrzg$zSLQDxRMY ~ Sv+]0( -7ukzhfjݻ$Q8hEզa7fa[q\;\QS״t?e+R+R!R);'` d2MfKBS)ODrsR~7bj@<E8y -J57ȟ _:kC]+ݪ;5Y;ݽjN)خẉoUo -fOuGkujvLpS=ܚOD.5+LvD)]_uq? n wߎ0B(BVcVSVS*0Y՘d -+7`݂ -rP=B5_qg*OkVdiN4VUke:dtP㾚(rjxPcE74ךo5u=]`>p쓉TBx<'-JRlT=TZ#Ok Tܤq4ym -CrJLǎ]VwSzw/SU5ީT*ҧ\ۿ~mSmFU[6k6\AΓ$wE+*B!]WUcTaFMP@gj5YXUh#E\z&0h U\߂oB٩l dr!>'SpL۪!Tݻi+y> [S -R9tVj/ioT;r*Tn4W6WTwb*#~TRj~0LT51PnЧT*a+sR4x+1TCQ!T_JP2SvS?e)wBs4R7*46/Vd1mv; -0gjlOzV~+C3j2n:۳)ޭf/-]apjryu7]9)}8'UnDhssV{Sm7B}df#5QߔU4kMxš8r,y'hJ;yk=SR5+3R4ꨈE ҟS@B} -y?uFYPnhqCڋ6n󬯐U[#* S PJ=骝OONy&ț"Wê'D U .B( !+C=C >tB}hmTM1n P5@SZ+ʋzFJP~e}SoZc}( CR - =pVPiM-qT:^/GG-U<Tn5E/2'Woe+a.4"A(ͤo;N:cA՚(Qs ~lx ['?;O!-šKAx'9MN YXk+4yf%[T\|\fZFBZTkA -J-p[O*:Ua!׫餦6je-~棻Ux<) -8s@D9`sEv|bGw7Jk'uloLmz(7)O>& -5of=TW)εG8S DcJUIVZs*ҭ*vnjvjP;"K(s" - YWuR;$ H(58=DrѴ5KnSWRo5j?<;'CKFU+opIBP|Ɗ(o'av1J+ DWvJ1ݽ84sDU`Vp";B̨CkvE%p0 ܅jvTr؛xAQT4P=AAD[]jkqz*p?$;)1&5DAD3Q #5ACDsQaFTnLrɏLz:eVk怽|0PE{}ZҬ($mB?@FsA]2:H_(ל8#\5)1ZuVZȦF(O̭`IsU֛[|)D(5^ u[<(@6y?bdBtߪp.}Y\-S=9+/nJ@ ~9VИHuߪg;ic[MnWÇʄ$ t҇T;$pĩ˜W-SO;35;pFee0Si`V -l8S^>5]iQҨ?zgijLPP4p:=E#?gCߒBisI?TnRFq)Ԍ)7iOM;$(ѹq''S,[+l_wu= nrHVv3US$#)(jy&E|Z~Uٚ35ӉU$lxU;3Vfn.fpO'Ik -l^Zj͒ϳeOC31< -; עBePQ8Vr:|*m@) 5Nj1܊|{iyN?OYZ;+u5R/uO-Jq؊8hFE Sg_D3cadd1d p=vL&d=f? -=;\iSj:. yEuq9(.gdXX(}Sz HVx}!AκJjt_J,d -XgQ%^$!6wLl"̨?@ϬZ=keM`ijL7龴0Q-rmҪ +&N#ܶC}oSS5ة@x!FQRQ5BxlkGS{lբ\Bij1 }?ބ7 )Xh`Sfh7SU -qp f9Gr:+4+4( wTw`zX_yګ(pyX{ưcO1٣qLAV1邱~fcZ/.򪟸VZ;hVV*ҭ*ԭJ[;bVmVi.XAo?XcoUSnY:j{Í}aYXV_/!WfeVMTqjwS}ڵA#NvO#ޯ*]RG_{h4ާ%ifJ2VT@O -JI>"Njb0O'Q7ǸmBDq.=UHQSzybrV tD\}F\wQFgs9H7U]?5U%RR OQȠUy(Ue%Y{P&rdvLcj7aGW+AbSN au5uuy^WrN=u#B*R*sVLOq -;jUˆV'$_ -yOrsEwQHj5VnS_nJq@h+3T5dx~º7<|^(7%J -OPm_cyLiJ$+m5;iHOq})ٍW·8~݁[ |+G*+ī)Uvmԃ\6+#ϡVW6ÑV,"puN@gbh -\A@ 5`8:!Dcښܓ"5b5grT=Lpc~<"^vۧAB̔,4?%7h4Uiz+k[U3/7uF EHƷ5<+vVy)sRw)^z{q4߫4rί󦇊5bٮ'Q(PhSi=upVZ[?Si4u6\tQNffii VЍ0T P52'V~݀N0 -\N'W -(%!AOB~kطyЂkƬB{BxQHrO9'ݒ8I&&HǦ8acy:z#FADTAD3* ->FT}ʋQw*.Eܨj3i;YNjEt*=Fgχ\Q,g4cMn+UvҜ캘צmJgfJ&V.Sn?=׸W|v[Z̫y{u׎eZ \<T]_2?PVvdYْ٪.FHhg?g΀o-N..,:cnQ:Y689!٥oJplT:yT-J_KޭȫszV|CB(-[޿=[V⠐=@X5Iһ|#ftHU5UV/J2y-Â$ӎ~n)N액NT59NsShVZZek -PF:PqL7Fb|oe T QSK}ʌSqQw)wpqUJ#hm4w<]Q\v<E<׳Q>]1V9}}}}]ʋQw*.Gܨj3aFsQ*>>2}ѼK^:F=Jƾ葵 -:?SVz"\{i4$9T|:5DM-E_T1)\`/TO4Ӛ>EtVЭ'VdT~~n%>sR'ӢlYj`rgJͥ|@$8|Ѽ*sL9]9j3P*.FsQg5DsQg4f^'P4SVֻXJfvVt{( j}P)BO:i$1G -db< -(0Btj+{7;nf4R7u?u0ZSʴVi=դVZZUZj)QZbRH)#WLWbJ4N$M7d}_=}4jv(8ӷu6/d&J׾ iS$2L2-cvWWMqV?X²4,)xHN'+p׊H_iqŤ*SqN:IN: -qN)8Q:NÊ &;C]Q̃; w(cFy쓎I$ُ凡B=Oo{)"9vYE(S#d97@pޣ/Y*4;e|1{xFyީWCQvFjhw'J% R RvRvRvRvR %'e O =؝DT,dSFeF]X9Y!Vb> god< kd4;~ -w0UƥEu։4^'eRy q -"HR+wyM5UuUY@t x#Vv(᧚H)ù<3uhSU^dEȹ_䋑r.E4\NviNr.N~I,QXeX]ٹXOuo#q5V"791M!$WO9)JiOy(ےhCWj8+q_qVҭnw-2Ѕ)=J쓝^zd!ܶ%'/_Jl?GkW}_WQ$SL~E1(ݒ(ݒcLvH]K6xIw3&EDnGXuW1J<]DvLD{((A>%YAVoU@O9YsQ:IV%ei(PG=lաZb+d*q# cJy?}4tQV&5A5]]S%w%w%w%w%w%s"̊p=5q_jeXZ֑Md -RzŽt]Z:5>U}Xug#2q:DHiOpV7Z{&^ʒ'"IZnf QLkmAW3O|׉$If|ng<ߦFR&NNN$dݒyOr{ܜ^秽9Nzs]AJ*-S^fFN4r!0CpBb{:(B+_););#QpuVwVO_+K5E-6#tL/) 1DG+4Y$ %ǒʢ!QW_zb /*Z--Xx(8..EuFZi=ըQVEZZ -;SNhr9Z\NVqeTm-8ZWX_]6Dǣ#Bp1>TO*SrSǛ͈VF91 裍Ǣ߂d{0L4lVv]~/b q+b#5d*kVK"=kLz软e i{Ke[=UL̕lZޭ/SIJG^^W8x!PS?exW;vFfjVffjfjVBKIIIIIIة{/b]DlTƅHrNiSEGtA]E@}0QjrcGO##:NW;"].F<׍Kf8ToV -[ÊsST@LpOgdvRF}ZƇ -bՔ]$ PW՜fӴs^{0Jt$uک"-ZުH8|Dj5ȠA*Euٿ}v*/f#8y؉}P#RL(3WsEnh4[s3Nfi94fٚ{3DWP=kҪ(TӖlLt4Vs‰+Tp/k{^W\U -j3<‘XbfjSv*nMة7bT݊Sv(j+DzE~jEb9`V2:8if=Si4ÚmBd5mu:k;mNč_7Ŧs:+sպ\RH@ĖdQ&Ή\ΊWS,U{E踦 - ÚT]Р%SPۜӟ{B[b1eNςw!\wאڣ>b7S̫Mjp@O/w ʑ^ؽsO& O'ȈN|[6`V]0VCyUb*k@ -m7PvE|Ub5ÂaZ靅*kzœis䦔' ]KIUmSJgMkdFDW:c]e!>עj7bNkUNn5LUo)T=ʋQLQFGdJk٣|HƝ|I# -+IUQRPzp @>xQYIVq OQ]b -!T}m=P9GvuVUD)KrS3?{ET$dW[h TnDsM 8@Rpr{UUgQ4U1(5WvS50 -nZ8:pʮ -;nh=T,B̔,Dܐ*qձly#*_En t_\SOM5a*%))DZJQt=ێpS7e/bFZNJw)JcukrPw*m/jRwV)#7[!+Ln0tīLyLyC's^ -W^zm^J D(+!$qrWq*ӹBs*Pʊ6zg*Rө*ߣ}Ug4(o+5UTdUT'3)Z -֟#\w![mPFܓI&&j^N= ;" Cx8+=GUg-Lc¦ 8xU^CwR+e0ѰC 9j*FqsVި:^JZNt3k5k54|w`oNn7qN{OU {hLB(Qƃ SvUuݔ5y'WKԙ=lCZZkJCJ( -&eUD⾕ kx1OǢNTL#PRx-M鰜gb"=:i&;Œ^TAԬ*@=ʴ(ȟڥ|cOʹiRd/Q䃆&O DҊ@jwE ԯNWn*:ݯ۹0A0vX:[+[}U}E[=J#w=4m> r[o7j$a!rm+4*qC@COvW3VvE O$[CG-kCܨ{r}}Z)V~YmYUY+7eg -d - -0 -0 -0jA~NL|k['V) -% T]g#mB&)Vw -|MJ#+TǢמT*ӓT[wnS]{[^Z?QRO~muMv(L(Mq1;ѼS:i5]2'Ś۾ u#n(ذ]cM7 e'ШT*+*څ]GnVUkjjZ?IR=)jLj3Qw*Pw)U j(bLTOVµS -fp<r)ZOftiLhT]6 k# ->g*0+z.uAԗߢ -[JrVӒ;SLmht*#G`{!)'cp ڵz5JHvC*j}Nh5[|( rbngu+<_fjvLמe9n8('{=/sVGUl[a[OW 6}ZQw-2cMة{)ȩ1G6G4iӇ0(?5 1f:Ȅ_â+ c+$aYb!GssDz+U)+MT aT. -.&Kh=e SwS -grk=հVҭH^xTR=J$4:X]~n_Ü?33]Z#W1i -ԭ+We9w-.)>SNIQ<$Z4hVz՜+!46{f}ЏtGtAB@6VV<N_* j cu A#mn2Q-ThuռU:Q4S&zewۮ8oy*"JJh_-jM+IUJLNIT>kfԄRǪd̨C&eY̨dP>J;Wnʪܩs4>? Z8r@zMoeQ<(T-VP j4GU*#9DbMWL3հT͢Ӓpp[VP6@&9?)[FѥÚa0 ,u9Oz<PHr( *a<VV0|>nItLzwɂփ٫0Lz'^*9v]~ 90oLz\G],wbV^B*8`9/b熨lSnEZD1hנ*r*{'(lMc^h;#eظhJ͐pP۵4I5ίF>S e}{&J\(ɦQ7J\NhoGQ0ewiEҙTo3*(W4C~U!VR*(Ei!iЕfIVoU}%BZw5 OhVrB*ب֟7 ЍF%%2^׺+Rԫ'ԤN4uܭl#zMS}] +-4Ա=Z<.x}7+?OxGxlHS% R.4Ц8tMz($)S++sQ:֧F, -:tR54+OmSd1PZ2POTnWmBA|ecDu6"oڬBТj-2 agNI˭)ׇIZ^{BЭEkܚU~{FƊ`'s(Z-5(<|64U{hۿ}0N)Wqu m?Cm>SDa_]1k -SآwP"aԶo"U4@)yWnQ~5BP2Ǣ}v.N&ӗ#5+>+3R5+3R5+3R533S1HJNanjFYm}OaFsO8GqV=ygE-;7Z(efjV}JV}AJϨ)I祵r+@>g2S~Nw f j+jUi39)';$Mzxc}B_XV7NY}QShmrN -+P4rPYR{I].=TVWxO`'ldSb8(qU#n0#8})OyutHjm<էVfkS\\\3f5i5i=6a%90FUok(=ji]جPQ`/Jh4$`TW!4)vҪ/l7G=*xD\̅foҬG#?eES񺩀]֚L^*Vy[sR4ffjfffh9jkhw)jfNCCz_v7]njzL榗4瞥4T}}}}J!([(d@VhY#xx/(]6c='=^=|h8ENU -sPi{dNz{݁ߦ;j@))8̏U++(QPmHأp mT`4Vf}J(B!4vrVp8qP6QUrMzb{:)Zx#ԩ+Tn Ǩܡ%LOjvg}ZZjY2 -Y;)d쥗^IT'֟7ըB*)?6VU쓟~M2ZJhJW[]xyzNԠ;*JpхURa6V1 -K0jZGU!yQj7N/p~TnVZZ/4ͪ}hԍR0SZXjjiVZaN* (Ez+YM2߷IVI.|)nlyVf+;j9+32P-o  -;𵥽+ -bzMxxeT1Ò+Dnq:cLp<5 K<dNVUiEZT}VVhy#SȺي8R*ʱ]7-Z6&\< ʱz[cB̔ c] q؜w&c'5 -WDUjUꦑޥL+h[k%am*S3ѱ2=f>-W _NHPHT0VZ;1Iߒ(]م((aD~&w ]@F oLQpO9"]衻κV$d[;SNDzy6bxdByUJrUE7OqS0KqRaj-V5)jiTY`I+4NЦ%ةM,,8o cuZu7CTS|N[rT#QtEPAJfSG^jQ9ԇlV#Xua*êu?x;1d>E Y&t,qQ83 N;dt -ۮ⁡̪^U_袹\5M(Nj1bP֨P$oe)謅UDWT.oF U*ܔA)T96U5B}K -vZmR4 -Tg kVR5 -` LTڥF$:!O75H5[iƻR4pL5 N>ez{ڭ5S)w+Y?U%ZSdž%UQWt6NOMWM.#*F){UKa܁U'H3TKHrO9';$ צ5Lz7(ߩc]((Yk+ɶ&biE/t*v}C&BLh ,P +p{!QMٟn_4>ώ;;{^4/g -gjMJtVpͫi -&dnI5VnJtS/#g5FsFAUʅEuEE'Kv)ZO-ZKJS*cR$j4:O# ^PpzW8zaz';9ǁܬdjS)Uu*N򏻠B*6P#G6iO *N{'hx{oȒ.hʔnG:5NčF:6Ò|ޥuy}BީRi[U![r%ˆ+h\)^w#ȥ86N;_2^PwVCXueTWNZ6?*66 Gi%HY$/S\4VИ)u}U/n ڰiFLJGGܨ…dfJ&dܓBh@ >#^^(wV':ӊ}FkthFytnoҦ+|>;բ<էfJԭ')NGRvsնElztrR;$qr4w /PUI:*r*+*`୭գhEZ:xkxY\x-@uS356JSr[4:דiU5w);}L{JSup 6Ax&wN3QLS.9],yn/Wy\vhu V:+Sz)]e.jXQT -QY{)zlV4Kjf$t00*VdfZ^rս,V+K3VQ8/x7'QOkܛq0MqN%%x9#QthioMs:+8/M;]no(FB1߁xS5D6S0IAf9@)b0!1?F %v?vP[yYZ@a*dIH*B*BvjGfvjGfvjCDStVOԭMh?MX}U7*(/^`j j;#F#^zG´ -&b}6*U?e:.>!Z -vM+Wwo<:>1Vۃ -pE-GBaB|qӽ[0R!}7K;VT݊w?P)T+D68qѸ(H<f³zNN&yꬎcCj-R,mA/( -|h4 -DX8(qFZ\+8 G]KIr2LWsWsNj)yOr{'99qJ۸ &HrROC:)b5# 妗}? -1WP|~*gfJ(46M!8 -R5+3R4kߊ5WM oEh}yyF;Q -MW}2R-wJTS)iKySm(̠gzNWv54Y)Bvh -nblB5Jm!UDžti'/}wHO:D۷C YsBSZ8-GΈnh𮞴Wi4vT 8d ~eh530AVp/R5̫Knb-ǙS0t%ZQS_@*#UjA~W#z]㒥p}BϚ/h֋q -gD'Lx' E{!/eS^;uP(i~adhVAcoSnl"~%B2Qa^JJ~T=06@gbwIy'Tm:j`WrT9=H(HSܞtu;i_?2J'8RJ)E<{/k{'IR8:m)+EV{IS75# Q* -YX;5tV9)<[SSŸ =Nؤ=RZ[uoM)H씎R=97n-WӞ1Kֈ9ʏCܨNeA@4@ޡe(ZbaM%@2PBq7;JS7fjUZj.KoVn㊘ኵ>Js8)$NZvJ}tnU^; -5M8l - -G}PӴ5QWzW J/FEC-ꚧT5Exhtv Bjd[nRh7w6m* CMb@EORG2G4y(Iz8!"5F1p4ݮSM9[t}RuF&xtlX*~~[u~cMP?9MDFע٢Cx^Z]){1Vug -PDSd̐fH xyo<݊ẅYug??f\{6G-4K#mS%™xcA`hݩ}l߫ڡ)GVkUYؘu<2U< m<-8ׄM^[>dN.CzeIP涪vfmC3S.9+F*ij&THKAݔߤ5)\blr#G5Ej9+INrRݠqi2N'F˭mFPWjMNJ+/*x~fIVz7"5QPnIiTzʞ'3opWU1VorQ[ovE[*vh>1`uZx{w򦒿_F5hҧ%1up6gyi*%iy#Sʴ-]@TJO{]K ¾U-՘V4lLs -:(jakGfJPG<0̧B:Q88rс.^֋O'@2N0P =?A%XrW<Hq\K/9jx 1(]ih4[,9 -Q'ɉJrR%&=<VWmU&kA޺^9)kCLԩj*{Y̩|f sPEp۵wC[cObp[yLQ%Uo]m;(w88Wzssb0Pe=T8h4ZN@u[xUmU)pV#2㴊`%)V6+;}eG n8\Q51Q7Wi=k1DG-[К xD>Ɂd7ޢ~gՍYPēи~f\ qF]Ab sgb26s-hg -J4QF&ںF>RڟXٹEjdcnvTnj%v;rhw ;:F)]Gd((xSHVÕe6HVfSvZ*Fj|qUlQ1F?rR*s'l[0<NTl:?;sMz#wj.k+,'3@E ;(ُD(u<~MJTݓ>T)PT֩(iurMĨiF)Se)KЩӱ<;?*yN{5FM8qܙ"o)S]YmQGj7 +&(1Na"` -YIVz)#~e$\:o:ңݕvOJ#0ɫo㥯u7}tVWqpN -i( -l=ף2Rf3cl׹U+,yd htX'P -hw8陌y Ίʵʵ -sqOk. -ChӑSqn4Nۧe -;QO>w|\{Wv -օY}UTnew=teبB")Z -ԭEZդ5hV*BSt];Np;ԇ%)X2}P[8pպ,(F䣹'O5)8SvO'fFU+y+tV}*JJ#)ΊAX+9c M6XInH{/TEwCmV -hSE,Ԭ=4Y1Z V8mU%0y*GL}ѽ4vlA;*Se]&ެ~ J0ԊW"4Su1E+ڤKS~xQ<5ۊہڍN:7Jo -V{: kPiѶ{'dʃ{[KFimfMzcTnLLNP~PwL}M68Ph8B9 Z _i +Cywy!q^Ӂ aÏoTjx9nRHnc#_!Ǫ5穦*E!R9QQZs3Nfhyy+TuFEo)HrRʈm5 R(S3533Xf+++)֋o/~ךrQ˒d)j cA(MϚ3 w"S.>OĬ]ݱXrP%ciESeoN}z9.(4iM\g2ChJ,aiƵط|w~p%B wPw] 1nĕ#P*lh4^>_ŵ^>4{J~*h_õ +=N[*B`?Mvnڙ OJ(iƉupJ_ŷR:\ Z4UٿnVhWniсRt{Q[$A?1+5QO&Y:X>pDgDoQJj S #Bs]-袕HV7ҞV'g -]Q SnN#ڽP|\<4P5p>%FGEU6E\8>0AJCsbt)UieZGTO&uM pNMN`r9<Հk -F\T=Qo]}/n ªTݔܞicNFܕ:5A.ItK?)RcJ|JG}%N?J.J/N RIZ3duH\OIe$@AEf% L4E*{Tڢ夀w@Fk:={9i[*x5ko T+O;m4KZeBΥ@xpox .8~ h&i潦j:kN4fTg?^Ы'XYK#cz8~uVcՙއO;'͚kʌM,CJVh -AM? -w hq@QhO*/z'Ҝ@Ě)z'A8({G -\RVxr~.iMeAB<3xesy[^jYuSMRm(aV|9!oꨞЧ9,Яml&?0(Zc>rrlY+%pB|ɯ&,B̔, - 1YpToBc@쭧 2[-dh=TT/z@Vw7yoDǿ -~f4؂yhޥLzԣ#utܔM1S ׺8 Cn5R]o+jj]6:}2q wN_K4ڥ)'`=k%܅*m%I^[G5FG'K@Bu}݋mtLWپFudAo-B㴣yOk)@y ?\@*6JX>^䬿@=S<5T:]>7X;Պ{)qCvNǚ=(,]^m> Mz9wPޔFB!h5 -+_AuܚJvj(F&(xDno:Nճ8z)~=uO V;HL󪷏LռA+wͥ9&&q Nx}AZ2wXޤ =HT rW'Tic*7Njw( nۂycy{†;T!CVK=QkVH0mATEy 88SF{B*KixQ:+):ԕF {*UBixRv]SMWު}qSr -;irh],Rܜ窒xBʨ=5Q;0?PVw$~oK3JHCuti_'C WgUVh;?hB6%2O̧Ǣu)EEu8)B+HV*'tP7YBXڬ91U -yE.XbTNեYIQPdwunPQ:cS^k~*̓)UԨy`QКdkz9h8)5B)ݐVSzi82:]ϙ+YktVZLxV VzT(եnLӠѡYơYOȬq*f.HAibܡ+;2Vvd ѱYC0(oBj5iځ̠飼QWjӍ&{@P@۽ iSޞ90B'DqyԷ ॼzSCiV%7lW9ZK6SPdfzI5VHd$8;1]T)jTOrs);‰([&y;w(犅dj|RݕЦT7'ZVqoeQ3 `|g4e~R uA2ށ3Ua=ՈVNYR]Q{ǀ*}UChS sRzhyjI TOct) n -b_ qN;rVުfLI{٢M@h/ -Z7 2Mz+Tc}m^.tSlVDPT)\ynqܬOV+VԬ垺=ٰqS mHMnkxUʉA"QrX -K¿b1 {ohe-NZ(98:Za䢐c}8DFJI;)$iEpଲNn*8Px oѰL1ޛ"2BHiqj^5MciJJgcSjSdha* :1VCSYu9آe(C_Gu265hnjʴyt8j֭VHUVOQH:ww e[/]TRԧ 1p;SKkhÇk8ָz{Jot0nJ&dnHm[|l[ m[xy(zT=ʇL+.)ЯbA; bfT]m)[jpV׫[V?MEZ|զlӜZS^) 1x)p{N [n5L-'hrQ3$dVD#Njv'U+G 6ۭliFsՎufx#ftՑ׹QX]U}H_N6-ǘ_c+8+ѰmVxx֊[Q A -'Щ^葆PHhp7q曮7F 0ᤰB8{&ޚakvg(qvT]LQF4eWfi?ZJU/` -Rzf$*W?iRcS(ƻv:@Ocg:wJ56qQ{`GOJ lN>-L-5۝Z[}OE ݂`wuWAp -VDE(dYߩD6%쓣 -q~i!Z{+QZdZޭuW+ErQW8¶:{QR?:Rv)NzךF hx++"ǧ!u*UV'wPQ/(ҪvPm]}*'U}tY?edod¸w 2uTQ -otP$NeEOSU -zcczbT ႲMiPtWr`R/ -mQ^SMX/ -$S=AFSݳS=>y}jnS{iCzTTEKUk"s ;iLRv*^CyM;Op~پ!FOõ'=Q0^9PO:w f~RTsF\O4F>{MFܓEDFiR0zp>u'f -V- ꭁ<9|Vj}]&r((Yx)0):B)>*TF&Dy!WpGKO4Ǧ9CBEwvDz=Uմ>t<@*nT׉?)e, -s*W?MRVRJ{H3*gQE<6izEiFչsM91:[鶧b$U Ќ=v+f(y9'JLO|nu.4j{r.Y)\p$;UTn4Ӽ da}UesҊAN"A .Hڣs Rw%j8(Û`WMӽm:B'S.' SުxéM{YRis=9P gs`=^]-#/E_w8֏ [ժC :_y)VzUY^gm;ty -;(u -8 G"x)iN~!ܢ;).zUZJ~@OnnV{-w5@Un'+cVV:HS -haV=cܨҊOZ;+GdtETݔ%1 - 7FA=<{SޯH@-GCN_ <, -dnJdКF<ʉC -qR(@ -+[+k[xlQ#ҭ.g V+SFoSL<+{Q/7;i41Smপ4Ll@j@nIGʱ?E+TW\w 'N1Ӫ_jrN:6[AR:U|4D'V Hx(ZSz}I(|xF6]ܫyr>)}WBimAsOxp- ;)vhi~) +9VcADA)jܫINSܞ)DC3 Y{M([/kUhТT ;j:?Rut}ژ[2f`HL՗VC b)3N_]4u -z;T{L- qѹ6jRnITR5+T&1er̠ -Zoe{&+yDz#O'sVEjr"pB(BimMkS5T1AHrݥrFݛo+4Qʌ9;|4uwT-A TLrTCFixicT^z:oG@Q?}1SGrʴuO-,D(Zʞdt>x (n -˧Y*SY8c Jn𢎉F uC&|;sJm}PԢM,ukM-Ac 5ؿԭ=ʵw)Kt*PtFKyF==UjEZQRV!R_mq!HiSԫWr]ʵw*xyڜ_xh V_@צ>o8ܣQ Q(wiIFs*3Qk`ڢ5T,P144p.LgdeNVbqt 1kLފpjin# 椌dge34lS](ђ}Fu -;U6M:S8̍J;h|*wen 1dy<{IxSHoVwV+\t4Wh_UIB8y,2 -S % -WIqB22OJܧMSkAXXG <.Q7-]Vz͠i犲v*YIVqw-,!Yf?*7fih(q; -6mS fP)SG533O.ao*O)ׇ\ -xڧP))MFb 4mO>\E5 64U>Z}j~>Ryvͺ8TOQ=G"DׂtpEDqpD+hާUZ5l:ACIDi1ѽLDqS~!Oz.+T}ʄb~Mncu;3Squ榐嶚MLÉD -!M5YVzl6&FӶ[Puy&k@OvJST݊R)eh< 𴻐P -/C/0No\t4B[QRvK>,<<5{ܤ)&vNԱPhvQȣ>qt:NqE Ee~ -y fP'ѿ*AH;)E2F;Nᾪ@l!ON5)57)ZU3hy+Zsvia@^M 1F!& -M,E?eZVƜTG29@h)DN -74pO(za3 QiXJTݔݓjx-A*sM9珀hMdܓBhCK!1)#o*ºdhTfI-d,@̔ @̔ @T*.6Ͳډ8oE+ S#9($<8X=T,6yƃJZS7NBx0?$x]JPRQLxkapFJ,<.Wwnq^.>AqFZ^ZXЦ@ߡ-)^h7CEӖzމ)41wӕScTzrDŽ :A^SSSuU -q*xVS)G"43 ¥ky)m)"U4S4 V.-Z/8QBbh>BκU5‰Ft==W@Lw*A'ThOTBt -@.P4 i" -` `[M*vjv4nhj գ'f(\1x֚P3-,7j1L"58ךB݂;n"GSLN#@7j֌+) uEnGUM= tŇ?z 5y7 4~CR8+VOz{Squ SLݔZn\O]-\^ЧfQ_9*W+sS3533FZ(>p;+2+3R5+3R74tjV)=0LiTƎ`Y{'Vڜk :8B{:VVn;ż -N21։J4hw y4lMcc1H4tG1J{ QQL4H1cBKIoi;ѻ؜GEpWo5;1p•X&鹒cP˒c+(:=+<+4+,Uo$s ?V?ԬC]ͮw*@0ҜiJ4-mpZ, -}֦hvUshNmxMOISLқm9,]ک#oŠvO:kXpݩ{(]#k)J o|śW GȩS{7bM'QVߪpc URWM#jQ}㆜]cqsUX9 Vx=ɔpFF'y#J[SHե ƪQ/7p'%)Jr)HoIwN( pORJ;&4pѼQ.P/spp#Pjcw}(tQ -';<1ǚhn 9 u*ffnjVfzK(& AeuTDTBE_]AxP:%1Y%m;l)V3XY+n/*f 7 8z!AS9QY{f>ϊ"κD TGS)nԬ\7<Udt IRx<ꫮ@wx)D -+3Onh7iDz謕o[5SK\բlբlԲLjj*3yÂ|#ñDܔy]LiDƏD{i0-G$۽SfjFO 2⪞imFҟ6j2wd4=<;FᚻSS40f(LQ1mM \aq^B&D/T% !*6i:EJ2Oatcb' 8GU|h*dWДo6\PŚ uu 9茺[Zqw rP$U/rG=6eZʴ 4T&)J.7'HRnR©Gג{ԎRJ#MujMot(H١Wet7O)ݔ9SHa#9Zj -VƨD<1Q3$\N4S34Tͪ'Ti[{5LlrQ7%2Q7$S"w[SÿH(%1=Sk^:]D)\ - }NS53z}7QAXA}W_|.\UES#F C\x.SK6+.RamH/WyRGD~*jF)ٳsZKULqmuW*߽6.hpwP}](NeV*U;tÂkǢ5AhW5R4i>iqc c(u5[4 -4F<</o2 -FejoU(;uPDzB[x>z nDuŗ$zM? T2y:6' -zu `uB̕ӪZB֪f UdmѩuTПJ"pVb{K=+D4oLjD;+)VG+1*;qU~!邛5 GCS'5S5J;]?Ȯ&z <VW`x,R -!FƷ_qռQ=FtNBM(%ΟY fu$@=4zu0nID{qu)&fJӆ -dh=4fJdfJCJɌo4$YnJ&Ykw`Nr&ڂ)h;B4D]'[m4PQ^'+)DWXF0ߪ Wzx'w}Gp x{7=m N@*QwPW]`&iZdb￰` -{p~mrKWU@A{W}Bݮx>ImJ聯PoODkEZ*ӞgC@AJ`₎    &&h)nb{#ՌgT(cF(}]1 - -R+@Ncqb -)b>()v#Ko=ݔ6=qMi *aêaaNm&Kةf=By'uww([Aw7Zt`uNy9cwat`rSHhhu18D5cƘ޺JnJ?>9jo"ݨeFPPA(NAA -?y7QT eSp 5(6Bp=74Zfjբ<բcQDR5S,{>*VG姄XMcy^RtꙊDUL/e!#5PnIRJԯpR;4~jWTLL3S?53S?53S;5+R5+LS?53L1R3S?53JԥJ+R5+R5+R;5#Ovi?*W~jg~jw)e7`JHGdy(U;zjdR*GfJqR53RN5(Voԡpݒzٚ!QZm'[3 -f9if=TʴԂ*f#PSpLV4fjf;'8 ?B3Q1&$Rv -R*gvjW~jWvjGfvjGfvjGfvjGf~jW~jW~jWrJT^I' -JH3$dI1(ءjfFj9ܘǦA=_9HrR*^Kة{3TS3533S3533SǚJԍ>_ACLLϩLMة{k&=DsP~Q1+!1AQa 0q@P`?!Hs:-2Q򑞫}FvLa-To;k-f~20~4='Ѡ߬}sp]dH6ӊ hM95SvnFueuG Iqy'"-a<.a8 -ԂS|ӈ19F\9Uc 1Kpb8\hhpa28 9i_\k`Jd|<pC.@Ax, Bn\ <'G'Mf,\ ^SLtG[-܀Sτ'{' ΓXV!b /|CB{y5%G`fnFc>x_)\4*)Af !#C9W^8*|өa8N\|| 133P' |5#2-0B℉ӂCG8 Nj\c:um7؄Mb% h9x6Gd{O&M?\\489'P/ pe⁤| 8? Lj x^9Fbpp c8vb*5/_Q ;# q|?.KXx#!>R>_p<ӂ:@%ߖx'<8G"q%gffnGEXRTRU"e `q([K,溭ְ1_ W~( O8H.e!q.BŸ!˴g^ppۖ0XmT#rǗ!qgq\TS[58sӆ eA,a8\%~3pQEpsoh:x׋80]%ՂcHN_ xL`BR)|㋑Nʳ b#i#, D5#.!๳( B2VE:ʃ%nfpP(/_@E.oʛ?L.J>"6=h}|"<2}F &nD`uӽ81$ -Th>-WBqK<ƕ'% bȃ7S })D6qeJ +]g=ׁ4?p?'g~r$0U(H>sHEQ88=WHP"<>z/T#1djrL|%fT^l̚~cȳ KX8h8Փ# S!&T4|a-`x!\'%r9tE3R[ʑF}>t W,tF#f$sL}Or3JJՔ#!s$7#ߓ|&H>O^F`e0-x҄l41Toȭm&8PIEWcP*eBP 3>$L\*WXUhk ,ÓU(դoeŐ!ʥ~::IpӇh闖c2t48X2u`A<1A5 B#8I4rhHe8 -Q2:@%N"uVk`MσJqD!IR $Behfl&|fQP3D[Ltms -3aB`օ xy -Q"EA8k\//^&p -t +`kA ?'`҂.RuV f#!3+&|' `X9@re&"Jb$CH2y1p:+P1r B-Yi'|.!|~$pUAQ{*zm'`2ʣK\4s¸P)HVJ +B?L%zdy߼ C~xOpPCx{3F EЁ7 Ei^ *յ -tLAl -a [d (%N< *:B-`IVR2$Fw9XڈtHw/hQ=r= F" h!oXk N$ -%<J9q}&|L'AoZA%+b Z5lԫHua MPEAQȴ$zЄ6PJgM ߄A&e~`A ߳G]}H.d'@ -SD -d ө?ʠ 60,=qI.~N2_:|y $'D8'(EH@Yo4B )~d錘eHm_/ 9,O| -@ane:Rkxr9?_)̗+8G>8O!$f:U"6͋MFa6C -DEv~$ĒD8g&22G,:X~0prPKC~e\>]p"|hڙ&r|18"PqD)ⷍ,k=`@CTe  U53CTaD#.%q((oIerC~FQM(GJ 995q -E[ƄT+|eY>5|kk4Uh!¼4x>}\t.r;-|C*cj}3*uQb?FJ3B/0)B* q9*?Eԃ](SJ~Dӿn- A cFd7oܕX6~Wja|Ƹ$;Y dCL ͂"#BHsD2vpiD؞#bhEb#=62T0Kd&G.9 %Lrq3udK&@k&z #  PN1v<&`0VzIP/#Nurs@],2(KLxd,t+Kƛ7eKeK* 6P71QWd&tS M$B8`Xٌ3y!),@su)_+BUz^w!a_r}>zY-A`tϪH+>E-Bx-ra9tdx~J`?L(qkԉ${BޜKȷoA'ɓЊϒ  -|/oKƱꕖSQUPKY?3>;M|@(qmc&;*, &Sw Jl0iX3#uUFWMAl g2gZ{Cw@ѣU38ʤ*)@ -ʧ"wV&KB[!8O -TZH?l9b ɷTnxVZhFpCỳ#C()ø<^b#{f$g[" R`Td -/pA׀%]wU%)Lկ^2 JB'.r M D)(). -}zHxQGQ@􊶀4P9!BGtAFCXHUCժ6x⠚#m2'5.hcFF -fHAwM- -lTn3n'| \Rk? |5E TaSK f@>FVf\Ou չ)7K d0b5Q,]Il‘X=]DGXo}GH"b(v9٬Kq(4R'J/=fe3*EeJ%8S A0Jxg',?SgN9A( B)HU flH_!BvZ"s5Br43f!O|35zϑ~Tuq>0$q_!C|Kzq<lp,8$?~;BAD&e@K C"0 wc4`A0":'2L`BUW4!euK_ I %fFE:: -b^w=-A3@a)i7]Xw۬x:t*! +.k:G -jzumvsbn |e`͎M)l|A$C;F)[@QyRa/ zj(񫶊 72qǂ= -/ӟU2CBGu-IO=a^KP4BÐJE`ݔK0hJ"U?r'gpd+ -@ 8Nx*W<Ū`R;\T:aU*~!UOND+s>_p\EzA!Tج6TJx"1%At4ج h*Axbᠤ3Id -ACs[^.`)M& Hk-oX^qa^dDrELFgˎnc343^׍}bР. -^eD0Ti YƤ 6. -"ˑ]y6p.0 %{*@mGqpb*z9RX*GT0OΰM -s\OCĻ24,mi.GH{&{hu<寊0$'Á|}L]H^.,? ~ <<Ɖ] VJ3C[>>/8wd#i>?"&^CLoe0UlrW3 `.GS!`Lpp@ˆ(L,nX\P\Թh<.6AiZk `c8hN)D >׳BZ9paBv9v*. ,DJ"-7lV%4ц(@7xg&xWP&#@&r3,ݏ/j=*hy(T"&iOƈ¬IC8J/gLTe$?4\ALH6!% -Q 1ٟ_"Jџ,JQdQ>MG֛Q"Oփgi12 ^ja1%RTXVSK ,1[`9F& -qS ֪<τޠ[ ٵ0Ax>oyoYME C -r |@4RcYmyshEw@r )̥1'`;6C<$Cj^]@Kr;$IU*J Xzp.g/_PZ<[;2 yf/cRUQa>{qzxN9I.CaC|cnD*2830RE {f G6Љ ")[ N܀~HwJi)j/đ Fŕ=f [< Ѓ[BD"ᡅGhzEplpD*tt*h])|C(NAq)PpC Rakϣ0jX QAk*y!:% nP??>AS|{q-[c*2y%># k$AUSW C7E6H~Qb97 -Dp<9c>B3 H]c>qN}@ႵJ|c tYNi_xR߬ E0 &0R:cTcv8҈Ka3f>&`#<;P"tΨy"@0[ {!KkyP,cC\vw)ND$H+O7n t011} Rj$4&6fGIJG)ञCB7 $s0+.υ+P_UacB@DKV#sQ4@<s}P"a@@&ZBnA0cZoIabx.ب ϢXZ2b-Bcxv\A j45ZO 8|vy)opAʀ -#T0y39  V& Cⱨ"n%z ϒ,\gLRDEo ʸ̘ ç^*ZPKJеCr7k[ߍ,/ mī9pR_0N -ro-Q:Mi Ty*cR'OQ&Y/5)5iZ+3*zF/[Ҏz>/|j&W 2KQ}Pn#1>{Of0Ud&w %ˑkxAB A - <4 npY{vr9a\)KMi%1# PD1LsXqEKl5T !@Z@hO^R>0%w”8pCB :h@U噌 Fr*(+?!{ШyiGkCӇwaKY<ACm -)BP*MYV$Cy2 6D  '\7i,Axz\Bdz%E{ZA`X'ą=:@%B%,!N28EtN@J28 3s=! pXFQ" ({'BBX017ꈱLRZS! Ec*qB= !o: G1)0k1EpcXL6ѱPH}&23kx/B!,>QCX -כ[hW=f T;[3(e.ܓ2??U\K>Idn2`@cpf 30K9РDfXU*_3j :v,*o --eY`oʦpܡ@ @EK_̂` Xt6A c {YAZu`/ -=iټ(FdĘZE7'ao0χڛ w0c$1yRЃ(mB% "f7l0=[d@Z;CP+hЉFǬ,tF@ z!B vQWN7q &At4@5Vp¸ scaqa"%5%A:CZ0zCSNĢkBb9WO9= |t\#\?FNˠ31Wp#xM:@DavFx,=pP+T޵P'+[dΪg3-Ql<(@K0cdY2{|w rZ d!`9]Si!QG,W!6!lA:GΦG r:B`pZsox3x3!26f rUث'H( =YG;P!d0a1Hod:yY|A24x/h[4y1QKetTp*K&|(tZ/!V!L,SV{zϔ=S~ܑ1`c,/p)^"u76R!؀1 ʖo9?!b=d%Dq\~\k(+rIHWxn@ye  - 1^:q5YHJ9p{$@Ph?reZ -2-2@ȋR Lm0v"y~B%bZ$`UL!x8gXr^1Adg2IBn/1* ׃3QB]x9r|Ox#,2Mپ&o&6y6"2~) LBR €9\Ch[7׹vvhI_ 4iqU Bg>K# G |Ip4~<WAZC{K'G#J }O"`!pЙTZȁSj͙q =b>oI" -Ht<`ȍI+2[@0¢Η8`RMTwj<)j&`Vn` =D=JHIul!TCT؟[@!00B*<7c -2(y IxǏTQr;_)[|A mJZ<.CGZr( 3%\)ɇ)_b|B_q&AE"a01NBSNfSBGUqiw( :k)$e PRAM^R֣q4! \ȩ`h :dd$u3CLB* .@gX@]!qʆ):CJ]ԳHn1t78 ^ 2,;iX/,In*吙LŪ?'~D&yeeҋ5B=.$[}O}ϒ~=D%~4Jhm%=󿱃Ƿ[ p D9DU!zNxplylp fv'A)|ZWCW1$bFW]ԅ7Kq I9׀~xN4)% p&{KErˤFQ CMA]Uh ?hAmm1.C̹CiG:<@M z#cQ68a*)g/?cЍ;(uoBΈ-)H-PAǰ2EIԿ~a ohAIqpx+xB$p>yߐy o< > IXD2"̬8{&À>ǒD$A&UWD܊44:QW9%<+&;Pd']Ÿ<ߠ0j?JJ^ƨ?WVB4݄Y@( a.lD!R^c f)N5O8p1GE+9.a?xL{q.PgxF/.e6[0! '?W~ QA:{C\c }.I~'z1Z `v0/.!Bg0V%}nܷ(5lԯH7Ww~(dIfH*N=Mu󢵃mvG*zDhU [3冋hhYb*NWs$T(  <sB.e;Y)ŹGsGC*ci@">h;`4]aNx6G($h`rʹD95{>>>(yo /jX=s -2l <KgZ=gg@Go+9;C)=Bx|BN b!p#KRhCw':V4C0CWhO$YTՀKR a9lqHޠBFMr@([86o,A8 xTG8 -.pUg/A~:2UP#qyS -}$$]C6aC$'Åf).Bqx\(N)i@pTJ? I*"&f(V:5Kt\ 3znrސt̓p\ FI қ@Ym7 ՉrTBY<72v pF,J>08p @# - ReӒIKQ U&3=!mi O %RZ1X\'YDW&S8^7G0QuR*)[RVk+XЃfC )6L3blb߈uf;3:vu1FC[sx :{0 >đɼyP+gw dhJ V3SqcL]N?1"G_7N232\n#2ܕQ!hЕDt_L+\T[s.2GNyO'hs=懍 o>3O}wg>!$Na' }C("(|T1faB6Ew@Rȧ4X.et  7XD# z^0^z+%K?yNy yQYaٌ/hڏ`T9:_Ŋ . -]M.A! Kb8, uBTC \mNP8Ёn '%zi~H%.;D4x s Bz>Kՙ/z?^B0$= c,xk6M;2q0A#h$l|c0[B g֡OQ=Qt +0`m;%򀃭! @E6A6D,&[6h@ 8+{S* rb1OhY6_=& y(˟>}3Q>4J+8XA=biR0= -{s`0FfMDJ(xn+M, w Z}ib= E-~Z1b95B< `ưKnqњXnKq!-IFFvƥ+R 5g"va :i/ ,6&M\aXrAjkqrDΪVB(ڰƠ~ -*FH -T 39BHlt,9F0hW -̩n~P2cpBZTH>,>lR[}qiw9|+Z7^\iTv -=ώ="A O'ϡ@T+mz+(90 Mh _iD?E%PE57؉q7@tm}IQA=c\xzǣ*7=>M3T0:@bY:')8bcÀE)d`N~IƊj,PGbJP 9$K0!;.tAAx -g5% g^~QtT3:+ #; epgB\=,|ub!˼ȼ߅ D,i.2 '%ۂԇ#| ݫEH8 ()}oY7!AՃ 0 @E.9~zd=#\Ou31_ F.<,'+4n˓ZzOSX - g<9BdaaK! Oi?ɛ >XنTh/oE>Z=↘?j_ *[}% -ӂbhE5E -;X S ث AE ?)@(vkfbPv, 憰`ִCw HQ vGr'9fg9NY!{O=>{6TGC3LW'SMFlcxfX |@|ʗ]8  F -u!lXo'|{ d+@c`R]g؈? r!cPp/7˄-ć` \ -o%_Eԧ rb^'1 2s8i%؞HO YX1ƞ/rҞQyϷUc?v{r_ԔQa.\k_Ds?PzL/6FA&'_笣:y]:`r?H m.+kΛB_"8|xA!,ܦ5kƼ %3" @ 0e6@h2I1)I( A`a+=C(eɊ<:%aq00 j xͲx%e&,+- -qHK8WP~5ӛr^RD?(blhey 5Pp=icledyQF: !tIy;XO,F Qtg$̒lab=D8^FxJ=%6@)PAL]H:$sdobphܛo`?=CĖ 3{#FRs,n5)C/$+jWC'xN':o.ATiB pиx'C#-bC-M2>O)>ȟ<zwBBeopNHy32l*yXBo13 #7=3?cmBLYp:Q)MȠa/e C(8v 딴t䇃 Flp9EdT&IͨHJ9'4"8VYo_!Z>HtXD2D 8r{J -HyM5bH4\CfQCp(Uy%CdY@@35"]TYNQ9C a6"*m~4 Hw$y od.D@2;B0M~P!PC ԩUPH;_nio#s.eQT膡ӗX]96Cx Y5RK8G՝1JC\ - ! "_17#ahHN<O j)`!@-8Lzf8o |d*8WiHIAɔ X,a'PTf:C:^Y?ϭUԇq-Ci (nC/aM黆C3b8"}7vo'hGhgG#1n\JDx3ϰuu>]хx29VaK?H4?<0 . nצ@q@Cvs(9'a"h(*T0U[I#5R%8oQL5E D' -r1;ϽG|(*2Jj(_Ł݁(Rw2C6ܓ#R;)zs& tc+es)#[~77/Cq<\D* ;Gb JyJ:|s'@`t> $!' D)a ! -[l6Sk710&(>w|τf@%)/7BуۀDw-ySae# C'D1T*gRWa>Atf ?L"HZ5!Ӓ3$lH)69rH`Đ$CWxp -r)㇚aA\̎h aF,p -bQE `2D%+ZNl-33(aiB"}G(I -ЀH.4ƾBB#G8[P`g; `n8]hIJ0o<Meq#b!0dY>>| -+FX. gYμ+ cD?:m -TC[Kn G1ȗq)\1O -|iǯ"y?bΟDnsA8# zi^$;m:K/A0 _q_NKxDh^7n[x> v ng*,:$I4'Ty3.BYsuB$>7WJ" y80` ؘG` `0VX8+g, -z?IE7n0*[Okk 49Pta|)2f*!!"*Foxi6o Up1"\c ꁉb؄.H!-=PdKnz )dd}YhtPB$9+t<nnfbx(fWH -aLr̽TE RI~c(0Ӕ"p4,a{ (K&epn2aHByF8"{D4 Ϡ/U J@jF2(O!_}'|oy^Do1IB߸{8(Ġ闄qBl#)WE! h>A0A%ҍ"EaH rO:0DڹъQ]LdY n8*u ( k Ĭ/Xs-:AFzpWCz)jv046WaJg˥@Afػ,a J.W xK^6q -G2/~K<  @:ϟES`Q #'l.t+U @!; דRq|`!O X>S#eR+uxHL}'DH1"'D(PAv) )(^:p|9x !'BQ7x>$]=FQA00QIr2EI"_ Re0JG,6Rֿ=Xx0Z(wb_U3ƐwDQW 3nPrLu!jC>\@u?0W&Cf҇GG_ zM`ޣF<$"/I齠 `$fWR58{P@/+Umbez3EjjbBOfii)ߤAn޻-% NJ| 揑#}x;b[r{#`Cbkx h'J.BX'Pb<@ck@r ּN1 17l# -:zW P&P%BXey}|rw9ȪQ 6|4=AB֎&P/G}[}JAO `L/⋈%dx~B>..G%Y!>mx`]74.$F>o|̣JԎ3gϟ?>h5j?|a>H,B t@-EqK9fwcCVѨW!1!d0;G{J_?9XSHB,o8W |wT?% 6#,OĵdY _1Ze/יP^.(9GDj((1ϼ{}rF+8@]rrVՊg!6W89K؉T u/,cnWxQPC 8zqܾ$YگtO1) YP,߂u-C*zCgv3@ƢGE#BN53ӊhɃ V!R.ۂ.GG>>{M߃}3}3}3}͉oDHz2leE%@Ap9 @GT2܎b^(wA\Y^Se5H|yZ+TвԏxѴ&1.G`5r4R{#BYc;O H:}&Kiy ;eV7RMa 4$QQ7\\BG1J -p8["~SƷ(8,]wnfou17H" X? p5 88^q+LW䬇-ϊns{O{{{xggg`%~ӍU.t$ #x:ra{"UW\ʹ0 #w[:|_? 6!Ff+@\T.  -Q2(/E#s8ahD"Gf%.*tRf. -Ɍdr2},3ÜGX ̵jp&RlƫO4+ -G--QZ/בpxˈ3 ZbY}};`y >>>0{3RgrrO=5o0Uq?0 􃽝M:I -0q7O=wx-ڟA9/;'_A.Pq?r'`":>1O/耮FO8p_+|SWp %`"|ɾ13S%Ô~f@E9gccф>GWEx3FT/$,&ځ7AN: Eeߎ`[d ve ;0}8A=pKXg>}#}H0(QsHCSĩoNݙ%,H"(G Ed\ta4I!Bd>>3I=Lɂ9] 6}LxAf+b#*ž yaw*` +8c.8s7oF%  f`EmFx B `Li0|l -CwŦ ~x00$>,(g/m] b@bʯiMF17GF 'qTX/ 0iC -aaG3чs L W_A#UPL&g/oR:ՠ$e}CL*M0RRt\t%`G AK_< 5Ct@#F:` -~;%8wVZ 3/!_ JT% `/}p>ۛds!^0OODxx%9>V%=!a>(SN=FsiS7_W!2*|q>?VyAy `vqux -Q,@&C6##Fc&P &p|2S@/2sӤS~b<1dz5A0o6J\\k)ӌr^#-@ x)8T0S|O ~FWXxF}O,D ѻܧݧ&qZ&\C3-ɱ%|ͥ# HDU]'䍂x-+#*IF`'>C0:e0C?dXEY_ܪ_ e0^&2~0; C1R4g 3ߒwAc&7EmCx@76ԿB] !PfV`.L;C@x/aiJN$)# m9<;863>)P#̠m5.qW8P2MVmHGHCy}aS>ARM( T=`tH<&Nr#1 }Q -ϖ/gpK020;mj(Ya"fX tvot~LQ8+ 'Ujve;A]CA@gyqT{O=hm, DŽ `rpz4@հQOD=8lWp$O |> A`XR:%#HDоq&xMj111< -i\`J&aRwC)fs<:j^ zS&tSo+J^2مm$378y`1vDvxO~4H;u )Q{JĝS ~X:qr@{N2N5 9"S<b-Y x hh.F`,gJ12v,2D+]eռ00PaX*+&s_ +X*bKQ|7`xKpN[{"@)ib7(`?-kc 1HHWA`R(t 5 8Ϛ}kCٙvM"9~P}ӟx1]I@/.@Q>XI` #P`˘ DBxX/8 ]S=O|q}_T/\6ŸQW2 F]L{3[U{lƋB20Hs0BP& eC͌; -V&PVp>DC C*:*yT`DS*|TH@w dBJ~C ΉR?1bl:}C#" o(V9~hLBHh$GȋV4Y8 8-kX b8?_r r ro i2d"BP.   3xJ@gswS㛿O+Hu+*+tX?XH@ {P9h2o @ cSy(xFB쬻ʁ h븵1={4e쇯Xe.,4x@@ -h` .L \W;jPRS=@, W: A@aAS"a5a@aNo~s._'HN֕C*q>HnwFdC!qHt4 \0􁖞:`^|)ʲ::T]laB3h`"'l! ^09jp(K -)}07a׍r%e,'F'0сe P{r wUiAc1'V_#>b‘~z\` .Mp=2U؀yHU&0Od!>>>>>޽u\uHw;:;KDuJ} z|f!`HHL ԣ>~ɣذEBPJT^<¾.7&>7A2n=L|IU&:{xuQ/J%ax` VE*E= Q[S5қa D~S!َQ%Z,)^a%$R,>PιJ~WAL*>34,p0O>ex 1(j0 ڒH@c]Y g!\ -#Q7 aI]0;;Gj)^P7m$OXhB+1>! $Tz5W&%^p|U0`* 4r; .S+ 2،\<5 ,*l1p. C`2J O' F))ϋ2g|o3oOO?>?|_d(ߌAB"j€(@Ktk嵞-`Hb[¥(=~"!Kb!9+aP ȁqh? (*139T֌Yh ϗ3Y*wz!ҨkDI̘!NAgxγrn$ܼE3vo s#*Ǟ.<]! -Gg >4V4RedrpY A#H$pw[@ՂcJT~1BƘ\:,*Do})xYҼg@XP^x8'h( 6XGMa9q 6V܇h512Gf2eA1#tyCXm(E҅Ke`y`9;@{@uS p Tq8%1G $HL|\<(D'Oo>}ȀkMܷKy-ԷKu L8@--n"e .YM/j}+(zO mQyCl`YtB}2dfDe0sBF&0C/MP!t(4C4 %#tcfXB  pÌ? q6=U 6,,ÏJGMt"Q6x(cSDRF -*Ue9Tea#0ԙTxxsw( - -hqsF5tWc3Iw)ꃛ֮ \kz(xGAS!-`űԳ>_ c R̊:PyqExI3;$oPϲ5["2'eeοUV=awcs8`s1"Ɂ7_eB)z<'@Q i !F Pڴ& zH%4QOL7PTs7~K1$&O3>LeZ Cu|p_0j[Xb̌16Xo -J߶$zBʡdO D|դ -uo[hAױL+Yzt\H50˚g0FPq~A (θe~tr`7f4O&60}(˾Pai (W)Qf R9Pߗ0lCiH7rh)B(f*# 6v:e,+1Hٓ^`Sh\ W9]`5TBQFѲYB˂NPh~ Pj|ET 5|j|A5JG%uRA" D'V[r^EB@w| F[- 2W\* d ~]5!F 2G\+]= F\M>0Ό| -jHR$YdL -9%1`7 qzH\ٕP=cJ'yQ-/~zs(ax5fIuy&O%α(cC!:{,xkِkJ PWa1 2 '{JB\GAaʮNg;!V"Cno]a88d5J%骅͛GDeG CPeO>>> -v7iAvPAtB"! tgO?|Zyky>E7\lߐ3O ni*9@H|$6` 3ToI񀋮z+3 0p n^9W2zƴT|Rl~[Kv4a!݁Jy彧#ݘ/Jʹv9^-!؂^x k ->p9A*Jd[F'n0\1B {` CSS0b(IT - e:C8H) z ^` (mOOOOʪTԣ}K tF6GQxh?^920Վ%CUZUꝔ`k`/ZAC) -&:46] {;GB?ajK8`PQ|>#yi"*[@ ں䔬 $sG_]aW{Me>(gAMЋ{*L`2 %MxS?f@$اx ?@rF=!?>%J_ֲ(w.Pߊ }xxv0Z#MGenX,@M3J}Ua-D@1C 88xHvӐfjBcG>U'jŠg }FQzeS ) 4T?hof -la -_~K ׋잙8D!fΪKHB}&}F}, jB9`D 3O''@.&U֑ 8u@pVQ? I`nYc >TН D\{G"@&\J>#] Vݏ6U\fZKNA-u&ҽнGL4i\NQ-f krG0ECS ?ꡂҴ/H4E2 c^PF DَBv蒲gA8?Di(73"hC'F!C5m(؆+PĆ+ -*Lؗ- N4֟3GZn^Eo3{ʀKP` 94䊐kYOv*~!h9[?ԄܛA%FA[mE8HphaXT{ȎRۼl^X]ܒA*@\#Kf10(A}>`sՓBD_C7)eހ܈-3a?3ۀ!+ Xr -yq+Ԁw@0n:rCK]0L2 hdu'e72)^R}m5+q:X^Sh6̲,GR׀(d/ ,;K -{| ;p*#d̦; Pj9Hy, N4CVx,59 *ŨDX50SD" H1 Vj{3 q!SM m7;BB4`dmRlFR!(x {bk y4TV> {%QPnϼT$>x-UhPD jܓ `<ՕrQU>#0Djtx}}Wh [}6퀽%Hϟ8a2 Ta_LxD-[8i(÷+[ɛFWW׬{RYn$0J¦'a j e A ?Oy}IC@!y+/`? Rću+c -/Ź7 sbe&@.%Ұë=<U  -$gƵP`e\0p<>B{D&h ?r;"'it x%a)A2 --w|f6xaX| 0{~>xrEC>0O=oT*e gVV -' \x*>bi"ibAGǘxh8K($ǥang&%q>`}vU>bȠS] ,:Q /^\C*P@R3/ܑC/ܜwB & ДHRLl-R`_V -%!85EڄA.@"ZuH -̰dGU8w(^E(PR0M8z5%5\-Ȥπ}sQM|W+M#ΰpFf#iQ^1IN\<^hTMF$G 7+V0iHF!#p nFs#VinGTBdI+@^X&}2L)Vr -.ޣtQBXyc(rEҦUG#٬?&\ (z^[Fq -JjǁN9t@E\Xj(b dvDtY,\( @H@݈%<ܣ'r8D|̸#XK "yhI,I cn^]nPM8H#o?`}ݟi}p}irEzJEbgZX- {30{+9 _7BEWA,AhÉ:rh-T(;ƕς :1uZ"~­obEC``AJCP\t~OMHruxE;aO\ O% - 5|)gCGrKU9ܩ>_!kBe)->)OCKp3M@9:@ 68V5ϰOE@ĕ<-W,/Rg!B-1$h0D5TL%[t/H9f~F9}d%QkSfmHA(@KA:K"|# zaEQ.06Gt71ZM%jRaZGJUGA9y+ 1g׍_/lf nmiVRDmO: P\?nwCӗ0;L!qv4d qgxT+Ԅ*{AFG%E54޵0ϡ80s#Q5D d# H<"xd edˆzŀF5D@ ji6St!3q:JAf:@jr -^VZuAX )K,JRӮ'Ct[Ӥ||i)2rn@D8~!b(CF C %p@gt -1Av.*t8rcY]9P;-Dueӛ7>"|6>>9/h0! pouT<6Q-M%ա$.Xgg/bx[ΰb9)c)ۛ Ar]cO{M\}'CiK2?bzO߇2^`C - )B"r?;V;0&M> 200LC#|!> (  - -B7gsH\ t4p4m!!s㖀{JC0j{ ?՞-,I:& BRt]R0Qb_! %c&PR{PpMB~J:Q%518/Y&谛-z@4a{/agF \%eHoT#ho)'J`L7 #,7$" v&p YfpϙPpʷW*W0‡G"A5C=.2$E6 3B)Da3@Tejʫ6Ѫ^5q|NNFs#lCL -;[xL"ΰl#ߘ *g : ^SUF C8z$aY'G@a5$ a0\91%mgMwzKff9 oRΓ=O}>wkj SA` lV,PQ@Dw߸Dp j:Ee˥?+ - \-^9a q^W0lx݄xL`q#p Dv#mxM 9>79GdO>o,OХ`׌^nP;1\DD\sDȚfpτӴh2\EV5EF|dUhF5Hx$旋/'>Dȯ3 _1.h8zټEF/*5Ck>>lL_͘_C&4ydDG k!/| :OkƵ7nmͣ b[/|s2#7dƄhu4h^'6*lR|B`(q`&PVZuD` ,>-N;-`IL:,A#NʡR -kN2;C(QvFjV#I -xUu適>( @Q$tK/9FC ΈV]P3oU-ķR8N("@FN>Fܛua3ɲ-N|:Y-+zxO}.w±`}3U5E o,^060p2JF>ְtOU8HV%]&`[ӭ'ӽ>(v@lh%. %A=HA0P35wC,pQE2 -FU Hg]@%D`MJ*ԑ+R!(ڀ_^D@dK;s0qbx~ CpBIaD |c0c8:&x F0邊=( X;`n}Xu1w@̓7 DdpMX 4Нv3w!xt@HH@I%^WOP<#h%YdlO %Vguy.wfXߡг @eSJ LPGH_hIlF#HG,lF6&FH(SYv @IE%ʅ8(sRŢBKW›4V^ҩUBij]!7T l_6w9Lc"`Q6kQfN~px>`v"}G|&M *WH ˪@EK\]8r;a0S,ý~~c+1rB"=^ - -zFd>_+J9F2``B[I/{V8Rlγr63‚!RU}`"27[t~2WaX>H{lHIWI{@4?XpFwIx.p^'"-Pws #u:EA$u;V$,Z0'q+S]N?1K|j0ts{F~S=]-; CI)!.RbzE ZxmB8&iDD_+'󣀆`M b U9ò]f 1$89E2nΕU*ʣebQUVn'vrĽ3kq$P Ue&C4J l0V⢋P@T\M9#LtQ}C}@7*D>[>({OOOOd6q-1CHA|`Xuh3\g XiH7Q\6?iuB -o] *@CΘ(j^/JxbP@;nuk+87%gd; Ys29ƳV}nuPdAt:PKH9 G` AQO7rYNF`+ ʟD)E]W8$B(Q\N#? Xh{7ri4}p$= A&K{H0 ntAz@cAGn"iIvg^] ~l>0(ɋ! TNK F4%>D@^ $9Pw8iOA# }N (=%9JTNR L%_ c a$YuxkKs8`[?4q6CnCjaM iC*h4;Mߐ|huC@sϋއǶ) -f:LPGq]W9%2^6E!NE`x"n4;݇s;x€auOϫϩ@} v<2 A*m^cE)$돇i :3p8=\{@ajK -x>y`;$T p?Boi r$6*/B܂:!n=`[W# Ly(ϬWqt-aL P BX+;uGAyhNTC;E*Ux@`plx* -# XCzqi ݄=x ʪ0Y|OHe 4!07>Ahn(&O_ cf:H|A8k*nj_h;`8(#7(5!:Hw ՂB0pD| X`ʕht1uE@(˟ґ~q/rT.y\2Sn?Mh |@j!6P<8 -p9Mn) ` `y*.EMBYP1=`mQj9?xYY -$b*u*YHNCz_B<P{ p0JC\ Pq"h%:p\MiA4 't;lR0Df`JR˿p< ` e 8# D0#wOH!(P80cU_|a>tb/20mB.VXWS2\Np$" -XW7LODH<.eBmEn{<#MULebW]~8IIJI^~)zǶ0=Ji_HtF!8Us{A_%{,hZ -9>^>-؇x%Oz P*rXDPuNR JmTC!"蕡HRCeD܈# -Ru -/\ $nUfd8~v?B~%8FȨ@pn3TSe1{d l #>DX -Sp^u”*5%`Ñ/8k˖8s噖]Q.,u(VggҠ(t:o3 }}lIa3*O ή71AKai@K)Gb,9FHge2ꄜr[C:>R0NСTrܞF*+1eaFZ@_9GwR_Ġΰu?m)U!N@QO|t^\ Y-]Ph!Oxza%Ǹс ٢ A3 0]rW!G|{!u?W5~N.ګ| *JU6f "On I "gs5Sed *r=x>^,(4&д@P?q! \xHRaO({"ӣ-rҷ\+ %&}['h<''\Mʩ)c0T2Pp%I^Rl܃f H/@R \ucmX.@(iOZDž#d%r%9gl5-fO%:XL_]8pu`6~"l y&Z|LF8%3'%4A o¼ =ȚO7?~8:~7fPYŸh1N͘XgM'G|π`zXYT;'}LĻLK q@Z4ژYZ O缻. PI  -Ae2(g f3yReJ% {ԄyQ#dI(l\: Qʟf}}0+T 5p0>!1~t̓(^U0mI=SEL%o):fH|>y[4A-aH\>y2Uddb3 (# Ef^ p9Tm8;PX*e% #2""!IQ0@V+O^Qֆ"j߳69`C@@ ha%C /-g(& ZЏ5vѳ{+}^.V.d=([GT8,:C!^G1j'!%w ]즪#BebRW *g3扑G yAF~yp.p; -e -&Ͳ__}\a٢C SP?pu< cTG(@{ϔ:8/ čÓb7m -X@PYxO>Y\Or*T(MCW^}EPI Qy-R !.ӊ~ -7_j}^𦫩ِ0a6M3T4tFR01@ -?>yˇ]meGZEȦ#: -߲Wy0[=jҀs  2pKGJ( @rPU*o1ww zE  -;b .5yXs\- E*2q@hDs7haP] bj{# w. *i5V>@SPED^ˤф 08i-N#@/^QӂOPrD:zmQ! i tϕD5?Cu3UT)H, A Nꏜ;/)I`[r `x<_9T9)@u'9n o,xƄrV؂xJ9@?b3"|a>O(On=' ,]5! -J(m+N-(BTpC^Н[Q -I]b{/Խd,Wp:X?Ay@ 7_Am ևWŤzy-lBGɪ+Tf L&uq,n&TI?nPª&E< n0>ID`5X/0k0IW|ɯڌ"Sz~i FՉu?@"d 0TU!>\.0I6@~wY4?6\)E H\pEu_- @2T*!i_ DB pkOߌ%kو8O!}R7M,g&<#(oCl$.c X0&I 2,{C3 yƀDK XB--28FCK(l A80F!r --.YC -67A5P 2W"ePz˒2?ALRB;H%="YV^H*":u(P<|:LaCM h)su3 sDw+u50gZ(UrzJaROE)!_ΓK>4SBW @wL^i|(&2FP"b_,B`>3JuyEJKP \ :A,Hs -n ʆԄjF[Q -<GIBًf j A$myr0r_( \9E`0g*$O=7,1QOȟHKOQ@?'^QY gf%[̷.> _/.e*+"t엍"L3O5 ڤ>`RTmZeVpD r!%*ai7j3c*%r m;̀0H%+B4Sc$TOLެ+Xn],9<%61sq#䒠/ 9k(аcӮt 8-jnBQFC6=&(zCRX"% (DZj`t`{;A"o" + \&j\!TPa$-@Pl`o -~@ (3|R&5B -ނm;2Z N$z_QPgf3(֓0P:\(CTG1YQר\fLI  )`g6 ru7@ -_2⁈ -"0Ԇ(^)QXwI -Y8|ު L DCu0 i HFq`Q=c<"O#-?2Ԉ,8BEym --*gT-hsӨ I4W S= XS,^ -}p*+Z_0\{R0+8&Zt+ 2"^c/D.n#*9Ch]wlyIQh`܂ biɂ3"2+%0P'"Өg7|A{WHy -.JD$7kIF^ɈA`״Qؤ15xΏ YؕV$JS0gpZHXp{%4SdIXXKhVd=ZDu"ڪhI _ Ca>RAj7Y.!y٠'!_ -%.H@fl;êeRaԊ w%P\yiC^  B Qeg = Be*Wb$sXG)XzhQPJ&CBE•t(ڢdJmO8wH Nŕ -4 `ԑQY.F!O/ Lv9˸_Aģ/[rW ?U"dJKe bc L2y7 x6H7 -kϥ]EK>|A>($ 2?P&9~+c*?p[X7Izahfgf[d/z1QG_+J|BxѶ_DYâVrm[υLXxP@j0`d1rCPꚕa#M6`L.2⩨' ~D&}`] \YRHuC(\&Ļe0pWd%t(a m!<r`p=d$% PfP(O/x w7xx{ax\C+qز -!*8Y;xeZ0F=cp37Ny@x -]ʙU\ "l$C_U!3 c.*p+K$;@m%iC 7b CdC~+P膢plҹnөxhp2s-*be{S* ae2\Li#ӂ}_+t|wƴH $6:xBY'"-Vn2PkYnW4c5_p &Ii`K 鏚_Y1SlAߢ^P% D(Q5],p  h¬hg)*]E8EXSj oC،wxԴO,lpI MlTwyS֬U@CQ 0oLUNW5@}/Shpan.Ƙ%1p q\Lsѵ@wy@ IX6|LmaFȌƪ~=g۰f>> QwT `y5k:gCԏ+J|"^\>^ރ&@ԑ2EF4* o-0tDNE<289H4ӁJpq;Cp)N CB39xP&".^T.<)P&r8FR ` ؠpFl't8庪! s`Ix=#*Pj?I/>TUOKOxlWÁwzK8Z>0K0}o? mB Ue[>nZC![PuBMfiުj9`D9ol&p@{45ăQXFBW` `ҿ|>H>Ѕ K%CMdj !O셩0 !YHWLF+e;g ArT 1## -b -0o`=4;60fP&( j+C%%x  TT_f]䠁isdK'Sp%]%81"(#!U*n#&d2@D@s#JN?cـ@tbFb0fo @PXER9,=Lw\KAg -N2 >W.- DnM& ` ZXb0< -Jҽ pqiƸ>k&',io yhiᛒ: 7>|av U8Zy +ɦy|bjaMA7s[GW6b$盤"ӫ+dpCx\~?=`mT oH >H1 EQpIAC>>:M-,%ܰc({~(ɀO,ʂaWM{  -;ipa+Px -}&L`0 -1 B EJ454#. c7 L@_PpSRf^oxѨǂ*o bGj,ѬNDjx!X&#d=l1>ȅf G#CgÙ{}N._*;*(ю@(7G&F@@03xH.vǢB0?Va#zGQ< ѿsE[⁑`(䐶`΀R2MMF9Mڝ \eYljK$epEC(ˤSxP !hN"rh[ݽ=fڲG9/`[u0EXS<1VHz# ؅q2Ґ"u4!:$9]k*ʡPUQ [Xm3@#<AQT6,QS,)P "(:'HSXa'cVTB$ỖA!wAΐ`ݩSefw.p0.axArKh&@.5MQ WR> S&$79[>%'R@7zCJLA&= hh(&V /G@D2BJDW|Ƚn]YU薤bFg'|>)^TtAD}ntApgD&p`0##ƫ*'84p+޷bm9!ZYh5‰X:&!ڜW'E 4 PELp;^uDްAx-G(LH6 %SospleY˜dMAY¸<, d~$&CP>F,=p "^3\GU .#8L -(P yܦ>uqebtO6 `[fQFMvW Dg'*%)P3>81K0%avNE*c!I@'(SϨ7|>8uZX/0z@ L]!R@2v-] >@}@ !جW%sEIWJO  ]Yt|x?ĕ*lhGIXh.rhyR:3%Á( -KN` ް8hg -u{|a|<7`~A,@ifusM(f lr`qb&Lh>V*EX}&Xʆ rW^1p+ Op҅!f!_{՚pGhB6JUoPOCP[/]ajTyEu(:M+T,(Ѓ7'ҚN1?IJ{gUaP'zTe>leH\8Rb+hM$=>,KAEcB`樁M |Rצ Ô *}*}BM𰖴!C$(X`6!TBC ؟ ^-B xh81H4C 2+'|ĉ~@Ai5LQ^/hxT?Z~/h0V[ӫyyLleSƴ=(T.  E7cX8#l¨tnCff,_rls6COt&!g=p[#MKw= oo'l'Fn|Jd yUkg4 +\2U䠺Jo((RrR, ;2myC{H@M2xqVqx#M/=rH?r*'<{:&5Mqb-%NL:?yz|-ܾw5fHe=3"pi}hAcBc[1ʡC8W/GƖDH'@`AQHk:76YbZSg - -HLԓG˂)T -(&Q YM!-֌!bVM11"P,@..f%w5urf8LPQH|^pbZ e=?(E u qW@ Z$ ؤ JSu#KHaB!3~e>=ςf\-G=1#}X%&#ȃiH`\s5> ro!g;|$JIT×3!M ''(VnJ,O)F J\UH o3CfMhH-`}UXa4 -S#Gf pN,XCvEMYA:X"Xh L ԖbN,"46t)OiSRJ]a0"00!%H%/()ʖ*5&.dOGQ.H4W*U1ZAu XQ:([Y"x'Rh:yg&i 5%% 0reS'>_mz@}*mLSτD4廔M"|PdfHI[i 3)x!IZ!JƚCѦ%,MRCxAF.gO¯@;CF ID" ^ߩe(,KЈ Ic+Z([7x vH0l's 8wu6s3O#>>>4ːN/ˢ Ynk0~ Hm09%ߗۢs"$=(4F4ZjvF4@2tc(qp̜e *^ -Ƣa.[KfA`(":I4<0#!Zܨt3#iF).Ax8m /^ͩ`G;`U,+ WĜ<$ 0dDLADgxA. t%K{L2=EW<ШѥW 5>5[$!S 6Q  -U k޻4j+XTOP`XT!{0BZhuBPyo< @6‚CE!!衂0'ܽ"ٖ'>(o(7iYT*",y jΙ)zhU"uMMhEULs'>hT9`RSFWIAݟ#: C"`" -.N&˂>TοKo=0WCt`(I5Y%~Kwi'C0~rB d{ )~ 1\bp"WI@fQY"lP]"dQkW )jb&i 0hX+7SO >m=J+1 U#C;]e$OINW`Ŕl'brX([Ĵsה!E;x->X[?"X8ąt3yiM-~ T@bY5)t ^< jW(ؒACr`hv8rHDb>*vAI1_aw UO| -&DFpHx%8^'灄B Ac>`509"ua2>Դ/bduP a:2oL{tܱSS"|i`Blߜ ph@5 -t RR%Q$`?hA.ʔ p { e>~҆ El%ࡌ D|~WZ/2,miSX0dp<"4a(iG@Kl{J@[xUկ7<5X ̨HhF)D3uO3)rnF9qɃ>Qg.# --mFVmiZEGF -= D0?'m|P-OSQhP0W -U)5`B9 !@$ zmtiBGPw%% MW r?ry@ JIJ40Lka\)A?)B#)H/(K6H\>ԢT(3 0I0\m?gL~КוֺOh ,*E!v5;Ž&/3_Z7yG^0amn6*fcS̴8`΅ -"51|2=':AѾCs)ؕn}!Xul{I2 #3T.Po0r #@6$ yF5Z tH 2nde[)䛏 <7w@2f -<-f1QԱ  [Cܝ 5ʁz##HɅN - l~z"Y;8}JR.ɧJ&g-4p0"sB+2>`"ETBې(fO5`> -^ȉJ==6%-1}Q,t8FMH4z}H`lcAO"F`fMHVxs1jy#H-3:&?S.: i}. *fgIS6kv_2㖄5\"6'P6%Ov#3Qenagk~ #C 5 . W}G(0=}BRL5CiMg V'eFz[24{Óσ6z?L $$AChtpP`TwC+A^g p%4΄$;!VWUPؔoɄQ B8.X2ͩYLw0\RY -VnqBܲR)d#Xv ܝgB)^yٮ" -p CժE{XyMCr] $\hz߅ ?- J3=~U+x)]m{(% B 86a]72at`yDP6\yrJqK1&b{5X -"e4@jKƉiN }B4p5ڼ*|-YfY`;b%jȫdpU+ Ā+#5eК2naff"у\նiS@heOJ>ӺsU8"q F!tz}-.[@s@KlXuVZTpe LXZ#Ԅ@LvG qg1yg8Wi -$GY8ftDNmo!$z1CaR,Wx TPhjxxӰ?5PM `C,<~\HY RVACPC#xP) OX%Fcx6iKJ`IlHVV WingCP %HGR#31-P$R lnPOqT73 7h &A,nC?f`Aevȿ%w۰C_Ik Daқ'8 m#Q4SG QHC 8Hdq3􉌮ԃ17r Mp#F .9[X|ޑ.[`[{RZxit^=` -~3:]T"+~^@+UCl |("|(>?кXiD3 -_/-Κ:!np0 rV"c 5?Q-#gS`Dc+Tqa}S9HLpaE!vULjj<^׮V['J#(k;\0W6CPAASPԈ!4v8kTM@OA+<V:8#AZ(54G?DsDD,XJrh\& ႽaLCQbCM838d @ 2$@LRh@yEI^ך0 - -y$ҕ|ZTgהv̳i<6vTõ#,4Ń8/G99Mix <|p?s1 @R]<"ZݿL_h83Ѹ|9#hV:ݘ -Hl'pP<I!hJ&%齣 -OT†Hz P#nGAO" A<;|PAxx ֣&vgxBt0tr `.Zfm -ÏT\d(hAotX"Q -`m`vQ|="4-4^gM8(-2zP+Tթw A@(JFQ5ߔ!֭ 299"LM\S,0Iv,O"7L\6U -)bl3AaY`x% uD(F%*Qͅ@( -/P򗄗:>>-!(fP0 re(@1TA%qT=AS'%DA8w2P=i*+Cq:_dAz B @mNۡ9Dbm -1T֠L7q+;-T¸aU:W=rsoQ0ߋ; ;q&CMq XaQE`h\ۦ%VvI| -yP Wzug)m@@Qˉ`4TmA8D4B - Z20l - ]:AEcZtCaܡ tWFஸn%0 )U+[J_ x>ރ3@6h](A::2SBxsh(XgfE,K'ډc -zJM ah 6 -D;/ugTrr<;13$;(dZI$!a oHD˘rSSϧy2<#2p,Z P .aV39u l hE+pmcQ1.j$3@(Y$olA G\>1^"ʫuqDTu'giqwaûRN@({\l@8YKHB^As -nXR`5h؄1'ABgy`;CꅙFLIB-`#aFYm^ - rd?1Li - -נpA JD -:zB?0ԿhE=6xɀjZ E&Xz0 - 0uK $P|#eLGC -X$u H`l1$ Ѷy8B`" - I\_T2=FcX8)+ʐWFBp -a6F `_QiRʔ)A1nD!DWl U|'%p UA{طÞ@D1@H\3z)@$cI}rpV[J"fn510 ŋ,|ߌ)RA̅B@f|YIg1M=Ob&9؃=A_ys$Bs0hPs{?cRt̩^ --{MO7 5τ3),ljz :O1C̃.\1Ps/8ï P!Alg@mb>ZFU|Tq=DF萎6 wpp;r~/ ĥ HY$7+uQIx\@i ~@׎2"4(b:,器uߗTIEnum6aZ!2X6Q.'BL -L[LL$(] +Tρn1kpf }X/hu?P`Зр`ab& -8(rCtaM ]%E{JC/L50 -Gk7 O8وGxiX&tk_H NHLMe78܌Q=+H}U(:eWS ZDN"=(d%F BL xIϴO_4D( -Si Si"ȼ!=@AKTNpa)IxwcQaGUtxWF\`(ZY{d pz.7G & DQ,*3MZ2ns^'t -]HNHk*`~-ؤP" -( t @ I٧4bd.VFaj -Q'ڈtT2#݂*2xT/h+}> -̗0lψX=J5 -C -*_6 l=t %+H.O~̿sF ~w#)WJiBȿXilcgޕş8E$Zna@0l0QrPw=h}MEN -  (d%uw.oɱEC=9/xG{ {raeg-%"|f7M@'OX.ri & 0Rތ*[yK%I^|)Q㗐pg=P@! 2 -D@^,`5@?QYvTijȆDŽhta`xaS.Y$,41S$.HZԔ"P*R$sz!`< /hv+)bMܫL[3+kpvRĬ!l BY*exiRIJB -2axQt0-`XUCŅxk~[ƁƉDTsxx_Kʀ&Pia&BKy%Uh})qG#ͬ~S /KUL"eDzsx#lPN:^-vU Ss,VB@d:@pT}a*fflR>O5I ,.DYTBq f qds5KjB/T/!ޮ1GU*`G) o>_zN0%%AɃ;(Unc\C9@lBolC|B ʂU(w}oP7*ސ tE\M(g ,ʀO=7q -A p` 5%lM(G ts7zpoڍCΙ`,5 s 3guj-O){!'@hކ2^rs;{eIYTXy1BňNhVA a w"`m5Tuhi -C岻(&(H69tV! -{۸w)h0[d+CИ0(Βo \0n/+]RY- "y{SvBnp ђ&Sj=FX82eХ \ꃔ 3>JJ7 -XBM!bS|cX.o Dו f -F(R"E,+O -]`o" i2@XT|Kc`,u7h -^|.a 9/ -Y(?Ey`΅s`Z W @[ 0N8kB 316@j`bo.W. -nPe0` - -u5xܙR84ЊZP@OJWDEՙSQT= I"T*1Be_%yV܈P%eCˬʐReMr(GP.hP§8q@SVgc.T~Y!eXm.7)eHeND{.Ot>܏˔ -;?AWGG:YP[BD/80Z"Q Zh(mhtvWԃD -2˥ib8\ h"@OjzpATIR`(Ek,Vt8C -3`DcAZ"kIQQ\CDt8`Aΰ%oͿ|1>JJ\}nXx%"C)H3P3i - g*CKך^0H2Z([dJB )Y* -(oZ-(N(/wS7;*,G%=ńnDt0x/~HТ(W`%c πuPBcs 醅ڐA1*V6[JE^It{r&"3,~A~x -t@Gf^F^u%>a8+5E8J|?I44j0R- z̹ؠYeot " H1>'|g!j2E| -=VXi= ->=AB?g2VDn T3i$/A^=#Q:c|N0]& 0p<#@dŽxy4Ź~7"fN[:g("ٴ[`ʺ{8 8NоmE#@e_QX_]2l+e22\胯S:(ACx(P&#QHd52莓9FhQKb\«@0rX5֯-M1J~ȷ -wB*j3K1pRxC:a;qeֱޥ{{lGqg ș?:ωC` zQfX۠hif(2^%ԣRP( x|"8{L>0LI:[J$qR#iů U>?} 40 Qђg3$ˣG A!4>)r*)`-.|CYm;WzIR$E_O  {a% "*3ߏhl@A&EP>h@se|W `,5ӄy 7m^sÙ7/`l2f@ A8HHEoHlo=̇`)^I{R'С6K`0sr8MMwhM]p''0}7ĸ \WS}|iz(\.C^ @Eʧ%sFe@P<{O=+irb}8 !|#b6Q)% - P >|bQ 3p0psӆ&́QK 7uWUBk@RH@`H9FFtlCypJ #v0vEL*8Ҽ cpD5Qה -yOl=`iPe~,=~~,b:CNZ u R\"NG38 - *e ]@,N(G!0X?\cP _ @Lpf>;ѪKH]|GQ>x }Z/Sh%R -Uҳd+ `:#h}BGw~Q E?Y=Dw~Z[w;aoto#d$ ZBHQ(!@j=s !)h0q4 -|`UGV0 ->cwuҀ'x @)S?5<#8o! !pb` Ю뼪#gvPC0`vf32C0 jM!s.pM(t#XI5="כ -Fh8ZA`P 2S x@ROl  -K@ͥǬ&j|yD`2̕j?0֒Gƴ} M[6] :V..!D90k&.aE-Ifl ;J'^ѾAv=)Lkr-ÊŚ>3dZ 4MD =qsJZt!D2EF -oP@405MÕU] d( m(Zh7dF!PMq0P/ε')DO9=Һ2)dT) D,)h?]!iH.RHy70]i#+TS8 -97}v=LȓRƼπ :P=tQf)T#1SyR4˄/|CE; r!Є4#( ~YŌOγxpj`c3I`Cū(+T{V-$G -DŽ&B2Hä5+i)5.ru%2%.hUo(*m,'x]E)>uѲ(l[xϗy:ԟIZ҇S^6}ə"W8p" /*&FՖ HӯaO\&eQXC>N9Oh19(Ԯx%1vd`&W.BI`M#5ox2q(gA_;_kX'$0 "- -51]<_y^0v_xgqֈyMz&­$Q%n - {ϔ=0 SAM7VP5 Ǵ11# G QЁjxl{;y -`0)& -HQcDQRsX 񍯈ARI>0WSX WTjH)GQCE` M` E1CP8U…C} 0@LEb=a0> -1&LLq % Ahڄi퉠Q9@",OH `5P9釼q3TeS4`c~fWLƟ}@8Fa_>l Tw10 kx.{ϐ |`U>t~~V HW0 G?"|4-HTʉ9ۚjot_dl"i)%_^űLiN uYZ+nb(;$eEgY_,@z|· 7c;zG9M=14rMC^O6e&AǹQpYB4;X7q4u#9q䮸&_5ސ+){;uO{J+J&<i6p7Ή6Rr(4PdB>[` #p/>74Dfl#iZtEN#Eʼn $>ê0 ~atf2 5?F70B}bEU =ə !`%d3^ =]hzE{ gB;8i["|P it?ӍO>/|/t$. :s2w8%7+%D7iX oϰ> 4^#[!%Rx.U`8%by Q.;[6Aft_ʆJYC!w<> :7A,&#Z_DF)x߯3ۯnaR\ifGH~s;b5a? C5. -A"sY.dzSH @+) .X, ҐSr[[usl^7˥+evGԼ*%rpNA2 _i+1()8S - F_NU RRm%x!8Xn DVA 94z!~P @1rws_0s~^ ܗfL !v{ mzF>?y]jW\o)$XH'!?em@yEA }6>OX@φgՀ$aP:X* b rBah\%6X #C.X8пzCgliFC_I A&-x[ U -"S aBO g/]ܭ)g3@#+aXM`0F(w@-><1\me]y#.fh=D5JRɂR)%ZqJt끯gv¤|ZjN5"Ƿ5ZA8{MڝO5%Z η8?b-!> s~j)tY`Ao>HSQ\$I1#Tal~U\äN|0HBUD=v(1M@~_BpϠp~ @pzV)!Z8 R[ho(=qik $lʏsq?˖ɆlKARXc2 -T2Pr`Kb4wbTӳ - <:%=ari|䋇S {AD@ڎ헩aڍ - A1ʉAE絟y rO=]d${a=m:0jX,-Cp7xD}.VD]2<lhjAžАi2>2 @(m#Yo%7 -`sYCG0j N qEF.*Cj(@`(7&Mh" -oBАA>h<P9;~E}"C!qE* I6=MWhWHA5@֐XNS?zBOO>+|ݐ,;5٘d.#Q+"Ɍ8zѝfȼA_-zsUᅄ@x;&Wh/B &&@ĕ_؀ -63Iy71k me'/Ƕ -PTs*E/}E= '\jrLQ ߗƛ@O63Ha1 (2$o"G9@?`/6'ELU?N?  ˬ0iGR{ CIDT_EΊ)vi ^;ctH'P2"{$Jl-g 6d hMZ< +M҃Gťixᙄ `c2 -Ǭ|=bw(خPfxЅ&s>Ne[ByNCZT2XYkL )1K r@2¨A^YhIHK[ԩjb,O7,W&G 5kCXN8CTC9Bdi?nVZSTmTVriCe\uϦzڡaYS^j$@A_x -(ȨhcGz#:D؉,耶(ѧ5peAZ#)GheiWCq߂#b*I/E"d+(`A J;FOшX2 \L2<UqW05Md.dz?2߬$Rsʃ〲.nFUIFpԣʪ -$ dbyeˁx&(43Pd`+p٘YL^tV1pЫ -^LPV9BO3F=s°g!ˌP ̚@6U8^aBy}hk0H2\s"_=hϥ{ϫw;<%{Pbzs'ף򌲪%烕~&Rg'j1Ȫ~I_{)Q"XTnAx{ARu!H(@6`Fb3àwu,ZR9iX#ZԸh5 -w^[JsV+8Qd Q On5AC# `D9p>k=i5Ī/odvPj -{?Iw|CBg{-Á+4T*/x'yWnBĝBn"<6Ӽ8;"`m N_:peRO}1 kxSx36U@3lg| - F^P,Fcx (~,UssI*T\ ^El6ľX*âU'LCבPf"M{H&UAp'H - 锲#{`IrRz)f;C Mz"5;D 2wtx&]}0(=e-),B -Hs-`'LĜjZb;@<Bt7w>p' WD}*v;^:*;SBկoh3z[#aM*iJA6 tTinr}dkzt:ݹB3=bzZ-Q4t g"QQxNh  acȠ]|hgB+l5bEv 2k -&B}Oޕ$a+T}LQ\Oac xPPn/Pۂ` 5+m:cP٨ -<+q) .-k" -89x!~QZ9MjE)#ۋ;~cE `AX/? F;lL"=#ï/<i!^oS;zn=t$-()eM'KTVw$ Al\(ʁjU-T t!z(!(௣A0huM#VEk4 -Ad&Zsx?l@6"=dH~N()o - zkv{n:DĚ [Xg36/:83]@e l.UKt sP1B؅YED-JTyj2D`8Tc8 7X0Δ17@Ae7j'!Љ[ c|A)ԇR 6 V6Q*<1Ø#5=L3 .[Än7gL efX\  o~%B%B(po8ʠ |Q>HgpkZCQ"T7=7 EfӀ^L>qթa3-J_H8%cW*"lQ,@B> -Cc1RfEO!Kjha4΂;$et4b - 'F`/r`Ve )B͟:#tC8T$v0L¥˩^2j4\ֆ|Anߺ Q2 0T#+.&\:B5 9T ߅@'8$ 2ĄD G<\kGI]/ HrGc p{`(2KH}~Y<(x?\VA@T.ȃ" 2EpWa pj|>(Q|qPׂ<6^GEdx8TuB>\1W+"dX߄9Kc^!guP .a<0@ "T hERN)aPV1G -naB{42CウX<ȐZUP na I13.< Z+QFg8@ 3$ZRHs:R4 1y0KOۼb=aR X&S5: -zwBA7IJCFdfӢ03^{"0<]G!ϏA\Fz.ک*@\sd<%M7pha{XT" @&@\AqW9 dV`&d5]n&3}mCdsM~K{ޯO,AAbP:|d͊ℚ5/c&WJQ5dMLjMr†Y]@  -D5z>If.ހL@k}N\cfT2ӡLL^`M#)YLǗ{}iy!+)XnS{K7rra -jn '>cf#Q6,iJe7?hK`-p(Ю@<v -)/I0`A,03@0Pe;8Dd>OA}?c} 4m0I*o& -=cmB0@\;K "%z(PD(P&\(y2h2c"0kТVH DF1Aɠm!蝄 N⺎ ůc*~5BJ Zl60w9®5#Eꫩ8,6&e */hղ0{N8@8mdZ CzhyLͦyύa$f̚L{_; . ckh\TZY' 4.\&U-<*m} ڭ? O @ OX19p$] 1aQ *Pd2H8]Gxf9#Ch0!Hz42.Шc,S -ihIPUgêIp;*q,y[nS*'0bFf -PXI(o*[B X$Cd,̓*q2%e6UJSHgK&v qpl4( o+"6#g )b[qq">O GfA`};CȁD}1 :4|"PцlY$ - - W'6]K8\$lzBCA_4z) ϼ uyJګSFd8N2T_eL&Cip%b[Q*R'/oX3̡O>dDb=(IR; Yhfٳ -QK0\N\` bx+TX)l=yj} kh"*I"|gMFo+r}Z3d"·%ϴ-62$ }pNKha07^qACK\Zt $`)}z@ d`=*s̺JS.|G"_4Ba -\t-LC_lp ED Хј.BAH BYarp`8axADPbv s2Aʝ%5~.|`S4#b" =!g]  -ko q$xT@O3oY㌷/GPDFN!Q3@p+(RƖ&T{V$`vGl8 +M0$OŮ )T757@o>>>xмi|FΥ!X#Ӂ+(Nŀ%XI](>Szc{BzH9yCDT'|3nV%r, (P6I?B`ZV̩Y -͞ Y:XEŊA3'+w;CǴ=@%7`mTTٌ& &Ívv5hh,ü,܄dג$X0_OA'kj:2;pW>U5!bED2G`zR$6eJ֬y}\NB -?h[|Rn!>T TU -](|,۬feZ*)`C$ MQRl foiV;6B5$"NЪ(UEZg -7* L! r-j0gx#?/) @Zq ۞UYr+H~C]zV8hD*@sB 94CrKTK VN?PI`P1;A:Q O3@`K5\\, AKY؍K70,9\ @͆  Q a;ɀ1 d$j,`Nc ~ ]K('h <0䌼m. - Q0Ch:-jJ(gZC\F]Bb:ؠ w0 삁.*  Nj! ]L%4DX@ -mPb;Q̧I@ 4b-\蠉-@l 7aͧe;A@"@3sap "5ńZnʗt(Ro9yL/QƇ0 Љ -a(ݭν - BEFhcsȘAS~úfG\8ۈIGc4|ɚzYsƠ RDTI,Yh833xM=eVY &,aVxZH<ͭXoX< iK4 Ę&T%cbH[=Dd^L}=biʔ3Z& J)(̫`*o% .bF_f /Dž$Iz":Z Lq'ga5/  L?=c -5 [0\FC)e6evs2!6eE/|@ - -\HɣAzna' voE \[  . -0@ ]5ɲfQQlPPyn]a`C(u(ڱ1Ro HxC_5Z8t8TX2ՕY/>^ÌC}V?Ҥ$tE" a)CL\AЬ*kΩ>_Qzb`XNz7P rI֘A b+7 fTCˢWĜx%y0 AK.?IoP`)TWW= -~6>>L%AY 1.w b` %+hIpDQ@U=@_+!E[B\ d{W+R R)-9-t1:Aߨz~A -E?TMrFQư-:l=@ky(!6@GuBGLd[@)-Xt2L5! Xr 8f"eY&@'g|,Dir) v7mm2o0%8qMa}hikædc I|Nܱd)mMk,J{%*i$hZ8!1peu le D$2!8T ."+Q D: NM_[Ck~z]>)߀` ->!nTi.!>Qf_)]e= R[ׇNK@X0ǴosL~JaT^3J0De&H jn*mZ#L7%fL0&^:+ -Q "<MQ'VM+6p[(cR{N'@(p`4  i>?Ԯ (7O7R&C0^l2?\B%F/ zR!p%5`6(Nа$ΰH!)BA! 36W k[XW [L,aG~Q pb6B4I]!cӦ,3=,,J@ΞV&`v@h n>?d/:`E +RDI5vQbyOI@,OOXКkaCxqu+g)Rk\ WH`;#nϬ# #CbjJsC1FEcW!@\[hL) Y=eam`@6Cx0j\:tcMOD.{2*R)z;̄!}z"0aDF az_dq4wcQt 0a1D8#|!z#)*p Σ;h4^++?{X$U,T ܋YJyƄ_)/NQ#Y ڜqt6'lO_ܙ=5HCYvCE&b\fe4㪨>{Ox)$ &`$H]*t {CBBe,qNp Dt1 -UÇ8pB7/~>H?,F SQ@`0 !Ѐ0CIf@ OeQ\/򴖼$S4^m(˄ |%ͤu:ʷ I uX]5ga;_SzbXh`N&\XaϺ,/-} xz`q|"@ - pCyG#F_@Shze YRzG2O[PUϟBi^UTCee)V iȓQ4mN?BY7"K*/,O,V`{MȅI^PFLGBa1C7pR]8/SXIz^ d1M!uU^ &}Tn0+3^$-zbZ TH qvT 5>v3.` bA(4(ЄP5"+ !T= - g'C{ג#BEGUQP.%:&)4AB[/Xe[4ba86E2{@9Gd*8R,(sE(h*/®@ud^KU $ Wx ZPP>C|:m DHFP'XSL)Xfn - 7y3wf@t|EVna:JB1\;RK0QRP3AM ҄bF*URoLV4"L!A쫂&ԩS0ch51%rRYAYIILֻ4R]< '!8aVphUSw'8`Qb#_ Vdyb$ .j6JE"TX۔@wEL #p,ސ$7 F0d>c*.SIJl@GҠ{gjT!7M$24>scp*Pp 50>3`\R?C(ǁ ъT0Cώ}џx\jpƎA B!)G21hh cP^ GUj9T - =~#Bg>|>`4O"\.rAۀcLekhptTt< ( JĨ& -*@IepaA{ŠaԄ,cpw*eS#>3e1dIcuU 6ӷ)`dJ1hպEԒ+h -5nDq 9'+T@+? B0"  ̯VvkEF!B�Z@QtcāY -` WM~ -*\̋47#ip5*'''A=8õȆXôR1O_R87;gzAzf}0~s=^(Hy)LSV9|]gp}IIt^',~C)m:BPXdo/WPT"X#԰ +LR \N3|!wDŽIc X -!l9yZ1ZAys8yeL&feD6~t1O Pd# Lz HQ)=%BE#hA5Tt~z;Uw X"ZQ0 ԣ(&tb/djiAŬVeL' -X ^|uccA -h+T뙃$X$.zW f?f30c -)0+© fD$9{$aV{u o `chU*$VjRBsj"7cQ>i>(JV,**`I93{[:Q./xIn.23MXA8u*A1:+ywAWLۍ>8O\<@*!l9PoO;k IРS+)5͝FD0a*^Ox!K-" -Q8ӢjvcPIk-! ޲ =Iar/uHt`|wKkz4k L:%6 Y\`jQ?zx0d0WB%9w 7W_B8.vQۂ@w(#0Pٖ pnP&қ'UB&R>XnqD-`q$CM6f¸h98Bc!=7Ͳ 4+g31eϴ%cȜ7i}bnj) -ׄKsF!XD.Nl=Lh"j|B+#1V kp &|5$HEpNо.)tYژT*# xx .ЏxGS8qe@&L2/|_ ;+ |؃03xs wJ)^?.#hU8;LKXpC}fJ @k QBu҉ tPe %a`(,u;8нJT+l1mRZ01(LH m(pPE~uA*hR]LXG`XX 8P ~J 2ێ׻R`=HӉNtL@eE(PAxѧ ,h#&dG)+^3԰XJv=Bl*nėf6+05%xs(a"AP h<="o$9 suȰ%0F2Ci ŐbTui^5J85X m0q<#= z ̔NMHgҾ -%pn#*:v!.!O#QLX@2l:1čpI:V y.'U<m ࣟ><> QG%F lФ`M(x@`dS(?8rG=V Nh@";IϴCǴ"wCi\]5>A"g *Z .FF;W5)C֞4%G4)bmPͼ`KB\ 1?3ޣ $ h=vь!byk -#!=J.{3J -9*X)9_אVm#f< EHvBQOm_(K(|Vz)o1A9^+Tg2KF+5`Y P < D{ -`W ao3z`H7Ab - \I{KjP ;gh#AvO j\g g,HLP ":IA!& -RݔCglsޏDV_,yƄ"4P`wօ%WĦH,FXp=QF747ֽ`P]Rj:fI6?x4hU*BW(X%A4^`d'&%W-6H".ɡ&e/B1,A+ve" 暥?rK vi4URIU~0 (h0F@06d3V0uyF+U 3 6r;BI2殜CYP{LuN"a D#:Rg(A%M7}7w%Q -GT -"h;S}@ O0`VѦ6&,|}7Xf#\9I Q!Tuo /Yj@9*RfajZ@_kff+fmhK$Kilo?k(Y_/pY w $ײW[@` 8ίxBaXĝMh8UM9# r?`0ϱ7F`1-8GQ yT-I1NLXQ[CDh>ylȫxϔ" -| `(0c8D\I?% s r0%a@)MK Z!(Mh&VmI1ȂSndKa$>z̴yKF ~V3 603:rsD~b@8JxT 1Y*"t17@d@K! -d %S[BC|Btg]c(b#CuuSyY¦DϊSjlMuW#b^o0_eGWϦ*}1yߖl,V:=@?*~-LDOBW0RsF-yP)Q -| I"Pe PB7%t_0Z0Uj@ŀ -ư%WX胨< -U![FU?xcm#;9a%r&Xd& ,@;„ЇHGvSpNpl:c=t' i+rwꃛn!B}PT' bZ۟eaG31>}}}}}}}}}}}}}}}}> 1' -jG xX<@3Cs],5qkU HOBhCTz*-iMsb$g'_ )& B0Ű:z B{} ԗ#b$s0WD Ϻ@?s =쐖 ?}+v'ߠSP02 AN>R^%a'kO!)>>gggۥt)\gYnI"I$Ype733Xxk>xF'b_F?l)`tX~o|`?7GџgH?ʺh"5ۃ,I!ujdi(!mggC0X >:@4h>qw~1D:%Y4@Ѧ5j>Zyc**3 ?XUMDH%kG AGH5b Cճد?V{S0ϴ׿؟H'pmqqorz{gooyimymu~Bnx @r>>>>3>~miO'ǼQ>{[d^7c9_uOY\,$8?J6KQQ:3o :鼛ɼShQlOagЧMԈ8@L7f*!1AQaq 0@P?Av34Ucτ/S uwV8x,-S5O><'k|_~LΟs~,V-|#\.Ljg{ -ZZOUQ,ޠ-&rQEb+D%" WpOrFVRqD lʣ*6nŶf;{ *&H.9 Kn+ rո^#H\ -bP){*bf<IJKӂ3Gľ0 Sg/H>SQ@-"ԹeEpxkx7:T.Q]beDSr1-6M7U7eiu*e9wKi^cWR6X(&+LuH{s"Pk^d[#XxXkQG؛#P_!f=.!Y[cPG!ozq&`SڞI5m X e-o101QRj.U=i+Bw,VlU hf[u*-wpIML .UMIêw3\Tq@tQzjT(o2JGk=ˋPeؘe&մdŌ]K:qU*W -j) U J닍%h&&noLMpܪE\)·YV͔lS[˱OmaAQ?RގUd0%TW)|E'H_7ÖjWk˲E=r햌'RsPEVXS*XUOc7k/ |\r]@1s|AzqcR1)`,$q0#]GsXblRl˃m ^eK kmseJNvW|1 bf2zP -d2nBTFr9B8j/6K: Pʞ -R5+:dJ*"pq`%1AHdEl-0E6p=됲-cNmW i/*fu:K dŸb \ u.b$Nap4=#^w0#`\c+AıYLE~i 7)˫=j\%Qi|U"n.jZ4ܴj]TO\PY`:hHLܻ V1B&+ 2"3P"ϩA,E)EFH:%JL\]``0Oxj5/34Kơyҥ*4*Alۋ K;ff9[Ze˕RT3P! ԧÀSĮ;G Q - -JFާ̪௚!{UKԶl䡖Gdj[\- Ūj-w-fַS/3;qN3{u\YF_τd-\DHn<\3Q p(1q0/dS(ʸ<..C -*f5>W$cQfC)eF$1T1,c!%cž+ܸ+"$T bc1 5¸2b$F.pTPpAot2-C9'K\X5 ܵʳ Jp>#.TIU[t̑E1Ōlj|7hQl׾ qsX6P5l&q5Pljd8.6DbQ) Bjw P&B6S3/SB2&y7;{B,2MEIp8*V_Пq٧H*jKb\^.ø~~$.끃Y3>UB/8˨d8F7\_,pV9D`V]_ \K|qbj"T2xKǒ~7o؇hG709"rK,⸅C<Ɠ^رbʊe&eNԩ*h+R .qw*#SiǸIܺI|YYh~@ V EW^cMFcq[u/IJŚ\GPfRsSPҥ|<;tAqJW vAd\ʽB\5,YZ5M.%,:RZ1&ʍmD)C,`HUƈĘ"#|Xg<٣k-*)Fѩq'psP)CRUbA+9 WW GIVE2kF) /yK6YVԺcpF+,5%CV@|S83 Iv©L\Q9 U>qNa`+E;.,w~TCKTxhz> qhܾ7G~C0 ,x Ko/&cQ |beY\ő]-|.b(U=J:@<ɋ qpɗ.m,OΥJ1,Tn2DJ 2Xf`d|bu‚8-z 8.;8[eQc7\[djl#"C5AeXQ5W -u(5JAL95Uw0n(\KWhf%K&a,u.&Xe\VՆ!+Lrk}B͒bNb4\fRiru.oW4^j#R[eT|L -. Kc33>Jݘ1\j~% QcPܯq>`ύ̪|Jp}qF"f+2DUuS*8[0,F(*T-Q;K -_]'F3*oxu.et4pLD QpFXWryL54 ~ pk7/\NZ&!7fLƮX2'1+\f"L281Q%a.|T=İ"u Hˌxp#|i1X -jmjVk vgPᆥp2oYr/~Dn\%8 - /,̶,m^o%J@h7 *늈5YWQIa)'pR;33$%o -SKrarȱR,^TJbb8IkQbK.:%^#Ɨ#}J+5sD!_/B%_/:hE]θhxu CP qt 'r#Kp CԻ*LWwLȾnɑ1>wxX>-JjZ-%-*X) LԻ1rRn:Ĩ tl/#3r^Wi?UD0B@XL:vT̰Y[j4QPDB@QK#n)w/:ĩ`!CwFQ5 LC,(#rߙ@tQ1PV]#YSjfVW%̤Vpq\a;K*AXC:SgİX <`7Knpq43x23|u,W u U;KUi$rxb.,.\)"U<ኗAV\{l`Ը],TPy|cljRڨ~jWy5sR ̩W*Ts*)>咆:eL!*T1/&o˨Ԩ!IQ*0!3熙g,`nd*ܠ*le;|v\b61̹0|L$>x yԩ o] Lf xLE QMLߩ3(2p(5IPꥥETn*^fܨe8q. /9* zyArtKqVVJ4J=$E1WM$ĺ1PZ@DeDQjkQbRjUa2B/p*؅}eDQPCr0.^0$#h&TxB\A" z*5HU4J$b݌:d TЖQ,q0sa0pNȽraS0J8QTY>Q A[G:o\g)~#qspN:&yjθ,^z|ˎItT\bj5/p:Nxܾ1Q%DBa1*qx?\ x7edrWĮp< -<5$7k @UJKUDFcθnUKy7ŋq:b:5DBTIenF<LKoY7f !wqp4rTf縖MQ.0omJe\"BʖBeYJbqHeta{ n#::KB[c)̴O\\ԷV_-|Ge6,inTjxT}pnʬ1ܺH(AmG6Εp}]#>'bPr&+@CJQ({PT-t_0U ^j.#1UKc1(‘fnWݮ&Vg5._޵QAq-*#*sL9q".A0f@MyQ:]̿LьVʞ岛RK{GU5;@mI|MFɡT%lt" Nv#R YXS:O@,ex:ڰ_ HH_TCQ(s.ZI+h\ -B1s H<,YYxJ%Wxe\2/)=fUokui9i5 ]dc5+jJy38w;Pcr?Rܨ˗. Cp|1%$PԨB c1LM~.<%̃D e V[: 狲&- B>"!@J"W;>&APM .1 3 ?`Vb ܞu ]*xԼKqy˺Z>ɿ;cQX+RQ9O1.1Ѵ@?hʱJ:c+rꖱ Q.6STܺF䖌Ů2 ~wʛwÂkrĪl q Bb4 $Al{[hUNkA!j5oE3E7TRk)PUڥ' !s ;Z6Grx<4Q/J~wt\(6UPPT T!e_W$Ske6"*:xQXbȆagD6 kd͵Q` ;%ʔ@ie_fל'M+a -rE՞dL#5pYA2Dk*ʅX]v,ߴdM ļE X;"0" &r~X( -eR"3kfvDM:IQ@U3pϸ̂Y>+5G B& : NH+(@YNYƮłAJJ mT5x\ȋ脦oVٻ:òh-" <&>Ժ>d]*X;a2Lيܹ} MXX1}H#kD=rq\C)@Br_JLhb; jؕfc.[ÔM3 Կhp~#R,*ܺ䫍> F!i! /+upuz7|Q nq Ev˨%dO)Kj.41^C#e[&}4_A}#KTFڡ}֣% -)eS/MO,ǙQ#|eXwR9Wܮ3|7\&t f*5}!,4 aAZpGxwW(+7>$38ufyo&9I07if K67R˨UVV mα>b`ܯYe>bu34‚? %ི ܀$vJQ)ukD\ 7)3x"4@zzc-nGRKuhC+1`h-%4Zv2&'Ej`.u9QϽFX%j M1$/exv$hR-bVcJCT?s2rhbիNBw7oٸLp:ƵqɈ v.4KζGea3BP4*|~UڼT?y4 B)e|;?a4}C*|ef -r}cX|K㩣/H*%BYsPf'0-,0 T%]\b0isZ?#0u?$`mP-Z*G, eeDhPPۘ쎢 X$5zqD^"~awXirg.04qDd 4ÂqâmqyNYwOAe񁋊1|PAyaiG~%ɗKfo_r1\TxUb1q}T5M|3mRWHqB&c(*rMBed'0 ҧED!;gU+ٸo6rӁ5.Z QXpQ\>F[_ H[>,$$ -%MŲI1+# b B,r:Ff.ߘEu -bEK˸틦WZj\,FRJT?hfbq Tj mn]bUf%g CK@T!3@:D] b\B\ "5Mшj^$&%%OAHK+1:is* FUf%F"DžVb1EslŞo/55\H(IDѿ,&ڏ=e:a(J -%]xtM8~PQCWpDm9ho۹, M[78n!i9#КܯV~$EUWQ"p^Y~Yo"dϥ;FJ'jW;oqp}[ۨ $‰~#hVڱku"W)ݢ|ݭQED?P&a<š E-tD35(>&׍(q,jYqOpPb Ic7XY.+ ܫ$D_yZ>u T~$ _G -IRcD~Q% *ʽ%MC)/x:o| +n d[S+|RYne@Hgko <ߥmbقY\MK -Ç-u/1\o/ IQ"J'\YUi|rrk,w.-lY0} 6;Q_^܂)ϕLN»&a'I`1 K%ch9]Ĵ.0/\p7Ńj\G٢RnVɹG&ҢT].ae Cڵ>EHiEm,cDܪA -hzqWl: h+~$ -Nn`}pRʆ^BR,QTWֆ}nUfPDaEP()2ŽK3oJ5ntS @o%AYoz>j%6Ξf'g3){&ؘNA'._e ljuu^,Q6V\ak.,d ^yi >#.6`$ IkZ,\Pq>h%\oW釢wTT :cbH(c̜F:56;@!'Fs7֣%4{H- &SЁc9x]!-0Dl!=og@^T zu1 -[74w,vM~HCypFR8 ML qs[KjkuP)En_9e𜌧Y/*Jf$[>SpXԶrx. -KFŲOAH>حdH? vQݻ*Hä́t2?EBD1n¥JuQ5RPf40+)ڢI* --\*ApoR&wu3CNLmej YESv 4mT%n*X~\/]Ajj Ol ]Eu𭡰BnJjZADBC\QZĪWuvtfJ McEQTn}2w,7NCL,FP;wD)PF$6x:(aaw U^w PypBCAmnA\r۬Nw[LKIڳ%#npj,|&* DcP?a^`9C|y3+fe_Rzk,8YL s Q _N,6<@[c=@ 2Ww?w8nSmU˃/0[j|553*V? -#_rf3)z8ZRTWA| -a1Rܤ[/O=fqL<0E䒴o}mN AZơKl.wAB^\kd/̦z\Odm1fS+W)J ۡ!@Wè- \#\1ak#ji>-ni .rȚQaa #hi|2vPLRԶNJiQè)@xo[+*֖]>ٳ⤭aA\L#U0_jm)-kX^5 Y`td{3 -" =T{V0n!\@:UfS1-543U]YJ\(RKE@ψql/n#vbc 0খ.>_##N @n;wYAq1 ]/l{+! {@";e.\xJ`OT;+։c1&*U*Ge>M̸> 4eԩqBc-j2 K1ٰ:H tEq.R焂 we/5UWtwĨ\aA/h<h3 xӄeަ㞋GU8BFz.K/5.?ԽB(%ʉfX-HnXE#)ZY@a.<[C>wUA,0yad 0p≒UQ+zEܰ\˃aw(]J07hJ.WTK3 Lwe DKmZk y޶kՌXY3*|=l& 7lHT&NF%4WL& kl)C)e@nRk.n YDD_pP;Pf-*:.Td g](KT~i*?yΪfR%pB%MKeU5a> -|p0ll.:\!:SQ'\=8!hu-xQ IU:댐^"rW9|[Z}LG2x:^#,.5%=lRwbD2%ޖ.\%F{ wj&+FײF+gjRb3Sm~ĂӰ -c"beUb>=T>TeơRT##1grܜSPBn`wJiP^L_%EITوwnPJd2`h-%L3[VDPPCQp* qZ*c [h}?JLNUeeb\rP⪳E]Uee&8 {FRlߘC;!Q ;ݥ N0˗u(4kuCХe]S(nY>FZ hQ[.X -xY "_*xPMK 8R8k)`|N}єZV a JrRi`VFUE5LA`x׍x`~說pq3FFLX0KlA˶0#ij^Dĸbz D+e1_nVTɹ6Z"%b,j>~#ucOg88rZ̺B&njVsVdQe%:uZa1 v^U'GWųȺƾkVlbГiVL0_^4vy.뎡RQZLy] ֡ ]7xjT^hh&cx 64Q)۝j(F vǠ UH!8kK8.nii`OX0*j“q'B7[T|Q8IOȎT-z%O9#m Uߟb"'O#:"nI8^#+R)+op_([7}Cf췒:#4JI7Uޫ@UBā@N)_2͚ʹM/113}Oqs[ -Lƣ}e-3˩x+xlup8UH^1%2ohƃ!c{2(b` |ݓ0Fԉx<2+RX[N We+" 0o(Sג~P@yp.ѫessI"8=[֥C5UDg@z&ݎ"1H԰r{4c}Ta+nU52]qYlFc<0% ?&戉S/^y00;H{8^L}Gg [f߈JO8)F*K ql=f X,[. JM>¢Й<ڥ1[töڊ#*}J*ZGy_R-zs,owm8.4V):Z<*%]ʋ -)0Rq2Zn3J`x~uab]x42Cm*WJd \CBI1d_mHqΏ6l-fux/j4*aH)[Ͳ+RQq J -/ZBgw.%LVc#Yxqu.\\f<ïDX: u*_vf]bP-o<0pE{`GqCpRW[X{Ajs;k@V -)nVT {;1D1!X9hwhx*j02;LԦF7\ .5kN]:ľ8fQԢi1sS\ydji(1)ZuDtad[+$8(FY8ҠAJDxHq{eBs ЪbUh~;hHj)ֹGl+WǐVJ`ؚ@9;R#)\aaYB,]!qrBˍVc~e˫-߀7 cPV}2ƿJOA~R 'w*\ZLpuGeӎRyANH5I*-ew1#Vm|5E^AWw}~ -ikeLAtͷ/+ &}sZXf_,,.)otD4Ԑ[u3[KʕhMviX[T8. 5P uƀ;|@kL!Da*TUR u0J:hA5m2izw{%_Rښ"֙fW-kO胢FVHMl ϧіX8er+d#FChK5sDAm"ߝ"+Dc cqK*Iwթ]V+LEFT -)١SW2ut+/Wk7@-Da[zyש#+0RsZ?$Ũ񋻆nmfywp/||z[qy)3u/=0 Wm !m:Fڅp\*U_"Jy ( c|},x< Uw).e pؒ{7PPgpIrF+fkQ#6}ar @jFӷTك孹 2;:mѨ1/z`ql`׺ u5n =$9_-WB7gÇ$$93F{ /5*[6*WVu\0 S+{5.^*+OZ\qtƯȾke59w_¿QKzLTPzZ;LK\$/|J*?1x_rSju;f R9#rf .S15X.P*ℼuW)+bEfYn:ilfRjK!ٜ?1 -Jv)! esmc8,Т7˗/Sn\_1w*.1u [rqqj$c%sf,Zڈ!u9CAH.zz҆!R5cO$'tQJTåJ5FPRPy! N=|0a`TcZ -Pf@jcXjGaMrkCt}%!j6MLPIyZ]G dF%Z˺ 1Gpm2]⎜v *:DbwUSfІ\!Q^zV>f -H[[ɮo^bEJovxYDjnaW{Ko.izeX֩bYuK4ZD?ܔԒ©R("Խbb.jR3{,La@qC(wrޖrq^ -gKBՇ…;"e{ eFXS6ʼ%SRґa&jcCcSVU!'rO'$U- -aL*WiqVTi9.m^9U{VU.4Hj%dʧrO^jPe|\95\fa*RsথY 5R-rq]-6FǍNLv˶+uܬW[;X&}P(Ժ'aRq[`pbYu^VpEش$+/AMvfȉqrPz,,'=Tb+wA"rlܫФ@9*;`j.]" -K6ƫu\4‚DY_eҔf[x¤B֭/G2"-&#d{n'_p6l,M:ߚƨj.eʈ_o -+Jvݿr9عIn’\\` $ .{0 K]PīnRK 2F[  ېdҠ*0~.:,L˼NV"[0fC4KԶĈ숓6^p>Q -{V(%ٛ*^eb b[3# - 2I[a.0  XXhCcH Ԫ3Q:%[L+̿3K&%cRFgq6K9i%e35W -ޡS3,n"n$R /P8]uc0K%poƵM|=d tW8ep7_][Gd}fi?&QpR//wPp "jf m;8`to߭bevӦ臽f.ljSxz~vG!w -PU3MSamDfp%J#|J&\pE<.%SwUܪ+|AuL7Vxr’T~ˌ!DxIPbX7[21NOUt * _Q(Bψ"ۨI()57Bx&xVr*6*iSCmEQ1DFJ7- J E;ۅAuIq?7'44C=Wxk{ڼU{P:[/].3:!:m%=7o50j,D^SeJ*%aL+'JJgeRN.3-!ZKxzeK-(e;|]Qo}d~,%EJ\_Y/*|쟏|T']AEpxCW X|\/9j -i' -y bmJЅZWBݱ]J=dRjg9j|Eo\R%jge.Q[pLWr[, -+*rʦ#mH -#w1uGLPLBVRGJ`w1^ jYR@kkU@pVoJ8Xr娚n,R%@}JrPeBY~8H0Զ"U0-&\ O*U~;A]E #S=,BU -Yt|GK.󹍵"R^hНX[%xpj]ՄDT0L[%& IRѲ[ )X)=VZc(+DHC88necEΥ|Lp36 ds b52a6?W*Q[;!&/\cHR\d/u3xTQ11N(d&D]VHq,Dlg3ȡYLs8F^zQ'Uw-] Uj G7d8z\6֧$x,"ʢ,tFx ܨᗎԹYm^+S1lBz@׈er1@DpFFX"Ù|[mEVԺ1Qj=jU&UPj/U}K\$OM@9/egWw_}h tt3q TVf/${GxLpPeV.-"(MKg!8:F5HCf{7(\hC|̷9ϘVYAľ4}!ՒZAL)YԽ*x!@p3%2u5. 2Ŷ6$Du7+1*WQ - ҽNK_0+P>pڋkڹfqk 4pبJŻ*jE%@ Ąn ݵcҮ7Pz$D -\/5/Ցr ZP T")-QꦮWyJR \J.&jR\;\eɎFd||W!f - % 0˕OR\j7+ls~APO -n+R*3pe )LP{L/:ؽE37T:"%OqeqLib;m P$%mdnPc˨dK%ϩ.eMQq35.RՈj08%rt3ٺIl8ԫ]jmS_2.eP -:W}yJRB%?U Tip>/%9!W` -kP-!,`f8.%3\? /tKSĹQjuµ_~l`qyeJq -}L$~*<̹|T(% VAoe5 V,B70'PbRqEA+ 5 qV1!Vߨ%wfP0P'jDjq/.3L( j=JNSX"Wpyװ;w2C}[3{Xū\hćtZ}~J<`]xmrBO -RBr8XK \2P㻮\sGr|OR1baJ@fWq)UƸVJ_;1)OF|§wRbgkj.{10lk,w)̧ecG<-n t~n{#3Y%}seFQKz#SpOeԶ#)!kdw'q=ܤ{"I2;Jۨ haj-ͱ32r*Vew{1LI=HA+ IU)X`eb8p.~m,u1H|m1bc^)0$SAu|A5Z5u$g(֌ߘ%+5= pv%e?X`CQuȅ_dХU WQVnzb{`TpA \\;21jԸJmyn\,ff/oF3t\xFR%S3čk^%LLELF52#)8Xj7zũqRJV+.mnʏ"ߙ8xX4MjhLY\6,S"ЧL e)%L-cs,AO@x%)RfeXqKAhpp/XUAm$j4)r02U<#7ĎԐfx*5 RUJx5>xG P2)[щ  gL )rUZBU -xv6Tic -MׂgFt0y˺ -*ԋj:w5\J1.S-!ZV23 U)5R`:-Pqq BKF*1ocMՈ\f R4Y,t*-.-h# kw_ropj)A)υ?8yQaTsgmO \C*8{K @mܵo|c*b2NFj& JJqJ:&8/O$)1dk6dp\= +r,2JEVV#Te}U]R'I\a+\3W{6@rʸTG\TpÊn2\S[|  -Oi+F=]HksOSN>@=3X:I{0B^\'2%>a2[3RPe'`-@L[(QrLUV%Ա/Vn%C| np|dy8c[xQ1 įc!JuH&H̩\!Q"E,cu:ĩS:Jn>oK9԰ Y$5.|\ji$P oDOa*슿"`?oCR ø2$nXjk (YT@ŞÇqcUn4Sh._с Vq%l>pipآi,WL& s%VflVe>l"Ԓ9;?Z[f̂D[Ľğ0xO nbd|^c2:2@w~ﺡu?A_ c<"*Cr~WÂ\#A p>f]3\q901\Q p憒cZw  /g7KZ/zYɍp6d2<VY*Y ^ -` (kֵuEpn4u w 5U JvX!+0L鞡G5ȓRD\ -KW*|pqdmV0lur3 E\_/;&5 fG<:cg eqrKT\(n Da`n/DiP%j9/rĩOOwhKE.JKs=Ρ2cW>%p`"E *+щ^L(J3N+=+ymI]Kfˎ4ڔ> qq\R}!*$rܹDܺY B*|_": fʝ3jJ3˨_dZhl단|f\\znj*n74kCiHH>i7}_i(:٫Lqtŕ]t(z~z@EHq)V_rr>j6emKԍre2ZKQLb+U,[CYQbʅ 9Xj( &LbVeBu_Q4|7nRZ1&a=.@5]*uHL-*p)GS01IZ9S,&~q”e'pQĶذn[rٚ2;OL!RjW, 2\DT/Kž#+*[P#.^b.^bWM8HKW/\f/\). ."˖O)UQJf8e(7/,E Q̈\ӈ!k^g\(Gmr:|ɘSJ?|o!_fT`%n/ӌV; }S7 ^WQˌPYu1MmD^aa_,5.ٹIhh#]2\c0#\֦x<̋ N_W⏟;!ʺaFf2FSr02Aunx_ -oXwQ[#*[Z3odfb5bѶŅ/b;D^2}K1sI;1p]1S'Ҫ7Zzqܓ&N*نf3U seaU6YX&YeQ$l"˅5 dF^b|<_;kS[bfUcݳ{ ļslHcrNjf8~Zܵx(!fو,N2TqKIs~b,xw*.10\y_xpaT€2ؽ#,"@|͢`ڳv&"LXQc+Q- AMd_|r;-DA,QUnri%S$ևc -ٌ[Wx`Q%z5!a<_lS))O|5;ig5զ>֒hn"RKbj/dt -2h9oRf=yv!섾m0FWU;I|ƅ!70oASaEV!6]5 볷`JJH1uP\}E3nꍻbn7m]A"%7ҥ 뢬txT*^lN ,Q u -hI` -cBwlWz{Z78J*,a|Z]bX,*W2[PE(BM8Dcq3 -ƮkPng"K Srx ua7UB sfoH&(0n|q^GPS:ڊ@i}1a3Ҁ"-ܙ. -s1,X<]%d{{ >TzK?ڛ؂ma%x]Bv~ O*i FťjsFu V~?Hr%@*֑\4d[fьsBfijV]r eW eE/kKDY ߨIR.>x;-RYQqLX͢V$? -&.:'T3,pK)z't\9^\ubT-'wsW:`k /p9fG31)f4UnS2%Mfn6ii!nY?Q+QʗD̴OSBW/)[@/)8ZQcLFx - -,eC9ob$~6{b˗|1(qr?rU3RJq5ƁIk]p3\P3x -= wl>^%DOpQx\:7 -v 9a꽚 f#X_ %JT/D"&-PJM]et+eov#kA&tv#ՉTܨj:p;Fv<ЄA< HOZ 2}V4ǫR˨,Yjꢖ.Nl= :|p7/A Gfaun8\b6%`KeVJ{OLN-,\*Vzx<1YܷQ<2 - J+<%fs/{2/W3l.>9W=0K\ɻr<_6_K-7qb[qWRޡMpAH9LԳy|8\-RR?ZYE]e&?ZW%{~ߐzxXI&DŏcWMA*#cSќ;'_^)ׂKUK]JnV.7f|ķn+Y<:,${@N̠<8xmT=sz U(񁚈m(J˹|^!, b^jU*TJjd0JF"qUަXbeuydYN3ey'3x _;O Bo,ś%_j7r~,Lw/A+\WkpWdmP -R`[_HeT6苹^Y@3>-N.NR:qQd@k$[+ƱD)XKT.R4k^fa)L^5늄5Rۋ,R?\75pPġ 3d3_C/r[.T.u3<? \rA|3URuDwR/bb* W(;V$rOSX`V:-3]ŘJZjj3J-K6TPt⣗~HJT6$5vQ=mk4xx欕2ahPIKW]P-!dݥ)ٻu*cܵz| NW-;tU;BqN9 ,rGLĬl% -AIhnuO>m.tZQg0SP*[5 34+6@iV ?Z`ӯ4=\J7\Qu\R/re*̡Ր*si6K4@(gF-fm+/) aHʗC <2<"+Frnp%]9q.}.($v! *Ab\6Y.f07r3*c:qe%*Ձk|-<*T.u0K UpbjW"5.xYIr8Iu #-/jb2*phJjMl'~N?EVjc4ԠFBq=,nO -:YC-Yc+ܼW5|Oa. &TJRj+ij2E"OGR^× >,́VV{$#gw)JԸGwKu-w m JW*%gL%lj2E\9Ի+jnu.\UFWKR_Ǯ^,prC?qRwoR.kK4cң -K,cW==̷]KG5*#j# E1 ?\-#}Kyc5lB[ k#nxz6%gZBX 9 _og0F*Z\ - mC\z<1j[0/&OZ %D5ρb"ܫC!.Ae(Srd%jjRagܹl (]`fgհΈ-m.#;UΣmA%\.ҵ]3Wu+z%Nd3 Al]^\+&x1oz @h#KQsO%t@^t)7ZF3Qj.ImAm Qn_4*" -Ff eAZ.fT%YR 7AT*DqЁ\[pPu\> DE c n6⁧M\%m?{<F ZKAxe@yM@ftgU!/ˇM@7R,VCLj|:8q<{ES0NDžmʍ1RcҸ(\*) F5:#dԶKQ.TeL< oDc.W -_Ij]j>_@݄7X 'ؗGp>f01GENbֱa.YrAad6cXR.:IJK 9a-2bkr-HfUK Ρ+RC+SPexyQ$ -O4]͹VX7>bZ n䒠PǻDu_x[=*r~\o0ӷѹXef0wǹ/F&Ƅ!2>(6To%])@Ɩ{EUxW-x3Az̢.Ošz.7b5}FñƊp,FQ&v= ,2֥ԺQDzkܺB.̹/1sԮCMx+JfqEa[*J _g*0j5so~7LuÃTw.\%'+%eYme. M<JDڻf^L8ֽ1Jhp+ܧ7 17j?-hZXg<#5Ue5[3/pV\O3C@[hPc[LB*3/VxD xb\s01 .xE\ "|8U+U:ydIL4ޭ?^ ӎvjs QKzE:ij5Z(Qǝ M%4A pW4H*HKcMQsl Fca5#.Z0[pA$~?p]Jq6wWOܰܵoU>e4\ZǏ7'eV&`T1 pxb_4uQⷘ٨_qV-EG^Ί $.rNyNpQ15d܃ !plпlڨiz!W  u%S01noãڬT+/, osGň,=5GEYtjE`T`˾.Zb71Re*d9 -x]jznR1S 76%@U\ &OuZ -"MqܰwjŷIOv?'-}ͳQ|^ic_ea}njG!d7L#W\W|\xqkܸq3ImTn+ph0&3 Dsr8ze,U9h`ZMʁ1|++#*[W k|^++/0(sKSd`Q.]w7\6ԥngw3] -Kc5@aJnU5K%d5qY&nVp047Cs7\a(Γ05Sl&j:T_#<2P) 猪LDjmwFRFP+=:)Gjk >Z b#l{q3*'%=3'D6\cG,%x"[Q=_`Gh[(4ՐR#jP˨T-@*u JMRˆqs< θ!ۈ ʝWje#i.X(-;Y{OF5)u -xHDnZ%|1+zπ5F񎫈^j0D̹o&7d9@cڢ?Ok?lk4oLrm}X}NEғ73@1b*&+dWHnKfͱKWc/Tj|DԹM˛n EMt cmTdZE{ ({Н-d0s*c`?I1k3leZ7*#"ϲn]㛙K-M̃2j+ƂTeIҦw4-.`̧Pc1R;C<wXPzY{p(Lj0Tn6-|lĥ/엊u +!5Թ R]FTq#[┮%|Tt/7* C5wk<E<͟ܔ|;f( -<<߭4_?ŰUzc5ejbkpUZC::-KkCV'!P% -5Nn^"*ZvV`Q06\s *K=MzE#P%n\%eAeƨ~\?!`)Y|j,iK&k0}V% ?Ƿhҏ@faNa,u<Ϲk䗾-.i!*2MBE Yfn-B A[%qJ8WMB7 wMOpQYL-`<(M)e_4KF<~jQbr^M;. QGpZi*W4[H!qߘM{<6w)J'l -k31?T9OSXKXv> -`\ay|}"CqJ=ڵE󚎠$2wcKr8;n R\L^'fe b.Dj*4d*ťjJS 51Xpx8JFU0ػ9boDq!؁8-K|z>zO{? *46QL|5'B#_G҈LzTyviELP 3Tqx;*`%pUB< і&81d&x]}˙vc-{yeVjRxi oRa_˽MqP7 ϞUU|O pM$"%,w0#nRѿLY宫JZeZ"'evoq[5o -(?e0I?u?⹻/jw1 e}zՊᄳ3[{#N|%k8EW ^ls8$v E,rhD" /gsXZe˦8`M~d#Md_dE -̥H-͌45(#_YT O Uw)Hܖ4<&j0/4JG9~nZdAS :_ tt.brW)e<4NQyhRVag {ķdZ25S)_)TRpkb@mvʏ@J`Y"rRJ` ^]Jxh'P7 -EZT?3A N4I&JTItMkQ/4 FGjWQ`ywJ P+TRŌ -U; ŎP%&9"%.,HԹ|%T@fi*W5̦!R%-nfBWCKkoUXj]4_4 VSPQiAA-)3 G'% +b1Yvߩeq4|M˧\+Ժ0mJik],,=vXbCImD%dCbM@UpbM1~z3t`ŭXP_7 [갦s6e2Yxs9 (yh.TGFyZU+Wqh ͭz!ܪL6VA;6]tTѴ)p~q&}JzJ'2B -pU<_Pd~@Ot҅hPlMKhɶ?42೥P8Eo ۆ#錨df[fg\S)(D2NTq4ykLe=CU*b4!}C,JTqP!BĉnCl!G*6AԹ3$wrJ%Fh*QP-4WDu*b bUh&Gx,)ʫgO";OE4՜]5Q_jL3]jbJY3"հ,$ -:'~Ij+X!SI?F/>ʕk{K;V4aL\NYWQKS,[wʌ@ UD:xʮ -6`vncRQfԩAc1X, f;4SF}O>,[u\GQ74SMc̼:4l 7Mģ7RwaV9x\'c^JJn;,eT7)Y6Q_27p%KGԾ+0H\RyjfFLظ&w!+c6YX<7cVҥ@[uoTAQpIKYL8RԶ3p *R4S<-b-sq95bRu;eu—c]10$t`Q17!RO|<ьܪJ8n*00 :mexCbL!kF`o">4TAu *bYQ`md.sv%ŇuO4?W&-_0%KF=A+0+j_q 7|Qn>b8L"˗ nJDa[(RsSatL s(]Į -B94~&9AYp.47Jˌ&R+&*Pf5v2ڧrF5\;RȔqK3տ0ן?\ܹ9y)Ha> *{_ ?J  1nl/0nʥk5x0TM9ܴ^c$aQlϦ,h=$nYaYRjLJ1T1?=$}5[:l $(™D&" Mkd1KM%@n(qT0:`@-YrBt@:`VV_W0GpRiV`SO*vR`%Q>ώ +LĤVE -Ŏ]T[|ʐ1`݃Yf'dQ -)7+uUUMN{̡!.V!v45bd=NJn53%* =\V@lz?s|0FU5*SR]WREc,9Z)R HtK<0r/=o+N/rsѶ?L Exb2 }`x֡ZV c0 3u /r|x~eQM2T) D}qFf.fgpZL>c|6.Cg1r,sωkWҧXc-Rme -7H0 -YR#ԁA\(n$*홾 d~cah0K,Deo1b!-afe˾kqo,g0G>1㺄~eJa(IX!Q J˚epj[ ,B5tᆷ?N".5JL@}A YQQGuo gDbCVMv8R©cb/O`կdk:%w $ 1u IjpbW|#{*uP' !Q.])5^ϼBj.,kGHIlD[wk*gU@΢D -IC: E^Nf#L}6\@ -ƕ - ÉjKu_\JL|Q._.iˎ CCДS \'\2.^8U LCYt3+xg_lbqQU|4Ker+eNgKxNz8O+?dV3~$C>', .Na~]JTqɥk RΦ+p`bT˨pKԨC Szc+r%)]RJ z.ꤨcU}]"A1UTʼ0O?E{rDYrp0E`+fR|CGmctQ\b[^vf6k1:MuIk4*lji`Aݠ,4%Q &jAX+u'Ln`ql51ԡe ~կ1%J:Y`g~h쫶H -mJeLB%%f!XXA-  l,!Qf# -33e]ſuLc:AxK/(eTbsM%<,g\|̌_S3Dع dU|c&33G@nt.HC?@=$Hp|J⛋\fj\ -Y|BȐ*4 W[c5[錆]o|ぷ3(=fSFj^ :^A]0s11P."Bt1}'.+|NG:iVQ[M]ntqPa3 }G YaU*T0AӬw3nس n=;Gf,Uu ecY!SiRyd'@;L؋X{pSc(C^ ή&c|/抆^% ڰ3;!{.iW0@biu:5)| pÚ|ws5hTn f2fPB*] -?(%G LZ -w Pfzi-#|i5 *1%s`w%DŲFa%l:jV֣Y\@;EOmGFR(AD?3T+e?<u ֥2K5S -ێ;%Չ) ]i~h1bP[X)l,?]^W w<ї 2.T߉jL l.ԺTbD7VJD%6maVT0[E[\YN_ RP_ZgV Pҩno -R$[$#׀2ж$=~Ǘ95u:H!xc\荃ssrB}1p,SEpw4gJL/ʼn!i Kfop^⎥W0٩r*Ww;E. L%{#1HR*YS, ,LT'BzbQuMXJB⢡rDpO*v@\ g XA-yvJË'a2n -NYt #MW|[=o앑Y+[j:ezJLouB+bkRKơʹI c`i]oqFanhZaܳ-G -4Fkuǻtݖ_e\M.|Z‘_Lq1 P 2&| ܨzs\1.˃R \Rul]%B|d:~jz"*+2 -h0pj7(q)Ee˕,8#lo HC]t嵌)QD y -|RHF"KֺS}|]iRV(ZJNrTpBL1RQxRP8c~0qu5aTnSN,&5#kbJ>cR3b*xf7;D1k: h"<x 8|HҞ0Tvg"kM@hީ|pr!|.sP@qrrB_ -P=Ibڂl,F> ++QIgD{IDd׋'{K'.U6If -7kBT"̰R%ʩf#'i3x.UQC\[-\E*$oDx(z;@Gm_~r`0W`1m/RtK%lŪ(_X5cAC?}m}d"*ܩ?7K-K8U?iv$m L*J X%joqrNy^ zUNg[d-(Ǻ7eTYB[%y)E mu›jt2׈ʉRY0n'B+ FW7԰1>R -0c刘,xc3R%w1a *JƦ.\\G3Q-95+ĉX*2ڗP1n -ee%R 2׉HV!_Nvz&1y!`Xѕu..t "k1uW.JcUq!-`.0rK-pq.p(s.^&X|330%f*,A0g̻Rbw4qW,VV^(eA5}5\hb L=S!_b}?iwIs[.C_pM͌ ?#/-A}K7rx⸨/]B08bbTTfzUoCB!?*J+ `*2Y/ Qf* 4:Řd_bcyDk]imɯ,n?d.eZ),DѥoLg!ڄ:nUՖ{? YjZ|n֘03G ]Py)sA,3OT{**#,xfXL57 cڗN]2r+M -!}2*s[r!kf%YPTht\q7>cJzXfr\'S*RZKJYd 6K9*fciN9)Z\IA~_<&}:bB1u e̶8 VeƢJ(%y>pe(_ -R`(Y_wUb_ Ae-{OG߇M, -v{ 1=D_F ?!A({*LNϨd`Ԧ0¸ILEڭKr,O{\:DsS4ıKwIC Z:%5>+1]nkeChJ8Lԫ%ԸQ1,G T"ٱ: +ƅqY:iV>BF? -5 -^6ۥ"T72\YP^5: Tū"hdlz#_ʎc!. TJy'D-SH(E8*nR!82uI*;W51FeTa- -RW)!=U!M~b*5.)["trGr1(n7Rx".&Qr7A YH%xKV Ţ%[@ eF$Oq sˆV!) IOBdeSdaLj2fernffdwܶDO>}Z!;.CWgR8,MY #aگ䒎wE\۽\Pڱ@%ǪKR\TjiR w4*+T\ n)zyF::tARUKB[Z)ĝ}f?yFWDx[]!"N%KӸ5KN_q)ʍ$SHlW4V!.ZiGz./p-73 g2!60co+.384x&NIJ-J3BCQ) 7 5LZs+pT9&ng*z>&D4"Yb l"B\M>/AI2J.# 7(D=ƗQ!FXY6Wyry -/T,3)*"@ke|&,tb D -7|[&A$d@CT~&e TW7ʊJQlGEYjecRoJ2EbR7rDγ ܫc̦]A,=%M@1ɟCRRvSLÜXhôLv+%*YsH?[;WUL|3ՖmbR#fBgfDyNNЪ) Y ha>ڥh*ˇ̵n eWn6TQe ˉxqcO? xgw -TrS,39ܜ\vK|8NB@xkxs %;6=B  FAAyfyNqO0ޥ x0%p[O#9v]ϹnX:Uʈ7>cu.UaYT.\L3N o"K7ࢯv񤇿oO8~?,B{D$"o;'w(@cja&bzan -3ac כga3h;W/-RQ~έl"L!mb{_ؗ5\\+? *9ST 7qwLI3Oy{(E~;b@C^R:"0Bu^d #0c"DF֪.{Y9Txqrksz-1#x%BzpBc|_NjT@^Dc_jR1%4&1Dxfg,K0JJc:wrȳT p)qܷ_.A ;]L\eNf&%L-2Y/c~,f DTi \;fɊJr93w5ms$m%ʍܱ)ݕxA8n\,WlJ%_+~]sDBfrL3ᛃrK%8I`EK=.WAvĪZa~HUJR'Uu48,QΦg(j*: -. -55X9%10$3LFnj>n&ef|hw0\!fYnP y jˮ~JCs*%1azUP*4IJ+x:I~.% 9-s:Pn_L.[D@VC8%Eɕ\TPq+${Y( |C*ɁP6#.GOI<S:ӏ(y;H$G`G TPR]C,.㰷ͤYєyHoYu|@p`$)3*T}pGTD#l?i-"c۔}u߂dբF9v|*Tg`Dw G#SS\_qKF, i4,,&U[(@ˉKn;+5t^R98"s+ITψB\li\腬$0e~͖` \ķPw{ #-{LE]Fc m]:Rĵ{z*LUų fn[mq72b7c q_P_ALIMC4֣a pN}w9u a,Lʙ2L? .8cL6*dc5_zb [G+%L|x\9kS -LBvFK_YAS//e b0"|1|ḾgE zW)B< ^:JL:6\ {Ԣ?]MK@ /jMKfi*Tpp%R8jRD.Vd2ti4P[/X"*f-i#xՆ FZ"[ٯH?ӁRA7Qn)` ]mcUJ]ctH^1SB2m/ΊR1zK#Ar |51-.c#B0C'eoܢ!+1q>ef)/#:aL_%GDKQ3+FK%1E`/'5/Ml+1)6-j,\* -.͜PX@LQ0`!ƉW*+eWNNHULjl'pa730j0lF|g74@X`C(QpTG|Nj_R,1]Ĉ-Fe}@(Zc2n -ҝzÆohLPl>/hFz *xj8s93o|X%@i/sSd꽞ZZW -pS1.Nn14R2. BW!y_rƯQ6B-qbn[Ds2|q=R:!ㄊ@~,"e-eZ't7*8BA62gw%`UU Jßފ)@}44kB_.3Da*֥WQx$u;epYoYvb(u2iu^zpό\BQFqf '3Tz7c% 4A>`&P;D`:%Qٯ`GZ-3~"QnhpC -/0xb<'FN31>)EnjLè1:# &buy&+rLk!6>' eb\#e5Y. 3^k,3΂DJj [u|eQ>]C?ũ>ɨuP JD}wi{p~ %K4%/Dd8;⊔eQJ|,)X}DN%3rϸqɨ,٘b\0".+%||KQ2j [q_PHUd抝}eaJYrᚇ4a2pG7U&u2TEnUjTԹW..T7uu -4'p ^_peล,^SRR7R2L&jXKa-@bT? -%~gl&.So0GEmZ`c:T-&%L!>I/bƥ e"<-wXrsHvv+ 7[g~KP^R Dz=al=<ꗫ@ޕmZ^/ؙ 碈J Eý%9WҔz%9j~]ܿd~ B`V#$i3dG-*0^|VX7AyȖq- BXqZQFV:4)!TqRJ5 TFڪ*@* lW97-;SMiv$3e=E@YAv#)QY ;1Uc4JPI]fff^pǸa.lX⣆mFѪRpZY,2Ҍsy^ᙫ\L_'Jr2RTⅲD)rep^*oXKIJt%^-Ƹ-9VbLR%>'pvJ8MbԵ2[R|W jf*Ì7*(+\ùC *  T]b_r]Y2Vx&O eQP)vʣ{Z u-Lʽ*5* .s) BùખfPN,0R[ZĴax.j:fbTSvK/r`13WTYNf8Gr=^%T1 -:+TSEB&Kj9᪂.n+5DOʭ)ʇ7ze\c)QJ:벵/3+*z*/| աk`@% [^NOH0SYcO˚7 E3q1|xowM; jap1b&#}pj3-q"ֱ27-. pg t-ʌ8UጤdWq⚁7PQVND6AcIX Oe!2K@D 4(sST8Ծ \3 nUp*o]p)xa2JW\ Gpa?bp - BdSF8>+.f%FS -& ԯ.: c>` -̷ZRXhM/#]F.=˖L[R±KDˬ%5+17 s,]O! -`n`ВB|Ϲj/Se O,]%!.-IBi46Vm׉!nP~aiҭU~ :+yQT8/?x[AJ|E,@R!'ê!Mc9k\f뮀X_ (?n+ݢPXGW)ө[#&: %(Gܟ 冱.eELamұ;5f>ئA:ѣ#^ cKP|nkgF=ņJX &KuqE~tM5U A` tK={g ),†;=.euXĊ5.یfdPܲx ->~Zœ^Rշ=d>iH S-^YJWxEZ8 -g˰ES\WԩRʶBiYn6)9gfQv -J$Zv0]hnlȂ .TZ.OaTy2Ʈ'g.9H E z8ڬLǖ7Ș޹na6c}L38x*5.gLIfQkD '2eMuA#\;AuUlZ཭ER-E( |*Unf.-JYMg8{2)ap)l9%o. Q[ ~F2F)jA#QZ>Qa@PfԼ؇`Y(,, >;@EM=4lҪY{ܻC>}-V-bjoCS -qWtćΆQo.g[Xy#\TDU,16@Vë[d6k 3D0ނ"bNP\YCMe t:~"[k%!CtE]&> 0?ZbX)&4*+6>.bmbQI|fbـ[E{DQ;ʑZJ%2c -7>1ܿ1$1#q K)v -OܨFK|<QxyKZLSR+EǚU* p85*&85ԬMbkwRFPG - -A$/JcjyP, Bwpi\%RۋMhcgYf+3st&op+Y h/BU|Ei -*]:RAP .nv=.^tWl,(UBкJxe#d⃸b_@ ~gbf;Y1aɒ\fUKPA^.6xyaM1&lTwSցPmHc+-YOV]|9K{f*|tş -0sV~$etoFڟ)t˃mrcWjޯ'EsxݐeNÏњ߈gy+W0%= kvu+e,BrqpWp_ %ʾ,DxYp]0s@7{WTFQ(kͺ|;z}z[~Bئn~xҬ\ݞ&a$GeLcw)#Si܅mЦ5/9$ -_$ cx4 t؊:Nڹl%,RjUJW=\g&jA[FT2KGlcn45S]D%bTE]TНˊpANۛG\\T_|YPQ+~ -?ϾX]fcjQ[2LBSMJRGL)ڗ-c FPUszȞ fw,'! 0ɬԮnW=@*OHiA"B[6By^p7)%K`ܹDpAqxᐖ щ`)W:|}@AR|^u*Y,D7l#'2#]2RFرR20KX`AM:-I22xx%.xY%AhV=1qZ3 -%;D G -_K",PGѕZ),qFP^8`箼2KIi(&nRWI3Qǜ~EPK xx%u0}͢"ɌĶ c \u 닩~r؏L-U8tKa:8+r$ou1(tK(jQW.[?V?0;\;A"M*0>ؒB\w}q1~0(_\xTw;z0$ -)!DkFLqp8cuI,]CAqpd⟫ŗ^ :=N% o|1r ڭvQ @Go<@(x`uN%\d!x_x+?"C8^jgq3 -;_1xL-Rc`}}IS>s.+`{w,[X=ɶy=]C*>`0n -]kTL~pd5M˕4("PrMlT8~ NcVnikxY{9hQ~u,/=W]PQgkYu+Wmwtyy&* .= -/䍒d\*Z`Q[eyKV!>[ܜ [fxqU\x.>YoKX{RW R]. ꑻ%x&xxu+D-xq5:*4KQn >Z%<ʍ!E JSH>UjU\!\.}~ X奪[/ %e91sit\JZTḕ23wR]֥ # -pd%GK:ܯK9ݬL拔T2,Ы˸ TDkK5ܵ8iQ,ĭ1>q~GY)Ttas6 2ڱ4b 7>Hv`aⵈͷz[Eg:FVi.H1dKL^|AM˧Գr˰(n3*c*[o?3;fj*Z d)>8dZBD_B3gUUL a.<\_l? ʹ a֘9 ,q[ -0/~bȞ菬} 16XdTgVp^Ky Vng$]G: 9a`X*Q(? - #@DVL3e,"ھ&EQ@Oj74JPRV^Wslf!9cІW,"!Nk,q -x6E(S}rCPx,&eYzZ'\E)Ɏ/A|/7D[8-$uV7G3Ny`S6+EXś7y$D{Ȕiq uGRXsP~gP^@T0PD-; - qGai)MGPH'6j\XTRT7v։v^"J&o3/v0ҺA]+ .`JMG%È1 l,a]] @Q+)ʰPc2g-yP#٥T/5v IAX͘&&.U(L1*&\_Vr!.h##W!THohZ~cF -?C1+n?Vw+c&-$k$ɫ-r![YVX%x%}J:R׈IXAW6ٙAt Il[oV -0t<b /vca^Z rB%-#$qoļE >FnPEtlHVN(PZDB݄\+.θ -J(+T@ EZXXػl PAt`[n`F.koM%]Cs̹+}tKl˳T;F.z``sܼ$2طܯPj ISmjWpjJo?rӑ,!}0Ix[NUUY U2iZlF4χbZa̯=a,~!7yɴ5>t%;.ѝ%֟K2h^sAՌuD $n^!Q C+c脑RcYJF܊u;' S2Uuw~P0tK% ^Dg yiUGxYRTsS3)Wz":up/̑STʈYiu3|X.& N'1D^)&g蔥~\()jM b 'l_"X>҆!:-GmAQjs:Q5q;GW+TE"vn_\Kjj]ƹ# nok >Km1C>jIxȢqkEi -(So 7qp._攕fW ׍ ;3P)]Yi[\ %>e# -%D"͢u t& YiZчPF5UL 3Yc}]Þ.}`84^eԣV!TL*Ti-JMG}_ gQr.RgqZQ%=.ܖ*Usnȏc+'qj +4(d f+c1EȁnFQ2VW 2D?1\b% -KW4cP4b/%(Uo)[].X{gU}e|cA%»tlՌCIg[-˶DPlu-6]8xLJ9/;ctң°=Pd]{KD0m˸#@xkJrJ㎣r-c3,'eإV)Ԭo5a)cyS_ʌ|ʢvX MJtǻʸ=ŷ._!`VD|+eJKuYƒsm Sg_0"Ŵ3P+5_|^BVg`TxGd9P%'@7*cO ֧cNS-~ݪH!^.L| -"30TƄLZyeq/a?2-xz Q7S^mr\\c|{Ga#4*#۶?B" {lK'f1CQ2';gi*[S%w /vMBSorP-ꪑ iX#ďLlt )wp -,Vcvq< (fb2qK=y?O &doJ( - {0 -QZv O%;Эimܯ3fCHW+(1|n 0B\2B!3qJ)YIXYFj#)!&l1pY -pb]i -3kY - 7EF~bT幩q&<Ƴ%_ V+Ÿ3Mʣ WVcH3L=R@Š N@Q;@E6B"VBK^ j{R./ ȯLu>gR_l%*'"4 -Z~P'ʛkyY |nk&#U.u τr2B2bw5olDas8~`6\_nZAʮĉPs_;eÌ.W%}`Y~bpJ.cA-BNR˒ lH8y%FZ2Bܡ2?Ă,P(\ ef Cݟ#4_!Ъ*Y<2OueT}YOL[#vJKk+M ]*VA"r0IfMͅegGIyl3 *d @nUtk,N%^:Z C^uܭ7:aËm nL ,pj eL~}຋}0x>_T$ZqY|d#tθequ֭QZDΒY_H,尘ƸIU.)=/I|jH ߶F`N}k$qWQQ~{\+rU.'˯K>EE2zŎ\ 7^ -8t8BXrYkmY/});fC35 BNBּLK%ō1 ez$R1qRGi*b*l o0y!Gjʱ]mNg"HR cZ=o0 `1mYZwaGe2 0,GYۈ_ŋ늆`-QS텈JETd&)$ծϿ1 -I3SpT +1<8aHg 'ۅ8P7Z%8[K9mD!'epYZf[o!RvHI6x升IAj,/?[o!]ǃ@Ɇҩxr2f\簀%' (Ұu` ]nX@*8.ѯ`KD6j>Ox(]W=pa2:S &XآtK]H`n`wTC*K'Wg}`#QmsI.[1Oqu-7xs+hX$9οYhؿ\T v33F]Ԕ E`T}Zs7Lf!` -E2J)ālPrD eRp5*=ԭ(ۈ#NqP>5;pԸG#<|/̬1ƿf<ܾ{9l.;a8.`X^ȃ]Γ~FpSV  |ތRhX1ܨm.WRylBFnt?3ܗ\+w+a:}bJؔ,K=@ -o-r\SB_|~VtzY `Sϙb[,JFw%*"15XZ=v.9`\W}ͶemoFNߘ?U]DUć3ݟ1 2ThJmذҜNB$VEl~j߸&_qƸMAB%tOvlV]r$ܲ3%)<~ɺﶌ¬ryc'Y{/Bb\nPcKy"bRTkգ#7*wr1QmX̾߇)e@WJ[w.؜%+iXS D,E\zm]q|3IO^KgH+*4.?Eo "G $* )P*gxf t4\-p/d[urc#TVK=+6LoT%,3hifEf*/i w}6}s0m1] `\h*ޡ,EjeRWR(WC~_Whx ^ A#y\ % ,_\Թ[x ؜^tĥ#u-LLw.G^Dm[]VDh4RT.PsxTx*e pG5esd,3.R(itk`MY%?)%K[+yTi~% -[YH+?ղ.2ı.< K4FBS-Snn#ΏbVxʓ`qh PzYK̹XzgDc\*`Bwʚh 񢶕׺{W @eMA(xhP-+"*bF@n+?ҪKHuȔ- fUQ76d&sJ~i ǖ -MO Q]*6#Ya{-JY04^S6ӖNhXOzimBYg?W:CLyxab̔fVqW:l%fgWC-¼1xbyǿʎrmH{u2Y h:qkl[ #_sĹle|0Rȝ$=* F< ץ$i811p1n=%Ft!|6m,FU7>ܧYw -#ѣJ`* (&cR( ٿ]4-<+Ikٽa1ia'r8rU`Lo|J;0J!}Cݼij-a*]$ƅa߉s/ .5E|3PAeeΡ bDyZĩ, mkŨ_? ?XCS -?OۯJQ8rV -Veþn*]*[Ҍ*zDNyJӺ|0aƩPeUA|,|ycB`Eڛ7*0u۱OxE9%9fao<Fj;)EH jھYft@2)0 y>c*0q)gܚkWv^9? r]j#l(zj_,Z0X];".(v{D!Ew`iF4J ~!Q۪EʏAʊL*uO@'}|hvqXN #cd1"[hԍ]q6<'io1YBKqXoH/H7t $uM2En0 TDl wm`*/a 6KaCx/0^*+v*M*U[lP[]JH>%cDBtb_ы=e?Jg]C_wQ1 pHZ6c(e o,qA.k0 FeL8Z_MEvz~,lK,/Q`FBoۢa]T0oj)<[猟E??ْ@ةlN_Ò%wB4xa^~bϘs-~+)|8,ࢊD__1^Kb?xD6gC@MW! Ml̄?^`d?ѹ/4%59qbCV&uK qu?)*!0rbP/d] 0CL [9j"OS=`uF;V,qOxg~,a)vCK%Aa5/ p¦Oa͕PCoqN `)IΥa/1Iyb65ܲCUJL hZ[;;3|Rq<7.5*}A|uvǵK4Bq>'rR  yUb£)@e?-cx|ϩbRR|{}ƻWt`t* <<\sUpW@mwB[.:q, qM뀭UhªEVUeķ̶7eܾ%Ku=р6e8R&( e \6?ѵ*G d[h%xk_-Tp{'ѕeGǍ1*#a|N) ~ddoe*(ӎۘGU*<+ |QP,Z1[Um*KXQB0ݥ] `UW9 T!b,HJ2 5W.m5G\#eܺq,--4)UB6W]4CG;FtJk{VxVܨlx.٩rXIC n;+ݧj>ʼPwB TU'R&:0; oRONK, *ѳ;թ[HdlUI[WO%_5/1em7ԼFʘé{j){NbB~.deLsqISj' T)BX,M9ڷ&Xr۟MYŠñBC0ef1_{0ҹykuvYٕ+*]{׎_`)q=bv߹ в()诂0o%>CR4L]W,y?] ShbM8nSy|$_ k2dv=K{䩉zVXF&ֵʁ6rb @Tّl}zlḛ#/5(T1 Vg` pZ#%hV`i 97iS(3);gCײ|e$U B(gh9H|_rq0ZZX8g4 -@GFF8_,\PVw -F+odŪmV'sGa 0~gj ߁Sᙨ3OF˕0ԸG/)VHؑ[r5Ҍ}|qR;F7*  -r,~bs~k^nۘ% ]FɛZxi)Yp\*j-裣NJmYKkg蟸$>hJ|+*0Y\g-SUc%z"^uK%Ħ2]`k1GۿM@.nKX֣hQ"P*H!CIڍD)plư! K['nSNM㤺ߐHF{!}Ii/b +Sa(Fĉ.>fe$2e< KQ=˾Voň"T%SzP0NGz-h/eټ*h{\&K*L-Glrp6U/*5[Uu j%B6~f_Ԇj[w <t2Rh(*הSEHϖ^|C3*=,AX#"1` u ĊBn0 -䩖*,5͝Cc>窩!̤/WWf]WEJy%.yYу,9&4|.P"׌ -"vBW&2DQul6Y8 mqQ,@ʘ%˗nQ*̧_ wPicLٝuFgl;.O\fU1zIY_F6Y0 -`r --ʴL2ri`5,%"Q4P%ݗ@ Y:˩ad 2 -@iwT ..= [0kiN"E gZ0% lli-_͡x!Jx 8Tz5N,K"[]61nRcVT[ij^x%%)~jSpo,U\\>Ta|mGE@/@5#:]M{hQH2tkԏ}VZl_Fl[fe LbEGRw`c`A߂e%*fcL8yƥ9.,Q - Q==XS6 - "[|vDn~TjtϲhiN*X&*- !4(?jG.vQUhh7:H*f]Ƶ>n8KeE -7r_q3c`YO2/x ]45MSWb$pwUv]=˺{;02mQ^Xk)M3kLWV 1OgnWVf{ -a2][*0e]@uh0Gsp -m:Z)kY'm*_ ]]v&ᘨqPy# hqa-Z -3]dBUlD1oqe‡E%޻c Vg4j}Y`F\,c5?g6<" n[ `aurjUBMm\0hEh%bWv>fMN; -RSd L<&n X=Vt}mO(gJb-j]5*z}N>e0 DvF^>xl5p\,QDGjqq -Dj찖Vs?̔uemi1юe)KAScŪLcHkB+;/qԩS$̷,LQzK]a[LA L}5F˼m_1[) Ʋ&q/.+˾Ya~.wI<ʜ@0 \CogRꏕp5zD֠+ғ-?-;@WE?,Mg}Ypj*_ܪ:R^5.]u$nZw n ( (lKD%WكطXs^&J=3lTJ7q上-fK/jϨyJ #M~nqJ\Γv/R|f"A;5i!Ɓ9#}Tß:*o,3x<ٰ!.,l:GTKBf&,"4CaWl3j\Y -ո?IkmQbLU,B0o@[P8J`6@-hHXWj>o,G+!Jâ R(dGJE?-{/KZ-Ro Hf^-5E\%9<ƳS7rE6 |Vas,x\"MiɈ-ͭˍQ~0$[t} LO#7qq"IWws[Rk".x)dĵ*Z˖T H.\HG@!ރ%@J`)Jz:e `o3@`_<]ؚp0<āZ< -e?)a2R< -V9nrAK;Gk I>\Cp%Y7ɛ*SZ T"˃n>NF* Gޠؑo'oD E(K8Wu+.3ԱG1[=YE^,0B,bp[+3G2襖Pj\2e)eTnxa:wȺ1?dgȄ}hng|*Q3?bN 7eGsqIWj#!xw;r Zpxj2)9⪙|*ڇ'Cj5\O%Pj @Kh5^ A'go] ;;U: -h>m&7Qb,< Uu{1{KVPqcЫF\'n-{[ >].3U|XMv/CΤr"C4 ͑bl/ab_mND?5K|Oy7 +,Ax{E[O&byKuX]Dzt21s^42XZ,J?:4(u>aڔNI7uB[_La`{L #_k}dP\1dq% Q31KܣvP0Euhnjy d)wԹG+J/fPfh B_!w:!]D\OR]+pܦ(+0.w0MJ!7Q(zu< Ճũe՘#1)͐fgR֋+GtyPZ+tq_,LJo!@Yg -/iꌡYTX}@E댶V̡鶟Gw ERSMۤI?A0[}j&oqg.w.(l+a4_r;,[j_. -8(MQZS_og%PJnT]Í熂e.UJYx%GCD09y˄] 2b$B Q s܈(wQV{G{7o}9f"h$ 2-_JJJnEL[(--V(|\#(W~&OLh}R+ wh? )) ɽC+ -F%[Uf"(yWW)t6k0jSA=Ku`AP5.-$ƪW5ψ ڪ%CjwDK88fSP`ÙEǢdvEMܸb ,rM| aݫHT?ŵ@ AY.d\VA1(M1/t0v"-]#싷%]Y" ƺu-Uh!$29Y_ҟ fPXYK.'1&&HZ9p~G W۫FR*P`&7Siw':y Stve`S9l¥(w*aosM̷\h qt o#--+ gx"))Ilk+LD2џ?˄8;Yu踩!xQs7T>^/4)nd.{ewIrvHKzWJՖJ= lOGkEj % .E2lITZv3*A R-m*f_T -|9I/<ƥ֢\\DCm-,3/}w3uE5OeC\N\Uf5qW@Bj$#: /4V(SYlTø5p nesph]IM,3Hld!vupJƺa p5-Z3H+ T3Z4wg;>Y;TC-i |(n=Jc`T(5bD#%N4vp`{_X5eBIz°*<9q5(z38LL5vm )Fx*xk,n;6&4">U~|0(Z -!ru4 m+-d337#zD!MDt 0hRr-RTTGXgxC5PF\8+T 6ۦԹpxgu FgLws21fAo-"֥NK7ܜ 1ʘP%9eBowLRjגedRzJ.!-@BwD~RW3Բ /P. 8|X6.PWU3zKwfaqrӺRz%7wf -W5 -)PF3J%5o'l^lyL- PW̚++CCaQt7wJ -7Zxu}J}\n&K'C}0*)nHzڮQى@I҄T|<>I_pBJ{-6j~A)b3oc 7+ > q)* |LebMQNQ X@Eƨ5.DLf@ʶruJ-8x[{$f2]}"j҄+Xfb/촽JZLڻa!:~uGyf-%"!Rּ({ILH -U#gBmf-z4K+C[64QCLe;!~`%BpL >)YvMڼ]Ҥ]N+o `2Ө?W3;C=, !KBٙph\ -KNZu`2.zbvpM -a"0}*2q$ -JƣUL>ͻY zQ`*U]F\%0[T`T/% _5잿,յStn.Gu;l6^_)W{"c_htESW[P.%TxA3 e`+\"M\ɶtS3q#vQB=*5Sp$UmbȼܪN/Bu5<5 -sLGfa}X*Pz1GUpf]ؽBqYG-\UJ3 -8OqL.ܯp`YE^X{/Q:F5UEd,I}N5 X b ]鵀Hc9JBP*Uk/6Z<BV3V @Mɖ)4xLg4~ށclFUs] ^mȔRϊ# D瞂L -ul#]le8ˆ T5?L(xɞ -eIJ -uP wYQe!6sQfxRpS$sh׋p ˳p~.Q̬ClW f.TOrlYU[&$xY{ -jRl'сL+@`] t#iQ"ѽ(!u2~25W_.Zw㺕-m*WQ& M{m#)]n +?p~MJ4Fv>x F|S+.Rv4]J\ZhjYB^$IeSB_Q[>o -Buzp5ꨲ|xD =Phgr+(;Σ~q*i䩥jKGFm&sE4O9Ƙ -2S<]zYH]’b"kUgN~=Q6Je [W>i[dv"\ ),-\ -QϹYK1xڰAx,0UPGXf!pQX0U - TŦXR{nfgoQ;0j\4Y).XJEaq]\J<[K/2Ug{4|DhWRʄc0foJ|1WKXH:YZFU?'Ke]^;ky cWcQc<-ĵqҧK^^Sg۞_x2 o?"XPO x&7yn=q\MAʫWB#"QK&_HUO8qsAik-qXh@bmhuKpWkR?#?%r 1qZ{6ϑLr/U>,=sKl)48U_s~&`iùLԫBh/H#Jϡ_lu]Q 5njXmXR^&lvԶR/-|18KvƐUDwrq02PKRԺ %{E22bfE.eScwGRߪk5U6j\Y.FXh?m穠Ś4Fzb -D%-E>4zuwD@`X-B] P":M ZjU K_^FKR[V^W,`UB c8ag~2izp~PJ2Mt+ڕ-O )۶w2(n06~-(~j:_F(|h5C[3P*EzU``g c7@;W%:S>a -4h{W?o54LD֥w -%;DžDuP;Ftab"]2QK]1IiݶesX 7l,"^(w*_uA.CۮZ@K28,ATc-@n\Ul[MJTc.0S|"TnaP5|p6C]f|:jiIK>IXw_ṋP2Zi]?=nb43R=?d>-Y4 OԃaO K&tOP'gXGNf}+LψKG8G2*RT-C*u)kJpruMB[HDFQE,do$-t%0j"qRU\JL%FƻVD]%꒔կl IB -1 > GIF}}MQu APXcM=;'nk~ -kЍ#&ӌ“>D; MJ6qo0.K{2̕#H3e?0%Fݤ< OV)l e4qRS˭Fϐރ`s? L@~\/ܻQ"PPZT. +)lgg"Зg.i}c47]lxT*ƥCZG ,^7\jtn"b4w"^͏H fRJ! -ͺڀ:HCS5nI@8 <ؠZB=U7MC}MX:Q LI@1'6z$2:5q:VĖ26h]pfoPO^-u d_USVS-6DDl[atTwPd^،q.qn=a\GS+$:29!T(|P.QCL0e_AƸ:g ,"Vu>IbRĭ3on>͔Cpj?G{1eH[[i<1^5DnD,i)LmUf5sqJ:P{Ck DSʵa님[R)a Et<3[ѨkmAXdPۺD^R/5V;ݰVmEcmNBZͭ G,1\lkdKz){"崽7 Q)-d*{:@Eg#d]T Lm8IRJ)+C̬ Xad}33eC}MTMQ[YǔR9w*T.\_$ʁ` -hc Tyq ]x'cyζa(*@lzZg*^v {Tv*'7ԊK4 UR+(ܸLIJ3W DZr2cFτcl -y_(GoIynezX[yqj(5uqy`Q-}4|"LoT /01 -ܿrȢb¯eDZG)@`!^@% ^LVZUe[UlliU!`G\Iw,,0K1{sJ |i)Tж5 *M% K^˞9,!+ - {k,!+3AlB9SGjkV]]\Z_0TpHĐlv -C -#.vY㠂AÐ 4d+,4Ae[< -7҉R$DDNĦz&%T5`"WP:X%ttuy2 -@)p:jQLqJ$. x1Oc_R*_I=ޅ5o([X<ES+ Ȼkn#8P*4GdP ~Zn0҂>F~-;s8"!X3Z2i!B;#iU*\ m -9.*nxB;2 [C2-J&%V iԹaG3Z -J[ Fl1p%⇹^%Jb\/3Kx`NRԮhkԥ?7j0v>I1ɤb_~m~ 1H?,b w\>0\d#c#zeTbs$%;!-$o(ȪF1)ef wRx'W,TDTT -ⒽCXm>Fmgn$~UK*8 4wCcxpTsek3QHYEA -@s(ٴ&[|hB-hI҉ͳ\P3BϒˍF {la f8jC/a[\OH}Irz;9?D3UD_e0s n_j0a 2ȵù\s9T)ӆB'1@~I䅕f#ٜAgr6оkRʰ>X|WglHԉ;bPXCB5ܲXRr;j.J6H[X7Gݪ;*.3GO] qV#, -] Ymc=p< G{ |*` VY]\g1n+ )- !fJE}v bJ <Ա{дV)Mp/~[H렕~ۄ3%h뎥7*卲P_x[g̍ ; )F(l"D -hr˕)Cc޽3P0 -cEc'>d$:(ry*I0T  rI wY^XH!ddn6\o^z ,oԩsulr_Gsb,Q#/m`j_Vu7E^&IEpaHVf/Y Y9w"2rRh$G7kˠWsb(Ct+YhrٸM׃ = nں)3HZI}$r^kYa醐 :͕nHbE2Fd*ҀWYFiJ"ݑS\X"fڗ~ % -É}尓VJ.Y*M[{|Y'[x3+qiVH3'o523E 1:4RZIMGːV: \@PRfSbtR4͐rܷukܠs_@."B_]j(pZ䌧r0H3\KRaѤi ] ]Eu-ԮQ(.ֽK\#\L% aO@Jq\-/5#@mAj-m -G8{mW@ sw{|Mp|0f oj/h2(L8jy"J+w1Y$-K]|c}k`gSHA{pVw*2QlF2Bb(v@QH*am-;%F=8Ysg -CfZsmtJNgaJ/Tj-MbaVĩ,$P@p2;jc]V\?_P̩q/Lhǟ5}K"+vFnC[51zBFKƁNš3R[MJɪJEl1D Rՙ |=޶}Eh n8ה2m yKj#j+u"t=٫ER\U07>!-!m[ksdh PMKp&&(u~Ir> 2b3Cf$PƵ n[EpG#n.xflm:/(yeq`Vd.T\yvtUf9i V`r8Z後_tw -# B_(VmLaY\~eTgUFK]P%E:9e~f/fڬ?QvTc4n-ʭœ}USU+-JUekVv^-!#96x-CV+Ļ3 tX;R7l f +$NL-Ʉ -=p0״|EB7p%vR*Wb_G}o\6 )r^ 3˚SmA5lcG} :f=+ظf;sHak -4͐WcXBSd#-ijy-'X$K66]? X}m^f%m}vҟ4lB댫}Sh,MډMi4:\KT7Et%I ,OQM6)RN޻KmȲRLJMX-Ԩ nQnh7e %@u*7nd7 -n rOM Y%k1W//ˍBL}ˊ}}D] v!sIr>YKwuB)n^6&"S5Rڸ)/ͳ(?:Qi_:E"7S~b8[ ӣh) IQ.))YFB\IirĔQ80/arIr*$|K4x%3^ԤE/JAX縲¨e87%\^F .3[.Y4_ᔔhyj,+QZ"E AHL+Rϐ C\LgFZiOs7C>GX'5:ͬ=e)A>Px"Ij.? ̾T:>yw- .*tv!idm q ݳwb0K2 sHgbЗi噍8y6]UD4VV"EˍG9ٸwPL;`ED`]jjXT=e}Ȣկl#)/OSVU{V\lf⛙Ŝ"UCvp*[[(nvwzvKn@h KtP )_ĕqLt[ADeokE$}"3`*\ Yb0"t?J[D~b,jpxHjkLG[!(X}AT7DO_0wfT&}B2VݦHP'/05B3 UnxtFFE`-X,e'k+զO3R?u+Yӛ=X(RV$ oq R Q Gjʀ!E%K?l#_2S 醺+3P)s>Cfyt~0/pF視_D=ۨ7yiu2 . sѕ9F`\e!nY;]*M[hïY"~+(N?0IT"kw 8^@ -ї!DVc9}*!~PUEiB 5)Ng{<7-v|USֈ4Y4 &P 7<2喁hH%kw8acfc ldZ]WuE;@%(d{9~Hm.vawHs|KIqo( ӵcFj٦_0CTɈGn/!v6zjQ<ԴVV0%}wݸOXcWU}EdekB -r&*u)Y@1+W g NBvsM'Vjʗ]K-T+YpDMe闡;U֡AD1 - +XD+A]1 U -4JURJ|i31SJMlZ~-&'^2ZwC/ z10Yg *zN8HJus54w7|ukuk?Q)¬R}il(w3ϲɺ㧋eܻf[*\vwP|+/DkҎsA/EHɥSIG&JH_[sփ+P4]WA-"J-]@1}ˉ5| WQ -qkB!oN")#1#xX[/̳S%/2%MI+kREVYR*,˸wưA3oi<̲LP2lsUyjw j7)1KB#5,:Ġ2A0~ Cg q0X -RH # jI+螠 * OKm`(\@tN…_Q~) -m~r0X )vQ̮Γ膬 >A-6 ffj-FbD.Rv-.^Ϣ/ -ڥ=T)E 5Xf!vXoU6ZbH̍G`Ke&Oh,KՃj$VP[4bZCpXb0L헬T[ʨ%#ܴCme{.ft1 K -Pw.P&S*1TTV-ogaF*b,>pԷOſ!"[ R!.h^XÛ|Z*1{He=(̿xp}jL^0Cx{l{"^=AfvaQKYd)w:JHʛHvrCdbOjj7g6~ GxAMD~`Dks-IVwxLE@KEﴓpHb:e=Y״flڑv<--QTX掾ScږaHƵ I0 -Uп2!D*À/TՑC)G0νYƣm BB:7;T5&!haH,?2l54_h07ln \JZx..Xu)2f^hqd bQ) % aw.#4kϭ7Q=ql3PUς .*VC6հU8H]IA[yE@cN!l#=^x>KBrPW 5_qt~>_jwiH!E0:l*lHqP%r$ VQeb2VY*U}Jn*xeQۃo=c;J{epRb$:"UQߩ֠-8bܨĕmN.JngY^eקDTPQP^TesL;koyaymFDSi]b c:3.B+7p/ -n.BE;q_$-2 R9#,v*-Gh}.[/j e<3ef1eYPUphsQUj+/Tw)ẗp<$!jp, M`;ig{'Y^0E1R֭=K (рpۣ%;OƊAdcMxc{zNW q[t\YE|p)~ԗ<} iUdoXڱqE >EtDe|+?R[t&쑭_\v3{;Wu ~$f}?RPPX (`m̲S5JbwJ>YP. 튂p>*!-!\j Ws& ) 04լ=Sp+OWjMD,RVX"Ez豖a?VAQ5)J~pWݷY ¶՛dn|B菬ЃHSV(;bd=Ф%!#zbdo --!MZ)HlkadfǞջj\1& -_&,mP2HB+A| nnXAA:(,4Ia~hZ;pgCG]w -ыrEj%8-pR`0c]ڰIGΐ_W9\ȵy^us&Q%JzTj.[ȷ Srv1ݲb-h% -jjAƼa Mԯk\^8gX86qC T$Eiw}Mj|Eiq/Qp6Ã4];t? A7 x^% -yKԬJ3 W-Ki/ w2*-# -kbgmkuI DsxR$0ͣ?JRR[ɩEʶ>L-(9IJ7]k`8>HgD_ҭpgkQi?X 'EԂy%+aK f~ En{#(HaaR$ZN}!,5HK *E)8)2JQ&"[:QEtMV_hnl@Y6JX}. T.ԺnTGDX("HH[xwdW&W ,D_#J6xÈբ`q9\24I!wѠbj.hU1C/?eW0_K1H]2S5aUElU*`DY+A`)K-UhёPOg X!(էZ51( R/ozgI؅5Zhu¦ g ~Vf`l镂ȝ-Y٨Dqwh6mB7w`U0Zti,ɧ}`B4MueR#:ω56B>$彨q4VdQfT"K̽e\H7tTLWԲQ*;%T Lp^ Ip̤c|+N4Uڭupsn\aKO n ނjq(;KmCScܨ[Hj 1 T%D @SخciޕU ^^x>%蹬vŨL\[/\d &kZI-8 <g<Xao-RUAKP?K19yہ+(o3;%áry_p%4Ŕ<jYUK9o~j6$e sTTLA:bdSsQQ,7M/"gBDԑȯoܟaX 7xO c-^-D=uP\qU:m7䉰ڞ[X<M0mR{˙L;E+gZ=B2|li~xQ(ݟM:cGH@R3R--;colqpkVOGĻɯnWnGH$!0PIkeC7[ɬ{wD^~P/ꆪE<;@ -MJ -&YG6%J9;ٍRHpˎfernkdY%N pb FfQP\k@6+Z=u"G\e7* mPSZ3ih;hޣV`B8u380ɟ3w ܵmV.ȦvBeg#.O hȒ ~tDԸz+sG+ɭ`@Uͤjg+'Do|pi&. -H utP[@PRd6|o -^% +J# rs829cQB*CJ1I29\a -_b VEq! -7,y ԾS9n%`i,ݑߞ72b֕-܆vh ^ψyP,nRTګӣd`KSHƱ0ę&f! ׷iov̕IMDe3| -GG»NaR֖QuWczkRe:E 1ҡDY?pNjw - m Q+77@+a srp^!!\3-cOu2*Tx))jU`r -/|ꐿww7}WJˇDCsWCK\[U_ +V[|DnEB K ]^]S\vp;Uaf0E$US\7J2+a,Cq~l͓#,)7q+z*]u 9&(#C -΢%3PUJ1W}_YF'E{ -Ju5*)bWCN3' X>Y$]'1_Hq+}y*˜Av *Y0kD. -Kj-?Əi A.U p`!1~5(Q%gC3S3V}0@*b.ǭE1.Yx̬J%pYII躌X|ItɌ|4n m(fc7XF\BU-:MWszR:1-ޠb""FßDT }BBc{NS; R -WAaX)x_#7q'uԣVz2ϒ !Bvl\LV, o0O}ﮯ }\fif;Ʌ]j>eY]9][h|\exaeQ+*z7bTśolX%J/y_w\_fW'bJP%wc09 f&DǼ?䡻NtUw[.tLe#XLmVƈ -PF۹JUpMxF -u}02(G4%#.a'7oMRX7Ae*[2 -WlE-B*RlǶb:wjD -QV m0qcõeCcWQ:!1ʸT_{K^"Y6@ }Qa -Gf"[f4+UT&5:%5Il -FCHXo5(3[c|Z.5dl`FЉŨlߘu|^'1- ^:PtCtj!(mkHg舆bVd[Us,6ҹK>Ƀ}af E/Q&f<|݆Vhf*Գ9cY% -lk{7)C1[ugb,Q+ jO wt5|q"uQwѨ0U §V& -w;eq @%N.>ĩRą-#+!aymr奀'ZWb#%?1Tsj/`MUj5*_@LkuZ 7(o} H@C0\{Z0+SG@,R WMj-HzߺRis/a#ȋ5Mv>ƅ"uShJ宙_s/kB\\qrܨ˖ECEQkCl -#0JL $34U1)xZ;+hX}cmᵘZfnYxHGYXÌrS9{P 0(n@v Ҡ} ݽX6̺f#՝Gk30FQ f!D]>||,l)xo=vEqw,&;"R\lN#UvVD^wvBluc:)Q0Hӏj*f4 )vPg.|O&4@i1Լٜ)bb<h%*궻nQ ̊nFcJR7Ӣ,xWn:@Y?L%RUZ~*lGaS~Fi#J֟wxQŽ ewƭK j#PG4)>VM O?chldmp'`.`{l:FA^_̽AYP̮Z?W :!^)|"q+ճGD#~lAx֍Ś/r]ƈ'zđs/@@n[*[F[vRC;B\htc}> s"ۤkDE-!TNJ\=RFU887&:x -Hg(Ԭ.dCQMA]BȻ8x -h$5.u?<a~ưe?T\$LŘF;R)2\%ks>ef~Lqs lV7f{dwDe[A(ap8j~*G>,`}V )Y[.&JYqBWC&?*n Ӹ|ąp_@.⑖bjXp1t䎅1:/K!7`ú+B{#Չ®IU pܺ -8n1^.STƮT)?.w?>$F=o{ɂڔPb?s5#7; dI~]bf<WQ躁Q5< Mn',7?=Tke@tI|T ]&,/:әX:upTCOx=Ih5 V g|ü$ݢeV ޡGlQ`#ߗ>B#+V_uE2ˋ-g6zC*ԡnz/LoOChM̼km8e_ 3,{P3,Tu -{L{>act|XgץnQn Tj_L7qecVؤ3],5 :b]!b^T8h.n_/Th4a. E*>M ځ+%-5/ y?˦}x⥚{,~wk]EiEFǤS(#ҝbĦi3TB7 (jbK)#PeG͘xu*6zPhe(҆v@WĮW4ĥK\Mg cA*0YԪ{"4f|`@x,aDdٕrQV0 -U}pc%1Wfרt"jW PLUaH)X vP%P01aS ~>?l?.؇bamCh+&xGԋ"c -eSr -u7(gZjV5eg6lwңA8սGu|FeѷK0+Hj&V)*egs\ SP Pc[:X!u]jZԶU_=)baz4rޛZ+DF <RSމ^-G"?O<킉_1f pm!S$RǏe>8\*jSd}Lc)0KvZ6D~M%vWDEMiK*V!/8W;ٖ҈ .aeg̸,7 T.׫IT|ܶ:suď )~4%)Mt>JY - U3 0v(>L w|fԲeXi\|JqRsyrx,;Q7(\aJ -1 G~,ynZk/Qx&/**Kơ蕙sM2[AYsZaB7> b${2F̏ *1Hiecsl|`_j9(mh:.<渻€ /rj '[$RvR!X^i] -JIVP1c>Z3Du?#g/$9}4.gky,7 ڄLl$+xIEǡ FZ{ -1Z@PVز j 5v",Ow ~rȡuZKJje%rX \*;0{v\C^qau`!4\]]F P笿2kPPޫ -H#e-oRǎp[ -%v --Gٌd/k&-PiW L*bkHtQ൤<~U  UB3V3g 8mk/%_!b -*pڴ2UkMP%~ [L PD5G[J F݀Ty֚6OnJ;*DgxDm'oA}b0hhՈiKBVxg,j sP(wLpqy*X%F͐%b+Rr.\Q.TRbֶr>:5KmƢz~˹[׍Z>~M}!K̹D^ȒWK|T<).Ac5sPu͗tYuІ VۖIcȰ*C^a.S3TEj^#Lc/.ڶShy%r3k*P_`xHtr:I[ȥ{1R%bGBX/^v.1x^r %͑N|@Qdme4V f..Eu.-3R%a 61KwFH+!`1׋J!|@Vd=T1#~#J)KCm.TH\n-COA'LΥowm\ &s[sD*1fwRTcN*>akؑ Nܒ]_u?l2zDV[W#赝zNq -oAp`wgp_jo2fɜj~Z@;榃uCJ -6Cg{z6m6`T@kC -L(_2 mF>wEYP#bNS"gCRX$v֭GCH`kq~`Sis+-iJ'jjfP31[k aC:%pdĺƥf ;@lJ\ 0l؎ZF-= ꣮d z5\Cp˵3:w4P?,F6Z ?'Gr{KXw)sh87T sU+{4Kaf%a -fB(_P$0=FW2+tkIM nru -* 1d(B |$OMl+W~|Շ -8֞uib &2uъ?`d jG/MCϝl?sEWq_&W!97\+ʃB_17T_&]WR@*|`2Nn]up|K\JtJIRDd,tU๺dzK XD0H<)D{FMl`𚛉*r3§L"ĝj]JTMĨL^c;檖[ ~ϚܢK)rtˉ؍eEV9艶āW -Dek<at,WP8u? S"rܦ2]-8|&uᎧp-mn/ k̾FVw\-_Amenhqc5muQ/o$Dmr}`I]@)\qD\*RNF%_V‘HueJ;~j! -]킭jJS6^d#eY2rf$XGqt}BK"JU15c=xp7b>CnIw޷i%k]@ *[e_Mmkl T-Q}3itJ/Xh|NS*Y?L!a_j6e8Q`,)u%QvS7BE 5 L}E0 -Bqj̐GVɸR4(]Kyhu>0ehJ%v7,T6t_O{-o+XKަ 4uYDZU>ȤU|on"[lwܝO!#t/BR0;?V5dVX->z85Zk޷UvڧQ[: -_p=tkö;5<+c{pp_M}#0/"\?Z:4DH_ETo0*}iV3L 69k}"W`09 Fq/A_'O +NP Q!hwdcd9֢K"Qc*4B T ;#Gtifٯ.˪br+),Y$PSϰ&fs7(rOFSE/0EQ| @Q,ƉM!T籰 26M6*LT@u*CtEėH,峲6K¼(&\/Y)w])2,{ ]ƱD`.zŔǺ'ΡPD rKC2U$q\!o)DE1HjEY(HJVA $t~x,a)?(UVUΖk7 շҺ-%MT,]#Jm'?ҍf߅?.FC lsT'Y| K|+cSE*"l~fy:=Ł{+CۍR,yMLgRĉbD6:Xg'OȰvs,|-+exQƣ5șGKn b!G 3.7p\qi%d E55{ynX'K^Ʈ 3nCXQsa"LZ]2K;~p07WK LF!u!BQ*?C\-b]_ -b;xajKБ; =ia4  vҘ/1&(+d4qhPD -z4QJl< &XZNEP.&fՖO"꩙"D:1tMGS 5|]LGq0D*018[j%\ 0Ж׀+/LTkNoZ-hEڎk^ Es::l!;h1nɵx:{''#1VHv0(`&b -tuuwTmQ]"BZZ*5&%UYl>YS_I8HuWB-pM*o 2*s`8-:t>F*5>[x!v2}h efbH4u:%UV! - v1[LP] w>B[n;j&=#[S .Չ.Y}Y"֩ؖɻR=d>-Z/QrD;tQy8;7E4yXڱư ,U>0Ȩ&&d[Tw Dko ,9+Y!Am-@UR"-Q E'fnYO  `qƇRUmr7TU 2 DK(BzF3ۿi Eml;Lzbl2p YְDUr0/U^OŒI(j֒OZ 2õ*F}ا@ jY}u rZC~$X&ݖOnq!L¤* C1bCs8YT[؇}ܳ5گ@GUS7ODO&CCqEe,jH)7-TS9X\B_u_reUL8@He_A%t[qrv_5 Ŭ D/<]Gw T^2EZ1 -p懊{⸮MJ -B_I:eUpԼK)f8&͓_1h츶PgNQ^DW )m¥]Q}c4}ѐz!QCt%Ll A~{)O7Z'CGea ?断'p=j#{)o-{Tf:N&jC,x왌4;Lx"0|IL`+i1s;1Y-&#c\-Kx~_ -$5o⬖OE/ф:9ZWzPJ%:Ĥ1Ql % `eT- SJ&P/o(ZP - `^_)miJemgp 9Pj\ns8?,/<8i_!@-yf@7wŜ 4\xQsD*$cn85Ig5Ga ^KG>ڵZS+Ei7n+v,X/X*kq A -.[n8.x$Ln%Կ2\%n ܶnuLUH&b$ŰcƵy.)Ӆ# 7EOY[ƔnP o -_^_>)c(%kJ+*$LŮ i7`Z#s7eT* e*I-qQfSLȷ.bb]L #Qn~1lxh  0mՌMfl# ^DS|08vkBXF[o@Pf;%:$^-X~1dzkGG0/FX5zF9iؒz{iIND[Y49%LWP4ʰ.%sQQ)_%>{8|Z[/I map1[ZJ \k> -FQD &,P?¥nJ1}_;_\]$}.)^‚F?2GG+ sLljM,Ԩ12{X J|N̴ۡQA?:2w ٳ6%%-c=?A6ǴJIKpzd6U-Xw{F4j8%mH]CWt}KɨQnvv.(C@vġjlCP[QV5./nthlrX wITXc|B`] Ru^'Kcg~7p`Ah}veUn);& Fy$uIP+ Nˌ,..(#T1@ů~ N]AlNsqA~cfL%!0iǧFSN˸ҫuE@D|z]U@կcB=m12bj8"{)TYBT4lhxHnELtR]ѳcD|G/ ڨ.>%ԵfNT$%Z\֣F{,!^e<:%Աuė-H0s.Ӕ m3r7Q%y[qeU 厝J]TnnYKRqe#[/%/X]+YQU4Yb~_}>TY35׆3ӻ SǞ$Yҿc]#BdL" D -RnUULJ[:4qRhU g̩SCJe.%w"j͆ͻG*m($Ys&U\/LS5|+ԡ#p=R6=J04k{'ffeuurTw7vZ! -x+f0T6?LKBdoIq+:CC+ȩPhTkr*⺖Ti$4RM#ԦYpv2s86ʞ"D; -tGo\u U%f)*BSKp-[1u-E*\x('R G&j W嘵p+$|cĀϑ -ǽef -۩kQ]UfԸƺ0*\<ʼnd6Xa!z3LUJoeu5FҐ2/0DGp~ GS@cWעdHfiAHtje1ij.=J*RaDaq P`#aulz`a -x kaZT*fSFr[+SPD\:γ.^crbhE`ʿ64Ȕ^t.5Q?M=°'" asqOVj<# U˞3&wSrxEQ;pjªmWV71m]KH|#&S)5e{݄ rs}+1U6JSQ:q=Mb7X_G%|D'eƛH/pUZ%Ļ#UpT}1IVzpOwf0q`Ԭ3X$AEv,y]lyNⳛV.=jPV0@h8a5vO{0mR[¥IEIP c ڼnwoS41$}HX%"B"3EBKhX\l9Dcl  WU6 Ģ>H C׿Y"fꋕ,e6kzTHӗ[F*mlNi+B !L%zT:n$ hȢK |+qeqy`7W xJ+B.ڕ^6jSkXd].| C&`u;QZ2~HKRe^&a_.7E%)mt>l-ߕcft170Lj_<{m|jfSܩE\5ÍTwSU7u7edԭ蚋.]ƪf.=I 2'Ff3(^җ = C\SG -GEL5!bq** *DdD -EMyY3#"SPeeeARcouEczV 7I|b+6lUϠKtǺzF__d12|QD: BVPbJҺ4Rc2bP6S,'cU/BWh3Ԩy m8/JYc4U`4Sb|Lx\mNKKy\/bl׈@Կi4OVQ=D~UfHLK#t;5uی(m`XtQ=\(: ǂM C,?6(9bM!Kete1/VJm39D\:ǏlŴNӺFjZ~ENHqԗT-;PQiV| `JX¬Z!a%6F'1 4W -9 jݜ jdX[Z.8*wPt}ȣ?Gl -B@,~slNgp>qo0]K; SK0*o+RQsq)y(50sbc5p2!]{JcRUT4|rU;7?C`GOE(YR(Ќd? t`&+Fy`Dϫ;“2Tu{"IvWF.TЀ+k-3|( Y<qE 5Әa!Թn"X?1|rۓӕ gqmjt(04=/(vC6K;3Q)'a%HG;>!=N -t^ r"rƛ$Ƕ=APxΆmg?Qp=gLGDbVzFxlY GTWֱ57sew -|Ƹ M%u {RۨĨB`cg숔W&u]H}?A".vѫawS+s8.ul f/)bgu7Hp -g7Mot.62 BHZt6Sh`MvnBPHAfhgx7~#EQ]7 UCdʮ8S-|\"([ B֯h*[Tehܨz,c%PL m0<4ne0 B$7*%q<1+(Z&"xLiek+7)ny0̾T# -b{rS2/lR0HBR7`]Wܾ9fr|Lஞ-̣>eˢ,Bo'oP8 &EӮw7,uSRHG+X6@~,Y*Ɇ{YpA-hC GTEdP5 %םVTh~'&j% pbK},K -5:`2 Ԟ 2\YSEKE -Tob'6]gA`D_C$_%?B΅m$EIy -0#8(N -*QQ%bUrC/ԩT\7o &w ~;(i׹j Xv -?(IM7/EOrR¡.l2QWi͘ڡi$ls⽑ -2PbxK`e˔ql)3Cf\B2S_qH, ^*(?㗘%*?d{0@1mMu8&"N 5>aӳSVłOp۸+ʪ^&{嘶0n3bN]-"]K246%e; ,H0U"ElX1_qڮ-l(Ɉ}~GPndT-\bSr0/G s znSsAPR.4Pۚ|Q<ײA:aːa 09.-_2z=@Q-{U a4_ KE]M(u`N+wZ/W3>0jOv*˔BUc.e%Vr0;(ypFF%]%ԲTƢ¼pUq1, _T e%G@F.3r[0$ {n]\NI|.ek&~Y6{K+RQpVQ#e7~_bP#;Kj R\j.rKҟU$m:KRfus6ƻ1JD =OP˕T/1.1$W^vP"1b1ln=ʯ!HQ3*/6]ℱUP݄/CKIbTXI#A-hH) -VQ, ˀ-kv4kDC -] GUǥ~{|U1{-;X nI}J zn+ω|`o`}Y\WmB%xW+EVJ]Fu gLa(:IvΡ>Le|Z pJqsֵB:|\[䕝57, ֿK׺k|f7i"n*S``}2M2`U㻄haL -yjʼsL*j啧1Pp/M~P QP.+0-@ma4_*h'@XWZ<٪t4C/ZQ+5m~ją+6垟r^h2Kpo[̅"X60P>ph0 K. ""0|Kj,!7?Fqek v4'&2Rc -4bHeI#}_qBTK(U^EQajv -ܞ(Vy~Al9~ϷV.P*7VeBgCIYR!Q[V+S -G͵݋SW4rg7jT&0K@7)Q;t n`{,uZ]C,40,Ŗb* ܨF)Y狭b;Ġ|3KP~N ê]R:.__>b,=gˇVUx.%8b*o44>qLT&jj))U}KV_FT)6{&y+-C]**x -LRNvjk-b`ci -# XO#h[eH8q^g-ԔX_GZ -2 &z)SQ% -EXoD6|6$mծ[ط-JE:33XL5rZC!l U aDIbiUGo.{5D"+u4$ s5eW -]ʁ -A"5SXBSlضich$U eT\s 1|]DP8k,2̀SqU6 jfW:/5 -3G$F -uKYTr{`1%R3|T]SR?&&x c8#}N/5{ݒ(F%vxb@nel(M#)컠S9[R//5H,p]tK&*[DF*5 -R-}wtKjXPGj+4rp`7c)Ei6828|Cmzj5X,%Jx'W pm^*0GP`bj=q Cv2C_8j0OW=2_/"L e2pQm$c-n8Vї+"98v1طa89k~^-~eMUfLi!WU?uc1l-V(?C)>'wrP%H{e 32RYd⡫" VKh\ė+,%F1%T+tJ n'f F7:B*̝C=1 m֦ ]0cURk/ @6P1`DpuZNĪD! -E\u5;kP#7*a5|2ʞNM#\AotbO^i!F_qp%T,ጹiS<]: -NQ]F?$?j6:BbAƒ.Jk>zFݱ3ZzcYy S՚K_D~f,ȘUՆ,GPXE"i[UĘ41``U;ȑ;yjdjҡ,*&ZÀ-e(=` j)[u䴯6C$q&Y9] n#ۘ(Aev;nGMʪW1Q:[USw@&LycִTN.)ڸj>*5'e`* Y@|NZvz'Jnwh>00 KgzS_QVn}ϲSMÊ̹}MU4%d,XfbFU"_ar*; Җ1\A2FkYz8@;G̸mnQ2Y~+B@7S){!mVj^6 e"՟M\]ib1#Z iW(U.~aҷԭ+Ci1C>xic1d+Ŕׯ/V~1XZU/)ȁYeq}i!As` -[ZO -醙LN{%V(qBAo}4GNĻf ԥP9ѥ?mbCoU03a г,~T9vL9d]:%ip/`F( -R{;cU wzR "ή2_rWbA}F\ -A5BLQ/_@ČOv d Ǹ^"ΦIݱch5v;xL?&>56y2T"A5J:;cާA6EȨ6A Z KIg20pKIJ>%`wnTUVKJ.D(hA]KCZ.RAtG^~uծ=|LdI&f)mSn!aܮßo .u.7QCl3cFø1j,rq\l*&bBW%W/¦e%Q%qSS4,Lt -FT{#َ2b]vmor@"ȫW: X''pB5uU8\74"߶6!zKZU|JÅJډ/)[.xsPG|_ .-F}pax&cQ)lJXwPb/5+ 1*U<۹}~F&^c^0$&3#}j{mFMY -FވuޠR$n>IUAwXR~Jc\ܻvmv U|,.Nql<ľtWKBĉD K͏Kn7L` !J],A %.YT - e%}=T<\BڐUR5 -p^X,nϹxTdmLQJoܝz{ QMm8qsARܞܱ0[)\UjTڋn!sjUDOxBj\.[,uj6XZ:uv+utMERq7t5XuIXTjE<ӯv ^k+#Lvփ)^j-WV%eVAr (UW=quIk仵﹚Y\ pV %@dd]b%/I66v,0k{HyU}AzUkQJ[YڃieW t>:p{[}]c1^ -v`kWB %6U |ͪ{Zћ";OXy U%NAsjhUvK>>cD {r -Q|ƙF| M1Tˤ{KhK<ս P/ʭitpB/j% ¶Z^?t=qoNbF/uBnKXY{"k5pa>ݙ7]+z`@Wd2N SmS0=c_(i*iDPKTE>! {wR<.;yj oki.RʄhK)h{G@M[Bk/uY -ص%Vt.SjV=3ʱ4ui,2-+ڂXJBKS.Z,!Z|! 0f#u[]A]q9~Y'f3Jt<B .u5RB`XD[Y ܀qE&^<3%[_P!B&k-]0DdzhtP/0oV -"Va qFmD퍢~eͱZY#<y .Skj@eM0S9~"0%AGMav^٘^Xu{`mP ^e=Ю,$g,c+ٲljap`-Cicv#U# z*YCm&D>:q*i9z,5AWM'2;pG6 m P-}g 7ѕzؾբ hGEpʚTbjUT8|!Q7QHbnP5oQizͣ=be#:/⦳Ӫjm'ÿR:~pmK+o:R+k hT؂ T6`%8Vĕ-΃ՌJjFQ7Pe]'W5]y(ZL\nf4[_'tU*!y"MAL;n3 ->45t ~d@G'T[J'm]HbPT{T!o&,u)Y_.! QچL,x@RS#.aA-ڠ`ʴ,kӭz_i~AVc܌XHo,\ބ-G'#@bٲ'{jZ͍r|ڗ-Ae.lN@VWIQ4ԥG#OS5TLAaUSJ *M}uӅOLGlJ};[6pН63| 1˟2eT$cT*Pe#F`Չ) 8r09RTUsU ]m -o8ǝEdz?CP((yY.bʉP̨NNT8V\8nܫ5-j'MNcS)}qS+ƇI@;t[1wSC$#_A>xkE3oR2W/@FKN`o>.}dL1Y+2lJ.Wsm-eW>\)%~qA)vJj0I5. bʞlRGAC+3_3.\Ե,D*Z< m/<0Ca'HLS)6U~;VKl #-\]|n-X v"(vy0WT>w%S]S+B op6.HQAw۟آב9PE0n諉& \TmmQ -5PXt*Nf3>E[nu-55beu^un5dJe6X\0.V`ɼPa ~eBg4.t5mDRk9ӳi! XdG(6;Ԡ86Q1/>q7VD%ѦYڑ{+52TlV`R5)o3=\=S40m(ݣړXTR.)e̊0/_ɐf KlE"\~>nMp<~)^E{+iiaG,Vп/jFg}7ݟ}k/#",uD3@kbJa!OFQLe; ^["7*5Y?^hԗI677jXQng?CG vhZs20ۂ&䦫NI&L&*wںd &j }Z/T|qb" UHPفBn -^@+H-?p?2cZ+eCWfatD\~Z’K-σD+]%Bv$Gn@W Pň(MY۴fc&.WEe0 ,g`(@JטO6^(s0dR*@baD.^ `rK|f!\cCxe^rG'Co!FjYBQ -%(eQT!w3W+rī/|7w/-EX{>Sؤ~ D'MQ#c##T>;&-ޡiS`GwΜں2ݺi `V!UD!s ֿe.]3rOS73 2L]J-L̬Øtod*OaS#]t5}A -L_u4UW2#i20tw<26P*j H}r"ISLh{1!~e\YeVn_jFF8̵q M堪B(\R0H4.ZDΐ -}2#v?)eb$fUFTRڎ>0 -})VcjjzigN'3c, - b3>v肎P_P@=qs,F0j^vd(mXREeuc;e GR\EBaaڸy⦄~ ,*A5SA6*Ҵ{QbA[Vuࠛo,ٗJB .$+~dU5lt3j27Rm_QnՇ4*pRkEc1|'Lۗ0! --(PBWE -ϦaY+'$пP>H-TPcܤʫs|u'D×|QE@E)8X3?yEB7c>ޟ!޼eiU0*,S-3{!nSur y:5߹J'uԶ^ -l01Yn/DorDbo;p![./N(=Coe -`DMF=7N]UO[F\n.mAtp bU`?1*rC &+ٹqlWQ:L!sU*R8#~"4tMN^hU~N~+rZ\GuMFTQ֥l2|5a}(AfPE{(VbD57sl #8w&Yn; ܤyfpFr\Q|ܮQD(vxW|$. -*VLICwWYីHb7G 1YU.\r a u76 X0ߨQ$[2tJ#3UWaR+PmCc$:c rI'-wEQ"PKʼn -2ڪFRsUDO먓4`הusT΅bcVo!Wc"R.l^eu}Y;?^A+mꊊ6!?ǢcM`We/HleO&hZ}DA}u,E1{&n6V&!UEJȵXw+ٿmBu۱FJ'j8a-[UjYD?*e=@_?ԣߨmw8eY򄔔Fv7kV\A"S l([u2 -eB4K3,뵺TYj0_ A^ -(Ձ<2kim\RS[%.]yUk]k if$'w *D0{d0fP꭪hqD'{5x!Ȯ1>n~ I'T?"r?eH%+bCl gan]Į]p"W 𒹹dO<U^$=D >-ڈ!t9JP+PY^r@?UBS0;$%fgp1kULJ\.1jxcG90.xE% T;Ĩ.p_]ӱ, -K7WĶ^fUIqa3w0( -L /L-`JXH^&"Q4*!-˨Wr㰏"qpa W -%Ws/wPJ 1?qxIVK×9$&,!/qVf$;& ELXVQвLuFLKY}FkhU| -?USt;3`|Ӂ \"#R/GweLf1u27xteJc GFkKvTԬg0䘩Y8!h!-B.Wʝ:uf7Ejf`ˊY]EA#^b4 8bA710D(drJ~̾ lB1|X]pH/OkETZYe+ }H*^A;ZVqar1/&%g*jwg'5ƽ'Rog2ƪ0V&#]b!{.WsbuAGB_ ʌW%ø8U٣O\Km/*NC˶"zֈ˽˸g2RᴈC,,{_4$_\A tԩȬL%U:°KĻ suvC.GI{SQ)o![m)4^ yR:ͫtk}ؔip (r_l}}ZC(G[XX/DHK(z!) -!Z=L-`?.\,EeVe(RŽ!.̎M*(j_2ܰנ֧lԚD8[2Uei4^pW߅Vt=1`4@qVĥP FɏQp&棓J -#z445?Ҕ@.ʥiI"HOpQ#zPħʽu"`Ca=0WJhZx@kLWs~?1L!r޸$۳FjQ!ih_>sfVi:ջW:oKz.mPKP*v0W-++e'DaT,>j.[UWrmc~蒋J[fn9!(_ˉ #LV4̊lh֍^( 5d@.պ]Tpm\|闸ZԨu{u͟KQZѩᜍa%C+"gZ~ - # o#Mjv˗BS+حaJ(+dK`B=XRڶ"4Ьb Bn2vՆJ偈JOƸRCMT*<d WY/#UF#T)pf J ,Op豤?KE/ΕOkr?nzŒsfs>'dS%ƚfIl2놐{GoiXz8Pp*40%M?/T KԨxH5Sn3T^TĴWd%+'7-nY$8Tn5>fvK>5qyIJmK>!\)A+ )L^51Pxɺ9([k$_ N^FQ*@m)hY.dwSRmX7 6Clo`[#.,[mn8k" jrLxF$c?J R$5Q͆X{!z./OE:0zB%baؾM7l12#L&7)^ 2r0ZDk?ě, %eZ@Ngv#oeV1'_CqGC+?u7_IU_Ub],.gqMZ11p݌#_ݟTbe^zR>b 2B[Gl66Ew(|C.V}FU=]PڱruߘN7n/L(V -!Vg>TzYvr|1Wm12,>-U56H"UoF.9HhvTUԼݩE^}7(mkxQ|C_7R-ﰫef|]Y}ܺv1~^%?]'qùw SX&Fؚ`pjڰnN EQ*Q6 L A?` !@ BkҶ7hV$麀%W>d>LMNz qu`Mxsd$rjtԎ,0 7ڞRBtLdٯH-OP̎ܗCm*-R>y}wQģcu=!6K]`E am>VtCfoV1q۝O~e| N@syFjLWm }Kؿ18/YD╜CHo$܎FQt$Dl̃!wƗAaڋ/t؅ylw'@fb,4 1h6La?\ugY!F}Y6%QkWU {_7yV?'FP;-`p -"DR37,I'oH:T1UQ1b@kT5F'kG'J#2\gnq/g\= gzUH枵Ճ.(xN׋ՐKujSXԨLu^7- LZNDmWF+n%.Z*O]PG{ :"{Wԩ\wɮ1Z***ZAM2ɩv*.e:kc,_s8̊&mfuE >S9A',u]c=CL.㏘%C7`0./ < XQ.YW O~|:mXK2 @2ʇ%F\Xn LjhU0#reG]Jx7ѧ>GEmļ`%,}S<2Êpu\{ԨK0PO88dcS|Σ/pD c(ѿOϻn̅Te>h[<M^Fwh9Ba@(&$i?L^RT1t2>*%[,N#_g MMƽ^իA+ kWY <7DyAb -&]UQH_mǵ̒~,J) F6JMtLtU- F`3H1} \>db@BҰ҉"ms =N+HMǰOY v&-z{qe޼ml1T+C[z`Sքއ2&ۦEQlBڪY Ah({_ uA\s&d)UkB;ɥCCBڌ2zE~kڧCVWƀȲQWbnbiH\)ZH$7&Sb7} CށKB/p.ނba2VfBEV --rbD"stƢZV_s=C9Oʀ+i$gsyO d^Vŀht\n&"@"`vySMU(dƃ3}elcY>a~jH\}CTA7'jou6FW#k$ll(a -[KU ~ȪA$<;{*Q)ϛI  ˍ]FT/ -*yV --XUQKvv:Z g|RJC djThif5`3sɳk 7mCUFa+ -[tWԩl.6Yp=KYvWޝ_•Nb K5eE)*JmRBm{g2YEG,2v[B&0%Qpr]7tpDlG_&F&Mf JJt,1H(F Ţov%z\/Pm1+R+a٢ ` -~u T8hfʙP*69>s~]i:F%ǵ÷OFb" ڨA, j8ʖ lb+!:]"U@ZCkjHs:1dvf -h,Ic UJ0ʉ^PGQ1L'`&$(fN22[eX&!PPXA.~L~zl1p&Q E֬"cٔ0Yu$R#P \q|2w -ƌ֠)an01b2jwlbQo*MB",K!>"G#!us*Zs4߹MrQV.}3q)JP*5Uu݆J )kijɳ|8-/ E=FJuG -ȮL -- @I]@l65k/  h_,qlRvrX|*W_w@ee4W(})?JĢV[Q<@AX~ ) O^jWZQF}XmKrB$3)!n:I]ѯld?j6=ɳwbKڜ=*wdlvIQNT\ ?+π<Ib."') 4EbuJ Wz*hKXQ0C±*zaMbZ0(hmf2 RjO% =lj \!9Ii$w1i@L-QR0Fb\ k0}<{]|rDz˟wY7>wu;4r 0Od\Vfd&hH.Y]¡X \E2NRQGu/R J􌧳}oq:@R*a F0-V#w}AI?}S1ᐆ^C#bձaX07OįPNkkaQ FY*%ψsu)SJ+RE -<ŽhY*m" ЅZ#! ԸࡅKŤ;c IKll} p>aDvP筎rAFɘR\[,UA\%B^%"Zp]̢zd6(PKmArቤI\/9θjnw+Ufopg\Ys5".>R9eYRKvA"*6$j}D9#'DWȓ3:5XH?/P]!55TQߜ`jG{ w4qsbsZ-׍v@gV*ZFG ,1E[ܿ3 Z)BW K%U mD# CUlݳ³ 4b+VUQIҘP'@8-w6`5 -63 >$L*V?YTdY+=?mM<<+{k)nq -06ʑaiRIJ05[!7q0hZ.9T&jKaCWY1T0Y*j*.D0\R=j쀻rk E9'uPljC*]} Op70reݫSzңª[ -W2>T`IO -J\{ Iw$7t00\=&MKJ8G8 KETi8R*S׊c5 X|̕:`QbTwBKxAq.sZ6LN"% -'cDټ4ODKCl2;2)1*y2 -0hs4 -/YSL(#ŐRc"=|d̺[A'Ɯ~ -6udMfjWqܬ/`e< rH۹$.HX!Lx wU/D6AL@5 -R&7 J}AbQ/̾R]#/+h<˱CFv\R]$ًo¦K_ -yΥ7< gA 0p]jVD>N jΓ{n$ѵ-8 hTJ> x)lPV(* O ŲfqgqRSoRue7 -ĮKՋL}LXTуЭHcuV()݋4Na5 Գfbu,KU_ŏ[mXl d+*]E|\q D:Q_/&_PK4F|ʌ+ZHvwqn;e,&`~5)w5J8 L\de2ɊpD:Pklnƈ J ڀR;[@*(XgK*,fP=y_")~N  x Ӹmhmߩ5_$z!G\gRE/!Fu ZRܼnQW%sVS_Q%WPyCcՎíF? {w," -L_ -ʃ`.p1P_bb< @.zU@0n%1젿LdEaXE&+F5?X>1ԄWqL2gn@E A*7$ԇЃ8i/<:#K.'v o \eޣ711:#mAmX} -خ5XAՕE.h%RkK:LCpba}@*> :Z!?C{g.( xT iyK!"+E36PC#r LJ5d\ESQ7"-G@YMUh Rd[W ̱="y#b7P,FUn! -vl=XSl.dIBOLd{0 [GUZ@*F6JtCdvݱ]A(!~ݝP2"=S6VB* EnkOpnqbx ٕ>);_/Dy#\UbT7V$jZ) )`{(_Ņ*=v@@ѿE+'eWtBDiE٪O >%Ñ7SWl زj4u&HVaU|rU x$svb:7ewuzwI7]~ohۨYAӵڌ * -?lrWwMP(h+~NܳP(g7Լ/lAï#0c۟c -.ԁi]LAKīal#?d!IA|2t'e*6 a>tHUHIQ$#Kx`XEF!_}k2lro[;Z]oL y<r)1z UVi,3mRNCZUyW60tV؛IwduRqedsPIvKܑ6ynA/T'r]zGP_-6=CרYx.c)].daJYZޡ2z8eƗYYX~ -(>Qڭl-A[|B rCh;#?L\z'>o. _4߮4jp؊!:W,C)`a޶%m*jнYZ=c@tL<yYc0CBZ J[NpiK}0ڥdXn:x!;ahU`n9FR Z N?2 6M6 )|Ԫ>JJT8j%-FДt&*ѨG+wQڞ9ɇ r'_<_^.<8p RUTMQ+ECQ+E\0J -om~"R%5N]s2wƧq EcAX9aAoYC0612cmC}ݎn6KkⰗ~`A\n2n=EۃsS2ڥ1&%QClbܧsRr:|^{s0a8c.\&^#cdT5 p%u(gp!/|xH&_J̘g{3a&;SGȵꙪ}$zyK$ b}KBdiV/ >  R2uB?=X/)Q@J@!PSϵᗈe+6NJ \/FV/wPB|D}%WKI)+ ހ PzJLCmjCgcwnયPDFϴP%z>*.6U8۲bck<"w/̗yWUQu93ac0 wV萔'smR?0zdWClq!(ۺjvmY_0U4J -6(?j-|*=V}՛A>'9/ ^KUfUS?fo[wZm"C]hIʐDFTڻW̅j&C5͗zgT# M"{.Qഺ/RP5悅1zo5|EnjBoen|hW,'?ĄΚ];D|j E'"e*-Z߽>D t첋L 2[/V6̀r `hU8YJ-ٷgO^DR~"TWJ=t1E }͋+0χG΁o4_|(uXu\;_hD8K2zQQ cl1;fSډPx;>0-XE)'ux9/;f͚mYOE1΋^y_,RDcǯ - Y22i1:̛O!(.@yPi̼RDn_CU_S(p~y"[EѤC)Nd=7&hJ#w(Zp]>|J!`@p 0P! ?#Q3?,/{V{-ЌM ̬1b~gVybhDFfΉqzǶћ Ll!O7m{G#Ge37:<{:i71G<ߵM[{vR<QF9m!:38<.D>/}fu: >Gdr" F;Y3VpA>#m"# ">FL3}yVܖ^#338933x$y2`jag! IѤFv#ffy(ϙLH/pFp43Fu# ~8GlRg˂3:>m:.6ς|ngNPRDu}g$#I p ?6t.-0C NJ -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000013534 00000 n -0000440843 00000 n -0000440974 00000 n -0000441172 00000 n -trailer -<> -startxref -441309 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/5f85a29e-b7f2-4c03-a915-791ab543f3d2.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/5f85a29e-b7f2-4c03-a915-791ab543f3d2.pdf deleted file mode 100644 index 3f0b2db..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/5f85a29e-b7f2-4c03-a915-791ab543f3d2.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/60c70a35-0f91-4ad3-aaaa-914f009aaf89.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/60c70a35-0f91-4ad3-aaaa-914f009aaf89.pdf deleted file mode 100644 index 7e5107b..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/60c70a35-0f91-4ad3-aaaa-914f009aaf89.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/62f41a40-d3eb-4525-95ef-4fd49941f4e6.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/62f41a40-d3eb-4525-95ef-4fd49941f4e6.pdf deleted file mode 100644 index 52bbc88..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/62f41a40-d3eb-4525-95ef-4fd49941f4e6.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/631e5286-8a38-47ea-a9d8-6b11905f80de.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/631e5286-8a38-47ea-a9d8-6b11905f80de.pdf deleted file mode 100644 index 1b76e86..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/631e5286-8a38-47ea-a9d8-6b11905f80de.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/65781096-e005-4db3-ad66-89d30230a336.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/65781096-e005-4db3-ad66-89d30230a336.pdf deleted file mode 100644 index f41c0c5..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/65781096-e005-4db3-ad66-89d30230a336.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6946f1bd-98ba-479a-ab49-a7dc2647148d.jpg b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6946f1bd-98ba-479a-ab49-a7dc2647148d.jpg deleted file mode 100644 index 957a169..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6946f1bd-98ba-479a-ab49-a7dc2647148d.jpg and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6955d04f-55e0-4c75-976e-db65541d7201.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6955d04f-55e0-4c75-976e-db65541d7201.pdf deleted file mode 100644 index eaf45b2..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6955d04f-55e0-4c75-976e-db65541d7201.pdf +++ /dev/null @@ -1,2292 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 0.0000 -792.0000 272.3976 0.0000 0.0000 792.0000 cm /Im0 Do Q q 0.1968 0.0000 0.0000 0.1968 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -51.6498 0 0 62.5 102.04 3416 Tm -(S:3/946 ) Tj -51.4479 0 0 68.7501 394.69 3783 Tm -(JD. ) Tj -31.8504 0 0 68.7501 493.66 3783 Tm -(CONSTANTA, ) Tj -27.5589 0 0 68.7501 711.87 3783 Tm -(MUN. ) Tj -33.0138 0 0 68.7501 810.65 3783 Tm -(CINSTANTA ) Tj -32.9481 0 0 61.25 495.39 3717 Tm -(STR. ) Tj -30.1366 0 0 61.25 597.78 3717 Tm -(ION ) Tj -29.0936 0 0 61.25 671.86 3717 Tm -(ROATA ) Tj -27.4226 0 0 61.25 791.11 3717 Tm -(NR. ) Tj -0 Tc -61.25 0 0 61.25 872.26 3717 Tm -(3 ) Tj --0.035 Tc -34.4765 0 0 75 336.83 3643 Tm -(BINE ) Tj -36.4966 0 0 75 446.92 3643 Tm -(ATI ) Tj -39.293 0 0 75 517.9 3643 Tm -(VENIT ) Tj -51.7261 0 0 75 635.62 3643 Tm -(IN ) Tj -32.9459 0 0 75 691.84 3643 Tm -(MAGAZINIL ) Tj -34.5853 0 0 75 890.83 3643 Tm -(BRICK ) Tj -0 Tc -75 0 0 75 1012.5 3643 Tm -(! ) Tj --0.035 Tc -39.287 0 0 76.2501 537.58 3566 Tm -(CIF: ) Tj -34.3531 0 0 76.2501 636.83 3566 Tm -(RO105C ) Tj -40.1204 0 0 76.2501 776.43 3566 Tm -(500 ) Tj -35.3476 0 0 58.75 514.83 3852 Tm -(FIVE-HOLDING ) Tj -39.0613 0 0 58.75 773.27 3852 Tm -(S.A. ) Tj -43.6198 0 0 63.75 65.68 3355 Tm -(IFRTIR:FCRIAN ) Tj -31.8791 0 0 63.75 378.92 3355 Tm -(VALENTIN ) Tj -28.7849 0 0 63.75 575.96 3355 Tm -(UNGUREANU ) Tj -45.9871 0 0 73.7501 67.77 3139 Tm -(RENT ) Tj -44.6869 0 0 73.7501 203.52 3139 Tm -(C.U.1L/ ) Tj -42.5802 0 0 73.7501 377.54 3139 Tm -(C.I.F.:RO187985 ) Tj -52.3975 0 0 81.2501 82.02 2991 Tm -(SCI ) Tj -38.0489 0 0 81.2501 181.77 2991 Tm -(ENA ) Tj -33.9928 0 0 81.2501 293.8 2991 Tm -(EKTRA ) Tj -37.9217 0 0 81.2501 401.54 2991 Tm -(35L ) Tj -37.8232 0 0 81.2501 480.46 2991 Tm -(506UC/SET ) Tj -39.345 0 0 81.2501 675.5 2991 Tm -(60 ) Tj -50.042 0 0 63.75 69.63 2927 Tm -(IF ) Tj -41.6405 0 0 63.75 128.55 2927 Tm -(022100121038102 ) Tj -41.6158 0 0 63.75 441.47 2927 Tm -(6422768920146 ) Tj -55.8447 0 0 72.5001 75.96 2855 Tm -(SCI ) Tj -25.3004 0 0 72.5001 184.9 2855 Tm -(WENA ) Tj -33.0485 0 0 72.5001 295.8 2855 Tm -(EXTRA ) Tj -38.587 0 0 72.5001 402.54 2855 Tm -(35L ) Tj -36.0959 0 0 72.5001 481.49 2855 Tm -(50BUC/SET ) Tj -39.345 0 0 72.5001 676.5 2855 Tm -(60 ) Tj -0 Tc -62.5 0 0 62.5 70.62 2787 Tm -(E ) Tj --0.035 Tc -41.7836 0 0 62.5 130.55 2787 Tm -(022100021033102 ) Tj -41.6158 0 0 62.5 442.47 2787 Tm -(6422768320146 ) Tj -61.8461 0 0 63.75 73.62 2716 Tm -(E" ) Tj -37.9 0 0 63.75 155.77 2716 Tm -(ESELA ) Tj -52.879 0 0 63.75 287.25 2716 Tm -(5. ) Tj -30.0507 0 0 63.75 352.78 2716 Tm -(INTERMAR ) Tj -39.0208 0 0 63.75 522.94 2716 Tm -(UZ83829791160 ) Tj -49.434 0 0 60 75.3 2652 Tm -(501 ) Tj -37.0445 0 0 60 155.55 2652 Tm -(33-1026660 ) Tj -34.1789 0 0 62.5 76.83 2578 Tm -(PAICOP ) Tj -32.5007 0 0 62.5 212.84 2578 Tm -(HARTIE ) Tj -29.6798 0 0 62.5 348.85 2578 Tm -(ROLLOX ) Tj -42.6911 0 0 62.5 484.5 2578 Tm -(100 ) Tj -0 Tc -62.5 0 0 62.5 562.69 2578 Tm -(M ) Tj --0.035 Tc -30.4536 0 0 62.5 601.67 2578 Tm -(CELULO ) Tj -53.0458 0 0 60 78.8 2510 Tm -(W93415 ) Tj -40.6337 0 0 60 272.76 2510 Tm -(E944568000289 ) Tj -34.7343 0 0 62.5 80.83 2440 Tm -(HFRTIE ) Tj -33.434 0 0 62.5 219.7 2440 Tm -(TGIENICA ) Tj -29.8144 0 0 62.5 389.86 2440 Tm -(PARFUMATA ) Tj -0 Tc -62.5 0 0 62.5 583.25 2440 Tm -(3 ) Tj --0.035 Tc -32.4177 0 0 62.5 621.4 2440 Tm -(STR ) Tj -0 Tc -62.5 0 0 62.5 698.69 2440 Tm -(M ) Tj --0.035 Tc -49.3321 0 0 60 81.93 2373 Tm -(U904619 ) Tj -48.7767 0 0 60 275.38 2373 Tm -(62276806594 ) Tj -41.2209 0 0 60 83.79 2304 Tm -(HRTIE ) Tj -36.0569 0 0 60 222.74 2304 Tm -(IG. ) Tj -30.6377 0 0 60 295.85 2304 Tm -(PRRFUNATA ) Tj -0 Tc -60 0 0 60 489.28 2304 Tm -(3 ) Tj --0.035 Tc -38.6087 0 0 60 527.28 2304 Tm -(SIR ) Tj -37.7141 0 0 60 604.82 2304 Tm -(PIERSI ) Tj -50.0912 0 0 58.75 84.75 2236 Tm -(R034620 ) Tj -43.0825 0 0 58.75 278.45 2236 Tm -(622768C66907 ) Tj -40.6456 0 0 75 86.84 2162 Tm -(WRUE ) Tj -38.2657 0 0 75 233.72 2162 Tm -(IGIENICA ) Tj -31.2628 0 0 75 404.85 2162 Tm -(PERFUMATA ) Tj -0 Tc -75 0 0 75 604.09 2162 Tm -(3 ) Tj --0.035 Tc -31.8388 0 0 75 624.41 2162 Tm -(STR ) Tj -0 Tc -75 0 0 75 700.83 2162 Tm -(A ) Tj --0.035 Tc -55.518 0 0 58.75 88.35 2102 Tm -(90I4318 ) Tj -38.8769 0 0 58.75 281.5 2102 Tm -(6-422768065987 ) Tj -34.1303 0 0 61.25 90.83 2035 Tm -(HFRTIE ) Tj -35.6349 0 0 61.25 228.74 2035 Tm -(IGIENICA ) Tj -29.8107 0 0 61.25 397.86 2035 Tm -(PARFUNATA ) Tj -0 Tc -61.25 0 0 61.25 587.26 2035 Tm -(3 ) Tj --0.035 Tc -31.8388 0 0 61.25 625.41 2035 Tm -(STR ) Tj -0 Tc -61.25 0 0 61.25 701.86 2035 Tm -(A ) Tj --0.035 Tc -34.8856 0 0 60 91.8 1974 Tm -(LER0D4318 ) Tj -41.0978 0 0 60 282.48 1974 Tm -(6-22768065987 ) Tj -34.7873 0 0 57.5 93.35 1907 Tm -(SLBTDTL ) Tj -47.157 0 0 70 67.58 1365 Tm -(TCE. ) Tj -33.0361 0 0 70 194.7 1365 Tm -(TUA ) Tj -53.2445 0 0 70 261.88 1365 Tm -(A-) Tj -33.696 0 0 70 338.82 1365 Tm -(19% ) Tj -0.0369 Tc -60 0 0 60 68.46 1299 Tm -(TC. ) Tj --0.035 Tc -27.9536 0 0 60 186.75 1299 Tm -(TVA ) Tj -26.2584 0 0 60 261.87 1299 Tm -(BON ) Tj -38.5607 0 0 76.2501 149.81 1226 Tm -(P02. ) Tj -46.7772 0 0 76.2501 243.77 1226 Tm -(RT. ) Tj -35.8104 0 0 76.2501 352.74 1226 Tm -(IN ) Tj -33.6224 0 0 76.2501 402.84 1226 Tm -(BON: ) Tj -0.05 Tc -68.9394 0 0 62.5 106.56 627 Tm -(247 ) Tj --0.035 Tc -43.7946 0 0 62.5 237.79 627 Tm -(BF:C99 ) Tj -51.204 0 0 60 108.04 420 Tm -(S:84700011006 ) Tj -47.6263 0 0 61.25 109.77 356 Tm -(PSER ) Tj -40.2626 0 0 61.25 240.59 356 Tm -(1: ) Tj -34.3271 0 0 55 560.63 836 Tm -(C3POS-CT3N8G7043 ) Tj -0 Tc -73.7501 0 0 73.7501 945.41 2937 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 73.7501 967.86 2937 Tm -(BUC ) Tj -0 Tc -73.7501 0 0 73.7501 1053.84 2937 Tm -(X ) Tj --0.035 Tc -47.1501 0 0 73.7501 1096.33 2937 Tm -(5.53-) Tj -45.3278 0 0 73.7501 1203.35 2937 Tm -(5.E1 ) Tj -0 Tc -70 0 0 70 947.54 2798 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 70 966.86 2798 Tm -(BUC ) Tj -0 Tc -70 0 0 70 1044.85 2798 Tm -(X ) Tj --0.035 Tc -42.2151 0 0 70 1092.4 2798 Tm -(5.53 ) Tj -47.1816 0 0 70 1201.33 2798 Tm -(5,61 ) Tj -0 Tc -70 0 0 70 1305.84 2798 Tm -(A ) Tj --0.035 Tc -25.763 0 0 61.25 621.88 292 Tm -(BON ) Tj -30.0071 0 0 61.25 696.86 292 Tm -(FISCAL. ) Tj -0 Tc -73.7501 0 0 73.7501 547.83 224 Tm -(A ) Tj --0.035 Tc -39.862 0 0 73.7501 615.75 224 Tm -(2000221497 ) Tj -0 Tc -70 0 0 70 908.54 2658 Tm -(1 ) Tj --0.035 Tc -25.6592 0 0 70 926.88 2658 Tm -(BUIC ) Tj -0 Tc -70 0 0 70 1006.85 2658 Tm -(X ) Tj --0.035 Tc -36.9837 0 0 70 1048.7 2658 Tm -(19. ) Tj -36.0939 0 0 70 1105.6 2658 Tm -(79= ) Tj -45.1196 0 0 70 1179.42 2658 Tm -(15.7 ) Tj -0 Tc -70 0 0 70 1299.84 2658 Tm -(A ) Tj -70 0 0 70 901.54 2519 Tm -(1 ) Tj --0.035 Tc -30.8042 0 0 70 926.85 2519 Tm -(BLC ) Tj -0 Tc -70 0 0 70 1005.85 2519 Tm -(X ) Tj --0.035 Tc -49.6123 0 0 70 1041.26 2519 Tm -(12. ) Tj -44.792 0 0 70 1111.19 2519 Tm -(82-) Tj -47.9412 0 0 70 1178.32 2519 Tm -(12.E! ) Tj -0 Tc -70 0 0 70 1296.84 2519 Tm -(A ) Tj -68.7501 0 0 68.7501 899.59 2380 Tm -(1 ) Tj --0.035 Tc -34.1021 0 0 68.7501 925.37 2380 Tm -(SET ) Tj -0 Tc -68.7501 0 0 68.7501 1004.85 2380 Tm -(X ) Tj --0.035 Tc -43.6376 0 0 68.7501 1041.47 2380 Tm -(13.82= ) Tj -44.2149 0 0 68.7501 1177.45 2380 Tm -(13.&! ) Tj -0 Tc -68.7501 0 0 68.7501 1295.84 2380 Tm -(A ) Tj -71.2501 0 0 71.2501 907.5 2245 Tm -(1 ) Tj --0.035 Tc -33.5038 0 0 71.2501 925.38 2245 Tm -(SET ) Tj -0 Tc -71.2501 0 0 71.2501 1003.85 2245 Tm -(X ) Tj --0.035 Tc -43.6376 0 0 71.2501 1040.47 2245 Tm -(13.82= ) Tj -47.4365 0 0 71.2501 1176.34 2245 Tm -(13.E! ) Tj -0 Tc -71.2501 0 0 71.2501 1293.16 2245 Tm -(9 ) Tj -67.5001 0 0 67.5001 909.63 2109 Tm -(1 ) Tj --0.035 Tc -31.709 0 0 67.5001 925.41 2109 Tm -(SET ) Tj -0 Tc -67.5001 0 0 67.5001 1003.86 2109 Tm -(X ) Tj --0.035 Tc -34.2776 0 0 67.5001 1043.8 2109 Tm -(13. ) Tj -33.6101 0 0 67.5001 1108.39 2109 Tm -(82= ) Tj -42.5776 0 0 67.5001 1179.51 2109 Tm -(13.8 ) Tj -0 Tc -67.5001 0 0 67.5001 1293.85 2109 Tm -(A ) Tj -71.2501 0 0 71.2501 908.5 1969 Tm -(1 ) Tj --0.035 Tc -33.5038 0 0 71.2501 926.38 1969 Tm -(SET ) Tj -0 Tc -71.2501 0 0 71.2501 1004.85 1969 Tm -(X ) Tj --0.035 Tc -47.933 0 0 71.2501 1039.32 1969 Tm -(13.82-) Tj -43.7495 0 0 71.2501 1174.47 1969 Tm -(13.&! ) Tj -0 Tc -71.2501 0 0 71.2501 1292.84 1969 Tm -(A ) Tj --0.035 Tc -29.6916 0 0 68.7501 428.85 497 Tm -(DATA: ) Tj -43.6551 0 0 68.7501 541.53 497 Tm -(08-10-2024 ) Tj -30.9769 0 0 68.7501 750.68 497 Tm -(ORA: ) Tj -46.0218 0 0 68.7501 845.39 497 Tm -(19:30:12 ) Tj -46.1102 0 0 60 1236.38 1364 Tm -(16.33 ) Tj -50.0779 0 0 67.5001 713.68 563 Tm -(20021.4972241031930122<7CS ) Tj -46.6007 0 0 61.25 1232.37 1296 Tm -(16.30 ) Tj -29.9735 0 0 63.75 1092.12 633 Tm -(NR. ) Tj -35.4334 0 0 63.75 1149.92 633 Tm -(AIEF:CU31 ) Tj -28.9665 0 0 57.5 378.93 163 Tm -(VR ) Tj -29.2695 0 0 57.5 435.85 163 Tm -(RJGAM ) Tj -30.6177 0 0 57.5 548.43 163 Tm -(SA ) Tj -32.1177 0 0 57.5 605.85 163 Tm -(PASTRATI ) Tj -29.2071 0 0 57.5 776.86 163 Tm -(BONUI. ) Tj -34.1449 0 0 57.5 891.84 163 Tm -(FISCAL ) Tj -0 Tc -57.5 0 0 57.5 1027.58 163 Tm -(I ) Tj --0.035 Tc -28.2213 0 0 51.25 325.93 107 Tm -(VOCEA ) Tj -35.199 0 0 51.25 437.62 107 Tm -(CLIENTULU|: ) Tj -40.1985 0 0 51.25 663.57 107 Tm -(08008 ) Tj -33.8291 0 0 51.25 777.84 107 Tm -(BRICK: ) Tj -40.0996 0 0 51.25 910.57 107 Tm -(0300827425 ) Tj -35.7981 0 0 46.25 347.68 56 Tm -(TIPARIT ) Tj -35.4936 0 0 46.25 496.82 56 Tm -(DIN ) Tj -30.74 0 0 46.25 573.67 56 Tm -(COGITO ) Tj -31.4439 0 0 46.25 703.81 56 Tm -(ERP ) Tj -32.0492 0 0 46.25 778.88 56 Tm -(WW. ) Tj -33.6304 0 0 46.25 854.64 56 Tm -(COGITO-ERP.RO ) Tj -41.0396 0 0 60 1115.63 425 Tm -(TD:005771:0 ) Tj -32.5285 0 0 60 1173.65 362 Tm -(CASIEK ) Tj -0 Tc -60 0 0 60 1309.9 362 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF"ExifII*  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqwh"1 _ꪏG_~~y_mg+/`G ;9>dw{Wŝ8q벜-]M+Ty^.XaP[mf]OΟG7_+&enҍ?3ߨh~vbC ?F~4oʿU_f~V~5kc?b9ehQq~~,lVj*[3qHOŘkcYgb~gBOƋaL+슗>D~*?d,^C?Tk/Ɵґg ->>';oƼ|23u!9q3:Vo)$A|&4c~S>ߙq(\(!Q -$.>*AF9C&ITWȅhBR6yr{OK>O_~Pq!{."#ُߓɸ>_.ߣ?Kt|? Fꞣ%ߖo4x6-h5ѓ_ki_pg?Azh?U}#??YnW+L'.cץܤYD34m]f7flHGɓ8c(kgӏFl"> ->O诔>1|}GArBijV&kmGl}YjNht../!Pp3K_Ϳ7ciYyy~S!N':7/5|L ,b ZI}{s}U̎G*]{넟rR?;rYCg(~kY~ɇ_G2?Kg>mʣ$ƫT'L^~~ɫk\~ğ')?# ~H?Zc?'itE 1+#%gnN4u|1˞S۳G4XL&8@a-1T UMYW4X.,iU#K[D %, X -e-UJ,DTP$JQhh1TC%M6,.&_6,3-TnDiHfG7JQ-P1IL93比3}5_U|r}?-3O*\`r>L^|X}4yk7QDѪF.mtisNwiEQh]s7JG29^/8vH:vq]Xðwo,ğg~k?_?/وo_ I nRWgseu,G~“2l`徦U}Fh0ɚ1sJlrIsexĘ"ǒ `f( -` "M$C ZH@h4T (*IxDgɤ#H1`iV,iq43r3]qo7.{8/yoZyUjv'eO2Oٞ1!IP")ieڤi0VIr+Y"LUR&ИɌcQ GfƲf¤g)pBiqDcأ -0]=QQ.1 V"JB"@TɎb )RЂ ECn\ eu, +$SAdBj\1I&9`QV :LЇ#`RƘb.|WɝS‘R!i,+K`\bT44) lL@Մ $TiԴ X4ʖKQ Y3& &HBR Ub &!@ -"E.6%a#V4NMfϋ͋6*I3p$ 44 @@@&  rCCMȎXS#jHŠJT#aI -cR9HIGV5 "P*%p '@ H NQ0t>LYJV*˩Nьh MSPJMHqKR@ P d(8!RI$.1"icZJe8SIqu̔fDK`d0 Y1dL+QRڠa$%M&1c"U (jM'RE*@1TUC8Sr)!l1D0BPPLDP hq,c͆>|y#jЯ+]ufkzC,cuf;FW*%ȍiILL26PX-$R@ MEti( TY 7n,N@J&65," *\, L0sVCE@VܲiN*'zqeA"MB@M2%hC - &XQr3#O=^DY2L̾R}P!DXTy^v%qlzy~ۮե@>}.>k?._oVI<;HKd~NubZƪQEL*)`kI.eHIL4 R!1sQ> gud ׆˓u#)!N(@!#X1ؼ v1D cq'󯦼)6zK-<,x1,v)P@ 0ʑBM\n HHXA5,&e&1RT %hbJ-ʄb V i"U* H9)&0r|ʑ܂h`Y-X4nhcKB -%C@ C3SM!Ei\LdǏ.LJ>,XLbp}46ˑ8%  *Xrk+뚧|^lKBhCM*k=l~>Ο"4ETXȪxm_66}9=g0mRMƲ}qm'y޷ی˥ƲJ ϱ\4?qgP@* lMc=p~̙AiK)Dͳaeב Xpl~y&t~~锫>qrF;1K`=~_NlLv_>Mj R'#M,:>G=1xfRi>kV{`|l_֍1jKDVb =SX:6+,b'I#nޜԬ>S˗>-$H&RIκˑʘ45 7ƼܙRbvԓBEH Y)IM@S() fY&()(N"n"Fr\2q 9 hjdI`S9)0C1`TEzi&J&g"he-4 .F"ІB` Rrb`~i -N<| 1S0v nYiHVQ6*\fU#$XQ+(1/J?Ͽ_ߘ%C*rƀl~YGi&BӶǃd0PE4L`x5|R*>~G޿HTپi|c{>sm>ϣͼ_T4!|Ɉsh DMHd搁CJT"@CT& @9@д6|9rֲ%cmTyd=4y1.'_hǓbH(Q97Hיi*tPcK(Rdb BD% MI1))5KI8cA)1(&:1S]rTdh11 &IN@%hT@10iHXrX)Hb(L&UC@ CiB,`}%R۟<ymؐE'Hh*uމMϦHCHMB4&j*# 1Z]j}ǒZ -1x0Fk?,P$Q*)~\nI/TBbb;˅A*JFM)PRqh ohɟqY3Yf5rj&xMcl\aXKy#hC 9!ER.Bh&i$ʴHJ\%k[\B$5MV%88L$hi(bX"dBj% re C) hH 1J"˨kg3\cr^;RPHk5mm.-_|)e>'+(JF  K_?N!g~m>tJ~63+jJD!H5D&)I\TBE3q -*5(b!d -Rbcm I) j@ċ@1&@cQ"TJՌiG,Q &Ph6~?MBE 57JE|Z;?:9Z;4}Bu-ܲ1 }Z\@K JKP 5* -%$'(0*M@ h`U>̀JWtS |W][\i['ݭٳf#{oGծQ^DB1 Lv\Ʈ⹾^m^\gO<~ͮC!&* E"fSH9i!5,iKPb#\i#hq5#&ʁ6 ,X -",C -@D CCC& -@F lEheTa9 AR%`6=]E[&nX4 g9E(j\8aqMMKZӏ~EֺS4(VRN٤'u_}yɰm&h!x:8uz`"Q,lxu}-/ӃF'L~IA:>_B̟Ozջb9F'* Kݸ)S }KEH -+>Ckg//Rxީ/J! 0dxhgy3sE.A]O9Y uTrs_o}sX>Pf2E,ctueluBϛϝ& $Kb_=~HT6P 3(aYrv,\p:nA'díjeî.ظuɨX9?J> 9! ͘E#4Բ9Q4 -hrE\ -ABHrЀNF K^Ly+0}S Q$կ]&|]6Tڃ^f{*g]qIkzܺqr" 4!nnok{fy~}G޷'L7u#o.sރ`"h !h۾K[WZDpVeC$ 5t>>zK"G`~Y>5,B@䑄]0 Fa1I52i& 85+B "&6h,͇=͉ܼuw5jѰi2h{ֶG*6ߧ5=&8LhM,Og;ߜϏOFfn> z7~Їh5D5R#H@ ZBN`9r\D˘1&jLi̸KZ{ZԠ bLJT#H&1dtIR2@sV9E'HL `Al핰@&Th-ESp J3lc͋d%yY=φ/m7|_oL7?=,YpTrzus0<Y}ЛY)HB$h)@hrԠ%J -Cn0R*jT@ Rh@Zrh!@ې@T4JTB@H,h`U"MJ(@n%}9c5JBMj~3r-~daĶug, q:BpnsCfC 6<P~p驼שu6p=ԷSzp/`==lJȂh&~w/X| $H`@dJiP BHJK BE$H P`4 -rcl2A,hI1!M2QBoGnu`;0hh -J#?C\#s> DZ,=a'%6/@"BI|7q 4D~̑,MlF|_IuM2eM@4 TjF$.eLd$i d3ILYMJЁ|"%9LYL iA$Q(Lsrr -j@*J  -H11Q#J bhC2eÜϖ2.w%dkkmOoɚ[|O_J=O޳yOHO"k|k{l!l~-؆n%\ [sqiCP}gF7;gV_iIi-EL(L\.13IA1r($&PIDb -d/Yjl 4Aq(bP B$ J&H(mQ3DlIF}{B!0,` *Xɜ7,nA  -RE - _'|DUM*JdT0Lf<9K3b"ܯ5}H{ȷtL@bcA&Do_ﳛ-T$P M?*\4 Cįon -M%TˊF*h, &VlYyLҷ>Ksذe¢i@&*0B%,B4hHmK!!#r@}- @\-BqJIRR@S`C+TmZA)jHr  HЛr49(@BbV X9詭fheUe1dkd+tOٌ>fvƞF xM~`Bi#!0'K| }RІ4J% HBM@%H䙹̔y1Ó%R!99"/"51SLSS)RƀsR&9ȥ͔ڱA9 C!0 - 9ƜiRj KU!M0AR2@JBZ&nUБ&iV1S##8qY͌y4nV7=쩯%XaaduOGmVW}~*f{Sz=}񾚾-M\wϻ'JA\?)2YrTtwctsDE\9횎G:dNJ3T|k=_ Ϫ[k!J C<-mFWm>e2)0ͨU͟ --B% @B1*ѴWaDLDĜۧHi -h4YM%#BRXJ"4?ZJiX$D$flDi0MNV V*\7YmV62rSm_6121ԟ__!r1!PxGAyKyݰ U.QM T@C ͈R)ԡ$'1)UcU" c]m b!"e1Ҡ@0B`WU"bT)1BMhlM1 d7#vTX!HR&%m L`4%E ͒ ;(!)\˃l1k-ZG2f͵:Tf24J[  3)Շ_}PRTJdKI> z a%R&/:tM{vd7cPPT&n-yעxwo'}fhےtD:@啓uNk[.~١nZ -$HA[:oc몑\cMĎW\×WFO~O{6c>Ȝڱ4꾏g;V6٩jhL%4 `C%5 Q6J9!*U I̠R!U2BhB`*b -XjIle.%PIXM)eD}I]g\~|w;:;q{>˨駓⡈ `ۛChbSTӪvST6k?a}+o[LyWYvM -CA#ygC|dbc@j,c{Wptߛ%Hp#@(@DfI Ma2R MLԓ.W qj#Lkךz4 *Dh -nH(`HJrЀY,͢X2LiZX& )˦ycY]0`4 dPU"1rJ`D)[@6!stIS4GEɆC1*ɆYR7B+Mܨhvc&6d(\CLt45qj_5^9ձP -@ص-HϨzBhbEC *H'8/ -/D@$/?>t5 um)PˊԖA~|OνjR?4z$24F3wm+TԴQF H!cxh>o]-D3cSY߇ssދ9qTTKCP hJ!X!IbF8Zr#*P$>_)|Iir1!Rjҡn"n($h1H#ll./FLY xB.nqr-T|][iWϛ3vܙa}NzZ->8<,Xw;M7HtOcY!@܃Nę h&F'H*%9r0XBT%R%2WbG"g'$Êbɉq} R` -"*@ 0SS @d@E0 -AB\C 6ܴbb -iT9IJi@6%S L{2M!) cşie7/睛_FCf/  -ne9OivtҹfĄ`0r#m5P_ړP U$N,u}V}INX優q0&W3eyiUȒ.tLbwϹz(Y, blvTWчYc )}9IZO\L ҤFN  I@.$CB2A*h qRI"H`@JQ+$9h@,%<߃Ia,R*~v9T{3|r3_G='r~;xٽFbVS*2}7ѬXⴶW F@ﭖrwa*g={їO2j4P0K '% !@ RJw0 I&X@vS_WjrL39è};' f(b h@ J@HI*4 hRM h -Q% CT0E!*`! B!kKH14S*B -Kh Rc@0""{eHIr d?u^L@3=v:X&Jy_`joוqq63G^O S&r$M \F'Yl>K=e0} p}-9Z4s_UꡊZܱ;?om6߾86;C*k0nޤ7/EF6ACW6=bMݸڱ:5 QdFoCOujJ  KR&2MH!%H 1*IԴr<&Uz"ƮAł eZ&HA5))!Br -s -1NrJ^r`(cW]AzB^oAt#~>liiE_%g#dwR,4'sJ`#$ -ok9(v<Ǫ&r%E/r{m6&K6 2S'>9qpnW`yv&Eg -ܒ &Z!-hI0*) -XBb A !¡C|s9L} & 0 U*r*" ę$&$r_" -diR gddcq|u|ڐN][OX2?~#=HWvb4RY}?6{2vej47)  M汾rCr4uڼ?hQEE6(4`&Rh$)lpbB"jc$Gӓjy xk |Cq''wVdH!ˌC Rh&" *D& R2Jbh J % @(J4445\&PBD9-c1"R25n,%-0kOLC[RFHE@DQ#bUcEFW50× "ؚԯ& ˌtBj*@<԰W}2m "tPD Kz7(7#r-(HL(M DИ#+?;jߦ0.A4 -&|P>3Å `HДR6`GYTb(*AK>A+w" -ZY7Y'WQ:hO˟oJCyCJH 0$r4r'4U - -4$%g$ |K~OlBT%QP9b` sBjUm.d|B )aTBK}_-#/Z3h\M꥛CMXjzqwъ&H2(͋"}9U*ZUM[~?㦝 QchC@0CZ>_6!@$lHb7RE*M(Bi# W9#)̲ts?Ow>.ooXG5 5m_3=CO5wYdi"op!(P,r, 1!+\ )1YBPh* `y~DHB16HS! -5LVN]!Wٚ%8)l3YTԱ!T"f*Qe[w]M;WՎ`*4d\|tM:Va~fXˤؚviu,ϛhޭd2i9NG?Dqz_;g`M(״v~gKM *JYm(ذW3пCu-x~.G-$Ey[z\>HѺ>히a2DR\?i;7) &Ls7R%PH%iNA0I` 4 r,ĜrȇJ -&0_ܓ@B.4* -$r, (`4"fISh1,`bXHgZ^z?Wa~@OOgOԫؿa}{|?v$%J1Ŗs\Y6\^0# X(6Q{8xP4 h(@4#@`@ jE4ȌN!"F5&QRP#ꏛU:)˶~_SIӷ d-œ( ` 2@ 4؅BB&#3t5Ϝ{frRb©F)ZԻI}K>uV'e5SH \p -O ۦPJMHc -,جMUBR@4 Ldc?$h -CCW(b@,b#"ݖ1vq{=MfZU3LLU Zt5xW~rDY46HA##}$?k )+% K@ ψ"T*R+$҉1@ h!,X9F9J((T$ca-m&L~|bBX4$Hb&r1e jdBMIc *F QHLG0THK$CD +.rIPƵ=#УDx&ioFz;7Z27|$g/%}Y4 *"H}pe2\Tu4nI7F*4crnM_thg-6Oc7ܱX&0@9&rArɆrcʘHR<.oq΃kZo즣mW_"Kg7=^27dwlbq5j&%K9`KdR\L -(@=??߇ -/GҶ4C+I%!?cO]G\?nf֓*DPЗ{&PA0L -n;*mauJ Cr@ćmZWA""BpMIY弹/".)y=7peA1ܕ5z_5RJd J\^ýu8vd&:hI5Ӷ.M:޽ApXZrM͔E`*JH ^l>\WqeyK65䠩`@KF]^tUqI7싶}~'oq{&m|KE ! a-U.HW6$R%)CJcv_4s?ߓPټk<>vu}3"1I%_aISH1L ~5Wql}9WRQr4Xjj{v aԾ$C]`~/g&(dQRC U7 &jF-ŗVKX%b h' qJDSe@OΩ㬨x=UCG"ЀT1dfl+T[@UcakȾ]/'2:FiD /9׻>SMg}" 5 审|MW9t y{HmЁSDS~ -:U@4Yg9:fޓ=_m+#D M>Np(tIHdŗX**BQ,@$FjTr&ҀJ Q) -jFTLcl)4'")&1ʵ4RCAY3s::r(3SS^rV-WYAGZ/cwXs AAH`+>L9YwZǒn2ԱJ$(#u&ӗB:vhV@5݃>3-؏ eDDĩ"%qrNͫ]=:q`Ki41& U}Bq)Xφ&@`~*y>۫Vu ZF~Ii-?7ձW4ߎM9btdܮ&)7!$dMQs,MĜCM^y]{}aQ5`LdWa5Gf4^첝 <>jʠD0TnY?r͌B&JJ#4 XY&$hYr|, 9bʩ$ NZ=ꚐhE+.>ȱ?Q_~v @0 >3ꯈ2add *A'Vpﷴ rqo0LRX"3pyFO"L]yYщdd2d&eJ&F{^ΚRP離jߥh]7*~y IȜ ˌ݂tQ>1c~.%3/lj\˾ ,L0agwm:PLCbjU $@!ʀ,+I%i@*d@_Q @ r) -%PHE&3I *NaB@yOӀN!"J&2&6Ζ{~NWqôX;9O~n7vuf5a9ҾT_>]C6_orlOV[vhc15+vPZ ")EJ\x >;Ͼ/{ -ex@Ŕw7P^s$2cfo'ιm Z8K_eMTR;1h R!Zh*iЕˑ+%MyODH@$Pb&p4+5mA42⸂|8(rT ;X#) RDdU -&1ԄDde͐2%RB\ Km fG5+rZEĒ2,*5iTRU4PS\NѹbQ&0M -B'#l`1R -Iɬor5 ! M%ILfJ%JfabU(B%}eoHI0Jb$%4) JS!V0<6ᬉiRXb<K[O!T6zYfҵMN p= v^c5k/i˓bW"$u4^|?EfPYn-*[W%Wjհܰ`(@Ba}YO7otCwˎvH9>Ӡt* C -rdRHTC@*Jcœ,w+2ǟDokf:n+5M$g+Gw]rۏ|׶YS] 1)F0Z1$r@T̿[Ok$ѾkgaT=r'I>-;qӊ^^=/W}F"Źϓ1) -qG6ľ E7--)Zh@ -)!J.Bg6ǹȬn7 UR22(ZnS QgSRh4UjJd:B ,Jh¾n֥vfpݟc+T!s q}kt9h'|jm}=䠐LbPjFk8eS8jgu]Xhl} -#D4rIU2߯s*JS>W L@3&lVFrUd X\IHSH@qSjDH"(Ih4R(B}]o|D&4`@HCŢjhCBD4q>>fAM@C~x ߶>anj2 d% oʽK~ˣeÛh@/>GZ[Uqw]U㤯?uzM恀 LH4=uQҎqM7)GgqM7cz:,2hB 1-2bчp97#]o>OKm_+}sAmDHwvyqymM=&E,"䁍v,HI%-hD#%_}M}ۤ>QC8OzZgE4Wi}G$&:H)peAPEJJr (I DcI9r`ɏ-֠*@p堩eÕC!4܇S4fbbF4:Tu/KH9EI+OH%&# Hi*jP i Y%Y%4$ -QrihD4 -)"' $M B0MIDYh-$K2hHL >F, cP @$H4QH"JaTMP9jQ@JAH@J9Ҁr1@&!0I `LG˙e@HCG_x~xJV/ח2{5vEJoL)dףa>lJ/%rQFO}LYrKǒV umn5}:0cBim'ʷ>.s/ANZw~.mM/YiI J,NqCMl0MBRe4dI&i'ɏ.Dfbǒg&+W4} Kk:4&l}vr`TT1I/So/]B԰I0Lg<˷4&2efbDd 4.]BA(8*Zc Wv[6!=#\aH@0T. HR|Fi- L n7N`)ZG,ajTRmI#0L*@U42YNZm RIE@a#KrD@ -EZ&"P*rZ0$Qk#BPi5! \P 0gOL) @ P"$)'Z ) @i) r*Gk1oZ*($Pp!@&jXBrNH@91i"5uKM|.Q"}x9[/k}brǣI&W>=WZomO0oS#WSTx<k``Jp%AQX*q?B\|[ztSb'͐_kÆ]c!SDR dL䑈)UR!$aτ2ZetNI_ӂ1扟J7_#غ-]Vnzڷۗ7f>OQEռ;IhLi604OȾv绾\De]Kd"1&Z@H4( n;3ԉD );%)ėXH+hK|wQr]L\z>͉wm>|`_i1ŗƻֲ&4 h@ZϾܣwpu/>>(޹}1mq\<\u_[j;Gz7]vnD/ZSjv:QhU짴9c$jW$E8cb%X!125Cȥc4=}"hI]PJm0)=#yr42J0T%@i.*M:r( Sh0M NA4)Ii*Jj4cYi%'  P X0+`0y0Ul5!BE)NTN - ЪDhT -.Bv9rP-0X<~g~of!h@&DR* -D6j&nb$`CSJM&#ގwHDÎA/!BKB([:L!eRVJAr9]~|YDg?8W!5?OZ/C??>}9WߢyOW54&2Kw.*r1Tk;?y/鎊T0RV:%|_u} 2T1d RIL%06JX-.caldZY1XơS׽Z?z?:&n.}y'^xLÚv+ٽ24LLT5#Ia4E&jN#uz.FHɮ+>,qjSk=-_25)pplY+i|'ͶO5= XS#W^>nDę+ *4. -)v J%^6SRjV:V¥ʌ4F|>đ*L%1fFy2hM(B)+E"͐m*B*LX8&-*,SsjH2bDJuSFi bi0LT2B@@ CQkD(Ru *DT r4`dI܅&ʋj?Gу?LiU" -J#r & --K!K$)(hCv}ci!14*L%4i"%Z%TDRh[|h$ELʋU.u~n[sp8q'h\d`vzbì'2 0H-=>Ac4jgqExS`0hiTScu/_}%J>e.a + -R@H4ZMX"1}/͏ZLԑ{=hϷlZ׷GdN*b1Ddi4 &4! h۩Xi)h~?[(־վ>mYGm?gzobRI~yŠv/av 3&2@` Y\ qBhI!j@rKn)LM@ -rT*BBA*bHShtrjJr0V02P iiIDҪ -bd*"hBr9i%@ Eh6IH(i@҃P'  bBNN@Wr2 誆Q nZy.~s! Q@ - b$@@H0C%VK$b0HbfY YL$)! S!)R.HN)UIQҩfKF?O|0׫ŗr|-}91] 7ٗ<|6mtzFf{$dLC *Mv_O&VHfKZ-4w5OtCعA3JrKϵZ^+6~KgY޿&|bh)|}L^;n:FFh9 -CTL+B}NY'.:Ǜ|l?!V'Rz~>=/kjOO'/n~{tW~7K=k^>M_aw2CX a*@-{ך;M:Y1 SBmSWQ\/Z.pCY<4[=F%tItN]mrc 4.1!)"˼y?Ϙ%EG%Rh*,Ri&Q&¨7/6~*XP TR"rtSeQ-%i 2KGHCh(5H@T679HJ,bHLiʱ↑R 4 9(5H f:$ T`H'#Ѐ%\@ $ jJ*YB,)RLwq'ٵj0BNVb.dD! -6iLz IHB$HI-TiAd#ݴޟY3DfIk\<Ϸ^8ڬ'gG9995<66p&g~ -qM/ȕ˴ŐUC)@67ӽe^[tϩڳ_}:b*Xh fc7Κ:l^]xHsGjE{_땓Kyv_VVæ͸s΃>My*+Ol0y[Foa5]S2k}xR5X& h =mM-_#d,{ 9f~.#.8 ?_1=Zlƍx_W>? )FH9c&n|v#Wdɪ)61-O3`9a7#H y>P"fĆ"Q!E - E*T O J~4 䭑u>Ξ'wChE$ -7+ m 1D`4!MͪbH1@& PIRa@ 1҉e(`E0%rQeTֳ}_'׵쑠+@#p -D!4ID0_ " M<@ -FZCM2Bb>"$s -DR41F{|ar{YޑF[X%RZr-wcũ|Эx35eFJOY'V-\ڗ>KӠh_W|?.qE:}Q~ɂs~whnX SfF$7O=,~XIt}]ٿV$NwK%gkIA%V0wp0b-Ԗ0ɍjT3`F&jP#P`EA6 (K $IR )FE1]@=%:ϳ,1$C,U)o&0L!c%9Z&2iL4J4! D `hHCȁ@jh 9 -4cU`KrV,]ˬ?gmUbNJ$% W"r!0*%&X KJBT"4 \x'7W hV C\b D -*DmBU$*-P"ZVD7k?PuLW?+ƿ/?5q9H>O79r-Ol4yn7l~Yry&rk%MVLsNTdD4Ls/7k'_d\wRqݖ1w8?fQ-0H X,i "Tn<=5h>/ñfL?DesŖ^SuK'6O+L96#=2sQTb_|ǯLc񎅛A،lj"j/ai 1 M!O9i~Wg,FjQޣ^ɼ-;΃OEP}9ϯḩu7(Ow;Rc75KuݾNSWc$JqgVuLfT˘Jk$F,SQr{^NK&:JAaI.D0G?"*h!I*.bPa#``PG9*$ ]ؾ=L-R%r "*TLIl@r iFIb&D&J&i BxVH*@4@ :QP P@(Ñi4(ֳo! LH@&^8iTPM1!(hkP*D40s5夗R!cH@07a0H -D%JMzS$dIa V#Z?Ǿ昶Ml_)eq~u6gv}:nMK<hi&PVi&}gr茹*2-n̍\ I:Q,rr quɐϧ{=TRb BZ hyuӎqʎ'/Lڸ_xG}1tRӓZ@zׄyFܲs/`Ulhrn|knpc=3ˍN}{4^B ~]5zS & Q??dshRǯwؖ"\x|qn4o vΟSxW7Ef:Q߿W;FX:_Dީn'+쩡* Wר,ynP҉&8ғS.&#I6MW= K edF%s/?5~j!t2h9d*D^oYtK:nɯrK`Bo~fIs?W鳰k ~m]v^{ilH%rR4#k dr&Mt!J YAi9f>lvKa3rb!d0DDMQi:jZi 0_$*(R$4bx$DKJBTM.GkN]qWsGfeܾrA}y'=Ac٤VmN]|R_rʿk *D4BBZ5ͨgsyCo4}z_>g9GVyzv['|w Nnj= -M?pwv4o13Pgqw+ -& ȿg7z9zz\ЄÎsΉ*oen=ѽ?cV'>f]./y~NY3ؙK;*9poR -*I_<ϯgZBi=G~|UcWsH'%"2%DSɌ>h/\Lu1DNa7h|;37_GkG8GKײvǓg?~om֟.%V]Ol$< @4?nڗx7ar@DM䔚~%Lq;#+D(ie@XǑ5يbK@ ߜEN۹ɡ~ ƮdLbRIHE>c632jQR%+$B7 42ǚpe⊒hJT HGzy\riM `\"D@*TBM*i4iiP(1f E@V bb:H" Z5&61if!3|-Ƅ0`rp2q^OΟOͮ ^rHܗAy_rg|U7"CZFwjszQ$YC}>5|I4AڨQHh415F~mNqϣr^[+B -*@5!r@Ӳ%;r;~~ > tUo4*<@wh7CWK9ĝ`W`&+8e:Bg.}o^~-XEOlm1]IUnO/i^R\[ˉ2A>K9v79>tf^gsmy}|YH<_{Q%hi>~=tv\vX"}Hk]e4!c{|?z!ŀ2BV'k%?{<ovx`Fӕ* Z7{h\*&CuͳzFvŻ>m  Yǒ>yڿQSt uv~lCM2U8CF~nt%CQ4@411w%}wh& hF&dhF$N\ -@R*B.D 4W)p*T9(@1*M@r)a x5w.E.`@ |/[\&Vu}^CY{vyz%W2w關"rϳ?[ 6L>IrT(zU7m0SIlUi V `.ihG -'#>>í}[`Z` ANB S@htkGӹ=xѣa_giulngz|<Ǫ~O.x5|{:wl D1xfjUK0I$@j< IzurO6nk*f$ObcY"jGΞr[Dzz$w?X%5GdzgqwDiB-W$o_6;SӶMK4Hu6* *]OL-[Ȏ̾/)6>l!"sR y/^Lfq0.%sE,fh>[>DozgeD -_̈́5K7u|f=(i44 a}.-'Q@k>$0Tp\:5| W MFd}xA=crY2D -nUL_I̺΁s7EWFcQi9AiwXȉ4h nN)ZL"{EHЉM MD"SVIHId L4,NHIm @ƨwL{єL8cÝlnY)8 AHȓKhQhƲ@2eBO]K^r:ZXM.np2n\ϯCT6ϯo/H5SV]MQrYgBAbIbB}Eн$?[ƺNU '6) @ -ɬgU\̿&;!nߛ#tko^oU8t|Oʺc:^[GOo9T9a!;=CҀ$ 9_-<;~x3|n.4\} .S^\I|wvxs컵ˡ|?Lo6F=W~b`)). Ƽݎ?*Ѽ[UI68Icjd2f+koMgX5 zAjIW(T#-%Nh;ϙ,k3x {9/R|9OGޜ6+Օ񜏣k!?l_jI佋l|l+GڄWҽJ8Ov~X$hnAW!ꚺpԫqͺJ R##ǖу9;~8*  JoǶe4pk]t1dj$P|?Ls݃k}cYi2Ȫ`HMHML.xN|)"@Ť+B +GQi}jkrрiR4#@YH4BW$l@*ZRƆ%!CYP$+JK -jPHc C m4I*vh5(R\h$5OVs|EKN&Wm^i~cMX8nN[G9q+&,7IYa+ÙYĻ'`cd@*TE"JS`I+o'hrH !҄.iLbOf?t7O;mt?Uz7 Ok31t{I/(aZErlPϨō4BJXBg.Wb7kgڄ֏two>-x7j?d3[V7D) @̦6d%BjY@χ{onH(ADdcnNY= װE㒫K!.K{ k 4=u`^\n+Y$2bw>G$K_t~1{_/&^ts"v#.u~ѷ^w~x{G_θccS:wѹ5pܯa^s߹>NW?Q}{<ع}BFƒ@v[[>{8=@{%&Z'$Q`78ymyܽ$*BV-O"n65*\g qvtߺ8U⩛igOM?OsM9 hSi>ޙrc:L -ZT0CSr$ҪKITː Tn{Np*ȁ,dD &E(LMX4Q`qZD' m|Wk_$7>qkÃ*'w~8@r?NY 9Lh)*hzX}b7NoNNwTJ+JL"ˁ*@ Q4H\JNkҴ ~g{{ȾM,XcY DSD^Y۔:p\#޵=M[5Fo]?B,x;BMGbp ~Ok>vӾs^k/RU q6l$҉ȓi(7?keƥ¶O×6,no>}_|Wy쟞DYoonZV~9&uc8D]pں>,".WX;.{/%q$bsJ4y[Og^םOkU2@ȴ#CP6"DWi  I1fGb`;F4i YJ5+OSGHV+A6?di412*Q3#To7-ZH`CěV:@6.5rIP9`!(҇y1+"T,D $)4Jj@Bp 0ԓ4E"+T23I9G̢̰~g<|[hMʼw|dHWiǃ-)7}VԵQwHXj]ŃlY&NN>0b`E@U{ԜliN̜fۋfةTG, r:&'4!2FlNC#\)r`ay0LUnV٣\^_|>cm3=_<_ͭ%c&2ĝ-!-J)ǒGǦFi'æ.jdJSef >h+Jp;nK|cgǓY3^f;h>Cxb8 ;&CAZ?Luݗ525g4权YꅸRRRhb{/.+In]@m6Ni\u}=(#Û_'k=~V3 3A]ΉsʋSYoױwb9Il| զKwF7vзē>~E{G7{ƺru:>VqsqǤҭ]9*C`AhiuH!T\؁ 3Ay2{fļL> -tQaR -QC91+DeQ,XMcC vq˔M努 ~):@gË2$@`B@,S9; :+P$Г`5,JIcBCHP1$Ld  \&g *T%%D)STw.'ϥTR=lzhsW1~zf.OO5 #M٪erƶ.{/ϬɅv@HICD|M&[.zl"d!qy3vn$@0k{rA-vؼ<_UMNr“~1kǓ̓^_ s1Z款SǨ WU5k_?\C\P,M% |cygDL=Ij2P3x MK 0C!_ܝ^Jt NHG-@*)5d L鏙nω,[Գo8lS֏П/+`L9oAzY+ӑ #Wt=N۬+N2YQLuDy&xdYzږ_P  -C@4 -@!Zg&ۗռ~sͷ@^7e(@9`)$+\Ӥ8'um4mF^˥sj]z>ǛA'j~UtMcJg>,iED#7tb dEĘ&8gsy'`}w AS󟏹W6uiIl4j^/Fҩ~HON-{i͋IHҷ:kS>츲MYUͪV蜣j5@m@JA QJ*ieF5a!Mj[pX~۾psG;gJ>lM,F~U̵[orD;%׼~yҵݏ9>̘o6BJ塒!$'520I%dT%H RW(/:$brP) R3HB!(ȈW 1#=$A43M^-w]z}5g9}>_զzY0Ƥntk= 3Ph4֋mfGg+mP]$Y -4=v h`0iJ[M@C@WiG}gtW4@* T04&E e#>F$)ZhW6ThQ`I:.1%Tσѵ%oc<O|j"eLdžcHRv5q1H\KL.Ӱ Q[Q|;[6ɩj}iq.N1t:g -}k?}}(_գD7V4ܒhu*BHJgŖ2ǗQdfk&XUiѶPs@$ LPhk#ANI'ل5(JA66ʡ/v,nzu$U6O?b>lyG|^sύzoɣlIy~Zmy]+YRD.1vV$&JF0*_U0=S`yq,FI1Oww9~^x>KcvZVpowk[i] -_:UZ %b)ʲrRܵ&$_AjEmn}$M-!L@lh/mϵs+?GY$bqMG/?x~Og. 'FܼԱt4%uGl^EIzg(hkKܧ}]2<{&HW/~߀vxDx's_^Zq<ΰd:o*{_6'B&Z=m^4/D{\>n73uoY7}'ҥiRIW ,jJ -Ankqb^Λnyzgy5s.cɊ97_stuHϬ>2Wrnh"Vgĝ -~Fv]oduxueOz׷ŗ/% .6:;'19bk=O3]lQSNRv[CLCefÚeidj쫚W,ctiR)@4&C@$ZN97ߢB9$!2SHcM4UVă=4s|kǑVx|vפi~^Bz.{_լ.&n"\C3;CU2!"DJ\j5eey]{ 96 ͢8ܥ9jM .Z[i\m:u4D9`$\&ε}sE- i -BiMHi69y ɱmd z͋.˥{ͼ{{^}|PX[;g'6siٽv9baӵ/W}m34 :DQxm7cԶ T>ۙ1}~x6.]913Jk#`VVI# -l^g0%qlrxO:>| 馑yS'潗@7wWi>=&v.T˶ n Ml[ێmzw&[ٖNa4]fnks &gC{6.QLwŗ,hl ߓ뙔$hB/>g>\1JibŅR#9DH I!%SJ%R%V4hcRk{(j;N\ETCL-fJHW*!M8j[EĈ0!?&l/|cKy<~1Go}3P4 1ÙsR+&,dxˬYi+*i6}[h_qJ4@ -PM '}NyIc{H9rs}ہl?/6[x_gzkЫn>?>RS>nK{_x>IsN_t9/ZQ}-sKh[5NIh&H`o>XX_OY՜~fvAԫ)G"3;/wߕ?/}%u\|=sk -5!HTZ/;1;2mךu?ٯjpzO`nw9 0l|Cuc ٧FyYOgo>I{n~?4J޿W~>@ e2&:%gz_GASRd%'#B.IBLhT5 -i 9ie\`Iyb"$PqaHB%|׋5Rcs+vˬ`vo}/joGOy$w&=sz_;Z -ˋ2lHg ;tQ6 - @`!m (L.λTt3}K4",1XB I r -T @&R$ܹm6_?й5>S5d֍_п*DE@ 2bJBB@ !M"&*Mk-kdDDQ4n6о(lGֺr Bm~[fǔ)R*ULdD6]oǼ o6,5 T828v= 'ܸ3߿xW~G7)"Mcvy͌yyM7MLר -QN5#rt\:ORJ&qf[vг׻|H*RJbCȵ}]hm9wz̗z<_kdF2￟u1\_՟QCt_.nubv_R<o`_(p~y|F=2>v#tdܳL0_z$_8>jZ=։5/1y/$^k69wL4S%QpZC|~7{6c|#蟚>X#uꓖƍmy}侙,`@(bĊ!&Mj=)=>u>vg4AD hhTBT0L`LQ5#w/8 jK}~Wa?&{Ϋ{WѾ^qRL\9I,5٨[ -J\Ԉ@Bh$@>^,n>fN>NtZF9$I0)(_'K˦wcIϋ9|/0=ҤS|q{~ék5s\K'$EH #x " MHTL%c$'}Sl[vW(0s.K9U4!)L(Xn-Ei{#d`iIjƖY~k3yg_ۮlz9RJb!}/c=4i>taWV! -UumA-Bri=>U}G/oxu.TJ3`ŭKkصOXջ͵NAd17Uz,=wijr>+~3h5o{]LӚ]'\Ӵ;oν:-uy}/꺟?oo}nY#l֝wq>D=]u͚4y^vOj1:,'`-7b>Qs=Fn >u/=_s ^6ctL%Y1Z]c_}=sSL"F1Q-(HЌNir$ʊa1aMI */;;`ҷ@&U !P(4+P:ѷ 6DBWZCD&lֿekn+{>::@v?0員{Ϯ -?/U޽ua&d`&|?B*ʵZFeTZ!K4+! CBTXՇݽO_F1Q@',ܥ (! #!DhH9Nts $Ny̅ޱc0A2sg#}}M8̼$㹖FMvT- N@M!0MI(1k^27ܺ^Ciu[I4IOO@,;|PP%?DP Fij%pWa;h; f׬=7U|GϓkOm>橶ڹLJ:7w jh!H؄M&ޢrK|os΂eWOУzvn5YqqN<0qi۹{]_WO6nLLsu|_C~{ο3cgN%t1juD.yLw3'۷^o@>Y]kؾ^-zے>7'Lag/zq_7<| ~+||T_V EŒCYJ  -YI &!U$)*@Q@Dғ@F"A#I{rdD -"rJ '#U*oj˳o^҄5m¤̧*)5xWB[ڼ몸K8^˂9W߽$ϏGӦewHY2Mjdrd*증IB>8XTU d&Y4 }@Ē` !4*B[pM8Mctwѓv~Ynծ^YHIjJ36FI$h`TVW6dKp aBhi(Dr RT$1 j?ByOoM41,Ф FЎ/E1 @ cv}n-cd:9~ȉ*bLnC!f=(Me0bY"-З`K}&"кSĎqҹn:# _Sx}/hIJNkӐkM[^ZYY97Y2S ޶3YPJ! ӥIeϭ-znD?&9 )[Qzׅ9wӝlVl(%9eϛ_jwOSXzʍ6M?[=Gy0yM 0?}͓loa#o.gڻ9]?|2Ε. _wn|O>EVY<~9gm#ElldUϩ9{ YU 5@A 5!R-H\ H$!ϫ.3_f=vFybdD&W2][$j4)Գ4iHLBJj%O5 L3ӽ /t %2$jघGWW]0B4L+T9`}a5 I{K=wMm!~ M+HF73)>0gFSoCExNu/ ls;O:D d:N|n29g3>TK/!zb ~>?Y|[&BZM NZNWɨ˿>\EWCyX|ѿ=w4IgZWK}SIgk'#y4˺wZ#yw:/e㝒\+X}jguեejZ0ܮZW,KD4'4! JMԒ8 y<ϬkFioX!LJt@H9Xv9<6lxo?'5ݛuzu͇繷gu8"nULԁ5ـR%" 4hJdU!HdlwӸ.*o7M\Rjhun -!DT .fa2cW橱oɺ&HݓP>8/2Мqk3r&Vv~Ow<+ͮ NE{LcjwkޭFb)x٬1^-y:yOMX7~3?^KҾ+8mk]瞴|?rH( CTZ^\Yl~&(Sp0A#PHH[tH D&jJJAM*L'6$7<9ƩkqܤHq ɜa{}Dl^6!3 dVeRJi 9𯉋[z& >=*GKg[jO`:'@@3Q -9N/1Uz.7=2 X Ƞ,%6TBMOzbyd^w>0~t̩KE 7;&J9c@КłJjQ0HIHC@@ЕHMQ~W6NoCX:Lh{$BH p;^ǣV" !s}>Wsu2`69lf7R А*TH-<ߴ\{?6>uyTv9m=Wvx|ݯ9oIo#;>鉸SjsO,rz*}tK}v5xjO ?ÀU\/$::9w|~q'0yV+~>Qzax?ҹ;Gד{ׯl).&&mk#󞌒5( |χ/Lw&RՃ@@4KCBTp!rbH&,p%HR\~ONs<}eUH)dЬDΛ!D1 Ag>`ΙÛAz}vǦ}&P =~7Nfŕ2RbUsuT:,bbVXqɫ?kxN{=t8`PmQ -IDQs~sZ`7/!4 !F 6D6HJ&rBjjT#xG:Ub c-)q3SBHT )J"hNJ@I2$h*BЏٻj8oW.) VG -n(h@>t/1?pҺ< 4uI9D滅H~ -L:C ~`ȡmR 7dt2wO >jvyѣir[#G1iqKh\H_Jڿ^6J>iAZՀB aR0T›Dr?9>+S,֜O~^g٧KFIJo8~|Zo53rb~/:W]#Gg݃ƚب?eJ4|n].^ge>xoi_*,Z3_Wyؾ$~ 7e]ri"d qSI1J/.,Gђ/pUD4)\4 M(URS֒5RBmT`h;J LIm""@X\(P8Y -AԂ Ld߮~xg۬ CǟG|FU[ -tOHf_'Ս1$+7_Ceȯxu5WJu64ИD/ũ)A _GυMϧ޼]ܼf2Q& -m&i"|Ϭ}U6kW}O+擄) i1W+ *RK&"SBM4ʼOq6X*DQ K] H@ Sh)5P@, c*h4T CA-"`1IHCc%4R@۟-$TTXB|\c^? -}gl>W~]Fno씐ihgT5=!Ϸ J#r^|BL5]Kp"B`~ hO{}m[NVn)yr]fNq<+kze1־8M -:NmKm ->f-Śլt#L= 潛#]'K:+4zgzv ]ur]7Hy0Jds<~p.+r輞u71ؽܓ'[/3N1>V{6'É3}KÞ4??^Ӯ| z\|6U/z7_^_&L2Ni_~66wWi;17~_7[ܴ3mdDКPVL9>>ǓyhJ\Ķ"TBBɌnXH$h%C@ d@'#NF)jFIR: Y$/lJi ȉM=K HjkjI -zqS -! G͇upohN`] r^L{͏&lJ@bd&\y529˼T:N̒ĕHD|_`g:{ڗn>gg߳x;m5LC@$& XL7y{)RBV &TDRbˑ*8<3c\>cQhƲ!\&jdDhrUʠR4)e*N B -H!2S@&Di00-HIHJ* H4M щ\i'_y_Kx9^y61A<|9Zt醉T H}Kʟ1Y`nZRr㦩1@* z:R->9P>y_wHس=wds_7DksKni<|Hźǩrn>_Iݴk<+pֱw_5۹bsi:ԼsY߷,a̿/ϳfwNOU?=q^+yOR99ys>?o~J} pәmӷn9ϩnג7\O_8v٫mLmy%<Fy>(>{Fhif/;vM5psYL~=~kх>s =}G-fIA -mT T \9>/>3o4b"4 -C҈*T*U I H&%5!zMsjնBJ'D{y c>(nKVNRͪYr3^KӾ%9ngY -Tc>繣fs#9k6hLZˋ.M2A[KsU@t=C} -4yH9Ƚo8-)I -@D,%4x.נ&ׇ]וklmm$lRJb+M R -!4LgS4 FTM%SH ȀhĚ\c%,7*JRА LC@ @SiD4  @R[BCDR$$hTXJG.[kR{_xog>oxVdҦ5_?-(ңxi/7ҏ)guv[ĝ'BعBt%qof:^fwE/ſkړju:ʟjV/ڥ:nTy~%q*Doeu(yI6( -G]N]/u.HY32 -2(+L\F"_Q}}5M>ӓC&"~df?S\jO.6F"v_cy_t<NLRh~nuYߟm4n'y~}G>3Q|ZiݱhdZ49B>߷7ujI%PfĒHV EȢB`PU)L+6 Jʟ| TkzлVDZ(y鵮+5]S ~b'D"U3DԐ!T۳ tW6~ܻ$M)gI-l=/ldm\kf^?~K' "$'Y.d*}2W+70%RP$2c3F5N̿G7tEͅ7IT i-:`>|TNFliϙĨj -V$i}ye閛@ %#@$IVhCrh -MLw&yLTU{.Nqc~W)Zέ|O:tOqމNxIdtLAO/QvrD*@J!XkO2>V<d>?hӼxvw{Guf~o#š12cU3Y.I(DA&FwgYQ4:Ro5~vXmH0 !LD4 [Mo'WFGGͧn2f\\sN]' %* $АCH*HD -ja'&1HfMoaTR(X m& l Q hɡtFI @%B *6u}Y '>m{ZUi;ݢ9+M3];_rN~ϕ&ll^b˨lqⱂ*9|Fm-+xl1 )D>'ZGjѲn??雷Փ8ѣ:7n秸ɔ`ͽw*k}Gx^ިokzK})>>IL1h/ -w=Y`}NFs?;#C^N:v/$^qFMS^Hvsw -Kɏ}m~{~5.Oj|{=dw__SXtU=YDkp5OE?εޱNUwG]*/ku]) -+JxyixfrȔqe+@Ef>CX3|W;鏏ʽsopOOe "A4!%cT4$-BURE7+2zʤdF{ QPřG_|)5\kIt:Zӏ/KuOaϟOwqCm}sE@ʢTdgɎQ{[TCC$*ZR¢m)[4>|=2{äF$T[D4a[oOIڮkhrvszTBmM RY`7 R@1 -2I3j&.hI1q*&!4@] aQ4@@NA h%9) Y@SA-L&ml@$Đ 4 Q4*\:=0!69x^}a~<D{EC7̱{9>μNgetm9,o%"/ͩl^V*w 17|º-y|*qs)z^ iڎ1Nh̵)_G'U|#H@&_G6 qqe'Ūu͂˺xl.uAy^RD!@%"FJP4IH/_c F-{Y?AG)4B2ιg}'At ,x^NߨRsQ R*BhV\wYsq&;%M궩)\h#z<8Z$DbME"1q6Ze0ICs`2)BTƟQ@A, ;eѶ[{5]ͻ!ew&n~zW4z.zXsj~tg%c(HŬl_ͩƹ9GW\ -冥'AP ~G/nan|ҽ3e4->:9Oїq=;>[9Ϳj&?Gycnomx.!r^{{_?cxsޙOzB~r=ff<==N8g[ܧ7ѰZkC<¼~}c/; _?awcΣ}1^ь~y@A7c$&|\;v[/+Wu9ˊLX>/3az~tHгEêp=ʷ]֮c,95LfÛ)ƿDY#Լ6iW~jqH PܸҐ#D#` LZ~acC'&*8k/V_>|"9^ԭ5OpI1L ˅b|tKw8\ RTQ` PJH@`%fl\Ly4ɒ*e#MX4+A*dk0Q70$P%&Z%4 $Cx~>[6"<4R=D4!*BB@xrԲT 4i 52 TbȦ&n #Fofh1p"VlłL$!A-#!&& "k@0ITZA!'ǐ玍<ބW ޭI×G ס}‹?N磡06yat#`& -̚!_~a7C͔8Z2*x:}oZDl)*Sq}/g޲f76$O\zZĿWy@RG̱{Y/z#|ؼ?ikt6Tx~}/ sr/t$ab4R2FlU ҠCC)!܍h0M&>C>?i&&>ܰ[A8fWթs^ҹm;ޒno~q -&ֺ{TMH&S0@JC',"!CDBp6fd^ϫm!{8z?yYɴkY$z3:/|NƗ'c}7v|>y^ -oR wKgoLٹ"_eKz|_&?+#.#\2sF9LچҿLvlgO'x^_}^έ1tsof3çp᯻~uOk)[]4qR*GC][XL\Xw:,ky߻/ lv-%^+LzN yrŠh@QT*BT nh*2E )"qw(TUˎw~^&ji<'| ΓJǻ#\O֤m]<%Z'ME5*M5 -l& -i &)9j%6,6dZ( ` ЕI|j1is&׹yPꗕO+hW|6H  ǬY{NC}{z9A_-Zl&ϕtM!5 &*&6sR g&1*BNM7 LjĒ&2KQ!Mv;}qR Œ!ZsaRsr!1MH M@I );Pr @ s'̻4x?Bl5z'É ێ/;Vam_7ӢFMǐ쵱۴s߹:`'L@˺u|̧[!XL jk9Rt?+M+yѵez7Vbg]6B#bȻzѶO^mSw6`Lw)?<߿D_on5rV{2s_}=sJ}w7~Fxo똸bbDד{9Ƚg=ͽ5M)^;@^|x[#~W]mWnᛛtŗt -?F'*pn,F^]FjlínNg1ݳ/0:Z?4I7m&NF tOO|˦iy=%ͿO2-4)\\P:CRKr5RTH`0MM C022g2nojb-LCB Lw.,znfǛt_ -}}]]^\ @&*IOg۵Uc OCIs/$l!!If41qXYY.m!`dba2RXٜ%Ңk6N\U KhCPM)ҀRZF`Tk@PJH8@0W:enѩm&rZGxun?n03\w_yв/&7-||M+gN@Tݸd/ -2-Wlg@+~ -dYbLܑ!Rr~tMlGw7[idv9Zb_juMSpns}.ӲRoOJ)I=7k^v3*5 #_<0˴kl7,d~"h7ؗ]>>^c=OBW鉼Od}2f1zSԹ3kS{A̓C;N#_s+'޿NW^7Zv u5mjXϴB^@_w&qL+vgŲƵ;e_Ȼ }'[D J "JT?LJMH$rRR!*WBhI͎-M$/ߩ큇} j~Kb j+Wdƨ @Ri&@! @@/>;FkǓk`JMB!.RGo7>Uk>K)ˌvWl~l7|V0@&Kǫk>O|R{L:Vyyl^hMR~^auׯ{t~a -˂\:ꓐlzY%>(͵͖gɉ8]7/g,/*S"Igܜ˭|޻'֣pQ8_>WX~_sbǖ`vm^Jmɞ2|f֍LB{On>51;SS`JlCC/gɏ7^m˯Uz-:SwOU/#>MLKJKCyOUv]2{NfĿscm: 趛}HM/1\*I6#^~}acZ_tX?Ub|ɞb)qH R̍(i&*X 0 EȘ2fŚ/şyn-2JvjPh^w] #+_ɎW}Σ皑茣+hMcE^noOU#>Ul|˯lAY%"h!&Y@ CBTfRa*K ȱ܉2qK}2 Rc410D,I)jT&s (JZcjfQG"T36Zpg9i=/N>k9Wk"6_Qi{{n'?FϤ@4 -ۄu.G2kx=փw -bZ&1?gLvVz `_Bpʺ?׌mlGϮ<3rk8| ?sXŖm__S6zZ,y|}P>6_^tht5%~{͎EϜmZ5}^?!z<vƺ}k9GAͪl}ռyp닖fc=03gIH - "I=^esKxY^|MR$<yKpjK=俻l|~{~Ժ$Iz[][~\&H}?-}7 iĪĂ J` 0Sp4lC@*hɛhbͼ﬿(+Zb擴ǝzQu2_^s:ɨxZ_fi1z&mb:nkMb{Ybˍ">ƹ.f.+iz8l''}c#@Hgqa+. `y~|V\ߞ^sGif?'{fUT>otU> -{Ɏrc_'=?]W& :ɴv-'6}3/ӨmlƮ{xQZkL<= s4@'&#[q|yS pT9U/t~4s81i|6\2^g/K&Zu&"cj_Y3`]js.&(o Z@ Y)H%qDi^6;>_㑹g.b|S:'kQ-i^}!"=lJWγP&Lqe4GK21"Jj2F` P cχ1XJK4@1"_6_. /7Ŭ5}C4>vwbM-nvsCsQ&@r|c>m,>&ѮǢnҚ*nO٨)4P!L%P""@IE!e!+ (IQu -2^ӝ9j؉@14 D*%CIBZDt -NA#VK`fnf\)=~I#6?˿?X!IYMDȫ#1|kRoFܓ-KiJ폎=7>upy~^y'/>/KZW7o>/"_>L>il_#v-Hۧ|}N n{.lֶ3j U7/CݣqHO?T _Y=_V&<jFχ}jN=tuQy;>kt?b[6dxwS5=-[lAͺG]Act^o&O'G:*. us9y{Nzyg={WT+;Yu_x>C^NIo?>y'Y=5{ß -*)da__~?\79X,0]>Fl,}ޖ x\ RԒ'k&q*!'|<{?r5`I zGG#eˏ]6]9f>j𞿋j{`%^Տ3@E hPM F%R&lRM 3eǛ|dǗfP-Uje.-JjBIM N`M +DXr -H Ve Шc5$EiS -Sr JK H/X6B`SXLTD2NH##YYU* 4IB(&LR @60@RӖfTT 聁*|fM|.-y~ԏz9Enڱ"h Cy~TN -tP{@ϔ@-GoMDMguz0~*^~АAtNCY5+r&':h][|n9_c5wE3*MZڴ h56C5sr,/cRvo?txnO)]g'Ϻ>סO6#݊r=1v8^S/*^o㷔>G.wI`֙嘺ʳ>yeؼ7DY #j6f3"ieFJm\R}1 -2"FZȤL4 *"h"#"+> }GuZM"IR P *P!{!1Fy=L9DԶ3}=3l'؂n#>5w/+28Q|_5vKrI}7Py5G:t8N)ʼ.gSkUz^}f唙4%@X6JK!IA- 4 - yǖ/ыejA5 -0Y"JDC%R '2$o@1!RQI1"F"+j@CDRfLPišUH YQAYc@$CEX$C@ 5`Q`M %%D["_ڗ"N;Z9G& kg^KAꓔ~Ӓ ԉ11~?SM7Dֈ=X 0ŒPP>/Y`V}yW臍ֳpvdb}<_Laj3N&h Ȕ [sca(r4`InU$i@7,1DM )b k"! W"($jMPe Q)!bb($a}Oϟ/7ϗy"6c&1 K@KhƁR2L!RZ>8k=y{m膧س72?yRrҩO)Aġ,|?r>/Id UMY*Y$!9T@@ЀMi9,@ @زEσkY:f,Pʐ  Y%A+#MK$i#01 B hi$`qm1#J!DbETR+P!M !6Pc_D. .r -[NN 8?tԾ1`  bMd0% r @M 51 h *@5-KCAR4M1T40C&mAd2QJ4բL!`4REG4e $`6%E7*)RG,$HH) D0@HV`6ܨIW,l@!XZ.Z9V  !**DR NYbc̀[?tìwiDDD0E"S"FMC$M -M("ԩT$C edDR#A 6@Z$ J4PJQj%3$$Ҥ4  0Lr119cqq/,#շچ]og}ŚX>O~~5Cf" D&M**bDJ`K@bm- VC L¾32_\}!+X8~c<|guΙ =W8<^\KwcoIꯗgw3u/o|E)Ra2}y3<@?h<ʥ$ Hh  \҄$*R!$'64uB& ) 4 1-1SM 4iE Ei$JJ28h4 VL6 C0f) Ɖ4Q%MT(T%0 i(  - -\0CIY WSpV)`TIJTFH(rЂb*(-fF8>CO -+xwo;i޶.$@qHi"EJ L \rZSSSJ*I*d HTjIR8C@Ԃ*YU$*q#AR4!.+Z:%.>7>AiܵnF L@}">̭OC{yֻό^rWXyqqI]7 gr8[;^'Goś[ :&zu|:^>pGDpYЎzmuIy>DF\A Y*Ud\)\Fl:rIeLCTs H*|D7|˞>Q~ qj㲦agHРT0-'#P41rȱI&@hbcJ4  bP P`@@wV0`S`l!5M҅/=3O}jثn5,iy͸b: -Ptcc$G^9#%p|;S+m~f~k_ -?^hfO ~(M3~̈́~_ --{ŝv&&-#6f3Y>C2k>>kϯ}[juMȡc;S?}?DS:b=^~c.5H UR1+D@@KV sR$ISJXh"$%srJ -B *jL"aO|xڝoFvO3[+B:0v fY0e/>?rx+=/Zg=#ɟ|TYvc=P!rg'ȞCܟ"Ɏ_N+1Lb^|e<_a!%|G&$2}X3l>8K}XsV:#_}77߇_/%پ 1|P/? q>pB\R T )(@f X  3aMT}Ac ~7?|>*~_ BY2*'x&_+>@\,#A~$+P\E}|}I@e\b=o}XC'3 r|`'y%ppDf;! "01A#2@P$%3BQ`4pCaq5DRESb&matk[]"GK褺2̺3. -l~z4KF0DFe]tW]EYtQ]5ѢOF4KD4 x>B4KDˣ."Үatk Z]|&&s4=n&:|".qt]].Nmnq5nkKK[ r/arW+ar-ar-ar-a<37╽'\ζe\bu/ٗ<#{5܋buζ'\뗰&\\:ؙ=yr-ar+erW+erW)erlN99ewwYlYiwoQtgjYr;>ۺa&|,vlvu˒4mnFjvl68g懴3-)ɞ1;؈_J.ٌ=9bF@l/#g{0Hn -)v\e9-},v}]ܤR6Z9jvd"%Nn G!}ԭ鷗L -5ѭfݰS(AtXFUhW!Er%ErTW'I45j - ,YjZlֵַZjZ[:SkZԵkRԉ`ogм7pO eY=jJkK]2Q|t]%tJtᖙ>k,'i$l2ؙmJrud%h/mnL[3-bu:ٙl̴q7>o7Yn:KY-dKY-d[ZkuZk%ַZkZn:K[n[n-KRԵ:[N[nKSnK[N:S2Zktfp?/U/Ur+MrWNm.MtO0eۣ.뢒覺5,=E5qt]t]2闗N}}ݟK9䊭[3-V6hem뮙y6uE. `jU]6jtrn[RSNuunvOTUzt@ , ,[R~SG#lL.:Pw]>ut]lE%WF]"WI 6EN})N䨮N.^تL_b]k5fRԵ:Sn:KY-dY-dKQ-dSnu[UeY=jjdJd*kEӫ -WN>a'eNuh.At ]2T]253]"WG ]WH=U.fteWF]EuMtYWE> c]IMU.WMu\\ERNf[3-̫jU/oSW el>n͂E6 U]4) -iڝjuoۛku'WEgzYe>>]inU8DtMĺL MRMB>kJkb6ZֲZjuLNz3uf7Zk%Zj%Zku֥yW8CYrW/Qr\4).ViM pڳYЬ:on?KgGyMYoœd뿇X7Kv2O}R&vgݝjɳ!1vSm3{fNhef;ְO -FOdߚoɿ'Y:UPFz4yuˊդdLVI 4ND/8cJe_inpu,rF{\/Y?PhhCFq3x[^&z?H{7{V -{; 7{^hMsݍ ^ޣvNRok;͞>CKK'- #[dsO$q (&x37jGoȠ#g-[S&'vfc4?LA')'Uջ>$okK$S0f"re$RF1Ys5_߭IVt%}֒YȖ]f7خdy?*? ` ,2N!n4ؙd2L:nG.KD -cŨQLd27n* -u뻐zn M 2D7 w3/:wYsg]f8oldžkX 74E/3cl@v$7C4o.%$Fby&mr'c|S6L׬@#̓!L! [5·j1m]`f>]B9!{ܖhtC(I+ [Bmx3uzXB ?P@\ʣnju>޳CϥD}.;ҾSZG -mTЋE;QmREeKMsE.z$/vi $يn& dN>`ru$ G+JV*ޱةZM_PR5wv.杬i4-qnD0f٬j8nl\ -d+[vZ-mX6! -EZ16rQ65nՊPZnLmOfN=`'k$pGo!Ps.ӫz;6qB1Rӊs C$QLpdLJ7t> y0w휑@E9E?g+KzKJӱhg+ ɳI06Af)/\ɽF$dJT{ -! #f>Iի%W&Z {ozZU{"`~-U3v=vw~fp.d9`"4ecB ztf-[\ P9 =#eb(XdR!!*H%uZDS @:>H{jxd@cNN6ccF! >7Ş?eZfp96caHA;N&3ݱ>Dp-5}Ǐ1qUK?A7`/ǪBąu,Mlg"7o#Vfќ28]68*dR&VpeCgpgu۟d#'wL3e͠r0 0flV jafaRC  6`lˎ_?M'稧UG\dz]iudOLr?eftnA ʹOI% dxl:c& n|o C -Uɼsw,O,w𼑷Z('O;nٷN͟E}k1Y);:GGu4RG.i7LpU=j:c)C{ LnJDdg$sQh2zr95ms6[YI#ǒ,^fgwtu:9(gvrc)GT~Y>T%÷ւY;zzgS~Y~YnG8tjоqY'wi?fEmrr$ ]>o,\'x~CL6jQB>X:r?IX?ߒ!"')2ު̹#6B̂zku_36m՟ѐ}<&Od $1L`&AG% h`]4o(e"}1kQ)mJ3ˎ a 5>,gs95 (;nBFQe#'IVLZAi=uzMա=&wP1,&va Nϡ~6U͡L1gMN#rbO2)Wwpf;4<+i'zlx⇘x3vK `W,͟x' ag)`\Ff:"qSuqVɸYyvu,mgԞdkFX5BGbi['<=I>#WlEcȣ( g^^lZ?>h Sz/ V[5eٶOmF"ټ#-g+RPs)+eaRR~xEVYufuD1140>Az @n` ̞fy`ُ͓=?v]t+&ՐGm?S|Mۣ.,0NO٘Ygԏ{W7KZ[oeI%).P,)O8VIH\O -D!l*V@+T -UvKz"Ǡ#l:HDDR B6_}7T7"ٓ{?aO\6OZ Nr͉\ۛf9*ve 9dy&u -"4jl"(%ԯ afro#z^qfmu!Iym~3D:Qaќu_ P6)]Ճ"N`,K50v冰sf܀&u1 A{P\6gOv)HD.>Ppn: 9C&'yb<16hB9F9<7WqxOLG8h:F7'93TX+K:#Nb.fBQHf"dioI/3=fX^m'T\n]Yteu}W%bV2xA{NJg R4Q.zx!sF' +7MW\uiNZ~xUVbrCr(GA;bHm@o黰zF6WNvZcBA-E lh'M<3y"-˘^BgbJ'0报gI{.$ky3 pv&h%,q"ӫNiqY޹wbN^da17Pt 3wO yw+jam$1IҩۦW].:|> ;|pl2Sw֢Zftiy%XE[8rUި7v%iS4EE ;s36ussgfOx 8hFRIjRS/T lz}R\%St͓չ䵒V|<ǩS7r~E*@cPox&;pgu%:&vRabVv;32cyqZȰ۰J3b.^ZnHlaIMVUܩ͔axq#&n͛ZyKUѮ.mPrI-ag.g]ZUOoՒ8uWRF? sq/7`:\Ao'MreY6l<6ȑdP_vfkQ,Na!;xt}#MTd?K.g~eDuu:Ե-Kɞi?M$uZ*=rO81D18a>r>Mr/T.Y0tլ$,x4AJc$çr#=MqwYG_٥͖XƤ1Eo_#7f(l֛(%w%v~gEXp(p% A;Vfr5D$w_9$Z`^5zٶknQ@MٿڳGӅZla (G !%z)׵cT6@H+5j܀3}|;ez|kn<6Kh=cQ]bIvT}יw\ae{{az`דYz"kdA,=X]ٙyg ;eDm)? Hq1-nd+1$DmKvN⣐J{hv,?vfOrHq@f+wT,I`fsfT$B lK$n>F;8dqڤHgx q5;,]x'k9?v5Z5[М'y;>q.|}u:čG7Xv@dy:&O6fr ZI0)Ig0 ?IEZm`vd\OAn ~dB./ݡ6Nxqi?c8K8t*sz68 UF6mvmZ܆Ve"P\I^)[u-jYq AzQJ0MԸ_%]4"[jH?G~J)Suhjr]b5?\WwrtoVBr8,c4O]ѣC:F@0~ -b#''¬ jsR̦ *K4olN mu=)Zj[!.g=#3k8t/,A LDl>gSy 6BVqb9=w7uc "Iq -UaJ9",$t30":pN&nvLJeRAqš? 4or!r:ef6tXkh،\ E3$A̚%>{F}ʵ~SiMq-# nz_EzwgUWLߦE!}53 D7[* xH5wӵrYizԨ.Au+yoAyX'>IbZIhu}Y8fiD@p:79;0=* YEF '*ݘYGG 37 c݄Qa@o跂UwWylu'fdG`ul{.ډC&j8f`1!6\/Wok-NǑUÆ\%9Irw2tt 3!l$1&ZM2h~\)\)?c=:3uB~ANm N7<b-j՟dsD27HtxFUj5`&^HGZ;Y9M5,U)2 ry;l,qCqbꭋ# >;3ݟ -е9'Veի.Yuj9X@1F>'*yJLO-N/[h;kwQbA,'ؽF0y@^owȴ@\lY+Vmj$}nr*-6c|7~G55[X@FQNlV;ZDC(DbdG10шY \#!lK;HIrwv˱J3P!,/?vL8tG뾒'VUҳPpY*D^jX7WyLkDIoi+#yb(j딦ᅽ)2%8bICr}U)x"h*zdm%>`ڄc js>BUTe%Z.<aF6HpE LU!zOT2ĩ;uɊuLm#2VuGnxc\_XW8V5m7{d}ve]lBf;ra2iX&׵˯qfj$9|k^ȫ~iA9u7ݽ!C/;+ Lؖ♳zc9X})jn< fv ; Eޖ8 o0 8VGa&Ȼ3d߷2'Ygt7kä₽|86j`BT]#dZEWfɜyם>nu3k(uyǧ5S;MV|9)AvvwgRQ@> ;FFc'ËN*zL谆rUF"Sӎe$Xu3h3|*Gμ]GK8|Sqؽ|ŪҺֆS/v&AV5gv39&Uz;i0<&9A]Ii6VpHlZ[2^Ӏu]ʤ bM6 A-$Kiu֗Yp[;{գ'g~}k>^%jAYGK fMv]6CqH Mj;EebzvZ yQ2;RP/w #/Hc8;mؼC"ƣ&KǠpڲ$l6Τ|Ăi[ -,l/\Yar]i}06FRO+Vj y٪I6$ M]8`) 皊xxJ@nxLbaWˆ2EĊK XDLT*^p%(8ͅb{~3!yUs}/YkN )1rjp0hd:)+JOJ](KKfxdזCnY͡o!]K$!ymAL7͂3Uv9X6&ܚF1XKV{$+DEzRɵ *r=^bm3bm"*tuN@M]>֥Y;m&Fu)OHzsC$TU31uIjvtq\n[atuIE UL^I1=&r| #1[SoIbV;$G#04[JpYQ2uaٹ -YdmE.Ut.]t\KD\k|):KKr|rWW%wK3zdbg?" \^ ͢"oF]i*dпal|HmUlQ[2v9Emn?wh*.n%ٻl\L =?O2wtE0ްeBUؾU~Y\N)CmVUA8X7ڱ0') ٙ6X}cYع J#i#0Īn] 1}nKTO^y -(\ƕ뻰A~ l}~Ez.Ϟ^L'aN0tue/qa8jz=&S-.Œl M d&͹y M̺i9>PرeəזE ;4174e #7tq]WG%  |ۃf&6]Ve\5\5\5S]>uӪYt˧Ck'".b ۥô/ f=jh{6"Lݿgz fx6Lկfau ɷ!6V k GxT8~OTG*Z*k+ܭVQCNXAkB*s5=2vGpQGRk0FN燝'A3)9{hY)) &|ٰ%)*StBClbcVxO(:{c {Q}&gR[ݣsmgrV!ܴIpW'W'Z]iuiuNY? eSEba+: "h3BTzC9 .A|苓b)~Ɏ6JG)gZvsMr}wcc5hO}-Kkk1ivq&}68x arAV##R`7v3j4r Wٔw?IL -Zv)' K6riGbw+[o YH;"%nU8kwݖ!Un u5JӐ b:nsw͕yL:鵷-\͖ \b|8"hNxwx޵@٬#w7h_/E~з48޼ 6%HG^(?PZ]F~ꓧfM%wl,F?v$]PTuT]QuDؘ&?MRϳfzoX]$B:,RC/8yJXg<(^r;n#3ԣFO'2QhD?&_#s~{ -KAn ~s -ށoW[,ۆ'j: $"L~an(Ip3h(bVv8s-ח)fsP~ ase껈u -IʑjO(HC1QE&{~͛f9=Yz͚O|ߴ#r,no݊|c<>Ir=Ն\ݕX\Y\\\\\ZMz.zҎݓY7ޝ!ɩnihc RéMBBFtˤQK4X}wQ1 5fh )`o Gjw,䥎AŅ77n~#ӱŗ;_/ܞ@T _YC'}8Ȣ1fGlRCs61:%-RbB49$%.  ;O'R6`\KӞr8V 6 /f͞!k~OzA?O~7a6dq -F:=O0U)\ I}!RXe9X1|)ZӏS9c'ɋ"I7aEV3|Z{G~ {-Ğ9LfI[SO Bjyi\;.z+n4xbo8٥ԖDZNL\i" =6xBjS;ra^&oKԒ<3;h%𳼡7FSlomj.ZO=S!oϙFܮ_V3il38s%$nd/~0lĶq3戵jui%WNR.gl#пǭnv00+h+51 .:a"oI՚k>w/rs6` ɅL'q|2X<" -76&?Ոܽ9nJ?6ĮǤmpzn؍]SKz3Oh! -y5+uc]hPۭ.=l,Nܡ,#^;'8knF#ZZZNP%%u54 _Eg -fn~~U[Jӊrx1ӱqlKќw"-iy+3\H^6\1/*;U@U`KyiD,CBbCF4n韆B6rwLNȫ,Vx(GѰJ:dTpC ߤ@&.4)cWIKQ6M6ɽ&c(#6J?2 FydJ5cE`eLZ>6 +QA4,,J:a9u.u -X-|eV\eXLsH-Vlٿ1kVZmNîNHu t]$HM uWI]%t]6_ -)t])6bÚ#cM\rP2).B*-gk,⢳ S_d2uq:MT%xk%xaUZ]蓼$OFϊ7~y9KNšU( '9:yntd .Fv^Rvwnc6#ſCplоg5Hl;9ˤVRP(3f(a75ѫ(IM*;hI$2q%. d͗#܆HM]zzy~o͗Ҋcw?l@癪ٙj[-[Ane t-["[Eny5dw$ޛz>sz,^S3׌.JQ}d,}PɂjXfg`|܎Q+NlFQNNZ1$u%k%B \ 4W_H*.$ 5[Tk"?͛w'l7Hm~ W#Մ,\A!,LE%F%zr? 5y@a;צ] SFiFtщI;\.ӲzSG 2B jzFZwRܒܻEFwb?gz$U*ʯfj\\%Oޚ0ݷ`5܃uhC&וySw]ɠdeiNޛ~^'¢)'?s;*E&HXlBLիlx]@eOz d&u4",IJ0ڀLK&%oJ|6GF)\1@RD:gɰ뒆,hCSqPfwL5.w'.O&eҩQW }NdVcã<,>IfZpR_~Xt;sUieD-E@pDqj>-䧃hHjT:OXkIߧ`ޏŔ_l dY[q (- ;C~O~yIu C,&D19zL:FheށY]abٲVyiLůҺU5鮕MtkR]=,Y!|"voD>v.mѝtg]tgU(9x%[kn룺9(h=x ԭ%mC)"ff#6=2s/Z*,d凿g&|9gTəm_˙|቟w2jMMR_tU&a8JgffEѳ+C[ѝ`9QIfj穠9[0R6b;O%Uoml1D1ᓩ2(?>R\uMӪxYGn,,hga)K4j=|'~&'ofSjtfKSD1WuelbؐNTbC-w9/fdvӚkr 짚d:;g?υo uZHDxwP[y$)ٞ1 g3ۍk?~9沍d 鯢}%YjgkȳkjkWogl\:4U4NLټ_m,e[!tr,f`D61X3=\? jebm 4_kFoO/Vh hZ]e`.Ҍ^F{y.}P,b*19[5Y3 0%$:RxeY6Z dkIcJ^?o;i&|Ն=F.Ibv7hy~9+Kd7(D:9_oVg?hՙ,4Y69:~#xm+%~HNRRL[C1jlV-]6J3܌OviYv3PN37A>wyA(Zr,O:PM=3wa /뒽q\Vk#&lGkrطpo!M~ES>)/UucUlN^.YugO:~k#O:aPauGO2G=&vٷpaQg9 ܥ;d-c`m(fճj]5=Yh|Wtah &q g\;8wɳGݕ׳jV BG)ACFŷye<SX)X^ֳ15g^VG"ZI8WٕoL힂ϾFӻd vhp6ã7&lR.]MS0ȁ)֝>3/W6/.~xnG3vg%s[QQ"nɞs\p)wJ2ݯ$*ԅiZDCD|%#a%Y4?S39SdUz祽zM_ДfقuW!:oB\4 -W@HG']~U84ϒ;k &xs[nwaISnݳM'pFl`Ǎ'|.r?I,se$\')笚#qDْ}f^1+EvQ03GnpF1l!_g#3337za#5`hwPBvuvH=ZvRi%0s9gpq (^Fh|L2j\ -sé;372cJ2f³ 2 >N&UeYmW[P-1ea6YԵ-nKQ-d:b>w+uKQdX"Q2vxdĪWX>/X͘~c719 11%d0X b[l3[߲vnmP}kUi^i݉HU8O? gdTKTvϴT=mD~_3atI|zުk-~j2.r)ri~{QeԠ]F_Q6^oȺYDjǜ0y#jm`g -N #7 -h++ժzƛ#3+Vw|9Yc;Ю.Τe iQ#bFL-uNvTQ3yG'7[\%+ .Yk[(U"9)K^#/bhcϬ~߳V-PSR[IDOoݲ]::՗!Qr5#Ur5W%Qrt'Mr-MlV[5#,^G[p+,EAGdީT-q>@Pӆ'$Uk7avȊ9fF/~!59 Z62[yO f]ś7;3&ca5j}ɠ`ezS9v uj{C僖m4a0ߖtK._I,:Ld~YioblOYU*yE[j]?g=b9'W,9Ms;M59#\خi=\͇[Vm<$!k+U_R5\D޶^(>drV썘_#R - 0&)s.IR*LDbgQݽ]oV[ՑKPġ/H2DIgg;4$l-Qts3f -RCTB`]B1;H_3΂i)7Uz4ҕӸ4EkJmS}TU(!`%vB/&Cfc -fg^W@O%y_Q}EYE -ޅoBڬ˜ʋel6mC@tN[jݓ2jl37EsN&XN8Dl#>9\2*{ih6%U7ٰGӳLJ3,vP gn- NĎ*Fd<|4D#oe9څ!OFR.RQl?MI.V.Z)3ڂR%!vnJtvx+R/+--)NS/+<)oݹ )Ug|IG3 OlCBY2Yτm\E+'ĠA>j$A+d|Ui6$;=-ZXwg,֣rlOPMڑ7@RE\U#m"O[fN -E;#AV͏d.i깦fffnDS]*5Q!8 fGAg,jk #Eě m%j.Qtj -0W-a0h<2:PZD@XGR2OB"߀"ߺ8t YbIRPB0o'{3⏳x -$[MkLb<%Lߙ=iz_"fvjLϛÈAu%Hd@W^va3a/g7>$H3f6=Zݨɷ3dpŚ.R*E"2=.-aqi3gf&jfO%st3' - 0/K$U܀qf]fu%MW{:]\2 -ҸᴡJI4VWӍku=$[RSW)arvW%i5 Nul2R‹oNMhuW7LJD2_f^;"lɽFV1 ;n8JڙK<ƛع"݉rtxexlٻaajL~xzq Ńze4Jk2V6 ^ξ\@AXew;.p&M!U-L_+tɉ8azOO0~O׌ -aUm'.:5I!4o,N ^ܵ.3d|F5B8'\͗\͕~,?r&Lcsff6L+JZ[:۶7Jbo~َK\#ua8HP9iqL$$7ZsQbщ`'{v}'+f=Se H,mY֢]۔f1s%(C;v;%nvF]ȸS}b --::XmR -\WJY9?EqA䄵ׄ/*p -G_q$5wvCsҾIփ[R.^w\Z\[]6#3ISO5J,L#z[|RK4Ԏ-&n2.4kScsܞ6d<aг;+՟=-QՆ'84KSdw0> -巃HOknaD$ak[U,Z"PN%T'fwB]Ƒ3Xlh(7^@c3̐i&b0dc\"ǧ)KQ8v9a_\"#|R"V9޲`LG fWNvRvswV=r?"XtQ׈ +C _'9{!BGRgU8ݼa0ų-+Yks -egogIQ uS]Ful'u .&d\sߐU% zԂGuoÉfzA$"jz0͆LM~`~<8C*H" --fܗRQ'&Ey6 N āl˖|EQ5-ȩhc}<2Vv<5I\haO'a |qGd!rvm,##~&9qwZE )}cW趡|7,1:O]:՗#Uru'Qrt/U+-飅ΫF̵1 KTB{02ŷC[vggg 7YSŊy(bQ}Uw\%-Pe)(`xҫԜ.59Sƒ=j|4ĵ6I#rNz+.JKCgovtgzL$iȞ UoA҉IB8ʴ0쥩^gwr2!'ih,wNe1}N~Qܠ|0s-˖>n%VoȞVǜH#,VcxƬp 7&6tK].wjw'ԏr @&1YoW[&܌H0ۓO }Gu^;v ŏ O Z7<֯KV` -{}ty6RjWuŁl)xW.t]a3 -=¥6W!i83wS_Xbfhp7InIJZvb20ۓH{'DC|4duN]jу{du_Q6Bf\5SOz.YuSAS|1lRF2OeQԎvl0>ٗ=~W2%֌]1>,^ NKQ~4mmXt 單 -oUEiMuj MjLbY=BTA?dܫE mjKZsb iސcP17C~1òf vQXҳdXxq7e\]]:b[  -N*Z [12Ҳu''Nϴps]V˦aX7Yu -Sb#!͟[(ɽ=,e{}{3U&YYn/f/ۿ;v_~7ٝZk%R>j1#<6瓎`EH:NC$0} G^q)r\39uIoP\ jhicn%ӛ4Pݤi*WZ 8MJi -|bƢ83I2=!-'IoT[E[rIVMR}v't`VMڃ!8jϮm"?vy)e:Fg8U0jA3>1S>̣7uh}M^g.MցڱJOCCxâiu} 6v*FC&>9{Lri`6XP(xeOz9Ɉ+p'9^]ƍ`t]V]*¯ŢOd?S'Y:No);6U5 -:x+K,μεW1+.r{YuSxͳl|[q{srwifY8MQ&lּFXY',edH+Igv#؂j96v]Z4k: 6Yp4&hpn(/E+_P\|1`WO*iom;13[ob.ē~o,V)An:w~0UB)סHJErƖX{ 'hm04=[t7x|dçmU東wgg#?n 9\0صA.1WCF(q7C#3;Lo򘏳l 1fieScx: &|lC%b -k0es_#߬~ ?e;;Es?Eu -+,b6E㍣coY -.]uzˬC~"]uX%դPbE, 6Z]i%_ݧn"{uq5NlqLcҖP'շh3g[XÖk͐& vvY;eٴ.&vSk͇[_bfvcmC(l&Wݚ뷫/S[`MWOll4]X}ZE%&a6.8LٶlwNr-Br Zxrqd(lz>GnHŀsvxדAk7sŔ}fOY0[Jy)H? -DPCgo~"- FիmߖONMO+yRrp.ln7/Jы6]WFPɔd f U#]a;ۤ޳Kn./ѓ6jNhFQa;fLܫ_ud]È\ /Xk&<*:UsSӞI?H}ӝOԌ>|.6MVb^\ .ӮjNwq;R)܎NZ\3Өxej:_ ̤؟g+W\,}EU6o5Υ^8^LdjehfoĀʖ!B?I_3L/b4ݛ>IvɝѮDGa!m'ibN;Aa"ڕl̹K+KMMκT.\_/Bh|{x#H#o&[@_v_e~~%VG -'ه3 +>je`J[&6rx,Y1C03l{g4R"Q>`_VNkݛWD# 17b gvs`ϩ^daTsH272;[vgll6tU]"<&p?V#KԨEu*I:M *'>*r<9ݱZ˫]Z1ek|[WXuũ!aK~{Q;]֖C6kיyӿmί- c%br:鲓 e6SaۥZw]*DzK #D  ̘E۾J[ɥ( C8}9WNQtT]*NwrI$B(B(Jv\ $㼾bp.lNwsT:z{w!;~`|WNV귶^+|Y3yv\"]ݪ^혳w% Ge -mJjNq|r3&I#r}՚*)h;QgGxS,Zn'|#/6'Ozh1j;81mZnjaԵp[`}?uU\5\EON׮ߖz "=YeٌWQ0UEb6!/Yٟ_f `Q_bVjx#/pSb7a&ݎXr>nU![Pwl#S Ӕ !c D0ӊHkIv檷^)fsM#%'ogV(CfgU21KaX{Xh*tbofiwY{xenqNߊ6 -QaxݦEbri$7Aa]].l(zJ鐦f9]jY"Aᷡյ&$ߍ~[,\ܭkuU0h@ ~dS˕5VRSb7A\9ٓÉ.$4of vA hWf Zgt0aBv>KO6c`kQwo<Ֆ(hPGZ]iu'YZ80wz?{ *XvvmM b/+g,ևY3{$D^Vfm{-2|.Bs8z}YE}U#.IݶuXi gp̻vvY-;SOU|17/ݝ!{Ml,<1@2wwnfm#^ar~١]NzX]&4I:.J0DR0Qw [jUKQbUtkÜ+TwFHԍn+iޙn̞чRyCzvmW,-/ FA#gyιI۶x8.WuvOc. !o $7i#iI5.ʵGoTXUv7b(|( a&QO!v%tM>{\&캝Me' "d?C7)rWh*q|]2k$2*.v R dy[Wq}XĀա"&cg $1A;I]NJ a1]"tP3?G`IՓ )L* -28|*v&#Clo[ ^L6ﮤ'afwai^AP@u>A|lR`v K6?g";'zA,^e}hby yzc2 4{3\Fh\TMXҊiM Sgrh\3U x-_*7DPbR?q=Õx=nԧM;#{~1aRL@C- #5`WMuT*Nتjf}2Է k%]0I-fõ)+X,\uY=v^e8 3vG׳5ZIT;vxY CB>Nu4c.qVjnP@+f[0-f)ݟ'65مL0is%!hHL\I>G$D_UW(W4xu1hOveө! 棣V97oufzmSl٥ t+Pҧ 5D('Ky6}yt; Qfu%_Q}Ee5wLzcm?KtP@Zi1`~ގ=dil ͘p28͓b_f5nxY}*@.\Te&LԩD.N{1%Z)"q6%_x׊-xoؿm3dFm_ !aVv6v?h.'ъ Umb,K{mݳ2J.'Ub£؊ -Wo'u^e^tYdVĹ˖˳Gf:zXLeYMvj>(A)6}2IlQ]68O^6:rמm^,-Q=:n1&!D$JsZl7\45kFba!&Ȯn]rU6k&`yt!si{q`*_R|N筮vү4(ob!7ل09.l ɿ!kTr|\V*qTX*ŒgQlsOS'pY՛5IN-WPoZ*FbzR&.,-.*݇VyN3.Կ`x"cNG,wO%eBn4n;xA/FBC,atiS`.Jg9?3"~'TpmJ(I<v6vvgoZ֨U+nFG d)@ 8k2`?3 ϳ◑Y̘0V-G[F! Yy6u]auvPقHLHE^GRX铃\1fSqbg亼XbMGIK[ &ޯ4Rǜrׅ+s21u6í0˯Y)1@1;T'zBٺz[&[!Ob:êM6I,ٶjFn8FY5.MuJKSF,MBѱ[@Qѭo_`(jP aHFO$~$D5,6FRV,&\rf#~Z/d߳9w\lv!&}+Mv{6o̷dN6M\u,'])aa:._ dᅊ;.fM\3#0D/XkDߍ$B:,_|V6۟&4scs܊d8aA֫ۆbhpsab#A>ig0-oBO(#_%Q1GpwɝRZ+۳$/Hb-Лp*/_"u>k|,).z_oa."|&F˶Qֳ7Uvt͐qebl&wƺ).|6Q=B%fdžǝVI63PWg8kj jTwK wLd͐xq)(EKw ݊Ejf错^uDŽRoub9YP/fug-~ dčmd`$:31쟿 gX;>CU&_\Z,onTfȄʙZ (ʟ&입sY$W!ErW#Etzg՜>HͤVqM:<9,Jh"gŦKq$j77z9b89y 6Ē!aoYI7GM(DDD[ҕ3M8P[Z0RioՍ>+?StvTO"jAR eR4 |_4jBbG~f.M-ʹ;ȯQv,92o3;f!LĂZ>+1 -F@y3N|;batd=G݆VYiVY\kّ\Bk}>&v5044`I7ZSֈ_T\U7~MG,s5`{BSo燦UݗU鉈X a6/YٵuZkT]Zzlu9heībHXWv kx2Cx(VL@݆Hۧڋ -dCWKKq̫ah鐪^j<0e~r" 8z,߆k7;~pxZMKϥ~3)-T둴YMOtd=:jU+Ml[Uוo[ s#nčAN]{3~!&ȥ+:C.ɰvA@?p#e^gMZ.^ت8]6yڡFu=ܣxq&F "͖&lFfbm"҃-WnUk]Aky߅v%Zv⢂&rX2jU[p8fM MPG\bk5SQsP٪΀n3HU/~F)zЄqAıl'd'Z]d'=p+8y;O,vO?T]R0s3m.Wu$CmpN6!i[erJ84pɤz1Bó3FMiyU0߄mE$8'#zB9 qI+kL;LJO`,4傯E1M118>MfN:VSVyQ ~VCNۗ)+ڱRՍҰN1ëGfByBght$eƉizqrJh$mߎY񚤧mٙ2D@U xX@ FBoJꭚb7w`"61g瘝C\qz|8`x X;@ ,:<;.g\*YvQjُRou}\wZeeTkz %!(w6ݳ=`c_)27L8m@o8h(n_3I)2`;o` -BϔqЄ᭑M ]b>!?hZ[ol,f-kR~+}جPqv"۸J߄qإ09'#I~f ^DPHR9Hd&#d( gjBD7nښ;e:vq41m8Ro?LCӫF&U^VpbCH!4f >oЩR`e -{i7oR Q4#Ir5'QGnz_AY]1nbOZef]hM7aЪ4?ިVZ<nXPb6X]}erj6uffwvf:oݳS뿅ݛݝeYwrG8o"N^.Z٦7U*E\]kP>+7kDEZ -sAby R&v'~2HFb/V@o0͋xoW6Lm#wSnPc/T=2,c zyf$)4f< -:,"g@3](g1j^МDLzx9W,,Xc7V \8a}sk'XtU - #~Pgл1JMjuY]֒Z]dow.np[\tKL_)edWdN6snMOn{% er28|WPXO22BۍЁ:ݰ#Yd7n檮r'O%;3w]u Q]JTڥe(N15QVmr΅7ׇxY!Pq>Mty.MtjL&фIՉ3 |XA<*A|bU|͹Y3o4gGmi3pl:hyGZvvvgnP y/drfv2fy(dǎyE.VG͟ ?WB\GlgB8ojVDW_wVXġ6,س6EfyU Rӆi 'l=\,Y/#եvK'Mv(n5#gvEYvͲQ(W7쮄X\,&'y?B>affY2s}rjr%͊_~3iݢI7zQQl- -h#0[GZ#Zn/44~͈e&})ۄR$C'z߬A,r}Ō_t Vdu(IBٳ#\՜UlG'|:uNN<*S1>-xާcStwl*TJUEc0-p}.I5l'V:0 -Ue*範@×K&%j#V,ah})]Evo1P}G,\nNU4Zֹ$x3RWfUr8CS\~1C*Se~hy٦X Tb0ib(pLuy㌜l1e#꺙>k̟W7+6 z5GԈ4bSdu]h%Z;e>7eRVW?m%'u'"%i6i7M,W4둬손E(iM~,M݂Z ,;[2!amƦsW*[Bߗwiaa$nlIMl|y:eYӚXNUU#m)lWr-UrP;?z@[kʎ%+U^)$hcy^wmMN3fu+@q*Jvdt5/nRm.Bl6vWJ5L瓢g e]naBab',Uݟ#99qm1ĥK( ;6!/{>@,BAte6ḴX=1ߘ W%L{&>jJ2(Q!PzCEl C&~*<*RH~GqbQb1yfA42vg ջ! WNz4&,M$Ŗr@HLXҒ{_˞NGl2I?͓p|߬顺^9}16]T5㗏>Q;AtK Tvm['"1,.gYع$sxW8mwjLݙ̘c6evOvY囮]%1R_3R<'Z]d,.Z[e,ۆI>6sN+L[}Q8u؋Gdu=)%<*@mPՒvI40!b5Ah gUV&hP,6&IٸO7Pa1Xv<2{Q#2Ye-YVjUzK.f;72DR5OukP9A,˛X9;32ǩs.ifh@xq;ψ(kߊ}սLC/.VxH>kÈ(qU(lL%J.Ng6'fM ?$A'o^ ֗n*J{SO%N*l-M\ҶM\1 A5(5Yl{(>Ӎ,Mf>2:ĭN-ҽNf #6;HrbVWh Dޘ+k.]t˥VPᑤI'WnDqk 9=j7O0FI$~W㤼c3sۧ^u^t#6'gM Qm=M\럦iHX3f&|r77kSNZIh%օ]9Q&čZ#f?ɱʵͲ˷nQxc-A LُLkvbT 5GH.Y>#s}/Ó/:s< ,?R8W(k9 )w,{q' -r Dα.`btp]48¦67٬~گj˗94Չc ,>SPQCnCRc}/]:%թQY-X#")4f/VՑ>4NgiT5'ζ-1}j+,.#I6ȤNFxQשZx\^RIz+' ͤ N=Yԯ./ז Xax2n!j2"'cjn(c޿jWjڱ OIfiVFz'n;rCj47qx8[!'zwFgXUlgßyڳM۴8tm}> -ԫ4' R9C֎6ϕJWW#c_C^td P%^n,NjudL`*d(G BAzBI*dgݪYx5g=YUZ{AhȺu =CNM1jm]f~.BԪSZ%(mL˝Poh7à2ɤKXgfieըXZ3;>^ON2hzU̝ߐ:b(LJ5UP Ÿ겧ħ6Q[I瘽4u1oAUfij^ufWvev *A/EbXp|۪ 0ܘ]N$SֿS "Rsv}w֊m:f9Dt 3|4gh]O,@l7r79cbOfRي<&-->Ryg{TeDՖKa e<6hlķ-QcoX0i8bzS -iȢ z掸B9FfaxdbF!m0IMvy w sb\7Z3Djՠ\#P> ;YlJރuFÖaLfʤ1ŸYV?R¬?r gAfA.q'NIEbNSlT+" #dSޫ\D#.^"ͤrՓMfq"=*S`~1/KbS6 )B0bdeۄPIn}ة{mb2P44}իX6$9?gkm;,Jx.f7m쉱z\ʅ9"#OjalK9J>ޓwujYsdE`7؝%i6eavJ%琪k{,p_د ǥ~Ņyۺ,HkD-ߓLF1q~_GSH!Ie8ĥ.m.q3QW;VVYڱf8&P^]uX|NS&* spӔ~Z':?Q)Z@[5nKnYSmX[tˣ6 ="E$QDF #@֎8ɞ]ԕpĶ}pei<h) v~t(yIPF6%zb듙φ:L<(Uĝ,^3P+;%J8-_:-(0"n0US5uq1 U<:ye:HVD*4Q -fݖ1lŐnY,JmWcmv=|vV~70uT愁45UnR X?IsPZVuSa]VLQ*GC,*eoAr5ؘ|6#w'l2zTGo d兊i{ԛ۩WoncO%tC Pd/nX&xi&Y;24qaԘdٌ0M18h/ٛ/29HYv&fYR'p-׳6X?qlaʐ8ԅOy*ЋeWG,$k -@ y6!ڂ ikVtP@b,Je+GV$;\`;t_`h㓞` zv`{mavi#㕳3.ʵ@ŗ 7>S&E!pxoՈtU+3 2͛7~-~뫪0Ɵ.E(dԳtn[z p&3D,m1멋kE(nzӧa"&ɷZIfh,ߌB.fzݧ,.DZ̆?Gh@w"ڕ@ nV_*hNm5Zhcqztr8KOWOםЦu_jYi.ItK]*aafC1q6H]?u;+3 z}Fݠwx'ez0S{v8wSɉE'Ӧw&{ `ALU7.s:N8Ҭ8oO_c?p8IK]7!5q3hnΧ3)!% -\tg|/NHtq:#WR+t CF@ifk~3=Y91ڎqP7!;E2bQ z8؍;yz*+X90w0јs]&mY{#êJ ˦SOVpv 8 {)b@@4YivUR?Bl[Ud#BsUaofٯ{]n+2|B.|L3 >%?޴͂y$uEoz iGUdw\) +|ݗu, sEB9 ߋ ;JbgJI/bVd?j4n /[1vHB1gvG8y;ܷC f d.ثg,N>Dɠ+NSŨ} ?[?g VZ+#6Є۞yO.Je5 < #ݕ v_R|lJhOk;I:nvitĠLgp%]5Y8/^lٝo\}plOD3S֯+b=m6!NaUFQv՘;]a>1'Y$شL;39z"-B}˟؉4s 6zj&G>9v`sYx/[*LɸrkRDu9&>G8bY򝰭[2{ ŸP9p,Fs *Ǯ.R8[3J0dlf8 b -DBFZa7j3n,"Ĵ -ꄟO~ӮnޙgZ3f;eM /4>z}uUC A1vQӎ1]sUW7M5D_gʝ'%N Qa_qՒG̡ĩD: XHoiYb-Nb՘onKswbFi;3 VBDqRYc+,g4%-11d X3Y/bb-In;nԫ1pzX؆<$ 8Lw5>3iP:A`B&9댅> -yFV!\gXZыa̧}w$c i޻Sq,%I\5 F +~٬q06ɷQ0FD)Z@ >h`!RBa -%58r*Fs_[ʌ$X=L|vPL"~TIV]Mj0^G!gnm5^;߱01dd]?u]&[zL`2nJjtL]-M5 -̚V[G ,ٽ,|2%N"g&- oǒj4d44j[3Y9MIoǷm\اg۲f}/ -Hl\D_Mgmpݭ;vԒPϞ1,-ⱊSF?7o NY,2Nbko afۉ~+ cТdkLDJC Hrc -\y b=Zk> .KA+mQ!܉]Z-Tx3^2ŤKڔxl5e(t1]o$W'.Fݙ^Y6!M&Va,W'9m!zqɃ-:@r -Ցz={7 qZea>N0C%ęֶۗjK0<'b +tJ<*:.+ˆy>ETWڲffn VR)8pCK ,ty)'{&mSy+“ӻ? l刡=̣J+O\+_fplj+C Wp(?'U-s13Њss]!lpcEY$8ma|/j%֒Z i>TGnv.}sV]-8Z;?rGE #/ɱ d@ߋjZUl9#љda "a1I]޴zRQ̬wH2:i7ۻ乌Abc7qkpc7n='H?S(0!+fYj7erkX&1ICxsɳ]BWQVYr*T4j*!t ]8_+sj]8DgܗQQB1#iU IۄI Kbw~$:Q: i=VIV13.ШC/yGLq7Z14^u]?6a0႞|1ߪ?oS؄W.^[.Sw6`b7evaD,;JwOy-2ُ: p@@XU U=rŐRBC#ߪ˨SR2'\6i =?f- r,?8vNןXLDN]%]" zpOw3}Y͔ hZOZ̲D9?%ֵַZ;{V+3xaK ɭ+r%.GUdێk2Y? -|Wn9OlEֻ'y*٪HUΞ?Q uGc{Cj)ٿa뙉v7i2&M>F˰ fߣ|-.Pq B< -VP!7wjKB|}qgq;`@Ee*.Qtr}8~6oy .޾Ndng۾׉:"ښN; ;w|*Apf6k[H*3@/e-{lN!݈3%hV%fVg`nXmϳvP>aI7i-ڶX`ř8ζoQ> -SM<ƹ;1œ`vYoZ9O<˞HCXv쪽x_vLI M^\IHwe_1,Ěnp#䐬=a5{Uq ˹x 33fսZY6UW 1~K5I꼓Odw'>O [DP9_Nf$YE1]&F{T-l~1fMDyZ *ޤ-۞8:Ĭ|>!esV+"~4!woɚ@ٔs ~3Ҩok\5SMJ{~ Q܀#ViwlrO1wٿ=Mަ^r֠4A8[1Fgb7\̋|yw_hM '/efH6킝BQg;Mђ2ix$sR ۀfy4[2HXA"I|;rhf܈)5گO۫N[@d13'hb)-j;C84[vgqєGݧ.q󘒜 ``x[y39 dqb 46LlLCZ:qPs7fؾkG'6er9PLItrE'jGMVæea>zY|T|\JfX* yiuKK>Oj:j'YsèF#g)K(:m׎ػb= Vy/扺je;Xlzs1lSm2eF]e3~u/9e,R{ޯV*J X k?:˿\O&Ƒc/B䶊V?KVnЕ͎t}Mui{/l<u׭ձ9M [:¶6)G8i:VG> ?V#'Ɲl=eGjrdYf_yhXmU1t}VQQUb|r߯fr9Ke)vdULw&{܄[45CQb^(oO;/&[&LoʷXk觬?w;I?݋m^V fpQ`c])Ejb,ƽA7$l>jV p6`Xx% (mUaC<2>AI 0"eNLU^Xj)h`aUҡjKZ5Ui @ #6Y0z|:|WnHn6>c><jo$laF2W93 -^۝>~ 2V##A q%Q |4NG X@WP(J$\#L <>Itk]:V~Bl[VdZb297 H" o -\RS}xè$cwgύc1x,B!@|ɫp]Mׂ'A+K&tXmY]N@*Җ!rPT<-JPVyU U,RM c8"͇ɮt=ݔ&?mQ{?.i/-TE_PPmZvu4?nQ]nr6pNgx -&#l6M;u)#/*#Sݫ0hxV8FJ q?5h{77y4(8#I{3R!3I PQwڹF;8s{e8reaOYz3iQJ2g; jE>$?{2|k-#Fu,β@97ٻ}CDz .5fcv"/ -{@i˴U+iO^ݭRmRVWn%Z&4.;!1\%8NkLr?GVFjs-JAHxsImGNEr^a菺y̢F]7x=rAI'ɿan/j&_fg"<@Š=ԡe9>:l{?"%"ZBZbFbxńRQ -Qm_4#{7Nζ0sKkS&W&U]BEǗhX 𱭘J=E߶"o\zՊ'/ٚH19$;s8KU9.Ur<`,L,HMeZ7?bUֱԅ.IAz奲$A(h8 5cЫZ "N*{\5;9à5kY Q62kO֦]ZlNC߷9&!ɇ/|sNd&#fAk9UgfyAglDž=Q/$~b# ENi͐zw3O{ ]F]6U: 1pL0"- Ua\e~W6^z,J fS8؜;14׎wX䯐B48PhIwH4!~*LS1eqKfGFMHQ Uy=:+rg燜R4=DcuP㯅yABf11hIԗ?Iu*M'f]8ǞOS3ԫl̘#vMXKut4sYoa+R'9;rݛ͓ܪs?Muk3 ~_L7wϥpq IKVB5ao;n (ݘf{?iĤ3g5 BfB?N˘aB1c X*+F_8;mᴳsv]iu=`4^xN)a0Ǒ))LXHy&VXӍmh1Oe^Y -0ÓV߅j{Uw2ByjZqS҂ctxG Kb7|V _5k.Y3zGJLn[0WQPW9`j16Bju0^a9ߎO5v[VD2opbxGt0L}mӚƺm&]6It(#  8 )@vX5-1=tڲr=\ʼn1r_Vs Iik1MAbInit)D]m٘^ ` A(c4F XdB焳[Pxozv=I%Ztp5K[N֯#|%4x34m?T?T>VۨS5ɼ3'OZ}&.өZD.V"٩)Bc{-*jYXBqQ.ARb쥘#8HCbdٻ6~q'Wj'o[Jk<)ZhFl4'őC fqQ)?HlŽ9LK^+#!BM ۞<:R`h, ܬ,oE[1&fanNś?X/x^<<ÂXNHI#E ~c8;5ʔdss?NxHjh^qʕ*LMnM#ӫZcM9vN5D4'ou^RKnnspMZ0lufay5^1 -h%ar`kP*nϔ7j@ 1Ybpz堞V V_;y~ōӽ ZPG$x8Yؿ #^9+됽|>T,-~c*0k7%QZE*RkV8{Y MQrfjZ+x}].mBAZqCYd޶l,Ubf{ٿ;ԘY_̣ d\둙r.k4#X|'ΉF&K-p"O6Agll=[%P7 VCQrUg䩶a·Euvm󸣪gtLG*dv ][1,bpgJ 6YeĬ(/G(ObFaUh;0υE+]ac_E? RM[|XLXa*IiwE$dU"ovVh؞˻HaӣK.(JP #Xa2 ݥj!eܦn؇(mLP)&B[VerB Iz܎@>eBz oَV $LJi%0oHzݫnVYnb^.-Y>Be̚y)=hÇ݋ Q^Nfvn}xG4fӻes5;O6z|H"hŅ&bp933`$.YGSˉA(2)3/3l˩Td؍4Ek.]ڃ3Gky.=I'v@?Y-_%nd>w7=i0M@ B,8ׅXjxIՕs4&|JCא!bl ؙFd-3d?XatbKӳσ6j'ݢR.O3>vq9$bTn\/$ Bsn%wr*:׭6MZi?M\#lhI]y5lb%6# -욝f[0&ɸr~.Yx j|G0pxaS -獿 +U(j\D*'U QzC(,/'u4W`|ۨ>ggfvk7Yfpf(\bj)Q!/?-_DYӝz&NҮрYWG>l. 1 8p7ȴn:Eo#2]=OӁrff]`<> N^irL"2K!AWNxL]De5ӨVv¾)jرCM3Dߙ"O4x-P ƺD WQǢ>kZ0uD.-\:0$;/<<,Z{@G.^Xmr|Q8>dF9LG~M=H5,3![TeOr.I,ZIdžp%wx,b@>,QU3&Xt~($=V)'fX#!"53i,efu[ڪTe#nd^?Drfo`pr}=)9d]~#jZ]iuɿH{e.f۟@V/FtQeG ᤆ!{M2g'\* b"#t͇֛<8&c^)C4!iwYpIopNnA^ -B:ZV*V&gQ\',A c>BٛU}1ra#0NI) -N0vt2ݰI)1HCb?ֱB'f׋VByv˅<,mRwouwdmDr*<2,CbVra]?'ozl2>&L,) :t?aXUo=n8B1YRf #\TI6Y$뼙i9^!oƷ@&d -Zіx ;TJ7l=Rq5JgGV3#~Qtk]>Xͤ3GݱDqE&+D\7q$٧ e/:ȓ؝ iQsޮZ:JXϣnC/Yf&ه̹h -`nzE\?s|Rb 2uC.ZGly0H5a 3h3e(4DR3Чë])"V*k#:{x+oB뷼v" xcOG6la gkƋbv= {./`%-gQ22t><.HmXe'n[v% n پ%./1A^ ɣ>Jc 69lcY 1ЊHi>~ZZeXx -קa^z+tsPXc9m߭rxJlYy\^#h8/vwOjzq[qv\e+->408;D24!YasbhۍchX֪*PLZA|GT g$o!c P!իk8;EQ[Ӂ_b?țOV,sz[ui\0Uo,:1(]ϷK;Z6C,ovVpq2i6ѱPdSH$5!G߰dZjb6j#U6X/'ӹ-YB&r>eGo 6rS16O\dի2hnퟋK+rOj.~y3?޽g-+3dߔfHlSGn!?=IsVG+?yXG# 3d-uyG?[o8&aVhxߣƛV]"zp'x$'@1 !!o/gP@{e6 b O6y*-[;>J72HY" IsBգ:dIJqDl1f!:k}\S?E>xUX3+  o3&¥!g[TzwmiX [I>724"Qp(#6E%Ir/UrsL 'aQĤ a/Jzkي X)O+Yݔ!Ԓsօf.?{ bPA16?V9ǃ0<ڈEިHS86Y7IrD|5X"||nX+ׂ͖̳a3=/)f|e-Оfѝʍ> 蠸oc\sJv$b6NEXc-A =Z(.@ Ugl?g?IJ:|:H'hMk=zl.y!oVMv7ߺoZ.K†:o#I@kX!0{DBq\A#?m٠cZIbLCRB,l9[FG ;7^Li%,:mrg:k7ȅJ@/16#`1݃G33{xtٶZ i%8?rElI !b;ْe#9ȳu-F~8#׺{m?'xY$.E>%MSe nO؝GRujt٫UVFmp Et|k& 8Mvk7X!/9f K%|Y'vF6#p(IDPg<erl;+]ricJ.bXMCj@ՓY#(2 e%&4liǟ͙OIHI\>NC(ޜ6ʬN7)Yyvzݰ,zۗ;OWXKsm}ԶFFAS<e*ϹQMB.^x `sx\ƟVL[Wی\+0J-L@p0Z3cqp;Q zO#f"R87uKm:Nx?d|Ёڥa[0KI"({>!YMdB좨`yx'bgzV"}uP_J+xv"HT=R ~]>x(m۴1CA/6er%tPZ)tY)ԔTFO/UY3)&'é&é*J\[{Lz>NV f&blÆZjj%qQ".GPW^ay [d| +4[q1(mD,-GOy뱞'bp3yc<.R僳wBϩNʑƓ̤mHeh1Y}Kuc[8HPEV6fo/fPv%,l;6)aYh4w܁=FOC/8g~@˹~y*˗$×軮H_܅5p|;rB)-zNlG,jWlnSp&ͻ;,WDŽe!>YlKu*.U6M0-ԹZ]k.+q jMt+\$Wp͙ڑk=yd]FYZk. >,ӵpqr}$}&vuB u޶#M'4QT>)IW 'BjSܵ/(:'^lxwOnM8T1dV]wg-' fcA*|U b,{eH3$8*-۵쀳WtϋAj0Ӏh}H6 RTթmYӪ; ғX- |Jqj؜n |XYlU8\wρ2qF=ذtzZ-g;'JUeꮗUoruZIdA,޴U]G>%ZlCcwYf ݅,!ir}Nҋ"ٗ7Mަ8/>ͧ.䪦d,!Ҭ~vЉ!??b)$5DZ4?\Qr[p 1Ͼ3>#^#Є/N8oP#n,9xhuZipUq:í_c|7m Kou6"Bo5bqE~VbٰXb҅a|06E>Vxs=YDpl5lIg4$ -$Ԣ`b3^(4du Nɺ}MV.Z`>YR$ZK1ҳbw;lGGc?w/9Rğޞ%yHXHg}%љtpauA؟?O4QO̾{;xQR,y݁b{tsԐI?oV)(OEת1\)exd5L vfwvwz,Yq'Y,m+Y""">EP~_TXYyp"3L4WίћCdWZ5vݣ%^fê]s'Y:]#4lݠė/yY?J@i#0p3whFj{.RY(ÎY-.vo9𖍢7𷺜k[C`\xu&TUb㚧d+uJalV Ivđ[>iPZ!l iJruNQgޮekykrfhaǟ~y:G۲F:)>0g .MZg3}.K;E(wipzx.UfxcRԲf4&6?ǣ]RnݼG#F.75p+مŜvS3 Sda}qlo2.mGQz-ur\˷){$|~>N%Ӊtg bJ2qv\MjExqp6"5J]5 fO r-bgQ ׅ٤gf;4u0mI&+:gp4 OO5.k~B9y=VMrVY?sMNA|tѢ -+˓a}AĂ#[Vbجkx>朄[xė/tPY8ǩ΋쟝u[jWM6-C+٣~g!fT6|>J?`8pB1̌~F{rYrT-]e0y\}ͶowC~ $hUqo:[Yr-B{ .[ -(MoS~>OU\EEvm6فwqr+XGV֯J%-RRĩ;nX?gxkfY8\cah@\I\3\m^ - -Z-jYl1JYE涱4 ٛròelaǻ61n*Ť8O3<>n|[4CƇlٝY W>U6/_ F ПX=x'IK31n}np(BiKhrƖUJ֬N9ɨHX{Y0( YF@k`߄x -NpJiU\*Ity+|úi3vSXĘLiՈCQ&;g:r4wAۻŌ!Pf`,RXvwxrSî4fc+٬覨cj b!(^ 7+M%{Ry$Aаx:Ko ]dJ{mcQc]4ؽOA[$/?Q_8b5u&O&y&Gv|~^5e.!( r_4S7E_R8ڼ<,U7|FHHK$'xwޛ}T 5^Evv& 3+ -pdWjN!tHME*&©2(`|3܂8N[5j]ux6pŠ%i@dnqYy5=õy)p5&)f=eu9TfÖa7r|r|]Xían╳3ffh؇m3wV hx~B])0gO8"~&؀TEori:mr8sjt]qL_6#+v'vT&tY4qbo sǰgV3X|͑vv5x.%"r 1eFqc>zoZ60ER'!J{1ZsnMݙիbk;; 0s*kNJ jS-i^֋mvS4 KAy5[NyV w$)LUl6{+AN;֪_sU˖V[e¨?6j2b}xrZVdd·`[Փ8f<&+şnuK LECqifnmC˫ĥ^w<2i~b,QN9IVd霖n?mtPB< xWĕq'tծg? -vѱ^V"Q`-جA;Gݍ8uyi^|2 \U%>Z(¤4^avv,Qu:+dDcV~Fy"k2>Rel_&xhbq6S6'\4,[,eMVк,(G"4@H}ӨEt*8rg٪Dc]2̗yOl/z{3W(-FۇHVmWs7ߪUeS\$7;px wT]RWV)@L50 `Y:|bLue ZN/[ɟ[wbI⮞l]U|I>~3ʼn17ω8H bO"qŪ?.ضzA<0 nM1~,r9J: smER @2"6;XXIC\`g`.A Wmϗ ~F."&h&閗M6we^E-"➔SfKEoB]ׇ H~pG5ZVC=J~ PА(|.h7WY?.0i5F,=Xl6RE?aԕ>'@;'' q%*3C"Uj'F}2w\L0ߚ<2gc{FK5*֐,xM)6Y?ƧVlKZ4UạX(_ A4mdڞ}|<䡁ω ]*'I?Eu -+QLb -BۊSQ8Veի. -!,[;uO??UXuJd\ij+ӌ2A ^1oMp0Flюv )-߁ -oON sS6k|U]. >$inPzIS@.Z)d8cf`͖l,8q8%zg q5 -1bnҾ6.8{/ -\``V=Q؈v?s1mH.ӐYGhEݦ|Гq/O 8tO)^bN%_zW>Fz_:wMɗ=*v,Fj\ݼC$l!,to#}7/+E~9fxٲ?/;>Yih߆JR=/ݏ=%M~k^a=30ԣdȧ cu{Бlut9p*lO9+E7:]7OE fnhb+3 ٲfxxu?ë<˥MbghjXPMS]2,&Zrڂ:-^( =^ ۣp#jGm1KW%gbm83G 5-Y ´ɚ K82 wD:;u<}÷w~j6hfwyu=PpF+Eʩ8E'JU5)2əB3g[U[k 7+x[ꂻHD%jg>^ٿ ߆o]8#(:!sqD 1zN .*fӆ0Ӹ-9GK2'8c#l*]V"M!M#M HXݖd1/ǩy5ܩ/r藳oH~ǡdφ[M=_ww"Gjoyfg1v&⬵fb鮈 j _ /C's~IOG+Hd"<Mof콸~ '҈2c{?dնZpݙ|^2r"8`~& "O`tBwYтv~8z԰ \+\ r{6h.2 -E{"R%H~|Bt}[/N{PVӮlam,M+s[pqz7Xfdby?XGge. cٟE:g6$~IQXZ_Dp'WeUGUd؍6(Sr]rxnb -Z=). Rm,:q3j㇄C10bcx(|48w^. J e5ө2TP ;Glؑ컰90t͈=!tr~Khq1Oc[Ne#gurg\DPj_ӹ,qV Zb%$s [ S!Bg\kO:3 2τ՚~ fYf 2.6jYͼ^Lm38"Y}aÇlc<ٔ7c8dwNloN:ѡNduo}&rpĪK } 1C!m / |A͋?NܯNRHcaDcbAٕE*Kwnap3_]E-H}-oeLu WJ:XWHR ~.@Bdž,(AV\eNq0ɟ .UAfv$ /i:uӨ.ErF:cٵ{?lg z1U&RCdP_w/YrW߃+d!^Bz^hefm1gZK;u-K~%+!.;G8|8FEu`?ê9#T20ڮ,hQӦ>g۱dY;R&RIҝd?^WFqG!j:r׉dHFpp'sW@ouc-8>vlj:{]5 w\tעl<&ye0yˌx_w&l% nI&@ĝn`h̞F\4ZCiewY/6k7Zk&'%߶Fڎ9!52gvN ,J1h@v0;p'y 齂b^vY%,+%mBb͓qgRA -h!0 mdTiߣ d#U QdHVM^ٮ*꼐>]ج:l ddv5 Hˏ,<'"3HMUҪ(k#<"L~dxg#fŨy6ǰȣ$!6g56m͕[qϜ%q`wxN<VRs7 # #pv!vr/]l|pmO0fkfm, ΧԦl",{)Vh Xy;W};j{sԗP^iNOY?G2M6cE%#LJH7lwS{ h!fyDňn$0ҧ2iz^wZV[:źq&lX^ڒqDo$1HC;'Ԝwh/E(Z'hlť6D`3rnC 8TRJ. Y]\}&XC)NjX;gڷL$c2?&$vcˤJ.U*Mo_XĠI<% 5nv?w.~'\ MA,Ys4 9Ms.ru !QV/)k3L+HlA+H; pqglJ6\xmS8K,L.SYivåd =/9?UݛFOCGSꟐ -%Oꋱ6m¨&9E.)0/e_ |_hiq~%IφG&gM~{$ acTx. Ӕ0xF15\LnߋjsRG8ìlm`=Ñ5Ҡ]7' x pҹb$0^Vq&QϫlNR|s؂tg&A!#fόhXO5gbiw$-\&m7,6ďv-PAm1gdr032Eo'2@A[д6an N!p.oy]k-eǺKA-~&Css2>гwrLQRXlCah{t9EsW;Es}C9~7Oᒖj'M30CթW[r<3j؄쥰1ފ&~ +Uj_T-aLbٮK,pᆱ)H:byJ'݌TF9,M^eK<{+4'b:1q: -+U$aA22Xu_}꘍\ǡTm;:I$gsJgCGY/YYf/LPa#}Q lCe7)lY~48sL>W*q(+V.^hk(c_PpfXaك:l^g6v,pcl݇S2f'[^nA5+퓿KϤR- pGb8Awg&Zɠ1Ub!*lG3H|1"aנ-'+*TɼFkDORY.&5J ޤӔ},N'\Ip+522υvv9݁X ڝ,V/bc'\VGReN/(s,Wx٣g`#~zP,˥E^gyJC-:dԩ!Ql[`LZՠr;L86j*ўq$wlʼf>6,Xs&i8\qU>l;prZIi%^mzY<'m233,"8@ x)A\  Vaqn?A/{֦}Dou4I>BT-d<#x2Nafy#o)ST}i~wP)2rQC'v(Ո蟑V*ِ(ADU$Z)cN@ot깮Bj.B6̼G$-ZfٳCHT0U<&~Z.~'hlN =|6"ma+{'&/.!b8R^tX/ߓ-/aFf:ov*Ò1GPGtw@A䦷0[&7Y˲VpIeJ ))Xp$9XMRɞNIt+i51d [qr|*l5Wg!h߅C2͵[3DKqd6 a`esX9u +gx^֟V'v8].T4#}n4 ʼW ζeza݆ W6le -A 6D1>(۳v[ٲQy7n#4fd lё -ylgzܸte/6Z h%Z"|z$jCv <-O Uu:VOC1x&8\Bh~ijzVovU. yK+BO ?s1o-M27V_Ksbn㟀SVNu֒Y?ٻx;rڴm8wuLg}[eT\Dj0 dh9 nAԔ/YZ@iz+RRf@.(/< )B((zuqk0bC=]ԝWyd&ė!}rWNW-i{qM+ N}ωc|1@ /Yl@X~l0I$Zcr"^e 3j؋NӏeKI~ sd?|s%nI^{;R3ByҰ:_n;J< +Jdl a-c SGՊAHNmRqn06kr6GVsZ2pFQ i$M;(h2kj2x D}'40(? GmBBrY,> - nr*roznNw?]wKj1Ms4=I?Esٛfjc3f򍫥aD/!ȡn[[bbl5Iiα9刃@6|i?Zu[8{ӎ? _PP``O5\~jkEq:u4-t鮗Qtj*5a614;h&GsbWo-^ Z> *rbdE4ظXl?xlJw 8'/v*iAjM8A -l55lbMnn<.f}p6`XUx Oc4T%o8؝Mz']_" ӳmr0ՊѶvR0e41NFaKI$ur`2ox2wZId'FCA`PoBrWK&;fo,~kombJ&[p0sl 5H+e)asjgG<[2ic;6e^`Ku_ R˶j xZ5|7n`!zo]uWYb 5ن$9:lg]R\40qzGWX'rŋK$aJIYlC{ o:tӹG}*ghae覡EӦ$<$83BGxDTJfX&m!JVb#jȐŊm]mb5r匙y3zP U-5K冦,-YÄXnV6}+3lKu!ĥQᘳd7hwDWoi&GsbC`'Xpq0%8nk[ewT-8EW!s A1S6=*I٣\ Hkf&]V 8idj<,JC{|,VYpkUfcXKx]8j 3,m4Q-bPyc7$ +׫ mú֧N1i]d鏺ߗr XlMTߦJ~\ٶXlrGcyelZj.M6'IR0E齊>rg@F5όG1F܄*h*ARr5ЎfSR>Nϛq#IK/E;fəlmHç:.n1-lyO&K~tt;G.df}E~~zO'FRohl>z=;p]a|Thh>*kv,Ij)"I4Q7@Gx[so6)w{ؗqG 0ck3 6l2t# I j7rO?txT,#5k܎I_&>HmRlSuWWu;A>L;7wILس4ˬ4B%K\o 6Hٚ|:+&CNy>vύ>QFDyy㩈W/e.$_V,>L,OŅ@="k-Q)0> q7 C(+*NeŴQۺo+d<&P`97ˉH9)w_'fBex>~˞STs}&A^ۼBäDxvsϒDL"ρfD/|Q$OA,g#d l|6M!I:ѓxm!Q7]LEwY#!C&Z;ņ(h;G  {ѤC;H XjBq-#@jvqg:7bT7!rHz5 /_g%n81(!ꕔ30jP#?'/+=ϯ/+~/]&kr% -ˉU3wuGz?\1kAE)8{6{/?y}|x_!DW'줖([9::jL*l*{ItH6&$S\L%Mr+QGuèsjZv!If^ X5Z-L 4mFc[ k7YXOP!b%}Qdk"YΧ~=?~e Qw|z?H u*(Lݛ˪Pݎs E1D.I,O!?O; q>{Bػ{X&[8 -X,HN@ -/Ȇl%7u&]>ԗ!EGZE>{Y"ljˌv␜Q"HQM ceT^NǨ  {$/|Uy%!x'iAaf)0we'leq| 5$ٳ!fc[pbV OZF_h<ц !r)̫MS]:!MGVI>N5qOVN.^`a&;WJv@N~E >Rf{33|^6/~Z#[1oNb _B˴n6.6|یsl^G)iJ|7o̢=B T!;Kឥ'ԝv|>igTGZH0VW7.* `,".J= zZɻDiZVOl ÿu8 ,fDq@b6r=z{~ŖC$Ryr.ҢMA/Zڅ5өP#b1Gq܃VZL6acl9S^܌!6n,X) nf^hf=#v--qbҤp-1YbtkR/_G}ݛyHlӱ2/l"3%WyVh]Zp0"!XnDw?3;+H:DlD$Μ%o` @]dͥynۺA!h  Q0.V7Zwq 6Dլ}E.U>+1 ɛA.S7d%W"?&,Ő=?e=;$1OdZ`⒦}2q onx͉X&&"9k<:ݗKMM3 qvo6$lÄGZC0L.B Kq7>XLN'Z_y6j\Q 3lc9x)ar0 /44D3F_ % Sx@40yOQwo |wOAf͟j}6>&q.J{qvblbكfwl0 _K7YJSmOR 8LZ?—yzvÇЄ bf;>I{M 9{C2sl8ٸ%GG^ߟamLN9GJɣ\ˬ>fڲQM&6^nprs -3.ɔ2ERg|A& Ek-}֣e-$k']suK5] Alr/]eus\rkO V,YiqgY -XNhy|Y)..~/;n"jAp Ikb|gK]>(*CD燿e[>82,~$whe䏄C^M#'f@ر6d^&Mx报RMys^,/퓺vX;hy2z{?W*ZG9;p:Ov]Y7d'M.zrqxٵps,oM>d݂ H#e%,d=Y?Mz_Dz}NGa)@_'\ |Qc33x;o lQiv 'E$m4MLr31qp D6u\h4ǻiw Ngs\ԩ29YGh8\:qbx$?\)p &Luou|)2WA#L6sN HETT*Xv͝\5(hiTUCp}AKJy3Q2bmir`fQ̷M(Ypre\]FBGB:xdx˫VEuv~ 48D7/gO606/ǖ3bė%B FM' J̚~zUTeLqC ;Eg7ى 8fSAXТXou?R\/Q;Fex#wMqSw_!XɵY[/;'HNϝb[ށo@a|8HM3[^o 7%l9E;wQ?k qM2 ě0T&Mj.Uu -yٝX/9TM~QUZ_NbN+Ω4D~>|gP3kL8mH%mi20#w8YGV-s=Q 7]6ؾ7UmX0|.JmܓVXgy=,GTIZ6$U1 Ҭ}fjQM}QU0 у{8N CDtYKZse_D"LZ${1P>[#TuJJ PXշͰßXurPٻd{8ӹ-xՍ/*b;pHYTGoY|_kbiya9 h3֠ORo~E6'E>%Av,B6Y*>ck껔0E*Y*F'd5&ĥvzwM6/&Y1/ ?#X]*E[0|g6SpOf" "=(g&#xL\IkR\%SdjfD -K[Dnu-yٴrX{4{;ˌrAI&dMբMU|J0=lsE3gMIMᒼl^fؾ&yKrR&Λ /4BuiRb1F.«i0NщOVY A^}3Ob?b)bkľyQb6fe7;Z>x;rw9ErOm?^rk 6G:atK^) _QGf(l -գ&!~^(}VwP#t+RN"؁g.97n:Sݿ75f뿃Ln 듩+e(Hn]/@,9Il =wbOo _kY: aE^Ba3uN-A-.UwY|Jo+I9{O}3dI-6{Uߝꋩ@oVW=g$-Yit[ܧ ߞ>Tt؅?eSs7Q4\K8וd:KI-$t'Yx2Nu֗Y:KA-$JҲOf TI䁗1Us5ۨ˞keduHWTub.eu;KZ\VdۺWgO$vdKbdNWtSHOyr'Zdݗ,쫘,Y˛m)muyVu|6.}bV˿X}] Q]YU6/z.KHJLkV궗T--.qu K[ҧ9oYg,6NݻwC'Y:KK.H~j.ni|J: NꔗR%m/Ǔ=W21?Wşmukk]FPZvsfߝoLYp!qˎvP}C&˾b٬jk7T& $'aֳ]d/l 'u2LY2Ҵ- ՟g/L,Vd]ɲYx K.Y:ds7u,d˲_%ZYddvtZW OjZ{&n;d%vuײwY7N o)7wYwZWodɓC|pgY)jufYNuZdeݮzIR\hIuZiZ]^ -+.]bV\\ݕX[Sߎv/FCͩd;upzGrvdCNF$ѶO:[}ٱkgb/!M`.#͝Xb&dݖӫeg(̈́؅Cdůƍ&Ūd4؅\j:ޮF'A-$/d'Zhu>s}f\4i|N|R/_YOZtVȋrY,ZgN,d w^it8-.6:~ߋ/~%qҴ:?&ǀSfY?tJotNddL'Y|ۇKg]{qɝ\N,%fx3|47"HIystĴ̖Z {d{1' !0@P1`AQap"YɒM$K$KM%$]3kȝ("9G"Q$O7'I"`hAEdlY;g\I$9G#s99"n4lI$I$9#$NDIr9Isg&Lr$/sG4sG3G&ӎ_I$Y$r9I'"I%DM K93͒rdv\X"H=+]5*ֺO]5Ս;"EUi?ªMUBTWϓTڅz]G \ꊾ\dXyiUWr6Q^&7 l?cfQz1:7 -cv*.΋B1&7~)PH+'lB"u,]= nB2UV)==ĎᖇzqWF?E^AHgŐ$4OE7kV1߃P&6ZJ[e ȼ5^g"I$Q(J%^$cn|dE!Ƚnqjq7d.4d rdɓ&L2f??%w) yIC/F7I+`B BUiC$lKtíYD޷=A5iZ06-:A$-Rf2dɓ#jے)!}9|DI$D?:S&Ec;Fz е1\zC88N$5zj觺`m:E) "XQUhtb}Y3#JIa>_^"DW$+ݎUMGՔnI>mnC;Q V(H]XVzs顫ֈ,fL2dRAZUrн,2d` U]hvwk{^YAUt=xI.!z($_ F VÛz^ A|2EU[2?$]5/EY*;FI͐ozoBOe$M)lZ} ɦcؔz&Hd2 4QO*!nNE\Gf|Xީ3^[I$,dDJFOMJֶ$GEh+$jΥEԙ2dɓ4QA؆&:E`E(v-{`7Ar2fABYD-niVdviG;:3AH^[S$duG+ EI>nW*U Dq #I:_vLVITDtfng\$!lBbid$hid*vEMԙR AWUHMHF}FչW7:ŎoT͸1GUOUMbc1 hEkwήX!ZrԽL0J%I#Q֝LDMWi-^׹j" k҇H Q(ɓԞӦ hCM_A"UoDl+Q*q՝0GA` $q!檏ꋢ_buWv^]<^(h^6J%*'KGYc]9~:QXў^jBs^vLzb^A2fFDRuVB0;Я~TASڼC6"}hoHYE% D# D;* XO5ER+Z#B2dmBhCkl&E  $ɓ$ۗV:țߋ$b5S$C:I$Y,Qv*+ 2dSo$v/B#C!E#9Ud\8F҅W{&;J$&Hd1|GC&hl["5]5B^H䉦L~.(^{_W`b/JQ$K2d5ގHu_iy歷fܴ#XtR0J9KvsВhGv%v>J]UFFLY ĝx%L".B֙ 6.|.l?؞ VL\^G}et^NhQ܅`IfL/WdobOmغt+]w`NDXW/&=Jz?*kt3=(ؼH(K%>lųE7Ed;>N/  Dv$?2w;dG՞m TL (䉛flGR4:+ KbȲ4(rg&K'JюEFw V;l+g~4Y6$Vtd:I9 WZjwٚŎMNIjv]fb&:1rR˺U]3_њ  -IC4M-r _Qo0 Nd!ɑJ1bע7}EZD2

&H!YL_G$7ɮYh&DI5i&)csIS|s=B@!IPP",VjT tV!D  I (TtD:]X۹R(&;UC" !0@1AP`"1npf3mO88qqێ8㛎Q1QZiqqaG4 -}Sbӧqg{%V&QQ8b;q:q9կ3x]DTQg't88qNj9Oc{:b{wB!*ǥ .㎔^gԲxQx%xCc5\ϫ>W}o iSYoCc<Hbx.ІݎGN'7x& &TDT<1x(f9C8CǛ1q2|?PH#|gs\D@)/J9TD\0[8j1# }.1_=c(d\CǼ\yÃ8(5w4ryWfPdEٱOb C(`09w\wgEn< -tg㥘'x uQYQLlC#0|gόvqȡ'|ŋn 4Q`C= q ,VE=ga9|ĦyKst`o0D+FB5½Yk}Do& -j: OQs<ouVӃ~DX1qC|jf AD(2\J3ǡrpR䢵1QRx^ ,%}ӆJ''ڨ`(n8S_, F`"Ƈ7u}]+x{O ("(/ T&R!w -jG(8,Yq4ij' lt<5Cq9١{>:xxoB֠Pj(v:  -,oˈE@(!BHb?SF8qPYo̿h*t6"ׅیқ'>͉҄_"60:<(*#b=,vXn\1fogXo`,ETXq -}gOCPjv|So?g!n:\9jjn<byF 0v!jJ:Ma:[iͻp^py /;q_xK!p'#8#4QR%Va0NjPMlֲj!tڣBDd`}7(D@5fvṼN - G a& <S\M7Q^0G%(!"83t"sqxq QdiEV&|9QCقh蝪7 x(1hG1pT y#53~:QYLA[ǒM -<c&8}#;8?J!SX.K?!#80";0X|Ϛ9@+}#3)Extgo`5FCq5Lt`yQw㌙1*3C4(B`8|" &n3"湣n8pXꂥi\wfAh?Hz(N@D!}HBMx74hE ?7[mh-MpYqkt㧙@Y9'c1~Ax`s3 B# = ۭ_8 -"ȈAPq!u 1?"c1NDE T#"3 0(@Lx3Jl! -S9|b*X(}^oB:JGc!fqB>3 ssx3M1ƌ(w - -jp`!"bR)B0oP0MӃTPfpBFf[C)AF.hTX(8x+1КFlagХsSSV~XSy -8 -#@bf(UH`F8ň t80W  E<gy{Y&ݩc*pF`FhMZ9y  vij5nhv<Z}:pMkc>b/ jj!`s>qNs6=c𤋮MZۏ3q0|;0Fc8o _~#E EqP|g'n TQ`7>'ϔyO͎uq́o 4T)EX~m`J,9|BWqO=@f< в FnG r-#aCo2lw= x:4rJ}^AZҎ1 /1hCJC?8#> |Qz9 qXf00 |X()EC«3t~!G9+fP ]َG6lCCV CCEx8s@x1DXEY>(:}OiێpS8 EaSg5!^o7XCYqUf<.G5<k'gQB/T`1o!B}7noM[?rw O g]_.;8q|>bx1ŘRCO1QEO5s|bhs~:CGx0 T8NH!1AQaq "02@PBR`rbp#3SCc ?"MQjsS0LE?O*E?ފb*W)E?OS)Ίr*sW)^r:)Z=fX1 5W5A4juL S?U@T%BT.PB PE PE PE PE PE PE PEQ?EPE PEPB~7hv4(_(_PEPE PEQ?EPE PE PE PE PEM? -{4\v҄Y/gz}j>{vW 7BcO}S)j5Rf@Z=Z=R<7j:}TU@4PE4Q3DBhLn*l -@@lh@&iQEtQEtQ3E4PE4VvhP:ȤrGJ'14 /Dnx6'DO1~'~'~7~iQEQECcT,BtVvhfn?Têi*uh+CtSN#NfTY,\5A}T*P -r((ݢ&v'p 5.w);N3|h*PGtzh#>j3Vv4z(#&4y 6& B Q%x'H2"қ^2=F/@ Q3jSا+@Z=L3ԯE4ê -+;U+;4Vvhf&hfh[h@*xGQE6&7EgEz+;4P1@PJaj#ފas5WuQ/hŠ(@&DУj&Y٢+34VfhVv}T>,}TGUQU1ڦ;ULvjvzE3Բ)^zWަzsN#Ei+HZ4Vjf:=QUsT 05QC'P*(r(((ݢ&;OwePE@S=TE3)U zFG`phQHR*Dp -P)JGS!@(BSaQQQEQGh1&7EtPy+\Jt -Y5OU ɯ`6*z&7E@cx. BqvG>;1w@85wiЍMl?d$Tj*i~p FתhMT#W<δ$鲷NN2Lx4Eڣ5VE?ҥp#+E<՝o(?w 0' |GSKTB -f߇3h3GҭRɪsW+(^.tiVʊcY8 M\T+Z}S Y#U7mCcAk(Ǝ^4 4MBLO5hEs@y'TK0>  t.'qܭqZVnTᱵ x8)/%Z jI_6;!O Ț;C. M3Vo)(pr!'LABLa$qrߊ5_ 41R -xV_ҧouhEIɣp#eڮ[S^vceʌ[cNKR7rVryl0 k\ǹ5ʅr sBm1USknt4gutBJe}*4V+SբR^3"NǿU6+Eή)L鏸 -xNwb,Ymmj5ኵ:Pv@q_? L=SRQ}N|OjQ`> 0^Vo5)Tֻ!4#;(;PS-=٘w9B<8rA$ (nnUCfި`xkbqAUnZGlţsuS*a,̦<6&]<TɅrWSMܥfZS۪>#(am'}Ph~xq}na퐗Vic< w s; X낳ˣ}*T^{<hm}U}T}D' χS -T*Cg]gp=4{iΪ4*/"jLv_eʽJ5#ޥc#ژ;WrqH@sQ=0XIvYZjd|f9'ӪЧ;(H|o0& -̢CuA(OE *lm@X1>EyLu2} ps9皕Z'9"&GԄ|F^䬷r(`ǭmys̊Wcƕ_NOxҞ#UF* QSW -xdttNș^4VI -c2)ᶭ9K Xi -3hp))f9jƵ%Uj>R5滻.,|uz --MNc|ԍ=hfmn>t9L_QyOy`v{ 0Ylsi= )ɢ>]S(jkk'&{y6]]eJMTnS\O%xa7\Oǜ,qj:#蜜h|5s[+&ytSJ?ILq9Jym)ד!~#\T.ǘ3v^{ 3L+0 Xèq5Gv|AT>Du)oڵM+JW̧qMFPT9+uGE>*A[/y*dzvkc! -+) -aWOp*UhlsG(.pִŠ'~UѢt_jwO}>Tv2Vq^<QBr JEJ2ޙ?BL sI;mZ0|YB?DtCg@QЏq4빣5U=,P0.B9\PWH'h: @%D8c 㢄ڨV+UGRzj8 -m}R}l+Mm8P/VvhoL`a+ޅwHq>#傟"2&;TJ2Y٪> A xej2 !ܕh8shѐˆփc]@7S$c?FpB)D:mD1n -udˢv%O)V>ptWShUU_DOPGRix?#Q/%Fu*3kQPe1BhSEh:+HIzuFJƊshʘC{ʵpSj(tJxm@ˊ UjUg82뇇ZV(z'>)9O's ~irO¹'-*Pj9+@#x !,)fiJB*:kD˴4QEZSh=U' a(xɠ0f&hO |c@gj+jZ~$pu&^GGD{9#^I͢s]{No:"Rso'(*_D8%Wp׎xQD7O/[ԃ</rtU -up@aLPmnHp9?-8IiVy| "IT;"] (|C 6HST껗Ujvqz((t,qޢngfkp*.1{pN:A~tM;&5R*NAJX-hFǏ̦`8f>U-GxXQ^!54;Aq;c2o ЄPO 1['<8rNǸ,x˜OvTo5;S9IE'uvQe`NJdrc6XN5%p΢<~㔥Ry٪T2";˂~1kx7IiD{r>?_ܥ<~_+?F#ZV{WoVJHr e8'~0hiTêLvyrЫڦԫ'wr: -un\>8n&mCsZZǂvͪ>QGVNmVZ7,Ab_g=e<!u"{U[5mG߭vE+O1 -M"~O t+Kx)ڎ)ռkx-|qZ -L -wuF f7 8<,ky:JO'>wrczysދG%G iNqVw9Kyf{vmS5 <3VjfQ&4?Eb -dn(?V9-s -ַJ79) iJ5`>JFV-woR(k-PR9<9 .P_ ئ 7V7V颮-ߩ -AFv{eR%7R -xxaJ?@Q^vU1*7tP4+T̯j.5LY咵6 - -@MSӏL&FcC$L9˽*)TxVW3^Ouj崽E֜Tn-qA¼QPkT1LSmOӻWp MQ\]ڠFњ`P_\'5_WGԢ>d'<|Fp?rAN>`_PSS)oE(Kv:ch+< _LvӵVЭuJH >{.vႊ2VvhjH HN4Q=MpNzt -/Mx՝5B>6x5>E O3/D3̜G\v3VDy#S|1"NL޹(Giʑo5X ŚYpq'R*Q']NRPuR;JE1R)R)RQh -o>m24{9)c =օH: Dhz,(:hR/h9*fOҁ]l!i/9YOD=S=H1B:+Gҭ>4S9|*Ҭ蠈ef`WonmiUzBi!W +ʁn٘VU?և^W~ -#];]‰5Q:xGRyUCc7Z9Sj[V譮OkvT -sVl+\t-K ‡_Lʉ733?ߚVu8a±WHVu6>,pSSSХJ!0QDy*@f˞iRtwgw" 䣫JS05|IY^91UsUVз/V\p~˅ -0@TiOc)#PMڼ>&EiB4bj8oѹW,Q/T/g"9'UwS{DdJy -G9pE=Ӊ -\>]HB8]VBF'@@+[oV+s4Vߒĭ}TmTmTmT}Sξ_c}ef0jK/xW%$y| -G\qq,sYTMJ|1&11&?PaBAB5P TUCPz}kyYL:OP sj?L%@(?ⱷӳ+ƞ+4{ߎpQ-}@ث(FYDloW,h -0ѢhM!PT>UC*U -JJ@>#Q sAR]ly}KnQ]S cEtQEtQ51(ۢ&Zj+;4VvhYڠjB~+A*OB:'835SG)Jv%'xG.oOorO5)TxfKy'.w4NJmS+%\Cn^-!E(rL5(rʆ'nU%kQxl(SK,T5o)xe]~W_ao6&t:)ح@~;jWwY uGXJd~$Q8_g/ "wTP2U`zVf5co̬CV64t8x()449YTQ!<ˆ0W~ -j?JY~c}]UU#7N0! -zyw;'+P4?nYxCwiʪGoW\+jiZ =Gu9Nb{Xkb1"q}5kkOqhE?T*o[U "pӲGƉ"Y{PUZh>'UU}ʚ} ->#FmktQ2v;ْ4S-ZޭObo[ÇH!HO:)q7KGhUy#Q8i,:pFDo=3_E}Á\撥z+KUaBc+G53 vhTj8}ּ<3@Ѫ}TꤛU,IRMmTj6j6IOTRK|˪E,Ρʾ*x+Ttu]mSXsUsx \> 3h V+H.F`EZQZAo!0u*pJ|8y{d!J)”SU;S 2:CZz -4sRs*F샒q.wz T3AHӻpChySUi#Tʣ +:N,+ZQ F; )zM -:`TI-~^\ Vo7U*;Rwx"謵eYUYzzq}T^= -W)SΨDb1c_f}5q}mB54B4&t9#|WWDL'U VUg&(YC1R)sBtFeSӎg8|pPUjU@5Qe1Ugwwhɧa|b(:HOwOVy)؇M 0_&w{,N~%?*; if-8]2xi<{x WUj Wu\TTAꦊ mB/rӳ%Ynh{qfҬюW(;2 -J&;LT4UU^׿=ޡ4&i -蠗EeV94VYtL<{ET沧.WCΣpJl%EZaTno=v0Yi`7 ZOrvƃ{ -UvB@ET#QEңTJP))"0^/| -"ܛMF7^P^N߇MWznfhTRSJgT) Op}ѵb} -| .>+u -r -RS様yZd8ĵJ?nzȿdWuS9`+54}զUKR7*^T⥼ +Njh?ޝZoTUh,BZ|02V`sZ>룊2QD "{pP TMPi;_A\KQC<ÒăMG=˽]ɷ\96sWOScOҟ{wވM}KxHQx`wic_05nr\:(_sƩאQ$ӠMvD@GsVYy5YzwJ}YO ֊op*+ U$_k? )ῼ(TRQ&x iҞ~nEz;<ײ.sNqEm}UY]Mq*7 )_˒>WtA)A)M*c~T1ʢP*EEP( - -m)wZQBҠjǢ' !{ 邉r/WUR)Ls@ׁLsP5ra -~Z -`5PnQ|Awv7s -.❇瓰QExnZs5S `8/R!W*'XHRˢF9UztV9iXe4VVIP=(q&DlKRFK5#ڞ4OOORz)DxmqCƨ5N?Z @⥩@uy)s b:)O Q%uLvU^SxN($ޘSǂs֋.xG Ǐ'tClzk,ta~I~Ji«?ẕަTJTLTJTIRJQ)TOTTT}Q*.>7yB|AwUhT]D ҡ2 _a< P3EA=!vS0D=u)Z=Z>hSև4~ -qhuT_{Uru OFs}[O/c -g -Y 1ĖZ >RfBϔ0 -ii#Æ"P1@=T Ы;OD*2;;6G UjUf=9/rVa UjUf\g .)m)h@R;TqN()YB}Ee;D#mhVuqST潟`]^Ry&H{+VA碾'|''wէSz 5F{Ć -PY>&#sZ(FxNģ {|qx@l ꊚ~A"QԄ(%{.*RkΩTtSs+JCOkƉoZSx(%gc V<+֬Q'VQI!qܜHqIƴY"2Ecʕ̮֨tO H详TjTgUFuQJ@T,BLnPn]tWNJW -6(iMVW0gkAՎ1ULE jcA璎 -pMOH;t]FNM-:JJ얜X|*R4%DmU (%YYfXX\'UbV1gf(o51:eJ5XS)|QJt)>I9+dkzNTJ -6:>*tU[[[`'&=Gvjw5 #Pi_|K5 #PyNjk= -s39 Ǐ.pqUpGSDD`@m!9HC5SU;uS)Jt*CsUk)rws@%д4MÀM~ÏEgDmFW8E |򢔦ՖƂȨ<ʳYwؘOE4M >Pgj?Y٢EffˎBG-WenyZxVP>;W_&U|+7Vo@mV6גJZ+SxW=0By>CT>@C)$Ep%m! -}\N]auM**/˲6 >[Hoz!/SSFODV`vu8F<%.>~4j3El+bk.~TLLomymmBsZ7)nV4(P)} -F1ܥ WR9Qjuz㪛Lq¦=*O2urƜԘS*lJ*GT:MT j{ti!>uLhu5o7#H/k0~OG0(<1k?UԡPDj8qz!|jV)ZtN:&(PKUBT=|zxS*¼>-nԕjh軃uI߰o=PGNj'̭2S}JOz~?EA(B5QP1(0ş}kM8و&T5S< <n)!BTnM#Ú*!P5 6EQ5Pq/58a{uWWk - - Q6mSfBoDٽfW_Tê2'H".'`&M2oE|~×iϯ%dph<lqou7}ey(:Sch+9boq8vc``(Nx` -bj7VFS -riQ?4Yu8i-O|47EbBWPiPD T-@Phh%yB;_:ѷ*7hv7hv"*"WuNjP=j'z"GERJ8ؽWNȧvEÐVZ|ӚS fE}9a6伖6 e ۪SYa>CJ'5@ShM쳽h)@>C:-#B"B(OT*UFU')J\v )3ΨP hR -WiTf,*`Ո+mVwU+BrCv [>oexs -*Uz!8[`O5a7S+)wܟt#R%JGR\9i sQ-mwt E$ZhLq漾ho-5n]0k៽tLv'hr~]i^QϧQ hRW9XJ%GtF~a Q{r0? hU4YpRɪ\vЩ} -W{S+mm DTkFt 1pS8WSkH7#\{DM7wεB*c*l 7yGhUh栻uB1"0iDfִ=`UoAǯ8&PZ#p#h:'<|R~?C -P(^?4%{=)flQz h; -v -s%Nq*Jsrx/ޞ;5Mq -P-)-aW ޿ QJ0M nT{gVWgyV9UVYwOEeEcXVItPv+*HrYg\HmVY E}3ڡO%? p -q%C/iQ'S -&$z禝TgUDuP T Q0y&yi4!UƵ~VVN;nEZC+^Z_AVH^=ՂN!Y<+#xQXX5Mݢotko^RM&_ԥ⧻S(B'{5-^ 'ޮa h -vT:A0}$ਫ਼RK~4Nֽ$"?&2Vդ+lj=hɃ͏Gk_eݢ("@5sTY{)Ozڭ+]wuw'pxfVU UUN»AP}B~Rp(=9[EjhV;B%L7`ry(Ƌ͸&fA]vWF8NJ4\TjpgRU+uVzSSLviRҼJUhUhU<2۹=΀)" $eCث@xSd+N#v hWǘƊqQMx84ܜiOKթN#[EϊyRIVg'&s [w;pYm*(ƉD68'TjTKTBǨܡP TBv"B{|O*igB)0@];pW^N꬏j`B*A"s]Dqxura]zyÒusA5>Q2R'׫TD+k06HtRB:>o)E?oݢ<^߽a^>I.$?;#6C4dMzlMtD.|'nJ+woP҉ qVvS5f9W?M?T*`)ƊoE+OziFu*%tP7E0x0")JaW 9+CTB)m=Ui(Hҫ]XjW^YsM{\UJ]TkݰT(Io&ygqKUeuRY>e5U@ƴVS;efw̬{F4ګ9YΪ'؊謧VO'U*J5f VvV&c*!=&_ˊXX̬,Y㶡 -,(lS;Mi=tVUf|5PzNro^2r4VR -.:9xϺU*He % .P9@uYx_Uf0YFȬA "+M&^BO& -12r"Bs`]LOq9|HZhh -_@*g~Gk4A -y7&4vM:Juv<2NEH}y(+` i*mmNN'*(-CG/S؟Zp^4;?)lxvEI }nϙZcZ#LЬ=`>LR7US9yqN4ShimGE?{U8E?hYUnS -z+GhJrVZr<~>徟kZ8J#T4 -0ƨzSwxUY̬UgnT Q>V7OU?Y7t8P::<@ݪq={\ ='| /im]De<$Q"8:)G'ޢ7:,E{#ң4 -(szxE}h)E8U QaIc*˟#M`A֜ -hLSBbhQt}TF2vNU;G*VjnLKSby:BE$Iz'8)FuQTGR:@v`o'Tbk՟(AT'*5_D)~7TaJSޯ4ߵWWJGSvw!;htlUQ1F!TT;3ኘcGFydLUT^OD])PS̕f²0p7hǿΊXG2YJST=#T P5YۢbYY44r4cO/pP*Q}< >S٫:Z#~JV\x7?|L2ǪǪqJ;v*+q>_VӧU/EbIA5t{V֏DdqG+SOE$'諎dÚBz<<3Vg-MZ]{+RT$q<|Fޠˊ?aV`V#oo/;ށ@A>ϊmV2:Jy]7w'ySi>!{F3 ,"R$S/ NA y{w-qR+&~iK1OvtR'zGS='DTGT>Jw?:|JOrܬEQxѯ*7y -+꣯QJApGAV+ɩ$Sk_SbN(#ǵhU;o*bq. -6'rRP +ﻆIybҧ7wp*'ygRӭEÎ:+7wc'Uz$VNx*N(z輨ΪR -h`LjaEC?s.uQs+y+g\ޝ^~TߥO$~tV^RlGQ~UF^e26ӆ$栏Ez(hPM:WVqJIÓYRRR}Ήq;qDR -yk9Ny9IDC --wz;BݑEuڕj:gVwuZPedqN.ʱ2\چw-ƙo܈ 8_*eH NCd۪KRiiS -EhǢ>{^#$kWz>i(/{kC˵Q1Y³5qm~$PwEgf?ң&z&  4G_ɑo4s㐜;5SU0RqLzUFsD)zB|F>`mX٪G47- ? vލw앵%$kNJm[e*"=džq'H+̨Bha=Oh?*/LyT'Ue ->UލR}JP9{~AGJ&UDW8e/R*RtG pV&wjجLn=PU<]Y* .#$;y?j8J6/wΈU4Q,Q%{^\qدBȼ/#/h.ŨNYSOf+CtV #lj.Bok5iyꀯUZ7{rRPħ7U8Q7c7bU⯫Fu(VCmr -j(UA)\0Pgj -Y1̭hpPG=&Eb(]Tnx,85}<6,D -TLJcGCQFZ_1V3W+S*VPZ=-]dZ|:cTאӚwAޚ׏yh޴S}EJ>bS)JA' U򨾕 QA_@*Gc׷Q*潛1Fk[ -1Yݼ)٪{_&_M2y[j;[G T^(}B)F?!a -$ -ܤ?2SO֏7S3J;Uh.#]ƒ5kmyKJƥǐVG%%lB(3x;B^Ӵ_MsO1vV^7ԬVq# . :} +y"QXY³S*Ӑi2?MUEDzO H#R63{¥_%=Vg r w [8".&ȣw#&cħw&H9-*/7Ѝ?P4! -ԖEz xn*RvWQhv"LWSئS)|1lVKU׸?w* -joT*I(pꙏ5-1HOwU!Z9<œHFrsM::mܚŚuGMHMw*Э5h+Oًy+BJv -q)Ɖi[ǻnj2Ny'8ppOuy㗏~ɥS]:T|vwvwkARiȒm(1 Go+l;B*؟eRw)S4$.O =5E/R#>炭Ə5sC ׉;׎aE ԨCB~7ud*H>8Ԕ:)4 -|.h*!ARxef5%4|1z(JC+')RU#Dv'&(v#!WTê7]Oj-sDK9?2LV^ꅃ Jx-ZDBthNꬂGJ -QpWFk<ʕo0㒽+ǂMf>f'iQD0Yƪ>eg2Tߏ㰑h`w(&;JtW^'|$~!urͭVM M)פ]oSiVttpT틈%[chWnr*UOW 1ªZ#;*׫QH+*'J)Ɖz#'QЪ08sVv)6Y -MCjeAXit]{x?($&cD/DDsq|^f FtP~O*,1ϻD0JԨj(ރfI#1LP6w][6{.֋xD$kJsٽU&Ĭ>J(T -V1c'U|X̅0*!@ -Nx^}x՟骳*mz6b;$N9)̤}oHOCP%pyqC1z*A݊Yd=zᵽ -c  *]J\S9潜2z<ח:4p5 #Gvx"zU0b(MO| -QEZqja_PT#)ziO ^Wj@,d9Zc<):$}IRJ+ԯO~ -5]UgjSpJS(S?F~DMPV;P TMP~G~7U'^0@GtTTqS3U35w(( {TêaGT^6](VIJ}Yѥѣ(?:{djF%W~m(O >4l -[GʭJ ^j'̕)T˷{Vp8k&I+34L Z+5?iQT2v k88rA1v -Ҫ^B裨8sٸҹu -"wvEѻ)]{;pﮫ/TLE)2ʠj90m!O^(!}Ff;?pQihQ6`S5KU϶sQ8y/uVXP>:vnoD ٸ2UʭOq6gD~쀥C5SNA5!Ч52v+½n|aO^ꋫd4PM)u*y)٪8vO+h#qqUYJmM00̀6{4vB%&4󢌇r0krvȋ˒m*pQ_i»annI5_R3=現 |A LH-ohAµHG@#<]hwrN -F5;T<街EgEe}yଞԯS1z+TyU tL <@FRF_ pJ{wjvj!ET^ETC{k9]&A6M\:_SWR*L:ԍ<.jxwb^T`v,Hy4a#};2>F-+I/ӅAoؖRScuZ~դaصBˢIZQiTTӃ7@NWܬUTqf!Jf=6xSꤡH8[5h)0$u*Rn@y&Dj_D\ToQFwDtRJS׷9/P TDo#6og0R)55Js셒c;اr*P+ 8VYy(Bm6`[UCAŊUf -* ?iA(}UR7kʩsLZzX1y$l$^Rp;G5i{%#E1.qS1;55p6Ki8Bu+xq_p{ܡWt<#JN 2UeΊ0+57rzҠp BOA]IwvcQ;Em:F;n:<դW|cm<}rAy&޳!qێh +T)#RwO5u!Rhʴ}eL>b~AJvh2@_7aQc^.Vs=Sڵީ1M@6cPx`nT#*2:4#-(@pQ})@SẠ^a^X PxozR3U+RVs$2DOQW8ݼ -gjEA{{ʿWOE{{ƴM7Z#5Upj'Ǫ5nDED UTLZ=BxrѪ\M: NZ#ŠƩZF4^O,V?PVϨ+Aq|nG"k 5_kN8WcS9"a#S)ƊoE#=FjUԩz U8 TS4DQZZ֊+<ԭ>{Nvp+@Z+@Kb\G$usFxkۋFУC{C J/PdͥXf!V8 -_{֩#0] T{moU{PjU9(QkIq>*V\B(ڐ+h(TE)OqL:|Dޞ#Ԯ&"(EDXWmEsO,NGoW21L_2H =nZE q -@YmܪP%b DӞ0W ? vo 2%jKiT TԴ-s8PUmZ+iOo &\xOm:Z<I۩S{ӚWUhf\Vj,ZYUrRқOt hZ)qiZJt*g7+C"TU 1pn䭣VM -z+Mݦ$ZS% h i"8+;4Vvh@mڦ]`AĩMP9;ĖN4RuP늳E G`T NT<'Y}jW'4*-PzZT@Ae,Q4gm -`juܬ&.ZN$&J<Ӎ[Z]Y^a qUfG]qm7+#Y9+ ڦ]<6欣PenoXWv7%IN%H !I6HD' S=E\xJڔéN1Y){7BUjhh嵁T#DΔV_@ƻaהd"'cSB iYƪ5Vqzn-ÙA W -5E|yd)Qk2 Z1Z's%C5UURIExG8QBxiBE{}>de8jևsG!]UހjV5Sɪs0(&y*4Ξ#) ܉=vq܀hLkGAҞ̼?2U aU0@^W*jʵ}e[O>4*4V h'`G$kd+J2PCOi5UsC^ -Q/rT YIo 1W*rLa*!ܔDk}SP -ZPcDMj RTѿurVR_.uV S9L+ԯOy#y5v0OMV{V@<;^4Ni*vRZOSGlޅJBl SHOTNP TCJ{lըЧcvSx`O ǂscoB&PO -û(W5F9m»uw~ۮ8ԣb\4ߒ{\9vIΘo*VיRpަjaOP2DӞ!GՑ@uz9'qOx$"ٙiL!5 Pu՞'aTޅ;Lz7Jemğd#t U*T8g"S;q%>?aA Cxq@P?9?1Ugp\>ϙ -`Vvh/*ѼZ7=r1e1M{$$&n֡Ztn4^ުCEzG|_ʴQڦLq%Yۇ"wmJLF[8 Ә/j;=JQK_=-UTE(g -h<6pWMpRPpIZ|??^\#5ÌG& Sb_dO:&14E!R;eGwP梻 / -{T.<jˏꪀjn+co @"QRP!"<]~MWh*(\>E A.o+ 軚NϲF(;?iL)۪7SU -RRBq'PӪ|ʔpqNޥx Sh_iʴL@.<!)tQ;Ey/I_ܨ%EOQQ]+o9C,@^Y~-E+y.8|c2ETWzxۛTWuOsw<_=]ڔeZGUjT -֛֭9 -{Q7WK^MoDZr ΧDBh=Tdt*2g]D QһVWjNNF3EtqQv@:@ L ;A<^+xH5R U?8kAqS.%8Zٮ»j()ߢ*Iq4ߴjwjZ7*sYԮKI?Yډ4ࣩ4Ck(iF8&ӽD{]ZS]M;^*X:VM.BV_T*SNNלFI}2ODhM{r#p92'-({RSSƪ3P(FEj1VU9QLUьtj5'މTԩ8St$EU -# -h_ĦT:M겊nP3~i>_ &+=p4ߜi@TV V-F_58HHcUxpPJԧRQwwB䤾߽e׌1Wq@<_v*w(C {Fށ+-Gq*ɮUQ 7СiW-x37s:]ƪV%iU|m2`BM$ _nG:(PɁnY4Sf@(̬YV?8Y5ƘUY?Uwժ;*@]PW{4_AV›ܨWS,a^_oi"QJ<?YOάqJÎ؄\|YYwUc?7Z'TJl(g*UP@z5Z4VnO+TeDTA%/r'ޞ9RF;Uj;5RIҭVVE5%P5籵 -@GHOU*ip5ׯŸ"|'ȋYuȨDuB Ve!P}2;~t% -E { i~EwE<œE{3}hy='s;t*֊V5mpw3?>;q;նU%m[cV0T(۩]U++[5 z+9YVOl/W,k(y2Տ -)%S mJRIi\FEObfWESp+US -V7 +Z(\7+3P1Qju<7ƪh;.vNC[}꺻K$>JZ-+ѧeEaV^eYn}=wVKO3Eg zt :DZԅ,#D -a/74?]w9S ފG&JcB)BAk7QJBF*O5sN܂JX'$mJHjgjyou!4%DO4j)EFj ;A}kpw -SH4z3oBcK֛tVyV9<ՌꬣQ<GE}%@.O|SU>$G';=Y]Q61or?8p㱷Uff6HwCg+۸#,N)8*8=sM0m`V9ߩZZYi\M RUQrP҅)v׆(8oYTB5U53z* 94Ҡ -]nkkJq>KȣCTh74mЫ@ʴ}e9#L;EAܭ-o+GҭJ+UG.@2זƁO!'ׂګܛU uJ*w -%`Dhp*~갲袀4IYE?MS.;xs׽^ʯҁ#?ss!k}*ՇO:Q6x83 {T -Mv⬪0+E:+A*ST_z^JrϢ͢LOVg7pTͧDꝕ|NƊH;ZF&T?IU>+D&#pU7'b5;5Ok=*T=校Z?\OU4Q17P@w|0âsn W0+J8T,\s;M q?:Z~?YV)px@S5Z4STpbR*_´+ԯSچDgPUSh ׂ6jMjߕYiaJ()&MNqNCO?콢p7tsYWN:#NvƧ'DWy*/RӻnMZT-=BgC*ろ6Z)VP!ܦlo[kr$A0%&h;<4wԾ}ǚm+J~Wku,TUܢ/VCTj@ -UJuO2#L*a>J2*y'Ej7+I+FW8EDtZGKRTj6 kUQS@V] -x?4歑["d20־,Wr:)Ίg"I<|p񂍧FКF60[Ǹfvt NxCVRqQ3w0և%>=qOXOw;rǪtz( E* ;#(L-st;#vM[]Lk\*USX$!F5Eg3o *Ho =T]?3iwas~Z!YtӲQk䇆(}T?E`ޤ+c~ei*WQϢ;?ڧ)OyP]xA2O*SR#_ڍ#')hRHMرPeY դj6D v@D])|N[M ZfGZjJ^|isMhE饁٭juNq#*|(w(ZѮn\6g T L`9e8VY٢hn;ZDNLM -Q~>]DGo2FWn[|CGҭ2)|mM=IDTeFpRj=䇻ƘuL:JԦb9K*;L(j`/HSҼ{11gJzU$>U'/3/#ӟ!j$k{ՎbgW+9q =U؇<_RޛX(8$$q4VXIKCId k'%#.Ol5%SوЄQ4 -GXAB&><UUF1P7D1ۖe'la:&֙IĔj{\p]ÓG};[b9'Q<'wo;ifvkI5܍1} -}b'.C2P]P6MBQBp'k`<܊UT.&&A(ZGPjZuVg;umg+ĊSi[=S4>%Фy< D"(L}S=E69!@*oDU|EgJثO kJ>JQ(m>#kS߳oQr(YmfNjUjUg0$CW^c!W ryLlЧ)NO_בNPmi 4=-…B7~# }hB -ЬW E @uPz?yǴiJMݡ@sk (6#qW:crh -;79[ʴ;Jlo__YHQau7G'Z\ze?:RTp"kXXNAYC(Y<@Uiʉ~InU^1EHS#U===LJ \2齆 }7M#^˰ƝL`?U+2\.ȅ?Jp0VgU^ 51ϧQY~p2*G3B(#pҜ7ϲ(;kB4FxY{OC5O spGM)N 2taV9zk|*EL$WML^j@?+A0j%FaTiZG̭H^T>!3D}52B*Q抵HW?ec$QmJAJ)~_DjvoVLtWRO -x  -IO|IS+[ AP}gN K# -h(QTވ0jSk -Uq݆HF=2w&P~SKjFjs;a{Es*'+Ո?LwȚWiUPy*PNS[1NhEh)Nm.sNJu2 j.CT>CT>04m {67h 2V6gki״3c]ƪnCV+UhM>%<ZLFSR*sUhLJ1\sAIP}CT")Z5a`cVv2#8DښCf6>vKF(NajX:88C5Vj,?%9'Tw^k\iԕ&d6p"Kvjl)Vl -fv -IUMx -5@CԨ}T>@ Q[]@a)r ڦYp8,+#$_Φʖ*r O$fy).sDK028U# -rQ5y!Y+ں+R0'P(~7xS>1*bz!^'x8TMUjBzm)L}0 -5Vf[Ug i+3tVp8"D{۸2jN,JG Xh -ss]$RN[qEOB'qVq -*5jvxqz"}{FꧏUiUiffk`Gͪrw.x4êTgRAw<$V`,&ؒiz"B|J~u/wzoOJ⢾F:qGsTJz);)*W\v$)h8k'}y~G;Sz)]T9)跚GR: EJ}NZ)}UT5PAoU:Gm`hR$j=& z.IVo/U)7?B7@8(Y 1hShE-8{A{H|Y:)ƪS+GԭQO{Nq[Cq*`yn\3x+mp*LZ5wE債)S//M790Qܻ璃EsQ;a;U+;4Vvhs Xvtr&zlgE^h)U&5 -2*w VE6<ԃ^q]ҹR3S- Hi k|rA^,~뷐Cl?iʴP\jUoV*,SÇ-0FNhbZR;Bkliq8wQU:UXV{YiVq4(98Q PIhX|?k5ARUx=}2Cj'(OȚGW֋>À4;cKNziD 1QH';DUُ@?˼GSȦ ܉]'xW% TT`A54'(Nlb+Wl J{OC2TAGF}B#e+u#dSM봾 '=q4I֊f_[)y,ٛӀNu? !=׷UJ6ZkN;@ 9E)ze+ljim?dU( F&m*ՍX=UP^`\1`UmO%?}mݧtdN)&}x^.>v^{r*Ww(VaOԬj5PSfs"Lnu>++SYVqIޭ8y&ѵMW%_{w0Cx(䲮v4!1); %t#i-NM%٧0 kxqMǎ]kcAC .S L@zY?IXh-\y$ɏr2&)+YK_5%XTLoW+LCp=>D*@tO*oT *W+3Q:'?OR?rk!Z:h⃛Oƒc!O+C>MSO}iY[+t"ȜM7ˈQqd {VP7fVUbn)Yf6ٯa+_wV5eVv\+(Vqeg*0;Mӿ-!K4DqQEq=j{lrV1cnЬYZhHaMahBw(mkƁa'>Rq=硪! )UNR\X'4ަT6lAE\M2pJy^nӒ5SSGA41%hc{0j#@ΊlOu@ٻżW?}UK5C}w*vةu!5eiE{ ݯw`vƋЂآb6ZKmw;[dVuV 9ckn3T%jw -P|cUǝd>x(ޮRꭚ5Oh>j7x-W7R=-R`wHR_e_hcoGG{SȕңF6~,ڹF~ThM>/z'<|lu8(LMTj-붝Wȋ.sdAڳi]v4hMbkfmdhneD^!8'Hᵽd480OQnM(JxL'J,7qRJ [l@8Q3zuZi'zAQ5Z3mc EC0?YƪϙvXkZWEeM{ -Pz'Ip鵕R.;VJ,)qzIr= 1qF -dT޽s<׷)δ3|VE?@OVv+2{|ʗJ|zzdhШC0*3z*sAuFY7 <ʋBjm>-JO5?QAU@[?3>JwܬBO507ك4;A+b)DCZkǧ+΁[&ZZ['ZWaMxu}d y& -.#Fnm^i/Wa3;actM2X2cB?{nRW*9JCԦM4괮e~OZ+8Yƪ&Q2=x/ff߇r\͹êaBB`=O ps ~O+CJ$4<µW8[[M'79{i.'*I! U5*wi^kD˴{uU51hb em,$êb(N35R+#P+G@/{>H1j) -[iJJlmU޿^9(uH=F鱭>I>*tRcP9SIHOM9 -Dl T7)+9w4 TqPbpxe1cS)ð Z v6kaW*}*C|%G.oۄxco@Y+@Z_֭* SdV5Ҝ;i>rXw,x#yO<V|LdگyK$ʮl=*bB2M r9皳9^iT4^;(|oU+5R3.(B0ZmduT;>]ƌ(&DExw{%PlE`֬`11m(8P9yjp - -9[_w4-ƯSx{W% 7x9\Ԩ)˰vvAY⾘\]<nTGRkD˴4Cq;sY)N]J֪kײ@2N.;%v9#^Q G;gAFqC~NxklYF&#c~A] \ե譯VSU5|y(UGwʟʟU~UU_w -?R4êmpXE cEFU " &a%Myh%JЫDکeH$YMf֢73'I/L:Ϊis_g+ZLp-ʩ -n=kNc.<ՑBE8 -{%YTnj) -镧W?)J׍vVkRB Z}TnHE#Ԓ'?#A Qէ1UcXgh -79&oq -v'[2 ;0}nhGhIUjoJe<?T"Ut@?J=p94*&9{ѩ-QqE 9éPy1%DړQ -ʎIDz+cP燏98Z]_™wrSQƽG$ -5 9;B*y -6*sM& Ԩ}JgjW,*Zxn)pԠZ7m+0"+ĕ?U)n*1hS+Oҭ܏ =m -&hvB< ZʛЧTVPyǵ+dګ]VV#2(^kΟAʪ"~"65 -) _=֎Ή1PT~D, -V%|\TT))gL}UEw{Ȫ0 - -9 aw=F' -4-:P9YUGt = F xR7p<_4s<+i HxW0*9ޅcxÒȬR 'm*2׹7E7V&ӪyGwǖҏ`xOn¾DO-4ޭLVcUM~=L.UPzgj\`l~@mAw${1ڌ]G!J_Dw:&=6EA@S+TǠۖwBf"UZIPPS;2 ue;O:C>dC54?)C˶ -Gbzmñbck}l^-TMhd} ƶ[ΊU[+l[ծU#b7̭תJ<ծ_4Gȋ%(Ew`TkQ6'-QB4 kjkEuSE,A`1^#q\܏T|20xv9JԨT>:;wUP3EgEgD Sbh䦾 NRީ=SiTG ORo)?f= Rɪԅluy9Ju>iD(ΥD*Zly+D.i춵4TTq;#ŝVVj,LEW.^pNA{{,΅Jt)ODp?/PTU-U V_4qFԝowBRhB'^u1;{VU+BOo'UV+KUh~wpl$Q=Br2ޠւP4;kpBO'bQ;]qcɨA9hyΘ'H8n(?T]Vwvu#$,YE88R0Z Vwv{T8C5Vim4ġ5q.77 o HvJzrSk+(ЅgQ)ZfeeTLUۊvA>*-Qy|R1ABUׂbnRiʋ[uLnȢwȢYݚv~`YRqSt%ZT׹m}1Vօnj+{tV^OHދe;U5u\4Vjm;*ƬXUT ݆_z8@?gmxD@k(E_W -xEJl}M7%1wb P5@?gfPv<Ir$owQvҬPӡWڦr#jOTAd"Ga=LTꧏTnJSzòaGuߐX7 %g=Si60Sz)/mopͲx;ݩk4R -)]]v|劽z+W\軵5sJ!隊w#RE.$SI=z#"wt}ݭ2FIV|fn,{%DBhM 2*=T,ZYumЭDj|}E>5MǑ -_%f#Dav7XzTfZ >EwcUAA"=.9iBX_ꬎYI&]>+j>7  2"9*yvNeثՌ'ԬtBbb#opDH-+.U$ V:'Tx[Y v/J?<ψOʪ~d^Be -LgTLꃵEnM9+ڦΫ?2QI)2sOX *Bm$)K)Mk. =qKݾS:@uuR54ĩN3M)ڥX7+:!ЧVq99 -fNLxgf==`;F/!8'{OyuqJ'w)Zh=';HwN>Kܚ@W+ފ -}MtJ)QnzZ9mih:PGNVvh`=ӱ=W^zsiϲ<&OkٖrNLꍶƎJl?*Z/r]楿{ot@ߖтwf -0f&׵uqS6e=Qqp,*C5S7R^0ِAq{a/=h`uz4NVFjРm:evJZrk5S sy-Z*ii:R`6+x4bwB6eؐ8pQd'LDjKFM } qhNP+뜊vm)R=eǵJLE(&E.ZM1Y%Ȭr+V#ᵱ!LmR*}2.״ c:;*]er1R}AZ*̂8m}㻦Hpݴ6CyT -fЫEGN̮w-ݗU=ӟn״槏Uj4hrosj3TNhw4TuB -_E!<ȩ ;n-Q<OU*@|Xc{?7Z\HC3 sOzsӞĊf0V;k;*Gtq1x^w_EtM -+4jQx Kxف)k]AKWLi -lwR vuLyr`w5g)P}Y~K]rʐQ<5?Ԛ_C>p{@w):cT^j=SRo2\9_})OVKvޥ8~-"hw"}$Ql 8!N)VhBGTWzzl*TفsiTKuL:Ϊ3N&qf*Iw=i;A-OxnmkPVG!Vbwk;0*FIo R[w' -%9Rf>,:`& -,H;UET^ip*V5hoJϰCLtOqOv؄9܂N*sDgj++'VOBQ1Y:v8!@r^ꍔ=|F'˜%wM1#mpM:JKt -P3DG%tOzɢZWvg7a kil -[T۔›ZqE7{TaSlx<|Բj5RaLv}j4ǚn {bqcSBcEvGehS5C5N7UF~ EOWb2e½y h.<ղ[ߩZfI)l7ޛ"l7OV -w3ZZtQzdwE(RSS3Tv9(AL~?r8Ξvec -+@0Un.^ۧ2=Sk>Ugv+,gS5p8WFGU.Fڧ;7>7pQ&KӌT-D,Qs^q۱B*ǟn+橴/V*60&}ciA Q%OFYx]C ^uvͅ8cW=ViUd0 465v=xʭ9,F hf;rSK:|m;Rx襠西#S4%!FuQ"qA4B`zui.d3ak.e`ǴT`F:'ʟOjS#QċDzx4yC5V -T[EnYmFNmQ[ᶂΦ%Ph=?:{3r_Q>B?ryMo4}wT+CW{})]8^zNX7 N0*+'~V:^0P*m<7.3G^5_cU0nEIާ(lv{#qۈUdey⻯ᣚe'Us6@2<ա*_2{E\VOIi5n`xт#Q~]+ƝDrʹ)<ӃߺꞗwWr0;rD5DपYΪ;/+1EBӂtQ7D -!]G]ՖJ,SfSkZmȅ tP3EtM&)]UxW5VE%Y&n>An%f ,P7(ݓi Lw+!G=.$)ܥjiT(v\SR(6x+OX UgL&? GQQuPJe+UZn 轪b]ܦIHNjU=Tsm4STJB|&FKpcEcXdV9U8d1cE;?y3J54Wa2Ipm;xO'tL#KIh~Z):Xn]a -4(Egn!)R5ޅISGB?E -Lu@QiDjT4Sq3WG5#uR3U35S3TGSzj;٢U|ʮa%j&)^*@ CVg?c){[=iW)zTn?ïF8thBo8Q6&*-oAsRJG)|:5]˰K |_l7y=3X>W -@#eq5aNR+CՀ5bZ;ޭ-jyC\ObO4êTGR*:(2W -l WH岾HsG^*epb62J29 -N{a -5RΪJvגs@8*T$"f0!2pCCEuQSoU@!@,=9l;PW#D4Q(&|!܎#QSlSl:l?*#8=E>'Ȭ$LG'6/ͯ;F9!Ƽ {irXXUkp :'Wp*YuR˪]SH{%nv{0ܭr꥓T`mqᶸI3{!g`K 6:n0uS؝qXr Mdv){te;6OrLDz(cSk_¥j^o)OC~^ԂDJ=T_g`k%C\gexlz4a\ToE+R;Ejp›rd9VO7qlL8`(GJ_& 2;|>̫V[_h;AIuLШƉFiUiPŸAZ_[zRx֜F -)R4حzǽLp'hȴi7u< <' M^* -װ BLFz~m Wh&O=7dtIiGT_NUO#JQs^;3O>(4a%h+<@2όg;duXq䋁F׆hq^۟ @<{1qڨgk~0kq1wx0[ր7vi^hS1TsjIkLzMr x*c欎XOԠ,؎7 ̫)u>vև*)PaYO̬Q)%;<MTSމ<e?24*Ƭqڙsر; &A(Qa.[OU!ْ:)^zC -TWfEET>X* Z(Ɗ1&N<l #ZyL2P4OTB:#Q]6՞J}JuPR;YY(> ^wjoʡnˮD;sO0PRk]96Aty&I*(1B˻YYDo0&'4j[ܨۚjBZY+K5RD0]Z"E9+DƝ@(Wvɢ2hvF܊uӿ'kcx';E#h%c:V_8TaJKZ~~[OkM^B LljۑWaԨJ&[ZT5JZz?QSWW@ -=S.?o)OS;2\}hQ\VJ|¶+a>JEh8mcVVU5i5Q?PAGwϳ-(wF^Mwu*_ڬފZ()TުK#i5iEZ~GRʐ] -4Ӫc`)څaP5BGb:=PBB;챵fh -6ڧէ}hfhhC%hNEdhRעTI -D!jE!SԎAeP ?MNJ#SڈDvlAA6 D"ڤnVj)TD])QDPTMA+')RHQ0D֍D{d <]999wDa0sLiMh*!E0hP7UQ([ j0j`M +"4D'1S1S1R)RU+R;T|FA63G1N25^ - OJpR Y"Gq( !!8' S6vڧ -mΉhzcOP VqUD ЈN -R*GjSν>jQ5:G‘bCFшA 8'=H;5SU;5SNDhtE+NP@VqUZbc \+)=˜~W~WvNWhm jR% JST! J&8@NE!O:g1yv65D)٪ڧ -oE/{W^ר\:?@5P ShR)ܦ~g~W~Ģrgnh Pc-xE=LTI_$UBZfVjUA>6 jfڥOMzB R;TI}C,!1AQaq 0@P`p?!DP^~vJ819~|Ɯ;i!ڟE')&9RcgpA29a?ۂi^v}iaBaF=.0"~?X?L_p')?ƌGgs87𕿑?b'ZkG})*_u|0^%B{'aJrigs> g29^?~L"Z|Z{n?l[ÎA)(Q -ڷ,0S%TV5xU6Zx4 Qo9F #._hk<3k)7b -])D!vYPcN z51ŹzKt)fT&?KSKe/Iel9feZr(o r-\ۛ.AGm2&c7뎫:Ρ uAFV%1VZ2G(C q{x*wƂ:|.(!E ji}S%y)Z 3ipjk˵Lx3cE_4)Nϴod_/d:h/dӤ{A_%fSg͚;aʯdjmSXEw/4ԧC9ݗ:),0v՟ք㱀s (%OgQ -u΢tnL<)3.c5-sLk?bI58 ~[-'s|W-.\[--sδ'Ru{Qn$u< 'ZvBAȝ"a8} [KtڗN:$ggcoR<-hMm秤Va!#Z%iwEߕ?g݊h^IˉI~ ϟٛ-1~#({n )8b _:r~?|ȊoS>;^?H.o?ϝ%:{T%<-t"53M> Ex ^<+Ub/<0WaXZ*b -ѯY*hsj];yNtC-bQYupm,n\*虣{٢|u'= 5_!!& &p4SԿ>xDIhr"]tKy˗c٬O"平vrY'_/zzKc.s5%M33HYw;dtO(=' ?OK<Alt+b#W?c3ڼgd?XJ+lVKvd~I YH8;u'? qQ f5'_cN9~%~ys?EKb1ly*SLz? %Qߴ'+ϴF:io h~mHΝVu7Bj}cRrS=d~y~XO~-}`nNXu O^[3/|ϕ -( :oa^f~{ -&'βuz'Q: o՝ge%᱘ ,`#(o*$#R'^a=& Z[uX ̝t(3pU_,8[q> +Rp<_~?ǔ~ ŏ? xrx<|ox~ -rncrE#xϟ+xW\/~+x_o Nǒyįʟ|l,ӍTgOrSKTǐP'!zۤ9Jc:Q^e -U8I`'-tGkHV/D sg^*_ r>#>[_ =yr<1y+x'ヷ - |H&5>3112Ǥ}w; B / -y:QfR=,7o/.q|17%E)v%|e )W@ki5r]`hi/r\NM^<*bQ)Wzs݈W@Xԯ J3g0{Μy Ϗ/I|zprJ2ˊHpφ\i1Yaa ;Q?_I^Jm261(J6̹ɄyY ZBn#ޘfjUJ˟e\U´OXc18)pq/ɚ%.֡&)lGX&EC6h8BV ~M%CyYK5 ׍awk$r7IRB -^ QTI;d\KDR>٫(Tc\/J\A|u#p4R:Gv;ȸpg6]Ǡ2Ko,kj@!;FU9iTa%[bwW17Vr -;{CE 8mp:^:T2l W .^Qm[ʼn50!q@aguolciV~R[r,ơ]7oS˟Wq-o92,mֈ"J_j-X0eR~ert$ћ#3;I Zr!Sh :KZSjMs%(_0mRҶ‘&'&c -9h|󗤡h].;Hr'U+Ht⾾5v'5Z_D<pzJ 7cPiY˩n.!L7 jS$ E\-W^,S -, ^ *?3׆D\@305>wbQlL^cf_qoAWۡy.WBuM3qXƥ娘)&rO:*sR׽I8Na/hw͂b)]wri ׬@%V=%F_(f YKc C{B.xTS -J'=fZ($h!6GWòUKf?_[1/(ҥ̫jxgt1`dVv@Щ_f^v4|`xRv8 (_D S)֩6NnqmM A.!H7F-*j2yg.t.993l(1^n2 mռ^V:`R5GqAZw\R6kiżSՃɠO)^IIyWiTρ<7-3f\iC~z-(("991Hnҳv5%*K35+ 95S+gIR(Yj>!A:xX1;WG6HnڬsieAp_yG)І̮ӸY)FjGQ9~N>:@ehgAĖwA -UUSg(BIPhe|p9Z`)M@FƎ˴ex[ n6e[>N?>N?6)t _Xmb]9ӝt.*iǎQ3g߄?W5JJh,z&Vc;J8 -M&:vpE:E> bJ!ў|]JDMg Dab!!S5*_i>䁗[k CZN:S;ඤSmbjq.Ĥ/Moׂ牿 -`-¨YiEO'+`t{ӋP' YLv%`s.S&I乨Ф|ozBzFppprMSZL+Ej'9H^ t7^g]\W2o2ܦ|[5Y [K>2{Z\e[uu_.,6&_7fŵ,b>zp×cQzSIE%) wNز7Gg4%n俬WAbѵSFdsϗ{[;\ʿ3{?i_sgyn7=v%p5LӬt^]0序%oN]>,/Hyg`hf\=HlM .]]fj+o۞ Gr19ɣFO r _Rsi z"u1 }H^̍C <36_2)nG\࿸ekQMgʸ -:+0!ނ}SKǺ0xp\vf)9t©S ֘lux߾/,`hoR4D5&~i_Oz ܚ9_q/'*i~B |DO[/y_C:us]h&8かݜƵ4ӹ[1U Wn"G5%7՗9=P^"TBMGHp#,Ȧs D %g5 nƦ=hFy6PO|DLtD.Xg#AЖg#deÜ""\^k/ǨmhxmWBZki-V5;9jx4p8iZKU)z0#5p EY(f^W ϫ0` a̧iM:"`ij^U_Jrs KbJn''eH>_P2ק`g)(Qű}fzw̧oqG&?? F.RkbZ7Ӆy'ZBmNU%_K-bK!f%tEO=n u2:Q2855zd^68qW܋}/h AUAL LN^ݯ4E/m-0,gה QeˀNGUsoWf1t1;)ŤӞ ~mUKS ~>T89@}q -uˮV3s_1psΤќ(s4PMJz{O&(/|<3f׋F.&sD@9x/ȫ Q}& -s].I>`of?y-%$^!j|'=`YPal?d/5eM'G;RHvo=@!, @]P#׼a[YjG#C[oU塗\AC;w: U W 6`5^zuj5-\}Ԙ E46ބսW7&s[Vb _KS f/"eIMO7Ћx =h[> QE-n*GegQ3E:cͰHhu}zf0:/SFvt$:6]7d!ɲ{k <)yPÚG H'(kǯ~i'A8;SU-/2wlFjR - 7_dq?p 4.wWGv_Vڒ<X'3S:r(_^Ŀ/d^\X~Q T{E '(QBuY!7&i֛ V$gPaEH5!ό ,tcw<$٥iũ&Hv]^>{SUؠz={ -CñẎ.t[e;Jo2Z4|x[ q%);^]Ffsm+ne8偼%#I8J9k$}X2Wp/f#bm8oܵ\ex@q>SU~U)º|.?S6x*j31m/Ù$40F?S8?hy'\ʂ37ڏNhnh9ZRY]ʈE|&F8$\Jt\,ݬ(W4`F2f 1PuW!ޜ?140_~S[HچoփJNX7_$[خU /2Q{wXv4pNzT_K(DNT VpTMSFxT[As6CR訪%#F@!B*3T MU׌sKTI^|8>:Ҩ2,nDpyO}u| (i -NۙPJͯu&"22rDө -oj(4Y#^üԎ !\^rCHjMMk; 3ޣUPa<.E`U8PS\GWy^C*kdK%+~d."6j&6]~/p cٰ1aZ]*EMm-m.P\wNmn ٭Pih&]x=B=`20&EÎ&V%Fhz;ܱͨa`0.2Q Aw3FXԳNN}J,US, m7_-}幻u>kF7l::{yԘj oCXx/[G\3Wx9u&O[DʜIK$a^(=s-4 1eT陇5% o暉Fb2T%UP*úrz”-CʷoK}~ CfH{M8:R[ QSԩ4ע0K3.D iַG&=J'mo/jZU~]{nsjǖl 3)ԍT7-%pn5TvC9$B߶%.KIvBL@SJ^%@ -u[MTZ09jP@d;ưA_~E|PQ<^]فv;0j8WۚKRwzC]#b:D({ [J'fԚ&X/_I~xE郂XRptw&_^$) sȹbmO#l  -~uy?q6E|xx<@7uP\(U@6b2\U{Q% -Ҹ |d|6wՇ[2n0 -5Y`"vE7Kd[m|㢽ۺx/G.L%fm2vS)7rf\<Ŗ\ K}#tV <8)̯ydV͕X91b{Jde沼NoEN^ -э}m[Pv8?fe3O 3x QtM\ANI+L,_Hިi7ڀsMB9&HkqAkFj覓 OC=a Jl!0% |cWTkQovv#/jUk<:i>@\/IGfSOCs9 )3yRu{;A5LBpUzef; qS(,6DML%Q?DO'H=}N x&wHwbkl]URKsdpݿC +R\nPz1f,¸Z}A:Qn|sb15ZPiJr'NI }/) ǩ|9] rzr~  Z"JQ-|Tz] j+_uݒdF/a9 ha:s97q ܎77Ȩh6n4%K8x(g51)6Awy믩"YAWSع2g#gԖ@p(~q@v,bu\|)xO3Vf-: {c枱T[^.4Nݺ>S -1vE}JL_Pm)A_%59Dwf7c> B i)OD;p{m`%|y7Ws]c{3;>b]ݐü:|F}% -k78/KQYuy:񯏯xi/ O~OգF U#39c W%g -du_dy&avmSuTͼaTv5pFN|xHDVqDo:~ -<ʯe9戟Uq}:bE~+Y 7Kj\2kb!X=5tʾ oj`7ZPW&:@W|A'CdVza^3]#&yk 03jptfQxH^rR} mtJ05KvW4CnTx;Y;ϜM{[";AP{?DI1lp3iI~2NKv/h_i昶/'?Ȣ!`<=[ɨO=[8D~K29oOR-j.!z}ЍgRs%%-_ 6oyQ@h4VXgO˘uKƃ/U u t-a  9D;M='d)s Y錿0t߆#WC -v`f1RkDIך^ftDzr.Z:B| 41k77xCV6Ъ;gWikCKIn -I?*iMcÓ5.qCPW֎Q2o,ޞgJEMP``_'D!¦/LPmה|O;h^DXG+B8W& iU튇r%W;0o2s;vf#|培񺯗DyW'￉7\Ep~9+ȿ ZXL~_T ʚPd%Wuv\ś蚯24}&n* ;Y|[zZn&LP mg0, ȨW .h^XRR.0>%-^?.Rɩ/ /-eW%j k@Ayh,p. -HIiz#7ҥ7(] -͛%Oh 3ZLX+T(ZeZZp=gta[:Ko jc}Sf"SLs*$4\+ -fo#; 3 -g   xB5Zxjg>,1Ua\.J!; 5yhq†s_W~6<Oo'W:nhm_jeRa[VHU-s v!kQSdW)k3yA{yfeoRXKTue~{Lyf`؞m8WQxEzެD2i _^PˠmmAm2SXPnN=2A#IP+4msN$60 .;LZ\EO5T<&g"M3aVy\uK{{;[<}*QZ___CXNLZNt'BtB iYZW -Y^iP -PO;m_(*g UGBZ-nRg"|;F+SH X>7K5Yr=૴h|kީFI[Ɵw} -Ď(&z£ȁGM{yZDfx]^o˒*NabVbc톹ВY? rs.2P/&|`X%ǚ50Wtt>wws'9,E}*ݞM?i,"V+FRn$jmYcݣ;H -q?2W%T [PTY῝\o}dbt9R=nMMB-EYUG1 -ٺMĻbSs/(%/] -ٕ1Q ^ Hw箨t,&C6Ž/R`4< -^'jXGG?CK7!gz=q#G{Um| - wPsBk򘍷ű6g>H :8 hUX4ѿ9'0mZ~.LsBV/ծwBWMtdmʾmQ,F/ -il:xAr:Cikַ|ֈ>ujs|<-$ڰ|VI(ۆ|Do]>_閍}Jy?OOĸ˦vGD~hw"[KҪE*O*ꕯ+È5ԂS_g|.}~>ZPhJriR;'<-r yjB`v\"V#3'KoO &sw}{ZSl^#M&w'+*N) u|x E9OMD /)" yU2ΪDj xp'TTq4@bNԑٚbq-d[w/U^藃p'岞笫A2ݍhy$8 +1K+JS]PD;&W3_OhGP=#hJ -CYڏ'gYW(v;3c +x6b,^G60W6w“z~oI/h.Sgefډϼ+!y%XU -ir~S(>5>Еʏ;= -!@r^O^|O"W~=]u/ -e饔1|Icfg56NtwWfh8lq )[@u{}πX}4x[EBxyx\diQ+C[`ЛkҨp Ī˧x gPwe*xeʾ9,5jb #`v'67๯O#X RWiP%cBF:Ϊb.硎2TJfnw2ЫIR@D:݃԰hY f?Hk8Vc-`ІA`Qu:Ej2CdZߛ|p`WdHramзb'8CF~'ΈoNG-]m߾s;6吇ߊ֞{u{DU5?r/vs)AOT:mH+#3wEta9Fk%}K7_ 3/(p#Hd-n9Hṷ_C+4DۡA(Xhlko}z@#⩤tUÔEɬ=')G/+Ez>] -n%/o=~}Xw/_MʧȖDoH!iMP_ԋ{q7Bi֦:})ϞMTXҬSUOon{NpK]ja!A&;:kM~nv ` ylft9l- 8/)3t=_ѥNMjp_S )ni+ -q~9iMf3y_ELF147&PR5Q1uaE&aHv9نj-׃Ӆ=cT_/CO,fY7t)+oT3 -mbPHA>hD@n,L{%1|U*Im|߂c|c$/A ˼@%`$\LÓJ͗M"ԕ47 wO+~Y#/ V]Osirܿ@`?1@esFf49mW/q_s:e<Nn\&.6Q33+)\iуq1|#YX>K&fZ`Yg\ )I)N<04 u|iC,QÏO"Dcxz^es şpk%[(sq)N5#m}Q~a|8=>_H5_?O' ~?p'U@7p'wpt(}MRA&,}%rsDI'hLk -R)vQB19KWJ㬢67trsAdzBɊ{2XWj:01_:!V -4Z.<^Z֭´ES2%k:ա4j,G+w_8.#F7,k QŨG-^ɥªH:\A\V*rb>{}NLyrٖ&Z;-^ jOJ1c)s:,rʾrw9~iUkr.IϧXTԔ72tSxciNP3*yxvUIwdH/cټRsCART/:O9Ϥ&4!ko2ҏ8 3UwywKG\p{OLk4AGywWuz`yX;v_FhF\x˅q|6Os?>7"GJGx~ M8Nue"c|wC W0uuU -+=F -XK ln~؈׿0:g)Y+TW-M#\r.53LZnW؛ݼޙ^5jxȗEٕMyx90ΆW4˂oMܡDk5XeɾpU"Mt[j!v=1db<݈׾Ow 0*4w3yCOTɔ5>2Yp߈p=_9;P_z%hlQ/xyǓKYL)译ȶ'$+ia/: %dcU#M=}t9SNXTᏌ _xg{/ySV}PyY_Af\ -I6Or&5%Σ3:NfQ2@t&kTB ЊbfeߖŴuu7Q9lSKc^z+6ku;YAFhnΩƬ:sidޅng啀'shrYord^' ~|xQ=#Unڼ(\k~6y$71`(6yK]qS~KXVWTF@bF+VNK' -jD:y{̮Oߘy[On Y /lϑgӟ?qtr}7v"!֛a,Á8MwXE] ^AKG}c==28 4 CA%nCs6?YK>"P6GS?Gmg\$.Ӭ%ҟl2龱OOD NU}ғ^pIן?m6V05Wy+)P1L􇹊ObyhP|#b_ʮ&]ZdN">I]j{"Ai5K긥? {DJ2.i2 3;__ 7KY*^rTzΠb9be>u -pa]pD㧌!n~n\򷁶w#̑ Y=u+"KTcv=?ԅ)7Zk0aC&n?)1 |;xH__UAw~Ө{?o*ktf8;S2';ڒ̬ڼ):J@?$\_Db+]?,`+C^ wb;6<3HC٘31zwAԈ-snK VTeu򙻎W<sN:W5*&(hmx$)Х}ny|C`z tב? \Z_tNV<(6-k7gﴩ5h0<_&Mny,+@#Fhxvy R:.ٝG7qL'KʖiNS ځ&O{isP4ИRp† [eᒊY1: -̈́Rx, RC`D?4.376<(TPcy^̒ HWѽ.* S9ޓPs@V+1+h[Y柛'єWYNN_.[+jlj =bY,[R)u:n4o#9eѯ|h93(3:@S5v!,H'f|UV2h,vXVۣt3; y0B~B Okhu_vׂvrO ^>7,It_A0Ov.h ?KqML7|kb&2^8Y9{]pk>W,FEC^(QbrK6D~~%ZBᅵιFMBgQ~fAC&oǢzP5,Ʉ$j? (0u0|uv4~i°4V!Z(a -l7o ׳޿R \@FUs.GVry@Y(h>dnXD$7VcR5+-Oع8p60ӟi~.iњ淥X]/q{3$4XjZb[KolZCi}8ԯb="7NR&7]G\+w2rV-vVL3+\;:l>mڨ(8(\34_Ɋ/_.<Àxɳy6Onϴ ˴NwCnJQɝ~ [ rlǃ5[C ZBWd}]:e* Ew[* srJzk%tc ߄vCS;OZ+uT,>ɓgiSm peYg!O\!npBѻ_,e]u V4hl_"K3 . [wʠ;ۄ{ x_`uBLئi*T.~?%/dk\;v s? hx~/Wt>Xş%I|㿘hA-pQN Y/$Ε~WoFePy'.^!!NjRw'Ƽ7ċC)z2'R/)f $aZlqYy{q%rx(m?Okp/'Uz'_쎣>zI駣Γ:?|̧Åh'Z;Ghbtuj0"&sa 5"n !>-`ΦX>xn/kFw0eFb`şK8tvpF v(>7ֆsKMuUJSƼu1 -@CAcfeENE םm1Ǽa/̰JDr1^; -XKi;5߱\Na]= -eũTׂg:b`la?bWu}?y9cpt -jn),|C&^Q -N̴6?o&{LU2Mx߇Oi+8\6t͆x|K-;Z/5_-Y}ٚ:>CxxCyJ?, {t}{G>U xq+5 wb >EqKXn} _Ho|kZwg .ar0Ņ؀[<|Uu;ARVmW-\O'X|m!yeÌMDzQs?W~&O'W+l?7wׁN6 -̖=y -?O q6:N<(ji A\S1kݬ x~$fg-I,tnNEd [8QTu} j{'"ǖ'>o'jJlNKN߱J<XXݷKsoйՇ)*w‚ʁ5G9p3?>o?}'YV<3?T82} Yޟ~Lq~UBsVhijȇ -GC^}YYhhAo{!.oPѥ6:2FYݐ(^͹&݃\J>? =f0" W)*W§Ɗ(xEFX0FVa:dհ[Trh˨yt3Z13^AAJ|^4$Iy *V-kxo(tWPуtuw|o;fwDԨM2봡a8{yxfXyJHkz 12O5G E/L |-S8>.YlsR~/w}1&yI3쯴eL(~ 9oBeOj;sgý[sѶ=^uQuzxӥ*ORzjXE_ϑ\kɿNe!7xfy}}~x4&yڿ?)l}RWK n{Ě/YU?cA~$өs%xcZj_R F,Rߜ4P)؋=^>7Hjaw 2&@8ǃٽ@1'Dfy|B7#󙫨{S bsJ]8X]}RpY(=s8NjVr,t.=~τd"R"ˣ+.woXNH]p t،|*k t* lRe#U=@FQ*g ӧ(*~; c㟌?^<=7d<_N"c׍1GO ?-G~tJ3cF!T)aqEr7xj+hX3H_(ص&!+ y.c 7$w+`eCΌp__?MzTϠ_&1XoCS4YrR$X9+_q~8\~; 'o7a(_[z#׾S|H8>E.[mt؝Nz)?Пҕ#B>8J|k6J!v|`tGk[<P_8鵌%3 ]hm˭)w$iGi #{0~9g)_fZ%L2mu>[pހXxlPKk/`HG,GW7&61J),Û+É,]cm TsA-0fPܴssD0` qCy{h36t@+c -Ii] R#%zLu4?; .]î,8\X@K>rЖ`u*m>|_%m=]e![,.;9R\\hׂ3kzZ)У֪)X!Oz%<^5.}j&U' -?9/+nֱin?8#] abWywIr2" ;<s [05<Eۅ9kZ:q`OI*,MAv{|0hϬ:( ?ߤzd6E}UyCNXl[[{K'IlbpUg 1X8l6 -Ng1"N+Huʕǘks࿌<0ו8?׍gSWXiO'S N9c?:p7}% -6s'7DOm bE īZ`oiq* ; Pf?yC%^wsɛͅ#'h<\kLcr :Xm'S)v(Z T9}kٍVEƺ4e'F8FR.tˊ5%Khtik1F%i]\1WP8(ۙ[FxgMV9T~=a+4T7"K!^Vk]>厇O1L|'?G>}-tqJ">~µ5(nu=,~7GQ7 -;b1S8 -ߒ[ȠZxx]u/0/bXg/+V w)4-A50 KeS^ir ħFWcYI5?Gb_b*[fwÀY ^dʶCU50iH D4Ye._rLQr>ɍZmtG _ico:9}ƃ2 SL* {05 Yx}t:.CSgGX.[mGn#--:,{}}63Sy5%GWC}LNonHߴJ|bY0P rxsU UdnnGea|y_"׎>dҾqcxUrв- u2AtoT4*~:r ':_x@X˶Kw`(6&x㇫g8y}ȵno?Ɉ^FU2@QoJD#1L5 P ynhU9j MƮ-Ia*Cw -wi:. cLW .z1/^υk1:c%'-8M pF[ns󁦃df/f@u|[x A7R4_FyJ>{jp(6`nS;p. *7d W)eCc{k7fz6׍J%ZWXB+>[ e^jmfyM_+HkG^*avpP: _AV`+x,V>jyL,D>h4LԖ8'mD{.*_ƭkz/! myU/6&*1c0v1Bϡ4ֲ23 (ne6ogskZ*I:| -d&f K3" :Ȅpmg0iѸĥv.obk[yL@؋N_ uĩnYw>4éPgG. -aG -udcX@ -)^-G5[n$uڵ@w`l]oL\ڌ.}G R~!UaZ_fBϔsK@|+f`wc;F?ظϘǒ z*n ӵ74c2|+gA~\3& ^vlߕ^PC8T/ ->yƼ_oL1O>)~4ŚGœ;0f +_rVi0U9ʊvO eT2;pֶfr xk,eB}(:H G8V -I&o ,:;GHmp1kKcLaW' XܠmSBsl9:؄Wf`RJç\ 1[sʮ\2ޡ=x$" OS08ĩKН?m@ZC j3^sO|D~i\<50m}F{g# LޏFCNǜԌUCN6X"i!Y\F4|%{7d?Н5/:ǐͼfb/>lu+W[gk'7D^c4{r^H 'BД -˺GX_\_3y}gŽ^;}# QPۼeT{/&gVGƳsvAr]?X<ܵLQe"F=>ˏ_ -b@ -2jބN2biGdM45 a0}n -?l1P(3o:JPJl(go?*ϻMO _i4 l{.]$S=#ۯ.}uܼw3ZSUDp -[1=QĠߔSc̾fˮ\<\O wNLʞ -D{.X;w֜)1cR\?,h(zYSk,W |-B"wvkͿ.iCaE05Ϳ![ʃXXnVǖ8)-3ȄnKEkgp[P+,TGǷ>9:#zhiZzfR{!3taR clLES')[ЀлIDi`w`G P):#P[Df#q?0`oNW> -?]%~蟜JJr&G>U׭R@nP(PErG7b'zki3aWgX/V͝w%qϚ6eȞjQ?œ?M)SOb'~Ӕ:) c K|gP~37 cgUa8,@n0J1:eg ;:/.> -%B_˟e+292{H<>cޔJLH4J$ֆk<-ZJp%+ɎԂ\(j<:ܺn$vm='DJυtbnP0;u `ci'kcWP_Po9d5xK[Nb3~ (.P O2yOKV*W$&ˇ~u_ 1 פF᫤t>13Xq~ *s؋}U,VLM3oegVb -!(un(X`Uʭͽh!JP#43 -. ~ T:n&|ٻ#JOJT6q_9*S+pr,kmAU^:TnRTq6gKM  -YrZf*:dqsg>'Q ;ëRт̭3lbXUǃXҺ%A;N+g_9AV\gTTKќ6)va~m%%:Y 533P_"aEx)ɒW.D<p$ji._J^̘Fܤ>zN j𑜔08ȿ x|+>`U \h'Ko0c\]E)ߌ:OwLԦPAʘS9:>pƥx RBޑnj}"W~W}UO2 -vՋ~l XlOk03Vbb_ ?'TU2ʽ*öGz1ß337i~DBs?}S\N|k1HMo.zBBi<֛сl m6g;ZudX&4k|s8!}~rg3fõe5:ܦ7ii5⓭h\@IM>3$c-Vj|ʍ+/h^!!ZY5߬Lmcњ8/;7d9%Eh(5`F3mc?L0UZӎe奲֌L<>CIPͲw:蠳u& .fo69WR}̪rd25LyJ[ԛMs7uzzS"ھXIr}bsN 6\uvV.\ 5ߠSٷUa3?\i;{Do/BgH5H#rpD4֚d]Vk$4,r5+ࢮZeRW -X˼K3Dg@࿡(q$+IMqM{_Η*]n~?M~g+*t~STblfzL3S-o`#6>cZ׸QidM Y-s|m/Z4r&NT_Wiۈ49L"3Be.63o^nVubd~NuF{u9tM7颫Y" 1Jc. m9RTu1ŵn6ʆdft m-6˜?ηXu3ZT+7'H>i 򝼋qfa(-:M3[ %ZP1:>l?kYIWPɳ\ɑ -z3i[BJC,y!h)P"R~W+v {ȁh¼>ć@.HW%g&X~yZvls,l2ܥW\@;nƜN=k3o8J_:F wJ/iZDexw-cA,ۚ2lN.-h7K)M<,.MF'm'iQ -V~?DO&CTl&^:ҟ Ncy33oTЊdQ'T#Oֲ|1'v>\"O;qh{l6}D/i\!γ&2sYCo  >w#wB矀dd}uņԅ)Oʽ`._ʇT6=x~gmZ-%f(5lsnOhC7N=.fDf$K_NbyLɨ^zdvsHMC!(W)r|;iʣ&o0xIƬG"1qa4gKNt<#qH%W`F؊f ?%;>0-c`6^i]P򽬳e& #_OxCco_q`9#3rU^a Mm]aO(JaƝ(zg@d*ǀH{rJ5rVRbaN7Pt.,QQs.\@_#S5]?R-n6_xk<Է7~ Ϟ)uܳk$1Ѵu4EZH+|[N5T^]"&|1S"}p"1ĻfX`ey7"Hΐ֒n5A~ݺV¡xx1}(iFX $NkNkG<<8bjӹqRkqxCf\>X?cPܜr69X6Mۋ[a j0/Xt>MZ[oD&otXk5 -MB߁y\iEWx![ZW,*aHx#CZnW ;JUt'G8#)Cg*W:sq B'r| gݖV=nZCCɀpz/-@ l?+иs_2x掍Zd C L\x'#]Oy|4S)]{BkE$ꌾ/3߅W]x\n?",%e ڂ-A4vƳuϮBcߞ?Lu_R!y5EqrRM> 5k?0"t8=zM>%&<޳dSҸ1^Ls 1`T{ -RIUۃ;.ĮBcϷDf T%kS^q>E~܃Z£ePu*(oKժXsV d MECGXNC^] L "9fc'Ȓ\n;8̓+f=.n}~?ODїƬ`|g3J+,pX-(fCaL x [oT\%j/3$1ۼ);İEJARrڻC6i$ [K+6fJ5 P=& #J{Jh ->Z&EX͞B: kOiJAi eQ<H!I<.m|Y -|o%dȽe[Z]`0/0R 8sg#x_n R'w2#?D&/ukeo̼D'^+j_ R 3ePݫL^n)|'WF+H_=[ÝRNo9 ,ɐO*[NgqWa8U60OnFtt|ZX#=P {W+Y1g? R 4}ez-AFw;fX6ytu-dpY=BJe"^s |/h#]\tZRGnC-z@:@b:M=_@ uh_]~4pl0ֻŵT(0~c V_ a¥_ NWoTPrPӵ4 cz[tkGƽ W+! S*I4M<'ԅ|:v#<,Ѐ]8 ڌ2s˹ E7"v=3h3Z5 f5-WKob1/{eu+&NN`}sy/J|tte6o&NnsΥtL@q6C彼#+#k]w~[.W|ZenFz*eӬ3?dEm?k[H##{{:۪e3'hiiUnLaDeѕ{ iuzS -006\+U -/7ݎNBcV/}&Sh}eoi]zAwY);SxW^"M؇G4ä-e7pR;<:I-\BVs/\M^D]wj:fGbM~~/`VfW+!K+F@ph_x+MikEdjӛj23}{ 1;@Z.kTp6o.#L/QgD:.=Ii-\{*6 "Nr$*cq)f{* -ƳQ"s/Tp GE `Ջ hI̓}%m5Y1,ш)7naU@lELlt\>GzίvQ2^p?c?Aw}ѧ -ts=u!AŬp@L}5a@[H;h)\n/ZjnM$"zCV NNs_~P=v/JcGTzOB}Ρ|8:zԦ\Qcƶ;Nu(4ru jNʭR7~cD[ MjHkvΪ rft:l|} O,qW[\®ks qicV6t 9GI˙m4p-]/ -k9{Ғ'm11z5W1o58V dÆJ] pו~ ~QJMovg)a+IA[_&,%!? ӄGlkBK~5h#.GL<^"ϡ?n<'׆*>PrE?>vK*L*=}~wQ&Y3PѶ?0}vb52KTN'17\b\F.ң="X_Æ;<`{!޶he *Ҙ"R֏.W+oZÚKGe›\0f&}Q>>g: طJRN@N@V@loCVXn0.0r/NMc‹ \:*+{yʱ2na y yH?, Zmz%ҽvyANb^R\1oL av 'Rgj\t"SUO%TD*Og%%0E4 ˁ4Bhwtl- n;R+wDzGu?h+DNM0 $oOtgUAr9.d۠ILd :Ϲ/?S525{xo|.bg\ZDdYOTۥj%kۙmcY累e[z%ý5{JOK-$׃"ҀQg 1!z8ۆ[Mx.=.d]JE*>ս3M)-u=N}bQ_d[qd2@yf<Ym:. "GY n'Wj4λ7{Y|Y!ypJ%Lj/Q߾ҩ^=#|M5TgY4,9sFK6&v(u4³d1%oEHP~cb84 |Fǥz.Nw1õr|aNlǴG[?'`4{=?ìmʙ@Cl1\ -}\lz@84>q+&~1COi*~˾!'7xHpQ dz&v=Ղp^wi73ݒȒWYZ< nQA*eb\]ˬ\~4iQ&LzL6RxFKgxf[{`xi'cXsiS5S |.\rSDLg%G6xu** k3\!_v?py$7nF\=ʪ~O/"b1 4uS=¯mBKժ/GV/wjΓW}S&Ll ;ݿ5Ss~ڠfr0! zQ"9U:_r1,)9||b =ozQuWG" Ϭ*ѣyo)iCm#{}h^|՛@[pfǬSzc(R4:|t(9Kxez5:nR:Ѝ\fmH|_SxWFJ`t+aOGVej[^$Ӄǿ.wjV|wZXк|K3o>M\{ZH{co"v*}b.SqÀɭ_}%FxnqW)1=gHFs+;#@ `[;os*& #\ő`9-<ڦNG n рTՀ*ң7ej-Xg4[\a-3zkMt#KxSWR|7yO[tSC_&> y{̹rj\OYH޼N3K= ԽϤ@}8JЫw՝:x&\Tө.[' /AGwj_[W%K_]9Mlì(4e:}^hCUsc× Gi{/ߜ>mzwJϯn>Ȟ\c2rI͗maNO}xi:߼7:@=\*c4 X74#u=d䶒eך'J6:UCr\V3j6؆=XYD1d82ke;_ɿ(IW1j/GywVf70 _@$0] KDcvAsX}w9!Q-xQhքͺW(3ϬG# -T@& ieP>M(}J#v<"7yXE>r&ZÀ2[Hz-ڹbuF$+զ&Y2?ZW|࿠^ 7vfj s02~h]/"iWx;Wx34md?OU(>- -^g,lq?( K+HOwre|ДEw_1_I|WvXї\矎 H}<ᯈ76 LC7f9t~3Yl4Lg4XUMc3'uBwjO?=RTKٖE_q4:iv8jJ<'QI gك1KyTP+|g]'C Os˾DؔȦmO\ A<:-8'G4ETh<5V36th_J~>п E w(md.j/G̟zK>zl8UȦar^B>!6rFZ{X*o^mJTNh'JP]xFЉ1fz;K42#|[>e פߙ)Χ /;Ưu r.@5mkJ\x_[&p74guu_isc})C15C1% pֶ&27 -**G$|ei%E<ߒxTU^GҜ茵yf ~;Qpk/wcXӃտfzreyZ Bc)#> 5[kAQ^%hʸ|ƱU0©Xi_a?*(ZS5}R6o~Yo`M[h/qGMgR>1SA) J IQn2L#:~Ǒo8Wh5q\9t/=}2ΫAk3,aK>m+M^|V/}pܔ)M*Y,Pxn9f|}bI ZPaʺM>n'z{L_Ai!;Bdio3af].Gi~?lO ӣ[L(f2-mX}KbҠfgxsubm 28360W} kcB.^j{>eݳyބU(M { gw"Wj!tT=`Z-} |GqJ9ޔP!W ,U\(:C:q~Eg.n)׀j`C[lZze9SfG~jM-LTĦn6xmhh5^" :)e:ǝ-x""֋:WAWT ăHZJby8A){]c=i+ow:TП8⃴/u+Fjb};A_ =va­s3VH?ٵFo262L ѝfE n&;y}cr&㢱6 ܗ1^8#"*Ӭ˘0}~J1reIr[h.2Yև?ph5FK2^Bio-jh*Qp yЏ!H+3+Ʈ6דr:>Ep ]9BԌ\ Y3-cHA=g n .7kquk*jz?N]uo9|sW2οr?Nr`{}6[D K55 )ޚͰ:3م"ʡ¥p<|50>/nUI}j-Cw%KWf.(Xء_df'bW]TU?o3jG64O,qLA р+#&8M|Cꏟ*NeZf7}Js8ι]pwO%V?:HcR,8o c*:q5Qg4o -JWwh -<* 15^X/EK1sX4I@KVFxk cObdɎ[: kTvRMZD1ϑbζ?lXek)F]8.O3(%Q@>3Pt9#+ (iY_e9Yͯwgw.šKc]X2gF8 k/7/Gm*'劬ܚ.|;73|Zg^̇ խw1CAhv*XC?>yОs{&-2Vm|!>K `5ޠU5խUxi@ ]DLʼ;֧yo޷}^u+~Q5Dt2E_N}W\L e(wyEͥ1~[%^CCA-^ -%S f\yLeF^Yҽ']b֧+NoXS$}e>3eig5MdXAdӢBA%*'ǀyL(e(5uw%ѹL31:%+*`Ch9{ k1]Y D >\M|eG?fM~rSmƞL&<"-iaJ -[vYy}bw8K?j{.tX}kYg0"Ir Vha,/tQ]'OΉaE1\ C+W)mRmxzM:rf oӋ&Ѳ+BrC}LMKi<:B_:5p)T|93_7'3|!Goa>߲Qޝj<4j4˷{X?iَ;=ehOA/9"q*N|js-!dozpl U?xMarVttij+^W+UXz|rۗ7!7@hGw)^Ọk/ ]B\Ž@-ק1УVڌJ?'7̃.lTj2+"obc O Xw0 c{y #o5,>Y*lڳ{TE 1W׍ɗQZl vr3|o?sHV룄 -mui݌2hgLnzq>^/yvQY=t< S\h< gJ}#P0>,)OI~i0)s%]yv-x [_^DN|׆%d3o7aa6xsM1sYOz(\+O?tҢ5b>B˽ -.'ߟϜ2µ -[JZ'~y{V0\? -b3εWW]C.> |1 +j-_"w{!>?::F}/VwnNm=_/Oڢe>q}c#Qe.԰Px%4RUiͮl(EgUs}Go,bO"hW~)b8]lV2Uk+pJ*|&X [O5 /=dU-dKl+S,`jEH??5Mr!W )nY02wgfVh*OMp(~.Ԡ*uaFu%qU=\m-N(AfaSSiL6iNdmNU>ؘ-~ -G$!!Ǭ,X<ֶbVsӒh\|_SIs4v.}b]=@޿Jz2>Bǣ>Nq=SZObDNm_,yoq>55acMX|O#Dd=W\LNcmXc,yp33h2ԟ*evF52(~7'?3祇؛Bm9~XoKį [J{Nu+28k- -J]ZEioD \]Til.m6@7p'-#9hH^ u7rp9Q!wjHzbt3*Xy_Aya5HQW u#V/k Ίۯ =|8&˛ s׹-k`'hNZB;#a"h.=iZЕqE\.'vfdh{{oMe3Z^ɠkFeiE I8WV0)/t0.eW]%X AվQzNzǶ5 -Фp܌E۶7.Z*`ҙ"Tc{Bm -;CzvīTEy?Tɞ\Ki8_lW>qOFNd-zUTx{K`\ߎ&@ަ7Y=5S(vMǻt+Q -Ve]/M(pL®[&o8dabGHz%enTI^:ҙ,4#$={nm^2H=Si,gN+0ʴc&JV E[(ė/UHԪP~ Ew9tFM$H_jk>@~ $5ױƈvNE񶿱}bMunfVv]O~ECFq=pX<(xe ?3:rxNoUxc=Ϛ˦u?n?gc\1(yă53W?߆':(.z.k:^b&y=Rhu':-"5Wv>NwqN)R2|iIZiH12Ӧg ASqQySw!}(B5wiP鋊R F3Q}Q~-87<4<i::?yǘAJ8g94Y^KsC1H֢t/e0 ȗ*:nZg;b|)Q/2߸f=5zGճiԸ.]s[z1[k0O_u p1%b#8!ksXaեw L= .pSC.A\hrMCN2z[Qb[*j}):b';nұ*+y_AxeCD$HYƗc ;J@ne'̑_~)y-f<~%;o2HNi}xo+ Ny_5| -d[7=~*6xpŠDށO%Zg|4 -;v Gq- 'jJUq0-Ӕ,L_7izFrs]^_-ǧ"}~TNr%RWOֵ[('yZSݔk:1ʁ?U@_J] P;˔fк] (p2/P[X/X/&@" A 71ZYl'Fʊ0Ak1N޼5p_#G{M/XFMIGThu8jiѓL4qP?LC{JOiKb\5im{~'G;vW[gg>cQ.X9*UL[{DxS5G!_zxλgU㸀Nirn^2-)QtM= <[żJfj~j;{qh[wG℮M>hK&hU% bWm^ "Ro+=3MB$^N&(Dk7Rt_DߊYgXKa촦o) 3P? #tہ¹˯ /c>)iې|jA͟aчL͸3^'Dwgy݄aG[ޑiwYxObOQe4Lѳ@TfN uIwB'YYSt;gYMeGJxCZhE}K)Rq,+ؕ@ ,; -$L\ M~^Y{ƀr[ pr9+k^dͺTaj?}bQ5vY_@5zvk> -^R~vR)8jA+9 ?ȏ'H0:䍪msXUw!{"GImtq h+ں*Lw=e姝rJkx:Kx1[BY8@x/0S@s%)IrqʋD@;gr - ˭I"ffZ3љrTh.V-ܽ]bu);rwJ:2I_D(&S"n j$G?;ϭW` rNt2^,16fe2l]ng 4G]aŦ[\2[Զ1 m>!8$X#fAvм&T~zUE!m6ԯ{5vWHص"wjUao|~B6c0FLfH6xi’.N$1^ x+7t3#۳3'$<襓}x&آT -k5h(?L)s>T+88Ŵ0VN ֳf:ZGH+k@# vCVIa//"GVJT&>k ,ϗ\iؐ35&"1Kfu\eAX/h֊YVxo+`/NRwEҙ]EeDKE| Z;> VejK1( oϰs- -;gj%_8>/mP֐CWoYa]w%ǣzbi$JzXc`rzi|6깕#Wt@[\+Cl]gmO1=Ow Sx QB'l*rؿGx5\Vwp]uW7R^(%3މ叚'3đ`h,3(s=zǽoQ zC. YV{Ú5v. aݐa5QֳjQgZ/>trj!Bئ5o;噖y{iJ_}cA| /XỴ -*h%c JXoǫɃ(pM;C;"Hjdج6,$ Lk`hSS V Wxۺs ?)Tt{AޒwfUr@YTo3gp&>MOą694ca Z":]9M\⚗_Ycᄕ̿8AY_u;/UJ2b_8۵3/΋^iEǂ@z`S ?[at=_ 7j~R#Qn -=E-&ڣO/CܔCj~el(mH6-FU<(wZ*|s@zm݂ zu8{x= N*QIb(;}/)n19p+&;KU9C4GSIV1ˬ!. }ߑ?\Qizuwk}͝1\+cR[KEƪK; iIE# 49p:pog5PM#YΙӮeUָT4YH0`?YMMdyL*ss@nNޤՃxs~73/8S5;D=<@XiLSuXh rh:0(23BMʏc[ƝmQ0saZyFWԃr%#u}Lٻ Q2=>ڏ_ؾ- u.7֚?@0=]q~L(^A'tg6}9L7rEPJ~3prc-@MP)ԖZףs|XC8yZ& !Uܽa6+n4)ؚxER QWb\EAm.sȜS07^,MW._q2= 4WSH 47eFpof)=eq:ڂ;{d6%Mn^ ^QHiZ:0gU:P၄2=Ҭ1Wmp5*1 V6a}="(JTGc$/t }%Çĸޔ%^}\ه6CFDK/P<|݋doUk~~gA4e15FDm*)jO'9܍SB4jLF~޷(Po& ߁NE|壕 pYzfhEU Ӂèo½B[ XZU9:d& ->qKrrL%QE;TŏE+?y7b*t7Ǩ*E -U9gSwڸ-Vu 9I!#ws8JB~>n!L_M_|"v>>u,xj;h|Mv}EcӓB~({{)87: ܖ2 , aڼ!;? {'0,9 ;KQWNqiBw伞]Dؗieb{g0N"WNwܴqp=8S9 dqvG_y:<[3^?OͰV0R7 -LB腍 @߼Pi2jMNm^XJrԋjzq_(|Z$߇7_'A{`J`9DEP -8laep5Ar_ LOZ9龝Ezѣ>U\GF_U#ޢ9wJ.ֻ;5P۱_LK:)}IUh,%\bIe-4;k5NW$=\~*¢yÔ^:H=3NK;oy]O %Fwze|c w9Q-CZvbEgo1=z}f{߈7Ksu0 U0_ -x!܉g*QT,xfQswyjr~/['Y!**2Jch)QMx=0]>U ][5o{(n!oNj,?`lEM3c& 6y97SPPlP|?hzk->pBK}&|͘b"# -(S,ŁO xz@(Â*&<=[vTtص+ <^h;K,q'28=xdOo,4 b, L}n - J؅:} gt&Jϔoߗ5;n#)zMt{%0/j W>P{cP F3g Ht_Ёnҵ8}j`֐/fң9D ia8>iy~mRP&2;tQ):l ؁@1 <;"*zKG2:~ oɚv';wVWl09~s.ӠwAwv=;C.d'5gMb1f(ݙ`^'aCL ȭ5'fz%TmKc(>m >QC͠1΃o -e1X͕ :u2+nhVy)}ßO?> yz'્MD&Kzr;LVJ¡C^u{\Z=M}QAsviOY׈_9q:*VN rK D3Ogη4g>(7bWC1oN~S^_6B=a]}͗̊%T^uKh[ -ׯƻd_Hׅ&`E@*qZ.C{I -~:y4Z9T Swf]2e4}sH\i+F*ԟ9wrc)Xa7.%̍U5?HX{ף#b-~։w/E~qY 荁aOm:u0QFjزCv'x3 " зYQ$ ̀NirMu\dPbLF@Cc= 2-*:07K*ϱ&};EQ `k97R-~+87Nc1/{*aQȄצퟡ/ j-NLBq(!{˿k?C7z[_F!YGnJENKGnZ9 %dc[P[ԇfinφ&*^G+nK;q8iugk1ŮD[tn_![Puo?9aۃB}BdeIyւ_ -HLJ`1\C -b%3yXr80a -hYjWiQk q4]u.pb:, -"x_>>NO[E,#7ԛ2^\^טʭ+|=Brgiީ's~GS/.Uz?C>c'! eJSGu(k?5LKyK0ٙWH~sb/V}> =Β^(b yMjLٯh%3X0MҀ ?1+. :v]QiJ'@˶tmǵG'ˮ㽞@2u0WioYQZ]nwIb6t~DΑ9!5 Fakcp˹"bY!^d%`]:kzūWA/g˔7{.ع4#RZKijoO f6/iZk]o|gL61mx^ؐi**n [<:5XV4'"bQ> 9UUf:+p*DzUM#Fc|sK]xiME%~o eW7_".c : 7Jf5IbޣY~c{lWHo҃x -;*@"CS]0SMʷkѫT ̗>MΥMF -@VL[V2kSp4!&<6"-4*_H#T9P-*kQ0:Ӆcid;;+Dv:/^c6(-=0JMe2w)oբ0J,P~aã̳ox+L8_F5}Tso x6 9](5]D,x EE>?T}4S]׬r^%w75 _yգ8:oƷ3/K?rPo+L%aȉm!gB6@ ξ1BhߐF =DBm|V:hLd2sָ_N+s([IKs-.ȅJx^wNR7 -S/.wwwk,W4>ǫ}Ƞ5o2-_re7KkN1!diɓ/K=P=Uh#Jm}ZieRi+@GB&-eEK f_ c_#ZԵEXhlĕ]\/ǼYT2ϴv; n6)?bT^+Jnђf rKɮ5eK+2E}&xx iJAVrR`$Ý m&>5tӴpƭ޾7uUV;>ea k|N¹73*tD݆]IלkskAf| -AmRӧqmҗJFy;nC8m=KYTzEoTb!+qU݇w1u՝aή -zN%TT5;`zt^^UbQ,JIK:hyZ*j5u}YS(6㫏b&M؛{C`Awb=?8]ֈO<עW:~%b۲~H &yt(R|PX_0âK]ߨ! xO0GyG^zĩ{ٙs܋M(ۅ0s˛_)+rtJ!>Ww1,L-ѽ"wˠ]7@bT(b[ J{vdlk>P掯.F5G7|GE 5LC{Ma5m~ן (KڥΗ/=tgS.oϠ:xf#3l.I]4Oe6,oMWcJ7Dta=/OX,N;W's:z 2'۬W@k?4ang.fEҒJy1՗7aPx1w Ҟk'ΆkYJ@K}FV -mkA:7EovcWwr4923娚˻ }}_| ԛȖ'ge ھ>)ue}!u?a^%d\q4(_[MKreobb-}hOsܴTnLyLGp=jߤ$< -ўsՃcw1"(li.\8~Cz*{SuX</̺čbK@n W#!eZ*K .Síu:%G'O):kWO*n\wb,g=*R -[.פe̱u6(ۅZ19.]`chw{JJdt7ɉ׆[z>TpNe6tmRJز?rŌ_d3O?h9פľĥ 0%a@4 40Oj~d+57vT3 Yn&qFP~#6􉦁+3kL=ʞr_? Ր/LE0V4;Ak;?0pEBzNlG]a_)H+ͣjezמkׯ::ә?z6!Tso>Qy1j> ~[Y9LYd UV#B%-Iz[s_|9`v\V5`ӂX.%\oˏNC l^ѹӪa}-!)^CKap\H:FE.]' -x_?s) -6 gyjn-u*P}T:eY6صqn#.5w"3㑟@|)B3H5ODi3::APŢ \+DMڜ_SaoɁ,M|qe^ b%/7(f2X7˔pIL%Q-=F|c"!pˬB0teo^DT{U|{83LL%@׭I]Y=_b=e5.u1)nkHG Ft={NK| tYP-ϕlֵ7OtuHc{`q)*Mpht -L̟E }# 9`Cp.uMG |  p|7W)j* +7h&U<S)^גys3\0#/ +_Fia+Ql#1+,cb͌T￘<cvr@ Um`4Ogr>z" v05k<gW O6NU{ L/#fW0X)p9CELv3~R<5cdb[u5x -^z# + \71ؙO֓'Rsg'拺:Jb G-^!P]O+׆V+ʊ=4Xguk3Uc3p +$X{G7K*߳2}xR,JwPLHCWN [^CCL!%] ?4qiV#1v`6/!_2JҴқwv3ܫ߬epۉ-xokt1Ⱥ.EP7<3W wZ𜼰WkqtYtn=?X Ss5}W-z L/[\Eji?Kūq8'5(fYU#6շck0;ڏq+բ iz 5B 5*:H<`tc=5rd,ANjiqmy)2I[ϊխ9i?E -H4J)ү?%{Ue` a ,ZeɥQa.s\OR*r8,T#6S#:\ nr?3݂ ^ОrWY-|Fn t]+5l7 7\!z_I\3xПr|FcPAMtFybYu^~QĄ!i -7](L굢$6TuG>^49cpa?*HyE " %mvjBP쟉 k@hMHg˲ y:s0귡 eXK 2E3 COPpP  d:pNOyi/څ]l{B2va XI8l?EA(}1Ex߃(kiM$Ur+Moie|m҅Ռ Nk /uQ4h3!.GFsgܓ)?Ӈ) &X@!}aY*HS7>+G-#Jz٭"EϢcn*;1'OA_I]+#GR, *Ur{= >y-uœ x4c%o`ZD~ -8K9ᬬ41ǦO%]3 ~2ͼ\FUUÞ ~P:%XZ - Hk05=]X]]ß@=%K'* ҪwNUbjFY ]'U#}Kl?ddx1ޑpvC$Ifº9uj|EEL:P{& 1jw&j4ӆGU_wjVDh7XR.]f7!WGh~󒞑[) -ks`e?j"b:/fYC5TY_[s2u`v/loOy G 8q?G3@A&D5ueׁ]._igns8^6CZJ odmVf|e(~eQMjAZ'Y:p\ue/2 726Qi=7 vOT]+P-f0~W>d-Lf ToF -!^X0lؖ -$bJ:,&ic2*T耉y`Zn'KƭDɈ JS)x`&a[i"@OR9H[}Q/'[)-DF;bAˊ&fekf|9B5Q%kwk9>I"D<rur;'Y~odꟽWJjÔśMiנVWff.!ms1ʦH51YleS' zjF׆Knlk{4%{$Cq9_osscoRlF;awi L7G=au8*)ijbtHM ?|m(]/A]0bPO]=gױhٯq؂.ق7*\jw-zkP:_HX4 T,m곥;N @ -PN;.UXԘCFqޒ:FX`ii-!uބvJp:Ժ@;{}Wdttu%6q)kZTcC{ֿ@*Q*?.{ fGU|>a -2 -OXި>SpNqh|SLvæP%ـ#> L2\J!cL:v>e2/lgDpaRit9AvչE>_* vJ%u04?Gg?#9w '?dt>AlSSϙDxP w\WޱWCfT| Hw0 -K`No]e+7+% |t 4I;d;N &cIi[}aL&GH*QWcNGebZBv^eT=ƠV;O,#^!XR=V%>ptjn?JZh~0c5=ß[7|u5;"3JU6!C~@Lxi0B4rl^nk2{Bl´B -=13|$zfjoe';?};/V{9> "chzɣ@ U8'T3̣>\_~ -,_YA[!?n-_fC):@F)&& 8 9F},gzwL>i>Sğ -Xo YvN8+ȏ?x߅*3"kN%5=w /_\s=1i((0bˮ257O{cUZۻoKw>#T$`uE[l X<)֤N5K8*QjW7/EVZl;Mj9a$ʕkiXSnPwxVsv` ΃)$!_@RZ-R㹵Q_Cd*ҥFTxO6-%Xti.*U1JKxZ89$?NMPʶBT1h=42d)kKmTHQ̥㆚x((zD_\j]q3rc۝aV_{!th8TN\d,/ѫ살kF_ї=@/4\cI"-GAƬQ&7"OZc"wC{CōKunr cHb VyJg_؅gsOY#|WQhO~"z{iB:)-B%A9Q[!hmL<N'DT6KV' ?T kʩc;q0Lh6G،".*co9\Ӟ$Gwn=:̷9֝hi,]'(?k )W sb|3NrW?iR-HlAҀ "fx%ay_": CW,fviw4.<=%7\ڒH<Tԓ8EռGct0XeD~OIU[Cä>UecyVEk.)ڥWF -p4ή:Bu͘8f,v8_hA-~u#55FMO" BRR^Pyկ@KzF(?(ڱ*xtH]&V;pjke< -qma*dPx Xjn*,g,` J'WP0ve~fu\ "M - 3ucN{ c搇ȯ_>I%aIel鼷#_"v޲̾:rSՊ(ޘ%/i/8\jB5`W< F34ᷝCrAa3e暲WXhLeO!ЛSGStRs#3x̧ː>9\;&ś''4J믠OTOR =x>A-lMC)~ gw#h(h ,P1AtN7eCbc!HSQyHAR͆ۈgSo@Ե>fmԙv3z"ׯBUZ3*wF+hŽȱ/uԊ RgQ_06fEosNYv6J[]s.\Kr¸>mئV탼i0>xm+|^'Yi(1 PŊ&P -^uylu*"UxJh#߰A ZyG㇝tUgWu?vW$Sd@M)EupM(H} Oᔝ>I]4*i7T13cFegֵ²dnd"~+˾&W%ʙI|^SُDevoߕE/9Oī%H=(BO$/BT+v5)[͘ALQCct -!MѨbrK5~CkI@r/fx|/>cB^U:TnoI>_K0L{GYq.iN$.3s8@ :T}=Qf˷ -8`۱7!g-+ gpjg?$>Z5n[a0Sܝ_yDa8^6-Y덐K!}S3)*PaFsro -*bJ]AlF&iHc%ںi. [dO s??#HَpJ 2'cl_n5lFjz&z!n ]6QuC]Ό!y_x1 T'V#38l?-wY 1q*XuNO9%06ӤD~eP;oXNM]_6Vz[ 4r.8\Z_(ĪBP.lA/@`(ݯ -rhPy?Z\w"ޜ<0GIoӨt}ca9'O4ʯ5|+ HtG :*ϦWZzue]nZl9}FN_\X=("F/~7rV#%7On4Ú5Cu;M 5 ";?x/'&I_foe[3\+C˿}>YA\KsN ~bɞf,8so?{|WsxCsLMoq f?tpU@I~4'9^~WP(NfB\ ЅviU*O3#VqP zN]bNꝸ%ROI&vUjݜx63c-iL*jd3iƨnt> ~$/-sJ>Q ȝ/p4UưD߆u9 {=p5eLb.8֦֞iY̭enƇWtؗ5lpa~Y_A,Ц!g#2g(]>g30c C.8P@ӆ۶5#Pgk(\ز_XbƸk"cXe-n}{H,ruPZB^߄۳r↌e*7lOi~a::|r=)J^Ptk5*SSD􇊺-I'5 Fq@KuVm[M;oiJ#9Y=,dkw-e{%J͸g\wM hrJ?b;lSM ajQzX/t당F~1.bK{!m5;ylM>->z$ p N?N->߬dtK X 5ۂɅ%n-x8a~O?0YˆMv՘08G2?m右hKHim0zjSRXA*HrSSr7]cr/+~!ڑ/@x]yȡZ =j4֨=.hkK^q(oXYYT!wꐘAuQMxǴ{ؚߏE TjdvcV\KzVݩ{;U, ^Z-n_(}:ļ;TDH:SE9=7Wla-jr[j/ikޢ#IÚO_ٜ,aLb/,BSq2/JQ5;[&S9o=Z8C>k7h~>D -iu6|XDɯF > Y]fqp'SZMriNen]]ŚggGY+*t`By4eZw"R/Y&] jkIfw}!\'w ^D<ԉsk>~?4!S> ןaL^:mFqj -+h:b~@ Ƈ xwU`b"L*NB 5.p‡mܟ\q: li25UA4WAhxklVrE,}Ӱ,8%HuĿr:W9y`.VCbΫjMd.Uﶷ\7Bݣ"?9{ -~ؚv*,˃lS4!5.o~ev攓W\xA.+%* uAa:gڙaOb.}v L3o|ZvӍv!Ly\4uˁ,,k]4yLcy9 \Lgڛ S_:% F*' oY!l,v`z]3Dޖ]Y\.vt;wLe/l-wxþMYeu vo2l}c\ \j#~p>N 7K-ZbV8\ PK?i}߳H):o -ez>fSgU1Ү79(z_aT|nj)RYUx;X5Z{NHWT::WWvx碏@m>Z6D%bKNV2sص`zp'u,-c(P-h#3Zu9> ʚ~Uĺ?M}ezP`aN*z ^UB30׀4J\za_?RU5f 5X <nN+wgi-ruxs\m(E> Epf>S#\ <kOgЌvWЂmf! QڬAP&v2p5 +sX 1w]>[B/uUDۢwe>W+. SU{/ƤXAϱǩMewT\``IV_4]X{&#\RBn= wNw[Y KP\TٛΆem[ ы~˻}e/G @׿L!Ǔ\o|c3' ζu! -Uއ0bdUu{o;~hm.65I. cd t\<{ҽ6W/)WU(f;S3_wq5fCd0k}a J;K\2T+u_Ji=.n<Ӈ2p{l -xl_xnB/C0z+O3ω|6_:s<4|⺗pANZ4;sP &D4=9Oy&kM3@v1Ě*"kPKgG$-pJF4kD4J-?v:eMTukMZ&X@ƢڞǑȈ,?_/o6IӦA10Bò|V&IG=7X8$sQ%s*C )< _,J)-~c -&=U~5Xٷg5$ - -:Qu ?fDF%h;:?x[b7P9yv4b=` za5c2{?q?A[/u\o9rs׈j W6K?w89jW’C_1ˬQ=|^_oCۯsͤu '* a5u8 -"˪GS uNqcPjW<T~i?Yyo؄5{ݘf}b̽z .r硖9tXܿUn\k1(tJrIYGu'kngfw;&c҈,YBjU \NÉf3od!7h Xf&U)S9T[G4RAjG[G!Lv -҈|fƯ<ׁa!4!&|p]cB@#UUqt֤^MPx5alH8lSjAMx/%zK1=C+&7ڰ*{qGikZwJaG>FMF.mM y~nPZι?',^ gM,C3#)$spmrB4zgXPOzBq9G^ E =5:g?h{kbzϩLў]eN2l[EzLOS>Ӫ]oLҢ"Ҩ*#k5ʹGe)?TyjT25Q[ Mڝ*8+4Mx s1Ρ˛7 LӮ_LrTDn"y7%zA~cҿ8sۋ YE u< 9bg[jpCm5[l>]dfWéTఏ &v3 -S|-6 SHLy Պz-R9њ?vic`\^ΊWBeџkmroe u)=iYWP5c5T1b+&A* ;}e˗Q,{&o_`MRY*G(Um\)}PB\ >ku'(13!PFU'3wchJ'SS&=Q4. ۏG2ȽxIw3 -.r8l\&vt3E\7 -Mi/IJz,gMXʾRN~eQXAkK9W{<ٽ'tsN?.} -fws⚐钲lM^M4Gc =gva f~ȟ -Ȩ$DA>WvE^SΕ~(ίǃ~/{+xΏ:)_L޲Z֙_33"mcZ)Z=Jțe],a7IzKlyy -wt+h)g!kx?.@{<" K2/0Ol3AjZOeCGj1xu 0rL+ -.'\ƛxԏS> yG[U5TҺq g10eN@6%DN֋m'8r|c:cE8YҷSV'?2Ϸ _ vSB&˞ƣY4 H>p`<de㈙d-N\.yISgs'8+#K/;IURז\) .6hlvjRZ˗"]h-}-)yisȼ^Ҵ-&@ꕫT؀Wcm -^ )Qr 6H5/68uiAx.ELY M[."B(ͧWƹ\3zT{x))C 4rH,W 竩GjeJ,ԉ\y.]ZS-嵇n)eEr*R 9 %V9h,%laV=fZ`^0W]"jDlJ?)X0&/'>,5LZ+?gG#jl\'[e,hµ*v/G74PGd`"SIb5ރ5# jĩĭiϵc͚,f7%{M%{k=5N> ;dž9[qp dQ@EDXyA| -af8bĥ.cv] 9,o-YP{Tuչ@/ca~\u:=&\O&JB1U -8]qSZqk%|k3uv`1`ƢuB_~t~)+-#]9}f<%rD~jۋrC.pj}e3h~'[5:2FBլ8 T ,?ɅϞmo 9dҴrGᚕNU-$t@MK:tOJf^,e,joR)w~t]TotiD3yԤW qώIͦȎ[3p%kȶ?k>d˓*@}J%jnU?ps2=|/p,]~r'T¸bR2i~\tzk'Ino &u)\S O~:p ѵcI._ pcJBhg8ϴ "foQz6 -0eׂ k~mB`+J#-Vi(.8\~Z;YʅEvvYm֐H=uډI ؾj_-4. EvMT bwD7a " O0C "9p(ai{ʩzJ~SCX__EYb\:aFL%'W(:=QpxZ!>r<}{.)dt41`='j{r[ šu2|5֮|HϬSe$GWcn.\F`vP Uvwd?ß~ [Rg~5% &I3bkTS'>BwI\8k1^w$D'p5/%C=H c RXU6ZLJb'7niob\N{-4 8kJEom*HЇ1nW -H"6 *_>(ϟ^+v -4M1f]*F.>^fx܂j9FBZ:)"41y] [|U:__^FӜPxt,7((~-7DRj`mŻ#;e&.iCWHm-*spwqXnqSU/QBX$6aEk 4VFUй5cV\8ޅ̸rmDoζ]ُJI19Ǔ2 -n -ͪQ8ZyU*u( XS}LJa -P[+DEΜ(х=ٲX m頵7}__ .e\n.mӜ hdx 69%+Jã9c.B+db#T~X#.Pʺ<9i -nZpeuT&25at٠"ep=Ex/SrX7vL>BBHu8gcMr~NHMZ0EmM|>!}[^E Noe=jqancWnAΠ%5@)dהG#_(+ʮrJcKb| Iݘ%HZ@xRZѢp"5S)sldZ5&J S;Jem4p{%i &e2o -KULeZ0'9>$]\DׂTu\K*% +J+H*܄s|Rt=Q}fi}u<©qRy+G0@v˝z\rfsD\mQ ZrJ\m -m` #WXٕSMb+dR[ZXf/jBՉ!7$%_5Uh]@|^I^gW;3&IP2oBjF{^]G☇RͪqN6r{|yޒL^ AhCӈU1p5ڑ2@c_̲s$E'-c *Ե:q@ker۹>%kTrUa[L 2|d³5k̷b'*;qɨs4swi+X$\Yg5Fm&݉_G)ߌyt^>j03a\-`1 ͘Uczz^%Zp.lu|'f$"FDl ZEqMpߦ"^MaC|jciXvJj"c*ξ|_)N%UKAl;FO2L0<|W PQteE؉Zw`9ʚU+5%E睜[Y'~rOstZ,W;&U ^.]5`5OOnӗa@D|^y>t$v0uy _ҋx?PKN|ɗɃ{!asa29NM)R~twI@aɀ`P8u:; G/ {:WƳ{=Iޕ:qhoF1}}'pj,3fa:1ηOQeiYWQM`~;MaF^!A[P\*Z(yYI=jnO. yQxiZs }3SEbo_1N.Rֻn2kev!pv~<WN膒 n{QZE -SYNrkJ-Ih ҼDWsS b ~OtBgYo]CYvaڳS?1#Z<{e[JƜLC3vgAoNbz#Ѫrp&e9tZS.2V\z+q3q(9=Q$UM:qnUWÞpYy .[‚diaPD0@l$ )_-SٟϦɥ넙t -rW53] R#*kTm&'a³إ5 -uщFq:̰ܳGC1-]:i٘c*T-hw6jKHzbbis]5-;Bl7kh"K)zVW )~Jp(&i -n ـdY՛fo?g9Oirʑi&9M9;[pBN<PYg*[5t_&Ď\Y\3&*GTݳ%)FmHm[5&}g] veqGېkyO{ -̓Q 3TJM%oz t9nR 8[A9|5n,JYhj}y$ߕ7+z:CC2WS -3d5*e,=A{D}k7XK*ؓ&ޡ\̟>+|C[ηero _t:q`ts OVF --ky);y7!d/=S-ұ+y p3\Ӣӂ s?:9='p/"&62Z8A: 0Ѵʺ]Q-K/~'|~'o,"CF<9KF흘5X5lwxEd7G)uUWOM̜ͻϰ4!)f-t|,l u|1-+R,Qab`ڃKxoUΒNYJ\r fvu <c B ZjCe!9'MQjDΓhSi3MVHWbauJa~T}GhFS@4z7)>Ѯ~\#ʾ Zop&Vړ jXB1]kv=j^W۶DFR0G]*!;I\=_Yi ϖR-iL7 /k CMMGb]*㘾b  \Pa+E63 O$y3rTcW;~Tk3n5+C ,P DG~M֠L(ҍc6jqx -ZΤ=tsi dpAժ~ɤz$ӏu([6!^v-7tJrCRc_5RUjoLCe(GhvbǷVjm*ԮeR7jL3u44@+fNɢn=*:?0jn@oBӁؐWJ!`x n(WX=\Xٗgy: ](JFm>M:sWj\{,d61(h[q9&_$8X_B(8rp\ %<)ù.!hUqoBRi}ujmM"u2 lF}^c]Kd!/rBTиg py L%k{y`q[DCS}%}bї‹}ɜHC(jChPG 2OhM5ޥo%M#֚I{"ZFi9o9"3`Xo `&y_wY+3Gn{.Lht1oo]@:rJT=4]es -bt:;TwF?yl1ꐸCK\h{S]~~geIm~uf8sd_-_0qV/9z@o_ JIp 6A'#g=~&5rVW -Kxe'˻MmހY(-CcEAA ijk*nTۘ'- ԎFq8IX`tZ(fwπum$\:s- z@sY~M'q m̮㹇?u$ RT\pe: YY 9!\Ca j jj)}Ȇ^Vi>Jӆ[*q e|Jkc՜tcxS]yGyBxbSf4R@2jomf6Nfz!PnƲWj*a J*kŏ*[M"i֊ +/y#[doϦ]K(p; mXʵG}%i5mPCcZzƘ Rgs9B2l12ho#qGSo`ZXB`F;^ o冏X 4uH>$EѿnYACt=2^ 5f[仔8bhMO^̜QM?6}=٬us%y@/[x0%K/93HOj XtK@Nu«@NCu( 3xZ%Il6dvԡ)ٹv:& WT}W1ۓUq0A/IqU|ҽZ*x(8w~y׼8 y*~L(lMƮ ~eelDe>cJ|jjd->&MIquӢQ%KR34|7Ǔ9vr ljGϨw^WG)zY˃Ѥ3Tz'30i԰Lp;Ӎ?.LMMZ @| -m| 0O&8Wr \V vPpc*cAtD?}\:8U!8:p+y7]ي:6%<f%ǷGy*{[\\@iy=$fЍc3S-:ܛ8 qv]}Z9BQ0_ ^xoR_Wcg2Py6'0Ӂrcj@dORuVuuEkc,9Xm2T3S /F^7AeQ>c<32ٕ[gew6{#9j< ΋%C8Μ\k%" dgzјz嫆^'QT tDJ `RXQqkΓi1 ˎfߊٓ.zNO.Y*FMeM!+fڊY -]LUtmepqyM&샲i [:ё^ɂAW5DOX \#TICQ/NfKex0`)j*1x YE\2L{'j֣`jr|8;gٕ+)^HVe;X+o8kAЕ^+iPz1O!V+kZפ0Rw*oļCֹ ?6~VZWW-K#ly~c֕ĮU -DOX୓@#f,v}bva_%PkȤڻoµ=f{c0]Zl9P" L|M--ݬT -QODm3J\ -ilœ2ј~*ةO^fw⧟H{$2h'e=#qPi4nk54+]V~}Xq,G -b=f1ƺ0S4wsekӜXU l8tp(Gh5K؊JmNdqm=XM W[JfZ~/.*h@юiv{Q59oe~J+6Gc/yL285Ɯ#m=r-pQ,Xlq -eM}q-):7yOQmXlL 7[jxngjHQDATMqjfzpӃD62u)+q[V A#(}JV&(k_AV\0^$Qs=ƂIl2MXh@|]a,cDŽjg͵- -X郜 7Y`v -}g:_z Bz;oƟ |q+kd -hKQouBw%uԍ3l~^ײ.C4&Qz3|Vg> /\4%ϊOS?ZJfF"Soxj>7ϯVbW™4=]!+3l!G={O?XI0g3#>9zOvߦ.W] uVi8x f|%xtQ1B"% VxƕǛgZ|QUD.Y]~B):+bA-*ZK5"L- ynXeKx*g%Ĭh:x4iT/kκ!yl>t4yVuU%4ckhLZhg{VvkZԏ5 Sك\lL y&}I%6[]aYJW{<-i;2?WXHLm4]:K0dSH]*]UI#@ 3JZl&z +xC2u}'s)ǽ#K $y$u ˔^Α>e֤Cz0}"G+4\R:f}9Y%<`џVL93ߚS_"Rmx;Di> LrqXZN!Ǜfɖ*pً$LЕ ~g@fJI\P4TϤK5t@%VD9iPCgEwm/;8^;Y\.Ɋн]$3A~uŹg&#vCi z]Yb x`Zéy|giƣ>TIt):xu -7Il-֕sITd -reOiפ5w-5=ϬOM?npWIn{*=m5 ?Ħr\'d_N[U_48೰OHPR|Wwì5? zQ]p9CyډHO0 ۻV޳;\=81)U0M#EF.bԻ}rXt}7`R1)2u*/Vx_HG$h{ti@XҋΑBp-t8c{>P}fMtxsK/3O? G"Y`PVs3fN%^KŮ+32a\F7'xusj0^j#.IE)ex7sS6?ur kCT۞#U*84،w-w7kۦvH^Y*iUA[5('Y s -Øpݨz{zQ? !J~!t~AQp{E;en> 篱f~_I~M 4*}NO?f:V_RF]6\)Jo{I%za$߈yF,/Yqfo='t?L \i?:T3'C!@ yqm~7,Q]R}5 @ot,&-p!~:?B+TyFuf-̅ rvx0ݧxrueQ`Vn2kOR/F~Q|-x) F6XmU|2jygwdmT[8rJ`DT3蓐Dc䢳V.hpeH} 3*jٝrDG"BSvT599復~PpCk)W( ?GwZp&F E荠3Ht> trel眊=BXtL)a%6ƭL%7IRi:Pe6.B -T[GßK2ǕsǼ3uL\ɾG?nMtzORk^md]X V -[r q1sXܐ^?!؟QqIGF8-WN hx爬ƢKg7:!NGn&;:D]|7b">(C {ʜ.FD:&H/^Zaޒoj¥(hzKW*Acm^O?t~$ˡ=gӎxG8*vN؊T5^Q.SJCx -Bq8VWk\3M֯h%Z3eiz;8-Kng#Oa&i>N];px7qU"rz`+1_s Fd SKZL]Yn ˿U?Uҽ,X5)mFAT4{=2؏#J2Dw ^4JOAsX[MeZɎ0$:jj}a-UtKsQI17Qл'_p'?t.=e{z::%c̴|3ZWr0н%{'O3kHIikZ$8yU窃b}o!;MJSgSq("ZJs;ە'G:*;!3kKѼy/5wk9,= ׃ Y8j9ltj::TI05|k)?9W] d1pEzK{r;?g27Xb'}4}#FdN4@}?CU[]vxZ(wMܥ_3/Z@ -uebȩNJQF ]rC?c0-(DNs@mIjh6EuO/Ǐu;!yZ[ZcA%I?s}x)^GrVJ5\e:Í36]N JtT/,!_>u*Jv%u:/k3N2_o jtGaگD?_ ";>f- ՗ݮ ::OGb߀8:2iNs_rPݙxtλ˛Oˊ;F3.k~4 rV wGѯO 1/檇U,r)~y4\\4|}= Or~~u~Nu!AmI^,S))žRܥ -ut؟2-S%gֈ,0z^\ xA69?083Of|37%Χ~?O"=FtOg+f&]ߋ^[AT1ZKnĮ{WGI&aHv!PaK-'5JgY:lt PzΆW;P/څo 6׆N=Qj!5 9uJjš )ڎD&]:CX/PTFG2]\VdkJ,ryux^)-t'BuUyS9җ\|w07X}GPDߞjW -hUwiYHE}E+_2FAI Nc6i{oA,=(g>)5>T2&n7j%eX% 阑AuOnXΰ:pD\hphUk` -x1yE^|G1s9:|kN "kB̓FHVn+TfqZm[N `WLMF*RRpJ . -x_QS. p lǼL,-= -#r  tsU7?\77ݩ6:9oco؍e>_d[w[ ~/?~lg38^烁}_N(uM`jQRꕚqȆs f2B5bn5!$`\)|'DOrYﱂ͎Ir+ɩН)Ψ*)o+>1CG4Ou[\0i7JXƒ f%@ <.4΄u)#iLg|q(Zo)A:@b(îreʼ[Q 2p%3̗.eEFh5< 3)M0c`[1!['9 -^Y"ub !U”P\Xd@CX%ڙq*&"ddcm!_+ -+mE -~RhnOBm(F^_AT%>E،1;)bzKY,q/"1 [=dP)%5T9+ cBKq\,aпhm -\ӋV7sV[tKP8 -*?XސPg UiBmV,;’Ru -?uam%7!@tDBʜ=8(֢AQ-LՑw!"FU l"-׹x3SgNq6%p߹o,WJ{YaA|5p|SkcNTtARpR/qbԷj<7b$F5^,L- oܴn7&/L]jXF/ lm~Af׌-ajV}JUר/h< MLo20 Tɢ&||% a>+I;;)Òf -!#Wڈ:PLX^^= ֔Ȧ-leS[JA0P /Z? ?Tꍅ7 )V4Foވ)-#V!)y_r~ cF(R1p Q, -rmkG/r|wd\F_oN4Om QֳRJ\3?c(ΡPj No1>Q ,ÃbY \%F7%=ʛ*WrRB╁j_O)q%0Q#S<2CdV"10HM]za/;*-G9j,CX<8 J%FdXRWE{߶>\_q5}AraxF?R%?UP^2(gld|\V`=1H4SMZ[aq";:?oTJQ nS[m>UASG=9I{q#]ǠSًKeç;A%zAJq)=t뫜_n_n@!n*|^؍On+H?N.NȝCiR*QZȢ'P"ʯV!J| -ia<u>j 4}29~~IK - !":=Qckey%B_ԹW*'"6̿ .0OZu 0f;H5qFf^H\ܶ9<}KZYD b݉u^1iZY~1ao4wɇGyEj L܀2ot6ZiDcOF0aBOe"倘0x'gJ<[2kr{]MD*^e=njQ.n.UnfU0%JbW*-q}@3zOp/Łq 5*R tfA~__pR*m-;JxpuB䚃\q5BU_BQ 0Ssb` N>*]7;!f.ZwRZT8 2xn搹q7)%Yr0cH sx _*2¥WL8[^w)慘:B4j\.t b|k2+Pj .܍?ąwFPEXxv(wG+geO'")`ՀD萊E_#nbO -m ޅ+-W+gG`dE/45 CPQ7pWRjdqʧRߟ<$ka`METώq.V1𵇋Pq1n7.*j-urw.NȶJ P%Vb+D!D pbiJ> ?\ȕ.}ʔT+&-Sx=z 8LH2IR_4,c(q5crB\\>C:h_,T\i.-a0eJ99( -x;'l<9N^\g⡰ͳi`U9Q ? -%pN$S q,Qfxr-[1|I SYe/ŕsfS.u~X>5/TL.ہFU/9|"pc88\4w$wg㈱x%#"%PbeQ0P:yTA"/ZnrR˩aĹeˍL~摛_&~j*r\k-QƄ 0Oθ Wɫo?&]JEHqlK**h}K5/PV_/1sLFx=ūa} ʇ犋7*W\sQ+*Ư>x"0ฒQeqܹy -KSX<Թs.V8]~ -be/RԵRq^j*xXJn=&L |R]As^XU?i}A7-|.W5\'6 1,s[[ox.%Qp\qE#Hs +g.%1d0C\ʥ.L/SU$H՗&HeBJbeR@(֒@yY.~Da/:j(jY,QX.+++*3ƥ\Pps_L]JypC2Q>!P5_H -Yss\o>9Oeƪm⣈PʇJ]J#.$A1W7R -ww&Ƽ@;R$Qln -W#bܤ[Z4fm-SP/X eU1Sp<[ܳV:|(%L~FkWe,Nu0X&8nQ8Kfxx<R_quI\'ɋh } ( R)(+X/y)'| -7 z3GS,1s> ~ TFFar^|UyJ`U0l#'T s5"f|K|AKz|1NUBΙAWQ4m) $  fQ\wn% -SC5K`Fk-8?HK~5phϽLmMp,uҶ(W -ڰ`ݿA|,I^@1jF:#3 j+2qqD_ߦK -[%\SO\}P-Qji% P~.j+q\h1Ш aU".P-ָ3*cRCq/@q>Bx\ 6'|S,.'hZ S+T+1عPٸ[ xSTÆ}D–6<xq*'`IOP7.b\8V1S*!n%E#L;Ln=fAtؼ/z^Fn. WŸ~Ou ]®RqR&jƃ\~cJ335qb̺^yx|BPe#)b }fz8#%q?-5 &&f~ -,J:p&oj\u );^m!rX#7\%(嫕e,1e@P+3k3flcRJ~.ViQ} -^S'أVU)de焌aF/+gy `E`fqx3f t$u$M" @2h0o{ xp5Vڶw֞( 2P,q]45DLsy⬣+!ռM Fx& GVqpE|B?PRmPP}@]EƯAQg+` N̪Uh X%_jRlKw2Q"/B=fU /"L`k[e:yуs:QmZ :nxftb;{qD7FLmu[ԷUTc4kA)7hjX.R3Q7JKjbCS/ }p*k.\h7!𺄯Px3_ĩ] ~}ʗ*!}08WO.P8T .ru\ĤAc!ȘVVp%*9q+;{dg?;/'qxvx-b!)zG-SVP@` މC+|*8UJkn(c5*Jd26}^#ѥBCm/`\Y:pi!+a*_(]ߨ0ieiL>MuM8lG'h2MS p%R -ej"goܡ +YvxEԯ sUDڃOwfxrKأpT  HótU/)2#au,2{[ua2\8%B7UtUiw-rY RՌ4b@k:(ߋ>,@*آTx-p* 1VYP%t*;zrޢx #W+I_KzH~{{eS XZQUP5iAT\$Ahψi 6Ox;A4 xbuj~(#L>7V00lXxV@c F׏ST`5q\@Še|'BJ@jw:i%lXL=(X{*ܸ 31`ZUDfuØp^xܺw_X6rŎRWq |?ub2UaZ¸uYPq]|U,u \~NR .*8>5*Ad|LXgGxfsX*!ŕƥDkU~_F<\'-- ^ަuP -&id4- d6ŭqd~PT V>J;й(Jf@v{jU ?IBTCCkWp L]2>?PA_p1U60u)X/C'ayfo \V *^mmh;)U -Y@5\A P X g\,(rb$ Y<-W 6˗w??vk8 3Ǟu! ]JIEyICA,,8cԤ%6OSJ8y-/'7|-Ly  -Pn c> z(hy!5!Q;fJU+$\l2%G]J -\Q^]$+w/P(O!8ZBX3e|b6BDZLAxxQ,`=59Xp8y_ā0%pE#|!$r/pLyF\j$|%^u FdFNW4ȁ% _Ư uսM;*Sofn8do0r'd@ L/Z0n<+S6\ev|}N츐(bKrPe<.d#pݲ-~j!lX0X7ij&˸tauJ!P021/Xl?dQbXmy0P-@E>P|9kTV$}eQq~jVU ->jpSsJy8eP|x]MԪ3Se@SPb\-F8},; G5\W8b3\S9G\gs8%!3 0h\dmnV. 0|_VB?cw\}\xfe$j,Үp ɋ 5yC1AAD/髀0opJjʛJ:R2J =0vQbWԬ[/TMD8YRS8ϋLܐa%F2F5 -k1냀{Prz[^׎*5/| *%RU?x!p %pk0DZԺBՍ?oڣcRҥvÒG8T?A?}>0 O>%\D"_:(fJI堨QO!lW1T8sZCLodfXEH0>NM )ʖi۽@ԯ2<"GO˔e${1y{oʗ.$6 -VUC qbC@b>S6t j,B/Cn^gĭ^ b|Sx:G8bҼܿk5keMhFRX:1[w4L8UU+sb~9B @2?MS p^Qw,ꙕP`살qB'tjgԬFŢ(P6 -%֟qpNq1*(l*% AYkDxe07S=4PEsP#M1,g&IQ}ʅהc:y%RV7~e}? wc/ a!0HC8H_i8r^԰=(?`|'npJũ|l?ŨKeL/3lQ<0%g㑄S'fW%;G8_JWT0:X`U |G"eKnns [EEVnUʕDȤ[ȸ2ؿv8:gY{Bj)C셉K|2l!kvUxnN.qҊPT.xÄ% TxC*1P*\=q( $D'fNv!OU~`Ec-ΕřemhTZPO:}3(V?H@K[Q΢l,i0c튩lň$d JӃU+T{epR5ߪ]v=m:s]]ᙩfXeI|JM0 ]Uhɫ_6]L&GߎB2\S /l*vM_ vw.uVR D]K'4G*3oZOp|ELt2y_qp5䍢TByd&,n aVs=OMԖ LBY^O%uvAm'~ }iv J{qU4F=@L-0 T86ୟ0lESccS0s \U|f__^mᦡ=*"7=̚aj׈p[ =]iUPupЈ *u>=>|}uـ`R+HS\kk~bʾՃQ=?̖);ChS!Ԩ鹈cRy549(Z/C4 İS6S.ڋWԤڤ\XL#S'R8f: Hm_^-URݩvPl~څY-$fK aD@"7 Azn<-|3m?YG4qޗySLWd?ז^!P^M7;c1l4;TLnb==,c>V ,WQ|ƥKڧk;TT%_U?(녟p↚fx!)! J=- 0`W -{gzVD - ,3 ߁~cHڭnhWHL[ -v4n;:X7PLWW|Ō&1 .:.jʗGXFg uӏ:7C)3U{YTt8dcnHbFM% *|7Wy2\nf2[ >,v[-TgxA1Lz\q sqq W )jl` L7^7<\\vp8~q._,j \VuC-LSQ0J&*mmkE̾a&>WMA )!h? -_XS9*bԹ:TRm%+Iw^9fd@+e 0>3cFkw[QmLx|ȍ,dπu S?γG4E2cV/i;#>5K]a:~h;6"CV{ʄPXfN[Bq?0,r qSwv,bA3Ôx-Pe3wc{r>< yT;%3MpJ.?C5D[~-B>KEa k}S\nXuXqygLT(lkCKjTF-UqޡL/W=ua1Pɭ{]cYmYMFni*mA'ᮥ%`<ȗW?,GJ*&Ffx̓*XNaZqI%^'YRV*UP㛟q -X_=r|yCP+.Mb(CSL游?%8-巎\w 3^z0i/ſt;etp*nZW%LTfukD]lS\?P<pDW,uj33Opz%RM5o HGvW`-o5]kK*MA"J=JGqJ§sG&?`m>Ny%W<%qfnٞx!qqc/ś(/ogQSf[{1azh-Ćp&XS9?Z9|uXnuq|NO|]|.2ri犉qf|]W,7+u|lj !_.yabDn?+i]+J2QSA  -ě4ĭ,+;]‚資p=\aL2ʔo ڑ% )fwkG=}:U9.%3$`&=2sK {'rʌxj(Fz߾1Ű1ZEp<4u&Z' z`-A{WP_NCR ˗/|/pngp8r -pDeKT")4@X)NƂ{lr'_X -F~\''CyrpKz ռUJ WE֧֯f:j7bCVirQ"5sA pnW*~ Rjw{\Rb]? bg -K E^eV:brv-.^MҾ-]|%˖jb\ڢjJLg:%xQTTlPK͜4>S\BJ\h%tq25E-˜*#&4XP="9RPNm_wi.ce ]L#^j3zyuҺ-#v5QG8\fwu `K>B=p5Vj_ 8.!%q$Ľ -c#w"˨B31RS|Y2 jpQ*_esP7E)!U0!'pGk* bLw1VrqU/z(S<<V}kl"Y(žJ -bێGZWAzLS3Cゅm5=SZ"z`.U*<7-R3Ku H(Y1Q"jXq1PǏDqPò3f'p1~59ξ/y-Q]da57b'b|(LA\ƒp3®9*(JBt j) -x"&%fc KFիR>'3)̇E$jk:j -.Ƹ8r* xu[<i6mu+!mƣvĔ`@=5lxAQV(?PUv̐ g5?`] PNlGV*]c}M&Y fbwEа=rBRȮQ+Q%)Zxj6C[8'i ؟u5vQ = )wԺt0!kl#+"5P -;DzM_pfTD[/[U,. nCf%o$Ca b - -+Sdc8!bW ]k -l&kmSX[#ƱHQ<4\ R @MQ^UQ0C;_P]ʨKܲ/, ]Mŋ+~"h|33{YQ8b)+.P,b֊ iYqQpoQD; sP2Cm 1kA0[Q!΅8ZVz: 4بHe8 -PH fj$FQ\iP+ pk"-b$Pʆu|#ཋ-$yM[pQ,n5#m晍 D\ Rjdfmk]\j׈4l -fJ[e7\Yq"cy).`1q3_)/\fJ_O^c. .eJ.1?*or&@hW3+V7%rs\s?! ^u\*JH3*AyjGcQ%++a kjr]WD̽]b>QsТ(>.K> ]N*[s^(i^A -rwA@ݗjB7D焕erx'u\x`őXb1ǝ`,£ 3rYCĺ;>^xÒZL K,EoRB*ڼww/]BĢ ybl -[rޠ6KQ"T`*ɟ]V3IPک#vj=6@QJSZR05+~hE0X]-ub͊ojRV oX/F&؁CDe0rQ.M]sw~ᅗދ0)r\W!A* 1f8&.5R[7:RƧPqL 5Σ G| \jb|T~\?2!uBUJ#GbrWP\ YW\ 用%K̾sIéO -t}2Lqu_JR -c7k -$d*{PLk _+N 2@, >RKY6,9fyn2RaBZBX E Ԧ>W6[QPO3=ʄ-B؞Iw9Tl1\]kb+qOkU MyΥʋk'g] Thf57b_ӍvՌM\bvSH" 5dk=?}Y҄)+

sy9ԨFS+fW>&Q R_ e -W<\hqvT./0?AZi+W6pJx9^.(5 -G44.H*P|,Ȱ#[Ծ[8'Ss\cSW ʪpi;6m',M3¥27h'\%1#r5"jE5OJ#;u&%V2a4I1Fْlno -߹5a|g\LmƦ׾q,ȳX)mim6|K<8@a{H<<:͂hB_kRXLhZ\FFH45Kǎ]ACbqT%Cަ"|N3)f$(ش}K.k8N*f5jUfhbZ;|Jau/HIT|1ar e\% qq`vNU)S[3$PRuC)Hdڼ+pANשRl}vi,7h_ˆYYN;N]4?)?* ж) -R.ʱqsF¿e*qc픬'J-"Q4qQ.ˌ9y~؆%'1{:dK}4ƹa5¦!S7yj<\FU~xx+8G|ltU>+A0 Ȩ1÷xR8ۛErS:_= nWtWRm햞k]\_w "l Di+Ug^l@=F -0FmA&c|x넕WjWƏ1~9|к/ij.!l(PQx]ReEX;Nr+jmFsï|YpeqPcSJC=c"+:> Ό}Y]`WǶzZʹ?ʢlĪMK ˸_!ݦ%JcAݬJ9TK]# }cM&y%I ]eeRUJ_>(F`r̩6Qc5\n-qL|u7?5;'rSw|9ILY]uw7/\cr"'qS˾ -~_''+W=+qi3&n4?%oQ Y3~y G)|WY1)K50P1UF ˌи%단d*&][ޥPo*7 -{R{|z#ywqos hI l[bR-эvinNw _\7CK4vDīaq;TU-(!/ j[긼8TU0o*Pm-^j,&SQGAHfՔ#\_ j-1|ECgLpC6o!y1(%5< ĩ\301dbJ]DYj n[P5\ԳS{cwqP璆7 0(ϥ{C(ERMLss:.q?:Ng7âhu-]z>6$ya7eMŋt[k .Te`"nE̍XCQB+v_*1'D 늝u7e Gm{Rn:"Y:<2}|s\ws<2ߕ|nce 3eq[=JpL}|t\"gG*\rd\ 1/a|TyxYo\YBRru~?.;|]Tt5\/ |AX@p/zϹ/FJp!~p -[ BkMR0 ^W7Cاl4J$I ⫍7z)tmh#S$5ǞQ]1ZWJ egÚSJ{yxQ]E dž3J;|:Be>U;$qArg/W g|1灘 зC TM̍#:T {5Jno ~>V尲fΘdHGe+.FYf1U|ܿҍ{˶\dod!Ph7)П,V Tp(- Wp`ս6u)vq`-3WUR5Xj=/2+rUKrԐ4=:Y:BWy:P˟]pS) 9KEl-W<f!+Np@t6K7Dl/ Z:a8J"<؄vx/\Uoqx_5 c --̼LGG<0Ilojl[Wee\wrjff]򱹐g5S | XS:6RN AUiV0J0,cqn^{qVk݋uìNX Ew7Ԫe['^5gGz7_ A( OAo fopd,#ljc QJL}Kx,YUpˏ%Jืr C1M[.~\|8PQg+翍jơO D^j~yBkm`oݵbġʾ5K>9P i0 FS`VB](˪E {xVɫn[qb0 {/ڨK"82ͼO # &lb{9FjhEdlޓŬ"ae6"7.Y.YRVr зRiV>h%jcrR$UGC5l9} UPnW -%m0#eKPQX-&Ux%.7q1\yc<ߚEy GB,!jL#RIvqcK,?eKqUBڢJ!> DX]> L2.] R0ܬRhA,!W|D5p:cIkT# ݊[|p}G;[+/o"PyQdeơ7rpPZ<Q8q\cuS\xx0k*]`2; 1Wfk,,m@OtWqdQ孢1 + ן wp)*:6EF.Hz#K`]FS|]ET5+ -Լ@*yeQ S1LjR6AktD-IbP8og,x/iPsKCIBwYӡVg!aczk_w F%V -aigj*_MO E2R*_Xe; -*HJ-xC(7NkqT#O9E5S,Ψݬn; {A،)Hg#`Ƭ6А-Q~C*vE? -;GꙊq_b. JGq^/2.[𼳯\Ѫ&Ҩ251|θrqYZw/e38sq!5#2QF٪RuJb\dKgˎb,L ~7pUp=$"!j/XjiL"ĵ:ܥ"9!Y٫ 3O7Qނ 1%5; w2لD[~tE3TWQ/\*G)_ /S3|]D#TéLS< -upaԾVūA ˚'sþYY_Q5fGB \Y\vL"\Q.& stFZ;3o "]:(jy L]f-`ކ@Gg.9̸-JP"f#%Q ~ n/&bgmP?" ?! KȂ^7v#UN*yX3u` fDJfWKe&[ Z8jĢg3P2bRl<֠LҦ -|J:X hʪ+V*Y&'Bb0LH^MF7wCyGΚU+YdUqҋpl"^ Tޱ -^UR+ qLG nT;y~~IRd3atqǸtˏ`ˀ;p-aDʍPQeDE U 0 p"qiwbgxLrsGCªbhpS<1GxA1e2_qu!A>9({h6ޣ/;JtGfmaUY'`e -k&ܲ,s+eT7$DTcu7|${qREǂ3<qO)[uLjΡjG\W\W W| x*s@1-w/+Σ\<\9oo|kG w.[AdĚ8W/'c OLgF"5D>e.%ĊHQkha`jkk ,5E$Ho BdiXMүr鶛.?9Ur0_Z.12\^fUi?ES)Mxy.;b4k0ŖQeT:D̡ 4+Sj˻`V/h+,w e5ܭ )wlȏP(Uِ~Ӏ9fKr -k-'N(6 ZAݺSd[a5JVι@ku|Sխ5;6S3|*kh\X>`:r%()e΁|cFUw|4|/K* t|:(t~raLDޢ -NArˏ \\R6"5_OLJO'ؘZ''  &= VkGA#_#٨[P:*GV/p `ݞ`mT?pź_@]oFO .# ~ AQ P+f(#s\\eY }6[债HDG1b2 bUqԾ d{aJ.xX1 ru )0 ; k*WŝϿΣf+Ȱ`6R:lgDs#yps iBԶ3 -5\W$Eʚ߫EO-Ńq7RpUb69% ޠB% [Huo(P=E]=QȰj_M(J4X R-Ye;huDCW̠)rxp|]LmAsP3(rԧ|`c{je Ҹ-Qr8~P=3d[_KH6MΤh=K_7Α@R!}.[JRxK R\n`3u%b\1uXg\Q|ԡ*? -PHG˸D&W.\r\UU r2428\+xcb fe?geb5+^?cR.bVÏRaz)R(_1Qd.*e!x1t[F eڂǨD=(ُ/qK|13ťֹO%;jv~W:eQC.&y\M\;hLFx@,/F,#1.^8;n%rjXmx?48s#*at\UP* -/mG6BjqQ15 CPJ`6[TƂ=Ql/\G|8ЍM!m.*_.yeloVM0% %(&eb_E"R8ۮiQ@%˟J< Q3q#xr|pWdʚ,ulb_7%yRFV -Υ| R~%ćG.Ä-]|:1q Q:cLB\g 2Yqb". -8,p:Mmz.5zOj rm0Xi'epDa~'Pm3>" ZU.Sy$@h6*9j19?u zKYi\PwE\ RMf mU, o-̗*hPXUNm<-[):2,~[*bQ1m:4"/) {%ӿ16~KCs3y9V&o=k(J~Bzr|cQΥCO2~O$\$pr-B[ƒc8H{8W¡N.0RW;[C)y&gs>` . Jq\\s@H Ab |U{ % 7yދy/ 4D Hsi|"u -qXhkN.=q|\i)i)A%r6nnxupf eyEu*U\MEeUŸSW.;T=M%$xHbr˨K0\mZ;Z"Q{In\nl/OAO.~\}7- -]w,*')F  cY˕=&.buKBu̮Z>DgRʣ'rV1S<1M-ĿtVNW#|W#&nհ$ -6T-]qv30WQ>ާ>4nPf ,.+]%ˠ@k1ID4(H$2kB:.*WK&4ٱF̡epo6b Jpv3$*7y,%N)StJaҋ1樿(b -bL0UZ9q%Ju11,x>;Ŕe*fڗ3-Ep\c0v 50!~nY:DIT!Ylt~f$"P,B;o̚7,t11 -嚖uxw/⻝%|esqS>f\TўB`FNɷpܹpK`es\Qx/K6s˝K1ZL zD}叆3DJ7O~?E 8 -Bj;P&wOUh@ H$Mе!lfD)k:%2<K3r ۏ.#;&D*^%=AQZuK@{Ì\ |:ܺᰩM_ - ю=FTI\5w pPtr~aP[ ExA ̩Rr`|eב! ĈwŚp5Jg;_ a} PfN 2@x5Mp1 `\DBVs}{%,pbkQg+pjYXxE- tExquL)fDb[%L -LUZ%BcK}]X"nQTf:xQ*sK8%iD?e,d2UK%Ր .>U)b4K j,)3B 2M؁Uo"DھAoNZѫܥ(KnURWɻx ?vqli{HQgX@=5 -UK{xJ7 XfH\g3YY%\JBUH* Vyi}? Y<K9Kb8mO'7+!}OLyĤ0O=Jn,+H) 1t/5j[d#݅LGvXI_5WlIVU#) w-Ӌ`,xQ6u^UQbP+ --tYN'vhfyryM5ͼ*N:TYhL0uMgqn(|<g78U"_񠫃vv]qD=@a w/?- q\xcEn"g@tMʔ]pnUoL~J}KQLfS0u%qWܯ -q\J\hܻb.mD+X.u.P4/ -+eԻ,{(0KO[Cru^5ΔҞKYRi/]-)ZTReM]/̸fU(5j 6m[22qoȗ+B pԕ;;R߯-G_Wz -q|_++.xXĹr bW2wF%F+fjV"*'OM+<&EU@yC(ܫ!z%Y%-+hODIGPK(T0UFLvX<7L"g+kL+>.poƢ\5u7ȕxJ?Vn4pUpJȊ(-Vt'3 -ʦ`=,juJECᗸ9R`"Lep."mqޢv3)^uȤ; ͠#$a@tJnW J9! Ri-?żZ.ݽHD@ -qLljVW}[na;*j~⎦5o'W/ @(w3ƢN@ޣsHu0b胄G/bUԴ Xf~!w0dzJpX\p#֭w},^n,̮iC4Ii^ -ژjd "!]V2^N GTJg*}űHx0, :mU_/5Jpܤ<I-O> AATo؃V?5 -(h|,t2/ox>ufgZ$˹JJ&D ?qA,:-^ {~薴+b)&~/>7,R5-*pUe jsyJp|iTDBV'#m*˭iuUtNʍ_Vn_Öphy4q녟q aC -/ ;^!w j(\ UWES!}ZV*'wrMQwi -|sNO2ɗlj)v^RxH:]\SW-.+x}DEL}\2dO9ܯUqs/0aF)P9մ)}!>Ǟ K&'OD] -or@GsH 1 xup.a>*/*~e+,/=StTr kʁ*zv\eAhl2GhJa\jjP.QC|ln` '/Y]Eүe*>J4:".jtP3P~-KXf+Pc E4c ŭq;+m~ TDHKĩ]s$nco$KnfL虗<BO'tY2Vv)~Uvs g`vntK\|?ߓj_DZs˅BvNj 3TNzT.Jږ[o\*˟S,v@nd -\~RɆYtĶ_I|$R^jÖkU/dٻ-s5da֘S?&Xܕ-4ǻŸ$Yn3wR0,\BHB -!}BK)qRWY/L!_MAAD4j]n2L5ԸEΚnjG&@K6 1~|@0,9$,!}*;4q23*\.[C6Vcݸ/z%Yx]uT4eWW;r|OckQC⸷y;+ f;ek7R8\G#2A~8%s+hW/K[zbT!XZ);)ŵP:z3-eHaY \Vs1);R\C;PhoqS5-b28n *>~9z"HzhVDƸ5QXSkˈmTm¬`OZwPע]:"F/qXC|. TQվ  bbH<p~l??/J]uԸl;@?dE_"]KKx.Y<.;w(uISqp_8?fupp~8.;i udr9YL]1baŅ\=73/kp4 -ż\7qg"qQkűQҠϡ.+j"}Ib䢀ژWvOv -7G=OKH;#kw*K)O4WRmᓰ.]审3f PY."Jצa!4 je0@+2P?/*S T"L/%.p|.%UT(+@q9cu1e=wcMKV{LvE HQ!K-Qs 8#(ȋab ؑ).3拏/yQ;/w+f+ ._Wb`3x\Á2N5)U|:ˋj\x%GEFQ}ˇ1'\ иf/ Tӊ7Կ,.R|\, 6 qk,g(JƉla|=K爱'W,-W\7|]XӉtT٬ǂrda]Z@+o5pp!-W62[x1&<+A]xK%'*B-jTL.p@*og -AB:| ~ƞ8Ϗ):ħ*&}_32u-nd84@XAe1j:$T jv +t?R{}CϨ V_oN陁1稹E*\bYv,\<1 SwY-y%S4/[ -ipqV2 w H#uޫr-nX,^aXpQ ZDsU[,TJ\kGxľ.{8J8W.TqJ ^;^kx(ɠ8'1<^# - ugVSu|XPQ1qmDlj|JN26gbWQ$%E* ՃS-BTu #1 XT ^@4]R㢴ׄv* -OuB*<;e?2 l:<O$@ehWT9#)Z|<.f9J |,-RRqu`L4fMJ/P]!<˛D j{. ゾ :V::g>Q"0z@yG2/Ļ.^&iˉ(*]-<]RrgCl0iѹ%#udulʵW.Qhl}.m51ۜ@L XKTp7bYJNt'0zUSe弩EƲ,^_: >DܫWT˪U8 <9W N/,`~|pEY8\VUu$EWrBujZԳ"eu0U-<3ߎ1ľV?DA1t|xΟ6DR"#H|t\T!/aZGsDz QYcVhSP%#/lk -zO/], UdE@P-_F\W8q8Fk8c)|&cKgN4ܷw̙Y";VP#=Bqa֞ɿe{+{HlIJ=a.@NՑЈKļ:uKoa #).3ʙ_2ӊ"%b"J:jgA}pW Pjl&z \?<]-Dϥdr(f-NF17*#QBf@H\ك5MgiT9[d`%4WPMBptdb62rnkːO5.ġGګy>dsf?T&cͤ$&ԕKH'Okn~Xe -m : q]-e\ -}3P^qU!M{jG*')F|;)3z-mm #]wF& 7ԜI@2ʖ=Z.!fq,aڋhTGFyET¡J1rW/]Z\:#r }:K+1>@P~Ko1U_\ _҆BPlj>At}*CJ>)/r.}Þ:,~Nc,Q? I|$%\M$ ^b|6|5/K!^xc-usHwPJs|6_dN#ɀw~B4U?=45?A#b}lb}EƯ#&KRzmqd`u "K]r̬Q0&j'JJW"SLZNwaMvq8<4nS632dZm>!]1/2&8K81} Xs+$#`ZJc@u2]K- -a7Z) ]dߋ}˸_~S kmHkK{6Bd}FŞw`)%k~GepPs\8䟟^R %8-,e̦IeN^2B`T ~.!*lxb4er .u;(S늋>G̨lquq^`S/#1E. MpʨGQ ->b1iܰزlֵpxfLnI YX yVC9. F xI`U;X'cQI]@Kj yhl L-0Tݓ)h,J9&ZZfs"b)]grn}Wc(liWKIcc+V}ۼǸ˂ҭ -~EnU|o7yD~9^e_ LƼ˩v,Üz*?qTR'GU o)#Vx -ά#j*2^׏ @zkZS=[~uQ1@5>J<ZlEj}"BHQ\=T~m'7+DL#@DL4܌*`zz >ao{:`Rl"RK! \0  >uFǒ1.TVe$!H1x8>$rXsh+\((OûԹtJT&B du*?da(ڕl.!P+\%<(LU)c+q4-oTv26p,8w0K3 4=E`55QJnT+׉nfȉ hӾ&a}A,#NpyȰX̬b\gR -gCfơ3*(,_Ƨd9K@S_4_O쥦NڅPFXH"QRxf w^FSp_idTj@Yb-槇>b?2Tx6#/45ᖐ?inFZDݦdI6Z&EJUNȝ'KUxPMJy~;:g߶8qtV@GXú gEU,LQQDbDhq-@|рZ9!ԄfQD.02sJ+̉Dq-" 랋( mv|(ᘅK-]٢8*zқl4 -ƟrpCȂzK7q3R -ʪ D N.HQˢQr{!~A8Ov7T`0⍈]1gNQ3kh 6 -6T֥1ŧ$M-!|zvH&+P¾}n aBO3jWqf5xjX.u3 H]L;w:T>8z _\7q0ԵK>ujh?r*{^ iy)=|S5a`bE;Ix_.Wu0˥KMK)#j7 -N._-` -}:x }Z.YVQ:LCU1ʔôn10.=-(C|*<R YRݴ bi_3^%Ar .e 6}(^(f8*j~,E_HPVIώz/ǘ6k\$@P1nLdT> ss2h_a -2V}S7_9uh)'N`jIfþF;cfɛJC-1?p<_aHGҀDWۧ`UԤBǟP]JfҼp"KDjǣP9i,~6JD(-kC%:)T rp3Rq-WnzqV\>.TGހGR׏=%DǾ*  wmP552u3ޡ=K fS zb"`<7+W -%>eaΦG]oϷ6_\.恏K}Mo A:( mQ?`TGwg (W0pheU1fybE;H ނ.bj+qfïC^%A:@a|dR8%T 5f D Xŏ^k^;翂.^eH0ux<bNn1nXaXj?˕ pYhI|bhO$`PJṶ`XWS\d,5X8cEG[A֙ovKzZtJX1IQ$(Ecky@̍}T-ai*E04-Ј23cwYZk% Jw֘\ؖ*Ce#\σn#)u-,XcJJIT%\\lޑ%?u5"^U-&ƮWlc/p50^;?3W p7ɘqZfgxv;f0ܬRK%l^}Mon+1:H8xl A)INѿAJ0&D+ ʿ8FGqň#O'B? -QV^@ K?IR5=H+UǩAqo%p7\p|˃3ϯ`U#Wۡ"%Bb*n7B)hajE}*%_@;C8KF:umTt'ӪGM4tM:}.U0JX݆^Fغl.!hbo͗tS(`E.-}FiuM[cZ܌[$-3dy]s%Y3 7%ߘ.sL2_"F^YR\w^,*|: - 6oq\tp6D,CSk~(Gɐ}z g - 2~_:$ 1p{rKc Y ^"zL U,`Y\"pt<<--|[D'>F]L~zQu 5p\V]E,W}3jƁ(q*Lx> 7/<%5 WB~~]IUWa~YI2= ܶ1TU`!eAZ&삾ԭoMOYtǔ+2Ŕ U -B{s19ĺ.)/I+K1' jQ{ -¹h>vB9p.c6(LauP~o6$/*ߘAcaub+R"fXB\ (S+k1n8cw;8Ap ~R^wHwu><\"(#'P~oԈ\W}AawukfV]B}U^u"GUFr$e3|RrrM#⧂`5`eԱܢ}DbIb;aؾĢXE*_CzeG EKm_=Qe1 5| qx(jqWf40PW9ޫ}VZᑩpũR]=P7Q[ԣ ꋺ6[€DxqpžeԺ|O2N`۱TLkj<]AMPʲan;P3[cKqPUS+GWl3HKoh1?r+3)n^wŜx<7U{Hߏwż"BįތѶ6bSpmy]v #:}:,! a)Nj<@Ac~lP[-]c?nY>]-5\7pPtJwg -uMPr/kDTu$n/r;a-Xj[̈́}TQ*>ƍ v f=m+*T̶hh[$Q4zndʘ,DU1԰ - + K!\j^J86^q*+ʕdR)%00FS1XDdt3p[cEZ<7XyǠ_."SIX|h?)W1U[ ?mUDbΨ5 =|rRU'^]3P K;8ebVa+>+%Ҡ5,7\Ε0~k JZsx]DB؍5UJ -aJ,$y5Up: -Q,^e((M ,GP k/zb57ԻL ܹlS2CD*LNGƸZ pMw7ܷE(o늹Q]*y$ Uyc"p;I v?i쯤8;  8(p>`mlل|9NÊ p}ó݂ =Sz\POpSbv濟aŲ̃^(Lf˞K .j"-R, VOd5lw{Cu s7Fd=vF|B8$f-Sd~Sd>x]"\; -겨 8R{9yWC).kK/3Կv j\|\uhydU^wZ!!Se@Au~ CPo T9e_!g|XGU_rӼKc bXOm׳ser%Z995;]G7RrblR\"6"W\j^U–(f<~i5pbF ;'?ɚgmX&1D?ԝ^?`o%̻%UqyEq;G*ˆ\n \\#G(y\$(*K`>Ub6Xn]EXF$bFJQ~m$K/?J.1Xb9YBUhÚEKqN&J#iˁD"jJeSw⧢,2JĪYTF/I0fq|.-fu3 -NM]8⫝̸/0^Q$fqԧ2>M쮡eyQ6,x_~|j?*ϥh.;CP+<\2ȡ* c>>GZmK)[;}#靷r6 K"E0xAͺK i?1]̃ /\Zzz`5S*jWp1pdcLY=IPbfL欋| \/ir (!# 8Ҁ-51q+$}K{|[ˑ_hopU:1ys|n^#du-{%cdZ&1/JOM$u(OsaVbp>'PssR18OԨKe5eT-" rэkx;Ke,|u??]l\1ι a<ueKX"@T qa 7wl)Gr K%Vpu X:b>IpqaNi*{,!k\0 cAhy? Mg჊LE |oGo$q\H.?S "` b.f\14|_`|pr3qw :H@H|ZqsY낵 wW5O'7a씷&Z^`6΍>+'zXoQd#xEj A!$Kj\^$Zv}+U`;{ k{5˭5rc1쓆ot/Cn)vԟjYaw @.SXjVw)7VC׃P/s 1'ZE Eݞ}`P$+PV񵪾TK]QԵ HX4$f_Wu~ ^qbu-ᯅ>~U |wE|~q?y)Xga|JJF+UYy"ÁX1: `A_!u_\ L)rb2Wof5RFv0/rqYdn00ŷ|[PkX@\[8^h2҇Q!xÔ!n@яEjWrΡNJJ:}F,#|SP7R/mD2rn~c+OV&k&G/cC CWW±vqR-#ƌf%3'%n kmu) ?Z~3ҭ\LQ.\3jٿUT?#a(=%왨m<hb9' B݅@S$Q=@[FmzVffeUƨ*QK%pJÊ'S6B -L8%C? YL>5ze:cU^=TpL:|_ó"U_^^6{TnzQZ ~~E/"l;ޮ%oszt1jW;h Ug@QQqJh!^?3S(r~WB֣-2ڦ DIK=rV0/ԉUR}}%SX2 w E D^{J8ڶP*x:RcoԹv4JaIuP<Ξ*2Xukေu"eKr)VRejdbQ&: -zƹ̹{<ٲ_\V`|O_'P5*2W pX-DĪ7*2AD|jU.1eÊI|2\ZK客,[FV2 >%j5ˈwn;t -,updžHTͻ% -Cc*-F3h) -dntK{f~Y VJPne^kNg\U1 -nWlDf.[ -XL~vC3.lx_:Tfn\x~fɵ Wa\Wj)74ooX0Lܮ+|6wwNR9*BcPqw-e"TuqRmJJk*_\jgb&h8w31Qso˱ߞo*DN*=~2ry% CrK"71U;y R1#b>Ws0f{N7=~D8yiwb3/ԋgq: @_:m__ÿ`_kJ"uxw\8?p*s: jcqSKܮ - ]K.(\ r-Eqk$y}ϰ8tU\b] A/7ȜzR:7LÑfEJ҅P e?G|nKQ38zF]j^ 𘀳u޽ƒ[U7xS\gmO+ )"쮩'3EW0Tԣ2ӿzYPsفcFogJbTS's3.L[" k!gЂP~"+f\)IRo\WRb⌋v>aߖ&QA**V9x8.U~ Nu|/wŏS.a\jw._%w+\`Y'3W~/Ľ)V1+51!FL -zxv_4ᶘ bp*Qgq|tĕ_ -y~]WʏS+ -p&̫5*3~ep3[TKr}|SS`0pS/80#Q_&,"ZQ̷1{s)ۃ3C:'T| g9{:P?QD֙sd|Q$_V/Rp:ԁl9'O#Ww%Ar4K;R E-+A=DJ^ ,QZ*]E u(S#)h\`P.J*TÛ~1+g-T=a\'%nA{:o;Q4;*"pjjZjRBP,KN^⡄k+ I'? Ua2]SeG}(ib, -s-k -[[7qիn,6#T -P,6Lo#gı~%KS$/n]EM"*-Ȏ;/!5 f&BA!\QܻԾZV"FkT*̪7!\3|q(_f|\slRb]L398#?|ˮdU>'2(icewy3FZUp(I{ ):Ԭ@m@OЪe?/% 3Iur,[ƕt- -n-P)H"C;u6QJ &qp|W(x`0|w  -t`]L -]IU-l?I3Ɵԩ.!!8}BŞ #l]ˮk6#yOS2Ce? m<@[  J4QT֯l0RqK3ƾU+akAlGmc[zo?ZʔBȖ.I@󌺿pI[3-eX=QE KI`uhct5{a,2b}hn -óbIj{12l|ܸBY75S=yಂ SE33ԼžH\[hvGQ+ʷfpLP bT(,.*[)2Ëzu|A^_y$>gX0q|a a%V؏Cnd~Aww1G>t$LPnx|4|Ǜ`TzbRߩ/zd(+/<k4g\XLu35+~5: 8uWksB ~ۻ,q~Ȳ~PFlNWdQ];) P:q*&pD'ot@ @ceby>c̿lң=N60B~ `fB;bXtjHIхmc?7Uq:%wٖ'm[,YB[玉uR|] _ڟjvp a@Cbh<ܕt E)>6.x_ sQ.]05XnXQe[:c}K\X,J 9<-sGP,7/+xIs3/4a/\yQaܲ.fxn ,&+yEA4cQ]K%K K1܈hVyHS|j+Pef!{qSy\i*7TAs{stCPT]Pxq?u0t"(_h~ ?-KQlC~Չn,[_F&C]BѤ[}R@;A/}(-p0!& 4D)L췵bB?d)JF.PaKVH%ь4n8D6j? {LA'gw+D!m/"2W'>]U.]lj mȳPsiTc)Io\v@ \ynhtWn|IH[%6𕻿>Qc*84J)D?QԩTle<|Y9pYh,\C&4S|!1;,c"h,wuSe$ R ĦDΣQW =b(V@cSWp̹eVƥۃRk @PO ._6@{0y -!qT -@Do ZtĠ)g0^f-,WC -_n"Mb)C{c.ʏFZ`pKaEJΠQ |Ì;c H#Mb9 ,w(o#myfh~6&Ţa_pG,[|*K6szݢ?gCQeR0.\rQ?|1pW#L Q1l&5aU򈼄IY mthr/ԦPoY^˚m5U})PC^306[/KP㉪MUE:ƐqQÿy]|jUTx׹U._.`EY|R<HL"ۮŜCdʼD5\e8U. 1P]<8L KupP3V3S]90>!nW*05O\~`W.\KF\#/UQuq(b&o8 xr,OR/7g{nfz,,Va.1\zW2rvJ7]pdR\s Mכ<1Ծ:Fe⑸-pjkqP к-x8H wB ^j+-/*;%ZN|TSQ7ndFG%B D@@PBXVYbpMJ4īOo1^ z -'efao1q"Cqk踾"oGt:'ү~ l+u|?TG*UKwbF7pMJavֿ .Bj8& vUa@z)Y:!w`ԫRJmu|FکgWfuϻrİ/ԦY}L$p _ r_R`U8/|+0 |Os+L%b\.|#6(,GX:HElAE N~YPMLWT_ƊPB %]Ap^e+5 -9RrښvØPEl#AWRY3N*WB\l.zA hIQ'2^\@ -Zh}qb̾/s  HKer -VueEEd "sL?*1Uܦ&ylpd20 \WTP.^RԷɐEvJkԯ蚿ͤA9VZ=;>='U?@nd+84Unm2EH3@o zM5at-hdnb BP_`mT/pΡry<@ LA$<\y l̴1l@ 7Y0W٤OݖeyhI*h1˟Qi\bz%G*}LΛ`慧$>:?bnM鸀Q+"%1I1mTGM%5ܼVM%( wM@b~f1 KO[MxbiW.8 * F0\%Quش6-:Zƪb9ܩ# j_/T'g넬F=ǵ߉%d nh?D/VtD!+URu72J.W,?]|nW-` 9̀˨ny/[e]Ke -Yf}|ҮxԢezjAUR-D#!%@Ahuܸwd%p '20}"bN/+$z[dRc^ʡH hODwC-XցSZi1w PaM2.bg0Lʳ Po 䰝"W)mD%@W7o&`A)c$c,w\_\f8Ƨf%JfVn;LOrlr,.k9~ R5o -*Qjq,,.er7^LS*T\3r J&,CG.Gs3(!w2o7^ Rsx0R_ -Z"<8x1k[3q|RۘH,]~ aDfjgqr5ַtw@o~_cє_(}X%QKæ~?4ηWh.ALq 7:*ʀZBakO@=EMW+tbX}DX/C6B .T3/8 @WЕb++],٘rxG7"ٍؖܖf#[)E츩CWd tk;feƈ #+BC3D %Ƴ>%D R =`7h$TS1zV=,ERpv?<] ԙ:UmD*P(\}̍p`26$X2p_<2ʄ])T[ -U{a/1J,ͯ\SiqeܹYhs*jz_1Uɩj#[9#6:dL1O2ˤ{RNuwhsrixau*g; _(7o.2d!|1\Bq 5.5\4ָM1~gPa<;⋎p+O5(c.r끭a\qmUWܹ?Iu ~y-x#?|9橃G$F}H8&茖"~'x?L)A0&b/ + r>H0NM}* Qs\_$( taF΅<+A2IavDXǸ E2{UD Psq$7L>"& ChiV+[)n^T8Rxj(Rעqift.bfq_P>> `0WXM(n F^/DnoeRM?sJ[θgW£)Y>~ TuU*|r{YXh4}nQujnRaI&DBA .S;X0&:2TH~` -)șNbUL_fk$1!ŗ/TFT8B? }poq -VU.%YK{pEq|aa,%4#,mo*]t<O%!U*_6MW, xiD87\ 7y~)/D74 ,x%T8 -rx]q_%K[&7>l -q| Dw5xID3 24 c3Ì˖&z~xs7e̹uK"Mrбڭumi=Ho\}{ՖCZ -Ys=iB -A4ÏD*k+Rݼh`⒊(w#K6LFU K!<Cq^ʉ 0Ju4.VX~UƳѳ2ְEBM~c8ЖweuS WeC\~I%66&:9H bUcro1Ĵi%C5ӷdi͍68Ir\kпu* 'r۩VQW !` E!*D!z[>iKLՋ_zgWxjZ!zP lVd%暂]JϮ.}Se>2&j'ria`S_bnkCrETlV<:*{F6*KV -,thc/nS*4-)@|aRL$:?WEVx\*i m## <5Y#׫ȜuqvW#^q5ݢ¡cŭL[*C<0ʕ=㛯zΗtlFx?݃b(bm(CCL+qĥкm5-lέ}RD'e~zo|ӽ=w:WFP |p*Ў/H?ŀU6!T%VKe<zxC.|=ffBˢЛPdZ8_16D*T MmnZ6}Ldfa/p3!/sj+C)r\m*:HIGW\83-X0mXqΣ3*&oâer{Gxկ5E\~K@6o-.uFg;u)OTxx `㿅|.TaG¥}L7QY|&wPUKS8S][0~D7)v|1Y4%/SFucv/GQZhۖvÆ4e1 V c|3DqZegZ*VfCUVBk(|1D+RݯQic@go [w^i5}&wE7S&PdEm[J'E/C!p^ )]2y(DWˉJ&Y%\C(=ĕ+P0U< -X5MEAp, l 7P_{| )pK, KL؊1&S"}'D PтTT Sy alʈݱ.ԯr8Os d^ -\Һ"h!CJ P8%{QT1tC%;]\Bv@|źf<r$RTGpQ+M.FFw y\ ]t#~Y5ztˊJ;ep|K~Ua@߳$œ_sܖX -3Pb~# IT[ [Qܠ TqHqCSKɖZ -T |K\B]]Kp`1D5_J.cS_"=9XBFVk\ xy!ǢTSjf䖩 P )Rc m~ͱyJF\\:QxE*'(Cy*ٲ#~ H^|2r k?S͔5Pd̯¥MZ\6W 8Qnn0*[Zg)̨_PRf8\'%if`m!+R.7#uSĦ_QΡ qo >(G]W\0-* Va/(qP( ]R9.9`4>w1ˮ.Wc;[a'm:YOOL.|T-iޛ%SuR "G`P6hxT(zd>PO a/ PϿe,@B+J_"`I-e#` ^Jo0sG}0wGm.\ˊ!E?5s4#Y/㪊 S >hAv ę3Ġhn %択!Tj-w:_b`XۀX}۹X:'n!_%,V ={R@h0ܑkQe)آ"DZ?H{%$ڛnCЀl{nxrpQCW!1DiiPǩwъke4 Zg(Y+P*eڨX]]•o ]ԛil5l;Sǧ$|;]*@Dv-76\OjWO6iDͰxM Q,M 0{-!J-fW GnQ;gKA%8y#O.Hjc SRV E;F`SbZ!iϲV6#k}W-Tvz!p~ -mu/<1*%1qncgl/R*wVljrrGU$!9heBαoe2zVo\9 H|G7X2w*0W *wE* smŴ*diz2)T=R ĪFxoQ]35m2㤨A̦2fZ -e.^huǩ38 -M\H*QfjY.#_*8xcNZ` qN~(ͪ{}Vm+^cq[0~jjutE$J.!*<<gJeԪ mQ -£V;o7lԦP_`]U$U"Xq4@|zP\A!Wᯨ=7T JtkF ekd]F4*ˆB䆗1 upb!eдڬ|au<wY:2Q(#Bg,ڬٖU4kqR̥wSYU,r%soavn]Uz7 -(*AGlfCf:5j_,$t+_w[+gP&\9셤Ti 'YJb-E6E1j%@@=Źn$i˖͘l~ݲBIIW<ʵ<9Of?Zg%<|3DX% zE5W.G=`Pi_%]bQI[H%M Lҥ\+ɽF-R'[>" -nahL:rEb;{1 Y~YkܵiA <.\#p*#b2,UƊ䎡p􊻲`x2YןE(0-?o{a+^ܠrTUrod:\A=J-ŲU=- < Oi-Xtx*k+JHhJRfL.kg(aPc+K20fTeJ7q J|C?Lf+P%JN}[1583놸s)x{^](z\:ߋbqYu<2qEw@7n'*^iy`57Q,x`> EjKu)QL}CESgB@Oc3=)iN?zE6rە1E2,7.ݵom Qko ]!@ + OP6ex}Y|QrxxB1N30崳 x:iLN tm͞ '4CQ_Tyg*`T3UihbdaWliT\CS#K ίAk^ӆT/Cy - -X\aPawkV iP Q v'.H=m)0..45!n*(Aol0&U:OD"ڥ\13gt-gY\?$2mD;>{;*jr!LtXܩP)0[-yAnd/l+0 z-PGNh 5Agmf.%|O% -dD/dK@_EF,7$:A3 -pƗ'q⹪wɣwK -lG{5kYpH;'lΉ+DBĔ ԋy"ّߔt#`#=8WLvO PBygNjFfu {p/Qb\5F4- wU}:ܓdt!1*bI]1ׅ&Ώ9kdՖȈ5/QqlEGEL"vB?" LhԻoPz5R4upK"V+/W;鸂JӖ>j30NDՠ4x}|vSc?P*OGbol2+X7K%6Yx˦ kCV{c5R"Z_عt@Htbvm ve+aU`ؔj"U *W @nc-jEzKR V{o#|u |'TVMXX2>=]SiƐZY|蔹LoUݰlߝEmr+=-5?qز@d;%[Z?3_b/DBe`YcZځBO*4@vG02xx<=+5 mh jc&@] -UX<$_`JBih -#BYPR™K-.2&Wirsfju2w{ - iۣ -۽M.Y : &yI -}!Ye5*^/do^O*e+- H'/P^U>żue΢Ti%pj>;n\>5އQ^7 -6,J=:h(:!kp={}(4Y`+-kqBC:eL~e}rlg3b ?Ԧ[nPr_4b@CC7d[|ZO(K(յ<pS-j!N%uKp60Rd*7S|Z!Us{jt,4T,PLL u~~h{(1峓 "cޖk@T?!3tRHCrC,QN£\h`tP!|y!.r/~H`X- cY6E3&uZ8<cqEp̴A~瞿 -Sd8Iw¼yKgܸ6/>lIw.a_fBP*:~L5n•U&ղ\ -cqځYAݭ}{ A : -Pk)+ *JTh\i| 7E/pW7qԦ࣡齋'r@1l ϵn}$?fm] 4,u |?[8RyHTV͐S꤇ǭZi'0$ㅗ[]ruJY3KSM"&Toa@EP[IrK<%Q6h> \A#3 CE5en]e}J[b i4 ujҲ6E0/v,Df@2 T%资Avta<2?LDLwf޺#ܗ}6I#29M`āw"Rwh]FLC*_Q=+|āb+j#"97I@#`αђ1siIg@/] -`+V:zio:_u>d8 -_R*]BbP!*JSl) -%Z[s<ղ8oP(.ڠ,7œ& [!L2,Mt"FӂӺM'}piWFl3S*1UdfVt25U,1@YN>!SW%s0!n3~cg2%˅TyjxXs)aaXM9 [x(`^L܍?̇"E0Y Jʺ,-XO՗%#SIsbE%1lkP&HE%N! #kzнoq_2á 4, -% wP*Ρ8e5hh}Uu5Pj (pen+[˘[nYE]ĭpW,uxj;q}衖?IGX\2C`^QF-gq*%PT~!nR?ۋj(S#q.^ڟnZf5K!W!zK ^ĵ}33 /jJ4'9kg+?q*1bkL_/.~IҜ<. Q'Ddh}ͱl-~y2emT$+<\QZmz;|yd< ؼGpښr%A p}$jJAZbq -qJ5J79)W ->Xl%Լj,Չ^/w\S4fWG+Hk)ARE"jz!mDE]|"NjH wh_=4$=(V7D%&bgiw/)Tͱ#e\-(w-Xni2jd9ltḲmݦ#B)`%PESx^$q"lE&ȫe -~)?rۯ>KfQj-v,v|y_\a;fi"%L*Wt(!g/f'F5Ve{-l= : wPX@-w{b1 WQI#m8.,an3m!hl*>+^6Im ї-x; t|3T;Ŗ٧e6ymK~?ֆfe K~SgH NAM\l @+UpQV)z:p]Xy9bBT4VU\\$COchTfubP&r/MLSVWxV+ܪiao YVNsٛNПg]])}EV&t?%)o-'>ŴsS*0$ĻGjw0$ ~p%+̎|Q ND;IGW!6E5ˋW'/2!Ie'"$ebTCzpirJ{^Si_*fWpHn5lҁKL2p9%ChĹdr6,'qg\ӢHІ "TyZ` {yb:YwHje,zqo%W/4S'Š<⩛ſldXnPStQDfr"[ !N:x?^+|d㿪Y Lr8RQ {oA7O@ 29QT -ͩ-utݹj0p}7j>nh'ƯcQGL |PXn-m>l'PhH,JXjz`7BjἸ -B)vj gt:O*6ų.hWmָ/菈UGb:aqP+1|_/σىr3sL7R~>|LdSo]OQ%%J9IPwĪto5fwpwɥtX:DL+R&L e[bw,< B`_DܮR?"E, }"2!O cvPf¥ @D[ab"U&˖9upT0\rc7Ī̾)|I))F5X-z/Q0Ե(&vh%yi|X[={jᲮ2;JFFP`交J6A7jnP_"ޟE PwQ -:T`02,t - Bb& \p,G:ؔCiX|v0"WɷiVA_bh(+5!R n$a+\V5-B#|Q1!s\m3:nXH]*%6_65FANK.^%;7g$)a/%}WI[Tװi<=eZ7r:?0z]r+kYMF](2˭Bp\#*4fM&P͕En/e\.oJ*@Qe rʼn-n;n2}%'ʬddF[`55ђPDS ||∐3|bxuŚ -7='x<7$_` 7Âcչw08 l ȗ 14!p5 -/Cw0je# -"zIF”P(6=a5iFt 5?0ܯ\|eEsSM?=ՑŜ&Ц^\UAPq7&D6az1%iҠTZD\hTA0n.`cF82nG-H U!fm [i~ ;8pc׸ -A]~+l>( -TbTDɍGe2lL[L0҆2ڨ].6/f);Iz?xJ>j6\ -6xyc~dXW' $ -.HNXtʸ=S\y\B*VT=D++e!R*cqߥ\nHu A.m=Ca!.kOP) \"FQ򚊩9lXii(\OKy.:x72si%30 'Q.dvgAzRylK0j,bdW'a5e "!YR[g= -n[ZeTk$)& ߦY`*r,4BAUi@leͅCJ ~Qor9TEkPRdcTԧAPSq)o2anV+^{\VԕP/?"\ z3S~e+2RWROi`jjLTfv)^Ot(şxYU<1?,\zmzu.@WYbwwڕ̮ƦrL#r:iv֩#=N贫J %bwQc˓oVflO.nr._d;a,6B'Ƙ˄[\b2Cv|s_w -7|xfSqnU2>pʾ]ù{)6`#q@~p63VW0_X/PO]_%[-r.U -'j'Ac:lREtM_#߁ cn J猓JĪ- ~gr'x.y`-Gx4)lĪd篃S Qf<2$vAϦ/H{0v:,뾖d؊ݬU5L aMrF]E2eΦKԞۥ]D&TTQN#0XFMȕRso$3 -J#@( U]+NwvJ}z%<TupE!>ǘ_(drU}7 TK6] T-~Dۅ4ԪTSuKF"Ia5\`Cfr7iY߿K!vx0] )0ʌ,h^REPcq`2q;!t#Q*V0E@]W=2i3@ -UTRX0^'GQ*y~@BTJ=՛e*\~^W†|2MApaN3*]z:ߌ -VtD&5X@U=R* .cMbЅ`h-݀ _+q"&0ub蔖b5RQ - )1seZ~!QWV2y^Kbక?QLKbtz+zDNW.DSNB@Qzͫ(COkl=i0-F`$ -n0PADju?zrBTX;nw=̩^riG@{+ԩ\j?-ˋ_u7_n?ņdj,Vm_ ݿ݅Wl.ZA+ O#' ]WH*X07}u[&` `yuCE"/J4tv] xEbKmVp 3:b N(#iM6x`1HڑQP~wp5+20AJ8urj^%ɺCKxy%G/7j'zmDS BUPgL.1qT"se`$1a &P; ;/mJޘ8L#UFkq@ qF$Q>XT~޴i`ZU~dBBcD9V2T$fp3Ayh5Ʋ:@+f߭4ꠎQ5|? bgF -*`(qRpAS4PDf9%>V6uW*XGt9\; -ПAWe(/.wG|02=M˩'Jg6< -Cc+t76N!2(X -,\wLQآ'3ߞ*ۃYo{ A]]JbטQ^N37$gNsI5:R. BwSYŠに/ΎCiDuT>z.YZb4O;3V'qjp[x%6Be/+,VџmKq!i Q^TL72h.JPHkUw > vɚ쉱R -àrjyvQkHE6 Q \5pB1#S&feWBho]2"\.ejƨQwg["59qD75(@\Gr]+S/zX%*$+M M|6\/ow6]_!#t'[}@DL_;1-*e뒿?tۈ$|{F]be?S |!H)3ZM@W ^炤we[hEm@n .ω}w A:Ltg#KEAޠAh.Y\RWEp*/Vcj ;M"P?Dq7qJmV%<{͹H+fL-tW,]_5vyZmerj , {m$$(zF<,]RQhm :ffn+mRaP؋(%6.eyrYGW 6ʙ T -5eqxk;0Zɣ-߳rl38)+&|Eb]{_-+q\"f ƪI D޾ƙqOk0cq]K5chA 6S,?l@Hm&UTZ! D$Y3Kcnѷ#5f޻ie;+jFڊT^ -$_fX d F R^T(E\ h 鏃gdUJ(<$5ݤAU6@K˂͂իڋ} -T*V0Xs8526@Z,/RN= KǞuDYrĦm?FKQ[<-MeK hܶ[eJ%˕;/e&!LLryH-Ln'Qw_%LiR$D(HoSP"J}\Ԩb|cZcHB\;s0BUSIѺf\\JLa*Pfv*`˿ͣF\<@A%}2_`/%aO a׀ND" ׬FWepԳ .Ct3 )yO,WRP(-~a q+,ޮR~;9{9O2Vh%kXRh\wd`=3I51->Nb$ -¬|/&*"R06Co)CW SfT˄>["8xgapVE(sBFb1^ 1F lI; P|##M40W[)2V1qnX&Pq7\S$$3yHVRpj+VE2q$a֥3`Xc/4"!<:PB#Z4-G8c (xgߝH(6NZ1+;?X}ĊN09Fnj,Ze P7E~o^x MeVzEg%(/$U}yvV;[_j,r|vj -d+.QiQU_ $E׋t>B -{c1WDL +z%sGZJhȧ0d#?PU험ppw1`$ -\Kol+w1 q8W*; 0v6 핥<#'3ZP}iѐ>XɄ<?Cr`o wL -mbp]k쳠S"bn%S 0> .c22:Taqqy7"D"y0l_]  았pLv˃w5 2vSQ`ӓJDJ5qFWr+Xmq<-?0 oˆȯ> e*  Ú 7_% Oc"BWs*'UNnvXBVo-$FSgB<PbZw|:nؠl%^wAB =ǥ V+,hCQ/l`iZϼ-iZmxN|%a/s犽MDrSPpm0x:j7S1 Wp} %-HԵAD 1-)%;J -jH53F$NB;BڋDE{ b[ 9MA,ОHq"ܩR~d̺}EǸWmd?yԧ(4C4+"![¼D| d$iH_ {T<܃UCR?J~y1!c`)heA.ֵ-U^V2~1a*|jTQrbfAY B9[.=/쫠ĺ ޥk 88s0TT2L@L1:

d ˬ ❹Y!1$脦RNA|l i.y{句Lەx%IERv!G3êu'q -^}l>Y⡎)݅Gì 4t%PR"3,dsޡL`@s& N[y\{$11,H"<^9s̢Wqg'@-8-wyqL˟mWۛvL;bڑ(Aݚ'}vRR1- 0-T?\{ϹS|TP(?d EgSlp0W,uBɱ+k/ aF9:Ju0;~&ڜQҗȠ3x욂>ϻژ -@.&9R,LP/K /q>/OGM΁-lsq`p:*ye'W`$:n\ZX}WDZcpWp OרgATċUU+w<~?x',YJL5(`C3vIStKf:Yd_w -qc;_nMzd̛J嘚[Ej]{H+`^K˩y5 Pr|{%|uiԷG8~ ^b2gƦ%F.8厈x4 Q -j0z!0fu*1XL?sFD~Yo*KvPNqBXazBVv E` @ے%&RZowې` EBs> w -簗Rt^8\a|< s_ 5o#Bd ᆭ|-ⓡe;}K~ۨql3ISbB)\\.Sq|Ĉ2{<@Ac?eDr+#.YVv61/KJWl&MjlD:n=M|/0#zO<# H -FJ|QD :Ԙ1jb΂-b3U,+P16Xm=IBne" U"]VHnk=R,˖VeeX=i -\\+?+.rLm&mWT蹎JŃZ@"TVjnY ^[Tj|Iյ0NjUr.aʹcþ7-fXS1/rF %│#7tRXOm$1J#X:|*ousmk*h' UYuи\ab'zf@FuɓzU>ue#1TFֈMa)YJ1pcmm[OKFA0j<=wL=*7e0[U/̯ >h0ʕ5P,xjB W*T*;a-[ _e"0ceFۊ6e"݆5ycWrȅ,.Z*U%ԥ%ԥ -=CgJ;U:JbenwqU'tF73$x.SElz*V dذ ~.˗r$ -.˦5)+><8eKǾF\cCQHA{J+ws\Tq#)"ʌ%MzH̠d[e%W+:cka#r;ߢ0mpXC;E\- X/Æ܊8Pҙ_=E ]fD: - K,n ! }뢺=RB^4Ka*v5P/Wpj! \3n[R97+wǓt+QZh]ޫ˵ -D^|F-3g||Zx13#Ku.-B* -~Gx`U,#P`UcEOQ7!a=H_q!JjX m ]kZ&m{!]eZFU)GCPi.4,%n.x<I 6Y=]Q(‘9FCtЅ Y=ґ#BӁWkdSf^kJ OqxD5s$rl~ɖ˝WZB q*)eu% F-*v(eo>U6B6 *dT{*+P$ _fU\7@, BXj@UL$ctFxX\nPt@A[b?Yg("J+2^ ^njKpj\JAE}8=Jv [h%cEBv7\PE`#ZcH$܇" iV1#Ü WK!LDaO#ʸ-BiZc/+ɒ&hKPi^~VIw+BTޮZk~Yx؍\~xR mP:mU^UqxT< +/UoM6np$WW:)[B4ffT͇F^:ܪ#[KQqpX#0||T+q1LW$+dd0ğ\/ChԹSv#PM)~~O5SN}\`ThpǩoEe$R}4zs_Xᗆeqm5 l_Jhd5jѽE\}!skZ"AeÝ?M`LE|GGԕ_gkz+mkUJ-!u jv!Ҙ_rXɿJh`>. -)4Cf -ĕ5i)(f5 "d+[6F 5п78u$]LݑZs࿅TLT|VΦnw|P5nV$Q 1)(bEZ@ -V,T}5/R8vNzS;}lAol~hV61y/En6z3W/.IL&QeG??3 -"yA8'قʈ,֪Ya \] -z{z]ǀl6:R%yP*y%4p%C'|,2mơ `+m'NԬU#؀SV x1ݡJR¸!D̷Pj\> ^2u4WVJq\bUpN1PS=U@^i@'=%&#/8XI%ӷq7H Ip_ -%A%j(mPGdw]C$w=h yl*i`DZ'n9IWYHbB>ы}.-$[{_~ݎaD koMGcBI#ei.n'Sp -"4PZ[,Ԥ; iX+RLjI./˒`/pOFInp #E/a1}$Vje9LDԦµ gokLfniL> .&ˢYn~x,17-e.㲺 - &Ɫʚ~r؏i[S=jaA.: ԹvoWzFYZefBIT̂)H4湨j!+%\nf^OxSfbVcpsTq5sG]FT^%򀊊@G,u ljhc&ef$KKwnzR.<A3 ]V..UP -"*JK<2\^ - )?)̭Z)P8Tq[H[ -Ul`xY\P+xܣ >h5DSlPSH X[[xl:2o싟͈'|8)! ?jqj0DļjTq[]rˎ#Ej3¦U6jz᦭<)+Wg|QG c֊c6=K҃%.4c4!G$ibpSYЎa|4A:Īj^8ldya ^p.@Ž0 --Gu5HJ7uB+gD|eWR;w3u3wNܷW Ln*fZU\ه.\}-]PYkSU@"I=5UmWlwn[%AwT,3ZxK^O}3~ _ Ib5\S DuuP XPFr!5S+`gem)XvCV r^#U:+,R)&o tZ)5 Gx{C;-a$[S\WqQhQ ^_GtGw\'¥w ;op+o00M'?eFLfeJDj8𚼷9jae'EbphTθ8",׸#[缾׿rZ;T-?7&5~A¢ -\6e -~uٕZʯ2*'_H&Z| aJ) U#]1ABEp2YbfW|y@<˚¹*vGs6|=ciB^qTf?CEL캊lD9":[R|h[;=u0<<%EJPA@iN/ߊy%5nLAI) Kˁɺ`dm^g ؠIPmWԎƿBV}Cp T"`@[hA?f6l V>tƣxu땎; >2IțQBSD > MX~`'go#3q3ݙIT}ŏȬ(ҥp1 K8M6 6uf8^-!%B"7kRL :Nv>*Ct԰XiV8mm =ST_̹RF*/ǨFx 73i[{*E*zp#}<.mA_ 4^fg1 {%^x 1XW" 8^HԣzGqTV-rQKjrr"X "*wd̗~e9M*عp}^'j>,#aEfe  _JOhfV "B%:G)QJK`MoY܃.V:=?^߰"rĮ.Cp.8( M2&.Rn!%kQzs^rB-JK)@XF~b<Ǝ*Ww9gdP -0F9k, QQZH_+&L8ep)X_rKnMtj.l}.Bf_FZ`xRienTU@Xͼ/rŧQR -X_!mbFI7 3씻j֟~K?D J>:8X -)A5c哺5U YU"~\ bxq uݻDl_ߞio)ech0_&>6-)k=p)iHQ~)Q,zLP&;S - -$V|kgNO;e_R9ȾqQ਴%ЉAZ-(uh6/ E -8.6O]7K6=cLGyff==M7+ZmtANDPɂĥ8@ Dr-$ 15-T5JMBHGW `1 -eu*v-)UWEۂvL2/:pr1mDmDYSY,/JM[Uaf)ܧk.\ݏ~MF܇@u -Q.vpicl5SXQ)* NF7PR %To;jdʦu+4awJAf̾7{JmH<ܿquT%%41Ʌ]mR֢n=4_rMobja4U[tUL%b[:>teKjwr'ŖWj0EjO&M+-lid+ǯnor؊̉8Ftج '0AE7",U_X][B}¤ .a̩vfmop|,p|˘8>wP4)F)e$x -IVR.pԂ䭲e2pF-@^CO=. 0lupBec1_r&n t 1Rsԋ?Ѻ.k:+Ԧ!L4N.E%˙SC|3rArUzA_ipͶ=Yk}BYΙ^)TTcT% St.^NRv۟etJ@ef OOb?BdR]Հx^*CF+j/P 2,$o~";ϳ%F홪B0NuRFcuNX!aڕT(v}uuYP A_Pe@M*]0ndRwR̰2hvYj?K&baeq+ųd*#F"%E:RF DU#uB%Zr h閃9Ztcb7mּ9_,aM73*=>w)u+W\6[+Q> s,p.3 (s|+/;X";1|ܳR - +/2 Ko EP}E{J2<Ý]. =(8z~Ze4WeO]7: -qP!u떍pPK3i[/*ĢOpÍqqEl⬤T2.w/dei]ˉxnM2ngu O\VXpN.Љ3"rgM5M'%l7 +DBL }y(q[&2%f&M3Dqljj@W" -gHM_ i3, ق,+-Zj<+J;/8ȏqƣeϖilyv $V۩^L)/A,Jodx#n+ dĭMBsjamtIqj+2ܪ>5gWhG?ϲ]rYvnab,ngĵK. -\TRBtV 렱IHKՐƈzSK9A:Dec Uq}s'5RJhW5喉\keIԬ@0ROsOZRSiՐ(~5,ReX[/JjK;pLнĥڅuPQǸ;3~n]c 5/{V+<+bxߪhT`\0J٨FDpܧ}FDAlnQ#a%B଱+ZE"p#uuaynU9B;*o%=kG]۳bxS;&z!/i[? ץa1`aX/rڪR[Fõ%Yxpjڧ͸#Md TmV#)rC+ܱ @FicsYvܪG/P18!]Sr>":X˫!aw/ֈUqk1GgByֵӞ%HEosW󥻭KB˚Kmgac=Lv9]Erq}S@_3iP?yTKALU_ۘ-ÌXLTa0W0( y~p}b{sMROĶ'x*3[keX7n$Cl^TɊT3]N~z#/gl%b΋^ˢ IZ5=ìBiZcB=0WqeB&g]4p_~7UyG'vD@5 fm;M'/<y e.;7-ku{^XViu;\@N.'14$_:-Lɪ?كlSY|;Aew?&xNɮ@yDHX,08re&W.t_[[S~.bfmETTsU2ŢOz\G/(pDϜxq瀪p0+JNDpS (kPh/5KŶG'Zh4<^ -ų+ g9Ga;Ϟ=y`:Yժe[P_q lrU }Wy~uºĪg22f]i!EUn#Ju3@?_@-=˞vRv3=XТEfGG)-BU -ǩew!QKOD() HcL 5.yK'v?-sk2KR[ P Lap0o{Rz% j3;9aߕI>'K/a -L8.WD⥄sw(=Sd7Y'WKXm'c -_3/*\Ows5{BjTj[ $9qoEAUQo9GMt a0q̨|/?l"ܾ1;GS[oH@D#6)ULD4ɜpPC0XBKnc+s\^+W:3[|Gi Ks}Y.Iqܿ-暷2GWP98e 8/j]:.;GK~<$l"*vtmQ4 *{#XS -i#Mz~,Y|_d/hASƩzDQ~ 0nw="Ҹ&+.%W&gآJ|j+Q(ZLYwJ?&mA2I(%ybR*;+FUkNqaɩPZ0_Ԛx萟C!M^_y ~+,.8*de gu -pe7$7.AMqW,/y;yKǂKY>[@xPG f;뚒7L44Niw=wv0UZ,Csz='vXXʗtOA0٩3*=gEV>#*XYNv]ADqH;imv#3iHhPA:؁m@DSћ%P"^騜 ._S+t=\Nh1=K@B4\zni3pU -&VYx !y4Rڸv..e]qBy)5@**7_'"R=$Zid'Ld DRei>q慁M=^UEvA>5|']1E*P+E0 zQvIxΩ< uH$=gDrbyC2-l-=[.V5$<>K;Ѹg+0hٸ,f)F_@L]vKa.%(tP*.VEFsq[pWN"yOT֤a_VމgX.SmA -!:TA:}5|2J UmgsQ|S,bF +OõHP%S8^/_jk/ȫ6H:zMǢ&UX2k8=Nޞ`ԡ?SKbç0#‹P!n^YW@pgLY~ȍGIKƃ5 MMÃSBfSMgp=a̡pqK :J> dYl3C*U6\SxP2߿R߶y\ fԪĺ_PC#oNU4<{w6@`yjBtYEVj*03ر;E]qZ`w75 .ZWBZ߯E)_B6ILn/h\P9a̮ob(YQ PBf:!;_O2Y Eև[j'+^caFz([/dIj'[5/5 rIZPq'l'bK,LJԖETh܄FBe#zVEYOڐ#Z c(̏8tiuKd'YT V[;i(ďmg  -aAv4xܳG@P({eV\+kyC4M^o*9h_3s]TRI`G#ΑOvHgclvEUWcRG:jJ)`^Zkm`*c4^  lR]41S 58ɜ슥[ 4Ai+ғB%khbM[UnXqćaXD)m7e*s:VVሼXrt-q/Yzv՘?-$_"c.@-SKj*ofuV oaMcQ-xS #f*IEuNZh|i60[e5IUʤi{68 e}į^=L#7R'3’,?0h:na -/,+~~.xi<+_%+-kKdihz&?P'cީ7ߌ%|R(_EWwe3̈́B v_ a2BDSɸWP[Qn8pM֮`+.\Q1G1yXd!%1 -/m~x arC(GwpUC೨+gz'{BhpBulq -PgP7h蔳*A"!m$UwbO}`z.f!GEB4 x!VIq%EcSȋ`7v .URYyS)RֲZZ7/*fE˜.{i9nVQ~YbTMț7G̪d._rZVP,\"suFt?\+ETcbҥ$oq/ XQX5*:Ul_ m@TCyKjF`7L`&1u%<-2;l!ÿjnl#ۼas](w߼>'3v~=1V((zmNjP_l%5&%wj&JhO ޲׀h/lVhqr'vMJ 52e72p@q$_X3ܛG@o&!_4 g%B.%[FGKqTAhZ4vmIkqVvxuQI}jN5 8M΢K#}|. P*~9~`WW#,eJ&8opV6d$WFT(82> -s<.wY] mB6w3ۜVPbu+a3l=,j_dJf+x#?Im|W ,a3Lʽk3.i0Ra`e%[ LBùP!J1D4W|x/#Nʮ‰g䝒<=rzT=|R#\w1Z⯃HG|?3iRu) -pF9]x -ś?*[xwfx [ x|J[K,BψݿRϪA U7W5Ot!W| -KoomcS3晛 qc*˘Fۙ6JJ3&m>Dh:-"hMÅ ωb^ӍWRo!Ddl/TBCU?7pW?Z7-ʖ9NV(T$_#C?quƎ7R0)0,kn\uM| ,k(Fycpܲc\o\. ;kP#6 %TkoQɹ+"0ix~+Hpp%b~u >_!AuPL1~I\U08}G~3f<\b/.\x`lQ) [mbd6v Zoց+i/l#xbm.чPZH?] ZLK݄3ʛZ*ms.R<xqQ2B u5ЅRyUxY+.y/j u!%i>̨6< Y1n_Ԩ0Tn+k .^wsg;7Us4xT]&;$t -`'B$e8*b4-F buݶ%+9>&:Զ+\21LbWp UR( N(ka4 ̕n| -|&'URڂV(@ [%kͳ1䫰QqGٛon5x@+PfAL ܡ TOdsqqyXML /0Uʕ<kM\8r2EKrC{e>a,-ۅ.}~(/ -һ\*(cSŵP[hy5L̋vAu8Nn5 -"#]ou=<.")]5NlCPu.h>, \!>,,FHPl:T( 2Ku jT*e/P,<p*QF]Coa׌-6D]7It ϫt꡵f7(!MZ|O5RU֞1/tFm:PUz֠*"Oos u%̫aW|-{yp34C!T%3|+iq,:y'հÙtTe(hq( (!|k09 -(C*㭫@V3J-xj@n\yl^#=$Gd!3W;/;y,"[lY.^| ׺pcկe \ԬLl!Uu -Fn G 6K/, UοKR!p~(=G2+`KJ{bS(\Mzdk[XR|SȊH[0 Wk!~XG9Ki{(}HDt_B/cuB'SSId"uڏRE8f1h2jU`<:38W up'PTJ7WbmJ14j;o|*WT Еjv £k K,+*c+/W*&kc/̿.aT˺qNvv)G88O%Ḣ}l}kj/U.֧ѐ/'s-vB -QFʲt.7PF%]Ꮈ&8x}  -߭6J#+"n.PT)AFIBTagơKπ#' Iv*~Bٴ/[׬lnf~5)8a:Ԩ+n#-i1Kf)QmJ_.3\*W#%`6|N4_E{w"."QVKu4qVPә\W*2nK1H .4W%.5rVn *iirA }&LX OB mZ,W^1GM+R-'De~-%H1"V jў ݜ+UcÆq\up(RD^z5XVx0{9gSIԜ{:&nN:r,UV_7/az0ҧ! nKV=N٢>ː1/\RtGU.*b-?R檠t".Dr.ѝIxKJ|TE6y$|?X{n_j6ok`8A> 1iBG"?9HDԬBccHz-B$ީ{Ml,_R3BwCgU]mu?2H/ m -bZ݃W mH}=BOߨ-% ɶo{4̕h'`h#椒_ rjE-ƗPL%s7̞eDs:ÿr -=J^ԿmлCYkX -Ət=v$g]+"EV8|5U5B7S6LaggA\:3̓)uT-5%|3e7.hA9U"Wq@~,7.X/13(%CM|JghXq˴,,[ݖ}yu68cBTJUjs4Re]ɑ [G]ť`~nS:TLz5I0jط8X-g .-I-NHIY 9Vwij|5s*JƖa־La$NVye@]12n_R i/.8B^i,[׻F{Dy\TǸ|N啩LJ/pLTQP.EJe@d^㌱ZgLU{%e?$Zr &}+ IrA3`0)Q#j;xJ. iܬ^7%[&EDJpMk'㔗x^W勷'me.i[8*DFȄ IU[nڲ6;\1aLp'lJpK˾fHkj$w}x5d.53h8/P!0uqxu(._ -rj~x_ķ#D  ^ዧܸ(Tŷ$S ' ']Ǫ3P03Kju*Sa1(?+5w*5EJz*:>kx<(imؑQdۥZʦ+^TzDy*wYp@)Dz~ 4&Έmh^ j*qX a5>77tFnR=?i;RǷBRBT:ls|!:`KS|r̕{4˛N] E&,o.,2tyͷ\+r O d<%{l*<%J[ًnI-K Uɍs\@5 [3OHNTs Vza"m<&lU郖}r 7p ÆDMhҭf@Je{ܠf_A bRU;.ޣBw] -e2>*wߖd{d˺ܥ͛W6wq`]JnǕ,*|XoV qw⅖Cgmk,SMgeD 3KӺQ`-Pӕˤˆ1pcg¾wx­lm9 /lUjw\+I7Pn \FQFku[wBŧ]me0{zdߗŃuV)[N\HBòuW[⑒,aAr5S`˘wb2(i_1~PZ)|*eV%J*†:gjZM]\8 >KqFO1^0TeEPVѺ*o(Cc(G~zȲf,ݚ0^)S &8ز1'3 UuheIJo'Q?lq(8O{:+ #17ࡅ&v();[zfL)IBTܬEu*}@7* j\~ G'/|S,4HG[t:g DH@HوZ.Ue&}AR\^9.*詞:ĨGY~$r!y6cfϹTmʣv&㠬/,&u4Z܍%S2 ƒ6kHnm㼫:Sb[ X MDx \{'|D1<˘Ѫa2M66vAFbʇ-B fN*_qy~Yw5:]UxY= bTfV;9P3/ԧ.Gd)y'$!1yiYA-ds4 \;<*4/yC ЃV?PA6Sj+EJ|^"X aBxV B@'[TY}砆wR}Sgtnڀ靲՜6ֺlcj7K\B#B D :s ԗzgI^M=OeX<^BT? zq_5`O?EL(ty/(R*td?>3@ .-*P{^ڑ[gEepqZ't˟R&s6yբB+$qY%nWS^WGUAffb T\]FTf̌J*+ 1-^TZĵR`͞2Va ]s<_~!Cr\\'I?Dx73˗/ -b׈.+C$DAk[ `HtsmTeҭ%~J%b$c'n[ԸerɎ3*}y^8zT-Og!ŸS3\ n B{[xlphmҲ~@!K_7/_CMa51Zj`1(AѤI~ WЊ-5"y^U+UL6 jWQ*3r\+7|3|PAƙPխYc;CI{;?X7ȑg7>5&?`ctXBP J8|ǖ=@r.[ -BRW5*R76r7UjaN V2ii%ϨiyxsMW« -F{TVx@b2Q<~"4 olПx@Ѕ|v͒K&ǝ ^ƙE crSܼ -۝c&ȝF7H.Z[\Z['TRʃY@jhI0-yf$|?x^L B~;4%K\-rtl*bp[/R?͘Wd$Rl;S RJ+ZH9h]b^YzǹoF? -|$У `-dncذ"GF! xmj( -Ԯz}R_zʕ؂>z%a ʟuCPٌcʘf1=MeXUlϠcpfClH>g;+XP:(rW|Uj_Ǩ[pzxwnHRngyu\)/0F"J1*hXŹ+讳[V.1wmym!z6oj~漖 -{hQIVhG)g?i~Q~ɖ[p|E y0upw,x[˻ \!(;GS^f1rnWYd#4 -| /5\0щR}tK-]yz(4/>/PLKu9.f]onk[%"j3!iGj2F-̯4Jjeƿ*--p: -"Q<̃xa7!PKtб-linqO^3G3 _,CLb*=ٶJBG*:M7ɮ+tb9$zI*ḟ ,CUpN a~3bl ,AHc:g'7_ ZUV0AAgl֨GD1* e} d;n#yI -Cەh27p.7B >=K5u ~yvU¬/ JKx*Ww2/qR?*J%F 9JfOFv00Ӧ(-32ڒ37g=O` d0+;hA%WM P jz$D!{3ײƟʝH|`eg,K׽qSspjXOMX'6x8_LS[]ku=-ToіJFlnEU "{\&"06 K?<;} 9]"kұ=/;kl>N|Aqqg(̃]]yt7d@z/h%1͖FOK0bang 哝")2q\"4/x@v -HkCy dG'C Pƽp̫AnQ;'Ž>-,Ud*XtgHGgYjT&z,0%daD3P'R<_yψ?:'fZԼ\ͩubJǵV*E.דqҰAjp†=rˮ.ype+20U/Nji.Y3/RB^P?X t-jTtTƊUY0z͓H):\ĵ52F2Fun8k.F,ݘ}?O4giaʷ%3SPPflO1bˠSdX bbwnj`rV;s ntGzBQE4w}%RþjXE;Y/mNw~bIO k0WO<<Un\BSԴ3oͰPT-̿o=)Mґ6nbBtΉKY (X'I+݆faP)ݱ6qp ڹ7ۻ%u> lQ=C -:\Cww˩]K̵ʞe]aeP: - Gz61m]"ayt5D|m @ê@aغ,9KEw_RGY71R:b/41f@ps1_eB*V: G7|Q;u:lWk:f+b^vu={+P8FQʢ7/K(+pŞȭЌ6w\L p{ 0x8]u -#߆ʓ Z#E'۠ͱOe5D,-j|%ƢCX/_㳚_rGIc+G7bSXjRVO _HxEn+7* -5So@@(|ܫ+[ua>e{ Vl@0x1y"!q_*eVSB5<!k0Mh鄐 UV7wXQtNUN׆Søf$F_ТB$˶E4{EPS3pQ,ͶbF7nkPrMLeķV%E/6 -@Jyd 蕙\PZ@>X~sf MNSC<=S-F5{W]/[Cr2j:XmoWD=K.jVY -= t%6N7^]T AkGxΡQxM#cuWI޲T*sOkSz3V?//1ĻY%h6A@' aEkL:0:3LQ*viYHܥh8P≭lJxM@Y Ѵp5.)zP?pJ ȏ_O'BWCT(RJtPQgF5}V[,ڕ\+/ -숼Mu1b~KЀ&.sB;mD8Ϧ$ y5]|;_,[,`|+#cfx,V`䎴LT Gŗ wqK'+Uv{ҰթjM]Em.ŴGԬ8T|.EVѹQڌ RM -_e55MT~lPC2r00L";y -QF 1@ /5bxu?%*clPP|.4 eZrƸ.;F:yTenջs;('_}Y^]/n@iQ})KJ?qtU*VGRt j , Z[;VLKpppTeJeh\x0NO"Z= 嘛&*:2jԵEHǤ~b,"jI $rJj_RR˾+~GZ./fL#2-y8z8}Yn͘kݗ26@q(/3?qT\T\CKJ-\zN~z$G4P*nUً&BM5Hg,¨[v+r*HBoZ7аE\6 qգv+Fy݇Жyju0M616 6\T}SJ[Xkz֑+*ƥw@:n!Z) -څsOjo -MĘbߒ7Md -mZ ˎ:$\-wONHrᴌ2-5EyZ s/Abf3H^ -=(TtW³RB55RͤeϾ |>531V(+o;˸Q#v=f OS0WB$tgjE +.;iELmf5SSUթtyQǽ&|,mZ0QG8jZ3_ГBcCQF]hTX; R~J`u[h Aw~ YxM!px) r}pw2?Am-AEI7ZW @ttz5˝)t |Y:Ow҅&RBd}/ TWXM$^7B9̶b;O1c;/ziwxR uҺ'LlX5-c%Ym";4pfKzens -!R1cr#͉qW-A#$OxUp]x&n%A,rܲW lzeه8>  v긣ܾr2@XG Ke - .2F$U䎤(cK* rf^B"ogb6c\n8NMK1c,#Glj[$ -4ti:a܂OS?x`t},SkPbfaU+g|P*vSI~9 q+pȭ~bܻձPXE᮳=(a F3=1 Y*fa};H[.J?TX\}̳05nPJT*Uu,H5_ӡq7j")RR?}0ﷷ櫠̪Zǹc\ /Îr_CQc/{FdvRAL~Y-P`6[XYRIp6DQ6DǿJp2qJ¸x -WL h'_hi@D)y`2r@ILG-hCA^%p^ 4ǻDM9#HH%pM/9T{ aK{Y?Pg .F1_3zbh(KGܩ]C+lB22-J$ -cat@F>D,bkQ"ò4bЈU4M}4 -b BSܧ?B/.0)L`vOt(̫e |'GܵQq mLVP6 u6Ex,*y][/RVɵӣU#!.ʖ@|3s}ŭeM{-!%+BuTSvc=_ȋ[F}}_] ΃xY!퉅]ߙkq\({36F EZ,ZwQyJТ?8;ƪvܨZXn3 Lx˜+hTK!p&Z|¥sJE7 vػj(wvnj1sZL Xp>H:-nl!m4v6PGVFiξ# qy%aM] x-]ɱN/T'#7ˍ_Wq4Z:3w„?,qBS\W 7}#GTg4 fO뢲X_R @-&5c-mx~ZH^l²'ForXc6,JB+!R]vBڃ<([aCreZ%^)VgO)wM[Dl+7ԺaDܼ]w.O9u˷*@TBhmjd>-23R̽ff5YU -}J5 㤸yr`WQgB\.+^l&PAޛlWKq< pZ&c\#Q kuÿ74S4\k BdۓXF7b3SS+,T*O -mOGV[ B: -XT"mqKNNA@y#LԚH݅B:!^.^eKEHT/ơc)Aw]4`XcQ%<ذ v\^$A:&/M~ԙ^ꡩdTZ,(<(C-٢mࡁ E+n| _MP˵J͚SUsf[?\bpw1 ˔3G[3Sf-H -_,2E)|{ Jf(I>=(oqę9Q.f"s/])sDXNH!GoB̙L"1;vibرSIA&wP}7OnJ -V&$cT@ ^\'b>*Z.+ DB.[=ܨN{fMQiƨzg85VKAkwm XFODl}`M`Am0TݐT+p!'tIQnAGF9qICelL -0'F%u))Pw$\WR2O0> 1/qjXB2KkU\n!2.\(Jg CZW{g^w:G|j IDH)kdxڟ1Ι@QUþ\i~cch  p}}*36A~#q%F<TL_ 2J #k"m4{Qg㎹];DYO+*KX̻8.E!Kkw35;.g8/|3 l`e֊H߂Fc4Vd%=Ag{1;*Ȍq+152*ɹBQ M"ݫ-dҊ-He|qGQ88\T-p1}˩@4j?0=?MTU1K[̹_ӴJxW|-%Œ? \:lZvЕ奆.,]5&U Yk,ֲOAa -.Hۣܷ֭k00#e>vCXj+",g8YeʮGn"UIesd$Ml]i}i.-{5nXֵo X;;@ F|^^ydxO)}.R^0qR+EЛoȱɌ4R2nT!JO/Gt]9a$KA!>?*uP-{\X&\lg[u].vȜ Z=M:R3䨨>")j -~*Ӱ0QnA`YrCYZܯe\pLQΥxw kQA[d]Et.qYS6mJ>ZʾB2 GrڦݴJ }I_1cj M7lgㅹ5[?H첎1ěIڧD.:Za۝XAKqX2řg5ǩ7bۊKKƣsP8!9Iu#Cw9k4EV[/ ; - ńr;-0%,&jC}c3[FP| WԢA?Qp]D=?q^{ĹV;< N0i4F=ͅ@‹XW3 U*^jEYSf5K%UQMUɑ6!|CT6Ұ,TZe%lf9T._})Oxe.E (TApjo/Z -=Yrc g{B,0v4eR~K7g&cRzbIWl$`.xRסiM2j/8,2PW'S(k­5,iQ/<Ȱw!l~{aJs'pʻM51ﶠ@C̦$y@SS5?tXX:lF3+,.,)= my;Z󗨺ؼD 1*],Mcw[S -_qecboʢ +\{D -7Tb%wT?2~HNw# DR]|q{Oׁ1${H ,~@14Q)dHTq[7ZFpP ~EYSM'}M5w-BSE?#j<5c.z۶ LD "0C0ep'6Ks:#P%j_k{M~پ!Zi=k'Jw#\nd{跅bī[[ A[/L#hY1#(跍XAlLM5RKKjj[68 f4,^?nf;XEk#4t$7 KE%#\Z(򳸏M{ֱ,Q@ /6 {:dV.ضdl3PDaAFkݺ"ujXmH4wnfɲje}ٻDaJXrLa|ԨR jku!p8B[D̵fc_6Re5ƪhGqI%\:O@̱iRB|l<9=kdHE*j,hv oo˃5q಻ &G7~xAH-7)ian~Ek]nj4PB -U%lA ^ &8'3AZ)1ZJiUȾ (@f9qFl[ʴ!b7k`5uT\e:2]5B4JU4b* a,C` 0~gG~Oǟ`ab׆Yԫ׺Gm|FĚ6F (ty`y+"V6#4&C[hHH%bUXR+MZUjp{#UYfsPFAؙ#/ΰ+Fb'M.\9,EYqtNP5= -IbTvΠ8*RhU6TY(z!SSZXu&V5`_UyF6p MLQX c;/be!\UrJ]C("4T:_@aQ^u. -g -\Ց`V%֎lQ E>ME W?P&4l.Jft*&>vSY!/T*}ʞɝKU:D#7i*)j=)K?ZIGO?%ĹeLK:w>tBf -F>k~\"C;Vhw41TU 3`w-q]߮Ŝ=+|I\ݡlyΖ^Y-Xג,=\ĚM mh2.Yrp=VxVeDMŠ!"cq"LTbbksSj<+_%eVI+P[!ЗF%Ӌx@Flju!]\ 찺:eOne$.4̎ACJ*PL3oV)3hM\l˸Q6lmO4]m/HlBG+ԦjZ$qPN=oJeo!_+bؠRK*3Rl)(Hv,]+*/\Ged-9_ڗ%$I (p=Vb <tÇY`]^_^GL^B -e#fDJjx*}D$_x%b koZj -faFBza^bMWrM5b.BxWt+MCbyTjf jVlD4Լ-}Iq2;Cv>\v\ql/3 `!-'|Α(~SNU.林mbǣv?ZQ`4ZÜOBȀy"QnWωg/f\Z10Rz eqd#zH]D㞥 ]DyZ -T,g?^%Z|JfeZH+\Q2*QQU)A 5f=ԫ(l1A?Ԥ_D镎D"qi7c0.<13ir锝K|pM h :ߛOOXk(Q Z5pƼjcLBu?D {f . 4oDDA2!бs,慂YQ>aT΢镓yrUʝw*J+>Cc2H<Ţ`vX0.#Sepf{*RpF.3UV>HO#C{Un*wLb^`@ey⮵+eMY7ʘcfeQ=}E»fTU3M$:m(o'D>d犀\c(Mx**1I`̃0˒ w0 Lгk!n}S?K:wrb-_B%z;*^/jgemϺ>tm&Y &V7rGOp~q1۫cWrQ-*,VHuYד<`ݒ/YyvE0@2\fݛĤ+2YJ>&$/yELc~n_ v b~[3*{"SQ(L\Üf?O&wolՎ3f> þ-lG/"*j^_Ib-\B\,N)34r-` V:iA}]CLj(_mʫ~RRv@j ԧ/4x-`]& ;>H^2JDaUsʴDQ5 GڐL<ŵ-rrbJ x*VpUGSqiaDJ>!d3r7lA*aXfEh\ILjx+9Wr0Xqm~J'N0,XΛҝe+jbW_B2yyar4v GD{CCu~lw(WߋI0V<5._M5>joUv32kid*4sLۭ]/0)bĴ@ ܸ0ۗDkzٶlջw0m*k.ǓR$^I I1(F$|iDrvSۗ?m&bLԬـ7gf -W q*W/A!FF\G.s/KC,\Xj_Z8N: a6sgᩈ.%NHĉ13vwJ[u VH/)نNZF, kȎ1!폩[΢inѕmˉX*]T=F8SK)dj&&z㪕k[%5<!.@>߻?QKx#)1V"5k_M8H+^ -u(DHfNy> ,;N2 -\OTqˈDOeqSGq_|kp/xeJK7>.xi鯱1jVuz(%2_Y7栱G*Sqj.%@}ˆA{g;J\|Ō]gK>_ÉUq2%2|gzUǯM*&9"@clMӸ}R0nuQ?xTNxIJ;G -cJz?l3bȖ۴0?RG':W؊dkPPsಔWf[PiyZ&jJ1bk| -\Wp1W /jz>`h ͫ%]qUʖiIa&Е -qS b`j3y4s`nٕhtY3sdFTB\\bTmJ>JD#ںfCtABzieix`o[Mepk˓^+<ԭdv琣DU. D2J1ȡ\w;_LO c4E/AhW2Rc9U Uw]$"H#lwr#X -Y-TblFؖLjP"51\WT577FZü|0d[np¶ -bY%>ڔ" -ce㴏L<@c^@D{Va|E!y%|w3Y<xxvUTj"T%TS_S*\1ÌQ_ -% ГR*41R`)N\muM5,ۭK ؕQ8TPh-?]7Xr6E^.ZUkadH9e_F)G;! mUpD( -Ĥ+14Bi$ =-6vTm@u)󖝤*3嚸:*JؾJfc{džZ,-Fh/e/WL-z%s_0cRh4ER(Dku C6rb)\>%L -4.TŬ=}EQk$(- Q!ߓ2(?\h3<,fjf^#q-f:8o=/"g'/)o\3 >GmB>g[a_8 PKD %UcF?QU)2ݽ,9?IM3Aҋ5Jiʡ.>0WB"k:Ք?'ODA]# 0$X83i]/5S7C_jLM_Z`Q -UvAsQjP)BޫKlP۶5/tw(L/d$Q?>R%Fæ<[F5kg/̽aT6 e}&fqvBɰ3P{zRl -ZQڝluwLuEj["l6vI6XR'@';#JoꥯYhe[&]q[cB"~Yxi ~DXe'w.\X.#dd xYeO.; su¡= I rqQ@g۞qA4LCC.E1b_U/2[ uT;>D?J_!afBZR@#o"O !u.=H,K*-\a̼7p)eUʏr5H̹ -]rWMhM - -.g?kZ֖SD -R?zXG 8"1/~%2`4PA9X W(L   jP JV4u[}KCV_->sDh[" W84-,4PZ5>r| QDb/nrA*LGVfGoj qr!_l@M~ yHf評UjkN(0cmonIr?NL{E@K#/05XLٝHu0"!DBWaӇ~ ;I3e#|<%CS(j|\ZS8elH=$aT.0CA}1g!3* -ZAyLܪ dFsg69qP>i Jך&l)mcƻove[_āWgYܴs0['/ -Ĥa%Ex'HdI,{ZQ k*~Fҍ% ]x6n(->(*uaEmqoThyo2/Z4k++qU"ښwE] p.+.D|YdD)h^-V@zJ ~h3zmӡj~T5*KWP5-~%\Ke1tlX·WG5_W^b= .Ыrttb. Fy%QbybٻBV灯YSH4ֵm0JeK*થB]ŷm>w-hWcFk8tcIs1Q%Kgܽ 4[*#nZm0,!¹qPi+SVpTj;Q~1KpJedRo0H?})\s5>}T`?3F([XՔ˽."-s|Yi%S-9L87U #A8ĄGlqkԑ8F$6+Ho>5nSLmVMZ2gsfWiTFweyS] "W"j'è&;dgtqDxQ6`,֠-.0o-1;e1?"2=wsKxk(UK鬡HXD̚X -dAI&Vh5j'a$r;?tӿ,٥_1VTx:~ } 29GШl/ Zf/n`kLJ+¸cͽtYxTInߖⷼKM3;(M*'"Sºȶ \EZx@ԕ)eDWx,2s. T9GgRĶ1azp\ԨƳƥA*TxFI7x2FW>ιY:+ܵ\=bguлEvtTtr:ĤBC$Db5Gݬrxt0 ΎW0} >!u鋄!ڊt}U뇷X/v/2gruh };6F>%U7U ^B.  -Qc@p,umMȾp%x#4͞F V Q,ƫAS^Q^A_,[P Fa1.JGH' -%nXwuS+D]ߚ,K9Zoo}^377E6xjF% TQ?p';MeƅbGrdhi QOaLODЄM[ dwpWP\Y@)sXFOK{|VɊ6Bv>|px-aگQGrLF!rYc Wqzk~k9JM,^a%,z9dla;w,T7SaR)HYOd>!RFGV%PQYYNf4h_%^"61ۉfVŌS -ܱ*z7~%1Lgߕbm=ʡ[E"6buC6HtA{IYB~<)kӄ*SrN97*7kJb)2YgSOKETؓ9`n\X.*l5Tq5{]ZOPx7ڴ0Q(D8OzoO)RU1ǒ"No260DϘc<^z]!*T8Έbڊ(7wR$"3@D2|-˩r՛[⪷2v%ID%Y(#_%4VY"YE>#V}GP88W rGP@pqpn'H1'#L@UK1$jUu̦'7xGr׃:F Da6q;H:'<ʓٝ(ҳx-~8@4JJJ2ǫe8}pEfx1U:`G\f.%Թw%ݘM2|2Wj%O;Uq)N0.%ΧEeڛb)hjZ렲?(Ym)RK,^W"q ǙS+\1*%Ʃ; іJeՎdķ5 'c]1E,1 -Ȭ dUD á\\jj<YC5M .D0#8Mj-cF^톑k(کJ kAͪ06<#bzf7(ke/ΫKRl0֙.덐@-z;ըH{99Մ2(Q^;/F!w(ÂMkP[K0.lY -"Dc3^I+r vB1vYT`L5J3[PM!=JFiĭ _.`{CHt '_V# n -]uRݯ"MLUh*_*U0hGhO"+S u0~mdP;vE;[\Nn[j`&xS~`biRxOIf劬WaW?Q+Gy -WPaL 2 Bn+KBU(֮l`r'+/3^pije1^ "bXBK9(cK R$:9{Ur"#ƣ=1P ٲ ZG'~5Œ7.Łcof|b-bR)(D9CF&Hwnb]ClID0 U"P˿P5 -CDaIxB5tO8/+CEQ|,j/=͵j'mT:\\rb ~ Sj#H%cyg$N7鈥j#+n=`UWJLE^jl0PIڝTZEf2_%CA@.aL6A]ʂZƭ6t7 mf3nIɀX(mTx욍ZCӸa:f4 ~DxTx!w*qkYW:v,qL lXRRO&X9ժ-$y9}Ao˙SETg֟BQu+f?y$(caLB ? k]D_ʯ]ʄ0"`U6{(k |lp%1T׳Jcۃc6+*iR:T>҈j )к&X"77B%hJ' TXSq[ U -D!]㊢M5]B}G떍\ޥB+g~9 `hu_H^DT%} -ȸUR%b2e.VqP.7yx8q~*W%Дl\.5\X}q.\7gyW*7>s/n,>'SVWܺ/<1.<įs >:&[Ő£emҌէQ̃#g}H$zA>,YQW3(Kj[(|D!Λ>XWψ2 D}K' /Oxr :U>%/옍^y +nf8,i2BPFAjItĪ  d>I`^0'(Iư -!_@_-2DD&[z&?PP`kK#kL,ٿԓۚc06"-QIʝ-W4ܖʔIDʖJ!~ -,so3] wmv&eg\~ hSa.&c~XHE6$Z}0Ux{%"WG7T$׋5u,U_ - -4]纺{)S %-5< - `;\ucǮ@_ƑU11Ad:µI˲/P9/ -YjlvmV -Ң@CrSX;sK!3hcVYF_kn݄rU Lu:Tb c;Fn&0QgPRʠkX#Wme/<#U!LĻ+,8&Z` K, M#Huш-jգD)Yr R -E#KoVvˢ!/S7R0<e+KNba3/0؁8xZ-D/w(bTĴߞ*nwu>у PfV&f;Ԭ|r Zx9l$y^%M̨6#bʗZ'Kj +[jSx*/6wUf '.rŦ *W< Qݍv7[[ 1zR -ȵηd XI3|ox$#WJ0pTZqVj7{F"UB .u::Z=q~&iPs/dz]^Y\aɯxq)%㎢)PF;f])eѫ؆kkpWKW sp;"Oq2b⬇yeğԍHαZ`O0E6Sjч6JcLA!jcl.~:ܱ뭗R}6:P4w:.iKI3#5*0kP[Un4, -~N b'bBA2ER؊he/!-2OԲJ X,\7oTKV<% m kX]y#+#6&3B[;d ]h%hX݌ڇTY}De|~"}'\K1*S!o&'~6X#Qw2J5~b3 -c\\_xx*j,'FYվ#0;WO >=Bjf{|'gxyW\LB\8x9_ "~3EdyfvxAi^$F?=aTG:Rf'gv||_ ح{XhnڋD]|AYXXMHTYJUJ]C$ùz늉x ;qCHvZΘ?D E.noK%H$v JPa FLrER[1PCYRRTCa4=,ko} fuSP\rn6 Yl폜_[5,F7G^&pA0u`GKNorA ڬx, -ȴUZLG2AĪ1Dq-2'Z̭%jJ=[,(PNՈq|&)_]@]Ťv1>@RɥE.3D RT$JNYTɳ=z8lVLKsPKjK8XuisT2eEkBX 脝 Fe@s}tpʰ[%3m[Â.A%]fc0ݠ5N.-ꪏS 0`2٫\[DYR{lKuY- ܂UDhaCmnjGQ)kؘlcR4r\? YE+o\W 6BD0Q&-ZPk[2 odL->,#W|\ >D#ȷ+urJc*en="WQ*f+\2|1p1"^ Իx|de}wpG\;*\>+C-,'P%p]􉠀:{U/}ȇ)OA=+kA%WW@$Ww1ak<}Ŗ` {*{͵1*6]^8#s/MdJ4&F[@5se%p-Wzq5g5=;En6b2`tUkkA(*`֭L-3}{aY -EiZ_eT7_C@ 4ޫE(?iUD[ Nhq"O1*$Dp@5-vql UA^@/GV"!H:쀖+Ԓ5s]mf-jzQw+ 䒗'Pluxja=H -0.\_oWb5gp  e7+~8P:+!wJ*eB@ +Gd A`C^uvt{gEX5=w-vMʔOfC1|Zbd1W ncQc] AG: }B^yF~ ܨs2%Cp&/2WA#UuL%k3Or7-fW -{ -^㊗V^ضݡԔ-tjZjg%m~ [gM>mDkMq(0W[Aۯ}1U7X6?O=FҦ$K.$j*t: x St#:H {*}6w@joy[<' @trKkL{9Sxeэh6Lw.Yς$C*ş2qFG|:߼ <ěj]%Z`&l9CPokԱjS|Q¡t Gn8WĭM*Ui<@VaGr-AOWXUGN% ̑LOV ->9uJ"ZsT\xwPJTU8 | $\NGt%Ywڲ̐cݕ,Tz2b1hBmq6 ]U%w(8JyW,l!fڗ)6. E ڑ=p}X`U u,+ -(&bPwT.m~cȴ 4ʄ4>WQ5nwTFƶLM]ݣ`ɵ+VدH#P]B1~q|;MmL -ᙾ2Lnv_ (bqy*RZ)1QO,|Y3*3Iep__UuƮ-3'0RT~G -o \eSsfR}|*⧨\`*{\/\#+uX-:q4;j}qc>D~}r?4Vkn&xNIUFb3\蕬,ʱ29ik0M {Qq mڽɂG -*_ ~FQ" MMm ->c冋 <ܛ8@{$+o܅a(/߉@75h!p4O ,03 lᐙLf2P{h.c~L(A)OP!z*}dM-t1clGWReAU7lBט)S\oAG0$/Vu<k뒌%5trYZywƞaRL07d\5ӉV/,dpEy4%F煷?RPTJ0]6XW;L@C!_$B}f,~T<1~":yRJk_@!<^1(ԤU; Au|a},CE*U0*UDdu|4]cH'q, dx5 -o\_5;DR+:v܈ѩFC;.M3@Gj-I,+GJTK;∎*b. ^1:b\T0yp±6Uw;%Cp\CEEW ZMB}t'IߡAaGv{R %08 yg uT]7/NÅRUi^l#15d{ t@˨|jMMх VչoÖfB4YwrڱP|@qk/Ĺ؇#3;_@ -#^xnL5w;"`? -w:>d@nQ0$. -n}) U-èbJ5ՠf%:FXz4t}haHbZC3 qb -ew'zcjN/Dq}'QO2*7lVYSP1SazZ-I/Tֵ[7~0AU˿?løJ-bW/c%ЉR(pGe,U <ܪaQI_QQMEeNXU7ql"zɫbTtV -gͽ&d앩@Z<.;L^aW2y( )GMM~߾d;R\HyP;LA :ؖ mWE -,QV=I +M`j`L=Ʒr9My8:fHxl8èo\>] =WP~O@ʏ‡+ƣMݺ徉J2]hUpndK}C 0)Yf>@e|,&p AR% Ò*w8uQT[+1{rFF]8 -L$=8y` ((<;8t`05F,k2%E1OHaqs bZjBՈ CK' A%ш !/4Z[감 (5:)< H p_Q1\7u61`#d#qKR3φRdn_h,3K EqP%w:FeC_ -IA@e. tVb@Jb  (5b aa#pҘ= L!x6Yy" kUܼj-s%A{+Ll*i !B6 #0@VGERo--A4 TGz5J>AC7=-ϪP~z dP{ȑM쿍sieq#e!<ʦ -PG4F1 p.5?nI|/,⒂1QmТAUh@Uq](ʒ-!)]M- c8]>T:7kDÓ$yb6,PbVU膕=ktdMYNqV8f@eM_ 9"[ktQU#*TzWk仦JS3^\Kxj;ʏ -L|U~IʭB(vcYd --&@,X&ni6˜θ;= -{v}9>\jmD 53YTzEnI|/HYMT!FTIw%Jx-]IJ? K 05a&Ys -6_6Ӫ)VW -5xV1{09,ulh}BH{Oı8YG2wuK(8P,=θjb|DYN?ygW,rʹ\_ܾO㎸KYD2 oڲ\25JCow)G e>ۨH UӶyv jpcz ǍK,(~d2Zmu-w*T|jͳR#ΥƓ&Yl!Bcplu=2ʼn~H U2ɸȠq^-ZqlL,$pUTpP $ d0YcD0RP]petg$jy~)|PqA{*]gSo3^Lǘ5"6bJ\ kp%[>pҶӪsr+=A=/]"v3&!\̹~% 4[SiFXNB:Em -_Y4L vb>+RU,z.|=:/ ˬ ]fO!fl%u.ƦZ]5iG=lo5ɶ6xxp -AYH .Ny[DuLT+NQ2\1d~:׀B,0υwz%!q/qJyn4we;٪?R_3)) "ì{rG!GQIUI8A5V~Ov~R7sme1F jS*dknSqHD#R=D\b{'?O|sc);&ofxߨu|wÚlc068r}R1]vwu؉n~һKo9::_DpL%n_Rw@T#\ xP -\\A+zS{UKe!jiM u?LΨ;!H"Fc:0[LUWP4"DX"*3]qDz$-PA@VR7eԌmN|$ Xm,ꊝ6਺;"rĦNt_ſޅGU QOAGo¡&&c_)xu#5p?S?( H=%wl3T,^ߺ ÛS\e0dc%I_ЈYk(Öb*.iiR[<),޺⴨w9dU2V9pj춅ΚP#y|4X<{Li߄d2˦$)bn2z=$VYi(=5V&AWܫ-E2/ę۰5XArv\?FB4{*o -9"jqv4_;.$7j5ՈZׄtnDcQmxPM -Jj<߼!Gd ٩c1\sFcr-ħ? A? 6-Iڃ!m/̵;]qvjRo&뷍XƆ]i~ޫ 5. J޾NlטF$E|OW_B*1]:|I%Zf@v^IhYx65)R: ]TČ7NZL|$LiW(Oj/SZm{z_emn#'|~ii545 -e*4 4<;KK {*S!Z{)X PE2zT)!Q?*CV0wkUF ?t*hEK3@PZ#S VEVŗl ]e*;PFb,A} -~-eH5aY - Į`k+y*@Eltr92AB:T1rZS3J ;J8RYbk?/4H7AiJ#tGwM1ZjD|Y)ˌbQS+Yq `_} ]6NPGD\w"x^]G_us s"žp앣nYaw3eb']<F'Fp7+Wbfo(TăX]0ԗhoƛҲD0OO.fHu;7+ P"թ{t)D%&+Tu,($JP7^(ԩyVGq:S"_G%mĬu*Q&s}!W K91+cs5F/ +T$fQ_LQ%)Ƌ6YU< 3_i Xa8/8X -U˓IV$҄m& *) p5xzVvR}4Ab ސ ϓfR -U}_ -~m&*f:#2G ` m@ qBu3.\ekV >n6]>Cyr&PIԐcw05e2Ɓ/kA:-*,™2HMH(`UJ;* -IwKZ!( #j~ZꊃCͰ:_KQ& -?cIM 4<\F3jxCmrЛ_-cWC !u1)]TPAfqJؕ -;.EJ68aHZbStu$F557&)Q -kqsl`SD`66m#|'~(*[Pl# Ns/\S)ͥT^CWpݏCZ.^bqVCW³.WAsrOrdX_Cie3*QyxRc~>ւU+膱 lǙ=T+6Z梥̀W*+~9 ={XR8R~O =aMD ZypKYT=cm`,JTʼn$\oa=K6Bb w X_mSH!ZYQ|4DR%DOm~N$/Q޾G$!eit‰RT rWĮ,9QZ -Ug!N@. 45٩qWJ&5_O tY(Wؓg 3H"*V!is -L h 0RdRP`hi( -f~Y8TR^0 Eɨ2pOeeq஭OWU"B[1pw+h5e%!\ -'eƪ-fT4OjDa\V#]peNl2@tPr/ܯNQ3 !VgFvmL-Q% 3#kLUtJ<2SffXĭ&y$’ח5pg<Z)w(IQ([. p5^ei}FiؙVVT#}I*l%+5v#%_5r|-TeV &jjiJ9KLLY#cE=g2=Bj -r!UCs*07IGZOҚ̥GQj b2ub(&H@R߆CY︚*kFbZ5JODyJfp:R$}ky-ũwh~QqQe4Y*;0*e1"07< ̧vhQ0\w8mE -RZI=v\f̧/;Lq\n \E" x9)EĢ^()am)%3K9řC(_5a]U_ w߸zF[GgV]sPDpWyIFҊo х _,،*R wl*kfq6 HBi<O %OKepyhI\,UpFQIsܻ13|1(ܣż8cqĦf"F 7r0*W5(-~L|@%D6 A=HjQ vm'a,@{P}#gR* 5!Eo -9۵[8Tuma)XN{O%D3s -;}T% wڠShm.8~Ԉr7Ka`Vzr|NQ~d;), e䃊P& %@E٫ сvW[+ AH"bD=O5ji}(o5O1$ N NP.hTYxS;;" X%C,sՙٯYX &T;nbf<{Qt-m`?%;KG#}1 wa6ƚ]WDԛ)/l%c$^j&[VaGNx,qy:@[?_X3Xg ]^c_5kolAINF\IC)Pa"BkhQ'52_Q~U۱CP\ƣ}r>5((bk!3*論v׋8XZ\auQ6kQ2 JTHBr (Wc?T)kѰU`-^h<kkˊ+FpZA*!eH&ɚ|(?$ t N]zEjb}ծj _~0-ᮻ:cv!W -VGV +LUjT*M b_F5gq3t肢宦KW|?Aٔ6~.1+V,f(PM@:ůlgx*rFYt\⁵.[fPU?vC c\ rJҺ>,C'?lxIJVYon~l`q_,<NV5WX`(׉Sּ87Hᡌ0>8DDH:" L{렷|[) -@PJZ*JbCj;5'SZmeD ٘6[$eqP錻cfAt٭$O`__/+O~TtB>3-S=~UFFeV}5t4t@0w.E]x q쎩WAzPUqj)-éO AGctH $l~6 pZ%@1!V~*5q\!Il5 .TQƠfxJ}T62J8q"b7Q %x@14 q_ LCqᗨJXLk־*ט:Lq cork`eHzp -p[擋TFgu+& ⊁)xعU8qnb,2sr*?Ԫxi*tn ]C s9;!,,8#S8yl8jq]+ -YRƥ -: l/"M&~DEw,u$_A};!l)"ڧ<5;5 -,@+|3ƍԢYrøаt^[EeWN -3~FBjOj<]CG#z ?>nʀ}W. K(*2?z;TBvGfcbtUeQ|^@{tL"ʕiBn[*f9vˋ:(7.e>qQቍr^cVJ)e -C+̃b%mZ 1b6`0Ic?سTy"Cx>x54!|x^RdDZok>KMFb2Ql몀ScA;ԴlX.)-D~p`wh9E3IV*C֯N"; A۰ -q׃rt՗ /˄sW@QfFhXRbf5p(~74y^Vlc5P55m 5kpni-p;͒czBE@1)-ӄOha5>-Zŝr$醳Fo#G-L,Q3}bUz5Q'sD5q,YS̥Iw*WQq'%Nƹt@w*٨!r\uJL8"L㡨2L3R+3URe0|u,f8-Y:LnQ^ (!)|Ҭ+/O1j,ʄ!8M J`.6dU+T`\᮵ -np>묦UY u{ -+/]jRSdQoChiXC;eHѻJ2 KIW >ԧRZ7wx.,C`fRD*_bFWt}V&`5 -栲({ܪ0W14!b9k^x0{7 lB1 8v3n JА>0f]|jt_(4@recZ8=&,HD^鍜\tѥ- '#yj2񏅜0f3jRc1梴qpe'o`qP xԲ.'*#sWģ?ܷW=2O 3\U$x==|(?6C2wo$*W7rS0bf^$|hs~,aG>9{Rpz6HVT\1y `˗ZZOd/iRj0h dHPvP[gbΪ^/\p*#!a_4v+>'K%9'P 48E84wY\39-iU¯CW[u i淹E ?K~0!Kt]F>kn`II54RO۶ v`+!8.ۙb[IS-P}TIjh{\ wud`eYx6ӹVjWi0eAB<էAU.g~o+Prv)/>6 %b W3ÁP*JP}Ar(8f -R1x@$RRE3]Ww57sXKfkĸL/ٟe^f|+|85ZC3nwKTiƧqX]fR_+,dil(вՌu2ړlqo\1NX4+&KWM_a5Q%<9|[EԾ1ʔ@;_=\൚ī@8\~'%bMIuOfkR/l1fO# 0*TK~%eԸk㙂2K FTf_=W Ve& 97+G lSW̯f8|+8KN]yB~| TV$JҪh}/t|Lwh5JszҋO[F[MS{-{b*T/@=ǿމ}8,KFf -a8xq\6-K+/<ȥs6%{J/N$ `P+MUe;3;dE*WVX -rX(c$KC57JG#}TmP!TI) -h{io?IqX-U.xtE51Իcwͱ@|qo،^-ܩRN.}J%Mp|1\ya0upj!\*8棍7+%'.2o3>R}0[n\3U6uy?< |D#q8iBb{E]SsC̷wQ#}oBi12⍿iU`'I^+)JMz8bnY4otWGK[}C|ىQ'g?=ʎ79|c|˼ERQ#o,_ % "cc7eUMCsK3Sc n}N.±FużSUq:>8ԳQ3/Qx ,(oBkopy5/Y.#+kLs|uqi˚r? {=ApJ)Q ^JيafWV.mHF%ukaؑ꿨TB`btNo&T-  ]!KH~ %orG s \"o]JdɠUF :'pRϞ_Tq h%|3/Lc*\4dž~_!+:5|[ǯW9ᙨr˸ Mwlx.V'ZyN~!' UqW n,WR.cbXwc|L˭+p<S)%B:/Q&aFNF*==~ pN5;@}FE~cEm;\/ EG:Ep>'rdRb/Ÿ;9q lʿ _ĹGs: S2*^ Q-ؕ<ݕVtx"6&&>100@P bZeSFr{'fnL%)@D{%ī.oڶ } iX#jhMF,y㯁0o 'xMpy)K`ԡΧhx^ -i8W; u3b EJq(mk4A5?00UBfd+J21!%>4xD+֎La_cUE%Fɣ 1kas@r?K!=Hx?CF_M/$nf3kljVD5Njj1<\>nFj+p#8R$pzT"bd.[@ i)WK`w-1Pb HW~k\Wί ~;_-uYe²pjĸurIm%X~b&Iw7aj5^)Υ#/v0AG+ -Fqv>+q[$~1,/WeXraRTw/0 ?s/ypGaZlTzb7qd\lVd, P-5AҠ«0*UbU#('Oߨ⇱۹xQD }堿)AL7)Ijy/kp> VvDZ*'ϋ|_)[2T\L[4G^xW[8xME\ز P=&TN #Ic!=̲mL9?kqA}I,[Jq+H 4Ӧ.4X_(]J wq| EdDQ_HXMu"A5, [_+̮j%B%MDQ3ƒjL1О3$H1KKPf} -q#T#b5*$hePz1j*7*A~R{a+%'Ģa -`Zlf,-X#1+$9*X1p98NS.)xR/7\w.W1ʱL#f7/L燞inUcO֡Ci! 6Tq~SX>>b:ܨFn8;2pø7QwL:qfTG -\3X?p?q#!!~@EþXi0 -҈֤{uzJ_1~ca&ӉG7GҬn]3CMO"z?46mJ)Rc>yd ˯ԝ*z?j|"=~X.C=X,6jeJ+Q-?[.!lL@gc9+KVŽToqU{.|lʬ)J]/'H*]}CEIGqƗܫ:b.c73Ř=9?! r?n$d$ e@SS\p`Qb6N%pE橘*Q5_Tss\xc\|+"fb*VH KѹjQR[ll!>mg#?`?t.Qr{ƵQN5bʿRn=kȝtYKn~ e[E^0WK8 joaПLF!%⡞ڌo=B *$le׈YJJ@-h5 +0Tl R|ܱ킷 rRxDb>míh6Ewe0VƶQfZ^]imIpq0!Ŵ`B\42raK qvKbe]`.}C -#Va D.ETr^d74M!H*{ SjF >XU@`U\l,CmEaEԹHH5^ -ߋ5I@)4p*Ӆ\a0Lw,U@}*"ǖaۈMt)yx-zA.6,rc-J b`_QUCN+\**J98,T@#߈6Cf^Mk <歃 u0HSQIqHP09qjDu0 c(XV?ȊH#BcD1q0/50r9]ՕJSII*\ -)GS7And"-O"+Ru{Jo$-1sba3jxeR:;^<4P¿2xUhS!pU,dDA c;h#PXBtǵHh -sɗWʛ0ƋCeb.0&˪no*5heHb,Hy"4#p*0{֡-%4r&Aj#d05MJ*e " -RasRq*TRK M@>HQvEj8zyZe؂fsFW}JlU:u( Ü$wN*[@l.fPf)ISY4Gf; ֪[įU|„ \!hCh2Wp,4Cߙ\WbZ!p` 0P@ ?OBNz{cs'r|z9Fba݆3oK_GD$rmӶDZo3̰Fy Q l3i4׺(;<9k4όI_nsn:eI?I %,p@0P ?'ćĭ)k =afV#p&? -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000010057 00000 n -0000476482 00000 n -0000476613 00000 n -0000476811 00000 n -trailer -<> -startxref -476948 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/69e16974-e4de-40bc-bf01-fe23e1d757a2.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/69e16974-e4de-40bc-bf01-fe23e1d757a2.pdf deleted file mode 100644 index 691a4ea..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/69e16974-e4de-40bc-bf01-fe23e1d757a2.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/69e94a64-4843-4a3a-8d27-ff5e0ba4fc62.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/69e94a64-4843-4a3a-8d27-ff5e0ba4fc62.pdf deleted file mode 100644 index 3f0b2db..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/69e94a64-4843-4a3a-8d27-ff5e0ba4fc62.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6d01cd63-8bdf-4726-94f6-1882348b84f4.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6d01cd63-8bdf-4726-94f6-1882348b84f4.pdf deleted file mode 100644 index f24ab0d..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6d01cd63-8bdf-4726-94f6-1882348b84f4.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6eaccddb-1ebd-4613-bb36-41223ab84ea1.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6eaccddb-1ebd-4613-bb36-41223ab84ea1.pdf deleted file mode 100644 index eaaad8b..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6eaccddb-1ebd-4613-bb36-41223ab84ea1.pdf +++ /dev/null @@ -1,2610 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 0.0000 -792.0000 174.3396 0.0000 0.0000 792.0000 cm /Im0 Do Q q 0.2075 0.0000 0.0000 0.2075 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -20.2574 0 0 32.5 28.09 3466 Tm -(NDS: ) Tj -24.5449 0 0 32.5 79.14 3466 Tm -(1181451 ) Tj -20.2699 0 0 45 31.76 3418 Tm -(\(0PERATOR: ) Tj -19.76 0 0 45 150.95 3418 Tm -(VIORICA ) Tj -18.1998 0 0 45 239.66 3418 Tm -(SAUA ) Tj -15.5205 0 0 35 28.07 3384 Tm -(NR ) Tj -24.2791 0 0 35 63.88 3384 Tm -(POS:C3POS-CI5 ) Tj -21.4644 0 0 45 28.77 3290 Tm -(CLIENT ) Tj -31.6762 0 0 45 115.66 3290 Tm -(C.U.1./ ) Tj -32.8393 0 0 45 215.65 3290 Tm -(CILF. ) Tj -23.9616 0 0 45 292.39 3290 Tm -(:RO1879855 ) Tj -21.3826 0 0 37.5 243.87 3710 Tm -(JJD. ) Tj -21.7869 0 0 37.5 297.77 3710 Tm -(CONSTATA, ) Tj -16.2111 0 0 37.5 431.92 3710 Tm -(MUN. ) Tj -18.4335 0 0 37.5 491.81 3710 Tm -(CONSTANTA ) Tj -17.3667 0 0 35 298.68 3671 Tm -(STR ) Tj -17.7274 0 0 35 362.87 3671 Tm -(ION ) Tj -17.5774 0 0 35 407.91 3671 Tm -(ROATA ) Tj -17.8566 0 0 35 481.08 3671 Tm -(NR. ) Tj -0 Tc -35 0 0 35 528.58 3671 Tm -(3 ) Tj --0.035 Tc -19.5065 0 0 42.5 202.91 3627 Tm -(BINE ) Tj -37.4683 0 0 42.5 266.92 3627 Tm -(AI ) Tj -20.699 0 0 42.5 310.95 3627 Tm -(VENIT ) Tj -16.9105 0 0 42.5 387.88 3627 Tm -(IN ) Tj -16.5034 0 0 42.5 424.92 3627 Tm -(MAGAZ ) Tj -14.9959 0 0 42.5 487.89 3627 Tm -(INUL ) Tj -23.2019 0 0 42.5 541.89 3627 Tm -(BRICK! ) Tj -13.5343 0 0 40 202.98 3588 Tm -(UA ) Tj -16.207 0 0 40 237.92 3588 Tm -(RUGAM ) Tj -17.3776 0 0 40 311.68 3588 Tm -(SA ) Tj -22.3716 0 0 40 350.89 3588 Tm -(PASTRATI ) Tj -17.0711 0 0 40 457.92 3588 Tm -(BONUL ) Tj -20.9176 0 0 40 529.9 3588 Tm -(FISCAL ) Tj -0 Tc -40 0 0 40 615.67 3588 Tm -(! ) Tj --0.035 Tc -25.214 0 0 37.5 323.73 3546 Tm -(CIF: ) Tj -23.271 0 0 37.5 385.89 3546 Tm -(RO10562600 ) Tj -17.6662 0 0 38.75 28.91 3203 Tm -(HART ) Tj -21.2696 0 0 38.75 82.85 3203 Tm -(IE ) Tj -21.9033 0 0 38.75 119.23 3203 Tm -(1GIENICA ) Tj -18.5701 0 0 38.75 227.91 3203 Tm -(PARFUMATA ) Tj -18.0167 0 0 38.75 350.96 3203 Tm -(ALOE ) Tj -17.8242 0 0 38.75 410.96 3203 Tm -(VE ) Tj -24.8524 0 0 38.75 28.96 3160 Tm -(UZ9002752 ) Tj -26.5879 0 0 38.75 153.66 3160 Tm -(6422768051644 ) Tj -17.8148 0 0 37.5 53.81 3121 Tm -(CAP ) Tj -19.6554 0 0 37.5 102.91 3121 Tm -(PRELUNGI ) Tj -16.7404 0 0 37.5 202.85 3121 Tm -(TOR ) Tj -17.898 0 0 37.5 253.92 3121 Tm -(4P ) Tj -24.519 0 0 37.5 287.85 3121 Tm -(2204 ) Tj -22.6886 0 0 37.5 348.58 3121 Tm -(SPIN ) Tj -24.8021 0 0 38.75 28.85 3076 Tm -(EL1694033560101 ) Tj -25.6377 0 0 38.75 226.64 3076 Tm -(5949054903644 ) Tj -0 Tc -40 0 0 40 30.79 3035 Tm -(+ ) Tj --0.035 Tc -19.6554 0 0 40 52.91 3035 Tm -(PRELUNGI ) Tj -17.2635 0 0 40 152.85 3035 Tm -(TOR ) Tj -20.3232 0 0 40 202.76 3035 Tm -(3P ) Tj -26.9368 0 0 40 237.68 3035 Tm -(31 ) Tj -23.4904 0 0 40 274.72 3035 Tm -(3X1M ) Tj -24.7565 0 0 40 348.7 3035 Tm -(3310 ) Tj -15.7186 0 0 40 409.96 3035 Tm -(VERO ) Tj -25.4896 0 0 40 29.85 2987 Tm -(ELI8504100405 ) Tj -27.7113 0 0 40 202.7 2987 Tm -(061250813360 ) Tj -24.4891 0 0 31.25 309.89 3754 Tm -(FIE-HOLDINC ) Tj -20.368 0 0 31.25 467.62 3754 Tm -(S. ) Tj -0 Tc -31.25 0 0 31.25 491.93 3754 Tm -(A ) Tj --0.035 Tc -19.5865 0 0 33.75 54.79 2949 Tm -(CUPLA ) Tj -19.2518 0 0 33.75 127.91 2949 Tm -(PLATA ) Tj -22.7762 0 0 33.75 203.2 2949 Tm -(10N ) Tj -24.7565 0 0 33.75 252.7 2949 Tm -(3102 ) Tj -22.6886 0 0 33.75 311.58 2949 Tm -(SFIN ) Tj -25.1232 0 0 33.75 28.85 2909 Tm -(EL11510331062101 ) Tj -26.963 0 0 33.75 238.62 2909 Tm -(5949054:00438 ) Tj -18.9183 0 0 35 28.8 2866 Tm -(CABLU ) Tj -16.7609 0 0 35 102.92 2866 Tm -(MYYUP ) Tj -18.37 0 0 35 176.89 2866 Tm -(2X1 ) Tj -22.6886 0 0 35 226.58 2866 Tm -(SPIN ) Tj -24.9931 0 0 43.75 28.85 2827 Tm -(EL11510471066101 ) Tj -19.1939 0 0 43.75 242.91 2827 Tm -(BKOOO16E ) Tj -22.0578 0 0 43.75 340.72 2827 Tm -(655 ) Tj -19.7893 0 0 38.75 28.91 2789 Tm -(PERLATOR ) Tj -22.3284 0 0 38.75 139.89 2789 Tm -(PTR ) Tj -21.5788 0 0 38.75 188.9 2789 Tm -(BATERIE ) Tj -28.8293 0 0 38.75 287.83 2789 Tm -(El-102 ) Tj -19.276 0 0 38.75 373.89 2789 Tm -(EVER ) Tj -26.0317 0 0 36.25 31.81 2744 Tm -(IS13204105107 ) Tj -22.9236 0 0 36.25 202.89 2744 Tm -(BKO0J190784 ) Tj -0 Tc -37.5 0 0 37.5 35.8 2701 Tm -(+ ) Tj --0.035 Tc -19.5865 0 0 37.5 52.79 2701 Tm -(CUPLA ) Tj -17.8126 0 0 37.5 127.67 2701 Tm -(SUKO ) Tj -21.5109 0 0 37.5 189.25 2701 Tm -(15A ) Tj -24.8391 0 0 37.5 238.88 2701 Tm -(BS-099 ) Tj -21.5196 0 0 37.5 325.95 2701 Tm -(VISION ) Tj -25.4734 0 0 38.75 28.85 2659 Tm -(EL111301409177 ) Tj -26.2993 0 0 38.75 213.63 2659 Tm -(5944016006043 ) Tj -0 Tc -38.75 0 0 38.75 32.79 2614 Tm -(+ ) Tj --0.035 Tc -19.5865 0 0 38.75 52.79 2614 Tm -(CUPLA ) Tj -19.2518 0 0 38.75 127.91 2614 Tm -(PLATA ) Tj -20.2456 0 0 38.75 203.29 2614 Tm -(10A ) Tj -25.2947 0 0 38.75 250.7 2614 Tm -(3102 ) Tj -22.1954 0 0 38.75 312.59 2614 Tm -(SPIN ) Tj -24.993 0 0 37.5 28.85 2571 Tm -(EL11510331062191 ) Tj -28.1322 0 0 37.5 238.6 2571 Tm -(594905400438 ) Tj -20.1973 0 0 37.5 29.9 2529 Tm -(PERLATOR ) Tj -20.6109 0 0 37.5 139.9 2529 Tm -(PTR ) Tj -21.5788 0 0 37.5 189.9 2529 Tm -(BATERIE ) Tj -25.4786 0 0 37.5 287.85 2529 Tm -(EL-102 ) Tj -18.0712 0 0 37.5 372.89 2529 Tm -(EVER ) Tj -26.0317 0 0 37.5 33.81 2482 Tm -(IS13204105107 ) Tj -21.6429 0 0 37.5 202.9 2482 Tm -(BKOO0190784 ) Tj -22.4567 0 0 40 38.58 2441 Tm -(SACI ) Tj -19.488 0 0 40 91.91 2441 Tm -(MENAJ ) Tj -19.8291 0 0 40 164.88 2441 Tm -(EXTRA ) Tj -23.2853 0 0 40 238.72 2441 Tm -(35L ) Tj -23.2867 0 0 40 287.67 2441 Tm -(50BLC/SET ) Tj -24.4577 0 0 40 408.69 2441 Tm -(60 ) Tj -25.0806 0 0 36.25 30.96 2399 Tm -(UZ1022100021038102 ) Tj -24.9141 0 0 36.25 262.68 2399 Tm -(642276R020146 ) Tj -0 Tc -36.25 0 0 36.25 32.24 2352 Tm -(* ) Tj --0.035 Tc -20.4984 0 0 36.25 54.62 2352 Tm -(STECHER ) Tj -18.587 0 0 36.25 153.66 2352 Tm -(SUKO ) Tj -23.7436 0 0 36.25 213.89 2352 Tm -(P8051 ) Tj -18.5338 0 0 36.25 287.96 2352 Tm -(VERDE ) Tj -25.1772 0 0 40 31.85 2311 Tm -(EL138051003103 ) Tj -25.5796 0 0 40 214.68 2311 Tm -(612508134745 ) Tj -0 Tc -41.25 0 0 41.25 33.78 2268 Tm -(+ ) Tj --0.035 Tc -20.2601 0 0 41.25 55.63 2268 Tm -(STECHER ) Tj -21.12 0 0 41.25 153.61 2268 Tm -(SIMPLU ) Tj -20.188 0 0 41.25 238.9 2268 Tm -(PLAT ) Tj -17.6882 0 0 41.25 299.96 2268 Tm -(ALB ) Tj -21.5109 0 0 41.25 348.25 2268 Tm -(10A ) Tj -24.0438 0 0 41.25 395.89 2268 Tm -(F-43A ) Tj -25.0792 0 0 36.25 32.85 2226 Tm -(EL5710191093104 ) Tj -27.4127 0 0 36.25 226.61 2226 Tm -(59440160E632 ) Tj -0 Tc -41.25 0 0 41.25 33.13 2184 Tm -(* ) Tj --0.035 Tc -19.4553 0 0 41.25 56.91 2184 Tm -(BEC ) Tj -19.3575 0 0 41.25 104.89 2184 Tm -(LED ) Tj -23.2891 0 0 41.25 153.57 2184 Tm -(SFERIC ) Tj -26.1926 0 0 41.25 247.84 2184 Tm -(E14 ) Tj -17.4813 0 0 41.25 286.69 2184 Tm -(8W ) Tj -18.6316 0 0 41.25 323.89 2184 Tm -(LUMINA ) Tj -18.8162 0 0 41.25 407.91 2184 Tm -(RECE ) Tj -25.3563 0 0 37.5 32.85 2143 Tm -(EL4348821004110 ) Tj -25.6377 0 0 37.5 226.64 2143 Tm -(5949054913865 ) Tj -0 Tc -35 0 0 35 34.82 2085 Tm -(+ ) Tj --0.035 Tc -22.3308 0 0 36.25 55.89 2088 Tm -(PRIZA ) Tj -18.8711 0 0 35 129.91 2092 Tm -(DUBLA ) Tj -18.587 0 0 36.25 204.66 2095 Tm -(SUKO ) Tj -19.8418 0 0 35 262.88 2097 Tm -(ECO ) Tj -18.934 0 0 36.25 312.91 2101 Tm -(PEEMIUM ) Tj -24.5544 0 0 35 409.74 2105 Tm -(0604 ) Tj -25.2178 0 0 36.25 32.85 2061 Tm -(EL1071029108603 ) Tj -25.9273 0 0 36.25 226.67 2061 Tm -(6421806119163 ) Tj -19.4553 0 0 35 56.91 2004 Tm -(BEC ) Tj -17.7589 0 0 35 105.9 2010 Tm -(LUMANARE ) Tj -20.4329 0 0 35 214.88 2012 Tm -(LED ) Tj -22.9185 0 0 33.75 263.86 2015 Tm -(E14 ) Tj -17.3487 0 0 33.75 312.81 2018 Tm -(7W ) Tj -20.8157 0 0 35 348.74 2021 Tm -(600LM ) Tj -15.8972 0 0 35 420.91 2023 Tm -(LUM ) Tj -24.6209 0 0 35 31.85 1975 Tm -(EL9001412 ) Tj -26.1339 0 0 35 153.63 1975 Tm -(5948668028514 ) Tj -0 Tc -37.5 0 0 37.5 45.21 1922 Tm -(* ) Tj --0.035 Tc -19.4553 0 0 37.5 56.91 1924 Tm -(BEC ) Tj -17.9439 0 0 38.75 105.9 1929 Tm -(LUMANARE ) Tj -19.3575 0 0 38.75 214.89 1931 Tm -(LED ) Tj -23.5734 0 0 37.5 263.86 1934 Tm -(E14 ) Tj -16.6258 0 0 37.5 312.82 1936 Tm -(7W ) Tj -21.1686 0 0 37.5 347.73 1939 Tm -(600LM ) Tj -15.4296 0 0 38.75 420.91 1941 Tm -(LUM ) Tj -24.395 0 0 35 34.85 1895 Tm -(EL9601412 ) Tj -26.1339 0 0 35 154.63 1895 Tm -(5948668028514 ) Tj -0 Tc -35 0 0 35 37.26 1841 Tm -(* ) Tj --0.035 Tc -19.4553 0 0 36.25 58.91 1843 Tm -(BEC ) Tj -18.8198 0 0 35 107.89 1846 Tm -(LED ) Tj -21.3813 0 0 35 155.78 1848 Tm -(G45 ) Tj -15.903 0 0 35 205.83 1850 Tm -(7W ) Tj -23.5734 0 0 35 239.86 1852 Tm -(E14 ) Tj -18.6316 0 0 36.25 287.89 1856 Tm -(LUMINA ) Tj -17.9856 0 0 35 371.81 1859 Tm -(CALDA ) Tj -0 Tc -35 0 0 35 443.95 1860 Tm -(U ) Tj --0.035 Tc -23.6593 0 0 36.25 36.86 1814 Tm -(ELO511420604 ) Tj -25.597 0 0 36.25 191.68 1814 Tm -(6426419000723 ) Tj -19.545 0 0 36.25 61.64 1773 Tm -(STECHER ) Tj -19.3615 0 0 36.25 156.64 1773 Tm -(SUKO ) Tj -21.4287 0 0 36.25 216.9 1773 Tm -(PB051 ) Tj -18.5459 0 0 36.25 288.96 1773 Tm -(VERCE ) Tj -24.7329 0 0 36.25 36.85 1733 Tm -(EL138051003103 ) Tj -24.5063 0 0 36.25 215.69 1733 Tm -(612508134745 ) Tj -0 Tc -33.75 0 0 33.75 39.29 1677 Tm -(* ) Tj --0.035 Tc -19.2654 0 0 35 60.8 1681 Tm -(CUPLA ) Tj -19.3615 0 0 35 132.64 1684 Tm -(SUKO ) Tj -23.4089 0 0 35 192.18 1686 Tm -(16A ) Tj -24.8391 0 0 35 239.88 1691 Tm -(BS-099 ) Tj -21.8315 0 0 35 323.95 1695 Tm -(VISION ) Tj -26.5622 0 0 36.25 37.84 1653 Tm -(EL11301409177 ) Tj -25.0171 0 0 36.25 216.65 1653 Tm -(594401600E043 ) Tj -17.9775 0 0 36.25 37.92 1612 Tm -(BALAMALE ) Tj -16.2535 0 0 36.25 144.92 1612 Tm -(RAMA ) Tj -18.9328 0 0 36.25 205.91 1612 Tm -(PLASA ) Tj -19.5229 0 0 36.25 276.83 1612 Tm -(TANTERI ) Tj -24.4066 0 0 36.25 370.55 1612 Tm -(SI ) Tj -19.8947 0 0 36.25 409.86 1612 Tm -(IN ) Tj -23.9535 0 0 36.25 37.89 1569 Tm -(FRO11975161010 ) Tj -23.279 0 0 36.25 215.89 1569 Tm -(BKOJ0132187 ) Tj -0 Tc -35 0 0 35 38.26 1513 Tm -(* ) Tj --0.035 Tc -18.9149 0 0 36.25 60.91 1515 Tm -(BEC ) Tj -19.3575 0 0 36.25 107.89 1517 Tm -(LED ) Tj -22.345 0 0 35 155.59 1522 Tm -(SFERIC ) Tj -23.5734 0 0 36.25 238.86 1523 Tm -(E14 ) Tj -0 Tc -35 0 0 35 286.87 1526 Tm -(W ) Tj --0.035 Tc -18.3691 0 0 36.25 323.89 1529 Tm -(LUMINA ) Tj -19.2253 0 0 35 405.91 1532 Tm -(RECE ) Tj -24.9406 0 0 37.5 36.85 1487 Tm -(EL4348821004110 ) Tj -25.6377 0 0 37.5 226.64 1487 Tm -(5949064913865 ) Tj -18.2244 0 0 38.75 37.66 1343 Tm -(SUBTOTAL ) Tj -0 Tc -40 0 0 40 48.16 1429 Tm -(* ) Tj --0.035 Tc -20.0217 0 0 40 59.63 1433 Tm -(STECHER ) Tj -20.5413 0 0 40 155.62 1436 Tm -(SIMPLU ) Tj -20.188 0 0 41.25 238.9 1439 Tm -(PLAT ) Tj -17.6831 0 0 40 298.96 1441 Tm -(ALE ) Tj -21.5109 0 0 40 347.25 1443 Tm -(10A ) Tj -24.0438 0 0 40 393.89 1446 Tm -(F-43A ) Tj -24.9406 0 0 47.5 35.85 1397 Tm -(EL5710191093104 ) Tj -24.9947 0 0 47.5 231.65 1397 Tm -(59440160 ) Tj -19.5058 0 0 47.5 337.8 1397 Tm -(G632 ) Tj -21.912 0 0 37.5 33.77 1130 Tm -(CRO ) Tj -17.5612 0 0 37.5 31.91 1087 Tm -(REST ) Tj -17.6421 0 0 40 29.84 1007 Tm -(TOTAL ) Tj -17.2804 0 0 40 101.85 1007 Tm -(TUA ) Tj -0 Tc -40 0 0 40 147.91 1007 Tm -(A ) Tj -40 0 0 40 172.52 1007 Tm -(-) Tj --0.035 Tc -18.3259 0 0 40 199.36 1007 Tm -(19% ) Tj -17.9629 0 0 38.75 27.84 961 Tm -(TOTAL ) Tj -16.7722 0 0 38.75 100.85 961 Tm -(TUA ) Tj -17.3405 0 0 38.75 145.92 961 Tm -(BON ) Tj -18.4943 0 0 33.75 27.08 926 Tm -(NR. ) Tj -20.3207 0 0 33.75 75.9 926 Tm -(POZ. ) Tj -20.1199 0 0 33.75 134.96 926 Tm -(ART. ) Tj -21.8841 0 0 33.75 198.84 926 Tm -(IN ) Tj -18.5808 0 0 33.75 232.91 926 Tm -(BON: ) Tj -24.8172 0 0 33.75 24.91 430 Tm -(Z:1801 ) Tj -24.8712 0 0 33.75 108.88 430 Tm -(BC:0207 ) Tj -22.6477 0 0 37.5 28.47 378 Tm -(|D ) Tj -21.2125 0 0 37.5 61.9 378 Tm -(BE: ) Tj -20.1175 0 0 36.25 23.63 301 Tm -(SAN: ) Tj -21.7377 0 0 36.25 71.89 301 Tm -(DBAFO0010999 ) Tj -21.4516 0 0 40 23.77 250 Tm -(CASIER ) Tj -26.8418 0 0 40 109.06 250 Tm -(1: ) Tj -21.6669 0 0 38.75 305.77 651 Tm -(CGPOS-CT5M1181451 ) Tj -0 Tc -37.5 0 0 37.5 555.69 3168 Tm -(1 ) Tj --0.035 Tc -19.1451 0 0 37.5 567.65 3168 Tm -(SET ) Tj -0 Tc -37.5 0 0 37.5 615.92 3168 Tm -(X ) Tj --0.035 Tc -26.1046 0 0 37.5 639.09 3168 Tm -(16.50= ) Tj -27.4699 0 0 37.5 724.04 3168 Tm -(16.50 ) Tj -0 Tc -37.5 0 0 37.5 807.92 3168 Tm -(A ) Tj -40 0 0 40 554.6 3086 Tm -(1 ) Tj --0.035 Tc -16.8162 0 0 40 567.92 3086 Tm -(BUC ) Tj -0 Tc -40 0 0 40 615.92 3086 Tm -(X ) Tj --0.035 Tc -28.2462 0 0 40 640.01 3086 Tm -(14,43-) Tj -25.6458 0 0 40 724.1 3086 Tm -(14.4'3 ) Tj -0 Tc -40 0 0 40 795.91 3086 Tm -(A ) Tj --0.035 Tc -17.3405 0 0 36.25 349.92 227 Tm -(BON ) Tj -21.5328 0 0 36.25 397.9 227 Tm -(FISCAL ) Tj -0 Tc -42.5 0 0 42.5 555.51 2997 Tm -(1 ) Tj --0.035 Tc -17.3257 0 0 42.5 565.92 2997 Tm -(BUC ) Tj -0 Tc -42.5 0 0 42.5 613.91 2997 Tm -(X ) Tj --0.035 Tc -25.5814 0 0 42.5 638.84 2997 Tm -(21.71= ) Tj -25.8238 0 0 42.5 721.84 2997 Tm -(21.71 ) Tj -0 Tc -42.5 0 0 42.5 793.91 2997 Tm -(A ) Tj -35 0 0 35 279.78 189 Tm -(2 ) Tj --0.035 Tc -25.9635 0 0 35 344.72 189 Tm -(7000221490 ) Tj -0 Tc -36.25 0 0 36.25 576.73 2924 Tm -(1 ) Tj --0.035 Tc -17.8353 0 0 36.25 591.92 2924 Tm -(BUC ) Tj -0 Tc -36.25 0 0 36.25 651.93 2924 Tm -(X ) Tj --0.035 Tc -26.6505 0 0 36.25 664.62 2924 Tm -(5.47= ) Tj -30.5464 0 0 36.25 741.57 2924 Tm -(5.4 ) Tj -0 Tc -36.25 0 0 36.25 801.92 2924 Tm -(A ) Tj --0.035 Tc -21.1395 0 0 37.5 557.87 2839 Tm -(20 ) Tj -13.186 0 0 37.5 592.94 2839 Tm -(ML. ) Tj -0 Tc -37.5 0 0 37.5 629.92 2839 Tm -(X ) Tj --0.035 Tc -29.3867 0 0 37.5 653.97 2839 Tm -(1.98-) Tj -25.3697 0 0 37.5 725.7 2839 Tm -(39. ) Tj -18.0775 0 0 37.5 765.77 2839 Tm -(60 ) Tj -0 Tc -37.5 0 0 37.5 798.92 2839 Tm -(A ) Tj -40 0 0 40 581.6 2757 Tm -(1 ) Tj --0.035 Tc -17.3258 0 0 40 592.92 2757 Tm -(BUC ) Tj -0 Tc -40 0 0 40 641.92 2757 Tm -(X ) Tj --0.035 Tc -26.2161 0 0 40 665.69 2757 Tm -(3.27= ) Tj -27.9834 0 0 40 738.66 2757 Tm -(3.27 ) Tj -0 Tc -40 0 0 40 797.91 2757 Tm -(A ) Tj -41.25 0 0 41.25 581.55 2669 Tm -(1 ) Tj --0.035 Tc -17.3258 0 0 41.25 592.92 2669 Tm -(BUC ) Tj -0 Tc -41.25 0 0 41.25 641.91 2669 Tm -(X ) Tj --0.035 Tc -14.2919 0 0 41.25 673.94 2669 Tm -(4, ) Tj -20.3888 0 0 41.25 693.78 2669 Tm -(07= ) Tj -27.6125 0 0 41.25 736.88 2669 Tm -(4.07 ) Tj -0 Tc -41.25 0 0 41.25 795.91 2669 Tm -(A ) Tj -38.75 0 0 38.75 578.64 2585 Tm -(1 ) Tj --0.035 Tc -16.8162 0 0 38.75 591.92 2585 Tm -(BUC ) Tj -0 Tc -38.75 0 0 38.75 639.92 2585 Tm -(X ) Tj --0.035 Tc -26.183 0 0 38.75 663.63 2585 Tm -(5,47= ) Tj -27.9365 0 0 38.75 735.6 2585 Tm -(5.47 ) Tj -0 Tc -38.75 0 0 38.75 794.91 2585 Tm -(A ) Tj -41.25 0 0 41.25 577.55 2498 Tm -(1 ) Tj --0.035 Tc -18.3449 0 0 41.25 589.91 2498 Tm -(BUC ) Tj -0 Tc -41.25 0 0 41.25 638.91 2498 Tm -(X ) Tj --0.035 Tc -28.0886 0 0 41.25 662.66 2498 Tm -(3.27= ) Tj -29.2271 0 0 41.25 734.65 2498 Tm -(3.27 ) Tj -0 Tc -41.25 0 0 41.25 798.91 2498 Tm -(A ) Tj -37.5 0 0 37.5 578.69 2415 Tm -(1 ) Tj --0.035 Tc -18.3449 0 0 37.5 588.91 2415 Tm -(BUC ) Tj -0 Tc -37.5 0 0 37.5 636.92 2415 Tm -(X ) Tj --0.035 Tc -27.1181 0 0 37.5 660.62 2415 Tm -(5.53= ) Tj -29.7989 0 0 37.5 732.58 2415 Tm -(5.53 ) Tj -0 Tc -37.5 0 0 37.5 792.92 2415 Tm -(A ) Tj -40 0 0 40 574.6 2329 Tm -(1 ) Tj --0.035 Tc -18.3449 0 0 40 587.91 2329 Tm -(BUC ) Tj -0 Tc -40 0 0 40 636.92 2329 Tm -(X ) Tj --0.035 Tc -24.9707 0 0 40 660.65 2329 Tm -(5. ) Tj -25.6919 0 0 40 684.52 2329 Tm -(S3-) Tj -29.1781 0 0 40 732.59 2329 Tm -(5.93 ) Tj -0 Tc -40 0 0 40 791.91 2329 Tm -(A ) Tj -38.75 0 0 38.75 576.64 2247 Tm -(1 ) Tj --0.035 Tc -18.3449 0 0 38.75 587.91 2247 Tm -(BUC ) Tj -0 Tc -38.75 0 0 38.75 635.92 2247 Tm -(X ) Tj --0.035 Tc -30.6638 0 0 38.75 659.81 2247 Tm -(2.93-) Tj -28.9036 0 0 38.75 732.82 2247 Tm -(2.93 ) Tj -0 Tc -38.75 0 0 38.75 792.91 2247 Tm -(A ) Tj -38.75 0 0 38.75 576.64 2163 Tm -(1 ) Tj --0.035 Tc -17.8353 0 0 38.75 588.92 2163 Tm -(BUC ) Tj -0 Tc -38.75 0 0 38.75 636.92 2163 Tm -(X ) Tj --0.035 Tc -30.4 0 0 38.75 660.45 2163 Tm -(8.34-) Tj -29.8156 0 0 38.75 733.46 2163 Tm -(8.34 ) Tj -0 Tc -38.75 0 0 38.75 793.91 2163 Tm -(A ) Tj -37.5 0 0 37.5 575.69 2082 Tm -(1 ) Tj --0.035 Tc -17.8353 0 0 37.5 589.92 2082 Tm -(BUC ) Tj -0 Tc -37.5 0 0 37.5 637.92 2082 Tm -(X ) Tj --0.035 Tc -30.4 0 0 37.5 661.45 2082 Tm -(8.14-) Tj -31.6791 0 0 37.5 734.43 2082 Tm -(8.14 ) Tj -0 Tc -37.5 0 0 37.5 794.92 2082 Tm -(A ) Tj -40 0 0 40 579.6 2002 Tm -(1 ) Tj --0.035 Tc -19.3641 0 0 40 589.91 2002 Tm -(BUC ) Tj -0 Tc -40 0 0 40 638.92 2002 Tm -(X ) Tj --0.035 Tc -31.7975 0 0 40 663.65 2002 Tm -(7.78-) Tj -30.8567 0 0 40 736.66 2002 Tm -(7.78 ) Tj -0 Tc -40 0 0 40 796.91 2002 Tm -(A ) Tj -38.75 0 0 38.75 576.64 1916 Tm -(1 ) Tj --0.035 Tc -18.8545 0 0 38.75 587.91 1916 Tm -(BUC ) Tj -0 Tc -38.75 0 0 38.75 636.92 1916 Tm -(X ) Tj --0.035 Tc -26.9969 0 0 38.75 661.7 1916 Tm -(7.78= ) Tj -29.0053 0 0 38.75 734.68 1916 Tm -(7.78 ) Tj -0 Tc -38.75 0 0 38.75 793.91 1916 Tm -(A ) Tj -38.75 0 0 38.75 573.64 1835 Tm -(1 ) Tj --0.035 Tc -18.3449 0 0 38.75 585.91 1835 Tm -(BUC ) Tj -0 Tc -38.75 0 0 38.75 634.92 1835 Tm -(X ) Tj --0.035 Tc -26.9969 0 0 38.75 658.66 1835 Tm -(6.70= ) Tj -29.6224 0 0 38.75 731.62 1835 Tm -(6.70 ) Tj -0 Tc -38.75 0 0 38.75 791.91 1835 Tm -(A ) Tj -40 0 0 40 572.6 1752 Tm -(1 ) Tj --0.035 Tc -17.8353 0 0 40 585.92 1752 Tm -(BUC ) Tj -0 Tc -40 0 0 40 633.92 1752 Tm -(X ) Tj --0.035 Tc -30.3856 0 0 40 657.57 1752 Tm -(5.93-) Tj -29.1781 0 0 40 730.59 1752 Tm -(5.93 ) Tj -0 Tc -40 0 0 40 790.91 1752 Tm -(A ) Tj --0.035 Tc -27.1308 0 0 38.75 574.37 1668 Tm -(|BUC ) Tj -0 Tc -38.75 0 0 38.75 633.92 1668 Tm -(X ) Tj --0.035 Tc -24.2961 0 0 38.75 657.89 1668 Tm -(4. ) Tj -23.1073 0 0 38.75 681.75 1668 Tm -(07= ) Tj -28.8397 0 0 38.75 730.87 1668 Tm -(4.07 ) Tj -0 Tc -38.75 0 0 38.75 790.91 1668 Tm -(A ) Tj --0.035 Tc -19.2541 0 0 41.25 26.91 571 Tm -(PRETUL ) Tj -19.1899 0 0 41.25 110.96 571 Tm -(ARTICOLEL ) Tj -17.2835 0 0 41.25 219.82 571 Tm -(OR ) Tj -19.1456 0 0 41.25 255.91 571 Tm -(MARCAIE ) Tj -21.7816 0 0 41.25 359.77 571 Tm -(CU ) Tj -0 Tc -41.25 0 0 41.25 389.78 571 Tm -(+ ) Tj --0.035 Tc -18.9664 0 0 41.25 416.86 571 Tm -(INCLUD ) Tj -17.3288 0 0 41.25 499.85 571 Tm -(TAXA ) Tj -17.2773 0 0 41.25 558.96 571 Tm -(VERDE ) Tj -16.1456 0 0 38.75 33.83 532 Tm -(CONF ) Tj -17.3933 0 0 38.75 82.82 532 Tm -(ORM ) Tj -23.4743 0 0 38.75 121.95 532 Tm -(ART.34 ) Tj -22.4793 0 0 38.75 206.89 532 Tm -(DIN ) Tj -16.8752 0 0 38.75 255.83 532 Tm -(QUG ) Tj -17.7325 0 0 38.75 304.08 532 Tm -(NE ) Tj -28.0396 0 0 38.75 339.6 532 Tm -(5/2015 ) Tj -19.8947 0 0 38.75 428.86 532 Tm -(IN ) Tj -17.7734 0 0 38.75 461.96 532 Tm -(VALOARE ) Tj -18.7435 0 0 38.75 557.91 532 Tm -(DE ) Tj -27.1545 0 0 38.75 594.88 532 Tm -(4, ) Tj -24.38 0 0 38.75 618.74 532 Tm -(00 ) Tj -0 Tc -38.75 0 0 38.75 570.64 1585 Tm -(1 ) Tj --0.035 Tc -20.3416 0 0 38.75 585.62 1585 Tm -(SET ) Tj -0 Tc -38.75 0 0 38.75 633.92 1585 Tm -(X ) Tj --0.035 Tc -26.4612 0 0 38.75 657.83 1585 Tm -(2.41= ) Tj -27.6736 0 0 38.75 729.83 1585 Tm -(2.41 ) Tj -0 Tc -38.75 0 0 38.75 790.91 1585 Tm -(A ) Tj -40 0 0 40 571.6 1502 Tm -(1 ) Tj --0.035 Tc -17.8353 0 0 40 585.92 1502 Tm -(BUC ) Tj -0 Tc -40 0 0 40 633.92 1502 Tm -(X ) Tj --0.035 Tc -30.9241 0 0 40 657.44 1502 Tm -(8.34-) Tj -31.0579 0 0 40 729.44 1502 Tm -(8.34 ) Tj -0 Tc -40 0 0 40 790.91 1502 Tm -(A ) Tj -41.25 0 0 41.25 573.55 1416 Tm -(1 ) Tj --0.035 Tc -17.3258 0 0 41.25 585.92 1416 Tm -(BUC ) Tj -0 Tc -41.25 0 0 41.25 633.91 1416 Tm -(X ) Tj --0.035 Tc -25.5328 0 0 41.25 658.84 1416 Tm -(2.93= ) Tj -27.6736 0 0 41.25 730.83 1416 Tm -(2.93 ) Tj -0 Tc -41.25 0 0 41.25 790.91 1416 Tm -(A ) Tj --0.035 Tc -19.6793 0 0 37.5 228.9 361 Tm -(DATA: ) Tj -28.4105 0 0 37.5 301.7 361 Tm -(06-08-2024 ) Tj -19.4712 0 0 37.5 434.8 361 Tm -(ORA: ) Tj -29.0339 0 0 37.5 496.98 361 Tm -(17:07:56 ) Tj -27.161 0 0 37.5 732.05 1372 Tm -(190.60 ) Tj -20.6791 0 0 41.25 196.95 129 Tm -(VA ) Tj -17.0453 0 0 41.25 225.92 133 Tm -(RUGAM ) Tj -23.9977 0 0 41.25 302.56 135 Tm -(SA ) Tj -21.4856 0 0 42.5 345.9 140 Tm -(PASTRATI ) Tj -17.9856 0 0 41.25 444.92 144 Tm -(BONUL ) Tj -25.3603 0 0 41.25 517.88 149 Tm -(FISCAL! ) Tj -21.2419 0 0 45 157.95 86 Tm -(VOCEA ) Tj -24.073 0 0 45 225.74 94 Tm -(CLIENIULUI: ) Tj -26.5139 0 0 45 371.72 98 Tm -(08008 ) Tj -22.34 0 0 45 444.89 102 Tm -(BRICK: ) Tj -25.7324 0 0 45 529.73 110 Tm -(0800827425 ) Tj -22.7554 0 0 42.5 167.8 47 Tm -(TIPARIT ) Tj -23.0709 0 0 42.5 272.89 51 Tm -(DIN ) Tj -20.7218 0 0 42.5 310.78 53 Tm -(COGI ) Tj -18.742 0 0 41.25 361.83 55 Tm -(TO ) Tj -20.5815 0 0 42.5 395.88 56 Tm -(ERP ) Tj -14.4912 0 0 42.5 443.95 60 Tm -(WWW. ) Tj -21.5852 0 0 41.25 494.77 63 Tm -(COGI ) Tj -21.8716 0 0 41.25 544.81 68 Tm -(TO-ERP. ) Tj -17.7686 0 0 41.25 624.91 69 Tm -(RO ) Tj -27.326 0 0 37.5 734.04 1157 Tm -(130. ) Tj -0 Tc -37.5 0 0 37.5 783.52 1157 Tm -(6 ) Tj --0.035 Tc -28.3357 0 0 37.5 759.7 1114 Tm -(0.00 ) Tj -25.2109 0 0 41.25 413.72 408 Tm -(7000221490202408051 ) Tj -25.4008 0 0 41.25 644.72 408 Tm -(7075618010*0 ) Tj -28.8689 0 0 42.5 754.65 1025 Tm -(30. ) Tj -20.0063 0 0 42.5 785.91 1025 Tm -(43 ) Tj -24.4949 0 0 38.75 748.71 981 Tm -(30. ) Tj -20.0063 0 0 38.75 785.91 981 Tm -(43 ) Tj -16.7005 0 0 36.25 654.92 451 Tm -(HR. ) Tj -18.5683 0 0 36.25 689.96 451 Tm -(AMEF: ) Tj -19.5058 0 0 36.25 750.8 451 Tm -(G001 ) Tj -23.8362 0 0 37.5 666.79 320 Tm -(Tp: ) Tj -24.9103 0 0 37.5 702.73 320 Tm -(00275182 ) Tj -21.4516 0 0 35 702.77 278 Tm -(CASIER ) Tj -0 Tc -35 0 0 35 786.77 278 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF"ExifII*  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqwH"1 ~u҃?`~ro>?A ¼_ܑ{6b{j0߭bͤd>mF\s׬ _VW˾5Avi;tg}mbf6!bep]FFlFY׆I٫r*^'op9CDleHByN(z9Іq#4ӕu#+eՆ= ?l nˑmIŽ 1.O#KiC#k-Mcߣ~/}7d@LWx!)X鶊\v32QGbV+؆"ۆ+0I-~0_&w~w O (`OH?>HU,?<~zE#Kg~j$?4vKQoޟ -?=s+ rF+m ð,ֆ9Oѯߨ XeZ~ic4wMV"pBzGPvGGÑÑ_hY越UR8 ߝfXd_yF5ۆ5#ݴ0/' -~E_|Gi/_xN?&~K/{gW~VΧUGꎍgog!6*czW&cӽr:(~ #'VY_S#y5| iNY1PKYI[->}mtk~ã|Yjs]7.wwU0ӱW~5sf$G  L> g^2E.q\@d m_PJ_'VcRn2C\{x>+3Ih Z0jqf[p٨r_9S>>>hr4V<vͯ@BjǾ~%WXdtcWh8y g|b.39GL%Of -H[3m|BLjdȀU_E.P^=ҮG*>SCێG{f(+_pZgr?"e*Lv&sGSퟜM[㔪Ш&Kd¿^Y^Е%$-r5(|uKtUKx|JYaZb^q W.9x޸l8:@@"\{Q/`UTb/)83@qNrf;YEq4L"@Td<8 -QtRǼy覄|$xxyj IɽuS\-Z.CK3r,@4mh, P-A8U-O<l%Rl*W_G^kDr -쿣mcYy?=62֔]@~B2PLfsJƒSgcPC.|rQBERx|uP]Q'`)*|֦VGTEKԋk@# 0`%?kiߠ]TQ/tOgz*@@|Cӫ<<'4RB񭏢"e,@ct8HfW `H5uV3߃lqLpEFr^M~b= 3XuF}'tBc@O敥GSc@g[fy3ill[j@]I#>|Η[]K //uvu X)uG(f%qٲkfϲeYî07+5@:3RS-_Wɟ$waf}.9D!KjsRRGZM >>#Rδ[>kX٨O*(s4PnʹPV6o, )CYԣyb%fip2R\xoؿFI:o﫯Wß)[Uh> - -6)zkm)WX9n -eˊl)Oﴀ(3 @V܅~,{@!*eϴ]hp˯`f _\x'V)¬Aer@ɖkUAL-! #3UlNLF#mqC\|n:@:A>(=36O/&zz<( -fDAD8*+5`^sr*܀\_PVyoHD)e hې(K*2"Ԁlٝx|zwTm"\qB|c{8l·dUmBHf@\h^*`'b8mUsJ{酂Nl9q@A/ -+BfƒO \XbM.@J.{9"^ZTS6&qm[YR=vg lTdquF@[ 5`lkLuɟ%hN9@UmR>`UvPE+O71AM߳yK7.RZL5b!1~B$~hdVjRU)znkפSnENڠhV̻@.k&8˴XzSm[cGɠW%kLEhG p)Կ(6gkڦN&픑SWF@t<هjRq19j]댷SDr蝐6;qqV/2|r -trq~w%J[Ug$4MȻCb凹ܽQ"c購J R,tJg<<~53=2lTu#tpE&d3=]j{? s -' f:_ERy_7sQ5 ZK,I:K 3ɛ裎@&R= Fjeį_YPBfiHdx_wMVP-E!-vXFPث:\r -cfj/͖F7>~Or~Vi~>~1?꿢!#)*xe:,5:+tZ]G qȠ`M+e-OƎ(>xډzTmCKҋ-[,q<3/8@Og_O yOPzJgI/@)YFkۢ 5C[ENȬx7@|Um@:{p@I[7O.5W=kQy6f91qކRn{mk%@㒺XV*T@+YR jŸ#>un1])a`'_5k6hߴUm@C&EonjVRh܆Gհ9Pom`^ -W"Ry0}*wtV3+gz ̥oc;74p^`̶K[_,>CRzr 2Zȵ>❀ -&T||P/]Җ_ -V}:vz}= G߈ՐS]Miֽy6h/ Y9S}Z#@CVK9_jV Unp^> -ܝZ[cV5(ߚ?r]r] -&,uT 1abExi*r$flў0.EX=6*ϒl/BߒVJ_eJ  -^uBkӕ>j^ѲPWw-Tgr)o-(ךbQۭ{(#i}k_39+~q{/'! <+ue]DMffA5*5g:\DOe~tc?Kju41-ϴ[ sB{@Fgֆilf ǧT<35 Sk*˿S-)__x_:^f81f rū۟Z+ )t6I_Vퟒe ?6dZ|zd.P{K](W(qruԳU (UQ8ʣe< g=@v@!xh00:#~Vg]WV!7ްlBw~jz7$ -ĪYKN3 CLp5`\gt DENe5z.O/q("jjVj쿡&gc -} -d(=1gQ}uotw ڴm,\sY,2APQ r>9tR䫗50\rE,]x{n]kl1?NW/K_RfGeOo; ӳjOD>_\$Mr@^1w'hPqTbt$|ykWNwnM&jdc:41$><]P;u{AP,>+XXK71~Y}2])s2gTp|ߍS٬kz[ /$7Wq蘚h岭m-o'\@Aԅ"6sIWꍦ?IbD-Jkvm!3]qv_#\!@89QU -Jb(wbїqg[JOV;q@ ,Whyaj4!`&yKSVBekbrp*Vn1MbljP,r(Y,ߊ޺lE-յN59mJke$-F8D:+ňxLT4q Zyyݺ<>ʶxtɓ}UsFerzu`) f -h:\yذ -%>Y{xN9kW35YK::=+cꊂ.MH"_rZ͚/Z]gʽ҉oLJX76\y+vUt uRrxkw: ;@$:n9@e(\SfvхNѺ*ߟwFSm̴ ͣ++j.JrRZУ 'זevW -Ք9ͬm@I_)N$a /w)sT~>Ի|tR;rij>͙BNJKp1Ӳ h,A<r?ĴUH -g[u,n*nω -5x`vlTkgzإz$١f;ůVx_ɒmu YA..<^OY~&"ek9*r^:Œ3y-R{h9ufԾԷv׬2sO_Z>/8L9sJUXs^Kc=Ѐ _W|tVePO@GݑVb7 )}6zՍU0*u|GKL?$͇2@r8<W{G ֔J)ɠ[!~Z%+Y.܈9~j/m'q("Z(+yGIy'ߠX~"ǔ;w [iGV1(SsZ|;Suhukɹ,^?b}Q^ -|}.l:5}F{:SVn{p9lklRZB -aU2zG>d\L՞X·;CTp9#I%Fv Է` ^?Kgz&^vIGzmFIժBX؋%&>xA_V# "[8UmP\_Axj:vXE]7rrJ>>r8Na!~X;BSkS f%Nne6#OS|؀艖r8+^:緎r=|VYp8ttK -eQBh&/1((}^J]D cOٹ^u9PjV,@u_XֻfzܙLj9Usr"*>Ư}93xd[jG6Iq2yk>ZױZ+j]l~V>՚ih^}O - &f=\s%{ .c9)W_'ΫlF] F>XO9Ӿ̯\d:O8q@*YS}.^WHwzRKPW0p}kӲ9@R(UkrڅD9s ,fGaU?Z>GoJz޾ؚ<«Y -垛-C?TJty}U?|A.9S_Ѻ# @6T.d{2]jp~jY#ޫ]o6V;Mc9 M.B/5G_9ڌnn;n^D (5nsYu5Ҋ%q4%9}l`~Q2Vלؼs֡#OT8;_Gڹb9p9|"L!%o&yw >%QxGV~K轊 -g>sU v[%dtU㪹h~@OJ]'?>7SZL\UP㵿^7$*KlUoيphazO` -厺b}U5x;N>m@DzyкP@CQO_73 =h~-'!fj9 q-婷)`#l%oYDgWD5IzuVl?;g^xyWǫSZdZ1ۥB*W,VfH-j2F1bO1qDQiZW5+o4\Azꚥt_K/q:eAނSv\0m/YzlpY@_{,UcdtwЈ%N9}ݽxwg.5ҫJ?[['0SthE6Ŵ +49|2xNrxl+瀴y+K#S82[{y#֍-'P}򵄴 GlNWm8{Rh_O˦f25ԨsΚnNhYJ0ҿ`3?wsP&3@^W}L)$P+2S⤿}[(w":{]pQW,~8$zU1kk~Vw*O12ɊtnC;v/ch8Pg2e(٫+85 4nd)u_6s˝x9g4+u>1CӯKn#lt9}J 5XEwX.E槫Eg ׬Nʹ^w}bJwC?m!rӛx?FYLS}=d~I QtJc[?}/ii=9TZ+!=koUQX} n(q|e&ϴϟ┫OuB@'|?=qnwH${!.l]UޥԺ~J`v9d1%2M%l+h(&z@]?=~S&hyeef0}njCYh2嫋UmY/Tof_^ ʡoyupg7W-Pqۗ mP:PDOg/{ 1R-Zy?.5u"%gw:qȦ귝I Xls|s%劭vad'ckGE׮Z5_~EBgMFEGEp%nǃߔ7{*V؀(;4?ٔ->,׸8Xq-kt#^ToZ-t艣sjq}0;ilVs:+^4+HiW9ߥZc[ -=㌲zZpơ/n;|MAExtE&іFV/؆ߞUz*} -op S33;Y9:P̡%h'|{B;Y21\ժcZs[4]ӈ}U*]|ޘc[,%d{<ez|VP/U~c n$;`G罞\sfKl/'ϒAO>__d_\Y%"wǺ!=W] RjtjBq9 3⚋XaێtS:4j^e:na]R۽x@Ug6z=s9qW#~K!/Z*T9G}x4;D>>y]2׻^ܳ{VoEF)cnE]oclxM1 -R6z̶~9&Qߨ+<МV؂Ֆfmn}m޽g_D?f>MRtz$$gIߛML”+5Z;K[~vƶ_Ӹ2-x*5 n_ޗk_fT%wZZ֑עt63m3a"Z:(ƀ9)~4uylQo(q;mֈrkoU#3 sMұzX(l(U{DTӃo ->Ig7۰m`֣nH/d:Jkrvxto ٽ=|ܙZRI"7oz͚Sfo^fyiy,dT] -FOI5h{"vX1G=Rg1zĎkcZekMj*GGS:Z=ʻ{Ҽ4sٝtp~Cb? ~߶o2e=}-XAFhB@3:~>rh wb#J+bchʹ_}K"r/xPobxu\#)8 { -<8dZ%)xxMY(&VS sSes7VB S)ΈR7P[Pe|=hRj:n憅NS{=KOUxvΣ;-ү|"Gس#]wŞ1Zoe*qLC@Gykc>,gc<t*(ޛX\,X,>C=y'ŎLfZh{ § R+DM3 -wudk6X\teuvJkU3d^-XKqz~EYQn\,nFs av9փWҥ4ԓ=ֺ*7!ّٵa]NST>piŌDu;aw[)[q.؆'ItF:b*]W뫹0ޝHgf/c5L@xx( {@x=fVYfY8Oޒi_0ŖI9N|Cu}W8*U/9pU &NM[[S!@tڡis[uy9eGA۫t vbi]3i_|}YmTr?$ׯ}NF@_옟٩5ؑf]w;}GxT#uuY|}fkf۞ui'ꖴS@A{,yaG .3 -ݥG\o}q`M!@f.΃(ym(Z=|$ BWEn]c& X\Us}u|q 7]6jmҰ|[vG$EfVln>E;N f/u4M%əbAKc5Wj*yծo]^oĥ}_3)ڵmv3 ϻ'숝W%,qkg\ANN>*~[뎊e5Yf -oTVhmbdRrq 7 x5! zAbyw=z'%Ֆ!F9VYN3wZ#.@etM}yF/~G +eyE3I-=B@BZIcg`9:w?oEv~w'?oD1#tDWa$$mJQ/dͻ1/ho`͓,3FFT}K\WS͞thKJwՙ|6z5;=ԴN93 ?gWKQ"m<\*oWt - ~V$#H]P=`2ԙ#.CCFoa>ݠwL7u1-)7򑒕ur-c4dTuhRtA<=*m7^۽bmvtتz-w.BI$=~S2yv\l+FY|~kv_m--S"qH_sW?|,5(g>jz>:Uc©X^esۤFÅC^sHNKBX<79$U7ο*4:Xe޺eڋDwv#:-nY'V6*-9ia ?8Oxf ofn=Aq{>+FE&T-k qn-nyfY%r-T"UFkYƏAezr(9 MkQ)5yM[$V%5/fi3LyW%x,fW%gf -]"&-S Dֺа&:Όgf !zi5/%m}RBl+WmByg4_M#U} -H 2[î -u3I|H٦}\b㞯VqW8꽣'=2$Ճ#"1 -nrS*d';YAF:g(]}\տ?|fs3+oU$);}5 -W; ^{+yo|u_n5#/^,t;"Z*Ήh$#sjylodˊjo˚Q.TE^6}%L]0ygqm2j.a[ߞ(}uiބs="BAlի-^)J[J=N(L\a*VWg};N9bV]£S;9o[TZ|zGlBfZ-Z'qS-~&7zݞ E.rlr%ۓTW34UzީLxN#Ȩy|}b!~p+lI 㫞Oz0ˠ\1I=ެjn>fS|R~748 -etٛy"\Wl@#$E39ّs%Hy> *-pϾ???B ?<0o~pm>& -/Wd3>"`'"_9謗o|D`Zݶ(CvKɔK|KݬVhԓq90:WAu͞%B,iխ*W I<f,\O]y*ݰ{8; ӣ|VCJ:Վb:aĻ-?^yYzDu}my9tYNtiBP+_Rɵ֪o?,~sL=S㷚if[fUpPzy2Ƚ]qKz~bDя5bQ.6{C2WB?s}+>Y3Ss{9uak9!/(Ur/aa.=Ie suBOsN)h(ڕ&P=~$%^"4GۊGKw]I4[vWuM:d:l΅m).|8yQ<&'PzK6`{rvwBz+"\bսw'o9L;]>S5bUX>*D)࿠ z(&eiެG$&כRThͅfa}欋MOT~_ȭVUoZ{)6e"%teA?]r|m𞊥-X"WF*H ^#]}|s`:*9]^*p/1mV/m"H"@e?kYu \ˏOt$hoED&X,2 -4ճi~z`c@=53CӞ̅zHWX*uOg_y=HΧ+Jg&;LRnџv[u[ 0g -Ĕuj<:mVxs5Sg*Cinz>3-O+sZ/>oN!JVQ, n>IKu*Xt㉮22}ۥV!6V)OEjIJԯ*f8IO^mdUm']wq?jHxxp)<>~%  l\~zo }Ȑ5PI+O,{> -윐DKBTɃnԋs,YݴdYWKsX,O']hj+:\] -%;%N_xH!&9]%NQgkOg>Bq\!&yZy8@+ 8Ԩ'qv"e\,;n4eO^Uփ~ߦWISH:E\4:ݒ+l&{esj3ۯ)7lҴJϐJSw+w[ݗ5\D|F{ -?EWJDU8GD(>eVvhfgzeor|M+W`ItwO}-YUm9Z=ԊoC2=z`^i5Vm=$w7rv,_tQ2c2-4ڤm;fF{4Z|7TQxqiy,Z,b_Ceݪ\/~ˌj_R,KbmǤܫY;)gUyn-Rp_"5MřOZ-;#Dg1풏-9<sS.blŋ1ڻu]v&Zeq\jڣ @fY|7z~)xbrQgo丳lu(&k+eދbV -=v/WDe/%:{;C G̸'`?V~{~?Eӷ`S'|`_Jd{̧ݾ~ɞsY y}=<V,xSBbo"!2n\%iz9+V\ܼDd[y#0ui1}YT;}Hiz.bj>-O5r?VMVIJz:Ƨ -вDxRb.#PC%(䇱M6Uʜw#UdBx/{d˶9j |;L>Zw8 UTDGh:&w}=.TgPӲ}b" Ґ.;\ ze;}jZV3\E"_;;;~d,T6퉻ua%rO^+:DTƗkQDa4NxQgh}lװ*Ey#HtwC+mm1)\>+sیuw}x}7=3L74I-_Oa)J;Sx=u"-[N O_} 40k碄Mkgd2H &=\nvؐ:Lb[|Ewf~ -瀹*VÜB =Zd>>&XiSAgl4T.7vm% wc1ڹ(4rErz)~8BRNZޑF;}^Fi/,rNS)=4?$i6Mu\kV;lzIkٶf^9he5)z~7rWfh[B Gyo3m$ :1o0%^oL=¥rӳ= A0܌'N?.g<>aj{TxYz؜cȍIV -^a&zK -)RlFڶW^[||ɒz |5yFZc -7H -t?>Mwj|ZYϴ*uV, -Kg+]18yc{ze{@A#J=@Wl@ W_'d29َRCLCKfzdxJVM ZoAtSoqQ/5k/*wN;,$LJTCܣjK)ՠZ#30rf(whjP^',_u{Df;Yz Eb2Vy,ˑk&ި:mkFt\#:;vNf6EdfEkI«:'5PacgP#j޲jWC˥gf>1ESt:񳙩;&8qYv~vxUɫNuڅ/ywٲL(j;jv,ijL;r[QaY2&,vAYғZQͦe>yGEFP+yjA <[^[%6PO:"C>Y[S4,l瓫wJ[V=M +wܣL՛z4HZn.hYb'@weԻMOg^kUFtiFli,h*(CH@H[ʕ-Χ.hTߺ8hGh=GZz%{{$[9wK֥-9S}1iGzKXujl:CYfR(H8D]-i_Ug7lq#E"*l!,2砈{%OP!6=*_AeIG!t{/YyU σfL>~L}SHlQ{rA^)^8ٮ_7 \vhY2\Nx䲗/嫮Q9KiJϚD7G|d:q2&[#5/GBr+hiў -m.̭Go0}j;OGc"WYUTj]pB-4Cמ]:.rq x=ZWn!I>C(*ߦ~WSʼlw}"(KEQvHVkrW|}JJDG)wJԺmbsKf[.eVJ/XMe|Fy Fm3*}GCV)ժ)WM5P-NI5?~z ߫I(guBz!*׬54Pzѵ?C /'wo}#,ḎwH]wem}yfnǶ|xCxSi*VR[% IU B.ۏ|yrM5r<' J<:EAKMU}eߞ96<+X}G>qc}gktrt*UmX#dc;0^f3`C9S n=,ƶRHfV -OXTEUh#!@˺681͐ TOIly#G|q<&W<Fo<}rt%);ύw3+<:4d熯xz燯[xxԏ9\H򌃒9}#'7P9 s#;z5+NvUs)xy狯FxFVxj߉xm*x^(sFi ;iv L9wb[ -P*(6PgT;` v>)N6y{p{lGN~ }S\djd_OVO[zHIZEck~};t炇O  -?OvZ(XW¬1+q\+Pt2|,An^mӒǺVL+8-tec[9IH(sGXi03<.1Ijlcb s_7SoΡF ]'a}T1h$!xY9G>RD*y -rB%c=(h!SELGm q;H\np885LGR-&cxBLf 2Eq __#1{ N|+L-yD،13sZc_b؀P)Mn*u2DO+MFFTmKVHF^p4?/WlN(mn"}2b} bȿ3B9(|Lm>9|RfwD{Nvx9bk)ASК7 -6| _tӫ3J^~?hAh"+LD:MI4zߊ{냆7>Ff&fN{^2IXFaZb"DRlF ]{Fa|mb#Y!5j]) oLdKU SH3'irq:<Xu1A֗fx~Z #CovwʆFݰ&v.d_?gȊ`gl&`<0u#٧8k|-/}EAdG Y ͫj3bPtfP|=+u"u|m2$m dZP5L ~ųHW9mjs̊yp2#,8?3Aľ&>[7"҈~lSL޳ϠbQόs)Ay75r6إQ2!}Իv$p`#j;?u # Bb`Ko[zLFȿZpm2M}t V1;qf~H|x!ؙu:[g^&\~^d~ZSgzȄ8,3x* UaIR ;ZnUkƃXڊ6zjOڷ:=݂*+G3"a|3c}#:V_=,azH؊7uj|+[_@*,Y@x:LY]9Em+O^ˁqӺ FXDUwQEXY7z,r б[~ւ '9m+9e3LO?[_[k~  #;͜G\x>Y|MiO4ht ɍl_Ԉv£'ZgFOQQ:EBU/ -{S/Gra~F8ѪPy:` <[D~=ߓj]̖bt1|TŎV`PRU6lbr59Q}B[n>wN9833ΘL|2 G_gptuǎO0g~V4 29P-ӄ>`tĜ1lKKK&"pbAM|mTZ†b$W3`#8w@& '!S -7Ôx㏺ĥfT!t(f~&DA1͎#GbŃhC8iؐ`Hu`OB&K3=io^#1*gJtF.͋ jzБz1R$ cҿ9⊻Y,_=Ff. w˄M kVȹx+S]TbJoR7a*J'@NyL~Dg2=?U.NvWq}dHògh W X -4T110#ólbcd>ңgXMXiW4'pp>X4l4G8 -3OWb61)gc1KhgE5-_{"bbf?9t=SSx>$§Crھejc[jقUj}^aYLֿd_E݆%G7Uڤ6iM,zA -soB?BytڱX-W9EuíOvv"qoօ{y 2huwX@G9(U?`٬ǔzZueu4"9F)P11*LWd>pY7;v˄rܜ y0 L`썥1fb>ŗxq6e"Y* ou1j'0`FIz޸b\K=bsB'l>V~dΊy68Z'x5)"62#-`(L}>ك )1+o~ėɑif?R -X=*㙞4ւ#-ӖE$u;Q8 $a !ʵXf`, 2#+JN'IA31ӍR qUY\C(:>m&gU6C^Uo+mSgI}X/"=IFcSqpдv̾;/Ճ D(k7\ H3C_+g4+JaJIm//+1"u-%uWI _v\Mp3U۩fj[F cr1 ns`n_")"cLL̢ȸHȉL[v6q8}iNm+vi1eRH<>("_z2gIFBX\8^ج:WdMXcv*+H+QgbATDk7 gR@*vgp#G_P{cԵ"j9˧HZ[ ܡf@a(*3]cVU&}ڶJ@6{sD.ˋD"2E*b nĽ& gT3ԮI$^c ?~:z,) -J 'cD2YoO2??fNwfمT%f_nw=􃫈+y&lׂ{45`gj-gvCu|NE^VcnT|@e<*rVk!үkҜMz-5eBIQJkb&&&E߆X`OnR ؾ4`)re]#'ѬUĽ OLQUzZCKZ5G TϷKov4ߴMe]vt}ڱ*~VSNIYꉤ"D>=z$wJt?֜G[CՊ\٘Kq^ -uH[uirTq.IRec,ټu/Q(];#'TޫgU$k5X˚3Q<餋B|sȳ+X'rҊf8":MlQb&Usd7Uή%.O2(jM/PL;U.Z?]٥Pobs}fb"f{q`&?DL{v`XptJv%-h0 Ǔ9iG"#?|;F2guofF&}YSnLub]df{닯=&ʝI̍DBQq -c`EܲթSMYA鈘{:й "^8DcaBW;Ɉ44fwGSYǿi]A^_ꮸbv'LdJ)qb -6iWL! Y!8 5\s8&~S@Ras2(HB!nK$dLJjѼOm`bzy^AEᒈr qS~7>l${J{WZ^+S~.VV01I;ױΞ)%jש[s#+EM5GS11""?d c-.;D![t؁ΩEWڋM`,S -ųwPe'  w0M^34U*>,&[+즿d)4ڹ"AA~#ΒL+\xIe}ey*d Yէ ]["m,~Xt!F]v&^y[G/_ĸiL^s?% JD}׈ֹюN@9[@&?oUCWYŁF5--%!,A$LӳD}Fdg"c8?>esoA| ) `!P~ !;.1\2H.:Y0}_ii챉>e0UxW*Pc+2#uOPz^d5 lr6Ɩ-8uF=r-:q --QW;c)juC%u<΋Y)457,˻x}ɾek$\V}4|N*o3Mj1ӜuJaeY$o"qzӨc#j)! wډSq -oe4%,HIQc޻h##ʈlg?u˝ )65#rl{ZrEFHlL60usEr~W}yG;v+uڐTOLivL=ڍ!k45*ev70 -Fǹ6'VDDݫ`4f+ &.i6FI~6X`ZaKQAXسy5!~d_ N=穢r5B8-/V,i1g^ -9Hwד} |JvMKY[DUlwuNw>IU;<ʣ`)KZCN5:?/o=i/*Uf!b d'f K[Rϱ kXx= 8277ܟJmKr)v:31bI)'^").C9L20Ǽ88ﰠrL *KR]jZPlԯj-X?xV*btBES3S.8hΑZ>X@O*Љۗ1*lld~Ţܖ[5MЕo_c.\Dbk4-û9p1rPz9fjH*et2V1ڕ̡*$Kc^vܣg~bftJ` 13UY/K {&Oi@~ -d9;Kh7idDc[ZZ15ևDtYZǑkk}D2v>`gJ ݩ3tۗdANSU `кل5ʴtafP[XҧR6.ieRS/Yu}bCP[Iv} Z܀av;zXV0qQYEqJo ω"}ߦ{Pΰq:pjug=srjґ\[*]ڬO -8 -#6H'po,.MZ,6g +[$ťv]=jU}I҅Dj Ps};{Uom!]qf$bcu6 -6FԢpij1q_W_XGm`zs3GsOu#b }Y1BmuvmT6GR` >&8cXT--Cm`9V]m=4}~tUk"M76 -0}[lٹښpu:HN7TLŗ0=͛M  ~ٸשPIGe @jc؈313 ŰydDGa@JRl>RqjZe&>#1~ӬŒ31 5c=֨A5hr#svx.YE Pܭ A 󰉵?{4IɫŌlT핪/*f&~bq{8fNg 1*gFly3?9d ܯW͛\MMMK(oл6jGT,ILӃ;YԮQM4W?ka|7]QHښ A[9 i\"""#ޚqP p( cF>DwDxzA {r -)6`j'x^I -Pyr onqܪkyꊆ|QR3ʗk[$#013>N4~^u[}.e+f MSM*J}MRSVP}h{*$1qk)vV-*@x.\K8 (yxΰA $Ku͢$ک7y77_9 NŒ&&7vI=? s<5ܝNz3_{og݌ngeo;+yi6y컢1]/{Lqȍ -vh0 Q졿rȩr'Iӷ?cfفsÇoX~XlO_M8Oux) ,SAuH/ _Mu58|0Cq Ke*/t%rSKv\z6W(mD07;U[$v=F"#4"qy]ZSeŠOE6yUU>زӥ:O4]^m7BWEZk]c+7]j+'U4)rpe]շ%ȴsd)*-`5X?k(A:0 -`޽ n('60V4+x!gs}yi')*Xw5[?d2mQT :^UqoR瓣ҜyS;ʙTw5!1s2 g8.[zX229 -"wŽC1jQ?+C!=ϫzJTȭXgqݩA>f6\&zZ>K(0>Thv(ӗ_~*\*Ѫ GV:7Ԑ1T"?}$0Yѿ]2"#}JZB%l\֮"""=Ƶ#adDDm+.Ex+~t\M2)ioe,M:]g?ȏcA$=/u˲-1,}2I=ǽV5l=u0Q TU? S<\uЕx%9s灜Gx&M% @lήQjj5MRO{+ QӶ*;:F7+$5&wR ?aj6w1}:O\eQY6_WW vUyJ` 99{*u S:vcQE`-A3>j ]{B.%۬^r"",f2u&0CꯟOת|=BD0F7(=@# sl%2!/=ί2pNQ^G޷'_:".+zK}#1AK'ZxHWs{lʋT7Xj 3/<arAf+ISw L D$hQޛv ^ȳjr2#"?XɚH V&Yi'9iYUi9JΆ9iPhg*/OCny]K&7XpFiwߵwμRwQQ71Qd>jBǔf S[QPЯwR.S!/z\GDD8te# *VgE0AL D*em0u+łJLFtӫ!|pR,ٞT7U:Ekz4%#ܙY Pm{dWe*%M۟& bR xuu؝42(44[mtpR+ BzdJϾQ&h]]~\ ,Y -\M~W:1>1#D S?an@v|P|' -v/yn@`ժ7b!13)Yx3gN=}$rŁm.,ðvX2NFO<,r.iyiYhѳ=7 Eʳ[6]~<, }{jL|8LUg?3lҬG|gc<4a\y,a)e -0 pG1!zq9jYe?b2lF?>3<-~?q Q5ձ}cHUN uu;d]nlg,o;$w#L2'_e4dcըS v-(Li/vʹˍ6ԇ*=6V[Z*H%c>ҍc+ͪC(WmH -*2ޱwۼF"3n‚tDJI}jƢ rqo11f(NA޶DǪJX+ο87P-Cq%cxnn<5jN]F; -cC(UgSA 39iM0}1%IΎ tegagg"xzX.&? N5a<`tY/۩xM$}bcneTP_[YlYֵZ?Z Uɝ :lGզJ 6tTsȻY H t26W;_*M$6[{TqgPB)XGOrÒy*S=ӾӷmkmefOu1`wUY>&w-ikm򓺊}EǴ Q3'FxM[-Uz?yi˙zjdg4^0cv2iZ;|D1)72o.Lv;wqgkG|BUrOό( }Կ1n?r<j_Prc  -ilsRԭł0#)Ol%:v73-io;KYZv2f3bvmʦ_2z.HHlDDmӷWgKכ:_;*c(Ο$y3Q%G&h/G賍e*ܬV]fk?)\zÔ ᑈwupjۜLLoWW3C*)4E)fŀ@MLjZ }J1&âg -v J,i)dBbb +5 _ ܕkcy$bF~DdlsbMsӨq~KY^XT0=f?[[nӐ?}e 1^wY>l2q_zKCI7 e*Vɀs1W~۲0QDGS<93;E4pduhR޴Y嵾バ(l@[Y@&꺽5' -/QRPVzɭņ$fy)6ś`~8aYelIj. z )~N42uky<ݫRթtÑrE2S~?S*k<^g[O_H]u אo'#R$9'WL~|\f:+ =G!QU?]o-( 1=4+ "4u*Qo_DU0&^`$ɟ|'W`Aϋ.!>uS݌cbP\6Wm~Oϒ^]6 -mAp 4KGMĄuO!|K}UBw}PFiVϺf?+m}I%%b[Rdu>n%|.Y_K)@6tg[(lkze!گ}sPStSk-hx<}ؚ cUA,MnTbJMK)u:'Kbv>٥r~PUǭZRukžPHt'.c,^AN":ID|K<ҖeL V,q4uQ_V?QvMiZVB?[fLzl[I\qnu(״%/:ù/҉]Nxyjev\{K&<{#40 ѤF=%gA8 }qv4(ӌ)oTHu,ԱUkfW5#JLc8)9IөN&d%UJQFB3ůOº5Qi -em B)捁sXmYNW'Ջ9ZfpHPa<gW -ǷԲ^=?}2mEc5ś?!`!ME0N|/Yihsg=9虾yGt9&Hh 9FFF~<e  >vSqsO,o3I{| I@+ItSEM3]GS2:" -՘~2l0m& -l86!Q(E~;{DFtu EݖADEMDG"dDlY`n }FVAS)PQEx!QciuԆ/}ucݿM b{mG؂{ ^ڶqpc:!:9➧FʙDFFMK"R9~toK79q/l|d|D>@.BVd%ź[nVUk[&Hc#\;cahm_X,+ZthwY73V.- t6f?r>?EU0uʗB/t4͕9dQ)aݧJjP$Llsd:RӝZn O/cc]-="^Yֱ%/\D%`3IbS0uRrBk2R jȈ`]j\nF6qe}B~a3Տ'E&ƺ}VQ~\' 1r&-J3Q1eװҖK1?h`ቘDX8TN6:\@Ȫ9* >m˯5ִ.֊z?źb@ȈǺb&6U\! dI.Ċe4T5S< -TbaHkJG\.}*WGQIT9X_˔/ hCH' .b2_yG.?n -'_~˗Z[\hپ9E\g8hls3 `#1~?1M 8D\j5AcܚI:@2,ӔULO <@Ktu< -Vf9YX[,Os6RڠkӒCZvqt-ms:>~d?#=P/o,lL;zqJ90)3uxG{ޒhEz-R`DO?6ť{ݢ|'mk CxKY-焷x[g݌,x,\nS}ujRaL o?|9\i]N&,?ss5 -7~c+]!fmnx閒[WMW"!BMWAښʮjgtLTh%bb&Vy+`,c0Ty?@W+_T?$wE9^@~2ۍ=A015np?'돼ʬ9"2!"3hIxxYݝ@y$Dff5TŁS+Ta5jrڳ:;+쿌m& -WQ1k@$;mצDjleq#4jI֌r,Y1rвNǡvpwL40G琧L`IV%RAkf#G']Nw@MIDLD`gko<b~~ 'R:? rboz?~uݝ͜lgwk;ynFM듔ɅU$ϾaGӪ z~1,JJ񈉋{~01 61p#;Ѵ2y3QȡH'x:-eb#~jyA2vŔXҪCf8U&fY6hK:I 6̵+1VRm61_ݭ&=Sr5ehWhK1uE&t\3gKEΆ[ITcsӲb~ST -$NB'uXWY&J#T]^y(g1|'[mxX=   -t)X8\U;ō* FV:.+Y44B gKéiIWdԊK ٕnq$Пu8t/]I=7: iTfFD'43ihgӳYiM+99J#쫪J:s` <,(xKZT!M}90u-?SK?9MCߑobT?LoXհ|gztjuh[|'.'* qWd~Lg+G]ڍ(*PiΣ붌=*۫(g:y)AgJ^_ov]ۮ|X\7|'ӧ<9iYҲ='994GOֵb&CCF"b"?1YOoj8U"ʉZWXB\׼QMub&&%BchgF3O-G< zS`,ͬӎyu;M#`a\͋]2&S<5#cjgcS6^[QѼ~̖ipNyG[iÊPϊ<6n55s6 R {"?TVMKLh:*Ί3\*m[;Zۣ;tgo_&Y4󲩂y[s$T:~ߩ%G'RcC{eleqkT/_V~)<7[C/ǴPdivrMG8jYҮvu0DF"2rsA56{_{!e5t[rWT2,HFUFeJbR_PzV+ln?ĆD퉉o۔I:vZvvtuyֲt͵FR2Ul#JVɈկb'߫z՜-yo;y\Ƚvgl7o2oru;djL3ŃDLȍ#Ms-JFvwqqŪ c_r"h[H `h$Eq23V0 -$y2ΰOZ%iw4~(ߌj_/Q^ƬZ~3| k5R"njZcX]s#R| OS,[T Lڟe.<ݩ5Jy7,XZTOYQ}cv5}5GՈ,k$+ -t}>h1ttt̊vv:fv:獩6xڙ]YWAgv4,ċ7M|33hFyZkQ%nQizv1xU'[-˫Ea\;#)U LӢ'tyhD58uIh疥r<])D;%ƅĴ\`ujH*VVxԯ-Vyd&l ߁+St̵$Iz\\e+/PLeLܾZ1i&ҚsVrS` XnZZS&fZ{#@GڶN=FN:"Ș?Ϊ9s ?fA~:E3%G< {{d^9b5J6lx9Hao|_mS: I~_5ڋC y@ڄ}H#nT(pWb򎿣HFCDbQLڈ[-9]̅D -q"KUVo=RӇhE-/"巆hOSw۬11 +=BKLXbʦ,=6Gk~]|ϫ77:B=_t'%7ږv)<^12>Br1/i[fOP=8G](*KBabWXvYYWQ2%)< cVҍج9 _S^EIߤjCPsgўv25::6ί<Χnw3O',|=,%/ uPG&C!]xjCVclkLA+ E\Iy_WATҦRٌB[RtS: -qDc,jM=%o- E6}żK^e]Az2_GR%lrⷐ`Mˑ}6"ˍZS!"PCR`5r󓈘Xb cz9>nff#Њd&&"cm[#p ksd{7T;K0`?'G<Ul(\YS3\t 3fJqp_ԳekJ}C}/ Lwe#mQ^C1A+G{ <C3}_(W1]63S\h8d7eTbwV.5IIrҔT?)WJҲcHΞt_h s'::Ntt@\pOʹֈyY)b:(ʯ#Aꎏ 69pzVutKhIlhA,U0qb6oNSm*wrk) ibMRuV'Y O.~O`]0ҐS -):_YmbJQ23j"o5 ban9W0bgnwIDC;KQi49ҧ;}3&VvFvZ^vnx:1*>و(P3|qiQrW 3îkWk[) ~FJ5 u6;6 -cGuJԊHTacQ[Q+C@Umm.0nStfV-Y4b,Z$jA|q灪};֍R%kVhԹ#&`$l::6#DolEsH?@ T*$4C,tc{m# ĩ=q:8RatwlUck`bcVڶq{\L -\d+ ߚY@q8i2QE]/;-/;=3;=7;3<~U33.;RH c+Էzp^.|w3d\dp|kU^ZG'Nr "6~j;.I:kBy,}O;x n<vNL~3zeEkV1z(P(}fNT-n?nTw0^ݨ/%vzyy阏Qyf?BcjWWRa)$K:ȠJF =X 3.dѹ[vv󴵝mg;k~h|R ntm@W:X+bJbbcxr%Z_1R\'c7m]ᬤs=+jgo{;{101fج(\+Kfo7^_޺yg<,cZk+9FqF1d㽦8HZ,IJ+o7011Rϟ!Y\cgn,e-0Q"c"^*x`,`ԄJ6/}"3sFdٰTh۱,Pn.lu'p?S݉I撂|d o0ŔLwWO{o*Yǣpe^fx6!-N--^?p̙`P{號sC#N;ߩW;AW,Djfl^ 1?(3sogogCUΆW:Zt|jW:mSwnX.8 q‹HϭpZXȹmEgDfbgW]BeR N&A+mh(yVy*9Ũ9ApU:w:f=Y4hT3]1:&|8e\%KUUffv?1k -x89&1a -b*J/[%Y˅PӬ{,#aˇtzԬ+kÐ=62 -5V߼@ -ԫqxK0dc-Eav(>_rj0羍[P%!] NUsVh;5:$zC>+po,nr -ݚQlEzTgOJ?~H.ͫ=4;F\zQ%KYLt]kȍ jB> k+I?""![=JC9F[ -Ni6S\M:gr4*NӚIc:G[~@~t#5 b^1$ OjzjܻPΞ|y2誫?vm -lѯUkLWKmx}[,1ssL6~ݨ5j5Э~t%rsoa@S C+_f"#?.p᫬~EyRH Rs|6X1sɘX_WFrڱrIJÐL:~ZJ -7]W]/upNݖ5T㖩lOҌ򴲵ZO|]jN“6$[z {\%%Ḍ VI{jֶD@Mb#T!WZHu -k׌snx&;Jb&ݕjPjve"42Ե5ؚA`O쯭4~ND|L:sӺEXtؐqsuG ?U(O4DۂrZ5,Ԕ5] -*v2)ڌ]X,d`2)Yij8J9(k81 հ|tNxet&tזn.ϖPԍZ<=,VUA8 I=c#(r&6X@JݲߴX?=""jHZ&Ei[ml4$IjX_ӛgVP&$kC }ͽϤg. vͳlZ,hg#B<sg,xKy-g,/xg?eLgTN)GQ5(UM)|]SmަiT}.ȵ\c휔;iwdWt9 (%_}_R,`]9-ûeZѨ}/Y7MCa?tGCK*v?:2`ulC"T@9ud 8`GyƝZ?iIx)-Jlðvf9z62\^H`c&'M}\!ro3qT]zc]z|oDPY%h\6m@sL#]]r?ipXWgI 5H`]9,1 ʊl*N@FH Qy(u:p1(6mY`($P+C<.2X |L c$n;`JJ+W 1=u&' -QKl61bAiM??z{{Z_d?U׳ʦST1``bjՁK [ gĨRXobUz%-C) +w(5ӡ=7&E5|E5j;9Rٱ+Kemn!{^o?fZDVzn+Gj-o0C#l6OFFzk02l ZI%vV=xRM3]exsWA J:{gi(rhXE.cD6 -ԐzɮWulLW_v=6OÞxwgnxV~xKYgTӭlwA$@θoP,2BTj xw[96kgN"٘OWϖh8 kc^DщHbϻ1m&sKrvr;MO1ojѤ*x2+m+9̒dF9i]q!<5$gN[GDfc<um0h`XW/K3gSeE@b+3Ze -u ?ָ"_3Kڟ[N:t;Fz^t1eTU OBzγ+MT5'wv -vNrJ`QuUjJV5$THH&dg*ZSJk8/RVƭLR\245CQmn;opZ^ոj@>XѤݚo}N_6[\NGZͤPz)BjƿO=25*hg*, sLgФDfIڭ]=1Kyȳcvܯll+OƠ\Q)+P_ȿF?otLm-SI3 bqBf#I!:IG=Vu]VitԬ&;NDgL/@z!ɛ75S1DXl6\5` ;uЛ E /B\Ђxs!^:P&̪!v"Dr97/=|YI-FYlշ{^(#fvzg[kCZi=j=e϶ܰk:WJ*b?bCӰGf.5|sLa2NԡjP!+ɀ%fn:ekcPlPKNLwZ`&!c TxU0q_Ep>kXm獳iyܷ*@j(gyog<vsg<%[ s<-̩MX4$ 祺⵭2^6 %`ž[6ƹma|_Su?,=+;u>nI!߷hHP[oYf&8GyibUIDOĂq -5#Qڜo5$XvU3JcO}"#;J}ʔr)>DDsSl -M777k?KASn+7Z"NuNVcr0f:'+% -2́a㪷)dn)\Ο݈Xi&WۈiS=5+pH2"qmhb g`@;70! ( -+jÝgm,Yod~by癩9&Y3[捭:';*>zˀG :Է_.Ր.'CXkvޝ=ǭCq+dYF-Y&~0 yg{;U =)A,$&B vŒ v9\X2WP,;93=dYY[|q[;$Ķ+t<QɈnt|œ-B>+UF&2/e -G#EsXg+I^mSr*"rK*4``x aida%#Y䛞LoME -8}:L#ѪY_,K[d=.ʸDNU -mV=m?̠JYy,B1'Xa"ĸ\8k:|=b5kJiU>Qi˒[isjiOڂX+Xڦ_UYt~x*-l6F q%X0[띊/UDJ>Iߊ3p%*ds#ӝDߩ> $MheD9e0}7,*VBU@Az!k9ri*e۠uu,j;}kBu E]m_9!o,sf'P7`3gjcU,HK~3,1ƧΧ槓򕁱 L )׺eAܲ,رiGk[}Ca(N6Z`9&лWb,gơ 'cOP6 -Wm9'lt*AR`AEW#b+r嫫,S]rtiJ/O+luK@WT6xTZCK|{&7#nI!gEfN̏AD*|*m;m;5^S}Jj1;Q1Hxb!E}DD32CgWPʶ}DDwчY-47; -9P)JkA@F}ݳ$/Q)h9b-\*"/W?Ñ&r'}6vgwq{$ -kmOSeeeDT61dUbX<|U]Ex2R{;TJJ⥬MfӲV!XpD‹: -[. 9ԫķ+lgE;DGz[5c "&X\%"Q9]*UWvN Ozϒ.ͮ?cȍIaV}nF1l=n\H-gwPGcnj *p  -gHܸt9=Qˌ}8'g5o L:9"\*׍;`^ZOm3lAVpl4wGZFW(Iz)/;uB3M10-.Ly)b+&VZSZ"յл0k{K3PQv:4+ QG32EegU^HHGtw~Zg#v{"[!JCԯ15lA_L(3խci*S\dW;hP ՄO d]dop >&VJG*98?K٘xjX:YiE/;mk]ˏ LӘ"C煩DG4zf[u `jn##g>x3ppK9baa2:e鉈Wǽ%$Ҷ6 ڍx%x%0BSkEuϿ"¥Jb2욖!adoo'iYJb6XdI= &9D]|zڎuE4ewɡ( -gJ =mW)%ȞξDUGANaLa!VJ̽hko; -I*5 \I.,g6:vK_~,XЈYP*fmlVjVYP'^.Vj?D -aykfy瘽byn皷nyy-g7x{fvS/9ձ/ ސyn 5^_8N] @ ؽ&7ȈahIʨ3XǎPMMɊY㩵!iin8TkFX:Yn5"|A1%ws{[rXϑ<ɍ#8y4n .77Eft%\;Og*B&C>l6&ɮ&[#鬋COGM]H -;R[ByZ5%a j`hRHOΚ,SLҏƳ5f{wV0fdbg aj,P:ZkiP朋Zu)6TJ֬.ݶnbd箌/٭MG >F \0եiP<U LFZ<|e\2L5+W -^B}:ΪeiL78* 'KTN\D~ )JrjZ7 ,?t5'rinvm1sdaN ƘB}+^:Md]i56•eNjS$$H -pӞ"=:˩]W`}%(4j, J3Ӂ -fi[[L -b:r`TL!n_4=$֭Nڴ1;ϼz|㧥t #^=bPWOk׉aP9.JálS;?IbhښX̔ZF٥͕F5k<7n_#' LDƤG?-T'.I'%mc*tGuAR!CbnroE{KSNlLRg}#ݖ.;Qn9/ԕ[eP/[Yײ9޶`ATݥW"JAQdLssaW%5 lb۔W^˞s<LD)VeF}}-&?G+y^\}d/D3(_Xj+vB]"*4wMo J%tdVɯ -w٩B+C a2%^+FƤx9gDGTwK1sTUS_y^Xy+n>@q4_?5}$ ,amJF~bw,`Cv1S{o?~Ɏc=KIz]$ \\A>k9尹/+^P]Dw{][&a5 DZ1e{v2QWFFEhy1Kk ?_#JDN_U,\QeKZHi6 ,JbՈgZ=pSgQY{f4ћPu*ːAZ4:0ƣV:#Էnq!TB^e@V֠ׯdwV2^Q*ʍ') xJ -[y${3p3gS:; TpFWF5ԬJ"ΥUv\mj1kQtj7=*U* zQkl?.!Mw5]V!)mKFH'F!2.ӻn6^W_d4I*,JgHӐq$&xa*K-r!v RM.ˊP4"z 3%A.ݛHcrb!˾;*"#ITC5X)g2B)Z D&ܪUKzHɁPC +> -6"ORN.Vc}/pG#c+V@̧€5,jrlUdV+`2Wa[2W*}9>'OL7MʩiM@XԖ;296l-_!K( 5LF -o-]P(z*Z_!7wݙY\Z> 6cSn㰛5g) `KOE]z+JӔ2"i3Lof9||d,B:#1Kyg.Nps6ѳ62#HnD`qD=h3OyJG"X){ L\1Tv9 LM?4/}K< 㗁TBbcP Ywg༕<51M0ĕcՋk.%NG?&I>"SWri٬+CUO%]C֫9f71[NkXe6J -Zjkxr'MD|Uo1wNB"B( *ie#+DZiu:VKb6h// +KwvC+(|U,2Dq -OP^~DJeoh -̳Jk[^d65Ut,:Q♄j@c;z -O:.Y 2xٴsitܬ GЮ<9NeuWM3j1)q) N]&I%Z3=غ:kf7NC ?{?\bU"_&j5v1z]̼ӊJ wTbHt zOQi@`mLjenjLj.z`NMꕪR8K%u*z *}ӠQAi#vRޙwzwzW;3.6$qgU>q:e NgX5 UCέUmK%+ڿb,}ZK>u:o#j [Vu*͘EKUjr̩t&$eȥX #88wЌjqD\K f3MtQ]֣9]`̷,꭬|O^{y}ڛ:!%3i>I@j5ԙ!$y}@ž13j\cL| ,wXmq ?Ez^ѭr53 s<-3 s<5s^{¢g- ۘ&|" 9C8$\1z -RA[lƂ `t~)ڔ -ӮG?$ Ȍ½؉p8a"&Y -QqΟ*1ir劊1 -ߖ@ĉ׉g長|RwIK(/K>^WwGU|mcቲAeq{ʧMLZqnInn r/FiRD|ի:bX 0#JQZ* B?Ǐzй6EooY\sr 0VΙCwu2,)2儡MR:Ov 0c/=>bUL^wO]ZgU-mj*nCVC8/nڜEXc/*(uf1zL+ gZcT#IG(TU9( -NbV}`7ZĄf!UzZm.t1ՠh!O{߯GtZu1;Sү牿#I&gԳyvxS; W;-_+ ,UP{E +a-6Nai60{*vәPF385?k7*H Q2~:geJ3iDIJ"F$ -du B16 l0?34?pgQP^u%"EAy\Mvo4A1?_FV0Ide'P++{0;F[}#ېX UC;K/ 8?MHʥ"%1e'F`-T:θvObY7ǒCxbONMKh{:M6jRjDwJ15NЋ=Ml9u 2KUٲf6ˋ`cztr pa1Lc#g0F5ejY_PDo|7ݰXӯN\ҡLPh/W!,"X[Dٲz*mճki [6]-+.4;KJar-go3Q^C -%[}*pF^˗!&1Lő S<5\Uu`1ȰfpjX<ԪGN}YCb.\ ")m,+u̟ViL[~ERrSx.݈U6dnK&p -_}j}5`TPHdf֔U 41(Razlty5Ӗ$b&9i_ޡC8]~1w5䬀So*ݽ)}Z|@*ϋ-coGP[64FBbxj벉nUE!sg-SMiIPud˴dN @$%ܿ3Ӫ\03hyC0Wo6$2!#&b?2G{ɭn:۽97o@Ѧ8w^בeyuā -ՉU-7o9m=zV&ԬVvmy]lpsB0jZ`:=x#MQqG/NF:^3R5,xS<~‡}gѭ%+^ӏ -rkkȘ/DGl%M! `RQн jض@P(uլ2g^Ū[-QJl}$튣hHq2@D2/ges|O禼GUpQz"vDbau9{vP (02Pl&> Qt -QmZUd\w+%Ŝf\m||ZWj# h9*WiXpVu1,_hHuj~}b`,܄w)}0)I 6YŁ)fq+lz Ԛ,h>G-Ri+խ)^,JxybIqH̓םwCtBY"eҕ".$YI`;d+DH㦹̇1m޺(iېxÁ;JjKVD Qj1)p_j\:kTᚕW!4*,iJ ƒVg` <;" F׭&BM*lQ(.7US)[- [E\ζ5G%zz |MoLsKQ]Ѩr&ږ ;xK&)0U&YsLiI1U,Z}Q]z%#/]5Go~b#X䃇9MZJ?ǾF4gT7x8Qb:ABWSM5`Y~,6]5Ko}_BN:qS6F%uK5I1nK#N\XT\M -%M*Bu%+ +rجU -pqyBI.Zk+tUʮ% -tX)x;u5Ui]2FUꦼ+ZM/xHίrӫ :Z]lYVW҉kloӨ-Ff3Ji>̒ Ʈ -mI޲wG]- kwӬd/1d%Yw6#&ʼngCΫslgwg;9wvO#:58qK3rS6Fw\']{Ub3d+R4ۻd#`azW!$_u_K 2NqJpI1: ^s?! -&f#K}|S6b7:gMM';ԣqɼ`Ao1WgP7s&gҊG]l7WJ -OQQ} q6wg;DTFMяT^9$;gr|.;}M\Ij)k)qz@Ƣ!1FGNv&Vpmi6uP@LC\Ԝ w*Cǒ̦:S,-OFxF9 4\s9 F8K8k}@8-#ɍPKI%1mXM{4ص#]s8 c$f՗"D'̦wjMyb-Vr1G=h\<,M<9̈́*d5`qd:U'ZgIsƕgh rL`F)K&%*(WEBސ7S_rZA_&aa$K`0 E&kA+#1qxV;sM|2,rt1VL0d$}RU?3Q1Lc]R]t8Hn*QV1ΐ3Q[3 1y6wPj^w,V}uFsh3L38gIY wRG2|9NtMϪU4ҥ`"gPIN )ܻZ}|}ܥ62u+qPq`:eE|Zef*58y 4 8{ݭŊ`K/vs~vV)?uc+0ZP[_b Tֶu5mX.D|ekdaa-9FUp-؛j;wWQvU)SY]y `A.ڥy~gD|eK3hקּJX\W^W⣸W$}K<0\ 93>@e;]#M $\}4XcPlv-ɴ mN9Pb ,g5-q[/Ik\"(KsT.Մ,V$f]yW:$,WmUC~~v,jbx1>,>WbNUHV T:;o;YYf\vԆKȊ,嵮DQ:meP,:XdpSg{V@ T**|ue.ulS)X{ef.j8YynqUօ f2Mp\C驔8`zݹtKKZFfjK516V hB]|\t*_jq4baS{X]% j\/ м}8իir+hO.}2lLӮrUþP9S%v4,Mji M}I[vlT*_F8[MlU[ǣ8ӹ^i;ϗ]o1#X޽iG !T#;UY:x*e0D>8&zj=r5g"#KQLJ$+!@YxeuحsV2Ș=HIw왈C=!\;:PeLyӮ._I>_Fhѝ:z&tLhsgogkiVZGߘ&2_211m+3.zg3[Um?gZW;' zN]G XQUgIhEuTpXģuA'ZXbwacSId굣:80Zcܧo6FV Fg".%ȿNp y-WT>-3;Nm!3ӑQϣD$C/bA;3-c9XOnQ 0gqglLrղMoN0LaJL&d@OK^(&X鰸ǥ?N9L@cxɓf3!T nsE1۾(PJq豳#5O1^>kU9+Byqǘ k;*a ^$L4*ʚqb as7mlbSq㫡/C*9f+HyUg? & b|lG-,KJB6QPo%#l&rmi^6R"B55AD7wӝj\#rKf4)tio*MQ"D`:ddj l8X"O+>, 7oY3Yk`\J+?_l,5raXը7g66gQˣG)'G5U])vzU[VIjNT_hH^I(azM1휛ֲ udZ  ԓ^HEq%mz>Ci7nqT%|f&}) {c}&{ۣb3N>xWgfN4[vȅ),ȥ:NOT0?_w;#v.ޘS3S ci %AFp~X -41dk9o ->)+( 6yGK>;?04a&?S>߹5&H}9yc5k6TpUB3QԨLNP2lZ-?l[P(ҬpB9}'r0wtUJ |np Q6 DD/S#_%&8uR9D(Jf) -&}̃FR흥HtEz6!9(_sAV{Ȱ\WY)VV mfivjśiLL-,xlg"pɗXS@]FXڔxY[8#ɘ25'0Ek)_<^31gVVԸK(F1 I8Ǟ)}5z)ҋԖk 9|#5>z ]ebZJEfru-ʎijru8 Qo5m!{v}!cuN8jr.՘Y!r1~Ȧݷ'&q% H󽷍_Zr9q pj6;L>_yreXkRK :#qek .GZ) mraðbmKڸTG{75VP  LJ_hU|Y"C)+[D XeRC2:UeYu@y= -uZk_&O荛;-_]ruK!a^m9zYO1jy`5+*(I0^A = -"l~!ca3+js%Q~T|LPO|s,\txz3i8'm/,uk;9YuݑbN9wvͼDZMiqr9F'|RԽ0B7)_MQ3$/0| Lq,Q۴PP"CʼnD㗚Pz9tDS!$\1*U=Vq9ؿ^qgbFJf#)w-{Թ4-l]{ꪞ!wbpiZ+2UXߵpI$]7;-C xA.%mfYl dvzEڶ؛M2kblWOl;yv)p.BYT8ՒDǓ,xz\Kr6aONoL0$Y\WAI7Ns"N[i6TR~Y^[[P}A6*c#6QUXF4( 쮽WWoŨg~Z?10HL`2#]D4&69+RyZf|c4m:=Jm"}$b4ҕ-W)uð_VξgVT,F)i5մv-1l7RU=b~Fg. [NvsT6X+N1((G -@vS|[fҮ7RU P.=mX:"T" PS1oi?.i+IȻMys#;+;+;/;4҇"Η%~ WYͧmo=Ե|3 M: ipőDHJ :Hi0¨1Dz&-؃f1wر!TlZ79[gfUikX\U5eԮĢP<1Pp*b0r[nU$UoQjPGY,<6JQ'%xHA@Y -Mv5C>ՐUZ*:*\QnL/`jɇQU`e`΋3ѳ" F"1.B(V -2 11+D¦-*܇תPM/!"QώCO+tjū 0F\NL{AU_ r*P_:bCcSb$$Nӆ:AL @C/WP'&2JDqZBL\fP65'a-ҁ.8G.YSA4bʥG&`bf|7e/KnYecV'qUxN d% -oUt~]e _:;*>DrͰ)E<9$J_6iH}֚{]@Yڧ"ʟ+kX)H2w\xu$l!nhN6/I5 -&FsK-j68#%[ԬinbE~k:.jVȗ{O;X v<}n"*w׈mz\WbC3"8O$٘R%fgFsSK3p|g3U:3 ճˌr/sZAW;3ܵSAKM>u=CԬNt5<3d6y5uk$[yǪY9j9]v~j1e%V65 X@;L{^C>Fk!:kT+)ѹ`KKWc?/OW`YB( f&gLUvPlۏ nYʗUhBVJ`q 5@I ސ;43VM}yҸp d%T W)dyvw{;.[m#ݴ}&xg,0ƞxgnx玜43G~^)qmKăY PR+ -IfM/pXvcho6VhW4bpN1)T8*m ` 3wT-oвvRRxZKP:ڱr] MkRu`V& VϏֽYfuu0{[<~V2[NY"Q?+SQf@楖Vi'ljIe -F|gj,ri>ƠUGF&"5'6mja>@>f7iXǯ mku9kV+h4pZ쫮нyFu)ZsZܩYHb uѥ;BgД  & -$rq KZs27R~R5jGjނ}\C -j9j9Y˫J⬮j(ҨsVZ{Pz<?ԙ@ $6R~C[ΎkvgGZZΆg:zt5ky3ièAs~Mˑm}V'j*n$61ԓ?< )w :GNg+W) mZ?+ s2ʮlF R yjhe{J$KU>Uk ۋveS+u "(7A+QET`'9M&q?Gr-i Z'|9`9a%G Mz:a`Ԙm;Vom Lhx+ttUZ[İ -`e5F؉?-˨KdUN:ےRҸRq]eG#Szf1Db#?;V|4(\YV] mu;nO})bū (]9ZX0ذBQ1l߆B6eOj,k&b"fGREcl!?䉉&2o-CTKc&ůF[RU@dM s:՗Y|~2m*mtUrx^:3p3I6Lm2F$[mu'E;-ZVY :}:7XHxx哥FVVH2L..T&#brjflun)~֊ט6U;z^Z\ -1R5NG2f&f5Tm<پUNn%B[hI}%gGy?3 J~SjĴD& idA,2y;[fҨ.3چًnSf"_|->M+g@Vvh؋U-tXjWʷ_[C-sP)@Xx9iV8yһհ'1`/oAZR`YxC27 Fd`6&zNx/SM[C,]eɚy'G-xÿ\i*3{V\0tד?H4وq}9mCf+Ϧp 1#R'm_goCZYXΆg:t5k9sKZ͵Ӽ"gֱ/ :1\=\Ҽߛ-0#}K 0a -u vJ|OU2Ki]ډLW챬kSf1\Cde_kyD>'fO xFtcNnr諔ۺ[ 8-c'm{߫WyRUqˌr-U0NyXfӛ69y!3txF2U3Fbb$r".w:LLy /4`՚RlC曨WR$^ZwGNg{;;]N^Lu> 2u1h^[Ǭ@͞; Y@ qYӟ9Ze[ERkWY5 #jum8^`Pڰײޏ-B#5*oDiﶞUk1u2JV,xی(ly!'.$YκAM#mv FTQm\ TV}a;VlQ,bYPpԱxjGn\6]ʲ뫠Ѣ} *<҆ xn8 cIuRʕI]~[jm]fXR/MBF]zJ"eӮ^2xx"#}k4RiY$)\X-3;=3 -⬶v?DL ,"ȾD.l56XȖP3Ѿ2D<ŀ&87^>VdI*+YΛQ, Zc{M*sң+@F[g:v+eq/bhPc39xV["Ds(l2=^c;W(\co;[s -bUVrҧ9{o##8vixU\"_#: [/w$,5mLBI`YzI$'+۠ۊ U3VqqҰO ,ݷi6.\065-OEjrmb܌ފ̢6a0j Ӭ9YiʉӬFx7;mVL uGRՀlZlԬæT,Ho7ho : P96p:,xX# - 4SZ텋MFXS.]3M:;?.ZE+E(i -e2f4Xl?m8*;7Z14QNh=ALw}D䱞yP7wϰw*Ԕih[t|cjfӝA_--,QSzv|2k8f"vӌŦ T6V2Y?D9@ -9221 ޯLQ{S!N:ӾӶ5ym9?Q - F#VOMG2(igNJT.Vf -& ۡto*+ƮJڀ9L\U.UvK\FK<9/Ԭ 'bY9%ˋ%5|-\c*_\FHVRUV\ *g*ggS;JVҮvL*giS;JTҦvu0+s77r̽??sk8hU-O\rI0Q1M'_mckMG[4%YGFxb#WP?@xLXCAYUcIL_[;SSJK͵Z.g+?&NgvfM&~*xi5.Gз2w0R;q.H a|Tv\C]DŽR?rqrvlXuu fuh3C`)dj%ZvםV9&_h:FeK1eë\ϙKTl Q$b"9q6vU vnRDy)m 6.B>OcԊܫ (Ֆ N5W zLݳxNĮqyV[{uU{vUڻA",;lѴ0mkbtIC,zjUuiô󱱝ck;+Y?;'dB.Q=vyoyRu8'pKTpױƕvچEkߜS,nza;Ka-9V%3Vv`QE)RY_7,H)Xc(r a*P@! \0df4FNRrtkj8?sDA?;g~b]5$ވe(m?Ke[nwZwZVinj&PpJ7ʏ:xPG=z7wW!)Oчș -t7i.c41H>~N -70ԩo.7DU]Q"J9k;^F7gy*c˿XL|atKl2ɥ,MU~X+ƫSoXcQCܽ<ш\o0?hm6.pX7c(V;#U^.R+u1zeE6O-y_qMq3+hܽe?{rcq}v*IkӮjb1 ܁ju5ZTKacVbz6ŎPAڬ AW`V=7zگ ՂUv-uJ -낿֚TSKR'u嚊ԝ!@t7HB!W(w_¢jDǣTc>`}O;Tw3LgyS;ʓLuWg!k~؉t~4Z<ы6HZ]A/qU Yoj[_FwZ -m9LhWjUIy )\Ąm)" -Jr,ԝǏQdQ1-(293f6% .z{Y0mUHq1="bcxk\ycQ.zY41P41%Dx=x^5oX1 -szk}b5 ;y(x=pa{x(RiZm2")4ҌMD~_*ìHǎW}dC>J|i1lS lX$N7%Yp*ʹXQ0_KoG`FržtέZVĆ)獣:Ljc0D8(6:x;f]S seT :=L_dڴE{Ͱxu[ǝvTco=L ZKvC o, .+j~U(EnݵFX9ϗQtɐc쪸3Q/K<(œݜXQ\98VDF qv+̺YTY5DٯnI*WH 2p`0`Oy鸍ٕ9:^W됈ٱ-Vt_~pwSéL>}xOW[JhYE|#.1Eص:dRkU[DFj=rap882J:yJY:'j]ٽ¦F "zC蹣 &}ӾӵZ[ .=g+Ů0E [Z4F4ܝ6ٴ֞@ :!a٪ց6+*)AL.v6` tBVkG-[ -$~bi皧* 5j9(]%LzoS6+Үf%cf#mgNOHgFofFgNmNpҧbK酞J6F\4 -,DA\PCŨ;t~ܶ< mC -b -Y_G>f#з)G1$eV9Gu,&XW!E7Mg/W[d޷gwv?5"EƠݘ|e* YNc` cmƬճgjS -"8i>ݱԈ - }˅+h=6FCS^Vd~i2|NR8nXN<&eM2OIɗݎYJRUP|Ħ$#Olڭ%y㟊WLbfWgRuUΨ|si(gFNK<,U3#S<~lrp6vWg;x1= -v0Ā}Q#ɧrZs NJ9`򜵦tUf2H:mr,Q{;z:E9nU Z<_)cTDRaFn,3MTtz" Q5u,z`* }.ĥH_+INLzڦ-侼h)lΓ_ 0ZRM"\B}߳QSfpS)fi#:Lj*Ȝ.\g``;\k&_QGPiCʓ\,2j6hJ&R'/V Q޼٬aޥr 7dǵfqvoҐYTWsj).k?L'ujQZ7Tk(%m]M.Fv -}hjTU3˨xhp ywNqnDUg 5YNv97FYIBT=s,wqeŐ^냍$庂XXŵ"?M9^P3LDLǐm錝 y"\8.(P|uCיZV- -}xv7eE8b/HaaT"a94޴ Z FTe̴*ʱ1Y0Lb%䨰:MBtʬ۲!cʆmdONȕQRwV7P(a8h,iv_vP%l1 \B#`$CuX^,{JgggS;JT;JTҦv3LgeS;y\ Ptq%.'~rt2cMt~,v?FP$qkzڪm!5چW/=?u2k֡j~OXv*A|&"/kr^BYFD1b] V mgmk+SImrB&2%|'+ZT,}`bTE5R#uaQdqZBQZvL'|)%~ZF:-&C&N6 C&x*\/PI~_Oh8KI|`n(+3%Z|Ly6cP1I-!l_G)@B6k!o1NS}B+eeˎ\( S?*Vۓ13>YsL"q-/Kͪ5.,u6&F1,c: &Y,)HA)6B2o.-'/`k޶]A-]ַy`H:}Z=rrtB39[xƝ23⎾ -kDz}R8!4-b"U W -c)[7KVz+&-վ%8)A_QZlNF =vemEm?UZFC!YnuoTv_5k}nM= ɡnpD%S7V"g,e1S.fcd4Céo>9Q+FrLҤܽN$V'!jYj8:=ҙXzkD:KMQT!pſK<V+쀠U槳QneIVCCI{` - D.y֤t`SH'RyZ:3#N]ql.yU5ѳ3jˉ33Y3W߭[uz`& -i\͋U6+,zR:f24;P3Vz(~c;]g.;Nhl)(S+):B󏳴fќG:Jb's[Q-Ep%FuU5dL[^ЬRut?ZQ |tg.C*O5OJE7XX3"& 1uM*)򻔀ylb\lDRB}`ԛ;ȕxM4`9UR»CiLfut=BD]ڦ~+4䝞M+j\DجkZϿ|@mS_;M_>myA tf:Ej=@,ޜip>.D$2Y!: gRTdJ!JI<&csxޅIGQ_b0Fb1LҎB%B-w`v$j[t5\jJ`kx>v`]55ƻ3/~ػ +amh@$rb&&'ɘ*X./ -e#YyJi內6 yF9MJ/eJ~jPXg`gWi\|49hbiUAr^Ve;9  UV: :rlֿ!m\G铻C+\{teZ«9IɔNxe'}5jdRںlYve5PH:]m.%sbcF!ʵ\>.U F!?Tq.L`KrC9}Zʱ13h£SpctqK3,vMVxzdhtQǽ&1[vW3ԳʚSQd?Ħn`;o58V쑈j 521O^R,E$*lie0 N"`l]nIz:T}Je_|{)Jrr/:),r Y|o]['rzJ' ^J|g}Cն7 Z d\z[O kE -`1C,u oYa- 1FZT=O'G<,U~%Up#J̦օfPYmj 'G~2U7M-vw8fT gKV2mz߫aEm$X6dem=znm|]- v4jV*<#8U!uXWŖ[NKf"""! \Mq}m MuvV|ʲl88pXc"2PCCkA~޼in5ުUj4n1\r5mlZs[( kX^PKHʅb<@@!Ee+^gۓYΥ}6>_{xS -88G~}F>֨\ď#i'[zGAѶ! @p_(11^SJEIr[zLooX{Dbz0SNtSHB5M:sbJ(!g]C7 ,ҧufC:z!7!n(Q^1?K -$@F -p DzPgbZ\/W Oa,d8(D'N}5@=:.|.iڏeoXt%aCnrJߩG˨LQ&sZ㖧Ĩjn ~V-hA2UZ9`Zx۵<uJx-|Vcw5Z|WR~j\]P9ݍRH|SYOij~j'՚8j\/j= ,vYhkY۱lgz~5gc z:Vu"fFO5# -࿽,ztoDn%V¨]1K-^PKB`A̕(3<~&1D,E֓ۢNu[u/s9H8`YJٌ%j#Rks;OVpŁg.٥W?MtC藋Fѷj\wp -9}lJzXTܞ?벯Fo}gm\1?-n E=-B6/Z[nt˧Tqryub ƕY:;Supv-XmP5J1OSwᚒ˩]iDec.&ʖRBԧl/Y}װ7;M4\uyU;H+|, k0HVZNw0cNeGSò&^:RmTh Db5dvu3\ltO+3b(.g?L5#5}-JXqC[qϑqcC1NxãicU,TIg$\;+^ʍ4Xg>^oH7s$M?,[!%7MP4$ V|ګKL|T;m;Oq2<`KVAN>:4uZ1hBYnâ+j {%Iajn&nVb[,g)B"auVRLi$u,u,I0C:셗le |`GSYW%ۯ{ ɯevd1OZu+KYRb~)q3aMW.qHӭ#譥DΩ -P7dC -u5`[MSu:CP8$\7fΑ -ޕ1h [WiRUdVF ՙ5XV{ND_C/ˌB*=Brp5:A] ]ҟV%梗RIFaoצ.bfjũ! uMְH7NU&xPv)Ҷ+NVA(q(u+Y|'.}Ra;;1'c- -UU望?9o^DD~2Ɲ&ԐUb٥u5Xf@3rR/F_S$Ja\\ZYvGźq- J9FUj -l?mЁ8櫖?RhV?FX}L#JP{`F{y7FCl~jV= ӮM~ \]ҷ~Z+/>P5%ȯUëqFޓZf9MmIA) Q,Xm qXkQTQժρť`HT[,]HWP/oKlZ|ȶNNՖe*5#|(?nXu.#UMHMP Q֌Bb8FNNۢ|&W0xJQ6B`S @*Rwl2Bzbۆ}!jZ[)WRU6WU -#q23֒NES*c2zPK-SMKr=< V!x|~<5,EuI n",UaȎS]aPC%B$2$#YyL,Ϋn0+A(0@+N$Xvfʦg.0(DKe -Gqn>:Yն20yqYl)ĘֶFÌLfD&g;;aߧ,)\feֻ͎RrI=5 W-w|MzE0]CQtszEkKƔU0[Tz]kw<PFSF9bpt~Ft4lO5ad...fɝi^zJ.$q,~Z}=[ Uu: ;QJ5wWR&1 WVC83Q-G+R5׬Z.wZ.Unv`HsOŊl%bFN1 VY ʊRٹimViPG&d4S`KG+&*/.mU,VVb_hoد-Y3gwE<#R !ɉRѰmUkւLA@jUH= ϖ.~֫aNn3UȦ=;6liFCtP⊜5iّEY,v,Z1Z(FU=BR]9; #aaѫI.ZWhZV= -F:+[F?KR0?z1PWa_Bq# N 2rp SV/*T -DxTBCW @=5C$KS2E[i.o!TKk xD~'dX5B@5q,K -u.Ҧ,+,Wdյ7Wֻ6˵I3W-_+&Ҕ.gy˕ށuW}Z;dbX_3hEznIYWFGJ31LԧqsOalA])*}`icWynġ(U\\-Cx^|(FץiJ^j$Q<_:id?R/G[qvʺPॏ=5ԑ01v+(\+#4}{y5SU~zx6 9u[q.sVrb֢楗, n^]}ƨP,cm)u#F5Lrb!ZS*&c4< 6 a:HtXKrke[ul4f~\OĞ`v4ũjHcO؟6X[шwY| \9b#?"r$J^RɉD0"QևapWɼS333r:~.\]*. r"AFsk|1*o]ȼJ>"=]$:j39:vsY}g!1DžZl,jg% :EvpUMIœ ^uBLXL=&]ƥ@cmk*\{9+.!zxUMrb -&&viY k=,TMn.* ӖَFѴax Tz8 iJf9L?&8۵{OjGgW(o.0#v*ɮ3nncL66]AgO<{yn)D+˗ONfDd\Vj,r!eS;\޶*C*[!>?k=f7tLgF&'OVDu?z~S?@ms=LK>>uJҶsɝԄWlkUenUgs[+CW4/G1!iq& jQTxMprk7n8@5NJR*!0!rzKxP;ef8za%͌bE騶 ~e<@ck=)dFcU$C{1$u;@_lmޕ\wjC?;DT]ś@uAZCPOHjX;YUlPj [TsLxJ,*Ny`\yϣZEӜ~Jgˮ:RQv-;|kji$e!!}=h=.@˹6`TF ؓ$f2 *Va}{*, )VhYeM4^ 穨f/WN?oc"IҸ?F×+w(g{m:[zh #ыiԢwv|k[#`7ٶq1891g;:TũjiS8b"gQTD@`Dg3}buFsgIYNDD~=U 3eXԘo˼ɤcyHCH}/nIK"""=/$/Qm{_"`&1Mdu;z -v?#Db)j d$Dvg1dӴ, L>#KO+q_j@2,STԑ rԾ2LıQ*3Qs9 5yfw0C#1DG닢7&v-\=]mg,+Z7OV6%{"kJyRa]M&7;Bɣ& Z=TTOY8ZJ  MxOW?4P^X Ş&xY],@GDv󲩝l{ԦmhӜb!;[Cu#2@o ,3痯f"ZWiOr?/Oso_s7( !0@AP1`pQq"Su?oQ`B~?awg3;q;f3Zttp|T -;3c1;q;3;qfw1qIqW;F8te Og˟'Ct(z gB3?G=utWC8]+϶VV+_:˚k;GQoVFF+|Z#kOן)i6!^l_GZ@XŸc־*Dǻsq "<VX=ءZPs B^i[5sx3&1Jc".0kWT?r1 -Pt+BA Z?_TȄl^COkꀘϪAEPT(qEO(xbbM?N X1F!  -~fgP`3533?C^ \3-qq BqX#~[W3Ac]WL o"Q C>x~"=BfCy#0|z1_f|FgwV<ݘS ,hMJ[5pPΏ0F!&x-ED^ i6 *+WbaL^!jtxEF(#h&L0 UBk3莌<梬h,:E* -Ҏmf0)>c&*cif# b=b -nB#P -Z4P5%q\P@!]cnUfOBW6DCE%1$x(C]\1` 0ZN8 -;"QTS -_4uX:(&s."TTV -*."n3;UqDD33 whU3Sc0LP3Db*"yP_ճ{jb: 5SƷ0 :UZ*+4J& '[p݊c:]P,;^U q033@L<A♰P^58:ܩU)W.KVflq10;uF`gꂮU]tP1G A1PB :,|gF,:`0(UwfUG &abwxX!kb1ȫb3v#itGWqB`(9p(x"y iHhBbUH,Z*(`S(`QC0l`.[36fx{`! A -tGBajbX:IZh6AU6y6g/Vt!8!TZG !CE pUƲcmPͫXڪwWAr>a> s0q! -ӼG+Oumf(>h'i PnZULϩqhwx4T&h8ʦi -₆m^! Y =_)Χ GqD;WQ./ٸA3:z_u &!0 @P1`pAQ"a&4ib*!B)EUt]㪪C,j!&nQǹrP(iLQQB?Ex)eB)ht$(D=9o d,ku/Πn? -}4* x;} }z)-CT8 C{eJ -Z+a+D*:ZZu/ԯ`^3f 7ޏF(xk"`IB"-KD!عKx8!䮝b4ʶ7[q|CQhG!aKmx/A^\KCv[%b/Kb1.!3dz?k4\ӿJ=iB!0]كPuYUO8bQM3N;+ Lv8{Df^^3 ^M\p#yb$1j:@ `4U -1x]a8!, & o\]xz#B3*/|8 舨bxS)n;)wߟ400Cc`y~]_W .0*1myL  !1AQ "02aqBRbr@#P3S`Ccps$4 ?(r\rTBQ %@w^ ꉣzoQ۽A[]ޮE9'1>4ԭܥn?pGMS)h;cL;S1ܥrBzG)^zsr.Wz4M;j?Tӽ0LQz}JԨJ(B - -/RLM;R=L;)?Oz~z(Zn7(FɃwhLnw(DPB!CT>B#GS=S=P;vzE~zW)\;VOjGnS6fQN)#OKjVbs*)bO:5:nS6JaO'Z3VEi;Sr;rWJI_ޯoM'̨JԨ!B w(Y7&ZLܠ(B~0WJ;rWڦRH~Ѯm\ރwۇhF7>!B7 OIVGz=YpꢲJPOP)( rYܬ*ZƄQYUg~JQ#(%P?g}QI䣐aJP>2B PB`MSbd{R aOZO -rr8S9J+Oz{Ӟ9{ziޣPPB T-ܡgPrLܢfw&hLnw(DnP3rATES{zs=ԎS=Z]ZO -+AܧS7rL3cSF:$+nQzcw‡(~ -ΠrY~g~grF'Priܫ_-"|4M * -5(Q dzӧ4ߢ:k{BPD3SN rLܢf 8B ܡ -$ӽ_ޝ&7%U4ԒoSH:N$7˽>Mi)UjTN7)´)?VEiziTo -Iw$ӤޯOzwDK.VCաwnSxUVIz7u;S7Oh7uuzvqS?:C'Ϧ*i\~5F}\ϪIsئk?+{^:*:qߺڠ WUjJVy yכOWUf=׊{2FftЩmk&8yק ae[%> n */ Z˵."8dnlNW Ga)qF8<X](PQTeC耯N6v7!f9kT"ӦްjaZ=_৘\Fj{qM.#X9ٯ&Sh%m)ӄW`V_+i@Y$#(8 MS%=P>RҫNjTpƀz)UtTM>RUsv4* Q5ص -|(b?(#oLE({v4Z,2y`7:/xWDh+U!Z]'5dZrc+c*E*߽@!N ܠf 8Gbcǹ@=S.>"2+|4$ar$?-4SV|D擪7{r)bd4a$tR*YU]9⭿`V -s]* -2q#&7>颵HB TOӐ G"EfUark^*h@};){d51?UbʬSɪ)OxS֊hVv|OY^[3brv}8#?Z+.NtXM %`=ÂV0yZWǣ+ -gw>VVn5mRd}TI9tQ48ŕ0$~Ty@On`9=X+9_+'4=tCx+e1M>5a39 EsNoP5=TO=-=|p(P3(oWDk(Ҟִk89)t.)焢ka`4~[;-oA&'L3iC/eSDCόujf;uV6sjv\NtEdߑYeJ_+jrk~zKCM[:06YٹY -VxB0dz'?+|g ->!(m5NV" W'JW[Ft251_|*'mo>ˏ`z=+ ݗad{++dv9v6Rxw`+Ů9T(ơ {Q օ0ev7@uHsF(RAͲ=':mvj6wag&>eej#٘E2 -AUOEff&\:s\imNaJ{jS<ʝƸ':kNʊЩ#`OH1(foD;@LY;^;W8ϛVy"Zi$o|3U)yg#Eª -Gģcn֔8$Wb oxq5C#{OLA~CEh8BZ6t{1U.9%mq+m:Y~6װV]*qP>piSץ2 -eHh *v5J' 4Z'R)/>t٭E)v˪7 -S]E CZ.:Wu^<8SغJ{W(Zou)u9Tjv=+d? kX%YwBn-B1#P -6PolMPP1k0S6Q…Y˦ڄcp&ðѳ5lhA;kM&ʨps{ R Td}+L;'*r:@{<cJJ$wF606Ѻ+N4عۆ؈zO2l(e(fR0Llw\ !6'4:5ygNE,U:2q,L"#vצ.ieAO7׾ -(9=ŏ>˅LTz4 B -,1o^JVp^kNQNy}rlpvdn\x>(U׼s=].\o -6CU4T8TkXTREvNaӠ]Oj_qz,S4/\?NT]s IVw0p+9 v{T5ʨPt0"xUc)a-] 3V)Ue7FҚ΍ -XOXi]nv %~/$欳4KwHQŸ,{5nZBW(=\w+wGohM; iH=xW7XCӐF_r?vR.mFD+MJeZ։ЋRk-U/kazf[ػp.U)lqM?be|L=3Eh<۝K.P< 5Δ$Uyi -{(f _ڡ|Tۥwgb:sHqԼu+l+{ZL~5)k{اY\Jy4ǰ,u!Gۧ -P iJ𢿬m{1պ)oQ+Ո8*Vx\ N@kC[Fa4ޢ[}[ޭ;-E};s•V6rt Y5T&+[th:r9EZV)o< - -d;PϻJ`iy+;=\d՜b -iu~*G**ꪺ@j; 1VdB|e˜Ț1DC2{QіN=ςkyH2.Uϫ]9Ƞ+lJ2Ge] -q錤 GbUՎ@~ZY9srpNN߬988m7smp+T~ -8':9^kǧ3=n -8:8$=tB€k ˜k)eLD%wJ_GA u=Zg=ajSOp 45# ҂g}@MhU,{s7N$#*U/WdVW~1/D=&;ɒm~[e حWnoM]Vh|Ckom)~t\B<|Ҵx_.Co橆Dz5ak$…9ǪPtNp#ñiu5Tef.uCQD9 nwW4DzŮ_OFuSlG_`v11e.qdnj1 ?fdGڵ[kvyrujA.\fZN¸b) ӢW>֝];Z%qM+0h;{WEGZ)OTr\6U\5rǨ\ߵr75r8B(VA((ܬp <|AJޜժȭT ࢪR>㶀BypMza4\!Y -GS 5J#M3SJKqȅ8‚3zԞ -)d?-,)^Oa;1U|!4<;DL'!MwcGPGv&לܕ9iꡑ{çbsNVV7FB5i˦:^iKsUWo~:]TDTu SioyK9vUۚmo{TC쉕yxЌGT*PAJY͘ ݑܮ[X_ O*:mFr&C9UJݝң핯NI3 SsEUەzvEx\G6? *}Tyvu8tGAL*>ڝkhvnAlQxS?Y:|u; pXVz^qtJ1U)q(e}ablJ|4J1^ӏӦ@o|>E7ڿEWj6D!ޙXʇ*R&X< -_P3uhia od^J]BE(E8wnO~mkTp|.9h?;&Ɗ0+wy6(kLm'm:b|CFhhuevJ|Its6֣q*1{h+Tz3O$SIꤾvҝ;K55(GaϦC6h3'^4{hQ -y.{%56ϦZ+aVn -7 \VϪF\J%,[|[ʜ`r`~ap @c`m:b\9`1+SxÏ[H.@]f#4.Υ Vzn)Rgӱa'ڪQ8\-ԝGl8]aT -wx)0>X*TY Ѝ;/d)EӍ?COw~H ]\|Dҭ0)TWE|'=^|My*#0s%JhpF)=S_8  [mjoB)Mע& S+[Ʊyh'M5;zR:TeTxБBo˧U)M+XR+0:Z³b̬2Wt*V*(btG aBzrp¨j4SͨjGLbM2s vQ^ꋵ4ZF4(Mj_Ҟo֒nE:7K@Brhev3 -nudNN8]N. f y1ߣGLGދo6E>8#Q3z*/}J)zkj֭Nޥt6VOZ8?qm*En˪K!u3LY?Qh -7Z2v*|mޛƿNΜ8SU4v=<*_$:;;QTcF.k;5T?qSKZgg]Z8ĭB@E@=j?v>phiOVkX"#lCf~UʬV_%6`[JM96=Ec*? -R7QU?݅l Aͥ-mѫgLD@Ofgjk'Gi8 Վ{ưF)X1YtzR`n2=EAӜW`˄{ą`23+P~; \P.SVaXLeko`- F2|zw+پl$+DB14Sg_q'5;O񾅟>2U2ޛE[ˡrE~ʄ7ndN('UiT~isçh`nB!|;;far8UmOvpמ,Ezrb< -S6]P{N0׊7ʅ>T8&ߣ} -4=+ 5Eaz+X\gxvC+.+EeӀ>zy2]pV$ p\ƿzn.FTS1k[Açi@nsL.2F.5%.|sAϧ޺hB=ȷ(T1(tc8mq:i^"H m*{%ʂAr>d);^Mx{]k!w:4^ڠB࿿C;Ø@9Ŵi"OO]Ays>W?/MW IE@v]!FW9[此peV8l?hGP:M%p錼SMRV镧hͯZ(۹DɠytVvnVvnVv!NT P5Fzm* -ǹAܚ?]>TwM).BZ-ji\XAr^{i*ڮ_5"U_8 -tZRߏ[@SgV):~#zV?V{NŎh -sW(?[ :'"(A\/; %~Xʱ#ϪI}UO_wܯ}ԯSI>u \ V;Aj? f~L?؅7ڹxTWGZXs'$u?qbKtOz]E=Y@_]Mz(# I1x:~+1蹏Es׷l -/8Z1nu+iOq[Orb [_j39v_VKMߝVxyI@?پ{ 䎞\1i'k+zm# U$kz3qæ2+D|AZ#?(N_D'Dyhi(eCyw,J 8*wc NWLS`_^49:rV+` -Kҝ9+ Zd`h;SV+*;p T=ryL  dc54 76ޑМ6G?Ԑx)}(";nr7騥?a&FGºR5Ǟ~d{od9]Wf}v#zC* -ddGaFӝ?h@vdgg챁*+H˰dddnW+HxJ*oҦJ*oB yET3p -AQKڒ𦻝EEmOi:`6kd7]4ZKiGCe*~n_Kp4%nQL|*m7\:"іjZeUlo -$gZkm)TnaA2FǼ? +4!Mn͚JUgru>E$Y=UZ_}On.~eYP;ZC/<>1tvZ@VG -=}Uۢnf_xk\+ꪘ&uV+[8:@-Vl[l3*ZmnEH=:=szkwS[jh4Q|lwFOU0Z0hCOh)𓶢s^3-Ue/y1 M:#mMJ]eǁ֫P!U`4;L|*xw)`VfFP47Uu8e\r -sC547& SG(iћvMhu~O0q|Tt>e_ޝ&|~dSOħZgVG8ĭ5o[mHQJ?*Zm]BE|R"vQ6vǹbݩⷴ~O`#98xM]PuutŸ #`*n뫑B;(+/9'b+Yr7:t*KdF4sE:>wRCj=uGžw"xSҦJ*oG R7SܿGTƴQHʚƉYj>jQ*ӹ^7{R!4z=1jrHuBs }pJN8eh/EbPYFņە5<49wy֢Cpz$ӻ]:ٽU~Z܅tJ*mch4 -OD\)Nl8tt\^4 MG?jwSOoEpYp.ks8WRtY-*hQJߙ*]‰Y)[B*?v8vkW&ٛEe XjAhERђMiJ(+L4Z?RꭖVWk ou -jWk - %=)#jcw{#pR 6׬N\U-N4P+}G MbҟM /c]hWE۔D1yEM0B.%[_ .? L_C^/TiRo R3r{7'ǹQp\๏E? ?TQžM*hG,tץj,iEU -)8յRN5ݮ-QzMU!*_Zh=QsOV/Sj>]e9hm&MkVoNkjGL P504h7YlΪ魸 s\]4Hxb{=뢁J˺m_&[q:(ReB?k)>q ,nw(Y(# -VxB> 7(Y, -+;7+<{@(%{^oU?\T\dds=N=ToNųh. -3X?!CG7AV~' cvCB#vM`ܹt -xlƻUY -B~^64u(USᮂ{H4SĎmp\ý[Q)${XS n):O'K2qeFN$e\.s_W߯Jݮ - p -VS-,M -Q {HU/xh4ƻTδ )G+"ԭʭ1+D\(S@跼hbBcBm/`7e5P -mJ1PbSX+jno ccYW(Uw\Vuj:S| lX|ծgK7W 0Pz%b5 9Q>:݆t]gIo&׼s\  Uߙ=F֥JsJxpڸ2,ipia:)s(p ݵ5FCЌ~tEg#,{mR /DD:hD>j#uggd]gg5u*/M<.;ٵNVhg:]}씟QZ[>=WJz* -8^O 4S?U++4ZN;pVoV{]k,]ڡ -(=B ->( -Y߹Y߹@gY)i?7ԩ#5iZu=[ 2 -C$NEPg]L9uXG亍x' -7fyNMXuު?r֟hfiF*jȭ+.{[DŽsYwJ^:2V #m F)U;idёDߝZ,HX|ը{˵ykh)i>iGSɍegGĢc[tԑys`Lm&zLCRwj?Ž7N͔]EQ)QƟ&EqiSYćTeukKj׆E<q%oJDmwU5"G ]R'c>'2AVbicw&7rcwi+<\!Y -&7SDmw4};Xr -#b'I]5_QUV#]4R"P҉h5FeT/8)tvUB&nQ4h-5+CIڧNs{3NC -Y%QEoV>ZppcpN=TJ~8)-h\OREĻ znnaX!5:e=Tp4B*KONH|WzmL3ZhE1;E;8Wi -lV諲QF9Oa9".cpF+#Ƌ\befݚTăf;N=7|:չO)-TCCY;8T^LTR5٦VWϷcv5X*6)ZǍJ?o*m67ႎ  szgF kVOr|kP7H%\zz> (Sܥh+.p cIW -Z -}&v\1()3VS IkMzfҧa}18N]:ئ`qf$j zߪĀ3]뢽9ڭ ޭ Gyth>jG=_N :Q"Ųu 2+<rvuACT>S*eq2'C\n -SFMLkcpvqs -Ѝ=>:`L~&*B=O&NX8Y|!07˧|B>Z|Nur* -xƌ#n^zƥZcȩD{cܐ;huV6 -#cy9srkvEiΘzs0D|AZ# -FNVhZ" -fzl+5CGci&+m[Jմt\z+4iJ\\7X fC?2_z!g\s.LT&vUv(j'i: Wbs\n'h]ÜrT.֢=1膣|-:׏r 㚚8@ `>؂Wҗ[UgVYTOcyuF誐)}[^7vGznV8[QM CGiTA>I穅3F:E]t/Ū# +4OnSrų&7лښEFG$۵VwP=Yܬܬp<%Y*' Vy8JNd*'QUӥ/6VpKyr8i{VeQtl+{Z]n㾉ͭdzo,-'[ӧ246)%RKĤDE -﫨nXtdʌoMm|09iD~16gQTmc=уaZjg:z̄&)Y(:n >"XxT~};9,;˜ׇ^nn;(ewuڨݺDx65[ޭ7.tG\3G++El{|$\ڿl}TP[.H߽p-öVy+85i˧/SZM>%<|A:|kPM|zAެ]sM:y3F8Is;@~Ӆ+<\!Y -59kU>gfggXvS Ju+1wV+G -Z8R(e=O5E5|v|ԀBM<&!/Г6_dw ?v'vw/څ߻PݕT&JS3ح`Vڭ:o`*Hyc?2BGzƘUljq+t5Zlё - >arnN!m+4AX`-z'ZJ<W'F3 :ȡPT?qPAPG@<{ c#.ףQO?OƤe,{uJ}tVM$\;=3G4 - |+'yxjV~ -!ɖl|# )4VGxբG]5ϧ0 Skhz<+X7+~+p -83+[8U>hr -T?u>+ɽ&uЦZ-`{%v##hQdž*;?}t].몎d6"Sy˹L;LMTd;6mpNrM01Bm,bFꅙs<+ E:+\/x9I]UhpNʭr``9-O8|&87WbG"u.ֽ< q;pW4ާhZ pƒC o{AB絽hx7VU{{]ׯgꍟ_)ثԽ : :~hVf9(F{hZ0gLj~ځvJFE1H/yvu.HBAA:2 GLZBsIƕ_M{*ehXLe:>F# -Z{Jn;qSӨfhgR o4lz)Üʞ Ez'¹.׾ ӇU07h.ƸNxC{USޮ\i]ZBn;*.eW>֋ ho9w^yO{ήu^[2:B>%'5vh#q-e~etWzcas+zwkӽr^Za'XT4S%4c\JZ>-S3@)SĤ#u6L3R9/JCi@tS7XrrZ%r - Qz18n`$ѭV/jJaD#*=|ղPNiOh_oe8`Syvj>EJJ] M- Ѓӭ+Q裗pQɸ(%rz&K(L_ܛ&BM|8Q -h6B\ -^rNVC7C7 T -OTX?*j +ؔ7 -ePЃB4]{IU% uҺK[]w)"H; -}f'ZUcTSmrz+T̩|HXd!9Fi4 -x*mq=њC+$d]XXMdb6^Z<6STA`r"a>!APGipӦh?feGr@>eES@/4 zWB2w, }Bͱ%~:m\}/5 ܪIV¥c]{MI焧xJW: 8w<͗qVj2Sıݭ)C< -58QZCErRqک(# -B6ޮVK8a5Y\ѝMݚ,ѹ4&Ma2PFGh l۞}W%.JP:)4>p&mVE؛.U%Sz)vh*:x()1|yzֺ.K6hc7ě,u7EK.}aQLSY>ƍ苜{nc-@x`[X,֬V||UCTgOXkiRMƥ}{ksQIVIݴM,˴/L-4(MoSOLU~$k:-g%hƌѵF)4An]VEhy+søw' V_]o/|Zmk뤌Уw邌^ĞZV+@ܭSv)ئb?TPl{0z/pw*]Lj6fB,>9UKF˵V~'E%5\V汾UU< _U꺣q@]biP k&V&2xUZ\uA8fG^%K3:&s# *N <`Tyyk5u=)4zvxhjJ>eb{A TEuժWj)a\N -?{MnEt5OPk&88{0VyYP+;4Ԟf~xtkA\Z9.m43 -f+#RGꤏI|~)*X${{(zCVʔ -o3CΫ]їMkQYT2k:v*_>ТIcU6Xnϵj0׷`Ǫn)^G­lAUhʘOt+/ -eBddUe;iiQ=f4hf8:,쐴u -̪kUg柪CLPT*W&RBt28SjC+ iȺJ.O=ަ6M?\.N}?* vsoyպ^ug_O6hփUĨF k] .֫+ZgPԨnwHYٹ@Z|; ;7(TtM0 (>uri?S٭id`q\VS_hW%]yj塗Ktayߠ\CQʫ gZbnk] xM7U6,8̮Nع*Q%v@;AB̓O6uh lQIOu#jYڙn_t:ݡ_kjYCw۾,686;VC{b=ܕ[IMA_ lPM£r]2]2M UE7 -]9w&I 7+uua4q&nәǻP v5hpMko^GxʅNv w>+tն-%k7(Dɠ ֚u[\ÕM VK8P]/nGL&WMG7o.j|]]A\)t*)TvTx:VI3Ԧz\G ֙!`ԍޏa#wHce WoOavUZfޤn13:hq"VFq0if-5P*R_:Pq/Ѹ |Lwj[8V2s㭢kҪhU.#]hˎٚȨ S[{jI&#Utr~M#}ryVnf޽]L^4+hp7)oOxE* \/?epr{Rp\6dKyL gOD,3nV)+):Ƌ<2 Tx4:1QQtPjzC6';-BdlnY} 7v PZֳM x\-9>\8k%-C?B!Cho*!T_qM.qwOw\@M s.= -J~2] u]ƪ;j1cP:|SHo]؏ 9+\)вr5Vh(#^IkRF_Fڲ(ŗӰ Dh -8h =uhnZ)O C~\:FhΙ+q V -' -夆Zq:mS1v"ަji6C7Bhh15Zb t1;iOwL¡Ne'fA;9zV ƊϩSV[\+:bjJ/4Z"k<{ѽQMY si9gD7e˺XG+p -8E.uRA'ÇQFYծUSB{Џ=ì;:)j Z,ot*Ef==a3YYƘXf:3]:e T-MxtV:p |'\n -sٱX#rc~Ps2gn?;U\ Ɍe2i9OaVtEe0r:;YjqrOZV37f[rs>V&8Vlc=8$+.+%r -: ;5;; Y&nQ3r?Yl!*fD1 "+2 /8(#.96YZQB#9X(UXΗYAz 3Vvszac٫(d[[E.3 sw&gu`EobUџi]L.fX3E7AΚ,8|:ub/yWGrmnf(m#[TaOb_z׽N{$DŽnQr1ۓ5ɯ@U#HL(κSݮ -Lk\+[Sw@֧B}rV}~Rm -n2p -nl{.nʵOpnGZ0<|ʋ*3VՠuV>Q8E׻YI7G%1ё -OB9`/tSf5*PŠhT`WFpm\O:m|uzVF - T銒}}xm:f:XkM ͵}RI+S3AkFehoVmk'hLtCͲ3]גԥˆ^yED#lxk]&5k1{PdS f(r}t7j0`;I=,2*th*xG=Ҧ;̣e[8mqjVMݡ1}8>MT&0$in^TVBLs/^'^>Z#Ddʺcky52U5Z3sHVh8U]mWP:`m〮Ecv+C]u4 - pvrspQvL۽d8[fV+ ֬E+2\$[> [G0V~uGHMWjޭk+*0mx+Y46j[S1љ/enQoc葻ԬޤnA;*0UFxBҚ%`>jVoRzp#C$՞.1T!(kwVs.m qFudeebhv8SzoY4P}qد:":MEWY([y+ ۔eƸ5T\s:"EU¬veƘ -g*? -J}.QW,T-*&n*8xJ%Bg QqQǸGEET dliđUFXhGM{E | -|*yhw\\>@" kd'jZk䥕7TW'^QӪ1 כ\Fnƌ(le֡խU~(;ekxmƸ - -CCBݡX&b(LL54& ɣK])Aw]u+UiI$~Оhe{JX ʭNkuzkԤtқ-rz.F^8utfK9VbZ;5Ɖ9^ sgVU3ܙueqyZ]3MIF]ݥCShƛ:p5daY?:4m]JVoRo\Z !l~{՚F p:_ʈ0|w1]F/\sD͜UktgӑV_U?Pppxn*zFNFhi5%K$g燼+ѝ "4!ƔW~Aw1Rvhq5ʾj)SA a8QLKn 5U8^?D4=VUѱٌvS ݇D"xRoNV*RG:KVOtddĝdaޘyY`А`ZK]( Ư:';Tnv -J=ԚTk褻 8]uVӮ}JM70:zn,>cwStpƆ24W`z6_ER\: ?V38);R7zvp{)K֪vU!Xgdnu@[kit!Y /']P2@ё+=*'4WKtebަ$y'!8HtI7|F; o -2F<q^MnPS8Ҹܾ9>V0qV{-;[nݏR]U(ꑇ\J?\jBMr_܋+Sp;pJ4gZ)R@<@5O/q5'g}3qeݐV 6+,.af?^Zdl~MNDB]BȊfN -}"+] kW'eq5׆,ԣ,Jo*MzX0V"m,ԣۖK(~GͽD\b95Ts -hz"2|5W$Q>'|u CqnZ2)סjaޚߥ)ޚ`4YOj,~ʮMnz; -2&CPsF]z>iV}6^z5ɵfz.K#ɷZ=G*jIpެ+o1y2VZF0EWՙ -0͔5#j3:2Z!zAQfnz4TGLgy36豶L3urX =Q28 㡗7i\rh_X9}Bsl \Vm/+εG -1V9++ɒqya2]uY֗%r٤CJmCV`k\ih:(տ@SL>Yk3"M6H멥Zi; -NFɴ[Vs]ُŊN wYW-}$xbӯUhh=h\N 㯦T78 -%mq)d~>ٯ*)S꥓RSꤕO/}o_Szd[ G\huE3K&FYT 0e8nMٞ)s=hX> aoC/ؙ'W,%H0Rq)RIv^Yx6hs\Vy~1#IT\Vo>Q[؜ vi -i\{jS~[CSВ^$xMkr}$d?HK !ڻ KC@/2q)2cEsjuUZN`ZeiDkڋuMrqV&w0D@USp ̥N:hZ+-+ -0uƉ0h%1|4:hq:W{U{9wx.|jpsN18cȄfvY^IuV/)]N*wĐTpW΋';rshHbͬ$}|ʴs8b{dz{";i5n\\3k[A]jCcxK]GS*5ƨE>9ܬr0t;)v'L - >I}kg+;UPJ CwTSQz]UYOMXCkwaFuR~RWu9k5(sėS2B-}־kbm]L4I#8I]Vb:X>`5‡;+]O#{?E.N}S9MUY_ ;3$nk$xrt'2o=7TSYV NΥޛtwur|VrVSd+yXj}%a\%VGSݎ^Q`s:}vf*g\kM Z&2f t:d4.H[f7U{7\xje&4c5\Qkb ̟FDP=W*0)s <;h*FRz{]kKJ2/ -0:^aӮӂtyɼpf$4VjJ9W%`rv)3Ufb⤳F`+ᥢ{ I>7S;R}_JxԧL)+x/3\㮹N c,NýG)\ި97:uGu5owVWŵV#^΄+Md+ jpP9dh2Xe+{( }MFb8a+MkҾd>7dTvcLCBޘLnѦp캭Z>,RW.w6u+SbSoN'9uznӨ)L`Z/g4ݧ/:$ȽQ ;=~e)hyoSH}BL2u׵|L}Z1KuyQ,;BYOko͂ĜxE(TCjVپ+Kiuح.RҝםCGZ炶L\݆C#$!U¬34 `|{[M28?#PyAX'ܬV !JJh@'Si\uydw+weH&JzCEYcO(F5Zxqk#P5]u8,Tx[VE<.*IKS=n .`X&VW̝ꀭ9IFZ+Bֿ 5dO.㫧.|*}oR‰q'@y7k'KqctS]{z7]w9`r|XѶM4r/ơ9^=%4ݠD?r*68wt˄AhnIrѿx+'Ci{AQN呃DVF欌Vv5s׵YĬUat?^0uAMcCh`^Lu]IoaB*~QF3q7W [Td? j~C%b!ؖ͹MRz8`7XKA8Һ װ5P&+Ed޹:Ea{At샤)d2EF4Z_=)|MjYRh8UMo6wuUip@GTq3N"1N)zԯަ*y8KU^"z$Nn˓òdҴ+ ƣd`'48wڭ ->Dky ֚*৐){)DapX{WQs|kZzg,Ckv"r1ȪL|B1_4.g{SJ?´KۺT ~#h5{Žڱ'^wRSbm3hF`|TmT9ùxl#$C\:whjJxx(']Y͡ѐLwjV#+@qLr775 kYx -+^ -+] fuXu=T('pyJ:5Ybrw?aFYt٥z@Sg6Es8-mn2]ӣrE$Uȸ`QHA+B5iKхJFЃĿz sޢuB4Ud]Ze7Z@Xq_+#W|.աŞ!~551IS"M6cvxgfႨpͧCM\8 -QNHh4hV)Kv+,Q+%dFKrtX3,(UXM>ecpq=Z9@cƸCfz$m8tCZOU`v8W'0uiX^=ɣ`4ת}gQIuY8 (Dmx5#ZWFTD]Z1nM\UX46aXpW5%2)yS7ࢾwwjӢƍZpY矖5Lk]\)$1㉦)ݚ ɅMt3جYG72]C;4pw]A+N]ec<{Ye ssVD#DL৴E&U}J tlbV{Yn`fӟr=d 6U@gbɁL1Fw&Ol:ZQpL|?pV;Wxad4ѐ,m'(YBʷ+zn eqSsrѨ3c9s:+Pw;OlMp{s6 W@Y[ܭz+|+!Fcss5je HLCukQJu-hJe.D]]HRliVN g%0"r VT&Ch<^bj|/4M[J)k .Ax +]C5iSZ`2Yg{6F˭ī뻊xYbMX毒hg8{V$aUaբNe"Rv}:ð0 -?tjجacs"NHV) 5,1AV'kiQ׭Y'N^@Fi -δw^ҹ:MvMZjGbֺlaQrt'Hsj\+PV_+?8LkpNֵ9w/4(oPͿV&̠ eE5CAs -^U2kC*g{H\8)s{B AN -#zxPQAG{u8k";/ҭz7cCB9x -d6N2M)R[#^3P';5twKwy֦:%1FF+l`:V.U`|JFhq*hVCAZuE݁ko㣼 0+lCEk}zVE|El8{RcLLXcJkqZ'RD1*?MRO%+)RØ9˸lV^y.]]v-WkĹ 4K{V5؀JyM}p Qv% [QS]v{ݝ%pRn +hsSjfQK7>Y|_k=lJ|gĽKGu ܠ> -Vb;)C_k%#[ =[T!NlUvtׯVs5M`ɢ %FCzt@c{ޢ{t:օ[/ͮ9híZQLŴ_UWITF4黨ReO?Oi"x~ɭ z)Z|5vXDGN6LU0x标Ad; k'V?ϢK}]O'SO_2Ej+SϢ+[ekVD msEdh'3Pgκ,Bޯ׏V7ğdN'bsI;EQKC+X; j)pT yy+[FˀUhtۢ} WH?*dG5F ?_CSz"@*vڜ IS:_B^t>B\]/vPw@-k1> -GŵV.rc[%R-`iUnwOv2O%T0lO;c@Q Ոk|TMЌ}=<$ %!^V(߯CkP*j tRlf}(kW0k0FnjV`R[h{ Lxh4nJ9jhV\]; -<VGO{5WT-Ĩ'QMYZgc}ֻj7'F( ̦J/{RTj.sqp>VKC۪)bj -hV;G -NʝQIZ]M6.E^$?D|ˆ(dhx~;J/lɓq֊| zƴ: MszjFi=VsO\W'N+YCKETW5Wn=V3j5X?y4VX0qꬅmwjSeP]x͎B1zbpռ3VF Z@|jP3NjCi\ 4"0:ΈvX!;j6Oі: -!O74C{QX -`VK|go7(Y=u)V+UZ'o:@U[mJyd/UH -5[ZFT1q+tTukM21f ZWcuO4AmZ9z!H;֧ -u{X^CJFP{@+d{4*oBL1D6Jx()A~g)i} -(Y o{j~J0WE¢UM]Y6 -[OVp̰t-rSˎӠ~U~HΧaO$_]LT"k031x%1 pLxw7w,.9zӻL.}<4D_e0ԙ& *5}K)K; -2̦t'Cr$ܭ;-0H*cd0gMp4C20('Vy:. -OosVJ8}tYq/7\e= L`6I,ڬs^Wa7cx{7-lV[G -O¬&ݝ>zj+WH; r|ՆT\dxtΓr|ՁՕk/z:v Z環I_7o%5&zݒVqdivm66t]9u^""v\Q{GzF?"3RQQk0R7rpj -F^]jDƕCN0+MJVJ[1xBU !JMZ -xyox֊DUWeD۲7q2%uq_op>MZ9ۓ!T**nq @s 4:띉r 7+k7[G*`fi+U= nhxb͎P9kn'6GܾKB<='ŹF.~FnE~d°}ryP3:eN~+5O*&7^կT3VOυy['4]SJˈ -.%[fF:-Wx }<(iCjT[ëEn-߯`{c0H+xtܼ^O$ț -<:zuNErZ -:n>+OLZ^Eh<mܣnuȧdž'Ź\>Z2*beB7'C7"i?pV, 7rcwhȩMwn -We|SA>i%iEi~E<0d4=VaZ\ -tJEhׂIH?Ej܈4*i>%uoPC?pPz?pQ}C?pPCƣ0y8b'䝓E;HZo%g(lj.mͿG,#Jk_>:kV݊!-[aۢC^\_ +>A֩}2 ] WMRD|_gav৾>0, t{9Ĝޝ*o::5lTTHXAޟަrcP`;fTf1)a]Uo91 |cE/j W,SCRyvѳ]i5#[L#5i ҅[cGn -&([0B|tfjUV)ϥ49`x֋NW%)zZ暴̿ĨOcL ',՞"і?YP1*c@F] eT_qQ} -WEHX8S@w -X6ޮZ -?zMcê㷵Lĭ%mq+lJ?O[Vm[mJhVGZ8}w~&fMdGy+ 謳Ǡ>÷ñ@+΍ZۆBB%gp#@a#gE2VYrBi -87DR*J̈fj)~BbbWhy#2ޅü @ɠ.i4?d6h6QP2JF@&5qd. -cDe~GSi Lg60n|u9xTw@&^{13U3N)b+Rjm=ha 6)FMQ -UΉk5^քO`7bº!gPG`YY\ψuϡw% ;iP?YԭQVgGã&W#epwї.aR -@R^S0j P^)]T9yܭ; Pyi##dߘerўA[.mzr~'1#EevSK#5~: BQouÊ54DRYV[G -4Lbc\3*h?Ze;bCN5LܞhMHq!ZmJgHu6&V9k+AcC -yB:MV>p-VT\TjY֪r wWK (Q~m[pl8Q+[Ӵ)Aͥ]˙VxF -ݚ}xQs{ۨEs5צڴT Wgn(Mhe6.gg4{sh /LvU6)[Z\=pRr+7X>`՟ծKMEbtDCWDAQX#_>U#Pz'>u #/ti>OF^4eF_#/2{8Ea[§6bq.O\NI(裺GaY3cVsֽ{b)62LteӍƍBAEK/Q~˥۔lpMoQY.zb` N>#L=Sx4 -l>+;4InҪHlS96STѤf=*'uWXz}E،PxQhD/WiSYh hdsAfj6i6}֢ɣDqN46|mSKDoCkZ҈{l惽^pjSZk5ZkTkKoV -*ҵEúUo୓s.Qy:ខVlعBUlrBe!8t.QZUs\i5{P1+Enᒵk}ZFi Y?YE+~aMkǴժm(S8Z;|nu ĮwA!ơ~[<P('p2]xFF%~{i}Paɮn;4pXn9mVs5GꌎErxVJSU45UQ14~BdE|:!Cu@#sMNB -O- TR/#C:S?S -subF -e@4Y_z8k -£FBkF/?,JԦ 6::sV6+ ?65c]2l8zڬ1Vy$Vi#d_ϣ+D  >'EkQW -:{-Cz5eFN4eFn5/3q73qtfFn$e\n?55 *I7>č|mS­_zBVR`V %pʬi?n{.RyƹP?vt7&Bx׻\^6\=FS-gCXƬcXƢ ٍztk+f 󜥼|Mh%ڬf{}gw i^۠T&2jm{8/4ԂlЇz;j)@Ԯs_z&O$WEy\H'0Zkr[h6ViZq{4X/Ofu]뢽.iW'1T\u0Wz%ip7CINю,AVSc -߇GWzʫ\¯7N2[\s;낵YE8IU7MNgfٽ<8=nk -h}(O,U54uC)%{F>[hU.%TiO'MW;DhVC Pr'EPZ]#nӭ>qͪ3wՍغ42KPࠐQM«O R`7UfH hVKG -OYk[-V֬r8+$ -Y? P[T`QVViV -5[ZڅsI+X*^ 75XdZOi >2u{͢sTb&j]N(@i*aweFѡqVF}iSlxo襾2'BƋ AtSD`!Za/!j -{Ɏ Mvl+U` -f+|6=wQ4h+ #zu v)"~ZL"~t2H$5~4kuUiȌL  -"+P0ˠӪerlJooS[JqweZihLmGa+Zb5ZZZZZZ -vCVJ(.}/Ǚڅ\vqм.VoP< |=i.ͮVVq4[Ӛ Yh -HxJ7.SnD:ykx3)-v,ΉzEWrqTf2z;1Lib^*:tDu Iwdlϻh`w\5ɬ\0"eѬx苜qU^8 oVF'7@TL#M]6h?mW'X=Uo^{* 49j(HY14*> h#Dѷ&QIi+=Uuk"4E]xB>$#WsQ@CJP[(*49L?X$7g ߭+C:hZ Ujf@\N\i5{Vwb!Z†:4fZ<Ul?8yhCI뀄ykf*0eDE4j5w Lo5q -gr`\Xv?]T{jB!hj*fѣ Nmݗn^R9t< UR/FuF&{xuZdiY  SĦgDQU`銱Z8UZ|R4*o4ª~}mw.|!Y -B.pg+<\!Y -VxB>,QG7%`}UUglLctZ~%Kӳ5Ʒj5jEEҤ+ck \YVXCk -iz#A0^tIq,?tJiq^ƿ V'b`]nttVhw!N0t N -Cp7Qs,:bީyΩAï@9 UWp&a^wH)o`$4AkLmL\&EYZBĢdaٺoĬ -8m-b,hP+Tr7RԨ=JeQQxwQhc\|MEx9 4Ɯ}J|N8_~C#2VxF -UEJ릉Xe(p)/H)u`=t?L͠h4jzNh5qSpͻܕҵ{7ns{(2VrBёm7:)f1uZ{tNJfvO7j2<΂Lrr|D+sC_PU9\sq֭r>h[<­|=FF4mRۀ{Vky[IGCpjRZԖz)G{?Ȋ+\vjV@j]֭cR}R5inࣶ 40"WۗE6S(p&`Yl+{q*r71ur|a*~4W B=pB < (7=(&GSuɌ>ɳoCAjT*}o:kV \ͷ+3kZ.~mG\oyަiTS\S ɛ,4XE;`ͯĪBA3삝vy#9gV7o[VUM˔$ܭnVt*Jҫ|*A] aX%V}5j8bM:o&'yU°0toE[DHSQO #Mĭ)C]aoٙypP{i/I#|o'ߺtxJ*L(^{ݙ띠nTk^x$hج>ެnmonuL.æT{7Q>wTwta6^ĵ_ʃn2s>:+W -d)fh5ͪ5.}>k+摽BJ+;= -YBOO1Ɲnh#o6CT^x_Oqs *V葮#f9ٽUS6IW!Hzx9Z,?Zcqgq4mp>+2GhঋL.>E)nN&ag/U> yw^-99Yz5mJ ZO@Һ՗(Qr{欅 ui66+; LeE4Jiέv$kO3%>wՖ1iBtV3z> +D|JVG. h+D\AZ# -R5G=f:?4SG'o:GnRYV6q2?hӠ%!2|ڣihtL+LNzd9ؐ<#*;YB晇:-$ž~5hK+0 FHGLAXP"sksP4k4Ѩ'/|JOFHF:T75f?JхU=9ƺXK[,Qz [+|0}, 92qJm)֔*sէ6. oU$%T)tdwOZ 59a)E|t23\!OY ۍtw5N/@}1~N?ruN]XyN,y@CMT>d7?Nk+Qsr ZG_/ѽދo~Ѿ,E_ -~Sbn%hO>5,(-,ChK U~E*gWS͙X=P:߹F淛;tTTtKdXjLjP`c{08S)'I!X}Ub+è[#۷H쀸qjOy5Xr.6e t `X.B(nRFEe24 ªSV;ir59資=+o -R5 -o] Rؚ/mP'$q]yF9Uh6m`hɧ&!|=:k䪰;T<#uqAZ(;3X[ -HzB{J>Lw';z8uh[rswC<҉$d]LP 7Iucpy&@ A AV+Z,f"~ ZW6L1GFR:$bNg3>CLVS7Z-f" N$ T3('LpܩOfkzu _ *Q4O2̳i'Yq+LpSrS:]yt0h#}i{|+RƞѮq\*QkӕÛ4kZiVs?rV3Mi]|MBwۏ"sLs|w\I9SMG8W-GߦeNwT\s6eAX*h,ڬ3QXgܬm=Ȼ͍꜕zg94ўHHq&NJjq!Fn:^3Y |TLs56#\T¥Tѝ6S/^fm2SJs는9ĊQ{ThKiwRB `KW7X :~?]lA4;aD,q4TdQDw0ԚࡈpcVp 0sHޠmkUgW,˫M,Op -Ue Z$&u(׭T ?R V5\4V pGs d6"#ɥH_zb*MwǹY -VxU.pg+<\!Y -VxB¬ܬ  3Qe3U~' -M[S'4tcx֭`\ʝD+\Oo{WZ V(lJG8*œiR0t۹UrG)r:X[!<ǠkCCTj{V}N=ώZ{+ pᚕk%mjqVO{E980[nyGM5dv9ev>dj'RdњL|6|Xgܬ֖3YTC -0*˜8SAu$ްQ*jDY)~G4y)q"ssw -֙XPL|](%x<²˜;Efj6bpCr<ar:"2L535`X&Lts;Gqrd%IW%MmqbÅkVFoѮ]Z"6+?yUY‰jq }9M#DQ?V[*Vɹ 2!Z -0`r8ҋl@^֟gMfh3jTA=͉vD84<U M*A_ -XM0@b\TV+P`v@ 44 -O!Umqk_:4;'rhBltVr=޻)h5YVC]SZ)_`7L:V:O -FNcxh_+(?|jAײEG7x«iߦ5b惵ui$KyYXQGʇkhևS5nW8#,4Q]gyk)̓o?٣iv?DM7_-ugDwgZ=(m&`; V> ]zNfWu 7 -4QZ[7Bh+޹?V~of54u@¥K7KVW`S{0QrhMfChp+WAU(K s*U?*ngtNzށfxBZkCX iV9P#ϴ{Ý5S|*s$T+=GNa+$1E.OB|Qs=hդvH ?D۵$ᡴvjV XՃK4R 0Lq݋zi]jQȬ-v;M^$=*) 8BAUp)ڣKU;M1&'PO¢vt;}o ,(ۥ=|zh)QXV9YWD{ڟBn<4Bn`Q¡*`g8 {=hE7 -i2\;+˩098+$fP_\BL?*k)#$³Z8U~itf UkcF4}Ɏo͢.ul+>4m4'+ *']Qě^a%_mf*d|(YpPC']dv.45P5FֿCXNɖcdf_e?]5ʵٮojR|c~ p9Ejnl;hh#M7CV+\xh7+cxU*Pk74{K˥eνK;Ff&[I,=^|)eUV(;nqfhW+[·_] -^ te(}N^\6i`pFO*0PGCF̫D\A ہS2X]Eh^jz0h4_*XYLFp:Xp/hZSWB0}$F4 Pșp?0l:mqEx\̩b7s'G -Q̍VvnP5Bv~%`2?\ ݹ+Ӆj*]/N7dIUd3^K݇%P[:&4꧘Q=I(ɹrW(oV.0xtTXzƬ.h]3piS%UBr~Ti#+~͵>a[m +|<豻Lܘab7W.Nw|47aSU#w'ThxmӂXT -Iz&cDV:4+$ꎰ֬3V .ʧI_ާu :+C<ɴxhΦ2;kAN2#ZmjwSúh&؟Y=sbAݺhR淮gz{5{zjڤrxnh_jD=G4P -wUuLiU89}4Iͽ=ZmJ<} TKRuR"ώh:4򋼀r.P -WE.x\m>ح۾9.}~-0)Ziqvw?<ʿS48/TPtuJNS4IBTiOhэv.Vp1R$j{ߦ佰ʏ.Qr}꺺$1?YFC$N?RbI+rEXN'`֙.HwŠѹY{[CUfdr2tvZ|T5/u/gMFOԨ~AJFJcQiEu**z40:B*)\NI -WE9y|n Cͽ!Wff -2PFx 4kOxcpNnO [v ph칺9#!vXaF `;Gtf*oB+tHwJ :\pU":JVUdzX: jK -xi䥃rҡנ+xpۅSP|wնR֫D78kբKIG 4F4sLLsA Th'RQ5hEkJspQwٺ۫ڮic̮8U׺Q薭q![[ϕ4B]0wW[yYC՛.䧌TlV)c-/~ऍISrڄ#zOH}4{Jڏ0s pԦe.ijyfUXC#YL kNn'$xq)@-v=mr~bS5{re._Q V+G -¬jeӳDjMp}sYOŒm?-:wo \3$uR.DU\aJ֘S_EhuÂŕ1=b͔ƩTwNmrtze&EN^5W?.KiuW17sv9(~VGLҪF<. ->:{ڔR Q茺| Mm E4gE{'VO)T<(S2zIP݊ݥJΒK:h@Ljȡ' L}ưM $dBs•Q=(!!"skqjIM --1#qc1 - *B -5[08!S.HK[hk`w\\ZUPqAܳM<FEzWaE@q8 y#ꐳ* Rs2ZJ\={|Ui)bGLUW(}xl0PKZc֠h/Mp4A#X-1bkes.xtHV'pbRqQDyeqG2p*vVuԗv&3SCoW\g!_1RNYJۏ5-r4SA|Ky- ip$4qIR՞>~mRZ[G˜-3ʚn+Y)oc]L}k`@h~n)ދ*Y_xDdnŁ[ -R:%s$+S8)ﺔDd)Kuixڧ)!_] _Y5(BXaTWn+(P];V)S@РLˊ'4gBWk\Ǫd.P} -*_VzΠĹsQ]kW>$Sz8Tל֛['r6Lhf/bEPnk6' -PIQӱ&pz&EIn 詩͢5[W:TqLZSV'qX:\^18ZB ܢ_Sѯ]wׇS] -0W⪱Djfpi=.PPSAat -83e#(sT:ZL@.P}>Uȥ^svؽN`VU -)/9QTLb!1h6]ୖg,E84gv yt<s5f6k5E|k qEw&4}48j%[l\'^t7D:DP\k1r?rS9E4`qu5He{!~7-Jk|ƱRKoQ3#_!^R;[F6r*؟evhۨԧ1Te)ѱM~UsCaޟXa㪩qd~~4n mWc/S*Q Rr-W/W$#T%WA7P֘OxQx uWG8(u`aS%a}4J"׽J5v(P\?XVǑVFnJNGn)D_.kMIqW=SZatehWM.MϠ*|(7'v -Lx>Zl}U2A.Kf*'[O%;^(kx±Y>OA:{^juKO -qO_S]ƕQ3zoGu}Ü''|^xW@o6 3Ĩ)q26֓|#R㢕OVp)C+WTiM]vU:}^RS~Qr+oRu.c9" tCS W5O$c#'WS[VZW>Bs&CAwd!*(wwpoUhU{C#-h9Cg\nwMIW:C7BjP.X1SJnVp4N*J{ G֎ -)|@rG7o+t_­ݣXCC+UeYgQ][4M+))m5V5h~Jay-C!#ٟnkX"Gy4U\.=mVv12]USDQz&@XOtس]4:ctl -VC\N -f8x.s$:"6`H}J1_` -!?*7MUu; -*:N &Y֟ .vM2R0mT~ gk*$`) -'gtz{X׈*(}\/kԢݱ*\Q4 P5Y@bsѨ-b"a(# -p*Q}t:1jV[!+%r&Wbu+ -ʽkLdЬ`-ҏ_6滥dtDy<|!YPihCkyi2~Ppgt)[c0Piq(GG8w)D-O:ZƋQ^h -!-bKh*#m0vyQʱ?~ {7au{wzu[\ f&`!U YgOkcR:t}S*xx~ǡi Vۂq n:nK+tS+\oV~{,dz -mW(8uaM>J+[7+CujЙg4g,\*hQ mqN(`S"W6giګ' -\˜ -;yZexsj Gʆoݕ*h<ϰ{l*FU?ZIuCw# [Aiz r|Ղd#4s.c~ -F<5V;D*5v4F[VErOn $ rSEJH\; ’>/by;j6M)-os~^@ՠp) -kݦ ;n - b2#05bWSQveka*yfjkyT~-HZ+4*9*_+u&to5h<*e¬֦] 3mM 3Zjp!Y7ۦPaNz[R5<ڦ@ :2*-,қ\@ߡBJM3:aD<³e0{?$j4<4 Ų8uT) i&u4:+w ӰÿOk`:bS\].@;yN7˭Nnu•)B˻49$x)rيż~?q7p+Vh#%S}ޱqOtrJWo|9hJ4T\}D|AwySL QW^YH4pOuW}?^> 3SbT -`\R1PVDW9 CMOTNScc|NmBDSt+.w˨Cj(Owޫ}ӱZ_CL4v $aJ} - -˞F 04Co -&`& {;Z ~0!Op欳_(T61MJa2~*]66߫gjݴF~)}Z{%$Jkrۡohsz(gj1àJiisD0%O.랄+D!y>^$_ut^ޚ$ħ|Dk@?Mz^[УFja`mT}#wS"rS^<|A{9g[8:J%#wTxCɩxNqntyh=nkpw\C]vZ*bWH&jXN aǼ: 4yBJz2ƺkZJVJv9i{/ǪdܹE+[N*@7T*Xw1Ǔ[ -YxXa -#Ei䯟ʡY:ռ@Ÿ)du|Ra -] -8qZRަ*1'⋏1hocC\xeiF(aVv;򍘊P1b3wtyD)QKݡk@wӃtiPXqxV[׾#=hCϪR; W?="*R*"oXЅ!APGCGGE4nMZ>g04xi`u2hK/S%T?qP F'@*3P ñָ &w(zUfgD1۠WQ+4|/UkUK+|t+xIZMͅp9dt:6J||>QІ֪?mI|4IfhdN>Z[^>&ӡrsISc{,ugqUk;hh*&nQ7rcGӰl GfDj}S̅$y.>? =M}|Բ'1PFͽZުI̜JiZާ1НnSVC^mYVG{{OtO9zˠڄýEOR4-"ܠ(鱮Рf7(k -R)#*/$Ę[UV(fU7WaCe x?ilB~4r?dO.P9 4'HDjULڐ-!yJ@́6[.; &0p̈́6 tC-FF?LB{5 "o3.37xG \B`+݌;c)B DR&_*[oX50GB8IrrL1Y{B9hp  "o5=RY2%2 cSc@\3.~IH`bl\l xaK"D9I~$kN$B'G<(Pr8 $ q5Z2f4"6b3b« B2SUy}~a] YTsuסr(1m6I4#Ť` -KeĪmFHY2z#īzΨV$ٓB3,zY'Uh ~)*E-䎐pX%,juPn -D.$Q-7Qm:T:`+2#gSal-!"D{9qUu)b9Z&gI)y\+zPO3 aB/ =g"Z i3g Y]f+`sgl&\h&>>?r?/m $z,c@"0ahgM=f^-fݑ?K|CxPw=LL3aYvx2K$h4Ô4)r@3 H;2ί94GT :ti@o>D"@iDVj.UwJmMDjrruh:"Ф2x4(8HLw& ,9^whp \nk Dg Pĕʓ U}A܄shF"($yFlIjrP+bm'+PXikq) - H _CUhIstCt~?˗f!,L˒r3H\IS$ғ#H}D:$6vMO"@0) }8#ۚLp3!6i>?a,ݽT=@s0yR|B^d?a}92ߴIVl~HGEo!{++a ߠb)W 0B[4"! Ez138!@ߔW+;ʟ(@.o@5D[Jԧ#tRUcf(*e,~'yU9_GH" "4!qz|@VPnVbn yMyҁݟNv/`ӏY;xUvu?T$l7n|d@06t`.mp'Q)vX5Ckzg΄N׋9E~~WwTr1oU`,o&n ޵~1Jq zKZg?Qx!"& -K(D4n=LoJ+|: ~2F#>/xLq^:#$~8`*G @YH͸ޟ~o2\d:ŕXc3D-q7 LYДZ-sn -'tMЪw@2aoDJL9c.w ˂I+f=zl -;˦7PV$Yay@DAf$AV7]xPD؊+?P`9!H0(E#PL If)'X+H8d' e3' 2:ElJH B9N_: KR7eCVK_/Vb:vtXQ"*>e9 JpɆ):~JR@Խ^h RFV_HhC(9a̷e*PQQqpЦgsg ]|&kȝJKI -./Q$,Idi6FVTP7*ρ딴+nBda}\"4-"]HhbkbNcRAt.h<-? ~g:Hj XUIird _Ǭ, @ϞvCU p؉9L``ŐD1 nfQ8xKHC$m8((OWJ7ga(C&諃 ȃtz#fߌTmD -H.BPVF#!.%?)25%YxAˢ 9]Р~D`ؓ-!6?c" w#\F &k$=Ǎh21ne!*} -A1y[#AS755Ug-Š@4+)@sjkI8š.Gm7+6dYdt@J=c5bKtJSko 8ǂ/6дp7&8Pl!JiO x,(@J|b<4r]T,PBY -[kcRr@ @b$0k@X#% *ڇ&8A264M6w12 <Ȅ d4Dஓ%Dh@H@WWcKVC g M < bb㟀 H<6L?zO4 n2d@8:g" +>2 &R-xJ<]¼])مwnNװ/ -d!Q-i|.Ғs Pvud: B+z~΢S@+QOߌW p0?*\]HDq%Tt|IcK* _v~J#h~ -8C+?%avDYiP - @feú!,; :t_l*W1)]2%&HHtrGc54 ?06m8z8ĒQN`+yT0D&X@&딩x99#Xn5ٚs}2P-`wqėRUI$=%|2SyGy*1fnUkW0_ls9Euu-G^*DFGa<BpR)*pnBkPn F"8;p 0:0BQ8jI()AP,u>4 -G(6_Ja@am 2>2.9![\3h(b1`U g@U2EQ5rJn4œ;JEU"hwi79(L.LMǁc'˘ˎ,UVn]knoUu3>mkT1(h+I* Ex|d=",K4@.H!on*Pe>2sLfc±JcޏpJ+[H?1d9<6R%V62+#E@gƸ6t@9IDtYk!5E@ ,++ $EB D qd%g%oE 5D*K HښPPzĭ#|DUB!Opi \u'>7vSwC!IYEGN0 l mG z@ ?I5K5 chm8:&:Pi,K=< yF5 Gt:$o iMhƽUi`Abl5/;EEK(#V T2y(H0jp"2m1 TY\Y@S@az >&9Ƚ\vc< DK0ZCtT{Y`B!| Q<"HWRx&p>6Dx 䘯 y>$eAdAJytM-=PHf?R[[O1TDx!Sy@.LLP#Q -o" !yMful038  8Eѷhs_O[6CUFl$͡$4LQScQHܞWvn qQbe§*qUM?-5 -zTb8ón3ĩ蜦v|fÉI-̀#6 D/h}R)0 UDH|חJ]P&N(-ZEVAt!'"UbBm Fm' %;Cb<1ώ"uv@ nBa"7>;5&S$2MKx\ѤҌ& -ܸBO Q2J}=?K3B@@0'T1:z+PB".2 A OWЧ X@pai0pP3hz(p8b@!5Hq4 -uVABڙ-Xs.0 ahSV+%0B$DzCE>Ή|gW5痙6wcR̀25 Cto* "`_/k~,J]Aʌʔi$hA5Xuf}ט'l03띭~;f3dbo(L2V(Vǟ?i2 m#AH2B Δ&jxG$Cߤx-fQ,Qd Y|!8`ak x$&/(Qdy4p0`:ć$a\%QX*T5Gc -(4j[ʹwFD&_khp%` e̓a -f0AA@C MGV~e"!bHr  6#E!BcE)s0`2TT" T-px9(*+E~ 05*U54Xx' 1ڽ  5$LWw~P (J&,y`tgn;F 6"еr` rqk-W=*̻@4¹)faD N 4kG~+sЏM [ [@,N*mP0ECE%D$Fk*d츰C@q$l(S1+Z; ,LCʰP8s"K|{KKwy!1ރ[6 PDp+D G%,!zsp}UJ.Je$ i>>CJ)ש6]xA'L8>uJq#p3h7 #G^8 j/uQ>Û)>k3 r,#/KunB{2:x$TCBί{Y|H2n*#&Tpi.ۘ4IhDigE?*GS3RbQ@OuZf"Z)E,;. #SIUA,NqÃ) I,9c k#Hӷ(oꞙMmWS@\2k[vQ|0BΠCD)`M(DbXȹAhTw y=aϷBY6_H?(H]Odthh*JMઁf+,nZBrA%C3;eK!u@:siZᏈˍtЅPEA΂BcQ`)DAky#鑰ǀ{kٍP)!/o0s28}\H -9 -ab?`"zJBs|&:f~|IjP,KwO  d!H4i\a"E@$aAHg }m1Bd7p`  > HUNhV]BKEKMHyZqG'[Ϛ% -t27C{qaFvO1^x@س6?\ny-3&Em<`+Q!+wǼ?LM;>_X@jޱOmF)j`G8֏rJM i`=WZwP -DspCSDZP((%B_C"6Ќ@*Ps  }(%Nec  v%,ɏL -\8Bխ`hydYKfeJx@*M:C4CeE>hJD97Ҥ{ }b -p,U`!xHWlٲu -*%bjpScCTb߿HHrXWEnb>X.OMb :NroR/\9tX$T~Z5-@,v!?G_C%Ox Wt -[3oy7#O 4~j9EP@fyȝ 5p(J\lgTs)h/IWq$Q?@ j|0bTS!%LO00%2sP@}67!Y% !>`];T"Ln\dH -$cp?B}VLSܵ:ʞ76@?oց -LzG&l-'4\Qx+~wLl! ^L)Tu.?BXqk,T(,*Ԃ$rQ\eG!e`3~lm(Uà̀Qt"S2TPdHrTM -7TC(")*6Ԡ( o4;~hP1ܒ!NM%,Exܓؘy9Kyvy"`#˟Op3`cq/F{X;(\6 4t_ڥU^TLDӬDޯ4p_G9xv"_$"ICtbHxA5|0ھ0AI@cuQAX@7E`YEF؀6X؎FRBHl~h 7Y^q`_1ӝ&< c6 ! ^l(;VBn%r=FgN{~;O ͋-r= -J@l͇2g%f7lu<炷!*wjFPqP )>0GHT --qȑ-Gmb`%a˂5>U+}T>1BptPb). $jcC'v+@񈈛{)]&ͨX=%Wc@Vwt p .4K+MP ! 3^fw>_CgsYu8e^ xG,.DR%cb*X9[X - -BFY _oCF@&Ex72⚌J)i 18 3-1h/HE0)_-Ul8.9X4<3N3ˆ @=t0*3:eB{QBk sL; vzhsQ:$*qD;f0&NeO$ë]P+RlkC|IĤܻ?͏lЋY,ک>egx!bH")7t$&ɹ?#CjЂ$#peG; DG | "owVrFST-lj@IxM@ٶyq6;^T׿6 @ƕ^m (M((i - -9~ =@E4B˼v$>@kW0)zEk c,36ZDXޱF-bʚ30+=P_ * -'XduDizcqAZ}AP bKսf<G}RM9!@3!x - -" "9 -H(<5l D`NB $h+fHJQ &W` Ÿw"nM<\\`@2N@B$gAąNI4سA-@ #1|LUp8_ݚ#|!5KߌCΝk*pɴ#&B8f+(4O -Hgp XId*`< Cr_ͽ D !<ئv!  -P(Q@%=9AK(;@N A OGU^ f@OtY̲ bD 5+f gmfPP|"ELld&emU5`K5AS 3LaC>zjl| "9W8RGYqشȄ0yO{+=SCQeHcD!k $x;X|"+a[#@&} w7iuF]ievMjˌ7s$߯t"aC7;׹\:`WdNpGX"7  U< U8tW|_,z0)y6L,Xe}&%{-&:$Gp! |V8lG!)rLIu>9s /L`X63Yxl!,uќW-'qy'D*| x6l |~aղ+lA3gjB9jDCd._}Xr#q߁P|YpXC,Շ -^Ͽ?I= 1125ʘΊT 5Kl"A2 -\ xn`'d3f8Լ* - 1(Z\yt(z(O"l/e2IFbw&TA> z)}ae@9o>ii< P/A@qjt6R4F -T s*!`AtUyy@c_t&&V:cA\pRNCU$,'\J~epL}3!޻k -bK<#-c< -|HT7E 8W>DI bthJn%e@v -2s$Hs#%U9쀚m-n2-~lAa*TH!4r<B@*!s=Ӎ˷F2&X}`e.A8"sۂ2ݕnIBc1Ak4,Wb%$"@ ;J>8E#YZd, ]M~ޑL'(/WCeyNKZ[\ }Hٸ4yq_A+r=tEs:N,TDQ~DNlȂɏȔ)I%B_@G"GC+m^-֔ZetHFhrZ{ cww`LE>Im]@ P^%26>>xA!#%d5Q`MʏZbj1. A~t km1qy4ArJUyz,!hxråfys` -:Bŷ->#D@ی* -6iMe~y5›fAuae !;hrqEH&ԭKfX0K -k x%?k'Q>59d BH13ydL/} Hήb] |_Ĉ~ѵ OBZۍBͯah O4 llS -* "+ ZW3 %>n6D: ˧$wN0(vBxUBBڝe -zt;D60Pe/Q@Uw|~s|$l`Ѫ yo62jhaOXn֣,2 BA%8 }PXep;()VPFVdiitG;D04hdg0irHnیnȀ_SL= Q2dI]WTS0@aH Q2c$Vf^a<哴$BGi$p^ K (p1`× [D;CtuďGV@Lab 0DI.TG9W\*UDNEl t &~*km`L@BEW, o:j mj:c XE` gk@d

}LU %N\f.KT}0ॎJLIzUV(`yOCy?πj|OѽA]p ;^ WᥭM8J9S쯇bHɭ^rmuȐD)+k"TQZvMRѭ|`b8"# jZÜؗ+@o<ru MFwbj a+F`LXTiM -Xq~/6-HbR_%RJ#lp}#j /Y)4?ޠJxD  )<@*ZW &'C,Ũ7J6qHd;L'Ua7G' ς%0UY0@8C̿ťN^"_sGw%65#n_>} ~p!d?05tΗv&<4QdrU/ -H9cM-b!mE[^#ޓUt8NDs{@XH `Hs,b;3QODaV,k3lL0 H_93 QD"sBLUn ❔:*d s Q7M|D * _sB@#uz0nctγ[D|*jQ;8C3 5 zz֣i9@56ne֘)؏S[ IAs.A$'nE×M/‡ӾLAf_S0$GJK')$dDK&,lb _wPz~rHӔDȪrCWQ\􄴧Qw=\{P%VR8OxE\@ 3A#3RC - -\w;[Hf< V{'͟O ??M%mnaxl|BU.re9 -<7Hҫ|K"j0%ka6Nyf}BLH%B5D@ (K_ -z dPŪ)JpUvf9#yϔ7*W_AWA++FGHyѡwuv S[p F°7v B0R#> 4 XWTw@f9F$@rY.B<4#C$~=i hT/B m(6&m)8~ e;^989!pU(@/UfG^|WD|J<6 X `C֔BiTPnH\1̞cHқfQ9yz24`wQGiBh&` -y t@R OԐ[71X?kUx: c:Hv{̨6^ufgF!20 3 d.srϘ?!Q> 59OeHz#HVN/p~u.GBH拴 xi&Vt@^ɠ TG YN69 0嗧)3Z&Y~/m =Y4Mf+YABUYtѹ]  aHf }eф*Kw^sV ѲY5\B@ 6UOh$uxo5uԚ3VAXAX;Sdm2V_U@is9U2e}/6Hk4Q2R2zzc$[[?@rH>}>>~ 7-OR(G~P 2S[? 0EeLz'쁏 =4399M.S X0VgcD [%VJ1k`a1 P!NӻvàxmOJ3!m#〠# -G6$7 D1i &6SPZ/C"`]yЭp'B E iD+)D~-VG_я{fnNS~5NQoh>B;gV# S.hqH@A/Ζ9$EKuMӜ6zA )k!g_~׵:YAEP 4 ᢸ6MɋrPC9h!iSeXasBx۵ -2Xl#,;9@gHb>X"4V F\9UhG5Y͆`-GdSI^N`qhc9hµlI&95 -w;LĂ= &9;쾛L}^  C09l3ᇰ.*J5leEy:2Ta@2`Dtډb gwp``3忬#(`DmϡO >HvG srIGUը%Yr -a!? -Aj@.yf#>7ܟ\6F  wĶ;[3L2%yJ }L#0Jfau@TC@j< kbR?CMg\%B]@7V.& -8@.PA\u>%(yB~ 81$GCPAa -jk jmL2ddzZ -tN҈VѷxĠLMuT#;`u$Y0"Ԅ\V?g2K. 64-JXM; .Q;et `"l̜ ?Nؕ-ψa|oj>Q˄ҎMUӾBYcSg@{YF0\D_N.- -TDn1!D!d.M۷@55J0=ChdDqY?AJAVZ4D-ty>0.%N05.Q=pA .2]| uS@ X a! NRc! 74#~ Ƣ0=F#2UA}X"`vLt;φRC^%Rj:%p;̷MiW[3EH: -R!jFPϚb^p1s&Gy ]D5\e$ m o*M xT\O:)x 9-Ϛ-5 -JΈV څl]·oTd y ̩]fr^A`j:~+xH$dǴi*3}Fp;-K@~ 8犜;(}V @1>ޓe%+UDɮ7ۉ*;,Fp≶\;+Pm0A -pZ@5yVyrfVK{6  a -P\Pet݁C -#AkUϧ| k59?͗)˷ "8Ҋ*U*d$DE`ףP;\ Z!84AƢ(3!F(ðQ%f$LZANуoa@Jz!@PV#w9Ȱy & i׌8 # @df qH-T¢ ` g|0`o!>2 Qq+dth5f9rw<d9 V p*P,7jDėSU@8AĀ'P,  T"~s f?(|V! -5p(Fu)EafF  %ŁFR -}_联$€d"l&!j !TBr4x>4PĭK0!^fO jhzMx`h qyg|teA5N$)X fvc.DJbB6XI -ZߵoZq&8r(- 3pD"QpZJuB.-;\,0Q^w8VJzZ;"Mԝ# Cl[x -SLB(I0}оpX!6|A:9Tc|O _9UYjP )RV$;goSwǹ6`Gp[3QF?{4vn5 339pCzcaroaLj4mzd@rF3B, yF}c~>gT#֚Y9ā3O YN "WQS@ˮtup  yPN *e֐VUćDDX?Q5W&(^S>0 h&u7X lI)uc -+nX8kC4QMRxtpzGDPp8&/?? C;썀ʄ77@LFwPOsE}ɺ~2FcqZk3Ϊ >)[_MIa d@"؛u3?\;fN=R( /bu -5!hn0q7O b=q~-9sR,κIM( B;PBUY̧ґ>}0ߏJp ѐp]3<<߁$D# sH2Vxn =ay )$GP#X+0sBK'^ez -b)B YZ&@ wAX\E]$C-dPVDμhȌ#E[EFR ޒ)3^jDk1Y~|,5{*9R?5-p^ʷvje@S>.J\׽XyÌ$Y' m݄Iu4SWOVIu?GuT{~`L7DM͚bS-)Ftbo$pT*wDK'okim\hhЙ cPO0Lrw{ʯ o ,̂OX\֜Xz҂u-9Z])]r| &Џ)eϪ6=31JN%pJGpA5/Ŀrj r U0tE+6l \a%7~ N4Ul86bo(o̝.d!Κ\ ps`]s.V]k?Z:5+(a`9@rwºFX"Н^]caRD)l" .`~.wT2m #9"O{Tp -Y$b$#IC.R.u"`l"&@B0ʒ jzAY~ -A?@LT5f50*a4u~; 32%h': )exQrLg8';@Gڅ Pv^6^^BH5iA L񞏲 -+ `?FI='4e $(aɠS)4p﵉ufī :VR @59Oc3f6-\ʙ%m|oU_]cePF; ynt QE؜CBsU7TW -:iX&[IMgVOZTAJ儊*2@T(ϋO\*m %; t)v$BNknLa[vB žxQxPG AM Rp Pj '8;mG)AWt@_'҅ql"[jw DfCs]2BAScQohPDD*#/MX ("ɞu% 0(Lzpro)PJƅ/}.WmVtImX6?sdw7--RfDǡ@QV>Pq\\M.X U艍T -1.mz -RI(4) Ο͗.;<Q~"}fصG“ IPh"V# ab56Sq gBJmdePXĪ -`e*6/ ";`5VaDX@) 8;&#_VvZ'e`G-=V -P PqD5) ti *&AQZmH u_' 㠨fbljAmf7/VNlD~\n#@KIV7r5N y%b(Kp@/A^@ ;]ZXrlR(hl\D C!^@9 \Py$& Ā-՚BroD֋>w\tA &Bq7:&.!fJi(кH pYhuٍE,V}< A.3 %,@A!ͦuvـ{j@a8(((cFv+g'8&VpAJw8-񎢀D9 fQH#hP#-Nɖ3Ɋ\%p*xq]`ʞ&/$E8&F @2eV5xϞ5?~#/c~'Oo*-Y\%Jt[**2pg2Q1#='?k&( 2K&!8'/l2uP)[]@>t .é{k3@w+e(ݥ…eg=aʠ $AO6}܉@86Քy+.at DK!g"1VLIak;/i2SB5 -Y ' y9u#,ԇb>!VD$!$$-R5^<- 4׎AӀGlDHk.bYP.;D}`AVT -#( 2yN*0>1>煆'׸t'$K_ǔ@xn#t5Yh=ßE8X͔v>PY Ȳ!e ?dU(l(j'(* -! B C[c(*%8jyH- Aj -8n&MX`\X+F3:8T6 ,S{*~ެL,jJA@݈Gh κ ވ J"Hde/mV2aP"iiM >eOlf\"W!*qeG}느zÓſK35alng޽v}_/[)7}Y(uBun] 11}L&&gAm*TbtV0ƜM(3 -Ξ#FO}O#+5q.A÷>;]e("ȓuQs(^MDȃ -h0ּ87v@ADk堈Jj] - -E@lH d"h]VBph? ν$DŽ5J+rE1[KEulۉǐ7Ձ=8ǹє l ̓L/Ԃu1(@Raʬnvg`Th^Cż}̫q([R:Wk6o<4aU^NKT둂9\d \Vo9K5QzK8&Q,!9ouRج r5T|aPdj+~WK̀fax,WQ0!ֆ|tǩ۴*3 @¤* GQ;سIE2C"pp ,#&$'Jf}#}Gh)M3g z'^):!$oLA3P X8N![ -dX111uk !X?)J:(4V~ F )`\ Ou -(B&sFA?J_ߌ ` aUg|OUƘɵe\ Y'V⛃P - .2dtpt&]P)AI1Aq]ٵDW6apځ3`G>Ђ@Uz Z8H 8I61 #ULA ň8hhtC|Ep:O2e[!ra{7&h@,AAf}Cs5LMRDl`06 * Ve+@^HFmnO@d֊+.Zr] <88,CKYtbIUVLॠV  -sC恂8xB^o[+)ikCecӒX^Ui}g>RlU^QU m)RYX2w^ g=`'<-( ND!EA01kRDZƈV:M!`NIG2enfy2*j#JSoJg' Y -mi5-q:<8fQFX y446] -U^dcoz] D_= 3q̋bX#xbo\:ɤ v&=e(3,LH6G>>>9`RJErP=Wj *甘:0P+ :Li.d9ZV(|̍"] l.B\ `g -o(7ЃT@1y?q|nBok`@{},P0BOeTcMVL F桀0TgGZ.O.^ 5+yAeZV8 H&Z@@a7@ހ@G0zpTƣdTmM<B@ |j3e*ѸoSK4JEXF*h2R(d%`dSG0 1-0$ ı=e0H;A2؍>  1 R#{rJf.c8.)d<D6jWu7aP/TE 1(~2r@ - KXP EZl@`@I0qMBDz2{$DDĐPnY2I<5~a 0=zx02km5ڦzt] ]$Q !` :PWBKx=!{0^U%GQj%16'hq*p+4ȈDNVbMu\a@gcC]\_ p#Ypv¸j.c o $L6'XTAզª=t/S!(۟'P7CKhS#,S2u/ m)V(V%߰1^)ZJA4 EW ax8/Hx؃JkƴH>\͙Rs\/ A#F1J@/xw?2YI OiiivA9Hp1x VgT"+rc -]I6rfq@Z,?'(T ""ԢdGrR?ah3*L TfTScf/ O::>6+m8x KeϿ RzBT$ y;\=#'ig>2AR'˗A`A 9c mLY~P6sV`PP&raQQ W9HĄιVrSN`u(j mj:V' ~e2L & d:6լֹ̰9k%tV*!$p8{8I]4hېrco`SDLToVki@iU PBf0`Na:yb(d;n +3"7@g^)ax&[gi3o8(>Q&;a*`Yy}MtnpꀺWBBQlφ%0;OU&x`13.B hy K" -gmBf)G9$wT`qH yx` Ak奀d<ݚw* @}ՆPY݃K]SCYSE6͆ނ!~J|gX^{0 JT,' ҍױ l'1f+@Ū D̀C|HH*1 ,WЂVb2/[@G/4`B`La^!t%KhUQ34|tbrs;t_?3ϙK9BpL$HoK̾!s x W ~>Ј;^A9,i81Dr 7l=*G 0h.FE b9EVj;CX-PN7QB02tiPI\ho3"+lM̻Zbw DxW= `'+op#EHs%Z)Ga !  !|,`Xej./r3muX3f -Rg(4rBF,"/ jz~a G"]9 ԕP_$AxR] ۍ$R"s辒KK~A4zlz•M(3fI*¢r$7x¬M$ Tb>?7HX$Ht"ay8nFUhS@qiQS!A -9C1h(+Ap%j٨h "8j2D̩+u\-h2_vBcq qX!abY(AuPʬuJDR,C8#CM j&XS@P17|pX0&fg6U+9? )({\<3^\hHO=p 6Qpu{( N5!L$A]@!$́ -7Cr @Ǧe -s-,siHnfL&XbFBAy8!*n ~-v3@&_9"uP0\&bX -!*!ό@!d>SP"0 G5 z@C&ԅщ6hLFTEB ޴bH+$hQdUD~GZE"\hF9hL.8K\0[Ay"btG%X-k9Z$JAUt(?1$GaU5ܯ|a$]SCU㤡5j!JH:KI/S "Ga d2D(/[| -j -ׄ5fy e#"Ɂ8N[RAJVOjPrB.wh/&v pxo:},t:ܺIbљ]J \:o}L\(\6€13zuIe QBUf$M:,td{`'vz@z3Qx> ;ܞq_4CÀ! + Mz(F":sDqdP)0M(m**9Nr`M9(!pyvҗjR1܇q2!N!PFT&t4`P1[@*@H7aRaЕ3b(T}| vkȩZɝ"E8=J̔+PT`*,D_s غh&E"Q)-nW*-X (t]p$h - m rN]=FG{F:C-vQameI`61y[2 @$Rg|H -shƘYJ(h#ׂFDSV 9ÛH3kb姪B$(f+h}+FD֦> @i˕QhA;뀾 ?DvuOG()c#ˏ5M!R42 +L[ rin (#D&g0:A&L0\FAx)<{vHl.M`3,H(ӀE0XS{d(Y`ܩo>X`(1}aJ#-䠄y,_;=G^EC47ʲ.ŸYa ]$W`אid~bҁ\HB!a01^ UG2@$)9A:Bv<=/zJ#yC޹S(t@UD2 \ -,65R ;By^$npAP,+S 'u0o[k.0 U ҙ|’`W"K -9^UEqR=Ĩ /LvWldRãFb*F>z_Nx AwFCRlRь(A5VRn85!GW2#$, -ONX}QA+xi;dꛞ& fN1$o0.Rbk79fWȠEi-ʴQ˽$"fW)`4b`k}p;2hmQS8C򦙘$q6Ϻ,* u0mCXj V!@6pSZpfhTSYzO O%iT~024'!J6tbdJJ'75UfE:@eoBJRud85N! 1}6 ONCЀfBHx30`©)!v|9‡BpfTVdehx ?@aš>UJ&}н= qbnʪP݇8ZJ\*w8,v06!*< g-Wp[ 6d昂 }32x S<Ԕ1GNw`atk3^3L?s 7"nqqDc"y)u .b9P -B27L5een -fH0?@ǚN9ɹ} &Z-4LRh bMmNG;ͣC*ԄFS1dqTx?a GB:;3{9~`@ZܟB۽yJ4$t͙yLZA*6>ͥl`9&#%?:Z÷wpiz2zFi:1'xƹt* -@Pa[btrS{| _ܟ܀ \[nB=qnZIO;>;:EYVwypx!V'3Iv*zVӞ xB^qw}$J3\&pm:F3WyZ9x~>׽=== ۄF,8TArX@aa%Yf2Z(s_`j( }a^mwP]PC0`Aa\_ *7 rg#6&n_ėXGNRL0 - -BztOJªm1 J==X"a &9~) ?F$Lq R8(F\`x ڰzcyfTU|zsm1oD0V,ʄWەuP}b<">isYBE6cYC>fgF>܈)$۔1BuW\*ܓF}2;tVLT؄rt1Jp (2< -(`erHBΜP;RSxp" !@SMكkrxto,yFҵo  w $ @d E0c} gr;H״33PDRtm;SDdPeR>h7p; q(eL#0HPɐ5Evn\a|aa!MaΪW< !B\(ZAAИ1Oy@E6OL;jv8S ÂW('pZU! W.<8O ID`̙eY -[L s4;  -d\zumqA(Ɔ)ZYiMWE/@l76H.Y13!-;`&Ktv}I'j02հiB i}P^9eb}c;k|ƎP{IeC ->TT``]mҋUz[js'KXPCz{5;`]^wЊ:fE D/5x0ble -PbQ@]@=A$E&x bz{G#fPoZդ - ,._LrNrYR`PݜWu'XQTg p1fYGLη}3̡BF*=9 ٕ!lz` H]{m0~ ~ @PIU<Ĥۙ_X‡# gzph&s`?Aώg} rC+9a -AEpHpDxgA)FghAN+k["a|"#=D`!q+ { 8OW@CcfY_@7Z| rQ.#7 ?DGd\C'Pl15HDAe .R -&BXxV?$<]wa(_BWLgikFˢp]Xm+)X:Z@t&//hqې2@сB:Z 1ہ%R`%D=IC} ?du E%M$h[<)a:+G9s>툟1Ãr6KBOe4 _j%"Ѣ*ep'2A> I!Sl*l N`L@*[}әC޽P2w h<$ =pЩz+z<`BKD @d˾)vX HhiX.o8l|A1u*y EA8(.buȂh {!G9~? -6.gJ}'6Ama s:h1 Ia7s$'reQ|4![m%dbpoA)gVefUU&kIVTTKl^u1/b$i|ʕ Osm.q -Zwx;\7p2Rjq03$z3>vY `r#ѠX( x7m(60&TnVU aG$xA &hgu> -ùu<>A@3Z.bF ޜ0US -?*/iPw!v'9~S !DXB8#-wrPD@M݊%G.`50 TŘjk1:񖊼*]$yBtௗϬt[?P?/~I454ƪ e: -XQ`Š-uxO0^6PnRQped3dgI@]`0+72hi -PF_,`@QgQ~xg!$:^S@AהL=ϊΘX:Tn]"nA~1Fn9!Aj~:"TJ)PEՋ -BD>TEp$ZN r<1\O`7@ :42hY)9 C >pTsx2$ -0"")AM9`k -pa DrT_jk QQ5;x3 XٜNʿ8>FH JA3MQ Տj=QxV[@E}=?z-[d#KQd28 Gju-!A鮞2Db-(Woxe6pV\Pw@Pew@Sx&aX!ùU -IΔtH,{@LZ]? 8 -tGqpjXҀ{OT \ 8R204GgEFk hՌ-,rঘ%uתhPH MGZK&d uxw>(Zg !'y -kQaNPoH -",ܴUl jBg) GY@[-B2j%id~bUHHVxz܍i@KS4#8Z?j/?8 Fwo $3{@ UmêD\ '@u\bʒMf9f<\!H -*N>ff#Gx0 uQ -Č -fuF*wGpXxA\#uDXq:9Y@DH)$R\e'T.|6.l!z` -PRҰȚ"*d -U@ c/XbyD%U?~N4e1z/3F`Ws;pݔz@F %X'&. ӬJm7tԆJZ~9(*OhNT/< HFhy?˂03<@%\@@{1$h9XreD,d 98/ˁ=@$Me}ܕ4b>cNYF[< L&2dsդ@wk! '<hLg -LXp g -Ab)Kš.jr20N8d`P{` -(IHD< } -q2!Q'5naqŪ-JEW p`_WLMo/vG g(j[SwRSF^Fte -)B›H x D: i<K*\N܃%eƔځ*D~WDN39`4bqE,`!uIhb9Yx!mVS%Fx ʚ r-Ϻ0?<Es'd4U@;)[ u0ꤷ9U\ 1& DdP(\op+@WI@s*_-`y -A7 -t+ !6jOVE*n}?y+VxPhNP楮FN`0CP -T5 S{ G1By% Šd# @wְ8= L^} =39A]׵g+ʑ+x/Z͘2bA\ZhCdiFD^ ܓPnB"r:Qh(J ,`P%=lWRC=W7~r4MUW="F [tpbuӋ/`j4ZBY%wHL t(sN{Aaqy[_Oh0Xi{Ffp"A5a*B>03n=i:]c {8լ.jZxicD4? n^da0DP - hTёi[xۜ#ha~ CA=&cM_24k6v^X?'K%\dkLBƊ(:҂R+4t.ZyimPV j'a)M544ig!UO9@]_yu}4eT3T M6Rc0 +~GG1l~m(:~!q:O`"H^̕D6h SD5"F*ΩU~RE9jkdd-qm 3cȷIK2`+&ä -X&*QˬJE%SN -aJ "LߘJVHEVh -\;՗١Yz8ފ| #ҫhfՂtP1@噑Mg+(ߗIPk /ɘ2ݙN -40 ^؅uWssA/ʩkШ]4dֲ، :_W34Cӌ7l9Ɩp,& pVT]$jelny'X[P$Up_|u~QYG\ * 3@E"b6 (HkX ՎT,QIUq23 ' ) i"]| N.GK~HzC44J&Z1Hr RTO !QG0 AH@bC](,f-/v ,U%Žb-K+;^. tB|@ -PJ*0z3KwH##H\e+- Oπ+!Lw"0d0!_;c;e`~ʲ5(r(?08s0bA>! e#Xً31(/UMpM3䄝{nI3@CO,O9 BsF_r*F=DZ -^ +de)`Oa XDtX:X00% A)Y~CdƒjB|r4iunT2;OeaԾ !j۔ٺg{/be I{70iM! i PnE({%R3څ؂lEZl = T0#+a,)w9VDSn@C8 :]pmcd~<e`jOu`$ ,BB*YjP4 :8 =&}"JB]c:Ea))*BE0l҇BPIWEͻܶLEto -̿uDTC44ּq[MoFc58M -V L]v,/ ❷EG6>*;6(8}u|Փ0/y9:@!2rp뮺Á*٧C<`00a .[~"+C2@sC9kꆊYBNk2UY> Ϸㅠ^#ٚh 4,:0 >KSTQ*Ҟ`#dU GBam%!2x T㢤W%`nD7_% `P6c -~Pbr$AԆ]&( -҆bT7$+TِX=̐9K - H.(l]v,7Z HylsProXvh\l.d?eYQU.A*# wp -m bsFNzxTdwE/f: `2y@௭g(H+ J$|O|cXHl>"ҪꥥW3\>,0A(G?vI]QPhiG)LN#Ձe0$ %"qHx̆ۡ'?"B2d9Zɣ0dX^uysS̀0-lpleȚlT:)/w8"ysi0V+{v$^At/Hi\0cl~ m|q6BX2Ey{r0<* 1SYn6kwD!0Ҁ0 hB,`w)Q""ORf`LXc1'&o`B\`*va" -2]sO"8o$@zYJhG>ڬ. @!-k*˛ woe_um0.ԊDkP;x G!2?TCBUj/Ha@:FXwLGI]R8W:G)Eb&z#`WŢp\ dgf%4,^/ C j;@[`PU)R}e>Vc V>Ĩ \3.uZ2"%Bad]ϴ.2„D~HRms;zCtk->ՠ5 -Yu%bH >kR(X[%' I -"%A0 B t8tl3|L%Hf}CMI;[p4j)~xkqw=yFeQ ^|0} -{`#cABvEk=ј%C||jȫr-AYAEGjD Ө2qP+JXh/*grຢ T24ސ0uGCe6/|pA=LA7+! -!\䏫".zǂUI9pr!`EƠi;5vx"u8=$:b7;[Q@<^kp"`g! jS9I B0f"єSA"fp$o_}PLfW))?ڿ`R}+f5Cn?lX(4x<҆`+7E=dh  o<{sp^be(h@& -l-qy6Xl@$sw Ap$'{F6CH@D&j1 -ld_>_`ɞ`L791]UWh)C\c3B( p#b 65o~UR$H͒}4 6A){pPjӕƆxC$JJ:}G16S(9A2zghݛ r5HӼ'8r=%WW8T^TkVP ˟&J*b؜ CR@pTr-%u(uh8D հB -+0l!P+2Db1L:¢/~shi2*x)rcBC5 Du苪 -es`V6Obܴk`P['z{pt ]`7"e Ɇ:udbDB!'@=qRC̉hN`VzɃ HeM'+I,&+1A$DͼO˚Dʹ_P>&kWDtk->},~Y>}.Ygϯ-F۝%Rp~w5s?("5.Q6%C4MN6#Ƌ!| - =! !XfR6.l >\|ܼxa -9)3=9}v$vc.J 5;QX(#8&tJ>`5)+VhJV -x(C`(^H Zl͑ rrTyϬ <`A^&Ph֐*`1He#wjXsJIѠieŗ}y97I_=&+{%R$T#/K@ iGGgtJ -j3Uβe%l!J74lIDSE89eCYʚUJx' 9|YL>qdTyu,ܥW|!I'KTfS9ԖjMd3V]@y A "`VA~0HY/8U c -̰(N\遞G!H.OAنRJ1-fѧ4v{AM51J@d_(;d?` Ft517SHl[ -,н",εOC!W&@p.#pc%OSW*Ϛ{{4۵_= ,2FXZDVIp4?#x. }S期AF5a&^qP0jJa%g IW F9|Sa F1zMȬ^"&E;Q`tt7ƑF%e6#3 Ȗ`oGL2,N%d7tL - e -m{? $Iy  !@a#>לWH?37C|ϿWޘ/~~{kLQ 1f%& ASޅG՜]DgH U'6{;|:Ih.4Ё (]z\ ?? Fp#[B7`ʄf*^@gH Ah{18@@A:\Dd t 2bwAMO&uwCn4H WJb&2Drp|(OfOxWk[, ,k8@d *w$xfS&?v0j4U2ܑ* JH -x7d zK1p`%F1{B>/"<)TA1 ;‘+[jl-) rh<=CR=SwLB@BN Um2RzD@2NXZq Uy14VAdRl Q[iOg4DgWxvoH +hD!7 -3>eW|C-\)҇B -G -b&nu ! %8+)wCpԅJ?RӠҸf)"YښxWl3  AL9-}C(ds7c-F; Cx 7 zX2XZ֯ !;2]. (%yW b?V࡚!-A+Vi ,Vk)H[RI9FlD^X'˔xfʱX\Benu: 20;Ÿ*SEXw>JA9n}NTbq6 0_f.` -`JC#}x_7}+zu#eR),pQA& ,R(|)#( dzD$L1vЦޠK@I4 i֖ȃ+?~fߜ_>}?~bE1JS߮ - hGJFC?X&FH /Su]Fi`SX!Ҳ.sUC-0wzEy'! 3AL /x!l@/)Rvs -bU Ʋā@ aq3H#䃵]zFNPP-a\f:!V[ \P,C({d-z@rNq)A"0o9dްC2y:`N3-[R]`Οn^ݯFwj^+0AJ5t %Y7Nlf;򯃓a)ESKTY`v ;$&}HUSV`a4Ja6Xhsr;@jJ,l5,0?e -sS@bwNe9HMQG0, 6#p_4 &`̗1w<As aAE"f=A,!bVZ,9Cț`\+#qJDkg벅<ֆJRD`K֡wD[Skh -45 -gq v%jRp-dˊ:=\{*ŗ?p#AE6QFHKs3%WD2M ճ̇s55FE@7at^^TSUEE/P@>n6$8:џi -K8k^j?ӂfpPޝaniB+\)Q*` qh̓`Ў@-1L!`nBVKDQ]#(upZG庀XWS(".UYqtNP'z|t`W<hY BJePK Jkn_22"ܸ;A#6y~@Z"F@#JYHbmMjaD8)mpwz:JG395;xSB#]=U|)@I(%U>&£P5`LLg]>> -A>H"d|`+{ XEE=p5뇼)6{M7gOr爰/h_k!;\i uI]d 8dz÷@jt`)QC\ 5Srzϼ #j9g3 Ӥ:r#\)]Ǭ6QV,Ul=jqC m7ܡo +iHGJ6Y49oA/ hw20{p>azyäuWyZ& ԳN,E\H L N4|4BEWwolD*ϞqIQ67 &c)0l Ş@69Wŕ]N\Vح -Mdb(2 -6 -pv"!N`F +2JQhb<$6Eʹ(dCA"ѵTܣnacR!ɀuHàoܥ]%*df&("+?Zt9Dzꀫf0$nrIo\dB +lƌ>"ԂϬ)TK0(JY2T)%; ѓ?$w`9XAq$2aH#L̂纫2*j x0 yΪ'$axL G0AQFe<l rXyfevOrhp}ڑ1ez;D&7UUUUWۀ$#n`AD`[,j#sRL9i -2`J3-Ŏ\- ?Ö||MCʰG7<vѴ!pBZ\=-[3 Ps\(`8GM1ZQ"CCr˔%QXSh9ג B5!JAMS # Ud@^p^*ӴH[7  %械=MM6R ,kv=[?hq*[CWe%H0BIwTڍ;Op! -++v\j0{s+/φ2+dh2 `6ĞDgs5 f D ItTrhCR]C`H H %g2@` Hc?2R! PL`dj'}s@P`X}1 -Bt%A/g!@˼&a/",1Hh 1\@sNNe3(%z|m6#Fc. I!9 .gG{_NDrPfVrBž\2z1Omj"b =Q!0ք'S4[@w|*7KhЁ6x'wZ$59@hxDHZpjr^d bhB0jʹ)d6W7!Cp7D죡P:0LCA2t>ϿX z)KoXlAɂnDLdНzFm-&<&H-oaYsoQUm LMa*sHiUQ,8wF;KEUo'&jmW_ҵ{BTjKfJFB5e/cF+0 艹/;,Y4d -#P|,I'| .)cLgBHN{C`4"sX - H|ǪtеOZƥM29a/?H Xp-[ vTpBKZCf "`{KO/rL%S? 0Ϭ -#hCC8YtEĪSt1I!tNOBRe10nL4hD+?!D$D7FV/ёHEB7h{9B`GW=z7父O^W" .^R 'S̿|B ,H*< eJ0~ 24#PQ)Jse0<]dX! mZaq9x8UԮ\3IK8kbP(HQ#Abe2n\oHdJ)DtieU]42nt<\!'(np -ÕT/Qw &pp" = E"~hmdBC н$0tN2z`x{`pWb*pKm FUL#-> :6 |w;,n8N &hʗq+ɼyN~4wJЅ6]\t)絁PB4γxl -b60{(,%AÏGg -W|,e10Vpք {| հ=f. X0[wޘ -<DhEBJ@|Z!"MQ b;,`j`AA’"mIeCtJq x#5"6 ,vf [&XTÉicIAF.Imt=GjF8)o -E%nQ{T6`Xf62Mݘ[# 3hl]Jj#d,)0a-+Q ̎yq-R^P* (J`-2NR~ ҙ}e, N-!)9!.GSN@s3$.5!()eW*Pف@T3ᢗHk|β6\.ΤUi#sTF0` Pm{+38ṵkp_Qܡ eë{6d&"xi^HpC:)6^Yv;8{A.-7ZvSK`6Sb1S X|;I~KBl<ɫ@S3rX"R}:]{^) a&s" 7Tk GCY&X1ͤ{A&`d뮐PҲC@+û?L$ 82p#K!Ͻfi/m4Ƴ2v=HЏS+ץv6^+=5=]7#Pͫ}pjr1å#\U؉ CvB{L`W"4? 9mZ*ejdq TF-3`)-AA)]p -Ǵj}ޛIoL)z M%^盜$pG}`XA]a`a&`r6 - L` S(ŒV83 t 6! *$np OH_T15Y"Q:3jy?XWWqH ς^RgY{rA)Ѱ䠗R@%050(!4%u ' `כwU}rX*rwȆD9Y3K\jz>' ԃ8a: NѠ[p{EdpmˌՆn BmbohYS"F)G#dl_j#ac(_zڹ=A)&xz)XCVHvqMAi՗vwehV=Pe p VSxMdBt4j6Z"֖6NbYCYQ42Ceҙ"ZPWS30R0 -ʷ( +3:a@4H#~ɵO -l0 ɀV$ozQ-,.`8LqGr,^AAY0b,b%Ƕ9Z=A|,sXآ ,nTreԬҲ7lG”Wcr I N - -Dz$Z) CN<c3zB֣$%- d!@k".YUl)L"89ۏ'9S¸j`\F41w0P*^sG`-e"q~\CX̏KNh2! (#MH7Yڌ{b8EaX5ª"QFհo 'x0҄/<=Ȃ[&:R%X U NmyyKp*LT"8S2a@\+|e% ~t_t! %5YZh{W;vhNwo"6Ql;!# :&JSJnL2r"I<;cl>pE#԰O+[NfE7iwp<6=)FS#":v2Vmsb xdsNfW&n|,A w !uT퉨¦rۘd`_> -c I*"VpQ^Xճ̕Cۓh=w1:+430Tџ 2bWcU)eS'ɗ! נwXE>Q0- ЎyYg<\X4X9`qj6Vsx _,fddM]dC(`=1V;k.E$*wTL /a4JP[UϴHEbcGC(8٩Sӂ|ʹ4 jN `ZuV*Pq$M- Ȁ -h ژ-;;;F:}/("c~ m -i3` 0 z2E*{WQ+e?RS@[v@Yc <'H-)R/eyzD?_ȬQ.l:`N&(ZfB,7hA߇:ҧ'^Rz{'>xefZXA/.$M\#"AW;Mt|D7C02@ND% K"o6KQ)މ6@Ƹ~]93X}@6ve%O:>55q!ȗhuWS ۘ0?6Pm)[".yӟ 0ek87`%!f - $YGǞx -!lzhQⲟ\kVf$)مΞ4D#`yu$1|_ z`$-Qp#=ݣ g,(hɑ|ÁDQ114Br ) s2H)X,DP -7P汤 %~063s NدvV,40v$#0eD nf *(EG]0k* dUpU J9Ϩe -‼Js#uv\ri0 #0YP,8D9FR[}U 8"&c TVQx*&᭳z?f=D@0b }oAj3~Q @:fdB9(n˽v ʼCradUl4PҎ-yyCta7re(XQhdw8q}m{(Ce@dr UT*Uz2 feT>:"4Ў (t%T#Ԣ׫Rf'81VCAR+V\+ ;~TQʆ,|Ʃ  QhA!*VA/&.2rP@A/H.>OeWc,ƍ\Q(Hb -!qWǬՌ (A%\\֢ILnfR;c=08fzC%yޔc3 -s0 KW;04uJO8R_& $7J^a!:fl;o,.LyXiʕR cpK -2ҷ;{",XMVzǂAa\McExg #Vp #4`m<"K,L%)/,E(ϟRՀ%[dLjğf4G7_L5jH&P5[ -hJ#H.hlX&WtAxfǼ0VBBy;{99FDyԂϬ~'sΟG -Âht 9JH'U MՓ)LB ?e,8`dw4#D!ЬH/N+ "=ڤ=& > z8>TOVY_xAvf) R7.Ii9Nڙ,~ Ԑ)NQHvLFm^[ɝ!S(GXc,BgF^If$YMd|42}LmkJ 8 -'yx3}"D5W 홀ȕzxSҫ ^T4 b:?SW0npZm;/!x ,Rz k:j#!a8kPCp+h -3Q`gD{ M(H C]U(SF.T{LMψ3 lwۣLDP<$CĢtFd3_ :pcc}>+6>#o=`oBpA[62R4}ExrUi+1T#bmZR!P=Cc ː#,Sz>4AĮ/Tlf"\A]I ZLHꄉm7E5ƫ暸uP'MTwζG#w% *PEGϑ|F0.D)xO _E X\י3E}ސu傿 ÜasRwY͇iW@X)mia`Fxl00fTg/Nj+汅 /P10PGc CxNXG,2PЈ^G:,r R X C`$d6sGD04dɴ#sɐ{h%uIwƧ&9[n^qo+_2B;ZOD3F[ * A׽J,PЗ^߄pQ:A0(,ϤU#P`3WC":X $ - W0֜l`[Qu40K*-[!P*AP8^;JG9#iը"CF<O!iyLFu'C9 sZ*U?nPf|7H8&"-G` -`"da?a`\&Tg[6$ðYU-tx{:B A&Vv)rQ -#8L`Dh<pkq!RNg\a3`T@ NDzP"ZL%0LAii2`jއ' -+dMLrMF]0:ȄOk SK<:ʌ>&=A;(K$l -- -TbzKS F։&ʳx: kv󚑸= F3 - -] IpёŪi> .>urF'Z};Ɓ:6UYAEDh CTe2 =2x*3+A"Rp|oVT}"]:cf(Ɣ<RDZȘMHJcsP Ij*urEA[d:W='ĿR>  OIPԨAD|B&*\ ϔ5d/,/lt,(yǬ1)@YEa*&K eB8$(tosnFkĈ=`ڞkDA/VXG3"?XxgGQP -*Al"DI~HĮX3V#΢"91/ Śݡp1%1`-S n+JDBX"=Z%u¼wQ04ԎP!X Bf%kx/bn552tP!D<BPLAg+-jbQ"KqD͍1b7*xL4#ULytQ] EKho(a-5 foC24T%("t$3럙d.kux2,2J1CpwCj c:)7I<K -["0}}$̤ 0Hh5YS &i~0l.h3Zg#_T{Ft;V¬T=9q>5o`;7@lB P }A - Ģ}=f,BhQW]b2% -J3+B.QǫzBn MlS4CR62LQ΁o4T’~9,5Q:LjS6i8"52#`!9e^~RumhBcaǯ׀Q9lo- Yr rhvRΉFKM SX8FH*PuOۓA³]S@j6e -XOud9A -$B2dQ8h'iC&0@-$Jz1GxI!Æxbr8MEcl"Ҫ#%NsDltb(xi_ éH|%ҋ¶F 7u2 B-0죢TDfPp@j@jWS SмS4#qX*{X*_h)S,Zm*U6yIi6xl̨#R:,'p A w QBS.tx&_*BW`:yВ#DԂGAh=KQp${?2$?!Z@^bIK 6_& 9 %lx@cVjlCpә;eznp%jqX="d0F-,a]&o@÷02/715 GJeH%x.wkDgh4B+i#c;*!K *0wMK -Rz(Eâ ֦ZH!`@E=i)Sp)4W0Kh+6A& z0[ nO7ZO!ǀVC{3!-!O(a3*4͒G4!YL|3'OiSxg.8ld' H,@]Dn>n63bP(#U߲}%,2 !Ly#ׄ~l/Yf pY\AE̢Z0u1|+RĎQCM6x*g6};Ǽ|Np(`Ksa~rv*`O`Jϐ 6L&aPZȈ~!O# @0ZC8S<dćPC;Hdꨮ32i-D o`pV -BT:W`D 1L„.hsXc8+\77IA4w{%πu#MñmaYdHxj~1 CH^o\Bu Rܳ%OV HcmA84OW%,l$-N*v &҇ ]~y@{<BzG1C7X>8,E~Q$>"OهZICg > ԁLjZ)^"PoH=,,=b5AuFE [(xܥ`: -~i'>A0 0nxH+s-Gk?C -l;0lTP%R-$Ul!># -pB2'( Pyp{,X6B|-f۬hA s92 yEAYaU=% (1 +QrfF7" E9hx p4,6".S&)|`%xS8=p1e}& [񙚀 -?H^X@>@3Q? -#QQ}Z -Y!{ -wC8{ -FOL -k5Ӳ`MC##`5I`8.YE5 Hz )mr:`:(ĈY8!p5*2S2Z3uTf $P2uRґ,J! ~\2QXI-J*<1и䃺uw S>)V@HJr/p{jdy`VT!-{Bz@>`n`ఌC). -afjwI -fed`Dd€X7 -D9IF3&Py]a:JL$P aS!]#.{ &H 2_OibQ<.#!Cu -cҘ1Vq C`@lYC03T7:?%hC$ތGX()]N[^Ċ(F8VӋ@F0>+(0R ]s"񭚗 Hrsׁ->& e_X2dvr0)|Z*L6rVt:EhDQFR)Z\&3suFmdy(BQ20F#YbaR>J0a%TZ>xm[Bb$,@X3 2 -s+ogX-R ?-BuOd8aUB%؃zi7saBYϹDmP?b=g0N. - QEs`f&۬ 뤇o h F˧7 tυ`s.  }`K`IMAđ0 -^(,p ?e(!U!|A:b4׭0]jR~)z;mX UT|@bD,H& `Zrr@QC +u@^ - Iz4nK5Oge`j3Z R^TTdEkAǘN@@+nD (`pI#F&d0HP=@.L=ׅA*Ȅ(r6:>Y>J5u;8 -XfVbY"h/09v 2d`Ys3#;AGh&y\ - e0 .eV]͟Rܭp]„Y` E'ᕻE"b<"xr/qzڀP@pi3_ -.toX|*1 -p3$CKРܑ2,V&I5??Ǿu°  7Gΰ # *=p`XJ!PV6X"-0g&x*M.x;^Hэ $^xP|HN5T a.Tvql8[\GVߪa#nP|l1SSnAtIhT@$9Uȱ5x(eX$519G HBW$EPVq$5yLXs<~A\hƆdzaQ~0c.51yCM!E۱0$=sg@X1B=q ($h-uq ēKtT`QĭR R0p3 -P%GK"A貛1'Mf*WNkA( (I\U5w>RTb }2LfƇዖǎ -B R7† c'D Pp1%*,2j9ݵ$axVK -9glm4gS80?40P&bY 7Kx][jp` Y!\G*.ŜB#߀9(>֢<k,$s7vUe@7 -(CEuk1rd}]*הs:#hu@0ikIS_rשCa5i$ @ƅ񦪇H)V5b83+Z'X+@C  ,uMhJWT>|_2BU+wA3V%JW%W ϐp5tjOEnF+OG{Pț*Ma1e0nd܆Q7Գ̘8)ϓ_iw|\$hB,x=ˆ Yв,/1<G2l+3eH1A8S+~?Vi/BYE+|JeB>=h -G-aq*Y|CMy #Idnv.+/E\ DE!~JxfAYe hЈ q -.e=%;@5afW;Hd GOVf}qX25S,Zs$|aж̝v7դe[&"$BFƞ[AV-%Ɏx9 J<̲ kE@o v afWD8 (D@ yG -n`3j#/,C2u @g8b.]I -:G9]б Ec,.JdTDA`&Q -ih\ Ed)1iBlpIM= l (1 V<.REOi\<rJE(XUGe NE9h!XpB-ʇsRW$0@+x%xw`R,RF}Պ@aP NV(~xBJKQc`s+JB2. -@`FU9a}U:.`yĖ x׷2הy<:T|5V -W5C8ӒL(b]M$%wp36z䂣,ap hZ!:ep)PDzMV?{O9 ŀI.lΰ[bIy8=WЀŀ,xA?yb[!T%f(D,8 Ҡ -'VW@ O:b%'*`B@ DD5tHbo  - .`v0Q #4 &^Ӧz1ԵFv@G\ے4;t=Hb/3A7NQtt6,hq+v3َy`5T!Ce:a:NQ8йۗQ\; aXsQBt\2$t , $yNP1c0p"ؔU!u;_B _5 ><XSpU'# [|%7rv\<%pGhb3hXtopSv,% *g 5qx ig #NX]"SXhb20h,1(yC 2IfP(` 0$rE_"@#X@!>@ 0"=D -߭% G&.WPH};6''xu>08s#47!uѸX*3*(u;p4àW"yJAA5a;|L 㤥8T`?t#E"bPޤL-!1AQaq 0@P`p? a{]1iQQuԷ%O9)daf(EIF cEVPn );&{}r.\+\K@bw"̿3xayqw)&YG0  +H\{%d#%2;6KѻA=mhk"DI[HGƐQ\]02`hd-R|/W SqwϪ8l@CGʀ{a%Idt:t*o73c-~5@}qܾ=0,չsb=$_Tu~і݂U̖N9IK{KXKLD.|x=fE]KԆg9I#WdabƽHԇv2B :`>X%Si,@Y[ivOށwp|l>lW*@%{Yb3sdjh.=b+a!ֳ=ۢ:(lOR ѯ~kD)E7=v+M|) `GtI&*{WxB"? +f1wIgc *KYbQu}[89ȡ -*Y J̐[Dܵ7RE6b%Y݅'C%ڈ[g0\pLKW-w6qqZ L'հULx늎rE0z"Af`UHp{1c,Bk - s 1qU5h-IT2&@*9 +h3@7 ST,͡ꃜ&&Ti6X[rDmj!GaELKrXBć櫥HwpsnEAfK ,P/C)BIE.G4ā4R7y–I7?n:oOM%D_1M*W=?3g | ?7~ -xKG>F)}Mqk - BiΊ;'ǟ^+HohϽާ|^ O݊GyCg^܇W -[0`$SԉxMIOc0"IObdbzsQ}M kơbTu2ԤXi+qx;tD ̲s%kg#$r.m2uzscnSK;s-%aѦq RغKr[UHRL)!kQ>*-+s' ;R |_G#j* V @wǠÂ֭b -_PFU% 85긝m|@HWYaMghxSB0quF`:!剮ʋY3E޽n:uQoKkwIga51[paV)*4`k 1r9Վbe6MKbq -[֐󁀔D_%_И:} `{V#[(@KOGc7/-|4c!;}7Je7 x7\k$Cd}N_i5K!R>JcBkcVO}g@(9~ZqT+$G43>E;5'(Bl] -w,>jMs݁N؆Z^}8I֬#/a qX.렲OeMmu"h"@ /n"LANUca]AHT֍ߝ(; - z{-2mKDn֚F}:7U#/LE -f!jX{?9dH( -&v-_l#nD;„ʂɼ0C;9aoqf'6*/V">ߙUKdq+/3ZkпRt(>v e3.9pEO Pg=|8k4x9}J|rKc8틧?/A1-X(6Ea ̕| *#~)R `s5vd,F[\cmjam*f&ꉰ~vM_&%b|WIO| Ip,=,Ca(,'$%vN[n9 ߱>v#f ^,fcT^|uloJEހ+! 8=jgsQ4:KѸ*[xh_̥ *Ѣׯ; z9'jf%A}/.FzJ\@`E x41B(b@Ů?Pb neו-⹃Z=X;4Bt&ͼк@w{qo~#;+rTm[P@ b~AA?8`RU/'b<2ҭ DǵnZ_+"΃^F~hA7"jh A6ν ˬw%4l؁k'TwyzyDXHg_T]"xC-hu~vwuN(_y, hclyleI% QHWƲ#oR=Vt&V;'(|O$n:]{B -gtfcQ?ҏWdc.$/T@9O }rfPm5ۃ^NSb[7أkmCh-{RS^|񗇠86>hlá{d.UGн͗4*w=pGNFbz0(%u_hA撝I67t+ aG.i&]^5h Jt%ل²0r&Z4Xo%hM&޴7TA?ܫ7լ])&7k 5ZQfQZtxbv#7\xwy=W"_0 <%;͛tk)9̌ iʎP|:&D@3bЩ;]SOx;|"Z1 #2M?6WJ2bYC7j> r-cp_RBL\K:UloMO\kd=!prRJq.SVIUÝ!}쏯@_*z<,Ai'+7Q6( -Gn/E{7.}tVyoBW%Q!Q ؍ gG6h0EAK*3㪧u2צpf`tv]ILc>x%Ua[jK3 h`^KܬQ fG -]YkysW1} BkYH -u,1)(j4~7),1OȬ""OՌPh^;3^ |Ψ#FԮi'Qݤt,"Y0 Kt,[LE怍u&t<(,F  :̚ >0V/$S}PRQ&j_LsfD%k-JG sḄ7ňVo‹)DeR [EK+mw'bȌG_F)Ѽkִ~VJeUnŕח3mus5x"p1'/vcnD/f676B֥mzDFGVcl*xJܑ0I[6 i'kZ?}c:O|*.ѣ/{)REoAu%HQ=9,,VtO -n 1\{  Ь@܇im愎N$H[X#',jm>:w1iD] vtEQeO8Yze NR:( -\1d;|k'#Ab@J#QƇ"ca_hI.˅eۡC=(CLI@@"T%˴Wj%gEǶ%߅($6,Â/b݌#mľVXiiHU#c(ii^+7;B|[z<؋}_`L?xdYv3IL -D CX놋_Sv>d\T -֒ӉN~޵{:Do}WR?.~p@%_d;^`(N+LBoBvfۮw*9 /ֻ^U.˗muqvSg;,QYpDT5ǒ<2Mr?͞¿QPJ3pil1j9wK@R BU9bUGn'XR־U^f,30"v4u2n<:Q\Kc4{ּE -٢,;H P6_ UZ4Y?H1$S"<]pR&)_ضAEg-&%T%(P59bP[Dz# 8O PgkxtGlH_ B :" oTFn?3+_gXM.ņm%!3u -י&k*c` -ь{7(ltid)Fȥ "mD>,ySuaO@@Κd3W>c#r\JY54QKՠ2mzyPGd^ -v$h5h3c sp9vV!{ A?HY X~'[RHDb߽p$)L|Bc+VJa@~~R{u;1 D֣ynm~hXE%!ե\h`yDPnD G4hNq_%KMݭ{hg9Ǭ6%p m=E1.<MKEv^Р/CKP975 Ælyȵ%L,ww6zNcj|qX Ji-p4~ei dVjgn{J 3fOՅxa/,U_'8qH4DKJgJadG_>QُDd#>Q7EjܦEqLTlm:ڴv0МdY-꽑ۙ@càKr;Z,3 X5+:CU1bIes hUkvvn P0!jL!vm0REe߰ j@K0BlhqЉ=i(KÎ#<A*~h2[*"n:<PpX -p>f1/L2%5t\c[/ x -yepOU0bY[_; *."D#Еy@#)&jREVRsQv +3z9~v@1u7S @G"1tTUzأ?ƨsN8F|d]{s.<4A340O#C);sN^[#y fdD)F -.#PBf6NRCRvOet bxuW -|vˤ?ɥ`]wq'kO'ˢ}bUr,x<|.i0#'G1YAߥ,6F\{6ח|I  ;PL A?l-T44nk6X`GA}DƁnVgs.ŁsH(A?N-{BDo⮴͛w(PxO_AS 4u]~@Ue""f4w 1 JEgŘؑ`KtV3w]9V=՚`: -DW"3hYz7 6mIRB'm|U+!r}]-!y tfEHy\F*G!z3Tbbp4]ab^Em{qqp@78ak@?}AWذFDC8Ŀ/"3hAa45k(N~J"]tIA/yڇ/2-8*_ܢ7;S FI1*eԧZ -|覾B>ю]1:?tJO70z] wgx*}SJFՏnfgI!Wd28d #\%] s '->qbAsͫ͟S0@8m$фyΜ -K5'鍫&|bLRv"7ݐD٤71v]WIʑtN7+\b")JGO(l*¡@]鏜` O9&x-yQaAԏA|ٳ .'kAWZVm|> zRpkkVO9k L`65 Pl?\K -~_s9ZgUs@kA1*(fb,>`(  ^2%wD"{ ӳ)Ho W}K^hwbꊺEzs؋fi >w[lbM90&bsCXL&.tˬ 'C&*ЁjPC!rZK7/0w -oB͟𺲀Sigy֨~aIz Ky8FmO("?YG"_:{aѦ;b\'FFv7*W -9P taf*?6b*uo=&A0a6V*?lerDȫ RP&6O i\BpqOVfrI{7rtf׷ 4/NEefׯ̎mk (=9qY!;EAg($/RSJFE6FBPAsZy(OLy Y~ij #-_hF\wDRlWѩXK Yso+M1Jݖ]P}Ũ'q1;;r0b CXI~tq:ل2*:&º#0 -/fptI.Rsءw;7Xf (n {1X)*fNJ*H:ٸ'PHzv7kCcqabV=* f}Kp5  7j-lcؐ53>˶x^K1(`hi)/.~sr$J}h:U.B!EԪ#H \Yxr2;̿ŨU%6+#DvFo)ÙK%OD_mmCڋSY6mb%T,1rV!tIqEgۉCکGdBr+0qHݤ1(;^Sfd%rNuE9CV0hr\)/yZ*'( ZU\Fcst^d+B ~ X_HQ%B skyxDb FX(.)EێLyXn Or2?%BMıDddG8nџu.n>kAHnMWb 6iI@laE}HJp#@W+IpW譽~ vvKp&Z}~PŜGUox -]Ϭ%T%4_:]8"[@|r*7'茢S?̩ieFJx[=TrȜghzɞ,MT2gV}8+FID6]AB(A -h5iȟsUT-)_Ɨҟ)1,k|?L}2PK(?+m]pH;>fFd&3ܟ[䬖K7h, f|7= FջҰlj񲰜'a9H-J/u]X)dCk c&U8/v>z/@r=M/]Hu\FES~$7t -->cPՈm - !B^~l W NfmRpm; TۏWhautL, A.Z)xIVe[֩= (Q>+.m)$ٿV," -тgLF3[YE|f\Xpc|< RQssh_Eԓ*/g\+j$7zmuBEʉ#gӆߢͽG4w4$ܰhjul K6F^WE~R)JN"BkZ -D!wpSXGxʇg] 9{ǰbEhJmDLR\3k/;.&8D^k˭K/[y0` `n.w@ pRA@ vef] -?A8Be @0|$[bxOO @h`:MıgfeU xPf9|:4ƃlۣ8,wXۑ@D{PeY< dwۊ:j*U:r]mShnTUUiC߻|IR,HsIӘz`w*zw<}udTnr/ihh&8u;76kS{A9ћx蘧}*Dv8P9Gr f5pv?6VYQ5P݂;19%nJPLJ D2$/J3'IM&Q1w-$Y/*D׫#z`[Tzm|գo"s~ g]+⇻(MN1m`-ͪ}2Ie`AwgQhCZujVWSN+̯K[# {1X& Y{6|wVIJZ3$ :eNDPU$;QoOۡC"{ -mɱ'@d˨MrÍ W7zօ@@{<'S[J漗DXEBD,HhT/3kJ%x;@0`U(Kh%֯w\nP&dXv*Er*l+!'m6RRr!.fCf ѷ KVN.wi9snq!rW~qB'H]ϼl$&,[OζHUҒs?ҿ2:7+w2F\KpVokZ*b. -aGI5i~f:^7lȂG4;1EضEҐHyt|Y (laXI }Kǯm_>w:^ÚWyв:7{7STxp|b,^xYH5= Əyku =S]11PpmU@;_=/X)<2ybxƂlqia_1p-$$E9gHdV;BdPH~ݙ!|7*2T|zHh%CAC8L6{=',}_R_A/ `-@QHfs]!_7E: w&X)`ݘևv_aTD-0"@lz]-+(LѩPK`}5åF Z~#%2"4 E*!/8ToW#PiGY -4 -aD!X/KTRt,w_C: o.)o}Rvo\L -**y*6j 7?:f62p?3~(ݻ޲`, ~t2!#Pcܸ)!tVݣoH2; :{qﲱkמą$(5cuۥߚD`lo(}3|+awVhlynÛ"szhN\b=dy?KDq+!7_HpOlQ9`CQM5+qhc;gGU 6 b_F;|y:SޯҹǶ!vR$"ˉh -]s6Lڕ]5ߢ )ԢzS^Ss.O&K`7v;V=i> rJ2 -Av~05N5cbZpZ֊ᵱ O'HDZ1=B=JC*~ -dv6u -ZGdjIـ^jo,P+ya`)`k֙yXd@DVIW&|QbdG{'uVΗ}W`B*l;~'VP$<%' daTw'WW4~?Ӹ;Z?f?nܽo}_lj@:3e҇uM .o`Agj`(}K N %xDhPzj[p7C^?̃jZ%%^x#J`ʊΪ4"~Uxe}qۻ~ה3 -1 nˣuWt6ЭTYO{+=9?xV"2 -Xۢǖ;2UX .ZKGyP7Xo9O<=dYxQ`#Щ -1*Rg{,rҳBZx" & jw>O!huSDMq3, -t>h݄;C;rK0 -YT=RͿK8-FaEDY5] ƍ^C_a)4z)VN%{FFxp:Ê9#PGLyKoѳ z}ϝ/ s_o*#axX<ZP &x1fQ* T݋[r˴6k!5Uz 3fO6Bҗ_|ވS;v˶1xxRm>Ѓ -bXB Yi`j[܄ 9D #b y-< (fo+Ҷ&|͏,Ǿ#{"Yce&mW)4Tf`'ۥKN¨I=pmu/-s=My[媡AN5M7m"AMb#T( -6CSmvd'sTZ3nz/F(E? ks^J~jZzU-] ~a0TX؁?zuu(b `DhH -27T@6R[asVwcamĥ`ZЂvnjjK rTrgз_<}2(o@c8'`#5,_C ~ƐؾAB\ʯ? y5}Q26xҙ>st򬷩7?G#2_?R1;KwKc;m'_j=SʲC#l: ]1Ko1u+˥meP¬MZ]BY(M-yuȂX;`g 3yAϿ@ ٿa\x?0r=jAjʃOnd8ovW͒مBp+}x*`gW:hAU.^kVq_.RbP`ثb?4^;G'mDФH0&k՗b/=J]Y -vȤpҋXk ʹv[an=2ʮ7tQ]tަ?X-L_}䔼-E -#Hi;tvZA[pl8)]٠ U53!Z\in g2wn~rU!NGwF?vS^]ؾ6%L,?Ae`?ʿq@] - RRZ6Xp LOlݰIKvDzrT޷Mʵ&<$>Gr#~LD~#[z/67{βz낏XO(x,>hS/f ,"U +>xn*~hGhz$~oVrH6͍ݔ_b@Zo\>mrGvo??Y~O|plфM+n{lw=׌[ -Kq*b Q=srehDHHMn,O[hW ~>K>ۚC|Fⷙ<֭il?;bu HjOg$d8c=BOM!Ϝˤ-Y[eh5] wu=5{BE18kD%捔U ?)P)&W݈GY|{6u\Kd <#6N @""Xśe qGX`d4+NYJTyi^_ú2d}RRGW #҅t/Yc\̉'Y^`7~FrL -0$I B('󴮞-û ,(l4ZݕGh2v+Tc$݌Yb -heǖ- +GcyZhEۻ|ΘQ"qC&&J -t.GzԐl+eS_3J^_{3v mRe (>h!YjQi)9RՁCvܠ` -!0 kGbݽ X{hC]eR?L j] H3sm{V;~vSeX7#!œÔ'XS E2/I"EfE[^sTf$,"= B -` 7  %*,Hev.=a^.g[ ;|?KFOJ\aq_̮#x:{J Nū D6gsYLDiH}1ۜ2yb#Ua& j-.X9y5 N?U' IwEqS2w (ɬfhjHqm%%=)W`6[Ÿu^<'TP#Wzz6c 1X L ˜\61pߚywDf)X& Xn}π: Z՗-ώCd*-+ʁTeMc 4CZhYvO P3 SQiYȹe]x 'DIoR&͊{'ngWU/~l8mS.l1crF&4_YB(aa6 ?wm_4А -Jap -hdja&2nWFk(>hPgy#;_q|UϞ.BAGQ ;uCFzw*B?KZ+-l"Sm|ݒҾ.P?׶\:g*>eUqWOWF Tyl)6ZQKzE@@"S:Jg!j-U@]^]:Q𵯆BߣE?zڳ&TnkcP"䨯SajǮd9bxd8+gB 0{hu!>Ѐi,%\~>rό^g?[rbwgLcvhLeDK -3}{Xo=w.f} V[o+갵Tˁ~JD&K/C -p-ֻuJqH}2p\S2ږʆ!-:ۚxv)=-ᢽUXTwI)5"J) I,e6 .Г;XOl'Y]~@p!:$quPPT?<2n%I`l)kxhظ6&tⳝ|u%~}Ԋ{Y$in]eg?ԗQʫ+n("NT 6 3W}w-3`P!H|M*k!CE&tJPNIJ.'U5}.dz`8QM琎vj _%jQCy2x a?ŶWrD4>(*xbTw vHQ<J]TW6YtAv4o1?Iuxffd"ZdPF^8CBr{2du,0?| ~URh;y3?|xRJBU锞Owkg+~&Ϗ'w-cE@_ Qal%֏ǃjY]l;KUb% rO[QLx,S7ׁ#Y!aLL!ҥ1y aw_$&8 e5·;"AT0x@`1`s򌛵vL|[$EpYO;\@z`^#KNk]]iGJ 淚 i4PkW>oΞǪmؠz99y^Ī%n.?_7Cf9SQ!p[!e8A\WujnV?3hۨcPt#V='ѹ[[AՐ( / =au6]&s -fB -;"?ᔩyߝdʿ&WJ'ܤR~#21z1c~b/HHSKה鶓g75w'&?bK~/BTR=@'^YQՂ=G22Tw/ܐ%=o ӔoG=&}Ag((Ĩ{ -X"25BSkӳr-qYHoJ7"뇍 byqB*EY7KLt}V60SB4l\`JS5v=T'nonJҸ8F@U&3ݏL KLd\B~йl2Ա"Ih Dݬ+NM᧲Q3~7=_L,#Umܼϯ(yI۷GwIiSCdN}3;=?Jg%(Mw -ү$~Tt<;0~E"1LIBLKvcQOM:_h{O(&""z%QWE-nBmo[Ĕj)bRFʮtdn$Ak cGԈC;~<DЊiW7O[KdkҨyi6+6[u,7j!Bgy -t -UIc?YL\^ci`Pt 1HM kczS!?;1G-,)Ł3(Ήz0'D]WV-U8ԊP0J /em@'drv&$%7‡K~El 7qPN>`ApkB%Dvՠ.΂?ΞL#A*h?垝hplyx7AGg5x3i#FӱGu W@()A_8$<_xږ*2H|NFZ@DRVebzˉ}D%(fH7V+ޤyϬ᪀_N&)Wܭ c%0cgoY_[{s,[e>y$Ez&79zN hF>QW v&CteC.fLxhZ2ΤΕ$i'&4ڥʷ $(-{)˂y5/Qd\vsɻUCQc[i%u#2yW }:m)'h F+˔<':{R(%@fXMc`>oP6[S3UtH0Ob.6fX -Ϲu .Х*.ԩ$* B(.Ok_g bIQjJ.$\)gDx=#bȾɺK+IóRU F"tҫb5_їl:BP¶V~l+|^`sTz/rSES"OAof>4O6W1nIb -N]4gt}4+v:~8Yk4yߑ٪JP91D.kbA]lV~C;G8c*nۨ䒮08[pgXAK=SԄA 9N0G,z֜uzj^%7ENgzT -zR6aH ۥ<&>=TM=ńW@z7)H1;^_$21Bk -*]|ݴmw獂zp XQv9Û J1|f_v O{Lݮ!k:9Icz֡T>ctw"tb(R'H1?)yWps!X"LJ w4 -PK!?Ԥ@ - Ҿe=-qrR{'i 3$:V"!껎&ܲ%){Н#CCic)gkwAJ۞D=<BQpNhGY_Z[̸Ԧ̩<ٽlTs%&%iKvMTq'al[4r ض6){/%< Vcµ(҅~(6Ĕn%D'w靧N.9hTB -ZBo W"7dV:";f9 6Ԁ(nK?M$m%G -꾯 o.ߎ o\SAJmu?,| )pɐcENFn@i.2̧j٢B -Ll/ Wx βf,y4"4F[i:(߰^т[; ^#Ne,h#mh|\H3T%QhHԶ ^o~4U=)j?ehvK !-jV/%dBp['La -m(sљ#3m)?|#58K¯< gwz(ĮLo\S6),k煀Dc26[d:~<ч!vrQwgmǨ026+̼ĬF"4-As2"KlV3mnG!v,V(bڳ -tn(GIL,@* gVU"81^mo[y_"$S)"KP%;eaЂbuVav) M'LBr]ǦݹbG&/fVf=E/g9Gw -7z$MM 6DI_,pB`n笓pEq ERUn?h1wzhSUehG :ӅySsZiorڦ(Zl:{%Lj3ne~v!W},$MG(rERŚ.vdQvt-W`p)o GƸPX*ݛ6i\z#^bF DmG{"MD,3)?\tP>RMe}k{M^ɨd˻||4hJm}$pUYnww-MTdx=}m79srpTC?%m[?KN_YWzSՆ}HBg"]`]%1@nwQس`"{={e׷Cбc?Dٞx]?-Ӗ TSEh# =M" |OpQ#gld$ձ"o]dӁ G۹}o{2IimhW {m6rE~[3(9ǃ{aJ$te@j Tp BazPif;~S/Uch떐c?;iea+=Q/]'xOMyq/@2=I d6ՔJ[kv~NҊbP}-p FYupCvʾ21wLJS/Go~oQU`d!Qj(CWm|g1lGϺQ_>] -?j|iN+6 -K?ANʕ2K]>ٝ ( jaq{ifX#vb?|%kVOX:YQc?q~Q| -l/[2\KGg[5A-e"u+$!grϱX).*UX{\v`cn;e@}fAckJAZTė}eVٸ~틋v=h!h@́yT%y\t)04rI)<^i/连u-zd(AD(|z.K< G䠩 )dK.-H72S|P-m'PFQӤyJWg.Wב_߃R4+3ҏD4ymDw?1.l!SS/DEDSIw!ϦCXH|`q)%!,:D{莌>&bn_x0]&M8 ~ 9$}J!~$K`R/d'18EޗYCXѮ;wR3eWHmL *HE_ldL;W ?%BǮKÈ%p@9LJ6GV+s'5q<2.5@C?U7! VZ~aQK&Ij 07Oen`:Dͧ67E8=±doC$ М3%D+wh` [w7A.Q;4ѯ6ʍ'q-u igg)=qnwu+k"_ӗJ -x͓ "1^&h~m?x%gJ"βK,Ԝ+-VNDqaG++$̃$G0d/r粑So:ÿC)*謹*Ȧ_hFsBV\t6n8;`'_@`Б,υ2ɅR'B͍Md W %%z !gmL@.sqf2XvB9<_1.UO-f@h&gI-Cdk3N/<;7,LCQS++ަ'm27 i `E`޶Haǐη天P3b)6G^ppġ!/&7ɧ  Q%I%%t|aF|174+jMK4ŀL>-q7 믪6o7MF$VM~E d g"ǖG$qTԤ D^rjoSAVZNⵌ!5o$G7_Ǵ=珆:8"2,ˮq7 cB=[g (ku`mw%li(ӖgB3$,6&Vj|։< jgj_ *^ȼ|j{ riШI6lDiؚcH߬+ +*9%>lLq%mC9\6%R&Z|>%y lpivmS—?}X5 Bؤ:qo1o_Ut-߄;)tN_Ӈ¥shw/)X,X?F4y%\4:]L+ItniO%Aiˀ{h?Ɠa]AZ(xs,F@+k(z-T0S -6C6!VYeW ܃W#^V1kB&J+b.Zv 4z[eXExn: ۣH` -o7+jOD&ҿv T ,wWrG0[*_7t$ w%B8J lӵl'OZFxC /qluLQ!- W - -#N1 Ion vp|ɱOVJ<*nĊvISHq |ǁ,:58R]o+ oaz\mv^/ 3ve/ҝ:>4=M"F`7ΣyI-*wW9,E,*-Uc=@_YXYb?幊6jVUZ9d;(M\4B%[8TS&6n78)xM6%TuHUO{/&l2U1Y~ $GU" 󈇲v8 C` 2m")%}OtsKjĻ,ZQQ{UƛxuY@3@d4cr̉iCE)v)L*aqBo!((hnZNKe JIvVPWYYbA4hɨ|xx94?q0|fK)'$az-xŌ ɇ#{Iq޿W.cϬVND4W̄԰WЦn(E̿ 2"RbK2H?O:snPA< {vlX"hHi -hIbIĤoc/5fE@ק'q"9AJ+FNx-b Fj>*ڣܑZP.~59bn|ݯd<~&DF -U2Si{?a,%!SoqC&EVo*YOa A^_\9sݧvT)gԓ<~.:q7^XVv/~-!( .v4X*H/Z8B-x J؉[Tzn^B W>]\U(X/PhZnw;ڛvؔ.>t3lѹx͈}AC9%X`2 u7릢9[l0ȵǷ$t, -=VN[c५r%v`Plu,ߍQz>ǜWETv-Sf0/8 L|LZV9 %]7:9Хn}%] -;`q-ũr(xFuoQ@n(gE%זwtE*^~T7d($ni]tL(W[,8/+`$*º/"Mm~'iLZ(C|*oێ?*MĎ[lm5Um濓^{XRZ"\W|ͽ){/ڄa ғt+Wސʮy"dD1z —tG#/6 -;QP[J>u ywλhНU@<^/U0fZ0]~IH 9/q-ᗑIh7P~BW"}_^$5270¨HGIOAXA7g1yD(3Dwo^=oIO{ȃ -NWlh!"M2V^3 -#Spc@XWm"=ihvU8YE;4i9 }C'ig!xf[.uAyofj6蟥[R$[X"&Y\kˆJF#2a}Pw\U]?:Eˆ~WD{ =¯ulItѣ7AXgA30.QROK٭F -oY`A*2[3.~~(_Nܤ(7Qˆw7ܹgQ^ Jh[[nYD 4 FOLk$׀r/Vg8b:9[pMԦRZ$g2_d>BtUyG U^زbsH;k4ZzFߦ?T?8R7Aвyn%(]ޝם] QHnnDڦCJ]FS}ZepX z ߦii-m0(@7Jcs+YA0*DKPVbT?baЖ-9̅xqKw|ڵr`FuGTa22Gg40hX5rhz&C:]zm://fsS*v]ޫOm:0X{h6WjG)U-xĶ**QIs.\EV`[[E-\`P3 /7Nc_ϼ_DHw}[#4 ̕=p]`?-RuB9( CZtd-[!WwhyO θά*1 ]Bt^ǒ_J߹-%,GHpS7IM;Rw}et@Po1yrčbɦ;[UEWْs%.o)Щ{a'z\M׽;IL?" rA3ٍ"Z )WIvY@\'"v -Hz(i4 !L/"[J)W׊P˶j.&"%:7P~hXWC~7~L&s0܆ZqHb-Wr/+r4q ^Q0epެN ϛ 0UFSB(($_"iToAQ !I+?O-KxT}rپɹ'zfř#)J *R;Ȏ2o͏(kHp7ם} S^;AY&>V_~ PlTqc,Hb:j5Ӓ}:#ĿW-VWr6C;X"0+ -g Snm@ +HB/)9-GUŒto/_}Ab]Y'9$=Ucb~S(eq/Uvz%CFlu#iM1A@b  -fl\yb+1aPqPыY˴J/ʰh]%j}N'_`863ZN3!TD@>kG[e; ^@^$oaD=n+oI,~͆ƥ WGtAl_nFRTFmhn?&o]̸UcڞQmqЙ>ڊWIeJpMBiƥAnŀAoZ!V@p0V:u9|l? Km~̧ML.rXNaF=A@գba@ͺ#wl2Wn4TMbkfdf!4w]r -P^ -F{NP`nHXmwtcY͉A -E&䱪Àa(D2eh]MOm;nwD Ejj3H_2uлͯ? fivZ#!|=VP} EZ @<,}\KkN $` S/g 3Zf kP.Ozf꬐(^x]=O̊\ʬFp®j:yK!>:s~1~v`B;~[2"e}y -oy~qDKIl<偻Ś^n=O3qeA<ƯeHLMbmC榛 K8 fg`5PSEdn@"S6SwBفp~ PF{|~LesdabMڡ}Jd߷n - l_oTl`v6yeCNkvaUx MtQS)G8GYˊwi Y!Z--ZL#aMGF[m}))Hz.snNiSֻ=J{R33*BJ8TFr5VYhDhuERJënpnG"^JBtEe܇~cT -HtP{aae;p1?;)‹H~ZEЖpC;@y2$RґQL&rY7F]QH!ކjCf3)s}f8I횪 -õUg b13rXY,P굋s|ǦЬkAVsOLG}jw5IUPaOub \P=^-sWއ8wu1vOz$οa)e/}us¾s`~]o|L޶{K1u_c: n͟HOb\zfH/[ u%z<<0t_JX욽x;DT to$*m0DZ,Hr}\Cc,K%lQڛhvv.k}x P=Ic8mٶVިbDR$x0EAMOО<5*Yy(+BvI2lVZ+e^ Hz#DDC!Az(KFCB(4zgtMA([]GnAFH`oèkEk7z;l߽ ze)c% Fc0 ' ݯXl-RHE -f -:HV4KpȢ?YtO6oYO-HXPuVc%0gbP1Αw0@_MEzGVv@r jM'e넉LǔLٕkζ2G Zc72:&|;.I$|:U\VX ڏptIQ]eS*"UC~OomSp@>#Z+r+HG;FӺtOAWt M&a*C;V G M[d|lGvgGHňݒ]kiONneg_+cV87Ud./HJCtȜj3:o0976ΰ i; W `.' mD)+\~ h "wB=(>uΟ 7Tfoš!ҳT|;W,d ;>Uc+n%evoetEMRLgkV,1ttq|nZ/ ] [i$z c: -S 6n%7/vv-$b\-2w&-eUZ}ZVbV,<ҴhiCwB /17c -/h[J<PO`9S[!oWEǥޯh1ا`_nfXWQzze?IVyRv C~PAj{;SQih+V6BcDkxi$Ess6+,b[$n5TK#} ԣ*Jm\C='ݣĮWh>A7O,?ׇ7^.w1oA>H F?=6|=Ew1PneWD.H˹eS[ydX${u0pתnq1H _jEdٟ~go{ƀ@vDgG˜1k4R_s|6sΜH5  0Ai~?.SZ)53 ?<=??(6?]com:#[} n} U@bk?5bve~35OPQ;?!M=&)@@ "R0aRV] eY{ϥDv3?0rķђYL٥ꯆR+maHR݋Q:`; -"Jbش`8 z1M7SDB]g_xt!7DIn'‹]mŪq)@SQN3&""VO⡺{8ҋl4d~:;Cy.EiVK֫ML&āXÑF[uk;CI/M:Dch>hhRrb0 Mwp!DeVҩJQ;jå..-??ȃFΌy44*2Q#s"0gIʓ Т,P*6mKMՀ@ - ^8U9o`Oq5'ŽC˩нׄXfEt_$T`S rqle@tr{$L0T4T^ń;ꕛi):!IP ih%$xΐ.PiZKOe -e* CJɆRQ\^bhkAو"0ZOF ~WUw.w:^D?i(?YFۘ= ~҂(6^#KV1!d -ɥ(4JkM훓Ӆ(FKURf(&d@ tBNe^MXY%]uⲽcq 5; -r8"m -:J;ٮm-@> 3le&E$U24 tS>}IRȺ+衭T f }$拡δl4pV6Mټ9>PHʨ|lİ!=CC'Qs&Sh nlUcNi YJ>[iF8~{mrf}A@+;c|^v 7{"{A;dƓF Kv)]=&Mi/C؆ayH;H "?WfTN)8e(!Jػ[!m>%'1+n㣚wb| }8#A ȘѾi{E(Y0lUno -#^ _Xt:!)ǀ ьHL?7M.]tm_ TWEG;V?1ZCӵ_\oeݡZD4 R|4J]ۏ0Ǐin?P@wt.D\m51#뗪[T{aP*@+\0xOр]C x?Z]%4FX+9~ggRtסmƖ ޴eʥJF%هgQ6Y-X 9cN($~4[ݨc[Bf\%Z+}S-(!DuknY}Y.*HK -s*Σ -}n{-V$Wqxݘa.jy9u4Ud!DȞQ#u{HR[y}O:cZS:ac4eUTs.'E&qզo*+v12YK|buR5w6G $?WC"Dc ~Pj4z!אs5@ըÂVc:5\h!;5ƲEU#.޹^LHi4tEhwL7aկ&N꒽˅]^RRl[eqd:0E$_N~)QbTv)46K䀼)ŋIe -g'xQj1C=Z0rZT#b;J. -hz!TlMYtG41*. g˴JL+o8̵ҙ^Mp$&-{Z2zWx:d{=zzP*\&6(^ -=8icmy:]Nf}*Ih«E.ez8<{xǥy H(hF*\Tg}yHoBU l̵BSǕxlmb[iT-s@눮#m ,۰\Ւ۾~}/KFgP#R 5nnz39eQ@5ʪhV6hV6R9M'l1^α΅be~@nO~I~a[0QD< -7C9 @z flg@68el ,#fopp3Bvt*2?Pb()WlWN Nmd dȱ,D5)897 -4,d>+wТ?#c-cbt5 `!¡ VG|1ح>ˣ!#(ZXMSbiK>ax.Sph.0'Qa4{1%}EV<;0͏>0 fPl8o'|7,ѐ 1O^TR]΋)9Oo,oBX= Bnhï -ӗ΍~eS* j&tvoRU bX -[(O!I3m 2W~OPK0@pͅ  Ѣi`+mvoR$ pYU$+ͺDBƅXZC+͂w^,(ʱ%+Tuw"ioj)nѻ7K?ƩkSFPן5jtzp]?ߜ:W\C>;j -R2e&Gn0C -vH~km' ~.6}I;_w‎x@~z^tP7 ؾ0]CF] $h436Rw?}{^LkSCG'fh>tű*wR"р] /d1(ټ1< -B<+mm؋cfܤ06!HjZmD lWkH/)k${̀eIZ7#djKGgϻ.~~/hVe5sTʚퟡ\m/oxD5#х;9|:sVz BY1U^X lWѭ2}Sm%zmP%2IHD 0ݏgyE,!}u满dpmsaں\^Otn 9Rh$hEBRػR ,z4hblHtmU*Ґ5 -M fk1EZ|nͺ[{D%5MM zZϽҭIaBu(p!w:|J0.eP 5-y->wP{E7o*)oT= brLV'sԮ°Y`dfHvoB;JltώFB2=c脘w>گq%dF|ID$5pmPx+e2rFzړV HYͷzoMm$ޫ.S$=z)TV j*PZ0*G唧3SO-]I|{S=fT^b -ЗO}Re҄s9b.K\DH![гjѳdH޹JuױVb"R1c;(=3|Ө  FNlmeGЏF5ŐX[~@ABo+a)ZG,ھUA0L*7P_r!cb -e鰽Qsd9UuFi^I[b6{BD4TZ/pOrs#zQ/(_p]W5*FԠhCv_=5frG@BʟP=H:A Y5e4)-N9 i xf -=XkH~|`i˲an䧙POqLV6A]-BZR jkCT\t)gB?Ė-"KDdJ#R@:%jG{~RRzBI܃cfWl97PT햗55Сq(|s l֝Ěks`F1,H2Ic{/2y=P\ݏ/:pGTsze?Wšfagzw_4$;LBk z#G(7SxrSڝe{=f$ dqz@[FR媽ʄxD>駲zPLTȒ&ա?9?֠ES(*[h8] kgu+JQP-q勷du{r{~/jQܶw@Q P":o}@SI[{o.@l]EiFUK[DY8Я O{om -z"_j4T@xZig5Kط*Pҧ6uh7;Á'a!m%\Sv_3@.rhZ1 &)c64mo@Ι"Hknrm9oY~ґ\bCKc 9ϙ|O$KvI&m-LqѺ3?"bN)q:-c'z/ɠ+b@\y@ʝGVV+I{)u{;240nLN Lg?zCe3Ɂ[,ݼ;lTed] ??H^OJCϱzYvwTI6{?RrIa 'HIbX@SgozN0y0EaƦD٦Ӄ=1ɮC-6/ P$Y75e5)TYE=4@Qjmpcl:'b_tBI:-eqorcyPRZ͵H p3:GBXfu4H* -AJ8LP 8Xr*PoN-[WX{wyA$GULzu&~z76srNU@r\FXz46KId0% {$NBoig+T6)>U=p+@=[n=r2`x@!obs PVu 62I傜UXZp牓mb+\c.KH6D{_gCR1jz b A vQIzA)=h=HOf&6Y=TpJҔ(pJ[=IůܥSMD`z;uTq["VH=@Adf^bڃ -O\ /J]wmY;ANm'RT4'ī AsLP,"ұ,B+0[t!szko$LΑxXa'mة2KYemT,w Tk/Oj!:;]ÿb\>jahKu~ t+WvwnDGgˡCf=`biU-Dٞ'ej '"fU<2j,T :qLt|w|@44РLʛDz -=dl로$dRxw!7lZc]^R!6qkӉ/A Jgg~J uUT@rȜ1 fHn{)^ni)%c8nvo͎FS`5%)\'`*4dgF=椲eYt-ß ͅ{?i)[M:l6 pWieAÈ5ՀIUɢ+\):7RZ)A ȏμV ]{E'LYPyh\IK*[H~:j4sHvc{HK$9g])UEIIPx5z,GIYT iX55:%cJ)SyG!֭cFW-;JLeceUsn[T ŵJDi"Ak2,s`ޭWٍVhȧH3?4n4 R21v)ڌlI G4X@Ձ% -- WF<% -4*"3Bc~_.4U-vS-Empf:*rRz2-mՔ6YGgyD;ϼlxV 8yTY,wAK!X!L6z|M%6p8ޘҹk4[X"eWlB|A(_ӆ*L(+0<vi1NUXP @`n;: -;'J*z"d{x^7y&xZ&s"& lT¨q#ue]0Z(v2˔Ɯ< 6Q8K\~=_Cu: JzCX9n71;& @[tʠ HFtܣ۪*b]#R叁< W_y-( *c2{<lzU "vKJ%nw=;&Ɔ:_W{ ,\49NҐݑ5: F:6܆ Lj<w6؍víZ6RkE˸JW(EߞlٟS8F7kՍGoL_ݼSK|t -e`X~LIsgw:DVfT~eV{"amF,js_\NNAP|DMcʰ0tHvBAʼn,ԑY)zێ곀8Q,S&r}e .bs¶|E/DؼE3VdWE_`nwG@Puq@ -Iở#> $%[>h)P: {U@ذo9Gv$cV`cmr+euwNї\'~./iǻ&RSBg+"rHoZ`W'*3SڰA?אK*?Eu]YFЦ3(pX5-옰/5~/0c Z%EuǘL -8PK졜!sFB[K@)ޛj.q zu6S>v!Фr;dg^r n]+6@ȶ(;NI6x д=tX&xn'bcݔk3Vxtf-uƙI+M^ԃk")ףHkб­{f ,UU x~媠 큰nw9*YqXى땨}yE3%U\,,ݭ7d]"qGY"~ ;>MESJeRE+mҜrW{Gg -=/؉!\Tٶ)ye#E1xha`'=bp.4ԹqoWl3xKC:0(rR9J7] x+ -:<؄vp[o,1JA^O} b)`.T>Dr#g4[-n˳e4\fIBW B;vNT%}(rPzM+_vE?Vjь7D=Q -Tj<ZWY e$@t]k@Zًf\W%RUƎcgSM$ xKՅ[x4 e8Gb\0b 3`>&lSl>&x}'ص>V4/E\n09ph`lhonޙP"punb9h?Y@fS'NEӏw^..sN8mlaVNx93| @{B+J֧q7l~kSR^ik悙h@U@DŨv(Bہ͌f°Qy+nqY"8Vb@QA^ I<iF t+3]z%\m_uUM]jyP94Ge&/ L:,Vp8]=TQTOny+A6%Fa_ZEt-fQK .=p 6)SH̎C1FrQP'Aez8hPh#Y`%Q'ikKb&UZc]&נnҷ-)yvu8! ^]uW<,@::a6fQƅnUpUaC.{Kԭ+5@4|0&5.H,.1}##B>j򬅿1 - 1hW/2[ǤTDp-aK0v9[fHvXz0%(@t]]j>]I帳olDl%Bł 3(Z5Lu-dd@C!rЅ57(s{hq鍗W$SK-̊)^k*KMq.lWJZqUiJgT5\*rmulgtJJ9ɛǠ̙scD`RoA7!c A}cU ӃU,C_Ěv@~J!*чx8}HEhq3[_yF8s۝ > (6JbF0lf__B v6&/  -)At Ԍ/#SIأ5H@nj:~y4 P wG$H]KoK -qVzρ]e~Yȏ+T4.聣D}̭iI0`D nXlIQڼ @S]tDC+Y%Akhd4c"7<&,hujkQܰkDN1C9)SB7,BSj@$~+/>dn52[;=)6a[KA/hRⒶr Vk~;g9v$l ZT m6֬Hff(̄"#jqi>Iyr59Wph&JX%oR^cm{ZM6c ۅug7#`|HJ*P|g~wx/|ZjyJ3\M8ݪ7@%#KW[*|ȩ$VX^vM5JڷH w]M;ڴ{ôr\9 ]~,Ōl] ź].>ؒ Wvyĩ,!׊Ssұ$~wi>zYHYn - I |YT M!e)Ѓr?vJ!0=EYeaK7\I|KQ )M;u))0#e-fXix7-DH=<Ȥůd[$`6#kv;OS("~6 PΝzH}K}VsJrѷz]o#ŊOEf}~aY#J6P -Q2"muйS&ڱ٬!Bh76 -{ x3W2" PO5VaC2@AԠ^WIp%t)csG7!?O`݈ ?u:6hRՎNcPHj;6!ޮh#r?~0k[q]ŭy@AP8ߌ7JK>LMT"[t^+h8]ӏ6<0܋Dp4MʘH65-ѥP} \cBhQ3YbC@ 4Și?U5*%K0~Zh(ut%,xL׃:^gZY9_"I!Zh3W ox%M@UAy|қU@ F/Ⱥ)V| ZFj\"έV}ѹ'L}x' ݲn6[NevpȤ- -Nj=j t-kǀgRi6M6 -]76!_Bi17EB[DZ4XۿeBѸ,bݟl( 4hOrs)o_-ų؀AuA`4PߵE6a16OՇ\A^\eLۡQZ9ME݊zɡ'w ;O^_ɂ48ZXZ֎,*W'hǦh*S^DDSs+>3b\S"!#W|VS3o.Zx})ʑa,km/_N3-ज!Z+, -y8qORU71ܞǮ%L@@LkIIBLBЈ =8fY;]zo* O -%HK8(26)`OMKH&l$7/G.sfw5G} s r6ΠI(hjP7db-FSK5=/&y;^Uwg~_VcђmMi`:*V RoQBTT +ke9$ؾ@>6le+1 f[@]trk3^;wu?0t#/xJq -/LChRE6S[‹zqٲ߁ٜXm -N.X sMJ++RoRvSz)ovF쒲)04!5>[m6.D@ǾBGx=WDPq -65ɰ1lMG]ef5R l?Px%o -f8D4)7/֗{TPn ֏h=`Յ@]yQ 쑢A7MA¦BӹyݍMЊ\Ȃ6 ;An @x~tP\:(&ӬC c(MҁdK07T,0g!鹁X%BJя=!0kw|yb>QMhu>Xb&f41Erw9-D~F\;:oCl_<]%4ڡVRs1v_;'|>=HX.ӵJmR&Fwȹ;JVM6CW̜ecK6ed'|%!W-N ^ MVf҇0T)R,Zg^1Mo -(VEB(\6%5;T0ctHAm@45] -.V`DiCAI:?B5Af I|2]JW΍y \\Q,D[n"Mw;dϘҟalo(*:ZJZ)/Aq;v("" tD0]űTt+ oBxVCnQB5?CJ-*4 >L%Mօa4[I3sb7Mt/#gMk5 -yXN6X_/Sop&*tezYm4EhnfjVuB}*_ڝD<6JP\ U׺}+߮ꉉ;rgC^(6dCykx6`D)+tUMWx+$'gH*TRMQ57RĠnH;\YX-DV,Eo8q}tR2rbJdSj"@h4^d9.VL'TK 7lb|%B3c$ p~Dyk8t2 & >w9/1"S\ZTUWsAn'|cCјdT(3ذ)lIGykOţweM9Ql:J:A+ճ@kd?ĉzW`7RO9H=:l@߲f9EmWlKcjyV #fL$)W͔! v/DH\k/ɖ'kM'JQ9g?NI~hJ?C'9;J SgF1M1LeF =,6Hy%eN}P ju7_bD[ͬ MS|]LLrMq5mXI$/ -B]b'dѸw@u`'rj~1XӸTE_%ʪݟu:5WٌtLp}^D*F!uuoӺ!wZ/UQ-sNƁ6Q)wp1BR4GSZ(Sؐ\;-h_xH's|v} G} 0 5Wl`{{硚:0Dʐ¡‰.6 h@ }!I*wm-ȭyil½_:;;Jx)M{/ 5YB+Ta42#RKk@/`e ]p'd- M_|$~Bl9e~X'= ] SsP&=L{Y[winZfh(MBXCܬ"MI* -;nRGT ٻK4(ͰSgJpfnEez(d-BտU+:u ؎Ė~3Z$͹Afiv"C'EV^CvWm{ȜJG"0o?hR"o=M?qG{NVRC7غ\g$S׭Hžζ -Ŷ *!&M $ wHZݳ [( Gmq-'`q1`܇~X&wbe=D7e~Z³\C (i߂̾yf!-c|z[I)ƒf4=c!41Vd 䯶wñ#GXQq{ <\_rWEkl}i۷;R터 f$-ʄZ@+ud!RP/ -ne\DD!`+믾}`b `ýQ70$*mB%} 7yHa{ -˵KWM㛶:p|ÏӐP;EP*cYI -ǹY>'Ԃq#Tp?0;6%*"$) - nih7#=:Hc OѺh$gHGz o7}TWMƜ|(mII -q]mk/$[nV24ڶeŒж_`R|eb+w݄@tYV&zi9~pZJ/!V75#4P7)ٔׯ0UK8XbwP:9#z 񃅑j4ZҀC0D+RޒR]9)tu;"Dg5& -#rkiwz5QeJ`_\澟9M᯸UNOG\$}?KkFiAfߑx3X*pv\ʱ)HZ?^{Fą? bm 5 *̤mƛyY -%0)SM`I|7LSNkb\(hH2Gm] ߣI"J0.cp -؇+|_0K)HGfP;6)}>*_#T6|PX1trW-5GWS!:3OGܘ HܜvUԜl5x/<7}=v!c@ -{8-)ŰRbLV?"5;R@+(N*/kzFB0ҨaXˮoX{J1@lj\&mv""U,b@ 9tF)5W-bVh?jMO hy`@,U$oɎ{g=V#\kJ}&O -mǴv8m{iWZn*꡺dBj3`"4CTtRYV%6ң+%[ Rw4M!126>zb.;idf}C<Mc`B,[lqYqu[AQWJ,O-NJĝҐn N*Rhk -!g7hHr-fW$viâI%땂ڒF[VI - DcU HK0(Z-f7vB+u(7iNYvTI3+9@An۷$-dbzbvHwH.\WPkԝdhy[4.$1 7ˎPQ:FJ2y87K&đ@ʳh/ƀ~ZaUV}fD?"I]{y]me -鏔m0h]IV,5";Q/nBys0A+a쎻/Ois_[iD(w6JyՏs<&+N]MF= -Sq*&Aٚ-ˌʈ ŕȌ8dl1FuS^ aRÂ"xdRޗCDWcs'~0I!olͅ_Ģa f rn_xJ|eݡ_Ck lcE]LL~P{*gZq.A5/3CO Ցbg&^-E1~?~^~$\C7jZ~4}> -jHٻozР*]ϗ*=LؾY{9޽55&A!=Pz9u"A!x2gۀ4ף0,sl2~:C}zRN=|X34?&u\f}F1l1qC]`+ (fI -Aq>ޅ -xrT Ѐ -n,?&0C3^fZZA ^Z#tkSWmAtS-IA v1G AϤ-)0} *nX(7 +0yM*dzsi*t4d&@vl"AwV"%NJy(K/(%74|(֓QB\as Uҙrl3|)g:o>PKfet6.lf-9W!t{\WH&O Ulh);lI>4z}=HP ՙS+&F[QK" #mBa*:**t وnt%#.!ݚ .6AfYnheS@-YtEKdvXe"X)K䮨vVりB.&ɕUBNKc(CB$)X1Rjv`APJ >x>EdiMȈ-IѕExϵK$`%@[ɿJKB0+1kq#&o?6OͲm;_HMw^ǪDK_g(cM?F/,Zx)/D+؛lϾ-1KM3bO`H\j|Zrf_jVeۃ4,#^VQ #Ͻ}C\4]Ol>8n~HWߘavƪ27- >!Rt P+g N}:/s}鐝XV`5#Dq2UCCra87w+nK$%]ԨTBks ى~hK_5 e{݂!j -h9lYP"T["$ L3*xE.1X޶}>ƒ8P':0^K"v%"v6!1R&x(\{-T>ų)+΄ -ѤY7VlmAWcw%4A\;eaVMӕ7Uf{VYy? ٻ7fLf8I _FHxûYw[(; [S𙤴r0w2N>F埾Г<pߓ O崳׊joGE7'; ^|0Ku|p3n.懻tbl ӿܱfPr079umzq [e{ .iUCDCjW541F'L`d%͡^YC1cۼ- -}ZOmh0e=w^Rz ->nM W^Ox3ܼEk!oe- -vBY+֓YG0]1(q%+ӿ%۱UV+`vI(Ҡփ^N9״DxyM?1=Ꝙ"}-!^]  l `9JfC-~rȁHf7PT 9xKXC-?fW*M\b vi򥀶 ̆)u.<w%?2]ElPH;2]i74َV`7 xyaBOY@;Ĉh٢5<+F/--2,"ú"T?՘h85hվ%Sh $fX-C3-b)%5m#˜ɵ늆w<+F -(IILa֡8 =RD,aٲ<=LNyb ͚.K} a)t0 -L{l "⶞Oy'q\F2Xmor˲"2)bՅh%4xܦT#vjx_JhLrL"^![\h_݅pX ,شKPniDɨ}_ƓImޔaOwK[ݕ$ӹ;=!/2{NtǑAФf)~_;,J5{7;GCؐLR^S󪜕 c4l1?yv6}ҖQszc;MV[wmK9{PÙV=3D˽΃B-NRh- ǨB]jVYW;|а$Dx Z&x=,ۻ7q|lD @w١`:T2d^x+3@x.Rl`˫[kR>tQAH\Ad>p!|(65f!+6 -1* yY$~E#=a@aUsD눥fx1i=NQ{-}첮+? },3#iާFmL/;4ۿӽyr顺h:XxV%ltE!9اn 6qaLɏrϥE``RE]Qn:miE]TebEI^؟zob1BNSӶQhH8,) -Nq*`l4e% !q ovm.wTkΰw#?*oDxk UK /nCp,ĸU\nۡ*!<Bq|_tj@e#=Q\P*qoaߔuxmգ|C>*/ -GlmHeƏϵ8U>=h)=JTu8rIXo3ZZ9n#}6eFx6`}D - |G^C=l4tQߑѦND1韞ҞҮ)(GX";"PS>E'C4Ea,HeG2DzxbR V5f?q (=!F*qmi$wy9.L :hK"{\¥uٌ;61d@ -Pjtj!J$2s5-!'6ӯx|ֵ;FK%2y.@oa{Rlei#sz+oM^wX5AZX7 Hv)(ȽE4۽'TEEWA. w SM^z@PNwRvU|^`T6Y_n[:Zud -G-hjo}r[i2_(DW(8BG}]qXg4EA5۷x )f4P 줞9mOsu8(Jog)7 GZ띚!Y}y˨SJrXDV19׊͐9uFd͠Z5f/]0sdn%r(h2:PhhW|K.}i2K6! -< gqS"v4տ+K v+9oE!^i"n-A&OZ 2]Hv#m[i؎lSrP)VWDjзkj[ -]xq-˕'"A},\ mm}kjRSYlo]̒3;CB -^1v- &t:Tp{E#p)5_ K*WWnKBz!MoMI+ osV Z--)_szzl%IF"Iv@DAkpW1Pa8+Wӵ[ Q6|5Xӊ{݂SRVJZ8n%zqRfWsX\-b"&{AsԛܱXWU1j!9|ȬS rbi[d&_|Ǯ -㠩?,hPHsH٪J![wbO@bꟁ6K-` m Q3%^BC-Q <؞(c;kQi88fA*:<@[d})X*)_:"Xio&V j4)㤁x0;M)7Cc:[Z+h4&1ZGVb5$kV&- ʶ)8IM 7 i#J4#amD%d4VjJ鲭9IJ9;G>z-̭D"/bQa52u _JU0`ЀlPZcċkavgJv7B xe}f)˷Lj=]- tc*ϱǑ 2⳴#oNVq|VF-d_d|\甊K֡6+ieyŅ4ѭ |oX9v͒^4Tx;a@X&`")W2fzYnA+TO^J[3Cv:T j‘)w۔ U$[ J[0z4^@V'At8?nkrY^U C7OeM6UqK_u{8N/?leœX@E0.[*+s午_(Ƣ&;'}Pb-2CDnh g'Civ !֞ϒR, [CjZ5)<0 ^XօFb%m0zh,nJH xI=HT+΁8{GyO L-)m.}q@zM^WvB7y9x¯Buՙnno9ʈTVE@DN"¬7޹upO(7E.IFpK<@KKHPiX3W{([TJt#:~ 92_' B ?5;& id@7)tr/njK-~ `tQc88bE/˙hPjD98)3X^>m,ŕ}/%幵Ø*!o<r -B]sR;䒚,jbvƀ Amw#ZeA=2o]![KJp5ed#|9{NϷ|e AF$K7;D LCzhqrZNVLFIm2i"lT -ܷUfB'T=!(G;sVZ7cW[ְ0W˰b}@2y -9B%e{`݌a!h̬u;ȼSL>~M O1Cn bFVPB!kzg?rLRu`,YmKz^@o1 -Ƙ \&IM]#Qր0;Y;R_rS֥ÿd@o͋g'kLE-Tʅ` -"kU,"+GޠA8خ49.V6]&%0==H6>Dh$]v>OVi]~ub/ ~OklIZy=t^Ydw3?;#S(I}{=˵{)m_ -,ceH[)#>z#pa]Fƶa @݀"pwZo`%mXPWˈr+Z[X@:45*Fk'm2j+bзo2VkV>fR -4aB-2л11S,v }bOzL YTHX&2(ේw!X+> -[z@K 1HǮ}_ -4ڻqS#YLf;,lЋB˒ׁg^Ж1ZE` yɉFnw%_~bxTF8]򻔋{Ɓh?v: ݭ]HbfgZN} M39t9,ޝ1Ho t3Ig*`+ -!ŕ - bWoZp`. , U1V.<+6? .R]دJ^<['*PH4ףJw@KN-2ٽ"ajdSiU=sFe^Գ?Q'BR-.a -Z{هiZL[,P[Jg;#(6FX -UC zh܁򹸕 "{B3y!FcW>6g^J·զ|xMO~f-M"wSJfFi/%!`ڦÔ's6#m\ -Fr0w7me>"$c蠂y--ĺi ݔ|7yHO&/Fe Y9؂ꬵʤǪf]-PrNw3X%t4IJLJi׺ -:DaYINCuwJO5dVVmMuOfqKwWPFn2}Gw^' Z7JT4Dž+BP>asŲuv E%" /?HPnYIA V"VWI Խx'.n%J¦" >X?!I~8G}BIO#4u=1C=oj/< mY^XV#0+33PU6^Lݪ^*K߃߮xW]?0!B,13f|Jf&U^=5+6>FQ\˓Ol0TݧgP=8H -]ZBƯҔj>cU7C(1Zz^+|OBQaH \|I{}EIe -ҟ=>Μc);q4Qdn?ꯪKRa8cO!WlBOa -F2׬%rR^DowK.k8RM"v2@aS4-j&o.t=*cBw|Ő!߮hr^y-c֍VOb⇌0̂BsH؏ 09O73E.NL =҃_u-"2Ah26aj Ez;@DU ܞCѓP*1j[e鄏i|t+UK|K6wqcoqzfG| w^3Yv7wy@ n+\i_!<*LʰRŽZۈ!ߓ8ezu]u h1qZrȾP.E %GgJbM␺6@SC㈩E݈p !ly=+G#~v kq2=0JR!K9kb?Dr`^5.H>z^uwP%E~LK/"ç4B8P,Ga5 n_e D;Bwg}@hd1qkOMK̛sGybn:U`y΢W6 lyJ?vxN -lދ -Pr!n͘ͰvU&Bj_򕅼nU+PH$1xpXQIX?ҿ3_\A3fk OЌwf 2eqGXb@.PݦB:x7RI).Kݤ i$?-N_vGԥ%Sѝne?`n{> z݅fLLB:ց*JkhtR`)ڙ+b8BĎ}TCX{ihR|\D mS qjDT w 'de9[nk -!̯/91iPB$ ҥt"M;o꠲0|QR"ZՌŐ ̋PUc!p_RB);^ :ەDX^(xp$X_}-*v҉3-B,^/qlI>_)b!yIl,0vpJ&{7UvtSidz1C{0} ϡY5靶V?=}H2Uw-P -ReWt<&4p I z>U"mdzAgZ#,%rsS 2v4%\U{4ttlʋk7wӭKG@7eQ"x2٪_t1^TӤe ք#(5 Eohf a>kX$冽9=e'N[{Օ 7/X& qMHkBD/)nr,,Ķj>é[لy$ *%YVހՒ' Ѐ+d] i9.HnaAQmTnB9w]RjM5}EVW-^Dfr9#S(|>~jVH!D4#"Hb7Z|yAqm$yXJ|iQdvw{zEyZs`&+f(f>5NgW`lIĪ,qbAB4W; G5h 9&M#b(,{Mx6,^&}Y`o*%.4ILRi|1+Ao9KHrDA\ Շ N]w7.}OJ%9*ʬ6=*rPQ Ute۪X*wN L yw:x:+'m.|)je_;,|t;Aifӓ)FJ.FڇnPƉٴBhFk7bo -տ\A^M#:"cBMNU,ni RT[ϒ C}:߄,ɴ"k[W\;h_<`rpI_'筃Mk}Ҟz4b"E -IlSE #ΧzWM}D`ƒ/$eX}&i5~ܵ}%6 4 P6AXѳB{ʮ|`+%]@;A -]=f9N.X|-1U*UEHF5={a>F aVT~%cD8f6=l`k& B-:0J=5ehJNV;jZrcsݱe{a -Bւ(У,0e4s}j|̱W,Pڂ2# uD[[VD/Z*?G#EiA?)%tJNp#Ѩ-*͡ҢzҘ}tr>36jJFwm m}?rԓ5`TqFyqXgUһ҇9t#X,/Tg`Z >2&Ybzx'tg11I UQt" 0mzćbqRA7=LdQfk+SC_p2*(g,ED]YN@܂~4`(Z (L ]$ʢ¯Tq@`Eթ-F%GyMDƜ' à%= qK I?av K&=v;J @ ,OŸɋ{o} \ԺG-Ql\ -pٵ H ޙQ[d"-Ҋ&Ita 2VsņYi]hZ%#1DrJnv*aZ~m=׆vٯGł&+#͘`iz;i )u+ra#jME%&Qo5._ka8L%$4TQKn5DӵvâRWipQ $h^[3'y0gLhUSW!iEzF558s㵓ABhQbd-3ɂ LS[QM0Tn'7Foa0jX| lN}rNZ]rmaU둧͊g(<:Zop;ٕ -xԐiނxh N= /ǫ/z utr@&w]]5:@VP;2N*L('J^"?* DQ5;P i"#U~Sî[' -+6XyvR g@_mBِ:t-<;Q҉AlA&x4tl"X:T"m(]Zt؋o^w=7X%f9Rm7=)^W h7qh1"WnØRԸ myD#W5f(3+H9øU[H$>uU,sx5v*itN{F՞ [  -16^PPjHqvt0F7΢ejiBywBʡ{HJ]ŝ iZwtb{M/00ogeueoJV $LnW} 9=y.-*TFekao=8 -vl/W7h-Ǘ,iϱh&DlKtfX6 =>UMdoNƹrP]-*vb kN (tYɌ׃l,Hѧ*hhxO@D甿} n)MB,zۘZ{?ĤQM1!bRړ8/o\) ty?|k욑 -ԼF͒1+."ta?VVtF5GRBJ_`_\ GItRX=>c`/7e5R Xl_C;bbc4{g-D2Bނc;M{{dp|z5,R+Ze4`'2֫8c2CpVl2(BN^^ҁbB8PJ^o֑;@iv1풄-ƪLFK^ػn5T['(Cb{dž&{:#3m#җ_Of^qK5ю%0' gqqXeٽ"!3jat^6*]ehl%OePI,*d""*t4 -hSbBV( m5* չc-vjN)nzqOM/lcn34Ц7 +mkUS"%Kp[{_vQ/b/6?3 v)gy$JIi #8”h -},Y7Շ- ynT9AËHMom%i%'AICu-5Tz!bv[P#s~ă܎6U*㕉bC>LB˅gu)& S<5qV nTn.Uw\'EZ_  @ub9oBZI2Gb$Ԥ`Hmj зYgDfdؐM_MK* -^ȫRZ:ewuFۃh) -v ) l ")kۈ-&q2a zM:~O{(}h˭6"r;: -~ % ߎ;͍ק A.W(7JDz˭'@֋ -ZBUU>K N@R4L}*ƚ9D?P荮 Rf.5t@ȑ XpRVnT}49hÍͱ] a[w#0RKY wD5CDx.qilM+_֙Ybd+q*u//uhY:o,UaaMCàA<[e.E -CuY ElH|k}HbV1Y=k3VlS״hTP/Q )"bɞ?m73P7uY$SV. T8 j!pt={h5[BFBݍ!6!.`1lVf$ADwe{;v#+eҹ~Gj<q0y[[Nn+mFn)BԚ)Ч#vk:db\YՕ-Vo ĕ((>&ba 6$Imgpܞj,dAQMB3R -4h:Q٠ -;.5^,nN bY@Q!l*{k?*c8y,P]rY0iZT֏X`TN𱙪] I6y3IBo$%N졘6,ӻ]깲ъfѪ3<m0ZDhP,=vY*S ʮ݅**\ Nwv|ۈ~ _+qo}me"$N얏y@J˰0NpYokntdh;j0 10nY{\ˢ|jPA,I>g$jD#Jn'fö%Yc2O1hPxA"^J'z"Ś*Vkب(\G ]t2# IR>"IGl=;:WMޥf-b1y< -Yy$zRy -\0Uc`WVPs9J4w"G~ߌzBwzQn2oB5Zo}IZhiiGj9Q d}IeE$P=W"4~tdši#o^ N%B|QFч}%֕ꛒwoEg5w)"x`z!zβB4Q˺ -`D+6;ڭMꘇ[xtģI.. 6h)\]00-6Yp5"L+,3NR`vh-r𔤛m辑[tEN@jՊ ڃw#;]%Wg@Fy3.@C[dhgmKSӠ,[E?{IU{@jк! Iv:QP }VipavGY ;mw4@"83Am&PӽUј=HACHОvЯM^<>J'>aUi1hUy=ʻé+4:܏>^^`7| 4ޥr7൵4 젋z˝” -uoK(+5Nq̠Î'@[I %qQ~%ecNEJC Fًݖؖ ~ IwX-ˠ%R1HMfzY@@j?ã:(%Z`5Q+xy)_`> -WRP5@Ի !^ݰ (q %knJl8.w#b3nYvpϢC;1?7?^EL h5V0Q#gůz<"Dy5wV{G}SKU6v_ - z~]֝i!^oCFk$SFJwp' %txëlJCe7ky!z5j:"/J@mu[YrRaM)BG;{ hE]]a݌ICDDv=mK92:/hK``GeSEqbp. Q9>wn0!o݆}hM)wobd -0:c/Lõj<U5L ]:AZlhc -]%%+MeVm]1Hڰ "Xw˗g--G^GHvnezD§h qN>D[t/,d o@fʇ}iH${ߘJh O!fy kqX"c>OGiFѼGt9J -ԧu7'09R&bwb +JU:c6:4 ` -`pާNZ])vk]{<-C6.J3:hpY{ϵ:$V=yȿ_h|9@ݶGALB։wlZ-v V?x'Bn, '^Ȩ ³寧VΌ6HWt$)'RpNE<Ñh+ؖw/3_ux%+u bc| hHQ0JX0!8X >j1ŒWq>qx%ob L`?T4VHT --{whxA!wD=7,D۰5U!`%j}ƃO|U+bIC5,$7)9doB?ۼiB,Σ!e- W4y{)2 R֙3U80f\=N(g1 ڂx3HjHUu4DĵUxSWLC鬚0nn]ISzg?ց֟v9zUN~jes(/  -n,A.B{[(yR瀵o!֡QFoW{r*rJwhmZ9nUzgpI@O,F;dӜ wC>tnр?ډR,*EEA Эn&[ņTbDeq)[Lc kGkWMtE}_ 9n:j=Botɚtk ؐ"]AL?sS PJb֒$k)^kP2 i~{ked^u@F]Tp_gr/5YwRP1-`Ƕ[ -Z"PZ9`a>?lja0šM̩0v[/ $"9B_pcXMKMDMP 6jum0hԭX`#^ J+;60bũo M#tnSE݁IyNzmm.Ej^G}%/Q?O]sFHʤ4` iZ0 }f+C")/d -@n5i"aN Ta -jwC[rb;[췚ڸoyh2o"U@Rbk*pPsaIˬ9`JqZO<3`k̈6:#}G7*c56/M5^"̜nD)eԔADB*ORuiM"Otp$˔ةa,Y2'n?*yUcm;^@b%?(X>JSH9%/b@L芾W$!b2; - RbQ/-qmI)_ܭ6HmRcєm>fQbEvKAy{J6 -qN \S/`QLiɡX˩]xI 86Qs 2lZ704YǶ^6?{T?4$dTʔj@XOpkޟ^K TI(iר5fG/LgrB-L%`@T"pz6:A )s6R֐J{*uth)7d-R\e;1e+Zm}dBЧv,R/Ze¶oZ׆BweȢj~q+{HƶRWN[u׏ZM㤬3of#߯`wCu28t*]]fIũصTC(mㄼ0!}wCS莖R5976QtTIE]J p%ҝlt4W83ޒAՉE=zA9onE`Mq)WwrV!֍jղyƶj\f1PdĨkkVМٗ-x9u$" ?t(bE\%xr;X=rm5g_/m'w// ]VQH;,ntXCSBNH j'LC뻕uvKW f]X&V'sB7uKU5] -C ,o\G{$ᮦьW2ʭ1V,}~Mg|X,:_}Em>^54"}7-du`:JfWꠀh7%pZn5i4܂;ֹ:MN]fF5L5^P]`$м֥ ;65UUv.UiD9Jw2[]A,#`W/ -(=OץUU&/SZ܌{1uj"Qw2?twp }y4h$ov'5T@^m:~o;m!`Iho}.?cyh"eݛ$fV@,q{iD 6]I#8m7H\ N!]p|0 4B-u֩X8$~[kT`n+.P/.?㣏x}9fmVTϺr<#A>X$| ty̢pG 333>ì=$j$V`ߑgvm]A<c?&`2 -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000021696 00000 n -0000351873 00000 n -0000352004 00000 n -0000352202 00000 n -trailer -<> -startxref -352339 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6f062d5e-9dc1-49b9-a3f2-3556b0812220.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6f062d5e-9dc1-49b9-a3f2-3556b0812220.pdf deleted file mode 100644 index 691a4ea..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/6f062d5e-9dc1-49b9-a3f2-3556b0812220.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/7508a614-bd04-4bab-932f-2afe797ac8e7.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/7508a614-bd04-4bab-932f-2afe797ac8e7.pdf deleted file mode 100644 index f41c0c5..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/7508a614-bd04-4bab-932f-2afe797ac8e7.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/7fe9d89e-17ad-4cce-9aec-f72ca9a1cbbb.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/7fe9d89e-17ad-4cce-9aec-f72ca9a1cbbb.pdf deleted file mode 100644 index 359b5f0..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/7fe9d89e-17ad-4cce-9aec-f72ca9a1cbbb.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/826d411b-0b2b-4e56-b2b2-bfb864274516.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/826d411b-0b2b-4e56-b2b2-bfb864274516.pdf deleted file mode 100644 index 76fa159..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/826d411b-0b2b-4e56-b2b2-bfb864274516.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/8348a127-5125-437f-9895-592199b474cf.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/8348a127-5125-437f-9895-592199b474cf.pdf deleted file mode 100644 index 5b6d23e..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/8348a127-5125-437f-9895-592199b474cf.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/89f84dc2-568b-44d1-833d-177f5dc94037.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/89f84dc2-568b-44d1-833d-177f5dc94037.pdf deleted file mode 100644 index 4f632a8..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/89f84dc2-568b-44d1-833d-177f5dc94037.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/8bbb6c59-e542-49ed-b720-e9d2601de56c.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/8bbb6c59-e542-49ed-b720-e9d2601de56c.pdf deleted file mode 100644 index 3f0b2db..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/8bbb6c59-e542-49ed-b720-e9d2601de56c.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/8c0d8de4-8452-4ce3-9ce6-e13edbb79b60.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/8c0d8de4-8452-4ce3-9ce6-e13edbb79b60.pdf deleted file mode 100644 index 345ca56..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/8c0d8de4-8452-4ce3-9ce6-e13edbb79b60.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/8d38248f-bc37-4698-ae53-f3c73e08ad08.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/8d38248f-bc37-4698-ae53-f3c73e08ad08.pdf deleted file mode 100644 index 311cbee..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/8d38248f-bc37-4698-ae53-f3c73e08ad08.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/9589b0eb-ed23-424f-a461-d8e54c251627.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/9589b0eb-ed23-424f-a461-d8e54c251627.pdf deleted file mode 100644 index 3f0b2db..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/9589b0eb-ed23-424f-a461-d8e54c251627.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/9a748463-15d2-4cc2-b8aa-1122ffdae5d8.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/9a748463-15d2-4cc2-b8aa-1122ffdae5d8.pdf deleted file mode 100644 index 3ac31e0..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/9a748463-15d2-4cc2-b8aa-1122ffdae5d8.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/a23a0006-33a1-4650-8d47-098b6f816540.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/a23a0006-33a1-4650-8d47-098b6f816540.pdf deleted file mode 100644 index f41c0c5..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/a23a0006-33a1-4650-8d47-098b6f816540.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/a47eb098-595a-481f-98f8-5f9f91475c63.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/a47eb098-595a-481f-98f8-5f9f91475c63.pdf deleted file mode 100644 index 0bd8e82..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/a47eb098-595a-481f-98f8-5f9f91475c63.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/aa7ba1e4-d01f-421d-adb9-5b5a841050fc.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/aa7ba1e4-d01f-421d-adb9-5b5a841050fc.pdf deleted file mode 100644 index 0bd8e82..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/aa7ba1e4-d01f-421d-adb9-5b5a841050fc.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/aa7d9113-3d01-4119-b61b-777fa81017de.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/aa7d9113-3d01-4119-b61b-777fa81017de.pdf deleted file mode 100644 index cc1c8c2..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/aa7d9113-3d01-4119-b61b-777fa81017de.pdf +++ /dev/null @@ -1,2552 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 0.0000 -792.0000 206.0116 0.0000 0.0000 792.0000 cm /Im0 Do Q q 0.1908 0.0000 0.0000 0.1908 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -35.283 0 0 46.25 1.82 3642 Tm -(Di:83460 ) Tj -28.1725 0 0 47.5 -1.15 3591 Tm -(P.ROIOR:ARIAN ) Tj -21.5449 0 0 47.5 210.95 3591 Tm -(VMLENTIN ) Tj -21.0402 0 0 47.5 350.97 3591 Tm -(UNGIREANU ) Tj -15.9575 0 0 46.25 0.81 3538 Tm -(-R ) Tj -23.1347 0 0 46.25 31.89 3538 Tm -(PO: ) Tj -35.9232 0 0 46.25 75.08 3538 Tm -(:C3S-C12 ) Tj -31.9778 0 0 51.25 0.81 3432 Tm -(LENI ) Tj -33.9707 0 0 51.25 88.64 3432 Tm -(C.U.1./C.LF.:RO1879856 ) Tj -21.4526 0 0 45 18.6 1993 Tm -(SUBTOIAL ) Tj -43.7464 0 0 52.5 3.93 3317 Tm -(UH: ) Tj -26.2254 0 0 52.5 93.51 3317 Tm -(SPAARE ) Tj -27.8232 0 0 52.5 202.87 3317 Tm -(PRBRIZE ) Tj -32.0602 0 0 52.5 325.81 3317 Tm -(ESTIVLP ) Tj -32.7778 0 0 65 17.8 3255 Tm -(E18:2X03-) Tj -26.5243 0 0 65 161.68 3255 Tm -(\(62507 ) Tj -34.6887 0 0 65 245.56 3255 Tm -(6-261550117 ) Tj -46.9609 0 0 47.5 10.89 3207 Tm -(AT: ) Tj -30.6398 0 0 47.5 103.78 3207 Tm -(I6 ) Tj -30.2736 0 0 47.5 140.82 3207 Tm -(ENIC ) Tj -22.6023 0 0 47.5 220.89 3207 Tm -(MRFUYATA ) Tj -21.0127 0 0 47.5 357.09 3207 Tm -(NARINO ) Tj -0 Tc -53.75 0 0 53.75 11.8 3150 Tm -(Z ) Tj --0.035 Tc -31.9656 0 0 53.75 41.66 3150 Tm -(00:7E3 ) Tj -28.8709 0 0 53.75 143.63 3150 Tm -(6422 ) Tj -31.364 0 0 53.75 199.66 3150 Tm -(76061637 ) Tj -45.6565 0 0 51.25 11.9 3102 Tm -(AT: ) Tj -23.8736 0 0 51.25 107.83 3102 Tm -(IG ) Tj -22.4127 0 0 51.25 141.87 3102 Tm -(ENICA ) Tj -20.8675 0 0 51.25 221.9 3102 Tm -(PARFUYATA ) Tj -19.6462 0 0 51.25 357.91 3102 Tm -(MARINO ) Tj -0 Tc -47.5 0 0 47.5 11.82 3047 Tm -(Z ) Tj --0.035 Tc -26.8469 0 0 47.5 40.87 3047 Tm -(H00:763 ) Tj -27.8016 0 0 47.5 143.65 3047 Tm -(6422 ) Tj -24.9965 0 0 47.5 201.73 3047 Tm -(763061 ) Tj -25.6155 0 0 47.5 277.67 3047 Tm -(637 ) Tj -0 Tc -47.5 0 0 47.5 11.77 3001 Tm -(P ) Tj --0.035 Tc -23.5179 0 0 47.5 40.95 3001 Tm -(AY ) Tj -22.9691 0 0 47.5 88.95 3001 Tm -(AIRCO, ) Tj -23.0586 0 0 47.5 183.76 3001 Tm -(CRATATOR ) Tj -19.2489 0 0 47.5 317.96 3001 Tm -(AER ) Tj -20.9591 0 0 47.5 371.78 3001 Tm -(CONDIT ) Tj -42.343 0 0 53.75 27.84 2950 Tm -(Z0 ) Tj -27.7502 0 0 53.75 95.65 2950 Tm -(697 ) Tj -30.7535 0 0 53.75 142.56 2950 Tm -(54|1 ) Tj -27.4792 0 0 53.75 200.04 2950 Tm -(183170704 ) Tj -28.683 0 0 48.75 41.83 2895 Tm -(ED. ) Tj -21.8521 0 0 48.75 89.77 2895 Tm -(CERE ) Tj -29.0073 0 0 48.75 170.59 2895 Tm -(58 ) Tj -25.7833 0 0 51.25 11.87 2849 Tm -(RJNOTIE ) Tj -23.516 0 0 51.25 163.89 2849 Tm -(BRI ) Tj -0 Tc -51.25 0 0 51.25 219.89 2849 Tm -(X ) Tj --0.035 Tc -23.0785 0 0 51.25 237.89 2849 Tm -(FEST ) Tj -19.9163 0 0 51.25 304.63 2849 Tm -(SOUCA ) Tj -32.3819 0 0 45 12.84 2799 Tm -(PAY ) Tj -25.1525 0 0 45 89.53 2799 Tm -(SILICON ) Tj -35.8912 0 0 45 198.57 2799 Tm -(300 ) Tj -23.5477 0 0 45 265.95 2799 Tm -(ANTISTATIC ) Tj -23.516 0 0 45 412.75 2799 Tm -(CIR ) Tj -0 Tc -52.5 0 0 52.5 31.68 2746 Tm -(E ) Tj --0.035 Tc -28.5987 0 0 52.5 44.67 2746 Tm -(900:018 ) Tj -30.7671 0 0 52.5 144.61 2746 Tm -(642689018499 ) Tj -42.0273 0 0 102.5001 21.94 1845 Tm -(UA ) Tj -22.1702 0 0 102.5001 91.87 1845 Tm -(LE ) Tj -28.7803 0 0 51.25 304.87 3943 Tm -(FIV\311-HILDIG ) Tj -28.0753 0 0 51.25 481.48 3943 Tm -(S.A. ) Tj -18.6536 0 0 47.5 223.96 3893 Tm -(AUD. ) Tj -21.362 0 0 47.5 290.77 3893 Tm -(COMSTANTA, ) Tj -17.8322 0 0 47.5 441.92 3893 Tm -(MUN. ) Tj -20.6943 0 0 47.5 509.78 3893 Tm -(CONSTANTA ) Tj -24.1963 0 0 43.75 291.55 3846 Tm -(STR. ) Tj -21.3258 0 0 43.75 363.74 3846 Tm -(\(ON ) Tj -20.3049 0 0 43.75 413.9 3846 Tm -(RONTA ) Tj -21.0452 0 0 43.75 496.09 3846 Tm -(NR. ) Tj -0 Tc -43.75 0 0 43.75 550.47 3846 Tm -(3 ) Tj --0.035 Tc -20.266 0 0 52.5 188.76 3796 Tm -(3INE ) Tj -23.9116 0 0 52.5 256.95 3796 Tm -(ATI ) Tj -24.87 0 0 52.5 305.94 3796 Tm -(VENII ) Tj -19.8947 0 0 52.5 391.86 3796 Tm -(IN ) Tj -22.1501 0 0 52.5 428.89 3796 Tm -(MIGAZINUL ) Tj -21.7888 0 0 52.5 565.9 3796 Tm -(BRICK ) Tj -28.7323 0 0 46.25 319.69 3745 Tm -(CIF: ) Tj -26.8208 0 0 46.25 387.87 3745 Tm -(RO10562600 ) Tj -21.21 0 0 45 13.67 2699 Tm -($P ) Tj -15.704 0 0 45 42.92 2699 Tm -(RAY ) Tj -20.5019 0 0 45 90.78 2699 Tm -(CL ) Tj -20.9445 0 0 45 131.61 2699 Tm -(SFUNA ) Tj -21.7017 0 0 45 212.95 2699 Tm -(ACTIVA ) Tj -20.5647 0 0 45 306.9 2699 Tm -(PENTRU ) Tj -18.8722 0 0 45 400.8 2699 Tm -(CURA ) Tj -33.9509 0 0 53.75 14.8 2639 Tm -(E18:2\242051 ) Tj -29.6673 0 0 53.75 185.58 2639 Tm -(52354 ) Tj -28.4045 0 0 53.75 254.64 2639 Tm -(6426489007929 ) Tj -39.4395 0 0 51.25 16.27 2590 Tm -(SA1 ) Tj -26.665 0 0 51.25 98.84 2590 Tm -(ENAJ ) Tj -32.5934 0 0 51.25 160.79 2590 Tm -(240. ) Tj -22.5813 0 0 51.25 227.87 2590 Tm -(ECOFRIEND ) Tj -32.8392 0 0 43.75 12.81 2544 Tm -(LZI0210162112 ) Tj -28.7846 0 0 43.75 228.48 2544 Tm -(8646809520908 ) Tj -33.1906 0 0 43.75 12.38 2495 Tm -(SAI ) Tj -28.3853 0 0 43.75 80.83 2495 Tm -(EAAJ ) Tj -21.0881 0 0 43.75 160.88 2495 Tm -(EXTRA ) Tj -25.9464 0 0 43.75 242.69 2495 Tm -(35L ) Tj -25.7198 0 0 43.75 296.64 2495 Tm -(508UC/SET ) Tj -27.6479 0 0 43.75 430.65 2495 Tm -(60 ) Tj -36.8407 0 0 41.25 10.86 2449 Tm -(ZI ) Tj -30.0217 0 0 41.25 49.68 2449 Tm -(02:1\2540021033182 ) Tj -28.0599 0 0 41.25 269.64 2449 Tm -(642276E020146 ) Tj -34.5182 0 0 51.25 9.36 2398 Tm -(SAI ) Tj -26.665 0 0 51.25 97.84 2398 Tm -(ENAJ ) Tj -21.0881 0 0 51.25 159.88 2398 Tm -(EXTRA ) Tj -26.6117 0 0 51.25 241.68 2398 Tm -(35L ) Tj -25.9359 0 0 51.25 296.63 2398 Tm -(508UC/SET ) Tj -25.5211 0 0 51.25 431.68 2398 Tm -(60 ) Tj -33.3391 0 0 57.5 10.88 2348 Tm -(ZI0221e082183102 ) Tj -28.0742 0 0 57.5 269.64 2348 Tm -(6402768028146 ) Tj -32.8904 0 0 61.25 11.39 2295 Tm -(SA:1 ) Tj -27.0066 0 0 61.25 80.96 2295 Tm -(UFER ) Tj -24.0942 0 0 61.25 170.75 2295 Tm -(OPTIN ) Tj -29.7118 0 0 61.25 256.64 2295 Tm -(35L\(15\) ) Tj -21.2168 0 0 61.25 365.96 2295 Tm -(ALBASTR ) Tj -32.3836 0 0 47.5 14.8 2247 Tm -(2:8210113106 ) Tj -28.0742 0 0 47.5 207.69 2247 Tm -(7290014006522 ) Tj -25.9154 0 0 47.5 15.85 2196 Tm -(LAAL ) Tj -22.2339 0 0 47.5 94.76 2196 Tm -(CFBLU ) Tj -22.8748 0 0 47.5 176.89 2196 Tm -(PUS ) Tj -18.7772 0 0 47.5 231.8 2196 Tm -(CU ) Tj -22.3278 0 0 47.5 271.95 2196 Tm -(ADEZIV ) Tj -19.7692 0 0 47.5 365.96 2196 Tm -(ALB ) Tj -24.6743 0 0 47.5 418.14 2196 Tm -(12X ) Tj -31.6492 0 0 56.25 10.81 2143 Tm -(EL/90:488 ) Tj -29.9402 0 0 56.25 151.62 2143 Tm -(6699 ) Tj -26.6369 0 0 56.25 213.88 2143 Tm -(490919743 ) Tj -22.1976 0 0 56.25 9.89 2093 Tm -(PUNGA ) Tj -19.133 0 0 56.25 96.91 2093 Tm -(MESTERLUL ) Tj -21.0926 0 0 56.25 218.78 2093 Tm -(CHSTOR ) Tj -23.8151 0 0 56.25 311.72 2093 Tm -(30X65CH ) Tj -21.6093 0 0 56.25 417.9 2093 Tm -(BRI ) Tj -31.4072 0 0 43.75 19.89 2051 Tm -(Z960:950 ) Tj -27.3474 0 0 43.75 149.84 2051 Tm -(EKI09022318 ) Tj -28.3496 0 0 42.5 12.83 1693 Tm -(EST ) Tj -37.7998 0 0 53.75 7.72 961 Tm -(ID ) Tj -31.0173 0 0 53.75 47.85 961 Tm -(B/: ) Tj -31.7444 0 0 56.25 9.89 1589 Tm -(10A. ) Tj -20.8382 0 0 56.25 85.82 1589 Tm -(TUA ) Tj -31.2455 0 0 56.25 139.93 1589 Tm -(AI-) Tj -21.2817 0 0 56.25 194.26 1589 Tm -(19% ) Tj -39.8436 0 0 45 10.57 1540 Tm -(0A. ) Tj -21.3464 0 0 45 80.81 1540 Tm -(TUA ) Tj -20.8001 0 0 45 132.88 1540 Tm -(EON ) Tj -0 Tc -58.75 0 0 58.75 19.7 1485 Tm -(R ) Tj --0.035 Tc -58.2617 0 0 58.75 28.71 1485 Tm -(PZ ) Tj -31.4416 0 0 58.75 114.85 1485 Tm -(M1. ) Tj -36.8051 0 0 58.75 174.73 1485 Tm -(IN ) Tj -22.5624 0 0 58.75 224.89 1485 Tm -(BON: ) Tj -36.4314 0 0 46.25 10.99 862 Tm -(/4:0:4700110\)7 ) Tj -27.1121 0 0 55 326.71 1151 Tm -(CKPOS-CT2183460 ) Tj -0 Tc -56.25 0 0 56.25 607.03 3270 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 56.25 622.9 3270 Tm -(BUC ) Tj -0 Tc -56.25 0 0 56.25 676.88 3270 Tm -(X ) Tj --0.035 Tc -30.7249 0 0 56.25 703.64 3270 Tm -(9.01= ) Tj -30.8624 0 0 56.25 784.64 3270 Tm -(9.01 ) Tj -0 Tc -56.25 0 0 56.25 852.87 3270 Tm -(A ) Tj --0.035 Tc -19.3223 0 0 47.5 364.91 758 Tm -(BON ) Tj -23.0709 0 0 47.5 417.89 758 Tm -(FISCAL ) Tj -0 Tc -46.25 0 0 46.25 288.73 711 Tm -(L ) Tj --0.035 Tc -28.3256 0 0 46.25 359.67 711 Tm -(9000221498 ) Tj -0 Tc -46.25 0 0 46.25 586.38 3176 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 46.25 596.56 3176 Tm -(SET ) Tj -0 Tc -46.25 0 0 46.25 650.9 3176 Tm -(X ) Tj --0.035 Tc -28.8653 0 0 46.25 677.99 3176 Tm -(16. ) Tj -25.3634 0 0 46.25 718.64 3176 Tm -(50= ) Tj -32.3752 0 0 46.25 772.87 3176 Tm -(16.50 ) Tj -0 Tc -46.25 0 0 46.25 853.9 3176 Tm -(A ) Tj -50 0 0 50 584.25 3075 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 50 597.56 3075 Tm -(SET ) Tj -0 Tc -50 0 0 50 651.9 3075 Tm -(X ) Tj --0.035 Tc -33.7631 0 0 50 678.82 3075 Tm -(16.50: ) Tj -32.3752 0 0 50 773.87 3075 Tm -(16.50 ) Tj -0 Tc -50 0 0 50 854.89 3075 Tm -(A ) Tj -52.5 0 0 52.5 579.16 2969 Tm -(1 ) Tj --0.035 Tc -21.912 0 0 52.5 597.9 2969 Tm -(BUC ) Tj -0 Tc -52.5 0 0 52.5 651.89 2969 Tm -(X ) Tj --0.035 Tc -35.0049 0 0 52.5 678.58 2969 Tm -(38.16-) Tj -33.7659 0 0 52.5 772.59 2969 Tm -(38.16 ) Tj -0 Tc -52.5 0 0 52.5 854.88 2969 Tm -(A ) Tj --0.035 Tc -31.7874 0 0 46.25 776.62 2916 Tm -(-1.91 ) Tj -0 Tc -46.25 0 0 46.25 856.9 2916 Tm -(A ) Tj -48.75 0 0 48.75 586.29 2763 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 48.75 599.9 2763 Tm -(BUC ) Tj -0 Tc -48.75 0 0 48.75 653.9 2763 Tm -(X ) Tj --0.035 Tc -29.2827 0 0 48.75 679.82 2763 Tm -(25. ) Tj -25.8258 0 0 48.75 720.73 2763 Tm -(07= ) Tj -32.0406 0 0 48.75 774.8 2763 Tm -(25.07 ) Tj -0 Tc -48.75 0 0 48.75 855.89 2763 Tm -(A ) Tj -46.25 0 0 46.25 584.38 2663 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 46.25 599.9 2663 Tm -(BUC ) Tj -0 Tc -46.25 0 0 46.25 653.9 2663 Tm -(X ) Tj --0.035 Tc -34.2379 0 0 46.25 679.8 2663 Tm -(14.99-) Tj -32.8658 0 0 46.25 774.85 2663 Tm -(14.99 ) Tj -0 Tc -46.25 0 0 46.25 855.9 2663 Tm -(A ) Tj -50 0 0 50 562.25 2557 Tm -(1 ) Tj --0.035 Tc -19.9028 0 0 50 588.9 2557 Tm -(ROLA ) Tj -0 Tc -50 0 0 50 654.9 2557 Tm -(X ) Tj --0.035 Tc -34.2776 0 0 50 683.8 2557 Tm -(10, ) Tj -26.7305 0 0 50 723.07 2557 Tm -(15= ) Tj -31.8847 0 0 50 774.88 2557 Tm -(10,15 ) Tj -0 Tc -50 0 0 50 855.89 2557 Tm -(A ) Tj -43.75 0 0 43.75 610.47 2458 Tm -(1 ) Tj --0.035 Tc -19.1969 0 0 43.75 628.91 2458 Tm -(BIJC ) Tj -0 Tc -43.75 0 0 43.75 681.91 2458 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 43.75 708.54 2458 Tm -(5.53-) Tj -31.6613 0 0 43.75 788.55 2458 Tm -(5.53 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2458 Tm -(A ) Tj --0.035 Tc -22.0252 0 0 50 616.8 2356 Tm -(TBUC ) Tj -0 Tc -50 0 0 50 690.9 2356 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 50 710.54 2356 Tm -(5.53-) Tj -28.5573 0 0 50 794.6 2356 Tm -(5.53 ) Tj -0 Tc -50 0 0 50 858.89 2356 Tm -(A ) Tj -52.5 0 0 52.5 614.16 2249 Tm -(1 ) Tj --0.035 Tc -21.0765 0 0 52.5 629.9 2249 Tm -(BLC ) Tj -0 Tc -52.5 0 0 52.5 682.89 2249 Tm -(X ) Tj --0.035 Tc -39.7318 0 0 52.5 709.43 2249 Tm -(5.94 ) Tj -32.9029 0 0 52.5 789.53 2249 Tm -(5,94 ) Tj -0 Tc -52.5 0 0 52.5 857.88 2249 Tm -(A ) Tj -43.75 0 0 43.75 589.8 2157 Tm -(4 ) Tj --0.035 Tc -18.8722 0 0 43.75 615.91 2157 Tm -(BARA ) Tj -0 Tc -43.75 0 0 43.75 680.91 2157 Tm -(X ) Tj --0.035 Tc -33.1889 0 0 43.75 707.79 2157 Tm -(2.24: ) Tj -31.6791 0 0 43.75 787.43 2157 Tm -(8.96 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2157 Tm -(A ) Tj -51.25 0 0 51.25 610.2 2050 Tm -(1 ) Tj --0.035 Tc -19.8736 0 0 51.25 628.91 2050 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 681.89 2050 Tm -(X ) Tj --0.035 Tc -30.213 0 0 51.25 708.68 2050 Tm -(0.72= ) Tj -32.6476 0 0 51.25 789.65 2050 Tm -(0.72 ) Tj -0 Tc -51.25 0 0 51.25 857.88 2050 Tm -(A ) Tj -52.5 0 0 52.5 215.88 658 Tm -(A ) Tj --0.035 Tc -19.0521 0 0 52.5 230.91 658 Tm -(RUGAH ) Tj -20.6877 0 0 52.5 310.62 658 Tm -(SA ) Tj -25.2082 0 0 52.5 350.88 658 Tm -(PESIRATI ) Tj -19.8147 0 0 52.5 470.91 658 Tm -(BONUL ) Tj -20.3024 0 0 52.5 549.91 658 Tm -(FISCAL ) Tj -19.4211 0 0 47.5 148.95 613 Tm -(VOCEA ) Tj -23.7876 0 0 47.5 228.75 613 Tm -(CLIENTULUI: ) Tj -33.6288 0 0 47.5 388.64 613 Tm -(0808 ) Tj -21.6271 0 0 47.5 468.9 613 Tm -(BiRICK; ) Tj -26.8317 0 0 47.5 562.72 613 Tm -(OBO032745 ) Tj -31.5442 0 0 51.25 162.72 556 Tm -(TIPRIT ) Tj -23.0709 0 0 51.25 268.89 556 Tm -(DIN ) Tj -22.3564 0 0 51.25 321.76 556 Tm -(COGITO ) Tj -22.2966 0 0 51.25 415.87 556 Tm -(ERP ) Tj -19.5136 0 0 51.25 468.93 556 Tm -(WWI. ) Tj -21.1535 0 0 51.25 521.78 556 Tm -(COGI ) Tj -24.7121 0 0 51.25 575.78 556 Tm -(TO-ERP. ) Tj -18.6521 0 0 51.25 668.81 556 Tm -(GO ) Tj -31.1552 0 0 42.5 788.91 2006 Tm -(155.15 ) Tj -34.7994 0 0 42.5 790.78 1748 Tm -(15i. ) Tj -31.334 0 0 42.5 844.9 1748 Tm -(15 ) Tj -32.0316 0 0 42.5 819.66 1697 Tm -(0.09 ) Tj -32.5188 0 0 43.75 806.8 1593 Tm -(24.77 ) Tj -31.5624 0 0 43.75 807.8 1541 Tm -(24.77 ) Tj -21.0452 0 0 51.25 703.09 993 Tm -(NR. ) Tj -19.5035 0 0 51.25 743.96 993 Tm -(AMEF ) Tj -35.7727 0 0 51.25 801.08 993 Tm -(:001 ) Tj -28.4541 0 0 77.5001 431.67 932 Tm -(90002214982024D02818480721100293 ) Tj -19.6793 0 0 50 232.9 909 Tm -(DATA: ) Tj -30.0086 0 0 50 312.81 909 Tm -(28-06-2024 ) Tj -20.3563 0 0 50 458.79 909 Tm -(ORA: ) Tj -31.196 0 0 50 525.91 909 Tm -(18:48:07 ) Tj -27.9768 0 0 43.75 852.02 1489 Tm -(12 ) Tj -21.6742 0 0 43.75 713.81 850 Tm -(TD: ) Tj -27.8567 0 0 43.75 753.7 850 Tm -(00665388 ) Tj -23.7415 0 0 48.75 753.75 798 Tm -(OASIER ) Tj -0 Tc -48.75 0 0 48.75 850.29 798 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF"ExifII*  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw88"2 ][i,ϩC?.t>ƾ"|ށ~(;yzt&\ڌ .̇ñ\esӳ*.  UebHY*UDBǗcɌ.3V"deM]|RI10DP#̌dWc2CnjdwZ̺5% Q -BE@R) ,RT(! ShX2hf  VCĖd*Ḧ"  1bd!@[2c,)1 A,2"rfV,y] 7[’V CHiYȠLXbVTIDh.* s(`{aDuLN1$\&BR) !2,$2pʎkV.7$`a$c( ,aAI!HHà! $k[(@E%IPc "1HEȖ%Y3Y}LRI)IEhQT Dh ` ,1 -fɬMLkdk0Q0m:2weWD+T|@{јij[ʾC=ugi^=ͤo+>j>WS˃t}+}+@7g$ dTY!C%+)AU! 0a$G ύ>\Ycl` pB"HA$aa -3cEc)FC ms$#BX!1&\@ *ĘlYe 1YkfIREhU$ T9 v5u̮W! 1!!"hR#c" - l"1HT*%4Yx$$V$U!D2E rT`", -ep¨ B&LC4ll f7Y#bu(549os} -3:c#PA$B!@r)W"q15+B !c=r x)L쾮c#fG2bvʨ\VhD%e@<6"XCB1RA!$VR@ #1AH`HBD+$0`AXLĈ̥` |X&<[8םyVA#)Q$$ aJBAW)F2trO 嬑J;cdb#BEJ -A G !@4B00I AZH BB"q  P@#) J" -Eq0B: d,=ir dC h) Ch "I 8cY LDHI!ʒH $!$)Y Y*:[P - Xq16*r,bC-E  $:Ȭ~ìu3rV(WTK"ZAT P0LaPP$Ej+ N,He00#+ȡ`$*1)ؙS EXb(ab +YD)Tca #@ a U>AOl<5ՓWg"P-*Yl굞էd̙ud 2>©_-vqU_v w+NJX  oBi1n&5SjV;ꭏ!uL=_g(W_2@%hG(vDL(B%^6]d+Y  D)TKﯛ?&Tlke<&baҴWI<د:rz)y-\C_6zpI `2BC R$,b@ٵhlX1d|,g82YTDȫ:BQcz "E+BѮ:1(/m|5vZ*kq:LNsBT@UcI@)``@CK! *HH x1:ʮB,Y/yuTtz1.P$0:C"@ b$X@  @CC -  d ciYD X&<1jIdIA͑3V1&Ȩd2jcuwR\}xQflpDL.ȥ -$`ȪdTK<-6VwwM1S#J`ŕ~}>)@,Wp{)K`̆W +D ,ȈUבg^ ;jd_V[ D1 !e0i1IjbzG&E# *IjKbcYF۷*;V>2  FL$kSWӺ$À<ۗΪi1vur13klY cU/< jaߐK@#^aMX!%j=N%s= P47x1kzTS:tma򐞡^EW{:r -&1eԩw|zMVpŋDV?ٳ6네K鉗X2QW4~/ xU߯,0[W,lyժ^l"]yws/Ks)%*a$!B8 0*dCM1I -FH!bq<2azˌAU]I!FR"4L9 JkӪ9[vezG%z&Ŗ,2wɬMLan]|oB㕆7 1 +IA" `0 -221Q\keH0A%g^pH)SnB"! `#rH!I +,< M!W$Ta@`@(V$P,JݜˑD zh&Nzmby8] /&@A. F WpQqfI|y;^5Yuc+cq+W -Mu+dVX)жXBFBioӄaneXDȁU!L)7 -0Gwus*QY2 H'fR WV WX@,L&s]Bl>ïDِ,Gɋ*dBGWa/raᖒy7V;  -C!5Լ;wgѾȬTbe,)ьYlFI2^YBeϢ&c,VI 2J@.@]r,XAJ6҅ԛ5 -`fl+,`z57t-5ޤr,b3rWYXI (H,$ -d|N, c1Dc*Qd0ܠ"U&c $r*C% $,]JH!$ bP,0!XB+AAZ, -T^Cq&C#c*!cFlfWLbQS"F8VVEլ[U$*:$ UXV @[dz^7SSשrl~VשTRK&g{F>AwW@cȈ* ߷[ߠzGj 2 I_?7"[իG{JηN: P4V 2 8r(=nPj7_=$aQ ? 'lc}ҵ;" !@NoikcGB-YH F82VMبFh3.K$ -c˶q\k欯"eɇ%1XjP,μ٬u>דb#f?C~*ZH :Ϻlz تCй"^aiq;6uVo۠V[,ggǣwy D k:g O}ν27<7w`حB? /C9~!#OۼPIZ\ԩ\huIT -yqseLk/YJa$4R3E@c8`͍ -=HBBe[Z3La6Z eDVIͥs_-o;7{4gWSfur$<8?[e %cf+UgwУ!SA X4B<AV0,+H $0 -iI*BI $ -q R0I! *C 1LI DD 0*<0uiH!5ȄGIaTQrc GuLl @2hcȐjBb*R*jv(X}U-|٪V($ .}U41b@AEr.jjV -C/qLy)c -+t1pl:˙7F3%Dˈ(21Ȱb"y@$WҸl29]70`CXȐ1nKl"AaH `qǭW4[+c2l!]c[u6ss뽙r{2Ι6ݔ+&68V:o~bhxCYک^2(WSKlIrSTAۍ}j_ۣP4EW+ uRf[zWwC8>U8>\!`uh0Bz:Bou| -Kdaj1u\" -$ a̢?V,[~/ٱ:xUm+Ot)[_'IRstDe(d2@I$0b#1XD G223c0j -4" ,`I #'Tlps/`T֦ߑ*y9.AD -@5rŷ/Z\BNWR2 a#:n >=k.byϣSLK91eEǛCɹ\^VoΒ羃YS.\n_&&\d{ tziz>]Ő%ddlfHa(ks-EۻCOPJup.^ :yf5p';:{\,9qy-OpZ=(ttUPHPd5jvtH !$dj,84qM$HF a -`HTG*ƥNδeDߋ3HE#+&sC(_P2 La6'HZ=`!MX+aHys ;@HHK5c _-ٴYdʇ*,[Z{N^E`Dt$F!`c u;)0B)BLp}ב@H!$$TD"@IH $"e*A$Jb0$R("!`@`I^d0Y ``dXqljsa( -SdYq(Zb *DeP`bE1)BdgƨC -GQU(1[ۅ^}Z5vżu "TCzXC!ݩAǕWA*B.}z3m!z|^@Z`2D)V^IG%2**u$ B _Y|&ª>wц<^*ݟ:kyA$&2*C,ϥUK!rǯ  K$٧3irkIY\dhcScY6ug|̧3&J؝X1L]cI -x 1Xˣ+;H LҹSU\XBDx';]  Lkv0B"HeX -T.*ECdd+ #" -H()X2Eȶ!dXƲ,0ەS;mjcKObCZ  W #Xe)*dtk OGF*Đe0r`edz2HiRnYJ'kCЏ,RnT(n"V,w2Dt``_}Zg?~Ij$:!.5k'Rx)e82`)d! &`FVQd A(0R,"Y$$Y/0=yY$a6%XK$$$K$R1  `k 2cr D %2&CKCUR eUVQ1e e"0D+,)5iE&<X_(?>JL\yaHPWU[Yu/Ov˼Bf+YDBd#  -UQ@$ cʭTJUQ⩐2WJ2AؘdˆT Ā@I2cS>5$e5`+a 0ˌe_%o4"5HLx羁Aζ,ܭEdr6tؚd;K/ z)τQfHdrD؊[=z6 Qd -H-ޥB,0Q$ f摇e#Ȅ)#49`S @YD&DKu}[d2@GǑ a dY"rc! K3Opg:ek##HHTV hr`CP4a*F40AqEFQbY0_TW{k1fyoGVdr)-׭8OHlYrCJkɥڊhdS]ZaqOb@J0HH``#)cc0#4 - RB2 YH_d*yI $!$ Z) X$I @ZEb"Ae!F ( -b@ H Jq"7Y A S!F2,EǑe2TP -"Ȫ`]WhaL)1ƨI,F60ͩ5|]'=GRsmI -aU_(w ,EtJ(ϥɎ2 QHPm%h @$0B0bA40$W-Z*H[7NZ !B^rlwwZ6 eqaveR1@LPV-XDfX@JdP$XFRVy/:2B  LD$R!!E, 0I$D@!&ԫgPc"F) - VS!Pd+cX!qgǕ:Phy&3+* j隐gz?cTln+*RFoa5'S_'m2'7LnG#?B^9`+ V {Zs3XH@ '#ߜ]N1r,)"@A@  }O}t !U 7{/F:zW}z~6 Z2@IXW*~zo^1ee as̞u*޷C7Hd[)6'e(~tӶWf9jW &VÑ2rŶvx+*Ryc  OWz{^eW10$`L$e6C*45ufYwD2qACAcA!Yc)yh0Ń rc\ԐV(!#  BI+K`*B`#)$" ! Bu!RIb$A$ &<^nJD2B2P@!"X,*ƪ lUP+yƙq,`,1d*RQ`> `lh=->osz:dX@r6*]}o+ն+f¼7Ƶs'y*e2 aAL|:94)2b!HC 2Hg 6ͽVo& -82xDz"P/ܣr 9#I a}^8_c,x^Qԣu8wd&L,Jd} +^sԩ -0Ho?M yvrEC -*WO[qA"CA$h `#E#@A -+$ g ˌzK`͊:ivQ #A*#3jgEyVbxz;ymn] 5̽2&s/v['a((UW-swQ6A%21O -AҘEPF ID`aA@bJh'^dHE`,$ `  !0D"BHA"!#Sh6(flYEVSdƊLF3eYV)I -2QFP$7Ac"Lc,.0 TJ+$ZEdGX9K3>6:r:2WiRJ4w`H -A"`̧ n'h.JQ)$$pcGcXt8*XIY`E(h$!"ٷR}Z+,4*P~uO=(Z.B1w[7nXD`NbfՂx&H.`r9ܜu)&XöMq|V2ʨ6L.^,$A!'0LbL8dej:)I) 0'X*HdA##H - YPU&X!q{ݭ{Ks6P&H!$:H q400,x+F#) h0$!!6j]]6F @59Q:Gt2$ьd{aߘ!` 2AX@" $%`A#I!(RBI!`"u9`ϣ("I  -Q:(&:V PAHbp(B&czb.Hva1X*4t\ּYq;Q YXuvf&LpP+Uжӑ否Z:+)|(bu>6=% !@X("$R -X -D cB0BL7mlre #%H`bUm[XX^0BA!Ay`ZaTIJ(er!!nWqv$2A=Y .{mC-Rά(uEL#cs7z Bc(~Wv7\vSf`כ2i` &,s}G5}\EE2 @ ZPaC+B!@a$$ 32F nO::axA T$A 0:>5H!05ɮwy83\l٨"AmjK'E~mާg)}t:{k.%+ ,2pdFPΫX,I I+k^bM%2ǛdHA$WPCFt a(Y!ri0 k|&9GcMjź+ ZtYH)#ՖD@dA E *@ !0DA -bT`$d0 *HDU|r&DQtmC*"1cVX`p -DHqdJ2UlphMΟ_v[eUFQQ\*CuG0 -D$`)LݛXIL1$m"vi{24 !H t!0*@@ G$#D y;տח5kRhq )%ٳT;f8) IY!B2H 1`HaCIC $Y H $Y"Lzr/ -ªR $QH\|҅ F(AQ@@L2ӫUϏ*!LpAYV*_שRd΂2[ǐuk9;:zu'4}GNgԸͅpFP[HUܳԭbHD TC-{__hw !E(;~d} -O/x7bFHA (Lr"+'zo*k'<[2NH$ 0gW霺m]$WQIHQ(״x*v|`B{YpǽzlBCŵ\k3cyyqg:ͣ\pwe@pҩɯ$ˮ&&2+w}Zcl>jzy޲ !P`zY^b@ASUԬtrtoG:Yb1V1LKm{NR]ˇzZ#) [)Rs8ʥCų7nx˗W:f|9+3azSzy[ws܏IR|&В 1NbMOC͊ YI08 8Dx2B"xF1`h eG$. B1jy4 b8R`H(qutAڡIk'7\{j(mcXìߜH`*4$*b $dSny$1<|)_+Tk0HD"Bc Y֬J !PE0Ude1(@@ *oZ@!UQdn/ b3d Qd8W٩5R>sdŖj6'CnVyߢ(w\ *^m{E '1~HU"`I <c3蚇k}Ŕ -`*CB "@&o1'JO*j4!XsGrʥ/v>?Xx Dˀ1ϻ֬eZ a!RةSʮVI^}@KR@ I|qv|Z쒟x0ͅϋ-E^8-Kbfǖ28:7(w*l:ѵj=bVwLQw ΡzTI0a%E0@8D%B@XCCDHPh3b0HD4dYZ3o:ս -0c@ aF Aƺ+ -5m;R2cEPX7W -zU}`Aue!B`ς52Tg[盵|!d#@I #+E 0ArR;;UzRJnRѲqv$$TY8{²brp1=sCzz5R.&LZ.-LsZb2&B:c>}yQ_èzY2SDH@IzV)ǒv!T* {C !"@RA$2BAI#l!E R0 ,! V\Df4%GTBBTB Bpg9{: 1>,fHD5vRюae,hs +Ҝ-v3L-[M%LR"F  !RZV2$ ȀR;:[~h_3Wˇscvܭ$H Z*u(KIBBV#a9Ӯmnv;fRPn4iŭ\w+ijuޏkk-%Yj b$$(VBD¡$VRCTHI THJ//+Sw3$,6<:zJV‚P" ZgySH$C" $Qa -1nht)$!e&7Q*,dUi4vWhofyQq͊&4Z[KRܥ.S:ljHJ" 㾕УUkv* -®J)\{'jrߓ>ۭrX1$ͽ&-ED/ n^x!LPd `fH*B -"Fs.x_yg}RM1`D(`x}<{CV>RC I DL -[Ԯwyb@h &o76epA$_422&6y1n`+>q@] %J<e!XF %I0 h!r -e!XdE,V FFB<4(#) $@$`)PˀUYΗ3nTeT7} <}:WLUC|#P]ٽeDZut&,22[#@I$S R2!@¦EdTpw8Տ.'BRZir;ԫ/~OHޔ1 ֕r)eQ HC$WB+3cʕ^_CܣU,VBUy7D*gWSp>l1ȼlG'V(u"*TCAYXS"I!$JKƭ{4gDK*E ZZ(+lۤ!×n[aJS +1cYl,"(J1",\c< -ej&D\x$*H2 `))D*/rz -P+ĽׇٽǞn]́р $*ioۏ -͖HPB)2(ʙ`JB -@!׋>SApт qd cbAH`-VGBu1N!d7ƲscK!ezǙ FFFB" ܻ 2Dj1x 0h@`t0`@Jq`!L 0Vb  DeC!HU\Ah%Xq%faqCi ]! HH -[cXUmڦ2#ɭhS H@SsJ!##|'Ac%D"#1NCՖHҬ20C.tG!FXJ){Nu~YSxNtU660nB ̦ -RPZH`  !P+"xBq8 lMhmYhw%fɲٰy Pףz]HH{R`BI$ JDHA $Y!EνaKe"+3*65\iPf.6&6uF ꩁ3*$2- E  J#BT*ŐPQb"jV:@ǕD&6AId)*Ȩ+H)(ŗ$P &,kck 4F,S@dHLy1VT%I a$b!"JBHV $! :2 :X!2+"S$$$R:1J$Fd(X! 2u(筼Ғh eeBbUVǑ$QKdr XHh%d$&D$Z,"$tK@d!Ii+ 1 )TKy<ˁ2`l FR%j9!65*p+cΘV A$Vac((*@D*gndrb&6F'XI1IND2VXTiX"0DY#^;vηC $R^BT,EdU$HXd!JV ) d XA &1U0`FRA$!²!8d9VSi Sj2*` +0r e9bc2Ș-ц|l T &E>9&rRZ̐b!F%HD!+DP@#LqrnPB1 P$ J%4hC !ɏȓ$ȦE% "$6 cˊ9zkW -cɎ\@ OFm4[>c=C7O,'O%SmOkFѠ|U} >+Shqß4]H@G"NgLU 1}lq:ԵSpvYa HDb`D20]Lk{%+@LX\W段垝f6:^Lg]1+T=HүW)- oWbΟS鍢p$ $$(ZY"@GA$QL!E,0(+e$ T@T$D%D jBEHDG,D @" B -@R-o-z\lY3cF #,Ve5!8!dHe1XFՔ Q8E0(cAAUS &BI&9UQ2BI$#F+0BH&Z5ѩI,h !CǙcRsdeedH޷?"Nd:yK]sלhvG; 옛"n5z4d$ @< $h`1-;˝W4 +Z@1X1F@C 2,  2H !Lyp(:n.nw{~rNTشV6FOcewi2+z+ߑ8` @ $D X.eͭH.䩑ua PUȭŋ.+]UcZcQY4Nom\H C$FFBDGC@d <#CEɮrzLYJ$Ǝ -(œDV찡*btYc  &6%ljl\:cWBI@ 2 FS "`P " WJ5I"WU%I$F*$"Jf THE 2a(,&"2gþ2AU*!!yM.l!2E!2E4`$*X2FX``VdC$H +)Hd)!G.H 0JBf%@Ԥ*d$0DAdH00q -*ĀH2 2VƜ7O"έ&.,\֙- -d4=.UdYY`RW]K.r-o lJG/1&bD1\\6*oLzB民j ʃWQb 57bQ{57;{joQQܫׅZ@$0$`"05y.uRlS&~νfɱf=\Տv$#NjNq?/<0Ȃ*Q~(AUG,Hdh6u+ɽ,i"ꍱfq{q.!ƫojgx `Y8Ji=;l&0cpTfRU *Y UZBFUMMiHjnTuWELnΫނqY#u! -EEY uqعq0 -00DC%@I!`@ X$@Z*Z m ,,~@D G"Qlm]h֜ jMZnyGAbCE$P[fV,&gWط?cm`6t3l.ݣܐ.>{GΦKxدK1ץZ<2$=sGD @$$H@QYC\X"&t\*nhmioח~U[mi+Wۣi\ݓNYV*ݗV,jߓ Kyۣ $,kSЧCЇ@C -!D6:ͥ1ύ0ÎTWAc%ďdGpUB\ -ejvF>ξś]^_OY**:FB BD2HH `("e * -20@HLhmF0+0 $ X40Y K: p<ZE-'QN`ŕ&XhAd&FYM$$ ,5U2 -`BrEebIA,Ar)$WIIb+Z$RA$$0J$H‹uW+nVZjzco܊d䀐@h02yQ5t9a2y/V *^\Bu3x]j}sg]&vmtgp#2byi}+xEzEyɠ8"EI&o>FQ  - $LHQ]Niҏ^ˆ;eJLvzzy=' -z<&zgY)^}q|wz ! -S U1<駧fƀ4X* -'+-) "Il12b"69W|q> *p@P2ɗM62_CydYl -ȂIR@!$!D)S"Q1LA R #A S, -c B) @ZL5ۑv0$Q*U9$"A " Xvl֖C2MGzڍpI6yb,$,Q[:t[Ҧe2fT22Unydj喗"EfGtH ZwŔ)#\E2BIC$e`(2c(`$S `Q hI -RRV -!@82u dJgH$A Ha18Z^v/Bi_g[4ICp,F*2pMAe[=X*{fiP3dF` !!2H@ -m·L=T'ZMfc5"V^O_S.uB $H@ I |~.=C蛳"mك=Z#ؼLz!xa l+6h wS',Z9oK.@W![n';0;A3& ei!Xk4㕯ZxsnI QuBNԶv\"]I/q:`P(! 8Ik:w<};X,bbO*׷fZs';=֡͢{K_4qƬ3`%0 +2.{%tۧ qlf=LB#\F#Çzd@+6U<ˣ~^eI-?HRTTes.lF䧍n{4l^?x!X1IcF?c}2E=Ww(vKQPHcTŊsdd $mGO*+aVGi #2{?NU;ߞ/<{S,L`!0Ԇ@Px"8 01 "b, Q)+ XD2*uR@ K0fZ!`*I 7:=7<0C.9@1d[y*xP2d+!*i؊v++LӃv>DTvÆ<߶W5Kv'n.zխn.LYroWf;Br|#9dE,0hE`(u@DM]>wr:X5r;ɐ<]KUK9y"UKiB(ȵ;w*gr凷XEnt6 XC_Ƚik"h쯩 P@[: kM[PT{&/7H|~%K2ʆa3/EQfG5@sj}2MK_@@%>*^s\]ѶݸbƿX^/W}?eXBHE!ӡ?wDB$HQ:+TZ<62+\7Oד3.6[vy~yORC $L D̏L,Rw3Ǘ\,ܲh9fnMts/>ܓrCEF]iE>㎸&VQ08}YB..T. P h2޿hW{4Qʠt:ַI]%Xp_™1y37+vR\ϕz`sNWn-{Hv5נy=7yJ]PDE`)(\{{by{p D#@y]>!H:h>"o[I$BHaK -ACBV*t.ВP 4E` ^y&*y'f5ޓɷ0IPpi~r:;5;^_W,2jyR޽'z^69UFr:N1{|^u_p#Ce_?{y濦,y R#Ϯ5^U+HHx Vkڶմ HwS"(@ kr>W>i'[6zIKZٰ厄DNl-Bu/>k9,)eJCSsƮ}K_<9_:"0O==׻@  R:$WZ^ıPDB!V! (x%p6u~?Sz<[V56LqgDeQW!1AP@T"7X@T*ve䷃˖"L5" ꤚľYh$[uPh+ S}J"y*WAy6>} -6jgеm׫80h_ty;ס$ HN%/.uS=oϺ)|R@Iq^?Էյ:7C0`5)c,%=һWMbyOWѠ -7?@>ux{Vlz[ DS#$x^u:+˴ςfvnIO1<[=O^~/hz'lڧ0KAb4WeدsҧۗC7—Hsst4-˗ՃSOUJ6[O5E|O-}W -=K)cQ{۸/:Pdq$Lf @`(1#a$H)X !$0fFS$CZ"6$x,2Db!91<4R VE -W-{{G\r$S $[<D7O8yL_9ݽ9W< |wղ00bQxr7$u~Co ,r#c'3HQHJ(`<뭩ӠۢΞcx ) 0ELdfdYYbzeu{9hymt8׮vg&CV_?6.CKm+JLiPgf"lڲ֖oˊ ,dyZH^{?πcuǏce. HA(wOVxOK cPZ(A\yJ61yǤb{FV#ḛvl)/سc<`X>G@.^U P4I{F*bRZ62I A ' -=7@Z&LpwR _RUU42T00qdr``(44璧C"F -a`Tbˆ^E1jpVę.(Hֽ^眨E^Z dJ;Q8oڋeƳjn14Ci%׸|v2m˞@9P5c$ xHsxcx+AyO>Z:5J?()7l!*Ti!QZĔǬ='{ioڬ[/})G yOԋ~+\Q4vދ>&ʴ\hr5P٣"4I랞)@ɂS69+2ű$)`b>qĸp*fn*ީV/\,{Qf< -D%P[1X__"_gf=UJFlc!*ZݧWgvz:.rI 2H(!+/1^}NrR[מw #UR$Y  _'_=^ zZ"U^f/9Xъk#|ίO$ f˫W;&_3%oKy侓]>n,󬻤w맴ioIu^7PXB> -,G^VXg]xu=Fj}n@ -eǯ7z<._RPFM]ihF_FM*ed#2J910큕К eH4ŀD"I$+(dQ+k #0R1H;,V X 0I!V X r|c<;tDT|P!G{vŻ~6clI`z-KO9y}7u+7{33TaJd|Rzj޵kҟX1b` a# -C$Jb4-}+69"$.E D  "D``n.mp,]G& \ ;9<׸i':a`^ڻlA$ !#)*bgV˳WfDZey}2FWkeEWՋY)C0؍|&LI_^_|kaH1PWȄuk"R"(@`4U`$2J1Ɗ^]-)|c=~ e^?Brn(`ɫ?Ti@ti0ffGZ]P9s=}]{N T010wy [z= DF $xI܃^)o "4*Lw/NAykǐPO͎RFn_*eB}CkegrLW픺KWgmWltt7v ^aP:5^礽=z͗=F<7חcԯó5 Sp;uŢnT2%3ֱqka0cP&[NzD@d T:"pw:WJfד<̾yGşy*W1v10yy1h7>nBcl{{˅ky@!-F -!,0VRN"J|zbN~8*,*TEaT{Pk.+zYNT} ;`Q2$1cL^uNnpgЬr<ѓ.jZnjrVIHws\摡G/"ƫ| -{:|rs9EdQ ԛ%)cS<Y -e/ω˺%23c`(|չ1B\~Ez8/V@оga[z%x6\Kd7"YAP8)e( +Kv/hw5˯R$scK9ǴR5}VE\pA\_K#v{-|Yzڮv.16TeǯۼONU>˾E=PE?=qm;ҪbL(b"e5:V;--.V:m:loѫ'7^-Mcϙr,U._YVvLu'Fx_vwGa]޵WV.?oG*5ۧ|٩32Okԧz2='{CFB!LU eMXq]kՋ.ZS/T-އ]cBDt8ysg\+ .fO>mKӵ q7<_zχE͡dBo[4JϔkX=n?c<;<ݴ[|z\^qɭO=9ܽ{ f#nҕZjbQ/q=;^Eޯ)qfǟ./4̾u%j1[U+zb_Fԙh1.ͩ{cLѴҮ\ӷ^FPI$ \PG0)V4V X;!EBFE̒H !ak1abCeF2D7}Úc~z۾:UɎT@HW)ܪ53fMG66yNGqp=|}[;TE.HF0:"&Qѡ!$V$@H`!02%/KpV$B0 `P€2#,CG= ys xƅӾ6dúqSvjwv^ĄӮTnnW^i2HX/ $X,"HVXI!T(d( `FB  UhP+]ס -p2vA4d$ _#)"P!|+gҪu+МЊ@TȚ((y:ɓWFe SlQ{2(ؓC6K^:fJl9꽯l1&Z@] ]np6zKwm]L|%e6 =2V%oyM -Ǧn<<3[au;: .c$(I>1xp\Ja{ޑ澡1GXuuVlXe=w~OsLgjܫbbצۓޗǰr<+=+ͽIXټXOwVǛ ǽS̗5f{<'6|^c3&xaK_y};OL;7[^]ԲEf!枧_U|輵ZٯXPoQ8]YY:QX.dǪ͖NxFus!8X^7kN*ܳ' 4חRwV5,a3x7tznȬde#|y8L -21HB##,a*̼ ŐzY)dju XҦQQWЭ]!K}k./>8a$^o Q(l᳓γHE RdNp%I! -7 b@a ޕ懤e)RD$hyVۛ٬XWiZrB$26*"EFR0*b[foc^#VoMٿyz c5T[.[ePNj.@&I/[7oO!)$DX@Ee@HT TˡFp\dI /_;Lutv[ PӘ!P$(U>}TVQb U#QQԩw]EGҗO枪]iэcV4emiP@ublU`h&o>x}ZTCޭ2B7z6i<}O]ŜItKT:ڽRo >S];[tlygBS"tq_>j}R>B4c"yg7XZoxd2Pwd^?k u6O0^OٵqȚ{:5x5_ГgfvVۛO>yw7< I a`E&HH@a!"I 9R@b0b´!$TȑAW;jNjw$TI -0FX* VVt|WѺ羅)Ll*kےnZ.Tx6\Mu&EJIߟzSY$hA$"Ҥ 0AI.}ËU o,1! `Q<[2cZpyv䫤YP.\~xzL|h`@A~O0|<iN,*((AqJR- $ʧ-yoDX -j"TFƼ1yÒF$ˀԪջX͜{|ԕWtMVJyWv]V-= oo=?Pkm-߸yl?g׻G;r"=`t3J\k_ҏ%XI᷋ O=߬t!BY#$UV>y7 -WZ\`I֧n"ϭkKUjK{OXO(GwEz_/f!χ5o^S|D\iR<:힅qrسFmlyyyzbRz5>yTzygZϦ?-s8β!*~ƭjݸ|dZn}2.5(ޥ-3i6bzF} JIK x{_D[G:=$ F *da0brx0S" -U@A!FRG8$>Gl8S#+ $AYJ|L+T/<$&?7AY6$@ehvR|./`J -bT ZNd{}[ *(2&5eT $*X܄킭*8wuu -J}mMGsq>5XZnhTϛVmiS̽CHͫo:UN'QS}[|֌T[EsB鐦ZY7ݚX|[udW:wΫr";~-ӓ9]Or0 L:;a[[3yxWY5$]2yNUUE4xR_ĞPkkz:Uf\f-n*RkE z6Ċ^k|C]Jsza{ʮk+fV-x 7תzҺU_N0&f-mL6<ˆᢵll3zʟ>[ny-szx4gNsՇNZ7+=}fɯuأ.֞1S];y;*]:{rq)^h׳uGKwNˇGeeH`HD"B Xs*m !2Ha$1 ,Αr&RI!).qƩOUNw۳v$2@'q}w_0V)~83:Ödk_^<9pzk/=%1mUF?>t׮vزi9*޵HZ3s:vO(mBr\uέgu0짞z^^=TrݚžDW!eŖyz[#+ H`X\-x`*HXth6Ly$&LYAHH(bRp>J9E0d(BI NK˗ݏq~mybukq+@[q7sm6moZM}Ğy=#)c5cϧbV"$,!RHbReŶZl5h;xcF:;U[lJi-,z^ՀuHvM>2HHI R "3)$, ȣݩWOW[5TZkM}|˃b-ˇW 4vy3&U[Fm[\դŇD[ -=֪[гVBǏ&(ةBZ[OY:tJնj^w@ONfDZ+ںr徜d\[z}UmByPENRH{,^0R{kd5OymJ"ٟgb{&Ş;mT-v<䓩9#_>}*Un<Ҩg_D%9ǏI&UZee)^Wv%׏ى]k-5WGK> zgl+͏^oTFVdw͡uFuȷWR!hPh`̤iDE $ c{\Ȧ@1VF+ 0B0Q+)Vlc2SΞKElޘHLjCZ(^j|1nUSvcyOrs3С JzsN 1WK?j%%q۱DfzXx_lYBH e02$9(0bАO<+s:Y0I$CJ\F*Dzp -{rt.F|ʡ!V(B|ldC^ nF0oc5Zs:ѭF*NV:gGw44 G3<[ڽ<@$2cI a6,P4@+d`HHH BHa ( "0B+Gꥳ]M8=3kei8$E"XѸxؼckg cdh ihQ {KSC[}g[˯V6tע ۚv^PnFZXS5mi஖G:dGsiFSd+)o"RaGOJK-?rm4yyu枵ֈdN!_sҸOfy`8>װXbK?ljDž:-,{WWlt(Zu_ף.= :~G^=z󥥎Dvt<$\s[.L(|+n[҉cYiz jtu?H;t*}T*txO`kl<_>}+;IJ5rTڝ-;]9)LdRZ*XAji˻Wu@Z GIXiSe Ϳ;h]дTܖڤJU9 kGI P#Ń! TGR8:IR;&i$XBB b1BFZ[Ζ n1 $LA"g$ؚ6ƼͶd@Ad!R$$44;98yӨMɑy,Yw^=/*yny9)vgB0^ a!P9x-q.>tUӷszC400b`&>\-)vѱٚ1#W +)|oBA !Ad=JeյL/dn &Psd`I?|O+ +)BH"|r`"D@ -`` -4R3p@HE1.Dhc%XT,0A?3PLb +p5򫷡.1תڗ.J$놟r7izPF\ф yA=2$M/3\&HxvZS*7+}񆭴ޢ681kw?ElxߤWMZwʣ5}s׸*[t8y,{uJιK|NnC " -ޞX!# $HAHDXPVI@!]TV C &Ah -@@D@@B D\ $@׉5X[jÞRϡ}BȮ.7r@C9ē?'յje%ɦmx\c}C-fe՗r6)I1:ud5?6c%VHS‘kVsz+(ҮZwR9=W6e¼촐>MBw>7AQ#Ewlɻ82S/FX737Ų幫Jm@[^Ǘu֤Zz}vRdN<:4ӣ]t×> .,Ԝ˩_=Ǒ3suG]Ovw୛,oܞ:k%;M⑇BSWl 1H^ d*B`I c -\,1V \CAY$# FDWX0"68ɍUە,XF.D)5a6/U=y/_=V.:V쐅`$V !8v]J>&ȭ*U5fJɖ.LS^]+}:3cc!RH"0%`LdI@~^d_:ؙ%!2I%d+ش7Vvzr#f !FW@2,JCW[8^~ X L1Dim̟M8 !a $ U+ $WYP@DR"$Ah%[ч8"FR $$ WB26Δ U`PB0J\7uO>)vgLLq}>#ƳEmwc(yitG+)WIDԢ'&Dyz;gXtiC^uk&~EOJZe覶y|Mgox=^A5:ڜ[{垠p{(^bϢy6{v0dQn$S+}K[ڗv(f`9|[^7fY4>myհQ/̹M>ͭ%-ҽh2+\d&U9V@5HeBTII Y`5 i@J9R(Ò^46)9.zίY #h=3K̻]^0(G(iX%0BVS @ HTb) H`$#*Bפ߀B*?#PIf]ŗxއY<15KrдqeWWWvK I -^S9gӫk.:=eOR^\۳wz=1hި[-+\J[b*M*X7NJx\ν(6UW> -8zU; mM Ϝ+"^K[Mu2.}^moj:d<&ҕwwe,ZšgK6ct>]UYbk[L^k4*XizdXOǷ_bK~i\;FwO.٥y%F^VfyZ4;L_);_ҥ0ֿ s:ކuxŰB RxŖ<ۖYjޒV 8 ȶG#CCf.|zKWn^Bz2"TvDf0HAH2h9p t[ͦhV$826mlJljER;ϝoj1l]>oG $ "I SWBlmW՘z>SqZxv>&Qѐ @RHBH4]pjdcDX $0A : Nyt[d׋LmuMS2H"0@HX@((4Q@ -J6<lM R 'hƯ$(X-.+VZMXw OQήT-$͞t[lPBTGبѱp{GKKd\^WM}y?׮jrxwS/mwwWavzQW}sgQ/zUWMޥg`yiuzmgjҙWMsKMڿ`9tKm[`ּ͙4/}c4&v+]%֋=K"J,4AೞzrڢmuШl|N1x_2 $R")Tq;i5(k;[Gpsm^ܾ/F%W{IC_B[}nd[i5IJa" J+ CGG c@" q8e ! 9;QI &ibٹR/sF e`$xuv:ٸ OUpM8 jI BHD a@C$!#*ВB+ Hsf$@ *BrD* "ȋ"B0`]C`B2I $ "*>[U2=&jQ/|ޠ L.O#-eKQmu69[|ۊeOrAQ(9y1Lƙq&:Ǭo/6d=bv2ch78_&qr=ڻ|siZۚȐV -@C o*Y{[jK3(p}6{э+vw$9>v{6XT1O@p'Zjq21SsЭYkp96popgQY*Jyִݵ|׼ݖΔnE.1<ԼnK񮙩~}"=#nYK60lw ZoGWl9ggP(׏_r[䞑ʾU'zN\(=!\F"A{NStW̽ANU_dArR;!`tRh  -1IrLtv\>1R:-|y(V2yz\JV%d\ɍzHT $ (`FRd UAGL0I `ezH!@N'jvCx/RB)HD^x_Үcu|WJn $2PB)px%dӊWOy)c'B.8HdJSsTR"ETDEǑ_Ľz aQ2LHfhz^KMCN{I)Z͖;ŇXڮضFYه/QAn 6Vc3^)niڕ" -U41u1חl؎h6Y4~ĕo[Ǔb:< ƥu4Wd0u7,+cC -k]ןUM266F)@Hňl].U>,k-[&-$d_yw高iI:M뮟S Zέ-8u253)Fܦ־Ytj7^CFj%*4Wm5jW6nmSWӶ]D'Y}"8MK#2-mpded%rQ*X&0]2#hH-X`!TZWt1!)^EF_<]@ܬVϥ +z͏>*:̣?z׋gW=nmOIlإBT@BJ)fR$!aa2P` A(̯P@s0`[-3_!f܀7%zұ[`0,0`0YηIlUvZ";ӁC 0 -,"2#, x,WaS2{uHVHHV/ѻtRr{yU(PaUf~>{>NDd1di!2,{g񹧧`̓9Iԓϵ٠ޓKܩjU=kpu8=؞}ugS>_:+I]Ɵ'jW^n.7s뿟qM^=lH -#9L -mr7kg -rޤSX폕*҆fzQ/++QC67^7oD*F#WE2h"Nbkէ>7$$< BF !0d>'L afR0!*$>ZQj^緒K!G^_Gq3\1@}I\ 9\2CObi2i"E$Xi200X!$ RH@Hb( luݼCA -\,1* -( 2ADX$C0 -YHAr@MH $J@H BJ Pr: -°TqUDkNUXV3+36dSKsVWѶ/}2fhB!+.1$uu*^vE{vwvƙV05{4U% -;ii{Hū-f*գp: ңޥJśӻ@Y;&_}C#a ȱPDN1#OPťCu6m@*|׬:Qykw9KE{h, y|.:kJŖ{ 5qlf=gӓӥ{.EKb~z}z]+PޝD%y_гb}OJ(^\TZ1dSdg "Y8TyiL9[h\Czqp{}eǓs{YЎ5n{t_:P&ג6}G}c{ o*ήzl.Sb-oj]yqӖ``:̮Ss/@s;*M!v͖|IuhHaҼ$bZ'KYuWq:fL9k`yǤu),8^1?W=_S*֊me*`0$h@L@X  VVdt24IP14idYB58Ke=N&޽G<L+z%h$ٱ릨de\o]G˒B  DL(e)`TC,ǐd+ÿmdEq$Q0i^YE("#H aU` "I%0b `D aA 1 e-tn&7O!fړA#;=Ձ5cz`oSTIft6[lCtZUA}?#)4꥞Ovɭu2ilMQ.+FCSgdlԤAi}*6=_-BөojA6!!uUr<+ܼ7;y,oG cL$ rai -e Z0 -@$(H -I]4UA:uq__91̊ 1XeU}N~iו9ٹ}Zkv #+T2J Re5+ &,Dj|X=Kn;X4 H$moQKY I $PXH! A @+ A"DB!Y%"BaɠP⣡ofKCD*罵%[sw+om}:2dEeg U`bլv]}7`+Vd4aAٛ];a56|9l%?V?0t+U Xӻ]SxңѵvV|[zm &Mg/#B$㆕ާuP_#-P}gi|OkzI+o3ڢv%Z)vӰsVD+J釉ޯ]'8usY ,U{;2hNo^Rz#='wֽ{w!<=x2Oҷ{Gͣ}/Y>Kk|3~?5)LO+yA=xc$}:>f 5} ->{y>=_#9<.9i:T;Q9ݍ3CҮm!||e̫mfNj;"8^CZ; ҪGT)>eq,j_cvdHa$ABIa0 ' ,1g:`l AƘD;09a9Mi&Rp)ږgKҸaWn'e>~֜tO?/L@XҰ$ 8]jW}څ"򸹬g|G-RdqBH)9 -C>]7 vV}eUKd,,29-lsɩ$HdVHI!B  2PH$HH $2,@JVB4$2.9%ȑ:E $/HoITN rEdBFiڐJ^|ؑ$UHu:Mhsdi$UFI@ȋ$&)#ߒI^K9$4Zri&7NJMY%ݒcrI#!HbK2<,͆BmHke7y53 Rv $ (I +$k4$D$ S$$$!HHMC$Ua$$$d $I! $_~HLrYC搛.v'ڐI$ג51I %kIK5Ē d$D2h$I %$I I1Lhd LpddF|2X%G7!I$I0erI3c $$rII02JBI*I,E~o$,om#Ԓ #G"uȞ[ّYj +$jޤImnq̒I!@HgI pɦ=) zj& #B@$42aVH*!S,2CI$d6$$i!d%<$>ăI2fIfؐc""L$d]D$2C +elDy$ A% A2H">9+GWtT=c֏O*6faSݡF/}k%?#G9hΤ.ѮZ*?c.9mb`}&:q湯ͭOCiçbI4G425S6sLPpz=齊$YLYNא螓 _κyY*4V -YκuԳU=ݚ%3},J̛eGy<:Xx1gO\XXyLJ8e[iS ^w؞qd94p]}&`=z#<Ɔy,8\ha:ytdOh]j6b=o-q%{IRn `i@NVn_'q( py ͔r^X} Z' G|]DN˽>^`! /bijVev: r{sM)J2t()OoVQi i(F;d:W0d  .vwXUtǒy58 dM8J~dX -m3oE -~_o2Q赚H)"J7#OĆ'Qz JVK uņ:r'2.c]OC)Mkʲ.ɠ3M0R{(*+sЮylYԩdA*laB!Ί-sM3ˠL胓^[\{17(B=}q΅su|%6/=P_\+hMiuΈ<{ oG^aLF0BtDiMY&:`鮧LDI55sIJ5}vMYf|1rwiNȰH]h#o%héV3`-5B^IeIFϰo26-th@} ,5XXR#mk`wf dӈW\$3L(`Đ:7OP}e-뜫 w>jsqq|,7};x8S_pս K» ~&tyn1 qL鸠[?Es9ƄKYQPB^5>O[!bl_|;*f7AR1NwXdhPh!Sŧ8fX_ A--O}+hz !,Z.Mas5Yz5e#\>Dh1#خ `> `'AζkdrG(=0qFU)?qz?ѡ "[a -jwb݉}$xWɢ8m@\Ή$V}qO卦#~I2TR>g'AfOۭ9ڞbl].Y3݊ } z8*D`K~r&@"3Fo=y'NS3h$:◹8]Xq? $={?.dE3HJ=aNmn+y0[V-b:#0֤)ʍ%uU&`NH4;җ/t%H]?:O 稩!u8lC h4ybIQ)}yUK,_cxK2/ɍeG;':Dɤ -CLl r -:#QtO ;}}}ccJ׮NTxMkD@4ПE#s#$'V?f hC]2H5;tJxf1)CgMUSC77uwYJ0g$$4j,|GN$)(DGr~""ҷԮB~O9D9~$ysGy))ډGҖXMy7/YvUSH}"ȑIۙC5~jAQZ?Ar[u%rMY?f^cT OWxM+B _ImUrД5)vʲIN3I8Jtݾ~Y:Ixt9Wg2ƅMh[s2MY^L[GŔk?6 -s p/ dR dohSA_]Nwo hEƚ$#m j|QV$x,ɫif'k2髝'{ycѰsl.`8`YWhHQ/}?%@3h!.cNܾpͬW>ÇAeVbS("gcnXظ(T@3Z3rEQlKEIc"J²xdFz3+Oa92*lEx:(e!D*2US{A ֳáeЎ!Olnѵ bHF_*A9x-5AO^'v0sV xΎJ^_&Nl6d*D}G qfYT4rޭdL,$qwYкz\C4Vg==E mb2-eanJRU--][*i;y=MM`Z|_u>"=;ҩ&(v#VyΉ I(Gjc_L*ivfg+=0TvhB@G_G&&P$ #U(:J.<Ҙ-W{AD+rb\fNckyōU9`,]_1=udo5y58+Ny|{ -xap3OI?2ȡz=oODQ/=_4I{D n68ii9xYo - FOI&mr -Wo5:ӝT.Z'RDa>UDu.ě#4)1$d w3hIO:JytwnuHYE\b $:OW6ns\_m*TF 醅u/5ڝ uu$ I+KS#; g^]b^3_[Uz(:Js>bjA-+˘It~ٞuM-()q{. Ұa,ٹszsȅ*,t2B5 8ﵳE PAQmK.7j`~ %\'ζ|fe<$b2< 2; +jZK!lM6ŨǂK|:mlsiŨ9(b2H0Ѣt7"L2>%"ٳ-nyЬxwbrAhF2RyNoyGׄ`6^AgӾK" -2=[fʅHQԷ3\R5~o2|_qLqN!b QKq̊-͹0}5ډ,FkX@)9%IXUjx{rK73h큮V,F~-<T[d91i?ȭJfj( -+3q|Ī2"3q_]iT{Kq#:ۊ)5=ZgVCv Q| ZI[qc1:D&xㅞDt4t4׶tgM[:z:{4zRx5kAuAf;(̞i c}SeR-r# B`~w|O\(r5i|oҵkC$Z -WH|+LjmsgΦ5d84@>m5>my-3j,@^4q zwHx@錴b5Dɑ\bj٧Kϵt䈌Ὢwo#GS$ty9#.ޫ,%W)Jv:s-En9e\ytFu^`-DlWMv*nXƠ2rDtJPHJCǦN^6בhѣz YNJU$Zд{X=&i/1#RIH.\I4֥ʭhI8oG'Jv9z3Cʎ2Vй"ҿ(6ҿ hRXuZU1:ނW4eKB0qZvje]/ ]$sd H.*_p|$KJ6ɪON{i5sʪgT+WO!8SbzOS.%rȩ:*9HMC:{3ۿYk]Y _UYJTvoxfl9,^ $ihPnÂDooW}v_ZJOg(ڴ1ډKS]Kx}CBCkOdASbq8F\i~aO.PfwyIW1OԳ]Nv!>a9}>_p!έj5VNn9>59jpg."SL1"} .u~F0VE\u4PI^"A+^9]ol8i*u Y>nG-TW]^LΎ -=kXs%Iuζ4kjx'-m9V?(s/Zy_Lе/x5dq|ZMsб /&IsˬgX!zʊR +Eqd"8rB6TGc҇_1}8~TIF~ו:KѿzC\2F=d@5(rkXKT`UI ҋJ>W-E^V؜D?cj$on~$8@Q\)m-GP;RضXp=\\p};ўnJ0?W1R$ȟǾ]uJ)*m?D`6otrzUCyY}2^CݖX`%݁|? IC'WCħY#T5)qi̭ P: :Jͦ }(X|/ BV>xlEi 07^vpkq{G%w4m}inŹH{GĢ-hw}9wr&+M[^ C UR=ae UXhǕ*^ݻ9|K#ˇW)Ǎd;pVT:;s9l@d6R3yS -aj8s PJ&4ס#L߸/z 8$^z# t\Gkϖ>,T= ɞh)Sn[)mttd@X_yrx -'>^W;_Fzb= qqXj7#LT׍Q&]guYe7nJv)h ~Fw_q"-vrp#QN+JR7+=:s;*YwG++ڊӑ@J=ͭ[6ml١ͧ493Cd5#AI,Q}k<rDVR3xFT?ܽ!`ݯ&퍶 $]O$f8UizRk,%v+Dq4s5P~%V*:t5"l<0hO{V!mx,رM٭p8 #RΒ-ZuqfvͼZ1]xHkq)Ya+#OFz&xu bhUs-A.P2%#@ێn9[N~ +naDS4>2G4,p$`Ț޾|fDaZY -/3@AS[&zC6+=ȜM徵#hƍW:g/_GDj3?lyacL3el[k:YκySOec<|Vr. ~PvGn}"Q}9#gȫ2K5pD˽-t>O9u|9Ü`rg'w۞HV[LrqD5jDk _@6nNpn9RsR3Fo\m'O<$PL~kD$>` 1]<j|PjhUE@}ʲ3M䐼~xƛɇNQ>?$B>VC14l f۽6+/;ė%ܫieTW[z}#p1Wϥ2Eӥ^O@}a UbO3::9Yή|&κL/ȷS ʧߪU,SC:^utsOG "&U~FV)v^5S螡;} / -izJUΎG1RHJ~z)wt+ MO1#%.y百ygg瘌}nğC#6uK=>4qNIQj - N4&4)aR+VrG^k֧59jsX>6m[ rƭrȑwsw:mށfܶ&j3=ef=礹~P@>MnJע]xA!QaK! Q :xMiz.«0xwPTњy2hURjtv(( ]S]3T0bmI:}g19I.:[YZRȧhaeMo:[yNΖtvpհE @pnv)|f', ~W(ڋ!6=oNv`-_s!SQ̶Tŏbqew NT$2_EsVeo?q\L49fͭ6h٣gϟ?9="aG2盇WT_eA+$Ǡ~uq$]̈́{ A6;)xY>id2W_ŸUw1 [s"u \6.pcLgR2cG#߷kDv8o[<ڮy%1دj@z'yfv#m>\KHʧTj' ~ԑ)`z!w.Ѳ`_Sag ^7voFa}Yx6rfh ,r ylXc>q&{x1"D<̀>eYUXUMe\~v`ٛFhaoa2 G2k ;DjΎLZ~l׺".W {JG=`.`mVJr̄a QS/&CZ=6Myb_M۬hP r.H4PM8%{eA xy`ȩ=`UۅGT -0F~V֐KQ]NjsSȉ,e$$=ᯤA#wjsqƂH$>m7!I }beMhU"׊=BrEmFPX$=K57ԨVȄ>|"nlp|e9@B.ͭ[6h٣g͟6|fjf[76nlٹҳ>Ngy@gS:V]d-~&n;$|c|g;i]7 rWif':gΕ:Ys:YFrg*r.r.rlY`O?bo2*}-F$yLK2ml뫞ٮLuZ!HHV9sNb;BV)S2#B2b%>2ۚ>=4ۛ}=L;Gz< ͇49׈"Of -;ue&E7kNў@P޽7#ERm 24[s6[mzٷ)`1]JGW *W΂E^8u۴aH:)mpض6k2^aiFm=tUa8T4#)iC?vU/SKh[1»ў973ɥQ~ -Y -hE ->P5pXcJL9[AB^K5p?/1d=I..3gR1($c⾃_4kWG6b7qr,gY6Ց+s݅JWGBu2n!_Tp%c/):VDQJhex}mOb܁ Ydꪟn}l*o4<=3{,0|0?nquX -H [-| Βt::%|`J aΆ!/<sW9ؚ^Bq'f~0ߍFZHڨ՗j.ՖY*wlwZy!(X|!LU9rTOFHao0h7%4iZ>6ǻan9--j[ -O˕7l\{trG6 mVc XA=+fY#>t2W5IӅEWN|eOnGӖvm\2Dp.hVs&&⋔zM^f:| \Κr/g"r/'`rlYf%xiijGZ_NdfD F[B',L/tiͭ[6h|mHC#G[ϿL*|e.N;*L?jsqNj}]zHu>_ytai8-ד3LV,N,7ĦȬٱ"}Yz1%!.>q4ܔ e̠3M>Z@ @wğ$pD5fF -uſYQ}b}0cO& - ֖f]K \sb֝dg.lnfKyxff̾3!H'ӕD<KtǿHi('+_nl X D !#]c׈EWʖ+B;#Vӫ,R}*F5p}Ib\C9\CZ'ղ\4ظ>=S] `o؏UcR/#w8tKĂˆy#-䜔іh$WM5c r\0dd1=fy9uqXWWO7pmFIҼ{߭(#pȲ{Ce{LkjsHs˓!,Srf>dxh]Ά!Pω3[8-wϥRVA u>|5-~T5v3l n!sr=|d":ȡђ:SG T4]9ˤ3G9s5,gKK:Jx+VƭSqD賢#Ѷ#ݬUiNtdRMPGsXXS Ýf ?]dGYQיsf5%7ɿZdJF~6oK!mw~XʻɭGHڟH>%4Iیz -9/r͆UfDKrfOV]4 e#yX/zbt>]kY| pyލS)L[Nhr(,[H(%Yd<',g7`{HgTG?QW:-&XA%h])\әlkNtYvH@6@ht)gjvO 9%6C@mENRgN]舆m5ŹU(gp|mMʏL?E=:}A[hr]C|RVFxKj(H ?R?þj۟6Q-y28d]Gf2yԛʑ9]`eA O8TyyF1#EP-Jk%m܋{zG,r~~z]>/~9wZ}7 ]wjΩ( ݚl3"35龜lE"5T07W3s9wrɘfGg8k#LJ@̭emELټNyH7sV5>'կ7|=q͛nl#%;D*8V}~T9ʃ9UGaέ ՘ HZ&l8TȐH6t-gDѾto>tG6tSgA.t` Ή*SM8ɛkm%)9>([t+op+ -MWvZASn(ʜE9'B7ƯnWR3QbD-)RF1n^6HO sĬ{q {5~L0&;)Yno&؂]sG!>-GGgJDf )!#ƒ‹E3}\'Bl5$8{0$YnV]P_6 =N]̞IiOnsៈ`eIo-4vkפ~a3iG.>c5j=,gMO:ZyΖtsItgIt᪹ -o#I&GU'x`٬QbJ9G}A>at͟&e -ˮ'&rͰmƦc$TƑ,QPe`Q԰KPe]uZ@Nº7Ayq<+hSтneN2@=+d=޳ YYX_Y($a >+0Re/4UD{c0Qoov,*' -G#@83CK F+i|v<\?+# 1עY:8~%<ܨxNZ-zy!N2Ez#&<=X\du -}E]IsgUk@{bxɉnMmњdC?1c[<ƶCb sS鴰#m~u󪩦,8Gݚ&>nrOgHܒ$}n:n?gݟ۳nióNxvmṳg/g/g'#OC:j TkUN̳lH6F /:jHr"{o$ˡاq3zBHß-L;ŵ#=ۤvI-8Ndj:#$0#??߆4o8EȲbGfoPF -Ser:x|co(  4qq,pNWN#ؒ켈bVۜHT -8DOgxB>TR$y45s-45GV~d*YJhY3ȿp׼Cf>͛2?=alگ̶l`ۈ1]pW8Tr Fno>?g;ᓋWjTOz?HsqG5ɣx!sf㛏Xc]=S}sa -Άt4 L$.>"@=aOK􎜠us n'mvK\u1g&,/a+,I4"9aqz=n~A7\F xJ4xFQ.RG -hiOn)s%/  } 3CgX?>MWN 9)C.ԩ1ԢG!m~t3‡T7sy퇿{f͚Der$kt$)v5;_~OLv+8uYrZ ' I?͘-ğЬˡ>Z:t-\4ΎtPgEt1@&yzg.yvynynyi-9.Sn#<[G:ʓDW7K -N>}9bWD:f򟖽V]^rB#2ucq+j#4V+,1t$Ѽ)܊4(R˓Ejd2Ž? %TX adMR>O$OqW5wMЗM /2_>+-6'Ӯ}ڼ~K?M=Yk]tgO6tg"\K3.r%Lɓ92g"\K)Ԅsʗ9R*\K@I.~\[xH'%c}=Y؝Gvy&$jDf (w65kcR ZLşjqn M@,W i!'[gH$D |}P>x3yܩ Ft7GI"&zw2  Z=uUV1xyC2EUQRVXaCJ~jXu*,8W9sW?zV:kxJ@( f xX˧g6fC*%g\/'\u:xμg^3׌צÂ~z3< R\=9,_:&$YQ0xM׮զY+]2y^M'85 -w}DU6>bg˟h!*ٮm{l?}b)_gOIF=AԬEa{Ӿ+Ű?5p}C2nUG:z^"r(.t=,OG:z9ΚtԳ=gKK J =JŘ%ee`C%$hU1$uk,Mrr {7s=֭kcUT3eYT|&}za&Izh<B\debŨ.*eVVcβ!Ýl9Cl9GtYCzg]ug]ug]ug_u+Y_7&z^dpҳ 1"ϾO|Hۙ`؛@vn}ő: saQ0,"΢<ǜstyΏ9g6,Ŝpooqyie&N5EeQuq$/.3^ʲ\KoL[JAƵrI=l4k`J@у/.l>L$S4~4"SctP! =ʯ_k:YȺ-G3HAE&r8PDMvy/{ֵ ٷl>2nDG5|kIt:H3:JΖt󤯝%| Ύ E_:hū z5cz9+ݬޫV 77z>4/P5E^BY<ɾ^!'b*Z'7TdH?-G HcC&"\ֆޒ,tO]HT#rO*[w%|yu-~ $>}fa}{ N. Mg:[Zss%,Oo:{yȷ=^o#~?|K ve?q-mL|;fJu钐N4!zy5+}sQO'ݳλWϵX-<L4AC!>h' 3;VӻE: a읽C"q5>2"$d}s{7nlٹ{Gvy# 9؀₞dO@߰zF3ІSi5x t~\9ˇƽ󬫝el*H_ 6VRti~En@L&JWa%as`o.HX+u #nYuIAe[#'w(oq')񵸦ņ.\c4$A.t΃<~Oy#=fgga36l6Oc9v3>r9ɗ9R*\˜2G|znu?udzQ$aۻFl`=-aa9 Vhy'Hƭw wMce}^ôKlc}0& I5cU{:k Cx+5+g?4݇B:'}++#"nXq|OͻgMo]>LǮr95$D[cdoyZb*3&0'=ztOsB |WǠ}|:K@F )Yb@Uon,14eK >7㚟 rT[; Ij`R-t2ܓp4c CLY-4]O9B/oT؊>:XD2!Xڌw -we˼$T0FG/98_ww qݯG@.k!hg.2Z;9UC̓9ɬm9 /<46m9igrN#>0Cųr$v@?xE%?\ WcaK_9ΑcE;t'9M4I4>t'tc:<Γ:FΑ|HzI"#ᅴx,FǘD -[EjCAd+͠ha{j$\1"$~΢%Zfgdk̵A<L㍛*dSSaQxgUw_?#Ů޶L/[ +loiLA?d/E_3VCt΃ѳ'p4'u2yQ'}xJ8d(ۼe6)R*7)''xK;~妟&Ө++N-ir|fs|9̇9g6 3_::WΪuUUlgU[#GbWm*~O#Yq*>R6)^B3Ĩy/j1 -#׀x甝-}t({,\}|0Trub -#z .(E2@T -gae^@X$x1XKyɯQQ&-f˷,AyN^;l^$ʿ;9Tڜ[Nm>2JcɖĮ"fp4 4J;#q#P1^??w^(FWوsG'46y`yxsaϢi4aEūyA[EkaH}{{!Fג8XL]?'LA"nQ,gIc:;9XΒt3gE6t3gC6t3gC6t2A.tg͞_6y|M]6E 5SbCʌwg]#h ͍fxllU+3[uel#ݩFFvu=4aaR6܉ָz{{fK"d߶rӴH/[sL'zL_.:;ЂhLe7UWu lî g=O#u[ZS me S SaEZQ r;Ρ.7t9σ&=y; -$E vj59HdhP@Ĝ_:T ZH$@GO㚟lԘ^CʻrD |8sxr8m@ہ#QGz]e~Aoky{/JΝZ\N5es4 -42Նo(I>ƞy?RcE&?49cfͧ]:TųQF'۞kK4ȧ6 !%px>O[56Y4dF>&z]ÆSj嵰U`;pZvUYHbFS&] gpdvCg-K1P koගۛO>K*vٱk}̒ -lߴӵ˕X-M6uV+@[]#Z+qYWQ'e $|4ZWZ!,pvp pk 6pv]އ'\d01.bV]ĥikQ/$eTA]kGr*7Ʋ>֫6=nd6I6.֖d*[G/ѝ<-td86l+s9_s6F|\DX fGJ&kS7T3_9c۝[99[ VTGw; p&巆[e9y: -sC0~\990D D|6,v q N6`sC(`OOwbD{/|͍3.rLʓ93aAɗ #Pfs Fh4K;. })ɶqJȗ!Q,<']-bLK[מZ $9r Ć2# sgͼKc+.O`B3[dvImL)˟d>o΢u7r g}y2J^ -pgC\ȷk4M!?.Bf&-Q#}B(srP`F >[:1n+?Ύ~"F$ -8d|ym'tl%^N)O)qxAMz]ޜ!9A4(o:׸4 <;ehǯ\UVszy<|ϟ>|-N `W:٨>pv4]uy5nY;WˍY6QwHWVVbGe0U(]:K5IWk&ݫP`3s|8!!|&å:IkN8N6q zVٷ!8"R?[_WIr|2H!r8bttw!Ƞ哆1ZXϳEwod@'7?뜵,[_r[M'[UF ZٱiT{F/Xv0~3ƿ+g2G%]ݣDѮI4ҷͦ3l[#U!A{N#'7E}~5ob~ -5(Nb2d6Xȼ>+/k;*WS<25; NC*ޣZ87*XVQhafyjVB*ȍӑ6k=;6fήuv3Ug<96lc7XlgVsaϮc !U\9ɇ9QEmw1~fKo /_:Aٮ6,WhYV$J-X1h!{ّ>[5$hcbѫO&^YnAv9qӃ+*9=8]tī_vǃebzɰ) w6SeC 0mYcEřH5"h`W:~JژQF # #A$D{!43̨gR"VcxMfCIc┣/7O ~'2ӘU|hd'PnҼ|5v3G:ŵLg>+Csma=8ͧ6&?OAZN9Ƚ~.ؼ@Hᑂ8+5 *[1$r S+'a7OY׈PBU\;~8SEjdQ8_7 oLqH|1ӋL65zY4uSߐ$6QzyLuYb<#Nʔ<ʉEܬf :VUsC[4#k`TSK?o !allٱ3Opy6l9gOiuẃg#\Cr?'c:FfBfAF2PIO::xUB|@kk4u.G]9j㞸-V͝]m3sg:so7g3g3333g3g3bH2^Ս UR-vZE:fvw},#s nO&%mXރN%]~Xh -+VɃ:Jر -Vy8 SY ^ij́L#HdS O~IjӇmM~`x O}Vۺ,ԏ0'F}uΖt3!]C6vߵ'Up,WK,R;p X`ɭ 2\V~Vs}0_6ה~fH-r.!A"UnR;'6s0?H䑷[9~9[fԷl.)'fJVft^' 9 }T_&o|pGޟ%wmJswϛ4"/jC!ՇS._SiڞMW:jUΞrz2,${,rqNjsS 奫Mhա~y7+ -U٫z;3L[wC.ؠ?K,踖V[,ԥa0,gOHqb'<甶/ -с--(I]Uz3:3@Q=/@@ׯ ZfcE:Noԕ+H]?!c+h㛛76nlճϛ>l>lѳF4l٣fg#?nl96_NO,`$*7؃BK<kN[OIN-hmbiPEn+OgK>[[*۔7+`PY5eB R^3VXDyLBeNT޷Hm~Gj,%~7 X3t2*DڷަG*T3b]+mO 8T28=Q0gȸtu f]fӅ\7Ȼc Vˇjݷ79~_˹8 {m$I,>xl.%]Ǣ@NAS-N J󦯛>x99|G $wT|Ec)k|w/ˊuZF&yDcL[~,#w!5țTa(tǶ&^ {K>l;F]E{aΦKtWEء|%Ȫ"= |kgC_QWU-_\h%`OTVh3}|2}˾- I1ye,yAfW3uIȀKlv:7*0u D[koȼ_mدY}J x!qO%'g%EN͈1.$+Jj+Xp7J)>YeP7<]1_9 R̯ovW144TǸ3pڼ##$~ÊG-RԹg t5(YSe}zX5.eJkCǿ<6$^Mu`q*Kc$BBRK\BWAӃh'ZX[ԈE+Zd\f=6|kaG81՚s/V=ۂԐ|/2Y篘uƶ U$РmDO##q ,z+]vtNMk=9'<lZӼϺExUg AH%d 앜,ݏF>0,lΕ|ۀ/ϓ/4?su\W7U3}L֞+SgoBI#M4OWx+#W$5RF̺;V ޼^J~hT1dWPˏ"nX󠉻shøn6$U'Β|'Ȣ3xF|ϋ9d:xmM*G\ra#+<\o}!g~W7A$%v؂ _2gGvɧ x~kC)CI>: ӯ)O-]C: -9ðq[r+zrIj]1ٲ%ifD HUiycL>&k]9ndqں{[gҐg9cppEXgO_:z@U&KO"330pNuybM6p節T 265cr2"K󴜱 !7Luv:s/fi]ӜȽ+Ζt󣵞_>y|XL󠰽«(sլͩZuiVjE=;r4ؠ}j fT eW4?cfFf=dMOjoA .H0(B}uh@n]L{i -r[/gH_)Ҋҙ]0N] sg‡ĩxIOkar3.%kѰXM55Vވޓmؿ9K 3< {ʑ1fKu:ʸ/W?t>+{AP8jegɐfFXW΄߹r -E!,q})a!Cͥ^Q*ۧ:htޑf$h*F!̟WLr_iXܲ!>߫3D7Hj`2$GVs6$XǐF-K(y3q'/F>;O|BSr9\?m+TiakqR0.?)so_W/𸲛q#gOŰVZ6ȁgX{/͠XHsKG&7^i`ȦYrz|3&܍xyTEnfyCjg8 -~mjVϛ;ZU9ëV&2t50F.! Aaoog+u@{]+2ʁΑNZIQ{ k4qH\HqK~qnkⲢ8+%XU bՈG ӆkS,VnNJ > ╛i%߿yfp9ͼC6 6^͗{9~V jq* \Jud}78ʆ즀JF/0s, u@ڊWcĀ7^`q ʚ=uq -ˏa kDZIpmh}#,L;O]yO av$+hǤ+gI6tkn|㣼RsO*HpN+ @ǃ9ppuic 3F4l[kKfGRrzG'[,ųųŰhǧfy~ Zr0sy9/U|0ӛTX A'8rEf)9':ǓbYHd -vI )ͧxWjsom3eHN'V݉4x7DZOa*`0#Ш\hpQ,yuL(&lW3Yל:qdg.0BOq -K8kO@ HsinWy#9DZ5M#=,Ȼc.rܰ4P3F5vTfZ֖df~½Z'%jȪr)"Yv#Of͂,I -aӜp҄wb'pF)}AwA%~6YxraXd$ $!q})>m|,<[p;>lϟ4lѳF|y̋7śd9̋9g6ÜȿO!y#F Ś 03B.(u`]IΨ۟nÞQN vW훾4'7ś,HenL{[Gn`[Lsd,vX]]Gˎv c< -5$HJt\G:>#NS|d7jzm*u1m@E?Rk#}9fhvCTϓ5Wj[s !\RB3c&ߡOk_Juotͩ9=``to*-{/g.la| sj~C* |dӉx28om}ԡ&AP߱/Ize9GZ/Nu0b=1tɝMlWGg=Nk@:(LSLN#[MԺ)WhŰ("!O6Eg`b#əx>T'̓RUy2E/m0UY6x UdsI%)z'_^%fU1!ey"3#:k@u;ao`؉+s -F۠1!3jˤZr8bT;]f1l:XGe ɆSg }l11g g!s󥯝5|K_:Z+3rbLYɋ91g"FDQVjyza'p8Bd!1@4JF:{}񴐺,]|H /kߓtLf^}r)^Mwxy|gA JWh45dқ2}ʩ$UqkVn*@|]A#1q%k|˸稳kglO59I#"35y 1k3i!\d̝gPF"TL4:j#+Lmވ < 7ƿ*5`OS69s_9+1sbe B.dz YQJ"=>9/(,y4˘Բe8eLyJG6uO $q-)>[E'&sn:ԻFm̻^Au%dL5%J.{/8l -LQM).u+An\;=.O[c<|~h!)fE%8ݷ#JeZydO -sFH<+a1iJTh?9u54֎M#%_O]tԕF\P1?aj>~ul3VQW.A Xi6tnNW:V3]ތ/g> [}op~5p[Ji#qmF]Rp†8#Fˏ"ACvHASϒޱ"%XI23*~!X\ʸCo|l:rGΣgQű4 - -Wv8̚`wN\hAqƳ -BywSTXǙC~2JsΞs%I -Vt8?7>,(u0A$*ANdmrV}Ļ;)A'Q\Β-UXz3BPmnRQ' t" -F8=sد*5y~B%8UԜ3DBӜ,gGg: : NmlsiW.uW6̾S8,sE3;Y;S[V*ւ/PɾRjKzWt=51:I5$H},]1@\6M-?^vKMj2 9hL̊i;Rc]_.ug[>Vq7 5( d]R=}5jlQ\6\9jT)M1mIXB%?,MjVw"+4'g̛Xz>'>x#Ҟ>=G مkDupl⠓T 0Ue725s#ZjrN T*t QFx55eu_E׈[B-0˯FKURQu!7gjhxR_ i"|VhFs,H}xd\>X-嚸wūvyQylxDj:k.$LUYۭex>If% WzU~g"xaX95駅"!aĭX c&ѿ;vI,·HS@f3ƌ5_ HAS+4=(Ev+"v+)[﫤H -0ԷCW Б_|^R oq qyFTKThin^-A-چo#'#R1=-ll̠j9pXCs6!s.I,iac)XsEg:)  UEb( )j*\ ay _NJgMOunc4**oS d3Q۔WYɫmi$,2 pKD)H{ GE]rW"Wþjsq%Au@ԂNL0%:ɮLNWSb vKBS_h<9ɳx 8/ LypF ۲Lhs\FI~JJ\$~ܡ x BGpY&5 -ԏQ5Xe8_OC[6llޭr{*$A,qǵ4tS_UPxv$ts -Q~ 'HF6yWָ{k0'~aŁvŀ<4G4w˯ξuְ[ޕ;ëxw1[ztճbd tLܥBuUx/]GJn -%`kׂqny8]g|Oey\GOV'7\qFKC9zXl[#@i̥.Q=#B`#9'Xh:@7EG~ByeQX֚ts##Y$pQBU|/ג -3h'Yq jwuzf-$:MC[S;U,g Ik pP0ґXSjO^(p"& z0{][LINKfڎ+`Tؗk&_v+~5:̾,}`b y]$ÍG&< ~tYϋ:s:3:Wζξ,ξ~<nAU3hˌgfZLvVGW4UT}g-A F#mJA";l%ݻ5WNs/Usk"k?T>};rY&-XaӗUSuy^?AտD2R#<L*` S^}I#ߝ3~ޤ\r9"cwY;iToĒGW 7+Zryu\rXRe{1mϧu6E,yrж9*"&JRYHI4Vސ<^)- rY9P Qn_'\OC wx[ lI2_y_&"pnӷO+a|g#Jb2iO -]^زԟ88e؜&@yMueL Z[t~\Q")GkHanJ0:s ?eyώHB*,j՘i*+*itl>V*D ~Bh{KvXKǵGBjSxO.^n$0//Vצ#tʫPĚMH K(1pSX<<Juwi>hӜ5hRΚtA\g. l6E 7fݚsq5?|[b<2|jaRòAQ8 =r ,ro9 -?,H#ȕrmNo D]yj疮yvDe?!u9Nj~>I–/ϫj34t_}X7igRĩegI#>U{V -l.l;5yD p*jt>kK<֞5gZ<{3Eɭ)>K;ʗet`h^['ΊIR4oׅKa"r2_nW#M"\[Su>=[3]\+baLEjw.Ю%E,Z{0H4jE;J\‡XF8cZ92DCV)`~= -̪0b;g)Wt~ՠD~YYY -OzďrG+Zb~4RoqTIZqV]VM1髾U3CRY8uF N>]D_ kf>[}M rj1L'\ʫ!LH9ܲֆ\F5D㛎jsiґ9.IkM4"z3hwHCV.4 RfGU$2LIQ2o Zr5oavApN'<;Lnka_:3.Vs:9n#,׉f%8lXx7geUƍʄ{c?V>B-wwAU:DAUpU+O-i1:Z 0UX{ ӈ~xy '376~>}ӫ! -9/׭vavu=]LkF$*_N!}Q=k59mpȗ$cD/&U:֋9{r͈eQ$J.ax_J2R;DɃ90BqmɪIL3Gp.TkEI,>ph!JE<-U6?ӯF¸ylEjՍG;GgWWLg_O"MF"lpċmcc}xp"Kf) .FӆWbv5hU4^]uQG9VMiKQ9yD|V*_ jW27'a,9:*rȉb:eAq錧Pëv'vvؓv6MmY+%_oX<_|I+ o_:V_.O\i؀FѺt|F[I\%rGS]J Y[Bkt]Lh\JT֦u<&ξ|ac:9YΪuV3UKs&set SX\tLYУ5\Ir w|3+Az`2SId.[Vw ?W/;(_C,/Y$00 Zܭeyo֌՘_Ief>" !,gIOM28vj6HRC0ԝ <.F:æLO0Wi%e]QQ/4HF$/iz2hQ(Ӗ+rYYB(Za:bѫ i -$튽f*bwO% -ct1b-)2^{G x| 5"$ l9#7'|Fr :OT64hA1Ζt3 ͝^syvyr&yrgG]ytYgC(u?e&]h$-9<*gYS:ʙĚ5ك+9g:  -^Z{sK_iЏ^%әΚt3![ 9=u|@'69dXm-F]r6IcnI.m1L.2 !Róכk-25~nBL Ď -NͺprP66 >`+GIZ2\<7!a]i/ԕJ50[Dq3,C 6WۛB$j觝U虇.[b:g*Q$@"L!(zȋE5jF&{u%r)8i"T S4Q7mÍm42@3s`U(y\->*=qqY=qdq R﵅+Dvkl ÈM75k8K7YRP -Pe)_scJiXw֭ygn[[Bj͜5@4Z&yY8X -6bu!2gh֌1?m #{pYUg:rIW&mX&}*UǸǂljDw}va`%׆ |XD$ u؄+4dcOf2϶H:xc^#{3Ѭ܇:v72 cC:kU"F\ZhXDi,Vx|_BMɣA{uѷ)W]s/ы5Y&Xtׯ]39׾ҟnu6{9^!q ^9ΚtsCkI9hI5ԉ"FX?U"$h|,$ Wcm3Lq49c4T8AiAØ{b(;,v{ӻ% sw:úPfk9v14[r"'VX;"u==|ӷI q|F﷓)++衿9$Tα?~u*Xnkn5Cm,: >@Y.O[>x3ip? zΑemzh&#O߃}+Oj<-[yt9WΊ0ؐ\&/f!d{yHI*զ$/CAȡyyKN))S_/_vC?jNN*ٰq;z ƼD!hPݺYӡhl >ib}ŻMNKX'`P#U_ -[O1K4bEɠO:vԊ8}zwPX|?Me ocf<$s2Wd2qRuJFOi -s5ͧ6p.i.xH`gB56?F5[)4߁I͇6s1w]! pDĈ #ݜ@ S\"S؉#}80YO,VR(lȡc:I:ҫ8=lPeK E} UYX\'tA&HZGz㮍tF˱ # 'AeOdJ1p蒡GT{EW,\<1P~w>sۆHeۨew2zog&3~kC9ԳELn<:`~<\̧2!#%-S֓ū#gg Vw[R5Szm|NmɃ(m0?\ێbNo*wOjO/BVlR}''QO!s?H&Iɗ,迣/KJ>4ȚvS3&rTRx/ZG}$~ΈSeu)5Ʊ![0Zn^ΡxTD~uj0[H -Z6 *@җA@#΢ ;(Yֻq q\q\Վee0rݸHyf/|` FOqfX˧.<\.JmM.xy!&ySg甯 -i] aQ3PNg5{-8Zޭ$@ -ڔbi)MfZ9,|dEꛔuNz%#i/q5iX[@RIυwq37և8%>akl4MX xOQ 9i+}@ L?ȊYZ TE*`ژ8@W&'@m\(V,LVgQ_ $Y9DL2hkBrJn1pPOA%H#`|''YITbw؉{$r'In?4Y.s8gȭ{*Ü3kOriZh+Se^Dz"Cj7,}1oִ/TC5j4AR8« Q/0LYkB6>rP<Βtv3:: }ly!Z88Lq/+~q4_5̓ -nbȍ\uŎ&m9rI"Tmt=;}wz ߹h~T*7E5}5d`z:ik~X g{A,!I9F!RwJÇ FIOMb(WW=&[Bq%?+ݽXgx<ĥ^1=?7_9rfX~|=I n2Yv#I$6 76ol٩n%YyljgfM L\T9n*\#]d|)éðJ/:I --Ѩv^fZnWתntղzԹMc6>Dί]ltBz:E) $sa]2R73LדNDВ܊O&$Ҭrc#Uv$6#tn]Yaȷo49cuĨYyd"$ڙ|3@Gâ1#7V-[_#(o%C,/& %%]Eږ.uAádWlsQ;wTPjI Rans*k4s\ssf6|fNm9sL&|o}Cjn Ξ L#5J*,Ė+r^l]#c?f%[_g!F9ZTbL'뵸lP= 29e,O_2ɞlt4_yQDj\.:qY 7 ҊH Oe'ʳʎyRq~|2 -Aq7= |2O C}dUZ'kVQ o 22FJ֭-U -1lJn(S鯻F!X -!i;v伐eKmoŪSD˔Ux,An\1uq -*[WTxq* he4cQ¼VJm_,q.j싇$UI t|[ȶyx9Űvon1Y}݈н:_a?b1ŵ'b._ -ONT2ixPf%x96jX_^u50ax3VY㛎o9 eGRC_u3 f$\?yڜ1)Na$5c}o{pN A(ux)xdp蜮/j4%}桫^%V')94bhed\S9pr*4 ,q*s!wcXԿ]G4R.UOLX F Lۛ^'y\h9˵Y?8o; -< ijİhqĆ<|IeqߖkE2zO -q.^-[5 - g")ʏ!i̯n*}{Rн;s|*bAuɗ|!>:zN6,~99w{9K.tgM}4YA=,ɣxnirOv}Mp}:qUÇÒU:}26c˓9rf;o)sӝIyMS Ĥ$ᇋ |Ӌ/k&MQsvn5>t=M59G{^CiC"F{W'} i- !]ɳr]ImH5\ݎؚ,U,s5(dg:=sfO姤ʲݠWZugU* cK͆&>ޣƺw'۷:8lpM>nc4XΎtV3˧.<|˦iGs}5Z&')@z<1:~y#julg][$[(,G\fUf stb0{u2?gL-F];<+dbz氟j ,_v[,d{J!Qn,88$6 2^.L"?Lpƭق"}*OƟQ܄"..C\^І&r+/ dB,\N,n*yW Flj浿o[ ztcdɚ3*9\Mlnw NT [n6ݱG\^m+'Gfv;z;(u^Yȁ_59: pKoIerh։/rg_K'N1iS*%J䍣]YPUVMm+Y̕c2ՅDkh$'0m|'ȓmPz!}+n-sc rU1d~nڤ]w}VgTvmr~ !7ǚU;͖9_Qf6#XםFc[&s$M暫 FIzӖ1H qԯ窏:d_1} d;vNZe6rNJ2)@wf3+u*2si$e}c N\5_i١kSަh/^yd`|22* u5쬤)NL:[)΂l&/l3\OS:zyʢ=Ӈf;?܋rt7~DFɝ5N#L)\gB ]?UU@+ͮ}%k>*YW:ei%÷OuΚts8f -ʏN+hcf{g]صɫq :e[V`ߝ}2JԖM>XWUr^3uz~YTjRDfNk9pdeL#킥4/:0"wc ?]<_R1xuڨ{SNe_{~8oV<,E@jvʸ#Q#yΤu<m; zpp'3IPӎvK?DoQ:*xmܼ sW]:|7lԿ2potm#6=FU':̈6qm&̒񬋌ȃsPbUnIģ Br9#ǎE*[WAhf8Dvso+;=8lXBcvCm[䛸9$ ʠjsq7vw*`߆RRU[ڰZW͖h!ܱU@"NdUlwc.'#{ᬋG"n_,#u'xfZY9M8|A#`:5?H,hHqz6hI,h^*?Y 3e:muRCSoё]9fͯl|پCd\s{SEf s3|y,Or?n}C7fцrTE04$ C]>>CK1Άɝz#mdb$ܞՖqyU\RN_`#l)3F b/3Kg rdAbE?:8|91`H/nC =5y]/ΪWo}o s\͞D{ۑjՉf>ޟ4 )Yk(wf{ޓdF4icM]U$ks-ݜثnNاicd+U}xm~8Ȓ?ebHSbdR7aJymLژxm\7q|2OVuDeQ(P 9(KE9^_P&9O7Nv9؀Fq:C'*(j^+ -ڳWg - _\{fJsH<E6yr|H;'7@Eˆ5;{ k_̗-δdsoL#QηJ*>'ֲ@#O })g20Ee!lLv5`ͳKb9r١񱿖ju,{5-6RR S[6IOܰUX_Pecs㱳cf͍xYlE^#ٛsy7:HX6vy_9g:YwFm[o:KOֲtKxٱ+H` -|q9]^&VDS'isT daHqRL1›S_͑?RgiJydڔs^nܭ VeRhIJ7>ly\YyU{xL:]llOA}cߦ=LQٻ Pu,Ϊ uαOT}tv;Q!%s:Z_[LkTd:ALt+qayr&3A3eގXLy#!&mNF`#.!oZJ؊4L+bA LY===MT{ u|mq S=2 1MÖB̩P_xm> kE7啳jtU(T];K2K+uVhEH$qi꼮EX*SL,;5į>)@6,m8 Ө}'M\fIM'Enͧ`3n`q/[o+{f7xFZ;gba>:Om\L)7D0.^u HWC!XE 'aR^(!r3"g7򣻵PC!cRɲw7C5buf 6m9;uQu;t~'ӚvY]PY:+t˶E~Nc휘󔙱Gu1ۮ5cDvLOeyK ٱcf=)i+>_y|)H$I4U#UM!>rZ(@V;ӛNhFDBPuEY:RB3ꑕHI_ۮl*(U#܇N_.yc8LyGMbf=xe؏ -;o#Gn5@Dʹz.1[>,ҜPgKt󦭂3r=>|wu+ܐNH$`&,W8jK>hy˦˗lE&Н$ʻ'$C!vaR$i捼%wr i9Sr7? )}O2RhX5kutY[r5x]*dQNI?v*l4y ĻhK+iF!oBu_O# Gc9 0#J̍8*̮AW3\ZkUɰtD^6< r/#JS^RnJ4AJrhZUytwGuɚENa&9 - bB"־!]I9Z$!Kգm5cQr7  4*ȳr>cTNuUun\gή΢C,Ͽѵ4I`oVfͿ:r8NXJ*q 14S.~g%ux -L$L.(Kçy]'38/+g\XnpkӶMjq݇JKv%ΊLpXǣ:9s"X݄E&/~EG'3F ʽ☃7_HvKYeV$ NnMlU PqD#Z5/AgIWc<49͇6*|]o17zsKeY=$9GvSю" )2omw&n\ܹzVd3:93]sP GolpoBG3~Xp}^c.yiβ7lno S|( =4β bε?v }kͽ9Yȼs-Kw!d>"+b}+|^wt#$U]sW\:%I| -Fn -6NS"1#8ׄ Fs,^$i|)ܹ>@]*:L=F%?0TgW_ ؒFO1P|2>7cچ3UET\LЈnxHФQUybEģPo͜W{I)|"#%Ik(CH4ue?n^KHk:l*Xhj*ȱΉ%i"TFo܀\i$.̳$xps8I?ozρ߱I{F<3q9ŵĚ^P|F =L;Ў0^2̗zxxb#֝jo0V+YqU κ.p2ð|Jɷ~I~d`&IB}Hb$_P][4#喊3CUΆ?҂Ns]gW{ ԏZټ"ư̓M;zmnunEAˤ3#۬tŇ/3Ny͞a6u]c:οۄy?8GoR{f?WiXg;boSqߪV#}H%"(ǧ!|0v?5HƯvJmO΃>\p}u<$@%PPGg]%XRދK_L΢ S_"6M -b'X9a<.U|y:D2pw&i%N.ٲl);4SSb̓-T՗GW^$\˳2 ]&Mcʥ%=PSHB1hw_QCb)+iW÷l37LKdV|]&ә_rk&~)9 ƕ<ҞrkXNG16sR2H+epy CAX^r췛,.W]mAhREպ̗"h85}v]W%5dG]:[6oq;*I/_7B%):9R_]_:.8-V$p_-Z¤gӱ;BV3ϕM+#)TN}-v߄$_Ec~a#M֬3D pj~h'Y5XkHk.tPu Xeae*׊qRy x_UQ%/0ֱ0:>eb]J,+*QqTKbHʢ's H-+d=}~!-WHѽ4CA2GiHj"nZ dҴ̍:TVyugoG=}Cxf*Z浳ke&HBaxrehE< xB?Ch -2-4,VDzs{660w"Uή%B:v#$ᯡ#׾E`.ˡ.< k!#?@shŪdtb/F9c[Ÿ،Ft{ KemI,QriLuHI*TD~\X;hskfӛNm9ss!T_eM=b29,r}.TGWh==sCk_Essr5GxFrT#>~NF.77i{xE#}/0ج0K i! -Nllrl=9.쮝Pc'I*G8%$κr7x&'__:3W{2#] _Yo v_%KR0[Pu]-3b۰Qj)|-v]<z iA^&xTeHY5K栍GΈt=dyElG#:5,M+A˵Ol:n9.YTGTv7ߛqMd48۶h݌TΚt3BvY ώq͛5>?=U\gWW:ڸ6ϗ%Tdm4o  adhlWt m8ꮯ%~\,^xYH<2Qbb $549x,'}=TӻY?0ad: ~m)oid_"$MFmm/b8F7SS.sbKٲr-?|: yÝ 9ÝVΒ%h:YʃjMtr;Cx%{f3 "]}vPTڧ*JVFGL"6 G$Bdͮ0O7*&|'I]Y8D䟾"X]ܘW\Zd:iY:pxQѵ]6t6#H= -yX4M4zRFJpu^b>o./<4tuDX/|5Ť$9$ՓUer9Xæ;*c@fٛNM,p*oLdw2Ob8!U$:N$pX՞x 쨤{1.1nW5LOQGj7-[QV+%DD56nWIgg_Or͉t[.$_5VMO5&!H 8BcFmPޝ$v>hZ~zJTCPPFqF 3*dPE"? 6ٴ[FBΣ#qP +Yz9ci2(p4+R3g@Uɹ|ENy}|:DuLilU΂%ZeZX+iHβjbM GU\$jn[Y[k=qH;/x2,j0.q4455s_CNm9kfÛ6sOFWPxrw~ !ĀE>ń4NUk6[~T.l&Ό܎ =na؅戠NieȈZV[CZhV:Eh)=϶sWI?ݧI[65A%v?87oa$ctsp$BX&Sp°Gqz#)]6/ -@js[<@ع? Y<3S qě#2u:n*CJ&KA6bU*U}=EW|4@w//)5IvݠN!<#o3nv#k\@llEp |\&>76o9P<>9ΆJ/8dEdKvq څ]t>PԬYW"pcMaj3~p \6snm|Zc M3֓z~2Y29VU޾3XY ~n,Cx'^Pp~b! OǃW9;6`W ut41_H -ٯdÝQ>LϴOneͷtkM,i1yx΂<"΂,~M,`#h)A_O99"]@DѮ t[221O/i,=f}/Ψ3Plk̍+D<3aFkpDqmnNe`~ C貧+?\=7xm -[B Wj3{Kkcn9N!_DFU +iskᖯA/F̐FbqR(ΪKrӐJB|[`5i^h_6>ߝhsC/;ܘE!, f=VKh8[#}X8pT,_*Mlfٱa hmX+V-/"m3AGhskfrُDV3XToAMrq~gX^g|yA{_" -#}wk9@5IY5ݺġ4$G6TsIPuB"t L)N"XW`õT;6@Nd͡ԫ-Ȣ%!^&ڧ0q|1u9͐چvھciZ=:r1f<*8xD县Ex%vī;4S$Bճj|P=ŷr5_xˁXdQsԘ=# rO&<dt8lB3:3R>^s.~7_wG qq9~0aQDsXE);_itFI r-b]RmN))@2*]WʠQ1+n8y⹯ +/QC^vr"S9)$xKjh ']lbV8k4Zh=ɹ\6hgȤYP:orRWIN:gb5MKq*雓hlI~s VO58;fgdF$p6(YnlrU"{tgtOoϘRx,94r+f}̯rˬCn; VXF2MĮ|4\UJqlyx=U`莹nՌbI)wKVtG/M67&e`6Ya5_8ۯPBU"6&O$]k< -?9É/sFyu~:?j:x{<jHJIq[@*R(XUuF2!t d6cߺDz]FcCçPWѕ58bA)lU Qn:?|Om,Wc sml8Vf!ݝޛ"7ԐƟKƒ (P/-Z.u~!6e}ZphR!@qFbΆs`S n<5ՖJؔMG$53i_<ξ)]>]rZHdPӓP3qvF"WF4 4Y{I.c eȠ -kf*IXM2\<-EjER$&Yc^%.EXB۸zi -=$p/2(@ŲSx؜HE8kA68hLTţK îJVo3Rtu7@ҭDL9uՁ40_Fe%&ı-9]FϺhpDIcw'Jmw UFXjea՛6yҝaN8^}$/̩M\3h<{ ]>q|j&gHл%3rQ݇8Ly@siͭOSʍ@ @D` Z,ډu;r -sE.t'Ύ kO[r\81湮n9OVhƑjA֣ )&T mow،c&˝jM|y}Gs3kj}WZ -ehs2(!U*u*|C~Zʳ -\YWS$wg8j| p 4HWO[90fsHd",vXªuq'Cfb^|.sȣtԿWL8\88mQh(3K^ML -g\ :w1xAw᫤dl>YW.`2T&UKEqq~0`N>g$YD-]q %B3ڜ;%+Xiw؋n㩻[.}f.LPx6 F1# -*$*mЌ)C5 pQ呭ir"n@)د[_Z܍2/60mO&kqBY؂#l -@=hD"09T*ȶ>s^->[4r %&N1`3Wy}WD5)#[Sgke}3G;h~`\'ci嫉:rigu4b&f*f/U&Ee/ ekھ'NZտ0Du,`bXuQ_O<W;{ 2iȘj(VΖhm\XK5Xlu2.Zbf<|X`fA;nMDUc]qkqH_+uxtR7lSgw~,uPo%^#kIjP\dޫ/ݖR,$7/Dqc,Zָ4^&mgpWD^'Q 92g.@RQ{j.f͝ -FZS~#͵O &='ZY[:ؓG'`!eZF0Bޮ:¨&Qڄ'j4abMyuɣN %d_ʃe݄Q@?vNg* VZF&%UQ}NW oPw99TVV:Zid cRfxrYH*'&ִt@xsk:ZFZ7j*vhM<]3nAWb*Zcԅ*;JƿOܱ1ß@XjiyӮ?X!4d f?mF4YI]cī{3to -+OY jbq -ҰA$&krQ߂lx]2vDHB;e ŢJ浲yQW!3FS s˪$))e2^S=;*Z.鏅Ƙr*\f7xP;s$k؆΃>Nǟsg:s澟.ɯȫ=S%L$qhk#$(i*:T&FUsJdtEOɷWm|V-r]tfo8,OeWR'HxԐj"<X:ÿ ]uŖ;Gw&0pp!Ej2pFӆgׇH)1Ď4sk6ym\6 -53ZQٮk'.rjo{xVǍ\h$ß4#}hGDZOsQᯉ6zȯ5\ }>DiCP47h5pʣSζuԳjşiQi - r)ZEԻ_sS]9uFndRf,ʀaJe06۩)|-YP(`hreYQM?JFbq44Ų]+$I&4t\hXb:LSi!<ӝ!Ttt"GR2>O07ЫXe XNÆ^R/M[:jVW}mOeFjqsT궞raeN7rZm${~A}.w|5ˀi%(BMHF'v,Bq٦?\b]N}NoYЁ -M r+١p^_bqasswF$K|49(#:Dy͹Oh~)k%7 @&s j6 -yqk\d9Tͥ7ɅW4 $F]<#U1dS_! w>[TwI٬=βu1X0z'YldY̏92, K3t<׶7._ x$7:Á>"^<9|[I72 y|W9'hAb "]E%j߇R fPCW-wIPgq?1[I_`|-ٶڍ:ÑRm'Yދiάg:h>X5q -xPskgU9TκZ~n]vorQmbgid۰GǦw2 O_A#ٺylMuyYʏ~ Y,Y˚v$h$뛆x<:5w˹#nFv1ـbfaz,C(si͍Nj49EÁѾ Y4D9?JA :gO -I+n? .NZypx l#z1D\LLLYɇ9iiqM.nF3Mp?ͳKV(8@6H:Bt1Cܝ/}a2:?O]nB_e.مuF V4J_oi<"BPg2/v}dqSbkqmlwYnY4s,M :Q9LM(0D!ݳ$HS{fw#%t o5 xv,[=WIlXb9RYz,40ij J[u6ksnib3}\[SYh8t09G9K%^!)=pYyL}"UWs?HWhrzrI\D!SIg2*NHd] I]"weN1;j vZ(+:eSsaƚ0Ol'v5(ACU5E$KS# l?* YK1+ Bwoi'bOv_O#71 -ք5k_J:xfKEϷIt#} 9}3CGij}Y/ݣBG,P)IΙˣhFr"}0Ns1) vtrxHWE`£HGYgUTgYOg /WfyP5n#Oa>koo53E\Yaslʭ$\OMr(8+%eyy3xOzs?&/lOk |Gpb^Dį[ߣ=oGFx_H{52ݧŧXrsW}*"اb,WoWTACgk0g˭n®@86?H/ZY!f^>\WoZem\^b=eFFkݽ֗&s2 /4MrConWs9^-*K(g<2USql bϛʖŮozAk6cYdjeC'Avk Nsf3v0,&fN!wdΚ?[XnēI#q~?^0]'ڽFI93Jʼg+i/`5dŻT()َ Uw.ZjA4Шv3aq5a~IG x,[0κlVuoK6Fw8OK -h&Y3Ap8"0]s>iOs Suӱe>tӚ kxE<]Odw,vONK:>[ u5f''MeJj7+V6[k,cEzEΓ:UΛ בpYMtsVG -[I,2Nwʈ4_ȓ y> `|}5hP+,1JHZL03n|2!RN9KBŗSK B5k'>nYLlQp -'b5LDc_IĜ6q+BMxIri ѡфkHKgǞY|_zVԦhШ4RNv͘P2x&6D5qS؉Ybp%'Pᔏ)F{iC$S'\Ĝy|v 4OD}{k|٧r|^eᆹgIW#(t,G !G>lykզZ^#O߈,4v>ej#K@/B;w9Vi 6nEsݱ5'MsVn>LYϏ7=)el*C\/è'fHMt=#]K -BW1#ݱaJ߰lsr=ɧ˂Z[-M H xM9Ni7\Icp3LBpy g} djzk&tݤ_y|9&w:ݥz}rޮjzzMklqdV5?C ijs{(ԼJ!'suܟϘ]S#\1LOʵ}FUЅyUAIN]dF/OV4j`2U"AR~~ E'8|/3ql$X{d-sFd$+ uRZv(7k;O_4F[ߚq'\Mc6q R\V \o4Q>6KO - E˽Ldh |,ٙXGOf;ܟyHc_ ^o5St|.FHؤCwӈɬ|ۯW8#;.馃~1;;gOtۑfrSM3=)#I6ATlȿ1ע; uF>@xl^tH#]*@u\sAmgx/F׺@4܃Nc^T-{jpn`pҦs.C$/kal&dӗ\&%۠:~}ck篃ıE&H6kY#~L%ۙ"_C-vK##%NB#;jsuve^.^Rь? 4Y-qWJQzYK~m+uu3_]o0sxƏP7$#b S;3B /ՍHQ- hw5\ g|5;pn =>vk3S6jp5ܫv_4sO:7Gءolja&Mbxk1vsM9Ni|qƨdkfH;g#8tleΆLdBB4ʒM 3ƅܕJ#aiF<|% ͹ydef3Fޏ}I.ؔ# ,<3 kjZȲ};40 ܴݍfweVgY[!_Z뛉SQxBĚJ.Vb"tV^"x}#ªo,IZn9"dZlb6.$Ca^E|&T@|ݻ5آZ|YXE>J.:$4%ov(XoCn5҄-EkӿU<$d+´D;M$ "07 ЍV\j+8a]¹.Gv+22H5N!8tq#VbbbۤqqHZтxZI -xmt] ֹ,l&]v)ihc8GGs-9R钱HdaI*,I:5 eS[}v`4|C=`pׇI= vrIp\sbo{ \EpȃqvxGP٭.` -8)$o+GrkC\q/MչJyt$]C"]]$[#AŊ/&8N1B(%4L9qusBvَyNi$yKVP+sK"ҭ^#|XR=v`ʩ*Fɳ.;.Nì8[@'CҥcG2J!aKdn㇤+ӝs3ijesŶܲg:"iï+[,9:-9|O7ɖè@EFIR~!6LӊgL30ΎY)ҹՍ$xÀ5$2J(>q%X'nw -V5:7?l/r}ϽTNk$]5DiY6FX*F$t؝D8uu'efQvε vPBbYkE1 #Y;C qcDXI#$W,2HcilSh3vz@;sAAaeLK*x[{)(v;aƱXea#* %~Loc4ηIdd)oDezZv ̈́ݻ- V r(DwZY ctM*/G^̶F>Cm-4uZ\kӱo~eWU?.dXtXcL!ꗇ daNq%G$CXn~W8>}q%VBBi.+Z:$QW+#᷾># Q]M,nuo'@s)cCãɼH'!!bѷ!/*2dފqY9nv_BVg"z3 djw"7MK@pq`3xC3<ƶylx3.^G8cU9k :Uu QmIk1^k.;q)c1Uu6d3UcBIҟ=^ "6_'Lo˺/&Bq쵢E]blB["|lU+Klוu&)dMZ`4dzpZ&`hbv$mڳæs=fafVʠ{f(lȃW:<Φ# t{2%墦HXF x,SȠXwr8#vhsCͭsl%t9d[ ^kfͭ66llٰ͍,:损6hg͟6hsL49hsCXQg2ϱ 2J.3ؚ,`$5tP"2sы"ws*8dƳTw I0{뙖Ft9ܢ׺ Ԏ8 Ul׈jǒe]%՟ӷ:[klc[V+> *ݺADl02q]䩓O}+H%(. -q~T -T[pGsg6m|V/)uϗ+z#ͭ_4lz`pQPi+%UP1(pRr{hȚX'](Qt!Fx#BU"E:i~m|VΪβsay9C<<uV36s|Λ9g:lMs.stΗ96\˜s6setΗ:6s<9'jβuu 70q;c5-ϛ9af>${e#B$qϛ:󩱝UYg:9XΦu63]gUc ':Xζuvsvξu󬵆ݣ塝Mg[k:ODO6st${s=>l͝MU 7s̮3\3-gXe/:8bb{y$S1umgYg 9af>{: 5]H|ض쯰WpqKco6y-R#K3%i6 QW[r΂R+\_XsxI_m'VL5e>i61Nmb=-m9|8fgSW :0ߋ<oǘKa6yζusD,ϛ9g:lKs.setΗ9:\M6s|ϟ:Yζuֳu_ky839yyYYCIb0gAa_:ξu󮭂S]LgWS:U5cί3s`l9̇92,ÜȰ2o]3L6skfͧ6ٵkfͭӛ[6hp~l9͇9gUW:Tξyx2c% !0@P1A"Q`qaI%I$QDp#y$K53S53S53Ql?3Qk5_{"Ю.G\v} 4]DbŸlm=-)_GF! @],_]D>sG"FU0`L"}Cb"ˢ?b0N.?HP`]|#=GC-B#. $ pYuQg8oQ#Bpw+m\gF2ӳd/\l٩|G['3j!AE#O}ucJfoa{!2# kȵvoiwNs(}ģªW"|쭇WwFDI4J.o|6!Y/TwW:;R4M&C43C40GT~T*jCnŨ-GSb$wK%FDdXo/u1܉'ȖjfjfjfjK%##4ܽ4Dx$+17U͝HZFQFjD|t]QU#jG~Fk4ǰID~qܡjE_Ol]&L2dɒ^tU}vd1UP㓞C;,\FiXU骨Q.h{]*z?V5"Q$$վ$lY!I:PUcUcَڌ|9p'ӾQ4G+?|\2Q$J%ɨl>*:ȝu}6wQFjFjCj8H̎$D ~j,{KvN-I!D"iGpD0&>HtDetkuXIG] kWS5R0(yoaQ -#fG&Id&i9ǁ+$21Ic6oc]ɚd͙+j/Bٞ͐@tLbTJHdlȘ5b$j;,ɢcgzigj5#Qk5?);&ēO͓`}VM!jvG!]$U}ו!ګ$؉?[80>R!R"7D4E{.ʍڑ,i!4E%A~C*jR>DSBDlc2I6[EAF ,Ji -89JFl#$ȏp7ۻY$bY[[btb0ctoZ5LLLL7'?+Id %mtVX%bI}: [R:1Ovո1I$K%cKfn[^Cْi* B06RY-I.3d(V6"b2P.q]I G if6@ŹfbK%M2&3Ю\%MT+:p` F F9^UbkJhӁ/rxaxȬ'W1R(gwiFi4A=ض'F,ؑ sHF&8Iё:*Q>]r+7č7F,p#]LY5ɑɎ)zh%EI+/DTBz*WkG6@]"T& E93̐A 5Y":4F(Br9x:$ٍ1_$.ѹyB5Lkfkfj|xF3GFLY,mLgʥ%x(bUrK;!:5uKEpbs,:ǺiDIĨaܙ-UI'a]+0`(GOM#Q׭'|d D:!T;ELnG[zDQ&QdbG8뢓#O$ő_fƈUlW?Q(I$guX9^sC:Eb0F!-}GD3$~I IbQ$d6BL؁p&Gf݊I}z%J%5, G .k5gܪQ -:xvLAnFV\uTvM%gQHёQADJ^Ȅɤdyѻfȳ2=>+6r&D!k&E -ҹ*} L}(hOG;GlY$] C,5d1&C!Y ,,d3C43CM&i4 I,CpC!EbغZI,y\.")PQąD -V!B*!dUޫP$BHh1D:uT&~膅DRXF"F4bt Q<`҈BH$DRҪDBD"҈D"ҍ(҈D"ҍ(J!H! ʼnA^(Ѕ  0@P!1A`v,Ez%b3B(qv~;OJŘ8FӑwCyX(((qH߶E9#GC 8 p4x7aN_<zGz Z("OC7q1G< Z?s%܌~ tq0:=ZCzWG=+%ft+|Rp dhSp-ː5xgXޅvx3?ù -c1|#jG(iQ(cح#7Ӄqq/4n0h'# F(O83p+ۣ>:xf|%C#fh>a9T,R|k; L=R|N8)uE@ⵊ8S!?5mQKZph:Gh9нcb e?cCC_3hXHt?A}#(bs#2cb`ЇιG``ʢQ5b}`>Qz䝢TVjv,t,?>"4!_'|x 8!=!)k{gQн5t=wBK3DY n8`wtF-[0cn㎏8IRtGzJ.A*v}0POA#1AҀEʷӱn:'w=pƶjH''="'@Rb48f08`4 -(y$ x -pb 4|elF!q^J-f֑0-CNE;6]uCcDi<(`(;`7zJK7OyzYv!РPy"=J,qNkCZԩdBB`53bwOPD0Cз烎 (+ѥ dmq9<^/bb0гB -c@1~"lX~4qN=G!01AQaq @"PR2Bbr`#p3CSs ?oc9[y=QfRL8Z;+Ge9S*Iz/3Mvi5٨j.B -Vv;U̔,@̔ @̔,(ے`4xv_(< @P*.Gܦ挝ޞ#N2SO=AQ ->E(_(&@>@mQE4@&L>db.Fs)5|zH+ϕp 8Cg}SOl@uC`l 7>G`ۿ#O_!5#GU Z -@yoةGC*u8R('VU!ȩq:v){7bFȸ>씈=5N}d$yd^ê)d=6LkT!Hr*Syǖ87b9"Ii:dH=Vq#]У@Dn>_֚ (\9jsF#QnҶRzl^O iCMϾU?Jѕԫ ;iq Ht8›o%fg> mTd4 ;&.`t?:TCX:) +'Ȧ})xF_PLk%BSDo?*F(#MZB(r]̐G̊#d9jU y( I(]L^PǒPҴMoA+QD~F2QPfHPjvڼo) )QCAFjnYY{pP4媯PÉPF0*̓h8jM P!CL FYJ7gTM -&m,1\3p_ 0{~b7WjĚQM)`5t]\pQKAҪV\' -mO'7T"ׂ@BSiAJhF~&&^?25](1w4EǛ\Rfi<+1^JEO]\UJKBu5ABGT/'MP?1Lfj6MμEzj7jV+gejNMkuUȍ 䭄z+ssVU|ժeh5+TM9)U4Sl&ΩM2cꦘzW<VV4٧8454sRy8G0+dekWk[e7d_ȟz=V(^\𸊽ZvJxx+>JJ) =j2VfUggoL`9xziSTOz{Ԏ[ -mP=7,/?SL jiw5C PPwP@*OOO%#}()^^2}ݾ+ChB3ثHդ}J>+g*ʵm[Ru>ʕY;)$DMq\x+3IDVcuV'ﻍ|6>Wቯ5޾]3$D_=ei|g#t6>^rJ^?*%BVe=>A[_Na኶5hCK# 3NKx< 1>p[^;'k7~?)rZ(Vw+4TSzӊo-M%89!*+Cꬅ{5Ƽq<a脃5 zK_m~m[xU9-QW}iL>LOoxotYn* ڡrc;4r >.QF}Shkm?>RFfj:s -duOxQFjWU43O~vUktm*>+;)YҪ;#; znj8op:o4Jb, 6 -۪{9(UCzn]be?2.u'jnݨ QIJp ST ݓ - -av+7cbsZ8T)dqL+ƵԌhͼ& - f;^bZ -uс1šѣuDޮ_A5X6 -ڥfjfS_m6VVCT࿮'TS&8,N+wz( -`@v*jvI+i WA_<1AQԑrFvPP7 -߂)(HF5ԏ:SQ>n=:E|I -aU 2(N4TnVNh{~:6}*X: ,0X\]?U'e(@:@652+BMi0_oP7# 9(oGY 21kUREcUdwԬOA%?2aMNd'4NF#^]NVZ rq´[)4 ƽ4<5Exq8+ -*ثgTW:OǛU+r&+o*ܦ{۰^u>N o-LΉ*j}FsMQMGrA - Fӭr3%gfIBU5S@STڂ?QPwMN#.Fs)jaM|ivʰ*QR;+جqjXw6 Yʳ5YЬDYؠ>SiEN7R4IEumdv&J1Nu] [H8!G#8ׂx1({y+!h&=1PnͽL(7"ꨥ2h j#Lj5p5+\F˧Ŵ9-z5›([ʚҘѵ_lwk~0C -a@rkS.V)MF.㺚N)vX87`iU9l4L++6E -vv&mwQz˜pkv9Jg\ PBOiLM}g'Wk.lSTYSSn*'4s)<[ߋn8ULrSVfp @x -FURQR533^̻NOͥRj=ݒlSo#%d%d$TAB#NX_< -0sSr5bzY\Tp>68SytnLBm5Tݱ0Ϛ0w^ 'e5Wx#F|4sէRhС d -)Pp֊~Ud -i!ԫ;A`pkk`PE,䡇%B=DQcz`GY4D;&ID\(w&۴]#SNŵs8o0;{92 -LФoSlM;+ T QS V:>nmkMuBv)O+ˆMa n2S?B}pSQrQ^`ڰ44PoB9Q{Ǣa5LS<檷:9[\E㇒i!9^k^GiW\~RHP>^bmouzSGZzamO&w!@:HpҬ#U?PV8㴡CMK/:&NFZ7"R;"N~J;dwe9iNZ\~W¤uד0)^|"2*ҵVڅ(nel)Fm㡄S3Gf)S7=WMFCy5q:dh)৆S4븄k+JSjz!ji=U@3*k?ʬO`oUPr+vKCܢof8e]UGk QS3533Sǚ{]Tީ*H,'8XVzy(#tBx9pGz)闲SvS5LQ{G+>cAV,7iisfjEG%zѿ8:-ڭ@Ვ`B;o +$$2R5;>+Dh!; 2ng5Ly^iR+W9NUVU pշ`PM Ҫ2:Rm1 }}L}U5rQ -xK}wɻTߙI/b!%({]XG?E/ Je8k?ڃZ_LezT17Y8XO -> -# 6/EFsA_Mlj/}6OǰdLf^@Eܦ C|i<$aiqVO{ -r*rP+-[chqۂGxYnNtzejuWz{?e3G_=(e")BłVjNZɯ$o15GbeS -YĹ0y4 =Ğ>:{z(8ԨS'PZ -{皴Phڧ.k}(4cBhJӖ=Uh 5z"Vʔi ĚO|*}: -5SL+Rpk Vyj*#0{vU*:@ $Tl0ƉAUiBSpԊc)J+S -KP.fڵ@Y]Eg9Wk%c+ܡ̊*G4˿QJKwQƈkz;fVj$~Bz"%iJ%L:Az}Nf)-nc0CTqGFGSZ96 -?x UZqF@$9=;Rk$lBs6۸|`j x:J»qG^{pR2Z -,@ܔ-P\uU$xe$ -Al:RgSފ{qN -nq~ӷATi.Sl[ZiT1HZvRI -կ4PT5g9jo^ZjAa@ i]sxWYGC@A  n)*t7aS8S?}I -IAT=?ݩiܘ}ϪTN.8b?+;R{ Tee.B. -=C@e^78nrzg$zSLQDxRMY ~ Sv+]0( -7ukzhfjݻ$Q8hEզa7fa[q\;\QS״t?e+R+R!R);'` d2MfKBS)ODrsR~7bj@<E8y -J57ȟ _:kC]+ݪ;5Y;ݽjN)خẉoUo -fOuGkujvLpS=ܚOD.5+LvD)]_uq? n wߎ0B(BVcVSVS*0Y՘d -+7`݂ -rP=B5_qg*OkVdiN4VUke:dtP㾚(rjxPcE74ךo5u=]`>p쓉TBx<'-JRlT=TZ#Ok Tܤq4ym -CrJLǎ]VwSzw/SU5ީT*ҧ\ۿ~mSmFU[6k6\AΓ$wE+*B!]WUcTaFMP@gj5YXUh#E\z&0h U\߂oB٩l dr!>'SpL۪!Tݻi+y> [S -R9tVj/ioT;r*Tn4W6WTwb*#~TRj~0LT51PnЧT*a+sR4x+1TCQ!T_JP2SvS?e)wBs4R7*46/Vd1mv; -0gjlOzV~+C3j2n:۳)ޭf/-]apjryu7]9)}8'UnDhssV{Sm7B}df#5QߔU4kMxš8r,y'hJ;yk=SR5+3R4ꨈE ҟS@B} -y?uFYPnhqCڋ6n󬯐U[#* S PJ=骝OONy&ț"Wê'D U .B( !+C=C >tB}hmTM1n P5@SZ+ʋzFJP~e}SoZc}( CR - =pVPiM-qT:^/GG-U<Tn5E/2'Woe+a.4"A(ͤo;N:cA՚(Qs ~lx ['?;O!-šKAx'9MN YXk+4yf%[T\|\fZFBZTkA -J-p[O*:Ua!׫餦6je-~棻Ux<) -8s@D9`sEv|bGw7Jk'uloLmz(7)O>& -5of=TW)εG8S DcJUIVZs*ҭ*vnjvjP;"K(s" - YWuR;$ H(58=DrѴ5KnSWRo5j?<;'CKFU+opIBP|Ɗ(o'av1J+ DWvJ1ݽ84sDU`Vp";B̨CkvE%p0 ܅jvTr؛xAQT4P=AAD[]jkqz*p?$;)1&5DAD3Q #5ACDsQaFTnLrɏLz:eVk怽|0PE{}ZҬ($mB?@FsA]2:H_(ל8#\5)1ZuVZȦF(O̭`IsU֛[|)D(5^ u[<(@6y?bdBtߪp.}Y\-S=9+/nJ@ ~9VИHuߪg;ic[MnWÇʄ$ t҇T;$pĩ˜W-SO;35;pFee0Si`V -l8S^>5]iQҨ?zgijLPP4p:=E#?gCߒBisI?TnRFq)Ԍ)7iOM;$(ѹq''S,[+l_wu= nrHVv3US$#)(jy&E|Z~Uٚ35ӉU$lxU;3Vfn.fpO'Ik -l^Zj͒ϳeOC31< -; עBePQ8Vr:|*m@) 5Nj1܊|{iyN?OYZ;+u5R/uO-Jq؊8hFE Sg_D3cadd1d p=vL&d=f? -=;\iSj:. yEuq9(.gdXX(}Sz HVx}!AκJjt_J,d -XgQ%^$!6wLl"̨?@ϬZ=keM`ijL7龴0Q-rmҪ +&N#ܶC}oSS5ة@x!FQRQ5BxlkGS{lբ\Bij1 }?ބ7 )Xh`Sfh7SU -qp f9Gr:+4+4( wTw`zX_yګ(pyX{ưcO1٣qLAV1邱~fcZ/.򪟸VZ;hVV*ҭ*ԭJ[;bVmVi.XAo?XcoUSnY:j{Í}aYXV_/!WfeVMTqjwS}ڵA#NvO#ޯ*]RG_{h4ާ%ifJ2VT@O -JI>"Njb0O'Q7ǸmBDq.=UHQSzybrV tD\}F\wQFgs9H7U]?5U%RR OQȠUy(Ue%Y{P&rdvLcj7aGW+AbSN au5uuy^WrN=u#B*R*sVLOq -;jUˆV'$_ -yOrsEwQHj5VnS_nJq@h+3T5dx~º7<|^(7%J -OPm_cyLiJ$+m5;iHOq})ٍW·8~݁[ |+G*+ī)Uvmԃ\6+#ϡVW6ÑV,"puN@gbh -\A@ 5`8:!Dcښܓ"5b5grT=Lpc~<"^vۧAB̔,4?%7h4Uiz+k[U3/7uF EHƷ5<+vVy)sRw)^z{q4߫4rί󦇊5bٮ'Q(PhSi=upVZ[?Si4u6\tQNffii VЍ0T P52'V~݀N0 -\N'W -(%!AOB~kطyЂkƬB{BxQHrO9'ݒ8I&&HǦ8acy:z#FADTAD3* ->FT}ʋQw*.Eܨj3i;YNjEt*=Fgχ\Q,g4cMn+UvҜ캘צmJgfJ&V.Sn?=׸W|v[Z̫y{u׎eZ \<T]_2?PVvdYْ٪.FHhg?g΀o-N..,:cnQ:Y689!٥oJplT:yT-J_KޭȫszV|CB(-[޿=[V⠐=@X5Iһ|#ftHU5UV/J2y-Â$ӎ~n)N액NT59NsShVZZek -PF:PqL7Fb|oe T QSK}ʌSqQw)wpqUJ#hm4w<]Q\v<E<׳Q>]1V9}}}}]ʋQw*.Gܨj3aFsQ*>>2}ѼK^:F=Jƾ葵 -:?SVz"\{i4$9T|:5DM-E_T1)\`/TO4Ӛ>EtVЭ'VdT~~n%>sR'ӢlYj`rgJͥ|@$8|Ѽ*sL9]9j3P*.FsQg5DsQg4f^'P4SVֻXJfvVt{( j}P)BO:i$1G -db< -(0Btj+{7;nf4R7u?u0ZSʴVi=դVZZUZj)QZbRH)#WLWbJ4N$M7d}_=}4jv(8ӷu6/d&J׾ iS$2L2-cvWWMqV?X²4,)xHN'+p׊H_iqŤ*SqN:IN: -qN)8Q:NÊ &;C]Q̃; w(cFy쓎I$ُ凡B=Oo{)"9vYE(S#d97@pޣ/Y*4;e|1{xFyީWCQvFjhw'J% R RvRvRvRvR %'e O =؝DT,dSFeF]X9Y!Vb> god< kd4;~ -w0UƥEu։4^'eRy q -"HR+wyM5UuUY@t x#Vv(᧚H)ù<3uhSU^dEȹ_䋑r.E4\NviNr.N~I,QXeX]ٹXOuo#q5V"791M!$WO9)JiOy(ےhCWj8+q_qVҭnw-2Ѕ)=J쓝^zd!ܶ%'/_Jl?GkW}_WQ$SL~E1(ݒ(ݒcLvH]K6xIw3&EDnGXuW1J<]DvLD{((A>%YAVoU@O9YsQ:IV%ei(PG=lաZb+d*q# cJy?}4tQV&5A5]]S%w%w%w%w%w%s"̊p=5q_jeXZ֑Md -RzŽt]Z:5>U}Xug#2q:DHiOpV7Z{&^ʒ'"IZnf QLkmAW3O|׉$If|ng<ߦFR&NNN$dݒyOr{ܜ^秽9Nzs]AJ*-S^fFN4r!0CpBb{:(B+_););#QpuVwVO_+K5E-6#tL/) 1DG+4Y$ %ǒʢ!QW_zb /*Z--Xx(8..EuFZi=ըQVEZZ -;SNhr9Z\NVqeTm-8ZWX_]6Dǣ#Bp1>TO*SrSǛ͈VF91 裍Ǣ߂d{0L4lVv]~/b q+b#5d*kVK"=kLz软e i{Ke[=UL̕lZޭ/SIJG^^W8x!PS?exW;vFfjVffjfjVBKIIIIIIة{/b]DlTƅHrNiSEGtA]E@}0QjrcGO##:NW;"].F<׍Kf8ToV -[ÊsST@LpOgdvRF}ZƇ -bՔ]$ PW՜fӴs^{0Jt$uک"-ZުH8|Dj5ȠA*Euٿ}v*/f#8y؉}P#RL(3WsEnh4[s3Nfi94fٚ{3DWP=kҪ(TӖlLt4Vs‰+Tp/k{^W\U -j3<‘XbfjSv*nMة7bT݊Sv(j+DzE~jEb9`V2:8if=Si4ÚmBd5mu:k;mNč_7Ŧs:+sպ\RH@ĖdQ&Ή\ΊWS,U{E踦 - ÚT]Р%SPۜӟ{B[b1eNςw!\wאڣ>b7S̫Mjp@O/w ʑ^ؽsO& O'ȈN|[6`V]0VCyUb*k@ -m7PvE|Ub5ÂaZ靅*kzœis䦔' ]KIUmSJgMkdFDW:c]e!>עj7bNkUNn5LUo)T=ʋQLQFGdJk٣|HƝ|I# -+IUQRPzp @>xQYIVq OQ]b -!T}m=P9GvuVUD)KrS3?{ET$dW[h TnDsM 8@Rpr{UUgQ4U1(5WvS50 -nZ8:pʮ -;nh=T,B̔,Dܐ*qձly#*_En t_\SOM5a*%))DZJQt=ێpS7e/bFZNJw)JcukrPw*m/jRwV)#7[!+Ln0tīLyLyC's^ -W^zm^J D(+!$qrWq*ӹBs*Pʊ6zg*Rө*ߣ}Ug4(o+5UTdUT'3)Z -֟#\w![mPFܓI&&j^N= ;" Cx8+=GUg-Lc¦ 8xU^CwR+e0ѰC 9j*FqsVި:^JZNt3k5k54|w`oNn7qN{OU {hLB(Qƃ SvUuݔ5y'WKԙ=lCZZkJCJ( -&eUD⾕ kx1OǢNTL#PRx-M鰜gb"=:i&;Œ^TAԬ*@=ʴ(ȟڥ|cOʹiRd/Q䃆&O DҊ@jwE ԯNWn*:ݯ۹0A0vX:[+[}U}E[=J#w=4m> r[o7j$a!rm+4*qC@COvW3VvE O$[CG-kCܨ{r}}Z)V~YmYUY+7eg -d - -0 -0 -0jA~NL|k['V) -% T]g#mB&)Vw -|MJ#+TǢמT*ӓT[wnS]{[^Z?QRO~muMv(L(Mq1;ѼS:i5]2'Ś۾ u#n(ذ]cM7 e'ШT*+*څ]GnVUkjjZ?IR=)jLj3Qw*Pw)U j(bLTOVµS -fp<r)ZOftiLhT]6 k# ->g*0+z.uAԗߢ -[JrVӒ;SLmht*#G`{!)'cp ڵz5JHvC*j}Nh5[|( rbngu+<_fjvLמe9n8('{=/sVGUl[a[OW 6}ZQw-2cMة{)ȩ1G6G4iӇ0(?5 1f:Ȅ_â+ c+$aYb!GssDz+U)+MT aT. -.&Kh=e SwS -grk=հVҭH^xTR=J$4:X]~n_Ü?33]Z#W1i -ԭ+We9w-.)>SNIQ<$Z4hVz՜+!46{f}ЏtGtAB@6VV<N_* j cu A#mn2Q-ThuռU:Q4S&zewۮ8oy*"JJh_-jM+IUJLNIT>kfԄRǪd̨C&eY̨dP>J;Wnʪܩs4>? Z8r@zMoeQ<(T-VP j4GU*#9DbMWL3հT͢Ӓpp[VP6@&9?)[FѥÚa0 ,u9Oz<PHr( *a<VV0|>nItLzwɂփ٫0Lz'^*9v]~ 90oLz\G],wbV^B*8`9/b熨lSnEZD1hנ*r*{'(lMc^h;#eظhJ͐pP۵4I5ίF>S e}{&J\(ɦQ7J\NhoGQ0ewiEҙTo3*(W4C~U!VR*(Ei!iЕfIVoU}%BZw5 OhVrB*ب֟7 ЍF%%2^׺+Rԫ'ԤN4uܭl#zMS}] +-4Ա=Z<.x}7+?OxGxlHS% R.4Ц8tMz($)S++sQ:֧F, -:tR54+OmSd1PZ2POTnWmBA|ecDu6"oڬBТj-2 agNI˭)ׇIZ^{BЭEkܚU~{FƊ`'s(Z-5(<|64U{hۿ}0N)Wqu m?Cm>SDa_]1k -SآwP"aԶo"U4@)yWnQ~5BP2Ǣ}v.N&ӗ#5+>+3R5+3R5+3R533S1HJNanjFYm}OaFsO8GqV=ygE-;7Z(efjV}JV}AJϨ)I祵r+@>g2S~Nw f j+jUi39)';$Mzxc}B_XV7NY}QShmrN -+P4rPYR{I].=TVWxO`'ldSb8(qU#n0#8})OyutHjm<էVfkS\\\3f5i5i=6a%90FUok(=ji]جPQ`/Jh4$`TW!4)vҪ/l7G=*xD\̅foҬG#?eES񺩀]֚L^*Vy[sR4ffjfffh9jkhw)jfNCCz_v7]njzL榗4瞥4T}}}}J!([(d@VhY#xx/(]6c='=^=|h8ENU -sPi{dNz{݁ߦ;j@))8̏U++(QPmHأp mT`4Vf}J(B!4vrVp8qP6QUrMzb{:)Zx#ԩ+Tn Ǩܡ%LOjvg}ZZjY2 -Y;)d쥗^IT'֟7ըB*)?6VU쓟~M2ZJhJW[]xyzNԠ;*JpхURa6V1 -K0jZGU!yQj7N/p~TnVZZ/4ͪ}hԍR0SZXjjiVZaN* (Ez+YM2߷IVI.|)nlyVf+;j9+32P-o  -;𵥽+ -bzMxxeT1Ò+Dnq:cLp<5 K<dNVUiEZT}VVhy#SȺي8R*ʱ]7-Z6&\< ʱz[cB̔ c] q؜w&c'5 -WDUjUꦑޥL+h[k%am*S3ѱ2=f>-W _NHPHT0VZ;1Iߒ(]م((aD~&w ]@F oLQpO9"]衻κV$d[;SNDzy6bxdByUJrUE7OqS0KqRaj-V5)jiTY`I+4NЦ%ةM,,8o cuZu7CTS|N[rT#QtEPAJfSG^jQ9ԇlV#Xua*êu?x;1d>E Y&t,qQ83 N;dt -ۮ⁡̪^U_袹\5M(Nj1bP֨P$oe)謅UDWT.oF U*ܔA)T96U5B}K -vZmR4 -Tg kVR5 -` LTڥF$:!O75H5[iƻR4pL5 N>ez{ڭ5S)w+Y?U%ZSdž%UQWt6NOMWM.#*F){UKa܁U'H3TKHrO9';$ צ5Lz7(ߩc]((Yk+ɶ&biE/t*v}C&BLh ,P +p{!QMٟn_4>ώ;;{^4/g -gjMJtVpͫi -&dnI5VnJtS/#g5FsFAUʅEuEE'Kv)ZO-ZKJS*cR$j4:O# ^PpzW8zaz';9ǁܬdjS)Uu*N򏻠B*6P#G6iO *N{'hx{oȒ.hʔnG:5NčF:6Ò|ޥuy}BީRi[U![r%ˆ+h\)^w#ȥ86N;_2^PwVCXueTWNZ6?*66 Gi%HY$/S\4VИ)u}U/n ڰiFLJGGܨ…dfJ&dܓBh@ >#^^(wV':ӊ}FkthFytnoҦ+|>;բ<էfJԭ')NGRvsնElztrR;$qr4w /PUI:*r*+*`୭գhEZ:xkxY\x-@uS356JSr[4:דiU5w);}L{JSup 6Ax&wN3QLS.9],yn/Wy\vhu V:+Sz)]e.jXQT -QY{)zlV4Kjf$t00*VdfZ^rս,V+K3VQ8/x7'QOkܛq0MqN%%x9#QthioMs:+8/M;]no(FB1߁xS5D6S0IAf9@)b0!1?F %v?vP[yYZ@a*dIH*B*BvjGfvjGfvjCDStVOԭMh?MX}U7*(/^`j j;#F#^zG´ -&b}6*U?e:.>!Z -vM+Wwo<:>1Vۃ -pE-GBaB|qӽ[0R!}7K;VT݊w?P)T+D68qѸ(H<f³zNN&yꬎcCj-R,mA/( -|h4 -DX8(qFZ\+8 G]KIr2LWsWsNj)yOr{'99qJ۸ &HrROC:)b5# 妗}? -1WP|~*gfJ(46M!8 -R5+3R4kߊ5WM oEh}yyF;Q -MW}2R-wJTS)iKySm(̠gzNWv54Y)Bvh -nblB5Jm!UDžti'/}wHO:D۷C YsBSZ8-GΈnh𮞴Wi4vT 8d ~eh530AVp/R5̫Knb-ǙS0t%ZQS_@*#UjA~W#z]㒥p}BϚ/h֋q -gD'Lx' E{!/eS^;uP(i~adhVAcoSnl"~%B2Qa^JJ~T=06@gbwIy'Tm:j`WrT9=H(HSܞtu;i_?2J'8RJ)E<{/k{'IR8:m)+EV{IS75# Q* -YX;5tV9)<[SSŸ =Nؤ=RZ[uoM)H씎R=97n-WӞ1Kֈ9ʏCܨNeA@4@ޡe(ZbaM%@2PBq7;JS7fjUZj.KoVn㊘ኵ>Js8)$NZvJ}tnU^; -5M8l - -G}PӴ5QWzW J/FEC-ꚧT5Exhtv Bjd[nRh7w6m* CMb@EORG2G4y(Iz8!"5F1p4ݮSM9[t}RuF&xtlX*~~[u~cMP?9MDFע٢Cx^Z]){1Vug -PDSd̐fH xyo<݊ẅYug??f\{6G-4K#mS%™xcA`hݩ}l߫ڡ)GVkUYؘu<2U< m<-8ׄM^[>dN.CzeIP涪vfmC3S.9+F*ij&THKAݔߤ5)\blr#G5Ej9+INrRݠqi2N'F˭mFPWjMNJ+/*x~fIVz7"5QPnIiTzʞ'3opWU1VorQ[ovE[*vh>1`uZx{w򦒿_F5hҧ%1up6gyi*%iy#Sʴ-]@TJO{]K ¾U-՘V4lLs -:(jakGfJPG<0̧B:Q88rс.^֋O'@2N0P =?A%XrW<Hq\K/9jx 1(]ih4[,9 -Q'ɉJrR%&=<VWmU&kA޺^9)kCLԩj*{Y̩|f sPEp۵wC[cObp[yLQ%Uo]m;(w88Wzssb0Pe=T8h4ZN@u[xUmU)pV#2㴊`%)V6+;}eG n8\Q51Q7Wi=k1DG-[К xD>Ɂd7ޢ~gՍYPēи~f\ qF]Ab sgb26s-hg -J4QF&ںF>RڟXٹEjdcnvTnj%v;rhw ;:F)]Gd((xSHVÕe6HVfSvZ*Fj|qUlQ1F?rR*s'l[0<NTl:?;sMz#wj.k+,'3@E ;(ُD(u<~MJTݓ>T)PT֩(iurMĨiF)Se)KЩӱ<;?*yN{5FM8qܙ"o)S]YmQGj7 +&(1Na"` -YIVz)#~e$\:o:ңݕvOJ#0ɫo㥯u7}tVWqpN -i( -l=ף2Rf3cl׹U+,yd htX'P -hw8陌y Ίʵʵ -sqOk. -ChӑSqn4Nۧe -;QO>w|\{Wv -օY}UTnew=teبB")Z -ԭEZդ5hV*BSt];Np;ԇ%)X2}P[8pպ,(F䣹'O5)8SvO'fFU+y+tV}*JJ#)ΊAX+9c M6XInH{/TEwCmV -hSE,Ԭ=4Y1Z V8mU%0y*GL}ѽ4vlA;*Se]&ެ~ J0ԊW"4Su1E+ڤKS~xQ<5ۊہڍN:7Jo -V{: kPiѶ{'dʃ{[KFimfMzcTnLLNP~PwL}M68Ph8B9 Z _i +Cywy!q^Ӂ aÏoTjx9nRHnc#_!Ǫ5穦*E!R9QQZs3Nfhyy+TuFEo)HrRʈm5 R(S3533Xf+++)֋o/~ךrQ˒d)j cA(MϚ3 w"S.>OĬ]ݱXrP%ciESeoN}z9.(4iM\g2ChJ,aiƵط|w~p%B wPw] 1nĕ#P*lh4^>_ŵ^>4{J~*h_õ +=N[*B`?Mvnڙ OJ(iƉupJ_ŷR:\ Z4UٿnVhWniсRt{Q[$A?1+5QO&Y:X>pDgDoQJj S #Bs]-袕HV7ҞV'g -]Q SnN#ڽP|\<4P5p>%FGEU6E\8>0AJCsbt)UieZGTO&uM pNMN`r9<Հk -F\T=Qo]}/n ªTݔܞicNFܕ:5A.ItK?)RcJ|JG}%N?J.J/N RIZ3duH\OIe$@AEf% L4E*{Tڢ夀w@Fk:={9i[*x5ko T+O;m4KZeBΥ@xpox .8~ h&i潦j:kN4fTg?^Ы'XYK#cz8~uVcՙއO;'͚kʌM,CJVh -AM? -w hq@QhO*/z'Ҝ@Ě)z'A8({G -\RVxr~.iMeAB<3xesy[^jYuSMRm(aV|9!oꨞЧ9,Яml&?0(Zc>rrlY+%pB|ɯ&,B̔, - 1YpToBc@쭧 2[-dh=TT/z@Vw7yoDǿ -~f4؂yhޥLzԣ#utܔM1S ׺8 Cn5R]o+jj]6:}2q wN_K4ڥ)'`=k%܅*m%I^[G5FG'K@Bu}݋mtLWپFudAo-B㴣yOk)@y ?\@*6JX>^䬿@=S<5T:]>7X;Պ{)qCvNǚ=(,]^m> Mz9wPޔFB!h5 -+_AuܚJvj(F&(xDno:Nճ8z)~=uO V;HL󪷏LռA+wͥ9&&q Nx}AZ2wXޤ =HT rW'Tic*7Njw( nۂycy{†;T!CVK=QkVH0mATEy 88SF{B*KixQ:+):ԕF {*UBixRv]SMWު}qSr -;irh],Rܜ窒xBʨ=5Q;0?PVw$~oK3JHCuti_'C WgUVh;?hB6%2O̧Ǣu)EEu8)B+HV*'tP7YBXڬ91U -yE.XbTNեYIQPdwunPQ:cS^k~*̓)UԨy`QКdkz9h8)5B)ݐVSzi82:]ϙ+YktVZLxV VzT(եnLӠѡYơYOȬq*f.HAibܡ+;2Vvd ѱYC0(oBj5iځ̠飼QWjӍ&{@P@۽ iSޞ90B'DqyԷ ॼzSCiV%7lW9ZK6SPdfzI5VHd$8;1]T)jTOrs);‰([&y;w(犅dj|RݕЦT7'ZVqoeQ3 `|g4e~R uA2ށ3Ua=ՈVNYR]Q{ǀ*}UChS sRzhyjI TOct) n -b_ qN;rVުfLI{٢M@h/ -Z7 2Mz+Tc}m^.tSlVDPT)\ynqܬOV+VԬ垺=ٰqS mHMnkxUʉA"QrX -K¿b1 {ohe-NZ(98:Za䢐c}8DFJI;)$iEpଲNn*8Px oѰL1ޛ"2BHiqj^5MciJJgcSjSdha* :1VCSYu9آe(C_Gu265hnjʴyt8j֭VHUVOQH:ww e[/]TRԧ 1p;SKkhÇk8ָz{Jot0nJ&dnHm[|l[ m[xy(zT=ʇL+.)ЯbA; bfT]m)[jpV׫[V?MEZ|զlӜZS^) 1x)p{N [n5L-'hrQ3$dVD#Njv'U+G 6ۭliFsՎufx#ftՑ׹QX]U}H_N6-ǘ_c+8+ѰmVxx֊[Q A -'Щ^葆PHhp7q曮7F 0ᤰB8{&ޚakvg(qvT]LQF4eWfi?ZJU/` -Rzf$*W?iRcS(ƻv:@Ocg:wJ56qQ{`GOJ lN>-L-5۝Z[}OE ݂`wuWAp -VDE(dYߩD6%쓣 -q~i!Z{+QZdZޭuW+ErQW8¶:{QR?:Rv)NzךF hx++"ǧ!u*UV'wPQ/(ҪvPm]}*'U}tY?edod¸w 2uTQ -otP$NeEOSU -zcczbT ႲMiPtWr`R/ -mQ^SMX/ -$S=AFSݳS=>y}jnS{iCzTTEKUk"s ;iLRv*^CyM;Op~پ!FOõ'=Q0^9PO:w f~RTsF\O4F>{MFܓEDFiR0zp>u'f -V- ꭁ<9|Vj}]&r((Yx)0):B)>*TF&Dy!WpGKO4Ǧ9CBEwvDz=Uմ>t<@*nT׉?)e, -s*W?MRVRJ{H3*gQE<6izEiFչsM91:[鶧b$U Ќ=v+f(y9'JLO|nu.4j{r.Y)\p$;UTn4Ӽ da}UesҊAN"A .Hڣs Rw%j8(Û`WMӽm:B'S.' SުxéM{YRis=9P gs`=^]-#/E_w8֏ [ժC :_y)VzUY^gm;ty -;(u -8 G"x)iN~!ܢ;).zUZJ~@OnnV{-w5@Un'+cVV:HS -haV=cܨҊOZ;+GdtETݔ%1 - 7FA=<{SޯH@-GCN_ <, -dnJdКF<ʉC -qR(@ -+[+k[xlQ#ҭ.g V+SFoSL<+{Q/7;i41Smপ4Ll@j@nIGʱ?E+TW\w 'N1Ӫ_jrN:6[AR:U|4D'V Hx(ZSz}I(|xF6]ܫyr>)}WBimAsOxp- ;)vhi~) +9VcADA)jܫINSܞ)DC3 Y{M([/kUhТT ;j:?Rut}ژ[2f`HL՗VC b)3N_]4u -z;T{L- qѹ6jRnITR5+T&1er̠ -Zoe{&+yDz#O'sVEjr"pB(BimMkS5T1AHrݥrFݛo+4Qʌ9;|4uwT-A TLrTCFixicT^z:oG@Q?}1SGrʴuO-,D(Zʞdt>x (n -˧Y*SY8c Jn𢎉F uC&|;sJm}PԢM,ukM-Ac 5ؿԭ=ʵw)Kt*PtFKyF==UjEZQRV!R_mq!HiSԫWr]ʵw*xyڜ_xh V_@צ>o8ܣQ Q(wiIFs*3Qk`ڢ5T,P144p.LgdeNVbqt 1kLފpjin# 椌dge34lS](ђ}Fu -;U6M:S8̍J;h|*wen 1dy<{IxSHoVwV+\t4Wh_UIB8y,2 -S % -WIqB22OJܧMSkAXXG <.Q7-]Vz͠i犲v*YIVqw-,!Yf?*7fih(q; -6mS fP)SG533O.ao*O)ׇ\ -xڧP))MFb 4mO>\E5 64U>Z}j~>Ryvͺ8TOQ=G"DׂtpEDqpD+hާUZ5l:ACIDi1ѽLDqS~!Oz.+T}ʄb~Mncu;3Squ榐嶚MLÉD -!M5YVzl6&FӶ[Puy&k@OvJST݊R)eh< 𴻐P -/C/0No\t4B[QRvK>,<<5{ܤ)&vNԱPhvQȣ>qt:NqE Ee~ -y fP'ѿ*AH;)E2F;Nᾪ@l!ON5)57)ZU3hy+Zsvia@^M 1F!& -M,E?eZVƜTG29@h)DN -74pO(za3 QiXJTݔݓjx-A*sM9珀hMdܓBhCK!1)#o*ºdhTfI-d,@̔ @̔ @T*.6Ͳډ8oE+ S#9($<8X=T,6yƃJZS7NBx0?$x]JPRQLxkapFJ,<.Wwnq^.>AqFZ^ZXЦ@ߡ-)^h7CEӖzމ)41wӕScTzrDŽ :A^SSSuU -q*xVS)G"43 ¥ky)m)"U4S4 V.-Z/8QBbh>BκU5‰Ft==W@Lw*A'ThOTBt -@.P4 i" -` `[M*vjv4nhj գ'f(\1x֚P3-,7j1L"58ךB݂;n"GSLN#@7j֌+) uEnGUM= tŇ?z 5y7 4~CR8+VOz{Squ SLݔZn\O]-\^ЧfQ_9*W+sS3533FZ(>p;+2+3R5+3R74tjV)=0LiTƎ`Y{'Vڜk :8B{:VVn;ż -N21։J4hw y4lMcc1H4tG1J{ QQL4H1cBKIoi;ѻ؜GEpWo5;1p•X&鹒cP˒c+(:=+<+4+,Uo$s ?V?ԬC]ͮw*@0ҜiJ4-mpZ, -}֦hvUshNmxMOISLқm9,]ک#oŠvO:kXpݩ{(]#k)J o|śW GȩS{7bM'QVߪpc URWM#jQ}㆜]cqsUX9 Vx=ɔpFF'y#J[SHե ƪQ/7p'%)Jr)HoIwN( pORJ;&4pѼQ.P/spp#Pjcw}(tQ -';<1ǚhn 9 u*ffnjVfzK(& AeuTDTBE_]AxP:%1Y%m;l)V3XY+n/*f 7 8z!AS9QY{f>ϊ"κD TGS)nԬ\7<Udt IRx<ꫮ@wx)D -+3Onh7iDz謕o[5SK\բlբlԲLjj*3yÂ|#ñDܔy]LiDƏD{i0-G$۽SfjFO 2⪞imFҟ6j2wd4=<;FᚻSS40f(LQ1mM \aq^B&D/T% !*6i:EJ2Oatcb' 8GU|h*dWДo6\PŚ uu 9茺[Zqw rP$U/rG=6eZʴ 4T&)J.7'HRnR©Gג{ԎRJ#MujMot(H١Wet7O)ݔ9SHa#9Zj -VƨD<1Q3$\N4S34Tͪ'Ti[{5LlrQ7%2Q7$S"w[SÿH(%1=Sk^:]D)\ - }NS53z}7QAXA}W_|.\UES#F C\x.SK6+.RamH/WyRGD~*jF)ٳsZKULqmuW*߽6.hpwP}](NeV*U;tÂkǢ5AhW5R4i>iqc c(u5[4 -4F<</o2 -FejoU(;uPDzB[x>z nDuŗ$zM? T2y:6' -zu `uB̕ӪZB֪f UdmѩuTПJ"pVb{K=+D4oLjD;+)VG+1*;qU~!邛5 GCS'5S5J;]?Ȯ&z <VW`x,R -!FƷ_qռQ=FtNBM(%ΟY fu$@=4zu0nID{qu)&fJӆ -dh=4fJdfJCJɌo4$YnJ&Ykw`Nr&ڂ)h;B4D]'[m4PQ^'+)DWXF0ߪ Wzx'w}Gp x{7=m N@*QwPW]`&iZdb￰` -{p~mrKWU@A{W}Bݮx>ImJ聯PoODkEZ*ӞgC@AJ`₎    &&h)nb{#ՌgT(cF(}]1 - -R+@Ncqb -)b>()v#Ko=ݔ6=qMi *aêaaNm&Kةf=By'uww([Aw7Zt`uNy9cwat`rSHhhu18D5cƘ޺JnJ?>9jo"ݨeFPPA(NAA -?y7QT eSp 5(6Bp=74Zfjբ<բcQDR5S,{>*VG姄XMcy^RtꙊDUL/e!#5PnIRJԯpR;4~jWTLL3S?53S?53S;5+R5+LS?53L1R3S?53JԥJ+R5+R5+R;5#Ovi?*W~jg~jw)e7`JHGdy(U;zjdR*GfJqR53RN5(Voԡpݒzٚ!QZm'[3 -f9if=TʴԂ*f#PSpLV4fjf;'8 ?B3Q1&$Rv -R*gvjW~jWvjGfvjGfvjGfvjGf~jW~jW~jWrJT^I' -JH3$dI1(ءjfFj9ܘǦA=_9HrR*^Kة{3TS3533S3533SǚJԍ>_ACLLϩLMة{k&=DsP~Q1+!1AQa 0q@P`?!Hs:-2Q򑞫}FvLa-To;k-f~20~4='Ѡ߬}sp]dH6ӊ hM95SvnFueuG Iqy'"-a<.a8 -ԂS|ӈ19F\9Uc 1Kpb8\hhpa28 9i_\k`Jd|<pC.@Ax, Bn\ <'G'Mf,\ ^SLtG[-܀Sτ'{' ΓXV!b /|CB{y5%G`fnFc>x_)\4*)Af !#C9W^8*|өa8N\|| 133P' |5#2-0B℉ӂCG8 Nj\c:um7؄Mb% h9x6Gd{O&M?\\489'P/ pe⁤| 8? Lj x^9Fbpp c8vb*5/_Q ;# q|?.KXx#!>R>_p<ӂ:@%ߖx'<8G"q%gffnGEXRTRU"e `q([K,溭ְ1_ W~( O8H.e!q.BŸ!˴g^ppۖ0XmT#rǗ!qgq\TS[58sӆ eA,a8\%~3pQEpsoh:x׋80]%ՂcHN_ xL`BR)|㋑Nʳ b#i#, D5#.!๳( B2VE:ʃ%nfpP(/_@E.oʛ?L.J>"6=h}|"<2}F &nD`uӽ81$ -Th>-WBqK<ƕ'% bȃ7S })D6qeJ +]g=ׁ4?p?'g~r$0U(H>sHEQ88=WHP"<>z/T#1djrL|%fT^l̚~cȳ KX8h8Փ# S!&T4|a-`x!\'%r9tE3R[ʑF}>t W,tF#f$sL}Or3JJՔ#!s$7#ߓ|&H>O^F`e0-x҄l41Toȭm&8PIEWcP*eBP 3>$L\*WXUhk ,ÓU(դoeŐ!ʥ~::IpӇh闖c2t48X2u`A<1A5 B#8I4rhHe8 -Q2:@%N"uVk`MσJqD!IR $Behfl&|fQP3D[Ltms -3aB`օ xy -Q"EA8k\//^&p -t +`kA ?'`҂.RuV f#!3+&|' `X9@re&"Jb$CH2y1p:+P1r B-Yi'|.!|~$pUAQ{*zm'`2ʣK\4s¸P)HVJ +B?L%zdy߼ C~xOpPCx{3F EЁ7 Ei^ *յ -tLAl -a [d (%N< *:B-`IVR2$Fw9XڈtHw/hQ=r= F" h!oXk N$ -%<J9q}&|L'AoZA%+b Z5lԫHua MPEAQȴ$zЄ6PJgM ߄A&e~`A ߳G]}H.d'@ -SD -d ө?ʠ 60,=qI.~N2_:|y $'D8'(EH@Yo4B )~d錘eHm_/ 9,O| -@ane:Rkxr9?_)̗+8G>8O!$f:U"6͋MFa6C -DEv~$ĒD8g&22G,:X~0prPKC~e\>]p"|hڙ&r|18"PqD)ⷍ,k=`@CTe  U53CTaD#.%q((oIerC~FQM(GJ 995q -E[ƄT+|eY>5|kk4Uh!¼4x>}\t.r;-|C*cj}3*uQb?FJ3B/0)B* q9*?Eԃ](SJ~Dӿn- A cFd7oܕX6~Wja|Ƹ$;Y dCL ͂"#BHsD2vpiD؞#bhEb#=62T0Kd&G.9 %Lrq3udK&@k&z #  PN1v<&`0VzIP/#Nurs@],2(KLxd,t+Kƛ7eKeK* 6P71QWd&tS M$B8`Xٌ3y!),@su)_+BUz^w!a_r}>zY-A`tϪH+>E-Bx-ra9tdx~J`?L(qkԉ${BޜKȷoA'ɓЊϒ  -|/oKƱꕖSQUPKY?3>;M|@(qmc&;*, &Sw Jl0iX3#uUFWMAl g2gZ{Cw@ѣU38ʤ*)@ -ʧ"wV&KB[!8O -TZH?l9b ɷTnxVZhFpCỳ#C()ø<^b#{f$g[" R`Td -/pA׀%]wU%)Lկ^2 JB'.r M D)(). -}zHxQGQ@􊶀4P9!BGtAFCXHUCժ6x⠚#m2'5.hcFF -fHAwM- -lTn3n'| \Rk? |5E TaSK f@>FVf\Ou չ)7K d0b5Q,]Il‘X=]DGXo}GH"b(v9٬Kq(4R'J/=fe3*EeJ%8S A0Jxg',?SgN9A( B)HU flH_!BvZ"s5Br43f!O|35zϑ~Tuq>0$q_!C|Kzq<lp,8$?~;BAD&e@K C"0 wc4`A0":'2L`BUW4!euK_ I %fFE:: -b^w=-A3@a)i7]Xw۬x:t*! +.k:G -jzumvsbn |e`͎M)l|A$C;F)[@QyRa/ zj(񫶊 72qǂ= -/ӟU2CBGu-IO=a^KP4BÐJE`ݔK0hJ"U?r'gpd+ -@ 8Nx*W<Ū`R;\T:aU*~!UOND+s>_p\EzA!Tج6TJx"1%At4ج h*Axbᠤ3Id -ACs[^.`)M& Hk-oX^qa^dDrELFgˎnc343^׍}bР. -^eD0Ti YƤ 6. -"ˑ]y6p.0 %{*@mGqpb*z9RX*GT0OΰM -s\OCĻ24,mi.GH{&{hu<寊0$'Á|}L]H^.,? ~ <<Ɖ] VJ3C[>>/8wd#i>?"&^CLoe0UlrW3 `.GS!`Lpp@ˆ(L,nX\P\Թh<.6AiZk `c8hN)D >׳BZ9paBv9v*. ,DJ"-7lV%4ц(@7xg&xWP&#@&r3,ݏ/j=*hy(T"&iOƈ¬IC8J/gLTe$?4\ALH6!% -Q 1ٟ_"Jџ,JQdQ>MG֛Q"Oփgi12 ^ja1%RTXVSK ,1[`9F& -qS ֪<τޠ[ ٵ0Ax>oyoYME C -r |@4RcYmyshEw@r )̥1'`;6C<$Cj^]@Kr;$IU*J Xzp.g/_PZ<[;2 yf/cRUQa>{qzxN9I.CaC|cnD*2830RE {f G6Љ ")[ N܀~HwJi)j/đ Fŕ=f [< Ѓ[BD"ᡅGhzEplpD*tt*h])|C(NAq)PpC Rakϣ0jX QAk*y!:% nP??>AS|{q-[c*2y%># k$AUSW C7E6H~Qb97 -Dp<9c>B3 H]c>qN}@ႵJ|c tYNi_xR߬ E0 &0R:cTcv8҈Ka3f>&`#<;P"tΨy"@0[ {!KkyP,cC\vw)ND$H+O7n t011} Rj$4&6fGIJG)ञCB7 $s0+.υ+P_UacB@DKV#sQ4@<s}P"a@@&ZBnA0cZoIabx.ب ϢXZ2b-Bcxv\A j45ZO 8|vy)opAʀ -#T0y39  V& Cⱨ"n%z ϒ,\gLRDEo ʸ̘ ç^*ZPKJеCr7k[ߍ,/ mī9pR_0N -ro-Q:Mi Ty*cR'OQ&Y/5)5iZ+3*zF/[Ҏz>/|j&W 2KQ}Pn#1>{Of0Ud&w %ˑkxAB A - <4 npY{vr9a\)KMi%1# PD1LsXqEKl5T !@Z@hO^R>0%w”8pCB :h@U噌 Fr*(+?!{ШyiGkCӇwaKY<ACm -)BP*MYV$Cy2 6D  '\7i,Axz\Bdz%E{ZA`X'ą=:@%B%,!N28EtN@J28 3s=! pXFQ" ({'BBX017ꈱLRZS! Ec*qB= !o: G1)0k1EpcXL6ѱPH}&23kx/B!,>QCX -כ[hW=f T;[3(e.ܓ2??U\K>Idn2`@cpf 30K9РDfXU*_3j :v,*o --eY`oʦpܡ@ @EK_̂` Xt6A c {YAZu`/ -=iټ(FdĘZE7'ao0χڛ w0c$1yRЃ(mB% "f7l0=[d@Z;CP+hЉFǬ,tF@ z!B vQWN7q &At4@5Vp¸ scaqa"%5%A:CZ0zCSNĢkBb9WO9= |t\#\?FNˠ31Wp#xM:@DavFx,=pP+T޵P'+[dΪg3-Ql<(@K0cdY2{|w rZ d!`9]Si!QG,W!6!lA:GΦG r:B`pZsox3x3!26f rUث'H( =YG;P!d0a1Hod:yY|A24x/h[4y1QKetTp*K&|(tZ/!V!L,SV{zϔ=S~ܑ1`c,/p)^"u76R!؀1 ʖo9?!b=d%Dq\~\k(+rIHWxn@ye  - 1^:q5YHJ9p{$@Ph?reZ -2-2@ȋR Lm0v"y~B%bZ$`UL!x8gXr^1Adg2IBn/1* ׃3QB]x9r|Ox#,2Mپ&o&6y6"2~) LBR €9\Ch[7׹vvhI_ 4iqU Bg>K# G |Ip4~<WAZC{K'G#J }O"`!pЙTZȁSj͙q =b>oI" -Ht<`ȍI+2[@0¢Η8`RMTwj<)j&`Vn` =D=JHIul!TCT؟[@!00B*<7c -2(y IxǏTQr;_)[|A mJZ<.CGZr( 3%\)ɇ)_b|B_q&AE"a01NBSNfSBGUqiw( :k)$e PRAM^R֣q4! \ȩ`h :dd$u3CLB* .@gX@]!qʆ):CJ]ԳHn1t78 ^ 2,;iX/,In*吙LŪ?'~D&yeeҋ5B=.$[}O}ϒ~=D%~4Jhm%=󿱃Ƿ[ p D9DU!zNxplylp fv'A)|ZWCW1$bFW]ԅ7Kq I9׀~xN4)% p&{KErˤFQ CMA]Uh ?hAmm1.C̹CiG:<@M z#cQ68a*)g/?cЍ;(uoBΈ-)H-PAǰ2EIԿ~a ohAIqpx+xB$p>yߐy o< > IXD2"̬8{&À>ǒD$A&UWD܊44:QW9%<+&;Pd']Ÿ<ߠ0j?JJ^ƨ?WVB4݄Y@( a.lD!R^c f)N5O8p1GE+9.a?xL{q.PgxF/.e6[0! '?W~ QA:{C\c }.I~'z1Z `v0/.!Bg0V%}nܷ(5lԯH7Ww~(dIfH*N=Mu󢵃mvG*zDhU [3冋hhYb*NWs$T(  <sB.e;Y)ŹGsGC*ci@">h;`4]aNx6G($h`rʹD95{>>>(yo /jX=s -2l <KgZ=gg@Go+9;C)=Bx|BN b!p#KRhCw':V4C0CWhO$YTՀKR a9lqHޠBFMr@([86o,A8 xTG8 -.pUg/A~:2UP#qyS -}$$]C6aC$'Åf).Bqx\(N)i@pTJ? I*"&f(V:5Kt\ 3znrސt̓p\ FI қ@Ym7 ՉrTBY<72v pF,J>08p @# - ReӒIKQ U&3=!mi O %RZ1X\'YDW&S8^7G0QuR*)[RVk+XЃfC )6L3blb߈uf;3:vu1FC[sx :{0 >đɼyP+gw dhJ V3SqcL]N?1"G_7N232\n#2ܕQ!hЕDt_L+\T[s.2GNyO'hs=懍 o>3O}wg>!$Na' }C("(|T1faB6Ew@Rȧ4X.et  7XD# z^0^z+%K?yNy yQYaٌ/hڏ`T9:_Ŋ . -]M.A! Kb8, uBTC \mNP8Ёn '%zi~H%.;D4x s Bz>Kՙ/z?^B0$= c,xk6M;2q0A#h$l|c0[B g֡OQ=Qt +0`m;%򀃭! @E6A6D,&[6h@ 8+{S* rb1OhY6_=& y(˟>}3Q>4J+8XA=biR0= -{s`0FfMDJ(xn+M, w Z}ib= E-~Z1b95B< `ưKnqњXnKq!-IFFvƥ+R 5g"va :i/ ,6&M\aXrAjkqrDΪVB(ڰƠ~ -*FH -T 39BHlt,9F0hW -̩n~P2cpBZTH>,>lR[}qiw9|+Z7^\iTv -=ώ="A O'ϡ@T+mz+(90 Mh _iD?E%PE57؉q7@tm}IQA=c\xzǣ*7=>M3T0:@bY:')8bcÀE)d`N~IƊj,PGbJP 9$K0!;.tAAx -g5% g^~QtT3:+ #; epgB\=,|ub!˼ȼ߅ D,i.2 '%ۂԇ#| ݫEH8 ()}oY7!AՃ 0 @E.9~zd=#\Ou31_ F.<,'+4n˓ZzOSX - g<9BdaaK! Oi?ɛ >XنTh/oE>Z=↘?j_ *[}% -ӂbhE5E -;X S ث AE ?)@(vkfbPv, 憰`ִCw HQ vGr'9fg9NY!{O=>{6TGC3LW'SMFlcxfX |@|ʗ]8  F -u!lXo'|{ d+@c`R]g؈? r!cPp/7˄-ć` \ -o%_Eԧ rb^'1 2s8i%؞HO YX1ƞ/rҞQyϷUc?v{r_ԔQa.\k_Ds?PzL/6FA&'_笣:y]:`r?H m.+kΛB_"8|xA!,ܦ5kƼ %3" @ 0e6@h2I1)I( A`a+=C(eɊ<:%aq00 j xͲx%e&,+- -qHK8WP~5ӛr^RD?(blhey 5Pp=icledyQF: !tIy;XO,F Qtg$̒lab=D8^FxJ=%6@)PAL]H:$sdobphܛo`?=CĖ 3{#FRs,n5)C/$+jWC'xN':o.ATiB pиx'C#-bC-M2>O)>ȟ<zwBBeopNHy32l*yXBo13 #7=3?cmBLYp:Q)MȠa/e C(8v 딴t䇃 Flp9EdT&IͨHJ9'4"8VYo_!Z>HtXD2D 8r{J -HyM5bH4\CfQCp(Uy%CdY@@35"]TYNQ9C a6"*m~4 Hw$y od.D@2;B0M~P!PC ԩUPH;_nio#s.eQT膡ӗX]96Cx Y5RK8G՝1JC\ - ! "_17#ahHN<O j)`!@-8Lzf8o |d*8WiHIAɔ X,a'PTf:C:^Y?ϭUԇq-Ci (nC/aM黆C3b8"}7vo'hGhgG#1n\JDx3ϰuu>]хx29VaK?H4?<0 . nצ@q@Cvs(9'a"h(*T0U[I#5R%8oQL5E D' -r1;ϽG|(*2Jj(_Ł݁(Rw2C6ܓ#R;)zs& tc+es)#[~77/Cq<\D* ;Gb JyJ:|s'@`t> $!' D)a ! -[l6Sk710&(>w|τf@%)/7BуۀDw-ySae# C'D1T*gRWa>Atf ?L"HZ5!Ӓ3$lH)69rH`Đ$CWxp -r)㇚aA\̎h aF,p -bQE `2D%+ZNl-33(aiB"}G(I -ЀH.4ƾBB#G8[P`g; `n8]hIJ0o<Meq#b!0dY>>| -+FX. gYμ+ cD?:m -TC[Kn G1ȗq)\1O -|iǯ"y?bΟDnsA8# zi^$;m:K/A0 _q_NKxDh^7n[x> v ng*,:$I4'Ty3.BYsuB$>7WJ" y80` ؘG` `0VX8+g, -z?IE7n0*[Okk 49Pta|)2f*!!"*Foxi6o Up1"\c ꁉb؄.H!-=PdKnz )dd}YhtPB$9+t<nnfbx(fWH -aLr̽TE RI~c(0Ӕ"p4,a{ (K&epn2aHByF8"{D4 Ϡ/U J@jF2(O!_}'|oy^Do1IB߸{8(Ġ闄qBl#)WE! h>A0A%ҍ"EaH rO:0DڹъQ]LdY n8*u ( k Ĭ/Xs-:AFzpWCz)jv046WaJg˥@Afػ,a J.W xK^6q -G2/~K<  @:ϟES`Q #'l.t+U @!; דRq|`!O X>S#eR+uxHL}'DH1"'D(PAv) )(^:p|9x !'BQ7x>$]=FQA00QIr2EI"_ Re0JG,6Rֿ=Xx0Z(wb_U3ƐwDQW 3nPrLu!jC>\@u?0W&Cf҇GG_ zM`ޣF<$"/I齠 `$fWR58{P@/+Umbez3EjjbBOfii)ߤAn޻-% NJ| 揑#}x;b[r{#`Cbkx h'J.BX'Pb<@ck@r ּN1 17l# -:zW P&P%BXey}|rw9ȪQ 6|4=AB֎&P/G}[}JAO `L/⋈%dx~B>..G%Y!>mx`]74.$F>o|̣JԎ3gϟ?>h5j?|a>H,B t@-EqK9fwcCVѨW!1!d0;G{J_?9XSHB,o8W |wT?% 6#,OĵdY _1Ze/יP^.(9GDj((1ϼ{}rF+8@]rrVՊg!6W89K؉T u/,cnWxQPC 8zqܾ$YگtO1) YP,߂u-C*zCgv3@ƢGE#BN53ӊhɃ V!R.ۂ.GG>>{M߃}3}3}3}͉oDHz2leE%@Ap9 @GT2܎b^(wA\Y^Se5H|yZ+TвԏxѴ&1.G`5r4R{#BYc;O H:}&Kiy ;eV7RMa 4$QQ7\\BG1J -p8["~SƷ(8,]wnfou17H" X? p5 88^q+LW䬇-ϊns{O{{{xggg`%~ӍU.t$ #x:ra{"UW\ʹ0 #w[:|_? 6!Ff+@\T.  -Q2(/E#s8ahD"Gf%.*tRf. -Ɍdr2},3ÜGX ̵jp&RlƫO4+ -G--QZ/בpxˈ3 ZbY}};`y >>>0{3RgrrO=5o0Uq?0 􃽝M:I -0q7O=wx-ڟA9/;'_A.Pq?r'`":>1O/耮FO8p_+|SWp %`"|ɾ13S%Ô~f@E9gccф>GWEx3FT/$,&ځ7AN: Eeߎ`[d ve ;0}8A=pKXg>}#}H0(QsHCSĩoNݙ%,H"(G Ed\ta4I!Bd>>3I=Lɂ9] 6}LxAf+b#*ž yaw*` +8c.8s7oF%  f`EmFx B `Li0|l -CwŦ ~x00$>,(g/m] b@bʯiMF17GF 'qTX/ 0iC -aaG3чs L W_A#UPL&g/oR:ՠ$e}CL*M0RRt\t%`G AK_< 5Ct@#F:` -~;%8wVZ 3/!_ JT% `/}p>ۛds!^0OODxx%9>V%=!a>(SN=FsiS7_W!2*|q>?VyAy `vqux -Q,@&C6##Fc&P &p|2S@/2sӤS~b<1dz5A0o6J\\k)ӌr^#-@ x)8T0S|O ~FWXxF}O,D ѻܧݧ&qZ&\C3-ɱ%|ͥ# HDU]'䍂x-+#*IF`'>C0:e0C?dXEY_ܪ_ e0^&2~0; C1R4g 3ߒwAc&7EmCx@76ԿB] !PfV`.L;C@x/aiJN$)# m9<;863>)P#̠m5.qW8P2MVmHGHCy}aS>ARM( T=`tH<&Nr#1 }Q -ϖ/gpK020;mj(Ya"fX tvot~LQ8+ 'Ujve;A]CA@gyqT{O=hm, DŽ `rpz4@հQOD=8lWp$O |> A`XR:%#HDоq&xMj111< -i\`J&aRwC)fs<:j^ zS&tSo+J^2مm$378y`1vDvxO~4H;u )Q{JĝS ~X:qr@{N2N5 9"S<b-Y x hh.F`,gJ12v,2D+]eռ00PaX*+&s_ +X*bKQ|7`xKpN[{"@)ib7(`?-kc 1HHWA`R(t 5 8Ϛ}kCٙvM"9~P}ӟx1]I@/.@Q>XI` #P`˘ DBxX/8 ]S=O|q}_T/\6ŸQW2 F]L{3[U{lƋB20Hs0BP& eC͌; -V&PVp>DC C*:*yT`DS*|TH@w dBJ~C ΉR?1bl:}C#" o(V9~hLBHh$GȋV4Y8 8-kX b8?_r r ro i2d"BP.   3xJ@gswS㛿O+Hu+*+tX?XH@ {P9h2o @ cSy(xFB쬻ʁ h븵1={4e쇯Xe.,4x@@ -h` .L \W;jPRS=@, W: A@aAS"a5a@aNo~s._'HN֕C*q>HnwFdC!qHt4 \0􁖞:`^|)ʲ::T]laB3h`"'l! ^09jp(K -)}07a׍r%e,'F'0сe P{r wUiAc1'V_#>b‘~z\` .Mp=2U؀yHU&0Od!>>>>>޽u\uHw;:;KDuJ} z|f!`HHL ԣ>~ɣذEBPJT^<¾.7&>7A2n=L|IU&:{xuQ/J%ax` VE*E= Q[S5қa D~S!َQ%Z,)^a%$R,>PιJ~WAL*>34,p0O>ex 1(j0 ڒH@c]Y g!\ -#Q7 aI]0;;Gj)^P7m$OXhB+1>! $Tz5W&%^p|U0`* 4r; .S+ 2،\<5 ,*l1p. C`2J O' F))ϋ2g|o3oOO?>?|_d(ߌAB"j€(@Ktk嵞-`Hb[¥(=~"!Kb!9+aP ȁqh? (*139T֌Yh ϗ3Y*wz!ҨkDI̘!NAgxγrn$ܼE3vo s#*Ǟ.<]! -Gg >4V4RedrpY A#H$pw[@ՂcJT~1BƘ\:,*Do})xYҼg@XP^x8'h( 6XGMa9q 6V܇h512Gf2eA1#tyCXm(E҅Ke`y`9;@{@uS p Tq8%1G $HL|\<(D'Oo>}ȀkMܷKy-ԷKu L8@--n"e .YM/j}+(zO mQyCl`YtB}2dfDe0sBF&0C/MP!t(4C4 %#tcfXB  pÌ? q6=U 6,,ÏJGMt"Q6x(cSDRF -*Ue9Tea#0ԙTxxsw( - -hqsF5tWc3Iw)ꃛ֮ \kz(xGAS!-`űԳ>_ c R̊:PyqExI3;$oPϲ5["2'eeοUV=awcs8`s1"Ɂ7_eB)z<'@Q i !F Pڴ& zH%4QOL7PTs7~K1$&O3>LeZ Cu|p_0j[Xb̌16Xo -J߶$zBʡdO D|դ -uo[hAױL+Yzt\H50˚g0FPq~A (θe~tr`7f4O&60}(˾Pai (W)Qf R9Pߗ0lCiH7rh)B(f*# 6v:e,+1Hٓ^`Sh\ W9]`5TBQFѲYB˂NPh~ Pj|ET 5|j|A5JG%uRA" D'V[r^EB@w| F[- 2W\* d ~]5!F 2G\+]= F\M>0Ό| -jHR$YdL -9%1`7 qzH\ٕP=cJ'yQ-/~zs(ax5fIuy&O%α(cC!:{,xkِkJ PWa1 2 '{JB\GAaʮNg;!V"Cno]a88d5J%骅͛GDeG CPeO>>> -v7iAvPAtB"! tgO?|Zyky>E7\lߐ3O ni*9@H|$6` 3ToI񀋮z+3 0p n^9W2zƴT|Rl~[Kv4a!݁Jy彧#ݘ/Jʹv9^-!؂^x k ->p9A*Jd[F'n0\1B {` CSS0b(IT - e:C8H) z ^` (mOOOOʪTԣ}K tF6GQxh?^920Վ%CUZUꝔ`k`/ZAC) -&:46] {;GB?ajK8`PQ|>#yi"*[@ ں䔬 $sG_]aW{Me>(gAMЋ{*L`2 %MxS?f@$اx ?@rF=!?>%J_ֲ(w.Pߊ }xxv0Z#MGenX,@M3J}Ua-D@1C 88xHvӐfjBcG>U'jŠg }FQzeS ) 4T?hof -la -_~K ׋잙8D!fΪKHB}&}F}, jB9`D 3O''@.&U֑ 8u@pVQ? I`nYc >TН D\{G"@&\J>#] Vݏ6U\fZKNA-u&ҽнGL4i\NQ-f krG0ECS ?ꡂҴ/H4E2 c^PF DَBv蒲gA8?Di(73"hC'F!C5m(؆+PĆ+ -*Lؗ- N4֟3GZn^Eo3{ʀKP` 94䊐kYOv*~!h9[?ԄܛA%FA[mE8HphaXT{ȎRۼl^X]ܒA*@\#Kf10(A}>`sՓBD_C7)eހ܈-3a?3ۀ!+ Xr -yq+Ԁw@0n:rCK]0L2 hdu'e72)^R}m5+q:X^Sh6̲,GR׀(d/ ,;K -{| ;p*#d̦; Pj9Hy, N4CVx,59 *ŨDX50SD" H1 Vj{3 q!SM m7;BB4`dmRlFR!(x {bk y4TV> {%QPnϼT$>x-UhPD jܓ `<ՕrQU>#0Djtx}}Wh [}6퀽%Hϟ8a2 Ta_LxD-[8i(÷+[ɛFWW׬{RYn$0J¦'a j e A ?Oy}IC@!y+/`? Rću+c -/Ź7 sbe&@.%Ұë=<U  -$gƵP`e\0p<>B{D&h ?r;"'it x%a)A2 --w|f6xaX| 0{~>xrEC>0O=oT*e gVV -' \x*>bi"ibAGǘxh8K($ǥang&%q>`}vU>bȠS] ,:Q /^\C*P@R3/ܑC/ܜwB & ДHRLl-R`_V -%!85EڄA.@"ZuH -̰dGU8w(^E(PR0M8z5%5\-Ȥπ}sQM|W+M#ΰpFf#iQ^1IN\<^hTMF$G 7+V0iHF!#p nFs#VinGTBdI+@^X&}2L)Vr -.ޣtQBXyc(rEҦUG#٬?&\ (z^[Fq -JjǁN9t@E\Xj(b dvDtY,\( @H@݈%<ܣ'r8D|̸#XK "yhI,I cn^]nPM8H#o?`}ݟi}p}irEzJEbgZX- {30{+9 _7BEWA,AhÉ:rh-T(;ƕς :1uZ"~­obEC``AJCP\t~OMHruxE;aO\ O% - 5|)gCGrKU9ܩ>_!kBe)->)OCKp3M@9:@ 68V5ϰOE@ĕ<-W,/Rg!B-1$h0D5TL%[t/H9f~F9}d%QkSfmHA(@KA:K"|# zaEQ.06Gt71ZM%jRaZGJUGA9y+ 1g׍_/lf nmiVRDmO: P\?nwCӗ0;L!qv4d qgxT+Ԅ*{AFG%E54޵0ϡ80s#Q5D d# H<"xd edˆzŀF5D@ ji6St!3q:JAf:@jr -^VZuAX )K,JRӮ'Ct[Ӥ||i)2rn@D8~!b(CF C %p@gt -1Av.*t8rcY]9P;-Dueӛ7>"|6>>9/h0! pouT<6Q-M%ա$.Xgg/bx[ΰb9)c)ۛ Ar]cO{M\}'CiK2?bzO߇2^`C - )B"r?;V;0&M> 200LC#|!> (  - -B7gsH\ t4p4m!!s㖀{JC0j{ ?՞-,I:& BRt]R0Qb_! %c&PR{PpMB~J:Q%518/Y&谛-z@4a{/agF \%eHoT#ho)'J`L7 #,7$" v&p YfpϙPpʷW*W0‡G"A5C=.2$E6 3B)Da3@Tejʫ6Ѫ^5q|NNFs#lCL -;[xL"ΰl#ߘ *g : ^SUF C8z$aY'G@a5$ a0\91%mgMwzKff9 oRΓ=O}>wkj SA` lV,PQ@Dw߸Dp j:Ee˥?+ - \-^9a q^W0lx݄xL`q#p Dv#mxM 9>79GdO>o,OХ`׌^nP;1\DD\sDȚfpτӴh2\EV5EF|dUhF5Hx$旋/'>Dȯ3 _1.h8zټEF/*5Ck>>lL_͘_C&4ydDG k!/| :OkƵ7nmͣ b[/|s2#7dƄhu4h^'6*lR|B`(q`&PVZuD` ,>-N;-`IL:,A#NʡR -kN2;C(QvFjV#I -xUu適>( @Q$tK/9FC ΈV]P3oU-ķR8N("@FN>Fܛua3ɲ-N|:Y-+zxO}.w±`}3U5E o,^060p2JF>ְtOU8HV%]&`[ӭ'ӽ>(v@lh%. %A=HA0P35wC,pQE2 -FU Hg]@%D`MJ*ԑ+R!(ڀ_^D@dK;s0qbx~ CpBIaD |c0c8:&x F0邊=( X;`n}Xu1w@̓7 DdpMX 4Нv3w!xt@HH@I%^WOP<#h%YdlO %Vguy.wfXߡг @eSJ LPGH_hIlF#HG,lF6&FH(SYv @IE%ʅ8(sRŢBKW›4V^ҩUBij]!7T l_6w9Lc"`Q6kQfN~px>`v"}G|&M *WH ˪@EK\]8r;a0S,ý~~c+1rB"=^ - -zFd>_+J9F2``B[I/{V8Rlγr63‚!RU}`"27[t~2WaX>H{lHIWI{@4?XpFwIx.p^'"-Pws #u:EA$u;V$,Z0'q+S]N?1K|j0ts{F~S=]-; CI)!.RbzE ZxmB8&iDD_+'󣀆`M b U9ò]f 1$89E2nΕU*ʣebQUVn'vrĽ3kq$P Ue&C4J l0V⢋P@T\M9#LtQ}C}@7*D>[>({OOOOd6q-1CHA|`Xuh3\g XiH7Q\6?iuB -o] *@CΘ(j^/JxbP@;nuk+87%gd; Ys29ƳV}nuPdAt:PKH9 G` AQO7rYNF`+ ʟD)E]W8$B(Q\N#? Xh{7ri4}p$= A&K{H0 ntAz@cAGn"iIvg^] ~l>0(ɋ! TNK F4%>D@^ $9Pw8iOA# }N (=%9JTNR L%_ c a$YuxkKs8`[?4q6CnCjaM iC*h4;Mߐ|huC@sϋއǶ) -f:LPGq]W9%2^6E!NE`x"n4;݇s;x€auOϫϩ@} v<2 A*m^cE)$돇i :3p8=\{@ajK -x>y`;$T p?Boi r$6*/B܂:!n=`[W# Ly(ϬWqt-aL P BX+;uGAyhNTC;E*Ux@`plx* -# XCzqi ݄=x ʪ0Y|OHe 4!07>Ahn(&O_ cf:H|A8k*nj_h;`8(#7(5!:Hw ՂB0pD| X`ʕht1uE@(˟ґ~q/rT.y\2Sn?Mh |@j!6P<8 -p9Mn) ` `y*.EMBYP1=`mQj9?xYY -$b*u*YHNCz_B<P{ p0JC\ Pq"h%:p\MiA4 't;lR0Df`JR˿p< ` e 8# D0#wOH!(P80cU_|a>tb/20mB.VXWS2\Np$" -XW7LODH<.eBmEn{<#MULebW]~8IIJI^~)zǶ0=Ji_HtF!8Us{A_%{,hZ -9>^>-؇x%Oz P*rXDPuNR JmTC!"蕡HRCeD܈# -Ru -/\ $nUfd8~v?B~%8FȨ@pn3TSe1{d l #>DX -Sp^u”*5%`Ñ/8k˖8s噖]Q.,u(VggҠ(t:o3 }}lIa3*O ή71AKai@K)Gb,9FHge2ꄜr[C:>R0NСTrܞF*+1eaFZ@_9GwR_Ġΰu?m)U!N@QO|t^\ Y-]Ph!Oxza%Ǹс ٢ A3 0]rW!G|{!u?W5~N.ګ| *JU6f "On I "gs5Sed *r=x>^,(4&д@P?q! \xHRaO({"ӣ-rҷ\+ %&}['h<''\Mʩ)c0T2Pp%I^Rl܃f H/@R \ucmX.@(iOZDž#d%r%9gl5-fO%:XL_]8pu`6~"l y&Z|LF8%3'%4A o¼ =ȚO7?~8:~7fPYŸh1N͘XgM'G|π`zXYT;'}LĻLK q@Z4ژYZ O缻. PI  -Ae2(g f3yReJ% {ԄyQ#dI(l\: Qʟf}}0+T 5p0>!1~t̓(^U0mI=SEL%o):fH|>y[4A-aH\>y2Uddb3 (# Ef^ p9Tm8;PX*e% #2""!IQ0@V+O^Qֆ"j߳69`C@@ ha%C /-g(& ZЏ5vѳ{+}^.V.d=([GT8,:C!^G1j'!%w ]즪#BebRW *g3扑G yAF~yp.p; -e -&Ͳ__}\a٢C SP?pu< cTG(@{ϔ:8/ čÓb7m -X@PYxO>Y\Or*T(MCW^}EPI Qy-R !.ӊ~ -7_j}^𦫩ِ0a6M3T4tFR01@ -?>yˇ]meGZEȦ#: -߲Wy0[=jҀs  2pKGJ( @rPU*o1ww zE  -;b .5yXs\- E*2q@hDs7haP] bj{# w. *i5V>@SPED^ˤф 08i-N#@/^QӂOPrD:zmQ! i tϕD5?Cu3UT)H, A Nꏜ;/)I`[r `x<_9T9)@u'9n o,xƄrV؂xJ9@?b3"|a>O(On=' ,]5! -J(m+N-(BTpC^Н[Q -I]b{/Խd,Wp:X?Ay@ 7_Am ևWŤzy-lBGɪ+Tf L&uq,n&TI?nPª&E< n0>ID`5X/0k0IW|ɯڌ"Sz~i FՉu?@"d 0TU!>\.0I6@~wY4?6\)E H\pEu_- @2T*!i_ DB pkOߌ%kو8O!}R7M,g&<#(oCl$.c X0&I 2,{C3 yƀDK XB--28FCK(l A80F!r --.YC -67A5P 2W"ePz˒2?ALRB;H%="YV^H*":u(P<|:LaCM h)su3 sDw+u50gZ(UrzJaROE)!_ΓK>4SBW @wL^i|(&2FP"b_,B`>3JuyEJKP \ :A,Hs -n ʆԄjF[Q -<GIBًf j A$myr0r_( \9E`0g*$O=7,1QOȟHKOQ@?'^QY gf%[̷.> _/.e*+"t엍"L3O5 ڤ>`RTmZeVpD r!%*ai7j3c*%r m;̀0H%+B4Sc$TOLެ+Xn],9<%61sq#䒠/ 9k(аcӮt 8-jnBQFC6=&(zCRX"% (DZj`t`{;A"o" + \&j\!TPa$-@Pl`o -~@ (3|R&5B -ނm;2Z N$z_QPgf3(֓0P:\(CTG1YQר\fLI  )`g6 ru7@ -_2⁈ -"0Ԇ(^)QXwI -Y8|ު L DCu0 i HFq`Q=c<"O#-?2Ԉ,8BEym --*gT-hsӨ I4W S= XS,^ -}p*+Z_0\{R0+8&Zt+ 2"^c/D.n#*9Ch]wlyIQh`܂ biɂ3"2+%0P'"Өg7|A{WHy -.JD$7kIF^ɈA`״Qؤ15xΏ YؕV$JS0gpZHXp{%4SdIXXKhVd=ZDu"ڪhI _ Ca>RAj7Y.!y٠'!_ -%.H@fl;êeRaԊ w%P\yiC^  B Qeg = Be*Wb$sXG)XzhQPJ&CBE•t(ڢdJmO8wH Nŕ -4 `ԑQY.F!O/ Lv9˸_Aģ/[rW ?U"dJKe bc L2y7 x6H7 -kϥ]EK>|A>($ 2?P&9~+c*?p[X7Izahfgf[d/z1QG_+J|BxѶ_DYâVrm[υLXxP@j0`d1rCPꚕa#M6`L.2⩨' ~D&}`] \YRHuC(\&Ļe0pWd%t(a m!<r`p=d$% PfP(O/x w7xx{ax\C+qز -!*8Y;xeZ0F=cp37Ny@x -]ʙU\ "l$C_U!3 c.*p+K$;@m%iC 7b CdC~+P膢plҹnөxhp2s-*be{S* ae2\Li#ӂ}_+t|wƴH $6:xBY'"-Vn2PkYnW4c5_p &Ii`K 鏚_Y1SlAߢ^P% D(Q5],p  h¬hg)*]E8EXSj oC،wxԴO,lpI MlTwyS֬U@CQ 0oLUNW5@}/Shpan.Ƙ%1p q\Lsѵ@wy@ IX6|LmaFȌƪ~=g۰f>> QwT `y5k:gCԏ+J|"^\>^ރ&@ԑ2EF4* o-0tDNE<289H4ӁJpq;Cp)N CB39xP&".^T.<)P&r8FR ` ؠpFl't8庪! s`Ix=#*Pj?I/>TUOKOxlWÁwzK8Z>0K0}o? mB Ue[>nZC![PuBMfiުj9`D9ol&p@{45ăQXFBW` `ҿ|>H>Ѕ K%CMdj !O셩0 !YHWLF+e;g ArT 1## -b -0o`=4;60fP&( j+C%%x  TT_f]䠁isdK'Sp%]%81"(#!U*n#&d2@D@s#JN?cـ@tbFb0fo @PXER9,=Lw\KAg -N2 >W.- DnM& ` ZXb0< -Jҽ pqiƸ>k&',io yhiᛒ: 7>|av U8Zy +ɦy|bjaMA7s[GW6b$盤"ӫ+dpCx\~?=`mT oH >H1 EQpIAC>>:M-,%ܰc({~(ɀO,ʂaWM{  -;ipa+Px -}&L`0 -1 B EJ454#. c7 L@_PpSRf^oxѨǂ*o bGj,ѬNDjx!X&#d=l1>ȅf G#CgÙ{}N._*;*(ю@(7G&F@@03xH.vǢB0?Va#zGQ< ѿsE[⁑`(䐶`΀R2MMF9Mڝ \eYljK$epEC(ˤSxP !hN"rh[ݽ=fڲG9/`[u0EXS<1VHz# ؅q2Ґ"u4!:$9]k*ʡPUQ [Xm3@#<AQT6,QS,)P "(:'HSXa'cVTB$ỖA!wAΐ`ݩSefw.p0.axArKh&@.5MQ WR> S&$79[>%'R@7zCJLA&= hh(&V /G@D2BJDW|Ƚn]YU薤bFg'|>)^TtAD}ntApgD&p`0##ƫ*'84p+޷bm9!ZYh5‰X:&!ڜW'E 4 PELp;^uDްAx-G(LH6 %SospleY˜dMAY¸<, d~$&CP>F,=p "^3\GU .#8L -(P yܦ>uqebtO6 `[fQFMvW Dg'*%)P3>81K0%avNE*c!I@'(SϨ7|>8uZX/0z@ L]!R@2v-] >@}@ !جW%sEIWJO  ]Yt|x?ĕ*lhGIXh.rhyR:3%Á( -KN` ް8hg -u{|a|<7`~A,@ifusM(f lr`qb&Lh>V*EX}&Xʆ rW^1p+ Op҅!f!_{՚pGhB6JUoPOCP[/]ajTyEu(:M+T,(Ѓ7'ҚN1?IJ{gUaP'zTe>leH\8Rb+hM$=>,KAEcB`樁M |Rצ Ô *}*}BM𰖴!C$(X`6!TBC ؟ ^-B xh81H4C 2+'|ĉ~@Ai5LQ^/hxT?Z~/h0V[ӫyyLleSƴ=(T.  E7cX8#l¨tnCff,_rls6COt&!g=p[#MKw= oo'l'Fn|Jd yUkg4 +\2U䠺Jo((RrR, ;2myC{H@M2xqVqx#M/=rH?r*'<{:&5Mqb-%NL:?yz|-ܾw5fHe=3"pi}hAcBc[1ʡC8W/GƖDH'@`AQHk:76YbZSg - -HLԓG˂)T -(&Q YM!-֌!bVM11"P,@..f%w5urf8LPQH|^pbZ e=?(E u qW@ Z$ ؤ JSu#KHaB!3~e>=ςf\-G=1#}X%&#ȃiH`\s5> ro!g;|$JIT×3!M ''(VnJ,O)F J\UH o3CfMhH-`}UXa4 -S#Gf pN,XCvEMYA:X"Xh L ԖbN,"46t)OiSRJ]a0"00!%H%/()ʖ*5&.dOGQ.H4W*U1ZAu XQ:([Y"x'Rh:yg&i 5%% 0reS'>_mz@}*mLSτD4廔M"|PdfHI[i 3)x!IZ!JƚCѦ%,MRCxAF.gO¯@;CF ID" ^ߩe(,KЈ Ic+Z([7x vH0l's 8wu6s3O#>>>4ːN/ˢ Ynk0~ Hm09%ߗۢs"$=(4F4ZjvF4@2tc(qp̜e *^ -Ƣa.[KfA`(":I4<0#!Zܨt3#iF).Ax8m /^ͩ`G;`U,+ WĜ<$ 0dDLADgxA. t%K{L2=EW<ШѥW 5>5[$!S 6Q  -U k޻4j+XTOP`XT!{0BZhuBPyo< @6‚CE!!衂0'ܽ"ٖ'>(o(7iYT*",y jΙ)zhU"uMMhEULs'>hT9`RSFWIAݟ#: C"`" -.N&˂>TοKo=0WCt`(I5Y%~Kwi'C0~rB d{ )~ 1\bp"WI@fQY"lP]"dQkW )jb&i 0hX+7SO >m=J+1 U#C;]e$OINW`Ŕl'brX([Ĵsה!E;x->X[?"X8ąt3yiM-~ T@bY5)t ^< jW(ؒACr`hv8rHDb>*vAI1_aw UO| -&DFpHx%8^'灄B Ac>`509"ua2>Դ/bduP a:2oL{tܱSS"|i`Blߜ ph@5 -t RR%Q$`?hA.ʔ p { e>~҆ El%ࡌ D|~WZ/2,miSX0dp<"4a(iG@Kl{J@[xUկ7<5X ̨HhF)D3uO3)rnF9qɃ>Qg.# --mFVmiZEGF -= D0?'m|P-OSQhP0W -U)5`B9 !@$ zmtiBGPw%% MW r?ry@ JIJ40Lka\)A?)B#)H/(K6H\>ԢT(3 0I0\m?gL~КוֺOh ,*E!v5;Ž&/3_Z7yG^0amn6*fcS̴8`΅ -"51|2=':AѾCs)ؕn}!Xul{I2 #3T.Po0r #@6$ yF5Z tH 2nde[)䛏 <7w@2f -<-f1QԱ  [Cܝ 5ʁz##HɅN - l~z"Y;8}JR.ɧJ&g-4p0"sB+2>`"ETBې(fO5`> -^ȉJ==6%-1}Q,t8FMH4z}H`lcAO"F`fMHVxs1jy#H-3:&?S.: i}. *fgIS6kv_2㖄5\"6'P6%Ov#3Qenagk~ #C 5 . W}G(0=}BRL5CiMg V'eFz[24{Óσ6z?L $$AChtpP`TwC+A^g p%4΄$;!VWUPؔoɄQ B8.X2ͩYLw0\RY -VnqBܲR)d#Xv ܝgB)^yٮ" -p CժE{XyMCr] $\hz߅ ?- J3=~U+x)]m{(% B 86a]72at`yDP6\yrJqK1&b{5X -"e4@jKƉiN }B4p5ڼ*|-YfY`;b%jȫdpU+ Ā+#5eК2naff"у\նiS@heOJ>ӺsU8"q F!tz}-.[@s@KlXuVZTpe LXZ#Ԅ@LvG qg1yg8Wi -$GY8ftDNmo!$z1CaR,Wx TPhjxxӰ?5PM `C,<~\HY RVACPC#xP) OX%Fcx6iKJ`IlHVV WingCP %HGR#31-P$R lnPOqT73 7h &A,nC?f`Aevȿ%w۰C_Ik Daқ'8 m#Q4SG QHC 8Hdq3􉌮ԃ17r Mp#F .9[X|ޑ.[`[{RZxit^=` -~3:]T"+~^@+UCl |("|(>?кXiD3 -_/-Κ:!np0 rV"c 5?Q-#gS`Dc+Tqa}S9HLpaE!vULjj<^׮V['J#(k;\0W6CPAASPԈ!4v8kTM@OA+<V:8#AZ(54G?DsDD,XJrh\& ႽaLCQbCM838d @ 2$@LRh@yEI^ך0 - -y$ҕ|ZTgהv̳i<6vTõ#,4Ń8/G99Mix <|p?s1 @R]<"ZݿL_h83Ѹ|9#hV:ݘ -Hl'pP<I!hJ&%齣 -OT†Hz P#nGAO" A<;|PAxx ֣&vgxBt0tr `.Zfm -ÏT\d(hAotX"Q -`m`vQ|="4-4^gM8(-2zP+Tթw A@(JFQ5ߔ!֭ 299"LM\S,0Iv,O"7L\6U -)bl3AaY`x% uD(F%*Qͅ@( -/P򗄗:>>-!(fP0 re(@1TA%qT=AS'%DA8w2P=i*+Cq:_dAz B @mNۡ9Dbm -1T֠L7q+;-T¸aU:W=rsoQ0ߋ; ;q&CMq XaQE`h\ۦ%VvI| -yP Wzug)m@@Qˉ`4TmA8D4B - Z20l - ]:AEcZtCaܡ tWFஸn%0 )U+[J_ x>ރ3@6h](A::2SBxsh(XgfE,K'ډc -zJM ah 6 -D;/ugTrr<;13$;(dZI$!a oHD˘rSSϧy2<#2p,Z P .aV39u l hE+pmcQ1.j$3@(Y$olA G\>1^"ʫuqDTu'giqwaûRN@({\l@8YKHB^As -nXR`5h؄1'ABgy`;CꅙFLIB-`#aFYm^ - rd?1Li - -נpA JD -:zB?0ԿhE=6xɀjZ E&Xz0 - 0uK $P|#eLGC -X$u H`l1$ Ѷy8B`" - I\_T2=FcX8)+ʐWFBp -a6F `_QiRʔ)A1nD!DWl U|'%p UA{طÞ@D1@H\3z)@$cI}rpV[J"fn510 ŋ,|ߌ)RA̅B@f|YIg1M=Ob&9؃=A_ys$Bs0hPs{?cRt̩^ --{MO7 5τ3),ljz :O1C̃.\1Ps/8ï P!Alg@mb>ZFU|Tq=DF萎6 wpp;r~/ ĥ HY$7+uQIx\@i ~@׎2"4(b:,器uߗTIEnum6aZ!2X6Q.'BL -L[LL$(] +Tρn1kpf }X/hu?P`Зр`ab& -8(rCtaM ]%E{JC/L50 -Gk7 O8وGxiX&tk_H NHLMe78܌Q=+H}U(:eWS ZDN"=(d%F BL xIϴO_4D( -Si Si"ȼ!=@AKTNpa)IxwcQaGUtxWF\`(ZY{d pz.7G & DQ,*3MZ2ns^'t -]HNHk*`~-ؤP" -( t @ I٧4bd.VFaj -Q'ڈtT2#݂*2xT/h+}> -̗0lψX=J5 -C -*_6 l=t %+H.O~̿sF ~w#)WJiBȿXilcgޕş8E$Zna@0l0QrPw=h}MEN -  (d%uw.oɱEC=9/xG{ {raeg-%"|f7M@'OX.ri & 0Rތ*[yK%I^|)Q㗐pg=P@! 2 -D@^,`5@?QYvTijȆDŽhta`xaS.Y$,41S$.HZԔ"P*R$sz!`< /hv+)bMܫL[3+kpvRĬ!l BY*exiRIJB -2axQt0-`XUCŅxk~[ƁƉDTsxx_Kʀ&Pia&BKy%Uh})qG#ͬ~S /KUL"eDzsx#lPN:^-vU Ss,VB@d:@pT}a*fflR>O5I ,.DYTBq f qds5KjB/T/!ޮ1GU*`G) o>_zN0%%AɃ;(Unc\C9@lBolC|B ʂU(w}oP7*ސ tE\M(g ,ʀO=7q -A p` 5%lM(G ts7zpoڍCΙ`,5 s 3guj-O){!'@hކ2^rs;{eIYTXy1BňNhVA a w"`m5Tuhi -C岻(&(H69tV! -{۸w)h0[d+CИ0(Βo \0n/+]RY- "y{SvBnp ђ&Sj=FX82eХ \ꃔ 3>JJ7 -XBM!bS|cX.o Dו f -F(R"E,+O -]`o" i2@XT|Kc`,u7h -^|.a 9/ -Y(?Ey`΅s`Z W @[ 0N8kB 316@j`bo.W. -nPe0` - -u5xܙR84ЊZP@OJWDEՙSQT= I"T*1Be_%yV܈P%eCˬʐReMr(GP.hP§8q@SVgc.T~Y!eXm.7)eHeND{.Ot>܏˔ -;?AWGG:YP[BD/80Z"Q Zh(mhtvWԃD -2˥ib8\ h"@OjzpATIR`(Ek,Vt8C -3`DcAZ"kIQQ\CDt8`Aΰ%oͿ|1>JJ\}nXx%"C)H3P3i - g*CKך^0H2Z([dJB )Y* -(oZ-(N(/wS7;*,G%=ńnDt0x/~HТ(W`%c πuPBcs 醅ڐA1*V6[JE^It{r&"3,~A~x -t@Gf^F^u%>a8+5E8J|?I44j0R- z̹ؠYeot " H1>'|g!j2E| -=VXi= ->=AB?g2VDn T3i$/A^=#Q:c|N0]& 0p<#@dŽxy4Ź~7"fN[:g("ٴ[`ʺ{8 8NоmE#@e_QX_]2l+e22\胯S:(ACx(P&#QHd52莓9FhQKb\«@0rX5֯-M1J~ȷ -wB*j3K1pRxC:a;qeֱޥ{{lGqg ș?:ωC` zQfX۠hif(2^%ԣRP( x|"8{L>0LI:[J$qR#iů U>?} 40 Qђg3$ˣG A!4>)r*)`-.|CYm;WzIR$E_O  {a% "*3ߏhl@A&EP>h@se|W `,5ӄy 7m^sÙ7/`l2f@ A8HHEoHlo=̇`)^I{R'С6K`0sr8MMwhM]p''0}7ĸ \WS}|iz(\.C^ @Eʧ%sFe@P<{O=+irb}8 !|#b6Q)% - P >|bQ 3p0psӆ&́QK 7uWUBk@RH@`H9FFtlCypJ #v0vEL*8Ҽ cpD5Qה -yOl=`iPe~,=~~,b:CNZ u R\"NG38 - *e ]@,N(G!0X?\cP _ @Lpf>;ѪKH]|GQ>x }Z/Sh%R -Uҳd+ `:#h}BGw~Q E?Y=Dw~Z[w;aoto#d$ ZBHQ(!@j=s !)h0q4 -|`UGV0 ->cwuҀ'x @)S?5<#8o! !pb` Ю뼪#gvPC0`vf32C0 jM!s.pM(t#XI5="כ -Fh8ZA`P 2S x@ROl  -K@ͥǬ&j|yD`2̕j?0֒Gƴ} M[6] :V..!D90k&.aE-Ifl ;J'^ѾAv=)Lkr-ÊŚ>3dZ 4MD =qsJZt!D2EF -oP@405MÕU] d( m(Zh7dF!PMq0P/ε')DO9=Һ2)dT) D,)h?]!iH.RHy70]i#+TS8 -97}v=LȓRƼπ :P=tQf)T#1SyR4˄/|CE; r!Є4#( ~YŌOγxpj`c3I`Cū(+T{V-$G -DŽ&B2Hä5+i)5.ru%2%.hUo(*m,'x]E)>uѲ(l[xϗy:ԟIZ҇S^6}ə"W8p" /*&FՖ HӯaO\&eQXC>N9Oh19(Ԯx%1vd`&W.BI`M#5ox2q(gA_;_kX'$0 "- -51]<_y^0v_xgqֈyMz&­$Q%n - {ϔ=0 SAM7VP5 Ǵ11# G QЁjxl{;y -`0)& -HQcDQRsX 񍯈ARI>0WSX WTjH)GQCE` M` E1CP8U…C} 0@LEb=a0> -1&LLq % Ahڄi퉠Q9@",OH `5P9釼q3TeS4`c~fWLƟ}@8Fa_>l Tw10 kx.{ϐ |`U>t~~V HW0 G?"|4-HTʉ9ۚjot_dl"i)%_^űLiN uYZ+nb(;$eEgY_,@z|· 7c;zG9M=14rMC^O6e&AǹQpYB4;X7q4u#9q䮸&_5ސ+){;uO{J+J&<i6p7Ή6Rr(4PdB>[` #p/>74Dfl#iZtEN#Eʼn $>ê0 ~atf2 5?F70B}bEU =ə !`%d3^ =]hzE{ gB;8i["|P it?ӍO>/|/t$. :s2w8%7+%D7iX oϰ> 4^#[!%Rx.U`8%by Q.;[6Aft_ʆJYC!w<> :7A,&#Z_DF)x߯3ۯnaR\ifGH~s;b5a? C5. -A"sY.dzSH @+) .X, ҐSr[[usl^7˥+evGԼ*%rpNA2 _i+1()8S - F_NU RRm%x!8Xn DVA 94z!~P @1rws_0s~^ ܗfL !v{ mzF>?y]jW\o)$XH'!?em@yEA }6>OX@φgՀ$aP:X* b rBah\%6X #C.X8пzCgliFC_I A&-x[ U -"S aBO g/]ܭ)g3@#+aXM`0F(w@-><1\me]y#.fh=D5JRɂR)%ZqJt끯gv¤|ZjN5"Ƿ5ZA8{MڝO5%Z η8?b-!> s~j)tY`Ao>HSQ\$I1#Tal~U\äN|0HBUD=v(1M@~_BpϠp~ @pzV)!Z8 R[ho(=qik $lʏsq?˖ɆlKARXc2 -T2Pr`Kb4wbTӳ - <:%=ari|䋇S {AD@ڎ헩aڍ - A1ʉAE絟y rO=]d${a=m:0jX,-Cp7xD}.VD]2<lhjAžАi2>2 @(m#Yo%7 -`sYCG0j N qEF.*Cj(@`(7&Mh" -oBАA>h<P9;~E}"C!qE* I6=MWhWHA5@֐XNS?zBOO>+|ݐ,;5٘d.#Q+"Ɍ8zѝfȼA_-zsUᅄ@x;&Wh/B &&@ĕ_؀ -63Iy71k me'/Ƕ -PTs*E/}E= '\jrLQ ߗƛ@O63Ha1 (2$o"G9@?`/6'ELU?N?  ˬ0iGR{ CIDT_EΊ)vi ^;ctH'P2"{$Jl-g 6d hMZ< +M҃Gťixᙄ `c2 -Ǭ|=bw(خPfxЅ&s>Ne[ByNCZT2XYkL )1K r@2¨A^YhIHK[ԩjb,O7,W&G 5kCXN8CTC9Bdi?nVZSTmTVriCe\uϦzڡaYS^j$@A_x -(ȨhcGz#:D؉,耶(ѧ5peAZ#)GheiWCq߂#b*I/E"d+(`A J;FOшX2 \L2<UqW05Md.dz?2߬$Rsʃ〲.nFUIFpԣʪ -$ dbyeˁx&(43Pd`+p٘YL^tV1pЫ -^LPV9BO3F=s°g!ˌP ̚@6U8^aBy}hk0H2\s"_=hϥ{ϫw;<%{Pbzs'ף򌲪%烕~&Rg'j1Ȫ~I_{)Q"XTnAx{ARu!H(@6`Fb3àwu,ZR9iX#ZԸh5 -w^[JsV+8Qd Q On5AC# `D9p>k=i5Ī/odvPj -{?Iw|CBg{-Á+4T*/x'yWnBĝBn"<6Ӽ8;"`m N_:peRO}1 kxSx36U@3lg| - F^P,Fcx (~,UssI*T\ ^El6ľX*âU'LCבPf"M{H&UAp'H - 锲#{`IrRz)f;C Mz"5;D 2wtx&]}0(=e-),B -Hs-`'LĜjZb;@<Bt7w>p' WD}*v;^:*;SBկoh3z[#aM*iJA6 tTinr}dkzt:ݹB3=bzZ-Q4t g"QQxNh  acȠ]|hgB+l5bEv 2k -&B}Oޕ$a+T}LQ\Oac xPPn/Pۂ` 5+m:cP٨ -<+q) .-k" -89x!~QZ9MjE)#ۋ;~cE `AX/? F;lL"=#ï/<i!^oS;zn=t$-()eM'KTVw$ Al\(ʁjU-T t!z(!(௣A0huM#VEk4 -Ad&Zsx?l@6"=dH~N()o - zkv{n:DĚ [Xg36/:83]@e l.UKt sP1B؅YED-JTyj2D`8Tc8 7X0Δ17@Ae7j'!Љ[ c|A)ԇR 6 V6Q*<1Ø#5=L3 .[Än7gL efX\  o~%B%B(po8ʠ |Q>HgpkZCQ"T7=7 EfӀ^L>qթa3-J_H8%cW*"lQ,@B> -Cc1RfEO!Kjha4΂;$et4b - 'F`/r`Ve )B͟:#tC8T$v0L¥˩^2j4\ֆ|Anߺ Q2 0T#+.&\:B5 9T ߅@'8$ 2ĄD G<\kGI]/ HrGc p{`(2KH}~Y<(x?\VA@T.ȃ" 2EpWa pj|>(Q|qPׂ<6^GEdx8TuB>\1W+"dX߄9Kc^!guP .a<0@ "T hERN)aPV1G -naB{42CウX<ȐZUP na I13.< Z+QFg8@ 3$ZRHs:R4 1y0KOۼb=aR X&S5: -zwBA7IJCFdfӢ03^{"0<]G!ϏA\Fz.ک*@\sd<%M7pha{XT" @&@\AqW9 dV`&d5]n&3}mCdsM~K{ޯO,AAbP:|d͊ℚ5/c&WJQ5dMLjMr†Y]@  -D5z>If.ހL@k}N\cfT2ӡLL^`M#)YLǗ{}iy!+)XnS{K7rra -jn '>cf#Q6,iJe7?hK`-p(Ю@<v -)/I0`A,03@0Pe;8Dd>OA}?c} 4m0I*o& -=cmB0@\;K "%z(PD(P&\(y2h2c"0kТVH DF1Aɠm!蝄 N⺎ ůc*~5BJ Zl60w9®5#Eꫩ8,6&e */hղ0{N8@8mdZ CzhyLͦyύa$f̚L{_; . ckh\TZY' 4.\&U-<*m} ڭ? O @ OX19p$] 1aQ *Pd2H8]Gxf9#Ch0!Hz42.Шc,S -ihIPUgêIp;*q,y[nS*'0bFf -PXI(o*[B X$Cd,̓*q2%e6UJSHgK&v qpl4( o+"6#g )b[qq">O GfA`};CȁD}1 :4|"PцlY$ - - W'6]K8\$lzBCA_4z) ϼ uyJګSFd8N2T_eL&Cip%b[Q*R'/oX3̡O>dDb=(IR; Yhfٳ -QK0\N\` bx+TX)l=yj} kh"*I"|gMFo+r}Z3d"·%ϴ-62$ }pNKha07^qACK\Zt $`)}z@ d`=*s̺JS.|G"_4Ba -\t-LC_lp ED Хј.BAH BYarp`8axADPbv s2Aʝ%5~.|`S4#b" =!g]  -ko q$xT@O3oY㌷/GPDFN!Q3@p+(RƖ&T{V$`vGl8 +M0$OŮ )T757@o>>>xмi|FΥ!X#Ӂ+(Nŀ%XI](>Szc{BzH9yCDT'|3nV%r, (P6I?B`ZV̩Y -͞ Y:XEŊA3'+w;CǴ=@%7`mTTٌ& &Ívv5hh,ü,܄dג$X0_OA'kj:2;pW>U5!bED2G`zR$6eJ֬y}\NB -?h[|Rn!>T TU -](|,۬feZ*)`C$ MQRl foiV;6B5$"NЪ(UEZg -7* L! r-j0gx#?/) @Zq ۞UYr+H~C]zV8hD*@sB 94CrKTK VN?PI`P1;A:Q O3@`K5\\, AKY؍K70,9\ @͆  Q a;ɀ1 d$j,`Nc ~ ]K('h <0䌼m. - Q0Ch:-jJ(gZC\F]Bb:ؠ w0 삁.*  Nj! ]L%4DX@ -mPb;Q̧I@ 4b-\蠉-@l 7aͧe;A@"@3sap "5ńZnʗt(Ro9yL/QƇ0 Љ -a(ݭν - BEFhcsȘAS~úfG\8ۈIGc4|ɚzYsƠ RDTI,Yh833xM=eVY &,aVxZH<ͭXoX< iK4 Ę&T%cbH[=Dd^L}=biʔ3Z& J)(̫`*o% .bF_f /Dž$Iz":Z Lq'ga5/  L?=c -5 [0\FC)e6evs2!6eE/|@ - -\HɣAzna' voE \[  . -0@ ]5ɲfQQlPPyn]a`C(u(ڱ1Ro HxC_5Z8t8TX2ՕY/>^ÌC}V?Ҥ$tE" a)CL\AЬ*kΩ>_Qzb`XNz7P rI֘A b+7 fTCˢWĜx%y0 AK.?IoP`)TWW= -~6>>L%AY 1.w b` %+hIpDQ@U=@_+!E[B\ d{W+R R)-9-t1:Aߨz~A -E?TMrFQư-:l=@ky(!6@GuBGLd[@)-Xt2L5! Xr 8f"eY&@'g|,Dir) v7mm2o0%8qMa}hikædc I|Nܱd)mMk,J{%*i$hZ8!1peu le D$2!8T ."+Q D: NM_[Ck~z]>)߀` ->!nTi.!>Qf_)]e= R[ׇNK@X0ǴosL~JaT^3J0De&H jn*mZ#L7%fL0&^:+ -Q "<MQ'VM+6p[(cR{N'@(p`4  i>?Ԯ (7O7R&C0^l2?\B%F/ zR!p%5`6(Nа$ΰH!)BA! 36W k[XW [L,aG~Q pb6B4I]!cӦ,3=,,J@ΞV&`v@h n>?d/:`E +RDI5vQbyOI@,OOXКkaCxqu+g)Rk\ WH`;#nϬ# #CbjJsC1FEcW!@\[hL) Y=eam`@6Cx0j\:tcMOD.{2*R)z;̄!}z"0aDF az_dq4wcQt 0a1D8#|!z#)*p Σ;h4^++?{X$U,T ܋YJyƄ_)/NQ#Y ڜqt6'lO_ܙ=5HCYvCE&b\fe4㪨>{Ox)$ &`$H]*t {CBBe,qNp Dt1 -UÇ8pB7/~>H?,F SQ@`0 !Ѐ0CIf@ OeQ\/򴖼$S4^m(˄ |%ͤu:ʷ I uX]5ga;_SzbXh`N&\XaϺ,/-} xz`q|"@ - pCyG#F_@Shze YRzG2O[PUϟBi^UTCee)V iȓQ4mN?BY7"K*/,O,V`{MȅI^PFLGBa1C7pR]8/SXIz^ d1M!uU^ &}Tn0+3^$-zbZ TH qvT 5>v3.` bA(4(ЄP5"+ !T= - g'C{ג#BEGUQP.%:&)4AB[/Xe[4ba86E2{@9Gd*8R,(sE(h*/®@ud^KU $ Wx ZPP>C|:m DHFP'XSL)Xfn - 7y3wf@t|EVna:JB1\;RK0QRP3AM ҄bF*URoLV4"L!A쫂&ԩS0ch51%rRYAYIILֻ4R]< '!8aVphUSw'8`Qb#_ Vdyb$ .j6JE"TX۔@wEL #p,ސ$7 F0d>c*.SIJl@GҠ{gjT!7M$24>scp*Pp 50>3`\R?C(ǁ ъT0Cώ}џx\jpƎA B!)G21hh cP^ GUj9T - =~#Bg>|>`4O"\.rAۀcLekhptTt< ( JĨ& -*@IepaA{ŠaԄ,cpw*eS#>3e1dIcuU 6ӷ)`dJ1hպEԒ+h -5nDq 9'+T@+? B0"  ̯VvkEF!B�Z@QtcāY -` WM~ -*\̋47#ip5*'''A=8õȆXôR1O_R87;gzAzf}0~s=^(Hy)LSV9|]gp}IIt^',~C)m:BPXdo/WPT"X#԰ +LR \N3|!wDŽIc X -!l9yZ1ZAys8yeL&feD6~t1O Pd# Lz HQ)=%BE#hA5Tt~z;Uw X"ZQ0 ԣ(&tb/djiAŬVeL' -X ^|uccA -h+T뙃$X$.zW f?f30c -)0+© fD$9{$aV{u o `chU*$VjRBsj"7cQ>i>(JV,**`I93{[:Q./xIn.23MXA8u*A1:+ywAWLۍ>8O\<@*!l9PoO;k IРS+)5͝FD0a*^Ox!K-" -Q8ӢjvcPIk-! ޲ =Iar/uHt`|wKkz4k L:%6 Y\`jQ?zx0d0WB%9w 7W_B8.vQۂ@w(#0Pٖ pnP&қ'UB&R>XnqD-`q$CM6f¸h98Bc!=7Ͳ 4+g31eϴ%cȜ7i}bnj) -ׄKsF!XD.Nl=Lh"j|B+#1V kp &|5$HEpNо.)tYژT*# xx .ЏxGS8qe@&L2/|_ ;+ |؃03xs wJ)^?.#hU8;LKXpC}fJ @k QBu҉ tPe %a`(,u;8нJT+l1mRZ01(LH m(pPE~uA*hR]LXG`XX 8P ~J 2ێ׻R`=HӉNtL@eE(PAxѧ ,h#&dG)+^3԰XJv=Bl*nėf6+05%xs(a"AP h<="o$9 suȰ%0F2Ci ŐbTui^5J85X m0q<#= z ̔NMHgҾ -%pn#*:v!.!O#QLX@2l:1čpI:V y.'U<m ࣟ><> QG%F lФ`M(x@`dS(?8rG=V Nh@";IϴCǴ"wCi\]5>A"g *Z .FF;W5)C֞4%G4)bmPͼ`KB\ 1?3ޣ $ h=vь!byk -#!=J.{3J -9*X)9_אVm#f< EHvBQOm_(K(|Vz)o1A9^+Tg2KF+5`Y P < D{ -`W ao3z`H7Ab - \I{KjP ;gh#AvO j\g g,HLP ":IA!& -RݔCglsޏDV_,yƄ"4P`wօ%WĦH,FXp=QF747ֽ`P]Rj:fI6?x4hU*BW(X%A4^`d'&%W-6H".ɡ&e/B1,A+ve" 暥?rK vi4URIU~0 (h0F@06d3V0uyF+U 3 6r;BI2殜CYP{LuN"a D#:Rg(A%M7}7w%Q -GT -"h;S}@ O0`VѦ6&,|}7Xf#\9I Q!Tuo /Yj@9*RfajZ@_kff+fmhK$Kilo?k(Y_/pY w $ײW[@` 8ίxBaXĝMh8UM9# r?`0ϱ7F`1-8GQ yT-I1NLXQ[CDh>ylȫxϔ" -| `(0c8D\I?% s r0%a@)MK Z!(Mh&VmI1ȂSndKa$>z̴yKF ~V3 603:rsD~b@8JxT 1Y*"t17@d@K! -d %S[BC|Btg]c(b#CuuSyY¦DϊSjlMuW#b^o0_eGWϦ*}1yߖl,V:=@?*~-LDOBW0RsF-yP)Q -| I"Pe PB7%t_0Z0Uj@ŀ -ư%WX胨< -U![FU?xcm#;9a%r&Xd& ,@;„ЇHGvSpNpl:c=t' i+rwꃛn!B}PT' bZ۟eaG31>}}}}}}}}}}}}}}}}> 1' -jG xX<@3Cs],5qkU HOBhCTz*-iMsb$g'_ )& B0Ű:z B{} ԗ#b$s0WD Ϻ@?s =쐖 ?}+v'ߠSP02 AN>R^%a'kO!)>>gggۥt)\gYnI"I$Ype733Xxk>xF'b_F?l)`tX~o|`?7GџgH?ʺh"5ۃ,I!ujdi(!mggC0X >:@4h>qw~1D:%Y4@Ѧ5j>Zyc**3 ?XUMDH%kG AGH5b Cճد?V{S0ϴ׿؟H'pmqqorz{gooyimymu~Bnx @r>>>>3>~miO'ǼQ>{[d^7c9_uOY\,$8?J6KQQ:3o :鼛ɼShQlOagЧMԈ8@L7f*!1AQaq 0@P?Av34Ucτ/S uwV8x,-S5O><'k|_~LΟs~,V-|#\.Ljg{ -ZZOUQ,ޠ-&rQEb+D%" WpOrFVRqD lʣ*6nŶf;{ *&H.9 Kn+ rո^#H\ -bP){*bf<IJKӂ3Gľ0 Sg/H>SQ@-"ԹeEpxkx7:T.Q]beDSr1-6M7U7eiu*e9wKi^cWR6X(&+LuH{s"Pk^d[#XxXkQG؛#P_!f=.!Y[cPG!ozq&`SڞI5m X e-o101QRj.U=i+Bw,VlU hf[u*-wpIML .UMIêw3\Tq@tQzjT(o2JGk=ˋPeؘe&մdŌ]K:qU*W -j) U J닍%h&&noLMpܪE\)·YV͔lS[˱OmaAQ?RގUd0%TW)|E'H_7ÖjWk˲E=r햌'RsPEVXS*XUOc7k/ |\r]@1s|AzqcR1)`,$q0#]GsXblRl˃m ^eK kmseJNvW|1 bf2zP -d2nBTFr9B8j/6K: Pʞ -R5+:dJ*"pq`%1AHdEl-0E6p=됲-cNmW i/*fu:K dŸb \ u.b$Nap4=#^w0#`\c+AıYLE~i 7)˫=j\%Qi|U"n.jZ4ܴj]TO\PY`:hHLܻ V1B&+ 2"3P"ϩA,E)EFH:%JL\]``0Oxj5/34Kơyҥ*4*Alۋ K;ff9[Ze˕RT3P! ԧÀSĮ;G Q - -JFާ̪௚!{UKԶl䡖Gdj[\- Ūj-w-fַS/3;qN3{u\YF_τd-\DHn<\3Q p(1q0/dS(ʸ<..C -*f5>W$cQfC)eF$1T1,c!%cž+ܸ+"$T bc1 5¸2b$F.pTPpAot2-C9'K\X5 ܵʳ Jp>#.TIU[t̑E1Ōlj|7hQl׾ qsX6P5l&q5Pljd8.6DbQ) Bjw P&B6S3/SB2&y7;{B,2MEIp8*V_Пq٧H*jKb\^.ø~~$.끃Y3>UB/8˨d8F7\_,pV9D`V]_ \K|qbj"T2xKǒ~7o؇hG709"rK,⸅C<Ɠ^رbʊe&eNԩ*h+R .qw*#SiǸIܺI|YYh~@ V EW^cMFcq[u/IJŚ\GPfRsSPҥ|<;tAqJW vAd\ʽB\5,YZ5M.%,:RZ1&ʍmD)C,`HUƈĘ"#|Xg<٣k-*)Fѩq'psP)CRUbA+9 WW GIVE2kF) /yK6YVԺcpF+,5%CV@|S83 Iv©L\Q9 U>qNa`+E;.,w~TCKTxhz> qhܾ7G~C0 ,x Ko/&cQ |beY\ő]-|.b(U=J:@<ɋ qpɗ.m,OΥJ1,Tn2DJ 2Xf`d|bu‚8-z 8.;8[eQc7\[djl#"C5AeXQ5W -u(5JAL95Uw0n(\KWhf%K&a,u.&Xe\VՆ!+Lrk}B͒bNb4\fRiru.oW4^j#R[eT|L -. Kc33>Jݘ1\j~% QcPܯq>`ύ̪|Jp}qF"f+2DUuS*8[0,F(*T-Q;K -_]'F3*oxu.et4pLD QpFXWryL54 ~ pk7/\NZ&!7fLƮX2'1+\f"L281Q%a.|T=İ"u Hˌxp#|i1X -jmjVk vgPᆥp2oYr/~Dn\%8 - /,̶,m^o%J@h7 *늈5YWQIa)'pR;33$%o -SKrarȱR,^TJbb8IkQbK.:%^#Ɨ#}J+5sD!_/B%_/:hE]θhxu CP qt 'r#Kp CԻ*LWwLȾnɑ1>wxX>-JjZ-%-*X) LԻ1rRn:Ĩ tl/#3r^Wi?UD0B@XL:vT̰Y[j4QPDB@QK#n)w/:ĩ`!CwFQ5 LC,(#rߙ@tQ1PV]#YSjfVW%̤Vpq\a;K*AXC:SgİX <`7Knpq43x23|u,W u U;KUi$rxb.,.\)"U<ኗAV\{l`Ը],TPy|cljRڨ~jWy5sR ̩W*Ts*)>咆:eL!*T1/&o˨Ԩ!IQ*0!3熙g,`nd*ܠ*le;|v\b61̹0|L$>x yԩ o] Lf xLE QMLߩ3(2p(5IPꥥETn*^fܨe8q. /9* zyArtKqVVJ4J=$E1WM$ĺ1PZ@DeDQjkQbRjUa2B/p*؅}eDQPCr0.^0$#h&TxB\A" z*5HU4J$b݌:d TЖQ,q0sa0pNȽraS0J8QTY>Q A[G:o\g)~#qspN:&yjθ,^z|ˎItT\bj5/p:Nxܾ1Q%DBa1*qx?\ x7edrWĮp< -<5$7k @UJKUDFcθnUKy7ŋq:b:5DBTIenF<LKoY7f !wqp4rTf縖MQ.0omJe\"BʖBeYJbqHeta{ n#::KB[c)̴O\\ԷV_-|Ge6,inTjxT}pnʬ1ܺH(AmG6Εp}]#>'bPr&+@CJQ({PT-t_0U ^j.#1UKc1(‘fnWݮ&Vg5._޵QAq-*#*sL9q".A0f@MyQ:]̿LьVʞ岛RK{GU5;@mI|MFɡT%lt" Nv#R YXS:O@,ex:ڰ_ HH_TCQ(s.ZI+h\ -B1s H<,YYxJ%Wxe\2/)=fUokui9i5 ]dc5+jJy38w;Pcr?Rܨ˗. Cp|1%$PԨB c1LM~.<%̃D e V[: 狲&- B>"!@J"W;>&APM .1 3 ?`Vb ܞu ]*xԼKqy˺Z>ɿ;cQX+RQ9O1.1Ѵ@?hʱJ:c+rꖱ Q.6STܺF䖌Ů2 ~wʛwÂkrĪl q Bb4 $Al{[hUNkA!j5oE3E7TRk)PUڥ' !s ;Z6Grx<4Q/J~wt\(6UPPT T!e_W$Ske6"*:xQXbȆagD6 kd͵Q` ;%ʔ@ie_fל'M+a -rE՞dL#5pYA2Dk*ʅX]v,ߴdM ļE X;"0" &r~X( -eR"3kfvDM:IQ@U3pϸ̂Y>+5G B& : NH+(@YNYƮłAJJ mT5x\ȋ脦oVٻ:òh-" <&>Ժ>d]*X;a2Lيܹ} MXX1}H#kD=rq\C)@Br_JLhb; jؕfc.[ÔM3 Կhp~#R,*ܺ䫍> F!i! /+upuz7|Q nq Ev˨%dO)Kj.41^C#e[&}4_A}#KTFڡ}֣% -)eS/MO,ǙQ#|eXwR9Wܮ3|7\&t f*5}!,4 aAZpGxwW(+7>$38ufyo&9I07if K67R˨UVV mα>b`ܯYe>bu34‚? %ི ܀$vJQ)ukD\ 7)3x"4@zzc-nGRKuhC+1`h-%4Zv2&'Ej`.u9QϽFX%j M1$/exv$hR-bVcJCT?s2rhbիNBw7oٸLp:ƵqɈ v.4KζGea3BP4*|~UڼT?y4 B)e|;?a4}C*|ef -r}cX|K㩣/H*%BYsPf'0-,0 T%]\b0isZ?#0u?$`mP-Z*G, eeDhPPۘ쎢 X$5zqD^"~awXirg.04qDd 4ÂqâmqyNYwOAe񁋊1|PAyaiG~%ɗKfo_r1\TxUb1q}T5M|3mRWHqB&c(*rMBed'0 ҧED!;gU+ٸo6rӁ5.Z QXpQ\>F[_ H[>,$$ -%MŲI1+# b B,r:Ff.ߘEu -bEK˸틦WZj\,FRJT?hfbq Tj mn]bUf%g CK@T!3@:D] b\B\ "5Mшj^$&%%OAHK+1:is* FUf%F"DžVb1EslŞo/55\H(IDѿ,&ڏ=e:a(J -%]xtM8~PQCWpDm9ho۹, M[78n!i9#КܯV~$EUWQ"p^Y~Yo"dϥ;FJ'jW;oqp}[ۨ $‰~#hVڱku"W)ݢ|ݭQED?P&a<š E-tD35(>&׍(q,jYqOpPb Ic7XY.+ ܫ$D_yZ>u T~$ _G -IRcD~Q% *ʽ%MC)/x:o| +n d[S+|RYne@Hgko <ߥmbقY\MK -Ç-u/1\o/ IQ"J'\YUi|rrk,w.-lY0} 6;Q_^܂)ϕLN»&a'I`1 K%ch9]Ĵ.0/\p7Ńj\G٢RnVɹG&ҢT].ae Cڵ>EHiEm,cDܪA -hzqWl: h+~$ -Nn`}pRʆ^BR,QTWֆ}nUfPDaEP()2ŽK3oJ5ntS @o%AYoz>j%6Ξf'g3){&ؘNA'._e ljuu^,Q6V\ak.,d ^yi >#.6`$ IkZ,\Pq>h%\oW釢wTT :cbH(c̜F:56;@!'Fs7֣%4{H- &SЁc9x]!-0Dl!=og@^T zu1 -[74w,vM~HCypFR8 ML qs[KjkuP)En_9e𜌧Y/*Jf$[>SpXԶrx. -KFŲOAH>حdH? vQݻ*Hä́t2?EBD1n¥JuQ5RPf40+)ڢI* --\*ApoR&wu3CNLmej YESv 4mT%n*X~\/]Ajj Ol ]Eu𭡰BnJjZADBC\QZĪWuvtfJ McEQTn}2w,7NCL,FP;wD)PF$6x:(aaw U^w PypBCAmnA\r۬Nw[LKIڳ%#npj,|&* DcP?a^`9C|y3+fe_Rzk,8YL s Q _N,6<@[c=@ 2Ww?w8nSmU˃/0[j|553*V? -#_rf3)z8ZRTWA| -a1Rܤ[/O=fqL<0E䒴o}mN AZơKl.wAB^\kd/̦z\Odm1fS+W)J ۡ!@Wè- \#\1ak#ji>-ni .rȚQaa #hi|2vPLRԶNJiQè)@xo[+*֖]>ٳ⤭aA\L#U0_jm)-kX^5 Y`td{3 -" =T{V0n!\@:UfS1-543U]YJ\(RKE@ψql/n#vbc 0খ.>_##N @n;wYAq1 ]/l{+! {@";e.\xJ`OT;+։c1&*U*Ge>M̸> 4eԩqBc-j2 K1ٰ:H tEq.R焂 we/5UWtwĨ\aA/h<h3 xӄeަ㞋GU8BFz.K/5.?ԽB(%ʉfX-HnXE#)ZY@a.<[C>wUA,0yad 0p≒UQ+zEܰ\˃aw(]J07hJ.WTK3 Lwe DKmZk y޶kՌXY3*|=l& 7lHT&NF%4WL& kl)C)e@nRk.n YDD_pP;Pf-*:.Td g](KT~i*?yΪfR%pB%MKeU5a> -|p0ll.:\!:SQ'\=8!hu-xQ IU:댐^"rW9|[Z}LG2x:^#,.5%=lRwbD2%ޖ.\%F{ wj&+FײF+gjRb3Sm~ĂӰ -c"beUb>=T>TeơRT##1grܜSPBn`wJiP^L_%EITوwnPJd2`h-%L3[VDPPCQp* qZ*c [h}?JLNUeeb\rP⪳E]Uee&8 {FRlߘC;!Q ;ݥ N0˗u(4kuCХe]S(nY>FZ hQ[.X -xY "_*xPMK 8R8k)`|N}єZV a JrRi`VFUE5LA`x׍x`~說pq3FFLX0KlA˶0#ij^Dĸbz D+e1_nVTɹ6Z"%b,j>~#ucOg88rZ̺B&njVsVdQe%:uZa1 v^U'GWųȺƾkVlbГiVL0_^4vy.뎡RQZLy] ֡ ]7xjT^hh&cx 64Q)۝j(F vǠ UH!8kK8.nii`OX0*j“q'B7[T|Q8IOȎT-z%O9#m Uߟb"'O#:"nI8^#+R)+op_([7}Cf췒:#4JI7Uޫ@UBā@N)_2͚ʹM/113}Oqs[ -Lƣ}e-3˩x+xlup8UH^1%2ohƃ!c{2(b` |ݓ0Fԉx<2+RX[N We+" 0o(Sג~P@yp.ѫessI"8=[֥C5UDg@z&ݎ"1H԰r{4c}Ta+nU52]qYlFc<0% ?&戉S/^y00;H{8^L}Gg [f߈JO8)F*K ql=f X,[. JM>¢Й<ڥ1[töڊ#*}J*ZGy_R-zs,owm8.4V):Z<*%]ʋ -)0Rq2Zn3J`x~uab]x42Cm*WJd \CBI1d_mHqΏ6l-fux/j4*aH)[Ͳ+RQq J -/ZBgw.%LVc#Yxqu.\\f<ïDX: u*_vf]bP-o<0pE{`GqCpRW[X{Ajs;k@V -)nVT {;1D1!X9hwhx*j02;LԦF7\ .5kN]:ľ8fQԢi1sS\ydji(1)ZuDtad[+$8(FY8ҠAJDxHq{eBs ЪbUh~;hHj)ֹGl+WǐVJ`ؚ@9;R#)\aaYB,]!qrBˍVc~e˫-߀7 cPV}2ƿJOA~R 'w*\ZLpuGeӎRyANH5I*-ew1#Vm|5E^AWw}~ -ikeLAtͷ/+ &}sZXf_,,.)otD4Ԑ[u3[KʕhMviX[T8. 5P uƀ;|@kL!Da*TUR u0J:hA5m2izw{%_Rښ"֙fW-kO胢FVHMl ϧіX8er+d#FChK5sDAm"ߝ"+Dc cqK*Iwթ]V+LEFT -)١SW2ut+/Wk7@-Da[zyש#+0RsZ?$Ũ񋻆nmfywp/||z[qy)3u/=0 Wm !m:Fڅp\*U_"Jy ( c|},x< Uw).e pؒ{7PPgpIrF+fkQ#6}ar @jFӷTك孹 2;:mѨ1/z`ql`׺ u5n =$9_-WB7gÇ$$93F{ /5*[6*WVu\0 S+{5.^*+OZ\qtƯȾke59w_¿QKzLTPzZ;LK\$/|J*?1x_rSju;f R9#rf .S15X.P*ℼuW)+bEfYn:ilfRjK!ٜ?1 -Jv)! esmc8,Т7˗/Sn\_1w*.1u [rqqj$c%sf,Zڈ!u9CAH.zz҆!R5cO$'tQJTåJ5FPRPy! N=|0a`TcZ -Pf@jcXjGaMrkCt}%!j6MLPIyZ]G dF%Z˺ 1Gpm2]⎜v *:DbwUSfІ\!Q^zV>f -H[[ɮo^bEJovxYDjnaW{Ko.izeX֩bYuK4ZD?ܔԒ©R("Խbb.jR3{,La@qC(wrޖrq^ -gKBՇ…;"e{ eFXS6ʼ%SRґa&jcCcSVU!'rO'$U- -aL*WiqVTi9.m^9U{VU.4Hj%dʧrO^jPe|\95\fa*RsথY 5R-rq]-6FǍNLv˶+uܬW[;X&}P(Ժ'aRq[`pbYu^VpEش$+/AMvfȉqrPz,,'=Tb+wA"rlܫФ@9*;`j.]" -K6ƫu\4‚DY_eҔf[x¤B֭/G2"-&#d{n'_p6l,M:ߚƨj.eʈ_o -+Jvݿr9عIn’\\` $ .{0 K]PīnRK 2F[  ېdҠ*0~.:,L˼NV"[0fC4KԶĈ숓6^p>Q -{V(%ٛ*^eb b[3# - 2I[a.0  XXhCcH Ԫ3Q:%[L+̿3K&%cRFgq6K9i%e35W -ޡS3,n"n$R /P8]uc0K%poƵM|=d tW8ep7_][Gd}fi?&QpR//wPp "jf m;8`to߭bevӦ臽f.ljSxz~vG!w -PU3MSamDfp%J#|J&\pE<.%SwUܪ+|AuL7Vxr’T~ˌ!DxIPbX7[21NOUt * _Q(Bψ"ۨI()57Bx&xVr*6*iSCmEQ1DFJ7- J E;ۅAuIq?7'44C=Wxk{ڼU{P:[/].3:!:m%=7o50j,D^SeJ*%aL+'JJgeRN.3-!ZKxzeK-(e;|]Qo}d~,%EJ\_Y/*|쟏|T']AEpxCW X|\/9j -i' -y bmJЅZWBݱ]J=dRjg9j|Eo\R%jge.Q[pLWr[, -+*rʦ#mH -#w1uGLPLBVRGJ`w1^ jYR@kkU@pVoJ8Xr娚n,R%@}JrPeBY~8H0Զ"U0-&\ O*U~;A]E #S=,BU -Yt|GK.󹍵"R^hНX[%xpj]ՄDT0L[%& IRѲ[ )X)=VZc(+DHC88necEΥ|Lp36 ds b52a6?W*Q[;!&/\cHR\d/u3xTQ11N(d&D]VHq,Dlg3ȡYLs8F^zQ'Uw-] Uj G7d8z\6֧$x,"ʢ,tFx ܨᗎԹYm^+S1lBz@׈er1@DpFFX"Ù|[mEVԺ1Qj=jU&UPj/U}K\$OM@9/egWw_}h tt3q TVf/${GxLpPeV.-"(MKg!8:F5HCf{7(\hC|̷9ϘVYAľ4}!ՒZAL)YԽ*x!@p3%2u5. 2Ŷ6$Du7+1*WQ - ҽNK_0+P>pڋkڹfqk 4pبJŻ*jE%@ Ąn ݵcҮ7Pz$D -\/5/Ցr ZP T")-QꦮWyJR \J.&jR\;\eɎFd||W!f - % 0˕OR\j7+ls~APO -n+R*3pe )LP{L/:ؽE37T:"%OqeqLib;m P$%mdnPc˨dK%ϩ.eMQq35.RՈj08%rt3ٺIl8ԫ]jmS_2.eP -:W}yJRB%?U Tip>/%9!W` -kP-!,`f8.%3\? /tKSĹQjuµ_~l`qyeJq -}L$~*<̹|T(% VAoe5 V,B70'PbRqEA+ 5 qV1!Vߨ%wfP0P'jDjq/.3L( j=JNSX"Wpyװ;w2C}[3{Xū\hćtZ}~J<`]xmrBO -RBr8XK \2P㻮\sGr|OR1baJ@fWq)UƸVJ_;1)OF|§wRbgkj.{10lk,w)̧ecG<-n t~n{#3Y%}seFQKz#SpOeԶ#)!kdw'q=ܤ{"I2;Jۨ haj-ͱ32r*Vew{1LI=HA+ IU)X`eb8p.~m,u1H|m1bc^)0$SAu|A5Z5u$g(֌ߘ%+5= pv%e?X`CQuȅ_dХU WQVnzb{`TpA \\;21jԸJmyn\,ff/oF3t\xFR%S3čk^%LLELF52#)8Xj7zũqRJV+.mnʏ"ߙ8xX4MjhLY\6,S"ЧL e)%L-cs,AO@x%)RfeXqKAhpp/XUAm$j4)r02U<#7ĎԐfx*5 RUJx5>xG P2)[щ  gL )rUZBU -xv6Tic -MׂgFt0y˺ -*ԋj:w5\J1.S-!ZV23 U)5R`:-Pqq BKF*1ocMՈ\f R4Y,t*-.-h# kw_ropj)A)υ?8yQaTsgmO \C*8{K @mܵo|c*b2NFj& JJqJ:&8/O$)1dk6dp\= +r,2JEVV#Te}U]R'I\a+\3W{6@rʸTG\TpÊn2\S[|  -Oi+F=]HksOSN>@=3X:I{0B^\'2%>a2[3RPe'`-@L[(QrLUV%Ա/Vn%C| np|dy8c[xQ1 įc!JuH&H̩\!Q"E,cu:ĩS:Jn>oK9԰ Y$5.|\ji$P oDOa*슿"`?oCR ø2$nXjk (YT@ŞÇqcUn4Sh._с Vq%l>pipآi,WL& s%VflVe>l"Ԓ9;?Z[f̂D[Ľğ0xO nbd|^c2:2@w~ﺡu?A_ c<"*Cr~WÂ\#A p>f]3\q901\Q p憒cZw  /g7KZ/zYɍp6d2<VY*Y ^ -` (kֵuEpn4u w 5U JvX!+0L鞡G5ȓRD\ -KW*|pqdmV0lur3 E\_/;&5 fG<:cg eqrKT\(n Da`n/DiP%j9/rĩOOwhKE.JKs=Ρ2cW>%p`"E *+щ^L(J3N+=+ymI]Kfˎ4ڔ> qq\R}!*$rܹDܺY B*|_": fʝ3jJ3˨_dZhl단|f\\znj*n74kCiHH>i7}_i(:٫Lqtŕ]t(z~z@EHq)V_rr>j6emKԍre2ZKQLb+U,[CYQbʅ 9Xj( &LbVeBu_Q4|7nRZ1&a=.@5]*uHL-*p)GS01IZ9S,&~q”e'pQĶذn[rٚ2;OL!RjW, 2\DT/Kž#+*[P#.^b.^bWM8HKW/\f/\). ."˖O)UQJf8e(7/,E Q̈\ӈ!k^g\(Gmr:|ɘSJ?|o!_fT`%n/ӌV; }S7 ^WQˌPYu1MmD^aa_,5.ٹIhh#]2\c0#\֦x<̋ N_W⏟;!ʺaFf2FSr02Aunx_ -oXwQ[#*[Z3odfb5bѶŅ/b;D^2}K1sI;1p]1S'Ҫ7Zzqܓ&N*نf3U seaU6YX&YeQ$l"˅5 dF^b|<_;kS[bfUcݳ{ ļslHcrNjf8~Zܵx(!fو,N2TqKIs~b,xw*.10\y_xpaT€2ؽ#,"@|͢`ڳv&"LXQc+Q- AMd_|r;-DA,QUnri%S$ևc -ٌ[Wx`Q%z5!a<_lS))O|5;ig5զ>֒hn"RKbj/dt -2h9oRf=yv!섾m0FWU;I|ƅ!70oASaEV!6]5 볷`JJH1uP\}E3nꍻbn7m]A"%7ҥ 뢬txT*^lN ,Q u -hI` -cBwlWz{Z78J*,a|Z]bX,*W2[PE(BM8Dcq3 -ƮkPng"K Srx ua7UB sfoH&(0n|q^GPS:ڊ@i}1a3Ҁ"-ܙ. -s1,X<]%d{{ >TzK?ڛ؂ma%x]Bv~ O*i FťjsFu V~?Hr%@*֑\4d[fьsBfijV]r eW eE/kKDY ߨIR.>x;-RYQqLX͢V$? -&.:'T3,pK)z't\9^\ubT-'wsW:`k /p9fG31)f4UnS2%Mfn6ii!nY?Q+QʗD̴OSBW/)[@/)8ZQcLFx - -,eC9ob$~6{b˗|1(qr?rU3RJq5ƁIk]p3\P3x -= wl>^%DOpQx\:7 -v 9a꽚 f#X_ %JT/D"&-PJM]et+eov#kA&tv#ՉTܨj:p;Fv<ЄA< HOZ 2}V4ǫR˨,Yjꢖ.Nl= :|p7/A Gfaun8\b6%`KeVJ{OLN-,\*Vzx<1YܷQ<2 - J+<%fs/{2/W3l.>9W=0K\ɻr<_6_K-7qb[qWRޡMpAH9LԳy|8\-RR?ZYE]e&?ZW%{~ߐzxXI&DŏcWMA*#cSќ;'_^)ׂKUK]JnV.7f|ķn+Y<:,${@N̠<8xmT=sz U(񁚈m(J˹|^!, b^jU*TJjd0JF"qUަXbeuydYN3ey'3x _;O Bo,ś%_j7r~,Lw/A+\WkpWdmP -R`[_HeT6苹^Y@3>-N.NR:qQd@k$[+ƱD)XKT.R4k^fa)L^5늄5Rۋ,R?\75pPġ 3d3_C/r[.T.u3<? \rA|3URuDwR/bb* W(;V$rOSX`V:-3]ŘJZjj3J-K6TPt⣗~HJT6$5vQ=mk4xx欕2ahPIKW]P-!dݥ)ٻu*cܵz| NW-;tU;BqN9 ,rGLĬl% -AIhnuO>m.tZQg0SP*[5 34+6@iV ?Z`ӯ4=\J7\Qu\R/re*̡Ր*si6K4@(gF-fm+/) aHʗC <2<"+Frnp%]9q.}.($v! *Ab\6Y.f07r3*c:qe%*Ձk|-<*T.u0K UpbjW"5.xYIr8Iu #-/jb2*phJjMl'~N?EVjc4ԠFBq=,nO -:YC-Yc+ܼW5|Oa. &TJRj+ij2E"OGR^× >,́VV{$#gw)JԸGwKu-w m JW*%gL%lj2E\9Ի+jnu.\UFWKR_Ǯ^,prC?qRwoR.kK4cң -K,cW==̷]KG5*#j# E1 ?\-#}Kyc5lB[ k#nxz6%gZBX 9 _og0F*Z\ - mC\z<1j[0/&OZ %D5ρb"ܫC!.Ae(Srd%jjRagܹl (]`fgհΈ-m.#;UΣmA%\.ҵ]3Wu+z%Nd3 Al]^\+&x1oz @h#KQsO%t@^t)7ZF3Qj.ImAm Qn_4*" -Ff eAZ.fT%YR 7AT*DqЁ\[pPu\> DE c n6⁧M\%m?{<F ZKAxe@yM@ftgU!/ˇM@7R,VCLj|:8q<{ES0NDžmʍ1RcҸ(\*) F5:#dԶKQ.TeL< oDc.W -_Ij]j>_@݄7X 'ؗGp>f01GENbֱa.YrAad6cXR.:IJK 9a-2bkr-HfUK Ρ+RC+SPexyQ$ -O4]͹VX7>bZ n䒠PǻDu_x[=*r~\o0ӷѹXef0wǹ/F&Ƅ!2>(6To%])@Ɩ{EUxW-x3Az̢.Ošz.7b5}FñƊp,FQ&v= ,2֥ԺQDzkܺB.̹/1sԮCMx+JfqEa[*J _g*0j5so~7LuÃTw.\%'+%eYme. M<JDڻf^L8ֽ1Jhp+ܧ7 17j?-hZXg<#5Ue5[3/pV\O3C@[hPc[LB*3/VxD xb\s01 .xE\ "|8U+U:ydIL4ޭ?^ ӎvjs QKzE:ij5Z(Qǝ M%4A pW4H*HKcMQsl Fca5#.Z0[pA$~?p]Jq6wWOܰܵoU>e4\ZǏ7'eV&`T1 pxb_4uQⷘ٨_qV-EG^Ί $.rNyNpQ15d܃ !plпlڨiz!W  u%S01noãڬT+/, osGň,=5GEYtjE`T`˾.Zb71Re*d9 -x]jznR1S 76%@U\ &OuZ -"MqܰwjŷIOv?'-}ͳQ|^ic_ea}njG!d7L#W\W|\xqkܸq3ImTn+ph0&3 Dsr8ze,U9h`ZMʁ1|++#*[W k|^++/0(sKSd`Q.]w7\6ԥngw3] -Kc5@aJnU5K%d5qY&nVp047Cs7\a(Γ05Sl&j:T_#<2P) 猪LDjmwFRFP+=:)Gjk >Z b#l{q3*'%=3'D6\cG,%x"[Q=_`Gh[(4ՐR#jP˨T-@*u JMRˆqs< θ!ۈ ʝWje#i.X(-;Y{OF5)u -xHDnZ%|1+zπ5F񎫈^j0D̹o&7d9@cڢ?Ok?lk4oLrm}X}NEғ73@1b*&+dWHnKfͱKWc/Tj|DԹM˛n EMt cmTdZE{ ({Н-d0s*c`?I1k3leZ7*#"ϲn]㛙K-M̃2j+ƂTeIҦw4-.`̧Pc1R;C<wXPzY{p(Lj0Tn6-|lĥ/엊u +!5Թ R]FTq#[┮%|Tt/7* C5wk<E<͟ܔ|;f( -<<߭4_?ŰUzc5ejbkpUZC::-KkCV'!P% -5Nn^"*ZvV`Q06\s *K=MzE#P%n\%eAeƨ~\?!`)Y|j,iK&k0}V% ?Ƿhҏ@faNa,u<Ϲk䗾-.i!*2MBE Yfn-B A[%qJ8WMB7 wMOpQYL-`<(M)e_4KF<~jQbr^M;. QGpZi*W4[H!qߘM{<6w)J'l -k31?T9OSXKXv> -`\ay|}"CqJ=ڵE󚎠$2wcKr8;n R\L^'fe b.Dj*4d*ťjJS 51Xpx8JFU0ػ9boDq!؁8-K|z>zO{? *46QL|5'B#_G҈LzTyviELP 3Tqx;*`%pUB< і&81d&x]}˙vc-{yeVjRxi oRa_˽MqP7 ϞUU|O pM$"%,w0#nRѿLY宫JZeZ"'evoq[5o -(?e0I?u?⹻/jw1 e}zՊᄳ3[{#N|%k8EW ^ls8$v E,rhD" /gsXZe˦8`M~d#Md_dE -̥H-͌45(#_YT O Uw)Hܖ4<&j0/4JG9~nZdAS :_ tt.brW)e<4NQyhRVag {ķdZ25S)_)TRpkb@mvʏ@J`Y"rRJ` ^]Jxh'P7 -EZT?3A N4I&JTItMkQ/4 FGjWQ`ywJ P+TRŌ -U; ŎP%&9"%.,HԹ|%T@fi*W5̦!R%-nfBWCKkoUXj]4_4 VSPQiAA-)3 G'% +b1Yvߩeq4|M˧\+Ժ0mJik],,=vXbCImD%dCbM@UpbM1~z3t`ŭXP_7 [갦s6e2Yxs9 (yh.TGFyZU+Wqh ͭz!ܪL6VA;6]tTѴ)p~q&}JzJ'2B -pU<_Pd~@Ot҅hPlMKhɶ?42೥P8Eo ۆ#錨df[fg\S)(D2NTq4ykLe=CU*b4!}C,JTqP!BĉnCl!G*6AԹ3$wrJ%Fh*QP-4WDu*b bUh&Gx,)ʫgO";OE4՜]5Q_jL3]jbJY3"հ,$ -:'~Ij+X!SI?F/>ʕk{K;V4aL\NYWQKS,[wʌ@ UD:xʮ -6`vncRQfԩAc1X, f;4SF}O>,[u\GQ74SMc̼:4l 7Mģ7RwaV9x\'c^JJn;,eT7)Y6Q_27p%KGԾ+0H\RyjfFLظ&w!+c6YX<7cVҥ@[uoTAQpIKYL8RԶ3p *R4S<-b-sq95bRu;eu—c]10$t`Q17!RO|<ьܪJ8n*00 :mexCbL!kF`o">4TAu *bYQ`md.sv%ŇuO4?W&-_0%KF=A+0+j_q 7|Qn>b8L"˗ nJDa[(RsSatL s(]Į -B94~&9AYp.47Jˌ&R+&*Pf5v2ڧrF5\;RȔqK3տ0ן?\ܹ9y)Ha> *{_ ?J  1nl/0nʥk5x0TM9ܴ^c$aQlϦ,h=$nYaYRjLJ1T1?=$}5[:l $(™D&" Mkd1KM%@n(qT0:`@-YrBt@:`VV_W0GpRiV`SO*vR`%Q>ώ +LĤVE -Ŏ]T[|ʐ1`݃Yf'dQ -)7+uUUMN{̡!.V!v45bd=NJn53%* =\V@lz?s|0FU5*SR]WREc,9Z)R HtK<0r/=o+N/rsѶ?L Exb2 }`x֡ZV c0 3u /r|x~eQM2T) D}qFf.fgpZL>c|6.Cg1r,sωkWҧXc-Rme -7H0 -YR#ԁA\(n$*홾 d~cah0K,Deo1b!-afe˾kqo,g0G>1㺄~eJa(IX!Q J˚epj[ ,B5tᆷ?N".5JL@}A YQQGuo gDbCVMv8R©cb/O`կdk:%w $ 1u IjpbW|#{*uP' !Q.])5^ϼBj.,kGHIlD[wk*gU@΢D -IC: E^Nf#L}6\@ -ƕ - ÉjKu_\JL|Q._.iˎ CCДS \'\2.^8U LCYt3+xg_lbqQU|4Ker+eNgKxNz8O+?dV3~$C>', .Na~]JTqɥk RΦ+p`bT˨pKԨC Szc+r%)]RJ z.ꤨcU}]"A1UTʼ0O?E{rDYrp0E`+fR|CGmctQ\b[^vf6k1:MuIk4*lji`Aݠ,4%Q &jAX+u'Ln`ql51ԡe ~կ1%J:Y`g~h쫶H -mJeLB%%f!XXA-  l,!Qf# -33e]ſuLc:AxK/(eTbsM%<,g\|̌_S3Dع dU|c&33G@nt.HC?@=$Hp|J⛋\fj\ -Y|BȐ*4 W[c5[錆]o|ぷ3(=fSFj^ :^A]0s11P."Bt1}'.+|NG:iVQ[M]ntqPa3 }G YaU*T0AӬw3nس n=;Gf,Uu ecY!SiRyd'@;L؋X{pSc(C^ ή&c|/抆^% ڰ3;!{.iW0@biu:5)| pÚ|ws5hTn f2fPB*] -?(%G LZ -w Pfzi-#|i5 *1%s`w%DŲFa%l:jV֣Y\@;EOmGFR(AD?3T+e?<u ֥2K5S -ێ;%Չ) ]i~h1bP[X)l,?]^W w<ї 2.T߉jL l.ԺTbD7VJD%6maVT0[E[\YN_ RP_ZgV Pҩno -R$[$#׀2ж$=~Ǘ95u:H!xc\荃ssrB}1p,SEpw4gJL/ʼn!i Kfop^⎥W0٩r*Ww;E. L%{#1HR*YS, ,LT'BzbQuMXJB⢡rDpO*v@\ g XA-yvJË'a2n -NYt #MW|[=o앑Y+[j:ezJLouB+bkRKơʹI c`i]oqFanhZaܳ-G -4Fkuǻtݖ_e\M.|Z‘_Lq1 P 2&| ܨzs\1.˃R \Rul]%B|d:~jz"*+2 -h0pj7(q)Ee˕,8#lo HC]t嵌)QD y -|RHF"KֺS}|]iRV(ZJNrTpBL1RQxRP8c~0qu5aTnSN,&5#kbJ>cR3b*xf7;D1k: h"<x 8|HҞ0Tvg"kM@hީ|pr!|.sP@qrrB_ -P=Ibڂl,F> ++QIgD{IDd׋'{K'.U6If -7kBT"̰R%ʩf#'i3x.UQC\[-\E*$oDx(z;@Gm_~r`0W`1m/RtK%lŪ(_X5cAC?}m}d"*ܩ?7K-K8U?iv$m L*J X%joqrNy^ zUNg[d-(Ǻ7eTYB[%y)E mu›jt2׈ʉRY0n'B+ FW7԰1>R -0c刘,xc3R%w1a *JƦ.\\G3Q-95+ĉX*2ڗP1n -ee%R 2׉HV!_Nvz&1y!`Xѕu..t "k1uW.JcUq!-`.0rK-pq.p(s.^&X|330%f*,A0g̻Rbw4qW,VV^(eA5}5\hb L=S!_b}?iwIs[.C_pM͌ ?#/-A}K7rx⸨/]B08bbTTfzUoCB!?*J+ `*2Y/ Qf* 4:Řd_bcyDk]imɯ,n?d.eZ),DѥoLg!ڄ:nUՖ{? YjZ|n֘03G ]Py)sA,3OT{**#,xfXL57 cڗN]2r+M -!}2*s[r!kf%YPTht\q7>cJzXfr\'S*RZKJYd 6K9*fciN9)Z\IA~_<&}:bB1u e̶8 VeƢJ(%y>pe(_ -R`(Y_wUb_ Ae-{OG߇M, -v{ 1=D_F ?!A({*LNϨd`Ԧ0¸ILEڭKr,O{\:DsS4ıKwIC Z:%5>+1]nkeChJ8Lԫ%ԸQ1,G T"ٱ: +ƅqY:iV>BF? -5 -^6ۥ"T72\YP^5: Tū"hdlz#_ʎc!. TJy'D-SH(E8*nR!82uI*;W51FeTa- -RW)!=U!M~b*5.)["trGr1(n7Rx".&Qr7A YH%xKV Ţ%[@ eF$Oq sˆV!) IOBdeSdaLj2fernffdwܶDO>}Z!;.CWgR8,MY #aگ䒎wE\۽\Pڱ@%ǪKR\TjiR w4*+T\ n)zyF::tARUKB[Z)ĝ}f?yFWDx[]!"N%KӸ5KN_q)ʍ$SHlW4V!.ZiGz./p-73 g2!60co+.384x&NIJ-J3BCQ) 7 5LZs+pT9&ng*z>&D4"Yb l"B\M>/AI2J.# 7(D=ƗQ!FXY6Wyry -/T,3)*"@ke|&,tb D -7|[&A$d@CT~&e TW7ʊJQlGEYjecRoJ2EbR7rDγ ܫc̦]A,=%M@1ɟCRRvSLÜXhôLv+%*YsH?[;WUL|3ՖmbR#fBgfDyNNЪ) Y ha>ڥh*ˇ̵n eWn6TQe ˉxqcO? xgw -TrS,39ܜ\vK|8NB@xkxs %;6=B  FAAyfyNqO0ޥ x0%p[O#9v]ϹnX:Uʈ7>cu.UaYT.\L3N o"K7ࢯv񤇿oO8~?,B{D$"o;'w(@cja&bzan -3ac כga3h;W/-RQ~έl"L!mb{_ؗ5\\+? *9ST 7qwLI3Oy{(E~;b@C^R:"0Bu^d #0c"DF֪.{Y9Txqrksz-1#x%BzpBc|_NjT@^Dc_jR1%4&1Dxfg,K0JJc:wrȳT p)qܷ_.A ;]L\eNf&%L-2Y/c~,f DTi \;fɊJr93w5ms$m%ʍܱ)ݕxA8n\,WlJ%_+~]sDBfrL3ᛃrK%8I`EK=.WAvĪZa~HUJR'Uu48,QΦg(j*: -. -55X9%10$3LFnj>n&ef|hw0\!fYnP y jˮ~JCs*%1azUP*4IJ+x:I~.% 9-s:Pn_L.[D@VC8%Eɕ\TPq+${Y( |C*ɁP6#.GOI<S:ӏ(y;H$G`G TPR]C,.㰷ͤYєyHoYu|@p`$)3*T}pGTD#l?i-"c۔}u߂dբF9v|*Tg`Dw G#SS\_qKF, i4,,&U[(@ˉKn;+5t^R98"s+ITψB\li\腬$0e~͖` \ķPw{ #-{LE]Fc m]:Rĵ{z*LUų fn[mq72b7c q_P_ALIMC4֣a pN}w9u a,Lʙ2L? .8cL6*dc5_zb [G+%L|x\9kS -LBvFK_YAS//e b0"|1|ḾgE zW)B< ^:JL:6\ {Ԣ?]MK@ /jMKfi*Tpp%R8jRD.Vd2ti4P[/X"*f-i#xՆ FZ"[ٯH?ӁRA7Qn)` ]mcUJ]ctH^1SB2m/ΊR1zK#Ar |51-.c#B0C'eoܢ!+1q>ef)/#:aL_%GDKQ3+FK%1E`/'5/Ml+1)6-j,\* -.͜PX@LQ0`!ƉW*+eWNNHULjl'pa730j0lF|g74@X`C(QpTG|Nj_R,1]Ĉ-Fe}@(Zc2n -ҝzÆohLPl>/hFz *xj8s93o|X%@i/sSd꽞ZZW -pS1.Nn14R2. BW!y_rƯQ6B-qbn[Ds2|q=R:!ㄊ@~,"e-eZ't7*8BA62gw%`UU Jßފ)@}44kB_.3Da*֥WQx$u;epYoYvb(u2iu^zpό\BQFqf '3Tz7c% 4A>`&P;D`:%Qٯ`GZ-3~"QnhpC -/0xb<'FN31>)EnjLè1:# &buy&+rLk!6>' eb\#e5Y. 3^k,3΂DJj [u|eQ>]C?ũ>ɨuP JD}wi{p~ %K4%/Dd8;⊔eQJ|,)X}DN%3rϸqɨ,٘b\0".+%||KQ2j [q_PHUd抝}eaJYrᚇ4a2pG7U&u2TEnUjTԹW..T7uu -4'p ^_peล,^SRR7R2L&jXKa-@bT? -%~gl&.So0GEmZ`c:T-&%L!>I/bƥ e"<-wXrsHvv+ 7[g~KP^R Dz=al=<ꗫ@ޕmZ^/ؙ 碈J Eý%9WҔz%9j~]ܿd~ B`V#$i3dG-*0^|VX7AyȖq- BXqZQFV:4)!TqRJ5 TFڪ*@* lW97-;SMiv$3e=E@YAv#)QY ;1Uc4JPI]fff^pǸa.lX⣆mFѪRpZY,2Ҍsy^ᙫ\L_'Jr2RTⅲD)rep^*oXKIJt%^-Ƹ-9VbLR%>'pvJ8MbԵ2[R|W jf*Ì7*(+\ùC *  T]b_r]Y2Vx&O eQP)vʣ{Z u-Lʽ*5* .s) BùખfPN,0R[ZĴax.j:fbTSvK/r`13WTYNf8Gr=^%T1 -:+TSEB&Kj9᪂.n+5DOʭ)ʇ7ze\c)QJ:벵/3+*z*/| աk`@% [^NOH0SYcO˚7 E3q1|xowM; jap1b&#}pj3-q"ֱ27-. pg t-ʌ8UጤdWq⚁7PQVND6AcIX Oe!2K@D 4(sST8Ծ \3 nUp*o]p)xa2JW\ Gpa?bp - BdSF8>+.f%FS -& ԯ.: c>` -̷ZRXhM/#]F.=˖L[R±KDˬ%5+17 s,]O! -`n`ВB|Ϲj/Se O,]%!.-IBi46Vm׉!nP~aiҭU~ :+yQT8/?x[AJ|E,@R!'ê!Mc9k\f뮀X_ (?n+ݢPXGW)ө[#&: %(Gܟ 冱.eELamұ;5f>ئA:ѣ#^ cKP|nkgF=ņJX &KuqE~tM5U A` tK={g ),†;=.euXĊ5.یfdPܲx ->~Zœ^Rշ=d>iH S-^YJWxEZ8 -g˰ES\WԩRʶBiYn6)9gfQv -J$Zv0]hnlȂ .TZ.OaTy2Ʈ'g.9H E z8ڬLǖ7Ș޹na6c}L38x*5.gLIfQkD '2eMuA#\;AuUlZ཭ER-E( |*Unf.-JYMg8{2)ap)l9%o. Q[ ~F2F)jA#QZ>Qa@PfԼ؇`Y(,, >;@EM=4lҪY{ܻC>}-V-bjoCS -qWtćΆQo.g[Xy#\TDU,16@Vë[d6k 3D0ނ"bNP\YCMe t:~"[k%!CtE]&> 0?ZbX)&4*+6>.bmbQI|fbـ[E{DQ;ʑZJ%2c -7>1ܿ1$1#q K)v -OܨFK|<QxyKZLSR+EǚU* p85*&85ԬMbkwRFPG - -A$/JcjyP, Bwpi\%RۋMhcgYf+3st&op+Y h/BU|Ei -*]:RAP .nv=.^tWl,(UBкJxe#d⃸b_@ ~gbf;Y1aɒ\fUKPA^.6xyaM1&lTwSցPmHc+-YOV]|9K{f*|tş -0sV~$etoFڟ)t˃mrcWjޯ'EsxݐeNÏњ߈gy+W0%= kvu+e,BrqpWp_ %ʾ,DxYp]0s@7{WTFQ(kͺ|;z}z[~Bئn~xҬ\ݞ&a$GeLcw)#Si܅mЦ5/9$ -_$ cx4 t؊:Nڹl%,RjUJW=\g&jA[FT2KGlcn45S]D%bTE]TНˊpANۛG\\T_|YPQ+~ -?ϾX]fcjQ[2LBSMJRGL)ڗ-c FPUszȞ fw,'! 0ɬԮnW=@*OHiA"B[6By^p7)%K`ܹDpAqxᐖ щ`)W:|}@AR|^u*Y,D7l#'2#]2RFرR20KX`AM:-I22xx%.xY%AhV=1qZ3 -%;D G -_K",PGѕZ),qFP^8`箼2KIi(&nRWI3Qǜ~EPK xx%u0}͢"ɌĶ c \u 닩~r؏L-U8tKa:8+r$ou1(tK(jQW.[?V?0;\;A"M*0>ؒB\w}q1~0(_\xTw;z0$ -)!DkFLqp8cuI,]CAqpd⟫ŗ^ :=N% o|1r ڭvQ @Go<@(x`uN%\d!x_x+?"C8^jgq3 -;_1xL-Rc`}}IS>s.+`{w,[X=ɶy=]C*>`0n -]kTL~pd5M˕4("PrMlT8~ NcVnikxY{9hQ~u,/=W]PQgkYu+Wmwtyy&* .= -/䍒d\*Z`Q[eyKV!>[ܜ [fxqU\x.>YoKX{RW R]. ꑻ%x&xxu+D-xq5:*4KQn >Z%<ʍ!E JSH>UjU\!\.}~ X奪[/ %e91sit\JZTḕ23wR]֥ # -pd%GK:ܯK9ݬL拔T2,Ы˸ TDkK5ܵ8iQ,ĭ1>q~GY)Ttas6 2ڱ4b 7>Hv`aⵈͷz[Eg:FVi.H1dKL^|AM˧Գr˰(n3*c*[o?3;fj*Z d)>8dZBD_B3gUUL a.<\_l? ʹ a֘9 ,q[ -0/~bȞ菬} 16XdTgVp^Ky Vng$]G: 9a`X*Q(? - #@DVL3e,"ھ&EQ@Oj74JPRV^Wslf!9cІW,"!Nk,q -x6E(S}rCPx,&eYzZ'\E)Ɏ/A|/7D[8-$uV7G3Ny`S6+EXś7y$D{Ȕiq uGRXsP~gP^@T0PD-; - qGai)MGPH'6j\XTRT7v։v^"J&o3/v0ҺA]+ .`JMG%È1 l,a]] @Q+)ʰPc2g-yP#٥T/5v IAX͘&&.U(L1*&\_Vr!.h##W!THohZ~cF -?C1+n?Vw+c&-$k$ɫ-r![YVX%x%}J:R׈IXAW6ٙAt Il[oV -0t<b /vca^Z rB%-#$qoļE >FnPEtlHVN(PZDB݄\+.θ -J(+T@ EZXXػl PAt`[n`F.koM%]Cs̹+}tKl˳T;F.z``sܼ$2طܯPj ISmjWpjJo?rӑ,!}0Ix[NUUY U2iZlF4χbZa̯=a,~!7yɴ5>t%;.ѝ%֟K2h^sAՌuD $n^!Q C+c脑RcYJF܊u;' S2Uuw~P0tK% ^Dg yiUGxYRTsS3)Wz":up/̑STʈYiu3|X.& N'1D^)&g蔥~\()jM b 'l_"X>҆!:-GmAQjs:Q5q;GW+TE"vn_\Kjj]ƹ# nok >Km1C>jIxȢqkEi -(So 7qp._攕fW ׍ ;3P)]Yi[\ %>e# -%D"͢u t& YiZчPF5UL 3Yc}]Þ.}`84^eԣV!TL*Ti-JMG}_ gQr.RgqZQ%=.ܖ*Usnȏc+'qj +4(d f+c1EȁnFQ2VW 2D?1\b% -KW4cP4b/%(Uo)[].X{gU}e|cA%»tlՌCIg[-˶DPlu-6]8xLJ9/;ctң°=Pd]{KD0m˸#@xkJrJ㎣r-c3,'eإV)Ԭo5a)cyS_ʌ|ʢvX MJtǻʸ=ŷ._!`VD|+eJKuYƒsm Sg_0"Ŵ3P+5_|^BVg`TxGd9P%'@7*cO ֧cNS-~ݪH!^.L| -"30TƄLZyeq/a?2-xz Q7S^mr\\c|{Ga#4*#۶?B" {lK'f1CQ2';gi*[S%w /vMBSorP-ꪑ iX#ďLlt )wp -,Vcvq< (fb2qK=y?O &doJ( - {0 -QZv O%;Эimܯ3fCHW+(1|n 0B\2B!3qJ)YIXYFj#)!&l1pY -pb]i -3kY - 7EF~bT幩q&<Ƴ%_ V+Ÿ3Mʣ WVcH3L=R@Š N@Q;@E6B"VBK^ j{R./ ȯLu>gR_l%*'"4 -Z~P'ʛkyY |nk&#U.u τr2B2bw5olDas8~`6\_nZAʮĉPs_;eÌ.W%}`Y~bpJ.cA-BNR˒ lH8y%FZ2Bܡ2?Ă,P(\ ef Cݟ#4_!Ъ*Y<2OueT}YOL[#vJKk+M ]*VA"r0IfMͅegGIyl3 *d @nUtk,N%^:Z C^uܭ7:aËm nL ,pj eL~}຋}0x>_T$ZqY|d#tθequ֭QZDΒY_H,尘ƸIU.)=/I|jH ߶F`N}k$qWQQ~{\+rU.'˯K>EE2zŎ\ 7^ -8t8BXrYkmY/});fC35 BNBּLK%ō1 ez$R1qRGi*b*l o0y!Gjʱ]mNg"HR cZ=o0 `1mYZwaGe2 0,GYۈ_ŋ늆`-QS텈JETd&)$ծϿ1 -I3SpT +1<8aHg 'ۅ8P7Z%8[K9mD!'epYZf[o!RvHI6x升IAj,/?[o!]ǃ@Ɇҩxr2f\簀%' (Ұu` ]nX@*8.ѯ`KD6j>Ox(]W=pa2:S &XآtK]H`n`wTC*K'Wg}`#QmsI.[1Oqu-7xs+hX$9οYhؿ\T v33F]Ԕ E`T}Zs7Lf!` -E2J)ālPrD eRp5*=ԭ(ۈ#NqP>5;pԸG#<|/̬1ƿf<ܾ{9l.;a8.`X^ȃ]Γ~FpSV  |ތRhX1ܨm.WRylBFnt?3ܗ\+w+a:}bJؔ,K=@ -o-r\SB_|~VtzY `Sϙb[,JFw%*"15XZ=v.9`\W}ͶemoFNߘ?U]DUć3ݟ1 2ThJmذҜNB$VEl~j߸&_qƸMAB%tOvlV]r$ܲ3%)<~ɺﶌ¬ryc'Y{/Bb\nPcKy"bRTkգ#7*wr1QmX̾߇)e@WJ[w.؜%+iXS D,E\zm]q|3IO^KgH+*4.?Eo "G $* )P*gxf t4\-p/d[urc#TVK=+6LoT%,3hifEf*/i w}6}s0m1] `\h*ޡ,EjeRWR(WC~_Whx ^ A#y\ % ,_\Թ[x ؜^tĥ#u-LLw.G^Dm[]VDh4RT.PsxTx*e pG5esd,3.R(itk`MY%?)%K[+yTi~% -[YH+?ղ.2ı.< K4FBS-Snn#ΏbVxʓ`qh PzYK̹XzgDc\*`Bwʚh 񢶕׺{W @eMA(xhP-+"*bF@n+?ҪKHuȔ- fUQ76d&sJ~i ǖ -MO Q]*6#Ya{-JY04^S6ӖNhXOzimBYg?W:CLyxab̔fVqW:l%fgWC-¼1xbyǿʎrmH{u2Y h:qkl[ #_sĹle|0Rȝ$=* F< ץ$i811p1n=%Ft!|6m,FU7>ܧYw -#ѣJ`* (&cR( ٿ]4-<+Ikٽa1ia'r8rU`Lo|J;0J!}Cݼij-a*]$ƅa߉s/ .5E|3PAeeΡ bDyZĩ, mkŨ_? ?XCS -?OۯJQ8rV -Veþn*]*[Ҍ*zDNyJӺ|0aƩPeUA|,|ycB`Eڛ7*0u۱OxE9%9fao<Fj;)EH jھYft@2)0 y>c*0q)gܚkWv^9? r]j#l(zj_,Z0X];".(v{D!Ew`iF4J ~!Q۪EʏAʊL*uO@'}|hvqXN #cd1"[hԍ]q6<'io1YBKqXoH/H7t $uM2En0 TDl wm`*/a 6KaCx/0^*+v*M*U[lP[]JH>%cDBtb_ы=e?Jg]C_wQ1 pHZ6c(e o,qA.k0 FeL8Z_MEvz~,lK,/Q`FBoۢa]T0oj)<[猟E??ْ@ةlN_Ò%wB4xa^~bϘs-~+)|8,ࢊD__1^Kb?xD6gC@MW! Ml̄?^`d?ѹ/4%59qbCV&uK qu?)*!0rbP/d] 0CL [9j"OS=`uF;V,qOxg~,a)vCK%Aa5/ p¦Oa͕PCoqN `)IΥa/1Iyb65ܲCUJL hZ[;;3|Rq<7.5*}A|uvǵK4Bq>'rR  yUb£)@e?-cx|ϩbRR|{}ƻWt`t* <<\sUpW@mwB[.:q, qM뀭UhªEVUeķ̶7eܾ%Ku=р6e8R&( e \6?ѵ*G d[h%xk_-Tp{'ѕeGǍ1*#a|N) ~ddoe*(ӎۘGU*<+ |QP,Z1[Um*KXQB0ݥ] `UW9 T!b,HJ2 5W.m5G\#eܺq,--4)UB6W]4CG;FtJk{VxVܨlx.٩rXIC n;+ݧj>ʼPwB TU'R&:0; oRONK, *ѳ;թ[HdlUI[WO%_5/1em7ԼFʘé{j){NbB~.deLsqISj' T)BX,M9ڷ&Xr۟MYŠñBC0ef1_{0ҹykuvYٕ+*]{׎_`)q=bv߹ в()诂0o%>CR4L]W,y?] ShbM8nSy|$_ k2dv=K{䩉zVXF&ֵʁ6rb @Tّl}zlḛ#/5(T1 Vg` pZ#%hV`i 97iS(3);gCײ|e$U B(gh9H|_rq0ZZX8g4 -@GFF8_,\PVw -F+odŪmV'sGa 0~gj ߁Sᙨ3OF˕0ԸG/)VHؑ[r5Ҍ}|qR;F7*  -r,~bs~k^nۘ% ]FɛZxi)Yp\*j-裣NJmYKkg蟸$>hJ|+*0Y\g-SUc%z"^uK%Ħ2]`k1GۿM@.nKX֣hQ"P*H!CIڍD)plư! K['nSNM㤺ߐHF{!}Ii/b +Sa(Fĉ.>fe$2e< KQ=˾Voň"T%SzP0NGz-h/eټ*h{\&K*L-Glrp6U/*5[Uu j%B6~f_Ԇj[w <t2Rh(*הSEHϖ^|C3*=,AX#"1` u ĊBn0 -䩖*,5͝Cc>窩!̤/WWf]WEJy%.yYу,9&4|.P"׌ -"vBW&2DQul6Y8 mqQ,@ʘ%˗nQ*̧_ wPicLٝuFgl;.O\fU1zIY_F6Y0 -`r --ʴL2ri`5,%"Q4P%ݗ@ Y:˩ad 2 -@iwT ..= [0kiN"E gZ0% lli-_͡x!Jx 8Tz5N,K"[]61nRcVT[ij^x%%)~jSpo,U\\>Ta|mGE@/@5#:]M{hQH2tkԏ}VZl_Fl[fe LbEGRw`c`A߂e%*fcL8yƥ9.,Q - Q==XS6 - "[|vDn~TjtϲhiN*X&*- !4(?jG.vQUhh7:H*f]Ƶ>n8KeE -7r_q3c`YO2/x ]45MSWb$pwUv]=˺{;02mQ^Xk)M3kLWV 1OgnWVf{ -a2][*0e]@uh0Gsp -m:Z)kY'm*_ ]]v&ᘨqPy# hqa-Z -3]dBUlD1oqe‡E%޻c Vg4j}Y`F\,c5?g6<" n[ `aurjUBMm\0hEh%bWv>fMN; -RSd L<&n X=Vt}mO(gJb-j]5*z}N>e0 DvF^>xl5p\,QDGjqq -Dj찖Vs?̔uemi1юe)KAScŪLcHkB+;/qԩS$̷,LQzK]a[LA L}5F˼m_1[) Ʋ&q/.+˾Ya~.wI<ʜ@0 \CogRꏕp5zD֠+ғ-?-;@WE?,Mg}Ypj*_ܪ:R^5.]u$nZw n ( (lKD%WكطXs^&J=3lTJ7q上-fK/jϨyJ #M~nqJ\Γv/R|f"A;5i!Ɓ9#}Tß:*o,3x<ٰ!.,l:GTKBf&,"4CaWl3j\Y -ո?IkmQbLU,B0o@[P8J`6@-hHXWj>o,G+!Jâ R(dGJE?-{/KZ-Ro Hf^-5E\%9<ƳS7rE6 |Vas,x\"MiɈ-ͭˍQ~0$[t} LO#7qq"IWws[Rk".x)dĵ*Z˖T H.\HG@!ރ%@J`)Jz:e `o3@`_<]ؚp0<āZ< -e?)a2R< -V9nrAK;Gk I>\Cp%Y7ɛ*SZ T"˃n>NF* Gޠؑo'oD E(K8Wu+.3ԱG1[=YE^,0B,bp[+3G2襖Pj\2e)eTnxa:wȺ1?dgȄ}hng|*Q3?bN 7eGsqIWj#!xw;r Zpxj2)9⪙|*ڇ'Cj5\O%Pj @Kh5^ A'go] ;;U: -h>m&7Qb,< Uu{1{KVPqcЫF\'n-{[ >].3U|XMv/CΤr"C4 ͑bl/ab_mND?5K|Oy7 +,Ax{E[O&byKuX]Dzt21s^42XZ,J?:4(u>aڔNI7uB[_La`{L #_k}dP\1dq% Q31KܣvP0Euhnjy d)wԹG+J/fPfh B_!w:!]D\OR]+pܦ(+0.w0MJ!7Q(zu< Ճũe՘#1)͐fgR֋+GtyPZ+tq_,LJo!@Yg -/iꌡYTX}@E댶V̡鶟Gw ERSMۤI?A0[}j&oqg.w.(l+a4_r;,[j_. -8(MQZS_og%PJnT]Í熂e.UJYx%GCD09y˄] 2b$B Q s܈(wQV{G{7o}9f"h$ 2-_JJJnEL[(--V(|\#(W~&OLh}R+ wh? )) ɽC+ -F%[Uf"(yWW)t6k0jSA=Ku`AP5.-$ƪW5ψ ڪ%CjwDK88fSP`ÙEǢdvEMܸb ,rM| aݫHT?ŵ@ AY.d\VA1(M1/t0v"-]#싷%]Y" ƺu-Uh!$29Y_ҟ fPXYK.'1&&HZ9p~G W۫FR*P`&7Siw':y Stve`S9l¥(w*aosM̷\h qt o#--+ gx"))Ilk+LD2џ?˄8;Yu踩!xQs7T>^/4)nd.{ewIrvHKzWJՖJ= lOGkEj % .E2lITZv3*A R-m*f_T -|9I/<ƥ֢\\DCm-,3/}w3uE5OeC\N\Uf5qW@Bj$#: /4V(SYlTø5p nesph]IM,3Hld!vupJƺa p5-Z3H+ T3Z4wg;>Y;TC-i |(n=Jc`T(5bD#%N4vp`{_X5eBIz°*<9q5(z38LL5vm )Fx*xk,n;6&4">U~|0(Z -!ru4 m+-d337#zD!MDt 0hRr-RTTGXgxC5PF\8+T 6ۦԹpxgu FgLws21fAo-"֥NK7ܜ 1ʘP%9eBowLRjגedRzJ.!-@BwD~RW3Բ /P. 8|X6.PWU3zKwfaqrӺRz%7wf -W5 -)PF3J%5o'l^lyL- PW̚++CCaQt7wJ -7Zxu}J}\n&K'C}0*)nHzڮQى@I҄T|<>I_pBJ{-6j~A)b3oc 7+ > q)* |LebMQNQ X@Eƨ5.DLf@ʶruJ-8x[{$f2]}"j҄+Xfb/촽JZLڻa!:~uGyf-%"!Rּ({ILH -U#gBmf-z4K+C[64QCLe;!~`%BpL >)YvMڼ]Ҥ]N+o `2Ө?W3;C=, !KBٙph\ -KNZu`2.zbvpM -a"0}*2q$ -JƣUL>ͻY zQ`*U]F\%0[T`T/% _5잿,յStn.Gu;l6^_)W{"c_htESW[P.%TxA3 e`+\"M\ɶtS3q#vQB=*5Sp$UmbȼܪN/Bu5<5 -sLGfa}X*Pz1GUpf]ؽBqYG-\UJ3 -8OqL.ܯp`YE^X{/Q:F5UEd,I}N5 X b ]鵀Hc9JBP*Uk/6Z<BV3V @Mɖ)4xLg4~ށclFUs] ^mȔRϊ# D瞂L -ul#]le8ˆ T5?L(xɞ -eIJ -uP wYQe!6sQfxRpS$sh׋p ˳p~.Q̬ClW f.TOrlYU[&$xY{ -jRl'сL+@`] t#iQ"ѽ(!u2~25W_.Zw㺕-m*WQ& M{m#)]n +?p~MJ4Fv>x F|S+.Rv4]J\ZhjYB^$IeSB_Q[>o -Buzp5ꨲ|xD =Phgr+(;Σ~q*i䩥jKGFm&sE4O9Ƙ -2S<]zYH]’b"kUgN~=Q6Je [W>i[dv"\ ),-\ -QϹYK1xڰAx,0UPGXf!pQX0U - TŦXR{nfgoQ;0j\4Y).XJEaq]\J<[K/2Ug{4|DhWRʄc0foJ|1WKXH:YZFU?'Ke]^;ky cWcQc<-ĵqҧK^^Sg۞_x2 o?"XPO x&7yn=q\MAʫWB#"QK&_HUO8qsAik-qXh@bmhuKpWkR?#?%r 1qZ{6ϑLr/U>,=sKl)48U_s~&`iùLԫBh/H#Jϡ_lu]Q 5njXmXR^&lvԶR/-|18KvƐUDwrq02PKRԺ %{E22bfE.eScwGRߪk5U6j\Y.FXh?m穠Ś4Fzb -D%-E>4zuwD@`X-B] P":M ZjU K_^FKR[V^W,`UB c8ag~2izp~PJ2Mt+ڕ-O )۶w2(n06~-(~j:_F(|h5C[3P*EzU``g c7@;W%:S>a -4h{W?o54LD֥w -%;DžDuP;Ftab"]2QK]1IiݶesX 7l,"^(w*_uA.CۮZ@K28,ATc-@n\Ul[MJTc.0S|"TnaP5|p6C]f|:jiIK>IXw_ṋP2Zi]?=nb43R=?d>-Y4 OԃaO K&tOP'gXGNf}+LψKG8G2*RT-C*u)kJpruMB[HDFQE,do$-t%0j"qRU\JL%FƻVD]%꒔կl IB -1 > GIF}}MQu APXcM=;'nk~ -kЍ#&ӌ“>D; MJ6qo0.K{2̕#H3e?0%Fݤ< OV)l e4qRS˭Fϐރ`s? L@~\/ܻQ"PPZT. +)lgg"Зg.i}c47]lxT*ƥCZG ,^7\jtn"b4w"^͏H fRJ! -ͺڀ:HCS5nI@8 <ؠZB=U7MC}MX:Q LI@1'6z$2:5q:VĖ26h]pfoPO^-u d_USVS-6DDl[atTwPd^،q.qn=a\GS+$:29!T(|P.QCL0e_AƸ:g ,"Vu>IbRĭ3on>͔Cpj?G{1eH[[i<1^5DnD,i)LmUf5sqJ:P{Ck DSʵa님[R)a Et<3[ѨkmAXdPۺD^R/5V;ݰVmEcmNBZͭ G,1\lkdKz){"崽7 Q)-d*{:@Eg#d]T Lm8IRJ)+C̬ Xad}33eC}MTMQ[YǔR9w*T.\_$ʁ` -hc Tyq ]x'cyζa(*@lzZg*^v {Tv*'7ԊK4 UR+(ܸLIJ3W DZr2cFτcl -y_(GoIynezX[yqj(5uqy`Q-}4|"LoT /01 -ܿrȢb¯eDZG)@`!^@% ^LVZUe[UlliU!`G\Iw,,0K1{sJ |i)Tж5 *M% K^˞9,!+ - {k,!+3AlB9SGjkV]]\Z_0TpHĐlv -C -#.vY㠂AÐ 4d+,4Ae[< -7҉R$DDNĦz&%T5`"WP:X%ttuy2 -@)p:jQLqJ$. x1Oc_R*_I=ޅ5o([X<ES+ Ȼkn#8P*4GdP ~Zn0҂>F~-;s8"!X3Z2i!B;#iU*\ m -9.*nxB;2 [C2-J&%V iԹaG3Z -J[ Fl1p%⇹^%Jb\/3Kx`NRԮhkԥ?7j0v>I1ɤb_~m~ 1H?,b w\>0\d#c#zeTbs$%;!-$o(ȪF1)ef wRx'W,TDTT -ⒽCXm>Fmgn$~UK*8 4wCcxpTsek3QHYEA -@s(ٴ&[|hB-hI҉ͳ\P3BϒˍF {la f8jC/a[\OH}Irz;9?D3UD_e0s n_j0a 2ȵù\s9T)ӆB'1@~I䅕f#ٜAgr6оkRʰ>X|WglHԉ;bPXCB5ܲXRr;j.J6H[X7Gݪ;*.3GO] qV#, -] Ymc=p< G{ |*` VY]\g1n+ )- !fJE}v bJ <Ա{дV)Mp/~[H렕~ۄ3%h뎥7*卲P_x[g̍ ; )F(l"D -hr˕)Cc޽3P0 -cEc'>d$:(ry*I0T  rI wY^XH!ddn6\o^z ,oԩsulr_Gsb,Q#/m`j_Vu7E^&IEpaHVf/Y Y9w"2rRh$G7kˠWsb(Ct+YhrٸM׃ = nں)3HZI}$r^kYa醐 :͕nHbE2Fd*ҀWYFiJ"ݑS\X"fڗ~ % -É}尓VJ.Y*M[{|Y'[x3+qiVH3'o523E 1:4RZIMGːV: \@PRfSbtR4͐rܷukܠs_@."B_]j(pZ䌧r0H3\KRaѤi ] ]Eu-ԮQ(.ֽK\#\L% aO@Jq\-/5#@mAj-m -G8{mW@ sw{|Mp|0f oj/h2(L8jy"J+w1Y$-K]|c}k`gSHA{pVw*2QlF2Bb(v@QH*am-;%F=8Ysg -CfZsmtJNgaJ/Tj-MbaVĩ,$P@p2;jc]V\?_P̩q/Lhǟ5}K"+vFnC[51zBFKƁNš3R[MJɪJEl1D Rՙ |=޶}Eh n8ה2m yKj#j+u"t=٫ER\U07>!-!m[ksdh PMKp&&(u~Ir> 2b3Cf$PƵ n[EpG#n.xflm:/(yeq`Vd.T\yvtUf9i V`r8Z後_tw -# B_(VmLaY\~eTgUFK]P%E:9e~f/fڬ?QvTc4n-ʭœ}USU+-JUekVv^-!#96x-CV+Ļ3 tX;R7l f +$NL-Ʉ -=p0״|EB7p%vR*Wb_G}o\6 )r^ 3˚SmA5lcG} :f=+ظf;sHak -4͐WcXBSd#-ijy-'X$K66]? X}m^f%m}vҟ4lB댫}Sh,MډMi4:\KT7Et%I ,OQM6)RN޻KmȲRLJMX-Ԩ nQnh7e %@u*7nd7 -n rOM Y%k1W//ˍBL}ˊ}}D] v!sIr>YKwuB)n^6&"S5Rڸ)/ͳ(?:Qi_:E"7S~b8[ ӣh) IQ.))YFB\IirĔQ80/arIr*$|K4x%3^ԤE/JAX縲¨e87%\^F .3[.Y4_ᔔhyj,+QZ"E AHL+Rϐ C\LgFZiOs7C>GX'5:ͬ=e)A>Px"Ij.? ̾T:>yw- .*tv!idm q ݳwb0K2 sHgbЗi噍8y6]UD4VV"EˍG9ٸwPL;`ED`]jjXT=e}Ȣկl#)/OSVU{V\lf⛙Ŝ"UCvp*[[(nvwzvKn@h KtP )_ĕqLt[ADeokE$}"3`*\ Yb0"t?J[D~b,jpxHjkLG[!(X}AT7DO_0wfT&}B2VݦHP'/05B3 UnxtFFE`-X,e'k+զO3R?u+Yӛ=X(RV$ oq R Q Gjʀ!E%K?l#_2S 醺+3P)s>Cfyt~0/pF視_D=ۨ7yiu2 . sѕ9F`\e!nY;]*M[hïY"~+(N?0IT"kw 8^@ -ї!DVc9}*!~PUEiB 5)Ng{<7-v|USֈ4Y4 &P 7<2喁hH%kw8acfc ldZ]WuE;@%(d{9~Hm.vawHs|KIqo( ӵcFj٦_0CTɈGn/!v6zjQ<ԴVV0%}wݸOXcWU}EdekB -r&*u)Y@1+W g NBvsM'Vjʗ]K-T+YpDMe闡;U֡AD1 - +XD+A]1 U -4JURJ|i31SJMlZ~-&'^2ZwC/ z10Yg *zN8HJus54w7|ukuk?Q)¬R}il(w3ϲɺ㧋eܻf[*\vwP|+/DkҎsA/EHɥSIG&JH_[sփ+P4]WA-"J-]@1}ˉ5| WQ -qkB!oN")#1#xX[/̳S%/2%MI+kREVYR*,˸wưA3oi<̲LP2lsUyjw j7)1KB#5,:Ġ2A0~ Cg q0X -RH # jI+螠 * OKm`(\@tN…_Q~) -m~r0X )vQ̮Γ膬 >A-6 ffj-FbD.Rv-.^Ϣ/ -ڥ=T)E 5Xf!vXoU6ZbH̍G`Ke&Oh,KՃj$VP[4bZCpXb0L헬T[ʨ%#ܴCme{.ft1 K -Pw.P&S*1TTV-ogaF*b,>pԷOſ!"[ R!.h^XÛ|Z*1{He=(̿xp}jL^0Cx{l{"^=AfvaQKYd)w:JHʛHvrCdbOjj7g6~ GxAMD~`Dks-IVwxLE@KEﴓpHb:e=Y״flڑv<--QTX掾ScږaHƵ I0 -Uп2!D*À/TՑC)G0νYƣm BB:7;T5&!haH,?2l54_h07ln \JZx..Xu)2f^hqd bQ) % aw.#4kϭ7Q=ql3PUς .*VC6հU8H]IA[yE@cN!l#=^x>KBrPW 5_qt~>_jwiH!E0:l*lHqP%r$ VQeb2VY*U}Jn*xeQۃo=c;J{epRb$:"UQߩ֠-8bܨĕmN.JngY^eקDTPQP^TesL;koyaymFDSi]b c:3.B+7p/ -n.BE;q_$-2 R9#,v*-Gh}.[/j e<3ef1eYPUphsQUj+/Tw)ẗp<$!jp, M`;ig{'Y^0E1R֭=K (рpۣ%;OƊAdcMxc{zNW q[t\YE|p)~ԗ<} iUdoXڱqE >EtDe|+?R[t&쑭_\v3{;Wu ~$f}?RPPX (`m̲S5JbwJ>YP. 튂p>*!-!\j Ws& ) 04լ=Sp+OWjMD,RVX"Ez豖a?VAQ5)J~pWݷY ¶՛dn|B菬ЃHSV(;bd=Ф%!#zbdo --!MZ)HlkadfǞջj\1& -_&,mP2HB+A| nnXAA:(,4Ia~hZ;pgCG]w -ыrEj%8-pR`0c]ڰIGΐ_W9\ȵy^us&Q%JzTj.[ȷ Srv1ݲb-h% -jjAƼa Mԯk\^8gX86qC T$Eiw}Mj|Eiq/Qp6Ã4];t? A7 x^% -yKԬJ3 W-Ki/ w2*-# -kbgmkuI DsxR$0ͣ?JRR[ɩEʶ>L-(9IJ7]k`8>HgD_ҭpgkQi?X 'EԂy%+aK f~ En{#(HaaR$ZN}!,5HK *E)8)2JQ&"[:QEtMV_hnl@Y6JX}. T.ԺnTGDX("HH[xwdW&W ,D_#J6xÈբ`q9\24I!wѠbj.hU1C/?eW0_K1H]2S5aUElU*`DY+A`)K-UhёPOg X!(էZ51( R/ozgI؅5Zhu¦ g ~Vf`l镂ȝ-Y٨Dqwh6mB7w`U0Zti,ɧ}`B4MueR#:ω56B>$彨q4VdQfT"K̽e\H7tTLWԲQ*;%T Lp^ Ip̤c|+N4Uڭupsn\aKO n ނjq(;KmCScܨ[Hj 1 T%D @SخciޕU ^^x>%蹬vŨL\[/\d &kZI-8 <g<Xao-RUAKP?K19yہ+(o3;%áry_p%4Ŕ<jYUK9o~j6$e sTTLA:bdSsQQ,7M/"gBDԑȯoܟaX 7xO c-^-D=uP\qU:m7䉰ڞ[X<M0mR{˙L;E+gZ=B2|li~xQ(ݟM:cGH@R3R--;colqpkVOGĻɯnWnGH$!0PIkeC7[ɬ{wD^~P/ꆪE<;@ -MJ -&YG6%J9;ٍRHpˎfernkdY%N pb FfQP\k@6+Z=u"G\e7* mPSZ3ih;hޣV`B8u380ɟ3w ܵmV.ȦvBeg#.O hȒ ~tDԸz+sG+ɭ`@Uͤjg+'Do|pi&. -H utP[@PRd6|o -^% +J# rs829cQB*CJ1I29\a -_b VEq! -7,y ԾS9n%`i,ݑߞ72b֕-܆vh ^ψyP,nRTګӣd`KSHƱ0ę&f! ׷iov̕IMDe3| -GG»NaR֖QuWczkRe:E 1ҡDY?pNjw - m Q+77@+a srp^!!\3-cOu2*Tx))jU`r -/|ꐿww7}WJˇDCsWCK\[U_ +V[|DnEB K ]^]S\vp;Uaf0E$US\7J2+a,Cq~l͓#,)7q+z*]u 9&(#C -΢%3PUJ1W}_YF'E{ -Ju5*)bWCN3' X>Y$]'1_Hq+}y*˜Av *Y0kD. -Kj-?Əi A.U p`!1~5(Q%gC3S3V}0@*b.ǭE1.Yx̬J%pYII躌X|ItɌ|4n m(fc7XF\BU-:MWszR:1-ޠb""FßDT }BBc{NS; R -WAaX)x_#7q'uԣVz2ϒ !Bvl\LV, o0O}ﮯ }\fif;Ʌ]j>eY]9][h|\exaeQ+*z7bTśolX%J/y_w\_fW'bJP%wc09 f&DǼ?䡻NtUw[.tLe#XLmVƈ -PF۹JUpMxF -u}02(G4%#.a'7oMRX7Ae*[2 -WlE-B*RlǶb:wjD -QV m0qcõeCcWQ:!1ʸT_{K^"Y6@ }Qa -Gf"[f4+UT&5:%5Il -FCHXo5(3[c|Z.5dl`FЉŨlߘu|^'1- ^:PtCtj!(mkHg舆bVd[Us,6ҹK>Ƀ}af E/Q&f<|݆Vhf*Գ9cY% -lk{7)C1[ugb,Q+ jO wt5|q"uQwѨ0U §V& -w;eq @%N.>ĩRą-#+!aymr奀'ZWb#%?1Tsj/`MUj5*_@LkuZ 7(o} H@C0\{Z0+SG@,R WMj-HzߺRis/a#ȋ5Mv>ƅ"uShJ宙_s/kB\\qrܨ˖ECEQkCl -#0JL $34U1)xZ;+hX}cmᵘZfnYxHGYXÌrS9{P 0(n@v Ҡ} ݽX6̺f#՝Gk30FQ f!D]>||,l)xo=vEqw,&;"R\lN#UvVD^wvBluc:)Q0Hӏj*f4 )vPg.|O&4@i1Լٜ)bb<h%*궻nQ ̊nFcJR7Ӣ,xWn:@Y?L%RUZ~*lGaS~Fi#J֟wxQŽ ewƭK j#PG4)>VM O?chldmp'`.`{l:FA^_̽AYP̮Z?W :!^)|"q+ճGD#~lAx֍Ś/r]ƈ'zđs/@@n[*[F[vRC;B\htc}> s"ۤkDE-!TNJ\=RFU887&:x -Hg(Ԭ.dCQMA]BȻ8x -h$5.u?<a~ưe?T\$LŘF;R)2\%ks>ef~Lqs lV7f{dwDe[A(ap8j~*G>,`}V )Y[.&JYqBWC&?*n Ӹ|ąp_@.⑖bjXp1t䎅1:/K!7`ú+B{#Չ®IU pܺ -8n1^.STƮT)?.w?>$F=o{ɂڔPb?s5#7; dI~]bf<WQ躁Q5< Mn',7?=Tke@tI|T ]&,/:әX:upTCOx=Ih5 V g|ü$ݢeV ޡGlQ`#ߗ>B#+V_uE2ˋ-g6zC*ԡnz/LoOChM̼km8e_ 3,{P3,Tu -{L{>act|XgץnQn Tj_L7qecVؤ3],5 :b]!b^T8h.n_/Th4a. E*>M ځ+%-5/ y?˦}x⥚{,~wk]EiEFǤS(#ҝbĦi3TB7 (jbK)#PeG͘xu*6zPhe(҆v@WĮW4ĥK\Mg cA*0YԪ{"4f|`@x,aDdٕrQV0 -U}pc%1Wfרt"jW PLUaH)X vP%P01aS ~>?l?.؇bamCh+&xGԋ"c -eSr -u7(gZjV5eg6lwңA8սGu|FeѷK0+Hj&V)*egs\ SP Pc[:X!u]jZԶU_=)baz4rޛZ+DF <RSމ^-G"?O<킉_1f pm!S$RǏe>8\*jSd}Lc)0KvZ6D~M%vWDEMiK*V!/8W;ٖ҈ .aeg̸,7 T.׫IT|ܶ:suď )~4%)Mt>JY - U3 0v(>L w|fԲeXi\|JqRsyrx,;Q7(\aJ -1 G~,ynZk/Qx&/**Kơ蕙sM2[AYsZaB7> b${2F̏ *1Hiecsl|`_j9(mh:.<渻€ /rj '[$RvR!X^i] -JIVP1c>Z3Du?#g/$9}4.gky,7 ڄLl$+xIEǡ FZ{ -1Z@PVز j 5v",Ow ~rȡuZKJje%rX \*;0{v\C^qau`!4\]]F P笿2kPPޫ -H#e-oRǎp[ -%v --Gٌd/k&-PiW L*bkHtQ൤<~U  UB3V3g 8mk/%_!b -*pڴ2UkMP%~ [L PD5G[J F݀Ty֚6OnJ;*DgxDm'oA}b0hhՈiKBVxg,j sP(wLpqy*X%F͐%b+Rr.\Q.TRbֶr>:5KmƢz~˹[׍Z>~M}!K̹D^ȒWK|T<).Ac5sPu͗tYuІ VۖIcȰ*C^a.S3TEj^#Lc/.ڶShy%r3k*P_`xHtr:I[ȥ{1R%bGBX/^v.1x^r %͑N|@Qdme4V f..Eu.-3R%a 61KwFH+!`1׋J!|@Vd=T1#~#J)KCm.TH\n-COA'LΥowm\ &s[sD*1fwRTcN*>akؑ Nܒ]_u?l2zDV[W#赝zNq -oAp`wgp_jo2fɜj~Z@;榃uCJ -6Cg{z6m6`T@kC -L(_2 mF>wEYP#bNS"gCRX$v֭GCH`kq~`Sis+-iJ'jjfP31[k aC:%pdĺƥf ;@lJ\ 0l؎ZF-= ꣮d z5\Cp˵3:w4P?,F6Z ?'Gr{KXw)sh87T sU+{4Kaf%a -fB(_P$0=FW2+tkIM nru -* 1d(B |$OMl+W~|Շ -8֞uib &2uъ?`d jG/MCϝl?sEWq_&W!97\+ʃB_17T_&]WR@*|`2Nn]up|K\JtJIRDd,tU๺dzK XD0H<)D{FMl`𚛉*r3§L"ĝj]JTMĨL^c;檖[ ~ϚܢK)rtˉ؍eEV9艶āW -Dek<at,WP8u? S"rܦ2]-8|&uᎧp-mn/ k̾FVw\-_Amenhqc5muQ/o$Dmr}`I]@)\qD\*RNF%_V‘HueJ;~j! -]킭jJS6^d#eY2rf$XGqt}BK"JU15c=xp7b>CnIw޷i%k]@ *[e_Mmkl T-Q}3itJ/Xh|NS*Y?L!a_j6e8Q`,)u%QvS7BE 5 L}E0 -Bqj̐GVɸR4(]Kyhu>0ehJ%v7,T6t_O{-o+XKަ 4uYDZU>ȤU|on"[lwܝO!#t/BR0;?V5dVX->z85Zk޷UvڧQ[: -_p=tkö;5<+c{pp_M}#0/"\?Z:4DH_ETo0*}iV3L 69k}"W`09 Fq/A_'O +NP Q!hwdcd9֢K"Qc*4B T ;#Gtifٯ.˪br+),Y$PSϰ&fs7(rOFSE/0EQ| @Q,ƉM!T籰 26M6*LT@u*CtEėH,峲6K¼(&\/Y)w])2,{ ]ƱD`.zŔǺ'ΡPD rKC2U$q\!o)DE1HjEY(HJVA $t~x,a)?(UVUΖk7 շҺ-%MT,]#Jm'?ҍf߅?.FC lsT'Y| K|+cSE*"l~fy:=Ł{+CۍR,yMLgRĉbD6:Xg'OȰvs,|-+exQƣ5șGKn b!G 3.7p\qi%d E55{ynX'K^Ʈ 3nCXQsa"LZ]2K;~p07WK LF!u!BQ*?C\-b]_ -b;xajKБ; =ia4  vҘ/1&(+d4qhPD -z4QJl< &XZNEP.&fՖO"꩙"D:1tMGS 5|]LGq0D*018[j%\ 0Ж׀+/LTkNoZ-hEڎk^ Es::l!;h1nɵx:{''#1VHv0(`&b -tuuwTmQ]"BZZ*5&%UYl>YS_I8HuWB-pM*o 2*s`8-:t>F*5>[x!v2}h efbH4u:%UV! - v1[LP] w>B[n;j&=#[S .Չ.Y}Y"֩ؖɻR=d>-Z/QrD;tQy8;7E4yXڱư ,U>0Ȩ&&d[Tw Dko ,9+Y!Am-@UR"-Q E'fnYO  `qƇRUmr7TU 2 DK(BzF3ۿi Eml;Lzbl2p YְDUr0/U^OŒI(j֒OZ 2õ*F}ا@ jY}u rZC~$X&ݖOnq!L¤* C1bCs8YT[؇}ܳ5گ@GUS7ODO&CCqEe,jH)7-TS9X\B_u_reUL8@He_A%t[qrv_5 Ŭ D/<]Gw T^2EZ1 -p懊{⸮MJ -B_I:eUpԼK)f8&͓_1h츶PgNQ^DW )m¥]Q}c4}ѐz!QCt%Ll A~{)O7Z'CGea ?断'p=j#{)o-{Tf:N&jC,x왌4;Lx"0|IL`+i1s;1Y-&#c\-Kx~_ -$5o⬖OE/ф:9ZWzPJ%:Ĥ1Ql % `eT- SJ&P/o(ZP - `^_)miJemgp 9Pj\ns8?,/<8i_!@-yf@7wŜ 4\xQsD*$cn85Ig5Ga ^KG>ڵZS+Ei7n+v,X/X*kq A -.[n8.x$Ln%Կ2\%n ܶnuLUH&b$ŰcƵy.)Ӆ# 7EOY[ƔnP o -_^_>)c(%kJ+*$LŮ i7`Z#s7eT* e*I-qQfSLȷ.bb]L #Qn~1lxh  0mՌMfl# ^DS|08vkBXF[o@Pf;%:$^-X~1dzkGG0/FX5zF9iؒz{iIND[Y49%LWP4ʰ.%sQQ)_%>{8|Z[/I map1[ZJ \k> -FQD &,P?¥nJ1}_;_\]$}.)^‚F?2GG+ sLljM,Ԩ12{X J|N̴ۡQA?:2w ٳ6%%-c=?A6ǴJIKpzd6U-Xw{F4j8%mH]CWt}KɨQnvv.(C@vġjlCP[QV5./nthlrX wITXc|B`] Ru^'Kcg~7p`Ah}veUn);& Fy$uIP+ Nˌ,..(#T1@ů~ N]AlNsqA~cfL%!0iǧFSN˸ҫuE@D|z]U@կcB=m12bj8"{)TYBT4lhxHnELtR]ѳcD|G/ ڨ.>%ԵfNT$%Z\֣F{,!^e<:%Աuė-H0s.Ӕ m3r7Q%y[qeU 厝J]TnnYKRqe#[/%/X]+YQU4Yb~_}>TY35׆3ӻ SǞ$Yҿc]#BdL" D -RnUULJ[:4qRhU g̩SCJe.%w"j͆ͻG*m($Ys&U\/LS5|+ԡ#p=R6=J04k{'ffeuurTw7vZ! -x+f0T6?LKBdoIq+:CC+ȩPhTkr*⺖Ti$4RM#ԦYpv2s86ʞ"D; -tGo\u U%f)*BSKp-[1u-E*\x('R G&j W嘵p+$|cĀϑ -ǽef -۩kQ]UfԸƺ0*\<ʼnd6Xa!z3LUJoeu5FҐ2/0DGp~ GS@cWעdHfiAHtje1ij.=J*RaDaq P`#aulz`a -x kaZT*fSFr[+SPD\:γ.^crbhE`ʿ64Ȕ^t.5Q?M=°'" asqOVj<# U˞3&wSrxEQ;pjªmWV71m]KH|#&S)5e{݄ rs}+1U6JSQ:q=Mb7X_G%|D'eƛH/pUZ%Ļ#UpT}1IVzpOwf0q`Ԭ3X$AEv,y]lyNⳛV.=jPV0@h8a5vO{0mR[¥IEIP c ڼnwoS41$}HX%"B"3EBKhX\l9Dcl  WU6 Ģ>H C׿Y"fꋕ,e6kzTHӗ[F*mlNi+B !L%zT:n$ hȢK |+qeqy`7W xJ+B.ڕ^6jSkXd].| C&`u;QZ2~HKRe^&a_.7E%)mt>l-ߕcft170Lj_<{m|jfSܩE\5ÍTwSU7u7edԭ蚋.]ƪf.=I 2'Ff3(^җ = C\SG -GEL5!bq** *DdD -EMyY3#"SPeeeARcouEczV 7I|b+6lUϠKtǺzF__d12|QD: BVPbJҺ4Rc2bP6S,'cU/BWh3Ԩy m8/JYc4U`4Sb|Lx\mNKKy\/bl׈@Կi4OVQ=D~UfHLK#t;5uی(m`XtQ=\(: ǂM C,?6(9bM!Kete1/VJm39D\:ǏlŴNӺFjZ~ENHqԗT-;PQiV| `JX¬Z!a%6F'1 4W -9 jݜ jdX[Z.8*wPt}ȣ?Gl -B@,~slNgp>qo0]K; SK0*o+RQsq)y(50sbc5p2!]{JcRUT4|rU;7?C`GOE(YR(Ќd? t`&+Fy`Dϫ;“2Tu{"IvWF.TЀ+k-3|( Y<qE 5Әa!Թn"X?1|rۓӕ gqmjt(04=/(vC6K;3Q)'a%HG;>!=N -t^ r"rƛ$Ƕ=APxΆmg?Qp=gLGDbVzFxlY GTWֱ57sew -|Ƹ M%u {RۨĨB`cg숔W&u]H}?A".vѫawS+s8.ul f/)bgu7Hp -g7Mot.62 BHZt6Sh`MvnBPHAfhgx7~#EQ]7 UCdʮ8S-|\"([ B֯h*[Tehܨz,c%PL m0<4ne0 B$7*%q<1+(Z&"xLiek+7)ny0̾T# -b{rS2/lR0HBR7`]Wܾ9fr|Lஞ-̣>eˢ,Bo'oP8 &EӮw7,uSRHG+X6@~,Y*Ɇ{YpA-hC GTEdP5 %םVTh~'&j% pbK},K -5:`2 Ԟ 2\YSEKE -Tob'6]gA`D_C$_%?B΅m$EIy -0#8(N -*QQ%bUrC/ԩT\7o &w ~;(i׹j Xv -?(IM7/EOrR¡.l2QWi͘ڡi$ls⽑ -2PbxK`e˔ql)3Cf\B2S_qH, ^*(?㗘%*?d{0@1mMu8&"N 5>aӳSVłOp۸+ʪ^&{嘶0n3bN]-"]K246%e; ,H0U"ElX1_qڮ-l(Ɉ}~GPndT-\bSr0/G s znSsAPR.4Pۚ|Q<ײA:aːa 09.-_2z=@Q-{U a4_ KE]M(u`N+wZ/W3>0jOv*˔BUc.e%Vr0;(ypFF%]%ԲTƢ¼pUq1, _T e%G@F.3r[0$ {n]\NI|.ek&~Y6{K+RQpVQ#e7~_bP#;Kj R\j.rKҟU$m:KRfus6ƻ1JD =OP˕T/1.1$W^vP"1b1ln=ʯ!HQ3*/6]ℱUP݄/CKIbTXI#A-hH) -VQ, ˀ-kv4kDC -] GUǥ~{|U1{-;X nI}J zn+ω|`o`}Y\WmB%xW+EVJ]Fu gLa(:IvΡ>Le|Z pJqsֵB:|\[䕝57, ֿK׺k|f7i"n*S``}2M2`U㻄haL -yjʼsL*j啧1Pp/M~P QP.+0-@ma4_*h'@XWZ<٪t4C/ZQ+5m~ją+6垟r^h2Kpo[̅"X60P>ph0 K. ""0|Kj,!7?Fqek v4'&2Rc -4bHeI#}_qBTK(U^EQajv -ܞ(Vy~Al9~ϷV.P*7VeBgCIYR!Q[V+S -G͵݋SW4rg7jT&0K@7)Q;t n`{,uZ]C,40,Ŗb* ܨF)Y狭b;Ġ|3KP~N ê]R:.__>b,=gˇVUx.%8b*o44>qLT&jj))U}KV_FT)6{&y+-C]**x -LRNvjk-b`ci -# XO#h[eH8q^g-ԔX_GZ -2 &z)SQ% -EXoD6|6$mծ[ط-JE:33XL5rZC!l U aDIbiUGo.{5D"+u4$ s5eW -]ʁ -A"5SXBSlضich$U eT\s 1|]DP8k,2̀SqU6 jfW:/5 -3G$F -uKYTr{`1%R3|T]SR?&&x c8#}N/5{ݒ(F%vxb@nel(M#)컠S9[R//5H,p]tK&*[DF*5 -R-}wtKjXPGj+4rp`7c)Ei6828|Cmzj5X,%Jx'W pm^*0GP`bj=q Cv2C_8j0OW=2_/"L e2pQm$c-n8Vї+"98v1طa89k~^-~eMUfLi!WU?uc1l-V(?C)>'wrP%H{e 32RYd⡫" VKh\ė+,%F1%T+tJ n'f F7:B*̝C=1 m֦ ]0cURk/ @6P1`DpuZNĪD! -E\u5;kP#7*a5|2ʞNM#\AotbO^i!F_qp%T,ጹiS<]: -NQ]F?$?j6:BbAƒ.Jk>zFݱ3ZzcYy S՚K_D~f,ȘUՆ,GPXE"i[UĘ41``U;ȑ;yjdjҡ,*&ZÀ-e(=` j)[u䴯6C$q&Y9] n#ۘ(Aev;nGMʪW1Q:[USw@&LycִTN.)ڸj>*5'e`* Y@|NZvz'Jnwh>00 KgzS_QVn}ϲSMÊ̹}MU4%d,XfbFU"_ar*; Җ1\A2FkYz8@;G̸mnQ2Y~+B@7S){!mVj^6 e"՟M\]ib1#Z iW(U.~aҷԭ+Ci1C>xic1d+Ŕׯ/V~1XZU/)ȁYeq}i!As` -[ZO -醙LN{%V(qBAo}4GNĻf ԥP9ѥ?mbCoU03a г,~T9vL9d]:%ip/`F( -R{;cU wzR "ή2_rWbA}F\ -A5BLQ/_@ČOv d Ǹ^"ΦIݱch5v;xL?&>56y2T"A5J:;cާA6EȨ6A Z KIg20pKIJ>%`wnTUVKJ.D(hA]KCZ.RAtG^~uծ=|LdI&f)mSn!aܮßo .u.7QCl3cFø1j,rq\l*&bBW%W/¦e%Q%qSS4,Lt -FT{#َ2b]vmor@"ȫW: X''pB5uU8\74"߶6!zKZU|JÅJډ/)[.xsPG|_ .-F}pax&cQ)lJXwPb/5+ 1*U<۹}~F&^c^0$&3#}j{mFMY -FވuޠR$n>IUAwXR~Jc\ܻvmv U|,.Nql<ľtWKBĉD K͏Kn7L` !J],A %.YT - e%}=T<\BڐUR5 -p^X,nϹxTdmLQJoܝz{ QMm8qsARܞܱ0[)\UjTڋn!sjUDOxBj\.[,uj6XZ:uv+utMERq7t5XuIXTjE<ӯv ^k+#Lvփ)^j-WV%eVAr (UW=quIk仵﹚Y\ pV %@dd]b%/I66v,0k{HyU}AzUkQJ[YڃieW t>:p{[}]c1^ -v`kWB %6U |ͪ{Zћ";OXy U%NAsjhUvK>>cD {r -Q|ƙF| M1Tˤ{KhK<ս P/ʭitpB/j% ¶Z^?t=qoNbF/uBnKXY{"k5pa>ݙ7]+z`@Wd2N SmS0=c_(i*iDPKTE>! {wR<.;yj oki.RʄhK)h{G@M[Bk/uY -ص%Vt.SjV=3ʱ4ui,2-+ڂXJBKS.Z,!Z|! 0f#u[]A]q9~Y'f3Jt<B .u5RB`XD[Y ܀qE&^<3%[_P!B&k-]0DdzhtP/0oV -"Va qFmD퍢~eͱZY#<y .Skj@eM0S9~"0%AGMav^٘^Xu{`mP ^e=Ю,$g,c+ٲljap`-Cicv#U# z*YCm&D>:q*i9z,5AWM'2;pG6 m P-}g 7ѕzؾբ hGEpʚTbjUT8|!Q7QHbnP5oQizͣ=be#:/⦳Ӫjm'ÿR:~pmK+o:R+k hT؂ T6`%8Vĕ-΃ՌJjFQ7Pe]'W5]y(ZL\nf4[_'tU*!y"MAL;n3 ->45t ~d@G'T[J'm]HbPT{T!o&,u)Y_.! QچL,x@RS#.aA-ڠ`ʴ,kӭz_i~AVc܌XHo,\ބ-G'#@bٲ'{jZ͍r|ڗ-Ae.lN@VWIQ4ԥG#OS5TLAaUSJ *M}uӅOLGlJ};[6pН63| 1˟2eT$cT*Pe#F`Չ) 8r09RTUsU ]m -o8ǝEdz?CP((yY.bʉP̨NNT8V\8nܫ5-j'MNcS)}qS+ƇI@;t[1wSC$#_A>xkE3oR2W/@FKN`o>.}dL1Y+2lJ.Wsm-eW>\)%~qA)vJj0I5. bʞlRGAC+3_3.\Ե,D*Z< m/<0Ca'HLS)6U~;VKl #-\]|n-X v"(vy0WT>w%S]S+B op6.HQAw۟آב9PE0n諉& \TmmQ -5PXt*Nf3>E[nu-55beu^un5dJe6X\0.V`ɼPa ~eBg4.t5mDRk9ӳi! XdG(6;Ԡ86Q1/>q7VD%ѦYڑ{+52TlV`R5)o3=\=S40m(ݣړXTR.)e̊0/_ɐf KlE"\~>nMp<~)^E{+iiaG,Vп/jFg}7ݟ}k/#",uD3@kbJa!OFQLe; ^["7*5Y?^hԗI677jXQng?CG vhZs20ۂ&䦫NI&L&*wںd &j }Z/T|qb" UHPفBn -^@+H-?p?2cZ+eCWfatD\~Z’K-σD+]%Bv$Gn@W Pň(MY۴fc&.WEe0 ,g`(@JטO6^(s0dR*@baD.^ `rK|f!\cCxe^rG'Co!FjYBQ -%(eQT!w3W+rī/|7w/-EX{>Sؤ~ D'MQ#c##T>;&-ޡiS`GwΜں2ݺi `V!UD!s ֿe.]3rOS73 2L]J-L̬Øtod*OaS#]t5}A -L_u4UW2#i20tw<26P*j H}r"ISLh{1!~e\YeVn_jFF8̵q M堪B(\R0H4.ZDΐ -}2#v?)eb$fUFTRڎ>0 -})VcjjzigN'3c, - b3>v肎P_P@=qs,F0j^vd(mXREeuc;e GR\EBaaڸy⦄~ ,*A5SA6*Ҵ{QbA[Vuࠛo,ٗJB .$+~dU5lt3j27Rm_QnՇ4*pRkEc1|'Lۗ0! --(PBWE -ϦaY+'$пP>H-TPcܤʫs|u'D×|QE@E)8X3?yEB7c>ޟ!޼eiU0*,S-3{!nSur y:5߹J'uԶ^ -l01Yn/DorDbo;p![./N(=Coe -`DMF=7N]UO[F\n.mAtp bU`?1*rC &+ٹqlWQ:L!sU*R8#~"4tMN^hU~N~+rZ\GuMFTQ֥l2|5a}(AfPE{(VbD57sl #8w&Yn; ܤyfpFr\Q|ܮQD(vxW|$. -*VLICwWYីHb7G 1YU.\r a u76 X0ߨQ$[2tJ#3UWaR+PmCc$:c rI'-wEQ"PKʼn -2ڪFRsUDO먓4`הusT΅bcVo!Wc"R.l^eu}Y;?^A+mꊊ6!?ǢcM`We/HleO&hZ}DA}u,E1{&n6V&!UEJȵXw+ٿmBu۱FJ'j8a-[UjYD?*e=@_?ԣߨmw8eY򄔔Fv7kV\A"S l([u2 -eB4K3,뵺TYj0_ A^ -(Ձ<2kim\RS[%.]yUk]k if$'w *D0{d0fP꭪hqD'{5x!Ȯ1>n~ I'T?"r?eH%+bCl gan]Į]p"W 𒹹dO<U^$=D >-ڈ!t9JP+PY^r@?UBS0;$%fgp1kULJ\.1jxcG90.xE% T;Ĩ.p_]ӱ, -K7WĶ^fUIqa3w0( -L /L-`JXH^&"Q4*!-˨Wr㰏"qpa W -%Ws/wPJ 1?qxIVK×9$&,!/qVf$;& ELXVQвLuFLKY}FkhU| -?USt;3`|Ӂ \"#R/GweLf1u27xteJc GFkKvTԬg0䘩Y8!h!-B.Wʝ:uf7Ejf`ˊY]EA#^b4 8bA710D(drJ~̾ lB1|X]pH/OkETZYe+ }H*^A;ZVqar1/&%g*jwg'5ƽ'Rog2ƪ0V&#]b!{.WsbuAGB_ ʌW%ø8U٣O\Km/*NC˶"zֈ˽˸g2RᴈC,,{_4$_\A tԩȬL%U:°KĻ suvC.GI{SQ)o![m)4^ yR:ͫtk}ؔip (r_l}}ZC(G[XX/DHK(z!) -!Z=L-`?.\,EeVe(RŽ!.̎M*(j_2ܰנ֧lԚD8[2Uei4^pW߅Vt=1`4@qVĥP FɏQp&棓J -#z445?Ҕ@.ʥiI"HOpQ#zPħʽu"`Ca=0WJhZx@kLWs~?1L!r޸$۳FjQ!ih_>sfVi:ջW:oKz.mPKP*v0W-++e'DaT,>j.[UWrmc~蒋J[fn9!(_ˉ #LV4̊lh֍^( 5d@.պ]Tpm\|闸ZԨu{u͟KQZѩᜍa%C+"gZ~ - # o#Mjv˗BS+حaJ(+dK`B=XRڶ"4Ьb Bn2vՆJ偈JOƸRCMT*<d WY/#UF#T)pf J ,Op豤?KE/ΕOkr?nzŒsfs>'dS%ƚfIl2놐{GoiXz8Pp*40%M?/T KԨxH5Sn3T^TĴWd%+'7-nY$8Tn5>fvK>5qyIJmK>!\)A+ )L^51Pxɺ9([k$_ N^FQ*@m)hY.dwSRmX7 6Clo`[#.,[mn8k" jrLxF$c?J R$5Q͆X{!z./OE:0zB%baؾM7l12#L&7)^ 2r0ZDk?ě, %eZ@Ngv#oeV1'_CqGC+?u7_IU_Ub],.gqMZ11p݌#_ݟTbe^zR>b 2B[Gl66Ew(|C.V}FU=]PڱruߘN7n/L(V -!Vg>TzYvr|1Wm12,>-U56H"UoF.9HhvTUԼݩE^}7(mkxQ|C_7R-ﰫef|]Y}ܺv1~^%?]'qùw SX&Fؚ`pjڰnN EQ*Q6 L A?` !@ BkҶ7hV$麀%W>d>LMNz qu`Mxsd$rjtԎ,0 7ڞRBtLdٯH-OP̎ܗCm*-R>y}wQģcu=!6K]`E am>VtCfoV1q۝O~e| N@syFjLWm }Kؿ18/YD╜CHo$܎FQt$Dl̃!wƗAaڋ/t؅ylw'@fb,4 1h6La?\ugY!F}Y6%QkWU {_7yV?'FP;-`p -"DR37,I'oH:T1UQ1b@kT5F'kG'J#2\gnq/g\= gzUH枵Ճ.(xN׋ՐKujSXԨLu^7- LZNDmWF+n%.Z*O]PG{ :"{Wԩ\wɮ1Z***ZAM2ɩv*.e:kc,_s8̊&mfuE >S9A',u]c=CL.㏘%C7`0./ < XQ.YW O~|:mXK2 @2ʇ%F\Xn LjhU0#reG]Jx7ѧ>GEmļ`%,}S<2Êpu\{ԨK0PO88dcS|Σ/pD c(ѿOϻn̅Te>h[<M^Fwh9Ba@(&$i?L^RT1t2>*%[,N#_g MMƽ^իA+ kWY <7DyAb -&]UQH_mǵ̒~,J) F6JMtLtU- F`3H1} \>db@BҰ҉"ms =N+HMǰOY v&-z{qe޼ml1T+C[z`Sքއ2&ۦEQlBڪY Ah({_ uA\s&d)UkB;ɥCCBڌ2zE~kڧCVWƀȲQWbnbiH\)ZH$7&Sb7} CށKB/p.ނba2VfBEV --rbD"stƢZV_s=C9Oʀ+i$gsyO d^Vŀht\n&"@"`vySMU(dƃ3}elcY>a~jH\}CTA7'jou6FW#k$ll(a -[KU ~ȪA$<;{*Q)ϛI  ˍ]FT/ -*yV --XUQKvv:Z g|RJC djThif5`3sɳk 7mCUFa+ -[tWԩl.6Yp=KYvWޝ_•Nb K5eE)*JmRBm{g2YEG,2v[B&0%Qpr]7tpDlG_&F&Mf JJt,1H(F Ţov%z\/Pm1+R+a٢ ` -~u T8hfʙP*69>s~]i:F%ǵ÷OFb" ڨA, j8ʖ lb+!:]"U@ZCkjHs:1dvf -h,Ic UJ0ʉ^PGQ1L'`&$(fN22[eX&!PPXA.~L~zl1p&Q E֬"cٔ0Yu$R#P \q|2w -ƌ֠)an01b2jwlbQo*MB",K!>"G#!us*Zs4߹MrQV.}3q)JP*5Uu݆J )kijɳ|8-/ E=FJuG -ȮL -- @I]@l65k/  h_,qlRvrX|*W_w@ee4W(})?JĢV[Q<@AX~ ) O^jWZQF}XmKrB$3)!n:I]ѯld?j6=ɳwbKڜ=*wdlvIQNT\ ?+π<Ib."') 4EbuJ Wz*hKXQ0C±*zaMbZ0(hmf2 RjO% =lj \!9Ii$w1i@L-QR0Fb\ k0}<{]|rDz˟wY7>wu;4r 0Od\Vfd&hH.Y]¡X \E2NRQGu/R J􌧳}oq:@R*a F0-V#w}AI?}S1ᐆ^C#bձaX07OįPNkkaQ FY*%ψsu)SJ+RE -<ŽhY*m" ЅZ#! ԸࡅKŤ;c IKll} p>aDvP筎rAFɘR\[,UA\%B^%"Zp]̢zd6(PKmArቤI\/9θjnw+Ufopg\Ys5".>R9eYRKvA"*6$j}D9#'DWȓ3:5XH?/P]!55TQߜ`jG{ w4qsbsZ-׍v@gV*ZFG ,1E[ܿ3 Z)BW K%U mD# CUlݳ³ 4b+VUQIҘP'@8-w6`5 -63 >$L*V?YTdY+=?mM<<+{k)nq -06ʑaiRIJ05[!7q0hZ.9T&jKaCWY1T0Y*j*.D0\R=j쀻rk E9'uPljC*]} Op70reݫSzңª[ -W2>T`IO -J\{ Iw$7t00\=&MKJ8G8 KETi8R*S׊c5 X|̕:`QbTwBKxAq.sZ6LN"% -'cDټ4ODKCl2;2)1*y2 -0hs4 -/YSL(#ŐRc"=|d̺[A'Ɯ~ -6udMfjWqܬ/`e< rH۹$.HX!Lx wU/D6AL@5 -R&7 J}AbQ/̾R]#/+h<˱CFv\R]$ًo¦K_ -yΥ7< gA 0p]jVD>N jΓ{n$ѵ-8 hTJ> x)lPV(* O ŲfqgqRSoRue7 -ĮKՋL}LXTуЭHcuV()݋4Na5 Գfbu,KU_ŏ[mXl d+*]E|\q D:Q_/&_PK4F|ʌ+ZHvwqn;e,&`~5)w5J8 L\de2ɊpD:Pklnƈ J ڀR;[@*(XgK*,fP=y_")~N  x Ӹmhmߩ5_$z!G\gRE/!Fu ZRܼnQW%sVS_Q%WPyCcՎíF? {w," -L_ -ʃ`.p1P_bb< @.zU@0n%1젿LdEaXE&+F5?X>1ԄWqL2gn@E A*7$ԇЃ8i/<:#K.'v o \eޣ711:#mAmX} -خ5XAՕE.h%RkK:LCpba}@*> :Z!?C{g.( xT iyK!"+E36PC#r LJ5d\ESQ7"-G@YMUh Rd[W ̱="y#b7P,FUn! -vl=XSl.dIBOLd{0 [GUZ@*F6JtCdvݱ]A(!~ݝP2"=S6VB* EnkOpnqbx ٕ>);_/Dy#\UbT7V$jZ) )`{(_Ņ*=v@@ѿE+'eWtBDiE٪O >%Ñ7SWl زj4u&HVaU|rU x$svb:7ewuzwI7]~ohۨYAӵڌ * -?lrWwMP(h+~NܳP(g7Լ/lAï#0c۟c -.ԁi]LAKīal#?d!IA|2t'e*6 a>tHUHIQ$#Kx`XEF!_}k2lro[;Z]oL y<r)1z UVi,3mRNCZUyW60tV؛IwduRqedsPIvKܑ6ynA/T'r]zGP_-6=CרYx.c)].daJYZޡ2z8eƗYYX~ -(>Qڭl-A[|B rCh;#?L\z'>o. _4߮4jp؊!:W,C)`a޶%m*jнYZ=c@tL<yYc0CBZ J[NpiK}0ڥdXn:x!;ahU`n9FR Z N?2 6M6 )|Ԫ>JJT8j%-FДt&*ѨG+wQڞ9ɇ r'_<_^.<8p RUTMQ+ECQ+E\0J -om~"R%5N]s2wƧq EcAX9aAoYC0612cmC}ݎn6KkⰗ~`A\n2n=EۃsS2ڥ1&%QClbܧsRr:|^{s0a8c.\&^#cdT5 p%u(gp!/|xH&_J̘g{3a&;SGȵꙪ}$zyK$ b}KBdiV/ >  R2uB?=X/)Q@J@!PSϵᗈe+6NJ \/FV/wPB|D}%WKI)+ ހ PzJLCmjCgcwnયPDFϴP%z>*.6U8۲bck<"w/̗yWUQu93ac0 wV萔'smR?0zdWClq!(ۺjvmY_0U4J -6(?j-|*=V}՛A>'9/ ^KUfUS?fo[wZm"C]hIʐDFTڻW̅j&C5͗zgT# M"{.Qഺ/RP5悅1zo5|EnjBoen|hW,'?ĄΚ];D|j E'"e*-Z߽>D t첋L 2[/V6̀r `hU8YJ-ٷgO^DR~"TWJ=t1E }͋+0χG΁o4_|(uXu\;_hD8K2zQQ cl1;fSډPx;>0-XE)'ux9/;f͚mYOE1΋^y_,RDcǯ - Y22i1:̛O!(.@yPi̼RDn_CU_S(p~y"[EѤC)Nd=7&hJ#w(Zp]>|J!`@p 0P! ?#Q3?,/{V{-ЌM ̬1b~gVybhDFfΉqzǶћ Ll!O7m{G#Ge37:<{:i71G<ߵM[{vR<QF9m!:38<.D>/}fu: >Gdr" F;Y3VpA>#m"# ">FL3}yVܖ^#338933x$y2`jag! IѤFv#ffy(ϙLH/pFp43Fu# ~8GlRg˂3:>m:.6ς|ngNPRDu}g$#I p ?6t.-0C NJ -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000013534 00000 n -0000440843 00000 n -0000440974 00000 n -0000441172 00000 n -trailer -<> -startxref -441309 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/ad053863-8eb1-4517-85ef-0d65405a3fd1.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/ad053863-8eb1-4517-85ef-0d65405a3fd1.pdf deleted file mode 100644 index 13fc82b..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/ad053863-8eb1-4517-85ef-0d65405a3fd1.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/ad6be130-8165-4a11-bca9-9c7c5f2a7624.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/ad6be130-8165-4a11-bca9-9c7c5f2a7624.pdf deleted file mode 100644 index 3143458..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/ad6be130-8165-4a11-bca9-9c7c5f2a7624.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/aeba4729-549d-4a20-926d-38ad7ef36b5b.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/aeba4729-549d-4a20-926d-38ad7ef36b5b.pdf deleted file mode 100644 index 52bbc88..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/aeba4729-549d-4a20-926d-38ad7ef36b5b.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/af1e73fc-53fd-4036-9bd2-401dd724cbec.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/af1e73fc-53fd-4036-9bd2-401dd724cbec.pdf deleted file mode 100644 index 311cbee..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/af1e73fc-53fd-4036-9bd2-401dd724cbec.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b1b8569f-f317-43e3-ba11-efd4a1f5440d.jpg b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b1b8569f-f317-43e3-ba11-efd4a1f5440d.jpg deleted file mode 100644 index b054ff4..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b1b8569f-f317-43e3-ba11-efd4a1f5440d.jpg and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b300608f-be28-4768-a70f-3aedc65640f5.jpg b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b300608f-be28-4768-a70f-3aedc65640f5.jpg deleted file mode 100644 index 957a169..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b300608f-be28-4768-a70f-3aedc65640f5.jpg and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b300e9e7-56d9-48c2-944d-1fc2781296ec.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b300e9e7-56d9-48c2-944d-1fc2781296ec.pdf deleted file mode 100644 index 52bbc88..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b300e9e7-56d9-48c2-944d-1fc2781296ec.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b3600e9e-7f58-4900-bd88-7984924bc26b.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b3600e9e-7f58-4900-bd88-7984924bc26b.pdf deleted file mode 100644 index 311cbee..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b3600e9e-7f58-4900-bd88-7984924bc26b.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b58fa359-55b4-45ef-a7ec-8b2bc3a3875a.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b58fa359-55b4-45ef-a7ec-8b2bc3a3875a.pdf deleted file mode 100644 index 5d78f89..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b58fa359-55b4-45ef-a7ec-8b2bc3a3875a.pdf +++ /dev/null @@ -1,1139 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 284.5049 0.0000 0.0000 792.0000 0.0000 0.0000 cm /Im0 Do Q q 0.1922 0.0000 0.0000 0.1922 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -30.386 0 0 47.5 65.13 3457 Tm -(NOS: ) Tj -39.1475 0 0 47.5 138.63 3457 Tm -(1029812 ) Tj -31.8513 0 0 50 63.67 3401 Tm -(OPERATOR:ELEN? ) Tj -28.3739 0 0 50 338.47 3401 Tm -(SOARE ) Tj -25.8674 0 0 63.75 65.11 3324 Tm -(NR ) Tj -33.6573 0 0 63.75 117.84 3324 Tm -(POS: ) Tj -33.1591 0 0 63.75 196.65 3324 Tm -(C3POS-) Tj -31.4652 0 0 63.75 315.66 3324 Tm -(CT3 ) Tj -0 Tc -61.25 0 0 61.25 316.32 3783 Tm -(e ) Tj --0.035 Tc -30.9668 0 0 58.75 379.81 3790 Tm -(JUD. ) Tj -30.0064 0 0 48.75 468.68 3804 Tm -(CONSTANTA, ) Tj -25.9378 0 0 58.75 672.88 3810 Tm -(MUN. ) Tj -29.7371 0 0 48.75 765.68 3824 Tm -(CONSTANTA ) Tj -32.9481 0 0 56.25 468.39 3753 Tm -(STR. ) Tj -30.1366 0 0 56.25 566.78 3753 Tm -(ION ) Tj -28.1844 0 0 56.25 635.86 3753 Tm -(ROATA ) Tj -28.698 0 0 56.25 749.12 3753 Tm -(NR. ) Tj -0 Tc -56.25 0 0 56.25 823.32 3753 Tm -(3 ) Tj --0.035 Tc -33.0909 0 0 58.75 61.65 3186 Tm -(CLIENT ) Tj -32.9284 0 0 63.75 203.65 3193 Tm -(C.U. ) Tj -0.0087 Tc -63.75 0 0 63.75 263.53 3198 Tm -(I./ ) Tj --0.035 Tc -53.6974 0 0 58.75 338.42 3208 Tm -(CLF. ) Tj -40.4222 0 0 51.25 444.96 3222 Tm -(:RO1879855 ) Tj -26.9316 0 0 57.5 55.5 2521 Tm -(SUBTOTAL ) Tj -34.0229 0 0 63.75 322.84 3659 Tm -(BINE ) Tj -33.9796 0 0 65 423.93 3665 Tm -(ATI ) Tj -32.978 0 0 61.25 485.92 3672 Tm -(VENIT ) Tj -33.8209 0 0 65 602.75 3676 Tm -(IN ) Tj -25.6086 0 0 62.5 660.88 3682 Tm -(MAGAZ ) Tj -31.7559 0 0 63.75 751.77 3687 Tm -(INUL ) Tj -33.5478 0 0 61.25 839.84 3695 Tm -(BRICK ) Tj -0 Tc -67.5001 0 0 67.5001 955.75 3697 Tm -(! ) Tj --0.035 Tc -39.8733 0 0 43.75 503.57 3626 Tm -(CIF: ) Tj -37.4702 0 0 43.75 595.81 3626 Tm -(RO10562600 ) Tj -27.3716 0 0 62.5 57.86 3052 Tm -(HEY ) Tj -30.4245 0 0 57.5 129.92 3061 Tm -(VESELA ) Tj -33.628 0 0 62.5 254.52 3065 Tm -(5L ) Tj -38.7587 0 0 53.75 314.72 3076 Tm -(INTERIR ) Tj -37.1044 0 0 46.25 476.95 3094 Tm -(UZ&5829791160 ) Tj -0.0231 Tc -35 0 0 35 55.5 3004 Tm -(5701334020560 ) Tj --0.035 Tc -26.4211 0 0 56.25 55.72 2186 Tm -(CARD ) Tj -28.2692 0 0 57.5 54.86 2119 Tm -(REST ) Tj -36.7184 0 0 58.75 499.61 3872 Tm -(CUE ) Tj -28.8561 0 0 58.75 590.86 3872 Tm -(HOLDING ) Tj -37.8406 0 0 58.75 729.3 3872 Tm -(S.A. ) Tj -29.8245 0 0 52.5 55.86 2924 Tm -(PROSOP ) Tj -33.7908 0 0 52.5 180.85 2932 Tm -(4STR. ) Tj -31.827 0 0 43.75 289.85 2947 Tm -(PROFESIONAL ) Tj -32.7197 0 0 52.5 512.39 2954 Tm -(STAR ) Tj -36.9624 0 0 43.75 55.95 2883 Tm -(UZ434101137344 ) Tj -40.1295 0 0 43.75 325.49 2883 Tm -(6425667000530 ) Tj -29.2671 0 0 56.25 56.86 2791 Tm -(PROSOP ) Tj -33.7908 0 0 56.25 179.85 2797 Tm -(4STR. ) Tj -31.827 0 0 50 288.85 2808 Tm -(PROFESIONAL ) Tj -31.063 0 0 58.75 512.42 2813 Tm -(STAR ) Tj -36.8169 0 0 47.5 56.95 2743 Tm -(UZ434101137344 ) Tj -40.1295 0 0 47.5 326.49 2743 Tm -(6425667000530 ) Tj -30.5273 0 0 63.75 56.86 2672 Tm -(FIERASTRAU ) Tj -34.8558 0 0 63.75 262.83 2672 Tm -(MIC ) Tj -28.1152 0 0 63.75 327.86 2672 Tm -(DE ) Tj -25.515 0 0 63.75 382.88 2672 Tm -(MANA ) Tj -42.315 0 0 63.75 476.81 2672 Tm -(400M ) Tj -52.4414 0 0 63.75 589.67 2672 Tm -(220 ) Tj -34.4063 0 0 65 55.83 2600 Tm -(ME9001424 ) Tj -35.3216 0 0 65 240.5 2600 Tm -(5905061 ) Tj -38.168 0 0 65 369.59 2600 Tm -(034740 ) Tj -39.6333 0 0 52.5 55.85 1201 Tm -(Z:0297 ) Tj -38.8688 0 0 52.5 182.81 1201 Tm -(BF:0160 ) Tj -29.842 0 0 56.25 61.78 1129 Tm -(ID ) Tj -35.5265 0 0 56.25 110.83 1129 Tm -(BF: ) Tj -27.9066 0 0 61.25 55.75 1985 Tm -(TOTAL ) Tj -26.9371 0 0 61.25 165.76 1985 Tm -(TUA ) Tj -0 Tc -61.25 0 0 61.25 238.86 1985 Tm -(A ) Tj -61.25 0 0 61.25 276.26 1985 Tm -(-) Tj --0.035 Tc -31.535 0 0 61.25 311.8 1985 Tm -(21% ) Tj -27.2651 0 0 56.25 55.76 1922 Tm -(TOTAL ) Tj -26.4289 0 0 56.25 164.76 1922 Tm -(TUA ) Tj -26.7539 0 0 56.25 236.87 1922 Tm -(BON ) Tj -27.4226 0 0 58.75 55.11 1854 Tm -(NR. ) Tj -31.2244 0 0 58.75 126.85 1854 Tm -(POZ. ) Tj -29.478 0 0 58.75 218.94 1854 Tm -(ART. ) Tj -29.842 0 0 58.75 315.78 1854 Tm -(IN ) Tj -30.5256 0 0 58.75 364.85 1854 Tm -(BON: ) Tj -38.9622 0 0 50 54.27 1004 Tm -(S/N:D84700011006 ) Tj -33.0263 0 0 56.25 54.65 938 Tm -(CRSIER ) Tj -41.7538 0 0 56.25 182.54 938 Tm -(1: ) Tj -30.2988 0 0 62.5 490.68 1402 Tm -(C3POS ) Tj -37.5439 0 0 62.5 579.55 1402 Tm -(-CT3#1029812 ) Tj -0 Tc -67.5001 0 0 67.5001 851.63 3026 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 67.5001 873.86 3026 Tm -(BUC ) Tj -0 Tc -67.5001 0 0 67.5001 949.86 3026 Tm -(X ) Tj --0.035 Tc -46.0425 0 0 67.5001 987.71 3026 Tm -(20.53-) Tj -45.9089 0 0 67.5001 1121.71 3026 Tm -(20.53 ) Tj -0 Tc -67.5001 0 0 67.5001 1236.85 3026 Tm -(A ) Tj -68.7501 0 0 68.7501 849.59 2889 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 68.7501 871.86 2889 Tm -(BUC ) Tj -0 Tc -68.7501 0 0 68.7501 947.85 2889 Tm -(X ) Tj --0.035 Tc -42.4687 0 0 68.7501 986.51 2889 Tm -(19.55= ) Tj -45.6196 0 0 68.7501 1120.4 2889 Tm -(19.55 ) Tj -0 Tc -68.7501 0 0 68.7501 1234.84 2889 Tm -(A ) Tj --0.035 Tc -26.2584 0 0 58.75 549.87 877 Tm -(BON ) Tj -30.4536 0 0 58.75 623.86 877 Tm -(FISCAL ) Tj --0.0224 Tc -50 0 0 50 447.75 816 Tm -(R2000221497 ) Tj -0 Tc -67.5001 0 0 67.5001 851.63 2750 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 67.5001 869.86 2750 Tm -(BUC ) Tj -0 Tc -67.5001 0 0 67.5001 945.86 2750 Tm -(X ) Tj --0.035 Tc -40.5919 0 0 67.5001 984.58 2750 Tm -(19. ) Tj -43.1315 0 0 67.5001 1041.39 2750 Tm -(55-) Tj -46.1102 0 0 67.5001 1118.38 2750 Tm -(19.55 ) Tj -0 Tc -67.5001 0 0 67.5001 1233.85 2750 Tm -(A ) Tj -68.7501 0 0 68.7501 853.59 2613 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 68.7501 867.86 2613 Tm -(BUC ) Tj -0 Tc -68.7501 0 0 68.7501 943.85 2613 Tm -(X ) Tj --0.035 Tc -42.3228 0 0 68.7501 981.81 2613 Tm -(40.46= ) Tj -41.2123 0 0 68.7501 1115.81 2613 Tm -(40. ) Tj -42.1185 0 0 68.7501 1173.81 2613 Tm -(46 ) Tj -0 Tc -68.7501 0 0 68.7501 1231.84 2613 Tm -(A ) Tj --0.035 Tc -27.9653 0 0 66.2501 368.86 1069 Tm -(DATA: ) Tj -41.7812 0 0 66.2501 477.74 1069 Tm -(22-12-2025 ) Tj -27.8792 0 0 66.2501 680.71 1069 Tm -(ORA: ) Tj -43.8597 0 0 66.2501 772.46 1069 Tm -(14:27:53 ) Tj -40.6712 0 0 57.5 1135.58 2548 Tm -(100. ) Tj -41.34 0 0 57.5 1210.56 2548 Tm -(09 ) Tj -31.3424 0 0 68.7501 317.95 743 Tm -(UA ) Tj -24.3105 0 0 68.7501 367.88 743 Tm -(RUGAM ) Tj -27.3077 0 0 68.7501 477.49 743 Tm -(SA ) Tj -31.6239 0 0 68.7501 531.85 743 Tm -(PRSTRAIT ) Tj -25.9115 0 0 68.7501 696.88 743 Tm -(BONUL ) Tj -32.2992 0 0 68.7501 805.85 743 Tm -(FISCAL ) Tj -0 Tc -68.7501 0 0 68.7501 937.49 743 Tm -(I ) Tj --0.035 Tc -27.1534 0 0 70 257.96 677 Tm -(UOCER ) Tj -37.4292 0 0 73.7501 381.6 671 Tm -(CLIENTLUI: ) Tj -37.6326 0 0 68.7501 586.6 669 Tm -(08008 ) Tj -31.5951 0 0 68.7501 696.85 666 Tm -(BRICK: ) Tj -36.1034 0 0 71.2501 834.61 661 Tm -(0800827 ) Tj -33.9295 0 0 67.5001 957.85 660 Tm -(405 ) Tj -34.1081 0 0 73.7501 277.7 613 Tm -(TIPRRIT ) Tj -30.1696 0 0 70 422.85 611 Tm -(DIN ) Tj -30.1811 0 0 73.7501 495.68 606 Tm -(COGITO ) Tj -29.1571 0 0 71.2501 623.83 604 Tm -(ERP ) Tj -0 Tc -71.2501 0 0 71.2501 695.49 601 Tm -(. ) Tj --0.035 Tc -34.2253 0 0 71.2501 771.63 599 Tm -(00GI ) Tj -34.3697 0 0 73.7501 839.69 595 Tm -(TO-ERP. ) Tj -25.9125 0 0 71.2501 970.87 593 Tm -(RO ) Tj -0.006 Tc -53.75 0 0 53.75 1132.12 2213 Tm -(10. ) Tj --0.035 Tc -42.4 0 0 53.75 1206.55 2213 Tm -(09 ) Tj -46.1994 0 0 57.5 1170.5 2142 Tm -(0.00 ) Tj -46.1102 0 0 58.75 1151.38 2003 Tm -(17.37 ) Tj -46.6007 0 0 60 1150.37 1934 Tm -(17.37 ) Tj -39.8763 0 0 102.5001 645.75 1108 Tm -(20002214972025122214275302970160 ) Tj -0 Tc -55 0 0 55 1229.75 1866 Tm -(4 ) Tj --0.035 Tc -26.1471 0 0 62.5 1015.11 1191 Tm -(NR. ) Tj -34.7737 0 0 62.5 1071.92 1191 Tm -(ANEF:0001 ) Tj -39.1032 0 0 80 1032.65 969 Tm -(TD:00064686 ) Tj -33.6323 0 0 68.7501 1086.64 904 Tm -(CRSIER ) Tj -0 Tc -68.7501 0 0 68.7501 1220.59 904 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw"1 2W/>|n?N_#g'/fOv?|<m6IxgYs>8= sXBE `bY@J ,F6*İXPPX@aYDARl I&Q`$Lcan4XX DPP@!PYa -@ -IeB(Y@5,ڟKKKK -e, ,e",RⰨ" `2Qe@Iq,e$H"X Q@X(EbRk깎",( (PHRB(", ,Y2 -( (Y`%YJE(@% F+"@ ,($, ->K}&-QeX% -J(!,R(" -@B,",)bX@,V$LrƀJ1(DX@E a,ȀKP  ! - -J"D_]P*, B%"K!+$@ -$X I $KUfD(X@&XQPQbJ" -BJ%(B EEQ`Snq@.%A` XPED%Ya h -!(. "Bİ\le @[e* - `(X!RJ@T%`QeReQ,K( ,gofń,@@J\r%E -@P%T!WY *n9bTDV4,,K Ae@(DA."AF+%U6y%X!`(e%DPK!`ZJ @ `,@ ,KJ[12x|9:.K#_}7jK1,BAB, !H.%JT0(J%@x=%!` -J`cBD,@ J J"'SM.|Wlx+_厓䓩zaWhqz9S|9k7ܚeҽuNY/w@ V%)Hc$$% BY , @",,!(BJ1AJ\rXE),G%^[>vm9Ώ>ћ˶v{7߿Mg x]mOv]>ϑ}vDvG-v%\{vz~2Km<=L7 -`F $(% XXEE d%Q% `QowI$PTXI,BKPe'&e/?U__wq|v|?WKs5;E>=4[Һ;c}=w5ڗCKFoe|^}(Q(AXJ1X%X, -,B -JbK -@` w>' - $,c&6SK,!7=i?p{%}_?||bk>rPDHe%gDjr1|,,?-zZCOgkK9{;UgrXX%(E)Q,@ק,QX( `2ƟKTC+),E>n1d{ZmvڷN_TNףsjQ;7+-Ff,ﹾQiwRWu:WA֟qFQEo9ޗ]!w\6Ggտ/n۝9^#ԙbJD` DX!a%9ARbfDQ|~b,K@!PPb* ,,1gqa N8궼v6YE1xCwO}Wwn1~xEXIarƉ`J@%DDK"#ĥ%B 辟1c!(EQ V)VY٣MW\*e,dp}.P4[ /Au>pvT3~/G!>!|y}v¾]KlmCs^S:s,?o١բza}$ahYbK*z,@ q*R`@!RX,J1YD* ,6YD1J BXKH( Z?&_]Os~FXɯhS}zl;/X112He1,Ɖ!,ϣgY퍌~'c|ޑrgSq~ggߍJ 9_/Wv{-NR%@,`H. 2 ",XDIDXPEtL3 ,* @(@ %B - E㐰d$|~ܹsw}z\/rkzw|Jn\Hz:mo=T rÃt;Ovs,R,*R%-J `PAq1DX)%X`XPTA -'iO\zksvnNj,]Yq ww&k4Oo|Qy]՚<8-ߢl>/nu98g۟-$1o;mXX%PX -bAbD `!n4 @:1 D,X%X@TYAX%(ETAPXX<ޞD?5f]jx~]Lj$ןχu2}^fϞﭯ?͔i{}/A\eG)Һ C݈6}A`V#&9 !XɈ -J%YD BLP@DXA`IU(%e*`TyΊfo,=_AG `Q2* BRن4wQ3j%}1|ӧQxu>-v7^xoazokx|CL֗wQ"TD `X)E%K), *R"@(9J `JEBPbi~Uha|qin~~n?DiJRW -,(łR,X,VYPI`*EƉ`P(".%BeN__淎vY7_彧8sݍz?/7y.a;>[sz7+~Nk+uo~]|a\~J7 9^Kk*y/dQk=xaaƙbPBXKP *J X\jP"R,TH`eR\h, ,J%BaB=~O8뫝t$6rl>M&Ktۑ`Y!bdD2cCLe槢ys}Ǖ.9n4,",Wiyi}F)].qV=N9-3<}7!G7+˼涇An9|} k7- :GuKvRKA,Ee .5@ňXY%Zb B BU@Q!X@PYD D\A -(% BX* -B%%BK+{k>_?gz|>~SM'ķ蹫5_Y<7ov|wa\ߞ?>,z=fI.׭Kup{ u+S0i0?/f6-O_O_+קxOmZz}Et&4 P%eQ a`E!RAHXI`AH ȒOP&}: [(|2t9w*z6F,MnEf۞K|4z90%5oP ?*cB-1RDQ( )PQB,!T DQ,S DX% `XXT12XGDc^KIy -4Mܫ݅cLK\B" -*"İ -EA+@* ,, -TBPX@T( K , (A !0K> 3f}kդ[xv).cDQXI `XT dX -B -X aAHYa X -"PE,BPABJ@t-Ls񞌹OLticr et xry~[מ?W;6|ZnY2HqΖ'qÚmDy<5kbRaRF  -iA`(*Br  D Y@K( - XtꈢL ,1e%,KReA`!KY b%` T@q cJ  -J,XI -@ib `Q!n4 *R -%HQ%J Tq`Ya% -EUTJ@%)BUE l, Qʴ@QR ` qJ@ Ab(AR X !@ -""KOyl<ǭy-:o}͓ܛ;֝S<^]] (@ BPA (,X*JJX.XT!  ,@  -B,Y@1,!PPIA Q(X,DXKs]/gWLm{4//.o^+i=|=;.ǛO_TzuZ=w%Kts{Rʄ K"D) -@JK)@+E؅XP%@(X% DXPX6 @ \Y(qhMNNx]Ei_'ۤˮmuekwv&G5U٧ݓ\]+D*,K  ,e21\T`  -%XK( ,%PPBXPX, -Duȓ(ARX8˖g\sf_Wg?Mk:k4u^D9ksK^oaEE(,BFH+e$Ʌ2 ! -ADE@@ 2KPBR,%Y`P\K - KBX*Q,b@UI1}>_h|>*%[ae10ȸ$bO>ώI|_=I 1=Of\C1N{h( b Je` - ARdXXX!AXT!PPJ)T$GݸuFk>#vmqVw͠Kui'5Jϯתcsl#gG?1Ot{>f;ifu:o⻎ c8͞C~w AHX DP(@@ * -@e H - AEJ(JTuhU"ǔ= }r]r\f̟L>^éΟ]w =W^O?vs,9Nz5p}vg5zD * J*P. XTPR a!aKPY` -[A"ZQ,0^&γx[گ1z8{u57mqw>Y9lMyr']C\{;tp?X&P "`%%Iq€$ @AP"LT* -Ҡ (*`1RKr_-f_{sg^/kϿAl~26>=7 };a]GIMG`iN_mSMaKK9^myyްhw%%(, AHT@Ac -$%dX ?a^s}+\n۵Ԕ6YjFIqMK/=M/%&-a* L!cK'<^>|ޅHWזG()OIƖK@b9Ώx>g-_ui7W8jãQ zs(Xb-@,"K -DKq&RUcqCgp̓/A yM&?PK 1s/<OD* /1Oh(x^LyP= >^ l) `@DX-1A,"KA@A `""*\ %S!/~Iƌq9:wد/Pz>}XM>9>oI4MX|[kIK VXEe9BKq%V#&͆zMmTA l -"((@%(Q -Qb()BX R-AX%&+}wDƢ_B,XD,IX n a%J1"# Ec5Ts6oܛoohaatFVƛ6[pgRXRET@Aqba -`cJI2X1d1e PKbKi!VDQ%e(RR(( -\A2a2@K*,K %cBYKc|?s퍁y<ϙr偡q/u BX,{u۝Nk?_ΗM~{}^٪xwkr4].zMLn1Rձ!X  -+cPP\BYH%RPPa-PXIJdm`Q*K$ -EV2?9hsGV7hyKw'UxK sOٖm?CgeL3ͦ??'%cp,Uz<{{9-^奔:>vNSyޜYg5j='7G?f.l~J@Q!P\B @, - EAR@YAX(c"(E%P((KF4$EQbuȒ+9Og8ۜMjuB{Q|3R(K(B5d,* (T -E`)E$J@[E(,*"iR9I1XIDVgeѭMoUuvRu7a֛q,Sb\8>;g˞%NggӬxΡr񽆋xk~/i$\l^[>L2!!AI,X*RT,DEH "D -D U`)``!T(XJ,,iPI," -ÀNo,u6z'^ ]$cD:+KdM^h7?Y^?VR09̡e!% B!ahARYq?3}DCt2 O[f}ˮ o4kqȌ5ѧٟdxf}<E?|=(}=mor6jfvM^/h=8,r]-zc\o3BiPvX e@ a(!$KJ1!%BJX+&%B>qꍻO2A诓>?_!A鲯CG_T|/HeEHT,40O0cizgT{c5M1QCgO`d% pcBX -;C8I,2* $2b+R(X( (!@ @ alE,TJe!,X* -c$X MsϨs%TE@K PbBX\K$2 HY12|}`}g?M7Kt_v~}:_Flvz5SghX][M_ס>9h<[wq~i5ysv|xO7ĠTQjRAD -Ƃ́ e*P EJ%RYDYDX, %Lh,(@ ,IeEĩ`ATW&8IIX ݯ6-. tpn? 6^gMt?קyfi? ->op&w³fMLrǞy]_!gWAI] οoSeo]VwKoq]j6'gkt9ӪzF7~M1V:yΔ|;CnOAtKtD+r=A>hw:zhK%I-Je *PK"JP%",%( 1UIa|߆oU]MUs7+[n3 ݬv'/M%/m[u;Gy8/gK?@}Yƌyiut\ޏuafӄB#o9_n宗~7MMkpu:73˙ϠʴNr~#x.Cb_C?eQ8w_\ӝ*~=v' {\fX D-DPJ an9@E -J )@J BX -l D)x V˛凃gn5;|6鵖/ =MEGǀ3ϑW+ivX:]N]}s6eV|umwWWך㻏 -GmM~V4^9ߢ v0XYLXPK% d4B )PQE2ƖJ1 ᑕTAR 4YOM}I7 6W>_B#mqF+Xϯ˲|:95ou;ӧ=5G#~+E}W0yw$M~߿W $$, 1Y@@"\@(,1! e -> 'ֺ%F>(-[G3KtO= %}t?silf5 :}Vpz|W-zc'ϝ{t7jW)m9_^; KnBΓ4Ç9O^[-9RGc, -n]KʀI "+T ><>cmTo&ޞo,$HX%XB!% -, $XbaR!@ `XUd ?uD"g,tMr_ݧ6hn{;9fzNC֦:Jvw`fqLt_ N_uf폵|4oBuy᜾MMM'=og\9.c)PZ쥂1y<kH:t^#mn8m_uugyv _io4m19S--:wg_m:MKɝ5.$$K (, JcabJ1XPTI IH aPƞ fW],XoeYO&ޗhs7GνOaޓN3zj.7=;5WO涇?m6:랧y{btO_;s8#Mn(('b@qޭokgS<^:6]/)漛at -|rr?| 'o< zh~;=ҦP Z}8A7'?t ~X-P <-Mg o_?*L3<吊$JPNPLr[qM5+yu|vQ˯aGߤp{=ooV3-B}?E^{GwmÓaX9|w-|~[=ꄲe1% APYe(%A" L q*R2J!RX((!@ -BDR( -`@ -(P K.%@-c'3,{6y>ce2u%qߡcYWv]>?W+_!81 \n" - O|[= g5Cs&$%:K/<6Qu|ay$n6Jo%ARPY@I@"AP*Q, e"HP e R `.$eIqP - /s/n1&ppjYwY$~OFߧ>洿~~No]9ޛNGi赛6^.ԕ|NKvuWqc\4vOI=:eBRDXX -PP`*RAI@YL@@P -!R (K()Eq@x<b<ھ_ԟt'mCu[cUxA羋K2A+z|ݟ5}Gnlnۙ~gYxL:ë;ώ÷vn9ޗgw'1q#6>OYkl9:M=gi eQ,iR -P@ZJ @XQTE`,K!R,V9BXLAA`P!`0i~>njlz-^KkLr<=IxY2=mK5-i:{xÓo;>#s])igo/1yk>G;~6n/={oYcG|y~s}\>\onSm&pF$(a`J (PJRP AlX% (DX@Le(@QEDP(TJ}~J6kppS}eflQj~qy&ǫF8nA}v -z(F> 9JC;\I#Ez %cC1ELn%b(!n4J$Pd* -K -X -T% )3Ox=36oKQf_86,j٪k˝8n6bJ=T):0y׃-O̶݇Ӌ?K1TDKq\csĦ$! Ē#2ϼpjߟw!鮕Ѱ>gOspٝƻQu>>onvo,ct˖}z_a^Ha%PRQ,DA@(>Gq^s{#5h{:in9 vz?o䯗כ>]7翠tvK-JϏCG+n 6U\j?{~4jnb;.cY/=ߟy9Gg5\ "$\#7;njs'-]N> bogsg}{9>^.]=Gկˏ!qj/o~wWgEtqy>:5;ItߧzO?yuyy|z}:_棳A%P[)h"JI%PX|wv{%^7k_Oi{^+_U)y=N|;n78·ͿSs.Ӎ_{9VО;FRŜGqpި|=_+嗓tjzcdu@g>9z*K'Ui=yVL|=)/i?ܑz6g_<$W9п?zoOg˪rCϟ>z}]/9q{5Uy>9^.]Ix~]wKsτn=S亞Z;4JXBUJ)deJ B"BsR9nso'GjvWeYz97$k=}s8~׌_}t9.U厓xuz A+WWK6=cR[9Y,Qu|#9N.ߜelNGͽ~sOe7iv'#mPq1r=w(mj4= o;GWGyN;^+e_cgi~>nȻ&Gh_xv=G~+Kgӫw (@X-+- E,7l$G>5{LwC^O]4mޔn>}E>r&د7h0ȉ,(.9PYBR*Q(T -!`}GowkuߞgNAOzu~yܜ^[}frw˝y7{Í>t8~U&u+1lt?HF}!Xc2, J1X@EXI`llȥ(X ((,`PXb(*,J - ,E(Pq圇5EI?>yXx|>I1bLr[ĸH1D^ǩ,1?@rcGcis9<\tqx|C<6[ViƧriK%Q*)br( , -K(*@ (E!@P" a%|񯬘_s<3jrF-Ӝ7_.+_g~n_ېcCpݝ%5G{MSvht^ό#<>ץl}2s;.;Y<ĝN۪~{)apݗ7𮿐x8~7{/]^͒*r-2LD,,(R@("PY@ BU@, ׄa%olu/ <1g#tc-Kc+"_vͶ5_hq7kgiBY˜7gSudv<lz;˅l |8mygyG+~{^}{/ |}MW/&l篯1ʶDt7qȞ'};,}/6K 9\h -KQe P,R,* - -Pe "KX@_x[lWuӰ~_Ӯڷ ? p_ 'Ofq=G+ ; +x8l9~{}zng;^#Wg|zr>_zފ[>[u(cZdΰ_=E#ucw^ja%QY2ƙY@* - JYEаe - .$d", ([+I ?9ؚR@Ia`LqU-Yй=isz+?WQv\o kq>7Nǒ{"B DXB-,r(({/#Wv<؝_#rq8̟L2|o_dl<?ts>o_ךktW*Rc:/Vu(q]ג8^7㺮;|ns/cenvq_Lz4J((I'!qV[W%ޞ: isC^S_=w8jxձ[nIp i#;4ӫxeo%8#p}-Nߐsy}z=ncWQ|i6}W=W无nB:7ɞ͒)jl?Zןu/KǺg>A\JFV%J ,N8ֳ#6CN~اӯ56c{cWݷӓcuu:GjX79gkƩo9\?>:&t=_Cfs:+k=߯'MQTeB'i]xOM-07&{I$eFVd2@. @"s?;Z/VΧEK젅Ə >_xL>1T(%`2@Bμ@Q|֒Ͽչ}Z~Q5o/̿B}6 'ӞqotI|l9,Iىrg TID$ -KB2cD!!RvdZQ(,TX,([!`(cJ( -"A`(ʈBd%횾?l>k9BD"eb YF,q3 `Vƻ*L2MET>Go'>;4:p/^2ːyҫ6a}>i2o3;??CSR9NSX>49x]ǖ%<3Ee((`H* -P% -(Q(PJ*XeB넉`c.%hy;yl3an}o1.}|Fo>|fל<޼]_%FYcK.% -Ee -( -X,X( -, -,H,!Wc,J1^P qVnnۈ[,i}.=>=|]G:9csl:6U%͞s??ֿO9suvU×iw,{ƫ 4_/eR E P ` q -DPXPPTRe",* -J¥Q`cb* Q%~tˬ|6k:G❟{t?7CݢfSN~6Gy?OZyE̹Ooթv`7kq{G#=Q p6l̽U#vڪߡj/' 6 ﷮=M},"r^ s^9_hxy.eUs';Q\h -* -$(B, -J"b,PB"K(Z,aezhY~s;tzZ}|lYKY{bh~qLr<}xw8y a11"Q1e%!`%cj!lrƙeq -!Ll @!@V9X[_k_ "0irÃQ(Kυ10X,kp};Ȋ9iv{:oo!~M,]z"J"lTbq[,lb\DyΎaϝda H -rj=IA'%;o:?'t%|:?ϿAO,VTAP 1"*Z<3)a2DX%5.R'فƣmW[v\2{>]zerFG=ts!ίy(}6ϩze ٯ8ޥ4ߠ/ԑ7|=*^3vkͿIU%XI,X%ox]}~m?6_oe7_~'ZwnO17nw~7WDZvny~]_wg޶w_C۷x9^ h;~sӬ>6Z^U+toxo3XD c,AR,e9Be(1B9Krsɬ(x~7=7;K>ڳ꽲s;Wŧgvv]X>ku -uW4Nkg3x~><~Ym&$i{Kxx>[qb2~ˬOmiM5!ׯ?-vz9-hrf /K^c廔|+̻UtiWNx5}/m=λEg3prWɹ|lnSX@@E2,$J R.xdgq`.9bK(PPz|9eaX1|Zӝ-^dVmWW{.j{4^>F>]x7w6#6@+9]/*-fy>㴿S>-?AX-K N,OϺnk9j5Yyow~sG)Kv5y:睚>q?7w^27rMMYM7˯4]g=]/3}u2=V|1lw>]Fs$xicޏdIa%X@Lr+Rbe -P4J 3/t(k_,={~"" -Ɩ㑒 VT[) -X@X -eU jv̅"a8>7´?>_.~M܎kmq&:-8ܻx=f}Y,<{!ЀL3!c$%XB q,Ā `!**2!A -BQ((&P(*PƖ,UIF9)?9>NDm5]7Gy<ѯn9Zh}a=-)jLe rAQY>Gysϑ`KAD!HKa%X@"JIq ,1BP% `YHEZX3[(EJ%T`)&XD`P[(XPxOx3oηQ/7C:xλ28|?GT>h{iY%jyݮC>o&v}9tx'ex%K,1aq$A, $ , $,K -r- ̶RI`PX,Q1YLˀ8>ǃ8ٶv1~63Υ&{yBQO:5 a\SioQӧz<:W4__8Ϳ蟝.1%L` qI` .%B DXEˈX@EQan4ee.Xil D,JJ(,XEAPrn%{2q8|NDR^#1o=ܳ`%s)py0}>~^bjK5>/wr=g_wc5,I`,LVa%%X1XXca%$U*2!eX(@K -@(),Td"%X(-Ư fPc ]lI8op;&trN1>~Xg,ē(Iq$K X\F6X@E\Ac $PYBYr"* X@P@J[(QRPJ"2$UA ()&P`RĢ5?BIF+Z%(%K!%bIa%XEX&XXI$Ae ,$K(e.x (Q,* -@BPX,`}ZѲk4s`yiuW9q;:xӰNW;;LyW؝gɒX][(AH D A@a%2% l ,$(b.""UIQ%UJ `e62)*`!R, X>Jhݫ]ލOb?c n;Ex#<>Oyb((I*㑣`>YY@@EX"XHe fXJ1bLr b l"(DK,1,IPBK9E eJ")HP@ `(AR%AHT  ee]R!(A(.$̱@%Xc,$K Tc(K(K .# -KQ(@ qW+2RL)%APP TJ,B -IK, %& , ,! ,X@% fX",$b9CaJ"X$! -,-̢(ID !n9@PTK,[( - Q?!MA]}=c6Ore+,r9żLV6 BYQD!b a% rċ 2"K ,$K ,$@ .#.! eDPeQ"j@EX(X[(J - w;ƻAѧ)?8M&K8S[9χiʔ'LNu,K\w%_;g?VǚW9!_#'=Ojsi覣{&P\DB@$@$,K % - A,R( 2 ,%b 9E, @TJPT!(~QzuBip -wԗu܁rG*tzْRێG,Ö.OF4{I;h)ےiC/C}L?K fX% $ ,"@@2b%DQDAe\3)X+( aPTPB$YBP@  V4e]}I}>_ѥGc-VUg[#?W4!r#w~OV9S{~5]Ԝ?AKፖׯYLgQG ۟/pߨvoZ}1K V(E`X%|rQF (" )s((Q(%"(S`J%H(y9N^#'7oĝƮgovT *.X_ ;PzMs8`10 c3*1d1 &PŐŕ>w111QX2,6FBd,dR(&9-1d1d0d1XYi!&CD 2@R,$U"((EBRs~ft[9u_=:?4*5~{&{s\ښ(e,~":\yJ/7mztێfOи^넮ELeM_K 9-?,1e fPa&P(c(d18a3,(E1e Y,L>_OPE D1!Z"ee32QE*1 Ycm1Y fp}a}7|A}>o>OϬ5U[2X " rĄ剌L! ˈ@K@A,LKYEe(,rTPP!(ZX*P@,%@"  -P _A鹝Or|~U}uߛ5 -zOƀK_GLⳝSGZ?<^}oʿV?1Oy-ǒޣ府iχL1R|~ =OG#YF}[K"!%$K e (,! , A@YQaJ -\r>` e R(" ` Q@ -A`MG=>'r9g?`~_?G[K`~|:gb^XD]^ tGC~9'_=5lc5.&+9BK H b,1Xc,"@@E1K % (`.X,rXYb` EJ%Q@T(Q,(Al( !@12cbyv - +J$V{}p=.]ca%1XBe K ,$3X @@c, "` (4J\"@YEDPRH`BR61}wvXKדjL6>_/4 -V -K3rTcѝs7ޛJ\F6XI$b1BK eCac2XP#;2Xҁ2@ -RL(J`J,()x^~Ϗ;.^>_h:nT[_{԰\r8o? PgN'?GE~EzKIq",$.6K $XH.$X\l%YD*,"YFXeFi`P`, `X  -P @-}gt:r}L>7vcaJ)N5[ - ?5]q]ko!Sr]ԖDe ,I`X.2@D&9bc,&9BK , %B*@%.R,rX( ,XPR `Al,@!WRh7k/=ށAHIylcRRAMVœ滤Vp=&9OaF2BAdˈELr±bEX1XP IaQ K( )9J%(YKe9X, -"R(!e) -B - Y@@ `(J9٬L,@Q&C1U"K Ia1ĖBc$K$a,,1(JX1,  -(Rc \QlJ*J BP - @J PYD X*+T`(q(ZS`^YRXb$KXEQL(QF3(Ibbc,"K ,TLl2I#>jX-{#+9̭ߵK7,Lqcyܫjˎ91c{+In~-c~dO!eؓ;z|#hs=9a߯dluʶԏWiFj9gIyv/M^[Y :NՑ|ɵȹc|ѯ>AmzGP}zc=@}BJ1A fB2D@)IA(\hBRAAɫy]DYO'qnYK7CrkvC纃>M5 d>?RW@a!%9!0L!&C畂,)I`XPRFYcRP@(D2J q*eE -Q©*SF,AD!"BUbDI.51) KX%XID\JRJ ¥)a9ʴH@ -(*R(cJ`"T( P%QlJ%)>ꚏJ{.ϟЖQb9a?Q,$P "ca%9A bH\jKA "h%$KRDP YB%JfX -@B,)( -XaXAn4>.>OO7\ܮ&Wm9¾%+dXY2ʟ?cl,uO4{~V~y-D]fi;Jxx;q=L{qg,1!/9?ߠ/1bn>?nQe@"X@ P@,ERX.4(c+FWƖU( r% AI(X* -A`#oLIڟhd?39nqJTG2Pb l>sݿWY1{jsޭQEpWq]t<}:2W>%<޶cMUv<_lr~ŖT 2K D%(JPJYcLR,!`@ `, (T7厏ƣ/AƓ;*r31lJKovh{N+9LjGiۜО?ѿ2$AXp]'%_EhwYu]I"ˡ+Zj9Q% %TQ%Q`X FV#,( X,","YH,BBy=|~x|><ޥ7%SnM!n5?ij5zNC݂Y/9|~y|j=IG?SJ,%uo}!xW`%P," -,,* Te`"JBA` @ƈ*P%Qgכ796̓I퍅GU>UY@9 ԥ E02\e\D'cL@|yDb}}$,@ @[, J\"( - "* (X-$G?9;rK߅r{_/rߡy眶L9YeO?LFtxN۝_՞@kXtX/NG)Fۖйܼqْ\eK (\iX1XIE EY@<3eI BX* -%"S.3=^OT~ߕYT}/q_t9Bۍ.XӗGLYIF٪ 8ދt}_27gZKcn;~/[Vve~Zmw=-V>Dn8~GEpqٽ2 ,I,,! I`Q%Xܱȱr"a,*,!RA@L@(c"X[ /IS$sz]=^~owef/Q`APP(cae` B[ -%*Q`B@HPK(rfPT(:Oe"U(|y~H|_\IP>yXL3G͜>O-B ̆ EDH"J1e@ B EXIaEUÉa -Pc2T(% - J",(J! -Hah EPMR'5XHdK ,&XD!@c0XIDX%IF8  D,Lhee`@R, ؞)3+7>YC6Oܦ5Ԣx|k f{B.O ۼ^¦&WS=<#e,?>B,-}̒}<Ǫ>k(Pr]39JK>ezl`|Ϥzv$I4P&*-\llytgI5[AX)V4n!u -K2rSx}y|6o 559`i>l=?:/{7*#U貭>b}#_69c.!pZE?]4^͊|7GoE9EO&~9}eO7у/R>>F{_սavj,-es1{u"ݎ)VGÐVE(9F Tb"{g3KYy?s?AH>}|jGCю;BE뱭6,I؍ D}gUGM7C˝mkt89jFsvA%ucQoO@,T*X(e( - qbsAbQ,"aq* tlI_/Nȝ-rz]h?gg'4gM~qZ{?a#?t}._~|ly>#,u:W=_r[_^}4}5"?KW>4~Nν~ GU?'A&6/f 2u~~9F7~;h6:iwZCߐ~xˠk}in[c/k>?-J_ɿOR(~k?~կjo!?O%Y}|Uܗ]7[L./埴/Mzi*QaD% )V #b B `@B"\A~%oA_O%uz~~[&?3/u?5/e幎Ngtu{]m~__~bluv?~j|sOEs]1ڬhK5~?woh93yݟ`z-KK;⫤OWՋp ~1?`nөOϿA,;Dêzs궲}1=o;ߠLMy?=o?$~gߘg_.:m~W.^:.w7y> u|U?=꘲*U -`-Tplq9BXT* DC?j~˻nr=w$t t[Ge^Wy9/lu7䟬~N~ig{%~/Oggj}v;O[^Uyo/~rw+6Z͙4xw'uO} :펾<ߚ~/7{9"w?\|~i?? mu[s]>uk6gG_az>>4?>~lknλg[V//#~G_kQ~g4?gn59|oa;9'E7<ힴChuՓ9.MT",!(" -(JsQ, REi%~cnOgr2^vn?8Y?g^cy9?2~W~wr~37eSmޝNk͚mƖo_7h:>sͩco4#?x*b8^O_?JS/4_~3gZ_ϿBSeo;3r}FukvGI~?z}>lп8gz3f_Iz?Vx{MKe?;?kuӌ8?`zS:ⷼCu[mYu|Q.j~?HO?d=͊"RU@XJp ]s9԰ ! ,7 -T q[ @~3'㚟z|ntۓ<톶L6M?~/1iۏ4;r'CT?/dolJͶ[7+$:wkm5Y]Aֻ٣َk:W>~qgk=_?k6Zz~`*f6+=gkmk29k׳%sy=~ֳγW˿R9&Uh7[o?ٞ,~?鿘~g~qG~ׯs+p9UԝMuY-L~k?ߴqR@ A) BXXp [i,I,K, $(yOѽ/Yhwy>:}v\y]~3~w7ߴ/1hۏ_}T#_.kmF}_ѿ6N{u65fYSsiۙGr}w#f8:C{g7柦kxsy,2~wkmΚk%s}/:kf1y?20|ޏt:=?5lu?L>ǿa{S俬~wg k/~賬y.O3xot4vW+_i=߷/~'aVlEE!i J> bcibI`%(@ 1L<~Χ75}<[ɯGSϺn?7َWKh//?s?9:>j _?F_=lonRͦQ3ok'I"z:s=fðY/? t=Fq.G,p=_xpZ~"]zw;y:Zr׳,矠}ݙ\wagz^]-C'׿#S/9~\ğH6c=~]~q??eoYʿVN[Wo?9Ig_.K+orv햧GҝIrOi2ퟋ~}ћ`dP -".%* - C6.Y%%BK ,<ߎ~|{=\Yȝ7_Qudcm6Rg~~stş~Er>whwz~;o?F.裪9MY|?ۿ9ǐ37~w]#k@4WC?03=/ÝG͝O⿶g9~m7zMpY:.w߳l=X?JqFQӟjcgOǿ^Y~W俨[s}:r}g%_r]o-{7==>~s/}#y~mO_ef @X@PP@1qtT@ HBXy?C~{/l5iw2~5_k?~K6ڳOyoǿbv_>w.6[R:K}QW蹛<>_F:_cR;&2k_8p_g~}:7I~~.Nsο?AY4ۓx:ncgls~Kͯ?!]s,| NjO{9y]ޏ|_b};G_̦7״TS_/]}g']/_}0ߚVwv|o`a]$l:o9'~y~70ʺVQ'?WyyAZϧQɿX7;*ΓμmS+tosau܁vEο7?4W%,R,e@,QeD0t21Dc$XXBD!Ry?MO=/|j>_-gSϖQ?A{Oοh[t?G/g꿏~{g?o]~"l7Z=Fw_~oznkKgYs&?f9NӉsy];S?BNͧq~,~Ƴ?,g}Oٵ-noGt~-G㔼~iwWf.覶^>Kǧk~3~SxcwO?(}gQG~yG⟵K~u\5m:p7<gƟecW3a -e(RPR(#?ƤDD F5`%B\E_w^5;/הc쵆;m>sừ?6ڎ[KG~su\~A\~淿~7vahN_?7MIhƣm\'mǥzm۩}IKoOw<~hGItGjv WO꿔;< ɿZ?2?eK?rOMOx.|/gS;?V궙~_]^ _ƿf2Y ,J*ETGOf';%$AX!` YQ`I)x([mNaFUr}g(uZ}Ɯn5;S?i_ntg_|M꟏~~?z~_i?*z.SϢh7':|A/c3Z ?ƿe9~3gtv|^M5~y?-7?~ɭzNSN_ڿYpz\Wcx?ͻ\{$~E{v]Gwz~^)?i4XO6_p]ߏ~_s=;v<~5֧?|}>p/_ݬ//ذJ%2,D* -j˘:cpKqA -c`Y `ǃ?"C붋9\^:6LglO?B?:؎GK~mu\~7'kp~>qYyMΝ;_ͿEz-^GfVɰYNK:oFlu;}a&c6€J *"X,@X-1![\~2ǖc"XBT\A @Xog}z]fg~MDJTI?q=LhYF2ʄK,,(@XY% ,$ ` e (*P -T$ )J2U -%P@J@C( RXI - - *,UD#Du9BTB a D ABIPK "Xl *dE - -I``1l% - IJ(X.4@E*R"(%BYVe.4@L3}?us) &RB !"*C)%XX,!PX!2DX2TP,ɍ*C&0̀ɍ.X $șAA -ƕSg0c乾d>c6&4Fl)H2|2S& -ɈɈɈ2+DYW`.4 -A~Hgig:%ƬbYAXd27}1ɀ0l1>}g}&L!|`>}&ɀ0.SFR VQqI 1b,͍2cK|s2\Cd>.lƛ5q<b\iq"TPBcLEK1b-dƕɊ pFWL S6>c;0K/GY1913bYC&#) -)!bd. !@P%QQR `_BuX_jSk6G ]8h,=>u=AʺnX> -:Vit&Wacomuo1 eX X,a, QPEPPX,!PXH_X2tk=$(c2K, H9@ -IDQEYIP,MU/G.l}s}!Ԟ]=_sYg]v}>YzK7:Nӳe~otYil}4=Zm~_6[߇Yx=\Kae!JEPh JPZ pb~TW=XA,P@(,(P{|Z}m9c}Tr}^m]FY4oYٵ&py{m<:>{_c<='7_>G{֞W#U>?E>w2ar)SCD>o0}?1<}<ފ ",,RK -@ 2JPJ1X>_Lȕ< @RTIeEDXEHP%X)%Q%BQ(#(XK(,&PRRAHX)IJAqQPK2X) -A @PXJ*1F3L2ǝc#j@,Sƈ,1Xe`B("TD,Q -@ -ID6eXKAaK`",X,"A`E(%T(KXJE,X T0NYr@YIQ@@%eAI`X@J( A("P%RPIBj qHQE (KaK,2% @`B.W;0\@K (%LB,BDQ@`QEP)* -R,XYb,ȋPJ$(B @a@XJ - F*""P e?dއ=LrĀjTAeDDKJ%)(%PT,( e(JBP,PB `R,$ ,,R,%RJ - X%Y`RM?%X%(@%PJEF4HXQ, -1e BP e -XXl,TJ!@* U"ƖQPYD ( -J!LeAaX҅,,/Uˏ=bD%$@Ka,,*P ,%SDApylO]CFRI}OmNn}.xk'_?qeijOdIq-LTKD%`X,QIi q-1TAB(J ( ([pƘRDA䳩xi6\oS[FR1D2}=ZlOh[Y_{M,M_sOU쉭E_ BP=#d.lDv}ڙYMgk? izR}^{ }TG᱇2/4 챜l4hYcO3矞^ lc~:YQaF" BPŔ%e% @( -eP -HU@XPVT*R ."P PK(AA% DQA@ DRc)s` n!׹>W7MWϾY9cneP֏ˠoK:ۣ)@ J%, -%HfF4BRjReU)$Q P&PJe))|ᯫ?|=OZwC˦m.AlOk5}oL>CK=f$w>Mzb>]KIFezϰ~t_ʄRXJP@(,((XQ"!( @ fCͩp=ٰ4%͚=fiԝfnuon^~b:e/ǘ۴9]I<I}7[IV''L~9&9b|ymm~z~wM>s/;sdUK}z>fӢc^_=Ctr6~_O#ttoUɯiݛlk4z\NL=鬬"|%~=EQ%z._齞|\^~llu}-T=lyIy|O6}~{]9wq^s_%YBTDK!HBTU`J@U*P.%J -c@@R`Y@%, XYDWt΁>އ l3.xzBkI}8иy3pCmt?19n:^k]YV\?o |]qPϨŐ?>yeOOOA1d"Ri(Ed$(P@ (" -K -{|u5yj~f׮2=-^iK!,ɍZ@#(b``&P|x$WG{SO8-GWל瞑tܵ|>]s-tZt[teձ#/_θ-`A]_'i5[Ij|̜Ο/WYB,KBR,-PJX`(kٰ\=ZyStngDZ0kniɻ:aϟΧaW>pekt82Jyosۨ|znvMg]Mi*E!`AP X, ( ARIP%5?N/7gaw\>n{}^>;>^ѢjA%}56hwR^emOgtzymntSos=oO|]=^n{jqps9n g_ɦPgkM᭏:Nm~܆GAez{?ᮾ[k>U^fpQlCrByymϽ溳e} Σm3=IAJI @ -PKeP-@%,bs;aeluY{yڕ>4/¹CNKWǗWukqի/_^]x}M믿դ>}Gkvuku\׺5]>vT'ի_ }:K{Fםfk:m|^Ut=qm[}Ei3jQj?Ѩm?9yɣ~ ᜷~_SC囖CET* ( -K q@X aS"J$I2Ā"jX@b6dŐ%#"Ϩ(I<3Mgv WL9E+n!ӍwM7K4}$s.zMoFC5:l]SQ=KgCx ƻϼۻ&O؞^W~~.徾?R{oXllz:c!RQQ,%UY `! -Q )7w={ggs#bmFDx9fyAgM] T֞q?~z}d]&}Nm1ϙ7^S]&\?,-:|*1 BT s,,>W8|y|OS#Yq[''ԎC|~vx:^`ur}Fxq&fFwNlѝX5E~:c0R(@)`He,}6gYYyQǟ?VV(ZƖX:c%g=K2%R%(D@! - (P\>ku{ nKl|Rycf;?Fu5c(h7=~<{oٸ;.:>/~6nej}U|}O'I;.Dx.녳kNn_wAe 8׉^XO1jrWVmXE8?:ڛ|~O@`,L -(KP&Be JX ` P-Atۍ=utZ%&Xҁ`JQ( D*X -XBsIxku(?3QN; nYUgjmtXՕuz񝮭>{O'~q zmWs~&۰Ǜ]_׫t['aofnN_@u}AP1CGʼZyt=ly>*u\睍Žμk=Nk~L% ) q -PB(H D,JT,! -JJ -EA`P -In5lBX!I,Jj f}ϤE #!2ٌ>TB㐜aj~R. >Qo.|>yH('Z#x`@\2%zkc7ߵxu%klzDy.^577=W]W>\tm6ZXXWk~>N=Ȓj( JE%X(%DPAPTP- +l]grK˧z =}6:rv9܁K~N -(PT @)RX[Y` D,E%X)R"k4{ O]_'qo[iKy殟Y#uNϊW ذ@ PDRX3* P@FX -@"Q, Ys(a ]R@%Ƃ ()%b@ `PA%Q1`[eP!ReK nfi=B?cPyp:ע9zuoMϿ(X(@e P `YH**RX- V4K -\8NNr")(TaPJ ,"R( , -1HBK 1+3z}aOd}lT`BeRUl -C(AR[`X 2 -\{j~f7k)"T(TD` -@H!HB3g3~ӽ0h;/r&3%Y2|fk;>-.x?gg X,\J%JE (Q( -RT -D(JJX aR~}Q1=?7ז;̼I3:ruQ~2HT )H -ETP1XY`X,(% Y`), -5?8d?,sX -` H -* q#+%JV4""P}S)ƽ/cَ՛_H,<DzhU_`3cJX(*RS(XQ,(%K(X.4T)eX.4_ҿ4x4o?, -%KWB -(-"K @*Sŗ+>k<fnQz>:_}\c}w's]]Tn9t5>}ٮ}5ոKt>ku=dE=WWY9ⴻ%k=oV=: &OyRعjg~) pi@!bX.4 -R@D2AeARJR@iW[p~QvXTTPX(R( ` K,x}zNGfxu|s]/.o6ls~{Cy:7s}?nvU.o-7{}J5^En֙yM=;'Adl~nSkZ-;o^Yˡ\[]z>/Ev\]{͜GtycZMۦ )m]B͵&gur.6[>~ -XR)(%5 - q(~gg:ql[j{QJ1aP `A`.$ -c!bG[u=:^K|>^:K7?7Ǫ;3=l.L].ՠ}cl|SfB8|lu?|3gOKm>^ Mfr~==4_?ekC^^|J>z0'ҟj},|j>}1"L \m$:|phg׻{\OC\e^MNI=KiOauȚ|34{3+!@!*  2@,X),w8ɬGÞ ,U -ARgaꚏqy|ٟQ lm}y+A/og!tV^u|FVT|ӧ]9΂ft-/:ilsr:Sp/6>_cAE)Zf>_UO^|5[rnֿgrW{ -RhT (\h APT'ages԰T AB㐗J YGUY4z?Yϡ:e跋n{ͷC7|t:'臛4u 7_wo>XiIt{ -=gl%M#4E\`P-$` %,ƀ, -ADc鿚jq [b9*RX d -b`% Q*؊Ǧh,iwNys]Nu|yIcqƴ;-fs4GYf=^OUtݯ:y\H]ƫmt{7۝>t}}w||-i}?ˣNW,z^w-YoߪK}lFk;<}uYzu}Mt_/7Χs|߯ ƻcO7/yқoOaYZ|zcO\=z;I]gdt,,$ (T aTa鿖Y2o?d礰S!RX,!R!Pd Ǜuj2ϥ揎ᮮe.Ej{=-Ͷo&uVKw3O{c}Vk} }ot~\/gcg)>_hqNZ]g=z/-iy|=u_^oik6͜zWӎlo6tOh Bq!b R?*ӕI9J - -`- tlM$o|I][:O1䮫uf7Oo\tΓ/N7|U57_lZEt}:>8}GWϚO5u<şv^h7Xy>9iM-)[w S_FWΒxFy>b321e fha/Yl0_(cÔYyK}IaXX -ERT(D[տ$ӘGLFÖ¢B,,X2A,!vڍgѲz=Ͼr!3si%ߞq}>o]|ۗ6}4g}ś3^sF>g`T@K(XʱDd$d,79wѼE9,*RT, %K -@!=s7}&^$ίϴkl9,2KYOuʓvݝXezKvs##omk>o/fS;-UφNck?mN7ǧiKchwZgI򍏷P:\_YR! KķʨAAHRAlLCD*L ,* -,*P - *Ov/ͤsii%leK.V|O>(h u4ͥ9-/V5<~ʚqi8xSU ExѷK}=MN.|߷6-W[=|E&Uћ.~嶙~jEfy|Ǫ|w1뫝k7yk:~iJ@("%,HDLTPx(_N|o?ÞHd13e$+P -ƕIDFXHd(K&Q(RY@ % "@"TƁjJ -q<}Nj>V8جp/c<5=Lޡ0Mֻ#|~qb QJ+) B!X'~Uύ6J)I`K1XLC$EEQ JR qdƗ .X҅@*LX lX rJ1 p☲.,<}۵L+S$,,* - -@B7_jh_6 qJ.4   (22! -e1P\L ȩ@*A!BQ,, -P$2A` LrĹa@e%$)V,€% ,,X* @,Q~S亚Vmۆ\QD !APP"R qb,P2ep\h(\h)(PRXՑxٗ%% H,)e (, EL (YE `X2J `%%Yտ*Ұo?gnk~YVYaPYPJ%, `cKE(YB¬cKPXТ\r -Q(dEP-XJbq(%B*JAAPRA`E]'j} 5oIgܟe?>~g~꿡v[>kx})- ,[,"*P -R*+&6* PR()IB -RL% DP T*X,!"B-ƭRJ1 , -%,Z!`6)S6X@@| T s (|z/}g#O[ !/Ы@3DhX C (Z@@1J @@, `($ -[F9 !04@$%1235P"#`A&6pBCEDF$c@YƊ0:=+S ]mCJRtWJ{'##_䤅u1( %%tAyp9=ξJa*ӍtJ^\曋!:LwΌ)DG+3V?Ӗ,XړldV4 ڬi &j]J.o\Ʊ1vDŽJ}a6R4p,! -G.t\G3Bt\>ZX·0R#@ƑVLm #m~Fߖt6?It6vҍhCI"Уjӡ(@ƺ&k\:πV{'K-4UK+:CJv; @|0SվsR[HΝs3TڲQmwgkHM0MPRS#@ cX @/.u{h:6i ƓGS] hBuf5@κȁDkkpγD=`GӏJO0ޥN!zOsIg庙 3jTKla֟}(;GǤO=v0~_>aG,xG؎w8$ }y<#?>HTmACSi|qnOBt<:4`vU_*"=^<\~xyNNi{Q[PROO3>|2tTTo!2 2óf/ƒS4&et5e?? [On3f""t<ԉew+ȿȅ4,&"#lm5-0CIԩE OiВp#mYj%.I1U=K}FMz_t 'O3N^? U%nآ B9CT}iv!㹏GW9{MmYk[|TR+$͹P:W6nMX ;3qTOjBlƗw8f=-Qo8[qc؃,ʐ-Yun@T^d|q^C>ηO8$g: ֗ot]Ki=pږ ?O5DoJaAaם Ik v̅ Xj't{w/Y3Xh$;$ȫr")Ȋ#? uɿ_ѶǾޜWVDݘ9Dغjg71m~ou.G ]9|I: Dtr'Z][^>SOIro Bg\4x ЯYT44MN - b%1[֔fpW۝vQ)v -8YFTF+l!(,s&,6KCImeq~KCuS"d*rCq9K4W 2[`7k8iԸ8nRXRIlu9m0ɇTԪ!-HL -V(*}ULi4i"-{OuY{9q4<| -յbE5 ve9x;4aHYw^͊ -BGIz;j3*#!l$(3:γNasNHCi]DZXrJB !LX6cLKKx,\wwv_LǷdEE9k6WYi'ߨ$}P[ǭWgW *_, -ZM\r FapG /Bp!]f)!:gAm'<;;G UAk?V+~*Bnaį\Bpu ᝷"!p҄Dܧ*yHVij J PcrW":ݮlRMj -^`HLkT?K˰#3b_Ns'C)?LK'P!n^+APp,)`]LU Ji^o/}DZ[װZu`O CٓR1U5V}e~[kwxZS6_q\gܽuݔR\;>"Hpp̝;,@p+O#B ڿ?6Qj"  OKda,5c(~.\r5{1ucn:hKq`t ?Hx;"8j;u~zf>BlyY"R-_O"R죇Xy=/r~;oدܭ?b6xfw-͓jȋVvjBѡ!m% :5YBH0"!Fp'VaM׭At 4!uC\v'aC! 6֮AbV}+O s8gICZd3M߲߱ Gn쭨S۔̗.!Yea-OS0lv)-֦T:]tu:%a%Ɣd'*:jק9-,=J7#`Ƨ-Ջ%pu.d 7eyS]zބϦ.w{1m(S-ȴjyeQvos -5x\ 1_o-bJYM՟m=޴bM͛!ص-ncbCFDu5Sq~zn4|V`|sC<3JP:QƺD(vP('@`$54,Ki ̵ɧrdz.S[K_(T(>R׾ճܾFu3$._qԥtN6m нn:䎶#4g1

ڜ@~]P ݌}W`aњ2tݞL1uanaԟgugD:+AqXiɳkGTaބ!7:Lo/\.>?Z;V%jѺPg㹼vڂ!% eb$W>E]Xx;u[I+as'>Fy,UԠɗ>|Nm8fD; "ߛ@!KmnXXO9FL㈻la넕A-[LlҡI:̞6e։-ٲ7 Ej,HmGPN+oVҕ$9H9Z.jD*R{Wn8Zy 0*f5^b [Km).ۧ~7W#v71~óEro6Hv.a IJOCAcE͏)mt,Jw`tۡF,mϸzD= E5 -,SYYDu71\UNXLQ"R -#׆deoYXE\KMQZeR+[uhFⶵv+o( 0AnCZ}_&07ӈ~ZC|:w}q$Ý/?_ݍ8JoDRȶ^6%S(C7G՚Ir/taP6W'6mqs2ty RPz[1_Rl兾0X6SM -ۇZ")y[YmІqTCHHд4k>!v8?(úGiw"w|6-Y/š!qk嶾05;܍aXE\1-M*=إu.:kؼe٦m֢rCB\piNġalG,ʫy9Pjf=;50Df@Ci@#0a~-PBVN!~<]+Ы#it3X -qqmEd1ZMRi)V1ave!@Js: $:γu|Aj|}MY=:cZeC.^lꁋQs99|;ld?.P2FiO{XVP)9Ԅ -L>8_LCpCvLыD}kq -BD5<jv`%5u /?ӟAy8`?nۏZX^?F{mn7)N$njBRm!K4;*}92SkS9"1:2tee %]tuk㲡zp,Ӽlar5[#'Y2Dȋ[K+Jy_yPRE4~ $c#-i[ 1[}Pm<HJ{XcGγdsγ:`=:c:'Cuuu==qmg44UN+a -<X@躐Gq)p88>:}&u$ p8XMTu,u#y/ZB!k*BBG -J \VtHYBOZ?юuJTДi':ˎ)R-)89 ]]|ejk.JP*oJ*#Ra=X!?=ug4n*}qr8;),>Jd{np䣢Z{RV+ +H=nP<h,h'];|%CZkHڃn!|gȋh`kY(1Ŭ|Ch-牖 -&~jcuj<.\џF}|:&X%ִgOgfJ!!MN!R[4 S("-9C 3iWJsĝi0H\8?p;ԏB{'xgYggDYVN͢P:RtЍ3%3NޒU$!31NtuCońPٯnZDdm-)`Ԧ%XڳI~e*)ΥS!R"4)i\?>瑩"a:ja>Ƥ?\6[e~;YSa`UWzm v--/Fkօ6BCYMu*aY9$mo7Ҫ0)[6؝İ/:m LiVpX-m-_t EVXN%fIom:r0P 1[> j,wyT)sVP+J2 ʪL&XV j[b% CC=^E|^|H Fmjys,R#=_τ?ˏ rC3K9o naVK;_/XRO5` !7[RgJa/WU[|Hep6 9 #4 -E4G$]ODɲUN1yRc^19tG-іX,jrE;;r& Rᆭ{FY\Kb]r‘*@Nc6iW -Y2igQ":^atRb4%$tpγ:γ:΁v=;6̩jJJF5ʝ`M{@\Xy#Nm"4Ԕ:jKRIuL?F|L<3ugY:ݱ >qQJ V2N7N%6P3)}\X[r%o#ق -QS N`B,*Ty1kJb~s̥ڪ"+0Q4liVkjWW.sCVolN"".JKd5]=%Iӷ|u|1nt|M0$AZI1$Ũw ڹӿaŸR|e[}!W(SFyqS ;)BGOAn?0ٓZm ܄ 'R.Ι [{1r 2G.E4h m -VjόFbX[%P,ُV@m۰AdXۍ &*PzIFC -"ա-8 LUGm5P?n2GHvޘ|PrbN`Ms:0u m S -եr~**jd{("c - 7)r04DVP46JT M*sϢG=(USXn8`E&Of(Ktf e2c4Ɣ@ -Nxγ: >~{Ys3 6NqQҝJtRњHu%&|q2RԫVc6JCARu.'YhN UN[ڴbg-TiVY1a5%mvz뛼@єtԦ]<uJ"eY1r􉍴g-UJc )v -CZuMDS)ZTH~M\:g5Z캓b5/:Wp,v`C(yy2lÝ^M\]0qMKgDy26yqH3O="Ұ%HmX83)ՋK @fh86(*–ݹ. 5nSmg[kGu8&:52, Yꎷt}a"N?8i]ѴX^eѹ;Ȅu(*ar"m/E] pTi$5&2#y Ëy0ڔS&$JJ+s%}ucN6.&{YU؝nsàuq%ܲs>p{UqDxV.f@ {]_sy -2VU;S8+JvqWx:Qꐸ`ƬKGr5@V5YGnCs+[UNY{\DjbzgcZyP4Z28¢Nm5!cA{ͬΊgugYNγ'Y쓠{{utc::qc-YH] ['閎f6ۡWQeX"8ˍCf1dC}qʙ& 6ݬ|U&KoXCL>:\ϫCU1c&;\\@ L=F}utu'JyM 4\HΒ$NZ]wUj{n(|:[XP2}Ty 8 m*M$pvKm`i(xZB4m@iGRLcM+q-2tRt8ZQGx]q6x8t$6t7 EPam tTHb- [F*>$aN$3S-LF}*^#.qlDeV%=Jx籞tt\NI -DMc i))SU7|tZL6@:NFιq)JXd0OEN:}騬2x(d*e2H˧FL6ipu4"4d 4Ii<P8(d&i(O(T:XޙO#-i5`z qĆbGJDEkA;e -Bx>1Gu'Yt8ߠG%F5/=JWzd՘)= +5γáϫ>!s'\ -tlFcXa8JT_-e* 7;G} :'ggN цӇߕ+1ܰZGJikE{ {,|Co:n v's<ci6q|;Kp~ x: LZ?>gͮnÏ!GO6代 9Jj,tdd04u\Ήgǀ x - -f%'#G* 7.Ε75nuk%RbCDQ[sBQ2gu͠k\+Ke%SӣIfͧWяJPIۥm OWVcA v3uͬ\Kp'HXXRGl).ոr2laq%Y&;(@W" -!80N;xOh=kh,v3jb%7Ti<&ءHdlz{4jR^K[V_f5GYb+l6ڙmlPf2e'!Av 이)\(zL[Bl2J F{Gc{855c5 }yOu69unIiO a -ÂAncc@alLX͠C=z#Q5ָ%ٞfL]FXLM UB)y0ᰈ5oêor$.ϬƏ k|=u6TL#_m$n+ &c)pW˝1,.CuQWFy i2٫csFt26K,!I2e4^<*PQZu+Nz>6`|3Ǡ=uͮqtV4ut͹\,P5)\\v(esf1Z·^%9.$$^8j7WeQn3bE_ObN\\w5Hy{ `+r,§ myk-R}kSY٫ܶqr,S1k Y#E ~kkQW-˦qknS[C+I\ZcПF=8:c7IsX}R+W5Zq]'s8j\m*9u#5a)f^#nN>|ckq su(XRu* RVBl=냍>z$ɘ3W/QZ-3aXn3j4FfP1?u}).!/ZeVjBZEe ԠEtnw7DpW~N^~ 69Zɜ3m/EĔ=z`-;OY+I5rܐsZAC<]ӮcH-tm?lyOre_#|WOpMmܣ%&|ʚs[xfW~u|\\Xp]d؃̜U0^njc*\-%9`=F}Zbsv.Bly}/缓6 [jPSg(FH HWUnDVP닲j cC msf rux[y '\- 6\%UnS (.ĭ6$8Ny%N:mGLBńDuSCBU`,L[0ei t,!=}71|*S [*n-i13+ZS)7)8>Fd,˚'<:~2 hMzꑴe W*'HȞCam⤅h0κ8:8ǡ>=ugt(%+e%mi9:%j"K|jcMCep tmxY0?St8֒r8KC{[E yHV#mi )):AtO:SdkA@uav1Qknt (<rqe$ÊLHBS?<|:*Aĝ2e5F [rBUIKuq_Jg:φ}qu2(n%I,.$Eyo7\sٝ@f[|ejXPƘuh}v{YxgYugEZVA}k@:Vuu͠?J^u;uXe,!ƀ sh+\q(cMKei*ZnEMWkB \ĴwBrϰS$ΚAnLЮd 91c51RY* YX*>0j3?:γ:γgD\\E`ko %Á֦YyF ΒMaJ/‡V,ůj6d)RDAPȥٷ1Z1cp4se!< [ R\zB$Ɯe\[0LxfbMk:3e'gY{YuNM'FcZJjH\S]Le'$ܨ7h-@j3l[K(nud)`F;|Q.&;H>í!_a+դOEhDy bjcҒsYƋYdhGbS}Ie3KW&t7/SYX$M D*ɴ ̪=cȐmׁ_T%BA!,FYEHh.OZ]VYm-9#9ɷ9+V딹ʺqn%C{]ɭdAS3e!QTϑۣu>UGpXTُ\ hdVgY{Ysk\+Zt%ah-XIk -^tF6.KT2zKZfN'WGt9ѿS12`WƬ,MyV!Я59yԢV-b5aP4]Kb4>OyOF1>WnSi:9 ii}ڒ+=P6ZRf{e8;+u[ٵKV bcO0ze5"[r^U+H2GKEv*lзM[PkT"cC0b\G"L"-SjCDjŻ1TdYW`bG'M As3&H0#,:V!mfs0luhYa$D_gm W)wWdBjs;QXYKwj o`ܷbFӀƄuoh>W-{.kUb[ͧ;"Ԯn 'pu$ Y(泟=qIiP.L V뜌<)#4EM2 ']z*u5rX: 28BTR -i @$4xWYfkMwB]K9Vpk[ -zjyN5[Ț-K"T\ -ˊ5j5b%3o#y}H_F)闫r<5'[=gyzH -m֋mnVh6Kalqp>qB*a9X22&zO-{mꇠs'YxgYgYNՈ024!aiiW!S)1e:Vx^Uij$ݥ*ʾJר!X\WCo,w3f;W˟`j p:Cel"㹘 Ca.2BaFNi"|gxYggYu:tV4mrAL\FkOk>Hؗ9E -(p( ).a fSOi&3[sI9:/aR Kf"Jm6:%' i)Krdؑ-b QIJ{iq -Yfbr5$"%: 6lSlAQ .*oK\U{B5C5m)#!Z%@qj$~r_-0!-rF'Ōt/a4-'~N%/6⾴Q@@b;L%m6xǵgu`Oco$$q8.pS0 Ư} G_hG V2^(oh|U#spǐԧ:ntsNH%Մ!$Ο8!Ym >OSFcV4,bQ[ShHAsZ.[Kdžt|L:: -:+A@-#Iy΅BCZ&Z¹nA~J[CUcc(~\oЧ%!ƫ!(Bآ؛]$ϔf*8H+fbDŽ ڽ+9gcŗtGD)<fjXff\Ta1`F#ԑՔDiӿh0^*[@:tNm7!Bu 6Aԩhd>DllgYqv:}QV{$(FU 3U66QsPMfOTO_>u[~:l-RBNG -bհ=2dpZ.Ki njyyBYWx-A:BW|,hjN@B8Lx2kKYokRP9*sW= Wҹ' iߵfltOtd."iL˴FPݫ -&FTYmJ[%nw.ETY!mnKY]nX,"$TJ߶!e5 `[foJnUe<ƣDtćlVH+iㅡ=?Ƚ! DŽ:Hu T}md.]*d#Җ7ѰU}(B.bBJE Hi/< DiT01ټ$1]=E]do|i 7O&ϔgܷtR{ڟ㖄-bn VH2O Q#M!RChoBmNTƱvϦ:!,UDZmp6u=p/AWvpOĥhuW6rɋR -7lǀyn_uS&F%z9fm^Ba $CXFqi1.^;cD$*gqib0Jgt}0!/p\6]HLɐd]#ߟƊ-cuxf5f_vCS%LZڈyL]D~l$hm3*":γ z:RG5ձTgt[Z+g-%Lmֹ eI| -AG۬L+k{PqA)4Ɛ@ Hh>6{9<9uŽY1#Df=G]МƥN n^uȋO1#`bapX8Fp 6*I9 nHmn '㎟}ꔍE?γ'YVD(TX[֖=IV۵?q9믤Ҡ؞q -$Ϳ{! -kk_V bpGB r%0Dn!PD iZ껁)+#jLjKUJy ;IĨG%jsYΆ̘ybN>i81G؜o6Ԧ.7 H}bySq4ug)1@L-\U3ޣߜ{]xk%ObVAzJNj˥h^X>3ecm[dZY5ln )0 ---;ze v`; '0h85Ķ"QٙJ-6 -j}LGqld2a+.!Fyӥ|u5/Hۖ s9c.X9[O&p.:v%W2d*5D7m-7|g np5$e7cb,= U`قYy=n&/Xi]Z{" VʡwF&b4-+,-5E7GR*k+ޏ*|s&:(Kuf%7-y"-lh݂JP)I4PcA)*F@qU|"{bUr mYuĉ LR\+ [Da2-mge&MӨ]%*ATR_x{.GJčxpeNYALf8K:2Pm1LtjƝ3b6E!x7[ J`hcFƓιͮa4s+[0lk% @)J񏅞VTg֌u -fKo6V*XxtSwro FڨuΫ;UJ[P]2Y~et3Dǭga>,xȔUTCcWli["0XD']Dy-uxT1KKY%r -]f!+L 7[7 2y_K6޲"J -mi6(9O 1SKS)|IA3\<̋\+n=:~ZUۡ1i;~<3 . **m'MmHQl#uԶLYս/)QyeĴi nyR"m;~!n-CÌϫqO4,42_Hi:":Xdo8<!l#u8Cp%ΗC-:i垵rPkO4wE`.bFMy m)>S{mq_1rs핈{lan&$QzтYe `qi*5TNi r 1JQ0V҆@M~Z}=񝰔ьDc:: LJƐk*V52,EW\Fp$CL*8wVvhg<e,6OZi /cբ6u4ɱt& ܔ4!ADDxTUBRFl$s75f5~zP]"U_&ZV:slveX_P.qS%lIJfqz֯c! -J2>EL8_DLD ~=?_q}IkX -nLy0I5m߷DFR"$fⲕHV6y˖bڷbFPlQw=kJtQ!-m%;-Fm Syo*SHZՀԽ#7Jeńm)vm~eՄXMյ!d*B#59 myHTnOXT\P:/)N^0ӒUk+j]Ԯu UCtҷEذK-U?ak2a\()qQub#Isj -7rd+=4t+ -:uB r3bGWV|;pSc06}Ɛbp#3ӣp:q@Ge_q\b[hM8Lcem#)OGCBz;3qzЈ@(r.T7RbX~tˢɠy[փ+JjeΕŻnK]|L3=2%N&&ZTMIXFO\mT=x9S WX:VܶkՌ9V͸0[fUܾHCJKk$DrWt U`>YV:wwQ;HJR [Aa^Ct;Q䍸< -z}Q=;jէ8zYn'шzJm%1Ue޸>SJG]4C#_rFRU9b88/6Q`ʂ~QaMLY-EH >WhIszhe\mKeJG-C2tVAXrkC2ZMT֕iؤ }r"Z/5 -)`L^V'.ۇ3P 8Av3cw&Ի"`Um}oQ.=QnM^WTmmNtMi-&ψutf}i[䎗ޚy8Gq~K)*#b܈VӮm09[1/ef"Tatr\fl2^Ɏ7p7 Vߊa/L"* -Bb͛%yt7ċk^QQZ5jSpL‰2[`"iƃ&[*y"͔Uu -99ŔC EmMźYix4!#N4Q3#l謾Q %(Jd$5vF-շ-]=Eb2,/fwPTscq} TGۅ[1|C{juLv(\dW3gK\|te3Kzs,E%Ut$Ig`Ymiu{uڤHo=(jDfMZ_R$Į 8\ȃ̆[MIeI(ư=0=BVcIik(IJG5+D~'p~Dv s4H*-* ZV)n9ˉ?ckyˑ_@ u=ni%9[a=*z)nb.LveBML)RByմJ-1uQfiPIԝ.Ҋ("0Nv ~x Zp"Y{ukn-'V(jQ흉cfۑ +}%bJIclI2 ZWC['X*ݍ7VspcuX#7!lB*&:m@h q '}jz RAQt--dQ50CJP.KFCL4B<#3 k 5ӳaܶZaLOOeqRESN +92eP,e*0Ynjg4 RH#ΈAư4N{D]+zIӒkIzΝ)E-M4ۦ#zNiKfU۩rܷng-^K2l6ܱ,ꤕLW,8rP+2".\Ro"Pmi:Fb4&Lktt]E<ԡ o E3u RАSca1|^i*͋l9m3UVϲ}šWnVG$X :f桺*ij\F1m舕km\V&>jM!=\y֥*=A}6-#TK m @0_R5. Q41#YP7`tUXEBPz[l%2&n_jĶwު܊}ԐCK9B#\rjLfOeFYV*Mk~'bU ,>GBUa-ZnEr^P= -zÕQ5)[Xf\#'>җ5@DDM%>qEY]RHRẅ^ZDZ;C &4lKAիWvE\md3q)tv F~PIisޓe>uzeVP7*#,¹q}R[tt/.d "kщeUmM`q .

/'FDD(#e\_ARkum51"Ä\A2 -fG%>FPH踄:h$>ҿ3cRQ2,E÷jR[^ðRgY&ޖKҒ2-ʫ^3gk'uA42fS,M]e,2_;OqVKm[`%*fS4 qdrzdYb Jd.1uHN#gl. -&N+p@IhLmmJmuM: ԾZ9=gD#YtA:}KNp9F6NC}f3s,] - K/YY8#T!j[}=t -ʤO\¹"S1b"K_N_1">R3L(5q٨i,V!3kW-W˅*4wX^}؞^r#tObeWTu -MCU<8Fcn 5[X,Z*cKnaDbcHW2sKhS4þ&Ry6#ƮS0&d~F)VQpFb_CAޏ<3$hsh;6;%y*PmNnq&KqۓKm}Vm -E-,WnN$&|coTg[-Es@ՊU:}+I,!3̛ [ ᴎʰ"[ -U-5)4!Zyǣv8fnC +1XUM?~M.9}K(\XX<`/6zWm-ESqR{G>%pJgU2ú.UJPKi1% wEvT -B蜻CXZ꣨iF',wX3-yڤvJ?LfX/ShOzs=\-}ZdoWMsz/3aDqQ MK"E3$N6#16yڨCP|H4[q -7!vT4K*cii10_qh 3KOXQmBbݣޡ1]I[Sy+kujƙ E}ŋG%V1ܓikb"&Y]mv 6Je mI@D,%CF~ kq\R5l7[,8ê G̗B9lf½[|bGcoNm~A,m-̥jcDžVd#x1h,^0c2\Jp6#EwKlm1VSc!SwGV%Zg܈ -̈́LBk1kNcXדz91ĵ|J" Qtl!o!QU>^~R^BcLҙBcZέ!Vf>4޷D9Ȑ5:F^ujޓ.KA.ߧbO ŹJ u? JCmY%DKun@ҙKT-W mU3r~>e5O4nmʜ4rBqIiin(%1Sׯ5%@92(ݜpln& s_IpKHTjTtrreĠuz Ǵ$Wc'm'+o.F$[%:K/"d9aSbsU3ۧTxXP,Z}y s)S2Zꐕ~g,cT>M11TdfZaXLҢжW&;!Ql͔&*će*HD3C¥qZ>6NUa =Q24LXe"}i -vXuL,<5&3R(Va𚘨-Bm‘n0z~o1Ύ>`)SN-%OGb߳hb)g_J`{8>β ]_'[E0({t!ۉ"<=@P:CeCCl.|<\HZOQH՝SѝZ4U8 ]Z8\Mfؙl8"%s9""#`>.ə>UG`gA()tM6B_opuƞKⳀ_yd'pKZJKY^8˱fD!Ϸ->m\l%)ɃWȗ.ƹY[ Cۙj5ktۻ.JNsOdqZ솚kWhUfE͕7QE3vciz!mWʞ.}w+jsm, 9nSl.`1eo࣫\ctc9U)ě2q Wm>\4-) )գB[ya Do EP~9'O[tWuSt,;=q= }$W1p\l:5̈́96VSl۬"bEکŅus I]$IeZW5 վVaKA62ž9lCp6]aj"EJLQلؓ?!rN. "UȒ{ȽXBO<6 JT~hhh:cu0ۊvտ#gz+B!a*QY1UIw%1#qcSfpMjշ^Ox+{YĤRJi>q 8RMn[!ACqJkO& vIʆͭL_A؏ qǖ@嶸($!iX7ԔGyLQ/+d@n!zT !Iا1vHp䔊u^yvˋ=h5/la}|9†*RaW?xBu`O7)9L+ >u;]{1ImEHcs3ik_9e<8vb2]#Nrq5TʺP«6dwbnh Ern:T?#vy1[l]@?w$3ep-\ӿ]^)HN1PM՗7z89,kPiXvIq#"lt jqa -!mA%ZثaLǵ{=/c;,Ɣ-ʞMC#-SꡇVҟFu.$6cWOۯ1](C00.7Zס(i$v&fŹ!-M.vbzN劈{qKeΞht(*AaBi-Ȯ9Sl߅F՜IЁW%6U$-YICzPf-yNX[eRC#-%ak5`q:ƏQT:(AF޹GIBP8WÚ: V\ -D銫xo#lGsEMʯ1 l-{<;WEbEq3 -cRD*hKsS.;1 1YC~/8P -U H㲽!N;8gg$ s +BK!=rF$'끴DZKu@cn48k O +TډC~]Z߰Huqٱ+^!ٝ6Q -*+r5QyBR"SH^H:)=ϧ>(òΓaD,֛.)XJ%,HϜrb}K,KذX뱱sU=a=yul3PdTp/lz43`9lRr7 S+U3\G-g8pfńЌz a>3:'AaZ'\(uCc\) ͲڷCzz.1`67<#hzSU 8߭Zv٬]aTl8 eSk_SѸ^!Hq%P)y1ٗ T0c"w'rfjdOCtՍJuk坾W;))Rʂ# }4S"Jbo,h$0k#Ɏ}m\s|\H)rJk3dEě KF0Qj<ݵ&Տ򢘁P"J*Q:]pj=7?OV!. d]W+Ar. jCo7eo0L:#w=[b˒J \MTXiㆠW>ނ×U2u[cu!r] dC8=-,GF=FV#Z8q+V':vvV Ij9jyi=e0ClR}sUoopiNa饤)qR+_lƇIgh2ؐnG/ 6&UÓ9ăwV5Vg`Rn)ӥ?3X4->&*vh\m̃4{5V-Bs!xvȲ_}Qj9!)L=~_RCuʕէZiT GQ۞Kr9~qp>Ժ;y -*2cé7JzVq]=8 6O} c<%z_1 -uS !LH>#77QTWBcM9 ~Nm2'H |hp8YfwpԖ%svlSd}4ZO $Q"9̚LXS.OIl h)'KDʉndk0jq]6[F.3> #pm)P[FF#m Gyn6|g|TX{pYE`DG0ά+B3vrbȋRK"7iWL;XdP2[Yəl'bգ3j)ܝBWNz7̯`Dpy 1s*uI  -]jRbȗH|Qc= .|LV'o fz_?ߣ^ejC -F([IvS>ͣt8ZC2om>"lO`F:{"9eԺK(K(ӂ:X0HP* ~-ȩa-uPua.E^3%;=5R 6}: [֏Ex-A^*-S_X"vx6ꌵ1%Gj;i,E!&8ҭ,f#DqL[>OJ gp 4jնP'n$ ZBbP| -fH6|#p0{Db1Uaխ*'Cb`6yiCN_>ڑLz>1F婓xݯm)H~$NX.*3Re׾=pSQOFZ\z0bҽO*RIbuj \&[Ez:p꘍_mBEV!mzC(G2S5ʞ5cԬ+s=jNجaYoVӶeVfna&Vt![o#Naz(74H؛o/lLHי5r`5ei*|>OK8MmK܎;_YxVr%2U [6 uTSX0!A )t(tuf[e Ƃ5\;C@>=g\h8wvդ<,.dBnBu-7Av>ݧ[mb}uh6s"k.ҍR X0_GPӡr$i05pԘ,RRa"f4YQKhN\up2bm}=ՋÕ@|2Nctŏj8(mfG5hJy뭱T.;zK%Կ\}qgrJoe6]Z9S@T m#saZRzuvR^,vdGM nxbbB՞TEÿZKMtY .Qb(=Lk @S2kTU(5c}s^HH;pΊ$oe-m&e^ھRrֆ;q۟G$.X4J ~!5sIb;hYqg*bo{Opt$#W7K.޼إh YZ" oFm&Ki&сm#7vD -{[t|+u~}1m޲]7?G}ۆﺷiy g٬.%Z8b{ 4ŅCȕJ1,'5a E꾸GՕSrX0b&;}S^ѦZil_p9U;c V4 -tVnȣ՟KBV|gҎ#*x`k<8<ON4M:O-Ϳ6-7Jlv;nUnoɧ+/o W[a7uG c1dq \)zc&@tgp21 wnM}7O2''rE16O=ep3j =X n[#q_1r=ӏЍYTo  ۶Kv/ m-(4yYHqZKBFEj@m mCaYkM|D ~~055=?JzCߍ::γ:β5at:FDh>H!+ -\Пߍ8m>ԏjG˳:jͷKoBݭ79.mڍ΍tr/LZPwb"{Jiԙfd(~vP©O/I8Lfb5SeQnWycdp Rfb :}֛T}Ƅ6=Bt0 6UhDdi11amtMF$ r\*uʝrr*^`?ˎ+ן@`?d?Oꏢ`ܿ܏]+q?ӊ>zA뇢γ@V+qCCCgҺDD'SULҔ%v Jk2"4:V[tU5&;#[zqۜ(I*nű$GkdLFuO8쇠Ȅ<Z~ŇCv}aQG4<11J6t1)%{Be'1k!1XWSIӪn:41-t{j":)r'`k{+ݼ<:2uΝŽO!&ryK Oxc<^8fvzqr/mn0ğ>AI^"wvCxOV._rW)9uqYEm2Ld`$欠o,R~;Oa,ݣ45m<s79wp18g7F$5} %^@Mkp7#ݤOIuލʞY͜>'J#8l197)׫f>/]SY#Em\ɲ[?.lg+wd_IYpz=[eE6RvD3fH8;r\]n [snИPQU|ꎕ>Fn1؞k;8b` ̬Vъ,f!s&Ʊے2V%noDڧ_ḯSW\! .i?|p~UgV ӌWx8cc;85<h><㷍c5c5cX5cX5cX5cX5cX5cX55cX5cX5ˬk 2t=h8#K ˄)n3k T6ҀR)X(Vci-qjB#ۯW( rjUMU{sn5T$rx'BQC=LڅCt bGX 5cƱ5cX5cX5cX5cX5cX5cX5cX5rX5cX.kƱkX5cXԤFOx6gk&茩oBcjrCN#'v(nts8"non=5di[޳}6XXBUud(:>,::>v xc8XcX5cXc K(϶m{9* -quM6 c7,8_iFeȖDܑ qƅ/6Zwp;ZV;[> ]p6f-CqL1Q6)}f9 )z(yX齐#Xq{_'o2+;>?l8-3;Wu>u!K퓖qM |͢sU/)Za&0L]DN\HOa%}OGqy7)3~!䎎?կ!tm2;j8%f0o,X}ħfͨ:ˁ>x*.~qGC?#{_ghG#x6'# W[cVL)׹C?D%۟KWUe|UHmtwe *vcK&@>qJ\]u.H- -9 -ɾxemY"k9׶HږCJ^B3{Xhd"&XU~T:b߾_f~/>(vڜa;Ĉ#L5NCbƜ4tU/)U qJqۊɑ~;{EJrUxT2MTkmԭn{\.$i*FTD(/yёN\j8qpZi 'p=gk8DgSR86j|H2T|{[QrŨLjՖ-G (ոXBbu=XGT~5F!p9NVzuvZ}3]y򘙃f7\wPR`]NY\Q [婸n,ę.3po |8N8~Ju'UK۵8kٓ[OO܏uª &#&꭮ˎ- i0S׎ n3rGF7mT=Eg o@ nl -SMqIeV]MIiwoځȏEzҚջBK*c.X! IO;Θ㦵BpݔiOFgy +n\ޝ#y)H\D]KU(=[q.#v=[%%ۨ-%,򈓙XSջza1J?j6=yw+TAeդZcn l-қ݇P{g> h+[۰h"ErX%![!賛U[G4Z\ zCRn8cX8c>|q]?3Z{gΆadq*A@qRB_iZS<%iWVJ}.e"S+y -W!"s$c(CNL[s^- -wE:U!p"-ʛ Tp3By_O3:F4 !׮z@d&͵J P*GBݟJOv;6'HQ H 6QaDJ8 }٪m0]S"TBsCVjp0[Am qiÄ)KvPXG F^yb<2cEIK::䘯^𚕭^BG#<$Cq*5[5 -[p8DzP|CB}e+wY2X*i")|W+m"|3᪍jD>8|,dhdk:NIϭ{ -}0^WS饞 -Ͳ% "X(̴e wOmń!7 ̦5+rŊ7lE&dn y4%v,d:oĺ}F[f3ӱ/;2i-o6Hɟ1@XuЄFKy\KJ= GKvzQoF!\%bݣ5=#rԴZ -%Vați؟sOVvJYjP- PܰLDvBuA;~*^N掆sZWFlۧGn݅?(i6sJۧemXe.7ʵTT;[e^SV*3-l6cr6Qj%nkwTvη0m7uj! ܳcm^G%3).v |u ƨ~?8H۟X"ŷ^j1k:Xmݘ-6t}Ԟfj+|rmnE1*'CH+m'/+ G=3r`}?GFHwrރFگ6E:8J۠W#.L*VzR;݄V (v4)e`\Ry\n&D45h8A kG8r'\XH: Heh<ə`UZ7%|eXM]2➖;'HI%:F;>g 牢,\b]r$f+8:Fۆ*zH7^W*| Gaa saRGNΌrA: -E'IZT-Iee^!W?LJ.7XqRĈ,X"ybη,ۍZ`aM;þ$5>kq,ʰLH{U=mN۲eArRʰ,zxذ&kga+njl^.ęRx<Ε}KlH͡κU-%*;m[? n\R B\6HTibm'#[ܮ,!5p@䶕5JgݦSt4$GntAOٯאW)!ДRٝf"75\>8Ϲq-*%*ރ4Sjop-2̈́DTgf,!!iu|-f9& -be56zX״3`څ+\׺?ӵa6oCTkbvwGsN#mӸScΪTO*urdSI 6ʙl%Q׀M{I㐦Qʹa-nH.&ȋA ) pRzo%K*\v0*T??٪#]]]8anŤ9jKk OT%i]d%\G +O<ƝZlJ`{||n.HM(ť~9bEgtb+ovJ@'b w?P3۞{oy)D*cH@:NtO+;s|nenֹ^ja(*a>,YQm,V2"io1UDZyDV61%uS֜Qg&goNA^豪fkmm 68IQĄDqRAl4q:VBBBABNi:hw  54 `h1qd~ |}<#O?GϮƱ%'Ҟ#>1O$ aӂ.G@{ -q'#O8m6-v4ҹp Kd" 8՛.4<&On bHmopuԲWL-nNi)mai*ѶE C2P6sPRSf91.Qm[ӚLԾ -PHE ZmB-2[u| ]l%* -:m:fʸ:Nt\||Yq FNx!XՔwJ䴐GvCiIq' &dUp -Mc툌<8I$f1[icCO4Sܢ*t%5l7az:vuʢ!k4VXw"ʚG"4*yNTL*lXT ogo>:\'0җf QJDȐp¾`I3(gy2gLtKrG KZ0f&6skDur퓍**Sq<%njy Im-ȏo Y.uԴ-h!Ah҈˖sQKlG 71]DY6p#0mJ|0W 6Rr(9gKq]W[w/Qg -Ճe%Q=RN6ꥺSm5^)lFkMeo6)U$!*4̔VKdi:ʔi Ok=lj5#@vyE : Jxc] yDM6% OkiQRǀumbkL-QʷKz{ %' PZ*4*@A/Q:?'Ҩ ToBBiBaa+% Q0,e&$TUtMvn8{93n'!|mBl1#Ju -61mai2QGX|M]$D,BfjÖM% i Kۋ125*SqдĦ% 0,#HRe4->#mA/ĠДXc^ԇ.6͌ۉq.>@Ot\BuΑ kh:N:hg@nϷGx<3::D#Eh -q5r-mk5YJ>^aʈoibSd]uM֙ϫT=N==eЮs#ҐvsiUm2U_xk㈛{N+fW,]s6w`-'wF9f[__+?O|EfEE8V^bnYQ~;wy` 2];yU8>勳rNp;Gkw+"Uutlo]2ZgD>9

E߷ct]}١QWY6Tn|? :}.Fa߳<|BtIZqi?s7QW)4f6mq]S ~w$rX$kkAng1jSߵ@ߓ~V(L|@|Av]ϫu}u&BV_qRGayo]Ϭ [~C/ 1n<w>VNj+}z/ݞz|BU4oii٬[\wkt/}娱 jcܜE +bwM}1W?%CI4XLm!6?ӳԬOR!nffi~NϹXgvT/)qϓaϢ*~a7n?O#Is>jԑ;l og}>#fT#]Vm]jRc`yjԬGGݬ۸,鼍L~m},jҫVXz!ʋmaζy՘7 r!"s^5Dj,!}> HnWŗT5`^OoW/.*r%w@uQu;mn`Xk\5!V]p?pm!o|cR>ыvSQJr˟Eush;7߬|t_ƪO| -o$۸>~!UEHzqE my~v?)f.#eU ԒXAڳ>:MeG-nn걭_t \a -m+P͟ j>vcHS[| jc?j> 2͊}u~zX渰u7_vN[ܧT}3)6~X>DjesF1ÛG_+1tֳR n,bXle_t9b?ٸ,`[Yfko6D.?ZJnUY+6<-LNVgqwkgs/j Bd+<ÈG.nsѭR`nLogu)1 5?>ԋ*}g½㷂bW|Kї2l@8ڣ6[ؼc5l`˴8?#׍_V ŗwi^[W^im(ӟE? cᣖP1eAϻ@_ a{&9\3ȝ>8ŝ}U\+Vd7#1){b6TҀnkͤ~'1g"4sp~BR7x./6 HCyjBJ/! C[C;|F`z1[G;P W$&F>5n]dbS糼~#K7oWGW?N݀uV/@5?9DګT$o5 FRCE+)&?oApߑ &9WvgᔞQϷq綠ܝ7Oi;DdsYtOv ûTO3b5{A>Ã6v͎8,IԿ\܇:??\c r9/Q"Oj`%9ovy}pj#7Psփߵ|_,|*+/%P*325f];VweG_>8/|;_ 3uy ~'nmp n;Y筇*7eGsS-8^[W)̖>Ϳ)17u1𘟕JvcEb;2jTU"lv"~;8NM9W-{qi!Ds2f|qs>VIRȁUUVwE“:s6osyu\;_Q6dn՛- gy&Ji]noci# -+Y0Xm/(&]€?=}΋{1t.Fdns0v7;/[Gl5#3F`3Wiqww'J?5@ڽ/-up}?ظ>]E}MF#iq</O<(tŏbݳܝvx̉>)N=x n9Ry|Q#0.[MCv)%7(}_T5!Ⱦ]b߲iĶ䷩!Zپsw~GhBk&]ܿζ~~8>U6SЌGζ}va G/ߵاF`]윲z$ꍦ3duma=rno%窈mC6Ǣlj}L3-u:8[ ơ oj.}1gFwɃ巀T/Nﭤ}/?[FCӳ47^R";8uڇ9'8-ÎJ>勵^1_MͥI "^8[t[~PjRH'DN[G-;܎}l9#Vs -P}0w4~/#UYy*qv8aњ5*!=m:/3R1ۛk Yku_o/fWھC[g>RM뷪ǃjjt|&n:caNxo%G`m+|_MR -Gs\~y@NO)|>;EǕ9٠t۰o8-2f#%GTm2GWICJ4.HwXp ?`30f=҅YnY~ھKrĪ' 9|G~~IT =_<ڮUJC}[OnR:N(8z$*Tc7I,;۔SN,1?x ?>OٛkG_T!Wyo+C(԰"wy^[wyÉߍ?:C]֒N+Ϸo 緗Ѵ~3v^y:o'Xn}~i?+bpE6AT܆]xDrί!Smy 3/ -l93P -9R=ʁ[X|;qw50+ m {6sS'?Cr"=vH>{4Ь{7= -?{#o$u$_x6܅ut}?سJp6۸z|,S?,sw_;ab_PXi@{I?Mϖ7ۯW{IT?-7Zj_.pB~R?Ox뼦]-OΓSe'ʻ!#,nN -AijRy=6wպ:gtcO2{/'{V?k/=x99xJl7_unVr/7o33L<̛-]unz\6h?G˾rN܇ 9:3&kk~:uwɱ~?ۿv^8^;˝[3fw~$ʿ->^Ww9m-~)_IW'?x|.}g6ęktwsvÉOr -+# Xfy]nj;xy-;檿%d3<,s*PF;TÛ*%hav6[zޝ|m9N@rU&G>gxME?؞{VV;_Y?qnPx}E õvj}LÛyy5^Ys7{<.99>MFtKx}ݝ Fq|WrZ=FZrYݩ~՟9|~'N+ ?v|ڶǴ:y׶o zӘsSpYmǯ4͍%H=Bs`{^x=fwoumWhn}b'}]N#y>WwՊk(&ѸN!R-v݇+g?fkqp|M3W,˱O-4f5{w?uwP&|w"^7}f Y=Qoٸ[0|6X=giv{;u9jN2N~?[[2|8z1'dsidzy]Ue@A_eFFRьgѭ{3<Ş}Hk2un}sh#9]Nj E onI?~CW䷇ٽN*uO{CM7Ty.9U?#[}yF+;6䷏ݍyyZw*O]M;.9}7n}(R_.lvw֝mD┙4N#U9Sk;m䶁[o㢤98H=g[{W:bmQ,Zy=&(0mw#[|Bۊ*w -͖ﱺY 뷧sNIU5^̱l~g[yzR:E s~"unͦO"ftaۃsk#U߷ycǿ>N,jl|ӳ6qigod|hkpD]YNlwxLsqJo2WY|R+!sc49ݶnYmOldkgdvo -"5W|)WjSj"&{P !Pǒ? ycnV%ehqWo/1{/)?&yDٞ`k{}0ڬ'0o5O-sno~Je U=|_}߱<Ć>έO3wK*rkF>?F8~fAdrMϢ;a@Of {!{s>b&[K纎gUj^^ɱ qQ?' -he=gMl>Qí+mp)Wk7vYmAM5<9ӊ媼[ƶ"xնp=vw|Zj_y -~t#7cຫ8m -W){0d;}?k{aʷv[p>)GW;J"űzѭ2GSOUy[4է}]ݜC*߁wy't5'r{{;,6wx܍> y矉#=(|{@={lƯB 1b=ɠD3Q7m`]OGoJ7~rvf<_˸ROלß6ro;6$un8X1|MEZNݠ=>/^O]y6@Ud[U gG%)O=!pgzy}?ZpwW|OiN1Gs7W[9A}v?'vfym?7]J/(ڴOŔ>Z>* on߿ ju?`sbes{>y{L{63o!6պGUlZj)Qr&5dN)䷈š? Eڱ?p(&f8r/Z׻ڕ69ډ[/n o{_okmʰ$EQ2|Odw*n'U*"8y;˽sTq~yٿF?ۿ? |T< v'vtZ?oc--M]o}_enfD!۴G{tU4b|.˯]֛78Ņ櫱Lڀ$}(!o׺iևGϵt4/-b3 Gr by:hZW'iy+fnT"< -npGu0Ɍ2ŃaZ)j9;r{,rEdolUʄ%r3`0IDi16 -ݹ5BiޙX"U I%!gwn:XC2lͦm~Ou]u| <{GM>wzrNPN9}X(fC}#)dJR-i-[-RBFJ)mЦ-/B+IHI8ƹu544R4]il]I[,VCğ)N?2lգMp@[R:kU֬,ޒ50ٖ*# :Ν?׸N'p'g'0JnLo-k= i*Kj%f\d3fĨhTjq8nBzxL RJZCiu.ɵu(&cb4U%!1vH LZĄ|oķ!|1:jvHdD - -=[l7=>ČMV!U6'2[axu) -I!>̘SS%EQkp*Sg6թ$ l+ đrĴNab-Z@,2[z}،4LqM6b85jCiK/'-pLkmjn}<1~\:6+ U -Bm:Y }tJeYpDY>Y*1-|Ul͑ѷ*ќUD3*.?ݴ~Ɋm??1?m:%v<zkirvΡۍĘ0m܌1 -ěG(8fMW/A@G/;v琵j(VeK΃c1lz;Ʒg_DKl69Hv,GLj f u3I S}+FuSE$eʆCiDKѫbuX2IUuieL]aO^1LUZmk -T7(RjnR jy=}7&lCA5'Qk )U5! -Z5ڊzr3ka!#)c@c\ 5 c@k&tSh:ӤRA $=+"3(Wg> &tS]cXcC;X;X7 D?TlΏ`==GG_Ѹ<F?P5N}QcsJ}hSjoGV?~D}Aϭwޫ߻'8B}H8?|g`ǣ?? 72?>ұ7ҟԏxY8HWߐ>P?RƟZ)N!e4Ć CQgس}: '@cNuѧ@(H.ƀFcƱčcXg;;kC/`BBGb꽝Liԕ!Ũm!ag}bh8;-`p?kFz=gYrc1Yu9nu )?HS,JMj3j*KqOD1v+E甗go-c3j9CgR%Vn[m!,FȨHxjDT1-n 0;P@ӛ0pRFc =;wm{_ڤNGp̢Fq Am~H2u2.)RP33*y€Uj3۷JW9ZY*T0G"joA17㠡T%.$ƎI 2glOAY)[ WT 08_fQ/Fl=&ْV48S&PdB E鱔Jƒ?f- -W عNIp{AܩS*;}h -xA:p5zqmHZ)Cwi䫕5qfwNr(+jt:!õ;Yֻj=&B% Nգk<ƚXJimğFpSk Lv6XBZ@lJ2ӕ1c7SΖ#֔**QkJll!)D4W؜D۩Ʒ\nv\\5o!R4dCݷ'|s[ָ>R F1=R:UB^Dj?;S̾&4$NiH &)ƱƱkƱk#X':,Gx楐3!hvȔ[jX|<6!3h8\&͠YCHAAARJ ugY1hyc.uc@k ƊPm%Z1ZV}&+)"#IXt*e5%g5lYpO"1oR,U|ݮa`4l ђ_izSNW#GA%s&4,U-碓f򊛎J1%0)QbAm 1qoɓ fQ'%b$]:mdJq:YqI[2` s$%3 XIbBCiil%ŭ6pSR[u m E.%iR@X:ιѬ:KcDv.]hғcq=~+RX,<~j[R}4Gq+j,kx] -9LP"ۯf2BU2tDX(K@B^<舞i5S*r^xTg0W+uH(PC[Xj]-_5O$Z7μ<Ę= -+@lc-Km`X2"W5-ir'8A!o:n Ż;JTaUCE%2 )nM֦iMBvи4w15d4M%}20%*>ҭsh(CYxgY6( jyjqmIrƤ}V*G|] 6XkL^pKp=i찀5d+5L45rZ؊ۣqa)tM^n@ z O0 耴3^lGe+jbe0ZS1[RV\&exezd*u5Y[*A!d){LJUeX7ٔɓ` YIyI)Oک>k婾}?ZI6Lz]:h4Uʖe!x?EW9%GKin5LsI3LhLǩ:GJ5tڐ춛 HU=`MZfǐrWP+T=- MPcV]жGE>@P\'fr}mvH0Հ%/TfV}&T#S8M@Gk &0D=̥% "Am1fOv$ V_= -V}( G3aV3R jPUs?-=X -b\H?֡6DDi /͋"aٴ>˾GyZd˞Ou=i.c1!x?WU b: (U΍}C)[糝RFR06В CƢ7|ݏ^km*+i%[QƗm-RZƯou:y, 孨PkIm8opsV/tmAcj\0HHq=iHՠ~ҞKO8 -y\Fz:y S9iLDBӸ]tnDo:G"!G9edzC-k5rc4 ,?LFպVu+f}Ҙ', O,)pwt-)X#,I"?+u) $x#uˬh r c\ƹuˢr r$cJHPJp12-pY$Xʵ6䢾@ 0h]cuV..smF~ZܒíJ"DQkp`ŷذ }Nx% Y,kdŢ[l,4$B@,6`%^nrI܈.y)%9m J弡RQF?jsÆ*T ݌$ɂct5΀TcP5ٳ=8zqt `!#B4(l'}QЁxX kA:.u5ˢNHJqCm ZEdtm%ڐ°KYiZ~Rr#H16pa":t4p;Tiٳ |_>c]Bk5FߖwvΑpj݌ɋO䱄G)#ݪMbƤ@ګ$݁ƱO=gYOc 5c4S4RI zDfR1ڸ?4K%HBQvZ5+Q;lb>5)Ŝ p!ee- -5 BcS7:`zcV5*9e(Y9,P"5=4MW29q4Zj3rPdf9;l:&`G6c0 (sPY )a&tzc=jc E\H՚9n{8tmpWTZ Mh#5cX;7Cdw?`{'8}xŚU%KnEgc^yj -P*դb(ar8,A@w4>Gw:(6"ŝ&I$'qZ-1O"svU*\l\ޙ%BcHpJbUe۴epPG&5f RNj,5_M1e'%mhϏNˋD6So! 8RhAHtP5'Ii)Ӎ%ZTF%Q.@vɊ"uoo3^ڛˬ`M^%a@XEdv=ɍ;]ܖE0T`;'?8}Ǣ)9҆t:#CDg@hcS]c\`cDkXxƱkqvqpoCF8.u(@2"xcDjҡ_EL#^F;&P}t8gҟG;%9 .`6|^BZm Ez#8gP-_Q*ݜ"Ay -w ]C3ɯIfFg#ut.[]" -\u4ZB"YsUlغb9\[@B`qyUڏr^ 9 $ɔٷN:Z.(0Tݎ%%ӄNbD8#BψZ?$vFCX2ZȆDI}.CEf%8 7)+:ͷbK -WSTq\KBz_/N=f-/ڛ\d;|k :>Os1;A˖`1\v o E/Ls% IR>ABW&8,%tR&u -Ru'q2 >JTr) CKMFCŏ"d:Nu548cX4.qĤc@p#@kƱ4c1lp'Lm}N3ýj(C2#G{CSFoT=tNoNb2)Cd|e%ݗ1O[ Q8Զ LqNjzL~x:j:K1DHS-nɆ4"Ky:lvۦPCN'Ѭ*jRBZ}(Cq38e`ն"٠ybn0k|gsFys$h:4B$R4Y[BMQEVa5.;tJ?L4|3eHuVJ#X%.Q+Ƭlj4>l>ͳ6CcuLd1=} -U"bzLGgX8Qt.zZlCQتC*:Y/Ez&-p!,5?I#YqƱ]c\\E r. -i$cJ5tu3^mL|y_yFjTxnj -;NEqj9-堕0>IZw\5݈m<=^$q<l۾YbBzǮσ'X8cX..tS0ڴ^"`Xuk:(tF`Gq.&gE}ƔٶFB*-18> Tv3>K ^ dvr58W_϶8Yb7!FJd&TeC驒=פc%Lҁ-`$7); r7u^py Y? ha}*cIjTyOZ2hwjGx-I%-:Y[JB뫣]i#E( r=!iȶ?.[=q1HO:'9hR0~ŪM]>3!o5*}e58-ZZrdu1GS< uRUŷ,9)ܔ,ZuHs+~dupO7>xD\.*Rrߔ :\o%1 jgتEӋi][?mz둜T(1ջ+Dk;N&ٌdBA} -֞j/ؔkEJTRceahn>on_c8Zyζs[lg9r*ݩNr=zҸDz9[mሕ(=uw>xvIL,)LWhv4Ω톛錘d[SBlAXFcu|ßϦ>ro"+rO4:S45dݣSY^YyJ<6\nH;WpƱrcJa$=@BR4[Ύ[{'[XedxG;Yέa(1^Qq~|t%0Z5ڷ0,bӌGyaqXqhv*~"NҸpH!wi⩴$cu{'?|ug)xg 5Pzhm'Sm;cj>ͻb(-Uʽ)a ⸕={_||S?eWAb"UkKHf#Nޭ*f=_GO6Wh>ZQJ,-!S`Dq.yDR $5I~S?=hhkX5c@xGl,C6'\<γ:*0Vtg2BCAp:[Fr4HKQSFVT'IZOn|菄82 tEh+HHG][2k4938e2RZyOO:Ö&4"uO;İ-cjtphOO)aR"Bُ=S_t8D?Svqʐ>:XAȴh;y'k%/ -!*h6RXb: $sZ=,= jyi; !\H] #/Ɲ g,_0PQsn9DDBA賬ηr(뇅.ZXM.kq$t M5 k+^߮ GH Vk \Ԗ_矄@82ʡ_pOOa.rZj.3a ^}YBgH-Ѽv nFǎv;[1fx?%-&ܭĻ̺M3Z/ 6Xa u%-5.T>e2צ'O{ڂXt-CiXHؒTK&oQ;MQ['gw*;cGp<[E%LHyJmsbC˥mה=`hvq$dc@;U#)"'o(~Y;'|l*8Գd@j+7i~3%د*5l5X#-\WL`KuhH#[4c&HOW*XuEx: -K.ԀܒXymVuN"݅G.lFZ]V%;#-Ʈh~`~v>z| -Kע21u}H$u~k%?FqÈM)(CeQh*,a&ZLt$YHVkA $ 2i'A)Ch !=nu#G(I{DcHκ$t H Fpp:ƱvgƱς|cgݺH#Ǐ{Dς<1#Cg}t=(=^{G底}8''ugF4c@!i:*4u5#FtDiAћ Bm84ν]e% CeR=hZu'hĦ! 2aG<2;G`z|1ʾ[ >$*IatN=b6)I\ j5$]-Ţmd8˙Ѷl"[-G -vlAg[YWZ"DOq\F\EpS oÑ6cJym)% MAjGT$Iv0j,Ab0'Ya<.r-bM;PZCR&lZg8y)8:3ϫ|WOlvsEgV'kfH<.OsQf&!ɝ?VT)Iuߕ*KW1]0 -6'USJ|ISi؆v#P"c)O`3S,%߱Oɵoxyc1-͋ L=h{8{2iTs?5Rv&̚ʎud6EUi.%`8:΁}i[!x?υj2i9f Өn? \ш`7R3`IPKUxXYr4{w+0 $::bDQ&!IP?jf,86*_2ϻU_f^SO.IasE{Wuh [yk=Iq!K%֢v4llJZss@{Gӎ*n#ӏ}3.>Z[|doV &/?°KT\7SLa#vtpzRzO&88$')_]7͠m1 %z]ϹdqMj!InC%U -95uj<%bBBZvY[I+SH6>Lx[c0܆T0ޫSg]m- e -eR|I W<3N ^ ҍ:Lk,Ӱfh:j8Ō.YHKeN-[~{Ϳȉh OHQ@ WyM/脎kj{Z1P -fmO+Wm,%Q!/|~OS=|jn$ntuvS^9IPiUMۃGKaf2q+fiF 1;F>\b'_Gth+?R0hy -i9~I2eg"l&$I>{ާ>j3b>z+n8(s liϢ+ Z!Kf%1Zà"ȊB$5[jC6m)0u0ZyMU[ Xʙt[Ml)=i6-k^Z̋E%1jH\PDLvPNT -Ƴ_(8]-ˊ*^Wpt.mxe5?!Ϧ'|9YҾ[/>K0۰Tܿ0ӣYgmPR^VԀڌzGt~l -by2M2X^)dNNX:J + KhJ@5-rC8] Јj'Gc[u*->Y.8^7'`*s(Sr[s\Ait`v;DAOdsvϏ;U*׹Q~ĎQ|ÍiZEYOFH"WX8[}P 1GWj؜@G{E"K·`T{,d|e4d?>ԓ*F:H`3V.(#L */)rϕA)fyfm -ap$GCuOA Rݱ+c[v @?ʕi Ŕ2> ItrB`LZ.@\{WҵHHBZI1ҧ%լ+Y3C>Ɍ/H{yt;S~gܵy}ρnV^"34\-8svWrcrtumqRƿe1t U. HHS4 )#/V2js Gm֚A(!12J0ݐq@V@pj<$.2B 2l6o_|>Pˊ/gTPIODӀ"Bݞ,3[cݞμYy135/m"ىK$AXV3q3 S?`uMCGD+W*gfVfftp8"7-ۯ)R9$w5 NY^bLuR;lrl%E8s-d;TlA#2',$iZ?rGE\gjWy%iՔ^ .AK(Eet;wa~h:HL -̊3:7Ҋ),TԈӒL7'4GQUL THہ'Q[h S@ LHiɌe!8D"!FD j6\fA i惍Ƃr8$"2"h= h ![HVZ r'Euՙ[Jx Pu0ȟsbqeLEqmI\Hn1Kla9=MW8>UpLt80F#N$)%߭h5S̝H{4:0,Bo ʚJPV\v`Siܲ RV>\dp>~ȯC k#Xk1 kƱkk p#XFpM[8XZ4Rz--0&XZl'Jmm$7xHЖKBDĭK_*zpq*q) 糞{x4Fu4[Jՙ:\dDv:>#R GBRʋ 6%G7!aBY6W03=)ՒGW@12Bګ%8Z+ -r̞Q,`Z9Fj\{W\2aA%iVhvH8 фΓ J:1`%H|GJ6}:!z_nz1+~0K=c}hHu?Q@SQR+߳M$>@:8R2jk;& (!}GKWZ/L51jY\a:un% V/X1E#K>kOYG 45 4BtT"9̋E&=12aqIv,6Jt=CȿGy'uh!eXhv08䧧CgJkeq䖑ʋ1}"l/W[-,&-0;aeMhM~BBQ˘h{16ce+ gFgHwkv:9AZ&SqPl;U6-8=?sO}#o FkwhC+}'V{F-־~c9n(FթP<ӟDD1 h2,%;1 :ߒ˛*$?SPdY%s!JH+_OV) rGnjHTg:t<ڀ9)b\¦'$%V̤ǘހ;/w;GG /p''v'oV*;A󡣩Jd8(V >Bbtv(N@H$@bts*\! ?>r-D 6by=˜NIKKW%򚵌=Ժ0,>Iop-.g3 -[ae u{̧y:E/A~7c?e_!XeMm&2Ґ̆-cIu.1I%N&:4 HOS@Vѩ)A-y#xgY hRNJF4|gT9 -{<]#q#t:?'J0+B0iPyPRbۜ,íZU*9tGomeoRj95]6*%˨D(1@/; YNRTgTLvԄ;R˫,u4!Қ#R/4< M.\%:!FfbrʚP{8(b$zLӇ4K,-#g m>ڍ/ VñSHl5 sRmh@V~Zp'C80cQĄ}>w92ǃpƱƱkX5v1p)h5pXGk1cƱv NF:S`CMb-T!ܬłȒ~9Zs9a_$yt9iϡiץ|摂,;C!IdU&R!,|+QȐ0i^iG|3R&Qg;yН@;'8@t[1%-%v+nCiPHSg8ةF4%7d%'(qeэ߃g(U{=>xxY gYg4;#Y3C=c=τ{5c@p:rN+٬hNԈdsSx]'G1$GF,GBK5vg=q'R~>9c@pƊtR4Pt%*HzUΦ}<#=I;xg|hc=ς.<1>uE;kLJxC>I#'Eaihmt γ{G`x'|31p:CڶA鱍5ꃹR曵`ٰt'΄Yuggp> k< X;6n!XXu#H0gIEh]J7,Q/ hn47j4ކ썤zF脽bhB&i7NYȝDIuұ$>{F`k=ko:1GNE`iZNtt%ZΊI:YҴ4 E@:9kXy&KЗ#BlN/r4?CtNN|:FXz 7^b:Fℭ z7t/`h\E׶bcBH]n6 <:5Νts\C;y4<,}Y={'C|Y 5>!1qr"AQa 2b0P`p3@BR#sSc$?v0-rSٝnBܷ`Z33ZRR50fy>jsB[O3[}Rg&i^O@Q͝ 7%|fxY)b4NUDgK3a%4k=>ZL*Q14'D<6MgiH4C@kff3Xf){K+(IS]7ݔZ#DrO3hJhu ՕYVQM/DL}2mll_$o&eh8bEhj R[I͕v"qi5leEq~hE2/R"TR' QR6\?6UR!K~[xF,űnSY$+^ u.&UT"86&056ir*\3I,fїnّOb"lp书U/陲rzO{kԫijW9%^Qok6kdGb -ޚrN^WK,ry%zF8C.R.HK_߻c*b%8LFm}KEՑihD|_[?Tʸ|c%K-g  /v/Ю0%(dܟ5:సNqq)oz\L7E}rK,ZK/XCM$l\T+yC\t6vN0YyB㇒91Bv>fJ;YJ,VZ0E6ħcQܜ%8czsY-#L! XBk"S#,hra Nfe$ 83ELs (('bDs.Iףb9|/ RҞFUTSA(GeZDc8$!xP2eUq~Rm, 8(N̫ᷫ*Ymџ pcui!'LX*xYh5:,)_ -R6_Rђ !dޯ^eX8/"\WE-.mMz"-?6c.mF;QZՓY$6r=ׯvИL$36%,zK9>$!&+^R(S1F='nUĐ D#|؟h7]oW9ůRQ -lOs5k(uظX6~0,o6\Ժdl\˙>yҾ9RD%ؤW6bǩeRTKgn)?Yd%^➍"ZĞ"ji},$.EjCKf<Ė˻PNYflV%)K+R6&Y'ͣet6Nkg=r[qGiID}ElIJ^}O|͟^#K,1+F\ _?~q*k!)<K ɐ|'tX|2)_b^6md%ue -L'H ͤ[b^Rfl% v3hePgIy,_= t'ͫͩ5*$*o쑵~d&+Kءz`]c)sgudrPU6ߪd+)^I"ǛҮÂF왴2Ms6~fӋ^]edm=z+\A),|jy,Iv3j-g bHFpi&lQQ^У'G Qm;1v/+hl{3Kz3iBĹ?] !U+$&|'|idC^كQ#刢0$Az#sJX|Hs_&pJkD(Hd;8W˲ cͧOGCdh]>"dmE.yiilsRHyev3hd[Ʀυ͛_i8^1kKY2]ȄV[yf)_,}l J-K$)GۏsrLWԢqK80|LO1.G -jWSINV?m=}ȥ}/_gerrZDq$)esԂ(V|i`{DZ^%UlFæ&ƣ!PAj’[y)Ev, + mpB)!,dKC -WXB+ɡBOv|л=%EDU|B`1 -BSQ3Aaf!, a En#Y1%a,!q8|JĴOY% -=?-EQ{I<3)aܹ!F 0^$GKbb*;KwMEciKc\OVFO -ؗ5 #g)~OF!4pJRCzz&64m~)J7u @ylñQhlwJ:/#FimdF}LXԞW(IdI>x" @R4"bVDںBql3؟ߢ&a Z~8H<"Yvwsj RZ}%]z'Ͳ_k6.MQ\BF+ Q5szE_{s;7ɯcj{KkCk-3/s:wjޟ%*_˙43W]ؕ0'Hv|6AܭbkU] &6C(EE?]`_hz`Ȼw3?)$ AWjh-^Ee_:Eem/<m|I ox+]?lIBrb)Bf(^ J< 8SX\!K9I6lv"}R\6 kHV-fXFx摈؛8V[k,qWq/TUZo,^uk^܊Qr!ՐLoOߴv2Vdmm6l?૱^kvyw?aV uԄ=._[$Lt꙳"V_*EIh2!/,y-fHٟ!$%M.LM>So OG{5VK,z,7pa7Rտhe]ß$V8Pde2Qh_ފwQx]e#Q/oO26&W4IPFI Xf*f%t.ٗw\AOj"VXw>H(/L CEʼnSG"QJ$swY#E, -pz tp,Y'8Y+c2!7YY4Q.2mOݲ/o; Wl+i`mKgȹWSf^_r+6fU|V)7/W\b\c'|]Cj$} EBIk.BT=ńq7iPoPO"M#-xYF [)I2Z1< -Ryh!!M_"~}E)Eq4g<}˻YemcF/#gb#v3k[BվzŗSSW@/C/ R-!U/r+6QCЈG-*6OfNZ%QʔVpa7x.)SPŖ\1&2Y1٤"he򨧙`[՗1[D&<+\-c}=PPo%ڻvv7![#g_҆.}K3}B>Rh_$a\[-48c^,Q;%%6edGu3Ó - "`Wdnarbٛ|I+r[8a{_ -ˊfN"m=۶VWھDBMj84(Մg$ՎVE%8Y_&=fUeлY{fUھJQ؈M-2I{f-eF-_2٬иXq&Jp(8Dd[lRKGXwۍse9$W8x7k|+FS#G G3$y*RpIFܕ=fFR2k#Y> sÌrm jU$*o ZdkQi#Z͌%UQy,YItFD)!0 J~I)qL_<"g(| sTsb$Ͳs~HJI.hcBnRlpQY'W6vM2-~;(F -Mභ2/'^4%܈ue<<2lB,^n\J_qOqd'T%\ߏ+-ɜr LYoMǫ.oYGg#vEbL)8.m`#BE j'"m%}̧i(pEЏ%ܮMWl^يQgVK/fнKS?o{Yx"ډ4~GԪ.gM.fIw%T3†\_ж~vOv/">5XeyQODԮ/?/,+_qGnIM<|_q\IU'eg?N~iR^DGL#y-'IX6F|\͜.&oh3/=!3,*%7Q,nMIJ>}}+RΤazKG%5dױnbcDpxlr>q9T/# hir|<4~p'!)!EQiog1,ZɘKi)lq2ؚ'ʒS\ul[$%FT%&\_w3H&d5NLJmD%9\UM᎘ȍ7<\7A$>mouV1#>-.eN&S_ - =l-S6FyɲoHpX8J璥9Tޱ"EAX#ƭD/I&G/bGo+;Ƒgpv?R&Kf<%KQM 焝-2m{G+%9ZH {v/o[xK/Y/cgKT×MqZ%B喋:NKR)^ovlLҖD'ZxL6qducZvEq)z"M$A%FȽ_j^_;=scuβudD洖2fr&14(zr뗪&19y"_LZȱtKrQl-R,h&+̲(U JU,SEkDd|Y,Eh#ح-$%pC֌n\;8٬KS _ dX[HE~.5 #q8,Kv_5h┰Rc#T7lXɫFFghℓ_' -՜27\[' $:)#sQ2NMJ'y7Ñg/fvf80YbcPlYK{~ŰUh)Y*\ -!&fWSeI)Rl {[e8evֱ,M)( _Ͷ+H^%\sm0-Mɥ脼Lܢ9KT8C)BO'M`L%d4VKc'"dYK[B؜6.gZ{q.Md}b*6ej&%l}PO^WY͖BSijNy~)G.QԺ-Djo%=7T8yL|KX $l/Ѳm=Y+>|i㉓ffhOFY郓/Yb(NI5S,KvWж{B+6l:H9iDZ,:!Or-|,6bT055mXm6m)vEv:B]՗/RbCϘ5\쨬~̹/vr+ލuueͪ&Axt+2S66lb6/ITl2`6iJO ĉ.ԇj-Ƞ\ܱ1d9qXK]1m)J;M?w.eYT|HyGBMsHusΆӺ=ۺuћ*Q؊ݎ|$']pզQ>" ><`澤pL\J+ +SXbnÅ<ȯ,R1Suhiy;J; ^ ohgKeiI2>mgE+|$̅\) R_ͣ+#82ɢq{%*™7# bV)t+gy2s"^R+册+J&6- |G E"GHkh\2)-٭YII'qIF c&1±8YpuA)&N~[YL|QK75|f3ˊFS_zhaسOAшKs'ZcN/~f|<,E)leJٷ )rk#'zW-$8! Ÿ&qt3_|)='^xH+|;MdM3o 6ȬWe"4qb,u2M9o٣F1#l.f- Ea9BX̊Ub$SkB3rHYC>5 -Uh5QdmRfϗRO1Yen1ѱ.H|?VV(fF$y6̈ٺA4CV߲wv2C%oRP#ПeKT[~iɛJQ(-bGe³Ns/MdW<˥)x!VޥkF؍&nPg -qTt[foGcEM5K,4,"z{`<զm=~m,>$PזyWj񯒬sx#ǩbQfԙDg,6zReĻZWe#%冀n]9pS/dJMEO}6F9P!i(`(G,5D:Lk? -U)O V ޤg:= M>luVe_2` ,𣌗VJ2S,zU:ۖ1˦m[uCh)IFr2YLbhK&3'&cqQK~pg8.2Ff##M dO~$9g=o34&FO;I?y2ҹ2J2D|߳/4!|mFȻ'q5x"ahG)~o#)oĥ1,iU%8͚F!r_.GEUFc[8ֳ07Lʈjrc[3Eu9o՚Io{G̩1-lٔ7bjlKWFB>q#v|Ksq\)bG{2M&fR%o̲y8ѕ,KzicQ7-´d#45Ş, {<و/'bɔH5 ;oo\(_O>Eg]cRB<V5,1Hg?$8%^7Xm"|;ɟS3~ǧ}hYF#?]1x<^-Jx$r S[υ!(PG'sՙv6(oru8_e4bSHK#lʡ|ud!w&)/3&V%^Q,N0_Oe)ySI/3)#Kd%"9Rn,M*lZ&N$S8<1^9pkȜ>R$\[y#22\>1*F&($Y)~u:xȔY.4/Y>rTR)x %mɩ"˛)Ⱥi)h#&OY5̝K<;_qJ_JWRR>>(gy/F̮RB+ T,V;)_j!7)/ZjB$E"Q8%Ú>,v}LsZ['*C'˜)~~htyz[ef)zE=Q/t.h%1hC߳G!to׹Wj1#=^{Y3-q.[к^VO+te6W$VG[.*8_6V2~HO8hs\' Vl~\LF)n -__Oh4ͮ_v>}ӲXXb<+ OmR+^.tGٿf o}TղH.W<[j-e.+DB/_$l|5Y3%fݿghilcOC,6lKX]/%/DY/~͞Ka|;")Ǒ9!_%khvS 틌aG998|[~ln8dQeW,6n}`:L_;g䒆,KLTouweč1 dvX)PRIC1#Dx by/}yDz<&LKt},fg͞q霖%8Yə,KNr|D,Y2G4K,MR)!Y_&,Y1q<$q/],~w0 bK{Tu38PV7V֣3et1'^>F#8Óf&jؒ#\k(š4{iZ0'Ԏ&$< Ńx1p3'o# _?wc81 0x,o⤌K;K'xk>}+ɬQəE3FcᬣZѕfu1ɣKY6UQھX*F$eݥH0Di$9`˟ 6Gԛ*bM8[Or!ȤN}JOEywB}ۨSڊ'deE(U\ʡv?V[;lχ{o^"/^"[ڙiVqiJu,M>l[[Y"Tպ΅LJrP}= -!{'4][{m8?6VKqEzVDpCܫh 5fU$dT3daƴE' ,z^CG2|D5h18n% +,MIc]U4˛'I5线bCEW .bJDV?M]G_(hetK;Y*353ei$&31({bʡ)/nhG)^vҥ{G%ؿrj'GEJE"IyJoqƾC6[ry!cؗl[8rhƃpI[r[ꌨ-ؒ07x%?90L %dpٳ*e#eRb̈#ǵX)o_$!8 -E4+ș % fH[*6Vd8FPWjj(E]ȔKZj][Ԏ"p71U2pdבl8gφËz#|bORO2IJHy"#ԣ4m; -<͞ QOj,%^CVuM{G,j-l-5}+XDk4FKW'cƠMeU ~Úɣ⦲g{cEL)?LIdM?e&BJChQbQŠ(U4c4d .'#J (–;xjЫ4THE3 -$r+E/d|SyFS~c.GqΨ_-8/#)rfxt^+" -8,B\ -x_>&|[~3mg͑LSa2ygQ%%E6()oɄ%%p<4n+%)}Ls^HWgdMN>JbFȬ4/8žMt.dde\2Aqb-1Qg6*SS8q *}̛Yɦp(Q|1qYZ :b e"ǒd:ndox!ZJzNm8k♅V~JF7Ȱbx$%<^F<Ht?9/WcSUے2$_#ț䔙Z :"+ d<2=7K'/VXh}$$I&c#p!<*FZė:2ܥkC<,V"Kw %ZшLݢjz¨9>HhK™OyO./&M/}ҋ#)~Ĕ$m.?]}JY*>WKR4QE==>-.kpLyfv<)r]c cTm$לB=J!2} 7qBYF$6y6&ޜ&Ғbi&JSٮKš#)MgK.[֨2Z"{M{E 5N>m9gxЍq'|,$+X!d|IbPX-K_K!d[QB$vyE/t\ETבMJGOB+8IX[~Lӱg.*efUxIM>Ha^Rg &e~\?\y9R(Ie47[pֆ3U&B)-ܿk#[49ܛ2o&+# r8'L.D湢S%FR\(mi()2=>K$22aE(Z -⢲[Q N\s䆝Gi^"Jsm؏ b[,3ž..q!ԧ]I6n%.H&Ɩ%Q,HRѶ'&(H!k..culYucgzKF+8 -']Vmi|L  +㜓MG|zSE L+F[#yhZӈO +n#0kv'lP &9Y8j ɡ$JLqN)rθкE[7(,E HGά\RhRneH5%EO:pu끗>{9H$RH<3(mڤȣ1iq#fD:|d-bNU'͢C< 9eܹ% ~tJD,.9KvK1lCn>OYzmS6k'[lT]z)dw(H_)cUW3iQ\h -2圊 X*m)q7_ -j)4WVCe-i|-.-^|M塪EJ\օ}JW@KtGb|SSfτlIŏ/\"Wvf>Yqcɲ/nμ8J iODm=nQJI*~mGE-2F+Qڈ!Vɽq]Xx6HUKu]Q.,>&qc|/QF+D[Ge,)c3*e;B6FQp{6\,kźBOBrr-OЗq] -$dXQ.y^ǡYIDN'P$M<&BI] xeI -ݝ{sxJ&״Axu69dim3dKɢ`SB[&6V;Q ج船Ũy%#y@RJ9R<&ʥSԟi&d,)1|v}ۨ(&[Oˑ9KdKƴ,~M}R\tr -+.l"!Y'Pg"sN͜ -rG6x#əA3kY$j$S,mo+pvR8#$ߚZDx؊"#upm\%YKĤSӖJ{Wq>i^Fϴ ->%^h-yqdlŗ18#3rLN 1[8&b1Iz/?Rufx"f /6[Ol%VIz9FOWv.5G RX.ebW_rlM+6.I-3b)3ZRݗMY|9$}h34,G^W!9E(P>+HP=I2??B^T$EZ|Oh=GқLlR%]S|,v]"W̓HHhd#qIv#MxZTFCdbqMsz`jzLMj(xN%?S'BK*C( OMX%$92r8c,OeMF'0m1b͌POish申TJq<4VEgIxW{/Î2pXŽ'RȔRH%8,d·MphZ!F51XMdug FC+M@S(Z[T=9+@PۉI5ʟ'G#("sy4D!EJ֤T=J|(I:&sd⾛нM&Buu+*YѐrBBOԛIILO\}(┒8dȦO%Tc2=giko- -!*'*źބ6FSelSFDS&fnrDV>{Wdl;ix#ő?hUđ]UxB7&]FtEe8N#qM38F\V;X9QCM,,$j*O ^'\}ߤKWµ*} r~d"2Q%ԩ:*F\V~ElG I,, -) N1Bu#GkÑ>e|T_&clK+)% /:+rLJićO\w5&Ð'Lt#x7\{5\IMc߱uyd)R\8'$a=nd[ƣ^rMx#9"j߬>=bW>Qֹe*( HU,mHǑ|=\F٭d*.d-/4*DRʻF,|ȓ>q.I{1drW*e KgJ^$G%16h6A}Yc,[]u*1E-W=E=зRqJW/rӃ:2F&'_q)z!U%&8'L6}+凳?8ZdE#qnjU\Dk#ThixL4g&j[S'z-^xlO>yp76]9,{ -"D#.i|&qF)I!ŜsMY1b&e@J+ |ig/vy{]؋zOfb\Y'=TJEԙYC6(p9%"} S2V6FkEQGĭrXE¶[)[;&ruK2:3e*e#KrRO %XS̎1tR͐H3dLS8lfKvFn_)_'Џ RݬQKce;47 -"6W򈭇ذcfQU)eV[̳ EI=W3f5qcmot:*NݡT<c[x?_8N8Zep|SE%?QiiJ3 -9#Hؚ3Myӄ'ft9 -O$:K+< "ڹ 3gp&km4N.hc,6=i%_tosB8RlU>3gd_q*Ggl(ʘK-6Y ,k"Dglb{^$`n{¿"FraI69I!<6X<!AXcaщׁf/oglu%C)1F&WiHhGŹɤjm/M1|llQ<(qX)EDe\!96C9zh Msy'}xl DD:|5Yu#G`}98TYjQLM KM6;"g1ŎRi}3Nu->Ӓ'ӑXI.b⎬rUTiO\35Aq"JiJϪK׹%2SFTlN+в4i4b+pKzcudַNئf-49$8!bɓcSUL8>9g hD)0|9"ZF-9M8G^fc+\o[B,6͗*MiF!fx2FqWR:=Y|_:7SbV6(ԍ,ee}V6gමLcՎ<N+FmT)7Gy &ٱH)B,ǹw%S#RBw]S%&9oFѶ[I]vf9QȚ~?5()͐@%Нt&ǵMB^L]IW%ݥd9q86dJҊ6NJ|+(i2= -;KbD;VꟹOTC|t,z@-l#ݙ{rQ6`ٵ)I/ bv![f͟qQ{ň} lBy+.QNԲreG rW'"~彬eq'L?N9jL?REx>+ e㖣ݳu+D.IG7!ɮl{+=grB9N\^Uoq%*h -d`8ŴB/ -|9\F>𒔑$Y.5g<kQ,^7nPsgl]%?ѤslJ\mi:?W6Y%K%˩^61͡[-IFrHV2"l^)s'tofWa)(H?TE%r~coJ*'ԊdhE{pRC}ߓ[)+EI?rRD[-e% )"F1R&d))Aeز<,"ߒX m/QO:^{ "l}H +IءU4h야"ȯb=M5i?Ux*szI6̧8?}Lm`JF"k1ͬhII0f -1-OYJm& +X=7p)xKROE&ԏiNb5d%HOMI%ȶS#RrԄbZD./xĤEWȦRrB_ir' g(Ǔ%س$d$Fm>)ܮU86*d~6Z#ZTNMsc3%&86##̨# oĐrЗl};KR&zKɬK!$3X|^\0-ۭ\)~i[fʑ>lOCyKͬ"l՚3gr6ihp_oe6 VY&6/6Ǚ4BszWx+k)MJ2˒,UUq2h/DrW"N -x:c;o^!N#SR%hs8#$qbho&!8?ə1sJBxy#3|'eHJSP<~B_&52dG<1K%EF/iyMk-X__Ċ [ZISlVgiuR6ޯr* Y88rY8m͔&qxh"jH+\ѱ9 gzkDi}Ot8c2<'q7e}Bs")c8̇#-),%. ')ne*j-(<-dIy!Bp4F"t_,%%Zrˈ}ҋ BtN+-N+ʡ%O'9UgK*g4JppQLҸui*\XL4˭^gFv~G#|z4ˆnqDy㲴\TV(&j_.2YF](QRCfhn?*j/8?ܚGĥ,dM39x;$8bFτ;H1O'¦9bWDS8!T^+3*򳽱”lp9b&[ VXdp8ٕ2xFb,d>L_i - -bkŒ8F6Gs^HjY(EV5S>Ch%G$ojlCM*)Z.پ|\yE9Epj*f¾=~J\ME}f̷f/+|z6,^#s,ZX߹OT-?+ ,,^ŝw1%g6e|K%^S~{!ԏhݾM: jO0G8Un,ma_KG!dUju6;f(wԤ:?TU6u!ڋUD˟;,e fh{v|/r+?oiw1d$B޲8[s[BO,ZYԇRMEOnWʤEje3Ȼb  |\i\xxÞ!-pbh눸-p8+_DJ`-3e^)K.ޤe2ҹ= -;B6)ȚoV@z.!u&57qZbrQ[MYuD[9yd}Q)E>ʡz-ڠ#~N^D2E1o--wi>cy29\n u0Q>~_HQ#1b_qs6GܓCUZͻ!Ex͕yE D iEu/$l1LK66+KV,\|)sR #LZX砡\wYPP58||Xǻ 9~v5h\%bFbk{>zM|vkaŋ\8Y,JXq#9 e!?,o\?!:b)[ؓ4pGgv%ls^Q$pSbq{&qI --nrdG^) [XoRz'̍ɬjbOT8̟idII22="y`$p\3Z6-_IWDA#Z3ʺ"QjE}{,~H>EoTTߩs5f8I!Ir{%5ą͊^8h%d#>*~D9!A엒$hP~Gzɟ'2J3\By߲͒٪m![n*vz Ep69>mNpFpX!'x'C؜v HP[gk(Ȫ+mjA zա{$bMhO M͘%C"^ vJwNmk[/y],4/MIROInk_gÌw"$bvKW,K ]ybyrHImBn,˳}D6g'Ks^\R)cY+)ienKh5\b3gџJ_Ft|泉Sl`[87;-o2%]2,oвdY6 )73N+'EĊcC~ |o zIܘ咨cԆBީ1E {")q\(P8Dđu6bպOjOT""oV3}.DlҥáNrm˞UU,9hɩmXUhp9r_ADq'ݺ#+~[E"(Ϳ-Ⱗnl9d1̦UdǩmOe" -YE-h咫1yPORzn_E˛WK!Ԫ)kV5qKVaivt, }%LϹoBeάՒ'&Y)fνYa>?&pCJ_BrZpǖVY55S"~F'uRqcn$N rT:OOsm| -"!ɶqgW#`_tJ䠋%/- L9T!bsXJ*ZEu 56+k0ee|;dPl~H̴X6YuAږDU"`/KKW&"n^hD~HL+!L}HGdk,eG΄HoKoBl HOobiG3eYFg)/w#ɒ=UrHPHqO,_.J( h|k"gDҎ#9#k$aErdSM싞9(JMVhl|>7Z@6+͆OP\f'"ͮ*%9<%wX\Kvn:/RŹ7ÂHrlщDiap"d(VPYи{2Ҿ*,QDq||i;1S,ym,%HF2Mϟv'R ՟1xȠ G䏁B[-2J&xadVp(c\)˄s2SIHk3Z -Z֌B81%xV7OB˔|\'#Idu>hqvx 1hڦ#a^+ik-^ TJn+z˙YrhuƦ;"Źdz3K%0L٥.I"SX6ɲ[>lU),ɐmrHQ3^2| eĶmǎG Jds;Q".1KK\"KD%*;a.d`n/$bq2a#3<3gbYE}ۨroNmy<\dr!^|NF),a(]H,F z$/5fuպK؝O*|IU,6/QYRDTX$MKiˊgPQ%;d% Jz -Cc$q5(Ea-ؒKC±h~’sYKBՖF^Z|QGU ddN{4[\˅=r:KAД$k\%ͽx5{+xEo31-u R5Gҿ]ƨ4'(,ql.MoJpr'U\ELWN}K泵 sd4N)s?RLk(ʪ&3(&"_8hQ.~M˔Y"(TNh4Te88 ~k;_PK,]O?&˺kٗވveI_okGwԷxDe=8&i&ס<B.^-uEyҴm58^TK>y+$wg)x}FS3ٖr8<8M`"k4# -(Q#9rۛ~s5s7nl)z!nyhѡMW%7䏅'?(]̳lW*Ebgk6zXzcѕgE}~ \ ilUgƥ[*cp~7ȮSǙ;8'ͦ {Dʥ(a&J/G[|>h٣#d_r!@[fleؗFU_j_Į>.IJ&WTV6B8 -fD,$QWѤRjo7Qؗ.?})l5KKRAk̷+r[_ߤѲ[hƜ&OSko>Y~[t]kd*hQ^Hko/92VH([(٫O4 -_WIHحڋ}/aIo~">XFȾl'nIgQ\0Q>X2^߅'jճh^6yH"?r-/yKueo{YzDYBZ^Wl0]?Me}xVrlpע-ǤIKe6}$qk(~aGݏb jY|+x_ͼEq[,~UlєDi}esDel7Wf_伦_a5KaHl6z/cE&}s0YBF/J{Q"A^,6{ﰩ:Ѳբ^=^f_,6~ax\}[6fSԑl͟/}<,E_q^] -_媉e+%.h|&lQoDHRT^M!75ws{mt+l]}66xİ.^le=ȣRO TFZ\9evr!F6VH4_il=Qeqr卥>8^0|I/m߅'mlܤثR!ڍL[l2}}؆^3 F/"1%7A -3VQ nvJ)Hqgl[/Y~ ۧ6K^EʌM~_)zɛqEJ$0%lFfMlPX8z'\ԹE`ǐao_)9j!F+1>] 3h^3͟2~?4sTnhN&aj(edsFbyNBS>&Gj14jhߑ(2y;&؜[q[?D6KyԺ=Hʭ*Z'S#h I DM&N n}%_54|HɉX11b97fԬ1^fe纸$v,"'&Gj% GI8ews,Mo"8Hi-Z&ynp&d/VNmx]諵n~Y'[qBm'RZA;c/E}]Q/.9!GDU߲ N$ޢqh^Q#gxYtW%ǦqqEK' W&j?}< }<$ -jv8o(i"%̜p\ഗ#^EDYei"_#GŧFFDFw"3&lH5&P H6? 7T18,Fx$ - -BBwk62أGj6[U\~#҆RG v/h^q9xK6!eE|#L\t٢ETת+6N --ߧ6HyGGV,\M)g "y7yGji8|(>{M!ct:Oc.^$JqZI}(oвzÙ  I ~ӧOc'ei]Vԗ҉$imjI"*K6Ux~r W%T^(ٝi@QS|GPI>d?7™EhKH_4&[49rY3G$&om*FxlјMg{lN'$).O ܠ5%1|^d!MCQ䏉! '|'$c;dߑF1#9 BBos$q&ex)aѳy"I6Gox3 71yD`7ryG B:#_|]_˩^g3G$ 1ſ,4Ɇ^[㉈lh/^Kdɗedđ;.G#"[r[TaoFVOQ_'#|~VS|.^fz͎ TƦdy=+-3Y>KzijĮ[ʖ 18R|DYຶ9>[%$Ş[ۉƛ#E?M|e|{\b[ڏ3/鹎LBy~7dbCQ9/ +OCRof"/TZcQ#ZrxVþ<~G 8ɘ328bQMpF`ˬM$ngsg2bh`OKKhŒJG f>?bœOYl&f#T=\l~쿠0mBĚ6>Z;WiTɒ/Z69\tɩzجN$r*~ϏTSAyjGEkZ ϙ8<1z|9d'.lMDM{y6{a>4l=z/g()<"2<"vOeͯbx׉ɿrޅ,)_q#'2F$ݙ,[QGɁ7_wh/Dc9p|VdM/37yM邾+ BY6~[xC/O[dV %^5K+D)XzIѴc2\>Ue47 Ek4YlyH%ɎrHqK! I͉JȌ#-&8Ln 5KĜΣr2<)CIV4Uo/f?8P)UQ-+~x%8m3\͠.k\UԥNi54Fpdg!##UYDBpo,s^-eZJ1')<ωSھl~gOTl?l<܄mJ0XIoќ1d`Y %7# |92bhd>zt#+mJ#m1E]F]LA8 >m~KQ+W[ͣA4OeB} Ԟ2SzY<[g䫩WB%E{D ,3N)r3RȜ~k*#[#*k<%K.ܑ֢gZhR^bj9qRy)OQ ++9Ǟ_٤4=fM吪IDpY I"HL/G1Evppk,6pֲk #̒o?,~xD+#tVP{!JRm 5hL+ɴ ^?nK' Q$|EFG/-/ۖn_o㘜Ys1jЌ`n^(jإ빲Y^̦q#kL޸[0 S$p?QK:JH|>[s)eyS\HGo~Xނ7*IliIsX2ĚFc$%dF_GK1Rc#Y!=͎<)s8biNS)? -3\N;"0r8r1)>[CO\z - |Va$b<9K;Zxɖ"(}72S# O-N+y-yK{k3[f-X䞥t B/[$6'mچr(*ű"$'QR8<9X[g6'7>QMs1m;3'שyDV!LQa3~/TKY3XE7O$6Z -(21=\Ã\*)[7m1+q\nWB{O{fqp8)qf(ї' -;4\/i"2S#sk,PzVKZOF$f/(33'q7 -nXX&qE1yFHxF;flդh9GkZ>'94 #XN7 =Q'De'ʒ<c'Ig_[/rR[ɐdx0{K KPIJY-iqd}oin|*L!'_*NmHϤS0&I,\Q#%)%, JO6(ZlN[M஼A|DViǂ xo2qǑ%R\).LK%x>2(`_QL'|;֚>3MzE!oJвx$ȌGœCͬHaGѭ~o؟B+:) ?1GRDu] - -L}w\xNblzZKu]t{Ke XRKse̥}reM"ExaﬧF??%2Q}JWnInC<М\D{I?vB)6v_䣩%3ȶOɦ$2DeG{-+#ze+)CCWB]ω}=GpKt"**[ˉAv,_RȇQnbeJ{V"$"ASވ$i+}yq!t+e]+$?fK>.O;ʍCn?^'іԒ4CϪufCWRO|D!܊v"¾{JI{Wiok6MI*Y\cБ2^Z.-eU}D7ݟRWݺ芛&n)^.s=$OјU&v]e=ue}ԗR] :v~쨣R.90p DHeo؁wqyO2V;t1WBoD⮄2e]]7SڊA%"Cʺt.enr-^Rɕ?r}D7Oٗu*܈y>ѿuK#/أ ?⮟ϯgЗz?RUue} Bo JC_)%ۺ>CD eEeL'lSXT#HzA?uOܫgh_`ȭE]tWj*hK%v_\؊XޛpAk]_ݹ/i`uWj*oФnb";к#e]?]BO1Y_MՐKta_zT;_MnIt,&WHRLuB^c-ݺ*YFG$:?dVo -^2TLvnGRެGR%}E>=n:GqOj1C R>;g-dWDW Y_Bdtw>)>>kد{ЇioRUЇ}ORn{t,ܙZZ,^LOiI_j}>va"ܣK2k-ϫ-iqv*7 ]/S#ԯJ'پ}tܙGqkٞ_z?6JʻwVWL%ђ?CRʊ;&OD{D"}+^t; >0\2ݺUY}dQ[Wigk.>=l]]I/KJQok/."΅K:=d[͠ٲݺzu%ٺ7ne= -UڊvIwQv7zGX>>cTWu,Ɨ.ȿ:YOQ)ţz?^KOpJK.VІD]QhGqVUзȉvJHw"KTdE] - -PR/ϩwQgAn}:t^-fԻлWvw[ovn)E])j*dY.L!M6u#+~ϿgЗz:Dl }It&c#)J{Y #t_.GVЏ \Z#$w\DLAHꊺrިڊn?R%eiOj./6= -V^}JݬC-fԴ ߾.w!ftE]TL~}O;~(.#ۺ%Oܯ'eXUF@n&Й% ue, l!KatBDYS zh.)b;B( **,{R}VuE]/RicQOTGu+E}dYg=/DLC K-e7D"]Zm_BRO޽̿]GT5섽X{(w1viYWo^ϡ%#uE]u,%ԗA(Ԩ Q܇%ԇa/{DuiS-~}/b=./uIWik"!܊Qok6ysJE[FP>>U]ͣpw[ЌCaok6f} TM!%ԩ}yWDUԏR "+u+k ͛7yw?Ww {!2պHq.^7Sފ Gq.ѕ?舓mTLB̷PGu =l%} z_PG/DA_r*-/IGeeE] v^< ni"X^gM oizj{ڈڲ]J܉vn?r=Jz {!?Ey僢(-tMO]FTV"LBF=k#c )DԣRO=eFҒΣaws'ЩBeEAq*Eݤ?%J>r TV;Yu-ǔ_JTWj#ԗBYV{Yw{3On껊{K{Y{,Os˻Yw˻Kt:q'{7L/*EO UШ]P]>}~{B}D?nD:$>?%> "?nv -_zDz!_]$2/.^匧}H6Eh -KY[F ȭvh.)FʽZOCg+DZOXS[6;C,ORޏ{$˻Yu-~췡Ry=)3 u´WTSТ+&=KvXWچ2RЩ:>Boj%Ԩ ~#gWr+E{?y]D:-\..{YsW+.B.ވt3JKE@_r*E ]٢lJQŝ),/ɴu!7Oi[ d{YweݥUڊ{ nk%a[)!܊?t<|BE}"Bq_.RՕbCKhw" -;#+_i5E} w"Τ-yl:wiA!܊ڋ;Y{.Oj6y" vڊ -Pgio=sh#U+S[ͥ[͡ue mH}OQu+G7e/bAD7e%ܞ -چH_CvdQ!Б.B,!$J܊6~?hyEt>JoRrD{Kz~"БyY}۠Wл%Ѓ+*_r*-/m6nT{ME]> -;Qb6h#SVmKznw][z3ib!Ч/Qމ-ϡUЯ"TMKܜ:erP?qK%VW]:"{Й>⮥=诡Q܇1?HTG>FQ} ޥ"=ԭeeW%"5Azŕv//yJQF}QfT.O/Jͣk(oivsKe&mD:Dn{J{J_r*U7C*, -P -:#=:/va}HL}It&G{!]:w"w2>BojE}] -$C{{"=V@DM9/]:+^Ž=%C E]ywyKHGiJ+D:vOj$tHv(.fн7A\]Փ-o;J?z' ϴQZOiRD;-YIki_j%аI:;oij{PBC~ dd:YOz+A}̣d;I.ѓEЁb$A}Ž}Q^׹gDz^+XTdKiOBU[^͟3t6vUڈr] {_QcY/!Qu;Gԫwc6CwiVZ.6l}vމt)WBUЭ2Ot;aYaaB’]~ ;gBVtR!h}It$G>%+CGz%1/HEڷO+/$Anŝ4GV\GGqu+]W2 -Wj-e-)E}OE+ܫDYo EC>,~i#S_͡!m/oBطl)_BUV2eܩ] -Iv_lI麲7VtK܏a^+eOE}w]D.}h6O.,uB2:?y~+[B rkOإE]{l u EL'_җm/6fϺGl.WB ܙok6?D v޷'"SV{"$JW%п_FRK#BR|ذ"7Vt$K/wVʻ_B&މv]]It.? D=G^ퟸA{e} H$%ȩ}?Sh(j6f"Qڊz:2Y)JQwk6ifB=WSڋY{-Y_]USGr#7g%)WiYJOi_RYukECe] /*(D -GvCD0VCB= nAz~#GWBYGz%ٹt&D{.4G"%eFވ%/wZ. Q?d.ҢUڋYv#g麎f+CDY?J{KM]7]{QjYs^GeQ{ew{WDln}w.]eȭ}:w뺮1t,D>@ Ͼ̗$:ntF Y_r+'Qif2~1-XG&E.eDznYx6] /Miwk ++E=J.yOj6eM6rFq>[͟//?{>}R]{-n= F ?f[ԨٗG[Cn]_]*DgDz1z"OQv9%;>[D!t:=7"] =eh}"މvn]3>;Y2Ō /DQ"Q_BҿPj.f~)E:rT= -a(l +B̒,aA%p8j- bLDrK(⮗(sXyW[ĊZ x@_V^Lk-bR ݳ)_~CJP;Lࠟ]ww t'пϮ:XA CDzD2KѤЇ{#>VQފ߱މ a'Eۢ⾨CQh~SN"H'77U²EHKOTd"X#'tHV4IAsT[~xc J)q0>[|3G ?,!+jP8Me2Pa2R>DM7sd+| S|#EwO "1i;>ƪ$e:2 (Pn%RuIE>m_i"nII{+';ٟDR5 _1/wV"hMIh%Xd0(c^J -DWd1 -JI#:eVZQIRK棁ŅŒ4] [9O2Gtl38'5v2JN,,4$(K+L8#n˂2Y?܂[lS88Z\0\(vI,FRo)>hk"0[ordnWcዧĺq!/vE3& 9K8r|jCj8hqhROA#0Y>i$VO(< L|gSc]%On[,OՒYz198eɑ\ЬVIR3G)/u QXqDҚ'd#et8ֲK#8de(Lv$:lm~A -|DW)<6WTS8id/"FNZ9-d(.LR~/"%PMc%I’EUÚ<#ghKYw:Lg{kMH6vlN'8}&Գ,sD<rv?Ы!7[b]F>m'(ĎV愞Bu;\D:nKX< XFiR*/qWz)D:0tÚ*fΡ4FmxD3ok#ןw9+ǦI%˗<ȃkAy2RaS<\#6H[͡ni,6bd5*mʻ{QWz'ǞC("ɤ:_^tE{bJb; ȯK,DWK\a#gQ؊س~AN,KЛK/:R\*_j6K+ǔ擊ma< 3FlOSdCi࿡ǜcDKXu AGT$s_IYx/_Qi`w"HN_Sp>X+dWZ.\(U #[*}ek%5%)ɓN<:#mN%ktbd+Q!o\1Io;HCwj'Z<1fFy-H\qɥHN0IK]n%ВBq>} BYq>} } OcBq>9œ -kĦ4s3 YÍ~ĸq%p6 nQ|6(ƚVr-f,M7 29[Tf/+{}cpw$},w@>IFxLKNK|p<9w7(8)OM)&15cO,ѱAo1)É-g_'$rlhʂO{G&.b[%kY4嗽|$1G& - 74i4eoI#I/'л *ֻ}Le Aq+{CAG{sޔG8߃Fr2&7ѥƳoo BV-~5qK'6xɭFOw?r_//?J0G#0sv| g$jF1<59_ϡ{Q-~ cn,_q>ߒ}K~wi&j#)bL,՘pĞIgpֲcs[ӏ1NYq*'G!^{ίƛvH^-y%3\4FzS~skQ'ƴK-Qэg\r\perK'5mAlM1X1/Y ۢ9ꄟ6./3&LJxgxWRdbT/hc5f<|YCɑWL4{m")Hq,~kz3oiɴOZK{G KFq!Hd!Mo؛%$<$"Oh|/V/4yIhrM8f̍y Lc緡s2R8"أI1ZdtD}!ZE{o 'S'ICE:+DK?RZzO$f4 IDg+-eQZORջ985Y<R|R'1O_΅R8RܐA" jSG8ϑVN|E]kȌV76Tߡ{IvYб%ݬlL! -cdek%9M$pg,2\*dbH׈XƦ - 2=Fߡ/rSb= {^Oc&ő}$D&E$E)?AO_%bJK)%b8f;:'pG -!%Q3,c#qĥ^ʭu\ě;їm;6j*E~x1$F\B. gvG !$Kjy!4L1'~brx<,B[hHw tx%⾄ƾY[\^_R|X6L2*щ^kls\bmU3ϹmY$_ћGq5~fpXߡtӂoܯ%^QH9M8Q49I+$$dQ)"M2/2dNYEsx F1VFM /*l_!-f4L̤p·Lh}gаd+} |>cɢ~d+H^Q(z?W6g͓"l=0ͤTU'9HC1~or6~T&KJs"ݎ-Y:"J>/ܥ -zVO!YƽK/=\ܼWT~6DbB9?"5_r^1ψ dS|bOsƨO EGԮ慧/1N/pi!=Q޸ԚGòZr0⹉N,I,)$t,s,>E]xN4G,S#~f'&EC8YL"͖mhFf9gO-{{Y1%=S-}`L"²PmĐ&[зWq[oE5#%lr 8"ȒCly䄌"fG͓xׅxHQЙ!SV'u˜LTà#%8ԮMykbkr TRR󑈯"냍 /UOgs-%^rLW>9ձb< 5lCQD)4q,kTхx;#NņEEyQ5Y^X> 2)Q,,EkmoePO̦nrz"c,5Uub|(ƬmjbKtzv3|1%|*JK]ЩrDR\Y$#B^b %ɔȯd%3.Mгس^rG H])/1eaq~DDi,^frc%dJs{潉a4,F$XuBK{c&Tu8I,#K Frc`NסR9hK#cj/ iKԥ?B"~fDXz}+ա/bVT>96]&Jr$7Ź:}l&~)+y?K:Hn&FGʰ]b&!K泡g_ i_&eE%TiE.4$f)<3Q=Wj䅺/"ܦI.|1R8󻉧'EŦy G\gB΢=<+"TW~} =9>|D%YЛ~5f?VaXs54{FS5gܞ |E9?/0Ʊ>}ܸ^$x$o R: -UČ\5p+c98"JOj_$eyz8.}|d^D-]5r88&cqE(hi k9G X78}G97MomA?=ʚoPzGIG^%ZbĽ¨<6'=qڛf%3Bq5*mz꥿3xBy=0Y2HI~I>h3S(MQ3.{"ZdDZ8lLrqB$b"id׻O#LYxbmy= )YW8ioD )Q g/.(KزvGōrUƗK=_"{P)>E 4&Һڑ שAV⏆G7QRyhS`|N,$N>ia1<SVߦN0#QPT}+v4d毹BiᲆQ$׹wBzȫGi\}<i>$L)I&gziORפˆ떲WፉҌ^e- 2dOqWi/\%%8:`_-b/S)KD}ʞWҷJMXGć]ғJaM.+-KYznkԎ|p,} 3I(VC2~T^o$uDT0gM M&"7̪Iaqn%͋Սr&8Eʵ2ovXpOmv?ڙR.~ĥ-cl1gǩ)-'2Or?JbX);̗c䆽("] rbhD8&C?fK"T\79еy Y WVe'?Dpl[QgOl*".KПqJ_WLce%'(IK~lkL{9&~M}̛dJKKD9|G<)XM2s\aL/RcePoSH<[,e&cMy!Je*(J5. sT6(o_ Ia)/!4_ʻQŎr8ddת)^Z! y< M$7|'-c͐7#E`_r-Qю Gz"O'/;⠳'N\ĝc|8mOsGIg#' 8&}LȫɢIv_Μi -&"XVDZu<tci]1>Y8LՑOeȡ(()EdJI`2љOS>GzoQr%DE&ۈ59e)2U~K$%$J2ܡCROUF#L_,V 8SxL%5<~1K"Ъ1[xr<-JkW"= KKD^ić.C=_4Y.)he,8c"S -%pE)4C"ٿdDH*~-^.!Пs,K>c A -DcnQ8Z3%Y.pXskVA^LIeDУ렬Fп%d:օkm?tkv?t.h߻)h{rS#ɉ<᳙=D Ǔ 7JK Mc94߇%_.;1D#Z$9G3WО=H'K>NV&Vȷg2] W1Bv]]eJzv,"sD_#FL W,%Y9vh+vgy<5\`1`IqW~gk&HR6'Q~Eb_h_R}dȭ2|ؒ>YԂc6Y8Lds$gZ؏.?s20ip.dJ>F<~[\иN j)X$NE̋·4JkY1ţZ -(f#Y.hH#8RnIhִbFELJZL3Ex,ii8q?QjZ21LR49 z1(r8Iȡk_:} OYpA2 "{IgW# R%ԚYLxӊYiG|v?efr٤d2ُe3,Y<#[ .9`ni Oq4_#0GF ?EI,<O ZDɏ8I9X sO}? So%""ūY>$&$68ɋ\ij.q<0Kslc9!BeƤqn-Vރ<p'?RVߓ"$ɐ IVI$M#&!46쎱4_=BC̭&Eܲ)"eH ( 8$OW. -3YCk{|Ţb}?뽺kmY8%K%aE"άXc|8T^= >GîLVJrx)$$,s1$k1f,$,m" K_hߩ>Iz3,=~O! -0zObI&pYy!:G$t#6В8x8y#W|'̛#9V<-j>lQ$G` -e}Lqcc߮_OLI8R8(z) -V6b6E?#!FHK GGy^'%&J}wR1oBOG FW)^uNK_kvFv&W#2f!-ڙ쾲HѤ#-i$Fƪȕ2=NE,1K#p91F|ː+,z=Ht[[?FKNYL1uMGc&x#<)SOO6%7-$NSDdZ2 !K~ȓ'VB^XF beyʽ[# E⾥} 2V~]ߡΣeY\З>Ma&/6FR^'BP^REz7#Ut%d= e CK'6^EavG&Jbl&f#<' /ϡ$ar,,7&Rȿvln[E}'q,q?2F"_# F2\d(tF,grvJ*X8gVF1aBlb"{ F-2K 9i`y'VVJXElyEE+!9JՑ7X=L+HMsCS##p8'W%Ph^oAf'(p8餵bq$FqEcZg%jXM!\44.)< {CqHO9f䥆a<݃<&NpOЍHTha/8¾^HQdWg?hѭ4jG*HĮ4&]%x㎣Nxj^^DߞdiyB9IV44wYE\GAJ<R8h47<B3q/%-K_|N'ЗyD 4#'(̌VN19I4O\cgeԚ~o(%73Ū2ȷ~xVt-}“,ъ7Ď'G"k.dHO͎. J sDv&W(Ǔ!^E{p1&{-n%WnX6?Yqz4JyZXWԯl\Q/r{,gmm#94RiE$$*!zM`)/]#D8$FifB-(q8y,1T^<ȻWn81Jl97 1Y:fK܂!?&Ep&[_T-Y~坬"y׬Q >Y?=WR|rOdؔVdEI%GdkV.c4`8Ó{#bZ>i ŝO7".mt  %Kt{DECMp83ŝ%[܈̑!K%Ւ^ѳg}]Ֆ|jx& ܯ= 5Yu!`sƄ>{hAߑǁׂ*IuBYՖ K{)- k\!պ] ^{++Z:zY5%A%B-jQ$shs|A[zRb^ y9dN\VMG&iϩ `h%\Yr'2Y{WoQsH\X, /&c6e5cB0>'&8RnQ#ΣN-{LGf [ܔR{FZ0# cvoKX"RSbRcx;ԯI}$2)2}#qXEoAcֹa#[308EVLe} rEK3=ڳI-ؔ<2Ov&S޸$eAhKsG#{q0 Ɇ(gd| |pωh߉ɑRDe)1dROCGOY1d`8ԝi脛bsG cm8a<Λ◙,6\[d 2/i.CbhdPD<+t$O2'б|BD:^LY'~eenO Mi1{0s~H#Bfu Dב_͆ 9RH!D:u#i=1c| -Ƣ^|z_>}}VGK"λG5,[E=XC0%%VJms&y䭑b x-z\E“8GF^坥1Ǒ䳾 ܇O&"=H%u{xȺocdzͤ>>C"VS&J+%4qF9F'KG SO~_33͑"C>LCݏt9&}4'{2H!4V$Oud{I?r B}؛d:!е{YБ?ivKɽUISbd:WI^[!қ'?9jǨD6 E9$*a2Rғxʼn3ƵQ=ȿ!fi4Y%C#{9~&o"}H$DHZ SD}3%crk5)$i4MG=R'?BhIo D\GuI%|ӗ!|)P0g‹b|129zdko19 z FBLrE~EqZ-~"KĹݢ݄q47Qo3'o1ɭ=} -Ivcos }Ia,Q~M.y4 HK⑚|]X>m3In(yzzL:1~M.\jxXŽ&xQMJYG{_3#8x2f"63'HC#6e<%Ilp+b\:zK[[b˖.78x2*MP{׸(M-504 = 4rq1~M._5p-"Cz1TlI6B|ouJOà)Eܙ9Łk%(R>';9>y#(aI|-=ąda#!iIE}D^DGWM/tij+5J)!/"Oz%R6EF~;VzLcvyt$: "H'ԑ29D@A(&HG# u*<,~} MY ϸĈndFXcrIȜWБ}>0G$<1#'ZLlcL=Dfp67j $p&?K/ʢWЗA%[~4' -׸%)6ĈOb.$M{DdC\tn:OđV@cd Gs,2%"-e,qTZ^1^Y8cHQD::jdyY[8,՜@B}Dj";t%nc,!N>b8r*彳flճ'd*D:"D}F4B^ET%2D -k[4!)15b&x9C$%c" 32x̅)9!#4WG6" 'wfԞZ"Dc>ag6%Fm)1nb!LIfHQ!~M!U`isb3{ BLP8F/arp&I"BnqcjxF[̫  Ym&TGS -&ZK,>Ϯ!yןԡ4?вW/#IBȕREhFPyWeвP,8[bExZOy]E]FqȲǓGi^ ):? l6ReyBg~Lѩ07ХdqC ,Kz+į,LF/ĪLG+yG LYg]r?XM9hXb,ayLY -iMt/4B)X˝YQ~/e -P臟D9B1F!y8C臟BQs[8y8?BJ^&!l#F2]]TБEV*(ѳg5F`ل,8!BȿU&hSl '#SX4!,aɉ8΋Y68F/eGc9?XQBC(cȟ袊j7f0W&,9e_~őͣ68F+HY?.f/L]ѡlbCY~8smZET](pX! -l~8QbYB ~ߴU4QSSWFB!=hP(?H]lqUP -m)|:ыu|5Q]iB-!P㭍_1tP; ש׽QECT2Z(qQER2<xR=74)pz6_cxS^ -(Уp͌" śt(8Bh Z}c)x}1B5%P~FF(}Pc?+Pk/=% # Mz-uC腑%Ҋ(pfv9Bƍn>G4f͞+.Y㥖\_WD_KQE־wcN8 (C6y1Xx^a/Kh"dQbbǁ 1c;Ye_ֲ_UE9j<QSE -CֺQ(KC1]#4?ҸJ8B,1`QFkcC}]4>Xe,je4WE}*QQEB< K_*PurQEE -\ -]4hp #ȍ_e}6?1FB,7Jp |;n%Ƅ,Nly|6\Oq 9]RE -/E;$PwC鲇͗6_Eu؇뭖\KQEQEzU6_̽uzǮz3cM zu]Qs}u]WTlQUŸ}z3?ZRCk&Q]+- -N -t(&Yse]jǁ`Ϫ|7NX_5J'ju]k੮?DX}/7u/SQr. rur.Ϣ]KQN>K_F+];tr*o;Լt],vetPԨ1qJ_+⹿Uܷs~ucV=uzՏJR 4lJƊ**+X͌BWl^F3Ga`؎00b,F<#ɨAcc4,ز,Y6,hilX7My< "61 GQ,|x4#p1df8Eb6l1hX7X7MǃHЅ`в!c#BɳqAcRBXhlYMY6rŃf&lf8#PbNC#BɳqAc]7 3ebMhX &Ńb8xOybF< dٸ?F9 &őd؅g!4jlFǃQ`Q#9 4,\j9}zBGEbȲl1FBDn03#BɳfG/t8FHbXdYEdcаlF87vlY63Fply؇Xdٳc?thХz6r"ٱMhX4,B6qlY61ѣ #ر1ɣM6j_:.q6lF͋"fB!eض#gc#GGb6#cdвlY6j_?]qX&͈؅g!4,l[8Mx4hc,B&lr R1ٱBȲl1XbEbزlx 8 #c"Ⱥr}Xr!l؆,&1,1`ء&<4q!dF3B?EC_}BC8E "ɱx_8[.4Xڄ"Z9}_.e__F<8b}_h^j5.n6xFmWkDe.,up?B]R*+ qtlYKX1FBU`N\_[,J4hB͎V}.'E2ަo⨮W]BhЍ<.ǁB먯g5;?q}X8g#4X !5+?Wo#sCc5+?zEQR+Yen&ghQ] -5B(}!}Y#F>QqCq9pˇݱ4xġMCLJ}AzQ^?Pa#PxȰ,=(b鼨**+*nY}PlBF"/fѱ1yE5+= BW6\Yevgfjt'7s٘FQF#!*n9ceh)<]vHhF*|*n_9];8F0# *V7] L(Ye]4%҅5884qT5 -R4hXsy8`y2hxP̡ȒlGqySpR}?aBß8Yc^0PhP`~Fh8Q&U!dK1?fqZ./j8ETJ*+ᢦESG thEqtvC8L<[%d,cȲ4mвExgiMO _S|=wR((S5EEQE1$ 0`@AP1!p?BB -('@( P(P( ~j]C\?ΎuA RzCK(1p߭ c~kWU -{ "@(PxŽqCI(Ao0CDwB+A:Wk*6 yDWz5v }yRt*Whl[ ۏJ\EE@"_(xP?PpͣhQ(1Qĕ*TzҊ(?OJ+-&CF|Ԕ(T$`2 ! -Rzg]<^P8>9 $(2 lJ9 -4q9-8J*ZT䆎Y⟹>P"ܮ`ÕZTOpT(PŎECǀxi~qv -tb/BAB<~Oڔl,h|Bva>4(P(P(]tt]4_K -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000008216 00000 n -0000205041 00000 n -0000205172 00000 n -0000205370 00000 n -trailer -<> -startxref -205507 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b6c9673f-2f61-4d55-bf57-eafe735b53b0.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b6c9673f-2f61-4d55-bf57-eafe735b53b0.pdf deleted file mode 100644 index ed8e621..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b6c9673f-2f61-4d55-bf57-eafe735b53b0.pdf +++ /dev/null @@ -1,2086 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 195.5755 0.0000 0.0000 792.0000 0.0000 0.0000 cm /Im0 Do Q q 0.2020 0.0000 0.0000 0.2020 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -17.4086 0 0 40 9.07 3497 Tm -(NIVS: ) Tj -28.5839 0 0 40 60 3497 Tm -(1360760 ) Tj -21.8954 0 0 41.25 9.77 3449 Tm -(OPERATOR:FLORENT ) Tj -20.682 0 0 41.25 227.85 3449 Tm -(INA ) Tj -22.0059 0 0 41.25 278.77 3449 Tm -(CUSMIR ) Tj -13.3033 0 0 48.75 10.06 3400 Tm -(NR ) Tj -24.6151 0 0 48.75 42.88 3400 Tm -(POS: ) Tj -26.7823 0 0 48.75 97.71 3400 Tm -(C3POS-) Tj -24.7714 0 0 48.75 181.74 3400 Tm -(C12 ) Tj -21.9939 0 0 47.5 2.77 3311 Tm -(QLIENT ) Tj -27.2511 0 0 47.5 94.71 3311 Tm -(C.U. ) Tj -45.1441 0 0 47.5 154.67 3311 Tm -(I./ ) Tj -36.9724 0 0 47.5 217.6 3311 Tm -(C.IE. ) Tj -27.5038 0 0 47.5 292.3 3311 Tm -(:RO1879855 ) Tj -21.1264 0 0 43.75 -1.11 3219 Tm -(DETERGENT ) Tj -20.5004 0 0 43.75 135.79 3219 Tm -(GEAMURI ) Tj -16.3336 0 0 43.75 246.77 3219 Tm -(5L ) Tj -23.6223 0 0 43.75 287.89 3219 Tm -(PH ) Tj -21.3702 0 0 43.75 329.9 3219 Tm -(MISAUON ) Tj -27.2716 0 0 50 0.96 3167 Tm -(U79005130 ) Tj -32.6134 0 0 50 136.58 3167 Tm -(6422 ) Tj -27.1727 0 0 50 198.7 3167 Tm -(768027152 ) Tj -22.2987 0 0 41.25 -3.12 3128 Tm -(PROSOP ) Tj -22.7218 0 0 41.25 92.89 3128 Tm -(HARTIE ) Tj -0 Tc -41.25 0 0 41.25 189.74 3128 Tm -(2 ) Tj --0.035 Tc -22.5766 0 0 41.25 217.58 3128 Tm -(STR ) Tj -25.232 0 0 41.25 272.68 3128 Tm -(640G/ROLA ) Tj -20.5545 0 0 41.25 412.9 3128 Tm -(MLI ) Tj -28.1421 0 0 36.25 2.79 3081 Tm -(IZ4441011047 ) Tj -29.5604 0 0 36.25 174.62 3081 Tm -(6422465006429 ) Tj -24.0428 0 0 50 196.89 3634 Tm -(BINE ) Tj -30.2041 0 0 50 269.93 3634 Tm -(ATI ) Tj -22.4532 0 0 50 320.95 3634 Tm -(VENIT ) Tj -20.8894 0 0 50 406.85 3634 Tm -(IN ) Tj -17.926 0 0 50 450.92 3634 Tm -(MAGAZ ) Tj -18.5243 0 0 50 517.87 3634 Tm -(INUL ) Tj -23.1722 0 0 50 580.89 3634 Tm -(BRICK ) Tj -29.905 0 0 40 345.68 3595 Tm -(CIF: ) Tj -26.6236 0 0 40 400.87 3595 Tm -(RO10562600 ) Tj -21.106 0 0 40 9.9 3032 Tm -(ROSOP ) Tj -23.5846 0 0 40 90.88 3032 Tm -(HORTIE ) Tj -0 Tc -40 0 0 40 188.75 3032 Tm -(2 ) Tj --0.035 Tc -23.1555 0 0 40 216.57 3032 Tm -(STR ) Tj -26.3735 0 0 40 273.88 3032 Tm -(4506/ROLA ) Tj -20.8502 0 0 40 413.9 3032 Tm -(ML6 ) Tj -28.4894 0 0 47.5 10.9 2980 Tm -(Z677101186146 ) Tj -29.8907 0 0 47.5 202.62 2980 Tm -(6422465006719 ) Tj -25.7316 0 0 56.25 -0.49 2926 Tm -(SACI ) Tj -21.374 0 0 56.25 64.9 2926 Tm -(MENAJ ) Tj -23.7919 0 0 56.25 147.86 2926 Tm -(EXIRA ) Tj -24.2523 0 0 56.25 232.71 2926 Tm -(351. ) Tj -26.2895 0 0 56.25 296.63 2926 Tm -(50BUC/SET ) Tj -27.6479 0 0 56.25 427.65 2926 Tm -(60 ) Tj -28.0802 0 0 45 10.8 2876 Tm -(IZ1022100021038102 ) Tj -29.7256 0 0 45 260.62 2876 Tm -(6422768020146 ) Tj -27.1352 0 0 57.5 4.5 2822 Tm -(SACI ) Tj -21.374 0 0 57.5 66.9 2822 Tm -(MENAJ ) Tj -26.6117 0 0 57.5 150.68 2822 Tm -(35L ) Tj -24.7164 0 0 57.5 213.1 2822 Tm -(NEGRI ) Tj -23.4361 0 0 57.5 289.75 2822 Tm -(C2 ) Tj -21.4677 0 0 57.5 331.7 2822 Tm -(50BLUC/ROL ) Tj -30.27 0 0 47.5 1.89 2776 Tm -(Z974101075372 ) Tj -29.2302 0 0 47.5 206.63 2776 Tm -(6425385000492 ) Tj -17.0747 0 0 42.5 10.68 2725 Tm -(SOLUT ) Tj -23.5085 0 0 42.5 72.83 2725 Tm -(IE ) Tj -21.2999 0 0 42.5 109.77 2725 Tm -(CURATARE ) Tj -21.9856 0 0 42.5 234.59 2725 Tm -(SPRAY ) Tj -22.3616 0 0 42.5 317.89 2725 Tm -(MOBILA ) Tj -28.713 0 0 42.5 414.66 2725 Tm -(300 ) Tj -26.3394 0 0 43.75 10.96 2675 Tm -(UZ102010108824 ) Tj -32.0192 0 0 43.75 206.59 2675 Tm -(642276802669 ) Tj -18.2461 0 0 52.5 9.66 2625 Tm -(SACI ) Tj -21.0596 0 0 52.5 68.9 2625 Tm -(MENAJ ) Tj -21.4029 0 0 52.5 151.87 2625 Tm -(EXTRA ) Tj -25.9464 0 0 52.5 234.69 2625 Tm -(35L ) Tj -22.2452 0 0 52.5 296.69 2625 Tm -(5OBUC ) Tj -27.7155 0 0 52.5 365.99 2625 Tm -(/SET ) Tj -27.6479 0 0 52.5 428.65 2625 Tm -(60 ) Tj -27.1421 0 0 42.5 9.96 2577 Tm -(UZ1022100021038102 ) Tj -28.3557 0 0 42.5 262.64 2577 Tm -(6422768O20146 ) Tj -18.2461 0 0 45 12.66 2526 Tm -(SACI ) Tj -21.6883 0 0 45 67.9 2526 Tm -(MENAJ ) Tj -25.9464 0 0 45 151.69 2526 Tm -(35L ) Tj -21.9701 0 0 45 207.09 2526 Tm -(NEGRI ) Tj -23.4361 0 0 45 289.75 2526 Tm -(C2 ) Tj -23.9292 0 0 45 331.66 2526 Tm -(50BUC/ROL ) Tj -27.8066 0 0 46.25 10.8 2477 Tm -(IZ974101075372 ) Tj -29.3953 0 0 46.25 206.63 2477 Tm -(6425385000492 ) Tj -0 Tc -55 0 0 55 3.71 2424 Tm -(+ ) Tj --0.035 Tc -22.1574 0 0 55 25.89 2424 Tm -(BEC ) Tj -21.5083 0 0 55 81.88 2424 Tm -(LED ) Tj -20.8861 0 0 55 137.88 2424 Tm -(ECO ) Tj -24.2986 0 0 55 192.95 2424 Tm -(A50 ) Tj -26.1926 0 0 55 248.84 2424 Tm -(E27 ) Tj -23.2279 0 0 55 303.75 2424 Tm -(7N ) Tj -21.2557 0 0 55 345.88 2424 Tm -(LUMINA ) Tj -21.3938 0 0 55 442.9 2424 Tm -(REC ) Tj -28.6299 0 0 46.25 11.83 2377 Tm -(EL13801101103 ) Tj -29.6074 0 0 46.25 206.58 2377 Tm -(5949054916415 ) Tj -23.8603 0 0 46.25 9.88 2327 Tm -(+BEC ) Tj -21.5083 0 0 46.25 81.88 2327 Tm -(LED ) Tj -26.1926 0 0 46.25 137.84 2327 Tm -(E27 ) Tj -22.2026 0 0 46.25 193.22 2327 Tm -(15W ) Tj -28.8879 0 0 46.25 248.99 2327 Tm -(175-250V ) Tj -21.2557 0 0 46.25 373.88 2327 Tm -(LUMINA ) Tj -0 Tc -46.25 0 0 46.25 470.77 2327 Tm -(R ) Tj --0.035 Tc -26.3974 0 0 48.75 -0.17 2280 Tm -(ELO9081109 ) Tj -29.2809 0 0 48.75 151.47 2280 Tm -(8680985523118 ) Tj -24.0125 0 0 42.5 320.89 3775 Tm -(FIVE-HOLDING ) Tj -26.8276 0 0 42.5 497.5 3775 Tm -(S.0. ) Tj -25.8903 0 0 50 246.85 3725 Tm -(JUD. ) Tj -22.8536 0 0 50 307.76 3725 Tm -(CONSIANTA, ) Tj -18.6428 0 0 50 457.91 3725 Tm -(MUN, ) Tj -21.216 0 0 50 525.78 3725 Tm -(CONSTANTA ) Tj -26.4193 0 0 42.5 306.51 3686 Tm -(SIR. ) Tj -20.0911 0 0 42.5 378.85 3686 Tm -(ION ) Tj -20.0019 0 0 42.5 428.9 3686 Tm -(RONTA ) Tj -20.694 0 0 42.5 511.09 3686 Tm -(NR ) Tj -0 Tc -42.5 0 0 42.5 566.49 3686 Tm -(3 ) Tj -47.5 0 0 47.5 9.75 2228 Tm -(+ ) Tj --0.035 Tc -21.617 0 0 47.5 26.9 2228 Tm -(BEC ) Tj -22.046 0 0 47.5 81.87 2228 Tm -(LED ) Tj -24.2986 0 0 47.5 137.95 2228 Tm -(A70 ) Tj -26.1926 0 0 47.5 193.84 2228 Tm -(E27 ) Tj -22.2026 0 0 47.5 249.22 2228 Tm -(18W ) Tj -21.5181 0 0 47.5 304.88 2228 Tm -(LUMINA ) Tj -21.6796 0 0 47.5 401.89 2228 Tm -(RECE ) Tj -0 Tc -47.5 0 0 47.5 470.39 2228 Tm -(6 ) Tj --0.035 Tc -25.5244 0 0 45 9.85 2180 Tm -(EL9001612 ) Tj -29.6074 0 0 45 137.58 2180 Tm -(5849054922850 ) Tj -19.501 0 0 45 10.91 1555 Tm -(BTOTAL ) Tj -0 Tc -47.5 0 0 47.5 9.75 2129 Tm -(+ ) Tj --0.035 Tc -21.617 0 0 47.5 27.9 2129 Tm -(BEC ) Tj -22.046 0 0 47.5 82.87 2129 Tm -(LED ) Tj -20.8861 0 0 47.5 138.88 2129 Tm -(ECO ) Tj -22.0301 0 0 47.5 194.89 2129 Tm -(R5O ) Tj -26.1926 0 0 47.5 249.84 2129 Tm -(E27 ) Tj -27.648 0 0 47.5 305.7 2129 Tm -(74 ) Tj -21.2557 0 0 47.5 346.88 2129 Tm -(LUMINA ) Tj -21.3938 0 0 47.5 442.9 2129 Tm -(REC ) Tj -16.4921 0 0 46.25 9.9 2080 Tm -(EL1 ) Tj -29.532 0 0 46.25 42.65 2080 Tm -(38011001103 ) Tj -29.2766 0 0 46.25 208.58 2080 Tm -(5949054916415 ) Tj -21.2837 0 0 46.25 10.9 2031 Tm -(HARTIE ) Tj -25.351 0 0 46.25 102.82 2031 Tm -(IGIENICA ) Tj -23.8639 0 0 46.25 223.89 2031 Tm -(BRICK ) Tj -0 Tc -46.25 0 0 46.25 306.44 2031 Tm -(3 ) Tj --0.035 Tc -22.582 0 0 46.25 333.58 2031 Tm -(STRATURI ) Tj -28.6635 0 0 45 10.96 1984 Tm -(UZ905335 ) Tj -29.2302 0 0 45 142.63 1984 Tm -(6425667001247 ) Tj -21.5713 0 0 50 8.89 1938 Tm -(HARTIE ) Tj -29.6861 0 0 50 103.78 1938 Tm -(IGIENI ) Tj -19.5283 0 0 50 187.79 1938 Tm -(CA ) Tj -23.8639 0 0 50 222.89 1938 Tm -(BRICK ) Tj -0 Tc -50 0 0 50 305.4 1938 Tm -(3 ) Tj --0.035 Tc -22.7991 0 0 50 332.58 1938 Tm -(STRATURI ) Tj -26.3919 0 0 43.75 -0.05 1898 Tm -(UZ9005335 ) Tj -28.8999 0 0 43.75 134.63 1898 Tm -(6425667001247 ) Tj -21.2837 0 0 45 0.9 1853 Tm -(HARTIE ) Tj -25.5902 0 0 45 94.81 1853 Tm -(IGIENICA ) Tj -23.518 0 0 45 216.89 1853 Tm -(BRICK ) Tj -0 Tc -45 0 0 45 299.46 1853 Tm -(3 ) Tj --0.035 Tc -22.7991 0 0 45 328.58 1853 Tm -(STRATURI ) Tj -30.9941 0 0 41.25 10.89 1805 Tm -(Z900535 ) Tj -29.8907 0 0 41.25 130.62 1805 Tm -(6425667001247 ) Tj -22.181 0 0 45 10.95 1755 Tm -(ARTIE ) Tj -25.8294 0 0 45 89.81 1755 Tm -(IGIENICA ) Tj -24.2098 0 0 45 212.88 1755 Tm -(BRICK ) Tj -0 Tc -45 0 0 45 296.46 1755 Tm -(3 ) Tj --0.035 Tc -23.2334 0 0 45 325.57 1755 Tm -(STRATURI ) Tj -25.9555 0 0 42.5 10.91 1707 Tm -(Z9005335 ) Tj -29.5604 0 0 42.5 125.62 1707 Tm -(6425667001247 ) Tj -26.5189 0 0 45 10.87 1656 Tm -(RTIE ) Tj -26.0685 0 0 45 85.81 1656 Tm -(IGIENICA ) Tj -24.5556 0 0 45 209.88 1656 Tm -(BRICK ) Tj -0 Tc -45 0 0 45 294.46 1656 Tm -(3 ) Tj --0.035 Tc -23.4505 0 0 45 322.57 1656 Tm -(STRATURI ) Tj -29.6537 0 0 45 10.81 1607 Tm -(2905335 ) Tj -30.3861 0 0 45 122.61 1607 Tm -(6425667001247 ) Tj -23.8736 0 0 100 11.83 1404 Tm -(IA ) Tj -20.4648 0 0 100 60.88 1404 Tm -(LE ) Tj -20.081 0 0 38.75 -0.13 1256 Tm -(EST ) Tj -18.5277 0 0 41.25 9.81 1160 Tm -(OTAL ) Tj -21.3464 0 0 41.25 71.81 1160 Tm -(TUA ) Tj -0 Tc -41.25 0 0 41.25 127.91 1160 Tm -(A ) Tj -41.25 0 0 41.25 156.5 1160 Tm -(-) Tj --0.035 Tc -23.5079 0 0 41.25 183.85 1160 Tm -(21% ) Tj -23.6523 0 0 38.75 -2.25 1120 Tm -(OTAL ) Tj -20.3299 0 0 38.75 74.82 1120 Tm -(TUA ) Tj -20.3131 0 0 38.75 129.9 1120 Tm -(BON ) Tj -14.0302 0 0 33.75 9.06 1079 Tm -(NR. ) Tj -24.2857 0 0 33.75 51.88 1079 Tm -(POZ. ) Tj -22.9273 0 0 33.75 120.95 1079 Tm -(ART. ) Tj -23.8736 0 0 33.75 193.83 1079 Tm -(IN ) Tj -22.5624 0 0 33.75 231.89 1079 Tm -(BON: ) Tj -29.6324 0 0 40 5.89 508 Tm -(Z:0146 ) Tj -27.8509 0 0 40 101.87 508 Tm -(BF:0171 ) Tj -21.8841 0 0 43.75 11.84 454 Tm -(ID ) Tj -24.8686 0 0 43.75 48.88 454 Tm -(BF: ) Tj -31.0124 0 0 36.25 7.42 362 Tm -(S/N:D8470001107 ) Tj -23.8351 0 0 43.75 10.75 307 Tm -(CASIER ) Tj -31.3154 0 0 43.75 105.9 307 Tm -(1: ) Tj -27.937 0 0 38.75 322.7 759 Tm -(C3POS-CT2:1360760 ) Tj -0 Tc -52.5 0 0 52.5 594.16 3168 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 52.5 609.9 3168 Tm -(BUC ) Tj -0 Tc -52.5 0 0 52.5 665.89 3168 Tm -(X ) Tj --0.035 Tc -27.5601 0 0 52.5 693.83 3168 Tm -(27. ) Tj -25.8839 0 0 52.5 734.7 3168 Tm -(93= ) Tj -32.5188 0 0 52.5 790.8 3168 Tm -(27.93 ) Tj -0 Tc -52.5 0 0 52.5 873.88 3168 Tm -(A ) Tj -52.5 0 0 52.5 578.16 3076 Tm -(1 ) Tj --0.035 Tc -20.2856 0 0 52.5 595.9 3076 Tm -(ROLA ) Tj -0 Tc -52.5 0 0 52.5 666.89 3076 Tm -(X ) Tj --0.035 Tc -27.0613 0 0 52.5 695.05 3076 Tm -(13. ) Tj -22.26 0 0 52.5 741.76 3076 Tm -(00 ) Tj -31.3942 0 0 52.5 792.9 3076 Tm -(13.00 ) Tj -0 Tc -52.5 0 0 52.5 874.88 3076 Tm -(A ) Tj -58.75 0 0 58.75 618.94 2970 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 58.75 637.9 2970 Tm -(BUC ) Tj -0 Tc -58.75 0 0 58.75 693.88 2970 Tm -(X ) Tj --0.035 Tc -27.5324 0 0 58.75 721.68 2970 Tm -(9. ) Tj -30.6923 0 0 58.75 749.64 2970 Tm -(96-) Tj -33.3314 0 0 58.75 805.61 2970 Tm -(9,95 ) Tj -0 Tc -58.75 0 0 58.75 874.87 2970 Tm -(A ) Tj --0.035 Tc -19.8177 0 0 36.25 381.91 279 Tm -(BON ) Tj -23.0709 0 0 36.25 435.89 279 Tm -(FISCAL ) Tj -28.9694 0 0 36.25 378.66 231 Tm -(9000221498 ) Tj -0 Tc -55 0 0 55 621.07 2872 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 55 636.9 2872 Tm -(BUC ) Tj -0 Tc -55 0 0 55 692.88 2872 Tm -(X ) Tj --0.035 Tc -27.9084 0 0 55 720.6 2872 Tm -(5. ) Tj -29.6546 0 0 55 748.87 2872 Tm -(49-) Tj -27.9084 0 0 55 803.6 2872 Tm -(5, ) Tj -27.3771 0 0 55 831.88 2872 Tm -(49 ) Tj -0 Tc -55 0 0 55 873.88 2872 Tm -(A ) Tj -48.75 0 0 48.75 606.29 2778 Tm -(1 ) Tj --0.035 Tc -21.0511 0 0 48.75 620.9 2778 Tm -(ROLA ) Tj -0 Tc -48.75 0 0 48.75 689.9 2778 Tm -(X ) Tj --0.035 Tc -40.3527 0 0 48.75 717.43 2778 Tm -(5.81 ) Tj -35.3862 0 0 48.75 805.5 2778 Tm -(5.81 ) Tj -0 Tc -48.75 0 0 48.75 870.89 2778 Tm -(A ) Tj -47.5 0 0 47.5 590.34 2679 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 47.5 606.9 2679 Tm -(BUC ) Tj -0 Tc -47.5 0 0 47.5 662.9 2679 Tm -(X ) Tj --0.035 Tc -27.9633 0 0 47.5 691.02 2679 Tm -(10, ) Tj -24.3622 0 0 47.5 731.89 2679 Tm -(49= ) Tj -32.3752 0 0 47.5 786.87 2679 Tm -(10.49 ) Tj -0 Tc -47.5 0 0 47.5 869.89 2679 Tm -(A ) Tj -51.25 0 0 51.25 622.2 2576 Tm -(1 ) Tj --0.035 Tc -19.8736 0 0 51.25 634.91 2576 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 689.89 2576 Tm -(X ) Tj --0.035 Tc -35.0821 0 0 51.25 716.5 2576 Tm -(5.49: ) Tj -33.5238 0 0 51.25 798.52 2576 Tm -(5.49 ) Tj -0 Tc -51.25 0 0 51.25 868.88 2576 Tm -(A ) Tj -48.75 0 0 48.75 608.29 2481 Tm -(1 ) Tj --0.035 Tc -20.6683 0 0 48.75 620.9 2481 Tm -(ROLA ) Tj -0 Tc -48.75 0 0 48.75 688.9 2481 Tm -(X ) Tj --0.035 Tc -27.9084 0 0 48.75 716.6 2481 Tm -(5. ) Tj -26.065 0 0 48.75 743.53 2481 Tm -(81= ) Tj -31.6613 0 0 48.75 797.55 2481 Tm -(5,81 ) Tj -0 Tc -48.75 0 0 48.75 866.89 2481 Tm -(A ) Tj -46.25 0 0 46.25 618.38 2380 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 46.25 633.9 2380 Tm -(BUC ) Tj -0 Tc -46.25 0 0 46.25 688.9 2380 Tm -(X ) Tj --0.035 Tc -35.0821 0 0 46.25 715.5 2380 Tm -(5.54: ) Tj -34.1446 0 0 46.25 797.51 2380 Tm -(5.54 ) Tj -0 Tc -46.25 0 0 46.25 866.9 2380 Tm -(A ) Tj -51.25 0 0 51.25 622.2 2279 Tm -(1 ) Tj --0.035 Tc -19.8736 0 0 51.25 633.91 2279 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 687.89 2279 Tm -(X ) Tj --0.035 Tc -18.838 0 0 51.25 721.78 2279 Tm -(9. ) Tj -26.7509 0 0 51.25 745.52 2279 Tm -(80= ) Tj -33.3314 0 0 51.25 796.61 2279 Tm -(9.80 ) Tj -0 Tc -51.25 0 0 51.25 865.88 2279 Tm -(A ) Tj -50 0 0 50 592.25 2175 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 50 607.9 2175 Tm -(BUC ) Tj -0 Tc -50 0 0 50 662.9 2175 Tm -(X ) Tj --0.035 Tc -30.3905 0 0 50 688.94 2175 Tm -(13.61= ) Tj -30.9036 0 0 50 783.92 2175 Tm -(13.61 ) Tj -0 Tc -50 0 0 50 867.89 2175 Tm -(A ) Tj -51.25 0 0 51.25 616.2 2078 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 51.25 632.9 2078 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 687.89 2078 Tm -(X ) Tj --0.035 Tc -29.9234 0 0 51.25 714.58 2078 Tm -(5.54+ ) Tj -32.9029 0 0 51.25 796.53 2078 Tm -(5,54 ) Tj -0 Tc -51.25 0 0 51.25 865.88 2078 Tm -(A ) Tj -51.25 0 0 51.25 594.2 1978 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 51.25 606.9 1978 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 661.89 1978 Tm -(X ) Tj --0.035 Tc -30.3905 0 0 51.25 688.94 1978 Tm -(13.54= ) Tj -32.8658 0 0 51.25 783.85 1978 Tm -(13.54 ) Tj -0 Tc -51.25 0 0 51.25 866.88 1978 Tm -(A ) Tj -45 0 0 45 589.42 1894 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 45 606.9 1894 Tm -(BUC ) Tj -0 Tc -45 0 0 45 661.91 1894 Tm -(X ) Tj --0.035 Tc -30.7801 0 0 45 688.92 1894 Tm -(13.54= ) Tj -32.8658 0 0 45 786.85 1894 Tm -(13.54 ) Tj -0 Tc -45 0 0 45 869.9 1894 Tm -(A ) Tj -45 0 0 45 589.42 1804 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 45 606.9 1804 Tm -(BUC ) Tj -0 Tc -45 0 0 45 662.91 1804 Tm -(X ) Tj --0.035 Tc -31.1697 0 0 45 689.91 1804 Tm -(13.54= ) Tj -33.8468 0 0 45 787.82 1804 Tm -(13.54 ) Tj -0 Tc -45 0 0 45 872.9 1804 Tm -(A ) Tj --0.035 Tc -22.3236 0 0 48.75 3.89 663 Tm -(PRETUL ) Tj -22.7923 0 0 48.75 100.95 663 Tm -(ARTICOLELOR ) Tj -20.1525 0 0 48.75 266.9 663 Tm -(MARCATE ) Tj -19.5283 0 0 48.75 377.79 663 Tm -(CU ) Tj -21.4767 0 0 48.75 450.84 663 Tm -(INCLUD ) Tj -23.3562 0 0 48.75 541.79 663 Tm -(TAKA ) Tj -19.4762 0 0 48.75 617.95 663 Tm -(VERDE ) Tj -19.9516 0 0 48.75 4.79 614 Tm -(CONFORM ) Tj -23.3952 0 0 48.75 120.95 614 Tm -(ART. ) Tj -26.9368 0 0 48.75 178.68 614 Tm -(34 ) Tj -23.6624 0 0 48.75 211.88 614 Tm -(DIN ) Tj -18.8065 0 0 48.75 267.81 614 Tm -(OUG ) Tj -35.6967 0 0 48.75 322.82 614 Tm -(R.5/2015 ) Tj -20.8894 0 0 48.75 465.85 614 Tm -(IN ) Tj -20.4065 0 0 48.75 502.95 614 Tm -(VALOARE ) Tj -20.3055 0 0 48.75 611.9 614 Tm -(DE ) Tj -31.9784 0 0 48.75 653.8 614 Tm -(2.45 ) Tj -0 Tc -52.5 0 0 52.5 588.16 1704 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 52.5 605.9 1704 Tm -(BUC ) Tj -0 Tc -52.5 0 0 52.5 662.89 1704 Tm -(X ) Tj --0.035 Tc -35.0938 0 0 52.5 689.77 1704 Tm -(13.54-) Tj -33.8468 0 0 52.5 789.82 1704 Tm -(13.54 ) Tj -0 Tc -52.5 0 0 52.5 875.88 1704 Tm -(A ) Tj -57.5 0 0 57.5 589.98 1601 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 57.5 605.9 1601 Tm -(BUC ) Tj -0 Tc -57.5 0 0 57.5 662.88 1601 Tm -(X ) Tj --0.035 Tc -30.6694 0 0 57.5 690.93 1601 Tm -(13. ) Tj -31.7383 0 0 57.5 734.55 1601 Tm -(54-) Tj -34.3374 0 0 57.5 790.8 1601 Tm -(13.54 ) Tj -0 Tc -57.5 0 0 57.5 877.87 1601 Tm -(A ) Tj --0.035 Tc -21.4056 0 0 41.25 242.9 422 Tm -(DATA: ) Tj -31.7787 0 0 41.25 324.89 422 Tm -(11-10-2025 ) Tj -21.6838 0 0 41.25 476.78 422 Tm -(ORA: ) Tj -31.5049 0 0 41.25 545.9 422 Tm -(12:51:01 ) Tj -33.9512 0 0 45 805.81 1555 Tm -(186.16 ) Tj -15.6712 0 0 45 210.98 181 Tm -(UA ) Tj -21.5162 0 0 45 245.89 181 Tm -(RUGAM ) Tj -20.6877 0 0 45 327.62 181 Tm -(SA ) Tj -25.0296 0 0 45 373.88 181 Tm -(PASTRATI ) Tj -20.1195 0 0 45 492.9 181 Tm -(BONUL ) Tj -35.5044 0 0 45 573.83 181 Tm -(FISCAL! ) Tj -20.3315 0 0 43.75 162.95 132 Tm -(VOCEA ) Tj -25.3923 0 0 43.75 244.73 132 Tm -(CLIENTULU|: ) Tj -28.2245 0 0 43.75 410.7 132 Tm -(08008 ) Tj -24.2548 0 0 43.75 492.88 132 Tm -(BRICK: ) Tj -28.9489 0 0 43.75 588.69 132 Tm -(0800827425 ) Tj -25.808 0 0 47.5 178.77 82 Tm -(TIPARIT ) Tj -23.6624 0 0 47.5 286.88 82 Tm -(DIN ) Tj -22.6358 0 0 47.5 341.76 82 Tm -(COGITO ) Tj -21.7249 0 0 47.5 438.87 82 Tm -(ERP ) Tj -22.3374 0 0 47.5 493.92 82 Tm -(WW. ) Tj -20.7218 0 0 47.5 547.78 82 Tm -(COGI ) Tj -24.7121 0 0 47.5 603.78 82 Tm -(TO-ERP. ) Tj -18.5089 0 0 47.5 698.91 82 Tm -(RO ) Tj -34.3506 0 0 42.5 807.8 1300 Tm -(186.16 ) Tj -34.4956 0 0 41.25 836.63 1251 Tm -(0.00 ) Tj -30.3893 0 0 37.5 821.64 1159 Tm -(32.31 ) Tj -29.907 0 0 35 820.64 1117 Tm -(32.31 ) Tj -29.0126 0 0 52.5 450.66 463 Tm -(90002214982025101112510101460171 ) Tj -24.6196 0 0 30 863.14 1080 Tm -(17 ) Tj -19.7698 0 0 42.5 725.08 516 Tm -(NR. ) Tj -22.618 0 0 42.5 765.95 516 Tm -(ANEF: ) Tj -25.0882 0 0 42.5 835.73 516 Tm -(0001 ) Tj -26.5139 0 0 55 741.76 363 Tm -(TD:00029241 ) Tj -23.8351 0 0 43.75 781.75 319 Tm -(CASIER ) Tj -0 Tc -43.75 0 0 43.75 878.47 319 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqwP"1 (l@8@&n.e&S0R@@&Ra @38N`#@`&ȃ"N4441b&ԲDd@"biĀE"U8ܵ &2#F,I -`BRTQi $10)(qBh b`$H@!)*8@LӠj` r&ЁPf͠粨]vN:Èh llJ4CB`& -IDBj:L$ITc04@*I@2`& (l@" LbA -i(Hhd6@dY&j44K H Di&n#IH%@*i,TD` 2Qp!(h@MiD0lp bY!<dZ*dg*i{OP_B -]Xb 4 0HE(8j S!0  @FB$8@dR4, L%$# dIC4 1Ȕ*Lch+vjƾU-z$ 0bQŃi B-0 @@Q`6Dh ` C"ڠ BpІb h000pLW%؍}#c5  R@ -L@ %$ iSp8F 4M@!)DI: a89D&%$`Fi+&c_[12 L J#d!I& ` 4k=iWzOжkh Ӷ}k$(v=K.ƥaCwnUפao5[X7١\EUmŒ p,(H%(`@&FI,$@) `&PhͰ>L10dI"#)h4) 9DV(j_07ޒm u{0|69&}n+vTMn矠@!c N"&0m@Ii4ԉ! 4mM~57#_T1 -I LA1i(h$! - R(@Bpi7h4$쁮Ad!VGM)zɔa{DR#dP'C>?Q p9P@ ) @!3XKX#$4!cC -Iuv4pclje]v˫)bK3W$뜮zu%4{WJ-TLLJ}Vok.kȩy+vX.etD'5!J2LL&V0P4 0L e1RHT3]elߤVbG44(׏3鱵4`mؒ+'Rz[6dY=hW=ޣNifY}MK:Y-M6VWCA2ᱎmsUψcbAw4+c Hf b` - P h!c48@ъP1 -QC7 0hA=LrGp^^r}^ͳ^(iM O쭲W0*hP%g)!ZlE" L<BF`CL0\zZ4!&$q $0bGiڬ]v(so,o[;j_tUO]I>jxH-rlL]K=΃ѣd,jP"T  044H@4LQ8.Ap#(`hbV)`PFE![Y5r3gsUJKYt:eMjvl7OғǡI.*Ysqw.CꥴEcCklI{n^Xy4Ԛg'HFIC=#tT|'m/J)|6͞\MmS^Tn -edk:֯gNtɺ@HNV`&Ӏ hLLa1.SBDmSC$ " 3pMŲZF<>_z8˿Ǭk+xcTK߅[ =[}iӝM!8Lihm8D "1Z|d ˄Hc@&'@`H)$'hiiZ -kNJj/0kf_aԨy'֧z(?Du{]n.!!`(@`bFIB!0!0 L(ohb$$4, -`X6 궮;Mݴ;VLej6*2l[ݑQ̱[]B+^6-;p ` $0@ L0*4,jh@$H!!dd]8LIBRn,D1%(8'9bD=r̐_RA=%BD$0I#!a GWx#6]>:N5tuq,~5-4Իc.>Z -tuѣWD/o -'N3`Z.^a"$*``M 1 `Q` R!`b-c +6`Fv/|l9e`^kuwM֦+2z_̴H{W(C+v |v9tl񥞷e"=X#8`0ĉ B`q 4``& I1`e@ CBa@ -Iy[\s7jyZU5U{)xYۂpUQ˲8(N5J)6hwVl1i7;S=c٤U,(o(4 l`h+N( BPLA4@LLJ2! bb40D-bsbR6aì{ү^l!jkbKKnҏuSV? -mi$ F@ h04b@LI4 ĥ B@M0&5@e&hmMXOGuz- -6VI=⃸6܏o5};:B*mŗG|q `Q!@$ @0M(  h6@1`KO&[X 5>;EܔVlznh16r+ѱvч]3QE_i`M I1c@$P,&RX1H@` L"LD0'C@!Ӛ*ʼs8Pr2xČojy "yՑ&yzeA=pVyG$5dDZ)BU-NeafK]5iąslF[0Yc -̳VxHR=e8Q>I?,K6f:"#/Q44 RJj0jK[c$ -5D 2*ۍ[qޅFd L[-AFlFz/FS=F6K>A ce$yb1=y{) -1Zb2!1A)be4ynr{GNq|sa(AALc%S L( LC@1LQcqk&@T@Em&$Mx,S,D+%q3.y9q1,|9˿sM]q,{:!dD @&4 ZIJ3Y4'&Ӕa -0 s@kR] Ss-ASzn\d4i٩`&&&JVЪ -x76LUֿ}ʵԎMF^gju< -L(?^vӑui?;&cQOާ(B. EI -$@Ć I!:=!)e(ZDVhbjC@ $I1 CcYf+{k} z+:28ivJj,C4Y-p}YB,ʎ΀;ʫzS _8bzPSf `HI`D0b#WRqc“@?΁KKɺKcۑʞ]<^RgߕTr^S? -Et)ǑU6EBzzTGA4J5ܮYio}naxYc\r ^G1ecGyVgvZ 6?6uf -ւ4na5S>:f*LBd!I  `(ށ8N^fټ>e5{{.T;7Yh=wEםu.]]B*9RZVF_Oyu*dmzVc:O8_n̺rz6Jd[rI@07UЧT]gTcoe>*uUOkMs[:=#7d]*լv] (^x}/W,ctӺ@rQ"LCQV@5(2mD.mUsmFMg_uǕ3묎 c/2t{9cXFJGpYe;W,;~%(R2Cz -lu%s=muYeƛTg\12V)>[nU:W5 z(>/q]ΕLf:g80DHI`!!i.Q8S &`I5A@ÙL]뻨]vo;=IƽMzsΣO7l/'HUet{ZӬ֍G,xNAzsr5]CI^V= -Mi7̻qW\xWk/7T2t.q!@7- X&dLdh#(d$ #0@ M(0Av5N˲ȣd\]3rjUUR7m9(ʕN -wV,Z2:uutybaDN{gL[EJY:kCȤ^y=O9~L~,~Ay}2W=%^ODef,1mDw=hֵ5l)9xcm]԰eeQmg4٧Dދ0|yu).9ζOn_t#%t C+!}cGG==׊2%2:\FA&*OeR,F>w%29ʽ/ *|*H.Q=RI %cN{d,OJh6f!G3 `2]iK-+gm$l:!0qS*6ZMMΗk_j[#DUߚt|GaP3!bV‡`0 NG"ƽVrwP8gS#!!q 4Ɔ% CCbN,|[d.y.{?R[#:nɥ5ݨʥ6=+;Zl2p_k~/׺h"2?P')+Ut\tZ8y?}sؔuki8"] =ow`=yE(,͑4޻eU.s~AIt|i/{5yrbili]qYߵ$"Cb4 R@4ƀMZj -Zſ4^ Nܾgە]j7kK5kt{}l5j4{OU[h7iUT%Q/Dm0ZXSTBxZO.ծlX*%S׊{ł5sts YJ=^>Ω^[TiʋgEUu|u GX6>Y\7>ldYwd$@S! @!b!"B`D"5*!LrrH -ZEļޔzhr|j'D E]N(kCԞ;,=i{/D^9rvMQ-UkuIc諗X).TNiw>~r{T5 -OC_\8C_xts L`%  ),F`q24 -@ DdfIg16R$Agļg;aE}[(-v6Ĭ+Ʋ/A[Nu|&Ff0噶lspv/)L|}%.Vyc<͆rë>m^tNw`=sy*&r_ʀl$%$ iFI"0CdTD%0RA)T}ې$&a8pX>Ql XFyHX^I1c FJ=O8bxŬz{G&A&G^C!0R"*H*H`hO!"qL#" 'Ke!=:&)R'!c(˽|wZR.iy`+&M=E,Fxbzֱ6L3;Qйzmj";]~RC/~ċRoi'W&cћIk<0™9L0)*h`&1)ȩI" A=vlj5V֣7Qs=A`Q1lsg(j~^ -ߑ[S$W,6Woɒ6Fh×aNTW?mK'<څȨf]ɺ=7X^%֧j.exYiL,>ǰi v,Zgkjѕ^6T0hǖTkAn&ʱei覆z -zsA1 -Lb"I=dm(9cE֩m.UhQ(mh:}dm=7ZmR4afYЛlK(<5^T@ kL\!>91|  q1fcbl= IyDc3#ǟxm~>֙+\C;d#q#_ bezym -Ֆ,0ІR IldS%o87.ҷb+v[0F~1iZ9Vf 8ֻNf̔6ZẸdd ku*Ek^wLno놛3u!YB#UM>5d&Nmc[ѡ8Ʈ٬B9ټ3I:W?[m V/$"Ir[h![dI! aN*D0R6H=bJd'!Phk=E[ - vςxYQ GΉBmՕ=E^? lZb٪4o]46s:KwMNL-58J(#_9^n{r`^~& 1` -ACh)q?o?I}%b``!'ʹGM>i0Eo,s] ~}rpĪjz)96=n4rߴ]E@sK^E"U5 -1mF&U-Ih#Q - [m=Gegkx8=rIt:mה_S#'\sK[ -^ەͬyPӧaU=o+D:O5LG8X {m&@QH14aeYz7,a_'ˎ.OF/'iRl[.u{O5X n狕Rϣ::]ӘkO3K9λ3E[L кm~{k4d`l3#~~'nT;V.4Zo{*o2]#jKOz+6e^xDƸL]ά\h]/oM{v݀2L(4nrt}v\P8BP:w(2G+꫇z&N#]r+'K#FglzɗΏ]Gb¡9D㽋W X"1Ԋat/U+IWh\ηﶾ#=L*GEB)ٖ {} -6xK:篤Cr$9V{B@h0J2D %T+zĢWz9WSR/9K_l$LxwLs9Mg?YILBʥ+ͮPX 64< h}yE^im7TL*Z#K\}h3}yv/UMyyQTuԽ9xwsqJ-q:JkNSҝ5TrT[":$y:cRZ%Lם#[".q-~&"Q& 441 --*@$0E1,8=a0`'g[x*( -lP/sٰ[)ƙofiO-Hl6IkMkW2tS+um!UdLvdS.Tct~d_#7,٪6c᝖Ftf^tꙺ|˦2-0&!8ib$?O/RM%OYCT41@ 5ÑjvC\l._<{Yھ9Ős Х+wLtP.tgs9mf=/㜾ղo+R^Oݰ>gák&c+n3HtDJ'K Fqa"& zb1"sͩB&EpGI/9"9@,~Z]M\'m%U[)s]w7>-jl曂{ʧ^NE3'˯F5}b8KjZC:)'K/EdYlEًv;^tHU?0`0JHCю4& ̡1l+hL]gͺ)(V xi -цhAD<)^r=M^]W}zOr1STc5 ]Gsuge^gvnM]?rd^Hjv'> -7}ApsG9Sʵ6fW`]uZ2  4 44|!99FѶOLR־ӦTRV|&ͺRܢ>Rgp -/G Wu)c -Mη m\Z4/Q*,d(1DD=eU|^ʏt P7yR䷹UID[Ťh0iUkjG@*\X-y*ޕKXȺ`4!R0L@*"$ ?_?D3_IyHj4  + JF6zϯ˟ɹb.8ɦX˾ʭ!^]U29 W?ضߡf=cxl$Y6t2csϬ{aoͷ6뱢ft[I:b @ LAhpV& =}<"$Щj iZ YV_+[\ꕢ^Y9&# 0=AKy[|1 qPmіÏl8Wl%hh & S "bm=LM46/5[BFc G_[5dx{x,S(3&\e dc9b~>fYE^G$/0 M2@C^GCy$-/vDe^D6 hh&10!D< M&z`g{xT)$^jFm}6f^FGnu蜏n0"IkL\ͧ\O;yƻe;{@̫k*^-5+qήzf"Ӥ#L `hIĐR$m-@zI6@?XJYb&82@F6L hYGVce}6I~xg<[A Wm$o߹'_5nSZ> 7פr{7UN4 # #$Iq1M0M4T -Pb`I`&P:^m|qgRͽNWߠͬ5 )P{==q̬)j-adoYikŻO&/UKmDs떐A%kyɻm/?Kװ Sє@[Fi+v~dahln -&Hh"%S@69FH~^2H4 4 9)甪ualQ0ui~ew's"e -!*}, hkk7C#Me' -2yTo2؁&g薇tȐDN0ݬse{Ђh -3 Mtaf46@DLm1i\%F$1Y7#ZzxK4А9 !HL WB[k2z%Ƴ5xD*wMU(ӣ39ڹW\wWn MW2Fڽe FNd`M6M_;-7+4E4j#@#(D@(187u'͎>e/ڇ|:wSג,\hmm@mC3S:#΍{ãwegpiy4m*VЋ@H"`n}+h} nI*Zףwꑢi}_=dS];A:FVǦmU6^skZQ-ˡ6д ck7ʭXrJP"IMRJFHIi`D`ע.MֹF"7fk%ZdfpƎ3ֱo2 -{ey;{ө*ak#c.EgFI8*U -UzXR4U^<=+VTr{G8QYm'Fr8a -NHT")t˸r%ܤqB#O^ͪq`IDJ LQ p$0Orާr.@vL4tOsm+Gtv6r(3X.aH˶3%b2fs"2 `diwu -c6uv n9f nFzY <[ WL۟^q`("Z,};}KYnM粒qQatߙ}7Xjv,纼R6>7*[ -zN 1 4%!D%j!'PJ! smhUmpP6:T`97^,?| uJ{躭 -._tA1\BWJ9^Otr CAG<^ǭ}j9ƃ5wFrGm &ݴ,P8jr!q?xp8oVڃm76}UqU^FPls^J7N) !1F@ -L ` L0 LiU,*}nkVT\\LbS;5aes 5d 4'8 Wq~>NLSQH:k*U<=G5xtג[oNq\3&]^S˒'[}-mF~8Pþ._a-3.o_;JDNJŷGN|㣂P5r2 4@CY$MRQ D(hh(0C0I -H18Ejo?k}Mhx'rs.̺i-vcxK{6ܚ-%q\+Vprs:a(V&'F m5KY;7ɇz35rҏz_M'B]RVȧ\MS-{m҄ @@)A9M=%&@ І↣"Q@HZ"I>+iWe«lĭ7=Nܣ%E?@k fqg [‹pInxƛw A?A['x9OevO5} m\Tv]Яy  m 2hzyDLL@hQ@D4ĢQ@4'\,zc>dtqm54mAӥG`|{gzeQ[)_;:s@ƿG:rΏ*-P>'l|dK@0@M14 4.#L &%$!`z3rE'mf< lÙV1+&#(֬ɺA޹ظ /9&E_?"C>h4+ɤWmf/esu(.p4ZOMykeTe:r7֎Al<52,N|e_=pU$EQdI ` 4J.#+#p=НxqNet,םvZ`tn/=;p>x\d?j}tFQ35E-f'bUS+',Kɨ4xͮg*!29LJ\>mt fqV-|qXD%×&oAZ""[ n,b@ `0ç㠧.c.N-h]]s׉+9^^Q'ǒ[rQQmye7Cv[o/_?;"Naaz "%b`4pN&3:{5m\;cYFR',I|o#stCm*:aȯe9T2N8N)SGdߋ@o⧻6f\Z*EqEӗ//`M@ Hbhd&B(&'Ȧ(Ѐ M -BHS@fgJn+UULmn>8Ǧ/:G,|T3rx~iҫ6,{3z<+ƎFegM/v6\ScU:/:.9Jx̼Y7<\Ci}>{aTzJ(pՋͳY*EZ8rݚ{@]&R5; -̝k9w]9BoͦF7%.&sZ, 8Ѹ&1n%H `ǧޢ>W<:,6ەiʎ#[t o\%[EX XrΦr}=:* ̏·:-.,7

~XjŁ&zR.@$@414i! ^{<o^[^wg0n#O]>}saY -Vmj7]B:>NZNEsX1+νFlgTkhcu^gD2QIq DD@ -`PbDLn!!L/_?I'21PI*Mb`1'N>r<èjQp -7[~Wu=؏=\M߾4{0;{;Ѹ0c]{Ѿ߷>)НS}#7Cd=[MѬ끅U.M.:&p&A4MՉzN_x9=H)q?/AyN"P@'1! HdXN@>ZOsh,&ٔ2Ut p xMz#nZ𵅀6.6oS&|͈H-$@m$1:9yHM BH9Bd|}K^oΈY"$@eMEN$BQA'&|eAxeAH }.VԯػbBZNe)_h7nU(mZ975J6 Qf rbٞ)oFuɐ=̘DlRHijdF+c& &,D~r0uO/O\%ODSKZw;n<#j=׸U_n|<>t#^WY8N/wܹ#T &ϜLPx EWW$56[,-pSt9:f\:p}WJiKUlwKUdzzRyi}}kԩn̞g躵 RxfY嚙m"kFQY0 80jLC5.v10LxsnN\vtJ&f 8jOO/;I_ښO *^듢FyH -o14өC2}xxGRIrd<|aYZNs_1~-'ЭQV*p(,SVv}~Ssk-.,ZnT= J6ڥC9Ұ^4s:.XC9eiXtZY8ط~C`o2)X\y(biˮM_*[#3}Gu?uCsj@Z: XXuyTV6UX۾wEkr]ٴ| -Zmrzb奙/ehWKkgJR[rx`:P/=8۝-tjϾn !ʕ)k'[zOVV͠} U)8N:[G9-NJjWW2[BX§e -%(*mi0Y`jp`W!Da ,!AUzܿpY ^KCw - |]jvyl½ -(4{E ^0;^dz] mźuTtΰ\^ߤsb&eE4\.t4|G\ uɪݿ4<\]WGulϪZNi dն)9\_ dÂ]0r,ۂϻQj]G6IA?l[v@ޝX(֒J,܁h97Fr -AטU'hjpqYc:ci!TVlFwÏuLЭX}*9SU-a_G)5x>Q{muUp:oĵgvӱNY _mF:=w\@C>ʕ[%hVNc9Ee~')=?ӋKW/4]jzJ߹՘]tjNms4[.Z+xeƓrչ'W3tq -_iw3罂 -7uOz-Nc_]~a -mݢ,>=}v_?rxO6Sը` b`""rM_3;]N"twnIȶ==ts_^3S8GNbϪ<ǬwÛt kCG4wTTLs%G7]G:]D0Ci]λqj8w.'p'k6\;x˒#g{=i;&w>GAB:[f:T9WZ^[n:˛RRG2 hHhAML6`~|WJBн6~|v #Kϡ_C™[:ʵr$,\W}l6O˧ZTwBu5j^|=!X}~xŤYD *x|E_Yոe݅5=3fVR3rc}r>+fϧ|$6q:Pq`&EJpa(d104! `beSUmto*wmΟE|@{7dyGYQ:vJ>t7OWspzhqN._yO>~*9S;&H3+@9 8'"} 9/~9vywe?_"۝Y6Ω@<z_d<\ssɜBѦz2"4H0` DChuU;xD/Aĺi`08j^މ䞻tA{Аqdb$&EC,dBQ@n 4Im  & D`$$2 b J3QZh&P҆DcpOm,\`])#^YP+'ՄDfysߴ?7E}K#H Q !dBH6'"b0J,D&DD%A$88&&11qcDXک[ܹ"4tͭsNQt=$I ` b YY!!ɨȒIm04CbP $1DXZLpdE!!$%qlMԬLbNJ!)L&8 8qc@9EJ7 ' (Ќ2+` b ŃIHPA2*&! Ɔqh bJbj 0DD`!D dĩXED"$Hh`&K̓٥ߎQ/g3:#W:Ne'Qb\ -,C6F%( "!'` n D!HP0  $Iq E@Ѐ@8ȑ ' H2 ^=Q2 /@q"U21DI"1cƗ25[q9EY",b+0PHH" X D4$15!!DZ`$6LY$#QBD@q "H BqdG($X " @Y"&yd$DA"1Dd'` hJ=1ŒFHd&0",dQ"-dBH !šMH$d7D,n, D $D=X ĩ$J! 7M$`$DpcI HA$$M -L M)""ա8 @X Hr2(@a DL -,RDDdX#*48Hh' "Dd74!<X4 dІ!yB@#qk5n($8h z(dAb8MJ8"!$R6MZLM Lm"N%ĢPdbL@$D$2!!0 />)>9qYI' RM"+"щH$H7dBI7%iBBC$OH$&E i!$ BBq JPgMUfvqi]bCWqtNQ%ga8jD1"$ Œn2CB E@ @ b!H@48$@8bDZN,`$Iŀ!"   Ay^oyoQ (}[BsZ|REZ(a1 -@@!I`1"I D Z$m(Ba2C $10q h (h}u~)ZRHP:fXш |+GoU+TLH@` Q$ mD<" XȰ@M($ ` B8 HX,I b8rN N $ @ȱT$I+Hq9t8 --\o!S@9DVGk-ݔCh$ q@HI F 81Q$ IC" BDbi2BBN i0@ 2DA` C D DBqA",i@Dȇ:hUii#3p:yCIcP57w`!q@ $X"b474$Hn!'dY(dX "I!N("! @$9D($q`UiW3 -.V5~Y"bpz#ɠb hC@F&4!!cH$1$F b X  #Bh@ȱ$12N!$T$B$IȺdd 1dB:ݖ1wU!V׌nbao,Z}gmm7͉֖vFIze+ -l:b5lBZ4fN}*diw5#N8.Z#Y.U-ɼ+ڋy ^m l,:R(HȢfjٿ -exP7 {r)mv'EXK` CBP;zӠcpc#!VEHI ib C14"dZ4DlJЉ$BB Id$ "BH0uR0P3TmdXB #Rnmu];ǟt>HPz.6@DBB`D]{.l&gR|r *VwI8R.XΩ%gW.Ѣn -!@@ BhE0C2,DDIū Lh h@=W0阜 <܋@Y"-jyJe1Y<lvyzxzޗaZC)՞s1` ! ` h@@BBi44EbP:<8I` -6)F$3gdڬ }S1m1Q{hb4& 4 IiD0@D6`@h{XVmb7{.qd -b`"xmd^{ЕǞ }H01V(fZyoJ6p -Ĝ={(ؠP & - B b hԨN10&1Y(.^]N%"Uٱ6;gE(>*!)ϗ@*3{LN';ٽN|rsj뇡Tm}!*@ &&h b%`@cq`@ m缵Em1 )KŌMi `'3!! 0<&z)AY:~y&'J/=Op1!@k2hS[U  Y5hK -K_W6p3!9GP=Rn>dc~a&J,`@ Lg=6%225|J -yD7U,Jm,\jw V6@x9Qdu fjW(QR"zeݒ C@ E$6"! 0@ 40-(CMҰC @ R@ h8qpC@ @J,b `@X0 "V|LF h4E5@` "#$II +5,T@@H@7$,F$ H"H"S"Ir-$$ I$`%1uqhƌC$0IC3dkM3!<Qb59&l}+lf2 mQU{a=*LyWZߧogٙgwf>7KQXa9crh%9c=2m|ߞW7"f<<ʎܪ턒G'y{{HY<vT;<,]0<5{~ҵ9Կj63q%Qqo9FW_]~19OFA~Ydy瞯q׬?1|t iסpx{_;w'?S|Aͯ[.SԹLWt^^moE.|ZI]S>inYE[饚Xߝ'/>Q^yNGhN?XݸWw+Fql6$Q2DdHb$k,ex{eO({ņO}sjF&v>On=3|_5^{s~ϣwйCc|u/UVI=7{^{r+j_K̕o/O5|xev@g%}QG2އfo)<ߥ3URԢy^kD^R|}K00ks.]V2,ۭ.ںwV|s'$o׭o+ssNIHC@0``Ĥ6E[&Upd@PhYxϖs\F\9oS+xoШzloz ^~C&jm9wFn[w:}=T%+}jQOS:9grNzo44u mJ.ЎtYlۄssΥZVtشl[|U:>')Y%rK.*mκ,o2-II  JA؆rD[*e2)$ 1zAxrg~k8<MVι:~BOκ1`D""@W&JIU -D2`0gzw+O2ot |7cGM=ˣ/~=;znlΎaX@T锬z/~Œÿm=3/>QNi}t3.vgYTo5esT:M֗W.ϱ|霛zbWz?6F6Q>cw5WM9nuW\}qx{>bt~qы5M0CId c!*ˆi/!/sSʮG9i:G#|zB:/FtMy*N ͺ|_~2Cp̲\ۢsvʵubC&П;Xylntg)ֿ&}`s -G+\ uG/?L:Q;>EZxmtJ %s?ϾQet{E~\ sno>G!'͖#s -`& @ B`6m<h"Hg*_Lr$U^g;J;k|@Wzs;eG ^eʥs#MUr/ԛd*%cQ @V5yhDxk02Yf9R1|d}0 yd2818手0ɐa, V XDbb4=1pqcDdĉD @ h- iaPȀ4!$` 6 @I18BhƆ`40hL`^$D$F@ PR\F" H@ĕ1 H`BD$ @!$D@Z``H 1+ 0M0@A4`i1 `1D -!@B4"I "`hafPr RttrY:aR.+GK2RO>uurܹ̼2!`0P0BPh`łm<2I @ȱ+I! M4 bG9i!Z^Dz~P^( -Ym<Ļ-Y_\;UhZ8gF_c?XcvǑWp=Έ&MLLbcI łh$ih`#@`hq110 Hq@ +47Vzu/aEIY^yїOPU?,}w3i &VY˽9g8ɾ[cfϵGȣ{ݽ 1@Ƒ T4h0 - L`q - АhBI&  IGOĘy,>DH)d\ G$d&B Cpi!1` h4&0`!mqȄi  -PN!q`J$EI -QbJ"VFCdh4 h`@ &1 -$ ci0@ 0h !HC@ LdZu!J1VEB4q!HJ4"@EV& 84!bb@ȍ & XNd4i#IiC@Nt5d@B15Chb@&lD" @od'e(15f i˩yD}\NsWIϺX7/[ͶKv9v.z= Lhh1IȲB4N֙LkYGwZ~ҹ]01L\Fa~ܢnl"G Լs~A6WU`c{Utz}MٵO} Y;9g+kҍ=|ܟڈyԎ)&=m_F[BŲkۖaju9`n#kй?X*yӭD<|%V3Y+ch`M!F 1HR;X 5;;2|6柡HL,uCϺpn4iܙ?.S/ܣP4תEfG}3^jX6LoR#+#+/tes~@,M>aѹM0Q'™e*_n%,ϷZy)FKS{%RqD)= 5a{nέObРokY붋@iL(I%VR\-1ۑmB7lYݣ\ls([S W7vh<,4XFkن00\xgI;1^B<<̈́O#!aaYIqdKK]/C`H[W?:nSZƵT#fYi 4՚CjS-N@CA4Ոh!I:`V5y/ei#g=m:lZ軞EW -lyյihM]MMv_Y/ mRv~E*)ro:PV?K-Cr ?D}v>QW?ǵmE[۔wnhV -t=3󎉳9V=6r]&fa -f}#d=X&` ` hLbdMyfkeH `ˢrm~r%~"[36:z較3?X$tB_^q`գ&˓u6B-+i1t;-~nf^} -e.vI836Ek1CԊţaSѶIλv9t}`ڍa9ppD^Epvf/qҩtەb` 00D N2*λTOV -~B+[:;eXU=Վfs2]ݕ{D&iڢh`G6B) i#FxF#,0XYƹ|#;:gL68zzz}%(W8&L hҰ@BqhЁL# n3h$HLl s]9c,biyXW*t~j׭x)>Byqᨶ֦BMɁZ.u{)̦2=cI{:ן:ǕP~Ǚ]';PhS -ř0bA MI@`  VcAz31 MwRzҶ%th4eKSbNޒZoMn]E?"ˮ% يR=yO%ij*l,55`j4k:?57=^%(7$Lb4/kFR/sƻf i EiX"hTILDM 1P F%/4{#1"gdx,=A8F{*e*{cm-t ɀ!FDyz7Bl1ǎHy ) ƈhjI` 0!$#1LA%QF& I`4 K̡lzbwjnjޫjK/":KyM:)VQx+W\9F8B5׺ZtnHZFtcdKiQѓ?ÂZ55|ɑ鳗Q261  & -I%` ` SjHh6Z9y@n(bj4ƀIiy|fadoϲsND o yܹ,_*l6u.uǪ^'q3 1[ Q/sW{[ce*;U6e[WyTnA b!̋@@ `6!(E$N$vڭ<B` -J Q4s*ҲU Jajwi]FRtLs$< 2c~fỳ@lcg!) LM(ҏ^n Ѡz^r$HMhF&HB10pCRȭ5Ȱ$.Yk,64&-;󮒹z.]/ `ȾcӬz4@dQ"," @& `4q J-X JĆ 8I'(H`B0CCLbs[.|_+)`2u~EBxL+-D݅8]/Z a$PidDթld ~gF:6hsƕglkXҳϺ6Rkbj2  Gs^І 0@ bB@22 b) bС$)ō)+0@i#$sΉHYr0zPv/ y%u;U՛.zPp1>^i7;j.MtߜqjYŷsߓuj K]{Umdg&_># hh&1@11MHSL1К@E"@0$"7Lc4@^bRFU# g@4PnVlC -jҬ=|[_(7ur9oH2Ejv4hb,qJ 4!C@@B)BC7$9E+$&L`g(mI04T j)!W,TMzY4gTYgj<#*KA4 j+5)nfے4K -QhHL @`$DG(ɐRq $ "11JIDI(zd HRrDHUKĂU !)WZ]j s =,lhm:/;ZQb5h-ƶ5uf9?^<=2wQS3J2"b h` 0  H@!7IƾXc fkMLʷ2Qi7 ո~G B.!ED҉CB@3#9exmk7Aѡ(δ1F2@Hբj7E 4!$D%hh10 6( n2rO>G`,$JQh @И1h( D$Ќ*P -@R@&(ILHBqdC@8 D h 4 @!,8M}lε ->zԮ$J tk-vb dP+Y)&# 8h`@B0r Io9 -`@& &B!@uhR go9B}A6Z]^÷)}2s&eG*PrДAY8łm  X  4cH"E$_9CTAF@Dcb&@8141g%UwJo~Q49~*٧LT[{nVdq¹ׁI &@ r @j4clV4h   &7L`Y?31P b@҆@$D*n hʽAڳM`q\ocl>ũK֎Mg*ۚShfffōhj0%($ML4!c!W@1r:\4CI -b` mλCcU}k-Ю o}]$YCkyY\q m"~՞ZR9zyJJRRǶNq8#(8[./ƯC`ۚ.9zJ9A -a0BCHaJ4 @ I$ Vq$4 1Ũqj75tMMOz+> W1wUsƓys}fuLOm}t}УCFXqGeC -ek?5Qc5n o L%rʊgmܕ_,K>;tZmֱh H@A+@(88b J $NS(H!0h"ADT\iV=Z΂>blY?hȁ?1D6IzqaxRk7RjciC_))U2lP=%LDhbbHhHHbJ IN$D&!8Oc㽆8H 1& P*X][tcjѴҳ^v|/.!Han#qWlOjO:TFA]aoѧچWhub)sGWn1Y.3J78laBJZ=p5LMFI->N C h5HĄ≤ IhȄ&A/$%i1F3́z%H n,I& Jv+uξJgIBseh,aM,6fK -Eaeį.WߛnaӸAתgZtxujf^LLU˷1<3uxt>/g$I[hWiݙwh8LE!"ᨳPu(lR& cp`'H&2,X ƧpQztե3HJ:_5\:ʣsAۣR׸Yƺө:E+rd^ul(gy-QGsO-uFIm:O66jKeG35Y%sT:i.]hEkztOr$A@"E"d1e>`C_)I!1±gkUnѪYIgFDI [4y1r[c{T\LSA(9cmgd&FRbM$Df"G!ِf XfkP@ DQ'6N"L|/OV4 -@XȱƄ2!@&A"H&D&AĥPHA! EzJD7OD @"$@Ij$$I J$I%dBDBIqc"ISD *iƇ %KSǑBD!"$H=6L$E"q6DBI"IHR&ERpi2,ߛ&#ЄƔ@qȑ)=BHCQD($ 1 !'A! n dbz8J$ELH@"}AelGY=6LHHIg{?MdQD$D&I85I"ɑN,pd%1} Vg+ Drw,WMB52&ydȄCQ =T -M@ dddQ@>fT6\wMG˰>;l>];!Ã!t=DB?QO}N|@ςWH} |쏢Ϝ}|}(p>7%󃯤'wYvILyώ-U5ӴQ9dl6_G./uN&]w:y_5/\\Ot^iNM]LЎ;ˍyh#s8N5wp7vٗ gt8<˄A. SqGЇG[Sc<!5 014@"$%26AP#3`&QDaEFpBCqҾsʿS//~E=NSn\^-<܏9L뮽"v@۵h7r7yG:3E>EwUO`G7G\C9%_{Y.jƥS۽-/K@[L_ce ~Jo2tmMϗ;2dL#Šx(!*&5OJ 䦪ϒĩnp/e_yO/u_!I* OxAazJ1@#Dg=s)%crQ2GmU2vdItq9Y),9]i^b$k㜿\أ%rX2>:QJ8\t' ;tcZ)z퉎r5!Z\kEOTD`' +wkW/z姕\=_cTA5|_d%X{Q1oXJ%WZ/"fSO^-B涄cG`ܙl Y Nܸ{Y)1-މ%XjY* -c||UI5)˖uR:/T`PWnDˎA;ZPe=k3+܁b7|ϵ@UlJvi0,)͆Ly$&O- ?鑓}E9x]FXF89=t@b=/VG!,ZGAr[e# ŧM6G dث%a;ǘV4c;I_z|[Id$JV)ށ b/i"x q9Ǔ|5L\0M1Mzhdz;z1.0hPX؍kqk|"yj䫾+QqኈM::8f -ƐocưH$\!$Rr"^cynM,Ehfbĸioe~CHYp ZӬtґ1alkE-JtwҬCNVLzPJTW6[zTE*d,{NoJdE9N̾2p+_iӏcڍ;rczv7z#\F D>ʢ6iڷ*hկr>SOohѸW1sC|gugBrs+<2&hd15B f_Uiu 2a5]VuFA*ؽiY\ೖ\vS52ylr/?#eu=d*^jAO`e7^Q#Yd3rvbk)Ζ7#eͅptLjҲʤUV).r}+!M}_#a.qUzLvq,$L23UzxZsAe U4X+]V-FQVdhHl4ȫٗȫaUsAͮ?n#6P+NIdPYόPCs"Y9@3'g$v|ɢkUlbP:-g 9Ֆr*ST@5S"ȄueR2ȫxյbF|x\r"9(%/ -5rτl)j-oI-#:Mq17$"wIYY -2EJn^ϒJIX| o{-c^pI=Sѧ&tJf < dFV]ٲbWUSeAo\ЍLьdaf$@6b1cX7YǕqS9[不D{9[Ώ,O"y;*"츉DW9Sj/*ק+=eFXV1D_d`r^U!Y%@VY7Tр<ꓚ HyhYk%X;y#)ICoEO4N0΍t#lO`F&7ڎOo5!w*_ -˯Oib~ $VV!r"%;$JK#{ڵ˷눩cN*ZU4~*2 FvvxH缐Q5tTf^J+X(Q'kK /qwԨ\~0x~ˑ}6# ߅IН(cxOPzLyܦӤQ|h(q_U&jL&YTtf}`TsL7[zdD[V4s)M Ȋ=/f]רTf7(dN9݀3a#}%#`E9{/p_].2v m0$tX5ѻroY(bv:ʐQ[iXd'pEZ[I%xLļxd;?͵.Z>5, >F.&TMXQV8f5k׵ˇ킐#ny?Ǧj]\- :_A|XKp%Z#AlRBYn{e K c/o(D'vmIc:IÒ9 -6n&4-$@ ؁Ej#dtq rdF  D4њ2RL~6+lvt2; t$H?i=}nMtS?> wઉ*s]y̙o|߂{#_) 2M` mOVYQ:gpYLOAH5;J8y~J" lRK5`xZr7XgY-B8x8ꪙ13g)\!B$>܌fG{4Wd+cRw ܇!ϟ4\/' !9'tbiD,/9$Č#Pk ̳4"#f!tyL!N2{X6j)̚6$2|=U3|ru0F"ʒs|p../획 &MrUg)~r7S|6.'}C!F uem&>QNNa+cuxs4=VArwtƤM/$fQ [.έwȗ;ߎRQ*×hkQj k<ԉ1e <%AvvV|v8WVd"ͮ",]F_(B2t g`XR5y ->|81W.rNELZL34=- 79IlZ+k#55U[=A2jFE3?lsͬ.oZ<6,@֒"'Lwu|edP) -8˖VUYt6q65u!vMN'|G1\4(vB3R|2U!ň|cO&jOLvVzQX΍-,\g HIHYu*{zǤF1N u -|~S][a)a0}liJR7wڱLdUV9GnD12>W79d?*VQ6]y5,~Wiʭ:.I2T@A!+G-bb{9. -7,93\]ssdjۍ_Tf*%8RtR×j5U JN#嚣ٖa`tZ! wfxn f_Z'Kq2u8LqO `D\|4tY͖00-b"]PEbkrΈaVT;uNY~o{|S>9".؊+QqG&#ӟTƙ]҆njg7Un5{Q|QS9|Oup{UU^GFH@ )9Uی?ƀ {'<9~;Vk≳ʆd).%?T8Iw"0{@ ͍.LY`0[b$GSMh܌Y.%exJ`GXњ%<_%:[cxJz7RFGIc?*K|kv_*/?,5BzYH2 ά FJDWNE>Кز;~~[u7Vt=665wLOٻ:nk͔(=kdӫ%TZafz>IņWeڅ W9 cdG\J4۾ o0ܠ+~1WԪRИnƱȭr|1S$词+D+#4SK守Wc;ŒFOV!NБ&, ΍\HF0Ո+aƢˆ4y Y;rB~(_ƣZHA1 ⧱o6OY>*|U78oﹱ89șΜ";߃&#q8*.wOisok|ߎr"7UX63orA`$(ODDeUj㼚QC5L1c8F|?I*tlALlA5~ cl1{˟΃,n8mrD IΘh6#&c&m#9\H#y\֣ZL3u\a{qGc柷",/.X^֢StwOE_e@5zoYgU#XgQ$L_O.)Xf~Ɍ+\c]j:E9liZ'.!嬎⼋r@h<5IHq֠tVnw9UOR+cJ{b8sI(r: Ȓ@]́cftd!,o!:#?f(dOBdOM_N&t1`ʗsN\۩}AA/-TWG7b:_LX=Ydwu$GQ;M"ԟ'L~V 侵3ew5~\zYr޹2G7bT}v̓3 -Oӫ\Jb Y%')7Cr-Hc7vR"71Z^ݢj X/KI?-0^p[V| V9\JQ̖x<,|5||c5+ӂ AXGcT!جgɬwiAx}wc2,uy`^6#Ƨ_mR?~\<qq7[߆aL& ~GG+UkG͍7&c"Gk؆kw+ybcsՈY#2 zN!VµĮTeIۛT]Ic?0| !{Z#sѭr1˲bI6إj*&=qio3BVXQdLC K dRZ2aõR|I,"XQ-왓$S7SY +Vّ?uW0֝ʬ\wR$ICeLaNu{vF$5-CBGL `EcG\2D^xUH{nʠ!m󵹨ܣl!HFfSK+(dSʥ%ەr/1Cz'g*,<׎dj)_n?򠼥n ұ;`E } Ƿ.O~LHJRb}k2/r67&yB.R2e䍟c]ԫrOMg3$hK+aELt$I`˕#-z5+qՒ#2fSmg /^U2$Wmd -`R -H\o,6=~F\ózF^[J'T1F&s:*B:sͨ[W#V\Mֳ"}ebs=95eXD[bCb_ȕr-lEbl˖_jʻ7< d$B=la\ohe ||)A[a屮^?## j,dž5YS%tB}:~Svy縄ů}9cX[ 咅%h\pT49łL^C ke|G/wE۴HjPّ"b1XEш&e7ɑcbZgցd F@&d,$ˈ!VXMHbL';ٱL5 -T74oL0 Nj^; ]WՌp=8r8p ,X-%m>|SnӎoBHYa7? myMՁB%-e^quuwb.E"HY!f-#cayUqW%1 p :蒣uo9:Sy\~nui㼘ӿ(l9$suiM!ޚL -\Hf4/wMZueto=pS9+Ŋؤlc\Hv.j֌C#Ka /?*: -BR`eۄZ^TeaUz ޺ɜŒ[=4ȼJt<50ѕ?|%zw}WE^A-эpG!.6rCk W!FKg<( DlpdO s.k7lv%;csFIuCߎ˛pU^.6oW7̘؎͉W7ߏ7\ߏ7lE๿89v#qGp{n苋\SyHn"SisUVVܪ/=թr=SWmwΫQx9Ͷ Lk~N -ƻ=&!~=W`\x^o-~ \؋GmT٬2{˟M6L!qy~JBdoNl29Ho'NNVt%}4b0~޺7Mq'w6k G}.=l7'5BiPxDUj67~T2+7ͅbn> @6roG1MֻN;'q8'VO#QSe?n -$UWDۢN%~j;oV&Muco.B o~;'3l߂͛؜؋vٿ.sby\jYψUs2gQ؋r.#q51EĐǙ7cQ,hNLiyav1wj/Hd{$~E2;\)BHDW -FVX;IH|djc;ֆ;B$GV 0 \ݶ(V# 8vr< VL//7.60 `yX HeV+l61n5ܻ'76r7Ȋx&lG1?d)?S|Ok~*7.o]\LN -W98ow"U9W6#ઉɿRsx9v*:osyQ6]ӂ7ƽx9v+q8+1G|1˲oV'|\R";lcjndMDakx.OwڪTTL7Ycv5?q#kMs& ~tNCATjoLcvQMl?<~%Rc~9rw*oULO.˶ ]rw?n7!Uw±^E\n&+7 -v ]'|{ S~J^ -ϊbD*=ˀcE‹Sr;j[L9G9+svVpxyGoG&&56j'v#tDZ}qƷ\鳎ɛ" M<͑>gHhg9~;oo͛Iخvss&#s9ezb/9 -b㞉Gu[MϊDLG""s,iV;;#+yU7#&/ %*rn#HV+ލJ!.]pȏ? 5TI#pzMoMIH|CNLCBr{*@F{\:L+́,I%J%rA>@QdWs\dt,NLحaI$}a1d2XqgN7+[jFh`K|RV#0Ìg)1H4!gI~ B=f!11\T:B#!Hڷ"۫zV({\zޡϳzKc.\i*~# JnXTȮWIU2kKi㻵,w8Oʟ*ĔǢrP$d5.,QLrZ'F+0a(ܻ18VSݐ=RlVG1zbܸ~r`X*C~VWL*эjwQ=TE2!k=:/PΚȚҺLs(X Vu,k[QGn\i29aZHl#'oVI 6s.y8e"c뗬xnClBX8*1+]҄CLhj$hƅXJ*޷/:h[' Oe^@Zd@8wXdW#5j{yp%b#Fj}̻&xNOūsP'#]i*~+!nٛXdwÐȏluʱU=%GHfn#gEܱ%ddIB_6o-!r 6㕥nP#_VU; ృ׹[TdjpteNntkEYliF{?IH2UG;q 3gbHaGX"s,'9xK є(Nl Ee[XQ.)tT&L@(Ǟ&nK 4(^<`Z`W5cHG3p9PaDrWj5܎ֺ(\E~28؛ ѳn$q⅛ slb9M_/frlTMec|7|U刻6sbqߎos}|U苜͉W7t/s{*ssb;99Ɉm?+9E૎+Zlr/44̉;IfU"#wƝǑJCiG3-rhf+I ypZvG+Lf2<ǖЁcGl3:Hl52uȅ^m)p5T " jmוqN11M\t㗪P{V" (N?߃if;"eFc8I,qN@ ȏYFxHaB&L##}ɓp2 DFcI%GgQ@dkc#ri iI|Ht#W,ܤ'QQ\)Cxð|vccXv;RYb#NY  j5׫8Eh0qz#:BHUcH:tf;/vrW4mn7v`ҿrqRr^\8%4;'/DՆq D[nX2-<.D;"յRds5e4,ІBeX({҈%\~1 -qcI@28p̲֜:Ȑ v| БR@!#H%H3g3fIHj{ɍ$G4U!.ɽoW/vTF׹^ -W}Y֑ɒ@F~@{Mʖ$Ȳ|xr>[c !nC|07#Nh B4y+#E1JGb`/fdFabg 4/?c/Β8%C7oŊc4M,/tȻS,8F r>?or*aK;遂)J V#QeާSǿXbl+ƍo*vgd1ycd%@9!*1"!dDN2,0ZT_4TSd跤 Iv\F"(^8Ψƨ1۷ᣰ(}nʄɷ3D֮(nDjl15SlA1Qj"+Z>77tῳ7~;7||9*/]˷ū.!qDz.9蘏:Yn8ȋ~T]ڬG"["=7COT+y7@Ll5.[rGf7pf Qd}Ucw2p%M-nნtt-'QȓuĞ5 -dG#pduE'y-|>9"V҅0XL{h,C8B/\/-a@?xG΋i\q1!(3Y"l4r,6iF#yVQ+h X/,I WVV$E vJmEG³Xz5*-Sb|wƨw.D%KI 0<.>bT5G8nA+#[~Vr*_F'"@8"9G$\sjnXad s-P˅_BՂ\?#')jƍP"ف >y8I]V8+o9.ei/=4<+1kW~K#Q5Ղ3w | ܨ5z ש&megr,;6RǛha9)yfx(p·2&NTeG:Ԉ:)-crDÁZsQχ"#QF8+ֶdgW*ƘX!RC1|ULM#&ΉY -s&]镍V@/7$ k *+|y h!4(Tou{Ƅ("pxT -ƀ\3Gk͝Z3L>`:<'At"+3bL2y{^l-#V(\+QB1#R8R[KDcZ1/S6r؏cj#g.nmmp<o"\|^ I"xk؀I\FAUBV-#M%T44Ym(Q<4{piخlh!KGc[xvr -h"X )Q,^>h.dKyz$z$dU 9mHC1gy]66-sK" 9z-N8i6h= dwR*,z;繳"Nf3Clf -A(KFrHimѝGLf9< g+]+GxWZع1$r:j# M/+v@s\~X,wG y-^u}W6m0 R7HQ˩)^|"!c9O?Y}]"*7/]^\/[ "'/Za~}R1O<֋(ME35W1Q+; -ځ&7?ɏRu!dsk&ò@Eʿ9x4V_r:uS)jgu`ʡ#dX#6{T˧܉ ˊ%tWwv>q2I&MF-rB\UQyp˰1jQ7!nYV5 QlW<'L6@b*~T|4uo̐F+L|ς΁W 8]**)[LooF\C|0b&i%nIOweVp**qOeQ,R7#op鵹27be yI5-Wq`7)$F5im]5J"C$9e@ +^@VSKϑTÍ|9mL6)XvKGAX QQ*1*UC_%P5l^wbQs,̔tHFѪH4crY%h$;d-<-m;ɼk`9b˳*hQ"MfEDN;^C6e|za2BU㍲|e֮O64߯k[L2F2!̬,fQpLG H]r5У&PtO2IҠ9 5r x~("H2W^`\A9P{W35iނ:w:axX5 ؕ)v븸 -*/(PiXsc[¼OSg#<:?cQF0F120Zm$ l4],ƒb1bpXWk> -,A8hHMBGcmG9q# 7ۑE ۙk~uk0[D<Ƒb4LjܻZM=׫U^"l獯v΀W7b1g_qjŖ0aׁߎ9]FV0^>g5j0X½ІX Sh(6aeG6M@{lB7s3|LWɈ*9&5鈨:DrgU_cY!Z+rb6!9ȟz/_4^+[a4xXfS`8T1^*,#e)&C! d[e(lKo=! NK9fp%?} P{-)`ck9C@G(ʮ\eg$$Cl^q -BȰta׾H!DYL{{2C'D(FD;d\d܁HQ#W/m ShbcM=a{D_:Jk;0Icm9| N3af/uYˆ!$Y+a~ê-zuo.MAxRTH`a$zXl(f<-T\ʢ7ùH.AS-Iӳ\;Hِϲ*D2* zVɫ&\uK{ ZDUL+F+]bDF0GJd. 9v&I!Atcx8+D\r6,yr&_͑QR߳\r p)E)~2Y1]ӪG$/|"A?wP}Ɓ!Ezp7F7 "8Jv.Wj^q"FqBqUnboY;/5xFƱ#"keWBd砘JG=(Qڭvv(۴\c]adcZ߆K:N{\E91pg ŐU5ldTB5V@i$#Ш;#n0ϹY䶢U'-.[!G6![jr2=W5"cAܫ|%UmYS" TWM~4JD_o-_:DOC'"%>?5$S1;4%cc= "CU`*")ھD.$jA"YV(@ar+hnmx%$"LEGWrV0ђ$w -l,WJs"|7sg6sg6sg6sg6sg6CNi [qGk\x A Eӓ9y:b${cbZF)BVG.WօVIPbNzur-LniU6mМzxܳ%tэW %uÿKuJxVwˑ Z&Э%zæ@z-+~,OŬqvb6BNJr& 6HE[p'rO߬YQF-\]#~AXqPƪz_r]|J]F <-2UYO@=2*sBSA;r7re7Dr-HѓzK/<1" >{[qO ڙccNgs+5Cb0#bJoR(,˘<'rɯ2)S.Szԭc2b1@WEzLrp]aY,Z"aBܶ2ZJ4Dv\& FcΏFիF+ddZqdp"(IQ՝`\ZmtPhZM܉ K U>YiM =̄szDZݽ?rL'U#O9Pmt~)i1\V4F[ܲ]qWrʫZNG1LIĎxdMɅ!0)2 `Wp^8unK2;`=UFAapݢ;*>nDž:p#C=F[0LcU1# > ->fDscc X <܅J7 o#t@9ʪ5ˉ-~(LN?.zblQ0{bGaH%v!Vrcb5xa?/8@nX #cɍݦ ."VHE7v +sov2@ |xt,( QBY -$mqЈk $ϕ -$$I.X F b]䘋ݲC!'z%ez -9_edXk?\eUCll8 4'n."sK"F+ADQ6#㌎&Lck rj|=f͛obp7s&sb.owlE|q7~;o~_Eg8lU̎}v=C84ǧWrNkP24i])SBl ^Gya&(:;h.Z#Y gOBKd}Kė1+ݴ "?MĐV[5]Y2Z6l\=1x "=sK@>3W9Fd PSYhC9.{0RbSKhˑN9 l|4J\<<,ьJ8,-qZBtEs,Ow*̋,R7I=d16e| l0ՂcuOX`{;!0>Z#fz1F5P;1yLDvmc?m2qU*\ K||WXd@s=9gY+~,EpPS&i,+$ W2#% -fNӎEfX^gEf[7 RJv}o#3[rl[[5h2y@f'h~5 -{t5e2`,ȩܐ)~sL^Lt|X˨LQ z'.'x92m 9dY,35jփ -ະ]XJ+K=IfA+˱#Dl7MQ|q?+x^7s";3&f/G!՝x9r9™`FPQ@;.j9r&K'"'=zwT@_cm 39\%t!\XokH%X4{`4 - X؍VW lY ""AIs&BȔM& -<Мya6dp:ʯ'c%@Hɚ"aY2T -.︌CE2(ĥB/HR|QRolp&ǒlU_SOu$,\b{XfypTEo=s>&.ʘDe#[֪O&jb96VAs~.*5vƕNtELrfv"㈉kɈ4.!SHv53ls_lGoDo,G"lGqjcW~˜M7W&#v7v+^]LW7͛\&m|U8."{Vו&RTdpbl5{ _Ґx\9,<#8l;rIzOY4&,ME`{+k`dLq(zr*Q@6Bc!FhɓLBu`.!$ֶ$~8r)̑chFh[=-D`;ʲ la*oT4ZR(fkBmbe';5 yycr\XQ\ջ lg+Sۻew=*2${ rWXFz߂5rCr"@VȔN&O_ԅ29VQv{ n~SD2f hs!k1)* pxj"3''J:8Bj`"@(5}jxcڽ%uϜʴAͰf -KhPp/Jŋ_!p))<.n{[ -7w#mkS^a b52Sc;r@'rdG!%הDݫ-澖)B]|qc"Gj,PW|xFr;8rF -;6n.ev+XQ ?)D2`χfĿaǵj̈ M&3Wc`۳z,롰axj1/3qQY!9^&@kQ1Z-Hni )ypƭk7X - @4>UEv,5 wREb -/.j˅YMa(>h3Q x.FwQ_R$2 &cZtpTmjNZm/d7P˟szY/}0LSw62fIhԆ#w~Gk\׸LOwv"*@藍S1_ Ƞbm;DT,V|(mxf#Gz"quaLê^YEDngN3Vqs|#;+"p}.S 9|jsrGټf LmIi ?sRXΏJ\ʱ @@e&A:_Wcsk?q#+wFEtAKtqg5U+ݵ>rƍѫ -*T{H}i2$6:Лc8mt>Uf,FVHP P }~~ɉ5൶F 䬓co-C/ 1G`(L{8S ~o w%k J]Ov -b\H;eL'XNiijY -Dd&Eqd+l$5J8( -'>),iĤ+H1ƂgIaMj9auV1]C Uq0;+\%,S!BU/eNKkv^B2D`JGˆKؑ>/ Yc# :2V_- ,X -iN٬C$!`TZ}s5c$6YQEp;C˒4w>Cįc@T1k)8}7~߆~o|77^&yp'{){w{\ߊsȧ <4 V1gQ8Qb9kv)$3 -D]˶6XRj+eʨ!+UX g!Xv.^|R e mrnoz7DDVC}Fs+ƙcs'\ݹj.=.u}N]lO0oG1|VsljsD\kx*X -DU1L٫]2F fp%f#Q͏=&HxJke63"LC9E]+īXȀF>+Xy# ` c]P-CG2Zٖ5`$beL& 9&DgXBdxK87tXxE Åō\` - 'W)_[ |hZr qB11C - #D4Z.5 Ln$h/ )!_ -YSI(-ke6LI -Jqg|=08R1H$xdiCCgD*iʮNV;LZr,d9|iԷ01,S5+Tx7q\VYIs@Mjg2NEkGķ2]{BKP@'-R/JsJ+8ĀJ1tاƣ술_ kYYp@]]$u?*ӆ]gqndƁ򼑅rD[ u»zee.>'-sqmfmVCư,#[񡔌D#Fk~ivؙar2#O94.Md@,DQcI*[C˖3^t(d~J`+%|D_tIJۛh֯~Sw,w0cKӈv!KeDHaEkgdprr@VRA)S›r/@б5q&O +*2SY]3kj=yI-;kLBXf7?If7,vs+R9U%(}gƼ; ɐ\u7$BV,'o -bH`J;I@?-]ΡIoF+u\eB}Ln!G\6l T;^d8E UP0r:1JNAWA7AX|jE \K =1#tE徝Q2GsUn3;eHSȨ}֯5}XlĄ)QVdžTᏽ*K/~i? ''Vj 4;\/ȞQK{V͒JR-#Kb Ed~x'rvq:Bd"6Ҥej~|9l#؄j-vNh"7b~%gƜhVP7A+LI9YabN:"c!,vɋ0Oi%͎9\{QV F2VS,w dB -DWXGaYA=c,:=7M!,ǰ^l*øXjАaҋ\HN .HT$V+O1YZT "ʦpd=cGQ"Ϯ\mY&r;vͫ~7drCnXHȒ+Gx0M&l0S&W_b1P -C*ds”{HƐObKP6VĎ$8Rʼ!HuFCFN4u3$V1Wujfl F53Zֳ*j'G&˝6|qQg֯FwT1n5obqQq7M,A1k($sdۗLEc[c]j#Sd1qZ7(ڤkc|pr;*&lb16n.1ƣZj"tTUhؘ14|ԎĒgQsˌBm _a]6D(z0aB7#iὍF5Or33|G_<9os&#૜㝷ǨDvɈv#s397߂lLLW"b=vrb.oWlW|3̛.MWl|E͛;cWS|% __%&DAIc1V,f#$>)#6uiH<@ "K'HD&=vdd 93XC}q >orXŖb 3Ύy863IᴩyMJ dqT )0Q'D;} -FRI8Ma~[$E6Jz㲣lr?kzc߷Dze"1Vp$jN~D6x>딿7fFM~אr+Hib ;X.d]<{(r rzn9-ՐL5;Bjm.`v;{? ުRc!) QR"tf}䌾^\ȗho{…ػ]m:{aU2}UmNYlw*u+|vSՖdZʿP zPhe!rhW5%E^f/&WWeUܶmࣤG3f̐ŧ#Q g0DFUۑ5mc:lO#`&2ڳ[dEOD/0q\)R2[I֣[._|VjU;!\n+oԜqr/w G_DSu˖?R"_5S~id"EY BVǺrvZdC7`[jgc/ d3szrXXlN#$Xk?OVMY+$WJii )I(Fx1W6;J&/emxP鹰Bn20!BFҨBa1ى/Fa,4j(bF!leLV[;UQ)҂@f$H3IIr̬_=f")qi61D)!OS;G=%;[FI|͔T*0, e=XlL5*@҉lN]We #BQT{sbX%$iR'xY=fÈG[9Q 12%*ix&"$zR$+ӱ:GG䡠+#h>c?Jy^$!Áx_3]/Zݡ K$s:Pjf PCN`Xg}Qww=le_3V@;kAm|&i3OPs[Tvhzc1̎%)4!ݓh$}@~ jFpԦ!QnIXkHrФ2HPtg6b0-@/fKuN -W+U&t;ɔ]G!8 W(qŠRMmU+zOMfS($.WYɇ/9P -޹USS)Se#|-g3 F˯DZ˘bG\}GȨ)"qUHje(td8ɟ|RT/])T~ձ!:WIfl9mUO.$Tj~,AfO5¹p_HVU6286o/ $t2(eB.< ЖSFZ_K1M3e|d5Exa4  -NȿaWrcVm4dWȧ&?䑸H3cpƫU6Y?K28d z׌UPy:ӫZh#%(gnI%٧1!VVhҥerdwfV">ò>BO;h K# ʬVVr'`)1s -Oblzm7CGJj:۔GzKiT3^) -[UюԠ;]* Gd9)qݑjGqo#Ŭ l{IX#71ylKhFjtKe'/mu쇱6D[rµ!ݻ,$%"Sdd_9jX"uY@fb&9rUAUXs;O#Ƹivn["~?9pz>sy헍WVaxCڱGYʏz|DDpm_;[tp{2Cf` VR#Ͱ4v?9HyXs_Z7Pcic4fCȣs.R` ,{Qbjlʁ梷aF#9*GHq֒:hdȣVs+)& WV)!փxs؍F2[FYdxjpb'rc$Xi\#ulALHj 镣^HS/;mHNೕ'TocUHvHugCS8 ,g2bގ%}'4ȐJx+[A-`{ -C*&ȉ¾ ɘW';e$REL3 Y,O<Դ1*l&ɑ&wF@rC&cX5c\76|߆Qs|9o߂پn+7|3|7|3|77?dw0v4&^fjd _k+[)o6a'l&9㩱?S^SRHnr:D.NFl{lf,60ppV:ĶSI)6kE;ȶ@HE.:mzY,eMȩ[ -AT*B9Hd# =j =$%Z9y1'𻤋w`D[6lCD_,q۲,FxNXbZLVn{E-ƎX6BgOe~PzarDGt82uci1LUXcKuZz%dW5G59ٷKKK`P|CGfXOTv9G^XJ3Ⱥy>VG+ -HPiGpzeEY\r#O Eں1 NfGl}kӖ_>|18j|h,H{V*[V?-Ee)*^q2>94鲞91" -Jsa)r.Ubcôb(OQ)k@]QُfwK_\;BM;dZ.|#%Ab8NّH6ϷdEV~I5㏥\8YcʵHOe}j{iz˛o~;>^77Kk#` NuB(o3WrT.vO;p"WR>"]\ԻhNT=F&哜hYV?%$ eA3mNU(pB"lYS#)_ |7;՗䥎),KkU+XZ+L|.w5.V'eL\TJ2>̬ŋ˓Q1Ӆ1e&&O"]1G=*=09Cx"jF\ݸ6w3'.%&S]rl;b%]"dՍKJMMb˽0_\wmC˖/#gd.:>&.߮ 9i@/rۡ&&DOYt#ƫq$OSi5in{}BqlƗsQ5<1됼DDSmA -!>PWd?T͉jG&k~Yyj(cifea9˓hr*_7Foyu)'l&Ս4@T2+BVXL1b1$mi+ ^Ai碸ھ`ЫcVhVLUdW.MjOfTV,*ǮE/叔C:r}FT'3XyUTAnU4 -lr8&#ql]Mk+1סb ҽ3Qјr\zVjof\'&Bk-=>^T*-@p;])8&Wι,i_'z:2#ժ> 9dS8cW -2*[pIE!x@?#9xƽz75"|ymj⫲oע3t΢o#ڹM{☟]DYk -ﴁGK3d]ˀ':,c.O qy0z8h&HڸwPt%a:3܄C@R5x\MFϻi -ĕí޳ZU"prvrՈ#1rj9fCkȭhI6EV\ɔ ,^mMuk#yh -}6_뙑jFIj -l/GdIl͘x9_iOS^a&qY(O+d^Cߧo(L G1%ZV]vm rGcqr黤<3zIfWv\ӛ'2%)c[;#^<_7C)Xu(\qՄy"UUxI]]7+a"O?xe1˴b5Ǘ&jC)1Z9\^cIݗV3 30_MQ`˥,ȿ1C ʏ^c"A!U4QH2_j+JKѶYz%t:#5ʏ[ܽ+qbh:Ź\W"V*rxh57`u":XG5*#%'#3DqjS=Frpd-sdvU2_(J||@tٍ1cXܐԺÐ{y=?8G*UeL$hrDGBI2%qݩv#m="NBjuJbG㴈'E(Ef[ŀF6t9b,) $˚p W/B/-JⵯR±ţ5+7 q!/[6m"b2ututJnG%@+iL}ZX Pu'`{>F^C@MX1ꐭ뺂Bn;RAXgb9<*"Wᜍ]ֵƻ֣ZFM_. -֯>1p[ib>K:gtBU_uD̟2yb#HkdX@2%w -[@{IhB;ؙ'$9ɈNg^5M;U-^db.T@1u -3*Fk} b~,6fW/q*"B]͎k4z߲݃!zdz,2fUō[$i7s9FR"jodpg-r߰u2N1T}E2MkBډS#)zؼ/ 4> -;@Z#"B_JfZDt8yc%ˇ1);j++MDSli >Lop5ˇ/=(6~ HmKiQJYR0 f^]G% 0.:iwOvLW"4ccV%u,ƀTG)bka(Q,H $pQ"^lLda汰 A!>@Zծ&5$F"%SŅͬ`W*(+tJm&H$3Kzg _L_a"xil&ucn6|ɚvK0,ZtҶ_>;'ϯįj\ӏWV|7 -S-R匇GΐA0}T׬j4\A`sm= RWFN|l%"4jp J}9EL7ܶ2Hb#livQ&:c.v!d\0s(3=Bk$#@Qj"90-%2L8#ڎoY3EH-GȵȾE3L=H[nj7htƙ(6GwZ9Xz"b1z8i!y-{dS9`dP)M"[,=donhRGa ֮6ڦBeZ*W/*^Z?:DkU6^1ZMƯ#ymyZ{ТSL"6(ODF"#.n$8;|H!($ruR Dr98,rXֱ{Z-|C4m#+!1{M1܎ @ (֪ -_% dQ.IR7QGSaŦB@UCB|Wy\-tbDX6ߩ{{2\61{yw?R+"RLj=0\#d_(zFOe=mPyEÂ8:U%n]*zt<$̵.ObX$- Qeݘu >XGNPBKaKsQQ\pc4`&ei+W4w n)ı-\i'mєTN7<1@2Om~V=l&0WbŜ2ː)0nֱ݃9#3s C u$F$-\(bEuΣerO؄!=֬O"VvmzkNIWə`Sq+·YKg4ZN6] yhkB#ΤTd5K`X -JȆ,QHA &lx+b\HlG m;d<_I湨dOY2Ðm&s^El>{%5Mz4ѲUC+8S0*F%E!wĽaNF7s^|VͶ+1ˊdU{k"%[maLUR$߈ƚlcj%ꍲ!EB|v_~{ j)1Z73n_n0 ܷ Õ L]yG]>rW5q+E e RE$PDFo4QMTtGKyWr;osH<[W=cIg5!y2#]W5Ohխe!~k_ C,!?,&X|_Ó\Rhܠ-Z7E~UUrҋRmtF߹rҍ-孋_3YV2K:+Llܸ5#M<2lTS9k EeQҠ[qlԩL$OX7P au`bb 3adP浞?ѳS1I*m H5okY{ZĿO"dx/3w׹b#8jWjr_eCay٧=(9(b]^U0?^ysPz< {ӊJWd +)UΊM긁R$J@'ɔU}s{YU cO\T6rS*&jLNA`4F|-]ZC\ƎC1 32dC -3Pdf.27pQFxqN?jMmw*9\f4}\mQzBd:PY qݒ(Tkk3|5x'Ѣ -aѤ<1 ]w<:+.dz"ܢ] 'o%MK]QIEWK8ɫQU麑KgPZ#>R/AXޗ;\Hj&2iN 'r3h8y޹eTi' QvJi* p.UӖRŚzDK.ebƯ-e9"ʖU}T[*"&}23jUӣi 䌰_JSvD8'U+P;h] ļ( %P<J)DmcB|JLwnY^Ե5/ |u mgV\ȃ:y_S8'ۡl9礑WV6*9W'6T( -=$Mp -+bGh'}J-J0mi*WY  <\&Y%%ĄTzw0)x% -]CC/ pEy8x$eeQcUurәk! ^+\ȠcEyn>| @bh!iKX3mG\ŊHs0g,y]*Z=;5ZyMlK{ERF >TAOKQ5նnP|1S#5#F|b埝l̍Ӄ%X5/5.Ǘ.'$6MD_ilXبG"#Q֣Z7[2u[qEɓ C-yG6־,KT_0eXD ̂Bcd ̕81Z#d<~ˆ0JФ\m!ZHL$(濫$[rZ)SEۭP$%tȏbR"tXްgD?oDs;yEmr6+# -{aHkюL_s^{)o5\E (2'2u!ʎWVj6/% ,#q $Mya gY`juK†tq#(*>['V yG-:bdV0pA y<Hpsąn,mDy5!ά{X@HcLx[pH:aͪ7$Ru@$9V֝fF(th^HpeNP$Em`Ӟ6O9֜_yQ Ic`VR"> [>A 1,|W>I:hGa"<&JdH;قl8fO(V%,WX$) FoaHifA0va;_ дIoe) Pu51H k'gTp^?|;j۲7N{sw.Z:, ̅>tsƐNyjʭkPЏ:äeGKJ:|E5yx$C `1 !ʟهR -=|9BrI-c&\QC-?W|nH pX9qnX - 3۔|8CzOp`nK4$10kjӾ, ob7duXSj:F`䷅;Je|i | gd٧XSA|(/srٓjOH6KNe#¶f؊@ƻtf"@)&Xztg3m4g'ccn1dF˴sU;P@$YRx\l?ዋ*QGE_V` ֲ,q…[X-~Hw=Cݔ>5/ʃ/}$Ĭ$T7UbBc\\LcU:,yxFT|t~8r7/HIX\,mҬH9l+a[嚞+IIJ];bQR(餿 UFFՊ\5tzվX~*2I᜜.]i9JbSXv3yUD ;H3_adymvǵ账Nh2=8Ķ3yvoȟՉ&Z [uiU d _3D;vRƏb-̱Ft-_ `B٨߇L{XưmF_(D5ʽ lͩ8l}Ыi]68QY(-|W)-bnI$#t9gTj!U )FqV,AtkW|qutH%$H!@A'cƣYkV^ϟ5o 𳢅ܥFV#[8a/HChc!DQ&P|:+4G qfiQIqGbzEZ;j/<~yoopưEYMdq~:0]dkO#Η`$ѥ맦Dmk51)KuS(U"eo[5?Izi7-{o}./D_bl Z]fH\F70aQ:cu1QFW$8PngeuU&F AD3 x1iaH9:P(0Q׃g*E+H  E :0BL1!"x|ǫ@Gl|PcG&Xj)$]ň3 U3^:h*zsGD/OxKY\#\樨vtvs?/|7N; , ?pk^y_JpU~ɗ.)Fw#y:]CɌ$ĵZsP|3^YB(ΝW8@-+'7F͈;cLa\l Uf3RQjKM QZm0^{Z49r@ƇW2XȌx0qye;Y^ 'YJtԇ%AqJI\l[ }&Ck$ZLl -:7mOIA^da]o/}IK+#B'8;cH!E#7+ 1mE/H{ֹac毵?2ضetnڌqu*Ћ r@-niYtC[>,_JHTD)n#D[°#7&+^cezܬ2X_ E #m$-i&.m4^үsSO ï(u((YdБk6erymyJlVVoyVߎ3yc`"WϞlzFzej0`+s7#R] +bī3$Z5"#NW5-<ŌzVUIouL Y0Nǩv>LcpPD[x]1W(5/K69* sUMS0cӴЎ% s5+FTTku3!&!q'=ƒw %@Qx1k+^7wsW??|XԼk`Μ `Ioo JsU35+Z)}ֱ_(G}p5Fgn\VŝZrkHJ5sܮSr34IL!.LkgW=5`U;pnkIkZƣ[_-6K'D*ޥ|6X+!b6u'M-2HXb]V.C(~Hl9wNQʒcUu,^ȭz*zDSSdz -@(.bS2j1\\\Zgee"T\/<&b?PSji61?g%|P6(_Yx(^R*rP -40-6椆YP?HV1f!6 'T\oo VU HҤWx_'N:盔 -ռೞKɯd<"A,k L`넷.9wi1ȳ&PfʳZ'91æ^]lvG"'_R2ծӇ۰>u%>\zg,g> 9*cŠsDXv" yFz'"cXc[,pC,eRcH^"tG@`kXLI C4Jؑrޏ,hA`+")c`湳 Eư*@s22b{{:]>&*Mӱ&KtâV&r*x Y/ dӣ NÈf,#XeuuP+?*H _AaD1σVƢKCZmcg2oSӯVvӨf f<ڡF5j4X`МCl׍%7Oy\/ t&*MN> u5t%1eʸI H}w"2E@ccXT 9y}/O哂{T?u&pCZ;Di7O_tl%UpXjͺ< S,7V!Dre,c _ԟi5&v}8ŏ`a59eḏc]?*ܗ1Raы5Ȱe*WFl/,%kG})-UeWO:kiSL|Gرsklc#b -5զ %M\肒ӣh hkJQc+W#d:ioIL3qOy|#XOezWIZ ,^eb\y6oH֑-]ӵⶶ,WGԲ@=MTiTN!]oO_u\>-q\:i+:Z%h0s#.Yz~.2'\& -9Ac?{^˨b4ňt*zX/Ii̦A˜IvpJŋ&{dyZ;*QҫZԅÝS|x}iС8XaDJi$J殞T4[ǹDR2JiOM~iߟH1aJBLnV桕ZU"6"d˛>$M5EiG_&'_ymqRֿ uO}X@}!qTn$:Iv/Eb6u'TK_jX@W=7-U=nUnVA !+j5o)xHK/m[ǭ.lwֽ:iJF.iv++|ʏ©;eWd)6rԄs,&vl%6WVSRQ?|N)W:h٤}-C7x=U10qR.1/w.cG:V]ӷ+i[ou~;4 *w3n}wolb񱫏`ѡbĊaʠ*S:-4hiZzFHaQe@,T -Fir.IӱIS:PE"@USmlec*N3L̸0y\0 -;B-oRr}wxX / e8uWK/J$fŌ 3,ieɲI@U<Gh, t$z?-)ijT3ʈadKK1,Z`M? -DD`F<CudP<(I:Ԥ8 kRa1dɎQmf$O:s - 5NpN)W|p4' kS%TY[Ȑ0b4#2k4+fBٹJ4׊CBvQi4lHD-c'#G;ȳ*21kV#Ҿs' lكV 2|gZs\,QH(2SUi4Y8R$wm"')PY$Lg<T\A6haYQa,+0/y!%!^Q*eMkdztO/߂{ۊXyefEj~(RcܣƘo#7VJG{Lmȕi;4ޘ *LNm6% įc-l~1]Th툔OKWEc_<]a.'8svүa.Bq h#$Ɗt 0e0IH$wG40hc -0ioUuT]go!c>ŤoKۚw:#:--X_dA0j ,vMCWXdDkQQ'> *'nMD3?H9 ek*Tfov1ah08]n+QwE}uCmAj? L\MJLfWf})7HyӫS4+Mbܹnrή>ier{sNY.ً's1$P#eDH -LATZvQE \*N9-L춘V5.e 5:o- 4"+Mt"+RQVjG65-;&W2*^?2Ы~Y%VI'^B=2 ܅4e84Q7*BQLԽ@@i_c+gw^H~L i&y}'xbڸ -nVJvr[BUBSN|HWJdw6铍MԾ#fFtlr6z)MUnXqo+=9wY1u ڈoXr.;N$BL$:%{tWc#qvwԆp9fY֎4pjvEcHxV7xOWh`=he2UY(yB]CS46)ܥp_*,Ĩs6~ЏBfYymR;52%$%aBCLVԤE{޺z`~dH rꄃxDK -9/Pe6 -a~ pe8.<3,z)lE.A¨ڼx-ı -2E &YḰYU/4ud*J†-u[$LO0k -B:1'Mk̲%(Qcꠤ(L=YZ+XV,>|o2rcȥ&`8NcjG_ਊ+"@c'lQpƵkX^er#ڭsQDkU~(O5G9ɊW5UȊ.o.I3d -m#o7I|^;>Xa8e7,]w"Kl:U X{aHްhm -X cI(S.ٖ` 0(Iָ#J&)N! J."rL X 1|iq>VHĦ`2+xisTywt#nXAس"ȍTsQ|]SMGQbGu̩ì.~ON)mvtatꝕO*-ZJR^ <9eVTzHsNGHg Xi%OSÅޫwt9 -S~jQKȔS#rS[Ccj6./+jȫBK#ɥw|ꆲ4mhM(l`aNσc6@i4g92G+*"rwǬVxJmP]TEt7WKB`l.ZREt4)MJY$S]њwrjtJ); Cg׈(j9+w udIqp^)"k,у^(1{HSYZ&X|T}a:j.Py:y_OLkALOԻ5W&E?u>[P#kT|O`[wg\&C8kS6\y:i[u7k)r2mpjq!H)7R9LxMf/b0zU6124FiafXf( i]S7j6oqʻ8U ԧ,/EN 1=<3Pi$\Ud'hڶV8@W9C|<ÔqV.6 I9@ZƦi٧?L[qQGnjVV_X&[Xv'a|rȵ\5_ySpzタqiIHc;nr9_CV^dK,"aGAuPynC'"FZGOs%q=YE{&\FFrU٥-kvVoqix[] ra'}V_LLo^$H/ß$ȤBZ% yR2X@*$r Ops5PƝ(iCU -\Ca+qҪ:BcDIVWD(j 5#-EzcGtbؑ/#X> lK):]u}/Da !/"iB;;K H:7w@1$^eDWC]7 _@ť!ƽ m/*,` Gzie= -><8XbX~lۇ l6ͽZ9,ˎɾ&<7Wg6D5bs&?|a$$鬆ƽ`<*QtmCA{O0$D -!M'M5Xrta`G/I͒_V$s»4!ucVsd Q &thi tIlW5 N@d`& y d*]o\¸NؒW`|19o:lI cUjieKnsXs";9{xoJ><K -e$]EmT6Vr32EUl"Ķu RCUD$AIV;oxyI0",PE> IhOq]*䪪&JxbDPUN(6[y#îty}ůN5QJA>$H&A^RWqtXOtȡV}`#TmEdV`YCQ++EldJ%2wt T:`2odBryg$ד LvHn,^ʐɏq dr%vŝexbO\|[;{̪S>j tA$H=J\R \p.!E ^~h纂P[,udW%53L:tHky])\rXt;/ X*ss2޷xï=CݕOk*i[&KϬ׈Αy5V}HSa/s™0dY*'|-ʙ'l -zKdp;66VwMHXRA+Z >sǥnFdWo+HGM~@xj͒9{' <x:Dh-RIlk,>g-iWxsiGH8&|#GVQ=t:Y/BCMڵP$y Q['(U=#î/ʅ32Ż@AҲz6eqHG®( w#$1#P`GDtYHʩQh1i\+aJLH; -oO\C=]s`h %bUpKup>'h%$j6x́e,%H-"ǵs j -4_zѸ8E4 8Ap -$-2O0o3^0:8Dɜf!eCR)AGH[] 1*M{O_Y^&uD2!N;Kkh/{¶TƑǬ|4‘ i?oms[jT|ǰ`'pRE\]LsKs 0ZN+Xd];SG90ƪUJVYd\t+X rv&łSB5a5\Z'.M"3_CD{04 wZ(yc^vˎ;|q n֕FTsQS$_+Ncu-d zw1\3-m̃=0QԱ[wbLu)Ӫ9Т(6x;(K㫀7-ӚƩ^4Q7 ۚAkrf]ܱU20tC+?jSa5˕pHc.FexcVett..T1%U!l'rXQcW( 0Ց9o6j4I+B8P,~%j*ݹ,fGͦӞQ;FZzVP&= *VҶ(dJY0ƿWW8$vVX>3%sNoڙ{j:\h yG,s=tULvR#Jy6&4kP@jF!R0vHa+COڍ99}O'!'$[!ee'JTc9`U;J4=tH-#Od94Zڠ"lz6vibF^b9jG%}̈r+]&,9Wn4񱲦5hE1̋>x)^U#>ߵ\?ul2 `[-_D|ƕ:O)%43X[FVs`-V]Jg6(dpI ax[P+mITQiטǛ%t~F&VF3 yYvׇjXU 5 Ϩ@z@coK0\/-\!:,Z -DKZH$j[`@I)xS]>YX+2\0n-ŵ]ifjb6q@lxbu[=6[EwѢ0(z{&Q] &jfd&;*\/w!DDMnN.ck(ؿDOHH8 -Rtr| Ǝ,QP JWoV+a<5Aʢ4p VrF 113AWsѣ~ƵF$FeoT [,TEMa {9cDTgحkQFyR!;(AVP0u؞'`2hUM06CC 6"P8$x Ltq⋪`V yQ#L pȘ#)9t4s:<,)QnAdo0E^ ` nFj+x#xo./7.1wCXUo%X2(M[PF4!$"L(W5:Lr ťJ޹^E{M-# dŸ KDt#cڈDL|qXj c -൰l&Tw/hV!%"WӊW8,muWL6>Tuy"XWň <56z ˋz~xR,b$ ^uU ʊ}U NԀrNU;y; +@Qz\pSd9%c$W(=ǥtHc]g,F鏮tB 1D(%q+ʺH =lPd$KlA1JWT  Ceya-nk6([ٱ7%dEZk:l68VX4 XosZ;jsU孋$II- TKa 2s :H7e}=GqH]C`$=]8A&\gڲMHj81Y_ܸZG2E E,k dcVS*lI:7]o25}&{ȯxK0$aڊx{Hf90]o!#j~rcԴ<fLsq T-$aF3,.AV\z=mTѽ4@!DNhB( !2SH-bC_#7ȗO#k'|d8u7/ގ=[%h-W!+hh䀻r5zq$.iDױK R: jeASާ6o,${)sOTG2֨e|\L)@wA&7M-Iaɲ;TeZ[0XH {CNcٛ- D^:u"9qr)Sa,IL+Z75 xϜ"uxƲ}K٩|FPj.gVFE~jTޞNb"-]9S.Lh -HfTY_]-rӇ*)" 4-7=R57$Ծ|z^O&I&mזV@3K{5̺KwNZ<86ͥIUdW &00 Qͪeeo+n_N{WWSYHQL<&\nʆ&O@4bZo:l[TF5.LDeo*HѽirDIٓjkkѢ\fX<| ]:߸#0VߚR7Ji^Eo0FʺaX"Ok8 -f |,vf"2c\!/*yuv6P%I'H^y=\ǺPTr"o,bƷqtδȐ{1QMQĵ + -Њl˶SS֛.]Y2jš#fVr5 -y%Zfz~̸j\zYˏF.p,=,U-sM4_+dڲv),È8`hF1bȌ_B :" Z# -EA:&A"$#׍ X4*h R3ʸ1fk|Ҷ+M4ű`6,Kje&b2.0x0զS2Qd71*EyL]"QC*Q+^7/x -Xg| -I:utix,c,s2,$IK+`ֹJTyUTy>gT!Ɇ]#!dq7z-Đl5k G*V=݌b'[IFUe (%L$2N3HhK ֯koP{[Lp%,Ę)Ydv;Ċԗ6,eݴ,?l-tkkY҈:-<`1V([B4egi-$k/Fj19ie+'sz>ߣZ)cqLtsb0䭐S)Vi$-ΖqHwV*"]G  ]?T -gT|,ݼc}`tFs-e y6mc/%uM5=+ŧlYZ~2$Rr6d:U[1aZ2du`h ;#>Jٲq捖A+s2YlO}SwnsSj+dOM9V[8pLY뉯qd^{Ys[jD NHpH; ]1ۉe e&_!ꭍeC5ʸf t<!V2mĶPNs$[3cH[!C[i! $3\NGESMڨۚN g&W@\G47%9la9jcdIQaeX~z>NrUNYE-YХ5o#ղT2||j(e_z%*O Āgm!{3GRThD_8B I L)kc, ĥ2/Dzh::)'2cdPMfeeh#8 9&)~?jgr>nHSd>O(%&H$D+vɁ ]gf~TA2>L9*>e~ aDA9aȯt -@Ts'e}Go1ʭ39:DFRdbKj" YM>cֹba. ȌxpXԄmBv+>jvsx`Q-4 QgT8ڑLOnTTEL2Lz4|r@P?L1fW-d 8)* .s9#TLxxUmEpw$}hWT$|>qz |~ %ȉybByou7űl"y F\H,emգЪ@g[E\ -X6Xm20:\ycSm(v.ci%uStYY:hY,4QVHR#_LY3ce^ճ2k$6mBݬw4>ހ%*ʴqR*WO{ttxqFyV=r'E#lɪb{gL(X6U0m,xPW3hM:8zC)0У2tlb!:5Y 4XQ5ӕyFu坈'Ǎ R5*H'G0H0wxђLw:ӳeK&UοsLYylZP˞E˻g` YCm:c!@]~^J4J"IgOH -$ a -)qk,urޞE<Ԉ0:ZmHvGrUL}F' KŔç"fOҦj Z*T|+䬸B>io}푣ҴnztM+ToѦjjd$\;c|) O:}%r$LRꦵvg^Io] /勱-K5H)qJk8Hs"wL}WA4wrlQ2ZX W74ru)L"vc_6gdW'T.;`tzލ"+7% Pzz*y8 밺4x%46Ӣˏ$SCJ %ReR/-+:"&;+_-+H,,+]|)i~#vL^]<3H]E=2{&bq+lY.d)WIOFVږvA=SN.y`Y9_A d&-}U+tVf@l++ Fc! -1G+UpEYF*3l"0hj(pd*|ug&ZՆ `ajAXd̑ ﶪvҵ9 ) "a"BHHaG_`歪Z`0c=Ni3dlx "SI]RK  C!I,9&22(k! 3kFtLxv*'FvMI(R+o$iWU9qh݂ m[\1ޖIIlD|F)%T"zj+յ4SFj;cr5TQLdVN8QrH@WFCԒ{d4,Hsl̦两``CR+{ʳH \KGD^qi9#ʗycޘ){5Сuǣ׶}C)ea.I#IxEyK(c6Gmbʴ|>Gg-РKl{qE@@ߤ)w#_dkS&ȝ.I(!Id(jgO{&(Uv$ċ'-Hd{5sWvVãj_c LPj9:R./]l#Ϋ*]lg,l\䉨S2=Ձ)NQ>a"PtRS u ㊳Ln`m:MVDT͋i =SJUofM8v}X45官즲X$%L8BFrM;Մ -fkY>Ч9氍4dCeOƆQE(+6ԲeԱњu=QM \@C[dJf) XP -Y.`KR4Cy>lQ0Mz,NU3UsQ+tb 5KɽN5]ITV}j@Bx]>Ǘ4oYYL}|5A *IN=r) -kiQ$ٗM'6Kda;[4`s'$ -tM~0{nEFَ35xZy˔ )ҍDsHD65ql,Y'#($W4uD-!v)M*,WGfVaædmskH;D)r‚& pҢv-ԐY8Q;_*g!.姚:GѩME .f PWTFַy!47Gf  T~Qe -]J$J'=g2ٔ6ccF0Y~ӅL)u78OH5ȎH6F%3Hz.b25B҆!e[٩eJ.~#A~&r>ťWgh%S :La) -siiw8$|nV,8͇ -9C@hCm ;''|UM7"<lts/WH18~بQմIsB+'`ߒ (e|@ H;re9%\I[ş )Zm Q[Trf@62,],+:qXH$ M[kFv&*oUZ ~-l {Ur{,(Fa<0r=x](Z7H-]=?Ѯ~ -|rE[b6R@X}h92"M&;2,JOh(?荫vr#}{`2%1 .j})TڒGR" 9E,r#d]Y`&"7LuYEH[CJKO>S72fRvǃM=ʺa]U+Y<4i:-f}Q[>sTFk^;ʶ)N*ᘤ FT⭯;$)xpꡦuĐ(<VLk)azpc3R:e׭Ҧi¶BP5#Zd)8IiJTe\51S.^;QD,a)r&fo-ReZ+Üw -qPդs+jW 6`|*% .vԦȮ1=-٩M!s))8XE/RLz#ǽ<+dH$X"+C;Nԫɀ\jMװj/I>V&S/4G4؛Au9jfMEy1>֥i͌(3M"[j'o{p5!5 uXI*̧`'\w ZAjf|<b RiIȒ_(H"0ɖ@eCݩyDnx[`rI["I$<K@Զ3'4c0(:vIW'oݤq=Fx]QF%dX;ǵ͡ -IsJ Noe8oZSzAEAE˥ڦr!)»ϟ9c@aGy%~YeV xG}u X:rQUk;SΙq,vxW-RK,3VP#N]ױEkR~4|:z4LQ)Il\;`2<X6>QmoF7mJy%-L{YUxtJF5 $gj+xD/nBpēaW -X-Hho#bg$TALx HIKsoDTdɲc7!%#PGy,M{.(#NI?\8Z@8A2=xJdHT:hɖƹ"窲/,7ޜ֧V`{EYv s.` 95qזO}mz~|P[](Jq?b4M?SEB-,P\,z4Iqϵ( 2Mdmar(b&BsGLL+$X9R//!tvjY0eE JÛqkW!ӫ,-b>x!,Y -z=ߨxl.Ʀׂ,3 -T{`1fOeeSfw@G>QF[] R7W6=@;eR -0H]kVXr=1׆$`\QF"MDw!܊ֿ1$*D\ƱX1MD*v#XVcyYw߹QQZj#[TcwL8~cV`rvTDj/JS:bUqk8c`ѳE"{B aËUC '&+/oOxp߆Um8Wr,.dMЦuk2C2UmiK3L$YʋE}1n;I`!9o2Q3wqpNHr& P6vFlv}mk 4koId2r@$$ SH'3X1W5y$ .djeOZ'Mu2?m>]l8ɉh:U?ߊ{{6a#d L^5_8dU9o8qgT%ɗѡ@hFFIwq&j큽XO0}I ,P<NraM#/Jr%k[}l͛k[/+3f쉜0nvǎ"ws3:AΐrbcZ ,8TR6״ B -@9^/ 7}^<|{Lާs7Q~{-s\UP_9JTM}^p_xXT3 ].;3Jjک'|l̖Vpr8to|EDF߶b7Oش D_y{K7oi}ƥX݃F\$sK6C$y/e -WE;-5Xaxo &ɵJ,` -Ď@/vi6_2S*ډ["~+my_L^ /LVw.`f$z殞oIv+e:qͦm!ۍV[/mOBTVG?#M|r '[⹿%*V~r]jlC<>16L2^K)󨅚]d9j9f?G/-cR%dN}=٦~H}R! "*Rz}b >W|,bmW,MFl&l#2Srʢ&0VN)={ߩ%e-ZAvq>8J +LsQzmF&z'/EY=> &8 LeNArC h/5D7(٥=Lls$O+5jsW2]DHԲ9#~z*#eHʯM“ԭ_}o'j;4ͨţUʾe?иZzdܡ򦋚_2{uoSMCOFGN“ԭWwo}"po2Ѣc{pɹ@E3)Lgˎ4K.tKmuy~HygrFoSb1z,;9:Dئy]Ma‰vv,)V(b %),R-1ө:sSIO"tVF- kHbȐ*Cֶ'jʀ2;H|4PoeUY3v2HxFp^P ձjڧ*Ӥ嬭[gzO_t4ܵjo]74ʐ0O:+0X5:vfis$ٗ+h+({=< ӬctrB՗%[;h7]0Fƭ9K@$ڶrLfP6J66sDy;w stec-6)O8^&T\%DR@d,epM8 -TV$OЦmHq|lz{g M0at PC{={7Ìn2*96BQ+-4]v=-nZN@B>x?ʕm1Q]SWMM%5y5$mQβ*rPٍŒT9ܶ+O {Ȟp /_,PzDLO ]A[ODj[?t2²d'6$xiq|: -MdiNDs#Sr5͎=Q3{:#ܿ+}BʢkQF䀁 ƒƽV~A-𑵵i+%,<m\DQBpz&,ud39/)mH<=8wE(!!k#I;O{F=-hA%prehn -mQP3`%Cɖta Zh*.9A%1uL- -{q!$HRsb -v#ca a -1 $Y%7p(MESqTDW,i7p'?O.4nD367xtC"f@cg-YQQQ1$Q3y8G{y#LSUV\&G57neDZܛb^?RS9 -zDkƌllB"1 <!*`0L\tz`ӉybH%q@3U)[D SPY !|8ÿ:Pp#s*a6?E  t IRJ_Mcs2P^L4XrV1cL&*c!<SXUC!lS1!SE%2Tw壂#[;"YdPSStÏ GC5xM4RH8_ق1"%es`0}p*M+J ֵ裍 [\X9Kȣ9.Yԭ>tAV_>X -W֗j筍^u{#.c.Rp^ab$ Q -pض3/.XVǰ YRXI(r;+dY%N5"+KdŊe}Ąu9d(Vz_f<mi86Rn[͆9nPU(Zg`HavjFԎ{b ٶtGm͍̑j7ወ֢6F54lGs9,7FrEkڭp K-qQ.k&2$CОb#qэ!I)=rlA{s8TxcJ#ɸ*0Wb4pԍm&0G3eF H҉hC+XR)GYjퟲ/܃ǔcsbtD]m&Fv8o/11^/wt]4KNٜlZGKFGpMH E -kD!\s!$TT^Ʃn#\1=Kث;AE׭!2 :*&uP{O,q!@3WIKyOEȶ#sB{iK$VtW%04\'nHrJBoNFIEm'!f"'Co8h21L02,A~fy,kc!ІnkG6} -Ǽp֒΢.v)H5}` mQׯ ?݌dY w2XfȚ ,v.js&܍Ɋ)8YN 9P@f.|5os*ڸ8,Ñ9۲*Ny]C$g ׵|Jm67}P -X))<ծ(4J[-n#ͧ]/D&N!LdT#"rc37wM^([vR+1c\菨9Sn""y {eX1pFjG&˷֣n(Znɲ8,z2o"ʭkZkS%цRF#j5?|s[~<ߗ<ۃ#yH7y4DUFjzTDUQ%M5ɺc&"8*"znֽo3q H^fs#xs\j9b9A&9QQ1&ERX V7$ڊ^2D160#a25KGq.H;w~Tj*|F3%Olb x(3{69e'$ -C9dž%Adl#Q\ʎt~\*0zNssAN -Q#tn -QTO ۾]7TT|ݦ$tXF2pHHJ繭`ΐ! B') Gd]QW%l\ꖼ6,́"YLɒґC ΨH<C\vM*6@3ȰDtk_"9Ƣ5ą+䘂81C8y" dr -{;ǻ᝜~K#qѳuW'&L j*&s#9$8g+&h1y(~pi^\ck ) >=p@~rHXp!4mWG!Wǂdd>Ah!0i B,'CXDo(@ΘXvn;q6๷n;gÎGQ_wXDH-6+lNC+ƞ<vͳl6l6 mfٶmfٶmfٶmfٷ l6ͳl6ͳl6\ f+3otmW?V4!QUBVM#a0RgI$kU;,y"$ Ey\F $N -Ѽ|f*` q1?Y UGNq#XA6y!l*Sc+Fkam[Bve!taqAFR0q!d#V!OdƯ) k -~%)$`D3'=~㕟)͋a"jYp,l{.Lcٶmf6˄pIUJHܯpJ)]rmA4I)k7I()4Ϧ1sQ{Z.s&ԐV¯\{ӈܻ] 5g燔>5O WNVβ>5OɃ+,ӌV׵3Sz .[rm7ƭ1߾ cWS||j6ZM)N63ײj"WE1˿T4˯pC3 5_i?>\R"9ګBF -$_8; ÚGҲd4eeg/4niߕDۺiKnjW"ڽ?ׄ:O OM~|t LWQAӆMw9?"yI3QzˏPx_7kY8 vq>}ͳl6mRzQrp>ܢeʤO LȼW(eڧ4Q=nȶLe&\\ꕘ#|sSPLhLQ_%'*V6c6\.r/ɏ4˯Wb_ '>j4C;mUAmPw/=, ? iJ$=4畬ի_)U13Pļv~.g$bZ5r~yjߒjό,HS+?O+}66½@Spצ'cNpixU7]ޟnWNQ=oclTKFLVљ^<)9TJȻ |2f2'eToߏ(>M}bV iǮiP˯\}R _j.%{NjT>"Xg2rc忩ȟ$ӟ)#/_S4\ҊՄM5WGQO-ToT|qHVY;4ߪJ'fo,yL~Wx٤HݭxJ8 +h}&6d__'?U#o9WWB=>>Td<=Kl8CTC/Z^HӱU|l\S8'6RZLf͢.љ^]q!U"t ~;/隝߱]Z]CvM2w2G> -tMi/!|3MQbw)7(3U|lLTeK٪27$O ~.\&E4I?O?ÚWdeϩ'IyAgy?46zEi/ ?dJpef?U#JJ_JJOpMC5٩=IqߦER>^'1?lyy#sTl^o{bh'L_z@]Lsrv٥|w5KWf&y-l;9jK諒}^ _n6jO#`M4-=>^TzTl_5+.}R^A6Y[".;+?P#<\ҋEK JM.=t9meMC$埧ߦW揗~/4eevHZ?<MGi5pElpɐJ6^.jOTrЧ'%|Ԍޝ)}.&TzԾ,̅asQ7kSH4,?%*6'BFL"'E˟MksK٦Z >n3T2"4嘆-?yn_DYT|\n\oe -ć< 2?3r%niϖ~Vo)a.j!I WkR0u~[zIӣf9e2rGY~+ref,M5o燚CfL6,#+SjzNB(|vjD_T)}~QH2gIKQjmQ3R2AwU?lHm#s~j^ f~R.?+rңeצkW4?4.^|VjQQ/4>jXf{WNe<7Wjt\LofW}@ yOS4deߪJniϖS8V?f$<-#5j] -B8kk%MC$eKߦ__+4ev%5g燚C67/~jzf@Dy~Z&Sz\Սp)= -((7%fe'Dʯ2Rr\5/ lY=:6UzdRq}XOӹ3 /=6FA4Q;-6ni\8yY}IWxY=b^=v*Ozdԫ'rJڙSܺEO3Oz`[~Y٥2edniJzߨ(?4,\(Z_+Wz˂<ѿ n4̳MIbVF'`T8$Kfb'(eVj4IYm4M5?DM?3 |L"<_-)N.jp,2ҁ~vVjF34RSzrFv7M~jM> /rq}XOө}4Kqr$?] -忦4,߽k}IVXrueKWߢcO(=A0^iVSzTlҿ瑗+ |sM^]w9nMC SVPa3T+=:6E_K~/EvT\lҭ_;z}NIjKyQ~jU+1gVtT՟hԇiBVz\lO"GEWhO2Óz^jJ\Ӟ+?QJKX鐾R>_xjTv/fQpgH]0[0VWE$d?D|ɹ-OPMꋚθy|\ozidvD~Wew·5Rnrб͔?9MQK|oni) Y_fZ*&ͫsG=0pbY8l͹sH\٥]ٓRNO]fTߚKGOJ/˴YY}MDҢpyWQ?MOv\?%*}J.jD%UCa=/54ߣNVb&jQL_ l8߂fGg[fjN f.[ߧY0Yr$d/PL_Wr+3Sz#VdӦ;)KHz/~VsT+F& ? 񫶡jeJoJ[/ |sM\_ #f ݣ{M.j>Z&_p󪍚u۹(NVJw61+f<\E5c3V2nWi}Rt,uޟ5S15_be)%PzXrwH~iVFE٩I2/|q/z&7+sSzd\_S?ebXn+<烈!\^[l,|ҿ;Y)'5LLVit稦X~I"eo·5OG<\FurOJ6GC'.=2viTK9k5=O)?+5L@>iRL!L?ɑVP3T|+rѢO(}AÖ!/*=*>im<˯T$ܠ%j?O55gh͚ӡOI 6_7RzTlA/&,(m#4H?0U+3GNjRp+tTuT'%OE^c5'fMZe,R|}٧VffDc~ 2yj%GTFvP;"ٶmX||=~K]deڬOq2 R>GE'.2vio.iu| -J۔2NrMBvdF -?? r%e7G52ec~~V>.4MmghK>joOuW%"xA 8\'QTlC+$&"+?L4ߩfGe[9>0GFjÙ>WeG>a!5YsTztl3V~xy}6VPzXr/=sOzLlOՙ~p)#5_VLerfxS`\% LT2MR>FE'.W5WL|3K"ŖcW&G3&w[ͩ_G_jf$֪҉pK.iP yM1M쌻IyPiLK5A-["ս8i?GK>j_Nޙ' -}1 kMI@p]M\PRÔ -Ak+d6aiUGѼ5\AA lȄ2p1Bd~-"(aʋK FGʲ!4 $i_UdHTu2i j;_bN?ռ+WL.<#&iGIOH˚LBj4ldQbKgҡ-` \3KH&O5g=`Lej/pV W'̚YVH͒["ǻGG͏'\ףʠsdYUA<DQV0]!葎ұޤ4(5b#O!qɣ$1@GD8 ӓRQUĬ:Z,L9&@/ #o0VhqcF$c+w" czh<1#(aݻb g*4)᢮툈wf3uotrbinyb&+|[Mk|pݓljmb;ᢦ#OfҦmrmLۂ.mS8fnfةn 7}/w{+W฿[/*/\dTT?OdPIF* D9(3zt6:Qo6Q5+>+W;%`YCGR qE!%o69=sjc⅍Zt#Sɓ&LD)C(N`;c=l+ a^c]&`FS丕.p*u[(0S[r9rTN -RF]ҙ!VtO WBeS\gENTdP6%rsZ)Au1kdw-}39㖫ny0$tnr6i5"ve77njqS]Z8QV(A"ģ{]?dd(#Go(2ŧVO:ؙO.C!yWܗ"e=2ձ>/.vBmC1VRg -r?z)e7}E .[eUfYaȪ"Rm-bEjo7G%&cV|OK5#1 Lܺ{; G&LnLLq2RHze-z8kLg%dD~{ncA7Q J8uÕ(ki7eH 4}:|䬘wH_}m$+fȐ'̟ ( aSHO OOM$!>mslZ$Ē|rycXz4`Ѳ4QAC%pjㄈFq)ƣX}t:TP"F8ʛ<򌑂Ez7lO*fة"p6"fW6Ϳ?xO -gKNۛ -~?lOC -"2yY=XVcpZ8RCAWcgf@tI 'e̕Dl|I2o+`dÌ1ca[0rƱ.RX 4ϐnw1@7r?hE ʒG|ɯB%EǑ㲜@SdڌP!:` -R\"䊹 -EIk -7ͬ\P B&]yVR%,Se^(h7Ó(^D%tз#J?"$f c!) # -H#I%hǽpo$hl<{ܰ6l c$7&a7Nn^7L"A+Gh|$D.P/$䗪2@yƭ#pM덟>RX9ILBz ߋVW/=04b(d4C#0&r5[Xhi̧jhz%kpv0܃O5 XFk+j6`.);^TM:ʇ-Wj9ybq#(X2u+"o>pCQ~vfɢlt2"0L'~iodD˷"՛`\Z>CFث%\Pܘu"ًTu ] GWR7m|xcjW)=$U3H;4.~~ץC0"ЂP;#w M.;2Gi*@WGrߦӏz5k$ OuS @SA^AUux9Qs J'0mjci =;)k\8r'`;{9$ 3h؍-X*O`b4=F5ʋ-.VB=./ &jFctс-;$e5ʋ.},_reUO=iO젌;n6 -d_z_ 4afܰ -%l{$V9H54OT|+$F=9C5]dD8\Z匮+͐y' <\8VrPܷ#K<H,Te {D񰫜78*B{gICG@bLBG -j$XD%b*UmPR d+Qa1'`IXR,b;+6615ij_L"dp 1'=RdU,KjčφZ^j?\;v߅Iڦ>FkbdD~P>+6esՕ4d]ײK- ";˯ymdCOӋ6*Clf51{hF-ZapԉYL*5mXJ O,X2":7.9rmPZ깯{9EϗqJvOA4: s nsr<6/vLUr4%9E1[8qH;ogk lI_.Dsߒ w XI"ܔtXEr_,;̲)_e$ -ioexɒ,bE"r*q&V+mN7!ʓcۊLhfˢ1UJydbLlse`J\ZB"eJBɶe;KDckƕ,$ъ[Wݴ2?QU-iy<;${ - -6~La €ҫ?|}3%?P"xsWt-ǖm \D4 䀥Q-}6VFML&9d/aXGdsrrb30c@W䃲8^WIN㺾Y{et#*ꂀ$nNꑕqj؏ly]; Y OnUGZTiBR5rQcʈOl\K19氫rVOQyVư#krd1JA/C_ UU' H ~IŐQrKoૐI%DQ\]qG K\9 %fNy \?J?*T16#$LܧhF^$HnqLqB a:cb2UrCw~Gb3*2'L -qV)v[#d1h!9\ܺ0o*ᅭfv1n\PУ-*B{H"lO#G>can\ӔUd$1鋐3(RB[F/5v\Vֽ"Qy5~CTr5dҖϔXQ[3al}r2.j/KQ.3XetI\=rIgYJTA;T*f٨xa%R`Hx{:kt%@Ԙb;QDX6wg\E 7fOx%FǑlJWoY>J5<*6Er2ʇ. +c2FtIJљ%&p"ͼd7:,!3Z4v^5W*@/+ Mlua\2d>-Y z&Hg\ep FjdE4,液:hHڶ.^q2IZo{"?X Zm1=}5*ZagUo ݝ;R|EX s:REQo4|yrFa/=2FKM8 Y@RXlUldbkeYms1}-],vId I.4 mv75:*b%~[ -9U+VJ; I, b*H0 m1t43f'y -L!c2|eBHAF@8X9xbTIg`<-% Pr|3]c ъӅ@c+@NR - ʎ9:(zs&$6v+ GAH3 2bF(F @w1,{ " - + Q# a xϋ I#JJ"29][G(TS$;W$Z6N -@s\ &)3FplHL:PPp!_ݓ  *9MHPqFs|2ꃈM$t6hzo}BLl0L<@Q_va37o2m[㘎TUQ1HW|3EMsˊDLT^;fٶ'L6ͳl6ͳn{[qۂp3l꼽 DOפtc#l9“ --ㅔULV\k'#>1?$9cUmo(ěi"츊{f5{y{6?L%61gj0` Pi% ^Nx)"X@ LR*ܱ̬86Xz;d%U -p,' -^8R&W7$KY fG^A1J!=\!0i,&)DW)$CĐB0Y:GJ+F?>4$cRRCLFb䧊&˯NE -ȧq -8}pb -|kW(Đ9-C7:_-JJ)e^hG-tgX;-v9nSJ;-# եASM%,\WnUwNd^vT<0(=z岳Ow&^/:ETx%JbjOv_5k({ Us/ljֻဎy-,K2vNmې - c շmMSius:7j2jTSE!r:nc; }s<$8}H@߻R;/|)Ts2$ٳι2<&Syb,, {roLO܋sW+;D2oQdk̭!VVN.D_F~ٰenu򶱨Pq@ݵ SD˯\_/X5366LBME{ -7I w+:tT\sƫ9!!hk2/*;b=2nZ -T`a'}cn\c^y'8s7wI[tCy/7sSO\Ǧ?ٙbeDo^T=h"1|Ɂ\<3#cWs7\Gz`YѰ%W5s9}:ss[0ԉ Ļs1w"s;B<)Y6Yy,c^ 0NIjGUd,޺>AJ٭hF)̒HлzЮW~} POv$p (X -c19,Blx$>&!q9g#c;(|F "l1LsiWئܳnG9uku%f =GV 9O@H1c0ye 11ucF>BF͵{|;]Z"*Q&/ tPWC'hMmQXXw[|fjOLb-ZAzw.w% 놆kiL&UG_TCEKD>vwBuk7$IjO1߾H1ș%eyNhQ8P恕 W\A($kQ=Pt SJj(mV@]A&V=#ZO+Wm:BHC/埧N]Þc$vfY_=095MgPo-'TrCsDLBM" ьkQ/DD['G'-&527O`_ "lVWo --n7{IAmQ`e\<< rP&aVtwЬFƚgI$/Ė@+FR1QJw0G #%'U8v8b7GD BA\Dw6 #*3b#`gLr`KĊ8ҒN~##C$}Py]l9+L胋 (4p*D0sTg!/wNJZ9]HT'W=Of'!lY`J8S:yl[:,&9"qr+S/럅{j57o P[Sr"pVDDT6b" {%s&`ўMٜƍ"yOw G#T҃i69Ltحvc-GVHt+Q\kT0Λe"tY-E-;w̺j&˲X+W:kghV/+X$N#ɒ-2s|L՞9)&?則l -*&YKn{,ھ{,sHՓtsy81 hEnCLb@Ű$DDA#նMjs)@SL@N.flS9۬pioZ _E};0X\uo!_5r*Q;>;RV<8R{7Ȼ6/kq %S3cj4yk$%G\+(W-׸wVrd赭ژ[VV{1Z,c?  -o Hc+$A D9E i2*vw'-rRa=\THM?1sUm* 5TfJdD%mf^峝[a1B$v 1rUbVzG|^몺G~|#e0",{*1S-?aB x8ͫr mq7Wlzc2rQ#|: -`pM&L&PAF>RXh;4ɛ243ėJ˹X FHjZ?K#q+ .PvW CX&."_>ݼt~k C9FjH]|Vje$8-JvGN"-/ Mڧe\>Dy<]x6݁`Q7dEvdiG5Pԕ e'QGk SDY8v#/FO(WHT1HXZpw\+^ҙ{@aoe8wV;ő`[+W@bQo+B'/ Iq=t"'t>#n 9c ͷaRH"#O&1Ws v=SlXUEVpQW|F&r&r16N m ]_&"fW6χbMޓ*c vE*|sUV"ώ*|sTsW5W;jr5k{_+FcWb9k^ .pոުKՌe8\#-d v5fa.CV$Gl< xn+꣹kTI2LY8bk约q$-qhV3TSXfJdsl{[ y؞mjE(3,'t(."0w-g0B둯طd},쬒L -ƙj6͇}co \u!;0žU2l۲#sJt%/sMV@\ d)9>HYpKW+~ܴNV9g ӌP衦i/ԀgUVO{J(X1[P=K;.D A.aPq+ѶU#a"5G84uqk$O Յd+e dEʍ|jT:쮘%aZ/1hW.ܽrX.3mF\TPe3ߊW*bh6i(kZ9 Y֭0k_=4Ⳋj_Y1 TɽF]Ufgg;Z9ePU7lŏl>J{*\R)=Na:y;J;5&[+C1 Q_$|1ͨ%j3/zB)i]Z%)!.jH>E8c|-SY 7ˏDU/k  lbAyJ%jc׭n-"DTa{WYt "!eTW-pK&<`x+_w^(vE\lz} ^CV3hc֤A Ů{$D޴H:-jen+Ǚ28drX%[*} n z!8'D9Z֫Tc؎If0B4k`rc7#D)`$e{@CW/GvMrB5YeBIlpZ||V=nʺ^V 2e:9/,W6Ǹmπі%t̘&%Q"_aTIfhǻE+@K.Ob$BpyW1:.T|M"g@Nx[vERg;!"wT{is(=/W(DSzTOD}ls([T:+~9g2!SʹŒ-/gFFi7+2_w,rQգ\w omzX}w_SO oh&պ."㲀XCy@+r`ԱN4Ƅ_Pw -ՋVav0J%V`+6~_{{s6ͳn+6ͳn;{?Mӫ,\y()3#FVK%X5p66#`k%|䴒Y8,oUdlH'V4H6]N|>@bId4-9} zVZ|dQjy6ݲS(zy{ [UUy*#_! Jw{ d[ǍsX=P3][bZGnm{7ѯ!+GŝV)'l`d("tpY8W, -]y=g;e 0 al@ˊtڻ57V=a*"*/=!H6l#6seEDE^}E p-DKp9z )Vg}Żzm H9v -|Dw@B[JeV.-G{k 9_Y˧<)E' @ m - FJF0GkOFl=N atj)iIeW\3#2'-uX !fΦR;좈#)Igi<3qbYCy=:oHV#!OWOԵeg؛x/ gtru#^tUv5qwh~Ļ2bCR`,:X%K#L _Tu/_wZR2(7i=c-VWE[~dOI =+k23kg>2䢨bH*Q kTŒ9@9 vfxF;uzX׮چ%s%.iX5շҮd#`0` Pdst~!ddM:2Ĉ;5 @6|DC;.=J5B/5rls5,=U*Q5<$GF+r;Ǿ|UgeFMjoZf_c1l2@@SLc[Z) YAO`4#QygHʟKaT]M4Fpd^+Θ&ځVxj%)Ɇk[,u!܁>󗽨?ML!QU+)QlNʞ_˥eWaEBխSrjo]$eZ<$dPz Ҵ*vќqhXG!^:KyZ'7/8қuB~ΠܰGsLˉ̓)e[vֵ0#ם>;(\'t -R߉oi1ђFsM@rܴn6@I3}nOXo!m9;i=RpWoWV+09\BYՍ-"KY+2$Mɖ*c?%joyᢑM !`ӡuv -8BG=c= >/""SONY9N>ezM]@<6U$_O/#ui R_|2,ƱdGI\ -);K(,}:nRJh` Sl˹M]<,ڿtiDTTG2Ej5Ư(W Ή$f(FfL]Ev--3QD++@'ԵʳɗpB*=>j#Q&n 0K4xniHjo^zQX ?QGW"6DJxi5nsL)=B2?yy7%nj6! C"Y33J'NQ9ROfc[rξ[&j#+>'a73/D%}D=zm CRŐ6=6Vaw%H.RN -.j?F: -FSO95>VwMX`u42 -giGW3'~A{_F zS4PH9fi(X &ݭ("pǚ]AnUF]"^OWWGf]zMԌem6, -][So9jd$ !VvR%Z,qjrsYf"Ρ[s ᨘx10mO!څVNt b"D-:EFV"cTq[[CһRYVs ?"אwRENc2TSƦ ,)::\ث4,CbiPi`YD%fyN"ub)P`]݅&?5/#j ՔNK$&A u-6d7P/OksAm㢯\h",y#X@ ,zZFYN0Jtuv dYI(FyA1'8qdj#Zn+mfɋ76ͳn;fٷ Ϳʃb|6{jaGs$ HR%b4:YPTmW?'OC*LY6؟Kdd䰏_?ῲ=Opb5.|E Jc%{|߇VCOc|o?ow"].A |lg1Gk Δԁd s[~;oHb#3P;2JOͽ˞y˛.l"ls6\sχlٲ˞yٲ6ͳls<7;~ch\58QfyجYI<#To32uE_qo&jU.jRvUSKz/M54;5Mu-/-շr9ⶽ>-ՙ)p8;g&-ݶ6gcnuqkĿ]9%~[Nn\+,X_[U"1̵W*5T[NWU[ՏkVo.>2yc뻖"ث*5Y7Lf_ډWkѷj{ay0w饕2=Q7!Iv^6/,Dosq,o6{ܺϼEg˶K}n%+iR6m,uެǖwT7N !1"2AQSBRaq#Tb 03CP`@rc$4DUpE ?~wx຃vPy[r[[p ̿!:'_s~wzM+]c&b +zB5tߨx#{˃RaZ:SoOcƺ[xRrI?99 0x.M95,,ZG4PbXP']juHZҤ\a#cnA/ysd⯟tǑWQ?Ozh]fq[6#ڋKK9udsn#aqX}Q^\.m`kH_;X4!VB:C5›Ieru,HCaMU*~{LiUӼ i,LMC#.+/C Mj``-Sy>)$b&2`QrnWr(s9e)0e759]>W<*^΢ekF3ACuwCN:.<~=|||S9cpG]pi>Hjbܠ_gQO7Xi EINfx+Y> -4F'jts+2[o]6ңe.??[Ԭ+f<8x.\Ϛ%j[rß܎ ]Gyq]F .m䴿u{IBܳ^t[aϬEv!s,[p^ 5 ke{^+e+Uv ? O r V,u7Z5{⛃tw]} uJ9cAXTmx෎[ԔrڽRܳ^39[.. 9Et,yj/~ഇ*|x,M.[> Ǜ=6S3MKPziϮ_`GR#=tJh -y2а|y ^p3||̝&C\-inӊKѕu,ǒɽWE1/(f4 XaY ~MM 5 I>)2\&Pc kZQ@_!z`߄M(d?Dţ Qp2`(Ykׂ0%Jf!6\!fCj`rADKqF7n?^Zꏽ;0>o~I{x2{8_'PǢjWbzh!nۓP-TYa\&Ԯa`~]iEQObx|?V%=.8Ի+ü2nAByoCth-Vn'B r N ߒ菡?Śϩ_ފlN~monuB Z/{]㓫ꇴ?`%*C-xթn&PѦBfkq>wC:B"3 vy+d,)ge ݫN|A F͔`jCGhi4Bi }4bvxeCj_%c27wc gh.3豅Ɠt)s BB 5JdXZˍ7Y+H NGH0Հ]!)䌛4Y%r7G02]⌹=~`CصܝB9i5t[+]0x iS0!\B\J0BBbWޛ_8<UojUw{]Atͥɹw}V$zf𐺁nݻ -\+ԂΞs?o:2%tu/|I-˹ v}Wd܌Іh䗮+Y: %nUo|\VyC4/zl zQSelosI!iߵu[ hqJ?.88 ֣six'M -5u78ryQU&3J6H L7KЦXZYw_Hx7#-C/lp[MCҷK.r-2 Br1 M<|S.6Jam!}aر[殫xT|:|\uPWJ?˾j2CWYZ3V:4]*NUG.?Sk ]7=7wnfū&.l,X_wP?'JAXvUl;:A [,X} dy5}@BXYLv!{pW:!2a!tptf3Gڮ^X Û.~&QG&9 9 -(-V0M|Ob2 -V,9%h]L-^hG*<ۼQkl3nG>Qq>_Ner2NO~qغC^·n+WD+v=2O7d]m7/{zkޫy-VhIieC'`ܷ% ׷4yrݎ o{ -=3$eKqzZn]vt[kդ'{(|-"_m^CE^±ŬZFVr .>hfd?+QӨ+b{fvy/*LQ_iORX֙M~+q3 -nq/o?`а9&Z6~kd:bMIa` dd:G&)KP#sb򯵓Rڵe-B0{[r GSdG!2`Xd=lɣ7#:ᐐahIɱ87skomɌ#;rfpl -Htr ;ԌMe#ea9$K(&EݫB!DZd/?YjL2Vr ,Miɩ ɩ h/X&!j/ẅ́/95!+El衣]k ?<+4?̽u9y-&,wzuv[p]P0{?ئC`ꟲߵt[+J?$a>hC;A[7/YkB9jޣpdv#xTzݻZ!́VÉ[^եP8K-7^!}ۖX] AW˭-MgQqv#}m|;BJBƛG!ߞMO6sڄ ~e~yx04AڍQGSON: BxnOe 0r8vɛE[$+[41ౠAC ُ! DRQu[hJTkC^3JڌV졤ɀiq_g^nZ\=(4smGZ-mo?e{Ve6kf|<π්vkism}F{ -K?e/`g]ng,yw9KM^ Uv'{ҷunO Bb - o[U%uFL腭"mS޶j-nhGFkɻw ~8Jmm -^6,_UĬE_5#wɮ[PĽnܷM5\-TǢo7ܞcIxF{g-]k<9n-WY̨[> -޵N]px-M[hⴹK -6]V[-gf\{tF4k0d4*IZt}0ha X(ςÇXûX,ZTOIi6w.t8cJր Kũ!u:V!ୁaNiX1rt -.Fiڝhܯ|@XwHZ% 0&oGGMQ{Ng~ S'B7y Y,)\%vG\nX';2:GxJppS}g_vɄhUuCV[ՎsJrr7AFo!}i4-*CUc&RHt#`*.B*I/ꅱoO Ow>-ZpC=^_ߓ+F6Q!`t]`XXrA VB̕*l^88X水~kDFNDՋDq \}(icXց](HɃu,]b_ugQ 2~/ VC{2^ g^~Z7,F\s~97},}#5_}e@}1}38y糏(u8Zص,&?"lM0W9M'ݘBAtZ|4n&بܛ -C Y[<ؼi) r@/h՚zjIh/FW"@iН4Z(Ȥ\{":<@>KZߚؠI2|"uG, ##.96C!+9u@ZEroZnM[2ųcX9qɱchSf x}#uJzWݴb >s-6C5-5cb]R;㓮FIo)q=^97]Pc&-uop˽(|rl+[&Eذ4I.[·_b> l Zmj\u>ěA}ry BTw|/vpv|Uťt\Ҵ4\Sro.uf\EBVx-F2oJ+kBP\}v93=4J-.a 5t=$dMS0Bu\IX~CspE+JdSbْrknAءqA6DAi+Q-$APdd2LPɯwPyݟG}Lߔ*1Vk9Hˇ՟(CCr9 -%r`rRSCFQyݻ>Ӑe7({.9LX 7vlLCԎ$x.S-:$Lg7d.ZG=۸*^ɵ,#"% &h.E΋ͦ K=]ickObƝHNy[1幖#hX'pֶ*Z- sz.|*A=mɽ+c8-Aa`Sww$|p[.*-V=vq^"xX ]et]溃-֪\n=-rd۩4(Lq 2mq[+v{+ NmgmoO=۸-Bd'֌Ž+(5LM.}-l-w'ǵ ]BCl *_ީǺ_[zPVeݭzV[+r HHr#7Bw>KNkNhZ*W.>-!U^%<^ж-343A>&p!w XaC(̪(\g)Ȼkh[$s͕ŕ!b@](ޯPV90sDd뒺u''@%`lZ W(kCLXBBwy 4B`LE PB菤?9O'J9?R~ErnNnF`v~ũ`Q :w6x. ٔ>i녁5 MX'&e΀c#\-Tkˉ >E胭cjZ94R 8&n%v-l+\YTFI]v{D"34_<4Վl JGyZ siKE8žM{b,ۼ6j7]Q]Gb&2>K4ݰ1i5|ԗX[ź ZU1J˥Q\$.Z e}o(h g;k/ ,lDkɬBX9䅋޵ \ZՃYrѤ! d}WT]jg-TXQr*º-jrݮMZ J8ZZ\}74sٍf< C\cP]'Kqsi,q?n.˻ B-o -3.FFA.y+C]{10p -[b1`)F9M2DFWfԼ P&PU+!kÙ3ܷCNJ+Ri'`a&r~szĈ+yN/ai0M.^2!iUVGX[eSZB뜃uaXcQr"l_fY(]LZ^/h[T`طec̈́Hq}Sk3s*b/ ?9^+S!` ]&~MGÙqZVa;Nr7mrt"Ci\ :e 9iYBLYPBr-tD{BbW}V†&P@\@,A9rF8pԴQL-yM #5'A[%HlŢ.Gg5K$'f¤[M;&%R) Ѥ6&I*crbxWl6 [sU 5 - 4@IOpiqbmDUc=ΥWDpGQG9ܧod(H~jUoob-uX!i->.zcBho+\ aLY}#ZrMT.XFMW͵ʬ]V=* ylp4<ոhq]PĭWzcܴ_ھ.+|VEky]pa }д(˼Zh-brn4Bҷ!_ax3 =WXX幏$џɲ<֫nB3NJ^!؄ ZDwk$!o|2Kٿ ʬNR8yڶ90cKѪG]qشTB:W-&}BZF >e 0TV`s҆k]U kɶPZ%`Dk)Dnk|VFVG - MZh 0Mj"PM/p`g/DABB&+IJ&m dd &~AH\fsVbz9~~kU!~'!'!'!$ϘUg8nB n#a25l{>j0SjA#A!U%_7O/erf|w(gm8Bƹj{EՐfڞyP=.pUȴ<2KroUΔ#}-zWg(sŐEdƭӱAⷫ)jhs^IOs#s\<F2 jҩiS(G=Rߙ]O>M[ǟ#=ɵSs9cu?F %}oՅa}sdboU(]vVmomOta-@ksˀZGMYpFYz_f;Qs{ϪGud5cUUBWw`[>KwMM [+Hro]w~A赳.a t_h#5&b; vUoCa P.>J>WJԄoi!`!bZBoT2'&6Z徝\V [І{HsV=SL(GOjd`,h,c,K -ZL0LE;6E{TmBB -9(_̐ }7nB_L*<5@;V4\ tZǕ2g5/ ڏ4!V.(a[)MY⵶|8:-<W&쨗з(}- 6X+#'EMOOJ֊r]rtrQ?"DFCsziftej8!{X1q zT-TrVK]()WR|pZQZWpɭ ]kWٰ_g9hW*3(]%{oBOt]7ݓ] N -8=lsv ~i5`OooX3ߔfdbBRpX2dw& /ˌpBD+oިb\ dWX\Uym;JƭM`3oP78!Eթ]V1Y)iTom;`-@vH^5%is >*jx-+0Ex"TuaϱlQϦZCMxG9iCHͪ+V6<8(}8ިu@V7nູ;8޵sGt,NMA4[m`Dnɨ!D0x,L5 `5rdWu BM4]hw_9e`B!1q#@fAh녆@Ma!1Hf 8 n(\BZ3pM0Mb vd&w4h *͠ #\#covc/ -ujɤVKYȈ݂R3ka[-KWpFKMfO Y0Xke;f? 遚v^jhA]A2˔C$[>K]f1-{iXɻɏ|YNG5{~A'm If [rek.[!j҅0|S42|%nl QPRܷ[t ;ZPlBݷ!C0^x-Bԥ !Aj+f`]:ȿ{M[2o__-7m ,9(&@=qކcQs!`hB7^pp+[x!m .V k Cxp)7 2h{н{-!^Tj0dPQ56v*rމږo(uo_z#3Di(Y`c(Md6X3Gz]Nj)M中688&.jy$¤ *lɧMʛmd& 2NgX2H He  3O(?@'Gj}mSbUΑlB04UƜoN!ݳ -s^lů*ԣڐ?uU!jюbIUZMŦQͱr9 -JaGjuf -6 ŧI;6ZO0U9H95*flbX lr86&¹I+7#i~ Mo(g֎^GMy0P2%Zn+b% ,8À4cWzaa%];_%xoviDǸ!0yp`Ή71m#}ѽ5ƛqr7!W[trVNMkf2{Ǟ~xTXI>h\ skV[ e {B5+^r{h96aQL\h jW>-Jl!},"Ta>,-9i [cnkfOkIs| c=\1JxC.BWxZjxV.G y!}*/u+ W8T+]"U/NNf\{W݃>*ڄ->fҩ⌹wyG |QゐYFGy('U(ƣhjtǂ#Hrڄ܎hZ%moq}!r:Q SWݷ&,H'odo/Zt6%͵\X+22՚ش!'>#fBe^C+R?0.9:v}~ 'l!# M& $dhh##v)!!  a -+0!4Zڀ/0Y#(1Zn+DlJjln] `}FA-$!Ed -Ԍ=E{tg WDYFHhTڝ/ZF{-2[jt5eڢyC@ɤ,Y)Muޅr,6K) 2fu- -x$t&@ -Yi8!6͊'Z֍BA@!kp<6q. Ҧe9"@ *7QTTLKH WeiuB. 5JČّۘTҤ&ۈ) s԰tY+5&*C蒝_v,N!䆍fMd, a{]ET{ -൰{C $-VɬB2%E[0u-7N[v=2c}ͧd8]ֶ4]*+ēmo<Q&C-;EJ bnmBTiG)G5ͽo2K|pF&0co2|>Y0J+9D\{#t -%ü * L! ;n]Ml:.;PX  4 -+Z[Ew ]'K}tlaεucb94~AثƠi<\N,i֝/A׮)InOvŨөmbY R{\nU}W*S퉼d!uoOYV4D3UKټsbr{QγlMm<= TiPg5A3}5ըka #iLZ3l2f l8~K؍М,UY=ܜUwjx1.iFrZ(8'#vglp=\Q$B'b?DO)QOx:rn%H VB@дΫpTзbwyz dj$ \HX4>e C< I>kZ'3bΰ%t 3D٨%:,'j ZMoSa67VDZjigo}QL!a<ڎkcw'.Iǜ y/cZ~J84}ZD9`6汲HGNLE7yʹ>*tе9E*7Fүx=:$s%[-k:ۓ*jp{\=IXchٔ֎옆]j(^Aˈ5U떍6X:/jj@KWhX6w,,?+oD|${0$vZiXdVFɻwىv&_u+l+Jyw#.~HiNkmMizxZeP\/B?^[д ݯbX45-ɺwjPR5W&ԭifaKHCpum+t0 -ҋ]0r`^=<"{/NxgKBѲ8. ,@tޭꕪ_iUr [^!t*qtM۸.վ#ae{G1ibJ]v=iP{iSp*@^nG[֬J[VrvkIF?ڴ[v y p.xv9z铢WP2+y*.[n[XK2nVu]~UÛHQc Ik X6qMZB¢[cD>˼ab !S- ec%s_JauL*o:M!Rq,7!6CZSbSh,;mͻ3Lv|I Xp ӏjiC(2`d 22.C Ajh#QrhZNdd9X3MB``n)r!-ەkشaН4Zjvae9[E9 -#5jU#'DJpc}@#})(EV' $͖j|)0 *]EjWZ %:ќri<6\sox!f6{ sG4Nuh&- (ڣTrxmviymZVtԨVKrsFjõ4s.9X%r\%~@ݕse ^e(>7w/'X-t#.Ł-+Ou \[ź -.. -s7㕲qPlM+U_UabE\rc ӓ`j?}зÂ@z.\.88.Ǟ5]5'˪ծwo?o -cJܞ txdޭ`- )@[-+WO m꥗ --'|t[JhŶ4*Ž/kN5N a]rvq[opZШ%V-VaeNjܑ[_'C:܍eWYaiUH+ 0ɬ7s?{g&6'i0X "\e^jk`-j[5,XY`F%<4^#'ٖWo{q+tg!Y^x8Ǣ[m6DU භ?v V%>"5yc@9SlDBtSh ņ˓d FV30-CG3a78tjbņB|/|)`dl0/2VyMk.+Xd` o A`c,i`+"q3rl @;S2/}}Vjcpl%Beꍪ#Zr';u-i]<sPm*T7Dߩ2FL+td\pҨZvä{GjPMZ!N$&Fb&هB]tBG;ԩ,u)ԩ2+N&"c2٩R)+Rq`#ݕXwZ#,LBM*8NQ_tbrF,0rօY`'@ns:m6Zrջ:9yW7&{`ھ꺜Vq[R'hjڶ]4W7rgtB|Ecǚt&|z؅G[LZbuGD+SaD -96ofsSX|_ޱޅƻKh4lϊŌ6>kUЩ?5+t98N -t-u%h5%Տ/ #kGsqZq[2Ûwk`[& ;1ϳN@?eB]52C2u[&5V/hźw1|y-~cx{ cڼs-XlN{v,Tl-To] V zatBŌt1TaD3Jw~LM7pF,9˧ TX ru`I8VBVYX>|BW' ؑV>%l]6 DPʽR⺿GSFHJUhy,K佴\u]On|[QܛuJBhVǹ72 *yMjEʝl2oɉ<8iRo\G0"V!bI9Zn9Ŭ!tB3"FGYT֥؁9Ux%j HB$sB -CUgR{kGM˼'a -$:Os]'IؕqJ$TbqsݬUWٜ%`̝:qY^@yچ8k^o -8fHhTp#(D@N$].N -}wgmǼ v'(?@[I5 i2 -אf -˟N*ooxXҩe7:jWB-V7DB9mSt繂LjGl(Y7i{ʛrc6$,`.L2ɅP.;Pp.>Ё 5;oG!Y{֤ 5&v*o*n䁃!~ h8= i4ގo:,ܷlɮSjkAt<~1i T-zWM+2 5oJ O\vFX9*;-NsO%˯6F0jĔ5+OA:z!>jYJ:A8sxؾYB\lXoɎ-U4'#epB,74~@?k: &?k܏ubpD}nXiU@(ܪ H )*N' IПh'gаOb6@M7扊Ͽ|T1pLC|ٽbţ:]F _kM?m{u=vD7>VSтϲ-A ,i>Y:uGHFaWMAӢ'#헎1dV/N65H['fҩ21O3ndw<>|հZ4޷nxݏE oܷc{V]P,[[k -`~h8w _PPV[(ߓt rڮ{;W@B WJƫAjШb6(g!5W7tCIVM*7v+.Www|xxdŵY U8,j9p6rn7Ʉ3NZmd'۫/7.sM#s{tx-<0Z+ xGY[}V -V-"$xCl.{wi6[ އTj7]@ +ݽ-1]+ 5 | +*1,up]WqCe2cRW7'QvqɡDYyp]>Jb=o[TBhW(j+ts[n]M~nl98K ̘فV/hxɁo[)tw{nFϵ⪼f9ZbBw+9:}Uof6Չl%8 c8`ƢLiX!'e[Zu׊r>Ҝ8wM2{Sm4PʲM@Xѵ؍pLB, 3iԗ,qozΝA2)6,M |95ӵh*x Lq;'U.¥a6璾֋*\G&keQ'b_IδM&W\gmYTK)6ڛ.*`_KgP-uptZ[xx5W0Adi%ii޳}x@ݓ+тÓJ}-]|&ْS%34TK¾ҫ -UxUKV%tp*K#e M3[ ?!)Jvl :M/;ZM؈M CO NUV،P6ep`dp ࣆ)[pr'ݩ2' :fR9J(?@9-C9a -O?͞d`}+nPupصV fM9֚&aõjV -yl[֌mQZ2^<`BsqG.I?~]<:WC<*f{VZe1JلhVUc*>2yUtktkO.aeeV"'ƣť9?%PVTW:r}&΂KHn<'Ry3̵]8gYM[2{SlO1-ھ򇴻dtb%VfLuQq%?,Bk ޽S\C~kvV!isbkVA4H@>xd~ʩu*c{/lX<M!tXVyZ_ymy^8;Ds$vڵT!aoɽPqзlɿ V^#{iHm|̥Oչ>u l|5+z웗L-aq.u{]RJVsEiۿ%ty&~d1au&VS 2uGM> vd7mJWY>ZiS;4eJa fP9X8B޺u<hSjp2,HEu'4UZ&DCe mq+Jʽ$n&%+J|UkJ>JyTpRֹ͈]}ASLo!gsBH:|VosnΦ%\yNTiU],6;?{v sUlٗwd?ݻ;&/wty]fq^8M+r׬֦eZdaܮor26\,FQA M Ɛ4ɢY$1e֍OѢؘhɅ|@??T(F]K^تCoUgGJb~GfB,B v'ۣ_W5#,c=^ZMLK6+?$m=+^oj79+PFd5=DN!br@&%4ZĘZ>R1!4{ -[z8ӛʏd -9ҴڥOVFÑq};WXBigDSk5M4pskӁQf -9؟gڒF! u2<7>oDxXx J#&D^ -ܭNZ/jC_ yr(*~rɃ[(_Y%ںv=Ž(*ulU7m+vhԨ̡n|ɸ֓!oJ;r89c;B2Adz&}pn؛>؄3[dmJYKݽY n -sޕo]r LHWj|Wz,CYn{G Jyp.(`д(f,gG?%a[{hu\7S?D6$3x~oۺ|ʭm.ţ.FoJrq-d`: -I)}Ŝ;ї1ldub>ATIڇ$ևpNu+1ڶd|UOiLRU45nx܎Ϟ%8: U9QĺSjXqv]MV6' `\397CHګE/trWC| u<%nFi_'?llh -67 - D*,6mM^xׯ(2%6 -{`M$M2WR8Jg:uc+v;ڲOrq+ˤ憬sH>+peY4rQ7v9uW+<8Bu_\^5:;!MJ$̎bnNV -D{HZD1g9JW%.78,qcU+9:-%r`1x\(6yrj9]X6NQcljN&RsH_fex _NIj;f"em9HxXk-QhjFa`mRp0}EF+})}ºC꺵Ć}d|3qGIĔ.{HoQh-m֕N6I j_% ݽcε?5.*Cd,iLp_lڲkLhcH[ϊgVpWӸktyRLEQʎ9&5JǴ&Bܢ.(f|,43|8.xEi*@k ,0< -g\fل%t[掌̣W!U6e`ݐl,Z*#rs/ksV/t:x^i4(\/'T3'ZUk4f̕[7`n6T 4bқ5YH&. !ɤ٬M9]9odT,S}FX,6P.uKN -Ѭ4ϑ=&s TVι0r*.P(ďkQ]ڴWUnUmÿ&ddtE@btu*~M`p~V`{.60;hՑѭS%N̴X??Q/6e /a4J_a\;Ī.u=nNe\Zӊ6o֘X6[:.$w* K -Hִ\2`7o5ݢ愆Z/lEFů S^%̵f1Z'0ِ=8XW?"N4D|HOD'ŷY<3SŲ$5ThqJxhshħ 125Ѱ0^Ht=hCLyG(rݔ*4 ɹɾ(jWk!t~MU<8 W4& ՟<aD[6[K8K{@1[pTyM*ċ'c[wN\W6@ځ5ڷ_MKr }MkyZ7ٝ]HWJO<>s84ɸ+킴]?ݻҐϴmёG'w]jjdS`q-Wk^趻@ pTYKsB v^+C茚k=Qp ӛ;1잰h!)Ƃkw#ߺ9:'#&&<]V/֏&zd:ndl/g0aʉ]SroZMϓsW0b -Z{ -'?{62ش]NGUjЬlON ֫76[TwwvRo6IUNq[5ṣ䫵ƽЪ:W\3 -<5Ӎ,Bl\E H2 -3EVqT>˝[F-|o5qڎxu*ywr,ЩP5*u8Dl_nl*$1DӦC:I$'.@Y`zV+HB 4(}k?ClpBB6; D LPA &GfA TRp0n980Av']qԞ,D}\.G*UL쯉 NXLbt4kUA;K3xpVU_U fP-75ð(ܪjp:ZSA1~J: TkAS2i3^ VV`vx-& njֹN]~M {H\+W4m}lXɣu;VVa6ÛP 2j8^:U,Xa7ZTGWhv KS<:>pPoZ:l3M).of'9lVR¨Zvuhca[]4Sg-&.<܌vnwL9U;;BѤe`Q*4r׈rb9aM\ū\IEawKB8ZzlUGr'-n{r:9R_h2v]M[,#&[\l=c@FS$bC08{oi脆r?4BBc:^/U%j7S龈fad' #M<;YD<W:WXx=堵 !4Fұu7 W|YP -P#u?qwnquNS|ߗ nNt)A;I_.+]R -qC6lgW!k \%h>ڹ3ͬ;". ݓpyI ӢoַwdP ǚܳnMQmNxp[@KZ9x7D3jճSkcx-zUi$o -dFP7Ptࣝ)-ࣝhmE -IxO&[]oSsgtj^<4__zl9 Ҹ*g7e'[Vdnk\Z<'q^OS.2hA\V94-+A |_N{88}Vܛ0LjqA)Z, B*PYj~XmhԇܖU Ncd;}'6@"ڵA!O9]\Rm;@iaR,[+M]GP6lJmpSx{U#T4ZU Ap1օA9bNGv[֬_FE­0C{Po/[iވ,TV7?4uu;biT"N5*Ty\LZh` nsCA-x]cNu°kCG'2qL&v`ؘ08vmopM `#4_B]/U=89BT9vl99M?5Y7JFvephSÇbN8NWQ>Q.%ԢA؄٫rmsfOy׍WeLEq { cR|Jl䶻@lwp@5%G:W2SK4f˗O<7wwy:',~%xy>w/Wj97m emU3%QV~I2J퓓p F|Ӧ^/T!tMtV -8&rdCM o]7X+u#A&qʓ!@G^+W%\WC쫆Ӯ<W&ԭ-!{%k例ҝrKIهˆ k|==ȹ^\}^z?v =JɌM&鰔fb?nºcUo\S9rw@1uMu3%%QwL0Ph ^SF6I>9KK׵]*M ǹiTrqZ@qIƧ` Zç2қ-%q^J߹`˿eںr XKVcΛNѿZ-Td6}{vZk&<*,?^ReI?@ %2JhLq0`hn"{7:"rQeyhSs,iSdmh;1㕲! * .ښ91ؙAh@8T\D*J8E}$ !EL򁜴,x)'!};$) wKSՠƤ7؟RXf'& -شf%6s8"2Q~owTۃ+burUSRSV,>h˨ܫIc{tYcljx2W٧iW"30 -F bNm_gWR]މ}Z *I'a{$ MwbZ5Ӝ/uQYō>(m[v3rbD*f.n};;U0h|pr 4*a字٭LC0FX7vU5 -.hIG0e:Zf$#,xU\ rp8t]UeDFI\k6w*|NmI74m*jk"{uj9Ô%L L M.B=Ni)ԼӃX ᑤR3HKHXRcD0MC{ߩ]fG@]%r{`Ws6Fieɘ^-PXOJ@BE>i9&溱xWy#e x*ڶnoYjgVKm|r4x[{- -ra\搞Jn}06dmoɫT-H͚ h6m6φvݤT2ي[ٵ:Z1?m[㐀FvLkYc~'J[pU&'RP'Y*Ψ]2Yvku~_DV -';'س.Q`Us)K'CBihG C¿yqX7;8ZLU,T99ZG8CjzT3!eF`چp F>K]ތa BłHkߧ`lVQV!Ҏ5 -&.Pfk[bUq6O+U6_vDv&ŗr kXBʚl/kx.NX 2,[:ZJi!=+`|P$6yL*m'H2O2VIWnJqmC2".Zliλg6[7l֮R ֹ\Je«maZ -宲cR.+P=Ψ  ګ1ѰS^׀aI(AݐI,CU vJsKJ'a} I4*w}+`2\&yNgK:]hb5@3o@T:E}@s>Ɇ?8Qz/gُi<;65'b7[f.LB{04K,U 8׈r2gTyAXp?%ɽvc:BƫiiJۋy ڛfc'"/n tJi2Dwrl5,iZFgӶ{DJeđTih m`t*|8c얦 PZVcr28ga՚Nŋ@>y4A|'fSd$6<4N :GA?4A/VVYc论~k9 [q8GL9Cw0E7آ@{¡7#E7!*\՟;(49{rn2oWй'կn^,%8/{SGI5N ̝rU,1 -}Nާ#ڥnfռ[p_9)"5A** k>XsQÂޞ%[.U0^l/y/rՓۻƥ!kp aY[:zsv'<9Ml;UZU GD^ S VJŜڹ][ԟ)I\:ےXlYU,/ޫO#:,-6!`ђfdv^7[by\'228d<)~Jic"I\-9<;WiiABΒUqMNfTXcrpLV,9Ki;ϥXGP!=Qch\$|)NrH(pڹ1ac$B 7&U T*\ճ - &\Ƌ]ӳH۩p&ŭJcH5f'f2`6 =iu"Jcٹ"㒍BX)6n Sxe:'IUN <h#4EZ|#XFnUēm)X5{0db2 +ӮU=#s4̘*/o}V˷}]ܱlEy!&d4U,T{Bl( -TxhάQh!4}!Ҏsj^+Hn}/AGBkCL_񭇎G4{I9a׳l*@.bu1ɰ=yZ0ؚ,`G2sG6W3#i9krPaf2KP"qF35`-vB@t00OL;I^ M8O2쿬g-W57x9HriTl.Z<Ťn>M>QJ{8tG6Gn\e'52uJNqщG>-8eܻolhYyR˄bXX"HqOs\VϪ\ԍ>*,u|\rlQdUZ'mp[o=J;UJO>HZt:h5C2FFڢ~eR'q=Vީԇ' tj_gjA[R.j$rCOh-o紹)ݨ浑+WYW*wcIgbֳ@hr=8.<B/m\ G=Ow jX١zJ }J>!Mf܆Ee:dy'TMٻ\48!{35`&WsM9τ!dd14ţ!U5i3xjZ2̛P'x-"'1ki ;'S_yi;௵oOn_u܍V+[b+{mZk8%qlMÕ6 mLUpCeM }9M$v\6#ECZ[f]fqX `l*.lr+g'>k;rf֚^VLV>9\BĚ9݋~ `XBgR24d46oU4Cg ד_frw ؟Mb?,9|HVP$VW63A^ ۵rI?5:FhWl j4㤟mr8#P]Zio UnM%G8,Z/Z_,ZNa 2@c*Gzt6\3dd|==_ob"Usqeùf 2FsU+ܙ,owzi ځ)5bmLfKk;Qhͷ8bIm}]ͻr{ a[? 9FPlG&6{$6;,퀘}?)BwÓS9U#iR3:^le~p@Zfn¢i fݓrl=0`¢YBMLAo}VkA"vL Dj --vY]ʋRkF(i AB%Zq B24N܀0B~iwPŹMRo9gR [Zi8ZT9-ԩTMM I<8\*`?8U-F(:ĴSd.EG:-: Cާ8ppqk [2׃1zt1z `5Oi[;J :8,0Òkv -_)ۘUXхipUQ -ƞҪ58UVڞ-ŨNpU3NJo\]^㇚nu>ISiBK L;*Oة˾)2(-&:+G̐U<=6S-W|l9dTk!c OBZtF{C.[m,=JlGӪmZ^(Nųa8;?8Sh {BlU!_Ͷ35^]c>{h:UO 2ңoec݊ceSy-ZΗX\?c]UqTnڇ6]YU%[P\9 @{>ڗ(kgڻx[*\Dm xWb[ | ]˷M*9-;Ɋ6yC[9 [mY0hkufiBlR*}C>kOv[jUC]]GF"-1 ʚS[^h x \?C{VC%oeJ.C*fg |\Tfr˵vxd߹_Hg7>YV8 ~|=-.kMqwFڰ0M\Nhɂ< X-MSichUǽνIந^M[πBj_^|sN-H{pXsNcij'yiBjTqrlofY7*+ Zh0HMCgTYhlύIʟ"mĶ)M;$v'DKχ | -mk C 9I`] zmehL; -i4fILY-DeXqdROah"C4gE.p|&#B L -e:=<&m-30iX :~/ې'R :-14Z8_ PB*2 &=R|:YH:Zc婮iZy$cAʭ|lH->Z׃H:ઇ_SZ )Ufr -\b`*Jp ]=J# *N)Aߔbj8PGɠ - qqS\c ^.*@К>QɄw T/&W6aMڵugsьI&6I'L;7;C9O'm%fӮK{Xlr vmY]NCSȷjVJ/v&SlѣLާ:jvs6Hu76j3ض*w:C{|s]fz{ǻo&Љs4l&ik{#erl3pj+,G 99aصQ|C)0nn#d -{N7%`*fXhx,N -4;wkX - c k 틔7m}]`cQ釚ݨDP-%qZTl@ZHMYCzf״T24rKܿOZJKH3ؙ5:|V!쨂i7:E=+oPj6*T;&sVC~i+Nj8 syp%sIMPʸu܆ci=Gp|__O6-3[ xNNCڸQL|QB&6Miܢgc1B#!w9iK_@\c6㒑 wH2#Z>ҶQԞ*ە[% kiF5L 퉹 Fxrl>k]Rwz)?0< X}}TGc8fJ{Ea\MQQcLܯcW8O7ඹg QV`pTae%VAo< ɝmrE|W vyU֋Jcd d.~kJ~'ɩ3IοQCs+!{S,sOf~+t N.bK<hTt_̴l|y_o35uB{NA#s -OηͶvdsGب[s*^qҿh.XNtU@J6W(4Fr8k\(jϲ{m`^duaSjT H>ABͦrW>Ls5ɟIiU%8Vfױ;&T& sN9ؤF NGt[CD0/(_R{`ʲu·i&.ӭWcaT]a~*iO-bx~ 0{ѐUOmg89Mc'bt5@5:;}NvՏ%#u'Uw8M:\_X _h뒵jBVx.fU|{/OrHg5؅*?1+?2,klw Ů[R k;7jykcU28yܛ}(,,(iU)`EѨ9Ra.*p۫C{NRs_z%ԨՊduo- -}52M2\mJe-ZU+\qWoDs6a>K<;r0:%o+-*^T#mc0]bRbܗ%qN.O>պNq~ȥsVխ^WFL,|*d;JE?!Cb' Ha:T&ojmgzXf\#7?;a ̦n&y"6֧c]2\[J[4)GSd4u%!qKv l 5Sgd|ܣ&:E*ƽ XrtH¥I4uH3% һ$x=Ñj+'XmP+:JZ\sOlP_/CLQ?L]+A -B DT0Bn"ָT^E%-kKLF \Kp ^ņ["`*mxZD֍@@\JJ4" E-F -h2ɘm SlL 7*,ݥPؚƈ&qsi֨1m -ZbM0I&6NTCo)u7wz?*E"$;WkjXNi:,*kvP-Q]Uf2vQ"mjʙ挃J`*^;Gi 2*Y8I]vSGiQS=Lʩ#r{LcQA2jb&g9uITÙVEiP(Xw!nSM8\6GjZ-G7;isJtvӀ'C]e6Y\ѩ`kPdyS&J4b70vMgʑ]]:'\Hu¬njM6ʬvg9!Sp熲S[Pay Ul}{F>4ffvyA|=IxYF1Ӎ+Q}it:m.QIc$s,ii(6*f9bhc܄5jْ)Q{@lNM\ΐqc UrFJ7g4'o`2I%t[ 9jv^Fw)<_vl.H r2y~JKT- By59hPW{W A0 N+X[ܫ-ķZla 'K %] -6)gtSN|׻{Q4U@e}lx@NvMӸ*eI>m,JQBL9ԌSW*qEZ u䌑ΒNmZUHme{599ٜ,@a9)]OIE=;ٖTgrbvBݷ!us*]NZ#lC-gDv:HgzG^m(b7+^@pNoJ+hz.?5>EWF P\fRhŝ>JW~&Ҍ'dx_⁚-oWKՃtV9B&*?ۓ@+:̋rZNyʣfmFXXu -kЮm9B{l<ӣh8BʆApع4Y-9s ޘZ}}VEZT6VISR+"9] \u/i\C\Jݿ/SRݹeJ?HTsZif45'7.IRbT_Hќ Jc&vZְU7ksQژOƗMsZM >}{ -,V@\Xdd Fo}J9gv[>w"# }6%{% ssu,NJh%ksGB/LM=C:e}jrd1xA64pMΪbcr<>/΅ \ld1sE#NrEҮ<{M.8V]Y`t_]UcP8-b!1ifv9w*QmHCZ.[ĭӸ.*tS]Yj8E;,]q\p}sxCg+;ynͿܾ.9kZ:Y`g&ZɅ+U]B&KhwrDF̸ѹð0r83oG^еKksQXo]:5VgOfm[]!n\D:rV?䴹=>k]w#7 - -Fe=FC[hObcKg+O.VUņAmB;pV s&6jrط1c%Pi)Jvgg96s,*sy& Qϡv#-{VYuP ,y.i^n%nܵ򶫛u;[/xjwpUۙJ].Y+{*ܻ pRO7bj.yV EEAք)S&r`EѾfY*y0 nB܃KX&3Ik +E%SsdnLm ;h!jȝe6#LkF6\UuI*ةg&Tgt{f'#mLkȾM:.)4> -l21oZ05^ 6&9;5DtDnZT]7i@޲mQRO1L{ʬKHƵ.=-xRenhMu -eI_hͲ0Ԝ ]yjC Nmst|ЎSBŗnŖCչ3ڹ}ě&Tԛim({:βHs*J#EbbkcoX1HbA6] Z(e3,0[]Ty܂^֒ҳsId*v-!\}1ؙb3aL=ϫb - qՑ"6>shҔrC5b@:A!.\`e`.nñ ҄[GxAժ4gF,Tn>bS. -!rr{.{hr2)Ig8>yP❗;LLf䶀\] &d uj9yTsˊS\YrI ܅y΅A6m01ٯK t[wzӮPh?;&lc[[H\\VJy0.yV¯eENm4vMˑ5,K亭sa>ɠK-"yꙇ4 Fmcy9`:<䩽~Cc[2+Vc` -n7"KC߷'(4eםb3`4mW%j7NT! 0Wra5n[ -t$YPPPjpZ-(<4CCcn\ kZ|SҼI7y o7x5;74CNҝ6(-M ! r`CD͐_Z.ؘɚ%d 2TmfWAsPfe;Z uƟ&$*Y[8m /5ZX/඿Mø#n5FR*wUU 5>c8aɢƗ%Qi4X?ɺ97OI|ՙKi'8YqUKVN֝ErZQ} =GA;URzҰaW&܈+1hꭎU!)7 \O;qM65CU#ynTDYToINcNTrBv H8 ¥%9}VXu&T@z= /%Slʣdxi!.=6ZDg  ̪ -slULɔ%U9e  K\ ئف&r kd¹6pILc O6RYǤo94^Plaߓ kS S09GGM&i>csX&Kx98 t=`*vZ^≰ɉ[5]ґR#w(U< -\o:&li;U6 a͝W'js'D2*cwj PqNtdD>̤p@dtiU_س:!SZ .vΌGYxdԉj|Z>@s2W{>QJ洹Oi!bѱ6{V@g4|V͚@VX&/օWG6{gR j츎0[jnY [.u[&Fne*dYȓG]?tOf]]``b2)RǸ-OhQ c1rvVԭT&@WFV&Q`Y/ ~P|X(ڷ%ti7ޥ:D`"EQ̑zܜ*ۢ'7Es/>ScI8 0iJ3Uɿj}bEǔt]M?%8Y;G7Gq7iF˛}@8zʜZLiu/r,Sص]NZ0*o%iJ6ܽ忑:4?e+yKNi]zdU͌|(U%+^SÜ"Óz/֞x5Ʈո?Rzoch"nPޫs}[-_w -.Uto\ظ,u(/s@\m;a W#Aߗ[A䮠EH ;#ڥ!j%~d->P4gr|HXU`8vJC7-ZL&'--p%AqDo8b_ 7ɪ';S24y==6!s0ō&ب֛JQfLRpKްDT /U,vkKe{ڪChԴ[Zfl<# Xԩ.P@/M˔:@Ɵt9M0r<7z1J&?fm+~3ik)#&~Lv QLzUE6\X -4I#<턪ewi*܈եͶ|6]n@%6Úa͜ˡQL d/PA]QZOt ܹ5[mamis vX4y8k.iMZhX2Gbʽ) .pp mkWgW]`6C4]IoCLIL\Q6Yl}VvM c\E o@!ڴ+~^OҬl-M/w|\rn_6+ڴh> `r?N`D9`Yٚ e4C(}od5,Mi}Mh|I˺g5ŃG41Z6_gHT@rw29uG^&?as -*8u`@Yn5J-ڳ7",Bp )S;Q0dxқin~a{Ut_d7O}*=H=Ewl=3:309փ\V^{P< UfA/Z~Sx j?T (y-ު4/BMWԳ{3Moܙa' -tbٽi40&n}:<ա0Tw.}ۓ4aZx;ٌ.Q'J,Z.ahvߐ}sccͷr8Sr`DX*`]|P)nXiyjsZ9^>K4f?rp3UU->+fCG85γ\赆틗8.S8Bw9QN\"ta jsFN m*wTҪۭ ?I˔myW'j6fʭ͖ ˗d46T\ ~cJt rhrTk:);wU 2f=<*ƫƌH;D'ڳ9R}R6ejB4RUCVeV9 M!r׊6ƈ Md<Yڛ-r{3mVuTլfGP6ceޜLA=cAҋs^`YF͙qI1ri ¥W#K\cSsZ gmDVsH vS?0S-Ka2[w4 6u'CF3SsEkNL꯳&l!rWE7ڔvMhԳdhT]Mzdm2ۜk$HْXp'fqhĦ/vr796.Bӂm\M}JmlThiF\3x V&O>H#:OiT4;"S5-kU~K7>To#RmM]`KSs"S[.o}ΰ>JgUxgB t+>sL"4~8ulASVP8H[ai` M;\;NGAsd[P-s7&|U)ʣx\ʅSּbW pj56A%\G,^9Zx5rRqlBk&%Z6[2D ]f`2ZQÓ+q]K?[mgR_؅ :U9]o[o}N]rن^Xw~Cf/3sWuvZFjg6%VnWʪCSVN+sD-] -}]EZ/7.{ÓCX)亳^8-tj9xsյTYg( o&䖼l^YHMRi6w:,>+Aw}EZS[&h-#Cmա|.%鸼x,ML]=jߕPĹ>K@S -/a4ٸwRlA  S.~fhpSlבγ,TU p*G9ergstQQs+'Rwa!R0(g;TT2r_/besVHT2nrmϪ Sk1;J/ -QQS-.n)i9QMڬMR(0$&{-0{K|ӅJ ǪC{oK杛J% l+?e6.6C@u& ca -=illUfBd8q@s],@s~EV?6~i7jxpUݡVc]UFJ4=ª5xsv]/'/@Cx|aVc'iU[́6$il<5YUer4s -C'&W*er>ՇYwzZ7J jw+|}ڏ4 )aCI؟fۃGzpk$ U`+ÚuP8uvª5UVv$KSNH)n$ xmu!qז0&v=L9-jųsT| U,in4M∴YĖ#T+Gq*Т.!8بlѢ*fpU qM܏ V~wzzve7=i,jux*\Hw'=՚DǢ ,V7v i`3N8MuŧE柙G۵ mv KN< -a`ʿ*4G4?U_V&ev>va+84<pYܦhT.Vg'%'>Y 9ƹlrFSީO<(nM':+A99]p4@;Jl=Ô:-i(\`(h(\>{E;֝fT?$|i;gy9亮[c9݁cHYaG6l=@iӯPOpX1ɺ!32]+`Z? X5 o-Ygɸ^,IRObc3X1Eir"m+uvm ؈6v亩*G/ھה:ςd+ݽ + ayw!wyҠ~2zҺ-{ĞY1"'Pj!bp-k#fS}ق3J[ 3`W_iVCCNIZwP ]Gq[ҝ;Yi*P#,s5|4~#u2uSAi{qZMyFW-JA%(Y5[ߒ9/-͹>p6ޫ{!+Ԇ-}p$WdMbq>Uk9NSÀE'rڂi o5SqeV] -t@Tk%kW*nlX4ʁT_.9ɥy -SmIM{o PߊC +'.ꄒ9k~@* - I:"ToC60l-\$mk3\{B-T9 %razdHq IdìXAzmGraͰSp (pA%slouXrzӗO>eЩءɯRmXԤɟҐLz*Pl K=pNQyl*Fէ>`iEʝ5\:Yq)0w4ONN+p5RkhL &ѩrZ`͔ZF -{`svI`BF)*,.X݅Pc##E\sBcZ;.ONʛ[ M0[" `#FF*mFFh˻S@x YX2-=X\d6:/M#d,h>(2E頴& a8Z26\ h43 S'vi. -5Jg %ڝhmBoڙn`)4=\̵G;6~sZ*52VU}CS7F%|?o S>K+z޷m"F!I3Sf`wBԬYJ4]`e^(֚;њU]oMYv]Ok>K+w+{詇82A@طg'qe'M.ٜݠq{V#>+Si*iVm]k]*Qm`+|Wo w~: F-‚vXб#$l9[@:Ӭ~A_^x.L -ޕn&X؟5]FFF#{`!`R!Z܄9A:f~ˬ>Eoz -ޭ` ;o=OxX>Ior{^?]`Aɺ+vuR!x}V[g愎}*f$vzeطp+4ෞϼ NQ}㏒ǝ >2Me&˨VV'Ke̓} c&ܦs>+ˣ~xܻnu.[н]CoOnN=q]O\]Wq[_ x/w<wl3Zї5Beqϼi::D:;fksW*{74HyX=/;u}@ 3Fo8dS8U*2%bC]$jU^yĕ:'iUB[|fNBMS7b+<*OxD[k-6o}74x!|ՀKse6x%Tʫ];Ga>s1)EaBc/NTsb76 f 8&Y_()mBn3FE !dOrd8iUl -m6|QmG6<0q;J,kaCiL2遬wnG>iH +}mo/y6uqQ_ob-=a޵(Jd9Dx&K7Uyd?z!6UspcQt -Csھҥýl-# y#^MWAN6Y0[[Db٪WÙ<~HM -h6d*dZUJTm1O.$*0}N{ ҳZ{jU\[mUMJunj\ϴC&J[I-%;u VtN@sF|)nN~qB[fː0+QlɮB}rt(]*$;Yi0knB(FopT@fFFK i`3J RnJAp7nY&T@X63L 2`QS'U饰f-)gI/tߑH@t%+F$]3lJiJ<2 nzZq:ՒlM,J-ۑsb=[܆-4 \ΔI\NK5*ZNNHEޞ^K8٤I-ګm˙#Pu{(5K4C%K]gJ/cc%zfErTe1~܏*ًZv.=+R eOM80{W+DMjdf .ZD.8/,"pU&EېĿ;rzxXyd%}a Θ8ta .#KI ȣE֪9s KH}ʣ-2N=+z&n;8|>nnv^Sqjّ c@)ֹqOxIX0O. a8d-}` -ҰZ\g?% TỸK۱PM%nf)+(<6%՟+V̎ ޣ~FJϒ݅|;+v+4 ke)v!-FriTw\ c6_| ִM [6WX=_gSn\%0ZjYT*r^טbeReo[: Q ngճ ڨ=]Rv*.:jUس\өqJv`RXs%20 n-*Ti׷P԰kRFUT֞Ҍ q13yo˫H^+if+ -ܜ[]b+uLGst+ܾ͌/q䰫AQZ֝6Me*Xp2c)*<<ʋFц߫0;DU4/L(68k]CѬ˻Ɲ .(ߐfĄֱ9}E[@?hfE{ -o97\-O'cbu\ӶE`M_1C:12SE"(A*AJKDbB6ᑤ[)ЦdY0VSA';Vޞ vNmBA)෱Vi= VsF2dV`# OMw6G4 7cgO6Z9еbeJsePeٵbXlNN^69Bݗٿ\&.uYX#kܑe<"m -OܴӴ]ڍ![G{CF -lFLCm9;sW(lE:֝k꩒*5ڻTM^NDz>Ը0cs|:ֺtCo.k]X@dhrAڰ=x]>ƭ8i݌j2CC>A0TCvJWam 0 xځP˽ b;6DOcZOg.IxYǕC> Jv).">|'6;֡Y$؃;i-}2U29Slxp`xH.d_uP'苻UqpT" ve2 TvMw +E.9q@Z\+Al #AC7b!~JnxmMKCz9NW Fvە$c~xhF# 8^`d7Pg#q' 8v0x#:[d{t4bUAgj2CzpTm%f!Tip8*̍IfGěV`_-_;*ͼU)wUMNaIU@*C@\- T-fl.d!^-lG!M@mW7B^lu]l6Z{9Vs@%Txh"鑖Kn:R^Bln*0,pSˉ2InkbsCf&楤1Dאl7 0a6l@KOy$Erff~DdM| p(Y9!pd s$vKLȲpihK4{1iAIP20ZT\U6CFVQfS0B2Sis3vdv{[rN\evpɁV蕃DdݪhdqDªx5DwT́9 \FQh6Vi+v玕t\`#p-+a`ZU0f sxhfEG5> -emG9Y ck@D_xBn-'t -1WݘB B漵 >A# mɩ(eJ. /,QjXXZC nBCF HAh֕^ io-LQK'4r24.XX˻2պk x'ԌZ7 .QhT #BrM(77w`=f>od!;[nݜV%[·n.+c؎G~XE;SQq)) =~ɚ kGĭV!>Hdzv[p]Eup[ozTK+c`+u]Cjgn[+́:M.Ҿ^U9]b 6W J['zؽcuY53[V{ݹnꅴp[[:R?-UX于XB޷;3x5nܺ%lj뭌[-;豠^ n_r^űi຋Qn I>k|8gg]@.דYC|H@⺍fq]GǢ+vV]R5orq(Fh]|{ລ||2o`m/-_U^꺅u8,,.[juǭ=6q]Wz.޷ܻ38+j8/h[PBUR-E]*/{bu -1n-Vu곊ضy6 KZ%gv+S@n^趻ݹuV]RoJ-VBGu -/d7n*-Anꮨ[ŰdKк z3uVܷ.සuGo-ۗkݼ[S_ VʋtGގn[.xm m/Փ8..!u?*u%ދkvչ(dġjw?H[V|\.kcH+ݝWFO~WQv-]~x-\'Z[[P]U?ܻ돒ꅹov e5 1{]u\ށuurnz-D5rݷ/m<P|+x+zn[c?Rv m/Փht_n?_ -{vѤ8.Ýy(j5|?.>!ug> Tik_7[ݹlVq v]Uj{ZP׽5n[Į8/]Cn< ລoY|^|nu}WӸ-]uڷǂ zuG[-븭:亁n[ljܿ⺋躭^o[ށn,wOz-x-O[^- aⷮⷣ[Kv'J[n[/tq[-?#"_zopZ50-Lq[Z|_jչb/CLN;]Eڷoro*[ж?`B޻ ˨p[/ດuZˬо5[8[EoF -WX]B?@[o_oW-Wo[Xf~[pg~~8-Z9%l[[+[P P-!b(.]z\bx-7ܮɖq]8.տ+XdUkv=WUy-Xr<ܞ v-[]J|V hອ[ cn[į2uu[p[֮z-[j~q[]v[m]n|'P-8V?ݻc]Wgo?]}-x kx!u=Wg[.hz-x|nloZҷ-M[ƭxg]G~.+|+W\5od%lyr7Ǘ=CXu}WnnBܹm[j]gW].PMh=nϪꕷp+ݏ]_P;9:~8孏]u]ET/u_oX+ {W_l뮡_NN_[]g[ގo|~zxoH|VuG8WoMWV a~׮8.݃涷ݷܭy0oXp]P|_ɠ[ -7Z{ພn;+o@"aoߎ&z-⴯]u]quWT/u]Vڿl]G]G-WT-_~_u -zOoԏ%[8oO9ˮ3[ŭ井xj[q+SS_z]v.[Kv r-]w5j:VWXpXru<6lNܱ]U[W[7.K|Vpɼղz.+|ſ`XW[{9ʲ4Ш\<ٔ'S9SshM̗TaĺعZRJό@[m0 yohXQiT,ZI5&ZjGze=C 6Hؙj2C{ ]}PxeF:"U7ةE )p-.+S3?^qD[ai+HkXXy'\D#*Jp͢Jc4)ҹEg * ]˔gV-9؝m`E[nRiAN#iXvViL7ojiݪkp]7Z)#=9{" -gICuEcp\` \|B1cbnlD!e A`ed3?uygCnYkFִ ; ^&Aը̪m`9T01T7א DAMeiJmMhs-!;GsbQM|PeT6H U,\mMb%)׃en7* Mا/d1+nRmc6Z̷\uKǒQi:Mڅļ|ӤSdyۛB } pZj_im%ԲҦw'R `Y`H`d-&0"pX1lsm }k Zn!%{,`e^LcG6'\q+Vi_mZT,]E9 =5%nZZG9jV3g{Gޭx'U_PqpZG>˳pP# p SeZ]qģp.!andY֍GahUʋ gLh+*Zq$YsbiSs3˄2T9 -Vx%` ZPgW5KpMΒ{1Zh 3PMژL 7*mq  dOv(G#8JxUZzp= QΉُ[7ͥ -Bac*:չ"G7}ίk 5kfUM}iw3Zyh-ɣT\o'i?Tp }-}. ŷuNp -[k WsMR{lIfA#tA]ZLM$-[pE-;U0K0+[V lM8k&6Eh!،Ȝ[{6Cyn?⠅{M|<'g1X t.Gỵ-s]5\ǎ g !klǛ-# ڼ5I/]pDP 5t5j:a>Ӗ[p[rRC8M7jݞ 5l t }q^z8x-N9a toZwpG.:G-5# Mj5i ݽ ySd$rE>k7_oEaw+rƸgQǒ❚iJ6ZW/U|ϢGir[霤;zUX}VsRqtD`GfMlhUoz4-ZYuq;XgWQ;FNo(_Ry4|ӄuâ0UZ=֎c_޳ݩ3Z=7{!@ڽMni{|u*NNblO_ވA=4mT 8ۓNSuڴ 6tG,D! 2D]rvMȹ:ɉL:\ -ςт`2;SAPlm n|BҧP,xքa -n$.4٩:ilU^!i -!8k#ѲD:Pͳũ7&fܛ.n8`|Bδubޘ,Tp֚-Ort&ٲC7Pdl95&̞?pQUUࣝŬ9E F7T@m \ :[PYyL26'5鸁BJo wq}3:K-{J6Lw n:*wjSQZ8or}2d1:4hOXӉZE$KZ6ܮc4\_+1BENC$Ų<' 5D24ʧff -m:NN'E FC6*nc[ehrtB76j5Ąb(cOrut/FՑh;#FnSk闾.F'"m7*U|w -6ڌSNc,jC{dFךަf]]fDO7ݷOyrǘq'/zn!u>ha|ܳTYhFKSdݕ8.n 幍diVsy&t{B*'Res=-np[<44hO_-5ٔ|Dx85 >]-9[[`2L5҆yx j,(-mkP Z~6oEp^M|eB#&>Bq97nU9$~hdx&1SQbޕ+_'ٵܮ<wmo"`+vܛՀ|9!;&-tͶ@Z\[.^̻氱>IדbBϠnJֈkK">H^.XXoo:N[毻ϘX.L"VZG C)fj0 -@y.!QMr>A_C.sC+AᓳØ.+X-MRiaɵWjUoڶ3y ИɮQuZXi?rVThVmiUy+N0+:ƣ-[2o=B޵ ݷ!uicՍ`_Rܷ|NXTr7Pcm?ArJ0ņ|Qru -{Cnm')dشPG5ОZ5"H{_:sJЋ3G -#Wǟd Ku̴[Fb^+kx@X/uɭ40x-ø- -]pm !!isy7';2vqWԪƶmx-XTawAF^6!smy5Դj{ &g57pZ\,p]&橻d@#2gp\fF*g]%h -4}'KSi09b)J .c<slXX5lt%R0%4 FJiqeF1P,,ޘ* -T42YR6ޯ{V-`HU-TrI(dB .>]ƥP|\r6 ̻c.r x&[xBEɷeh`? (9* 8'Av rlkb81 ICS !%oY Xr%Rˏٕ'{n)sΡE6 U -$äEBذke>M!tGJ$ƴXYmZjvu'}f`=AL&̘n$sjWOݲm:6\Lʛo)[JvorЁ=鹑pS,ӫ݄ͤk[[ !8OQ;x=?}hc_PJKzVWRѢ -lNLS˹b&5#,u`GoGToy_gN6Ո{ky/oj)!ˆMӸ-x.<iGEm3.Ž+Lھҥ*:G1e஋ ]Ehy.[F?wZQcV_8d+E00Ug]Qn[a.IҷɫSV|()ZQG)FQ#v#Nm( -AJxtlr%c@_kH&ypIڌ -Ͷ}iByڳ-Us4M@j6EN!J9ٽS_Qi|IV,V{V%-c#;UKR-ڵy{Kj͌ -M,Ky;Bѫfg.V:/j02XUt29bkeHuJ¶.-+N5+媉nEWT!9 |JOV ,jwhdڴޅ6z,6n(ļTi݂4+SY`j}UTk )fZ?Խv\lr"rC=AOza(2r̲HgA͒GjL̋1S.gJ?FPA1#hT`uC.C>͟)i -b2Ojj[F/{mHK*c0@1~F&a4ZnfF&aS亿L.-ba.N%UKiѻ6ӭbC` Tt٣j{Qz)k9R/ԅH.O4XtPELڔZHë  jS3ذǟj¶z\صطnXPUVԵXRi959bN} ;@CIW4envG8g0ߐg{P)?)uuQӵuTfcE*mPk.]ĭӸ*.x 8,*=ܝ]p_9Cǵ8SC7!p2n_lMq;?)c\d!M&Ҫ&@ X[eGU`^ϔ ˺>ilwNo)HOϳa{o)w+ -X7NຩS7S ! S9E;s!}3-ˤ*_ RH.+mJҞMҜH!e07 ``ƀ<>.Q:-4w0$)5n{\ӈYf)٣Mc(9[=ت89oVߚulo_öm6Ȫ$ _TWmGe竁tq^8u%QFNg+ mF'sUh0^x sf-Zn:GYD<Ssi @ TT3y+ϢM+Džoݻ;M"?i9>hr.. I ]>hy#}~q }Hr2;y-mt?n3*=]8S׵TYk`FKf|LO\gG(Oms]U'1BM)?bom MN&.m \I\:+:)Ou*{Ugլ5t;2 ;nJaôJַ`Ѩ!y=@Z$RPO"eDŭIjkANM*[k SD'5kC5fS8c ֩ݣڌ4 %4p&0N.UgiNB퓒KJ'ܪ6F7'~E< <*/b&fU-\2*<4ېMGreIrGltkT.<൩=׸}(qA֬D;d^;Ta&,yoj=Ş웗_^Qnvsikո;޵n<}_(,-٩5:WGU0lSz}%u(K]WIW$ywp-&{xdܿSͳcPoH}<׮|zܷV&AZj?px-x-oqZ~_y]! E󴴬>|WQ^8:nw&tn?dܿ"Ƞ%ZJ.T P[[r72@ *56l(8ɻ$ '-|~Ǵ p=Ò9ukLjL)oUcY{ܴ=}TZ\ѷ}U,{N3Ly=V;j,]z`!m aı&]e7O඿?^?%mN(k=lM!<4mYzjg6t*9tm3(m*NQtCõ¨Wg02[j/~+jN4GAR63E1}74xbF ki (FN\Nnb xpɜx:*Ђ &-X{,K,4.LK69EGsv䕹C7*FLb -q;3)ѐkRj99֊s5i'URAwV)B2Lm*<*2˚5*|)kJRq%k ܨ1u,ddBMl -3wA9i4#Z6va})SniݪMᴄ `~.(ja vL|[X֋T-*!1)ԟ ڍ)Pԟh K'>&%rUZp$ +jkv!:-U8M4*ݢs1wF} mlؘXHӫ''@rn ?4`?5F,ǚ%^f 7Z厵g -w+U\o_omWYCnMQ,M6AXp=Z.Pꡎ97/;8B8u6o4Z[ mx-e y9+thR <S.*m& -u;O/T2W){yDܾޝRV SS <8 kܻZK'A!S. cxD9/ati4yӴXޣ&pn]F{Vr\p+O t7ǂl>h8/rƒ-E|?-x.OE_g kjtո&Y5:0cǢrz.$cp -&|x+qCYUT3~Mj;(diUK-h73'Zgj~[*--K~oI͆:t4gQ9ls,S5 2nzt}Vlf(oZd[I~x#_ _#֭Up<3 W u."u&6qd'v:M/{bPq(CyT,rPLiU۩nJ\3ζPm.*ot%׳=lv½z/x?~UmwWPq[xmoۇ%Li=2nG{MzC:ce<SXw!61ds,*) cS-T`L...M-p`I1.;0G<89148JժMGh Gz?p) -7kC뺥Ԛcڠִ)8mo'وX=ܹ`t -BSTMcju?j8ҦET\lcq\sl W'}:TbЌfqT*@&#qC6r1u=W+bƞk֔"nObjx{)1đ?a_y' Nͮdpo3Rׂ0]#)t,w\#lۧ#ݕO4*@2 4Znbh0nL;c#K̸Leü&a*mpD dD?-[Ufq^D ׈3ŋ|!`6ܵqoDOGI;?$T95=;@qU{x\2>m.Yoml'RKD@~>Ck 0 MM]ލ*᭴D"$\U8A\\k\\tU2I\ג䫐;FJw**.TvCET(akSs}< {Eʵ?tYy*ٹrkpxglks`osG>`t+ޜMW nLx{R0FuΧ4O0w8/VwS}0F_!1:QT]qVBp+P), -{ctc3Oލ3w5B)CG q,.Pܿ\yxObvDoNe.ǘw:BZ( y̬QYF\Me D3j]cܾBm O.g1x*^*u WsW@ --;1sjP*W30bw(cJ&lz.1幚;MU@AV.b{&sp0\s6cgs5:3r:x, 9 77<9tr]-]\'-Bx13.TQ ]~į>LcPW:'acjn_u;1e+&&1YD*`fQg>{a̳qS0 rLT{S!)ވr\nxǘa1K8&jOp4Z^^::|26Ow xLL޸q. -2CI>cnAq\j|#/SK[7GZ ;=vNc XX&'z1ÿs`W穆=\ _3ԯsJsE'p&f癰7&qVgM֥n:&X{|ņq=Lq_LjoSqT̵z+!2c7bap}z-c鏂Z|E%+"s<3i32_L-F\t&{<7:: ˉAbtU}3!*?8 -&#|]C_O_OPwN߃7 33{d,%̌oda EY~\TIx.fF2įs UᖕW]H7*KA*-ZRd +.`Usq,"MB|CH~N4Ua"r_O[`>EZ;ܚ|W$yFBe߂zFMulv,f.HF%TvSK+U8898 xΞs_;t3o5Uc1YrfY&j{uq0$ zI3;%~& S׷Ezj"w_ɵn7) ^S }CY)kDE?3)\BhRp;UW7sb9φjBWPqf 'Qp3:Ծ;gBfm=W <}9&78J̮:@횎]usU:>Iw=MgC.GP8(ce=Fߗ;1`#+/>āIU~O^B<;v)\NqxvM^cWPeGp8cX:g3rOb_[3؉h?h@+,Pa$K m\K*`fp)`u;&1u/f*gIQII2 )9Wt))e)/pZ|0Fɼ od>E#V7-բN(4AbKqָ1ܭL13QM%,hxs=1t!Rَ"ঈ1Dkbk,j3&j3u$̰3 -q:*:Ř.|m%dezfY;J [<%:JI!LPru,qZ ChxjePHh*-@C+H3t0B YT9ΠB3q3Iny 9 㪎0O4xY^LK2E sCu;"qڒljN s!;8~.tBU H5ωE("6oDDeMΥ 0ZB,̤f_RqQ t9/̫ڠDZ8j>-_L -ļ|<̝XX*5y -N$ R/S& j.Q.TppyWћψ&|w0X? 񊝐eyx:YYz^T.7:1U,c\;Y$]ׅgLRZLdнa槂Tb&HtL(pncAƣWLK rF$zLbg'p߄Ou4[bnw,M CBfg蟝9jOՓIK -qÊyļNPFu=Fs/5<1Ǐy8_\Odˋ3Xgw-ܼTψzɨK#f'XnT&ZV- -G9!A$zIz=dhW08^VDh\@ښ>Ilj1b(a(FzW5 - s.l?cq Z#G_'mc/-)L̇OD <\,V5؟|rZXp .#,I5YTk%frdKc,j#g2J&2-B[=[;犅NqVf._^ O0*A/\rӉ 7A49!/4K`/HdC&m`a$e5]9[0H' -,ȯ^_˝c1c$WpT1 &3^; -j^8=q3e;8'&s/S7d>gWa\̇]GF'PaU:O"m 'ciz w;ZPgp[y`E`b4ijBAU,M.fV#ad  2hy*?Hz:z`!b|WOc:5 $V317Yf!;gv6&QOZwxPo3bO=9⌳ǘ Kp.66<'1ozO!'dG*S/x1نK%=]֥.c4 *,neW&~I4g+TP~I!>9fŎвB -Y=\MO7tO&>йY-fgKcWvs>=;(J"TG*Jsa jjff|tOgK6F+f`C7r_PMKGqe꥖\L[2>ne4xB -&Q-}C>P(V Qq%ER1/@qyJw/-2ԭ -.*gP,Lf`bgs7 bf&*^~rN A72CsCfcDsEC6*H3 cAw&@s?l2WUlӉyeG*{Y *i/q?L8~իGccyqUļu+q~Pe2D:aQCrM0.-Q3]V9ьX~2A2mc!k;:(glrftbx;ԣ{QA̘,Rdl|[~|2O7glPm_ߌqF?,/WTPm}CU|7`ЗUQ}bucOf#^Y~rCX l Q;ZRV3!w|𩧃pEZwc~ҡ+L=37˝k2m\3ygQNzU1ZJ[_)zwhEX 1 rh?G.|4AJ.uVBgl Vά_߀`aS*l+ig"V/\!uLh*VLIjk$$0wɿ7K\'r3nPv>—[ȸ'ݩ)/)kjaogm}u/b@8y3%P/w*o5,ĭ}:x(*l1 [ nw;*/ -s@09(m(8 h‰-fF̮r|iu?".yu9|(ao3qm5[ -a%Z5oP ,T_!($YƢ@"B:!,6жT1|ܩa|Lڤ9[`䟈MK-'&(~6`r,FA =e,iH>ORmD&eO|QM£fkIJb:px Gy+b%|.83j_#kEJыɤ+; bD\KIc 7ddЌ;18YΦa}yqia |N13SeO[8pqL\DLJ:b7 {^x+<1Uzȃ4v$b/~\y/MrfsR\s.PTV!&fJ(<(/p*DZX9aߘӹȃY=mMefU*٩1θD'=xtܿя0) ̼Jr) 05烃o<~/Wwˮ:*$gI}1W۟a$1#=bJpʾ6_!f3>apj( Z8a"Mx5>WqFxbJ+38;&9|& ^7S{^15XGfe=OBٌFԈSiՙ GyY!Ϋ W+R/>f{,:!ዌ1Fy4{fĺœ㏈1;Bwd~g1z}ñP/si<\FƨoZ:][>XC,}ra,~<$v(h<=B0BfGtr}0 -V%{n%[NX߄\ oRd7˖U:sk0Yc'O<P% $P1USS|sca ?N>x'UWqˆUq<:Ĭ@B; -A>53f`feq-Ĭ穂V*9 =b]1e]T௢>ϙCpA Y:wo b'9\p2;)xYZff e;E7,0a},)(ޡ& L2"AಮtqrGrl̓ No0#, 0/pMqL-xVAFNWr7c+<}Fm>BF9Ttzu[²+#WQ]Q<EaTƫXZEޅSwU37o:|*bFsl ⊶{UwXY̆%ghZ[\!KJ1_ +d3f*s%ÁÙ3FQ[U#Q(J궮f(*u٫vp`*XW]5xn#ٗ!*,,1"ͅ=qP`.oY%hXT`YwTh7å2N2'>p( x8Q!7xh\4~2GVs m20LxI*e)mKVn5c K Wc`gvHc\ aLL&>3nq 1rS4PAT+ \njNS,*w2c*Ccp e(K28YX*b -^^QZ.a0(_B -s30!V4D(bi L -E\ J8P+-y/3ܼpW4UBPVp&4ʸ^J%@Z6D(mV7;" :ķ -H&B I}77M\"Jb[XǛ)䋍3:o-59^4N`ftL :澪TN> z  ̦- &AʀJ871,oc4gcx:8 -8`JNXn3>gO?Î+|O+,1>sgv0_7H@u ElD1:0bx!OG;IlT/Qs|]idvzڢzV^?y?)uvc`5]ONo,Dlj1븺s}pǯ㧌\x&ys9u*O|2:)StF1_I^ҥ2"ٔ"Rh")E--;9٥gGɟcccN=r(};Q>'\cu}Gן?[1foˢ/jˀh&bD]S+3 -Qr6cٗr,y\˧rw b 색d\%࿥?GS>biygS?W|aseVb*[lT'dt(V0ypOu2УJ7,\<`Ja`i xngI7T=SKX[f&v_gMf)/g)cuѨ{gt8]?\-ٞZ#ɇ -v ̳jOj~!K[/(> >r=vf|06($yɶ_&(v?xl_gU#]~D}w6 U`O+ vUY;?ęJc%`aD:3sIT=q&{8wJ0F)x~ɇLQݩ 7-LϻgqEժƽee+Dx6f*%x|(,戸KFۨBŐ|0C>4([OGSdx;Gk -s Uw#7_5sq*oA{8y;܋3p'Zc]=pP jمe -ʀ75zT4.=>H7Ī -*UV -!aWžDvؗ..nd ZoFh@Ue^儻5@?17Q?)yJr <Tw;s<}wpy8Sp5ʄiA/]K0'H=ƢHj-*.CRcCrK< -"\X!_Kd"Be8/]\EbFלB±}u*bQc"B3 ,[c&#ȅf,e -XjSk2MƵ Qc_Z^jR^%R;JtyiL:⧹S:gG\ wxx!8x_$Ґ~8|CPrV?Na h4FžUbEOGQ})\;Iw+\ opd*f~w_ l/e #_G8@} -c,"}#Fw8\꿫'rQᙙ\?pqw3_w[X;͙5k rkn1l#3jJf yyv>' 2`DY Co -dªi01riG@&e)1)솹gQ3ǎkdS_E3Ԭ?^z qr,c3ӪCMA1nwJ e K% (0HE'd|G,*Xq gi"PCS3+_AsFxw&s+뿮+l Vqb3䙿_F81ν' -LLϘo뷎e.c/gX8a[ \/8yCfNNoKԻuo9O?C1.W3 d;fܽK/0g_"z͏sS]e¸<<WpgXC8& TA/|RS318`Zx.e ,+. 2n*ș[Fe)7}vual)a-L2.|W5 E]"0Hs5ӥ߹*WsMOoBgN!g|j31\sq+Ibfy㿯}G'G|7 |s'\nnWћsۏbrA,p@2(QEG\xߒ|r2AX8Ĭ/! }d_#p &;=\[f @4Pp' 0ᗫ%DeS23AT[P{˫\Rф,&(3wX*-乬a1cX_q -EW>X"N?pnwx<_R;T$I6Z,oFTnj"1tTƻcO0d1\<#8.g{9֘3$nkl&e?^m+kf_$ٴ2e)O1O2&<5yO0kA5~%sGx=J2"#W:,f2(EA1ujHJ pO"1Y«Z 6 -qPKusU>3.fHqy>.?e̠W욥[.?f~K>Y~Y b.ަ3]NU̯ a W)]p6~o'|&bz;M>qehL#[cYy@/HxVWJ%r(jj? -@f,;"_D<_j,ncҧ1+H(jPO!'B4N!l؛BŲ>cB2B)c H}˿`Fn.HIs6x1*@`_Hv1L|dArb)7:Ej'"?f!OWPH FC) ւ획eOŧ-USw}!3>AP$ZGVK6B^ }(b B'O࿣p5×3LIx1(58xza/'ϋ9/\\ 8entLg âbc3|b_-aξo!qs q|Թs\bx8G*QDT,D=|,cMFm(\5Zj^z13CLălpKӆEa%Ƈib2+'A -+¼;ܵ$ GQ(N+Ҷ㙆.gWYNm_U0\eP?% -S)'xc .-I%쀥!0KS;OzJ(Ors{1N"QTx P-UEy膁+2^?O<\g1P\!\]pE:5pX}o,00qɈC'9qY<^C ;k/.{;\/&)C^^/ -H?Gd>8T1/\R);K+k`ar̼C1Xŗ-wKb<͌ X j_G֡?eINvpYu[a> ɒQ1D[d -D.#V_QE*-C(f~!{b֣Ja3R:.*fMQUuS;bO5EE{>KWB5#ԭŤ>̠An1ѵm->mG%w$q{E}:0Bh vE]+uᖤ 7 '숲;:,k[潡P.p(ױy.Y2a5gjc6g yo!x~)zIw5uÜtJZ9FV&r2ԗh(0. R.+_FrBvя4~[!p"/}8N* +TEUV-q>W>0S)Ub.*g٬=D!D!?V '>a1QGqk"Jjbª;XVF9-\FV>)Gڋw5E'c0}XтyS򂞹BvL},bax^/ǟ8\W_POsz& lY> ɶ聫z]g#gl-Q'cU-ji01XA P˚[>Ѝ/n'ħ EA=W%'D +̨_2#KГ 22S+(J ?žYZf ccoI`%\Ӫ 6~{'M:n[6E#x+oMs1OuO<CQ@%7PFѣs_̨Z bYYB%`OֹvC+ܹ~Ykl0C\x|7\ eK .^N>%53x NSW R#cYb:Ow/d<2"خjV0WX@@ WQbpp yƝD@RR(‚k Jyn+x>ᙾs Pp$Xm -Xb3[\h58.M +TfRF8-3(f1Cf%舲AJcQ<@]n*9,gT  i71%@(;Rɛ1t7!DtVӬ#P,*$oF-pa9}= &_7fgTԷ08#dYBf6@!3?$@}CEDV"b YZoQq!.Rx G nOC-=2 pEqlTnM-pcOF4v -ā= W0 u(<̌†? MB)Hu2fzWhn-ŰG Orį{VݱbcROAz5x߉QLVRX(%9C@N f\.Ili]3 -zzQ֛i.Ķ#ϱനy,w"v_s7qb5 lOWߝxx;g}R\dvu38iDWINEј>XD*pA(9!W댾 ʌv&"l3+C$3TFO|垤UۏTuЋqrHe̦;GT*4Oe0+(,־a x ]/8 \dsANɀD @^9||/)>{`D"&` FKB_pABŝB%_lgOn|S5y,C|?XN-0R5F'Ak4&#-IZ<Rm"%C4W*)yO~:q>*EȚeA@QJl; 5kS62PɁuTLķG;:㪗|qQ }XL}1GSMsmeAV -lX]#6G# sD1-_ǎ^')zG61sz>&D0`ۘjTp -$zXe5R@kVmYi`zfYRsqU׆;wpLrSL\˕v!Kte;lPU5}#7բ!WjJ=\ 7:1*\zO|}Wћ8>y8>s d!vh1||F54Q:CT{Sk;BCɩ{UŐR%3_=Q@9{2$nn6) 5D?e`YP\W2D+#50WA -$sd`VfXKv1 -$jG،[,aD?Ax`~$1 &~6j*cw?sΧu>yO|a1C[*cC,$s5 NTn`S,v/zN|}o~yebbK -wP4R ;// MS4 #p8_0h"܃%ܳ4Dm -^[_[Ex?*=dwØ (YE.o_K_u(9c6@^w+XuoW`1AWIH]^V跣ǩA1>ezAsllN>\cPLSZ.\SW.Ur>3 -UW -ƞ㸳º~6L!T˙PVl -iբGKt)v`|a(M~Pm ,OXՒd,K0j 8%W/%]F2i HSQDD"2eM1*M3)FŀI HE]V8]k` R; Xq3(e #l\aU}ˁ"EmDr\VpIecHewˏ2d -HBQ2L2} xIL,$a J꺇\C20% $k81#S]7$f"W1H |AXĠ6tAI /2^c,M0B"mhCmDOJZҌTR2鯽#CY #8+֔ވ|!q]y}Egq㿣?F%38x@M]03zg沪|ҠN9>$bCy2T}uL}\!>b PC6S9)Sh)&_,=1r2d# bO I1ÐύQ>ez CѾΊW G2)uZ56>`Z1^ߵc' .9G_4Lh;Kr;jgNh'ѻX+V'(=V1@;̆J`y&hC^˩~7OKI2 (yrs#> -gMXԁsmÇ螊ྂ~0e qP -gو,Z#pp/bwuưr[^[JP -훥 ?,~'oŰ$qJQa& ?,jw%Ƙ'ј5ܩW -(APD;VgOόQ*owkMF!=F,l+wdac[aoJ0EOF Ve&/DS [n&>L=Ҹ6=#', Y_,wF9;z㵋J  +#(V#,?v>+~ee0B!ՠ`!K14vvڰ3_+!(.An1pm& =zOnU%-ƄAeGhCH2h@AE aAB/~c?6Ri`7AYeA3Qy): @b4,~TLO D@>TID:O4CC|A\=qr}()Oa(M1ͿɆ*tÄ}b:.TYhX VU>!DkdDGjp9%Ul^~/bJ^)>I@qV"hct(0]1~EFTgHvDR-}/=⡪怄95nK+Nkr>%0Pfw(9R!eF&8^C`wJOi%K10p ?rּexbqyhEAdF[12Ec-6d7ȩ@.zfX/1faS,Ll87}wL.gJ>o蒿 jBx!PA,K9Yߒܳo0*f|Tma[ /Ç(c>j`d`Dٌ,]QAN)%LDtJ? E`3bve,3*AEFfWe!P&1jnģbdJ'܂xqGdm -KGX _,'D7MG.%F CDf\2ՌpKr/ -K3ԮV˗ qaA/8P+^n:Kw - `{8qQxNbyq0<bbJc$!{PrhwW*'.'M) .$:'ũjhXԴFJ\(S pa- e_Y\F2 % WjY1HߋS}e/ A ̾K1,.00xc>}G7a!DǑT[ @>D%D pјa1['`)µ~rD…bx[EpG1IFC/h -4QG.qƔ.g 6[HP䝥J"/-.C:bmq˰RڬFSԯQfeCp [E̶{ x/0j`R'DC N^-LpO O6ϔ-Ȍi[yatEBLNxX1I%RSÌ\Yo;_`E ⤑`S8x~Ϙ$ "(w $HD"O\R~L/ந$ճrJ*ID"A2z罣5O -ఉM S/Ī-!FX ezc0 1%bj3JhbX.FVW5G؋I%uѓ@XSg.u'&?s`lŌ;0+p"#L &LY- *ofT3gg#g/H9^XX lW -M)y¢gB09BUae2LFFt儺RH F&u0xN>yza11ȹ7 -Yl=@ 9bKEO!CF x*jVR ?$ u_#NKFC dKk0'rn"#nuBp6<~ȕOْ3ᙧsjw+!$Wo -mrQ:F4Le!/r8 -)]yfo)05]B6W30o${xzQ4]` -  _ -١M1U{o}\m+mbvjn8Q+@ iDva" E9%(ġY|7! ,8+@85qcصYFgkTFP1ytWjxa߫p4xmv@ky X3*!hr23 -bQ%~FԊ2f4?ߣ -fR,%r"c!cLC:bXjo)dYsQ|p,LHp8q¦tx[6#.ƺ#|-@fy!y&'S뎳uR0RG-(3P6T!e!E\A.׈PA. 7u NVqWj14RR)&DIX\-E-UT#qm9PuoњoֱHS9Rz[C$09!( ܕL+pKBߙKH)WJv/_ה_Xx,b"3]jKysLWz$yx3〿b!\eBll}x:gMLʈ81EpkR/!=awV7301oɏ?;m7LLМ!塖KA -bj03g@RAP./h %>Z?&VetXz, s/6ZZ#XfQAwGkpt^`zrE0*# wiO)u~vbD`#f)sG g`?Pj׾$Sr3}e󹛘qqD19ǭEɩp>e_r`_ -RMWE zʚ=~ M`0 )~N%ؚ-ȴ%f,"dGGqsƛpNC)yu|ښxcQk G05|̋bAqӐ!lOfU36Kގ8HH#lߒe&j&['E@+Bxx4ʆ :&p`LJfhX _@ok+M67eaq2D4FN)#Gr2%`l~st~Q!TP7}cN("@prR*,f*@JQ_1V t0GRኹQ†x;M1#,GGG ^q UL?~{'LvP4yb*~\~BVUK+eu1;%O9TQwjbftJMMpB/^a׈G5 fWP3t^I>ʈY?FW@-QyLԣ$ 3ycn*ķ0ੰ"N{)Z:gp -0@6ƒ &HE䥣ЊO 5aL3u.OoB *AZT;ZD͡˚Ykr5W^ &WU ea~ ,.27hQ=e3 h %y scO\1EeZE#X"J9+<^31u|x>xO/r|xBQp8 w6<Ԭ]c2bj.%ˊ n'R}Ư9IGA2Y,CZ13rC -j5K̲,e*P&ILE@ L - \{%a` &pJ0Li;sAyB@9A0p"DyO,'Zfd=1Z>Qa.1q\k3ϼ7/RFܥ̿p0NWP `1 aC ^iҙ@Y#Q7ZƵ&Ha0"h V/P4 Aĥr-AB.*˘EDA6'0 n#N`ͪ^ -0AвS)2 j} jJ8{%Db2޸ w xU)Q\tR:jEa&+0etB4Fn(넲.^uc"CHzs _p 𸻇\#hj7dQ+^hn50+04K<9n؏;;$Tjl3xJ[j+La1Bq,2Yψ=䡵2vDxEhAucĸ(;!,}$(5@ -Jp^Q < $>ְ 4(\A.<8+*X/)b;C' % AF$\'{} O q%2:xljIe9~K@4Tl(fŠ~jh)]ؘGt-Df! Ca^dNEgsCj{jSR#掅0o±Jp`UpeC*.4+06q72 bՂU2;LUPcީ4P7P¿&߀+nkL}4]RP*aζ( a/RS<-_!ZfTBnsn;)bB/^k^=YW+=7YØN -"E̾SAuo -{iSH0xK_65AX?-uraI@Bb,EPetet3z8&QZqc"EXϾGaU|Sxq6aPEЫf @f 4 -7Ěfjn%jU3=L.S1d %m^R@|&ClϖNp[)" î+<l]=PF (;{ *_,b6MƢ6MVO*NVA^0$2*$pwaL2XߜBӘmA~1Y^ch mZF`G[bG@K.afk=Fc.ybT2e:v*w2e2 KMBEK)(3֓q6FoU션sS19玥p_M?U0.J>lE_̾zŘ1(|Gm#ؾz -AM20.hǡrb:I{T4v5<}2G耽MyvpDzFc܀LeX7!_Ed%.ZXvWdc sd# VWe1XV֢_ #l - Km9QA6;TRƕR_Hp"2<OD cSSkmGnԓ%A~扁| -3oFxŊQ%ḑG *2 ' z &jf,Ź2/ YՙR,.7`5k51̓3.aǸfI^UKgPxN%pJ{! />f='>`n3.=w6H[[]X]P r' .6l(-^* F -69SXI- i4:[U4b/WPfE h"-n!  -Λ,õe QmqנMLr>)YB -/[|4` Q -#(r`ALkUS P M| NwL2ܫ! -$E`J-ki1)KDFk= MC*6UVS\F8\&gɜphm5Mb5aqDs^WVmuuLB4 Cp|!ٖ#)聀ĸY@Z6G -܇ - -u,5\55@@ 0>*Ԫ\2up3>3M6EC3bK E!I+uLX,8Y@{gB+&+b&|R2ZL@֦xbfJ2^y̷8  ϙg|T.e*qga;T.-/z= Έ 9-K-u0>Ɉ"df&(ځ\C>J$qcvo%6Rt.^tiȤ.mNlEk+19H?dKFjoMma~ET,Rj1)BԕJf)"Gb ~YY%~ R* b¨7`zp/pgQ 舋+ Gq=JYg\ _xca9<7b&azc 7ҡ-)C7Vnlu7.;j5P@D gThfY!q15 =dGKsO`P}E.rvP"SACQIXq "6!4e?c. (/{glʗp)u "Ve O ;1Wfc1PpeT+TǞ{̨Qy}1Bw rf;z8&Y\k!)%:B}؞Ou3N%W N}u -q`~ˌv& w7oNYL( ]NѰLUM9Uuaia$ [Q49U~) -0]O* XN #9HWSo]yWUOp gʄ ń!T'u2^ aDRK3f>ȵR: l%OQQj̧0%Y#5F/d1L }wH`JU}}J*T) Q(b}RlE7\XZ'Er"Z[c1k;fu#O|e,D[ awKKd-Nd%|My?A>.\qf80KK<L>! #/# n\|<8L==ՌV:)c&K-/A.f6Z *p`qW6+z^' ˨)0jcw1;BK3`Ƥ[VVR5*Me+< %\.5R$QY^B^:cǑS'lbMw6h%H#Lq pSt^A;FB$A0xbڵ=C(K6&ĚZTC`$^+P )n5 -LTfK+VRDQ<3$&t˗)]3$ǒ1(ڳ%xgp4Yu7D;lsTω] BrGT7[| B?_?S-,ыdZ-όK&3R.m!]i5dgGW.G)REิݚ.rn'N['vYSlqEw:8>=p MbEFPgj`\BCb+~t7zD۪zD6 ~9kh^ Po7.b3Ly_gK1GB l%$)ߘg'fxjxqqNprA({L;e^L<+xB)Ņ(rXeqSL+ УuEi5RD&tDB%jR%teÙBen TŐ'Dg`A0|h33fk( -ED4@z[=c//N;<>iVzӨj2׋0W#[RL? .3/&*@Vwea˽GU_Fia D?qɄ4_g%th.Tʳ7d9$#g -(A]G VՌ;+HvRGLE?Ѭ"J&v-).9l):0;~ L\k5<1T=W /8 OAI]m@HM}0Z? i5BQ;39_qU}4xklK]1Xt+lXO^Ƭ(`UF! AH@<¥EǠWΒSRjZ)Qr%&10+QЈ;XZ剰qlBX3[dxDeG̮+Kxs<8|3+ZEXv5vCkq|~iE -Y$L 0 IL6H]\Hj.XmV%o4N3' YF^U -\AaѩA./D -s erۂb`P 0G"IYK1'i "ʋ86$.p|!!PYE1%JdFū(bYA,@|bNᏣLT!B^ % dVAXT^̢E,7l?s/x(NT'Iġr( s:^4Mj&r@ qw)e^ *ˈ J\̻vQ=AXn̹C3R08/pki2+C4*@-rC.xTkBkDw*Y[  ]"& -ٸw9= ZqO}f-ωP~,ijcU3c !?OR2wGhβѳ+KPp[: =1K(z fi11l`&0V5qt*n⾎yk3^l>gSn<aj}/@kƊ>v1@~s!Vy;̓,m&1+DZ|Ca,eO"$`3hWEXQJw0 7cnT}RASAr/J7ֲ\}%Y9Ձʏh:ΨB~VL}v yKϒhe_ =u̾\p1yYc0: ( B(`>3k2 =q zgG\y>N3;qǹ3gSP;' Qg҉ūOwbe nMB,SFM~tCY_(74hiM¿l9ahl ŕibjuo^To](1HCp%߸F;/? IB,О3Obo-)+1&:#k㗑_py#~|=}&`boz`8._"A8 _$>+*@; -ɭu Kq¬*[`CMJlYt? oFfse~Uk $AV L]uxh ڲH3LE2zI@#<>U̓ kGNWŘty @<,>&?Z;09u. PIU^YL*I(>0}*,a1;a7LVn{Ų[sPq|:^pA}x@Qzd6]E- aBQy3Sbr_wBk+!,RdBүHzaV?k dAe{5|Oʉҁ?/7,$7V 9H‰psv\%/v#ˍ@¯_:1*=AhrF,62U¥"j$, x`$"Qj W2o8h#Lg1 /FY?I}Lq#Ӻq] Բ PZU| A`ze - HpIE۫&uY3qwC1@(m f*RU U^x gB1le艓X* IjEDT*QHq?ctj^A]O㾐UhO~Qy_g| D%bҝ' ^X[ńT}NoB96q m?X6Xv$̪_"BODr0+.ب=2\|SW_,/ _?S]6NfU튪Y~^;O Z'"E{\]Pp0 ]RJ%eaB- `*ǩQ>01:w>-)(D!|E8J]B}R0)ffBMduX彏A.) DtyI2L+Smӂ@DaRUF8'˟ð 1Dkh35O %{N -B$!OqH`01eg͑ܽ\ÜDk -t~i Ӑ.Q6L6{5+xSV -pC!,j@\vĘu l#E|BMs2 -픫Ꮅ+{H=`@ -A%'SW,u5Ҙ1%F3l8I\A͡d)h9^2c#~0$=1:]M9!`13s0 wqCP,2pdS^|wru\+OL -C~I]"IYˈއF Y(h Pnkڅ9˖+̪l[(1HH&D CJ([( ~a&p[J%ͫEt`bZcLL'}@XbG™k-eS-W#1xO^/{Bgy?KqT}fRnp Sw ?J)r>%5( - -ϳʀ2<$~N*]pKߪ-cGa!ڟI|>-C -  ~-_4kBOH -z Q1znG8J!W'6gl:~"=Ed/qhv$2/T nH' A{\ 2_?a~!Jb\Eo=gz3jw;8\ p\}0!ǜK>K}*ܦ0f" 7!`!+L%R__L*T}Z6[<Q=@"13Bå5<X c3*4}vXh<ӏ wv^8!I+f5j(+3w+h1M$0jE 1>T#MX.^.sZ ,t"ЅyJl3ȪpoeãVx&2æ]hs7aԩl1Ժup烃K=!a/w+b ľE+z.\n\EJY/pBX5:%^e!5=L\,J 86]O3C|bx|w>иC- e.fKtA1v'mY(d. ?&j -`?52țdE"y+1XA`\HMC љa0+YHqzf8$` hAkD:h\O >HE C p<P;ܬN F + a.!2vCP`ۢZ; YXa`r) ZmT1 RtMNju>ч=utJPWVY2jp͌V7 eHH 2|%ؐ=6mD2J]2$3a"| -0&L>p̤@iM -6\DRC1ܫ/BV^RJF= ɉoC ]TRAE@X@ Nlg 650;w1)(m" 2bT?%CP4TN F#-F}@6%Ws X%HVWJlƝ|xDqJ\?Ҙ@wA5 ,~ZXzE~>Pϭi@QJ;@Z#\c -pUfn(-')fQcLMF`9+2tq9e@}1Xў(w!w/eiYGa%j4͉7B-n*hP3qZrSQ_i4,sdd]NPC>+>H8O.p<(6p4<).9K|tCxV)ߖ7<;CJ/3#D+X ^!k ( ?,4~ᇹdu^8 u,ta_,{qĵ*comz[X~sbCzX]3ЭF]2#_lT+ -ɩT# bB G! b` -gLa0;|>Rm"yj``?r]G+Օ̘<+ eOhUhke1!t mN@S=O,0(8t fs :ݨT%weL5F4q5T؈<W߄jmYFj=]F -㕍# -9?(dd |z(96*H'Tpn3 -z>[)NT:]\2SF<`hQBYf;["5>7 3 \0t"ZJ0e-)@J,2oH0-0Siމ*>S+!0*-гx%fPp䔸e C镏ﵐ=!BވB[ݡFvAxn Gv֢>`0ڼRD`u'a4w0 ٖx܍sC ϑ^a L̈́* ,ȋ3>JCe ,dD-Z竅cBbqQ_Qp/򒀣ەpQ.+ޥfCecyٽ_dwY#>_i<⡕L@/w{+/Q%),xf5kU92@v@bmfc/@ꇗ -5:Y5r9X=N~"xsr Ǩ,_1B]50Lg$i34Ob>yרA.bf&`sLN3D+$1f -q1|}U6ή(=J_Ja)$OP\6M6ZIɦ|TjbV*^|V!\w}TĬy5eQC p=VrJˢ \2-cVBEJZޕ>xF2cb°,^d"c* 2ZqHVw*A`CEH@QkĢN`ss9/’@OŨ+7AY@\;#j'@͹wPp\,mC|\j_ XfYMC 0H@u.mN;3:|WN pX_*kV0|wXNX]!i%vL57:6BTa{Ab#|F@6^}"Ƒl)iG`h_˩eG.V*6|伻lRW -O B+h>me%G &"V $jFj5)XD=jhꡉ6uFwȳw3Ji u L3J^>ҡUqOO]q%EcUrT̈́_A|\#(fkQWpG #&y",\ ]VD1{x *ߺ_g:LGU_b`F~IRǘ7`O|Bmj, d6['/1oop,;C`rd!D cŃ\i4~kӧu%_Ty&eL3E˙aèǩÌg>p,8S%Fm5):xG*4Ї*T5Q P,L0C)WOqiPœLԻvX.!S& Qhn'C\Y# +C&F _D3[(GLG=B3gbYGulgBu(,8-iv AOvbC]z7{֧Q!!7Q:bHb9b!읂P',m# -nP\OO1!!mP\@eFmWX+mΟ• D )7v2jwah0[Su^.Xϼ dǙGc0iDJdA C`"lJ@(L$UfH-K`UuO V`>4` EDS0ݍM =+j aD#Ŋ}"ŕM M&jй/JHj za㌀cAP9†f2Cd.(XY ⑖:F[=1Swdѝ%^#!8'r\~q)މُy+ptq;k(ZՍ\30x \bXLaf]o - a*V g &K7a6^G͕K5"[/1Mʚln!7(+ qrj$.ʛ%iYpa!Y@ pTTB@8 w(0n;iDr|3,Ԥy:\pK dirIS.^;i% Z;4z h'Tr0"i8;>X?hֹ]p3nTxźD^)!bbAPoW8"D: -6dy>\ ld3E 0Aec5śgN71xXٙixTqjrau]1g<=d0嘨͉#vƓ)SR[4(V`Jw{֤[-px:F!.zao|& bAb2VGm˝=:T "kQBSmo,+^}K䂷/; ' -b:@ͿC#5^pv+tx=K y:`ȁ%Z+b\z3<1 [DŒy1a`ך?i͖D*~Ah.Xr p6Z3y{F:PοZD=߯0+OQ~x9W*Xq;w3W jk+:&S 9?&G21]fҖͱ_9Jt2‘LيL|&dyw#|qib2z];!,ܑ E3Ir8d?a[uǕTxVn/\9*:Cve_Ch,xn]H4 -5q`l5&m`_ePQ 2y90kld@t`:Z8/%~$%0%,$Xta*wbUK+1 S-#W/1X؍z [K*Ffs 8/A5e6u&°x^[W|ǁ+qݲ2!aڰ`+0]U8xz*{C],u.]Evݪ>A gD808 &֋H='%Y;،N$B!Q%"!-&Yy-xix4J %3QJ(.K_mA X }$*6 M,|C*3vYtRElPV$%˥Ə\X22C 60Etk *bVP*jW {O4|JUe -lFHX@OtKтvͫ\8c{/De[_B˸NL6QGw2 O܆kfW^$0*jg1bV1V*o;"0XyX5#ma PсQ0)!V"df 4I&`mpZp/(@C XAFn ^W,-S .M qpL ~yCieD15*]U3SYv̮s1rKR 8^Eu$ g|B"CC8>X(2 #|Y_̠-UOr8LK^WPu,gKdž00Y-J@Yz hbW 1KAUS̝>ɂv1ʘ[!Hbda -Z"Ę} %^Q+RL'Td(J@*>%|)h®p`Ji?v -{ &?E_,0 9v@>ƎN*UZ8}3fsd+Np`rtJHIu f\PqLopljw{l,A2êij$>b^AȈ%(|&? (٠t'# |2Il6.)tl?WiG+. -T0ڼ•ƋC"'fV3<6`!@:7'\|+/y11>'Y~b dfmmX5i:Unc~}=ab< |n7:BV=Q3QʘIL;uwPK=*x*`pnP1<0u7ǒd!wd YD.{52LÒB0wz?\,&n,O]F D Q>-Rl10 ka/&?ύP,߄?ݡɒ̾c煹Hn^;YL7~*H"mTԂU24'ߴ,̥03b_lÊ!am(VOl5'NܠHy$-]ʽ:3Pnq=Df5Bf/S3_3A!pL"^a^!Φf揣>&lEe ebz!%L0F|e, ,33!Rɫ9Ծ.^%gfb:nQeg&U^O5,sLߒo"~g'i^KEjg/Kx*&g%z#QB=c.rw)X9:^eQPBJIVr^/Un~CSHXd 3> ->32˿l\eݍcnxjiţTh kgx3 eޞI/zY9cL> >RTՓ0fs?5k`:fɰ7{_Qj!Wec/GޟxCկ}J<8mN~| ?vQ3 :OjꟇ3)MR!VԬ r.- kX /<5vЕEU)5թŞ23=E=GzfbF+3CLHxkg_iwa#ĿGqN<тRǫa!ļhv,Lm%QĻ氂#7,j<#)a`ZD `V&)o(z3e/rKݤYUf A,f~):mGץ wۈT` 3F6,dHۚ +;]ڼ5Qlūuu; ~&q7$Ķvp N w $}ζń"i);p9$r4!.ui۳?!t:GdGEM[Qvdۇ~B $NvfJE&Yc+ `j GG:)q1KsO3/QBpB^- ].R2t!%̯;0*)Ұ8$9;&`l~&'s̪8 g˦*R遖2!0"1j z5dǘԡ -Q|f=ykM06BiA1zkdz`QP9AT0i; D[ܱw& -%cmB(f5e="Bs6Cn^q"bqClE -\wAf﨤 )Mƌv,e/SKuM8AˈPIѸK\u+Po㋄퇇S7r%݁ ļ$cŃD\SFFZ#W Ѽ!Գݻ㦡9hae2BVP[T6 _F0l7\@U܍;( H fbh;PG%jifZ 8S.TF.̞Dë0"z L*Mȸ,Z, -]E|$#5=Հ ˢ+>ŅgPfY1^dM2Ά;58u1‘%pq^9>8- -/qҕ_vGOS\=gAJeG䆊'P8%vGJW ; -x`\5Nj#l5ޘLK-OIJ=Ldp\GFր>w76qՍ: Q86DZ}_ŜJ OF_KbFa{I-|$-OJ@np \+n `*P &b1Njܬ2`e&kO`KhxZM|_ȁha|)59P2_ -,)Pt_ sr-4R lrAʰR-b -.x`D5B|c#/0y!M& Fc_؍MEFWD&+!Q: WX+I^a:dXt;aG|'-㋌am\\y(/s݈"MTvr* V$Ma"_{y1gd+#s0-fR s к7(Q1ؗ :%'Al34H[ZX{<-ڝE;jeDt,:m%c[EgR=| -gt& S0tcwoڰ {Zf1>bϮăTFrfZ ¬GTŷfJΆ/6@ߖX$4CqR{H=ũX$fc#a/3kn 8s\ަ#*w<1Gp8IN2̬aEؼfw5/3+mq3,/c-eX%NK.MNbZp-`$(P)d%@l\|\ ,5- ;Hp*%~/ ;DCypGk*</Y1P}TԲ9]YDB,kzҀ@;1[* [}B0UQD -9|kT'; u[d5;-GWlt@jaIm"769U%] Xf*)f30yMhzn+bf>f`W feLjɟjϥڗ1#@6bh%!*>,X(;ȧ7Tj L9>dtn! :Vdyp3~Ij'"0*w/ ƌ`|,,.s.-HqeMݭ[PY$l.2펬cr,"e^ Ļ"1/tqp -W;V\{Q &gJ{$0\UPB.]2qmbٙL-& } tҝjUaS2)0-jhXz8TᶭECQ?i%"S,\#nX' .?&X͞RgDF\ -2 -ϻQ -/73-.uaZxʣ"<熫,~7_y[raEgeFɀk󕺲FKyLآa4B5e#\+ל<)mV[`H]@X!2,X!`!Mr -7FqlN -8#ma o71J%zQaQ7peKUaXsuLxܲɸ$:J虙4.4YA4,Sa?X׈U1\nIgp)֜G08 g`fV^}L$uQ"/gK5<͑aHCǔW}8$9&(%xǥ9W:|k<}~ (t|XDb)4¿0ߺXpxh -‡Ŧ` 0r!},A_t?E>rbnwŔI()!gZЭ=Ƞ` sԬ~xqgR ^$&&\Q4>gDZU.{3/j>x=ƥ4!,-q2x 3Rz% [Tw-Y'%,])AjTˢO , -%"HL˅At#]B\mRSpaԨ5+5~Q|UHUӖģQŚZ7[b]qӠGP 47dX.{Q_z@W\g] H$Ɩàҏc>,B=AA-( -r^" oS?3Ĺ S[1"El<+h"YY>s~aXsJVzoՓ.l(;0*˩t3X3U bdhw378x`S\Eƪ/\W|L~Vb t>#iآ,GWj.Wkњ9<F_=ʆS2m ėIJ錯f*DX_%؋aQ'F@ Za"k`˽vDfı0YXgd - +E,xtKrNU0f/<. \Ş#7 [A֦5;43J VN̙e`z}j[/ Vi#\AbYw "c&"ހy,^cu 遥 qy+Fp^2HjMi-c*Zڶt5Sզr{cSeB[[@`¢k -D8n57( wYxAejcRp?,j3%,w`OH~l ZQ]6Q|s+Q2ٴ'Dw&moȾcĨ5kw -#BXB|^kY*qjOwÎ1S^Xl_ jELT2/.k^21Ltc| NJUhCY#D6?!`b?lVE !0[_ÿ > Yj -/lq)nNZ?n0Qk5⤤0o53Ɯ\'k@y'͞ߋ0u%,DМcl2$ƍh.VeITlWF ->34Lxq`k\^I11 }ʃ]h5c%/s(}=iW/P24 ^p[$UJ4aP\ Du -Ʉ,6 ldj[8G82k)eht ʖ t`Fxܚ;cq b/\oFcr>lTdrI`+H#RfZ*p,F_C8 Ʊ鶂-fpD A@|VJ0ƪ}㎦%6͑**:<^B{pxm#J1iʆ!jg,ܲ=('TĊ_@vmc-mb.^y zWN -q(&n]~'|\eVW5W~цɊI]+Qw"-XЁe|!a%.=WHG(e\BunZڊG3ƑPk l@Vow.^!\¢f4[#8[@raHQjJ"IPPB} WyHk>egIMAéb8Hx6W8|O3^8xv³Y \1D d&G[Heu,2Kq.T dNT  -.6KQ6i)]¥|E$ sF]a+<7D0bGte!:xee̲-]<rxY{"07>/=;0\!El#WMbz1Kՙay7o$URA*7>Ha ?Q'Q$j;=I|sI&i,rm~X*[]Cež[,+\m8ܴ6":%yْ"dp+/,^f\x/)>‡L+И|xsJ,&P',$ 7XAyCM{jMSܢaOVDɱj]󖲦Tf9Sl{E2[x")0+闀_Hro38angS&o3:&k !0φ1(㘛#QT7q GVܫ_MfH(I=*O3dtSxƢGDק/O'rφI_:C?Ms?I0@ta0Akq{q⑌Mg˫ݕDy|a܉/j(jgD_W3?\4!@K-Ed.nM}1کOE 5DhVwk -6#KPj0lG6#,Gjv*TIY⯃2GG|hvE x%T‚;kFsG)Cr@Id -"QKm !3/"}QT<$D̮Fuv4DJhA v/xd}wJܿ,fvq1[8[3=1/IEΙfC`\%vQ0BqB]  P=-_0=ҡd*57쾘V z2&#;GnP|'P"ޒ$sZ ?Fb>fJo@ !pJǁ R"qqVCQ~b-&1XhxOO >"[]KlKߒ]oinEu SO,Y^{s|u7ΖxIiN;T1xQpb9)Ɏh~.pʁIAbGi{>W9 '@.&ya,uS 'x̨|Nͳ83sϷo*욹Գ⊍^MB ~udwRB kuSot[lyIޢzϝp 4=T%<5jn^xwer׈%bABw40$ DA4"n4w.c e.!_zʚDfUڤ-i 1+2˖Âk#.[u@0ӂk#3F}lcF3 K-a%zydr`e.p<:]^Rq*.aȅF(pE~`9ˆwrT|;l_V0Hkl,KJ2r_!D'S6+7*>Y -nbgpC0 NEZƼ -.0%⩆Z3),1` *vʹ@@V_ڂ/- BTeRm\((LHy1E8ǨPMpl 7 BiWHZ{rݻ\mIeL?|gcifׁ -T4eͩi!:N 6"bk?l Z !Zpv@ewFb-tۍ^ -]+#R \6I" - (]|ڟm'qu_ J2XTzclrpZ 1Dk/*^&8q$mLglW!O)TKwV-!f(~Xf@cz>ZzT@q JlP˫(#kb?79&fc2L&"Ֆb(f?vux2I4#+f'{pa. <2 04DkTŖ")0';{Yw6_8dFSq_+&UVuyt|)mff]ad +Qc-`2啋֞0r3$zu4bGa 묉+,qCo|ݬT-.DGNB i0ASffs)%c -ji1Z5Vu"s+ - ,4) )=+31:臉 S -|x =SQBb_XK6UK*KĪwƦ+XwP_΋_ E8 ojZsi Zy#U -rf%*+E]hPQb+b+r,4NG8I`|8^Qo\'Ki3.!lbiBs 5cFzR7GEMa!*ni$ƹ|7+gR;kUkܙ}-;!Ē\IV'ܫ nRr|^ CayKJ/9ɔϛLDVsZl*AP彟ړ:+t@6o$~3++#`S'! ;kbYfg*A/gDun>U5<I^8Y3:{ߝ^6+z9X= k}Z-pf#0Rc89Ap|D/j.C|tqS1 -5 _-S#dDt܃ˆ " ny P} `៥1zonjy;4D+/̡`PxS眙.e;fgZ5Z3>eKcݳ0]KfH+c36hex^'ktj^%f VyS"ǹ| y>E?ZvGvjW4N -`#})7 T -;{<[FPEͶ:V.٦(gZL=Ef!b>I`P,H,E( p?1(UԳ13oK nX'\ÙKA-^(Bl+c(%l n|[oXdX5QtT9` $Px5ACωo]7r<u1!q QQ /j"ebۆ&>#Ž A¡s*bi3%AhKY ƥk( a0= IdZLa$:׈GEjмA2">!Z38n`*ʇT9.&.|l -3+q\S342oW$\ÜK8/||D%,s"EX= f, Ԡ j? )xZ+"V2Baę9ڒPL=2P <Rt⤌V>7 YJpCHV5WE ,E~&[>jScS=R"XV9 kg ߩ92=&gfFb7p y -$-GyV.w*P$j߼~f/d$MHk_nS ":Tt  Q5Ao-_YEW0ifߓ7|?`iixk"rt/lK#/f`N. VLKQ~yM7+_\// ;%*|\ @3]J.?r&rL,%Π9\OL!3/3˞zfy-^ zRe[ -hM~dlqK;^rĨ\ -Ksp}9G@} Jbe.U}ު%%jE-P'@4dqK BQBR-K2FkRM̨'߬ĽzH:V8i9U=q|44CZ`L _b3̇^9&/a'Ju,1+3ԭf7c|QB$  jp lbDbr*o7w=M88H%*Y<,F/9yPQ[VNA4 *#0,.Mt]`xv8:M@m CApP1BE䪛! *HN-:=x61w? F )qQm'pI3dHc} QBS]~rmtFqL!BS.J6.=Q%}ȵ1"@-?S#V1E)!'rCc3%bC:5N5+^&]FB*X81s&NF=f8d )f:u/%RXY!|el11Bsureb,;XԷFlq.pي -^Q)/\WY`E,BclQw/Xᘨ93`pBb 1˗x!;r31DB e J`!~RŸU̥15\tl[t t,A= 9qC7s)(J2#+D 2@iFxm(- c?:Io hV#bpP&!Ѭ2$`cC bȴ5R}k@Wbx:!*c :jc ff  Զ.fmS*f\q&|<}ⓥ/×PIps͑CvMbag,fovZOA8ດJ-Z#M:1nBhh5':|aB:CS -Ed> %BJp}0XDhmw/,ȏaOXrES[9˸5^ #<١j W!TŇcV&bIk -6¦ KP@fL჊;%fvq|Nd.b 1%D.#k7OMG%Z^XhXj,cxDOeQfHxNy& -VLH'"3z:ycypz8ح_Wy%s)=<ܗB1T\|VV+Ig;08 ܸh}b&378jM).? -dbgkR0SaAJtmD &? mD@JW姞i. Kb+Y*=jv)"o)G_˩Q \2׷l$1Ekt¶GfA]ƄDe1ڑ3F R40ht'_p9b#E,ǜe, E() ޒh-k{wVyGDKܩ5EErZau2)]O>Dgd +|fe ~!363RoRkgYo&(P -_ڔ~2zv"gmt$O|@̤EyeA8 G aw=yY 5NPvF JI:"3 ;T Z;'R_bʩT,$r4^ )3!5 sio؆MkŰ) Z)+, RL$Ȏ{iBKZ-YFZa!YPќ"ԩ\NKWqd핒o4f`֦qii;2O$Aq&ҷ1o <˦ ǒ?HCC ~fp v w0IbUT6Ŗ+u|Ly36LP?BkҎHyLA]G9>&,'{C3*m*)%lnH`V"1ͬ++ȧP.+a0 OK@4TR$隕 XP2ޥڏyS0|.R6"F#9`,[4axfC 0ڑ9JFY4F>L/oh -FRXCc SzKaUo=+q'6oncGR}y{%U,$ 4SL]s~"l7sb*4qj3J< wJ`cix %$L $QIjO=`M_b ^0Pʸ8Riu&~![ۅrDPڮUw.R10/|Aғ.<zڂvu/haoִ+|Uq [zIS0B s=WY!WuP}V&1K0Rg]Hq6/5 Kq`Vr5zȶ}!è m#]ԴS59(]t*vLXvƷ ɋ/_P 3v:R,4d#!qo01']ݖ_s!eӊ $8mnJ4ݦԺakw .f|`vzl"mZ_VLϢ͖w54x,2#ARDTZОBlKKrlszB3r+#]hr -[( 1Lwˮ#7;g^ -ˏ`.lQJơZA Ϡխ0n?v*V ~:DYY%Q-aSxGێJz -*$2&r^ -`I8,PmӺ -B6(:>TI#jqXwcP[Gy}NA%]MJ(TG~e6L5P-yn!O\fWOtBp>\L6EgZ!e 2< ̃Tߊ}5ZrwTNn1#IL;//XY> 9{$V/:%7%úl*a vLE]7$wzmuC4h -¸ _D/'!FC\q_F1ޏ,/tB` CI@(mP'7}Qv GpI#v.)A_.$Ғ2(@t;qppa|W:ݴ -^ -+MND_z?.{ 琔2fd%-p[# jg8L>#)^!(|'(0z4'ʼn6 `!@m|+}5~!gf+OW -XF:GPUڂ։DԤ?Qz,f`K4 -*`j .{FY,JH R lX ЋF-QU*! o:ob*jAZ'WCTj,*YWBbv 2j -D]"hWfj+?5,kIh {h_{|l!kG4-)q% ǻ"Dp  C};z9+O=Ќ*R}~V.*O7̹Ae-D^ u,pD)_'u&AzS{hRLYIICaHS\fVn Y%7\+3djN;*&C8_4 lm#[?%pc Vg3ږr,%"+GD7%kk`˴%w: -|~qO40#f9lMbSUq>])X$ -&ֿqa$'&aŽ~x# r?tFYpi8̘:+zĠg*|,2 =tTs!ۣg@fu` -xwL%wsCFS1`qa/U ƶQD -ؙv+*~Y+/cMW9~x5&a`b⏽r%7AL[ˁQ3ǡy8ʍq$ F%D >LTP$Z+ - -6C]Vff2ݺH2eN⥙-7U=Fi*{B;E{AoOqTX,ĭp`d|q0yǘA:ꗌ"=~% Dt{(ih#@c}YC9lB p",KT>VUn-16/$eq =c%,mqլ%Nuro2ƴA |&H!fPFRP8 7#UPKCXuw+x`Җ -+į"FX!^ --D [4 >WS,U7)M!F{2Q#eڎSE ˻)[JB?/م/EUN4V>2M 7@_0\R 2#a5 #l tጢcEo5` I;St@V)ؖI{̿&kƯ%eʄu/Xvh3b?}+޹NQjحҏ)PphVrqM*4 @jt˂\#֣Ɉ=BwDZgoͼ]TɠASԘ@^M[ćnlWE.0#=؀$!mz[WJeƏPUsJ|dF?5xj1."l'v,Ezk"QYg7q@f_y"bKP -".#b>gd,B`BpTٔi%2˓Y+P8£ wV!-LhV$2Q VWRYZ2>Cm q%zKh$%7v#<5ʊ׆DFk܋,j0 &HdGX4v8BڲD\_#՛лqR־yM5%@~~ j"` Ez - A?& qJ4*;łr by-k1gg+df-e -{s{:lh-]"xU4EjV+V)PbT~N jk+<6+d@+B3GY% %wVCMN`STKt+`@mXEºeM]@%7aPAT7zEnZdK-S"G/fbZ($[.|+ࣸ)N -thzASRmVPΗ|Gڋ?,Nƒj\ͧ6Q&hRwV"hłQDBO ?ӷF>,)pI(:t6-F#W/+.epqaB_.$FQ3==8z `WP8LyJYij"F a<%‡ab!~ {1`T]Sf4ů=΄9I!!:66`xЕo - k<=pg"Р+4+}8M3}ђ/W[PvMOoqkDlž d3kBB,"g4tXH5sk -78_g)Hyׁ"1BJAb;fFRg+ʊFL+9%_LBl/`M~fpqBm=1@fBOT@}EwhEUZlSxdLEwҸ?@QLZL"pAT_1KC|*q<eX2Ca&o; - v&~ r(Ycf0\X* *19=5Ey0a - r[5%pj0`ś~RŹbt + (rf^_x@L"-&4$ҫcRB$SO9zHwǘ]L;·N!TcY\? *P t<;X|SɬranHCDR_;߇oiAMP8^9^{f5Ijjj VVey! 8g$ *+m$7[H`> WK!@{u* -|Ab0Pa@aZ*G\}b@k - iD#G-7:T\cӼ 3ꈟ Qa Y`"h|2CJ$_FۜT^&L|P[PPUCkyX[hTi#rUjT t4!ԲE Zp';|E`*)nCuVF(Шiki0C, -gX!쫮T|MilmhJʙy"`a5s`dbZRcƄ+U{0<@Zx-"pZF1-050=!EȑԈ@|^+pNJ 2$`\S(bb [Qkt_@\U_•yVuQ 0clwgdJt$HL 7MlB1X_cZkC<¶ad6 -|\8=qpY-RD5|#J2BRKoĜpBjLq5ȥ?o&%s-9 'ɧw:V=rpPZ8H~rwq~+B|n`y-'S>dcݲ?Q4{_?* b^ -Z*RRUKMp{t咭[p<֋ng:HZD1_楻_/RfI>{,z -&n4CK=k`"_#q1Zg ,D~z!Ub =1yO<?:|Sw8\! QX|AWʦԸ ‚މu+tjW9D)nIHLCH3ſuy.2 Ϋ{G.oBM'dYiǼַ-](2˸<),-x2-a7teec$P[Pl&D+,FN2q}q?Q!]*Ve8/ װ`X-AFQ5, rjZ_FeWEԿw%`EüYEPk ֡׳ăM/pǍEs~vJɓE]!u 㾲)@-du\)vU~!!Sr6C߇OWk`쇿Qb*n6^k2 P![ǒT{`{KH0"ȭ4exNPE%yj7Kp#_L;D*I@ꋒcMy8) ΎW-M@+xW8QM8 W,$],QP~RK*[~x"d SBdpKgK{؇nRw-xyaLh57@q P@{|2 42PhŬv3d@-*5op7\řPw&C7 jQ{vB8u)Xbm!Aj[?ĄKK Jx`c8v2uA*$G2.ulʳAbhb:~~[;R ʡ/N -rb^v5tW1qvc*Ig#|x8=eY|ϴ*0_ 燅7(UgG~}{T~O)ݠaQR**rd ߟ0g\^`!_cEKo sRM۬2 k%Lbdxx /WrXeB-l5K3`ĀKh5G$Fswwɗ3ʾ/*N*{?^iϡʕ!2G>S漢D Y*O[Eþ (/m;]|>TZ| ?qYajQ>2MHpv1` S=ebkHUrY -n5J -vks\q'}8a>)۟C`e/q7ߟ _ D\15-]`LJN :_?4ݑ?**Mk+uւk^I X<Ʀgۂs\*Z]ٮ ya+OxPA(VueT,+mb?2i xIkU_x&P /ω♾(ȬD~>t"P4!-_IqƁ(:7ZQgOdc`}dZ<>m.9PŲ۸Jh5ƹ)+]An`1 -&yx735 cDʶlZu& (G婗_Z3җGw7cd6;sC+q{()P9h,\at@vl7*| -pkaN -qW=^я%ʴ>& ne{ Rp7dšXוVmr{eC>/N?r܎,.޶:V /?JAZ3WW?B ^hh)zIbQffeei~c f.^r&QYvŠx&0%9b M;>j3~?g53Գa3R Zz0ڰ1l ߎXve猩{Yi(lg†3wf(]B ϕfO8*T~,"ˏqn®_Om ;'!k}gTO"3?hBpeT)!UH_z|UCM ۑ/3|v#ۢ}c?hpUUl(ceCŹݐqڭT{pCcj緂$gț栵%-r/|_!N\E8}]:z?[dw@plb}5"xZ\U4kh/?n 5cT ;nxF tˬ RիUOyM>BF9zDh]`)].Pot$-qHxO BՅ^(l7AOTD_٪PG_*98+w[HZҬ(e`RcPJ_5Qb*&o.Z6^Ìsj豃GIĩwק@%v1.`-FJ3LT.HT0vL(Y]1hnۄ!ipar9N^]lq7x-2+rTT. f HNT_qweD%SRA0%psJ2gP*T9e+a-3.ᗨE WcWK%gp>?FaŏNgk\S NcO]*^ hH4C)bQhFcߊl+U#ij-pДz&_(=1^^ѠvT,cxgP1Lyh+6%̈ӌ'S%9Hяb*&znfdNIY*8\B!gqx0Πy㶾r,ZGyW\ w"֥*ä[Rڦ\N29Ĭ|jjڋZ&f% $1zAdGU:m[\FLh8(/;%rG('n -_pL 4+{FI|ZV8/td/b ǝHVժŧQ?;Dj_yxOB@H]JKsVc[uH o%_">Pn&_H,n󔭟N:~|xo&d -Ĕ"/p\Xg\TJcx5,ホTQ"z~Ycr‡8Ӻ \$4se] l+i_0SlTdӈ۪ɉ%yk{kloz8L9zy]dyULZ -0#Ҫ{xyĹ.o|L:P DhIRaI~dooosqiy) \(Äf4mʙt]f^ lHJ iTr,np.l_$?L}(d1y߱ 2Q1_tmb=͇LჂpb:BfjV'+TBC%i|(p\yt~!~Fa+L~g-ř[jbr`dTF#/… -LR*_1R;ƥv]o1\]|ze.NSNqo?W,AWFD^AK{pyr &Upvc"+}hzt +RQ}U,{^cv$A>U '\91VN_9>b%Os`gR%{6MD(>*#֖ٗ|hgh CXFDSɟzO5.6"E& -@BTnS -,Ioleu a00PK"1Х6*"@{) !#P(uh? -!% Y(-o#&%TԱ,Ev y`@1q*ola B/bu\a腜!8* /.|rJWW;#~6 -e4*lc: AQMz]rdy#W,VYT~c`oUtRUj7< -J+go/.CWrQIpfC=LD(.`aKθ2rks@K F`"] -sSȡ\k2FT~37bvIN71xE K`0ת=]j#Qf;HN t˗<[i.67 O⻗ -u^x LKcu ͬM[~y.:3gEf8w:화ߩx^(h0B ;er*ygګ."QŘcUޅZ G+R'\@:S-YEbdC$&77`,sf!rcMO2ϙ٬ 8ܾ rfS"33X>eqcPr!Ԭ/E7`3yXEinjI6j+WP4řn\hH.o{/LEScs9nTJK%.&L:zArO8RDz, vpZysx,r YK!,&nԸJ~%s5xPn[#Կ5 j_Ӄ/i*S")<q]JSi9-xp3 -atK7ôLIfxTp a B1T[X|"/,teyR/$CR2%ᅍqw+1{mp -|2|hrRyP̐7-x0JOܸ8E2.O|wp&9Uc1d̻[bgdn!D%[-u77/7=1S05;!T81.dw,]θ xe|&Qv{ʠ9W*f>B9SY&:fy5W,. zP^'(L~.YQbn[ \j嫩fbԮkpq/]J/j} qq37P\Zˀe_0$ψ \Ը=J{V[0QtT!L̓%i#+ Ƨ̐!co4Ex|._D %d8bPuS•e{5B ,JK`ހјtDjk0aa.:B;-O:cω2GYܨgZ’'߹WN̮4BUy/N!0K !3ɹ\`#< Qb4<1\AᗌgF k7099 I#P?QK73-'^)iON:̾D뚝*(!Szޥ&J!ŵZ ;?-B&L0zTϩ~%f]8l Mv(꠸$Fe0Ll !.WNa ppn]P/c_=XG?boK~Upgp2333ι5 ??J#bDA?LYB;0<5DZψԼTIJ/ E ;<_SzG멂aLک,'Ba M˝q*k ,ܰ(C&s!3Þ5Qx\&D&0DRʪoPx 7b;aR3r^W|}MQ&?2V?&etl+|^lj灕;5IqU.h>⻙\quS:ˈji%ٌ;y3 eX˭Kn:,RlA9X23ymO@0m3ucq̩9x~8\'V3iY¿RaQi\#2[U'@̷j)H2i#3:F>Fש@MrK L3ĸkh/yþ:qΗGUPL!}w[xvK!.(O>̳A4K5r sKcN&|C.]K,M :`+ z3 A>j0%BZּ"͛C)x2f]U8x#Puhh;6dV%KQkS@t0?U*8A!lWi( q^>&w1íC9 gT nhdĺrwzwos,2k{"}˼ [tqXk 5/4 W!Kq.8Q3U<*T'D^@e} _10.].@)5;g uSfw/sZlqd$pc ouxb+|KΥ*;d* lT/C)x3 -V  γ~5 }x ܿFk00rǸlp^.,7s;LpK3+g&oxqus|&> T&غisR+ܾ.8`*^LKjfWPZ&Q[繒Zᫌg3, ᗹ<<x0 /KT8Rۻ>W;aL屮21 ަ#f]|qx{Y]KxF ^E%8ŗP\v쇹ef k\n5Y:pP1㏃LNH|GXa C x+8.|O 8HΦX;7Ze\Ͳ*fqL37GKKe]pJe}éKsq&)̬JǾ*%g1; ]Ou/.Cs Ax7N,$hj^#ϴ+3/3\bolIr{Yf|̸rE_]q,q-=Gyr238vf}Kno$&~%Sd1 b[ ,'=LK]J1:4;؜B"k -x!jd4pYUa[ x.mfbk ?+vڊc<>Mu.zగy'Ngr3\_xY!%7X>9yŨ$Grzxejx_Gg5Nxh K&6kBoCHaY{R?%)^ۙ| }fܴ\Hp6%>܁0SP2Ѹk07]G0nI|82¸=Kn~%}ͼ֡-S-8?iY._DʎlKLx8r .e\%g5 53kcX/=jW\g :i,`b^!.Z?h|3o|yX/qb 6fw5L -G32 -0+IxC ^pAB{E(ݽQuz"}pec5(uxRKGh0\ze-̼p^>cz;}k8Y㖦f9[ȝdy/8Npq: ,s̶tB|1e{ ꡒޱ#`wUQ6M[8di C-K/:q \`|_yq17Q<-;,̾.^x%1;1TuͿ^7D~E`n3dljwωtASXXpB}7rN,^BsnJ8X/ !14y/hY 66 -llx4MQi4MDˎg:̪2Gv\+ -46MF -JC\8GX*"lIr0)xP,+`H0I2Yq]:Eli:`d:w(*gPX%d\V,^+w0?3#F$w/RCd O"**)K\UA lm"QB/) -M/gBSf~`AF!m!.oަi-B'µU0pE4s2-`S i 4[+UyU슴ZˠTh7`4qA|˝O1{9F -ʪ;b`2S²ncjLߊ7AYuX+ @XBQw혉_<$|ۅT)hDk,NBAM#( P -G&ᘹcH֑ܚYR(wSs x؅y̻"ͬ 4 [A fS)qG`FwWRqZب.7Pm="&Np'ѨUq1u0z17!1QU+2#<8{18ePnlw -0sC3kiLw˗>1.g_j>!|u«\8g|^8eъexI#>nw.hŇ 3!.u1\-ISԮoǸ43!eׅ -tp<\@͘( ;U<&sH YhRBG0("6#珣sEe\x}N^]C&,.^B^q2q|/3fn<<Kyr-0j)夶4/ P,d]BEb50.Z$=s翬iW:_ - b~.5D[zC~Pm& -J@~Xa0 gX \j $lN4-X4O^pdAvF*/_:*KOWF'۞57%BCÄj`k -b&3h(Qfuϴ߹>SaU5YqN0gyDŽiiUct'*[\[; ဵq.!Cǡ1[TRO06CfwO̭O|\<}x_B{Vx_\\@"ƠT LF{c{ va[ p</];+q(եP@e6ՒSC; jVΜl#`0L@fcP0&< .&p+A[a߳iXT_[__8ψCcqq1ǟ375qc\,X a,&W %(|6\K_}!&>}/+UsVH glHdEoD:P,:*э.ʌ]~pW3tA A_@ E(duw3#Cӎ'A=B *C.ś88OÊ\q*PW5aFЋsJ{8 z/a;8!eH<hP`,7̭@Q3e3h"p Cױ4671kgH@}]?__~atRʙb6 :%4Ι.\(bL 43AҿjF̎;+%Y?A<ƦjuC޵\q]bEL2v~xp5)I55iC?ƒ_ 2רanqJ7>yxz|qş=$?>?X{3<"I_6FNω+ó "\ZC5$S?l-)%P_!h]X tEaU̐ 3Qv^>fc^:Zhҿ.%k3Fih3-bth/B_!U\U?O\K'nx+(L~UQN~ 60 >I_D0" KЖ#` 22 R Z7{(!Qv)F%T*41dĢbz,T +N__Y8㿤}tz, hP}RBx늕L>gs\iTJ w=W> q~NY?36VN#o ZUW( AH6 7e] 5v"jq.=wR - -}6M(4J܂`j`])$,ql EKta *WAqJ#L9@C<"t$Ep- rp)$[f7Rdtc{3f+V"R -,l=l;f?dBXeƖtB,>B v0@L` -AAID1>VRt{^vC gV@xhMxӪ"A` (KJbZD5|ףǎ |h Ո?K/qk;*PݼžVnXfW.n(륋!WC4)f5(qB )8jnAw@fO3^/(<"VGD;!a -(8 - -2!OB<`Pqjח^@8}hv*SI~iȍB*׊K2cE^i -Ṍ֊VҸ{CZ!ZpR5\R2\F*z4cQ W-⸸C1>1Þ*!9C[(ĩ+Q1 -xrJRr%eN:%}}\by⹿ls>L|o3b}?Q3Q>R*;!f85uSwy鯤;#cLr?!8rqrSygDwgu*m)@ Q"2'RMW)SV*WUTF) iUx 8)߁8 Çk.eKO K*0iIxw/&e8T&ix-yW%~-}C Б5|\Uڗ f*UevDd OU9[T\*!Zp9vL[_\&(c>HrA _W6F^«kY >`"ڮC#n]fm)K,2۶'$Ũ% ܴ||T$hڸ -bՐ눗WPpҿEԾUbt.^Q]uY~]Ӫڛı;V@UZ(DR7GݝM7sAy.R嚃)Kx7M5Sy7t  R' D-h0r\U)͐WYp`D)x?s,f5Sc<@EOD$0,|́3#1>т80DQE]+Zw_=0+*ho*"@OԳM'њ"/K[otHRl|,t6Rqw1m_숔I"wgeoTvP_li6Z~z{JsA3fQ*.BݹQG`jyabT~HFUٛyq'eR}{1~`ιy|,/ްj5dR;zIV,s!lScjR -O r F'oP?qY/Q³Q^Ո"Ɛ-,B|̼$Z?'ha__0;-uya Aـ|?1~|n?Ĩp^ -c_.P]|8L7~D1 -;o=+̈́y?܋U80̽?¹c1FNʃ`>9L8Ni3Ůd28g5@<ސWlczޕ^ Ўz6̌RەcCS')sH)OO25/(FPt؁~_@bysp]dUp^e I,kW 0B$SDLN'߇>g;2|L?xOT@$e)Y7>}@`< ?iM|1t -Pń?>lJ2/(H*n9_T"O(o%{a^>)ʉ"(M(X툈%WS @ n0ſAsc@]y!Xg؁?ΓW _eO2~sur8S_ij~['O H~ؓ[?bk艾D$_xrݴ6 A~?xŏӆkhCC;k~$@_W=P{q"g c(2|ڸ{1Ks[< a A3i>DeMv ,~A0T_e/C|<=Ń{5uI,śVx.T,y)z|L׌?ejWqV8>8t=B ̲p{=?0SG`ܠ+/T &aNJ Ow'v)qA(~|gS.g?0) c_nɓ~\JԮLnT sA|u]J<|LԮ2;_ ^^J0weEKdc,07q)5(<~ɥ+,8G_۟>gOXԩq_%V%Jytg1S'߆:f~ _?Cy =ܽGl[yg8[Dy&Y0_igJog? /N<2dCX=9T k! ٓ?Nk?e>/abxo -38?tď??wRxL2FpHa_/zz|!t?G0%pu)eR!+ SXanxf]P|^̭MF:i#!f 0Nަal.[ě]݌ǿ󢻥eL2V>@Pfh3[a=?cN8ۛfUWLYX`KS/>)m$C%cZXp_>5?iWE9?xdig'1{3oROO<Ʉ9%eIXoWp/*F`54?Ms[% 9QC(X3|u$t>*MZm/Gꌿˌ9K/&)?MGYD2>f\,~rOŒ??ٳT?<ׅx|?"rwk=!~|w?aV-i{Ч\7B5BL,9S(,F?00Ge|!\ +fi o£@Av #_uf|ZA~ 1<~P*?Â,W?x? 6~T'e|a_Y?~+d7\=0O~QNy75_6*%`D zmO>_Uud0|!| e3? Ã(ȫc<#N.y+/;8{ s/0 Kq*|u( IjO%TL>94'R#"t|{zY:PQ;f_[CFq y/:`${J{wp!l_e35I<2F3Y?3Ca -KnpM1z=/x{ Cx;L'c)LJOWk1I^Jm? Os#[Fak?IsŦ~~=Me,# -gsɂx Ȓv?টrcs)ߜJ_$qgUnP4d"g'hL9gǏW>C2_$VsSX 0d yG+>x~q<GG>YGʄ`7|΄a |w/guc?@ߒS @C3sc2?eovTR(S5lUc'0v39xG-p0Vgs|uc`A|WjWp,6}ٔs.agwǁYȭlQs&ǼT s >rj~BOO'Ӄ>c2LoM4vGf'3od')X;3lXHnucF?p~~?R ef -_Qe8$nsp7WHXnZ+Ys9_̾hk$ ^ɛKHCpp_ -ק߀~!{g?ś_?Ǜzk1_?-Oӹ&aRWuxe$@YD-k1񑩔,͔tr!??ی&kZPVG'^08 ?v_D?! B>s'6Si ae61H?bM#a_i\\oq,?zh}~n B)W1cM)>;@K:\CU&?&06!p{@8 sEPX6'l'7q1^1 -FBuҢz-7 -&+"1 o^ߙ-P5 -1Jn/ZܭE(BVMdTϋ_e6C˨(T0Aɯc8PA!P4$-GTSЯ~G~YaX3ǪcR8L+Vf6%j#lPKʆ!nPR- I - #fb0f)  -s櫝qj/v𼳪0!:RV`K>6f IQ6bUjʁaIEbV#x ʇb'R#[ĕ(%f}@ \'dP 8>KƢYTPqX`KeD_\ϓ&u~H8cA<):Ǭ{P,yHpp{_Bq9U=Dgi|$ԹW YX8gp6ǃs\y -EriE h`%ŗyD._nƥޠz25A2zrg, `.bU3ԯs~u0 F} \~4P;\\}Bu/e.ǞOqN?0ׂ5A; ,6ڑ ӕ [j9'U2լ$?7!9MeĊ_lTΈDžfeRTY&޲L:mͳefGK 3Ԩf>e/ sn;'R>Q~'rǞR9Y lDm𹂡l {ҾNӏT葨nTႀ4Wo0ēĢd0؋ne(c$E[\b!қ4@ZFArPIe=.7VNGV*R/5>agCG= 2ϒuǘ-/<_?yʜߘL_N4xD5r^՝\9gpMLȅGn7H+~Ew>LB|.z"0rj=5i Jdȹhb} ~ -оR,p&eK/K5s$m(F?^&N/xyA15\t4N{9(6F2;{AϽ)gXc24Ama@aj=T"R@ju{#Gl^1M_ RB_9KXhji/}ո4&ɹW̩1+q5dϽIz}Y%1a55\Y&8gR -Ll{#ku @b>vMofK%B,Nxsk4#2u~!f2M&Ð̮54ax/7*ӌǎ53=(P34)WbKA EJek( 833ˆ&u4& !Aw|_[F`I3 -é < c4BWw6J FtLNxĢW%r°(rcow13O N#?hKeW72&gY&(s MDa)j1!~wW2Wy%o/;x㯥aNg1nÇ13$;epkqg0g^ -x>#׸A.bx:s/~YL؎x\^efT7/|x?GuƸ;DYsCJM(^c~8xۨ}+gf*PxB**qH30&~GIk2;**x7K.\qxsFweCRכf<2\RJk3L-4RJkSUKx\ȑ UµpC1DٜG -ʸVt'm4C$SWs-^vze"8o"8 y`GLJ/أS 罡-;7ܛ"f"H*7osUx塇c\Pcc!SpQXhxӬʁ5kM 37X!S¥]_b#p*VN7jaK-®k\??@Е8)kd2ĺ~/@C5s⚫`Րp6|"p k̅ |g UpkHdh =`ʯ}])yϢަ'EΫ*04QDF-IK߈&6rJ.Rb#f^?."W >t*D:Ij|0 d{!̝brD)8}P[Xs+1oPS+> `( emm5nQ..3/o\<^$Uyg‘PѪ0I@1#Ij} }%Dh>?~,5LwS:6/3:! e2ΨMOICvdW8`zvslrN=~,LRc'Y 7Rs|ϋʸs␠gH`9|PJG7&)`#3cE&BY/~3xx|Gb9L -yC}#ho -MߔD#9Po@3,_*kg/VC@/. G#SJm*Zu?fA&O8*(vk -[*Әx;A&Ȱa)xZmO~Ś)@*>djۏ&"W#%Whi+= n)R ) I> q~|穨MbrAxYpsYD33~/Bb:8'ldU$Mx_*20QȨ`qڸ> J #AUd%XƃD X -oDo{5;0h;$]GJw!f! \$"QHo5Ԫ0إҠ+)窛|[J<Qe !:`sԢ;i6cm^\{U(y*xTqE-T ke4̺#1VzEoCd!*œ[CْVJ&EF@-j`Ea8֌b5,|B*PbbW5'|PiBD#`6IY0 `qOAk71A53:Ñݕf\Mr!*\U<@' -rPRTeX!"}qMVE! F,eTguKy t1*R\gQLVfeN7 ~|X[6Y4A|htcњ: ]D&5/M3xXqGg:r_Gt)D-DS6$c99{ORξuI7\-Ը`C4kWTͩ&S6!z@QIcSp,;1}y+ddI`݃9͚-#߈I>PGmXz7cCm;BWh?LKz]Fx n&ew^)<N?lVS C3+J+k+},N 󘤋t7ݣl@ ̪_r~*gl*Rv1 Ln/ tBԌ܉D$gpbޠ?&Xw`W#.?AcS!QjHE&@1] &8qW*8ʢf G1 Wo.NoCHc?UssVxܼiƈla2?i}1IQSE}T_f-y2pxb79LNY}Ef%QIZPE0%K!ɻ@^z .@@ Ka̰Z?4}SsO >g>DXO`?u`ҟWȩg$RƷ1%T%O:?1O0Y/ z!?* S -j>m®ل0} -FtZ]ZEu،UUgq1iYZ?S?<ק52P ^|H%&`svajmebO7O*/ -mbbP%Z\ YaD02$gip;`IpY䩋/Ǣxw Myļ+ F6*,c6,\m4XjAXbYSZ Me|Fq~tc\B,]EU;!,17>x~aQLZXVNB=,-X(#fu(̸O|\&710U)U ,>} 7;JFՕ#ڿ Y'm(g6%~fL(eq~Gs]hK+ljY*5YOAjU0gHM$|ZTTRӑe܋尮N\G/ -3nC0_k;,E6âތ4@؊|E%W YZ/N [ Uv=#.x)b ko@s>W*|,)mNm,2`X2rMZ93)auQ`#`pLIoafe BS2޴y`ϬA4 I|!`fu ];pL2 -a@ሙCV)? !9WWl:5cLsx`>Rq4Lje~2\g3qXagܞ&f<& ]rʻ3 >p4C#c񂔺Ǐ\Q tN|on^/+\*Y]e*D8Zvwnh:g11).[eYlc\C`) a8iO`tq[.ILy 0,lD dG:m"-bPdQN+<@ ĬE։iUc?V%bmQ{#J%F`Bn17pPbO-=an`yR._ ʿ#z=EӃP*2,xL|0erg:vٗf^ّ^q#-n\pEL0^/W5?xnTbw11 sz~OD@jPi;wi@98+$fMX4ya<U݉ 0[7Ԍ0/cM%z%L.P)loݵU-[LL&MRE@3ʨa`ߨ%&3 _iwD 1y 6tTC4,2wzcƹϞYFx>LAs>%p֡.e*RRl8$F2Cv[p  -4/R:Qb5> b-dԄܪˆىnP}ۺ: -'DZ@ZP5(bZ3Ș`"sȝeV0 Ѿ52p,!0db}ptCfYg cdk;DxcIJ)7 ]!-@f#,H#14 i2ϗ,~K2if+sвFVkTW[*C@6?0E$=<_̹s]J\.>Nsb8p}n08^xJd)h1oB$By^ǁV`2U-E D0nlXw^>SsEǭH3-Pb - 퇜+_&| I*IF.VDً DT W:M"^C;/JWgKo*3(;V^?0ӘT_hjPIh04]ib)ag<Ca2#HX00lEnO& C\W10~mfc&1䱵 e{ Ntn?6h1n~5 G>L"L xS0](yC)  G@  oj~E\w?rb+:\BI -_5 2 - k8 oQ7 ;.|;KgljL/w -sw1 S&'KÌ;>B=]) _MP~1j-OD!J|c -vGj -J$7XԮpFQ*Sٯ8ZI\-:8>\1 HqD6fRsgW3Үb:F3}>ؾ }!Z]>s5 ,5nRH0S6H;(Pń}87! -S32+1+{XsH| *:*5?vJk uJ7{`{b SV=Od&eŏcSkTQ q$<#_iDYlEVU*dK>@cL(^TU{^xTzWfu 'BElXA`>X[Z2͙ù.T!_hڐK %{G3;ܓ+Htz =m[&Rΐp,4KJ>?Ŝ8~ xQp構SMG8sܔ*t&8*VĦbSX-18@ZD"I)U1*%%bqE5`+*WC\R \&S|2U#7 %]-j\^j: _F%_7nSg$x3fqjW|+y|fb"$oQtXEZ"_1VM$ 32G@5+67FJHe { yj/<>5wGre?pY+L C SdWRBS*WW=' dQ*x%guO7{#+n+=kNΦfAV+FkQ4o W7hx]L-˭GY1sJ$솷fخ9SU -w}fDIELidt3J]گPժz]RP؝_i@[Rp#ؿ-eYI41L.Kѕ:f!&U1' 74S`2wM1GeqC?sĨđ{3L78fq* -R5 P6 -}L(&a3f|! hk0+b;,2bf/,uemjrT>biZ`s:dl<ݢoʾ@PJ8E@3?Ɩ5A5Xctn>|u|~\Lgֹ."e t~a)ӛH1|Lǘs̸}Z;W#1|xGs[$fY0p|C۹%Ê #S<*ʠkžD hIAjC` K/@R;pcxxb^@ -9:/ $]oߍ:<S /Ό?AkW;> n|q+2L8cUaA'dNG'1.|^4~z #q#ZeW͙%X1D*SxbLeb(((>a 0ܽ @`+..53AAX 7Sra)[k+,rr٦uؘqg9MzCXI'\,> -AF_V _D"c8qF-Z?NvX&;=L,~DR]keߐK Үj;Pe1Ł zCR@9. -eӣv P xi`ͪavb( M#.'VԸ_@RBHmoB6.o)~JgF[֔a#.lO*2`,ia@A+ڂl k|h;Fe4\3;!\\*<Vc1P72ZBP.Y篭3S!H!En@-/,"Y3U6R^NOPnkSNj~B(XG J/Ľg-, -4y0]zd)yok4\@O용ugC|lÁOG"tGr-fBΥ_QTn<0gDKxtCŜ:hpK0>x/P|"H,:E1& `'X7"j6E[H&#bwf. Lj6p|1\Y-,<ǙՄQTˋʀ^hi3]Tnb]v~$e0~{c$4v-Oأoh[Ќ3O3RLW끀""qo@^=\d-Ρ˩l4$ك^Xa\L ?iVc2jD| 'sƯ܆;6ねb> -~]/z74-2m/nOTy"s. -`;M\[Rzj1pUd QH &squ]iϚ_Nb E'o!\uqDbްj:'dS/>n|L^5x2COpM1FUNw$aJ8,7fSv@ eZ@S)B}цg+8%s43|1+:涰\Jw{9S3ZPE |%P -OIGI,E`mBh%!.M VVxaKe4n\!%7ٲx;scMN\c(8f8gCCġƚ\IJQ䘰(1GƯIXGq2y*G(kmIHPJ3 [xRq.W5;~M'U)'\1A{zqgG9>p3DB7"U *ق E.Q5Ln؊3k^W]w J"R3^ĄBT]UWn&"c0MZ\f^98L(9Yz(ܐ珙F'sԹMk9*s-ľ!  xXXp3 ?-& gLC@Ĩio."1sH&a=j|@bcX# e3P`U@LP\c\<2q=jE_5!+V(-"߃Yk/g;ggGa%KE͖1ou {0s+; :ʕ#QcS_u/0p  :#4#Osy T8:oQ!evH.;PX/ qjK>"ń8`R,Tԃ(x`OԧO-k|ns5*O=[#x|9u++ -A̹DXЩ@`˛ua9u_0Dcst~f'qB:Ƹwdj -0ʔAt5W‚ФǬOhBBQXX|\ 63.>XU|C69/E3:s3թJ%J/ʔ5T$D!nԔ22Y!pH-l<)TIyin-jOETBA} + LKg&:<Řf7_U:ISd!* qf9m3ufg<kƲ,jVgQxI}^4ǜG0=IXų>XZSquU MB\^bb|:j8!,sÌuθf*b\&J @%J^/S>GC)w\b[*&/eU׈ϘLY;!7 uN:= 51c&7?:8}K&"@5/& .Y^f! f!s3S| -mw*fĿpJnɧ\ Vȁa^Vj#45_0eZM!X1DSJd 'q{Gpa4ޮY~) L`...,#wÜsΎmޢ"qa=s - Nx] لk|8Z9.55l3MRP3  %f[ `ͧQryp|scc,ĿgQC<!oq/{'r8*}wU33|&^YqܪevT~8PH3F@F}B17h *5s,+sYț['Vk?PmCA*C9^ ꫧT60ֶg枸K1bpRx <\ -c5@tJ`dqG $ q -_(HyYxL0Jq|W&*{U܀-b[D|P^@r^)%fUQ'۾RˉP\Z!,8h7K >_Pp2g !CHT $O2YVws`N:3S5|K uvX;b6 h6oJih_zДoY`bB0x2lyD:aOV|i3|Lslx^+?V,|<|qῧ2^@[V!dCC!pq^-oɁ2 }_q4򨃚ffwÄcpR ԽL-Ral v%ddcԐKɡsBQsD'h\H`#p7Ӹוr =k(|e[ 6{_$ڣDqSvhfBuқB?TxTLO0_ҏxl,\A$j@˄8& ;֧IJT0Dj(c%W`0Ӆp|Xۣ5D5JTq3o4@=_V\ib\NѦ"_P%6# {cܲ"X`>!X.Q%Cg?*g_gHa5"E03YP4w;O^ %p/ū-(R;:WbaM0isaf9/뾧DIl!+*lY+|ffe\uy}g6* E_ i ٹ o|YR:Pa'f6X $5/OlL*wҗinC3ki`,j{Qr65 }Rp*,u/{-HP\L--XӀr]4X]t@` -=޸QH֧kEE0/7/ -WF/wCV>pmC^!2\jˏro9_.jxN6CQs qbc-yqe@<(VVH -qV'Fa1K,0 >l&&GqQP.`1dF7cg&05ԆP;=;Lՙg{;NFJa|< x۟fG2Uv;+aI˯u#ܮr2>:CrSq0`( CB-vC=)%6.Š;F`K)#U5T*yݩ)pLKa^~9KeKOfyqpfzܶ1,>etHRZG7lQSqXK8t3zP܆)SF[%<'+f%+,G(al 6s+aE+qm/lsx;v- Q`0?7痐P܏] /?`.Bʒ #eUM -IeP:Ƥz8Kh tCD4Zz-Gq0үJ}Q I2£dsaCӑpKx%R\];ŵd%Fu::1 ĝk|>x2C Oԯ7.yΈK~KK.5SLq]jXb)3:|r˖*_pE?hLHB/^zlNα92yWG_ Smb-Bʬ?ebsoN>SFP -Ixm.WI;zRJ*yl% YyۧWUJc&z m>Lb%ƿpTiwz BX# _PZ@^b3$<@Wbk]#c,:LXr JH|"!hk0{YܙϱkIjR1_*3cey\ˊ>3 ;1Yg/ T!:nreT>i!02mט3_Ī#{pAFߜWլ鍶ꈟ _%Z9w1 5BZ9Km0 ))xT YuRSyZCa^1C4:r•:6{lt5BS$liiAw`Q˨4 -\ר{V%Zյu:lxM0#*o<6f]?qz0br5dlb{Ds%$?bFJSa7=Q !@mQ,{b8HNdC<^8]<]0j/Tq\30n]B*&g˲xAqQ倬D:ZaN.pA!F> V D.X'C l8?faZhtT r#p_=;.jVX1iOYq 0'ixAʖƱv#|njPHﺂ]Y…iE"]ʡ^#49#`[ pV-~&qD/rBU?D%TGww XF47Qd7mqǙq/ njc3^nn;Bf0SovKj\j^'ԽA%>bRֺ5Mu&h~=QdĽbdk9ٴO'bܵӺp[g!wcփYj_+d7HGEK+_X< -WJ/Bj`%7X"x4-Te(BtW3s?ɌB$ OA,F3q?1p"DH4Tp0h!Af" ~X6\␯:\PŇ1֪/mYl#pq:G =T'S.C[˓#8-_uq3gH/ 7Q%iaWa*07L[9 H LtdA`E5~墘[P|F7>$d<|c_c1##̭m CJܔ* OYBU jFQʕQH3REܙ$$ DPOوLgoN~ԙ-g6!qto9k췪:_,R}F|%9;H\\O-qYCs3Ts .dY"a&?<ʗfŖָqygo\r8~GL˄P/% ݎ@/i;}F -Z1:JGXꄅ1' hXg@[%OXb#Bŭ 82,EtƏdE=)s;їQ?-p2C93:ή_ sdxp85q\B]`̭H=ff$rGq+)C -8My" =i3뗄F9VgTzm918Ơ4X-baֿ* Pyy%pU 6EZ̸.,%U`>PN?SasR6obJsťxU=EG7}X2]UE|hȰCS%JBun[iHzwK0V+Pb_ LlRABႥ`*6Va+i @#!G}* La -xLuHHf4F4#܅ `޴0Qpr{#/){.r.wzK.3n`ss,)뎥|y%<*x/ *{\w$>q4DBJ'ju^'lV_ ˞3rx=f/H?Fat˗-M3s\,\u;\WbL.d}zpu8|D,ZU˗2Y;<_KK,o\+a?x r.[rj r\ ż\u>.˗._/"^pLQPDf&xew,⡢^xu1^U.MLBYk~`-ypIrrR=2Pr1q[12ye lQ1.Y.|_,x2.,pl]Ka x/3Xnfٟ3*,%rӀ- PKn_6SO/rY{2fX\Zsr LK uSV&z͒lymcX߉LKbX4C9˃55[]2g C3ψ0[BЖF,] SH8]7[[yRdKZ^|KǸ2KܸT]wj6f[.^Ip6˧R.j_J!s'C\).]bvBSzcp0eM%y >>s5j_ShXkeTualK% IR eXKrn Iy˖̹r_>\g_ucwͻK/]1P'VEv>9m V U>w|gĶSVL0SqmO\|sOD9ZS7y%x2Ve7+2,1=ɃRB ZKKR!c&#" AKnvfE/9SrtXw*jfgDjٛnUAz-쎕/b/>e[ mM!aJ|J4F(()z%kS/ؖxگ2qg, {X(tDEZaBRqXV'{LHAuPQ.kzql#%dƌlA}PpUCL21C%blLcDsp땵Y%X]5z Dɘ_9؂PӥreJhט,犬/ŠK,cq!$c'Va"+&Siwrʶ(yRc*CZeHv&1u1΍jG((i4b,kpe 5w _]krwOS4 u"\,wKE 7/[φ;]\1h-: -U~WP&R0D -n)2}LRpaˋ*LcRah^sUIqꍽG;V`6"IUWY/%6VmaFH:H^)U3,k>~W| -}5Lb +q+#1_ (#dq& A0P1@!`pBQ?~}e4?=lĻ7롉?l1#652Ym~J7,~!nԭ] c~GCc౗n?lVTQEW?Q`B/"p$ПȼZPFVTQSF- -p7Ѕ?ش!ӾUN,2C?H*+ࢾJXPv[#Fv,gYcwܨN X9PؘŃ7bu&6'!bjBt6'QqeKR(/:}E5~Ee,PŊ.._^o UX5ĢhJ(yqTPEbмV -X̿%C(^WEeb&_b5 ^Fբ5EBe1((+䢊(hʰ8J*W"ЧF,U c,4jh?c/"'7E׃G [-߂PT7eceyQE4%bEPІUT$QCE"BC6~MQ/ɣ؟iM h^K+e#S"7&eŗ9V,,6YeYeY~,J^%ʸ?iu5iEn7>_z]]CvwxO]]k]vY.ǚW,_e(_q}Kx.c_Uy7_ oĸ+s?/iSyuՕ'_[w߸[/pM$?8]2ѫ+MsCn+<:P /x>7*u.fk5 y5 zF&>=Cнכp3Bj2fhPй4(\8~eecg}"W,5g}Wk>_⩲ o诧N*ƺEYQ}Mwx!v_\?{BzBX- y>ˡP^ C sq~+YWP:X xlq\|:ɋ}`(+ -o, 칲,e$ @P0A`p1!Q?݊Avz8S)C#:A#jUPAAWEA8]<;8T V(܋X3DbQŖoF8 Ub.Y㓾NYz7` aߪ,|#Ď?~>qC:3t6/0C;CyQE QP(Eۨ!D"D"((((xߏΏ7 -շ;ay~gμNh(<A|.1cxBQwGЋ-e=wxcUp >/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000017801 00000 n -0000356550 00000 n -0000356681 00000 n -0000356879 00000 n -trailer -<> -startxref -357016 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b74a790d-9caa-43d1-8ef1-55b8450fd3d7.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b74a790d-9caa-43d1-8ef1-55b8450fd3d7.pdf deleted file mode 100644 index 691a4ea..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b74a790d-9caa-43d1-8ef1-55b8450fd3d7.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b8083a0d-2869-4e5f-81be-e4c30995288b.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b8083a0d-2869-4e5f-81be-e4c30995288b.pdf deleted file mode 100644 index 9ffaf2f..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/b8083a0d-2869-4e5f-81be-e4c30995288b.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/bac040d6-1fee-40e4-866f-0d8473997c6e.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/bac040d6-1fee-40e4-866f-0d8473997c6e.pdf deleted file mode 100644 index 47b76c3..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/bac040d6-1fee-40e4-866f-0d8473997c6e.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/bba4ed98-88f6-4946-959b-6684c83a8332.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/bba4ed98-88f6-4946-959b-6684c83a8332.pdf deleted file mode 100644 index 66c5449..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/bba4ed98-88f6-4946-959b-6684c83a8332.pdf +++ /dev/null @@ -1,2312 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 264.0000 0.0000 0.0000 792.0000 0.0000 0.0000 cm /Im0 Do Q q 0.2062 0.0000 0.0000 0.2062 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -32.688 0 0 45 1.13 3176 Tm -(NDS: ) Tj -40.701 0 0 45 78.57 3176 Tm -(1378448 ) Tj -31.8171 0 0 50 0.67 3128 Tm -(OPERATOR: ) Tj -30.037 0 0 50 173.85 3128 Tm -(DORINA ) Tj -27.8093 0 0 50 301.86 3128 Tm -(ROMULUS ) Tj -0.05 Tc -28.5108 0 0 27.5 -0.89 3064 Tm -(NR ) Tj -31.5197 0 0 27.5 57.85 3064 Tm -(POS:C3POS-CT2 ) Tj --0.035 Tc -31.7547 0 0 65 263.85 3379 Tm -(BINE ) Tj -29.5748 0 0 65 354.94 3379 Tm -(ATI ) Tj -30.5222 0 0 65 427.92 3379 Tm -(VENIT ) Tj -32.8262 0 0 65 545.76 3379 Tm -(IN ) Tj -26.2087 0 0 65 600.87 3379 Tm -(MAGAZINUL ) Tj -31.8185 0 0 65 772.85 3379 Tm -(BRICK ) Tj -38.7006 0 0 66.2501 458.59 3311 Tm -(CIF: ) Tj -34.7092 0 0 66.2501 538.83 3311 Tm -(RO10562600 ) Tj -33.9852 0 0 57.5 0.64 2939 Tm -(CLIENT ) Tj -36.9025 0 0 57.5 135.6 2939 Tm -(C.U. ) Tj -55.3299 0 0 57.5 214.06 2939 Tm -(1./ ) Tj -43.0693 0 0 57.5 297.54 2939 Tm -(C.1.F. ) Tj -39.9795 0 0 57.5 393.97 2939 Tm -(:R01879855 ) Tj -36.1842 0 0 106.2501 6.68 1674 Tm -(TUTA ) Tj -37.3959 0 0 106.2501 119.78 1674 Tm -(LEI ) Tj -32.3647 0 0 62.5 423.85 3572 Tm -(FIVE-HOLDING ) Tj -37.8406 0 0 62.5 660.3 3572 Tm -(S.A. ) Tj -31.4745 0 0 63.75 316.81 3506 Tm -(JUD. ) Tj -29.6711 0 0 63.75 405.68 3506 Tm -(CONSTANTA, ) Tj -25.1272 0 0 63.75 608.88 3506 Tm -(MUN. ) Tj -28.5198 0 0 63.75 697.7 3506 Tm -(CONSTANTA ) Tj -32.4333 0 0 60 408.4 3443 Tm -(STR. ) Tj -28.3639 0 0 60 504.79 3443 Tm -(ION ) Tj -26.9722 0 0 60 572.87 3443 Tm -(ROATA ) Tj -28.698 0 0 60 681.12 3443 Tm -(NR. ) Tj -0 Tc -60 0 0 60 753.28 3443 Tm -(3 ) Tj --0.035 Tc -30.3737 0 0 60 2.85 2814 Tm -(BURETE ) Tj -31.3595 0 0 60 135.42 2814 Tm -(SUPRAFETE ) Tj -31.8083 0 0 60 321.84 2814 Tm -(DELICATE ) Tj -31.0879 0 0 60 488.93 2814 Tm -(ARGINTI ) Tj -38.3719 0 0 50 1.94 2754 Tm -(UZ1024010809 ) Tj -39.7992 0 0 50 247.49 2754 Tm -(6422768014664 ) Tj -27.709 0 0 63.75 2.87 2691 Tm -(BANDA ) Tj -28.4138 0 0 63.75 116.86 2691 Tm -(MASCARE ) Tj -29.4468 0 0 63.75 267.82 2691 Tm -(25MNX45M ) Tj -39.0569 0 0 63.75 433.44 2691 Tm -(520703 ) Tj -26.3134 0 0 63.75 561.94 2691 Tm -(ANK ) Tj -36.7077 0 0 48.75 3.78 2632 Tm -(LVO501020402 ) Tj -39.5316 0 0 48.75 248.44 2632 Tm -(5948941004730 ) Tj -29.3877 0 0 61.25 2.86 2568 Tm -(PRONO ) Tj -32.2815 0 0 61.25 117.4 2568 Tm -(SACI ) Tj -32.363 0 0 61.25 225.4 2568 Tm -(SUPER ) Tj -34.2524 0 0 61.25 336.83 2568 Tm -(REZISTENTI ) Tj -45.236 0 0 61.25 537.46 2568 Tm -(35/15 ) Tj -38.5402 0 0 52.5 1.94 2507 Tm -(UZ2210109185 ) Tj -32.6734 0 0 52.5 250.84 2507 Tm -(BKOOO194086 ) Tj -27.9441 0 0 66.2501 3.87 2442 Tm -(PROMO ) Tj -36.4921 0 0 66.2501 124.32 2442 Tm -(SACI ) Tj -31.0004 0 0 66.2501 214.42 2442 Tm -(SUPER ) Tj -35.5626 0 0 66.2501 332.82 2442 Tm -(REZISTENTI ) Tj -42.8552 0 0 66.2501 527.48 2442 Tm -(35/15 ) Tj -38.5402 0 0 52.5 2.94 2383 Tm -(UZ2210109185 ) Tj -32.6734 0 0 52.5 251.84 2383 Tm -(BKOOO194086 ) Tj -30.9161 0 0 61.25 4.85 2316 Tm -(BURETE ) Tj -29.117 0 0 61.25 139.69 2316 Tm -(CANELAT ) Tj -27.9122 0 0 61.25 290.7 2316 Tm -(COLOR ) Tj -34.0652 0 0 61.25 399.81 2316 Tm -(10BUC/SET ) Tj -37.7115 0 0 61.25 582.55 2316 Tm -(33 ) Tj -38.4177 0 0 57.5 6.94 2254 Tm -(UZ102401100109 ) Tj -38.9735 0 0 57.5 290.5 2254 Tm -(6422768022638 ) Tj -31.2182 0 0 62.5 9.85 2188 Tm -(PROSOP ) Tj -34.6149 0 0 62.5 143.84 2188 Tm -(4STR. ) Tj -31.203 0 0 62.5 256.85 2188 Tm -(PROFESIONAL ) Tj -28.578 0 0 62.5 476.47 2188 Tm -(STAR ) Tj -38.4177 0 0 58.75 12.94 2124 Tm -(UZ434101137344 ) Tj -37.4359 0 0 58.75 295.52 2124 Tm -(64256670O0530 ) Tj -33.076 0 0 57.5 14.84 2062 Tm -(HARTIE ) Tj -33.787 0 0 57.5 151.82 2062 Tm -(1GIENICA ) Tj -32.1644 0 0 57.5 315.84 2062 Tm -(BRICK ) Tj -0 Tc -57.5 0 0 57.5 425.31 2062 Tm -(3 ) Tj --0.035 Tc -29.7474 0 0 57.5 461.45 2062 Tm -(STRATURI ) Tj -37.6085 0 0 58.75 18.94 2000 Tm -(UZ9005335 ) Tj -38.6432 0 0 58.75 208.51 2000 Tm -(6425667001247 ) Tj -32.5007 0 0 58.75 23.84 1941 Tm -(HARTIE ) Tj -34.2 0 0 58.75 159.75 1941 Tm -(IGIENICA ) Tj -31.4727 0 0 58.75 320.85 1941 Tm -(BRICK ) Tj -0 Tc -58.75 0 0 58.75 429.29 1941 Tm -(3 ) Tj --0.035 Tc -29.3131 0 0 58.75 464.46 1941 Tm -(STRATURI ) Tj -36.7288 0 0 42.5 21.95 1894 Tm -(UZ9005335 ) Tj -37.9827 0 0 42.5 209.52 1894 Tm -(6425667001247 ) Tj -30.5764 0 0 46.25 13.43 1841 Tm -(SUBTOTAL ) Tj -29.4406 0 0 57.5 4.69 1536 Tm -(CARD ) Tj -33.409 0 0 51.25 3.83 1479 Tm -(REST ) Tj -30.1519 0 0 53.75 5.73 1365 Tm -(TOTAL ) Tj -28.4619 0 0 53.75 122.75 1365 Tm -(TUA ) Tj -0.0299 Tc -53.75 0 0 53.75 198.88 1365 Tm -(A-) Tj --0.035 Tc -32.1083 0 0 53.75 275.8 1365 Tm -(21% ) Tj -30.4727 0 0 51.25 5.73 1304 Tm -(TOTAL ) Tj -28.9701 0 0 51.25 121.74 1304 Tm -(TUA ) Tj -28.2402 0 0 51.25 198.86 1304 Tm -(BON ) Tj -31.249 0 0 50 6.13 1248 Tm -(NR. ) Tj -33.2069 0 0 50 83.84 1248 Tm -(POZ. ) Tj -31.8175 0 0 50 179.93 1248 Tm -(ART. ) Tj -31.8315 0 0 50 280.77 1248 Tm -(IN ) Tj -29.6408 0 0 50 331.86 1248 Tm -(BON: ) Tj -41.115 0 0 51.25 10.85 633 Tm -(Z:0217 ) Tj -40.7052 0 0 51.25 141.8 633 Tm -(BF:0126 ) Tj -43.7682 0 0 63.75 17.68 559 Tm -(ID ) Tj -34.816 0 0 63.75 67.83 559 Tm -(BF: ) Tj --0.0088 Tc -37.5 0 0 37.5 9.3 449 Tm -(S/N:DB4700011007 ) Tj --0.035 Tc -33.965 0 0 52.5 9.64 382 Tm -(CASIER ) Tj -44.7362 0 0 52.5 143.43 382 Tm -(1: ) Tj -34.631 0 0 42.5 442.63 827 Tm -(C3POS-CT2N1378448 ) Tj -0 Tc -65 0 0 65 835.72 2745 Tm -(1 ) Tj --0.035 Tc -25.479 0 0 65 854.88 2745 Tm -(BUC ) Tj -0 Tc -65 0 0 65 926.86 2745 Tm -(X ) Tj --0.035 Tc -45.643 0 0 65 961.45 2745 Tm -(3.99-) Tj -42.286 0 0 65 1074.49 2745 Tm -(3.99 ) Tj -0 Tc -65 0 0 65 1164.85 2745 Tm -(A ) Tj -63.75 0 0 63.75 839.76 2625 Tm -(1 ) Tj --0.035 Tc -24.9694 0 0 63.75 856.88 2625 Tm -(BUC ) Tj -0 Tc -63.75 0 0 63.75 926.86 2625 Tm -(X ) Tj --0.035 Tc -44.5517 0 0 63.75 962.2 2625 Tm -(8.14-) Tj -42.2387 0 0 63.75 1074.24 2625 Tm -(8.14 ) Tj -0 Tc -63.75 0 0 63.75 1165.86 2625 Tm -(A ) Tj --0.035 Tc -25.2676 0 0 57.5 516.88 326 Tm -(BON ) Tj -28.5644 0 0 57.5 588.87 326 Tm -(FISCAL. ) Tj -0 Tc -61.25 0 0 61.25 479.61 265 Tm -(2 ) Tj --0.035 Tc -37.7675 0 0 61.25 510.56 265 Tm -(9000221498 ) Tj -0 Tc -61.25 0 0 61.25 831.85 2506 Tm -(1 ) Tj --0.035 Tc -30.5124 0 0 61.25 857.43 2506 Tm -(SET ) Tj -0 Tc -61.25 0 0 61.25 928.87 2506 Tm -(X ) Tj --0.035 Tc -40.2265 0 0 61.25 964.27 2506 Tm -(8.37= ) Tj -41.6176 0 0 61.25 1075.25 2506 Tm -(8,37 ) Tj -0 Tc -61.25 0 0 61.25 1167.86 2506 Tm -(A ) Tj -62.5 0 0 62.5 841.81 2381 Tm -(1 ) Tj --0.035 Tc -33.5038 0 0 62.5 867.38 2381 Tm -(SET ) Tj -0 Tc -62.5 0 0 62.5 930.87 2381 Tm -(X ) Tj --0.035 Tc -40.2265 0 0 62.5 966.27 2381 Tm -(8.37= ) Tj -41.6176 0 0 62.5 1078.25 2381 Tm -(8.37 ) Tj -0 Tc -62.5 0 0 62.5 1169.86 2381 Tm -(A ) Tj -65 0 0 65 806.72 2252 Tm -(1 ) Tj --0.035 Tc -25.9886 0 0 65 821.88 2252 Tm -(BUC ) Tj -0 Tc -65 0 0 65 895.86 2252 Tm -(X ) Tj --0.035 Tc -44.5092 0 0 65 929.44 2252 Tm -(10.49-) Tj -42.6764 0 0 65 1058.5 2252 Tm -(10.49 ) Tj -0 Tc -65 0 0 65 1169.85 2252 Tm -(A ) Tj -63.75 0 0 63.75 796.76 2129 Tm -(1 ) Tj --0.035 Tc -25.9886 0 0 63.75 820.88 2129 Tm -(BUC ) Tj -0 Tc -63.75 0 0 63.75 893.86 2129 Tm -(X ) Tj --0.035 Tc -44.0812 0 0 63.75 927.46 2129 Tm -(19.55-) Tj -42.6764 0 0 63.75 1055.5 2129 Tm -(19,55 ) Tj -0 Tc -63.75 0 0 63.75 1164.86 2129 Tm -(A ) Tj -61.25 0 0 61.25 802.85 2007 Tm -(1 ) Tj --0.035 Tc -25.9886 0 0 61.25 818.88 2007 Tm -(BUC ) Tj -0 Tc -61.25 0 0 61.25 890.87 2007 Tm -(X ) Tj --0.035 Tc -43.6533 0 0 61.25 924.47 2007 Tm -(13.54-) Tj -42.6764 0 0 61.25 1050.5 2007 Tm -(13.54 ) Tj -0 Tc -61.25 0 0 61.25 1156.86 2007 Tm -(A ) Tj -51.25 0 0 51.25 794.2 1896 Tm -(1 ) Tj --0.035 Tc -27.0078 0 0 51.25 817.87 1896 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 890.89 1896 Tm -(X ) Tj --0.035 Tc -39.7414 0 0 51.25 924.61 1896 Tm -(13.54= ) Tj -43.6575 0 0 51.25 1050.47 1896 Tm -(13.54 ) Tj -0 Tc -51.25 0 0 51.25 1158.88 1896 Tm -(A ) Tj --0.035 Tc -29.0011 0 0 55 331.86 521 Tm -(DATA: ) Tj -41.8264 0 0 55 440.53 521 Tm -(14-12-2025 ) Tj -28.3217 0 0 55 639.71 521 Tm -(ORA: ) Tj -42.9331 0 0 55 727.5 521 Tm -(13:02:56 ) Tj -43.3757 0 0 46.25 1092.22 1838 Tm -(85.99 ) Tj -43.3757 0 0 47.5 1095.22 1540 Tm -(85.99 ) Tj -43.1195 0 0 51.25 1114.54 1479 Tm -(0.00 ) Tj -24.9575 0 0 61.25 277.94 209 Tm -(VA ) Tj -25.1488 0 0 61.25 333.88 209 Tm -(RUGAM ) Tj -28.1352 0 0 61.25 444.48 209 Tm -(SA ) Tj -30.1242 0 0 61.25 498.85 209 Tm -(PASTRATI ) Tj -25.6067 0 0 61.25 659.88 209 Tm -(BONUL ) Tj -31.0688 0 0 61.25 764.85 209 Tm -(FISCAL ) Tj -0 Tc -61.25 0 0 61.25 888.96 209 Tm -(! ) Tj --0.035 Tc -27.9179 0 0 60 221.93 145 Tm -(VOCEA ) Tj -33.798 0 0 60 334.64 145 Tm -(CLIENTULU|: ) Tj -37.6326 0 0 60 552.6 145 Tm -(08008 ) Tj -30.9568 0 0 60 659.85 145 Tm -(BRICK: ) Tj -37.0975 0 0 60 782.6 145 Tm -(0800827425 ) Tj -35.7981 0 0 67.5001 241.68 76 Tm -(TIPARIT ) Tj -31.3527 0 0 67.5001 391.84 76 Tm -(DIN ) Tj -32.6962 0 0 67.5001 471.65 76 Tm -(COGITO ) Tj -29.7288 0 0 67.5001 590.82 76 Tm -(ERP ) Tj -52.1135 0 0 67.5001 661.8 76 Tm -(W. ) Tj -30.2193 0 0 67.5001 730.68 76 Tm -(COGI ) Tj -32.8611 0 0 67.5001 805.71 76 Tm -(TO-ERP.RO ) Tj -44.148 0 0 51.25 1093.45 1362 Tm -(14.92 ) Tj -43.167 0 0 51.25 1092.49 1304 Tm -(14.92 ) Tj --0.0276 Tc -37.5 0 0 37.5 604.56 593 Tm -(90002214982025121413025602170126 ) Tj -0 Tc -42.5 0 0 42.5 1162.23 1253 Tm -(8 ) Tj --0.035 Tc -28.0603 0 0 56.25 958.12 651 Tm -(NR. ) Tj -32.5071 0 0 56.25 1011.93 651 Tm -(AMEF:0001 ) Tj -30.2126 0 0 47.5 974.73 471 Tm -(TD: ) Tj -38.303 0 0 47.5 1028.59 471 Tm -(00046924 ) Tj -31.5815 0 0 53.75 1029.66 409 Tm -(CASIER ) Tj -0 Tc -53.75 0 0 53.75 1154.12 409 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw"1 ~sxߺh@<@XkrŽZ*#|8H^+A0گZJJEzD֤ղFZ=kJzh%҉rCF=zV.J)z~Zyy:l慫Sʉ|%`5=p_]JpXxz.o;KJм-j^hMkbV(D5R0"CҴZ:z5cK"=vEM\w->OZ+eh!iEKE$3Ũb؀a\"Aʗ@- -Ujע pU Y5\`Q Ȣ,Drkr[[]\/N=l*I!-ʲH+,aجOD@h1\ex"evTn,WBPWk+r2Xj4 BHĭ*" 00YaX<$ejڤd`B+T/UOMK@zW%c64528YM8i5`^gKY -V XJ@KeV0ua(-##°T]E4l&9mX=pmVMUH*ExbAaQ00@J0*x+BX0S EadB@8VHc!RRV6-itJUU`ՔD!bY іPD,*#)$!RJ@0Ԕc[[z @IY6J@GEqK!eafkyhB#XQmnW )aJYYeSXDh##DF-CՕ )(abi %BA dae P02V [Ta#,Ĵy*dWPidhV! P -b00Q"Yc:mh Vt U U YlZ,\pb0bg|KPPj0%X;o" SbS)e,H W `%Z9Xz%HT5ŕ @cV5qRFXe+[*),YPla2@kidhV %a*dF"Ս 0²MQ#oZaRGW,/2!~'1PB\k[X4 - D`RY[*1m`XT+|" {X|zJeq\<w^tI:nZ$&ї#:z5WX0w镵y ~ ^J5^˺eixF$*(ajHT0#G6fT!}o۫uHt.#x&r7O -XEC+`5]w`N,^z-(4}';Ը},uhnMչEuGk׫shZnΏʶ\|ko`. -JΥ GF@HQbkz*$tx@$Jk" COenJl6VF5AZEZް(DEkFVB\ 5, U1BDP)*exOO[.;&tN>3rȅ7Q>yVqϡV4 >7iӴ1m8Ӓ;V4x u|Q.X Yͅƙ1t,A򮱆Kux ..&fءFeaB21) JD0$ WP%L W@ !Gl붍AMZK2EC%EjʎR [PΐUIL0Ix[_g#ڷw^Rsjlcm[0< Xl(|Ӻ; X0abGX}{t6G4|}-'ͱz̿3ɡo>Y];539ΐtW&dX ߏjQm^YPbf@8 .": %Y$#)#,`XayصU B%TIZDe* Um 2XՌk!Y R55p)B@,X!X2B-b"A*bMCp'$2j[UZf%Ƣ?JR:A-U:cUP|ʏM`?<~z[ji`gЎ?J1zS `t[ D&HB -C 4¡`1T: `HQU%V*VXȪ0D )CAX*dXDd(,j5Q$Czx,YʙQ{5< -U74WW:+5]K7O5ZN#,,!x|ܮ^ݬl;~l4?,utõe_&W^Ӻz9滿jA`:iǺ1G7ěvNE !G4Y:v:-۲_d*e*Y%@a k#D%,2U\@ ]1 -XdBՋ]&ƌՂUS$0 H VWUJ^X,R/ڸ{BqMK4'=;yS_6s%yk9GΓk#?=st γ8]GL,{hv;Ow:qƱힹ}ӱr^mp[rM'?ܴ{V7lvN+b}Y`(^{_5 nmI\d:ŷp*bXW`(J VH "dR!& -Z)aYaJ)ڄWXkzȵFWP#VUq[+X"ZQ]ȨFUc؇wJa>܎aCfg`szkmxrmܔ>AcE߈jmsV NF<, -=Pj_8-4`TArQlCf7z[=vRAJbԖc=;UqsV"8 $$d"RU2\P !VaյVc*(ȦEnXO86KP -!kD^ŐNJu_OϑJwyD` T (@H@Caq8t. ۆ/(6~@[]͋'.|x]պvP}UfOz^p{;yl6Eu - Zo]%0(aH$*Ra - " 0!!$%IR[\JÈD m=S,\At([ILa9*mkAipɐWRIgEE5,,p$bhA:'9k?kg[G w+7nYvW:а`o<+x:ln'm46ߪ׷8yXFφyrŖ袅zo$C tPF*&ŌCÉ+G md*։ -+$K*!F [q$aΠ&YK)*gVXEy!q`%i0BEECG#P 4 W!ZXb`8ӪVunQ9 e|31:2ׄuI<~LuZf%LћOٵSs[6k3:"bŅ,-bB$11VŰ: oY!J؂ ,p䲫Bh,[!Th2PUa [$"B4lE0X`b«,Y, -Q+0\JXڥ ],@dH@ʤq 8U@ XEj油@hIS9(K0Z1T,(h T вt 2X`aZƅQPbBJHR0X&X@H)j (epb\ -C) ŌF$%HLG,5TImz؈VPƷ`)е.#G $z\J(krN$,z--XY|УS%b)l72,<4o@h]mbpy:%,s\@jI5Am -AՁ [ZW&3U1f WP6\lє?1'V5DqqކQh;zq~QjF]0޼njd[&'jv-X_"z+9{l%Vy3Ź`oNaӰ qw;>$]&s*$Xyq}ZV/ #bdy} ˖_/39MA=| BDž}d[sIH/;m~4^_R>utN#PY2D]5fhKJA7_G9kW&?9һG&4.ڼ:k\6l~s&W]QF"-pa!-WHX%tU@E+ (F \.(alAcY !$½ a [ݘM=CIX,$(P0 @)}`#VF@*9)`dDt#,kD+ 2e -sLoZbN7/5kd׵[O/~V{W9nd^eHtmMk\Sԥ@*XX@-4.:]̾2\,gV!uY }eePp,rSs@ ]يK-Ў.%B@eJ -VnJ*(E@X"+@k -:#]D*О,)]TYYW#6:q,V3V5ΩZ7˾+'NagKQڪz18/sx۷.ux^w%dz0y>S:W-:P] J_hCh盲XOb _5Nr.羉<"%hi #ekAPEYaEvf@Y Cʘ+(,"H! - ;W 1V *!b:1dV,A&(  (,Pc -JHlT&EB#XHUWJb#bs/_Wϻ'u5ͺ)fcr}9'CE&mM7f,50`ġ -" -%7SUH טYs5+6UK&YIeV2<6Ed% Xbb D1, -BE`I $ 0*Cd @aB@*1!D,WT!uUu(c_G.:\+ 绱}g-ïLcaV$,H  -䌲!H! ZZWdx#+FRE"3+-°kI=ZVd9`gZ͎;'&:ɷ {㽛|s0O~0<'eq9b;W<9=Z6\MƯYo󣕫̂A@HGQQ*TAcC. a%HP,@+BjY1`UZX,0݇oֲH^Al6myO`95tsv~>v N >/E'ι>5tݤJoHr9+ 05l76R kCg'LWm,,bޖ]؁MÂ;+N9Ok} R\ԢPVWZłǀB mvC0+ZlV R9K *$ XaiT\]E#^K,Vba"¢bXafU/:r>N] OT='[yؽh5qERPުj@ -B$3$DX<# -LnicwZB;\VQmN9}%EX#K̺^u%xfcyWF&θ)o -)]R]] $u#PL-ky+mcvQS82IPTY"YZE+( -֥W>T*Itky o3T.Gt#,$yGGdx ,z숮t*k+bWe@ -H \Xšİ6)L.XFG؄ d+V`BaJa`MI6B`Um)We *)QW -Q+eh mgz3^6<޺4[:Ea6;?S68?@7E$[:5CqգpIzEazf}M/;hx_z9<>pn63zr{5xp&fu1߮e#1!`6E ,"(:C 9GLVE@xD 1e"DFYna $VP"I $!ZZypV!c!mܯ̺> 9Fj'_?<#ǰ͇vrGָaz/3+y7¨r.qgsvk9gA9I=dϏ2l\sSri;qyO~G0%vnsѹ溽нQұ f@V SVK -]n"0%=%x0A^Ftd$FS2 -#:PbxVCM *; jD.Z8D[ -9Xqܮ*6 ogKb>s Y"pVn]U]Ap,bj;x4 VVkyoi"==+<Ul?JgcK9grf#o_OST9eK|W@4,1zJ^X\;%I/o-O-Go#5|{EMqa1\eR*ed" -B @e0ec0ٓs.`珉V s+C D{/d=[Zc[3"rޫ]io][+0|57n ktRdl`@dYn:ɋ'a`/|x|f2xFn29&m\tj~c Rhоlk>,m\fkKt_vi\ænFx -WtŪm8}洌QгGQ~?g 6=SuCq^"ti5߹u]0 }sҎ{GΧ5[Qz6׍.8B-)*qPb[j5um*8V蕑 JA,. ť -,[P %M[4W2[të[>0Y:c/ir9ONiej!8wU܃`0ƇϚ3V>j>5_5R|wfL2{/5Ϛ#z%*ra嘾FC" 'Pzv-0{-Ik;G$`5,Vpܳnj>9nӭt#mzr]OR[|e*ZW Ml@ -$XV m̳) -VbU6)BIHXh2h!++) X0`e`GCCyf7L[v\ܸ'zr+v*s惏@A0n+^n\SK9b Ju>{q7&{/w>wm.+{sÌy}8Sz'$ZP7M3s=/3ӠnFĭ\_?Yw]7tUC{?dZ)I]?Ŗ$0Cxd)]:u^O89 Xoo#qٳn.M݋mO<>~=H2Wht؜ֺoVpg3ͻ">9g'N1^9wKs\sLm<ۀWj=LX2BUbEz$,!dW [ -GXMqX+Sz$;:7پkM̦PhΔg [*u:UWnڎ/uiG\wM8|~o-r!<^e;?7s·wg_v6n79k0;ϣVUH I:6o'?m2{45=+ǭ: [!LKnJ[Ge zrn@."7NV+qnǣw:Yp'X3;z1cVa¥zQ HdX)RuaB`L -i"bVYeJBҫG ! -17Kj/"DDFT{ݵicz.ܼ3gӧU/R:DH.BE$y_<ظ&6ܼl6q⎟98>Upssɸm3uwvaRFM;'|\2Gt+x#4/kJp߇6豣ۣvӏGkpDq~~Ersx.6wq׎xj$,(w].̇5'\eGy/T}1WLfQ2矎}+HSNG׹/[/xlHU^D@ Xsa<~us-?9Sz-NKH"mĆ[&@q#]0! -yo Б #0(Jh!#%Cwf ]B SMpU`]BT8ÃT>4sZ.=~cxں^|Ǩ|Nf_GS%y6cqGCF|<_VrrQq]:ty& R7@ݶu{ֹAoO97PrӋ̜kb2FL8ݴLaL>vjΦѡj5$ -Z-ImJ1ՉX.h -jtSZ45:l[@䀤 j^Y(VPYaHeSFrweԱ>JҲ< L PX -FDdiK)IIuIOP۹^4h옎`v̳&F6W ֖#(:SNp;4)(Uz e֖:Y pd!dCrڲKExj.EY.E{[q{=]V#K uʣQ -` +@3Av 1ޙ=Z֎g ϟp=yo k1]OC=,*ݧJmBn7ɺ&5b2F-G]bM/9YWWf+Kh0o{[Ca7:aXzķۖ'[y=aCl PY/92rޏ=Y _]9uzxhFS!Rt{o[޳9/=f{NuK_ -D">o뛲ބb]]u]/kij\NMxy`s[Gg-ܬe,FjjaڧMQ -Yx+"SE՞=#QeWXHKhX59槳\U87kyFT[%}=^oBYLJų̻*9&ᶚ6l\~D)dQa+4XΪ9ظvXQg2w;]m;W'r'PL&^_zfug;׃NS{<ZZ6GI⽛QեݓvC.?Ra.1*g#c\Q{s?ŹUiCW+]U\ʉhR*B;Wb7 +X,ZT@ V -0!X1А 6H@VLK (9=^mWayv|<{JGa=U٣){xMp!jx\Cګ8CPic],eIe={=<[UI`B&n+Xدu=!IɺH*EZUѾ}Z5.9бUVXShZZU\RQX)=t0Pʈ)yВH9HJD` #4,P$`)\ۋb=+cp~c؃d獫<7oD֓UȜ -\63g6D3tV>\|Gk~# ׫nǻ=ǭ8;E֫o9gS+^ADZ)$T5AR›+%jhX*t%91&k:=zEJ'pZӗgs:FS9?VC3Q?l u5X2R\ P mP5VPLz}w0?`9׫⪍/qz7@QvY}YmNZGtg1^w8mdKZ/KƦ-PHKj2,B+_@Eť |WtNQcH* ޴qbobL7z{7.+7$V̻Oz?k_{H܍x.ŻGG2GYz;^qzgLދfd.7oۯgCEJ I#ʬ4Jk^#Sӌ9u9C~)ٸR{Ga&z)+\?񬑝빳ePPVj̴unWMgq7m+/0Hyey_?z4KT9ԭԚt%RRjRKk⫒PaG9V+0e`*ڌ&orv\雟ڌ9bVv=}~c48J7 A4掛Eů柠5$;!Yk8~fن5[km~USb4ͦOhdt}kc1]NYق2pJ|u"q O*598ˍk9`=f&W!ߎ{{)Ѷ]`̦ughx ˨S욏F5J},__Ms̞FbIt=p?ꉤ5ެbv hp7Fl~k\^ݐFHA Ǩ԰fT kb[ISApѽ9|܅us7G%#x2|:>Cjt̺w&6Uy avW|14 RÓLv -kcΗ5 Va:/6G35| _f0Bt sdxN !2 -u^ko# -U{cpmC,fgMH'Swk'rN?yևGYJ7IuS.ήKIi`E[泒\tt,yռM,8o.ny|ܟ9tV^nG qRd=l9_EYy$ l ,Ց`u@9F$EX@#H0@ -Ց YHUadB0Pr !e#It`X2Ғ[+ٸlf{9ii;okb-[NuMCaAxOG׌_aӵ#p]X2&ώкF7:we#Ӷyo1&`NͲӣyM4W&Ӄk&;}z!Rrx9|75Ys@զ ˩솕Թxo8LbWFH0R@ -@FdPBFQ)a `j -a!XIX1(Y`3FK%p0)l R 3Vɵp?8wL :;zW, 2'fp* Ƿn\-Szהѷ-HrtM4b͇ʝGq]c#:$Fy7[|9Wϕ1{G[]o L7S4pçQ9h(a)ּu# i:z".: \,(ƻW:/3\rSsN^:;?{ƑS9t^1x=^9uq8OA+GY~bt݆й99Q\gbś6}3r8&Lj^CDX|w?StbtfA3ln|xcmkf0!p)x"إr$v*Gf -Ū$h$xk>jjZ6)zA(/߹B=ќu&ynikb3h;EQp ^dnFN}st 3Gmx#zda@5em5g^ 7ɾz=Wj'M@@U" YI$ d|::63!uMAj}dw=ͺ)_nfTq0;'7mtcXش=2O<u&լftV+Uƛw0b2zIhA;niGmSZu9fOgzM5!_(:/V\ft qu;\!sΆBHDtaXr -cV*@YCpj SXhQBU,U`p1 `Ml:H:`e'_[írNz.G-|Sr7noѹyΏ6Ht^h{zxNlunz1ӡt n/,gTڵSHf3WvhۦZE UMj6uc.ϭʌwMt*'㲣s5gl{nqH RB=LXj#ʈML̿On3ԏfϧFd72E5s%qC^ڲ{ }ߥ;ecOuu^W2]Pxt}B 4"2 Gv83gatLg4ӖGY~hy /^lmy4gg$Sݵ߾H [8v3HmIks/>9KzGE}= kcwlAzLW@T1$h,`,x, bBId\dzmGȞlNv:J1cH1kjAf4o)y&'y_Y%й5 i8E^.o盟v.pe3Ն=ٯo0J|z_A_d}ׇY}w휢2=:_\\CpOyyN{.g.'7L汻[O54»JdMZw tQq9-M@蜗l֍`кExgecSvZϡI'KcϒMup snr:xYYc@뇖zkPbHA#¹tZˊ+2/=q31p{jKר0Yyцaz=˲^'{t<# Cƾx[$=u~|َgFrnHEUEi6}Ѹs#~lqwGfSɘ5m}"qOf/p7}-\},kwgarvm&sƟwH#_T3^ǔAk瞀R= ygGzIKDCnQ=XL _c1tv5 /.;sފ֎ ݹsQq>;b8wmp.}muWOO>ͤt#߿hؤۇ8pߢ89#cزXvݫ{ivo~=1`U oŒMӞm<6 !nuIٶխMZ!5~kT}4 ɲ _1"|Z s1f][߸uӹ/X%y)s]sGnڑ7>rpc8w/Y -ؑCC -    ,@ -LIasV9& ][w!(1H -rs})j{rÓux@D$n8f+xa恿'5MϜ>7餘#QW@QLaC\Avty`p5cg_9>ZԴcO[:kMHI!$  `I!$!$HI!$I,HI!$IdFI!b ,*b$H"$ CV4aP4$Z9ҧI79{! `#Aa>NsrڗSW?2]K9Ck؎sپ}܍7^Y" DHB!$HI!$HI!$!$HI!$HI$BAXV $ BF - @(UisY$ID "C 0efm/.pLΡ~t:N?xtHHC z{8ӹ<ջL\HTWg(pד>}3OįUm?pI$$@ ђI@ ",1H<1`1H`VR F A`,!h AeHHV F ea!  !aBV63h盹pf?ΝpkY>3耄h YH`*M󮄏 hh``$V ep$, 5@`TGd -T:8XXir@; %dsT, DuiQ[J+["\dx`a`H0P0"@XV4VrjD R@V B0M6e2LO7d׺q×{:84|T'ؐ6䌁 Mpʞ0J0(HMn+DB\," 5a@@"XVY+%PH̰( T -1mXa"0ʁ\FY!F2 FZZI5Y!fBqԉC]tBe`B]/ -2QAa(!BC4 (h!P6S`ՈYЌ(0Xk,Ҧ0LnPR{21ZzdR43}~u60v"Kj -ftۉ'$.Im,_'Q64|4&'#cwU[6Fcڱ7o2 o}k]J&Ҿ-Kk{ҳW܀7_ZZkGcLS:E%>+vsQkZiƭurYڜ晝±9ϲ^0Σz<įNooTz43{<>lجrqSxkg_Z6̬9o *2 `!RrN„8|4,K!Ucv0yW#a([k_-^$u72$p' +sU@DBE`"[PX!dBTjadR#DR3h`A"1mʃ H)1HV"Y§WQKY,-[+- [Q<,by^VSV\YiO$䆰p2 ! -fnXj`pcF: -4VXT+uF"Y4+G -EGA`a -\mo.@$bL$V- 1 r:gK@ c. CQ QA 9MEBY%LbJ $ -Jˈʥ 90է?buMߴg[D oN$ooqgLjhz9Zn;G=ϛ M -e=BYo!oqbsײ&eNH J@H DX L9B * ł ze("JTGPB mn#A.KG Jd$8J S:bmlu5yTCqj@; P:A\ͣt^vc9Qum7o.8]2++ :gp1hƨm/No؁{u dUtZ VeFDU"+»  MaZHV$9" `* qa#V%*#@ ed%UG"ee @H$X RIj",6LyFy|ѫzK&QE! -+ٰxU= +\g+hqTj+t5BAJS   uC%Xf8D21#!8 ʬ"5c`V)Wi[H!c`@ b)C b!#XH"#Jc3,@ -ʱXh*) -Ն`Ŋ{yv-OW6`=F3ٚ 6e8t֪"ļ6~ʷ2k;Ϣ6G@@Qp"<++WI`B+p0T-)h#֤)EFfHA S@:ژ+ZA-"*lIБH`V18Ni{Զtx=3p8Ԋ2ף>4iu?׹ ?WSd#_vb)|s/I*|1Sj9lY\($00 HF"TՌDh,p@kT\Tm%V؀XVKjH+)X*Qb4`t daPvE 8,z Pi!AZ oq=8a汗9q HEx%^|✣aI3Ta+$f,+6E2l(/aZflæ5~w7M\*^6s&VO^Y h>׭lWo@ .VF%NJj+KUTABV:#b#! 0#D%E(c`@A!"Xq24 X01R=bBfmFAoAXb!2%&O}JHj6MG-A2,gc!M.]u3ugԊZAÏv.MffV[kI7a׶#D !e@Hq${LTC@vYMBD ` S $+V -4B1Ei\KBY-9,VDdb CTUb80XRrXZn (0M3t֏ft Ȭ ˩ jrBHUk>TT&bVn樶5}ɤVZc6뼟}\h:1 6r@Uߢprh&]!=^TԻG}~k[?͛ Izg4鵭"\s0Y8L!R#ttjY֏<}s/}!ҧ.JW7w|)5]M+sNft]@]t|wW9Ju7$ss;5Wۏg=(snh[A=ɡo[ZfyHɿEz+Ԭ5p#H*a - )$,<I -TzE%+TDCrqy|>Ӧs^s.9jNXax.4i~.l̖69?K}2VgJMb3nDirc8`0?t/tØ{|Ӝџ:}s=>__y6}snwN8|^uWpYEߦcE߹scrnNm ɯ쑬Xk5mNWκ78+:@N{[[윀^[yJ&C t]4nk9gXc -W FX%A"4!h`" ~CRI뼰 -޺G?nz^ZN߫mj[g+Ry}s.Sy##Va3;'<é',<é/8tоU}I[Y;uΖk>952iOu#ͺW=]NTn.v? s/Cw7κ;Eߴ=w];зtw),Se+FK V}9<:j3R\QfHfŰFRC QI$ e20/@޿>Hv R *KkF&śXm=kuH+tsLҷ )VS7_8#ovѬmw7Kdph=+;'M5ZrHԳx,r{AꜻG܏W$|s]оsU51>Ö'|'_Co4^rlϩsEyWVG[3z|9#nzi0ѷzK9F΍.i;z.nr3s~ #-4o8; /QRUrj+ "+`A ˑF`Al8(WWU`qD%F d*R T2n XaӹR9B}M7Et2κM^<'5?_5>N׭m&iѝ${uozgs3m6rظ_g^5p7QV9/XRCz_й_3}.s*n,SQ̾~<h[;ygp9F2\_J";~G_nvຎ/#MxѷsNK=/t5RQu yOW'FMunFO;}ӟot&y:+P58"i 0wapVEVׯ8bzL\Z0皦׫TSjrޫzZW?4ywX]3͓>sgގժmƳ 3|17;8vkhOڣlҼgf9OVM9H9/9ՠ/O'g,?O| `:w1ҿ5})o2d<&3ɡgMu^m|ǩN%8}^?i%;?f}h[ͺ3.4 Ct5-Uw=Wn|s>%O?C2ԾNz)SMWQ \V3 -D! +dITjE>fP TJ]PVD,c&fcp6ɵkRzԜãhZN~%j64Y[>\rwCPFNjc fuܸbYu|6_h58pL7T}V^YyTNCd+oJ91}?תUWQ//`W9R鳙ssX3ƅJ6]yq>͏xmgrUyK!V&WszYz79_^nfYm:n_ԏ>3<Ϻo3f˺,]h}{ -Nzs{9E4/+soyܴ4Wٗi;~cquܿ-=~;)4_~x*9NhtHu^W0V-S )9bsC*)jVbIP,g}^Jp(YU\mA!b - -i\Gjf6㽟sv;c[u=yxd~o -;Nˢsh}cusrgp1g=Ż;>ï˨bs=VWw^S[ꜷɺ(3?hۣs:%?1\]zkuONAg,O rz~k엍Yu.W3ϧbrkcSLuݘ[t9wSl|˪rGw w\;*s_Z:7<1_TNcyLSMM'e솵ə#Fߝo/|Se3?Ϡה]DN,QՍ`U*ۨq$$AJ#$g+#('투R(!,WTbWkygu*k6*Ccw|Q~^I56ul~ۈ>hX-CV_l7yۗi>hzF9^vU_[N)}v|Ѷ||/)~SX|/&?>v+Ϧeq]8WN،b5.tJ [_YoGS=5p#/uuCD|&c5-wII/87E2N0wDZDϒCd0G>)~ Ԝg̭!d3FF$@ D̢r‡\PW 0+23 2:,!<$DX, X( d+6¦b1QlbRWj:TZ -ָ]0OV^a}e6(_KY`*+ R -' ,b=Jy(kz!IfrWJUVid% -9H_YBYXcX#*+ B(Fla`YY, AZ8$1Jypձ/3Lfsct'@s ]F9kW\'/Nn/QaR$ BQR{"ڂ_L)oL1 -JJĨZ -V-R69J=\ˍ= h+f!UrV,aU+X) -V+H-Wy,`:AAcG@H"@A4ÎBPS4tv ;և7SKQ렿GMewmy_umg$杬8[J`  -[+׶/97-N gYݪl;GjxɳS5sn^5h=XSF퍳teQa2 `,J͵RBbkC,A)P"WeEA$prYSfFHHl4HGX[A{^&7={`0t O\^ζ=x/{w -M{ Qf|>tG-XVB3+FRP(ϩʺW.1Ln7m9_Gה{Q׹gUkyMftBuOӹ ?njx,]8J}<:=4I*,D`QШbMK)#BT$,Vd*BE%B,`QǬ)`Y+#ݪYlbJ9"y)b \1U``5ն92;70Mc|NOZy9q jǻbK-znG-m{9{4lN]թ^IW2d晫uȸ+VWd! +tzHV;$ $y -TR@* ]VxUA^tgߒw|W3ʛp1zٻO8ɪLM[Ƨ=GP8J2ǑKcN5%zZRk^ɳz9Q,F׎o%QBMtK˧JCVW Ayպ-ů:ZRXk@Ѻ;nSuW .buvWx&?v;إKGdr2 $=/g>޹OF9IѱԃS.-o?:->s$f EfB)QB`@b#  k#@DʥJAK` L^SLLc6}so^W8kN}h/ 8?fg0Y.Nz{fnZ%cgf5~D}Ә[y;zQ׎uչnXJV2 ҽf7rrjSSw &R^zJrMUլ Uڵϵs̶K?腊* $,ub$܏\ޅZ#1y=^E~߾ه|[_9~9x,DY(ApGF $5$XD,jD1BL:j+ .td`M5ˆ֫{8=6Y'!.oe?s -0k=ţvJ7eژ,Տ.Sf4mƙE繝V+Hy -BWl'Y1~`%^UWE֧y b -tZ0>7kٶZL+'UږÑ@Dr*) -*S@0X9%I#I$ !z DdR /b{I]^UQҴL*BMU\5-H~0;vEUގgдM -4\*y}gʬ ,$ E(*HȨ!%vF uŲ+6Y P04Hb ,"-V Cb`J鼈 6RHZ)+z[* kjqA, Ha$RH½d1.Vb -ŀ@@BXP@$E`YL>zq}_sNQ*2X]_n{Zf_7J"Jq=h$U=`,:Xq  -eWt0[YaH*(i*"3CBh#(*ju =n[mA VDd*XRHXk4 AQ!G ] [! ua+D hGP"5%uiI D]2Ttn\ݜ&SjS匓sJ(3Vj^{Mh8өZ07}njV5B +z)B,"FkI,J(Vy%,0UrVb`BR-tRHZ ŽK5\bX !Ņ漱jQEaĂ0%pD+AI+ -?o=dδN+t%XrO.ys=6{wN7o0^o'M9 }ÙaL912)ʟ'+KԞ'}~R40Q% +%VKmąQQƄ2H bW $ `Cc$@V -J쨊( ̰#F$6#Eb  -Y`je+a1?ͱVW{p\GM#s9FSoZ9ji={ ^oY:77柇 +/b:{Ǧ.<I}2yD - hVZ,W h4q 0B@"@C*BKX#ŋ. E jQᬭ, K* -2F -JBI,Pâz%DҢ\j>ug4:ұ|\y {R٥:G9o -h[T)d=vJ@zzV_-+G -h\CgQ paKdBD!*]XBVCI :P@ -yjAQ,A#(T"(V*Y+:BY#"8 P0d6a/+̛,;^' ]yEfXϑ\z jqrv]&WZlntեa^s~|iy:L&uD:j~3u^Pdz`Q]_z /)4_?W5 u"J,5-[q`ȕkjkV%vVHR %()p(p"RIĘO-w,T)kd"5bWD[$%@CLD"(;.&?[Xno/Ec]Vwa9 KicFֶ8z^]4ljyaѸSs7CvL'?7 À7>s9Cշق=7tVm1շ-<]كbvbz+5;WM=L;5ȺHU9IЎmwʃu6aZ1\uHHXCTт+ -C*WBՂ85說FlCH`Q-" $h#漕lF2pͯ+d1>UmF?FW.[] ؏75h]b>ێwfy3_mݵ.:/5NƷhGmYeY3Ti~y[39yeӷCwU=x_-(6oWny%{j2YaqG EJ@-Qi@V$\`)"p#F8Y %e,0w)+B)KV,Bd e@j/Ԅ$Rhb ~1CziI˩Lv{:"45uhtLy˭Խp9X^ow:O6: e`H bAp -؎I!"* CKJ DYXM(E5a `nAa`3GڍC r=Q:vV.yT^SָcJ9LGN]O/e}?C3~}Tt=XCҹF9z3^#i{ezD]3ͺ?7MI׳˞aiGV#fRiDƟ Fv.yߔzc.7%6zMSՑxA4lAvl&dNhe{1>lύ2:'B .9OWӏՊ_>xw T~nFɓ9V9~q5O^sz Zji+K+H 5Na6PF "@ ^=q7(jQAjj$*:[ !laSd\1K׶;՟л\rlצiFn<}ޞ{]/L)9yr:ɰ~<^^BRUMg'SS|f/J_]uP-TaApvJIi@ZkRЌ{<^ -붒p h$ĪYksуr\=v 0*-U-w *,%qVjԡ ,s0}֋OIج.0旓ד} # -FhV/%V,F#'N gאQc<-5ZYPABBi UVa - -4ԦADh"[XKVmbĸ6b -;(k x !B$V CCA`bj-<ղ"ǰsj*=9#:Heq F@,B`NR-*\?4d<ya X \, Z 1TƢ !HDxI m+#iJX -Ajث}dxYd Z,EڠbX3VaB2!d0h$(B[?#-N[u]fX[`F@IM p1b R4Z· 'EC@@hi $#i 8`hPC0S=V jGbE_ftd%[]ʭc"A@+,jj - P;) B!IHKIZpDENz^K2% S= eU [W{K< 0.I ƒX1=y/JPШ`r=dKMNY+ab\UiTIQڲ\QJlB=$?ԠT"AX[jK\JPP ah,_:X3+FFd^c&MklW`3xAC,D<>+ד6s5gz^ZT-̈́`/?Pz[0V  D*q *=3VjT|engTF6=am ^gLx}cz9RlVsi_!вT@匫{f y|?534!12 #$05P`"@A%EpDBCF4O>Fuٮ5ƿ;_u `#dO?G덓=D|#4{s~)?Ƕ^'Ou=;]mOݧ}_YN7]~??ܵk g|>I~nOS4G_Om?/?/4$ɧg8d(c32)::ikD{׷[zC˺an*a ˬ2T K_3q϶#3~Uů6X۠$wsIֹ#HV^J]kOLo0BYs/l/AA:YY_TmN[76*uZT wr鑊LeXg-._,T~bSV2US΢ŗE }~6?OoRB+ s ͽ?,<۠/fik<8YgG gR1v5j9gCQ'v}^#VZc1П3^^8(zAlXr褔! -횤+l?겦U3-\f +y6-̎b≨H(q}^-R6~ORZqfXV !v`,b-@Q(@HPlw8G5ٯ5~mq5"7Ip0ٮ']1 .aNEkE.:Z?O"q51 -'K IW2Æiū0v0Zd1k*/%P(/bo\STo&`ZZX鲒\:2E r.)>cό(ݥ#\#ViO{YݰBN]uJi-UםJSN n2v3?v˗ʦde^~ybU9[~e}[c OuIݿ,4V6D7.t)Z.oGc<.nto/, [QᤃH\f"҈ -IJėӇ7k/_, -*XLӥ UTabu>*f$P5$U-P:%+`F>ݯf W]ZsqI3sYx}T{YnfrXr:ZJV D@LDX:^l~Xd5&q;#?G``-s!`C^iL'Rx,б"{aF qgd8+3#1155Qfɳf#sG<.ٖ5ۦ܏/*K. 3<ôbkE`tӿ^`^^ŕ/e}+l[PU:j2/fM*\kD|5soZ.]@B/fxΞSzu3P1n>.8Пz%ر?KZf13ezE V\3w 9jCُޮj VJ[zr,0YVi]MPU.48O= úg.\؉.w%?Θg;exlF4,o1Ӡ`jMpNۛaEK嫎2Jeywkzwy5rtv`@ĦyI]XSQ+Myc8oml|cRHjͰԱ(mDrl+\?)O&TS(E,|-.2Xg|}]>v ܨbٛGXfS˻C+B|= j@e{Qai%Gnw{sR:)~yl{}|}T]_]8Ү3"1oJvfu>ťO¾[z "N\N9[^7ob{` Ƴwn n|d/c0\nT -MswEDZ@J7BGERK.ֶ+qĪ8^'Vbmwuƿk=vw]va@-W$%ke -l7Kc7>"C]=}kgLkDlaVěž"ڤ|EpqYMF+6Z([lw]y(Uk].N"ia-;+mWca6K]1;'A8.D;"Ao;[VZS,@` -" X"5-GdUW`+ 2'[0Zzɬh&)udrGئ}i[φ[poXk2$='+X`&lƘ, )a,FXIl/j<`ǂZa(]l,*YLX2cIb͌H0]mR) M"3KSmFؚę,U\XwC\CMC -F6BK %a`+ o -$Dil.*JZ#;.f́R8$Q11t˯6۳͖`Uk nq81Ɉk-7̸bGde]G~q?\kkvkq]\Ic\L{dn&pVD\׈l \kqq@BY 4T!nxjt9E)q̈́q4^['3weOεzg`۳+]O/mM%e3g 1lp\&[s*66Q~ O%/*^tSf -E[R9wiı -s{đD4U.m&a(eT'Z\ǹ-z '}&ɪq*Y.l.,(\G1"sL"kO˵fZ6qe}щ[y>Y 1ċ,scTe728^, -HEJ.&@~"G 1SU!.f:޾Z2(%( %PY-+*ۅ"Un]q5Ƹ?LA̻c4bhDkH8τGf]`"`Zl8+Fhl';5a\T:Ƶ+Y#AHrËӌĤTUf]ٴʶZ.v>kk ۯ8\kh[g2fp|~="he2 k*旻V]ɣkxwT3}gCv{O٪p}#K*}FNu\ _Kh7ſtqWM-٦>fYe33܀iYԩ׶JMtB7Kwʺ9!(ΖB9b\ kRJm]_:vDaԏ*O5 _#Z0kZV7 JW%MN +WKehRөV] QfOll.tS9kC&Px3c3 &sxH$5"aFcm Ř|2[.*fԠqYR6*bV_>qq-?-ZܧVWv:߁DF}Z(0cc*xČ.j|kekMq}0V1'Y1Vw؋CnG g.QP%7voVM0%Wwh^8Ba g6}cVZ=`usSf5ICNL͢8V{iU oF5gE6?;KN`D6,oݮ^0T9lQ;[C(hb3 kN[-p6i{S>Ql6YMb팷`fm}D^pk|XN/|1zavwNGZ׬;/C;>_(:,2@&nfVLE(]\Q/9>m຋  -*a;\xRQrJrjQa%3ևi߭zٕPʪoNvY#ƃPR +McO-1ypiXH"BarRK٤[X@_iF"8/Azyl8 2LX#lX1ɉKNG&0!s(gF^#Vv;: t lj""6pSZv1*f&0g"]%lb+ XvMTj`gx{},pQQڂle8kXk&'{@c,MdND#aU9"rS*qgƸ]:vۋI 8X(Ł#f*hlSZ`"`6smd`^jfBbël]s!\$}:^((.$X$C15ٮpEz'pƊwE1kjv/Rgt_ZNp?TSسt+fkôDMz;^YdĕB%A^ΡKp*8zS}6^:.p1?uFpw[)P`yQc22SՓZ5prf̧6^'f}{e+{Mt&\,HVm}FC*_9rqocH - -~7-}rt&ۅKB彦'W5WI!鈈yeY#Ӳ};'=e6Y򾁼gmPFjەgnZzEX] y+쫃p hA6˔)[Z:z;F\bīe3_vi9iE,+_R.R,؆E_զqӔzso(s,oFx8wǻn/*>"Nv b Tq 2M{9_-Ǹ̼ew&ܭE|:%9wl3SŇE]\+} -< ʣ\YWG6džm|G^Qn[&c…Vm1 rqvVʮ7'ne$0YH&Bj(h5Ux47yo7ZGS7AtVSLdܲh07:f%'8;ӡQ5ze]%D&[n>ª$7N%HRB'55Ɉ -3:ru[T*)S)duҕWQ\eqSZ%HZp->}u.@twAk_Fdc_5ƾ|'ۏε5ƻgUs(GVk-p2328/$ ݽ;^%#sm)ڰ)ztɟ pZ͖U8H0^ +jZgȘ -0Rc-r <epbl[ҩN5sH&`7㈽bv3gLq`Ҳ(G`h-al}Ld8N(L1\Z<[|,d썓1^Σ05N"#ܷqqDcHN!)X29*Ӆ(; -Jy*Zp_ Jk *֍"q^";ti SXZC2Stvx#X Xⵒt[W$7f 1+lrNө,>M)l _ak~fu5Ƹ]bN6X)7dY_pvvcAX#ؙuƾָZ\N55,)dDS0<fr0U2 >?m,- ?ӪM=YʽX3ϸ! -ks+J6>9Ҷ9*6ȉmƾ1рB@q'!F&Myk+˒1K?3 %޼[~'aG6MҳUER)VWߓ3k hf5Uc ˀg]@p u\kq5ٮvq3D#Ȯ@XˁYo,@N8p- &49m .hg0Nan.( Ƃ9@8ScŗG!`$$ - -0E}vLgnhff:pv,zՅ^Q턇 6uh[2:`('y` nRP&*J+@Ս4mI!`5 e#b?(规ziզMXe{ _Agc02 !vx,x -2 (8ÌUUWlwAzG:nbh..Ncٓ5uA`bդ[ o\&P1Jٹ-}{-Yt$23mp#Sͼ Vlx"- - -RtRf= */ҹf_k3e>{d=Ohh#B Cmƛl(`C;\Qnu,ǵSZ\fWyVA s$lYD5%umHT|G'7Z`fv|S7qx"͇2b:3{ϷiV\߰Qv,!y}}>5Ľ;֭Ƒ[0/Î~ݤJ)0WO\#z7YF2޵H:Аqjw1(k5ƸٚtKVqhnV@澫wBSI[rVe1؍keJjv5^czΪ`9zᵯ Ֆ\!/Pwl(o1˒A[eMmpB${n7O -o /m:IO;9zAyekTcryq;3]xJlhq2yiQnSBH/#bS齳5@p+Frޯ#!bSUgrܡbdi`{+ ӪqmfyǗ˻L;zsl}y: .Uf76Ts_1{w- t[XȚ W~Ɍ;5 B-$`JZFh՜ -+;j-taTUV%Co!ҕҫR-h©jf۶f$tUe=ݸ 2OC8K5kP}yB ⢯Jh&`V3֮[UF50nWg6Q)rޫH+D ː}u?`H,tt}~v:_jDK85VŃF<1P -P2xKOYx6X4pG/CVh4KӪ3\i5ƸLN78&'X\ K^fZ z۰HލF$I"~Vλ&vm"LM:ċ-'V/jY,qŘǹcn3'F-=zn2iפVC.au<eSJ[/Yף2\fbi7e=jÙRIڵ7 TIek187X)X%I,ő8lsE@iF!ߍZϳu58SsU48R!7,-Z`nZc~B-S}kt1vnPyzM.VĘElvfm@yivY,(;fXk_w_[@YZzT[ě - {xIVޜL3Pʩ_=…%kgBT}Ֆ}VjS]^aWC~_G쿾V-IDufCSt}6 Eq{KZbĮ%ֱ%^d]+ýR lP>`yhV+Z'J9g`0 {r D#Ifm$I ِ̮@VqmW-C9u'.{`}סXwQ7Qž \*]fl]:^g/C,mua{)Fa|YFZt`Dvq"A_eZt])HĝeZ!=vU zL'e{Df68A^d,[BC34L,:uY{.K_eq`gUf_͖ŊXkDj9O&xY0809Xܻpxצ 5kZ:\Wٜ|5֨x9Wf;~[ڈ9K\ZkCDaS>YbA8:VR.'Rٙ3~$S=l{JbT*)U-Xb4FB'Rt&`ao:3yJu(G<8ُj}MtF9ne}ye>yK)Y[vt%۸1PJ$)1?#I$u]B$_*YìwբjeF8G UL `BoW:1 3ZO!/4ṕsك2~,Cۙ^-ʧq)gm?{v3cW-٘kxo>I@Χ%{VկffDnv_)MWq4t3&e{|f=.#<ӄ|=Up.c[;S`3OS˅v#- ٗsTdTyW+nUu*sAe[}&Ň^NUCG{r\0;6 qίkoS0(ZzOcOlrA8j XWUT!15"bx^8u[SdFs26]C3aڼj;.-KRt.jc f5)W ܸGq}ۈl (q%o1 -ʫ]ƒ9Qxvج`5໶U]Ļ23`\N) 0w8rf'(H ]KcfݒnVWӉ:vR;aaj­B#q9FVQTa?Tڷ7C/1bqN~?1|wõaKN8dkDsSZm28,.aڷ -P/0j*C/nџhkΫy: -QjMnSj<}9W>{sD@ -,OBǿ'L%.]˻OG'sLsd|SU+<ӣ__rNk }Bo0X챧p8?M^Xz׹17Fham[EWxi$:ޭZӔ)lUGsU^ -KWTeXYmXж8\7*9 UL6ecq1Rx0WGzӣXk(e3sl^[A[a"}_Nόe()q-@Ň*[YRIu!dl8+nJFkNXv+FQՉ*(Z,̘i bbb}һ:PVkabiU>ƻ5bv56Xb";u7c3fdgf"k׍PstKt-M0؛v!\`q˝ioՁ?0-QA]v`İF eo۶xA6n*ST]֙]hSBz""~#YE E_jfe4!zPC*W -yO59y.̭v_G5󋊔e^swf5'Kَ.(Wne{z6nzrv!9y@M9ٛtB\͑L9NW,G-5ۙ8Q c;-^^h-o鸜^|?bz?H{0 mb^_Tw+w*&f< (f}4goʻ|Ӭ.]L2Ǐ0lwyaM vq%b[gfiA)A@6 - -?f4F@-}BC*$hk)֤D&gcn\NK/b sYnaNuB9눣jA@K^o[/\08CYY/3&j3pꐪi̢jM̭v'yKrm­иʹhnF6l+f>fiOCa_N,YO5裷(5zәujM4J9w.b_͡8Jy:T'+~?J^ 3^漥W a|yLkki~l6GSl=<]4;3nm9zՉʺoMцzײf:M漶Bo09 b|>fk?VajQLD.9X 8 '{unʺOWL]ikNڜe]LМ9pu&y3vق*pe In>k?[naY`pb[ñ­ւLlj3rb4fuٮub婯 Dھ%bqjŪfiJ6FLeqc0)'YcYbtA"Sp_UuWJ8?S٘3uFgЫ;I㦺Im˧#ý :Ҳ =xs nx9}m `Gyaf rcV-󮼐f {A`gm}j9deUSC=k`3_)s?yZ#[SҷWe}Ro|o)}S\k`y|LV_ շs$]o\f} -ݵp8mzPCɱV< 3?_UᑣT<8ke] U%_+~Śt -uY'p/4,]BUu%h+}W-`%مhY)eh˫p팫z?D'4q*~iz1bts4z9T֝0<ƾ.>RJk]fQQ5l+\{ZkBF1e4/FVGo0>a.r1mgtrxeٚtY( PfK9B,O+Ӌlq< ]6Cy{׭ -kUhm3m֌nS;#(,ڨ _&EJ%Wm2`ƽ~\6"цN+!2|@[11 q8q0-8V^15IV( WYa^el^6h׃]vVu8~~bb8 -K4W9};VT\PVs_YupSCHx~#]kk}}5 -ׁJJ#B{M կB/Q![5; ,V+֖*vO2*Wfe%zWDl_t\EB 3XQf2NŹb7X`Pg}.+.6 }閺^_l*9{e5-L"Ͷ"E̟O-i*S@6jojP56k -ݷb7+T"uR*1s`3-f ¡-yw_M-m3;-Mv\:um^۸)V] u6hAY [.XB%P¦9LZtQvֻx/Xf?PK5ʫv24+n->Lr]pQҠ.%Owtb%Hf^k2gCypuer<Fs-*.xN3 ƻZÜul2e!\c3fl'cA"+tӢRbepk<^_E0h?WJLp6Fܝ+rJ)|>grWrVi?3^ca|TgMj+*94j5u+Rկˮ}lw2!~n730>ԓRĥQ)f{f7CwrC`#4(b[iNϠbplJ^diHŝ!>Ɇ+wu%,Mp2eș48Lo1b=W+oDEY+T -Wkv>>l{ h(($z@ ^k< hViѭ\"#2egmW;e!^@b -3/{\^rGpMg7{ƪʔn/e^ٱƑV;6^}Dp.wۚtgmR /L^v/f'Ŏ+!yX9y~bVw%83)D 06s' EnV}/otkv־eЕ;z FH -_G2OU:5oU-[Ϻ/w\²bwлK^W{Z( j}p&~u&JbМҲ.\b/YJ`.baȦF&b홧Ae#˂HhU Jcov;M:p&Fw9rI~_ڳ\Hme}&2m e+ƵȽe։totjM[S `@\9 -]Jh2pi8I(̈` ;v\Ox[-r󭊎SB Y|g,tJ<2L#0,u`,ODM@bT- fqDNbIiW= ]1cDDŽFR兡B -gN%IR"U``DLKVWWrײ*[Gj\ݓKT#-EP3}i1eu/(/;F"eK*uP n4ţ<5SA\c0叞u,kLcp8ZD VlFbuTN#O5ƻ56"}q%N} Slo'%Ćf[&t3ioū+2-떉;w$ ?1n&.uva57]U -M߇UVSjC`e&y~8tH][/i 6\Œgqk2J3B7ksV s6-ɒiw5w }G/K vZpH?R5L:{G:b˥AҵyuDܪX/rգy㈀TO-_mҽɔp2bSwOYgϿ̺(_Ӎ>LCo(^8ޟ;:=c)@b,]^)n]Hܢ*HFKONjd|uإԱeƻ5!yvRˢxV]Z6[ӗCnǡG.0V\krv\~Ca\:3o2f^֏k`./x^Jx.~lS3b#R|,*l}JlJ"8ܯi&V+Ʊ]:E'Qk_S÷w_ ը)eN-J>UM*=k8lخ;{81Tf]%PI/YFm2g=].e侌&[F1Sz5evЏH4nN"0-S0߷F5/mӡ$j42_]\kq7vk_N/{KKX2|_qi}Jv[O,{fO۳kWڰjLyF3J:;ǣVu1Ӟ e W-r := Ӳ1W*SvV'5B1VܵeD]JYc-lg-Ap qt+Z,Uu(jZzJo+@-Vc>8xyb5X:f -Id~Ʊ\D{`#1Xbn1>EՑ0pKl ZF°!1#ۼ"8 #1)5`\xWm"8(f|@Z`{x@qUeF9qmN-Xľ">%۱+¦I-`i6O,xe6ZXQ)+=Ū1Sg R*'cİXS-y`M))[ &v*@œ> wH5!RHQX=#.+ѭjJ7e{rb(xk3nL -ޛgOuTl~V7"* mIxkxF!vۥ}1<Gڳg0Rj4Va[6X1*}v` -N,nKӝOCE4}z x!{9N.)dž"꽉`Tcs!A+.}Qը9g;,)N>leSY!vO=[g?.G-aҭ:־z.׹B~煖an35̋s//t)Xҫ-vnټ'WnvI;YC] _&j( `f|l EY 6yNU =jS5H]a@@n-X_ -H +K.L"l -k1Ww]i.)꽅Ʃ}(,kl[[,#LXP3ɥiv:]2Hab.=jݐ`$]kP^-o{6CV-kۀ -̳V -Ⱥ/x]E+$ui8is(7* SX"U||X1ej);+Y$*֬=緣OD,.IWaX;+1# u׉Ja#EqaRkO[ ]ѩ>d=z'kݖyZ)@+8AٳX5c|pU{lKUO80zX -h4-p -WeCJ+#-_uV #Mu RێMx]&KX*vt@#8YcAxik\H Y``C]\l2\ X-eCDHF!-Ŏ"`D`ސ7_ ji#+1`Uvn~K0dA. wTdJ@gb`G.){VKl8 lύ \h*|TV"r/K8b߾wO|N+ zƱzt`[SōzCA[ȳoSVZ~IL8^e U^{KTQ0OAtoA1j(jYW. MQ)9i9|ķ0+.b8gjR+f*p(-i.4WJu[z1f$M$ -=]|V=hc\G;lq+9kП8`XC{&"au FoOevR]'Z+ZZT*(JvFFB`8w;F!+L8+ŒoO֣lϳdun2ΰw<l* ]qzCSԤ9\Džͥ;$P -ݮ>~ -]%yX.N˴)U+ }>^ݻ@n61+_(=;z]PҋrmN/8*⻸fV\=0;@u)m8Q j}q;V۷У9lyWeh -ma)5~0`bMIDQDK냣1"yIB jZ"mR Ymbۇ*t+%p` 4b6^ pÈ , FP¦Z+ F<@!>HO?/O>|D'`8'BX&,g"bv@h& mF"Jq#Y!^! lQ,,k5L %Xc ޅgv64`Kυ-3XJAQiC+sV 8;9 #JIpUOXGwWP+W-'WyTa Zqlmyby_e I%~/Dꇳiq,ʧ7ujddӃ]y :H#{jR 5~9%côpV@Uia$)!m>#v!p{[L9D\*a&(:qR* pktqgWHV64  0:jDģYa>wNXrEJ>  -ŶY$uƪ -|Vc\*n`o.uP${kE!\1[%1{N]Cղ!,\5#?M+`O=<\ Vݘ)oN;j!Ud [vizi`W+KkpthlЫљݲn-Rd MW&x )td -[Z[Jx ;GAyӉm-ؤ2lO|aMgwT˧fk##+l.,|+ Y8jt -:QHo[ {*EE]<5ׯ+чFkd(9zuTuHm? I.:y*k#Yp -AC_$]/Ul];=ub6FV= -1 - Ox)+>7 cǯOc:j9TəlÕ [Ë=9m:o7t(q75jAo\aDK0ΡO:U'bJk^&5ץ?>HKCk7mX(UX'z&n8CKJ?~~6"!tc 1sػOR>BCeqԵu%M"WX*Ok X.,O2MgͿҨ$0X&ȧe")"tzi[AL8%@J֤?cZVb)WIUK1]Ǿ5eŞ>Eβ -᥺F. -i-žaB%)'SPF\c(#hDUX,q31 LH`Dd07B'd1 kxc\xkkUE 4(N"FJ +#9!`EB8UA%C+rmiDF-뢢ajV$6qщwr:s(aV.ڙ8Li . -&$yoaV!U2v9¬sNs! |LcN%Q mfv88' lYQrb)0=NH/ǃ1Z( *q*=Y_%Ff9:҃j01_ZD-#MZO]\vZL$1{hYE3R HyơG/"p 2ŚNR -E~6++ hˤT^8j`(*IʀYa*|j9v/><YZ(kC:<0bF}<Ζd`ڍQRֵLuZ{v)7N~wN"8*8A' pM6 Dez:3ܘᷦ}:SmwSXQ\1£EYho؋8>o(=#) W.c0VL8Ž'_{)M,ѩ\ -BP0VeQSg} -](Io'ޒN UnT|a}'LpR{-#L Ӳ|V~Щѱ3󻉶Rk>ड/} QM -Y"@bJk? ﱘ` ̖3@֫Jq:bM`C;Iw5j$LHUfK(kص۶2K(ŕ˿ O*6Q,ܮhHNOcĮBW^ -7 Bmm7;=e3襋zJ78$bFbհp~,,RwV7_k x?>Ο/M~3X]0GpX -#Չp#1xA73Zlە{B}SPof)x_r@zd53np9 {m(7į-dde< qmL)ݹ7-8IXnk`EG[ q)b$-w~e {-k4)UVRD ؓ*DiP#oyq6AqH#ewت1EZ ߾ SR8WjD뀗w1iF!]MYXnMe޽" x]U/vIpl6t ZgzM7+D9<(tӇv)T Xl؍ԧ%y58-4wiF``f' -اq&ߤw`3OgOcOoO14ƛ4ƘcLi14ƘƘcLi14ƘcLi6i14٦4Ƙfyhn-.LY$J9;65]c0pY=V|3c;WTR!*Ro¤tm۸iH^`v0Ч$j q*:4Uwu犪Lͫ$hu3 :&]]\f?/LiLiiLiLi6147q47q7q7qnw7qnw7qnw7171ns717'T' –,fx1&I jOryf>[1GB~oO;GOGL 10LUrej7ä^0\MZZ!:8‹ٌ{ -ar~ѣۄcӋ^hPߨO6iLi14ƘlcLi14ƘƘ7qnw7qinwcLi1nwcw7qnw8x㇍ncsdGwcwƘcLi14ۦ4ƘcLi14ƘcLi14ƘcwcLi14Ƙnݜi14ƘlcLiLi14ۦ4ۦ4ƛ4Ƙc٦4ƘcLi14ƘKi5eFz`%`Bcm,ΑWEX}3;j=f8~͈nw&$p,IXNCV1Si)jVF1wY*&X Ϳrc4ƘkA nŜiJY3;7.J͵Q4kwM}tZQx̔L(,3C -V%Ѳ5bl~٦L -KiDTTccLi14ƘcLi=6i>^4t٦<"/^?mFt٦4FcI^y o5e:sQ/CإncwEĜE̵/H"Om1ءbzj=sXxT%/lsfDE;Qeez o\'Jp;K&_`vkύ+ڴe -Rʾg0Ni6r֥ƌ8#(ֳ,̄A.Pi)WeqB8Z>,I-?f]Z:RkA+B3+2׬ ѤfBSii >6f1S]3~clFˍUuNWs ·j>7+8UMyefQ! {xFW V-+tnؗK7l1VTϸ -V-jfdo:/rhuZ&V1Hn+!Vo0fjZ]e6R -\9m ޠ):2(ZMeШJ`1ksj(^iG3fݞ_p6\Dnrk֨fu*jB@;e̲H(Ummn\jrƵ71͌)U=$_o-&Łuv+u(sl5H0>w7Z7Ҵ1j-ٜ\U`]:2n!u -spib#/+I5r/*-̼,ಷ9$rLb$V)U-DD#E1gej9TAXUAR?K:5 *%*#LEZ8* -VPKh Ҫ`DF&"`Tjf5 vRUYRo_ՕX0Tol6x鬙B~jCcHLɰV"bbv@^wZ+tmf7 -Z+ (~cddk+"rY;*Ј@G53&l)Ѱ@Wr T;llPP(?~kac.6h{Fmt*坝O1)ivYh89j\[^*J\l̷j^oc2ucKbYKG2ԬbxˡN!Oh5=ڔvqfeخ?(WAՓk˕dU/gfi,_r ծQ̃5]XY&;uMTW6N:UOGAY7s>qEM.GgՓ5*3 c7=V/pT1`k @xºԲ21S1|Y%P2N,&)`L,M56̹LLei^T]cEkaySãlսʏ16 Waּ:Ub Mz10jS0 -Zmm8 l-OO@+e]9Sumfc8,,3Ac3żp۬Uf4^aYW*Ūł!Ma<>zj ݪdVͺ `u:_-vxbc]Z T<~W5p4)2NKs#B(aO X~k_qvk ޵z:_mb*kXaX`u6@3}JøHz6ܶH,n%[ˌğ_5u6j"7er?j\j~7+˻-çu4͘u"5;_[j٘]Q6f67 ;k&R"fmg3^֗ikfmg2lid2VQE3V^kƇ0̫.JkM0ߙiU㙗Qͻj~Y>wTvkv(Kzs:Vk⿩9WwT^oЩڇox}X -a-R>ۯk}~^'2/ khX/1ivʼ:DV傼ݺ\~WoS}빱x7>-}5?.$*)Lw/l#e'~9Ok. ìv]s):T];kk-1?36V9kOԶfInhZ,e~'\km8_Ye=*}m[Tٗi6ۯƻ޿t|3="ciK]J)0Yo_zҏZoVc`]N3/e}ο3\kLJۧ~;}i=?zb?'it{Zl6޿x}>?7]$kA c1l)ntIO̟x}\x:cV"K1#BcT$Z-n& p:MUW;䇩DV Zk;[2+x(~^a ZQyq n|.YOxfkaOxk|BasϺ:/1emZl֩-r_HFd-ebRZF,(7C ,\M{|L_vC5˴ -`SW ?}YLE֝lq pԣvSPE5YahcE[bF5(W-78k p4ꐑR(Jf&0 -vk_u/uK//^Ⱦ,Zw2rt.]jUk4ʵy)W>ï[l46DG\iL)g/2"jr38e<Փ^Yg0ǻOq~^c]je5+vN2MNu ec>-ԕCg4u޿31rmSvvUᭅ_c,^PΕ ^{oyEUY&@_tV"Nͩ'_^% qzʹ.i䋄p -ɧM|l-KTRRθ8i 6O<b%OPH -`EoS1&0{T"&b n'ep[,>Wt1Yݼ2ӥB8Mk6KeСs PWc[t(^-V^)NM#Lace -Řm-9&ouN"V`bfAf51c,l!&Rt$~06rUq>yf㗊䝀v̙mw1bNݢTm#a0G`pKTD1f«s)FX`xbaLAR Z〝톰<A,#H b#`,a΢3-xbfnծf)c\Am1P Cg5 ZNd b#qR)g0Xذ8捌*2j۱LPW T$[૨5֝ɚVdA;"0@$K~G< ; ĔVZa!dèHb* :0$!,1OsUf!nOoI.0bqb&5XV8!5bh0YAnD&w*&|m-dt6 n 5(YM^D嚁èS5SD B:>'v)~b#mx:"uѪ$8a|tWtX}YJoD{Dt=6:9K1.::eoJ(˷!ǥ_|ix~u ҷoO'i,]eʓ5|EPNn,EJ&F%  -"ɸdk"舁d4?S5cr&DG%o ̧ 3 kU'bQb$9{t861+ s;*"^S3xe?Xۦ -6[lyFn*pAImcr*UzH.uo -E{>4vA<,x`Ć[t(Ԟz0a/T`wå_N2cѫV/:Gp;J]<^ޘkN߽v-w_ vdt?(<闺idƱå#'gU{=-5F@*ƕ>aEeB'4#Vt?(?CDKeMuOϿѯ ˺Fl@;JLW Jm;]c-p]h[{p* rVa }On11Aqg -=XXOFa3c{O Eq)*_ sXeA9rP< V$jZD Dg-~>[òfBX3bgۉY)vqk5[SI-KKٲP+RZ'b&I 0yA>2S wQcX[Qhgu8C]E[V"kbmh G.>dSJ8t1Pƈf=-zNґ._ӬaDH2Jwz:DH.; -]bi,(g߄_`wj}׵kz2[ԩAic~Aޅ{$(-?>ݳVӘzJ ݰ*-t5WwU(ޗjoٷ:W6to`oۨ"1>z5kmN:I^A̻p~v8t^Ң1*hn1 ػb{{Si[>xwML.c Ln[?o>E -k6b2JVL~%vXe,t7jr>vVÒ9Փ5hk`dUD>1[K._+Nq#AcXk<"F -q %DG,%j˪vT*K!d-czt3УlXB -m[ Ll[V^`-(,.v:&p$JY ] 61#(0Ĕ VA$#&&>>șw{0Qjv5 flb(܉ -0<}-pn ]t"6;- Wb[[;-rQE.Qrup£dU^SC*c+,80\;  yF`ʗ"`*^"0#+dN"<\HYT H>1<e2 bӲ]9 ]Œ%1"b`}?:|D 6s; - oX.$l -| NY6,9cc%LTQ);"LU5rE"lt^lT 9;/`QXT{9qDDD ->Ve"%B6kL* -5^ ]D91T]B{n Kf6n,~t_O|G/z|El~*Y熸F(d@0f `KCذN9,=eM#T0rM0Z .WPrjq2J Ҏfݩ(JIw'DP)ֱn9, O0[a -mv΋b>i+]W036+5 kfY&}2#`x1Pa>{[X8nK=E"]ҒsV`6 -.{ P iK'l=$| -I/)י$"g|ScŮqORsy=;(c/a~Ÿi]NX{WY맣uwzJ^Q?GW.q{w|ҿ[zTXoOW}wj֧[%L]2U^Bmq{GgSU~K=tp]]}LkJ^[5* = -ZnFu]E~kOޥe e18WVqj}5G»* hq[g+j/tѽңwVYL[| ;W/{ыS}ӗw:ر/q{KcW_/^X~>u_U]}ַň.Fw8b{/}L]_eK=u˝ -,wS/tuu]YybGΣEtmqZ['vz1KgZA}L=sL~3-1c0/8ֿOVS -t-ubF]=nw{[=UzF/}W|WVBF<}7kb~W%KDw;lY?*]k=zoC^Rh8Wk#Zv\RYU.z=s[rfs䮬ֿ* XҳOF1[+CU^zsw>]FյЫ;:^-tF y/#Щbu8JZ^mc\Li4|Gj#o5z{ڟo{_.qsf]0.oegC.vé_jv8GF]=nu{S=tcƯPQ{w]fkt*#:^:v4za//dc_PꧾЧb߅aF^^lP}SQ?][vb;{`pNmKׯbBw8N3U.z=s[YO0P_pn>okҎ+lNOF1W_+GޥTEΥ[΍)t1^޸vƧmoѿ֯bFw8c1R/;\.c2fs䮤nܟ>bsWWFN⧨C꽁^WR]{}NbuG̽Qb<.thu>^^G:t:3 }>gv0y_SKoK:[ԏ?t=mQ7ƕHkq0=^޸vŸmoпׯc/ΏD=yԟ;\-c_N|ԜYq>p}+:qΧ^|E%ƋӣQO9`=WԳwF^oWVy<8ҡ y{}JB|>3ӌ}z:{]^#~(uluTmt0=>v\e }03/Uz q{es -]{z=0#ywlgŸkoƾ#^=|>1*X:;·A~a2ye˱{N!y+>vǩ[}>p uUH}\},CGʟ|ԾRz;*v:Fufc/?0ǝ^eϖ#YFp?RJ|zozՏyolgŸkw~= -;\Ǹ,\g{eCc_q{c,e-Y䮤yku? p>upt:#0PH0zv^ެh*>c1׽93f,?RЏ=9C^K?^[]Գ|iFiVmԻ};=ڇke{̽T:A}KW11yq2WԜZל̺[] W4rUF)s Ga衂Q -~!>k_/{=WoT/QЌQ⏧]}Vww?Ќ  1eaއk2'hv?Xz[.yg֝k^qb~Gscs\<՗יzԜf\-^[2,2% ˫[uqos./\*w"na8QROK^܎ -:13h?aU_byK.~S^k3<t2h2?^Yz{}~O(;ZcVqt.wwf~^e'W21l,n3/9_Rqs^k2U=|Gөv{1_ިz1OOπƃDž N|Կ_RfƷ,)u_◠|Y>-?rު{w8ˣu4;FC3/-zoV^c_cusO.intC{ݖ2ޅqs/9gU?R1sf~_e#\hƕ?>匷 eK={=nmus;jcVq;ž|?]9e3?Réy徜ӈWTwyqM]YbA.F2:]LcRRϚj^W3Q解>:Կ˼̈&g:s;;i3[}Nu/,eLeu5k?evt{K}1k?ooqG/Ԝf\,ezrex1>JN.w_1`~Kܳ~ʝSusY(zKGO/տԯvڏ_0#+Ǭ[˽_af}YշUKyY]R[~*쿹2isf=y eݽ#3?Zfqb51c4/^wcs]~c}6mwgaWt?=%ӥz=[ZsvzAey>c]ޮa}_af#e:"tL0+(&1n4LOt-x11q<~qF(zݶeť031q=AW*Srf9˴2ƭ~_U*14$Čn. DMj$\V#h4/UM|WDta+k =Z`5pP)` `+F `iLicH2DDDG;cnt٧'fޘ ?xG{pBSnbVm(anf0כtSa ->D ?NոCl].r.(nYQ*-f*[N˖NNb9cj\b|ͩxAf9o3( 1^ՊZJ,븆pG/Oݳ9Hj,~}c leV"+F#3bR5GTP<n0QLᢀȦU? bNm\n⬯6\6rea'ٞ?0jQY$ב=1i]_|r+ ~'-MۈPeCV*nlF_;AXPlbA$x0 -KOlgu`y|8fM~>s?J G_5"81?ON9kS700g<4U2/k-*NCGw9/( !=H9 -¬Fr؊)–*>_g=?6Q%83͞daހ^ŠԞ.Wt#HÕ %"053DK5"#dƱ0;H"#O'd@80Ymk9QaX-5»8Z,HʄegkYخlrxP81c -fƋ ^+>.`Y.@4JxAF! -smv8cABz򇁥:hɇ," 5"Q8a34Ƙ'114Ƙ]?>_9oKñ9cAlO6G`{E+CD6>*#o ee6CTv+_^3}S1F5NO֪x޶#ouf~-I -q\( Ƶj¬R!'xfR=oP)zٷ3?11_pƖĘ6Rrtbn gqκKvֹ˺W{ϞpC kPeЁǼ3mYaRIVx[.^# ULae-u K0NR5h@?}1s QIc*6f~i+E.3lFõ#kzn9 wNSjߺ5J\)U'KvpD7k짧33, Xƹz'QXBQrx-Z8\/vULb'\f^qMUk[Pa,i<ooj1-ea UҀ)M :5|[m"#d aW}ѣqSṞ1\gUnŸ%9gKK %# PTJVf? - ^* -XXURR5%{k!uԹ! - -cF'+|M -0%/vfA\ã_)݊ݴM\`V?QmwӅ7kNrΏ61x+Q^l]C\ky`cdf=n&nWY1mcKs,f,(+8:35$\vJDŽAF%F!8< Ɵ> ("5м0^X_tmM)@36iLi ǎ `2Vam#1Xđ9‘病0Yּ)2(0ŗFJ j')l`W1^d:֏ aZ|84ky(G1 ߵbf:hر` -֌6,]|f5og%W)L[ -D`X -(|# A.hpNћ`&[ [`SL&f@u(^߅+PM}.ߧˆ&W+x4lYa4ަ5yw.Di"=oکo6b̼#8|.(Fo*F`iJjeǽa${:u/8kb-;d4}v K\SPT<|U*i'§o nȽ): q$`8vwO[rTlVӱ>ݮڗom4\:V]{FWM!{&kSfUk5*\%/ª1W`[ݫ߿fSݘp(~6X6X[Z`8uĠm"[~!V{j=_(XYF5”\{}>ׄ.DZ#BXk//.UmyǤ "<]b۰po۲`f*Ջѩ8b X$w{wxO^0yyݾ_wF̣w] 2ųD,-tOհ +u2> ar@žڟAܹb؅AF ֿBiQ̺1[e>~fxyn.݊^T6: a_zh&fk@5ѽ lL۷h\6|!'ZaqT l`qZ'-w2;SDބ{bA*_X"ڢyV#wBy;39[ejBC ROg*t7wl\>|a5Vq )Eo۱ 3JHFEi(,QXi);dv|HKۊd RHہ'oUR^r ۊ+\D 4Nɶ~qHb`cqm;а5 .+@^)Q Q .F0BLi14lik@*֎bq B˺8hjПnƱnn4*p]Pl6ja+L\:,~,a7ecvTyoW|8>f s -D/M]p8\Km+~ͷc.-<EhI2]% D"N `"Ȼ!V×En y,q ⭦6~42Ղ]E챂ek -d6!#[i)CU]ƛlxu*fie^rǸ^y; `X˧]F+Pc'qM&fXQœAtG#ܾ{<#SGFyy ^H7rt!ockO-=B؍rfv):"Cku!w}n=>*_[j헗3 ?@5Ů˸+) -χy -H{߹nt)?Uf?_hζ bs.uS,چsvwOi -~y"XҘLtduE''zv3fJB/ժcj se3+N[1x}0U$x^8֓ \>wOyr -=4sF4xZx[Sܟq/95N1fMh,+3VpsSx} kAFz 8Zeظh1iYRwT4&눧xj}@-@V3 Gytѩ5"aiZ𱀿;rxH/.>t*_LCT]աݲl_MӇVߏ*-!X EF'{ldJR, -6G0Nq6`N! -5%V -5 -0Q#1"6>3M m+%mh/w BVUc]xHbűTIZrlkGP -^FIUcfA9x 빈 'e.7! Tݴw1rXo.;w_|6`f -%`,ˣ__:צ[ՑU -wrŰ-0hȣp"akG;% mQN`8/΋1`յ-+6!<&4MmbȪDhXBcᐞ>%Z+ GC,ǣ_[ʥ;|w~#g2WNSˣݻHfm&A0UJi-oz\(M^Y(eUkPw Y-"$`t*6d6U -Ƞm"#75VHOvfb8*\)U4k3N? O|vc֭eѭF0=X@+8,7073W-`d$N)E119iF -,nX̌t~,ֈpF]fs7*W%6NodJ~> {"7F Ss2W -%is^ԗON-k]#xUwƗ`b#R#uNKz:Sb 1-X9+n:hUB&Q Xi"D8Vא!1{l=O ,#W:tXPǸ׈0lw.x~Ku4׸۟gOcOcOFN`e㘞ߙo2_ӷ O׉TvAPL;YFcP^c`85bqs\l@Tx <#Ne8_"lڜOn?5{2<͉Rakpk XfhQT `& D`Fc4tum{ cl6-[< -껌~;LZhоb510V%f]cT0$R8 "qOcOkM~N_:nvZIF.UeJbx_я:e#E81B+DZޟ?8m۴$-1swBJ)*&,mcdzt`LK` cl< Eђ{"|cI֊MF-zݼV_:z`9K=Oy -$K`;`9uAP2$]lOeMXtH6Yoo9S}uMiY͋s}E7KnU)[yyx\̆ -[R+ДXnNOZ  6D %Jײqbp-Գ,WX ƘbVŒr!'twL=Ȑj bí…lex xV2on[`}]ҷf|V/|* 0 *$#밁mY<]'KE)EYZLgdJG֘l}Xپ㊨c@8`~[.Oblq[RuJ* hpaNPtTMa$fK*?.F] [*}-.Gh_]Q+M!1lAZ].voOraR4EO -KW;jQf>/ulZks\bU>Mlq!s?W;e\ᦚpd/bBCzlA-,q˃̙Wbdj0T *! -0*x`!aF  1X pu4cLiv#F9b-"pL8>.k@S3w`֢SX]4!u,oY'=K,{m}b1 }Wy8TJ5:!/ Vl{$8V_ -ej8qqcnDa-ebI1\dl,0>=N/bYW%`"c0oKcyufaү0#]ҷ݁HwQѭf"W۽RMTzXze2u++̙@qqdLߔiٮs;' $bk[&$:j&(\; ~o\4RR"o?JQR -V,1V`pC(ވ 8V,T4 @x+' mr,"W,XFD_ ;({ -5F1#cLi1#lFΛ4ۧݢ?ycqf"`l@yG5ǰF!`x-x*q77S$DK +` Le%2x>הq;H.#>qT]6O*Ż| V+ -̓Y -XtLasj!(n)XD.6^l\Q1v:$%*)\)hn[͈LsoeZlU,1q򸚦+"ZOlϞ3?(dEAnߵ:W0UX&Ztm?-V_3*ZXfx+ OqCDzrak[],~|*3S]RF.veSTعR7-~4.d!?tŇ& -XyXƒ/[BU l vrP .V*x}?7]໵X'qv]zr;,6gfa^& {g>x_з'Ɏa8fU_M ց&tmv8uʪD1s+3(@KvmKLbدaYsY.F4;c]T-&ɘ}P9slVj.D-]ڻ뽹?ں ܝ,|,bZvfsY0Rdo^#%bmc7;ݻO칧38}pv`GeU*5qӇFk?{b} ]Y־.vmZrZ.v{x0Qo+RYT@2Xw@0utܹdܯM|4djSxY}4n)>t.۟ktIeqrDžmg nN8˶O/gX+{\yw|T0N'W2=*g闉4|\iˠuuq*g֏mpedƙSc2pszWg`EsyO^7RrGc -QU'.&?8ak4}l TqUwF^3V"g0Xm5^[jb-(Ŝ[Ŋ]ř(eM#$qvbⅩcmYo -H*ic@;0hm uxꮄLٗ˚VNd\%iŸ<̀r DW(lHJ Sj g44p]fau\ k,MCAġ5~ZVYwk]DX6l0 N*)G,*\-mH6M@SY1ɌpU0;'l{cLicr7161 X9ĀM  -%,F4'O6i1|>ϙǞv Bpd"#y2P#p$&&[^lfsvCd-Rpbqwp. f & -Df#0XqRr 18k8Mv5%"]U˴qJ͎8Pne4 -|Xlu. 6ڦb6ȭ_>$LX8dVw1<[kb32kn&إf^fd:V1A8ݗT@~o -bšUE2:ۗo r]xb0c~Wlu[ -)T&R@ݽ.i)2lBVwA -jԗUs#N-պ];1Xr{A) [U a*{ڔD]Ѽ+Ej.fteB A?G}~~e,F;Z1QeǺ];[]n2yJczۊY{ں=]ͱ,cz4gLWbn \4vt̶&1^(ػ; -d#SF.U]_ƩFuf#jFt+wJ{zP9n=5i$uaöjSwG̶eެ 4'WO85/@v -u-O0euwC.úK[`U|C;b`0#@ixeqtkC]h{ݭ#{gCP*PAqTk1B5P·GUGk-k9r#[l~ģE -( m\^c%|'rKNwHǂ2ޮ/vVf>eѣTAZkk^]+K'ٙ 92"vwm™JQ˦%wZ]O "ZMgt2E"X -!q+yOw.buLMi v;wLwF+2 `G.|MTZFBp֕qctP}adS2BV*p&82^Q& 4K3YZIh+8iRbi2nU݊^ mmEYw+#5Yu9Kp)+TTE65+Iźx.,a)*28X'b8뮾nV̎OpX@\kqoc\kqq|?=Fii14ƞΛt٦4Ƙl{ZcO%coc{}q'f$kiJ>$%'\kk,k_5Ƹ\O#y{G~Ů75ƻ5q?c\k]?ϟ&q5ƿjF'Ȍiq?lf&1>_f\ N%Ɉ,maXdmc:1V :F8sWTc^92C8߱}v>94E8X UcMF9cF9b,'/8X'1Na3*^ qI!1AQqr"2a B3R`b0P#@psS4Cc°?W'd97Nx^6rW/KjV1TpwJ{ N%)a򣺣 O`_âO[1K7sѿY*j9(;Ԟy-0O\S-+[{--: -}J|\.TvROfSIG929VTT-4x"+7{SRvžf>Ts+}T;/1>]xԽHs~jRW[)y;3ܓ=/2,Mz"zՇ[qQ"=J|lK{s#ⵏbWZ]/ʜ'OE'2sv֩;'h!M͞+9mJ乿WUGhE~Ԋ\Ug͚)QMd(CʎRf<Њ0FWYj[N;ՉR6&PVd;D*Xl]hq^շéFVՕ*>ݐS_[Тݳ#%2WEKEXXhG$`9FKxVkv^hy5[ GTd#Å&I֊0CQ.v/s LxbE:ȌӸd>n3ԈΤ<,g/aC3Bvr>^_/3g IVHq /;B%1Svl)s1h2S#!Ŕ~#$1ì11)Cc'7{'wTv -ey*W)MmMTv)Z"~+֢(Y^n#sA=Y[.o[Z!?vտd=L YI|;_y_y ^["q[ODMŔ:;o{b/_ -۬_ w(+)zT7;'XJZYzm_\ -ܬ -7͇lkا܊Uٓ>2)Vq%rH>df-E'QE~CQORnQ4Q|=E)SP/rեpߏErRV㶽)ԶqCWc)ڭ>oU}Bvo뢧OrJ|pVCZF2(}Q#(eR5S(t*r|fzT;7)SKz.^r^h4''BqWE"VvY&VdЕX7¿ͅ^g6c?/21Q^X7wd8~$95}GgY[цZ۹Fw3GhٸD)-rn_ uF;$܉6XΊK"qܙ^vQv_GGo^Rډ]| %$j_xO}FbpވҖcV:V:)0Jk%<e5ELEn?3qddI;AGKdtCx(r ^fo#wk\E(*h(j?g*X--%7SGh\.TTdHȊ -QlN梽)kd͚)W_.(R?-)ZhvPbNڟ#oS0ow) o\'4[dehC2n_)f1׳%*/ -ܬNx ay?_b'ХV:BKW -ffbK0)-V*]ySQ.?LWbȩ?5zCʾ -IqDU(s$8iRQ;пͅ^\E giC#Hmr| -KS(*S{C2)%[1G⠗1ڸ)ru>"*r|z[̭cDx"Cb*$M%7-za;ebVQԴvk)2]Y-d0#8l"XR+j--&և OrFbZW,T"M*47v;kd[-z2+YI5S#mfvҭ|&/huܧDZ$$7Wy -ԇ1Ԏţ BKRyg٢i- -[EFWe3z2 -rG=z8ݵؼG=š9KPobt'a+-D)^L'zQBN>1_+)+h;=_'.bhG&Eks:Ǚ;.<"~R"?V6ôRkoۈb0˙ڒ/buepeGh}HʴRmG;EOu?lV.,dv -Z:U7#k((um)}<J?OIqEx -S-#J&GϨЫFZ+aR rȣyYOE:{?=LKyoE~tCZc9/G(حŝ\ -ƵB[吸OsEܫAn;wKᐩ.#ȬE.UįBT/qVFAL"kz0xwr-aO}ӼN'u dтSXN`sI7;Կ%| -KS)=uK^نLjҡW -[/yzHDkJRݰCgk;RޡL%%=1íe|/ҷڙS-ONzE:0=cH܎&c:qM0_1ElDҤ-$aMx٢vc;H:akcِr7zhPr͗lCl4թdsږ1='9RSۨ_8\K JWz{ݥ -+fE0kJY4(Zpcɯ.FaOv0rMV{+Kx٦ceצgv޶F;J~'/^$jQGz,d8^\f4թ4 %CCµQWcmY&=%CB]LW*WR^#E=g%-ڬN!Ky7-(,&?A)#Tm9S2XdQ9dC-U!Q'{^Hй悔ݑw<_D6PŧZ_1ӶV* n[r0o)'N׌uTaB^f( C;g)( o"Qތ-0vUW=t(iJ^=d$N;BK)/8Oq[Qy]QSGqtN_#_4Z̸{_jq?jCZ#QEn}GV/6řhyH_cRjZwVkYIF+'S۔9Jڌ-Gh)mȉ+sc~=eN.JZ˩G°+zI;7+Hc_(Mlv)8jWN~lQvW;ԗE8+'QRUfҊ$ގS_켈++9TRU;NHvmbO;j+el+)Sgfǘr&Z'JE5O;~+DvܪQ^g#xSÇnL{+a#D8+*s9 k!Im#,.Z;R/@R[;"3L [{" -Vvx&"Gj:;'t# -G7<0/8\ca/8x#{ëi9Knm+*} Bp -t\ڳBűL=fyn8IxDȽ(/EZHb B5~bh7Bh~ -n9|%|%*9mz#aQe5}ȼ^9C*YTI"o -Rm1_+H%imR,묷S~r~4RqvBVm1$J6aYGтJJ['M^,T!9U-zaӞ-–kS%NY;F_GjF[q^T*,-d^ُ1ft4y4Z+dJإs"1(>\Y*xN1k(ir̛ >*sYOc -/nGg8~̌M# -zsvDgug9= RIxt4}h/ `E3ұl5?Ii5PW㉴?i1K\4&w5sȌ\q vGƭJMfb{:xvd܊y/)?Jۨ=3_#}ؔ^VM2=t#F=ۺCd\)fG./BR<4^+Ec0ݦVزtҖIf7h_=IJZ#9,֊W^e/4r%vgt*gg 2 %.,R+\YO <+r2|)Џ]5ݾQC#?a?RQhd=8Sp{ -mg`:)68On:ŋaR޻G{'QkxNQY=W0IdkbUIˣ: ;vĜg󓃅a)NOYF54WkITS'+nwщ3W-Vxe_!-zp_28ixGmcuKZj告FwfxKF)k,.y-W6AV'm _es -ߧ=w5zirG[mOaV*2g~6t-9]ŎW16 <_G٢񍞜N<o{hik~1ϱŽyX8jqkӛFOMe%}S)'3Ϧg^gbvu GQVKMLvi :N6gFNeQM-/ KQhbl"iF٢~gMyL1rէ >c´p5W-E-9WS>`~"FZ|M#̕඘c9ѾD+SW<|u./ >?i1M\tZ{hx-f,r̦iJ¦]ZRʟ*p -D䝠M-iu)U'-j -WUj'QoD*ȣ*<$|ث&^|{,~8cdXxY -Oi/# V"ڙ)%V h&uh^.u>?Ə :*Rvrފ -081О-"fTbOiySGhTש;}=+8H;J#PDȩܧ}_DR!vwY)J3* R[bWOІ eX?™#蒎BP#*T]#'SQ:w75K<KJŪؔm!F_*&T)BFe"qĵϱy>V/Rm4zvbi7rէUcYg-\HӔseDKEN齤i>nV}E;g,6+K\ʜ'}UQҖY/9pcŭdV:YXbE=9YSԃ֣]֕VyPͅLNEZ벱x]Zq%^dC=Mܫʫ#:iX0]JW<4=u)zQDjeo TeNaFRɿٕ9YUշP[Mz~nV}O>b0ֳ!mi>(QB;ҕJȟR> VZ{URZHʊ -JP}vu1(+- JO5,밢M'ą4 *9\]E?ӧ+p [E< EdG}T 2"*'OqBQyU驪B+? FHm>}ʜ oJnԧʊ܌\_J+NL R;1Jv4d,*b;OpiiB;U&Wvu~w)rmNd-̚ifclM|?2Zv/y;+DI_#{r.Z!)Os={%Y֢*s:\qWs9+ݾcy_ -ԑhcU#zlQEB fT ^6%gcS#~Q5<&L)2hc e8ղ*^iP&뵒.N - -axn*z'E: ~b١ -vܣZ™BW2R/bhN![tWN*Nnգإ[$*z#NSXP+ נeN?a,v6[4 j-!:Yl&hFԉUZޟ)K{Xqӝo#"*DaKUŝ/=V%*Mk~+Ghx^EO㝊wh" ^\՝޻lkʕKs:y - fUZيPFs,uM\O{2]jk;9RK!v?5tyKEY k3(Z:-ba{20_J~*|V["TN9gQNXs#%-;>JyӲzia!Nֹ7X}Re֜'7_D5}71AsybO"Kj(C9.G|U}N2w55;BoT搒٢Bw-jKVB%M/>wZ9?,:'LQoj&ŝ8=rzh#{mIjµ?ab -U)j)ɾZ~7J%zoo#]K(t+rIl -[aq)Y_׊^U)#wԊu#/HODBPԊ4o4JꐝY -3Zծ5v܇RzY^bjnxxȥ^XٝHKjfZeE]9HJq4vWbxvZiu;et睋EY+}^y?GW;}Qw5|, ;ٶN_43ӖdqZ0)AZ>b*+qevS~oTv-en䍊TMlţ~^cRGh0&/~rTBK!Էiĥʎݎ9# -wJ\vbnv]"tW;w.,.݌8|=VQ2xWM`6U3Agh9j;?q_#I/[b&V Oq*EhNY|v~+r2Jkn hvQ'hVU^M6ys;Tk'^yV9 =*W>(SR~Z)q)eפʫ -dT>[̵?”wіbQڟQu6N{9YXS*čdUǕܑJ흅h휄x|*͟bpj(NK(1՞&S)(MXte?! -rGif,0Ed8k 7g215|%X88崍j)Єg):U eZ쩍xd(E E>b";ULRhU T^EQsÏ;Rۀ_%ŕEDVRxvyWIoEXճRyOxvCˢvY+"W'-QȊ^v]EjٙRRy"?qhT_}RKij;b*lIon)asb!Gk%'!ԌJOb1ZّK*1Iغէ/į%A)B~S}%;L+ޣìHSB(l,Ա^;`F9M,_"0TGz#KnxIG=E'-r8&+!QEgʨeZ*N~i;o<_*U-e&is} 7/K*w?ЇA-Xq̭OiUӣ|cOwIC/4s7z# -5Tjs~&;v+BʉRz9%E]xӻz+M)Mk;=HN;;A;l‡'[΅{-d]yaliYNyE)uYJ+d0Y{cu8J2`QC(r[GQH?!,=J6F)}}mT6}mdN+rK捈z禝eXPd4gr]%,6ݖ3)劣;ak wZ{o=hP2Ql/4tU^GgGm:Q׷q׾gn=΅n'ċ[/"QەQE-m_. r`[,v>z|^Zޭd*E9SsWgN2;G)pLmn%ES%,_ 3K)>2.ܖ)_6CnR5QdšW½zeiIqE>d*B_|ʤ ;hVoY y蕵GGOR'V{yVqBr܉Ҿ_գԏ IqEvG+dU%{Qҗ\US)I[T.,ܛPXoWE'y=FkaQmYHQ髊p!f*BY9fuN* +7ω(=LȝJHRE+[Zb^T_e.^)zSOT͚Y](Ӌ+=r)s%v3+Q{*#S&Fmj*oUӠ˝eDeLy<aە2_ :F7Q8Lx6bFQ7rz>QRJ.ţ,Q~1Eeb -Wċ6\ ldp D\v0bb tYydžhdz1KF V:BBV={mr'U't:e'fxk]ݕR}wJrm01Mm/fWR׋܍ZZ22޴Ok:xZ,(,bRvbįRWJQVXXeWeUSISB3w;VVs_Xa ".ֺ*_2#=䠡qo'6c% {EJ -$Qvn+A']<ƎМjxy[$ -4%Fm̫v_\޷!gWюn#hAbJlK&7VwuG\(u:h'|)m QŻD"hu\m;l6~N;W ѓzَ/ÿfȹFHOјUg9J6"vxK.,WZ(gE^Ne -үzIɬkR%RY=3FMdW)*j]^GDd /\_OV2w;FYv|Wh? {̼V⒎1꩷-lxP&BYeaU1 u#}ţ]zz7"*+pgig(r+%ͧrONQݑ6vBnjkqdS"gy)ΟCUz{Rɕlr8cvIK^"˴fQJ~(feU."(-E8ZF:/XW[n$ێYEww0wvȯХ=؏O> -!|v6AwF˩Vb'%O-:{8OR<_lK 6W\埑(ʊҎ2()U`=[OTE87vu;DjC'.;2XuؓkWQ̼"ZqOxW-8=9Eա+8%(G9h~ ,KqZo Bh5-Zlb_u)r/9[8'%#d+XdRF+bڊmEYI_N)[ֳOR E EfJlŁ[5!ҩ;?O~gUq;z#*t:еŵHMXUo/2ɤ}Q4}?Rњ|4k*ifJ{5UvXW^ٲUgz?:՘ÜlJMeNc<[e8;5k>*TrdT(:Sr1N[qXX\pÕ+#|ggQ <8gZXNi٥6yT)x9FRշLtSO,T\j^hi/w鐟g+aIjKGuqet}N1ʒx}?:!DA},_1)'Gc'MG dPwXrvKRCHR+!SkdJZ_Ua(TV0)KRW8/V~6Emz-X;7}'iyVeNbcEnQ RVKvYz% -zE9pnly3ElLZ(u(K8ث^ڴ1Äwuaqd؊3-掞t#üm\KiN/Zoԥʎ|*RfSVTܨ^8|)Fs bjٕY>ba;^Tr8_WJeB2X9G)V"&3K;7.k^ܣSP՘ik$S؊}&v8S -֖EHHS-eP|De+/͒%,K^H|0ɰ5y̾6/r،mvL݈}E.DTVK硒L!*Y)l>%.Tu4bKŸ޽?4M?&^]s)(\Xx"aVs9VޤecQ;D̫٪kEk{GgU/I-h6r85F߱[W)==cYNIB2RvM'y,'h{/-w?V.( =b2kM>b/\1NYlGw:M=-}idJ)xo^F:)PSZkԣʎ'cz\O/(R[> -)>bcU7lrк^Y\PsK"ux䓇*1ҰD)R4ʘlԧD%xb*eu_qͽOS'W8]a -,NSķe_twccoӍҲ(A-B dXJvW̏ 5'% -5 ޻gí;VLWڊ+zW)mkw**|Dvj{DlYdyZ6/R\(Xd|v{L'kvq_YRX|9Ĕ^O1T5=m _P?Cs~$z>?h#W_쳊ыf,Z;Kĵ2ud~s}O&ſ_B_y1+y2Vrrgv^uN7ǬrY^giqiM&^.{{&b_K)8|RHI>!F3[^ט+4]SXQ'~^?C }[} ^uU*weTOq;en=JU:sÖSmew9Uvi)Z؃wFBF$Fiٮ:qMfxkS/&i\Um0y(!d'oH,SZ{:W)G'%o왲ziY -Qrz,aınF(צIf)E/в{FF<058B & 霣qOn! -RBf:IP#|7x=H)݌rYgE*(J{J9c; Sn 1+j;%YNOlVUK'=RM'c\"^}߷fC:75]C;hJtaGuW^8qgG#[wn^!2;Z&##Sj1IDdw2y3|̭ y#*ʣ#*zRqClekorњoMNTvCQArI-)p*Ԯ2!r)WR{dl'^1I4{oўv,:^'""IQ^!EN>gs;=/MnVK2ՋN;+ Vڬ(-M_)%(Gq[̴ޤxtV;8M-ZqM V.TC&)SMJ7y,}29xjnE&*C/S>y&j+pD9\o{e^JT"6-F9K4NNԧ,SڴTcYؕ#g9J4KԫQGX?sí; Ivfmf<9VrRRÜȴ3Ց -ܧL{5/-'ⷦF1PTˏ!GM[/Dv;i5xc>qjM$*]B{b*! -:XsL ;Ztu -ܤ)WNn1Ju~:Zάlyȩ%\s/юj+sh\X_ĥeNr.?W(#^؍EdnM76R;#ekП9Cr"F61̈uWO/dehɻg9'8H# |;شRzʔ7/4u/R|H";垗%b*)}#J۫B,5EjD{<`[9\^9<!>([*%NS8ܞ7e=:{2|$Vק(4O{$j'U%8򱥭fOYcrKc)ׁ ҝ\هm;K޿rQe7/(-4-Vl>™B4e^>iQ_A_fZ*Ekqd5(~Q|yIŴbМNqZj#m+Y.b̿Q%Nim)R>s21[ -❤أݲu "jEd=KELhqQMoQRV:rQzIXsj1'BR뀒ԴJ̪; -"uod-q{͢Id7Y -R7/$I6o^KJٖ>?'(db$wFMjJZz$'ļ)j%xf,px.M -+Rey`NTNFI|B q=5[2J2DߩR|Qq۰j;YqY=u'EʹͳosA/VeݷqF97{ -c3VI^;ߔb rq$עª+<߱uz0s fQІ}5-:vvZ0eaU^<oAxTBR~$dqN$*&*V;m+p~!IXiiB_ӆ>gwԞJtޯQӟ$'fS12.Z;u;QYNj(j,o*^9_uFߡYzH:su -=Q[#UCm!B:C{G-'.(wn*/vSNѾ+pyR}&Յ5vFqf%}gv^rx)։ZJm5!'{[!RKp ^x -V| q0?4~ -Qb)[*q#5ܣ (浔lZ8k2(: -~/[9t#Őq3rsu4}U 04aS%QdԦg_SX7uȊWrr~{Zea-mITʼnGS~_ۭpqZ3jv3!S"JYZZ\d'aRRIx".%8Yk1sGCܲ(0X*me> | oBXTN;q!|YYsַuiޱdwƶ܉CRrhG"Zb#Ժrr;=MEK%SȔKi;HW -1eb|t'-N܇=} zn⮉){?M7۰)МYKE("2ٱS~'mxRlF_ԫʽ -;:E7F?tO`Iw(m$E!m*z܄JdK2ޤY"*a6d[E$ě~Yjz9UV#*sEģ)=H0B?~=D백XIjKNR|tƿCeFCIr0Qs&SBtlDS،6I?YO.&}i*T؏s)맯H_TeNy GTO\T*0٬P[5tSdxq#E_ܗAz'ԏ1KՓGjɸٔtG,b4ֶ%ha^R܎>>,)QEu2=G{-S*qmm,b/ - u*E?[,NޑQq&St'X)GnĹLaw:SZ%x~M2˘c_t'XW8XŋfjԊrKVIJJ{WԳ&֬:~D0kQ& Q_= LųY&1)<;2٨sK!Zb(`-wZ~ܫuArj&j)? 77 -'Iz«(1F1w>*p%KRJtE$)iY9J6FQO;| +p31bm5s`7ODκxX{&O'1DnQA.u,5MI.#VDǴq_y ▉@^uqtn<:#$Z;>-s-cE aњfQ-c(%tќVS<1HrpVk (Oy_[3yij#O4?y\GyyX6v+d8of -{IDj'R(y2Q?q -<Rv`2} B,YdC"Icf$SE)BrQI~5;lD/NkMRNԮU\>x-#Su e}V;JZKП],XUTKШ)>ac+p>%NR}:gg$ -޿܊R E>1*e^[}Q5Yc?Bi -"xVa”^CC%~yJH?T"RY -Dc-c>S*|J|.o2[S%utn+.?屗Z}Ļ;IfRa[kvVt';"qSJ|Jqvby~s(pweOS3-:Dȭ?/o+Aq!Q"REE>xkLʜЄ=q>O;H%'d`Oi>8cK)yYQz!/D[Q_ -& v/RǓ'fId#ħf.B /Dy| hhԊl).(R*rFKfTZGʽ -]E-6S1J?yK)}B{bX٢q[QQZⷙ_Q1f<_l|RJ3Z?PD*}ŒQYw7db"Ubs<;x%5sE - R| -RDWX6 t]YQ׾d*_$J;qū,K=I#$I##iM/Oo[f$<߰1IŢ،woزgV<2OFR_ڜV}(ķ -iht&IY8.ByoXHi;O*wy)f'w(־YmJOa)7m?4aZ^LZV(CR#7n#ymC,\Ml#+E9>+Kxވ۰K#-Q[Iޢ&KJ+3wHzي&*Qi^4{?0#z4U&73R/^T-0FSq!D4Ռ~9'du8 C{OQÙg鳑tKKTYcQp'-؜o - -{˙QG{D-lֽ zI ⶡN=LT'- kRDCP#aKudr)Cˬs6LR mS V+m-w#'r\$.:aĎ+`\JG_1.3[x.a·W!*G 3|HDOCK<1COy&6ه֥ԥʅm'VG"Q,YQ)Kr(֞héD #N;F\uҭFاo=Z'¼z.$Ao.u*G?\⥿1ITO$NkQjSyO*.HGY.%.eTq":eF(1DtZK!$:K[#ħ>1ihENVZ& D[uy\ -# QhR&xYvgO̫Чԏ}Hοƈs{oE_EB[LMj⓻!(y"~ [*z-$q)K%NR\>0BK1K| -Q'_xHˢ/ԡ9Is`G?6adX(;I_BpۥDGwNEg >%z"["&>cTz݉q-2')hie*l˨%QF~5ufyq$_4Z%/ZJ+k#Qei.Aq$ћSpV*t!8G'f9=Z>]IP2,_+&8K}rKIz?<.Q{%Џ>%^VTZ:g\JIS5A_"]Hh1Ȩ֫S8=ODO D=;tҠ4O;F>:[*t)*rG>r.S"}Hkf-v/+tBк[FQ6ݗV+mmlpXcS_0MŮaMj2I![1;jxScѼ.b¯Z:E>,)>>=QGxa$z/i\Q"<9Jܬ|EJZu. ՈEw*}Z)KU}N#+gr)%R%ćQx"hp)R";Bz>I_6S)M,Eb)S Nϋj\$&hs3?m2dy\ -WbU(ەd("q QBY1IjbY-ҎnVV^*ljۙ G-['V/k}jjceQ/NqzB - -Rr{ s-k3_*696`[$S(d"F\$0ŵSSY,=p݄R6ݢPz5+zEmO{K;El*;|8|^ّĬcwF2zQ'U;ml/YQW#r+5S(EXz Ut'W}bԇWF)C1$/%^Tkdf~sVzQӗ/_-RJ9<-٢9OBhZ,[JN%ݽzUhyrDy;^R'M;\&6k-]ik+u JTJz)eGMxu$Ԟ}OMjt<ȃ7Da'7vmH{BWCdʊSEVdRw RJ;6lI+Y J gk nTt1d0)=|HRjr#?)O%s}Y̍IYcEG;o'(J؆)g}į:gͼIj#v{#ȭ_>F=[ 'ZwJ7vޤzS(wpdZiJl**.ɊQwX(?Ȏʼ )`;$z$%/rd:EVoR'ڪm򝮔JIѩyq:W%YVvN)O&.Og]^?WڪzJd{=?Y -kb(׷ kQW,b*sQp[JyPCו«@R5lĩ/{IK-)Fk4ѕn(Ֆ-VQׯU5iP^b4vaV2('$e/bղ8s4wR`סW|]Е~cn.C =dÄNNTg{骷ܿݑI_$U*SRMzj4_8~燰ϫrTeYb-df/c;QM*ZT\B\s+Q.n<9ʇitgUJXf0Fڦ/zpԅ1VZh/B#Ծ.&q0)/CMb[t4uF wEaqb**Cj#"?xz?Ԧħ|4F :8ݧD!Oh 販O$)GS)w1T&*Kc#PvxJ}*5/!ҫ 5Q(wi [c]aݴXWeN21kн9_K- -z]jhIڕ7m/FGUFLEY}ȝzwaU=IlKYgmsksÕALNtjqIiCa_w!xej J>5w -Nj7Eov_yآ):GˮdQ_fo| b&vY"q\irg,TOf,8J2Yu;U/RS4e -+tI7/{)^I,'}%4Uov\KZyoe(vĪveW#foƵz{'Eys$_5o,;i}הS55Xe;;W+jgGitNKLQZ8v؍ -;[YݮFax0 MtT!ӓv{thj$1T|QX6gBGE▴xrWh?Ќ"iUW2I#:GSX7l0-ޘUUqURbuPwO v̿sN4hw5̂k5̕s!~bcO#XK A8z}Kwa9e=-*vDr5 -J)}5Ɣ~r$y.yx"#"Tu -P_EnVJ-{V7+ZFK<1Vߊ:_3':VR*4JЦ1GW -UmC|~F &}ƒųQWV3^}eHĴ56a+t.T}Kث -^VUq׈޶7qmPQ^cWx1ožs'P*SG,<V9j 1%dB[%="|bk^QWi/A~Ekd`QB̜b)9j29eՏ'擹^N1vm)qw{^}IFoGQ=*# ٨-7U7Ɯo1(gX#k"S|9I)xdcGHpv( wÙtf}Q#)o#JZ' O%iHX#5_u*xߧC%Щ~0㐢zqSZ\()SWy}:*Ì{1+y<;Ld_Fu<#&vrMz0[2njkO;}bӷĔ`9n/o~T޽i)+]3)v3}ü%$@_ܜܷ byw#JEQKeHu?hB|MzO -IlU*t)r?y+X裡]mu[jvbO -vCOu)./GUu]L1a x/ -QS -YSHG#tߕB)%颧 -vki;hnvN򢵅V̌%XQ[?BwY~pExb>?xIޜRvE5|֜.YRZ^O#'(_7*[LJj%cޘɟ+2wZV8XuwJ6iw $?b=ػG''嶙awR~1kz!|,qڊ_L|2Ȍw-S;r{7]1>a9ŸV7w{boAIjԏ 7WҮݻ"ј=7e^s}qZ# -~]c -zVU.==UiTQSqQ%x8 lKJ;tӶ9ze)Oh-QJ٘ir'_Pjb }5 uib)`WZV%{2Y쵙Z*^lҧ-ڋ4a)JzUKx"m-[l9XQeB=)Z1Z%-&\(++Ʀ.RۦP[EͼM´<:>$xa䣛xqE+-.fxoI]~#&⮴z8#ӍxEhW-lQI##<2LXkzc/)X/]aNR&7k - ] O|F:)p:^VOʾS)(&ŕziW|m=W*C ;G)̇ 6eZ.T}qSb ()pzNVMz"ֻ#U]ߘxhqڬ_R(E^VUJOaR^ˉosQQԈ/R #cby|z1O㽢v9|>hi$NzD8ĝXLT?Bxfe4Ue^e*m8Q7o`b[Kt+mbkR~ׇ1OJoSGu -94$ZtoIG+,+Čդ棖DU^{ܬN+h׷q9C[ WQlTܠB1<^gCKZ/g~_R漇f٢<8Q>28뢧\-O -{J&oƶXj|I:Y -kS_ -Vͽ>r]62\> A-ezQ?lG G z6/ B4z~ Rwo#ooj|%{SdJG;zGG{O<$ױJWd);Dn/OQZK[d&qRrы༵1Yx|Fjbfy -E<1HMh4 -"^MZى78bܶ9Ry>i|Eg})GYL'"i^-e-z?T`brȔiEӿJ]=-)j"鼌(Gf8oŏۡ-%mTF*iv蔷#q)ƚzE;$/K{H'{-0Q1S)锧=tCt?AEl8r.,ٹZ0a^JWwb,Eh{fxg%)z#_,g^alQɊ20u3Ú%RZ^,igOdL,ԿFcy -kSk;o;B[։M> -qN^gXucFŧRYp$eZ--mL7TahVy[)e#cwyݙJIjZ/b1èriu^fpchi,G?9¬Z+;{>aCHS6kn,hqzLql,] -|]/I>.:hD8HqDs-H:x"BQ(l#DtLħEO1O%| -IqKE1C9EC6Np!E2Chq'ܑ hDy:ap!4L\ "GJ П]J}=R -88Je^4t**)eOrq DeN%>*}E^y|1.WKkE1CyE^Q%ćtS!Ip*u$G]=S"z R}R -8!hS*!W*)E<q D| -J|4TQb*!ė|J -IqOE>STd92:*}Dyp!KC.N뢗O}\BdH 'M%ė|HGB#'ЏS'GRӢ -xxS'ħUOhChR=G.QS#SD8O>~#㢘}H(9Y$S$.4S)Ohq%B9?OREDOM.R*W*^9\1>+b GDGEN8KhR/h}M/}\L\HGЗ| q%uCG>S%GR$@TR룡[WOZ(>yJ|NCPZ)p*sVJWb*!ğ\I"!8yY}W!ğ\DSS)yNN:鞊}HDL\J|#K>O:|'ܗ8Iu.b%2V2B] -WKE܏)OCC"<\ -̥ʴT|J}sQ%N -下L\Hp!̊(]~rJ qLE2.ݣt'ꊄz^)u"pK:O.#Oܖ!ԟOs\E>]2$s- -e^= - - -+xZ(>!؇R)p*sVWĦQ%NT+\H@2(*tUq*p%E> R'y_}Z)O.>t.OG)'R]2%2%2E܏p"I \ -.UOy>%N -BC$OWr+ K!ST%E> D -Db!K* /D8Υ.8\ d>N$8"_rz:zR+%DOOE. GL -en= - )u2G!\4KC2=4RTe.U+)u)WxC$8K* >()*HOy_R뢛G!q)}>8h\Y>TC!ܞ|m#ŕyOQ>'P}PE. C)#hS+t)uиp)-~r< -|ECTGp*s2._Iq)^*q!U@|Q+=%Ĩ=")172G]HE]J]=p| %ďSK>#>C6ʼxD9GGK*|qZ([Knn.Ch})#ˡHu*颟)S;GQUS[DxC#U@|HhФT:Licn*[ARD,K\ q&O.N$z飡:h7ʤxD(pKTSC\[K~n.ChS.]JHT .~%.Hq*Qs"qDq)}>^tVE.B)DS;0TO}#)p!p%ę>$8\ qZ:$to!ԩ܏}(բ|E)p*SC\ -= _WGЇ2r< -|H7TGE.TTS\ĥԏ+t%ĨUdC(!ħ8#SUPĤS*pc/aP]:{ԏBJ\p# q&O%T."\VI4gfC*ϥO{ćS!̴vrVR\tt++t(Vϻ/r -|EˡHu*t#**s2<4v%~%$EzW.%BqD8DxST.y|*t)u* pLyp&T!E)usW.8GB\JTGKGMJqgҊVP}P\=SUGL2@]t.~zs->".?NtR*q#Evv%.)*T*2 CSCP\V -hG#ĢH8/%C=R"<䟡W?B< -|颡>fOSK$}:?ϼCP}( hQ}Q}SH2)Z;9K*.~| -|Gg\=| -|Hԩ؆\NfGR"RJ!̈p!̅ā>GʴTRU!̴G%Sb| :D9p*)2:hO&TGKt#\^8ENԡdSCh. Чp++}%BE܇<%m)*颗)SZ+"QGĪUdCO8O:)r:2OhKQ T࿻C}uGGsTṘEB|Y"3!УʉqZ)ΚST!QSu(}>(>)*E>9R -lH\ - -ICZ;?Or -|ytKC*颗)Sᢳ;GQFU* -|\ -|Ht!SZ*t)peRGGDT࿻C>_R]'ĥʎhK23(ET>+B#?>N8ENԣ褖墟(2D\ -_CЇ2ٸS.T#E.R3)Q"R.%R!̈p)#S@}$y|EN>RDxPA:vĩ{}tQ}Q8p)!P3&Te(ȇh\x2G}}ʄ8E^ԣs"eK*>:#ЯСD9CO.J}JK9Kh}gh^)u*.%R2ȃŸ;ebo´TĬSj7'u\]hRJl,rENݩ*r\QGO̿z!OSK ̇ER\JNfQGйHeSyOS,Ob hQ}P<^$9KeRVSp+WPKDb-!_" hRyXԇFk;39;%DYcj:{=_u*_s(K((Z!;Չ8wj"MOFS%w{xrOM܅$Q Ρܘ]w>s;Cq(o# y*r؍lIlugі:l0qGf)Zb8-+ϲihx| ~--µ>ĥ+%QITҔro|ݴ[ #<`n]V/(a}O"tj&}BZ,4m|jsIEZldw_Sކ>ٟk -HŎca -|*'UVF.+kݧx iFo20^]HSzBbJz]*^aөDaOŎ[^Ū#4؝lk&Ȥlvb^VCqҩaڗ2~-*p%^VTbOEفO=,lj,FM~|EvRyo -KZC -o²#,Y!QjЏFU}E -Hmjqj~Y%q4&`JFKi*t#'ch1K 'Z_rmʿ}*)E;2}u(>%'厈_|J/͑͞aBܶr)A+jDy\ȇhsdcآ}ЫSW!Jdc[a[’v-9d+ny;'<ћ3Z3vӉfNO'\1MZK¼R2Cq9X:{(  -4Mz ҡO[5刢yI,ݯ$D{/b+%RVc)_3QMWq[%垭4nËJ{}މzBMp*^yQ^ף-9<b]+dOS~U%厭//PQKQJQ{Lw^fJOb*Ֆ܇Q5fASE^)Rcy\N[ђRvbc™G2>-KډBQϡQ_]{%;+8.)j#L5Z[(tK -VD,֡<>>O܂;5I(Ya+O1m,YI\B=LM 9گռO!SߧQ4d5*U-1Ni8VeRN(^1$ThX-搤ƅhpUd=%vWe'-qGz9W -^mbZJ2` LtyXLđgY~Y)<%UZiu<.^ډhq{Fv_yzS_zQY:}PrJrWwC䔦$fdz%A;/JImvRhQj#L- FZm%NzÊDdCltgxucseB.M;E^$i1FK)OII%Q -G -SOZ3Gyrnfo)bGBբ8"RrN6b:o0M7J/"o~_2Kc*r|J]H-a:~E.1%'*]>bT.%/D O"Imqm^ҤJt1[c—IkcL?6$FnҟSV+[(_;܂ƌ1R}OA[̳%yB1w -xUĿkRo7™EJR=K=fuMNVM%Y#$ -8B5YJڶ"ʫø+lm#Qх_\MEVw0vTCx%rZɔrZYuWnNU -kև9%ojKnh0e -j\jn+}^HQ(+~r#%͢S[nB/Zi+^}^VKEI~f`N2xQ}{$Ue?Z,֌1MPlM{oq;-K yd$*+l_O[Y?J?F7?̕9+ - 'fSew^MN;,XRԵzh|Zߊ')*^^j/pj{Y"#%b+}^jZ ޻i -\ŕzS#b|О'bC0C[.K+tYgvqz+B<(ro.'ʝ Z㼧Ċ]=Άk$d.R -y+pZ0o2QDЃ(Cz̩OEM MkF~eh'ݢYegRFa}Knhoxc.klJ-\lRZ;jJawk0Lx'`kdע[J׼)O4 $e,:7wtI[NN# A/3W@P:G!Ԅ핍v_DTWR;Sdx.}%v*)u0?}̽OF`)ubZbϡ["6z_{>xԿ׌+ѝ๘u20 dzu>x0B`Qme;;F[5dMɼ?_~ ((rObG#{YN.E-vY6[cBíu_+~oTAP)r*;J.b:riD!˯#K;~~^RdcZ_{2~*Ci٦IX_5rv쉯A-?,tSIlйJ;<}BzHl%ۺx]EQNS/+b^VOM*(I[뢧)(_;܄﨩ԏ1Kh9O jɿS'qM-D1kÙ5btN-셶T>mx?}2Bׇ16#FE}H?^RJ6;u?2Pﰭ̊\\? Ud"yDdcyIoGq<[H4ͅ{Rt~dMcDygKgNֽE_1 _+U{S%S\*~_)YV/dN 7WE?#vn*o{؟B!vnX|yY.mu#}GvF"RO\r(3W4h=0ÿjN)%^VT^UNYYTl޲Yf`q{nUS/a>zVJY ȩR<.#RE^FO܈F.TTޣtN;c|J|bT%͢Lqz%IܩubPSG"X_yR+lGQ(޼amBNJ!DkfrcqJ0EkyZeii-E*bedgX-%/yI[Ռ7!;1,xr]AnEFXilK{L+CZl,>?ؤURvGRu^Rżޘmk6,6!TbXeY/"1o9jhIr.:bEQWg،5cg^%QY=|'y|cW#%8j%CKQ)cx[B(AmF,^!b{lEhP_%-Sŗ]rgyPwoAZ$3B;z z#82OН _{?dS[E ,98hܪ#%ģŋn:-cHt+Yb搛yC͆d;̕ʝ=u,VhT映oVRYFyUu+yV]/(V#ԯmMHö0춈j9=J.PI)e|:uj W( e Ы?BM>^j}F)nJ:i:.RW'Ж)W)p^hm*2|HQBOjF$Inؓ'ħЩ >i%}ƿͅN:{k%F? -}]Jrob1NʷyJ|B-DnYSԇ^[­kkdiG#Hxu8,㨌?R?̿T%SLBG7X[xU'!E^e.]4 'KEzxR)>bO]=ʼJ==Fqi9JI&IS%E?ԇ\Q jOdY:b!h)ܵi-ճ+>!)Ga[Ľ -W^bw&FbH"))KR8;)m/N8zD]p;T׫&IRzS_z}n*+Z#8̴U -)Y~KSLQG|tycȏ"­|{ rvv%)mZ;:N/Uʎ?'|ZvI{u -KRA`fgyQ_+n*O*1+T+}'Z*Bb{eW.2KЩԧR;%rIz*!8,aZSTen89[\M^&9a#V}fv$F)p;W-MD9\|CVd";$ =eU1Z"2EHfbÞ4:=D*;Gzhoq7h}nV-tUd}RʹF/?ƊУK|˧?sObGim.(ԩʽpMyYSbTE>Kq(Bs\܊v(BVxr9zdR'k~3->>V\ --G[HWSvB^LU\m̮֯vU|4/ ɢk|Z*nJIe8Y~c-gy.QO6O|_?c F99z21ܬUx%ڌO~5MДS~"*J̚ޙW^ -͒rh[Q+Sy &?N>dPbX 7&g)_ӽ j[HB[TXx8* qYkuP$af =1mv_KCkbV0܅]Sh{X/{k^T7u&>gzePo<s#i9ԏYMt7xbvfS_iK h~>?#M~?6T+>Pg~~~t}c~3\Q9Oe%Hƶyc?OGDyOd+!1 AQaq0@P`?!Xi5VޤފMI$7F"k$ri%$ؚK$I$fK$I$a4c7hS=KHčNLbIDCtc7T&sq6$j9 c$DzoEJT6I"'D"i4"cdI$&I$I$KEcLzLlluqFKVIבߤFuII-TZiacN4 -7m+ґIֵȍ#&c0N% 4[NMf:檋[$n1\S 3J5(v؉՝]6H[V):.mY7CIcJ1I0*\RUNj&k7^$ޒMjizƍEMUfK,1Q#/EGҽ55jڗޣbb5:M{jy HњԶ'EjwE:#n TzƍzXowKаYiFȕHbTA蚱4oSqՌsG\zLzKa=sK詽/PV):1*o[! -T-UVn֍*-%64O$:$K -[R:R"鉣/IM3dNNtD:72OxqET- -)$6&ԑ2)HΆɢѰBF1ڌ׮uuI&7$dX;\mhDXBB$*E*`DqmDojoKVFFͩ4ԩ:dbdc(=P76Rt-Oz*"}UMǥVN؜V $괌NCZ $)7\C6ҍlb*1UoZ &M$^uoEꥮ+tdz$ܑVF:E:_њA"4uz1OqP֔ϺstbXJ:N"nL><&,I3Wм=#Ь o7t^ B"]AR5v&說MDR:vM7Ԩ訬::$\·Lъz:HhGSNcz2 -hfx"IR /e~ %:[,]#nX?LE}f| 'BD k4n{ʮzDɅl(^瑥m CI4KB ZQbڝZ4-PF[NdBf9 @~D62L\]w?qk[C~|`r6'Ɛ~.D3 q/? {σoKPh{WQMkhS#н'ER dz"1"2i! r7z$y4Q¥&~#9 fXE sVDŽc:Sd$XtD9LO6%/Xߘ3zJ}IZ`~ $_T3hǡTZ֩ޗhfY2̳"ҷÂWe˛'l# quE3M#1J8)B2@ZIhق;{($/bN}Pȓ6 E +!큮4̲0N,$cK8b3Rq\s R#VΘƆߤbh7I4=SIPCtFѶ9w$`MdIv%u!Q*+Q:&$2q\-/dXH{iAh?U+4EђIDiIͨ:ksc!!FYamBhqhUH)hB\$I$)# -$ɈgW0ፕ^☌^a7<*ԃC}R!Ҹ~n??ʫ&:9{hk$}61`UCcлVi8d3Ln B*Ns,ͅBM=Fi4[^I4zǥ1 X7tB# ;߳'^獐nTdN-C`ӂΩ&3EۖxlLD,r`A!w"t-#qTGq1YZ;EB$6?2zg}{OUƼɗU_Gka%_/K3zej$Fgp}&^7$~t~ 4<:IQdk;W$R#֚N^^Xv<&سqа@߱$sEKѝw#A-ݣUCWC~14v>v頄6]9ҏ@ן1'Q"$5$C,ϲM?gF6F^o_cM}E*=-_AwO1Pz? -7 fޓmKuomTg5BX5az\Q^BVt:9l<-O ;F'TcvfD(# j--9hE#˱#๡sJE$9d^&#˙NQ|߻7#v)OFY[ UFr~^Kyf˞ZKia3 HY}2]9wo\")I'Næg:]#̝MF12=ߏOO?Dy?m0ycs}l=w1U$0@j/i~X̓~<ɸ;e6;{ y̟ wm{$vO0]'"2_%<}w&Ks/3O߂e| Nb_fuCFBSQn=zmW*G$hެtc#&k"0:8425oW:\X~yrwt2M~PT[UmK®x%BԙrЈM}Oy^SP۔Q -n av6Ja̾EV3Aф;< u;iBF}Lݸv<ʫ©1oXY0딤96PRN#$} ϩю tc}g묉D2 b:!aJz !vV{ճXdNra򡉷 ~:MlibD'7,DI$"Rw&j8ĉiDHZ'Z7_TI61XhA-)VN-z[9tؾ:$nK&d&-LTTv*Cv&¦$z,pN'${Z:&-}V][/U=7$M&ȎdoO`t:j!J!7s"刔ܹH[E(ur! =Kc \5|dPG)d(f:JtkFޝWj*1hcqNSϤNևvHc{JpD*<87 -z |?D.oJ9ܑ~SU_"{)6c-^sҢl"QooV7o0}H 3[EFG4ᨤ4%qhdCia*b-::i}NuG,F!VPƁr;9uZRf?P׺J92OemɭV!3?oBr']"yB{R730#LG<*ΉSnF)XcfЕTOrh! nQ"lD;C:텡wqR -u%!<:mt|"fea>?{)~K@Yռ^%-=寀b,/rrqŽ#cc$Nޓoz ci НO& Q!-OCV .Wa ԺՉSjG(!'ymOp\ -H%~NN1ӥ[\#$TJ. n-THZfӱyMm1Hu4/AR'L [b찾P#^ߖح(γ⩛B,þbYu 9rfd!IWYыr_6eY!UfY߰Y;w$ONq_|6,l_gp~Z#x<H7QiٱOMeߋjs?3ߑJeM?[{ ,O謜6S퉱gČ VE|VgȥNpCgxɢ&Epl$mus7opűyx$)x\M%YbdiDu]LRG"Аl-|8a(.C>B6BIv`љ %|Xg~iʿyM2F؏1gTCOq/o.ǁIQT.B[6/4/pMfoqH`B\R]]S#a9iN7< ټV;ԠS;U]#\ܾ.`5,Iʻ$߸e2|lKG5E(#$ݎGD|k9q]"0(h2s1 #MJ!ʒ[*2tژcFձiڐoBDhHK -D\C" GwN#Fb2tdd!hXG#ئ0W9/";شY8fSP`qq{#H2L]B$2eD Ao&\5v-\\P0D-Ču$,ali' Ȓb(HK:J۾ -D.G$"ЩzmETZuqhz:R(Ȭ hTHJb R%۴B .XhB!"%1q0Vb$I3j2G'a2hGԹԛNU#smnz'UԴĉ71'?&C)BRgd0{&X65H.ǃw ]ĝt Kִ@r[5RtošG" hڑH0%r%Tn&lA1HD!.[Jt?RG|0K)2۰GMgya }!M<}M~avɁ vaǬN_271a˳g l[e䜍K I3Y2!zRIbMĽ[0=,,4VEU HJbŮ4*l!CN~ΧrGavZ"ġRTPڌL1irȂ 彯?.ጄdJJ+o`Vym7EEA<ԓuJ@Ђ4EU:n*eX/[hUtnF[,MFa~ڢDD•\.ԯK!"Ni¢>d$ɔuFw46o;޾FofH^3lӃSm -Cw7U1z.NY$ME _DQsYMA1 Iv~D-PÝ ,̧M -:R _#" }$5N<Ø{Wt",{mYk/=E0eA"7"zAR4&!U鉬WqVi$lIъ5aUz$AqdU) -la!`)D`]Fe_ZPѾ&'D7IM$!i4I4I5UY-*:V})ރcI$Q%ŵI$YI$I$k}2MfV$l"i$D7I$EQ=oZ"#Dѽzl1XI&b{Sz7ULw2cFoQI&K$hr$nBvmi$ѲnHNj9&Iҭv$::gEztN4nH4ލF؉$x7IIچ@^ o~ 'Lѽ Ck՝2z"C&D-+ׂ+:'DII:\:ph݌=ll ##jU7)?)D,C-&!-/aV?3Y&.Gޫj:-+CB -K3މ$WD)21+,~%" IBpEp!c/*1Xдw̪'$H`ͽ auGD$]mh%TJ?RhRR1D3}%EX"XпLjn=KTѺI$HmM{QA 6m1Lnb#fo>$i .薔g䝈q|b\x '[cD5WaUQ!UzDCgdtnK҆HőTp WF;@c6Q pR1-l:k{ɒV`j5vQΟ{|ok j ßbqaSO ƿo -kSzhK՝ daCjofQez -HF4L6,hН; j[ȏA$:\cF -fOD&p aٻ6]}?p?Ȅ_KKqB6-r+VHN%Iu_lG7i1 Be>G^'Rf-[O,94 G?G]o!<,dc| 6MI $R)"uY ؽGLmQWvŽѓh!4Ȍ#DAWJҊW2P,Ы2tv6<ʰ쓟5إ3k|>d2'.chBV6H۸\'fg NBh .-e;&Zj LQ07acC5@\Qb\APCG2&Bř%hM]*.FyG -劂`PIdܳɌ"F&I:ѽ&DzMU64DQ-*dEqzUtmFAJi=AQ<ۈ%jV$T\.]Bh@Ԧń\mܷO!)$$}df»0\?Z9t77Ez?ƅ:LhAFbuv0`U ldM5H&K["I$wȓݎ vlO$gXyHK-:FUV c}.6b= &6I#ؗ:,97۱kk{ar1t{Q}nH/i -{lcۨ )\!y5z=iC7CiZWSjǬ(#adKtL_)'bڲ2+ȜCJPu[x]k?,c5f[}"d;Q)X$O8f4%AcFC*uuo4NNHଋӚN국4oMī#[[hFB&Q-Eu+[o ifq\<-^VJVa'Xs -:%F:M$Hx$TɪtH:N$rH(\h2!d -W>e 0W,wxO#p"HNdLC$q6!N8)wd.!Epϴ4ŕn(9܉cg\[,E=J",mqIUizkȪX}Ek}E}GF鸅F/e|+vE˕ gzذtSL.''%NH{!4*؂{” \묛OCԝH0 3acVޓ)T{ ЏE-IQ`ؒtdkНJɎ!Ҋ K ;ҍmJ8yDRSKvԫ5.:j~ϣOF4&%bA -J\=5L^EďVĉVũm}U>D6NҞZEE6BI)$MH"FZ& ͟BXdHBi[y4%.h$DQѻ /qM$lQT+CI>^dz\xKiފTEH$,'V<"@vۉEal͊U kr6`a+H'%, vE2ԑ5$ѩOK~؊*/Xޮ"ܬĹb91/F(nB R_ZlIW8n-n|!6jfkLT$]u|/&|1RQA0PuhVJ#I)m"sbQļNm]z LZ6Viv'[4H)jEe16MII@ +bS2J9Oz`_q-BeI7TEd2ԓs/OQVv_cVD*нx SwI1"@m]B.I ^%۩q xąB~XJK5_Fk:gR#T걝Nҫ4!=3VC- v#-ȩ QLҡIҬy{Ǽ?jܥt'w9 Sd!xsaIly`H24|38?wBF@ǼIw!vR(Ijt}D~~#Fxk(Gkg㙹$w ynxvLTi"])5/}v,ZMɦ,lM/m{kY^ǭ,XZW申DZ;B&Sa/pǏa챬s\0%؊L΢Q<µEGq<_cnX=919EN'XX'lq[1K?OCuGfnLP{Cӽ7$̋C^dUB"{ W؎Y*H%jԪǙz1iz#~һ XF+yjnx]14W8$ND({d,_@@ĭtR>Pol& C98)Fw3y%{!. v-T24H|E3B{VRB% -蔑|Խq"#bR{\/fF} -CAK,n$n.39 BʗkINߡ:.twKHڏJb(xЃp?WQ>)beMC%xe"\Zk>}&ooZ1:;ԬK")3q$$P.62\mWUFjIM!Ia54@BLI*1wSzdgzNaƍGC#Եy? v 'wa{uI -䚴Qo'[2ċ(I`F۷hNF!,Qz XTK77QTBT T7!lTM0:-*).øm"s \R]$I$I5-Y&NhއH#afN ⻓IQ#:QWbI2*Xc-H6QΩ$6hDɤ6H#I$ XtNY7$dEuXެuUǡQ KuhEI:#ԍdUe: vp*nXǦ$#xT)t'vs (HIܓy pwIVnHuM7.#j6#ܛo[7Ԓuk$y5:<Ķ-A,ܕimbR4/^'zPӓYj,S6n윶]_m%!&nqxhUlr&/bXI-Y*^Z"D|*>r/5"QN!if{ 0Е$NIw'EZ=NcКZ޶r$jEl $1Jl.ɱ -8 -DkD -Xcd/F$ܚM$v 'D6$i$C2I&'"5C}WЅ:sD#I2[DKV(rbS!\,;$ :VŽK-c}S%s]т$].2.u]|0Z$dŚHؘ" ؘJtaoEqViMеlnGDӦ/UAUR*=whRR_SX5L _ :m)(؞_qȔF.NXơn25d$:dbA\C4vӳ"G>oi0DbܣgaW-NH1ָŏ>坋WZ.Y5\la7lD1!9`*p<1B bՒ( } v"Uq .E${ ?B *1trIS gD(@ T9V8?lAԻ.nj" +p{~YKcq3KCXm$f  d/J짙?2EWHa[|Lu@)`?$UqI*?pV)%AX\VO؆ %;y.Ws@r ӔcI]zbm>FIU-дFWr)kBд@EU#C&BBH#̇T3ܟ3vzq8,3",l)-D -7[/5cד.nG2gYq ϽD|e d - )~$D:Ĥ)F/.A|nT_ H~1GRi,N]ڵp/7GMۧ;h?wB -V:MKNO`]#c˴[ha7tnI:6:$UUM]1VIQQQzAIeDM -<;B!|MP~(2,`VPӯL?_`IĘzY؂__f$u|a2k-1N+$? kՠ)LJGYǑPVsA?3qO߰ӦO]EGI8[Ip{b<6-˴;uQjZЎ*TM$MfH"Cubt䲶~FpS܄nA[,tL=m}%䶰eڂz}}JFfЕ p_C e)Jی0&H -I4@LyR1^lj:6 @?kO^:iO-RȷbB#yG/V[dܓ"0rF-?9I̤?k@Ojw7nT z^uTp1\k:M[GRTa'G= G=iMQ?FdüIH);>" `{i"'X= <aܵeo37dE[qdBͅ$ՎJpIX$q7¬Л "Z 6.|G"¾A=&B߰!aeq-rFmiOw^ǽ-I FSMId$I$a!kldz-g+?8巴M nD+wDAtr0&qTV 0]`lmUd$gszIu&i7&N&dɁeFf#[\I&dCzQ!hJUz4\Gqѷ5tMv$Qԃ.~dPlLV$%#bDոIDG -St%вz0,JE@dU$ a-Ii߰`%)h$^is-\J ͛4I"b ђu"-W# B['bFDH,Nw$KA9''ZІ7I&>$M&DF¦ ;W܁FB]W{Y LpJNn/rU edw10nNP7Jo"PqВMJ7ɥ]KٌQg0s $S/d%o~Ꮟ6?bqs?=! [C$z- Z`x"51cjXa#:!Nsn*2I! {d'oH C}ќqڝX_Dͽ|&I MLFRn8%i&qdOk[!u1ba/KKY1{bX/fF~s,m5/cn3A? ۭ/uÝȌ0_)BgN/̣gV[h1[W)"n쾙K$Qy,OL0vuͻadvDdAB,M >o69VYk;PZ[(o!_?ԧ/d׳R;[ ;[VЩH[B d\ 6FNI8b7YS- DM2L608jbp/#wCs_`"6\9vg%ld#7"`l=6۷7b"bXQaJ&Mάg?" -A A\/abaQO1xl:tceϑ: | $Kawh⮹?IpsU4-UH7dDJ5gn鵆gRjz j"\gؕ(՟W̏ſ2< 3,/'1 N6)o 1 X/g p̑2a<a*4@s"b(pZOG<ūKv?z(֪(+%CCAhC,~+7XTSkB;\ҿ-'n>O&?Gń)[L+e]rgboɸ,6/{|1evvk?Qd+Z&/@{TٔK>}2g'Q%*{KաEn~rsB8w$Û~ -'_D O0%MH~V] ^ n}?cx(W e2JŇ{ J "> -16kBc9=}ػl[x$AyàXb%o.m{ $H#?cMʥtyiJs vϹ' Ȯw7 d -a= c6\0‰'؁,ahҖxhE-[IZv : ;q>?aJU͸eCbl'$&V2d -Hd!$/A-,,zIRD-ha7?=|G8 -$nE`pp(J׻*Bv:E }m"FȺȢweQ -Yؤ]EGEEbA֛Ғ'I2*͉ztt Bilc!9*#qv-Ɂ[ - G6P ,#Z cb`iv<&"Iذ"IHF 'qQ ,˭2<墓C\~%mh2)/a]p+I0؃x%f&׸0fZaݙlveKMsԜ-{C|es vdV6S?C)Zٲ+w\+H̑Ë R끸ZKb1o5~ETMu6b ud"i$ZIDܘi~M4$Lt,Da")Y-*hCX̖ LݟwP5Ib}!j=) Y0;nǸ@5mÓͶcyr= D|l= }}s)]FpE%!C{LVxbY%P.ldsFbJZ}d6d87p4FMcM/o %gK,g3m5\b5tB2GE'4lM+_lm1W0l+ĀP @Qьڊ&jn\BdM&'K biXfY$b}q #%WaHkx+' V'| vbpt_فN|B3Kց\8g EH?"Z?qۢVfP%dm?|F5K ݑw66g oȉ,_tE7\es; " ?(́ne]$V"XngpJ+xa~. `ap lyx+ȇqšۢǢ&hl4oLղtG]^`bPҦBt3TwSDUmo r$E yRxPeygt7RHGsa%dgSzb" -FqpIBݷ]jĖ.X0b_~' I%~RLMy)-HOaZl> WCģYl2.yLn 7:O툒i?BԘLMz3_Ҿ<5;#-۴WD`tC.-wM8$&=ˈzz*tNF>ndX# ȼ>F٦QoպAvo$Gq,M~Ҏx/? Qåx!lB/>I6G">\<%)Hֿl~ 7 O'd%p"FaxK w6i'%cQ1k~^ZF"\ʟo`S~ZeաYm>F{.WS_G cVe9EShhFuXlзxw_{ Xw%$TʦM77o8LRc*IGZAs o\Q< -Q 1 Y"*03$raJ%!Fr}Gi5/鑦+'rt <zCeg۵̩~RnlKG"[QYtb'.{ch e.$RNE r} Q);S:"q9Xǩ_:L1+ -s˧M&IrDI5I(Hl@/I{AD9ܥUDH$HL18I ʤ7DVj - -$oR#q4EЪuM2-9W -%/~wXcRMI ?0 w]џq;$UMOܞjWR RCB~N\ -S%:3vcb6=ˣ!Fۢ GK,qC&CD*f%ShI^ڛN7!ivpAf^T&N `Ni&\!4DЖHK)L{&l#y .IRRcE4 Vnt>x|ҥ|$IAt;>bΔ;iHAmXiELp7P!LZL '>&VM` &ĭhB/D<90I$U<%}%V ̡7q-&nF7 SKS3 -THvpA?.[ ԪKDlJRHE>[_$ūǡU$l%7cDLeer2۬1=@YK*!ɜ{yv| -;?WbC"}ٖɾ F+x^~)#7^&[* iqXĎ;neo{~?2͐&De -ŔLg.%D#N "FBJXjwؒR˟qJTK)YjdYb7l/ RԵ2K =d@ڙ mlny.S<ܔ ћlJbkkSc"[ݞS)c<~fԛWү4ͦ /\OcMfv&LȀXOywQt 5E9O{l'BY7ۊ曐;([wϑI#uGGvB_:6@w'EGԥىBHsd&Ꮳl{4ziť[>W}0'y;x_H[?[9p[]伛Ӈ}HZӖ[6}M]coŊH: cP!J CC?z$_qw#6ZwVI~?z%y"P \MYG'Xݟlgw -eLiTSݼa"er& ;wkQl僣K5Jf/K1}q)O;~,'*\O܄')ed+E4q5< -̼1G3!L/a*?Hg@,gi>aqѸ%O8Ii,&Gn]ᵘOW1x0Ig  bmR9į#Hh0}/1.]ϒQںk(4s7QLbV2 -tâq@H<_Y< b>Bl flB8aż-Uz6liDzt!uArQ[CD,MDVeXVR5wԟ"Ȃ؁#8;E^ <3y3MbdnܦmݳaeDlf#ס5*͞ (ہ,#ؒz!,(Kvbh򋓱(^I5DrI{&r'w%W¤RēއJ5*Hg_f-夲\@;4涇4-쁛K6R% -w&ҖNa"_I4|=O}a`pHZBZp'3'+v&#kT(+V1ϗ 2e.MRiO Q z#cZAf |m6Nv;sOn'{kPRI|K$T2lHp@$lM(#2(0L˱UOY6кގ\6$ f$URdbD6TRՒIcw?!fGqy`c]DĜU?]O ,.= E/~ u @Ac!]vĒ}&GěFD-4S`bC}2օf5v;lnmg#n{g̚#vY6;P7\n&BӚ}Mpmp9?q0AȍI#܉6ȕ$6iގD{Vh*މ$aвNcRjS3(2bܨفi\5oh,nI=I%0$VMB)KLq5M@H7PSzam *:xAjr\Ay5uq/BS܉-5J|AK_<ﰏmAlc|W%ISyyv"#W#Iӂ⶯]L܄)i3IY1C×˹ )Eô*dGodSG~!45́Q`]:m/ѓ6ZAPp1bB%DFG}j\C$i>䗏JGRлsZq+v -)>G -MYRYmJQ>9A7{XG+cea(2vHM]LeZ9?wWmHtz^k&lsh 4DI1K [չ4Ct2*p0V"ZȆǥo5VR.}I/ +cq>YyD*M'; -Ÿ!_R @r_v~ ȹgŏ+3m"<]$ѳ.s;p'fcrI}5U@R,&%’y9' FNIU'@m ^ 6v{%'%-)Xw#zX,! dB(Ԝr9i+g~"({(~֧KSuY{T}42I;J -f=67-h|UQ8\`yφ4˪Mߙgp2 f~8znt96?gs9#Mݞ+ؒ S<;8be)'`+):~Drϐ˥, u_f,kl7!̇7"f>hR -ab'ߋ6=Ƞo7{{q`¤^k.;y_M<\/io rgQ0$VEbm-b(rƗ]Geݎy2X{oO}y3aD JX5jd^_DCVC6 -^ؗJ f"XiTǾNaWbcL2$,N * ڮXA=?zQ ssMoDbd͹l?[: ^%+r%R'],ߩ dy# -{Ӊ⿒$^ ;,*ZdK$41Eݩn7Q0D'&9vlp@b+EA$q("z1&1Չ ݇r.ʲ!čKu=EEH`zPޮKt-uN(_s#Dvd~ XAnVŲKoag%+4@1q^JHa$;ĪI/Ad<"5HbI& ¢&tЇD7H6Ѷ؝ozIIªdZ'B%Rk}fj[ZԅbkD)J_+/C'C22jnčN);6@#w3~);d԰!)!W-SF.:@ؐHp28'$ ,WϺ=>©Xӹl+5>&Rn5me -+3B7M#bDXBISU,ecIr%C8)pr|#,'Mw ]QL&ԛamEdlzz2`I%!Hl"#"%Õ 7F8n2.8j N%-#[([e^5)6B$ic\,WtL3C!(3"Jk'BII~l be?dOxB>!( ?y<ۯxԎ-_I$-ӝHMhctBնl,dUKIrK*ވmm\E,9DϠ1>ĩ7aL06tDBIlGQyHttA'-rơhC;L yg""&FfēQ-K -&"]iٟLw#”$HAXn?w>cKo&q0L3,mP - ?:I%uvߢ]]2O˳2l?%qcKեH `j?7FNJOqnF6p't,9Y/%%ڏ}U<_O[G7 [4eyٲ) LnНbpw&C\юB BT=',Q/RҋOyF,^ P$c }-^ Ov.P8rmn"&n\S#}$'2NpȎLU瀙n$;2i"O$?*mrmN*K@7TUYc*Lςw,&q,s&AgX3ϰݩ1q=ѐC6Kzcl;{#dm~$UiFBr.rdy/.4K';f&%5 #v*x:Vw!c9}4DJs:p#Izw$96FCW|"(i6VsG :3-\ۻyM+ -OuϹ -J-!oX[1Ci:Q7@mr"!H a "^Jɯ\Q=k# 'XbE{hU/c-e=B=sIRf7%$$˺^I ؒ#w"S<>YJvL_і IL= ѩҞab{vVb[E= DPDBJ8n/21X2h|ʹW\ *9D?r]ld6A_$A\o-2HqC{Ѥx*؉a$M$$& dHڛ 22{I1rEC,7~ͭA" MI68q6cf&rILQI3?;u6c|=gV\chÌl[4n浰ilblUx?Wr-a( ڐ, ="w.~Ҕqw PJXTK9&Y$M M q1$̊g8،6fzKas QA9t:Cd3rZ$I4\NiqE-s#$CF -j}|;/ď؏hpvsJ}bD9z~D'-r!s)LEk'6߃bVIŻ7u+NEtޖD@K>"-ݓ^m瑈x&@rrynL6KeeDa&T }DٍK+ -2[#lD#;eMcJ,oc0'"J`?fC2M9ML܎OVTJdGRTI:[$[bVAhKGUtmr`@W5aIѿ},O= -U3pcWuIRGS9t6z.Hc/c;A$%>jzs d>~AW"xOacb|+=W[`K1ǣɰ2i`iqn^%>|~JJvȣ8Hፊ̮1%_Ѭew'hTB WyiHT]`{Ans&ė8W EwU.w$Dč4EZoKz"k (DT%t[^#҃doy,*j;nb{{/6v"Gx3tE"'+>fCѸ鎉X> -s)rfok<OJZ&~ }ݒǘVUg\u<5 7l.12I@WNxgF7>%>V-)v>3[P; -AUgvEKD){' 9-qeÝQ*7Y ]h$g#5މEEj, Iu6۫7m#xbͤ^G2ᓩko?;KĤn1)|Y$MgMq$7#qeʻ{Lڞޜ/wpNF\ -S{]}(]H_^*†1Ϸ_(Ympe$!0jomc۵ AsD+:za҅2~/ _C0= BtUI$nI} Xr{6nnMe[3 [qA<W$RrI%* R$!6~ ;_9'%ع{*c7 w^Y82߰8E2D̴1JԾ̈ K>c36bs}#yv6y }r%ܓԳnoh5+#~Ј5/D͂7BbL.DĨdT\ jM/ۂ}ԉ268B -M?/Arp ) Jҥ/dZ>YzPr%W,Yqg,O績µ3u~tYruDqeǘyYexSz|<9 !s6۴|F ɰ8O22YSP3wz⴦N iFFn$ڃ");+FCcaL02?Au7Hh -59i7H53}սE者rr3[d]l]𨉉n%+SVyv_t"dP!Y0#btv" 龉$+,isLNVŏ|W'P"iʼnAu@y$$|mQT O  (C'x_(\ni"dM0I"ъ*CnhޙcF*u#nV$u39"N#b$M[,M=s`r6\W T,M *@Y4DK^F"6NhI2h&XXުhmNņMĔI½*Dtx!RW$+&jT$nM-3]4dîbfEV%ܮ6{puM($pÑ1 eȆ_gľ-v6}WFgČ -&96tO]ym17@s+%;i¡H\Ìd?7F7X)r[mqIS/zʠ2ٶDCs$ɍDM-I:Z2BUSrI/Vbԙ[$hL!>;G'c˥fȖ}jTyD$IN i90X#GI6=1ES }mAE Ws'oo[3;R(%&$&\t/֦zI}erNiu(d(_g[g QΫ^$bt34}c_A i6)sohS)FIJur lcǻ`F@~ނYZœMvC].WÓgK&c;L$#|i٨C3_v. pbpI`HO`DŏLNA@Rd7tJ&Dbl(q*'AM/%ŏb.X\]SYw<&_G,%XZDn2&@g#2ǮK4>'*|hl+DB^ -\nXXLQ]i1coOH5><XΦ0nD+t=R6=ؗIf.( V.#=,u|ڲk$]XB -'8b%Dҩ2ܶCpm2ZpYљԈ S->FS$0lp\nG98u_(_P i`:Zmѥ$6|ɴt -Bցk ğ2|rd1RlY1d-J ڋrc5R1tloZN -_,== m -SٿNG<J!P\ȴŶ.O { -w]xs%"tV(+0LgJ )ݻ_ȳ9DA$ 0%u+R;rrg52BTYA2[@䜲4AzVxeDI&e% BEAoCX7C Xod{u0HF{FUxɸ)M$R$$4I:4)ĸ$v[!1$"A&CB,jT;8s҈a?4 -"w|aCLah3?M$;3qױ>Y:8Ua- ɳa*nnOA)+$KR"Id'tr2Eb&"]I*tMi6d[*K⑁0\F7n7DtD6*In2l\$lwCdj ð*YCpdYP-#a"vHF'"V.4bd#>J؄7X ",cd,M'LrId[anlvzLJhI@r -[E>_"bXi0f6Hލ6&NΗ4I3:ت"=zM̒7IhjI4TMU#;ȄFK4 $$Dݱ,k@fBAw^»0itfRh)n1R7#ؑh M,M@畹2:Ҽ E(#bo6 ~ c M|3\[F -w]MpCk lN&[ =ul9ޑ8#.Xi85՝Ծ]ap 4FlY$G(\N`ӆ _ Qz;bVr|7)1:KoIsDMD&ؒx.L$[\#bhlLLK4I5T)$ؒlKcd&=F$)b"`I1i#H&Đֺ .0F *L#DV)ℎV@'NQ[ܬGu1/#O8E`W`M(rK?GF~W p&wlaQg5K8= ؑuNl&F?_ADkc/sb4|dVJQ>Ġzlٓ'y|}/q-d!mEȍ^0Yr)q~$\:-lZIEMIE-OQ2I$ܒQ.t$PH$UI&Ol$ |ɱ$!4G/QPud~@䇳7#w=/ \U5Eb -;'nZM0Lqw+b8ؑLA_BIrj?'F~dLy?c| Dy$ C60+OE>'F_2a~UJpAD>kbl=QM%[vq>ɌzqvܐF~.?oR )O-]$=$pLkmPX6ɱ dBEE.I!Қz?"&%,ʣKN madvo JI)zMdq%˙eH_Ր臙I):#q}BDfL?}R:GMI+C&) &5LH$I"u#.H?_+V.gW -k:%w7yoם[1} 7,9xE bDRG"<#M5=ZZ| SN1 @},-)P!Sw"T"D˭1ʈܢm!SA!yV~Bv%kA%AQESFȝ0)h.Xڐ&bE2Y}'׊ܢZ,߸d3}^C'\ sWfKS# m"zRF4L@i.IDF&M$bIpI$7֍ޤ{ɂd'E$&aRdDbȠ(HD`,`_^ ZUQ46&&6&I$QI7M&oI2&[$trIv6>ؒLڸ/_Ecf`:Q ВhY[dIѱ8&IR$I&&TXI(K+I::Mi$*H:J=6Ae98z$LFJ{H[cC>ocla׋"HgrOֈˋvDU->9$m}`gE"D""m<2hꨯYtaDM$lEI&JtM[aYf pف8 fz >4jQmRNՍmur"XX,'4Djt_oeEH$K$2kWK*UhY /'MILI3v9|E1j!YugK"*-oV9Ӡ;X0yǫw؉e=4 -wl&y -96t y]fpZ[p? -~N]~Ԧ!zfo$XS%>KXQEALʒ?d(6|Vo"aw/7D|v'h"ݧ2[8J ơ*IMwВQͤ"lEoJd 7&)~^%6&|;ѯu}!<1e^'ۏʛ'/q FcaJH(m񓅲ړKClOt -D*.II {u/? ÑbiCvt{KMVwdINlLԌ]p$Ewq-p)Hy|'ܑ{#g?WSpP^): +hK!?#ْR)*R@a`̚nl}E=ؔ#0AŻ))g0䯓$ czoCT!WT-Ei27zɘԃz"k:IjIvڜ܌?숭CdP-5F2C2]$ri}ޫ5Ͱ1<>$_+ o +ɍ pMq凉=逛$.$LCE| -P3fuºN28K=-޳=XC="7|]2}ZQD_ѓ&FSP=CpmOm ]=),ڒHaCaOь&?蓲 -Y'> ~'7~LODnWNIqOeHx'hs9OgBP@2Um%+9]vY?`Ѿmn yf ;ZY/9h|!ß~:9{Fbn8h wIWe]Ķ1n)7-YlE<I<6d`۸?.- [Gh\,¸ȴ_*6T7\X oV}2cHbβW;{RxB7wKh^VxϦM!,]q$ xo%:F6 -hJ,~S>t"Oo+'T|Oe{nȸ!<9gu!e/~ҩ ¯{<-cl^*~O,hB&{;;j2u6I2J~D3>TOzdN翲׏ṉ I -n>ٛnxhhA9 ?K\H*Td'_#np"IN篲_CwPfۓCݵ}n6&+mLhxaM|/*;k !}x Wo/d1J̋; ad:g5b|?ef<@>z/mLbG%]Ja17:kHdm+{SP!7ˡq߻MܱG[Y>(٨`r^“y';^'v*: -VP"hS!O +e/;aOa2[W-W2bcQ„ݐ>UM6Mr*2If<%<ĀY䕶rb,$١J 176-'"fn-í"04?SkɶRbHBV&G)a -nв~RnbZ$_:)(lWR~(ϛ1IƄMi=_ M{x b2zlxu:ۛ/{YAK.%CDn1*L@k}-gw$vwXЦymwy,qeXj[9.r{ӖҜY ItqrbV̓_U/e-3Iߥ#сX#oՃj5=SY0gHCL#~$ IgaW -tFD{v9wjQrYss;lVҹYm#-.E<țINjh8?wB"ƥdk.Zþ|d{?<Q(qٷz_1Fof3i>ya\7 _ z{{4)&j } Cj-Sc[Ϡ4kD.tCy,ğ.OǤ -|XHڤ8xEȽN]caᐚg6b5b)bƜ05%C?gAa!JScI)nyߡKhr[/ūeI<: -#9u0Kv!ptf& ~.] 'Яys[TсR*SGmF_cpJ\Č)}bYY:ə0sæ& ZBJHI^3{I>$o;BAv=ǟ?SeeFr=E>^E5'9gD wP?W<L?fK=na+ab^_m=J]ߎY2L~%4ycJ~dd^jֽiS. x#+ -;I:GܝR7I7[19+Ma2cEȴmdKJ@f˰#/`&7,0AD4>J˒s8Kǡ6.eͩ&"XDx`^O#NxxxPJa)б"8PHcEqf<@!dbAef[t'OmؑaȒ̔X[V7Iqφf̏^uN.%dI$B>RHMx$M'FhoC$fInZ eW!IToi1Ґ+ FA9p-{6GK::[>I b{N0[C|^,622Z ߺ3w~G HC1cjY*Yw %*.OнfQmXyee|n1q6%J-L=U>`iTYP51)-,Rzs_`#TS)8rA4D;ȱAA3~Ofca 6d[p*{'nc*rٜ7m݋K9mAHl=bl>%w knAml,i srfFLv$] \;hMn8A<=LW{ol&qXtJKsP 𾨜2Q;hNN* - ~%K#3< - ^6aVĞܗNgs4'RךΙcv[濺E7Mn\zj>IJ [' )i2PyoL=H7XwѸݧ1FxO).r5V:osZ-0Ԫ伒}I'jAw2X,ʵud\-S 5gm{Zp/F$2vsYߒL[[{_r}! 1Y!ݶk?wd?/]GQGm^BRVEd>ƺ d 'pk A&'&حWxs!k%=ͱ;..$Dr KGqSi?"3!I %7c"X0!z93]D?cl9Qɑ$l3Ώq^Єc&;-%@ Vڒ1{0O>""?c8-NN&dCdk'd?C݈Gx.Kx q|h,S?ksrQO^e)#w Nsf|m^$ ddOi9' sض)tj/Ml{"o}\1['6Tɥv!g+&bkuuqC<1VbF -rO ٸ${IRХ{DV)yc}O~f1dmT,~ -FktA-S$_A?^RGϵc\&h>j\] ]=w1 ^mJ>d}aZ.euՙz0|?8[õw+ǎM{B3"C{ Vscށ -D~Wåy?GBK>`[/*k Ğv-2[J..)K胐{hcYd8;{r,G4h+  -u/Q/b\'=n>X t:RKܷo$0ԓ!V wK7k翺9BC0~n]6ICܔt&m5.vhq9aW#gy -e*9sJ%K-*Q"_)aHG[I$P,!='3lJ!C=(j%KOѿz:;GtOȯCK eClWI(W #$R Y8B< WB; l~^RJ׃&~n@7$]a7W#Y.fT[.I4d_(՝>FMLLiN=i&b,,+~̟da|sGF-l.H]q*uQ3bEwf˨@3l; i#״pofK.Lj@t EE-*N;Q̲npZ]E&2Zbؓ`ƞWH YQFH9䑶2jhy8 wR&i5nv0' -.8b90 D?`#ytF.4#gIj] )z&ab b^'abfy, sG)DR.+>a@HX&6.fXܚv7Ga ɧ H$w) EhI5v(.!p ‡J㥀'Q䫔$Q(AC -y= MOab/'D8i~,(D!,!=J7s˹o < ӘI/v7ǣz:/UhN%mH޼RIu>.[(]\! JΕq tA -P.!r:ka$a7 AeV_6dq F7:n1joMSzܟG=1XF#M>I4%Ϡ$g81y1;PS%62{ЉdY!'t:ϕ⒟7 n0 dېpe1O/w&zyR!"x$\[U7,{}{Ir/&tt]l/cYe͋$/4No-;.eXC>U([ZZ|g{se><]L\F4EI編$tNI5l} $kSIUH4 -7Dݽ] 6o. P<o-S0G9e/Kh>UKrL{1uj:a\MA31c>}Y oɢr[6#!W.+e/&/-x&Qx>ͮ&" GSVL0o囋d!dվ){vf|~ĴJnF)=SpЅ9Ad&.t%2=~AzY4$Z_>; Sd?c"||dg0ǎkyn1fS<'$\v<*9:1O4\V@v,FYe+WbوX,Q?k~ .5+Ⱥ4g3 D\F]ީ&wv;qCrCL#Sߘgyq!N,syI4UmFi4Ed2N$QI!xR6BE5΢vD v쥣-_n )( F(WxfC%jΑɽV?n'W܅~ǘ'u$uSD'qӑ{/ܳɒ<?/F2Е8Vh0ޓ0aa?am 6\&<~-R~\X˾YeFb轲q`>ǐȉvh<{=>Y5uxtgq]+el4_ثjrq_$NĔ9aAY[PYk32^A"0ߍ691".X I&\aU%gD\&ɟb+f|JF蹃 Q2BgTн"NYfhvO'a0ý@ N3,=dR(ٮPV.%pKá+GW^Fm6&HAqv$DׄY $M}萛a[ؗ%lwMВ{M l!JdEI$ZYq=s ˱%.< "yρ+{ua3xz[QsOL JDc-=tt.\Ei:8[$ܙ#wlyC&qPh$>\Oq }[yZg9$<Y_Dxa(KZHNK؉mI$%17|FPƌ-Z!eio3L5sȜm] Xm -GϢE|~ڛ Hsv!,I!5>%$ Hn^[r[})9(zB9:$DMget)Q',xٰ?BJ:'D(n@@,t 'lcu(GlL!t)P;ImA'͑xID.e Ů,Jx̹b8EgkFPԶS%2ȬKarB$%d^vRn~ĒI% lggQn O#L%mG(w(0H,!I.ғҒOJDjSix %nyiY%h ,\\$s ƥxQ-pnKl{h۲KYn7\r,\M\b#o6,1,UsG͏j<aNid%2kV( AV )6,u9I{F4-Н#aLrv#3!r6_n)7*wJj)7d&I?bĉ uIfEu6"0w#b=ۓ Ycl`ҪbՐG.'. rkF&@9:φ/5/yŽsIN1,i $K.CEAAH R "Xj)GҶSВ,FO Br }bcƏ2p iKtvߗ;qei$~"Hh9DKXē߶ZՕ.շRV"׸4.a}-yqʲK&g'zZ'"W$3Kr}+FAoQD6%W.{>e0z{|?aBtEADi" ))AAAAT(EA  ( -fWXݩE*] QxuL 1ϋp~Nx"$ra#Ivfx[NXvegz"n0X+L>ig"]g<6]QaWE2#,GoLKڅò>-cpr}V.QWqnM!:5Ջ2G(VRD Oya?N8Kr3:w ^ (( (AATvizKAoR %B(H[~|$3E ,D"LV %+oHl -ͳ_01 ¾G>"]6 Ie!3Q8ϴE>Nց$C^JӢXȐ"ΞWȿaI oP_! -,H^}F[5Ú{> dJg/abCTٞ5~ނ }tg.R]$"Ht)ATAAc@-v-i*WUZ4 ; . "d{3{aMq6=dvI6Aׁjrz`~rĔAG6>YejtOK1%dz+d}ne) w4P\.ha!X2 7b\ GIM {$Z}K-,4E7 -`Mg$&h-$t~<jo3B_H9iag3cA.o%W7C3e)Á. /DQ&)>K%*da^&>H v~i#g/.^ 08)TotX[x2Rt%F󑫲i -[!ζ!"pKRa2xja$& Ƿ- wLu:1eU2_?; ~1gA1E&3qtȖTa߂ѥI Q:WCӥM'#r۠*6,2#;]Y$Z7䅡=z]8z1S"S[. uՕ"nv$N/ę$}z-l ȳ57t-@rKax=dH B'"O{Jt1pXwhPu3,;EItЭ#˜NetM"Av?y.AhK-"D{GCfq{ߘ.$JPl^K)Ed6VX*VJʜ"a!$[gb,n0qSG aNEWCtʅ !.G:'E `QLS c[~2Hl2YCQ" oR.D  AD}H 4El=$A1&/DG']@-bb\S3*zEt&MQ$[]Ԙ"CBD- l"CB)\U<vU,@qʥ:%$rYۑ;[*iΘ'ՀD, ІA# 8;PIlHȞl"ScD3*>M3je[;tu2R e8] 2DNsZbI1Dpm~,l桘/#ѝ̏ĉD-hƺ!KtLFsI;rzd#jYRBB>bլyE;ߒ׼n`ndAb2(Sr2"۹*[)uCE#HH]؜m7ϽzE!j+")V$G2"z?̔ Żu2`oyw9oHkUQ|8 F~l6F-"o7XO)fps -MVdPhVROxR!7"g6;1(+’9*S1s ~++02h,kgK/Q -}\cGvR}>%L¾3&w( -JK6ȥҚ bH %lj٢:HKOdrdXH'],2`3ȑkĻt%,.%jNM;NW(^hɟF,~L rbx!p:!34Z;Ϳo3+؁VX(%i3eUߤet,TCw܅7aD&~;aq9'W9{81-r;} --Roؙ%,>p,/=NJ޻&/ldl g?tr`?-RN.] ߈dk"'\K12{il^7hUl_aїL59aӒm#B5M:vv0#lHEoc^ux`؂1Q /_|-m\ ?5r2QUG2sI9fU)SiH=]e}/z0$ 6C >6Jd|Qr)sqEvsA<6* :Sa(Ipn9򰻼M27Oϡ5IzsO*=D-3&tmqwd7"&@xiq"3EQZ܉I/jV2YKI&lmYTN'Cz&It=/DjmOz[UKBAdl7 it`H95o-V#$A[0t6\F ^N>ot'鶭%I'WotZ&2I$rI&I'\tM&RuN4rI5ˤI$ugUvuM=zmkoRtI4D2H:I'ҹD'Z$]=ȡ't!&tr}&M/tM3F$.H{Ej=SMfRMͨOt!!tg5I5-R uΙfL5fRNI4Ή$I:gВI6$H$bFac вegaapBɔLw[&ӜuelD3\%\o[Գdk:'Re>} Wb}+I$霒I5I$nOI6.I:dbk:/2I4IF$$Y$Rɬ+b}*O:$I$^Q*I2I$ܒ`li$I$\{$L$h&ԚX&7I$Mɬk'.MfHg[d蝩4mVI,EWaRI¤I$K&J: dԖ@N:I&Vɤ/I:-Y$ږ$n(M$Vi4I$^J[ՒYVK.I$HI$&ēIF*$n*HДNܒI'Zy!Du&J5LI4I& j4L$lH˾G"E#Xe"Z) oqV] $3 b9e aͅr]e"i'% Й424Ii4I$lkaK=$lI551p6bM- h.K$ڳG$\4'm"ueI&$HԗQ2挡o'C6^9'[zHZ|gpȚ[~e:6WCd cgD nDXqIDXHlK䕥YВk#6$osMU$L* hI$F Ҷ,MdMA:$k,,\n&Y>uԐ"`RIDd')Ӳ'#ۮ6Fzw(_u;I4*$d8qTsav&QXG?[l_~mb]5RIto0{#e3C$d$urW=75C2IҚCLEKH@=d(خ$I$\lH$D0OZo~$ hjٮ&r*>e)Gc{H-C)> IJD]UtT,¾R+W6cst;56aH-s@nӓmO=; wOcq u2Y"S&ek}S'?[Xwv,GM&Od5G`C&}'IhA)DW-EЃ -1@IձQF,H\VSah$W0U2I&Ղ*Eő氨LRjM2$Φٰڑ4ȩe $wE,MlXM$dRK$K"֫}l6M8$W-$" RKAbj=2^"SAb-PEjI/IDщF-GK"DJ:QaΎ+rM$fMe\80mW: }˛QOb.Eh\IܙbP%@I$M/4;R;Ѿ :M*C{FzЩaIA})*!V,Z -wbrcJm遝!Ahg4ڏet^DjtDQޓIeI5GUGlFSzt,q4Ax"綷j"dIBb,7ijI$iU$oZzlMv#VēIިD_c$2\l|4lp`G n\՚n\Pz^\z`=p"Y: APS rcG'R .F'm3Y.7Y3z N2bQRIЇR$LLH#Cu&LR`4܂S˴$Ήd!HKbHdf=^RI$V!Xa@ciZGXa钱j[h)$z&ȝ&k#92+ Η LYj^SL]&4LƈI:i$ز҇It"m r+N;9,̫͆{&,=8''_I2JNQVfմ`$=Kan"O]\ޒIY44I'L4izvM=ƦJbir)&.M$'d'E5"ly/-Jr0[,HD_A6Ē) ԡ#/o5|#.hb:d.6M`mh~dЖ$O^4J&a@6:nnIr@(6$Ni6ݍ5v$M.KDwobDLw:3Qj[\5gIM$lDKh0I:$P(؉z7bx$vͩ8DI7 ر,=|lVїQ*mMܚI%؄_8~;xިXrhDZ-o$w$ Ym%Kaܐ= Fڕ$oJ%Q=I&uڙɢDi:$<EjMoTɱ# \4ړFJG3[G&i"w ȫigc 9P$Y:Ex4tYLf&~xo#IDv-0w}4$4ǂwњ7ҳH&Iu#>irKR0&*M QlbH82ve湬&H$BO%Kyp\)d~e8A_ˑ/ ՑX|WɰV8[C 6s,yw&LnB| >6NRAa.sd&Pܺ&`hjګНpE/dBmfI,t49zRI4LUh؂3 ŸIŴ %6/8g60#neS|Hm4:QGKRHڝ&¢zت+As5fcѵ`}&F&<4$2v `BGq[}n_űGȉ.7c 66/4YM鴄YiIԿrKfL3Z&"b -UA䝹wB;ƍ$6{+j/A}>\gH!ݿ߫ ≝9 =X -J`et6Rz+' J>ˏ-.)1/{vS*p dBm4挞IJfE&&:RKވtrM"2L"V ]˄r2WeG,1\8?ѽQ"*7(Il14`L\vD7^O4;sڍľH1C.dR"?龉t%"FԷ=4'I)7}NYcBս%M&5z:FO4QI:UTIJ4mIЉ/!Y$Hxtzs=9.$Ws7ڲZ=K$Ot=8R^WЁ Zب1H"2o[YNЙ:fI+tf1hdN'i !mIbIBevՃ6[6GFd%"U#%G`٤sNkp7# -W-|ꞄBԶ h./I2")Dݍu7w;1ܱX ΘC3S#dxtIY]ˤ -$˹ZCj(\7X;;DUk ,H/2e7l,'kIyRo:gƺr7%.ΩVn82hO lryd͙1(%ȸKDnh!FIҴ.$ɬ7jF|&L.2(4g]j'\س}MN룵:5;E܂Hy>uCh%*B?gATd%D)RQ?Ap7Y`QF8!'f}e1i$A-Ei>tNVIF-M ,QD՛"bIMCw%0yZ|QH|7b~ ?8< .`YjAb)K@˝nXFo~Q֎lZuhoM\d{/Kp^]"Xu~}р$hE1H!F1")&`UL%TZ)&LA= {mm: 6 W+(< [n &l9hBWb+dLg)Wpd8Smig4dvBܖ0,0L}Y_"WJkz xk߁Dp+X>w~֧)nXoĚ:4Adz[(hzjo"DIՋQBڲ6"Dzӵ+6B`e(7h  V,h-5V^P ۿX턽dix+{ > =9Ii; Q]ɍF37"o[s}Q|[`{M$Ev]aPý6&/#vN/!nzRo|C|*F4oI,n\DhbDC|μ=# -6D]3J.W%Rf{-K1q)NB/Yh].L^.sa~؄=!4O{06bZ@KIpnDlWU&/ij3zbi؁SXOrKMEYoEV7Q2Dv ֩>ޛԚ2dBHF迩jMb걢 t7#dzέƨVtX\!imEG_$蛓%:K%XtnFVC,LVa9,;smζ=+֟^=yrf2+gdP8:N:HҲЇ_?'2_ hn]."AY V2}'pΝx۹ڰr`^cl fpl; ;2~D?qb׃q7(m'LOj"tJz&"T5\pA;JeGLJ$~Nk3;Isژlu(i;z 5+dI;A{rE37[D{6]b"-tKL"P-L$>%fCM F^aEYzuoG'D5ڨz=ς5@!iM˓1Vf>1qT7Cԕ'\c G=IdYZVi!DҒ]6ir=y?[M""- hbY:TH" -ѷ}nI~=U&\g+',nI#NURl@~6JKmֈ'P#qhI'W2ɵ2L?Úh\̊ƃ_#L3W[c:8bF67ZM4Q-j7'ÖˤʒIK;HW]TӘi,-MՊcDR9U^"]$Vd$)qOㄚ %fKI*2C +nRggH#U0 gAt Sr=rLl~K&Zd)בdlnRp?eɄٕ>u/.׌aUNz0joeZr}9곒ʆcwސOt6.bv\"1 @KؙPH= X˻g=') @iQm > YWʱBMGZ3W]S L+!.KJ*fF-z_27Ix'S$>"H93D9#\ؿm$B 4[Ѝ)zR芙5VɬsFhMX,n{4H/KOoN)iV6䌒ΫVH%[Ҩ^ړ#M!;W~~W&lG1t3}ߺx!IpO#~Az/uV8}SSy?{!,~3:vG}g7v?S3'qq?nsiR%~~7顳GVy),՞Z>9<翺;;ї{]cO~DUTi"rѰdC'Sٙ݇}w!a(^/CbsT4R|>/~N><>x%u޵QIhɘ}}B̏OҾ՞PYC 4^}Fw/y?wJ{~'<~=:yϽ*OZgozR;cRh?]7~>I˱ܟYϸwz7a}_/QhG/=՞K?iϲc_ycLǀp1|п+I?`pj(O.\_ى='a}]GWB 5cQ\#IvP?OߙȉP˖#L!V^ro 'Mp~Y>yb<gpy'r~NUE8N˱>R,A RzIm3izt>ȥ_LX>;Nlaޏdq#hYb<#W;ڂO!wvf{z~5XBؔGf}4p=X<_Oq%0?s*a~ۧaNfr<%< 3_E%|'/>Pg<Ʀ^!zsWhFz(/ЌCQL; eE<7ًQBrxi ,xA?n -5ɏZ? -i&)7x$x44wޛ!o=SZ.iVa^3ub`c>XO9*I儕tpi"yꖓ#CXːFQSUڭJ Hz tUTP1zcZcVZyW#'x#<Oxa*OW"|QOeQOd0Y}HX M!2O~nDҝ<.36r_Ƶ'΢Di^ODWyj%?7CWYXG;ħtG9eLy?<\ ?hJӇo~~]?9 Uѯǔ\ZNa%YT$tG]!Ág?+W<翣}[JF <"nU'z+DhoT=F~y>*#_^% (p O<ԤTLO?V"|j\O[Яo};Ţ.fB&ݢ?{ϟԳHn~hX;?3KLS,QO՟*>=C~'? ~$vL& G ?"</xB#T V4" Ljc (@1|+NMC%WA<<ٙcV{?)$d}ģtG9B<ú<E?WE>+'rd+l~δy?SK_\0CbZcp3yry=47!>ጆ0ˆmRh솴|(yG4!ƗB?ڈC$QW'>O#AM/(?F"|?{ht|L~|_ٽCFFi^O}tGOi~&GRG?K8Oܟ3Z= -_۫W*FՐseH2?'F~'ϱ߱Ж/\0ngn Rt$Cd[ݾ?3?NC210bH}JOЇ~'pNtv<:r!=G~':%Kݳ#͐grmf/7|dPͰ~>ə>$xc*3Z-~$<6W۠'<7]$4~KhgHr}}3ch{ɽ^>ӹabi:-'F~jtEAuu3?Wcb?wJbE.D?ɑ>O៣'œW -?Q~)H΂_,yO~$zk-?<}ϣ6?SnyCd~δy;~._3sƞO'7w-<\>b*; FP1?"x#OyH25+!gNsFNOs%L. dId`ݝ -c=kXM6J^-FibD&Z=,{z1YYsrz2;4?WCZt`c;7Oi||RZP>i?&%gI<<3찾$G!FbDj p4Y/#jirb!ݖ 8AQTHqVXCr-,I$!]pY%w3t9$G0Z>N i;a@],, -∔,@aj7pXܿ)LkoNʞWaa(ii7k: |C ($B7`%X;7 MU͙ p^p5anb Oa`HrŅّ~¦젂J{3G#K]v 6Y]BY/ޔ.<~p#Oﲃ C ǑT-<ߑdRKӞ ,.ow jʒ8Ӡ*'7R&# -nuޛjZW $Q+TV qHj2Mh&$/]͈ؒӄjO'xDsF$ȡ$: a -h-*CC;%LS$mvz]$鶝еǡeGZcu&ftIIhڈHtqI-hpގtU[SF^#C/]>ǬN cckJ>i:!'Z:{Rk4hlE[%WRUk LI& 1dRNW6Mp#ru*GNǢ(9tI5KXtN;z Ӌ`aiMҧ>ivtH.=M]=ǢsJcC8h7'74IӸՋKOrL6"D1ri6ԒGzҶj?Q3AoU>Z^ ս1iqî"媙C`OÓ8z=rdp&ԑ4Ѭt&"6#6 ,L -ֹ\=3}Y_њN,1+S:_s+qMpȠc3Ɏf佄,!_1L, G;]yEAv;@Ʀ,!mA,&v9voA^j-'@(ٻ}dؚ"v[=i`^+Mg֝Z/j/Hj$M&C$:n%1֧؂zIܥ{jNp~Q,w@~ M̄`#G'z _! ffH$ٞd-lte$^9"6blvi } h囄ɘQ"86߻ZmrlMdP*ū:fsNj"JF;wO |1~'[|D4tD6uZ> #rg} _?̳]gg~`m>Y(;{1qYuB.b06BY^*EAFf՚_D]* Rckc:ش6?FI'NKv7URxx\3K"sobQ% i##.BJ-:= -2ͲGWsm}_:ct.kߢ?somKG6rn5 Cb1jN:G nIo{ m P.hI7Idx8&u蚷*/MaB>X$޹/E"5'!ͷ/jHv"t4$CӠ!+B,p/"\o"E"i)$۰FgDH6e,5$*hMCC= ?^Bdu=E߉߰iȖԿ$/Bڗ]/q qmjOFHMS:Y&޲nXj&kxi4z&y^mbȇt g,B:蘟o\؋VX/]#ozcC)A(BP"QS~t*7ITj9FFp7z,((*^W {Qi:],ZTI'TջןmDEj֒krIdjNk"ǤMTLzZ:&ӍR:v@Ѻ,M$Iزj2G"$SzM'Bu<32E:&gCz&^UrF#c$$67ϣ5DLtI%$i7W֓+ҟSjGväjmt6Ork:UMU1tؒI$"I^QzQm 4UE]z$Ebl"zfԒLdbIH߭:rRiUVF&oB׽W"ъEbAZz&M$=1M$Gh$E -I:j#З-4Fk:4(SR]duZ:1*A࡭)i-cJ^RlNH:&YzhdDmTM$%صS kW$QjoB+ԑGDR+E:]6ю}RdHة5lVm +YzLiZo4UގNzzDkR) t!RQi[EY-.幤Īs#+JҵlM7蘬gւGiTZ`~ӹ-T1H(ΐFDŐ+% 8K\3->0M"GJQky JKJ2xbffv@\&J!iAn{OԟbTHi+5Uw <77jA&N*=SjQ&C7@A2+)ːAG l$ 6pƨ9vH#N(4c?oJϺFYtcs\4o&a:OuVV+lI/`" -bjScBn¦ܵ$$"T(DRHVEz0:*ЍwI&ƄnA -3$/M)~̍h%g]Cڳ\%ȐP65a>KMw=nw,} ˼50"ӟP7Npǎ~(K@Cb5.WQjm3Bٟ,ZNXb6đ~#̺=п1iCDhX*΢SH$oҗ4Ƭ<+cjǚ?>MHډզo ȅb,Lr؉ࣜ1w8Qc" J4@HP !+4ƜiUYhZ`#C\EԘ vhAA;)AR"@޽T5GI MhDX0 di1HVHrV5Ecf2/, ^VO',emBrM̶ji0 չn!%0bоDNY2l33j$YD{rM -v>lFx1r\/2rA/AQ A"XAH- H؁%[#ҁ#Qau/C9--d&bo0;-e鈾ɒ=#,{Ռc~d-lwa&v$e-u؆[&d$2OqhJαH "؂ ܢ$Gq7hr8+C% Dd29MI]:ū[9֩}jcsa`?ftǐ`<Fj&%E6RYqȁzZ #fCo #6EnnB~| 66Tځeɀ mT'mV?Z%QIm#|KcRFq&JBYX5k)097Q\6Cd_LIˌ,], R? udGHƷV--Q^hz~3ݩBxx{︩ |I]EOLK\ ;" ; dy?G ޖuS :Cս -2Ņ e~ {8~ftH?z/t$:F^GwZh}繍 ֫dVn,zY'Kz'ax&io+r6BJx<_K> ge"%!e"29( SSEnw}-%xL,p-E1 FxE"Zr~G'?av3'?KH(dĉP,H83qGљ8?x{N磆#g_/ڵc:gf!K_ˊz;VtsEt剓[kZbzMKė*oRa$!F$KА qCa j7{}>/GIwỹ$!Sܸ#"%sk:ȵ&(I,VĒI!G_#cF߱&2M Ii):r|x-+Be#.b:L؆)h?JϪH޼j΋zK\\jHE CKR4-2苓39r{z[|]Z$ w-%msgpJ.[^I{ {1H':2@i?n./g΁&8`tؗoúˣvj'ș4B&U;RXȚMNXٮ"PR/a/QCREYL12L[hiixtTQe [R --{& - WwD"Ir` K>IJBp\C9dG#R+\;PjI>}Ѻ/A\r0%MdgR|n\]p68HE(0 - J' -ܗH^Y܌:BIIt !ұfw6R1kx'i#K K~REr+[)E0C\Jqʤ~@@f&K]>t~үs:!P8_#Dz B \ӵY&v$lM&-TZ'T QN!̄rIxmt ݮIo0!n6X59%W 3/E^_H']Ge6; ?wzClAMGQQӚ5%$caH(Z67ܒο肜*dU5<Py%3.ςx""#[8Ӕ$C_hH&P.6ҽ$/hUWUĴ"|dK| J )!S}OZ7kxaq;Vq./4& QaOw^dzͱXM~+O{aãBKsd%Rd/B#KbDKbn,Z+xybGU=Ep~2Lj`ã"9D? Xt j:n:[ri5t:^NܝOV,7~ '(X_:{~?&9dy'ya8ّl&U䌸\H̼O"GR?a+ĥ!r~~ꌱ˦:n~΃~]MBW%h]$sŎ }wcn*L[ !b -B3~۽O>fO0~Y#_'5cXEF{ѱztZ?Uw_q=H.g@l8ѱKBƽ:mK·!RWK1L4D']GIϏy72D%RZ,^ɲ{ȋtJWE$"r^AL{- ;E?^Gr؏&f# .}5̾7o}XM˿tM2aWHnC;)`n'w9?rg-jN`47j'䳉QZjq]ãaXG?J%ii/fsW)&ā-dyoBнh&\ M \VSN2;^ }X)}v%;+t0;y?b︂d BwaƧ!52+ -N 2KvZMlm9;a_\ȟ5lM[3hcIH -JP#4toB(IDhX4 ( X{1>Z -i $Ei,°IBQBQ$,16ZuǓ?~,ǀaI뒫F 4\9)z#&Vij;Ts. pjCD8Ff%PEwC(%; Kc&T 0X(- J#zd (T25{@,zWң/ŐE`1~0;Q붶.lr")uED#LUBūoMzJFhSK2[y4".d|yNJlo%h*BmrI>Z`zlnsTH7CVEi}YÚ@SZ[HGD В&5޳ JѸ/Ǭԉ F14lzdءFr<)3MռA#}$R#`{~mv.dBZa7V+rܺ#w+s?p@nR] bBBTF= :n{O5($k3 ֩j< X>wImmؚldϱb|\\'qӏƆv\0; ݣ4Ԛbs)6(!O `$od,ݐɷsN "lބF 2q>鯄XKCf<*\KjXC Y&QCh∎Vx$1=퇵^`X<Hޯr`Ȫ`Do3-GEH DQhڍ GD.eUhT>g).F/~Gi}{Gw_j*%beDԱl.n㤱)^7ȇ՛1XoGjs{Qg'+H_JBb"H-cPvg~k\w,V/JG@ ?v!S)/L-ZVt!qr(= -te:=*]3oؗa6Qsb:߹ 瀣k &Ձ}l75b+%4RLjYsm`y 5 ,j{/=wGpq?O1̽7ܙܤfTI-R)*z#O_#dΓWKe)3oǁѵݿb]"۔2Km.ZA]ޗ塘 .kX#f?aXTF"U%QT;CIM9<$K} b|0~3}ǻ_ x,sxO:?'ā$gAU^X}>ҿ; @~qwZ9~r#3y˂F'ɤ_3 y$f$I$I56 Mݹvd熡sGN %Di= F{C7! p{EXoCzhi&ޓǮjX?#kq\x}x 뜣mm -?%Z ϓITu|R~D!ϒ$ĮF{4(:~kI9=Č:C]ۤЙUǫpܓ_$L:xQ.Cs;wm Bm̉ TVB b=TiG:$tUVup=qT-ޱ.H07A#=AQDX|EN|[rYFrF2u!#~ Š1!" 5:b%=jt itB&E R=DF)T- ŒXq#e$FG%T w9b/IܻYpjFLRtAdqb3"Qi`QR݅gEXToZi0$4$@O};zPA2U-/B ȕE [rQ3ˎ4HW׳8WvE#0nMa׶_cчO6Fmu.p8Krȸh;o0zūzES&Tu=/7Q=hfGic*Czw4B)m3I7B Wq\>} mXS0'p&.4vj 'IF/Ԍ/ۡ&OK7%XW-$60ЄTcҢ7ܴ)`66pD_A, ~2$aJߡjBQ,Ḳa.:mձ#S#dcW2DĮSِf@ǻ_%vל1{ 3Χ&F3GQ滍MjDQ [$g~~'!1XX8G$HQe\G>3$% l[T[g1nqw[]VH--&q a$^7"D$߇FՓwSN{wGb8ZI2d=&Y]i ;J+ -9'俔vG]97'ܱO9#e0|yľ^|(VJoJ6ֻFQqhoFXI~7balm= xs{! ӈPb,%.H& ?,Kr:\]owe\Uɶ8Oq(o7dC1-_A$ۨB{ ?ӏp$7{dFS!tvH[#-Г.ya'?'Sm ȇFbw}ɄNJGQ֓zB&hqO\εD4!Xk'OqIuE ˶՗9"3yQ65ÅZj"rDD,r7+0S"ubۂHLsR@-K<\O\o=1fY#x@czAn'`[; <: -<MkfKu܏bk=SM:M"MϦ}i"WD" "XG} JІ@IJ3g`YD)_gcH0 --/n\7nb1*$2eȻ?xeqIM(~GEo/Wys - -@CCP$]2$`bSSȑ$غD 6$a2S1LM? +fI)ǭQ21-HX8zytC9_aKm7ʙD^q^u7f%x -ws'pEg:MPN|M~%. ~yƉf]du:3%Sy$Х1%UÀލ4߰H6z_DV.;tzkluCƆ}$sԈ'2F9&B p{ _B|6ɧ+ +|::!˼(FZ&Hy"r,:"P^F ,b?32lJW>ahvN{ǡ[4z,Mui0(Кu /}X!$adP0i-tV1")( BZxR_iԃ%[cx 7jYq!'%@GݓUWDfZftZF< $JM'K9P"Vд"U$#'z6#6"~ٷjPFH?UQךN"\׍l~:z xODэ:UWj"hnDҴ Vb xL8ܻd -WTKǠkmcw7[ؓS}FQ@dbf(79עFt?w!j2A0"cZКEy]R&0fʓ:CC5ͲSuVŚ'E -6m ڍՕzubґjDEWEN/ؘ:ͼboPCaϻi&G[盯ьCNA%^G]F[-tܲϕ!#:-(Fb/X]d~zc=7m7/F=-Sθԕ]vpM<ϱ'6&_6DCR3;>I'H/Gy_a%0V $}1> Y'CҰ,W8W]/OC&Djo4I:UǧmTi}A\C.[I kO#3u1K7C:/`GiGGgKe -&tΈ=eE#F_HhtEW7F붉"{aJn>*>?$}dOhNSytG"b81e|m -juwԄ*} ~ ZWaA*hI3ފcSp)3b߉dıoǙ2ya\;:|`[9t䇁fa=/#O([OTd4Ԏgz -advFڰ=PAX -薔E;QiF#K$dt1 I ?PD|8%bm/bL $.>.A%*,zґbi)ZFM5z6>'RߥR( y 5MU^9Ђ4=@ ^= TV=c/4NƎu[Љu:u A1I۴t{ nwn"lpdk@d "wbH+tYxewxDžics($xćQE6gc[u2{Tfl-joI'D\TV8+Zlt~ܾ#tad$L]/Hd[Hp/a^6osȮtͯ0")!wk^ohdmw/g&{!n7 Xs"<{r&{Q.6r<2kX]^jJ޼.Nc:[VoT"=-LCMP$$||0(׌_#n}:n#!uIl*K'SV$!kgnb_v;'awiuFA|lFR#CLA[т3H붋I:Vi#> ZmWfF'LW \UHJr)rs;.GCDЖBCByvj>@)??Mm#(VNwۛ>˗(rHbl[Rmٶ;xJ~E^)JM$ZN'R ǭoV(VgR,{ ]ΙzcyM my3ÎOP¹F@R=L'{mv":r/w Kx,61?> 2gvH%Wҿga-? ڈX>*lbDtz6%5,'KĨiz$'C[ѹbh3HRP>I>rOVw7! sS/ v: e ݼ>[ˠwsZG5n%ѹ P䕾pX"=K i%tMDUja Tq@FM'[:`3ȑAA-,hHhCSSU -a/Us-4[%RzBu:IFɊM'WvGLz*KaH!9Bu6/0`KD06uI.)f7l!A[ȝԮ{uAz:n?fZޜ'GM̞d\z/Klm -(o !m+A'$/Iqa 7xbvc-I+et>]s˭͆,),nBU'4sY((RJXxb\ ӣm?t^mC`NfBڨLe2&NsWԳ6.L.Dq`WOOTs>fO~o.P_O?F~O# [ ߰^tGya| IqO+6#EA{_&L?;.ԸVz׬X1M3EzCIF:EE|SߡzIW,6ґogHC]3t=A<'$쾅0Zt- IvL.ٖ&Y Ec>vp)nX,OBھ/3-rxt~BdRAG/#~&tRIb~{n{ݝFAcE1lBBB"f[@-'^p~M ޲Ļ ۰Kgw>ǔ<89I(r dP>1r&L?̃MOKSg Lq5m*:{䋷#]{} A:uEnK!~X?SʟF%݆O7ljZO ~$!S8,Q[u܋7+'EtJv4l~ّs'cFELA!$BR#=8sNcbޕ%کm%"G-2|ȳ%Ņ>px2+M6 dE#8PO;GZf*myy )ྙzg{!I-h -nO2rBd~.'ߦZ(8#bI{wEg'TY{rE[DCč |7|@.DDGB6GCSgUks¼v_Ǥ붇GHͽ'F5~x'vIaљG7nJ9"ȂVݕLk/B2dŭ똸H% (e-EČiNEBP$?qe66d PZFSWBH thRЈ*9b- -ޔ Tzu~=;\UHHVGr)H솄QVX HBT;hz`;e3),r̶=@r3lz&> SLU~ՕT&EðՔR$2!%I!g%eaNC*,QHSwފuO)Md%'OmH&FZ_F?b$_: *jgaކ@e;S9)}Swdq$Dd{LO 'ɚF?',d,[? (,_~D&I_˱=v1U-m\o ϋOКk?ΉՄixJ+5C9qpDXZm1LA^s$! -x|y1YߤC%|!ϥÜg{DlVq[px4b朱s`=K5/2wC|d{)|h4,[n{hy Nw۰߽l67_31"M>oه,4ѵ"<]Oai$]K#*[0qOq4 -EM2++Ac4ͥn9{c^|? l坓(_ %6*$6swb1=Mf鹑#$tEUZ?CAӗx= N3o LW?Q`_GD$L,e:)E- ED\ϑokkl f_<(7rO&_J_8DecC'c>k݃ @iN!Toy~ hJA+2z T~{n_`LPNo/)b >'bIh`4ԱL-[zVN7[UVX& 9o.㋮GWd\u݉2p\D(b,@_#2Ą; 7q$Ґ*H+mcX -;[ -ܸ -†c;r:Rmw'F&Jhko6 -e x?$nh|,9z`B9ɈXm-rw%b]IE`YI[JF{Ib;# vf/ގDػ]d8knaT&Obà?$] 1~؂Lc l"ܒr< -# -6b,GɌ9MX~KgMG!$|6FX6H#ڛޛkM:n1Hht6^H = -cWQ[(O+ Bp:e+D%JB$21B:(]A)wfMn?[VTԛ*54EE Q!Pn%ZC#b HJA"(ƽEIoADMXɶ/B ff!IbQi*MTz&V)N=F;ht'TjM~Ѕ/C {{1l_Ȁ\:+TȦ@9863S/u|ź r/V r{96:!bN(l&%arI4. BhmrL6wtub5埅nbSMlI6ԋw&8%F+;ercW~op'cz #]\ -.,9؍T-¼ep$Xjzm+]"K$\qt3X N7F$6IРtp^1*,VIj.K<%#grI]Gf\6 ,󱲈~~py2<[S7 ~!m?;&B r)2#7o)#D'q;w4y6Aqbu#f"~ngE{LP큹 _cED8iI73(c0JOKQ<?;߭,KOzFwQؗk`K.S9OqMeWig܇[Q츗la~oژ~pGX7(~#Dgǫ5Ɔ&Df7cvPL o/!S2b zQ#ROzHfI/TM55l;*oy; ڍٮIvB[1=6d2L'DerKXPO陆~qW1ݸ$~)g6Rww R} &yY'@/B@I4tU/K-S˫ƴ#B׵1V"Ċ$F+*E͆2؂*;!BB d""0wRBDB"BCSR(P !D!]Ý=bI2#dԊF蛏.ZW#ZF=:VuzvЗꅣĴ.`Uz2DO4ҒhRnd&MiZ`z4պ?NimD7Kic1b-+NڣNڤ:ų$Ee4äzz*^-s-Z3M/ίa~4=&:EEΈ#Eص*Ɖ&- h$B2I4Z#RE4nז*I:'*$ЌjcQmDBD}Izj:*O4L2ԚƋF]$֏j/Et7nF^t?AQKԹ%5LtpJME!GcґKFtbu/ERif2hCхTbdDtR24mQM>%j2"Tb#\U [z&댰ؒI%ig -ȉcGjڈl$ToCfF[kϫ$M`5=TM$ sG (7HJItK8M'T^މ2Li6(HKU'Bd[ -I$C$nFYNj C"M/Y;i4DRNۛMR14 5Sm7i$k&h0+H)FWi"AO3LXa!7fS#$vLF?%oU/kBW t!] +xqq+!&s)@8d.9$\rCd6f|!4[J[pni܇?KGݧg?5DddnKJT:ʻ @ionQ?Hk/?&R9'D -[ICE)&O/zg@ e*!1AQaq @P`? @B(~b. R`us*"Dc:24\i;DSZ_[DTŇˎH c˲ \R4^cVXAjSUpX:K+Y38",R̜S%Wv^P %O3lJS;EKe9en#K/XK.ue]@Zʃgdd%x|s#n˄QDDE}5K.-b]t[ap.r5ȁ{bb">1u q/?xlr$O1i:ىK d݂2H>`. Ñ*Bl|.]WL FGK6KFF eڱhߌBXCdpZCbZT%(/Y#5/gR%2K.=1$3^[2Y5,|l+S(beɬYQ5\p] -_Ws) R;,3 n`TVXt؉<-"]C_-1:z thx2]ej;TcKKvC#ŗȾiW-M%B˩w.+LTN+4'YpvȋNGbA6kv} 9l6kK{,v5.<@XR@SM)ˇK<9)J+!plՖ \Q-%,{cU!b25ڶ.NZ‹Y{> GXGyPߋʁ^em]F|DI3kv .V -Z+̺`#oĽgbϸ -qKD Ip6s#<.^fe5/T3KGBJuN-*vGQk.^/_̲|FJYQ]zQsfe, -gb"me(RSd(Tش,W,b Wyu1Y%E-_Jd*rt(Q)3n څ,%gbе ۖa)!+pik^5jy,g]Tb=,TPۗe |\i9<˷/RQ[_s\@`6㩵S&x6D[mJ+2ET -*&(R[B,9,";6~:v=eă tKkeUBe& "gp - B94Aq Y*QyK0ˢeZA;>|M1!ٝy\ G'?Q䬘M:sbxE$Zr=#[טYF[/60J:r`B,)8(>f Y^ :UB*\-g \bnv? -#ZTU f6"-vup=UB.nY2 ܢ"e8"i0`P /tkȋkFd1AA,D̍]T+>7܏nYr1<$zYwJ -Bš_&`0T\9~3fCRc*c --kp*sN/=&ّDQ(ܾ˃{g.02PJۘIDgԮ(CG[ kf* +E_FO 2"8ƣq4 -mY"9S֥#vUDWƥ,I(1ܵȉ<%)c -VFl%N2% :K+eF9|4%| ][|Q>*J=ʧ; *2i"eξ-s`\E^\tK7#?SDLB@ s"f?)]Er*_n"o#Jj0?S9)`#q)nF9ExrY<d^[n[uPiaٲhȯYkQe[ rG&TȔn#("*A*8H'Vskvw-mhNӵp -BZ(PU^%ɫ J -au+!aq\ZCl.t.OrnUTf; g!: -xmO=TWbܵC82_9{cb"jB2e"PD.q|Ty؂۔e༟|d̋kp<~ 䥰<pHSJAr=f#w-7<'.-栱)RE̳'iKAQ qc8%UP& DܽX )H)?}SKk8 lDj%a.veBX†.ƣf_y:% ظc9Rߏsk."(fKlx*\M-Xn -{LJ*elǰe|Dˌ0 ѳn*k]e R l#dY9<ʷb -V#A(V.(dCOQUF1¬Z&oM<fbkD -yd$3ZL\Tqƀ/!V͋P4|7cw|KaT\^!6F -ge[+Q.(q;OWY6İ,1?oŊ05ly,eʠb*TF[ -J%遷}\TV݄v+`@Qs7ȵPbEBt# -`][Yñ8T@ԍR6`HT}'ʞFԽO rA@;i|]Jrje6"Q 6ضn"+X׹e&_.Ta-rFe 0bTr&x-rtC Q#E]A,-5؁LVP`VJzMK#]BU`/ER -6XuTTƘe]Mq "Ȧ[Ɩg?CKEI[p}+fUZπP949nC'a6"Yp؊bŧ&C*Fnug[~A癴^€rv)(eْY2g ->.V&T\uK c@gB('ht.4UF 6PaUO6kQVt.!j啋 ZJ%3q&c]>) El uj,9,sBV U$D cLzORX*)/!Q`gk%0Qeh@!UY˨\yk|%Z0[:୏*H\c)yTR\ jȠ[.C;K eJfDʕseB\v ۖ](Dc c^6X^K"*1S^3Fܼ%`WȫW3bj[ZeK"EbQj-SrSg7!+: @ lOQS&Pmv.UNJ1τD%? D̽I G. -UU+"o%Fi KUVͬlh*ڿqJ)8qPZۍ{ q |W+Rʼ Z9: -٫/.0^T<-Q- - -/`*(!l e4y*A|Je DS:MDDRS4"fn9 p4ȖmHۄP* .(ŀx!v,$C+6 .Un+2j|]Nbog&g/-.]gh%n,F:*Iu,\VT*"1nQ#"ݱǚoj>HAMr+zJƔ2UPu"| $Z[`D]W>+!30kZ`)ͺ\%'nԋ -k.>[ BIaݸ"v6V\#ggG*T< -8B, mʁڋl*(Dz>"l Yo>XPCu<3V0]Nv+6uJG'A AQ*%l<ī(BgL߹[ՆUwBD9ߊf@jTvQ@pKJo(`\u5 b{ >%Lj07~]hܺ+--KbN'8O51 >.%1@s.IgRv)g7ԯnReO uWʜ[ rz׈ llbN*1`A^*~[vDLE_"BxELOk,lE6,..CFZS}N1ωT85Żs -V> 2wu*>7aQ`F6\`T}5*-Ͻ@[.ޘE4SH6Op6Kmt^dEKv)3J {-:#`~^@2r 扈c7bբՁr 8>ʊ1րe#+Fa.ʕσyU-5fl-9Qsei-єuD@[,ioeJm[[/v}WA)nXE*KmyRSgTTZ%J}J28dȦN .M\KNv@ wi] ba;P+MX"2"ͺS'CJ`Ky >1K@ EvfdX+B`e&ޔn6\%bhsׯSm65x$M'z`&R_ T(c!j{vo=p1#XV"VQlض:@IFO=]J[3"s艐e۞I3r>3k%<.TJ+&ln7Zm K26A}ōp/x Z^i\ Vbꡈ,2}mʏ(ׄ@kKWeMjp´W'~'F yG2-Zl-eT>"w.)wpdu\pW]`PGL5iywp ޶Ť#g/y_q=dۢ_s :JM`D0?ہABF硎?owxsu96ZF+J>15.*~'g5(bql`ħ`Ok2adƮL9):U˙K')/x2Fn {PĔ/"P<Puw-ME~X?(YEeMa"q -.̶D87'eQ?aVũ¨AԮ,aw #U\bۀV%ʿV"C9D>sdxHU}tƭ|TZCn ?ޛwҘ%;TJh o(!@,\9JB Ơ[^jT}ܿ?2ؕC3e~KO2<*8W ն.}C c , -e2C9/j[q/.qOQ@@>.m\܏!n yvg\&Ԥ~Xcz*7*pGY oܦÐYQi#TE6?e}l2]y,$k6Yh.WYPGa)!x -a[["h^ H O*H9˚ήQsj]ŬTaB7R^5>7IJr-e :y+1S(բ ѱLR,=cPM -mʊC .rڛz_Pc*:G¾K۔R*-vRLUyةjW_̪ύ{+QduPp؏39 ~! -nމs)XA.Ψl UJ\ԯ&2cw?hdrpY)6_WlCp[Aflr cT|Uš!% -EܻڝgD2d -14AB ?(1t؟}2-vyOrF%P\#CVM`R -;8[7+rx)*6חZ.]-2 FV0=!,}y\gY*︈0 :bBBQ[Ь> =4cTּ~|4(}n+R1B FpʅJwTl3Ǟuʩ˛kLg~\SYrc')b "ʏI{ryC˨y>-Щ|bˁ8K!]M@DD%莜BlȶDU8"ű1|6 1rYp"p9nnbKg`M :GLo`J_$n86dWJPC)ĕy[kͨЎn&aY^ı)tU!غ=@JNڸybz`،f%z%c;b_w`2Wopaϴe-a5P[ܥŶv#b5CKs.[& a{^UTLy\Z{3>a[IeL\v~R,6v2A -XR!в_nd5AܬȚ!ߋ9=[ypm~ONŰia@}P1e}?+9יtYǩ9'n T.S< s%`Tkp@CUo/qe[T/|`zAqF\ )/AؿB-b쪸,&z_7k;lWUN[2^ |,%kFZ:F(96=O'b?iTUl߆JkHٞ"Z V0T<)q3gl"m<E]i*oKLLRWCv"9bhq<JAs[_ /8 - 7e11зxcPPژs)[EC'ξ՝kWy~w -bG>PԢm>-H<6Krްy㓬ķ?zocm ٗy8(1=_+֑ގG Qj -ۗ3~訁I˞" pa,ԽH{yv̈a`CRPo&%[ ar]X"p% C.רQ:>߆'e IizNcp1a-JC Ijpe@|E, VʁڢA%lT%Mkbk[#V+d)50iIqED#C"g(HQ|=lU -࠻Qi,nrsy23/̓?lǧ+~:nR56|ZKo2rpovF={BQ2d<"ih'y_:~ʨE>0rjHE;y fm&hr/VP^C}:6G!rbJKV1}:j jQlk1vgˉeZb-vՆ4x I_>u%Lx"_IdXU*}GP<|(vYO2,%|8ˎF{eƦL:<ѵԖi~QE,1`BaȽƢpNvwq5ŶM KC[15.n0˽l2EFNEm œ ~s/MX۪B -71y A3#~I8m[bagbW*:fѧ֥p #._Q͑XQE -mMNy!^'v-C- 6zZa B%|_\؈RS:Uy4Ej}lJEG̏>+"n\r<?0X n?D|3yc=2"#-`1gg]aU6]s,L;).Tޑv3`@j) -y@Zi|"ԕּPJLT1%:RAkeB pR[r]( -J״]Cq$v<#]ZW M 7~P?#S})F(jl4@kj^8j"eN}ukjf4)99<Ő -h+qEgJ'PoedbQ4KYQ6矆<ihyED2AP%TSp}&ur>+r61?ܙMUJ<ܦ70 -vYckE0_n+%.y';( LhmeN\īkczZ0Ǵ2>%tƣ)F-o -\zTxs7!},4-2NS|nZItL崾@'U[xmE|`vza\p!W Q16P2h~*3v y"ʉY@`~}ˎ*2|rŖmBJ.͙-;:b\Oǝb|" z'PYIV2lkY<_S%eȼe ,{a#p'(.tk3}OŔSߒӂ]O_iLtw<1 ,Yl@?%]W);yiʜ~XVKlH-#s"8-źO7aF9p͏Ubj0`Z]?Rq -,PڏX>*9!TyvQk+U܀B[SJU8vUTT{YL -$x 9RRƆJW%[45u.mX'L`63G RؚܳZ/tʡX}G + ݌X,iJ7wPK 88[&R#fZ)Śf4HO %AP98~\`m7~/0yA"DTH{'n1mQL\ˍ@ ښ6+eC0OR,;*LGa~ &KϿ_ŗw\vAPlEAvG, 3S&[clt%jb͈UʗͅT^F˃g*dԾcʍ#٘Gw-<@_7dC#~IdYڃ{t6б"ax* -7d[X ^.iVJ `B"4 -5fߴUCމ 0 -&:Tԥk \5uԥ̓rYY/K= Sm"73& gE '<͗pb_w/%2Ww.I,.e6 aBש,xgb.hL\RbʞKJ'(7Tt"c2^%`d|XvmP\A`#B$kĻ`Y_JR8[7⼐%0$2FDbĀJTVa\1T+S76e=˛qKAo}]%8/E~"*LS6i eYXmb? ʕ)">b|²<~ BZЂXŤ6DJİc>vT Hg=GP8, wN !dPW%1b>݅磢1S]Ԇ؍i>a5% -ĢG.cy"#k9BPfIkqO&.W: qnϘEܺV㇒qI>Gn`5WLg~&#k9ێv^n̔:Qw ~½Q -J>hlP>*=A/b`q݋K,PjQca -˝b+[gp&"1*J "/U/qj#ѩ[pgJF|+JmcrD_b֠X@+*Vφ ciGW|Yޘ>@DQ? Nx3qL_S~&_6vҋB7PH l6< !_l_'a䂂XKc's?|R/J}Fft.58Gp#bbr 7Q()@q#AN?CP~ --3[Uҿ^;eߗ JyWʏp[r;N'ꐖO2."kiwG+%kypKE<KTMz%򽟔Q{d#-h&fwjm7v>/n7_ -LVH.1W Ck ] KPA,5q/J <ԖRK텾 j;.Tk߽.6ye?ĄJ!"?hj{ȮNw)vꠠa!_ (Mߤ@RbN\|E7/&&%?qst?(xio2all61d׎_Q#l匒V"Iwkn [F% p < 6OܞzV;PA䥑yG] Wc2awTD.YM>+ YAN!.dKZK+gNUL JG$J#6p@W Xrֳta$\ @PU\Bޣn֬j_\tH-Rc次Ҁp}$@b.9("aP~~[y7q[t>=DK-c./V"uMʞXS!_3 YEߘu9y*؄j j+iJ5Q WvA ``zl:>G> S-U"WH -bcrədP7!F]tV[]%V[id牌v  guN %SғNdc+嗇*7 -y" apgJà#|t1aZ-hY;1 (KU\Y-Rʀ薆*QM Eڹg]h#l]MKCSi/vw];HK:5 "6F7u.$6HY.S"˃Q`6Xe0ZS-!o,W7#7< -SC -~p&Kٞ!eqy -SK;/Vs|"TJzٗ71xؕQ7j\Of]g+enJȊTcifr'hkJnm #B;Yq/Bj{:cmA_R 멣Hܚ )er+ҙbcFS[CPTrwh5Q>݊EZp^Ōh>\,2@[f9LKɺ%R+T.kSY P|$|kGUznġ6_܇rwʗkJ)@PAܚʂ'l}8 gj-F{ {~`ͰYQb%˞J>zEY[,'f*( ײÒW(A*dkEyˀJiQɨ ba-EZRD%E&, -Wyf%-Nx࿁b8L:5 Vƒ":_bB(͗mO_ܯPWŊD̜%2$_yuw?jWAXkfmh MMkDL7i g1?ێuk1C,.%L+o~.`2{^"\DYcwUX4aLlMj8(5Nc~eunxtFUKe? ?@ >)x4(%} n]VD JʫS8Jd `SY+R2b[ۈQ;WJfn\pZљ>c͔+*j[ˎl+}RGg>wwaV`ƍH \{пNBS}N̹ibȉ -#oS3TvԸ QSy_*C[>,/cϪ>ȫ?J,>D#@ {+jWPڰȱK+[/ʉL -ga%X:x#伲TqSQjuZ2x_#K `F oƤTǜ0qLm S !2ka$#KP%7ǘi`Uz8G/,i]}\ҫ kp eK2madA\ߋhKc!@JX0 -"B'Hzgi6B&au@frSF|l##0/։eEw)bI]%r?rبaUc .R;_3X%S,ged%.0QYv|:JΓY.f @Ð'$:AaQ؉KX1Dపe+2xO-Q2\W*%/P\dEmJ#WU-n˨Su(m - %#czA֪UlqK \>J՟z(/Ov^B*XCg'Dr+D\M(ﲖŸD"r C/ܱV8DQu!W%|Ti1 O-*=W&MX.RT|Ddtw@0(b|]ٮ-WCF0|O!ʀ*9:5(xns./ULVqRQ4a!~[r) (|@J%ʃT -ur΄<^& 97b] -V@=PrY0cU~+3 l_Ʒ'Ľ#`rdv#kd%٘qJ&\RmzG!Dx4N!:FVAv WENG-(+!]+ue~*ِ^O+)T|yiR4ax*>)5ȩ8JPߊM@Ig|\?$TlMy1X -q.V3¶_w!U|rXۈ.ArɐB^Lj9a] j,' 0IҲΥe4Qr*-50T|/ԞKQÑ N5p˹:Ans*ɲ|k.% tsaq6H(DO˶AVR[:K(?02QU0?=ьUPy+!?fW/ȩz|mƗ.ƊRݍeeBR!A\)s/%*r>+ a -Yo`(r)l.8*X1cn;,z]\Ĺu zv v,W(] -7܅{MKDU1R[[ yCeOF4 \->j)qv(Xu]qL^|oƁ._V,nOC-mʢ)sK 3J4*~E`V\)rRB@p<4@X7/D:n)t%jǡjxDcأGqV^IRTSb%/ hu!&~8ˍzԤhJԠFnuWABp -EF WPPT1:}3o NzYRHNv٧V>Wun)Bfa;H]C[HYKKVD6 ZgwVuR -J"+P٘˵V퍇Pa]N6i}Z&RG&\KPikqA*!SQ;* 8KY.THTĔ P@O|%@meN~Ro.GRB~BI}G^Bv}RhNr%A( 7e'v$I=:X)NnpQʎ2*pS]zBM؉WqQa*,[?Ranl_R!jA%|eKpKe -٥eزeZRݞm1߇=eAeB4).\fo2eŮlP`7lI0ښ?qQh-!^E!͚GeHexgiE^ ŝJT& /fE>&D_N- Uqp-qll_OzKqe[.-`"Ĩ~og) M˸{k.:c؝ʉr+KENp1їiLL[0'K@eZJ{|DZ -ƻ7lJt([iKA/S -`Q߅2M pr raSɓA;;.&J*Pe˔ve# -6Sf[o1gR@) .!Q[w˘mˀwY2UvEAR`j r.\ydY -|GWR{: qdՓ-rv$'az[5qr693u{ ݜl іE@g'< enMY+ZyWĸO0)dGZ!GIKC'Zsܭ;o˹̏e\TK3eԳ˽joY_\ڹ1QA擤)D -/bL[rt^J A[(Q.WeWg5-p/n)#.]PfffhU_s Ů1nEȐK'ܺςu|D9rꞰųx+ %r_œ: ŋDFW.ڞb7a`%`RˇxRR}ȐeQ۾& ..1nlBۿqfȭ5KGEkfLy_%J\O,I˂ B!j/[V{f|7U5㌥r{ڜ]K(7ZYS|~.v\5ݛlPie|bkK"laæVn a4\ZЍ_bZTЗcK1uJ.7y`uAEQy#u_ g -6?Lld T 7I;k)Z ǬE.I ^]W|!r/qVX vܨӉ&[h?#F%~*5 B0irejl; +kK;|TEf%hAۖ;:l,S{&L}KV -s,b'"ECJ֑Ε,J]Nr^Ɇ_$ Yw%5D|J./QYEK`Og@7`k"pulSv~eǷmRu:oDSpYc.f6T IuNLX\a *?sŜBXa7 -8*%LZr) LX:unT ,6"4e A'&r0JE"]T DOH L *UKڬ#q!F u=JwpVv*2˕_d^rǢL x!ڈb* lKQ"/>CbryڕaWU+BdUN!ZR bK QQl/S)SŽ8B9;O* }@EYzf%Adq+/jYQ"Ke Oı|ش\+X0L%NNwWq`K;) ՉQZ.%VRJe2Z$ڕQqVoEa(]BrC{.zfOE_7(rP*E|vyj)+e5vj-ʔ`epn"lByb,F<ώ4PdjظFusjt?P9:~"rRfvi6z!:쫻<_$SxȬ{NB -iZZ6ľ1 +cYC* ͈VWE Y2uD Kq֫܆T {H؂/72ݕn$Gd -z䕫V}!=/t % .^uHCUCDs -D?pW^l~#g?];UX'd&?IKyA}Īo#P=*zNSi/TMK\Uem,dIq[/)O\%׸,~hiPO0Y-!{ަ% 3b %RMa?F$_ښVFK;b ^цʼnɄ*nc>(L,ąVE{dyy2_s?@~/)ְ~h=Eb A֚4z%iD~${M]_A&Ef#^vp\* -pRhGK(g5V9bc%7p'24nLC~lAH]Ta,*~f \!#w!ط*ߍy>-UXr(JR?1niD:! i"Z P9"[+""ݩg ?p(˅+7G[ -yێ|*e0YLC3)dxZSː> `WG[ozց~T:) yPjfjW2Iژ WPaAW`;!pinVٗԂcpҡ4I( DѢhxC/=aFPpJȩtu`-J 켨6RDYs.5q'څ Mlhq]di:A{hPu:=VC.Z ]\;j (7g!ڕ1X>/&vX[O?xJbeTK@aʔ rZ\B-J^e /J\i?C_3߲;d7Xt2im,j;+;X5TSFYWi+D(Yel "wyR\rݚx*Ymu. |^",fKYrP9'f-kܯVܡcp*U׉I(bgedTxʪآU.Ǖ(0l;/efd):ƈqHKV#M:DZib7HK䩽wP)ȏP唪Wܢĺh!ҟ,4Գ-c0z\5f|ر Nz"XaE56WCrl~%u& vk1w^"UM'Pr+|;H/"|RT% '(QڍD}vX7[KyIG>S%*lTk~{`Xf -N&ҠV7 u Pc>(]" ڀ ]auT*"/YP+erǨ2,W*W]Go+~-l2ԗuw3z!0]/T380wJ5cc >*{#u"`ңd57t_l{P+n#nJ:H_]ܼj%E}6LiО@0+S֦QwojJFU MPUOrygQi|0 ͍"rJrO˰&\fe0yj!wP& 9rHn^L /¸o%*q7> 7,n&MsXńPEP^)*ӑP>|+?rD^go|mxP(Xp|)[Ȋzae°8Ҭ*Ws#mdy)ӧu~||iQ CXIcz(TB~1%Ց-g+0]jW֯ ks7;b2嵑_˕}ɨݞD52K/XϯXue|z` ٗ6Y])q/#eV 'mJF7*<"spK`5gXuŀbܫ+ar|uvz{f[˛Q7{֒a)Ժȹ4,Zfi%o;q -/g) [ɑd_cU|dL݄d# -x0tx?r5>RWaUB{aJSh)R~gENupuO BRاBrTgѧEV鱚0]#-W4o2]節mRÏ<߈gj2)~T[ga0-m1Qơ(=͉eJ3t@6xDvi/'rqPf\ Idy kPEdqW# -5ߋ%9Sv7);k{*ls>qה*mcfʕq^ -),,! -sjo(9%n婀yoUf^0?s0JWAy'cfo59S l~H~ R&?J$Ba˖EV|h\-NG5` ج!vKj씺ruQPipPr] |\\zF8#w/.d_>!A #Q<\SVx&Pćy-We܄Ci]6-[̕&ŝ;(dG\܁JA5C 0j=M ]*5rd@īp% =$֗_H|bKm|0EOY!ױ82 ,,qPB -W$Qjʲ Z9P5,s<9~k,۝!W 4H%eSYwpylj>wd҈#LTTZ(p\'16k>'?)d5n_S3v"[[ɩs%RP3a8r%ؿQ_;R4~JpW&*Re|=AY>UʁR@!߀yX- ]NgRR.-cw*c;c4ԑ67@_S-M'$O G=EWL`'iFϊh;Ռ1̧_Ak Gf`65s~huh6TÕW߃Ք^l*+,}\<^Ÿ -LO[Po"Ի8ߙ+xS*=b+CT;S 2)SOvػ<3ļezDQjBeTW,x͉p h>9SS,B>f9+'#e@gbǰ+R̽P,JQErZ9,XAˮJ_QEj-5m. +)%AhKXpU_{T[WIN*UDІnUTnd.K[K,R/Q/ hĶTol#3|g-Nas |WܕG ZADRЋsY5%F<ܺaϟ6 :xZܰ%-?~Ҳ r_W -y -*P@՗-L*>eQ0H( HyeTؕXñP[0yտt-1i -ګ R{;zFNj?QKjѐp%Ծ\T{X)&cynDЄeE]f۱"*\QA6@W[c2"m| e -~ e$$;-Y qTZ."jTBxϪ}RvYnE>/.㈏12n[l郋0XTb*A[%@ש} WmH\F5 j,ҕ:'<,ܶyJ0|&vUvxDwuJX+Qʩises~&'EK09 B6g#p|Lp.U7\6ESi?QUCAGh6W&`K[ 9qfdۨlp|%yړ_jgSc۔lǘD~>V_~@]3o &yqP(^^@%n8*,B ۿ8Tl#,/*0!A,&x@;fD7D_zԽRk)!^M$( )bjŴ.E -:; RsyH1uM"MLc4ֲ[if-yx_m7TԼTۄ-&T} "h\/?D߈Dtf?XtHXjR{%@+uXA_7ZlYۍ&AB:Z"!_)}D˥~Y ږUu搨*Yk4F࠴J0 n1Zh 8TSε67)mqn*iwn), ry@͉?oزeYBٺw6듄9D 2Rrtֱ|bq"2IK!E];>@7oc .f|d;k#PRV-]F>r# -᧷'l⮋ʁ%ŚI \gԣj!RʠvvʍʹTAj־Tn:K6b0}o5Ep"EWbKEF&%۷*ʊOf`˻Z`4.r!휞*#sZ\˶#rqQ$L[hL 7?M!V `5U x+PNK֌öhVU,(L U`4ƈ#RND7 SڂQtLBP-E}D),gڵ L۵K"~EJBv,\[HqQZr-%kìxc.yO #8P(,BXTg~Pwb~[9u* r}]AnM6ξ;[t̨Vm3Ql!ž+=vZyAQbL%SnrhvZKe LP".->U_@&A+̺řDvnǵ7#`^{na^+0hXQYQT-KO:(`h\ZT/Y)yoqRlhUDݘū!!ܽ)əkJeMqA!6jPTBq1r`2x!dYb{Ge , oXCjx[.%c''ۗ['fd[q_,&i%*)S*lYd(|CY-QԵ໰mGvfGJ\_oxT7*Y鋦Gˋ,*Wu-2cԼE#{/okd5WCy8#ID`Ʃ6vB-у,\UX0 -?pVay5b"ȹ6{VZUd-:v&2Sq_0 z~x쾓h$!# -rZ ˶]\<܉)Nd -᪔_y42W`3r!;pnnlaMȻW.vU2 [_Ĵ`&r(Nv!bE0 T`amK\+w%B:*rP>*/z{t]֢6J -5=1Փg{͐2ljE'Jz˓ʽluRTR|eEbuӭf]U11!iŢ -g| `GQZE'hQhM0q1%!#*.yٰԾШV1?URy~-];a9dgYrγ%NJBze_yGe#*bʿS-L*-uW,ggû+ Zj~H>($(Ũ\5n?m6yJ.Th,.Rų -YF5jbX'QOPD* -$yDӵD{4kxC6?[rȂ^pmbz_@=gJU3XmT.7>|1 -vZq: EP -`N6 ;m:gmZT Ft + -u(ę?#FUe\DW*`FesS{*.KyP`|#*=LBMZ}cTA\kouA?B9 -h CβSlr^ңQIHRJ %Ltu0vyr+rt0%!ر K]g݋Aթ\*7 n#_F7r˻Cn~݇VKYrJ E:sLk=3+dZY<x?2doˠJ~ -`_2R`K+v iYV,b/͂-sn(V~E*`:f[ܵEPy@`X!?R0%v/]P/bdG\_QI,</Lo*#L&O n-r[r^`U2D^Or"2A@jqr ucRaUELgTB!tVP̢4 5~N7fq„"qoUs|ݕ?ecvp&.k%5?=M6ee!ioP^? wo6 K8`G6Фb}#¡ዩH$LHzX_4mZdުu]6023JO Sw0?p:=*.ܽųHT2vxJnOnu@/Ř8^GKV-Ru[QRj י$/<\B@.`(j0ADxԾ*^c ^$;fLJf皉b%ݱ#a^%--rܵ>˓]???[~{K:w#;PaG -+ŀb"/z]䤫(pcIO 3q/C,N<My`oI? "G \o.+$DsrgZ "t2 -55jΦ 4` IXVZ#F9ˢdHR~ VAz@q.T;;jLJ %׉pd*v;~h;Dl/-IZBYt*8 k~ -F/|BC+KsC$>U 9)rS+nT5R=|ٹ-l> _ʞIa8ƣQsVUMK_/] z01(2ؽ -~/[=\ǒj0U(:ѹ@ȸ%<R[ņZNya>Y q/̍-U#I%*P< 5s~OV*+TÐ( B;,mܸ ^F/$DK^ceBNy :QRwhG,"*Be(6_ s$mK2PVĢ)sYe-{aˋip\Z.=T8K#\[XY wYU9*<%%c |J#]@_fع!o0!Ր -lF*&"<½Ij$ ^KՏz1c#QLK -Eϻ*ǃ̵Tpk]R3@wp-r -m- YT<$TNe0y˓^zQG ^` 1lJnKAZc*ڞfQ- %#[,:sYUj1Y4 -T2_BA:P.j%j(@DCI~嵴|*xX#p7u3A9 \35 -tlqbӗ텊й&܃e|9&a& -D(`G!\PUl\,Yⶾ2Ȳ/&_R}hHRYKac9z)u U -'c -~KJx&2[W^c⬆x {Q@8ܫgrY]?^%,ZU{QiLp Qu _im3"k2cUWJTf[+]#ˎԬ ,B"Ep 4CCG -,,)_nڋRhHĴ(M$V-vzB6IR{0e]|ι6j͟ Pbv/HzE0&VI R-?ضa-)v -1 ܘsS @IʩukMpPwDEq +? kV`d@/_Kh.W \El3n>o(Oūmpc w,i-e"_Bhfae0~>`4'˄[a"sLd,|Qw 8˽sYi"(^M2T.cL$"L -J2BO-aea.+Xu8ofy%D]luԩ˿؀+B[7lx("idk!^.q R`d%m_G^FNʛDzw w%bRamh.͟5ɩ8v\ۗ])J(S -IWU07)j!Q܎=f1KK; R `ODm%£z#ى4 W YiYP71UyǚYYGJݕ@,;Dn@a5l4eLSRW@x A*W}ƈml76L Jj-}NƎ@ѳv; Jf"C@@5ĖrY򍾋,{D-#d6Oҹ:DX aêINIٵ҄H§;rg-˫?P A7EZMP%*FhTS.iZxl$oΉqCF$V,|%ԡ =s=WiQe:$]} -"c@v]"EwMڤA`X0OłQ4K@pN\ed~ cTθAmGA!¥+vtFR13`+Q7P8塬 P"<M*ZmK X- ? LѥɃO%Ah95D.r帒)2Db -nmvcsOհih KEbHhߦQLw➙EM"E$kW/J -J.H0bO({H\hjU^ -(>4vG-xAn75RaR6KUC?e Sg(璟Inی)ՑBW4?>IaD42E -g7꿫kX@ӆ^^dWB1`ž6Tu į6EGۉh{,:D)mjV(QlXˢmph6\ XZʨJs_pQ +><ʫ0 v/EE#%YS}TX"?s_Hj6U J2f+ʞ&fQڀH[Ua\%4K>@ԥԴؒƂ7_Rb^nV`"UnC-:z>ȱ=5Ң݈hUT37eL3C,ph}Iɲ #fblK X{ ;P -]~a -\-j߈6[gZhļ+o8``C,{5"BGR w%=.vQ=ڹ pE*0KmQyW%]˗؋̖ļ|Pє=5(d8K+Yca~?%>VY."|Jr6U*(n]Pa3?B^S\Rī톙%`"&=ȤsAWB6eWV*+(>S]Af -N㉠[|Nw#Xl+y%q:¾0-9 D%`UFI?8~Iv:BViEt6°mO/I)x kT:Zxu7 aJ'Z5&%g[H V6^{/UY>r$7v*meJmEbC_gg:T W0=dx px8{e>OTVJRvϣ.ȹcw%dË 8r*PUDmpZj-<شu)m8"DbIdb`3`dhNCIXKp,4[UQ. [U?rO̟k 7k`T -:fYS +8,ʘF_#-l` r඾+`aE=1F*XrQϨwˢ$&EEA. - -طQNA;>>u|ԖDQɑnexq3.͎Kb&8ҳPCZ] ՋREpo_@H.iD$"!&\Y@PLjT-l", ˰W@>%DZjZmJYdQ{K`a{/{D3{̬#e#H+j$CS N5T/)7#臶-MK ^LhT8Ưc|a\kYW:u/W ،rU\ؖDyNV|ɦpķt - K Y~ jŢ[V[PU,W٬~%F!Gr#]ŎSR̃v6J BpJ\,_,Qȝå=h@`_'hmty.Jg^/%J*cPZ/z}L6yD/-r".(0F q}"3b (Z N> ኶n{ -t\/i%uy,.<7Z[Nh?UmyOʰgV IJ}O:i!p%-?ija^$ V -^ تVNDd4XNӿ MUiȡLUBVA?q<+dpAVrЙݧ*rѨ= MA^KUK+S(M,^%Yv"Vˎur!LԨS4B2d{ ڋXgV>-?6w,|SlkXR&t*5jR ~8zDeQJcpQAE%CSOld.6 -[6 شL6wn%yOL1urUEKIΌGI0JX|# kM]t#/=^ m>˖T -{nWTf[yq:jR{a)fK=(D,'c8 e-Xk2p HKfd!Q}&mA{MJQ%j1Ҋ ~a7*w$""iQyA,4ا9N8+ t4m?PaaU7l)VLb-/DPDq -kePOj^h?L^M+`nxzYy/'rM ?3Lpbhy2F -2͢Ӭ*E'޲R?5^bB9edBE2/ODfJDF|C¸@'AaU< v IטV^ެNTKJ!-5U-b۝EWAqTkRhpb_XMCl`G9JHx my*\U6]K.ls*XUŋ[/.`Qmy\\Ŷ#j_l#f[񐙥1=ޥצz0zQ5oWTJJEĠ=D%s -O!Z2 R&(VF#M}k2XRMAu)qnm'\[LT\e-*)<03Qa j[h>ؕVC_\d{IS.TzIF~z#2J oVr?}V#e -+ ڪ99w0<[ |/ԿS7CZjZCר2hY*+ʁG6S0]3-n82je"h%ihPı֪5+e#/f/p-1k O:a-\L|5*(0^k|L|S{7ǐ WwPod!i-s;pZe޽i9 4oa3t/[, i*5d?H 7j96+.ڞQoxe,~-Xw4nbCI,Z#Jb_qy& - } -^'s+;e[jn.@11%Id$r&P_{^0~*ꡤJSvZ͗OIe6~6K(0fY -jJ2<{0DT&-Ly.ay36y@JY,II*,Y - #0&!ʃa|JkqIJ,EZ@y P6=pMe1'Ձ&/1DC oecgk-HO#B4SR B` n!e j.7Wk٫gMqDVOD.&oŰűaONJmFFQlGG`a(fl_=Iv:~ԥͅmw^撦 DCfT^샳+MvV1}Ҽ1zbjME}3j$CQ)lԹv#e%-[mlဤ9Ϊ1 yfs[L -EaQv wm l>ȡBtb֓*[u]Xka= 8 -ZC Ur67܀A6?r["Yy;It]y7=Խ|q57*d\^Mv-!)lj@̹Rׂ-lf6?(rΦYnV, ZȶؖhvJmi p HEMSj -%1#RS".yv0bh -#F] jR&k/boC/!*/r#p{ls*jfyQxQAH7 $[la<3`ljT"C*U"֕,(e }Edk (dQ^+?x@,-dUC m>W"5-6eRN0+ek ^Tu9%=))VJ*poenOY? ~si*[g7_9YG"bkv= R zSA(dT1P6" o 7n&vk vT -!R.Y[OD-a(x`]BFGxE|& KXXX1 ; Q(툝;-aKd)*]J˃L`QiP.TTة`e. Rj"YN|V-@K蕐 *7u-aA/`Crn(-v!rg԰+P-bYU2cnNS`vaUŹD9Fհ.>L@G|.;5%z -yVhPؠ|#=C۔u)`uQdDp,V)! VK;Ii(3moԱcSMUr9BbV^YBd M PȾsY˭6/d a$i7@JgtnD\m;Aً* JjviJtgX'vܲbB6EEU1.y+B#B `;ܨ)۲嚚,2%.S,k/8ΡWOYd0,n<"b^ і 9ӄ S'KY>fռ%5Z)fw$P3*W -O=~P_~%RC)+tx%5D4:lл%X. @lj^PE E>Tl=Eفr./Op +2{W` _YɦY]*kiח@ DX):cdT$_ 4ϚzԻu>(H(Ǿ!^9oVzTU/=U:\͏#ۭ1T *5k5UP='-5U|[Io!n @h*+Ye"vߞenG$ƕo o]^R__(: j#K5jw "/j\/MQ8Xi2.mrPBgv g:ˁ'l?kYA/.O!uQJ* U=vr -ƼN''n}DP9%طˀn°Lđyỗ tDU`^=+S 쳑Qj [P_%+,eF?taz˷&..[V:tj]*E 8/0"yJGQ7׎(P@2q! -)i%atʻF}?я-./Hfw}g+:Ř a~Mlv{ ORhEZʫFa+f`}a/x@)QVe4#YCv!k0|1Di:=V!v rp\T4`x 󳄉d% zUyða]9 s̸R|@ -X[ۈ xϼvX/qVonXA{~قԥuK ~嫲ˉjq` -"lJ"S,Bv>˰"&%|p -r<)eS?i7̖yk\1_\/y[LK)O Dɲ- HcݏNo?,y6McD&+gb)q%le):97(FgpET,F}|I~Y-e.6%ϊSp7W/T ښ]Xg/5 T:#/\Qz Gva' {XFևP2~ߖxbT5/ ~s^3C}Z$Tt% -9#N#TP *o@[ - -핛jS;uMP K>kI夅>a|0A A8s'u[Q h+42 aɳ_98!*bk9W 4Wר-dc否`d|/V`5 BZvo%Wɝ^>.]䬳P0v LO/,[R !͇A' ފd g|Ƚ۳nlH*SX1)|7KYS -),;ydHG_i|,a_=%niq+T&q ,Oz #̅m qܼe̱ѰF?}'JVq6T,'1BVxao%U&7zf -uS{-Z.P:#H?J(A,._j!-`jThPKǴ2p˒i<նGmFFKP._c%_#.Y^YHYPiq?:6j~g?`PtE6kȶ( >Uщ?tߎDwR2N eSqV H%%6s՛ 4& -<ܱ_PgƧԬ.9KB4((ӆ 0w*⋹ -)>Ga9/%*".S ]-Xl6A:̎hDpc.=}=:\\d~ۭc69@c,T}պ,fȢ&HR_p}*bG 67hFqR[KQJbL]>l=D=\)AkPepZ6(Qs*^oy.9nXሲXe -1.5L]\f;yL +** - 'Uh@ME#7 JH2Bތ:_|,܈ o`@y,^y Ğ"̼e -o*fTS Pjڂ kAi\WlXE -.Kd6湕v[1Z.-}@8[W#TQ *-z1lzT؅ȳW[ BAoy ) ^^A9u87/+^jK -x4)LA/L}͛ 6U E(K6|ĥ?{TMF`, e4K7WDQb׫p=%ؘ(fnG E6m\ # -ib1z  -FW6镬ݭi*of*YAB bdywD󋫑rKjfmph+͂ _'Mo@ZS{#%c, -蕵H 3&F-XT+ĴU.cy)e}n)?O=%m - N0*$J ~6&ٸWy9sL.]DZ ek8Qa}c0׈FʤLO+Rv +!); 咋;zOu3oƢD,Iy6v-zukr'W?!dUr,.Z;jG -宓K9>x` T)oeez٫B^r)~#/%ĸ! .m#Sg"eٕs L,O%dE8P _ pn@/խyTrV24 Hpumcc[ʍ} -ܥ:kfղ%<4(cL\~>@<4T$X`jm~pIW -qgk>1 lK`ʔֲlr,jJPZߢcLETprڧ*k{ j3j*M5$g/„ЈۙV&/t}vtXsSVU8^қ*~CPS7JhP(W' C/D,?;,c)_pTQ؈ibu _G[c` i撰k[K[{B=iBMk-PhRnL6q%hbT.YH'k}v@%N+ 'AusK/۱h^g-_6/R)<H/X&; V~ EoFzUr~g|7J/Y)E7؏A2RP*? >\5O,)1FT>ߕSm(ED>\jPb[+5/x {tM8I*#W#1 d Hvh!o[ٯ?,^xCա~BITݕFXW:a-A_uNA&&ʙW2oԺW4__ k_A`ԓte97m^TQ`*\웗l/:"]Ax',2TJw]RNS5RSfyfK 4f(;QC'%iX\Ջ Al@em -CK=İO"#CKEE,/U\u 5Y7eo<PRٔ=qcĈ쫦k?˚sT'*)Ȼ4M_pu?]&B"pJfIo֍M 򠳩 0"f>~'HЎvLy \Pcm" <\5Ki+A9dp0{O1Ub U~LtzgpTtd 11({npP}+zˣ붇f}S-M ̀۷#^0ndwxQ,SSU}0ZR\u}")4Cećb.gYc$Nz}e" S>dA>[`0(r-1ViT!(.\}zC Pw)P%ږe3ȅ&J2'P R*"l(KH5aPڐOΟX#cb5ܞwT*<ᙂg/D֣TW/?x@K?ϙyzZ5N)sد.]A&`}t"y˖ G-X2_x۟._Ǹ9SHyflP #)h_BQ: ¿*P߀ڄլNp؁ו 3Ce<Pܚ'b"F`3* Kh)Kc6~[j2pUB 4mbr1[pls3a,k*EN@̓?UelClnv 184nvY-S )j,TSj,[ ]%WqRl`iQ_E;@+jP˃Q/hBԥuD+@ Yp7 eS&<[MkK@ӳڹ% Œaiz2)[A" ((s8%Kj>e[CQ2Ԇ5(k+Zĝ -SPm)+: ʛQs>/%ctx ؊5=L8,#uhEsv\iȴ?nL,"u`X1W  uZہ* ղԭ.HV/ U^ -p -Ɣ[4I'.6qj+]}\J/H*U1zCzNۆ AV -5S(sQa&.!nb*)&dL:{t+)H}/8bV )Q3]'IEjO%dUtЬ r̍/@ Hjr&Wʌ*VL!yxX# -b%n= -!t"<ƒp -bZ˛Mf WTeY>r6 Y0UA]췒/ܶ[` `DzGxkJ/jDzsl.)]>q] 62ոݕZ_U bDLi*kEˬ[X9)-="h17*TV@G jGuAV$3RۭG{Ag{Kq;%"=ZuX8u"i@3i2/_(SCUV.MbX],Ǯ[mrg/8?Q8A}y~ -*,GruTX_(<ѳQ9ax2^\xkaB\SHE^g] _"1 -՟38>N3$bBe7Jd6Y܈GR9)mϺUۈ07VYLZt/ܪ#A\ڢpLh L+v厐Gَ D[glBl薱Xd2r쵘m@REaXM6^ʩx> -sHꊒک^RZ<1z $ĥZVW~캫5UUw㒐9GfX󺵶{ Qr][k>3؆ER"nTR\v?(+#LpV7O!n@X^ -,d]-M*m&]H'_6gwCBr3虇 .ۨ՟Y*E[v![fB̶-4gR/b<]Y5dJ7G1IJK#EҩXڦSC-NmEPSDW Yl6b.r!O*FVW\^`9)8jO\J6㬑*'OQre*T7ՄtS䦊cE2?Rr{tEم@rZ ["*=L(`t5lq"8c+ -EQ#wL#qK1[xQNi\< j} -.C!~B~` *WP|f>Y -]̎l; -DJHߝ{Mx ҳxO!a,S}k1S tš i"! ^\3"85JsywSȫkye~2ۏ-*I/W @}boHV;uf9ZjKCc@GyE1O,9,] dmңwZv 0GHTR#rTX. hvoƝ#ݎTQ v42M?( &D_Ѡ?k D^>wO_~YE-Y3$/.sAAYYv"F˥^7{` }Oo(vL3`h"W1h׬/V)Ѐ”\qZʏ}eeKjU 3?-(0/P? %[PW* 4Φ95X]#p&&n2A"q䫈Y ]G 9Eľ#Fż% --$mGRvMa@K,[Tqj/K{{\\o1>d27xųz*]sX;%YR&d*"(:_H:Zt= ̚C;}U(2h84Uce6@6cDRliQ._R?'4 ?{[QִI\L}ۚ<*Snr;#I UK$cFBDau(|#0ў!lR2 -da᩹ -4M]W~,UM6B,5!tGBpzh lj.[Q Wstk*ʚ l|K ӱxˬte%_wp(%5@Ez*P ٌ;@pP2US0 -[h3e7-O^JnHS-^`mi@.ˢm%¦[>&E]e |% d!iY,b~`ד 39A@ -iI8<^m JZircY`e[Xы5*ՔYDRu}?W~‘ :nCϞp"Zx2i5]UAk*˵LgPݟo}$ Wt\+D'jLd/ &4GZ ->8mX\f&1&!OZ|6E!ձhv -#>b>4RՉJs\b[lmYgJCBjJf)KPHzCpݚz$j>M^Xit0`#&"? DpLrˆ6*8eTTv; LQEQrb W`UD$MHHfRQ(QQV%8Q T:M(3 -cU8۳YS9,q/% O[,47EUTL/@R Zi忔X(ykX}X=[T -WE]IsMϲ&aK0 F 7UN+ Yo !sVc+!/tūGf]5|g*3,1_">KE-&oTիrD+*fLW1TH*lnb[~bٻS7gU%1J"hasV`/X͔/,Mb"\nAhNZT T2MJy![S%D7>9y(KH&pd/ -\iY -P[ۏ gn懜0Dox P9ەK`"&pB((h -iRڣnN jʞX.10 GER‰kCgrUS.m [z?Db}JV.^$UiM~!#2`Sp\:(%qN̄NNxN&5*֭C`sU`eQ%yTA:U%Ve~|/tGNDqʬWP 6Ո+m̄C#򡮕T%҃c!́>EF4-Hy.cMԵ^0j YW8{R3/?g5GkĵlG䈟kl*[5(6˨„_072gU)"\pn$e>!JA+!bH/GU@5Q(SBV@vq*VDen"4ME`g/ D]oD7"iңL~Ւ*B)Q*Td?[̒cce SRfؖ-)-G:Usө\[jsI+O+j4PWA3?35\mOPK.y)Eᓵ7q+B!Kmz0*2jZnTJ*>X#G@#F/̝ؓ$o#O9z9rEeC&>H\ZeAq2*Rr-rSOb]tK{,/&K ,^2EijMpBˈ[sNZ\8!)¬hAr%Fدk+D;DW@-D +P2}Ye((%QnPt3rkT#mB[cEK\n\u4uN--)P(x ;,c,mv»2`T xw ~NKd6Fp^@, -]=֣{H҈Z.0+qZ2IuԸpðS:Ou+Nد@^K%86C*צS Q:e稀GɀP Xw@Wԏ nlm,\~+=d'O:cUhF`eݤlmv-9^2~9(eE{ũ~>  #l*91"4ե -53PM%Qi`;µZHּƗsT+=ˈ%Th(0Ah%eKد.RP'kD@fڅf,Qvр6%w%O>_\l^KZan RtisTn)DB6B:P)2YQڜ{%a -+׈]B݆.Bl#r"߉X_(<wPwx\3B\ǒR/L$+X,RDy.,*$J€ 1ltO[JPC#o=Mg[DeR=ub,!n*܇kz^|[RH h>q8~p6#)K(xH?(*/rR\/W/3aBe#:UEʑ|nna_P#DZU츸jC{|usj읙֗g̶r5m 2!T&}Uu4[.kU;U2Qи0]FPK#j/G:!/T 6'%*JV("aCCahu`%LeA+!JUpe .hv;PI[nN䫪.rb *KQSW3]elk=Fnn "Z› rvW#7˂[ie^\~W8dQ -i  C2iUՖ"#~゗lҷV8/<aPB!-/?Z؞3V5vK +wkl}%Bc`L^ֈk`DZYD->9}}j#jBƄz1w"]W{X551Uow=u n7Q~׌Dy[g*Y -3YѪ_{6L+HκB!*o -'Itr)Q -ЂEơ' [v]gv+WDU`D,ȕ&VA췉@O n&9+Q˺Cx UNju~` iW/_QYavPia9YY4P\'CԾZA>';P1u S׉-q>vPj`?Ύ[  &ljiD,L2YU@z!Rp(7ǒL%hQOEz %Љ\}æ'+ p%*YwmDE %jmf'g>5fOU+aroF:Um -u?a8/T[5U]w5%?ʶ +nXV}r>*ۜ}@Qzœ)0\brV_.)\-V}CyN U -lBFʮL¯ckYR[;q+PK ^JṄ`#Vb[~C& r![ȿ)L1)6w#?-^C^ vo!9ڀZ -_(OdU -Gw]MJm__>i˽BB.b5*]UMhM4ʀoCrhHVxv:m ?AwWB9Օ }~8+Lf>*)/~]ŶDٛEs$?싫 +替S!6fGqFo@~eno~RtJ!Q;Eae=2gS:|5 zf`w<*TCTZ{ -2b1|irGKn9e -uɅن3B 2<6T4˥૔/ 0oYd1'R\lPeIJ e#FCae춠ˎւW9ZOԫǔ /LVG?xP^w3J#&VsJ?6SU:k8iwP֘G^5]8FGggQ20agnK-N$>MRnD.Q1rMDZVUޣ6[+S~m0*Ċ뱡d$WP6]nhT{6*Tu<9G`8YTFL[ /qyk/C6XE_"|xDpz)5f)'s5$VKvVI1e@?ke1 :=場|h}v.qPo[E-c>Xo#"*leK,[0nۃ:_k`XXT<dG7yKiY "~T@LeBvRJkERȶK.XT1 %F^L`T/OЇwSHdY%A-ODb2iʊSk^xCau7)u*Pa5)K1j\]˚]bݴx]!b UηȐyT NH$ϧ@Kf(b^Ъҗ{V -n1˖Ee.VvZ6J ]e:GR\p- -b&<{%%=*[y+n7WpbTKlpBtE.UxCA[G{-O{-Z -&\w l ~P,% e)b >|ۜ @R:I^nX{V /#BڔTA,-@^!PGmzح%;snpD]Jf4#`Ye+̾Ӈ#aؠeծ%v7$ vvZ=%{vsO3Wry^!<R_1v!nG eZ NyyT*lO3R` ܕhKgn`̟MԠZR&d -K(JQՇuƨVAUVcJ#P[񁬦P}ϥ.e!aImɧ")VlrsebO%gXj*b#E QHv7.T7lU(~&™@!MR*2\Ф!9r V;2h`Zej}T:bT muD%4[F ո.ΜcrӵUBvjryu¢z#egk6}*6,4xATUp *HU?؆^+ILbGK2Ɖ䥲*KjDVjxdTFװR#YHlodPU-癕[;FfV!6[9C/k:4%i4TKlvл05qYT*ml&*b[^]Sey05Ȋ&o:_yzxm/VRjiّTPQ|rq*Vl/rPEQ&`beKT>,JC CGn4>R'ªҊ.8­zpE{sٟUGN,^M΢ppj߶wO^'7.үߍˋU{5a{F kZ[F,pU rp%}U,VlS:i#d*M-{f mE`U^#lq@-4[k镾|.)Tlԕ?\W}0#KN|ڔ6h(}Q,T%%aTe{wXIh&ܢBסU*VLH\QtD >-1Gyb4<=i.(V>QYظ "֘5H˷3 Y([)-H* Ҹ/O}N(Z?Gփ~<VDH #yVgWqq'Dh|QZoo,«`rfLU!*@|Έƫ2_lr_2z/Jlo_c7IK(U9e;lFqэU`k1`@+ Ne_ ! 03DWf)NAd"n6H԰)n,^_"v-wߺMrlSw&JA{ckz]ɇ;('E+e'ʌ(='ZEdY}.!ֺjL'Ķ4B67mčwþeh5Pr( ]Kxs+T+p7EN^ 9ovFV譅`5ap - -@;Rxp۴,%g%]Z9_ű̽eNgN+,԰.gw ̩U+6T|-eV˛D@Bajc -&?/%?cD g%gN~ }V!geEfy K|VTf h(+MN4% յ4B)_vc記olHXto#yӹG\* ޑz>X@ Yr<\xE^B-_LLHG_,SpRӺFZPˈrnx7̶% S8N%ZJ@qa~] Var6 ]S*yS6 -֪)E[a?Hzi&uKBɷnUal3XU~T~$Lߪ\<ב˛h/'>T,| vR=rYx=m_BT7.> $ҰcnFCU9(7y ky3uթzM"?2/Ț-6ZF_`Ty?Z}vp9D>H4 -'tH}/am~'Ur?KP?RVq Ϡ!Hs_#_@g$wuX]Jil+LIۡh oMk 7OĄޮht,n+yVrE*glJgNx%3M>!nM[+4b J u^z͂je5&6`fUo5ThFT=˱aTðLJ.IuX ufQ_2>Wܖ,E]vaLX@K˥ezdo4Q/"ר$2%¶vDv)`T0u-+#=H_cyYGVi@hH5*cլ#ocͶ.xy@<+BW5eb4s|m׊8^A)j(/胭>`8̊ݘ h_~UWcb׉UۋwPY= 5U=ucҳ#H5s.>!P9T2^$.~kLv+|kADfF'[b#溓W7ãh>/uy,e5qK+51"% -v0 Y'Pf1- ǤaҢUص]FjLu}`%Wjj:b ,^Q٠T-pL7vGb8ʪ 9WLzv\~)p5 P k*X4c%t ?L^,wm3XQ͖ g yjwwnZhvUV^eaq-([xE+!b3e4CFTP5MAkSGdH\%PYZmga}imgvM%o,MH̯ݵEV^k,L&r *c4(;0T@}c&V=1>/F۩7v˭a]3NW\ NeJKO &p$WuqRV&V>4(F)G#Kb+XV*vmEZ^Fy[lJ1K{q>,5%E1[tJVSRe'lMS|J^K=@w:E -K`uaBW%K M\"}KVJUeFՊ̾:cfb|YLt2ȆŌ1kn٭F߈- -G<S:r,Uk` [p# wvWu!Ӄf8F^%ZM-M53[ʭcvES g XA}pmDjeEs&*Vysy1ѝ˥b`ш"} #TzD*jbEALCB, R鞛Pf/R]si@6d^r E"Ud@7'(L3KC) CL0K JZ!S jlYb9)˹Y8EQEj @ 8 ؂T.>5P-M_(-Kp%;EFҐRp:KvzejSMny&J0|&V'h%F"CRr׬j 0<oVD^LK+X˺ XQhiKoglfaT+-Vĺ8˜l'zzKv:۶G6[< *\A-L R +%p*U3y4e~ y.rHbP -]oW4f-@K4Q=K57rVyRf~Q`pqsikh|8;҈Dy4he9LNܗ9Zw[Kvtl9R¯YvPW[!TW{P4bQΗ3HǶ bfP?4u5ԙ׶чX]kV૔Π6x"%*X=Q{^@oH/_Bw3Х\׾ ^OTӿ/ih(C0eJzi`D9/qS-oıl.v璋2r3=Zh( 7Ns,Bت>^as, -҈SHHl)i0rJpX4Tib\o}|A%3^K;}-zd͐E!W/{Nm*O c5r:*2KV!xx)iFAP(՚UƪC6$4QԜ7ga,|/~uy_l/EX %ⴇi~  (:#MRU5VJ|Q. OXQ]ISiGP*O_a?IQkҜܥ}d߁{?>ܒI5?]O?]$0ܿR50: w ? -(ǥstxJ% lK*`wDs{xk(AO: ,2 'PJL>߈hwUlUijlBF;ZnFm1{s򸅎ܸZ"y?6<-;0/Pإ`I}K7%dR "K|Cv蔰$,=/͇%vϷ*~DYP^#ci.Ey-̀ZbJiWvK?O/Q~iZ% uG|ZDPHhgAw/v>[#_qA/gEד6ĕ{*KlM( M;3 Ygg)e>a,mmEճ,A:ˈ=G^]kXZlYw5u%څI`'+-]lx^kq]5+TB.Խ5Pn d.-2쫁F("4M n]J6 (umWլY?%~nX,)h :&J>lSX-0뭸w(o4;ns(.IUX -} -"fzMZBM-#s.";gI(d~r討m3?7EÃ%D -"Tԕ/tn-Eċ j耏fŢQ8C.iB0wqw/ԙAEZVyE`Nv4 rT] Dŗ>jzb? jg^B j6.;̄,M<A&b|GW[((P>%ua咠 xA>õ2X0Qe:\(bhzbdJ=%*.TÓ̭G?v;ƣ ZGl AJԲFt죲Yvo}wbBF^?C,Z+V9%˯ru9{pOMuZZŘ4/o^aHw -\rGte0BU/Si.ى0Yt!peǪrѪoKL&EZ0[l@W,,8xV-\ fS9l,_ tZKiR.E6cG D -ǥݛQNVE|˪L#Jv_z C5ٳCԹo{1Eek dԸJE>. -]}lRmU-ys;R*`egjn6kW[0^iREc"E1VKҘ&F M.Z52&;QvwgBY:&j&PKf )?QQ#(,Mw8Am ٸ>WH -6PyX+٩5mPzkH`?z%?5< M:Z\xS -@uUvX ԟsNƋؘherT0=93K26 _$b9!gh ͊Ş!CRkFe+CYRpY$-Ba]on7^oܪ*\^4Qu X 6$."vE6^\ %> 6ܸjB]9P/F+fb'Zʇ6RB_ʻ,H ; .2-̋C )`C|jeC'/$ڧPzu-E)SfU獓m h1\)>B4+qޫu#]ܪ}@Rs=[\tze7_;b -@9~{^hYLQU?Ej@\/(+Z4Hnz9h+ax>ze3l%}1ktpjJ`*-*)y_ʏ_~dmC%R+A!^a E\4'Fi*$%5u yc^_/)ۍ)lQV{#`Oc.ieeFU/IF.[ ve9[ :dbgg`n52tE˯1w4vZYu([~Qkwu6,dFWo؏?QmVRNw| RangKUe TFgvTa>o£ܥTܧveaFSu"V*'#֣~m*7{{dJQ|ŴPί+@U -= ˸9"`n$Tlܕ9Q?MU1J'}Wլt+IY/Y02[z<޷EbGRGħk -U-ZyV {&e~@U/ΘR {nدỰ$3+੸)L+d`?qcg7v7#y4ydHGk0V/X@g28+qYxNc1*"R]x@Qnj/_ͯ)ܘ+iS .@ - [?nu[.^[[Urǥ <.Xe +2=L&)}TҧFy6!~e.v(hS/AcJtZ}6YڧEK,17m*X%EbIfƻ{Ym/˶Z?A?YwX@&~9<=E~:ǿڪ**H$Qjn-DR -`nȬoBd)~U7=FWڥ8E~.rVM"Ąk@w=; t+l.c -@9tˢ:S~,m,dÛD#DƲF$9noR-?%_ő}-2 -~57⨱{S=Er -y,mDCPSw.=n*$Ris"7*ulٜlf^E̞C-r~^L# 6QN{eu_WԽoא>-Q'O^%8W<,=,v+5(L;SXyH5KߍuNqWЁ(Fn `凯/2*y8v|Zò:({ew`߸eYY\e䒯?;TLDRl}/XEPD$x_7D-?+oG/^Ub}v%_5:CmKM{a:9g1auj~_dGEKQAJ]WQi8ݲΊ*Ve,e櫼[3lZ?͙x@50:h^QF^=?Ŋlվq1߂$6/&=Od 1Bt

HK1츾kSIH=gS͋)`#€iQ{Raj5|AZRsjwjIPǂ,E;,Fۯ7xL j,( JX )A1<9ڄj$\+% pj%ѫz>9M#v 4lJ -!Ez[(Fa?iྠ;", -{kT͔yNYcQ X]tۊ;6M )lc.j[*uׂ'B)z8|}5۹.yQ)1U)Do/m8 -^-vB菉HGV}fʷ]m֥pi*(wTlq9e)4*1O-#-? (GUtK~ve@A # %H%>vnfMY2x=8c蜜;y -߄TK* -%eTR9#ogg -lW+>l13o ]\,߉~XpO>(.\sMN+>2wgrJgq/Hz\+U*#|2 rŎYY 8> 6HLeKۨ+`i򯍸%NV|VˌbQr$0 .%gc)> P(UPlY~*xnዩgFg8 e|N*/O&>eXUC퀶e -1h^6V iS}B5~ -[ْw BNPJhX.e+-eӺ.sq,”ĉl'z͗ÐqMcAo `agKG -{O֜hH?#?Q":69KB0vj #F.&Dk_V*%$jW/?&lߏ2L{Qu%-ra(BmA^a[ώ3Y{SooaZK@JyZY1{rDYe2GU2_L\6Z)a@cG/H -ndGvd;?l6=017ftGHw`ypI>m*!T(-beq֌~& 4m&p)"%ěO{Ni} ? Vԟ‚p١{ɒ>icw!emDHgRbr%[QWdƯ.`''E_pFD~ϟH>>"Yݤ#x&7Q4+E7*)/M &fn0^),2α^y%D+n.EW ؙP N~<#ŗQvIuipؘ'np.#UP>|YKw~S'_"r_6#%͏S/Z"k1ڨyOMXch"Trkp}Db{E@fY3Mgbaժ$Aֈ?<Ϥz_(`'u;=~ 1?}UsPVerM['9HKcƸ\ohg(|}4#RcPU?jnMO!z^~y?PzO5}$w2=tBJ?d;91q!SVםŻ?L{E~%?h6C jkYEA,-d ޑxŬ{Q J`]v'CK3E^?r_ -"h5CƝ2$\R8%q_FQ.rzcG&i}PeU]Dڦ`-PW`L5Y,i4S;-/ef{V2y䫙ŒZ.[eT.qp|qUó1wb=c2.FS̽ʥUڝA_(ѽIk T{¼*#l屻Z{pD˥ŽZ P+p>0hyZnTKݲ!Q c0mW,FSqWeXo3:*cdKzG^_U%1=F$^9Ac=Ґ2xY.uJQPbOXmGR%7Qp6c5F-,5#^鋑B-Zu*+sqe"xF0J"Rm)E~o􂙉?zB@~(wM<1uX.\j=Qol`E,EI2X0H*gweewp|vn/&yܳge牌!.SU^ŅW<́z}!7A& kNE劖_}7+W0J+ -VeWGWb-ݵST~dZN7ңKfk^шu^U?/+dq_h~1mj(J.hE,H^*!uŴQXkBj~geu7v֪6ͨ)hh2ҵ{$\t F`AU V/׊%[*. kvs -cfb?FFiJPـ+ kPVػ+ܰbƥ˗ eED#l*]'rQ*Pk:9sNBROg|'irEhʌl[2t&x~.?:˄"xsb>WjC]vY]M.:ʖ*b{rgi#hQD(&x9bb>,cj,d\*U4qb)RTw-X.g5ȗC.8!loX.3,/H-2Fֲ7xˌ>@¢O1M|KOkĶeeEhFܨ3ͲnSk-! E+!r/K\Qqp.\l͞HU_BJ(Jx0IoQSK9쁮^b~# L7l=Od4eSKɄ骔B 1"7v Z<5dMVfQP5fʃi/ҥu O>a*aB )v)znD' Ub@jm.5(rhO1VdڔٛsQSfʅõ 'F`hjiBdž}ˏ*j7 KldYaXz`iUE-\ -f] q=T%`|.-.Gz F+)M4pK8+ws.,#OV$yaUJVr.?Wa/\?aVKSb!^"`3.(pk-P-Cf5PTWVx#ԕMZh_q-7R[\@=``ĨXuKhl`ùAr{%ZQ Vz"Q$UDG+gIl-03e AŸĻՕ+^Hx -T ;p@+++vVJGʉ3^ a5T'Щ_ -&B! /TO"1`lEXilD ,E!;,<~ ]>ڎlUltWAL*G|6,0v0-lY)B2M?d ۄxohT\PQ|0]O#`(ԥ+2_2 {rB @׎0ܰ'B:_% -!>O-|Y ږa5-DRQ%;=y* -;-7˽GUqUsJĦk{^:l\-tWJ`UB?EDnBpO|6b#z }}CJ_%^%e ^XJfWT~L5Q Du+""ѵ6^ @Y%%^vsעZ) Q}F/)uN(͟DiEx)5bvSB:jk0߅*W\ -KTA>/̟hjB埊?o+&Nһ*uBM!bEOtsf90:¿.FS[Ba0kS{?k c}5ʤFCʒ@/ƶTN+d `OjrT_@E>Ă=*_VA֟#3^}Qo(WX.ɳj܈m9gc{3O1 -krs(^ |J ܩ_VP.ZŒԁqRJM1f>? >%yj HDe9Pt>L% ߻qoSşz@ )**|)=@]RB BXIڭ_jK,tuMp4sxBqDDeOJP@xOi 7:WOK2~Tk w/Y>vK"'tjZ8?X Y.CiLORYtc!-M*陡yh"T~>G Ly?_ɔ5okA*[ѿлex@+(~oT:e/(1-o{g.2:u!  U~1S4@gMe`"Ө~@XH@P,]`VC%5}r -GcnZRV{=$5PCh6ȅTxJ@IT"M^BJewF|{?<.Lqv,"K:ĹR>V-X#H&hq۴UR`0?|+SR%9.t*Tz߈9VK &>ɦ?u_mgc/W%㤼o5jZ_ )gK@RkKp/Q U`"moֹG.kE**ʕj* c&%?(% Q6ڇ 7ꮮ!m=U.g.j o!/ss׺$_ e,x?h"*2ۃ$R"nu/@1 BJ%_cK0(1e/1rF73"u:l~r+'en*%zKXidD`*"cq))NFQ ^.͉JZn:H.K6{=DDD`\Fu%0?>|_ޓW4GV9J 3A&Vx)OgE}Ѡ&]H2o0D?Ӱ@`1Xƽγ=M_ Ĺo%KT%lg= j*5(n }JTE`$E1[55)6PWp~ɮNXj.zdFc6f }2HghA}Qҩ >Ŋ-ms@olTlG q,j= -*2f lPE {"l@Ge\P,F>PJdN*U1RpV* xOFJQaGbSt,43}_=cURjNjf^E69x9CQVJ)aۃGgkH5rQwSROW v)Vʕ!Of,2Y2.ly`RZ[:˨Zo`\ʉpjK߇ CPojdVBra?ŗE|`iA=WIze״мc<*}GqN(j `mjS}}(aUbƤtŶ)tUc.QwlP!ψܡIĞ.{WY\a۸Zd˷tƁ0U6 -?$5~^)J Fa]NFo]>7ԹeGр]ۂwy..˵Lv NBY+ȸ@\O]KVKKMW~CHZōG h^2P^oy&D<-۹P2 8^}I)`Qn. Փ 3< -#>H⟼wG@CkzNr2/EKX!*bSWEJK*foҍo#+TYgۧShq-zԌګKrèG)V^5Qp vu PnoWS/J-,XQ䝗ӌ.t]<]Qm\e ACi dd}THP"?$4pk/U]y-uء-H.[K0v\ L qc6OĠׂvr‹҉p>J9EKҗq3h&G (dKXR+Jb(V[UuwI ڪoi?'"DH7###ꦿ _c&YE60ͪڪ4\ -?@D\%&JOB -3g=aF2N+}יwm̉CϺ32O5qעXOQiU'/EUG<KbSn*&`dv,Ũ%<| Pr]ȭ2Iiu-{:/~|9l%VrGU*]2.\ی%˩qf% " /Q`A.<@Fޥi[7͠|(\^ljOdeD:ؓJtcf0riCd[?V3v:HWĔ̠eUgEx1"/OHat~1st@+=#p|S)~Q"eƫW>@:,Q1L y /HI ĆZJ"*ڡVM 3jMG($5-vU1~n.rR⺗(WWu'JgfNr>*_\$2,[]_ú*װ kl[e[][ -T4 j(sX?~T0CAgIBģ87{% *Zk ,N_ mPA(X'-Ej -T)furp -UJ(]^`:/@5B저V-DntWL)RUZJ.n6a(daxO^8eL706=/\ Kk0{y»/-!  jGo#/[RQ{ ,}Gek'&1V_ŗe>5Ϝ~{G\ۨݰ6Ų0gK LD稾#0VchŅA4YX\OX)SI64i㼊 ZTo[MEhe[IgشKgj͔\X컉ylg1zPxRr%ꥮ%YUc6fˆyAH5ˏ'aC&O5h7)G t,We^&f,UOA- h>;j瘝U@ܸ'fS0@!A=:F*?l"Wf f§&)xnZ-B׋|_ǘ"V|$6Z 2U3D`se7 >T'mKo+Z0洩kx-i;o0L9J{b.j]3Q}h=zKaA[`DybYJ"FE*#ݟQbnC5Piոb5#؄7[}M#o3*K5K'%ЖpW+WKyevh@ ZټG(CJ+r)\4X"|lWhG]\YiIJuH<Gf9*ʎܨH/(w>āc) ? QYB10+Vx,ʛi[ %^.c|F1B}TgejA'g1<'ŅrGkcݖ [oža5W -Y) weuU$GFZ|yq;UOكIc0(=\" -165Z2jUen ʮȒ[#JXhTF-Zqkp~6$"o6{5vD:TP0,Ϊ;{yEA)T]yhjlmIWE=YG%̴ !5y*$_.v5'y>rG!Ⱥ*pJ/%g+<0*f=F@Bx02v_F@'Dl#|(TBy/e@7XވC`6&}7 mk K}30!ExZl<:!"bqPHBFN,_UiH{t:^H]咔B62lŦ?Rl5Xu44>v\5%˯Wa5l'L,r^_Z38Qկ(Gm;>U,GooΈoqsM%6njC%2nq2vŐ3'yGvϟ? ~o NAmO:tOH3'*mz oEG?P"@U? 8*u$;̈́sN*ʈ >QB<JjE*qɵ8DkgV kޠ! -j ܘ#I/2?ȿ -dDByO4)U~TG,v<ʶ'^ G-UG邏lKK \zO@ʣQLhĠ~m*5p)µ Q,NT4ptPa+CW1ߣac5Cv[_@(VZ -QgJ?.Mo?d4}VP -.2}M% ;h*8hh0х.jeV GS5{\5)eV j߹v\ ^II\* d̨Mp_PFVJ''n䤹|+&Skm*τ/mgU%p* jE)X^ռ3Tׇϥڽ`,%dz梠I"^CQ;zZPڥs'$jR*X_ghg}bȜ\*}JUY2W5c4t6B|^"'u6nOFFܣ)ּ!hДG7(d jۈ9>m~TFj0WgC0aRu+Vqd%)-7[od[.aTBPk۔@#DJ-]-PUQRE%HE_5S>hN_}۔A'T%8!pҏx-ꐢڛ]I(b@1D -:+aeb,zZb> y jRϸYHC! -a9m\ ّ GK' G#w\Zn-9U+^ūEԴ6cB -g_@a4 -Z2w -Xa6'Y ӗʎ5w:leDTKKN%&TYT|NsOn(ZPb,%K,;`ޭ8Jw`C?oRq5H^@KSOL ӊb"1t5إ ̒4XYĆݐ"#V,6- _ @B`?F%@q=Gw1؞FWl*&%wܫl3"r4/Į3HTiꡏT^Z0ȋ@!`|HqUOBPJx #% 1C@%ᣴSbD|*NۆOk_*ʯ?.<d &:w⛙ɇQ*+;*+3e FR(YMbTPʜ<h-CnhzigFY(٨ܫߕ Ӳǃ?1'Z>"X*!nGes0^WYAf,s+be\_&9B5rQDaqx&Ft @P#QYu*# #%DIQZ뇫3p𢍱,TnҠ-je;.U<ܕnz2<=D% -@2^TķK mR1'!ٻbbRB R̪T1 Uc+R -gjoa7\Kю|*1BmBG{A)3L{D(g.^bp u;v2k%R/aWD]1>XYU-*PҦX,_gP. -A*L{lҬ?$fl'ZVBh{e,{3RQQR 4&8뼸]xGk`/PȑD…1.rU;Q2KƽcJ j3}XORhQRz:|"xHr#7Y[)\ioNߋZB74J[Ӿرe˲|PKBybW,r%mEEL%dE\6aJeЍ~')񩏂:)-<|*$P_QQ)((iSĨD l1U*TB>Uv^݆K%xE3u\C6P1i\]\}|IrHDd"*ilv)1N{Ժ}ԩYA/ƚv|^(5|/wW0,'G4l%! ^dMa׭e^ *J>wVmTD$s֊ _*E.H$;%2¿BCOGjo#'”BA 1^[+Hi5ڈJ%aOxCDy1 ٝLQW5|X)5AG{>q5?X{SsC#q~8v0fX[28/5GrGywvmBs' {w%ȍ4BS""6V( zE多FK.GJ+=jOqol: g5p}94< %G,B8m*ԧc'ؑC)lm}/auUq)N -ş|X}rx8\<.򈢺AW)OjBnmSm\"+~!&q}.\e#'ЕN>eJfFVKۑQex oQd%"ĹE->}Od!%=E*j.ܗjX^[Ծ~ĆRɾq;qU~h7:?Z.uDRZ+8='іP *KP C4 WǧVhVVedB:4RoehiLQiS U&+}qZUD )W[ - U(2 ^{a]Bԧ|?Ĥ?ǚ>[Ъۅy0 /1.`aLaLӐo%*K6`%PkK~EdFTQy742v4j}OZ432(閊F&{H+2Yв +-+.u~,E.PԌ&ُV"˲=ǐ?Rpٟv'JvB`kK/`X!qkۏ_ -.G*1:޷ 9$-g)GzO~-MV4_.\ mB:A%۠D`ږ2"4ǕQ2 un\UL0?rjv,$aM촶t9U]|Iճ"|UR-c59pKjbD\|%vVFSŨWĽېw:!OR#Ɵis D5 v%*p,TNYQAN & SU b"4Kޮ?[߉PJz>eoS%HJS IL έD|BW z\&"hL?Y?Nq -| Wapl*$G7[b\ (a 㔙1LIFJ7d]>_f/m_xZ5p/rܡTHsR[DK̯gIpxs(`+bz0H9+OQ|0SVد!9{H; n73!E Bɒ`ҙѐ\t|%'pl fivC !Я͉hޭ)fD#/y;JpMNɹ;'!0J2iVjRbp)EYQ0'U:ҡLUO :s``KS*~{[)*!TK̩Qdu*؇^앗03a^B ;5Ĺk5{ToTn{J7%T &R[),9S&|KʥCIOS6XPpp<H\Efҧ[%Z$b(WT, - ppɬ>1#!]K*)PS* -Hmɷ bPlY<@+B-&40Gě4##kIWȩL;SVmpC:.iVF2Quin'+ {Hf((֒]D!S+%~\o5 jr &#Q- -_ gڿ(U`ߊj갱|#2T#>< ku9{^/767BBެ$?o,_(}ir~XV3je% '̩ZBK${-[(&@,°Hs;%mXuJgRʕ-}Aj -m|˖zƲڅј6{"6 7| X3iJOE\_XN{g(y&%Zg(ڴ2ze8ai3D64Hr<:%KB>ea -ҒZ-\ya|gNb4ےC `݆T=Y S'.H&96QLOR/Vd`aM؋N/:ve,;+ďTsl@Ru -헳. K >Hy]`ݮL~0\ݞo׉Ej\Hj75Z@5 yL;9?#P^-Ed - ٩>_JP_XQ RyGiJ/KA/3ssW#wq)3(]}gQ 7 O> ^!GxNTy*2 GYeJAPO؋uۄ":.)*/h3dD (bP<I!0oᄣ; %-ø{2Օ-2PV{g*|MebJS1pjjP(e7Ȕtֳd0DXoAxJkr9]$b@ FƂ?_R>B0jShU8e0Tz. /ȵ\l(k>ɉ l-^Fncc -?a-( `wGUW3i^Y* A\yQ`K[UYp5ۧwCSf;:~@ǚ @;yBlH~`t\Ѓ/,}#0Z*@C538_wzO^UyA˭{4@丹Wsܿ,{-cXL_A{eYw~rф+`[*񂞙Ōݞr!K=Mub16&&g]ɓ}|~a={}ev.ͬd;hSt>4&|WufR\u2X២AlsuY@V|Y<B>+<_}4Wp{$'q+ u`ڹb -{%Ũ_e2_l}蹵r[Op+y~/*쳌; ۨ5όMnͩ/NE:>]-|"1:YUUDyy~, RW$Z:Ř$uWPxY|[ b|ʴoO3 *}aBoFT_18}\#_HrmmG YK<2ɕXv)[SU v,ڣm,c!Ī M+L7yߋ!xe4 -äNMlϲcUjGm2 \҅JiiL+7D,=!jwl9p6̃ CK.~ 4"7iѯȳ-~R:'(қm1}9{gvS p+Cԙ~W6ye.-A_S.۝HT rZ%gϋInoj_ع [۲g'3b'˙vg49pwId-Z1FYp6U=;F<qkȠ5_fk a~#X,Zon*SZT5Y۩$5R/W#u%Bs#W"~/~%ũCx9>eG-qYY(閸%ȋey -|Ɛw.&~إ -YiO2o.-K Ź,FxrRx!Q}h.l~-Er?i qdFReݞ *_`-ңDȶqqҠ/Xv^⇻!TZ3o?ȋs0˩d 6t\=K94 0Sm)*m!Ֆx&YXE7[U%/T}2,Bo t``-..CH%mf|`Q.,*8Pn\ i{.,.\7./Z{kk>{.sp _lcI.d<d[a6˹e.$GbAy>1/?3Tj䵛X*{jاhy췕Y,f &cxozRکnSb=S5XBb98Z:/e1j2˟I -Sl܌>tn*^v[ -/^e"c]iqv :˃佃;rd->P\l<[Y -c'fܻVkĸ5.ŝ G˖ۊE\ lЋ;n[,Wq}C2̩VJ\`{Y+^qEeiR{{4T 'ڠYaS\!l/pkX{ax;eDAB%]]\`]M@m]e:,/cbK1EmCI#5.ۗP`aUQ 1lD;w -F[ -j]K@!S#0i/v%6ٛ|Ks[(R0% a*]vc%n _*L5Oam2Bbg|*\"wJ`^fP|,XIGFػW:B˪*l5N6vYZPl]`E7SV.:e2T ` X,#I%oyR!S~\GUt*bW_UBfK.5AX;-mVA͗P_@VX YoJ~Ѱ.`KĆAUVL(v^%YJl*5b-Ĭ`Ur |yGe\©D<;-c7HZolB7QlZMA|31;EШ} 8A|Ǡm*{95J lS#ZMȠ٤K.jqyl.b2͘qrYfH jcn -r[6,1D`Jr P>ٶHfG~&Y@_6eڕHT

x2 -DCk n_xrţB fyXi HURx䧈'X ~r=ы,^AcLN/!|]٧]edgXIaQR@2Q>r}DeV`,ctKSLa5Go\*+jb_1|;ld+ܾlRE]쳷qXEWă}LV-)% -2H\au5d mHS;kXa@(_LBotOQhҚx问SxnyRa|`TYRϡrʈumU_UϕUU(VGǡT/ʢʨ[8Zx#ffAs(v/W3`-9-LATBX/m2#3Ư5#U\7:O 2EFA؀.qcɇ6{J)gTƒ6%X*aح!0vmdha, %aW*a}Hu0Ʈ]Zݎ킱0eb+m[Rř C7{Yu5}kJ*S"QdD3}3ߓȰ]ZʋVx<:Q+mպˀTmFe>V.\|% CFWpd`?R>?\?x,}"`xYL+b J%KҚ-Cr1exYq[梀*[ñgKzüj]a ķ% ԲE(\kıy. -v -\r1}3ʼnPElVS ټ􊨖w.` YuPܱr肓Z&y;CƫԺL- MvYkeKnEk-4m,hW-h.Z,b1k<Dca;WۊgL.g\ qmS#m5™x|;f|^UzmBa;%56;f>c1` %Z=\W*]5K6t$y\)Yؤ2Y`lx`-Ő)bRؗاYw)S"B}ALW'G.mp P Ɠ^uPPj'`$E 0Mp߆,`ehy"@ `ViW> 8s̲xTD(&(1YߢNX~"̑Ϧŭv?A/SqjAPĻ^1@aner^rEݳo#aFˑOQDt-"R@ZVhF@~Sm ӿ³ /{;Za\8,2^7]XEp)K2")fwQH+Ba&%Т&{YP܌IYQq,T,x%nyX7"6`7[ܾdG -= ܩyL'WD[d< .~l̋;Y2!,ƹvѨ n\[9QٸC"IS{PDZbb"mbT._U[r(@.1ER`]k~" vQKڰx,tWU1YEW)ڂWy !E5Y5Uƈ`0%lZA๜c{")DÔA;tEJJ6l?kAr,_L/I} - kB-˶0{ vh-Ma" yKJ?(kش*.F|7X L!kHTZ1#Ciqh؞ͫ73BiDB2 ZX;*'ej]TJ54`oED-f&3Uq -?xJŮs'18l*މfTǨ-eCW)uan\JxKxoB዇!{B|?-_#['D{K&F UȥA\F@^nA8] w!*FϸBz\[,d%Jȩ44Q<28FưEr(Q*Uʜ%>26 H Z8ZRKr -y+.J%Ѡ+@<˸i\] j'%D-W=EMl )ԶP+`' tO%RbDf 1> ]jFVVloal_i?hJ]웡ZR*')tNŦg$ ]ٷ{.*pߎGEM/n_BYa7.QK,ߨέj'lCݾ%* >–_V᱄y-y*<";:'%V?Y]QT?j=֬&QQR>.L'kExERELH( -sv>}_Ê,H,AQ"qi^&4<$QVYq-uyZ""+Mij[B€y5[FaVVW"~@0nNf"_AU-˪|6]EZλKʹITq/ Q2ZaPE8&Qh6EA\s{JYbur6@GIip/ YV%] k.ƢV>}Wc(уQMPvWRbۘJ=% -peu-b j6*h#hk֥X8,b(%iḻdv~"lRY e6 = c$eI*fhAEl<ģ%Eu5),oujVxV]|QG-U., Ywb]S: @e-?-d!z[AkS vژ# -)ۚ c%QA;;,^%j_?rb%|[Kavx).gAT%2SVR{e(IUoqJj{ŀ6fͦ]tFM dȪ~+LH)u87حXO B4KgA׈eE=/uZʣr\s}:3I/]O(ENUPT\Pj(uPP)-A%,,ʋ.\] -˜&va̖+Q-TUY*QL.8,56GNxYƱۂ^xn+8{RՄAKZDۖpy\Ac'EE6ԽX-g@&uql5ffr&1c;sz|<ʴA uurŽԱvS<6Ӭ̹~Wyșp!w4b_n{9lU\u-Vy-ȱԖj) 2T.kQP K_1E+#JVF"1dKWM94H=5?]ZBi %ȠSU(gI^@^*-XF}M.zTʸ''Ur -qc`*nhQn}KP\Je`61EȠ6VawB G. ƒIP|;R۪AN؏4Wܨ -9XDni(cg?sD,YJzF=v -J i/TVs¤3l:l\QsF6^P.T\n(lWVqF^|OXZl,#.Z1V[, ~y8bj d{(4C%JpC)jV>h2՞SpU9QF6]]*jFqnhO743*޷ٗB5\:Kbry3ĥqu*2Ee"%&\sXD 2Rew,jj P{3T#kTkm1Q*y+LU[cN4e w\.CΑ6mNy6DҺ*teF - %f.٧ b>haPtn H1#TWR+rn+bN" '.G+ȭc YȷĶr Fp lnB:4ZOJps%]JQKTeKrz؃XKf~Ęv t )/JAiv]ؔUν>%1>V^T6k|F#RaIl- cd]fv {4˼{QᨁvZEр&7{Υ1$K̨2D{6.*.GZ{TʰЎMMyF'"`'7>w^l`4yf -mh];0 (yC6cWb -VJ\tO 1>|E*J͇P:Q!BGk - {Iڢ\\{?,r췗+Ш Uu| `ч/6ۚ$"T0'pKjVbUA صؿPoQnA6?H`P Yg*d5t@Jed:1j%PŸ.@"[%C+}ܷiaG. e>iP-y:1h4PR08=9.w9qeW(KVB_.Qɖ.VCC+uJ*+dA^%cR߇5]lanUrwX/ڪzFDU; t7 WNK9Q`c1dzB.> XAk+" 4 djx[H%[PA4%u4.`%*&L|QDtsAc7Xnŷ^N Dn}0cU߈R~Yށ?L+%/-y+<0{e_e"Jnl.$V٦"j]4L`' /+ 0Vc\D*UU1L'~t1+iFƊ FjtGe".l 1 J@'5Ph3VX|KocAIJ\-8ʵe-/`WKSqk5 fԾJʋ'%O%EՐSf[67ua/e2KcZc2ؘW.qt!zD1O5X b1"0{%Y'@*_iZ\%On`Ę6@Ty^ =~.Rx\gRX~ WвT})RV-'^eQCk8K:@ Ib_ :KUf/ rseLTI͸489mpMg, "{RS9W(#@EE^vYۨUŖ:G-i K2͕hfS(j֙Ak=ۃ>(;1b=BARY|v:)gU-cGQD'ٗ,vK@<Ƙ첹SDC}P=ʂToD V+\% -%LφlUؽ3/*B8?}%GV/ꥆ1ey0*vu|""fݗ+xAPHeIw/c/z\v(.j=ҝKe$V/G -גoj]0P# ut[ QMo4cprV]Tǒ},XM}0JU{XDbD0M -55:Y*#NY0j- =N `UR -WP8,|]LŗMw.9.? K/ijW%zXw5(yK}[Kxiz@5mj4I̘6.̲H-ƙP#'o9+tj qʴ_;Ue*vc ¬:SQU|ε`]FPvD.oYW_HuiGUp>H--r/B[0zrUn{_!OWea S|k?KW ͳXFj+)VS=jQ,K-v* -cgP6R{pl,Eu!j.X-vRuc+(ۊ.TUu9=Nq,[*Zjف@[Tc -(൪Pˈc-4q]#hf,4ci.V-[6-C?sek,--Ok%+PnYa&QEQx#y ycpE %Z[-(^x^EjoMWȎ2xl -YDm b(QPen!.]=«`ptb58.{U8v⯐>W~bͩ"߈YQ3j˴NQ;tBഺe-\7Q|VLBqKcNBE]0N W\QF -@rUJacB@֑'4\mzѪ\b[(26EyIZȀRؐD %챞eK0/jr}ƚxFi-`ݬqD^*%캀x{EUER>'Z9)ׂaj-dp]l܅BrόW#0Wj}"QJαh02>JvӫHKb_;)kyKb\͆ ێQ-TlIpMmNB۽}f,j"`2 -r7VO )Fm5Pe۲~mCPn64G"Sɼ -qDH۴@:!KJ^IEIR"V(ULRc`KW{ʕm;+md, -P{"ok^"j?J[eEscU[EvS]E6_z|Sym_}\ yGC &8@:h+g&-Pw|Fv4Ø5.,heKU= u@:W"p p{Caq/NdÒxiۆq_ru+Y]*lif5u*.RKCEW} -cEPeʋ]*rXE[lKC_CU جXr8Xv1 Z+D#VO;u+}pUD{.T&cp'yHj#$3 dSR* *Udp~ga֢\6ߩy  703K7UcGRJ.96[kyUdٯ9dweJ*WHRA2-ςĻYcmS(*\.-3 #nKr̠{smPAԪUkfG6\X E}^ ZP? bRv˜ Wp^7 -C~aMbϲ u0 R U G7OdCApIvYR9.' +#-‰e+6T(%[ˇ^L%~/WvUC%bᜆ~]穝)0>eRƘF`dLP]eb@*[/QS FQ.)0ߓĨ >&*eX|.>frD:ǀC<Ϥq eǽ}D"@ti骊I,WO!o@51 -A!n>,$ogЅmD36Vme){P~qiC0ϲSbSPEU:1!lFk1el%O+c]d'/.^|D8fRr]—Оw<īfQK(E\`$RoH6Cܲ4fmZ\Ȝ\ 쪸% `>c`g|V53 EWb e7߁Ĕ]ri0&Y8:~u]=ޒ%Bu -1O3=9-'_uQ26* ̝5OF -'6;mIv#Cl %[phMX+ {R2Wbce0`K~Lڶ7Q TRɶ{фv0R\4J_pyX!{H.W{'r_ ,Cf IcU U\-PDQْ\vf[ - (l%Udp`x九a'ȦNFɖ%oru^8UsaALEN[er7Szȏ%%6cQDF ؗ )x&8+ Yz OLgs}ܹ.6caB[,hĽ?p dorȶ e*69 WQZ3H /'єd$ q/pqUGmsNk,ddU/+ VJ.@]݀.E+" JMgŧtʘRE˩?$~hWZ[K*hٌ(Z?T&Zky -o 4D2= -\pN՘%K=`Jj틘_о;6b)cmw_0 5 `{oAR -xSFW*[D3UZ*y^o.p"kGtg@i]pHd!ljUf+/ܬT SE-H3npU(Zk2 -r<ƥ0RR `,{g.u⡣O*Vm|> UQ6"ZTJE VzPq3LZ)l|\CPDOH(j!+4;j)CL5Fb6k7mpԂc|+bh@M/,jԨC!# Ä JF$7>+٧{w|U+=З&٩ P&LO('iT+tZjSa) ,6Z6m7¾;dѮ3HZm*`)LWQ\ab|5R֬Sv3j03Oq+vIZ[r[PKVJfi -$t -*Mf 8֛Y:ߔ]a̢(Ħ IBX20ׂ[Ez&eAJbvVyeFhJeGc4&^+DJ *ƥ|c[j`cw*(Xvvl%Y83)0'DtˉP{Rdlbe٪ʘV_lv2 KݎuAwJ*_䥨Ok }CS|SUxEF66ɞXhyUuرn4rHщBЍ.ޔ[*3rrߢ]?{}(U,V-)xDqTC>AkA !s2dp`fk2hb! +ZvƒgZעi8FF5Z5__S L KQgDg,BY`_0u0L 6ql'Y(e -XK&TqlIB@ # aSJܵ[bmEK\ #3ޱdO`J UJx/-1- sf]0cNL_BiLfjB]x.Kݖ-.n0db0}i ULҮsAvrv&Km\y*%J.A˨QR -Z1]c+sHܥ1(k1GUq)uwem˨8-. -W:Y TaQ"+۞Lϝra <ԼOK؈r]P -Y -^&]݁JQٰ7+F`AQ~0“A1]UƓe/;. nS+- -B|zKNE*e: o 1ܥebLdX غ-Y.]{svJ f;=/ ^±Z=Ü"DP ؊Y~e#(Q0FmB/K.[ndS- -q KF^e }tvX*U,nYqM ,jq\lU -jdGo>&rYR䭹m3EKh5bv d`dL{2\O WM5p2 / fNm\{Jnh=Q #ʶY#\)BU&Q#6/`3V$ى\BQd5$;.^/mWœ=JfјQ>EG\M -BYlo#?r|,`A*] -0yJfh/:Z~/s?*tXb" %Z۰M& -&Buljײ[r_ "8^bfS {"AVYrۇ%ɖxCqB4ibSşfD- L/Ri <*W6CltT"Rwr!R_RĠ@ڢ, EErYa;_e:DB1RlݟS0ub&\éDvX6# -!?.Dco~ZW*lL j%@]:w \uպz-T{b>N1+VA{[=p5V -'ڠϑ4)e샄vY"4UiA%̡JZTruYETO`lg8tW!BErlDR!R"r^[X1KE|QȅE< DeK9&W6}l:=b'a^eY]CP*WP<WD-K}nOgZ1q+X?PWue86j3IcQeGѸ@r@nU!5E'0~Z{S-rw - i 'akij4?5~PJ5LDMJ LjA!.7wLRGUÑe" O}7:tFVHgWo'V}`G-p\ 7b:~+r~Co&f3LFT@{Pd]S15[\}4O"/ -0Ur-*-)\څ2gF&M<춾 - B%v)<.E+^`li72*EbPnJ"]㰳M@mZ"MrUG!eʢ'SdW#{ ػ̙XNe91`xa[QY? [}Sw?S {_MXmWV -d=/lRtlNk ~%T KnWeŇl+U/yX8}"1Ku<ݭD0AYGVsKfݍvšu -m݊b!GX8E> aVpӟ VNLYsoujin@ہW/kjZi!^K`>X~ ~.^i{WN4`2R*UlJV3*ضiX@Z - -*ên _2q樋V^MVOy"d(*Re͟SLji3TnT97Y _*0~=FϿL&RLc* S]LRt}O@:%ʏZ?1?ew V6.a}x4TpWeFiA[B -DN_ &͖l~%CvF|jJ`-7Ijv^Tⷑ%˅*JX/P25K1 PQJ^W%F;(ZKKSK ݶD`.g./*DVəmJeIKE? >Ľƥ+e,߆5'`(#P>J`}9/Wg\'or<~clJ(?SMa|BuQ3؈68JG6Vtwe22Jy:Jߨ[;-,0&<=9yʦ/*:PEG\wPr8}-x-n-85sGN];(~vpC)*QAiO*`RW( Hku,@jgOإT~:Q.IJ麩XyR3@Ђpjr=`P^#nYYG'VmK){b-ey -!uab둊XGU6/O4sNENRڅQ?~n1Xܧoe]CrQ -eTP+PV3Rs̷{ JߋPf޴ -+R .)2!E 9QOi`pb˯Sבֶ%m!~eS˫eW-z%+(B31!xɡ~,p)~,(TBr §7"U nk\DAn Xѝ2ZdшԥKvȠJ*iO${qBg%cV58B-(bFʎ(#M -2AeH3 ue Ɛ<`lZO[%Qmó2 =-`q2kp["/ Oe'{E/jPfK.ed Gv *9QǀDlX.gQڙYJɶ|JLHYEC#J/) -vTlp_ -ܦ-DggrcДz(w0s"8ugn՚uZaUa"Wѩf޶֚ -TVExrRya{PKeԽ|rӴ -|6ğD)ض(RF\v}e%jɃ vV@Lܫ6u9Jؑ&?#k,VW#sT,%a<5{6ыK/b<76,TG(;:1xڛڦA-J"%_@ċ;-\j]j^U'ʈBMX!p*\)'"69,jমq#DȔm٦ܦ伯&u`J?T<jnY T/0|),2^!/i<~; PNooڲ"E[(?;fM%}-֙ Z"f6# 7r͇Kws#%‘g0d<v 7qo)m+ -M\7Tk%]7,lKUyɊƕ0w: L)R͵>;r*:4jA C<PPw%@[ u-4x'̬ų>)ڡK8ވeA5<?xj4k,xyU2bŋ-ON.?Tc av[/"YQIY{2/%ʹCvēKa+nVwBeъBz PNFlaS&XBʝRdl(/c;)"H[9*P )q(^E^A/+T[`j%3H5Z[+YNA* _D^0ߨ܅;ZYSEjl0 _, %_f -/Y]릎%j_o̓rPLye,McXdL<,z益 ]yG_tHnR],Kp.(mFK+bE9-jY`+ ,ШpaK[pr&"ZJp ˗!ֹ0 QAAun _y|nتb3&SlYU[L("JzL,EqedS tW!A_Z2UKe {m߆Fۨ擄]>X_%o" @R^32f:ߪ$Ҭ0P Y:r -=*xl.8 -P&:}0j~6ZE+*&lF4Zm -oOQ,ڙY-YD%XńUُܥ4u׭_{0/J7}ڲq(|0z }TU&,8A+/>*Er~ XLts`~ -٤Ae׈m20V `zJ> -<'M .ȆlCrǒ1i J { 2XW#98Ku.Q2BXxqSWl`7e41YY2j"4r ׳L;0aBEtɔls%<6z7%;.JȬ-j!g?s<ؖC/y5f\a>.Z(v-Zy3Q#ӰTţ̪}KeY.ʁ8GyS=>˵R";d. J/zT-F;H(q,[D%*gPK5hL^˔&߸%@9lQ¢^Q - ߀%&2V\ Jk@W6צ\p狟eԖu>N@ղ;?Y(trkEتGcA׍ڗKQ\ \o+%cvAjyJ_')xEW%$݇ab0^m]BOdw)zFW4շ/ "T"\yȜ,JjC9իDu[,0ZM 6"3@bp%)ud@%%2SMV g]z>/,x݊(]<Tp-jxܴsgk;˲ȁr vR/aZ܋XU죇>H[<\iOq×.piٶM5]lKr\~ mƮ]VB$RTq W" L aH8ܩ]@L#f>7SM9l@Kfukʺu/-jVLD+~ KhǕ*I[+%=|@D,AAJ.eǒcP;iAg0P.dj-[lVLWLU0<}4!5R[jwQ*j?P+Eʕ?TkCP -a{{9(Kj~(8əH(ZePch&ӌ,լٿ3AY)wAV}26w?p;Oew'ZLE4_ہQ| Y5-vF8egb[߆UūBRT,RnqéM.Ũ4EG [-ȷ,2I _^|(}[DH }%H\|#UEE{BהQ+'#W[]A(˶cr.mJ#allD}&G^PbT"-}A؆&~~焒CjݚWمۖ.GEYy[ooה2m/.rw5B,kV5&i5**yʗeQYx NKvԤSȾcβ2o"c~9/n@ٜk^ '3Yr"MYۊ(afeÐke/LnGƜByRe!ƣHm?#:Wwfr{zP/3P +3oS?±l?'ߨ~X4v<ڍ`*ԣĎ/XEF:JIF*5=A_Ĵa;sB.ࢡ:`2+ir\\!]1q'&ˍJ&_ ɵ8K lK-#ض b3A*`oa5l˿#w˔, -渐PFG ݽeIe|m.6FY;_7WELQ5U)y# WŤ+* j/`J|B8?s@]ZSUztňMj12*c*,ۛ?b(D}0UzE"NL[zEO ~\,}cym}f"iXJuP~ #m {5%sp5GF |M65/8~HB7BԯQ-mb LYwljXI &ORg"ӱȯ,PEݜY,9T?ecp͔ˏHudVR9F@*5nrRZEd.?Y~%!˒̖@\ l# vsp< `O4^>"i^χñV -?gN F~%F`P#/(첱6Dwћس/Ҙ]:*ށ ޿&;L+X(7Oi12gQڞnV4-]9"mx\k8& FSU*dS |fѧ -=A_(Y]L^-8jޡ-8H8A - OLlp%L,I T Q9-J%2P^0̶quB :FQLnʨEy7&KK[< q\Ay˙6+5ʖ=Ĥۉw~ !fq?"]d-j4VCkJ"ٹ7P\tcLb:*'BTtjJ1`x lE[ 1CcZn uk {DVM! lm_]E -Pxku \^+ˋu\*} *Yl_{Ukn`@Kl@!ikj0$"ހeƣ#j/ui3Jv&#Ҡ:uGԽax,7m)괎hl+ ZyUvM~Quq݁B JI ڵBgeHO҉w5nFʹ:FGwǔw8hkaEa,>Who -o*lCmԻolysJ$s[G-)`b#)n:DC -gkŧ!g* E;  r&.mxKn*-^14Vv@^\u[xP bPTt"dCƘN펥~J[ym /!H /.Æ;\qrG"-Uo\ ~al7DU A9*~<@* -v*0揶o vJ7in6*0j iVk[ - - -.d<ꮫ<Q0Myv@Xy.\ K0/4CDE j 3dj!v+W%W6TG%ҥWano]>\:r -[#៘_mTu1bxB!p\=VɩDO$%Ѱ DT]Wab [6G40RV[ \/n5\͕.{,>iK~V"Ifmv5Z5*Nʎ3 q{Y~M1˿.۪} FfP~d^ r,bo erQԥ|i)/UlI?|X8vxn>&~O% }L;05qZr[l+o|Wg9SX+^-UJ,\ó*0<ۇN3ñ kijVo+xZJf1EHZˍrz8bL@jS).xbd/̴ǘ$V|aՄ8(1t#YrÄ̰'L.^lZEc,rus>.F-02+Zh'Ioj&DYebx#rwL̲QaԔϨ%}ˉ͎Fc2T>.rEK+jUj"y ?"j[tQ ,wȊ[,+`/[eA)DRSlԫb%7| dgڦ.]|a_2nT -7'{ZD*ړ4 B/[_}LmaR˗l.+˗aBWjIoWMbuHP]Kd(o!.SpѢ_W 0.سgYߨKiql2/Ό+eEG".g3Un@xaor%XYɑItC 扦0iĺ_BV-@G& -}C?1N^Ař<> }\SvxDX ~;/gc_rda@S=V}K`n/ԺE.~f`{/SC~iG]{".J|yl*x% [ɾHreR+)eE\%%kS4'7ʋ?2ۦ- ꧛f:v]TT#a.^O y=ᗛ. n r/-V܈aP-b e U5R"\R9FK;1O,_QFUl!/>\<h1,ʟbcPidhxķ7Vo* B -p(0~媈وyW9g͍f|=+%KmM.< ۋ[Ķ6{5TԿeAqɮ -7 O(X 0= N;ʈK.wb P ocl""Zw):eY*_ISΙ1| ]J/xF L ~<4f E2#̢] \U).M-`vP @rٱ 5LmU.3v/XP4| 0Ƿ :vU؛ʁˍHIImL&8yP56O~6#υLO:7 4y<Z7\!ە́|UUEdzarȌ'^B+&c Wv_P.&KΥz\:)XT-zZ+@Ts⠓Ic - ʂQ{GJ T{/)Qj<ԔeE}츰BO_nU\rdN&n+*Hd"49YA|LJ),W ӴJtP+V@ZcL/N -Ɵ.0eh!VXrъETo4e*r5m閄[*:]J1q+R.2*oKY"PTDhBmS .. ;uT W6XWk/F* ktE"9E  mrԟHwgj -j ٻ{11Lo V/04SC;˃؍gUj}![f >p5jXuz:2zÌ>%ݏĆޒ/*>?bo@6J-`p!UJZeV@Ceu34)jߌH`Ypl,EF30$4 ij*7aqx_X DZ]\`ߣ!x[e2%aJKtQp!o*%Yuz%s>& ZpD7&P \剈L*9iښ+mP*h[BxRE-I[[#W-Dz_cWe1vAҁH~HRm!$JZս >04|!U.$xePzn~(}␼F`u#=H /`P??g> |wTo4H@B?t2Ą}x,>hL1E)ӝ߷~6=4),/`Wb/XTd.*=#Bʣt S-^Vj\R},jΊ#cN9X5Y FoPwu.~g,H6<7 <"N@)Jw R1h>ýHk+RH}4~~&Ϳ05S7ԍ}G*^g Kq;T,2Y`(Ïp}9pP?j YN?ÐJNʟ3toſW*V?űÄ4nS7"xEKzU0?Cgb' Y[5\Y/<4@DlPO.⫔rnhC%~7n$%[sJcbG|R|;"WAh~22e]NQo4O pSQW|B%?^$O^[gdG~,W $~+!HgGX?,D;#R_$c&v^Ev{?ʍ?3uד)Z7ihn~l6ާo#8lD |P{ [F|lȯ`B$S$E?|:Dcuc[Մ:0Pa*[ieГbpG`_ng'X>4s"Y?> T|ڿ#PxS?}0?oH ,N?Gs"*%YY4ނ7FO ;''QGj &ai=IWA E)q{$WdJ$-LROCUu?FCX|?A&؟O7_ZU{TSר'#u1I{^ f:X^TQ(Ɗn%% 8*9w}@*O ]\<n&fEP_fp(oX/bA_}"9B~?mkDŽGI <|Ks|lJ|& 6n3B _T~ j/З`[e|MQgCܕaіCJ}gbCc_ Mc~?F,/bЇDuBe]%}G? |~[TƯz'DJȁOPu,b~A!5z Wl,B1rv{E -F4-AArgmIJ>{"ے+ylnZd?`7f?7Y Y -JR&è۝v$Y*6Teo#-m nu"&o4Sר+.dU&ŹOZ|4 Q^o_nȟ6.FT&Qg$~&W&Ge֖^F%P~)_Q\nBf(tNťU1 %vaˆmJuZ7߸oQ_h,X{%E)Ȫd2{qgc鍸|߆?љw|#jYʝ ϛ'!'" -^g~ -jFc~{0*#?0ŸkY"(,O<| 3?vi84CLL‰GxOj_{AB ~?r?^_H|n=YV4}1,=?{l򽏏Q6XA~"J+{+B}EeFws5o^R@\6s+fRU!jA_iLKZ:~ + H DZ_CQO*WAG⶿j?ѿ򰣝4>?DO{5AQV;"(oFOF \/?(B~^EWWQ_V󋭀:,Q6s"M.?g嫆ÉkzAe3 -nwtx9We %iv, ۋ2=PA`,R٧a? eۖL~U­Zɝf?4nQT>veYo##O6_H@s 2WYb}MʟК)dM )`sÊO5ngR;1FyHj>]_q '/_yX1kJ+ HqO[4'ڏpQoSL?]O1Ÿ5=N~!V&4R#tzA*=I/g}SH?9`1 u$q? 5OLςm˦ӛȄJ}&yiװq oe_pu#HA GC.˗lMpnb=% 'Ma._;nH H9F4Y1t@v8i?.k ɿ&Vd*[VP `{Lqۏk's?7`a] -sAq)~TqpDO}(} -}}uBZ~,yfxݧpeUvǀX%kWP?R)?>3ݟ"22!MIG~[t 2]iMfQsKbFlJ"7 m;TQ<[ղn"ʂA/Qy -܁6瘁SԨD#C*-J#f?:߈9zLQ0 XkZ*473`Ɔ7*@z`c𿭕|=O75N[/*[vq>*g*6ο;W Hsu*ɓ?J0:q~7xk?Ko>TAqM߫=7騟-0(AG Ca>@E -~+ȟ{Jl VJ~F(cEmWmC^sL9Sson9? -HU `}cb5K0/v6G`cnNk*\JYRLR/+"'Liqx @8"6S35.ܢ -7+GPZ23|X&+ouiܟop⋶ -8C_|H֗ӉhY.LkeyuCF//M||To?3??UoWl@ū-={pxJy:'/z9a1u*سJ%?6?2qB$ j7=K{x Z$Ԧ<,eyy`6Q+x=˩K.;Q\eDY!t.T2\.5 ReJhK_?*ZvgܘMd}B:^=;+_Spmn -*V>h$nߕhW㮷w?> -$27M*TDBm?y>6oFyEz3owSgK'=CdY5<(=tx"\vw,e/툟ܾâ+?KWyk=,jwlB}L~GٚſϏEM,7}Z -˖~S Z,?J?#]24ռ??=+@PNUG2_{'u_;__7~PeFU;}.Gg0#,{aH>'DLxg Jy;D*RPJ!hv˴ۗETT(U2v[(ݨ0B @}NrpO7 )gz̼4I3Zw!|km3oA_/s _CVSgyrQ ??ɃW^YVp5b_3M?OP3d([?҈ .fO#O..28_71Lu6ϐG)aHc9c!Oü~"?="k#BJ|%~>>e QPi'oȕML &x%'!t6a\ˠlBr[\EZ\(eWeC%!aj}؆ơP+W‰_RQ(%amI8k+JIr[قIO#U~!?t1jWg?i*+ޙw/ }?yMo;efVbш/ݧg C7QGS?[B~㘿eK%+'/Q嶯 =aCJdvG -DLar邿ߘn]=;/A?~D̃T 9dWzː.b ?$}9tS V|zyaۙkPWN_fJo7ϤhC ߊf~MIw-䎟΀3!L=Zue#:T4V=AȄl`ߴ!sPJ6Cnh~]{5q'i8߃ٔ^Hm_+I/mE?˘?1}A Z?d2,{LPe 8W  -_:-lk o9O*U_="  #VC'k6.$@ȪZ"쵊a.=Ì - eי^1U;"]c -vQr MiUQ?GS_hwg>U x"ˊ߄"Hg_tm|_撑/WH>>t6faUgeJi'*Ȋ>3;Du =&>~ CɈW]KU7w?Iwܟ}! r̀[)E?-vaiDQ˵3\?4bkd PO-cO/}>l -YAY U]d[(skyg\? DƑqحTVmۄRd灄p*o!||d$ ^~s*<;GLCg}_ʿ=|:R9E?pI5:7G\'Ck5=I%o{'Ke9oY 9?d1A~3>SqRo`>}b?O+[;u5Na>?t*A𗸅|Z`PCRO<.E?߉_%?L [pYu/1@.lV*iql#b%^aUa.^Kb.4ȔfC_ʼn$JIR6Q#l\6nا%O?C'~u Ho_Xs>D#{>?U f j!|g5OO&Lj *όwh=%b6_xg_Lk2➾ԎTX7``>kY'SD_,~lǴu1ڟl 'X}vXCi_A3[2%1i0A[}EpkVumH#˨T+DB+{ܥj2>xg~uq&RWH̜?ϓOOyE^_n. Y?E_O~8W?ahWXmY5?Jƣ\|:W+ȭV K1e/X]%6#A3T3LHQ!UiJVaC,'hkƦ>'+wS}ޗKE?'iց0 X_OXW\VSpHEW2B Pb0j[^Pkog  ˔FbU'Z(,-*Ohp99}°<\E -A`2e*Pۂ}f1NKbScs(R뼗dW ۖ#}Hs%Ss/,aR 5I -*kmw*"|PECjMJ򔄢aT7Z~Y&fdI0NUE( --@=e9!%xԨ6&>2uuJ^bZe9Z l{FFV-4EyXËevO2\7_«\{(1&'ز;KL7+Y%[l1e\^\Q=3~Zc cEDg\w(# ^ E@DQh ܡ94.'%lř5]=K@b%Rʍ1- YCܡWෙ)w cS2 |ѵn41G:%]7Zi} 'u6HTiUU-}B=؇j6ܬm.-E%xrزpeHzq_"J|e%FJnVTU([oX`M_O6;R(JBrMcݨ80B-cr[NDĺ"K`n#˩tVW(D;6Mv-nڹ1rc.~-S+e銡WD򾧂S(7/KD~eeG嘖xZO1R~ķҶZ]K|#GWDWE3JVBx& S ՕrUr]}z豞Yz\Zr˗}NKI̊x.Mdn[sc-w&~It|vU2 1c.}З^\:mw7q p12Yezv: Aeklȯ0jYcRi.pYز5\)w%ab "K&[FY6<{Pe˕O!ew&䧫r]^!Qj>0Ҳ#ȝ>ςg"ZbԢ{*eœ-#Wuz.u|oܯ7 W>Tt|\ƪ_JD—_Qh}S-JaE)`RT] xfڛ17RQegpMa5!^I!   j"چ7Qb]N-ߨ%#K~EeAe17VGg?06zJRCKe2P%p^ō,-%Xcd &S+>RP_Ly%k%ܻyl+j=}佔ūP2&U^%{n8r!cȨElo,.[ Y)MYC (?q"Ѝ9_RTk04e u^|C^Mm%[~xu.TˁY[p W>D_?yQ(~?\v~,' -]a0'my 聭@L²`u6*[<_%:ve0,Jv.Hk3%9(E Uk)\%h-rɮU郢nQت)}h|3WF(Ŧk)z܂Y -E:jpg/:J't-9]u'K#+&lĹevi->29GepiQyU+2*S`6{nd6#)xru6Z "킽 ȝ%";-jOgI7cَCwU ,K_QEs,.˾ -+l[fu,_DD3ڢR9z1+z;@e}m LfU,F>P ^%Y5|[apR7eO՗/ޒ`LNzPV:O]+g.?{-qXug퍴VA6=\-I' --VF@KqAPI(*?A7i_ؕ]^\ho#oY]_yn - -&'Z F Y蛑Co+ʘx\"<#+EEZKQwKЎlP&Vor8B rfvAGKזSZKAˢpܕ,|ƃ*x# m.4P^̋{ )?~U`HrBښ@,VLe+@}/lJԳkҺ -ۍӳ(8]0;W, p!6#tWaAX G_\Qva16纁A=.> ]LLG#Mim#Q{KeMbߚG\.yYm;*`7:[N~f5Qr[#AJT:/-MVjWȘP^gUˆ2B>gDJ{X[qWbVKCɕNJmˇT#dW#& IoS:RFO7"[E%IbQhPR(Z*|>ՓyS -R㊣cg3E1苧D?pIi*jkx y=Zo}YMJ%lgKJqHߙp@v`^ykṷ+TKsI*(TZ;*q QqM1K{qf\HiMTtK3OR%^N {KUKbWfZHQiTW[xG`e*Xdۊ-_j)r!U˦juYR - jTXhZ~^!'V_鹬42>,C\刖Ճ٨:R؎LXmύAw6==x%'P} ]CMO +$cXn\"SLbyR!ʇq0Bz_!(TVFL୯nq9p^xעa@q»RlREo.<{RU#l?D.uLA1L U)ɾ~9T)q~"_Ѹnxr eED]΢p0^K:8eŅ\^DͦW]\%K=<,DMT^RE rse~/F`t#p§pr)AQ#b-#Cj?@Ĩ$bKub BJXKѥSp -£JTPZ' ZPOxu]4>joJQ*`!R%0O)̖L;Uv3>[__){k Q]92){-% C%Mr[.]Ը˃e˗s-| K`יݶ(1Xˣ.]UAW# mgYdb췿 ;#fZez2;Q i/K,\`2?zKrDTPufɐP`~ײ#j@K7 r@$χl~D%="6YLVlT+En]JL寐P+[}ԳሴkFS-#o;/D$Ư!Cb]*2&C[glv!J}'XGEs -"A2T2qj5vl|pvbb ٨kܞC aD1#U ef\YiGlir-Tc&$1{^o !E^Ķ2,j2,)^eٷ܊J$7ڜKX#Ii/֥,.3wXKZp>ˋr-7Uv˘q.)?_ k6莺OKa8,zkҧ.wcwu17SarU\@j8{L cU"}DX-*S>\`ql勊y pH1X!vhy ŗۖTl,.^A`xC qƙd[k7gT,;,7'w_Rń݅,> ˎ Oߊah**9Q%)zdJ'LeŔUወ[v6],,; B\U5Mqr.Q.U]K2Ywq| &Knὗ;&,Uר@/LYEKغ}sU[98E%K!jWl'!r.9",ƣ茢fCfA6 nTnG̹rQh;4ȔUu7qAl'IMT B"]KI`ܣ%##,e!lع~`nϳ",٤ I}1%ʹK\{RTu# ES%Gr_hɽr]OXhCj.xbayyzl!K~%Kqa?]^WǙ?sY_n,M[[A[g%Ke@XLڝA>Q}@qT%Q)( |0*SPo)*WGԱn/EdXSAL,nò<1Xy%+LY&L{R\z%]JYG?12lR6VN\M@JgM]IJx%>ZLhSp`DP@ڌ`ad"i\RQȝvNPQ[c|4Ri?rn@r˟#N1ob]BɿvqC{j/E3&6X{c%#Uw`_1j)EDr$]xEe/}Ȓ]>*&~ 2E3#+*r9>;:vX\ rTjTa+V@"US28v;D ZP(*χ;1o&Kn5+\RʔDZHb2YD/.ljg8俨lheC^`oi,0jW .+ieXK|Oh,* K#0mmZK۩w/vQKv+[xqt]g2TK6<;nvj^6W2l -rJr=Ě2YQg*V4@>+␆6;(ZfL-͗ U -/lQrU@1-'&l2";bpڸm",E -OEeq [U(E0wR𙖾`LKK#ev},ԡc4*a_oM\zKĿAo/#NAQH5L7)6ȡU*ioQZ@ `}N;eYrPDWl SJJ P .Qmiʋ}Asҕe -6]ů H -<B὏q7y^xWٞY+1ّ8<{;u+M0[glfQ,0bEEE׽ O4,A>bbYSb? -ϐY .5r`! j,۟dk*,eRUSwN( M1˰AaDc( - `Dʝ1 QJlʊQ2F\ -0bqf jf*Q%3>ԩW{;+d4ADKrS2ɶRZ :1980n0 V,I^+TVxv \l|—[h+KbQC06'e^,m%i 6T\? ܭجvƕTGV!BȊ#wK7\TX)!6G TUQ -$SC#nR*XROi6eePq]noUHտ%VkR#cM0QjJ Ă2Eգc2> -%\g#B DNGx@']ۤǿò΋pZog%qu;JѺY{@)ښnW`IG*YQmDvWR%MdXYɲ+)["OͤT;sn/U'h;Z -`M"UT!U},BD7jlKn\}@h> mbNU@J.QIrQ!13ia)VBZLC 1Ĺj@[eDtJsȵʕ^D",VvTyKB Uu:'M] -6LBbT%oDo -HJt䪇̚\ȕLХ`@yĶ@CXǒyL<~@ #ڟP7T\ vRVqXN 8a)jdF5S/`e_bYg5 -Nd=<.P l%\DF9n:}<UjK.v@T WUQDKCo㌞dksMU`%.tnY ̶?yE Rr+~n4K%&k9#_db -?qDs*=hd: o3<2ߋ1Xl O%:ʀVSD*:rmDi G,2,mUñ4Q˹G!êۈW#~PT3' Z`o>W#sЁ~ lFOdԦvmn`YL x|BF'<íľJYUZǷ6 -4FgS~l φyԯPb\ 6*%bܢr;HZH l^c2ճ(:R=(RͰz Wʔh W./Sl^֘?E}>XJe.R"n;kRz.qk?R3ǫDfں5^W -mG\FvMǐgqMGH&@l-o*6y)V.\$hr\d!doԯ^t 2Ul -g)lhFX)Uʜ` ܔ\ET3L -=JbP,W Yq@p6}p[ǻ =Ɛ!UYY+fFger&x2Y_rޠnPeJY\S2]2?ɘ*#Nijд~yJDE2cݑ8?<Д7: -k˯jh -#`T&-L ,AH%%Bki-:$Hd1Lj> Z.3Qk wTEp\/DQQT 3Fb'={졫-?*ĵCnY]NTA/c% 'ukO)+ `Guq]ש[56t<e^DAF`lU'|<&&]>!?a\&=-_GF<@aR~R-"f9%3)]= O;:o>Q0@ml ƕZnfK zl rPg Ȱԗ__̴ , d6lqᖆ|P>.~C3GH=#N2K*Qa;?;?krn%q#s -^~Ի 1l4Z8 -{iVMY}}rPl;ҩӀ?5+};U-c0!T:Dry 1eDh oR1]RuY~-?.53xٯeY 0WZ@_A؋$d ie&,FY0rkX%r' -W)ipj0qr*tUUEXbĿ0Ycq^%16;=Km2+p~Bx>*2T˻;tbx<~ cREVYSOE^(S,;zv -j ӿo"m'bHZ;^KFV aM72'$KwxljH,btF!"8J`|xb)KyC;_oYKI/ V&ScBO=f>tnV~":GV(8ߚTJw\j%*dp#DScb^ _J~Z¦q7ś6z cƽdEYtuOQT> |y-UqS ñ&F>R lW[~+5ۉdl -wYls]Kfe -&.[[c"#?y;}\e].^L*DKD/* (0*J:*yٗˋH2XUd.ulltLTT-4|fRJ1yC?qJ,9 _oT!F&9 ^UZ.ŸR)Cx^mc)xT=i9#eo*&7еe*ќH, -8`Y^+b? f gN(ژ_e࿏?3F#\!<4T_7dAw<\YE]:iU8Bx}`E*R]`*XJo!} d>!&Mځ1rDEԹgT7J"C]MdK8v,e~ZK*`l(:Q0K'3"z.T\k=JUXAxk :B:KW(̡bP4FL؃Rvc-R6Q-hD@}!.2ʨ j}EJ&ǽz$*C?AQW!U8[48V)J(݉Bq+QL3}e,Z fM(a[C< ?)Ic͇HZ2O02jk*.*bۗSFx!!ۗe-l -@*`B"CaDeZSUÓ} WGZR{{7ǁP[,u U" hOX,Gn{x.`{[ O5fULu즚:xR݈zţ5߮yFgJC{M6MEk%;P# i ӧR;D1ݖܻl!(jU[E(O)'6@ pw!nC<"\1`W>}HWG9.a7F(žܗQASB=^ 6U!POVAwnR؝\دr{(%kUo/Y`\_y~[M~ؼQMw"}2iE!q~ucӁ [6aw; -_Q t#}ٿsSe5N,p!?b+\oP*ظA&*W l-(osN) mED,ũpm,04W6 -R&jQ#UhIziDӔ.vO%l7.2,?l*`Jna*)6QCZ,TYtKV1Y 09@E1@kTA 3lp.U,l# -i \J.uR#P#`_ʧ#-Xmݟ` Dpr4~MOP ->Y -imSCږ'&73_k5Ŝ}aPX&چ;rO"mP,+~cT|v(V Ц+L8W>coSZCCc$~3b;[/5_*Qn؞#RNJG-0Áesqd(l!zV_ v>v ISUA _4oz*Om%.A;t\wپz? -ud”OQWfH}wbW¶Q+f_ -f'dӏnLEWY❍r6[}FC`| [J˖of U4 -,k%*ŗGţ-,oTQV]EJ - ]\ԹYw-mAԿ HUF;/#>^J_,5sU?4L'ظ;!O?@>+bV>ShTs9<5B#;`X/Х.@*y/ƃ.MʦиD}jg/fSp"L_R PCև.TU/*k.!Dv~Zٖ5PlT/.E>M6 XLj]9)f`*'`,˥P`.غE1싐kkjG?*y-|CHiLdKqjbFX|{~⦈KJ˨jmXźAQXy%Ub|>.Zڞe%%Fe! 5yʁQHZ F؇%D*"QӒq.(F$U7RsIC W>gXWQ Wb3Y3*yYc9.3.& Jy -؃_M -2mp`;mM+-< uXke,pn=}VfV/W7QzjbՕs "-џG {9w;5bZ\.⢼vye >|E)|;<Z \%B Ǚ_Qf*6P EPF%%\,ZD%5VřZBmmHta&kT#ҤK8e lX D> -P \)~t]w<EJke2)(3d:27cQK|Ua-\Igf*Ȓ|0T.UPܽnRJKXgb ĵQ\]/H|#g!*- - Ex?]`PjP>^Y.\,+8d-NW𸱝D+ -Р,Z OjjĈ>8AŅiPl"vCi#ױ3 -ukjGVa@("|]QI6r#hn/KJ OtŔMuVk%0H3߳RhRhHcIKo"-Գ!PjG'Fy)> ~ل(Y -|2N*u}z#m .D2:HnŖ4Efe|(fO&!_;4@}(%xXZ~MSfUmL*|W!35EU!H$ӮV*V`BcO,7(\0ѺU_?97JhV]^xo_D},tT? \Á3[ ijP\wd-֐o,r,~ujطd6#1jPT/ÐY;_+dk&÷2U>A~eKc'čdVƊjS~&dn;qk4Pw@WaY2/~Ʈ嘽bakw,BK(@v//c.S[U|T\[)LƁA,,JW\}:Q|lܩ={W(Tnm b3W9kFPxӬ!P}{H3Ju\\:Q,ʰ„b8>WwRag^ʂ nBܱ_mYȍBܿ[ѓJȰ jaߔ0(WV `p0bKcUm + um{a -^Rnv0qJ֖P=ߏPh n<'1E ©nYr<ߋMM~.&;,/䤬%MʁJ:FM;9-Trp.ԗp\ce\q"g aJ.T%uزp6+n8w?U=ry+ǬhPX^%瘆̏gڥڿTzgSV1} ӍШ^$[[NKSPnbly:VnEsJ;PC6Qʆh7ۄ,,S֌žvf!1x@HmU0\ -}Z+> %ؚjk D%%Z3ISN)ktFC2XJ̅x*V a}u|E^ Oc|鋷<ÓZɄ}E.hd U&6k&L;cy -gh<=QԻ mۅ*{Xk =`tg04@ʉϊV~Tqp]أE39!\|_"vX7O@f5+!Qt{7-RҲ%i -Z_?4(E -AbD} 5q.0 U.Q FCRHIJPFW YVVe(Ey!dSȿQ@5zWRqI_]5Ie_\@@@.CަR +n?Ȫ-8J\DlFV^x4!jejG$jmJ< /$ ?LIB6U nx|OP-ws2ד+)R5~* u{b..] ׈92*aMAscȚ(7i(/lI: [5(D0-F)~+e6\^=c]E(TO[)r -Q%Quv;*|rܺ*]E> -azg -fJGfJjrpkA>a}+VGrӷH(ДiIvO#-\iqS -iD*&2! 9u Yo2j ^M'.ŭ|Qtba]!8 Fy{LD6Vp VLYe" CY:„]^\YIUu7nYmG4ر+6E[%|Q%Ts Q%KRTP_Ja{Y,ScKe=̀g򆲴%"u`nv2+xrk>-Ql2ke d.+ FA-|r{z?3OȿrEl}r٤u0.83]B)TBdwhJn/<<Ũ-6L^PX[-ĥ}YNmdLq% -!( - 'Ezg cXlJg `VpEǕ6`ߑ=i("t X4F/2YdwȺO7h;{֟*'C.5Mư>y^^bXt vð;j -¾(~ ]P0~ᱲi"r&myL7 #@? Rܨ]miXqgU" L8!$ vcc>%sH:D!J\S+8\2Z_OKT=9X ,*_6f3\z#<Ѥ%ܞL-[e> +CUUi -?AppZpߖsPTOP0c,;'`<"/Vqxj@ܙzTۯ?[4 Ig[5 L"1Mo.~寚sQ!r'*W'L -X,.xzy.yH>۞)vW-]&3;sSՏlcEm̹qCjT HE:>%1U$0Gs-ғK%T(J#G>*-)/XwvzeVکkר8u -@Ld vxsl&FJ=)Z7Yls/鳬E(pKP -3JQȇYdrC/e5*3~0sRdS2X58j獬@o: 됔 o"MR56IkX˿eqg6!/{?eolv%i_ -_YRxAxn_7}-P(.}@VԬI1++ĜW`CzH`T`q@uuJ [. O ԧc a< z>rX[qe2 Q+eO1$*\ԌS,`Ge#ۇAP +{++.)Gܰ +%rL`PrX`KWiK,Bˈq0R*y}ER+\7EAh+gթ'op .ڙ"p8U|o*U)"?&&vpoA,,kF_&+z>^ ,uKAV -`U0t~!60יL)YU[K*Uʬ.}NH82'nRXm*Jd%.ξ_&R7Y̝%W -lsc1k {YȀ=E-[:kOKۖQ9eI:[\V2VN3^xKOLOJ-.!ƹZZW]銞*R ƯۘHj/jE)AQmUsG?}eBbG2ޗ`S>Vn%Vw[pO&靋֏-F - *W")]"5&"T'ʩnj3Q@]4V JCڀ4k++B *7ɫqݍSPD|KڨQqlE-0.O5HxW[w!r4D⋨#(l"\>r/^D -|8D c ~o. rS<͛m˲p.Zܱ?_#HGYw,vNس5׾(}>(0⽋!KG~^2•yl[Zb.JxZJ:(fP=uMHAd|XPJ%VW/U`ֹrse^wSuacs{h7i>uE$to~0>D.)PKDT5mQSN|b$UFʃd1s.=bRJ.q4Bi`\-$~(I$..!Qc9u5O͖;..Y~.Q~&A(Oe!/5iTş##>S -heĂ嚸ģe'A.R6W)PAX\u쾏ʣb\v+V 1GVcq2SEowP-_&"(H\ߊCLMa[7`Wwt3fR0\7aȉyq{TaieV}D-(?@0 m@ILJ_E  C -TC}G]'࠺JLn 1L -/}#Ux(Ab$<6*D pXC8\bnjja)gLǀ4kؾ5s,LaPo"-rN7 Wy܊E+-Y0~਌Bې-rWcx)+JŀՍ %lie\1^34'w\+ !骾w# .%a,c~,]h gNqII`[8Cq|]ʥ}T@wĈYXQ.ݔ ;<*踱Ge5U -+y"/ d#.V)rSP,ȷ ^U9ʘ* f@݃1vP瘄..Bhw%- vڝmS5nQv)  90~v9Up.4ظCl[lK"ٷ.e`4ªmCN(͔n,ObogE -{:i 5c e v_8%555 r!0 J'77!b@ [W)4߄)\6 -f6qZ*l .-Q :A6~W`5DjƐap1}pUGTT&V|S0>FpnY&L> j~eN]n&ᓄ9&KA;*|Ul9ՙ_h&Yd -V.狽_˗I[\3(Q@|؃l˗l#e*r 6K 0 /|So6_r 0i͕tURcɥ$n%ܢrT+-% -\@r,.a8>pi/Wl - 2⍸}x6&U)nƃg6TUM=R~P_VC6´ݪ5tU, N -T5K;U]l&dPJ1 -:QMw1+)aB]/~WM)iRܸ6ke`LƸա5.Hmjgfõ*'Mj*>%N.\nk^#VV^~)yIK_$.RV"̉ _r,AUVåv9Rbh-7XEN9vQQzGT5#ATò`)gV=HyX"%fFXB%Ao%ybD)';%&5r }<{lۺCNeArkG#SLwM_jƆ&<>lʮ8 -'|~Ѕlۨ)hvS`,IpLj[Ud isNʸ+tG.rMO2S|WsIS ?nYP*p9M*d -5BT ԟ/d#t@ +5<d5pKzDQ(ȯXTy&pU3*vf-̈Y춳pKc+H yrgM:ͻ=KLhzDŽXK%.˨(Xs6b{n@˷r!iw#c?yq?Ww8Ș+A,PCFb'oQ jU.PJ^K8]lba鉄lȕ4B MHJkbW G apLe\x! A k?0Ѐ=d]2Y{.jRiqvS @>R[q%=A -coJ``YKMġj2Yr'~/X?Q+^K\_yEMK ]w:U=A -VZg9 v╡Mk(O኎yW6鿽"Bߐ -b~;h-`Pl(*(2 [Lȳ+gb\YJ5,_YbLcvVeM+9KWa[ЛS{vpb54]B -c3>`rx}]¤/y,2ݐ%@f _c8KOB\}MF ȵ*Wy (Cܻ0cϿTX3sc~{ x`'h>e2= -: "Ax+?$qIeirE_{2~PWR+#=XGIwP@hd*\/ȦM_Y5aq -߄*ەEԺ߂t{r*n]5Y(yVu)'eդ|NGx ĩqh^+L*Y+o~Q}g)|i,t7\bT؎pJr#+nipL[VUq\ -09tk;r9Ʉv|^9s=H'㉗rƾJbUGsl(J6P(`:YY(b<Ʈt'XzBY,ٿ'v/lo.6iK(}˺ʂ<"tڸZ⽍_"nR/}|쨔v}1ȏ] ;WyH r)~ajס4O -^M,h YazBׇ9L-LtغV1+*yfW|+26tR7G;MuITxUll1vG㊨典 -rXB {%Q) O0% l(~猏3bh#:Ed/bbQC@pYfeŋ5 ^,saq_fGy +~ʝ䴸Ùk[si-*N`•.kyf-b.9Q`儯 >$Di%AL΁YP*ZEaQv Dȿ ,7bk.~R?DBe p inxjaiH ݓhEET5b2Uʱ& -U0 M!uu Ff (n(RlIo ș[ _82^Y^K3b]6ª,W"Jϊ.R&@Kkl='`>*ni۬0GUT'"[D -ms²YX++2n^¡ ζW`1k@~wVH75G_UT6XYzHXBIݚX!#k䌹\s_łw[ !U_V E/Sðis +eR 5 ט|P$v 6xb\o%4ljUA^*62Gd{d%%apTyoicoaLm,rO\+ẫJd -( iRV%Eu<|jTƔv[̸4M3C 1;K6@XX J̢~б Xˋjuޑ8Y8:ߎpY+bᄊEc1[dSr`|\.y/{:uBW&䆦79v_XjC҉A6653 -eTO'UEVLԯo T;TGH,Ie}Kw xʦJʯĮdf~*\|Fb\^YB-%*"[+Q4mȗSAL#mF8ů#E6&bm{rE]s_w4a\\KlmGGm$9w<.\ -OnKB 4v:q$}b$b!yGu|R23_O~*8_0t2n|?<[ՒUC -)D ^O*͡OK0B>(YI'&0ۏ`.y<((qK`djq~(}L)>E܆O D -j :lKuX(e,sO'+ԹyP;,ʂ\+dcjTW6'Vy2+b0>,Pz6(%Zad*)rXw7eK~nq{!>9y+)87Q.{bD*ʛ 'A C d/06%@p\=oƦ#+AmQu矆\6|4>w35)u{?TK0sny*fBǂ(ܸH5|U l?T th4*N )L!lq\a<.$ɽֿ ڐjȦ +\DgWu0J\unnW򖋫S Q/z8 -L51 m,8" -aqI&EĊyQ\Բgʋ&\nQKOcZE@ƾЈ`_U PƸBlቷAݶ}!+J~$/6V@8EXBl:',j(ra+d,(T$>_ 1zc]smiS>h|iB3JLPha?C-Яq܁S?(JOS`>%O#aa5-c{k Wo -F2 * lj._ .| [)̎Ce+*9  j ,>*N\iˈĻ_ gd#ʗ|`>|W>R|/7Gn) -k&>Ю|eD<_"zoyJƘZTbj-s{ (4{qu(]^h -uO^]Bh)'B -_TKj bm!g~c%(r&dSkЈ jWe0i:.v3{. )iwap2^US9C m[<|l_~v;2~Pf!طar2&DX KE`Gug%Ua >/%"2tQ b 7ɖ&P AStKCA5[Ȓ2g/ nVD+k)l Km'c~dR UeakK55_.(%2_(C+f]^fiZ j)1}Z9dŕ}\v۴C - -myU=] q2 L|˥؟}|] Kc{1Y&8y'D"dʆ1hܶ:h+ܭq! X7ΟP](uׇ`V`Z3rM`z߶wk G#( -  -;"+A([!v<߮6b2öeZzCHW `FۍBxՍ.?Yk,oZ&l7=4>_Ŕ{OHYԋuR0jGn%yR.0yE)n],ːJBE‰qc춶\|)>Lc. nqՓ"W-ov7q<5ZWˑx!ިCйIo cuJ )&xmX?ĔklQeguRKq  w1]N1U9o#W*iUc/sLL<%7iAMkdtו&UbHNo~`RDrVEG(<\X9U}@A֠?(*\@AuCP?d>s$} -ʕXC2Jb/`\cDŽ)+DB;ҿR]/!4<@LG;p9'T(0}5\j.ƕ)t%>oLjoKUWLL AMw>6͹O){Ř*żOyL%[ -2#(iBbxR/}5P+4QxA/4y1p.*|SrKŪa.Y&S:PYr /mK3X é.>%x~22V\m QeX/N,a`oF}P0cYPJ}o9>F~Թ3[pGTINhWc-BxXP~C@o:7{AG`0T9嘱i3<+ 27$;?F=r m)`7<]K.~%-@-~ # .awdiXJP2gRV,1v)a1칳5,e{ &^l\uhVHl'/2 kg7G^~IdVHҟKʕ`*7qkz,ԉQ "?%HȢmy +?H>YWQnx?>嗠%ܱiHk[2Е}H{>>w0(a R /Q?pE64;&bp\DjIN#}Lyt:̆.vT[z&#Y*;S~\O#@ao5i_PƌK9[v1W -\,(~$n CM#(vG>UibxcaZwnqQ;+Yj£̎ -Cl} -bٵ@nų8C97K@ ̶\ج,hV(j)]\ۙV -3#jAỐ\O ªM"I"_Yh¸M@*wH\FqiWU!( yU-zpVF8^@s^uUPU%~ Km/gB.ޱ[K+QV%CY' d00,XUu \9!&yHk-%9[单c5(P^؞t -}FW ~Ztˡ?{X h/p6ҫV2ZҎzym'$Lja 1NKVDdœ#fVYdB4z>BTZ+t"q Yk9$\}Uel*կ%R$+zW -XkܱE֣ܨyo -*^UM)JCMH…TxCC}7-A -TsHpIQWC+  P2T*70&e#vlZSAJ~@@QA(PۂfDZ: be䊺FWSEANB*AL]Z C.F֔(xd$(J)DcU[TAV%{\FnÙU)>.sSR}ԟ:^~``;t4T .^T -, ;S,.EqX -%s` -e@< ]ƣj_Qeшk!F85e kqEOYue,fDK΋٢^!7c {?;X-0P1pUs. c-QgY.7 -nmZЖfJ4RE|suP6cDaW'QEnIؐT@Up%.%ٜ0.r7ၭYUنRۓfǞDᶟjF ̄Ju$va-|u@ Z ZT"-%Y{刏&-1p{'v26j$kvBRP<xPjVm _/ץI(kϧ얥3CժYTlLp~b>B>WuQ|^JW)ժ -כdS.P0xBmM41~62m7`^gu] `mM{eJMb5yPhE9QyDZx&qR9xfai@v>~9R=bkھdZ3VRڂ,٦RDG9eT]u׷)Ϊ- \ @ iG?2E<#c֋gfήk -{2B9ʯƗHc(nWZa v]ڙgHV/?{pf GXt] -IJk_hfKN*=Իb?@aZ jцNqs>tDeڥe'* W/Ӄ)J? ]|CH[?yfh-ګ?n'TMVRMӟ'D ^עJ =_ e"\$Vbs$ċz@12y@ e0&¹N"1\J\9(,jUK.x'5i]캨v?Y߅7wyn@j(B¦W zژ0>U*!ȿ^](g?^_1SᴵT&bu_"8J?ZKCs}nw3 w;-B\JBT,X(HOF/b|R?qjf >m.)!6~~͵w*=O֭ĥ' -gjlɗ[`& q}|XE?5~IfMCU.0 &K1q?U=!DChj3Nz!L_ķW4*x{,cȱ ,0"ٶY 'D-Yq9<ܽ_Wٱyea+Xya ;OCE>@F"uKBCI03K\U} T_!Z^NGo?XCJٯ}gGI9+u_1FpFvoQNVO+{:ʉ7Q)=Jk<ܫ~P=T .pPB͞򱚶bS砳FM^ct'Eni.C̽=NKTa'`6T@/KGؠMcŸ%5RqFh#ÚQ62ҖгSl`SOǔϼ[~<`UZ?ZmtDEpĽ-aP#-9UH.KWBRT*i)#x_ugG0JёGh[ 6#qr.LIaUxFϪ3?g/ Eʖ/)b*WRcWDr}~c` jNԬAe5yon?ˉ9l/%mVyG픶Zlb}6eu{Sv{!`k-N.eف%iL -ejV]1~]ed3գ*Pښ/`bP8?ee%笠BW*6^Ŷ| ՌUً(V-.TD1p_RځyQW#2|+tjYfEBoC+jy62ʕCIgy9Ҙ fU~%e#~ɿ#ASΙW*⒪tIߺ!L"-)jDXJ. YR%FoS[1].T~7^Lаlv"TM}Cna{`״ :JܹE6jTk7e3S)"i3(/uեW(li V" q!]EDYf5/x3tz0BM/VXK2(a% J j4’VVv (Ʒ]V&HǒGTy3Gژ|_@ -a/^"mGWYB|ܖ\@طq^ưi{߇%Q b/͏I4ǐ+ 6WPƩ -Vv".BDFV |\"'"[ʸQȧv%A .Q/,ո/%&Mw~5nmN]RT?"Sa)*HTbJe  0 Mk}QMRʝyRPTo b -}D]a"cDA| X.%*]kbBpXy-FȠx%J|0ؼ(ܦ -ԳYL!HvQXls=Ţ rJ_joL<,瓑l#n 9 gV=.ʺYBX+%ș< #7b=Ĕ/R!lTe`B: `l\Cb- &1r44j+ܲvUmT7/X}Ŵ!rZAY߄='g%#[1qpҹTMmf^%Q2XPdlMkfD.)u /cY>eU?u`EJ7GglX5 tQ e\)1i(N{ d0.젩i1ͩ~!||]CK(Jv? *l]A -*݊[*iM0JJ!^ .S`;+² VF%,Z6 ە 6+9o4l{d@K6%VCQ IehZA (oOoD@s&'IW -b*<}‡6 KPke#lFvY, dہM =}5!7v).Zͫ).*㒭s̋.7-@ m*Qrꊋk?1J]ԣZ)F#rAh5rLegǓ|nS#KGkn -'cLRQRMb.b@u>ˍ2'GbDnh)cvõIU=x6ys(XY -mpli܋9RonPP+[᥷*ط˳ ]r7epw- ثR%aQJNAwrkUeK^J - (v_ʍF,Cd%"%[^!bϹpZK,IMv6=L1w%59)e F?Sĥ_I% ՞e<*c*j,.CN=%˖]Ki"-,av'a-9cNE󿩐pqLπN]V0Y.` mpA8qy)0?i8\3F L̩ܕ iy~bŋBuf SSY< -A.\I^.AH Ư"Lc.<7.-C㊽QW\P~ b]/nRTدRY-1E]rmƽFϱ sЀ*_ _ -6VZCe|~b.Ї"WYP2_#.??Ə btY_ӲĦQ[w7|@:?Čk<3e*&Tl=ϸJ"n';psnG7ݸ-Y;--SPįy[/6YUY3Q"*qi-؇D s"H!B)HV) ,UU-tj=@BxEct[y"@ln˙v<>'Mڈ!b7$U|EP -!VË1L8\i"FQ0^ -2-ܵ%bcZT7S܉7 v%Jd+MIrnm4>JfXHY.yakqlY*_emɨEШ% <7d]ܦm[T!+v=v KR1b.90>6{RRV LK:0%F1u2 D\ xa!wy)T;qɥI1*%l}-pv]`SE;`P*zYQ#EhS(latѕvzFW[CM TQ8uYG<XpZj+kbu~4OпO=pjyOawax-M$kߺ])#WHdQL7a?1%_7WG -2ڊaY U%=`$UaxY"e?bi@;% @AP`0p!1Q?_;~~P k\U9jh9^#<f>ִ&Z~ړ L!Ds|@V&,ݛ PBszvOz}Iޞm< 4f oCp{#*11up(Pf +5%lvB -(PaB -(P^*J^Çx8u8su=;:N/ ~.4 ߝf+&cb%bWy>sA+ΌL@&|&fCn=,_<\9% -JƮl ᐬi݈*ݞ5MzpwnnNS]9ϩk\@> 3:xWǞ/F -ϒ7noHu -+ĭ -֌T.N>tJb.4G~/TUR䇁d&d$'(y6$YffF FLb0cLLjE׍Fµ"A 0@P`p? _ u/Ʌhm/#"%_s-$I$I$I$,fgAG{/ܜ-OwV(H}R沅Z챕ᖻ,xl/eieV/7Fᲊzo|/7> νǏ" -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000010064 00000 n -0000445565 00000 n -0000445696 00000 n -0000445894 00000 n -trailer -<> -startxref -446031 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/be9354cd-7844-4008-84a6-ecc22f742110.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/be9354cd-7844-4008-84a6-ecc22f742110.pdf deleted file mode 100644 index 3ac31e0..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/be9354cd-7844-4008-84a6-ecc22f742110.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/bf0e860d-cf20-438d-ad27-68a5ac18cbef.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/bf0e860d-cf20-438d-ad27-68a5ac18cbef.pdf deleted file mode 100644 index f24ab0d..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/bf0e860d-cf20-438d-ad27-68a5ac18cbef.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/bfbef089-488b-4724-b1d8-480c547045c9.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/bfbef089-488b-4724-b1d8-480c547045c9.pdf deleted file mode 100644 index 0bd8e82..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/bfbef089-488b-4724-b1d8-480c547045c9.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c38605a8-66b8-4d78-baa0-6f1cb6b8e533.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c38605a8-66b8-4d78-baa0-6f1cb6b8e533.pdf deleted file mode 100644 index 45e27cf..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c38605a8-66b8-4d78-baa0-6f1cb6b8e533.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c57e6149-4a10-4507-8eef-4639fcc20b17.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c57e6149-4a10-4507-8eef-4639fcc20b17.pdf deleted file mode 100644 index eaf45b2..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c57e6149-4a10-4507-8eef-4639fcc20b17.pdf +++ /dev/null @@ -1,2292 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 0.0000 -792.0000 272.3976 0.0000 0.0000 792.0000 cm /Im0 Do Q q 0.1968 0.0000 0.0000 0.1968 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -51.6498 0 0 62.5 102.04 3416 Tm -(S:3/946 ) Tj -51.4479 0 0 68.7501 394.69 3783 Tm -(JD. ) Tj -31.8504 0 0 68.7501 493.66 3783 Tm -(CONSTANTA, ) Tj -27.5589 0 0 68.7501 711.87 3783 Tm -(MUN. ) Tj -33.0138 0 0 68.7501 810.65 3783 Tm -(CINSTANTA ) Tj -32.9481 0 0 61.25 495.39 3717 Tm -(STR. ) Tj -30.1366 0 0 61.25 597.78 3717 Tm -(ION ) Tj -29.0936 0 0 61.25 671.86 3717 Tm -(ROATA ) Tj -27.4226 0 0 61.25 791.11 3717 Tm -(NR. ) Tj -0 Tc -61.25 0 0 61.25 872.26 3717 Tm -(3 ) Tj --0.035 Tc -34.4765 0 0 75 336.83 3643 Tm -(BINE ) Tj -36.4966 0 0 75 446.92 3643 Tm -(ATI ) Tj -39.293 0 0 75 517.9 3643 Tm -(VENIT ) Tj -51.7261 0 0 75 635.62 3643 Tm -(IN ) Tj -32.9459 0 0 75 691.84 3643 Tm -(MAGAZINIL ) Tj -34.5853 0 0 75 890.83 3643 Tm -(BRICK ) Tj -0 Tc -75 0 0 75 1012.5 3643 Tm -(! ) Tj --0.035 Tc -39.287 0 0 76.2501 537.58 3566 Tm -(CIF: ) Tj -34.3531 0 0 76.2501 636.83 3566 Tm -(RO105C ) Tj -40.1204 0 0 76.2501 776.43 3566 Tm -(500 ) Tj -35.3476 0 0 58.75 514.83 3852 Tm -(FIVE-HOLDING ) Tj -39.0613 0 0 58.75 773.27 3852 Tm -(S.A. ) Tj -43.6198 0 0 63.75 65.68 3355 Tm -(IFRTIR:FCRIAN ) Tj -31.8791 0 0 63.75 378.92 3355 Tm -(VALENTIN ) Tj -28.7849 0 0 63.75 575.96 3355 Tm -(UNGUREANU ) Tj -45.9871 0 0 73.7501 67.77 3139 Tm -(RENT ) Tj -44.6869 0 0 73.7501 203.52 3139 Tm -(C.U.1L/ ) Tj -42.5802 0 0 73.7501 377.54 3139 Tm -(C.I.F.:RO187985 ) Tj -52.3975 0 0 81.2501 82.02 2991 Tm -(SCI ) Tj -38.0489 0 0 81.2501 181.77 2991 Tm -(ENA ) Tj -33.9928 0 0 81.2501 293.8 2991 Tm -(EKTRA ) Tj -37.9217 0 0 81.2501 401.54 2991 Tm -(35L ) Tj -37.8232 0 0 81.2501 480.46 2991 Tm -(506UC/SET ) Tj -39.345 0 0 81.2501 675.5 2991 Tm -(60 ) Tj -50.042 0 0 63.75 69.63 2927 Tm -(IF ) Tj -41.6405 0 0 63.75 128.55 2927 Tm -(022100121038102 ) Tj -41.6158 0 0 63.75 441.47 2927 Tm -(6422768920146 ) Tj -55.8447 0 0 72.5001 75.96 2855 Tm -(SCI ) Tj -25.3004 0 0 72.5001 184.9 2855 Tm -(WENA ) Tj -33.0485 0 0 72.5001 295.8 2855 Tm -(EXTRA ) Tj -38.587 0 0 72.5001 402.54 2855 Tm -(35L ) Tj -36.0959 0 0 72.5001 481.49 2855 Tm -(50BUC/SET ) Tj -39.345 0 0 72.5001 676.5 2855 Tm -(60 ) Tj -0 Tc -62.5 0 0 62.5 70.62 2787 Tm -(E ) Tj --0.035 Tc -41.7836 0 0 62.5 130.55 2787 Tm -(022100021033102 ) Tj -41.6158 0 0 62.5 442.47 2787 Tm -(6422768320146 ) Tj -61.8461 0 0 63.75 73.62 2716 Tm -(E" ) Tj -37.9 0 0 63.75 155.77 2716 Tm -(ESELA ) Tj -52.879 0 0 63.75 287.25 2716 Tm -(5. ) Tj -30.0507 0 0 63.75 352.78 2716 Tm -(INTERMAR ) Tj -39.0208 0 0 63.75 522.94 2716 Tm -(UZ83829791160 ) Tj -49.434 0 0 60 75.3 2652 Tm -(501 ) Tj -37.0445 0 0 60 155.55 2652 Tm -(33-1026660 ) Tj -34.1789 0 0 62.5 76.83 2578 Tm -(PAICOP ) Tj -32.5007 0 0 62.5 212.84 2578 Tm -(HARTIE ) Tj -29.6798 0 0 62.5 348.85 2578 Tm -(ROLLOX ) Tj -42.6911 0 0 62.5 484.5 2578 Tm -(100 ) Tj -0 Tc -62.5 0 0 62.5 562.69 2578 Tm -(M ) Tj --0.035 Tc -30.4536 0 0 62.5 601.67 2578 Tm -(CELULO ) Tj -53.0458 0 0 60 78.8 2510 Tm -(W93415 ) Tj -40.6337 0 0 60 272.76 2510 Tm -(E944568000289 ) Tj -34.7343 0 0 62.5 80.83 2440 Tm -(HFRTIE ) Tj -33.434 0 0 62.5 219.7 2440 Tm -(TGIENICA ) Tj -29.8144 0 0 62.5 389.86 2440 Tm -(PARFUMATA ) Tj -0 Tc -62.5 0 0 62.5 583.25 2440 Tm -(3 ) Tj --0.035 Tc -32.4177 0 0 62.5 621.4 2440 Tm -(STR ) Tj -0 Tc -62.5 0 0 62.5 698.69 2440 Tm -(M ) Tj --0.035 Tc -49.3321 0 0 60 81.93 2373 Tm -(U904619 ) Tj -48.7767 0 0 60 275.38 2373 Tm -(62276806594 ) Tj -41.2209 0 0 60 83.79 2304 Tm -(HRTIE ) Tj -36.0569 0 0 60 222.74 2304 Tm -(IG. ) Tj -30.6377 0 0 60 295.85 2304 Tm -(PRRFUNATA ) Tj -0 Tc -60 0 0 60 489.28 2304 Tm -(3 ) Tj --0.035 Tc -38.6087 0 0 60 527.28 2304 Tm -(SIR ) Tj -37.7141 0 0 60 604.82 2304 Tm -(PIERSI ) Tj -50.0912 0 0 58.75 84.75 2236 Tm -(R034620 ) Tj -43.0825 0 0 58.75 278.45 2236 Tm -(622768C66907 ) Tj -40.6456 0 0 75 86.84 2162 Tm -(WRUE ) Tj -38.2657 0 0 75 233.72 2162 Tm -(IGIENICA ) Tj -31.2628 0 0 75 404.85 2162 Tm -(PERFUMATA ) Tj -0 Tc -75 0 0 75 604.09 2162 Tm -(3 ) Tj --0.035 Tc -31.8388 0 0 75 624.41 2162 Tm -(STR ) Tj -0 Tc -75 0 0 75 700.83 2162 Tm -(A ) Tj --0.035 Tc -55.518 0 0 58.75 88.35 2102 Tm -(90I4318 ) Tj -38.8769 0 0 58.75 281.5 2102 Tm -(6-422768065987 ) Tj -34.1303 0 0 61.25 90.83 2035 Tm -(HFRTIE ) Tj -35.6349 0 0 61.25 228.74 2035 Tm -(IGIENICA ) Tj -29.8107 0 0 61.25 397.86 2035 Tm -(PARFUNATA ) Tj -0 Tc -61.25 0 0 61.25 587.26 2035 Tm -(3 ) Tj --0.035 Tc -31.8388 0 0 61.25 625.41 2035 Tm -(STR ) Tj -0 Tc -61.25 0 0 61.25 701.86 2035 Tm -(A ) Tj --0.035 Tc -34.8856 0 0 60 91.8 1974 Tm -(LER0D4318 ) Tj -41.0978 0 0 60 282.48 1974 Tm -(6-22768065987 ) Tj -34.7873 0 0 57.5 93.35 1907 Tm -(SLBTDTL ) Tj -47.157 0 0 70 67.58 1365 Tm -(TCE. ) Tj -33.0361 0 0 70 194.7 1365 Tm -(TUA ) Tj -53.2445 0 0 70 261.88 1365 Tm -(A-) Tj -33.696 0 0 70 338.82 1365 Tm -(19% ) Tj -0.0369 Tc -60 0 0 60 68.46 1299 Tm -(TC. ) Tj --0.035 Tc -27.9536 0 0 60 186.75 1299 Tm -(TVA ) Tj -26.2584 0 0 60 261.87 1299 Tm -(BON ) Tj -38.5607 0 0 76.2501 149.81 1226 Tm -(P02. ) Tj -46.7772 0 0 76.2501 243.77 1226 Tm -(RT. ) Tj -35.8104 0 0 76.2501 352.74 1226 Tm -(IN ) Tj -33.6224 0 0 76.2501 402.84 1226 Tm -(BON: ) Tj -0.05 Tc -68.9394 0 0 62.5 106.56 627 Tm -(247 ) Tj --0.035 Tc -43.7946 0 0 62.5 237.79 627 Tm -(BF:C99 ) Tj -51.204 0 0 60 108.04 420 Tm -(S:84700011006 ) Tj -47.6263 0 0 61.25 109.77 356 Tm -(PSER ) Tj -40.2626 0 0 61.25 240.59 356 Tm -(1: ) Tj -34.3271 0 0 55 560.63 836 Tm -(C3POS-CT3N8G7043 ) Tj -0 Tc -73.7501 0 0 73.7501 945.41 2937 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 73.7501 967.86 2937 Tm -(BUC ) Tj -0 Tc -73.7501 0 0 73.7501 1053.84 2937 Tm -(X ) Tj --0.035 Tc -47.1501 0 0 73.7501 1096.33 2937 Tm -(5.53-) Tj -45.3278 0 0 73.7501 1203.35 2937 Tm -(5.E1 ) Tj -0 Tc -70 0 0 70 947.54 2798 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 70 966.86 2798 Tm -(BUC ) Tj -0 Tc -70 0 0 70 1044.85 2798 Tm -(X ) Tj --0.035 Tc -42.2151 0 0 70 1092.4 2798 Tm -(5.53 ) Tj -47.1816 0 0 70 1201.33 2798 Tm -(5,61 ) Tj -0 Tc -70 0 0 70 1305.84 2798 Tm -(A ) Tj --0.035 Tc -25.763 0 0 61.25 621.88 292 Tm -(BON ) Tj -30.0071 0 0 61.25 696.86 292 Tm -(FISCAL. ) Tj -0 Tc -73.7501 0 0 73.7501 547.83 224 Tm -(A ) Tj --0.035 Tc -39.862 0 0 73.7501 615.75 224 Tm -(2000221497 ) Tj -0 Tc -70 0 0 70 908.54 2658 Tm -(1 ) Tj --0.035 Tc -25.6592 0 0 70 926.88 2658 Tm -(BUIC ) Tj -0 Tc -70 0 0 70 1006.85 2658 Tm -(X ) Tj --0.035 Tc -36.9837 0 0 70 1048.7 2658 Tm -(19. ) Tj -36.0939 0 0 70 1105.6 2658 Tm -(79= ) Tj -45.1196 0 0 70 1179.42 2658 Tm -(15.7 ) Tj -0 Tc -70 0 0 70 1299.84 2658 Tm -(A ) Tj -70 0 0 70 901.54 2519 Tm -(1 ) Tj --0.035 Tc -30.8042 0 0 70 926.85 2519 Tm -(BLC ) Tj -0 Tc -70 0 0 70 1005.85 2519 Tm -(X ) Tj --0.035 Tc -49.6123 0 0 70 1041.26 2519 Tm -(12. ) Tj -44.792 0 0 70 1111.19 2519 Tm -(82-) Tj -47.9412 0 0 70 1178.32 2519 Tm -(12.E! ) Tj -0 Tc -70 0 0 70 1296.84 2519 Tm -(A ) Tj -68.7501 0 0 68.7501 899.59 2380 Tm -(1 ) Tj --0.035 Tc -34.1021 0 0 68.7501 925.37 2380 Tm -(SET ) Tj -0 Tc -68.7501 0 0 68.7501 1004.85 2380 Tm -(X ) Tj --0.035 Tc -43.6376 0 0 68.7501 1041.47 2380 Tm -(13.82= ) Tj -44.2149 0 0 68.7501 1177.45 2380 Tm -(13.&! ) Tj -0 Tc -68.7501 0 0 68.7501 1295.84 2380 Tm -(A ) Tj -71.2501 0 0 71.2501 907.5 2245 Tm -(1 ) Tj --0.035 Tc -33.5038 0 0 71.2501 925.38 2245 Tm -(SET ) Tj -0 Tc -71.2501 0 0 71.2501 1003.85 2245 Tm -(X ) Tj --0.035 Tc -43.6376 0 0 71.2501 1040.47 2245 Tm -(13.82= ) Tj -47.4365 0 0 71.2501 1176.34 2245 Tm -(13.E! ) Tj -0 Tc -71.2501 0 0 71.2501 1293.16 2245 Tm -(9 ) Tj -67.5001 0 0 67.5001 909.63 2109 Tm -(1 ) Tj --0.035 Tc -31.709 0 0 67.5001 925.41 2109 Tm -(SET ) Tj -0 Tc -67.5001 0 0 67.5001 1003.86 2109 Tm -(X ) Tj --0.035 Tc -34.2776 0 0 67.5001 1043.8 2109 Tm -(13. ) Tj -33.6101 0 0 67.5001 1108.39 2109 Tm -(82= ) Tj -42.5776 0 0 67.5001 1179.51 2109 Tm -(13.8 ) Tj -0 Tc -67.5001 0 0 67.5001 1293.85 2109 Tm -(A ) Tj -71.2501 0 0 71.2501 908.5 1969 Tm -(1 ) Tj --0.035 Tc -33.5038 0 0 71.2501 926.38 1969 Tm -(SET ) Tj -0 Tc -71.2501 0 0 71.2501 1004.85 1969 Tm -(X ) Tj --0.035 Tc -47.933 0 0 71.2501 1039.32 1969 Tm -(13.82-) Tj -43.7495 0 0 71.2501 1174.47 1969 Tm -(13.&! ) Tj -0 Tc -71.2501 0 0 71.2501 1292.84 1969 Tm -(A ) Tj --0.035 Tc -29.6916 0 0 68.7501 428.85 497 Tm -(DATA: ) Tj -43.6551 0 0 68.7501 541.53 497 Tm -(08-10-2024 ) Tj -30.9769 0 0 68.7501 750.68 497 Tm -(ORA: ) Tj -46.0218 0 0 68.7501 845.39 497 Tm -(19:30:12 ) Tj -46.1102 0 0 60 1236.38 1364 Tm -(16.33 ) Tj -50.0779 0 0 67.5001 713.68 563 Tm -(20021.4972241031930122<7CS ) Tj -46.6007 0 0 61.25 1232.37 1296 Tm -(16.30 ) Tj -29.9735 0 0 63.75 1092.12 633 Tm -(NR. ) Tj -35.4334 0 0 63.75 1149.92 633 Tm -(AIEF:CU31 ) Tj -28.9665 0 0 57.5 378.93 163 Tm -(VR ) Tj -29.2695 0 0 57.5 435.85 163 Tm -(RJGAM ) Tj -30.6177 0 0 57.5 548.43 163 Tm -(SA ) Tj -32.1177 0 0 57.5 605.85 163 Tm -(PASTRATI ) Tj -29.2071 0 0 57.5 776.86 163 Tm -(BONUI. ) Tj -34.1449 0 0 57.5 891.84 163 Tm -(FISCAL ) Tj -0 Tc -57.5 0 0 57.5 1027.58 163 Tm -(I ) Tj --0.035 Tc -28.2213 0 0 51.25 325.93 107 Tm -(VOCEA ) Tj -35.199 0 0 51.25 437.62 107 Tm -(CLIENTULU|: ) Tj -40.1985 0 0 51.25 663.57 107 Tm -(08008 ) Tj -33.8291 0 0 51.25 777.84 107 Tm -(BRICK: ) Tj -40.0996 0 0 51.25 910.57 107 Tm -(0300827425 ) Tj -35.7981 0 0 46.25 347.68 56 Tm -(TIPARIT ) Tj -35.4936 0 0 46.25 496.82 56 Tm -(DIN ) Tj -30.74 0 0 46.25 573.67 56 Tm -(COGITO ) Tj -31.4439 0 0 46.25 703.81 56 Tm -(ERP ) Tj -32.0492 0 0 46.25 778.88 56 Tm -(WW. ) Tj -33.6304 0 0 46.25 854.64 56 Tm -(COGITO-ERP.RO ) Tj -41.0396 0 0 60 1115.63 425 Tm -(TD:005771:0 ) Tj -32.5285 0 0 60 1173.65 362 Tm -(CASIEK ) Tj -0 Tc -60 0 0 60 1309.9 362 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF"ExifII*  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqwh"1 _ꪏG_~~y_mg+/`G ;9>dw{Wŝ8q벜-]M+Ty^.XaP[mf]OΟG7_+&enҍ?3ߨh~vbC ?F~4oʿU_f~V~5kc?b9ehQq~~,lVj*[3qHOŘkcYgb~gBOƋaL+슗>D~*?d,^C?Tk/Ɵґg ->>';oƼ|23u!9q3:Vo)$A|&4c~S>ߙq(\(!Q -$.>*AF9C&ITWȅhBR6yr{OK>O_~Pq!{."#ُߓɸ>_.ߣ?Kt|? Fꞣ%ߖo4x6-h5ѓ_ki_pg?Azh?U}#??YnW+L'.cץܤYD34m]f7flHGɓ8c(kgӏFl"> ->O诔>1|}GArBijV&kmGl}YjNht../!Pp3K_Ϳ7ciYyy~S!N':7/5|L ,b ZI}{s}U̎G*]{넟rR?;rYCg(~kY~ɇ_G2?Kg>mʣ$ƫT'L^~~ɫk\~ğ')?# ~H?Zc?'itE 1+#%gnN4u|1˞S۳G4XL&8@a-1T UMYW4X.,iU#K[D %, X -e-UJ,DTP$JQhh1TC%M6,.&_6,3-TnDiHfG7JQ-P1IL93比3}5_U|r}?-3O*\`r>L^|X}4yk7QDѪF.mtisNwiEQh]s7JG29^/8vH:vq]Xðwo,ğg~k?_?/وo_ I nRWgseu,G~“2l`徦U}Fh0ɚ1sJlrIsexĘ"ǒ `f( -` "M$C ZH@h4T (*IxDgɤ#H1`iV,iq43r3]qo7.{8/yoZyUjv'eO2Oٞ1!IP")ieڤi0VIr+Y"LUR&ИɌcQ GfƲf¤g)pBiqDcأ -0]=QQ.1 V"JB"@TɎb )RЂ ECn\ eu, +$SAdBj\1I&9`QV :LЇ#`RƘb.|WɝS‘R!i,+K`\bT44) lL@Մ $TiԴ X4ʖKQ Y3& &HBR Ub &!@ -"E.6%a#V4NMfϋ͋6*I3p$ 44 @@@&  rCCMȎXS#jHŠJT#aI -cR9HIGV5 "P*%p '@ H NQ0t>LYJV*˩Nьh MSPJMHqKR@ P d(8!RI$.1"icZJe8SIqu̔fDK`d0 Y1dL+QRڠa$%M&1c"U (jM'RE*@1TUC8Sr)!l1D0BPPLDP hq,c͆>|y#jЯ+]ufkzC,cuf;FW*%ȍiILL26PX-$R@ MEti( TY 7n,N@J&65," *\, L0sVCE@VܲiN*'zqeA"MB@M2%hC - &XQr3#O=^DY2L̾R}P!DXTy^v%qlzy~ۮե@>}.>k?._oVI<;HKd~NubZƪQEL*)`kI.eHIL4 R!1sQ> gud ׆˓u#)!N(@!#X1ؼ v1D cq'󯦼)6zK-<,x1,v)P@ 0ʑBM\n HHXA5,&e&1RT %hbJ-ʄb V i"U* H9)&0r|ʑ܂h`Y-X4nhcKB -%C@ C3SM!Ei\LdǏ.LJ>,XLbp}46ˑ8%  *Xrk+뚧|^lKBhCM*k=l~>Ο"4ETXȪxm_66}9=g0mRMƲ}qm'y޷ی˥ƲJ ϱ\4?qgP@* lMc=p~̙AiK)Dͳaeב Xpl~y&t~~锫>qrF;1K`=~_NlLv_>Mj R'#M,:>G=1xfRi>kV{`|l_֍1jKDVb =SX:6+,b'I#nޜԬ>S˗>-$H&RIκˑʘ45 7ƼܙRbvԓBEH Y)IM@S() fY&()(N"n"Fr\2q 9 hjdI`S9)0C1`TEzi&J&g"he-4 .F"ІB` Rrb`~i -N<| 1S0v nYiHVQ6*\fU#$XQ+(1/J?Ͽ_ߘ%C*rƀl~YGi&BӶǃd0PE4L`x5|R*>~G޿HTپi|c{>sm>ϣͼ_T4!|Ɉsh DMHd搁CJT"@CT& @9@д6|9rֲ%cmTyd=4y1.'_hǓbH(Q97Hיi*tPcK(Rdb BD% MI1))5KI8cA)1(&:1S]rTdh11 &IN@%hT@10iHXrX)Hb(L&UC@ CiB,`}%R۟<ymؐE'Hh*uމMϦHCHMB4&j*# 1Z]j}ǒZ -1x0Fk?,P$Q*)~\nI/TBbb;˅A*JFM)PRqh ohɟqY3Yf5rj&xMcl\aXKy#hC 9!ER.Bh&i$ʴHJ\%k[\B$5MV%88L$hi(bX"dBj% re C) hH 1J"˨kg3\cr^;RPHk5mm.-_|)e>'+(JF  K_?N!g~m>tJ~63+jJD!H5D&)I\TBE3q -*5(b!d -Rbcm I) j@ċ@1&@cQ"TJՌiG,Q &Ph6~?MBE 57JE|Z;?:9Z;4}Bu-ܲ1 }Z\@K JKP 5* -%$'(0*M@ h`U>̀JWtS |W][\i['ݭٳf#{oGծQ^DB1 Lv\Ʈ⹾^m^\gO<~ͮC!&* E"fSH9i!5,iKPb#\i#hq5#&ʁ6 ,X -",C -@D CCC& -@F lEheTa9 AR%`6=]E[&nX4 g9E(j\8aqMMKZӏ~EֺS4(VRN٤'u_}yɰm&h!x:8uz`"Q,lxu}-/ӃF'L~IA:>_B̟Ozջb9F'* Kݸ)S }KEH -+>Ckg//Rxީ/J! 0dxhgy3sE.A]O9Y uTrs_o}sX>Pf2E,ctueluBϛϝ& $Kb_=~HT6P 3(aYrv,\p:nA'díjeî.ظuɨX9?J> 9! ͘E#4Բ9Q4 -hrE\ -ABHrЀNF K^Ly+0}S Q$կ]&|]6Tڃ^f{*g]qIkzܺqr" 4!nnok{fy~}G޷'L7u#o.sރ`"h !h۾K[WZDpVeC$ 5t>>zK"G`~Y>5,B@䑄]0 Fa1I52i& 85+B "&6h,͇=͉ܼuw5jѰi2h{ֶG*6ߧ5=&8LhM,Og;ߜϏOFfn> z7~Їh5D5R#H@ ZBN`9r\D˘1&jLi̸KZ{ZԠ bLJT#H&1dtIR2@sV9E'HL `Al핰@&Th-ESp J3lc͋d%yY=φ/m7|_oL7?=,YpTrzus0<Y}ЛY)HB$h)@hrԠ%J -Cn0R*jT@ Rh@Zrh!@ې@T4JTB@H,h`U"MJ(@n%}9c5JBMj~3r-~daĶug, q:BpnsCfC 6<P~p驼שu6p=ԷSzp/`==lJȂh&~w/X| $H`@dJiP BHJK BE$H P`4 -rcl2A,hI1!M2QBoGnu`;0hh -J#?C\#s> DZ,=a'%6/@"BI|7q 4D~̑,MlF|_IuM2eM@4 TjF$.eLd$i d3ILYMJЁ|"%9LYL iA$Q(Lsrr -j@*J  -H11Q#J bhC2eÜϖ2.w%dkkmOoɚ[|O_J=O޳yOHO"k|k{l!l~-؆n%\ [sqiCP}gF7;gV_iIi-EL(L\.13IA1r($&PIDb -d/Yjl 4Aq(bP B$ J&H(mQ3DlIF}{B!0,` *Xɜ7,nA  -RE - _'|DUM*JdT0Lf<9K3b"ܯ5}H{ȷtL@bcA&Do_ﳛ-T$P M?*\4 Cįon -M%TˊF*h, &VlYyLҷ>Ksذe¢i@&*0B%,B4hHmK!!#r@}- @\-BqJIRR@S`C+TmZA)jHr  HЛr49(@BbV X9詭fheUe1dkd+tOٌ>fvƞF xM~`Bi#!0'K| }RІ4J% HBM@%H䙹̔y1Ó%R!99"/"51SLSS)RƀsR&9ȥ͔ڱA9 C!0 - 9ƜiRj KU!M0AR2@JBZ&nUБ&iV1S##8qY͌y4nV7=쩯%XaaduOGmVW}~*f{Sz=}񾚾-M\wϻ'JA\?)2YrTtwctsDE\9횎G:dNJ3T|k=_ Ϫ[k!J C<-mFWm>e2)0ͨU͟ --B% @B1*ѴWaDLDĜۧHi -h4YM%#BRXJ"4?ZJiX$D$flDi0MNV V*\7YmV62rSm_6121ԟ__!r1!PxGAyKyݰ U.QM T@C ͈R)ԡ$'1)UcU" c]m b!"e1Ҡ@0B`WU"bT)1BMhlM1 d7#vTX!HR&%m L`4%E ͒ ;(!)\˃l1k-ZG2f͵:Tf24J[  3)Շ_}PRTJdKI> z a%R&/:tM{vd7cPPT&n-yעxwo'}fhےtD:@啓uNk[.~١nZ -$HA[:oc몑\cMĎW\×WFO~O{6c>Ȝڱ4꾏g;V6٩jhL%4 `C%5 Q6J9!*U I̠R!U2BhB`*b -XjIle.%PIXM)eD}I]g\~|w;:;q{>˨駓⡈ `ۛChbSTӪvST6k?a}+o[LyWYvM -CA#ygC|dbc@j,c{Wptߛ%Hp#@(@DfI Ma2R MLԓ.W qj#Lkךz4 *Dh -nH(`HJrЀY,͢X2LiZX& )˦ycY]0`4 dPU"1rJ`D)[@6!stIS4GEɆC1*ɆYR7B+Mܨhvc&6d(\CLt45qj_5^9ձP -@ص-HϨzBhbEC *H'8/ -/D@$/?>t5 um)PˊԖA~|OνjR?4z$24F3wm+TԴQF H!cxh>o]-D3cSY߇ssދ9qTTKCP hJ!X!IbF8Zr#*P$>_)|Iir1!Rjҡn"n($h1H#ll./FLY xB.nqr-T|][iWϛ3vܙa}NzZ->8<,Xw;M7HtOcY!@܃Nę h&F'H*%9r0XBT%R%2WbG"g'$Êbɉq} R` -"*@ 0SS @d@E0 -AB\C 6ܴbb -iT9IJi@6%S L{2M!) cşie7/睛_FCf/  -ne9OivtҹfĄ`0r#m5P_ړP U$N,u}V}INX優q0&W3eyiUȒ.tLbwϹz(Y, blvTWчYc )}9IZO\L ҤFN  I@.$CB2A*h qRI"H`@JQ+$9h@,%<߃Ia,R*~v9T{3|r3_G='r~;xٽFbVS*2}7ѬXⴶW F@ﭖrwa*g={їO2j4P0K '% !@ RJw0 I&X@vS_WjrL39è};' f(b h@ J@HI*4 hRM h -Q% CT0E!*`! B!kKH14S*B -Kh Rc@0""{eHIr d?u^L@3=v:X&Jy_`joוqq63G^O S&r$M \F'Yl>K=e0} p}-9Z4s_UꡊZܱ;?om6߾86;C*k0nޤ7/EF6ACW6=bMݸڱ:5 QdFoCOujJ  KR&2MH!%H 1*IԴr<&Uz"ƮAł eZ&HA5))!Br -s -1NrJ^r`(cW]AzB^oAt#~>liiE_%g#dwR,4'sJ`#$ -ok9(v<Ǫ&r%E/r{m6&K6 2S'>9qpnW`yv&Eg -ܒ &Z!-hI0*) -XBb A !¡C|s9L} & 0 U*r*" ę$&$r_" -diR gddcq|u|ڐN][OX2?~#=HWvb4RY}?6{2vej47)  M汾rCr4uڼ?hQEE6(4`&Rh$)lpbB"jc$Gӓjy xk |Cq''wVdH!ˌC Rh&" *D& R2Jbh J % @(J4445\&PBD9-c1"R25n,%-0kOLC[RFHE@DQ#bUcEFW50× "ؚԯ& ˌtBj*@<԰W}2m "tPD Kz7(7#r-(HL(M DИ#+?;jߦ0.A4 -&|P>3Å `HДR6`GYTb(*AK>A+w" -ZY7Y'WQ:hO˟oJCyCJH 0$r4r'4U - -4$%g$ |K~OlBT%QP9b` sBjUm.d|B )aTBK}_-#/Z3h\M꥛CMXjzqwъ&H2(͋"}9U*ZUM[~?㦝 QchC@0CZ>_6!@$lHb7RE*M(Bi# W9#)̲ts?Ow>.ooXG5 5m_3=CO5wYdi"op!(P,r, 1!+\ )1YBPh* `y~DHB16HS! -5LVN]!Wٚ%8)l3YTԱ!T"f*Qe[w]M;WՎ`*4d\|tM:Va~fXˤؚviu,ϛhޭd2i9NG?Dqz_;g`M(״v~gKM *JYm(ذW3пCu-x~.G-$Ey[z\>HѺ>히a2DR\?i;7) &Ls7R%PH%iNA0I` 4 r,ĜrȇJ -&0_ܓ@B.4* -$r, (`4"fISh1,`bXHgZ^z?Wa~@OOgOԫؿa}{|?v$%J1Ŗs\Y6\^0# X(6Q{8xP4 h(@4#@`@ jE4ȌN!"F5&QRP#ꏛU:)˶~_SIӷ d-œ( ` 2@ 4؅BB&#3t5Ϝ{frRb©F)ZԻI}K>uV'e5SH \p -O ۦPJMHc -,جMUBR@4 Ldc?$h -CCW(b@,b#"ݖ1vq{=MfZU3LLU Zt5xW~rDY46HA##}$?k )+% K@ ψ"T*R+$҉1@ h!,X9F9J((T$ca-m&L~|bBX4$Hb&r1e jdBMIc *F QHLG0THK$CD +.rIPƵ=#УDx&ioFz;7Z27|$g/%}Y4 *"H}pe2\Tu4nI7F*4crnM_thg-6Oc7ܱX&0@9&rArɆrcʘHR<.oq΃kZo즣mW_"Kg7=^27dwlbq5j&%K9`KdR\L -(@=??߇ -/GҶ4C+I%!?cO]G\?nf֓*DPЗ{&PA0L -n;*mauJ Cr@ćmZWA""BpMIY弹/".)y=7peA1ܕ5z_5RJd J\^ýu8vd&:hI5Ӷ.M:޽ApXZrM͔E`*JH ^l>\WqeyK65䠩`@KF]^tUqI7싶}~'oq{&m|KE ! a-U.HW6$R%)CJcv_4s?ߓPټk<>vu}3"1I%_aISH1L ~5Wql}9WRQr4Xjj{v aԾ$C]`~/g&(dQRC U7 &jF-ŗVKX%b h' qJDSe@OΩ㬨x=UCG"ЀT1dfl+T[@UcakȾ]/'2:FiD /9׻>SMg}" 5 审|MW9t y{HmЁSDS~ -:U@4Yg9:fޓ=_m+#D M>Np(tIHdŗX**BQ,@$FjTr&ҀJ Q) -jFTLcl)4'")&1ʵ4RCAY3s::r(3SS^rV-WYAGZ/cwXs AAH`+>L9YwZǒn2ԱJ$(#u&ӗB:vhV@5݃>3-؏ eDDĩ"%qrNͫ]=:q`Ki41& U}Bq)Xφ&@`~*y>۫Vu ZF~Ii-?7ձW4ߎM9btdܮ&)7!$dMQs,MĜCM^y]{}aQ5`LdWa5Gf4^첝 <>jʠD0TnY?r͌B&JJ#4 XY&$hYr|, 9bʩ$ NZ=ꚐhE+.>ȱ?Q_~v @0 >3ꯈ2add *A'Vpﷴ rqo0LRX"3pyFO"L]yYщdd2d&eJ&F{^ΚRP離jߥh]7*~y IȜ ˌ݂tQ>1c~.%3/lj\˾ ,L0agwm:PLCbjU $@!ʀ,+I%i@*d@_Q @ r) -%PHE&3I *NaB@yOӀN!"J&2&6Ζ{~NWqôX;9O~n7vuf5a9ҾT_>]C6_orlOV[vhc15+vPZ ")EJ\x >;Ͼ/{ -ex@Ŕw7P^s$2cfo'ιm Z8K_eMTR;1h R!Zh*iЕˑ+%MyODH@$Pb&p4+5mA42⸂|8(rT ;X#) RDdU -&1ԄDde͐2%RB\ Km fG5+rZEĒ2,*5iTRU4PS\NѹbQ&0M -B'#l`1R -Iɬor5 ! M%ILfJ%JfabU(B%}eoHI0Jb$%4) JS!V0<6ᬉiRXb<K[O!T6zYfҵMN p= v^c5k/i˓bW"$u4^|?EfPYn-*[W%Wjհܰ`(@Ba}YO7otCwˎvH9>Ӡt* C -rdRHTC@*Jcœ,w+2ǟDokf:n+5M$g+Gw]rۏ|׶YS] 1)F0Z1$r@T̿[Ok$ѾkgaT=r'I>-;qӊ^^=/W}F"Źϓ1) -qG6ľ E7--)Zh@ -)!J.Bg6ǹȬn7 UR22(ZnS QgSRh4UjJd:B ,Jh¾n֥vfpݟc+T!s q}kt9h'|jm}=䠐LbPjFk8eS8jgu]Xhl} -#D4rIU2߯s*JS>W L@3&lVFrUd X\IHSH@qSjDH"(Ih4R(B}]o|D&4`@HCŢjhCBD4q>>fAM@C~x ߶>anj2 d% oʽK~ˣeÛh@/>GZ[Uqw]U㤯?uzM恀 LH4=uQҎqM7)GgqM7cz:,2hB 1-2bчp97#]o>OKm_+}sAmDHwvyqymM=&E,"䁍v,HI%-hD#%_}M}ۤ>QC8OzZgE4Wi}G$&:H)peAPEJJr (I DcI9r`ɏ-֠*@p堩eÕC!4܇S4fbbF4:Tu/KH9EI+OH%&# Hi*jP i Y%Y%4$ -QrihD4 -)"' $M B0MIDYh-$K2hHL >F, cP @$H4QH"JaTMP9jQ@JAH@J9Ҁr1@&!0I `LG˙e@HCG_x~xJV/ח2{5vEJoL)dףa>lJ/%rQFO}LYrKǒV umn5}:0cBim'ʷ>.s/ANZw~.mM/YiI J,NqCMl0MBRe4dI&i'ɏ.Dfbǒg&+W4} Kk:4&l}vr`TT1I/So/]B԰I0Lg<˷4&2efbDd 4.]BA(8*Zc Wv[6!=#\aH@0T. HR|Fi- L n7N`)ZG,ajTRmI#0L*@U42YNZm RIE@a#KrD@ -EZ&"P*rZ0$Qk#BPi5! \P 0gOL) @ P"$)'Z ) @i) r*Gk1oZ*($Pp!@&jXBrNH@91i"5uKM|.Q"}x9[/k}brǣI&W>=WZomO0oS#WSTx<k``Jp%AQX*q?B\|[ztSb'͐_kÆ]c!SDR dL䑈)UR!$aτ2ZetNI_ӂ1扟J7_#غ-]Vnzڷۗ7f>OQEռ;IhLi604OȾv绾\De]Kd"1&Z@H4( n;3ԉD );%)ėXH+hK|wQr]L\z>͉wm>|`_i1ŗƻֲ&4 h@ZϾܣwpu/>>(޹}1mq\<\u_[j;Gz7]vnD/ZSjv:QhU짴9c$jW$E8cb%X!125Cȥc4=}"hI]PJm0)=#yr42J0T%@i.*M:r( Sh0M NA4)Ii*Jj4cYi%'  P X0+`0y0Ul5!BE)NTN - ЪDhT -.Bv9rP-0X<~g~of!h@&DR* -D6j&nb$`CSJM&#ގwHDÎA/!BKB([:L!eRVJAr9]~|YDg?8W!5?OZ/C??>}9WߢyOW54&2Kw.*r1Tk;?y/鎊T0RV:%|_u} 2T1d RIL%06JX-.caldZY1XơS׽Z?z?:&n.}y'^xLÚv+ٽ24LLT5#Ia4E&jN#uz.FHɮ+>,qjSk=-_25)pplY+i|'ͶO5= XS#W^>nDę+ *4. -)v J%^6SRjV:V¥ʌ4F|>đ*L%1fFy2hM(B)+E"͐m*B*LX8&-*,SsjH2bDJuSFi bi0LT2B@@ CQkD(Ru *DT r4`dI܅&ʋj?Gу?LiU" -J#r & --K!K$)(hCv}ci!14*L%4i"%Z%TDRh[|h$ELʋU.u~n[sp8q'h\d`vzbì'2 0H-=>Ac4jgqExS`0hiTScu/_}%J>e.a + -R@H4ZMX"1}/͏ZLԑ{=hϷlZ׷GdN*b1Ddi4 &4! h۩Xi)h~?[(־վ>mYGm?gzobRI~yŠv/av 3&2@` Y\ qBhI!j@rKn)LM@ -rT*BBA*bHShtrjJr0V02P iiIDҪ -bd*"hBr9i%@ Eh6IH(i@҃P'  bBNN@Wr2 誆Q nZy.~s! Q@ - b$@@H0C%VK$b0HbfY YL$)! S!)R.HN)UIQҩfKF?O|0׫ŗr|-}91] 7ٗ<|6mtzFf{$dLC *Mv_O&VHfKZ-4w5OtCعA3JrKϵZ^+6~KgY޿&|bh)|}L^;n:FFh9 -CTL+B}NY'.:Ǜ|l?!V'Rz~>=/kjOO'/n~{tW~7K=k^>M_aw2CX a*@-{ך;M:Y1 SBmSWQ\/Z.pCY<4[=F%tItN]mrc 4.1!)"˼y?Ϙ%EG%Rh*,Ri&Q&¨7/6~*XP TR"rtSeQ-%i 2KGHCh(5H@T679HJ,bHLiʱ↑R 4 9(5H f:$ T`H'#Ѐ%\@ $ jJ*YB,)RLwq'ٵj0BNVb.dD! -6iLz IHB$HI-TiAd#ݴޟY3DfIk\<Ϸ^8ڬ'gG9995<66p&g~ -qM/ȕ˴ŐUC)@67ӽe^[tϩڳ_}:b*Xh fc7Κ:l^]xHsGjE{_땓Kyv_VVæ͸s΃>My*+Ol0y[Foa5]S2k}xR5X& h =mM-_#d,{ 9f~.#.8 ?_1=Zlƍx_W>? )FH9c&n|v#Wdɪ)61-O3`9a7#H y>P"fĆ"Q!E - E*T O J~4 䭑u>Ξ'wChE$ -7+ m 1D`4!MͪbH1@& PIRa@ 1҉e(`E0%rQeTֳ}_'׵쑠+@#p -D!4ID0_ " M<@ -FZCM2Bb>"$s -DR41F{|ar{YޑF[X%RZr-wcũ|Эx35eFJOY'V-\ڗ>KӠh_W|?.qE:}Q~ɂs~whnX SfF$7O=,~XIt}]ٿV$NwK%gkIA%V0wp0b-Ԗ0ɍjT3`F&jP#P`EA6 (K $IR )FE1]@=%:ϳ,1$C,U)o&0L!c%9Z&2iL4J4! D `hHCȁ@jh 9 -4cU`KrV,]ˬ?gmUbNJ$% W"r!0*%&X KJBT"4 \x'7W hV C\b D -*DmBU$*-P"ZVD7k?PuLW?+ƿ/?5q9H>O79r-Ol4yn7l~Yry&rk%MVLsNTdD4Ls/7k'_d\wRqݖ1w8?fQ-0H X,i "Tn<=5h>/ñfL?DesŖ^SuK'6O+L96#=2sQTb_|ǯLc񎅛A،lj"j/ai 1 M!O9i~Wg,FjQޣ^ɼ-;΃OEP}9ϯḩu7(Ow;Rc75KuݾNSWc$JqgVuLfT˘Jk$F,SQr{^NK&:JAaI.D0G?"*h!I*.bPa#``PG9*$ ]ؾ=L-R%r "*TLIl@r iFIb&D&J&i BxVH*@4@ :QP P@(Ñi4(ֳo! LH@&^8iTPM1!(hkP*D40s5夗R!cH@07a0H -D%JMzS$dIa V#Z?Ǿ昶Ml_)eq~u6gv}:nMK<hi&PVi&}gr茹*2-n̍\ I:Q,rr quɐϧ{=TRb BZ hyuӎqʎ'/Lڸ_xG}1tRӓZ@zׄyFܲs/`Ulhrn|knpc=3ˍN}{4^B ~]5zS & Q??dshRǯwؖ"\x|qn4o vΟSxW7Ef:Q߿W;FX:_Dީn'+쩡* Wר,ynP҉&8ғS.&#I6MW= K edF%s/?5~j!t2h9d*D^oYtK:nɯrK`Bo~fIs?W鳰k ~m]v^{ilH%rR4#k dr&Mt!J YAi9f>lvKa3rb!d0DDMQi:jZi 0_$*(R$4bx$DKJBTM.GkN]qWsGfeܾrA}y'=Ac٤VmN]|R_rʿk *D4BBZ5ͨgsyCo4}z_>g9GVyzv['|w Nnj= -M?pwv4o13Pgqw+ -& ȿg7z9zz\ЄÎsΉ*oen=ѽ?cV'>f]./y~NY3ؙK;*9poR -*I_<ϯgZBi=G~|UcWsH'%"2%DSɌ>h/\Lu1DNa7h|;37_GkG8GKײvǓg?~om֟.%V]Ol$< @4?nڗx7ar@DM䔚~%Lq;#+D(ie@XǑ5يbK@ ߜEN۹ɡ~ ƮdLbRIHE>c632jQR%+$B7 42ǚpe⊒hJT HGzy\riM `\"D@*TBM*i4iiP(1f E@V bb:H" Z5&61if!3|-Ƅ0`rp2q^OΟOͮ ^rHܗAy_rg|U7"CZFwjszQ$YC}>5|I4AڨQHh415F~mNqϣr^[+B -*@5!r@Ӳ%;r;~~ > tUo4*<@wh7CWK9ĝ`W`&+8e:Bg.}o^~-XEOlm1]IUnO/i^R\[ˉ2A>K9v79>tf^gsmy}|YH<_{Q%hi>~=tv\vX"}Hk]e4!c{|?z!ŀ2BV'k%?{<ovx`Fӕ* Z7{h\*&CuͳzFvŻ>m  Yǒ>yڿQSt uv~lCM2U8CF~nt%CQ4@411w%}wh& hF&dhF$N\ -@R*B.D 4W)p*T9(@1*M@r)a x5w.E.`@ |/[\&Vu}^CY{vyz%W2w關"rϳ?[ 6L>IrT(zU7m0SIlUi V `.ihG -'#>>í}[`Z` ANB S@htkGӹ=xѣa_giulngz|<Ǫ~O.x5|{:wl D1xfjUK0I$@j< IzurO6nk*f$ObcY"jGΞr[Dzz$w?X%5GdzgqwDiB-W$o_6;SӶMK4Hu6* *]OL-[Ȏ̾/)6>l!"sR y/^Lfq0.%sE,fh>[>DozgeD -_̈́5K7u|f=(i44 a}.-'Q@k>$0Tp\:5| W MFd}xA=crY2D -nUL_I̺΁s7EWFcQi9AiwXȉ4h nN)ZL"{EHЉM MD"SVIHId L4,NHIm @ƨwL{єL8cÝlnY)8 AHȓKhQhƲ@2eBO]K^r:ZXM.np2n\ϯCT6ϯo/H5SV]MQrYgBAbIbB}Eн$?[ƺNU '6) @ -ɬgU\̿&;!nߛ#tko^oU8t|Oʺc:^[GOo9T9a!;=CҀ$ 9_-<;~x3|n.4\} .S^\I|wvxs컵ˡ|?Lo6F=W~b`)). Ƽݎ?*Ѽ[UI68Icjd2f+koMgX5 zAjIW(T#-%Nh;ϙ,k3x {9/R|9OGޜ6+Օ񜏣k!?l_jI佋l|l+GڄWҽJ8Ov~X$hnAW!ꚺpԫqͺJ R##ǖу9;~8*  JoǶe4pk]t1dj$P|?Ls݃k}cYi2Ȫ`HMHML.xN|)"@Ť+B +GQi}jkrрiR4#@YH4BW$l@*ZRƆ%!CYP$+JK -jPHc C m4I*vh5(R\h$5OVs|EKN&Wm^i~cMX8nN[G9q+&,7IYa+ÙYĻ'`cd@*TE"JS`I+o'hrH !҄.iLbOf?t7O;mt?Uz7 Ok31t{I/(aZErlPϨō4BJXBg.Wb7kgڄ֏two>-x7j?d3[V7D) @̦6d%BjY@χ{onH(ADdcnNY= װE㒫K!.K{ k 4=u`^\n+Y$2bw>G$K_t~1{_/&^ts"v#.u~ѷ^w~x{G_θccS:wѹ5pܯa^s߹>NW?Q}{<ع}BFƒ@v[[>{8=@{%&Z'$Q`78ymyܽ$*BV-O"n65*\g qvtߺ8U⩛igOM?OsM9 hSi>ޙrc:L -ZT0CSr$ҪKITː Tn{Np*ȁ,dD &E(LMX4Q`qZD' m|Wk_$7>qkÃ*'w~8@r?NY 9Lh)*hzX}b7NoNNwTJ+JL"ˁ*@ Q4H\JNkҴ ~g{{ȾM,XcY DSD^Y۔:p\#޵=M[5Fo]?B,x;BMGbp ~Ok>vӾs^k/RU q6l$҉ȓi(7?keƥ¶O×6,no>}_|Wy쟞DYoonZV~9&uc8D]pں>,".WX;.{/%q$bsJ4y[Og^םOkU2@ȴ#CP6"DWi  I1fGb`;F4i YJ5+OSGHV+A6?di412*Q3#To7-ZH`CěV:@6.5rIP9`!(҇y1+"T,D $)4Jj@Bp 0ԓ4E"+T23I9G̢̰~g<|[hMʼw|dHWiǃ-)7}VԵQwHXj]ŃlY&NN>0b`E@U{ԜliN̜fۋfةTG, r:&'4!2FlNC#\)r`ay0LUnV٣\^_|>cm3=_<_ͭ%c&2ĝ-!-J)ǒGǦFi'æ.jdJSef >h+Jp;nK|cgǓY3^f;h>Cxb8 ;&CAZ?Luݗ525g4权YꅸRRRhb{/.+In]@m6Ni\u}=(#Û_'k=~V3 3A]ΉsʋSYoױwb9Il| զKwF7vзē>~E{G7{ƺru:>VqsqǤҭ]9*C`AhiuH!T\؁ 3Ay2{fļL> -tQaR -QC91+DeQ,XMcC vq˔M努 ~):@gË2$@`B@,S9; :+P$Г`5,JIcBCHP1$Ld  \&g *T%%D)STw.'ϥTR=lzhsW1~zf.OO5 #M٪erƶ.{/ϬɅv@HICD|M&[.zl"d!qy3vn$@0k{rA-vؼ<_UMNr“~1kǓ̓^_ s1Z款SǨ WU5k_?\C\P,M% |cygDL=Ij2P3x MK 0C!_ܝ^Jt NHG-@*)5d L鏙nω,[Գo8lS֏П/+`L9oAzY+ӑ #Wt=N۬+N2YQLuDy&xdYzږ_P  -C@4 -@!Zg&ۗռ~sͷ@^7e(@9`)$+\Ӥ8'um4mF^˥sj]z>ǛA'j~UtMcJg>,iED#7tb dEĘ&8gsy'`}w AS󟏹W6uiIl4j^/Fҩ~HON-{i͋IHҷ:kS>츲MYUͪV蜣j5@m@JA QJ*ieF5a!Mj[pX~۾psG;gJ>lM,F~U̵[orD;%׼~yҵݏ9>̘o6BJ塒!$'520I%dT%H RW(/:$brP) R3HB!(ȈW 1#=$A43M^-w]z}5g9}>_զzY0Ƥntk= 3Ph4֋mfGg+mP]$Y -4=v h`0iJ[M@C@WiG}gtW4@* T04&E e#>F$)ZhW6ThQ`I:.1%Tσѵ%oc<O|j"eLdžcHRv5q1H\KL.Ӱ Q[Q|;[6ɩj}iq.N1t:g -}k?}}(_գD7V4ܒhu*BHJgŖ2ǗQdfk&XUiѶPs@$ LPhk#ANI'ل5(JA66ʡ/v,nzu$U6O?b>lyG|^sύzoɣlIy~Zmy]+YRD.1vV$&JF0*_U0=S`yq,FI1Oww9~^x>KcvZVpowk[i] -_:UZ %b)ʲrRܵ&$_AjEmn}$M-!L@lh/mϵs+?GY$bqMG/?x~Og. 'FܼԱt4%uGl^EIzg(hkKܧ}]2<{&HW/~߀vxDx's_^Zq<ΰd:o*{_6'B&Z=m^4/D{\>n73uoY7}'ҥiRIW ,jJ -Ankqb^Λnyzgy5s.cɊ97_stuHϬ>2Wrnh"Vgĝ -~Fv]oduxueOz׷ŗ/% .6:;'19bk=O3]lQSNRv[CLCefÚeidj쫚W,ctiR)@4&C@$ZN97ߢB9$!2SHcM4UVă=4s|kǑVx|vפi~^Bz.{_լ.&n"\C3;CU2!"DJ\j5eey]{ 96 ͢8ܥ9jM .Z[i\m:u4D9`$\&ε}sE- i -BiMHi69y ɱmd z͋.˥{ͼ{{^}|PX[;g'6siٽv9baӵ/W}m34 :DQxm7cԶ T>ۙ1}~x6.]913Jk#`VVI# -l^g0%qlrxO:>| 馑yS'潗@7wWi>=&v.T˶ n Ml[ێmzw&[ٖNa4]fnks &gC{6.QLwŗ,hl ߓ뙔$hB/>g>\1JibŅR#9DH I!%SJ%R%V4hcRk{(j;N\ETCL-fJHW*!M8j[EĈ0!?&l/|cKy<~1Go}3P4 1ÙsR+&,dxˬYi+*i6}[h_qJ4@ -PM '}NyIc{H9rs}ہl?/6[x_gzkЫn>?>RS>nK{_x>IsN_t9/ZQ}-sKh[5NIh&H`o>XX_OY՜~fvAԫ)G"3;/wߕ?/}%u\|=sk -5!HTZ/;1;2mךu?ٯjpzO`nw9 0l|Cuc ٧FyYOgo>I{n~?4J޿W~>@ e2&:%gz_GASRd%'#B.IBLhT5 -i 9ie\`Iyb"$PqaHB%|׋5Rcs+vˬ`vo}/joGOy$w&=sz_;Z -ˋ2lHg ;tQ6 - @`!m (L.λTt3}K4",1XB I r -T @&R$ܹm6_?й5>S5d֍_п*DE@ 2bJBB@ !M"&*Mk-kdDDQ4n6о(lGֺr Bm~[fǔ)R*ULdD6]oǼ o6,5 T828v= 'ܸ3߿xW~G7)"Mcvy͌yyM7MLר -QN5#rt\:ORJ&qf[vг׻|H*RJbCȵ}]hm9wz̗z<_kdF2￟u1\_՟QCt_.nubv_R<o`_(p~y|F=2>v#tdܳL0_z$_8>jZ=։5/1y/$^k69wL4S%QpZC|~7{6c|#蟚>X#uꓖƍmy}侙,`@(bĊ!&Mj=)=>u>vg4AD hhTBT0L`LQ5#w/8 jK}~Wa?&{Ϋ{WѾ^qRL\9I,5٨[ -J\Ԉ@Bh$@>^,n>fN>NtZF9$I0)(_'K˦wcIϋ9|/0=ҤS|q{~ék5s\K'$EH #x " MHTL%c$'}Sl[vW(0s.K9U4!)L(Xn-Ei{#d`iIjƖY~k3yg_ۮlz9RJb!}/c=4i>taWV! -UumA-Bri=>U}G/oxu.TJ3`ŭKkصOXջ͵NAd17Uz,=wijr>+~3h5o{]LӚ]'\Ӵ;oν:-uy}/꺟?oo}nY#l֝wq>D=]u͚4y^vOj1:,'`-7b>Qs=Fn >u/=_s ^6ctL%Y1Z]c_}=sSL"F1Q-(HЌNir$ʊa1aMI */;;`ҷ@&U !P(4+P:ѷ 6DBWZCD&lֿekn+{>::@v?0員{Ϯ -?/U޽ua&d`&|?B*ʵZFeTZ!K4+! CBTXՇݽO_F1Q@',ܥ (! #!DhH9Nts $Ny̅ޱc0A2sg#}}M8̼$㹖FMvT- N@M!0MI(1k^27ܺ^Ciu[I4IOO@,;|PP%?DP Fij%pWa;h; f׬=7U|GϓkOm>橶ڹLJ:7w jh!H؄M&ޢrK|os΂eWOУzvn5YqqN<0qi۹{]_WO6nLLsu|_C~{ο3cgN%t1juD.yLw3'۷^o@>Y]kؾ^-zے>7'Lag/zq_7<| ~+||T_V EŒCYJ  -YI &!U$)*@Q@Dғ@F"A#I{rdD -"rJ '#U*oj˳o^҄5m¤̧*)5xWB[ڼ몸K8^˂9W߽$ϏGӦewHY2Mjdrd*증IB>8XTU d&Y4 }@Ē` !4*B[pM8Mctwѓv~Ynծ^YHIjJ36FI$h`TVW6dKp aBhi(Dr RT$1 j?ByOoM41,Ф FЎ/E1 @ cv}n-cd:9~ȉ*bLnC!f=(Me0bY"-З`K}&"кSĎqҹn:# _Sx}/hIJNkӐkM[^ZYY97Y2S ޶3YPJ! ӥIeϭ-znD?&9 )[Qzׅ9wӝlVl(%9eϛ_jwOSXzʍ6M?[=Gy0yM 0?}͓loa#o.gڻ9]?|2Ε. _wn|O>EVY<~9gm#ElldUϩ9{ YU 5@A 5!R-H\ H$!ϫ.3_f=vFybdD&W2][$j4)Գ4iHLBJj%O5 L3ӽ /t %2$jघGWW]0B4L+T9`}a5 I{K=wMm!~ M+HF73)>0gFSoCExNu/ ls;O:D d:N|n29g3>TK/!zb ~>?Y|[&BZM NZNWɨ˿>\EWCyX|ѿ=w4IgZWK}SIgk'#y4˺wZ#yw:/e㝒\+X}jguեejZ0ܮZW,KD4'4! JMԒ8 y<ϬkFioX!LJt@H9Xv9<6lxo?'5ݛuzu͇繷gu8"nULԁ5ـR%" 4hJdU!HdlwӸ.*o7M\Rjhun -!DT .fa2cW橱oɺ&HݓP>8/2Мqk3r&Vv~Ow<+ͮ NE{LcjwkޭFb)x٬1^-y:yOMX7~3?^KҾ+8mk]瞴|?rH( CTZ^\Yl~&(Sp0A#PHH[tH D&jJJAM*L'6$7<9ƩkqܤHq ɜa{}Dl^6!3 dVeRJi 9𯉋[z& >=*GKg[jO`:'@@3Q -9N/1Uz.7=2 X Ƞ,%6TBMOzbyd^w>0~t̩KE 7;&J9c@КłJjQ0HIHC@@ЕHMQ~W6NoCX:Lh{$BH p;^ǣV" !s}>Wsu2`69lf7R А*TH-<ߴ\{?6>uyTv9m=Wvx|ݯ9oIo#;>鉸SjsO,rz*}tK}v5xjO ?ÀU\/$::9w|~q'0yV+~>Qzax?ҹ;Gד{ׯl).&&mk#󞌒5( |χ/Lw&RՃ@@4KCBTp!rbH&,p%HR\~ONs<}eUH)dЬDΛ!D1 Ag>`ΙÛAz}vǦ}&P =~7Nfŕ2RbUsuT:,bbVXqɫ?kxN{=t8`PmQ -IDQs~sZ`7/!4 !F 6D6HJ&rBjjT#xG:Ub c-)q3SBHT )J"hNJ@I2$h*BЏٻj8oW.) VG -n(h@>t/1?pҺ< 4uI9D滅H~ -L:C ~`ȡmR 7dt2wO >jvyѣir[#G1iqKh\H_Jڿ^6J>iAZՀB aR0T›Dr?9>+S,֜O~^g٧KFIJo8~|Zo53rb~/:W]#Gg݃ƚب?eJ4|n].^ge>xoi_*,Z3_Wyؾ$~ 7e]ri"d qSI1J/.,Gђ/pUD4)\4 M(URS֒5RBmT`h;J LIm""@X\(P8Y -AԂ Ld߮~xg۬ CǟG|FU[ -tOHf_'Ս1$+7_Ceȯxu5WJu64ИD/ũ)A _GυMϧ޼]ܼf2Q& -m&i"|Ϭ}U6kW}O+擄) i1W+ *RK&"SBM4ʼOq6X*DQ K] H@ Sh)5P@, c*h4T CA-"`1IHCc%4R@۟-$TTXB|\c^? -}gl>W~]Fno씐ihgT5=!Ϸ J#r^|BL5]Kp"B`~ hO{}m[NVn)yr]fNq<+kze1־8M -:NmKm ->f-Śլt#L= 潛#]'K:+4zgzv ]ur]7Hy0Jds<~p.+r輞u71ؽܓ'[/3N1>V{6'É3}KÞ4??^Ӯ| z\|6U/z7_^_&L2Ni_~66wWi;17~_7[ܴ3mdDКPVL9>>ǓyhJ\Ķ"TBBɌnXH$h%C@ d@'#NF)jFIR: Y$/lJi ȉM=K HjkjI -zqS -! G͇upohN`] r^L{͏&lJ@bd&\y529˼T:N̒ĕHD|_`g:{ڗn>gg߳x;m5LC@$& XL7y{)RBV &TDRbˑ*8<3c\>cQhƲ!\&jdDhrUʠR4)e*N B -H!2S@&Di00-HIHJ* H4M щ\i'_y_Kx9^y61A<|9Zt醉T H}Kʟ1Y`nZRr㦩1@* z:R->9P>y_wHس=wds_7DksKni<|Hźǩrn>_Iݴk<+pֱw_5۹bsi:ԼsY߷,a̿/ϳfwNOU?=q^+yOR99ys>?o~J} pәmӷn9ϩnג7\O_8v٫mLmy%<Fy>(>{Fhif/;vM5psYL~=~kх>s =}G-fIA -mT T \9>/>3o4b"4 -C҈*T*U I H&%5!zMsjնBJ'D{y c>(nKVNRͪYr3^KӾ%9ngY -Tc>繣fs#9k6hLZˋ.M2A[KsU@t=C} -4yH9Ƚo8-)I -@D,%4x.נ&ׇ]וklmm$lRJb+M R -!4LgS4 FTM%SH ȀhĚ\c%,7*JRА LC@ @SiD4  @R[BCDR$$hTXJG.[kR{_xog>oxVdҦ5_?-(ңxi/7ҏ)guv[ĝ'BعBt%qof:^fwE/ſkړju:ʟjV/ڥ:nTy~%q*Doeu(yI6( -G]N]/u.HY32 -2(+L\F"_Q}}5M>ӓC&"~df?S\jO.6F"v_cy_t<NLRh~nuYߟm4n'y~}G>3Q|ZiݱhdZ49B>߷7ujI%PfĒHV EȢB`PU)L+6 Jʟ| TkzлVDZ(y鵮+5]S ~b'D"U3DԐ!T۳ tW6~ܻ$M)gI-l=/ldm\kf^?~K' "$'Y.d*}2W+70%RP$2c3F5N̿G7tEͅ7IT i-:`>|TNFliϙĨj -V$i}ye閛@ %#@$IVhCrh -MLw&yLTU{.Nqc~W)Zέ|O:tOqމNxIdtLAO/QvrD*@J!XkO2>V<d>?hӼxvw{Guf~o#š12cU3Y.I(DA&FwgYQ4:Ro5~vXmH0 !LD4 [Mo'WFGGͧn2f\\sN]' %* $АCH*HD -ja'&1HfMoaTR(X m& l Q hɡtFI @%B *6u}Y '>m{ZUi;ݢ9+M3];_rN~ϕ&ll^b˨lqⱂ*9|Fm-+xl1 )D>'ZGjѲn??雷Փ8ѣ:7n秸ɔ`ͽw*k}Gx^ިokzK})>>IL1h/ -w=Y`}NFs?;#C^N:v/$^qFMS^Hvsw -Kɏ}m~{~5.Oj|{=dw__SXtU=YDkp5OE?εޱNUwG]*/ku]) -+JxyixfrȔqe+@Ef>CX3|W;鏏ʽsopOOe "A4!%cT4$-BURE7+2zʤdF{ QPřG_|)5\kIt:Zӏ/KuOaϟOwqCm}sE@ʢTdgɎQ{[TCC$*ZR¢m)[4>|=2{äF$T[D4a[oOIڮkhrvszTBmM RY`7 R@1 -2I3j&.hI1q*&!4@] aQ4@@NA h%9) Y@SA-L&ml@$Đ 4 Q4*\:=0!69x^}a~<D{EC7̱{9>μNgetm9,o%"/ͩl^V*w 17|º-y|*qs)z^ iڎ1Nh̵)_G'U|#H@&_G6 qqe'Ūu͂˺xl.uAy^RD!@%"FJP4IH/_c F-{Y?AG)4B2ιg}'At ,x^NߨRsQ R*BhV\wYsq&;%M궩)\h#z<8Z$DbME"1q6Ze0ICs`2)BTƟQ@A, ;eѶ[{5]ͻ!ew&n~zW4z.zXsj~tg%c(HŬl_ͩƹ9GW\ -冥'AP ~G/nan|ҽ3e4->:9Oїq=;>[9Ϳj&?Gycnomx.!r^{{_?cxsޙOzB~r=ff<==N8g[ܧ7ѰZkC<¼~}c/; _?awcΣ}1^ь~y@A7c$&|\;v[/+Wu9ˊLX>/3az~tHгEêp=ʷ]֮c,95LfÛ)ƿDY#Լ6iW~jqH PܸҐ#D#` LZ~acC'&*8k/V_>|"9^ԭ5OpI1L ˅b|tKw8\ RTQ` PJH@`%fl\Ly4ɒ*e#MX4+A*dk0Q70$P%&Z%4 $Cx~>[6"<4R=D4!*BB@xrԲT 4i 52 TbȦ&n #Fofh1p"VlłL$!A-#!&& "k@0ITZA!'ǐ玍<ބW ޭI×G ס}‹?N磡06yat#`& -̚!_~a7C͔8Z2*x:}oZDl)*Sq}/g޲f76$O\zZĿWy@RG̱{Y/z#|ؼ?ikt6Tx~}/ sr/t$ab4R2FlU ҠCC)!܍h0M&>C>?i&&>ܰ[A8fWթs^ҹm;ޒno~q -&ֺ{TMH&S0@JC',"!CDBp6fd^ϫm!{8z?yYɴkY$z3:/|NƗ'c}7v|>y^ -oR wKgoLٹ"_eKz|_&?+#.#\2sF9LچҿLvlgO'x^_}^έ1tsof3çp᯻~uOk)[]4qR*GC][XL\Xw:,ky߻/ lv-%^+LzN yrŠh@QT*BT nh*2E )"qw(TUˎw~^&ji<'| ΓJǻ#\O֤m]<%Z'ME5*M5 -l& -i &)9j%6,6dZ( ` ЕI|j1is&׹yPꗕO+hW|6H  ǬY{NC}{z9A_-Zl&ϕtM!5 &*&6sR g&1*BNM7 LjĒ&2KQ!Mv;}qR Œ!ZsaRsr!1MH M@I );Pr @ s'̻4x?Bl5z'É ێ/;Vam_7ӢFMǐ쵱۴s߹:`'L@˺u|̧[!XL jk9Rt?+M+yѵez7Vbg]6B#bȻzѶO^mSw6`Lw)?<߿D_on5rV{2s_}=sJ}w7~Fxo똸bbDד{9Ƚg=ͽ5M)^;@^|x[#~W]mWnᛛtŗt -?F'*pn,F^]FjlínNg1ݳ/0:Z?4I7m&NF tOO|˦iy=%ͿO2-4)\\P:CRKr5RTH`0MM C022g2nojb-LCB Lw.,znfǛt_ -}}]]^\ @&*IOg۵Uc OCIs/$l!!If41qXYY.m!`dba2RXٜ%Ңk6N\U KhCPM)ҀRZF`Tk@PJH8@0W:enѩm&rZGxun?n03\w_yв/&7-||M+gN@Tݸd/ -2-Wlg@+~ -dYbLܑ!Rr~tMlGw7[idv9Zb_juMSpns}.ӲRoOJ)I=7k^v3*5 #_<0˴kl7,d~"h7ؗ]>>^c=OBW鉼Od}2f1zSԹ3kS{A̓C;N#_s+'޿NW^7Zv u5mjXϴB^@_w&qL+vgŲƵ;e_Ȼ }'[D J "JT?LJMH$rRR!*WBhI͎-M$/ߩ큇} j~Kb j+Wdƨ @Ri&@! @@/>;FkǓk`JMB!.RGo7>Uk>K)ˌvWl~l7|V0@&Kǫk>O|R{L:Vyyl^hMR~^auׯ{t~a -˂\:ꓐlzY%>(͵͖gɉ8]7/g,/*S"Igܜ˭|޻'֣pQ8_>WX~_sbǖ`vm^Jmɞ2|f֍LB{On>51;SS`JlCC/gɏ7^m˯Uz-:SwOU/#>MLKJKCyOUv]2{NfĿscm: 趛}HM/1\*I6#^~}acZ_tX?Ub|ɞb)qH R̍(i&*X 0 EȘ2fŚ/şyn-2JvjPh^w] #+_ɎW}Σ皑茣+hMcE^noOU#>Ul|˯lAY%"h!&Y@ CBTfRa*K ȱ܉2qK}2 Rc410D,I)jT&s (JZcjfQG"T36Zpg9i=/N>k9Wk"6_Qi{{n'?FϤ@4 -ۄu.G2kx=փw -bZ&1?gLvVz `_Bpʺ?׌mlGϮ<3rk8| ?sXŖm__S6zZ,y|}P>6_^tht5%~{͎EϜmZ5}^?!z<vƺ}k9GAͪl}ռyp닖fc=03gIH - "I=^esKxY^|MR$<yKpjK=俻l|~{~Ժ$Iz[][~\&H}?-}7 iĪĂ J` 0Sp4lC@*hɛhbͼ﬿(+Zb擴ǝzQu2_^s:ɨxZ_fi1z&mb:nkMb{Ybˍ">ƹ.f.+iz8l''}c#@Hgqa+. `y~|V\ߞ^sGif?'{fUT>otU> -{Ɏrc_'=?]W& :ɴv-'6}3/ӨmlƮ{xQZkL<= s4@'&#[q|yS pT9U/t~4s81i|6\2^g/K&Zu&"cj_Y3`]js.&(o Z@ Y)H%qDi^6;>_㑹g.b|S:'kQ-i^}!"=lJWγP&Lqe4GK21"Jj2F` P cχ1XJK4@1"_6_. /7Ŭ5}C4>vwbM-nvsCsQ&@r|c>m,>&ѮǢnҚ*nO٨)4P!L%P""@IE!e!+ (IQu -2^ӝ9j؉@14 D*%CIBZDt -NA#VK`fnf\)=~I#6?˿?X!IYMDȫ#1|kRoFܓ-KiJ폎=7>upy~^y'/>/KZW7o>/"_>L>il_#v-Hۧ|}N n{.lֶ3j U7/CݣqHO?T _Y=_V&<jFχ}jN=tuQy;>kt?b[6dxwS5=-[lAͺG]Act^o&O'G:*. us9y{Nzyg={WT+;Yu_x>C^NIo?>y'Y=5{ß -*)da__~?\79X,0]>Fl,}ޖ x\ RԒ'k&q*!'|<{?r5`I zGG#eˏ]6]9f>j𞿋j{`%^Տ3@E hPM F%R&lRM 3eǛ|dǗfP-Uje.-JjBIM N`M +DXr -H Ve Шc5$EiS -Sr JK H/X6B`SXLTD2NH##YYU* 4IB(&LR @60@RӖfTT 聁*|fM|.-y~ԏz9Enڱ"h Cy~TN -tP{@ϔ@-GoMDMguz0~*^~АAtNCY5+r&':h][|n9_c5wE3*MZڴ h56C5sr,/cRvo?txnO)]g'Ϻ>סO6#݊r=1v8^S/*^o㷔>G.wI`֙嘺ʳ>yeؼ7DY #j6f3"ieFJm\R}1 -2"FZȤL4 *"h"#"+> }GuZM"IR P *P!{!1Fy=L9DԶ3}=3l'؂n#>5w/+28Q|_5vKrI}7Py5G:t8N)ʼ.gSkUz^}f唙4%@X6JK!IA- 4 - yǖ/ыejA5 -0Y"JDC%R '2$o@1!RQI1"F"+j@CDRfLPišUH YQAYc@$CEX$C@ 5`Q`M %%D["_ڗ"N;Z9G& kg^KAꓔ~Ӓ ԉ11~?SM7Dֈ=X 0ŒPP>/Y`V}yW臍ֳpvdb}<_Laj3N&h Ȕ [sca(r4`InU$i@7,1DM )b k"! W"($jMPe Q)!bb($a}Oϟ/7ϗy"6c&1 K@KhƁR2L!RZ>8k=y{m膧س72?yRrҩO)Aġ,|?r>/Id UMY*Y$!9T@@ЀMi9,@ @زEσkY:f,Pʐ  Y%A+#MK$i#01 B hi$`qm1#J!DbETR+P!M !6Pc_D. .r -[NN 8?tԾ1`  bMd0% r @M 51 h *@5-KCAR4M1T40C&mAd2QJ4բL!`4REG4e $`6%E7*)RG,$HH) D0@HV`6ܨIW,l@!XZ.Z9V  !**DR NYbc̀[?tìwiDDD0E"S"FMC$M -M("ԩT$C edDR#A 6@Z$ J4PJQj%3$$Ҥ4  0Lr119cqq/,#շچ]og}ŚX>O~~5Cf" D&M**bDJ`K@bm- VC L¾32_\}!+X8~c<|guΙ =W8<^\KwcoIꯗgw3u/o|E)Ra2}y3<@?h<ʥ$ Hh  \҄$*R!$'64uB& ) 4 1-1SM 4iE Ei$JJ28h4 VL6 C0f) Ɖ4Q%MT(T%0 i(  - -\0CIY WSpV)`TIJTFH(rЂb*(-fF8>CO -+xwo;i޶.$@qHi"EJ L \rZSSSJ*I*d HTjIR8C@Ԃ*YU$*q#AR4!.+Z:%.>7>AiܵnF L@}">̭OC{yֻό^rWXyqqI]7 gr8[;^'Goś[ :&zu|:^>pGDpYЎzmuIy>DF\A Y*Ud\)\Fl:rIeLCTs H*|D7|˞>Q~ qj㲦agHРT0-'#P41rȱI&@hbcJ4  bP P`@@wV0`S`l!5M҅/=3O}jثn5,iy͸b: -Ptcc$G^9#%p|;S+m~f~k_ -?^hfO ~(M3~̈́~_ --{ŝv&&-#6f3Y>C2k>>kϯ}[juMȡc;S?}?DS:b=^~c.5H UR1+D@@KV sR$ISJXh"$%srJ -B *jL"aO|xڝoFvO3[+B:0v fY0e/>?rx+=/Zg=#ɟ|TYvc=P!rg'ȞCܟ"Ɏ_N+1Lb^|e<_a!%|G&$2}X3l>8K}XsV:#_}77߇_/%پ 1|P/? q>pB\R T )(@f X  3aMT}Ac ~7?|>*~_ BY2*'x&_+>@\,#A~$+P\E}|}I@e\b=o}XC'3 r|`'y%ppDf;! "01A#2@P$%3BQ`4pCaq5DRESb&matk[]"GK褺2̺3. -l~z4KF0DFe]tW]EYtQ]5ѢOF4KD4 x>B4KDˣ."Үatk Z]|&&s4=n&:|".qt]].Nmnq5nkKK[ r/arW+ar-ar-ar-a<37╽'\ζe\bu/ٗ<#{5܋buζ'\뗰&\\:ؙ=yr-ar+erW+erW)erlN99ewwYlYiwoQtgjYr;>ۺa&|,vlvu˒4mnFjvl68g懴3-)ɞ1;؈_J.ٌ=9bF@l/#g{0Hn -)v\e9-},v}]ܤR6Z9jvd"%Nn G!}ԭ鷗L -5ѭfݰS(AtXFUhW!Er%ErTW'I45j - ,YjZlֵַZjZ[:SkZԵkRԉ`ogм7pO eY=jJkK]2Q|t]%tJtᖙ>k,'i$l2ؙmJrud%h/mnL[3-bu:ٙl̴q7>o7Yn:KY-dKY-d[ZkuZk%ַZkZn:K[n[n-KRԵ:[N[nKSnK[N:S2Zktfp?/U/Ur+MrWNm.MtO0eۣ.뢒覺5,=E5qt]t]2闗N}}ݟK9䊭[3-V6hem뮙y6uE. `jU]6jtrn[RSNuunvOTUzt@ , ,[R~SG#lL.:Pw]>ut]lE%WF]"WI 6EN})N䨮N.^تL_b]k5fRԵ:Sn:KY-dY-dKQ-dSnu[UeY=jjdJd*kEӫ -WN>a'eNuh.At ]2T]253]"WG ]WH=U.fteWF]EuMtYWE> c]IMU.WMu\\ERNf[3-̫jU/oSW el>n͂E6 U]4) -iڝjuoۛku'WEgzYe>>]inU8DtMĺL MRMB>kJkb6ZֲZjuLNz3uf7Zk%Zj%Zku֥yW8CYrW/Qr\4).ViM pڳYЬ:on?KgGyMYoœd뿇X7Kv2O}R&vgݝjɳ!1vSm3{fNhef;ְO -FOdߚoɿ'Y:UPFz4yuˊդdLVI 4ND/8cJe_inpu,rF{\/Y?PhhCFq3x[^&z?H{7{V -{; 7{^hMsݍ ^ޣvNRok;͞>CKK'- #[dsO$q (&x37jGoȠ#g-[S&'vfc4?LA')'Uջ>$okK$S0f"re$RF1Ys5_߭IVt%}֒YȖ]f7خdy?*? ` ,2N!n4ؙd2L:nG.KD -cŨQLd27n* -u뻐zn M 2D7 w3/:wYsg]f8oldžkX 74E/3cl@v$7C4o.%$Fby&mr'c|S6L׬@#̓!L! [5·j1m]`f>]B9!{ܖhtC(I+ [Bmx3uzXB ?P@\ʣnju>޳CϥD}.;ҾSZG -mTЋE;QmREeKMsE.z$/vi $يn& dN>`ru$ G+JV*ޱةZM_PR5wv.杬i4-qnD0f٬j8nl\ -d+[vZ-mX6! -EZ16rQ65nՊPZnLmOfN=`'k$pGo!Ps.ӫz;6qB1Rӊs C$QLpdLJ7t> y0w휑@E9E?g+KzKJӱhg+ ɳI06Af)/\ɽF$dJT{ -! #f>Iի%W&Z {ozZU{"`~-U3v=vw~fp.d9`"4ecB ztf-[\ P9 =#eb(XdR!!*H%uZDS @:>H{jxd@cNN6ccF! >7Ş?eZfp96caHA;N&3ݱ>Dp-5}Ǐ1qUK?A7`/ǪBąu,Mlg"7o#Vfќ28]68*dR&VpeCgpgu۟d#'wL3e͠r0 0flV jafaRC  6`lˎ_?M'稧UG\dz]iudOLr?eftnA ʹOI% dxl:c& n|o C -Uɼsw,O,w𼑷Z('O;nٷN͟E}k1Y);:GGu4RG.i7LpU=j:c)C{ LnJDdg$sQh2zr95ms6[YI#ǒ,^fgwtu:9(gvrc)GT~Y>T%÷ւY;zzgS~Y~YnG8tjоqY'wi?fEmrr$ ]>o,\'x~CL6jQB>X:r?IX?ߒ!"')2ު̹#6B̂zku_36m՟ѐ}<&Od $1L`&AG% h`]4o(e"}1kQ)mJ3ˎ a 5>,gs95 (;nBFQe#'IVLZAi=uzMա=&wP1,&va Nϡ~6U͡L1gMN#rbO2)Wwpf;4<+i'zlx⇘x3vK `W,͟x' ag)`\Ff:"qSuqVɸYyvu,mgԞdkFX5BGbi['<=I>#WlEcȣ( g^^lZ?>h Sz/ V[5eٶOmF"ټ#-g+RPs)+eaRR~xEVYufuD1140>Az @n` ̞fy`ُ͓=?v]t+&ՐGm?S|Mۣ.,0NO٘Ygԏ{W7KZ[oeI%).P,)O8VIH\O -D!l*V@+T -UvKz"Ǡ#l:HDDR B6_}7T7"ٓ{?aO\6OZ Nr͉\ۛf9*ve 9dy&u -"4jl"(%ԯ afro#z^qfmu!Iym~3D:Qaќu_ P6)]Ճ"N`,K50v冰sf܀&u1 A{P\6gOv)HD.>Ppn: 9C&'yb<16hB9F9<7WqxOLG8h:F7'93TX+K:#Nb.fBQHf"dioI/3=fX^m'T\n]Yteu}W%bV2xA{NJg R4Q.zx!sF' +7MW\uiNZ~xUVbrCr(GA;bHm@o黰zF6WNvZcBA-E lh'M<3y"-˘^BgbJ'0报gI{.$ky3 pv&h%,q"ӫNiqY޹wbN^da17Pt 3wO yw+jam$1IҩۦW].:|> ;|pl2Sw֢Zftiy%XE[8rUި7v%iS4EE ;s36ussgfOx 8hFRIjRS/T lz}R\%St͓չ䵒V|<ǩS7r~E*@cPox&;pgu%:&vRabVv;32cyqZȰ۰J3b.^ZnHlaIMVUܩ͔axq#&n͛ZyKUѮ.mPrI-ag.g]ZUOoՒ8uWRF? sq/7`:\Ao'MreY6l<6ȑdP_vfkQ,Na!;xt}#MTd?K.g~eDuu:Ե-Kɞi?M$uZ*=rO81D18a>r>Mr/T.Y0tլ$,x4AJc$çr#=MqwYG_٥͖XƤ1Eo_#7f(l֛(%w%v~gEXp(p% A;Vfr5D$w_9$Z`^5zٶknQ@MٿڳGӅZla (G !%z)׵cT6@H+5j܀3}|;ez|kn<6Kh=cQ]bIvT}יw\ae{{az`דYz"kdA,=X]ٙyg ;eDm)? Hq1-nd+1$DmKvN⣐J{hv,?vfOrHq@f+wT,I`fsfT$B lK$n>F;8dqڤHgx q5;,]x'k9?v5Z5[М'y;>q.|}u:čG7Xv@dy:&O6fr ZI0)Ig0 ?IEZm`vd\OAn ~dB./ݡ6Nxqi?c8K8t*sz68 UF6mvmZ܆Ve"P\I^)[u-jYq AzQJ0MԸ_%]4"[jH?G~J)Suhjr]b5?\WwrtoVBr8,c4O]ѣC:F@0~ -b#''¬ jsR̦ *K4olN mu=)Zj[!.g=#3k8t/,A LDl>gSy 6BVqb9=w7uc "Iq -UaJ9",$t30":pN&nvLJeRAqš? 4or!r:ef6tXkh،\ E3$A̚%>{F}ʵ~SiMq-# nz_EzwgUWLߦE!}53 D7[* xH5wӵrYizԨ.Au+yoAyX'>IbZIhu}Y8fiD@p:79;0=* YEF '*ݘYGG 37 c݄Qa@o跂UwWylu'fdG`ul{.ډC&j8f`1!6\/Wok-NǑUÆ\%9Irw2tt 3!l$1&ZM2h~\)\)?c=:3uB~ANm N7<b-j՟dsD27HtxFUj5`&^HGZ;Y9M5,U)2 ry;l,qCqbꭋ# >;3ݟ -е9'Veի.Yuj9X@1F>'*yJLO-N/[h;kwQbA,'ؽF0y@^owȴ@\lY+Vmj$}nr*-6c|7~G55[X@FQNlV;ZDC(DbdG10шY \#!lK;HIrwv˱J3P!,/?vL8tG뾒'VUҳPpY*D^jX7WyLkDIoi+#yb(j딦ᅽ)2%8bICr}U)x"h*zdm%>`ڄc js>BUTe%Z.<aF6HpE LU!zOT2ĩ;uɊuLm#2VuGnxc\_XW8V5m7{d}ve]lBf;ra2iX&׵˯qfj$9|k^ȫ~iA9u7ݽ!C/;+ Lؖ♳zc9X})jn< fv ; Eޖ8 o0 8VGa&Ȼ3d߷2'Ygt7kä₽|86j`BT]#dZEWfɜyם>nu3k(uyǧ5S;MV|9)AvvwgRQ@> ;FFc'ËN*zL谆rUF"Sӎe$Xu3h3|*Gμ]GK8|Sqؽ|ŪҺֆS/v&AV5gv39&Uz;i0<&9A]Ii6VpHlZ[2^Ӏu]ʤ bM6 A-$Kiu֗Yp[;{գ'g~}k>^%jAYGK fMv]6CqH Mj;EebzvZ yQ2;RP/w #/Hc8;mؼC"ƣ&KǠpڲ$l6Τ|Ăi[ -,l/\Yar]i}06FRO+Vj y٪I6$ M]8`) 皊xxJ@nxLbaWˆ2EĊK XDLT*^p%(8ͅb{~3!yUs}/YkN )1rjp0hd:)+JOJ](KKfxdזCnY͡o!]K$!ymAL7͂3Uv9X6&ܚF1XKV{$+DEzRɵ *r=^bm3bm"*tuN@M]>֥Y;m&Fu)OHzsC$TU31uIjvtq\n[atuIE UL^I1=&r| #1[SoIbV;$G#04[JpYQ2uaٹ -YdmE.Ut.]t\KD\k|):KKr|rWW%wK3zdbg?" \^ ͢"oF]i*dпal|HmUlQ[2v9Emn?wh*.n%ٻl\L =?O2wtE0ްeBUؾU~Y\N)CmVUA8X7ڱ0') ٙ6X}cYع J#i#0Īn] 1}nKTO^y -(\ƕ뻰A~ l}~Ez.Ϟ^L'aN0tue/qa8jz=&S-.Œl M d&͹y M̺i9>PرeəזE ;4174e #7tq]WG%  |ۃf&6]Ve\5\5\5S]>uӪYt˧Ck'".b ۥô/ f=jh{6"Lݿgz fx6Lկfau ɷ!6V k GxT8~OTG*Z*k+ܭVQCNXAkB*s5=2vGpQGRk0FN燝'A3)9{hY)) &|ٰ%)*StBClbcVxO(:{c {Q}&gR[ݣsmgrV!ܴIpW'W'Z]iuiuNY? eSEba+: "h3BTzC9 .A|苓b)~Ɏ6JG)gZvsMr}wcc5hO}-Kkk1ivq&}68x arAV##R`7v3j4r Wٔw?IL -Zv)' K6riGbw+[o YH;"%nU8kwݖ!Un u5JӐ b:nsw͕yL:鵷-\͖ \b|8"hNxwx޵@٬#w7h_/E~з48޼ 6%HG^(?PZ]F~ꓧfM%wl,F?v$]PTuT]QuDؘ&?MRϳfzoX]$B:,RC/8yJXg<(^r;n#3ԣFO'2QhD?&_#s~{ -KAn ~s -ށoW[,ۆ'j: $"L~an(Ip3h(bVv8s-ח)fsP~ ase껈u -IʑjO(HC1QE&{~͛f9=Yz͚O|ߴ#r,no݊|c<>Ir=Ն\ݕX\Y\\\\\ZMz.zҎݓY7ޝ!ɩnihc RéMBBFtˤQK4X}wQ1 5fh )`o Gjw,䥎AŅ77n~#ӱŗ;_/ܞ@T _YC'}8Ȣ1fGlRCs61:%-RbB49$%.  ;O'R6`\KӞr8V 6 /f͞!k~OzA?O~7a6dq -F:=O0U)\ I}!RXe9X1|)ZӏS9c'ɋ"I7aEV3|Z{G~ {-Ğ9LfI[SO Bjyi\;.z+n4xbo8٥ԖDZNL\i" =6xBjS;ra^&oKԒ<3;h%𳼡7FSlomj.ZO=S!oϙFܮ_V3il38s%$nd/~0lĶq3戵jui%WNR.gl#пǭnv00+h+51 .:a"oI՚k>w/rs6` ɅL'q|2X<" -76&?Ոܽ9nJ?6ĮǤmpzn؍]SKz3Oh! -y5+uc]hPۭ.=l,Nܡ,#^;'8knF#ZZZNP%%u54 _Eg -fn~~U[Jӊrx1ӱqlKќw"-iy+3\H^6\1/*;U@U`KyiD,CBbCF4n韆B6rwLNȫ,Vx(GѰJ:dTpC ߤ@&.4)cWIKQ6M6ɽ&c(#6J?2 FydJ5cE`eLZ>6 +QA4,,J:a9u.u -X-|eV\eXLsH-Vlٿ1kVZmNîNHu t]$HM uWI]%t]6_ -)t])6bÚ#cM\rP2).B*-gk,⢳ S_d2uq:MT%xk%xaUZ]蓼$OFϊ7~y9KNšU( '9:yntd .Fv^Rvwnc6#ſCplоg5Hl;9ˤVRP(3f(a75ѫ(IM*;hI$2q%. d͗#܆HM]zzy~o͗Ҋcw?l@癪ٙj[-[Ane t-["[Eny5dw$ޛz>sz,^S3׌.JQ}d,}PɂjXfg`|܎Q+NlFQNNZ1$u%k%B \ 4W_H*.$ 5[Tk"?͛w'l7Hm~ W#Մ,\A!,LE%F%zr? 5y@a;צ] SFiFtщI;\.ӲzSG 2B jzFZwRܒܻEFwb?gz$U*ʯfj\\%Oޚ0ݷ`5܃uhC&וySw]ɠdeiNޛ~^'¢)'?s;*E&HXlBLիlx]@eOz d&u4",IJ0ڀLK&%oJ|6GF)\1@RD:gɰ뒆,hCSqPfwL5.w'.O&eҩQW }NdVcã<,>IfZpR_~Xt;sUieD-E@pDqj>-䧃hHjT:OXkIߧ`ޏŔ_l dY[q (- ;C~O~yIu C,&D19zL:FheށY]abٲVyiLůҺU5鮕MtkR]=,Y!|"voD>v.mѝtg]tgU(9x%[kn룺9(h=x ԭ%mC)"ff#6=2s/Z*,d凿g&|9gTəm_˙|቟w2jMMR_tU&a8JgffEѳ+C[ѝ`9QIfj穠9[0R6b;O%Uoml1D1ᓩ2(?>R\uMӪxYGn,,hga)K4j=|'~&'ofSjtfKSD1WuelbؐNTbC-w9/fdvӚkr 짚d:;g?υo uZHDxwP[y$)ٞ1 g3ۍk?~9沍d 鯢}%YjgkȳkjkWogl\:4U4NLټ_m,e[!tr,f`D61X3=\? jebm 4_kFoO/Vh hZ]e`.Ҍ^F{y.}P,b*19[5Y3 0%$:RxeY6Z dkIcJ^?o;i&|Ն=F.Ibv7hy~9+Kd7(D:9_oVg?hՙ,4Y69:~#xm+%~HNRRL[C1jlV-]6J3܌OviYv3PN37A>wyA(Zr,O:PM=3wa /뒽q\Vk#&lGkrطpo!M~ES>)/UucUlN^.YugO:~k#O:aPauGO2G=&vٷpaQg9 ܥ;d-c`m(fճj]5=Yh|Wtah &q g\;8wɳGݕ׳jV BG)ACFŷye<SX)X^ֳ15g^VG"ZI8WٕoL힂ϾFӻd vhp6ã7&lR.]MS0ȁ)֝>3/W6/.~xnG3vg%s[QQ"nɞs\p)wJ2ݯ$*ԅiZDCD|%#a%Y4?S39SdUz祽zM_ДfقuW!:oB\4 -W@HG']~U84ϒ;k &xs[nwaISnݳM'pFl`Ǎ'|.r?I,se$\')笚#qDْ}f^1+EvQ03GnpF1l!_g#3337za#5`hwPBvuvH=ZvRi%0s9gpq (^Fh|L2j\ -sé;372cJ2f³ 2 >N&UeYmW[P-1ea6YԵ-nKQ-d:b>w+uKQdX"Q2vxdĪWX>/X͘~c719 11%d0X b[l3[߲vnmP}kUi^i݉HU8O? gdTKTvϴT=mD~_3atI|zުk-~j2.r)ri~{QeԠ]F_Q6^oȺYDjǜ0y#jm`g -N #7 -h++ժzƛ#3+Vw|9Yc;Ю.Τe iQ#bFL-uNvTQ3yG'7[\%+ .Yk[(U"9)K^#/bhcϬ~߳V-PSR[IDOoݲ]::՗!Qr5#Ur5W%Qrt'Mr-MlV[5#,^G[p+,EAGdީT-q>@Pӆ'$Uk7avȊ9fF/~!59 Z62[yO f]ś7;3&ca5j}ɠ`ezS9v uj{C僖m4a0ߖtK._I,:Ld~YioblOYU*yE[j]?g=b9'W,9Ms;M59#\خi=\͇[Vm<$!k+U_R5\D޶^(>drV썘_#R - 0&)s.IR*LDbgQݽ]oV[ՑKPġ/H2DIgg;4$l-Qts3f -RCTB`]B1;H_3΂i)7Uz4ҕӸ4EkJmS}TU(!`%vB/&Cfc -fg^W@O%y_Q}EYE -ޅoBڬ˜ʋel6mC@tN[jݓ2jl37EsN&XN8Dl#>9\2*{ih6%U7ٰGӳLJ3,vP gn- NĎ*Fd<|4D#oe9څ!OFR.RQl?MI.V.Z)3ڂR%!vnJtvx+R/+--)NS/+<)oݹ )Ug|IG3 OlCBY2Yτm\E+'ĠA>j$A+d|Ui6$;=-ZXwg,֣rlOPMڑ7@RE\U#m"O[fN -E;#AV͏d.i깦fffnDS]*5Q!8 fGAg,jk #Eě m%j.Qtj -0W-a0h<2:PZD@XGR2OB"߀"ߺ8t YbIRPB0o'{3⏳x -$[MkLb<%Lߙ=iz_"fvjLϛÈAu%Hd@W^va3a/g7>$H3f6=Zݨɷ3dpŚ.R*E"2=.-aqi3gf&jfO%st3' - 0/K$U܀qf]fu%MW{:]\2 -ҸᴡJI4VWӍku=$[RSW)arvW%i5 Nul2R‹oNMhuW7LJD2_f^;"lɽFV1 ;n8JڙK<ƛع"݉rtxexlٻaajL~xzq Ńze4Jk2V6 ^ξ\@AXew;.p&M!U-L_+tɉ8azOO0~O׌ -aUm'.:5I!4o,N ^ܵ.3d|F5B8'\͗\͕~,?r&Lcsff6L+JZ[:۶7Jbo~َK\#ua8HP9iqL$$7ZsQbщ`'{v}'+f=Se H,mY֢]۔f1s%(C;v;%nvF]ȸS}b --::XmR -\WJY9?EqA䄵ׄ/*p -G_q$5wvCsҾIփ[R.^w\Z\[]6#3ISO5J,L#z[|RK4Ԏ-&n2.4kScsܞ6d<aг;+՟=-QՆ'84KSdw0> -巃HOknaD$ak[U,Z"PN%T'fwB]Ƒ3Xlh(7^@c3̐i&b0dc\"ǧ)KQ8v9a_\"#|R"V9޲`LG fWNvRvswV=r?"XtQ׈ +C _'9{!BGRgU8ݼa0ų-+Yks -egogIQ uS]Ful'u .&d\sߐU% zԂGuoÉfzA$"jz0͆LM~`~<8C*H" --fܗRQ'&Ey6 N āl˖|EQ5-ȩhc}<2Vv<5I\haO'a |qGd!rvm,##~&9qwZE )}cW趡|7,1:O]:՗#Uru'Qrt/U+-飅ΫF̵1 KTB{02ŷC[vggg 7YSŊy(bQ}Uw\%-Pe)(`xҫԜ.59Sƒ=j|4ĵ6I#rNz+.JKCgovtgzL$iȞ UoA҉IB8ʴ0쥩^gwr2!'ih,wNe1}N~Qܠ|0s-˖>n%VoȞVǜH#,VcxƬp 7&6tK].wjw'ԏr @&1YoW[&܌H0ۓO }Gu^;v ŏ O Z7<֯KV` -{}ty6RjWuŁl)xW.t]a3 -=¥6W!i83wS_Xbfhp7InIJZvb20ۓH{'DC|4duN]jу{du_Q6Bf\5SOz.YuSAS|1lRF2OeQԎvl0>ٗ=~W2%֌]1>,^ NKQ~4mmXt 單 -oUEiMuj MjLbY=BTA?dܫE mjKZsb iސcP17C~1òf vQXҳdXxq7e\]]:b[  -N*Z [12Ҳu''Nϴps]V˦aX7Yu -Sb#!͟[(ɽ=,e{}{3U&YYn/f/ۿ;v_~7ٝZk%R>j1#<6瓎`EH:NC$0} G^q)r\39uIoP\ jhicn%ӛ4Pݤi*WZ 8MJi -|bƢ83I2=!-'IoT[E[rIVMR}v't`VMڃ!8jϮm"?vy)e:Fg8U0jA3>1S>̣7uh}M^g.MցڱJOCCxâiu} 6v*FC&>9{Lri`6XP(xeOz9Ɉ+p'9^]ƍ`t]V]*¯ŢOd?S'Y:No);6U5 -:x+K,μεW1+.r{YuSxͳl|[q{srwifY8MQ&lּFXY',edH+Igv#؂j96v]Z4k: 6Yp4&hpn(/E+_P\|1`WO*iom;13[ob.ē~o,V)An:w~0UB)סHJErƖX{ 'hm04=[t7x|dçmU東wgg#?n 9\0صA.1WCF(q7C#3;Lo򘏳l 1fieScx: &|lC%b -k0es_#߬~ ?e;;Es?Eu -+,b6E㍣coY -.]uzˬC~"]uX%դPbE, 6Z]i%_ݧn"{uq5NlqLcҖP'շh3g[XÖk͐& vvY;eٴ.&vSk͇[_bfvcmC(l&Wݚ뷫/S[`MWOll4]X}ZE%&a6.8LٶlwNr-Br Zxrqd(lz>GnHŀsvxדAk7sŔ}fOY0[Jy)H? -DPCgo~"- FիmߖONMO+yRrp.ln7/Jы6]WFPɔd f U#]a;ۤ޳Kn./ѓ6jNhFQa;fLܫ_ud]È\ /Xk&<*:UsSӞI?H}ӝOԌ>|.6MVb^\ .ӮjNwq;R)܎NZ\3Өxej:_ ̤؟g+W\,}EU6o5Υ^8^LdjehfoĀʖ!B?I_3L/b4ݛ>IvɝѮDGa!m'ibN;Aa"ڕl̹K+KMMκT.\_/Bh|{x#H#o&[@_v_e~~%VG -'ه3 +>je`J[&6rx,Y1C03l{g4R"Q>`_VNkݛWD# 17b gvs`ϩ^daTsH272;[vgll6tU]"<&p?V#KԨEu*I:M *'>*r<9ݱZ˫]Z1ek|[WXuũ!aK~{Q;]֖C6kיyӿmί- c%br:鲓 e6SaۥZw]*DzK #D  ̘E۾J[ɥ( C8}9WNQtT]*NwrI$B(B(Jv\ $㼾bp.lNwsT:z{w!;~`|WNV귶^+|Y3yv\"]ݪ^혳w% Ge -mJjNq|r3&I#r}՚*)h;QgGxS,Zn'|#/6'Ozh1j;81mZnjaԵp[`}?uU\5\EON׮ߖz "=YeٌWQ0UEb6!/Yٟ_f `Q_bVjx#/pSb7a&ݎXr>nU![Pwl#S Ӕ !c D0ӊHkIv檷^)fsM#%'ogV(CfgU21KaX{Xh*tbofiwY{xenqNߊ6 -QaxݦEbri$7Aa]].l(zJ鐦f9]jY"Aᷡյ&$ߍ~[,\ܭkuU0h@ ~dS˕5VRSb7A\9ٓÉ.$4of vA hWf Zgt0aBv>KO6c`kQwo<Ֆ(hPGZ]iu'YZ80wz?{ *XvvmM b/+g,ևY3{$D^Vfm{-2|.Bs8z}YE}U#.IݶuXi gp̻vvY-;SOU|17/ݝ!{Ml,<1@2wwnfm#^ar~١]NzX]&4I:.J0DR0Qw [jUKQbUtkÜ+TwFHԍn+iޙn̞чRyCzvmW,-/ FA#gyιI۶x8.WuvOc. !o $7i#iI5.ʵGoTXUv7b(|( a&QO!v%tM>{\&캝Me' "d?C7)rWh*q|]2k$2*.v R dy[Wq}XĀա"&cg $1A;I]NJ a1]"tP3?G`IՓ )L* -28|*v&#Clo[ ^L6ﮤ'afwai^AP@u>A|lR`v K6?g";'zA,^e}hby yzc2 4{3\Fh\TMXҊiM Sgrh\3U x-_*7DPbR?q=Õx=nԧM;#{~1aRL@C- #5`WMuT*Nتjf}2Է k%]0I-fõ)+X,\uY=v^e8 3vG׳5ZIT;vxY CB>Nu4c.qVjnP@+f[0-f)ݟ'65مL0is%!hHL\I>G$D_UW(W4xu1hOveө! 棣V97oufzmSl٥ t+Pҧ 5D('Ky6}yt; Qfu%_Q}Ee5wLzcm?KtP@Zi1`~ގ=dil ͘p28͓b_f5nxY}*@.\Te&LԩD.N{1%Z)"q6%_x׊-xoؿm3dFm_ !aVv6v?h.'ъ Umb,K{mݳ2J.'Ub£؊ -Wo'u^e^tYdVĹ˖˳Gf:zXLeYMvj>(A)6}2IlQ]68O^6:rמm^,-Q=:n1&!D$JsZl7\45kFba!&Ȯn]rU6k&`yt!si{q`*_R|N筮vү4(ob!7ل09.l ɿ!kTr|\V*qTX*ŒgQlsOS'pY՛5IN-WPoZ*FbzR&.,-.*݇VyN3.Կ`x"cNG,wO%eBn4n;xA/FBC,atiS`.Jg9?3"~'TpmJ(I<v6vvgoZ֨U+nFG d)@ 8k2`?3 ϳ◑Y̘0V-G[F! Yy6u]auvPقHLHE^GRX铃\1fSqbg亼XbMGIK[ &ޯ4Rǜrׅ+s21u6í0˯Y)1@1;T'zBٺz[&[!Ob:êM6I,ٶjFn8FY5.MuJKSF,MBѱ[@Qѭo_`(jP aHFO$~$D5,6FRV,&\rf#~Z/d߳9w\lv!&}+Mv{6o̷dN6M\u,'])aa:._ dᅊ;.fM\3#0D/XkDߍ$B:,_|V6۟&4scs܊d8aA֫ۆbhpsab#A>ig0-oBO(#_%Q1GpwɝRZ+۳$/Hb-Лp*/_"u>k|,).z_oa."|&F˶Qֳ7Uvt͐qebl&wƺ).|6Q=B%fdžǝVI63PWg8kj jTwK wLd͐xq)(EKw ݊Ejf错^uDŽRoub9YP/fug-~ dčmd`$:31쟿 gX;>CU&_\Z,onTfȄʙZ (ʟ&입sY$W!ErW#Etzg՜>HͤVqM:<9,Jh"gŦKq$j77z9b89y 6Ē!aoYI7GM(DDD[ҕ3M8P[Z0RioՍ>+?StvTO"jAR eR4 |_4jBbG~f.M-ʹ;ȯQv,92o3;f!LĂZ>+1 -F@y3N|;batd=G݆VYiVY\kّ\Bk}>&v5044`I7ZSֈ_T\U7~MG,s5`{BSo燦UݗU鉈X a6/YٵuZkT]Zzlu9heībHXWv kx2Cx(VL@݆Hۧڋ -dCWKKq̫ah鐪^j<0e~r" 8z,߆k7;~pxZMKϥ~3)-T둴YMOtd=:jU+Ml[Uוo[ s#nčAN]{3~!&ȥ+:C.ɰvA@?p#e^gMZ.^ت8]6yڡFu=ܣxq&F "͖&lFfbm"҃-WnUk]Aky߅v%Zv⢂&rX2jU[p8fM MPG\bk5SQsP٪΀n3HU/~F)zЄqAıl'd'Z]d'=p+8y;O,vO?T]R0s3m.Wu$CmpN6!i[erJ84pɤz1Bó3FMiyU0߄mE$8'#zB9 qI+kL;LJO`,4傯E1M118>MfN:VSVyQ ~VCNۗ)+ڱRՍҰN1ëGfByBght$eƉizqrJh$mߎY񚤧mٙ2D@U xX@ FBoJꭚb7w`"61g瘝C\qz|8`x X;@ ,:<;.g\*YvQjُRou}\wZeeTkz %!(w6ݳ=`c_)27L8m@o8h(n_3I)2`;o` -BϔqЄ᭑M ]b>!?hZ[ol,f-kR~+}جPqv"۸J߄qإ09'#I~f ^DPHR9Hd&#d( gjBD7nښ;e:vq41m8Ro?LCӫF&U^VpbCH!4f >oЩR`e -{i7oR Q4#Ir5'QGnz_AY]1nbOZef]hM7aЪ4?ިVZ<nXPb6X]}erj6uffwvf:oݳS뿅ݛݝeYwrG8o"N^.Z٦7U*E\]kP>+7kDEZ -sAby R&v'~2HFb/V@o0͋xoW6Lm#wSnPc/T=2,c zyf$)4f< -:,"g@3](g1j^МDLzx9W,,Xc7V \8a}sk'XtU - #~Pgл1JMjuY]֒Z]dow.np[\tKL_)edWdN6snMOn{% er28|WPXO22BۍЁ:ݰ#Yd7n檮r'O%;3w]u Q]JTڥe(N15QVmr΅7ׇxY!Pq>Mty.MtjL&фIՉ3 |XA<*A|bU|͹Y3o4gGmi3pl:hyGZvvvgnP y/drfv2fy(dǎyE.VG͟ ?WB\GlgB8ojVDW_wVXġ6,س6EfyU Rӆi 'l=\,Y/#եvK'Mv(n5#gvEYvͲQ(W7쮄X\,&'y?B>affY2s}rjr%͊_~3iݢI7zQQl- -h#0[GZ#Zn/44~͈e&})ۄR$C'z߬A,r}Ō_t Vdu(IBٳ#\՜UlG'|:uNN<*S1>-xާcStwl*TJUEc0-p}.I5l'V:0 -Ue*範@×K&%j#V,ah})]Evo1P}G,\nNU4Zֹ$x3RWfUr8CS\~1C*Se~hy٦X Tb0ib(pLuy㌜l1e#꺙>k̟W7+6 z5GԈ4bSdu]h%Z;e>7eRVW?m%'u'"%i6i7M,W4둬손E(iM~,M݂Z ,;[2!amƦsW*[Bߗwiaa$nlIMl|y:eYӚXNUU#m)lWr-UrP;?z@[kʎ%+U^)$hcy^wmMN3fu+@q*Jvdt5/nRm.Bl6vWJ5L瓢g e]naBab',Uݟ#99qm1ĥK( ;6!/{>@,BAte6ḴX=1ߘ W%L{&>jJ2(Q!PzCEl C&~*<*RH~GqbQb1yfA42vg ջ! WNz4&,M$Ŗr@HLXҒ{_˞NGl2I?͓p|߬顺^9}16]T5㗏>Q;AtK Tvm['"1,.gYع$sxW8mwjLݙ̘c6evOvY囮]%1R_3R<'Z]d,.Z[e,ۆI>6sN+L[}Q8u؋Gdu=)%<*@mPՒvI40!b5Ah gUV&hP,6&IٸO7Pa1Xv<2{Q#2Ye-YVjUzK.f;72DR5OukP9A,˛X9;32ǩs.ifh@xq;ψ(kߊ}սLC/.VxH>kÈ(qU(lL%J.Ng6'fM ?$A'o^ ֗n*J{SO%N*l-M\ҶM\1 A5(5Yl{(>Ӎ,Mf>2:ĭN-ҽNf #6;HrbVWh Dޘ+k.]t˥VPᑤI'WnDqk 9=j7O0FI$~W㤼c3sۧ^u^t#6'gM Qm=M\럦iHX3f&|r77kSNZIh%օ]9Q&čZ#f?ɱʵͲ˷nQxc-A LُLkvbT 5GH.Y>#s}/Ó/:s< ,?R8W(k9 )w,{q' -r Dα.`btp]48¦67٬~گj˗94Չc ,>SPQCnCRc}/]:%թQY-X#")4f/VՑ>4NgiT5'ζ-1}j+,.#I6ȤNFxQשZx\^RIz+' ͤ N=Yԯ./ז Xax2n!j2"'cjn(c޿jWjڱ OIfiVFz'n;rCj47qx8[!'zwFgXUlgßyڳM۴8tm}> -ԫ4' R9C֎6ϕJWW#c_C^td P%^n,NjudL`*d(G BAzBI*dgݪYx5g=YUZ{AhȺu =CNM1jm]f~.BԪSZ%(mL˝Poh7à2ɤKXgfieըXZ3;>^ON2hzU̝ߐ:b(LJ5UP Ÿ겧ħ6Q[I瘽4u1oAUfij^ufWvev *A/EbXp|۪ 0ܘ]N$SֿS "Rsv}w֊m:f9Dt 3|4gh]O,@l7r79cbOfRي<&-->Ryg{TeDՖKa e<6hlķ-QcoX0i8bzS -iȢ z掸B9FfaxdbF!m0IMvy w sb\7Z3Djՠ\#P> ;YlJރuFÖaLfʤ1ŸYV?R¬?r gAfA.q'NIEbNSlT+" #dSޫ\D#.^"ͤrՓMfq"=*S`~1/KbS6 )B0bdeۄPIn}ة{mb2P44}իX6$9?gkm;,Jx.f7m쉱z\ʅ9"#OjalK9J>ޓwujYsdE`7؝%i6eavJ%琪k{,p_د ǥ~Ņyۺ,HkD-ߓLF1q~_GSH!Ie8ĥ.m.q3QW;VVYڱf8&P^]uX|NS&* spӔ~Z':?Q)Z@[5nKnYSmX[tˣ6 ="E$QDF #@֎8ɞ]ԕpĶ}pei<h) v~t(yIPF6%zb듙φ:L<(Uĝ,^3P+;%J8-_:-(0"n0US5uq1 U<:ye:HVD*4Q -fݖ1lŐnY,JmWcmv=|vV~70uT愁45UnR X?IsPZVuSa]VLQ*GC,*eoAr5ؘ|6#w'l2zTGo d兊i{ԛ۩WoncO%tC Pd/nX&xi&Y;24qaԘdٌ0M18h/ٛ/29HYv&fYR'p-׳6X?qlaʐ8ԅOy*ЋeWG,$k -@ y6!ڂ ikVtP@b,Je+GV$;\`;t_`h㓞` zv`{mavi#㕳3.ʵ@ŗ 7>S&E!pxoՈtU+3 2͛7~-~뫪0Ɵ.E(dԳtn[z p&3D,m1멋kE(nzӧa"&ɷZIfh,ߌB.fzݧ,.DZ̆?Gh@w"ڕ@ nV_*hNm5Zhcqztr8KOWOםЦu_jYi.ItK]*aafC1q6H]?u;+3 z}Fݠwx'ez0S{v8wSɉE'Ӧw&{ `ALU7.s:N8Ҭ8oO_c?p8IK]7!5q3hnΧ3)!% -\tg|/NHtq:#WR+t CF@ifk~3=Y91ڎqP7!;E2bQ z8؍;yz*+X90w0јs]&mY{#êJ ˦SOVpv 8 {)b@@4YivUR?Bl[Ud#BsUaofٯ{]n+2|B.|L3 >%?޴͂y$uEoz iGUdw\) +|ݗu, sEB9 ߋ ;JbgJI/bVd?j4n /[1vHB1gvG8y;ܷC f d.ثg,N>Dɠ+NSŨ} ?[?g VZ+#6Є۞yO.Je5 < #ݕ v_R|lJhOk;I:nvitĠLgp%]5Y8/^lٝo\}plOD3S֯+b=m6!NaUFQv՘;]a>1'Y$شL;39z"-B}˟؉4s 6zj&G>9v`sYx/[*LɸrkRDu9&>G8bY򝰭[2{ ŸP9p,Fs *Ǯ.R8[3J0dlf8 b -DBFZa7j3n,"Ĵ -ꄟO~ӮnޙgZ3f;eM /4>z}uUC A1vQӎ1]sUW7M5D_gʝ'%N Qa_qՒG̡ĩD: XHoiYb-Nb՘onKswbFi;3 VBDqRYc+,g4%-11d X3Y/bb-In;nԫ1pzX؆<$ 8Lw5>3iP:A`B&9댅> -yFV!\gXZыa̧}w$c i޻Sq,%I\5 F +~٬q06ɷQ0FD)Z@ >h`!RBa -%58r*Fs_[ʌ$X=L|vPL"~TIV]Mj0^G!gnm5^;߱01dd]?u]&[zL`2nJjtL]-M5 -̚V[G ,ٽ,|2%N"g&- oǒj4d44j[3Y9MIoǷm\اg۲f}/ -Hl\D_Mgmpݭ;vԒPϞ1,-ⱊSF?7o NY,2Nbko afۉ~+ cТdkLDJC Hrc -\y b=Zk> .KA+mQ!܉]Z-Tx3^2ŤKڔxl5e(t1]o$W'.Fݙ^Y6!M&Va,W'9m!zqɃ-:@r -Ցz={7 qZea>N0C%ęֶۗjK0<'b +tJ<*:.+ˆy>ETWڲffn VR)8pCK ,ty)'{&mSy+“ӻ? l刡=̣J+O\+_fplj+C Wp(?'U-s13Њss]!lpcEY$8ma|/j%֒Z i>TGnv.}sV]-8Z;?rGE #/ɱ d@ߋjZUl9#љda "a1I]޴zRQ̬wH2:i7ۻ乌Abc7qkpc7n='H?S(0!+fYj7erkX&1ICxsɳ]BWQVYr*T4j*!t ]8_+sj]8DgܗQQB1#iU IۄI Kbw~$:Q: i=VIV13.ШC/yGLq7Z14^u]?6a0႞|1ߪ?oS؄W.^[.Sw6`b7evaD,;JwOy-2ُ: p@@XU U=rŐRBC#ߪ˨SR2'\6i =?f- r,?8vNןXLDN]%]" zpOw3}Y͔ hZOZ̲D9?%ֵַZ;{V+3xaK ɭ+r%.GUdێk2Y? -|Wn9OlEֻ'y*٪HUΞ?Q uGc{Cj)ٿa뙉v7i2&M>F˰ fߣ|-.Pq B< -VP!7wjKB|}qgq;`@Ee*.Qtr}8~6oy .޾Ndng۾׉:"ښN; ;w|*Apf6k[H*3@/e-{lN!݈3%hV%fVg`nXmϳvP>aI7i-ڶX`ř8ζoQ> -SM<ƹ;1œ`vYoZ9O<˞HCXv쪽x_vLI M^\IHwe_1,Ěnp#䐬=a5{Uq ˹x 33fսZY6UW 1~K5I꼓Odw'>O [DP9_Nf$YE1]&F{T-l~1fMDyZ *ޤ-۞8:Ĭ|>!esV+"~4!woɚ@ٔs ~3Ҩok\5SMJ{~ Q܀#ViwlrO1wٿ=Mަ^r֠4A8[1Fgb7\̋|yw_hM '/efH6킝BQg;Mђ2ix$sR ۀfy4[2HXA"I|;rhf܈)5گO۫N[@d13'hb)-j;C84[vgqєGݧ.q󘒜 ``x[y39 dqb 46LlLCZ:qPs7fؾkG'6er9PLItrE'jGMVæea>zY|T|\JfX* yiuKK>Oj:j'YsèF#g)K(:m׎ػb= Vy/扺je;Xlzs1lSm2eF]e3~u/9e,R{ޯV*J X k?:˿\O&Ƒc/B䶊V?KVnЕ͎t}Mui{/l<u׭ձ9M [:¶6)G8i:VG> ?V#'Ɲl=eGjrdYf_yhXmU1t}VQQUb|r߯fr9Ke)vdULw&{܄[45CQb^(oO;/&[&LoʷXk觬?w;I?݋m^V fpQ`c])Ejb,ƽA7$l>jV p6`Xx% (mUaC<2>AI 0"eNLU^Xj)h`aUҡjKZ5Ui @ #6Y0z|:|WnHn6>c><jo$laF2W93 -^۝>~ 2V##A q%Q |4NG X@WP(J$\#L <>Itk]:V~Bl[VdZb297 H" o -\RS}xè$cwgύc1x,B!@|ɫp]Mׂ'A+K&tXmY]N@*Җ!rPT<-JPVyU U,RM c8"͇ɮt=ݔ&?mQ{?.i/-TE_PPmZvu4?nQ]nr6pNgx -&#l6M;u)#/*#Sݫ0hxV8FJ q?5h{77y4(8#I{3R!3I PQwڹF;8s{e8reaOYz3iQJ2g; jE>$?{2|k-#Fu,β@97ٻ}CDz .5fcv"/ -{@i˴U+iO^ݭRmRVWn%Z&4.;!1\%8NkLr?GVFjs-JAHxsImGNEr^a菺y̢F]7x=rAI'ɿan/j&_fg"<@Š=ԡe9>:l{?"%"ZBZbFbxńRQ -Qm_4#{7Nζ0sKkS&W&U]BEǗhX 𱭘J=E߶"o\zՊ'/ٚH19$;s8KU9.Ur<`,L,HMeZ7?bUֱԅ.IAz奲$A(h8 5cЫZ "N*{\5;9à5kY Q62kO֦]ZlNC߷9&!ɇ/|sNd&#fAk9UgfyAglDž=Q/$~b# ENi͐zw3O{ ]F]6U: 1pL0"- Ua\e~W6^z,J fS8؜;14׎wX䯐B48PhIwH4!~*LS1eqKfGFMHQ Uy=:+rg燜R4=DcuP㯅yABf11hIԗ?Iu*M'f]8ǞOS3ԫl̘#vMXKut4sYoa+R'9;rݛ͓ܪs?Muk3 ~_L7wϥpq IKVB5ao;n (ݘf{?iĤ3g5 BfB?N˘aB1c X*+F_8;mᴳsv]iu=`4^xN)a0Ǒ))LXHy&VXӍmh1Oe^Y -0ÓV߅j{Uw2ByjZqS҂ctxG Kb7|V _5k.Y3zGJLn[0WQPW9`j16Bju0^a9ߎO5v[VD2opbxGt0L}mӚƺm&]6It(#  8 )@vX5-1=tڲr=\ʼn1r_Vs Iik1MAbInit)D]m٘^ ` A(c4F XdB焳[Pxozv=I%Ztp5K[N֯#|%4x34m?T?T>VۨS5ɼ3'OZ}&.өZD.V"٩)Bc{-*jYXBqQ.ARb쥘#8HCbdٻ6~q'Wj'o[Jk<)ZhFl4'őC fqQ)?HlŽ9LK^+#!BM ۞<:R`h, ܬ,oE[1&fanNś?X/x^<<ÂXNHI#E ~c8;5ʔdss?NxHjh^qʕ*LMnM#ӫZcM9vN5D4'ou^RKnnspMZ0lufay5^1 -h%ar`kP*nϔ7j@ 1Ybpz堞V V_;y~ōӽ ZPG$x8Yؿ #^9+됽|>T,-~c*0k7%QZE*RkV8{Y MQrfjZ+x}].mBAZqCYd޶l,Ubf{ٿ;ԘY_̣ d\둙r.k4#X|'ΉF&K-p"O6Agll=[%P7 VCQrUg䩶a·Euvm󸣪gtLG*dv ][1,bpgJ 6YeĬ(/G(ObFaUh;0υE+]ac_E? RM[|XLXa*IiwE$dU"ovVh؞˻HaӣK.(JP #Xa2 ݥj!eܦn؇(mLP)&B[VerB Iz܎@>eBz oَV $LJi%0oHzݫnVYnb^.-Y>Be̚y)=hÇ݋ Q^Nfvn}xG4fӻes5;O6z|H"hŅ&bp933`$.YGSˉA(2)3/3l˩Td؍4Ek.]ڃ3Gky.=I'v@?Y-_%nd>w7=i0M@ B,8ׅXjxIՕs4&|JCא!bl ؙFd-3d?XatbKӳσ6j'ݢR.O3>vq9$bTn\/$ Bsn%wr*:׭6MZi?M\#lhI]y5lb%6# -욝f[0&ɸr~.Yx j|G0pxaS -獿 +U(j\D*'U QzC(,/'u4W`|ۨ>ggfvk7Yfpf(\bj)Q!/?-_DYӝz&NҮрYWG>l. 1 8p7ȴn:Eo#2]=OӁrff]`<> N^irL"2K!AWNxL]De5ӨVv¾)jرCM3Dߙ"O4x-P ƺD WQǢ>kZ0uD.-\:0$;/<<,Z{@G.^Xmr|Q8>dF9LG~M=H5,3![TeOr.I,ZIdžp%wx,b@>,QU3&Xt~($=V)'fX#!"53i,efu[ڪTe#nd^?Drfo`pr}=)9d]~#jZ]iuɿH{e.f۟@V/FtQeG ᤆ!{M2g'\* b"#t͇֛<8&c^)C4!iwYpIopNnA^ -B:ZV*V&gQ\',A c>BٛU}1ra#0NI) -N0vt2ݰI)1HCb?ֱB'f׋VByv˅<,mRwouwdmDr*<2,CbVra]?'ozl2>&L,) :t?aXUo=n8B1YRf #\TI6Y$뼙i9^!oƷ@&d -Zіx ;TJ7l=Rq5JgGV3#~Qtk]>Xͤ3GݱDqE&+D\7q$٧ e/:ȓ؝ iQsޮZ:JXϣnC/Yf&ه̹h -`nzE\?s|Rb 2uC.ZGly0H5a 3h3e(4DR3Чë])"V*k#:{x+oB뷼v" xcOG6la gkƋbv= {./`%-gQ22t><.HmXe'n[v% n پ%./1A^ ɣ>Jc 69lcY 1ЊHi>~ZZeXx -קa^z+tsPXc9m߭rxJlYy\^#h8/vwOjzq[qv\e+->408;D24!YasbhۍchX֪*PLZA|GT g$o!c P!իk8;EQ[Ӂ_b?țOV,sz[ui\0Uo,:1(]ϷK;Z6C,ovVpq2i6ѱPdSH$5!G߰dZjb6j#U6X/'ӹ-YB&r>eGo 6rS16O\dի2hnퟋK+rOj.~y3?޽g-+3dߔfHlSGn!?=IsVG+?yXG# 3d-uyG?[o8&aVhxߣƛV]"zp'x$'@1 !!o/gP@{e6 b O6y*-[;>J72HY" IsBգ:dIJqDl1f!:k}\S?E>xUX3+  o3&¥!g[TzwmiX [I>724"Qp(#6E%Ir/UrsL 'aQĤ a/Jzkي X)O+Yݔ!Ԓsօf.?{ bPA16?V9ǃ0<ڈEިHS86Y7IrD|5X"||nX+ׂ͖̳a3=/)f|e-Оfѝʍ> 蠸oc\sJv$b6NEXc-A =Z(.@ Ugl?g?IJ:|:H'hMk=zl.y!oVMv7ߺoZ.K†:o#I@kX!0{DBq\A#?m٠cZIbLCRB,l9[FG ;7^Li%,:mrg:k7ȅJ@/16#`1݃G33{xtٶZ i%8?rElI !b;ْe#9ȳu-F~8#׺{m?'xY$.E>%MSe nO؝GRujt٫UVFmp Et|k& 8Mvk7X!/9f K%|Y'vF6#p(IDPg<erl;+]ricJ.bXMCj@ՓY#(2 e%&4liǟ͙OIHI\>NC(ޜ6ʬN7)Yyvzݰ,zۗ;OWXKsm}ԶFFAS<e*ϹQMB.^x `sx\ƟVL[Wی\+0J-L@p0Z3cqp;Q zO#f"R87uKm:Nx?d|Ёڥa[0KI"({>!YMdB좨`yx'bgzV"}uP_J+xv"HT=R ~]>x(m۴1CA/6er%tPZ)tY)ԔTFO/UY3)&'é&é*J\[{Lz>NV f&blÆZjj%qQ".GPW^ay [d| +4[q1(mD,-GOy뱞'bp3yc<.R僳wBϩNʑƓ̤mHeh1Y}Kuc[8HPEV6fo/fPv%,l;6)aYh4w܁=FOC/8g~@˹~y*˗$×軮H_܅5p|;rB)-zNlG,jWlnSp&ͻ;,WDŽe!>YlKu*.U6M0-ԹZ]k.+q jMt+\$Wp͙ڑk=yd]FYZk. >,ӵpqr}$}&vuB u޶#M'4QT>)IW 'BjSܵ/(:'^lxwOnM8T1dV]wg-' fcA*|U b,{eH3$8*-۵쀳WtϋAj0Ӏh}H6 RTթmYӪ; ғX- |Jqj؜n |XYlU8\wρ2qF=ذtzZ-g;'JUeꮗUoruZIdA,޴U]G>%ZlCcwYf ݅,!ir}Nҋ"ٗ7Mަ8/>ͧ.䪦d,!Ҭ~vЉ!??b)$5DZ4?\Qr[p 1Ͼ3>#^#Є/N8oP#n,9xhuZipUq:í_c|7m Kou6"Bo5bqE~VbٰXb҅a|06E>Vxs=YDpl5lIg4$ -$Ԣ`b3^(4du Nɺ}MV.Z`>YR$ZK1ҳbw;lGGc?w/9Rğޞ%yHXHg}%љtpauA؟?O4QO̾{;xQR,y݁b{tsԐI?oV)(OEת1\)exd5L vfwvwz,Yq'Y,m+Y""">EP~_TXYyp"3L4WίћCdWZ5vݣ%^fê]s'Y:]#4lݠė/yY?J@i#0p3whFj{.RY(ÎY-.vo9𖍢7𷺜k[C`\xu&TUb㚧d+uJalV Ivđ[>iPZ!l iJruNQgޮekykrfhaǟ~y:G۲F:)>0g .MZg3}.K;E(wipzx.UfxcRԲf4&6?ǣ]RnݼG#F.75p+مŜvS3 Sda}qlo2.mGQz-ur\˷){$|~>N%Ӊtg bJ2qv\MjExqp6"5J]5 fO r-bgQ ׅ٤gf;4u0mI&+:gp4 OO5.k~B9y=VMrVY?sMNA|tѢ -+˓a}AĂ#[Vbجkx>朄[xė/tPY8ǩ΋쟝u[jWM6-C+٣~g!fT6|>J?`8pB1̌~F{rYrT-]e0y\}ͶowC~ $hUqo:[Yr-B{ .[ -(MoS~>OU\EEvm6فwqr+XGV֯J%-RRĩ;nX?gxkfY8\cah@\I\3\m^ - -Z-jYl1JYE涱4 ٛròelaǻ61n*Ť8O3<>n|[4CƇlٝY W>U6/_ F ПX=x'IK31n}np(BiKhrƖUJ֬N9ɨHX{Y0( YF@k`߄x -NpJiU\*Ity+|úi3vSXĘLiՈCQ&;g:r4wAۻŌ!Pf`,RXvwxrSî4fc+٬覨cj b!(^ 7+M%{Ry$Aаx:Ko ]dJ{mcQc]4ؽOA[$/?Q_8b5u&O&y&Gv|~^5e.!( r_4S7E_R8ڼ<,U7|FHHK$'xwޛ}T 5^Evv& 3+ -pdWjN!tHME*&©2(`|3܂8N[5j]ux6pŠ%i@dnqYy5=õy)p5&)f=eu9TfÖa7r|r|]Xían╳3ffh؇m3wV hx~B])0gO8"~&؀TEori:mr8sjt]qL_6#+v'vT&tY4qbo sǰgV3X|͑vv5x.%"r 1eFqc>zoZ60ER'!J{1ZsnMݙիbk;; 0s*kNJ jS-i^֋mvS4 KAy5[NyV w$)LUl6{+AN;֪_sU˖V[e¨?6j2b}xrZVdd·`[Փ8f<&+şnuK LECqifnmC˫ĥ^w<2i~b,QN9IVd霖n?mtPB< xWĕq'tծg? -vѱ^V"Q`-جA;Gݍ8uyi^|2 \U%>Z(¤4^avv,Qu:+dDcV~Fy"k2>Rel_&xhbq6S6'\4,[,eMVк,(G"4@H}ӨEt*8rg٪Dc]2̗yOl/z{3W(-FۇHVmWs7ߪUeS\$7;px wT]RWV)@L50 `Y:|bLue ZN/[ɟ[wbI⮞l]U|I>~3ʼn17ω8H bO"qŪ?.ضzA<0 nM1~,r9J: smER @2"6;XXIC\`g`.A Wmϗ ~F."&h&閗M6we^E-"➔SfKEoB]ׇ H~pG5ZVC=J~ PА(|.h7WY?.0i5F,=Xl6RE?aԕ>'@;'' q%*3C"Uj'F}2w\L0ߚ<2gc{FK5*֐,xM)6Y?ƧVlKZ4UạX(_ A4mdڞ}|<䡁ω ]*'I?Eu -+QLb -BۊSQ8Veի. -!,[;uO??UXuJd\ij+ӌ2A ^1oMp0Flюv )-߁ -oON sS6k|U]. >$inPzIS@.Z)d8cf`͖l,8q8%zg q5 -1bnҾ6.8{/ -\``V=Q؈v?s1mH.ӐYGhEݦ|Гq/O 8tO)^bN%_zW>Fz_:wMɗ=*v,Fj\ݼC$l!,to#}7/+E~9fxٲ?/;>Yih߆JR=/ݏ=%M~k^a=30ԣdȧ cu{Бlut9p*lO9+E7:]7OE fnhb+3 ٲfxxu?ë<˥MbghjXPMS]2,&Zrڂ:-^( =^ ۣp#jGm1KW%gbm83G 5-Y ´ɚ K82 wD:;u<}÷w~j6hfwyu=PpF+Eʩ8E'JU5)2əB3g[U[k 7+x[ꂻHD%jg>^ٿ ߆o]8#(:!sqD 1zN .*fӆ0Ӹ-9GK2'8c#l*]V"M!M#M HXݖd1/ǩy5ܩ/r藳oH~ǡdφ[M=_ww"Gjoyfg1v&⬵fb鮈 j _ /C's~IOG+Hd"<Mof콸~ '҈2c{?dնZpݙ|^2r"8`~& "O`tBwYтv~8z԰ \+\ r{6h.2 -E{"R%H~|Bt}[/N{PVӮlam,M+s[pqz7Xfdby?XGge. cٟE:g6$~IQXZ_Dp'WeUGUd؍6(Sr]rxnb -Z=). Rm,:q3j㇄C10bcx(|48w^. J e5ө2TP ;Glؑ컰90t͈=!tr~Khq1Oc[Ne#gurg\DPj_ӹ,qV Zb%$s [ S!Bg\kO:3 2τ՚~ fYf 2.6jYͼ^Lm38"Y}aÇlc<ٔ7c8dwNloN:ѡNduo}&rpĪK } 1C!m / |A͋?NܯNRHcaDcbAٕE*Kwnap3_]E-H}-oeLu WJ:XWHR ~.@Bdž,(AV\eNq0ɟ .UAfv$ /i:uӨ.ErF:cٵ{?lg z1U&RCdP_w/YrW߃+d!^Bz^hefm1gZK;u-K~%+!.;G8|8FEu`?ê9#T20ڮ,hQӦ>g۱dY;R&RIҝd?^WFqG!j:r׉dHFpp'sW@ouc-8>vlj:{]5 w\tעl<&ye0yˌx_w&l% nI&@ĝn`h̞F\4ZCiewY/6k7Zk&'%߶Fڎ9!52gvN ,J1h@v0;p'y 齂b^vY%,+%mBb͓qgRA -h!0 mdTiߣ d#U QdHVM^ٮ*꼐>]ج:l ddv5 Hˏ,<'"3HMUҪ(k#<"L~dxg#fŨy6ǰȣ$!6g56m͕[qϜ%q`wxN<VRs7 # #pv!vr/]l|pmO0fkfm, ΧԦl",{)Vh Xy;W};j{sԗP^iNOY?G2M6cE%#LJH7lwS{ h!fyDňn$0ҧ2iz^wZV[:źq&lX^ڒqDo$1HC;'Ԝwh/E(Z'hlť6D`3rnC 8TRJ. Y]\}&XC)NjX;gڷL$c2?&$vcˤJ.U*Mo_XĠI<% 5nv?w.~'\ MA,Ys4 9Ms.ru !QV/)k3L+HlA+H; pqglJ6\xmS8K,L.SYivåd =/9?UݛFOCGSꟐ -%Oꋱ6m¨&9E.)0/e_ |_hiq~%IφG&gM~{$ acTx. Ӕ0xF15\LnߋjsRG8ìlm`=Ñ5Ҡ]7' x pҹb$0^Vq&QϫlNR|s؂tg&A!#fόhXO5gbiw$-\&m7,6ďv-PAm1gdr032Eo'2@A[д6an N!p.oy]k-eǺKA-~&Css2>гwrLQRXlCah{t9EsW;Es}C9~7Oᒖj'M30CթW[r<3j؄쥰1ފ&~ +Uj_T-aLbٮK,pᆱ)H:byJ'݌TF9,M^eK<{+4'b:1q: -+U$aA22Xu_}꘍\ǡTm;:I$gsJgCGY/YYf/LPa#}Q lCe7)lY~48sL>W*q(+V.^hk(c_PpfXaك:l^g6v,pcl݇S2f'[^nA5+퓿KϤR- pGb8Awg&Zɠ1Ub!*lG3H|1"aנ-'+*TɼFkDORY.&5J ޤӔ},N'\Ip+522υvv9݁X ڝ,V/bc'\VGReN/(s,Wx٣g`#~zP,˥E^gyJC-:dԩ!Ql[`LZՠr;L86j*ўq$wlʼf>6,Xs&i8\qU>l;prZIi%^mzY<'m233,"8@ x)A\  Vaqn?A/{֦}Dou4I>BT-d<#x2Nafy#o)ST}i~wP)2rQC'v(Ո蟑V*ِ(ADU$Z)cN@ot깮Bj.B6̼G$-ZfٳCHT0U<&~Z.~'hlN =|6"ma+{'&/.!b8R^tX/ߓ-/aFf:ov*Ò1GPGtw@A䦷0[&7Y˲VpIeJ ))Xp$9XMRɞNIt+i51d [qr|*l5Wg!h߅C2͵[3DKqd6 a`esX9u +gx^֟V'v8].T4#}n4 ʼW ζeza݆ W6le -A 6D1>(۳v[ٲQy7n#4fd lё -ylgzܸte/6Z h%Z"|z$jCv <-O Uu:VOC1x&8\Bh~ijzVovU. yK+BO ?s1o-M27V_Ksbn㟀SVNu֒Y?ٻx;rڴm8wuLg}[eT\Dj0 dh9 nAԔ/YZ@iz+RRf@.(/< )B((zuqk0bC=]ԝWyd&ė!}rWNW-i{qM+ N}ωc|1@ /Yl@X~l0I$Zcr"^e 3j؋NӏeKI~ sd?|s%nI^{;R3ByҰ:_n;J< +Jdl a-c SGՊAHNmRqn06kr6GVsZ2pFQ i$M;(h2kj2x D}'40(? GmBBrY,> - nr*roznNw?]wKj1Ms4=I?Esٛfjc3f򍫥aD/!ȡn[[bbl5Iiα9刃@6|i?Zu[8{ӎ? _PP``O5\~jkEq:u4-t鮗Qtj*5a614;h&GsbWo-^ Z> *rbdE4ظXl?xlJw 8'/v*iAjM8A -l55lbMnn<.f}p6`XUx Oc4T%o8؝Mz']_" ӳmr0ՊѶvR0e41NFaKI$ur`2ox2wZId'FCA`PoBrWK&;fo,~kombJ&[p0sl 5H+e)asjgG<[2ic;6e^`Ku_ R˶j xZ5|7n`!zo]uWYb 5ن$9:lg]R\40qzGWX'rŋK$aJIYlC{ o:tӹG}*ghae覡EӦ$<$83BGxDTJfX&m!JVb#jȐŊm]mb5r匙y3zP U-5K冦,-YÄXnV6}+3lKu!ĥQᘳd7hwDWoi&GsbC`'Xpq0%8nk[ewT-8EW!s A1S6=*I٣\ Hkf&]V 8idj<,JC{|,VYpkUfcXKx]8j 3,m4Q-bPyc7$ +׫ mú֧N1i]d鏺ߗr XlMTߦJ~\ٶXlrGcyelZj.M6'IR0E齊>rg@F5όG1F܄*h*ARr5ЎfSR>Nϛq#IK/E;fəlmHç:.n1-lyO&K~tt;G.df}E~~zO'FRohl>z=;p]a|Thh>*kv,Ij)"I4Q7@Gx[so6)w{ؗqG 0ck3 6l2t# I j7rO?txT,#5k܎I_&>HmRlSuWWu;A>L;7wILس4ˬ4B%K\o 6Hٚ|:+&CNy>vύ>QFDyy㩈W/e.$_V,>L,OŅ@="k-Q)0> q7 C(+*NeŴQۺo+d<&P`97ˉH9)w_'fBex>~˞STs}&A^ۼBäDxvsϒDL"ρfD/|Q$OA,g#d l|6M!I:ѓxm!Q7]LEwY#!C&Z;ņ(h;G  {ѤC;H XjBq-#@jvqg:7bT7!rHz5 /_g%n81(!ꕔ30jP#?'/+=ϯ/+~/]&kr% -ˉU3wuGz?\1kAE)8{6{/?y}|x_!DW'줖([9::jL*l*{ItH6&$S\L%Mr+QGuèsjZv!If^ X5Z-L 4mFc[ k7YXOP!b%}Qdk"YΧ~=?~e Qw|z?H u*(Lݛ˪Pݎs E1D.I,O!?O; q>{Bػ{X&[8 -X,HN@ -/Ȇl%7u&]>ԗ!EGZE>{Y"ljˌv␜Q"HQM ceT^NǨ  {$/|Uy%!x'iAaf)0we'leq| 5$ٳ!fc[pbV OZF_h<ц !r)̫MS]:!MGVI>N5qOVN.^`a&;WJv@N~E >Rf{33|^6/~Z#[1oNb _B˴n6.6|یsl^G)iJ|7o̢=B T!;Kឥ'ԝv|>igTGZH0VW7.* `,".J= zZɻDiZVOl ÿu8 ,fDq@b6r=z{~ŖC$Ryr.ҢMA/Zڅ5өP#b1Gq܃VZL6acl9S^܌!6n,X) nf^hf=#v--qbҤp-1YbtkR/_G}ݛyHlӱ2/l"3%WyVh]Zp0"!XnDw?3;+H:DlD$Μ%o` @]dͥynۺA!h  Q0.V7Zwq 6Dլ}E.U>+1 ɛA.S7d%W"?&,Ő=?e=;$1OdZ`⒦}2q onx͉X&&"9k<:ݗKMM3 qvo6$lÄGZC0L.B Kq7>XLN'Z_y6j\Q 3lc9x)ar0 /44D3F_ % Sx@40yOQwo |wOAf͟j}6>&q.J{qvblbكfwl0 _K7YJSmOR 8LZ?—yzvÇЄ bf;>I{M 9{C2sl8ٸ%GG^ߟamLN9GJɣ\ˬ>fڲQM&6^nprs -3.ɔ2ERg|A& Ek-}֣e-$k']suK5] Alr/]eus\rkO V,YiqgY -XNhy|Y)..~/;n"jAp Ikb|gK]>(*CD燿e[>82,~$whe䏄C^M#'f@ر6d^&Mx报RMys^,/퓺vX;hy2z{?W*ZG9;p:Ov]Y7d'M.zrqxٵps,oM>d݂ H#e%,d=Y?Mz_Dz}NGa)@_'\ |Qc33x;o lQiv 'E$m4MLr31qp D6u\h4ǻiw Ngs\ԩ29YGh8\:qbx$?\)p &Luou|)2WA#L6sN HETT*Xv͝\5(hiTUCp}AKJy3Q2bmir`fQ̷M(Ypre\]FBGB:xdx˫VEuv~ 48D7/gO606/ǖ3bė%B FM' J̚~zUTeLqC ;Eg7ى 8fSAXТXou?R\/Q;Fex#wMqSw_!XɵY[/;'HNϝb[ށo@a|8HM3[^o 7%l9E;wQ?k qM2 ě0T&Mj.Uu -yٝX/9TM~QUZ_NbN+Ω4D~>|gP3kL8mH%mi20#w8YGV-s=Q 7]6ؾ7UmX0|.JmܓVXgy=,GTIZ6$U1 Ҭ}fjQM}QU0 у{8N CDtYKZse_D"LZ${1P>[#TuJJ PXշͰßXurPٻd{8ӹ-xՍ/*b;pHYTGoY|_kbiya9 h3֠ORo~E6'E>%Av,B6Y*>ck껔0E*Y*F'd5&ĥvzwM6/&Y1/ ?#X]*E[0|g6SpOf" "=(g&#xL\IkR\%SdjfD -K[Dnu-yٴrX{4{;ˌrAI&dMբMU|J0=lsE3gMIMᒼl^fؾ&yKrR&Λ /4BuiRb1F.«i0NщOVY A^}3Ob?b)bkľyQb6fe7;Z>x;rw9ErOm?^rk 6G:atK^) _QGf(l -գ&!~^(}VwP#t+RN"؁g.97n:Sݿ75f뿃Ln 듩+e(Hn]/@,9Il =wbOo _kY: aE^Ba3uN-A-.UwY|Jo+I9{O}3dI-6{Uߝꋩ@oVW=g$-Yit[ܧ ߞ>Tt؅?eSs7Q4\K8וd:KI-$t'Yx2Nu֗Y:KA-$JҲOf TI䁗1Us5ۨ˞keduHWTub.eu;KZ\VdۺWgO$vdKbdNWtSHOyr'Zdݗ,쫘,Y˛m)muyVu|6.}bV˿X}] Q]YU6/z.KHJLkV궗T--.qu K[ҧ9oYg,6NݻwC'Y:KK.H~j.ni|J: NꔗR%m/Ǔ=W21?Wşmukk]FPZvsfߝoLYp!qˎvP}C&˾b٬jk7T& $'aֳ]d/l 'u2LY2Ҵ- ՟g/L,Vd]ɲYx K.Y:ds7u,d˲_%ZYddvtZW OjZ{&n;d%vuײwY7N o)7wYwZWodɓC|pgY)jufYNuZdeݮzIR\hIuZiZ]^ -+.]bV\\ݕX[Sߎv/FCͩd;upzGrvdCNF$ѶO:[}ٱkgb/!M`.#͝Xb&dݖӫeg(̈́؅Cdůƍ&Ūd4؅\j:ޮF'A-$/d'Zhu>s}f\4i|N|R/_YOZtVȋrY,ZgN,d w^it8-.6:~ߋ/~%qҴ:?&ǀSfY?tJotNddL'Y|ۇKg]{qɝ\N,%fx3|47"HIystĴ̖Z {d{1' !0@P1`AQap"YɒM$K$KM%$]3kȝ("9G"Q$O7'I"`hAEdlY;g\I$9G#s99"n4lI$I$9#$NDIr9Isg&Lr$/sG4sG3G&ӎ_I$Y$r9I'"I%DM K93͒rdv\X"H=+]5*ֺO]5Ս;"EUi?ªMUBTWϓTڅz]G \ꊾ\dXyiUWr6Q^&7 l?cfQz1:7 -cv*.΋B1&7~)PH+'lB"u,]= nB2UV)==ĎᖇzqWF?E^AHgŐ$4OE7kV1߃P&6ZJ[e ȼ5^g"I$Q(J%^$cn|dE!Ƚnqjq7d.4d rdɓ&L2f??%w) yIC/F7I+`B BUiC$lKtíYD޷=A5iZ06-:A$-Rf2dɓ#jے)!}9|DI$D?:S&Ec;Fz е1\zC88N$5zj觺`m:E) "XQUhtb}Y3#JIa>_^"DW$+ݎUMGՔnI>mnC;Q V(H]XVzs顫ֈ,fL2dRAZUrн,2d` U]hvwk{^YAUt=xI.!z($_ F VÛz^ A|2EU[2?$]5/EY*;FI͐ozoBOe$M)lZ} ɦcؔz&Hd2 4QO*!nNE\Gf|Xީ3^[I$,dDJFOMJֶ$GEh+$jΥEԙ2dɓ4QA؆&:E`E(v-{`7Ar2fABYD-niVdviG;:3AH^[S$duG+ EI>nW*U Dq #I:_vLVITDtfng\$!lBbid$hid*vEMԙR AWUHMHF}FչW7:ŎoT͸1GUOUMbc1 hEkwήX!ZrԽL0J%I#Q֝LDMWi-^׹j" k҇H Q(ɓԞӦ hCM_A"UoDl+Q*q՝0GA` $q!檏ꋢ_buWv^]<^(h^6J%*'KGYc]9~:QXў^jBs^vLzb^A2fFDRuVB0;Я~TASڼC6"}hoHYE% D# D;* XO5ER+Z#B2dmBhCkl&E  $ɓ$ۗV:țߋ$b5S$C:I$Y,Qv*+ 2dSo$v/B#C!E#9Ud\8F҅W{&;J$&Hd1|GC&hl["5]5B^H䉦L~.(^{_W`b/JQ$K2d5ގHu_iy歷fܴ#XtR0J9KvsВhGv%v>J]UFFLY ĝx%L".B֙ 6.|.l?؞ VL\^G}et^NhQ܅`IfL/WdobOmغt+]w`NDXW/&=Jz?*kt3=(ؼH(K%>lųE7Ed;>N/  Dv$?2w;dG՞m TL (䉛flGR4:+ KbȲ4(rg&K'JюEFw V;l+g~4Y6$Vtd:I9 WZjwٚŎMNIjv]fb&:1rR˺U]3_њ  -IC4M-r _Qo0 Nd!ɑJ1bע7}EZD2

&H!YL_G$7ɮYh&DI5i&)csIS|s=B@!IPP",VjT tV!D  I (TtD:]X۹R(&;UC" !0@1AP`"1npf3mO88qqێ8㛎Q1QZiqqaG4 -}Sbӧqg{%V&QQ8b;q:q9կ3x]DTQg't88qNj9Oc{:b{wB!*ǥ .㎔^gԲxQx%xCc5\ϫ>W}o iSYoCc<Hbx.ІݎGN'7x& &TDT<1x(f9C8CǛ1q2|?PH#|gs\D@)/J9TD\0[8j1# }.1_=c(d\CǼ\yÃ8(5w4ryWfPdEٱOb C(`09w\wgEn< -tg㥘'x uQYQLlC#0|gόvqȡ'|ŋn 4Q`C= q ,VE=ga9|ĦyKst`o0D+FB5½Yk}Do& -j: OQs<ouVӃ~DX1qC|jf AD(2\J3ǡrpR䢵1QRx^ ,%}ӆJ''ڨ`(n8S_, F`"Ƈ7u}]+x{O ("(/ T&R!w -jG(8,Yq4ij' lt<5Cq9١{>:xxoB֠Pj(v:  -,oˈE@(!BHb?SF8qPYo̿h*t6"ׅیқ'>͉҄_"60:<(*#b=,vXn\1fogXo`,ETXq -}gOCPjv|So?g!n:\9jjn<byF 0v!jJ:Ma:[iͻp^py /;q_xK!p'#8#4QR%Va0NjPMlֲj!tڣBDd`}7(D@5fvṼN - G a& <S\M7Q^0G%(!"83t"sqxq QdiEV&|9QCقh蝪7 x(1hG1pT y#53~:QYLA[ǒM -<c&8}#;8?J!SX.K?!#80";0X|Ϛ9@+}#3)Extgo`5FCq5Lt`yQw㌙1*3C4(B`8|" &n3"湣n8pXꂥi\wfAh?Hz(N@D!}HBMx74hE ?7[mh-MpYqkt㧙@Y9'c1~Ax`s3 B# = ۭ_8 -"ȈAPq!u 1?"c1NDE T#"3 0(@Lx3Jl! -S9|b*X(}^oB:JGc!fqB>3 ssx3M1ƌ(w - -jp`!"bR)B0oP0MӃTPfpBFf[C)AF.hTX(8x+1КFlagХsSSV~XSy -8 -#@bf(UH`F8ň t80W  E<gy{Y&ݩc*pF`FhMZ9y  vij5nhv<Z}:pMkc>b/ jj!`s>qNs6=c𤋮MZۏ3q0|;0Fc8o _~#E EqP|g'n TQ`7>'ϔyO͎uq́o 4T)EX~m`J,9|BWqO=@f< в FnG r-#aCo2lw= x:4rJ}^AZҎ1 /1hCJC?8#> |Qz9 qXf00 |X()EC«3t~!G9+fP ]َG6lCCV CCEx8s@x1DXEY>(:}OiێpS8 EaSg5!^o7XCYqUf<.G5<k'gQB/T`1o!B}7noM[?rw O g]_.;8q|>bx1ŘRCO1QEO5s|bhs~:CGx0 T8NH!1AQaq "02@PBR`rbp#3SCc ?"MQjsS0LE?O*E?ފb*W)E?OS)Ίr*sW)^r:)Z=fX1 5W5A4juL S?U@T%BT.PB PE PE PE PE PE PE PEQ?EPE PEPB~7hv4(_(_PEPE PEQ?EPE PE PE PE PEM? -{4\v҄Y/gz}j>{vW 7BcO}S)j5Rf@Z=Z=R<7j:}TU@4PE4Q3DBhLn*l -@@lh@&iQEtQEtQ3E4PE4VvhP:ȤrGJ'14 /Dnx6'DO1~'~'~7~iQEQECcT,BtVvhfn?Têi*uh+CtSN#NfTY,\5A}T*P -r((ݢ&v'p 5.w);N3|h*PGtzh#>j3Vv4z(#&4y 6& B Q%x'H2"қ^2=F/@ Q3jSا+@Z=L3ԯE4ê -+;U+;4Vvhf&hfh[h@*xGQE6&7EgEz+;4P1@PJaj#ފas5WuQ/hŠ(@&DУj&Y٢+34VfhVv}T>,}TGUQU1ڦ;ULvjvzE3Բ)^zWަzsN#Ei+HZ4Vjf:=QUsT 05QC'P*(r(((ݢ&;OwePE@S=TE3)U zFG`phQHR*Dp -P)JGS!@(BSaQQQEQGh1&7EtPy+\Jt -Y5OU ɯ`6*z&7E@cx. BqvG>;1w@85wiЍMl?d$Tj*i~p FתhMT#W<δ$鲷NN2Lx4Eڣ5VE?ҥp#+E<՝o(?w 0' |GSKTB -f߇3h3GҭRɪsW+(^.tiVʊcY8 M\T+Z}S Y#U7mCcAk(Ǝ^4 4MBLO5hEs@y'TK0>  t.'qܭqZVnTᱵ x8)/%Z jI_6;!O Ț;C. M3Vo)(pr!'LABLa$qrߊ5_ 41R -xV_ҧouhEIɣp#eڮ[S^vceʌ[cNKR7rVryl0 k\ǹ5ʅr sBm1USknt4gutBJe}*4V+SբR^3"NǿU6+Eή)L鏸 -xNwb,Ymmj5ኵ:Pv@q_? L=SRQ}N|OjQ`> 0^Vo5)Tֻ!4#;(;PS-=٘w9B<8rA$ (nnUCfި`xkbqAUnZGlţsuS*a,̦<6&]<TɅrWSMܥfZS۪>#(am'}Ph~xq}na퐗Vic< w s; X낳ˣ}*T^{<hm}U}T}D' χS -T*Cg]gp=4{iΪ4*/"jLv_eʽJ5#ޥc#ژ;WrqH@sQ=0XIvYZjd|f9'ӪЧ;(H|o0& -̢CuA(OE *lm@X1>EyLu2} ps9皕Z'9"&GԄ|F^䬷r(`ǭmys̊Wcƕ_NOxҞ#UF* QSW -xdttNș^4VI -c2)ᶭ9K Xi -3hp))f9jƵ%Uj>R5滻.,|uz --MNc|ԍ=hfmn>t9L_QyOy`v{ 0Ylsi= )ɢ>]S(jkk'&{y6]]eJMTnS\O%xa7\Oǜ,qj:#蜜h|5s[+&ytSJ?ILq9Jym)ד!~#\T.ǘ3v^{ 3L+0 Xèq5Gv|AT>Du)oڵM+JW̧qMFPT9+uGE>*A[/y*dzvkc! -+) -aWOp*UhlsG(.pִŠ'~UѢt_jwO}>Tv2Vq^<QBr JEJ2ޙ?BL sI;mZ0|YB?DtCg@QЏq4빣5U=,P0.B9\PWH'h: @%D8c 㢄ڨV+UGRzj8 -m}R}l+Mm8P/VvhoL`a+ޅwHq>#傟"2&;TJ2Y٪> A xej2 !ܕh8shѐˆփc]@7S$c?FpB)D:mD1n -udˢv%O)V>ptWShUU_DOPGRix?#Q/%Fu*3kQPe1BhSEh:+HIzuFJƊshʘC{ʵpSj(tJxm@ˊ UjUg82뇇ZV(z'>)9O's ~irO¹'-*Pj9+@#x !,)fiJB*:kD˴4QEZSh=U' a(xɠ0f&hO |c@gj+jZ~$pu&^GGD{9#^I͢s]{No:"Rso'(*_D8%Wp׎xQD7O/[ԃ</rtU -up@aLPmnHp9?-8IiVy| "IT;"] (|C 6HST껗Ujvqz((t,qޢngfkp*.1{pN:A~tM;&5R*NAJX-hFǏ̦`8f>U-GxXQ^!54;Aq;c2o ЄPO 1['<8rNǸ,x˜OvTo5;S9IE'uvQe`NJdrc6XN5%p΢<~㔥Ry٪T2";˂~1kx7IiD{r>?_ܥ<~_+?F#ZV{WoVJHr e8'~0hiTêLvyrЫڦԫ'wr: -un\>8n&mCsZZǂvͪ>QGVNmVZ7,Ab_g=e<!u"{U[5mG߭vE+O1 -M"~O t+Kx)ڎ)ռkx-|qZ -L -wuF f7 8<,ky:JO'>wrczysދG%G iNqVw9Kyf{vmS5 <3VjfQ&4?Eb -dn(?V9-s -ַJ79) iJ5`>JFV-woR(k-PR9<9 .P_ ئ 7V7V颮-ߩ -AFv{eR%7R -xxaJ?@Q^vU1*7tP4+T̯j.5LY咵6 - -@MSӏL&FcC$L9˽*)TxVW3^Ouj崽E֜Tn-qA¼QPkT1LSmOӻWp MQ\]ڠFњ`P_\'5_WGԢ>d'<|Fp?rAN>`_PSS)oE(Kv:ch+< _LvӵVЭuJH >{.vႊ2VvhjH HN4Q=MpNzt -/Mx՝5B>6x5>E O3/D3̜G\v3VDy#S|1"NL޹(Giʑo5X ŚYpq'R*Q']NRPuR;JE1R)R)RQh -o>m24{9)c =օH: Dhz,(:hR/h9*fOҁ]l!i/9YOD=S=H1B:+Gҭ>4S9|*Ҭ蠈ef`WonmiUzBi!W +ʁn٘VU?և^W~ -#];]‰5Q:xGRyUCc7Z9Sj[V譮OkvT -sVl+\t-K ‡_Lʉ733?ߚVu8a±WHVu6>,pSSSХJ!0QDy*@f˞iRtwgw" 䣫JS05|IY^91UsUVз/V\p~˅ -0@TiOc)#PMڼ>&EiB4bj8oѹW,Q/T/g"9'UwS{DdJy -G9pE=Ӊ -\>]HB8]VBF'@@+[oV+s4Vߒĭ}TmTmTmT}Sξ_c}ef0jK/xW%$y| -G\qq,sYTMJ|1&11&?PaBAB5P TUCPz}kyYL:OP sj?L%@(?ⱷӳ+ƞ+4{ߎpQ-}@ث(FYDloW,h -0ѢhM!PT>UC*U -JJ@>#Q sAR]ly}KnQ]S cEtQEtQ51(ۢ&Zj+;4VvhYڠjB~+A*OB:'835SG)Jv%'xG.oOorO5)TxfKy'.w4NJmS+%\Cn^-!E(rL5(rʆ'nU%kQxl(SK,T5o)xe]~W_ao6&t:)ح@~;jWwY uGXJd~$Q8_g/ "wTP2U`zVf5co̬CV64t8x()449YTQ!<ˆ0W~ -j?JY~c}]UU#7N0! -zyw;'+P4?nYxCwiʪGoW\+jiZ =Gu9Nb{Xkb1"q}5kkOqhE?T*o[U "pӲGƉ"Y{PUZh>'UU}ʚ} ->#FmktQ2v;ْ4S-ZޭObo[ÇH!HO:)q7KGhUy#Q8i,:pFDo=3_E}Á\撥z+KUaBc+G53 vhTj8}ּ<3@Ѫ}TꤛU,IRMmTj6j6IOTRK|˪E,Ρʾ*x+Ttu]mSXsUsx \> 3h V+H.F`EZQZAo!0u*pJ|8y{d!J)”SU;S 2:CZz -4sRs*F샒q.wz T3AHӻpChySUi#Tʣ +:N,+ZQ F; )zM -:`TI-~^\ Vo7U*;Rwx"謵eYUYzzq}T^= -W)SΨDb1c_f}5q}mB54B4&t9#|WWDL'U VUg&(YC1R)sBtFeSӎg8|pPUjU@5Qe1Ugwwhɧa|b(:HOwOVy)؇M 0_&w{,N~%?*; if-8]2xi<{x WUj Wu\TTAꦊ mB/rӳ%Ynh{qfҬюW(;2 -J&;LT4UU^׿=ޡ4&i -蠗EeV94VYtL<{ET沧.WCΣpJl%EZaTno=v0Yi`7 ZOrvƃ{ -UvB@ET#QEңTJP))"0^/| -"ܛMF7^P^N߇MWznfhTRSJgT) Op}ѵb} -| .>+u -r -RS様yZd8ĵJ?nzȿdWuS9`+54}զUKR7*^T⥼ +Njh?ޝZoTUh,BZ|02V`sZ>룊2QD "{pP TMPi;_A\KQC<ÒăMG=˽]ɷ\96sWOScOҟ{wވM}KxHQx`wic_05nr\:(_sƩאQ$ӠMvD@GsVYy5YzwJ}YO ֊op*+ U$_k? )ῼ(TRQ&x iҞ~nEz;<ײ.sNqEm}UY]Mq*7 )_˒>WtA)A)M*c~T1ʢP*EEP( - -m)wZQBҠjǢ' !{ 邉r/WUR)Ls@ׁLsP5ra -~Z -`5PnQ|Awv7s -.❇瓰QExnZs5S `8/R!W*'XHRˢF9UztV9iXe4VVIP=(q&DlKRFK5#ڞ4OOORz)DxmqCƨ5N?Z @⥩@uy)s b:)O Q%uLvU^SxN($ޘSǂs֋.xG Ǐ'tClzk,ta~I~Ji«?ẕަTJTLTJTIRJQ)TOTTT}Q*.>7yB|AwUhT]D ҡ2 _a< P3EA=!vS0D=u)Z=Z>hSև4~ -qhuT_{Uru OFs}[O/c -g -Y 1ĖZ >RfBϔ0 -ii#Æ"P1@=T Ы;OD*2;;6G UjUf=9/rVa UjUf\g .)m)h@R;TqN()YB}Ee;D#mhVuqST潟`]^Ry&H{+VA碾'|''wէSz 5F{Ć -PY>&#sZ(FxNģ {|qx@l ꊚ~A"QԄ(%{.*RkΩTtSs+JCOkƉoZSx(%gc V<+֬Q'VQI!qܜHqIƴY"2Ecʕ̮֨tO H详TjTgUFuQJ@T,BLnPn]tWNJW -6(iMVW0gkAՎ1ULE jcA璎 -pMOH;t]FNM-:JJ얜X|*R4%DmU (%YYfXX\'UbV1gf(o51:eJ5XS)|QJt)>I9+dkzNTJ -6:>*tU[[[`'&=Gvjw5 #Pi_|K5 #PyNjk= -s39 Ǐ.pqUpGSDD`@m!9HC5SU;uS)Jt*CsUk)rws@%д4MÀM~ÏEgDmFW8E |򢔦ՖƂȨ<ʳYwؘOE4M >Pgj?Y٢EffˎBG-WenyZxVP>;W_&U|+7Vo@mV6גJZ+SxW=0By>CT>@C)$Ep%m! -}\N]auM**/˲6 >[Hoz!/SSFODV`vu8F<%.>~4j3El+bk.~TLLomymmBsZ7)nV4(P)} -F1ܥ WR9Qjuz㪛Lq¦=*O2urƜԘS*lJ*GT:MT j{ti!>uLhu5o7#H/k0~OG0(<1k?UԡPDj8qz!|jV)ZtN:&(PKUBT=|zxS*¼>-nԕjh軃uI߰o=PGNj'̭2S}JOz~?EA(B5QP1(0ş}kM8و&T5S< <n)!BTnM#Ú*!P5 6EQ5Pq/58a{uWWk - - Q6mSfBoDٽfW_Tê2'H".'`&M2oE|~×iϯ%dph<lqou7}ey(:Sch+9boq8vc``(Nx` -bj7VFS -riQ?4Yu8i-O|47EbBWPiPD T-@Phh%yB;_:ѷ*7hv7hv"*"WuNjP=j'z"GERJ8ؽWNȧvEÐVZ|ӚS fE}9a6伖6 e ۪SYa>CJ'5@ShM쳽h)@>C:-#B"B(OT*UFU')J\v )3ΨP hR -WiTf,*`Ո+mVwU+BrCv [>oexs -*Uz!8[`O5a7S+)wܟt#R%JGR\9i sQ-mwt E$ZhLq漾ho-5n]0k៽tLv'hr~]i^QϧQ hRW9XJ%GtF~a Q{r0? hU4YpRɪ\vЩ} -W{S+mm DTkFt 1pS8WSkH7#\{DM7wεB*c*l 7yGhUh栻uB1"0iDfִ=`UoAǯ8&PZ#p#h:'<|R~?C -P(^?4%{=)flQz h; -v -s%Nq*Jsrx/ޞ;5Mq -P-)-aW ޿ QJ0M nT{gVWgyV9UVYwOEeEcXVItPv+*HrYg\HmVY E}3ڡO%? p -q%C/iQ'S -&$z禝TgUDuP T Q0y&yi4!UƵ~VVN;nEZC+^Z_AVH^=ՂN!Y<+#xQXX5Mݢotko^RM&_ԥ⧻S(B'{5-^ 'ޮa h -vT:A0}$ਫ਼RK~4Nֽ$"?&2Vդ+lj=hɃ͏Gk_eݢ("@5sTY{)Ozڭ+]wuw'pxfVU UUN»AP}B~Rp(=9[EjhV;B%L7`ry(Ƌ͸&fA]vWF8NJ4\TjpgRU+uVzSSLviRҼJUhUhU<2۹=΀)" $eCث@xSd+N#v hWǘƊqQMx84ܜiOKթN#[EϊyRIVg'&s [w;pYm*(ƉD68'TjTKTBǨܡP TBv"B{|O*igB)0@];pW^N꬏j`B*A"s]Dqxura]zyÒusA5>Q2R'׫TD+k06HtRB:>o)E?oݢ<^߽a^>I.$?;#6C4dMzlMtD.|'nJ+woP҉ qVvS5f9W?M?T*`)ƊoE+OziFu*%tP7E0x0")JaW 9+CTB)m=Ui(Hҫ]XjW^YsM{\UJ]TkݰT(Io&ygqKUeuRY>e5U@ƴVS;efw̬{F4ګ9YΪ'؊謧VO'U*J5f VvV&c*!=&_ˊXX̬,Y㶡 -,(lS;Mi=tVUf|5PzNro^2r4VR -.:9xϺU*He % .P9@uYx_Uf0YFȬA "+M&^BO& -12r"Bs`]LOq9|HZhh -_@*g~Gk4A -y7&4vM:Juv<2NEH}y(+` i*mmNN'*(-CG/S؟Zp^4;?)lxvEI }nϙZcZ#LЬ=`>LR7US9yqN4ShimGE?{U8E?hYUnS -z+GhJrVZr<~>徟kZ8J#T4 -0ƨzSwxUY̬UgnT Q>V7OU?Y7t8P::<@ݪq={\ ='| /im]De<$Q"8:)G'ޢ7:,E{#ң4 -(szxE}h)E8U QaIc*˟#M`A֜ -hLSBbhQt}TF2vNU;G*VjnLKSby:BE$Iz'8)FuQTGR:@v`o'Tbk՟(AT'*5_D)~7TaJSޯ4ߵWWJGSvw!;htlUQ1F!TT;3ኘcGFydLUT^OD])PS̕f²0p7hǿΊXG2YJST=#T P5YۢbYY44r4cO/pP*Q}< >S٫:Z#~JV\x7?|L2ǪǪqJ;v*+q>_VӧU/EbIA5t{V֏DdqG+SOE$'諎dÚBz<<3Vg-MZ]{+RT$q<|Fޠˊ?aV`V#oo/;ށ@A>ϊmV2:Jy]7w'ySi>!{F3 ,"R$S/ NA y{w-qR+&~iK1OvtR'zGS='DTGT>Jw?:|JOrܬEQxѯ*7y -+꣯QJApGAV+ɩ$Sk_SbN(#ǵhU;o*bq. -6'rRP +ﻆIybҧ7wp*'ygRӭEÎ:+7wc'Uz$VNx*N(z輨ΪR -h`LjaEC?s.uQs+y+g\ޝ^~TߥO$~tV^RlGQ~UF^e26ӆ$栏Ez(hPM:WVqJIÓYRRR}Ήq;qDR -yk9Ny9IDC --wz;BݑEuڕj:gVwuZPedqN.ʱ2\چw-ƙo܈ 8_*eH NCd۪KRiiS -EhǢ>{^#$kWz>i(/{kC˵Q1Y³5qm~$PwEgf?ң&z&  4G_ɑo4s㐜;5SU0RqLzUFsD)zB|F>`mX٪G47- ? vލw앵%$kNJm[e*"=džq'H+̨Bha=Oh?*/LyT'Ue ->UލR}JP9{~AGJ&UDW8e/R*RtG pV&wjجLn=PU<]Y* .#$;y?j8J6/wΈU4Q,Q%{^\qدBȼ/#/h.ŨNYSOf+CtV #lj.Bok5iyꀯUZ7{rRPħ7U8Q7c7bU⯫Fu(VCmr -j(UA)\0Pgj -Y1̭hpPG=&Eb(]Tnx,85}<6,D -TLJcGCQFZ_1V3W+S*VPZ=-]dZ|:cTאӚwAޚ׏yh޴S}EJ>bS)JA' U򨾕 QA_@*Gc׷Q*潛1Fk[ -1Yݼ)٪{_&_M2y[j;[G T^(}B)F?!a -$ -ܤ?2SO֏7S3J;Uh.#]ƒ5kmyKJƥǐVG%%lB(3x;B^Ӵ_MsO1vV^7ԬVq# . :} +y"QXY³S*Ӑi2?MUEDzO H#R63{¥_%=Vg r w [8".&ȣw#&cħw&H9-*/7Ѝ?P4! -ԖEz xn*RvWQhv"LWSئS)|1lVKU׸?w* -joT*I(pꙏ5-1HOwU!Z9<œHFrsM::mܚŚuGMHMw*Э5h+Oًy+BJv -q)Ɖi[ǻnj2Ny'8ppOuy㗏~ɥS]:T|vwvwkARiȒm(1 Go+l;B*؟eRw)S4$.O =5E/R#>炭Ə5sC ׉;׎aE ԨCB~7ud*H>8Ԕ:)4 -|.h*!ARxef5%4|1z(JC+')RU#Dv'&(v#!WTê7]Oj-sDK9?2LV^ꅃ Jx-ZDBthNꬂGJ -QpWFk<ʕo0㒽+ǂMf>f'iQD0Yƪ>eg2Tߏ㰑h`w(&;JtW^'|$~!urͭVM M)פ]oSiVttpT틈%[chWnr*UOW 1ªZ#;*׫QH+*'J)Ɖz#'QЪ08sVv)6Y -MCjeAXit]{x?($&cD/DDsq|^f FtP~O*,1ϻD0JԨj(ރfI#1LP6w][6{.֋xD$kJsٽU&Ĭ>J(T -V1c'U|X̅0*!@ -Nx^}x՟骳*mz6b;$N9)̤}oHOCP%pyqC1z*A݊Yd=zᵽ -c  *]J\S9潜2z<ח:4p5 #Gvx"zU0b(MO| -QEZqja_PT#)ziO ^Wj@,d9Zc<):$}IRJ+ԯO~ -5]UgjSpJS(S?F~DMPV;P TMP~G~7U'^0@GtTTqS3U35w(( {TêaGT^6](VIJ}Yѥѣ(?:{djF%W~m(O >4l -[GʭJ ^j'̕)T˷{Vp8k&I+34L Z+5?iQT2v k88rA1v -Ҫ^B裨8sٸҹu -"wvEѻ)]{;pﮫ/TLE)2ʠj90m!O^(!}Ff;?pQihQ6`S5KU϶sQ8y/uVXP>:vnoD ٸ2UʭOq6gD~쀥C5SNA5!Ч52v+½n|aO^ꋫd4PM)u*y)٪8vO+h#qqUYJmM00̀6{4vB%&4󢌇r0krvȋ˒m*pQ_i»annI5_R3=現 |A LH-ohAµHG@#<]hwrN -F5;T<街EgEe}yଞԯS1z+TyU tL <@FRF_ pJ{wjvj!ET^ETC{k9]&A6M\:_SWR*L:ԍ<.jxwb^T`v,Hy4a#};2>F-+I/ӅAoؖRScuZ~դaصBˢIZQiTTӃ7@NWܬUTqf!Jf=6xSꤡH8[5h)0$u*Rn@y&Dj_D\ToQFwDtRJS׷9/P TDo#6og0R)55Js셒c;اr*P+ 8VYy(Bm6`[UCAŊUf -* ?iA(}UR7kʩsLZzX1y$l$^Rp;G5i{%#E1.qS1;55p6Ki8Bu+xq_p{ܡWt<#JN 2UeΊ0+57rzҠp BOA]IwvcQ;Em:F;n:<դW|cm<}rAy&޳!qێh +T)#RwO5u!Rhʴ}eL>b~AJvh2@_7aQc^.Vs=Sڵީ1M@6cPx`nT#*2:4#-(@pQ})@SẠ^a^X PxozR3U+RVs$2DOQW8ݼ -gjEA{{ʿWOE{{ƴM7Z#5Upj'Ǫ5nDED UTLZ=BxrѪ\M: NZ#ŠƩZF4^O,V?PVϨ+Aq|nG"k 5_kN8WcS9"a#S)ƊoE#=FjUԩz U8 TS4DQZZ֊+<ԭ>{Nvp+@Z+@Kb\G$usFxkۋFУC{C J/PdͥXf!V8 -_{֩#0] T{moU{PjU9(QkIq>*V\B(ڐ+h(TE)OqL:|Dޞ#Ԯ&"(EDXWmEsO,NGoW21L_2H =nZE q -@YmܪP%b DӞ0W ? vo 2%jKiT TԴ-s8PUmZ+iOo &\xOm:Z<I۩S{ӚWUhf\Vj,ZYUrRқOt hZ)qiZJt*g7+C"TU 1pn䭣VM -z+Mݦ$ZS% h i"8+;4Vvh@mڦ]`AĩMP9;ĖN4RuP늳E G`T NT<'Y}jW'4*-PzZT@Ae,Q4gm -`juܬ&.ZN$&J<Ӎ[Z]Y^a qUfG]qm7+#Y9+ ڦ]<6欣PenoXWv7%IN%H !I6HD' S=E\xJڔéN1Y){7BUjhh嵁T#DΔV_@ƻaהd"'cSB iYƪ5Vqzn-ÙA W -5E|yd)Qk2 Z1Z's%C5UURIExG8QBxiBE{}>de8jևsG!]UހjV5Sɪs0(&y*4Ξ#) ܉=vq܀hLkGAҞ̼?2U aU0@^W*jʵ}e[O>4*4V h'`G$kd+J2PCOi5UsC^ -Q/rT YIo 1W*rLa*!ܔDk}SP -ZPcDMj RTѿurVR_.uV S9L+ԯOy#y5v0OMV{V@<;^4Ni*vRZOSGlޅJBl SHOTNP TCJ{lըЧcvSx`O ǂscoB&PO -û(W5F9m»uw~ۮ8ԣb\4ߒ{\9vIΘo*VיRpަjaOP2DӞ!GՑ@uz9'qOx$"ٙiL!5 Pu՞'aTޅ;Lz7Jemğd#t U*T8g"S;q%>?aA Cxq@P?9?1Ugp\>ϙ -`Vvh/*ѼZ7=r1e1M{$$&n֡Ztn4^ުCEzG|_ʴQڦLq%Yۇ"wmJLF[8 Ә/j;=JQK_=-UTE(g -h<6pWMpRPpIZ|??^\#5ÌG& Sb_dO:&14E!R;eGwP梻 / -{T.<jˏꪀjn+co @"QRP!"<]~MWh*(\>E A.o+ 軚NϲF(;?iL)۪7SU -RRBq'PӪ|ʔpqNޥx Sh_iʴL@.<!)tQ;Ey/I_ܨ%EOQQ]+o9C,@^Y~-E+y.8|c2ETWzxۛTWuOsw<_=]ڔeZGUjT -֛֭9 -{Q7WK^MoDZr ΧDBh=Tdt*2g]D QһVWjNNF3EtqQv@:@ L ;A<^+xH5R U?8kAqS.%8Zٮ»j()ߢ*Iq4ߴjwjZ7*sYԮKI?Yډ4ࣩ4Ck(iF8&ӽD{]ZS]M;^*X:VM.BV_T*SNNלFI}2ODhM{r#p92'-({RSSƪ3P(FEj1VU9QLUьtj5'މTԩ8St$EU -# -h_ĦT:M겊nP3~i>_ &+=p4ߜi@TV V-F_58HHcUxpPJԧRQwwB䤾߽e׌1Wq@<_v*w(C {Fށ+-Gq*ɮUQ 7СiW-x37s:]ƪV%iU|m2`BM$ _nG:(PɁnY4Sf@(̬YV?8Y5ƘUY?Uwժ;*@]PW{4_AV›ܨWS,a^_oi"QJ<?YOάqJÎ؄\|YYwUc?7Z'TJl(g*UP@z5Z4VnO+TeDTA%/r'ޞ9RF;Uj;5RIҭVVE5%P5籵 -@GHOU*ip5ׯŸ"|'ȋYuȨDuB Ve!P}2;~t% -E { i~EwE<œE{3}hy='s;t*֊V5mpw3?>;q;նU%m[cV0T(۩]U++[5 z+9YVOl/W,k(y2Տ -)%S mJRIi\FEObfWESp+US -V7 +Z(\7+3P1Qju<7ƪh;.vNC[}꺻K$>JZ-+ѧeEaV^eYn}=wVKO3Eg zt :DZԅ,#D -a/74?]w9S ފG&JcB)BAk7QJBF*O5sN܂JX'$mJHjgjyou!4%DO4j)EFj ;A}kpw -SH4z3oBcK֛tVyV9<ՌꬣQ<GE}%@.O|SU>$G';=Y]Q61or?8p㱷Uff6HwCg+۸#,N)8*8=sM0m`V9ߩZZYi\M RUQrP҅)v׆(8oYTB5U53z* 94Ҡ -]nkkJq>KȣCTh74mЫ@ʴ}e9#L;EAܭ-o+GҭJ+UG.@2זƁO!'ׂګܛU uJ*w -%`Dhp*~갲袀4IYE?MS.;xs׽^ʯҁ#?ss!k}*ՇO:Q6x83 {T -Mv⬪0+E:+A*ST_z^JrϢ͢LOVg7pTͧDꝕ|NƊH;ZF&T?IU>+D&#pU7'b5;5Ok=*T=校Z?\OU4Q17P@w|0âsn W0+J8T,\s;M q?:Z~?YV)px@S5Z4STpbR*_´+ԯSچDgPUSh ׂ6jMjߕYiaJ()&MNqNCO?콢p7tsYWN:#NvƧ'DWy*/RӻnMZT-=BgC*ろ6Z)VP!ܦlo[kr$A0%&h;<4wԾ}ǚm+J~Wku,TUܢ/VCTj@ -UJuO2#L*a>J2*y'Ej7+I+FW8EDtZGKRTj6 kUQS@V] -x?4歑["d20־,Wr:)Ίg"I<|p񂍧FКF60[Ǹfvt NxCVRqQ3w0և%>=qOXOw;rǪtz( E* ;#(L-st;#vM[]Lk\*USX$!F5Eg3o *Ho =T]?3iwas~Z!YtӲQk䇆(}T?E`ޤ+c~ei*WQϢ;?ڧ)OyP]xA2O*SR#_ڍ#')hRHMرPeY դj6D v@D])|N[M ZfGZjJ^|isMhE饁٭juNq#*|(w(ZѮn\6g T L`9e8VY٢hn;ZDNLM -Q~>]DGo2FWn[|CGҭ2)|mM=IDTeFpRj=䇻ƘuL:JԦb9K*;L(j`/HSҼ{11gJzU$>U'/3/#ӟ!j$k{ՎbgW+9q =U؇<_RޛX(8$$q4VXIKCId k'%#.Ol5%SوЄQ4 -GXAB&><UUF1P7D1ۖe'la:&֙IĔj{\p]ÓG};[b9'Q<'wo;ifvkI5܍1} -}b'.C2P]P6MBQBp'k`<܊UT.&&A(ZGPjZuVg;umg+ĊSi[=S4>%Фy< D"(L}S=E69!@*oDU|EgJثO kJ>JQ(m>#kS߳oQr(YmfNjUjUg0$CW^c!W ryLlЧ)NO_בNPmi 4=-…B7~# }hB -ЬW E @uPz?yǴiJMݡ@sk (6#qW:crh -;79[ʴ;Jlo__YHQau7G'Z\ze?:RTp"kXXNAYC(Y<@Uiʉ~InU^1EHS#U===LJ \2齆 }7M#^˰ƝL`?U+2\.ȅ?Jp0VgU^ 51ϧQY~p2*G3B(#pҜ7ϲ(;kB4FxY{OC5O spGM)N 2taV9zk|*EL$WML^j@?+A0j%FaTiZG̭H^T>!3D}52B*Q抵HW?ec$QmJAJ)~_DjvoVLtWRO -x  -IO|IS+[ AP}gN K# -h(QTވ0jSk -Uq݆HF=2w&P~SKjFjs;a{Es*'+Ո?LwȚWiUPy*PNS[1NhEh)Nm.sNJu2 j.CT>CT>04m {67h 2V6gki״3c]ƪnCV+UhM>%<ZLFSR*sUhLJ1\sAIP}CT")Z5a`cVv2#8DښCf6>vKF(NajX:88C5Vj,?%9'Tw^k\iԕ&d6p"Kvjl)Vl -fv -IUMx -5@CԨ}T>@ Q[]@a)r ڦYp8,+#$_Φʖ*r O$fy).sDK028U# -rQ5y!Y+ں+R0'P(~7xS>1*bz!^'x8TMUjBzm)L}0 -5Vf[Ug i+3tVp8"D{۸2jN,JG Xh -ss]$RN[qEOB'qVq -*5jvxqz"}{FꧏUiUiffk`Gͪrw.x4êTgRAw<$V`,&ؒiz"B|J~u/wzoOJ⢾F:qGsTJz);)*W\v$)h8k'}y~G;Sz)]T9)跚GR: EJ}NZ)}UT5PAoU:Gm`hR$j=& z.IVo/U)7?B7@8(Y 1hShE-8{A{H|Y:)ƪS+GԭQO{Nq[Cq*`yn\3x+mp*LZ5wE債)S//M790Qܻ璃EsQ;a;U+;4Vvhs Xvtr&zlgE^h)U&5 -2*w VE6<ԃ^q]ҹR3S- Hi k|rA^,~뷐Cl?iʴP\jUoV*,SÇ-0FNhbZR;Bkliq8wQU:UXV{YiVq4(98Q PIhX|?k5ARUx=}2Cj'(OȚGW֋>À4;cKNziD 1QH';DUُ@?˼GSȦ ܉]'xW% TT`A54'(Nlb+Wl J{OC2TAGF}B#e+u#dSM봾 '=q4I֊f_[)y,ٛӀNu? !=׷UJ6ZkN;@ 9E)ze+ljim?dU( F&m*ՍX=UP^`\1`UmO%?}mݧtdN)&}x^.>v^{r*Ww(VaOԬj5PSfs"Lnu>++SYVqIޭ8y&ѵMW%_{w0Cx(䲮v4!1); %t#i-NM%٧0 kxqMǎ]kcAC .S L@zY?IXh-\y$ɏr2&)+YK_5%XTLoW+LCp=>D*@tO*oT *W+3Q:'?OR?rk!Z:h⃛Oƒc!O+C>MSO}iY[+t"ȜM7ˈQqd {VP7fVUbn)Yf6ٯa+_wV5eVv\+(Vqeg*0;Mӿ-!K4DqQEq=j{lrV1cnЬYZhHaMahBw(mkƁa'>Rq=硪! )UNR\X'4ަT6lAE\M2pJy^nӒ5SSGA41%hc{0j#@ΊlOu@ٻżW?}UK5C}w*vةu!5eiE{ ݯw`vƋЂآb6ZKmw;[dVuV 9ckn3T%jw -P|cUǝd>x(ޮRꭚ5Oh>j7x-W7R=-R`wHR_e_hcoGG{SȕңF6~,ڹF~ThM>/z'<|lu8(LMTj-붝Wȋ.sdAڳi]v4hMbkfmdhneD^!8'Hᵽd480OQnM(JxL'J,7qRJ [l@8Q3zuZi'zAQ5Z3mc EC0?YƪϙvXkZWEeM{ -Pz'Ip鵕R.;VJ,)qzIr= 1qF -dT޽s<׷)δ3|VE?@OVv+2{|ʗJ|zzdhШC0*3z*sAuFY7 <ʋBjm>-JO5?QAU@[?3>JwܬBO507ك4;A+b)DCZkǧ+΁[&ZZ['ZWaMxu}d y& -.#Fnm^i/Wa3;actM2X2cB?{nRW*9JCԦM4괮e~OZ+8Yƪ&Q2=x/ff߇r\͹êaBB`=O ps ~O+CJ$4<µW8[[M'79{i.'*I! U5*wi^kD˴{uU51hb em,$êb(N35R+#P+G@/{>H1j) -[iJJlmU޿^9(uH=F鱭>I>*tRcP9SIHOM9 -Dl T7)+9w4 TqPbpxe1cS)ð Z v6kaW*}*C|%G.oۄxco@Y+@Z_֭* SdV5Ҝ;i>rXw,x#yO<V|LdگyK$ʮl=*bB2M r9皳9^iT4^;(|oU+5R3.(B0ZmduT;>]ƌ(&DExw{%PlE`֬`11m(8P9yjp - -9[_w4-ƯSx{W% 7x9\Ԩ)˰vvAY⾘\]<nTGRkD˴4Cq;sY)N]J֪kײ@2N.;%v9#^Q G;gAFqC~NxklYF&#c~A] \ե譯VSU5|y(UGwʟʟU~UU_w -?R4êmpXE cEFU " &a%Myh%JЫDکeH$YMf֢73'I/L:Ϊis_g+ZLp-ʩ -n=kNc.<ՑBE8 -{%YTnj) -镧W?)J׍vVkRB Z}TnHE#Ԓ'?#A Qէ1UcXgh -79&oq -v'[2 ;0}nhGhIUjoJe<?T"Ut@?J=p94*&9{ѩ-QqE 9éPy1%DړQ -ʎIDz+cP燏98Z]_™wrSQƽG$ -5 9;B*y -6*sM& Ԩ}JgjW,*Zxn)pԠZ7m+0"+ĕ?U)n*1hS+Oҭ܏ =m -&hvB< ZʛЧTVPyǵ+dګ]VV#2(^kΟAʪ"~"65 -) _=֎Ή1PT~D, -V%|\TT))gL}UEw{Ȫ0 - -9 aw=F' -4-:P9YUGt = F xR7p<_4s<+i HxW0*9ޅcxÒȬR 'm*2׹7E7V&ӪyGwǖҏ`xOn¾DO-4ޭLVcUM~=L.UPzgj\`l~@mAw${1ڌ]G!J_Dw:&=6EA@S+TǠۖwBf"UZIPPS;2 ue;O:C>dC54?)C˶ -Gbzmñbck}l^-TMhd} ƶ[ΊU[+l[ծU#b7̭תJ<ծ_4Gȋ%(Ew`TkQ6'-QB4 kjkEuSE,A`1^#q\܏T|20xv9JԨT>:;wUP3EgEgD Sbh䦾 NRީ=SiTG ORo)?f= Rɪԅluy9Ju>iD(ΥD*Zly+D.i춵4TTq;#ŝVVj,LEW.^pNA{{,΅Jt)ODp?/PTU-U V_4qFԝowBRhB'^u1;{VU+BOo'UV+KUh~wpl$Q=Br2ޠւP4;kpBO'bQ;]qcɨA9hyΘ'H8n(?T]Vwvu#$,YE88R0Z Vwv{T8C5Vim4ġ5q.77 o HvJzrSk+(ЅgQ)ZfeeTLUۊvA>*-Qy|R1ABUׂbnRiʋ[uLnȢwȢYݚv~`YRqSt%ZT׹m}1Vօnj+{tV^OHދe;U5u\4Vjm;*ƬXUT ݆_z8@?gmxD@k(E_W -xEJl}M7%1wb P5@?gfPv<Ir$owQvҬPӡWڦr#jOTAd"Ga=LTꧏTnJSzòaGuߐX7 %g=Si60Sz)/mopͲx;ݩk4R -)]]v|劽z+W\軵5sJ!隊w#RE.$SI=z#"wt}ݭ2FIV|fn,{%DBhM 2*=T,ZYumЭDj|}E>5MǑ -_%f#Dav7XzTfZ >EwcUAA"=.9iBX_ꬎYI&]>+j>7  2"9*yvNeثՌ'ԬtBbb#opDH-+.U$ V:'Tx[Y v/J?<ψOʪ~d^Be -LgTLꃵEnM9+ڦΫ?2QI)2sOX *Bm$)K)Mk. =qKݾS:@uuR54ĩN3M)ڥX7+:!ЧVq99 -fNLxgf==`;F/!8'{OyuqJ'w)Zh=';HwN>Kܚ@W+ފ -}MtJ)QnzZ9mih:PGNVvh`=ӱ=W^zsiϲ<&OkٖrNLꍶƎJl?*Z/r]楿{ot@ߖтwf -0f&׵uqS6e=Qqp,*C5S7R^0ِAq{a/=h`uz4NVFjРm:evJZrk5S sy-Z*ii:R`6+x4bwB6eؐ8pQd'LDjKFM } qhNP+뜊vm)R=eǵJLE(&E.ZM1Y%Ȭr+V#ᵱ!LmR*}2.״ c:;*]er1R}AZ*̂8m}㻦Hpݴ6CyT -fЫEGN̮w-ݗU=ӟn״槏Uj4hrosj3TNhw4TuB -_E!<ȩ ;n-Q<OU*@|Xc{?7Z\HC3 sOzsӞĊf0V;k;*Gtq1x^w_EtM -+4jQx Kxف)k]AKWLi -lwR vuLyr`w5g)P}Y~K]rʐQ<5?Ԛ_C>p{@w):cT^j=SRo2\9_})OVKvޥ8~-"hw"}$Ql 8!N)VhBGTWzzl*TفsiTKuL:Ϊ3N&qf*Iw=i;A-OxnmkPVG!Vbwk;0*FIo R[w' -%9Rf>,:`& -,H;UET^ip*V5hoJϰCLtOqOv؄9܂N*sDgj++'VOBQ1Y:v8!@r^ꍔ=|F'˜%wM1#mpM:JKt -P3DG%tOzɢZWvg7a kil -[T۔›ZqE7{TaSlx<|Բj5RaLv}j4ǚn {bqcSBcEvGehS5C5N7UF~ EOWb2e½y h.<ղ[ߩZfI)l7ޛ"l7OV -w3ZZtQzdwE(RSS3Tv9(AL~?r8Ξvec -+@0Un.^ۧ2=Sk>Ugv+,gS5p8WFGU.Fڧ;7>7pQ&KӌT-D,Qs^q۱B*ǟn+橴/V*60&}ciA Q%OFYx]C ^uvͅ8cW=ViUd0 465v=xʭ9,F hf;rSK:|m;Rx襠西#S4%!FuQ"qA4B`zui.d3ak.e`ǴT`F:'ʟOjS#QċDzx4yC5V -T[EnYmFNmQ[ᶂΦ%Ph=?:{3r_Q>B?ryMo4}wT+CW{})]8^zNX7 N0*+'~V:^0P*m<7.3G^5_cU0nEIާ(lv{#qۈUdey⻯ᣚe'Us6@2<ա*_2{E\VOIi5n`xт#Q~]+ƝDrʹ)<ӃߺꞗwWr0;rD5DपYΪ;/+1EBӂtQ7D -!]G]ՖJ,SfSkZmȅ tP3EtM&)]UxW5VE%Y&n>An%f ,P7(ݓi Lw+!G=.$)ܥjiT(v\SR(6x+OX UgL&? GQQuPJe+UZn 轪b]ܦIHNjU=Tsm4STJB|&FKpcEcXdV9U8d1cE;?y3J54Wa2Ipm;xO'tL#KIh~Z):Xn]a -4(Egn!)R5ޅISGB?E -Lu@QiDjT4Sq3WG5#uR3U35S3TGSzj;٢U|ʮa%j&)^*@ CVg?c){[=iW)zTn?ïF8thBo8Q6&*-oAsRJG)|:5]˰K |_l7y=3X>W -@#eq5aNR+CՀ5bZ;ޭ-jyC\ObO4êTGR*:(2W -l WH岾HsG^*epb62J29 -N{a -5RΪJvגs@8*T$"f0!2pCCEuQSoU@!@,=9l;PW#D4Q(&|!܎#QSlSl:l?*#8=E>'Ȭ$LG'6/ͯ;F9!Ƽ {irXXUkp :'Wp*YuR˪]SH{%nv{0ܭr꥓T`mqᶸI3{!g`K 6:n0uS؝qXr Mdv){te;6OrLDz(cSk_¥j^o)OC~^ԂDJ=T_g`k%C\gexlz4a\ToE+R;Ejp›rd9VO7qlL8`(GJ_& 2;|>̫V[_h;AIuLШƉFiUiPŸAZ_[zRx֜F -)R4حzǽLp'hȴi7u< <' M^* -װ BLFz~m Wh&O=7dtIiGT_NUO#JQs^;3O>(4a%h+<@2όg;duXq䋁F׆hq^۟ @<{1qڨgk~0kq1wx0[ր7vi^hS1TsjIkLzMr x*c欎XOԠ,؎7 ̫)u>vև*)PaYO̬Q)%;<MTSމ<e?24*Ƭqڙsر; &A(Qa.[OU!ْ:)^zC -TWfEET>X* Z(Ɗ1&N<l #ZyL2P4OTB:#Q]6՞J}JuPR;YY(> ^wjoʡnˮD;sO0PRk]96Aty&I*(1B˻YYDo0&'4j[ܨۚjBZY+K5RD0]Z"E9+DƝ@(Wvɢ2hvF܊uӿ'kcx';E#h%c:V_8TaJKZ~~[OkM^B LljۑWaԨJ&[ZT5JZz?QSWW@ -=S.?o)OS;2\}hQ\VJ|¶+a>JEh8mcVVU5i5Q?PAGwϳ-(wF^Mwu*_ڬފZ()TުK#i5iEZ~GRʐ] -4Ӫc`)څaP5BGb:=PBB;챵fh -6ڧէ}hfhhC%hNEdhRעTI -D!jE!SԎAeP ?MNJ#SڈDvlAA6 D"ڤnVj)TD])QDPTMA+')RHQ0D֍D{d <]999wDa0sLiMh*!E0hP7UQ([ j0j`M +"4D'1S1S1R)RU+R;T|FA63G1N25^ - OJpR Y"Gq( !!8' S6vڧ -mΉhzcOP VqUD ЈN -R*GjSν>jQ5:G‘bCFшA 8'=H;5SU;5SNDhtE+NP@VqUZbc \+)=˜~W~WvNWhm jR% JST! J&8@NE!O:g1yv65D)٪ڧ -oE/{W^ר\:?@5P ShR)ܦ~g~W~Ģrgnh Pc-xE=LTI_$UBZfVjUA>6 jfڥOMzB R;TI}C,!1AQaq 0@P`p?!DP^~vJ819~|Ɯ;i!ڟE')&9RcgpA29a?ۂi^v}iaBaF=.0"~?X?L_p')?ƌGgs87𕿑?b'ZkG})*_u|0^%B{'aJrigs> g29^?~L"Z|Z{n?l[ÎA)(Q -ڷ,0S%TV5xU6Zx4 Qo9F #._hk<3k)7b -])D!vYPcN z51ŹzKt)fT&?KSKe/Iel9feZr(o r-\ۛ.AGm2&c7뎫:Ρ uAFV%1VZ2G(C q{x*wƂ:|.(!E ji}S%y)Z 3ipjk˵Lx3cE_4)Nϴod_/d:h/dӤ{A_%fSg͚;aʯdjmSXEw/4ԧC9ݗ:),0v՟ք㱀s (%OgQ -u΢tnL<)3.c5-sLk?bI58 ~[-'s|W-.\[--sδ'Ru{Qn$u< 'ZvBAȝ"a8} [KtڗN:$ggcoR<-hMm秤Va!#Z%iwEߕ?g݊h^IˉI~ ϟٛ-1~#({n )8b _:r~?|ȊoS>;^?H.o?ϝ%:{T%<-t"53M> Ex ^<+Ub/<0WaXZ*b -ѯY*hsj];yNtC-bQYupm,n\*虣{٢|u'= 5_!!& &p4SԿ>xDIhr"]tKy˗c٬O"平vrY'_/zzKc.s5%M33HYw;dtO(=' ?OK<Alt+b#W?c3ڼgd?XJ+lVKvd~I YH8;u'? qQ f5'_cN9~%~ys?EKb1ly*SLz? %Qߴ'+ϴF:io h~mHΝVu7Bj}cRrS=d~y~XO~-}`nNXu O^[3/|ϕ -( :oa^f~{ -&'βuz'Q: o՝ge%᱘ ,`#(o*$#R'^a=& Z[uX ̝t(3pU_,8[q> +Rp<_~?ǔ~ ŏ? xrx<|ox~ -rncrE#xϟ+xW\/~+x_o Nǒyįʟ|l,ӍTgOrSKTǐP'!zۤ9Jc:Q^e -U8I`'-tGkHV/D sg^*_ r>#>[_ =yr<1y+x'ヷ - |H&5>3112Ǥ}w; B / -y:QfR=,7o/.q|17%E)v%|e )W@ki5r]`hi/r\NM^<*bQ)Wzs݈W@Xԯ J3g0{Μy Ϗ/I|zprJ2ˊHpφ\i1Yaa ;Q?_I^Jm261(J6̹ɄyY ZBn#ޘfjUJ˟e\U´OXc18)pq/ɚ%.֡&)lGX&EC6h8BV ~M%CyYK5 ׍awk$r7IRB -^ QTI;d\KDR>٫(Tc\/J\A|u#p4R:Gv;ȸpg6]Ǡ2Ko,kj@!;FU9iTa%[bwW17Vr -;{CE 8mp:^:T2l W .^Qm[ʼn50!q@aguolciV~R[r,ơ]7oS˟Wq-o92,mֈ"J_j-X0eR~ert$ћ#3;I Zr!Sh :KZSjMs%(_0mRҶ‘&'&c -9h|󗤡h].;Hr'U+Ht⾾5v'5Z_D<pzJ 7cPiY˩n.!L7 jS$ E\-W^,S -, ^ *?3׆D\@305>wbQlL^cf_qoAWۡy.WBuM3qXƥ娘)&rO:*sR׽I8Na/hw͂b)]wri ׬@%V=%F_(f YKc C{B.xTS -J'=fZ($h!6GWòUKf?_[1/(ҥ̫jxgt1`dVv@Щ_f^v4|`xRv8 (_D S)֩6NnqmM A.!H7F-*j2yg.t.993l(1^n2 mռ^V:`R5GqAZw\R6kiżSՃɠO)^IIyWiTρ<7-3f\iC~z-(("991Hnҳv5%*K35+ 95S+gIR(Yj>!A:xX1;WG6HnڬsieAp_yG)І̮ӸY)FjGQ9~N>:@ehgAĖwA -UUSg(BIPhe|p9Z`)M@FƎ˴ex[ n6e[>N?>N?6)t _Xmb]9ӝt.*iǎQ3g߄?W5JJh,z&Vc;J8 -M&:vpE:E> bJ!ў|]JDMg Dab!!S5*_i>䁗[k CZN:S;ඤSmbjq.Ĥ/Moׂ牿 -`-¨YiEO'+`t{ӋP' YLv%`s.S&I乨Ф|ozBzFppprMSZL+Ej'9H^ t7^g]\W2o2ܦ|[5Y [K>2{Z\e[uu_.,6&_7fŵ,b>zp×cQzSIE%) wNز7Gg4%n俬WAbѵSFdsϗ{[;\ʿ3{?i_sgyn7=v%p5LӬt^]0序%oN]>,/Hyg`hf\=HlM .]]fj+o۞ Gr19ɣFO r _Rsi z"u1 }H^̍C <36_2)nG\࿸ekQMgʸ -:+0!ނ}SKǺ0xp\vf)9t©S ֘lux߾/,`hoR4D5&~i_Oz ܚ9_q/'*i~B |DO[/y_C:us]h&8かݜƵ4ӹ[1U Wn"G5%7՗9=P^"TBMGHp#,Ȧs D %g5 nƦ=hFy6PO|DLtD.Xg#AЖg#deÜ""\^k/ǨmhxmWBZki-V5;9jx4p8iZKU)z0#5p EY(f^W ϫ0` a̧iM:"`ij^U_Jrs KbJn''eH>_P2ק`g)(Qű}fzw̧oqG&?? F.RkbZ7Ӆy'ZBmNU%_K-bK!f%tEO=n u2:Q2855zd^68qW܋}/h AUAL LN^ݯ4E/m-0,gה QeˀNGUsoWf1t1;)ŤӞ ~mUKS ~>T89@}q -uˮV3s_1psΤќ(s4PMJz{O&(/|<3f׋F.&sD@9x/ȫ Q}& -s].I>`of?y-%$^!j|'=`YPal?d/5eM'G;RHvo=@!, @]P#׼a[YjG#C[oU塗\AC;w: U W 6`5^zuj5-\}Ԙ E46ބսW7&s[Vb _KS f/"eIMO7Ћx =h[> QE-n*GegQ3E:cͰHhu}zf0:/SFvt$:6]7d!ɲ{k <)yPÚG H'(kǯ~i'A8;SU-/2wlFjR - 7_dq?p 4.wWGv_Vڒ<X'3S:r(_^Ŀ/d^\X~Q T{E '(QBuY!7&i֛ V$gPaEH5!ό ,tcw<$٥iũ&Hv]^>{SUؠz={ -CñẎ.t[e;Jo2Z4|x[ q%);^]Ffsm+ne8偼%#I8J9k$}X2Wp/f#bm8oܵ\ex@q>SU~U)º|.?S6x*j31m/Ù$40F?S8?hy'\ʂ37ڏNhnh9ZRY]ʈE|&F8$\Jt\,ݬ(W4`F2f 1PuW!ޜ?140_~S[HچoփJNX7_$[خU /2Q{wXv4pNzT_K(DNT VpTMSFxT[As6CR訪%#F@!B*3T MU׌sKTI^|8>:Ҩ2,nDpyO}u| (i -NۙPJͯu&"22rDө -oj(4Y#^üԎ !\^rCHjMMk; 3ޣUPa<.E`U8PS\GWy^C*kdK%+~d."6j&6]~/p cٰ1aZ]*EMm-m.P\wNmn ٭Pih&]x=B=`20&EÎ&V%Fhz;ܱͨa`0.2Q Aw3FXԳNN}J,US, m7_-}幻u>kF7l::{yԘj oCXx/[G\3Wx9u&O[DʜIK$a^(=s-4 1eT陇5% o暉Fb2T%UP*úrz”-CʷoK}~ CfH{M8:R[ QSԩ4ע0K3.D iַG&=J'mo/jZU~]{nsjǖl 3)ԍT7-%pn5TvC9$B߶%.KIvBL@SJ^%@ -u[MTZ09jP@d;ưA_~E|PQ<^]فv;0j8WۚKRwzC]#b:D({ [J'fԚ&X/_I~xE郂XRptw&_^$) sȹbmO#l  -~uy?q6E|xx<@7uP\(U@6b2\U{Q% -Ҹ |d|6wՇ[2n0 -5Y`"vE7Kd[m|㢽ۺx/G.L%fm2vS)7rf\<Ŗ\ K}#tV <8)̯ydV͕X91b{Jde沼NoEN^ -э}m[Pv8?fe3O 3x QtM\ANI+L,_Hިi7ڀsMB9&HkqAkFj覓 OC=a Jl!0% |cWTkQovv#/jUk<:i>@\/IGfSOCs9 )3yRu{;A5LBpUzef; qS(,6DML%Q?DO'H=}N x&wHwbkl]URKsdpݿC +R\nPz1f,¸Z}A:Qn|sb15ZPiJr'NI }/) ǩ|9] rzr~  Z"JQ-|Tz] j+_uݒdF/a9 ha:s97q ܎77Ȩh6n4%K8x(g51)6Awy믩"YAWSع2g#gԖ@p(~q@v,bu\|)xO3Vf-: {c枱T[^.4Nݺ>S -1vE}JL_Pm)A_%59Dwf7c> B i)OD;p{m`%|y7Ws]c{3;>b]ݐü:|F}% -k78/KQYuy:񯏯xi/ O~OգF U#39c W%g -du_dy&avmSuTͼaTv5pFN|xHDVqDo:~ -<ʯe9戟Uq}:bE~+Y 7Kj\2kb!X=5tʾ oj`7ZPW&:@W|A'CdVza^3]#&yk 03jptfQxH^rR} mtJ05KvW4CnTx;Y;ϜM{[";AP{?DI1lp3iI~2NKv/h_i昶/'?Ȣ!`<=[ɨO=[8D~K29oOR-j.!z}ЍgRs%%-_ 6oyQ@h4VXgO˘uKƃ/U u t-a  9D;M='d)s Y錿0t߆#WC -v`f1RkDIך^ftDzr.Z:B| 41k77xCV6Ъ;gWikCKIn -I?*iMcÓ5.qCPW֎Q2o,ޞgJEMP``_'D!¦/LPmה|O;h^DXG+B8W& iU튇r%W;0o2s;vf#|培񺯗DyW'￉7\Ep~9+ȿ ZXL~_T ʚPd%Wuv\ś蚯24}&n* ;Y|[zZn&LP mg0, ȨW .h^XRR.0>%-^?.Rɩ/ /-eW%j k@Ayh,p. -HIiz#7ҥ7(] -͛%Oh 3ZLX+T(ZeZZp=gta[:Ko jc}Sf"SLs*$4\+ -fo#; 3 -g   xB5Zxjg>,1Ua\.J!; 5yhq†s_W~6<Oo'W:nhm_jeRa[VHU-s v!kQSdW)k3yA{yfeoRXKTue~{Lyf`؞m8WQxEzެD2i _^PˠmmAm2SXPnN=2A#IP+4msN$60 .;LZ\EO5T<&g"M3aVy\uK{{;[<}*QZ___CXNLZNt'BtB iYZW -Y^iP -PO;m_(*g UGBZ-nRg"|;F+SH X>7K5Yr=૴h|kީFI[Ɵw} -Ď(&z£ȁGM{yZDfx]^o˒*NabVbc톹ВY? rs.2P/&|`X%ǚ50Wtt>wws'9,E}*ݞM?i,"V+FRn$jmYcݣ;H -q?2W%T [PTY῝\o}dbt9R=nMMB-EYUG1 -ٺMĻbSs/(%/] -ٕ1Q ^ Hw箨t,&C6Ž/R`4< -^'jXGG?CK7!gz=q#G{Um| - wPsBk򘍷ű6g>H :8 hUX4ѿ9'0mZ~.LsBV/ծwBWMtdmʾmQ,F/ -il:xAr:Cikַ|ֈ>ujs|<-$ڰ|VI(ۆ|Do]>_閍}Jy?OOĸ˦vGD~hw"[KҪE*O*ꕯ+È5ԂS_g|.}~>ZPhJriR;'<-r yjB`v\"V#3'KoO &sw}{ZSl^#M&w'+*N) u|x E9OMD /)" yU2ΪDj xp'TTq4@bNԑٚbq-d[w/U^藃p'岞笫A2ݍhy$8 +1K+JS]PD;&W3_OhGP=#hJ -CYڏ'gYW(v;3c +x6b,^G60W6w“z~oI/h.Sgefډϼ+!y%XU -ir~S(>5>Еʏ;= -!@r^O^|O"W~=]u/ -e饔1|Icfg56NtwWfh8lq )[@u{}πX}4x[EBxyx\diQ+C[`ЛkҨp Ī˧x gPwe*xeʾ9,5jb #`v'67๯O#X RWiP%cBF:Ϊb.硎2TJfnw2ЫIR@D:݃԰hY f?Hk8Vc-`ІA`Qu:Ej2CdZߛ|p`WdHramзb'8CF~'ΈoNG-]m߾s;6吇ߊ֞{u{DU5?r/vs)AOT:mH+#3wEta9Fk%}K7_ 3/(p#Hd-n9Hṷ_C+4DۡA(Xhlko}z@#⩤tUÔEɬ=')G/+Ez>] -n%/o=~}Xw/_MʧȖDoH!iMP_ԋ{q7Bi֦:})ϞMTXҬSUOon{NpK]ja!A&;:kM~nv ` ylft9l- 8/)3t=_ѥNMjp_S )ni+ -q~9iMf3y_ELF147&PR5Q1uaE&aHv9نj-׃Ӆ=cT_/CO,fY7t)+oT3 -mbPHA>hD@n,L{%1|U*Im|߂c|c$/A ˼@%`$\LÓJ͗M"ԕ47 wO+~Y#/ V]Osirܿ@`?1@esFf49mW/q_s:e<Nn\&.6Q33+)\iуq1|#YX>K&fZ`Yg\ )I)N<04 u|iC,QÏO"Dcxz^es şpk%[(sq)N5#m}Q~a|8=>_H5_?O' ~?p'U@7p'wpt(}MRA&,}%rsDI'hLk -R)vQB19KWJ㬢67trsAdzBɊ{2XWj:01_:!V -4Z.<^Z֭´ES2%k:ա4j,G+w_8.#F7,k QŨG-^ɥªH:\A\V*rb>{}NLyrٖ&Z;-^ jOJ1c)s:,rʾrw9~iUkr.IϧXTԔ72tSxciNP3*yxvUIwdH/cټRsCART/:O9Ϥ&4!ko2ҏ8 3UwywKG\p{OLk4AGywWuz`yX;v_FhF\x˅q|6Os?>7"GJGx~ M8Nue"c|wC W0uuU -+=F -XK ln~؈׿0:g)Y+TW-M#\r.53LZnW؛ݼޙ^5jxȗEٕMyx90ΆW4˂oMܡDk5XeɾpU"Mt[j!v=1db<݈׾Ow 0*4w3yCOTɔ5>2Yp߈p=_9;P_z%hlQ/xyǓKYL)译ȶ'$+ia/: %dcU#M=}t9SNXTᏌ _xg{/ySV}PyY_Af\ -I6Or&5%Σ3:NfQ2@t&kTB ЊbfeߖŴuu7Q9lSKc^z+6ku;YAFhnΩƬ:sidޅng啀'shrYord^' ~|xQ=#Unڼ(\k~6y$71`(6yK]qS~KXVWTF@bF+VNK' -jD:y{̮Oߘy[On Y /lϑgӟ?qtr}7v"!֛a,Á8MwXE] ^AKG}c==28 4 CA%nCs6?YK>"P6GS?Gmg\$.Ӭ%ҟl2龱OOD NU}ғ^pIן?m6V05Wy+)P1L􇹊ObyhP|#b_ʮ&]ZdN">I]j{"Ai5K긥? {DJ2.i2 3;__ 7KY*^rTzΠb9be>u -pa]pD㧌!n~n\򷁶w#̑ Y=u+"KTcv=?ԅ)7Zk0aC&n?)1 |;xH__UAw~Ө{?o*ktf8;S2';ڒ̬ڼ):J@?$\_Db+]?,`+C^ wb;6<3HC٘31zwAԈ-snK VTeu򙻎W<sN:W5*&(hmx$)Х}ny|C`z tב? \Z_tNV<(6-k7gﴩ5h0<_&Mny,+@#Fhxvy R:.ٝG7qL'KʖiNS ځ&O{isP4ИRp† [eᒊY1: -̈́Rx, RC`D?4.376<(TPcy^̒ HWѽ.* S9ޓPs@V+1+h[Y柛'єWYNN_.[+jlj =bY,[R)u:n4o#9eѯ|h93(3:@S5v!,H'f|UV2h,vXVۣt3; y0B~B Okhu_vׂvrO ^>7,It_A0Ov.h ?KqML7|kb&2^8Y9{]pk>W,FEC^(QbrK6D~~%ZBᅵιFMBgQ~fAC&oǢzP5,Ʉ$j? (0u0|uv4~i°4V!Z(a -l7o ׳޿R \@FUs.GVry@Y(h>dnXD$7VcR5+-Oع8p60ӟi~.iњ淥X]/q{3$4XjZb[KolZCi}8ԯb="7NR&7]G\+w2rV-vVL3+\;:l>mڨ(8(\34_Ɋ/_.<Àxɳy6Onϴ ˴NwCnJQɝ~ [ rlǃ5[C ZBWd}]:e* Ew[* srJzk%tc ߄vCS;OZ+uT,>ɓgiSm peYg!O\!npBѻ_,e]u V4hl_"K3 . [wʠ;ۄ{ x_`uBLئi*T.~?%/dk\;v s? hx~/Wt>Xş%I|㿘hA-pQN Y/$Ε~WoFePy'.^!!NjRw'Ƽ7ċC)z2'R/)f $aZlqYy{q%rx(m?Okp/'Uz'_쎣>zI駣Γ:?|̧Åh'Z;Ghbtuj0"&sa 5"n !>-`ΦX>xn/kFw0eFb`şK8tvpF v(>7ֆsKMuUJSƼu1 -@CAcfeENE םm1Ǽa/̰JDr1^; -XKi;5߱\Na]= -eũTׂg:b`la?bWu}?y9cpt -jn),|C&^Q -N̴6?o&{LU2Mx߇Oi+8\6t͆x|K-;Z/5_-Y}ٚ:>CxxCyJ?, {t}{G>U xq+5 wb >EqKXn} _Ho|kZwg .ar0Ņ؀[<|Uu;ARVmW-\O'X|m!yeÌMDzQs?W~&O'W+l?7wׁN6 -̖=y -?O q6:N<(ji A\S1kݬ x~$fg-I,tnNEd [8QTu} j{'"ǖ'>o'jJlNKN߱J<XXݷKsoйՇ)*w‚ʁ5G9p3?>o?}'YV<3?T82} Yޟ~Lq~UBsVhijȇ -GC^}YYhhAo{!.oPѥ6:2FYݐ(^͹&݃\J>? =f0" W)*W§Ɗ(xEFX0FVa:dհ[Trh˨yt3Z13^AAJ|^4$Iy *V-kxo(tWPуtuw|o;fwDԨM2봡a8{yxfXyJHkz 12O5G E/L |-S8>.YlsR~/w}1&yI3쯴eL(~ 9oBeOj;sgý[sѶ=^uQuzxӥ*ORzjXE_ϑ\kɿNe!7xfy}}~x4&yڿ?)l}RWK n{Ě/YU?cA~$өs%xcZj_R F,Rߜ4P)؋=^>7Hjaw 2&@8ǃٽ@1'Dfy|B7#󙫨{S bsJ]8X]}RpY(=s8NjVr,t.=~τd"R"ˣ+.woXNH]p t،|*k t* lRe#U=@FQ*g ӧ(*~; c㟌?^<=7d<_N"c׍1GO ?-G~tJ3cF!T)aqEr7xj+hX3H_(ص&!+ y.c 7$w+`eCΌp__?MzTϠ_&1XoCS4YrR$X9+_q~8\~; 'o7a(_[z#׾S|H8>E.[mt؝Nz)?Пҕ#B>8J|k6J!v|`tGk[<P_8鵌%3 ]hm˭)w$iGi #{0~9g)_fZ%L2mu>[pހXxlPKk/`HG,GW7&61J),Û+É,]cm TsA-0fPܴssD0` qCy{h36t@+c -Ii] R#%zLu4?; .]î,8\X@K>rЖ`u*m>|_%m=]e![,.;9R\\hׂ3kzZ)У֪)X!Oz%<^5.}j&U' -?9/+nֱin?8#] abWywIr2" ;<s [05<Eۅ9kZ:q`OI*,MAv{|0hϬ:( ?ߤzd6E}UyCNXl[[{K'IlbpUg 1X8l6 -Ng1"N+Huʕǘks࿌<0ו8?׍gSWXiO'S N9c?:p7}% -6s'7DOm bE īZ`oiq* ; Pf?yC%^wsɛͅ#'h<\kLcr :Xm'S)v(Z T9}kٍVEƺ4e'F8FR.tˊ5%Khtik1F%i]\1WP8(ۙ[FxgMV9T~=a+4T7"K!^Vk]>厇O1L|'?G>}-tqJ">~µ5(nu=,~7GQ7 -;b1S8 -ߒ[ȠZxx]u/0/bXg/+V w)4-A50 KeS^ir ħFWcYI5?Gb_b*[fwÀY ^dʶCU50iH D4Ye._rLQr>ɍZmtG _ico:9}ƃ2 SL* {05 Yx}t:.CSgGX.[mGn#--:,{}}63Sy5%GWC}LNonHߴJ|bY0P rxsU UdnnGea|y_"׎>dҾqcxUrв- u2AtoT4*~:r ':_x@X˶Kw`(6&x㇫g8y}ȵno?Ɉ^FU2@QoJD#1L5 P ynhU9j MƮ-Ia*Cw -wi:. cLW .z1/^υk1:c%'-8M pF[ns󁦃df/f@u|[x A7R4_FyJ>{jp(6`nS;p. *7d W)eCc{k7fz6׍J%ZWXB+>[ e^jmfyM_+HkG^*avpP: _AV`+x,V>jyL,D>h4LԖ8'mD{.*_ƭkz/! myU/6&*1c0v1Bϡ4ֲ23 (ne6ogskZ*I:| -d&f K3" :Ȅpmg0iѸĥv.obk[yL@؋N_ uĩnYw>4éPgG. -aG -udcX@ -)^-G5[n$uڵ@w`l]oL\ڌ.}G R~!UaZ_fBϔsK@|+f`wc;F?ظϘǒ z*n ӵ74c2|+gA~\3& ^vlߕ^PC8T/ ->yƼ_oL1O>)~4ŚGœ;0f +_rVi0U9ʊvO eT2;pֶfr xk,eB}(:H G8V -I&o ,:;GHmp1kKcLaW' XܠmSBsl9:؄Wf`RJç\ 1[sʮ\2ޡ=x$" OS08ĩKН?m@ZC j3^sO|D~i\<50m}F{g# LޏFCNǜԌUCN6X"i!Y\F4|%{7d?Н5/:ǐͼfb/>lu+W[gk'7D^c4{r^H 'BД -˺GX_\_3y}gŽ^;}# QPۼeT{/&gVGƳsvAr]?X<ܵLQe"F=>ˏ_ -b@ -2jބN2biGdM45 a0}n -?l1P(3o:JPJl(go?*ϻMO _i4 l{.]$S=#ۯ.}uܼw3ZSUDp -[1=QĠߔSc̾fˮ\<\O wNLʞ -D{.X;w֜)1cR\?,h(zYSk,W |-B"wvkͿ.iCaE05Ϳ![ʃXXnVǖ8)-3ȄnKEkgp[P+,TGǷ>9:#zhiZzfR{!3taR clLES')[ЀлIDi`w`G P):#P[Df#q?0`oNW> -?]%~蟜JJr&G>U׭R@nP(PErG7b'zki3aWgX/V͝w%qϚ6eȞjQ?œ?M)SOb'~Ӕ:) c K|gP~37 cgUa8,@n0J1:eg ;:/.> -%B_˟e+292{H<>cޔJLH4J$ֆk<-ZJp%+ɎԂ\(j<:ܺn$vm='DJυtbnP0;u `ci'kcWP_Po9d5xK[Nb3~ (.P O2yOKV*W$&ˇ~u_ 1 פF᫤t>13Xq~ *s؋}U,VLM3oegVb -!(un(X`Uʭͽh!JP#43 -. ~ T:n&|ٻ#JOJT6q_9*S+pr,kmAU^:TnRTq6gKM  -YrZf*:dqsg>'Q ;ëRт̭3lbXUǃXҺ%A;N+g_9AV\gTTKќ6)va~m%%:Y 533P_"aEx)ɒW.D<p$ji._J^̘Fܤ>zN j𑜔08ȿ x|+>`U \h'Ko0c\]E)ߌ:OwLԦPAʘS9:>pƥx RBޑnj}"W~W}UO2 -vՋ~l XlOk03Vbb_ ?'TU2ʽ*öGz1ß337i~DBs?}S\N|k1HMo.zBBi<֛сl m6g;ZudX&4k|s8!}~rg3fõe5:ܦ7ii5⓭h\@IM>3$c-Vj|ʍ+/h^!!ZY5߬Lmcњ8/;7d9%Eh(5`F3mc?L0UZӎe奲֌L<>CIPͲw:蠳u& .fo69WR}̪rd25LyJ[ԛMs7uzzS"ھXIr}bsN 6\uvV.\ 5ߠSٷUa3?\i;{Do/BgH5H#rpD4֚d]Vk$4,r5+ࢮZeRW -X˼K3Dg@࿡(q$+IMqM{_Η*]n~?M~g+*t~STblfzL3S-o`#6>cZ׸QidM Y-s|m/Z4r&NT_Wiۈ49L"3Be.63o^nVubd~NuF{u9tM7颫Y" 1Jc. m9RTu1ŵn6ʆdft m-6˜?ηXu3ZT+7'H>i 򝼋qfa(-:M3[ %ZP1:>l?kYIWPɳ\ɑ -z3i[BJC,y!h)P"R~W+v {ȁh¼>ć@.HW%g&X~yZvls,l2ܥW\@;nƜN=k3o8J_:F wJ/iZDexw-cA,ۚ2lN.-h7K)M<,.MF'm'iQ -V~?DO&CTl&^:ҟ Ncy33oTЊdQ'T#Oֲ|1'v>\"O;qh{l6}D/i\!γ&2sYCo  >w#wB矀dd}uņԅ)Oʽ`._ʇT6=x~gmZ-%f(5lsnOhC7N=.fDf$K_NbyLɨ^zdvsHMC!(W)r|;iʣ&o0xIƬG"1qa4gKNt<#qH%W`F؊f ?%;>0-c`6^i]P򽬳e& #_OxCco_q`9#3rU^a Mm]aO(JaƝ(zg@d*ǀH{rJ5rVRbaN7Pt.,QQs.\@_#S5]?R-n6_xk<Է7~ Ϟ)uܳk$1Ѵu4EZH+|[N5T^]"&|1S"}p"1ĻfX`ey7"Hΐ֒n5A~ݺV¡xx1}(iFX $NkNkG<<8bjӹqRkqxCf\>X?cPܜr69X6Mۋ[a j0/Xt>MZ[oD&otXk5 -MB߁y\iEWx![ZW,*aHx#CZnW ;JUt'G8#)Cg*W:sq B'r| gݖV=nZCCɀpz/-@ l?+иs_2x掍Zd C L\x'#]Oy|4S)]{BkE$ꌾ/3߅W]x\n?",%e ڂ-A4vƳuϮBcߞ?Lu_R!y5EqrRM> 5k?0"t8=zM>%&<޳dSҸ1^Ls 1`T{ -RIUۃ;.ĮBcϷDf T%kS^q>E~܃Z£ePu*(oKժXsV d MECGXNC^] L "9fc'Ȓ\n;8̓+f=.n}~?ODїƬ`|g3J+,pX-(fCaL x [oT\%j/3$1ۼ);İEJARrڻC6i$ [K+6fJ5 P=& #J{Jh ->Z&EX͞B: kOiJAi eQ<H!I<.m|Y -|o%dȽe[Z]`0/0R 8sg#x_n R'w2#?D&/ukeo̼D'^+j_ R 3ePݫL^n)|'WF+H_=[ÝRNo9 ,ɐO*[NgqWa8U60OnFtt|ZX#=P {W+Y1g? R 4}ez-AFw;fX6ytu-dpY=BJe"^s |/h#]\tZRGnC-z@:@b:M=_@ uh_]~4pl0ֻŵT(0~c V_ a¥_ NWoTPrPӵ4 cz[tkGƽ W+! S*I4M<'ԅ|:v#<,Ѐ]8 ڌ2s˹ E7"v=3h3Z5 f5-WKob1/{eu+&NN`}sy/J|tte6o&NnsΥtL@q6C彼#+#k]w~[.W|ZenFz*eӬ3?dEm?k[H##{{:۪e3'hiiUnLaDeѕ{ iuzS -006\+U -/7ݎNBcV/}&Sh}eoi]zAwY);SxW^"M؇G4ä-e7pR;<:I-\BVs/\M^D]wj:fGbM~~/`VfW+!K+F@ph_x+MikEdjӛj23}{ 1;@Z.kTp6o.#L/QgD:.=Ii-\{*6 "Nr$*cq)f{* -ƳQ"s/Tp GE `Ջ hI̓}%m5Y1,ш)7naU@lELlt\>GzίvQ2^p?c?Aw}ѧ -ts=u!AŬp@L}5a@[H;h)\n/ZjnM$"zCV NNs_~P=v/JcGTzOB}Ρ|8:zԦ\Qcƶ;Nu(4ru jNʭR7~cD[ MjHkvΪ rft:l|} O,qW[\®ks qicV6t 9GI˙m4p-]/ -k9{Ғ'm11z5W1o58V dÆJ] pו~ ~QJMovg)a+IA[_&,%!? ӄGlkBK~5h#.GL<^"ϡ?n<'׆*>PrE?>vK*L*=}~wQ&Y3PѶ?0}vb52KTN'17\b\F.ң="X_Æ;<`{!޶he *Ҙ"R֏.W+oZÚKGe›\0f&}Q>>g: طJRN@N@V@loCVXn0.0r/NMc‹ \:*+{yʱ2na y yH?, Zmz%ҽvyANb^R\1oL av 'Rgj\t"SUO%TD*Og%%0E4 ˁ4Bhwtl- n;R+wDzGu?h+DNM0 $oOtgUAr9.d۠ILd :Ϲ/?S525{xo|.bg\ZDdYOTۥj%kۙmcY累e[z%ý5{JOK-$׃"ҀQg 1!z8ۆ[Mx.=.d]JE*>ս3M)-u=N}bQ_d[qd2@yf<Ym:. "GY n'Wj4λ7{Y|Y!ypJ%Lj/Q߾ҩ^=#|M5TgY4,9sFK6&v(u4³d1%oEHP~cb84 |Fǥz.Nw1õr|aNlǴG[?'`4{=?ìmʙ@Cl1\ -}\lz@84>q+&~1COi*~˾!'7xHpQ dz&v=Ղp^wi73ݒȒWYZ< nQA*eb\]ˬ\~4iQ&LzL6RxFKgxf[{`xi'cXsiS5S |.\rSDLg%G6xu** k3\!_v?py$7nF\=ʪ~O/"b1 4uS=¯mBKժ/GV/wjΓW}S&Ll ;ݿ5Ss~ڠfr0! zQ"9U:_r1,)9||b =ozQuWG" Ϭ*ѣyo)iCm#{}h^|՛@[pfǬSzc(R4:|t(9Kxez5:nR:Ѝ\fmH|_SxWFJ`t+aOGVej[^$Ӄǿ.wjV|wZXк|K3o>M\{ZH{co"v*}b.SqÀɭ_}%FxnqW)1=gHFs+;#@ `[;os*& #\ő`9-<ڦNG n рTՀ*ң7ej-Xg4[\a-3zkMt#KxSWR|7yO[tSC_&> y{̹rj\OYH޼N3K= ԽϤ@}8JЫw՝:x&\Tө.[' /AGwj_[W%K_]9Mlì(4e:}^hCUsc× Gi{/ߜ>mzwJϯn>Ȟ\c2rI͗maNO}xi:߼7:@=\*c4 X74#u=d䶒eך'J6:UCr\V3j6؆=XYD1d82ke;_ɿ(IW1j/GywVf70 _@$0] KDcvAsX}w9!Q-xQhքͺW(3ϬG# -T@& ieP>M(}J#v<"7yXE>r&ZÀ2[Hz-ڹbuF$+զ&Y2?ZW|࿠^ 7vfj s02~h]/"iWx;Wx34md?OU(>- -^g,lq?( K+HOwre|ДEw_1_I|WvXї\矎 H}<ᯈ76 LC7f9t~3Yl4Lg4XUMc3'uBwjO?=RTKٖE_q4:iv8jJ<'QI gك1KyTP+|g]'C Os˾DؔȦmO\ A<:-8'G4ETh<5V36th_J~>п E w(md.j/G̟zK>zl8UȦar^B>!6rFZ{X*o^mJTNh'JP]xFЉ1fz;K42#|[>e פߙ)Χ /;Ưu r.@5mkJ\x_[&p74guu_isc})C15C1% pֶ&27 -**G$|ei%E<ߒxTU^GҜ茵yf ~;Qpk/wcXӃտfzreyZ Bc)#> 5[kAQ^%hʸ|ƱU0©Xi_a?*(ZS5}R6o~Yo`M[h/qGMgR>1SA) J IQn2L#:~Ǒo8Wh5q\9t/=}2ΫAk3,aK>m+M^|V/}pܔ)M*Y,Pxn9f|}bI ZPaʺM>n'z{L_Ai!;Bdio3af].Gi~?lO ӣ[L(f2-mX}KbҠfgxsubm 28360W} kcB.^j{>eݳyބU(M { gw"Wj!tT=`Z-} |GqJ9ޔP!W ,U\(:C:q~Eg.n)׀j`C[lZze9SfG~jM-LTĦn6xmhh5^" :)e:ǝ-x""֋:WAWT ăHZJby8A){]c=i+ow:TП8⃴/u+Fjb};A_ =va­s3VH?ٵFo262L ѝfE n&;y}cr&㢱6 ܗ1^8#"*Ӭ˘0}~J1reIr[h.2Yև?ph5FK2^Bio-jh*Qp yЏ!H+3+Ʈ6דr:>Ep ]9BԌ\ Y3-cHA=g n .7kquk*jz?N]uo9|sW2οr?Nr`{}6[D K55 )ޚͰ:3م"ʡ¥p<|50>/nUI}j-Cw%KWf.(Xء_df'bW]TU?o3jG64O,qLA р+#&8M|Cꏟ*NeZf7}Js8ι]pwO%V?:HcR,8o c*:q5Qg4o -JWwh -<* 15^X/EK1sX4I@KVFxk cObdɎ[: kTvRMZD1ϑbζ?lXek)F]8.O3(%Q@>3Pt9#+ (iY_e9Yͯwgw.šKc]X2gF8 k/7/Gm*'劬ܚ.|;73|Zg^̇ խw1CAhv*XC?>yОs{&-2Vm|!>K `5ޠU5խUxi@ ]DLʼ;֧yo޷}^u+~Q5Dt2E_N}W\L e(wyEͥ1~[%^CCA-^ -%S f\yLeF^Yҽ']b֧+NoXS$}e>3eig5MdXAdӢBA%*'ǀyL(e(5uw%ѹL31:%+*`Ch9{ k1]Y D >\M|eG?fM~rSmƞL&<"-iaJ -[vYy}bw8K?j{.tX}kYg0"Ir Vha,/tQ]'OΉaE1\ C+W)mRmxzM:rf oӋ&Ѳ+BrC}LMKi<:B_:5p)T|93_7'3|!Goa>߲Qޝj<4j4˷{X?iَ;=ehOA/9"q*N|js-!dozpl U?xMarVttij+^W+UXz|rۗ7!7@hGw)^Ọk/ ]B\Ž@-ק1УVڌJ?'7̃.lTj2+"obc O Xw0 c{y #o5,>Y*lڳ{TE 1W׍ɗQZl vr3|o?sHV룄 -mui݌2hgLnzq>^/yvQY=t< S\h< gJ}#P0>,)OI~i0)s%]yv-x [_^DN|׆%d3o7aa6xsM1sYOz(\+O?tҢ5b>B˽ -.'ߟϜ2µ -[JZ'~y{V0\? -b3εWW]C.> |1 +j-_"w{!>?::F}/VwnNm=_/Oڢe>q}c#Qe.԰Px%4RUiͮl(EgUs}Go,bO"hW~)b8]lV2Uk+pJ*|&X [O5 /=dU-dKl+S,`jEH??5Mr!W )nY02wgfVh*OMp(~.Ԡ*uaFu%qU=\m-N(AfaSSiL6iNdmNU>ؘ-~ -G$!!Ǭ,X<ֶbVsӒh\|_SIs4v.}b]=@޿Jz2>Bǣ>Nq=SZObDNm_,yoq>55acMX|O#Dd=W\LNcmXc,yp33h2ԟ*evF52(~7'?3祇؛Bm9~XoKį [J{Nu+28k- -J]ZEioD \]Til.m6@7p'-#9hH^ u7rp9Q!wjHzbt3*Xy_Aya5HQW u#V/k Ίۯ =|8&˛ s׹-k`'hNZB;#a"h.=iZЕqE\.'vfdh{{oMe3Z^ɠkFeiE I8WV0)/t0.eW]%X AվQzNzǶ5 -Фp܌E۶7.Z*`ҙ"Tc{Bm -;CzvīTEy?Tɞ\Ki8_lW>qOFNd-zUTx{K`\ߎ&@ަ7Y=5S(vMǻt+Q -Ve]/M(pL®[&o8dabGHz%enTI^:ҙ,4#$={nm^2H=Si,gN+0ʴc&JV E[(ė/UHԪP~ Ew9tFM$H_jk>@~ $5ױƈvNE񶿱}bMunfVv]O~ECFq=pX<(xe ?3:rxNoUxc=Ϛ˦u?n?gc\1(yă53W?߆':(.z.k:^b&y=Rhu':-"5Wv>NwqN)R2|iIZiH12Ӧg ASqQySw!}(B5wiP鋊R F3Q}Q~-87<4<i::?yǘAJ8g94Y^KsC1H֢t/e0 ȗ*:nZg;b|)Q/2߸f=5zGճiԸ.]s[z1[k0O_u p1%b#8!ksXaեw L= .pSC.A\hrMCN2z[Qb[*j}):b';nұ*+y_AxeCD$HYƗc ;J@ne'̑_~)y-f<~%;o2HNi}xo+ Ny_5| -d[7=~*6xpŠDށO%Zg|4 -;v Gq- 'jJUq0-Ӕ,L_7izFrs]^_-ǧ"}~TNr%RWOֵ[('yZSݔk:1ʁ?U@_J] P;˔fк] (p2/P[X/X/&@" A 71ZYl'Fʊ0Ak1N޼5p_#G{M/XFMIGThu8jiѓL4qP?LC{JOiKb\5im{~'G;vW[gg>cQ.X9*UL[{DxS5G!_zxλgU㸀Nirn^2-)QtM= <[żJfj~j;{qh[wG℮M>hK&hU% bWm^ "Ro+=3MB$^N&(Dk7Rt_DߊYgXKa촦o) 3P? #tہ¹˯ /c>)iې|jA͟aчL͸3^'Dwgy݄aG[ޑiwYxObOQe4Lѳ@TfN uIwB'YYSt;gYMeGJxCZhE}K)Rq,+ؕ@ ,; -$L\ M~^Y{ƀr[ pr9+k^dͺTaj?}bQ5vY_@5zvk> -^R~vR)8jA+9 ?ȏ'H0:䍪msXUw!{"GImtq h+ں*Lw=e姝rJkx:Kx1[BY8@x/0S@s%)IrqʋD@;gr - ˭I"ffZ3љrTh.V-ܽ]bu);rwJ:2I_D(&S"n j$G?;ϭW` rNt2^,16fe2l]ng 4G]aŦ[\2[Զ1 m>!8$X#fAvм&T~zUE!m6ԯ{5vWHص"wjUao|~B6c0FLfH6xi’.N$1^ x+7t3#۳3'$<襓}x&آT -k5h(?L)s>T+88Ŵ0VN ֳf:ZGH+k@# vCVIa//"GVJT&>k ,ϗ\iؐ35&"1Kfu\eAX/h֊YVxo+`/NRwEҙ]EeDKE| Z;> VejK1( oϰs- -;gj%_8>/mP֐CWoYa]w%ǣzbi$JzXc`rzi|6깕#Wt@[\+Cl]gmO1=Ow Sx QB'l*rؿGx5\Vwp]uW7R^(%3މ叚'3đ`h,3(s=zǽoQ zC. YV{Ú5v. aݐa5QֳjQgZ/>trj!Bئ5o;噖y{iJ_}cA| /XỴ -*h%c JXoǫɃ(pM;C;"Hjdج6,$ Lk`hSS V Wxۺs ?)Tt{AޒwfUr@YTo3gp&>MOą694ca Z":]9M\⚗_Ycᄕ̿8AY_u;/UJ2b_8۵3/΋^iEǂ@z`S ?[at=_ 7j~R#Qn -=E-&ڣO/CܔCj~el(mH6-FU<(wZ*|s@zm݂ zu8{x= N*QIb(;}/)n19p+&;KU9C4GSIV1ˬ!. }ߑ?\Qizuwk}͝1\+cR[KEƪK; iIE# 49p:pog5PM#YΙӮeUָT4YH0`?YMMdyL*ss@nNޤՃxs~73/8S5;D=<@XiLSuXh rh:0(23BMʏc[ƝmQ0saZyFWԃr%#u}Lٻ Q2=>ڏ_ؾ- u.7֚?@0=]q~L(^A'tg6}9L7rEPJ~3prc-@MP)ԖZףs|XC8yZ& !Uܽa6+n4)ؚxER QWb\EAm.sȜS07^,MW._q2= 4WSH 47eFpof)=eq:ڂ;{d6%Mn^ ^QHiZ:0gU:P၄2=Ҭ1Wmp5*1 V6a}="(JTGc$/t }%Çĸޔ%^}\ه6CFDK/P<|݋doUk~~gA4e15FDm*)jO'9܍SB4jLF~޷(Po& ߁NE|壕 pYzfhEU Ӂèo½B[ XZU9:d& ->qKrrL%QE;TŏE+?y7b*t7Ǩ*E -U9gSwڸ-Vu 9I!#ws8JB~>n!L_M_|"v>>u,xj;h|Mv}EcӓB~({{)87: ܖ2 , aڼ!;? {'0,9 ;KQWNqiBw伞]Dؗieb{g0N"WNwܴqp=8S9 dqvG_y:<[3^?OͰV0R7 -LB腍 @߼Pi2jMNm^XJrԋjzq_(|Z$߇7_'A{`J`9DEP -8laep5Ar_ LOZ9龝Ezѣ>U\GF_U#ޢ9wJ.ֻ;5P۱_LK:)}IUh,%\bIe-4;k5NW$=\~*¢yÔ^:H=3NK;oy]O %Fwze|c w9Q-CZvbEgo1=z}f{߈7Ksu0 U0_ -x!܉g*QT,xfQswyjr~/['Y!**2Jch)QMx=0]>U ][5o{(n!oNj,?`lEM3c& 6y97SPPlP|?hzk->pBK}&|͘b"# -(S,ŁO xz@(Â*&<=[vTtص+ <^h;K,q'28=xdOo,4 b, L}n - J؅:} gt&Jϔoߗ5;n#)zMt{%0/j W>P{cP F3g Ht_Ёnҵ8}j`֐/fң9D ia8>iy~mRP&2;tQ):l ؁@1 <;"*zKG2:~ oɚv';wVWl09~s.ӠwAwv=;C.d'5gMb1f(ݙ`^'aCL ȭ5'fz%TmKc(>m >QC͠1΃o -e1X͕ :u2+nhVy)}ßO?> yz'્MD&Kzr;LVJ¡C^u{\Z=M}QAsviOY׈_9q:*VN rK D3Ogη4g>(7bWC1oN~S^_6B=a]}͗̊%T^uKh[ -ׯƻd_Hׅ&`E@*qZ.C{I -~:y4Z9T Swf]2e4}sH\i+F*ԟ9wrc)Xa7.%̍U5?HX{ף#b-~։w/E~qY 荁aOm:u0QFjزCv'x3 " зYQ$ ̀NirMu\dPbLF@Cc= 2-*:07K*ϱ&};EQ `k97R-~+87Nc1/{*aQȄצퟡ/ j-NLBq(!{˿k?C7z[_F!YGnJENKGnZ9 %dc[P[ԇfinφ&*^G+nK;q8iugk1ŮD[tn_![Puo?9aۃB}BdeIyւ_ -HLJ`1\C -b%3yXr80a -hYjWiQk q4]u.pb:, -"x_>>NO[E,#7ԛ2^\^טʭ+|=Brgiީ's~GS/.Uz?C>c'! eJSGu(k?5LKyK0ٙWH~sb/V}> =Β^(b yMjLٯh%3X0MҀ ?1+. :v]QiJ'@˶tmǵG'ˮ㽞@2u0WioYQZ]nwIb6t~DΑ9!5 Fakcp˹"bY!^d%`]:kzūWA/g˔7{.ع4#RZKijoO f6/iZk]o|gL61mx^ؐi**n [<:5XV4'"bQ> 9UUf:+p*DzUM#Fc|sK]xiME%~o eW7_".c : 7Jf5IbޣY~c{lWHo҃x -;*@"CS]0SMʷkѫT ̗>MΥMF -@VL[V2kSp4!&<6"-4*_H#T9P-*kQ0:Ӆcid;;+Dv:/^c6(-=0JMe2w)oբ0J,P~aã̳ox+L8_F5}Tso x6 9](5]D,x EE>?T}4S]׬r^%w75 _yգ8:oƷ3/K?rPo+L%aȉm!gB6@ ξ1BhߐF =DBm|V:hLd2sָ_N+s([IKs-.ȅJx^wNR7 -S/.wwwk,W4>ǫ}Ƞ5o2-_re7KkN1!diɓ/K=P=Uh#Jm}ZieRi+@GB&-eEK f_ c_#ZԵEXhlĕ]\/ǼYT2ϴv; n6)?bT^+Jnђf rKɮ5eK+2E}&xx iJAVrR`$Ý m&>5tӴpƭ޾7uUV;>ea k|N¹73*tD݆]IלkskAf| -AmRӧqmҗJFy;nC8m=KYTzEoTb!+qU݇w1u՝aή -zN%TT5;`zt^^UbQ,JIK:hyZ*j5u}YS(6㫏b&M؛{C`Awb=?8]ֈO<עW:~%b۲~H &yt(R|PX_0âK]ߨ! xO0GyG^zĩ{ٙs܋M(ۅ0s˛_)+rtJ!>Ww1,L-ѽ"wˠ]7@bT(b[ J{vdlk>P掯.F5G7|GE 5LC{Ma5m~ן (KڥΗ/=tgS.oϠ:xf#3l.I]4Oe6,oMWcJ7Dta=/OX,N;W's:z 2'۬W@k?4ang.fEҒJy1՗7aPx1w Ҟk'ΆkYJ@K}FV -mkA:7EovcWwr4923娚˻ }}_| ԛȖ'ge ھ>)ue}!u?a^%d\q4(_[MKreobb-}hOsܴTnLyLGp=jߤ$< -ўsՃcw1"(li.\8~Cz*{SuX</̺čbK@n W#!eZ*K .Síu:%G'O):kWO*n\wb,g=*R -[.פe̱u6(ۅZ19.]`chw{JJdt7ɉ׆[z>TpNe6tmRJز?rŌ_d3O?h9פľĥ 0%a@4 40Oj~d+57vT3 Yn&qFP~#6􉦁+3kL=ʞr_? Ր/LE0V4;Ak;?0pEBzNlG]a_)H+ͣjezמkׯ::ә?z6!Tso>Qy1j> ~[Y9LYd UV#B%-Iz[s_|9`v\V5`ӂX.%\oˏNC l^ѹӪa}-!)^CKap\H:FE.]' -x_?s) -6 gyjn-u*P}T:eY6صqn#.5w"3㑟@|)B3H5ODi3::APŢ \+DMڜ_SaoɁ,M|qe^ b%/7(f2X7˔pIL%Q-=F|c"!pˬB0teo^DT{U|{83LL%@׭I]Y=_b=e5.u1)nkHG Ft={NK| tYP-ϕlֵ7OtuHc{`q)*Mpht -L̟E }# 9`Cp.uMG |  p|7W)j* +7h&U<S)^גys3\0#/ +_Fia+Ql#1+,cb͌T￘<cvr@ Um`4Ogr>z" v05k<gW O6NU{ L/#fW0X)p9CELv3~R<5cdb[u5x -^z# + \71ؙO֓'Rsg'拺:Jb G-^!P]O+׆V+ʊ=4Xguk3Uc3p +$X{G7K*߳2}xR,JwPLHCWN [^CCL!%] ?4qiV#1v`6/!_2JҴқwv3ܫ߬epۉ-xokt1Ⱥ.EP7<3W wZ𜼰WkqtYtn=?X Ss5}W-z L/[\Eji?Kūq8'5(fYU#6շck0;ڏq+բ iz 5B 5*:H<`tc=5rd,ANjiqmy)2I[ϊխ9i?E -H4J)ү?%{Ue` a ,ZeɥQa.s\OR*r8,T#6S#:\ nr?3݂ ^ОrWY-|Fn t]+5l7 7\!z_I\3xПr|FcPAMtFybYu^~QĄ!i -7](L굢$6TuG>^49cpa?*HyE " %mvjBP쟉 k@hMHg˲ y:s0귡 eXK 2E3 COPpP  d:pNOyi/څ]l{B2va XI8l?EA(}1Ex߃(kiM$Ur+Moie|m҅Ռ Nk /uQ4h3!.GFsgܓ)?Ӈ) &X@!}aY*HS7>+G-#Jz٭"EϢcn*;1'OA_I]+#GR, *Ur{= >y-uœ x4c%o`ZD~ -8K9ᬬ41ǦO%]3 ~2ͼ\FUUÞ ~P:%XZ - Hk05=]X]]ß@=%K'* ҪwNUbjFY ]'U#}Kl?ddx1ޑpvC$Ifº9uj|EEL:P{& 1jw&j4ӆGU_wjVDh7XR.]f7!WGh~󒞑[) -ks`e?j"b:/fYC5TY_[s2u`v/loOy G 8q?G3@A&D5ueׁ]._igns8^6CZJ odmVf|e(~eQMjAZ'Y:p\ue/2 726Qi=7 vOT]+P-f0~W>d-Lf ToF -!^X0lؖ -$bJ:,&ic2*T耉y`Zn'KƭDɈ JS)x`&a[i"@OR9H[}Q/'[)-DF;bAˊ&fekf|9B5Q%kwk9>I"D<rur;'Y~odꟽWJjÔśMiנVWff.!ms1ʦH51YleS' zjF׆Knlk{4%{$Cq9_osscoRlF;awi L7G=au8*)ijbtHM ?|m(]/A]0bPO]=gױhٯq؂.ق7*\jw-zkP:_HX4 T,m곥;N @ -PN;.UXԘCFqޒ:FX`ii-!uބvJp:Ժ@;{}Wdttu%6q)kZTcC{ֿ@*Q*?.{ fGU|>a -2 -OXި>SpNqh|SLvæP%ـ#> L2\J!cL:v>e2/lgDpaRit9AvչE>_* vJ%u04?Gg?#9w '?dt>AlSSϙDxP w\WޱWCfT| Hw0 -K`No]e+7+% |t 4I;d;N &cIi[}aL&GH*QWcNGebZBv^eT=ƠV;O,#^!XR=V%>ptjn?JZh~0c5=ß[7|u5;"3JU6!C~@Lxi0B4rl^nk2{Bl´B -=13|$zfjoe';?};/V{9> "chzɣ@ U8'T3̣>\_~ -,_YA[!?n-_fC):@F)&& 8 9F},gzwL>i>Sğ -Xo YvN8+ȏ?x߅*3"kN%5=w /_\s=1i((0bˮ257O{cUZۻoKw>#T$`uE[l X<)֤N5K8*QjW7/EVZl;Mj9a$ʕkiXSnPwxVsv` ΃)$!_@RZ-R㹵Q_Cd*ҥFTxO6-%Xti.*U1JKxZ89$?NMPʶBT1h=42d)kKmTHQ̥㆚x((zD_\j]q3rc۝aV_{!th8TN\d,/ѫ살kF_ї=@/4\cI"-GAƬQ&7"OZc"wC{CōKunr cHb VyJg_؅gsOY#|WQhO~"z{iB:)-B%A9Q[!hmL<N'DT6KV' ?T kʩc;q0Lh6G،".*co9\Ӟ$Gwn=:̷9֝hi,]'(?k )W sb|3NrW?iR-HlAҀ "fx%ay_": CW,fviw4.<=%7\ڒH<Tԓ8EռGct0XeD~OIU[Cä>UecyVEk.)ڥWF -p4ή:Bu͘8f,v8_hA-~u#55FMO" BRR^Pyկ@KzF(?(ڱ*xtH]&V;pjke< -qma*dPx Xjn*,g,` J'WP0ve~fu\ "M - 3ucN{ c搇ȯ_>I%aIel鼷#_"v޲̾:rSՊ(ޘ%/i/8\jB5`W< F34ᷝCrAa3e暲WXhLeO!ЛSGStRs#3x̧ː>9\;&ś''4J믠OTOR =x>A-lMC)~ gw#h(h ,P1AtN7eCbc!HSQyHAR͆ۈgSo@Ե>fmԙv3z"ׯBUZ3*wF+hŽȱ/uԊ RgQ_06fEosNYv6J[]s.\Kr¸>mئV탼i0>xm+|^'Yi(1 PŊ&P -^uylu*"UxJh#߰A ZyG㇝tUgWu?vW$Sd@M)EupM(H} Oᔝ>I]4*i7T13cFegֵ²dnd"~+˾&W%ʙI|^SُDevoߕE/9Oī%H=(BO$/BT+v5)[͘ALQCct -!MѨbrK5~CkI@r/fx|/>cB^U:TnoI>_K0L{GYq.iN$.3s8@ :T}=Qf˷ -8`۱7!g-+ gpjg?$>Z5n[a0Sܝ_yDa8^6-Y덐K!}S3)*PaFsro -*bJ]AlF&iHc%ںi. [dO s??#HَpJ 2'cl_n5lFjz&z!n ]6QuC]Ό!y_x1 T'V#38l?-wY 1q*XuNO9%06ӤD~eP;oXNM]_6Vz[ 4r.8\Z_(ĪBP.lA/@`(ݯ -rhPy?Z\w"ޜ<0GIoӨt}ca9'O4ʯ5|+ HtG :*ϦWZzue]nZl9}FN_\X=("F/~7rV#%7On4Ú5Cu;M 5 ";?x/'&I_foe[3\+C˿}>YA\KsN ~bɞf,8so?{|WsxCsLMoq f?tpU@I~4'9^~WP(NfB\ ЅviU*O3#VqP zN]bNꝸ%ROI&vUjݜx63c-iL*jd3iƨnt> ~$/-sJ>Q ȝ/p4UưD߆u9 {=p5eLb.8֦֞iY̭enƇWtؗ5lpa~Y_A,Ц!g#2g(]>g30c C.8P@ӆ۶5#Pgk(\ز_XbƸk"cXe-n}{H,ruPZB^߄۳r↌e*7lOi~a::|r=)J^Ptk5*SSD􇊺-I'5 Fq@KuVm[M;oiJ#9Y=,dkw-e{%J͸g\wM hrJ?b;lSM ajQzX/t당F~1.bK{!m5;ylM>->z$ p N?N->߬dtK X 5ۂɅ%n-x8a~O?0YˆMv՘08G2?m右hKHim0zjSRXA*HrSSr7]cr/+~!ڑ/@x]yȡZ =j4֨=.hkK^q(oXYYT!wꐘAuQMxǴ{ؚߏE TjdvcV\KzVݩ{;U, ^Z-n_(}:ļ;TDH:SE9=7Wla-jr[j/ikޢ#IÚO_ٜ,aLb/,BSq2/JQ5;[&S9o=Z8C>k7h~>D -iu6|XDɯF > Y]fqp'SZMriNen]]ŚggGY+*t`By4eZw"R/Y&] jkIfw}!\'w ^D<ԉsk>~?4!S> ןaL^:mFqj -+h:b~@ Ƈ xwU`b"L*NB 5.p‡mܟ\q: li25UA4WAhxklVrE,}Ӱ,8%HuĿr:W9y`.VCbΫjMd.Uﶷ\7Bݣ"?9{ -~ؚv*,˃lS4!5.o~ev攓W\xA.+%* uAa:gڙaOb.}v L3o|ZvӍv!Ly\4uˁ,,k]4yLcy9 \Lgڛ S_:% F*' oY!l,v`z]3Dޖ]Y\.vt;wLe/l-wxþMYeu vo2l}c\ \j#~p>N 7K-ZbV8\ PK?i}߳H):o -ez>fSgU1Ү79(z_aT|nj)RYUx;X5Z{NHWT::WWvx碏@m>Z6D%bKNV2sص`zp'u,-c(P-h#3Zu9> ʚ~Uĺ?M}ezP`aN*z ^UB30׀4J\za_?RU5f 5X <nN+wgi-ruxs\m(E> Epf>S#\ <kOgЌvWЂmf! QڬAP&v2p5 +sX 1w]>[B/uUDۢwe>W+. SU{/ƤXAϱǩMewT\``IV_4]X{&#\RBn= wNw[Y KP\TٛΆem[ ы~˻}e/G @׿L!Ǔ\o|c3' ζu! -Uއ0bdUu{o;~hm.65I. cd t\<{ҽ6W/)WU(f;S3_wq5fCd0k}a J;K\2T+u_Ji=.n<Ӈ2p{l -xl_xnB/C0z+O3ω|6_:s<4|⺗pANZ4;sP &D4=9Oy&kM3@v1Ě*"kPKgG$-pJF4kD4J-?v:eMTukMZ&X@ƢڞǑȈ,?_/o6IӦA10Bò|V&IG=7X8$sQ%s*C )< _,J)-~c -&=U~5Xٷg5$ - -:Qu ?fDF%h;:?x[b7P9yv4b=` za5c2{?q?A[/u\o9rs׈j W6K?w89jW’C_1ˬQ=|^_oCۯsͤu '* a5u8 -"˪GS uNqcPjW<T~i?Yyo؄5{ݘf}b̽z .r硖9tXܿUn\k1(tJrIYGu'kngfw;&c҈,YBjU \NÉf3od!7h Xf&U)S9T[G4RAjG[G!Lv -҈|fƯ<ׁa!4!&|p]cB@#UUqt֤^MPx5alH8lSjAMx/%zK1=C+&7ڰ*{qGikZwJaG>FMF.mM y~nPZι?',^ gM,C3#)$spmrB4zgXPOzBq9G^ E =5:g?h{kbzϩLў]eN2l[EzLOS>Ӫ]oLҢ"Ҩ*#k5ʹGe)?TyjT25Q[ Mڝ*8+4Mx s1Ρ˛7 LӮ_LrTDn"y7%zA~cҿ8sۋ YE u< 9bg[jpCm5[l>]dfWéTఏ &v3 -S|-6 SHLy Պz-R9њ?vic`\^ΊWBeџkmroe u)=iYWP5c5T1b+&A* ;}e˗Q,{&o_`MRY*G(Um\)}PB\ >ku'(13!PFU'3wchJ'SS&=Q4. ۏG2ȽxIw3 -.r8l\&vt3E\7 -Mi/IJz,gMXʾRN~eQXAkK9W{<ٽ'tsN?.} -fws⚐钲lM^M4Gc =gva f~ȟ -Ȩ$DA>WvE^SΕ~(ίǃ~/{+xΏ:)_L޲Z֙_33"mcZ)Z=Jțe],a7IzKlyy -wt+h)g!kx?.@{<" K2/0Ol3AjZOeCGj1xu 0rL+ -.'\ƛxԏS> yG[U5TҺq g10eN@6%DN֋m'8r|c:cE8YҷSV'?2Ϸ _ vSB&˞ƣY4 H>p`<de㈙d-N\.yISgs'8+#K/;IURז\) .6hlvjRZ˗"]h-}-)yisȼ^Ҵ-&@ꕫT؀Wcm -^ )Qr 6H5/68uiAx.ELY M[."B(ͧWƹ\3zT{x))C 4rH,W 竩GjeJ,ԉ\y.]ZS-嵇n)eEr*R 9 %V9h,%laV=fZ`^0W]"jDlJ?)X0&/'>,5LZ+?gG#jl\'[e,hµ*v/G74PGd`"SIb5ރ5# jĩĭiϵc͚,f7%{M%{k=5N> ;dž9[qp dQ@EDXyA| -af8bĥ.cv] 9,o-YP{Tuչ@/ca~\u:=&\O&JB1U -8]qSZqk%|k3uv`1`ƢuB_~t~)+-#]9}f<%rD~jۋrC.pj}e3h~'[5:2FBլ8 T ,?ɅϞmo 9dҴrGᚕNU-$t@MK:tOJf^,e,joR)w~t]TotiD3yԤW qώIͦȎ[3p%kȶ?k>d˓*@}J%jnU?ps2=|/p,]~r'T¸bR2i~\tzk'Ino &u)\S O~:p ѵcI._ pcJBhg8ϴ "foQz6 -0eׂ k~mB`+J#-Vi(.8\~Z;YʅEvvYm֐H=uډI ؾj_-4. EvMT bwD7a " O0C "9p(ai{ʩzJ~SCX__EYb\:aFL%'W(:=QpxZ!>r<}{.)dt41`='j{r[ šu2|5֮|HϬSe$GWcn.\F`vP Uvwd?ß~ [Rg~5% &I3bkTS'>BwI\8k1^w$D'p5/%C=H c RXU6ZLJb'7niob\N{-4 8kJEom*HЇ1nW -H"6 *_>(ϟ^+v -4M1f]*F.>^fx܂j9FBZ:)"41y] [|U:__^FӜPxt,7((~-7DRj`mŻ#;e&.iCWHm-*spwqXnqSU/QBX$6aEk 4VFUй5cV\8ޅ̸rmDoζ]ُJI19Ǔ2 -n -ͪQ8ZyU*u( XS}LJa -P[+DEΜ(х=ٲX m頵7}__ .e\n.mӜ hdx 69%+Jã9c.B+db#T~X#.Pʺ<9i -nZpeuT&25at٠"ep=Ex/SrX7vL>BBHu8gcMr~NHMZ0EmM|>!}[^E Noe=jqancWnAΠ%5@)dהG#_(+ʮrJcKb| Iݘ%HZ@xRZѢp"5S)sldZ5&J S;Jem4p{%i &e2o -KULeZ0'9>$]\DׂTu\K*% +J+H*܄s|Rt=Q}fi}u<©qRy+G0@v˝z\rfsD\mQ ZrJ\m -m` #WXٕSMb+dR[ZXf/jBՉ!7$%_5Uh]@|^I^gW;3&IP2oBjF{^]G☇RͪqN6r{|yޒL^ AhCӈU1p5ڑ2@c_̲s$E'-c *Ե:q@ker۹>%kTrUa[L 2|d³5k̷b'*;qɨs4swi+X$\Yg5Fm&݉_G)ߌyt^>j03a\-`1 ͘Uczz^%Zp.lu|'f$"FDl ZEqMpߦ"^MaC|jciXvJj"c*ξ|_)N%UKAl;FO2L0<|W PQteE؉Zw`9ʚU+5%E睜[Y'~rOstZ,W;&U ^.]5`5OOnӗa@D|^y>t$v0uy _ҋx?PKN|ɗɃ{!asa29NM)R~twI@aɀ`P8u:; G/ {:WƳ{=Iޕ:qhoF1}}'pj,3fa:1ηOQeiYWQM`~;MaF^!A[P\*Z(yYI=jnO. yQxiZs }3SEbo_1N.Rֻn2kev!pv~<WN膒 n{QZE -SYNrkJ-Ih ҼDWsS b ~OtBgYo]CYvaڳS?1#Z<{e[JƜLC3vgAoNbz#Ѫrp&e9tZS.2V\z+q3q(9=Q$UM:qnUWÞpYy .[‚diaPD0@l$ )_-SٟϦɥ넙t -rW53] R#*kTm&'a³إ5 -uщFq:̰ܳGC1-]:i٘c*T-hw6jKHzbbis]5-;Bl7kh"K)zVW )~Jp(&i -n ـdY՛fo?g9Oirʑi&9M9;[pBN<PYg*[5t_&Ď\Y\3&*GTݳ%)FmHm[5&}g] veqGېkyO{ -̓Q 3TJM%oz t9nR 8[A9|5n,JYhj}y$ߕ7+z:CC2WS -3d5*e,=A{D}k7XK*ؓ&ޡ\̟>+|C[ηero _t:q`ts OVF --ky);y7!d/=S-ұ+y p3\Ӣӂ s?:9='p/"&62Z8A: 0Ѵʺ]Q-K/~'|~'o,"CF<9KF흘5X5lwxEd7G)uUWOM̜ͻϰ4!)f-t|,l u|1-+R,Qab`ڃKxoUΒNYJ\r fvu <c B ZjCe!9'MQjDΓhSi3MVHWbauJa~T}GhFS@4z7)>Ѯ~\#ʾ Zop&Vړ jXB1]kv=j^W۶DFR0G]*!;I\=_Yi ϖR-iL7 /k CMMGb]*㘾b  \Pa+E63 O$y3rTcW;~Tk3n5+C ,P DG~M֠L(ҍc6jqx -ZΤ=tsi dpAժ~ɤz$ӏu([6!^v-7tJrCRc_5RUjoLCe(GhvbǷVjm*ԮeR7jL3u44@+fNɢn=*:?0jn@oBӁؐWJ!`x n(WX=\Xٗgy: ](JFm>M:sWj\{,d61(h[q9&_$8X_B(8rp\ %<)ù.!hUqoBRi}ujmM"u2 lF}^c]Kd!/rBTиg py L%k{y`q[DCS}%}bї‹}ɜHC(jChPG 2OhM5ޥo%M#֚I{"ZFi9o9"3`Xo `&y_wY+3Gn{.Lht1oo]@:rJT=4]es -bt:;TwF?yl1ꐸCK\h{S]~~geIm~uf8sd_-_0qV/9z@o_ JIp 6A'#g=~&5rVW -Kxe'˻MmހY(-CcEAA ijk*nTۘ'- ԎFq8IX`tZ(fwπum$\:s- z@sY~M'q m̮㹇?u$ RT\pe: YY 9!\Ca j jj)}Ȇ^Vi>Jӆ[*q e|Jkc՜tcxS]yGyBxbSf4R@2jomf6Nfz!PnƲWj*a J*kŏ*[M"i֊ +/y#[doϦ]K(p; mXʵG}%i5mPCcZzƘ Rgs9B2l12ho#qGSo`ZXB`F;^ o冏X 4uH>$EѿnYACt=2^ 5f[仔8bhMO^̜QM?6}=٬us%y@/[x0%K/93HOj XtK@Nu«@NCu( 3xZ%Il6dvԡ)ٹv:& WT}W1ۓUq0A/IqU|ҽZ*x(8w~y׼8 y*~L(lMƮ ~eelDe>cJ|jjd->&MIquӢQ%KR34|7Ǔ9vr ljGϨw^WG)zY˃Ѥ3Tz'30i԰Lp;Ӎ?.LMMZ @| -m| 0O&8Wr \V vPpc*cAtD?}\:8U!8:p+y7]ي:6%<f%ǷGy*{[\\@iy=$fЍc3S-:ܛ8 qv]}Z9BQ0_ ^xoR_Wcg2Py6'0Ӂrcj@dORuVuuEkc,9Xm2T3S /F^7AeQ>c<32ٕ[gew6{#9j< ΋%C8Μ\k%" dgzјz嫆^'QT tDJ `RXQqkΓi1 ˎfߊٓ.zNO.Y*FMeM!+fڊY -]LUtmepqyM&샲i [:ё^ɂAW5DOX \#TICQ/NfKex0`)j*1x YE\2L{'j֣`jr|8;gٕ+)^HVe;X+o8kAЕ^+iPz1O!V+kZפ0Rw*oļCֹ ?6~VZWW-K#ly~c֕ĮU -DOX୓@#f,v}bva_%PkȤڻoµ=f{c0]Zl9P" L|M--ݬT -QODm3J\ -ilœ2ј~*ةO^fw⧟H{$2h'e=#qPi4nk54+]V~}Xq,G -b=f1ƺ0S4wsekӜXU l8tp(Gh5K؊JmNdqm=XM W[JfZ~/.*h@юiv{Q59oe~J+6Gc/yL285Ɯ#m=r-pQ,Xlq -eM}q-):7yOQmXlL 7[jxngjHQDATMqjfzpӃD62u)+q[V A#(}JV&(k_AV\0^$Qs=ƂIl2MXh@|]a,cDŽjg͵- -X郜 7Y`v -}g:_z Bz;oƟ |q+kd -hKQouBw%uԍ3l~^ײ.C4&Qz3|Vg> /\4%ϊOS?ZJfF"Soxj>7ϯVbW™4=]!+3l!G={O?XI0g3#>9zOvߦ.W] uVi8x f|%xtQ1B"% VxƕǛgZ|QUD.Y]~B):+bA-*ZK5"L- ynXeKx*g%Ĭh:x4iT/kκ!yl>t4yVuU%4ckhLZhg{VvkZԏ5 Sك\lL y&}I%6[]aYJW{<-i;2?WXHLm4]:K0dSH]*]UI#@ 3JZl&z +xC2u}'s)ǽ#K $y$u ˔^Α>e֤Cz0}"G+4\R:f}9Y%<`џVL93ߚS_"Rmx;Di> LrqXZN!Ǜfɖ*pً$LЕ ~g@fJI\P4TϤK5t@%VD9iPCgEwm/;8^;Y\.Ɋн]$3A~uŹg&#vCi z]Yb x`Zéy|giƣ>TIt):xu -7Il-֕sITd -reOiפ5w-5=ϬOM?npWIn{*=m5 ?Ħr\'d_N[U_48೰OHPR|Wwì5? zQ]p9CyډHO0 ۻV޳;\=81)U0M#EF.bԻ}rXt}7`R1)2u*/Vx_HG$h{ti@XҋΑBp-t8c{>P}fMtxsK/3O? G"Y`PVs3fN%^KŮ+32a\F7'xusj0^j#.IE)ex7sS6?ur kCT۞#U*84،w-w7kۦvH^Y*iUA[5('Y s -Øpݨz{zQ? !J~!t~AQp{E;en> 篱f~_I~M 4*}NO?f:V_RF]6\)Jo{I%za$߈yF,/Yqfo='t?L \i?:T3'C!@ yqm~7,Q]R}5 @ot,&-p!~:?B+TyFuf-̅ rvx0ݧxrueQ`Vn2kOR/F~Q|-x) F6XmU|2jygwdmT[8rJ`DT3蓐Dc䢳V.hpeH} 3*jٝrDG"BSvT599復~PpCk)W( ?GwZp&F E荠3Ht> trel眊=BXtL)a%6ƭL%7IRi:Pe6.B -T[GßK2ǕsǼ3uL\ɾG?nMtzORk^md]X V -[r q1sXܐ^?!؟QqIGF8-WN hx爬ƢKg7:!NGn&;:D]|7b">(C {ʜ.FD:&H/^Zaޒoj¥(hzKW*Acm^O?t~$ˡ=gӎxG8*vN؊T5^Q.SJCx -Bq8VWk\3M֯h%Z3eiz;8-Kng#Oa&i>N];px7qU"rz`+1_s Fd SKZL]Yn ˿U?Uҽ,X5)mFAT4{=2؏#J2Dw ^4JOAsX[MeZɎ0$:jj}a-UtKsQI17Qл'_p'?t.=e{z::%c̴|3ZWr0н%{'O3kHIikZ$8yU窃b}o!;MJSgSq("ZJs;ە'G:*;!3kKѼy/5wk9,= ׃ Y8j9ltj::TI05|k)?9W] d1pEzK{r;?g27Xb'}4}#FdN4@}?CU[]vxZ(wMܥ_3/Z@ -uebȩNJQF ]rC?c0-(DNs@mIjh6EuO/Ǐu;!yZ[ZcA%I?s}x)^GrVJ5\e:Í36]N JtT/,!_>u*Jv%u:/k3N2_o jtGaگD?_ ";>f- ՗ݮ ::OGb߀8:2iNs_rPݙxtλ˛Oˊ;F3.k~4 rV wGѯO 1/檇U,r)~y4\\4|}= Or~~u~Nu!AmI^,S))žRܥ -ut؟2-S%gֈ,0z^\ xA69?083Of|37%Χ~?O"=FtOg+f&]ߋ^[AT1ZKnĮ{WGI&aHv!PaK-'5JgY:lt PzΆW;P/څo 6׆N=Qj!5 9uJjš )ڎD&]:CX/PTFG2]\VdkJ,ryux^)-t'BuUyS9җ\|w07X}GPDߞjW -hUwiYHE}E+_2FAI Nc6i{oA,=(g>)5>T2&n7j%eX% 阑AuOnXΰ:pD\hphUk` -x1yE^|G1s9:|kN "kB̓FHVn+TfqZm[N `WLMF*RRpJ . -x_QS. p lǼL,-= -#r  tsU7?\77ݩ6:9oco؍e>_d[w[ ~/?~lg38^烁}_N(uM`jQRꕚqȆs f2B5bn5!$`\)|'DOrYﱂ͎Ir+ɩН)Ψ*)o+>1CG4Ou[\0i7JXƒ f%@ <.4΄u)#iLg|q(Zo)A:@b(îreʼ[Q 2p%3̗.eEFh5< 3)M0c`[1!['9 -^Y"ub !U”P\Xd@CX%ڙq*&"ddcm!_+ -+mE -~RhnOBm(F^_AT%>E،1;)bzKY,q/"1 [=dP)%5T9+ cBKq\,aпhm -\ӋV7sV[tKP8 -*?XސPg UiBmV,;’Ru -?uam%7!@tDBʜ=8(֢AQ-LՑw!"FU l"-׹x3SgNq6%p߹o,WJ{YaA|5p|SkcNTtARpR/qbԷj<7b$F5^,L- oܴn7&/L]jXF/ lm~Af׌-ajV}JUר/h< MLo20 Tɢ&||% a>+I;;)Òf -!#Wڈ:PLX^^= ֔Ȧ-leS[JA0P /Z? ?Tꍅ7 )V4Foވ)-#V!)y_r~ cF(R1p Q, -rmkG/r|wd\F_oN4Om QֳRJ\3?c(ΡPj No1>Q ,ÃbY \%F7%=ʛ*WrRB╁j_O)q%0Q#S<2CdV"10HM]za/;*-G9j,CX<8 J%FdXRWE{߶>\_q5}AraxF?R%?UP^2(gld|\V`=1H4SMZ[aq";:?oTJQ nS[m>UASG=9I{q#]ǠSًKeç;A%zAJq)=t뫜_n_n@!n*|^؍On+H?N.NȝCiR*QZȢ'P"ʯV!J| -ia<u>j 4}29~~IK - !":=Qckey%B_ԹW*'"6̿ .0OZu 0f;H5qFf^H\ܶ9<}KZYD b݉u^1iZY~1ao4wɇGyEj L܀2ot6ZiDcOF0aBOe"倘0x'gJ<[2kr{]MD*^e=njQ.n.UnfU0%JbW*-q}@3zOp/Łq 5*R tfA~__pR*m-;JxpuB䚃\q5BU_BQ 0Ssb` N>*]7;!f.ZwRZT8 2xn搹q7)%Yr0cH sx _*2¥WL8[^w)慘:B4j\.t b|k2+Pj .܍?ąwFPEXxv(wG+geO'")`ՀD萊E_#nbO -m ޅ+-W+gG`dE/45 CPQ7pWRjdqʧRߟ<$ka`METώq.V1𵇋Pq1n7.*j-urw.NȶJ P%Vb+D!D pbiJ> ?\ȕ.}ʔT+&-Sx=z 8LH2IR_4,c(q5crB\\>C:h_,T\i.-a0eJ99( -x;'l<9N^\g⡰ͳi`U9Q ? -%pN$S q,Qfxr-[1|I SYe/ŕsfS.u~X>5/TL.ہFU/9|"pc88\4w$wg㈱x%#"%PbeQ0P:yTA"/ZnrR˩aĹeˍL~摛_&~j*r\k-QƄ 0Oθ Wɫo?&]JEHqlK**h}K5/PV_/1sLFx=ūa} ʇ犋7*W\sQ+*Ư>x"0ฒQeqܹy -KSX<Թs.V8]~ -be/RԵRq^j*xXJn=&L |R]As^XU?i}A7-|.W5\'6 1,s[[ox.%Qp\qE#Hs +g.%1d0C\ʥ.L/SU$H՗&HeBJbeR@(֒@yY.~Da/:j(jY,QX.+++*3ƥ\Pps_L]JypC2Q>!P5_H -Yss\o>9Oeƪm⣈PʇJ]J#.$A1W7R -ww&Ƽ@;R$Qln -W#bܤ[Z4fm-SP/X eU1Sp<[ܳV:|(%L~FkWe,Nu0X&8nQ8Kfxx<R_quI\'ɋh } ( R)(+X/y)'| -7 z3GS,1s> ~ TFFar^|UyJ`U0l#'T s5"f|K|AKz|1NUBΙAWQ4m) $  fQ\wn% -SC5K`Fk-8?HK~5phϽLmMp,uҶ(W -ڰ`ݿA|,I^@1jF:#3 j+2qqD_ߦK -[%\SO\}P-Qji% P~.j+q\h1Ш aU".P-ָ3*cRCq/@q>Bx\ 6'|S,.'hZ S+T+1عPٸ[ xSTÆ}D–6<xq*'`IOP7.b\8V1S*!n%E#L;Ln=fAtؼ/z^Fn. WŸ~Ou ]®RqR&jƃ\~cJ335qb̺^yx|BPe#)b }fz8#%q?-5 &&f~ -,J:p&oj\u );^m!rX#7\%(嫕e,1e@P+3k3flcRJ~.ViQ} -^S'أVU)de焌aF/+gy `E`fqx3f t$u$M" @2h0o{ xp5Vڶw֞( 2P,q]45DLsy⬣+!ռM Fx& GVqpE|B?PRmPP}@]EƯAQg+` N̪Uh X%_jRlKw2Q"/B=fU /"L`k[e:yуs:QmZ :nxftb;{qD7FLmu[ԷUTc4kA)7hjX.R3Q7JKjbCS/ }p*k.\h7!𺄯Px3_ĩ] ~}ʗ*!}08WO.P8T .ru\ĤAc!ȘVVp%*9q+;{dg?;/'qxvx-b!)zG-SVP@` މC+|*8UJkn(c5*Jd26}^#ѥBCm/`\Y:pi!+a*_(]ߨ0ieiL>MuM8lG'h2MS p%R -ej"goܡ +YvxEԯ sUDڃOwfxrKأpT  HótU/)2#au,2{[ua2\8%B7UtUiw-rY RՌ4b@k:(ߋ>,@*آTx-p* 1VYP%t*;zrޢx #W+I_KzH~{{eS XZQUP5iAT\$Ahψi 6Ox;A4 xbuj~(#L>7V00lXxV@c F׏ST`5q\@Še|'BJ@jw:i%lXL=(X{*ܸ 31`ZUDfuØp^xܺw_X6rŎRWq |?ub2UaZ¸uYPq]|U,u \~NR .*8>5*Ad|LXgGxfsX*!ŕƥDkU~_F<\'-- ^ަuP -&id4- d6ŭqd~PT V>J;й(Jf@v{jU ?IBTCCkWp L]2>?PA_p1U60u)X/C'ayfo \V *^mmh;)U -Y@5\A P X g\,(rb$ Y<-W 6˗w??vk8 3Ǟu! ]JIEyICA,,8cԤ%6OSJ8y-/'7|-Ly  -Pn c> z(hy!5!Q;fJU+$\l2%G]J -\Q^]$+w/P(O!8ZBX3e|b6BDZLAxxQ,`=59Xp8y_ā0%pE#|!$r/pLyF\j$|%^u FdFNW4ȁ% _Ư uսM;*Sofn8do0r'd@ L/Z0n<+S6\ev|}N츐(bKrPe<.d#pݲ-~j!lX0X7ij&˸tauJ!P021/Xl?dQbXmy0P-@E>P|9kTV$}eQq~jVU ->jpSsJy8eP|x]MԪ3Se@SPb\-F8},; G5\W8b3\S9G\gs8%!3 0h\dmnV. 0|_VB?cw\}\xfe$j,Үp ɋ 5yC1AAD/髀0opJjʛJ:R2J =0vQbWԬ[/TMD8YRS8ϋLܐa%F2F5 -k1냀{Prz[^׎*5/| *%RU?x!p %pk0DZԺBՍ?oڣcRҥvÒG8T?A?}>0 O>%\D"_:(fJI堨QO!lW1T8sZCLodfXEH0>NM )ʖi۽@ԯ2<"GO˔e${1y{oʗ.$6 -VUC qbC@b>S6t j,B/Cn^gĭ^ b|Sx:G8bҼܿk5keMhFRX:1[w4L8UU+sb~9B @2?MS p^Qw,ꙕP`살qB'tjgԬFŢ(P6 -%֟qpNq1*(l*% AYkDxe07S=4PEsP#M1,g&IQ}ʅהc:y%RV7~e}? wc/ a!0HC8H_i8r^԰=(?`|'npJũ|l?ŨKeL/3lQ<0%g㑄S'fW%;G8_JWT0:X`U |G"eKnns [EEVnUʕDȤ[ȸ2ؿv8:gY{Bj)C셉K|2l!kvUxnN.qҊPT.xÄ% TxC*1P*\=q( $D'fNv!OU~`Ec-ΕřemhTZPO:}3(V?H@K[Q΢l,i0c튩lň$d JӃU+T{epR5ߪ]v=m:s]]ᙩfXeI|JM0 ]Uhɫ_6]L&GߎB2\S /l*vM_ vw.uVR D]K'4G*3oZOp|ELt2y_qp5䍢TByd&,n aVs=OMԖ LBY^O%uvAm'~ }iv J{qU4F=@L-0 T86ୟ0lESccS0s \U|f__^mᦡ=*"7=̚aj׈p[ =]iUPupЈ *u>=>|}uـ`R+HS\kk~bʾՃQ=?̖);ChS!Ԩ鹈cRy549(Z/C4 İS6S.ڋWԤڤ\XL#S'R8f: Hm_^-URݩvPl~څY-$fK aD@"7 Azn<-|3m?YG4qޗySLWd?ז^!P^M7;c1l4;TLnb==,c>V ,WQ|ƥKڧk;TT%_U?(녟p↚fx!)! J=- 0`W -{gzVD - ,3 ߁~cHڭnhWHL[ -v4n;:X7PLWW|Ō&1 .:.jʗGXFg uӏ:7C)3U{YTt8dcnHbFM% *|7Wy2\nf2[ >,v[-TgxA1Lz\q sqq W )jl` L7^7<\\vp8~q._,j \VuC-LSQ0J&*mmkE̾a&>WMA )!h? -_XS9*bԹ:TRm%+Iw^9fd@+e 0>3cFkw[QmLx|ȍ,dπu S?γG4E2cV/i;#>5K]a:~h;6"CV{ʄPXfN[Bq?0,r qSwv,bA3Ôx-Pe3wc{r>< yT;%3MpJ.?C5D[~-B>KEa k}S\nXuXqygLT(lkCKjTF-UqޡL/W=ua1Pɭ{]cYmYMFni*mA'ᮥ%`<ȗW?,GJ*&Ffx̓*XNaZqI%^'YRV*UP㛟q -X_=r|yCP+.Mb(CSL游?%8-巎\w 3^z0i/ſt;etp*nZW%LTfukD]lS\?P<pDW,uj33Opz%RM5o HGvW`-o5]kK*MA"J=JGqJ§sG&?`m>Ny%W<%qfnٞx!qqc/ś(/ogQSf[{1azh-Ćp&XS9?Z9|uXnuq|NO|]|.2ri犉qf|]W,7+u|lj !_.yabDn?+i]+J2QSA  -ě4ĭ,+;]‚資p=\aL2ʔo ڑ% )fwkG=}:U9.%3$`&=2sK {'rʌxj(Fz߾1Ű1ZEp<4u&Z' z`-A{WP_NCR ˗/|/pngp8r -pDeKT")4@X)NƂ{lr'_X -F~\''CyrpKz ռUJ WE֧֯f:j7bCVirQ"5sA pnW*~ Rjw{\Rb]? bg -K E^eV:brv-.^MҾ-]|%˖jb\ڢjJLg:%xQTTlPK͜4>S\BJ\h%tq25E-˜*#&4XP="9RPNm_wi.ce ]L#^j3zyuҺ-#v5QG8\fwu `K>B=p5Vj_ 8.!%q$Ľ -c#w"˨B31RS|Y2 jpQ*_esP7E)!U0!'pGk* bLw1VrqU/z(S<<V}kl"Y(žJ -bێGZWAzLS3Cゅm5=SZ"z`.U*<7-R3Ku H(Y1Q"jXq1PǏDqPò3f'p1~59ξ/y-Q]da57b'b|(LA\ƒp3®9*(JBt j) -x"&%fc KFիR>'3)̇E$jk:j -.Ƹ8r* xu[<i6mu+!mƣvĔ`@=5lxAQV(?PUv̐ g5?`] PNlGV*]c}M&Y fbwEа=rBRȮQ+Q%)Zxj6C[8'i ؟u5vQ = )wԺt0!kl#+"5P -;DzM_pfTD[/[U,. nCf%o$Ca b - -+Sdc8!bW ]k -l&kmSX[#ƱHQ<4\ R @MQ^UQ0C;_P]ʨKܲ/, ]Mŋ+~"h|33{YQ8b)+.P,b֊ iYqQpoQD; sP2Cm 1kA0[Q!΅8ZVz: 4بHe8 -PH fj$FQ\iP+ pk"-b$Pʆu|#ཋ-$yM[pQ,n5#m晍 D\ Rjdfmk]\j׈4l -fJ[e7\Yq"cy).`1q3_)/\fJ_O^c. .eJ.1?*or&@hW3+V7%rs\s?! ^u\*JH3*AyjGcQ%++a kjr]WD̽]b>QsТ(>.K> ]N*[s^(i^A -rwA@ݗjB7D焕erx'u\x`őXb1ǝ`,£ 3rYCĺ;>^xÒZL K,EoRB*ڼww/]BĢ ybl -[rޠ6KQ"T`*ɟ]V3IPک#vj=6@QJSZR05+~hE0X]-ub͊ojRV oX/F&؁CDe0rQ.M]sw~ᅗދ0)r\W!A* 1f8&.5R[7:RƧPqL 5Σ G| \jb|T~\?2!uBUJ#GbrWP\ YW\ 用%K̾sIéO -t}2Lqu_JR -c7k -$d*{PLk _+N 2@, >RKY6,9fyn2RaBZBX E Ԧ>W6[QPO3=ʄ-B؞Iw9Tl1\]kb+qOkU MyΥʋk'g] Thf57b_ӍvՌM\bvSH" 5dk=?}Y҄)+

sy9ԨFS+fW>&Q R_ e -W<\hqvT./0?AZi+W6pJx9^.(5 -G44.H*P|,Ȱ#[Ծ[8'Ss\cSW ʪpi;6m',M3¥27h'\%1#r5"jE5OJ#;u&%V2a4I1Fْlno -߹5a|g\LmƦ׾q,ȳX)mim6|K<8@a{H<<:͂hB_kRXLhZ\FFH45Kǎ]ACbqT%Cަ"|N3)f$(ش}K.k8N*f5jUfhbZ;|Jau/HIT|1ar e\% qq`vNU)S[3$PRuC)Hdڼ+pANשRl}vi,7h_ˆYYN;N]4?)?* ж) -R.ʱqsF¿e*qc픬'J-"Q4qQ.ˌ9y~؆%'1{:dK}4ƹa5¦!S7yj<\FU~xx+8G|ltU>+A0 Ȩ1÷xR8ۛErS:_= nWtWRm햞k]\_w "l Di+Ug^l@=F -0FmA&c|x넕WjWƏ1~9|к/ij.!l(PQx]ReEX;Nr+jmFsï|YpeqPcSJC=c"+:> Ό}Y]`WǶzZʹ?ʢlĪMK ˸_!ݦ%JcAݬJ9TK]# }cM&y%I ]eeRUJ_>(F`r̩6Qc5\n-qL|u7?5;'rSw|9ILY]uw7/\cr"'qS˾ -~_''+W=+qi3&n4?%oQ Y3~y G)|WY1)K50P1UF ˌи%단d*&][ޥPo*7 -{R{|z#ywqos hI l[bR-эvinNw _\7CK4vDīaq;TU-(!/ j[긼8TU0o*Pm-^j,&SQGAHfՔ#\_ j-1|ECgLpC6o!y1(%5< ĩ\301dbJ]DYj n[P5\ԳS{cwqP璆7 0(ϥ{C(ERMLss:.q?:Ng7âhu-]z>6$ya7eMŋt[k .Te`"nE̍XCQB+v_*1'D 늝u7e Gm{Rn:"Y:<2}|s\ws<2ߕ|nce 3eq[=JpL}|t\"gG*\rd\ 1/a|TyxYo\YBRru~?.;|]Tt5\/ |AX@p/zϹ/FJp!~p -[ BkMR0 ^W7Cاl4J$I ⫍7z)tmh#S$5ǞQ]1ZWJ egÚSJ{yxQ]E dž3J;|:Be>U;$qArg/W g|1灘 зC TM̍#:T {5Jno ~>V尲fΘdHGe+.FYf1U|ܿҍ{˶\dod!Ph7)П,V Tp(- Wp`ս6u)vq`-3WUR5Xj=/2+rUKrԐ4=:Y:BWy:P˟]pS) 9KEl-W<f!+Np@t6K7Dl/ Z:a8J"<؄vx/\Uoqx_5 c --̼LGG<0Ilojl[Wee\wrjff]򱹐g5S | XS:6RN AUiV0J0,cqn^{qVk݋uìNX Ew7Ԫe['^5gGz7_ A( OAo fopd,#ljc QJL}Kx,YUpˏ%Jืr C1M[.~\|8PQg+翍jơO D^j~yBkm`oݵbġʾ5K>9P i0 FS`VB](˪E {xVɫn[qb0 {/ڨK"82ͼO # &lb{9FjhEdlޓŬ"ae6"7.Y.YRVr зRiV>h%jcrR$UGC5l9} UPnW -%m0#eKPQX-&Ux%.7q1\yc<ߚEy GB,!jL#RIvqcK,?eKqUBڢJ!> DX]> L2.] R0ܬRhA,!W|D5p:cIkT# ݊[|p}G;[+/o"PyQdeơ7rpPZ<Q8q\cuS\xx0k*]`2; 1Wfk,,m@OtWqdQ孢1 + ן wp)*:6EF.Hz#K`]FS|]ET5+ -Լ@*yeQ S1LjR6AktD-IbP8og,x/iPsKCIBwYӡVg!aczk_w F%V -aigj*_MO E2R*_Xe; -*HJ-xC(7NkqT#O9E5S,Ψݬn; {A،)Hg#`Ƭ6А-Q~C*vE? -;GꙊq_b. JGq^/2.[𼳯\Ѫ&Ҩ251|θrqYZw/e38sq!5#2QF٪RuJb\dKgˎb,L ~7pUp=$"!j/XjiL"ĵ:ܥ"9!Y٫ 3O7Qނ 1%5; w2لD[~tE3TWQ/\*G)_ /S3|]D#TéLS< -upaԾVūA ˚'sþYY_Q5fGB \Y\vL"\Q.& stFZ;3o "]:(jy L]f-`ކ@Gg.9̸-JP"f#%Q ~ n/&bgmP?" ?! KȂ^7v#UN*yX3u` fDJfWKe&[ Z8jĢg3P2bRl<֠LҦ -|J:X hʪ+V*Y&'Bb0LH^MF7wCyGΚU+YdUqҋpl"^ Tޱ -^UR+ qLG nT;y~~IRd3atqǸtˏ`ˀ;p-aDʍPQeDE U 0 p"qiwbgxLrsGCªbhpS<1GxA1e2_qu!A>9({h6ޣ/;JtGfmaUY'`e -k&ܲ,s+eT7$DTcu7|${qREǂ3<qO)[uLjΡjG\W\W W| x*s@1-w/+Σ\<\9oo|kG w.[AdĚ8W/'c OLgF"5D>e.%ĊHQkha`jkk ,5E$Ho BdiXMүr鶛.?9Ur0_Z.12\^fUi?ES)Mxy.;b4k0ŖQeT:D̡ 4+Sj˻`V/h+,w e5ܭ )wlȏP(Uِ~Ӏ9fKr -k-'N(6 ZAݺSd[a5JVι@ku|Sխ5;6S3|*kh\X>`:r%()e΁|cFUw|4|/K* t|:(t~raLDޢ -NArˏ \\R6"5_OLJO'ؘZ''  &= VkGA#_#٨[P:*GV/p `ݞ`mT?pź_@]oFO .# ~ AQ P+f(#s\\eY }6[债HDG1b2 bUqԾ d{aJ.xX1 ru )0 ; k*WŝϿΣf+Ȱ`6R:lgDs#yps iBԶ3 -5\W$Eʚ߫EO-Ńq7RpUb69% ޠB% [Huo(P=E]=QȰj_M(J4X R-Ye;huDCW̠)rxp|]LmAsP3(rԧ|`c{je Ҹ-Qr8~P=3d[_KH6MΤh=K_7Α@R!}.[JRxK R\n`3u%b\1uXg\Q|ԡ*? -PHG˸D&W.\r\UU r2428\+xcb fe?geb5+^?cR.bVÏRaz)R(_1Qd.*e!x1t[F eڂǨD=(ُ/qK|13ťֹO%;jv~W:eQC.&y\M\;hLFx@,/F,#1.^8;n%rjXmx?48s#*at\UP* -/mG6BjqQ15 CPJ`6[TƂ=Ql/\G|8ЍM!m.*_.yeloVM0% %(&eb_E"R8ۮiQ@%˟J< Q3q#xr|pWdʚ,ulb_7%yRFV -Υ| R~%ćG.Ä-]|:1q Q:cLB\g 2Yqb". -8,p:Mmz.5zOj rm0Xi'epDa~'Pm3>" ZU.Sy$@h6*9j19?u zKYi\PwE\ RMf mU, o-̗*hPXUNm<-[):2,~[*bQ1m:4"/) {%ӿ16~KCs3y9V&o=k(J~Bzr|cQΥCO2~O$\$pr-B[ƒc8H{8W¡N.0RW;[C)y&gs>` . Jq\\s@H Ab |U{ % 7yދy/ 4D Hsi|"u -qXhkN.=q|\i)i)A%r6nnxupf eyEu*U\MEeUŸSW.;T=M%$xHbr˨K0\mZ;Z"Q{In\nl/OAO.~\}7- -]w,*')F  cY˕=&.buKBu̮Z>DgRʣ'rV1S<1M-ĿtVNW#|W#&nհ$ -6T-]qv30WQ>ާ>4nPf ,.+]%ˠ@k1ID4(H$2kB:.*WK&4ٱF̡epo6b Jpv3$*7y,%N)StJaҋ1樿(b -bL0UZ9q%Ju11,x>;Ŕe*fڗ3-Ep\c0v 50!~nY:DIT!Ylt~f$"P,B;o̚7,t11 -嚖uxw/⻝%|esqS>f\TўB`FNɷpܹpK`es\Qx/K6s˝K1ZL zD}叆3DJ7O~?E 8 -Bj;P&wOUh@ H$Mе!lfD)k:%2<K3r ۏ.#;&D*^%=AQZuK@{Ì\ |:ܺᰩM_ - ю=FTI\5w pPtr~aP[ ExA ̩Rr`|eב! ĈwŚp5Jg;_ a} PfN 2@x5Mp1 `\DBVs}{%,pbkQg+pjYXxE- tExquL)fDb[%L -LUZ%BcK}]X"nQTf:xQ*sK8%iD?e,d2UK%Ր .>U)b4K j,)3B 2M؁Uo"DھAoNZѫܥ(KnURWɻx ?vqli{HQgX@=5 -UK{xJ7 XfH\g3YY%\JBUH* Vyi}? Y<K9Kb8mO'7+!}OLyĤ0O=Jn,+H) 1t/5j[d#݅LGvXI_5WlIVU#) w-Ӌ`,xQ6u^UQbP+ --tYN'vhfyryM5ͼ*N:TYhL0uMgqn(|<g78U"_񠫃vv]qD=@a w/?- q\xcEn"g@tMʔ]pnUoL~J}KQLfS0u%qWܯ -q\J\hܻb.mD+X.u.P4/ -+eԻ,{(0KO[Cru^5ΔҞKYRi/]-)ZTReM]/̸fU(5j 6m[22qoȗ+B pԕ;;R߯-G_Wz -q|_++.xXĹr bW2wF%F+fjV"*'OM+<&EU@yC(ܫ!z%Y%-+hODIGPK(T0UFLvX<7L"g+kL+>.poƢ\5u7ȕxJ?Vn4pUpJȊ(-Vt'3 -ʦ`=,juJECᗸ9R`"Lep."mqޢv3)^uȤ; ͠#$a@tJnW J9! Ri-?żZ.ݽHD@ -qLljVW}[na;*j~⎦5o'W/ @(w3ƢN@ޣsHu0b胄G/bUԴ Xf~!w0dzJpX\p#֭w},^n,̮iC4Ii^ -ژjd "!]V2^N GTJg*}űHx0, :mU_/5Jpܤ<I-O> AATo؃V?5 -(h|,t2/ox>ufgZ$˹JJ&D ?qA,:-^ {~薴+b)&~/>7,R5-*pUe jsyJp|iTDBV'#m*˭iuUtNʍ_Vn_Öphy4q녟q aC -/ ;^!w j(\ UWES!}ZV*'wrMQwi -|sNO2ɗlj)v^RxH:]\SW-.+x}DEL}\2dO9ܯUqs/0aF)P9մ)}!>Ǟ K&'OD] -or@GsH 1 xup.a>*/*~e+,/=StTr kʁ*zv\eAhl2GhJa\jjP.QC|ln` '/Y]Eүe*>J4:".jtP3P~-KXf+Pc E4c ŭq;+m~ TDHKĩ]s$nco$KnfL虗<BO'tY2Vv)~Uvs g`vntK\|?ߓj_DZs˅BvNj 3TNzT.Jږ[o\*˟S,v@nd -\~RɆYtĶ_I|$R^jÖkU/dٻ-s5da֘S?&Xܕ-4ǻŸ$Yn3wR0,\BHB -!}BK)qRWY/L!_MAAD4j]n2L5ԸEΚnjG&@K6 1~|@0,9$,!}*;4q23*\.[C6Vcݸ/z%Yx]uT4eWW;r|OckQC⸷y;+ f;ek7R8\G#2A~8%s+hW/K[zbT!XZ);)ŵP:z3-eHaY \Vs1);R\C;PhoqS5-b28n *>~9z"HzhVDƸ5QXSkˈmTm¬`OZwPע]:"F/qXC|. TQվ  bbH<p~l??/J]uԸl;@?dE_"]KKx.Y<.;w(uISqp_8?fupp~8.;i udr9YL]1baŅ\=73/kp4 -ż\7qg"qQkűQҠϡ.+j"}Ib䢀ژWvOv -7G=OKH;#kw*K)O4WRmᓰ.]审3f PY."Jצa!4 je0@+2P?/*S T"L/%.p|.%UT(+@q9cu1e=wcMKV{LvE HQ!K-Qs 8#(ȋab ؑ).3拏/yQ;/w+f+ ._Wb`3x\Á2N5)U|:ˋj\x%GEFQ}ˇ1'\ иf/ Tӊ7Կ,.R|\, 6 qk,g(JƉla|=K爱'W,-W\7|]XӉtT٬ǂrda]Z@+o5pp!-W62[x1&<+A]xK%'*B-jTL.p@*og -AB:| ~ƞ8Ϗ):ħ*&}_32u-nd84@XAe1j:$T jv +t?R{}CϨ V_oN陁1稹E*\bYv,\<1 SwY-y%S4/[ -ipqV2 w H#uޫr-nX,^aXpQ ZDsU[,TJ\kGxľ.{8J8W.TqJ ^;^kx(ɠ8'1<^# - ugVSu|XPQ1qmDlj|JN26gbWQ$%E* ՃS-BTu #1 XT ^@4]R㢴ׄv* -OuB*<;e?2 l:<O$@ehWT9#)Z|<.f9J |,-RRqu`L4fMJ/P]!<˛D j{. ゾ :V::g>Q"0z@yG2/Ļ.^&iˉ(*]-<]RrgCl0iѹ%#udulʵW.Qhl}.m51ۜ@L XKTp7bYJNt'0zUSe弩EƲ,^_: >DܫWT˪U8 <9W N/,`~|pEY8\VUu$EWrBujZԳ"eu0U-<3ߎ1ľV?DA1t|xΟ6DR"#H|t\T!/aZGsDz QYcVhSP%#/lk -zO/], UdE@P-_F\W8q8Fk8c)|&cKgN4ܷw̙Y";VP#=Bqa֞ɿe{+{HlIJ=a.@NՑЈKļ:uKoa #).3ʙ_2ӊ"%b"J:jgA}pW Pjl&z \?<]-Dϥdr(f-NF17*#QBf@H\ك5MgiT9[d`%4WPMBptdb62rnkːO5.ġGګy>dsf?T&cͤ$&ԕKH'Okn~Xe -m : q]-e\ -}3P^qU!M{jG*')F|;)3z-mm #]wF& 7ԜI@2ʖ=Z.!fq,aڋhTGFyET¡J1rW/]Z\:#r }:K+1>@P~Ko1U_\ _҆BPlj>At}*CJ>)/r.}Þ:,~Nc,Q? I|$%\M$ ^b|6|5/K!^xc-usHwPJs|6_dN#ɀw~B4U?=45?A#b}lb}EƯ#&KRzmqd`u "K]r̬Q0&j'JJW"SLZNwaMvq8<4nS632dZm>!]1/2&8K81} Xs+$#`ZJc@u2]K- -a7Z) ]dߋ}˸_~S kmHkK{6Bd}FŞw`)%k~GepPs\8䟟^R %8-,e̦IeN^2B`T ~.!*lxb4er .u;(S늋>G̨lquq^`S/#1E. MpʨGQ ->b1iܰزlֵpxfLnI YX yVC9. F xI`U;X'cQI]@Kj yhl L-0Tݓ)h,J9&ZZfs"b)]grn}Wc(liWKIcc+V}ۼǸ˂ҭ -~EnU|o7yD~9^e_ LƼ˩v,Üz*?qTR'GU o)#Vx -ά#j*2^׏ @zkZS=[~uQ1@5>J<ZlEj}"BHQ\=T~m'7+DL#@DL4܌*`zz >ao{:`Rl"RK! \0  >uFǒ1.TVe$!H1x8>$rXsh+\((OûԹtJT&B du*?da(ڕl.!P+\%<(LU)c+q4-oTv26p,8w0K3 4=E`55QJnT+׉nfȉ hӾ&a}A,#NpyȰX̬b\gR -gCfơ3*(,_Ƨd9K@S_4_O쥦NڅPFXH"QRxf w^FSp_idTj@Yb-槇>b?2Tx6#/45ᖐ?inFZDݦdI6Z&EJUNȝ'KUxPMJy~;:g߶8qtV@GXú gEU,LQQDbDhq-@|рZ9!ԄfQD.02sJ+̉Dq-" 랋( mv|(ᘅK-]٢8*zқl4 -ƟrpCȂzK7q3R -ʪ D N.HQˢQr{!~A8Ov7T`0⍈]1gNQ3kh 6 -6T֥1ŧ$M-!|zvH&+P¾}n aBO3jWqf5xjX.u3 H]L;w:T>8z _\7q0ԵK>ujh?r*{^ iy)=|S5a`bE;Ix_.Wu0˥KMK)#j7 -N._-` -}:x }Z.YVQ:LCU1ʔôn10.=-(C|*<R YRݴ bi_3^%Ar .e 6}(^(f8*j~,E_HPVIώz/ǘ6k\$@P1nLdT> ss2h_a -2V}S7_9uh)'N`jIfþF;cfɛJC-1?p<_aHGҀDWۧ`UԤBǟP]JfҼp"KDjǣP9i,~6JD(-kC%:)T rp3Rq-WnzqV\>.TGހGR׏=%DǾ*  wmP552u3ޡ=K fS zb"`<7+W -%>eaΦG]oϷ6_\.恏K}Mo A:( mQ?`TGwg (W0pheU1fybE;H ނ.bj+qfïC^%A:@a|dR8%T 5f D Xŏ^k^;翂.^eH0ux<bNn1nXaXj?˕ pYhI|bhO$`PJṶ`XWS\d,5X8cEG[A֙ovKzZtJX1IQ$(Ecky@̍}T-ai*E04-Ј23cwYZk% Jw֘\ؖ*Ce#\σn#)u-,XcJJIT%\\lޑ%?u5"^U-&ƮWlc/p50^;?3W p7ɘqZfgxv;f0ܬRK%l^}Mon+1:H8xl A)INѿAJ0&D+ ʿ8FGqň#O'B? -QV^@ K?IR5=H+UǩAqo%p7\p|˃3ϯ`U#Wۡ"%Bb*n7B)hajE}*%_@;C8KF:umTt'ӪGM4tM:}.U0JX݆^Fغl.!hbo͗tS(`E.-}FiuM[cZ܌[$-3dy]s%Y3 7%ߘ.sL2_"F^YR\w^,*|: - 6oq\tp6D,CSk~(Gɐ}z g - 2~_:$ 1p{rKc Y ^"zL U,`Y\"pt<<--|[D'>F]L~zQu 5p\V]E,W}3jƁ(q*Lx> 7/<%5 WB~~]IUWa~YI2= ܶ1TU`!eAZ&삾ԭoMOYtǔ+2Ŕ U -B{s19ĺ.)/I+K1' jQ{ -¹h>vB9p.c6(LauP~o6$/*ߘAcaub+R"fXB\ (S+k1n8cw;8Ap ~R^wHwu><\"(#'P~oԈ\W}AawukfV]B}U^u"GUFr$e3|RrrM#⧂`5`eԱܢ}DbIb;aؾĢXE*_CzeG EKm_=Qe1 5| qx(jqWf40PW9ޫ}VZᑩpũR]=P7Q[ԣ ꋺ6[€DxqpžeԺ|O2N`۱TLkj<]AMPʲan;P3[cKqPUS+GWl3HKoh1?r+3)n^wŜx<7U{Hߏwż"BįތѶ6bSpmy]v #:}:,! a)Nj<@Ac~lP[-]c?nY>]-5\7pPtJwg -uMPr/kDTu$n/r;a-Xj[̈́}TQ*>ƍ v f=m+*T̶hh[$Q4zndʘ,DU1԰ - + K!\j^J86^q*+ʕdR)%00FS1XDdt3p[cEZ<7XyǠ_."SIX|h?)W1U[ ?mUDbΨ5 =|rRU'^]3P K;8ebVa+>+%Ҡ5,7\Ε0~k JZsx]DB؍5UJ -aJ,$y5Up: -Q,^e((M ,GP k/zb57ԻL ܹlS2CD*LNGƸZ pMw7ܷE(o늹Q]*y$ Uyc"p;I v?i쯤8;  8(p>`mlل|9NÊ p}ó݂ =Sz\POpSbv濟aŲ̃^(Lf˞K .j"-R, VOd5lw{Cu s7Fd=vF|B8$f-Sd~Sd>x]"\; -겨 8R{9yWC).kK/3Կv j\|\uhydU^wZ!!Se@Au~ CPo T9e_!g|XGU_rӼKc bXOm׳ser%Z995;]G7RrblR\"6"W\j^U–(f<~i5pbF ;'?ɚgmX&1D?ԝ^?`o%̻%UqyEq;G*ˆ\n \\#G(y\$(*K`>Ub6Xn]EXF$bFJQ~m$K/?J.1Xb9YBUhÚEKqN&J#iˁD"jJeSw⧢,2JĪYTF/I0fq|.-fu3 -NM]8⫝̸/0^Q$fqԧ2>M쮡eyQ6,x_~|j?*ϥh.;CP+<\2ȡ* c>>GZmK)[;}#靷r6 K"E0xAͺK i?1]̃ /\Zzz`5S*jWp1pdcLY=IPbfL欋| \/ir (!# 8Ҁ-51q+$}K{|[ˑ_hopU:1ys|n^#du-{%cdZ&1/JOM$u(OsaVbp>'PssR18OԨKe5eT-" rэkx;Ke,|u??]l\1ι a<ueKX"@T qa 7wl)Gr K%Vpu X:b>IpqaNi*{,!k\0 cAhy? Mg჊LE |oGo$q\H.?S "` b.f\14|_`|pr3qw :H@H|ZqsY낵 wW5O'7a씷&Z^`6΍>+'zXoQd#xEj A!$Kj\^$Zv}+U`;{ k{5˭5rc1쓆ot/Cn)vԟjYaw @.SXjVw)7VC׃P/s 1'ZE Eݞ}`P$+PV񵪾TK]QԵ HX4$f_Wu~ ^qbu-ᯅ>~U |wE|~q?y)Xga|JJF+UYy"ÁX1: `A_!u_\ L)rb2Wof5RFv0/rqYdn00ŷ|[PkX@\[8^h2҇Q!xÔ!n@яEjWrΡNJJ:}F,#|SP7R/mD2rn~c+OV&k&G/cC CWW±vqR-#ƌf%3'%n kmu) ?Z~3ҭ\LQ.\3jٿUT?#a(=%왨m<hb9' B݅@S$Q=@[FmzVffeUƨ*QK%pJÊ'S6B -L8%C? YL>5ze:cU^=TpL:|_ó"U_^^6{TnzQZ ~~E/"l;ޮ%oszt1jW;h Ug@QQqJh!^?3S(r~WB֣-2ڦ DIK=rV0/ԉUR}}%SX2 w E D^{J8ڶP*x:RcoԹv4JaIuP<Ξ*2Xukေu"eKr)VRejdbQ&: -zƹ̹{<ٲ_\V`|O_'P5*2W pX-DĪ7*2AD|jU.1eÊI|2\ZK客,[FV2 >%j5ˈwn;t -,updžHTͻ% -Cc*-F3h) -dntK{f~Y VJPne^kNg\U1 -nWlDf.[ -XL~vC3.lx_:Tfn\x~fɵ Wa\Wj)74ooX0Lܮ+|6wwNR9*BcPqw-e"TuqRmJJk*_\jgb&h8w31Qso˱ߞo*DN*=~2ry% CrK"71U;y R1#b>Ws0f{N7=~D8yiwb3/ԋgq: @_:m__ÿ`_kJ"uxw\8?p*s: jcqSKܮ - ]K.(\ r-Eqk$y}ϰ8tU\b] A/7ȜzR:7LÑfEJ҅P e?G|nKQ38zF]j^ 𘀳u޽ƒ[U7xS\gmO+ )"쮩'3EW0Tԣ2ӿzYPsفcFogJbTS's3.L[" k!gЂP~"+f\)IRo\WRb⌋v>aߖ&QA**V9x8.U~ Nu|/wŏS.a\jw._%w+\`Y'3W~/Ľ)V1+51!FL -zxv_4ᶘ bp*Qgq|tĕ_ -y~]WʏS+ -p&̫5*3~ep3[TKr}|SS`0pS/80#Q_&,"ZQ̷1{s)ۃ3C:'T| g9{:P?QD֙sd|Q$_V/Rp:ԁl9'O#Ww%Ar4K;R E-+A=DJ^ ,QZ*]E u(S#)h\`P.J*TÛ~1+g-T=a\'%nA{:o;Q4;*"pjjZjRBP,KN^⡄k+ I'? Ua2]SeG}(ib, -s-k -[[7qիn,6#T -P,6Lo#gı~%KS$/n]EM"*-Ȏ;/!5 f&BA!\QܻԾZV"FkT*̪7!\3|q(_f|\slRb]L398#?|ˮdU>'2(icewy3FZUp(I{ ):Ԭ@m@OЪe?/% 3Iur,[ƕt- -n-P)H"C;u6QJ &qp|W(x`0|w  -t`]L -]IU-l?I3Ɵԩ.!!8}BŞ #l]ˮk6#yOS2Ce? m<@[  J4QT֯l0RqK3ƾU+akAlGmc[zo?ZʔBȖ.I@󌺿pI[3-eX=QE KI`uhct5{a,2b}hn -óbIj{12l|ܸBY75S=yಂ SE33ԼžH\[hvGQ+ʷfpLP bT(,.*[)2Ëzu|A^_y$>gX0q|a a%V؏Cnd~Aww1G>t$LPnx|4|Ǜ`TzbRߩ/zd(+/<k4g\XLu35+~5: 8uWksB ~ۻ,q~Ȳ~PFlNWdQ];) P:q*&pD'ot@ @ceby>c̿lң=N60B~ `fB;bXtjHIхmc?7Uq:%wٖ'm[,YB[玉uR|] _ڟjvp a@Cbh<ܕt E)>6.x_ sQ.]05XnXQe[:c}K\X,J 9<-sGP,7/+xIs3/4a/\yQaܲ.fxn ,&+yEA4cQ]K%K K1܈hVyHS|j+Pef!{qSy\i*7TAs{stCPT]Pxq?u0t"(_h~ ?-KQlC~Չn,[_F&C]BѤ[}R@;A/}(-p0!& 4D)L췵bB?d)JF.PaKVH%ь4n8D6j? {LA'gw+D!m/"2W'>]U.]lj mȳPsiTc)Io\v@ \ynhtWn|IH[%6𕻿>Qc*84J)D?QԩTle<|Y9pYh,\C&4S|!1;,c"h,wuSe$ R ĦDΣQW =b(V@cSWp̹eVƥۃRk @PO ._6@{0y -!qT -@Do ZtĠ)g0^f-,WC -_n"Mb)C{c.ʏFZ`pKaEJΠQ |Ì;c H#Mb9 ,w(o#myfh~6&Ţa_pG,[|*K6szݢ?gCQeR0.\rQ?|1pW#L Q1l&5aU򈼄IY mthr/ԦPoY^˚m5U})PC^306[/KP㉪MUE:ƐqQÿy]|jUTx׹U._.`EY|R<HL"ۮŜCdʼD5\e8U. 1P]<8L KupP3V3S]90>!nW*05O\~`W.\KF\#/UQuq(b&o8 xr,OR/7g{nfz,,Va.1\zW2rvJ7]pdR\s Mכ<1Ծ:Fe⑸-pjkqP к-x8H wB ^j+-/*;%ZN|TSQ7ndFG%B D@@PBXVYbpMJ4īOo1^ z -'efao1q"Cqk踾"oGt:'ү~ l+u|?TG*UKwbF7pMJavֿ .Bj8& vUa@z)Y:!w`ԫRJmu|FکgWfuϻrİ/ԦY}L$p _ r_R`U8/|+0 |Os+L%b\.|#6(,GX:HElAE N~YPMLWT_ƊPB %]Ap^e+5 -9RrښvØPEl#AWRY3N*WB\l.zA hIQ'2^\@ -Zh}qb̾/s  HKer -VueEEd "sL?*1Uܦ&ylpd20 \WTP.^RԷɐEvJkԯ蚿ͤA9VZ=;>='U?@nd+84Unm2EH3@o zM5at-hdnb BP_`mT/pΡry<@ LA$<\y l̴1l@ 7Y0W٤OݖeyhI*h1˟Qi\bz%G*}LΛ`慧$>:?bnM鸀Q+"%1I1mTGM%5ܼVM%( wM@b~f1 KO[MxbiW.8 * F0\%Quش6-:Zƪb9ܩ# j_/T'g넬F=ǵ߉%d nh?D/VtD!+URu72J.W,?]|nW-` 9̀˨ny/[e]Ke -Yf}|ҮxԢezjAUR-D#!%@Ahuܸwd%p '20}"bN/+$z[dRc^ʡH hODwC-XցSZi1w PaM2.bg0Lʳ Po 䰝"W)mD%@W7o&`A)c$c,w\_\f8Ƨf%JfVn;LOrlr,.k9~ R5o -*Qjq,,.er7^LS*T\3r J&,CG.Gs3(!w2o7^ Rsx0R_ -Z"<8x1k[3q|RۘH,]~ aDfjgqr5ַtw@o~_cє_(}X%QKæ~?4ηWh.ALq 7:*ʀZBakO@=EMW+tbX}DX/C6B .T3/8 @WЕb++],٘rxG7"ٍؖܖf#[)E츩CWd tk;feƈ #+BC3D %Ƴ>%D R =`7h$TS1zV=,ERpv?<] ԙ:UmD*P(\}̍p`26$X2p_<2ʄ])T[ -U{a/1J,ͯ\SiqeܹYhs*jz_1Uɩj#[9#6:dL1O2ˤ{RNuwhsrixau*g; _(7o.2d!|1\Bq 5.5\4ָM1~gPa<;⋎p+O5(c.r끭a\qmUWܹ?Iu ~y-x#?|9橃G$F}H8&茖"~'x?L)A0&b/ + r>H0NM}* Qs\_$( taF΅<+A2IavDXǸ E2{UD Psq$7L>"& ChiV+[)n^T8Rxj(Rעqift.bfq_P>> `0WXM(n F^/DnoeRM?sJ[θgW£)Y>~ TuU*|r{YXh4}nQujnRaI&DBA .S;X0&:2TH~` -)șNbUL_fk$1!ŗ/TFT8B? }poq -VU.%YK{pEq|aa,%4#,mo*]t<O%!U*_6MW, xiD87\ 7y~)/D74 ,x%T8 -rx]q_%K[&7>l -q| Dw5xID3 24 c3Ì˖&z~xs7e̹uK"Mrбڭumi=Ho\}{ՖCZ -Ys=iB -A4ÏD*k+Rݼh`⒊(w#K6LFU K!<Cq^ʉ 0Ju4.VX~UƳѳ2ְEBM~c8ЖweuS WeC\~I%66&:9H bUcro1Ĵi%C5ӷdi͍68Ir\kпu* 'r۩VQW !` E!*D!z[>iKLՋ_zgWxjZ!zP lVd%暂]JϮ.}Se>2&j'ria`S_bnkCrETlV<:*{F6*KV -,thc/nS*4-)@|aRL$:?WEVx\*i m## <5Y#׫ȜuqvW#^q5ݢ¡cŭL[*C<0ʕ=㛯zΗtlFx?݃b(bm(CCL+qĥкm5-lέ}RD'e~zo|ӽ=w:WFP |p*Ў/H?ŀU6!T%VKe<zxC.|=ffBˢЛPdZ8_16D*T MmnZ6}Ldfa/p3!/sj+C)r\m*:HIGW\83-X0mXqΣ3*&oâer{Gxկ5E\~K@6o-.uFg;u)OTxx `㿅|.TaG¥}L7QY|&wPUKS8S][0~D7)v|1Y4%/SFucv/GQZhۖvÆ4e1 V c|3DqZegZ*VfCUVBk(|1D+RݯQic@go [w^i5}&wE7S&PdEm[J'E/C!p^ )]2y(DWˉJ&Y%\C(=ĕ+P0U< -X5MEAp, l 7P_{| )pK, KL؊1&S"}'D PтTT Sy alʈݱ.ԯr8Os d^ -\Һ"h!CJ P8%{QT1tC%;]\Bv@|źf<r$RTGpQ+M.FFw y\ ]t#~Y5ztˊJ;ep|K~Ua@߳$œ_sܖX -3Pb~# IT[ [Qܠ TqHqCSKɖZ -T |K\B]]Kp`1D5_J.cS_"=9XBFVk\ xy!ǢTSjf䖩 P )Rc m~ͱyJF\\:QxE*'(Cy*ٲ#~ H^|2r k?S͔5Pd̯¥MZ\6W 8Qnn0*[Zg)̨_PRf8\'%if`m!+R.7#uSĦ_QΡ qo >(G]W\0-* Va/(qP( ]R9.9`4>w1ˮ.Wc;[a'm:YOOL.|T-iޛ%SuR "G`P6hxT(zd>PO a/ PϿe,@B+J_"`I-e#` ^Jo0sG}0wGm.\ˊ!E?5s4#Y/㪊 S >hAv ę3Ġhn %択!Tj-w:_b`XۀX}۹X:'n!_%,V ={R@h0ܑkQe)آ"DZ?H{%$ڛnCЀl{nxrpQCW!1DiiPǩwъke4 Zg(Y+P*eڨX]]•o ]ԛil5l;Sǧ$|;]*@Dv-76\OjWO6iDͰxM Q,M 0{-!J-fW GnQ;gKA%8y#O.Hjc SRV E;F`SbZ!iϲV6#k}W-Tvz!p~ -mu/<1*%1qncgl/R*wVljrrGU$!9heBαoe2zVo\9 H|G7X2w*0W *wE* smŴ*diz2)T=R ĪFxoQ]35m2㤨A̦2fZ -e.^huǩ38 -M\H*QfjY.#_*8xcNZ` qN~(ͪ{}Vm+^cq[0~jjutE$J.!*<<gJeԪ mQ -£V;o7lԦP_`]U$U"Xq4@|zP\A!Wᯨ=7T JtkF ekd]F4*ˆB䆗1 upb!eдڬ|au<wY:2Q(#Bg,ڬٖU4kqR̥wSYU,r%soavn]Uz7 -(*AGlfCf:5j_,$t+_w[+gP&\9셤Ti 'YJb-E6E1j%@@=Źn$i˖͘l~ݲBIIW<ʵ<9Of?Zg%<|3DX% zE5W.G=`Pi_%]bQI[H%M Lҥ\+ɽF-R'[>" -nahL:rEb;{1 Y~YkܵiA <.\#p*#b2,UƊ䎡p􊻲`x2YןE(0-?o{a+^ܠrTUrod:\A=J-ŲU=- < Oi-Xtx*k+JHhJRfL.kg(aPc+K20fTeJ7q J|C?Lf+P%JN}[1583놸s)x{^](z\:ߋbqYu<2qEw@7n'*^iy`57Q,x`> EjKu)QL}CESgB@Oc3=)iN?zE6rە1E2,7.ݵom Qko ]!@ + OP6ex}Y|QrxxB1N30崳 x:iLN tm͞ '4CQ_Tyg*`T3UihbdaWliT\CS#K ίAk^ӆT/Cy - -X\aPawkV iP Q v'.H=m)0..45!n*(Aol0&U:OD"ڥ\13gt-gY\?$2mD;>{;*jr!LtXܩP)0[-yAnd/l+0 z-PGNh 5Agmf.%|O% -dD/dK@_EF,7$:A3 -pƗ'q⹪wɣwK -lG{5kYpH;'lΉ+DBĔ ԋy"ّߔt#`#=8WLvO PBygNjFfu {p/Qb\5F4- wU}:ܓdt!1*bI]1ׅ&Ώ9kdՖȈ5/QqlEGEL"vB?" LhԻoPz5R4upK"V+/W;鸂JӖ>j30NDՠ4x}|vSc?P*OGbol2+X7K%6Yx˦ kCV{c5R"Z_عt@Htbvm ve+aU`ؔj"U *W @nc-jEzKR V{o#|u |'TVMXX2>=]SiƐZY|蔹LoUݰlߝEmr+=-5?qز@d;%[Z?3_b/DBe`YcZځBO*4@vG02xx<=+5 mh jc&@] -UX<$_`JBih -#BYPR™K-.2&Wirsfju2w{ - iۣ -۽M.Y : &yI -}!Ye5*^/do^O*e+- H'/P^U>żue΢Ti%pj>;n\>5އQ^7 -6,J=:h(:!kp={}(4Y`+-kqBC:eL~e}rlg3b ?Ԧ[nPr_4b@CC7d[|ZO(K(յ<pS-j!N%uKp60Rd*7S|Z!Us{jt,4T,PLL u~~h{(1峓 "cޖk@T?!3tRHCrC,QN£\h`tP!|y!.r/~H`X- cY6E3&uZ8<cqEp̴A~瞿 -Sd8Iw¼yKgܸ6/>lIw.a_fBP*:~L5n•U&ղ\ -cqځYAݭ}{ A : -Pk)+ *JTh\i| 7E/pW7qԦ࣡齋'r@1l ϵn}$?fm] 4,u |?[8RyHTV͐S꤇ǭZi'0$ㅗ[]ruJY3KSM"&Toa@EP[IrK<%Q6h> \A#3 CE5en]e}J[b i4 ujҲ6E0/v,Df@2 T%资Avta<2?LDLwf޺#ܗ}6I#29M`āw"Rwh]FLC*_Q=+|āb+j#"97I@#`αђ1siIg@/] -`+V:zio:_u>d8 -_R*]BbP!*JSl) -%Z[s<ղ8oP(.ڠ,7œ& [!L2,Mt"FӂӺM'}piWFl3S*1UdfVt25U,1@YN>!SW%s0!n3~cg2%˅TyjxXs)aaXM9 [x(`^L܍?̇"E0Y Jʺ,-XO՗%#SIsbE%1lkP&HE%N! #kzнoq_2á 4, -% wP*Ρ8e5hh}Uu5Pj (pen+[˘[nYE]ĭpW,uxj;q}衖?IGX\2C`^QF-gq*%PT~!nR?ۋj(S#q.^ڟnZf5K!W!zK ^ĵ}33 /jJ4'9kg+?q*1bkL_/.~IҜ<. Q'Ddh}ͱl-~y2emT$+<\QZmz;|yd< ؼGpښr%A p}$jJAZbq -qJ5J79)W ->Xl%Լj,Չ^/w\S4fWG+Hk)ARE"jz!mDE]|"NjH wh_=4$=(V7D%&bgiw/)Tͱ#e\-(w-Xni2jd9ltḲmݦ#B)`%PESx^$q"lE&ȫe -~)?rۯ>KfQj-v,v|y_\a;fi"%L*Wt(!g/f'F5Ve{-l= : wPX@-w{b1 WQI#m8.,an3m!hl*>+^6Im ї-x; t|3T;Ŗ٧e6ymK~?ֆfe K~SgH NAM\l @+UpQV)z:p]Xy9bBT4VU\\$COchTfubP&r/MLSVWxV+ܪiao YVNsٛNПg]])}EV&t?%)o-'>ŴsS*0$ĻGjw0$ ~p%+̎|Q ND;IGW!6E5ˋW'/2!Ie'"$ebTCzpirJ{^Si_*fWpHn5lҁKL2p9%ChĹdr6,'qg\ӢHІ "TyZ` {yb:YwHje,zqo%W/4S'Š<⩛ſldXnPStQDfr"[ !N:x?^+|d㿪Y Lr8RQ {oA7O@ 29QT -ͩ-utݹj0p}7j>nh'ƯcQGL |PXn-m>l'PhH,JXjz`7BjἸ -B)vj gt:O*6ų.hWmָ/菈UGb:aqP+1|_/σىr3sL7R~>|LdSo]OQ%%J9IPwĪto5fwpwɥtX:DL+R&L e[bw,< B`_DܮR?"E, }"2!O cvPf¥ @D[ab"U&˖9upT0\rc7Ī̾)|I))F5X-z/Q0Ե(&vh%yi|X[={jᲮ2;JFFP`交J6A7jnP_"ޟE PwQ -:T`02,t - Bb& \p,G:ؔCiX|v0"WɷiVA_bh(+5!R n$a+\V5-B#|Q1!s\m3:nXH]*%6_65FANK.^%;7g$)a/%}WI[Tװi<=eZ7r:?0z]r+kYMF](2˭Bp\#*4fM&P͕En/e\.oJ*@Qe rʼn-n;n2}%'ʬddF[`55ђPDS ||∐3|bxuŚ -7='x<7$_` 7Âcչw08 l ȗ 14!p5 -/Cw0je# -"zIF”P(6=a5iFt 5?0ܯ\|eEsSM?=ՑŜ&Ц^\UAPq7&D6az1%iҠTZD\hTA0n.`cF82nG-H U!fm [i~ ;8pc׸ -A]~+l>( -TbTDɍGe2lL[L0҆2ڨ].6/f);Iz?xJ>j6\ -6xyc~dXW' $ -.HNXtʸ=S\y\B*VT=D++e!R*cqߥ\nHu A.m=Ca!.kOP) \"FQ򚊩9lXii(\OKy.:x72si%30 'Q.dvgAzRylK0j,bdW'a5e "!YR[g= -n[ZeTk$)& ߦY`*r,4BAUi@leͅCJ ~Qor9TEkPRdcTԧAPSq)o2anV+^{\VԕP/?"\ z3S~e+2RWROi`jjLTfv)^Ot(şxYU<1?,\zmzu.@WYbwwڕ̮ƦrL#r:iv֩#=N贫J %bwQc˓oVflO.nr._d;a,6B'Ƙ˄[\b2Cv|s_w -7|xfSqnU2>pʾ]ù{)6`#q@~p63VW0_X/PO]_%[-r.U -'j'Ac:lREtM_#߁ cn J猓JĪ- ~gr'x.y`-Gx4)lĪd篃S Qf<2$vAϦ/H{0v:,뾖d؊ݬU5L aMrF]E2eΦKԞۥ]D&TTQN#0XFMȕRso$3 -J#@( U]+NwvJ}z%<TupE!>ǘ_(drU}7 TK6] T-~Dۅ4ԪTSuKF"Ia5\`Cfr7iY߿K!vx0] )0ʌ,h^REPcq`2q;!t#Q*V0E@]W=2i3@ -UTRX0^'GQ*y~@BTJ=՛e*\~^W†|2MApaN3*]z:ߌ -VtD&5X@U=R* .cMbЅ`h-݀ _+q"&0ub蔖b5RQ - )1seZ~!QWV2y^Kbక?QLKbtz+zDNW.DSNB@Qzͫ(COkl=i0-F`$ -n0PADju?zrBTX;nw=̩^riG@{+ԩ\j?-ˋ_u7_n?ņdj,Vm_ ݿ݅Wl.ZA+ O#' ]WH*X07}u[&` `yuCE"/J4tv] xEbKmVp 3:b N(#iM6x`1HڑQP~wp5+20AJ8urj^%ɺCKxy%G/7j'zmDS BUPgL.1qT"se`$1a &P; ;/mJޘ8L#UFkq@ qF$Q>XT~޴i`ZU~dBBcD9V2T$fp3Ayh5Ʋ:@+f߭4ꠎQ5|? bgF -*`(qRpAS4PDf9%>V6uW*XGt9\; -ПAWe(/.wG|02=M˩'Jg6< -Cc+t76N!2(X -,\wLQآ'3ߞ*ۃYo{ A]]JbטQ^N37$gNsI5:R. BwSYŠに/ΎCiDuT>z.YZb4O;3V'qjp[x%6Be/+,VџmKq!i Q^TL72h.JPHkUw > vɚ쉱R -àrjyvQkHE6 Q \5pB1#S&feWBho]2"\.ejƨQwg["59qD75(@\Gr]+S/zX%*$+M M|6\/ow6]_!#t'[}@DL_;1-*e뒿?tۈ$|{F]be?S |!H)3ZM@W ^炤we[hEm@n .ω}w A:Ltg#KEAޠAh.Y\RWEp*/Vcj ;M"P?Dq7qJmV%<{͹H+fL-tW,]_5vyZmerj , {m$$(zF<,]RQhm :ffn+mRaP؋(%6.eyrYGW 6ʙ T -5eqxk;0Zɣ-߳rl38)+&|Eb]{_-+q\"f ƪI D޾ƙqOk0cq]K5chA 6S,?l@Hm&UTZ! D$Y3Kcnѷ#5f޻ie;+jFڊT^ -$_fX d F R^T(E\ h 鏃gdUJ(<$5ݤAU6@K˂͂իڋ} -T*V0Xs8526@Z,/RN= KǞuDYrĦm?FKQ[<-MeK hܶ[eJ%˕;/e&!LLryH-Ln'Qw_%LiR$D(HoSP"J}\Ԩb|cZcHB\;s0BUSIѺf\\JLa*Pfv*`˿ͣF\<@A%}2_`/%aO a׀ND" ׬FWepԳ .Ct3 )yO,WRP(-~a q+,ޮR~;9{9O2Vh%kXRh\wd`=3I51->Nb$ -¬|/&*"R06Co)CW SfT˄>["8xgapVE(sBFb1^ 1F lI; P|##M40W[)2V1qnX&Pq7\S$$3yHVRpj+VE2q$a֥3`Xc/4"!<:PB#Z4-G8c (xgߝH(6NZ1+;?X}ĊN09Fnj,Ze P7E~o^x MeVzEg%(/$U}yvV;[_j,r|vj -d+.QiQU_ $E׋t>B -{c1WDL +z%sGZJhȧ0d#?PU험ppw1`$ -\Kol+w1 q8W*; 0v6 핥<#'3ZP}iѐ>XɄ<?Cr`o wL -mbp]k쳠S"bn%S 0> .c22:Taqqy7"D"y0l_]  았pLv˃w5 2vSQ`ӓJDJ5qFWr+Xmq<-?0 oˆȯ> e*  Ú 7_% Oc"BWs*'UNnvXBVo-$FSgB<PbZw|:nؠl%^wAB =ǥ V+,hCQ/l`iZϼ-iZmxN|%a/s犽MDrSPpm0x:j7S1 Wp} %-HԵAD 1-)%;J -jH53F$NB;BڋDE{ b[ 9MA,ОHq"ܩR~d̺}EǸWmd?yԧ(4C4+"![¼D| d$iH_ {T<܃UCR?J~y1!c`)heA.ֵ-U^V2~1a*|jTQrbfAY B9[.=/쫠ĺ ޥk 88s0TT2L@L1:

d ˬ ❹Y!1$脦RNA|l i.y{句Lەx%IERv!G3êu'q -^}l>Y⡎)݅Gì 4t%PR"3,dsޡL`@s& N[y\{$11,H"<^9s̢Wqg'@-8-wyqL˟mWۛvL;bڑ(Aݚ'}vRR1- 0-T?\{ϹS|TP(?d EgSlp0W,uBɱ+k/ aF9:Ju0;~&ڜQҗȠ3x욂>ϻژ -@.&9R,LP/K /q>/OGM΁-lsq`p:*ye'W`$:n\ZX}WDZcpWp OרgATċUU+w<~?x',YJL5(`C3vIStKf:Yd_w -qc;_nMzd̛J嘚[Ej]{H+`^K˩y5 Pr|{%|uiԷG8~ ^b2gƦ%F.8厈x4 Q -j0z!0fu*1XL?sFD~Yo*KvPNqBXazBVv E` @ے%&RZowې` EBs> w -簗Rt^8\a|< s_ 5o#Bd ᆭ|-ⓡe;}K~ۨql3ISbB)\\.Sq|Ĉ2{<@Ac?eDr+#.YVv61/KJWl&MjlD:n=M|/0#zO<# H -FJ|QD :Ԙ1jb΂-b3U,+P16Xm=IBne" U"]VHnk=R,˖VeeX=i -\\+?+.rLm&mWT蹎JŃZ@"TVjnY ^[Tj|Iյ0NjUr.aʹcþ7-fXS1/rF %│#7tRXOm$1J#X:|*ousmk*h' UYuи\ab'zf@FuɓzU>ue#1TFֈMa)YJ1pcmm[OKFA0j<=wL=*7e0[U/̯ >h0ʕ5P,xjB W*T*;a-[ _e"0ceFۊ6e"݆5ycWrȅ,.Z*U%ԥ%ԥ -=CgJ;U:JbenwqU'tF73$x.SElz*V dذ ~.˗r$ -.˦5)+><8eKǾF\cCQHA{J+ws\Tq#)"ʌ%MzH̠d[e%W+:cka#r;ߢ0mpXC;E\- X/Æ܊8Pҙ_=E ]fD: - K,n ! }뢺=RB^4Ka*v5P/Wpj! \3n[R97+wǓt+QZh]ޫ˵ -D^|F-3g||Zx13#Ku.-B* -~Gx`U,#P`UcEOQ7!a=H_q!JjX m ]kZ&m{!]eZFU)GCPi.4,%n.x<I 6Y=]Q(‘9FCtЅ Y=ґ#BӁWkdSf^kJ OqxD5s$rl~ɖ˝WZB q*)eu% F-*v(eo>U6B6 *dT{*+P$ _fU\7@, BXj@UL$ctFxX\nPt@A[b?Yg("J+2^ ^njKpj\JAE}8=Jv [h%cEBv7\PE`#ZcH$܇" iV1#Ü WK!LDaO#ʸ-BiZc/+ɒ&hKPi^~VIw+BTޮZk~Yx؍\~xR mP:mU^UqxT< +/UoM6np$WW:)[B4ffT͇F^:ܪ#[KQqpX#0||T+q1LW$+dd0ğ\/ChԹSv#PM)~~O5SN}\`ThpǩoEe$R}4zs_Xᗆeqm5 l_Jhd5jѽE\}!skZ"AeÝ?M`LE|GGԕ_gkz+mkUJ-!u jv!Ҙ_rXɿJh`>. -)4Cf -ĕ5i)(f5 "d+[6F 5п78u$]LݑZs࿅TLT|VΦnw|P5nV$Q 1)(bEZ@ -V,T}5/R8vNzS;}lAol~hV61y/En6z3W/.IL&QeG??3 -"yA8'قʈ,֪Ya \] -z{z]ǀl6:R%yP*y%4p%C'|,2mơ `+m'NԬU#؀SV x1ݡJR¸!D̷Pj\> ^2u4WVJq\bUpN1PS=U@^i@'=%&#/8XI%ӷq7H Ip_ -%A%j(mPGdw]C$w=h yl*i`DZ'n9IWYHbB>ы}.-$[{_~ݎaD koMGcBI#ei.n'Sp -"4PZ[,Ԥ; iX+RLjI./˒`/pOFInp #E/a1}$Vje9LDԦµ gokLfniL> .&ˢYn~x,17-e.㲺 - &Ɫʚ~r؏i[S=jaA.: ԹvoWzFYZefBIT̂)H4湨j!+%\nf^OxSfbVcpsTq5sG]FT^%򀊊@G,u ljhc&ef$KKwnzR.<A3 ]V..UP -"*JK<2\^ - )?)̭Z)P8Tq[H[ -Ul`xY\P+xܣ >h5DSlPSH X[[xl:2o싟͈'|8)! ?jqj0DļjTq[]rˎ#Ej3¦U6jz᦭<)+Wg|QG c֊c6=K҃%.4c4!G$ibpSYЎa|4A:Īj^8ldya ^p.@Ž0 --Gu5HJ7uB+gD|eWR;w3u3wNܷW Ln*fZU\ه.\}-]PYkSU@"I=5UmWlwn[%AwT,3ZxK^O}3~ _ Ib5\S DuuP XPFr!5S+`gem)XvCV r^#U:+,R)&o tZ)5 Gx{C;-a$[S\WqQhQ ^_GtGw\'¥w ;op+o00M'?eFLfeJDj8𚼷9jae'EbphTθ8",׸#[缾׿rZ;T-?7&5~A¢ -\6e -~uٕZʯ2*'_H&Z| aJ) U#]1ABEp2YbfW|y@<˚¹*vGs6|=ciB^qTf?CEL캊lD9":[R|h[;=u0<<%EJPA@iN/ߊy%5nLAI) Kˁɺ`dm^g ؠIPmWԎƿBV}Cp T"`@[hA?f6l V>tƣxu땎; >2IțQBSD > MX~`'go#3q3ݙIT}ŏȬ(ҥp1 K8M6 6uf8^-!%B"7kRL :Nv>*Ct԰XiV8mm =ST_̹RF*/ǨFx 73i[{*E*zp#}<.mA_ 4^fg1 {%^x 1XW" 8^HԣzGqTV-rQKjrr"X "*wd̗~e9M*عp}^'j>,#aEfe  _JOhfV "B%:G)QJK`MoY܃.V:=?^߰"rĮ.Cp.8( M2&.Rn!%kQzs^rB-JK)@XF~b<Ǝ*Ww9gdP -0F9k, QQZH_+&L8ep)X_rKnMtj.l}.Bf_FZ`xRienTU@Xͼ/rŧQR -X_!mbFI7 3씻j֟~K?D J>:8X -)A5c哺5U YU"~\ bxq uݻDl_ߞio)ech0_&>6-)k=p)iHQ~)Q,zLP&;S - -$V|kgNO;e_R9ȾqQ਴%ЉAZ-(uh6/ E -8.6O]7K6=cLGyff==M7+ZmtANDPɂĥ8@ Dr-$ 15-T5JMBHGW `1 -eu*v-)UWEۂvL2/:pr1mDmDYSY,/JM[Uaf)ܧk.\ݏ~MF܇@u -Q.vpicl5SXQ)* NF7PR %To;jdʦu+4awJAf̾7{JmH<ܿquT%%41Ʌ]mR֢n=4_rMobja4U[tUL%b[:>teKjwr'ŖWj0EjO&M+-lid+ǯnor؊̉8Ftج '0AE7",U_X][B}¤ .a̩vfmop|,p|˘8>wP4)F)e$x -IVR.pԂ䭲e2pF-@^CO=. 0lupBec1_r&n t 1Rsԋ?Ѻ.k:+Ԧ!L4N.E%˙SC|3rArUzA_ipͶ=Yk}BYΙ^)TTcT% St.^NRv۟etJ@ef OOb?BdR]Հx^*CF+j/P 2,$o~";ϳ%F홪B0NuRFcuNX!aڕT(v}uuYP A_Pe@M*]0ndRwR̰2hvYj?K&baeq+ųd*#F"%E:RF DU#uB%Zr h閃9Ztcb7mּ9_,aM73*=>w)u+W\6[+Q> s,p.3 (s|+/;X";1|ܳR - +/2 Ko EP}E{J2<Ý]. =(8z~Ze4WeO]7: -qP!u떍pPK3i[/*ĢOpÍqqEl⬤T2.w/dei]ˉxnM2ngu O\VXpN.Љ3"rgM5M'%l7 +DBL }y(q[&2%f&M3Dqljj@W" -gHM_ i3, ق,+-Zj<+J;/8ȏqƣeϖilyv $V۩^L)/A,Jodx#n+ dĭMBsjamtIqj+2ܪ>5gWhG?ϲ]rYvnab,ngĵK. -\TRBtV 렱IHKՐƈzSK9A:Dec Uq}s'5RJhW5喉\keIԬ@0ROsOZRSiՐ(~5,ReX[/JjK;pLнĥڅuPQǸ;3~n]c 5/{V+<+bxߪhT`\0J٨FDpܧ}FDAlnQ#a%B଱+ZE"p#uuaynU9B;*o%=kG]۳bxS;&z!/i[? ץa1`aX/rڪR[Fõ%Yxpjڧ͸#Md TmV#)rC+ܱ @FicsYvܪG/P18!]Sr>":X˫!aw/ֈUqk1GgByֵӞ%HEosW󥻭KB˚Kmgac=Lv9]Erq}S@_3iP?yTKALU_ۘ-ÌXLTa0W0( y~p}b{sMROĶ'x*3[keX7n$Cl^TɊT3]N~z#/gl%b΋^ˢ IZ5=ìBiZcB=0WqeB&g]4p_~7UyG'vD@5 fm;M'/<y e.;7-ku{^XViu;\@N.'14$_:-Lɪ?كlSY|;Aew?&xNɮ@yDHX,08re&W.t_[[S~.bfmETTsU2ŢOz\G/(pDϜxq瀪p0+JNDpS (kPh/5KŶG'Zh4<^ -ų+ g9Ga;Ϟ=y`:Yժe[P_q lrU }Wy~uºĪg22f]i!EUn#Ju3@?_@-=˞vRv3=XТEfGG)-BU -ǩew!QKOD() HcL 5.yK'v?-sk2KR[ P Lap0o{Rz% j3;9aߕI>'K/a -L8.WD⥄sw(=Sd7Y'WKXm'c -_3/*\Ows5{BjTj[ $9qoEAUQo9GMt a0q̨|/?l"ܾ1;GS[oH@D#6)ULD4ɜpPC0XBKnc+s\^+W:3[|Gi Ks}Y.Iqܿ-暷2GWP98e 8/j]:.;GK~<$l"*vtmQ4 *{#XS -i#Mz~,Y|_d/hASƩzDQ~ 0nw="Ҹ&+.%W&gآJ|j+Q(ZLYwJ?&mA2I(%ybR*;+FUkNqaɩPZ0_Ԛx萟C!M^_y ~+,.8*de gu -pe7$7.AMqW,/y;yKǂKY>[@xPG f;뚒7L44Niw=wv0UZ,Csz='vXXʗtOA0٩3*=gEV>#*XYNv]ADqH;imv#3iHhPA:؁m@DSћ%P"^騜 ._S+t=\Nh1=K@B4\zni3pU -&VYx !y4Rڸv..e]qBy)5@**7_'"R=$Zid'Ld DRei>q慁M=^UEvA>5|']1E*P+E0 zQvIxΩ< uH$=gDrbyC2-l-=[.V5$<>K;Ѹg+0hٸ,f)F_@L]vKa.%(tP*.VEFsq[pWN"yOT֤a_VމgX.SmA -!:TA:}5|2J UmgsQ|S,bF +OõHP%S8^/_jk/ȫ6H:zMǢ&UX2k8=Nޞ`ԡ?SKbç0#‹P!n^YW@pgLY~ȍGIKƃ5 MMÃSBfSMgp=a̡pqK :J> dYl3C*U6\SxP2߿R߶y\ fԪĺ_PC#oNU4<{w6@`yjBtYEVj*03ر;E]qZ`w75 .ZWBZ߯E)_B6ILn/h\P9a̮ob(YQ PBf:!;_O2Y Eև[j'+^caFz([/dIj'[5/5 rIZPq'l'bK,LJԖETh܄FBe#zVEYOڐ#Z c(̏8tiuKd'YT V[;i(ďmg  -aAv4xܳG@P({eV\+kyC4M^o*9h_3s]TRI`G#ΑOvHgclvEUWcRG:jJ)`^Zkm`*c4^  lR]41S 58ɜ슥[ 4Ai+ғB%khbM[UnXqćaXD)m7e*s:VVሼXrt-q/Yzv՘?-$_"c.@-SKj*ofuV oaMcQ-xS #f*IEuNZh|i60[e5IUʤi{68 e}į^=L#7R'3’,?0h:na -/,+~~.xi<+_%+-kKdihz&?P'cީ7ߌ%|R(_EWwe3̈́B v_ a2BDSɸWP[Qn8pM֮`+.\Q1G1yXd!%1 -/m~x arC(GwpUC೨+gz'{BhpBulq -PgP7h蔳*A"!m$UwbO}`z.f!GEB4 x!VIq%EcSȋ`7v .URYyS)RֲZZ7/*fE˜.{i9nVQ~YbTMț7G̪d._rZVP,\"suFt?\+ETcbҥ$oq/ XQX5*:Ul_ m@TCyKjF`7L`&1u%<-2;l!ÿjnl#ۼas](w߼>'3v~=1V((zmNjP_l%5&%wj&JhO ޲׀h/lVhqr'vMJ 52e72p@q$_X3ܛG@o&!_4 g%B.%[FGKqTAhZ4vmIkqVvxuQI}jN5 8M΢K#}|. P*~9~`WW#,eJ&8opV6d$WFT(82> -s<.wY] mB6w3ۜVPbu+a3l=,j_dJf+x#?Im|W ,a3Lʽk3.i0Ra`e%[ LBùP!J1D4W|x/#Nʮ‰g䝒<=rzT=|R#\w1Z⯃HG|?3iRu) -pF9]x -ś?*[xwfx [ x|J[K,BψݿRϪA U7W5Ot!W| -KoomcS3晛 qc*˘Fۙ6JJ3&m>Dh:-"hMÅ ωb^ӍWRo!Ddl/TBCU?7pW?Z7-ʖ9NV(T$_#C?quƎ7R0)0,kn\uM| ,k(Fycpܲc\o\. ;kP#6 %TkoQɹ+"0ix~+Hpp%b~u >_!AuPL1~I\U08}G~3f<\b/.\x`lQ) [mbd6v Zoց+i/l#xbm.чPZH?] ZLK݄3ʛZ*ms.R<xqQ2B u5ЅRyUxY+.y/j u!%i>̨6< Y1n_Ԩ0Tn+k .^wsg;7Us4xT]&;$t -`'B$e8*b4-F buݶ%+9>&:Զ+\21LbWp UR( N(ka4 ̕n| -|&'URڂV(@ [%kͳ1䫰QqGٛon5x@+PfAL ܡ TOdsqqyXML /0Uʕ<kM\8r2EKrC{e>a,-ۅ.}~(/ -һ\*(cSŵP[hy5L̋vAu8Nn5 -"#]ou=<.")]5NlCPu.h>, \!>,,FHPl:T( 2Ku jT*e/P,<p*QF]Coa׌-6D]7It ϫt꡵f7(!MZ|O5RU֞1/tFm:PUz֠*"Oos u%̫aW|-{yp34C!T%3|+iq,:y'հÙtTe(hq( (!|k09 -(C*㭫@V3J-xj@n\yl^#=$Gd!3W;/;y,"[lY.^| ׺pcկe \ԬLl!Uu -Fn G 6K/, UοKR!p~(=G2+`KJ{bS(\Mzdk[XR|SȊH[0 Wk!~XG9Ki{(}HDt_B/cuB'SSId"uڏRE8f1h2jU`<:38W up'PTJ7WbmJ14j;o|*WT Еjv £k K,+*c+/W*&kc/̿.aT˺qNvv)G88O%Ḣ}l}kj/U.֧ѐ/'s-vB -QFʲt.7PF%]Ꮈ&8x}  -߭6J#+"n.PT)AFIBTagơKπ#' Iv*~Bٴ/[׬lnf~5)8a:Ԩ+n#-i1Kf)QmJ_.3\*W#%`6|N4_E{w"."QVKu4qVPә\W*2nK1H .4W%.5rVn *iirA }&LX OB mZ,W^1GM+R-'De~-%H1"V jў ݜ+UcÆq\up(RD^z5XVx0{9gSIԜ{:&nN:r,UV_7/az0ҧ! nKV=N٢>ː1/\RtGU.*b-?R檠t".Dr.ѝIxKJ|TE6y$|?X{n_j6ok`8A> 1iBG"?9HDԬBccHz-B$ީ{Ml,_R3BwCgU]mu?2H/ m -bZ݃W mH}=BOߨ-% ɶo{4̕h'`h#椒_ rjE-ƗPL%s7̞eDs:ÿr -=J^ԿmлCYkX -Ət=v$g]+"EV8|5U5B7S6LaggA\:3̓)uT-5%|3e7.hA9U"Wq@~,7.X/13(%CM|JghXq˴,,[ݖ}yu68cBTJUjs4Re]ɑ [G]ť`~nS:TLz5I0jط8X-g .-I-NHIY 9Vwij|5s*JƖa־La$NVye@]12n_R i/.8B^i,[׻F{Dy\TǸ|N啩LJ/pLTQP.EJe@d^㌱ZgLU{%e?$Zr &}+ IrA3`0)Q#j;xJ. iܬ^7%[&EDJpMk'㔗x^W勷'me.i[8*DFȄ IU[nڲ6;\1aLp'lJpK˾fHkj$w}x5d.53h8/P!0uqxu(._ -rj~x_ķ#D  ^ዧܸ(Tŷ$S ' ']Ǫ3P03Kju*Sa1(?+5w*5EJz*:>kx<(imؑQdۥZʦ+^TzDy*wYp@)Dz~ 4&Έmh^ j*qX a5>77tFnR=?i;RǷBRBT:ls|!:`KS|r̕{4˛N] E&,o.,2tyͷ\+r O d<%{l*<%J[ًnI-K Uɍs\@5 [3OHNTs Vza"m<&lU郖}r 7p ÆDMhҭf@Je{ܠf_A bRU;.ޣBw] -e2>*wߖd{d˺ܥ͛W6wq`]JnǕ,*|XoV qw⅖Cgmk,SMgeD 3KӺQ`-Pӕˤˆ1pcg¾wx­lm9 /lUjw\+I7Pn \FQFku[wBŧ]me0{zdߗŃuV)[N\HBòuW[⑒,aAr5S`˘wb2(i_1~PZ)|*eV%J*†:gjZM]\8 >KqFO1^0TeEPVѺ*o(Cc(G~zȲf,ݚ0^)S &8ز1'3 UuheIJo'Q?lq(8O{:+ #17ࡅ&v();[zfL)IBTܬEu*}@7* j\~ G'/|S,4HG[t:g DH@HوZ.Ue&}AR\^9.*詞:ĨGY~$r!y6cfϹTmʣv&㠬/,&u4Z܍%S2 ƒ6kHnm㼫:Sb[ X MDx \{'|D1<˘Ѫa2M66vAFbʇ-B fN*_qy~Yw5:]UxY= bTfV;9P3/ԧ.Gd)y'$!1yiYA-ds4 \;<*4/yC ЃV?PA6Sj+EJ|^"X aBxV B@'[TY}砆wR}Sgtnڀ靲՜6ֺlcj7K\B#B D :s ԗzgI^M=OeX<^BT? zq_5`O?EL(ty/(R*td?>3@ .-*P{^ڑ[gEepqZ't˟R&s6yբB+$qY%nWS^WGUAffb T\]FTf̌J*+ 1-^TZĵR`͞2Va ]s<_~!Cr\\'I?Dx73˗/ -b׈.+C$DAk[ `HtsmTeҭ%~J%b$c'n[ԸerɎ3*}y^8zT-Og!ŸS3\ n B{[xlphmҲ~@!K_7/_CMa51Zj`1(AѤI~ WЊ-5"y^U+UL6 jWQ*3r\+7|3|PAƙPխYc;CI{;?X7ȑg7>5&?`ctXBP J8|ǖ=@r.[ -BRW5*R76r7UjaN V2ii%ϨiyxsMW« -F{TVx@b2Q<~"4 olПx@Ѕ|v͒K&ǝ ^ƙE crSܼ -۝c&ȝF7H.Z[\Z['TRʃY@jhI0-yf$|?x^L B~;4%K\-rtl*bp[/R?͘Wd$Rl;S RJ+ZH9h]b^YzǹoF? -|$У `-dncذ"GF! xmj( -Ԯz}R_zʕ؂>z%a ʟuCPٌcʘf1=MeXUlϠcpfClH>g;+XP:(rW|Uj_Ǩ[pzxwnHRngyu\)/0F"J1*hXŹ+讳[V.1wmym!z6oj~漖 -{hQIVhG)g?i~Q~ɖ[p|E y0upw,x[˻ \!(;GS^f1rnWYd#4 -| /5\0щR}tK-]yz(4/>/PLKu9.f]onk[%"j3!iGj2F-̯4Jjeƿ*--p: -"Q<̃xa7!PKtб-linqO^3G3 _,CLb*=ٶJBG*:M7ɮ+tb9$zI*ḟ ,CUpN a~3bl ,AHc:g'7_ ZUV0AAgl֨GD1* e} d;n#yI -Cەh27p.7B >=K5u ~yvU¬/ JKx*Ww2/qR?*J%F 9JfOFv00Ӧ(-32ڒ37g=O` d0+;hA%WM P jz$D!{3ײƟʝH|`eg,K׽qSspjXOMX'6x8_LS[]ku=-ToіJFlnEU "{\&"06 K?<;} 9]"kұ=/;kl>N|Aqqg(̃]]yt7d@z/h%1͖FOK0bang 哝")2q\"4/x@v -HkCy dG'C Pƽp̫AnQ;'Ž>-,Ud*XtgHGgYjT&z,0%daD3P'R<_yψ?:'fZԼ\ͩubJǵV*E.דqҰAjp†=rˮ.ype+20U/Nji.Y3/RB^P?X t-jTtTƊUY0z͓H):\ĵ52F2Fun8k.F,ݘ}?O4giaʷ%3SPPflO1bˠSdX bbwnj`rV;s ntGzBQE4w}%RþjXE;Y/mNw~bIO k0WO<<Un\BSԴ3oͰPT-̿o=)Mґ6nbBtΉKY (X'I+݆faP)ݱ6qp ڹ7ۻ%u> lQ=C -:\Cww˩]K̵ʞe]aeP: - Gz61m]"ayt5D|m @ê@aغ,9KEw_RGY71R:b/41f@ps1_eB*V: G7|Q;u:lWk:f+b^vu={+P8FQʢ7/K(+pŞȭЌ6w\L p{ 0x8]u -#߆ʓ Z#E'۠ͱOe5D,-j|%ƢCX/_㳚_rGIc+G7bSXjRVO _HxEn+7* -5So@@(|ܫ+[ua>e{ Vl@0x1y"!q_*eVSB5<!k0Mh鄐 UV7wXQtNUN׆Søf$F_ТB$˶E4{EPS3pQ,ͶbF7nkPrMLeķV%E/6 -@Jyd 蕙\PZ@>X~sf MNSC<=S-F5{W]/[Cr2j:XmoWD=K.jVY -= t%6N7^]T AkGxΡQxM#cuWI޲T*sOkSz3V?//1ĻY%h6A@' aEkL:0:3LQ*viYHܥh8P≭lJxM@Y Ѵp5.)zP?pJ ȏ_O'BWCT(RJtPQgF5}V[,ڕ\+/ -숼Mu1b~KЀ&.sB;mD8Ϧ$ y5]|;_,[,`|+#cfx,V`䎴LT Gŗ wqK'+Uv{ҰթjM]Em.ŴGԬ8T|.EVѹQڌ RM -_e55MT~lPC2r00L";y -QF 1@ /5bxu?%*clPP|.4 eZrƸ.;F:yTenջs;('_}Y^]/n@iQ})KJ?qtU*VGRt j , Z[;VLKpppTeJeh\x0NO"Z= 嘛&*:2jԵEHǤ~b,"jI $rJj_RR˾+~GZ./fL#2-y8z8}Yn͘kݗ26@q(/3?qT\T\CKJ-\zN~z$G4P*nUً&BM5Hg,¨[v+r*HBoZ7аE\6 qգv+Fy݇Жyju0M616 6\T}SJ[Xkz֑+*ƥw@:n!Z) -څsOjo -MĘbߒ7Md -mZ ˎ:$\-wONHrᴌ2-5EyZ s/Abf3H^ -=(TtW³RB55RͤeϾ |>531V(+o;˸Q#v=f OS0WB$tgjE +.;iELmf5SSUթtyQǽ&|,mZ0QG8jZ3_ГBcCQF]hTX; R~J`u[h Aw~ YxM!px) r}pw2?Am-AEI7ZW @ttz5˝)t |Y:Ow҅&RBd}/ TWXM$^7B9̶b;O1c;/ziwxR uҺ'LlX5-c%Ym";4pfKzens -!R1cr#͉qW-A#$OxUp]x&n%A,rܲW lzeه8>  v긣ܾr2@XG Ke - .2F$U䎤(cK* rf^B"ogb6c\n8NMK1c,#Glj[$ -4ti:a܂OS?x`t},SkPbfaU+g|P*vSI~9 q+pȭ~bܻձPXE᮳=(a F3=1 Y*fa};H[.J?TX\}̳05nPJT*Uu,H5_ӡq7j")RR?}0ﷷ櫠̪Zǹc\ /Îr_CQc/{FdvRAL~Y-P`6[XYRIp6DQ6DǿJp2qJ¸x -WL h'_hi@D)y`2r@ILG-hCA^%p^ 4ǻDM9#HH%pM/9T{ aK{Y?Pg .F1_3zbh(KGܩ]C+lB22-J$ -cat@F>D,bkQ"ò4bЈU4M}4 -b BSܧ?B/.0)L`vOt(̫e |'GܵQq mLVP6 u6Ex,*y][/RVɵӣU#!.ʖ@|3s}ŭeM{-!%+BuTSvc=_ȋ[F}}_] ΃xY!퉅]ߙkq\({36F EZ,ZwQyJТ?8;ƪvܨZXn3 Lx˜+hTK!p&Z|¥sJE7 vػj(wvnj1sZL Xp>H:-nl!m4v6PGVFiξ# qy%aM] x-]ɱN/T'#7ˍ_Wq4Z:3w„?,qBS\W 7}#GTg4 fO뢲X_R @-&5c-mx~ZH^l²'ForXc6,JB+!R]vBڃ<([aCreZ%^)VgO)wM[Dl+7ԺaDܼ]w.O9u˷*@TBhmjd>-23R̽ff5YU -}J5 㤸yr`WQgB\.+^l&PAޛlWKq< pZ&c\#Q kuÿ74S4\k BdۓXF7b3SS+,T*O -mOGV[ B: -XT"mqKNNA@y#LԚH݅B:!^.^eKEHT/ơc)Aw]4`XcQ%<ذ v\^$A:&/M~ԙ^ꡩdTZ,(<(C-٢mࡁ E+n| _MP˵J͚SUsf[?\bpw1 ˔3G[3Sf-H -_,2E)|{ Jf(I>=(oqę9Q.f"s/])sDXNH!GoB̙L"1;vibرSIA&wP}7OnJ -V&$cT@ ^\'b>*Z.+ DB.[=ܨN{fMQiƨzg85VKAkwm XFODl}`M`Am0TݐT+p!'tIQnAGF9qICelL -0'F%u))Pw$\WR2O0> 1/qjXB2KkU\n!2.\(Jg CZW{g^w:G|j IDH)kdxڟ1Ι@QUþ\i~cch  p}}*36A~#q%F<TL_ 2J #k"m4{Qg㎹];DYO+*KX̻8.E!Kkw35;.g8/|3 l`e֊H߂Fc4Vd%=Ag{1;*Ȍq+152*ɹBQ M"ݫ-dҊ-He|qGQ88\T-p1}˩@4j?0=?MTU1K[̹_ӴJxW|-%Œ? \:lZvЕ奆.,]5&U Yk,ֲOAa -.Hۣܷ֭k00#e>vCXj+",g8YeʮGn"UIesd$Ml]i}i.-{5nXֵo X;;@ F|^^ydxO)}.R^0qR+EЛoȱɌ4R2nT!JO/Gt]9a$KA!>?*uP-{\X&\lg[u].vȜ Z=M:R3䨨>")j -~*Ӱ0QnA`YrCYZܯe\pLQΥxw kQA[d]Et.qYS6mJ>ZʾB2 GrڦݴJ }I_1cj M7lgㅹ5[?H첎1ěIڧD.:Za۝XAKqX2řg5ǩ7bۊKKƣsP8!9Iu#Cw9k4EV[/ ; - ńr;-0%,&jC}c3[FP| WԢA?Qp]D=?q^{ĹV;< N0i4F=ͅ@‹XW3 U*^jEYSf5K%UQMUɑ6!|CT6Ұ,TZe%lf9T._})Oxe.E (TApjo/Z -=Yrc g{B,0v4eR~K7g&cRzbIWl$`.xRסiM2j/8,2PW'S(k­5,iQ/<Ȱw!l~{aJs'pʻM51ﶠ@C̦$y@SS5?tXX:lF3+,.,)= my;Z󗨺ؼD 1*],Mcw[S -_qecboʢ +\{D -7Tb%wT?2~HNw# DR]|q{Oׁ1${H ,~@14Q)dHTq[7ZFpP ~EYSM'}M5w-BSE?#j<5c.z۶ LD "0C0ep'6Ks:#P%j_k{M~پ!Zi=k'Jw#\nd{跅bī[[ A[/L#hY1#(跍XAlLM5RKKjj[68 f4,^?nf;XEk#4t$7 KE%#\Z(򳸏M{ֱ,Q@ /6 {:dV.ضdl3PDaAFkݺ"ujXmH4wnfɲje}ٻDaJXrLa|ԨR jku!p8B[D̵fc_6Re5ƪhGqI%\:O@̱iRB|l<9=kdHE*j,hv oo˃5q಻ &G7~xAH-7)ian~Ek]nj4PB -U%lA ^ &8'3AZ)1ZJiUȾ (@f9qFl[ʴ!b7k`5uT\e:2]5B4JU4b* a,C` 0~gG~Oǟ`ab׆Yԫ׺Gm|FĚ6F (ty`y+"V6#4&C[hHH%bUXR+MZUjp{#UYfsPFAؙ#/ΰ+Fb'M.\9,EYqtNP5= -IbTvΠ8*RhU6TY(z!SSZXu&V5`_UyF6p MLQX c;/be!\UrJ]C("4T:_@aQ^u. -g -\Ց`V%֎lQ E>ME W?P&4l.Jft*&>vSY!/T*}ʞɝKU:D#7i*)j=)K?ZIGO?%ĹeLK:w>tBf -F>k~\"C;Vhw41TU 3`w-q]߮Ŝ=+|I\ݡlyΖ^Y-Xג,=\ĚM mh2.Yrp=VxVeDMŠ!"cq"LTbbksSj<+_%eVI+P[!ЗF%Ӌx@Flju!]\ 찺:eOne$.4̎ACJ*PL3oV)3hM\l˸Q6lmO4]m/HlBG+ԦjZ$qPN=oJeo!_+bؠRK*3Rl)(Hv,]+*/\Ged-9_ڗ%$I (p=Vb <tÇY`]^_^GL^B -e#fDJjx*}D$_x%b koZj -faFBza^bMWrM5b.BxWt+MCbyTjf jVlD4Լ-}Iq2;Cv>\v\ql/3 `!-'|Α(~SNU.林mbǣv?ZQ`4ZÜOBȀy"QnWωg/f\Z10Rz eqd#zH]D㞥 ]DyZ -T,g?^%Z|JfeZH+\Q2*QQU)A 5f=ԫ(l1A?Ԥ_D镎D"qi7c0.<13ir锝K|pM h :ߛOOXk(Q Z5pƼjcLBu?D {f . 4oDDA2!бs,慂YQ>aT΢镓yrUʝw*J+>Cc2H<Ţ`vX0.#Sepf{*RpF.3UV>HO#C{Un*wLb^`@ey⮵+eMY7ʘcfeQ=}E»fTU3M$:m(o'D>d犀\c(Mx**1I`̃0˒ w0 Lгk!n}S?K:wrb-_B%z;*^/jgemϺ>tm&Y &V7rGOp~q1۫cWrQ-*,VHuYד<`ݒ/YyvE0@2\fݛĤ+2YJ>&$/yELc~n_ v b~[3*{"SQ(L\Üf?O&wolՎ3f> þ-lG/"*j^_Ib-\B\,N)34r-` V:iA}]CLj(_mʫ~RRv@j ԧ/4x-`]& ;>H^2JDaUsʴDQ5 GڐL<ŵ-rrbJ x*VpUGSqiaDJ>!d3r7lA*aXfEh\ILjx+9Wr0Xqm~J'N0,XΛҝe+jbW_B2yyar4v GD{CCu~lw(WߋI0V<5._M5>joUv32kid*4sLۭ]/0)bĴ@ ܸ0ۗDkzٶlջw0m*k.ǓR$^I I1(F$|iDrvSۗ?m&bLԬـ7gf -W q*W/A!FF\G.s/KC,\Xj_Z8N: a6sgᩈ.%NHĉ13vwJ[u VH/)نNZF, kȎ1!폩[΢inѕmˉX*]T=F8SK)dj&&z㪕k[%5<!.@>߻?QKx#)1V"5k_M8H+^ -u(DHfNy> ,;N2 -\OTqˈDOeqSGq_|kp/xeJK7>.xi鯱1jVuz(%2_Y7栱G*Sqj.%@}ˆA{g;J\|Ō]gK>_ÉUq2%2|gzUǯM*&9"@clMӸ}R0nuQ?xTNxIJ;G -cJz?l3bȖ۴0?RG':W؊dkPPsಔWf[PiyZ&jJ1bk| -\Wp1W /jz>`h ͫ%]qUʖiIa&Е -qS b`j3y4s`nٕhtY3sdFTB\\bTmJ>JD#ںfCtABzieix`o[Mepk˓^+<ԭdv琣DU. D2J1ȡ\w;_LO c4E/AhW2Rc9U Uw]$"H#lwr#X -Y-TblFؖLjP"51\WT577FZü|0d[np¶ -bY%>ڔ" -ce㴏L<@c^@D{Va|E!y%|w3Y<xxvUTj"T%TS_S*\1ÌQ_ -% ГR*41R`)N\muM5,ۭK ؕQ8TPh-?]7Xr6E^.ZUkadH9e_F)G;! mUpD( -Ĥ+14Bi$ =-6vTm@u)󖝤*3嚸:*JؾJfc{džZ,-Fh/e/WL-z%s_0cRh4ER(Dku C6rb)\>%L -4.TŬ=}EQk$(- Q!ߓ2(?\h3<,fjf^#q-f:8o=/"g'/)o\3 >GmB>g[a_8 PKD %UcF?QU)2ݽ,9?IM3Aҋ5Jiʡ.>0WB"k:Ք?'ODA]# 0$X83i]/5S7C_jLM_Z`Q -UvAsQjP)BޫKlP۶5/tw(L/d$Q?>R%Fæ<[F5kg/̽aT6 e}&fqvBɰ3P{zRl -ZQڝluwLuEj["l6vI6XR'@';#JoꥯYhe[&]q[cB"~Yxi ~DXe'w.\X.#dd xYeO.; su¡= I rqQ@g۞qA4LCC.E1b_U/2[ uT;>D?J_!afBZR@#o"O !u.=H,K*-\a̼7p)eUʏr5H̹ -]rWMhM - -.g?kZ֖SD -R?zXG 8"1/~%2`4PA9X W(L   jP JV4u[}KCV_->sDh[" W84-,4PZ5>r| QDb/nrA*LGVfGoj qr!_l@M~ yHf評UjkN(0cmonIr?NL{E@K#/05XLٝHu0"!DBWaӇ~ ;I3e#|<%CS(j|\ZS8elH=$aT.0CA}1g!3* -ZAyLܪ dFsg69qP>i Jך&l)mcƻove[_āWgYܴs0['/ -Ĥa%Ex'HdI,{ZQ k*~Fҍ% ]x6n(->(*uaEmqoThyo2/Z4k++qU"ښwE] p.+.D|YdD)h^-V@zJ ~h3zmӡj~T5*KWP5-~%\Ke1tlX·WG5_W^b= .Ыrttb. Fy%QbybٻBV灯YSH4ֵm0JeK*થB]ŷm>w-hWcFk8tcIs1Q%Kgܽ 4[*#nZm0,!¹qPi+SVpTj;Q~1KpJedRo0H?})\s5>}T`?3F([XՔ˽."-s|Yi%S-9L87U #A8ĄGlqkԑ8F$6+Ho>5nSLmVMZ2gsfWiTFweyS] "W"j'è&;dgtqDxQ6`,֠-.0o-1;e1?"2=wsKxk(UK鬡HXD̚X -dAI&Vh5j'a$r;?tӿ,٥_1VTx:~ } 29GШl/ Zf/n`kLJ+¸cͽtYxTInߖⷼKM3;(M*'"Sºȶ \EZx@ԕ)eDWx,2s. T9GgRĶ1azp\ԨƳƥA*TxFI7x2FW>ιY:+ܵ\=bguлEvtTtr:ĤBC$Db5Gݬrxt0 ΎW0} >!u鋄!ڊt}U뇷X/v/2gruh };6F>%U7U ^B.  -Qc@p,umMȾp%x#4͞F V Q,ƫAS^Q^A_,[P Fa1.JGH' -%nXwuS+D]ߚ,K9Zoo}^377E6xjF% TQ?p';MeƅbGrdhi QOaLODЄM[ dwpWP\Y@)sXFOK{|VɊ6Bv>|px-aگQGrLF!rYc Wqzk~k9JM,^a%,z9dla;w,T7SaR)HYOd>!RFGV%PQYYNf4h_%^"61ۉfVŌS -ܱ*z7~%1Lgߕbm=ʡ[E"6buC6HtA{IYB~<)kӄ*SrN97*7kJb)2YgSOKETؓ9`n\X.*l5Tq5{]ZOPx7ڴ0Q(D8OzoO)RU1ǒ"No260DϘc<^z]!*T8Έbڊ(7wR$"3@D2|-˩r՛[⪷2v%ID%Y(#_%4VY"YE>#V}GP88W rGP@pqpn'H1'#L@UK1$jUu̦'7xGr׃:F Da6q;H:'<ʓٝ(ҳx-~8@4JJJ2ǫe8}pEfx1U:`G\f.%Թw%ݘM2|2Wj%O;Uq)N0.%ΧEeڛb)hjZ렲?(Ym)RK,^W"q ǙS+\1*%Ʃ; іJeՎdķ5 'c]1E,1 -Ȭ dUD á\\jj<YC5M .D0#8Mj-cF^톑k(کJ kAͪ06<#bzf7(ke/ΫKRl0֙.덐@-z;ըH{99Մ2(Q^;/F!w(ÂMkP[K0.lY -"Dc3^I+r vB1vYT`L5J3[PM!=JFiĭ _.`{CHt '_V# n -]uRݯ"MLUh*_*U0hGhO"+S u0~mdP;vE;[\Nn[j`&xS~`biRxOIf劬WaW?Q+Gy -WPaL 2 Bn+KBU(֮l`r'+/3^pije1^ "bXBK9(cK R$:9{Ur"#ƣ=1P ٲ ZG'~5Œ7.Łcof|b-bR)(D9CF&Hwnb]ClID0 U"P˿P5 -CDaIxB5tO8/+CEQ|,j/=͵j'mT:\\rb ~ Sj#H%cyg$N7鈥j#+n=`UWJLE^jl0PIڝTZEf2_%CA@.aL6A]ʂZƭ6t7 mf3nIɀX(mTx욍ZCӸa:f4 ~DxTx!w*qkYW:v,qL lXRRO&X9ժ-$y9}Ao˙SETg֟BQu+f?y$(caLB ? k]D_ʯ]ʄ0"`U6{(k |lp%1T׳Jcۃc6+*iR:T>҈j )к&X"77B%hJ' TXSq[ U -D!]㊢M5]B}G떍\ޥB+g~9 `hu_H^DT%} -ȸUR%b2e.VqP.7yx8q~*W%Дl\.5\X}q.\7gyW*7>s/n,>'SVWܺ/<1.<įs >:&[Ő£emҌէQ̃#g}H$zA>,YQW3(Kj[(|D!Λ>XWψ2 D}K' /Oxr :U>%/옍^y +nf8,i2BPFAjItĪ  d>I`^0'(Iư -!_@_-2DD&[z&?PP`kK#kL,ٿԓۚc06"-QIʝ-W4ܖʔIDʖJ!~ -,so3] wmv&eg\~ hSa.&c~XHE6$Z}0Ux{%"WG7T$׋5u,U_ - -4]纺{)S %-5< - `;\ucǮ@_ƑU11Ad:µI˲/P9/ -YjlvmV -Ң@CrSX;sK!3hcVYF_kn݄rU Lu:Tb c;Fn&0QgPRʠkX#Wme/<#U!LĻ+,8&Z` K, M#Huш-jգD)Yr R -E#KoVvˢ!/S7R0<e+KNba3/0؁8xZ-D/w(bTĴߞ*nwu>у PfV&f;Ԭ|r Zx9l$y^%M̨6#bʗZ'Kj +[jSx*/6wUf '.rŦ *W< Qݍv7[[ 1zR -ȵηd XI3|ox$#WJ0pTZqVj7{F"UB .u::Z=q~&iPs/dz]^Y\aɯxq)%㎢)PF;f])eѫ؆kkpWKW sp;"Oq2b⬇yeğԍHαZ`O0E6Sjч6JcLA!jcl.~:ܱ뭗R}6:P4w:.iKI3#5*0kP[Un4, -~N b'bBA2ER؊he/!-2OԲJ X,\7oTKV<% m kX]y#+#6&3B[;d ]h%hX݌ڇTY}De|~"}'\K1*S!o&'~6X#Qw2J5~b3 -c\\_xx*j,'FYվ#0;WO >=Bjf{|'gxyW\LB\8x9_ "~3EdyfvxAi^$F?=aTG:Rf'gv||_ ح{XhnڋD]|AYXXMHTYJUJ]C$ùz늉x ;qCHvZΘ?D E.noK%H$v JPa FLrER[1PCYRRTCa4=,ko} fuSP\rn6 Yl폜_[5,F7G^&pA0u`GKNorA ڬx, -ȴUZLG2AĪ1Dq-2'Z̭%jJ=[,(PNՈq|&)_]@]Ťv1>@RɥE.3D RT$JNYTɳ=z8lVLKsPKjK8XuisT2eEkBX 脝 Fe@s}tpʰ[%3m[Â.A%]fc0ݠ5N.-ꪏS 0`2٫\[DYR{lKuY- ܂UDhaCmnjGQ)kؘlcR4r\? YE+o\W 6BD0Q&-ZPk[2 odL->,#W|\ >D#ȷ+urJc*en="WQ*f+\2|1p1"^ Իx|de}wpG\;*\>+C-,'P%p]􉠀:{U/}ȇ)OA=+kA%WW@$Ww1ak<}Ŗ` {*{͵1*6]^8#s/MdJ4&F[@5se%p-Wzq5g5=;En6b2`tUkkA(*`֭L-3}{aY -EiZ_eT7_C@ 4ޫE(?iUD[ Nhq"O1*$Dp@5-vql UA^@/GV"!H:쀖+Ԓ5s]mf-jzQw+ 䒗'Pluxja=H -0.\_oWb5gp  e7+~8P:+!wJ*eB@ +Gd A`C^uvt{gEX5=w-vMʔOfC1|Zbd1W ncQc] AG: }B^yF~ ܨs2%Cp&/2WA#UuL%k3Or7-fW -{ -^㊗V^ضݡԔ-tjZjg%m~ [gM>mDkMq(0W[Aۯ}1U7X6?O=FҦ$K.$j*t: x St#:H {*}6w@joy[<' @trKkL{9Sxeэh6Lw.Yς$C*ş2qFG|:߼ <ěj]%Z`&l9CPokԱjS|Q¡t Gn8WĭM*Ui<@VaGr-AOWXUGN% ̑LOV ->9uJ"ZsT\xwPJTU8 | $\NGt%Ywڲ̐cݕ,Tz2b1hBmq6 ]U%w(8JyW,l!fڗ)6. E ڑ=p}X`U u,+ -(&bPwT.m~cȴ 4ʄ4>WQ5nwTFƶLM]ݣ`ɵ+VدH#P]B1~q|;MmL -ᙾ2Lnv_ (bqy*RZ)1QO,|Y3*3Iep__UuƮ-3'0RT~G -o \eSsfR}|*⧨\`*{\/\#+uX-:q4;j}qc>D~}r?4Vkn&xNIUFb3\蕬,ʱ29ik0M {Qq mڽɂG -*_ ~FQ" MMm ->c冋 <ܛ8@{$+o܅a(/߉@75h!p4O ,03 lᐙLf2P{h.c~L(A)OP!z*}dM-t1clGWReAU7lBט)S\oAG0$/Vu<k뒌%5trYZywƞaRL07d\5ӉV/,dpEy4%F煷?RPTJ0]6XW;L@C!_$B}f,~T<1~":yRJk_@!<^1(ԤU; Au|a},CE*U0*UDdu|4]cH'q, dx5 -o\_5;DR+:v܈ѩFC;.M3@Gj-I,+GJTK;∎*b. ^1:b\T0yp±6Uw;%Cp\CEEW ZMB}t'IߡAaGv{R %08 yg uT]7/NÅRUi^l#15d{ t@˨|jMMх VչoÖfB4YwrڱP|@qk/Ĺ؇#3;_@ -#^xnL5w;"`? -w:>d@nQ0$. -n}) U-èbJ5ՠf%:FXz4t}haHbZC3 qb -ew'zcjN/Dq}'QO2*7lVYSP1SazZ-I/Tֵ[7~0AU˿?løJ-bW/c%ЉR(pGe,U <ܪaQI_QQMEeNXU7ql"zɫbTtV -gͽ&d앩@Z<.;L^aW2y( )GMM~߾d;R\HyP;LA :ؖ mWE -,QV=I +M`j`L=Ʒr9My8:fHxl8èo\>] =WP~O@ʏ‡+ƣMݺ徉J2]hUpndK}C 0)Yf>@e|,&p AR% Ò*w8uQT[+1{rFF]8 -L$=8y` ((<;8t`05F,k2%E1OHaqs bZjBՈ CK' A%ш !/4Z[감 (5:)< H p_Q1\7u61`#d#qKR3φRdn_h,3K EqP%w:FeC_ -IA@e. tVb@Jb  (5b aa#pҘ= L!x6Yy" kUܼj-s%A{+Ll*i !B6 #0@VGERo--A4 TGz5J>AC7=-ϪP~z dP{ȑM쿍sieq#e!<ʦ -PG4F1 p.5?nI|/,⒂1QmТAUh@Uq](ʒ-!)]M- c8]>T:7kDÓ$yb6,PbVU膕=ktdMYNqV8f@eM_ 9"[ktQU#*TzWk仦JS3^\Kxj;ʏ -L|U~IʭB(vcYd --&@,X&ni6˜θ;= -{v}9>\jmD 53YTzEnI|/HYMT!FTIw%Jx-]IJ? K 05a&Ys -6_6Ӫ)VW -5xV1{09,ulh}BH{Oı8YG2wuK(8P,=θjb|DYN?ygW,rʹ\_ܾO㎸KYD2 oڲ\25JCow)G e>ۨH UӶyv jpcz ǍK,(~d2Zmu-w*T|jͳR#ΥƓ&Yl!Bcplu=2ʼn~H U2ɸȠq^-ZqlL,$pUTpP $ d0YcD0RP]petg$jy~)|PqA{*]gSo3^Lǘ5"6bJ\ kp%[>pҶӪsr+=A=/]"v3&!\̹~% 4[SiFXNB:Em -_Y4L vb>+RU,z.|=:/ ˬ ]fO!fl%u.ƦZ]5iG=lo5ɶ6xxp -AYH .Ny[DuLT+NQ2\1d~:׀B,0υwz%!q/qJyn4we;٪?R_3)) "ì{rG!GQIUI8A5V~Ov~R7sme1F jS*dknSqHD#R=D\b{'?O|sc);&ofxߨu|wÚlc068r}R1]vwu؉n~һKo9::_DpL%n_Rw@T#\ xP -\\A+zS{UKe!jiM u?LΨ;!H"Fc:0[LUWP4"DX"*3]qDz$-PA@VR7eԌmN|$ Xm,ꊝ6਺;"rĦNt_ſޅGU QOAGo¡&&c_)xu#5p?S?( H=%wl3T,^ߺ ÛS\e0dc%I_ЈYk(Öb*.iiR[<),޺⴨w9dU2V9pj춅ΚP#y|4X<{Li߄d2˦$)bn2z=$VYi(=5V&AWܫ-E2/ę۰5XArv\?FB4{*o -9"jqv4_;.$7j5ՈZׄtnDcQmxPM -Jj<߼!Gd ٩c1\sFcr-ħ? A? 6-Iڃ!m/̵;]qvjRo&뷍XƆ]i~ޫ 5. J޾NlטF$E|OW_B*1]:|I%Zf@v^IhYx65)R: ]TČ7NZL|$LiW(Oj/SZm{z_emn#'|~ii545 -e*4 4<;KK {*S!Z{)X PE2zT)!Q?*CV0wkUF ?t*hEK3@PZ#S VEVŗl ]e*;PFb,A} -~-eH5aY - Į`k+y*@Eltr92AB:T1rZS3J ;J8RYbk?/4H7AiJ#tGwM1ZjD|Y)ˌbQS+Yq `_} ]6NPGD\w"x^]G_us s"žp앣nYaw3eb']<F'Fp7+Wbfo(TăX]0ԗhoƛҲD0OO.fHu;7+ P"թ{t)D%&+Tu,($JP7^(ԩyVGq:S"_G%mĬu*Q&s}!W K91+cs5F/ +T$fQ_LQ%)Ƌ6YU< 3_i Xa8/8X -U˓IV$҄m& *) p5xzVvR}4Ab ސ ϓfR -U}_ -~m&*f:#2G ` m@ qBu3.\ekV >n6]>Cyr&PIԐcw05e2Ɓ/kA:-*,™2HMH(`UJ;* -IwKZ!( #j~ZꊃCͰ:_KQ& -?cIM 4<\F3jxCmrЛ_-cWC !u1)]TPAfqJؕ -;.EJ68aHZbStu$F557&)Q -kqsl`SD`66m#|'~(*[Pl# Ns/\S)ͥT^CWpݏCZ.^bqVCW³.WAsrOrdX_Cie3*QyxRc~>ւU+膱 lǙ=T+6Z梥̀W*+~9 ={XR8R~O =aMD ZypKYT=cm`,JTʼn$\oa=K6Bb w X_mSH!ZYQ|4DR%DOm~N$/Q޾G$!eit‰RT rWĮ,9QZ -Ug!N@. 45٩qWJ&5_O tY(Wؓg 3H"*V!is -L h 0RdRP`hi( -f~Y8TR^0 Eɨ2pOeeq஭OWU"B[1pw+h5e%!\ -'eƪ-fT4OjDa\V#]peNl2@tPr/ܯNQ3 !VgFvmL-Q% 3#kLUtJ<2SffXĭ&y$’ח5pg<Z)w(IQ([. p5^ei}FiؙVVT#}I*l%+5v#%_5r|-TeV &jjiJ9KLLY#cE=g2=Bj -r!UCs*07IGZOҚ̥GQj b2ub(&H@R߆CY︚*kFbZ5JODyJfp:R$}ky-ũwh~QqQe4Y*;0*e1"07< ̧vhQ0\w8mE -RZI=v\f̧/;Lq\n \E" x9)EĢ^()am)%3K9řC(_5a]U_ w߸zF[GgV]sPDpWyIFҊo х _,،*R wl*kfq6 HBi<O %OKepyhI\,UpFQIsܻ13|1(ܣż8cqĦf"F 7r0*W5(-~L|@%D6 A=HjQ vm'a,@{P}#gR* 5!Eo -9۵[8Tuma)XN{O%D3s -;}T% wڠShm.8~Ԉr7Ka`Vzr|NQ~d;), e䃊P& %@E٫ сvW[+ AH"bD=O5ji}(o5O1$ N NP.hTYxS;;" X%C,sՙٯYX &T;nbf<{Qt-m`?%;KG#}1 wa6ƚ]WDԛ)/l%c$^j&[VaGNx,qy:@[?_X3Xg ]^c_5kolAINF\IC)Pa"BkhQ'52_Q~U۱CP\ƣ}r>5((bk!3*論v׋8XZ\auQ6kQ2 JTHBr (Wc?T)kѰU`-^h<kkˊ+FpZA*!eH&ɚ|(?$ t N]zEjb}ծj _~0-ᮻ:cv!W -VGV +LUjT*M b_F5gq3t肢宦KW|?Aٔ6~.1+V,f(PM@:ůlgx*rFYt\⁵.[fPU?vC c\ rJҺ>,C'?lxIJVYon~l`q_,<NV5WX`(׉Sּ87Hᡌ0>8DDH:" L{렷|[) -@PJZ*JbCj;5'SZmeD ٘6[$eqP錻cfAt٭$O`__/+O~TtB>3-S=~UFFeV}5t4t@0w.E]x q쎩WAzPUqj)-éO AGctH $l~6 pZ%@1!V~*5q\!Il5 .TQƠfxJ}T62J8q"b7Q %x@14 q_ LCqᗨJXLk־*ט:Lq cork`eHzp -p[擋TFgu+& ⊁)xعU8qnb,2sr*?Ԫxi*tn ]C s9;!,,8#S8yl8jq]+ -YRƥ -: l/"M&~DEw,u$_A};!l)"ڧ<5;5 -,@+|3ƍԢYrøаt^[EeWN -3~FBjOj<]CG#z ?>nʀ}W. K(*2?z;TBvGfcbtUeQ|^@{tL"ʕiBn[*f9vˋ:(7.e>qQቍr^cVJ)e -C+̃b%mZ 1b6`0Ic?سTy"Cx>x54!|x^RdDZok>KMFb2Ql몀ScA;ԴlX.)-D~p`wh9E3IV*C֯N"; A۰ -q׃rt՗ /˄sW@QfFhXRbf5p(~74y^Vlc5P55m 5kpni-p;͒czBE@1)-ӄOha5>-Zŝr$醳Fo#G-L,Q3}bUz5Q'sD5q,YS̥Iw*WQq'%Nƹt@w*٨!r\uJL8"L㡨2L3R+3URe0|u,f8-Y:LnQ^ (!)|Ҭ+/O1j,ʄ!8M J`.6dU+T`\᮵ -np>묦UY u{ -+/]jRSdQoChiXC;eHѻJ2 KIW >ԧRZ7wx.,C`fRD*_bFWt}V&`5 -栲({ܪ0W14!b9k^x0{7 lB1 8v3n JА>0f]|jt_(4@recZ8=&,HD^鍜\tѥ- '#yj2񏅜0f3jRc1梴qpe'o`qP xԲ.'*#sWģ?ܷW=2O 3\U$x==|(?6C2wo$*W7rS0bf^$|hs~,aG>9{Rpz6HVT\1y `˗ZZOd/iRj0h dHPvP[gbΪ^/\p*#!a_4v+>'K%9'P 48E84wY\39-iU¯CW[u i淹E ?K~0!Kt]F>kn`II54RO۶ v`+!8.ۙb[IS-P}TIjh{\ wud`eYx6ӹVjWi0eAB<էAU.g~o+Prv)/>6 %b W3ÁP*JP}Ar(8f -R1x@$RRE3]Ww57sXKfkĸL/ٟe^f|+|85ZC3nwKTiƧqX]fR_+,dil(вՌu2ړlqo\1NX4+&KWM_a5Q%<9|[EԾ1ʔ@;_=\൚ī@8\~'%bMIuOfkR/l1fO# 0*TK~%eԸk㙂2K FTf_=W Ve& 97+G lSW̯f8|+8KN]yB~| TV$JҪh}/t|Lwh5JszҋO[F[MS{-{b*T/@=ǿމ}8,KFf -a8xq\6-K+/<ȥs6%{J/N$ `P+MUe;3;dE*WVX -rX(c$KC57JG#}TmP!TI) -h{io?IqX-U.xtE51Իcwͱ@|qo،^-ܩRN.}J%Mp|1\ya0upj!\*8棍7+%'.2o3>R}0[n\3U6uy?< |D#q8iBb{E]SsC̷wQ#}oBi12⍿iU`'I^+)JMz8bnY4otWGK[}C|ىQ'g?=ʎ79|c|˼ERQ#o,_ % "cc7eUMCsK3Sc n}N.±FużSUq:>8ԳQ3/Qx ,(oBkopy5/Y.#+kLs|uqi˚r? {=ApJ)Q ^JيafWV.mHF%ukaؑ꿨TB`btNo&T-  ]!KH~ %orG s \"o]JdɠUF :'pRϞ_Tq h%|3/Lc*\4dž~_!+:5|[ǯW9ᙨr˸ Mwlx.V'ZyN~!' UqW n,WR.cbXwc|L˭+p<S)%B:/Q&aFNF*==~ pN5;@}FE~cEm;\/ EG:Ep>'rdRb/Ÿ;9q lʿ _ĹGs: S2*^ Q-ؕ<ݕVtx"6&&>100@P bZeSFr{'fnL%)@D{%ī.oڶ } iX#jhMF,y㯁0o 'xMpy)K`ԡΧhx^ -i8W; u3b EJq(mk4A5?00UBfd+J21!%>4xD+֎La_cUE%Fɣ 1kas@r?K!=Hx?CF_M/$nf3kljVD5Njj1<\>nFj+p#8R$pzT"bd.[@ i)WK`w-1Pb HW~k\Wί ~;_-uYe²pjĸurIm%X~b&Iw7aj5^)Υ#/v0AG+ -Fqv>+q[$~1,/WeXraRTw/0 ?s/ypGaZlTzb7qd\lVd, P-5AҠ«0*UbU#('Oߨ⇱۹xQD }堿)AL7)Ijy/kp> VvDZ*'ϋ|_)[2T\L[4G^xW[8xME\ز P=&TN #Ic!=̲mL9?kqA}I,[Jq+H 4Ӧ.4X_(]J wq| EdDQ_HXMu"A5, [_+̮j%B%MDQ3ƒjL1О3$H1KKPf} -q#T#b5*$hePz1j*7*A~R{a+%'Ģa -`Zlf,-X#1+$9*X1p98NS.)xR/7\w.W1ʱL#f7/L燞inUcO֡Ci! 6Tq~SX>>b:ܨFn8;2pø7QwL:qfTG -\3X?p?q#!!~@EþXi0 -҈֤{uzJ_1~ca&ӉG7GҬn]3CMO"z?46mJ)Rc>yd ˯ԝ*z?j|"=~X.C=X,6jeJ+Q-?[.!lL@gc9+KVŽToqU{.|lʬ)J]/'H*]}CEIGqƗܫ:b.c73Ř=9?! r?n$d$ e@SS\p`Qb6N%pE橘*Q5_Tss\xc\|+"fb*VH KѹjQR[ll!>mg#?`?t.Qr{ƵQN5bʿRn=kȝtYKn~ e[E^0WK8 joaПLF!%⡞ڌo=B *$le׈YJJ@-h5 +0Tl R|ܱ킷 rRxDb>míh6Ewe0VƶQfZ^]imIpq0!Ŵ`B\42raK qvKbe]`.}C -#Va D.ETr^d74M!H*{ SjF >XU@`U\l,CmEaEԹHH5^ -ߋ5I@)4p*Ӆ\a0Lw,U@}*"ǖaۈMt)yx-zA.6,rc-J b`_QUCN+\**J98,T@#߈6Cf^Mk <歃 u0HSQIqHP09qjDu0 c(XV?ȊH#BcD1q0/50r9]ՕJSII*\ -)GS7And"-O"+Ru{Jo$-1sba3jxeR:;^<4P¿2xUhS!pU,dDA c;h#PXBtǵHh -sɗWʛ0ƋCeb.0&˪no*5heHb,Hy"4#p*0{֡-%4r&Aj#d05MJ*e " -RasRq*TRK M@>HQvEj8zyZe؂fsFW}JlU:u( Ü$wN*[@l.fPf)ISY4Gf; ֪[įU|„ \!hCh2Wp,4Cߙ\WbZ!p` 0P@ ?OBNz{cs'r|z9Fba݆3oK_GD$rmӶDZo3̰Fy Q l3i4׺(;<9k4όI_nsn:eI?I %,p@0P ?'ćĭ)k =afV#p&? -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000010057 00000 n -0000476482 00000 n -0000476613 00000 n -0000476811 00000 n -trailer -<> -startxref -476948 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c698b694-d703-4adb-a22a-08a298e5a7a7.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c698b694-d703-4adb-a22a-08a298e5a7a7.pdf deleted file mode 100644 index 47b76c3..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c698b694-d703-4adb-a22a-08a298e5a7a7.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c763bac8-3e06-4af7-88c1-a23555653860.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c763bac8-3e06-4af7-88c1-a23555653860.pdf deleted file mode 100644 index 76fa159..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c763bac8-3e06-4af7-88c1-a23555653860.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c7edb69e-d343-44be-8a54-bab80ee83452.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c7edb69e-d343-44be-8a54-bab80ee83452.pdf deleted file mode 100644 index 7e5107b..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c7edb69e-d343-44be-8a54-bab80ee83452.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c89e1a49-5c4f-4779-8748-42076488fcdd.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c89e1a49-5c4f-4779-8748-42076488fcdd.pdf deleted file mode 100644 index 345ca56..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/c89e1a49-5c4f-4779-8748-42076488fcdd.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/cbe512de-57cc-4d15-9bfb-1323bb970147.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/cbe512de-57cc-4d15-9bfb-1323bb970147.pdf deleted file mode 100644 index 3ac31e0..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/cbe512de-57cc-4d15-9bfb-1323bb970147.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/cd61d8ae-9682-47ed-bf6f-d42a51fdfefd.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/cd61d8ae-9682-47ed-bf6f-d42a51fdfefd.pdf deleted file mode 100644 index ed8e621..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/cd61d8ae-9682-47ed-bf6f-d42a51fdfefd.pdf +++ /dev/null @@ -1,2086 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 195.5755 0.0000 0.0000 792.0000 0.0000 0.0000 cm /Im0 Do Q q 0.2020 0.0000 0.0000 0.2020 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -17.4086 0 0 40 9.07 3497 Tm -(NIVS: ) Tj -28.5839 0 0 40 60 3497 Tm -(1360760 ) Tj -21.8954 0 0 41.25 9.77 3449 Tm -(OPERATOR:FLORENT ) Tj -20.682 0 0 41.25 227.85 3449 Tm -(INA ) Tj -22.0059 0 0 41.25 278.77 3449 Tm -(CUSMIR ) Tj -13.3033 0 0 48.75 10.06 3400 Tm -(NR ) Tj -24.6151 0 0 48.75 42.88 3400 Tm -(POS: ) Tj -26.7823 0 0 48.75 97.71 3400 Tm -(C3POS-) Tj -24.7714 0 0 48.75 181.74 3400 Tm -(C12 ) Tj -21.9939 0 0 47.5 2.77 3311 Tm -(QLIENT ) Tj -27.2511 0 0 47.5 94.71 3311 Tm -(C.U. ) Tj -45.1441 0 0 47.5 154.67 3311 Tm -(I./ ) Tj -36.9724 0 0 47.5 217.6 3311 Tm -(C.IE. ) Tj -27.5038 0 0 47.5 292.3 3311 Tm -(:RO1879855 ) Tj -21.1264 0 0 43.75 -1.11 3219 Tm -(DETERGENT ) Tj -20.5004 0 0 43.75 135.79 3219 Tm -(GEAMURI ) Tj -16.3336 0 0 43.75 246.77 3219 Tm -(5L ) Tj -23.6223 0 0 43.75 287.89 3219 Tm -(PH ) Tj -21.3702 0 0 43.75 329.9 3219 Tm -(MISAUON ) Tj -27.2716 0 0 50 0.96 3167 Tm -(U79005130 ) Tj -32.6134 0 0 50 136.58 3167 Tm -(6422 ) Tj -27.1727 0 0 50 198.7 3167 Tm -(768027152 ) Tj -22.2987 0 0 41.25 -3.12 3128 Tm -(PROSOP ) Tj -22.7218 0 0 41.25 92.89 3128 Tm -(HARTIE ) Tj -0 Tc -41.25 0 0 41.25 189.74 3128 Tm -(2 ) Tj --0.035 Tc -22.5766 0 0 41.25 217.58 3128 Tm -(STR ) Tj -25.232 0 0 41.25 272.68 3128 Tm -(640G/ROLA ) Tj -20.5545 0 0 41.25 412.9 3128 Tm -(MLI ) Tj -28.1421 0 0 36.25 2.79 3081 Tm -(IZ4441011047 ) Tj -29.5604 0 0 36.25 174.62 3081 Tm -(6422465006429 ) Tj -24.0428 0 0 50 196.89 3634 Tm -(BINE ) Tj -30.2041 0 0 50 269.93 3634 Tm -(ATI ) Tj -22.4532 0 0 50 320.95 3634 Tm -(VENIT ) Tj -20.8894 0 0 50 406.85 3634 Tm -(IN ) Tj -17.926 0 0 50 450.92 3634 Tm -(MAGAZ ) Tj -18.5243 0 0 50 517.87 3634 Tm -(INUL ) Tj -23.1722 0 0 50 580.89 3634 Tm -(BRICK ) Tj -29.905 0 0 40 345.68 3595 Tm -(CIF: ) Tj -26.6236 0 0 40 400.87 3595 Tm -(RO10562600 ) Tj -21.106 0 0 40 9.9 3032 Tm -(ROSOP ) Tj -23.5846 0 0 40 90.88 3032 Tm -(HORTIE ) Tj -0 Tc -40 0 0 40 188.75 3032 Tm -(2 ) Tj --0.035 Tc -23.1555 0 0 40 216.57 3032 Tm -(STR ) Tj -26.3735 0 0 40 273.88 3032 Tm -(4506/ROLA ) Tj -20.8502 0 0 40 413.9 3032 Tm -(ML6 ) Tj -28.4894 0 0 47.5 10.9 2980 Tm -(Z677101186146 ) Tj -29.8907 0 0 47.5 202.62 2980 Tm -(6422465006719 ) Tj -25.7316 0 0 56.25 -0.49 2926 Tm -(SACI ) Tj -21.374 0 0 56.25 64.9 2926 Tm -(MENAJ ) Tj -23.7919 0 0 56.25 147.86 2926 Tm -(EXIRA ) Tj -24.2523 0 0 56.25 232.71 2926 Tm -(351. ) Tj -26.2895 0 0 56.25 296.63 2926 Tm -(50BUC/SET ) Tj -27.6479 0 0 56.25 427.65 2926 Tm -(60 ) Tj -28.0802 0 0 45 10.8 2876 Tm -(IZ1022100021038102 ) Tj -29.7256 0 0 45 260.62 2876 Tm -(6422768020146 ) Tj -27.1352 0 0 57.5 4.5 2822 Tm -(SACI ) Tj -21.374 0 0 57.5 66.9 2822 Tm -(MENAJ ) Tj -26.6117 0 0 57.5 150.68 2822 Tm -(35L ) Tj -24.7164 0 0 57.5 213.1 2822 Tm -(NEGRI ) Tj -23.4361 0 0 57.5 289.75 2822 Tm -(C2 ) Tj -21.4677 0 0 57.5 331.7 2822 Tm -(50BLUC/ROL ) Tj -30.27 0 0 47.5 1.89 2776 Tm -(Z974101075372 ) Tj -29.2302 0 0 47.5 206.63 2776 Tm -(6425385000492 ) Tj -17.0747 0 0 42.5 10.68 2725 Tm -(SOLUT ) Tj -23.5085 0 0 42.5 72.83 2725 Tm -(IE ) Tj -21.2999 0 0 42.5 109.77 2725 Tm -(CURATARE ) Tj -21.9856 0 0 42.5 234.59 2725 Tm -(SPRAY ) Tj -22.3616 0 0 42.5 317.89 2725 Tm -(MOBILA ) Tj -28.713 0 0 42.5 414.66 2725 Tm -(300 ) Tj -26.3394 0 0 43.75 10.96 2675 Tm -(UZ102010108824 ) Tj -32.0192 0 0 43.75 206.59 2675 Tm -(642276802669 ) Tj -18.2461 0 0 52.5 9.66 2625 Tm -(SACI ) Tj -21.0596 0 0 52.5 68.9 2625 Tm -(MENAJ ) Tj -21.4029 0 0 52.5 151.87 2625 Tm -(EXTRA ) Tj -25.9464 0 0 52.5 234.69 2625 Tm -(35L ) Tj -22.2452 0 0 52.5 296.69 2625 Tm -(5OBUC ) Tj -27.7155 0 0 52.5 365.99 2625 Tm -(/SET ) Tj -27.6479 0 0 52.5 428.65 2625 Tm -(60 ) Tj -27.1421 0 0 42.5 9.96 2577 Tm -(UZ1022100021038102 ) Tj -28.3557 0 0 42.5 262.64 2577 Tm -(6422768O20146 ) Tj -18.2461 0 0 45 12.66 2526 Tm -(SACI ) Tj -21.6883 0 0 45 67.9 2526 Tm -(MENAJ ) Tj -25.9464 0 0 45 151.69 2526 Tm -(35L ) Tj -21.9701 0 0 45 207.09 2526 Tm -(NEGRI ) Tj -23.4361 0 0 45 289.75 2526 Tm -(C2 ) Tj -23.9292 0 0 45 331.66 2526 Tm -(50BUC/ROL ) Tj -27.8066 0 0 46.25 10.8 2477 Tm -(IZ974101075372 ) Tj -29.3953 0 0 46.25 206.63 2477 Tm -(6425385000492 ) Tj -0 Tc -55 0 0 55 3.71 2424 Tm -(+ ) Tj --0.035 Tc -22.1574 0 0 55 25.89 2424 Tm -(BEC ) Tj -21.5083 0 0 55 81.88 2424 Tm -(LED ) Tj -20.8861 0 0 55 137.88 2424 Tm -(ECO ) Tj -24.2986 0 0 55 192.95 2424 Tm -(A50 ) Tj -26.1926 0 0 55 248.84 2424 Tm -(E27 ) Tj -23.2279 0 0 55 303.75 2424 Tm -(7N ) Tj -21.2557 0 0 55 345.88 2424 Tm -(LUMINA ) Tj -21.3938 0 0 55 442.9 2424 Tm -(REC ) Tj -28.6299 0 0 46.25 11.83 2377 Tm -(EL13801101103 ) Tj -29.6074 0 0 46.25 206.58 2377 Tm -(5949054916415 ) Tj -23.8603 0 0 46.25 9.88 2327 Tm -(+BEC ) Tj -21.5083 0 0 46.25 81.88 2327 Tm -(LED ) Tj -26.1926 0 0 46.25 137.84 2327 Tm -(E27 ) Tj -22.2026 0 0 46.25 193.22 2327 Tm -(15W ) Tj -28.8879 0 0 46.25 248.99 2327 Tm -(175-250V ) Tj -21.2557 0 0 46.25 373.88 2327 Tm -(LUMINA ) Tj -0 Tc -46.25 0 0 46.25 470.77 2327 Tm -(R ) Tj --0.035 Tc -26.3974 0 0 48.75 -0.17 2280 Tm -(ELO9081109 ) Tj -29.2809 0 0 48.75 151.47 2280 Tm -(8680985523118 ) Tj -24.0125 0 0 42.5 320.89 3775 Tm -(FIVE-HOLDING ) Tj -26.8276 0 0 42.5 497.5 3775 Tm -(S.0. ) Tj -25.8903 0 0 50 246.85 3725 Tm -(JUD. ) Tj -22.8536 0 0 50 307.76 3725 Tm -(CONSIANTA, ) Tj -18.6428 0 0 50 457.91 3725 Tm -(MUN, ) Tj -21.216 0 0 50 525.78 3725 Tm -(CONSTANTA ) Tj -26.4193 0 0 42.5 306.51 3686 Tm -(SIR. ) Tj -20.0911 0 0 42.5 378.85 3686 Tm -(ION ) Tj -20.0019 0 0 42.5 428.9 3686 Tm -(RONTA ) Tj -20.694 0 0 42.5 511.09 3686 Tm -(NR ) Tj -0 Tc -42.5 0 0 42.5 566.49 3686 Tm -(3 ) Tj -47.5 0 0 47.5 9.75 2228 Tm -(+ ) Tj --0.035 Tc -21.617 0 0 47.5 26.9 2228 Tm -(BEC ) Tj -22.046 0 0 47.5 81.87 2228 Tm -(LED ) Tj -24.2986 0 0 47.5 137.95 2228 Tm -(A70 ) Tj -26.1926 0 0 47.5 193.84 2228 Tm -(E27 ) Tj -22.2026 0 0 47.5 249.22 2228 Tm -(18W ) Tj -21.5181 0 0 47.5 304.88 2228 Tm -(LUMINA ) Tj -21.6796 0 0 47.5 401.89 2228 Tm -(RECE ) Tj -0 Tc -47.5 0 0 47.5 470.39 2228 Tm -(6 ) Tj --0.035 Tc -25.5244 0 0 45 9.85 2180 Tm -(EL9001612 ) Tj -29.6074 0 0 45 137.58 2180 Tm -(5849054922850 ) Tj -19.501 0 0 45 10.91 1555 Tm -(BTOTAL ) Tj -0 Tc -47.5 0 0 47.5 9.75 2129 Tm -(+ ) Tj --0.035 Tc -21.617 0 0 47.5 27.9 2129 Tm -(BEC ) Tj -22.046 0 0 47.5 82.87 2129 Tm -(LED ) Tj -20.8861 0 0 47.5 138.88 2129 Tm -(ECO ) Tj -22.0301 0 0 47.5 194.89 2129 Tm -(R5O ) Tj -26.1926 0 0 47.5 249.84 2129 Tm -(E27 ) Tj -27.648 0 0 47.5 305.7 2129 Tm -(74 ) Tj -21.2557 0 0 47.5 346.88 2129 Tm -(LUMINA ) Tj -21.3938 0 0 47.5 442.9 2129 Tm -(REC ) Tj -16.4921 0 0 46.25 9.9 2080 Tm -(EL1 ) Tj -29.532 0 0 46.25 42.65 2080 Tm -(38011001103 ) Tj -29.2766 0 0 46.25 208.58 2080 Tm -(5949054916415 ) Tj -21.2837 0 0 46.25 10.9 2031 Tm -(HARTIE ) Tj -25.351 0 0 46.25 102.82 2031 Tm -(IGIENICA ) Tj -23.8639 0 0 46.25 223.89 2031 Tm -(BRICK ) Tj -0 Tc -46.25 0 0 46.25 306.44 2031 Tm -(3 ) Tj --0.035 Tc -22.582 0 0 46.25 333.58 2031 Tm -(STRATURI ) Tj -28.6635 0 0 45 10.96 1984 Tm -(UZ905335 ) Tj -29.2302 0 0 45 142.63 1984 Tm -(6425667001247 ) Tj -21.5713 0 0 50 8.89 1938 Tm -(HARTIE ) Tj -29.6861 0 0 50 103.78 1938 Tm -(IGIENI ) Tj -19.5283 0 0 50 187.79 1938 Tm -(CA ) Tj -23.8639 0 0 50 222.89 1938 Tm -(BRICK ) Tj -0 Tc -50 0 0 50 305.4 1938 Tm -(3 ) Tj --0.035 Tc -22.7991 0 0 50 332.58 1938 Tm -(STRATURI ) Tj -26.3919 0 0 43.75 -0.05 1898 Tm -(UZ9005335 ) Tj -28.8999 0 0 43.75 134.63 1898 Tm -(6425667001247 ) Tj -21.2837 0 0 45 0.9 1853 Tm -(HARTIE ) Tj -25.5902 0 0 45 94.81 1853 Tm -(IGIENICA ) Tj -23.518 0 0 45 216.89 1853 Tm -(BRICK ) Tj -0 Tc -45 0 0 45 299.46 1853 Tm -(3 ) Tj --0.035 Tc -22.7991 0 0 45 328.58 1853 Tm -(STRATURI ) Tj -30.9941 0 0 41.25 10.89 1805 Tm -(Z900535 ) Tj -29.8907 0 0 41.25 130.62 1805 Tm -(6425667001247 ) Tj -22.181 0 0 45 10.95 1755 Tm -(ARTIE ) Tj -25.8294 0 0 45 89.81 1755 Tm -(IGIENICA ) Tj -24.2098 0 0 45 212.88 1755 Tm -(BRICK ) Tj -0 Tc -45 0 0 45 296.46 1755 Tm -(3 ) Tj --0.035 Tc -23.2334 0 0 45 325.57 1755 Tm -(STRATURI ) Tj -25.9555 0 0 42.5 10.91 1707 Tm -(Z9005335 ) Tj -29.5604 0 0 42.5 125.62 1707 Tm -(6425667001247 ) Tj -26.5189 0 0 45 10.87 1656 Tm -(RTIE ) Tj -26.0685 0 0 45 85.81 1656 Tm -(IGIENICA ) Tj -24.5556 0 0 45 209.88 1656 Tm -(BRICK ) Tj -0 Tc -45 0 0 45 294.46 1656 Tm -(3 ) Tj --0.035 Tc -23.4505 0 0 45 322.57 1656 Tm -(STRATURI ) Tj -29.6537 0 0 45 10.81 1607 Tm -(2905335 ) Tj -30.3861 0 0 45 122.61 1607 Tm -(6425667001247 ) Tj -23.8736 0 0 100 11.83 1404 Tm -(IA ) Tj -20.4648 0 0 100 60.88 1404 Tm -(LE ) Tj -20.081 0 0 38.75 -0.13 1256 Tm -(EST ) Tj -18.5277 0 0 41.25 9.81 1160 Tm -(OTAL ) Tj -21.3464 0 0 41.25 71.81 1160 Tm -(TUA ) Tj -0 Tc -41.25 0 0 41.25 127.91 1160 Tm -(A ) Tj -41.25 0 0 41.25 156.5 1160 Tm -(-) Tj --0.035 Tc -23.5079 0 0 41.25 183.85 1160 Tm -(21% ) Tj -23.6523 0 0 38.75 -2.25 1120 Tm -(OTAL ) Tj -20.3299 0 0 38.75 74.82 1120 Tm -(TUA ) Tj -20.3131 0 0 38.75 129.9 1120 Tm -(BON ) Tj -14.0302 0 0 33.75 9.06 1079 Tm -(NR. ) Tj -24.2857 0 0 33.75 51.88 1079 Tm -(POZ. ) Tj -22.9273 0 0 33.75 120.95 1079 Tm -(ART. ) Tj -23.8736 0 0 33.75 193.83 1079 Tm -(IN ) Tj -22.5624 0 0 33.75 231.89 1079 Tm -(BON: ) Tj -29.6324 0 0 40 5.89 508 Tm -(Z:0146 ) Tj -27.8509 0 0 40 101.87 508 Tm -(BF:0171 ) Tj -21.8841 0 0 43.75 11.84 454 Tm -(ID ) Tj -24.8686 0 0 43.75 48.88 454 Tm -(BF: ) Tj -31.0124 0 0 36.25 7.42 362 Tm -(S/N:D8470001107 ) Tj -23.8351 0 0 43.75 10.75 307 Tm -(CASIER ) Tj -31.3154 0 0 43.75 105.9 307 Tm -(1: ) Tj -27.937 0 0 38.75 322.7 759 Tm -(C3POS-CT2:1360760 ) Tj -0 Tc -52.5 0 0 52.5 594.16 3168 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 52.5 609.9 3168 Tm -(BUC ) Tj -0 Tc -52.5 0 0 52.5 665.89 3168 Tm -(X ) Tj --0.035 Tc -27.5601 0 0 52.5 693.83 3168 Tm -(27. ) Tj -25.8839 0 0 52.5 734.7 3168 Tm -(93= ) Tj -32.5188 0 0 52.5 790.8 3168 Tm -(27.93 ) Tj -0 Tc -52.5 0 0 52.5 873.88 3168 Tm -(A ) Tj -52.5 0 0 52.5 578.16 3076 Tm -(1 ) Tj --0.035 Tc -20.2856 0 0 52.5 595.9 3076 Tm -(ROLA ) Tj -0 Tc -52.5 0 0 52.5 666.89 3076 Tm -(X ) Tj --0.035 Tc -27.0613 0 0 52.5 695.05 3076 Tm -(13. ) Tj -22.26 0 0 52.5 741.76 3076 Tm -(00 ) Tj -31.3942 0 0 52.5 792.9 3076 Tm -(13.00 ) Tj -0 Tc -52.5 0 0 52.5 874.88 3076 Tm -(A ) Tj -58.75 0 0 58.75 618.94 2970 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 58.75 637.9 2970 Tm -(BUC ) Tj -0 Tc -58.75 0 0 58.75 693.88 2970 Tm -(X ) Tj --0.035 Tc -27.5324 0 0 58.75 721.68 2970 Tm -(9. ) Tj -30.6923 0 0 58.75 749.64 2970 Tm -(96-) Tj -33.3314 0 0 58.75 805.61 2970 Tm -(9,95 ) Tj -0 Tc -58.75 0 0 58.75 874.87 2970 Tm -(A ) Tj --0.035 Tc -19.8177 0 0 36.25 381.91 279 Tm -(BON ) Tj -23.0709 0 0 36.25 435.89 279 Tm -(FISCAL ) Tj -28.9694 0 0 36.25 378.66 231 Tm -(9000221498 ) Tj -0 Tc -55 0 0 55 621.07 2872 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 55 636.9 2872 Tm -(BUC ) Tj -0 Tc -55 0 0 55 692.88 2872 Tm -(X ) Tj --0.035 Tc -27.9084 0 0 55 720.6 2872 Tm -(5. ) Tj -29.6546 0 0 55 748.87 2872 Tm -(49-) Tj -27.9084 0 0 55 803.6 2872 Tm -(5, ) Tj -27.3771 0 0 55 831.88 2872 Tm -(49 ) Tj -0 Tc -55 0 0 55 873.88 2872 Tm -(A ) Tj -48.75 0 0 48.75 606.29 2778 Tm -(1 ) Tj --0.035 Tc -21.0511 0 0 48.75 620.9 2778 Tm -(ROLA ) Tj -0 Tc -48.75 0 0 48.75 689.9 2778 Tm -(X ) Tj --0.035 Tc -40.3527 0 0 48.75 717.43 2778 Tm -(5.81 ) Tj -35.3862 0 0 48.75 805.5 2778 Tm -(5.81 ) Tj -0 Tc -48.75 0 0 48.75 870.89 2778 Tm -(A ) Tj -47.5 0 0 47.5 590.34 2679 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 47.5 606.9 2679 Tm -(BUC ) Tj -0 Tc -47.5 0 0 47.5 662.9 2679 Tm -(X ) Tj --0.035 Tc -27.9633 0 0 47.5 691.02 2679 Tm -(10, ) Tj -24.3622 0 0 47.5 731.89 2679 Tm -(49= ) Tj -32.3752 0 0 47.5 786.87 2679 Tm -(10.49 ) Tj -0 Tc -47.5 0 0 47.5 869.89 2679 Tm -(A ) Tj -51.25 0 0 51.25 622.2 2576 Tm -(1 ) Tj --0.035 Tc -19.8736 0 0 51.25 634.91 2576 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 689.89 2576 Tm -(X ) Tj --0.035 Tc -35.0821 0 0 51.25 716.5 2576 Tm -(5.49: ) Tj -33.5238 0 0 51.25 798.52 2576 Tm -(5.49 ) Tj -0 Tc -51.25 0 0 51.25 868.88 2576 Tm -(A ) Tj -48.75 0 0 48.75 608.29 2481 Tm -(1 ) Tj --0.035 Tc -20.6683 0 0 48.75 620.9 2481 Tm -(ROLA ) Tj -0 Tc -48.75 0 0 48.75 688.9 2481 Tm -(X ) Tj --0.035 Tc -27.9084 0 0 48.75 716.6 2481 Tm -(5. ) Tj -26.065 0 0 48.75 743.53 2481 Tm -(81= ) Tj -31.6613 0 0 48.75 797.55 2481 Tm -(5,81 ) Tj -0 Tc -48.75 0 0 48.75 866.89 2481 Tm -(A ) Tj -46.25 0 0 46.25 618.38 2380 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 46.25 633.9 2380 Tm -(BUC ) Tj -0 Tc -46.25 0 0 46.25 688.9 2380 Tm -(X ) Tj --0.035 Tc -35.0821 0 0 46.25 715.5 2380 Tm -(5.54: ) Tj -34.1446 0 0 46.25 797.51 2380 Tm -(5.54 ) Tj -0 Tc -46.25 0 0 46.25 866.9 2380 Tm -(A ) Tj -51.25 0 0 51.25 622.2 2279 Tm -(1 ) Tj --0.035 Tc -19.8736 0 0 51.25 633.91 2279 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 687.89 2279 Tm -(X ) Tj --0.035 Tc -18.838 0 0 51.25 721.78 2279 Tm -(9. ) Tj -26.7509 0 0 51.25 745.52 2279 Tm -(80= ) Tj -33.3314 0 0 51.25 796.61 2279 Tm -(9.80 ) Tj -0 Tc -51.25 0 0 51.25 865.88 2279 Tm -(A ) Tj -50 0 0 50 592.25 2175 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 50 607.9 2175 Tm -(BUC ) Tj -0 Tc -50 0 0 50 662.9 2175 Tm -(X ) Tj --0.035 Tc -30.3905 0 0 50 688.94 2175 Tm -(13.61= ) Tj -30.9036 0 0 50 783.92 2175 Tm -(13.61 ) Tj -0 Tc -50 0 0 50 867.89 2175 Tm -(A ) Tj -51.25 0 0 51.25 616.2 2078 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 51.25 632.9 2078 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 687.89 2078 Tm -(X ) Tj --0.035 Tc -29.9234 0 0 51.25 714.58 2078 Tm -(5.54+ ) Tj -32.9029 0 0 51.25 796.53 2078 Tm -(5,54 ) Tj -0 Tc -51.25 0 0 51.25 865.88 2078 Tm -(A ) Tj -51.25 0 0 51.25 594.2 1978 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 51.25 606.9 1978 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 661.89 1978 Tm -(X ) Tj --0.035 Tc -30.3905 0 0 51.25 688.94 1978 Tm -(13.54= ) Tj -32.8658 0 0 51.25 783.85 1978 Tm -(13.54 ) Tj -0 Tc -51.25 0 0 51.25 866.88 1978 Tm -(A ) Tj -45 0 0 45 589.42 1894 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 45 606.9 1894 Tm -(BUC ) Tj -0 Tc -45 0 0 45 661.91 1894 Tm -(X ) Tj --0.035 Tc -30.7801 0 0 45 688.92 1894 Tm -(13.54= ) Tj -32.8658 0 0 45 786.85 1894 Tm -(13.54 ) Tj -0 Tc -45 0 0 45 869.9 1894 Tm -(A ) Tj -45 0 0 45 589.42 1804 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 45 606.9 1804 Tm -(BUC ) Tj -0 Tc -45 0 0 45 662.91 1804 Tm -(X ) Tj --0.035 Tc -31.1697 0 0 45 689.91 1804 Tm -(13.54= ) Tj -33.8468 0 0 45 787.82 1804 Tm -(13.54 ) Tj -0 Tc -45 0 0 45 872.9 1804 Tm -(A ) Tj --0.035 Tc -22.3236 0 0 48.75 3.89 663 Tm -(PRETUL ) Tj -22.7923 0 0 48.75 100.95 663 Tm -(ARTICOLELOR ) Tj -20.1525 0 0 48.75 266.9 663 Tm -(MARCATE ) Tj -19.5283 0 0 48.75 377.79 663 Tm -(CU ) Tj -21.4767 0 0 48.75 450.84 663 Tm -(INCLUD ) Tj -23.3562 0 0 48.75 541.79 663 Tm -(TAKA ) Tj -19.4762 0 0 48.75 617.95 663 Tm -(VERDE ) Tj -19.9516 0 0 48.75 4.79 614 Tm -(CONFORM ) Tj -23.3952 0 0 48.75 120.95 614 Tm -(ART. ) Tj -26.9368 0 0 48.75 178.68 614 Tm -(34 ) Tj -23.6624 0 0 48.75 211.88 614 Tm -(DIN ) Tj -18.8065 0 0 48.75 267.81 614 Tm -(OUG ) Tj -35.6967 0 0 48.75 322.82 614 Tm -(R.5/2015 ) Tj -20.8894 0 0 48.75 465.85 614 Tm -(IN ) Tj -20.4065 0 0 48.75 502.95 614 Tm -(VALOARE ) Tj -20.3055 0 0 48.75 611.9 614 Tm -(DE ) Tj -31.9784 0 0 48.75 653.8 614 Tm -(2.45 ) Tj -0 Tc -52.5 0 0 52.5 588.16 1704 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 52.5 605.9 1704 Tm -(BUC ) Tj -0 Tc -52.5 0 0 52.5 662.89 1704 Tm -(X ) Tj --0.035 Tc -35.0938 0 0 52.5 689.77 1704 Tm -(13.54-) Tj -33.8468 0 0 52.5 789.82 1704 Tm -(13.54 ) Tj -0 Tc -52.5 0 0 52.5 875.88 1704 Tm -(A ) Tj -57.5 0 0 57.5 589.98 1601 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 57.5 605.9 1601 Tm -(BUC ) Tj -0 Tc -57.5 0 0 57.5 662.88 1601 Tm -(X ) Tj --0.035 Tc -30.6694 0 0 57.5 690.93 1601 Tm -(13. ) Tj -31.7383 0 0 57.5 734.55 1601 Tm -(54-) Tj -34.3374 0 0 57.5 790.8 1601 Tm -(13.54 ) Tj -0 Tc -57.5 0 0 57.5 877.87 1601 Tm -(A ) Tj --0.035 Tc -21.4056 0 0 41.25 242.9 422 Tm -(DATA: ) Tj -31.7787 0 0 41.25 324.89 422 Tm -(11-10-2025 ) Tj -21.6838 0 0 41.25 476.78 422 Tm -(ORA: ) Tj -31.5049 0 0 41.25 545.9 422 Tm -(12:51:01 ) Tj -33.9512 0 0 45 805.81 1555 Tm -(186.16 ) Tj -15.6712 0 0 45 210.98 181 Tm -(UA ) Tj -21.5162 0 0 45 245.89 181 Tm -(RUGAM ) Tj -20.6877 0 0 45 327.62 181 Tm -(SA ) Tj -25.0296 0 0 45 373.88 181 Tm -(PASTRATI ) Tj -20.1195 0 0 45 492.9 181 Tm -(BONUL ) Tj -35.5044 0 0 45 573.83 181 Tm -(FISCAL! ) Tj -20.3315 0 0 43.75 162.95 132 Tm -(VOCEA ) Tj -25.3923 0 0 43.75 244.73 132 Tm -(CLIENTULU|: ) Tj -28.2245 0 0 43.75 410.7 132 Tm -(08008 ) Tj -24.2548 0 0 43.75 492.88 132 Tm -(BRICK: ) Tj -28.9489 0 0 43.75 588.69 132 Tm -(0800827425 ) Tj -25.808 0 0 47.5 178.77 82 Tm -(TIPARIT ) Tj -23.6624 0 0 47.5 286.88 82 Tm -(DIN ) Tj -22.6358 0 0 47.5 341.76 82 Tm -(COGITO ) Tj -21.7249 0 0 47.5 438.87 82 Tm -(ERP ) Tj -22.3374 0 0 47.5 493.92 82 Tm -(WW. ) Tj -20.7218 0 0 47.5 547.78 82 Tm -(COGI ) Tj -24.7121 0 0 47.5 603.78 82 Tm -(TO-ERP. ) Tj -18.5089 0 0 47.5 698.91 82 Tm -(RO ) Tj -34.3506 0 0 42.5 807.8 1300 Tm -(186.16 ) Tj -34.4956 0 0 41.25 836.63 1251 Tm -(0.00 ) Tj -30.3893 0 0 37.5 821.64 1159 Tm -(32.31 ) Tj -29.907 0 0 35 820.64 1117 Tm -(32.31 ) Tj -29.0126 0 0 52.5 450.66 463 Tm -(90002214982025101112510101460171 ) Tj -24.6196 0 0 30 863.14 1080 Tm -(17 ) Tj -19.7698 0 0 42.5 725.08 516 Tm -(NR. ) Tj -22.618 0 0 42.5 765.95 516 Tm -(ANEF: ) Tj -25.0882 0 0 42.5 835.73 516 Tm -(0001 ) Tj -26.5139 0 0 55 741.76 363 Tm -(TD:00029241 ) Tj -23.8351 0 0 43.75 781.75 319 Tm -(CASIER ) Tj -0 Tc -43.75 0 0 43.75 878.47 319 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqwP"1 (l@8@&n.e&S0R@@&Ra @38N`#@`&ȃ"N4441b&ԲDd@"biĀE"U8ܵ &2#F,I -`BRTQi $10)(qBh b`$H@!)*8@LӠj` r&ЁPf͠粨]vN:Èh llJ4CB`& -IDBj:L$ITc04@*I@2`& (l@" LbA -i(Hhd6@dY&j44K H Di&n#IH%@*i,TD` 2Qp!(h@MiD0lp bY!<dZ*dg*i{OP_B -]Xb 4 0HE(8j S!0  @FB$8@dR4, L%$# dIC4 1Ȕ*Lch+vjƾU-z$ 0bQŃi B-0 @@Q`6Dh ` C"ڠ BpІb h000pLW%؍}#c5  R@ -L@ %$ iSp8F 4M@!)DI: a89D&%$`Fi+&c_[12 L J#d!I& ` 4k=iWzOжkh Ӷ}k$(v=K.ƥaCwnUפao5[X7١\EUmŒ p,(H%(`@&FI,$@) `&PhͰ>L10dI"#)h4) 9DV(j_07ޒm u{0|69&}n+vTMn矠@!c N"&0m@Ii4ԉ! 4mM~57#_T1 -I LA1i(h$! - R(@Bpi7h4$쁮Ad!VGM)zɔa{DR#dP'C>?Q p9P@ ) @!3XKX#$4!cC -Iuv4pclje]v˫)bK3W$뜮zu%4{WJ-TLLJ}Vok.kȩy+vX.etD'5!J2LL&V0P4 0L e1RHT3]elߤVbG44(׏3鱵4`mؒ+'Rz[6dY=hW=ޣNifY}MK:Y-M6VWCA2ᱎmsUψcbAw4+c Hf b` - P h!c48@ъP1 -QC7 0hA=LrGp^^r}^ͳ^(iM O쭲W0*hP%g)!ZlE" L<BF`CL0\zZ4!&$q $0bGiڬ]v(so,o[;j_tUO]I>jxH-rlL]K=΃ѣd,jP"T  044H@4LQ8.Ap#(`hbV)`PFE![Y5r3gsUJKYt:eMjvl7OғǡI.*Ysqw.CꥴEcCklI{n^Xy4Ԛg'HFIC=#tT|'m/J)|6͞\MmS^Tn -edk:֯gNtɺ@HNV`&Ӏ hLLa1.SBDmSC$ " 3pMŲZF<>_z8˿Ǭk+xcTK߅[ =[}iӝM!8Lihm8D "1Z|d ˄Hc@&'@`H)$'hiiZ -kNJj/0kf_aԨy'֧z(?Du{]n.!!`(@`bFIB!0!0 L(ohb$$4, -`X6 궮;Mݴ;VLej6*2l[ݑQ̱[]B+^6-;p ` $0@ L0*4,jh@$H!!dd]8LIBRn,D1%(8'9bD=r̐_RA=%BD$0I#!a GWx#6]>:N5tuq,~5-4Իc.>Z -tuѣWD/o -'N3`Z.^a"$*``M 1 `Q` R!`b-c +6`Fv/|l9e`^kuwM֦+2z_̴H{W(C+v |v9tl񥞷e"=X#8`0ĉ B`q 4``& I1`e@ CBa@ -Iy[\s7jyZU5U{)xYۂpUQ˲8(N5J)6hwVl1i7;S=c٤U,(o(4 l`h+N( BPLA4@LLJ2! bb40D-bsbR6aì{ү^l!jkbKKnҏuSV? -mi$ F@ h04b@LI4 ĥ B@M0&5@e&hmMXOGuz- -6VI=⃸6܏o5};:B*mŗG|q `Q!@$ @0M(  h6@1`KO&[X 5>;EܔVlznh16r+ѱvч]3QE_i`M I1c@$P,&RX1H@` L"LD0'C@!Ӛ*ʼs8Pr2xČojy "yՑ&yzeA=pVyG$5dDZ)BU-NeafK]5iąslF[0Yc -̳VxHR=e8Q>I?,K6f:"#/Q44 RJj0jK[c$ -5D 2*ۍ[qޅFd L[-AFlFz/FS=F6K>A ce$yb1=y{) -1Zb2!1A)be4ynr{GNq|sa(AALc%S L( LC@1LQcqk&@T@Em&$Mx,S,D+%q3.y9q1,|9˿sM]q,{:!dD @&4 ZIJ3Y4'&Ӕa -0 s@kR] Ss-ASzn\d4i٩`&&&JVЪ -x76LUֿ}ʵԎMF^gju< -L(?^vӑui?;&cQOާ(B. EI -$@Ć I!:=!)e(ZDVhbjC@ $I1 CcYf+{k} z+:28ivJj,C4Y-p}YB,ʎ΀;ʫzS _8bzPSf `HI`D0b#WRqc“@?΁KKɺKcۑʞ]<^RgߕTr^S? -Et)ǑU6EBzzTGA4J5ܮYio}naxYc\r ^G1ecGyVgvZ 6?6uf -ւ4na5S>:f*LBd!I  `(ށ8N^fټ>e5{{.T;7Yh=wEםu.]]B*9RZVF_Oyu*dmzVc:O8_n̺rz6Jd[rI@07UЧT]gTcoe>*uUOkMs[:=#7d]*լv] (^x}/W,ctӺ@rQ"LCQV@5(2mD.mUsmFMg_uǕ3묎 c/2t{9cXFJGpYe;W,;~%(R2Cz -lu%s=muYeƛTg\12V)>[nU:W5 z(>/q]ΕLf:g80DHI`!!i.Q8S &`I5A@ÙL]뻨]vo;=IƽMzsΣO7l/'HUet{ZӬ֍G,xNAzsr5]CI^V= -Mi7̻qW\xWk/7T2t.q!@7- X&dLdh#(d$ #0@ M(0Av5N˲ȣd\]3rjUUR7m9(ʕN -wV,Z2:uutybaDN{gL[EJY:kCȤ^y=O9~L~,~Ay}2W=%^ODef,1mDw=hֵ5l)9xcm]԰eeQmg4٧Dދ0|yu).9ζOn_t#%t C+!}cGG==׊2%2:\FA&*OeR,F>w%29ʽ/ *|*H.Q=RI %cN{d,OJh6f!G3 `2]iK-+gm$l:!0qS*6ZMMΗk_j[#DUߚt|GaP3!bV‡`0 NG"ƽVrwP8gS#!!q 4Ɔ% CCbN,|[d.y.{?R[#:nɥ5ݨʥ6=+;Zl2p_k~/׺h"2?P')+Ut\tZ8y?}sؔuki8"] =ow`=yE(,͑4޻eU.s~AIt|i/{5yrbili]qYߵ$"Cb4 R@4ƀMZj -Zſ4^ Nܾgە]j7kK5kt{}l5j4{OU[h7iUT%Q/Dm0ZXSTBxZO.ծlX*%S׊{ł5sts YJ=^>Ω^[TiʋgEUu|u GX6>Y\7>ldYwd$@S! @!b!"B`D"5*!LrrH -ZEļޔzhr|j'D E]N(kCԞ;,=i{/D^9rvMQ-UkuIc諗X).TNiw>~r{T5 -OC_\8C_xts L`%  ),F`q24 -@ DdfIg16R$Agļg;aE}[(-v6Ĭ+Ʋ/A[Nu|&Ff0噶lspv/)L|}%.Vyc<͆rë>m^tNw`=sy*&r_ʀl$%$ iFI"0CdTD%0RA)T}ې$&a8pX>Ql XFyHX^I1c FJ=O8bxŬz{G&A&G^C!0R"*H*H`hO!"qL#" 'Ke!=:&)R'!c(˽|wZR.iy`+&M=E,Fxbzֱ6L3;Qйzmj";]~RC/~ċRoi'W&cћIk<0™9L0)*h`&1)ȩI" A=vlj5V֣7Qs=A`Q1lsg(j~^ -ߑ[S$W,6Woɒ6Fh×aNTW?mK'<څȨf]ɺ=7X^%֧j.exYiL,>ǰi v,Zgkjѕ^6T0hǖTkAn&ʱei覆z -zsA1 -Lb"I=dm(9cE֩m.UhQ(mh:}dm=7ZmR4afYЛlK(<5^T@ kL\!>91|  q1fcbl= IyDc3#ǟxm~>֙+\C;d#q#_ bezym -Ֆ,0ІR IldS%o87.ҷb+v[0F~1iZ9Vf 8ֻNf̔6ZẸdd ku*Ek^wLno놛3u!YB#UM>5d&Nmc[ѡ8Ʈ٬B9ټ3I:W?[m V/$"Ir[h![dI! aN*D0R6H=bJd'!Phk=E[ - vςxYQ GΉBmՕ=E^? lZb٪4o]46s:KwMNL-58J(#_9^n{r`^~& 1` -ACh)q?o?I}%b``!'ʹGM>i0Eo,s] ~}rpĪjz)96=n4rߴ]E@sK^E"U5 -1mF&U-Ih#Q - [m=Gegkx8=rIt:mה_S#'\sK[ -^ەͬyPӧaU=o+D:O5LG8X {m&@QH14aeYz7,a_'ˎ.OF/'iRl[.u{O5X n狕Rϣ::]ӘkO3K9λ3E[L кm~{k4d`l3#~~'nT;V.4Zo{*o2]#jKOz+6e^xDƸL]ά\h]/oM{v݀2L(4nrt}v\P8BP:w(2G+꫇z&N#]r+'K#FglzɗΏ]Gb¡9D㽋W X"1Ԋat/U+IWh\ηﶾ#=L*GEB)ٖ {} -6xK:篤Cr$9V{B@h0J2D %T+zĢWz9WSR/9K_l$LxwLs9Mg?YILBʥ+ͮPX 64< h}yE^im7TL*Z#K\}h3}yv/UMyyQTuԽ9xwsqJ-q:JkNSҝ5TrT[":$y:cRZ%Lם#[".q-~&"Q& 441 --*@$0E1,8=a0`'g[x*( -lP/sٰ[)ƙofiO-Hl6IkMkW2tS+um!UdLvdS.Tct~d_#7,٪6c᝖Ftf^tꙺ|˦2-0&!8ib$?O/RM%OYCT41@ 5ÑjvC\l._<{Yھ9Ős Х+wLtP.tgs9mf=/㜾ղo+R^Oݰ>gák&c+n3HtDJ'K Fqa"& zb1"sͩB&EpGI/9"9@,~Z]M\'m%U[)s]w7>-jl曂{ʧ^NE3'˯F5}b8KjZC:)'K/EdYlEًv;^tHU?0`0JHCю4& ̡1l+hL]gͺ)(V xi -цhAD<)^r=M^]W}zOr1STc5 ]Gsuge^gvnM]?rd^Hjv'> -7}ApsG9Sʵ6fW`]uZ2  4 44|!99FѶOLR־ӦTRV|&ͺRܢ>Rgp -/G Wu)c -Mη m\Z4/Q*,d(1DD=eU|^ʏt P7yR䷹UID[Ťh0iUkjG@*\X-y*ޕKXȺ`4!R0L@*"$ ?_?D3_IyHj4  + JF6zϯ˟ɹb.8ɦX˾ʭ!^]U29 W?ضߡf=cxl$Y6t2csϬ{aoͷ6뱢ft[I:b @ LAhpV& =}<"$Щj iZ YV_+[\ꕢ^Y9&# 0=AKy[|1 qPmіÏl8Wl%hh & S "bm=LM46/5[BFc G_[5dx{x,S(3&\e dc9b~>fYE^G$/0 M2@C^GCy$-/vDe^D6 hh&10!D< M&z`g{xT)$^jFm}6f^FGnu蜏n0"IkL\ͧ\O;yƻe;{@̫k*^-5+qήzf"Ӥ#L `hIĐR$m-@zI6@?XJYb&82@F6L hYGVce}6I~xg<[A Wm$o߹'_5nSZ> 7פr{7UN4 # #$Iq1M0M4T -Pb`I`&P:^m|qgRͽNWߠͬ5 )P{==q̬)j-adoYikŻO&/UKmDs떐A%kyɻm/?Kװ Sє@[Fi+v~dahln -&Hh"%S@69FH~^2H4 4 9)甪ualQ0ui~ew's"e -!*}, hkk7C#Me' -2yTo2؁&g薇tȐDN0ݬse{Ђh -3 Mtaf46@DLm1i\%F$1Y7#ZzxK4А9 !HL WB[k2z%Ƴ5xD*wMU(ӣ39ڹW\wWn MW2Fڽe FNd`M6M_;-7+4E4j#@#(D@(187u'͎>e/ڇ|:wSג,\hmm@mC3S:#΍{ãwegpiy4m*VЋ@H"`n}+h} nI*Zףwꑢi}_=dS];A:FVǦmU6^skZQ-ˡ6д ck7ʭXrJP"IMRJFHIi`D`ע.MֹF"7fk%ZdfpƎ3ֱo2 -{ey;{ө*ak#c.EgFI8*U -UzXR4U^<=+VTr{G8QYm'Fr8a -NHT")t˸r%ܤqB#O^ͪq`IDJ LQ p$0Orާr.@vL4tOsm+Gtv6r(3X.aH˶3%b2fs"2 `diwu -c6uv n9f nFzY <[ WL۟^q`("Z,};}KYnM粒qQatߙ}7Xjv,纼R6>7*[ -zN 1 4%!D%j!'PJ! smhUmpP6:T`97^,?| uJ{躭 -._tA1\BWJ9^Otr CAG<^ǭ}j9ƃ5wFrGm &ݴ,P8jr!q?xp8oVڃm76}UqU^FPls^J7N) !1F@ -L ` L0 LiU,*}nkVT\\LbS;5aes 5d 4'8 Wq~>NLSQH:k*U<=G5xtג[oNq\3&]^S˒'[}-mF~8Pþ._a-3.o_;JDNJŷGN|㣂P5r2 4@CY$MRQ D(hh(0C0I -H18Ejo?k}Mhx'rs.̺i-vcxK{6ܚ-%q\+Vprs:a(V&'F m5KY;7ɇz35rҏz_M'B]RVȧ\MS-{m҄ @@)A9M=%&@ І↣"Q@HZ"I>+iWe«lĭ7=Nܣ%E?@k fqg [‹pInxƛw A?A['x9OevO5} m\Tv]Яy  m 2hzyDLL@hQ@D4ĢQ@4'\,zc>dtqm54mAӥG`|{gzeQ[)_;:s@ƿG:rΏ*-P>'l|dK@0@M14 4.#L &%$!`z3rE'mf< lÙV1+&#(֬ɺA޹ظ /9&E_?"C>h4+ɤWmf/esu(.p4ZOMykeTe:r7֎Al<52,N|e_=pU$EQdI ` 4J.#+#p=НxqNet,םvZ`tn/=;p>x\d?j}tFQ35E-f'bUS+',Kɨ4xͮg*!29LJ\>mt fqV-|qXD%×&oAZ""[ n,b@ `0ç㠧.c.N-h]]s׉+9^^Q'ǒ[rQQmye7Cv[o/_?;"Naaz "%b`4pN&3:{5m\;cYFR',I|o#stCm*:aȯe9T2N8N)SGdߋ@o⧻6f\Z*EqEӗ//`M@ Hbhd&B(&'Ȧ(Ѐ M -BHS@fgJn+UULmn>8Ǧ/:G,|T3rx~iҫ6,{3z<+ƎFegM/v6\ScU:/:.9Jx̼Y7<\Ci}>{aTzJ(pՋͳY*EZ8rݚ{@]&R5; -̝k9w]9BoͦF7%.&sZ, 8Ѹ&1n%H `ǧޢ>W<:,6ەiʎ#[t o\%[EX XrΦr}=:* ̏·:-.,7

~XjŁ&zR.@$@414i! ^{<o^[^wg0n#O]>}saY -Vmj7]B:>NZNEsX1+νFlgTkhcu^gD2QIq DD@ -`PbDLn!!L/_?I'21PI*Mb`1'N>r<èjQp -7[~Wu=؏=\M߾4{0;{;Ѹ0c]{Ѿ߷>)НS}#7Cd=[MѬ끅U.M.:&p&A4MՉzN_x9=H)q?/AyN"P@'1! HdXN@>ZOsh,&ٔ2Ut p xMz#nZ𵅀6.6oS&|͈H-$@m$1:9yHM BH9Bd|}K^oΈY"$@eMEN$BQA'&|eAxeAH }.VԯػbBZNe)_h7nU(mZ975J6 Qf rbٞ)oFuɐ=̘DlRHijdF+c& &,D~r0uO/O\%ODSKZw;n<#j=׸U_n|<>t#^WY8N/wܹ#T &ϜLPx EWW$56[,-pSt9:f\:p}WJiKUlwKUdzzRyi}}kԩn̞g躵 RxfY嚙m"kFQY0 80jLC5.v10LxsnN\vtJ&f 8jOO/;I_ښO *^듢FyH -o14өC2}xxGRIrd<|aYZNs_1~-'ЭQV*p(,SVv}~Ssk-.,ZnT= J6ڥC9Ұ^4s:.XC9eiXtZY8ط~C`o2)X\y(biˮM_*[#3}Gu?uCsj@Z: XXuyTV6UX۾wEkr]ٴ| -Zmrzb奙/ehWKkgJR[rx`:P/=8۝-tjϾn !ʕ)k'[zOVV͠} U)8N:[G9-NJjWW2[BX§e -%(*mi0Y`jp`W!Da ,!AUzܿpY ^KCw - |]jvyl½ -(4{E ^0;^dz] mźuTtΰ\^ߤsb&eE4\.t4|G\ uɪݿ4<\]WGulϪZNi dն)9\_ dÂ]0r,ۂϻQj]G6IA?l[v@ޝX(֒J,܁h97Fr -AטU'hjpqYc:ci!TVlFwÏuLЭX}*9SU-a_G)5x>Q{muUp:oĵgvӱNY _mF:=w\@C>ʕ[%hVNc9Ee~')=?ӋKW/4]jzJ߹՘]tjNms4[.Z+xeƓrչ'W3tq -_iw3罂 -7uOz-Nc_]~a -mݢ,>=}v_?rxO6Sը` b`""rM_3;]N"twnIȶ==ts_^3S8GNbϪ<ǬwÛt kCG4wTTLs%G7]G:]D0Ci]λqj8w.'p'k6\;x˒#g{=i;&w>GAB:[f:T9WZ^[n:˛RRG2 hHhAML6`~|WJBн6~|v #Kϡ_C™[:ʵr$,\W}l6O˧ZTwBu5j^|=!X}~xŤYD *x|E_Yոe݅5=3fVR3rc}r>+fϧ|$6q:Pq`&EJpa(d104! `beSUmto*wmΟE|@{7dyGYQ:vJ>t7OWspzhqN._yO>~*9S;&H3+@9 8'"} 9/~9vywe?_"۝Y6Ω@<z_d<\ssɜBѦz2"4H0` DChuU;xD/Aĺi`08j^މ䞻tA{Аqdb$&EC,dBQ@n 4Im  & D`$$2 b J3QZh&P҆DcpOm,\`])#^YP+'ՄDfysߴ?7E}K#H Q !dBH6'"b0J,D&DD%A$88&&11qcDXک[ܹ"4tͭsNQt=$I ` b YY!!ɨȒIm04CbP $1DXZLpdE!!$%qlMԬLbNJ!)L&8 8qc@9EJ7 ' (Ќ2+` b ŃIHPA2*&! Ɔqh bJbj 0DD`!D dĩXED"$Hh`&K̓٥ߎQ/g3:#W:Ne'Qb\ -,C6F%( "!'` n D!HP0  $Iq E@Ѐ@8ȑ ' H2 ^=Q2 /@q"U21DI"1cƗ25[q9EY",b+0PHH" X D4$15!!DZ`$6LY$#QBD@q "H BqdG($X " @Y"&yd$DA"1Dd'` hJ=1ŒFHd&0",dQ"-dBH !šMH$d7D,n, D $D=X ĩ$J! 7M$`$DpcI HA$$M -L M)""ա8 @X Hr2(@a DL -,RDDdX#*48Hh' "Dd74!<X4 dІ!yB@#qk5n($8h z(dAb8MJ8"!$R6MZLM Lm"N%ĢPdbL@$D$2!!0 />)>9qYI' RM"+"щH$H7dBI7%iBBC$OH$&E i!$ BBq JPgMUfvqi]bCWqtNQ%ga8jD1"$ Œn2CB E@ @ b!H@48$@8bDZN,`$Iŀ!"   Ay^oyoQ (}[BsZ|REZ(a1 -@@!I`1"I D Z$m(Ba2C $10q h (h}u~)ZRHP:fXш |+GoU+TLH@` Q$ mD<" XȰ@M($ ` B8 HX,I b8rN N $ @ȱT$I+Hq9t8 --\o!S@9DVGk-ݔCh$ q@HI F 81Q$ IC" BDbi2BBN i0@ 2DA` C D DBqA",i@Dȇ:hUii#3p:yCIcP57w`!q@ $X"b474$Hn!'dY(dX "I!N("! @$9D($q`UiW3 -.V5~Y"bpz#ɠb hC@F&4!!cH$1$F b X  #Bh@ȱ$12N!$T$B$IȺdd 1dB:ݖ1wU!V׌nbao,Z}gmm7͉֖vFIze+ -l:b5lBZ4fN}*diw5#N8.Z#Y.U-ɼ+ڋy ^m l,:R(HȢfjٿ -exP7 {r)mv'EXK` CBP;zӠcpc#!VEHI ib C14"dZ4DlJЉ$BB Id$ "BH0uR0P3TmdXB #Rnmu];ǟt>HPz.6@DBB`D]{.l&gR|r *VwI8R.XΩ%gW.Ѣn -!@@ BhE0C2,DDIū Lh h@=W0阜 <܋@Y"-jyJe1Y<lvyzxzޗaZC)՞s1` ! ` h@@BBi44EbP:<8I` -6)F$3gdڬ }S1m1Q{hb4& 4 IiD0@D6`@h{XVmb7{.qd -b`"xmd^{ЕǞ }H01V(fZyoJ6p -Ĝ={(ؠP & - B b hԨN10&1Y(.^]N%"Uٱ6;gE(>*!)ϗ@*3{LN';ٽN|rsj뇡Tm}!*@ &&h b%`@cq`@ m缵Em1 )KŌMi `'3!! 0<&z)AY:~y&'J/=Op1!@k2hS[U  Y5hK -K_W6p3!9GP=Rn>dc~a&J,`@ Lg=6%225|J -yD7U,Jm,\jw V6@x9Qdu fjW(QR"zeݒ C@ E$6"! 0@ 40-(CMҰC @ R@ h8qpC@ @J,b `@X0 "V|LF h4E5@` "#$II +5,T@@H@7$,F$ H"H"S"Ir-$$ I$`%1uqhƌC$0IC3dkM3!<Qb59&l}+lf2 mQU{a=*LyWZߧogٙgwf>7KQXa9crh%9c=2m|ߞW7"f<<ʎܪ턒G'y{{HY<vT;<,]0<5{~ҵ9Կj63q%Qqo9FW_]~19OFA~Ydy瞯q׬?1|t iסpx{_;w'?S|Aͯ[.SԹLWt^^moE.|ZI]S>inYE[饚Xߝ'/>Q^yNGhN?XݸWw+Fql6$Q2DdHb$k,ex{eO({ņO}sjF&v>On=3|_5^{s~ϣwйCc|u/UVI=7{^{r+j_K̕o/O5|xev@g%}QG2އfo)<ߥ3URԢy^kD^R|}K00ks.]V2,ۭ.ںwV|s'$o׭o+ssNIHC@0``Ĥ6E[&Upd@PhYxϖs\F\9oS+xoШzloz ^~C&jm9wFn[w:}=T%+}jQOS:9grNzo44u mJ.ЎtYlۄssΥZVtشl[|U:>')Y%rK.*mκ,o2-II  JA؆rD[*e2)$ 1zAxrg~k8<MVι:~BOκ1`D""@W&JIU -D2`0gzw+O2ot |7cGM=ˣ/~=;znlΎaX@T锬z/~Œÿm=3/>QNi}t3.vgYTo5esT:M֗W.ϱ|霛zbWz?6F6Q>cw5WM9nuW\}qx{>bt~qы5M0CId c!*ˆi/!/sSʮG9i:G#|zB:/FtMy*N ͺ|_~2Cp̲\ۢsvʵubC&П;Xylntg)ֿ&}`s -G+\ uG/?L:Q;>EZxmtJ %s?ϾQet{E~\ sno>G!'͖#s -`& @ B`6m<h"Hg*_Lr$U^g;J;k|@Wzs;eG ^eʥs#MUr/ԛd*%cQ @V5yhDxk02Yf9R1|d}0 yd2818手0ɐa, V XDbb4=1pqcDdĉD @ h- iaPȀ4!$` 6 @I18BhƆ`40hL`^$D$F@ PR\F" H@ĕ1 H`BD$ @!$D@Z``H 1+ 0M0@A4`i1 `1D -!@B4"I "`hafPr RttrY:aR.+GK2RO>uurܹ̼2!`0P0BPh`łm<2I @ȱ+I! M4 bG9i!Z^Dz~P^( -Ym<Ļ-Y_\;UhZ8gF_c?XcvǑWp=Έ&MLLbcI łh$ih`#@`hq110 Hq@ +47Vzu/aEIY^yїOPU?,}w3i &VY˽9g8ɾ[cfϵGȣ{ݽ 1@Ƒ T4h0 - L`q - АhBI&  IGOĘy,>DH)d\ G$d&B Cpi!1` h4&0`!mqȄi  -PN!q`J$EI -QbJ"VFCdh4 h`@ &1 -$ ci0@ 0h !HC@ LdZu!J1VEB4q!HJ4"@EV& 84!bb@ȍ & XNd4i#IiC@Nt5d@B15Chb@&lD" @od'e(15f i˩yD}\NsWIϺX7/[ͶKv9v.z= Lhh1IȲB4N֙LkYGwZ~ҹ]01L\Fa~ܢnl"G Լs~A6WU`c{Utz}MٵO} Y;9g+kҍ=|ܟڈyԎ)&=m_F[BŲkۖaju9`n#kй?X*yӭD<|%V3Y+ch`M!F 1HR;X 5;;2|6柡HL,uCϺpn4iܙ?.S/ܣP4תEfG}3^jX6LoR#+#+/tes~@,M>aѹM0Q'™e*_n%,ϷZy)FKS{%RqD)= 5a{nέObРokY붋@iL(I%VR\-1ۑmB7lYݣ\ls([S W7vh<,4XFkن00\xgI;1^B<<̈́O#!aaYIqdKK]/C`H[W?:nSZƵT#fYi 4՚CjS-N@CA4Ոh!I:`V5y/ei#g=m:lZ軞EW -lyյihM]MMv_Y/ mRv~E*)ro:PV?K-Cr ?D}v>QW?ǵmE[۔wnhV -t=3󎉳9V=6r]&fa -f}#d=X&` ` hLbdMyfkeH `ˢrm~r%~"[36:z較3?X$tB_^q`գ&˓u6B-+i1t;-~nf^} -e.vI836Ek1CԊţaSѶIλv9t}`ڍa9ppD^Epvf/qҩtەb` 00D N2*λTOV -~B+[:;eXU=Վfs2]ݕ{D&iڢh`G6B) i#FxF#,0XYƹ|#;:gL68zzz}%(W8&L hҰ@BqhЁL# n3h$HLl s]9c,biyXW*t~j׭x)>Byqᨶ֦BMɁZ.u{)̦2=cI{:ן:ǕP~Ǚ]';PhS -ř0bA MI@`  VcAz31 MwRzҶ%th4eKSbNޒZoMn]E?"ˮ% يR=yO%ij*l,55`j4k:?57=^%(7$Lb4/kFR/sƻf i EiX"hTILDM 1P F%/4{#1"gdx,=A8F{*e*{cm-t ɀ!FDyz7Bl1ǎHy ) ƈhjI` 0!$#1LA%QF& I`4 K̡lzbwjnjޫjK/":KyM:)VQx+W\9F8B5׺ZtnHZFtcdKiQѓ?ÂZ55|ɑ鳗Q261  & -I%` ` SjHh6Z9y@n(bj4ƀIiy|fadoϲsND o yܹ,_*l6u.uǪ^'q3 1[ Q/sW{[ce*;U6e[WyTnA b!̋@@ `6!(E$N$vڭ<B` -J Q4s*ҲU Jajwi]FRtLs$< 2c~fỳ@lcg!) LM(ҏ^n Ѡz^r$HMhF&HB10pCRȭ5Ȱ$.Yk,64&-;󮒹z.]/ `ȾcӬz4@dQ"," @& `4q J-X JĆ 8I'(H`B0CCLbs[.|_+)`2u~EBxL+-D݅8]/Z a$PidDթld ~gF:6hsƕglkXҳϺ6Rkbj2  Gs^І 0@ bB@22 b) bС$)ō)+0@i#$sΉHYr0zPv/ y%u;U՛.zPp1>^i7;j.MtߜqjYŷsߓuj K]{Umdg&_># hh&1@11MHSL1К@E"@0$"7Lc4@^bRFU# g@4PnVlC -jҬ=|[_(7ur9oH2Ejv4hb,qJ 4!C@@B)BC7$9E+$&L`g(mI04T j)!W,TMzY4gTYgj<#*KA4 j+5)nfے4K -QhHL @`$DG(ɐRq $ "11JIDI(zd HRrDHUKĂU !)WZ]j s =,lhm:/;ZQb5h-ƶ5uf9?^<=2wQS3J2"b h` 0  H@!7IƾXc fkMLʷ2Qi7 ո~G B.!ED҉CB@3#9exmk7Aѡ(δ1F2@Hբj7E 4!$D%hh10 6( n2rO>G`,$JQh @И1h( D$Ќ*P -@R@&(ILHBqdC@8 D h 4 @!,8M}lε ->zԮ$J tk-vb dP+Y)&# 8h`@B0r Io9 -`@& &B!@uhR go9B}A6Z]^÷)}2s&eG*PrДAY8łm  X  4cH"E$_9CTAF@Dcb&@8141g%UwJo~Q49~*٧LT[{nVdq¹ׁI &@ r @j4clV4h   &7L`Y?31P b@҆@$D*n hʽAڳM`q\ocl>ũK֎Mg*ۚShfffōhj0%($ML4!c!W@1r:\4CI -b` mλCcU}k-Ю o}]$YCkyY\q m"~՞ZR9zyJJRRǶNq8#(8[./ƯC`ۚ.9zJ9A -a0BCHaJ4 @ I$ Vq$4 1Ũqj75tMMOz+> W1wUsƓys}fuLOm}t}УCFXqGeC -ek?5Qc5n o L%rʊgmܕ_,K>;tZmֱh H@A+@(88b J $NS(H!0h"ADT\iV=Z΂>blY?hȁ?1D6IzqaxRk7RjciC_))U2lP=%LDhbbHhHHbJ IN$D&!8Oc㽆8H 1& P*X][tcjѴҳ^v|/.!Han#qWlOjO:TFA]aoѧچWhub)sGWn1Y.3J78laBJZ=p5LMFI->N C h5HĄ≤ IhȄ&A/$%i1F3́z%H n,I& Jv+uξJgIBseh,aM,6fK -Eaeį.WߛnaӸAתgZtxujf^LLU˷1<3uxt>/g$I[hWiݙwh8LE!"ᨳPu(lR& cp`'H&2,X ƧpQztե3HJ:_5\:ʣsAۣR׸Yƺө:E+rd^ul(gy-QGsO-uFIm:O66jKeG35Y%sT:i.]hEkztOr$A@"E"d1e>`C_)I!1±gkUnѪYIgFDI [4y1r[c{T\LSA(9cmgd&FRbM$Df"G!ِf XfkP@ DQ'6N"L|/OV4 -@XȱƄ2!@&A"H&D&AĥPHA! EzJD7OD @"$@Ij$$I J$I%dBDBIqc"ISD *iƇ %KSǑBD!"$H=6L$E"q6DBI"IHR&ERpi2,ߛ&#ЄƔ@qȑ)=BHCQD($ 1 !'A! n dbz8J$ELH@"}AelGY=6LHHIg{?MdQD$D&I85I"ɑN,pd%1} Vg+ Drw,WMB52&ydȄCQ =T -M@ dddQ@>fT6\wMG˰>;l>];!Ã!t=DB?QO}N|@ςWH} |쏢Ϝ}|}(p>7%󃯤'wYvILyώ-U5ӴQ9dl6_G./uN&]w:y_5/\\Ot^iNM]LЎ;ˍyh#s8N5wp7vٗ gt8<˄A. SqGЇG[Sc<!5 014@"$%26AP#3`&QDaEFpBCqҾsʿS//~E=NSn\^-<܏9L뮽"v@۵h7r7yG:3E>EwUO`G7G\C9%_{Y.jƥS۽-/K@[L_ce ~Jo2tmMϗ;2dL#Šx(!*&5OJ 䦪ϒĩnp/e_yO/u_!I* OxAazJ1@#Dg=s)%crQ2GmU2vdItq9Y),9]i^b$k㜿\أ%rX2>:QJ8\t' ;tcZ)z퉎r5!Z\kEOTD`' +wkW/z姕\=_cTA5|_d%X{Q1oXJ%WZ/"fSO^-B涄cG`ܙl Y Nܸ{Y)1-މ%XjY* -c||UI5)˖uR:/T`PWnDˎA;ZPe=k3+܁b7|ϵ@UlJvi0,)͆Ly$&O- ?鑓}E9x]FXF89=t@b=/VG!,ZGAr[e# ŧM6G dث%a;ǘV4c;I_z|[Id$JV)ށ b/i"x q9Ǔ|5L\0M1Mzhdz;z1.0hPX؍kqk|"yj䫾+QqኈM::8f -ƐocưH$\!$Rr"^cynM,Ehfbĸioe~CHYp ZӬtґ1alkE-JtwҬCNVLzPJTW6[zTE*d,{NoJdE9N̾2p+_iӏcڍ;rczv7z#\F D>ʢ6iڷ*hկr>SOohѸW1sC|gugBrs+<2&hd15B f_Uiu 2a5]VuFA*ؽiY\ೖ\vS52ylr/?#eu=d*^jAO`e7^Q#Yd3rvbk)Ζ7#eͅptLjҲʤUV).r}+!M}_#a.qUzLvq,$L23UzxZsAe U4X+]V-FQVdhHl4ȫٗȫaUsAͮ?n#6P+NIdPYόPCs"Y9@3'g$v|ɢkUlbP:-g 9Ֆr*ST@5S"ȄueR2ȫxյbF|x\r"9(%/ -5rτl)j-oI-#:Mq17$"wIYY -2EJn^ϒJIX| o{-c^pI=Sѧ&tJf < dFV]ٲbWUSeAo\ЍLьdaf$@6b1cX7YǕqS9[不D{9[Ώ,O"y;*"츉DW9Sj/*ק+=eFXV1D_d`r^U!Y%@VY7Tр<ꓚ HyhYk%X;y#)ICoEO4N0΍t#lO`F&7ڎOo5!w*_ -˯Oib~ $VV!r"%;$JK#{ڵ˷눩cN*ZU4~*2 FvvxH缐Q5tTf^J+X(Q'kK /qwԨ\~0x~ˑ}6# ߅IН(cxOPzLyܦӤQ|h(q_U&jL&YTtf}`TsL7[zdD[V4s)M Ȋ=/f]רTf7(dN9݀3a#}%#`E9{/p_].2v m0$tX5ѻroY(bv:ʐQ[iXd'pEZ[I%xLļxd;?͵.Z>5, >F.&TMXQV8f5k׵ˇ킐#ny?Ǧj]\- :_A|XKp%Z#AlRBYn{e K c/o(D'vmIc:IÒ9 -6n&4-$@ ؁Ej#dtq rdF  D4њ2RL~6+lvt2; t$H?i=}nMtS?> wઉ*s]y̙o|߂{#_) 2M` mOVYQ:gpYLOAH5;J8y~J" lRK5`xZr7XgY-B8x8ꪙ13g)\!B$>܌fG{4Wd+cRw ܇!ϟ4\/' !9'tbiD,/9$Č#Pk ̳4"#f!tyL!N2{X6j)̚6$2|=U3|ru0F"ʒs|p../획 &MrUg)~r7S|6.'}C!F uem&>QNNa+cuxs4=VArwtƤM/$fQ [.έwȗ;ߎRQ*×hkQj k<ԉ1e <%AvvV|v8WVd"ͮ",]F_(B2t g`XR5y ->|81W.rNELZL34=- 79IlZ+k#55U[=A2jFE3?lsͬ.oZ<6,@֒"'Lwu|edP) -8˖VUYt6q65u!vMN'|G1\4(vB3R|2U!ň|cO&jOLvVzQX΍-,\g HIHYu*{zǤF1N u -|~S][a)a0}liJR7wڱLdUV9GnD12>W79d?*VQ6]y5,~Wiʭ:.I2T@A!+G-bb{9. -7,93\]ssdjۍ_Tf*%8RtR×j5U JN#嚣ٖa`tZ! wfxn f_Z'Kq2u8LqO `D\|4tY͖00-b"]PEbkrΈaVT;uNY~o{|S>9".؊+QqG&#ӟTƙ]҆njg7Un5{Q|QS9|Oup{UU^GFH@ )9Uی?ƀ {'<9~;Vk≳ʆd).%?T8Iw"0{@ ͍.LY`0[b$GSMh܌Y.%exJ`GXњ%<_%:[cxJz7RFGIc?*K|kv_*/?,5BzYH2 ά FJDWNE>Кز;~~[u7Vt=665wLOٻ:nk͔(=kdӫ%TZafz>IņWeڅ W9 cdG\J4۾ o0ܠ+~1WԪRИnƱȭr|1S$词+D+#4SK守Wc;ŒFOV!NБ&, ΍\HF0Ո+aƢˆ4y Y;rB~(_ƣZHA1 ⧱o6OY>*|U78oﹱ89șΜ";߃&#q8*.wOisok|ߎr"7UX63orA`$(ODDeUj㼚QC5L1c8F|?I*tlALlA5~ cl1{˟΃,n8mrD IΘh6#&c&m#9\H#y\֣ZL3u\a{qGc柷",/.X^֢StwOE_e@5zoYgU#XgQ$L_O.)Xf~Ɍ+\c]j:E9liZ'.!嬎⼋r@h<5IHq֠tVnw9UOR+cJ{b8sI(r: Ȓ@]́cftd!,o!:#?f(dOBdOM_N&t1`ʗsN\۩}AA/-TWG7b:_LX=Ydwu$GQ;M"ԟ'L~V 侵3ew5~\zYr޹2G7bT}v̓3 -Oӫ\Jb Y%')7Cr-Hc7vR"71Z^ݢj X/KI?-0^p[V| V9\JQ̖x<,|5||c5+ӂ AXGcT!جgɬwiAx}wc2,uy`^6#Ƨ_mR?~\<qq7[߆aL& ~GG+UkG͍7&c"Gk؆kw+ybcsՈY#2 zN!VµĮTeIۛT]Ic?0| !{Z#sѭr1˲bI6إj*&=qio3BVXQdLC K dRZ2aõR|I,"XQ-왓$S7SY +Vّ?uW0֝ʬ\wR$ICeLaNu{vF$5-CBGL `EcG\2D^xUH{nʠ!m󵹨ܣl!HFfSK+(dSʥ%ەr/1Cz'g*,<׎dj)_n?򠼥n ұ;`E } Ƿ.O~LHJRb}k2/r67&yB.R2e䍟c]ԫrOMg3$hK+aELt$I`˕#-z5+qՒ#2fSmg /^U2$Wmd -`R -H\o,6=~F\ózF^[J'T1F&s:*B:sͨ[W#V\Mֳ"}ebs=95eXD[bCb_ȕr-lEbl˖_jʻ7< d$B=la\ohe ||)A[a屮^?## j,dž5YS%tB}:~Svy縄ů}9cX[ 咅%h\pT49łL^C ke|G/wE۴HjPّ"b1XEш&e7ɑcbZgցd F@&d,$ˈ!VXMHbL';ٱL5 -T74oL0 Nj^; ]WՌp=8r8p ,X-%m>|SnӎoBHYa7? myMՁB%-e^quuwb.E"HY!f-#cayUqW%1 p :蒣uo9:Sy\~nui㼘ӿ(l9$suiM!ޚL -\Hf4/wMZueto=pS9+Ŋؤlc\Hv.j֌C#Ka /?*: -BR`eۄZ^TeaUz ޺ɜŒ[=4ȼJt<50ѕ?|%zw}WE^A-эpG!.6rCk W!FKg<( DlpdO s.k7lv%;csFIuCߎ˛pU^.6oW7̘؎͉W7ߏ7\ߏ7lE๿89v#qGp{n苋\SyHn"SisUVVܪ/=թr=SWmwΫQx9Ͷ Lk~N -ƻ=&!~=W`\x^o-~ \؋GmT٬2{˟M6L!qy~JBdoNl29Ho'NNVt%}4b0~޺7Mq'w6k G}.=l7'5BiPxDUj67~T2+7ͅbn> @6roG1MֻN;'q8'VO#QSe?n -$UWDۢN%~j;oV&Muco.B o~;'3l߂͛؜؋vٿ.sby\jYψUs2gQ؋r.#q51EĐǙ7cQ,hNLiyav1wj/Hd{$~E2;\)BHDW -FVX;IH|djc;ֆ;B$GV 0 \ݶ(V# 8vr< VL//7.60 `yX HeV+l61n5ܻ'76r7Ȋx&lG1?d)?S|Ok~*7.o]\LN -W98ow"U9W6#ઉɿRsx9v*:osyQ6]ӂ7ƽx9v+q8+1G|1˲oV'|\R";lcjndMDakx.OwڪTTL7Ycv5?q#kMs& ~tNCATjoLcvQMl?<~%Rc~9rw*oULO.˶ ]rw?n7!Uw±^E\n&+7 -v ]'|{ S~J^ -ϊbD*=ˀcE‹Sr;j[L9G9+svVpxyGoG&&56j'v#tDZ}qƷ\鳎ɛ" M<͑>gHhg9~;oo͛Iخvss&#s9ezb/9 -b㞉Gu[MϊDLG""s,iV;;#+yU7#&/ %*rn#HV+ލJ!.]pȏ? 5TI#pzMoMIH|CNLCBr{*@F{\:L+́,I%J%rA>@QdWs\dt,NLحaI$}a1d2XqgN7+[jFh`K|RV#0Ìg)1H4!gI~ B=f!11\T:B#!Hڷ"۫zV({\zޡϳzKc.\i*~# JnXTȮWIU2kKi㻵,w8Oʟ*ĔǢrP$d5.,QLrZ'F+0a(ܻ18VSݐ=RlVG1zbܸ~r`X*C~VWL*эjwQ=TE2!k=:/PΚȚҺLs(X Vu,k[QGn\i29aZHl#'oVI 6s.y8e"c뗬xnClBX8*1+]҄CLhj$hƅXJ*޷/:h[' Oe^@Zd@8wXdW#5j{yp%b#Fj}̻&xNOūsP'#]i*~+!nٛXdwÐȏluʱU=%GHfn#gEܱ%ddIB_6o-!r 6㕥nP#_VU; ృ׹[TdjpteNntkEYliF{?IH2UG;q 3gbHaGX"s,'9xK є(Nl Ee[XQ.)tT&L@(Ǟ&nK 4(^<`Z`W5cHG3p9PaDrWj5܎ֺ(\E~28؛ ѳn$q⅛ slb9M_/frlTMec|7|U刻6sbqߎos}|U苜͉W7t/s{*ssb;99Ɉm?+9E૎+Zlr/44̉;IfU"#wƝǑJCiG3-rhf+I ypZvG+Lf2<ǖЁcGl3:Hl52uȅ^m)p5T " jmוqN11M\t㗪P{V" (N?߃if;"eFc8I,qN@ ȏYFxHaB&L##}ɓp2 DFcI%GgQ@dkc#ri iI|Ht#W,ܤ'QQ\)Cxð|vccXv;RYb#NY  j5׫8Eh0qz#:BHUcH:tf;/vrW4mn7v`ҿrqRr^\8%4;'/DՆq D[nX2-<.D;"յRds5e4,ІBeX({҈%\~1 -qcI@28p̲֜:Ȑ v| БR@!#H%H3g3fIHj{ɍ$G4U!.ɽoW/vTF׹^ -W}Y֑ɒ@F~@{Mʖ$Ȳ|xr>[c !nC|07#Nh B4y+#E1JGb`/fdFabg 4/?c/Β8%C7oŊc4M,/tȻS,8F r>?or*aK;遂)J V#QeާSǿXbl+ƍo*vgd1ycd%@9!*1"!dDN2,0ZT_4TSd跤 Iv\F"(^8Ψƨ1۷ᣰ(}nʄɷ3D֮(nDjl15SlA1Qj"+Z>77tῳ7~;7||9*/]˷ū.!qDz.9蘏:Yn8ȋ~T]ڬG"["=7COT+y7@Ll5.[rGf7pf Qd}Ucw2p%M-nნtt-'QȓuĞ5 -dG#pduE'y-|>9"V҅0XL{h,C8B/\/-a@?xG΋i\q1!(3Y"l4r,6iF#yVQ+h X/,I WVV$E vJmEG³Xz5*-Sb|wƨw.D%KI 0<.>bT5G8nA+#[~Vr*_F'"@8"9G$\sjnXad s-P˅_BՂ\?#')jƍP"ف >y8I]V8+o9.ei/=4<+1kW~K#Q5Ղ3w | ܨ5z ש&megr,;6RǛha9)yfx(p·2&NTeG:Ԉ:)-crDÁZsQχ"#QF8+ֶdgW*ƘX!RC1|ULM#&ΉY -s&]镍V@/7$ k *+|y h!4(Tou{Ƅ("pxT -ƀ\3Gk͝Z3L>`:<'At"+3bL2y{^l-#V(\+QB1#R8R[KDcZ1/S6r؏cj#g.nmmp<o"\|^ I"xk؀I\FAUBV-#M%T44Ym(Q<4{piخlh!KGc[xvr -h"X )Q,^>h.dKyz$z$dU 9mHC1gy]66-sK" 9z-N8i6h= dwR*,z;繳"Nf3Clf -A(KFrHimѝGLf9< g+]+GxWZع1$r:j# M/+v@s\~X,wG y-^u}W6m0 R7HQ˩)^|"!c9O?Y}]"*7/]^\/[ "'/Za~}R1O<֋(ME35W1Q+; -ځ&7?ɏRu!dsk&ò@Eʿ9x4V_r:uS)jgu`ʡ#dX#6{T˧܉ ˊ%tWwv>q2I&MF-rB\UQyp˰1jQ7!nYV5 QlW<'L6@b*~T|4uo̐F+L|ς΁W 8]**)[LooF\C|0b&i%nIOweVp**qOeQ,R7#op鵹27be yI5-Wq`7)$F5im]5J"C$9e@ +^@VSKϑTÍ|9mL6)XvKGAX QQ*1*UC_%P5l^wbQs,̔tHFѪH4crY%h$;d-<-m;ɼk`9b˳*hQ"MfEDN;^C6e|za2BU㍲|e֮O64߯k[L2F2!̬,fQpLG H]r5У&PtO2IҠ9 5r x~("H2W^`\A9P{W35iނ:w:axX5 ؕ)v븸 -*/(PiXsc[¼OSg#<:?cQF0F120Zm$ l4],ƒb1bpXWk> -,A8hHMBGcmG9q# 7ۑE ۙk~uk0[D<Ƒb4LjܻZM=׫U^"l獯v΀W7b1g_qjŖ0aׁߎ9]FV0^>g5j0X½ІX Sh(6aeG6M@{lB7s3|LWɈ*9&5鈨:DrgU_cY!Z+rb6!9ȟz/_4^+[a4xXfS`8T1^*,#e)&C! d[e(lKo=! NK9fp%?} P{-)`ck9C@G(ʮ\eg$$Cl^q -BȰta׾H!DYL{{2C'D(FD;d\d܁HQ#W/m ShbcM=a{D_:Jk;0Icm9| N3af/uYˆ!$Y+a~ê-zuo.MAxRTH`a$zXl(f<-T\ʢ7ùH.AS-Iӳ\;Hِϲ*D2* zVɫ&\uK{ ZDUL+F+]bDF0GJd. 9v&I!Atcx8+D\r6,yr&_͑QR߳\r p)E)~2Y1]ӪG$/|"A?wP}Ɓ!Ezp7F7 "8Jv.Wj^q"FqBqUnboY;/5xFƱ#"keWBd砘JG=(Qڭvv(۴\c]adcZ߆K:N{\E91pg ŐU5ldTB5V@i$#Ш;#n0ϹY䶢U'-.[!G6![jr2=W5"cAܫ|%UmYS" TWM~4JD_o-_:DOC'"%>?5$S1;4%cc= "CU`*")ھD.$jA"YV(@ar+hnmx%$"LEGWrV0ђ$w -l,WJs"|7sg6sg6sg6sg6sg6CNi [qGk\x A Eӓ9y:b${cbZF)BVG.WօVIPbNzur-LniU6mМzxܳ%tэW %uÿKuJxVwˑ Z&Э%zæ@z-+~,OŬqvb6BNJr& 6HE[p'rO߬YQF-\]#~AXqPƪz_r]|J]F <-2UYO@=2*sBSA;r7re7Dr-HѓzK/<1" >{[qO ڙccNgs+5Cb0#bJoR(,˘<'rɯ2)S.Szԭc2b1@WEzLrp]aY,Z"aBܶ2ZJ4Dv\& FcΏFիF+ddZqdp"(IQ՝`\ZmtPhZM܉ K U>YiM =̄szDZݽ?rL'U#O9Pmt~)i1\V4F[ܲ]qWrʫZNG1LIĎxdMɅ!0)2 `Wp^8unK2;`=UFAapݢ;*>nDž:p#C=F[0LcU1# > ->fDscc X <܅J7 o#t@9ʪ5ˉ-~(LN?.zblQ0{bGaH%v!Vrcb5xa?/8@nX #cɍݦ ."VHE7v +sov2@ |xt,( QBY -$mqЈk $ϕ -$$I.X F b]䘋ݲC!'z%ez -9_edXk?\eUCll8 4'n."sK"F+ADQ6#㌎&Lck rj|=f͛obp7s&sb.owlE|q7~;o~_Eg8lU̎}v=C84ǧWrNkP24i])SBl ^Gya&(:;h.Z#Y gOBKd}Kė1+ݴ "?MĐV[5]Y2Z6l\=1x "=sK@>3W9Fd PSYhC9.{0RbSKhˑN9 l|4J\<<,ьJ8,-qZBtEs,Ow*̋,R7I=d16e| l0ՂcuOX`{;!0>Z#fz1F5P;1yLDvmc?m2qU*\ K||WXd@s=9gY+~,EpPS&i,+$ W2#% -fNӎEfX^gEf[7 RJv}o#3[rl[[5h2y@f'h~5 -{t5e2`,ȩܐ)~sL^Lt|X˨LQ z'.'x92m 9dY,35jփ -ະ]XJ+K=IfA+˱#Dl7MQ|q?+x^7s";3&f/G!՝x9r9™`FPQ@;.j9r&K'"'=zwT@_cm 39\%t!\XokH%X4{`4 - X؍VW lY ""AIs&BȔM& -<Мya6dp:ʯ'c%@Hɚ"aY2T -.︌CE2(ĥB/HR|QRolp&ǒlU_SOu$,\b{XfypTEo=s>&.ʘDe#[֪O&jb96VAs~.*5vƕNtELrfv"㈉kɈ4.!SHv53ls_lGoDo,G"lGqjcW~˜M7W&#v7v+^]LW7͛\&m|U8."{Vו&RTdpbl5{ _Ґx\9,<#8l;rIzOY4&,ME`{+k`dLq(zr*Q@6Bc!FhɓLBu`.!$ֶ$~8r)̑chFh[=-D`;ʲ la*oT4ZR(fkBmbe';5 yycr\XQ\ջ lg+Sۻew=*2${ rWXFz߂5rCr"@VȔN&O_ԅ29VQv{ n~SD2f hs!k1)* pxj"3''J:8Bj`"@(5}jxcڽ%uϜʴAͰf -KhPp/Jŋ_!p))<.n{[ -7w#mkS^a b52Sc;r@'rdG!%הDݫ-澖)B]|qc"Gj,PW|xFr;8rF -;6n.ev+XQ ?)D2`χfĿaǵj̈ M&3Wc`۳z,롰axj1/3qQY!9^&@kQ1Z-Hni )ypƭk7X - @4>UEv,5 wREb -/.j˅YMa(>h3Q x.FwQ_R$2 &cZtpTmjNZm/d7P˟szY/}0LSw62fIhԆ#w~Gk\׸LOwv"*@藍S1_ Ƞbm;DT,V|(mxf#Gz"quaLê^YEDngN3Vqs|#;+"p}.S 9|jsrGټf LmIi ?sRXΏJ\ʱ @@e&A:_Wcsk?q#+wFEtAKtqg5U+ݵ>rƍѫ -*T{H}i2$6:Лc8mt>Uf,FVHP P }~~ɉ5൶F 䬓co-C/ 1G`(L{8S ~o w%k J]Ov -b\H;eL'XNiijY -Dd&Eqd+l$5J8( -'>),iĤ+H1ƂgIaMj9auV1]C Uq0;+\%,S!BU/eNKkv^B2D`JGˆKؑ>/ Yc# :2V_- ,X -iN٬C$!`TZ}s5c$6YQEp;C˒4w>Cįc@T1k)8}7~߆~o|77^&yp'{){w{\ߊsȧ <4 V1gQ8Qb9kv)$3 -D]˶6XRj+eʨ!+UX g!Xv.^|R e mrnoz7DDVC}Fs+ƙcs'\ݹj.=.u}N]lO0oG1|VsljsD\kx*X -DU1L٫]2F fp%f#Q͏=&HxJke63"LC9E]+īXȀF>+Xy# ` c]P-CG2Zٖ5`$beL& 9&DgXBdxK87tXxE Åō\` - 'W)_[ |hZr qB11C - #D4Z.5 Ln$h/ )!_ -YSI(-ke6LI -Jqg|=08R1H$xdiCCgD*iʮNV;LZr,d9|iԷ01,S5+Tx7q\VYIs@Mjg2NEkGķ2]{BKP@'-R/JsJ+8ĀJ1tاƣ술_ kYYp@]]$u?*ӆ]gqndƁ򼑅rD[ u»zee.>'-sqmfmVCư,#[񡔌D#Fk~ivؙar2#O94.Md@,DQcI*[C˖3^t(d~J`+%|D_tIJۛh֯~Sw,w0cKӈv!KeDHaEkgdprr@VRA)S›r/@б5q&O +*2SY]3kj=yI-;kLBXf7?If7,vs+R9U%(}gƼ; ɐ\u7$BV,'o -bH`J;I@?-]ΡIoF+u\eB}Ln!G\6l T;^d8E UP0r:1JNAWA7AX|jE \K =1#tE徝Q2GsUn3;eHSȨ}֯5}XlĄ)QVdžTᏽ*K/~i? ''Vj 4;\/ȞQK{V͒JR-#Kb Ed~x'rvq:Bd"6Ҥej~|9l#؄j-vNh"7b~%gƜhVP7A+LI9YabN:"c!,vɋ0Oi%͎9\{QV F2VS,w dB -DWXGaYA=c,:=7M!,ǰ^l*øXjАaҋ\HN .HT$V+O1YZT "ʦpd=cGQ"Ϯ\mY&r;vͫ~7drCnXHȒ+Gx0M&l0S&W_b1P -C*ds”{HƐObKP6VĎ$8Rʼ!HuFCFN4u3$V1Wujfl F53Zֳ*j'G&˝6|qQg֯FwT1n5obqQq7M,A1k($sdۗLEc[c]j#Sd1qZ7(ڤkc|pr;*&lb16n.1ƣZj"tTUhؘ14|ԎĒgQsˌBm _a]6D(z0aB7#iὍF5Or33|G_<9os&#૜㝷ǨDvɈv#s397߂lLLW"b=vrb.oWlW|3̛.MWl|E͛;cWS|% __%&DAIc1V,f#$>)#6uiH<@ "K'HD&=vdd 93XC}q >orXŖb 3Ύy863IᴩyMJ dqT )0Q'D;} -FRI8Ma~[$E6Jz㲣lr?kzc߷Dze"1Vp$jN~D6x>딿7fFM~אr+Hib ;X.d]<{(r rzn9-ՐL5;Bjm.`v;{? ުRc!) QR"tf}䌾^\ȗho{…ػ]m:{aU2}UmNYlw*u+|vSՖdZʿP zPhe!rhW5%E^f/&WWeUܶmࣤG3f̐ŧ#Q g0DFUۑ5mc:lO#`&2ڳ[dEOD/0q\)R2[I֣[._|VjU;!\n+oԜqr/w G_DSu˖?R"_5S~id"EY BVǺrvZdC7`[jgc/ d3szrXXlN#$Xk?OVMY+$WJii )I(Fx1W6;J&/emxP鹰Bn20!BFҨBa1ى/Fa,4j(bF!leLV[;UQ)҂@f$H3IIr̬_=f")qi61D)!OS;G=%;[FI|͔T*0, e=XlL5*@҉lN]We #BQT{sbX%$iR'xY=fÈG[9Q 12%*ix&"$zR$+ӱ:GG䡠+#h>c?Jy^$!Áx_3]/Zݡ K$s:Pjf PCN`Xg}Qww=le_3V@;kAm|&i3OPs[Tvhzc1̎%)4!ݓh$}@~ jFpԦ!QnIXkHrФ2HPtg6b0-@/fKuN -W+U&t;ɔ]G!8 W(qŠRMmU+zOMfS($.WYɇ/9P -޹USS)Se#|-g3 F˯DZ˘bG\}GȨ)"qUHje(td8ɟ|RT/])T~ձ!:WIfl9mUO.$Tj~,AfO5¹p_HVU6286o/ $t2(eB.< ЖSFZ_K1M3e|d5Exa4  -NȿaWrcVm4dWȧ&?䑸H3cpƫU6Y?K28d z׌UPy:ӫZh#%(gnI%٧1!VVhҥerdwfV">ò>BO;h K# ʬVVr'`)1s -Oblzm7CGJj:۔GzKiT3^) -[UюԠ;]* Gd9)qݑjGqo#Ŭ l{IX#71ylKhFjtKe'/mu쇱6D[rµ!ݻ,$%"Sdd_9jX"uY@fb&9rUAUXs;O#Ƹivn["~?9pz>sy헍WVaxCڱGYʏz|DDpm_;[tp{2Cf` VR#Ͱ4v?9HyXs_Z7Pcic4fCȣs.R` ,{Qbjlʁ梷aF#9*GHq֒:hdȣVs+)& WV)!փxs؍F2[FYdxjpb'rc$Xi\#ulALHj 镣^HS/;mHNೕ'TocUHvHugCS8 ,g2bގ%}'4ȐJx+[A-`{ -C*&ȉ¾ ɘW';e$REL3 Y,O<Դ1*l&ɑ&wF@rC&cX5c\76|߆Qs|9o߂پn+7|3|7|3|77?dw0v4&^fjd _k+[)o6a'l&9㩱?S^SRHnr:D.NFl{lf,60ppV:ĶSI)6kE;ȶ@HE.:mzY,eMȩ[ -AT*B9Hd# =j =$%Z9y1'𻤋w`D[6lCD_,q۲,FxNXbZLVn{E-ƎX6BgOe~PzarDGt82uci1LUXcKuZz%dW5G59ٷKKK`P|CGfXOTv9G^XJ3Ⱥy>VG+ -HPiGpzeEY\r#O Eں1 NfGl}kӖ_>|18j|h,H{V*[V?-Ee)*^q2>94鲞91" -Jsa)r.Ubcôb(OQ)k@]QُfwK_\;BM;dZ.|#%Ab8NّH6ϷdEV~I5㏥\8YcʵHOe}j{iz˛o~;>^77Kk#` NuB(o3WrT.vO;p"WR>"]\ԻhNT=F&哜hYV?%$ eA3mNU(pB"lYS#)_ |7;՗䥎),KkU+XZ+L|.w5.V'eL\TJ2>̬ŋ˓Q1Ӆ1e&&O"]1G=*=09Cx"jF\ݸ6w3'.%&S]rl;b%]"dՍKJMMb˽0_\wmC˖/#gd.:>&.߮ 9i@/rۡ&&DOYt#ƫq$OSi5in{}BqlƗsQ5<1됼DDSmA -!>PWd?T͉jG&k~Yyj(cifea9˓hr*_7Foyu)'l&Ս4@T2+BVXL1b1$mi+ ^Ai碸ھ`ЫcVhVLUdW.MjOfTV,*ǮE/叔C:r}FT'3XyUTAnU4 -lr8&#ql]Mk+1סb ҽ3Qјr\zVjof\'&Bk-=>^T*-@p;])8&Wι,i_'z:2#ժ> 9dS8cW -2*[pIE!x@?#9xƽz75"|ymj⫲oע3t΢o#ڹM{☟]DYk -ﴁGK3d]ˀ':,c.O qy0z8h&HڸwPt%a:3܄C@R5x\MFϻi -ĕí޳ZU"prvrՈ#1rj9fCkȭhI6EV\ɔ ,^mMuk#yh -}6_뙑jFIj -l/GdIl͘x9_iOS^a&qY(O+d^Cߧo(L G1%ZV]vm rGcqr黤<3zIfWv\ӛ'2%)c[;#^<_7C)Xu(\qՄy"UUxI]]7+a"O?xe1˴b5Ǘ&jC)1Z9\^cIݗV3 30_MQ`˥,ȿ1C ʏ^c"A!U4QH2_j+JKѶYz%t:#5ʏ[ܽ+qbh:Ź\W"V*rxh57`u":XG5*#%'#3DqjS=Frpd-sdvU2_(J||@tٍ1cXܐԺÐ{y=?8G*UeL$hrDGBI2%qݩv#m="NBjuJbG㴈'E(Ef[ŀF6t9b,) $˚p W/B/-JⵯR±ţ5+7 q!/[6m"b2ututJnG%@+iL}ZX Pu'`{>F^C@MX1ꐭ뺂Bn;RAXgb9<*"Wᜍ]ֵƻ֣ZFM_. -֯>1p[ib>K:gtBU_uD̟2yb#HkdX@2%w -[@{IhB;ؙ'$9ɈNg^5M;U-^db.T@1u -3*Fk} b~,6fW/q*"B]͎k4z߲݃!zdz,2fUō[$i7s9FR"jodpg-r߰u2N1T}E2MkBډS#)zؼ/ 4> -;@Z#"B_JfZDt8yc%ˇ1);j++MDSli >Lop5ˇ/=(6~ HmKiQJYR0 f^]G% 0.:iwOvLW"4ccV%u,ƀTG)bka(Q,H $pQ"^lLda汰 A!>@Zծ&5$F"%SŅͬ`W*(+tJm&H$3Kzg _L_a"xil&ucn6|ɚvK0,ZtҶ_>;'ϯįj\ӏWV|7 -S-R匇GΐA0}T׬j4\A`sm= RWFN|l%"4jp J}9EL7ܶ2Hb#livQ&:c.v!d\0s(3=Bk$#@Qj"90-%2L8#ڎoY3EH-GȵȾE3L=H[nj7htƙ(6GwZ9Xz"b1z8i!y-{dS9`dP)M"[,=donhRGa ֮6ڦBeZ*W/*^Z?:DkU6^1ZMƯ#ymyZ{ТSL"6(ODF"#.n$8;|H!($ruR Dr98,rXֱ{Z-|C4m#+!1{M1܎ @ (֪ -_% dQ.IR7QGSaŦB@UCB|Wy\-tbDX6ߩ{{2\61{yw?R+"RLj=0\#d_(zFOe=mPyEÂ8:U%n]*zt<$̵.ObX$- Qeݘu >XGNPBKaKsQQ\pc4`&ei+W4w n)ı-\i'mєTN7<1@2Om~V=l&0WbŜ2ː)0nֱ݃9#3s C u$F$-\(bEuΣerO؄!=֬O"VvmzkNIWə`Sq+·YKg4ZN6] yhkB#ΤTd5K`X -JȆ,QHA &lx+b\HlG m;d<_I湨dOY2Ðm&s^El>{%5Mz4ѲUC+8S0*F%E!wĽaNF7s^|VͶ+1ˊdU{k"%[maLUR$߈ƚlcj%ꍲ!EB|v_~{ j)1Z73n_n0 ܷ Õ L]yG]>rW5q+E e RE$PDFo4QMTtGKyWr;osH<[W=cIg5!y2#]W5Ohխe!~k_ C,!?,&X|_Ó\Rhܠ-Z7E~UUrҋRmtF߹rҍ-孋_3YV2K:+Llܸ5#M<2lTS9k EeQҠ[qlԩL$OX7P au`bb 3adP浞?ѳS1I*m H5okY{ZĿO"dx/3w׹b#8jWjr_eCay٧=(9(b]^U0?^ysPz< {ӊJWd +)UΊM긁R$J@'ɔU}s{YU cO\T6rS*&jLNA`4F|-]ZC\ƎC1 32dC -3Pdf.27pQFxqN?jMmw*9\f4}\mQzBd:PY qݒ(Tkk3|5x'Ѣ -aѤ<1 ]w<:+.dz"ܢ] 'o%MK]QIEWK8ɫQU麑KgPZ#>R/AXޗ;\Hj&2iN 'r3h8y޹eTi' QvJi* p.UӖRŚzDK.ebƯ-e9"ʖU}T[*"&}23jUӣi 䌰_JSvD8'U+P;h] ļ( %P<J)DmcB|JLwnY^Ե5/ |u mgV\ȃ:y_S8'ۡl9礑WV6*9W'6T( -=$Mp -+bGh'}J-J0mi*WY  <\&Y%%ĄTzw0)x% -]CC/ pEy8x$eeQcUurәk! ^+\ȠcEyn>| @bh!iKX3mG\ŊHs0g,y]*Z=;5ZyMlK{ERF >TAOKQ5նnP|1S#5#F|b埝l̍Ӄ%X5/5.Ǘ.'$6MD_ilXبG"#Q֣Z7[2u[qEɓ C-yG6־,KT_0eXD ̂Bcd ̕81Z#d<~ˆ0JФ\m!ZHL$(濫$[rZ)SEۭP$%tȏbR"tXްgD?oDs;yEmr6+# -{aHkюL_s^{)o5\E (2'2u!ʎWVj6/% ,#q $Mya gY`juK†tq#(*>['V yG-:bdV0pA y<Hpsąn,mDy5!ά{X@HcLx[pH:aͪ7$Ru@$9V֝fF(th^HpeNP$Em`Ӟ6O9֜_yQ Ic`VR"> [>A 1,|W>I:hGa"<&JdH;قl8fO(V%,WX$) FoaHifA0va;_ дIoe) Pu51H k'gTp^?|;j۲7N{sw.Z:, ̅>tsƐNyjʭkPЏ:äeGKJ:|E5yx$C `1 !ʟهR -=|9BrI-c&\QC-?W|nH pX9qnX - 3۔|8CzOp`nK4$10kjӾ, ob7duXSj:F`䷅;Je|i | gd٧XSA|(/srٓjOH6KNe#¶f؊@ƻtf"@)&Xztg3m4g'ccn1dF˴sU;P@$YRx\l?ዋ*QGE_V` ֲ,q…[X-~Hw=Cݔ>5/ʃ/}$Ĭ$T7UbBc\\LcU:,yxFT|t~8r7/HIX\,mҬH9l+a[嚞+IIJ];bQR(餿 UFFՊ\5tzվX~*2I᜜.]i9JbSXv3yUD ;H3_adymvǵ账Nh2=8Ķ3yvoȟՉ&Z [uiU d _3D;vRƏb-̱Ft-_ `B٨߇L{XưmF_(D5ʽ lͩ8l}Ыi]68QY(-|W)-bnI$#t9gTj!U )FqV,AtkW|qutH%$H!@A'cƣYkV^ϟ5o 𳢅ܥFV#[8a/HChc!DQ&P|:+4G qfiQIqGbzEZ;j/<~yoopưEYMdq~:0]dkO#Η`$ѥ맦Dmk51)KuS(U"eo[5?Izi7-{o}./D_bl Z]fH\F70aQ:cu1QFW$8PngeuU&F AD3 x1iaH9:P(0Q׃g*E+H  E :0BL1!"x|ǫ@Gl|PcG&Xj)$]ň3 U3^:h*zsGD/OxKY\#\樨vtvs?/|7N; , ?pk^y_JpU~ɗ.)Fw#y:]CɌ$ĵZsP|3^YB(ΝW8@-+'7F͈;cLa\l Uf3RQjKM QZm0^{Z49r@ƇW2XȌx0qye;Y^ 'YJtԇ%AqJI\l[ }&Ck$ZLl -:7mOIA^da]o/}IK+#B'8;cH!E#7+ 1mE/H{ֹac毵?2ضetnڌqu*Ћ r@-niYtC[>,_JHTD)n#D[°#7&+^cezܬ2X_ E #m$-i&.m4^үsSO ï(u((YdБk6erymyJlVVoyVߎ3yc`"WϞlzFzej0`+s7#R] +bī3$Z5"#NW5-<ŌzVUIouL Y0Nǩv>LcpPD[x]1W(5/K69* sUMS0cӴЎ% s5+FTTku3!&!q'=ƒw %@Qx1k+^7wsW??|XԼk`Μ `Ioo JsU35+Z)}ֱ_(G}p5Fgn\VŝZrkHJ5sܮSr34IL!.LkgW=5`U;pnkIkZƣ[_-6K'D*ޥ|6X+!b6u'M-2HXb]V.C(~Hl9wNQʒcUu,^ȭz*zDSSdz -@(.bS2j1\\\Zgee"T\/<&b?PSji61?g%|P6(_Yx(^R*rP -40-6椆YP?HV1f!6 'T\oo VU HҤWx_'N:盔 -ռೞKɯd<"A,k L`넷.9wi1ȳ&PfʳZ'91æ^]lvG"'_R2ծӇ۰>u%>\zg,g> 9*cŠsDXv" yFz'"cXc[,pC,eRcH^"tG@`kXLI C4Jؑrޏ,hA`+")c`湳 Eư*@s22b{{:]>&*Mӱ&KtâV&r*x Y/ dӣ NÈf,#XeuuP+?*H _AaD1σVƢKCZmcg2oSӯVvӨf f<ڡF5j4X`МCl׍%7Oy\/ t&*MN> u5t%1eʸI H}w"2E@ccXT 9y}/O哂{T?u&pCZ;Di7O_tl%UpXjͺ< S,7V!Dre,c _ԟi5&v}8ŏ`a59eḏc]?*ܗ1Raы5Ȱe*WFl/,%kG})-UeWO:kiSL|Gرsklc#b -5զ %M\肒ӣh hkJQc+W#d:ioIL3qOy|#XOezWIZ ,^eb\y6oH֑-]ӵⶶ,WGԲ@=MTiTN!]oO_u\>-q\:i+:Z%h0s#.Yz~.2'\& -9Ac?{^˨b4ňt*zX/Ii̦A˜IvpJŋ&{dyZ;*QҫZԅÝS|x}iС8XaDJi$J殞T4[ǹDR2JiOM~iߟH1aJBLnV桕ZU"6"d˛>$M5EiG_&'_ymqRֿ uO}X@}!qTn$:Iv/Eb6u'TK_jX@W=7-U=nUnVA !+j5o)xHK/m[ǭ.lwֽ:iJF.iv++|ʏ©;eWd)6rԄs,&vl%6WVSRQ?|N)W:h٤}-C7x=U10qR.1/w.cG:V]ӷ+i[ou~;4 *w3n}wolb񱫏`ѡbĊaʠ*S:-4hiZzFHaQe@,T -Fir.IӱIS:PE"@USmlec*N3L̸0y\0 -;B-oRr}wxX / e8uWK/J$fŌ 3,ieɲI@U<Gh, t$z?-)ijT3ʈadKK1,Z`M? -DD`F<CudP<(I:Ԥ8 kRa1dɎQmf$O:s - 5NpN)W|p4' kS%TY[Ȑ0b4#2k4+fBٹJ4׊CBvQi4lHD-c'#G;ȳ*21kV#Ҿs' lكV 2|gZs\,QH(2SUi4Y8R$wm"')PY$Lg<T\A6haYQa,+0/y!%!^Q*eMkdztO/߂{ۊXyefEj~(RcܣƘo#7VJG{Lmȕi;4ޘ *LNm6% įc-l~1]Th툔OKWEc_<]a.'8svүa.Bq h#$Ɗt 0e0IH$wG40hc -0ioUuT]go!c>ŤoKۚw:#:--X_dA0j ,vMCWXdDkQQ'> *'nMD3?H9 ek*Tfov1ah08]n+QwE}uCmAj? L\MJLfWf})7HyӫS4+Mbܹnrή>ier{sNY.ً's1$P#eDH -LATZvQE \*N9-L춘V5.e 5:o- 4"+Mt"+RQVjG65-;&W2*^?2Ы~Y%VI'^B=2 ܅4e84Q7*BQLԽ@@i_c+gw^H~L i&y}'xbڸ -nVJvr[BUBSN|HWJdw6铍MԾ#fFtlr6z)MUnXqo+=9wY1u ڈoXr.;N$BL$:%{tWc#qvwԆp9fY֎4pjvEcHxV7xOWh`=he2UY(yB]CS46)ܥp_*,Ĩs6~ЏBfYymR;52%$%aBCLVԤE{޺z`~dH rꄃxDK -9/Pe6 -a~ pe8.<3,z)lE.A¨ڼx-ı -2E &YḰYU/4ud*J†-u[$LO0k -B:1'Mk̲%(Qcꠤ(L=YZ+XV,>|o2rcȥ&`8NcjG_ਊ+"@c'lQpƵkX^er#ڭsQDkU~(O5G9ɊW5UȊ.o.I3d -m#o7I|^;>Xa8e7,]w"Kl:U X{aHްhm -X cI(S.ٖ` 0(Iָ#J&)N! J."rL X 1|iq>VHĦ`2+xisTywt#nXAس"ȍTsQ|]SMGQbGu̩ì.~ON)mvtatꝕO*-ZJR^ <9eVTzHsNGHg Xi%OSÅޫwt9 -S~jQKȔS#rS[Ccj6./+jȫBK#ɥw|ꆲ4mhM(l`aNσc6@i4g92G+*"rwǬVxJmP]TEt7WKB`l.ZREt4)MJY$S]њwrjtJ); Cg׈(j9+w udIqp^)"k,у^(1{HSYZ&X|T}a:j.Py:y_OLkALOԻ5W&E?u>[P#kT|O`[wg\&C8kS6\y:i[u7k)r2mpjq!H)7R9LxMf/b0zU6124FiafXf( i]S7j6oqʻ8U ԧ,/EN 1=<3Pi$\Ud'hڶV8@W9C|<ÔqV.6 I9@ZƦi٧?L[qQGnjVV_X&[Xv'a|rȵ\5_ySpzタqiIHc;nr9_CV^dK,"aGAuPynC'"FZGOs%q=YE{&\FFrU٥-kvVoqix[] ra'}V_LLo^$H/ß$ȤBZ% yR2X@*$r Ops5PƝ(iCU -\Ca+qҪ:BcDIVWD(j 5#-EzcGtbؑ/#X> lK):]u}/Da !/"iB;;K H:7w@1$^eDWC]7 _@ť!ƽ m/*,` Gzie= -><8XbX~lۇ l6ͽZ9,ˎɾ&<7Wg6D5bs&?|a$$鬆ƽ`<*QtmCA{O0$D -!M'M5Xrta`G/I͒_V$s»4!ucVsd Q &thi tIlW5 N@d`& y d*]o\¸NؒW`|19o:lI cUjieKnsXs";9{xoJ><K -e$]EmT6Vr32EUl"Ķu RCUD$AIV;oxyI0",PE> IhOq]*䪪&JxbDPUN(6[y#îty}ůN5QJA>$H&A^RWqtXOtȡV}`#TmEdV`YCQ++EldJ%2wt T:`2odBryg$ד LvHn,^ʐɏq dr%vŝexbO\|[;{̪S>j tA$H=J\R \p.!E ^~h纂P[,udW%53L:tHky])\rXt;/ X*ss2޷xï=CݕOk*i[&KϬ׈Αy5V}HSa/s™0dY*'|-ʙ'l -zKdp;66VwMHXRA+Z >sǥnFdWo+HGM~@xj͒9{' <x:Dh-RIlk,>g-iWxsiGH8&|#GVQ=t:Y/BCMڵP$y Q['(U=#î/ʅ32Ż@AҲz6eqHG®( w#$1#P`GDtYHʩQh1i\+aJLH; -oO\C=]s`h %bUpKup>'h%$j6x́e,%H-"ǵs j -4_zѸ8E4 8Ap -$-2O0o3^0:8Dɜf!eCR)AGH[] 1*M{O_Y^&uD2!N;Kkh/{¶TƑǬ|4‘ i?oms[jT|ǰ`'pRE\]LsKs 0ZN+Xd];SG90ƪUJVYd\t+X rv&łSB5a5\Z'.M"3_CD{04 wZ(yc^vˎ;|q n֕FTsQS$_+Ncu-d zw1\3-m̃=0QԱ[wbLu)Ӫ9Т(6x;(K㫀7-ӚƩ^4Q7 ۚAkrf]ܱU20tC+?jSa5˕pHc.FexcVett..T1%U!l'rXQcW( 0Ց9o6j4I+B8P,~%j*ݹ,fGͦӞQ;FZzVP&= *VҶ(dJY0ƿWW8$vVX>3%sNoڙ{j:\h yG,s=tULvR#Jy6&4kP@jF!R0vHa+COڍ99}O'!'$[!ee'JTc9`U;J4=tH-#Od94Zڠ"lz6vibF^b9jG%}̈r+]&,9Wn4񱲦5hE1̋>x)^U#>ߵ\?ul2 `[-_D|ƕ:O)%43X[FVs`-V]Jg6(dpI ax[P+mITQiטǛ%t~F&VF3 yYvׇjXU 5 Ϩ@z@coK0\/-\!:,Z -DKZH$j[`@I)xS]>YX+2\0n-ŵ]ifjb6q@lxbu[=6[EwѢ0(z{&Q] &jfd&;*\/w!DDMnN.ck(ؿDOHH8 -Rtr| Ǝ,QP JWoV+a<5Aʢ4p VrF 113AWsѣ~ƵF$FeoT [,TEMa {9cDTgحkQFyR!;(AVP0u؞'`2hUM06CC 6"P8$x Ltq⋪`V yQ#L pȘ#)9t4s:<,)QnAdo0E^ ` nFj+x#xo./7.1wCXUo%X2(M[PF4!$"L(W5:Lr ťJ޹^E{M-# dŸ KDt#cڈDL|qXj c -൰l&Tw/hV!%"WӊW8,muWL6>Tuy"XWň <56z ˋz~xR,b$ ^uU ʊ}U NԀrNU;y; +@Qz\pSd9%c$W(=ǥtHc]g,F鏮tB 1D(%q+ʺH =lPd$KlA1JWT  Ceya-nk6([ٱ7%dEZk:l68VX4 XosZ;jsU孋$II- TKa 2s :H7e}=GqH]C`$=]8A&\gڲMHj81Y_ܸZG2E E,k dcVS*lI:7]o25}&{ȯxK0$aڊx{Hf90]o!#j~rcԴ<fLsq T-$aF3,.AV\z=mTѽ4@!DNhB( !2SH-bC_#7ȗO#k'|d8u7/ގ=[%h-W!+hh䀻r5zq$.iDױK R: jeASާ6o,${)sOTG2֨e|\L)@wA&7M-Iaɲ;TeZ[0XH {CNcٛ- D^:u"9qr)Sa,IL+Z75 xϜ"uxƲ}K٩|FPj.gVFE~jTޞNb"-]9S.Lh -HfTY_]-rӇ*)" 4-7=R57$Ծ|z^O&I&mזV@3K{5̺KwNZ<86ͥIUdW &00 Qͪeeo+n_N{WWSYHQL<&\nʆ&O@4bZo:l[TF5.LDeo*HѽirDIٓjkkѢ\fX<| ]:߸#0VߚR7Ji^Eo0FʺaX"Ok8 -f |,vf"2c\!/*yuv6P%I'H^y=\ǺPTr"o,bƷqtδȐ{1QMQĵ + -Њl˶SS֛.]Y2jš#fVr5 -y%Zfz~̸j\zYˏF.p,=,U-sM4_+dڲv),È8`hF1bȌ_B :" Z# -EA:&A"$#׍ X4*h R3ʸ1fk|Ҷ+M4ű`6,Kje&b2.0x0զS2Qd71*EyL]"QC*Q+^7/x -Xg| -I:utix,c,s2,$IK+`ֹJTyUTy>gT!Ɇ]#!dq7z-Đl5k G*V=݌b'[IFUe (%L$2N3HhK ֯koP{[Lp%,Ę)Ydv;Ċԗ6,eݴ,?l-tkkY҈:-<`1V([B4egi-$k/Fj19ie+'sz>ߣZ)cqLtsb0䭐S)Vi$-ΖqHwV*"]G  ]?T -gT|,ݼc}`tFs-e y6mc/%uM5=+ŧlYZ~2$Rr6d:U[1aZ2du`h ;#>Jٲq捖A+s2YlO}SwnsSj+dOM9V[8pLY뉯qd^{Ys[jD NHpH; ]1ۉe e&_!ꭍeC5ʸf t<!V2mĶPNs$[3cH[!C[i! $3\NGESMڨۚN g&W@\G47%9la9jcdIQaeX~z>NrUNYE-YХ5o#ղT2||j(e_z%*O Āgm!{3GRThD_8B I L)kc, ĥ2/Dzh::)'2cdPMfeeh#8 9&)~?jgr>nHSd>O(%&H$D+vɁ ]gf~TA2>L9*>e~ aDA9aȯt -@Ts'e}Go1ʭ39:DFRdbKj" YM>cֹba. ȌxpXԄmBv+>jvsx`Q-4 QgT8ڑLOnTTEL2Lz4|r@P?L1fW-d 8)* .s9#TLxxUmEpw$}hWT$|>qz |~ %ȉybByou7űl"y F\H,emգЪ@g[E\ -X6Xm20:\ycSm(v.ci%uStYY:hY,4QVHR#_LY3ce^ճ2k$6mBݬw4>ހ%*ʴqR*WO{ttxqFyV=r'E#lɪb{gL(X6U0m,xPW3hM:8zC)0У2tlb!:5Y 4XQ5ӕyFu坈'Ǎ R5*H'G0H0wxђLw:ӳeK&UοsLYylZP˞E˻g` YCm:c!@]~^J4J"IgOH -$ a -)qk,urޞE<Ԉ0:ZmHvGrUL}F' KŔç"fOҦj Z*T|+䬸B>io}푣ҴnztM+ToѦjjd$\;c|) O:}%r$LRꦵvg^Io] /勱-K5H)qJk8Hs"wL}WA4wrlQ2ZX W74ru)L"vc_6gdW'T.;`tzލ"+7% Pzz*y8 밺4x%46Ӣˏ$SCJ %ReR/-+:"&;+_-+H,,+]|)i~#vL^]<3H]E=2{&bq+lY.d)WIOFVږvA=SN.y`Y9_A d&-}U+tVf@l++ Fc! -1G+UpEYF*3l"0hj(pd*|ug&ZՆ `ajAXd̑ ﶪvҵ9 ) "a"BHHaG_`歪Z`0c=Ni3dlx "SI]RK  C!I,9&22(k! 3kFtLxv*'FvMI(R+o$iWU9qh݂ m[\1ޖIIlD|F)%T"zj+յ4SFj;cr5TQLdVN8QrH@WFCԒ{d4,Hsl̦两``CR+{ʳH \KGD^qi9#ʗycޘ){5Сuǣ׶}C)ea.I#IxEyK(c6Gmbʴ|>Gg-РKl{qE@@ߤ)w#_dkS&ȝ.I(!Id(jgO{&(Uv$ċ'-Hd{5sWvVãj_c LPj9:R./]l#Ϋ*]lg,l\䉨S2=Ձ)NQ>a"PtRS u ㊳Ln`m:MVDT͋i =SJUofM8v}X45官즲X$%L8BFrM;Մ -fkY>Ч9氍4dCeOƆQE(+6ԲeԱњu=QM \@C[dJf) XP -Y.`KR4Cy>lQ0Mz,NU3UsQ+tb 5KɽN5]ITV}j@Bx]>Ǘ4oYYL}|5A *IN=r) -kiQ$ٗM'6Kda;[4`s'$ -tM~0{nEFَ35xZy˔ )ҍDsHD65ql,Y'#($W4uD-!v)M*,WGfVaædmskH;D)r‚& pҢv-ԐY8Q;_*g!.姚:GѩME .f PWTFַy!47Gf  T~Qe -]J$J'=g2ٔ6ccF0Y~ӅL)u78OH5ȎH6F%3Hz.b25B҆!e[٩eJ.~#A~&r>ťWgh%S :La) -siiw8$|nV,8͇ -9C@hCm ;''|UM7"<lts/WH18~بQմIsB+'`ߒ (e|@ H;re9%\I[ş )Zm Q[Trf@62,],+:qXH$ M[kFv&*oUZ ~-l {Ur{,(Fa<0r=x](Z7H-]=?Ѯ~ -|rE[b6R@X}h92"M&;2,JOh(?荫vr#}{`2%1 .j})TڒGR" 9E,r#d]Y`&"7LuYEH[CJKO>S72fRvǃM=ʺa]U+Y<4i:-f}Q[>sTFk^;ʶ)N*ᘤ FT⭯;$)xpꡦuĐ(<VLk)azpc3R:e׭Ҧi¶BP5#Zd)8IiJTe\51S.^;QD,a)r&fo-ReZ+Üw -qPդs+jW 6`|*% .vԦȮ1=-٩M!s))8XE/RLz#ǽ<+dH$X"+C;Nԫɀ\jMװj/I>V&S/4G4؛Au9jfMEy1>֥i͌(3M"[j'o{p5!5 uXI*̧`'\w ZAjf|<b RiIȒ_(H"0ɖ@eCݩyDnx[`rI["I$<K@Զ3'4c0(:vIW'oݤq=Fx]QF%dX;ǵ͡ -IsJ Noe8oZSzAEAE˥ڦr!)»ϟ9c@aGy%~YeV xG}u X:rQUk;SΙq,vxW-RK,3VP#N]ױEkR~4|:z4LQ)Il\;`2<X6>QmoF7mJy%-L{YUxtJF5 $gj+xD/nBpēaW -X-Hho#bg$TALx HIKsoDTdɲc7!%#PGy,M{.(#NI?\8Z@8A2=xJdHT:hɖƹ"窲/,7ޜ֧V`{EYv s.` 95qזO}mz~|P[](Jq?b4M?SEB-,P\,z4Iqϵ( 2Mdmar(b&BsGLL+$X9R//!tvjY0eE JÛqkW!ӫ,-b>x!,Y -z=ߨxl.Ʀׂ,3 -T{`1fOeeSfw@G>QF[] R7W6=@;eR -0H]kVXr=1׆$`\QF"MDw!܊ֿ1$*D\ƱX1MD*v#XVcyYw߹QQZj#[TcwL8~cV`rvTDj/JS:bUqk8c`ѳE"{B aËUC '&+/oOxp߆Um8Wr,.dMЦuk2C2UmiK3L$YʋE}1n;I`!9o2Q3wqpNHr& P6vFlv}mk 4koId2r@$$ SH'3X1W5y$ .djeOZ'Mu2?m>]l8ɉh:U?ߊ{{6a#d L^5_8dU9o8qgT%ɗѡ@hFFIwq&j큽XO0}I ,P<NraM#/Jr%k[}l͛k[/+3f쉜0nvǎ"ws3:AΐrbcZ ,8TR6״ B -@9^/ 7}^<|{Lާs7Q~{-s\UP_9JTM}^p_xXT3 ].;3Jjک'|l̖Vpr8to|EDF߶b7Oش D_y{K7oi}ƥX݃F\$sK6C$y/e -WE;-5Xaxo &ɵJ,` -Ď@/vi6_2S*ډ["~+my_L^ /LVw.`f$z殞oIv+e:qͦm!ۍV[/mOBTVG?#M|r '[⹿%*V~r]jlC<>16L2^K)󨅚]d9j9f?G/-cR%dN}=٦~H}R! "*Rz}b >W|,bmW,MFl&l#2Srʢ&0VN)={ߩ%e-ZAvq>8J +LsQzmF&z'/EY=> &8 LeNArC h/5D7(٥=Lls$O+5jsW2]DHԲ9#~z*#eHʯM“ԭ_}o'j;4ͨţUʾe?иZzdܡ򦋚_2{uoSMCOFGN“ԭWwo}"po2Ѣc{pɹ@E3)Lgˎ4K.tKmuy~HygrFoSb1z,;9:Dئy]Ma‰vv,)V(b %),R-1ө:sSIO"tVF- kHbȐ*Cֶ'jʀ2;H|4PoeUY3v2HxFp^P ձjڧ*Ӥ嬭[gzO_t4ܵjo]74ʐ0O:+0X5:vfis$ٗ+h+({=< ӬctrB՗%[;h7]0Fƭ9K@$ڶrLfP6J66sDy;w stec-6)O8^&T\%DR@d,epM8 -TV$OЦmHq|lz{g M0at PC{={7Ìn2*96BQ+-4]v=-nZN@B>x?ʕm1Q]SWMM%5y5$mQβ*rPٍŒT9ܶ+O {Ȟp /_,PzDLO ]A[ODj[?t2²d'6$xiq|: -MdiNDs#Sr5͎=Q3{:#ܿ+}BʢkQF䀁 ƒƽV~A-𑵵i+%,<m\DQBpz&,ud39/)mH<=8wE(!!k#I;O{F=-hA%prehn -mQP3`%Cɖta Zh*.9A%1uL- -{q!$HRsb -v#ca a -1 $Y%7p(MESqTDW,i7p'?O.4nD367xtC"f@cg-YQQQ1$Q3y8G{y#LSUV\&G57neDZܛb^?RS9 -zDkƌllB"1 <!*`0L\tz`ӉybH%q@3U)[D SPY !|8ÿ:Pp#s*a6?E  t IRJ_Mcs2P^L4XrV1cL&*c!<SXUC!lS1!SE%2Tw壂#[;"YdPSStÏ GC5xM4RH8_ق1"%es`0}p*M+J ֵ裍 [\X9Kȣ9.Yԭ>tAV_>X -W֗j筍^u{#.c.Rp^ab$ Q -pض3/.XVǰ YRXI(r;+dY%N5"+KdŊe}Ąu9d(Vz_f<mi86Rn[͆9nPU(Zg`HavjFԎ{b ٶtGm͍̑j7ወ֢6F54lGs9,7FrEkڭp K-qQ.k&2$CОb#qэ!I)=rlA{s8TxcJ#ɸ*0Wb4pԍm&0G3eF H҉hC+XR)GYjퟲ/܃ǔcsbtD]m&Fv8o/11^/wt]4KNٜlZGKFGpMH E -kD!\s!$TT^Ʃn#\1=Kث;AE׭!2 :*&uP{O,q!@3WIKyOEȶ#sB{iK$VtW%04\'nHrJBoNFIEm'!f"'Co8h21L02,A~fy,kc!ІnkG6} -Ǽp֒΢.v)H5}` mQׯ ?݌dY w2XfȚ ,v.js&܍Ɋ)8YN 9P@f.|5os*ڸ8,Ñ9۲*Ny]C$g ׵|Jm67}P -X))<ծ(4J[-n#ͧ]/D&N!LdT#"rc37wM^([vR+1c\菨9Sn""y {eX1pFjG&˷֣n(Znɲ8,z2o"ʭkZkS%цRF#j5?|s[~<ߗ<ۃ#yH7y4DUFjzTDUQ%M5ɺc&"8*"znֽo3q H^fs#xs\j9b9A&9QQ1&ERX V7$ڊ^2D160#a25KGq.H;w~Tj*|F3%Olb x(3{69e'$ -C9dž%Adl#Q\ʎt~\*0zNssAN -Q#tn -QTO ۾]7TT|ݦ$tXF2pHHJ繭`ΐ! B') Gd]QW%l\ꖼ6,́"YLɒґC ΨH<C\vM*6@3ȰDtk_"9Ƣ5ą+䘂81C8y" dr -{;ǻ᝜~K#qѳuW'&L j*&s#9$8g+&h1y(~pi^\ck ) >=p@~rHXp!4mWG!Wǂdd>Ah!0i B,'CXDo(@ΘXvn;q6๷n;gÎGQ_wXDH-6+lNC+ƞ<vͳl6l6 mfٶmfٶmfٶmfٷ l6ͳl6ͳl6\ f+3otmW?V4!QUBVM#a0RgI$kU;,y"$ Ey\F $N -Ѽ|f*` q1?Y UGNq#XA6y!l*Sc+Fkam[Bve!taqAFR0q!d#V!OdƯ) k -~%)$`D3'=~㕟)͋a"jYp,l{.Lcٶmf6˄pIUJHܯpJ)]rmA4I)k7I()4Ϧ1sQ{Z.s&ԐV¯\{ӈܻ] 5g燔>5O WNVβ>5OɃ+,ӌV׵3Sz .[rm7ƭ1߾ cWS||j6ZM)N63ײj"WE1˿T4˯pC3 5_i?>\R"9ګBF -$_8; ÚGҲd4eeg/4niߕDۺiKnjW"ڽ?ׄ:O OM~|t LWQAӆMw9?"yI3QzˏPx_7kY8 vq>}ͳl6mRzQrp>ܢeʤO LȼW(eڧ4Q=nȶLe&\\ꕘ#|sSPLhLQ_%'*V6c6\.r/ɏ4˯Wb_ '>j4C;mUAmPw/=, ? iJ$=4畬ի_)U13Pļv~.g$bZ5r~yjߒjό,HS+?O+}66½@Spצ'cNpixU7]ޟnWNQ=oclTKFLVљ^<)9TJȻ |2f2'eToߏ(>M}bV iǮiP˯\}R _j.%{NjT>"Xg2rc忩ȟ$ӟ)#/_S4\ҊՄM5WGQO-ToT|qHVY;4ߪJ'fo,yL~Wx٤HݭxJ8 +h}&6d__'?U#o9WWB=>>Td<=Kl8CTC/Z^HӱU|l\S8'6RZLf͢.љ^]q!U"t ~;/隝߱]Z]CvM2w2G> -tMi/!|3MQbw)7(3U|lLTeK٪27$O ~.\&E4I?O?ÚWdeϩ'IyAgy?46zEi/ ?dJpef?U#JJ_JJOpMC5٩=IqߦER>^'1?lyy#sTl^o{bh'L_z@]Lsrv٥|w5KWf&y-l;9jK諒}^ _n6jO#`M4-=>^TzTl_5+.}R^A6Y[".;+?P#<\ҋEK JM.=t9meMC$埧ߦW揗~/4eevHZ?<MGi5pElpɐJ6^.jOTrЧ'%|Ԍޝ)}.&TzԾ,̅asQ7kSH4,?%*6'BFL"'E˟MksK٦Z >n3T2"4嘆-?yn_DYT|\n\oe -ć< 2?3r%niϖ~Vo)a.j!I WkR0u~[zIӣf9e2rGY~+ref,M5o燚CfL6,#+SjzNB(|vjD_T)}~QH2gIKQjmQ3R2AwU?lHm#s~j^ f~R.?+rңeצkW4?4.^|VjQQ/4>jXf{WNe<7Wjt\LofW}@ yOS4deߪJniϖS8V?f$<-#5j] -B8kk%MC$eKߦ__+4ev%5g燚C67/~jzf@Dy~Z&Sz\Սp)= -((7%fe'Dʯ2Rr\5/ lY=:6UzdRq}XOӹ3 /=6FA4Q;-6ni\8yY}IWxY=b^=v*Ozdԫ'rJڙSܺEO3Oz`[~Y٥2edniJzߨ(?4,\(Z_+Wz˂<ѿ n4̳MIbVF'`T8$Kfb'(eVj4IYm4M5?DM?3 |L"<_-)N.jp,2ҁ~vVjF34RSzrFv7M~jM> /rq}XOө}4Kqr$?] -忦4,߽k}IVXrueKWߢcO(=A0^iVSzTlҿ瑗+ |sM^]w9nMC SVPa3T+=:6E_K~/EvT\lҭ_;z}NIjKyQ~jU+1gVtT՟hԇiBVz\lO"GEWhO2Óz^jJ\Ӟ+?QJKX鐾R>_xjTv/fQpgH]0[0VWE$d?D|ɹ-OPMꋚθy|\ozidvD~Wew·5Rnrб͔?9MQK|oni) Y_fZ*&ͫsG=0pbY8l͹sH\٥]ٓRNO]fTߚKGOJ/˴YY}MDҢpyWQ?MOv\?%*}J.jD%UCa=/54ߣNVb&jQL_ l8߂fGg[fjN f.[ߧY0Yr$d/PL_Wr+3Sz#VdӦ;)KHz/~VsT+F& ? 񫶡jeJoJ[/ |sM\_ #f ݣ{M.j>Z&_p󪍚u۹(NVJw61+f<\E5c3V2nWi}Rt,uޟ5S15_be)%PzXrwH~iVFE٩I2/|q/z&7+sSzd\_S?ebXn+<烈!\^[l,|ҿ;Y)'5LLVit稦X~I"eo·5OG<\FurOJ6GC'.=2viTK9k5=O)?+5L@>iRL!L?ɑVP3T|+rѢO(}AÖ!/*=*>im<˯T$ܠ%j?O55gh͚ӡOI 6_7RzTlA/&,(m#4H?0U+3GNjRp+tTuT'%OE^c5'fMZe,R|}٧VffDc~ 2yj%GTFvP;"ٶmX||=~K]deڬOq2 R>GE'.2vio.iu| -J۔2NrMBvdF -?? r%e7G52ec~~V>.4MmghK>joOuW%"xA 8\'QTlC+$&"+?L4ߩfGe[9>0GFjÙ>WeG>a!5YsTztl3V~xy}6VPzXr/=sOzLlOՙ~p)#5_VLerfxS`\% LT2MR>FE'.W5WL|3K"ŖcW&G3&w[ͩ_G_jf$֪҉pK.iP yM1M쌻IyPiLK5A-["ս8i?GK>j_Nޙ' -}1 kMI@p]M\PRÔ -Ak+d6aiUGѼ5\AA lȄ2p1Bd~-"(aʋK FGʲ!4 $i_UdHTu2i j;_bN?ռ+WL.<#&iGIOH˚LBj4ldQbKgҡ-` \3KH&O5g=`Lej/pV W'̚YVH͒["ǻGG͏'\ףʠsdYUA<DQV0]!葎ұޤ4(5b#O!qɣ$1@GD8 ӓRQUĬ:Z,L9&@/ #o0VhqcF$c+w" czh<1#(aݻb g*4)᢮툈wf3uotrbinyb&+|[Mk|pݓljmb;ᢦ#OfҦmrmLۂ.mS8fnfةn 7}/w{+W฿[/*/\dTT?OdPIF* D9(3zt6:Qo6Q5+>+W;%`YCGR qE!%o69=sjc⅍Zt#Sɓ&LD)C(N`;c=l+ a^c]&`FS丕.p*u[(0S[r9rTN -RF]ҙ!VtO WBeS\gENTdP6%rsZ)Au1kdw-}39㖫ny0$tnr6i5"ve77njqS]Z8QV(A"ģ{]?dd(#Go(2ŧVO:ؙO.C!yWܗ"e=2ձ>/.vBmC1VRg -r?z)e7}E .[eUfYaȪ"Rm-bEjo7G%&cV|OK5#1 Lܺ{; G&LnLLq2RHze-z8kLg%dD~{ncA7Q J8uÕ(ki7eH 4}:|䬘wH_}m$+fȐ'̟ ( aSHO OOM$!>mslZ$Ē|rycXz4`Ѳ4QAC%pjㄈFq)ƣX}t:TP"F8ʛ<򌑂Ez7lO*fة"p6"fW6Ϳ?xO -gKNۛ -~?lOC -"2yY=XVcpZ8RCAWcgf@tI 'e̕Dl|I2o+`dÌ1ca[0rƱ.RX 4ϐnw1@7r?hE ʒG|ɯB%EǑ㲜@SdڌP!:` -R\"䊹 -EIk -7ͬ\P B&]yVR%,Se^(h7Ó(^D%tз#J?"$f c!) # -H#I%hǽpo$hl<{ܰ6l c$7&a7Nn^7L"A+Gh|$D.P/$䗪2@yƭ#pM덟>RX9ILBz ߋVW/=04b(d4C#0&r5[Xhi̧jhz%kpv0܃O5 XFk+j6`.);^TM:ʇ-Wj9ybq#(X2u+"o>pCQ~vfɢlt2"0L'~iodD˷"՛`\Z>CFث%\Pܘu"ًTu ] GWR7m|xcjW)=$U3H;4.~~ץC0"ЂP;#w M.;2Gi*@WGrߦӏz5k$ OuS @SA^AUux9Qs J'0mjci =;)k\8r'`;{9$ 3h؍-X*O`b4=F5ʋ-.VB=./ &jFctс-;$e5ʋ.},_reUO=iO젌;n6 -d_z_ 4afܰ -%l{$V9H54OT|+$F=9C5]dD8\Z匮+͐y' <\8VrPܷ#K<H,Te {D񰫜78*B{gICG@bLBG -j$XD%b*UmPR d+Qa1'`IXR,b;+6615ij_L"dp 1'=RdU,KjčφZ^j?\;v߅Iڦ>FkbdD~P>+6esՕ4d]ײK- ";˯ymdCOӋ6*Clf51{hF-ZapԉYL*5mXJ O,X2":7.9rmPZ깯{9EϗqJvOA4: s nsr<6/vLUr4%9E1[8qH;ogk lI_.Dsߒ w XI"ܔtXEr_,;̲)_e$ -ioexɒ,bE"r*q&V+mN7!ʓcۊLhfˢ1UJydbLlse`J\ZB"eJBɶe;KDckƕ,$ъ[Wݴ2?QU-iy<;${ - -6~La €ҫ?|}3%?P"xsWt-ǖm \D4 䀥Q-}6VFML&9d/aXGdsrrb30c@W䃲8^WIN㺾Y{et#*ꂀ$nNꑕqj؏ly]; Y OnUGZTiBR5rQcʈOl\K19氫rVOQyVư#krd1JA/C_ UU' H ~IŐQrKoૐI%DQ\]qG K\9 %fNy \?J?*T16#$LܧhF^$HnqLqB a:cb2UrCw~Gb3*2'L -qV)v[#d1h!9\ܺ0o*ᅭfv1n\PУ-*B{H"lO#G>can\ӔUd$1鋐3(RB[F/5v\Vֽ"Qy5~CTr5dҖϔXQ[3al}r2.j/KQ.3XetI\=rIgYJTA;T*f٨xa%R`Hx{:kt%@Ԙb;QDX6wg\E 7fOx%FǑlJWoY>J5<*6Er2ʇ. +c2FtIJљ%&p"ͼd7:,!3Z4v^5W*@/+ Mlua\2d>-Y z&Hg\ep FjdE4,液:hHڶ.^q2IZo{"?X Zm1=}5*ZagUo ݝ;R|EX s:REQo4|yrFa/=2FKM8 Y@RXlUldbkeYms1}-],vId I.4 mv75:*b%~[ -9U+VJ; I, b*H0 m1t43f'y -L!c2|eBHAF@8X9xbTIg`<-% Pr|3]c ъӅ@c+@NR - ʎ9:(zs&$6v+ GAH3 2bF(F @w1,{ " - + Q# a xϋ I#JJ"29][G(TS$;W$Z6N -@s\ &)3FplHL:PPp!_ݓ  *9MHPqFs|2ꃈM$t6hzo}BLl0L<@Q_va37o2m[㘎TUQ1HW|3EMsˊDLT^;fٶ'L6ͳl6ͳn{[qۂp3l꼽 DOפtc#l9“ --ㅔULV\k'#>1?$9cUmo(ěi"츊{f5{y{6?L%61gj0` Pi% ^Nx)"X@ LR*ܱ̬86Xz;d%U -p,' -^8R&W7$KY fG^A1J!=\!0i,&)DW)$CĐB0Y:GJ+F?>4$cRRCLFb䧊&˯NE -ȧq -8}pb -|kW(Đ9-C7:_-JJ)e^hG-tgX;-v9nSJ;-# եASM%,\WnUwNd^vT<0(=z岳Ow&^/:ETx%JbjOv_5k({ Us/ljֻဎy-,K2vNmې - c շmMSius:7j2jTSE!r:nc; }s<$8}H@߻R;/|)Ts2$ٳι2<&Syb,, {roLO܋sW+;D2oQdk̭!VVN.D_F~ٰenu򶱨Pq@ݵ SD˯\_/X5366LBME{ -7I w+:tT\sƫ9!!hk2/*;b=2nZ -T`a'}cn\c^y'8s7wI[tCy/7sSO\Ǧ?ٙbeDo^T=h"1|Ɂ\<3#cWs7\Gz`YѰ%W5s9}:ss[0ԉ Ļs1w"s;B<)Y6Yy,c^ 0NIjGUd,޺>AJ٭hF)̒HлzЮW~} POv$p (X -c19,Blx$>&!q9g#c;(|F "l1LsiWئܳnG9uku%f =GV 9O@H1c0ye 11ucF>BF͵{|;]Z"*Q&/ tPWC'hMmQXXw[|fjOLb-ZAzw.w% 놆kiL&UG_TCEKD>vwBuk7$IjO1߾H1ș%eyNhQ8P恕 W\A($kQ=Pt SJj(mV@]A&V=#ZO+Wm:BHC/埧N]Þc$vfY_=095MgPo-'TrCsDLBM" ьkQ/DD['G'-&527O`_ "lVWo --n7{IAmQ`e\<< rP&aVtwЬFƚgI$/Ė@+FR1QJw0G #%'U8v8b7GD BA\Dw6 #*3b#`gLr`KĊ8ҒN~##C$}Py]l9+L胋 (4p*D0sTg!/wNJZ9]HT'W=Of'!lY`J8S:yl[:,&9"qr+S/럅{j57o P[Sr"pVDDT6b" {%s&`ўMٜƍ"yOw G#T҃i69Ltحvc-GVHt+Q\kT0Λe"tY-E-;w̺j&˲X+W:kghV/+X$N#ɒ-2s|L՞9)&?則l -*&YKn{,ھ{,sHՓtsy81 hEnCLb@Ű$DDA#նMjs)@SL@N.flS9۬pioZ _E};0X\uo!_5r*Q;>;RV<8R{7Ȼ6/kq %S3cj4yk$%G\+(W-׸wVrd赭ژ[VV{1Z,c?  -o Hc+$A D9E i2*vw'-rRa=\THM?1sUm* 5TfJdD%mf^峝[a1B$v 1rUbVzG|^몺G~|#e0",{*1S-?aB x8ͫr mq7Wlzc2rQ#|: -`pM&L&PAF>RXh;4ɛ243ėJ˹X FHjZ?K#q+ .PvW CX&."_>ݼt~k C9FjH]|Vje$8-JvGN"-/ Mڧe\>Dy<]x6݁`Q7dEvdiG5Pԕ e'QGk SDY8v#/FO(WHT1HXZpw\+^ҙ{@aoe8wV;ő`[+W@bQo+B'/ Iq=t"'t>#n 9c ͷaRH"#O&1Ws v=SlXUEVpQW|F&r&r16N m ]_&"fW6χbMޓ*c vE*|sUV"ώ*|sTsW5W;jr5k{_+FcWb9k^ .pոުKՌe8\#-d v5fa.CV$Gl< xn+꣹kTI2LY8bk约q$-qhV3TSXfJdsl{[ y؞mjE(3,'t(."0w-g0B둯طd},쬒L -ƙj6͇}co \u!;0žU2l۲#sJt%/sMV@\ d)9>HYpKW+~ܴNV9g ӌP衦i/ԀgUVO{J(X1[P=K;.D A.aPq+ѶU#a"5G84uqk$O Յd+e dEʍ|jT:쮘%aZ/1hW.ܽrX.3mF\TPe3ߊW*bh6i(kZ9 Y֭0k_=4Ⳋj_Y1 TɽF]Ufgg;Z9ePU7lŏl>J{*\R)=Na:y;J;5&[+C1 Q_$|1ͨ%j3/zB)i]Z%)!.jH>E8c|-SY 7ˏDU/k  lbAyJ%jc׭n-"DTa{WYt "!eTW-pK&<`x+_w^(vE\lz} ^CV3hc֤A Ů{$D޴H:-jen+Ǚ28drX%[*} n z!8'D9Z֫Tc؎If0B4k`rc7#D)`$e{@CW/GvMrB5YeBIlpZ||V=nʺ^V 2e:9/,W6Ǹmπі%t̘&%Q"_aTIfhǻE+@K.Ob$BpyW1:.T|M"g@Nx[vERg;!"wT{is(=/W(DSzTOD}ls([T:+~9g2!SʹŒ-/gFFi7+2_w,rQգ\w omzX}w_SO oh&պ."㲀XCy@+r`ԱN4Ƅ_Pw -ՋVav0J%V`+6~_{{s6ͳn+6ͳn;{?Mӫ,\y()3#FVK%X5p66#`k%|䴒Y8,oUdlH'V4H6]N|>@bId4-9} zVZ|dQjy6ݲS(zy{ [UUy*#_! Jw{ d[ǍsX=P3][bZGnm{7ѯ!+GŝV)'l`d("tpY8W, -]y=g;e 0 al@ˊtڻ57V=a*"*/=!H6l#6seEDE^}E p-DKp9z )Vg}Żzm H9v -|Dw@B[JeV.-G{k 9_Y˧<)E' @ m - FJF0GkOFl=N atj)iIeW\3#2'-uX !fΦR;좈#)Igi<3qbYCy=:oHV#!OWOԵeg؛x/ gtru#^tUv5qwh~Ļ2bCR`,:X%K#L _Tu/_wZR2(7i=c-VWE[~dOI =+k23kg>2䢨bH*Q kTŒ9@9 vfxF;uzX׮چ%s%.iX5շҮd#`0` Pdst~!ddM:2Ĉ;5 @6|DC;.=J5B/5rls5,=U*Q5<$GF+r;Ǿ|UgeFMjoZf_c1l2@@SLc[Z) YAO`4#QygHʟKaT]M4Fpd^+Θ&ځVxj%)Ɇk[,u!܁>󗽨?ML!QU+)QlNʞ_˥eWaEBխSrjo]$eZ<$dPz Ҵ*vќqhXG!^:KyZ'7/8қuB~ΠܰGsLˉ̓)e[vֵ0#ם>;(\'t -R߉oi1ђFsM@rܴn6@I3}nOXo!m9;i=RpWoWV+09\BYՍ-"KY+2$Mɖ*c?%joyᢑM !`ӡuv -8BG=c= >/""SONY9N>ezM]@<6U$_O/#ui R_|2,ƱdGI\ -);K(,}:nRJh` Sl˹M]<,ڿtiDTTG2Ej5Ư(W Ή$f(FfL]Ev--3QD++@'ԵʳɗpB*=>j#Q&n 0K4xniHjo^zQX ?QGW"6DJxi5nsL)=B2?yy7%nj6! C"Y33J'NQ9ROfc[rξ[&j#+>'a73/D%}D=zm CRŐ6=6Vaw%H.RN -.j?F: -FSO95>VwMX`u42 -giGW3'~A{_F zS4PH9fi(X &ݭ("pǚ]AnUF]"^OWWGf]zMԌem6, -][So9jd$ !VvR%Z,qjrsYf"Ρ[s ᨘx10mO!څVNt b"D-:EFV"cTq[[CһRYVs ?"אwRENc2TSƦ ,)::\ث4,CbiPi`YD%fyN"ub)P`]݅&?5/#j ՔNK$&A u-6d7P/OksAm㢯\h",y#X@ ,zZFYN0Jtuv dYI(FyA1'8qdj#Zn+mfɋ76ͳn;fٷ Ϳʃb|6{jaGs$ HR%b4:YPTmW?'OC*LY6؟Kdd䰏_?ῲ=Opb5.|E Jc%{|߇VCOc|o?ow"].A |lg1Gk Δԁd s[~;oHb#3P;2JOͽ˞y˛.l"ls6\sχlٲ˞yٲ6ͳls<7;~ch\58QfyجYI<#To32uE_qo&jU.jRvUSKz/M54;5Mu-/-շr9ⶽ>-ՙ)p8;g&-ݶ6gcnuqkĿ]9%~[Nn\+,X_[U"1̵W*5T[NWU[ՏkVo.>2yc뻖"ث*5Y7Lf_ډWkѷj{ay0w饕2=Q7!Iv^6/,Dosq,o6{ܺϼEg˶K}n%+iR6m,uެǖwT7N !1"2AQSBRaq#Tb 03CP`@rc$4DUpE ?~wx຃vPy[r[[p ̿!:'_s~wzM+]c&b +zB5tߨx#{˃RaZ:SoOcƺ[xRrI?99 0x.M95,,ZG4PbXP']juHZҤ\a#cnA/ysd⯟tǑWQ?Ozh]fq[6#ڋKK9udsn#aqX}Q^\.m`kH_;X4!VB:C5›Ieru,HCaMU*~{LiUӼ i,LMC#.+/C Mj``-Sy>)$b&2`QrnWr(s9e)0e759]>W<*^΢ekF3ACuwCN:.<~=|||S9cpG]pi>Hjbܠ_gQO7Xi EINfx+Y> -4F'jts+2[o]6ңe.??[Ԭ+f<8x.\Ϛ%j[rß܎ ]Gyq]F .m䴿u{IBܳ^t[aϬEv!s,[p^ 5 ke{^+e+Uv ? O r V,u7Z5{⛃tw]} uJ9cAXTmx෎[ԔrڽRܳ^39[.. 9Et,yj/~ഇ*|x,M.[> Ǜ=6S3MKPziϮ_`GR#=tJh -y2а|y ^p3||̝&C\-inӊKѕu,ǒɽWE1/(f4 XaY ~MM 5 I>)2\&Pc kZQ@_!z`߄M(d?Dţ Qp2`(Ykׂ0%Jf!6\!fCj`rADKqF7n?^Zꏽ;0>o~I{x2{8_'PǢjWbzh!nۓP-TYa\&Ԯa`~]iEQObx|?V%=.8Ի+ü2nAByoCth-Vn'B r N ߒ菡?Śϩ_ފlN~monuB Z/{]㓫ꇴ?`%*C-xթn&PѦBfkq>wC:B"3 vy+d,)ge ݫN|A F͔`jCGhi4Bi }4bvxeCj_%c27wc gh.3豅Ɠt)s BB 5JdXZˍ7Y+H NGH0Հ]!)䌛4Y%r7G02]⌹=~`CصܝB9i5t[+]0x iS0!\B\J0BBbWޛ_8<UojUw{]Atͥɹw}V$zf𐺁nݻ -\+ԂΞs?o:2%tu/|I-˹ v}Wd܌Іh䗮+Y: %nUo|\VyC4/zl zQSelosI!iߵu[ hqJ?.88 ֣six'M -5u78ryQU&3J6H L7KЦXZYw_Hx7#-C/lp[MCҷK.r-2 Br1 M<|S.6Jam!}aر[殫xT|:|\uPWJ?˾j2CWYZ3V:4]*NUG.?Sk ]7=7wnfū&.l,X_wP?'JAXvUl;:A [,X} dy5}@BXYLv!{pW:!2a!tptf3Gڮ^X Û.~&QG&9 9 -(-V0M|Ob2 -V,9%h]L-^hG*<ۼQkl3nG>Qq>_Ner2NO~qغC^·n+WD+v=2O7d]m7/{zkޫy-VhIieC'`ܷ% ׷4yrݎ o{ -=3$eKqzZn]vt[kդ'{(|-"_m^CE^±ŬZFVr .>hfd?+QӨ+b{fvy/*LQ_iORX֙M~+q3 -nq/o?`а9&Z6~kd:bMIa` dd:G&)KP#sb򯵓Rڵe-B0{[r GSdG!2`Xd=lɣ7#:ᐐahIɱ87skomɌ#;rfpl -Htr ;ԌMe#ea9$K(&EݫB!DZd/?YjL2Vr ,Miɩ ɩ h/X&!j/ẅ́/95!+El衣]k ?<+4?̽u9y-&,wzuv[p]P0{?ئC`ꟲߵt[+J?$a>hC;A[7/YkB9jޣpdv#xTzݻZ!́VÉ[^եP8K-7^!}ۖX] AW˭-MgQqv#}m|;BJBƛG!ߞMO6sڄ ~e~yx04AڍQGSON: BxnOe 0r8vɛE[$+[41ౠAC ُ! DRQu[hJTkC^3JڌV졤ɀiq_g^nZ\=(4smGZ-mo?e{Ve6kf|<π්vkism}F{ -K?e/`g]ng,yw9KM^ Uv'{ҷunO Bb - o[U%uFL腭"mS޶j-nhGFkɻw ~8Jmm -^6,_UĬE_5#wɮ[PĽnܷM5\-TǢo7ܞcIxF{g-]k<9n-WY̨[> -޵N]px-M[hⴹK -6]V[-gf\{tF4k0d4*IZt}0ha X(ςÇXûX,ZTOIi6w.t8cJր Kũ!u:V!ୁaNiX1rt -.Fiڝhܯ|@XwHZ% 0&oGGMQ{Ng~ S'B7y Y,)\%vG\nX';2:GxJppS}g_vɄhUuCV[ՎsJrr7AFo!}i4-*CUc&RHt#`*.B*I/ꅱoO Ow>-ZpC=^_ߓ+F6Q!`t]`XXrA VB̕*l^88X水~kDFNDՋDq \}(icXց](HɃu,]b_ugQ 2~/ VC{2^ g^~Z7,F\s~97},}#5_}e@}1}38y糏(u8Zص,&?"lM0W9M'ݘBAtZ|4n&بܛ -C Y[<ؼi) r@/h՚zjIh/FW"@iН4Z(Ȥ\{":<@>KZߚؠI2|"uG, ##.96C!+9u@ZEroZnM[2ųcX9qɱchSf x}#uJzWݴb >s-6C5-5cb]R;㓮FIo)q=^97]Pc&-uop˽(|rl+[&Eذ4I.[·_b> l Zmj\u>ěA}ry BTw|/vpv|Uťt\Ҵ4\Sro.uf\EBVx-F2oJ+kBP\}v93=4J-.a 5t=$dMS0Bu\IX~CspE+JdSbْrknAءqA6DAi+Q-$APdd2LPɯwPyݟG}Lߔ*1Vk9Hˇ՟(CCr9 -%r`rRSCFQyݻ>Ӑe7({.9LX 7vlLCԎ$x.S-:$Lg7d.ZG=۸*^ɵ,#"% &h.E΋ͦ K=]ickObƝHNy[1幖#hX'pֶ*Z- sz.|*A=mɽ+c8-Aa`Sww$|p[.*-V=vq^"xX ]et]溃-֪\n=-rd۩4(Lq 2mq[+v{+ NmgmoO=۸-Bd'֌Ž+(5LM.}-l-w'ǵ ]BCl *_ީǺ_[zPVeݭzV[+r HHr#7Bw>KNkNhZ*W.>-!U^%<^ж-343A>&p!w XaC(̪(\g)Ȼkh[$s͕ŕ!b@](ޯPV90sDd뒺u''@%`lZ W(kCLXBBwy 4B`LE PB菤?9O'J9?R~ErnNnF`v~ũ`Q :w6x. ٔ>i녁5 MX'&e΀c#\-Tkˉ >E胭cjZ94R 8&n%v-l+\YTFI]v{D"34_<4Վl JGyZ siKE8žM{b,ۼ6j7]Q]Gb&2>K4ݰ1i5|ԗX[ź ZU1J˥Q\$.Z e}o(h g;k/ ,lDkɬBX9䅋޵ \ZՃYrѤ! d}WT]jg-TXQr*º-jrݮMZ J8ZZ\}74sٍf< C\cP]'Kqsi,q?n.˻ B-o -3.FFA.y+C]{10p -[b1`)F9M2DFWfԼ P&PU+!kÙ3ܷCNJ+Ri'`a&r~szĈ+yN/ai0M.^2!iUVGX[eSZB뜃uaXcQr"l_fY(]LZ^/h[T`طec̈́Hq}Sk3s*b/ ?9^+S!` ]&~MGÙqZVa;Nr7mrt"Ci\ :e 9iYBLYPBr-tD{BbW}V†&P@\@,A9rF8pԴQL-yM #5'A[%HlŢ.Gg5K$'f¤[M;&%R) Ѥ6&I*crbxWl6 [sU 5 - 4@IOpiqbmDUc=ΥWDpGQG9ܧod(H~jUoob-uX!i->.zcBho+\ aLY}#ZrMT.XFMW͵ʬ]V=* ylp4<ոhq]PĭWzcܴ_ھ.+|VEky]pa }д(˼Zh-brn4Bҷ!_ax3 =WXX幏$џɲ<֫nB3NJ^!؄ ZDwk$!o|2Kٿ ʬNR8yڶ90cKѪG]qشTB:W-&}BZF >e 0TV`s҆k]U kɶPZ%`Dk)Dnk|VFVG - MZh 0Mj"PM/p`g/DABB&+IJ&m dd &~AH\fsVbz9~~kU!~'!'!'!$ϘUg8nB n#a25l{>j0SjA#A!U%_7O/erf|w(gm8Bƹj{EՐfڞyP=.pUȴ<2KroUΔ#}-zWg(sŐEdƭӱAⷫ)jhs^IOs#s\<F2 jҩiS(G=Rߙ]O>M[ǟ#=ɵSs9cu?F %}oՅa}sdboU(]vVmomOta-@ksˀZGMYpFYz_f;Qs{ϪGud5cUUBWw`[>KwMM [+Hro]w~A赳.a t_h#5&b; vUoCa P.>J>WJԄoi!`!bZBoT2'&6Z徝\V [І{HsV=SL(GOjd`,h,c,K -ZL0LE;6E{TmBB -9(_̐ }7nB_L*<5@;V4\ tZǕ2g5/ ڏ4!V.(a[)MY⵶|8:-<W&쨗з(}- 6X+#'EMOOJ֊r]rtrQ?"DFCsziftej8!{X1q zT-TrVK]()WR|pZQZWpɭ ]kWٰ_g9hW*3(]%{oBOt]7ݓ] N -8=lsv ~i5`OooX3ߔfdbBRpX2dw& /ˌpBD+oިb\ dWX\Uym;JƭM`3oP78!Eթ]V1Y)iTom;`-@vH^5%is >*jx-+0Ex"TuaϱlQϦZCMxG9iCHͪ+V6<8(}8ިu@V7nູ;8޵sGt,NMA4[m`Dnɨ!D0x,L5 `5rdWu BM4]hw_9e`B!1q#@fAh녆@Ma!1Hf 8 n(\BZ3pM0Mb vd&w4h *͠ #\#covc/ -ujɤVKYȈ݂R3ka[-KWpFKMfO Y0Xke;f? 遚v^jhA]A2˔C$[>K]f1-{iXɻɏ|YNG5{~A'm If [rek.[!j҅0|S42|%nl QPRܷ[t ;ZPlBݷ!C0^x-Bԥ !Aj+f`]:ȿ{M[2o__-7m ,9(&@=qކcQs!`hB7^pp+[x!m .V k Cxp)7 2h{н{-!^Tj0dPQ56v*rމږo(uo_z#3Di(Y`c(Md6X3Gz]Nj)M中688&.jy$¤ *lɧMʛmd& 2NgX2H He  3O(?@'Gj}mSbUΑlB04UƜoN!ݳ -s^lů*ԣڐ?uU!jюbIUZMŦQͱr9 -JaGjuf -6 ŧI;6ZO0U9H95*flbX lr86&¹I+7#i~ Mo(g֎^GMy0P2%Zn+b% ,8À4cWzaa%];_%xoviDǸ!0yp`Ή71m#}ѽ5ƛqr7!W[trVNMkf2{Ǟ~xTXI>h\ skV[ e {B5+^r{h96aQL\h jW>-Jl!},"Ta>,-9i [cnkfOkIs| c=\1JxC.BWxZjxV.G y!}*/u+ W8T+]"U/NNf\{W݃>*ڄ->fҩ⌹wyG |QゐYFGy('U(ƣhjtǂ#Hrڄ܎hZ%moq}!r:Q SWݷ&,H'odo/Zt6%͵\X+22՚ش!'>#fBe^C+R?0.9:v}~ 'l!# M& $dhh##v)!!  a -+0!4Zڀ/0Y#(1Zn+DlJjln] `}FA-$!Ed -Ԍ=E{tg WDYFHhTڝ/ZF{-2[jt5eڢyC@ɤ,Y)Muޅr,6K) 2fu- -x$t&@ -Yi8!6͊'Z֍BA@!kp<6q. Ҧe9"@ *7QTTLKH WeiuB. 5JČّۘTҤ&ۈ) s԰tY+5&*C蒝_v,N!䆍fMd, a{]ET{ -൰{C $-VɬB2%E[0u-7N[v=2c}ͧd8]ֶ4]*+ēmo<Q&C-;EJ bnmBTiG)G5ͽo2K|pF&0co2|>Y0J+9D\{#t -%ü * L! ;n]Ml:.;PX  4 -+Z[Ew ]'K}tlaεucb94~AثƠi<\N,i֝/A׮)InOvŨөmbY R{\nU}W*S퉼d!uoOYV4D3UKټsbr{QγlMm<= TiPg5A3}5ըka #iLZ3l2f l8~K؍М,UY=ܜUwjx1.iFrZ(8'#vglp=\Q$B'b?DO)QOx:rn%H VB@дΫpTзbwyz dj$ \HX4>e C< I>kZ'3bΰ%t 3D٨%:,'j ZMoSa67VDZjigo}QL!a<ڎkcw'.Iǜ y/cZ~J84}ZD9`6汲HGNLE7yʹ>*tе9E*7Fүx=:$s%[-k:ۓ*jp{\=IXchٔ֎옆]j(^Aˈ5U떍6X:/jj@KWhX6w,,?+oD|${0$vZiXdVFɻwىv&_u+l+Jyw#.~HiNkmMizxZeP\/B?^[д ݯbX45-ɺwjPR5W&ԭifaKHCpum+t0 -ҋ]0r`^=<"{/NxgKBѲ8. ,@tޭꕪ_iUr [^!t*qtM۸.վ#ae{G1ibJ]v=iP{iSp*@^nG[֬J[VrvkIF?ڴ[v y p.xv9z铢WP2+y*.[n[XK2nVu]~UÛHQc Ik X6qMZB¢[cD>˼ab !S- ec%s_JauL*o:M!Rq,7!6CZSbSh,;mͻ3Lv|I Xp ӏjiC(2`d 22.C Ajh#QrhZNdd9X3MB``n)r!-ەkشaН4Zjvae9[E9 -#5jU#'DJpc}@#})(EV' $͖j|)0 *]EjWZ %:ќri<6\sox!f6{ sG4Nuh&- (ڣTrxmviymZVtԨVKrsFjõ4s.9X%r\%~@ݕse ^e(>7w/'X-t#.Ł-+Ou \[ź -.. -s7㕲qPlM+U_UabE\rc ӓ`j?}зÂ@z.\.88.Ǟ5]5'˪ծwo?o -cJܞ txdޭ`- )@[-+WO m꥗ --'|t[JhŶ4*Ž/kN5N a]rvq[opZШ%V-VaeNjܑ[_'C:܍eWYaiUH+ 0ɬ7s?{g&6'i0X "\e^jk`-j[5,XY`F%<4^#'ٖWo{q+tg!Y^x8Ǣ[m6DU භ?v V%>"5yc@9SlDBtSh ņ˓d FV30-CG3a78tjbņB|/|)`dl0/2VyMk.+Xd` o A`c,i`+"q3rl @;S2/}}Vjcpl%Beꍪ#Zr';u-i]<sPm*T7Dߩ2FL+td\pҨZvä{GjPMZ!N$&Fb&هB]tBG;ԩ,u)ԩ2+N&"c2٩R)+Rq`#ݕXwZ#,LBM*8NQ_tbrF,0rօY`'@ns:m6Zrջ:9yW7&{`ھ꺜Vq[R'hjڶ]4W7rgtB|Ecǚt&|z؅G[LZbuGD+SaD -96ofsSX|_ޱޅƻKh4lϊŌ6>kUЩ?5+t98N -t-u%h5%Տ/ #kGsqZq[2Ûwk`[& ;1ϳN@?eB]52C2u[&5V/hźw1|y-~cx{ cڼs-XlN{v,Tl-To] V zatBŌt1TaD3Jw~LM7pF,9˧ TX ru`I8VBVYX>|BW' ؑV>%l]6 DPʽR⺿GSFHJUhy,K佴\u]On|[QܛuJBhVǹ72 *yMjEʝl2oɉ<8iRo\G0"V!bI9Zn9Ŭ!tB3"FGYT֥؁9Ux%j HB$sB -CUgR{kGM˼'a -$:Os]'IؕqJ$TbqsݬUWٜ%`̝:qY^@yچ8k^o -8fHhTp#(D@N$].N -}wgmǼ v'(?@[I5 i2 -אf -˟N*ooxXҩe7:jWB-V7DB9mSt繂LjGl(Y7i{ʛrc6$,`.L2ɅP.;Pp.>Ё 5;oG!Y{֤ 5&v*o*n䁃!~ h8= i4ގo:,ܷlɮSjkAt<~1i T-zWM+2 5oJ O\vFX9*;-NsO%˯6F0jĔ5+OA:z!>jYJ:A8sxؾYB\lXoɎ-U4'#epB,74~@?k: &?k܏ubpD}nXiU@(ܪ H )*N' IПh'gаOb6@M7扊Ͽ|T1pLC|ٽbţ:]F _kM?m{u=vD7>VSтϲ-A ,i>Y:uGHFaWMAӢ'#헎1dV/N65H['fҩ21O3ndw<>|հZ4޷nxݏE oܷc{V]P,[[k -`~h8w _PPV[(ߓt rڮ{;W@B WJƫAjШb6(g!5W7tCIVM*7v+.Www|xxdŵY U8,j9p6rn7Ʉ3NZmd'۫/7.sM#s{tx-<0Z+ xGY[}V -V-"$xCl.{wi6[ އTj7]@ +ݽ-1]+ 5 | +*1,up]WqCe2cRW7'QvqɡDYyp]>Jb=o[TBhW(j+ts[n]M~nl98K ̘فV/hxɁo[)tw{nFϵ⪼f9ZbBw+9:}Uof6Չl%8 c8`ƢLiX!'e[Zu׊r>Ҝ8wM2{Sm4PʲM@Xѵ؍pLB, 3iԗ,qozΝA2)6,M |95ӵh*x Lq;'U.¥a6璾֋*\G&keQ'b_IδM&W\gmYTK)6ڛ.*`_KgP-uptZ[xx5W0Adi%ii޳}x@ݓ+тÓJ}-]|&ْS%34TK¾ҫ -UxUKV%tp*K#e M3[ ?!)Jvl :M/;ZM؈M CO NUV،P6ep`dp ࣆ)[pr'ݩ2' :fR9J(?@9-C9a -O?͞d`}+nPupصV fM9֚&aõjV -yl[֌mQZ2^<`BsqG.I?~]<:WC<*f{VZe1JلhVUc*>2yUtktkO.aeeV"'ƣť9?%PVTW:r}&΂KHn<'Ry3̵]8gYM[2{SlO1-ھ򇴻dtb%VfLuQq%?,Bk ޽S\C~kvV!isbkVA4H@>xd~ʩu*c{/lX<M!tXVyZ_ymy^8;Ds$vڵT!aoɽPqзlɿ V^#{iHm|̥Oչ>u l|5+z웗L-aq.u{]RJVsEiۿ%ty&~d1au&VS 2uGM> vd7mJWY>ZiS;4eJa fP9X8B޺u<hSjp2,HEu'4UZ&DCe mq+Jʽ$n&%+J|UkJ>JyTpRֹ͈]}ASLo!gsBH:|VosnΦ%\yNTiU],6;?{v sUlٗwd?ݻ;&/wty]fq^8M+r׬֦eZdaܮor26\,FQA M Ɛ4ɢY$1e֍OѢؘhɅ|@??T(F]K^تCoUgGJb~GfB,B v'ۣ_W5#,c=^ZMLK6+?$m=+^oj79+PFd5=DN!br@&%4ZĘZ>R1!4{ -[z8ӛʏd -9ҴڥOVFÑq};WXBigDSk5M4pskӁQf -9؟gڒF! u2<7>oDxXx J#&D^ -ܭNZ/jC_ yr(*~rɃ[(_Y%ںv=Ž(*ulU7m+vhԨ̡n|ɸ֓!oJ;r89c;B2Adz&}pn؛>؄3[dmJYKݽY n -sޕo]r LHWj|Wz,CYn{G Jyp.(`д(f,gG?%a[{hu\7S?D6$3x~oۺ|ʭm.ţ.FoJrq-d`: -I)}Ŝ;ї1ldub>ATIڇ$ևpNu+1ڶd|UOiLRU45nx܎Ϟ%8: U9QĺSjXqv]MV6' `\397CHګE/trWC| u<%nFi_'?llh -67 - D*,6mM^xׯ(2%6 -{`M$M2WR8Jg:uc+v;ڲOrq+ˤ憬sH>+peY4rQ7v9uW+<8Bu_\^5:;!MJ$̎bnNV -D{HZD1g9JW%.78,qcU+9:-%r`1x\(6yrj9]X6NQcljN&RsH_fex _NIj;f"em9HxXk-QhjFa`mRp0}EF+})}ºC꺵Ć}d|3qGIĔ.{HoQh-m֕N6I j_% ݽcε?5.*Cd,iLp_lڲkLhcH[ϊgVpWӸktyRLEQʎ9&5JǴ&Bܢ.(f|,43|8.xEi*@k ,0< -g\fل%t[掌̣W!U6e`ݐl,Z*#rs/ksV/t:x^i4(\/'T3'ZUk4f̕[7`n6T 4bқ5YH&. !ɤ٬M9]9odT,S}FX,6P.uKN -Ѭ4ϑ=&s TVι0r*.P(ďkQ]ڴWUnUmÿ&ddtE@btu*~M`p~V`{.60;hՑѭS%N̴X??Q/6e /a4J_a\;Ī.u=nNe\Zӊ6o֘X6[:.$w* K -Hִ\2`7o5ݢ愆Z/lEFů S^%̵f1Z'0ِ=8XW?"N4D|HOD'ŷY<3SŲ$5ThqJxhshħ 125Ѱ0^Ht=hCLyG(rݔ*4 ɹɾ(jWk!t~MU<8 W4& ՟<aD[6[K8K{@1[pTyM*ċ'c[wN\W6@ځ5ڷ_MKr }MkyZ7ٝ]HWJO<>s84ɸ+킴]?ݻҐϴmёG'w]jjdS`q-Wk^趻@ pTYKsB v^+C茚k=Qp ӛ;1잰h!)Ƃkw#ߺ9:'#&&<]V/֏&zd:ndl/g0aʉ]SroZMϓsW0b -Z{ -'?{62ش]NGUjЬlON ֫76[TwwvRo6IUNq[5ṣ䫵ƽЪ:W\3 -<5Ӎ,Bl\E H2 -3EVqT>˝[F-|o5qڎxu*ywr,ЩP5*u8Dl_nl*$1DӦC:I$'.@Y`zV+HB 4(}k?ClpBB6; D LPA &GfA TRp0n980Av']qԞ,D}\.G*UL쯉 NXLbt4kUA;K3xpVU_U fP-75ð(ܪjp:ZSA1~J: TkAS2i3^ VV`vx-& njֹN]~M {H\+W4m}lXɣu;VVa6ÛP 2j8^:U,Xa7ZTGWhv KS<:>pPoZ:l3M).of'9lVR¨Zvuhca[]4Sg-&.<܌vnwL9U;;BѤe`Q*4r׈rb9aM\ū\IEawKB8ZzlUGr'-n{r:9R_h2v]M[,#&[\l=c@FS$bC08{oi脆r?4BBc:^/U%j7S龈fad' #M<;YD<W:WXx=堵 !4Fұu7 W|YP -P#u?qwnquNS|ߗ nNt)A;I_.+]R -qC6lgW!k \%h>ڹ3ͬ;". ݓpyI ӢoַwdP ǚܳnMQmNxp[@KZ9x7D3jճSkcx-zUi$o -dFP7Ptࣝ)-ࣝhmE -IxO&[]oSsgtj^<4__zl9 Ҹ*g7e'[Vdnk\Z<'q^OS.2hA\V94-+A |_N{88}Vܛ0LjqA)Z, B*PYj~XmhԇܖU Ncd;}'6@"ڵA!O9]\Rm;@iaR,[+M]GP6lJmpSx{U#T4ZU Ap1օA9bNGv[֬_FE­0C{Po/[iވ,TV7?4uu;biT"N5*Ty\LZh` nsCA-x]cNu°kCG'2qL&v`ؘ08vmopM `#4_B]/U=89BT9vl99M?5Y7JFvephSÇbN8NWQ>Q.%ԢA؄٫rmsfOy׍WeLEq { cR|Jl䶻@lwp@5%G:W2SK4f˗O<7wwy:',~%xy>w/Wj97m emU3%QV~I2J퓓p F|Ӧ^/T!tMtV -8&rdCM o]7X+u#A&qʓ!@G^+W%\WC쫆Ӯ<W&ԭ-!{%k例ҝrKIهˆ k|==ȹ^\}^z?v =JɌM&鰔fb?nºcUo\S9rw@1uMu3%%QwL0Ph ^SF6I>9KK׵]*M ǹiTrqZ@qIƧ` Zç2қ-%q^J߹`˿eںr XKVcΛNѿZ-Td6}{vZk&<*,?^ReI?@ %2JhLq0`hn"{7:"rQeyhSs,iSdmh;1㕲! * .ښ91ؙAh@8T\D*J8E}$ !EL򁜴,x)'!};$) wKSՠƤ7؟RXf'& -شf%6s8"2Q~owTۃ+burUSRSV,>h˨ܫIc{tYcljx2W٧iW"30 -F bNm_gWR]މ}Z *I'a{$ MwbZ5Ӝ/uQYō>(m[v3rbD*f.n};;U0h|pr 4*a字٭LC0FX7vU5 -.hIG0e:Zf$#,xU\ rp8t]UeDFI\k6w*|NmI74m*jk"{uj9Ô%L L M.B=Ni)ԼӃX ᑤR3HKHXRcD0MC{ߩ]fG@]%r{`Ws6Fieɘ^-PXOJ@BE>i9&溱xWy#e x*ڶnoYjgVKm|r4x[{- -ra\搞Jn}06dmoɫT-H͚ h6m6φvݤT2ي[ٵ:Z1?m[㐀FvLkYc~'J[pU&'RP'Y*Ψ]2Yvku~_DV -';'س.Q`Us)K'CBihG C¿yqX7;8ZLU,T99ZG8CjzT3!eF`چp F>K]ތa BłHkߧ`lVQV!Ҏ5 -&.Pfk[bUq6O+U6_vDv&ŗr kXBʚl/kx.NX 2,[:ZJi!=+`|P$6yL*m'H2O2VIWnJqmC2".Zliλg6[7l֮R ֹ\Je«maZ -宲cR.+P=Ψ  ګ1ѰS^׀aI(AݐI,CU vJsKJ'a} I4*w}+`2\&yNgK:]hb5@3o@T:E}@s>Ɇ?8Qz/gُi<;65'b7[f.LB{04K,U 8׈r2gTyAXp?%ɽvc:BƫiiJۋy ڛfc'"/n tJi2Dwrl5,iZFgӶ{DJeđTih m`t*|8c얦 PZVcr28ga՚Nŋ@>y4A|'fSd$6<4N :GA?4A/VVYc论~k9 [q8GL9Cw0E7آ@{¡7#E7!*\՟;(49{rn2oWй'կn^,%8/{SGI5N ̝rU,1 -}Nާ#ڥnfռ[p_9)"5A** k>XsQÂޞ%[.U0^l/y/rՓۻƥ!kp aY[:zsv'<9Ml;UZU GD^ S VJŜڹ][ԟ)I\:ےXlYU,/ޫO#:,-6!`ђfdv^7[by\'228d<)~Jic"I\-9<;WiiABΒUqMNfTXcrpLV,9Ki;ϥXGP!=Qch\$|)NrH(pڹ1ac$B 7&U T*\ճ - &\Ƌ]ӳH۩p&ŭJcH5f'f2`6 =iu"Jcٹ"㒍BX)6n Sxe:'IUN <h#4EZ|#XFnUēm)X5{0db2 +ӮU=#s4̘*/o}V˷}]ܱlEy!&d4U,T{Bl( -TxhάQh!4}!Ҏsj^+Hn}/AGBkCL_񭇎G4{I9a׳l*@.bu1ɰ=yZ0ؚ,`G2sG6W3#i9krPaf2KP"qF35`-vB@t00OL;I^ M8O2쿬g-W57x9HriTl.Z<Ťn>M>QJ{8tG6Gn\e'52uJNqщG>-8eܻolhYyR˄bXX"HqOs\VϪ\ԍ>*,u|\rlQdUZ'mp[o=J;UJO>HZt:h5C2FFڢ~eR'q=Vީԇ' tj_gjA[R.j$rCOh-o紹)ݨ浑+WYW*wcIgbֳ@hr=8.<B/m\ G=Ow jX١zJ }J>!Mf܆Ee:dy'TMٻ\48!{35`&WsM9τ!dd14ţ!U5i3xjZ2̛P'x-"'1ki ;'S_yi;௵oOn_u܍V+[b+{mZk8%qlMÕ6 mLUpCeM }9M$v\6#ECZ[f]fqX `l*.lr+g'>k;rf֚^VLV>9\BĚ9݋~ `XBgR24d46oU4Cg ד_frw ؟Mb?,9|HVP$VW63A^ ۵rI?5:FhWl j4㤟mr8#P]Zio UnM%G8,Z/Z_,ZNa 2@c*Gzt6\3dd|==_ob"Usqeùf 2FsU+ܙ,owzi ځ)5bmLfKk;Qhͷ8bIm}]ͻr{ a[? 9FPlG&6{$6;,퀘}?)BwÓS9U#iR3:^le~p@Zfn¢i fݓrl=0`¢YBMLAo}VkA"vL Dj --vY]ʋRkF(i AB%Zq B24N܀0B~iwPŹMRo9gR [Zi8ZT9-ԩTMM I<8\*`?8U-F(:ĴSd.EG:-: Cާ8ppqk [2׃1zt1z `5Oi[;J :8,0Òkv -_)ۘUXхipUQ -ƞҪ58UVڞ-ŨNpU3NJo\]^㇚nu>ISiBK L;*Oة˾)2(-&:+G̐U<=6S-W|l9dTk!c OBZtF{C.[m,=JlGӪmZ^(Nųa8;?8Sh {BlU!_Ͷ35^]c>{h:UO 2ңoec݊ceSy-ZΗX\?c]UqTnڇ6]YU%[P\9 @{>ڗ(kgڻx[*\Dm xWb[ | ]˷M*9-;Ɋ6yC[9 [mY0hkufiBlR*}C>kOv[jUC]]GF"-1 ʚS[^h x \?C{VC%oeJ.C*fg |\Tfr˵vxd߹_Hg7>YV8 ~|=-.kMqwFڰ0M\Nhɂ< X-MSichUǽνIந^M[πBj_^|sN-H{pXsNcij'yiBjTqrlofY7*+ Zh0HMCgTYhlύIʟ"mĶ)M;$v'DKχ | -mk C 9I`] zmehL; -i4fILY-DeXqdROah"C4gE.p|&#B L -e:=<&m-30iX :~/ې'R :-14Z8_ PB*2 &=R|:YH:Zc婮iZy$cAʭ|lH->Z׃H:ઇ_SZ )Ufr -\b`*Jp ]=J# *N)Aߔbj8PGɠ - qqS\c ^.*@К>QɄw T/&W6aMڵugsьI&6I'L;7;C9O'm%fӮK{Xlr vmY]NCSȷjVJ/v&SlѣLާ:jvs6Hu76j3ض*w:C{|s]fz{ǻo&Љs4l&ik{#erl3pj+,G 99aصQ|C)0nn#d -{N7%`*fXhx,N -4;wkX - c k 틔7m}]`cQ釚ݨDP-%qZTl@ZHMYCzf״T24rKܿOZJKH3ؙ5:|V!쨂i7:E=+oPj6*T;&sVC~i+Nj8 syp%sIMPʸu܆ci=Gp|__O6-3[ xNNCڸQL|QB&6Miܢgc1B#!w9iK_@\c6㒑 wH2#Z>ҶQԞ*ە[% kiF5L 퉹 Fxrl>k]Rwz)?0< X}}TGc8fJ{Ea\MQQcLܯcW8O7ඹg QV`pTae%VAo< ɝmrE|W vyU֋Jcd d.~kJ~'ɩ3IοQCs+!{S,sOf~+t N.bK<hTt_̴l|y_o35uB{NA#s -OηͶvdsGب[s*^qҿh.XNtU@J6W(4Fr8k\(jϲ{m`^duaSjT H>ABͦrW>Ls5ɟIiU%8Vfױ;&T& sN9ؤF NGt[CD0/(_R{`ʲu·i&.ӭWcaT]a~*iO-bx~ 0{ѐUOmg89Mc'bt5@5:;}NvՏ%#u'Uw8M:\_X _h뒵jBVx.fU|{/OrHg5؅*?1+?2,klw Ů[R k;7jykcU28yܛ}(,,(iU)`EѨ9Ra.*p۫C{NRs_z%ԨՊduo- -}52M2\mJe-ZU+\qWoDs6a>K<;r0:%o+-*^T#mc0]bRbܗ%qN.O>պNq~ȥsVխ^WFL,|*d;JE?!Cb' Ha:T&ojmgzXf\#7?;a ̦n&y"6֧c]2\[J[4)GSd4u%!qKv l 5Sgd|ܣ&:E*ƽ XrtH¥I4uH3% һ$x=Ñj+'XmP+:JZ\sOlP_/CLQ?L]+A -B DT0Bn"ָT^E%-kKLF \Kp ^ņ["`*mxZD֍@@\JJ4" E-F -h2ɘm SlL 7*,ݥPؚƈ&qsi֨1m -ZbM0I&6NTCo)u7wz?*E"$;WkjXNi:,*kvP-Q]Uf2vQ"mjʙ挃J`*^;Gi 2*Y8I]vSGiQS=Lʩ#r{LcQA2jb&g9uITÙVEiP(Xw!nSM8\6GjZ-G7;isJtvӀ'C]e6Y\ѩ`kPdyS&J4b70vMgʑ]]:'\Hu¬njM6ʬvg9!Sp熲S[Pay Ul}{F>4ffvyA|=IxYF1Ӎ+Q}it:m.QIc$s,ii(6*f9bhc܄5jْ)Q{@lNM\ΐqc UrFJ7g4'o`2I%t[ 9jv^Fw)<_vl.H r2y~JKT- By59hPW{W A0 N+X[ܫ-ķZla 'K %] -6)gtSN|׻{Q4U@e}lx@NvMӸ*eI>m,JQBL9ԌSW*qEZ u䌑ΒNmZUHme{599ٜ,@a9)]OIE=;ٖTgrbvBݷ!us*]NZ#lC-gDv:HgzG^m(b7+^@pNoJ+hz.?5>EWF P\fRhŝ>JW~&Ҍ'dx_⁚-oWKՃtV9B&*?ۓ@+:̋rZNyʣfmFXXu -kЮm9B{l<ӣh8BʆApع4Y-9s ޘZ}}VEZT6VISR+"9] \u/i\C\Jݿ/SRݹeJ?HTsZif45'7.IRbT_Hќ Jc&vZְU7ksQژOƗMsZM >}{ -,V@\Xdd Fo}J9gv[>w"# }6%{% ssu,NJh%ksGB/LM=C:e}jrd1xA64pMΪbcr<>/΅ \ld1sE#NrEҮ<{M.8V]Y`t_]UcP8-b!1ifv9w*QmHCZ.[ĭӸ.*tS]Yj8E;,]q\p}sxCg+;ynͿܾ.9kZ:Y`g&ZɅ+U]B&KhwrDF̸ѹð0r83oG^еKksQXo]:5VgOfm[]!n\D:rV?䴹=>k]w#7 - -Fe=FC[hObcKg+O.VUņAmB;pV s&6jrط1c%Pi)Jvgg96s,*sy& Qϡv#-{VYuP ,y.i^n%nܵ򶫛u;[/xjwpUۙJ].Y+{*ܻ pRO7bj.yV EEAք)S&r`EѾfY*y0 nB܃KX&3Ik +E%SsdnLm ;h!jȝe6#LkF6\UuI*ةg&Tgt{f'#mLkȾM:.)4> -l21oZ05^ 6&9;5DtDnZT]7i@޲mQRO1L{ʬKHƵ.=-xRenhMu -eI_hͲ0Ԝ ]yjC Nmst|ЎSBŗnŖCչ3ڹ}ě&Tԛim({:βHs*J#EbbkcoX1HbA6] Z(e3,0[]Ty܂^֒ҳsId*v-!\}1ؙb3aL=ϫb - qՑ"6>shҔrC5b@:A!.\`e`.nñ ҄[GxAժ4gF,Tn>bS. -!rr{.{hr2)Ig8>yP❗;LLf䶀\] &d uj9yTsˊS\YrI ܅y΅A6m01ٯK t[wzӮPh?;&lc[[H\\VJy0.yV¯eENm4vMˑ5,K亭sa>ɠK-"yꙇ4 Fmcy9`:<䩽~Cc[2+Vc` -n7"KC߷'(4eםb3`4mW%j7NT! 0Wra5n[ -t$YPPPjpZ-(<4CCcn\ kZ|SҼI7y o7x5;74CNҝ6(-M ! r`CD͐_Z.ؘɚ%d 2TmfWAsPfe;Z uƟ&$*Y[8m /5ZX/඿Mø#n5FR*wUU 5>c8aɢƗ%Qi4X?ɺ97OI|ՙKi'8YqUKVN֝ErZQ} =GA;URzҰaW&܈+1hꭎU!)7 \O;qM65CU#ynTDYToINcNTrBv H8 ¥%9}VXu&T@z= /%Slʣdxi!.=6ZDg  ̪ -slULɔ%U9e  K\ ئف&r kd¹6pILc O6RYǤo94^Plaߓ kS S09GGM&i>csX&Kx98 t=`*vZ^≰ɉ[5]ґR#w(U< -\o:&li;U6 a͝W'js'D2*cwj PqNtdD>̤p@dtiU_س:!SZ .vΌGYxdԉj|Z>@s2W{>QJ洹Oi!bѱ6{V@g4|V͚@VX&/օWG6{gR j츎0[jnY [.u[&Fne*dYȓG]?tOf]]``b2)RǸ-OhQ c1rvVԭT&@WFV&Q`Y/ ~P|X(ڷ%ti7ޥ:D`"EQ̑zܜ*ۢ'7Es/>ScI8 0iJ3Uɿj}bEǔt]M?%8Y;G7Gq7iF˛}@8zʜZLiu/r,Sص]NZ0*o%iJ6ܽ忑:4?e+yKNi]zdU͌|(U%+^SÜ"Óz/֞x5Ʈո?Rzoch"nPޫs}[-_w -.Uto\ظ,u(/s@\m;a W#Aߗ[A䮠EH ;#ڥ!j%~d->P4gr|HXU`8vJC7-ZL&'--p%AqDo8b_ 7ɪ';S24y==6!s0ō&ب֛JQfLRpKްDT /U,vkKe{ڪChԴ[Zfl<# Xԩ.P@/M˔:@Ɵt9M0r<7z1J&?fm+~3ik)#&~Lv QLzUE6\X -4I#<턪ewi*܈եͶ|6]n@%6Úa͜ˡQL d/PA]QZOt ܹ5[mamis vX4y8k.iMZhX2Gbʽ) .pp mkWgW]`6C4]IoCLIL\Q6Yl}VvM c\E o@!ڴ+~^OҬl-M/w|\rn_6+ڴh> `r?N`D9`Yٚ e4C(}od5,Mi}Mh|I˺g5ŃG41Z6_gHT@rw29uG^&?as -*8u`@Yn5J-ڳ7",Bp )S;Q0dxқin~a{Ut_d7O}*=H=Ewl=3:309փ\V^{P< UfA/Z~Sx j?T (y-ު4/BMWԳ{3Moܙa' -tbٽi40&n}:<ա0Tw.}ۓ4aZx;ٌ.Q'J,Z.ahvߐ}sccͷr8Sr`DX*`]|P)nXiyjsZ9^>K4f?rp3UU->+fCG85γ\赆틗8.S8Bw9QN\"ta jsFN m*wTҪۭ ?I˔myW'j6fʭ͖ ˗d46T\ ~cJt rhrTk:);wU 2f=<*ƫƌH;D'ڳ9R}R6ejB4RUCVeV9 M!r׊6ƈ Md<Yڛ-r{3mVuTլfGP6ceޜLA=cAҋs^`YF͙qI1ri ¥W#K\cSsZ gmDVsH vS?0S-Ka2[w4 6u'CF3SsEkNL꯳&l!rWE7ڔvMhԳdhT]Mzdm2ۜk$HْXp'fqhĦ/vr796.Bӂm\M}JmlThiF\3x V&O>H#:OiT4;"S5-kU~K7>To#RmM]`KSs"S[.o}ΰ>JgUxgB t+>sL"4~8ulASVP8H[ai` M;\;NGAsd[P-s7&|U)ʣx\ʅSּbW pj56A%\G,^9Zx5rRqlBk&%Z6[2D ]f`2ZQÓ+q]K?[mgR_؅ :U9]o[o}N]rن^Xw~Cf/3sWuvZFjg6%VnWʪCSVN+sD-] -}]EZ/7.{ÓCX)亳^8-tj9xsյTYg( o&䖼l^YHMRi6w:,>+Aw}EZS[&h-#Cmա|.%鸼x,ML]=jߕPĹ>K@S -/a4ٸwRlA  S.~fhpSlבγ,TU p*G9ergstQQs+'Rwa!R0(g;TT2r_/besVHT2nrmϪ Sk1;J/ -QQS-.n)i9QMڬMR(0$&{-0{K|ӅJ ǪC{oK杛J% l+?e6.6C@u& ca -=illUfBd8q@s],@s~EV?6~i7jxpUݡVc]UFJ4=ª5xsv]/'/@Cx|aVc'iU[́6$il<5YUer4s -C'&W*er>ՇYwzZ7J jw+|}ڏ4 )aCI؟fۃGzpk$ U`+ÚuP8uvª5UVv$KSNH)n$ xmu!qז0&v=L9-jųsT| U,in4M∴YĖ#T+Gq*Т.!8بlѢ*fpU qM܏ V~wzzve7=i,jux*\Hw'=՚DǢ ,V7v i`3N8MuŧE柙G۵ mv KN< -a`ʿ*4G4?U_V&ev>va+84<pYܦhT.Vg'%'>Y 9ƹlrFSީO<(nM':+A99]p4@;Jl=Ô:-i(\`(h(\>{E;֝fT?$|i;gy9亮[c9݁cHYaG6l=@iӯPOpX1ɺ!32]+`Z? X5 o-Ygɸ^,IRObc3X1Eir"m+uvm ؈6v亩*G/ھה:ςd+ݽ + ayw!wyҠ~2zҺ-{ĞY1"'Pj!bp-k#fS}ق3J[ 3`W_iVCCNIZwP ]Gq[ҝ;Yi*P#,s5|4~#u2uSAi{qZMyFW-JA%(Y5[ߒ9/-͹>p6ޫ{!+Ԇ-}p$WdMbq>Uk9NSÀE'rڂi o5SqeV] -t@Tk%kW*nlX4ʁT_.9ɥy -SmIM{o PߊC +'.ꄒ9k~@* - I:"ToC60l-\$mk3\{B-T9 %razdHq IdìXAzmGraͰSp (pA%slouXrzӗO>eЩءɯRmXԤɟҐLz*Pl K=pNQyl*Fէ>`iEʝ5\:Yq)0w4ONN+p5RkhL &ѩrZ`͔ZF -{`svI`BF)*,.X݅Pc##E\sBcZ;.ONʛ[ M0[" `#FF*mFFh˻S@x YX2-=X\d6:/M#d,h>(2E頴& a8Z26\ h43 S'vi. -5Jg %ڝhmBoڙn`)4=\̵G;6~sZ*52VU}CS7F%|?o S>K+z޷m"F!I3Sf`wBԬYJ4]`e^(֚;њU]oMYv]Ok>K+w+{詇82A@طg'qe'M.ٜݠq{V#>+Si*iVm]k]*Qm`+|Wo w~: F-‚vXб#$l9[@:Ӭ~A_^x.L -ޕn&X؟5]FFF#{`!`R!Z܄9A:f~ˬ>Eoz -ޭ` ;o=OxX>Ior{^?]`Aɺ+vuR!x}V[g愎}*f$vzeطp+4ෞϼ NQ}㏒ǝ >2Me&˨VV'Ke̓} c&ܦs>+ˣ~xܻnu.[н]CoOnN=q]O\]Wq[_ x/w<wl3Zї5Beqϼi::D:;fksW*{74HyX=/;u}@ 3Fo8dS8U*2%bC]$jU^yĕ:'iUB[|fNBMS7b+<*OxD[k-6o}74x!|ՀKse6x%Tʫ];Ga>s1)EaBc/NTsb76 f 8&Y_()mBn3FE !dOrd8iUl -m6|QmG6<0q;J,kaCiL2遬wnG>iH +}mo/y6uqQ_ob-=a޵(Jd9Dx&K7Uyd?z!6UspcQt -Csھҥýl-# y#^MWAN6Y0[[Db٪WÙ<~HM -h6d*dZUJTm1O.$*0}N{ ҳZ{jU\[mUMJunj\ϴC&J[I-%;u VtN@sF|)nN~qB[fː0+QlɮB}rt(]*$;Yi0knB(FopT@fFFK i`3J RnJAp7nY&T@X63L 2`QS'U饰f-)gI/tߑH@t%+F$]3lJiJ<2 nzZq:ՒlM,J-ۑsb=[܆-4 \ΔI\NK5*ZNNHEޞ^K8٤I-ګm˙#Pu{(5K4C%K]gJ/cc%zfErTe1~܏*ًZv.=+R eOM80{W+DMjdf .ZD.8/,"pU&EېĿ;rzxXyd%}a Θ8ta .#KI ȣE֪9s KH}ʣ-2N=+z&n;8|>nnv^Sqjّ c@)ֹqOxIX0O. a8d-}` -ҰZ\g?% TỸK۱PM%nf)+(<6%՟+V̎ ޣ~FJϒ݅|;+v+4 ke)v!-FriTw\ c6_| ִM [6WX=_gSn\%0ZjYT*r^טbeReo[: Q ngճ ڨ=]Rv*.:jUس\өqJv`RXs%20 n-*Ti׷P԰kRFUT֞Ҍ q13yo˫H^+if+ -ܜ[]b+uLGst+ܾ͌/q䰫AQZ֝6Me*Xp2c)*<<ʋFц߫0;DU4/L(68k]CѬ˻Ɲ .(ߐfĄֱ9}E[@?hfE{ -o97\-O'cbu\ӶE`M_1C:12SE"(A*AJKDbB6ᑤ[)ЦdY0VSA';Vޞ vNmBA)෱Vi= VsF2dV`# OMw6G4 7cgO6Z9еbeJsePeٵbXlNN^69Bݗٿ\&.uYX#kܑe<"m -OܴӴ]ڍ![G{CF -lFLCm9;sW(lE:֝k꩒*5ڻTM^NDz>Ը0cs|:ֺtCo.k]X@dhrAڰ=x]>ƭ8i݌j2CC>A0TCvJWam 0 xځP˽ b;6DOcZOg.IxYǕC> Jv).">|'6;֡Y$؃;i-}2U29Slxp`xH.d_uP'苻UqpT" ve2 TvMw +E.9q@Z\+Al #AC7b!~JnxmMKCz9NW Fvە$c~xhF# 8^`d7Pg#q' 8v0x#:[d{t4bUAgj2CzpTm%f!Tip8*̍IfGěV`_-_;*ͼU)wUMNaIU@*C@\- T-fl.d!^-lG!M@mW7B^lu]l6Z{9Vs@%Txh"鑖Kn:R^Bln*0,pSˉ2InkbsCf&楤1Dאl7 0a6l@KOy$Erff~DdM| p(Y9!pd s$vKLȲpihK4{1iAIP20ZT\U6CFVQfS0B2Sis3vdv{[rN\evpɁV蕃DdݪhdqDªx5DwT́9 \FQh6Vi+v玕t\`#p-+a`ZU0f sxhfEG5> -emG9Y ck@D_xBn-'t -1WݘB B漵 >A# mɩ(eJ. /,QjXXZC nBCF HAh֕^ io-LQK'4r24.XX˻2պk x'ԌZ7 .QhT #BrM(77w`=f>od!;[nݜV%[·n.+c؎G~XE;SQq)) =~ɚ kGĭV!>Hdzv[p]Eup[ozTK+c`+u]Cjgn[+́:M.Ҿ^U9]b 6W J['zؽcuY53[V{ݹnꅴp[[:R?-UX于XB޷;3x5nܺ%lj뭌[-;豠^ n_r^űi຋Qn I>k|8gg]@.דYC|H@⺍fq]GǢ+vV]R5orq(Fh]|{ລ||2o`m/-_U^꺅u8,,.[juǭ=6q]Wz.޷ܻ38+j8/h[PBUR-E]*/{bu -1n-Vu곊ضy6 KZ%gv+S@n^趻ݹuV]RoJ-VBGu -/d7n*-Anꮨ[ŰdKк z3uVܷ.සuGo-ۗkݼ[S_ VʋtGގn[.xm m/Փ8..!u?*u%ދkvչ(dġjw?H[V|\.kcH+ݝWFO~WQv-]~x-\'Z[[P]U?ܻ돒ꅹov e5 1{]u\ށuurnz-D5rݷ/m<P|+x+zn[c?Rv m/Փht_n?_ -{vѤ8.Ýy(j5|?.>!ug> Tik_7[ݹlVq v]Uj{ZP׽5n[Į8/]Cn< ລoY|^|nu}WӸ-]uڷǂ zuG[-븭:亁n[ljܿ⺋躭^o[ށn,wOz-x-O[^- aⷮⷣ[Kv'J[n[/tq[-?#"_zopZ50-Lq[Z|_jչb/CLN;]Eڷoro*[ж?`B޻ ˨p[/ດuZˬо5[8[EoF -WX]B?@[o_oW-Wo[Xf~[pg~~8-Z9%l[[+[P P-!b(.]z\bx-7ܮɖq]8.տ+XdUkv=WUy-Xr<ܞ v-[]J|V hອ[ cn[į2uu[p[֮z-[j~q[]v[m]n|'P-8V?ݻc]Wgo?]}-x kx!u=Wg[.hz-x|nloZҷ-M[ƭxg]G~.+|+W\5od%lyr7Ǘ=CXu}WnnBܹm[j]gW].PMh=nϪꕷp+ݏ]_P;9:~8孏]u]ET/u_oX+ {W_l뮡_NN_[]g[ގo|~zxoH|VuG8WoMWV a~׮8.݃涷ݷܭy0oXp]P|_ɠ[ -7Z{ພn;+o@"aoߎ&z-⴯]u]quWT/u]Vڿl]G]G-WT-_~_u -zOoԏ%[8oO9ˮ3[ŭ井xj[q+SS_z]v.[Kv r-]w5j:VWXpXru<6lNܱ]U[W[7.K|Vpɼղz.+|ſ`XW[{9ʲ4Ш\<ٔ'S9SshM̗TaĺعZRJό@[m0 yohXQiT,ZI5&ZjGze=C 6Hؙj2C{ ]}PxeF:"U7ةE )p-.+S3?^qD[ai+HkXXy'\D#*Jp͢Jc4)ҹEg * ]˔gV-9؝m`E[nRiAN#iXvViL7ojiݪkp]7Z)#=9{" -gICuEcp\` \|B1cbnlD!e A`ed3?uygCnYkFִ ; ^&Aը̪m`9T01T7א DAMeiJmMhs-!;GsbQM|PeT6H U,\mMb%)׃en7* Mا/d1+nRmc6Z̷\uKǒQi:Mڅļ|ӤSdyۛB } pZj_im%ԲҦw'R `Y`H`d-&0"pX1lsm }k Zn!%{,`e^LcG6'\q+Vi_mZT,]E9 =5%nZZG9jV3g{Gޭx'U_PqpZG>˳pP# p SeZ]qģp.!andY֍GahUʋ gLh+*Zq$YsbiSs3˄2T9 -Vx%` ZPgW5KpMΒ{1Zh 3PMژL 7*mq  dOv(G#8JxUZzp= QΉُ[7ͥ -Bac*:չ"G7}ίk 5kfUM}iw3Zyh-ɣT\o'i?Tp }-}. ŷuNp -[k WsMR{lIfA#tA]ZLM$-[pE-;U0K0+[V lM8k&6Eh!،Ȝ[{6Cyn?⠅{M|<'g1X t.Gỵ-s]5\ǎ g !klǛ-# ڼ5I/]pDP 5t5j:a>Ӗ[p[rRC8M7jݞ 5l t }q^z8x-N9a toZwpG.:G-5# Mj5i ݽ ySd$rE>k7_oEaw+rƸgQǒ❚iJ6ZW/U|ϢGir[霤;zUX}VsRqtD`GfMlhUoz4-ZYuq;XgWQ;FNo(_Ry4|ӄuâ0UZ=֎c_޳ݩ3Z=7{!@ڽMni{|u*NNblO_ވA=4mT 8ۓNSuڴ 6tG,D! 2D]rvMȹ:ɉL:\ -ςт`2;SAPlm n|BҧP,xքa -n$.4٩:ilU^!i -!8k#ѲD:Pͳũ7&fܛ.n8`|Bδubޘ,Tp֚-Ort&ٲC7Pdl95&̞?pQUUࣝŬ9E F7T@m \ :[PYyL26'5鸁BJo wq}3:K-{J6Lw n:*wjSQZ8or}2d1:4hOXӉZE$KZ6ܮc4\_+1BENC$Ų<' 5D24ʧff -m:NN'E FC6*nc[ehrtB76j5Ąb(cOrut/FՑh;#FnSk闾.F'"m7*U|w -6ڌSNc,jC{dFךަf]]fDO7ݷOyrǘq'/zn!u>ha|ܳTYhFKSdݕ8.n 幍diVsy&t{B*'Res=-np[<44hO_-5ٔ|Dx85 >]-9[[`2L5҆yx j,(-mkP Z~6oEp^M|eB#&>Bq97nU9$~hdx&1SQbޕ+_'ٵܮ<wmo"`+vܛՀ|9!;&-tͶ@Z\[.^̻氱>IדbBϠnJֈkK">H^.XXoo:N[毻ϘX.L"VZG C)fj0 -@y.!QMr>A_C.sC+AᓳØ.+X-MRiaɵWjUoڶ3y ИɮQuZXi?rVThVmiUy+N0+:ƣ-[2o=B޵ ݷ!uicՍ`_Rܷ|NXTr7Pcm?ArJ0ņ|Qru -{Cnm')dشPG5ОZ5"H{_:sJЋ3G -#Wǟd Ku̴[Fb^+kx@X/uɭ40x-ø- -]pm !!isy7';2vqWԪƶmx-XTawAF^6!smy5Դj{ &g57pZ\,p]&橻d@#2gp\fF*g]%h -4}'KSi09b)J .c<slXX5lt%R0%4 FJiqeF1P,,ޘ* -T42YR6ޯ{V-`HU-TrI(dB .>]ƥP|\r6 ̻c.r x&[xBEɷeh`? (9* 8'Av rlkb81 ICS !%oY Xr%Rˏٕ'{n)sΡE6 U -$äEBذke>M!tGJ$ƴXYmZjvu'}f`=AL&̘n$sjWOݲm:6\Lʛo)[JvorЁ=鹑pS,ӫ݄ͤk[[ !8OQ;x=?}hc_PJKzVWRѢ -lNLS˹b&5#,u`GoGToy_gN6Ո{ky/oj)!ˆMӸ-x.<iGEm3.Ž+Lھҥ*:G1e஋ ]Ehy.[F?wZQcV_8d+E00Ug]Qn[a.IҷɫSV|()ZQG)FQ#v#Nm( -AJxtlr%c@_kH&ypIڌ -Ͷ}iByڳ-Us4M@j6EN!J9ٽS_Qi|IV,V{V%-c#;UKR-ڵy{Kj͌ -M,Ky;Bѫfg.V:/j02XUt29bkeHuJ¶.-+N5+媉nEWT!9 |JOV ,jwhdڴޅ6z,6n(ļTi݂4+SY`j}UTk )fZ?Խv\lr"rC=AOza(2r̲HgA͒GjL̋1S.gJ?FPA1#hT`uC.C>͟)i -b2Ojj[F/{mHK*c0@1~F&a4ZnfF&aS亿L.-ba.N%UKiѻ6ӭbC` Tt٣j{Qz)k9R/ԅH.O4XtPELڔZHë  jS3ذǟj¶z\صطnXPUVԵXRi959bN} ;@CIW4envG8g0ߐg{P)?)uuQӵuTfcE*mPk.]ĭӸ*.x 8,*=ܝ]p_9Cǵ8SC7!p2n_lMq;?)c\d!M&Ҫ&@ X[eGU`^ϔ ˺>ilwNo)HOϳa{o)w+ -X7NຩS7S ! S9E;s!}3-ˤ*_ RH.+mJҞMҜH!e07 ``ƀ<>.Q:-4w0$)5n{\ӈYf)٣Mc(9[=ت89oVߚulo_öm6Ȫ$ _TWmGe竁tq^8u%QFNg+ mF'sUh0^x sf-Zn:GYD<Ssi @ TT3y+ϢM+Džoݻ;M"?i9>hr.. I ]>hy#}~q }Hr2;y-mt?n3*=]8S׵TYk`FKf|LO\gG(Oms]U'1BM)?bom MN&.m \I\:+:)Ou*{Ugլ5t;2 ;nJaôJַ`Ѩ!y=@Z$RPO"eDŭIjkANM*[k SD'5kC5fS8c ֩ݣڌ4 %4p&0N.UgiNB퓒KJ'ܪ6F7'~E< <*/b&fU-\2*<4ېMGreIrGltkT.<൩=׸}(qA֬D;d^;Ta&,yoj=Ş웗_^Qnvsikո;޵n<}_(,-٩5:WGU0lSz}%u(K]WIW$ywp-&{xdܿSͳcPoH}<׮|zܷV&AZj?px-x-oqZ~_y]! E󴴬>|WQ^8:nw&tn?dܿ"Ƞ%ZJ.T P[[r72@ *56l(8ɻ$ '-|~Ǵ p=Ò9ukLjL)oUcY{ܴ=}TZ\ѷ}U,{N3Ly=V;j,]z`!m aı&]e7O඿?^?%mN(k=lM!<4mYzjg6t*9tm3(m*NQtCõ¨Wg02[j/~+jN4GAR63E1}74xbF ki (FN\Nnb xpɜx:*Ђ &-X{,K,4.LK69EGsv䕹C7*FLb -q;3)ѐkRj99֊s5i'URAwV)B2Lm*<*2˚5*|)kJRq%k ܨ1u,ddBMl -3wA9i4#Z6va})SniݪMᴄ `~.(ja vL|[X֋T-*!1)ԟ ڍ)Pԟh K'>&%rUZp$ +jkv!:-U8M4*ݢs1wF} mlؘXHӫ''@rn ?4`?5F,ǚ%^f 7Z厵g -w+U\o_omWYCnMQ,M6AXp=Z.Pꡎ97/;8B8u6o4Z[ mx-e y9+thR <S.*m& -u;O/T2W){yDܾޝRV SS <8 kܻZK'A!S. cxD9/ati4yӴXޣ&pn]F{Vr\p+O t7ǂl>h8/rƒ-E|?-x.OE_g kjtո&Y5:0cǢrz.$cp -&|x+qCYUT3~Mj;(diUK-h73'Zgj~[*--K~oI͆:t4gQ9ls,S5 2nzt}Vlf(oZd[I~x#_ _#֭Up<3 W u."u&6qd'v:M/{bPq(CyT,rPLiU۩nJ\3ζPm.*ot%׳=lv½z/x?~UmwWPq[xmoۇ%Li=2nG{MzC:ce<SXw!61ds,*) cS-T`L...M-p`I1.;0G<89148JժMGh Gz?p) -7kC뺥Ԛcڠִ)8mo'وX=ܹ`t -BSTMcju?j8ҦET\lcq\sl W'}:TbЌfqT*@&#qC6r1u=W+bƞk֔"nObjx{)1đ?a_y' Nͮdpo3Rׂ0]#)t,w\#lۧ#ݕO4*@2 4Znbh0nL;c#K̸Leü&a*mpD dD?-[Ufq^D ׈3ŋ|!`6ܵqoDOGI;?$T95=;@qU{x\2>m.Yoml'RKD@~>Ck 0 MM]ލ*᭴D"$\U8A\\k\\tU2I\ג䫐;FJw**.TvCET(akSs}< {Eʵ?tYy*ٹrkpxglks`osG>`t+ޜMW nLx{R0FuΧ4O0w8/VwS}0F_!1:QT]qVBp+P), -{ctc3Oލ3w5B)CG q,.Pܿ\yxObvDoNe.ǘw:BZ( y̬QYF\Me D3j]cܾBm O.g1x*^*u WsW@ --;1sjP*W30bw(cJ&lz.1幚;MU@AV.b{&sp0\s6cgs5:3r:x, 9 77<9tr]-]\'-Bx13.TQ ]~į>LcPW:'acjn_u;1e+&&1YD*`fQg>{a̳qS0 rLT{S!)ވr\nxǘa1K8&jOp4Z^^::|26Ow xLL޸q. -2CI>cnAq\j|#/SK[7GZ ;=vNc XX&'z1ÿs`W穆=\ _3ԯsJsE'p&f癰7&qVgM֥n:&X{|ņq=Lq_LjoSqT̵z+!2c7bap}z-c鏂Z|E%+"s<3i32_L-F\t&{<7:: ˉAbtU}3!*?8 -&#|]C_O_OPwN߃7 33{d,%̌oda EY~\TIx.fF2įs UᖕW]H7*KA*-ZRd +.`Usq,"MB|CH~N4Ua"r_O[`>EZ;ܚ|W$yFBe߂zFMulv,f.HF%TvSK+U8898 xΞs_;t3o5Uc1YrfY&j{uq0$ zI3;%~& S׷Ezj"w_ɵn7) ^S }CY)kDE?3)\BhRp;UW7sb9φjBWPqf 'Qp3:Ծ;gBfm=W <}9&78J̮:@횎]usU:>Iw=MgC.GP8(ce=Fߗ;1`#+/>āIU~O^B<;v)\NqxvM^cWPeGp8cX:g3rOb_[3؉h?h@+,Pa$K m\K*`fp)`u;&1u/f*gIQII2 )9Wt))e)/pZ|0Fɼ od>E#V7-բN(4AbKqָ1ܭL13QM%,hxs=1t!Rَ"ঈ1Dkbk,j3&j3u$̰3 -q:*:Ř.|m%dezfY;J [<%:JI!LPru,qZ ChxjePHh*-@C+H3t0B YT9ΠB3q3Iny 9 㪎0O4xY^LK2E sCu;"qڒljN s!;8~.tBU H5ωE("6oDDeMΥ 0ZB,̤f_RqQ t9/̫ڠDZ8j>-_L -ļ|<̝XX*5y -N$ R/S& j.Q.TppyWћψ&|w0X? 񊝐eyx:YYz^T.7:1U,c\;Y$]ׅgLRZLdнa槂Tb&HtL(pncAƣWLK rF$zLbg'p߄Ou4[bnw,M CBfg蟝9jOՓIK -qÊyļNPFu=Fs/5<1Ǐy8_\Odˋ3Xgw-ܼTψzɨK#f'XnT&ZV- -G9!A$zIz=dhW08^VDh\@ښ>Ilj1b(a(FzW5 - s.l?cq Z#G_'mc/-)L̇OD <\,V5؟|rZXp .#,I5YTk%frdKc,j#g2J&2-B[=[;犅NqVf._^ O0*A/\rӉ 7A49!/4K`/HdC&m`a$e5]9[0H' -,ȯ^_˝c1c$WpT1 &3^; -j^8=q3e;8'&s/S7d>gWa\̇]GF'PaU:O"m 'ciz w;ZPgp[y`E`b4ijBAU,M.fV#ad  2hy*?Hz:z`!b|WOc:5 $V317Yf!;gv6&QOZwxPo3bO=9⌳ǘ Kp.66<'1ozO!'dG*S/x1نK%=]֥.c4 *,neW&~I4g+TP~I!>9fŎвB -Y=\MO7tO&>йY-fgKcWvs>=;(J"TG*Jsa jjff|tOgK6F+f`C7r_PMKGqe꥖\L[2>ne4xB -&Q-}C>P(V Qq%ER1/@qyJw/-2ԭ -.*gP,Lf`bgs7 bf&*^~rN A72CsCfcDsEC6*H3 cAw&@s?l2WUlӉyeG*{Y *i/q?L8~իGccyqUļu+q~Pe2D:aQCrM0.-Q3]V9ьX~2A2mc!k;:(glrftbx;ԣ{QA̘,Rdl|[~|2O7glPm_ߌqF?,/WTPm}CU|7`ЗUQ}bucOf#^Y~rCX l Q;ZRV3!w|𩧃pEZwc~ҡ+L=37˝k2m\3ygQNzU1ZJ[_)zwhEX 1 rh?G.|4AJ.uVBgl Vά_߀`aS*l+ig"V/\!uLh*VLIjk$$0wɿ7K\'r3nPv>—[ȸ'ݩ)/)kjaogm}u/b@8y3%P/w*o5,ĭ}:x(*l1 [ nw;*/ -s@09(m(8 h‰-fF̮r|iu?".yu9|(ao3qm5[ -a%Z5oP ,T_!($YƢ@"B:!,6жT1|ܩa|Lڤ9[`䟈MK-'&(~6`r,FA =e,iH>ORmD&eO|QM£fkIJb:px Gy+b%|.83j_#kEJыɤ+; bD\KIc 7ddЌ;18YΦa}yqia |N13SeO[8pqL\DLJ:b7 {^x+<1Uzȃ4v$b/~\y/MrfsR\s.PTV!&fJ(<(/p*DZX9aߘӹȃY=mMefU*٩1θD'=xtܿя0) ̼Jr) 05烃o<~/Wwˮ:*$gI}1W۟a$1#=bJpʾ6_!f3>apj( Z8a"Mx5>WqFxbJ+38;&9|& ^7S{^15XGfe=OBٌFԈSiՙ GyY!Ϋ W+R/>f{,:!ዌ1Fy4{fĺœ㏈1;Bwd~g1z}ñP/si<\FƨoZ:][>XC,}ra,~<$v(h<=B0BfGtr}0 -V%{n%[NX߄\ oRd7˖U:sk0Yc'O<P% $P1USS|sca ?N>x'UWqˆUq<:Ĭ@B; -A>53f`feq-Ĭ穂V*9 =b]1e]T௢>ϙCpA Y:wo b'9\p2;)xYZff e;E7,0a},)(ޡ& L2"AಮtqrGrl̓ No0#, 0/pMqL-xVAFNWr7c+<}Fm>BF9Ttzu[²+#WQ]Q<EaTƫXZEޅSwU37o:|*bFsl ⊶{UwXY̆%ghZ[\!KJ1_ +d3f*s%ÁÙ3FQ[U#Q(J궮f(*u٫vp`*XW]5xn#ٗ!*,,1"ͅ=qP`.oY%hXT`YwTh7å2N2'>p( x8Q!7xh\4~2GVs m20LxI*e)mKVn5c K Wc`gvHc\ aLL&>3nq 1rS4PAT+ \njNS,*w2c*Ccp e(K28YX*b -^^QZ.a0(_B -s30!V4D(bi L -E\ J8P+-y/3ܼpW4UBPVp&4ʸ^J%@Z6D(mV7;" :ķ -H&B I}77M\"Jb[XǛ)䋍3:o-59^4N`ftL :澪TN> z  ̦- &AʀJ871,oc4gcx:8 -8`JNXn3>gO?Î+|O+,1>sgv0_7H@u ElD1:0bx!OG;IlT/Qs|]idvzڢzV^?y?)uvc`5]ONo,Dlj1븺s}pǯ㧌\x&ys9u*O|2:)StF1_I^ҥ2"ٔ"Rh")E--;9٥gGɟcccN=r(};Q>'\cu}Gן?[1foˢ/jˀh&bD]S+3 -Qr6cٗr,y\˧rw b 색d\%࿥?GS>biygS?W|aseVb*[lT'dt(V0ypOu2УJ7,\<`Ja`i xngI7T=SKX[f&v_gMf)/g)cuѨ{gt8]?\-ٞZ#ɇ -v ̳jOj~!K[/(> >r=vf|06($yɶ_&(v?xl_gU#]~D}w6 U`O+ vUY;?ęJc%`aD:3sIT=q&{8wJ0F)x~ɇLQݩ 7-LϻgqEժƽee+Dx6f*%x|(,戸KFۨBŐ|0C>4([OGSdx;Gk -s Uw#7_5sq*oA{8y;܋3p'Zc]=pP jمe -ʀ75zT4.=>H7Ī -*UV -!aWžDvؗ..nd ZoFh@Ue^儻5@?17Q?)yJr <Tw;s<}wpy8Sp5ʄiA/]K0'H=ƢHj-*.CRcCrK< -"\X!_Kd"Be8/]\EbFלB±}u*bQc"B3 ,[c&#ȅf,e -XjSk2MƵ Qc_Z^jR^%R;JtyiL:⧹S:gG\ wxx!8x_$Ґ~8|CPrV?Na h4FžUbEOGQ})\;Iw+\ opd*f~w_ l/e #_G8@} -c,"}#Fw8\꿫'rQᙙ\?pqw3_w[X;͙5k rkn1l#3jJf yyv>' 2`DY Co -dªi01riG@&e)1)솹gQ3ǎkdS_E3Ԭ?^z qr,c3ӪCMA1nwJ e K% (0HE'd|G,*Xq gi"PCS3+_AsFxw&s+뿮+l Vqb3䙿_F81ν' -LLϘo뷎e.c/gX8a[ \/8yCfNNoKԻuo9O?C1.W3 d;fܽK/0g_"z͏sS]e¸<<WpgXC8& TA/|RS318`Zx.e ,+. 2n*ș[Fe)7}vual)a-L2.|W5 E]"0Hs5ӥ߹*WsMOoBgN!g|j31\sq+Ibfy㿯}G'G|7 |s'\nnWћsۏbrA,p@2(QEG\xߒ|r2AX8Ĭ/! }d_#p &;=\[f @4Pp' 0ᗫ%DeS23AT[P{˫\Rф,&(3wX*-乬a1cX_q -EW>X"N?pnwx<_R;T$I6Z,oFTnj"1tTƻcO0d1\<#8.g{9֘3$nkl&e?^m+kf_$ٴ2e)O1O2&<5yO0kA5~%sGx=J2"#W:,f2(EA1ujHJ pO"1Y«Z 6 -qPKusU>3.fHqy>.?e̠W욥[.?f~K>Y~Y b.ަ3]NU̯ a W)]p6~o'|&bz;M>qehL#[cYy@/HxVWJ%r(jj? -@f,;"_D<_j,ncҧ1+H(jPO!'B4N!l؛BŲ>cB2B)c H}˿`Fn.HIs6x1*@`_Hv1L|dArb)7:Ej'"?f!OWPH FC) ւ획eOŧ-USw}!3>AP$ZGVK6B^ }(b B'O࿣p5×3LIx1(58xza/'ϋ9/\\ 8entLg âbc3|b_-aξo!qs q|Թs\bx8G*QDT,D=|,cMFm(\5Zj^z13CLălpKӆEa%Ƈib2+'A -+¼;ܵ$ GQ(N+Ҷ㙆.gWYNm_U0\eP?% -S)'xc .-I%쀥!0KS;OzJ(Ors{1N"QTx P-UEy膁+2^?O<\g1P\!\]pE:5pX}o,00qɈC'9qY<^C ;k/.{;\/&)C^^/ -H?Gd>8T1/\R);K+k`ar̼C1Xŗ-wKb<͌ X j_G֡?eINvpYu[a> ɒQ1D[d -D.#V_QE*-C(f~!{b֣Ja3R:.*fMQUuS;bO5EE{>KWB5#ԭŤ>̠An1ѵm->mG%w$q{E}:0Bh vE]+uᖤ 7 '숲;:,k[潡P.p(ױy.Y2a5gjc6g yo!x~)zIw5uÜtJZ9FV&r2ԗh(0. R.+_FrBvя4~[!p"/}8N* +TEUV-q>W>0S)Ub.*g٬=D!D!?V '>a1QGqk"Jjbª;XVF9-\FV>)Gڋw5E'c0}XтyS򂞹BvL},bax^/ǟ8\W_POsz& lY> ɶ聫z]g#gl-Q'cU-ji01XA P˚[>Ѝ/n'ħ EA=W%'D +̨_2#KГ 22S+(J ?žYZf ccoI`%\Ӫ 6~{'M:n[6E#x+oMs1OuO<CQ@%7PFѣs_̨Z bYYB%`OֹvC+ܹ~Ykl0C\x|7\ eK .^N>%53x NSW R#cYb:Ow/d<2"خjV0WX@@ WQbpp yƝD@RR(‚k Jyn+x>ᙾs Pp$Xm -Xb3[\h58.M +TfRF8-3(f1Cf%舲AJcQ<@]n*9,gT  i71%@(;Rɛ1t7!DtVӬ#P,*$oF-pa9}= &_7fgTԷ08#dYBf6@!3?$@}CEDV"b YZoQq!.Rx G nOC-=2 pEqlTnM-pcOF4v -ā= W0 u(<̌†? MB)Hu2fzWhn-ŰG Orį{VݱbcROAz5x߉QLVRX(%9C@N f\.Ili]3 -zzQ֛i.Ķ#ϱനy,w"v_s7qb5 lOWߝxx;g}R\dvu38iDWINEј>XD*pA(9!W댾 ʌv&"l3+C$3TFO|垤UۏTuЋqrHe̦;GT*4Oe0+(,־a x ]/8 \dsANɀD @^9||/)>{`D"&` FKB_pABŝB%_lgOn|S5y,C|?XN-0R5F'Ak4&#-IZ<Rm"%C4W*)yO~:q>*EȚeA@QJl; 5kS62PɁuTLķG;:㪗|qQ }XL}1GSMsmeAV -lX]#6G# sD1-_ǎ^')zG61sz>&D0`ۘjTp -$zXe5R@kVmYi`zfYRsqU׆;wpLrSL\˕v!Kte;lPU5}#7բ!WjJ=\ 7:1*\zO|}Wћ8>y8>s d!vh1||F54Q:CT{Sk;BCɩ{UŐR%3_=Q@9{2$nn6) 5D?e`YP\W2D+#50WA -$sd`VfXKv1 -$jG،[,aD?Ax`~$1 &~6j*cw?sΧu>yO|a1C[*cC,$s5 NTn`S,v/zN|}o~yebbK -wP4R ;// MS4 #p8_0h"܃%ܳ4Dm -^[_[Ex?*=dwØ (YE.o_K_u(9c6@^w+XuoW`1AWIH]^V跣ǩA1>ezAsllN>\cPLSZ.\SW.Ur>3 -UW -ƞ㸳º~6L!T˙PVl -iբGKt)v`|a(M~Pm ,OXՒd,K0j 8%W/%]F2i HSQDD"2eM1*M3)FŀI HE]V8]k` R; Xq3(e #l\aU}ˁ"EmDr\VpIecHewˏ2d -HBQ2L2} xIL,$a J꺇\C20% $k81#S]7$f"W1H |AXĠ6tAI /2^c,M0B"mhCmDOJZҌTR2鯽#CY #8+֔ވ|!q]y}Egq㿣?F%38x@M]03zg沪|ҠN9>$bCy2T}uL}\!>b PC6S9)Sh)&_,=1r2d# bO I1ÐύQ>ez CѾΊW G2)uZ56>`Z1^ߵc' .9G_4Lh;Kr;jgNh'ѻX+V'(=V1@;̆J`y&hC^˩~7OKI2 (yrs#> -gMXԁsmÇ螊ྂ~0e qP -gو,Z#pp/bwuưr[^[JP -훥 ?,~'oŰ$qJQa& ?,jw%Ƙ'ј5ܩW -(APD;VgOόQ*owkMF!=F,l+wdac[aoJ0EOF Ve&/DS [n&>L=Ҹ6=#', Y_,wF9;z㵋J  +#(V#,?v>+~ee0B!ՠ`!K14vvڰ3_+!(.An1pm& =zOnU%-ƄAeGhCH2h@AE aAB/~c?6Ri`7AYeA3Qy): @b4,~TLO D@>TID:O4CC|A\=qr}()Oa(M1ͿɆ*tÄ}b:.TYhX VU>!DkdDGjp9%Ul^~/bJ^)>I@qV"hct(0]1~EFTgHvDR-}/=⡪怄95nK+Nkr>%0Pfw(9R!eF&8^C`wJOi%K10p ?rּexbqyhEAdF[12Ec-6d7ȩ@.zfX/1faS,Ll87}wL.gJ>o蒿 jBx!PA,K9Yߒܳo0*f|Tma[ /Ç(c>j`d`Dٌ,]QAN)%LDtJ? E`3bve,3*AEFfWe!P&1jnģbdJ'܂xqGdm -KGX _,'D7MG.%F CDf\2ՌpKr/ -K3ԮV˗ qaA/8P+^n:Kw - `{8qQxNbyq0<bbJc$!{PrhwW*'.'M) .$:'ũjhXԴFJ\(S pa- e_Y\F2 % WjY1HߋS}e/ A ̾K1,.00xc>}G7a!DǑT[ @>D%D pјa1['`)µ~rD…bx[EpG1IFC/h -4QG.qƔ.g 6[HP䝥J"/-.C:bmq˰RڬFSԯQfeCp [E̶{ x/0j`R'DC N^-LpO O6ϔ-Ȍi[yatEBLNxX1I%RSÌ\Yo;_`E ⤑`S8x~Ϙ$ "(w $HD"O\R~L/ந$ճrJ*ID"A2z罣5O -ఉM S/Ī-!FX ezc0 1%bj3JhbX.FVW5G؋I%uѓ@XSg.u'&?s`lŌ;0+p"#L &LY- *ofT3gg#g/H9^XX lW -M)y¢gB09BUae2LFFt儺RH F&u0xN>yza11ȹ7 -Yl=@ 9bKEO!CF x*jVR ?$ u_#NKFC dKk0'rn"#nuBp6<~ȕOْ3ᙧsjw+!$Wo -mrQ:F4Le!/r8 -)]yfo)05]B6W30o${xzQ4]` -  _ -١M1U{o}\m+mbvjn8Q+@ iDva" E9%(ġY|7! ,8+@85qcصYFgkTFP1ytWjxa߫p4xmv@ky X3*!hr23 -bQ%~FԊ2f4?ߣ -fR,%r"c!cLC:bXjo)dYsQ|p,LHp8q¦tx[6#.ƺ#|-@fy!y&'S뎳uR0RG-(3P6T!e!E\A.׈PA. 7u NVqWj14RR)&DIX\-E-UT#qm9PuoњoֱHS9Rz[C$09!( ܕL+pKBߙKH)WJv/_ה_Xx,b"3]jKysLWz$yx3〿b!\eBll}x:gMLʈ81EpkR/!=awV7301oɏ?;m7LLМ!塖KA -bj03g@RAP./h %>Z?&VetXz, s/6ZZ#XfQAwGkpt^`zrE0*# wiO)u~vbD`#f)sG g`?Pj׾$Sr3}e󹛘qqD19ǭEɩp>e_r`_ -RMWE zʚ=~ M`0 )~N%ؚ-ȴ%f,"dGGqsƛpNC)yu|ښxcQk G05|̋bAqӐ!lOfU36Kގ8HH#lߒe&j&['E@+Bxx4ʆ :&p`LJfhX _@ok+M67eaq2D4FN)#Gr2%`l~st~Q!TP7}cN("@prR*,f*@JQ_1V t0GRኹQ†x;M1#,GGG ^q UL?~{'LvP4yb*~\~BVUK+eu1;%O9TQwjbftJMMpB/^a׈G5 fWP3t^I>ʈY?FW@-QyLԣ$ 3ycn*ķ0ੰ"N{)Z:gp -0@6ƒ &HE䥣ЊO 5aL3u.OoB *AZT;ZD͡˚Ykr5W^ &WU ea~ ,.27hQ=e3 h %y scO\1EeZE#X"J9+<^31u|x>xO/r|xBQp8 w6<Ԭ]c2bj.%ˊ n'R}Ư9IGA2Y,CZ13rC -j5K̲,e*P&ILE@ L - \{%a` &pJ0Li;sAyB@9A0p"DyO,'Zfd=1Z>Qa.1q\k3ϼ7/RFܥ̿p0NWP `1 aC ^iҙ@Y#Q7ZƵ&Ha0"h V/P4 Aĥr-AB.*˘EDA6'0 n#N`ͪ^ -0AвS)2 j} jJ8{%Db2޸ w xU)Q\tR:jEa&+0etB4Fn(넲.^uc"CHzs _p 𸻇\#hj7dQ+^hn50+04K<9n؏;;$Tjl3xJ[j+La1Bq,2Yψ=䡵2vDxEhAucĸ(;!,}$(5@ -Jp^Q < $>ְ 4(\A.<8+*X/)b;C' % AF$\'{} O q%2:xljIe9~K@4Tl(fŠ~jh)]ؘGt-Df! Ca^dNEgsCj{jSR#掅0o±Jp`UpeC*.4+06q72 bՂU2;LUPcީ4P7P¿&߀+nkL}4]RP*aζ( a/RS<-_!ZfTBnsn;)bB/^k^=YW+=7YØN -"E̾SAuo -{iSH0xK_65AX?-uraI@Bb,EPetet3z8&QZqc"EXϾGaU|Sxq6aPEЫf @f 4 -7Ěfjn%jU3=L.S1d %m^R@|&ClϖNp[)" î+<l]=PF (;{ *_,b6MƢ6MVO*NVA^0$2*$pwaL2XߜBӘmA~1Y^ch mZF`G[bG@K.afk=Fc.ybT2e:v*w2e2 KMBEK)(3֓q6FoU션sS19玥p_M?U0.J>lE_̾zŘ1(|Gm#ؾz -AM20.hǡrb:I{T4v5<}2G耽MyvpDzFc܀LeX7!_Ed%.ZXvWdc sd# VWe1XV֢_ #l - Km9QA6;TRƕR_Hp"2<OD cSSkmGnԓ%A~扁| -3oFxŊQ%ḑG *2 ' z &jf,Ź2/ YՙR,.7`5k51̓3.aǸfI^UKgPxN%pJ{! />f='>`n3.=w6H[[]X]P r' .6l(-^* F -69SXI- i4:[U4b/WPfE h"-n!  -Λ,õe QmqנMLr>)YB -/[|4` Q -#(r`ALkUS P M| NwL2ܫ! -$E`J-ki1)KDFk= MC*6UVS\F8\&gɜphm5Mb5aqDs^WVmuuLB4 Cp|!ٖ#)聀ĸY@Z6G -܇ - -u,5\55@@ 0>*Ԫ\2up3>3M6EC3bK E!I+uLX,8Y@{gB+&+b&|R2ZL@֦xbfJ2^y̷8  ϙg|T.e*qga;T.-/z= Έ 9-K-u0>Ɉ"df&(ځ\C>J$qcvo%6Rt.^tiȤ.mNlEk+19H?dKFjoMma~ET,Rj1)BԕJf)"Gb ~YY%~ R* b¨7`zp/pgQ 舋+ Gq=JYg\ _xca9<7b&azc 7ҡ-)C7Vnlu7.;j5P@D gThfY!q15 =dGKsO`P}E.rvP"SACQIXq "6!4e?c. (/{glʗp)u "Ve O ;1Wfc1PpeT+TǞ{̨Qy}1Bw rf;z8&Y\k!)%:B}؞Ou3N%W N}u -q`~ˌv& w7oNYL( ]NѰLUM9Uuaia$ [Q49U~) -0]O* XN #9HWSo]yWUOp gʄ ń!T'u2^ aDRK3f>ȵR: l%OQQj̧0%Y#5F/d1L }wH`JU}}J*T) Q(b}RlE7\XZ'Er"Z[c1k;fu#O|e,D[ awKKd-Nd%|My?A>.\qf80KK<L>! #/# n\|<8L==ՌV:)c&K-/A.f6Z *p`qW6+z^' ˨)0jcw1;BK3`Ƥ[VVR5*Me+< %\.5R$QY^B^:cǑS'lbMw6h%H#Lq pSt^A;FB$A0xbڵ=C(K6&ĚZTC`$^+P )n5 -LTfK+VRDQ<3$&t˗)]3$ǒ1(ڳ%xgp4Yu7D;lsTω] BrGT7[| B?_?S-,ыdZ-όK&3R.m!]i5dgGW.G)REิݚ.rn'N['vYSlqEw:8>=p MbEFPgj`\BCb+~t7zD۪zD6 ~9kh^ Po7.b3Ly_gK1GB l%$)ߘg'fxjxqqNprA({L;e^L<+xB)Ņ(rXeqSL+ УuEi5RD&tDB%jR%teÙBen TŐ'Dg`A0|h33fk( -ED4@z[=c//N;<>iVzӨj2׋0W#[RL? .3/&*@Vwea˽GU_Fia D?qɄ4_g%th.Tʳ7d9$#g -(A]G VՌ;+HvRGLE?Ѭ"J&v-).9l):0;~ L\k5<1T=W /8 OAI]m@HM}0Z? i5BQ;39_qU}4xklK]1Xt+lXO^Ƭ(`UF! AH@<¥EǠWΒSRjZ)Qr%&10+QЈ;XZ剰qlBX3[dxDeG̮+Kxs<8|3+ZEXv5vCkq|~iE -Y$L 0 IL6H]\Hj.XmV%o4N3' YF^U -\AaѩA./D -s erۂb`P 0G"IYK1'i "ʋ86$.p|!!PYE1%JdFū(bYA,@|bNᏣLT!B^ % dVAXT^̢E,7l?s/x(NT'Iġr( s:^4Mj&r@ qw)e^ *ˈ J\̻vQ=AXn̹C3R08/pki2+C4*@-rC.xTkBkDw*Y[  ]"& -ٸw9= ZqO}f-ωP~,ijcU3c !?OR2wGhβѳ+KPp[: =1K(z fi11l`&0V5qt*n⾎yk3^l>gSn<aj}/@kƊ>v1@~s!Vy;̓,m&1+DZ|Ca,eO"$`3hWEXQJw0 7cnT}RASAr/J7ֲ\}%Y9Ձʏh:ΨB~VL}v yKϒhe_ =u̾\p1yYc0: ( B(`>3k2 =q zgG\y>N3;qǹ3gSP;' Qg҉ūOwbe nMB,SFM~tCY_(74hiM¿l9ahl ŕibjuo^To](1HCp%߸F;/? IB,О3Obo-)+1&:#k㗑_py#~|=}&`boz`8._"A8 _$>+*@; -ɭu Kq¬*[`CMJlYt? oFfse~Uk $AV L]uxh ڲH3LE2zI@#<>U̓ kGNWŘty @<,>&?Z;09u. PIU^YL*I(>0}*,a1;a7LVn{Ų[sPq|:^pA}x@Qzd6]E- aBQy3Sbr_wBk+!,RdBүHzaV?k dAe{5|Oʉҁ?/7,$7V 9H‰psv\%/v#ˍ@¯_:1*=AhrF,62U¥"j$, x`$"Qj W2o8h#Lg1 /FY?I}Lq#Ӻq] Բ PZU| A`ze - HpIE۫&uY3qwC1@(m f*RU U^x gB1le艓X* IjEDT*QHq?ctj^A]O㾐UhO~Qy_g| D%bҝ' ^X[ńT}NoB96q m?X6Xv$̪_"BODr0+.ب=2\|SW_,/ _?S]6NfU튪Y~^;O Z'"E{\]Pp0 ]RJ%eaB- `*ǩQ>01:w>-)(D!|E8J]B}R0)ffBMduX彏A.) DtyI2L+Smӂ@DaRUF8'˟ð 1Dkh35O %{N -B$!OqH`01eg͑ܽ\ÜDk -t~i Ӑ.Q6L6{5+xSV -pC!,j@\vĘu l#E|BMs2 -픫Ꮅ+{H=`@ -A%'SW,u5Ҙ1%F3l8I\A͡d)h9^2c#~0$=1:]M9!`13s0 wqCP,2pdS^|wru\+OL -C~I]"IYˈއF Y(h Pnkڅ9˖+̪l[(1HH&D CJ([( ~a&p[J%ͫEt`bZcLL'}@XbG™k-eS-W#1xO^/{Bgy?KqT}fRnp Sw ?J)r>%5( - -ϳʀ2<$~N*]pKߪ-cGa!ڟI|>-C -  ~-_4kBOH -z Q1znG8J!W'6gl:~"=Ed/qhv$2/T nH' A{\ 2_?a~!Jb\Eo=gz3jw;8\ p\}0!ǜK>K}*ܦ0f" 7!`!+L%R__L*T}Z6[<Q=@"13Bå5<X c3*4}vXh<ӏ wv^8!I+f5j(+3w+h1M$0jE 1>T#MX.^.sZ ,t"ЅyJl3ȪpoeãVx&2æ]hs7aԩl1Ժup烃K=!a/w+b ľE+z.\n\EJY/pBX5:%^e!5=L\,J 86]O3C|bx|w>иC- e.fKtA1v'mY(d. ?&j -`?52țdE"y+1XA`\HMC љa0+YHqzf8$` hAkD:h\O >HE C p<P;ܬN F + a.!2vCP`ۢZ; YXa`r) ZmT1 RtMNju>ч=utJPWVY2jp͌V7 eHH 2|%ؐ=6mD2J]2$3a"| -0&L>p̤@iM -6\DRC1ܫ/BV^RJF= ɉoC ]TRAE@X@ Nlg 650;w1)(m" 2bT?%CP4TN F#-F}@6%Ws X%HVWJlƝ|xDqJ\?Ҙ@wA5 ,~ZXzE~>Pϭi@QJ;@Z#\c -pUfn(-')fQcLMF`9+2tq9e@}1Xў(w!w/eiYGa%j4͉7B-n*hP3qZrSQ_i4,sdd]NPC>+>H8O.p<(6p4<).9K|tCxV)ߖ7<;CJ/3#D+X ^!k ( ?,4~ᇹdu^8 u,ta_,{qĵ*comz[X~sbCzX]3ЭF]2#_lT+ -ɩT# bB G! b` -gLa0;|>Rm"yj``?r]G+Օ̘<+ eOhUhke1!t mN@S=O,0(8t fs :ݨT%weL5F4q5T؈<W߄jmYFj=]F -㕍# -9?(dd |z(96*H'Tpn3 -z>[)NT:]\2SF<`hQBYf;["5>7 3 \0t"ZJ0e-)@J,2oH0-0Siމ*>S+!0*-гx%fPp䔸e C镏ﵐ=!BވB[ݡFvAxn Gv֢>`0ڼRD`u'a4w0 ٖx܍sC ϑ^a L̈́* ,ȋ3>JCe ,dD-Z竅cBbqQ_Qp/򒀣ەpQ.+ޥfCecyٽ_dwY#>_i<⡕L@/w{+/Q%),xf5kU92@v@bmfc/@ꇗ -5:Y5r9X=N~"xsr Ǩ,_1B]50Lg$i34Ob>yרA.bf&`sLN3D+$1f -q1|}U6ή(=J_Ja)$OP\6M6ZIɦ|TjbV*^|V!\w}TĬy5eQC p=VrJˢ \2-cVBEJZޕ>xF2cb°,^d"c* 2ZqHVw*A`CEH@QkĢN`ss9/’@OŨ+7AY@\;#j'@͹wPp\,mC|\j_ XfYMC 0H@u.mN;3:|WN pX_*kV0|wXNX]!i%vL57:6BTa{Ab#|F@6^}"Ƒl)iG`h_˩eG.V*6|伻lRW -O B+h>me%G &"V $jFj5)XD=jhꡉ6uFwȳw3Ji u L3J^>ҡUqOO]q%EcUrT̈́_A|\#(fkQWpG #&y",\ ]VD1{x *ߺ_g:LGU_b`F~IRǘ7`O|Bmj, d6['/1oop,;C`rd!D cŃ\i4~kӧu%_Ty&eL3E˙aèǩÌg>p,8S%Fm5):xG*4Ї*T5Q P,L0C)WOqiPœLԻvX.!S& Qhn'C\Y# +C&F _D3[(GLG=B3gbYGulgBu(,8-iv AOvbC]z7{֧Q!!7Q:bHb9b!읂P',m# -nP\OO1!!mP\@eFmWX+mΟ• D )7v2jwah0[Su^.Xϼ dǙGc0iDJdA C`"lJ@(L$UfH-K`UuO V`>4` EDS0ݍM =+j aD#Ŋ}"ŕM M&jй/JHj za㌀cAP9†f2Cd.(XY ⑖:F[=1Swdѝ%^#!8'r\~q)މُy+ptq;k(ZՍ\30x \bXLaf]o - a*V g &K7a6^G͕K5"[/1Mʚln!7(+ qrj$.ʛ%iYpa!Y@ pTTB@8 w(0n;iDr|3,Ԥy:\pK dirIS.^;i% Z;4z h'Tr0"i8;>X?hֹ]p3nTxźD^)!bbAPoW8"D: -6dy>\ ld3E 0Aec5śgN71xXٙixTqjrau]1g<=d0嘨͉#vƓ)SR[4(V`Jw{֤[-px:F!.zao|& bAb2VGm˝=:T "kQBSmo,+^}K䂷/; ' -b:@ͿC#5^pv+tx=K y:`ȁ%Z+b\z3<1 [DŒy1a`ך?i͖D*~Ah.Xr p6Z3y{F:PοZD=߯0+OQ~x9W*Xq;w3W jk+:&S 9?&G21]fҖͱ_9Jt2‘LيL|&dyw#|qib2z];!,ܑ E3Ir8d?a[uǕTxVn/\9*:Cve_Ch,xn]H4 -5q`l5&m`_ePQ 2y90kld@t`:Z8/%~$%0%,$Xta*wbUK+1 S-#W/1X؍z [K*Ffs 8/A5e6u&°x^[W|ǁ+qݲ2!aڰ`+0]U8xz*{C],u.]Evݪ>A gD808 &֋H='%Y;،N$B!Q%"!-&Yy-xix4J %3QJ(.K_mA X }$*6 M,|C*3vYtRElPV$%˥Ə\X22C 60Etk *bVP*jW {O4|JUe -lFHX@OtKтvͫ\8c{/De[_B˸NL6QGw2 O܆kfW^$0*jg1bV1V*o;"0XyX5#ma PсQ0)!V"df 4I&`mpZp/(@C XAFn ^W,-S .M qpL ~yCieD15*]U3SYv̮s1rKR 8^Eu$ g|B"CC8>X(2 #|Y_̠-UOr8LK^WPu,gKdž00Y-J@Yz hbW 1KAUS̝>ɂv1ʘ[!Hbda -Z"Ę} %^Q+RL'Td(J@*>%|)h®p`Ji?v -{ &?E_,0 9v@>ƎN*UZ8}3fsd+Np`rtJHIu f\PqLopljw{l,A2êij$>b^AȈ%(|&? (٠t'# |2Il6.)tl?WiG+. -T0ڼ•ƋC"'fV3<6`!@:7'\|+/y11>'Y~b dfmmX5i:Unc~}=ab< |n7:BV=Q3QʘIL;uwPK=*x*`pnP1<0u7ǒd!wd YD.{52LÒB0wz?\,&n,O]F D Q>-Rl10 ka/&?ύP,߄?ݡɒ̾c煹Hn^;YL7~*H"mTԂU24'ߴ,̥03b_lÊ!am(VOl5'NܠHy$-]ʽ:3Pnq=Df5Bf/S3_3A!pL"^a^!Φf揣>&lEe ebz!%L0F|e, ,33!Rɫ9Ծ.^%gfb:nQeg&U^O5,sLߒo"~g'i^KEjg/Kx*&g%z#QB=c.rw)X9:^eQPBJIVr^/Un~CSHXd 3> ->32˿l\eݍcnxjiţTh kgx3 eޞI/zY9cL> >RTՓ0fs?5k`:fɰ7{_Qj!Wec/GޟxCկ}J<8mN~| ?vQ3 :OjꟇ3)MR!VԬ r.- kX /<5vЕEU)5թŞ23=E=GzfbF+3CLHxkg_iwa#ĿGqN<тRǫa!ļhv,Lm%QĻ氂#7,j<#)a`ZD `V&)o(z3e/rKݤYUf A,f~):mGץ wۈT` 3F6,dHۚ +;]ڼ5Qlūuu; ~&q7$Ķvp N w $}ζń"i);p9$r4!.ui۳?!t:GdGEM[Qvdۇ~B $NvfJE&Yc+ `j GG:)q1KsO3/QBpB^- ].R2t!%̯;0*)Ұ8$9;&`l~&'s̪8 g˦*R遖2!0"1j z5dǘԡ -Q|f=ykM06BiA1zkdz`QP9AT0i; D[ܱw& -%cmB(f5e="Bs6Cn^q"bqClE -\wAf﨤 )Mƌv,e/SKuM8AˈPIѸK\u+Po㋄퇇S7r%݁ ļ$cŃD\SFFZ#W Ѽ!Գݻ㦡9hae2BVP[T6 _F0l7\@U܍;( H fbh;PG%jifZ 8S.TF.̞Dë0"z L*Mȸ,Z, -]E|$#5=Հ ˢ+>ŅgPfY1^dM2Ά;58u1‘%pq^9>8- -/qҕ_vGOS\=gAJeG䆊'P8%vGJW ; -x`\5Nj#l5ޘLK-OIJ=Ldp\GFր>w76qՍ: Q86DZ}_ŜJ OF_KbFa{I-|$-OJ@np \+n `*P &b1Njܬ2`e&kO`KhxZM|_ȁha|)59P2_ -,)Pt_ sr-4R lrAʰR-b -.x`D5B|c#/0y!M& Fc_؍MEFWD&+!Q: WX+I^a:dXt;aG|'-㋌am\\y(/s݈"MTvr* V$Ma"_{y1gd+#s0-fR s к7(Q1ؗ :%'Al34H[ZX{<-ڝE;jeDt,:m%c[EgR=| -gt& S0tcwoڰ {Zf1>bϮăTFrfZ ¬GTŷfJΆ/6@ߖX$4CqR{H=ũX$fc#a/3kn 8s\ަ#*w<1Gp8IN2̬aEؼfw5/3+mq3,/c-eX%NK.MNbZp-`$(P)d%@l\|\ ,5- ;Hp*%~/ ;DCypGk*</Y1P}TԲ9]YDB,kzҀ@;1[* [}B0UQD -9|kT'; u[d5;-GWlt@jaIm"769U%] Xf*)f30yMhzn+bf>f`W feLjɟjϥڗ1#@6bh%!*>,X(;ȧ7Tj L9>dtn! :Vdyp3~Ij'"0*w/ ƌ`|,,.s.-HqeMݭ[PY$l.2펬cr,"e^ Ļ"1/tqp -W;V\{Q &gJ{$0\UPB.]2qmbٙL-& } tҝjUaS2)0-jhXz8TᶭECQ?i%"S,\#nX' .?&X͞RgDF\ -2 -ϻQ -/73-.uaZxʣ"<熫,~7_y[raEgeFɀk󕺲FKyLآa4B5e#\+ל<)mV[`H]@X!2,X!`!Mr -7FqlN -8#ma o71J%zQaQ7peKUaXsuLxܲɸ$:J虙4.4YA4,Sa?X׈U1\nIgp)֜G08 g`fV^}L$uQ"/gK5<͑aHCǔW}8$9&(%xǥ9W:|k<}~ (t|XDb)4¿0ߺXpxh -‡Ŧ` 0r!},A_t?E>rbnwŔI()!gZЭ=Ƞ` sԬ~xqgR ^$&&\Q4>gDZU.{3/j>x=ƥ4!,-q2x 3Rz% [Tw-Y'%,])AjTˢO , -%"HL˅At#]B\mRSpaԨ5+5~Q|UHUӖģQŚZ7[b]qӠGP 47dX.{Q_z@W\g] H$Ɩàҏc>,B=AA-( -r^" oS?3Ĺ S[1"El<+h"YY>s~aXsJVzoՓ.l(;0*˩t3X3U bdhw378x`S\Eƪ/\W|L~Vb t>#iآ,GWj.Wkњ9<F_=ʆS2m ėIJ錯f*DX_%؋aQ'F@ Za"k`˽vDfı0YXgd - +E,xtKrNU0f/<. \Ş#7 [A֦5;43J VN̙e`z}j[/ Vi#\AbYw "c&"ހy,^cu 遥 qy+Fp^2HjMi-c*Zڶt5Sզr{cSeB[[@`¢k -D8n57( wYxAejcRp?,j3%,w`OH~l ZQ]6Q|s+Q2ٴ'Dw&moȾcĨ5kw -#BXB|^kY*qjOwÎ1S^Xl_ jELT2/.k^21Ltc| NJUhCY#D6?!`b?lVE !0[_ÿ > Yj -/lq)nNZ?n0Qk5⤤0o53Ɯ\'k@y'͞ߋ0u%,DМcl2$ƍh.VeITlWF ->34Lxq`k\^I11 }ʃ]h5c%/s(}=iW/P24 ^p[$UJ4aP\ Du -Ʉ,6 ldj[8G82k)eht ʖ t`Fxܚ;cq b/\oFcr>lTdrI`+H#RfZ*p,F_C8 Ʊ鶂-fpD A@|VJ0ƪ}㎦%6͑**:<^B{pxm#J1iʆ!jg,ܲ=('TĊ_@vmc-mb.^y zWN -q(&n]~'|\eVW5W~цɊI]+Qw"-XЁe|!a%.=WHG(e\BunZڊG3ƑPk l@Vow.^!\¢f4[#8[@raHQjJ"IPPB} WyHk>egIMAéb8Hx6W8|O3^8xv³Y \1D d&G[Heu,2Kq.T dNT  -.6KQ6i)]¥|E$ sF]a+<7D0bGte!:xee̲-]<rxY{"07>/=;0\!El#WMbz1Kՙay7o$URA*7>Ha ?Q'Q$j;=I|sI&i,rm~X*[]Cež[,+\m8ܴ6":%yْ"dp+/,^f\x/)>‡L+И|xsJ,&P',$ 7XAyCM{jMSܢaOVDɱj]󖲦Tf9Sl{E2[x")0+闀_Hro38angS&o3:&k !0φ1(㘛#QT7q GVܫ_MfH(I=*O3dtSxƢGDק/O'rφI_:C?Ms?I0@ta0Akq{q⑌Mg˫ݕDy|a܉/j(jgD_W3?\4!@K-Ed.nM}1کOE 5DhVwk -6#KPj0lG6#,Gjv*TIY⯃2GG|hvE x%T‚;kFsG)Cr@Id -"QKm !3/"}QT<$D̮Fuv4DJhA v/xd}wJܿ,fvq1[8[3=1/IEΙfC`\%vQ0BqB]  P=-_0=ҡd*57쾘V z2&#;GnP|'P"ޒ$sZ ?Fb>fJo@ !pJǁ R"qqVCQ~b-&1XhxOO >"[]KlKߒ]oinEu SO,Y^{s|u7ΖxIiN;T1xQpb9)Ɏh~.pʁIAbGi{>W9 '@.&ya,uS 'x̨|Nͳ83sϷo*욹Գ⊍^MB ~udwRB kuSot[lyIޢzϝp 4=T%<5jn^xwer׈%bABw40$ DA4"n4w.c e.!_zʚDfUڤ-i 1+2˖Âk#.[u@0ӂk#3F}lcF3 K-a%zydr`e.p<:]^Rq*.aȅF(pE~`9ˆwrT|;l_V0Hkl,KJ2r_!D'S6+7*>Y -nbgpC0 NEZƼ -.0%⩆Z3),1` *vʹ@@V_ڂ/- BTeRm\((LHy1E8ǨPMpl 7 BiWHZ{rݻ\mIeL?|gcifׁ -T4eͩi!:N 6"bk?l Z !Zpv@ewFb-tۍ^ -]+#R \6I" - (]|ڟm'qu_ J2XTzclrpZ 1Dk/*^&8q$mLglW!O)TKwV-!f(~Xf@cz>ZzT@q JlP˫(#kb?79&fc2L&"Ֆb(f?vux2I4#+f'{pa. <2 04DkTŖ")0';{Yw6_8dFSq_+&UVuyt|)mff]ad +Qc-`2啋֞0r3$zu4bGa 묉+,qCo|ݬT-.DGNB i0ASffs)%c -ji1Z5Vu"s+ - ,4) )=+31:臉 S -|x =SQBb_XK6UK*KĪwƦ+XwP_΋_ E8 ojZsi Zy#U -rf%*+E]hPQb+b+r,4NG8I`|8^Qo\'Ki3.!lbiBs 5cFzR7GEMa!*ni$ƹ|7+gR;kUkܙ}-;!Ē\IV'ܫ nRr|^ CayKJ/9ɔϛLDVsZl*AP彟ړ:+t@6o$~3++#`S'! ;kbYfg*A/gDun>U5<I^8Y3:{ߝ^6+z9X= k}Z-pf#0Rc89Ap|D/j.C|tqS1 -5 _-S#dDt܃ˆ " ny P} `៥1zonjy;4D+/̡`PxS眙.e;fgZ5Z3>eKcݳ0]KfH+c36hex^'ktj^%f VyS"ǹ| y>E?ZvGvjW4N -`#})7 T -;{<[FPEͶ:V.٦(gZL=Ef!b>I`P,H,E( p?1(UԳ13oK nX'\ÙKA-^(Bl+c(%l n|[oXdX5QtT9` $Px5ACωo]7r<u1!q QQ /j"ebۆ&>#Ž A¡s*bi3%AhKY ƥk( a0= IdZLa$:׈GEjмA2">!Z38n`*ʇT9.&.|l -3+q\S342oW$\ÜK8/||D%,s"EX= f, Ԡ j? )xZ+"V2Baę9ڒPL=2P <Rt⤌V>7 YJpCHV5WE ,E~&[>jScS=R"XV9 kg ߩ92=&gfFb7p y -$-GyV.w*P$j߼~f/d$MHk_nS ":Tt  Q5Ao-_YEW0ifߓ7|?`iixk"rt/lK#/f`N. VLKQ~yM7+_\// ;%*|\ @3]J.?r&rL,%Π9\OL!3/3˞zfy-^ zRe[ -hM~dlqK;^rĨ\ -Ksp}9G@} Jbe.U}ު%%jE-P'@4dqK BQBR-K2FkRM̨'߬ĽzH:V8i9U=q|44CZ`L _b3̇^9&/a'Ju,1+3ԭf7c|QB$  jp lbDbr*o7w=M88H%*Y<,F/9yPQ[VNA4 *#0,.Mt]`xv8:M@m CApP1BE䪛! *HN-:=x61w? F )qQm'pI3dHc} QBS]~rmtFqL!BS.J6.=Q%}ȵ1"@-?S#V1E)!'rCc3%bC:5N5+^&]FB*X81s&NF=f8d )f:u/%RXY!|el11Bsureb,;XԷFlq.pي -^Q)/\WY`E,BclQw/Xᘨ93`pBb 1˗x!;r31DB e J`!~RŸU̥15\tl[t t,A= 9qC7s)(J2#+D 2@iFxm(- c?:Io hV#bpP&!Ѭ2$`cC bȴ5R}k@Wbx:!*c :jc ff  Զ.fmS*f\q&|<}ⓥ/×PIps͑CvMbag,fovZOA8ດJ-Z#M:1nBhh5':|aB:CS -Ed> %BJp}0XDhmw/,ȏaOXrES[9˸5^ #<١j W!TŇcV&bIk -6¦ KP@fL჊;%fvq|Nd.b 1%D.#k7OMG%Z^XhXj,cxDOeQfHxNy& -VLH'"3z:ycypz8ح_Wy%s)=<ܗB1T\|VV+Ig;08 ܸh}b&378jM).? -dbgkR0SaAJtmD &? mD@JW姞i. Kb+Y*=jv)"o)G_˩Q \2׷l$1Ekt¶GfA]ƄDe1ڑ3F R40ht'_p9b#E,ǜe, E() ޒh-k{wVyGDKܩ5EErZau2)]O>Dgd +|fe ~!363RoRkgYo&(P -_ڔ~2zv"gmt$O|@̤EyeA8 G aw=yY 5NPvF JI:"3 ;T Z;'R_bʩT,$r4^ )3!5 sio؆MkŰ) Z)+, RL$Ȏ{iBKZ-YFZa!YPќ"ԩ\NKWqd핒o4f`֦qii;2O$Aq&ҷ1o <˦ ǒ?HCC ~fp v w0IbUT6Ŗ+u|Ly36LP?BkҎHyLA]G9>&,'{C3*m*)%lnH`V"1ͬ++ȧP.+a0 OK@4TR$隕 XP2ޥڏyS0|.R6"F#9`,[4axfC 0ڑ9JFY4F>L/oh -FRXCc SzKaUo=+q'6oncGR}y{%U,$ 4SL]s~"l7sb*4qj3J< wJ`cix %$L $QIjO=`M_b ^0Pʸ8Riu&~![ۅrDPڮUw.R10/|Aғ.<zڂvu/haoִ+|Uq [zIS0B s=WY!WuP}V&1K0Rg]Hq6/5 Kq`Vr5zȶ}!è m#]ԴS59(]t*vLXvƷ ɋ/_P 3v:R,4d#!qo01']ݖ_s!eӊ $8mnJ4ݦԺakw .f|`vzl"mZ_VLϢ͖w54x,2#ARDTZОBlKKrlszB3r+#]hr -[( 1Lwˮ#7;g^ -ˏ`.lQJơZA Ϡխ0n?v*V ~:DYY%Q-aSxGێJz -*$2&r^ -`I8,PmӺ -B6(:>TI#jqXwcP[Gy}NA%]MJ(TG~e6L5P-yn!O\fWOtBp>\L6EgZ!e 2< ̃Tߊ}5ZrwTNn1#IL;//XY> 9{$V/:%7%úl*a vLE]7$wzmuC4h -¸ _D/'!FC\q_F1ޏ,/tB` CI@(mP'7}Qv GpI#v.)A_.$Ғ2(@t;qppa|W:ݴ -^ -+MND_z?.{ 琔2fd%-p[# jg8L>#)^!(|'(0z4'ʼn6 `!@m|+}5~!gf+OW -XF:GPUڂ։DԤ?Qz,f`K4 -*`j .{FY,JH R lX ЋF-QU*! o:ob*jAZ'WCTj,*YWBbv 2j -D]"hWfj+?5,kIh {h_{|l!kG4-)q% ǻ"Dp  C};z9+O=Ќ*R}~V.*O7̹Ae-D^ u,pD)_'u&AzS{hRLYIICaHS\fVn Y%7\+3djN;*&C8_4 lm#[?%pc Vg3ږr,%"+GD7%kk`˴%w: -|~qO40#f9lMbSUq>])X$ -&ֿqa$'&aŽ~x# r?tFYpi8̘:+zĠg*|,2 =tTs!ۣg@fu` -xwL%wsCFS1`qa/U ƶQD -ؙv+*~Y+/cMW9~x5&a`b⏽r%7AL[ˁQ3ǡy8ʍq$ F%D >LTP$Z+ - -6C]Vff2ݺH2eN⥙-7U=Fi*{B;E{AoOqTX,ĭp`d|q0yǘA:ꗌ"=~% Dt{(ih#@c}YC9lB p",KT>VUn-16/$eq =c%,mqլ%Nuro2ƴA |&H!fPFRP8 7#UPKCXuw+x`Җ -+į"FX!^ --D [4 >WS,U7)M!F{2Q#eڎSE ˻)[JB?/م/EUN4V>2M 7@_0\R 2#a5 #l tጢcEo5` I;St@V)ؖI{̿&kƯ%eʄu/Xvh3b?}+޹NQjحҏ)PphVrqM*4 @jt˂\#֣Ɉ=BwDZgoͼ]TɠASԘ@^M[ćnlWE.0#=؀$!mz[WJeƏPUsJ|dF?5xj1."l'v,Ezk"QYg7q@f_y"bKP -".#b>gd,B`BpTٔi%2˓Y+P8£ wV!-LhV$2Q VWRYZ2>Cm q%zKh$%7v#<5ʊ׆DFk܋,j0 &HdGX4v8BڲD\_#՛лqR־yM5%@~~ j"` Ez - A?& qJ4*;łr by-k1gg+df-e -{s{:lh-]"xU4EjV+V)PbT~N jk+<6+d@+B3GY% %wVCMN`STKt+`@mXEºeM]@%7aPAT7zEnZdK-S"G/fbZ($[.|+ࣸ)N -thzASRmVPΗ|Gڋ?,Nƒj\ͧ6Q&hRwV"hłQDBO ?ӷF>,)pI(:t6-F#W/+.epqaB_.$FQ3==8z `WP8LyJYij"F a<%‡ab!~ {1`T]Sf4ů=΄9I!!:66`xЕo - k<=pg"Р+4+}8M3}ђ/W[PvMOoqkDlž d3kBB,"g4tXH5sk -78_g)Hyׁ"1BJAb;fFRg+ʊFL+9%_LBl/`M~fpqBm=1@fBOT@}EwhEUZlSxdLEwҸ?@QLZL"pAT_1KC|*q<eX2Ca&o; - v&~ r(Ycf0\X* *19=5Ey0a - r[5%pj0`ś~RŹbt + (rf^_x@L"-&4$ҫcRB$SO9zHwǘ]L;·N!TcY\? *P t<;X|SɬranHCDR_;߇oiAMP8^9^{f5Ijjj VVey! 8g$ *+m$7[H`> WK!@{u* -|Ab0Pa@aZ*G\}b@k - iD#G-7:T\cӼ 3ꈟ Qa Y`"h|2CJ$_FۜT^&L|P[PPUCkyX[hTi#rUjT t4!ԲE Zp';|E`*)nCuVF(Шiki0C, -gX!쫮T|MilmhJʙy"`a5s`dbZRcƄ+U{0<@Zx-"pZF1-050=!EȑԈ@|^+pNJ 2$`\S(bb [Qkt_@\U_•yVuQ 0clwgdJt$HL 7MlB1X_cZkC<¶ad6 -|\8=qpY-RD5|#J2BRKoĜpBjLq5ȥ?o&%s-9 'ɧw:V=rpPZ8H~rwq~+B|n`y-'S>dcݲ?Q4{_?* b^ -Z*RRUKMp{t咭[p<֋ng:HZD1_楻_/RfI>{,z -&n4CK=k`"_#q1Zg ,D~z!Ub =1yO<?:|Sw8\! QX|AWʦԸ ‚މu+tjW9D)nIHLCH3ſuy.2 Ϋ{G.oBM'dYiǼַ-](2˸<),-x2-a7teec$P[Pl&D+,FN2q}q?Q!]*Ve8/ װ`X-AFQ5, rjZ_FeWEԿw%`EüYEPk ֡׳ăM/pǍEs~vJɓE]!u 㾲)@-du\)vU~!!Sr6C߇OWk`쇿Qb*n6^k2 P![ǒT{`{KH0"ȭ4exNPE%yj7Kp#_L;D*I@ꋒcMy8) ΎW-M@+xW8QM8 W,$],QP~RK*[~x"d SBdpKgK{؇nRw-xyaLh57@q P@{|2 42PhŬv3d@-*5op7\řPw&C7 jQ{vB8u)Xbm!Aj[?ĄKK Jx`c8v2uA*$G2.ulʳAbhb:~~[;R ʡ/N -rb^v5tW1qvc*Ig#|x8=eY|ϴ*0_ 燅7(UgG~}{T~O)ݠaQR**rd ߟ0g\^`!_cEKo sRM۬2 k%Lbdxx /WrXeB-l5K3`ĀKh5G$Fswwɗ3ʾ/*N*{?^iϡʕ!2G>S漢D Y*O[Eþ (/m;]|>TZ| ?qYajQ>2MHpv1` S=ebkHUrY -n5J -vks\q'}8a>)۟C`e/q7ߟ _ D\15-]`LJN :_?4ݑ?**Mk+uւk^I X<Ʀgۂs\*Z]ٮ ya+OxPA(VueT,+mb?2i xIkU_x&P /ω♾(ȬD~>t"P4!-_IqƁ(:7ZQgOdc`}dZ<>m.9PŲ۸Jh5ƹ)+]An`1 -&yx735 cDʶlZu& (G婗_Z3җGw7cd6;sC+q{()P9h,\at@vl7*| -pkaN -qW=^я%ʴ>& ne{ Rp7dšXוVmr{eC>/N?r܎,.޶:V /?JAZ3WW?B ^hh)zIbQffeei~c f.^r&QYvŠx&0%9b M;>j3~?g53Գa3R Zz0ڰ1l ߎXve猩{Yi(lg†3wf(]B ϕfO8*T~,"ˏqn®_Om ;'!k}gTO"3?hBpeT)!UH_z|UCM ۑ/3|v#ۢ}c?hpUUl(ceCŹݐqڭT{pCcj緂$gț栵%-r/|_!N\E8}]:z?[dw@plb}5"xZ\U4kh/?n 5cT ;nxF tˬ RիUOyM>BF9zDh]`)].Pot$-qHxO BՅ^(l7AOTD_٪PG_*98+w[HZҬ(e`RcPJ_5Qb*&o.Z6^Ìsj豃GIĩwק@%v1.`-FJ3LT.HT0vL(Y]1hnۄ!ipar9N^]lq7x-2+rTT. f HNT_qweD%SRA0%psJ2gP*T9e+a-3.ᗨE WcWK%gp>?FaŏNgk\S NcO]*^ hH4C)bQhFcߊl+U#ij-pДz&_(=1^^ѠvT,cxgP1Lyh+6%̈ӌ'S%9Hяb*&znfdNIY*8\B!gqx0Πy㶾r,ZGyW\ w"֥*ä[Rڦ\N29Ĭ|jjڋZ&f% $1zAdGU:m[\FLh8(/;%rG('n -_pL 4+{FI|ZV8/td/b ǝHVժŧQ?;Dj_yxOB@H]JKsVc[uH o%_">Pn&_H,n󔭟N:~|xo&d -Ĕ"/p\Xg\TJcx5,ホTQ"z~Ycr‡8Ӻ \$4se] l+i_0SlTdӈ۪ɉ%yk{kloz8L9zy]dyULZ -0#Ҫ{xyĹ.o|L:P DhIRaI~dooosqiy) \(Äf4mʙt]f^ lHJ iTr,np.l_$?L}(d1y߱ 2Q1_tmb=͇LჂpb:BfjV'+TBC%i|(p\yt~!~Fa+L~g-ř[jbr`dTF#/… -LR*_1R;ƥv]o1\]|ze.NSNqo?W,AWFD^AK{pyr &Upvc"+}hzt +RQ}U,{^cv$A>U '\91VN_9>b%Os`gR%{6MD(>*#֖ٗ|hgh CXFDSɟzO5.6"E& -@BTnS -,Ioleu a00PK"1Х6*"@{) !#P(uh? -!% Y(-o#&%TԱ,Ev y`@1q*ola B/bu\a腜!8* /.|rJWW;#~6 -e4*lc: AQMz]rdy#W,VYT~c`oUtRUj7< -J+go/.CWrQIpfC=LD(.`aKθ2rks@K F`"] -sSȡ\k2FT~37bvIN71xE K`0ת=]j#Qf;HN t˗<[i.67 O⻗ -u^x LKcu ͬM[~y.:3gEf8w:화ߩx^(h0B ;er*ygګ."QŘcUޅZ G+R'\@:S-YEbdC$&77`,sf!rcMO2ϙ٬ 8ܾ rfS"33X>eqcPr!Ԭ/E7`3yXEinjI6j+WP4řn\hH.o{/LEScs9nTJK%.&L:zArO8RDz, vpZysx,r YK!,&nԸJ~%s5xPn[#Կ5 j_Ӄ/i*S")<q]JSi9-xp3 -atK7ôLIfxTp a B1T[X|"/,teyR/$CR2%ᅍqw+1{mp -|2|hrRyP̐7-x0JOܸ8E2.O|wp&9Uc1d̻[bgdn!D%[-u77/7=1S05;!T81.dw,]θ xe|&Qv{ʠ9W*f>B9SY&:fy5W,. zP^'(L~.YQbn[ \j嫩fbԮkpq/]J/j} qq37P\Zˀe_0$ψ \Ը=J{V[0QtT!L̓%i#+ Ƨ̐!co4Ex|._D %d8bPuS•e{5B ,JK`ހјtDjk0aa.:B;-O:cω2GYܨgZ’'߹WN̮4BUy/N!0K !3ɹ\`#< Qb4<1\AᗌgF k7099 I#P?QK73-'^)iON:̾D뚝*(!Szޥ&J!ŵZ ;?-B&L0zTϩ~%f]8l Mv(꠸$Fe0Ll !.WNa ppn]P/c_=XG?boK~Upgp2333ι5 ??J#bDA?LYB;0<5DZψԼTIJ/ E ;<_SzG멂aLک,'Ba M˝q*k ,ܰ(C&s!3Þ5Qx\&D&0DRʪoPx 7b;aR3r^W|}MQ&?2V?&etl+|^lj灕;5IqU.h>⻙\quS:ˈji%ٌ;y3 eX˭Kn:,RlA9X23ymO@0m3ucq̩9x~8\'V3iY¿RaQi\#2[U'@̷j)H2i#3:F>Fש@MrK L3ĸkh/yþ:qΗGUPL!}w[xvK!.(O>̳A4K5r sKcN&|C.]K,M :`+ z3 A>j0%BZּ"͛C)x2f]U8x#Puhh;6dV%KQkS@t0?U*8A!lWi( q^>&w1íC9 gT nhdĺrwzwos,2k{"}˼ [tqXk 5/4 W!Kq.8Q3U<*T'D^@e} _10.].@)5;g uSfw/sZlqd$pc ouxb+|KΥ*;d* lT/C)x3 -V  γ~5 }x ܿFk00rǸlp^.,7s;LpK3+g&oxqus|&> T&غisR+ܾ.8`*^LKjfWPZ&Q[繒Zᫌg3, ᗹ<<x0 /KT8Rۻ>W;aL屮21 ަ#f]|qx{Y]KxF ^E%8ŗP\v쇹ef k\n5Y:pP1㏃LNH|GXa C x+8.|O 8HΦX;7Ze\Ͳ*fqL37GKKe]pJe}éKsq&)̬JǾ*%g1; ]Ou/.Cs Ax7N,$hj^#ϴ+3/3\bolIr{Yf|̸rE_]q,q-=Gyr238vf}Kno$&~%Sd1 b[ ,'=LK]J1:4;؜B"k -x!jd4pYUa[ x.mfbk ?+vڊc<>Mu.zగy'Ngr3\_xY!%7X>9yŨ$Grzxejx_Gg5Nxh K&6kBoCHaY{R?%)^ۙ| }fܴ\Hp6%>܁0SP2Ѹk07]G0nI|82¸=Kn~%}ͼ֡-S-8?iY._DʎlKLx8r .e\%g5 53kcX/=jW\g :i,`b^!.Z?h|3o|yX/qb 6fw5L -G32 -0+IxC ^pAB{E(ݽQuz"}pec5(uxRKGh0\ze-̼p^>cz;}k8Y㖦f9[ȝdy/8Npq: ,s̶tB|1e{ ꡒޱ#`wUQ6M[8di C-K/:q \`|_yq17Q<-;,̾.^x%1;1TuͿ^7D~E`n3dljwωtASXXpB}7rN,^BsnJ8X/ !14y/hY 66 -llx4MQi4MDˎg:̪2Gv\+ -46MF -JC\8GX*"lIr0)xP,+`H0I2Yq]:Eli:`d:w(*gPX%d\V,^+w0?3#F$w/RCd O"**)K\UA lm"QB/) -M/gBSf~`AF!m!.oަi-B'µU0pE4s2-`S i 4[+UyU슴ZˠTh7`4qA|˝O1{9F -ʪ;b`2S²ncjLߊ7AYuX+ @XBQw혉_<$|ۅT)hDk,NBAM#( P -G&ᘹcH֑ܚYR(wSs x؅y̻"ͬ 4 [A fS)qG`FwWRqZب.7Pm="&Np'ѨUq1u0z17!1QU+2#<8{18ePnlw -0sC3kiLw˗>1.g_j>!|u«\8g|^8eъexI#>nw.hŇ 3!.u1\-ISԮoǸ43!eׅ -tp<\@͘( ;U<&sH YhRBG0("6#珣sEe\x}N^]C&,.^B^q2q|/3fn<<Kyr-0j)夶4/ P,d]BEb50.Z$=s翬iW:_ - b~.5D[zC~Pm& -J@~Xa0 gX \j $lN4-X4O^pdAvF*/_:*KOWF'۞57%BCÄj`k -b&3h(Qfuϴ߹>SaU5YqN0gyDŽiiUct'*[\[; ဵq.!Cǡ1[TRO06CfwO̭O|\<}x_B{Vx_\\@"ƠT LF{c{ va[ p</];+q(եP@e6ՒSC; jVΜl#`0L@fcP0&< .&p+A[a߳iXT_[__8ψCcqq1ǟ375qc\,X a,&W %(|6\K_}!&>}/+UsVH glHdEoD:P,:*э.ʌ]~pW3tA A_@ E(duw3#Cӎ'A=B *C.ś88OÊ\q*PW5aFЋsJ{8 z/a;8!eH<hP`,7̭@Q3e3h"p Cױ4671kgH@}]?__~atRʙb6 :%4Ι.\(bL 43AҿjF̎;+%Y?A<ƦjuC޵\q]bEL2v~xp5)I55iC?ƒ_ 2רanqJ7>yxz|qş=$?>?X{3<"I_6FNω+ó "\ZC5$S?l-)%P_!h]X tEaU̐ 3Qv^>fc^:Zhҿ.%k3Fih3-bth/B_!U\U?O\K'nx+(L~UQN~ 60 >I_D0" KЖ#` 22 R Z7{(!Qv)F%T*41dĢbz,T +N__Y8㿤}tz, hP}RBx늕L>gs\iTJ w=W> q~NY?36VN#o ZUW( AH6 7e] 5v"jq.=wR - -}6M(4J܂`j`])$,ql EKta *WAqJ#L9@C<"t$Ep- rp)$[f7Rdtc{3f+V"R -,l=l;f?dBXeƖtB,>B v0@L` -AAID1>VRt{^vC gV@xhMxӪ"A` (KJbZD5|ףǎ |h Ո?K/qk;*PݼžVnXfW.n(륋!WC4)f5(qB )8jnAw@fO3^/(<"VGD;!a -(8 - -2!OB<`Pqjח^@8}hv*SI~iȍB*׊K2cE^i -Ṍ֊VҸ{CZ!ZpR5\R2\F*z4cQ W-⸸C1>1Þ*!9C[(ĩ+Q1 -xrJRr%eN:%}}\by⹿ls>L|o3b}?Q3Q>R*;!f85uSwy鯤;#cLr?!8rqrSygDwgu*m)@ Q"2'RMW)SV*WUTF) iUx 8)߁8 Çk.eKO K*0iIxw/&e8T&ix-yW%~-}C Б5|\Uڗ f*UevDd OU9[T\*!Zp9vL[_\&(c>HrA _W6F^«kY >`"ڮC#n]fm)K,2۶'$Ũ% ܴ||T$hڸ -bՐ눗WPpҿEԾUbt.^Q]uY~]Ӫڛı;V@UZ(DR7GݝM7sAy.R嚃)Kx7M5Sy7t  R' D-h0r\U)͐WYp`D)x?s,f5Sc<@EOD$0,|́3#1>т80DQE]+Zw_=0+*ho*"@OԳM'њ"/K[otHRl|,t6Rqw1m_숔I"wgeoTvP_li6Z~z{JsA3fQ*.BݹQG`jyabT~HFUٛyq'eR}{1~`ιy|,/ްj5dR;zIV,s!lScjR -O r F'oP?qY/Q³Q^Ո"Ɛ-,B|̼$Z?'ha__0;-uya Aـ|?1~|n?Ĩp^ -c_.P]|8L7~D1 -;o=+̈́y?܋U80̽?¹c1FNʃ`>9L8Ni3Ůd28g5@<ސWlczޕ^ Ўz6̌RەcCS')sH)OO25/(FPt؁~_@bysp]dUp^e I,kW 0B$SDLN'߇>g;2|L?xOT@$e)Y7>}@`< ?iM|1t -Pń?>lJ2/(H*n9_T"O(o%{a^>)ʉ"(M(X툈%WS @ n0ſAsc@]y!Xg؁?ΓW _eO2~sur8S_ij~['O H~ؓ[?bk艾D$_xrݴ6 A~?xŏӆkhCC;k~$@_W=P{q"g c(2|ڸ{1Ks[< a A3i>DeMv ,~A0T_e/C|<=Ń{5uI,śVx.T,y)z|L׌?ejWqV8>8t=B ̲p{=?0SG`ܠ+/T &aNJ Ow'v)qA(~|gS.g?0) c_nɓ~\JԮLnT sA|u]J<|LԮ2;_ ^^J0weEKdc,07q)5(<~ɥ+,8G_۟>gOXԩq_%V%Jytg1S'߆:f~ _?Cy =ܽGl[yg8[Dy&Y0_igJog? /N<2dCX=9T k! ٓ?Nk?e>/abxo -38?tď??wRxL2FpHa_/zz|!t?G0%pu)eR!+ SXanxf]P|^̭MF:i#!f 0Nަal.[ě]݌ǿ󢻥eL2V>@Pfh3[a=?cN8ۛfUWLYX`KS/>)m$C%cZXp_>5?iWE9?xdig'1{3oROO<Ʉ9%eIXoWp/*F`54?Ms[% 9QC(X3|u$t>*MZm/Gꌿˌ9K/&)?MGYD2>f\,~rOŒ??ٳT?<ׅx|?"rwk=!~|w?aV-i{Ч\7B5BL,9S(,F?00Ge|!\ +fi o£@Av #_uf|ZA~ 1<~P*?Â,W?x? 6~T'e|a_Y?~+d7\=0O~QNy75_6*%`D zmO>_Uud0|!| e3? Ã(ȫc<#N.y+/;8{ s/0 Kq*|u( IjO%TL>94'R#"t|{zY:PQ;f_[CFq y/:`${J{wp!l_e35I<2F3Y?3Ca -KnpM1z=/x{ Cx;L'c)LJOWk1I^Jm? Os#[Fak?IsŦ~~=Me,# -gsɂx Ȓv?টrcs)ߜJ_$qgUnP4d"g'hL9gǏW>C2_$VsSX 0d yG+>x~q<GG>YGʄ`7|΄a |w/guc?@ߒS @C3sc2?eovTR(S5lUc'0v39xG-p0Vgs|uc`A|WjWp,6}ٔs.agwǁYȭlQs&ǼT s >rj~BOO'Ӄ>c2LoM4vGf'3od')X;3lXHnucF?p~~?R ef -_Qe8$nsp7WHXnZ+Ys9_̾hk$ ^ɛKHCpp_ -ק߀~!{g?ś_?Ǜzk1_?-Oӹ&aRWuxe$@YD-k1񑩔,͔tr!??ی&kZPVG'^08 ?v_D?! B>s'6Si ae61H?bM#a_i\\oq,?zh}~n B)W1cM)>;@K:\CU&?&06!p{@8 sEPX6'l'7q1^1 -FBuҢz-7 -&+"1 o^ߙ-P5 -1Jn/ZܭE(BVMdTϋ_e6C˨(T0Aɯc8PA!P4$-GTSЯ~G~YaX3ǪcR8L+Vf6%j#lPKʆ!nPR- I - #fb0f)  -s櫝qj/v𼳪0!:RV`K>6f IQ6bUjʁaIEbV#x ʇb'R#[ĕ(%f}@ \'dP 8>KƢYTPqX`KeD_\ϓ&u~H8cA<):Ǭ{P,yHpp{_Bq9U=Dgi|$ԹW YX8gp6ǃs\y -EriE h`%ŗyD._nƥޠz25A2zrg, `.bU3ԯs~u0 F} \~4P;\\}Bu/e.ǞOqN?0ׂ5A; ,6ڑ ӕ [j9'U2լ$?7!9MeĊ_lTΈDžfeRTY&޲L:mͳefGK 3Ԩf>e/ sn;'R>Q~'rǞR9Y lDm𹂡l {ҾNӏT葨nTႀ4Wo0ēĢd0؋ne(c$E[\b!қ4@ZFArPIe=.7VNGV*R/5>agCG= 2ϒuǘ-/<_?yʜߘL_N4xD5r^՝\9gpMLȅGn7H+~Ew>LB|.z"0rj=5i Jdȹhb} ~ -оR,p&eK/K5s$m(F?^&N/xyA15\t4N{9(6F2;{AϽ)gXc24Ama@aj=T"R@ju{#Gl^1M_ RB_9KXhji/}ո4&ɹW̩1+q5dϽIz}Y%1a55\Y&8gR -Ll{#ku @b>vMofK%B,Nxsk4#2u~!f2M&Ð̮54ax/7*ӌǎ53=(P34)WbKA EJek( 833ˆ&u4& !Aw|_[F`I3 -é < c4BWw6J FtLNxĢW%r°(rcow13O N#?hKeW72&gY&(s MDa)j1!~wW2Wy%o/;x㯥aNg1nÇ13$;epkqg0g^ -x>#׸A.bx:s/~YL؎x\^efT7/|x?GuƸ;DYsCJM(^c~8xۨ}+gf*PxB**qH30&~GIk2;**x7K.\qxsFweCRכf<2\RJk3L-4RJkSUKx\ȑ UµpC1DٜG -ʸVt'm4C$SWs-^vze"8o"8 y`GLJ/أS 罡-;7ܛ"f"H*7osUx塇c\Pcc!SpQXhxӬʁ5kM 37X!S¥]_b#p*VN7jaK-®k\??@Е8)kd2ĺ~/@C5s⚫`Րp6|"p k̅ |g UpkHdh =`ʯ}])yϢަ'EΫ*04QDF-IK߈&6rJ.Rb#f^?."W >t*D:Ij|0 d{!̝brD)8}P[Xs+1oPS+> `( emm5nQ..3/o\<^$Uyg‘PѪ0I@1#Ij} }%Dh>?~,5LwS:6/3:! e2ΨMOICvdW8`zvslrN=~,LRc'Y 7Rs|ϋʸs␠gH`9|PJG7&)`#3cE&BY/~3xx|Gb9L -yC}#ho -MߔD#9Po@3,_*kg/VC@/. G#SJm*Zu?fA&O8*(vk -[*Әx;A&Ȱa)xZmO~Ś)@*>djۏ&"W#%Whi+= n)R ) I> q~|穨MbrAxYpsYD33~/Bb:8'ldU$Mx_*20QȨ`qڸ> J #AUd%XƃD X -oDo{5;0h;$]GJw!f! \$"QHo5Ԫ0إҠ+)窛|[J<Qe !:`sԢ;i6cm^\{U(y*xTqE-T ke4̺#1VzEoCd!*œ[CْVJ&EF@-j`Ea8֌b5,|B*PbbW5'|PiBD#`6IY0 `qOAk71A53:Ñݕf\Mr!*\U<@' -rPRTeX!"}qMVE! F,eTguKy t1*R\gQLVfeN7 ~|X[6Y4A|htcњ: ]D&5/M3xXqGg:r_Gt)D-DS6$c99{ORξuI7\-Ը`C4kWTͩ&S6!z@QIcSp,;1}y+ddI`݃9͚-#߈I>PGmXz7cCm;BWh?LKz]Fx n&ew^)<N?lVS C3+J+k+},N 󘤋t7ݣl@ ̪_r~*gl*Rv1 Ln/ tBԌ܉D$gpbޠ?&Xw`W#.?AcS!QjHE&@1] &8qW*8ʢf G1 Wo.NoCHc?UssVxܼiƈla2?i}1IQSE}T_f-y2pxb79LNY}Ef%QIZPE0%K!ɻ@^z .@@ Ka̰Z?4}SsO >g>DXO`?u`ҟWȩg$RƷ1%T%O:?1O0Y/ z!?* S -j>m®ل0} -FtZ]ZEu،UUgq1iYZ?S?<ק52P ^|H%&`svajmebO7O*/ -mbbP%Z\ YaD02$gip;`IpY䩋/Ǣxw Myļ+ F6*,c6,\m4XjAXbYSZ Me|Fq~tc\B,]EU;!,17>x~aQLZXVNB=,-X(#fu(̸O|\&710U)U ,>} 7;JFՕ#ڿ Y'm(g6%~fL(eq~Gs]hK+ljY*5YOAjU0gHM$|ZTTRӑe܋尮N\G/ -3nC0_k;,E6âތ4@؊|E%W YZ/N [ Uv=#.x)b ko@s>W*|,)mNm,2`X2rMZ93)auQ`#`pLIoafe BS2޴y`ϬA4 I|!`fu ];pL2 -a@ሙCV)? !9WWl:5cLsx`>Rq4Lje~2\g3qXagܞ&f<& ]rʻ3 >p4C#c񂔺Ǐ\Q tN|on^/+\*Y]e*D8Zvwnh:g11).[eYlc\C`) a8iO`tq[.ILy 0,lD dG:m"-bPdQN+<@ ĬE։iUc?V%bmQ{#J%F`Bn17pPbO-=an`yR._ ʿ#z=EӃP*2,xL|0erg:vٗf^ّ^q#-n\pEL0^/W5?xnTbw11 sz~OD@jPi;wi@98+$fMX4ya<U݉ 0[7Ԍ0/cM%z%L.P)loݵU-[LL&MRE@3ʨa`ߨ%&3 _iwD 1y 6tTC4,2wzcƹϞYFx>LAs>%p֡.e*RRl8$F2Cv[p  -4/R:Qb5> b-dԄܪˆىnP}ۺ: -'DZ@ZP5(bZ3Ș`"sȝeV0 Ѿ52p,!0db}ptCfYg cdk;DxcIJ)7 ]!-@f#,H#14 i2ϗ,~K2if+sвFVkTW[*C@6?0E$=<_̹s]J\.>Nsb8p}n08^xJd)h1oB$By^ǁV`2U-E D0nlXw^>SsEǭH3-Pb - 퇜+_&| I*IF.VDً DT W:M"^C;/JWgKo*3(;V^?0ӘT_hjPIh04]ib)ag<Ca2#HX00lEnO& C\W10~mfc&1䱵 e{ Ntn?6h1n~5 G>L"L xS0](yC)  G@  oj~E\w?rb+:\BI -_5 2 - k8 oQ7 ;.|;KgljL/w -sw1 S&'KÌ;>B=]) _MP~1j-OD!J|c -vGj -J$7XԮpFQ*Sٯ8ZI\-:8>\1 HqD6fRsgW3Үb:F3}>ؾ }!Z]>s5 ,5nRH0S6H;(Pń}87! -S32+1+{XsH| *:*5?vJk uJ7{`{b SV=Od&eŏcSkTQ q$<#_iDYlEVU*dK>@cL(^TU{^xTzWfu 'BElXA`>X[Z2͙ù.T!_hڐK %{G3;ܓ+Htz =m[&Rΐp,4KJ>?Ŝ8~ xQp構SMG8sܔ*t&8*VĦbSX-18@ZD"I)U1*%%bqE5`+*WC\R \&S|2U#7 %]-j\^j: _F%_7nSg$x3fqjW|+y|fb"$oQtXEZ"_1VM$ 32G@5+67FJHe { yj/<>5wGre?pY+L C SdWRBS*WW=' dQ*x%guO7{#+n+=kNΦfAV+FkQ4o W7hx]L-˭GY1sJ$솷fخ9SU -w}fDIELidt3J]گPժz]RP؝_i@[Rp#ؿ-eYI41L.Kѕ:f!&U1' 74S`2wM1GeqC?sĨđ{3L78fq* -R5 P6 -}L(&a3f|! hk0+b;,2bf/,uemjrT>biZ`s:dl<ݢoʾ@PJ8E@3?Ɩ5A5Xctn>|u|~\Lgֹ."e t~a)ӛH1|Lǘs̸}Z;W#1|xGs[$fY0p|C۹%Ê #S<*ʠkžD hIAjC` K/@R;pcxxb^@ -9:/ $]oߍ:<S /Ό?AkW;> n|q+2L8cUaA'dNG'1.|^4~z #q#ZeW͙%X1D*SxbLeb(((>a 0ܽ @`+..53AAX 7Sra)[k+,rr٦uؘqg9MzCXI'\,> -AF_V _D"c8qF-Z?NvX&;=L,~DR]keߐK Үj;Pe1Ł zCR@9. -eӣv P xi`ͪavb( M#.'VԸ_@RBHmoB6.o)~JgF[֔a#.lO*2`,ia@A+ڂl k|h;Fe4\3;!\\*<Vc1P72ZBP.Y篭3S!H!En@-/,"Y3U6R^NOPnkSNj~B(XG J/Ľg-, -4y0]zd)yok4\@O용ugC|lÁOG"tGr-fBΥ_QTn<0gDKxtCŜ:hpK0>x/P|"H,:E1& `'X7"j6E[H&#bwf. Lj6p|1\Y-,<ǙՄQTˋʀ^hi3]Tnb]v~$e0~{c$4v-Oأoh[Ќ3O3RLW끀""qo@^=\d-Ρ˩l4$ك^Xa\L ?iVc2jD| 'sƯ܆;6ねb> -~]/z74-2m/nOTy"s. -`;M\[Rzj1pUd QH &squ]iϚ_Nb E'o!\uqDbްj:'dS/>n|L^5x2COpM1FUNw$aJ8,7fSv@ eZ@S)B}цg+8%s43|1+:涰\Jw{9S3ZPE |%P -OIGI,E`mBh%!.M VVxaKe4n\!%7ٲx;scMN\c(8f8gCCġƚ\IJQ䘰(1GƯIXGq2y*G(kmIHPJ3 [xRq.W5;~M'U)'\1A{zqgG9>p3DB7"U *ق E.Q5Ln؊3k^W]w J"R3^ĄBT]UWn&"c0MZ\f^98L(9Yz(ܐ珙F'sԹMk9*s-ľ!  xXXp3 ?-& gLC@Ĩio."1sH&a=j|@bcX# e3P`U@LP\c\<2q=jE_5!+V(-"߃Yk/g;ggGa%KE͖1ou {0s+; :ʕ#QcS_u/0p  :#4#Osy T8:oQ!evH.;PX/ qjK>"ń8`R,Tԃ(x`OԧO-k|ns5*O=[#x|9u++ -A̹DXЩ@`˛ua9u_0Dcst~f'qB:Ƹwdj -0ʔAt5W‚ФǬOhBBQXX|\ 63.>XU|C69/E3:s3թJ%J/ʔ5T$D!nԔ22Y!pH-l<)TIyin-jOETBA} + LKg&:<Řf7_U:ISd!* qf9m3ufg<kƲ,jVgQxI}^4ǜG0=IXų>XZSquU MB\^bb|:j8!,sÌuθf*b\&J @%J^/S>GC)w\b[*&/eU׈ϘLY;!7 uN:= 51c&7?:8}K&"@5/& .Y^f! f!s3S| -mw*fĿpJnɧ\ Vȁa^Vj#45_0eZM!X1DSJd 'q{Gpa4ޮY~) L`...,#wÜsΎmޢ"qa=s - Nx] لk|8Z9.55l3MRP3  %f[ `ͧQryp|scc,ĿgQC<!oq/{'r8*}wU33|&^YqܪevT~8PH3F@F}B17h *5s,+sYț['Vk?PmCA*C9^ ꫧT60ֶg枸K1bpRx <\ -c5@tJ`dqG $ q -_(HyYxL0Jq|W&*{U܀-b[D|P^@r^)%fUQ'۾RˉP\Z!,8h7K >_Pp2g !CHT $O2YVws`N:3S5|K uvX;b6 h6oJih_zДoY`bB0x2lyD:aOV|i3|Lslx^+?V,|<|qῧ2^@[V!dCC!pq^-oɁ2 }_q4򨃚ffwÄcpR ԽL-Ral v%ddcԐKɡsBQsD'h\H`#p7Ӹוr =k(|e[ 6{_$ڣDqSvhfBuқB?TxTLO0_ҏxl,\A$j@˄8& ;֧IJT0Dj(c%W`0Ӆp|Xۣ5D5JTq3o4@=_V\ib\NѦ"_P%6# {cܲ"X`>!X.Q%Cg?*g_gHa5"E03YP4w;O^ %p/ū-(R;:WbaM0isaf9/뾧DIl!+*lY+|ffe\uy}g6* E_ i ٹ o|YR:Pa'f6X $5/OlL*wҗinC3ki`,j{Qr65 }Rp*,u/{-HP\L--XӀr]4X]t@` -=޸QH֧kEE0/7/ -WF/wCV>pmC^!2\jˏro9_.jxN6CQs qbc-yqe@<(VVH -qV'Fa1K,0 >l&&GqQP.`1dF7cg&05ԆP;=;Lՙg{;NFJa|< x۟fG2Uv;+aI˯u#ܮr2>:CrSq0`( CB-vC=)%6.Š;F`K)#U5T*yݩ)pLKa^~9KeKOfyqpfzܶ1,>etHRZG7lQSqXK8t3zP܆)SF[%<'+f%+,G(al 6s+aE+qm/lsx;v- Q`0?7痐P܏] /?`.Bʒ #eUM -IeP:Ƥz8Kh tCD4Zz-Gq0үJ}Q I2£dsaCӑpKx%R\];ŵd%Fu::1 ĝk|>x2C Oԯ7.yΈK~KK.5SLq]jXb)3:|r˖*_pE?hLHB/^zlNα92yWG_ Smb-Bʬ?ebsoN>SFP -Ixm.WI;zRJ*yl% YyۧWUJc&z m>Lb%ƿpTiwz BX# _PZ@^b3$<@Wbk]#c,:LXr JH|"!hk0{YܙϱkIjR1_*3cey\ˊ>3 ;1Yg/ T!:nreT>i!02mט3_Ī#{pAFߜWլ鍶ꈟ _%Z9w1 5BZ9Km0 ))xT YuRSyZCa^1C4:r•:6{lt5BS$liiAw`Q˨4 -\ר{V%Zյu:lxM0#*o<6f]?qz0br5dlb{Ds%$?bFJSa7=Q !@mQ,{b8HNdC<^8]<]0j/Tq\30n]B*&g˲xAqQ倬D:ZaN.pA!F> V D.X'C l8?faZhtT r#p_=;.jVX1iOYq 0'ixAʖƱv#|njPHﺂ]Y…iE"]ʡ^#49#`[ pV-~&qD/rBU?D%TGww XF47Qd7mqǙq/ njc3^nn;Bf0SovKj\j^'ԽA%>bRֺ5Mu&h~=QdĽbdk9ٴO'bܵӺp[g!wcփYj_+d7HGEK+_X< -WJ/Bj`%7X"x4-Te(BtW3s?ɌB$ OA,F3q?1p"DH4Tp0h!Af" ~X6\␯:\PŇ1֪/mYl#pq:G =T'S.C[˓#8-_uq3gH/ 7Q%iaWa*07L[9 H LtdA`E5~墘[P|F7>$d<|c_c1##̭m CJܔ* OYBU jFQʕQH3REܙ$$ DPOوLgoN~ԙ-g6!qto9k췪:_,R}F|%9;H\\O-qYCs3Ts .dY"a&?<ʗfŖָqygo\r8~GL˄P/% ݎ@/i;}F -Z1:JGXꄅ1' hXg@[%OXb#Bŭ 82,EtƏdE=)s;їQ?-p2C93:ή_ sdxp85q\B]`̭H=ff$rGq+)C -8My" =i3뗄F9VgTzm918Ơ4X-baֿ* Pyy%pU 6EZ̸.,%U`>PN?SasR6obJsťxU=EG7}X2]UE|hȰCS%JBun[iHzwK0V+Pb_ LlRABႥ`*6Va+i @#!G}* La -xLuHHf4F4#܅ `޴0Qpr{#/){.r.wzK.3n`ss,)뎥|y%<*x/ *{\w$>q4DBJ'ju^'lV_ ˞3rx=f/H?Fat˗-M3s\,\u;\WbL.d}zpu8|D,ZU˗2Y;<_KK,o\+a?x r.[rj r\ ż\u>.˗._/"^pLQPDf&xew,⡢^xu1^U.MLBYk~`-ypIrrR=2Pr1q[12ye lQ1.Y.|_,x2.,pl]Ka x/3Xnfٟ3*,%rӀ- PKn_6SO/rY{2fX\Zsr LK uSV&z͒lymcX߉LKbX4C9˃55[]2g C3ψ0[BЖF,] SH8]7[[yRdKZ^|KǸ2KܸT]wj6f[.^Ip6˧R.j_J!s'C\).]bvBSzcp0eM%y >>s5j_ShXkeTualK% IR eXKrn Iy˖̹r_>\g_ucwͻK/]1P'VEv>9m V U>w|gĶSVL0SqmO\|sOD9ZS7y%x2Ve7+2,1=ɃRB ZKKR!c&#" AKnvfE/9SrtXw*jfgDjٛnUAz-쎕/b/>e[ mM!aJ|J4F(()z%kS/ؖxگ2qg, {X(tDEZaBRqXV'{LHAuPQ.kzql#%dƌlA}PpUCL21C%blLcDsp땵Y%X]5z Dɘ_9؂PӥreJhט,犬/ŠK,cq!$c'Va"+&Siwrʶ(yRc*CZeHv&1u1΍jG((i4b,kpe 5w _]krwOS4 u"\,wKE 7/[φ;]\1h-: -U~WP&R0D -n)2}LRpaˋ*LcRah^sUIqꍽG;V`6"IUWY/%6VmaFH:H^)U3,k>~W| -}5Lb +q+#1_ (#dq& A0P1@!`pBQ?~}e4?=lĻ7롉?l1#652Ym~J7,~!nԭ] c~GCc౗n?lVTQEW?Q`B/"p$ПȼZPFVTQSF- -p7Ѕ?ش!ӾUN,2C?H*+ࢾJXPv[#Fv,gYcwܨN X9PؘŃ7bu&6'!bjBt6'QqeKR(/:}E5~Ee,PŊ.._^o UX5ĢhJ(yqTPEbмV -X̿%C(^WEeb&_b5 ^Fբ5EBe1((+䢊(hʰ8J*W"ЧF,U c,4jh?c/"'7E׃G [-߂PT7eceyQE4%bEPІUT$QCE"BC6~MQ/ɣ؟iM h^K+e#S"7&eŗ9V,,6YeYeY~,J^%ʸ?iu5iEn7>_z]]CvwxO]]k]vY.ǚW,_e(_q}Kx.c_Uy7_ oĸ+s?/iSyuՕ'_[w߸[/pM$?8]2ѫ+MsCn+<:P /x>7*u.fk5 y5 zF&>=Cнכp3Bj2fhPй4(\8~eecg}"W,5g}Wk>_⩲ o诧N*ƺEYQ}Mwx!v_\?{BzBX- y>ˡP^ C sq~+YWP:X xlq\|:ɋ}`(+ -o, 칲,e$ @P0A`p1!Q?݊Avz8S)C#:A#jUPAAWEA8]<;8T V(܋X3DbQŖoF8 Ub.Y㓾NYz7` aߪ,|#Ď?~>qC:3t6/0C;CyQE QP(Eۨ!D"D"((((xߏΏ7 -շ;ay~gμNh(<A|.1cxBQwGЋ-e=wxcUp >/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000017801 00000 n -0000356550 00000 n -0000356681 00000 n -0000356879 00000 n -trailer -<> -startxref -357016 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/cf94d74d-94a6-4fed-9056-b797ddb0b1eb.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/cf94d74d-94a6-4fed-9056-b797ddb0b1eb.pdf deleted file mode 100644 index f41c0c5..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/cf94d74d-94a6-4fed-9056-b797ddb0b1eb.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d0eb9319-72c2-48eb-a961-f9a7570703a8.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d0eb9319-72c2-48eb-a961-f9a7570703a8.pdf deleted file mode 100644 index 311cbee..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d0eb9319-72c2-48eb-a961-f9a7570703a8.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d1a359b2-7579-47ea-acc9-0e89ae4a8bf5.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d1a359b2-7579-47ea-acc9-0e89ae4a8bf5.pdf deleted file mode 100644 index 45e27cf..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d1a359b2-7579-47ea-acc9-0e89ae4a8bf5.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d3532b56-4168-435b-aab7-988a508f559d.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d3532b56-4168-435b-aab7-988a508f559d.pdf deleted file mode 100644 index 7e5107b..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d3532b56-4168-435b-aab7-988a508f559d.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d4469f4f-f9b1-4e90-b0a0-9684a68483b6.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d4469f4f-f9b1-4e90-b0a0-9684a68483b6.pdf deleted file mode 100644 index 47b76c3..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d4469f4f-f9b1-4e90-b0a0-9684a68483b6.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d4fe463a-afd0-4227-98b8-e3a357c3fbd7.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d4fe463a-afd0-4227-98b8-e3a357c3fbd7.pdf deleted file mode 100644 index 3f0b2db..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d4fe463a-afd0-4227-98b8-e3a357c3fbd7.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d5a9c937-729e-4e1e-b123-72397902add2.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d5a9c937-729e-4e1e-b123-72397902add2.pdf deleted file mode 100644 index 45e27cf..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d5a9c937-729e-4e1e-b123-72397902add2.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d7ba7c47-d0b2-465e-b657-93acf8e706d4.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d7ba7c47-d0b2-465e-b657-93acf8e706d4.pdf deleted file mode 100644 index 3f0b2db..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/d7ba7c47-d0b2-465e-b657-93acf8e706d4.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/dab15afe-4eba-42e5-aa52-c7d6d0bcac20.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/dab15afe-4eba-42e5-aa52-c7d6d0bcac20.pdf deleted file mode 100644 index f24ab0d..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/dab15afe-4eba-42e5-aa52-c7d6d0bcac20.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/dbfa5a14-6e5d-452a-89fd-627898002afe.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/dbfa5a14-6e5d-452a-89fd-627898002afe.pdf deleted file mode 100644 index cc1c8c2..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/dbfa5a14-6e5d-452a-89fd-627898002afe.pdf +++ /dev/null @@ -1,2552 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 0.0000 -792.0000 206.0116 0.0000 0.0000 792.0000 cm /Im0 Do Q q 0.1908 0.0000 0.0000 0.1908 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -35.283 0 0 46.25 1.82 3642 Tm -(Di:83460 ) Tj -28.1725 0 0 47.5 -1.15 3591 Tm -(P.ROIOR:ARIAN ) Tj -21.5449 0 0 47.5 210.95 3591 Tm -(VMLENTIN ) Tj -21.0402 0 0 47.5 350.97 3591 Tm -(UNGIREANU ) Tj -15.9575 0 0 46.25 0.81 3538 Tm -(-R ) Tj -23.1347 0 0 46.25 31.89 3538 Tm -(PO: ) Tj -35.9232 0 0 46.25 75.08 3538 Tm -(:C3S-C12 ) Tj -31.9778 0 0 51.25 0.81 3432 Tm -(LENI ) Tj -33.9707 0 0 51.25 88.64 3432 Tm -(C.U.1./C.LF.:RO1879856 ) Tj -21.4526 0 0 45 18.6 1993 Tm -(SUBTOIAL ) Tj -43.7464 0 0 52.5 3.93 3317 Tm -(UH: ) Tj -26.2254 0 0 52.5 93.51 3317 Tm -(SPAARE ) Tj -27.8232 0 0 52.5 202.87 3317 Tm -(PRBRIZE ) Tj -32.0602 0 0 52.5 325.81 3317 Tm -(ESTIVLP ) Tj -32.7778 0 0 65 17.8 3255 Tm -(E18:2X03-) Tj -26.5243 0 0 65 161.68 3255 Tm -(\(62507 ) Tj -34.6887 0 0 65 245.56 3255 Tm -(6-261550117 ) Tj -46.9609 0 0 47.5 10.89 3207 Tm -(AT: ) Tj -30.6398 0 0 47.5 103.78 3207 Tm -(I6 ) Tj -30.2736 0 0 47.5 140.82 3207 Tm -(ENIC ) Tj -22.6023 0 0 47.5 220.89 3207 Tm -(MRFUYATA ) Tj -21.0127 0 0 47.5 357.09 3207 Tm -(NARINO ) Tj -0 Tc -53.75 0 0 53.75 11.8 3150 Tm -(Z ) Tj --0.035 Tc -31.9656 0 0 53.75 41.66 3150 Tm -(00:7E3 ) Tj -28.8709 0 0 53.75 143.63 3150 Tm -(6422 ) Tj -31.364 0 0 53.75 199.66 3150 Tm -(76061637 ) Tj -45.6565 0 0 51.25 11.9 3102 Tm -(AT: ) Tj -23.8736 0 0 51.25 107.83 3102 Tm -(IG ) Tj -22.4127 0 0 51.25 141.87 3102 Tm -(ENICA ) Tj -20.8675 0 0 51.25 221.9 3102 Tm -(PARFUYATA ) Tj -19.6462 0 0 51.25 357.91 3102 Tm -(MARINO ) Tj -0 Tc -47.5 0 0 47.5 11.82 3047 Tm -(Z ) Tj --0.035 Tc -26.8469 0 0 47.5 40.87 3047 Tm -(H00:763 ) Tj -27.8016 0 0 47.5 143.65 3047 Tm -(6422 ) Tj -24.9965 0 0 47.5 201.73 3047 Tm -(763061 ) Tj -25.6155 0 0 47.5 277.67 3047 Tm -(637 ) Tj -0 Tc -47.5 0 0 47.5 11.77 3001 Tm -(P ) Tj --0.035 Tc -23.5179 0 0 47.5 40.95 3001 Tm -(AY ) Tj -22.9691 0 0 47.5 88.95 3001 Tm -(AIRCO, ) Tj -23.0586 0 0 47.5 183.76 3001 Tm -(CRATATOR ) Tj -19.2489 0 0 47.5 317.96 3001 Tm -(AER ) Tj -20.9591 0 0 47.5 371.78 3001 Tm -(CONDIT ) Tj -42.343 0 0 53.75 27.84 2950 Tm -(Z0 ) Tj -27.7502 0 0 53.75 95.65 2950 Tm -(697 ) Tj -30.7535 0 0 53.75 142.56 2950 Tm -(54|1 ) Tj -27.4792 0 0 53.75 200.04 2950 Tm -(183170704 ) Tj -28.683 0 0 48.75 41.83 2895 Tm -(ED. ) Tj -21.8521 0 0 48.75 89.77 2895 Tm -(CERE ) Tj -29.0073 0 0 48.75 170.59 2895 Tm -(58 ) Tj -25.7833 0 0 51.25 11.87 2849 Tm -(RJNOTIE ) Tj -23.516 0 0 51.25 163.89 2849 Tm -(BRI ) Tj -0 Tc -51.25 0 0 51.25 219.89 2849 Tm -(X ) Tj --0.035 Tc -23.0785 0 0 51.25 237.89 2849 Tm -(FEST ) Tj -19.9163 0 0 51.25 304.63 2849 Tm -(SOUCA ) Tj -32.3819 0 0 45 12.84 2799 Tm -(PAY ) Tj -25.1525 0 0 45 89.53 2799 Tm -(SILICON ) Tj -35.8912 0 0 45 198.57 2799 Tm -(300 ) Tj -23.5477 0 0 45 265.95 2799 Tm -(ANTISTATIC ) Tj -23.516 0 0 45 412.75 2799 Tm -(CIR ) Tj -0 Tc -52.5 0 0 52.5 31.68 2746 Tm -(E ) Tj --0.035 Tc -28.5987 0 0 52.5 44.67 2746 Tm -(900:018 ) Tj -30.7671 0 0 52.5 144.61 2746 Tm -(642689018499 ) Tj -42.0273 0 0 102.5001 21.94 1845 Tm -(UA ) Tj -22.1702 0 0 102.5001 91.87 1845 Tm -(LE ) Tj -28.7803 0 0 51.25 304.87 3943 Tm -(FIV\311-HILDIG ) Tj -28.0753 0 0 51.25 481.48 3943 Tm -(S.A. ) Tj -18.6536 0 0 47.5 223.96 3893 Tm -(AUD. ) Tj -21.362 0 0 47.5 290.77 3893 Tm -(COMSTANTA, ) Tj -17.8322 0 0 47.5 441.92 3893 Tm -(MUN. ) Tj -20.6943 0 0 47.5 509.78 3893 Tm -(CONSTANTA ) Tj -24.1963 0 0 43.75 291.55 3846 Tm -(STR. ) Tj -21.3258 0 0 43.75 363.74 3846 Tm -(\(ON ) Tj -20.3049 0 0 43.75 413.9 3846 Tm -(RONTA ) Tj -21.0452 0 0 43.75 496.09 3846 Tm -(NR. ) Tj -0 Tc -43.75 0 0 43.75 550.47 3846 Tm -(3 ) Tj --0.035 Tc -20.266 0 0 52.5 188.76 3796 Tm -(3INE ) Tj -23.9116 0 0 52.5 256.95 3796 Tm -(ATI ) Tj -24.87 0 0 52.5 305.94 3796 Tm -(VENII ) Tj -19.8947 0 0 52.5 391.86 3796 Tm -(IN ) Tj -22.1501 0 0 52.5 428.89 3796 Tm -(MIGAZINUL ) Tj -21.7888 0 0 52.5 565.9 3796 Tm -(BRICK ) Tj -28.7323 0 0 46.25 319.69 3745 Tm -(CIF: ) Tj -26.8208 0 0 46.25 387.87 3745 Tm -(RO10562600 ) Tj -21.21 0 0 45 13.67 2699 Tm -($P ) Tj -15.704 0 0 45 42.92 2699 Tm -(RAY ) Tj -20.5019 0 0 45 90.78 2699 Tm -(CL ) Tj -20.9445 0 0 45 131.61 2699 Tm -(SFUNA ) Tj -21.7017 0 0 45 212.95 2699 Tm -(ACTIVA ) Tj -20.5647 0 0 45 306.9 2699 Tm -(PENTRU ) Tj -18.8722 0 0 45 400.8 2699 Tm -(CURA ) Tj -33.9509 0 0 53.75 14.8 2639 Tm -(E18:2\242051 ) Tj -29.6673 0 0 53.75 185.58 2639 Tm -(52354 ) Tj -28.4045 0 0 53.75 254.64 2639 Tm -(6426489007929 ) Tj -39.4395 0 0 51.25 16.27 2590 Tm -(SA1 ) Tj -26.665 0 0 51.25 98.84 2590 Tm -(ENAJ ) Tj -32.5934 0 0 51.25 160.79 2590 Tm -(240. ) Tj -22.5813 0 0 51.25 227.87 2590 Tm -(ECOFRIEND ) Tj -32.8392 0 0 43.75 12.81 2544 Tm -(LZI0210162112 ) Tj -28.7846 0 0 43.75 228.48 2544 Tm -(8646809520908 ) Tj -33.1906 0 0 43.75 12.38 2495 Tm -(SAI ) Tj -28.3853 0 0 43.75 80.83 2495 Tm -(EAAJ ) Tj -21.0881 0 0 43.75 160.88 2495 Tm -(EXTRA ) Tj -25.9464 0 0 43.75 242.69 2495 Tm -(35L ) Tj -25.7198 0 0 43.75 296.64 2495 Tm -(508UC/SET ) Tj -27.6479 0 0 43.75 430.65 2495 Tm -(60 ) Tj -36.8407 0 0 41.25 10.86 2449 Tm -(ZI ) Tj -30.0217 0 0 41.25 49.68 2449 Tm -(02:1\2540021033182 ) Tj -28.0599 0 0 41.25 269.64 2449 Tm -(642276E020146 ) Tj -34.5182 0 0 51.25 9.36 2398 Tm -(SAI ) Tj -26.665 0 0 51.25 97.84 2398 Tm -(ENAJ ) Tj -21.0881 0 0 51.25 159.88 2398 Tm -(EXTRA ) Tj -26.6117 0 0 51.25 241.68 2398 Tm -(35L ) Tj -25.9359 0 0 51.25 296.63 2398 Tm -(508UC/SET ) Tj -25.5211 0 0 51.25 431.68 2398 Tm -(60 ) Tj -33.3391 0 0 57.5 10.88 2348 Tm -(ZI0221e082183102 ) Tj -28.0742 0 0 57.5 269.64 2348 Tm -(6402768028146 ) Tj -32.8904 0 0 61.25 11.39 2295 Tm -(SA:1 ) Tj -27.0066 0 0 61.25 80.96 2295 Tm -(UFER ) Tj -24.0942 0 0 61.25 170.75 2295 Tm -(OPTIN ) Tj -29.7118 0 0 61.25 256.64 2295 Tm -(35L\(15\) ) Tj -21.2168 0 0 61.25 365.96 2295 Tm -(ALBASTR ) Tj -32.3836 0 0 47.5 14.8 2247 Tm -(2:8210113106 ) Tj -28.0742 0 0 47.5 207.69 2247 Tm -(7290014006522 ) Tj -25.9154 0 0 47.5 15.85 2196 Tm -(LAAL ) Tj -22.2339 0 0 47.5 94.76 2196 Tm -(CFBLU ) Tj -22.8748 0 0 47.5 176.89 2196 Tm -(PUS ) Tj -18.7772 0 0 47.5 231.8 2196 Tm -(CU ) Tj -22.3278 0 0 47.5 271.95 2196 Tm -(ADEZIV ) Tj -19.7692 0 0 47.5 365.96 2196 Tm -(ALB ) Tj -24.6743 0 0 47.5 418.14 2196 Tm -(12X ) Tj -31.6492 0 0 56.25 10.81 2143 Tm -(EL/90:488 ) Tj -29.9402 0 0 56.25 151.62 2143 Tm -(6699 ) Tj -26.6369 0 0 56.25 213.88 2143 Tm -(490919743 ) Tj -22.1976 0 0 56.25 9.89 2093 Tm -(PUNGA ) Tj -19.133 0 0 56.25 96.91 2093 Tm -(MESTERLUL ) Tj -21.0926 0 0 56.25 218.78 2093 Tm -(CHSTOR ) Tj -23.8151 0 0 56.25 311.72 2093 Tm -(30X65CH ) Tj -21.6093 0 0 56.25 417.9 2093 Tm -(BRI ) Tj -31.4072 0 0 43.75 19.89 2051 Tm -(Z960:950 ) Tj -27.3474 0 0 43.75 149.84 2051 Tm -(EKI09022318 ) Tj -28.3496 0 0 42.5 12.83 1693 Tm -(EST ) Tj -37.7998 0 0 53.75 7.72 961 Tm -(ID ) Tj -31.0173 0 0 53.75 47.85 961 Tm -(B/: ) Tj -31.7444 0 0 56.25 9.89 1589 Tm -(10A. ) Tj -20.8382 0 0 56.25 85.82 1589 Tm -(TUA ) Tj -31.2455 0 0 56.25 139.93 1589 Tm -(AI-) Tj -21.2817 0 0 56.25 194.26 1589 Tm -(19% ) Tj -39.8436 0 0 45 10.57 1540 Tm -(0A. ) Tj -21.3464 0 0 45 80.81 1540 Tm -(TUA ) Tj -20.8001 0 0 45 132.88 1540 Tm -(EON ) Tj -0 Tc -58.75 0 0 58.75 19.7 1485 Tm -(R ) Tj --0.035 Tc -58.2617 0 0 58.75 28.71 1485 Tm -(PZ ) Tj -31.4416 0 0 58.75 114.85 1485 Tm -(M1. ) Tj -36.8051 0 0 58.75 174.73 1485 Tm -(IN ) Tj -22.5624 0 0 58.75 224.89 1485 Tm -(BON: ) Tj -36.4314 0 0 46.25 10.99 862 Tm -(/4:0:4700110\)7 ) Tj -27.1121 0 0 55 326.71 1151 Tm -(CKPOS-CT2183460 ) Tj -0 Tc -56.25 0 0 56.25 607.03 3270 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 56.25 622.9 3270 Tm -(BUC ) Tj -0 Tc -56.25 0 0 56.25 676.88 3270 Tm -(X ) Tj --0.035 Tc -30.7249 0 0 56.25 703.64 3270 Tm -(9.01= ) Tj -30.8624 0 0 56.25 784.64 3270 Tm -(9.01 ) Tj -0 Tc -56.25 0 0 56.25 852.87 3270 Tm -(A ) Tj --0.035 Tc -19.3223 0 0 47.5 364.91 758 Tm -(BON ) Tj -23.0709 0 0 47.5 417.89 758 Tm -(FISCAL ) Tj -0 Tc -46.25 0 0 46.25 288.73 711 Tm -(L ) Tj --0.035 Tc -28.3256 0 0 46.25 359.67 711 Tm -(9000221498 ) Tj -0 Tc -46.25 0 0 46.25 586.38 3176 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 46.25 596.56 3176 Tm -(SET ) Tj -0 Tc -46.25 0 0 46.25 650.9 3176 Tm -(X ) Tj --0.035 Tc -28.8653 0 0 46.25 677.99 3176 Tm -(16. ) Tj -25.3634 0 0 46.25 718.64 3176 Tm -(50= ) Tj -32.3752 0 0 46.25 772.87 3176 Tm -(16.50 ) Tj -0 Tc -46.25 0 0 46.25 853.9 3176 Tm -(A ) Tj -50 0 0 50 584.25 3075 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 50 597.56 3075 Tm -(SET ) Tj -0 Tc -50 0 0 50 651.9 3075 Tm -(X ) Tj --0.035 Tc -33.7631 0 0 50 678.82 3075 Tm -(16.50: ) Tj -32.3752 0 0 50 773.87 3075 Tm -(16.50 ) Tj -0 Tc -50 0 0 50 854.89 3075 Tm -(A ) Tj -52.5 0 0 52.5 579.16 2969 Tm -(1 ) Tj --0.035 Tc -21.912 0 0 52.5 597.9 2969 Tm -(BUC ) Tj -0 Tc -52.5 0 0 52.5 651.89 2969 Tm -(X ) Tj --0.035 Tc -35.0049 0 0 52.5 678.58 2969 Tm -(38.16-) Tj -33.7659 0 0 52.5 772.59 2969 Tm -(38.16 ) Tj -0 Tc -52.5 0 0 52.5 854.88 2969 Tm -(A ) Tj --0.035 Tc -31.7874 0 0 46.25 776.62 2916 Tm -(-1.91 ) Tj -0 Tc -46.25 0 0 46.25 856.9 2916 Tm -(A ) Tj -48.75 0 0 48.75 586.29 2763 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 48.75 599.9 2763 Tm -(BUC ) Tj -0 Tc -48.75 0 0 48.75 653.9 2763 Tm -(X ) Tj --0.035 Tc -29.2827 0 0 48.75 679.82 2763 Tm -(25. ) Tj -25.8258 0 0 48.75 720.73 2763 Tm -(07= ) Tj -32.0406 0 0 48.75 774.8 2763 Tm -(25.07 ) Tj -0 Tc -48.75 0 0 48.75 855.89 2763 Tm -(A ) Tj -46.25 0 0 46.25 584.38 2663 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 46.25 599.9 2663 Tm -(BUC ) Tj -0 Tc -46.25 0 0 46.25 653.9 2663 Tm -(X ) Tj --0.035 Tc -34.2379 0 0 46.25 679.8 2663 Tm -(14.99-) Tj -32.8658 0 0 46.25 774.85 2663 Tm -(14.99 ) Tj -0 Tc -46.25 0 0 46.25 855.9 2663 Tm -(A ) Tj -50 0 0 50 562.25 2557 Tm -(1 ) Tj --0.035 Tc -19.9028 0 0 50 588.9 2557 Tm -(ROLA ) Tj -0 Tc -50 0 0 50 654.9 2557 Tm -(X ) Tj --0.035 Tc -34.2776 0 0 50 683.8 2557 Tm -(10, ) Tj -26.7305 0 0 50 723.07 2557 Tm -(15= ) Tj -31.8847 0 0 50 774.88 2557 Tm -(10,15 ) Tj -0 Tc -50 0 0 50 855.89 2557 Tm -(A ) Tj -43.75 0 0 43.75 610.47 2458 Tm -(1 ) Tj --0.035 Tc -19.1969 0 0 43.75 628.91 2458 Tm -(BIJC ) Tj -0 Tc -43.75 0 0 43.75 681.91 2458 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 43.75 708.54 2458 Tm -(5.53-) Tj -31.6613 0 0 43.75 788.55 2458 Tm -(5.53 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2458 Tm -(A ) Tj --0.035 Tc -22.0252 0 0 50 616.8 2356 Tm -(TBUC ) Tj -0 Tc -50 0 0 50 690.9 2356 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 50 710.54 2356 Tm -(5.53-) Tj -28.5573 0 0 50 794.6 2356 Tm -(5.53 ) Tj -0 Tc -50 0 0 50 858.89 2356 Tm -(A ) Tj -52.5 0 0 52.5 614.16 2249 Tm -(1 ) Tj --0.035 Tc -21.0765 0 0 52.5 629.9 2249 Tm -(BLC ) Tj -0 Tc -52.5 0 0 52.5 682.89 2249 Tm -(X ) Tj --0.035 Tc -39.7318 0 0 52.5 709.43 2249 Tm -(5.94 ) Tj -32.9029 0 0 52.5 789.53 2249 Tm -(5,94 ) Tj -0 Tc -52.5 0 0 52.5 857.88 2249 Tm -(A ) Tj -43.75 0 0 43.75 589.8 2157 Tm -(4 ) Tj --0.035 Tc -18.8722 0 0 43.75 615.91 2157 Tm -(BARA ) Tj -0 Tc -43.75 0 0 43.75 680.91 2157 Tm -(X ) Tj --0.035 Tc -33.1889 0 0 43.75 707.79 2157 Tm -(2.24: ) Tj -31.6791 0 0 43.75 787.43 2157 Tm -(8.96 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2157 Tm -(A ) Tj -51.25 0 0 51.25 610.2 2050 Tm -(1 ) Tj --0.035 Tc -19.8736 0 0 51.25 628.91 2050 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 681.89 2050 Tm -(X ) Tj --0.035 Tc -30.213 0 0 51.25 708.68 2050 Tm -(0.72= ) Tj -32.6476 0 0 51.25 789.65 2050 Tm -(0.72 ) Tj -0 Tc -51.25 0 0 51.25 857.88 2050 Tm -(A ) Tj -52.5 0 0 52.5 215.88 658 Tm -(A ) Tj --0.035 Tc -19.0521 0 0 52.5 230.91 658 Tm -(RUGAH ) Tj -20.6877 0 0 52.5 310.62 658 Tm -(SA ) Tj -25.2082 0 0 52.5 350.88 658 Tm -(PESIRATI ) Tj -19.8147 0 0 52.5 470.91 658 Tm -(BONUL ) Tj -20.3024 0 0 52.5 549.91 658 Tm -(FISCAL ) Tj -19.4211 0 0 47.5 148.95 613 Tm -(VOCEA ) Tj -23.7876 0 0 47.5 228.75 613 Tm -(CLIENTULUI: ) Tj -33.6288 0 0 47.5 388.64 613 Tm -(0808 ) Tj -21.6271 0 0 47.5 468.9 613 Tm -(BiRICK; ) Tj -26.8317 0 0 47.5 562.72 613 Tm -(OBO032745 ) Tj -31.5442 0 0 51.25 162.72 556 Tm -(TIPRIT ) Tj -23.0709 0 0 51.25 268.89 556 Tm -(DIN ) Tj -22.3564 0 0 51.25 321.76 556 Tm -(COGITO ) Tj -22.2966 0 0 51.25 415.87 556 Tm -(ERP ) Tj -19.5136 0 0 51.25 468.93 556 Tm -(WWI. ) Tj -21.1535 0 0 51.25 521.78 556 Tm -(COGI ) Tj -24.7121 0 0 51.25 575.78 556 Tm -(TO-ERP. ) Tj -18.6521 0 0 51.25 668.81 556 Tm -(GO ) Tj -31.1552 0 0 42.5 788.91 2006 Tm -(155.15 ) Tj -34.7994 0 0 42.5 790.78 1748 Tm -(15i. ) Tj -31.334 0 0 42.5 844.9 1748 Tm -(15 ) Tj -32.0316 0 0 42.5 819.66 1697 Tm -(0.09 ) Tj -32.5188 0 0 43.75 806.8 1593 Tm -(24.77 ) Tj -31.5624 0 0 43.75 807.8 1541 Tm -(24.77 ) Tj -21.0452 0 0 51.25 703.09 993 Tm -(NR. ) Tj -19.5035 0 0 51.25 743.96 993 Tm -(AMEF ) Tj -35.7727 0 0 51.25 801.08 993 Tm -(:001 ) Tj -28.4541 0 0 77.5001 431.67 932 Tm -(90002214982024D02818480721100293 ) Tj -19.6793 0 0 50 232.9 909 Tm -(DATA: ) Tj -30.0086 0 0 50 312.81 909 Tm -(28-06-2024 ) Tj -20.3563 0 0 50 458.79 909 Tm -(ORA: ) Tj -31.196 0 0 50 525.91 909 Tm -(18:48:07 ) Tj -27.9768 0 0 43.75 852.02 1489 Tm -(12 ) Tj -21.6742 0 0 43.75 713.81 850 Tm -(TD: ) Tj -27.8567 0 0 43.75 753.7 850 Tm -(00665388 ) Tj -23.7415 0 0 48.75 753.75 798 Tm -(OASIER ) Tj -0 Tc -48.75 0 0 48.75 850.29 798 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF"ExifII*  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw88"2 ][i,ϩC?.t>ƾ"|ށ~(;yzt&\ڌ .̇ñ\esӳ*.  UebHY*UDBǗcɌ.3V"deM]|RI10DP#̌dWc2CnjdwZ̺5% Q -BE@R) ,RT(! ShX2hf  VCĖd*Ḧ"  1bd!@[2c,)1 A,2"rfV,y] 7[’V CHiYȠLXbVTIDh.* s(`{aDuLN1$\&BR) !2,$2pʎkV.7$`a$c( ,aAI!HHà! $k[(@E%IPc "1HEȖ%Y3Y}LRI)IEhQT Dh ` ,1 -fɬMLkdk0Q0m:2weWD+T|@{јij[ʾC=ugi^=ͤo+>j>WS˃t}+}+@7g$ dTY!C%+)AU! 0a$G ύ>\Ycl` pB"HA$aa -3cEc)FC ms$#BX!1&\@ *ĘlYe 1YkfIREhU$ T9 v5u̮W! 1!!"hR#c" - l"1HT*%4Yx$$V$U!D2E rT`", -ep¨ B&LC4ll f7Y#bu(549os} -3:c#PA$B!@r)W"q15+B !c=r x)L쾮c#fG2bvʨ\VhD%e@<6"XCB1RA!$VR@ #1AH`HBD+$0`AXLĈ̥` |X&<[8םyVA#)Q$$ aJBAW)F2trO 嬑J;cdb#BEJ -A G !@4B00I AZH BB"q  P@#) J" -Eq0B: d,=ir dC h) Ch "I 8cY LDHI!ʒH $!$)Y Y*:[P - Xq16*r,bC-E  $:Ȭ~ìu3rV(WTK"ZAT P0LaPP$Ej+ N,He00#+ȡ`$*1)ؙS EXb(ab +YD)Tca #@ a U>AOl<5ՓWg"P-*Yl굞էd̙ud 2>©_-vqU_v w+NJX  oBi1n&5SjV;ꭏ!uL=_g(W_2@%hG(vDL(B%^6]d+Y  D)TKﯛ?&Tlke<&baҴWI<د:rz)y-\C_6zpI `2BC R$,b@ٵhlX1d|,g82YTDȫ:BQcz "E+BѮ:1(/m|5vZ*kq:LNsBT@UcI@)``@CK! *HH x1:ʮB,Y/yuTtz1.P$0:C"@ b$X@  @CC -  d ciYD X&<1jIdIA͑3V1&Ȩd2jcuwR\}xQflpDL.ȥ -$`ȪdTK<-6VwwM1S#J`ŕ~}>)@,Wp{)K`̆W +D ,ȈUבg^ ;jd_V[ D1 !e0i1IjbzG&E# *IjKbcYF۷*;V>2  FL$kSWӺ$À<ۗΪi1vur13klY cU/< jaߐK@#^aMX!%j=N%s= P47x1kzTS:tma򐞡^EW{:r -&1eԩw|zMVpŋDV?ٳ6네K鉗X2QW4~/ xU߯,0[W,lyժ^l"]yws/Ks)%*a$!B8 0*dCM1I -FH!bq<2azˌAU]I!FR"4L9 JkӪ9[vezG%z&Ŗ,2wɬMLan]|oB㕆7 1 +IA" `0 -221Q\keH0A%g^pH)SnB"! `#rH!I +,< M!W$Ta@`@(V$P,JݜˑD zh&Nzmby8] /&@A. F WpQqfI|y;^5Yuc+cq+W -Mu+dVX)жXBFBioӄaneXDȁU!L)7 -0Gwus*QY2 H'fR WV WX@,L&s]Bl>ïDِ,Gɋ*dBGWa/raᖒy7V;  -C!5Լ;wgѾȬTbe,)ьYlFI2^YBeϢ&c,VI 2J@.@]r,XAJ6҅ԛ5 -`fl+,`z57t-5ޤr,b3rWYXI (H,$ -d|N, c1Dc*Qd0ܠ"U&c $r*C% $,]JH!$ bP,0!XB+AAZ, -T^Cq&C#c*!cFlfWLbQS"F8VVEլ[U$*:$ UXV @[dz^7SSשrl~VשTRK&g{F>AwW@cȈ* ߷[ߠzGj 2 I_?7"[իG{JηN: P4V 2 8r(=nPj7_=$aQ ? 'lc}ҵ;" !@NoikcGB-YH F82VMبFh3.K$ -c˶q\k欯"eɇ%1XjP,μ٬u>דb#f?C~*ZH :Ϻlz تCй"^aiq;6uVo۠V[,ggǣwy D k:g O}ν27<7w`حB? /C9~!#OۼPIZ\ԩ\huIT -yqseLk/YJa$4R3E@c8`͍ -=HBBe[Z3La6Z eDVIͥs_-o;7{4gWSfur$<8?[e %cf+UgwУ!SA X4B<AV0,+H $0 -iI*BI $ -q R0I! *C 1LI DD 0*<0uiH!5ȄGIaTQrc GuLl @2hcȐjBb*R*jv(X}U-|٪V($ .}U41b@AEr.jjV -C/qLy)c -+t1pl:˙7F3%Dˈ(21Ȱb"y@$WҸl29]70`CXȐ1nKl"AaH `qǭW4[+c2l!]c[u6ss뽙r{2Ι6ݔ+&68V:o~bhxCYک^2(WSKlIrSTAۍ}j_ۣP4EW+ uRf[zWwC8>U8>\!`uh0Bz:Bou| -Kdaj1u\" -$ a̢?V,[~/ٱ:xUm+Ot)[_'IRstDe(d2@I$0b#1XD G223c0j -4" ,`I #'Tlps/`T֦ߑ*y9.AD -@5rŷ/Z\BNWR2 a#:n >=k.byϣSLK91eEǛCɹ\^VoΒ羃YS.\n_&&\d{ tziz>]Ő%ddlfHa(ks-EۻCOPJup.^ :yf5p';:{\,9qy-OpZ=(ttUPHPd5jvtH !$dj,84qM$HF a -`HTG*ƥNδeDߋ3HE#+&sC(_P2 La6'HZ=`!MX+aHys ;@HHK5c _-ٴYdʇ*,[Z{N^E`Dt$F!`c u;)0B)BLp}ב@H!$$TD"@IH $"e*A$Jb0$R("!`@`I^d0Y ``dXqljsa( -SdYq(Zb *DeP`bE1)BdgƨC -GQU(1[ۅ^}Z5vżu "TCzXC!ݩAǕWA*B.}z3m!z|^@Z`2D)V^IG%2**u$ B _Y|&ª>wц<^*ݟ:kyA$&2*C,ϥUK!rǯ  K$٧3irkIY\dhcScY6ug|̧3&J؝X1L]cI -x 1Xˣ+;H LҹSU\XBDx';]  Lkv0B"HeX -T.*ECdd+ #" -H()X2Eȶ!dXƲ,0ەS;mjcKObCZ  W #Xe)*dtk OGF*Đe0r`edz2HiRnYJ'kCЏ,RnT(n"V,w2Dt``_}Zg?~Ij$:!.5k'Rx)e82`)d! &`FVQd A(0R,"Y$$Y/0=yY$a6%XK$$$K$R1  `k 2cr D %2&CKCUR eUVQ1e e"0D+,)5iE&<X_(?>JL\yaHPWU[Yu/Ov˼Bf+YDBd#  -UQ@$ cʭTJUQ⩐2WJ2AؘdˆT Ā@I2cS>5$e5`+a 0ˌe_%o4"5HLx羁Aζ,ܭEdr6tؚd;K/ z)τQfHdrD؊[=z6 Qd -H-ޥB,0Q$ f摇e#Ȅ)#49`S @YD&DKu}[d2@GǑ a dY"rc! K3Opg:ek##HHTV hr`CP4a*F40AqEFQbY0_TW{k1fyoGVdr)-׭8OHlYrCJkɥڊhdS]ZaqOb@J0HH``#)cc0#4 - RB2 YH_d*yI $!$ Z) X$I @ZEb"Ae!F ( -b@ H Jq"7Y A S!F2,EǑe2TP -"Ȫ`]WhaL)1ƨI,F60ͩ5|]'=GRsmI -aU_(w ,EtJ(ϥɎ2 QHPm%h @$0B0bA40$W-Z*H[7NZ !B^rlwwZ6 eqaveR1@LPV-XDfX@JdP$XFRVy/:2B  LD$R!!E, 0I$D@!&ԫgPc"F) - VS!Pd+cX!qgǕ:Phy&3+* j隐gz?cTln+*RFoa5'S_'m2'7LnG#?B^9`+ V {Zs3XH@ '#ߜ]N1r,)"@A@  }O}t !U 7{/F:zW}z~6 Z2@IXW*~zo^1ee as̞u*޷C7Hd[)6'e(~tӶWf9jW &VÑ2rŶvx+*Ryc  OWz{^eW10$`L$e6C*45ufYwD2qACAcA!Yc)yh0Ń rc\ԐV(!#  BI+K`*B`#)$" ! Bu!RIb$A$ &<^nJD2B2P@!"X,*ƪ lUP+yƙq,`,1d*RQ`> `lh=->osz:dX@r6*]}o+ն+f¼7Ƶs'y*e2 aAL|:94)2b!HC 2Hg 6ͽVo& -82xDz"P/ܣr 9#I a}^8_c,x^Qԣu8wd&L,Jd} +^sԩ -0Ho?M yvrEC -*WO[qA"CA$h `#E#@A -+$ g ˌzK`͊:ivQ #A*#3jgEyVbxz;ymn] 5̽2&s/v['a((UW-swQ6A%21O -AҘEPF ID`aA@bJh'^dHE`,$ `  !0D"BHA"!#Sh6(flYEVSdƊLF3eYV)I -2QFP$7Ac"Lc,.0 TJ+$ZEdGX9K3>6:r:2WiRJ4w`H -A"`̧ n'h.JQ)$$pcGcXt8*XIY`E(h$!"ٷR}Z+,4*P~uO=(Z.B1w[7nXD`NbfՂx&H.`r9ܜu)&XöMq|V2ʨ6L.^,$A!'0LbL8dej:)I) 0'X*HdA##H - YPU&X!q{ݭ{Ks6P&H!$:H q400,x+F#) h0$!!6j]]6F @59Q:Gt2$ьd{aߘ!` 2AX@" $%`A#I!(RBI!`"u9`ϣ("I  -Q:(&:V PAHbp(B&czb.Hva1X*4t\ּYq;Q YXuvf&LpP+Uжӑ否Z:+)|(bu>6=% !@X("$R -X -D cB0BL7mlre #%H`bUm[XX^0BA!Ay`ZaTIJ(er!!nWqv$2A=Y .{mC-Rά(uEL#cs7z Bc(~Wv7\vSf`כ2i` &,s}G5}\EE2 @ ZPaC+B!@a$$ 32F nO::axA T$A 0:>5H!05ɮwy83\l٨"AmjK'E~mާg)}t:{k.%+ ,2pdFPΫX,I I+k^bM%2ǛdHA$WPCFt a(Y!ri0 k|&9GcMjź+ ZtYH)#ՖD@dA E *@ !0DA -bT`$d0 *HDU|r&DQtmC*"1cVX`p -DHqdJ2UlphMΟ_v[eUFQQ\*CuG0 -D$`)LݛXIL1$m"vi{24 !H t!0*@@ G$#D y;տח5kRhq )%ٳT;f8) IY!B2H 1`HaCIC $Y H $Y"Lzr/ -ªR $QH\|҅ F(AQ@@L2ӫUϏ*!LpAYV*_שRd΂2[ǐuk9;:zu'4}GNgԸͅpFP[HUܳԭbHD TC-{__hw !E(;~d} -O/x7bFHA (Lr"+'zo*k'<[2NH$ 0gW霺m]$WQIHQ(״x*v|`B{YpǽzlBCŵ\k3cyyqg:ͣ\pwe@pҩɯ$ˮ&&2+w}Zcl>jzy޲ !P`zY^b@ASUԬtrtoG:Yb1V1LKm{NR]ˇzZ#) [)Rs8ʥCų7nx˗W:f|9+3azSzy[ws܏IR|&В 1NbMOC͊ YI08 8Dx2B"xF1`h eG$. B1jy4 b8R`H(qutAڡIk'7\{j(mcXìߜH`*4$*b $dSny$1<|)_+Tk0HD"Bc Y֬J !PE0Ude1(@@ *oZ@!UQdn/ b3d Qd8W٩5R>sdŖj6'CnVyߢ(w\ *^m{E '1~HU"`I <c3蚇k}Ŕ -`*CB "@&o1'JO*j4!XsGrʥ/v>?Xx Dˀ1ϻ֬eZ a!RةSʮVI^}@KR@ I|qv|Z쒟x0ͅϋ-E^8-Kbfǖ28:7(w*l:ѵj=bVwLQw ΡzTI0a%E0@8D%B@XCCDHPh3b0HD4dYZ3o:ս -0c@ aF Aƺ+ -5m;R2cEPX7W -zU}`Aue!B`ς52Tg[盵|!d#@I #+E 0ArR;;UzRJnRѲqv$$TY8{²brp1=sCzz5R.&LZ.-LsZb2&B:c>}yQ_èzY2SDH@IzV)ǒv!T* {C !"@RA$2BAI#l!E R0 ,! V\Df4%GTBBTB Bpg9{: 1>,fHD5vRюae,hs +Ҝ-v3L-[M%LR"F  !RZV2$ ȀR;:[~h_3Wˇscvܭ$H Z*u(KIBBV#a9Ӯmnv;fRPn4iŭ\w+ijuޏkk-%Yj b$$(VBD¡$VRCTHI THJ//+Sw3$,6<:zJV‚P" ZgySH$C" $Qa -1nht)$!e&7Q*,dUi4vWhofyQq͊&4Z[KRܥ.S:ljHJ" 㾕УUkv* -®J)\{'jrߓ>ۭrX1$ͽ&-ED/ n^x!LPd `fH*B -"Fs.x_yg}RM1`D(`x}<{CV>RC I DL -[Ԯwyb@h &o76epA$_422&6y1n`+>q@] %J<e!XF %I0 h!r -e!XdE,V FFB<4(#) $@$`)PˀUYΗ3nTeT7} <}:WLUC|#P]ٽeDZut&,22[#@I$S R2!@¦EdTpw8Տ.'BRZir;ԫ/~OHޔ1 ֕r)eQ HC$WB+3cʕ^_CܣU,VBUy7D*gWSp>l1ȼlG'V(u"*TCAYXS"I!$JKƭ{4gDK*E ZZ(+lۤ!×n[aJS +1cYl,"(J1",\c< -ej&D\x$*H2 `))D*/rz -P+ĽׇٽǞn]́р $*ioۏ -͖HPB)2(ʙ`JB -@!׋>SApт qd cbAH`-VGBu1N!d7ƲscK!ezǙ FFFB" ܻ 2Dj1x 0h@`t0`@Jq`!L 0Vb  DeC!HU\Ah%Xq%faqCi ]! HH -[cXUmڦ2#ɭhS H@SsJ!##|'Ac%D"#1NCՖHҬ20C.tG!FXJ){Nu~YSxNtU660nB ̦ -RPZH`  !P+"xBq8 lMhmYhw%fɲٰy Pףz]HH{R`BI$ JDHA $Y!EνaKe"+3*65\iPf.6&6uF ꩁ3*$2- E  J#BT*ŐPQb"jV:@ǕD&6AId)*Ȩ+H)(ŗ$P &,kck 4F,S@dHLy1VT%I a$b!"JBHV $! :2 :X!2+"S$$$R:1J$Fd(X! 2u(筼Ғh eeBbUVǑ$QKdr XHh%d$&D$Z,"$tK@d!Ii+ 1 )TKy<ˁ2`l FR%j9!65*p+cΘV A$Vac((*@D*gndrb&6F'XI1IND2VXTiX"0DY#^;vηC $R^BT,EdU$HXd!JV ) d XA &1U0`FRA$!²!8d9VSi Sj2*` +0r e9bc2Ș-ц|l T &E>9&rRZ̐b!F%HD!+DP@#LqrnPB1 P$ J%4hC !ɏȓ$ȦE% "$6 cˊ9zkW -cɎ\@ OFm4[>c=C7O,'O%SmOkFѠ|U} >+Shqß4]H@G"NgLU 1}lq:ԵSpvYa HDb`D20]Lk{%+@LX\W段垝f6:^Lg]1+T=HүW)- oWbΟS鍢p$ $$(ZY"@GA$QL!E,0(+e$ T@T$D%D jBEHDG,D @" B -@R-o-z\lY3cF #,Ve5!8!dHe1XFՔ Q8E0(cAAUS &BI&9UQ2BI$#F+0BH&Z5ѩI,h !CǙcRsdeedH޷?"Nd:yK]sלhvG; 옛"n5z4d$ @< $h`1-;˝W4 +Z@1X1F@C 2,  2H !Lyp(:n.nw{~rNTشV6FOcewi2+z+ߑ8` @ $D X.eͭH.䩑ua PUȭŋ.+]UcZcQY4Nom\H C$FFBDGC@d <#CEɮrzLYJ$Ǝ -(œDV찡*btYc  &6%ljl\:cWBI@ 2 FS "`P " WJ5I"WU%I$F*$"Jf THE 2a(,&"2gþ2AU*!!yM.l!2E!2E4`$*X2FX``VdC$H +)Hd)!G.H 0JBf%@Ԥ*d$0DAdH00q -*ĀH2 2VƜ7O"έ&.,\֙- -d4=.UdYY`RW]K.r-o lJG/1&bD1\\6*oLzB民j ʃWQb 57bQ{57;{joQQܫׅZ@$0$`"05y.uRlS&~νfɱf=\Տv$#NjNq?/<0Ȃ*Q~(AUG,Hdh6u+ɽ,i"ꍱfq{q.!ƫojgx `Y8Ji=;l&0cpTfRU *Y UZBFUMMiHjnTuWELnΫނqY#u! -EEY uqعq0 -00DC%@I!`@ X$@Z*Z m ,,~@D G"Qlm]h֜ jMZnyGAbCE$P[fV,&gWط?cm`6t3l.ݣܐ.>{GΦKxدK1ץZ<2$=sGD @$$H@QYC\X"&t\*nhmioח~U[mi+Wۣi\ݓNYV*ݗV,jߓ Kyۣ $,kSЧCЇ@C -!D6:ͥ1ύ0ÎTWAc%ďdGpUB\ -ejvF>ξś]^_OY**:FB BD2HH `("e * -20@HLhmF0+0 $ X40Y K: p<ZE-'QN`ŕ&XhAd&FYM$$ ,5U2 -`BrEebIA,Ar)$WIIb+Z$RA$$0J$H‹uW+nVZjzco܊d䀐@h02yQ5t9a2y/V *^\Bu3x]j}sg]&vmtgp#2byi}+xEzEyɠ8"EI&o>FQ  - $LHQ]Niҏ^ˆ;eJLvzzy=' -z<&zgY)^}q|wz ! -S U1<駧fƀ4X* -'+-) "Il12b"69W|q> *p@P2ɗM62_CydYl -ȂIR@!$!D)S"Q1LA R #A S, -c B) @ZL5ۑv0$Q*U9$"A " Xvl֖C2MGzڍpI6yb,$,Q[:t[Ҧe2fT22Unydj喗"EfGtH ZwŔ)#\E2BIC$e`(2c(`$S `Q hI -RRV -!@82u dJgH$A Ha18Z^v/Bi_g[4ICp,F*2pMAe[=X*{fiP3dF` !!2H@ -m·L=T'ZMfc5"V^O_S.uB $H@ I |~.=C蛳"mك=Z#ؼLz!xa l+6h wS',Z9oK.@W![n';0;A3& ei!Xk4㕯ZxsnI QuBNԶv\"]I/q:`P(! 8Ik:w<};X,bbO*׷fZs';=֡͢{K_4qƬ3`%0 +2.{%tۧ qlf=LB#\F#Çzd@+6U<ˣ~^eI-?HRTTes.lF䧍n{4l^?x!X1IcF?c}2E=Ww(vKQPHcTŊsdd $mGO*+aVGi #2{?NU;ߞ/<{S,L`!0Ԇ@Px"8 01 "b, Q)+ XD2*uR@ K0fZ!`*I 7:=7<0C.9@1d[y*xP2d+!*i؊v++LӃv>DTvÆ<߶W5Kv'n.zխn.LYroWf;Br|#9dE,0hE`(u@DM]>wr:X5r;ɐ<]KUK9y"UKiB(ȵ;w*gr凷XEnt6 XC_Ƚik"h쯩 P@[: kM[PT{&/7H|~%K2ʆa3/EQfG5@sj}2MK_@@%>*^s\]ѶݸbƿX^/W}?eXBHE!ӡ?wDB$HQ:+TZ<62+\7Oד3.6[vy~yORC $L D̏L,Rw3Ǘ\,ܲh9fnMts/>ܓrCEF]iE>㎸&VQ08}YB..T. P h2޿hW{4Qʠt:ַI]%Xp_™1y37+vR\ϕz`sNWn-{Hv5נy=7yJ]PDE`)(\{{by{p D#@y]>!H:h>"o[I$BHaK -ACBV*t.ВP 4E` ^y&*y'f5ޓɷ0IPpi~r:;5;^_W,2jyR޽'z^69UFr:N1{|^u_p#Ce_?{y濦,y R#Ϯ5^U+HHx Vkڶմ HwS"(@ kr>W>i'[6zIKZٰ厄DNl-Bu/>k9,)eJCSsƮ}K_<9_:"0O==׻@  R:$WZ^ıPDB!V! (x%p6u~?Sz<[V56LqgDeQW!1AP@T"7X@T*ve䷃˖"L5" ꤚľYh$[uPh+ S}J"y*WAy6>} -6jgеm׫80h_ty;ס$ HN%/.uS=oϺ)|R@Iq^?Էյ:7C0`5)c,%=һWMbyOWѠ -7?@>ux{Vlz[ DS#$x^u:+˴ςfvnIO1<[=O^~/hz'lڧ0KAb4WeدsҧۗC7—Hsst4-˗ՃSOUJ6[O5E|O-}W -=K)cQ{۸/:Pdq$Lf @`(1#a$H)X !$0fFS$CZ"6$x,2Db!91<4R VE -W-{{G\r$S $[<D7O8yL_9ݽ9W< |wղ00bQxr7$u~Co ,r#c'3HQHJ(`<뭩ӠۢΞcx ) 0ELdfdYYbzeu{9hymt8׮vg&CV_?6.CKm+JLiPgf"lڲ֖oˊ ,dyZH^{?πcuǏce. HA(wOVxOK cPZ(A\yJ61yǤb{FV#ḛvl)/سc<`X>G@.^U P4I{F*bRZ62I A ' -=7@Z&LpwR _RUU42T00qdr``(44璧C"F -a`Tbˆ^E1jpVę.(Hֽ^眨E^Z dJ;Q8oڋeƳjn14Ci%׸|v2m˞@9P5c$ xHsxcx+AyO>Z:5J?()7l!*Ti!QZĔǬ='{ioڬ[/})G yOԋ~+\Q4vދ>&ʴ\hr5P٣"4I랞)@ɂS69+2ű$)`b>qĸp*fn*ީV/\,{Qf< -D%P[1X__"_gf=UJFlc!*ZݧWgvz:.rI 2H(!+/1^}NrR[מw #UR$Y  _'_=^ zZ"U^f/9Xъk#|ίO$ f˫W;&_3%oKy侓]>n,󬻤w맴ioIu^7PXB> -,G^VXg]xu=Fj}n@ -eǯ7z<._RPFM]ihF_FM*ed#2J910큕К eH4ŀD"I$+(dQ+k #0R1H;,V X 0I!V X r|c<;tDT|P!G{vŻ~6clI`z-KO9y}7u+7{33TaJd|Rzj޵kҟX1b` a# -C$Jb4-}+69"$.E D  "D``n.mp,]G& \ ;9<׸i':a`^ڻlA$ !#)*bgV˳WfDZey}2FWkeEWՋY)C0؍|&LI_^_|kaH1PWȄuk"R"(@`4U`$2J1Ɗ^]-)|c=~ e^?Brn(`ɫ?Ti@ti0ffGZ]P9s=}]{N T010wy [z= DF $xI܃^)o "4*Lw/NAykǐPO͎RFn_*eB}CkegrLW픺KWgmWltt7v ^aP:5^礽=z͗=F<7חcԯó5 Sp;uŢnT2%3ֱqka0cP&[NzD@d T:"pw:WJfד<̾yGşy*W1v10yy1h7>nBcl{{˅ky@!-F -!,0VRN"J|zbN~8*,*TEaT{Pk.+zYNT} ;`Q2$1cL^uNnpgЬr<ѓ.jZnjrVIHws\摡G/"ƫ| -{:|rs9EdQ ԛ%)cS<Y -e/ω˺%23c`(|չ1B\~Ez8/V@оga[z%x6\Kd7"YAP8)e( +Kv/hw5˯R$scK9ǴR5}VE\pA\_K#v{-|Yzڮv.16TeǯۼONU>˾E=PE?=qm;ҪbL(b"e5:V;--.V:m:loѫ'7^-Mcϙr,U._YVvLu'Fx_vwGa]޵WV.?oG*5ۧ|٩32Okԧz2='{CFB!LU eMXq]kՋ.ZS/T-އ]cBDt8ysg\+ .fO>mKӵ q7<_zχE͡dBo[4JϔkX=n?c<;<ݴ[|z\^qɭO=9ܽ{ f#nҕZjbQ/q=;^Eޯ)qfǟ./4̾u%j1[U+zb_Fԙh1.ͩ{cLѴҮ\ӷ^FPI$ \PG0)V4V X;!EBFE̒H !ak1abCeF2D7}Úc~z۾:UɎT@HW)ܪ53fMG66yNGqp=|}[;TE.HF0:"&Qѡ!$V$@H`!02%/KpV$B0 `P€2#,CG= ys xƅӾ6dúqSvjwv^ĄӮTnnW^i2HX/ $X,"HVXI!T(d( `FB  UhP+]ס -p2vA4d$ _#)"P!|+gҪu+МЊ@TȚ((y:ɓWFe SlQ{2(ؓC6K^:fJl9꽯l1&Z@] ]np6zKwm]L|%e6 =2V%oyM -Ǧn<<3[au;: .c$(I>1xp\Ja{ޑ澡1GXuuVlXe=w~OsLgjܫbbצۓޗǰr<+=+ͽIXټXOwVǛ ǽS̗5f{<'6|^c3&xaK_y};OL;7[^]ԲEf!枧_U|輵ZٯXPoQ8]YY:QX.dǪ͖NxFus!8X^7kN*ܳ' 4חRwV5,a3x7tznȬde#|y8L -21HB##,a*̼ ŐzY)dju XҦQQWЭ]!K}k./>8a$^o Q(l᳓γHE RdNp%I! -7 b@a ޕ懤e)RD$hyVۛ٬XWiZrB$26*"EFR0*b[foc^#VoMٿyz c5T[.[ePNj.@&I/[7oO!)$DX@Ee@HT TˡFp\dI /_;Lutv[ PӘ!P$(U>}TVQb U#QQԩw]EGҗO枪]iэcV4emiP@ublU`h&o>x}ZTCޭ2B7z6i<}O]ŜItKT:ڽRo >S];[tlygBS"tq_>j}R>B4c"yg7XZoxd2Pwd^?k u6O0^OٵqȚ{:5x5_ГgfvVۛO>yw7< I a`E&HH@a!"I 9R@b0b´!$TȑAW;jNjw$TI -0FX* VVt|WѺ羅)Ll*kےnZ.Tx6\Mu&EJIߟzSY$hA$"Ҥ 0AI.}ËU o,1! `Q<[2cZpyv䫤YP.\~xzL|h`@A~O0|<iN,*((AqJR- $ʧ-yoDX -j"TFƼ1yÒF$ˀԪջX͜{|ԕWtMVJyWv]V-= oo=?Pkm-߸yl?g׻G;r"=`t3J\k_ҏ%XI᷋ O=߬t!BY#$UV>y7 -WZ\`I֧n"ϭkKUjK{OXO(GwEz_/f!χ5o^S|D\iR<:힅qrسFmlyyyzbRz5>yTzygZϦ?-s8β!*~ƭjݸ|dZn}2.5(ޥ-3i6bzF} JIK x{_D[G:=$ F *da0brx0S" -U@A!FRG8$>Gl8S#+ $AYJ|L+T/<$&?7AY6$@ehvR|./`J -bT ZNd{}[ *(2&5eT $*X܄킭*8wuu -J}mMGsq>5XZnhTϛVmiS̽CHͫo:UN'QS}[|֌T[EsB鐦ZY7ݚX|[udW:wΫr";~-ӓ9]Or0 L:;a[[3yxWY5$]2yNUUE4xR_ĞPkkz:Uf\f-n*RkE z6Ċ^k|C]Jsza{ʮk+fV-x 7תzҺU_N0&f-mL6<ˆᢵll3zʟ>[ny-szx4gNsՇNZ7+=}fɯuأ.֞1S];y;*]:{rq)^h׳uGKwNˇGeeH`HD"B Xs*m !2Ha$1 ,Αr&RI!).qƩOUNw۳v$2@'q}w_0V)~83:Ödk_^<9pzk/=%1mUF?>t׮vزi9*޵HZ3s:vO(mBr\uέgu0짞z^^=TrݚžDW!eŖyz[#+ H`X\-x`*HXth6Ly$&LYAHH(bRp>J9E0d(BI NK˗ݏq~mybukq+@[q7sm6moZM}Ğy=#)c5cϧbV"$,!RHbReŶZl5h;xcF:;U[lJi-,z^ՀuHvM>2HHI R "3)$, ȣݩWOW[5TZkM}|˃b-ˇW 4vy3&U[Fm[\դŇD[ -=֪[гVBǏ&(ةBZ[OY:tJնj^w@ONfDZ+ںr徜d\[z}UmByPENRH{,^0R{kd5OymJ"ٟgb{&Ş;mT-v<䓩9#_>}*Un<Ҩg_D%9ǏI&UZee)^Wv%׏ى]k-5WGK> zgl+͏^oTFVdw͡uFuȷWR!hPh`̤iDE $ c{\Ȧ@1VF+ 0B0Q+)Vlc2SΞKElޘHLjCZ(^j|1nUSvcyOrs3С JzsN 1WK?j%%q۱DfzXx_lYBH e02$9(0bАO<+s:Y0I$CJ\F*Dzp -{rt.F|ʡ!V(B|ldC^ nF0oc5Zs:ѭF*NV:gGw44 G3<[ڽ<@$2cI a6,P4@+d`HHH BHa ( "0B+Gꥳ]M8=3kei8$E"XѸxؼckg cdh ihQ {KSC[}g[˯V6tע ۚv^PnFZXS5mi஖G:dGsiFSd+)o"RaGOJK-?rm4yyu枵ֈdN!_sҸOfy`8>װXbK?ljDž:-,{WWlt(Zu_ף.= :~G^=z󥥎Dvt<$\s[.L(|+n[҉cYiz jtu?H;t*}T*txO`kl<_>}+;IJ5rTڝ-;]9)LdRZ*XAji˻Wu@Z GIXiSe Ϳ;h]дTܖڤJU9 kGI P#Ń! TGR8:IR;&i$XBB b1BFZ[Ζ n1 $LA"g$ؚ6ƼͶd@Ad!R$$44;98yӨMɑy,Yw^=/*yny9)vgB0^ a!P9x-q.>tUӷszC400b`&>\-)vѱٚ1#W +)|oBA !Ad=JeյL/dn &Psd`I?|O+ +)BH"|r`"D@ -`` -4R3p@HE1.Dhc%XT,0A?3PLb +p5򫷡.1תڗ.J$놟r7izPF\ф yA=2$M/3\&HxvZS*7+}񆭴ޢ681kw?ElxߤWMZwʣ5}s׸*[t8y,{uJιK|NnC " -ޞX!# $HAHDXPVI@!]TV C &Ah -@@D@@B D\ $@׉5X[jÞRϡ}BȮ.7r@C9ē?'յje%ɦmx\c}C-fe՗r6)I1:ud5?6c%VHS‘kVsz+(ҮZwR9=W6e¼촐>MBw>7AQ#Ewlɻ82S/FX737Ų幫Jm@[^Ǘu֤Zz}vRdN<:4ӣ]t×> .,Ԝ˩_=Ǒ3suG]Ovw୛,oܞ:k%;M⑇BSWl 1H^ d*B`I c -\,1V \CAY$# FDWX0"68ɍUە,XF.D)5a6/U=y/_=V.:V쐅`$V !8v]J>&ȭ*U5fJɖ.LS^]+}:3cc!RH"0%`LdI@~^d_:ؙ%!2I%d+ش7Vvzr#f !FW@2,JCW[8^~ X L1Dim̟M8 !a $ U+ $WYP@DR"$Ah%[ч8"FR $$ WB26Δ U`PB0J\7uO>)vgLLq}>#ƳEmwc(yitG+)WIDԢ'&Dyz;gXtiC^uk&~EOJZe覶y|Mgox=^A5:ڜ[{垠p{(^bϢy6{v0dQn$S+}K[ڗv(f`9|[^7fY4>myհQ/̹M>ͭ%-ҽh2+\d&U9V@5HeBTII Y`5 i@J9R(Ò^46)9.zίY #h=3K̻]^0(G(iX%0BVS @ HTb) H`$#*Bפ߀B*?#PIf]ŗxއY<15KrдqeWWWvK I -^S9gӫk.:=eOR^\۳wz=1hި[-+\J[b*M*X7NJx\ν(6UW> -8zU; mM Ϝ+"^K[Mu2.}^moj:d<&ҕwwe,ZšgK6ct>]UYbk[L^k4*XizdXOǷ_bK~i\;FwO.٥y%F^VfyZ4;L_);_ҥ0ֿ s:ކuxŰB RxŖ<ۖYjޒV 8 ȶG#CCf.|zKWn^Bz2"TvDf0HAH2h9p t[ͦhV$826mlJljER;ϝoj1l]>oG $ "I SWBlmW՘z>SqZxv>&Qѐ @RHBH4]pjdcDX $0A : Nyt[d׋LmuMS2H"0@HX@((4Q@ -J6<lM R 'hƯ$(X-.+VZMXw OQήT-$͞t[lPBTGبѱp{GKKd\^WM}y?׮jrxwS/mwwWavzQW}sgQ/zUWMޥg`yiuzmgjҙWMsKMڿ`9tKm[`ּ͙4/}c4&v+]%֋=K"J,4AೞzrڢmuШl|N1x_2 $R")Tq;i5(k;[Gpsm^ܾ/F%W{IC_B[}nd[i5IJa" J+ CGG c@" q8e ! 9;QI &ibٹR/sF e`$xuv:ٸ OUpM8 jI BHD a@C$!#*ВB+ Hsf$@ *BrD* "ȋ"B0`]C`B2I $ "*>[U2=&jQ/|ޠ L.O#-eKQmu69[|ۊeOrAQ(9y1Lƙq&:Ǭo/6d=bv2ch78_&qr=ڻ|siZۚȐV -@C o*Y{[jK3(p}6{э+vw$9>v{6XT1O@p'Zjq21SsЭYkp96popgQY*Jyִݵ|׼ݖΔnE.1<ԼnK񮙩~}"=#nYK60lw ZoGWl9ggP(׏_r[䞑ʾU'zN\(=!\F"A{NStW̽ANU_dArR;!`tRh  -1IrLtv\>1R:-|y(V2yz\JV%d\ɍzHT $ (`FRd UAGL0I `ezH!@N'jvCx/RB)HD^x_Үcu|WJn $2PB)px%dӊWOy)c'B.8HdJSsTR"ETDEǑ_Ľz aQ2LHfhz^KMCN{I)Z͖;ŇXڮضFYه/QAn 6Vc3^)niڕ" -U41u1חl؎h6Y4~ĕo[Ǔb:< ƥu4Wd0u7,+cC -k]ןUM266F)@Hňl].U>,k-[&-$d_yw高iI:M뮟S Zέ-8u253)Fܦ־Ytj7^CFj%*4Wm5jW6nmSWӶ]D'Y}"8MK#2-mpded%rQ*X&0]2#hH-X`!TZWt1!)^EF_<]@ܬVϥ +z͏>*:̣?z׋gW=nmOIlإBT@BJ)fR$!aa2P` A(̯P@s0`[-3_!f܀7%zұ[`0,0`0YηIlUvZ";ӁC 0 -,"2#, x,WaS2{uHVHHV/ѻtRr{yU(PaUf~>{>NDd1di!2,{g񹧧`̓9Iԓϵ٠ޓKܩjU=kpu8=؞}ugS>_:+I]Ɵ'jW^n.7s뿟qM^=lH -#9L -mr7kg -rޤSX폕*҆fzQ/++QC67^7oD*F#WE2h"Nbkէ>7$$< BF !0d>'L afR0!*$>ZQj^緒K!G^_Gq3\1@}I\ 9\2CObi2i"E$Xi200X!$ RH@Hb( luݼCA -\,1* -( 2ADX$C0 -YHAr@MH $J@H BJ Pr: -°TqUDkNUXV3+36dSKsVWѶ/}2fhB!+.1$uu*^vE{vwvƙV05{4U% -;ii{Hū-f*գp: ңޥJśӻ@Y;&_}C#a ȱPDN1#OPťCu6m@*|׬:Qykw9KE{h, y|.:kJŖ{ 5qlf=gӓӥ{.EKb~z}z]+PޝD%y_гb}OJ(^\TZ1dSdg "Y8TyiL9[h\Czqp{}eǓs{YЎ5n{t_:P&ג6}G}c{ o*ήzl.Sb-oj]yqӖ``:̮Ss/@s;*M!v͖|IuhHaҼ$bZ'KYuWq:fL9k`yǤu),8^1?W=_S*֊me*`0$h@L@X  VVdt24IP14idYB58Ke=N&޽G<L+z%h$ٱ릨de\o]G˒B  DL(e)`TC,ǐd+ÿmdEq$Q0i^YE("#H aU` "I%0b `D aA 1 e-tn&7O!fړA#;=Ձ5cz`oSTIft6[lCtZUA}?#)4꥞Ovɭu2ilMQ.+FCSgdlԤAi}*6=_-BөojA6!!uUr<+ܼ7;y,oG cL$ rai -e Z0 -@$(H -I]4UA:uq__91̊ 1XeU}N~iו9ٹ}Zkv #+T2J Re5+ &,Dj|X=Kn;X4 H$moQKY I $PXH! A @+ A"DB!Y%"BaɠP⣡ofKCD*罵%[sw+om}:2dEeg U`bլv]}7`+Vd4aAٛ];a56|9l%?V?0t+U Xӻ]SxңѵvV|[zm &Mg/#B$㆕ާuP_#-P}gi|OkzI+o3ڢv%Z)vӰsVD+J釉ޯ]'8usY ,U{;2hNo^Rz#='wֽ{w!<=x2Oҷ{Gͣ}/Y>Kk|3~?5)LO+yA=xc$}:>f 5} ->{y>=_#9<.9i:T;Q9ݍ3CҮm!||e̫mfNj;"8^CZ; ҪGT)>eq,j_cvdHa$ABIa0 ' ,1g:`l AƘD;09a9Mi&Rp)ږgKҸaWn'e>~֜tO?/L@XҰ$ 8]jW}څ"򸹬g|G-RdqBH)9 -C>]7 vV}eUKd,,29-lsɩ$HdVHI!B  2PH$HH $2,@JVB4$2.9%ȑ:E $/HoITN rEdBFiڐJ^|ؑ$UHu:Mhsdi$UFI@ȋ$&)#ߒI^K9$4Zri&7NJMY%ݒcrI#!HbK2<,͆BmHke7y53 Rv $ (I +$k4$D$ S$$$!HHMC$Ua$$$d $I! $_~HLrYC搛.v'ڐI$ג51I %kIK5Ē d$D2h$I %$I I1Lhd LpddF|2X%G7!I$I0erI3c $$rII02JBI*I,E~o$,om#Ԓ #G"uȞ[ّYj +$jޤImnq̒I!@HgI pɦ=) zj& #B@$42aVH*!S,2CI$d6$$i!d%<$>ăI2fIfؐc""L$d]D$2C +elDy$ A% A2H">9+GWtT=c֏O*6faSݡF/}k%?#G9hΤ.ѮZ*?c.9mb`}&:q湯ͭOCiçbI4G425S6sLPpz=齊$YLYNא螓 _κyY*4V -YκuԳU=ݚ%3},J̛eGy<:Xx1gO\XXyLJ8e[iS ^w؞qd94p]}&`=z#<Ɔy,8\ha:ytdOh]j6b=o-q%{IRn `i@NVn_'q( py ͔r^X} Z' G|]DN˽>^`! /bijVev: r{sM)J2t()OoVQi i(F;d:W0d  .vwXUtǒy58 dM8J~dX -m3oE -~_o2Q赚H)"J7#OĆ'Qz JVK uņ:r'2.c]OC)Mkʲ.ɠ3M0R{(*+sЮylYԩdA*laB!Ί-sM3ˠL胓^[\{17(B=}q΅su|%6/=P_\+hMiuΈ<{ oG^aLF0BtDiMY&:`鮧LDI55sIJ5}vMYf|1rwiNȰH]h#o%héV3`-5B^IeIFϰo26-th@} ,5XXR#mk`wf dӈW\$3L(`Đ:7OP}e-뜫 w>jsqq|,7};x8S_pս K» ~&tyn1 qL鸠[?Es9ƄKYQPB^5>O[!bl_|;*f7AR1NwXdhPh!Sŧ8fX_ A--O}+hz !,Z.Mas5Yz5e#\>Dh1#خ `> `'AζkdrG(=0qFU)?qz?ѡ "[a -jwb݉}$xWɢ8m@\Ή$V}qO卦#~I2TR>g'AfOۭ9ڞbl].Y3݊ } z8*D`K~r&@"3Fo=y'NS3h$:◹8]Xq? $={?.dE3HJ=aNmn+y0[V-b:#0֤)ʍ%uU&`NH4;җ/t%H]?:O 稩!u8lC h4ybIQ)}yUK,_cxK2/ɍeG;':Dɤ -CLl r -:#QtO ;}}}ccJ׮NTxMkD@4ПE#s#$'V?f hC]2H5;tJxf1)CgMUSC77uwYJ0g$$4j,|GN$)(DGr~""ҷԮB~O9D9~$ysGy))ډGҖXMy7/YvUSH}"ȑIۙC5~jAQZ?Ar[u%rMY?f^cT OWxM+B _ImUrД5)vʲIN3I8Jtݾ~Y:Ixt9Wg2ƅMh[s2MY^L[GŔk?6 -s p/ dR dohSA_]Nwo hEƚ$#m j|QV$x,ɫif'k2髝'{ycѰsl.`8`YWhHQ/}?%@3h!.cNܾpͬW>ÇAeVbS("gcnXظ(T@3Z3rEQlKEIc"J²xdFz3+Oa92*lEx:(e!D*2US{A ֳáeЎ!Olnѵ bHF_*A9x-5AO^'v0sV xΎJ^_&Nl6d*D}G qfYT4rޭdL,$qwYкz\C4Vg==E mb2-eanJRU--][*i;y=MM`Z|_u>"=;ҩ&(v#VyΉ I(Gjc_L*ivfg+=0TvhB@G_G&&P$ #U(:J.<Ҙ-W{AD+rb\fNckyōU9`,]_1=udo5y58+Ny|{ -xap3OI?2ȡz=oODQ/=_4I{D n68ii9xYo - FOI&mr -Wo5:ӝT.Z'RDa>UDu.ě#4)1$d w3hIO:JytwnuHYE\b $:OW6ns\_m*TF 醅u/5ڝ uu$ I+KS#; g^]b^3_[Uz(:Js>bjA-+˘It~ٞuM-()q{. Ұa,ٹszsȅ*,t2B5 8ﵳE PAQmK.7j`~ %\'ζ|fe<$b2< 2; +jZK!lM6ŨǂK|:mlsiŨ9(b2H0Ѣt7"L2>%"ٳ-nyЬxwbrAhF2RyNoyGׄ`6^AgӾK" -2=[fʅHQԷ3\R5~o2|_qLqN!b QKq̊-͹0}5ډ,FkX@)9%IXUjx{rK73h큮V,F~-<T[d91i?ȭJfj( -+3q|Ī2"3q_]iT{Kq#:ۊ)5=ZgVCv Q| ZI[qc1:D&xㅞDt4t4׶tgM[:z:{4zRx5kAuAf;(̞i c}SeR-r# B`~w|O\(r5i|oҵkC$Z -WH|+LjmsgΦ5d84@>m5>my-3j,@^4q zwHx@錴b5Dɑ\bj٧Kϵt䈌Ὢwo#GS$ty9#.ޫ,%W)Jv:s-En9e\ytFu^`-DlWMv*nXƠ2rDtJPHJCǦN^6בhѣz YNJU$Zд{X=&i/1#RIH.\I4֥ʭhI8oG'Jv9z3Cʎ2Vй"ҿ(6ҿ hRXuZU1:ނW4eKB0qZvje]/ ]$sd H.*_p|$KJ6ɪON{i5sʪgT+WO!8SbzOS.%rȩ:*9HMC:{3ۿYk]Y _UYJTvoxfl9,^ $ihPnÂDooW}v_ZJOg(ڴ1ډKS]Kx}CBCkOdASbq8F\i~aO.PfwyIW1OԳ]Nv!>a9}>_p!έj5VNn9>59jpg."SL1"} .u~F0VE\u4PI^"A+^9]ol8i*u Y>nG-TW]^LΎ -=kXs%Iuζ4kjx'-m9V?(s/Zy_Lе/x5dq|ZMsб /&IsˬgX!zʊR +Eqd"8rB6TGc҇_1}8~TIF~ו:KѿzC\2F=d@5(rkXKT`UI ҋJ>W-E^V؜D?cj$on~$8@Q\)m-GP;RضXp=\\p};ўnJ0?W1R$ȟǾ]uJ)*m?D`6otrzUCyY}2^CݖX`%݁|? IC'WCħY#T5)qi̭ P: :Jͦ }(X|/ BV>xlEi 07^vpkq{G%w4m}inŹH{GĢ-hw}9wr&+M[^ C UR=ae UXhǕ*^ݻ9|K#ˇW)Ǎd;pVT:;s9l@d6R3yS -aj8s PJ&4ס#L߸/z 8$^z# t\Gkϖ>,T= ɞh)Sn[)mttd@X_yrx -'>^W;_Fzb= qqXj7#LT׍Q&]guYe7nJv)h ~Fw_q"-vrp#QN+JR7+=:s;*YwG++ڊӑ@J=ͭ[6ml١ͧ493Cd5#AI,Q}k<rDVR3xFT?ܽ!`ݯ&퍶 $]O$f8UizRk,%v+Dq4s5P~%V*:t5"l<0hO{V!mx,رM٭p8 #RΒ-ZuqfvͼZ1]xHkq)Ya+#OFz&xu bhUs-A.P2%#@ێn9[N~ +naDS4>2G4,p$`Ț޾|fDaZY -/3@AS[&zC6+=ȜM徵#hƍW:g/_GDj3?lyacL3el[k:YκySOec<|Vr. ~PvGn}"Q}9#gȫ2K5pD˽-t>O9u|9Ü`rg'w۞HV[LrqD5jDk _@6nNpn9RsR3Fo\m'O<$PL~kD$>` 1]<j|PjhUE@}ʲ3M䐼~xƛɇNQ>?$B>VC14l f۽6+/;ė%ܫieTW[z}#p1Wϥ2Eӥ^O@}a UbO3::9Yή|&κL/ȷS ʧߪU,SC:^utsOG "&U~FV)v^5S螡;} / -izJUΎG1RHJ~z)wt+ MO1#%.y百ygg瘌}nğC#6uK=>4qNIQj - N4&4)aR+VrG^k֧59jsX>6m[ rƭrȑwsw:mށfܶ&j3=ef=礹~P@>MnJע]xA!QaK! Q :xMiz.«0xwPTњy2hURjtv(( ]S]3T0bmI:}g19I.:[YZRȧhaeMo:[yNΖtvpհE @pnv)|f', ~W(ڋ!6=oNv`-_s!SQ̶Tŏbqew NT$2_EsVeo?q\L49fͭ6h٣gϟ?9="aG2盇WT_eA+$Ǡ~uq$]̈́{ A6;)xY>id2W_ŸUw1 [s"u \6.pcLgR2cG#߷kDv8o[<ڮy%1دj@z'yfv#m>\KHʧTj' ~ԑ)`z!w.Ѳ`_Sag ^7voFa}Yx6rfh ,r ylXc>q&{x1"D<̀>eYUXUMe\~v`ٛFhaoa2 G2k ;DjΎLZ~l׺".W {JG=`.`mVJr̄a QS/&CZ=6Myb_M۬hP r.H4PM8%{eA xy`ȩ=`UۅGT -0F~V֐KQ]NjsSȉ,e$$=ᯤA#wjsqƂH$>m7!I }beMhU"׊=BrEmFPX$=K57ԨVȄ>|"nlp|e9@B.ͭ[6h٣g͟6|fjf[76nlٹҳ>Ngy@gS:V]d-~&n;$|c|g;i]7 rWif':gΕ:Ys:YFrg*r.r.rlY`O?bo2*}-F$yLK2ml뫞ٮLuZ!HHV9sNb;BV)S2#B2b%>2ۚ>=4ۛ}=L;Gz< ͇49׈"Of -;ue&E7kNў@P޽7#ERm 24[s6[mzٷ)`1]JGW *W΂E^8u۴aH:)mpض6k2^aiFm=tUa8T4#)iC?vU/SKh[1»ў973ɥQ~ -Y -hE ->P5pXcJL9[AB^K5p?/1d=I..3gR1($c⾃_4kWG6b7qr,gY6Ց+s݅JWGBu2n!_Tp%c/):VDQJhex}mOb܁ Ydꪟn}l*o4<=3{,0|0?nquX -H [-| Βt::%|`J aΆ!/<sW9ؚ^Bq'f~0ߍFZHڨ՗j.ՖY*wlwZy!(X|!LU9rTOFHao0h7%4iZ>6ǻan9--j[ -O˕7l\{trG6 mVc XA=+fY#>t2W5IӅEWN|eOnGӖvm\2Dp.hVs&&⋔zM^f:| \Κr/g"r/'`rlYf%xiijGZ_NdfD F[B',L/tiͭ[6h|mHC#G[ϿL*|e.N;*L?jsqNj}]zHu>_ytai8-ד3LV,N,7ĦȬٱ"}Yz1%!.>q4ܔ e̠3M>Z@ @wğ$pD5fF -uſYQ}b}0cO& - ֖f]K \sb֝dg.lnfKyxff̾3!H'ӕD<KtǿHi('+_nl X D !#]c׈EWʖ+B;#Vӫ,R}*F5p}Ib\C9\CZ'ղ\4ظ>=S] `o؏UcR/#w8tKĂˆy#-䜔іh$WM5c r\0dd1=fy9uqXWWO7pmFIҼ{߭(#pȲ{Ce{LkjsHs˓!,Srf>dxh]Ά!Pω3[8-wϥRVA u>|5-~T5v3l n!sr=|d":ȡђ:SG T4]9ˤ3G9s5,gKK:Jx+VƭSqD賢#Ѷ#ݬUiNtdRMPGsXXS Ýf ?]dGYQיsf5%7ɿZdJF~6oK!mw~XʻɭGHڟH>%4Iیz -9/r͆UfDKrfOV]4 e#yX/zbt>]kY| pyލS)L[Nhr(,[H(%Yd<',g7`{HgTG?QW:-&XA%h])\әlkNtYvH@6@ht)gjvO 9%6C@mENRgN]舆m5ŹU(gp|mMʏL?E=:}A[hr]C|RVFxKj(H ?R?þj۟6Q-y28d]Gf2yԛʑ9]`eA O8TyyF1#EP-Jk%m܋{zG,r~~z]>/~9wZ}7 ]wjΩ( ݚl3"35龜lE"5T07W3s9wrɘfGg8k#LJ@̭emELټNyH7sV5>'կ7|=q͛nl#%;D*8V}~T9ʃ9UGaέ ՘ HZ&l8TȐH6t-gDѾto>tG6tSgA.t` Ή*SM8ɛkm%)9>([t+op+ -MWvZASn(ʜE9'B7ƯnWR3QbD-)RF1n^6HO sĬ{q {5~L0&;)Yno&؂]sG!>-GGgJDf )!#ƒ‹E3}\'Bl5$8{0$YnV]P_6 =N]̞IiOnsៈ`eIo-4vkפ~a3iG.>c5j=,gMO:ZyΖtsItgIt᪹ -o#I&GU'x`٬QbJ9G}A>at͟&e -ˮ'&rͰmƦc$TƑ,QPe`Q԰KPe]uZ@Nº7Ayq<+hSтneN2@=+d=޳ YYX_Y($a >+0Re/4UD{c0Qoov,*' -G#@83CK F+i|v<\?+# 1עY:8~%<ܨxNZ-zy!N2Ez#&<=X\du -}E]IsgUk@{bxɉnMmњdC?1c[<ƶCb sS鴰#m~u󪩦,8Gݚ&>nrOgHܒ$}n:n?gݟ۳nióNxvmṳg/g/g'#OC:j TkUN̳lH6F /:jHr"{o$ˡاq3zBHß-L;ŵ#=ۤvI-8Ndj:#$0#??߆4o8EȲbGfoPF -Ser:x|co(  4qq,pNWN#ؒ켈bVۜHT -8DOgxB>TR$y45s-45GV~d*YJhY3ȿp׼Cf>͛2?=alگ̶l`ۈ1]pW8Tr Fno>?g;ᓋWjTOz?HsqG5ɣx!sf㛏Xc]=S}sa -Άt4 L$.>"@=aOK􎜠us n'mvK\u1g&,/a+,I4"9aqz=n~A7\F xJ4xFQ.RG -hiOn)s%/  } 3CgX?>MWN 9)C.ԩ1ԢG!m~t3‡T7sy퇿{f͚Der$kt$)v5;_~OLv+8uYrZ ' I?͘-ğЬˡ>Z:t-\4ΎtPgEt1@&yzg.yvynynyi-9.Sn#<[G:ʓDW7K -N>}9bWD:f򟖽V]^rB#2ucq+j#4V+,1t$Ѽ)܊4(R˓Ejd2Ž? %TX adMR>O$OqW5wMЗM /2_>+-6'Ӯ}ڼ~K?M=Yk]tgO6tg"\K3.r%Lɓ92g"\K)Ԅsʗ9R*\K@I.~\[xH'%c}=Y؝Gvy&$jDf (w65kcR ZLşjqn M@,W i!'[gH$D |}P>x3yܩ Ft7GI"&zw2  Z=uUV1xyC2EUQRVXaCJ~jXu*,8W9sW?zV:kxJ@( f xX˧g6fC*%g\/'\u:xμg^3׌צÂ~z3< R\=9,_:&$YQ0xM׮զY+]2y^M'85 -w}DU6>bg˟h!*ٮm{l?}b)_gOIF=AԬEa{Ӿ+Ű?5p}C2nUG:z^"r(.t=,OG:z9ΚtԳ=gKK J =JŘ%ee`C%$hU1$uk,Mrr {7s=֭kcUT3eYT|&}za&Izh<B\debŨ.*eVVcβ!Ýl9Cl9GtYCzg]ug]ug]ug_u+Y_7&z^dpҳ 1"ϾO|Hۙ`؛@vn}ő: saQ0,"΢<ǜstyΏ9g6,Ŝpooqyie&N5EeQuq$/.3^ʲ\KoL[JAƵrI=l4k`J@у/.l>L$S4~4"SctP! =ʯ_k:YȺ-G3HAE&r8PDMvy/{ֵ ٷl>2nDG5|kIt:H3:JΖt󤯝%| Ύ E_:hū z5cz9+ݬޫV 77z>4/P5E^BY<ɾ^!'b*Z'7TdH?-G HcC&"\ֆޒ,tO]HT#rO*[w%|yu-~ $>}fa}{ N. Mg:[Zss%,Oo:{yȷ=^o#~?|K ve?q-mL|;fJu钐N4!zy5+}sQO'ݳλWϵX-<L4AC!>h' 3;VӻE: a읽C"q5>2"$d}s{7nlٹ{Gvy# 9؀₞dO@߰zF3ІSi5x t~\9ˇƽ󬫝el*H_ 6VRti~En@L&JWa%as`o.HX+u #nYuIAe[#'w(oq')񵸦ņ.\c4$A.t΃<~Oy#=fgga36l6Oc9v3>r9ɗ9R*\˜2G|znu?udzQ$aۻFl`=-aa9 Vhy'Hƭw wMce}^ôKlc}0& I5cU{:k Cx+5+g?4݇B:'}++#"nXq|OͻgMo]>LǮr95$D[cdoyZb*3&0'=ztOsB |WǠ}|:K@F )Yb@Uon,14eK >7㚟 rT[; Ij`R-t2ܓp4c CLY-4]O9B/oT؊>:XD2!Xڌw -we˼$T0FG/98_ww qݯG@.k!hg.2Z;9UC̓9ɬm9 /<46m9igrN#>0Cųr$v@?xE%?\ WcaK_9ΑcE;t'9M4I4>t'tc:<Γ:FΑ|HzI"#ᅴx,FǘD -[EjCAd+͠ha{j$\1"$~΢%Zfgdk̵A<L㍛*dSSaQxgUw_?#Ů޶L/[ +loiLA?d/E_3VCt΃ѳ'p4'u2yQ'}xJ8d(ۼe6)R*7)''xK;~妟&Ө++N-ir|fs|9̇9g6 3_::WΪuUUlgU[#GbWm*~O#Yq*>R6)^B3Ĩy/j1 -#׀x甝-}t({,\}|0Trub -#z .(E2@T -gae^@X$x1XKyɯQQ&-f˷,AyN^;l^$ʿ;9Tڜ[Nm>2JcɖĮ"fp4 4J;#q#P1^??w^(FWوsG'46y`yxsaϢi4aEūyA[EkaH}{{!Fג8XL]?'LA"nQ,gIc:;9XΒt3gE6t3gC6t3gC6t2A.tg͞_6y|M]6E 5SbCʌwg]#h ͍fxllU+3[uel#ݩFFvu=4aaR6܉ָz{{fK"d߶rӴH/[sL'zL_.:;ЂhLe7UWu lî g=O#u[ZS me S SaEZQ r;Ρ.7t9σ&=y; -$E vj59HdhP@Ĝ_:T ZH$@GO㚟lԘ^CʻrD |8sxr8m@ہ#QGz]e~Aoky{/JΝZ\N5es4 -42Նo(I>ƞy?RcE&?49cfͧ]:TųQF'۞kK4ȧ6 !%px>O[56Y4dF>&z]ÆSj嵰U`;pZvUYHbFS&] gpdvCg-K1P koගۛO>K*vٱk}̒ -lߴӵ˕X-M6uV+@[]#Z+qYWQ'e $|4ZWZ!,pvp pk 6pv]އ'\d01.bV]ĥikQ/$eTA]kGr*7Ʋ>֫6=nd6I6.֖d*[G/ѝ<-td86l+s9_s6F|\DX fGJ&kS7T3_9c۝[99[ VTGw; p&巆[e9y: -sC0~\990D D|6,v q N6`sC(`OOwbD{/|͍3.rLʓ93aAɗ #Pfs Fh4K;. })ɶqJȗ!Q,<']-bLK[מZ $9r Ć2# sgͼKc+.O`B3[dvImL)˟d>o΢u7r g}y2J^ -pgC\ȷk4M!?.Bf&-Q#}B(srP`F >[:1n+?Ύ~"F$ -8d|ym'tl%^N)O)qxAMz]ޜ!9A4(o:׸4 <;ehǯ\UVszy<|ϟ>|-N `W:٨>pv4]uy5nY;WˍY6QwHWVVbGe0U(]:K5IWk&ݫP`3s|8!!|&å:IkN8N6q zVٷ!8"R?[_WIr|2H!r8bttw!Ƞ哆1ZXϳEwod@'7?뜵,[_r[M'[UF ZٱiT{F/Xv0~3ƿ+g2G%]ݣDѮI4ҷͦ3l[#U!A{N#'7E}~5ob~ -5(Nb2d6Xȼ>+/k;*WS<25; NC*ޣZ87*XVQhafyjVB*ȍӑ6k=;6fήuv3Ug<96lc7XlgVsaϮc !U\9ɇ9QEmw1~fKo /_:Aٮ6,WhYV$J-X1h!{ّ>[5$hcbѫO&^YnAv9qӃ+*9=8]tī_vǃebzɰ) w6SeC 0mYcEřH5"h`W:~JژQF # #A$D{!43̨gR"VcxMfCIc┣/7O ~'2ӘU|hd'PnҼ|5v3G:ŵLg>+Csma=8ͧ6&?OAZN9Ƚ~.ؼ@Hᑂ8+5 *[1$r S+'a7OY׈PBU\;~8SEjdQ8_7 oLqH|1ӋL65zY4uSߐ$6QzyLuYb<#Nʔ<ʉEܬf :VUsC[4#k`TSK?o !allٱ3Opy6l9gOiuẃg#\Cr?'c:FfBfAF2PIO::xUB|@kk4u.G]9j㞸-V͝]m3sg:so7g3g3333g3g3bH2^Ս UR-vZE:fvw},#s nO&%mXރN%]~Xh -+VɃ:Jر -Vy8 SY ^ij́L#HdS O~IjӇmM~`x O}Vۺ,ԏ0'F}uΖt3!]C6vߵ'Up,WK,R;p X`ɭ 2\V~Vs}0_6ה~fH-r.!A"UnR;'6s0?H䑷[9~9[fԷl.)'fJVft^' 9 }T_&o|pGޟ%wmJswϛ4"/jC!ՇS._SiڞMW:jUΞrz2,${,rqNjsS 奫Mhա~y7+ -U٫z;3L[wC.ؠ?K,踖V[,ԥa0,gOHqb'<甶/ -с--(I]Uz3:3@Q=/@@ׯ ZfcE:Noԕ+H]?!c+h㛛76nlճϛ>l>lѳF4l٣fg#?nl96_NO,`$*7؃BK<kN[OIN-hmbiPEn+OgK>[[*۔7+`PY5eB R^3VXDyLBeNT޷Hm~Gj,%~7 X3t2*DڷަG*T3b]+mO 8T28=Q0gȸtu f]fӅ\7Ȼc Vˇjݷ79~_˹8 {m$I,>xl.%]Ǣ@NAS-N J󦯛>x99|G $wT|Ec)k|w/ˊuZF&yDcL[~,#w!5țTa(tǶ&^ {K>l;F]E{aΦKtWEء|%Ȫ"= |kgC_QWU-_\h%`OTVh3}|2}˾- I1ye,yAfW3uIȀKlv:7*0u D[koȼ_mدY}J x!qO%'g%EN͈1.$+Jj+Xp7J)>YeP7<]1_9 R̯ovW144TǸ3pڼ##$~ÊG-RԹg t5(YSe}zX5.eJkCǿ<6$^Mu`q*Kc$BBRK\BWAӃh'ZX[ԈE+Zd\f=6|kaG81՚s/V=ۂԐ|/2Y篘uƶ U$РmDO##q ,z+]vtNMk=9'<lZӼϺExUg AH%d 앜,ݏF>0,lΕ|ۀ/ϓ/4?su\W7U3}L֞+SgoBI#M4OWx+#W$5RF̺;V ޼^J~hT1dWPˏ"nX󠉻shøn6$U'Β|'Ȣ3xF|ϋ9d:xmM*G\ra#+<\o}!g~W7A$%v؂ _2gGvɧ x~kC)CI>: ӯ)O-]C: -9ðq[r+zrIj]1ٲ%ifD HUiycL>&k]9ndqں{[gҐg9cppEXgO_:z@U&KO"330pNuybM6p節T 265cr2"K󴜱 !7Luv:s/fi]ӜȽ+Ζt󣵞_>y|XL󠰽«(sլͩZuiVjE=;r4ؠ}j fT eW4?cfFf=dMOjoA .H0(B}uh@n]L{i -r[/gH_)Ҋҙ]0N] sg‡ĩxIOkar3.%kѰXM55Vވޓmؿ9K 3< {ʑ1fKu:ʸ/W?t>+{AP8jegɐfFXW΄߹r -E!,q})a!Cͥ^Q*ۧ:htޑf$h*F!̟WLr_iXܲ!>߫3D7Hj`2$GVs6$XǐF-K(y3q'/F>;O|BSr9\?m+TiakqR0.?)so_W/𸲛q#gOŰVZ6ȁgX{/͠XHsKG&7^i`ȦYrz|3&܍xyTEnfyCjg8 -~mjVϛ;ZU9ëV&2t50F.! Aaoog+u@{]+2ʁΑNZIQ{ k4qH\HqK~qnkⲢ8+%XU bՈG ӆkS,VnNJ > ╛i%߿yfp9ͼC6 6^͗{9~V jq* \Jud}78ʆ즀JF/0s, u@ڊWcĀ7^`q ʚ=uq -ˏa kDZIpmh}#,L;O]yO av$+hǤ+gI6tkn|㣼RsO*HpN+ @ǃ9ppuic 3F4l[kKfGRrzG'[,ųųŰhǧfy~ Zr0sy9/U|0ӛTX A'8rEf)9':ǓbYHd -vI )ͧxWjsom3eHN'V݉4x7DZOa*`0#Ш\hpQ,yuL(&lW3Yל:qdg.0BOq -K8kO@ HsinWy#9DZ5M#=,Ȼc.rܰ4P3F5vTfZ֖df~½Z'%jȪr)"Yv#Of͂,I -aӜp҄wb'pF)}AwA%~6YxraXd$ $!q})>m|,<[p;>lϟ4lѳF|y̋7śd9̋9g6ÜȿO!y#F Ś 03B.(u`]IΨ۟nÞQN vW훾4'7ś,HenL{[Gn`[Lsd,vX]]Gˎv c< -5$HJt\G:>#NS|d7jzm*u1m@E?Rk#}9fhvCTϓ5Wj[s !\RB3c&ߡOk_Juotͩ9=``to*-{/g.la| sj~C* |dӉx28om}ԡ&AP߱/Ize9GZ/Nu0b=1tɝMlWGg=Nk@:(LSLN#[MԺ)WhŰ("!O6Eg`b#əx>T'̓RUy2E/m0UY6x UdsI%)z'_^%fU1!ey"3#:k@u;ao`؉+s -F۠1!3jˤZr8bT;]f1l:XGe ɆSg }l11g g!s󥯝5|K_:Z+3rbLYɋ91g"FDQVjyza'p8Bd!1@4JF:{}񴐺,]|H /kߓtLf^}r)^Mwxy|gA JWh45dқ2}ʩ$UqkVn*@|]A#1q%k|˸稳kglO59I#"35y 1k3i!\d̝gPF"TL4:j#+Lmވ < 7ƿ*5`OS69s_9+1sbe B.dz YQJ"=>9/(,y4˘Բe8eLyJG6uO $q-)>[E'&sn:ԻFm̻^Au%dL5%J.{/8l -LQM).u+An\;=.O[c<|~h!)fE%8ݷ#JeZydO -sFH<+a1iJTh?9u54֎M#%_O]tԕF\P1?aj>~ul3VQW.A Xi6tnNW:V3]ތ/g> [}op~5p[Ji#qmF]Rp†8#Fˏ"ACvHASϒޱ"%XI23*~!X\ʸCo|l:rGΣgQű4 - -Wv8̚`wN\hAqƳ -BywSTXǙC~2JsΞs%I -Vt8?7>,(u0A$*ANdmrV}Ļ;)A'Q\Β-UXz3BPmnRQ' t" -F8=sد*5y~B%8UԜ3DBӜ,gGg: : NmlsiW.uW6̾S8,sE3;Y;S[V*ւ/PɾRjKzWt=51:I5$H},]1@\6M-?^vKMj2 9hL̊i;Rc]_.ug[>Vq7 5( d]R=}5jlQ\6\9jT)M1mIXB%?,MjVw"+4'g̛Xz>'>x#Ҟ>=G مkDupl⠓T 0Ue725s#ZjrN T*t QFx55eu_E׈[B-0˯FKURQu!7gjhxR_ i"|VhFs,H}xd\>X-嚸wūvyQylxDj:k.$LUYۭex>If% WzU~g"xaX95駅"!aĭX c&ѿ;vI,·HS@f3ƌ5_ HAS+4=(Ev+"v+)[﫤H -0ԷCW Б_|^R oq qyFTKThin^-A-چo#'#R1=-ll̠j9pXCs6!s.I,iac)XsEg:)  UEb( )j*\ ay _NJgMOunc4**oS d3Q۔WYɫmi$,2 pKD)H{ GE]rW"Wþjsq%Au@ԂNL0%:ɮLNWSb vKBS_h<9ɳx 8/ LypF ۲Lhs\FI~JJ\$~ܡ x BGpY&5 -ԏQ5Xe8_OC[6llޭr{*$A,qǵ4tS_UPxv$ts -Q~ 'HF6yWָ{k0'~aŁvŀ<4G4w˯ξuְ[ޕ;ëxw1[ztճbd tLܥBuUx/]GJn -%`kׂqny8]g|Oey\GOV'7\qFKC9zXl[#@i̥.Q=#B`#9'Xh:@7EG~ByeQX֚ts##Y$pQBU|/ג -3h'Yq jwuzf-$:MC[S;U,g Ik pP0ґXSjO^(p"& z0{][LINKfڎ+`Tؗk&_v+~5:̾,}`b y]$ÍG&< ~tYϋ:s:3:Wζξ,ξ~<nAU3hˌgfZLvVGW4UT}g-A F#mJA";l%ݻ5WNs/Usk"k?T>};rY&-XaӗUSuy^?AտD2R#<L*` S^}I#ߝ3~ޤ\r9"cwY;iToĒGW 7+Zryu\rXRe{1mϧu6E,yrж9*"&JRYHI4Vސ<^)- rY9P Qn_'\OC wx[ lI2_y_&"pnӷO+a|g#Jb2iO -]^زԟ88e؜&@yMueL Z[t~\Q")GkHanJ0:s ?eyώHB*,j՘i*+*itl>V*D ~Bh{KvXKǵGBjSxO.^n$0//Vצ#tʫPĚMH K(1pSX<<Juwi>hӜ5hRΚtA\g. l6E 7fݚsq5?|[b<2|jaRòAQ8 =r ,ro9 -?,H#ȕrmNo D]yj疮yvDe?!u9Nj~>I–/ϫj34t_}X7igRĩegI#>U{V -l.l;5yD p*jt>kK<֞5gZ<{3Eɭ)>K;ʗet`h^['ΊIR4oׅKa"r2_nW#M"\[Su>=[3]\+baLEjw.Ю%E,Z{0H4jE;J\‡XF8cZ92DCV)`~= -̪0b;g)Wt~ՠD~YYY -OzďrG+Zb~4RoqTIZqV]VM1髾U3CRY8uF N>]D_ kf>[}M rj1L'\ʫ!LH9ܲֆ\F5D㛎jsiґ9.IkM4"z3hwHCV.4 RfGU$2LIQ2o Zr5oavApN'<;Lnka_:3.Vs:9n#,׉f%8lXx7geUƍʄ{c?V>B-wwAU:DAUpU+O-i1:Z 0UX{ ӈ~xy '376~>}ӫ! -9/׭vavu=]LkF$*_N!}Q=k59mpȗ$cD/&U:֋9{r͈eQ$J.ax_J2R;DɃ90BqmɪIL3Gp.TkEI,>ph!JE<-U6?ӯF¸ylEjՍG;GgWWLg_O"MF"lpċmcc}xp"Kf) .FӆWbv5hU4^]uQG9VMiKQ9yD|V*_ jW27'a,9:*rȉb:eAq錧Pëv'vvؓv6MmY+%_oX<_|I+ o_:V_.O\i؀FѺt|F[I\%rGS]J Y[Bkt]Lh\JT֦u<&ξ|ac:9YΪuV3UKs&set SX\tLYУ5\Ir w|3+Az`2SId.[Vw ?W/;(_C,/Y$00 Zܭeyo֌՘_Ief>" !,gIOM28vj6HRC0ԝ <.F:æLO0Wi%e]QQ/4HF$/iz2hQ(Ӗ+rYYB(Za:bѫ i -$튽f*bwO% -ct1b-)2^{G x| 5"$ l9#7'|Fr :OT64hA1Ζt3 ͝^syvyr&yrgG]ytYgC(u?e&]h$-9<*gYS:ʙĚ5ك+9g:  -^Z{sK_iЏ^%әΚt3![ 9=u|@'69dXm-F]r6IcnI.m1L.2 !Róכk-25~nBL Ď -NͺprP66 >`+GIZ2\<7!a]i/ԕJ50[Dq3,C 6WۛB$j觝U虇.[b:g*Q$@"L!(zȋE5jF&{u%r)8i"T S4Q7mÍm42@3s`U(y\->*=qqY=qdq R﵅+Dvkl ÈM75k8K7YRP -Pe)_scJiXw֭ygn[[Bj͜5@4Z&yY8X -6bu!2gh֌1?m #{pYUg:rIW&mX&}*UǸǂljDw}va`%׆ |XD$ u؄+4dcOf2϶H:xc^#{3Ѭ܇:v72 cC:kU"F\ZhXDi,Vx|_BMɣA{uѷ)W]s/ы5Y&Xtׯ]39׾ҟnu6{9^!q ^9ΚtsCkI9hI5ԉ"FX?U"$h|,$ Wcm3Lq49c4T8AiAØ{b(;,v{ӻ% sw:úPfk9v14[r"'VX;"u==|ӷI q|F﷓)++衿9$Tα?~u*Xnkn5Cm,: >@Y.O[>x3ip? zΑemzh&#O߃}+Oj<-[yt9WΊ0ؐ\&/f!d{yHI*զ$/CAȡyyKN))S_/_vC?jNN*ٰq;z ƼD!hPݺYӡhl >ib}ŻMNKX'`P#U_ -[O1K4bEɠO:vԊ8}zwPX|?Me ocf<$s2Wd2qRuJFOi -s5ͧ6p.i.xH`gB56?F5[)4߁I͇6s1w]! pDĈ #ݜ@ S\"S؉#}80YO,VR(lȡc:I:ҫ8=lPeK E} UYX\'tA&HZGz㮍tF˱ # 'AeOdJ1p蒡GT{EW,\<1P~w>sۆHeۨew2zog&3~kC9ԳELn<:`~<\̧2!#%-S֓ū#gg Vw[R5Szm|NmɃ(m0?\ێbNo*wOjO/BVlR}''QO!s?H&Iɗ,迣/KJ>4ȚvS3&rTRx/ZG}$~ΈSeu)5Ʊ![0Zn^ΡxTD~uj0[H -Z6 *@җA@#΢ ;(Yֻq q\q\Վee0rݸHyf/|` FOqfX˧.<\.JmM.xy!&ySg甯 -i] aQ3PNg5{-8Zޭ$@ -ڔbi)MfZ9,|dEꛔuNz%#i/q5iX[@RIυwq37և8%>akl4MX xOQ 9i+}@ L?ȊYZ TE*`ژ8@W&'@m\(V,LVgQ_ $Y9DL2hkBrJn1pPOA%H#`|''YITbw؉{$r'In?4Y.s8gȭ{*Ü3kOriZh+Se^Dz"Cj7,}1oִ/TC5j4AR8« Q/0LYkB6>rP<Βtv3:: }ly!Z88Lq/+~q4_5̓ -nbȍ\uŎ&m9rI"Tmt=;}wz ߹h~T*7E5}5d`z:ik~X g{A,!I9F!RwJÇ FIOMb(WW=&[Bq%?+ݽXgx<ĥ^1=?7_9rfX~|=I n2Yv#I$6 76ol٩n%YyljgfM L\T9n*\#]d|)éðJ/:I --Ѩv^fZnWתntղzԹMc6>Dί]ltBz:E) $sa]2R73LדNDВ܊O&$Ҭrc#Uv$6#tn]Yaȷo49cuĨYyd"$ڙ|3@Gâ1#7V-[_#(o%C,/& %%]Eږ.uAádWlsQ;wTPjI Rans*k4s\ssf6|fNm9sL&|o}Cjn Ξ L#5J*,Ė+r^l]#c?f%[_g!F9ZTbL'뵸lP= 29e,O_2ɞlt4_yQDj\.:qY 7 ҊH Oe'ʳʎyRq~|2 -Aq7= |2O C}dUZ'kVQ o 22FJ֭-U -1lJn(S鯻F!X -!i;v伐eKmoŪSD˔Ux,An\1uq -*[WTxq* he4cQ¼VJm_,q.j싇$UI t|[ȶyx9Űvon1Y}݈н:_a?b1ŵ'b._ -ONT2ixPf%x96jX_^u50ax3VY㛎o9 eGRC_u3 f$\?yڜ1)Na$5c}o{pN A(ux)xdp蜮/j4%}桫^%V')94bhed\S9pr*4 ,q*s!wcXԿ]G4R.UOLX F Lۛ^'y\h9˵Y?8o; -< ijİhqĆ<|IeqߖkE2zO -q.^-[5 - g")ʏ!i̯n*}{Rн;s|*bAuɗ|!>:zN6,~99w{9K.tgM}4YA=,ɣxnirOv}Mp}:qUÇÒU:}26c˓9rf;o)sӝIyMS Ĥ$ᇋ |Ӌ/k&MQsvn5>t=M59G{^CiC"F{W'} i- !]ɳr]ImH5\ݎؚ,U,s5(dg:=sfO姤ʲݠWZugU* cK͆&>ޣƺw'۷:8lpM>nc4XΎtV3˧.<|˦iGs}5Z&')@z<1:~y#julg][$[(,G\fUf stb0{u2?gL-F];<+dbz氟j ,_v[,d{J!Qn,88$6 2^.L"?Lpƭق"}*OƟQ܄"..C\^І&r+/ dB,\N,n*yW Flj浿o[ ztcdɚ3*9\Mlnw NT [n6ݱG\^m+'Gfv;z;(u^Yȁ_59: pKoIerh։/rg_K'N1iS*%J䍣]YPUVMm+Y̕c2ՅDkh$'0m|'ȓmPz!}+n-sc rU1d~nڤ]w}VgTvmr~ !7ǚU;͖9_Qf6#XםFc[&s$M暫 FIzӖ1H qԯ窏:d_1} d;vNZe6rNJ2)@wf3+u*2si$e}c N\5_i١kSަh/^yd`|22* u5쬤)NL:[)΂l&/l3\OS:zyʢ=Ӈf;?܋rt7~DFɝ5N#L)\gB ]?UU@+ͮ}%k>*YW:ei%÷OuΚts8f -ʏN+hcf{g]صɫq :e[V`ߝ}2JԖM>XWUr^3uz~YTjRDfNk9pdeL#킥4/:0"wc ?]<_R1xuڨ{SNe_{~8oV<,E@jvʸ#Q#yΤu<m; zpp'3IPӎvK?DoQ:*xmܼ sW]:|7lԿ2potm#6=FU':̈6qm&̒񬋌ȃsPbUnIģ Br9#ǎE*[WAhf8Dvso+;=8lXBcvCm[䛸9$ ʠjsq7vw*`߆RRU[ڰZW͖h!ܱU@"NdUlwc.'#{ᬋG"n_,#u'xfZY9M8|A#`:5?H,hHqz6hI,h^*?Y 3e:muRCSoё]9fͯl|پCd\s{SEf s3|y,Or?n}C7fцrTE04$ C]>>CK1Άɝz#mdb$ܞՖqyU\RN_`#l)3F b/3Kg rdAbE?:8|91`H/nC =5y]/ΪWo}o s\͞D{ۑjՉf>ޟ4 )Yk(wf{ޓdF4icM]U$ks-ݜثnNاicd+U}xm~8Ȓ?ebHSbdR7aJymLژxm\7q|2OVuDeQ(P 9(KE9^_P&9O7Nv9؀Fq:C'*(j^+ -ڳWg - _\{fJsH<E6yr|H;'7@Eˆ5;{ k_̗-δdsoL#QηJ*>'ֲ@#O })g20Ee!lLv5`ͳKb9r١񱿖ju,{5-6RR S[6IOܰUX_Pecs㱳cf͍xYlE^#ٛsy7:HX6vy_9g:YwFm[o:KOֲtKxٱ+H` -|q9]^&VDS'isT daHqRL1›S_͑?RgiJydڔs^nܭ VeRhIJ7>ly\YyU{xL:]llOA}cߦ=LQٻ Pu,Ϊ uαOT}tv;Q!%s:Z_[LkTd:ALt+qayr&3A3eގXLy#!&mNF`#.!oZJ؊4L+bA LY===MT{ u|mq S=2 1MÖB̩P_xm> kE7啳jtU(T];K2K+uVhEH$qi꼮EX*SL,;5į>)@6,m8 Ө}'M\fIM'Enͧ`3n`q/[o+{f7xFZ;gba>:Om\L)7D0.^u HWC!XE 'aR^(!r3"g7򣻵PC!cRɲw7C5buf 6m9;uQu;t~'ӚvY]PY:+t˶E~Nc휘󔙱Gu1ۮ5cDvLOeyK ٱcf=)i+>_y|)H$I4U#UM!>rZ(@V;ӛNhFDBPuEY:RB3ꑕHI_ۮl*(U#܇N_.yc8LyGMbf=xe؏ -;o#Gn5@Dʹz.1[>,ҜPgKt󦭂3r=>|wu+ܐNH$`&,W8jK>hy˦˗lE&Н$ʻ'$C!vaR$i捼%wr i9Sr7? )}O2RhX5kutY[r5x]*dQNI?v*l4y ĻhK+iF!oBu_O# Gc9 0#J̍8*̮AW3\ZkUɰtD^6< r/#JS^RnJ4AJrhZUytwGuɚENa&9 - bB"־!]I9Z$!Kգm5cQr7  4*ȳr>cTNuUun\gή΢C,Ͽѵ4I`oVfͿ:r8NXJ*q 14S.~g%ux -L$L.(Kçy]'38/+g\XnpkӶMjq݇JKv%ΊLpXǣ:9s"X݄E&/~EG'3F ʽ☃7_HvKYeV$ NnMlU PqD#Z5/AgIWc<49͇6*|]o17zsKeY=$9GvSю" )2omw&n\ܹzVd3:93]sP GolpoBG3~Xp}^c.yiβ7lno S|( =4β bε?v }kͽ9Yȼs-Kw!d>"+b}+|^wt#$U]sW\:%I| -Fn -6NS"1#8ׄ Fs,^$i|)ܹ>@]*:L=F%?0TgW_ ؒFO1P|2>7cچ3UET\LЈnxHФQUybEģPo͜W{I)|"#%Ik(CH4ue?n^KHk:l*Xhj*ȱΉ%i"TFo܀\i$.̳$xps8I?ozρ߱I{F<3q9ŵĚ^P|F =L;Ў0^2̗zxxb#֝jo0V+YqU κ.p2ð|Jɷ~I~d`&IB}Hb$_P][4#喊3CUΆ?҂Ns]gW{ ԏZټ"ư̓M;zmnunEAˤ3#۬tŇ/3Ny͞a6u]c:οۄy?8GoR{f?WiXg;boSqߪV#}H%"(ǧ!|0v?5HƯvJmO΃>\p}u<$@%PPGg]%XRދK_L΢ S_"6M -b'X9a<.U|y:D2pw&i%N.ٲl);4SSb̓-T՗GW^$\˳2 ]&Mcʥ%=PSHB1hw_QCb)+iW÷l37LKdV|]&ә_rk&~)9 ƕ<ҞrkXNG16sR2H+epy CAX^r췛,.W]mAhREպ̗"h85}v]W%5dG]:[6oq;*I/_7B%):9R_]_:.8-V$p_-Z¤gӱ;BV3ϕM+#)TN}-v߄$_Ec~a#M֬3D pj~h'Y5XkHk.tPu Xeae*׊qRy x_UQ%/0ֱ0:>eb]J,+*QqTKbHʢ's H-+d=}~!-WHѽ4CA2GiHj"nZ dҴ̍:TVyugoG=}Cxf*Z浳ke&HBaxrehE< xB?Ch -2-4,VDzs{660w"Uή%B:v#$ᯡ#׾E`.ˡ.< k!#?@shŪdtb/F9c[Ÿ،Ft{ KemI,QriLuHI*TD~\X;hskfӛNm9ss!T_eM=b29,r}.TGWh==sCk_Essr5GxFrT#>~NF.77i{xE#}/0ج0K i! -Nllrl=9.쮝Pc'I*G8%$κr7x&'__:3W{2#] _Yo v_%KR0[Pu]-3b۰Qj)|-v]<z iA^&xTeHY5K栍GΈt=dyElG#:5,M+A˵Ol:n9.YTGTv7ߛqMd48۶h݌TΚt3BvY ώq͛5>?=U\gWW:ڸ6ϗ%Tdm4o  adhlWt m8ꮯ%~\,^xYH<2Qbb $549x,'}=TӻY?0ad: ~m)oid_"$MFmm/b8F7SS.sbKٲr-?|: yÝ 9ÝVΒ%h:YʃjMtr;Cx%{f3 "]}vPTڧ*JVFGL"6 G$Bdͮ0O7*&|'I]Y8D䟾"X]ܘW\Zd:iY:pxQѵ]6t6#H= -yX4M4zRFJpu^b>o./<4tuDX/|5Ť$9$ՓUer9Xæ;*c@fٛNM,p*oLdw2Ob8!U$:N$pX՞x 쨤{1.1nW5LOQGj7-[QV+%DD56nWIgg_Or͉t[.$_5VMO5&!H 8BcFmPޝ$v>hZ~zJTCPPFqF 3*dPE"? 6ٴ[FBΣ#qP +Yz9ci2(p4+R3g@Uɹ|ENy}|:DuLilU΂%ZeZX+iHβjbM GU\$jn[Y[k=qH;/x2,j0.q4455s_CNm9kfÛ6sOFWPxrw~ !ĀE>ń4NUk6[~T.l&Ό܎ =na؅戠NieȈZV[CZhV:Eh)=϶sWI?ݧI[65A%v?87oa$ctsp$BX&Sp°Gqz#)]6/ -@js[<@ع? Y<3S qě#2u:n*CJ&KA6bU*U}=EW|4@w//)5IvݠN!<#o3nv#k\@llEp |\&>76o9P<>9ΆJ/8dEdKvq څ]t>PԬYW"pcMaj3~p \6snm|Zc M3֓z~2Y29VU޾3XY ~n,Cx'^Pp~b! OǃW9;6`W ut41_H -ٯdÝQ>LϴOneͷtkM,i1yx΂<"΂,~M,`#h)A_O99"]@DѮ t[221O/i,=f}/Ψ3Plk̍+D<3aFkpDqmnNe`~ C貧+?\=7xm -[B Wj3{Kkcn9N!_DFU +iskᖯA/F̐FbqR(ΪKrӐJB|[`5i^h_6>ߝhsC/;ܘE!, f=VKh8[#}X8pT,_*Mlfٱa hmX+V-/"m3AGhskfrُDV3XToAMrq~gX^g|yA{_" -#}wk9@5IY5ݺġ4$G6TsIPuB"t L)N"XW`õT;6@Nd͡ԫ-Ȣ%!^&ڧ0q|1u9͐چvھciZ=:r1f<*8xD县Ex%vī;4S$Bճj|P=ŷr5_xˁXdQsԘ=# rO&<dt8lB3:3R>^s.~7_wG qq9~0aQDsXE);_itFI r-b]RmN))@2*]WʠQ1+n8y⹯ +/QC^vr"S9)$xKjh ']lbV8k4Zh=ɹ\6hgȤYP:orRWIN:gb5MKq*雓hlI~s VO58;fgdF$p6(YnlrU"{tgtOoϘRx,94r+f}̯rˬCn; VXF2MĮ|4\UJqlyx=U`莹nՌbI)wKVtG/M67&e`6Ya5_8ۯPBU"6&O$]k< -?9É/sFyu~:?j:x{<jHJIq[@*R(XUuF2!t d6cߺDz]FcCçPWѕ58bA)lU Qn:?|Om,Wc sml8Vf!ݝޛ"7ԐƟKƒ (P/-Z.u~!6e}ZphR!@qFbΆs`S n<5ՖJؔMG$53i_<ξ)]>]rZHdPӓP3qvF"WF4 4Y{I.c eȠ -kf*IXM2\<-EjER$&Yc^%.EXB۸zi -=$p/2(@ŲSx؜HE8kA68hLTţK îJVo3Rtu7@ҭDL9uՁ40_Fe%&ı-9]FϺhpDIcw'Jmw UFXjea՛6yҝaN8^}$/̩M\3h<{ ]>q|j&gHл%3rQ݇8Ly@siͭOSʍ@ @D` Z,ډu;r -sE.t'Ύ kO[r\81湮n9OVhƑjA֣ )&T mow،c&˝jM|y}Gs3kj}WZ -ehs2(!U*u*|C~Zʳ -\YWS$wg8j| p 4HWO[90fsHd",vXªuq'Cfb^|.sȣtԿWL8\88mQh(3K^ML -g\ :w1xAw᫤dl>YW.`2T&UKEqq~0`N>g$YD-]q %B3ڜ;%+Xiw؋n㩻[.}f.LPx6 F1# -*$*mЌ)C5 pQ呭ir"n@)د[_Z܍2/60mO&kqBY؂#l -@=hD"09T*ȶ>s^->[4r %&N1`3Wy}WD5)#[Sgke}3G;h~`\'ci嫉:rigu4b&f*f/U&Ee/ ekھ'NZտ0Du,`bXuQ_O<W;{ 2iȘj(VΖhm\XK5Xlu2.Zbf<|X`fA;nMDUc]qkqH_+uxtR7lSgw~,uPo%^#kIjP\dޫ/ݖR,$7/Dqc,Zָ4^&mgpWD^'Q 92g.@RQ{j.f͝ -FZS~#͵O &='ZY[:ؓG'`!eZF0Bޮ:¨&Qڄ'j4abMyuɣN %d_ʃe݄Q@?vNg* VZF&%UQ}NW oPw99TVV:Zid cRfxrYH*'&ִt@xsk:ZFZ7j*vhM<]3nAWb*Zcԅ*;JƿOܱ1ß@XjiyӮ?X!4d f?mF4YI]cī{3to -+OY jbq -ҰA$&krQ߂lx]2vDHB;e ŢJ浲yQW!3FS s˪$))e2^S=;*Z.鏅Ƙr*\f7xP;s$k؆΃>Nǟsg:s澟.ɯȫ=S%L$qhk#$(i*:T&FUsJdtEOɷWm|V-r]tfo8,OeWR'HxԐj"<X:ÿ ]uŖ;Gw&0pp!Ej2pFӆgׇH)1Ď4sk6ym\6 -53ZQٮk'.rjo{xVǍ\h$ß4#}hGDZOsQᯉ6zȯ5\ }>DiCP47h5pʣSζuԳjşiQi - r)ZEԻ_sS]9uFndRf,ʀaJe06۩)|-YP(`hreYQM?JFbq44Ų]+$I&4t\hXb:LSi!<ӝ!Ttt"GR2>O07ЫXe XNÆ^R/M[:jVW}mOeFjqsT궞raeN7rZm${~A}.w|5ˀi%(BMHF'v,Bq٦?\b]N}NoYЁ -M r+١p^_bqasswF$K|49(#:Dy͹Oh~)k%7 @&s j6 -yqk\d9Tͥ7ɅW4 $F]<#U1dS_! w>[TwI٬=βu1X0z'YldY̏92, K3t<׶7._ x$7:Á>"^<9|[I72 y|W9'hAb "]E%j߇R fPCW-wIPgq?1[I_`|-ٶڍ:ÑRm'Yދiάg:h>X5q -xPskgU9TκZ~n]vorQmbgid۰GǦw2 O_A#ٺylMuyYʏ~ Y,Y˚v$h$뛆x<:5w˹#nFv1ـbfaz,C(si͍Nj49EÁѾ Y4D9?JA :gO -I+n? .NZypx l#z1D\LLLYɇ9iiqM.nF3Mp?ͳKV(8@6H:Bt1Cܝ/}a2:?O]nB_e.مuF V4J_oi<"BPg2/v}dqSbkqmlwYnY4s,M :Q9LM(0D!ݳ$HS{fw#%t o5 xv,[=WIlXb9RYz,40ij J[u6ksnib3}\[SYh8t09G9K%^!)=pYyL}"UWs?HWhrzrI\D!SIg2*NHd] I]"weN1;j vZ(+:eSsaƚ0Ol'v5(ACU5E$KS# l?* YK1+ Bwoi'bOv_O#71 -ք5k_J:xfKEϷIt#} 9}3CGij}Y/ݣBG,P)IΙˣhFr"}0Ns1) vtrxHWE`£HGYgUTgYOg /WfyP5n#Oa>koo53E\Yaslʭ$\OMr(8+%eyy3xOzs?&/lOk |Gpb^Dį[ߣ=oGFx_H{52ݧŧXrsW}*"اb,WoWTACgk0g˭n®@86?H/ZY!f^>\WoZem\^b=eFFkݽ֗&s2 /4MrConWs9^-*K(g<2USql bϛʖŮozAk6cYdjeC'Avk Nsf3v0,&fN!wdΚ?[XnēI#q~?^0]'ڽFI93Jʼg+i/`5dŻT()َ Uw.ZjA4Шv3aq5a~IG x,[0κlVuoK6Fw8OK -h&Y3Ap8"0]s>iOs Suӱe>tӚ kxE<]Odw,vONK:>[ u5f''MeJj7+V6[k,cEzEΓ:UΛ בpYMtsVG -[I,2Nwʈ4_ȓ y> `|}5hP+,1JHZL03n|2!RN9KBŗSK B5k'>nYLlQp -'b5LDc_IĜ6q+BMxIri ѡфkHKgǞY|_zVԦhШ4RNv͘P2x&6D5qS؉Ybp%'Pᔏ)F{iC$S'\Ĝy|v 4OD}{k|٧r|^eᆹgIW#(t,G !G>lykզZ^#O߈,4v>ej#K@/B;w9Vi 6nEsݱ5'MsVn>LYϏ7=)el*C\/è'fHMt=#]K -BW1#ݱaJ߰lsr=ɧ˂Z[-M H xM9Ni7\Icp3LBpy g} djzk&tݤ_y|9&w:ݥz}rޮjzzMklqdV5?C ijs{(ԼJ!'suܟϘ]S#\1LOʵ}FUЅyUAIN]dF/OV4j`2U"AR~~ E'8|/3ql$X{d-sFd$+ uRZv(7k;O_4F[ߚq'\Mc6q R\V \o4Q>6KO - E˽Ldh |,ٙXGOf;ܟyHc_ ^o5St|.FHؤCwӈɬ|ۯW8#;.馃~1;;gOtۑfrSM3=)#I6ATlȿ1ע; uF>@xl^tH#]*@u\sAmgx/F׺@4܃Nc^T-{jpn`pҦs.C$/kal&dӗ\&%۠:~}ck篃ıE&H6kY#~L%ۙ"_C-vK##%NB#;jsuve^.^Rь? 4Y-qWJQzYK~m+uu3_]o0sxƏP7$#b S;3B /ՍHQ- hw5\ g|5;pn =>vk3S6jp5ܫv_4sO:7Gءolja&Mbxk1vsM9Ni|qƨdkfH;g#8tleΆLdBB4ʒM 3ƅܕJ#aiF<|% ͹ydef3Fޏ}I.ؔ# ,<3 kjZȲ};40 ܴݍfweVgY[!_Z뛉SQxBĚJ.Vb"tV^"x}#ªo,IZn9"dZlb6.$Ca^E|&T@|ݻ5آZ|YXE>J.:$4%ov(XoCn5҄-EkӿU<$d+´D;M$ "07 ЍV\j+8a]¹.Gv+22H5N!8tq#VbbbۤqqHZтxZI -xmt] ֹ,l&]v)ihc8GGs-9R钱HdaI*,I:5 eS[}v`4|C=`pׇI= vrIp\sbo{ \EpȃqvxGP٭.` -8)$o+GrkC\q/MչJyt$]C"]]$[#AŊ/&8N1B(%4L9qusBvَyNi$yKVP+sK"ҭ^#|XR=v`ʩ*Fɳ.;.Nì8[@'CҥcG2J!aKdn㇤+ӝs3ijesŶܲg:"iï+[,9:-9|O7ɖè@EFIR~!6LӊgL30ΎY)ҹՍ$xÀ5$2J(>q%X'nw -V5:7?l/r}ϽTNk$]5DiY6FX*F$t؝D8uu'efQvε vPBbYkE1 #Y;C qcDXI#$W,2HcilSh3vz@;sAAaeLK*x[{)(v;aƱXea#* %~Loc4ηIdd)oDezZv ̈́ݻ- V r(DwZY ctM*/G^̶F>Cm-4uZ\kӱo~eWU?.dXtXcL!ꗇ daNq%G$CXn~W8>}q%VBBi.+Z:$QW+#᷾># Q]M,nuo'@s)cCãɼH'!!bѷ!/*2dފqY9nv_BVg"z3 djw"7MK@pq`3xC3<ƶylx3.^G8cU9k :Uu QmIk1^k.;q)c1Uu6d3UcBIҟ=^ "6_'Lo˺/&Bq쵢E]blB["|lU+Klוu&)dMZ`4dzpZ&`hbv$mڳæs=fafVʠ{f(lȃW:<Φ# t{2%墦HXF x,SȠXwr8#vhsCͭsl%t9d[ ^kfͭ66llٰ͍,:损6hg͟6hsL49hsCXQg2ϱ 2J.3ؚ,`$5tP"2sы"ws*8dƳTw I0{뙖Ft9ܢ׺ Ԏ8 Ul׈jǒe]%՟ӷ:[klc[V+> *ݺADl02q]䩓O}+H%(. -q~T -T[pGsg6m|V/)uϗ+z#ͭ_4lz`pQPi+%UP1(pRr{hȚX'](Qt!Fx#BU"E:i~m|VΪβsay9C<<uV36s|Λ9g:lMs.stΗ96\˜s6setΗ:6s<9'jβuu 70q;c5-ϛ9af>${e#B$qϛ:󩱝UYg:9XΦu63]gUc ':Xζuvsvξu󬵆ݣ塝Mg[k:ODO6st${s=>l͝MU 7s̮3\3-gXe/:8bb{y$S1umgYg 9af>{: 5]H|ض쯰WpqKco6y-R#K3%i6 QW[r΂R+\_XsxI_m'VL5e>i61Nmb=-m9|8fgSW :0ߋ<oǘKa6yζusD,ϛ9g:lKs.setΗ9:\M6s|ϟ:Yζuֳu_ky839yyYYCIb0gAa_:ξu󮭂S]LgWS:U5cί3s`l9̇92,ÜȰ2o]3L6skfͧ6ٵkfͭӛ[6hp~l9͇9gUW:Tξyx2c% !0@P1A"Q`qaI%I$QDp#y$K53S53S53Ql?3Qk5_{"Ю.G\v} 4]DbŸlm=-)_GF! @],_]D>sG"FU0`L"}Cb"ˢ?b0N.?HP`]|#=GC-B#. $ pYuQg8oQ#Bpw+m\gF2ӳd/\l٩|G['3j!AE#O}ucJfoa{!2# kȵvoiwNs(}ģªW"|쭇WwFDI4J.o|6!Y/TwW:;R4M&C43C40GT~T*jCnŨ-GSb$wK%FDdXo/u1܉'ȖjfjfjfjK%##4ܽ4Dx$+17U͝HZFQFjD|t]QU#jG~Fk4ǰID~qܡjE_Ol]&L2dɒ^tU}vd1UP㓞C;,\FiXU骨Q.h{]*z?V5"Q$$վ$lY!I:PUcUcَڌ|9p'ӾQ4G+?|\2Q$J%ɨl>*:ȝu}6wQFjFjCj8H̎$D ~j,{KvN-I!D"iGpD0&>HtDetkuXIG] kWS5R0(yoaQ -#fG&Id&i9ǁ+$21Ic6oc]ɚd͙+j/Bٞ͐@tLbTJHdlȘ5b$j;,ɢcgzigj5#Qk5?);&ēO͓`}VM!jvG!]$U}ו!ګ$؉?[80>R!R"7D4E{.ʍڑ,i!4E%A~C*jR>DSBDlc2I6[EAF ,Ji -89JFl#$ȏp7ۻY$bY[[btb0ctoZ5LLLL7'?+Id %mtVX%bI}: [R:1Ovո1I$K%cKfn[^Cْi* B06RY-I.3d(V6"b2P.q]I G if6@ŹfbK%M2&3Ю\%MT+:p` F F9^UbkJhӁ/rxaxȬ'W1R(gwiFi4A=ض'F,ؑ sHF&8Iё:*Q>]r+7č7F,p#]LY5ɑɎ)zh%EI+/DTBz*WkG6@]"T& E93̐A 5Y":4F(Br9x:$ٍ1_$.ѹyB5Lkfkfj|xF3GFLY,mLgʥ%x(bUrK;!:5uKEpbs,:ǺiDIĨaܙ-UI'a]+0`(GOM#Q׭'|d D:!T;ELnG[zDQ&QdbG8뢓#O$ő_fƈUlW?Q(I$guX9^sC:Eb0F!-}GD3$~I IbQ$d6BL؁p&Gf݊I}z%J%5, G .k5gܪQ -:xvLAnFV\uTvM%gQHёQADJ^Ȅɤdyѻfȳ2=>+6r&D!k&E -ҹ*} L}(hOG;GlY$] C,5d1&C!Y ,,d3C43CM&i4 I,CpC!EbغZI,y\.")PQąD -V!B*!dUޫP$BHh1D:uT&~膅DRXF"F4bt Q<`҈BH$DRҪDBD"҈D"ҍ(҈D"ҍ(J!H! ʼnA^(Ѕ  0@P!1A`v,Ez%b3B(qv~;OJŘ8FӑwCyX(((qH߶E9#GC 8 p4x7aN_<zGz Z("OC7q1G< Z?s%܌~ tq0:=ZCzWG=+%ft+|Rp dhSp-ː5xgXޅvx3?ù -c1|#jG(iQ(cح#7Ӄqq/4n0h'# F(O83p+ۣ>:xf|%C#fh>a9T,R|k; L=R|N8)uE@ⵊ8S!?5mQKZph:Gh9нcb e?cCC_3hXHt?A}#(bs#2cb`ЇιG``ʢQ5b}`>Qz䝢TVjv,t,?>"4!_'|x 8!=!)k{gQн5t=wBK3DY n8`wtF-[0cn㎏8IRtGzJ.A*v}0POA#1AҀEʷӱn:'w=pƶjH''="'@Rb48f08`4 -(y$ x -pb 4|elF!q^J-f֑0-CNE;6]uCcDi<(`(;`7zJK7OyzYv!РPy"=J,qNkCZԩdBB`53bwOPD0Cз烎 (+ѥ dmq9<^/bb0гB -c@1~"lX~4qN=G!01AQaq @"PR2Bbr`#p3CSs ?oc9[y=QfRL8Z;+Ge9S*Iz/3Mvi5٨j.B -Vv;U̔,@̔ @̔,(ے`4xv_(< @P*.Gܦ挝ޞ#N2SO=AQ ->E(_(&@>@mQE4@&L>db.Fs)5|zH+ϕp 8Cg}SOl@uC`l 7>G`ۿ#O_!5#GU Z -@yoةGC*u8R('VU!ȩq:v){7bFȸ>씈=5N}d$yd^ê)d=6LkT!Hr*Syǖ87b9"Ii:dH=Vq#]У@Dn>_֚ (\9jsF#QnҶRzl^O iCMϾU?Jѕԫ ;iq Ht8›o%fg> mTd4 ;&.`t?:TCX:) +'Ȧ})xF_PLk%BSDo?*F(#MZB(r]̐G̊#d9jU y( I(]L^PǒPҴMoA+QD~F2QPfHPjvڼo) )QCAFjnYY{pP4媯PÉPF0*̓h8jM P!CL FYJ7gTM -&m,1\3p_ 0{~b7WjĚQM)`5t]\pQKAҪV\' -mO'7T"ׂ@BSiAJhF~&&^?25](1w4EǛ\Rfi<+1^JEO]\UJKBu5ABGT/'MP?1Lfj6MμEzj7jV+gejNMkuUȍ 䭄z+ssVU|ժeh5+TM9)U4Sl&ΩM2cꦘzW<VV4٧8454sRy8G0+dekWk[e7d_ȟz=V(^\𸊽ZvJxx+>JJ) =j2VfUggoL`9xziSTOz{Ԏ[ -mP=7,/?SL jiw5C PPwP@*OOO%#}()^^2}ݾ+ChB3ثHդ}J>+g*ʵm[Ru>ʕY;)$DMq\x+3IDVcuV'ﻍ|6>Wቯ5޾]3$D_=ei|g#t6>^rJ^?*%BVe=>A[_Na኶5hCK# 3NKx< 1>p[^;'k7~?)rZ(Vw+4TSzӊo-M%89!*+Cꬅ{5Ƽq<a脃5 zK_m~m[xU9-QW}iL>LOoxotYn* ڡrc;4r >.QF}Shkm?>RFfj:s -duOxQFjWU43O~vUktm*>+;)YҪ;#; znj8op:o4Jb, 6 -۪{9(UCzn]be?2.u'jnݨ QIJp ST ݓ - -av+7cbsZ8T)dqL+ƵԌhͼ& - f;^bZ -uс1šѣuDޮ_A5X6 -ڥfjfS_m6VVCT࿮'TS&8,N+wz( -`@v*jvI+i WA_<1AQԑrFvPP7 -߂)(HF5ԏ:SQ>n=:E|I -aU 2(N4TnVNh{~:6}*X: ,0X\]?U'e(@:@652+BMi0_oP7# 9(oGY 21kUREcUdwԬOA%?2aMNd'4NF#^]NVZ rq´[)4 ƽ4<5Exq8+ -*ثgTW:OǛU+r&+o*ܦ{۰^u>N o-LΉ*j}FsMQMGrA - Fӭr3%gfIBU5S@STڂ?QPwMN#.Fs)jaM|ivʰ*QR;+جqjXw6 Yʳ5YЬDYؠ>SiEN7R4IEumdv&J1Nu] [H8!G#8ׂx1({y+!h&=1PnͽL(7"ꨥ2h j#Lj5p5+\F˧Ŵ9-z5›([ʚҘѵ_lwk~0C -a@rkS.V)MF.㺚N)vX87`iU9l4L++6E -vv&mwQz˜pkv9Jg\ PBOiLM}g'Wk.lSTYSSn*'4s)<[ߋn8ULrSVfp @x -FURQR533^̻NOͥRj=ݒlSo#%d%d$TAB#NX_< -0sSr5bzY\Tp>68SytnLBm5Tݱ0Ϛ0w^ 'e5Wx#F|4sէRhС d -)Pp֊~Ud -i!ԫ;A`pkk`PE,䡇%B=DQcz`GY4D;&ID\(w&۴]#SNŵs8o0;{92 -LФoSlM;+ T QS V:>nmkMuBv)O+ˆMa n2S?B}pSQrQ^`ڰ44PoB9Q{Ǣa5LS<檷:9[\E㇒i!9^k^GiW\~RHP>^bmouzSGZzamO&w!@:HpҬ#U?PV8㴡CMK/:&NFZ7"R;"N~J;dwe9iNZ\~W¤uד0)^|"2*ҵVڅ(nel)Fm㡄S3Gf)S7=WMFCy5q:dh)৆S4븄k+JSjz!ji=U@3*k?ʬO`oUPr+vKCܢof8e]UGk QS3533Sǚ{]Tީ*H,'8XVzy(#tBx9pGz)闲SvS5LQ{G+>cAV,7iisfjEG%zѿ8:-ڭ@Ვ`B;o +$$2R5;>+Dh!; 2ng5Ly^iR+W9NUVU pշ`PM Ҫ2:Rm1 }}L}U5rQ -xK}wɻTߙI/b!%({]XG?E/ Je8k?ڃZ_LezT17Y8XO -> -# 6/EFsA_Mlj/}6OǰdLf^@Eܦ C|i<$aiqVO{ -r*rP+-[chqۂGxYnNtzejuWz{?e3G_=(e")BłVjNZɯ$o15GbeS -YĹ0y4 =Ğ>:{z(8ԨS'PZ -{皴Phڧ.k}(4cBhJӖ=Uh 5z"Vʔi ĚO|*}: -5SL+Rpk Vyj*#0{vU*:@ $Tl0ƉAUiBSpԊc)J+S -KP.fڵ@Y]Eg9Wk%c+ܡ̊*G4˿QJKwQƈkz;fVj$~Bz"%iJ%L:Az}Nf)-nc0CTqGFGSZ96 -?x UZqF@$9=;Rk$lBs6۸|`j x:J»qG^{pR2Z -,@ܔ-P\uU$xe$ -Al:RgSފ{qN -nq~ӷATi.Sl[ZiT1HZvRI -կ4PT5g9jo^ZjAa@ i]sxWYGC@A  n)*t7aS8S?}I -IAT=?ݩiܘ}ϪTN.8b?+;R{ Tee.B. -=C@e^78nrzg$zSLQDxRMY ~ Sv+]0( -7ukzhfjݻ$Q8hEզa7fa[q\;\QS״t?e+R+R!R);'` d2MfKBS)ODrsR~7bj@<E8y -J57ȟ _:kC]+ݪ;5Y;ݽjN)خẉoUo -fOuGkujvLpS=ܚOD.5+LvD)]_uq? n wߎ0B(BVcVSVS*0Y՘d -+7`݂ -rP=B5_qg*OkVdiN4VUke:dtP㾚(rjxPcE74ךo5u=]`>p쓉TBx<'-JRlT=TZ#Ok Tܤq4ym -CrJLǎ]VwSzw/SU5ީT*ҧ\ۿ~mSmFU[6k6\AΓ$wE+*B!]WUcTaFMP@gj5YXUh#E\z&0h U\߂oB٩l dr!>'SpL۪!Tݻi+y> [S -R9tVj/ioT;r*Tn4W6WTwb*#~TRj~0LT51PnЧT*a+sR4x+1TCQ!T_JP2SvS?e)wBs4R7*46/Vd1mv; -0gjlOzV~+C3j2n:۳)ޭf/-]apjryu7]9)}8'UnDhssV{Sm7B}df#5QߔU4kMxš8r,y'hJ;yk=SR5+3R4ꨈE ҟS@B} -y?uFYPnhqCڋ6n󬯐U[#* S PJ=骝OONy&ț"Wê'D U .B( !+C=C >tB}hmTM1n P5@SZ+ʋzFJP~e}SoZc}( CR - =pVPiM-qT:^/GG-U<Tn5E/2'Woe+a.4"A(ͤo;N:cA՚(Qs ~lx ['?;O!-šKAx'9MN YXk+4yf%[T\|\fZFBZTkA -J-p[O*:Ua!׫餦6je-~棻Ux<) -8s@D9`sEv|bGw7Jk'uloLmz(7)O>& -5of=TW)εG8S DcJUIVZs*ҭ*vnjvjP;"K(s" - YWuR;$ H(58=DrѴ5KnSWRo5j?<;'CKFU+opIBP|Ɗ(o'av1J+ DWvJ1ݽ84sDU`Vp";B̨CkvE%p0 ܅jvTr؛xAQT4P=AAD[]jkqz*p?$;)1&5DAD3Q #5ACDsQaFTnLrɏLz:eVk怽|0PE{}ZҬ($mB?@FsA]2:H_(ל8#\5)1ZuVZȦF(O̭`IsU֛[|)D(5^ u[<(@6y?bdBtߪp.}Y\-S=9+/nJ@ ~9VИHuߪg;ic[MnWÇʄ$ t҇T;$pĩ˜W-SO;35;pFee0Si`V -l8S^>5]iQҨ?zgijLPP4p:=E#?gCߒBisI?TnRFq)Ԍ)7iOM;$(ѹq''S,[+l_wu= nrHVv3US$#)(jy&E|Z~Uٚ35ӉU$lxU;3Vfn.fpO'Ik -l^Zj͒ϳeOC31< -; עBePQ8Vr:|*m@) 5Nj1܊|{iyN?OYZ;+u5R/uO-Jq؊8hFE Sg_D3cadd1d p=vL&d=f? -=;\iSj:. yEuq9(.gdXX(}Sz HVx}!AκJjt_J,d -XgQ%^$!6wLl"̨?@ϬZ=keM`ijL7龴0Q-rmҪ +&N#ܶC}oSS5ة@x!FQRQ5BxlkGS{lբ\Bij1 }?ބ7 )Xh`Sfh7SU -qp f9Gr:+4+4( wTw`zX_yګ(pyX{ưcO1٣qLAV1邱~fcZ/.򪟸VZ;hVV*ҭ*ԭJ[;bVmVi.XAo?XcoUSnY:j{Í}aYXV_/!WfeVMTqjwS}ڵA#NvO#ޯ*]RG_{h4ާ%ifJ2VT@O -JI>"Njb0O'Q7ǸmBDq.=UHQSzybrV tD\}F\wQFgs9H7U]?5U%RR OQȠUy(Ue%Y{P&rdvLcj7aGW+AbSN au5uuy^WrN=u#B*R*sVLOq -;jUˆV'$_ -yOrsEwQHj5VnS_nJq@h+3T5dx~º7<|^(7%J -OPm_cyLiJ$+m5;iHOq})ٍW·8~݁[ |+G*+ī)Uvmԃ\6+#ϡVW6ÑV,"puN@gbh -\A@ 5`8:!Dcښܓ"5b5grT=Lpc~<"^vۧAB̔,4?%7h4Uiz+k[U3/7uF EHƷ5<+vVy)sRw)^z{q4߫4rί󦇊5bٮ'Q(PhSi=upVZ[?Si4u6\tQNffii VЍ0T P52'V~݀N0 -\N'W -(%!AOB~kطyЂkƬB{BxQHrO9'ݒ8I&&HǦ8acy:z#FADTAD3* ->FT}ʋQw*.Eܨj3i;YNjEt*=Fgχ\Q,g4cMn+UvҜ캘צmJgfJ&V.Sn?=׸W|v[Z̫y{u׎eZ \<T]_2?PVvdYْ٪.FHhg?g΀o-N..,:cnQ:Y689!٥oJplT:yT-J_KޭȫszV|CB(-[޿=[V⠐=@X5Iһ|#ftHU5UV/J2y-Â$ӎ~n)N액NT59NsShVZZek -PF:PqL7Fb|oe T QSK}ʌSqQw)wpqUJ#hm4w<]Q\v<E<׳Q>]1V9}}}}]ʋQw*.Gܨj3aFsQ*>>2}ѼK^:F=Jƾ葵 -:?SVz"\{i4$9T|:5DM-E_T1)\`/TO4Ӛ>EtVЭ'VdT~~n%>sR'ӢlYj`rgJͥ|@$8|Ѽ*sL9]9j3P*.FsQg5DsQg4f^'P4SVֻXJfvVt{( j}P)BO:i$1G -db< -(0Btj+{7;nf4R7u?u0ZSʴVi=դVZZUZj)QZbRH)#WLWbJ4N$M7d}_=}4jv(8ӷu6/d&J׾ iS$2L2-cvWWMqV?X²4,)xHN'+p׊H_iqŤ*SqN:IN: -qN)8Q:NÊ &;C]Q̃; w(cFy쓎I$ُ凡B=Oo{)"9vYE(S#d97@pޣ/Y*4;e|1{xFyީWCQvFjhw'J% R RvRvRvRvR %'e O =؝DT,dSFeF]X9Y!Vb> god< kd4;~ -w0UƥEu։4^'eRy q -"HR+wyM5UuUY@t x#Vv(᧚H)ù<3uhSU^dEȹ_䋑r.E4\NviNr.N~I,QXeX]ٹXOuo#q5V"791M!$WO9)JiOy(ےhCWj8+q_qVҭnw-2Ѕ)=J쓝^zd!ܶ%'/_Jl?GkW}_WQ$SL~E1(ݒ(ݒcLvH]K6xIw3&EDnGXuW1J<]DvLD{((A>%YAVoU@O9YsQ:IV%ei(PG=lաZb+d*q# cJy?}4tQV&5A5]]S%w%w%w%w%w%s"̊p=5q_jeXZ֑Md -RzŽt]Z:5>U}Xug#2q:DHiOpV7Z{&^ʒ'"IZnf QLkmAW3O|׉$If|ng<ߦFR&NNN$dݒyOr{ܜ^秽9Nzs]AJ*-S^fFN4r!0CpBb{:(B+_););#QpuVwVO_+K5E-6#tL/) 1DG+4Y$ %ǒʢ!QW_zb /*Z--Xx(8..EuFZi=ըQVEZZ -;SNhr9Z\NVqeTm-8ZWX_]6Dǣ#Bp1>TO*SrSǛ͈VF91 裍Ǣ߂d{0L4lVv]~/b q+b#5d*kVK"=kLz软e i{Ke[=UL̕lZޭ/SIJG^^W8x!PS?exW;vFfjVffjfjVBKIIIIIIة{/b]DlTƅHrNiSEGtA]E@}0QjrcGO##:NW;"].F<׍Kf8ToV -[ÊsST@LpOgdvRF}ZƇ -bՔ]$ PW՜fӴs^{0Jt$uک"-ZުH8|Dj5ȠA*Euٿ}v*/f#8y؉}P#RL(3WsEnh4[s3Nfi94fٚ{3DWP=kҪ(TӖlLt4Vs‰+Tp/k{^W\U -j3<‘XbfjSv*nMة7bT݊Sv(j+DzE~jEb9`V2:8if=Si4ÚmBd5mu:k;mNč_7Ŧs:+sպ\RH@ĖdQ&Ή\ΊWS,U{E踦 - ÚT]Р%SPۜӟ{B[b1eNςw!\wאڣ>b7S̫Mjp@O/w ʑ^ؽsO& O'ȈN|[6`V]0VCyUb*k@ -m7PvE|Ub5ÂaZ靅*kzœis䦔' ]KIUmSJgMkdFDW:c]e!>עj7bNkUNn5LUo)T=ʋQLQFGdJk٣|HƝ|I# -+IUQRPzp @>xQYIVq OQ]b -!T}m=P9GvuVUD)KrS3?{ET$dW[h TnDsM 8@Rpr{UUgQ4U1(5WvS50 -nZ8:pʮ -;nh=T,B̔,Dܐ*qձly#*_En t_\SOM5a*%))DZJQt=ێpS7e/bFZNJw)JcukrPw*m/jRwV)#7[!+Ln0tīLyLyC's^ -W^zm^J D(+!$qrWq*ӹBs*Pʊ6zg*Rө*ߣ}Ug4(o+5UTdUT'3)Z -֟#\w![mPFܓI&&j^N= ;" Cx8+=GUg-Lc¦ 8xU^CwR+e0ѰC 9j*FqsVި:^JZNt3k5k54|w`oNn7qN{OU {hLB(Qƃ SvUuݔ5y'WKԙ=lCZZkJCJ( -&eUD⾕ kx1OǢNTL#PRx-M鰜gb"=:i&;Œ^TAԬ*@=ʴ(ȟڥ|cOʹiRd/Q䃆&O DҊ@jwE ԯNWn*:ݯ۹0A0vX:[+[}U}E[=J#w=4m> r[o7j$a!rm+4*qC@COvW3VvE O$[CG-kCܨ{r}}Z)V~YmYUY+7eg -d - -0 -0 -0jA~NL|k['V) -% T]g#mB&)Vw -|MJ#+TǢמT*ӓT[wnS]{[^Z?QRO~muMv(L(Mq1;ѼS:i5]2'Ś۾ u#n(ذ]cM7 e'ШT*+*څ]GnVUkjjZ?IR=)jLj3Qw*Pw)U j(bLTOVµS -fp<r)ZOftiLhT]6 k# ->g*0+z.uAԗߢ -[JrVӒ;SLmht*#G`{!)'cp ڵz5JHvC*j}Nh5[|( rbngu+<_fjvLמe9n8('{=/sVGUl[a[OW 6}ZQw-2cMة{)ȩ1G6G4iӇ0(?5 1f:Ȅ_â+ c+$aYb!GssDz+U)+MT aT. -.&Kh=e SwS -grk=հVҭH^xTR=J$4:X]~n_Ü?33]Z#W1i -ԭ+We9w-.)>SNIQ<$Z4hVz՜+!46{f}ЏtGtAB@6VV<N_* j cu A#mn2Q-ThuռU:Q4S&zewۮ8oy*"JJh_-jM+IUJLNIT>kfԄRǪd̨C&eY̨dP>J;Wnʪܩs4>? Z8r@zMoeQ<(T-VP j4GU*#9DbMWL3հT͢Ӓpp[VP6@&9?)[FѥÚa0 ,u9Oz<PHr( *a<VV0|>nItLzwɂփ٫0Lz'^*9v]~ 90oLz\G],wbV^B*8`9/b熨lSnEZD1hנ*r*{'(lMc^h;#eظhJ͐pP۵4I5ίF>S e}{&J\(ɦQ7J\NhoGQ0ewiEҙTo3*(W4C~U!VR*(Ei!iЕfIVoU}%BZw5 OhVrB*ب֟7 ЍF%%2^׺+Rԫ'ԤN4uܭl#zMS}] +-4Ա=Z<.x}7+?OxGxlHS% R.4Ц8tMz($)S++sQ:֧F, -:tR54+OmSd1PZ2POTnWmBA|ecDu6"oڬBТj-2 agNI˭)ׇIZ^{BЭEkܚU~{FƊ`'s(Z-5(<|64U{hۿ}0N)Wqu m?Cm>SDa_]1k -SآwP"aԶo"U4@)yWnQ~5BP2Ǣ}v.N&ӗ#5+>+3R5+3R5+3R533S1HJNanjFYm}OaFsO8GqV=ygE-;7Z(efjV}JV}AJϨ)I祵r+@>g2S~Nw f j+jUi39)';$Mzxc}B_XV7NY}QShmrN -+P4rPYR{I].=TVWxO`'ldSb8(qU#n0#8})OyutHjm<էVfkS\\\3f5i5i=6a%90FUok(=ji]جPQ`/Jh4$`TW!4)vҪ/l7G=*xD\̅foҬG#?eES񺩀]֚L^*Vy[sR4ffjfffh9jkhw)jfNCCz_v7]njzL榗4瞥4T}}}}J!([(d@VhY#xx/(]6c='=^=|h8ENU -sPi{dNz{݁ߦ;j@))8̏U++(QPmHأp mT`4Vf}J(B!4vrVp8qP6QUrMzb{:)Zx#ԩ+Tn Ǩܡ%LOjvg}ZZjY2 -Y;)d쥗^IT'֟7ըB*)?6VU쓟~M2ZJhJW[]xyzNԠ;*JpхURa6V1 -K0jZGU!yQj7N/p~TnVZZ/4ͪ}hԍR0SZXjjiVZaN* (Ez+YM2߷IVI.|)nlyVf+;j9+32P-o  -;𵥽+ -bzMxxeT1Ò+Dnq:cLp<5 K<dNVUiEZT}VVhy#SȺي8R*ʱ]7-Z6&\< ʱz[cB̔ c] q؜w&c'5 -WDUjUꦑޥL+h[k%am*S3ѱ2=f>-W _NHPHT0VZ;1Iߒ(]م((aD~&w ]@F oLQpO9"]衻κV$d[;SNDzy6bxdByUJrUE7OqS0KqRaj-V5)jiTY`I+4NЦ%ةM,,8o cuZu7CTS|N[rT#QtEPAJfSG^jQ9ԇlV#Xua*êu?x;1d>E Y&t,qQ83 N;dt -ۮ⁡̪^U_袹\5M(Nj1bP֨P$oe)謅UDWT.oF U*ܔA)T96U5B}K -vZmR4 -Tg kVR5 -` LTڥF$:!O75H5[iƻR4pL5 N>ez{ڭ5S)w+Y?U%ZSdž%UQWt6NOMWM.#*F){UKa܁U'H3TKHrO9';$ צ5Lz7(ߩc]((Yk+ɶ&biE/t*v}C&BLh ,P +p{!QMٟn_4>ώ;;{^4/g -gjMJtVpͫi -&dnI5VnJtS/#g5FsFAUʅEuEE'Kv)ZO-ZKJS*cR$j4:O# ^PpzW8zaz';9ǁܬdjS)Uu*N򏻠B*6P#G6iO *N{'hx{oȒ.hʔnG:5NčF:6Ò|ޥuy}BީRi[U![r%ˆ+h\)^w#ȥ86N;_2^PwVCXueTWNZ6?*66 Gi%HY$/S\4VИ)u}U/n ڰiFLJGGܨ…dfJ&dܓBh@ >#^^(wV':ӊ}FkthFytnoҦ+|>;բ<էfJԭ')NGRvsնElztrR;$qr4w /PUI:*r*+*`୭գhEZ:xkxY\x-@uS356JSr[4:דiU5w);}L{JSup 6Ax&wN3QLS.9],yn/Wy\vhu V:+Sz)]e.jXQT -QY{)zlV4Kjf$t00*VdfZ^rս,V+K3VQ8/x7'QOkܛq0MqN%%x9#QthioMs:+8/M;]no(FB1߁xS5D6S0IAf9@)b0!1?F %v?vP[yYZ@a*dIH*B*BvjGfvjGfvjCDStVOԭMh?MX}U7*(/^`j j;#F#^zG´ -&b}6*U?e:.>!Z -vM+Wwo<:>1Vۃ -pE-GBaB|qӽ[0R!}7K;VT݊w?P)T+D68qѸ(H<f³zNN&yꬎcCj-R,mA/( -|h4 -DX8(qFZ\+8 G]KIr2LWsWsNj)yOr{'99qJ۸ &HrROC:)b5# 妗}? -1WP|~*gfJ(46M!8 -R5+3R4kߊ5WM oEh}yyF;Q -MW}2R-wJTS)iKySm(̠gzNWv54Y)Bvh -nblB5Jm!UDžti'/}wHO:D۷C YsBSZ8-GΈnh𮞴Wi4vT 8d ~eh530AVp/R5̫Knb-ǙS0t%ZQS_@*#UjA~W#z]㒥p}BϚ/h֋q -gD'Lx' E{!/eS^;uP(i~adhVAcoSnl"~%B2Qa^JJ~T=06@gbwIy'Tm:j`WrT9=H(HSܞtu;i_?2J'8RJ)E<{/k{'IR8:m)+EV{IS75# Q* -YX;5tV9)<[SSŸ =Nؤ=RZ[uoM)H씎R=97n-WӞ1Kֈ9ʏCܨNeA@4@ޡe(ZbaM%@2PBq7;JS7fjUZj.KoVn㊘ኵ>Js8)$NZvJ}tnU^; -5M8l - -G}PӴ5QWzW J/FEC-ꚧT5Exhtv Bjd[nRh7w6m* CMb@EORG2G4y(Iz8!"5F1p4ݮSM9[t}RuF&xtlX*~~[u~cMP?9MDFע٢Cx^Z]){1Vug -PDSd̐fH xyo<݊ẅYug??f\{6G-4K#mS%™xcA`hݩ}l߫ڡ)GVkUYؘu<2U< m<-8ׄM^[>dN.CzeIP涪vfmC3S.9+F*ij&THKAݔߤ5)\blr#G5Ej9+INrRݠqi2N'F˭mFPWjMNJ+/*x~fIVz7"5QPnIiTzʞ'3opWU1VorQ[ovE[*vh>1`uZx{w򦒿_F5hҧ%1up6gyi*%iy#Sʴ-]@TJO{]K ¾U-՘V4lLs -:(jakGfJPG<0̧B:Q88rс.^֋O'@2N0P =?A%XrW<Hq\K/9jx 1(]ih4[,9 -Q'ɉJrR%&=<VWmU&kA޺^9)kCLԩj*{Y̩|f sPEp۵wC[cObp[yLQ%Uo]m;(w88Wzssb0Pe=T8h4ZN@u[xUmU)pV#2㴊`%)V6+;}eG n8\Q51Q7Wi=k1DG-[К xD>Ɂd7ޢ~gՍYPēи~f\ qF]Ab sgb26s-hg -J4QF&ںF>RڟXٹEjdcnvTnj%v;rhw ;:F)]Gd((xSHVÕe6HVfSvZ*Fj|qUlQ1F?rR*s'l[0<NTl:?;sMz#wj.k+,'3@E ;(ُD(u<~MJTݓ>T)PT֩(iurMĨiF)Se)KЩӱ<;?*yN{5FM8qܙ"o)S]YmQGj7 +&(1Na"` -YIVz)#~e$\:o:ңݕvOJ#0ɫo㥯u7}tVWqpN -i( -l=ף2Rf3cl׹U+,yd htX'P -hw8陌y Ίʵʵ -sqOk. -ChӑSqn4Nۧe -;QO>w|\{Wv -օY}UTnew=teبB")Z -ԭEZդ5hV*BSt];Np;ԇ%)X2}P[8pպ,(F䣹'O5)8SvO'fFU+y+tV}*JJ#)ΊAX+9c M6XInH{/TEwCmV -hSE,Ԭ=4Y1Z V8mU%0y*GL}ѽ4vlA;*Se]&ެ~ J0ԊW"4Su1E+ڤKS~xQ<5ۊہڍN:7Jo -V{: kPiѶ{'dʃ{[KFimfMzcTnLLNP~PwL}M68Ph8B9 Z _i +Cywy!q^Ӂ aÏoTjx9nRHnc#_!Ǫ5穦*E!R9QQZs3Nfhyy+TuFEo)HrRʈm5 R(S3533Xf+++)֋o/~ךrQ˒d)j cA(MϚ3 w"S.>OĬ]ݱXrP%ciESeoN}z9.(4iM\g2ChJ,aiƵط|w~p%B wPw] 1nĕ#P*lh4^>_ŵ^>4{J~*h_õ +=N[*B`?Mvnڙ OJ(iƉupJ_ŷR:\ Z4UٿnVhWniсRt{Q[$A?1+5QO&Y:X>pDgDoQJj S #Bs]-袕HV7ҞV'g -]Q SnN#ڽP|\<4P5p>%FGEU6E\8>0AJCsbt)UieZGTO&uM pNMN`r9<Հk -F\T=Qo]}/n ªTݔܞicNFܕ:5A.ItK?)RcJ|JG}%N?J.J/N RIZ3duH\OIe$@AEf% L4E*{Tڢ夀w@Fk:={9i[*x5ko T+O;m4KZeBΥ@xpox .8~ h&i潦j:kN4fTg?^Ы'XYK#cz8~uVcՙއO;'͚kʌM,CJVh -AM? -w hq@QhO*/z'Ҝ@Ě)z'A8({G -\RVxr~.iMeAB<3xesy[^jYuSMRm(aV|9!oꨞЧ9,Яml&?0(Zc>rrlY+%pB|ɯ&,B̔, - 1YpToBc@쭧 2[-dh=TT/z@Vw7yoDǿ -~f4؂yhޥLzԣ#utܔM1S ׺8 Cn5R]o+jj]6:}2q wN_K4ڥ)'`=k%܅*m%I^[G5FG'K@Bu}݋mtLWپFudAo-B㴣yOk)@y ?\@*6JX>^䬿@=S<5T:]>7X;Պ{)qCvNǚ=(,]^m> Mz9wPޔFB!h5 -+_AuܚJvj(F&(xDno:Nճ8z)~=uO V;HL󪷏LռA+wͥ9&&q Nx}AZ2wXޤ =HT rW'Tic*7Njw( nۂycy{†;T!CVK=QkVH0mATEy 88SF{B*KixQ:+):ԕF {*UBixRv]SMWު}qSr -;irh],Rܜ窒xBʨ=5Q;0?PVw$~oK3JHCuti_'C WgUVh;?hB6%2O̧Ǣu)EEu8)B+HV*'tP7YBXڬ91U -yE.XbTNեYIQPdwunPQ:cS^k~*̓)UԨy`QКdkz9h8)5B)ݐVSzi82:]ϙ+YktVZLxV VzT(եnLӠѡYơYOȬq*f.HAibܡ+;2Vvd ѱYC0(oBj5iځ̠飼QWjӍ&{@P@۽ iSޞ90B'DqyԷ ॼzSCiV%7lW9ZK6SPdfzI5VHd$8;1]T)jTOrs);‰([&y;w(犅dj|RݕЦT7'ZVqoeQ3 `|g4e~R uA2ށ3Ua=ՈVNYR]Q{ǀ*}UChS sRzhyjI TOct) n -b_ qN;rVުfLI{٢M@h/ -Z7 2Mz+Tc}m^.tSlVDPT)\ynqܬOV+VԬ垺=ٰqS mHMnkxUʉA"QrX -K¿b1 {ohe-NZ(98:Za䢐c}8DFJI;)$iEpଲNn*8Px oѰL1ޛ"2BHiqj^5MciJJgcSjSdha* :1VCSYu9آe(C_Gu265hnjʴyt8j֭VHUVOQH:ww e[/]TRԧ 1p;SKkhÇk8ָz{Jot0nJ&dnHm[|l[ m[xy(zT=ʇL+.)ЯbA; bfT]m)[jpV׫[V?MEZ|զlӜZS^) 1x)p{N [n5L-'hrQ3$dVD#Njv'U+G 6ۭliFsՎufx#ftՑ׹QX]U}H_N6-ǘ_c+8+ѰmVxx֊[Q A -'Щ^葆PHhp7q曮7F 0ᤰB8{&ޚakvg(qvT]LQF4eWfi?ZJU/` -Rzf$*W?iRcS(ƻv:@Ocg:wJ56qQ{`GOJ lN>-L-5۝Z[}OE ݂`wuWAp -VDE(dYߩD6%쓣 -q~i!Z{+QZdZޭuW+ErQW8¶:{QR?:Rv)NzךF hx++"ǧ!u*UV'wPQ/(ҪvPm]}*'U}tY?edod¸w 2uTQ -otP$NeEOSU -zcczbT ႲMiPtWr`R/ -mQ^SMX/ -$S=AFSݳS=>y}jnS{iCzTTEKUk"s ;iLRv*^CyM;Op~پ!FOõ'=Q0^9PO:w f~RTsF\O4F>{MFܓEDFiR0zp>u'f -V- ꭁ<9|Vj}]&r((Yx)0):B)>*TF&Dy!WpGKO4Ǧ9CBEwvDz=Uմ>t<@*nT׉?)e, -s*W?MRVRJ{H3*gQE<6izEiFչsM91:[鶧b$U Ќ=v+f(y9'JLO|nu.4j{r.Y)\p$;UTn4Ӽ da}UesҊAN"A .Hڣs Rw%j8(Û`WMӽm:B'S.' SުxéM{YRis=9P gs`=^]-#/E_w8֏ [ժC :_y)VzUY^gm;ty -;(u -8 G"x)iN~!ܢ;).zUZJ~@OnnV{-w5@Un'+cVV:HS -haV=cܨҊOZ;+GdtETݔ%1 - 7FA=<{SޯH@-GCN_ <, -dnJdКF<ʉC -qR(@ -+[+k[xlQ#ҭ.g V+SFoSL<+{Q/7;i41Smপ4Ll@j@nIGʱ?E+TW\w 'N1Ӫ_jrN:6[AR:U|4D'V Hx(ZSz}I(|xF6]ܫyr>)}WBimAsOxp- ;)vhi~) +9VcADA)jܫINSܞ)DC3 Y{M([/kUhТT ;j:?Rut}ژ[2f`HL՗VC b)3N_]4u -z;T{L- qѹ6jRnITR5+T&1er̠ -Zoe{&+yDz#O'sVEjr"pB(BimMkS5T1AHrݥrFݛo+4Qʌ9;|4uwT-A TLrTCFixicT^z:oG@Q?}1SGrʴuO-,D(Zʞdt>x (n -˧Y*SY8c Jn𢎉F uC&|;sJm}PԢM,ukM-Ac 5ؿԭ=ʵw)Kt*PtFKyF==UjEZQRV!R_mq!HiSԫWr]ʵw*xyڜ_xh V_@צ>o8ܣQ Q(wiIFs*3Qk`ڢ5T,P144p.LgdeNVbqt 1kLފpjin# 椌dge34lS](ђ}Fu -;U6M:S8̍J;h|*wen 1dy<{IxSHoVwV+\t4Wh_UIB8y,2 -S % -WIqB22OJܧMSkAXXG <.Q7-]Vz͠i犲v*YIVqw-,!Yf?*7fih(q; -6mS fP)SG533O.ao*O)ׇ\ -xڧP))MFb 4mO>\E5 64U>Z}j~>Ryvͺ8TOQ=G"DׂtpEDqpD+hާUZ5l:ACIDi1ѽLDqS~!Oz.+T}ʄb~Mncu;3Squ榐嶚MLÉD -!M5YVzl6&FӶ[Puy&k@OvJST݊R)eh< 𴻐P -/C/0No\t4B[QRvK>,<<5{ܤ)&vNԱPhvQȣ>qt:NqE Ee~ -y fP'ѿ*AH;)E2F;Nᾪ@l!ON5)57)ZU3hy+Zsvia@^M 1F!& -M,E?eZVƜTG29@h)DN -74pO(za3 QiXJTݔݓjx-A*sM9珀hMdܓBhCK!1)#o*ºdhTfI-d,@̔ @̔ @T*.6Ͳډ8oE+ S#9($<8X=T,6yƃJZS7NBx0?$x]JPRQLxkapFJ,<.Wwnq^.>AqFZ^ZXЦ@ߡ-)^h7CEӖzމ)41wӕScTzrDŽ :A^SSSuU -q*xVS)G"43 ¥ky)m)"U4S4 V.-Z/8QBbh>BκU5‰Ft==W@Lw*A'ThOTBt -@.P4 i" -` `[M*vjv4nhj գ'f(\1x֚P3-,7j1L"58ךB݂;n"GSLN#@7j֌+) uEnGUM= tŇ?z 5y7 4~CR8+VOz{Squ SLݔZn\O]-\^ЧfQ_9*W+sS3533FZ(>p;+2+3R5+3R74tjV)=0LiTƎ`Y{'Vڜk :8B{:VVn;ż -N21։J4hw y4lMcc1H4tG1J{ QQL4H1cBKIoi;ѻ؜GEpWo5;1p•X&鹒cP˒c+(:=+<+4+,Uo$s ?V?ԬC]ͮw*@0ҜiJ4-mpZ, -}֦hvUshNmxMOISLқm9,]ک#oŠvO:kXpݩ{(]#k)J o|śW GȩS{7bM'QVߪpc URWM#jQ}㆜]cqsUX9 Vx=ɔpFF'y#J[SHե ƪQ/7p'%)Jr)HoIwN( pORJ;&4pѼQ.P/spp#Pjcw}(tQ -';<1ǚhn 9 u*ffnjVfzK(& AeuTDTBE_]AxP:%1Y%m;l)V3XY+n/*f 7 8z!AS9QY{f>ϊ"κD TGS)nԬ\7<Udt IRx<ꫮ@wx)D -+3Onh7iDz謕o[5SK\բlբlԲLjj*3yÂ|#ñDܔy]LiDƏD{i0-G$۽SfjFO 2⪞imFҟ6j2wd4=<;FᚻSS40f(LQ1mM \aq^B&D/T% !*6i:EJ2Oatcb' 8GU|h*dWДo6\PŚ uu 9茺[Zqw rP$U/rG=6eZʴ 4T&)J.7'HRnR©Gג{ԎRJ#MujMot(H١Wet7O)ݔ9SHa#9Zj -VƨD<1Q3$\N4S34Tͪ'Ti[{5LlrQ7%2Q7$S"w[SÿH(%1=Sk^:]D)\ - }NS53z}7QAXA}W_|.\UES#F C\x.SK6+.RamH/WyRGD~*jF)ٳsZKULqmuW*߽6.hpwP}](NeV*U;tÂkǢ5AhW5R4i>iqc c(u5[4 -4F<</o2 -FejoU(;uPDzB[x>z nDuŗ$zM? T2y:6' -zu `uB̕ӪZB֪f UdmѩuTПJ"pVb{K=+D4oLjD;+)VG+1*;qU~!邛5 GCS'5S5J;]?Ȯ&z <VW`x,R -!FƷ_qռQ=FtNBM(%ΟY fu$@=4zu0nID{qu)&fJӆ -dh=4fJdfJCJɌo4$YnJ&Ykw`Nr&ڂ)h;B4D]'[m4PQ^'+)DWXF0ߪ Wzx'w}Gp x{7=m N@*QwPW]`&iZdb￰` -{p~mrKWU@A{W}Bݮx>ImJ聯PoODkEZ*ӞgC@AJ`₎    &&h)nb{#ՌgT(cF(}]1 - -R+@Ncqb -)b>()v#Ko=ݔ6=qMi *aêaaNm&Kةf=By'uww([Aw7Zt`uNy9cwat`rSHhhu18D5cƘ޺JnJ?>9jo"ݨeFPPA(NAA -?y7QT eSp 5(6Bp=74Zfjբ<բcQDR5S,{>*VG姄XMcy^RtꙊDUL/e!#5PnIRJԯpR;4~jWTLL3S?53S?53S;5+R5+LS?53L1R3S?53JԥJ+R5+R5+R;5#Ovi?*W~jg~jw)e7`JHGdy(U;zjdR*GfJqR53RN5(Voԡpݒzٚ!QZm'[3 -f9if=TʴԂ*f#PSpLV4fjf;'8 ?B3Q1&$Rv -R*gvjW~jWvjGfvjGfvjGfvjGf~jW~jW~jWrJT^I' -JH3$dI1(ءjfFj9ܘǦA=_9HrR*^Kة{3TS3533S3533SǚJԍ>_ACLLϩLMة{k&=DsP~Q1+!1AQa 0q@P`?!Hs:-2Q򑞫}FvLa-To;k-f~20~4='Ѡ߬}sp]dH6ӊ hM95SvnFueuG Iqy'"-a<.a8 -ԂS|ӈ19F\9Uc 1Kpb8\hhpa28 9i_\k`Jd|<pC.@Ax, Bn\ <'G'Mf,\ ^SLtG[-܀Sτ'{' ΓXV!b /|CB{y5%G`fnFc>x_)\4*)Af !#C9W^8*|өa8N\|| 133P' |5#2-0B℉ӂCG8 Nj\c:um7؄Mb% h9x6Gd{O&M?\\489'P/ pe⁤| 8? Lj x^9Fbpp c8vb*5/_Q ;# q|?.KXx#!>R>_p<ӂ:@%ߖx'<8G"q%gffnGEXRTRU"e `q([K,溭ְ1_ W~( O8H.e!q.BŸ!˴g^ppۖ0XmT#rǗ!qgq\TS[58sӆ eA,a8\%~3pQEpsoh:x׋80]%ՂcHN_ xL`BR)|㋑Nʳ b#i#, D5#.!๳( B2VE:ʃ%nfpP(/_@E.oʛ?L.J>"6=h}|"<2}F &nD`uӽ81$ -Th>-WBqK<ƕ'% bȃ7S })D6qeJ +]g=ׁ4?p?'g~r$0U(H>sHEQ88=WHP"<>z/T#1djrL|%fT^l̚~cȳ KX8h8Փ# S!&T4|a-`x!\'%r9tE3R[ʑF}>t W,tF#f$sL}Or3JJՔ#!s$7#ߓ|&H>O^F`e0-x҄l41Toȭm&8PIEWcP*eBP 3>$L\*WXUhk ,ÓU(դoeŐ!ʥ~::IpӇh闖c2t48X2u`A<1A5 B#8I4rhHe8 -Q2:@%N"uVk`MσJqD!IR $Behfl&|fQP3D[Ltms -3aB`օ xy -Q"EA8k\//^&p -t +`kA ?'`҂.RuV f#!3+&|' `X9@re&"Jb$CH2y1p:+P1r B-Yi'|.!|~$pUAQ{*zm'`2ʣK\4s¸P)HVJ +B?L%zdy߼ C~xOpPCx{3F EЁ7 Ei^ *յ -tLAl -a [d (%N< *:B-`IVR2$Fw9XڈtHw/hQ=r= F" h!oXk N$ -%<J9q}&|L'AoZA%+b Z5lԫHua MPEAQȴ$zЄ6PJgM ߄A&e~`A ߳G]}H.d'@ -SD -d ө?ʠ 60,=qI.~N2_:|y $'D8'(EH@Yo4B )~d錘eHm_/ 9,O| -@ane:Rkxr9?_)̗+8G>8O!$f:U"6͋MFa6C -DEv~$ĒD8g&22G,:X~0prPKC~e\>]p"|hڙ&r|18"PqD)ⷍ,k=`@CTe  U53CTaD#.%q((oIerC~FQM(GJ 995q -E[ƄT+|eY>5|kk4Uh!¼4x>}\t.r;-|C*cj}3*uQb?FJ3B/0)B* q9*?Eԃ](SJ~Dӿn- A cFd7oܕX6~Wja|Ƹ$;Y dCL ͂"#BHsD2vpiD؞#bhEb#=62T0Kd&G.9 %Lrq3udK&@k&z #  PN1v<&`0VzIP/#Nurs@],2(KLxd,t+Kƛ7eKeK* 6P71QWd&tS M$B8`Xٌ3y!),@su)_+BUz^w!a_r}>zY-A`tϪH+>E-Bx-ra9tdx~J`?L(qkԉ${BޜKȷoA'ɓЊϒ  -|/oKƱꕖSQUPKY?3>;M|@(qmc&;*, &Sw Jl0iX3#uUFWMAl g2gZ{Cw@ѣU38ʤ*)@ -ʧ"wV&KB[!8O -TZH?l9b ɷTnxVZhFpCỳ#C()ø<^b#{f$g[" R`Td -/pA׀%]wU%)Lկ^2 JB'.r M D)(). -}zHxQGQ@􊶀4P9!BGtAFCXHUCժ6x⠚#m2'5.hcFF -fHAwM- -lTn3n'| \Rk? |5E TaSK f@>FVf\Ou չ)7K d0b5Q,]Il‘X=]DGXo}GH"b(v9٬Kq(4R'J/=fe3*EeJ%8S A0Jxg',?SgN9A( B)HU flH_!BvZ"s5Br43f!O|35zϑ~Tuq>0$q_!C|Kzq<lp,8$?~;BAD&e@K C"0 wc4`A0":'2L`BUW4!euK_ I %fFE:: -b^w=-A3@a)i7]Xw۬x:t*! +.k:G -jzumvsbn |e`͎M)l|A$C;F)[@QyRa/ zj(񫶊 72qǂ= -/ӟU2CBGu-IO=a^KP4BÐJE`ݔK0hJ"U?r'gpd+ -@ 8Nx*W<Ū`R;\T:aU*~!UOND+s>_p\EzA!Tج6TJx"1%At4ج h*Axbᠤ3Id -ACs[^.`)M& Hk-oX^qa^dDrELFgˎnc343^׍}bР. -^eD0Ti YƤ 6. -"ˑ]y6p.0 %{*@mGqpb*z9RX*GT0OΰM -s\OCĻ24,mi.GH{&{hu<寊0$'Á|}L]H^.,? ~ <<Ɖ] VJ3C[>>/8wd#i>?"&^CLoe0UlrW3 `.GS!`Lpp@ˆ(L,nX\P\Թh<.6AiZk `c8hN)D >׳BZ9paBv9v*. ,DJ"-7lV%4ц(@7xg&xWP&#@&r3,ݏ/j=*hy(T"&iOƈ¬IC8J/gLTe$?4\ALH6!% -Q 1ٟ_"Jџ,JQdQ>MG֛Q"Oփgi12 ^ja1%RTXVSK ,1[`9F& -qS ֪<τޠ[ ٵ0Ax>oyoYME C -r |@4RcYmyshEw@r )̥1'`;6C<$Cj^]@Kr;$IU*J Xzp.g/_PZ<[;2 yf/cRUQa>{qzxN9I.CaC|cnD*2830RE {f G6Љ ")[ N܀~HwJi)j/đ Fŕ=f [< Ѓ[BD"ᡅGhzEplpD*tt*h])|C(NAq)PpC Rakϣ0jX QAk*y!:% nP??>AS|{q-[c*2y%># k$AUSW C7E6H~Qb97 -Dp<9c>B3 H]c>qN}@ႵJ|c tYNi_xR߬ E0 &0R:cTcv8҈Ka3f>&`#<;P"tΨy"@0[ {!KkyP,cC\vw)ND$H+O7n t011} Rj$4&6fGIJG)ञCB7 $s0+.υ+P_UacB@DKV#sQ4@<s}P"a@@&ZBnA0cZoIabx.ب ϢXZ2b-Bcxv\A j45ZO 8|vy)opAʀ -#T0y39  V& Cⱨ"n%z ϒ,\gLRDEo ʸ̘ ç^*ZPKJеCr7k[ߍ,/ mī9pR_0N -ro-Q:Mi Ty*cR'OQ&Y/5)5iZ+3*zF/[Ҏz>/|j&W 2KQ}Pn#1>{Of0Ud&w %ˑkxAB A - <4 npY{vr9a\)KMi%1# PD1LsXqEKl5T !@Z@hO^R>0%w”8pCB :h@U噌 Fr*(+?!{ШyiGkCӇwaKY<ACm -)BP*MYV$Cy2 6D  '\7i,Axz\Bdz%E{ZA`X'ą=:@%B%,!N28EtN@J28 3s=! pXFQ" ({'BBX017ꈱLRZS! Ec*qB= !o: G1)0k1EpcXL6ѱPH}&23kx/B!,>QCX -כ[hW=f T;[3(e.ܓ2??U\K>Idn2`@cpf 30K9РDfXU*_3j :v,*o --eY`oʦpܡ@ @EK_̂` Xt6A c {YAZu`/ -=iټ(FdĘZE7'ao0χڛ w0c$1yRЃ(mB% "f7l0=[d@Z;CP+hЉFǬ,tF@ z!B vQWN7q &At4@5Vp¸ scaqa"%5%A:CZ0zCSNĢkBb9WO9= |t\#\?FNˠ31Wp#xM:@DavFx,=pP+T޵P'+[dΪg3-Ql<(@K0cdY2{|w rZ d!`9]Si!QG,W!6!lA:GΦG r:B`pZsox3x3!26f rUث'H( =YG;P!d0a1Hod:yY|A24x/h[4y1QKetTp*K&|(tZ/!V!L,SV{zϔ=S~ܑ1`c,/p)^"u76R!؀1 ʖo9?!b=d%Dq\~\k(+rIHWxn@ye  - 1^:q5YHJ9p{$@Ph?reZ -2-2@ȋR Lm0v"y~B%bZ$`UL!x8gXr^1Adg2IBn/1* ׃3QB]x9r|Ox#,2Mپ&o&6y6"2~) LBR €9\Ch[7׹vvhI_ 4iqU Bg>K# G |Ip4~<WAZC{K'G#J }O"`!pЙTZȁSj͙q =b>oI" -Ht<`ȍI+2[@0¢Η8`RMTwj<)j&`Vn` =D=JHIul!TCT؟[@!00B*<7c -2(y IxǏTQr;_)[|A mJZ<.CGZr( 3%\)ɇ)_b|B_q&AE"a01NBSNfSBGUqiw( :k)$e PRAM^R֣q4! \ȩ`h :dd$u3CLB* .@gX@]!qʆ):CJ]ԳHn1t78 ^ 2,;iX/,In*吙LŪ?'~D&yeeҋ5B=.$[}O}ϒ~=D%~4Jhm%=󿱃Ƿ[ p D9DU!zNxplylp fv'A)|ZWCW1$bFW]ԅ7Kq I9׀~xN4)% p&{KErˤFQ CMA]Uh ?hAmm1.C̹CiG:<@M z#cQ68a*)g/?cЍ;(uoBΈ-)H-PAǰ2EIԿ~a ohAIqpx+xB$p>yߐy o< > IXD2"̬8{&À>ǒD$A&UWD܊44:QW9%<+&;Pd']Ÿ<ߠ0j?JJ^ƨ?WVB4݄Y@( a.lD!R^c f)N5O8p1GE+9.a?xL{q.PgxF/.e6[0! '?W~ QA:{C\c }.I~'z1Z `v0/.!Bg0V%}nܷ(5lԯH7Ww~(dIfH*N=Mu󢵃mvG*zDhU [3冋hhYb*NWs$T(  <sB.e;Y)ŹGsGC*ci@">h;`4]aNx6G($h`rʹD95{>>>(yo /jX=s -2l <KgZ=gg@Go+9;C)=Bx|BN b!p#KRhCw':V4C0CWhO$YTՀKR a9lqHޠBFMr@([86o,A8 xTG8 -.pUg/A~:2UP#qyS -}$$]C6aC$'Åf).Bqx\(N)i@pTJ? I*"&f(V:5Kt\ 3znrސt̓p\ FI қ@Ym7 ՉrTBY<72v pF,J>08p @# - ReӒIKQ U&3=!mi O %RZ1X\'YDW&S8^7G0QuR*)[RVk+XЃfC )6L3blb߈uf;3:vu1FC[sx :{0 >đɼyP+gw dhJ V3SqcL]N?1"G_7N232\n#2ܕQ!hЕDt_L+\T[s.2GNyO'hs=懍 o>3O}wg>!$Na' }C("(|T1faB6Ew@Rȧ4X.et  7XD# z^0^z+%K?yNy yQYaٌ/hڏ`T9:_Ŋ . -]M.A! Kb8, uBTC \mNP8Ёn '%zi~H%.;D4x s Bz>Kՙ/z?^B0$= c,xk6M;2q0A#h$l|c0[B g֡OQ=Qt +0`m;%򀃭! @E6A6D,&[6h@ 8+{S* rb1OhY6_=& y(˟>}3Q>4J+8XA=biR0= -{s`0FfMDJ(xn+M, w Z}ib= E-~Z1b95B< `ưKnqњXnKq!-IFFvƥ+R 5g"va :i/ ,6&M\aXrAjkqrDΪVB(ڰƠ~ -*FH -T 39BHlt,9F0hW -̩n~P2cpBZTH>,>lR[}qiw9|+Z7^\iTv -=ώ="A O'ϡ@T+mz+(90 Mh _iD?E%PE57؉q7@tm}IQA=c\xzǣ*7=>M3T0:@bY:')8bcÀE)d`N~IƊj,PGbJP 9$K0!;.tAAx -g5% g^~QtT3:+ #; epgB\=,|ub!˼ȼ߅ D,i.2 '%ۂԇ#| ݫEH8 ()}oY7!AՃ 0 @E.9~zd=#\Ou31_ F.<,'+4n˓ZzOSX - g<9BdaaK! Oi?ɛ >XنTh/oE>Z=↘?j_ *[}% -ӂbhE5E -;X S ث AE ?)@(vkfbPv, 憰`ִCw HQ vGr'9fg9NY!{O=>{6TGC3LW'SMFlcxfX |@|ʗ]8  F -u!lXo'|{ d+@c`R]g؈? r!cPp/7˄-ć` \ -o%_Eԧ rb^'1 2s8i%؞HO YX1ƞ/rҞQyϷUc?v{r_ԔQa.\k_Ds?PzL/6FA&'_笣:y]:`r?H m.+kΛB_"8|xA!,ܦ5kƼ %3" @ 0e6@h2I1)I( A`a+=C(eɊ<:%aq00 j xͲx%e&,+- -qHK8WP~5ӛr^RD?(blhey 5Pp=icledyQF: !tIy;XO,F Qtg$̒lab=D8^FxJ=%6@)PAL]H:$sdobphܛo`?=CĖ 3{#FRs,n5)C/$+jWC'xN':o.ATiB pиx'C#-bC-M2>O)>ȟ<zwBBeopNHy32l*yXBo13 #7=3?cmBLYp:Q)MȠa/e C(8v 딴t䇃 Flp9EdT&IͨHJ9'4"8VYo_!Z>HtXD2D 8r{J -HyM5bH4\CfQCp(Uy%CdY@@35"]TYNQ9C a6"*m~4 Hw$y od.D@2;B0M~P!PC ԩUPH;_nio#s.eQT膡ӗX]96Cx Y5RK8G՝1JC\ - ! "_17#ahHN<O j)`!@-8Lzf8o |d*8WiHIAɔ X,a'PTf:C:^Y?ϭUԇq-Ci (nC/aM黆C3b8"}7vo'hGhgG#1n\JDx3ϰuu>]хx29VaK?H4?<0 . nצ@q@Cvs(9'a"h(*T0U[I#5R%8oQL5E D' -r1;ϽG|(*2Jj(_Ł݁(Rw2C6ܓ#R;)zs& tc+es)#[~77/Cq<\D* ;Gb JyJ:|s'@`t> $!' D)a ! -[l6Sk710&(>w|τf@%)/7BуۀDw-ySae# C'D1T*gRWa>Atf ?L"HZ5!Ӓ3$lH)69rH`Đ$CWxp -r)㇚aA\̎h aF,p -bQE `2D%+ZNl-33(aiB"}G(I -ЀH.4ƾBB#G8[P`g; `n8]hIJ0o<Meq#b!0dY>>| -+FX. gYμ+ cD?:m -TC[Kn G1ȗq)\1O -|iǯ"y?bΟDnsA8# zi^$;m:K/A0 _q_NKxDh^7n[x> v ng*,:$I4'Ty3.BYsuB$>7WJ" y80` ؘG` `0VX8+g, -z?IE7n0*[Okk 49Pta|)2f*!!"*Foxi6o Up1"\c ꁉb؄.H!-=PdKnz )dd}YhtPB$9+t<nnfbx(fWH -aLr̽TE RI~c(0Ӕ"p4,a{ (K&epn2aHByF8"{D4 Ϡ/U J@jF2(O!_}'|oy^Do1IB߸{8(Ġ闄qBl#)WE! h>A0A%ҍ"EaH rO:0DڹъQ]LdY n8*u ( k Ĭ/Xs-:AFzpWCz)jv046WaJg˥@Afػ,a J.W xK^6q -G2/~K<  @:ϟES`Q #'l.t+U @!; דRq|`!O X>S#eR+uxHL}'DH1"'D(PAv) )(^:p|9x !'BQ7x>$]=FQA00QIr2EI"_ Re0JG,6Rֿ=Xx0Z(wb_U3ƐwDQW 3nPrLu!jC>\@u?0W&Cf҇GG_ zM`ޣF<$"/I齠 `$fWR58{P@/+Umbez3EjjbBOfii)ߤAn޻-% NJ| 揑#}x;b[r{#`Cbkx h'J.BX'Pb<@ck@r ּN1 17l# -:zW P&P%BXey}|rw9ȪQ 6|4=AB֎&P/G}[}JAO `L/⋈%dx~B>..G%Y!>mx`]74.$F>o|̣JԎ3gϟ?>h5j?|a>H,B t@-EqK9fwcCVѨW!1!d0;G{J_?9XSHB,o8W |wT?% 6#,OĵdY _1Ze/יP^.(9GDj((1ϼ{}rF+8@]rrVՊg!6W89K؉T u/,cnWxQPC 8zqܾ$YگtO1) YP,߂u-C*zCgv3@ƢGE#BN53ӊhɃ V!R.ۂ.GG>>{M߃}3}3}3}͉oDHz2leE%@Ap9 @GT2܎b^(wA\Y^Se5H|yZ+TвԏxѴ&1.G`5r4R{#BYc;O H:}&Kiy ;eV7RMa 4$QQ7\\BG1J -p8["~SƷ(8,]wnfou17H" X? p5 88^q+LW䬇-ϊns{O{{{xggg`%~ӍU.t$ #x:ra{"UW\ʹ0 #w[:|_? 6!Ff+@\T.  -Q2(/E#s8ahD"Gf%.*tRf. -Ɍdr2},3ÜGX ̵jp&RlƫO4+ -G--QZ/בpxˈ3 ZbY}};`y >>>0{3RgrrO=5o0Uq?0 􃽝M:I -0q7O=wx-ڟA9/;'_A.Pq?r'`":>1O/耮FO8p_+|SWp %`"|ɾ13S%Ô~f@E9gccф>GWEx3FT/$,&ځ7AN: Eeߎ`[d ve ;0}8A=pKXg>}#}H0(QsHCSĩoNݙ%,H"(G Ed\ta4I!Bd>>3I=Lɂ9] 6}LxAf+b#*ž yaw*` +8c.8s7oF%  f`EmFx B `Li0|l -CwŦ ~x00$>,(g/m] b@bʯiMF17GF 'qTX/ 0iC -aaG3чs L W_A#UPL&g/oR:ՠ$e}CL*M0RRt\t%`G AK_< 5Ct@#F:` -~;%8wVZ 3/!_ JT% `/}p>ۛds!^0OODxx%9>V%=!a>(SN=FsiS7_W!2*|q>?VyAy `vqux -Q,@&C6##Fc&P &p|2S@/2sӤS~b<1dz5A0o6J\\k)ӌr^#-@ x)8T0S|O ~FWXxF}O,D ѻܧݧ&qZ&\C3-ɱ%|ͥ# HDU]'䍂x-+#*IF`'>C0:e0C?dXEY_ܪ_ e0^&2~0; C1R4g 3ߒwAc&7EmCx@76ԿB] !PfV`.L;C@x/aiJN$)# m9<;863>)P#̠m5.qW8P2MVmHGHCy}aS>ARM( T=`tH<&Nr#1 }Q -ϖ/gpK020;mj(Ya"fX tvot~LQ8+ 'Ujve;A]CA@gyqT{O=hm, DŽ `rpz4@հQOD=8lWp$O |> A`XR:%#HDоq&xMj111< -i\`J&aRwC)fs<:j^ zS&tSo+J^2مm$378y`1vDvxO~4H;u )Q{JĝS ~X:qr@{N2N5 9"S<b-Y x hh.F`,gJ12v,2D+]eռ00PaX*+&s_ +X*bKQ|7`xKpN[{"@)ib7(`?-kc 1HHWA`R(t 5 8Ϛ}kCٙvM"9~P}ӟx1]I@/.@Q>XI` #P`˘ DBxX/8 ]S=O|q}_T/\6ŸQW2 F]L{3[U{lƋB20Hs0BP& eC͌; -V&PVp>DC C*:*yT`DS*|TH@w dBJ~C ΉR?1bl:}C#" o(V9~hLBHh$GȋV4Y8 8-kX b8?_r r ro i2d"BP.   3xJ@gswS㛿O+Hu+*+tX?XH@ {P9h2o @ cSy(xFB쬻ʁ h븵1={4e쇯Xe.,4x@@ -h` .L \W;jPRS=@, W: A@aAS"a5a@aNo~s._'HN֕C*q>HnwFdC!qHt4 \0􁖞:`^|)ʲ::T]laB3h`"'l! ^09jp(K -)}07a׍r%e,'F'0сe P{r wUiAc1'V_#>b‘~z\` .Mp=2U؀yHU&0Od!>>>>>޽u\uHw;:;KDuJ} z|f!`HHL ԣ>~ɣذEBPJT^<¾.7&>7A2n=L|IU&:{xuQ/J%ax` VE*E= Q[S5қa D~S!َQ%Z,)^a%$R,>PιJ~WAL*>34,p0O>ex 1(j0 ڒH@c]Y g!\ -#Q7 aI]0;;Gj)^P7m$OXhB+1>! $Tz5W&%^p|U0`* 4r; .S+ 2،\<5 ,*l1p. C`2J O' F))ϋ2g|o3oOO?>?|_d(ߌAB"j€(@Ktk嵞-`Hb[¥(=~"!Kb!9+aP ȁqh? (*139T֌Yh ϗ3Y*wz!ҨkDI̘!NAgxγrn$ܼE3vo s#*Ǟ.<]! -Gg >4V4RedrpY A#H$pw[@ՂcJT~1BƘ\:,*Do})xYҼg@XP^x8'h( 6XGMa9q 6V܇h512Gf2eA1#tyCXm(E҅Ke`y`9;@{@uS p Tq8%1G $HL|\<(D'Oo>}ȀkMܷKy-ԷKu L8@--n"e .YM/j}+(zO mQyCl`YtB}2dfDe0sBF&0C/MP!t(4C4 %#tcfXB  pÌ? q6=U 6,,ÏJGMt"Q6x(cSDRF -*Ue9Tea#0ԙTxxsw( - -hqsF5tWc3Iw)ꃛ֮ \kz(xGAS!-`űԳ>_ c R̊:PyqExI3;$oPϲ5["2'eeοUV=awcs8`s1"Ɂ7_eB)z<'@Q i !F Pڴ& zH%4QOL7PTs7~K1$&O3>LeZ Cu|p_0j[Xb̌16Xo -J߶$zBʡdO D|դ -uo[hAױL+Yzt\H50˚g0FPq~A (θe~tr`7f4O&60}(˾Pai (W)Qf R9Pߗ0lCiH7rh)B(f*# 6v:e,+1Hٓ^`Sh\ W9]`5TBQFѲYB˂NPh~ Pj|ET 5|j|A5JG%uRA" D'V[r^EB@w| F[- 2W\* d ~]5!F 2G\+]= F\M>0Ό| -jHR$YdL -9%1`7 qzH\ٕP=cJ'yQ-/~zs(ax5fIuy&O%α(cC!:{,xkِkJ PWa1 2 '{JB\GAaʮNg;!V"Cno]a88d5J%骅͛GDeG CPeO>>> -v7iAvPAtB"! tgO?|Zyky>E7\lߐ3O ni*9@H|$6` 3ToI񀋮z+3 0p n^9W2zƴT|Rl~[Kv4a!݁Jy彧#ݘ/Jʹv9^-!؂^x k ->p9A*Jd[F'n0\1B {` CSS0b(IT - e:C8H) z ^` (mOOOOʪTԣ}K tF6GQxh?^920Վ%CUZUꝔ`k`/ZAC) -&:46] {;GB?ajK8`PQ|>#yi"*[@ ں䔬 $sG_]aW{Me>(gAMЋ{*L`2 %MxS?f@$اx ?@rF=!?>%J_ֲ(w.Pߊ }xxv0Z#MGenX,@M3J}Ua-D@1C 88xHvӐfjBcG>U'jŠg }FQzeS ) 4T?hof -la -_~K ׋잙8D!fΪKHB}&}F}, jB9`D 3O''@.&U֑ 8u@pVQ? I`nYc >TН D\{G"@&\J>#] Vݏ6U\fZKNA-u&ҽнGL4i\NQ-f krG0ECS ?ꡂҴ/H4E2 c^PF DَBv蒲gA8?Di(73"hC'F!C5m(؆+PĆ+ -*Lؗ- N4֟3GZn^Eo3{ʀKP` 94䊐kYOv*~!h9[?ԄܛA%FA[mE8HphaXT{ȎRۼl^X]ܒA*@\#Kf10(A}>`sՓBD_C7)eހ܈-3a?3ۀ!+ Xr -yq+Ԁw@0n:rCK]0L2 hdu'e72)^R}m5+q:X^Sh6̲,GR׀(d/ ,;K -{| ;p*#d̦; Pj9Hy, N4CVx,59 *ŨDX50SD" H1 Vj{3 q!SM m7;BB4`dmRlFR!(x {bk y4TV> {%QPnϼT$>x-UhPD jܓ `<ՕrQU>#0Djtx}}Wh [}6퀽%Hϟ8a2 Ta_LxD-[8i(÷+[ɛFWW׬{RYn$0J¦'a j e A ?Oy}IC@!y+/`? Rću+c -/Ź7 sbe&@.%Ұë=<U  -$gƵP`e\0p<>B{D&h ?r;"'it x%a)A2 --w|f6xaX| 0{~>xrEC>0O=oT*e gVV -' \x*>bi"ibAGǘxh8K($ǥang&%q>`}vU>bȠS] ,:Q /^\C*P@R3/ܑC/ܜwB & ДHRLl-R`_V -%!85EڄA.@"ZuH -̰dGU8w(^E(PR0M8z5%5\-Ȥπ}sQM|W+M#ΰpFf#iQ^1IN\<^hTMF$G 7+V0iHF!#p nFs#VinGTBdI+@^X&}2L)Vr -.ޣtQBXyc(rEҦUG#٬?&\ (z^[Fq -JjǁN9t@E\Xj(b dvDtY,\( @H@݈%<ܣ'r8D|̸#XK "yhI,I cn^]nPM8H#o?`}ݟi}p}irEzJEbgZX- {30{+9 _7BEWA,AhÉ:rh-T(;ƕς :1uZ"~­obEC``AJCP\t~OMHruxE;aO\ O% - 5|)gCGrKU9ܩ>_!kBe)->)OCKp3M@9:@ 68V5ϰOE@ĕ<-W,/Rg!B-1$h0D5TL%[t/H9f~F9}d%QkSfmHA(@KA:K"|# zaEQ.06Gt71ZM%jRaZGJUGA9y+ 1g׍_/lf nmiVRDmO: P\?nwCӗ0;L!qv4d qgxT+Ԅ*{AFG%E54޵0ϡ80s#Q5D d# H<"xd edˆzŀF5D@ ji6St!3q:JAf:@jr -^VZuAX )K,JRӮ'Ct[Ӥ||i)2rn@D8~!b(CF C %p@gt -1Av.*t8rcY]9P;-Dueӛ7>"|6>>9/h0! pouT<6Q-M%ա$.Xgg/bx[ΰb9)c)ۛ Ar]cO{M\}'CiK2?bzO߇2^`C - )B"r?;V;0&M> 200LC#|!> (  - -B7gsH\ t4p4m!!s㖀{JC0j{ ?՞-,I:& BRt]R0Qb_! %c&PR{PpMB~J:Q%518/Y&谛-z@4a{/agF \%eHoT#ho)'J`L7 #,7$" v&p YfpϙPpʷW*W0‡G"A5C=.2$E6 3B)Da3@Tejʫ6Ѫ^5q|NNFs#lCL -;[xL"ΰl#ߘ *g : ^SUF C8z$aY'G@a5$ a0\91%mgMwzKff9 oRΓ=O}>wkj SA` lV,PQ@Dw߸Dp j:Ee˥?+ - \-^9a q^W0lx݄xL`q#p Dv#mxM 9>79GdO>o,OХ`׌^nP;1\DD\sDȚfpτӴh2\EV5EF|dUhF5Hx$旋/'>Dȯ3 _1.h8zټEF/*5Ck>>lL_͘_C&4ydDG k!/| :OkƵ7nmͣ b[/|s2#7dƄhu4h^'6*lR|B`(q`&PVZuD` ,>-N;-`IL:,A#NʡR -kN2;C(QvFjV#I -xUu適>( @Q$tK/9FC ΈV]P3oU-ķR8N("@FN>Fܛua3ɲ-N|:Y-+zxO}.w±`}3U5E o,^060p2JF>ְtOU8HV%]&`[ӭ'ӽ>(v@lh%. %A=HA0P35wC,pQE2 -FU Hg]@%D`MJ*ԑ+R!(ڀ_^D@dK;s0qbx~ CpBIaD |c0c8:&x F0邊=( X;`n}Xu1w@̓7 DdpMX 4Нv3w!xt@HH@I%^WOP<#h%YdlO %Vguy.wfXߡг @eSJ LPGH_hIlF#HG,lF6&FH(SYv @IE%ʅ8(sRŢBKW›4V^ҩUBij]!7T l_6w9Lc"`Q6kQfN~px>`v"}G|&M *WH ˪@EK\]8r;a0S,ý~~c+1rB"=^ - -zFd>_+J9F2``B[I/{V8Rlγr63‚!RU}`"27[t~2WaX>H{lHIWI{@4?XpFwIx.p^'"-Pws #u:EA$u;V$,Z0'q+S]N?1K|j0ts{F~S=]-; CI)!.RbzE ZxmB8&iDD_+'󣀆`M b U9ò]f 1$89E2nΕU*ʣebQUVn'vrĽ3kq$P Ue&C4J l0V⢋P@T\M9#LtQ}C}@7*D>[>({OOOOd6q-1CHA|`Xuh3\g XiH7Q\6?iuB -o] *@CΘ(j^/JxbP@;nuk+87%gd; Ys29ƳV}nuPdAt:PKH9 G` AQO7rYNF`+ ʟD)E]W8$B(Q\N#? Xh{7ri4}p$= A&K{H0 ntAz@cAGn"iIvg^] ~l>0(ɋ! TNK F4%>D@^ $9Pw8iOA# }N (=%9JTNR L%_ c a$YuxkKs8`[?4q6CnCjaM iC*h4;Mߐ|huC@sϋއǶ) -f:LPGq]W9%2^6E!NE`x"n4;݇s;x€auOϫϩ@} v<2 A*m^cE)$돇i :3p8=\{@ajK -x>y`;$T p?Boi r$6*/B܂:!n=`[W# Ly(ϬWqt-aL P BX+;uGAyhNTC;E*Ux@`plx* -# XCzqi ݄=x ʪ0Y|OHe 4!07>Ahn(&O_ cf:H|A8k*nj_h;`8(#7(5!:Hw ՂB0pD| X`ʕht1uE@(˟ґ~q/rT.y\2Sn?Mh |@j!6P<8 -p9Mn) ` `y*.EMBYP1=`mQj9?xYY -$b*u*YHNCz_B<P{ p0JC\ Pq"h%:p\MiA4 't;lR0Df`JR˿p< ` e 8# D0#wOH!(P80cU_|a>tb/20mB.VXWS2\Np$" -XW7LODH<.eBmEn{<#MULebW]~8IIJI^~)zǶ0=Ji_HtF!8Us{A_%{,hZ -9>^>-؇x%Oz P*rXDPuNR JmTC!"蕡HRCeD܈# -Ru -/\ $nUfd8~v?B~%8FȨ@pn3TSe1{d l #>DX -Sp^u”*5%`Ñ/8k˖8s噖]Q.,u(VggҠ(t:o3 }}lIa3*O ή71AKai@K)Gb,9FHge2ꄜr[C:>R0NСTrܞF*+1eaFZ@_9GwR_Ġΰu?m)U!N@QO|t^\ Y-]Ph!Oxza%Ǹс ٢ A3 0]rW!G|{!u?W5~N.ګ| *JU6f "On I "gs5Sed *r=x>^,(4&д@P?q! \xHRaO({"ӣ-rҷ\+ %&}['h<''\Mʩ)c0T2Pp%I^Rl܃f H/@R \ucmX.@(iOZDž#d%r%9gl5-fO%:XL_]8pu`6~"l y&Z|LF8%3'%4A o¼ =ȚO7?~8:~7fPYŸh1N͘XgM'G|π`zXYT;'}LĻLK q@Z4ژYZ O缻. PI  -Ae2(g f3yReJ% {ԄyQ#dI(l\: Qʟf}}0+T 5p0>!1~t̓(^U0mI=SEL%o):fH|>y[4A-aH\>y2Uddb3 (# Ef^ p9Tm8;PX*e% #2""!IQ0@V+O^Qֆ"j߳69`C@@ ha%C /-g(& ZЏ5vѳ{+}^.V.d=([GT8,:C!^G1j'!%w ]즪#BebRW *g3扑G yAF~yp.p; -e -&Ͳ__}\a٢C SP?pu< cTG(@{ϔ:8/ čÓb7m -X@PYxO>Y\Or*T(MCW^}EPI Qy-R !.ӊ~ -7_j}^𦫩ِ0a6M3T4tFR01@ -?>yˇ]meGZEȦ#: -߲Wy0[=jҀs  2pKGJ( @rPU*o1ww zE  -;b .5yXs\- E*2q@hDs7haP] bj{# w. *i5V>@SPED^ˤф 08i-N#@/^QӂOPrD:zmQ! i tϕD5?Cu3UT)H, A Nꏜ;/)I`[r `x<_9T9)@u'9n o,xƄrV؂xJ9@?b3"|a>O(On=' ,]5! -J(m+N-(BTpC^Н[Q -I]b{/Խd,Wp:X?Ay@ 7_Am ևWŤzy-lBGɪ+Tf L&uq,n&TI?nPª&E< n0>ID`5X/0k0IW|ɯڌ"Sz~i FՉu?@"d 0TU!>\.0I6@~wY4?6\)E H\pEu_- @2T*!i_ DB pkOߌ%kو8O!}R7M,g&<#(oCl$.c X0&I 2,{C3 yƀDK XB--28FCK(l A80F!r --.YC -67A5P 2W"ePz˒2?ALRB;H%="YV^H*":u(P<|:LaCM h)su3 sDw+u50gZ(UrzJaROE)!_ΓK>4SBW @wL^i|(&2FP"b_,B`>3JuyEJKP \ :A,Hs -n ʆԄjF[Q -<GIBًf j A$myr0r_( \9E`0g*$O=7,1QOȟHKOQ@?'^QY gf%[̷.> _/.e*+"t엍"L3O5 ڤ>`RTmZeVpD r!%*ai7j3c*%r m;̀0H%+B4Sc$TOLެ+Xn],9<%61sq#䒠/ 9k(аcӮt 8-jnBQFC6=&(zCRX"% (DZj`t`{;A"o" + \&j\!TPa$-@Pl`o -~@ (3|R&5B -ނm;2Z N$z_QPgf3(֓0P:\(CTG1YQר\fLI  )`g6 ru7@ -_2⁈ -"0Ԇ(^)QXwI -Y8|ު L DCu0 i HFq`Q=c<"O#-?2Ԉ,8BEym --*gT-hsӨ I4W S= XS,^ -}p*+Z_0\{R0+8&Zt+ 2"^c/D.n#*9Ch]wlyIQh`܂ biɂ3"2+%0P'"Өg7|A{WHy -.JD$7kIF^ɈA`״Qؤ15xΏ YؕV$JS0gpZHXp{%4SdIXXKhVd=ZDu"ڪhI _ Ca>RAj7Y.!y٠'!_ -%.H@fl;êeRaԊ w%P\yiC^  B Qeg = Be*Wb$sXG)XzhQPJ&CBE•t(ڢdJmO8wH Nŕ -4 `ԑQY.F!O/ Lv9˸_Aģ/[rW ?U"dJKe bc L2y7 x6H7 -kϥ]EK>|A>($ 2?P&9~+c*?p[X7Izahfgf[d/z1QG_+J|BxѶ_DYâVrm[υLXxP@j0`d1rCPꚕa#M6`L.2⩨' ~D&}`] \YRHuC(\&Ļe0pWd%t(a m!<r`p=d$% PfP(O/x w7xx{ax\C+qز -!*8Y;xeZ0F=cp37Ny@x -]ʙU\ "l$C_U!3 c.*p+K$;@m%iC 7b CdC~+P膢plҹnөxhp2s-*be{S* ae2\Li#ӂ}_+t|wƴH $6:xBY'"-Vn2PkYnW4c5_p &Ii`K 鏚_Y1SlAߢ^P% D(Q5],p  h¬hg)*]E8EXSj oC،wxԴO,lpI MlTwyS֬U@CQ 0oLUNW5@}/Shpan.Ƙ%1p q\Lsѵ@wy@ IX6|LmaFȌƪ~=g۰f>> QwT `y5k:gCԏ+J|"^\>^ރ&@ԑ2EF4* o-0tDNE<289H4ӁJpq;Cp)N CB39xP&".^T.<)P&r8FR ` ؠpFl't8庪! s`Ix=#*Pj?I/>TUOKOxlWÁwzK8Z>0K0}o? mB Ue[>nZC![PuBMfiުj9`D9ol&p@{45ăQXFBW` `ҿ|>H>Ѕ K%CMdj !O셩0 !YHWLF+e;g ArT 1## -b -0o`=4;60fP&( j+C%%x  TT_f]䠁isdK'Sp%]%81"(#!U*n#&d2@D@s#JN?cـ@tbFb0fo @PXER9,=Lw\KAg -N2 >W.- DnM& ` ZXb0< -Jҽ pqiƸ>k&',io yhiᛒ: 7>|av U8Zy +ɦy|bjaMA7s[GW6b$盤"ӫ+dpCx\~?=`mT oH >H1 EQpIAC>>:M-,%ܰc({~(ɀO,ʂaWM{  -;ipa+Px -}&L`0 -1 B EJ454#. c7 L@_PpSRf^oxѨǂ*o bGj,ѬNDjx!X&#d=l1>ȅf G#CgÙ{}N._*;*(ю@(7G&F@@03xH.vǢB0?Va#zGQ< ѿsE[⁑`(䐶`΀R2MMF9Mڝ \eYljK$epEC(ˤSxP !hN"rh[ݽ=fڲG9/`[u0EXS<1VHz# ؅q2Ґ"u4!:$9]k*ʡPUQ [Xm3@#<AQT6,QS,)P "(:'HSXa'cVTB$ỖA!wAΐ`ݩSefw.p0.axArKh&@.5MQ WR> S&$79[>%'R@7zCJLA&= hh(&V /G@D2BJDW|Ƚn]YU薤bFg'|>)^TtAD}ntApgD&p`0##ƫ*'84p+޷bm9!ZYh5‰X:&!ڜW'E 4 PELp;^uDްAx-G(LH6 %SospleY˜dMAY¸<, d~$&CP>F,=p "^3\GU .#8L -(P yܦ>uqebtO6 `[fQFMvW Dg'*%)P3>81K0%avNE*c!I@'(SϨ7|>8uZX/0z@ L]!R@2v-] >@}@ !جW%sEIWJO  ]Yt|x?ĕ*lhGIXh.rhyR:3%Á( -KN` ް8hg -u{|a|<7`~A,@ifusM(f lr`qb&Lh>V*EX}&Xʆ rW^1p+ Op҅!f!_{՚pGhB6JUoPOCP[/]ajTyEu(:M+T,(Ѓ7'ҚN1?IJ{gUaP'zTe>leH\8Rb+hM$=>,KAEcB`樁M |Rצ Ô *}*}BM𰖴!C$(X`6!TBC ؟ ^-B xh81H4C 2+'|ĉ~@Ai5LQ^/hxT?Z~/h0V[ӫyyLleSƴ=(T.  E7cX8#l¨tnCff,_rls6COt&!g=p[#MKw= oo'l'Fn|Jd yUkg4 +\2U䠺Jo((RrR, ;2myC{H@M2xqVqx#M/=rH?r*'<{:&5Mqb-%NL:?yz|-ܾw5fHe=3"pi}hAcBc[1ʡC8W/GƖDH'@`AQHk:76YbZSg - -HLԓG˂)T -(&Q YM!-֌!bVM11"P,@..f%w5urf8LPQH|^pbZ e=?(E u qW@ Z$ ؤ JSu#KHaB!3~e>=ςf\-G=1#}X%&#ȃiH`\s5> ro!g;|$JIT×3!M ''(VnJ,O)F J\UH o3CfMhH-`}UXa4 -S#Gf pN,XCvEMYA:X"Xh L ԖbN,"46t)OiSRJ]a0"00!%H%/()ʖ*5&.dOGQ.H4W*U1ZAu XQ:([Y"x'Rh:yg&i 5%% 0reS'>_mz@}*mLSτD4廔M"|PdfHI[i 3)x!IZ!JƚCѦ%,MRCxAF.gO¯@;CF ID" ^ߩe(,KЈ Ic+Z([7x vH0l's 8wu6s3O#>>>4ːN/ˢ Ynk0~ Hm09%ߗۢs"$=(4F4ZjvF4@2tc(qp̜e *^ -Ƣa.[KfA`(":I4<0#!Zܨt3#iF).Ax8m /^ͩ`G;`U,+ WĜ<$ 0dDLADgxA. t%K{L2=EW<ШѥW 5>5[$!S 6Q  -U k޻4j+XTOP`XT!{0BZhuBPyo< @6‚CE!!衂0'ܽ"ٖ'>(o(7iYT*",y jΙ)zhU"uMMhEULs'>hT9`RSFWIAݟ#: C"`" -.N&˂>TοKo=0WCt`(I5Y%~Kwi'C0~rB d{ )~ 1\bp"WI@fQY"lP]"dQkW )jb&i 0hX+7SO >m=J+1 U#C;]e$OINW`Ŕl'brX([Ĵsה!E;x->X[?"X8ąt3yiM-~ T@bY5)t ^< jW(ؒACr`hv8rHDb>*vAI1_aw UO| -&DFpHx%8^'灄B Ac>`509"ua2>Դ/bduP a:2oL{tܱSS"|i`Blߜ ph@5 -t RR%Q$`?hA.ʔ p { e>~҆ El%ࡌ D|~WZ/2,miSX0dp<"4a(iG@Kl{J@[xUկ7<5X ̨HhF)D3uO3)rnF9qɃ>Qg.# --mFVmiZEGF -= D0?'m|P-OSQhP0W -U)5`B9 !@$ zmtiBGPw%% MW r?ry@ JIJ40Lka\)A?)B#)H/(K6H\>ԢT(3 0I0\m?gL~КוֺOh ,*E!v5;Ž&/3_Z7yG^0amn6*fcS̴8`΅ -"51|2=':AѾCs)ؕn}!Xul{I2 #3T.Po0r #@6$ yF5Z tH 2nde[)䛏 <7w@2f -<-f1QԱ  [Cܝ 5ʁz##HɅN - l~z"Y;8}JR.ɧJ&g-4p0"sB+2>`"ETBې(fO5`> -^ȉJ==6%-1}Q,t8FMH4z}H`lcAO"F`fMHVxs1jy#H-3:&?S.: i}. *fgIS6kv_2㖄5\"6'P6%Ov#3Qenagk~ #C 5 . W}G(0=}BRL5CiMg V'eFz[24{Óσ6z?L $$AChtpP`TwC+A^g p%4΄$;!VWUPؔoɄQ B8.X2ͩYLw0\RY -VnqBܲR)d#Xv ܝgB)^yٮ" -p CժE{XyMCr] $\hz߅ ?- J3=~U+x)]m{(% B 86a]72at`yDP6\yrJqK1&b{5X -"e4@jKƉiN }B4p5ڼ*|-YfY`;b%jȫdpU+ Ā+#5eК2naff"у\նiS@heOJ>ӺsU8"q F!tz}-.[@s@KlXuVZTpe LXZ#Ԅ@LvG qg1yg8Wi -$GY8ftDNmo!$z1CaR,Wx TPhjxxӰ?5PM `C,<~\HY RVACPC#xP) OX%Fcx6iKJ`IlHVV WingCP %HGR#31-P$R lnPOqT73 7h &A,nC?f`Aevȿ%w۰C_Ik Daқ'8 m#Q4SG QHC 8Hdq3􉌮ԃ17r Mp#F .9[X|ޑ.[`[{RZxit^=` -~3:]T"+~^@+UCl |("|(>?кXiD3 -_/-Κ:!np0 rV"c 5?Q-#gS`Dc+Tqa}S9HLpaE!vULjj<^׮V['J#(k;\0W6CPAASPԈ!4v8kTM@OA+<V:8#AZ(54G?DsDD,XJrh\& ႽaLCQbCM838d @ 2$@LRh@yEI^ך0 - -y$ҕ|ZTgהv̳i<6vTõ#,4Ń8/G99Mix <|p?s1 @R]<"ZݿL_h83Ѹ|9#hV:ݘ -Hl'pP<I!hJ&%齣 -OT†Hz P#nGAO" A<;|PAxx ֣&vgxBt0tr `.Zfm -ÏT\d(hAotX"Q -`m`vQ|="4-4^gM8(-2zP+Tթw A@(JFQ5ߔ!֭ 299"LM\S,0Iv,O"7L\6U -)bl3AaY`x% uD(F%*Qͅ@( -/P򗄗:>>-!(fP0 re(@1TA%qT=AS'%DA8w2P=i*+Cq:_dAz B @mNۡ9Dbm -1T֠L7q+;-T¸aU:W=rsoQ0ߋ; ;q&CMq XaQE`h\ۦ%VvI| -yP Wzug)m@@Qˉ`4TmA8D4B - Z20l - ]:AEcZtCaܡ tWFஸn%0 )U+[J_ x>ރ3@6h](A::2SBxsh(XgfE,K'ډc -zJM ah 6 -D;/ugTrr<;13$;(dZI$!a oHD˘rSSϧy2<#2p,Z P .aV39u l hE+pmcQ1.j$3@(Y$olA G\>1^"ʫuqDTu'giqwaûRN@({\l@8YKHB^As -nXR`5h؄1'ABgy`;CꅙFLIB-`#aFYm^ - rd?1Li - -נpA JD -:zB?0ԿhE=6xɀjZ E&Xz0 - 0uK $P|#eLGC -X$u H`l1$ Ѷy8B`" - I\_T2=FcX8)+ʐWFBp -a6F `_QiRʔ)A1nD!DWl U|'%p UA{طÞ@D1@H\3z)@$cI}rpV[J"fn510 ŋ,|ߌ)RA̅B@f|YIg1M=Ob&9؃=A_ys$Bs0hPs{?cRt̩^ --{MO7 5τ3),ljz :O1C̃.\1Ps/8ï P!Alg@mb>ZFU|Tq=DF萎6 wpp;r~/ ĥ HY$7+uQIx\@i ~@׎2"4(b:,器uߗTIEnum6aZ!2X6Q.'BL -L[LL$(] +Tρn1kpf }X/hu?P`Зр`ab& -8(rCtaM ]%E{JC/L50 -Gk7 O8وGxiX&tk_H NHLMe78܌Q=+H}U(:eWS ZDN"=(d%F BL xIϴO_4D( -Si Si"ȼ!=@AKTNpa)IxwcQaGUtxWF\`(ZY{d pz.7G & DQ,*3MZ2ns^'t -]HNHk*`~-ؤP" -( t @ I٧4bd.VFaj -Q'ڈtT2#݂*2xT/h+}> -̗0lψX=J5 -C -*_6 l=t %+H.O~̿sF ~w#)WJiBȿXilcgޕş8E$Zna@0l0QrPw=h}MEN -  (d%uw.oɱEC=9/xG{ {raeg-%"|f7M@'OX.ri & 0Rތ*[yK%I^|)Q㗐pg=P@! 2 -D@^,`5@?QYvTijȆDŽhta`xaS.Y$,41S$.HZԔ"P*R$sz!`< /hv+)bMܫL[3+kpvRĬ!l BY*exiRIJB -2axQt0-`XUCŅxk~[ƁƉDTsxx_Kʀ&Pia&BKy%Uh})qG#ͬ~S /KUL"eDzsx#lPN:^-vU Ss,VB@d:@pT}a*fflR>O5I ,.DYTBq f qds5KjB/T/!ޮ1GU*`G) o>_zN0%%AɃ;(Unc\C9@lBolC|B ʂU(w}oP7*ސ tE\M(g ,ʀO=7q -A p` 5%lM(G ts7zpoڍCΙ`,5 s 3guj-O){!'@hކ2^rs;{eIYTXy1BňNhVA a w"`m5Tuhi -C岻(&(H69tV! -{۸w)h0[d+CИ0(Βo \0n/+]RY- "y{SvBnp ђ&Sj=FX82eХ \ꃔ 3>JJ7 -XBM!bS|cX.o Dו f -F(R"E,+O -]`o" i2@XT|Kc`,u7h -^|.a 9/ -Y(?Ey`΅s`Z W @[ 0N8kB 316@j`bo.W. -nPe0` - -u5xܙR84ЊZP@OJWDEՙSQT= I"T*1Be_%yV܈P%eCˬʐReMr(GP.hP§8q@SVgc.T~Y!eXm.7)eHeND{.Ot>܏˔ -;?AWGG:YP[BD/80Z"Q Zh(mhtvWԃD -2˥ib8\ h"@OjzpATIR`(Ek,Vt8C -3`DcAZ"kIQQ\CDt8`Aΰ%oͿ|1>JJ\}nXx%"C)H3P3i - g*CKך^0H2Z([dJB )Y* -(oZ-(N(/wS7;*,G%=ńnDt0x/~HТ(W`%c πuPBcs 醅ڐA1*V6[JE^It{r&"3,~A~x -t@Gf^F^u%>a8+5E8J|?I44j0R- z̹ؠYeot " H1>'|g!j2E| -=VXi= ->=AB?g2VDn T3i$/A^=#Q:c|N0]& 0p<#@dŽxy4Ź~7"fN[:g("ٴ[`ʺ{8 8NоmE#@e_QX_]2l+e22\胯S:(ACx(P&#QHd52莓9FhQKb\«@0rX5֯-M1J~ȷ -wB*j3K1pRxC:a;qeֱޥ{{lGqg ș?:ωC` zQfX۠hif(2^%ԣRP( x|"8{L>0LI:[J$qR#iů U>?} 40 Qђg3$ˣG A!4>)r*)`-.|CYm;WzIR$E_O  {a% "*3ߏhl@A&EP>h@se|W `,5ӄy 7m^sÙ7/`l2f@ A8HHEoHlo=̇`)^I{R'С6K`0sr8MMwhM]p''0}7ĸ \WS}|iz(\.C^ @Eʧ%sFe@P<{O=+irb}8 !|#b6Q)% - P >|bQ 3p0psӆ&́QK 7uWUBk@RH@`H9FFtlCypJ #v0vEL*8Ҽ cpD5Qה -yOl=`iPe~,=~~,b:CNZ u R\"NG38 - *e ]@,N(G!0X?\cP _ @Lpf>;ѪKH]|GQ>x }Z/Sh%R -Uҳd+ `:#h}BGw~Q E?Y=Dw~Z[w;aoto#d$ ZBHQ(!@j=s !)h0q4 -|`UGV0 ->cwuҀ'x @)S?5<#8o! !pb` Ю뼪#gvPC0`vf32C0 jM!s.pM(t#XI5="כ -Fh8ZA`P 2S x@ROl  -K@ͥǬ&j|yD`2̕j?0֒Gƴ} M[6] :V..!D90k&.aE-Ifl ;J'^ѾAv=)Lkr-ÊŚ>3dZ 4MD =qsJZt!D2EF -oP@405MÕU] d( m(Zh7dF!PMq0P/ε')DO9=Һ2)dT) D,)h?]!iH.RHy70]i#+TS8 -97}v=LȓRƼπ :P=tQf)T#1SyR4˄/|CE; r!Є4#( ~YŌOγxpj`c3I`Cū(+T{V-$G -DŽ&B2Hä5+i)5.ru%2%.hUo(*m,'x]E)>uѲ(l[xϗy:ԟIZ҇S^6}ə"W8p" /*&FՖ HӯaO\&eQXC>N9Oh19(Ԯx%1vd`&W.BI`M#5ox2q(gA_;_kX'$0 "- -51]<_y^0v_xgqֈyMz&­$Q%n - {ϔ=0 SAM7VP5 Ǵ11# G QЁjxl{;y -`0)& -HQcDQRsX 񍯈ARI>0WSX WTjH)GQCE` M` E1CP8U…C} 0@LEb=a0> -1&LLq % Ahڄi퉠Q9@",OH `5P9釼q3TeS4`c~fWLƟ}@8Fa_>l Tw10 kx.{ϐ |`U>t~~V HW0 G?"|4-HTʉ9ۚjot_dl"i)%_^űLiN uYZ+nb(;$eEgY_,@z|· 7c;zG9M=14rMC^O6e&AǹQpYB4;X7q4u#9q䮸&_5ސ+){;uO{J+J&<i6p7Ή6Rr(4PdB>[` #p/>74Dfl#iZtEN#Eʼn $>ê0 ~atf2 5?F70B}bEU =ə !`%d3^ =]hzE{ gB;8i["|P it?ӍO>/|/t$. :s2w8%7+%D7iX oϰ> 4^#[!%Rx.U`8%by Q.;[6Aft_ʆJYC!w<> :7A,&#Z_DF)x߯3ۯnaR\ifGH~s;b5a? C5. -A"sY.dzSH @+) .X, ҐSr[[usl^7˥+evGԼ*%rpNA2 _i+1()8S - F_NU RRm%x!8Xn DVA 94z!~P @1rws_0s~^ ܗfL !v{ mzF>?y]jW\o)$XH'!?em@yEA }6>OX@φgՀ$aP:X* b rBah\%6X #C.X8пzCgliFC_I A&-x[ U -"S aBO g/]ܭ)g3@#+aXM`0F(w@-><1\me]y#.fh=D5JRɂR)%ZqJt끯gv¤|ZjN5"Ƿ5ZA8{MڝO5%Z η8?b-!> s~j)tY`Ao>HSQ\$I1#Tal~U\äN|0HBUD=v(1M@~_BpϠp~ @pzV)!Z8 R[ho(=qik $lʏsq?˖ɆlKARXc2 -T2Pr`Kb4wbTӳ - <:%=ari|䋇S {AD@ڎ헩aڍ - A1ʉAE絟y rO=]d${a=m:0jX,-Cp7xD}.VD]2<lhjAžАi2>2 @(m#Yo%7 -`sYCG0j N qEF.*Cj(@`(7&Mh" -oBАA>h<P9;~E}"C!qE* I6=MWhWHA5@֐XNS?zBOO>+|ݐ,;5٘d.#Q+"Ɍ8zѝfȼA_-zsUᅄ@x;&Wh/B &&@ĕ_؀ -63Iy71k me'/Ƕ -PTs*E/}E= '\jrLQ ߗƛ@O63Ha1 (2$o"G9@?`/6'ELU?N?  ˬ0iGR{ CIDT_EΊ)vi ^;ctH'P2"{$Jl-g 6d hMZ< +M҃Gťixᙄ `c2 -Ǭ|=bw(خPfxЅ&s>Ne[ByNCZT2XYkL )1K r@2¨A^YhIHK[ԩjb,O7,W&G 5kCXN8CTC9Bdi?nVZSTmTVriCe\uϦzڡaYS^j$@A_x -(ȨhcGz#:D؉,耶(ѧ5peAZ#)GheiWCq߂#b*I/E"d+(`A J;FOшX2 \L2<UqW05Md.dz?2߬$Rsʃ〲.nFUIFpԣʪ -$ dbyeˁx&(43Pd`+p٘YL^tV1pЫ -^LPV9BO3F=s°g!ˌP ̚@6U8^aBy}hk0H2\s"_=hϥ{ϫw;<%{Pbzs'ף򌲪%烕~&Rg'j1Ȫ~I_{)Q"XTnAx{ARu!H(@6`Fb3àwu,ZR9iX#ZԸh5 -w^[JsV+8Qd Q On5AC# `D9p>k=i5Ī/odvPj -{?Iw|CBg{-Á+4T*/x'yWnBĝBn"<6Ӽ8;"`m N_:peRO}1 kxSx36U@3lg| - F^P,Fcx (~,UssI*T\ ^El6ľX*âU'LCבPf"M{H&UAp'H - 锲#{`IrRz)f;C Mz"5;D 2wtx&]}0(=e-),B -Hs-`'LĜjZb;@<Bt7w>p' WD}*v;^:*;SBկoh3z[#aM*iJA6 tTinr}dkzt:ݹB3=bzZ-Q4t g"QQxNh  acȠ]|hgB+l5bEv 2k -&B}Oޕ$a+T}LQ\Oac xPPn/Pۂ` 5+m:cP٨ -<+q) .-k" -89x!~QZ9MjE)#ۋ;~cE `AX/? F;lL"=#ï/<i!^oS;zn=t$-()eM'KTVw$ Al\(ʁjU-T t!z(!(௣A0huM#VEk4 -Ad&Zsx?l@6"=dH~N()o - zkv{n:DĚ [Xg36/:83]@e l.UKt sP1B؅YED-JTyj2D`8Tc8 7X0Δ17@Ae7j'!Љ[ c|A)ԇR 6 V6Q*<1Ø#5=L3 .[Än7gL efX\  o~%B%B(po8ʠ |Q>HgpkZCQ"T7=7 EfӀ^L>qթa3-J_H8%cW*"lQ,@B> -Cc1RfEO!Kjha4΂;$et4b - 'F`/r`Ve )B͟:#tC8T$v0L¥˩^2j4\ֆ|Anߺ Q2 0T#+.&\:B5 9T ߅@'8$ 2ĄD G<\kGI]/ HrGc p{`(2KH}~Y<(x?\VA@T.ȃ" 2EpWa pj|>(Q|qPׂ<6^GEdx8TuB>\1W+"dX߄9Kc^!guP .a<0@ "T hERN)aPV1G -naB{42CウX<ȐZUP na I13.< Z+QFg8@ 3$ZRHs:R4 1y0KOۼb=aR X&S5: -zwBA7IJCFdfӢ03^{"0<]G!ϏA\Fz.ک*@\sd<%M7pha{XT" @&@\AqW9 dV`&d5]n&3}mCdsM~K{ޯO,AAbP:|d͊ℚ5/c&WJQ5dMLjMr†Y]@  -D5z>If.ހL@k}N\cfT2ӡLL^`M#)YLǗ{}iy!+)XnS{K7rra -jn '>cf#Q6,iJe7?hK`-p(Ю@<v -)/I0`A,03@0Pe;8Dd>OA}?c} 4m0I*o& -=cmB0@\;K "%z(PD(P&\(y2h2c"0kТVH DF1Aɠm!蝄 N⺎ ůc*~5BJ Zl60w9®5#Eꫩ8,6&e */hղ0{N8@8mdZ CzhyLͦyύa$f̚L{_; . ckh\TZY' 4.\&U-<*m} ڭ? O @ OX19p$] 1aQ *Pd2H8]Gxf9#Ch0!Hz42.Шc,S -ihIPUgêIp;*q,y[nS*'0bFf -PXI(o*[B X$Cd,̓*q2%e6UJSHgK&v qpl4( o+"6#g )b[qq">O GfA`};CȁD}1 :4|"PцlY$ - - W'6]K8\$lzBCA_4z) ϼ uyJګSFd8N2T_eL&Cip%b[Q*R'/oX3̡O>dDb=(IR; Yhfٳ -QK0\N\` bx+TX)l=yj} kh"*I"|gMFo+r}Z3d"·%ϴ-62$ }pNKha07^qACK\Zt $`)}z@ d`=*s̺JS.|G"_4Ba -\t-LC_lp ED Хј.BAH BYarp`8axADPbv s2Aʝ%5~.|`S4#b" =!g]  -ko q$xT@O3oY㌷/GPDFN!Q3@p+(RƖ&T{V$`vGl8 +M0$OŮ )T757@o>>>xмi|FΥ!X#Ӂ+(Nŀ%XI](>Szc{BzH9yCDT'|3nV%r, (P6I?B`ZV̩Y -͞ Y:XEŊA3'+w;CǴ=@%7`mTTٌ& &Ívv5hh,ü,܄dג$X0_OA'kj:2;pW>U5!bED2G`zR$6eJ֬y}\NB -?h[|Rn!>T TU -](|,۬feZ*)`C$ MQRl foiV;6B5$"NЪ(UEZg -7* L! r-j0gx#?/) @Zq ۞UYr+H~C]zV8hD*@sB 94CrKTK VN?PI`P1;A:Q O3@`K5\\, AKY؍K70,9\ @͆  Q a;ɀ1 d$j,`Nc ~ ]K('h <0䌼m. - Q0Ch:-jJ(gZC\F]Bb:ؠ w0 삁.*  Nj! ]L%4DX@ -mPb;Q̧I@ 4b-\蠉-@l 7aͧe;A@"@3sap "5ńZnʗt(Ro9yL/QƇ0 Љ -a(ݭν - BEFhcsȘAS~úfG\8ۈIGc4|ɚzYsƠ RDTI,Yh833xM=eVY &,aVxZH<ͭXoX< iK4 Ę&T%cbH[=Dd^L}=biʔ3Z& J)(̫`*o% .bF_f /Dž$Iz":Z Lq'ga5/  L?=c -5 [0\FC)e6evs2!6eE/|@ - -\HɣAzna' voE \[  . -0@ ]5ɲfQQlPPyn]a`C(u(ڱ1Ro HxC_5Z8t8TX2ՕY/>^ÌC}V?Ҥ$tE" a)CL\AЬ*kΩ>_Qzb`XNz7P rI֘A b+7 fTCˢWĜx%y0 AK.?IoP`)TWW= -~6>>L%AY 1.w b` %+hIpDQ@U=@_+!E[B\ d{W+R R)-9-t1:Aߨz~A -E?TMrFQư-:l=@ky(!6@GuBGLd[@)-Xt2L5! Xr 8f"eY&@'g|,Dir) v7mm2o0%8qMa}hikædc I|Nܱd)mMk,J{%*i$hZ8!1peu le D$2!8T ."+Q D: NM_[Ck~z]>)߀` ->!nTi.!>Qf_)]e= R[ׇNK@X0ǴosL~JaT^3J0De&H jn*mZ#L7%fL0&^:+ -Q "<MQ'VM+6p[(cR{N'@(p`4  i>?Ԯ (7O7R&C0^l2?\B%F/ zR!p%5`6(Nа$ΰH!)BA! 36W k[XW [L,aG~Q pb6B4I]!cӦ,3=,,J@ΞV&`v@h n>?d/:`E +RDI5vQbyOI@,OOXКkaCxqu+g)Rk\ WH`;#nϬ# #CbjJsC1FEcW!@\[hL) Y=eam`@6Cx0j\:tcMOD.{2*R)z;̄!}z"0aDF az_dq4wcQt 0a1D8#|!z#)*p Σ;h4^++?{X$U,T ܋YJyƄ_)/NQ#Y ڜqt6'lO_ܙ=5HCYvCE&b\fe4㪨>{Ox)$ &`$H]*t {CBBe,qNp Dt1 -UÇ8pB7/~>H?,F SQ@`0 !Ѐ0CIf@ OeQ\/򴖼$S4^m(˄ |%ͤu:ʷ I uX]5ga;_SzbXh`N&\XaϺ,/-} xz`q|"@ - pCyG#F_@Shze YRzG2O[PUϟBi^UTCee)V iȓQ4mN?BY7"K*/,O,V`{MȅI^PFLGBa1C7pR]8/SXIz^ d1M!uU^ &}Tn0+3^$-zbZ TH qvT 5>v3.` bA(4(ЄP5"+ !T= - g'C{ג#BEGUQP.%:&)4AB[/Xe[4ba86E2{@9Gd*8R,(sE(h*/®@ud^KU $ Wx ZPP>C|:m DHFP'XSL)Xfn - 7y3wf@t|EVna:JB1\;RK0QRP3AM ҄bF*URoLV4"L!A쫂&ԩS0ch51%rRYAYIILֻ4R]< '!8aVphUSw'8`Qb#_ Vdyb$ .j6JE"TX۔@wEL #p,ސ$7 F0d>c*.SIJl@GҠ{gjT!7M$24>scp*Pp 50>3`\R?C(ǁ ъT0Cώ}џx\jpƎA B!)G21hh cP^ GUj9T - =~#Bg>|>`4O"\.rAۀcLekhptTt< ( JĨ& -*@IepaA{ŠaԄ,cpw*eS#>3e1dIcuU 6ӷ)`dJ1hպEԒ+h -5nDq 9'+T@+? B0"  ̯VvkEF!B�Z@QtcāY -` WM~ -*\̋47#ip5*'''A=8õȆXôR1O_R87;gzAzf}0~s=^(Hy)LSV9|]gp}IIt^',~C)m:BPXdo/WPT"X#԰ +LR \N3|!wDŽIc X -!l9yZ1ZAys8yeL&feD6~t1O Pd# Lz HQ)=%BE#hA5Tt~z;Uw X"ZQ0 ԣ(&tb/djiAŬVeL' -X ^|uccA -h+T뙃$X$.zW f?f30c -)0+© fD$9{$aV{u o `chU*$VjRBsj"7cQ>i>(JV,**`I93{[:Q./xIn.23MXA8u*A1:+ywAWLۍ>8O\<@*!l9PoO;k IРS+)5͝FD0a*^Ox!K-" -Q8ӢjvcPIk-! ޲ =Iar/uHt`|wKkz4k L:%6 Y\`jQ?zx0d0WB%9w 7W_B8.vQۂ@w(#0Pٖ pnP&қ'UB&R>XnqD-`q$CM6f¸h98Bc!=7Ͳ 4+g31eϴ%cȜ7i}bnj) -ׄKsF!XD.Nl=Lh"j|B+#1V kp &|5$HEpNо.)tYژT*# xx .ЏxGS8qe@&L2/|_ ;+ |؃03xs wJ)^?.#hU8;LKXpC}fJ @k QBu҉ tPe %a`(,u;8нJT+l1mRZ01(LH m(pPE~uA*hR]LXG`XX 8P ~J 2ێ׻R`=HӉNtL@eE(PAxѧ ,h#&dG)+^3԰XJv=Bl*nėf6+05%xs(a"AP h<="o$9 suȰ%0F2Ci ŐbTui^5J85X m0q<#= z ̔NMHgҾ -%pn#*:v!.!O#QLX@2l:1čpI:V y.'U<m ࣟ><> QG%F lФ`M(x@`dS(?8rG=V Nh@";IϴCǴ"wCi\]5>A"g *Z .FF;W5)C֞4%G4)bmPͼ`KB\ 1?3ޣ $ h=vь!byk -#!=J.{3J -9*X)9_אVm#f< EHvBQOm_(K(|Vz)o1A9^+Tg2KF+5`Y P < D{ -`W ao3z`H7Ab - \I{KjP ;gh#AvO j\g g,HLP ":IA!& -RݔCglsޏDV_,yƄ"4P`wօ%WĦH,FXp=QF747ֽ`P]Rj:fI6?x4hU*BW(X%A4^`d'&%W-6H".ɡ&e/B1,A+ve" 暥?rK vi4URIU~0 (h0F@06d3V0uyF+U 3 6r;BI2殜CYP{LuN"a D#:Rg(A%M7}7w%Q -GT -"h;S}@ O0`VѦ6&,|}7Xf#\9I Q!Tuo /Yj@9*RfajZ@_kff+fmhK$Kilo?k(Y_/pY w $ײW[@` 8ίxBaXĝMh8UM9# r?`0ϱ7F`1-8GQ yT-I1NLXQ[CDh>ylȫxϔ" -| `(0c8D\I?% s r0%a@)MK Z!(Mh&VmI1ȂSndKa$>z̴yKF ~V3 603:rsD~b@8JxT 1Y*"t17@d@K! -d %S[BC|Btg]c(b#CuuSyY¦DϊSjlMuW#b^o0_eGWϦ*}1yߖl,V:=@?*~-LDOBW0RsF-yP)Q -| I"Pe PB7%t_0Z0Uj@ŀ -ư%WX胨< -U![FU?xcm#;9a%r&Xd& ,@;„ЇHGvSpNpl:c=t' i+rwꃛn!B}PT' bZ۟eaG31>}}}}}}}}}}}}}}}}> 1' -jG xX<@3Cs],5qkU HOBhCTz*-iMsb$g'_ )& B0Ű:z B{} ԗ#b$s0WD Ϻ@?s =쐖 ?}+v'ߠSP02 AN>R^%a'kO!)>>gggۥt)\gYnI"I$Ype733Xxk>xF'b_F?l)`tX~o|`?7GџgH?ʺh"5ۃ,I!ujdi(!mggC0X >:@4h>qw~1D:%Y4@Ѧ5j>Zyc**3 ?XUMDH%kG AGH5b Cճد?V{S0ϴ׿؟H'pmqqorz{gooyimymu~Bnx @r>>>>3>~miO'ǼQ>{[d^7c9_uOY\,$8?J6KQQ:3o :鼛ɼShQlOagЧMԈ8@L7f*!1AQaq 0@P?Av34Ucτ/S uwV8x,-S5O><'k|_~LΟs~,V-|#\.Ljg{ -ZZOUQ,ޠ-&rQEb+D%" WpOrFVRqD lʣ*6nŶf;{ *&H.9 Kn+ rո^#H\ -bP){*bf<IJKӂ3Gľ0 Sg/H>SQ@-"ԹeEpxkx7:T.Q]beDSr1-6M7U7eiu*e9wKi^cWR6X(&+LuH{s"Pk^d[#XxXkQG؛#P_!f=.!Y[cPG!ozq&`SڞI5m X e-o101QRj.U=i+Bw,VlU hf[u*-wpIML .UMIêw3\Tq@tQzjT(o2JGk=ˋPeؘe&մdŌ]K:qU*W -j) U J닍%h&&noLMpܪE\)·YV͔lS[˱OmaAQ?RގUd0%TW)|E'H_7ÖjWk˲E=r햌'RsPEVXS*XUOc7k/ |\r]@1s|AzqcR1)`,$q0#]GsXblRl˃m ^eK kmseJNvW|1 bf2zP -d2nBTFr9B8j/6K: Pʞ -R5+:dJ*"pq`%1AHdEl-0E6p=됲-cNmW i/*fu:K dŸb \ u.b$Nap4=#^w0#`\c+AıYLE~i 7)˫=j\%Qi|U"n.jZ4ܴj]TO\PY`:hHLܻ V1B&+ 2"3P"ϩA,E)EFH:%JL\]``0Oxj5/34Kơyҥ*4*Alۋ K;ff9[Ze˕RT3P! ԧÀSĮ;G Q - -JFާ̪௚!{UKԶl䡖Gdj[\- Ūj-w-fַS/3;qN3{u\YF_τd-\DHn<\3Q p(1q0/dS(ʸ<..C -*f5>W$cQfC)eF$1T1,c!%cž+ܸ+"$T bc1 5¸2b$F.pTPpAot2-C9'K\X5 ܵʳ Jp>#.TIU[t̑E1Ōlj|7hQl׾ qsX6P5l&q5Pljd8.6DbQ) Bjw P&B6S3/SB2&y7;{B,2MEIp8*V_Пq٧H*jKb\^.ø~~$.끃Y3>UB/8˨d8F7\_,pV9D`V]_ \K|qbj"T2xKǒ~7o؇hG709"rK,⸅C<Ɠ^رbʊe&eNԩ*h+R .qw*#SiǸIܺI|YYh~@ V EW^cMFcq[u/IJŚ\GPfRsSPҥ|<;tAqJW vAd\ʽB\5,YZ5M.%,:RZ1&ʍmD)C,`HUƈĘ"#|Xg<٣k-*)Fѩq'psP)CRUbA+9 WW GIVE2kF) /yK6YVԺcpF+,5%CV@|S83 Iv©L\Q9 U>qNa`+E;.,w~TCKTxhz> qhܾ7G~C0 ,x Ko/&cQ |beY\ő]-|.b(U=J:@<ɋ qpɗ.m,OΥJ1,Tn2DJ 2Xf`d|bu‚8-z 8.;8[eQc7\[djl#"C5AeXQ5W -u(5JAL95Uw0n(\KWhf%K&a,u.&Xe\VՆ!+Lrk}B͒bNb4\fRiru.oW4^j#R[eT|L -. Kc33>Jݘ1\j~% QcPܯq>`ύ̪|Jp}qF"f+2DUuS*8[0,F(*T-Q;K -_]'F3*oxu.et4pLD QpFXWryL54 ~ pk7/\NZ&!7fLƮX2'1+\f"L281Q%a.|T=İ"u Hˌxp#|i1X -jmjVk vgPᆥp2oYr/~Dn\%8 - /,̶,m^o%J@h7 *늈5YWQIa)'pR;33$%o -SKrarȱR,^TJbb8IkQbK.:%^#Ɨ#}J+5sD!_/B%_/:hE]θhxu CP qt 'r#Kp CԻ*LWwLȾnɑ1>wxX>-JjZ-%-*X) LԻ1rRn:Ĩ tl/#3r^Wi?UD0B@XL:vT̰Y[j4QPDB@QK#n)w/:ĩ`!CwFQ5 LC,(#rߙ@tQ1PV]#YSjfVW%̤Vpq\a;K*AXC:SgİX <`7Knpq43x23|u,W u U;KUi$rxb.,.\)"U<ኗAV\{l`Ը],TPy|cljRڨ~jWy5sR ̩W*Ts*)>咆:eL!*T1/&o˨Ԩ!IQ*0!3熙g,`nd*ܠ*le;|v\b61̹0|L$>x yԩ o] Lf xLE QMLߩ3(2p(5IPꥥETn*^fܨe8q. /9* zyArtKqVVJ4J=$E1WM$ĺ1PZ@DeDQjkQbRjUa2B/p*؅}eDQPCr0.^0$#h&TxB\A" z*5HU4J$b݌:d TЖQ,q0sa0pNȽraS0J8QTY>Q A[G:o\g)~#qspN:&yjθ,^z|ˎItT\bj5/p:Nxܾ1Q%DBa1*qx?\ x7edrWĮp< -<5$7k @UJKUDFcθnUKy7ŋq:b:5DBTIenF<LKoY7f !wqp4rTf縖MQ.0omJe\"BʖBeYJbqHeta{ n#::KB[c)̴O\\ԷV_-|Ge6,inTjxT}pnʬ1ܺH(AmG6Εp}]#>'bPr&+@CJQ({PT-t_0U ^j.#1UKc1(‘fnWݮ&Vg5._޵QAq-*#*sL9q".A0f@MyQ:]̿LьVʞ岛RK{GU5;@mI|MFɡT%lt" Nv#R YXS:O@,ex:ڰ_ HH_TCQ(s.ZI+h\ -B1s H<,YYxJ%Wxe\2/)=fUokui9i5 ]dc5+jJy38w;Pcr?Rܨ˗. Cp|1%$PԨB c1LM~.<%̃D e V[: 狲&- B>"!@J"W;>&APM .1 3 ?`Vb ܞu ]*xԼKqy˺Z>ɿ;cQX+RQ9O1.1Ѵ@?hʱJ:c+rꖱ Q.6STܺF䖌Ů2 ~wʛwÂkrĪl q Bb4 $Al{[hUNkA!j5oE3E7TRk)PUڥ' !s ;Z6Grx<4Q/J~wt\(6UPPT T!e_W$Ske6"*:xQXbȆagD6 kd͵Q` ;%ʔ@ie_fל'M+a -rE՞dL#5pYA2Dk*ʅX]v,ߴdM ļE X;"0" &r~X( -eR"3kfvDM:IQ@U3pϸ̂Y>+5G B& : NH+(@YNYƮłAJJ mT5x\ȋ脦oVٻ:òh-" <&>Ժ>d]*X;a2Lيܹ} MXX1}H#kD=rq\C)@Br_JLhb; jؕfc.[ÔM3 Կhp~#R,*ܺ䫍> F!i! /+upuz7|Q nq Ev˨%dO)Kj.41^C#e[&}4_A}#KTFڡ}֣% -)eS/MO,ǙQ#|eXwR9Wܮ3|7\&t f*5}!,4 aAZpGxwW(+7>$38ufyo&9I07if K67R˨UVV mα>b`ܯYe>bu34‚? %ི ܀$vJQ)ukD\ 7)3x"4@zzc-nGRKuhC+1`h-%4Zv2&'Ej`.u9QϽFX%j M1$/exv$hR-bVcJCT?s2rhbիNBw7oٸLp:ƵqɈ v.4KζGea3BP4*|~UڼT?y4 B)e|;?a4}C*|ef -r}cX|K㩣/H*%BYsPf'0-,0 T%]\b0isZ?#0u?$`mP-Z*G, eeDhPPۘ쎢 X$5zqD^"~awXirg.04qDd 4ÂqâmqyNYwOAe񁋊1|PAyaiG~%ɗKfo_r1\TxUb1q}T5M|3mRWHqB&c(*rMBed'0 ҧED!;gU+ٸo6rӁ5.Z QXpQ\>F[_ H[>,$$ -%MŲI1+# b B,r:Ff.ߘEu -bEK˸틦WZj\,FRJT?hfbq Tj mn]bUf%g CK@T!3@:D] b\B\ "5Mшj^$&%%OAHK+1:is* FUf%F"DžVb1EslŞo/55\H(IDѿ,&ڏ=e:a(J -%]xtM8~PQCWpDm9ho۹, M[78n!i9#КܯV~$EUWQ"p^Y~Yo"dϥ;FJ'jW;oqp}[ۨ $‰~#hVڱku"W)ݢ|ݭQED?P&a<š E-tD35(>&׍(q,jYqOpPb Ic7XY.+ ܫ$D_yZ>u T~$ _G -IRcD~Q% *ʽ%MC)/x:o| +n d[S+|RYne@Hgko <ߥmbقY\MK -Ç-u/1\o/ IQ"J'\YUi|rrk,w.-lY0} 6;Q_^܂)ϕLN»&a'I`1 K%ch9]Ĵ.0/\p7Ńj\G٢RnVɹG&ҢT].ae Cڵ>EHiEm,cDܪA -hzqWl: h+~$ -Nn`}pRʆ^BR,QTWֆ}nUfPDaEP()2ŽK3oJ5ntS @o%AYoz>j%6Ξf'g3){&ؘNA'._e ljuu^,Q6V\ak.,d ^yi >#.6`$ IkZ,\Pq>h%\oW釢wTT :cbH(c̜F:56;@!'Fs7֣%4{H- &SЁc9x]!-0Dl!=og@^T zu1 -[74w,vM~HCypFR8 ML qs[KjkuP)En_9e𜌧Y/*Jf$[>SpXԶrx. -KFŲOAH>حdH? vQݻ*Hä́t2?EBD1n¥JuQ5RPf40+)ڢI* --\*ApoR&wu3CNLmej YESv 4mT%n*X~\/]Ajj Ol ]Eu𭡰BnJjZADBC\QZĪWuvtfJ McEQTn}2w,7NCL,FP;wD)PF$6x:(aaw U^w PypBCAmnA\r۬Nw[LKIڳ%#npj,|&* DcP?a^`9C|y3+fe_Rzk,8YL s Q _N,6<@[c=@ 2Ww?w8nSmU˃/0[j|553*V? -#_rf3)z8ZRTWA| -a1Rܤ[/O=fqL<0E䒴o}mN AZơKl.wAB^\kd/̦z\Odm1fS+W)J ۡ!@Wè- \#\1ak#ji>-ni .rȚQaa #hi|2vPLRԶNJiQè)@xo[+*֖]>ٳ⤭aA\L#U0_jm)-kX^5 Y`td{3 -" =T{V0n!\@:UfS1-543U]YJ\(RKE@ψql/n#vbc 0খ.>_##N @n;wYAq1 ]/l{+! {@";e.\xJ`OT;+։c1&*U*Ge>M̸> 4eԩqBc-j2 K1ٰ:H tEq.R焂 we/5UWtwĨ\aA/h<h3 xӄeަ㞋GU8BFz.K/5.?ԽB(%ʉfX-HnXE#)ZY@a.<[C>wUA,0yad 0p≒UQ+zEܰ\˃aw(]J07hJ.WTK3 Lwe DKmZk y޶kՌXY3*|=l& 7lHT&NF%4WL& kl)C)e@nRk.n YDD_pP;Pf-*:.Td g](KT~i*?yΪfR%pB%MKeU5a> -|p0ll.:\!:SQ'\=8!hu-xQ IU:댐^"rW9|[Z}LG2x:^#,.5%=lRwbD2%ޖ.\%F{ wj&+FײF+gjRb3Sm~ĂӰ -c"beUb>=T>TeơRT##1grܜSPBn`wJiP^L_%EITوwnPJd2`h-%L3[VDPPCQp* qZ*c [h}?JLNUeeb\rP⪳E]Uee&8 {FRlߘC;!Q ;ݥ N0˗u(4kuCХe]S(nY>FZ hQ[.X -xY "_*xPMK 8R8k)`|N}єZV a JrRi`VFUE5LA`x׍x`~說pq3FFLX0KlA˶0#ij^Dĸbz D+e1_nVTɹ6Z"%b,j>~#ucOg88rZ̺B&njVsVdQe%:uZa1 v^U'GWųȺƾkVlbГiVL0_^4vy.뎡RQZLy] ֡ ]7xjT^hh&cx 64Q)۝j(F vǠ UH!8kK8.nii`OX0*j“q'B7[T|Q8IOȎT-z%O9#m Uߟb"'O#:"nI8^#+R)+op_([7}Cf췒:#4JI7Uޫ@UBā@N)_2͚ʹM/113}Oqs[ -Lƣ}e-3˩x+xlup8UH^1%2ohƃ!c{2(b` |ݓ0Fԉx<2+RX[N We+" 0o(Sג~P@yp.ѫessI"8=[֥C5UDg@z&ݎ"1H԰r{4c}Ta+nU52]qYlFc<0% ?&戉S/^y00;H{8^L}Gg [f߈JO8)F*K ql=f X,[. JM>¢Й<ڥ1[töڊ#*}J*ZGy_R-zs,owm8.4V):Z<*%]ʋ -)0Rq2Zn3J`x~uab]x42Cm*WJd \CBI1d_mHqΏ6l-fux/j4*aH)[Ͳ+RQq J -/ZBgw.%LVc#Yxqu.\\f<ïDX: u*_vf]bP-o<0pE{`GqCpRW[X{Ajs;k@V -)nVT {;1D1!X9hwhx*j02;LԦF7\ .5kN]:ľ8fQԢi1sS\ydji(1)ZuDtad[+$8(FY8ҠAJDxHq{eBs ЪbUh~;hHj)ֹGl+WǐVJ`ؚ@9;R#)\aaYB,]!qrBˍVc~e˫-߀7 cPV}2ƿJOA~R 'w*\ZLpuGeӎRyANH5I*-ew1#Vm|5E^AWw}~ -ikeLAtͷ/+ &}sZXf_,,.)otD4Ԑ[u3[KʕhMviX[T8. 5P uƀ;|@kL!Da*TUR u0J:hA5m2izw{%_Rښ"֙fW-kO胢FVHMl ϧіX8er+d#FChK5sDAm"ߝ"+Dc cqK*Iwթ]V+LEFT -)١SW2ut+/Wk7@-Da[zyש#+0RsZ?$Ũ񋻆nmfywp/||z[qy)3u/=0 Wm !m:Fڅp\*U_"Jy ( c|},x< Uw).e pؒ{7PPgpIrF+fkQ#6}ar @jFӷTك孹 2;:mѨ1/z`ql`׺ u5n =$9_-WB7gÇ$$93F{ /5*[6*WVu\0 S+{5.^*+OZ\qtƯȾke59w_¿QKzLTPzZ;LK\$/|J*?1x_rSju;f R9#rf .S15X.P*ℼuW)+bEfYn:ilfRjK!ٜ?1 -Jv)! esmc8,Т7˗/Sn\_1w*.1u [rqqj$c%sf,Zڈ!u9CAH.zz҆!R5cO$'tQJTåJ5FPRPy! N=|0a`TcZ -Pf@jcXjGaMrkCt}%!j6MLPIyZ]G dF%Z˺ 1Gpm2]⎜v *:DbwUSfІ\!Q^zV>f -H[[ɮo^bEJovxYDjnaW{Ko.izeX֩bYuK4ZD?ܔԒ©R("Խbb.jR3{,La@qC(wrޖrq^ -gKBՇ…;"e{ eFXS6ʼ%SRґa&jcCcSVU!'rO'$U- -aL*WiqVTi9.m^9U{VU.4Hj%dʧrO^jPe|\95\fa*RsথY 5R-rq]-6FǍNLv˶+uܬW[;X&}P(Ժ'aRq[`pbYu^VpEش$+/AMvfȉqrPz,,'=Tb+wA"rlܫФ@9*;`j.]" -K6ƫu\4‚DY_eҔf[x¤B֭/G2"-&#d{n'_p6l,M:ߚƨj.eʈ_o -+Jvݿr9عIn’\\` $ .{0 K]PīnRK 2F[  ېdҠ*0~.:,L˼NV"[0fC4KԶĈ숓6^p>Q -{V(%ٛ*^eb b[3# - 2I[a.0  XXhCcH Ԫ3Q:%[L+̿3K&%cRFgq6K9i%e35W -ޡS3,n"n$R /P8]uc0K%poƵM|=d tW8ep7_][Gd}fi?&QpR//wPp "jf m;8`to߭bevӦ臽f.ljSxz~vG!w -PU3MSamDfp%J#|J&\pE<.%SwUܪ+|AuL7Vxr’T~ˌ!DxIPbX7[21NOUt * _Q(Bψ"ۨI()57Bx&xVr*6*iSCmEQ1DFJ7- J E;ۅAuIq?7'44C=Wxk{ڼU{P:[/].3:!:m%=7o50j,D^SeJ*%aL+'JJgeRN.3-!ZKxzeK-(e;|]Qo}d~,%EJ\_Y/*|쟏|T']AEpxCW X|\/9j -i' -y bmJЅZWBݱ]J=dRjg9j|Eo\R%jge.Q[pLWr[, -+*rʦ#mH -#w1uGLPLBVRGJ`w1^ jYR@kkU@pVoJ8Xr娚n,R%@}JrPeBY~8H0Զ"U0-&\ O*U~;A]E #S=,BU -Yt|GK.󹍵"R^hНX[%xpj]ՄDT0L[%& IRѲ[ )X)=VZc(+DHC88necEΥ|Lp36 ds b52a6?W*Q[;!&/\cHR\d/u3xTQ11N(d&D]VHq,Dlg3ȡYLs8F^zQ'Uw-] Uj G7d8z\6֧$x,"ʢ,tFx ܨᗎԹYm^+S1lBz@׈er1@DpFFX"Ù|[mEVԺ1Qj=jU&UPj/U}K\$OM@9/egWw_}h tt3q TVf/${GxLpPeV.-"(MKg!8:F5HCf{7(\hC|̷9ϘVYAľ4}!ՒZAL)YԽ*x!@p3%2u5. 2Ŷ6$Du7+1*WQ - ҽNK_0+P>pڋkڹfqk 4pبJŻ*jE%@ Ąn ݵcҮ7Pz$D -\/5/Ցr ZP T")-QꦮWyJR \J.&jR\;\eɎFd||W!f - % 0˕OR\j7+ls~APO -n+R*3pe )LP{L/:ؽE37T:"%OqeqLib;m P$%mdnPc˨dK%ϩ.eMQq35.RՈj08%rt3ٺIl8ԫ]jmS_2.eP -:W}yJRB%?U Tip>/%9!W` -kP-!,`f8.%3\? /tKSĹQjuµ_~l`qyeJq -}L$~*<̹|T(% VAoe5 V,B70'PbRqEA+ 5 qV1!Vߨ%wfP0P'jDjq/.3L( j=JNSX"Wpyװ;w2C}[3{Xū\hćtZ}~J<`]xmrBO -RBr8XK \2P㻮\sGr|OR1baJ@fWq)UƸVJ_;1)OF|§wRbgkj.{10lk,w)̧ecG<-n t~n{#3Y%}seFQKz#SpOeԶ#)!kdw'q=ܤ{"I2;Jۨ haj-ͱ32r*Vew{1LI=HA+ IU)X`eb8p.~m,u1H|m1bc^)0$SAu|A5Z5u$g(֌ߘ%+5= pv%e?X`CQuȅ_dХU WQVnzb{`TpA \\;21jԸJmyn\,ff/oF3t\xFR%S3čk^%LLELF52#)8Xj7zũqRJV+.mnʏ"ߙ8xX4MjhLY\6,S"ЧL e)%L-cs,AO@x%)RfeXqKAhpp/XUAm$j4)r02U<#7ĎԐfx*5 RUJx5>xG P2)[щ  gL )rUZBU -xv6Tic -MׂgFt0y˺ -*ԋj:w5\J1.S-!ZV23 U)5R`:-Pqq BKF*1ocMՈ\f R4Y,t*-.-h# kw_ropj)A)υ?8yQaTsgmO \C*8{K @mܵo|c*b2NFj& JJqJ:&8/O$)1dk6dp\= +r,2JEVV#Te}U]R'I\a+\3W{6@rʸTG\TpÊn2\S[|  -Oi+F=]HksOSN>@=3X:I{0B^\'2%>a2[3RPe'`-@L[(QrLUV%Ա/Vn%C| np|dy8c[xQ1 įc!JuH&H̩\!Q"E,cu:ĩS:Jn>oK9԰ Y$5.|\ji$P oDOa*슿"`?oCR ø2$nXjk (YT@ŞÇqcUn4Sh._с Vq%l>pipآi,WL& s%VflVe>l"Ԓ9;?Z[f̂D[Ľğ0xO nbd|^c2:2@w~ﺡu?A_ c<"*Cr~WÂ\#A p>f]3\q901\Q p憒cZw  /g7KZ/zYɍp6d2<VY*Y ^ -` (kֵuEpn4u w 5U JvX!+0L鞡G5ȓRD\ -KW*|pqdmV0lur3 E\_/;&5 fG<:cg eqrKT\(n Da`n/DiP%j9/rĩOOwhKE.JKs=Ρ2cW>%p`"E *+щ^L(J3N+=+ymI]Kfˎ4ڔ> qq\R}!*$rܹDܺY B*|_": fʝ3jJ3˨_dZhl단|f\\znj*n74kCiHH>i7}_i(:٫Lqtŕ]t(z~z@EHq)V_rr>j6emKԍre2ZKQLb+U,[CYQbʅ 9Xj( &LbVeBu_Q4|7nRZ1&a=.@5]*uHL-*p)GS01IZ9S,&~q”e'pQĶذn[rٚ2;OL!RjW, 2\DT/Kž#+*[P#.^b.^bWM8HKW/\f/\). ."˖O)UQJf8e(7/,E Q̈\ӈ!k^g\(Gmr:|ɘSJ?|o!_fT`%n/ӌV; }S7 ^WQˌPYu1MmD^aa_,5.ٹIhh#]2\c0#\֦x<̋ N_W⏟;!ʺaFf2FSr02Aunx_ -oXwQ[#*[Z3odfb5bѶŅ/b;D^2}K1sI;1p]1S'Ҫ7Zzqܓ&N*نf3U seaU6YX&YeQ$l"˅5 dF^b|<_;kS[bfUcݳ{ ļslHcrNjf8~Zܵx(!fو,N2TqKIs~b,xw*.10\y_xpaT€2ؽ#,"@|͢`ڳv&"LXQc+Q- AMd_|r;-DA,QUnri%S$ևc -ٌ[Wx`Q%z5!a<_lS))O|5;ig5զ>֒hn"RKbj/dt -2h9oRf=yv!섾m0FWU;I|ƅ!70oASaEV!6]5 볷`JJH1uP\}E3nꍻbn7m]A"%7ҥ 뢬txT*^lN ,Q u -hI` -cBwlWz{Z78J*,a|Z]bX,*W2[PE(BM8Dcq3 -ƮkPng"K Srx ua7UB sfoH&(0n|q^GPS:ڊ@i}1a3Ҁ"-ܙ. -s1,X<]%d{{ >TzK?ڛ؂ma%x]Bv~ O*i FťjsFu V~?Hr%@*֑\4d[fьsBfijV]r eW eE/kKDY ߨIR.>x;-RYQqLX͢V$? -&.:'T3,pK)z't\9^\ubT-'wsW:`k /p9fG31)f4UnS2%Mfn6ii!nY?Q+QʗD̴OSBW/)[@/)8ZQcLFx - -,eC9ob$~6{b˗|1(qr?rU3RJq5ƁIk]p3\P3x -= wl>^%DOpQx\:7 -v 9a꽚 f#X_ %JT/D"&-PJM]et+eov#kA&tv#ՉTܨj:p;Fv<ЄA< HOZ 2}V4ǫR˨,Yjꢖ.Nl= :|p7/A Gfaun8\b6%`KeVJ{OLN-,\*Vzx<1YܷQ<2 - J+<%fs/{2/W3l.>9W=0K\ɻr<_6_K-7qb[qWRޡMpAH9LԳy|8\-RR?ZYE]e&?ZW%{~ߐzxXI&DŏcWMA*#cSќ;'_^)ׂKUK]JnV.7f|ķn+Y<:,${@N̠<8xmT=sz U(񁚈m(J˹|^!, b^jU*TJjd0JF"qUަXbeuydYN3ey'3x _;O Bo,ś%_j7r~,Lw/A+\WkpWdmP -R`[_HeT6苹^Y@3>-N.NR:qQd@k$[+ƱD)XKT.R4k^fa)L^5늄5Rۋ,R?\75pPġ 3d3_C/r[.T.u3<? \rA|3URuDwR/bb* W(;V$rOSX`V:-3]ŘJZjj3J-K6TPt⣗~HJT6$5vQ=mk4xx欕2ahPIKW]P-!dݥ)ٻu*cܵz| NW-;tU;BqN9 ,rGLĬl% -AIhnuO>m.tZQg0SP*[5 34+6@iV ?Z`ӯ4=\J7\Qu\R/re*̡Ր*si6K4@(gF-fm+/) aHʗC <2<"+Frnp%]9q.}.($v! *Ab\6Y.f07r3*c:qe%*Ձk|-<*T.u0K UpbjW"5.xYIr8Iu #-/jb2*phJjMl'~N?EVjc4ԠFBq=,nO -:YC-Yc+ܼW5|Oa. &TJRj+ij2E"OGR^× >,́VV{$#gw)JԸGwKu-w m JW*%gL%lj2E\9Ի+jnu.\UFWKR_Ǯ^,prC?qRwoR.kK4cң -K,cW==̷]KG5*#j# E1 ?\-#}Kyc5lB[ k#nxz6%gZBX 9 _og0F*Z\ - mC\z<1j[0/&OZ %D5ρb"ܫC!.Ae(Srd%jjRagܹl (]`fgհΈ-m.#;UΣmA%\.ҵ]3Wu+z%Nd3 Al]^\+&x1oz @h#KQsO%t@^t)7ZF3Qj.ImAm Qn_4*" -Ff eAZ.fT%YR 7AT*DqЁ\[pPu\> DE c n6⁧M\%m?{<F ZKAxe@yM@ftgU!/ˇM@7R,VCLj|:8q<{ES0NDžmʍ1RcҸ(\*) F5:#dԶKQ.TeL< oDc.W -_Ij]j>_@݄7X 'ؗGp>f01GENbֱa.YrAad6cXR.:IJK 9a-2bkr-HfUK Ρ+RC+SPexyQ$ -O4]͹VX7>bZ n䒠PǻDu_x[=*r~\o0ӷѹXef0wǹ/F&Ƅ!2>(6To%])@Ɩ{EUxW-x3Az̢.Ošz.7b5}FñƊp,FQ&v= ,2֥ԺQDzkܺB.̹/1sԮCMx+JfqEa[*J _g*0j5so~7LuÃTw.\%'+%eYme. M<JDڻf^L8ֽ1Jhp+ܧ7 17j?-hZXg<#5Ue5[3/pV\O3C@[hPc[LB*3/VxD xb\s01 .xE\ "|8U+U:ydIL4ޭ?^ ӎvjs QKzE:ij5Z(Qǝ M%4A pW4H*HKcMQsl Fca5#.Z0[pA$~?p]Jq6wWOܰܵoU>e4\ZǏ7'eV&`T1 pxb_4uQⷘ٨_qV-EG^Ί $.rNyNpQ15d܃ !plпlڨiz!W  u%S01noãڬT+/, osGň,=5GEYtjE`T`˾.Zb71Re*d9 -x]jznR1S 76%@U\ &OuZ -"MqܰwjŷIOv?'-}ͳQ|^ic_ea}njG!d7L#W\W|\xqkܸq3ImTn+ph0&3 Dsr8ze,U9h`ZMʁ1|++#*[W k|^++/0(sKSd`Q.]w7\6ԥngw3] -Kc5@aJnU5K%d5qY&nVp047Cs7\a(Γ05Sl&j:T_#<2P) 猪LDjmwFRFP+=:)Gjk >Z b#l{q3*'%=3'D6\cG,%x"[Q=_`Gh[(4ՐR#jP˨T-@*u JMRˆqs< θ!ۈ ʝWje#i.X(-;Y{OF5)u -xHDnZ%|1+zπ5F񎫈^j0D̹o&7d9@cڢ?Ok?lk4oLrm}X}NEғ73@1b*&+dWHnKfͱKWc/Tj|DԹM˛n EMt cmTdZE{ ({Н-d0s*c`?I1k3leZ7*#"ϲn]㛙K-M̃2j+ƂTeIҦw4-.`̧Pc1R;C<wXPzY{p(Lj0Tn6-|lĥ/엊u +!5Թ R]FTq#[┮%|Tt/7* C5wk<E<͟ܔ|;f( -<<߭4_?ŰUzc5ejbkpUZC::-KkCV'!P% -5Nn^"*ZvV`Q06\s *K=MzE#P%n\%eAeƨ~\?!`)Y|j,iK&k0}V% ?Ƿhҏ@faNa,u<Ϲk䗾-.i!*2MBE Yfn-B A[%qJ8WMB7 wMOpQYL-`<(M)e_4KF<~jQbr^M;. QGpZi*W4[H!qߘM{<6w)J'l -k31?T9OSXKXv> -`\ay|}"CqJ=ڵE󚎠$2wcKr8;n R\L^'fe b.Dj*4d*ťjJS 51Xpx8JFU0ػ9boDq!؁8-K|z>zO{? *46QL|5'B#_G҈LzTyviELP 3Tqx;*`%pUB< і&81d&x]}˙vc-{yeVjRxi oRa_˽MqP7 ϞUU|O pM$"%,w0#nRѿLY宫JZeZ"'evoq[5o -(?e0I?u?⹻/jw1 e}zՊᄳ3[{#N|%k8EW ^ls8$v E,rhD" /gsXZe˦8`M~d#Md_dE -̥H-͌45(#_YT O Uw)Hܖ4<&j0/4JG9~nZdAS :_ tt.brW)e<4NQyhRVag {ķdZ25S)_)TRpkb@mvʏ@J`Y"rRJ` ^]Jxh'P7 -EZT?3A N4I&JTItMkQ/4 FGjWQ`ywJ P+TRŌ -U; ŎP%&9"%.,HԹ|%T@fi*W5̦!R%-nfBWCKkoUXj]4_4 VSPQiAA-)3 G'% +b1Yvߩeq4|M˧\+Ժ0mJik],,=vXbCImD%dCbM@UpbM1~z3t`ŭXP_7 [갦s6e2Yxs9 (yh.TGFyZU+Wqh ͭz!ܪL6VA;6]tTѴ)p~q&}JzJ'2B -pU<_Pd~@Ot҅hPlMKhɶ?42೥P8Eo ۆ#錨df[fg\S)(D2NTq4ykLe=CU*b4!}C,JTqP!BĉnCl!G*6AԹ3$wrJ%Fh*QP-4WDu*b bUh&Gx,)ʫgO";OE4՜]5Q_jL3]jbJY3"հ,$ -:'~Ij+X!SI?F/>ʕk{K;V4aL\NYWQKS,[wʌ@ UD:xʮ -6`vncRQfԩAc1X, f;4SF}O>,[u\GQ74SMc̼:4l 7Mģ7RwaV9x\'c^JJn;,eT7)Y6Q_27p%KGԾ+0H\RyjfFLظ&w!+c6YX<7cVҥ@[uoTAQpIKYL8RԶ3p *R4S<-b-sq95bRu;eu—c]10$t`Q17!RO|<ьܪJ8n*00 :mexCbL!kF`o">4TAu *bYQ`md.sv%ŇuO4?W&-_0%KF=A+0+j_q 7|Qn>b8L"˗ nJDa[(RsSatL s(]Į -B94~&9AYp.47Jˌ&R+&*Pf5v2ڧrF5\;RȔqK3տ0ן?\ܹ9y)Ha> *{_ ?J  1nl/0nʥk5x0TM9ܴ^c$aQlϦ,h=$nYaYRjLJ1T1?=$}5[:l $(™D&" Mkd1KM%@n(qT0:`@-YrBt@:`VV_W0GpRiV`SO*vR`%Q>ώ +LĤVE -Ŏ]T[|ʐ1`݃Yf'dQ -)7+uUUMN{̡!.V!v45bd=NJn53%* =\V@lz?s|0FU5*SR]WREc,9Z)R HtK<0r/=o+N/rsѶ?L Exb2 }`x֡ZV c0 3u /r|x~eQM2T) D}qFf.fgpZL>c|6.Cg1r,sωkWҧXc-Rme -7H0 -YR#ԁA\(n$*홾 d~cah0K,Deo1b!-afe˾kqo,g0G>1㺄~eJa(IX!Q J˚epj[ ,B5tᆷ?N".5JL@}A YQQGuo gDbCVMv8R©cb/O`կdk:%w $ 1u IjpbW|#{*uP' !Q.])5^ϼBj.,kGHIlD[wk*gU@΢D -IC: E^Nf#L}6\@ -ƕ - ÉjKu_\JL|Q._.iˎ CCДS \'\2.^8U LCYt3+xg_lbqQU|4Ker+eNgKxNz8O+?dV3~$C>', .Na~]JTqɥk RΦ+p`bT˨pKԨC Szc+r%)]RJ z.ꤨcU}]"A1UTʼ0O?E{rDYrp0E`+fR|CGmctQ\b[^vf6k1:MuIk4*lji`Aݠ,4%Q &jAX+u'Ln`ql51ԡe ~կ1%J:Y`g~h쫶H -mJeLB%%f!XXA-  l,!Qf# -33e]ſuLc:AxK/(eTbsM%<,g\|̌_S3Dع dU|c&33G@nt.HC?@=$Hp|J⛋\fj\ -Y|BȐ*4 W[c5[錆]o|ぷ3(=fSFj^ :^A]0s11P."Bt1}'.+|NG:iVQ[M]ntqPa3 }G YaU*T0AӬw3nس n=;Gf,Uu ecY!SiRyd'@;L؋X{pSc(C^ ή&c|/抆^% ڰ3;!{.iW0@biu:5)| pÚ|ws5hTn f2fPB*] -?(%G LZ -w Pfzi-#|i5 *1%s`w%DŲFa%l:jV֣Y\@;EOmGFR(AD?3T+e?<u ֥2K5S -ێ;%Չ) ]i~h1bP[X)l,?]^W w<ї 2.T߉jL l.ԺTbD7VJD%6maVT0[E[\YN_ RP_ZgV Pҩno -R$[$#׀2ж$=~Ǘ95u:H!xc\荃ssrB}1p,SEpw4gJL/ʼn!i Kfop^⎥W0٩r*Ww;E. L%{#1HR*YS, ,LT'BzbQuMXJB⢡rDpO*v@\ g XA-yvJË'a2n -NYt #MW|[=o앑Y+[j:ezJLouB+bkRKơʹI c`i]oqFanhZaܳ-G -4Fkuǻtݖ_e\M.|Z‘_Lq1 P 2&| ܨzs\1.˃R \Rul]%B|d:~jz"*+2 -h0pj7(q)Ee˕,8#lo HC]t嵌)QD y -|RHF"KֺS}|]iRV(ZJNrTpBL1RQxRP8c~0qu5aTnSN,&5#kbJ>cR3b*xf7;D1k: h"<x 8|HҞ0Tvg"kM@hީ|pr!|.sP@qrrB_ -P=Ibڂl,F> ++QIgD{IDd׋'{K'.U6If -7kBT"̰R%ʩf#'i3x.UQC\[-\E*$oDx(z;@Gm_~r`0W`1m/RtK%lŪ(_X5cAC?}m}d"*ܩ?7K-K8U?iv$m L*J X%joqrNy^ zUNg[d-(Ǻ7eTYB[%y)E mu›jt2׈ʉRY0n'B+ FW7԰1>R -0c刘,xc3R%w1a *JƦ.\\G3Q-95+ĉX*2ڗP1n -ee%R 2׉HV!_Nvz&1y!`Xѕu..t "k1uW.JcUq!-`.0rK-pq.p(s.^&X|330%f*,A0g̻Rbw4qW,VV^(eA5}5\hb L=S!_b}?iwIs[.C_pM͌ ?#/-A}K7rx⸨/]B08bbTTfzUoCB!?*J+ `*2Y/ Qf* 4:Řd_bcyDk]imɯ,n?d.eZ),DѥoLg!ڄ:nUՖ{? YjZ|n֘03G ]Py)sA,3OT{**#,xfXL57 cڗN]2r+M -!}2*s[r!kf%YPTht\q7>cJzXfr\'S*RZKJYd 6K9*fciN9)Z\IA~_<&}:bB1u e̶8 VeƢJ(%y>pe(_ -R`(Y_wUb_ Ae-{OG߇M, -v{ 1=D_F ?!A({*LNϨd`Ԧ0¸ILEڭKr,O{\:DsS4ıKwIC Z:%5>+1]nkeChJ8Lԫ%ԸQ1,G T"ٱ: +ƅqY:iV>BF? -5 -^6ۥ"T72\YP^5: Tū"hdlz#_ʎc!. TJy'D-SH(E8*nR!82uI*;W51FeTa- -RW)!=U!M~b*5.)["trGr1(n7Rx".&Qr7A YH%xKV Ţ%[@ eF$Oq sˆV!) IOBdeSdaLj2fernffdwܶDO>}Z!;.CWgR8,MY #aگ䒎wE\۽\Pڱ@%ǪKR\TjiR w4*+T\ n)zyF::tARUKB[Z)ĝ}f?yFWDx[]!"N%KӸ5KN_q)ʍ$SHlW4V!.ZiGz./p-73 g2!60co+.384x&NIJ-J3BCQ) 7 5LZs+pT9&ng*z>&D4"Yb l"B\M>/AI2J.# 7(D=ƗQ!FXY6Wyry -/T,3)*"@ke|&,tb D -7|[&A$d@CT~&e TW7ʊJQlGEYjecRoJ2EbR7rDγ ܫc̦]A,=%M@1ɟCRRvSLÜXhôLv+%*YsH?[;WUL|3ՖmbR#fBgfDyNNЪ) Y ha>ڥh*ˇ̵n eWn6TQe ˉxqcO? xgw -TrS,39ܜ\vK|8NB@xkxs %;6=B  FAAyfyNqO0ޥ x0%p[O#9v]ϹnX:Uʈ7>cu.UaYT.\L3N o"K7ࢯv񤇿oO8~?,B{D$"o;'w(@cja&bzan -3ac כga3h;W/-RQ~έl"L!mb{_ؗ5\\+? *9ST 7qwLI3Oy{(E~;b@C^R:"0Bu^d #0c"DF֪.{Y9Txqrksz-1#x%BzpBc|_NjT@^Dc_jR1%4&1Dxfg,K0JJc:wrȳT p)qܷ_.A ;]L\eNf&%L-2Y/c~,f DTi \;fɊJr93w5ms$m%ʍܱ)ݕxA8n\,WlJ%_+~]sDBfrL3ᛃrK%8I`EK=.WAvĪZa~HUJR'Uu48,QΦg(j*: -. -55X9%10$3LFnj>n&ef|hw0\!fYnP y jˮ~JCs*%1azUP*4IJ+x:I~.% 9-s:Pn_L.[D@VC8%Eɕ\TPq+${Y( |C*ɁP6#.GOI<S:ӏ(y;H$G`G TPR]C,.㰷ͤYєyHoYu|@p`$)3*T}pGTD#l?i-"c۔}u߂dբF9v|*Tg`Dw G#SS\_qKF, i4,,&U[(@ˉKn;+5t^R98"s+ITψB\li\腬$0e~͖` \ķPw{ #-{LE]Fc m]:Rĵ{z*LUų fn[mq72b7c q_P_ALIMC4֣a pN}w9u a,Lʙ2L? .8cL6*dc5_zb [G+%L|x\9kS -LBvFK_YAS//e b0"|1|ḾgE zW)B< ^:JL:6\ {Ԣ?]MK@ /jMKfi*Tpp%R8jRD.Vd2ti4P[/X"*f-i#xՆ FZ"[ٯH?ӁRA7Qn)` ]mcUJ]ctH^1SB2m/ΊR1zK#Ar |51-.c#B0C'eoܢ!+1q>ef)/#:aL_%GDKQ3+FK%1E`/'5/Ml+1)6-j,\* -.͜PX@LQ0`!ƉW*+eWNNHULjl'pa730j0lF|g74@X`C(QpTG|Nj_R,1]Ĉ-Fe}@(Zc2n -ҝzÆohLPl>/hFz *xj8s93o|X%@i/sSd꽞ZZW -pS1.Nn14R2. BW!y_rƯQ6B-qbn[Ds2|q=R:!ㄊ@~,"e-eZ't7*8BA62gw%`UU Jßފ)@}44kB_.3Da*֥WQx$u;epYoYvb(u2iu^zpό\BQFqf '3Tz7c% 4A>`&P;D`:%Qٯ`GZ-3~"QnhpC -/0xb<'FN31>)EnjLè1:# &buy&+rLk!6>' eb\#e5Y. 3^k,3΂DJj [u|eQ>]C?ũ>ɨuP JD}wi{p~ %K4%/Dd8;⊔eQJ|,)X}DN%3rϸqɨ,٘b\0".+%||KQ2j [q_PHUd抝}eaJYrᚇ4a2pG7U&u2TEnUjTԹW..T7uu -4'p ^_peล,^SRR7R2L&jXKa-@bT? -%~gl&.So0GEmZ`c:T-&%L!>I/bƥ e"<-wXrsHvv+ 7[g~KP^R Dz=al=<ꗫ@ޕmZ^/ؙ 碈J Eý%9WҔz%9j~]ܿd~ B`V#$i3dG-*0^|VX7AyȖq- BXqZQFV:4)!TqRJ5 TFڪ*@* lW97-;SMiv$3e=E@YAv#)QY ;1Uc4JPI]fff^pǸa.lX⣆mFѪRpZY,2Ҍsy^ᙫ\L_'Jr2RTⅲD)rep^*oXKIJt%^-Ƹ-9VbLR%>'pvJ8MbԵ2[R|W jf*Ì7*(+\ùC *  T]b_r]Y2Vx&O eQP)vʣ{Z u-Lʽ*5* .s) BùખfPN,0R[ZĴax.j:fbTSvK/r`13WTYNf8Gr=^%T1 -:+TSEB&Kj9᪂.n+5DOʭ)ʇ7ze\c)QJ:벵/3+*z*/| աk`@% [^NOH0SYcO˚7 E3q1|xowM; jap1b&#}pj3-q"ֱ27-. pg t-ʌ8UጤdWq⚁7PQVND6AcIX Oe!2K@D 4(sST8Ծ \3 nUp*o]p)xa2JW\ Gpa?bp - BdSF8>+.f%FS -& ԯ.: c>` -̷ZRXhM/#]F.=˖L[R±KDˬ%5+17 s,]O! -`n`ВB|Ϲj/Se O,]%!.-IBi46Vm׉!nP~aiҭU~ :+yQT8/?x[AJ|E,@R!'ê!Mc9k\f뮀X_ (?n+ݢPXGW)ө[#&: %(Gܟ 冱.eELamұ;5f>ئA:ѣ#^ cKP|nkgF=ņJX &KuqE~tM5U A` tK={g ),†;=.euXĊ5.یfdPܲx ->~Zœ^Rշ=d>iH S-^YJWxEZ8 -g˰ES\WԩRʶBiYn6)9gfQv -J$Zv0]hnlȂ .TZ.OaTy2Ʈ'g.9H E z8ڬLǖ7Ș޹na6c}L38x*5.gLIfQkD '2eMuA#\;AuUlZ཭ER-E( |*Unf.-JYMg8{2)ap)l9%o. Q[ ~F2F)jA#QZ>Qa@PfԼ؇`Y(,, >;@EM=4lҪY{ܻC>}-V-bjoCS -qWtćΆQo.g[Xy#\TDU,16@Vë[d6k 3D0ނ"bNP\YCMe t:~"[k%!CtE]&> 0?ZbX)&4*+6>.bmbQI|fbـ[E{DQ;ʑZJ%2c -7>1ܿ1$1#q K)v -OܨFK|<QxyKZLSR+EǚU* p85*&85ԬMbkwRFPG - -A$/JcjyP, Bwpi\%RۋMhcgYf+3st&op+Y h/BU|Ei -*]:RAP .nv=.^tWl,(UBкJxe#d⃸b_@ ~gbf;Y1aɒ\fUKPA^.6xyaM1&lTwSցPmHc+-YOV]|9K{f*|tş -0sV~$etoFڟ)t˃mrcWjޯ'EsxݐeNÏњ߈gy+W0%= kvu+e,BrqpWp_ %ʾ,DxYp]0s@7{WTFQ(kͺ|;z}z[~Bئn~xҬ\ݞ&a$GeLcw)#Si܅mЦ5/9$ -_$ cx4 t؊:Nڹl%,RjUJW=\g&jA[FT2KGlcn45S]D%bTE]TНˊpANۛG\\T_|YPQ+~ -?ϾX]fcjQ[2LBSMJRGL)ڗ-c FPUszȞ fw,'! 0ɬԮnW=@*OHiA"B[6By^p7)%K`ܹDpAqxᐖ щ`)W:|}@AR|^u*Y,D7l#'2#]2RFرR20KX`AM:-I22xx%.xY%AhV=1qZ3 -%;D G -_K",PGѕZ),qFP^8`箼2KIi(&nRWI3Qǜ~EPK xx%u0}͢"ɌĶ c \u 닩~r؏L-U8tKa:8+r$ou1(tK(jQW.[?V?0;\;A"M*0>ؒB\w}q1~0(_\xTw;z0$ -)!DkFLqp8cuI,]CAqpd⟫ŗ^ :=N% o|1r ڭvQ @Go<@(x`uN%\d!x_x+?"C8^jgq3 -;_1xL-Rc`}}IS>s.+`{w,[X=ɶy=]C*>`0n -]kTL~pd5M˕4("PrMlT8~ NcVnikxY{9hQ~u,/=W]PQgkYu+Wmwtyy&* .= -/䍒d\*Z`Q[eyKV!>[ܜ [fxqU\x.>YoKX{RW R]. ꑻ%x&xxu+D-xq5:*4KQn >Z%<ʍ!E JSH>UjU\!\.}~ X奪[/ %e91sit\JZTḕ23wR]֥ # -pd%GK:ܯK9ݬL拔T2,Ы˸ TDkK5ܵ8iQ,ĭ1>q~GY)Ttas6 2ڱ4b 7>Hv`aⵈͷz[Eg:FVi.H1dKL^|AM˧Գr˰(n3*c*[o?3;fj*Z d)>8dZBD_B3gUUL a.<\_l? ʹ a֘9 ,q[ -0/~bȞ菬} 16XdTgVp^Ky Vng$]G: 9a`X*Q(? - #@DVL3e,"ھ&EQ@Oj74JPRV^Wslf!9cІW,"!Nk,q -x6E(S}rCPx,&eYzZ'\E)Ɏ/A|/7D[8-$uV7G3Ny`S6+EXś7y$D{Ȕiq uGRXsP~gP^@T0PD-; - qGai)MGPH'6j\XTRT7v։v^"J&o3/v0ҺA]+ .`JMG%È1 l,a]] @Q+)ʰPc2g-yP#٥T/5v IAX͘&&.U(L1*&\_Vr!.h##W!THohZ~cF -?C1+n?Vw+c&-$k$ɫ-r![YVX%x%}J:R׈IXAW6ٙAt Il[oV -0t<b /vca^Z rB%-#$qoļE >FnPEtlHVN(PZDB݄\+.θ -J(+T@ EZXXػl PAt`[n`F.koM%]Cs̹+}tKl˳T;F.z``sܼ$2طܯPj ISmjWpjJo?rӑ,!}0Ix[NUUY U2iZlF4χbZa̯=a,~!7yɴ5>t%;.ѝ%֟K2h^sAՌuD $n^!Q C+c脑RcYJF܊u;' S2Uuw~P0tK% ^Dg yiUGxYRTsS3)Wz":up/̑STʈYiu3|X.& N'1D^)&g蔥~\()jM b 'l_"X>҆!:-GmAQjs:Q5q;GW+TE"vn_\Kjj]ƹ# nok >Km1C>jIxȢqkEi -(So 7qp._攕fW ׍ ;3P)]Yi[\ %>e# -%D"͢u t& YiZчPF5UL 3Yc}]Þ.}`84^eԣV!TL*Ti-JMG}_ gQr.RgqZQ%=.ܖ*Usnȏc+'qj +4(d f+c1EȁnFQ2VW 2D?1\b% -KW4cP4b/%(Uo)[].X{gU}e|cA%»tlՌCIg[-˶DPlu-6]8xLJ9/;ctң°=Pd]{KD0m˸#@xkJrJ㎣r-c3,'eإV)Ԭo5a)cyS_ʌ|ʢvX MJtǻʸ=ŷ._!`VD|+eJKuYƒsm Sg_0"Ŵ3P+5_|^BVg`TxGd9P%'@7*cO ֧cNS-~ݪH!^.L| -"30TƄLZyeq/a?2-xz Q7S^mr\\c|{Ga#4*#۶?B" {lK'f1CQ2';gi*[S%w /vMBSorP-ꪑ iX#ďLlt )wp -,Vcvq< (fb2qK=y?O &doJ( - {0 -QZv O%;Эimܯ3fCHW+(1|n 0B\2B!3qJ)YIXYFj#)!&l1pY -pb]i -3kY - 7EF~bT幩q&<Ƴ%_ V+Ÿ3Mʣ WVcH3L=R@Š N@Q;@E6B"VBK^ j{R./ ȯLu>gR_l%*'"4 -Z~P'ʛkyY |nk&#U.u τr2B2bw5olDas8~`6\_nZAʮĉPs_;eÌ.W%}`Y~bpJ.cA-BNR˒ lH8y%FZ2Bܡ2?Ă,P(\ ef Cݟ#4_!Ъ*Y<2OueT}YOL[#vJKk+M ]*VA"r0IfMͅegGIyl3 *d @nUtk,N%^:Z C^uܭ7:aËm nL ,pj eL~}຋}0x>_T$ZqY|d#tθequ֭QZDΒY_H,尘ƸIU.)=/I|jH ߶F`N}k$qWQQ~{\+rU.'˯K>EE2zŎ\ 7^ -8t8BXrYkmY/});fC35 BNBּLK%ō1 ez$R1qRGi*b*l o0y!Gjʱ]mNg"HR cZ=o0 `1mYZwaGe2 0,GYۈ_ŋ늆`-QS텈JETd&)$ծϿ1 -I3SpT +1<8aHg 'ۅ8P7Z%8[K9mD!'epYZf[o!RvHI6x升IAj,/?[o!]ǃ@Ɇҩxr2f\簀%' (Ұu` ]nX@*8.ѯ`KD6j>Ox(]W=pa2:S &XآtK]H`n`wTC*K'Wg}`#QmsI.[1Oqu-7xs+hX$9οYhؿ\T v33F]Ԕ E`T}Zs7Lf!` -E2J)ālPrD eRp5*=ԭ(ۈ#NqP>5;pԸG#<|/̬1ƿf<ܾ{9l.;a8.`X^ȃ]Γ~FpSV  |ތRhX1ܨm.WRylBFnt?3ܗ\+w+a:}bJؔ,K=@ -o-r\SB_|~VtzY `Sϙb[,JFw%*"15XZ=v.9`\W}ͶemoFNߘ?U]DUć3ݟ1 2ThJmذҜNB$VEl~j߸&_qƸMAB%tOvlV]r$ܲ3%)<~ɺﶌ¬ryc'Y{/Bb\nPcKy"bRTkգ#7*wr1QmX̾߇)e@WJ[w.؜%+iXS D,E\zm]q|3IO^KgH+*4.?Eo "G $* )P*gxf t4\-p/d[urc#TVK=+6LoT%,3hifEf*/i w}6}s0m1] `\h*ޡ,EjeRWR(WC~_Whx ^ A#y\ % ,_\Թ[x ؜^tĥ#u-LLw.G^Dm[]VDh4RT.PsxTx*e pG5esd,3.R(itk`MY%?)%K[+yTi~% -[YH+?ղ.2ı.< K4FBS-Snn#ΏbVxʓ`qh PzYK̹XzgDc\*`Bwʚh 񢶕׺{W @eMA(xhP-+"*bF@n+?ҪKHuȔ- fUQ76d&sJ~i ǖ -MO Q]*6#Ya{-JY04^S6ӖNhXOzimBYg?W:CLyxab̔fVqW:l%fgWC-¼1xbyǿʎrmH{u2Y h:qkl[ #_sĹle|0Rȝ$=* F< ץ$i811p1n=%Ft!|6m,FU7>ܧYw -#ѣJ`* (&cR( ٿ]4-<+Ikٽa1ia'r8rU`Lo|J;0J!}Cݼij-a*]$ƅa߉s/ .5E|3PAeeΡ bDyZĩ, mkŨ_? ?XCS -?OۯJQ8rV -Veþn*]*[Ҍ*zDNyJӺ|0aƩPeUA|,|ycB`Eڛ7*0u۱OxE9%9fao<Fj;)EH jھYft@2)0 y>c*0q)gܚkWv^9? r]j#l(zj_,Z0X];".(v{D!Ew`iF4J ~!Q۪EʏAʊL*uO@'}|hvqXN #cd1"[hԍ]q6<'io1YBKqXoH/H7t $uM2En0 TDl wm`*/a 6KaCx/0^*+v*M*U[lP[]JH>%cDBtb_ы=e?Jg]C_wQ1 pHZ6c(e o,qA.k0 FeL8Z_MEvz~,lK,/Q`FBoۢa]T0oj)<[猟E??ْ@ةlN_Ò%wB4xa^~bϘs-~+)|8,ࢊD__1^Kb?xD6gC@MW! Ml̄?^`d?ѹ/4%59qbCV&uK qu?)*!0rbP/d] 0CL [9j"OS=`uF;V,qOxg~,a)vCK%Aa5/ p¦Oa͕PCoqN `)IΥa/1Iyb65ܲCUJL hZ[;;3|Rq<7.5*}A|uvǵK4Bq>'rR  yUb£)@e?-cx|ϩbRR|{}ƻWt`t* <<\sUpW@mwB[.:q, qM뀭UhªEVUeķ̶7eܾ%Ku=р6e8R&( e \6?ѵ*G d[h%xk_-Tp{'ѕeGǍ1*#a|N) ~ddoe*(ӎۘGU*<+ |QP,Z1[Um*KXQB0ݥ] `UW9 T!b,HJ2 5W.m5G\#eܺq,--4)UB6W]4CG;FtJk{VxVܨlx.٩rXIC n;+ݧj>ʼPwB TU'R&:0; oRONK, *ѳ;թ[HdlUI[WO%_5/1em7ԼFʘé{j){NbB~.deLsqISj' T)BX,M9ڷ&Xr۟MYŠñBC0ef1_{0ҹykuvYٕ+*]{׎_`)q=bv߹ в()诂0o%>CR4L]W,y?] ShbM8nSy|$_ k2dv=K{䩉zVXF&ֵʁ6rb @Tّl}zlḛ#/5(T1 Vg` pZ#%hV`i 97iS(3);gCײ|e$U B(gh9H|_rq0ZZX8g4 -@GFF8_,\PVw -F+odŪmV'sGa 0~gj ߁Sᙨ3OF˕0ԸG/)VHؑ[r5Ҍ}|qR;F7*  -r,~bs~k^nۘ% ]FɛZxi)Yp\*j-裣NJmYKkg蟸$>hJ|+*0Y\g-SUc%z"^uK%Ħ2]`k1GۿM@.nKX֣hQ"P*H!CIڍD)plư! K['nSNM㤺ߐHF{!}Ii/b +Sa(Fĉ.>fe$2e< KQ=˾Voň"T%SzP0NGz-h/eټ*h{\&K*L-Glrp6U/*5[Uu j%B6~f_Ԇj[w <t2Rh(*הSEHϖ^|C3*=,AX#"1` u ĊBn0 -䩖*,5͝Cc>窩!̤/WWf]WEJy%.yYу,9&4|.P"׌ -"vBW&2DQul6Y8 mqQ,@ʘ%˗nQ*̧_ wPicLٝuFgl;.O\fU1zIY_F6Y0 -`r --ʴL2ri`5,%"Q4P%ݗ@ Y:˩ad 2 -@iwT ..= [0kiN"E gZ0% lli-_͡x!Jx 8Tz5N,K"[]61nRcVT[ij^x%%)~jSpo,U\\>Ta|mGE@/@5#:]M{hQH2tkԏ}VZl_Fl[fe LbEGRw`c`A߂e%*fcL8yƥ9.,Q - Q==XS6 - "[|vDn~TjtϲhiN*X&*- !4(?jG.vQUhh7:H*f]Ƶ>n8KeE -7r_q3c`YO2/x ]45MSWb$pwUv]=˺{;02mQ^Xk)M3kLWV 1OgnWVf{ -a2][*0e]@uh0Gsp -m:Z)kY'm*_ ]]v&ᘨqPy# hqa-Z -3]dBUlD1oqe‡E%޻c Vg4j}Y`F\,c5?g6<" n[ `aurjUBMm\0hEh%bWv>fMN; -RSd L<&n X=Vt}mO(gJb-j]5*z}N>e0 DvF^>xl5p\,QDGjqq -Dj찖Vs?̔uemi1юe)KAScŪLcHkB+;/qԩS$̷,LQzK]a[LA L}5F˼m_1[) Ʋ&q/.+˾Ya~.wI<ʜ@0 \CogRꏕp5zD֠+ғ-?-;@WE?,Mg}Ypj*_ܪ:R^5.]u$nZw n ( (lKD%WكطXs^&J=3lTJ7q上-fK/jϨyJ #M~nqJ\Γv/R|f"A;5i!Ɓ9#}Tß:*o,3x<ٰ!.,l:GTKBf&,"4CaWl3j\Y -ո?IkmQbLU,B0o@[P8J`6@-hHXWj>o,G+!Jâ R(dGJE?-{/KZ-Ro Hf^-5E\%9<ƳS7rE6 |Vas,x\"MiɈ-ͭˍQ~0$[t} LO#7qq"IWws[Rk".x)dĵ*Z˖T H.\HG@!ރ%@J`)Jz:e `o3@`_<]ؚp0<āZ< -e?)a2R< -V9nrAK;Gk I>\Cp%Y7ɛ*SZ T"˃n>NF* Gޠؑo'oD E(K8Wu+.3ԱG1[=YE^,0B,bp[+3G2襖Pj\2e)eTnxa:wȺ1?dgȄ}hng|*Q3?bN 7eGsqIWj#!xw;r Zpxj2)9⪙|*ڇ'Cj5\O%Pj @Kh5^ A'go] ;;U: -h>m&7Qb,< Uu{1{KVPqcЫF\'n-{[ >].3U|XMv/CΤr"C4 ͑bl/ab_mND?5K|Oy7 +,Ax{E[O&byKuX]Dzt21s^42XZ,J?:4(u>aڔNI7uB[_La`{L #_k}dP\1dq% Q31KܣvP0Euhnjy d)wԹG+J/fPfh B_!w:!]D\OR]+pܦ(+0.w0MJ!7Q(zu< Ճũe՘#1)͐fgR֋+GtyPZ+tq_,LJo!@Yg -/iꌡYTX}@E댶V̡鶟Gw ERSMۤI?A0[}j&oqg.w.(l+a4_r;,[j_. -8(MQZS_og%PJnT]Í熂e.UJYx%GCD09y˄] 2b$B Q s܈(wQV{G{7o}9f"h$ 2-_JJJnEL[(--V(|\#(W~&OLh}R+ wh? )) ɽC+ -F%[Uf"(yWW)t6k0jSA=Ku`AP5.-$ƪW5ψ ڪ%CjwDK88fSP`ÙEǢdvEMܸb ,rM| aݫHT?ŵ@ AY.d\VA1(M1/t0v"-]#싷%]Y" ƺu-Uh!$29Y_ҟ fPXYK.'1&&HZ9p~G W۫FR*P`&7Siw':y Stve`S9l¥(w*aosM̷\h qt o#--+ gx"))Ilk+LD2џ?˄8;Yu踩!xQs7T>^/4)nd.{ewIrvHKzWJՖJ= lOGkEj % .E2lITZv3*A R-m*f_T -|9I/<ƥ֢\\DCm-,3/}w3uE5OeC\N\Uf5qW@Bj$#: /4V(SYlTø5p nesph]IM,3Hld!vupJƺa p5-Z3H+ T3Z4wg;>Y;TC-i |(n=Jc`T(5bD#%N4vp`{_X5eBIz°*<9q5(z38LL5vm )Fx*xk,n;6&4">U~|0(Z -!ru4 m+-d337#zD!MDt 0hRr-RTTGXgxC5PF\8+T 6ۦԹpxgu FgLws21fAo-"֥NK7ܜ 1ʘP%9eBowLRjגedRzJ.!-@BwD~RW3Բ /P. 8|X6.PWU3zKwfaqrӺRz%7wf -W5 -)PF3J%5o'l^lyL- PW̚++CCaQt7wJ -7Zxu}J}\n&K'C}0*)nHzڮQى@I҄T|<>I_pBJ{-6j~A)b3oc 7+ > q)* |LebMQNQ X@Eƨ5.DLf@ʶruJ-8x[{$f2]}"j҄+Xfb/촽JZLڻa!:~uGyf-%"!Rּ({ILH -U#gBmf-z4K+C[64QCLe;!~`%BpL >)YvMڼ]Ҥ]N+o `2Ө?W3;C=, !KBٙph\ -KNZu`2.zbvpM -a"0}*2q$ -JƣUL>ͻY zQ`*U]F\%0[T`T/% _5잿,յStn.Gu;l6^_)W{"c_htESW[P.%TxA3 e`+\"M\ɶtS3q#vQB=*5Sp$UmbȼܪN/Bu5<5 -sLGfa}X*Pz1GUpf]ؽBqYG-\UJ3 -8OqL.ܯp`YE^X{/Q:F5UEd,I}N5 X b ]鵀Hc9JBP*Uk/6Z<BV3V @Mɖ)4xLg4~ށclFUs] ^mȔRϊ# D瞂L -ul#]le8ˆ T5?L(xɞ -eIJ -uP wYQe!6sQfxRpS$sh׋p ˳p~.Q̬ClW f.TOrlYU[&$xY{ -jRl'сL+@`] t#iQ"ѽ(!u2~25W_.Zw㺕-m*WQ& M{m#)]n +?p~MJ4Fv>x F|S+.Rv4]J\ZhjYB^$IeSB_Q[>o -Buzp5ꨲ|xD =Phgr+(;Σ~q*i䩥jKGFm&sE4O9Ƙ -2S<]zYH]’b"kUgN~=Q6Je [W>i[dv"\ ),-\ -QϹYK1xڰAx,0UPGXf!pQX0U - TŦXR{nfgoQ;0j\4Y).XJEaq]\J<[K/2Ug{4|DhWRʄc0foJ|1WKXH:YZFU?'Ke]^;ky cWcQc<-ĵqҧK^^Sg۞_x2 o?"XPO x&7yn=q\MAʫWB#"QK&_HUO8qsAik-qXh@bmhuKpWkR?#?%r 1qZ{6ϑLr/U>,=sKl)48U_s~&`iùLԫBh/H#Jϡ_lu]Q 5njXmXR^&lvԶR/-|18KvƐUDwrq02PKRԺ %{E22bfE.eScwGRߪk5U6j\Y.FXh?m穠Ś4Fzb -D%-E>4zuwD@`X-B] P":M ZjU K_^FKR[V^W,`UB c8ag~2izp~PJ2Mt+ڕ-O )۶w2(n06~-(~j:_F(|h5C[3P*EzU``g c7@;W%:S>a -4h{W?o54LD֥w -%;DžDuP;Ftab"]2QK]1IiݶesX 7l,"^(w*_uA.CۮZ@K28,ATc-@n\Ul[MJTc.0S|"TnaP5|p6C]f|:jiIK>IXw_ṋP2Zi]?=nb43R=?d>-Y4 OԃaO K&tOP'gXGNf}+LψKG8G2*RT-C*u)kJpruMB[HDFQE,do$-t%0j"qRU\JL%FƻVD]%꒔կl IB -1 > GIF}}MQu APXcM=;'nk~ -kЍ#&ӌ“>D; MJ6qo0.K{2̕#H3e?0%Fݤ< OV)l e4qRS˭Fϐރ`s? L@~\/ܻQ"PPZT. +)lgg"Зg.i}c47]lxT*ƥCZG ,^7\jtn"b4w"^͏H fRJ! -ͺڀ:HCS5nI@8 <ؠZB=U7MC}MX:Q LI@1'6z$2:5q:VĖ26h]pfoPO^-u d_USVS-6DDl[atTwPd^،q.qn=a\GS+$:29!T(|P.QCL0e_AƸ:g ,"Vu>IbRĭ3on>͔Cpj?G{1eH[[i<1^5DnD,i)LmUf5sqJ:P{Ck DSʵa님[R)a Et<3[ѨkmAXdPۺD^R/5V;ݰVmEcmNBZͭ G,1\lkdKz){"崽7 Q)-d*{:@Eg#d]T Lm8IRJ)+C̬ Xad}33eC}MTMQ[YǔR9w*T.\_$ʁ` -hc Tyq ]x'cyζa(*@lzZg*^v {Tv*'7ԊK4 UR+(ܸLIJ3W DZr2cFτcl -y_(GoIynezX[yqj(5uqy`Q-}4|"LoT /01 -ܿrȢb¯eDZG)@`!^@% ^LVZUe[UlliU!`G\Iw,,0K1{sJ |i)Tж5 *M% K^˞9,!+ - {k,!+3AlB9SGjkV]]\Z_0TpHĐlv -C -#.vY㠂AÐ 4d+,4Ae[< -7҉R$DDNĦz&%T5`"WP:X%ttuy2 -@)p:jQLqJ$. x1Oc_R*_I=ޅ5o([X<ES+ Ȼkn#8P*4GdP ~Zn0҂>F~-;s8"!X3Z2i!B;#iU*\ m -9.*nxB;2 [C2-J&%V iԹaG3Z -J[ Fl1p%⇹^%Jb\/3Kx`NRԮhkԥ?7j0v>I1ɤb_~m~ 1H?,b w\>0\d#c#zeTbs$%;!-$o(ȪF1)ef wRx'W,TDTT -ⒽCXm>Fmgn$~UK*8 4wCcxpTsek3QHYEA -@s(ٴ&[|hB-hI҉ͳ\P3BϒˍF {la f8jC/a[\OH}Irz;9?D3UD_e0s n_j0a 2ȵù\s9T)ӆB'1@~I䅕f#ٜAgr6оkRʰ>X|WglHԉ;bPXCB5ܲXRr;j.J6H[X7Gݪ;*.3GO] qV#, -] Ymc=p< G{ |*` VY]\g1n+ )- !fJE}v bJ <Ա{дV)Mp/~[H렕~ۄ3%h뎥7*卲P_x[g̍ ; )F(l"D -hr˕)Cc޽3P0 -cEc'>d$:(ry*I0T  rI wY^XH!ddn6\o^z ,oԩsulr_Gsb,Q#/m`j_Vu7E^&IEpaHVf/Y Y9w"2rRh$G7kˠWsb(Ct+YhrٸM׃ = nں)3HZI}$r^kYa醐 :͕nHbE2Fd*ҀWYFiJ"ݑS\X"fڗ~ % -É}尓VJ.Y*M[{|Y'[x3+qiVH3'o523E 1:4RZIMGːV: \@PRfSbtR4͐rܷukܠs_@."B_]j(pZ䌧r0H3\KRaѤi ] ]Eu-ԮQ(.ֽK\#\L% aO@Jq\-/5#@mAj-m -G8{mW@ sw{|Mp|0f oj/h2(L8jy"J+w1Y$-K]|c}k`gSHA{pVw*2QlF2Bb(v@QH*am-;%F=8Ysg -CfZsmtJNgaJ/Tj-MbaVĩ,$P@p2;jc]V\?_P̩q/Lhǟ5}K"+vFnC[51zBFKƁNš3R[MJɪJEl1D Rՙ |=޶}Eh n8ה2m yKj#j+u"t=٫ER\U07>!-!m[ksdh PMKp&&(u~Ir> 2b3Cf$PƵ n[EpG#n.xflm:/(yeq`Vd.T\yvtUf9i V`r8Z後_tw -# B_(VmLaY\~eTgUFK]P%E:9e~f/fڬ?QvTc4n-ʭœ}USU+-JUekVv^-!#96x-CV+Ļ3 tX;R7l f +$NL-Ʉ -=p0״|EB7p%vR*Wb_G}o\6 )r^ 3˚SmA5lcG} :f=+ظf;sHak -4͐WcXBSd#-ijy-'X$K66]? X}m^f%m}vҟ4lB댫}Sh,MډMi4:\KT7Et%I ,OQM6)RN޻KmȲRLJMX-Ԩ nQnh7e %@u*7nd7 -n rOM Y%k1W//ˍBL}ˊ}}D] v!sIr>YKwuB)n^6&"S5Rڸ)/ͳ(?:Qi_:E"7S~b8[ ӣh) IQ.))YFB\IirĔQ80/arIr*$|K4x%3^ԤE/JAX縲¨e87%\^F .3[.Y4_ᔔhyj,+QZ"E AHL+Rϐ C\LgFZiOs7C>GX'5:ͬ=e)A>Px"Ij.? ̾T:>yw- .*tv!idm q ݳwb0K2 sHgbЗi噍8y6]UD4VV"EˍG9ٸwPL;`ED`]jjXT=e}Ȣկl#)/OSVU{V\lf⛙Ŝ"UCvp*[[(nvwzvKn@h KtP )_ĕqLt[ADeokE$}"3`*\ Yb0"t?J[D~b,jpxHjkLG[!(X}AT7DO_0wfT&}B2VݦHP'/05B3 UnxtFFE`-X,e'k+զO3R?u+Yӛ=X(RV$ oq R Q Gjʀ!E%K?l#_2S 醺+3P)s>Cfyt~0/pF視_D=ۨ7yiu2 . sѕ9F`\e!nY;]*M[hïY"~+(N?0IT"kw 8^@ -ї!DVc9}*!~PUEiB 5)Ng{<7-v|USֈ4Y4 &P 7<2喁hH%kw8acfc ldZ]WuE;@%(d{9~Hm.vawHs|KIqo( ӵcFj٦_0CTɈGn/!v6zjQ<ԴVV0%}wݸOXcWU}EdekB -r&*u)Y@1+W g NBvsM'Vjʗ]K-T+YpDMe闡;U֡AD1 - +XD+A]1 U -4JURJ|i31SJMlZ~-&'^2ZwC/ z10Yg *zN8HJus54w7|ukuk?Q)¬R}il(w3ϲɺ㧋eܻf[*\vwP|+/DkҎsA/EHɥSIG&JH_[sփ+P4]WA-"J-]@1}ˉ5| WQ -qkB!oN")#1#xX[/̳S%/2%MI+kREVYR*,˸wưA3oi<̲LP2lsUyjw j7)1KB#5,:Ġ2A0~ Cg q0X -RH # jI+螠 * OKm`(\@tN…_Q~) -m~r0X )vQ̮Γ膬 >A-6 ffj-FbD.Rv-.^Ϣ/ -ڥ=T)E 5Xf!vXoU6ZbH̍G`Ke&Oh,KՃj$VP[4bZCpXb0L헬T[ʨ%#ܴCme{.ft1 K -Pw.P&S*1TTV-ogaF*b,>pԷOſ!"[ R!.h^XÛ|Z*1{He=(̿xp}jL^0Cx{l{"^=AfvaQKYd)w:JHʛHvrCdbOjj7g6~ GxAMD~`Dks-IVwxLE@KEﴓpHb:e=Y״flڑv<--QTX掾ScږaHƵ I0 -Uп2!D*À/TՑC)G0νYƣm BB:7;T5&!haH,?2l54_h07ln \JZx..Xu)2f^hqd bQ) % aw.#4kϭ7Q=ql3PUς .*VC6հU8H]IA[yE@cN!l#=^x>KBrPW 5_qt~>_jwiH!E0:l*lHqP%r$ VQeb2VY*U}Jn*xeQۃo=c;J{epRb$:"UQߩ֠-8bܨĕmN.JngY^eקDTPQP^TesL;koyaymFDSi]b c:3.B+7p/ -n.BE;q_$-2 R9#,v*-Gh}.[/j e<3ef1eYPUphsQUj+/Tw)ẗp<$!jp, M`;ig{'Y^0E1R֭=K (рpۣ%;OƊAdcMxc{zNW q[t\YE|p)~ԗ<} iUdoXڱqE >EtDe|+?R[t&쑭_\v3{;Wu ~$f}?RPPX (`m̲S5JbwJ>YP. 튂p>*!-!\j Ws& ) 04լ=Sp+OWjMD,RVX"Ez豖a?VAQ5)J~pWݷY ¶՛dn|B菬ЃHSV(;bd=Ф%!#zbdo --!MZ)HlkadfǞջj\1& -_&,mP2HB+A| nnXAA:(,4Ia~hZ;pgCG]w -ыrEj%8-pR`0c]ڰIGΐ_W9\ȵy^us&Q%JzTj.[ȷ Srv1ݲb-h% -jjAƼa Mԯk\^8gX86qC T$Eiw}Mj|Eiq/Qp6Ã4];t? A7 x^% -yKԬJ3 W-Ki/ w2*-# -kbgmkuI DsxR$0ͣ?JRR[ɩEʶ>L-(9IJ7]k`8>HgD_ҭpgkQi?X 'EԂy%+aK f~ En{#(HaaR$ZN}!,5HK *E)8)2JQ&"[:QEtMV_hnl@Y6JX}. T.ԺnTGDX("HH[xwdW&W ,D_#J6xÈբ`q9\24I!wѠbj.hU1C/?eW0_K1H]2S5aUElU*`DY+A`)K-UhёPOg X!(էZ51( R/ozgI؅5Zhu¦ g ~Vf`l镂ȝ-Y٨Dqwh6mB7w`U0Zti,ɧ}`B4MueR#:ω56B>$彨q4VdQfT"K̽e\H7tTLWԲQ*;%T Lp^ Ip̤c|+N4Uڭupsn\aKO n ނjq(;KmCScܨ[Hj 1 T%D @SخciޕU ^^x>%蹬vŨL\[/\d &kZI-8 <g<Xao-RUAKP?K19yہ+(o3;%áry_p%4Ŕ<jYUK9o~j6$e sTTLA:bdSsQQ,7M/"gBDԑȯoܟaX 7xO c-^-D=uP\qU:m7䉰ڞ[X<M0mR{˙L;E+gZ=B2|li~xQ(ݟM:cGH@R3R--;colqpkVOGĻɯnWnGH$!0PIkeC7[ɬ{wD^~P/ꆪE<;@ -MJ -&YG6%J9;ٍRHpˎfernkdY%N pb FfQP\k@6+Z=u"G\e7* mPSZ3ih;hޣV`B8u380ɟ3w ܵmV.ȦvBeg#.O hȒ ~tDԸz+sG+ɭ`@Uͤjg+'Do|pi&. -H utP[@PRd6|o -^% +J# rs829cQB*CJ1I29\a -_b VEq! -7,y ԾS9n%`i,ݑߞ72b֕-܆vh ^ψyP,nRTګӣd`KSHƱ0ę&f! ׷iov̕IMDe3| -GG»NaR֖QuWczkRe:E 1ҡDY?pNjw - m Q+77@+a srp^!!\3-cOu2*Tx))jU`r -/|ꐿww7}WJˇDCsWCK\[U_ +V[|DnEB K ]^]S\vp;Uaf0E$US\7J2+a,Cq~l͓#,)7q+z*]u 9&(#C -΢%3PUJ1W}_YF'E{ -Ju5*)bWCN3' X>Y$]'1_Hq+}y*˜Av *Y0kD. -Kj-?Əi A.U p`!1~5(Q%gC3S3V}0@*b.ǭE1.Yx̬J%pYII躌X|ItɌ|4n m(fc7XF\BU-:MWszR:1-ޠb""FßDT }BBc{NS; R -WAaX)x_#7q'uԣVz2ϒ !Bvl\LV, o0O}ﮯ }\fif;Ʌ]j>eY]9][h|\exaeQ+*z7bTśolX%J/y_w\_fW'bJP%wc09 f&DǼ?䡻NtUw[.tLe#XLmVƈ -PF۹JUpMxF -u}02(G4%#.a'7oMRX7Ae*[2 -WlE-B*RlǶb:wjD -QV m0qcõeCcWQ:!1ʸT_{K^"Y6@ }Qa -Gf"[f4+UT&5:%5Il -FCHXo5(3[c|Z.5dl`FЉŨlߘu|^'1- ^:PtCtj!(mkHg舆bVd[Us,6ҹK>Ƀ}af E/Q&f<|݆Vhf*Գ9cY% -lk{7)C1[ugb,Q+ jO wt5|q"uQwѨ0U §V& -w;eq @%N.>ĩRą-#+!aymr奀'ZWb#%?1Tsj/`MUj5*_@LkuZ 7(o} H@C0\{Z0+SG@,R WMj-HzߺRis/a#ȋ5Mv>ƅ"uShJ宙_s/kB\\qrܨ˖ECEQkCl -#0JL $34U1)xZ;+hX}cmᵘZfnYxHGYXÌrS9{P 0(n@v Ҡ} ݽX6̺f#՝Gk30FQ f!D]>||,l)xo=vEqw,&;"R\lN#UvVD^wvBluc:)Q0Hӏj*f4 )vPg.|O&4@i1Լٜ)bb<h%*궻nQ ̊nFcJR7Ӣ,xWn:@Y?L%RUZ~*lGaS~Fi#J֟wxQŽ ewƭK j#PG4)>VM O?chldmp'`.`{l:FA^_̽AYP̮Z?W :!^)|"q+ճGD#~lAx֍Ś/r]ƈ'zđs/@@n[*[F[vRC;B\htc}> s"ۤkDE-!TNJ\=RFU887&:x -Hg(Ԭ.dCQMA]BȻ8x -h$5.u?<a~ưe?T\$LŘF;R)2\%ks>ef~Lqs lV7f{dwDe[A(ap8j~*G>,`}V )Y[.&JYqBWC&?*n Ӹ|ąp_@.⑖bjXp1t䎅1:/K!7`ú+B{#Չ®IU pܺ -8n1^.STƮT)?.w?>$F=o{ɂڔPb?s5#7; dI~]bf<WQ躁Q5< Mn',7?=Tke@tI|T ]&,/:әX:upTCOx=Ih5 V g|ü$ݢeV ޡGlQ`#ߗ>B#+V_uE2ˋ-g6zC*ԡnz/LoOChM̼km8e_ 3,{P3,Tu -{L{>act|XgץnQn Tj_L7qecVؤ3],5 :b]!b^T8h.n_/Th4a. E*>M ځ+%-5/ y?˦}x⥚{,~wk]EiEFǤS(#ҝbĦi3TB7 (jbK)#PeG͘xu*6zPhe(҆v@WĮW4ĥK\Mg cA*0YԪ{"4f|`@x,aDdٕrQV0 -U}pc%1Wfרt"jW PLUaH)X vP%P01aS ~>?l?.؇bamCh+&xGԋ"c -eSr -u7(gZjV5eg6lwңA8սGu|FeѷK0+Hj&V)*egs\ SP Pc[:X!u]jZԶU_=)baz4rޛZ+DF <RSމ^-G"?O<킉_1f pm!S$RǏe>8\*jSd}Lc)0KvZ6D~M%vWDEMiK*V!/8W;ٖ҈ .aeg̸,7 T.׫IT|ܶ:suď )~4%)Mt>JY - U3 0v(>L w|fԲeXi\|JqRsyrx,;Q7(\aJ -1 G~,ynZk/Qx&/**Kơ蕙sM2[AYsZaB7> b${2F̏ *1Hiecsl|`_j9(mh:.<渻€ /rj '[$RvR!X^i] -JIVP1c>Z3Du?#g/$9}4.gky,7 ڄLl$+xIEǡ FZ{ -1Z@PVز j 5v",Ow ~rȡuZKJje%rX \*;0{v\C^qau`!4\]]F P笿2kPPޫ -H#e-oRǎp[ -%v --Gٌd/k&-PiW L*bkHtQ൤<~U  UB3V3g 8mk/%_!b -*pڴ2UkMP%~ [L PD5G[J F݀Ty֚6OnJ;*DgxDm'oA}b0hhՈiKBVxg,j sP(wLpqy*X%F͐%b+Rr.\Q.TRbֶr>:5KmƢz~˹[׍Z>~M}!K̹D^ȒWK|T<).Ac5sPu͗tYuІ VۖIcȰ*C^a.S3TEj^#Lc/.ڶShy%r3k*P_`xHtr:I[ȥ{1R%bGBX/^v.1x^r %͑N|@Qdme4V f..Eu.-3R%a 61KwFH+!`1׋J!|@Vd=T1#~#J)KCm.TH\n-COA'LΥowm\ &s[sD*1fwRTcN*>akؑ Nܒ]_u?l2zDV[W#赝zNq -oAp`wgp_jo2fɜj~Z@;榃uCJ -6Cg{z6m6`T@kC -L(_2 mF>wEYP#bNS"gCRX$v֭GCH`kq~`Sis+-iJ'jjfP31[k aC:%pdĺƥf ;@lJ\ 0l؎ZF-= ꣮d z5\Cp˵3:w4P?,F6Z ?'Gr{KXw)sh87T sU+{4Kaf%a -fB(_P$0=FW2+tkIM nru -* 1d(B |$OMl+W~|Շ -8֞uib &2uъ?`d jG/MCϝl?sEWq_&W!97\+ʃB_17T_&]WR@*|`2Nn]up|K\JtJIRDd,tU๺dzK XD0H<)D{FMl`𚛉*r3§L"ĝj]JTMĨL^c;檖[ ~ϚܢK)rtˉ؍eEV9艶āW -Dek<at,WP8u? S"rܦ2]-8|&uᎧp-mn/ k̾FVw\-_Amenhqc5muQ/o$Dmr}`I]@)\qD\*RNF%_V‘HueJ;~j! -]킭jJS6^d#eY2rf$XGqt}BK"JU15c=xp7b>CnIw޷i%k]@ *[e_Mmkl T-Q}3itJ/Xh|NS*Y?L!a_j6e8Q`,)u%QvS7BE 5 L}E0 -Bqj̐GVɸR4(]Kyhu>0ehJ%v7,T6t_O{-o+XKަ 4uYDZU>ȤU|on"[lwܝO!#t/BR0;?V5dVX->z85Zk޷UvڧQ[: -_p=tkö;5<+c{pp_M}#0/"\?Z:4DH_ETo0*}iV3L 69k}"W`09 Fq/A_'O +NP Q!hwdcd9֢K"Qc*4B T ;#Gtifٯ.˪br+),Y$PSϰ&fs7(rOFSE/0EQ| @Q,ƉM!T籰 26M6*LT@u*CtEėH,峲6K¼(&\/Y)w])2,{ ]ƱD`.zŔǺ'ΡPD rKC2U$q\!o)DE1HjEY(HJVA $t~x,a)?(UVUΖk7 շҺ-%MT,]#Jm'?ҍf߅?.FC lsT'Y| K|+cSE*"l~fy:=Ł{+CۍR,yMLgRĉbD6:Xg'OȰvs,|-+exQƣ5șGKn b!G 3.7p\qi%d E55{ynX'K^Ʈ 3nCXQsa"LZ]2K;~p07WK LF!u!BQ*?C\-b]_ -b;xajKБ; =ia4  vҘ/1&(+d4qhPD -z4QJl< &XZNEP.&fՖO"꩙"D:1tMGS 5|]LGq0D*018[j%\ 0Ж׀+/LTkNoZ-hEڎk^ Es::l!;h1nɵx:{''#1VHv0(`&b -tuuwTmQ]"BZZ*5&%UYl>YS_I8HuWB-pM*o 2*s`8-:t>F*5>[x!v2}h efbH4u:%UV! - v1[LP] w>B[n;j&=#[S .Չ.Y}Y"֩ؖɻR=d>-Z/QrD;tQy8;7E4yXڱư ,U>0Ȩ&&d[Tw Dko ,9+Y!Am-@UR"-Q E'fnYO  `qƇRUmr7TU 2 DK(BzF3ۿi Eml;Lzbl2p YְDUr0/U^OŒI(j֒OZ 2õ*F}ا@ jY}u rZC~$X&ݖOnq!L¤* C1bCs8YT[؇}ܳ5گ@GUS7ODO&CCqEe,jH)7-TS9X\B_u_reUL8@He_A%t[qrv_5 Ŭ D/<]Gw T^2EZ1 -p懊{⸮MJ -B_I:eUpԼK)f8&͓_1h츶PgNQ^DW )m¥]Q}c4}ѐz!QCt%Ll A~{)O7Z'CGea ?断'p=j#{)o-{Tf:N&jC,x왌4;Lx"0|IL`+i1s;1Y-&#c\-Kx~_ -$5o⬖OE/ф:9ZWzPJ%:Ĥ1Ql % `eT- SJ&P/o(ZP - `^_)miJemgp 9Pj\ns8?,/<8i_!@-yf@7wŜ 4\xQsD*$cn85Ig5Ga ^KG>ڵZS+Ei7n+v,X/X*kq A -.[n8.x$Ln%Կ2\%n ܶnuLUH&b$ŰcƵy.)Ӆ# 7EOY[ƔnP o -_^_>)c(%kJ+*$LŮ i7`Z#s7eT* e*I-qQfSLȷ.bb]L #Qn~1lxh  0mՌMfl# ^DS|08vkBXF[o@Pf;%:$^-X~1dzkGG0/FX5zF9iؒz{iIND[Y49%LWP4ʰ.%sQQ)_%>{8|Z[/I map1[ZJ \k> -FQD &,P?¥nJ1}_;_\]$}.)^‚F?2GG+ sLljM,Ԩ12{X J|N̴ۡQA?:2w ٳ6%%-c=?A6ǴJIKpzd6U-Xw{F4j8%mH]CWt}KɨQnvv.(C@vġjlCP[QV5./nthlrX wITXc|B`] Ru^'Kcg~7p`Ah}veUn);& Fy$uIP+ Nˌ,..(#T1@ů~ N]AlNsqA~cfL%!0iǧFSN˸ҫuE@D|z]U@կcB=m12bj8"{)TYBT4lhxHnELtR]ѳcD|G/ ڨ.>%ԵfNT$%Z\֣F{,!^e<:%Աuė-H0s.Ӕ m3r7Q%y[qeU 厝J]TnnYKRqe#[/%/X]+YQU4Yb~_}>TY35׆3ӻ SǞ$Yҿc]#BdL" D -RnUULJ[:4qRhU g̩SCJe.%w"j͆ͻG*m($Ys&U\/LS5|+ԡ#p=R6=J04k{'ffeuurTw7vZ! -x+f0T6?LKBdoIq+:CC+ȩPhTkr*⺖Ti$4RM#ԦYpv2s86ʞ"D; -tGo\u U%f)*BSKp-[1u-E*\x('R G&j W嘵p+$|cĀϑ -ǽef -۩kQ]UfԸƺ0*\<ʼnd6Xa!z3LUJoeu5FҐ2/0DGp~ GS@cWעdHfiAHtje1ij.=J*RaDaq P`#aulz`a -x kaZT*fSFr[+SPD\:γ.^crbhE`ʿ64Ȕ^t.5Q?M=°'" asqOVj<# U˞3&wSrxEQ;pjªmWV71m]KH|#&S)5e{݄ rs}+1U6JSQ:q=Mb7X_G%|D'eƛH/pUZ%Ļ#UpT}1IVzpOwf0q`Ԭ3X$AEv,y]lyNⳛV.=jPV0@h8a5vO{0mR[¥IEIP c ڼnwoS41$}HX%"B"3EBKhX\l9Dcl  WU6 Ģ>H C׿Y"fꋕ,e6kzTHӗ[F*mlNi+B !L%zT:n$ hȢK |+qeqy`7W xJ+B.ڕ^6jSkXd].| C&`u;QZ2~HKRe^&a_.7E%)mt>l-ߕcft170Lj_<{m|jfSܩE\5ÍTwSU7u7edԭ蚋.]ƪf.=I 2'Ff3(^җ = C\SG -GEL5!bq** *DdD -EMyY3#"SPeeeARcouEczV 7I|b+6lUϠKtǺzF__d12|QD: BVPbJҺ4Rc2bP6S,'cU/BWh3Ԩy m8/JYc4U`4Sb|Lx\mNKKy\/bl׈@Կi4OVQ=D~UfHLK#t;5uی(m`XtQ=\(: ǂM C,?6(9bM!Kete1/VJm39D\:ǏlŴNӺFjZ~ENHqԗT-;PQiV| `JX¬Z!a%6F'1 4W -9 jݜ jdX[Z.8*wPt}ȣ?Gl -B@,~slNgp>qo0]K; SK0*o+RQsq)y(50sbc5p2!]{JcRUT4|rU;7?C`GOE(YR(Ќd? t`&+Fy`Dϫ;“2Tu{"IvWF.TЀ+k-3|( Y<qE 5Әa!Թn"X?1|rۓӕ gqmjt(04=/(vC6K;3Q)'a%HG;>!=N -t^ r"rƛ$Ƕ=APxΆmg?Qp=gLGDbVzFxlY GTWֱ57sew -|Ƹ M%u {RۨĨB`cg숔W&u]H}?A".vѫawS+s8.ul f/)bgu7Hp -g7Mot.62 BHZt6Sh`MvnBPHAfhgx7~#EQ]7 UCdʮ8S-|\"([ B֯h*[Tehܨz,c%PL m0<4ne0 B$7*%q<1+(Z&"xLiek+7)ny0̾T# -b{rS2/lR0HBR7`]Wܾ9fr|Lஞ-̣>eˢ,Bo'oP8 &EӮw7,uSRHG+X6@~,Y*Ɇ{YpA-hC GTEdP5 %םVTh~'&j% pbK},K -5:`2 Ԟ 2\YSEKE -Tob'6]gA`D_C$_%?B΅m$EIy -0#8(N -*QQ%bUrC/ԩT\7o &w ~;(i׹j Xv -?(IM7/EOrR¡.l2QWi͘ڡi$ls⽑ -2PbxK`e˔ql)3Cf\B2S_qH, ^*(?㗘%*?d{0@1mMu8&"N 5>aӳSVłOp۸+ʪ^&{嘶0n3bN]-"]K246%e; ,H0U"ElX1_qڮ-l(Ɉ}~GPndT-\bSr0/G s znSsAPR.4Pۚ|Q<ײA:aːa 09.-_2z=@Q-{U a4_ KE]M(u`N+wZ/W3>0jOv*˔BUc.e%Vr0;(ypFF%]%ԲTƢ¼pUq1, _T e%G@F.3r[0$ {n]\NI|.ek&~Y6{K+RQpVQ#e7~_bP#;Kj R\j.rKҟU$m:KRfus6ƻ1JD =OP˕T/1.1$W^vP"1b1ln=ʯ!HQ3*/6]ℱUP݄/CKIbTXI#A-hH) -VQ, ˀ-kv4kDC -] GUǥ~{|U1{-;X nI}J zn+ω|`o`}Y\WmB%xW+EVJ]Fu gLa(:IvΡ>Le|Z pJqsֵB:|\[䕝57, ֿK׺k|f7i"n*S``}2M2`U㻄haL -yjʼsL*j啧1Pp/M~P QP.+0-@ma4_*h'@XWZ<٪t4C/ZQ+5m~ją+6垟r^h2Kpo[̅"X60P>ph0 K. ""0|Kj,!7?Fqek v4'&2Rc -4bHeI#}_qBTK(U^EQajv -ܞ(Vy~Al9~ϷV.P*7VeBgCIYR!Q[V+S -G͵݋SW4rg7jT&0K@7)Q;t n`{,uZ]C,40,Ŗb* ܨF)Y狭b;Ġ|3KP~N ê]R:.__>b,=gˇVUx.%8b*o44>qLT&jj))U}KV_FT)6{&y+-C]**x -LRNvjk-b`ci -# XO#h[eH8q^g-ԔX_GZ -2 &z)SQ% -EXoD6|6$mծ[ط-JE:33XL5rZC!l U aDIbiUGo.{5D"+u4$ s5eW -]ʁ -A"5SXBSlضich$U eT\s 1|]DP8k,2̀SqU6 jfW:/5 -3G$F -uKYTr{`1%R3|T]SR?&&x c8#}N/5{ݒ(F%vxb@nel(M#)컠S9[R//5H,p]tK&*[DF*5 -R-}wtKjXPGj+4rp`7c)Ei6828|Cmzj5X,%Jx'W pm^*0GP`bj=q Cv2C_8j0OW=2_/"L e2pQm$c-n8Vї+"98v1طa89k~^-~eMUfLi!WU?uc1l-V(?C)>'wrP%H{e 32RYd⡫" VKh\ė+,%F1%T+tJ n'f F7:B*̝C=1 m֦ ]0cURk/ @6P1`DpuZNĪD! -E\u5;kP#7*a5|2ʞNM#\AotbO^i!F_qp%T,ጹiS<]: -NQ]F?$?j6:BbAƒ.Jk>zFݱ3ZzcYy S՚K_D~f,ȘUՆ,GPXE"i[UĘ41``U;ȑ;yjdjҡ,*&ZÀ-e(=` j)[u䴯6C$q&Y9] n#ۘ(Aev;nGMʪW1Q:[USw@&LycִTN.)ڸj>*5'e`* Y@|NZvz'Jnwh>00 KgzS_QVn}ϲSMÊ̹}MU4%d,XfbFU"_ar*; Җ1\A2FkYz8@;G̸mnQ2Y~+B@7S){!mVj^6 e"՟M\]ib1#Z iW(U.~aҷԭ+Ci1C>xic1d+Ŕׯ/V~1XZU/)ȁYeq}i!As` -[ZO -醙LN{%V(qBAo}4GNĻf ԥP9ѥ?mbCoU03a г,~T9vL9d]:%ip/`F( -R{;cU wzR "ή2_rWbA}F\ -A5BLQ/_@ČOv d Ǹ^"ΦIݱch5v;xL?&>56y2T"A5J:;cާA6EȨ6A Z KIg20pKIJ>%`wnTUVKJ.D(hA]KCZ.RAtG^~uծ=|LdI&f)mSn!aܮßo .u.7QCl3cFø1j,rq\l*&bBW%W/¦e%Q%qSS4,Lt -FT{#َ2b]vmor@"ȫW: X''pB5uU8\74"߶6!zKZU|JÅJډ/)[.xsPG|_ .-F}pax&cQ)lJXwPb/5+ 1*U<۹}~F&^c^0$&3#}j{mFMY -FވuޠR$n>IUAwXR~Jc\ܻvmv U|,.Nql<ľtWKBĉD K͏Kn7L` !J],A %.YT - e%}=T<\BڐUR5 -p^X,nϹxTdmLQJoܝz{ QMm8qsARܞܱ0[)\UjTڋn!sjUDOxBj\.[,uj6XZ:uv+utMERq7t5XuIXTjE<ӯv ^k+#Lvփ)^j-WV%eVAr (UW=quIk仵﹚Y\ pV %@dd]b%/I66v,0k{HyU}AzUkQJ[YڃieW t>:p{[}]c1^ -v`kWB %6U |ͪ{Zћ";OXy U%NAsjhUvK>>cD {r -Q|ƙF| M1Tˤ{KhK<ս P/ʭitpB/j% ¶Z^?t=qoNbF/uBnKXY{"k5pa>ݙ7]+z`@Wd2N SmS0=c_(i*iDPKTE>! {wR<.;yj oki.RʄhK)h{G@M[Bk/uY -ص%Vt.SjV=3ʱ4ui,2-+ڂXJBKS.Z,!Z|! 0f#u[]A]q9~Y'f3Jt<B .u5RB`XD[Y ܀qE&^<3%[_P!B&k-]0DdzhtP/0oV -"Va qFmD퍢~eͱZY#<y .Skj@eM0S9~"0%AGMav^٘^Xu{`mP ^e=Ю,$g,c+ٲljap`-Cicv#U# z*YCm&D>:q*i9z,5AWM'2;pG6 m P-}g 7ѕzؾբ hGEpʚTbjUT8|!Q7QHbnP5oQizͣ=be#:/⦳Ӫjm'ÿR:~pmK+o:R+k hT؂ T6`%8Vĕ-΃ՌJjFQ7Pe]'W5]y(ZL\nf4[_'tU*!y"MAL;n3 ->45t ~d@G'T[J'm]HbPT{T!o&,u)Y_.! QچL,x@RS#.aA-ڠ`ʴ,kӭz_i~AVc܌XHo,\ބ-G'#@bٲ'{jZ͍r|ڗ-Ae.lN@VWIQ4ԥG#OS5TLAaUSJ *M}uӅOLGlJ};[6pН63| 1˟2eT$cT*Pe#F`Չ) 8r09RTUsU ]m -o8ǝEdz?CP((yY.bʉP̨NNT8V\8nܫ5-j'MNcS)}qS+ƇI@;t[1wSC$#_A>xkE3oR2W/@FKN`o>.}dL1Y+2lJ.Wsm-eW>\)%~qA)vJj0I5. bʞlRGAC+3_3.\Ե,D*Z< m/<0Ca'HLS)6U~;VKl #-\]|n-X v"(vy0WT>w%S]S+B op6.HQAw۟آב9PE0n諉& \TmmQ -5PXt*Nf3>E[nu-55beu^un5dJe6X\0.V`ɼPa ~eBg4.t5mDRk9ӳi! XdG(6;Ԡ86Q1/>q7VD%ѦYڑ{+52TlV`R5)o3=\=S40m(ݣړXTR.)e̊0/_ɐf KlE"\~>nMp<~)^E{+iiaG,Vп/jFg}7ݟ}k/#",uD3@kbJa!OFQLe; ^["7*5Y?^hԗI677jXQng?CG vhZs20ۂ&䦫NI&L&*wںd &j }Z/T|qb" UHPفBn -^@+H-?p?2cZ+eCWfatD\~Z’K-σD+]%Bv$Gn@W Pň(MY۴fc&.WEe0 ,g`(@JטO6^(s0dR*@baD.^ `rK|f!\cCxe^rG'Co!FjYBQ -%(eQT!w3W+rī/|7w/-EX{>Sؤ~ D'MQ#c##T>;&-ޡiS`GwΜں2ݺi `V!UD!s ֿe.]3rOS73 2L]J-L̬Øtod*OaS#]t5}A -L_u4UW2#i20tw<26P*j H}r"ISLh{1!~e\YeVn_jFF8̵q M堪B(\R0H4.ZDΐ -}2#v?)eb$fUFTRڎ>0 -})VcjjzigN'3c, - b3>v肎P_P@=qs,F0j^vd(mXREeuc;e GR\EBaaڸy⦄~ ,*A5SA6*Ҵ{QbA[Vuࠛo,ٗJB .$+~dU5lt3j27Rm_QnՇ4*pRkEc1|'Lۗ0! --(PBWE -ϦaY+'$пP>H-TPcܤʫs|u'D×|QE@E)8X3?yEB7c>ޟ!޼eiU0*,S-3{!nSur y:5߹J'uԶ^ -l01Yn/DorDbo;p![./N(=Coe -`DMF=7N]UO[F\n.mAtp bU`?1*rC &+ٹqlWQ:L!sU*R8#~"4tMN^hU~N~+rZ\GuMFTQ֥l2|5a}(AfPE{(VbD57sl #8w&Yn; ܤyfpFr\Q|ܮQD(vxW|$. -*VLICwWYីHb7G 1YU.\r a u76 X0ߨQ$[2tJ#3UWaR+PmCc$:c rI'-wEQ"PKʼn -2ڪFRsUDO먓4`הusT΅bcVo!Wc"R.l^eu}Y;?^A+mꊊ6!?ǢcM`We/HleO&hZ}DA}u,E1{&n6V&!UEJȵXw+ٿmBu۱FJ'j8a-[UjYD?*e=@_?ԣߨmw8eY򄔔Fv7kV\A"S l([u2 -eB4K3,뵺TYj0_ A^ -(Ձ<2kim\RS[%.]yUk]k if$'w *D0{d0fP꭪hqD'{5x!Ȯ1>n~ I'T?"r?eH%+bCl gan]Į]p"W 𒹹dO<U^$=D >-ڈ!t9JP+PY^r@?UBS0;$%fgp1kULJ\.1jxcG90.xE% T;Ĩ.p_]ӱ, -K7WĶ^fUIqa3w0( -L /L-`JXH^&"Q4*!-˨Wr㰏"qpa W -%Ws/wPJ 1?qxIVK×9$&,!/qVf$;& ELXVQвLuFLKY}FkhU| -?USt;3`|Ӂ \"#R/GweLf1u27xteJc GFkKvTԬg0䘩Y8!h!-B.Wʝ:uf7Ejf`ˊY]EA#^b4 8bA710D(drJ~̾ lB1|X]pH/OkETZYe+ }H*^A;ZVqar1/&%g*jwg'5ƽ'Rog2ƪ0V&#]b!{.WsbuAGB_ ʌW%ø8U٣O\Km/*NC˶"zֈ˽˸g2RᴈC,,{_4$_\A tԩȬL%U:°KĻ suvC.GI{SQ)o![m)4^ yR:ͫtk}ؔip (r_l}}ZC(G[XX/DHK(z!) -!Z=L-`?.\,EeVe(RŽ!.̎M*(j_2ܰנ֧lԚD8[2Uei4^pW߅Vt=1`4@qVĥP FɏQp&棓J -#z445?Ҕ@.ʥiI"HOpQ#zPħʽu"`Ca=0WJhZx@kLWs~?1L!r޸$۳FjQ!ih_>sfVi:ջW:oKz.mPKP*v0W-++e'DaT,>j.[UWrmc~蒋J[fn9!(_ˉ #LV4̊lh֍^( 5d@.պ]Tpm\|闸ZԨu{u͟KQZѩᜍa%C+"gZ~ - # o#Mjv˗BS+حaJ(+dK`B=XRڶ"4Ьb Bn2vՆJ偈JOƸRCMT*<d WY/#UF#T)pf J ,Op豤?KE/ΕOkr?nzŒsfs>'dS%ƚfIl2놐{GoiXz8Pp*40%M?/T KԨxH5Sn3T^TĴWd%+'7-nY$8Tn5>fvK>5qyIJmK>!\)A+ )L^51Pxɺ9([k$_ N^FQ*@m)hY.dwSRmX7 6Clo`[#.,[mn8k" jrLxF$c?J R$5Q͆X{!z./OE:0zB%baؾM7l12#L&7)^ 2r0ZDk?ě, %eZ@Ngv#oeV1'_CqGC+?u7_IU_Ub],.gqMZ11p݌#_ݟTbe^zR>b 2B[Gl66Ew(|C.V}FU=]PڱruߘN7n/L(V -!Vg>TzYvr|1Wm12,>-U56H"UoF.9HhvTUԼݩE^}7(mkxQ|C_7R-ﰫef|]Y}ܺv1~^%?]'qùw SX&Fؚ`pjڰnN EQ*Q6 L A?` !@ BkҶ7hV$麀%W>d>LMNz qu`Mxsd$rjtԎ,0 7ڞRBtLdٯH-OP̎ܗCm*-R>y}wQģcu=!6K]`E am>VtCfoV1q۝O~e| N@syFjLWm }Kؿ18/YD╜CHo$܎FQt$Dl̃!wƗAaڋ/t؅ylw'@fb,4 1h6La?\ugY!F}Y6%QkWU {_7yV?'FP;-`p -"DR37,I'oH:T1UQ1b@kT5F'kG'J#2\gnq/g\= gzUH枵Ճ.(xN׋ՐKujSXԨLu^7- LZNDmWF+n%.Z*O]PG{ :"{Wԩ\wɮ1Z***ZAM2ɩv*.e:kc,_s8̊&mfuE >S9A',u]c=CL.㏘%C7`0./ < XQ.YW O~|:mXK2 @2ʇ%F\Xn LjhU0#reG]Jx7ѧ>GEmļ`%,}S<2Êpu\{ԨK0PO88dcS|Σ/pD c(ѿOϻn̅Te>h[<M^Fwh9Ba@(&$i?L^RT1t2>*%[,N#_g MMƽ^իA+ kWY <7DyAb -&]UQH_mǵ̒~,J) F6JMtLtU- F`3H1} \>db@BҰ҉"ms =N+HMǰOY v&-z{qe޼ml1T+C[z`Sքއ2&ۦEQlBڪY Ah({_ uA\s&d)UkB;ɥCCBڌ2zE~kڧCVWƀȲQWbnbiH\)ZH$7&Sb7} CށKB/p.ނba2VfBEV --rbD"stƢZV_s=C9Oʀ+i$gsyO d^Vŀht\n&"@"`vySMU(dƃ3}elcY>a~jH\}CTA7'jou6FW#k$ll(a -[KU ~ȪA$<;{*Q)ϛI  ˍ]FT/ -*yV --XUQKvv:Z g|RJC djThif5`3sɳk 7mCUFa+ -[tWԩl.6Yp=KYvWޝ_•Nb K5eE)*JmRBm{g2YEG,2v[B&0%Qpr]7tpDlG_&F&Mf JJt,1H(F Ţov%z\/Pm1+R+a٢ ` -~u T8hfʙP*69>s~]i:F%ǵ÷OFb" ڨA, j8ʖ lb+!:]"U@ZCkjHs:1dvf -h,Ic UJ0ʉ^PGQ1L'`&$(fN22[eX&!PPXA.~L~zl1p&Q E֬"cٔ0Yu$R#P \q|2w -ƌ֠)an01b2jwlbQo*MB",K!>"G#!us*Zs4߹MrQV.}3q)JP*5Uu݆J )kijɳ|8-/ E=FJuG -ȮL -- @I]@l65k/  h_,qlRvrX|*W_w@ee4W(})?JĢV[Q<@AX~ ) O^jWZQF}XmKrB$3)!n:I]ѯld?j6=ɳwbKڜ=*wdlvIQNT\ ?+π<Ib."') 4EbuJ Wz*hKXQ0C±*zaMbZ0(hmf2 RjO% =lj \!9Ii$w1i@L-QR0Fb\ k0}<{]|rDz˟wY7>wu;4r 0Od\Vfd&hH.Y]¡X \E2NRQGu/R J􌧳}oq:@R*a F0-V#w}AI?}S1ᐆ^C#bձaX07OįPNkkaQ FY*%ψsu)SJ+RE -<ŽhY*m" ЅZ#! ԸࡅKŤ;c IKll} p>aDvP筎rAFɘR\[,UA\%B^%"Zp]̢zd6(PKmArቤI\/9θjnw+Ufopg\Ys5".>R9eYRKvA"*6$j}D9#'DWȓ3:5XH?/P]!55TQߜ`jG{ w4qsbsZ-׍v@gV*ZFG ,1E[ܿ3 Z)BW K%U mD# CUlݳ³ 4b+VUQIҘP'@8-w6`5 -63 >$L*V?YTdY+=?mM<<+{k)nq -06ʑaiRIJ05[!7q0hZ.9T&jKaCWY1T0Y*j*.D0\R=j쀻rk E9'uPljC*]} Op70reݫSzңª[ -W2>T`IO -J\{ Iw$7t00\=&MKJ8G8 KETi8R*S׊c5 X|̕:`QbTwBKxAq.sZ6LN"% -'cDټ4ODKCl2;2)1*y2 -0hs4 -/YSL(#ŐRc"=|d̺[A'Ɯ~ -6udMfjWqܬ/`e< rH۹$.HX!Lx wU/D6AL@5 -R&7 J}AbQ/̾R]#/+h<˱CFv\R]$ًo¦K_ -yΥ7< gA 0p]jVD>N jΓ{n$ѵ-8 hTJ> x)lPV(* O ŲfqgqRSoRue7 -ĮKՋL}LXTуЭHcuV()݋4Na5 Գfbu,KU_ŏ[mXl d+*]E|\q D:Q_/&_PK4F|ʌ+ZHvwqn;e,&`~5)w5J8 L\de2ɊpD:Pklnƈ J ڀR;[@*(XgK*,fP=y_")~N  x Ӹmhmߩ5_$z!G\gRE/!Fu ZRܼnQW%sVS_Q%WPyCcՎíF? {w," -L_ -ʃ`.p1P_bb< @.zU@0n%1젿LdEaXE&+F5?X>1ԄWqL2gn@E A*7$ԇЃ8i/<:#K.'v o \eޣ711:#mAmX} -خ5XAՕE.h%RkK:LCpba}@*> :Z!?C{g.( xT iyK!"+E36PC#r LJ5d\ESQ7"-G@YMUh Rd[W ̱="y#b7P,FUn! -vl=XSl.dIBOLd{0 [GUZ@*F6JtCdvݱ]A(!~ݝP2"=S6VB* EnkOpnqbx ٕ>);_/Dy#\UbT7V$jZ) )`{(_Ņ*=v@@ѿE+'eWtBDiE٪O >%Ñ7SWl زj4u&HVaU|rU x$svb:7ewuzwI7]~ohۨYAӵڌ * -?lrWwMP(h+~NܳP(g7Լ/lAï#0c۟c -.ԁi]LAKīal#?d!IA|2t'e*6 a>tHUHIQ$#Kx`XEF!_}k2lro[;Z]oL y<r)1z UVi,3mRNCZUyW60tV؛IwduRqedsPIvKܑ6ynA/T'r]zGP_-6=CרYx.c)].daJYZޡ2z8eƗYYX~ -(>Qڭl-A[|B rCh;#?L\z'>o. _4߮4jp؊!:W,C)`a޶%m*jнYZ=c@tL<yYc0CBZ J[NpiK}0ڥdXn:x!;ahU`n9FR Z N?2 6M6 )|Ԫ>JJT8j%-FДt&*ѨG+wQڞ9ɇ r'_<_^.<8p RUTMQ+ECQ+E\0J -om~"R%5N]s2wƧq EcAX9aAoYC0612cmC}ݎn6KkⰗ~`A\n2n=EۃsS2ڥ1&%QClbܧsRr:|^{s0a8c.\&^#cdT5 p%u(gp!/|xH&_J̘g{3a&;SGȵꙪ}$zyK$ b}KBdiV/ >  R2uB?=X/)Q@J@!PSϵᗈe+6NJ \/FV/wPB|D}%WKI)+ ހ PzJLCmjCgcwnયPDFϴP%z>*.6U8۲bck<"w/̗yWUQu93ac0 wV萔'smR?0zdWClq!(ۺjvmY_0U4J -6(?j-|*=V}՛A>'9/ ^KUfUS?fo[wZm"C]hIʐDFTڻW̅j&C5͗zgT# M"{.Qഺ/RP5悅1zo5|EnjBoen|hW,'?ĄΚ];D|j E'"e*-Z߽>D t첋L 2[/V6̀r `hU8YJ-ٷgO^DR~"TWJ=t1E }͋+0χG΁o4_|(uXu\;_hD8K2zQQ cl1;fSډPx;>0-XE)'ux9/;f͚mYOE1΋^y_,RDcǯ - Y22i1:̛O!(.@yPi̼RDn_CU_S(p~y"[EѤC)Nd=7&hJ#w(Zp]>|J!`@p 0P! ?#Q3?,/{V{-ЌM ̬1b~gVybhDFfΉqzǶћ Ll!O7m{G#Ge37:<{:i71G<ߵM[{vR<QF9m!:38<.D>/}fu: >Gdr" F;Y3VpA>#m"# ">FL3}yVܖ^#338933x$y2`jag! IѤFv#ffy(ϙLH/pFp43Fu# ~8GlRg˂3:>m:.6ς|ngNPRDu}g$#I p ?6t.-0C NJ -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000013534 00000 n -0000440843 00000 n -0000440974 00000 n -0000441172 00000 n -trailer -<> -startxref -441309 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/dc4d55d7-b7d5-435f-a64d-0385776b551e.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/dc4d55d7-b7d5-435f-a64d-0385776b551e.pdf deleted file mode 100644 index 311cbee..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/dc4d55d7-b7d5-435f-a64d-0385776b551e.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/dc8fc953-5ed0-4597-8e36-e7b409a7197a.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/dc8fc953-5ed0-4597-8e36-e7b409a7197a.pdf deleted file mode 100644 index 0bd8e82..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/dc8fc953-5ed0-4597-8e36-e7b409a7197a.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/df826790-e5ea-44ca-b214-09bbea50f59e.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/df826790-e5ea-44ca-b214-09bbea50f59e.pdf deleted file mode 100644 index 9ae5fd8..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/df826790-e5ea-44ca-b214-09bbea50f59e.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e26c0405-9d12-4213-a7ac-16a7f7712f66.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e26c0405-9d12-4213-a7ac-16a7f7712f66.pdf deleted file mode 100644 index 3f0b2db..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e26c0405-9d12-4213-a7ac-16a7f7712f66.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e37dc23e-67f5-46ba-a839-0892576403ff.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e37dc23e-67f5-46ba-a839-0892576403ff.pdf deleted file mode 100644 index 7e5107b..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e37dc23e-67f5-46ba-a839-0892576403ff.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e3f0e78c-b2d5-488b-b240-36aa08f69b16.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e3f0e78c-b2d5-488b-b240-36aa08f69b16.pdf deleted file mode 100644 index 13fc82b..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e3f0e78c-b2d5-488b-b240-36aa08f69b16.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e62bc9ee-3b2c-46c9-ba0f-fc53c173e593.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e62bc9ee-3b2c-46c9-ba0f-fc53c173e593.pdf deleted file mode 100644 index 1b76e86..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e62bc9ee-3b2c-46c9-ba0f-fc53c173e593.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e848f57d-589f-43a7-9aa6-bcf8ab7a2d04.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e848f57d-589f-43a7-9aa6-bcf8ab7a2d04.pdf deleted file mode 100644 index cc1c8c2..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/e848f57d-589f-43a7-9aa6-bcf8ab7a2d04.pdf +++ /dev/null @@ -1,2552 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 0.0000 -792.0000 206.0116 0.0000 0.0000 792.0000 cm /Im0 Do Q q 0.1908 0.0000 0.0000 0.1908 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -35.283 0 0 46.25 1.82 3642 Tm -(Di:83460 ) Tj -28.1725 0 0 47.5 -1.15 3591 Tm -(P.ROIOR:ARIAN ) Tj -21.5449 0 0 47.5 210.95 3591 Tm -(VMLENTIN ) Tj -21.0402 0 0 47.5 350.97 3591 Tm -(UNGIREANU ) Tj -15.9575 0 0 46.25 0.81 3538 Tm -(-R ) Tj -23.1347 0 0 46.25 31.89 3538 Tm -(PO: ) Tj -35.9232 0 0 46.25 75.08 3538 Tm -(:C3S-C12 ) Tj -31.9778 0 0 51.25 0.81 3432 Tm -(LENI ) Tj -33.9707 0 0 51.25 88.64 3432 Tm -(C.U.1./C.LF.:RO1879856 ) Tj -21.4526 0 0 45 18.6 1993 Tm -(SUBTOIAL ) Tj -43.7464 0 0 52.5 3.93 3317 Tm -(UH: ) Tj -26.2254 0 0 52.5 93.51 3317 Tm -(SPAARE ) Tj -27.8232 0 0 52.5 202.87 3317 Tm -(PRBRIZE ) Tj -32.0602 0 0 52.5 325.81 3317 Tm -(ESTIVLP ) Tj -32.7778 0 0 65 17.8 3255 Tm -(E18:2X03-) Tj -26.5243 0 0 65 161.68 3255 Tm -(\(62507 ) Tj -34.6887 0 0 65 245.56 3255 Tm -(6-261550117 ) Tj -46.9609 0 0 47.5 10.89 3207 Tm -(AT: ) Tj -30.6398 0 0 47.5 103.78 3207 Tm -(I6 ) Tj -30.2736 0 0 47.5 140.82 3207 Tm -(ENIC ) Tj -22.6023 0 0 47.5 220.89 3207 Tm -(MRFUYATA ) Tj -21.0127 0 0 47.5 357.09 3207 Tm -(NARINO ) Tj -0 Tc -53.75 0 0 53.75 11.8 3150 Tm -(Z ) Tj --0.035 Tc -31.9656 0 0 53.75 41.66 3150 Tm -(00:7E3 ) Tj -28.8709 0 0 53.75 143.63 3150 Tm -(6422 ) Tj -31.364 0 0 53.75 199.66 3150 Tm -(76061637 ) Tj -45.6565 0 0 51.25 11.9 3102 Tm -(AT: ) Tj -23.8736 0 0 51.25 107.83 3102 Tm -(IG ) Tj -22.4127 0 0 51.25 141.87 3102 Tm -(ENICA ) Tj -20.8675 0 0 51.25 221.9 3102 Tm -(PARFUYATA ) Tj -19.6462 0 0 51.25 357.91 3102 Tm -(MARINO ) Tj -0 Tc -47.5 0 0 47.5 11.82 3047 Tm -(Z ) Tj --0.035 Tc -26.8469 0 0 47.5 40.87 3047 Tm -(H00:763 ) Tj -27.8016 0 0 47.5 143.65 3047 Tm -(6422 ) Tj -24.9965 0 0 47.5 201.73 3047 Tm -(763061 ) Tj -25.6155 0 0 47.5 277.67 3047 Tm -(637 ) Tj -0 Tc -47.5 0 0 47.5 11.77 3001 Tm -(P ) Tj --0.035 Tc -23.5179 0 0 47.5 40.95 3001 Tm -(AY ) Tj -22.9691 0 0 47.5 88.95 3001 Tm -(AIRCO, ) Tj -23.0586 0 0 47.5 183.76 3001 Tm -(CRATATOR ) Tj -19.2489 0 0 47.5 317.96 3001 Tm -(AER ) Tj -20.9591 0 0 47.5 371.78 3001 Tm -(CONDIT ) Tj -42.343 0 0 53.75 27.84 2950 Tm -(Z0 ) Tj -27.7502 0 0 53.75 95.65 2950 Tm -(697 ) Tj -30.7535 0 0 53.75 142.56 2950 Tm -(54|1 ) Tj -27.4792 0 0 53.75 200.04 2950 Tm -(183170704 ) Tj -28.683 0 0 48.75 41.83 2895 Tm -(ED. ) Tj -21.8521 0 0 48.75 89.77 2895 Tm -(CERE ) Tj -29.0073 0 0 48.75 170.59 2895 Tm -(58 ) Tj -25.7833 0 0 51.25 11.87 2849 Tm -(RJNOTIE ) Tj -23.516 0 0 51.25 163.89 2849 Tm -(BRI ) Tj -0 Tc -51.25 0 0 51.25 219.89 2849 Tm -(X ) Tj --0.035 Tc -23.0785 0 0 51.25 237.89 2849 Tm -(FEST ) Tj -19.9163 0 0 51.25 304.63 2849 Tm -(SOUCA ) Tj -32.3819 0 0 45 12.84 2799 Tm -(PAY ) Tj -25.1525 0 0 45 89.53 2799 Tm -(SILICON ) Tj -35.8912 0 0 45 198.57 2799 Tm -(300 ) Tj -23.5477 0 0 45 265.95 2799 Tm -(ANTISTATIC ) Tj -23.516 0 0 45 412.75 2799 Tm -(CIR ) Tj -0 Tc -52.5 0 0 52.5 31.68 2746 Tm -(E ) Tj --0.035 Tc -28.5987 0 0 52.5 44.67 2746 Tm -(900:018 ) Tj -30.7671 0 0 52.5 144.61 2746 Tm -(642689018499 ) Tj -42.0273 0 0 102.5001 21.94 1845 Tm -(UA ) Tj -22.1702 0 0 102.5001 91.87 1845 Tm -(LE ) Tj -28.7803 0 0 51.25 304.87 3943 Tm -(FIV\311-HILDIG ) Tj -28.0753 0 0 51.25 481.48 3943 Tm -(S.A. ) Tj -18.6536 0 0 47.5 223.96 3893 Tm -(AUD. ) Tj -21.362 0 0 47.5 290.77 3893 Tm -(COMSTANTA, ) Tj -17.8322 0 0 47.5 441.92 3893 Tm -(MUN. ) Tj -20.6943 0 0 47.5 509.78 3893 Tm -(CONSTANTA ) Tj -24.1963 0 0 43.75 291.55 3846 Tm -(STR. ) Tj -21.3258 0 0 43.75 363.74 3846 Tm -(\(ON ) Tj -20.3049 0 0 43.75 413.9 3846 Tm -(RONTA ) Tj -21.0452 0 0 43.75 496.09 3846 Tm -(NR. ) Tj -0 Tc -43.75 0 0 43.75 550.47 3846 Tm -(3 ) Tj --0.035 Tc -20.266 0 0 52.5 188.76 3796 Tm -(3INE ) Tj -23.9116 0 0 52.5 256.95 3796 Tm -(ATI ) Tj -24.87 0 0 52.5 305.94 3796 Tm -(VENII ) Tj -19.8947 0 0 52.5 391.86 3796 Tm -(IN ) Tj -22.1501 0 0 52.5 428.89 3796 Tm -(MIGAZINUL ) Tj -21.7888 0 0 52.5 565.9 3796 Tm -(BRICK ) Tj -28.7323 0 0 46.25 319.69 3745 Tm -(CIF: ) Tj -26.8208 0 0 46.25 387.87 3745 Tm -(RO10562600 ) Tj -21.21 0 0 45 13.67 2699 Tm -($P ) Tj -15.704 0 0 45 42.92 2699 Tm -(RAY ) Tj -20.5019 0 0 45 90.78 2699 Tm -(CL ) Tj -20.9445 0 0 45 131.61 2699 Tm -(SFUNA ) Tj -21.7017 0 0 45 212.95 2699 Tm -(ACTIVA ) Tj -20.5647 0 0 45 306.9 2699 Tm -(PENTRU ) Tj -18.8722 0 0 45 400.8 2699 Tm -(CURA ) Tj -33.9509 0 0 53.75 14.8 2639 Tm -(E18:2\242051 ) Tj -29.6673 0 0 53.75 185.58 2639 Tm -(52354 ) Tj -28.4045 0 0 53.75 254.64 2639 Tm -(6426489007929 ) Tj -39.4395 0 0 51.25 16.27 2590 Tm -(SA1 ) Tj -26.665 0 0 51.25 98.84 2590 Tm -(ENAJ ) Tj -32.5934 0 0 51.25 160.79 2590 Tm -(240. ) Tj -22.5813 0 0 51.25 227.87 2590 Tm -(ECOFRIEND ) Tj -32.8392 0 0 43.75 12.81 2544 Tm -(LZI0210162112 ) Tj -28.7846 0 0 43.75 228.48 2544 Tm -(8646809520908 ) Tj -33.1906 0 0 43.75 12.38 2495 Tm -(SAI ) Tj -28.3853 0 0 43.75 80.83 2495 Tm -(EAAJ ) Tj -21.0881 0 0 43.75 160.88 2495 Tm -(EXTRA ) Tj -25.9464 0 0 43.75 242.69 2495 Tm -(35L ) Tj -25.7198 0 0 43.75 296.64 2495 Tm -(508UC/SET ) Tj -27.6479 0 0 43.75 430.65 2495 Tm -(60 ) Tj -36.8407 0 0 41.25 10.86 2449 Tm -(ZI ) Tj -30.0217 0 0 41.25 49.68 2449 Tm -(02:1\2540021033182 ) Tj -28.0599 0 0 41.25 269.64 2449 Tm -(642276E020146 ) Tj -34.5182 0 0 51.25 9.36 2398 Tm -(SAI ) Tj -26.665 0 0 51.25 97.84 2398 Tm -(ENAJ ) Tj -21.0881 0 0 51.25 159.88 2398 Tm -(EXTRA ) Tj -26.6117 0 0 51.25 241.68 2398 Tm -(35L ) Tj -25.9359 0 0 51.25 296.63 2398 Tm -(508UC/SET ) Tj -25.5211 0 0 51.25 431.68 2398 Tm -(60 ) Tj -33.3391 0 0 57.5 10.88 2348 Tm -(ZI0221e082183102 ) Tj -28.0742 0 0 57.5 269.64 2348 Tm -(6402768028146 ) Tj -32.8904 0 0 61.25 11.39 2295 Tm -(SA:1 ) Tj -27.0066 0 0 61.25 80.96 2295 Tm -(UFER ) Tj -24.0942 0 0 61.25 170.75 2295 Tm -(OPTIN ) Tj -29.7118 0 0 61.25 256.64 2295 Tm -(35L\(15\) ) Tj -21.2168 0 0 61.25 365.96 2295 Tm -(ALBASTR ) Tj -32.3836 0 0 47.5 14.8 2247 Tm -(2:8210113106 ) Tj -28.0742 0 0 47.5 207.69 2247 Tm -(7290014006522 ) Tj -25.9154 0 0 47.5 15.85 2196 Tm -(LAAL ) Tj -22.2339 0 0 47.5 94.76 2196 Tm -(CFBLU ) Tj -22.8748 0 0 47.5 176.89 2196 Tm -(PUS ) Tj -18.7772 0 0 47.5 231.8 2196 Tm -(CU ) Tj -22.3278 0 0 47.5 271.95 2196 Tm -(ADEZIV ) Tj -19.7692 0 0 47.5 365.96 2196 Tm -(ALB ) Tj -24.6743 0 0 47.5 418.14 2196 Tm -(12X ) Tj -31.6492 0 0 56.25 10.81 2143 Tm -(EL/90:488 ) Tj -29.9402 0 0 56.25 151.62 2143 Tm -(6699 ) Tj -26.6369 0 0 56.25 213.88 2143 Tm -(490919743 ) Tj -22.1976 0 0 56.25 9.89 2093 Tm -(PUNGA ) Tj -19.133 0 0 56.25 96.91 2093 Tm -(MESTERLUL ) Tj -21.0926 0 0 56.25 218.78 2093 Tm -(CHSTOR ) Tj -23.8151 0 0 56.25 311.72 2093 Tm -(30X65CH ) Tj -21.6093 0 0 56.25 417.9 2093 Tm -(BRI ) Tj -31.4072 0 0 43.75 19.89 2051 Tm -(Z960:950 ) Tj -27.3474 0 0 43.75 149.84 2051 Tm -(EKI09022318 ) Tj -28.3496 0 0 42.5 12.83 1693 Tm -(EST ) Tj -37.7998 0 0 53.75 7.72 961 Tm -(ID ) Tj -31.0173 0 0 53.75 47.85 961 Tm -(B/: ) Tj -31.7444 0 0 56.25 9.89 1589 Tm -(10A. ) Tj -20.8382 0 0 56.25 85.82 1589 Tm -(TUA ) Tj -31.2455 0 0 56.25 139.93 1589 Tm -(AI-) Tj -21.2817 0 0 56.25 194.26 1589 Tm -(19% ) Tj -39.8436 0 0 45 10.57 1540 Tm -(0A. ) Tj -21.3464 0 0 45 80.81 1540 Tm -(TUA ) Tj -20.8001 0 0 45 132.88 1540 Tm -(EON ) Tj -0 Tc -58.75 0 0 58.75 19.7 1485 Tm -(R ) Tj --0.035 Tc -58.2617 0 0 58.75 28.71 1485 Tm -(PZ ) Tj -31.4416 0 0 58.75 114.85 1485 Tm -(M1. ) Tj -36.8051 0 0 58.75 174.73 1485 Tm -(IN ) Tj -22.5624 0 0 58.75 224.89 1485 Tm -(BON: ) Tj -36.4314 0 0 46.25 10.99 862 Tm -(/4:0:4700110\)7 ) Tj -27.1121 0 0 55 326.71 1151 Tm -(CKPOS-CT2183460 ) Tj -0 Tc -56.25 0 0 56.25 607.03 3270 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 56.25 622.9 3270 Tm -(BUC ) Tj -0 Tc -56.25 0 0 56.25 676.88 3270 Tm -(X ) Tj --0.035 Tc -30.7249 0 0 56.25 703.64 3270 Tm -(9.01= ) Tj -30.8624 0 0 56.25 784.64 3270 Tm -(9.01 ) Tj -0 Tc -56.25 0 0 56.25 852.87 3270 Tm -(A ) Tj --0.035 Tc -19.3223 0 0 47.5 364.91 758 Tm -(BON ) Tj -23.0709 0 0 47.5 417.89 758 Tm -(FISCAL ) Tj -0 Tc -46.25 0 0 46.25 288.73 711 Tm -(L ) Tj --0.035 Tc -28.3256 0 0 46.25 359.67 711 Tm -(9000221498 ) Tj -0 Tc -46.25 0 0 46.25 586.38 3176 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 46.25 596.56 3176 Tm -(SET ) Tj -0 Tc -46.25 0 0 46.25 650.9 3176 Tm -(X ) Tj --0.035 Tc -28.8653 0 0 46.25 677.99 3176 Tm -(16. ) Tj -25.3634 0 0 46.25 718.64 3176 Tm -(50= ) Tj -32.3752 0 0 46.25 772.87 3176 Tm -(16.50 ) Tj -0 Tc -46.25 0 0 46.25 853.9 3176 Tm -(A ) Tj -50 0 0 50 584.25 3075 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 50 597.56 3075 Tm -(SET ) Tj -0 Tc -50 0 0 50 651.9 3075 Tm -(X ) Tj --0.035 Tc -33.7631 0 0 50 678.82 3075 Tm -(16.50: ) Tj -32.3752 0 0 50 773.87 3075 Tm -(16.50 ) Tj -0 Tc -50 0 0 50 854.89 3075 Tm -(A ) Tj -52.5 0 0 52.5 579.16 2969 Tm -(1 ) Tj --0.035 Tc -21.912 0 0 52.5 597.9 2969 Tm -(BUC ) Tj -0 Tc -52.5 0 0 52.5 651.89 2969 Tm -(X ) Tj --0.035 Tc -35.0049 0 0 52.5 678.58 2969 Tm -(38.16-) Tj -33.7659 0 0 52.5 772.59 2969 Tm -(38.16 ) Tj -0 Tc -52.5 0 0 52.5 854.88 2969 Tm -(A ) Tj --0.035 Tc -31.7874 0 0 46.25 776.62 2916 Tm -(-1.91 ) Tj -0 Tc -46.25 0 0 46.25 856.9 2916 Tm -(A ) Tj -48.75 0 0 48.75 586.29 2763 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 48.75 599.9 2763 Tm -(BUC ) Tj -0 Tc -48.75 0 0 48.75 653.9 2763 Tm -(X ) Tj --0.035 Tc -29.2827 0 0 48.75 679.82 2763 Tm -(25. ) Tj -25.8258 0 0 48.75 720.73 2763 Tm -(07= ) Tj -32.0406 0 0 48.75 774.8 2763 Tm -(25.07 ) Tj -0 Tc -48.75 0 0 48.75 855.89 2763 Tm -(A ) Tj -46.25 0 0 46.25 584.38 2663 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 46.25 599.9 2663 Tm -(BUC ) Tj -0 Tc -46.25 0 0 46.25 653.9 2663 Tm -(X ) Tj --0.035 Tc -34.2379 0 0 46.25 679.8 2663 Tm -(14.99-) Tj -32.8658 0 0 46.25 774.85 2663 Tm -(14.99 ) Tj -0 Tc -46.25 0 0 46.25 855.9 2663 Tm -(A ) Tj -50 0 0 50 562.25 2557 Tm -(1 ) Tj --0.035 Tc -19.9028 0 0 50 588.9 2557 Tm -(ROLA ) Tj -0 Tc -50 0 0 50 654.9 2557 Tm -(X ) Tj --0.035 Tc -34.2776 0 0 50 683.8 2557 Tm -(10, ) Tj -26.7305 0 0 50 723.07 2557 Tm -(15= ) Tj -31.8847 0 0 50 774.88 2557 Tm -(10,15 ) Tj -0 Tc -50 0 0 50 855.89 2557 Tm -(A ) Tj -43.75 0 0 43.75 610.47 2458 Tm -(1 ) Tj --0.035 Tc -19.1969 0 0 43.75 628.91 2458 Tm -(BIJC ) Tj -0 Tc -43.75 0 0 43.75 681.91 2458 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 43.75 708.54 2458 Tm -(5.53-) Tj -31.6613 0 0 43.75 788.55 2458 Tm -(5.53 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2458 Tm -(A ) Tj --0.035 Tc -22.0252 0 0 50 616.8 2356 Tm -(TBUC ) Tj -0 Tc -50 0 0 50 690.9 2356 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 50 710.54 2356 Tm -(5.53-) Tj -28.5573 0 0 50 794.6 2356 Tm -(5.53 ) Tj -0 Tc -50 0 0 50 858.89 2356 Tm -(A ) Tj -52.5 0 0 52.5 614.16 2249 Tm -(1 ) Tj --0.035 Tc -21.0765 0 0 52.5 629.9 2249 Tm -(BLC ) Tj -0 Tc -52.5 0 0 52.5 682.89 2249 Tm -(X ) Tj --0.035 Tc -39.7318 0 0 52.5 709.43 2249 Tm -(5.94 ) Tj -32.9029 0 0 52.5 789.53 2249 Tm -(5,94 ) Tj -0 Tc -52.5 0 0 52.5 857.88 2249 Tm -(A ) Tj -43.75 0 0 43.75 589.8 2157 Tm -(4 ) Tj --0.035 Tc -18.8722 0 0 43.75 615.91 2157 Tm -(BARA ) Tj -0 Tc -43.75 0 0 43.75 680.91 2157 Tm -(X ) Tj --0.035 Tc -33.1889 0 0 43.75 707.79 2157 Tm -(2.24: ) Tj -31.6791 0 0 43.75 787.43 2157 Tm -(8.96 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2157 Tm -(A ) Tj -51.25 0 0 51.25 610.2 2050 Tm -(1 ) Tj --0.035 Tc -19.8736 0 0 51.25 628.91 2050 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 681.89 2050 Tm -(X ) Tj --0.035 Tc -30.213 0 0 51.25 708.68 2050 Tm -(0.72= ) Tj -32.6476 0 0 51.25 789.65 2050 Tm -(0.72 ) Tj -0 Tc -51.25 0 0 51.25 857.88 2050 Tm -(A ) Tj -52.5 0 0 52.5 215.88 658 Tm -(A ) Tj --0.035 Tc -19.0521 0 0 52.5 230.91 658 Tm -(RUGAH ) Tj -20.6877 0 0 52.5 310.62 658 Tm -(SA ) Tj -25.2082 0 0 52.5 350.88 658 Tm -(PESIRATI ) Tj -19.8147 0 0 52.5 470.91 658 Tm -(BONUL ) Tj -20.3024 0 0 52.5 549.91 658 Tm -(FISCAL ) Tj -19.4211 0 0 47.5 148.95 613 Tm -(VOCEA ) Tj -23.7876 0 0 47.5 228.75 613 Tm -(CLIENTULUI: ) Tj -33.6288 0 0 47.5 388.64 613 Tm -(0808 ) Tj -21.6271 0 0 47.5 468.9 613 Tm -(BiRICK; ) Tj -26.8317 0 0 47.5 562.72 613 Tm -(OBO032745 ) Tj -31.5442 0 0 51.25 162.72 556 Tm -(TIPRIT ) Tj -23.0709 0 0 51.25 268.89 556 Tm -(DIN ) Tj -22.3564 0 0 51.25 321.76 556 Tm -(COGITO ) Tj -22.2966 0 0 51.25 415.87 556 Tm -(ERP ) Tj -19.5136 0 0 51.25 468.93 556 Tm -(WWI. ) Tj -21.1535 0 0 51.25 521.78 556 Tm -(COGI ) Tj -24.7121 0 0 51.25 575.78 556 Tm -(TO-ERP. ) Tj -18.6521 0 0 51.25 668.81 556 Tm -(GO ) Tj -31.1552 0 0 42.5 788.91 2006 Tm -(155.15 ) Tj -34.7994 0 0 42.5 790.78 1748 Tm -(15i. ) Tj -31.334 0 0 42.5 844.9 1748 Tm -(15 ) Tj -32.0316 0 0 42.5 819.66 1697 Tm -(0.09 ) Tj -32.5188 0 0 43.75 806.8 1593 Tm -(24.77 ) Tj -31.5624 0 0 43.75 807.8 1541 Tm -(24.77 ) Tj -21.0452 0 0 51.25 703.09 993 Tm -(NR. ) Tj -19.5035 0 0 51.25 743.96 993 Tm -(AMEF ) Tj -35.7727 0 0 51.25 801.08 993 Tm -(:001 ) Tj -28.4541 0 0 77.5001 431.67 932 Tm -(90002214982024D02818480721100293 ) Tj -19.6793 0 0 50 232.9 909 Tm -(DATA: ) Tj -30.0086 0 0 50 312.81 909 Tm -(28-06-2024 ) Tj -20.3563 0 0 50 458.79 909 Tm -(ORA: ) Tj -31.196 0 0 50 525.91 909 Tm -(18:48:07 ) Tj -27.9768 0 0 43.75 852.02 1489 Tm -(12 ) Tj -21.6742 0 0 43.75 713.81 850 Tm -(TD: ) Tj -27.8567 0 0 43.75 753.7 850 Tm -(00665388 ) Tj -23.7415 0 0 48.75 753.75 798 Tm -(OASIER ) Tj -0 Tc -48.75 0 0 48.75 850.29 798 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF"ExifII*  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw88"2 ][i,ϩC?.t>ƾ"|ށ~(;yzt&\ڌ .̇ñ\esӳ*.  UebHY*UDBǗcɌ.3V"deM]|RI10DP#̌dWc2CnjdwZ̺5% Q -BE@R) ,RT(! ShX2hf  VCĖd*Ḧ"  1bd!@[2c,)1 A,2"rfV,y] 7[’V CHiYȠLXbVTIDh.* s(`{aDuLN1$\&BR) !2,$2pʎkV.7$`a$c( ,aAI!HHà! $k[(@E%IPc "1HEȖ%Y3Y}LRI)IEhQT Dh ` ,1 -fɬMLkdk0Q0m:2weWD+T|@{јij[ʾC=ugi^=ͤo+>j>WS˃t}+}+@7g$ dTY!C%+)AU! 0a$G ύ>\Ycl` pB"HA$aa -3cEc)FC ms$#BX!1&\@ *ĘlYe 1YkfIREhU$ T9 v5u̮W! 1!!"hR#c" - l"1HT*%4Yx$$V$U!D2E rT`", -ep¨ B&LC4ll f7Y#bu(549os} -3:c#PA$B!@r)W"q15+B !c=r x)L쾮c#fG2bvʨ\VhD%e@<6"XCB1RA!$VR@ #1AH`HBD+$0`AXLĈ̥` |X&<[8םyVA#)Q$$ aJBAW)F2trO 嬑J;cdb#BEJ -A G !@4B00I AZH BB"q  P@#) J" -Eq0B: d,=ir dC h) Ch "I 8cY LDHI!ʒH $!$)Y Y*:[P - Xq16*r,bC-E  $:Ȭ~ìu3rV(WTK"ZAT P0LaPP$Ej+ N,He00#+ȡ`$*1)ؙS EXb(ab +YD)Tca #@ a U>AOl<5ՓWg"P-*Yl굞էd̙ud 2>©_-vqU_v w+NJX  oBi1n&5SjV;ꭏ!uL=_g(W_2@%hG(vDL(B%^6]d+Y  D)TKﯛ?&Tlke<&baҴWI<د:rz)y-\C_6zpI `2BC R$,b@ٵhlX1d|,g82YTDȫ:BQcz "E+BѮ:1(/m|5vZ*kq:LNsBT@UcI@)``@CK! *HH x1:ʮB,Y/yuTtz1.P$0:C"@ b$X@  @CC -  d ciYD X&<1jIdIA͑3V1&Ȩd2jcuwR\}xQflpDL.ȥ -$`ȪdTK<-6VwwM1S#J`ŕ~}>)@,Wp{)K`̆W +D ,ȈUבg^ ;jd_V[ D1 !e0i1IjbzG&E# *IjKbcYF۷*;V>2  FL$kSWӺ$À<ۗΪi1vur13klY cU/< jaߐK@#^aMX!%j=N%s= P47x1kzTS:tma򐞡^EW{:r -&1eԩw|zMVpŋDV?ٳ6네K鉗X2QW4~/ xU߯,0[W,lyժ^l"]yws/Ks)%*a$!B8 0*dCM1I -FH!bq<2azˌAU]I!FR"4L9 JkӪ9[vezG%z&Ŗ,2wɬMLan]|oB㕆7 1 +IA" `0 -221Q\keH0A%g^pH)SnB"! `#rH!I +,< M!W$Ta@`@(V$P,JݜˑD zh&Nzmby8] /&@A. F WpQqfI|y;^5Yuc+cq+W -Mu+dVX)жXBFBioӄaneXDȁU!L)7 -0Gwus*QY2 H'fR WV WX@,L&s]Bl>ïDِ,Gɋ*dBGWa/raᖒy7V;  -C!5Լ;wgѾȬTbe,)ьYlFI2^YBeϢ&c,VI 2J@.@]r,XAJ6҅ԛ5 -`fl+,`z57t-5ޤr,b3rWYXI (H,$ -d|N, c1Dc*Qd0ܠ"U&c $r*C% $,]JH!$ bP,0!XB+AAZ, -T^Cq&C#c*!cFlfWLbQS"F8VVEլ[U$*:$ UXV @[dz^7SSשrl~VשTRK&g{F>AwW@cȈ* ߷[ߠzGj 2 I_?7"[իG{JηN: P4V 2 8r(=nPj7_=$aQ ? 'lc}ҵ;" !@NoikcGB-YH F82VMبFh3.K$ -c˶q\k欯"eɇ%1XjP,μ٬u>דb#f?C~*ZH :Ϻlz تCй"^aiq;6uVo۠V[,ggǣwy D k:g O}ν27<7w`حB? /C9~!#OۼPIZ\ԩ\huIT -yqseLk/YJa$4R3E@c8`͍ -=HBBe[Z3La6Z eDVIͥs_-o;7{4gWSfur$<8?[e %cf+UgwУ!SA X4B<AV0,+H $0 -iI*BI $ -q R0I! *C 1LI DD 0*<0uiH!5ȄGIaTQrc GuLl @2hcȐjBb*R*jv(X}U-|٪V($ .}U41b@AEr.jjV -C/qLy)c -+t1pl:˙7F3%Dˈ(21Ȱb"y@$WҸl29]70`CXȐ1nKl"AaH `qǭW4[+c2l!]c[u6ss뽙r{2Ι6ݔ+&68V:o~bhxCYک^2(WSKlIrSTAۍ}j_ۣP4EW+ uRf[zWwC8>U8>\!`uh0Bz:Bou| -Kdaj1u\" -$ a̢?V,[~/ٱ:xUm+Ot)[_'IRstDe(d2@I$0b#1XD G223c0j -4" ,`I #'Tlps/`T֦ߑ*y9.AD -@5rŷ/Z\BNWR2 a#:n >=k.byϣSLK91eEǛCɹ\^VoΒ羃YS.\n_&&\d{ tziz>]Ő%ddlfHa(ks-EۻCOPJup.^ :yf5p';:{\,9qy-OpZ=(ttUPHPd5jvtH !$dj,84qM$HF a -`HTG*ƥNδeDߋ3HE#+&sC(_P2 La6'HZ=`!MX+aHys ;@HHK5c _-ٴYdʇ*,[Z{N^E`Dt$F!`c u;)0B)BLp}ב@H!$$TD"@IH $"e*A$Jb0$R("!`@`I^d0Y ``dXqljsa( -SdYq(Zb *DeP`bE1)BdgƨC -GQU(1[ۅ^}Z5vżu "TCzXC!ݩAǕWA*B.}z3m!z|^@Z`2D)V^IG%2**u$ B _Y|&ª>wц<^*ݟ:kyA$&2*C,ϥUK!rǯ  K$٧3irkIY\dhcScY6ug|̧3&J؝X1L]cI -x 1Xˣ+;H LҹSU\XBDx';]  Lkv0B"HeX -T.*ECdd+ #" -H()X2Eȶ!dXƲ,0ەS;mjcKObCZ  W #Xe)*dtk OGF*Đe0r`edz2HiRnYJ'kCЏ,RnT(n"V,w2Dt``_}Zg?~Ij$:!.5k'Rx)e82`)d! &`FVQd A(0R,"Y$$Y/0=yY$a6%XK$$$K$R1  `k 2cr D %2&CKCUR eUVQ1e e"0D+,)5iE&<X_(?>JL\yaHPWU[Yu/Ov˼Bf+YDBd#  -UQ@$ cʭTJUQ⩐2WJ2AؘdˆT Ā@I2cS>5$e5`+a 0ˌe_%o4"5HLx羁Aζ,ܭEdr6tؚd;K/ z)τQfHdrD؊[=z6 Qd -H-ޥB,0Q$ f摇e#Ȅ)#49`S @YD&DKu}[d2@GǑ a dY"rc! K3Opg:ek##HHTV hr`CP4a*F40AqEFQbY0_TW{k1fyoGVdr)-׭8OHlYrCJkɥڊhdS]ZaqOb@J0HH``#)cc0#4 - RB2 YH_d*yI $!$ Z) X$I @ZEb"Ae!F ( -b@ H Jq"7Y A S!F2,EǑe2TP -"Ȫ`]WhaL)1ƨI,F60ͩ5|]'=GRsmI -aU_(w ,EtJ(ϥɎ2 QHPm%h @$0B0bA40$W-Z*H[7NZ !B^rlwwZ6 eqaveR1@LPV-XDfX@JdP$XFRVy/:2B  LD$R!!E, 0I$D@!&ԫgPc"F) - VS!Pd+cX!qgǕ:Phy&3+* j隐gz?cTln+*RFoa5'S_'m2'7LnG#?B^9`+ V {Zs3XH@ '#ߜ]N1r,)"@A@  }O}t !U 7{/F:zW}z~6 Z2@IXW*~zo^1ee as̞u*޷C7Hd[)6'e(~tӶWf9jW &VÑ2rŶvx+*Ryc  OWz{^eW10$`L$e6C*45ufYwD2qACAcA!Yc)yh0Ń rc\ԐV(!#  BI+K`*B`#)$" ! Bu!RIb$A$ &<^nJD2B2P@!"X,*ƪ lUP+yƙq,`,1d*RQ`> `lh=->osz:dX@r6*]}o+ն+f¼7Ƶs'y*e2 aAL|:94)2b!HC 2Hg 6ͽVo& -82xDz"P/ܣr 9#I a}^8_c,x^Qԣu8wd&L,Jd} +^sԩ -0Ho?M yvrEC -*WO[qA"CA$h `#E#@A -+$ g ˌzK`͊:ivQ #A*#3jgEyVbxz;ymn] 5̽2&s/v['a((UW-swQ6A%21O -AҘEPF ID`aA@bJh'^dHE`,$ `  !0D"BHA"!#Sh6(flYEVSdƊLF3eYV)I -2QFP$7Ac"Lc,.0 TJ+$ZEdGX9K3>6:r:2WiRJ4w`H -A"`̧ n'h.JQ)$$pcGcXt8*XIY`E(h$!"ٷR}Z+,4*P~uO=(Z.B1w[7nXD`NbfՂx&H.`r9ܜu)&XöMq|V2ʨ6L.^,$A!'0LbL8dej:)I) 0'X*HdA##H - YPU&X!q{ݭ{Ks6P&H!$:H q400,x+F#) h0$!!6j]]6F @59Q:Gt2$ьd{aߘ!` 2AX@" $%`A#I!(RBI!`"u9`ϣ("I  -Q:(&:V PAHbp(B&czb.Hva1X*4t\ּYq;Q YXuvf&LpP+Uжӑ否Z:+)|(bu>6=% !@X("$R -X -D cB0BL7mlre #%H`bUm[XX^0BA!Ay`ZaTIJ(er!!nWqv$2A=Y .{mC-Rά(uEL#cs7z Bc(~Wv7\vSf`כ2i` &,s}G5}\EE2 @ ZPaC+B!@a$$ 32F nO::axA T$A 0:>5H!05ɮwy83\l٨"AmjK'E~mާg)}t:{k.%+ ,2pdFPΫX,I I+k^bM%2ǛdHA$WPCFt a(Y!ri0 k|&9GcMjź+ ZtYH)#ՖD@dA E *@ !0DA -bT`$d0 *HDU|r&DQtmC*"1cVX`p -DHqdJ2UlphMΟ_v[eUFQQ\*CuG0 -D$`)LݛXIL1$m"vi{24 !H t!0*@@ G$#D y;տח5kRhq )%ٳT;f8) IY!B2H 1`HaCIC $Y H $Y"Lzr/ -ªR $QH\|҅ F(AQ@@L2ӫUϏ*!LpAYV*_שRd΂2[ǐuk9;:zu'4}GNgԸͅpFP[HUܳԭbHD TC-{__hw !E(;~d} -O/x7bFHA (Lr"+'zo*k'<[2NH$ 0gW霺m]$WQIHQ(״x*v|`B{YpǽzlBCŵ\k3cyyqg:ͣ\pwe@pҩɯ$ˮ&&2+w}Zcl>jzy޲ !P`zY^b@ASUԬtrtoG:Yb1V1LKm{NR]ˇzZ#) [)Rs8ʥCų7nx˗W:f|9+3azSzy[ws܏IR|&В 1NbMOC͊ YI08 8Dx2B"xF1`h eG$. B1jy4 b8R`H(qutAڡIk'7\{j(mcXìߜH`*4$*b $dSny$1<|)_+Tk0HD"Bc Y֬J !PE0Ude1(@@ *oZ@!UQdn/ b3d Qd8W٩5R>sdŖj6'CnVyߢ(w\ *^m{E '1~HU"`I <c3蚇k}Ŕ -`*CB "@&o1'JO*j4!XsGrʥ/v>?Xx Dˀ1ϻ֬eZ a!RةSʮVI^}@KR@ I|qv|Z쒟x0ͅϋ-E^8-Kbfǖ28:7(w*l:ѵj=bVwLQw ΡzTI0a%E0@8D%B@XCCDHPh3b0HD4dYZ3o:ս -0c@ aF Aƺ+ -5m;R2cEPX7W -zU}`Aue!B`ς52Tg[盵|!d#@I #+E 0ArR;;UzRJnRѲqv$$TY8{²brp1=sCzz5R.&LZ.-LsZb2&B:c>}yQ_èzY2SDH@IzV)ǒv!T* {C !"@RA$2BAI#l!E R0 ,! V\Df4%GTBBTB Bpg9{: 1>,fHD5vRюae,hs +Ҝ-v3L-[M%LR"F  !RZV2$ ȀR;:[~h_3Wˇscvܭ$H Z*u(KIBBV#a9Ӯmnv;fRPn4iŭ\w+ijuޏkk-%Yj b$$(VBD¡$VRCTHI THJ//+Sw3$,6<:zJV‚P" ZgySH$C" $Qa -1nht)$!e&7Q*,dUi4vWhofyQq͊&4Z[KRܥ.S:ljHJ" 㾕УUkv* -®J)\{'jrߓ>ۭrX1$ͽ&-ED/ n^x!LPd `fH*B -"Fs.x_yg}RM1`D(`x}<{CV>RC I DL -[Ԯwyb@h &o76epA$_422&6y1n`+>q@] %J<e!XF %I0 h!r -e!XdE,V FFB<4(#) $@$`)PˀUYΗ3nTeT7} <}:WLUC|#P]ٽeDZut&,22[#@I$S R2!@¦EdTpw8Տ.'BRZir;ԫ/~OHޔ1 ֕r)eQ HC$WB+3cʕ^_CܣU,VBUy7D*gWSp>l1ȼlG'V(u"*TCAYXS"I!$JKƭ{4gDK*E ZZ(+lۤ!×n[aJS +1cYl,"(J1",\c< -ej&D\x$*H2 `))D*/rz -P+ĽׇٽǞn]́р $*ioۏ -͖HPB)2(ʙ`JB -@!׋>SApт qd cbAH`-VGBu1N!d7ƲscK!ezǙ FFFB" ܻ 2Dj1x 0h@`t0`@Jq`!L 0Vb  DeC!HU\Ah%Xq%faqCi ]! HH -[cXUmڦ2#ɭhS H@SsJ!##|'Ac%D"#1NCՖHҬ20C.tG!FXJ){Nu~YSxNtU660nB ̦ -RPZH`  !P+"xBq8 lMhmYhw%fɲٰy Pףz]HH{R`BI$ JDHA $Y!EνaKe"+3*65\iPf.6&6uF ꩁ3*$2- E  J#BT*ŐPQb"jV:@ǕD&6AId)*Ȩ+H)(ŗ$P &,kck 4F,S@dHLy1VT%I a$b!"JBHV $! :2 :X!2+"S$$$R:1J$Fd(X! 2u(筼Ғh eeBbUVǑ$QKdr XHh%d$&D$Z,"$tK@d!Ii+ 1 )TKy<ˁ2`l FR%j9!65*p+cΘV A$Vac((*@D*gndrb&6F'XI1IND2VXTiX"0DY#^;vηC $R^BT,EdU$HXd!JV ) d XA &1U0`FRA$!²!8d9VSi Sj2*` +0r e9bc2Ș-ц|l T &E>9&rRZ̐b!F%HD!+DP@#LqrnPB1 P$ J%4hC !ɏȓ$ȦE% "$6 cˊ9zkW -cɎ\@ OFm4[>c=C7O,'O%SmOkFѠ|U} >+Shqß4]H@G"NgLU 1}lq:ԵSpvYa HDb`D20]Lk{%+@LX\W段垝f6:^Lg]1+T=HүW)- oWbΟS鍢p$ $$(ZY"@GA$QL!E,0(+e$ T@T$D%D jBEHDG,D @" B -@R-o-z\lY3cF #,Ve5!8!dHe1XFՔ Q8E0(cAAUS &BI&9UQ2BI$#F+0BH&Z5ѩI,h !CǙcRsdeedH޷?"Nd:yK]sלhvG; 옛"n5z4d$ @< $h`1-;˝W4 +Z@1X1F@C 2,  2H !Lyp(:n.nw{~rNTشV6FOcewi2+z+ߑ8` @ $D X.eͭH.䩑ua PUȭŋ.+]UcZcQY4Nom\H C$FFBDGC@d <#CEɮrzLYJ$Ǝ -(œDV찡*btYc  &6%ljl\:cWBI@ 2 FS "`P " WJ5I"WU%I$F*$"Jf THE 2a(,&"2gþ2AU*!!yM.l!2E!2E4`$*X2FX``VdC$H +)Hd)!G.H 0JBf%@Ԥ*d$0DAdH00q -*ĀH2 2VƜ7O"έ&.,\֙- -d4=.UdYY`RW]K.r-o lJG/1&bD1\\6*oLzB民j ʃWQb 57bQ{57;{joQQܫׅZ@$0$`"05y.uRlS&~νfɱf=\Տv$#NjNq?/<0Ȃ*Q~(AUG,Hdh6u+ɽ,i"ꍱfq{q.!ƫojgx `Y8Ji=;l&0cpTfRU *Y UZBFUMMiHjnTuWELnΫނqY#u! -EEY uqعq0 -00DC%@I!`@ X$@Z*Z m ,,~@D G"Qlm]h֜ jMZnyGAbCE$P[fV,&gWط?cm`6t3l.ݣܐ.>{GΦKxدK1ץZ<2$=sGD @$$H@QYC\X"&t\*nhmioח~U[mi+Wۣi\ݓNYV*ݗV,jߓ Kyۣ $,kSЧCЇ@C -!D6:ͥ1ύ0ÎTWAc%ďdGpUB\ -ejvF>ξś]^_OY**:FB BD2HH `("e * -20@HLhmF0+0 $ X40Y K: p<ZE-'QN`ŕ&XhAd&FYM$$ ,5U2 -`BrEebIA,Ar)$WIIb+Z$RA$$0J$H‹uW+nVZjzco܊d䀐@h02yQ5t9a2y/V *^\Bu3x]j}sg]&vmtgp#2byi}+xEzEyɠ8"EI&o>FQ  - $LHQ]Niҏ^ˆ;eJLvzzy=' -z<&zgY)^}q|wz ! -S U1<駧fƀ4X* -'+-) "Il12b"69W|q> *p@P2ɗM62_CydYl -ȂIR@!$!D)S"Q1LA R #A S, -c B) @ZL5ۑv0$Q*U9$"A " Xvl֖C2MGzڍpI6yb,$,Q[:t[Ҧe2fT22Unydj喗"EfGtH ZwŔ)#\E2BIC$e`(2c(`$S `Q hI -RRV -!@82u dJgH$A Ha18Z^v/Bi_g[4ICp,F*2pMAe[=X*{fiP3dF` !!2H@ -m·L=T'ZMfc5"V^O_S.uB $H@ I |~.=C蛳"mك=Z#ؼLz!xa l+6h wS',Z9oK.@W![n';0;A3& ei!Xk4㕯ZxsnI QuBNԶv\"]I/q:`P(! 8Ik:w<};X,bbO*׷fZs';=֡͢{K_4qƬ3`%0 +2.{%tۧ qlf=LB#\F#Çzd@+6U<ˣ~^eI-?HRTTes.lF䧍n{4l^?x!X1IcF?c}2E=Ww(vKQPHcTŊsdd $mGO*+aVGi #2{?NU;ߞ/<{S,L`!0Ԇ@Px"8 01 "b, Q)+ XD2*uR@ K0fZ!`*I 7:=7<0C.9@1d[y*xP2d+!*i؊v++LӃv>DTvÆ<߶W5Kv'n.zխn.LYroWf;Br|#9dE,0hE`(u@DM]>wr:X5r;ɐ<]KUK9y"UKiB(ȵ;w*gr凷XEnt6 XC_Ƚik"h쯩 P@[: kM[PT{&/7H|~%K2ʆa3/EQfG5@sj}2MK_@@%>*^s\]ѶݸbƿX^/W}?eXBHE!ӡ?wDB$HQ:+TZ<62+\7Oד3.6[vy~yORC $L D̏L,Rw3Ǘ\,ܲh9fnMts/>ܓrCEF]iE>㎸&VQ08}YB..T. P h2޿hW{4Qʠt:ַI]%Xp_™1y37+vR\ϕz`sNWn-{Hv5נy=7yJ]PDE`)(\{{by{p D#@y]>!H:h>"o[I$BHaK -ACBV*t.ВP 4E` ^y&*y'f5ޓɷ0IPpi~r:;5;^_W,2jyR޽'z^69UFr:N1{|^u_p#Ce_?{y濦,y R#Ϯ5^U+HHx Vkڶմ HwS"(@ kr>W>i'[6zIKZٰ厄DNl-Bu/>k9,)eJCSsƮ}K_<9_:"0O==׻@  R:$WZ^ıPDB!V! (x%p6u~?Sz<[V56LqgDeQW!1AP@T"7X@T*ve䷃˖"L5" ꤚľYh$[uPh+ S}J"y*WAy6>} -6jgеm׫80h_ty;ס$ HN%/.uS=oϺ)|R@Iq^?Էյ:7C0`5)c,%=һWMbyOWѠ -7?@>ux{Vlz[ DS#$x^u:+˴ςfvnIO1<[=O^~/hz'lڧ0KAb4WeدsҧۗC7—Hsst4-˗ՃSOUJ6[O5E|O-}W -=K)cQ{۸/:Pdq$Lf @`(1#a$H)X !$0fFS$CZ"6$x,2Db!91<4R VE -W-{{G\r$S $[<D7O8yL_9ݽ9W< |wղ00bQxr7$u~Co ,r#c'3HQHJ(`<뭩ӠۢΞcx ) 0ELdfdYYbzeu{9hymt8׮vg&CV_?6.CKm+JLiPgf"lڲ֖oˊ ,dyZH^{?πcuǏce. HA(wOVxOK cPZ(A\yJ61yǤb{FV#ḛvl)/سc<`X>G@.^U P4I{F*bRZ62I A ' -=7@Z&LpwR _RUU42T00qdr``(44璧C"F -a`Tbˆ^E1jpVę.(Hֽ^眨E^Z dJ;Q8oڋeƳjn14Ci%׸|v2m˞@9P5c$ xHsxcx+AyO>Z:5J?()7l!*Ti!QZĔǬ='{ioڬ[/})G yOԋ~+\Q4vދ>&ʴ\hr5P٣"4I랞)@ɂS69+2ű$)`b>qĸp*fn*ީV/\,{Qf< -D%P[1X__"_gf=UJFlc!*ZݧWgvz:.rI 2H(!+/1^}NrR[מw #UR$Y  _'_=^ zZ"U^f/9Xъk#|ίO$ f˫W;&_3%oKy侓]>n,󬻤w맴ioIu^7PXB> -,G^VXg]xu=Fj}n@ -eǯ7z<._RPFM]ihF_FM*ed#2J910큕К eH4ŀD"I$+(dQ+k #0R1H;,V X 0I!V X r|c<;tDT|P!G{vŻ~6clI`z-KO9y}7u+7{33TaJd|Rzj޵kҟX1b` a# -C$Jb4-}+69"$.E D  "D``n.mp,]G& \ ;9<׸i':a`^ڻlA$ !#)*bgV˳WfDZey}2FWkeEWՋY)C0؍|&LI_^_|kaH1PWȄuk"R"(@`4U`$2J1Ɗ^]-)|c=~ e^?Brn(`ɫ?Ti@ti0ffGZ]P9s=}]{N T010wy [z= DF $xI܃^)o "4*Lw/NAykǐPO͎RFn_*eB}CkegrLW픺KWgmWltt7v ^aP:5^礽=z͗=F<7חcԯó5 Sp;uŢnT2%3ֱqka0cP&[NzD@d T:"pw:WJfד<̾yGşy*W1v10yy1h7>nBcl{{˅ky@!-F -!,0VRN"J|zbN~8*,*TEaT{Pk.+zYNT} ;`Q2$1cL^uNnpgЬr<ѓ.jZnjrVIHws\摡G/"ƫ| -{:|rs9EdQ ԛ%)cS<Y -e/ω˺%23c`(|չ1B\~Ez8/V@оga[z%x6\Kd7"YAP8)e( +Kv/hw5˯R$scK9ǴR5}VE\pA\_K#v{-|Yzڮv.16TeǯۼONU>˾E=PE?=qm;ҪbL(b"e5:V;--.V:m:loѫ'7^-Mcϙr,U._YVvLu'Fx_vwGa]޵WV.?oG*5ۧ|٩32Okԧz2='{CFB!LU eMXq]kՋ.ZS/T-އ]cBDt8ysg\+ .fO>mKӵ q7<_zχE͡dBo[4JϔkX=n?c<;<ݴ[|z\^qɭO=9ܽ{ f#nҕZjbQ/q=;^Eޯ)qfǟ./4̾u%j1[U+zb_Fԙh1.ͩ{cLѴҮ\ӷ^FPI$ \PG0)V4V X;!EBFE̒H !ak1abCeF2D7}Úc~z۾:UɎT@HW)ܪ53fMG66yNGqp=|}[;TE.HF0:"&Qѡ!$V$@H`!02%/KpV$B0 `P€2#,CG= ys xƅӾ6dúqSvjwv^ĄӮTnnW^i2HX/ $X,"HVXI!T(d( `FB  UhP+]ס -p2vA4d$ _#)"P!|+gҪu+МЊ@TȚ((y:ɓWFe SlQ{2(ؓC6K^:fJl9꽯l1&Z@] ]np6zKwm]L|%e6 =2V%oyM -Ǧn<<3[au;: .c$(I>1xp\Ja{ޑ澡1GXuuVlXe=w~OsLgjܫbbצۓޗǰr<+=+ͽIXټXOwVǛ ǽS̗5f{<'6|^c3&xaK_y};OL;7[^]ԲEf!枧_U|輵ZٯXPoQ8]YY:QX.dǪ͖NxFus!8X^7kN*ܳ' 4חRwV5,a3x7tznȬde#|y8L -21HB##,a*̼ ŐzY)dju XҦQQWЭ]!K}k./>8a$^o Q(l᳓γHE RdNp%I! -7 b@a ޕ懤e)RD$hyVۛ٬XWiZrB$26*"EFR0*b[foc^#VoMٿyz c5T[.[ePNj.@&I/[7oO!)$DX@Ee@HT TˡFp\dI /_;Lutv[ PӘ!P$(U>}TVQb U#QQԩw]EGҗO枪]iэcV4emiP@ublU`h&o>x}ZTCޭ2B7z6i<}O]ŜItKT:ڽRo >S];[tlygBS"tq_>j}R>B4c"yg7XZoxd2Pwd^?k u6O0^OٵqȚ{:5x5_ГgfvVۛO>yw7< I a`E&HH@a!"I 9R@b0b´!$TȑAW;jNjw$TI -0FX* VVt|WѺ羅)Ll*kےnZ.Tx6\Mu&EJIߟzSY$hA$"Ҥ 0AI.}ËU o,1! `Q<[2cZpyv䫤YP.\~xzL|h`@A~O0|<iN,*((AqJR- $ʧ-yoDX -j"TFƼ1yÒF$ˀԪջX͜{|ԕWtMVJyWv]V-= oo=?Pkm-߸yl?g׻G;r"=`t3J\k_ҏ%XI᷋ O=߬t!BY#$UV>y7 -WZ\`I֧n"ϭkKUjK{OXO(GwEz_/f!χ5o^S|D\iR<:힅qrسFmlyyyzbRz5>yTzygZϦ?-s8β!*~ƭjݸ|dZn}2.5(ޥ-3i6bzF} JIK x{_D[G:=$ F *da0brx0S" -U@A!FRG8$>Gl8S#+ $AYJ|L+T/<$&?7AY6$@ehvR|./`J -bT ZNd{}[ *(2&5eT $*X܄킭*8wuu -J}mMGsq>5XZnhTϛVmiS̽CHͫo:UN'QS}[|֌T[EsB鐦ZY7ݚX|[udW:wΫr";~-ӓ9]Or0 L:;a[[3yxWY5$]2yNUUE4xR_ĞPkkz:Uf\f-n*RkE z6Ċ^k|C]Jsza{ʮk+fV-x 7תzҺU_N0&f-mL6<ˆᢵll3zʟ>[ny-szx4gNsՇNZ7+=}fɯuأ.֞1S];y;*]:{rq)^h׳uGKwNˇGeeH`HD"B Xs*m !2Ha$1 ,Αr&RI!).qƩOUNw۳v$2@'q}w_0V)~83:Ödk_^<9pzk/=%1mUF?>t׮vزi9*޵HZ3s:vO(mBr\uέgu0짞z^^=TrݚžDW!eŖyz[#+ H`X\-x`*HXth6Ly$&LYAHH(bRp>J9E0d(BI NK˗ݏq~mybukq+@[q7sm6moZM}Ğy=#)c5cϧbV"$,!RHbReŶZl5h;xcF:;U[lJi-,z^ՀuHvM>2HHI R "3)$, ȣݩWOW[5TZkM}|˃b-ˇW 4vy3&U[Fm[\դŇD[ -=֪[гVBǏ&(ةBZ[OY:tJնj^w@ONfDZ+ںr徜d\[z}UmByPENRH{,^0R{kd5OymJ"ٟgb{&Ş;mT-v<䓩9#_>}*Un<Ҩg_D%9ǏI&UZee)^Wv%׏ى]k-5WGK> zgl+͏^oTFVdw͡uFuȷWR!hPh`̤iDE $ c{\Ȧ@1VF+ 0B0Q+)Vlc2SΞKElޘHLjCZ(^j|1nUSvcyOrs3С JzsN 1WK?j%%q۱DfzXx_lYBH e02$9(0bАO<+s:Y0I$CJ\F*Dzp -{rt.F|ʡ!V(B|ldC^ nF0oc5Zs:ѭF*NV:gGw44 G3<[ڽ<@$2cI a6,P4@+d`HHH BHa ( "0B+Gꥳ]M8=3kei8$E"XѸxؼckg cdh ihQ {KSC[}g[˯V6tע ۚv^PnFZXS5mi஖G:dGsiFSd+)o"RaGOJK-?rm4yyu枵ֈdN!_sҸOfy`8>װXbK?ljDž:-,{WWlt(Zu_ף.= :~G^=z󥥎Dvt<$\s[.L(|+n[҉cYiz jtu?H;t*}T*txO`kl<_>}+;IJ5rTڝ-;]9)LdRZ*XAji˻Wu@Z GIXiSe Ϳ;h]дTܖڤJU9 kGI P#Ń! TGR8:IR;&i$XBB b1BFZ[Ζ n1 $LA"g$ؚ6ƼͶd@Ad!R$$44;98yӨMɑy,Yw^=/*yny9)vgB0^ a!P9x-q.>tUӷszC400b`&>\-)vѱٚ1#W +)|oBA !Ad=JeյL/dn &Psd`I?|O+ +)BH"|r`"D@ -`` -4R3p@HE1.Dhc%XT,0A?3PLb +p5򫷡.1תڗ.J$놟r7izPF\ф yA=2$M/3\&HxvZS*7+}񆭴ޢ681kw?ElxߤWMZwʣ5}s׸*[t8y,{uJιK|NnC " -ޞX!# $HAHDXPVI@!]TV C &Ah -@@D@@B D\ $@׉5X[jÞRϡ}BȮ.7r@C9ē?'յje%ɦmx\c}C-fe՗r6)I1:ud5?6c%VHS‘kVsz+(ҮZwR9=W6e¼촐>MBw>7AQ#Ewlɻ82S/FX737Ų幫Jm@[^Ǘu֤Zz}vRdN<:4ӣ]t×> .,Ԝ˩_=Ǒ3suG]Ovw୛,oܞ:k%;M⑇BSWl 1H^ d*B`I c -\,1V \CAY$# FDWX0"68ɍUە,XF.D)5a6/U=y/_=V.:V쐅`$V !8v]J>&ȭ*U5fJɖ.LS^]+}:3cc!RH"0%`LdI@~^d_:ؙ%!2I%d+ش7Vvzr#f !FW@2,JCW[8^~ X L1Dim̟M8 !a $ U+ $WYP@DR"$Ah%[ч8"FR $$ WB26Δ U`PB0J\7uO>)vgLLq}>#ƳEmwc(yitG+)WIDԢ'&Dyz;gXtiC^uk&~EOJZe覶y|Mgox=^A5:ڜ[{垠p{(^bϢy6{v0dQn$S+}K[ڗv(f`9|[^7fY4>myհQ/̹M>ͭ%-ҽh2+\d&U9V@5HeBTII Y`5 i@J9R(Ò^46)9.zίY #h=3K̻]^0(G(iX%0BVS @ HTb) H`$#*Bפ߀B*?#PIf]ŗxއY<15KrдqeWWWvK I -^S9gӫk.:=eOR^\۳wz=1hި[-+\J[b*M*X7NJx\ν(6UW> -8zU; mM Ϝ+"^K[Mu2.}^moj:d<&ҕwwe,ZšgK6ct>]UYbk[L^k4*XizdXOǷ_bK~i\;FwO.٥y%F^VfyZ4;L_);_ҥ0ֿ s:ކuxŰB RxŖ<ۖYjޒV 8 ȶG#CCf.|zKWn^Bz2"TvDf0HAH2h9p t[ͦhV$826mlJljER;ϝoj1l]>oG $ "I SWBlmW՘z>SqZxv>&Qѐ @RHBH4]pjdcDX $0A : Nyt[d׋LmuMS2H"0@HX@((4Q@ -J6<lM R 'hƯ$(X-.+VZMXw OQήT-$͞t[lPBTGبѱp{GKKd\^WM}y?׮jrxwS/mwwWavzQW}sgQ/zUWMޥg`yiuzmgjҙWMsKMڿ`9tKm[`ּ͙4/}c4&v+]%֋=K"J,4AೞzrڢmuШl|N1x_2 $R")Tq;i5(k;[Gpsm^ܾ/F%W{IC_B[}nd[i5IJa" J+ CGG c@" q8e ! 9;QI &ibٹR/sF e`$xuv:ٸ OUpM8 jI BHD a@C$!#*ВB+ Hsf$@ *BrD* "ȋ"B0`]C`B2I $ "*>[U2=&jQ/|ޠ L.O#-eKQmu69[|ۊeOrAQ(9y1Lƙq&:Ǭo/6d=bv2ch78_&qr=ڻ|siZۚȐV -@C o*Y{[jK3(p}6{э+vw$9>v{6XT1O@p'Zjq21SsЭYkp96popgQY*Jyִݵ|׼ݖΔnE.1<ԼnK񮙩~}"=#nYK60lw ZoGWl9ggP(׏_r[䞑ʾU'zN\(=!\F"A{NStW̽ANU_dArR;!`tRh  -1IrLtv\>1R:-|y(V2yz\JV%d\ɍzHT $ (`FRd UAGL0I `ezH!@N'jvCx/RB)HD^x_Үcu|WJn $2PB)px%dӊWOy)c'B.8HdJSsTR"ETDEǑ_Ľz aQ2LHfhz^KMCN{I)Z͖;ŇXڮضFYه/QAn 6Vc3^)niڕ" -U41u1חl؎h6Y4~ĕo[Ǔb:< ƥu4Wd0u7,+cC -k]ןUM266F)@Hňl].U>,k-[&-$d_yw高iI:M뮟S Zέ-8u253)Fܦ־Ytj7^CFj%*4Wm5jW6nmSWӶ]D'Y}"8MK#2-mpded%rQ*X&0]2#hH-X`!TZWt1!)^EF_<]@ܬVϥ +z͏>*:̣?z׋gW=nmOIlإBT@BJ)fR$!aa2P` A(̯P@s0`[-3_!f܀7%zұ[`0,0`0YηIlUvZ";ӁC 0 -,"2#, x,WaS2{uHVHHV/ѻtRr{yU(PaUf~>{>NDd1di!2,{g񹧧`̓9Iԓϵ٠ޓKܩjU=kpu8=؞}ugS>_:+I]Ɵ'jW^n.7s뿟qM^=lH -#9L -mr7kg -rޤSX폕*҆fzQ/++QC67^7oD*F#WE2h"Nbkէ>7$$< BF !0d>'L afR0!*$>ZQj^緒K!G^_Gq3\1@}I\ 9\2CObi2i"E$Xi200X!$ RH@Hb( luݼCA -\,1* -( 2ADX$C0 -YHAr@MH $J@H BJ Pr: -°TqUDkNUXV3+36dSKsVWѶ/}2fhB!+.1$uu*^vE{vwvƙV05{4U% -;ii{Hū-f*գp: ңޥJśӻ@Y;&_}C#a ȱPDN1#OPťCu6m@*|׬:Qykw9KE{h, y|.:kJŖ{ 5qlf=gӓӥ{.EKb~z}z]+PޝD%y_гb}OJ(^\TZ1dSdg "Y8TyiL9[h\Czqp{}eǓs{YЎ5n{t_:P&ג6}G}c{ o*ήzl.Sb-oj]yqӖ``:̮Ss/@s;*M!v͖|IuhHaҼ$bZ'KYuWq:fL9k`yǤu),8^1?W=_S*֊me*`0$h@L@X  VVdt24IP14idYB58Ke=N&޽G<L+z%h$ٱ릨de\o]G˒B  DL(e)`TC,ǐd+ÿmdEq$Q0i^YE("#H aU` "I%0b `D aA 1 e-tn&7O!fړA#;=Ձ5cz`oSTIft6[lCtZUA}?#)4꥞Ovɭu2ilMQ.+FCSgdlԤAi}*6=_-BөojA6!!uUr<+ܼ7;y,oG cL$ rai -e Z0 -@$(H -I]4UA:uq__91̊ 1XeU}N~iו9ٹ}Zkv #+T2J Re5+ &,Dj|X=Kn;X4 H$moQKY I $PXH! A @+ A"DB!Y%"BaɠP⣡ofKCD*罵%[sw+om}:2dEeg U`bլv]}7`+Vd4aAٛ];a56|9l%?V?0t+U Xӻ]SxңѵvV|[zm &Mg/#B$㆕ާuP_#-P}gi|OkzI+o3ڢv%Z)vӰsVD+J釉ޯ]'8usY ,U{;2hNo^Rz#='wֽ{w!<=x2Oҷ{Gͣ}/Y>Kk|3~?5)LO+yA=xc$}:>f 5} ->{y>=_#9<.9i:T;Q9ݍ3CҮm!||e̫mfNj;"8^CZ; ҪGT)>eq,j_cvdHa$ABIa0 ' ,1g:`l AƘD;09a9Mi&Rp)ږgKҸaWn'e>~֜tO?/L@XҰ$ 8]jW}څ"򸹬g|G-RdqBH)9 -C>]7 vV}eUKd,,29-lsɩ$HdVHI!B  2PH$HH $2,@JVB4$2.9%ȑ:E $/HoITN rEdBFiڐJ^|ؑ$UHu:Mhsdi$UFI@ȋ$&)#ߒI^K9$4Zri&7NJMY%ݒcrI#!HbK2<,͆BmHke7y53 Rv $ (I +$k4$D$ S$$$!HHMC$Ua$$$d $I! $_~HLrYC搛.v'ڐI$ג51I %kIK5Ē d$D2h$I %$I I1Lhd LpddF|2X%G7!I$I0erI3c $$rII02JBI*I,E~o$,om#Ԓ #G"uȞ[ّYj +$jޤImnq̒I!@HgI pɦ=) zj& #B@$42aVH*!S,2CI$d6$$i!d%<$>ăI2fIfؐc""L$d]D$2C +elDy$ A% A2H">9+GWtT=c֏O*6faSݡF/}k%?#G9hΤ.ѮZ*?c.9mb`}&:q湯ͭOCiçbI4G425S6sLPpz=齊$YLYNא螓 _κyY*4V -YκuԳU=ݚ%3},J̛eGy<:Xx1gO\XXyLJ8e[iS ^w؞qd94p]}&`=z#<Ɔy,8\ha:ytdOh]j6b=o-q%{IRn `i@NVn_'q( py ͔r^X} Z' G|]DN˽>^`! /bijVev: r{sM)J2t()OoVQi i(F;d:W0d  .vwXUtǒy58 dM8J~dX -m3oE -~_o2Q赚H)"J7#OĆ'Qz JVK uņ:r'2.c]OC)Mkʲ.ɠ3M0R{(*+sЮylYԩdA*laB!Ί-sM3ˠL胓^[\{17(B=}q΅su|%6/=P_\+hMiuΈ<{ oG^aLF0BtDiMY&:`鮧LDI55sIJ5}vMYf|1rwiNȰH]h#o%héV3`-5B^IeIFϰo26-th@} ,5XXR#mk`wf dӈW\$3L(`Đ:7OP}e-뜫 w>jsqq|,7};x8S_pս K» ~&tyn1 qL鸠[?Es9ƄKYQPB^5>O[!bl_|;*f7AR1NwXdhPh!Sŧ8fX_ A--O}+hz !,Z.Mas5Yz5e#\>Dh1#خ `> `'AζkdrG(=0qFU)?qz?ѡ "[a -jwb݉}$xWɢ8m@\Ή$V}qO卦#~I2TR>g'AfOۭ9ڞbl].Y3݊ } z8*D`K~r&@"3Fo=y'NS3h$:◹8]Xq? $={?.dE3HJ=aNmn+y0[V-b:#0֤)ʍ%uU&`NH4;җ/t%H]?:O 稩!u8lC h4ybIQ)}yUK,_cxK2/ɍeG;':Dɤ -CLl r -:#QtO ;}}}ccJ׮NTxMkD@4ПE#s#$'V?f hC]2H5;tJxf1)CgMUSC77uwYJ0g$$4j,|GN$)(DGr~""ҷԮB~O9D9~$ysGy))ډGҖXMy7/YvUSH}"ȑIۙC5~jAQZ?Ar[u%rMY?f^cT OWxM+B _ImUrД5)vʲIN3I8Jtݾ~Y:Ixt9Wg2ƅMh[s2MY^L[GŔk?6 -s p/ dR dohSA_]Nwo hEƚ$#m j|QV$x,ɫif'k2髝'{ycѰsl.`8`YWhHQ/}?%@3h!.cNܾpͬW>ÇAeVbS("gcnXظ(T@3Z3rEQlKEIc"J²xdFz3+Oa92*lEx:(e!D*2US{A ֳáeЎ!Olnѵ bHF_*A9x-5AO^'v0sV xΎJ^_&Nl6d*D}G qfYT4rޭdL,$qwYкz\C4Vg==E mb2-eanJRU--][*i;y=MM`Z|_u>"=;ҩ&(v#VyΉ I(Gjc_L*ivfg+=0TvhB@G_G&&P$ #U(:J.<Ҙ-W{AD+rb\fNckyōU9`,]_1=udo5y58+Ny|{ -xap3OI?2ȡz=oODQ/=_4I{D n68ii9xYo - FOI&mr -Wo5:ӝT.Z'RDa>UDu.ě#4)1$d w3hIO:JytwnuHYE\b $:OW6ns\_m*TF 醅u/5ڝ uu$ I+KS#; g^]b^3_[Uz(:Js>bjA-+˘It~ٞuM-()q{. Ұa,ٹszsȅ*,t2B5 8ﵳE PAQmK.7j`~ %\'ζ|fe<$b2< 2; +jZK!lM6ŨǂK|:mlsiŨ9(b2H0Ѣt7"L2>%"ٳ-nyЬxwbrAhF2RyNoyGׄ`6^AgӾK" -2=[fʅHQԷ3\R5~o2|_qLqN!b QKq̊-͹0}5ډ,FkX@)9%IXUjx{rK73h큮V,F~-<T[d91i?ȭJfj( -+3q|Ī2"3q_]iT{Kq#:ۊ)5=ZgVCv Q| ZI[qc1:D&xㅞDt4t4׶tgM[:z:{4zRx5kAuAf;(̞i c}SeR-r# B`~w|O\(r5i|oҵkC$Z -WH|+LjmsgΦ5d84@>m5>my-3j,@^4q zwHx@錴b5Dɑ\bj٧Kϵt䈌Ὢwo#GS$ty9#.ޫ,%W)Jv:s-En9e\ytFu^`-DlWMv*nXƠ2rDtJPHJCǦN^6בhѣz YNJU$Zд{X=&i/1#RIH.\I4֥ʭhI8oG'Jv9z3Cʎ2Vй"ҿ(6ҿ hRXuZU1:ނW4eKB0qZvje]/ ]$sd H.*_p|$KJ6ɪON{i5sʪgT+WO!8SbzOS.%rȩ:*9HMC:{3ۿYk]Y _UYJTvoxfl9,^ $ihPnÂDooW}v_ZJOg(ڴ1ډKS]Kx}CBCkOdASbq8F\i~aO.PfwyIW1OԳ]Nv!>a9}>_p!έj5VNn9>59jpg."SL1"} .u~F0VE\u4PI^"A+^9]ol8i*u Y>nG-TW]^LΎ -=kXs%Iuζ4kjx'-m9V?(s/Zy_Lе/x5dq|ZMsб /&IsˬgX!zʊR +Eqd"8rB6TGc҇_1}8~TIF~ו:KѿzC\2F=d@5(rkXKT`UI ҋJ>W-E^V؜D?cj$on~$8@Q\)m-GP;RضXp=\\p};ўnJ0?W1R$ȟǾ]uJ)*m?D`6otrzUCyY}2^CݖX`%݁|? IC'WCħY#T5)qi̭ P: :Jͦ }(X|/ BV>xlEi 07^vpkq{G%w4m}inŹH{GĢ-hw}9wr&+M[^ C UR=ae UXhǕ*^ݻ9|K#ˇW)Ǎd;pVT:;s9l@d6R3yS -aj8s PJ&4ס#L߸/z 8$^z# t\Gkϖ>,T= ɞh)Sn[)mttd@X_yrx -'>^W;_Fzb= qqXj7#LT׍Q&]guYe7nJv)h ~Fw_q"-vrp#QN+JR7+=:s;*YwG++ڊӑ@J=ͭ[6ml١ͧ493Cd5#AI,Q}k<rDVR3xFT?ܽ!`ݯ&퍶 $]O$f8UizRk,%v+Dq4s5P~%V*:t5"l<0hO{V!mx,رM٭p8 #RΒ-ZuqfvͼZ1]xHkq)Ya+#OFz&xu bhUs-A.P2%#@ێn9[N~ +naDS4>2G4,p$`Ț޾|fDaZY -/3@AS[&zC6+=ȜM徵#hƍW:g/_GDj3?lyacL3el[k:YκySOec<|Vr. ~PvGn}"Q}9#gȫ2K5pD˽-t>O9u|9Ü`rg'w۞HV[LrqD5jDk _@6nNpn9RsR3Fo\m'O<$PL~kD$>` 1]<j|PjhUE@}ʲ3M䐼~xƛɇNQ>?$B>VC14l f۽6+/;ė%ܫieTW[z}#p1Wϥ2Eӥ^O@}a UbO3::9Yή|&κL/ȷS ʧߪU,SC:^utsOG "&U~FV)v^5S螡;} / -izJUΎG1RHJ~z)wt+ MO1#%.y百ygg瘌}nğC#6uK=>4qNIQj - N4&4)aR+VrG^k֧59jsX>6m[ rƭrȑwsw:mށfܶ&j3=ef=礹~P@>MnJע]xA!QaK! Q :xMiz.«0xwPTњy2hURjtv(( ]S]3T0bmI:}g19I.:[YZRȧhaeMo:[yNΖtvpհE @pnv)|f', ~W(ڋ!6=oNv`-_s!SQ̶Tŏbqew NT$2_EsVeo?q\L49fͭ6h٣gϟ?9="aG2盇WT_eA+$Ǡ~uq$]̈́{ A6;)xY>id2W_ŸUw1 [s"u \6.pcLgR2cG#߷kDv8o[<ڮy%1دj@z'yfv#m>\KHʧTj' ~ԑ)`z!w.Ѳ`_Sag ^7voFa}Yx6rfh ,r ylXc>q&{x1"D<̀>eYUXUMe\~v`ٛFhaoa2 G2k ;DjΎLZ~l׺".W {JG=`.`mVJr̄a QS/&CZ=6Myb_M۬hP r.H4PM8%{eA xy`ȩ=`UۅGT -0F~V֐KQ]NjsSȉ,e$$=ᯤA#wjsqƂH$>m7!I }beMhU"׊=BrEmFPX$=K57ԨVȄ>|"nlp|e9@B.ͭ[6h٣g͟6|fjf[76nlٹҳ>Ngy@gS:V]d-~&n;$|c|g;i]7 rWif':gΕ:Ys:YFrg*r.r.rlY`O?bo2*}-F$yLK2ml뫞ٮLuZ!HHV9sNb;BV)S2#B2b%>2ۚ>=4ۛ}=L;Gz< ͇49׈"Of -;ue&E7kNў@P޽7#ERm 24[s6[mzٷ)`1]JGW *W΂E^8u۴aH:)mpض6k2^aiFm=tUa8T4#)iC?vU/SKh[1»ў973ɥQ~ -Y -hE ->P5pXcJL9[AB^K5p?/1d=I..3gR1($c⾃_4kWG6b7qr,gY6Ց+s݅JWGBu2n!_Tp%c/):VDQJhex}mOb܁ Ydꪟn}l*o4<=3{,0|0?nquX -H [-| Βt::%|`J aΆ!/<sW9ؚ^Bq'f~0ߍFZHڨ՗j.ՖY*wlwZy!(X|!LU9rTOFHao0h7%4iZ>6ǻan9--j[ -O˕7l\{trG6 mVc XA=+fY#>t2W5IӅEWN|eOnGӖvm\2Dp.hVs&&⋔zM^f:| \Κr/g"r/'`rlYf%xiijGZ_NdfD F[B',L/tiͭ[6h|mHC#G[ϿL*|e.N;*L?jsqNj}]zHu>_ytai8-ד3LV,N,7ĦȬٱ"}Yz1%!.>q4ܔ e̠3M>Z@ @wğ$pD5fF -uſYQ}b}0cO& - ֖f]K \sb֝dg.lnfKyxff̾3!H'ӕD<KtǿHi('+_nl X D !#]c׈EWʖ+B;#Vӫ,R}*F5p}Ib\C9\CZ'ղ\4ظ>=S] `o؏UcR/#w8tKĂˆy#-䜔іh$WM5c r\0dd1=fy9uqXWWO7pmFIҼ{߭(#pȲ{Ce{LkjsHs˓!,Srf>dxh]Ά!Pω3[8-wϥRVA u>|5-~T5v3l n!sr=|d":ȡђ:SG T4]9ˤ3G9s5,gKK:Jx+VƭSqD賢#Ѷ#ݬUiNtdRMPGsXXS Ýf ?]dGYQיsf5%7ɿZdJF~6oK!mw~XʻɭGHڟH>%4Iیz -9/r͆UfDKrfOV]4 e#yX/zbt>]kY| pyލS)L[Nhr(,[H(%Yd<',g7`{HgTG?QW:-&XA%h])\әlkNtYvH@6@ht)gjvO 9%6C@mENRgN]舆m5ŹU(gp|mMʏL?E=:}A[hr]C|RVFxKj(H ?R?þj۟6Q-y28d]Gf2yԛʑ9]`eA O8TyyF1#EP-Jk%m܋{zG,r~~z]>/~9wZ}7 ]wjΩ( ݚl3"35龜lE"5T07W3s9wrɘfGg8k#LJ@̭emELټNyH7sV5>'կ7|=q͛nl#%;D*8V}~T9ʃ9UGaέ ՘ HZ&l8TȐH6t-gDѾto>tG6tSgA.t` Ή*SM8ɛkm%)9>([t+op+ -MWvZASn(ʜE9'B7ƯnWR3QbD-)RF1n^6HO sĬ{q {5~L0&;)Yno&؂]sG!>-GGgJDf )!#ƒ‹E3}\'Bl5$8{0$YnV]P_6 =N]̞IiOnsៈ`eIo-4vkפ~a3iG.>c5j=,gMO:ZyΖtsItgIt᪹ -o#I&GU'x`٬QbJ9G}A>at͟&e -ˮ'&rͰmƦc$TƑ,QPe`Q԰KPe]uZ@Nº7Ayq<+hSтneN2@=+d=޳ YYX_Y($a >+0Re/4UD{c0Qoov,*' -G#@83CK F+i|v<\?+# 1עY:8~%<ܨxNZ-zy!N2Ez#&<=X\du -}E]IsgUk@{bxɉnMmњdC?1c[<ƶCb sS鴰#m~u󪩦,8Gݚ&>nrOgHܒ$}n:n?gݟ۳nióNxvmṳg/g/g'#OC:j TkUN̳lH6F /:jHr"{o$ˡاq3zBHß-L;ŵ#=ۤvI-8Ndj:#$0#??߆4o8EȲbGfoPF -Ser:x|co(  4qq,pNWN#ؒ켈bVۜHT -8DOgxB>TR$y45s-45GV~d*YJhY3ȿp׼Cf>͛2?=alگ̶l`ۈ1]pW8Tr Fno>?g;ᓋWjTOz?HsqG5ɣx!sf㛏Xc]=S}sa -Άt4 L$.>"@=aOK􎜠us n'mvK\u1g&,/a+,I4"9aqz=n~A7\F xJ4xFQ.RG -hiOn)s%/  } 3CgX?>MWN 9)C.ԩ1ԢG!m~t3‡T7sy퇿{f͚Der$kt$)v5;_~OLv+8uYrZ ' I?͘-ğЬˡ>Z:t-\4ΎtPgEt1@&yzg.yvynynyi-9.Sn#<[G:ʓDW7K -N>}9bWD:f򟖽V]^rB#2ucq+j#4V+,1t$Ѽ)܊4(R˓Ejd2Ž? %TX adMR>O$OqW5wMЗM /2_>+-6'Ӯ}ڼ~K?M=Yk]tgO6tg"\K3.r%Lɓ92g"\K)Ԅsʗ9R*\K@I.~\[xH'%c}=Y؝Gvy&$jDf (w65kcR ZLşjqn M@,W i!'[gH$D |}P>x3yܩ Ft7GI"&zw2  Z=uUV1xyC2EUQRVXaCJ~jXu*,8W9sW?zV:kxJ@( f xX˧g6fC*%g\/'\u:xμg^3׌צÂ~z3< R\=9,_:&$YQ0xM׮զY+]2y^M'85 -w}DU6>bg˟h!*ٮm{l?}b)_gOIF=AԬEa{Ӿ+Ű?5p}C2nUG:z^"r(.t=,OG:z9ΚtԳ=gKK J =JŘ%ee`C%$hU1$uk,Mrr {7s=֭kcUT3eYT|&}za&Izh<B\debŨ.*eVVcβ!Ýl9Cl9GtYCzg]ug]ug]ug_u+Y_7&z^dpҳ 1"ϾO|Hۙ`؛@vn}ő: saQ0,"΢<ǜstyΏ9g6,Ŝpooqyie&N5EeQuq$/.3^ʲ\KoL[JAƵrI=l4k`J@у/.l>L$S4~4"SctP! =ʯ_k:YȺ-G3HAE&r8PDMvy/{ֵ ٷl>2nDG5|kIt:H3:JΖt󤯝%| Ύ E_:hū z5cz9+ݬޫV 77z>4/P5E^BY<ɾ^!'b*Z'7TdH?-G HcC&"\ֆޒ,tO]HT#rO*[w%|yu-~ $>}fa}{ N. Mg:[Zss%,Oo:{yȷ=^o#~?|K ve?q-mL|;fJu钐N4!zy5+}sQO'ݳλWϵX-<L4AC!>h' 3;VӻE: a읽C"q5>2"$d}s{7nlٹ{Gvy# 9؀₞dO@߰zF3ІSi5x t~\9ˇƽ󬫝el*H_ 6VRti~En@L&JWa%as`o.HX+u #nYuIAe[#'w(oq')񵸦ņ.\c4$A.t΃<~Oy#=fgga36l6Oc9v3>r9ɗ9R*\˜2G|znu?udzQ$aۻFl`=-aa9 Vhy'Hƭw wMce}^ôKlc}0& I5cU{:k Cx+5+g?4݇B:'}++#"nXq|OͻgMo]>LǮr95$D[cdoyZb*3&0'=ztOsB |WǠ}|:K@F )Yb@Uon,14eK >7㚟 rT[; Ij`R-t2ܓp4c CLY-4]O9B/oT؊>:XD2!Xڌw -we˼$T0FG/98_ww qݯG@.k!hg.2Z;9UC̓9ɬm9 /<46m9igrN#>0Cųr$v@?xE%?\ WcaK_9ΑcE;t'9M4I4>t'tc:<Γ:FΑ|HzI"#ᅴx,FǘD -[EjCAd+͠ha{j$\1"$~΢%Zfgdk̵A<L㍛*dSSaQxgUw_?#Ů޶L/[ +loiLA?d/E_3VCt΃ѳ'p4'u2yQ'}xJ8d(ۼe6)R*7)''xK;~妟&Ө++N-ir|fs|9̇9g6 3_::WΪuUUlgU[#GbWm*~O#Yq*>R6)^B3Ĩy/j1 -#׀x甝-}t({,\}|0Trub -#z .(E2@T -gae^@X$x1XKyɯQQ&-f˷,AyN^;l^$ʿ;9Tڜ[Nm>2JcɖĮ"fp4 4J;#q#P1^??w^(FWوsG'46y`yxsaϢi4aEūyA[EkaH}{{!Fג8XL]?'LA"nQ,gIc:;9XΒt3gE6t3gC6t3gC6t2A.tg͞_6y|M]6E 5SbCʌwg]#h ͍fxllU+3[uel#ݩFFvu=4aaR6܉ָz{{fK"d߶rӴH/[sL'zL_.:;ЂhLe7UWu lî g=O#u[ZS me S SaEZQ r;Ρ.7t9σ&=y; -$E vj59HdhP@Ĝ_:T ZH$@GO㚟lԘ^CʻrD |8sxr8m@ہ#QGz]e~Aoky{/JΝZ\N5es4 -42Նo(I>ƞy?RcE&?49cfͧ]:TųQF'۞kK4ȧ6 !%px>O[56Y4dF>&z]ÆSj嵰U`;pZvUYHbFS&] gpdvCg-K1P koගۛO>K*vٱk}̒ -lߴӵ˕X-M6uV+@[]#Z+qYWQ'e $|4ZWZ!,pvp pk 6pv]އ'\d01.bV]ĥikQ/$eTA]kGr*7Ʋ>֫6=nd6I6.֖d*[G/ѝ<-td86l+s9_s6F|\DX fGJ&kS7T3_9c۝[99[ VTGw; p&巆[e9y: -sC0~\990D D|6,v q N6`sC(`OOwbD{/|͍3.rLʓ93aAɗ #Pfs Fh4K;. })ɶqJȗ!Q,<']-bLK[מZ $9r Ć2# sgͼKc+.O`B3[dvImL)˟d>o΢u7r g}y2J^ -pgC\ȷk4M!?.Bf&-Q#}B(srP`F >[:1n+?Ύ~"F$ -8d|ym'tl%^N)O)qxAMz]ޜ!9A4(o:׸4 <;ehǯ\UVszy<|ϟ>|-N `W:٨>pv4]uy5nY;WˍY6QwHWVVbGe0U(]:K5IWk&ݫP`3s|8!!|&å:IkN8N6q zVٷ!8"R?[_WIr|2H!r8bttw!Ƞ哆1ZXϳEwod@'7?뜵,[_r[M'[UF ZٱiT{F/Xv0~3ƿ+g2G%]ݣDѮI4ҷͦ3l[#U!A{N#'7E}~5ob~ -5(Nb2d6Xȼ>+/k;*WS<25; NC*ޣZ87*XVQhafyjVB*ȍӑ6k=;6fήuv3Ug<96lc7XlgVsaϮc !U\9ɇ9QEmw1~fKo /_:Aٮ6,WhYV$J-X1h!{ّ>[5$hcbѫO&^YnAv9qӃ+*9=8]tī_vǃebzɰ) w6SeC 0mYcEřH5"h`W:~JژQF # #A$D{!43̨gR"VcxMfCIc┣/7O ~'2ӘU|hd'PnҼ|5v3G:ŵLg>+Csma=8ͧ6&?OAZN9Ƚ~.ؼ@Hᑂ8+5 *[1$r S+'a7OY׈PBU\;~8SEjdQ8_7 oLqH|1ӋL65zY4uSߐ$6QzyLuYb<#Nʔ<ʉEܬf :VUsC[4#k`TSK?o !allٱ3Opy6l9gOiuẃg#\Cr?'c:FfBfAF2PIO::xUB|@kk4u.G]9j㞸-V͝]m3sg:so7g3g3333g3g3bH2^Ս UR-vZE:fvw},#s nO&%mXރN%]~Xh -+VɃ:Jر -Vy8 SY ^ij́L#HdS O~IjӇmM~`x O}Vۺ,ԏ0'F}uΖt3!]C6vߵ'Up,WK,R;p X`ɭ 2\V~Vs}0_6ה~fH-r.!A"UnR;'6s0?H䑷[9~9[fԷl.)'fJVft^' 9 }T_&o|pGޟ%wmJswϛ4"/jC!ՇS._SiڞMW:jUΞrz2,${,rqNjsS 奫Mhա~y7+ -U٫z;3L[wC.ؠ?K,踖V[,ԥa0,gOHqb'<甶/ -с--(I]Uz3:3@Q=/@@ׯ ZfcE:Noԕ+H]?!c+h㛛76nlճϛ>l>lѳF4l٣fg#?nl96_NO,`$*7؃BK<kN[OIN-hmbiPEn+OgK>[[*۔7+`PY5eB R^3VXDyLBeNT޷Hm~Gj,%~7 X3t2*DڷަG*T3b]+mO 8T28=Q0gȸtu f]fӅ\7Ȼc Vˇjݷ79~_˹8 {m$I,>xl.%]Ǣ@NAS-N J󦯛>x99|G $wT|Ec)k|w/ˊuZF&yDcL[~,#w!5țTa(tǶ&^ {K>l;F]E{aΦKtWEء|%Ȫ"= |kgC_QWU-_\h%`OTVh3}|2}˾- I1ye,yAfW3uIȀKlv:7*0u D[koȼ_mدY}J x!qO%'g%EN͈1.$+Jj+Xp7J)>YeP7<]1_9 R̯ovW144TǸ3pڼ##$~ÊG-RԹg t5(YSe}zX5.eJkCǿ<6$^Mu`q*Kc$BBRK\BWAӃh'ZX[ԈE+Zd\f=6|kaG81՚s/V=ۂԐ|/2Y篘uƶ U$РmDO##q ,z+]vtNMk=9'<lZӼϺExUg AH%d 앜,ݏF>0,lΕ|ۀ/ϓ/4?su\W7U3}L֞+SgoBI#M4OWx+#W$5RF̺;V ޼^J~hT1dWPˏ"nX󠉻shøn6$U'Β|'Ȣ3xF|ϋ9d:xmM*G\ra#+<\o}!g~W7A$%v؂ _2gGvɧ x~kC)CI>: ӯ)O-]C: -9ðq[r+zrIj]1ٲ%ifD HUiycL>&k]9ndqں{[gҐg9cppEXgO_:z@U&KO"330pNuybM6p節T 265cr2"K󴜱 !7Luv:s/fi]ӜȽ+Ζt󣵞_>y|XL󠰽«(sլͩZuiVjE=;r4ؠ}j fT eW4?cfFf=dMOjoA .H0(B}uh@n]L{i -r[/gH_)Ҋҙ]0N] sg‡ĩxIOkar3.%kѰXM55Vވޓmؿ9K 3< {ʑ1fKu:ʸ/W?t>+{AP8jegɐfFXW΄߹r -E!,q})a!Cͥ^Q*ۧ:htޑf$h*F!̟WLr_iXܲ!>߫3D7Hj`2$GVs6$XǐF-K(y3q'/F>;O|BSr9\?m+TiakqR0.?)so_W/𸲛q#gOŰVZ6ȁgX{/͠XHsKG&7^i`ȦYrz|3&܍xyTEnfyCjg8 -~mjVϛ;ZU9ëV&2t50F.! Aaoog+u@{]+2ʁΑNZIQ{ k4qH\HqK~qnkⲢ8+%XU bՈG ӆkS,VnNJ > ╛i%߿yfp9ͼC6 6^͗{9~V jq* \Jud}78ʆ즀JF/0s, u@ڊWcĀ7^`q ʚ=uq -ˏa kDZIpmh}#,L;O]yO av$+hǤ+gI6tkn|㣼RsO*HpN+ @ǃ9ppuic 3F4l[kKfGRrzG'[,ųųŰhǧfy~ Zr0sy9/U|0ӛTX A'8rEf)9':ǓbYHd -vI )ͧxWjsom3eHN'V݉4x7DZOa*`0#Ш\hpQ,yuL(&lW3Yל:qdg.0BOq -K8kO@ HsinWy#9DZ5M#=,Ȼc.rܰ4P3F5vTfZ֖df~½Z'%jȪr)"Yv#Of͂,I -aӜp҄wb'pF)}AwA%~6YxraXd$ $!q})>m|,<[p;>lϟ4lѳF|y̋7śd9̋9g6ÜȿO!y#F Ś 03B.(u`]IΨ۟nÞQN vW훾4'7ś,HenL{[Gn`[Lsd,vX]]Gˎv c< -5$HJt\G:>#NS|d7jzm*u1m@E?Rk#}9fhvCTϓ5Wj[s !\RB3c&ߡOk_Juotͩ9=``to*-{/g.la| sj~C* |dӉx28om}ԡ&AP߱/Ize9GZ/Nu0b=1tɝMlWGg=Nk@:(LSLN#[MԺ)WhŰ("!O6Eg`b#əx>T'̓RUy2E/m0UY6x UdsI%)z'_^%fU1!ey"3#:k@u;ao`؉+s -F۠1!3jˤZr8bT;]f1l:XGe ɆSg }l11g g!s󥯝5|K_:Z+3rbLYɋ91g"FDQVjyza'p8Bd!1@4JF:{}񴐺,]|H /kߓtLf^}r)^Mwxy|gA JWh45dқ2}ʩ$UqkVn*@|]A#1q%k|˸稳kglO59I#"35y 1k3i!\d̝gPF"TL4:j#+Lmވ < 7ƿ*5`OS69s_9+1sbe B.dz YQJ"=>9/(,y4˘Բe8eLyJG6uO $q-)>[E'&sn:ԻFm̻^Au%dL5%J.{/8l -LQM).u+An\;=.O[c<|~h!)fE%8ݷ#JeZydO -sFH<+a1iJTh?9u54֎M#%_O]tԕF\P1?aj>~ul3VQW.A Xi6tnNW:V3]ތ/g> [}op~5p[Ji#qmF]Rp†8#Fˏ"ACvHASϒޱ"%XI23*~!X\ʸCo|l:rGΣgQű4 - -Wv8̚`wN\hAqƳ -BywSTXǙC~2JsΞs%I -Vt8?7>,(u0A$*ANdmrV}Ļ;)A'Q\Β-UXz3BPmnRQ' t" -F8=sد*5y~B%8UԜ3DBӜ,gGg: : NmlsiW.uW6̾S8,sE3;Y;S[V*ւ/PɾRjKzWt=51:I5$H},]1@\6M-?^vKMj2 9hL̊i;Rc]_.ug[>Vq7 5( d]R=}5jlQ\6\9jT)M1mIXB%?,MjVw"+4'g̛Xz>'>x#Ҟ>=G مkDupl⠓T 0Ue725s#ZjrN T*t QFx55eu_E׈[B-0˯FKURQu!7gjhxR_ i"|VhFs,H}xd\>X-嚸wūvyQylxDj:k.$LUYۭex>If% WzU~g"xaX95駅"!aĭX c&ѿ;vI,·HS@f3ƌ5_ HAS+4=(Ev+"v+)[﫤H -0ԷCW Б_|^R oq qyFTKThin^-A-چo#'#R1=-ll̠j9pXCs6!s.I,iac)XsEg:)  UEb( )j*\ ay _NJgMOunc4**oS d3Q۔WYɫmi$,2 pKD)H{ GE]rW"Wþjsq%Au@ԂNL0%:ɮLNWSb vKBS_h<9ɳx 8/ LypF ۲Lhs\FI~JJ\$~ܡ x BGpY&5 -ԏQ5Xe8_OC[6llޭr{*$A,qǵ4tS_UPxv$ts -Q~ 'HF6yWָ{k0'~aŁvŀ<4G4w˯ξuְ[ޕ;ëxw1[ztճbd tLܥBuUx/]GJn -%`kׂqny8]g|Oey\GOV'7\qFKC9zXl[#@i̥.Q=#B`#9'Xh:@7EG~ByeQX֚ts##Y$pQBU|/ג -3h'Yq jwuzf-$:MC[S;U,g Ik pP0ґXSjO^(p"& z0{][LINKfڎ+`Tؗk&_v+~5:̾,}`b y]$ÍG&< ~tYϋ:s:3:Wζξ,ξ~<nAU3hˌgfZLvVGW4UT}g-A F#mJA";l%ݻ5WNs/Usk"k?T>};rY&-XaӗUSuy^?AտD2R#<L*` S^}I#ߝ3~ޤ\r9"cwY;iToĒGW 7+Zryu\rXRe{1mϧu6E,yrж9*"&JRYHI4Vސ<^)- rY9P Qn_'\OC wx[ lI2_y_&"pnӷO+a|g#Jb2iO -]^زԟ88e؜&@yMueL Z[t~\Q")GkHanJ0:s ?eyώHB*,j՘i*+*itl>V*D ~Bh{KvXKǵGBjSxO.^n$0//Vצ#tʫPĚMH K(1pSX<<Juwi>hӜ5hRΚtA\g. l6E 7fݚsq5?|[b<2|jaRòAQ8 =r ,ro9 -?,H#ȕrmNo D]yj疮yvDe?!u9Nj~>I–/ϫj34t_}X7igRĩegI#>U{V -l.l;5yD p*jt>kK<֞5gZ<{3Eɭ)>K;ʗet`h^['ΊIR4oׅKa"r2_nW#M"\[Su>=[3]\+baLEjw.Ю%E,Z{0H4jE;J\‡XF8cZ92DCV)`~= -̪0b;g)Wt~ՠD~YYY -OzďrG+Zb~4RoqTIZqV]VM1髾U3CRY8uF N>]D_ kf>[}M rj1L'\ʫ!LH9ܲֆ\F5D㛎jsiґ9.IkM4"z3hwHCV.4 RfGU$2LIQ2o Zr5oavApN'<;Lnka_:3.Vs:9n#,׉f%8lXx7geUƍʄ{c?V>B-wwAU:DAUpU+O-i1:Z 0UX{ ӈ~xy '376~>}ӫ! -9/׭vavu=]LkF$*_N!}Q=k59mpȗ$cD/&U:֋9{r͈eQ$J.ax_J2R;DɃ90BqmɪIL3Gp.TkEI,>ph!JE<-U6?ӯF¸ylEjՍG;GgWWLg_O"MF"lpċmcc}xp"Kf) .FӆWbv5hU4^]uQG9VMiKQ9yD|V*_ jW27'a,9:*rȉb:eAq錧Pëv'vvؓv6MmY+%_oX<_|I+ o_:V_.O\i؀FѺt|F[I\%rGS]J Y[Bkt]Lh\JT֦u<&ξ|ac:9YΪuV3UKs&set SX\tLYУ5\Ir w|3+Az`2SId.[Vw ?W/;(_C,/Y$00 Zܭeyo֌՘_Ief>" !,gIOM28vj6HRC0ԝ <.F:æLO0Wi%e]QQ/4HF$/iz2hQ(Ӗ+rYYB(Za:bѫ i -$튽f*bwO% -ct1b-)2^{G x| 5"$ l9#7'|Fr :OT64hA1Ζt3 ͝^syvyr&yrgG]ytYgC(u?e&]h$-9<*gYS:ʙĚ5ك+9g:  -^Z{sK_iЏ^%әΚt3![ 9=u|@'69dXm-F]r6IcnI.m1L.2 !Róכk-25~nBL Ď -NͺprP66 >`+GIZ2\<7!a]i/ԕJ50[Dq3,C 6WۛB$j觝U虇.[b:g*Q$@"L!(zȋE5jF&{u%r)8i"T S4Q7mÍm42@3s`U(y\->*=qqY=qdq R﵅+Dvkl ÈM75k8K7YRP -Pe)_scJiXw֭ygn[[Bj͜5@4Z&yY8X -6bu!2gh֌1?m #{pYUg:rIW&mX&}*UǸǂljDw}va`%׆ |XD$ u؄+4dcOf2϶H:xc^#{3Ѭ܇:v72 cC:kU"F\ZhXDi,Vx|_BMɣA{uѷ)W]s/ы5Y&Xtׯ]39׾ҟnu6{9^!q ^9ΚtsCkI9hI5ԉ"FX?U"$h|,$ Wcm3Lq49c4T8AiAØ{b(;,v{ӻ% sw:úPfk9v14[r"'VX;"u==|ӷI q|F﷓)++衿9$Tα?~u*Xnkn5Cm,: >@Y.O[>x3ip? zΑemzh&#O߃}+Oj<-[yt9WΊ0ؐ\&/f!d{yHI*զ$/CAȡyyKN))S_/_vC?jNN*ٰq;z ƼD!hPݺYӡhl >ib}ŻMNKX'`P#U_ -[O1K4bEɠO:vԊ8}zwPX|?Me ocf<$s2Wd2qRuJFOi -s5ͧ6p.i.xH`gB56?F5[)4߁I͇6s1w]! pDĈ #ݜ@ S\"S؉#}80YO,VR(lȡc:I:ҫ8=lPeK E} UYX\'tA&HZGz㮍tF˱ # 'AeOdJ1p蒡GT{EW,\<1P~w>sۆHeۨew2zog&3~kC9ԳELn<:`~<\̧2!#%-S֓ū#gg Vw[R5Szm|NmɃ(m0?\ێbNo*wOjO/BVlR}''QO!s?H&Iɗ,迣/KJ>4ȚvS3&rTRx/ZG}$~ΈSeu)5Ʊ![0Zn^ΡxTD~uj0[H -Z6 *@җA@#΢ ;(Yֻq q\q\Վee0rݸHyf/|` FOqfX˧.<\.JmM.xy!&ySg甯 -i] aQ3PNg5{-8Zޭ$@ -ڔbi)MfZ9,|dEꛔuNz%#i/q5iX[@RIυwq37և8%>akl4MX xOQ 9i+}@ L?ȊYZ TE*`ژ8@W&'@m\(V,LVgQ_ $Y9DL2hkBrJn1pPOA%H#`|''YITbw؉{$r'In?4Y.s8gȭ{*Ü3kOriZh+Se^Dz"Cj7,}1oִ/TC5j4AR8« Q/0LYkB6>rP<Βtv3:: }ly!Z88Lq/+~q4_5̓ -nbȍ\uŎ&m9rI"Tmt=;}wz ߹h~T*7E5}5d`z:ik~X g{A,!I9F!RwJÇ FIOMb(WW=&[Bq%?+ݽXgx<ĥ^1=?7_9rfX~|=I n2Yv#I$6 76ol٩n%YyljgfM L\T9n*\#]d|)éðJ/:I --Ѩv^fZnWתntղzԹMc6>Dί]ltBz:E) $sa]2R73LדNDВ܊O&$Ҭrc#Uv$6#tn]Yaȷo49cuĨYyd"$ڙ|3@Gâ1#7V-[_#(o%C,/& %%]Eږ.uAádWlsQ;wTPjI Rans*k4s\ssf6|fNm9sL&|o}Cjn Ξ L#5J*,Ė+r^l]#c?f%[_g!F9ZTbL'뵸lP= 29e,O_2ɞlt4_yQDj\.:qY 7 ҊH Oe'ʳʎyRq~|2 -Aq7= |2O C}dUZ'kVQ o 22FJ֭-U -1lJn(S鯻F!X -!i;v伐eKmoŪSD˔Ux,An\1uq -*[WTxq* he4cQ¼VJm_,q.j싇$UI t|[ȶyx9Űvon1Y}݈н:_a?b1ŵ'b._ -ONT2ixPf%x96jX_^u50ax3VY㛎o9 eGRC_u3 f$\?yڜ1)Na$5c}o{pN A(ux)xdp蜮/j4%}桫^%V')94bhed\S9pr*4 ,q*s!wcXԿ]G4R.UOLX F Lۛ^'y\h9˵Y?8o; -< ijİhqĆ<|IeqߖkE2zO -q.^-[5 - g")ʏ!i̯n*}{Rн;s|*bAuɗ|!>:zN6,~99w{9K.tgM}4YA=,ɣxnirOv}Mp}:qUÇÒU:}26c˓9rf;o)sӝIyMS Ĥ$ᇋ |Ӌ/k&MQsvn5>t=M59G{^CiC"F{W'} i- !]ɳr]ImH5\ݎؚ,U,s5(dg:=sfO姤ʲݠWZugU* cK͆&>ޣƺw'۷:8lpM>nc4XΎtV3˧.<|˦iGs}5Z&')@z<1:~y#julg][$[(,G\fUf stb0{u2?gL-F];<+dbz氟j ,_v[,d{J!Qn,88$6 2^.L"?Lpƭق"}*OƟQ܄"..C\^І&r+/ dB,\N,n*yW Flj浿o[ ztcdɚ3*9\Mlnw NT [n6ݱG\^m+'Gfv;z;(u^Yȁ_59: pKoIerh։/rg_K'N1iS*%J䍣]YPUVMm+Y̕c2ՅDkh$'0m|'ȓmPz!}+n-sc rU1d~nڤ]w}VgTvmr~ !7ǚU;͖9_Qf6#XםFc[&s$M暫 FIzӖ1H qԯ窏:d_1} d;vNZe6rNJ2)@wf3+u*2si$e}c N\5_i١kSަh/^yd`|22* u5쬤)NL:[)΂l&/l3\OS:zyʢ=Ӈf;?܋rt7~DFɝ5N#L)\gB ]?UU@+ͮ}%k>*YW:ei%÷OuΚts8f -ʏN+hcf{g]صɫq :e[V`ߝ}2JԖM>XWUr^3uz~YTjRDfNk9pdeL#킥4/:0"wc ?]<_R1xuڨ{SNe_{~8oV<,E@jvʸ#Q#yΤu<m; zpp'3IPӎvK?DoQ:*xmܼ sW]:|7lԿ2potm#6=FU':̈6qm&̒񬋌ȃsPbUnIģ Br9#ǎE*[WAhf8Dvso+;=8lXBcvCm[䛸9$ ʠjsq7vw*`߆RRU[ڰZW͖h!ܱU@"NdUlwc.'#{ᬋG"n_,#u'xfZY9M8|A#`:5?H,hHqz6hI,h^*?Y 3e:muRCSoё]9fͯl|پCd\s{SEf s3|y,Or?n}C7fцrTE04$ C]>>CK1Άɝz#mdb$ܞՖqyU\RN_`#l)3F b/3Kg rdAbE?:8|91`H/nC =5y]/ΪWo}o s\͞D{ۑjՉf>ޟ4 )Yk(wf{ޓdF4icM]U$ks-ݜثnNاicd+U}xm~8Ȓ?ebHSbdR7aJymLژxm\7q|2OVuDeQ(P 9(KE9^_P&9O7Nv9؀Fq:C'*(j^+ -ڳWg - _\{fJsH<E6yr|H;'7@Eˆ5;{ k_̗-δdsoL#QηJ*>'ֲ@#O })g20Ee!lLv5`ͳKb9r١񱿖ju,{5-6RR S[6IOܰUX_Pecs㱳cf͍xYlE^#ٛsy7:HX6vy_9g:YwFm[o:KOֲtKxٱ+H` -|q9]^&VDS'isT daHqRL1›S_͑?RgiJydڔs^nܭ VeRhIJ7>ly\YyU{xL:]llOA}cߦ=LQٻ Pu,Ϊ uαOT}tv;Q!%s:Z_[LkTd:ALt+qayr&3A3eގXLy#!&mNF`#.!oZJ؊4L+bA LY===MT{ u|mq S=2 1MÖB̩P_xm> kE7啳jtU(T];K2K+uVhEH$qi꼮EX*SL,;5į>)@6,m8 Ө}'M\fIM'Enͧ`3n`q/[o+{f7xFZ;gba>:Om\L)7D0.^u HWC!XE 'aR^(!r3"g7򣻵PC!cRɲw7C5buf 6m9;uQu;t~'ӚvY]PY:+t˶E~Nc휘󔙱Gu1ۮ5cDvLOeyK ٱcf=)i+>_y|)H$I4U#UM!>rZ(@V;ӛNhFDBPuEY:RB3ꑕHI_ۮl*(U#܇N_.yc8LyGMbf=xe؏ -;o#Gn5@Dʹz.1[>,ҜPgKt󦭂3r=>|wu+ܐNH$`&,W8jK>hy˦˗lE&Н$ʻ'$C!vaR$i捼%wr i9Sr7? )}O2RhX5kutY[r5x]*dQNI?v*l4y ĻhK+iF!oBu_O# Gc9 0#J̍8*̮AW3\ZkUɰtD^6< r/#JS^RnJ4AJrhZUytwGuɚENa&9 - bB"־!]I9Z$!Kգm5cQr7  4*ȳr>cTNuUun\gή΢C,Ͽѵ4I`oVfͿ:r8NXJ*q 14S.~g%ux -L$L.(Kçy]'38/+g\XnpkӶMjq݇JKv%ΊLpXǣ:9s"X݄E&/~EG'3F ʽ☃7_HvKYeV$ NnMlU PqD#Z5/AgIWc<49͇6*|]o17zsKeY=$9GvSю" )2omw&n\ܹzVd3:93]sP GolpoBG3~Xp}^c.yiβ7lno S|( =4β bε?v }kͽ9Yȼs-Kw!d>"+b}+|^wt#$U]sW\:%I| -Fn -6NS"1#8ׄ Fs,^$i|)ܹ>@]*:L=F%?0TgW_ ؒFO1P|2>7cچ3UET\LЈnxHФQUybEģPo͜W{I)|"#%Ik(CH4ue?n^KHk:l*Xhj*ȱΉ%i"TFo܀\i$.̳$xps8I?ozρ߱I{F<3q9ŵĚ^P|F =L;Ў0^2̗zxxb#֝jo0V+YqU κ.p2ð|Jɷ~I~d`&IB}Hb$_P][4#喊3CUΆ?҂Ns]gW{ ԏZټ"ư̓M;zmnunEAˤ3#۬tŇ/3Ny͞a6u]c:οۄy?8GoR{f?WiXg;boSqߪV#}H%"(ǧ!|0v?5HƯvJmO΃>\p}u<$@%PPGg]%XRދK_L΢ S_"6M -b'X9a<.U|y:D2pw&i%N.ٲl);4SSb̓-T՗GW^$\˳2 ]&Mcʥ%=PSHB1hw_QCb)+iW÷l37LKdV|]&ә_rk&~)9 ƕ<ҞrkXNG16sR2H+epy CAX^r췛,.W]mAhREպ̗"h85}v]W%5dG]:[6oq;*I/_7B%):9R_]_:.8-V$p_-Z¤gӱ;BV3ϕM+#)TN}-v߄$_Ec~a#M֬3D pj~h'Y5XkHk.tPu Xeae*׊qRy x_UQ%/0ֱ0:>eb]J,+*QqTKbHʢ's H-+d=}~!-WHѽ4CA2GiHj"nZ dҴ̍:TVyugoG=}Cxf*Z浳ke&HBaxrehE< xB?Ch -2-4,VDzs{660w"Uή%B:v#$ᯡ#׾E`.ˡ.< k!#?@shŪdtb/F9c[Ÿ،Ft{ KemI,QriLuHI*TD~\X;hskfӛNm9ss!T_eM=b29,r}.TGWh==sCk_Essr5GxFrT#>~NF.77i{xE#}/0ج0K i! -Nllrl=9.쮝Pc'I*G8%$κr7x&'__:3W{2#] _Yo v_%KR0[Pu]-3b۰Qj)|-v]<z iA^&xTeHY5K栍GΈt=dyElG#:5,M+A˵Ol:n9.YTGTv7ߛqMd48۶h݌TΚt3BvY ώq͛5>?=U\gWW:ڸ6ϗ%Tdm4o  adhlWt m8ꮯ%~\,^xYH<2Qbb $549x,'}=TӻY?0ad: ~m)oid_"$MFmm/b8F7SS.sbKٲr-?|: yÝ 9ÝVΒ%h:YʃjMtr;Cx%{f3 "]}vPTڧ*JVFGL"6 G$Bdͮ0O7*&|'I]Y8D䟾"X]ܘW\Zd:iY:pxQѵ]6t6#H= -yX4M4zRFJpu^b>o./<4tuDX/|5Ť$9$ՓUer9Xæ;*c@fٛNM,p*oLdw2Ob8!U$:N$pX՞x 쨤{1.1nW5LOQGj7-[QV+%DD56nWIgg_Or͉t[.$_5VMO5&!H 8BcFmPޝ$v>hZ~zJTCPPFqF 3*dPE"? 6ٴ[FBΣ#qP +Yz9ci2(p4+R3g@Uɹ|ENy}|:DuLilU΂%ZeZX+iHβjbM GU\$jn[Y[k=qH;/x2,j0.q4455s_CNm9kfÛ6sOFWPxrw~ !ĀE>ń4NUk6[~T.l&Ό܎ =na؅戠NieȈZV[CZhV:Eh)=϶sWI?ݧI[65A%v?87oa$ctsp$BX&Sp°Gqz#)]6/ -@js[<@ع? Y<3S qě#2u:n*CJ&KA6bU*U}=EW|4@w//)5IvݠN!<#o3nv#k\@llEp |\&>76o9P<>9ΆJ/8dEdKvq څ]t>PԬYW"pcMaj3~p \6snm|Zc M3֓z~2Y29VU޾3XY ~n,Cx'^Pp~b! OǃW9;6`W ut41_H -ٯdÝQ>LϴOneͷtkM,i1yx΂<"΂,~M,`#h)A_O99"]@DѮ t[221O/i,=f}/Ψ3Plk̍+D<3aFkpDqmnNe`~ C貧+?\=7xm -[B Wj3{Kkcn9N!_DFU +iskᖯA/F̐FbqR(ΪKrӐJB|[`5i^h_6>ߝhsC/;ܘE!, f=VKh8[#}X8pT,_*Mlfٱa hmX+V-/"m3AGhskfrُDV3XToAMrq~gX^g|yA{_" -#}wk9@5IY5ݺġ4$G6TsIPuB"t L)N"XW`õT;6@Nd͡ԫ-Ȣ%!^&ڧ0q|1u9͐چvھciZ=:r1f<*8xD县Ex%vī;4S$Bճj|P=ŷr5_xˁXdQsԘ=# rO&<dt8lB3:3R>^s.~7_wG qq9~0aQDsXE);_itFI r-b]RmN))@2*]WʠQ1+n8y⹯ +/QC^vr"S9)$xKjh ']lbV8k4Zh=ɹ\6hgȤYP:orRWIN:gb5MKq*雓hlI~s VO58;fgdF$p6(YnlrU"{tgtOoϘRx,94r+f}̯rˬCn; VXF2MĮ|4\UJqlyx=U`莹nՌbI)wKVtG/M67&e`6Ya5_8ۯPBU"6&O$]k< -?9É/sFyu~:?j:x{<jHJIq[@*R(XUuF2!t d6cߺDz]FcCçPWѕ58bA)lU Qn:?|Om,Wc sml8Vf!ݝޛ"7ԐƟKƒ (P/-Z.u~!6e}ZphR!@qFbΆs`S n<5ՖJؔMG$53i_<ξ)]>]rZHdPӓP3qvF"WF4 4Y{I.c eȠ -kf*IXM2\<-EjER$&Yc^%.EXB۸zi -=$p/2(@ŲSx؜HE8kA68hLTţK îJVo3Rtu7@ҭDL9uՁ40_Fe%&ı-9]FϺhpDIcw'Jmw UFXjea՛6yҝaN8^}$/̩M\3h<{ ]>q|j&gHл%3rQ݇8Ly@siͭOSʍ@ @D` Z,ډu;r -sE.t'Ύ kO[r\81湮n9OVhƑjA֣ )&T mow،c&˝jM|y}Gs3kj}WZ -ehs2(!U*u*|C~Zʳ -\YWS$wg8j| p 4HWO[90fsHd",vXªuq'Cfb^|.sȣtԿWL8\88mQh(3K^ML -g\ :w1xAw᫤dl>YW.`2T&UKEqq~0`N>g$YD-]q %B3ڜ;%+Xiw؋n㩻[.}f.LPx6 F1# -*$*mЌ)C5 pQ呭ir"n@)د[_Z܍2/60mO&kqBY؂#l -@=hD"09T*ȶ>s^->[4r %&N1`3Wy}WD5)#[Sgke}3G;h~`\'ci嫉:rigu4b&f*f/U&Ee/ ekھ'NZտ0Du,`bXuQ_O<W;{ 2iȘj(VΖhm\XK5Xlu2.Zbf<|X`fA;nMDUc]qkqH_+uxtR7lSgw~,uPo%^#kIjP\dޫ/ݖR,$7/Dqc,Zָ4^&mgpWD^'Q 92g.@RQ{j.f͝ -FZS~#͵O &='ZY[:ؓG'`!eZF0Bޮ:¨&Qڄ'j4abMyuɣN %d_ʃe݄Q@?vNg* VZF&%UQ}NW oPw99TVV:Zid cRfxrYH*'&ִt@xsk:ZFZ7j*vhM<]3nAWb*Zcԅ*;JƿOܱ1ß@XjiyӮ?X!4d f?mF4YI]cī{3to -+OY jbq -ҰA$&krQ߂lx]2vDHB;e ŢJ浲yQW!3FS s˪$))e2^S=;*Z.鏅Ƙr*\f7xP;s$k؆΃>Nǟsg:s澟.ɯȫ=S%L$qhk#$(i*:T&FUsJdtEOɷWm|V-r]tfo8,OeWR'HxԐj"<X:ÿ ]uŖ;Gw&0pp!Ej2pFӆgׇH)1Ď4sk6ym\6 -53ZQٮk'.rjo{xVǍ\h$ß4#}hGDZOsQᯉ6zȯ5\ }>DiCP47h5pʣSζuԳjşiQi - r)ZEԻ_sS]9uFndRf,ʀaJe06۩)|-YP(`hreYQM?JFbq44Ų]+$I&4t\hXb:LSi!<ӝ!Ttt"GR2>O07ЫXe XNÆ^R/M[:jVW}mOeFjqsT궞raeN7rZm${~A}.w|5ˀi%(BMHF'v,Bq٦?\b]N}NoYЁ -M r+١p^_bqasswF$K|49(#:Dy͹Oh~)k%7 @&s j6 -yqk\d9Tͥ7ɅW4 $F]<#U1dS_! w>[TwI٬=βu1X0z'YldY̏92, K3t<׶7._ x$7:Á>"^<9|[I72 y|W9'hAb "]E%j߇R fPCW-wIPgq?1[I_`|-ٶڍ:ÑRm'Yދiάg:h>X5q -xPskgU9TκZ~n]vorQmbgid۰GǦw2 O_A#ٺylMuyYʏ~ Y,Y˚v$h$뛆x<:5w˹#nFv1ـbfaz,C(si͍Nj49EÁѾ Y4D9?JA :gO -I+n? .NZypx l#z1D\LLLYɇ9iiqM.nF3Mp?ͳKV(8@6H:Bt1Cܝ/}a2:?O]nB_e.مuF V4J_oi<"BPg2/v}dqSbkqmlwYnY4s,M :Q9LM(0D!ݳ$HS{fw#%t o5 xv,[=WIlXb9RYz,40ij J[u6ksnib3}\[SYh8t09G9K%^!)=pYyL}"UWs?HWhrzrI\D!SIg2*NHd] I]"weN1;j vZ(+:eSsaƚ0Ol'v5(ACU5E$KS# l?* YK1+ Bwoi'bOv_O#71 -ք5k_J:xfKEϷIt#} 9}3CGij}Y/ݣBG,P)IΙˣhFr"}0Ns1) vtrxHWE`£HGYgUTgYOg /WfyP5n#Oa>koo53E\Yaslʭ$\OMr(8+%eyy3xOzs?&/lOk |Gpb^Dį[ߣ=oGFx_H{52ݧŧXrsW}*"اb,WoWTACgk0g˭n®@86?H/ZY!f^>\WoZem\^b=eFFkݽ֗&s2 /4MrConWs9^-*K(g<2USql bϛʖŮozAk6cYdjeC'Avk Nsf3v0,&fN!wdΚ?[XnēI#q~?^0]'ڽFI93Jʼg+i/`5dŻT()َ Uw.ZjA4Шv3aq5a~IG x,[0κlVuoK6Fw8OK -h&Y3Ap8"0]s>iOs Suӱe>tӚ kxE<]Odw,vONK:>[ u5f''MeJj7+V6[k,cEzEΓ:UΛ בpYMtsVG -[I,2Nwʈ4_ȓ y> `|}5hP+,1JHZL03n|2!RN9KBŗSK B5k'>nYLlQp -'b5LDc_IĜ6q+BMxIri ѡфkHKgǞY|_zVԦhШ4RNv͘P2x&6D5qS؉Ybp%'Pᔏ)F{iC$S'\Ĝy|v 4OD}{k|٧r|^eᆹgIW#(t,G !G>lykզZ^#O߈,4v>ej#K@/B;w9Vi 6nEsݱ5'MsVn>LYϏ7=)el*C\/è'fHMt=#]K -BW1#ݱaJ߰lsr=ɧ˂Z[-M H xM9Ni7\Icp3LBpy g} djzk&tݤ_y|9&w:ݥz}rޮjzzMklqdV5?C ijs{(ԼJ!'suܟϘ]S#\1LOʵ}FUЅyUAIN]dF/OV4j`2U"AR~~ E'8|/3ql$X{d-sFd$+ uRZv(7k;O_4F[ߚq'\Mc6q R\V \o4Q>6KO - E˽Ldh |,ٙXGOf;ܟyHc_ ^o5St|.FHؤCwӈɬ|ۯW8#;.馃~1;;gOtۑfrSM3=)#I6ATlȿ1ע; uF>@xl^tH#]*@u\sAmgx/F׺@4܃Nc^T-{jpn`pҦs.C$/kal&dӗ\&%۠:~}ck篃ıE&H6kY#~L%ۙ"_C-vK##%NB#;jsuve^.^Rь? 4Y-qWJQzYK~m+uu3_]o0sxƏP7$#b S;3B /ՍHQ- hw5\ g|5;pn =>vk3S6jp5ܫv_4sO:7Gءolja&Mbxk1vsM9Ni|qƨdkfH;g#8tleΆLdBB4ʒM 3ƅܕJ#aiF<|% ͹ydef3Fޏ}I.ؔ# ,<3 kjZȲ};40 ܴݍfweVgY[!_Z뛉SQxBĚJ.Vb"tV^"x}#ªo,IZn9"dZlb6.$Ca^E|&T@|ݻ5آZ|YXE>J.:$4%ov(XoCn5҄-EkӿU<$d+´D;M$ "07 ЍV\j+8a]¹.Gv+22H5N!8tq#VbbbۤqqHZтxZI -xmt] ֹ,l&]v)ihc8GGs-9R钱HdaI*,I:5 eS[}v`4|C=`pׇI= vrIp\sbo{ \EpȃqvxGP٭.` -8)$o+GrkC\q/MչJyt$]C"]]$[#AŊ/&8N1B(%4L9qusBvَyNi$yKVP+sK"ҭ^#|XR=v`ʩ*Fɳ.;.Nì8[@'CҥcG2J!aKdn㇤+ӝs3ijesŶܲg:"iï+[,9:-9|O7ɖè@EFIR~!6LӊgL30ΎY)ҹՍ$xÀ5$2J(>q%X'nw -V5:7?l/r}ϽTNk$]5DiY6FX*F$t؝D8uu'efQvε vPBbYkE1 #Y;C qcDXI#$W,2HcilSh3vz@;sAAaeLK*x[{)(v;aƱXea#* %~Loc4ηIdd)oDezZv ̈́ݻ- V r(DwZY ctM*/G^̶F>Cm-4uZ\kӱo~eWU?.dXtXcL!ꗇ daNq%G$CXn~W8>}q%VBBi.+Z:$QW+#᷾># Q]M,nuo'@s)cCãɼH'!!bѷ!/*2dފqY9nv_BVg"z3 djw"7MK@pq`3xC3<ƶylx3.^G8cU9k :Uu QmIk1^k.;q)c1Uu6d3UcBIҟ=^ "6_'Lo˺/&Bq쵢E]blB["|lU+Klוu&)dMZ`4dzpZ&`hbv$mڳæs=fafVʠ{f(lȃW:<Φ# t{2%墦HXF x,SȠXwr8#vhsCͭsl%t9d[ ^kfͭ66llٰ͍,:损6hg͟6hsL49hsCXQg2ϱ 2J.3ؚ,`$5tP"2sы"ws*8dƳTw I0{뙖Ft9ܢ׺ Ԏ8 Ul׈jǒe]%՟ӷ:[klc[V+> *ݺADl02q]䩓O}+H%(. -q~T -T[pGsg6m|V/)uϗ+z#ͭ_4lz`pQPi+%UP1(pRr{hȚX'](Qt!Fx#BU"E:i~m|VΪβsay9C<<uV36s|Λ9g:lMs.stΗ96\˜s6setΗ:6s<9'jβuu 70q;c5-ϛ9af>${e#B$qϛ:󩱝UYg:9XΦu63]gUc ':Xζuvsvξu󬵆ݣ塝Mg[k:ODO6st${s=>l͝MU 7s̮3\3-gXe/:8bb{y$S1umgYg 9af>{: 5]H|ض쯰WpqKco6y-R#K3%i6 QW[r΂R+\_XsxI_m'VL5e>i61Nmb=-m9|8fgSW :0ߋ<oǘKa6yζusD,ϛ9g:lKs.setΗ9:\M6s|ϟ:Yζuֳu_ky839yyYYCIb0gAa_:ξu󮭂S]LgWS:U5cί3s`l9̇92,ÜȰ2o]3L6skfͧ6ٵkfͭӛ[6hp~l9͇9gUW:Tξyx2c% !0@P1A"Q`qaI%I$QDp#y$K53S53S53Ql?3Qk5_{"Ю.G\v} 4]DbŸlm=-)_GF! @],_]D>sG"FU0`L"}Cb"ˢ?b0N.?HP`]|#=GC-B#. $ pYuQg8oQ#Bpw+m\gF2ӳd/\l٩|G['3j!AE#O}ucJfoa{!2# kȵvoiwNs(}ģªW"|쭇WwFDI4J.o|6!Y/TwW:;R4M&C43C40GT~T*jCnŨ-GSb$wK%FDdXo/u1܉'ȖjfjfjfjK%##4ܽ4Dx$+17U͝HZFQFjD|t]QU#jG~Fk4ǰID~qܡjE_Ol]&L2dɒ^tU}vd1UP㓞C;,\FiXU骨Q.h{]*z?V5"Q$$վ$lY!I:PUcUcَڌ|9p'ӾQ4G+?|\2Q$J%ɨl>*:ȝu}6wQFjFjCj8H̎$D ~j,{KvN-I!D"iGpD0&>HtDetkuXIG] kWS5R0(yoaQ -#fG&Id&i9ǁ+$21Ic6oc]ɚd͙+j/Bٞ͐@tLbTJHdlȘ5b$j;,ɢcgzigj5#Qk5?);&ēO͓`}VM!jvG!]$U}ו!ګ$؉?[80>R!R"7D4E{.ʍڑ,i!4E%A~C*jR>DSBDlc2I6[EAF ,Ji -89JFl#$ȏp7ۻY$bY[[btb0ctoZ5LLLL7'?+Id %mtVX%bI}: [R:1Ovո1I$K%cKfn[^Cْi* B06RY-I.3d(V6"b2P.q]I G if6@ŹfbK%M2&3Ю\%MT+:p` F F9^UbkJhӁ/rxaxȬ'W1R(gwiFi4A=ض'F,ؑ sHF&8Iё:*Q>]r+7č7F,p#]LY5ɑɎ)zh%EI+/DTBz*WkG6@]"T& E93̐A 5Y":4F(Br9x:$ٍ1_$.ѹyB5Lkfkfj|xF3GFLY,mLgʥ%x(bUrK;!:5uKEpbs,:ǺiDIĨaܙ-UI'a]+0`(GOM#Q׭'|d D:!T;ELnG[zDQ&QdbG8뢓#O$ő_fƈUlW?Q(I$guX9^sC:Eb0F!-}GD3$~I IbQ$d6BL؁p&Gf݊I}z%J%5, G .k5gܪQ -:xvLAnFV\uTvM%gQHёQADJ^Ȅɤdyѻfȳ2=>+6r&D!k&E -ҹ*} L}(hOG;GlY$] C,5d1&C!Y ,,d3C43CM&i4 I,CpC!EbغZI,y\.")PQąD -V!B*!dUޫP$BHh1D:uT&~膅DRXF"F4bt Q<`҈BH$DRҪDBD"҈D"ҍ(҈D"ҍ(J!H! ʼnA^(Ѕ  0@P!1A`v,Ez%b3B(qv~;OJŘ8FӑwCyX(((qH߶E9#GC 8 p4x7aN_<zGz Z("OC7q1G< Z?s%܌~ tq0:=ZCzWG=+%ft+|Rp dhSp-ː5xgXޅvx3?ù -c1|#jG(iQ(cح#7Ӄqq/4n0h'# F(O83p+ۣ>:xf|%C#fh>a9T,R|k; L=R|N8)uE@ⵊ8S!?5mQKZph:Gh9нcb e?cCC_3hXHt?A}#(bs#2cb`ЇιG``ʢQ5b}`>Qz䝢TVjv,t,?>"4!_'|x 8!=!)k{gQн5t=wBK3DY n8`wtF-[0cn㎏8IRtGzJ.A*v}0POA#1AҀEʷӱn:'w=pƶjH''="'@Rb48f08`4 -(y$ x -pb 4|elF!q^J-f֑0-CNE;6]uCcDi<(`(;`7zJK7OyzYv!РPy"=J,qNkCZԩdBB`53bwOPD0Cз烎 (+ѥ dmq9<^/bb0гB -c@1~"lX~4qN=G!01AQaq @"PR2Bbr`#p3CSs ?oc9[y=QfRL8Z;+Ge9S*Iz/3Mvi5٨j.B -Vv;U̔,@̔ @̔,(ے`4xv_(< @P*.Gܦ挝ޞ#N2SO=AQ ->E(_(&@>@mQE4@&L>db.Fs)5|zH+ϕp 8Cg}SOl@uC`l 7>G`ۿ#O_!5#GU Z -@yoةGC*u8R('VU!ȩq:v){7bFȸ>씈=5N}d$yd^ê)d=6LkT!Hr*Syǖ87b9"Ii:dH=Vq#]У@Dn>_֚ (\9jsF#QnҶRzl^O iCMϾU?Jѕԫ ;iq Ht8›o%fg> mTd4 ;&.`t?:TCX:) +'Ȧ})xF_PLk%BSDo?*F(#MZB(r]̐G̊#d9jU y( I(]L^PǒPҴMoA+QD~F2QPfHPjvڼo) )QCAFjnYY{pP4媯PÉPF0*̓h8jM P!CL FYJ7gTM -&m,1\3p_ 0{~b7WjĚQM)`5t]\pQKAҪV\' -mO'7T"ׂ@BSiAJhF~&&^?25](1w4EǛ\Rfi<+1^JEO]\UJKBu5ABGT/'MP?1Lfj6MμEzj7jV+gejNMkuUȍ 䭄z+ssVU|ժeh5+TM9)U4Sl&ΩM2cꦘzW<VV4٧8454sRy8G0+dekWk[e7d_ȟz=V(^\𸊽ZvJxx+>JJ) =j2VfUggoL`9xziSTOz{Ԏ[ -mP=7,/?SL jiw5C PPwP@*OOO%#}()^^2}ݾ+ChB3ثHդ}J>+g*ʵm[Ru>ʕY;)$DMq\x+3IDVcuV'ﻍ|6>Wቯ5޾]3$D_=ei|g#t6>^rJ^?*%BVe=>A[_Na኶5hCK# 3NKx< 1>p[^;'k7~?)rZ(Vw+4TSzӊo-M%89!*+Cꬅ{5Ƽq<a脃5 zK_m~m[xU9-QW}iL>LOoxotYn* ڡrc;4r >.QF}Shkm?>RFfj:s -duOxQFjWU43O~vUktm*>+;)YҪ;#; znj8op:o4Jb, 6 -۪{9(UCzn]be?2.u'jnݨ QIJp ST ݓ - -av+7cbsZ8T)dqL+ƵԌhͼ& - f;^bZ -uс1šѣuDޮ_A5X6 -ڥfjfS_m6VVCT࿮'TS&8,N+wz( -`@v*jvI+i WA_<1AQԑrFvPP7 -߂)(HF5ԏ:SQ>n=:E|I -aU 2(N4TnVNh{~:6}*X: ,0X\]?U'e(@:@652+BMi0_oP7# 9(oGY 21kUREcUdwԬOA%?2aMNd'4NF#^]NVZ rq´[)4 ƽ4<5Exq8+ -*ثgTW:OǛU+r&+o*ܦ{۰^u>N o-LΉ*j}FsMQMGrA - Fӭr3%gfIBU5S@STڂ?QPwMN#.Fs)jaM|ivʰ*QR;+جqjXw6 Yʳ5YЬDYؠ>SiEN7R4IEumdv&J1Nu] [H8!G#8ׂx1({y+!h&=1PnͽL(7"ꨥ2h j#Lj5p5+\F˧Ŵ9-z5›([ʚҘѵ_lwk~0C -a@rkS.V)MF.㺚N)vX87`iU9l4L++6E -vv&mwQz˜pkv9Jg\ PBOiLM}g'Wk.lSTYSSn*'4s)<[ߋn8ULrSVfp @x -FURQR533^̻NOͥRj=ݒlSo#%d%d$TAB#NX_< -0sSr5bzY\Tp>68SytnLBm5Tݱ0Ϛ0w^ 'e5Wx#F|4sէRhС d -)Pp֊~Ud -i!ԫ;A`pkk`PE,䡇%B=DQcz`GY4D;&ID\(w&۴]#SNŵs8o0;{92 -LФoSlM;+ T QS V:>nmkMuBv)O+ˆMa n2S?B}pSQrQ^`ڰ44PoB9Q{Ǣa5LS<檷:9[\E㇒i!9^k^GiW\~RHP>^bmouzSGZzamO&w!@:HpҬ#U?PV8㴡CMK/:&NFZ7"R;"N~J;dwe9iNZ\~W¤uד0)^|"2*ҵVڅ(nel)Fm㡄S3Gf)S7=WMFCy5q:dh)৆S4븄k+JSjz!ji=U@3*k?ʬO`oUPr+vKCܢof8e]UGk QS3533Sǚ{]Tީ*H,'8XVzy(#tBx9pGz)闲SvS5LQ{G+>cAV,7iisfjEG%zѿ8:-ڭ@Ვ`B;o +$$2R5;>+Dh!; 2ng5Ly^iR+W9NUVU pշ`PM Ҫ2:Rm1 }}L}U5rQ -xK}wɻTߙI/b!%({]XG?E/ Je8k?ڃZ_LezT17Y8XO -> -# 6/EFsA_Mlj/}6OǰdLf^@Eܦ C|i<$aiqVO{ -r*rP+-[chqۂGxYnNtzejuWz{?e3G_=(e")BłVjNZɯ$o15GbeS -YĹ0y4 =Ğ>:{z(8ԨS'PZ -{皴Phڧ.k}(4cBhJӖ=Uh 5z"Vʔi ĚO|*}: -5SL+Rpk Vyj*#0{vU*:@ $Tl0ƉAUiBSpԊc)J+S -KP.fڵ@Y]Eg9Wk%c+ܡ̊*G4˿QJKwQƈkz;fVj$~Bz"%iJ%L:Az}Nf)-nc0CTqGFGSZ96 -?x UZqF@$9=;Rk$lBs6۸|`j x:J»qG^{pR2Z -,@ܔ-P\uU$xe$ -Al:RgSފ{qN -nq~ӷATi.Sl[ZiT1HZvRI -կ4PT5g9jo^ZjAa@ i]sxWYGC@A  n)*t7aS8S?}I -IAT=?ݩiܘ}ϪTN.8b?+;R{ Tee.B. -=C@e^78nrzg$zSLQDxRMY ~ Sv+]0( -7ukzhfjݻ$Q8hEզa7fa[q\;\QS״t?e+R+R!R);'` d2MfKBS)ODrsR~7bj@<E8y -J57ȟ _:kC]+ݪ;5Y;ݽjN)خẉoUo -fOuGkujvLpS=ܚOD.5+LvD)]_uq? n wߎ0B(BVcVSVS*0Y՘d -+7`݂ -rP=B5_qg*OkVdiN4VUke:dtP㾚(rjxPcE74ךo5u=]`>p쓉TBx<'-JRlT=TZ#Ok Tܤq4ym -CrJLǎ]VwSzw/SU5ީT*ҧ\ۿ~mSmFU[6k6\AΓ$wE+*B!]WUcTaFMP@gj5YXUh#E\z&0h U\߂oB٩l dr!>'SpL۪!Tݻi+y> [S -R9tVj/ioT;r*Tn4W6WTwb*#~TRj~0LT51PnЧT*a+sR4x+1TCQ!T_JP2SvS?e)wBs4R7*46/Vd1mv; -0gjlOzV~+C3j2n:۳)ޭf/-]apjryu7]9)}8'UnDhssV{Sm7B}df#5QߔU4kMxš8r,y'hJ;yk=SR5+3R4ꨈE ҟS@B} -y?uFYPnhqCڋ6n󬯐U[#* S PJ=骝OONy&ț"Wê'D U .B( !+C=C >tB}hmTM1n P5@SZ+ʋzFJP~e}SoZc}( CR - =pVPiM-qT:^/GG-U<Tn5E/2'Woe+a.4"A(ͤo;N:cA՚(Qs ~lx ['?;O!-šKAx'9MN YXk+4yf%[T\|\fZFBZTkA -J-p[O*:Ua!׫餦6je-~棻Ux<) -8s@D9`sEv|bGw7Jk'uloLmz(7)O>& -5of=TW)εG8S DcJUIVZs*ҭ*vnjvjP;"K(s" - YWuR;$ H(58=DrѴ5KnSWRo5j?<;'CKFU+opIBP|Ɗ(o'av1J+ DWvJ1ݽ84sDU`Vp";B̨CkvE%p0 ܅jvTr؛xAQT4P=AAD[]jkqz*p?$;)1&5DAD3Q #5ACDsQaFTnLrɏLz:eVk怽|0PE{}ZҬ($mB?@FsA]2:H_(ל8#\5)1ZuVZȦF(O̭`IsU֛[|)D(5^ u[<(@6y?bdBtߪp.}Y\-S=9+/nJ@ ~9VИHuߪg;ic[MnWÇʄ$ t҇T;$pĩ˜W-SO;35;pFee0Si`V -l8S^>5]iQҨ?zgijLPP4p:=E#?gCߒBisI?TnRFq)Ԍ)7iOM;$(ѹq''S,[+l_wu= nrHVv3US$#)(jy&E|Z~Uٚ35ӉU$lxU;3Vfn.fpO'Ik -l^Zj͒ϳeOC31< -; עBePQ8Vr:|*m@) 5Nj1܊|{iyN?OYZ;+u5R/uO-Jq؊8hFE Sg_D3cadd1d p=vL&d=f? -=;\iSj:. yEuq9(.gdXX(}Sz HVx}!AκJjt_J,d -XgQ%^$!6wLl"̨?@ϬZ=keM`ijL7龴0Q-rmҪ +&N#ܶC}oSS5ة@x!FQRQ5BxlkGS{lբ\Bij1 }?ބ7 )Xh`Sfh7SU -qp f9Gr:+4+4( wTw`zX_yګ(pyX{ưcO1٣qLAV1邱~fcZ/.򪟸VZ;hVV*ҭ*ԭJ[;bVmVi.XAo?XcoUSnY:j{Í}aYXV_/!WfeVMTqjwS}ڵA#NvO#ޯ*]RG_{h4ާ%ifJ2VT@O -JI>"Njb0O'Q7ǸmBDq.=UHQSzybrV tD\}F\wQFgs9H7U]?5U%RR OQȠUy(Ue%Y{P&rdvLcj7aGW+AbSN au5uuy^WrN=u#B*R*sVLOq -;jUˆV'$_ -yOrsEwQHj5VnS_nJq@h+3T5dx~º7<|^(7%J -OPm_cyLiJ$+m5;iHOq})ٍW·8~݁[ |+G*+ī)Uvmԃ\6+#ϡVW6ÑV,"puN@gbh -\A@ 5`8:!Dcښܓ"5b5grT=Lpc~<"^vۧAB̔,4?%7h4Uiz+k[U3/7uF EHƷ5<+vVy)sRw)^z{q4߫4rί󦇊5bٮ'Q(PhSi=upVZ[?Si4u6\tQNffii VЍ0T P52'V~݀N0 -\N'W -(%!AOB~kطyЂkƬB{BxQHrO9'ݒ8I&&HǦ8acy:z#FADTAD3* ->FT}ʋQw*.Eܨj3i;YNjEt*=Fgχ\Q,g4cMn+UvҜ캘צmJgfJ&V.Sn?=׸W|v[Z̫y{u׎eZ \<T]_2?PVvdYْ٪.FHhg?g΀o-N..,:cnQ:Y689!٥oJplT:yT-J_KޭȫszV|CB(-[޿=[V⠐=@X5Iһ|#ftHU5UV/J2y-Â$ӎ~n)N액NT59NsShVZZek -PF:PqL7Fb|oe T QSK}ʌSqQw)wpqUJ#hm4w<]Q\v<E<׳Q>]1V9}}}}]ʋQw*.Gܨj3aFsQ*>>2}ѼK^:F=Jƾ葵 -:?SVz"\{i4$9T|:5DM-E_T1)\`/TO4Ӛ>EtVЭ'VdT~~n%>sR'ӢlYj`rgJͥ|@$8|Ѽ*sL9]9j3P*.FsQg5DsQg4f^'P4SVֻXJfvVt{( j}P)BO:i$1G -db< -(0Btj+{7;nf4R7u?u0ZSʴVi=դVZZUZj)QZbRH)#WLWbJ4N$M7d}_=}4jv(8ӷu6/d&J׾ iS$2L2-cvWWMqV?X²4,)xHN'+p׊H_iqŤ*SqN:IN: -qN)8Q:NÊ &;C]Q̃; w(cFy쓎I$ُ凡B=Oo{)"9vYE(S#d97@pޣ/Y*4;e|1{xFyީWCQvFjhw'J% R RvRvRvRvR %'e O =؝DT,dSFeF]X9Y!Vb> god< kd4;~ -w0UƥEu։4^'eRy q -"HR+wyM5UuUY@t x#Vv(᧚H)ù<3uhSU^dEȹ_䋑r.E4\NviNr.N~I,QXeX]ٹXOuo#q5V"791M!$WO9)JiOy(ےhCWj8+q_qVҭnw-2Ѕ)=J쓝^zd!ܶ%'/_Jl?GkW}_WQ$SL~E1(ݒ(ݒcLvH]K6xIw3&EDnGXuW1J<]DvLD{((A>%YAVoU@O9YsQ:IV%ei(PG=lաZb+d*q# cJy?}4tQV&5A5]]S%w%w%w%w%w%s"̊p=5q_jeXZ֑Md -RzŽt]Z:5>U}Xug#2q:DHiOpV7Z{&^ʒ'"IZnf QLkmAW3O|׉$If|ng<ߦFR&NNN$dݒyOr{ܜ^秽9Nzs]AJ*-S^fFN4r!0CpBb{:(B+_););#QpuVwVO_+K5E-6#tL/) 1DG+4Y$ %ǒʢ!QW_zb /*Z--Xx(8..EuFZi=ըQVEZZ -;SNhr9Z\NVqeTm-8ZWX_]6Dǣ#Bp1>TO*SrSǛ͈VF91 裍Ǣ߂d{0L4lVv]~/b q+b#5d*kVK"=kLz软e i{Ke[=UL̕lZޭ/SIJG^^W8x!PS?exW;vFfjVffjfjVBKIIIIIIة{/b]DlTƅHrNiSEGtA]E@}0QjrcGO##:NW;"].F<׍Kf8ToV -[ÊsST@LpOgdvRF}ZƇ -bՔ]$ PW՜fӴs^{0Jt$uک"-ZުH8|Dj5ȠA*Euٿ}v*/f#8y؉}P#RL(3WsEnh4[s3Nfi94fٚ{3DWP=kҪ(TӖlLt4Vs‰+Tp/k{^W\U -j3<‘XbfjSv*nMة7bT݊Sv(j+DzE~jEb9`V2:8if=Si4ÚmBd5mu:k;mNč_7Ŧs:+sպ\RH@ĖdQ&Ή\ΊWS,U{E踦 - ÚT]Р%SPۜӟ{B[b1eNςw!\wאڣ>b7S̫Mjp@O/w ʑ^ؽsO& O'ȈN|[6`V]0VCyUb*k@ -m7PvE|Ub5ÂaZ靅*kzœis䦔' ]KIUmSJgMkdFDW:c]e!>עj7bNkUNn5LUo)T=ʋQLQFGdJk٣|HƝ|I# -+IUQRPzp @>xQYIVq OQ]b -!T}m=P9GvuVUD)KrS3?{ET$dW[h TnDsM 8@Rpr{UUgQ4U1(5WvS50 -nZ8:pʮ -;nh=T,B̔,Dܐ*qձly#*_En t_\SOM5a*%))DZJQt=ێpS7e/bFZNJw)JcukrPw*m/jRwV)#7[!+Ln0tīLyLyC's^ -W^zm^J D(+!$qrWq*ӹBs*Pʊ6zg*Rө*ߣ}Ug4(o+5UTdUT'3)Z -֟#\w![mPFܓI&&j^N= ;" Cx8+=GUg-Lc¦ 8xU^CwR+e0ѰC 9j*FqsVި:^JZNt3k5k54|w`oNn7qN{OU {hLB(Qƃ SvUuݔ5y'WKԙ=lCZZkJCJ( -&eUD⾕ kx1OǢNTL#PRx-M鰜gb"=:i&;Œ^TAԬ*@=ʴ(ȟڥ|cOʹiRd/Q䃆&O DҊ@jwE ԯNWn*:ݯ۹0A0vX:[+[}U}E[=J#w=4m> r[o7j$a!rm+4*qC@COvW3VvE O$[CG-kCܨ{r}}Z)V~YmYUY+7eg -d - -0 -0 -0jA~NL|k['V) -% T]g#mB&)Vw -|MJ#+TǢמT*ӓT[wnS]{[^Z?QRO~muMv(L(Mq1;ѼS:i5]2'Ś۾ u#n(ذ]cM7 e'ШT*+*څ]GnVUkjjZ?IR=)jLj3Qw*Pw)U j(bLTOVµS -fp<r)ZOftiLhT]6 k# ->g*0+z.uAԗߢ -[JrVӒ;SLmht*#G`{!)'cp ڵz5JHvC*j}Nh5[|( rbngu+<_fjvLמe9n8('{=/sVGUl[a[OW 6}ZQw-2cMة{)ȩ1G6G4iӇ0(?5 1f:Ȅ_â+ c+$aYb!GssDz+U)+MT aT. -.&Kh=e SwS -grk=հVҭH^xTR=J$4:X]~n_Ü?33]Z#W1i -ԭ+We9w-.)>SNIQ<$Z4hVz՜+!46{f}ЏtGtAB@6VV<N_* j cu A#mn2Q-ThuռU:Q4S&zewۮ8oy*"JJh_-jM+IUJLNIT>kfԄRǪd̨C&eY̨dP>J;Wnʪܩs4>? Z8r@zMoeQ<(T-VP j4GU*#9DbMWL3հT͢Ӓpp[VP6@&9?)[FѥÚa0 ,u9Oz<PHr( *a<VV0|>nItLzwɂփ٫0Lz'^*9v]~ 90oLz\G],wbV^B*8`9/b熨lSnEZD1hנ*r*{'(lMc^h;#eظhJ͐pP۵4I5ίF>S e}{&J\(ɦQ7J\NhoGQ0ewiEҙTo3*(W4C~U!VR*(Ei!iЕfIVoU}%BZw5 OhVrB*ب֟7 ЍF%%2^׺+Rԫ'ԤN4uܭl#zMS}] +-4Ա=Z<.x}7+?OxGxlHS% R.4Ц8tMz($)S++sQ:֧F, -:tR54+OmSd1PZ2POTnWmBA|ecDu6"oڬBТj-2 agNI˭)ׇIZ^{BЭEkܚU~{FƊ`'s(Z-5(<|64U{hۿ}0N)Wqu m?Cm>SDa_]1k -SآwP"aԶo"U4@)yWnQ~5BP2Ǣ}v.N&ӗ#5+>+3R5+3R5+3R533S1HJNanjFYm}OaFsO8GqV=ygE-;7Z(efjV}JV}AJϨ)I祵r+@>g2S~Nw f j+jUi39)';$Mzxc}B_XV7NY}QShmrN -+P4rPYR{I].=TVWxO`'ldSb8(qU#n0#8})OyutHjm<էVfkS\\\3f5i5i=6a%90FUok(=ji]جPQ`/Jh4$`TW!4)vҪ/l7G=*xD\̅foҬG#?eES񺩀]֚L^*Vy[sR4ffjfffh9jkhw)jfNCCz_v7]njzL榗4瞥4T}}}}J!([(d@VhY#xx/(]6c='=^=|h8ENU -sPi{dNz{݁ߦ;j@))8̏U++(QPmHأp mT`4Vf}J(B!4vrVp8qP6QUrMzb{:)Zx#ԩ+Tn Ǩܡ%LOjvg}ZZjY2 -Y;)d쥗^IT'֟7ըB*)?6VU쓟~M2ZJhJW[]xyzNԠ;*JpхURa6V1 -K0jZGU!yQj7N/p~TnVZZ/4ͪ}hԍR0SZXjjiVZaN* (Ez+YM2߷IVI.|)nlyVf+;j9+32P-o  -;𵥽+ -bzMxxeT1Ò+Dnq:cLp<5 K<dNVUiEZT}VVhy#SȺي8R*ʱ]7-Z6&\< ʱz[cB̔ c] q؜w&c'5 -WDUjUꦑޥL+h[k%am*S3ѱ2=f>-W _NHPHT0VZ;1Iߒ(]م((aD~&w ]@F oLQpO9"]衻κV$d[;SNDzy6bxdByUJrUE7OqS0KqRaj-V5)jiTY`I+4NЦ%ةM,,8o cuZu7CTS|N[rT#QtEPAJfSG^jQ9ԇlV#Xua*êu?x;1d>E Y&t,qQ83 N;dt -ۮ⁡̪^U_袹\5M(Nj1bP֨P$oe)謅UDWT.oF U*ܔA)T96U5B}K -vZmR4 -Tg kVR5 -` LTڥF$:!O75H5[iƻR4pL5 N>ez{ڭ5S)w+Y?U%ZSdž%UQWt6NOMWM.#*F){UKa܁U'H3TKHrO9';$ צ5Lz7(ߩc]((Yk+ɶ&biE/t*v}C&BLh ,P +p{!QMٟn_4>ώ;;{^4/g -gjMJtVpͫi -&dnI5VnJtS/#g5FsFAUʅEuEE'Kv)ZO-ZKJS*cR$j4:O# ^PpzW8zaz';9ǁܬdjS)Uu*N򏻠B*6P#G6iO *N{'hx{oȒ.hʔnG:5NčF:6Ò|ޥuy}BީRi[U![r%ˆ+h\)^w#ȥ86N;_2^PwVCXueTWNZ6?*66 Gi%HY$/S\4VИ)u}U/n ڰiFLJGGܨ…dfJ&dܓBh@ >#^^(wV':ӊ}FkthFytnoҦ+|>;բ<էfJԭ')NGRvsնElztrR;$qr4w /PUI:*r*+*`୭գhEZ:xkxY\x-@uS356JSr[4:דiU5w);}L{JSup 6Ax&wN3QLS.9],yn/Wy\vhu V:+Sz)]e.jXQT -QY{)zlV4Kjf$t00*VdfZ^rս,V+K3VQ8/x7'QOkܛq0MqN%%x9#QthioMs:+8/M;]no(FB1߁xS5D6S0IAf9@)b0!1?F %v?vP[yYZ@a*dIH*B*BvjGfvjGfvjCDStVOԭMh?MX}U7*(/^`j j;#F#^zG´ -&b}6*U?e:.>!Z -vM+Wwo<:>1Vۃ -pE-GBaB|qӽ[0R!}7K;VT݊w?P)T+D68qѸ(H<f³zNN&yꬎcCj-R,mA/( -|h4 -DX8(qFZ\+8 G]KIr2LWsWsNj)yOr{'99qJ۸ &HrROC:)b5# 妗}? -1WP|~*gfJ(46M!8 -R5+3R4kߊ5WM oEh}yyF;Q -MW}2R-wJTS)iKySm(̠gzNWv54Y)Bvh -nblB5Jm!UDžti'/}wHO:D۷C YsBSZ8-GΈnh𮞴Wi4vT 8d ~eh530AVp/R5̫Knb-ǙS0t%ZQS_@*#UjA~W#z]㒥p}BϚ/h֋q -gD'Lx' E{!/eS^;uP(i~adhVAcoSnl"~%B2Qa^JJ~T=06@gbwIy'Tm:j`WrT9=H(HSܞtu;i_?2J'8RJ)E<{/k{'IR8:m)+EV{IS75# Q* -YX;5tV9)<[SSŸ =Nؤ=RZ[uoM)H씎R=97n-WӞ1Kֈ9ʏCܨNeA@4@ޡe(ZbaM%@2PBq7;JS7fjUZj.KoVn㊘ኵ>Js8)$NZvJ}tnU^; -5M8l - -G}PӴ5QWzW J/FEC-ꚧT5Exhtv Bjd[nRh7w6m* CMb@EORG2G4y(Iz8!"5F1p4ݮSM9[t}RuF&xtlX*~~[u~cMP?9MDFע٢Cx^Z]){1Vug -PDSd̐fH xyo<݊ẅYug??f\{6G-4K#mS%™xcA`hݩ}l߫ڡ)GVkUYؘu<2U< m<-8ׄM^[>dN.CzeIP涪vfmC3S.9+F*ij&THKAݔߤ5)\blr#G5Ej9+INrRݠqi2N'F˭mFPWjMNJ+/*x~fIVz7"5QPnIiTzʞ'3opWU1VorQ[ovE[*vh>1`uZx{w򦒿_F5hҧ%1up6gyi*%iy#Sʴ-]@TJO{]K ¾U-՘V4lLs -:(jakGfJPG<0̧B:Q88rс.^֋O'@2N0P =?A%XrW<Hq\K/9jx 1(]ih4[,9 -Q'ɉJrR%&=<VWmU&kA޺^9)kCLԩj*{Y̩|f sPEp۵wC[cObp[yLQ%Uo]m;(w88Wzssb0Pe=T8h4ZN@u[xUmU)pV#2㴊`%)V6+;}eG n8\Q51Q7Wi=k1DG-[К xD>Ɂd7ޢ~gՍYPēи~f\ qF]Ab sgb26s-hg -J4QF&ںF>RڟXٹEjdcnvTnj%v;rhw ;:F)]Gd((xSHVÕe6HVfSvZ*Fj|qUlQ1F?rR*s'l[0<NTl:?;sMz#wj.k+,'3@E ;(ُD(u<~MJTݓ>T)PT֩(iurMĨiF)Se)KЩӱ<;?*yN{5FM8qܙ"o)S]YmQGj7 +&(1Na"` -YIVz)#~e$\:o:ңݕvOJ#0ɫo㥯u7}tVWqpN -i( -l=ף2Rf3cl׹U+,yd htX'P -hw8陌y Ίʵʵ -sqOk. -ChӑSqn4Nۧe -;QO>w|\{Wv -օY}UTnew=teبB")Z -ԭEZդ5hV*BSt];Np;ԇ%)X2}P[8pպ,(F䣹'O5)8SvO'fFU+y+tV}*JJ#)ΊAX+9c M6XInH{/TEwCmV -hSE,Ԭ=4Y1Z V8mU%0y*GL}ѽ4vlA;*Se]&ެ~ J0ԊW"4Su1E+ڤKS~xQ<5ۊہڍN:7Jo -V{: kPiѶ{'dʃ{[KFimfMzcTnLLNP~PwL}M68Ph8B9 Z _i +Cywy!q^Ӂ aÏoTjx9nRHnc#_!Ǫ5穦*E!R9QQZs3Nfhyy+TuFEo)HrRʈm5 R(S3533Xf+++)֋o/~ךrQ˒d)j cA(MϚ3 w"S.>OĬ]ݱXrP%ciESeoN}z9.(4iM\g2ChJ,aiƵط|w~p%B wPw] 1nĕ#P*lh4^>_ŵ^>4{J~*h_õ +=N[*B`?Mvnڙ OJ(iƉupJ_ŷR:\ Z4UٿnVhWniсRt{Q[$A?1+5QO&Y:X>pDgDoQJj S #Bs]-袕HV7ҞV'g -]Q SnN#ڽP|\<4P5p>%FGEU6E\8>0AJCsbt)UieZGTO&uM pNMN`r9<Հk -F\T=Qo]}/n ªTݔܞicNFܕ:5A.ItK?)RcJ|JG}%N?J.J/N RIZ3duH\OIe$@AEf% L4E*{Tڢ夀w@Fk:={9i[*x5ko T+O;m4KZeBΥ@xpox .8~ h&i潦j:kN4fTg?^Ы'XYK#cz8~uVcՙއO;'͚kʌM,CJVh -AM? -w hq@QhO*/z'Ҝ@Ě)z'A8({G -\RVxr~.iMeAB<3xesy[^jYuSMRm(aV|9!oꨞЧ9,Яml&?0(Zc>rrlY+%pB|ɯ&,B̔, - 1YpToBc@쭧 2[-dh=TT/z@Vw7yoDǿ -~f4؂yhޥLzԣ#utܔM1S ׺8 Cn5R]o+jj]6:}2q wN_K4ڥ)'`=k%܅*m%I^[G5FG'K@Bu}݋mtLWپFudAo-B㴣yOk)@y ?\@*6JX>^䬿@=S<5T:]>7X;Պ{)qCvNǚ=(,]^m> Mz9wPޔFB!h5 -+_AuܚJvj(F&(xDno:Nճ8z)~=uO V;HL󪷏LռA+wͥ9&&q Nx}AZ2wXޤ =HT rW'Tic*7Njw( nۂycy{†;T!CVK=QkVH0mATEy 88SF{B*KixQ:+):ԕF {*UBixRv]SMWު}qSr -;irh],Rܜ窒xBʨ=5Q;0?PVw$~oK3JHCuti_'C WgUVh;?hB6%2O̧Ǣu)EEu8)B+HV*'tP7YBXڬ91U -yE.XbTNեYIQPdwunPQ:cS^k~*̓)UԨy`QКdkz9h8)5B)ݐVSzi82:]ϙ+YktVZLxV VzT(եnLӠѡYơYOȬq*f.HAibܡ+;2Vvd ѱYC0(oBj5iځ̠飼QWjӍ&{@P@۽ iSޞ90B'DqyԷ ॼzSCiV%7lW9ZK6SPdfzI5VHd$8;1]T)jTOrs);‰([&y;w(犅dj|RݕЦT7'ZVqoeQ3 `|g4e~R uA2ށ3Ua=ՈVNYR]Q{ǀ*}UChS sRzhyjI TOct) n -b_ qN;rVުfLI{٢M@h/ -Z7 2Mz+Tc}m^.tSlVDPT)\ynqܬOV+VԬ垺=ٰqS mHMnkxUʉA"QrX -K¿b1 {ohe-NZ(98:Za䢐c}8DFJI;)$iEpଲNn*8Px oѰL1ޛ"2BHiqj^5MciJJgcSjSdha* :1VCSYu9آe(C_Gu265hnjʴyt8j֭VHUVOQH:ww e[/]TRԧ 1p;SKkhÇk8ָz{Jot0nJ&dnHm[|l[ m[xy(zT=ʇL+.)ЯbA; bfT]m)[jpV׫[V?MEZ|զlӜZS^) 1x)p{N [n5L-'hrQ3$dVD#Njv'U+G 6ۭliFsՎufx#ftՑ׹QX]U}H_N6-ǘ_c+8+ѰmVxx֊[Q A -'Щ^葆PHhp7q曮7F 0ᤰB8{&ޚakvg(qvT]LQF4eWfi?ZJU/` -Rzf$*W?iRcS(ƻv:@Ocg:wJ56qQ{`GOJ lN>-L-5۝Z[}OE ݂`wuWAp -VDE(dYߩD6%쓣 -q~i!Z{+QZdZޭuW+ErQW8¶:{QR?:Rv)NzךF hx++"ǧ!u*UV'wPQ/(ҪvPm]}*'U}tY?edod¸w 2uTQ -otP$NeEOSU -zcczbT ႲMiPtWr`R/ -mQ^SMX/ -$S=AFSݳS=>y}jnS{iCzTTEKUk"s ;iLRv*^CyM;Op~پ!FOõ'=Q0^9PO:w f~RTsF\O4F>{MFܓEDFiR0zp>u'f -V- ꭁ<9|Vj}]&r((Yx)0):B)>*TF&Dy!WpGKO4Ǧ9CBEwvDz=Uմ>t<@*nT׉?)e, -s*W?MRVRJ{H3*gQE<6izEiFչsM91:[鶧b$U Ќ=v+f(y9'JLO|nu.4j{r.Y)\p$;UTn4Ӽ da}UesҊAN"A .Hڣs Rw%j8(Û`WMӽm:B'S.' SުxéM{YRis=9P gs`=^]-#/E_w8֏ [ժC :_y)VzUY^gm;ty -;(u -8 G"x)iN~!ܢ;).zUZJ~@OnnV{-w5@Un'+cVV:HS -haV=cܨҊOZ;+GdtETݔ%1 - 7FA=<{SޯH@-GCN_ <, -dnJdКF<ʉC -qR(@ -+[+k[xlQ#ҭ.g V+SFoSL<+{Q/7;i41Smপ4Ll@j@nIGʱ?E+TW\w 'N1Ӫ_jrN:6[AR:U|4D'V Hx(ZSz}I(|xF6]ܫyr>)}WBimAsOxp- ;)vhi~) +9VcADA)jܫINSܞ)DC3 Y{M([/kUhТT ;j:?Rut}ژ[2f`HL՗VC b)3N_]4u -z;T{L- qѹ6jRnITR5+T&1er̠ -Zoe{&+yDz#O'sVEjr"pB(BimMkS5T1AHrݥrFݛo+4Qʌ9;|4uwT-A TLrTCFixicT^z:oG@Q?}1SGrʴuO-,D(Zʞdt>x (n -˧Y*SY8c Jn𢎉F uC&|;sJm}PԢM,ukM-Ac 5ؿԭ=ʵw)Kt*PtFKyF==UjEZQRV!R_mq!HiSԫWr]ʵw*xyڜ_xh V_@צ>o8ܣQ Q(wiIFs*3Qk`ڢ5T,P144p.LgdeNVbqt 1kLފpjin# 椌dge34lS](ђ}Fu -;U6M:S8̍J;h|*wen 1dy<{IxSHoVwV+\t4Wh_UIB8y,2 -S % -WIqB22OJܧMSkAXXG <.Q7-]Vz͠i犲v*YIVqw-,!Yf?*7fih(q; -6mS fP)SG533O.ao*O)ׇ\ -xڧP))MFb 4mO>\E5 64U>Z}j~>Ryvͺ8TOQ=G"DׂtpEDqpD+hާUZ5l:ACIDi1ѽLDqS~!Oz.+T}ʄb~Mncu;3Squ榐嶚MLÉD -!M5YVzl6&FӶ[Puy&k@OvJST݊R)eh< 𴻐P -/C/0No\t4B[QRvK>,<<5{ܤ)&vNԱPhvQȣ>qt:NqE Ee~ -y fP'ѿ*AH;)E2F;Nᾪ@l!ON5)57)ZU3hy+Zsvia@^M 1F!& -M,E?eZVƜTG29@h)DN -74pO(za3 QiXJTݔݓjx-A*sM9珀hMdܓBhCK!1)#o*ºdhTfI-d,@̔ @̔ @T*.6Ͳډ8oE+ S#9($<8X=T,6yƃJZS7NBx0?$x]JPRQLxkapFJ,<.Wwnq^.>AqFZ^ZXЦ@ߡ-)^h7CEӖzމ)41wӕScTzrDŽ :A^SSSuU -q*xVS)G"43 ¥ky)m)"U4S4 V.-Z/8QBbh>BκU5‰Ft==W@Lw*A'ThOTBt -@.P4 i" -` `[M*vjv4nhj գ'f(\1x֚P3-,7j1L"58ךB݂;n"GSLN#@7j֌+) uEnGUM= tŇ?z 5y7 4~CR8+VOz{Squ SLݔZn\O]-\^ЧfQ_9*W+sS3533FZ(>p;+2+3R5+3R74tjV)=0LiTƎ`Y{'Vڜk :8B{:VVn;ż -N21։J4hw y4lMcc1H4tG1J{ QQL4H1cBKIoi;ѻ؜GEpWo5;1p•X&鹒cP˒c+(:=+<+4+,Uo$s ?V?ԬC]ͮw*@0ҜiJ4-mpZ, -}֦hvUshNmxMOISLқm9,]ک#oŠvO:kXpݩ{(]#k)J o|śW GȩS{7bM'QVߪpc URWM#jQ}㆜]cqsUX9 Vx=ɔpFF'y#J[SHե ƪQ/7p'%)Jr)HoIwN( pORJ;&4pѼQ.P/spp#Pjcw}(tQ -';<1ǚhn 9 u*ffnjVfzK(& AeuTDTBE_]AxP:%1Y%m;l)V3XY+n/*f 7 8z!AS9QY{f>ϊ"κD TGS)nԬ\7<Udt IRx<ꫮ@wx)D -+3Onh7iDz謕o[5SK\բlբlԲLjj*3yÂ|#ñDܔy]LiDƏD{i0-G$۽SfjFO 2⪞imFҟ6j2wd4=<;FᚻSS40f(LQ1mM \aq^B&D/T% !*6i:EJ2Oatcb' 8GU|h*dWДo6\PŚ uu 9茺[Zqw rP$U/rG=6eZʴ 4T&)J.7'HRnR©Gג{ԎRJ#MujMot(H١Wet7O)ݔ9SHa#9Zj -VƨD<1Q3$\N4S34Tͪ'Ti[{5LlrQ7%2Q7$S"w[SÿH(%1=Sk^:]D)\ - }NS53z}7QAXA}W_|.\UES#F C\x.SK6+.RamH/WyRGD~*jF)ٳsZKULqmuW*߽6.hpwP}](NeV*U;tÂkǢ5AhW5R4i>iqc c(u5[4 -4F<</o2 -FejoU(;uPDzB[x>z nDuŗ$zM? T2y:6' -zu `uB̕ӪZB֪f UdmѩuTПJ"pVb{K=+D4oLjD;+)VG+1*;qU~!邛5 GCS'5S5J;]?Ȯ&z <VW`x,R -!FƷ_qռQ=FtNBM(%ΟY fu$@=4zu0nID{qu)&fJӆ -dh=4fJdfJCJɌo4$YnJ&Ykw`Nr&ڂ)h;B4D]'[m4PQ^'+)DWXF0ߪ Wzx'w}Gp x{7=m N@*QwPW]`&iZdb￰` -{p~mrKWU@A{W}Bݮx>ImJ聯PoODkEZ*ӞgC@AJ`₎    &&h)nb{#ՌgT(cF(}]1 - -R+@Ncqb -)b>()v#Ko=ݔ6=qMi *aêaaNm&Kةf=By'uww([Aw7Zt`uNy9cwat`rSHhhu18D5cƘ޺JnJ?>9jo"ݨeFPPA(NAA -?y7QT eSp 5(6Bp=74Zfjբ<բcQDR5S,{>*VG姄XMcy^RtꙊDUL/e!#5PnIRJԯpR;4~jWTLL3S?53S?53S;5+R5+LS?53L1R3S?53JԥJ+R5+R5+R;5#Ovi?*W~jg~jw)e7`JHGdy(U;zjdR*GfJqR53RN5(Voԡpݒzٚ!QZm'[3 -f9if=TʴԂ*f#PSpLV4fjf;'8 ?B3Q1&$Rv -R*gvjW~jWvjGfvjGfvjGfvjGf~jW~jW~jWrJT^I' -JH3$dI1(ءjfFj9ܘǦA=_9HrR*^Kة{3TS3533S3533SǚJԍ>_ACLLϩLMة{k&=DsP~Q1+!1AQa 0q@P`?!Hs:-2Q򑞫}FvLa-To;k-f~20~4='Ѡ߬}sp]dH6ӊ hM95SvnFueuG Iqy'"-a<.a8 -ԂS|ӈ19F\9Uc 1Kpb8\hhpa28 9i_\k`Jd|<pC.@Ax, Bn\ <'G'Mf,\ ^SLtG[-܀Sτ'{' ΓXV!b /|CB{y5%G`fnFc>x_)\4*)Af !#C9W^8*|өa8N\|| 133P' |5#2-0B℉ӂCG8 Nj\c:um7؄Mb% h9x6Gd{O&M?\\489'P/ pe⁤| 8? Lj x^9Fbpp c8vb*5/_Q ;# q|?.KXx#!>R>_p<ӂ:@%ߖx'<8G"q%gffnGEXRTRU"e `q([K,溭ְ1_ W~( O8H.e!q.BŸ!˴g^ppۖ0XmT#rǗ!qgq\TS[58sӆ eA,a8\%~3pQEpsoh:x׋80]%ՂcHN_ xL`BR)|㋑Nʳ b#i#, D5#.!๳( B2VE:ʃ%nfpP(/_@E.oʛ?L.J>"6=h}|"<2}F &nD`uӽ81$ -Th>-WBqK<ƕ'% bȃ7S })D6qeJ +]g=ׁ4?p?'g~r$0U(H>sHEQ88=WHP"<>z/T#1djrL|%fT^l̚~cȳ KX8h8Փ# S!&T4|a-`x!\'%r9tE3R[ʑF}>t W,tF#f$sL}Or3JJՔ#!s$7#ߓ|&H>O^F`e0-x҄l41Toȭm&8PIEWcP*eBP 3>$L\*WXUhk ,ÓU(դoeŐ!ʥ~::IpӇh闖c2t48X2u`A<1A5 B#8I4rhHe8 -Q2:@%N"uVk`MσJqD!IR $Behfl&|fQP3D[Ltms -3aB`օ xy -Q"EA8k\//^&p -t +`kA ?'`҂.RuV f#!3+&|' `X9@re&"Jb$CH2y1p:+P1r B-Yi'|.!|~$pUAQ{*zm'`2ʣK\4s¸P)HVJ +B?L%zdy߼ C~xOpPCx{3F EЁ7 Ei^ *յ -tLAl -a [d (%N< *:B-`IVR2$Fw9XڈtHw/hQ=r= F" h!oXk N$ -%<J9q}&|L'AoZA%+b Z5lԫHua MPEAQȴ$zЄ6PJgM ߄A&e~`A ߳G]}H.d'@ -SD -d ө?ʠ 60,=qI.~N2_:|y $'D8'(EH@Yo4B )~d錘eHm_/ 9,O| -@ane:Rkxr9?_)̗+8G>8O!$f:U"6͋MFa6C -DEv~$ĒD8g&22G,:X~0prPKC~e\>]p"|hڙ&r|18"PqD)ⷍ,k=`@CTe  U53CTaD#.%q((oIerC~FQM(GJ 995q -E[ƄT+|eY>5|kk4Uh!¼4x>}\t.r;-|C*cj}3*uQb?FJ3B/0)B* q9*?Eԃ](SJ~Dӿn- A cFd7oܕX6~Wja|Ƹ$;Y dCL ͂"#BHsD2vpiD؞#bhEb#=62T0Kd&G.9 %Lrq3udK&@k&z #  PN1v<&`0VzIP/#Nurs@],2(KLxd,t+Kƛ7eKeK* 6P71QWd&tS M$B8`Xٌ3y!),@su)_+BUz^w!a_r}>zY-A`tϪH+>E-Bx-ra9tdx~J`?L(qkԉ${BޜKȷoA'ɓЊϒ  -|/oKƱꕖSQUPKY?3>;M|@(qmc&;*, &Sw Jl0iX3#uUFWMAl g2gZ{Cw@ѣU38ʤ*)@ -ʧ"wV&KB[!8O -TZH?l9b ɷTnxVZhFpCỳ#C()ø<^b#{f$g[" R`Td -/pA׀%]wU%)Lկ^2 JB'.r M D)(). -}zHxQGQ@􊶀4P9!BGtAFCXHUCժ6x⠚#m2'5.hcFF -fHAwM- -lTn3n'| \Rk? |5E TaSK f@>FVf\Ou չ)7K d0b5Q,]Il‘X=]DGXo}GH"b(v9٬Kq(4R'J/=fe3*EeJ%8S A0Jxg',?SgN9A( B)HU flH_!BvZ"s5Br43f!O|35zϑ~Tuq>0$q_!C|Kzq<lp,8$?~;BAD&e@K C"0 wc4`A0":'2L`BUW4!euK_ I %fFE:: -b^w=-A3@a)i7]Xw۬x:t*! +.k:G -jzumvsbn |e`͎M)l|A$C;F)[@QyRa/ zj(񫶊 72qǂ= -/ӟU2CBGu-IO=a^KP4BÐJE`ݔK0hJ"U?r'gpd+ -@ 8Nx*W<Ū`R;\T:aU*~!UOND+s>_p\EzA!Tج6TJx"1%At4ج h*Axbᠤ3Id -ACs[^.`)M& Hk-oX^qa^dDrELFgˎnc343^׍}bР. -^eD0Ti YƤ 6. -"ˑ]y6p.0 %{*@mGqpb*z9RX*GT0OΰM -s\OCĻ24,mi.GH{&{hu<寊0$'Á|}L]H^.,? ~ <<Ɖ] VJ3C[>>/8wd#i>?"&^CLoe0UlrW3 `.GS!`Lpp@ˆ(L,nX\P\Թh<.6AiZk `c8hN)D >׳BZ9paBv9v*. ,DJ"-7lV%4ц(@7xg&xWP&#@&r3,ݏ/j=*hy(T"&iOƈ¬IC8J/gLTe$?4\ALH6!% -Q 1ٟ_"Jџ,JQdQ>MG֛Q"Oփgi12 ^ja1%RTXVSK ,1[`9F& -qS ֪<τޠ[ ٵ0Ax>oyoYME C -r |@4RcYmyshEw@r )̥1'`;6C<$Cj^]@Kr;$IU*J Xzp.g/_PZ<[;2 yf/cRUQa>{qzxN9I.CaC|cnD*2830RE {f G6Љ ")[ N܀~HwJi)j/đ Fŕ=f [< Ѓ[BD"ᡅGhzEplpD*tt*h])|C(NAq)PpC Rakϣ0jX QAk*y!:% nP??>AS|{q-[c*2y%># k$AUSW C7E6H~Qb97 -Dp<9c>B3 H]c>qN}@ႵJ|c tYNi_xR߬ E0 &0R:cTcv8҈Ka3f>&`#<;P"tΨy"@0[ {!KkyP,cC\vw)ND$H+O7n t011} Rj$4&6fGIJG)ञCB7 $s0+.υ+P_UacB@DKV#sQ4@<s}P"a@@&ZBnA0cZoIabx.ب ϢXZ2b-Bcxv\A j45ZO 8|vy)opAʀ -#T0y39  V& Cⱨ"n%z ϒ,\gLRDEo ʸ̘ ç^*ZPKJеCr7k[ߍ,/ mī9pR_0N -ro-Q:Mi Ty*cR'OQ&Y/5)5iZ+3*zF/[Ҏz>/|j&W 2KQ}Pn#1>{Of0Ud&w %ˑkxAB A - <4 npY{vr9a\)KMi%1# PD1LsXqEKl5T !@Z@hO^R>0%w”8pCB :h@U噌 Fr*(+?!{ШyiGkCӇwaKY<ACm -)BP*MYV$Cy2 6D  '\7i,Axz\Bdz%E{ZA`X'ą=:@%B%,!N28EtN@J28 3s=! pXFQ" ({'BBX017ꈱLRZS! Ec*qB= !o: G1)0k1EpcXL6ѱPH}&23kx/B!,>QCX -כ[hW=f T;[3(e.ܓ2??U\K>Idn2`@cpf 30K9РDfXU*_3j :v,*o --eY`oʦpܡ@ @EK_̂` Xt6A c {YAZu`/ -=iټ(FdĘZE7'ao0χڛ w0c$1yRЃ(mB% "f7l0=[d@Z;CP+hЉFǬ,tF@ z!B vQWN7q &At4@5Vp¸ scaqa"%5%A:CZ0zCSNĢkBb9WO9= |t\#\?FNˠ31Wp#xM:@DavFx,=pP+T޵P'+[dΪg3-Ql<(@K0cdY2{|w rZ d!`9]Si!QG,W!6!lA:GΦG r:B`pZsox3x3!26f rUث'H( =YG;P!d0a1Hod:yY|A24x/h[4y1QKetTp*K&|(tZ/!V!L,SV{zϔ=S~ܑ1`c,/p)^"u76R!؀1 ʖo9?!b=d%Dq\~\k(+rIHWxn@ye  - 1^:q5YHJ9p{$@Ph?reZ -2-2@ȋR Lm0v"y~B%bZ$`UL!x8gXr^1Adg2IBn/1* ׃3QB]x9r|Ox#,2Mپ&o&6y6"2~) LBR €9\Ch[7׹vvhI_ 4iqU Bg>K# G |Ip4~<WAZC{K'G#J }O"`!pЙTZȁSj͙q =b>oI" -Ht<`ȍI+2[@0¢Η8`RMTwj<)j&`Vn` =D=JHIul!TCT؟[@!00B*<7c -2(y IxǏTQr;_)[|A mJZ<.CGZr( 3%\)ɇ)_b|B_q&AE"a01NBSNfSBGUqiw( :k)$e PRAM^R֣q4! \ȩ`h :dd$u3CLB* .@gX@]!qʆ):CJ]ԳHn1t78 ^ 2,;iX/,In*吙LŪ?'~D&yeeҋ5B=.$[}O}ϒ~=D%~4Jhm%=󿱃Ƿ[ p D9DU!zNxplylp fv'A)|ZWCW1$bFW]ԅ7Kq I9׀~xN4)% p&{KErˤFQ CMA]Uh ?hAmm1.C̹CiG:<@M z#cQ68a*)g/?cЍ;(uoBΈ-)H-PAǰ2EIԿ~a ohAIqpx+xB$p>yߐy o< > IXD2"̬8{&À>ǒD$A&UWD܊44:QW9%<+&;Pd']Ÿ<ߠ0j?JJ^ƨ?WVB4݄Y@( a.lD!R^c f)N5O8p1GE+9.a?xL{q.PgxF/.e6[0! '?W~ QA:{C\c }.I~'z1Z `v0/.!Bg0V%}nܷ(5lԯH7Ww~(dIfH*N=Mu󢵃mvG*zDhU [3冋hhYb*NWs$T(  <sB.e;Y)ŹGsGC*ci@">h;`4]aNx6G($h`rʹD95{>>>(yo /jX=s -2l <KgZ=gg@Go+9;C)=Bx|BN b!p#KRhCw':V4C0CWhO$YTՀKR a9lqHޠBFMr@([86o,A8 xTG8 -.pUg/A~:2UP#qyS -}$$]C6aC$'Åf).Bqx\(N)i@pTJ? I*"&f(V:5Kt\ 3znrސt̓p\ FI қ@Ym7 ՉrTBY<72v pF,J>08p @# - ReӒIKQ U&3=!mi O %RZ1X\'YDW&S8^7G0QuR*)[RVk+XЃfC )6L3blb߈uf;3:vu1FC[sx :{0 >đɼyP+gw dhJ V3SqcL]N?1"G_7N232\n#2ܕQ!hЕDt_L+\T[s.2GNyO'hs=懍 o>3O}wg>!$Na' }C("(|T1faB6Ew@Rȧ4X.et  7XD# z^0^z+%K?yNy yQYaٌ/hڏ`T9:_Ŋ . -]M.A! Kb8, uBTC \mNP8Ёn '%zi~H%.;D4x s Bz>Kՙ/z?^B0$= c,xk6M;2q0A#h$l|c0[B g֡OQ=Qt +0`m;%򀃭! @E6A6D,&[6h@ 8+{S* rb1OhY6_=& y(˟>}3Q>4J+8XA=biR0= -{s`0FfMDJ(xn+M, w Z}ib= E-~Z1b95B< `ưKnqњXnKq!-IFFvƥ+R 5g"va :i/ ,6&M\aXrAjkqrDΪVB(ڰƠ~ -*FH -T 39BHlt,9F0hW -̩n~P2cpBZTH>,>lR[}qiw9|+Z7^\iTv -=ώ="A O'ϡ@T+mz+(90 Mh _iD?E%PE57؉q7@tm}IQA=c\xzǣ*7=>M3T0:@bY:')8bcÀE)d`N~IƊj,PGbJP 9$K0!;.tAAx -g5% g^~QtT3:+ #; epgB\=,|ub!˼ȼ߅ D,i.2 '%ۂԇ#| ݫEH8 ()}oY7!AՃ 0 @E.9~zd=#\Ou31_ F.<,'+4n˓ZzOSX - g<9BdaaK! Oi?ɛ >XنTh/oE>Z=↘?j_ *[}% -ӂbhE5E -;X S ث AE ?)@(vkfbPv, 憰`ִCw HQ vGr'9fg9NY!{O=>{6TGC3LW'SMFlcxfX |@|ʗ]8  F -u!lXo'|{ d+@c`R]g؈? r!cPp/7˄-ć` \ -o%_Eԧ rb^'1 2s8i%؞HO YX1ƞ/rҞQyϷUc?v{r_ԔQa.\k_Ds?PzL/6FA&'_笣:y]:`r?H m.+kΛB_"8|xA!,ܦ5kƼ %3" @ 0e6@h2I1)I( A`a+=C(eɊ<:%aq00 j xͲx%e&,+- -qHK8WP~5ӛr^RD?(blhey 5Pp=icledyQF: !tIy;XO,F Qtg$̒lab=D8^FxJ=%6@)PAL]H:$sdobphܛo`?=CĖ 3{#FRs,n5)C/$+jWC'xN':o.ATiB pиx'C#-bC-M2>O)>ȟ<zwBBeopNHy32l*yXBo13 #7=3?cmBLYp:Q)MȠa/e C(8v 딴t䇃 Flp9EdT&IͨHJ9'4"8VYo_!Z>HtXD2D 8r{J -HyM5bH4\CfQCp(Uy%CdY@@35"]TYNQ9C a6"*m~4 Hw$y od.D@2;B0M~P!PC ԩUPH;_nio#s.eQT膡ӗX]96Cx Y5RK8G՝1JC\ - ! "_17#ahHN<O j)`!@-8Lzf8o |d*8WiHIAɔ X,a'PTf:C:^Y?ϭUԇq-Ci (nC/aM黆C3b8"}7vo'hGhgG#1n\JDx3ϰuu>]хx29VaK?H4?<0 . nצ@q@Cvs(9'a"h(*T0U[I#5R%8oQL5E D' -r1;ϽG|(*2Jj(_Ł݁(Rw2C6ܓ#R;)zs& tc+es)#[~77/Cq<\D* ;Gb JyJ:|s'@`t> $!' D)a ! -[l6Sk710&(>w|τf@%)/7BуۀDw-ySae# C'D1T*gRWa>Atf ?L"HZ5!Ӓ3$lH)69rH`Đ$CWxp -r)㇚aA\̎h aF,p -bQE `2D%+ZNl-33(aiB"}G(I -ЀH.4ƾBB#G8[P`g; `n8]hIJ0o<Meq#b!0dY>>| -+FX. gYμ+ cD?:m -TC[Kn G1ȗq)\1O -|iǯ"y?bΟDnsA8# zi^$;m:K/A0 _q_NKxDh^7n[x> v ng*,:$I4'Ty3.BYsuB$>7WJ" y80` ؘG` `0VX8+g, -z?IE7n0*[Okk 49Pta|)2f*!!"*Foxi6o Up1"\c ꁉb؄.H!-=PdKnz )dd}YhtPB$9+t<nnfbx(fWH -aLr̽TE RI~c(0Ӕ"p4,a{ (K&epn2aHByF8"{D4 Ϡ/U J@jF2(O!_}'|oy^Do1IB߸{8(Ġ闄qBl#)WE! h>A0A%ҍ"EaH rO:0DڹъQ]LdY n8*u ( k Ĭ/Xs-:AFzpWCz)jv046WaJg˥@Afػ,a J.W xK^6q -G2/~K<  @:ϟES`Q #'l.t+U @!; דRq|`!O X>S#eR+uxHL}'DH1"'D(PAv) )(^:p|9x !'BQ7x>$]=FQA00QIr2EI"_ Re0JG,6Rֿ=Xx0Z(wb_U3ƐwDQW 3nPrLu!jC>\@u?0W&Cf҇GG_ zM`ޣF<$"/I齠 `$fWR58{P@/+Umbez3EjjbBOfii)ߤAn޻-% NJ| 揑#}x;b[r{#`Cbkx h'J.BX'Pb<@ck@r ּN1 17l# -:zW P&P%BXey}|rw9ȪQ 6|4=AB֎&P/G}[}JAO `L/⋈%dx~B>..G%Y!>mx`]74.$F>o|̣JԎ3gϟ?>h5j?|a>H,B t@-EqK9fwcCVѨW!1!d0;G{J_?9XSHB,o8W |wT?% 6#,OĵdY _1Ze/יP^.(9GDj((1ϼ{}rF+8@]rrVՊg!6W89K؉T u/,cnWxQPC 8zqܾ$YگtO1) YP,߂u-C*zCgv3@ƢGE#BN53ӊhɃ V!R.ۂ.GG>>{M߃}3}3}3}͉oDHz2leE%@Ap9 @GT2܎b^(wA\Y^Se5H|yZ+TвԏxѴ&1.G`5r4R{#BYc;O H:}&Kiy ;eV7RMa 4$QQ7\\BG1J -p8["~SƷ(8,]wnfou17H" X? p5 88^q+LW䬇-ϊns{O{{{xggg`%~ӍU.t$ #x:ra{"UW\ʹ0 #w[:|_? 6!Ff+@\T.  -Q2(/E#s8ahD"Gf%.*tRf. -Ɍdr2},3ÜGX ̵jp&RlƫO4+ -G--QZ/בpxˈ3 ZbY}};`y >>>0{3RgrrO=5o0Uq?0 􃽝M:I -0q7O=wx-ڟA9/;'_A.Pq?r'`":>1O/耮FO8p_+|SWp %`"|ɾ13S%Ô~f@E9gccф>GWEx3FT/$,&ځ7AN: Eeߎ`[d ve ;0}8A=pKXg>}#}H0(QsHCSĩoNݙ%,H"(G Ed\ta4I!Bd>>3I=Lɂ9] 6}LxAf+b#*ž yaw*` +8c.8s7oF%  f`EmFx B `Li0|l -CwŦ ~x00$>,(g/m] b@bʯiMF17GF 'qTX/ 0iC -aaG3чs L W_A#UPL&g/oR:ՠ$e}CL*M0RRt\t%`G AK_< 5Ct@#F:` -~;%8wVZ 3/!_ JT% `/}p>ۛds!^0OODxx%9>V%=!a>(SN=FsiS7_W!2*|q>?VyAy `vqux -Q,@&C6##Fc&P &p|2S@/2sӤS~b<1dz5A0o6J\\k)ӌr^#-@ x)8T0S|O ~FWXxF}O,D ѻܧݧ&qZ&\C3-ɱ%|ͥ# HDU]'䍂x-+#*IF`'>C0:e0C?dXEY_ܪ_ e0^&2~0; C1R4g 3ߒwAc&7EmCx@76ԿB] !PfV`.L;C@x/aiJN$)# m9<;863>)P#̠m5.qW8P2MVmHGHCy}aS>ARM( T=`tH<&Nr#1 }Q -ϖ/gpK020;mj(Ya"fX tvot~LQ8+ 'Ujve;A]CA@gyqT{O=hm, DŽ `rpz4@հQOD=8lWp$O |> A`XR:%#HDоq&xMj111< -i\`J&aRwC)fs<:j^ zS&tSo+J^2مm$378y`1vDvxO~4H;u )Q{JĝS ~X:qr@{N2N5 9"S<b-Y x hh.F`,gJ12v,2D+]eռ00PaX*+&s_ +X*bKQ|7`xKpN[{"@)ib7(`?-kc 1HHWA`R(t 5 8Ϛ}kCٙvM"9~P}ӟx1]I@/.@Q>XI` #P`˘ DBxX/8 ]S=O|q}_T/\6ŸQW2 F]L{3[U{lƋB20Hs0BP& eC͌; -V&PVp>DC C*:*yT`DS*|TH@w dBJ~C ΉR?1bl:}C#" o(V9~hLBHh$GȋV4Y8 8-kX b8?_r r ro i2d"BP.   3xJ@gswS㛿O+Hu+*+tX?XH@ {P9h2o @ cSy(xFB쬻ʁ h븵1={4e쇯Xe.,4x@@ -h` .L \W;jPRS=@, W: A@aAS"a5a@aNo~s._'HN֕C*q>HnwFdC!qHt4 \0􁖞:`^|)ʲ::T]laB3h`"'l! ^09jp(K -)}07a׍r%e,'F'0сe P{r wUiAc1'V_#>b‘~z\` .Mp=2U؀yHU&0Od!>>>>>޽u\uHw;:;KDuJ} z|f!`HHL ԣ>~ɣذEBPJT^<¾.7&>7A2n=L|IU&:{xuQ/J%ax` VE*E= Q[S5қa D~S!َQ%Z,)^a%$R,>PιJ~WAL*>34,p0O>ex 1(j0 ڒH@c]Y g!\ -#Q7 aI]0;;Gj)^P7m$OXhB+1>! $Tz5W&%^p|U0`* 4r; .S+ 2،\<5 ,*l1p. C`2J O' F))ϋ2g|o3oOO?>?|_d(ߌAB"j€(@Ktk嵞-`Hb[¥(=~"!Kb!9+aP ȁqh? (*139T֌Yh ϗ3Y*wz!ҨkDI̘!NAgxγrn$ܼE3vo s#*Ǟ.<]! -Gg >4V4RedrpY A#H$pw[@ՂcJT~1BƘ\:,*Do})xYҼg@XP^x8'h( 6XGMa9q 6V܇h512Gf2eA1#tyCXm(E҅Ke`y`9;@{@uS p Tq8%1G $HL|\<(D'Oo>}ȀkMܷKy-ԷKu L8@--n"e .YM/j}+(zO mQyCl`YtB}2dfDe0sBF&0C/MP!t(4C4 %#tcfXB  pÌ? q6=U 6,,ÏJGMt"Q6x(cSDRF -*Ue9Tea#0ԙTxxsw( - -hqsF5tWc3Iw)ꃛ֮ \kz(xGAS!-`űԳ>_ c R̊:PyqExI3;$oPϲ5["2'eeοUV=awcs8`s1"Ɂ7_eB)z<'@Q i !F Pڴ& zH%4QOL7PTs7~K1$&O3>LeZ Cu|p_0j[Xb̌16Xo -J߶$zBʡdO D|դ -uo[hAױL+Yzt\H50˚g0FPq~A (θe~tr`7f4O&60}(˾Pai (W)Qf R9Pߗ0lCiH7rh)B(f*# 6v:e,+1Hٓ^`Sh\ W9]`5TBQFѲYB˂NPh~ Pj|ET 5|j|A5JG%uRA" D'V[r^EB@w| F[- 2W\* d ~]5!F 2G\+]= F\M>0Ό| -jHR$YdL -9%1`7 qzH\ٕP=cJ'yQ-/~zs(ax5fIuy&O%α(cC!:{,xkِkJ PWa1 2 '{JB\GAaʮNg;!V"Cno]a88d5J%骅͛GDeG CPeO>>> -v7iAvPAtB"! tgO?|Zyky>E7\lߐ3O ni*9@H|$6` 3ToI񀋮z+3 0p n^9W2zƴT|Rl~[Kv4a!݁Jy彧#ݘ/Jʹv9^-!؂^x k ->p9A*Jd[F'n0\1B {` CSS0b(IT - e:C8H) z ^` (mOOOOʪTԣ}K tF6GQxh?^920Վ%CUZUꝔ`k`/ZAC) -&:46] {;GB?ajK8`PQ|>#yi"*[@ ں䔬 $sG_]aW{Me>(gAMЋ{*L`2 %MxS?f@$اx ?@rF=!?>%J_ֲ(w.Pߊ }xxv0Z#MGenX,@M3J}Ua-D@1C 88xHvӐfjBcG>U'jŠg }FQzeS ) 4T?hof -la -_~K ׋잙8D!fΪKHB}&}F}, jB9`D 3O''@.&U֑ 8u@pVQ? I`nYc >TН D\{G"@&\J>#] Vݏ6U\fZKNA-u&ҽнGL4i\NQ-f krG0ECS ?ꡂҴ/H4E2 c^PF DَBv蒲gA8?Di(73"hC'F!C5m(؆+PĆ+ -*Lؗ- N4֟3GZn^Eo3{ʀKP` 94䊐kYOv*~!h9[?ԄܛA%FA[mE8HphaXT{ȎRۼl^X]ܒA*@\#Kf10(A}>`sՓBD_C7)eހ܈-3a?3ۀ!+ Xr -yq+Ԁw@0n:rCK]0L2 hdu'e72)^R}m5+q:X^Sh6̲,GR׀(d/ ,;K -{| ;p*#d̦; Pj9Hy, N4CVx,59 *ŨDX50SD" H1 Vj{3 q!SM m7;BB4`dmRlFR!(x {bk y4TV> {%QPnϼT$>x-UhPD jܓ `<ՕrQU>#0Djtx}}Wh [}6퀽%Hϟ8a2 Ta_LxD-[8i(÷+[ɛFWW׬{RYn$0J¦'a j e A ?Oy}IC@!y+/`? Rću+c -/Ź7 sbe&@.%Ұë=<U  -$gƵP`e\0p<>B{D&h ?r;"'it x%a)A2 --w|f6xaX| 0{~>xrEC>0O=oT*e gVV -' \x*>bi"ibAGǘxh8K($ǥang&%q>`}vU>bȠS] ,:Q /^\C*P@R3/ܑC/ܜwB & ДHRLl-R`_V -%!85EڄA.@"ZuH -̰dGU8w(^E(PR0M8z5%5\-Ȥπ}sQM|W+M#ΰpFf#iQ^1IN\<^hTMF$G 7+V0iHF!#p nFs#VinGTBdI+@^X&}2L)Vr -.ޣtQBXyc(rEҦUG#٬?&\ (z^[Fq -JjǁN9t@E\Xj(b dvDtY,\( @H@݈%<ܣ'r8D|̸#XK "yhI,I cn^]nPM8H#o?`}ݟi}p}irEzJEbgZX- {30{+9 _7BEWA,AhÉ:rh-T(;ƕς :1uZ"~­obEC``AJCP\t~OMHruxE;aO\ O% - 5|)gCGrKU9ܩ>_!kBe)->)OCKp3M@9:@ 68V5ϰOE@ĕ<-W,/Rg!B-1$h0D5TL%[t/H9f~F9}d%QkSfmHA(@KA:K"|# zaEQ.06Gt71ZM%jRaZGJUGA9y+ 1g׍_/lf nmiVRDmO: P\?nwCӗ0;L!qv4d qgxT+Ԅ*{AFG%E54޵0ϡ80s#Q5D d# H<"xd edˆzŀF5D@ ji6St!3q:JAf:@jr -^VZuAX )K,JRӮ'Ct[Ӥ||i)2rn@D8~!b(CF C %p@gt -1Av.*t8rcY]9P;-Dueӛ7>"|6>>9/h0! pouT<6Q-M%ա$.Xgg/bx[ΰb9)c)ۛ Ar]cO{M\}'CiK2?bzO߇2^`C - )B"r?;V;0&M> 200LC#|!> (  - -B7gsH\ t4p4m!!s㖀{JC0j{ ?՞-,I:& BRt]R0Qb_! %c&PR{PpMB~J:Q%518/Y&谛-z@4a{/agF \%eHoT#ho)'J`L7 #,7$" v&p YfpϙPpʷW*W0‡G"A5C=.2$E6 3B)Da3@Tejʫ6Ѫ^5q|NNFs#lCL -;[xL"ΰl#ߘ *g : ^SUF C8z$aY'G@a5$ a0\91%mgMwzKff9 oRΓ=O}>wkj SA` lV,PQ@Dw߸Dp j:Ee˥?+ - \-^9a q^W0lx݄xL`q#p Dv#mxM 9>79GdO>o,OХ`׌^nP;1\DD\sDȚfpτӴh2\EV5EF|dUhF5Hx$旋/'>Dȯ3 _1.h8zټEF/*5Ck>>lL_͘_C&4ydDG k!/| :OkƵ7nmͣ b[/|s2#7dƄhu4h^'6*lR|B`(q`&PVZuD` ,>-N;-`IL:,A#NʡR -kN2;C(QvFjV#I -xUu適>( @Q$tK/9FC ΈV]P3oU-ķR8N("@FN>Fܛua3ɲ-N|:Y-+zxO}.w±`}3U5E o,^060p2JF>ְtOU8HV%]&`[ӭ'ӽ>(v@lh%. %A=HA0P35wC,pQE2 -FU Hg]@%D`MJ*ԑ+R!(ڀ_^D@dK;s0qbx~ CpBIaD |c0c8:&x F0邊=( X;`n}Xu1w@̓7 DdpMX 4Нv3w!xt@HH@I%^WOP<#h%YdlO %Vguy.wfXߡг @eSJ LPGH_hIlF#HG,lF6&FH(SYv @IE%ʅ8(sRŢBKW›4V^ҩUBij]!7T l_6w9Lc"`Q6kQfN~px>`v"}G|&M *WH ˪@EK\]8r;a0S,ý~~c+1rB"=^ - -zFd>_+J9F2``B[I/{V8Rlγr63‚!RU}`"27[t~2WaX>H{lHIWI{@4?XpFwIx.p^'"-Pws #u:EA$u;V$,Z0'q+S]N?1K|j0ts{F~S=]-; CI)!.RbzE ZxmB8&iDD_+'󣀆`M b U9ò]f 1$89E2nΕU*ʣebQUVn'vrĽ3kq$P Ue&C4J l0V⢋P@T\M9#LtQ}C}@7*D>[>({OOOOd6q-1CHA|`Xuh3\g XiH7Q\6?iuB -o] *@CΘ(j^/JxbP@;nuk+87%gd; Ys29ƳV}nuPdAt:PKH9 G` AQO7rYNF`+ ʟD)E]W8$B(Q\N#? Xh{7ri4}p$= A&K{H0 ntAz@cAGn"iIvg^] ~l>0(ɋ! TNK F4%>D@^ $9Pw8iOA# }N (=%9JTNR L%_ c a$YuxkKs8`[?4q6CnCjaM iC*h4;Mߐ|huC@sϋއǶ) -f:LPGq]W9%2^6E!NE`x"n4;݇s;x€auOϫϩ@} v<2 A*m^cE)$돇i :3p8=\{@ajK -x>y`;$T p?Boi r$6*/B܂:!n=`[W# Ly(ϬWqt-aL P BX+;uGAyhNTC;E*Ux@`plx* -# XCzqi ݄=x ʪ0Y|OHe 4!07>Ahn(&O_ cf:H|A8k*nj_h;`8(#7(5!:Hw ՂB0pD| X`ʕht1uE@(˟ґ~q/rT.y\2Sn?Mh |@j!6P<8 -p9Mn) ` `y*.EMBYP1=`mQj9?xYY -$b*u*YHNCz_B<P{ p0JC\ Pq"h%:p\MiA4 't;lR0Df`JR˿p< ` e 8# D0#wOH!(P80cU_|a>tb/20mB.VXWS2\Np$" -XW7LODH<.eBmEn{<#MULebW]~8IIJI^~)zǶ0=Ji_HtF!8Us{A_%{,hZ -9>^>-؇x%Oz P*rXDPuNR JmTC!"蕡HRCeD܈# -Ru -/\ $nUfd8~v?B~%8FȨ@pn3TSe1{d l #>DX -Sp^u”*5%`Ñ/8k˖8s噖]Q.,u(VggҠ(t:o3 }}lIa3*O ή71AKai@K)Gb,9FHge2ꄜr[C:>R0NСTrܞF*+1eaFZ@_9GwR_Ġΰu?m)U!N@QO|t^\ Y-]Ph!Oxza%Ǹс ٢ A3 0]rW!G|{!u?W5~N.ګ| *JU6f "On I "gs5Sed *r=x>^,(4&д@P?q! \xHRaO({"ӣ-rҷ\+ %&}['h<''\Mʩ)c0T2Pp%I^Rl܃f H/@R \ucmX.@(iOZDž#d%r%9gl5-fO%:XL_]8pu`6~"l y&Z|LF8%3'%4A o¼ =ȚO7?~8:~7fPYŸh1N͘XgM'G|π`zXYT;'}LĻLK q@Z4ژYZ O缻. PI  -Ae2(g f3yReJ% {ԄyQ#dI(l\: Qʟf}}0+T 5p0>!1~t̓(^U0mI=SEL%o):fH|>y[4A-aH\>y2Uddb3 (# Ef^ p9Tm8;PX*e% #2""!IQ0@V+O^Qֆ"j߳69`C@@ ha%C /-g(& ZЏ5vѳ{+}^.V.d=([GT8,:C!^G1j'!%w ]즪#BebRW *g3扑G yAF~yp.p; -e -&Ͳ__}\a٢C SP?pu< cTG(@{ϔ:8/ čÓb7m -X@PYxO>Y\Or*T(MCW^}EPI Qy-R !.ӊ~ -7_j}^𦫩ِ0a6M3T4tFR01@ -?>yˇ]meGZEȦ#: -߲Wy0[=jҀs  2pKGJ( @rPU*o1ww zE  -;b .5yXs\- E*2q@hDs7haP] bj{# w. *i5V>@SPED^ˤф 08i-N#@/^QӂOPrD:zmQ! i tϕD5?Cu3UT)H, A Nꏜ;/)I`[r `x<_9T9)@u'9n o,xƄrV؂xJ9@?b3"|a>O(On=' ,]5! -J(m+N-(BTpC^Н[Q -I]b{/Խd,Wp:X?Ay@ 7_Am ևWŤzy-lBGɪ+Tf L&uq,n&TI?nPª&E< n0>ID`5X/0k0IW|ɯڌ"Sz~i FՉu?@"d 0TU!>\.0I6@~wY4?6\)E H\pEu_- @2T*!i_ DB pkOߌ%kو8O!}R7M,g&<#(oCl$.c X0&I 2,{C3 yƀDK XB--28FCK(l A80F!r --.YC -67A5P 2W"ePz˒2?ALRB;H%="YV^H*":u(P<|:LaCM h)su3 sDw+u50gZ(UrzJaROE)!_ΓK>4SBW @wL^i|(&2FP"b_,B`>3JuyEJKP \ :A,Hs -n ʆԄjF[Q -<GIBًf j A$myr0r_( \9E`0g*$O=7,1QOȟHKOQ@?'^QY gf%[̷.> _/.e*+"t엍"L3O5 ڤ>`RTmZeVpD r!%*ai7j3c*%r m;̀0H%+B4Sc$TOLެ+Xn],9<%61sq#䒠/ 9k(аcӮt 8-jnBQFC6=&(zCRX"% (DZj`t`{;A"o" + \&j\!TPa$-@Pl`o -~@ (3|R&5B -ނm;2Z N$z_QPgf3(֓0P:\(CTG1YQר\fLI  )`g6 ru7@ -_2⁈ -"0Ԇ(^)QXwI -Y8|ު L DCu0 i HFq`Q=c<"O#-?2Ԉ,8BEym --*gT-hsӨ I4W S= XS,^ -}p*+Z_0\{R0+8&Zt+ 2"^c/D.n#*9Ch]wlyIQh`܂ biɂ3"2+%0P'"Өg7|A{WHy -.JD$7kIF^ɈA`״Qؤ15xΏ YؕV$JS0gpZHXp{%4SdIXXKhVd=ZDu"ڪhI _ Ca>RAj7Y.!y٠'!_ -%.H@fl;êeRaԊ w%P\yiC^  B Qeg = Be*Wb$sXG)XzhQPJ&CBE•t(ڢdJmO8wH Nŕ -4 `ԑQY.F!O/ Lv9˸_Aģ/[rW ?U"dJKe bc L2y7 x6H7 -kϥ]EK>|A>($ 2?P&9~+c*?p[X7Izahfgf[d/z1QG_+J|BxѶ_DYâVrm[υLXxP@j0`d1rCPꚕa#M6`L.2⩨' ~D&}`] \YRHuC(\&Ļe0pWd%t(a m!<r`p=d$% PfP(O/x w7xx{ax\C+qز -!*8Y;xeZ0F=cp37Ny@x -]ʙU\ "l$C_U!3 c.*p+K$;@m%iC 7b CdC~+P膢plҹnөxhp2s-*be{S* ae2\Li#ӂ}_+t|wƴH $6:xBY'"-Vn2PkYnW4c5_p &Ii`K 鏚_Y1SlAߢ^P% D(Q5],p  h¬hg)*]E8EXSj oC،wxԴO,lpI MlTwyS֬U@CQ 0oLUNW5@}/Shpan.Ƙ%1p q\Lsѵ@wy@ IX6|LmaFȌƪ~=g۰f>> QwT `y5k:gCԏ+J|"^\>^ރ&@ԑ2EF4* o-0tDNE<289H4ӁJpq;Cp)N CB39xP&".^T.<)P&r8FR ` ؠpFl't8庪! s`Ix=#*Pj?I/>TUOKOxlWÁwzK8Z>0K0}o? mB Ue[>nZC![PuBMfiުj9`D9ol&p@{45ăQXFBW` `ҿ|>H>Ѕ K%CMdj !O셩0 !YHWLF+e;g ArT 1## -b -0o`=4;60fP&( j+C%%x  TT_f]䠁isdK'Sp%]%81"(#!U*n#&d2@D@s#JN?cـ@tbFb0fo @PXER9,=Lw\KAg -N2 >W.- DnM& ` ZXb0< -Jҽ pqiƸ>k&',io yhiᛒ: 7>|av U8Zy +ɦy|bjaMA7s[GW6b$盤"ӫ+dpCx\~?=`mT oH >H1 EQpIAC>>:M-,%ܰc({~(ɀO,ʂaWM{  -;ipa+Px -}&L`0 -1 B EJ454#. c7 L@_PpSRf^oxѨǂ*o bGj,ѬNDjx!X&#d=l1>ȅf G#CgÙ{}N._*;*(ю@(7G&F@@03xH.vǢB0?Va#zGQ< ѿsE[⁑`(䐶`΀R2MMF9Mڝ \eYljK$epEC(ˤSxP !hN"rh[ݽ=fڲG9/`[u0EXS<1VHz# ؅q2Ґ"u4!:$9]k*ʡPUQ [Xm3@#<AQT6,QS,)P "(:'HSXa'cVTB$ỖA!wAΐ`ݩSefw.p0.axArKh&@.5MQ WR> S&$79[>%'R@7zCJLA&= hh(&V /G@D2BJDW|Ƚn]YU薤bFg'|>)^TtAD}ntApgD&p`0##ƫ*'84p+޷bm9!ZYh5‰X:&!ڜW'E 4 PELp;^uDްAx-G(LH6 %SospleY˜dMAY¸<, d~$&CP>F,=p "^3\GU .#8L -(P yܦ>uqebtO6 `[fQFMvW Dg'*%)P3>81K0%avNE*c!I@'(SϨ7|>8uZX/0z@ L]!R@2v-] >@}@ !جW%sEIWJO  ]Yt|x?ĕ*lhGIXh.rhyR:3%Á( -KN` ް8hg -u{|a|<7`~A,@ifusM(f lr`qb&Lh>V*EX}&Xʆ rW^1p+ Op҅!f!_{՚pGhB6JUoPOCP[/]ajTyEu(:M+T,(Ѓ7'ҚN1?IJ{gUaP'zTe>leH\8Rb+hM$=>,KAEcB`樁M |Rצ Ô *}*}BM𰖴!C$(X`6!TBC ؟ ^-B xh81H4C 2+'|ĉ~@Ai5LQ^/hxT?Z~/h0V[ӫyyLleSƴ=(T.  E7cX8#l¨tnCff,_rls6COt&!g=p[#MKw= oo'l'Fn|Jd yUkg4 +\2U䠺Jo((RrR, ;2myC{H@M2xqVqx#M/=rH?r*'<{:&5Mqb-%NL:?yz|-ܾw5fHe=3"pi}hAcBc[1ʡC8W/GƖDH'@`AQHk:76YbZSg - -HLԓG˂)T -(&Q YM!-֌!bVM11"P,@..f%w5urf8LPQH|^pbZ e=?(E u qW@ Z$ ؤ JSu#KHaB!3~e>=ςf\-G=1#}X%&#ȃiH`\s5> ro!g;|$JIT×3!M ''(VnJ,O)F J\UH o3CfMhH-`}UXa4 -S#Gf pN,XCvEMYA:X"Xh L ԖbN,"46t)OiSRJ]a0"00!%H%/()ʖ*5&.dOGQ.H4W*U1ZAu XQ:([Y"x'Rh:yg&i 5%% 0reS'>_mz@}*mLSτD4廔M"|PdfHI[i 3)x!IZ!JƚCѦ%,MRCxAF.gO¯@;CF ID" ^ߩe(,KЈ Ic+Z([7x vH0l's 8wu6s3O#>>>4ːN/ˢ Ynk0~ Hm09%ߗۢs"$=(4F4ZjvF4@2tc(qp̜e *^ -Ƣa.[KfA`(":I4<0#!Zܨt3#iF).Ax8m /^ͩ`G;`U,+ WĜ<$ 0dDLADgxA. t%K{L2=EW<ШѥW 5>5[$!S 6Q  -U k޻4j+XTOP`XT!{0BZhuBPyo< @6‚CE!!衂0'ܽ"ٖ'>(o(7iYT*",y jΙ)zhU"uMMhEULs'>hT9`RSFWIAݟ#: C"`" -.N&˂>TοKo=0WCt`(I5Y%~Kwi'C0~rB d{ )~ 1\bp"WI@fQY"lP]"dQkW )jb&i 0hX+7SO >m=J+1 U#C;]e$OINW`Ŕl'brX([Ĵsה!E;x->X[?"X8ąt3yiM-~ T@bY5)t ^< jW(ؒACr`hv8rHDb>*vAI1_aw UO| -&DFpHx%8^'灄B Ac>`509"ua2>Դ/bduP a:2oL{tܱSS"|i`Blߜ ph@5 -t RR%Q$`?hA.ʔ p { e>~҆ El%ࡌ D|~WZ/2,miSX0dp<"4a(iG@Kl{J@[xUկ7<5X ̨HhF)D3uO3)rnF9qɃ>Qg.# --mFVmiZEGF -= D0?'m|P-OSQhP0W -U)5`B9 !@$ zmtiBGPw%% MW r?ry@ JIJ40Lka\)A?)B#)H/(K6H\>ԢT(3 0I0\m?gL~КוֺOh ,*E!v5;Ž&/3_Z7yG^0amn6*fcS̴8`΅ -"51|2=':AѾCs)ؕn}!Xul{I2 #3T.Po0r #@6$ yF5Z tH 2nde[)䛏 <7w@2f -<-f1QԱ  [Cܝ 5ʁz##HɅN - l~z"Y;8}JR.ɧJ&g-4p0"sB+2>`"ETBې(fO5`> -^ȉJ==6%-1}Q,t8FMH4z}H`lcAO"F`fMHVxs1jy#H-3:&?S.: i}. *fgIS6kv_2㖄5\"6'P6%Ov#3Qenagk~ #C 5 . W}G(0=}BRL5CiMg V'eFz[24{Óσ6z?L $$AChtpP`TwC+A^g p%4΄$;!VWUPؔoɄQ B8.X2ͩYLw0\RY -VnqBܲR)d#Xv ܝgB)^yٮ" -p CժE{XyMCr] $\hz߅ ?- J3=~U+x)]m{(% B 86a]72at`yDP6\yrJqK1&b{5X -"e4@jKƉiN }B4p5ڼ*|-YfY`;b%jȫdpU+ Ā+#5eК2naff"у\նiS@heOJ>ӺsU8"q F!tz}-.[@s@KlXuVZTpe LXZ#Ԅ@LvG qg1yg8Wi -$GY8ftDNmo!$z1CaR,Wx TPhjxxӰ?5PM `C,<~\HY RVACPC#xP) OX%Fcx6iKJ`IlHVV WingCP %HGR#31-P$R lnPOqT73 7h &A,nC?f`Aevȿ%w۰C_Ik Daқ'8 m#Q4SG QHC 8Hdq3􉌮ԃ17r Mp#F .9[X|ޑ.[`[{RZxit^=` -~3:]T"+~^@+UCl |("|(>?кXiD3 -_/-Κ:!np0 rV"c 5?Q-#gS`Dc+Tqa}S9HLpaE!vULjj<^׮V['J#(k;\0W6CPAASPԈ!4v8kTM@OA+<V:8#AZ(54G?DsDD,XJrh\& ႽaLCQbCM838d @ 2$@LRh@yEI^ך0 - -y$ҕ|ZTgהv̳i<6vTõ#,4Ń8/G99Mix <|p?s1 @R]<"ZݿL_h83Ѹ|9#hV:ݘ -Hl'pP<I!hJ&%齣 -OT†Hz P#nGAO" A<;|PAxx ֣&vgxBt0tr `.Zfm -ÏT\d(hAotX"Q -`m`vQ|="4-4^gM8(-2zP+Tթw A@(JFQ5ߔ!֭ 299"LM\S,0Iv,O"7L\6U -)bl3AaY`x% uD(F%*Qͅ@( -/P򗄗:>>-!(fP0 re(@1TA%qT=AS'%DA8w2P=i*+Cq:_dAz B @mNۡ9Dbm -1T֠L7q+;-T¸aU:W=rsoQ0ߋ; ;q&CMq XaQE`h\ۦ%VvI| -yP Wzug)m@@Qˉ`4TmA8D4B - Z20l - ]:AEcZtCaܡ tWFஸn%0 )U+[J_ x>ރ3@6h](A::2SBxsh(XgfE,K'ډc -zJM ah 6 -D;/ugTrr<;13$;(dZI$!a oHD˘rSSϧy2<#2p,Z P .aV39u l hE+pmcQ1.j$3@(Y$olA G\>1^"ʫuqDTu'giqwaûRN@({\l@8YKHB^As -nXR`5h؄1'ABgy`;CꅙFLIB-`#aFYm^ - rd?1Li - -נpA JD -:zB?0ԿhE=6xɀjZ E&Xz0 - 0uK $P|#eLGC -X$u H`l1$ Ѷy8B`" - I\_T2=FcX8)+ʐWFBp -a6F `_QiRʔ)A1nD!DWl U|'%p UA{طÞ@D1@H\3z)@$cI}rpV[J"fn510 ŋ,|ߌ)RA̅B@f|YIg1M=Ob&9؃=A_ys$Bs0hPs{?cRt̩^ --{MO7 5τ3),ljz :O1C̃.\1Ps/8ï P!Alg@mb>ZFU|Tq=DF萎6 wpp;r~/ ĥ HY$7+uQIx\@i ~@׎2"4(b:,器uߗTIEnum6aZ!2X6Q.'BL -L[LL$(] +Tρn1kpf }X/hu?P`Зр`ab& -8(rCtaM ]%E{JC/L50 -Gk7 O8وGxiX&tk_H NHLMe78܌Q=+H}U(:eWS ZDN"=(d%F BL xIϴO_4D( -Si Si"ȼ!=@AKTNpa)IxwcQaGUtxWF\`(ZY{d pz.7G & DQ,*3MZ2ns^'t -]HNHk*`~-ؤP" -( t @ I٧4bd.VFaj -Q'ڈtT2#݂*2xT/h+}> -̗0lψX=J5 -C -*_6 l=t %+H.O~̿sF ~w#)WJiBȿXilcgޕş8E$Zna@0l0QrPw=h}MEN -  (d%uw.oɱEC=9/xG{ {raeg-%"|f7M@'OX.ri & 0Rތ*[yK%I^|)Q㗐pg=P@! 2 -D@^,`5@?QYvTijȆDŽhta`xaS.Y$,41S$.HZԔ"P*R$sz!`< /hv+)bMܫL[3+kpvRĬ!l BY*exiRIJB -2axQt0-`XUCŅxk~[ƁƉDTsxx_Kʀ&Pia&BKy%Uh})qG#ͬ~S /KUL"eDzsx#lPN:^-vU Ss,VB@d:@pT}a*fflR>O5I ,.DYTBq f qds5KjB/T/!ޮ1GU*`G) o>_zN0%%AɃ;(Unc\C9@lBolC|B ʂU(w}oP7*ސ tE\M(g ,ʀO=7q -A p` 5%lM(G ts7zpoڍCΙ`,5 s 3guj-O){!'@hކ2^rs;{eIYTXy1BňNhVA a w"`m5Tuhi -C岻(&(H69tV! -{۸w)h0[d+CИ0(Βo \0n/+]RY- "y{SvBnp ђ&Sj=FX82eХ \ꃔ 3>JJ7 -XBM!bS|cX.o Dו f -F(R"E,+O -]`o" i2@XT|Kc`,u7h -^|.a 9/ -Y(?Ey`΅s`Z W @[ 0N8kB 316@j`bo.W. -nPe0` - -u5xܙR84ЊZP@OJWDEՙSQT= I"T*1Be_%yV܈P%eCˬʐReMr(GP.hP§8q@SVgc.T~Y!eXm.7)eHeND{.Ot>܏˔ -;?AWGG:YP[BD/80Z"Q Zh(mhtvWԃD -2˥ib8\ h"@OjzpATIR`(Ek,Vt8C -3`DcAZ"kIQQ\CDt8`Aΰ%oͿ|1>JJ\}nXx%"C)H3P3i - g*CKך^0H2Z([dJB )Y* -(oZ-(N(/wS7;*,G%=ńnDt0x/~HТ(W`%c πuPBcs 醅ڐA1*V6[JE^It{r&"3,~A~x -t@Gf^F^u%>a8+5E8J|?I44j0R- z̹ؠYeot " H1>'|g!j2E| -=VXi= ->=AB?g2VDn T3i$/A^=#Q:c|N0]& 0p<#@dŽxy4Ź~7"fN[:g("ٴ[`ʺ{8 8NоmE#@e_QX_]2l+e22\胯S:(ACx(P&#QHd52莓9FhQKb\«@0rX5֯-M1J~ȷ -wB*j3K1pRxC:a;qeֱޥ{{lGqg ș?:ωC` zQfX۠hif(2^%ԣRP( x|"8{L>0LI:[J$qR#iů U>?} 40 Qђg3$ˣG A!4>)r*)`-.|CYm;WzIR$E_O  {a% "*3ߏhl@A&EP>h@se|W `,5ӄy 7m^sÙ7/`l2f@ A8HHEoHlo=̇`)^I{R'С6K`0sr8MMwhM]p''0}7ĸ \WS}|iz(\.C^ @Eʧ%sFe@P<{O=+irb}8 !|#b6Q)% - P >|bQ 3p0psӆ&́QK 7uWUBk@RH@`H9FFtlCypJ #v0vEL*8Ҽ cpD5Qה -yOl=`iPe~,=~~,b:CNZ u R\"NG38 - *e ]@,N(G!0X?\cP _ @Lpf>;ѪKH]|GQ>x }Z/Sh%R -Uҳd+ `:#h}BGw~Q E?Y=Dw~Z[w;aoto#d$ ZBHQ(!@j=s !)h0q4 -|`UGV0 ->cwuҀ'x @)S?5<#8o! !pb` Ю뼪#gvPC0`vf32C0 jM!s.pM(t#XI5="כ -Fh8ZA`P 2S x@ROl  -K@ͥǬ&j|yD`2̕j?0֒Gƴ} M[6] :V..!D90k&.aE-Ifl ;J'^ѾAv=)Lkr-ÊŚ>3dZ 4MD =qsJZt!D2EF -oP@405MÕU] d( m(Zh7dF!PMq0P/ε')DO9=Һ2)dT) D,)h?]!iH.RHy70]i#+TS8 -97}v=LȓRƼπ :P=tQf)T#1SyR4˄/|CE; r!Є4#( ~YŌOγxpj`c3I`Cū(+T{V-$G -DŽ&B2Hä5+i)5.ru%2%.hUo(*m,'x]E)>uѲ(l[xϗy:ԟIZ҇S^6}ə"W8p" /*&FՖ HӯaO\&eQXC>N9Oh19(Ԯx%1vd`&W.BI`M#5ox2q(gA_;_kX'$0 "- -51]<_y^0v_xgqֈyMz&­$Q%n - {ϔ=0 SAM7VP5 Ǵ11# G QЁjxl{;y -`0)& -HQcDQRsX 񍯈ARI>0WSX WTjH)GQCE` M` E1CP8U…C} 0@LEb=a0> -1&LLq % Ahڄi퉠Q9@",OH `5P9釼q3TeS4`c~fWLƟ}@8Fa_>l Tw10 kx.{ϐ |`U>t~~V HW0 G?"|4-HTʉ9ۚjot_dl"i)%_^űLiN uYZ+nb(;$eEgY_,@z|· 7c;zG9M=14rMC^O6e&AǹQpYB4;X7q4u#9q䮸&_5ސ+){;uO{J+J&<i6p7Ή6Rr(4PdB>[` #p/>74Dfl#iZtEN#Eʼn $>ê0 ~atf2 5?F70B}bEU =ə !`%d3^ =]hzE{ gB;8i["|P it?ӍO>/|/t$. :s2w8%7+%D7iX oϰ> 4^#[!%Rx.U`8%by Q.;[6Aft_ʆJYC!w<> :7A,&#Z_DF)x߯3ۯnaR\ifGH~s;b5a? C5. -A"sY.dzSH @+) .X, ҐSr[[usl^7˥+evGԼ*%rpNA2 _i+1()8S - F_NU RRm%x!8Xn DVA 94z!~P @1rws_0s~^ ܗfL !v{ mzF>?y]jW\o)$XH'!?em@yEA }6>OX@φgՀ$aP:X* b rBah\%6X #C.X8пzCgliFC_I A&-x[ U -"S aBO g/]ܭ)g3@#+aXM`0F(w@-><1\me]y#.fh=D5JRɂR)%ZqJt끯gv¤|ZjN5"Ƿ5ZA8{MڝO5%Z η8?b-!> s~j)tY`Ao>HSQ\$I1#Tal~U\äN|0HBUD=v(1M@~_BpϠp~ @pzV)!Z8 R[ho(=qik $lʏsq?˖ɆlKARXc2 -T2Pr`Kb4wbTӳ - <:%=ari|䋇S {AD@ڎ헩aڍ - A1ʉAE絟y rO=]d${a=m:0jX,-Cp7xD}.VD]2<lhjAžАi2>2 @(m#Yo%7 -`sYCG0j N qEF.*Cj(@`(7&Mh" -oBАA>h<P9;~E}"C!qE* I6=MWhWHA5@֐XNS?zBOO>+|ݐ,;5٘d.#Q+"Ɍ8zѝfȼA_-zsUᅄ@x;&Wh/B &&@ĕ_؀ -63Iy71k me'/Ƕ -PTs*E/}E= '\jrLQ ߗƛ@O63Ha1 (2$o"G9@?`/6'ELU?N?  ˬ0iGR{ CIDT_EΊ)vi ^;ctH'P2"{$Jl-g 6d hMZ< +M҃Gťixᙄ `c2 -Ǭ|=bw(خPfxЅ&s>Ne[ByNCZT2XYkL )1K r@2¨A^YhIHK[ԩjb,O7,W&G 5kCXN8CTC9Bdi?nVZSTmTVriCe\uϦzڡaYS^j$@A_x -(ȨhcGz#:D؉,耶(ѧ5peAZ#)GheiWCq߂#b*I/E"d+(`A J;FOшX2 \L2<UqW05Md.dz?2߬$Rsʃ〲.nFUIFpԣʪ -$ dbyeˁx&(43Pd`+p٘YL^tV1pЫ -^LPV9BO3F=s°g!ˌP ̚@6U8^aBy}hk0H2\s"_=hϥ{ϫw;<%{Pbzs'ף򌲪%烕~&Rg'j1Ȫ~I_{)Q"XTnAx{ARu!H(@6`Fb3àwu,ZR9iX#ZԸh5 -w^[JsV+8Qd Q On5AC# `D9p>k=i5Ī/odvPj -{?Iw|CBg{-Á+4T*/x'yWnBĝBn"<6Ӽ8;"`m N_:peRO}1 kxSx36U@3lg| - F^P,Fcx (~,UssI*T\ ^El6ľX*âU'LCבPf"M{H&UAp'H - 锲#{`IrRz)f;C Mz"5;D 2wtx&]}0(=e-),B -Hs-`'LĜjZb;@<Bt7w>p' WD}*v;^:*;SBկoh3z[#aM*iJA6 tTinr}dkzt:ݹB3=bzZ-Q4t g"QQxNh  acȠ]|hgB+l5bEv 2k -&B}Oޕ$a+T}LQ\Oac xPPn/Pۂ` 5+m:cP٨ -<+q) .-k" -89x!~QZ9MjE)#ۋ;~cE `AX/? F;lL"=#ï/<i!^oS;zn=t$-()eM'KTVw$ Al\(ʁjU-T t!z(!(௣A0huM#VEk4 -Ad&Zsx?l@6"=dH~N()o - zkv{n:DĚ [Xg36/:83]@e l.UKt sP1B؅YED-JTyj2D`8Tc8 7X0Δ17@Ae7j'!Љ[ c|A)ԇR 6 V6Q*<1Ø#5=L3 .[Än7gL efX\  o~%B%B(po8ʠ |Q>HgpkZCQ"T7=7 EfӀ^L>qթa3-J_H8%cW*"lQ,@B> -Cc1RfEO!Kjha4΂;$et4b - 'F`/r`Ve )B͟:#tC8T$v0L¥˩^2j4\ֆ|Anߺ Q2 0T#+.&\:B5 9T ߅@'8$ 2ĄD G<\kGI]/ HrGc p{`(2KH}~Y<(x?\VA@T.ȃ" 2EpWa pj|>(Q|qPׂ<6^GEdx8TuB>\1W+"dX߄9Kc^!guP .a<0@ "T hERN)aPV1G -naB{42CウX<ȐZUP na I13.< Z+QFg8@ 3$ZRHs:R4 1y0KOۼb=aR X&S5: -zwBA7IJCFdfӢ03^{"0<]G!ϏA\Fz.ک*@\sd<%M7pha{XT" @&@\AqW9 dV`&d5]n&3}mCdsM~K{ޯO,AAbP:|d͊ℚ5/c&WJQ5dMLjMr†Y]@  -D5z>If.ހL@k}N\cfT2ӡLL^`M#)YLǗ{}iy!+)XnS{K7rra -jn '>cf#Q6,iJe7?hK`-p(Ю@<v -)/I0`A,03@0Pe;8Dd>OA}?c} 4m0I*o& -=cmB0@\;K "%z(PD(P&\(y2h2c"0kТVH DF1Aɠm!蝄 N⺎ ůc*~5BJ Zl60w9®5#Eꫩ8,6&e */hղ0{N8@8mdZ CzhyLͦyύa$f̚L{_; . ckh\TZY' 4.\&U-<*m} ڭ? O @ OX19p$] 1aQ *Pd2H8]Gxf9#Ch0!Hz42.Шc,S -ihIPUgêIp;*q,y[nS*'0bFf -PXI(o*[B X$Cd,̓*q2%e6UJSHgK&v qpl4( o+"6#g )b[qq">O GfA`};CȁD}1 :4|"PцlY$ - - W'6]K8\$lzBCA_4z) ϼ uyJګSFd8N2T_eL&Cip%b[Q*R'/oX3̡O>dDb=(IR; Yhfٳ -QK0\N\` bx+TX)l=yj} kh"*I"|gMFo+r}Z3d"·%ϴ-62$ }pNKha07^qACK\Zt $`)}z@ d`=*s̺JS.|G"_4Ba -\t-LC_lp ED Хј.BAH BYarp`8axADPbv s2Aʝ%5~.|`S4#b" =!g]  -ko q$xT@O3oY㌷/GPDFN!Q3@p+(RƖ&T{V$`vGl8 +M0$OŮ )T757@o>>>xмi|FΥ!X#Ӂ+(Nŀ%XI](>Szc{BzH9yCDT'|3nV%r, (P6I?B`ZV̩Y -͞ Y:XEŊA3'+w;CǴ=@%7`mTTٌ& &Ívv5hh,ü,܄dג$X0_OA'kj:2;pW>U5!bED2G`zR$6eJ֬y}\NB -?h[|Rn!>T TU -](|,۬feZ*)`C$ MQRl foiV;6B5$"NЪ(UEZg -7* L! r-j0gx#?/) @Zq ۞UYr+H~C]zV8hD*@sB 94CrKTK VN?PI`P1;A:Q O3@`K5\\, AKY؍K70,9\ @͆  Q a;ɀ1 d$j,`Nc ~ ]K('h <0䌼m. - Q0Ch:-jJ(gZC\F]Bb:ؠ w0 삁.*  Nj! ]L%4DX@ -mPb;Q̧I@ 4b-\蠉-@l 7aͧe;A@"@3sap "5ńZnʗt(Ro9yL/QƇ0 Љ -a(ݭν - BEFhcsȘAS~úfG\8ۈIGc4|ɚzYsƠ RDTI,Yh833xM=eVY &,aVxZH<ͭXoX< iK4 Ę&T%cbH[=Dd^L}=biʔ3Z& J)(̫`*o% .bF_f /Dž$Iz":Z Lq'ga5/  L?=c -5 [0\FC)e6evs2!6eE/|@ - -\HɣAzna' voE \[  . -0@ ]5ɲfQQlPPyn]a`C(u(ڱ1Ro HxC_5Z8t8TX2ՕY/>^ÌC}V?Ҥ$tE" a)CL\AЬ*kΩ>_Qzb`XNz7P rI֘A b+7 fTCˢWĜx%y0 AK.?IoP`)TWW= -~6>>L%AY 1.w b` %+hIpDQ@U=@_+!E[B\ d{W+R R)-9-t1:Aߨz~A -E?TMrFQư-:l=@ky(!6@GuBGLd[@)-Xt2L5! Xr 8f"eY&@'g|,Dir) v7mm2o0%8qMa}hikædc I|Nܱd)mMk,J{%*i$hZ8!1peu le D$2!8T ."+Q D: NM_[Ck~z]>)߀` ->!nTi.!>Qf_)]e= R[ׇNK@X0ǴosL~JaT^3J0De&H jn*mZ#L7%fL0&^:+ -Q "<MQ'VM+6p[(cR{N'@(p`4  i>?Ԯ (7O7R&C0^l2?\B%F/ zR!p%5`6(Nа$ΰH!)BA! 36W k[XW [L,aG~Q pb6B4I]!cӦ,3=,,J@ΞV&`v@h n>?d/:`E +RDI5vQbyOI@,OOXКkaCxqu+g)Rk\ WH`;#nϬ# #CbjJsC1FEcW!@\[hL) Y=eam`@6Cx0j\:tcMOD.{2*R)z;̄!}z"0aDF az_dq4wcQt 0a1D8#|!z#)*p Σ;h4^++?{X$U,T ܋YJyƄ_)/NQ#Y ڜqt6'lO_ܙ=5HCYvCE&b\fe4㪨>{Ox)$ &`$H]*t {CBBe,qNp Dt1 -UÇ8pB7/~>H?,F SQ@`0 !Ѐ0CIf@ OeQ\/򴖼$S4^m(˄ |%ͤu:ʷ I uX]5ga;_SzbXh`N&\XaϺ,/-} xz`q|"@ - pCyG#F_@Shze YRzG2O[PUϟBi^UTCee)V iȓQ4mN?BY7"K*/,O,V`{MȅI^PFLGBa1C7pR]8/SXIz^ d1M!uU^ &}Tn0+3^$-zbZ TH qvT 5>v3.` bA(4(ЄP5"+ !T= - g'C{ג#BEGUQP.%:&)4AB[/Xe[4ba86E2{@9Gd*8R,(sE(h*/®@ud^KU $ Wx ZPP>C|:m DHFP'XSL)Xfn - 7y3wf@t|EVna:JB1\;RK0QRP3AM ҄bF*URoLV4"L!A쫂&ԩS0ch51%rRYAYIILֻ4R]< '!8aVphUSw'8`Qb#_ Vdyb$ .j6JE"TX۔@wEL #p,ސ$7 F0d>c*.SIJl@GҠ{gjT!7M$24>scp*Pp 50>3`\R?C(ǁ ъT0Cώ}џx\jpƎA B!)G21hh cP^ GUj9T - =~#Bg>|>`4O"\.rAۀcLekhptTt< ( JĨ& -*@IepaA{ŠaԄ,cpw*eS#>3e1dIcuU 6ӷ)`dJ1hպEԒ+h -5nDq 9'+T@+? B0"  ̯VvkEF!B�Z@QtcāY -` WM~ -*\̋47#ip5*'''A=8õȆXôR1O_R87;gzAzf}0~s=^(Hy)LSV9|]gp}IIt^',~C)m:BPXdo/WPT"X#԰ +LR \N3|!wDŽIc X -!l9yZ1ZAys8yeL&feD6~t1O Pd# Lz HQ)=%BE#hA5Tt~z;Uw X"ZQ0 ԣ(&tb/djiAŬVeL' -X ^|uccA -h+T뙃$X$.zW f?f30c -)0+© fD$9{$aV{u o `chU*$VjRBsj"7cQ>i>(JV,**`I93{[:Q./xIn.23MXA8u*A1:+ywAWLۍ>8O\<@*!l9PoO;k IРS+)5͝FD0a*^Ox!K-" -Q8ӢjvcPIk-! ޲ =Iar/uHt`|wKkz4k L:%6 Y\`jQ?zx0d0WB%9w 7W_B8.vQۂ@w(#0Pٖ pnP&қ'UB&R>XnqD-`q$CM6f¸h98Bc!=7Ͳ 4+g31eϴ%cȜ7i}bnj) -ׄKsF!XD.Nl=Lh"j|B+#1V kp &|5$HEpNо.)tYژT*# xx .ЏxGS8qe@&L2/|_ ;+ |؃03xs wJ)^?.#hU8;LKXpC}fJ @k QBu҉ tPe %a`(,u;8нJT+l1mRZ01(LH m(pPE~uA*hR]LXG`XX 8P ~J 2ێ׻R`=HӉNtL@eE(PAxѧ ,h#&dG)+^3԰XJv=Bl*nėf6+05%xs(a"AP h<="o$9 suȰ%0F2Ci ŐbTui^5J85X m0q<#= z ̔NMHgҾ -%pn#*:v!.!O#QLX@2l:1čpI:V y.'U<m ࣟ><> QG%F lФ`M(x@`dS(?8rG=V Nh@";IϴCǴ"wCi\]5>A"g *Z .FF;W5)C֞4%G4)bmPͼ`KB\ 1?3ޣ $ h=vь!byk -#!=J.{3J -9*X)9_אVm#f< EHvBQOm_(K(|Vz)o1A9^+Tg2KF+5`Y P < D{ -`W ao3z`H7Ab - \I{KjP ;gh#AvO j\g g,HLP ":IA!& -RݔCglsޏDV_,yƄ"4P`wօ%WĦH,FXp=QF747ֽ`P]Rj:fI6?x4hU*BW(X%A4^`d'&%W-6H".ɡ&e/B1,A+ve" 暥?rK vi4URIU~0 (h0F@06d3V0uyF+U 3 6r;BI2殜CYP{LuN"a D#:Rg(A%M7}7w%Q -GT -"h;S}@ O0`VѦ6&,|}7Xf#\9I Q!Tuo /Yj@9*RfajZ@_kff+fmhK$Kilo?k(Y_/pY w $ײW[@` 8ίxBaXĝMh8UM9# r?`0ϱ7F`1-8GQ yT-I1NLXQ[CDh>ylȫxϔ" -| `(0c8D\I?% s r0%a@)MK Z!(Mh&VmI1ȂSndKa$>z̴yKF ~V3 603:rsD~b@8JxT 1Y*"t17@d@K! -d %S[BC|Btg]c(b#CuuSyY¦DϊSjlMuW#b^o0_eGWϦ*}1yߖl,V:=@?*~-LDOBW0RsF-yP)Q -| I"Pe PB7%t_0Z0Uj@ŀ -ư%WX胨< -U![FU?xcm#;9a%r&Xd& ,@;„ЇHGvSpNpl:c=t' i+rwꃛn!B}PT' bZ۟eaG31>}}}}}}}}}}}}}}}}> 1' -jG xX<@3Cs],5qkU HOBhCTz*-iMsb$g'_ )& B0Ű:z B{} ԗ#b$s0WD Ϻ@?s =쐖 ?}+v'ߠSP02 AN>R^%a'kO!)>>gggۥt)\gYnI"I$Ype733Xxk>xF'b_F?l)`tX~o|`?7GџgH?ʺh"5ۃ,I!ujdi(!mggC0X >:@4h>qw~1D:%Y4@Ѧ5j>Zyc**3 ?XUMDH%kG AGH5b Cճد?V{S0ϴ׿؟H'pmqqorz{gooyimymu~Bnx @r>>>>3>~miO'ǼQ>{[d^7c9_uOY\,$8?J6KQQ:3o :鼛ɼShQlOagЧMԈ8@L7f*!1AQaq 0@P?Av34Ucτ/S uwV8x,-S5O><'k|_~LΟs~,V-|#\.Ljg{ -ZZOUQ,ޠ-&rQEb+D%" WpOrFVRqD lʣ*6nŶf;{ *&H.9 Kn+ rո^#H\ -bP){*bf<IJKӂ3Gľ0 Sg/H>SQ@-"ԹeEpxkx7:T.Q]beDSr1-6M7U7eiu*e9wKi^cWR6X(&+LuH{s"Pk^d[#XxXkQG؛#P_!f=.!Y[cPG!ozq&`SڞI5m X e-o101QRj.U=i+Bw,VlU hf[u*-wpIML .UMIêw3\Tq@tQzjT(o2JGk=ˋPeؘe&մdŌ]K:qU*W -j) U J닍%h&&noLMpܪE\)·YV͔lS[˱OmaAQ?RގUd0%TW)|E'H_7ÖjWk˲E=r햌'RsPEVXS*XUOc7k/ |\r]@1s|AzqcR1)`,$q0#]GsXblRl˃m ^eK kmseJNvW|1 bf2zP -d2nBTFr9B8j/6K: Pʞ -R5+:dJ*"pq`%1AHdEl-0E6p=됲-cNmW i/*fu:K dŸb \ u.b$Nap4=#^w0#`\c+AıYLE~i 7)˫=j\%Qi|U"n.jZ4ܴj]TO\PY`:hHLܻ V1B&+ 2"3P"ϩA,E)EFH:%JL\]``0Oxj5/34Kơyҥ*4*Alۋ K;ff9[Ze˕RT3P! ԧÀSĮ;G Q - -JFާ̪௚!{UKԶl䡖Gdj[\- Ūj-w-fַS/3;qN3{u\YF_τd-\DHn<\3Q p(1q0/dS(ʸ<..C -*f5>W$cQfC)eF$1T1,c!%cž+ܸ+"$T bc1 5¸2b$F.pTPpAot2-C9'K\X5 ܵʳ Jp>#.TIU[t̑E1Ōlj|7hQl׾ qsX6P5l&q5Pljd8.6DbQ) Bjw P&B6S3/SB2&y7;{B,2MEIp8*V_Пq٧H*jKb\^.ø~~$.끃Y3>UB/8˨d8F7\_,pV9D`V]_ \K|qbj"T2xKǒ~7o؇hG709"rK,⸅C<Ɠ^رbʊe&eNԩ*h+R .qw*#SiǸIܺI|YYh~@ V EW^cMFcq[u/IJŚ\GPfRsSPҥ|<;tAqJW vAd\ʽB\5,YZ5M.%,:RZ1&ʍmD)C,`HUƈĘ"#|Xg<٣k-*)Fѩq'psP)CRUbA+9 WW GIVE2kF) /yK6YVԺcpF+,5%CV@|S83 Iv©L\Q9 U>qNa`+E;.,w~TCKTxhz> qhܾ7G~C0 ,x Ko/&cQ |beY\ő]-|.b(U=J:@<ɋ qpɗ.m,OΥJ1,Tn2DJ 2Xf`d|bu‚8-z 8.;8[eQc7\[djl#"C5AeXQ5W -u(5JAL95Uw0n(\KWhf%K&a,u.&Xe\VՆ!+Lrk}B͒bNb4\fRiru.oW4^j#R[eT|L -. Kc33>Jݘ1\j~% QcPܯq>`ύ̪|Jp}qF"f+2DUuS*8[0,F(*T-Q;K -_]'F3*oxu.et4pLD QpFXWryL54 ~ pk7/\NZ&!7fLƮX2'1+\f"L281Q%a.|T=İ"u Hˌxp#|i1X -jmjVk vgPᆥp2oYr/~Dn\%8 - /,̶,m^o%J@h7 *늈5YWQIa)'pR;33$%o -SKrarȱR,^TJbb8IkQbK.:%^#Ɨ#}J+5sD!_/B%_/:hE]θhxu CP qt 'r#Kp CԻ*LWwLȾnɑ1>wxX>-JjZ-%-*X) LԻ1rRn:Ĩ tl/#3r^Wi?UD0B@XL:vT̰Y[j4QPDB@QK#n)w/:ĩ`!CwFQ5 LC,(#rߙ@tQ1PV]#YSjfVW%̤Vpq\a;K*AXC:SgİX <`7Knpq43x23|u,W u U;KUi$rxb.,.\)"U<ኗAV\{l`Ը],TPy|cljRڨ~jWy5sR ̩W*Ts*)>咆:eL!*T1/&o˨Ԩ!IQ*0!3熙g,`nd*ܠ*le;|v\b61̹0|L$>x yԩ o] Lf xLE QMLߩ3(2p(5IPꥥETn*^fܨe8q. /9* zyArtKqVVJ4J=$E1WM$ĺ1PZ@DeDQjkQbRjUa2B/p*؅}eDQPCr0.^0$#h&TxB\A" z*5HU4J$b݌:d TЖQ,q0sa0pNȽraS0J8QTY>Q A[G:o\g)~#qspN:&yjθ,^z|ˎItT\bj5/p:Nxܾ1Q%DBa1*qx?\ x7edrWĮp< -<5$7k @UJKUDFcθnUKy7ŋq:b:5DBTIenF<LKoY7f !wqp4rTf縖MQ.0omJe\"BʖBeYJbqHeta{ n#::KB[c)̴O\\ԷV_-|Ge6,inTjxT}pnʬ1ܺH(AmG6Εp}]#>'bPr&+@CJQ({PT-t_0U ^j.#1UKc1(‘fnWݮ&Vg5._޵QAq-*#*sL9q".A0f@MyQ:]̿LьVʞ岛RK{GU5;@mI|MFɡT%lt" Nv#R YXS:O@,ex:ڰ_ HH_TCQ(s.ZI+h\ -B1s H<,YYxJ%Wxe\2/)=fUokui9i5 ]dc5+jJy38w;Pcr?Rܨ˗. Cp|1%$PԨB c1LM~.<%̃D e V[: 狲&- B>"!@J"W;>&APM .1 3 ?`Vb ܞu ]*xԼKqy˺Z>ɿ;cQX+RQ9O1.1Ѵ@?hʱJ:c+rꖱ Q.6STܺF䖌Ů2 ~wʛwÂkrĪl q Bb4 $Al{[hUNkA!j5oE3E7TRk)PUڥ' !s ;Z6Grx<4Q/J~wt\(6UPPT T!e_W$Ske6"*:xQXbȆagD6 kd͵Q` ;%ʔ@ie_fל'M+a -rE՞dL#5pYA2Dk*ʅX]v,ߴdM ļE X;"0" &r~X( -eR"3kfvDM:IQ@U3pϸ̂Y>+5G B& : NH+(@YNYƮłAJJ mT5x\ȋ脦oVٻ:òh-" <&>Ժ>d]*X;a2Lيܹ} MXX1}H#kD=rq\C)@Br_JLhb; jؕfc.[ÔM3 Կhp~#R,*ܺ䫍> F!i! /+upuz7|Q nq Ev˨%dO)Kj.41^C#e[&}4_A}#KTFڡ}֣% -)eS/MO,ǙQ#|eXwR9Wܮ3|7\&t f*5}!,4 aAZpGxwW(+7>$38ufyo&9I07if K67R˨UVV mα>b`ܯYe>bu34‚? %ི ܀$vJQ)ukD\ 7)3x"4@zzc-nGRKuhC+1`h-%4Zv2&'Ej`.u9QϽFX%j M1$/exv$hR-bVcJCT?s2rhbիNBw7oٸLp:ƵqɈ v.4KζGea3BP4*|~UڼT?y4 B)e|;?a4}C*|ef -r}cX|K㩣/H*%BYsPf'0-,0 T%]\b0isZ?#0u?$`mP-Z*G, eeDhPPۘ쎢 X$5zqD^"~awXirg.04qDd 4ÂqâmqyNYwOAe񁋊1|PAyaiG~%ɗKfo_r1\TxUb1q}T5M|3mRWHqB&c(*rMBed'0 ҧED!;gU+ٸo6rӁ5.Z QXpQ\>F[_ H[>,$$ -%MŲI1+# b B,r:Ff.ߘEu -bEK˸틦WZj\,FRJT?hfbq Tj mn]bUf%g CK@T!3@:D] b\B\ "5Mшj^$&%%OAHK+1:is* FUf%F"DžVb1EslŞo/55\H(IDѿ,&ڏ=e:a(J -%]xtM8~PQCWpDm9ho۹, M[78n!i9#КܯV~$EUWQ"p^Y~Yo"dϥ;FJ'jW;oqp}[ۨ $‰~#hVڱku"W)ݢ|ݭQED?P&a<š E-tD35(>&׍(q,jYqOpPb Ic7XY.+ ܫ$D_yZ>u T~$ _G -IRcD~Q% *ʽ%MC)/x:o| +n d[S+|RYne@Hgko <ߥmbقY\MK -Ç-u/1\o/ IQ"J'\YUi|rrk,w.-lY0} 6;Q_^܂)ϕLN»&a'I`1 K%ch9]Ĵ.0/\p7Ńj\G٢RnVɹG&ҢT].ae Cڵ>EHiEm,cDܪA -hzqWl: h+~$ -Nn`}pRʆ^BR,QTWֆ}nUfPDaEP()2ŽK3oJ5ntS @o%AYoz>j%6Ξf'g3){&ؘNA'._e ljuu^,Q6V\ak.,d ^yi >#.6`$ IkZ,\Pq>h%\oW釢wTT :cbH(c̜F:56;@!'Fs7֣%4{H- &SЁc9x]!-0Dl!=og@^T zu1 -[74w,vM~HCypFR8 ML qs[KjkuP)En_9e𜌧Y/*Jf$[>SpXԶrx. -KFŲOAH>حdH? vQݻ*Hä́t2?EBD1n¥JuQ5RPf40+)ڢI* --\*ApoR&wu3CNLmej YESv 4mT%n*X~\/]Ajj Ol ]Eu𭡰BnJjZADBC\QZĪWuvtfJ McEQTn}2w,7NCL,FP;wD)PF$6x:(aaw U^w PypBCAmnA\r۬Nw[LKIڳ%#npj,|&* DcP?a^`9C|y3+fe_Rzk,8YL s Q _N,6<@[c=@ 2Ww?w8nSmU˃/0[j|553*V? -#_rf3)z8ZRTWA| -a1Rܤ[/O=fqL<0E䒴o}mN AZơKl.wAB^\kd/̦z\Odm1fS+W)J ۡ!@Wè- \#\1ak#ji>-ni .rȚQaa #hi|2vPLRԶNJiQè)@xo[+*֖]>ٳ⤭aA\L#U0_jm)-kX^5 Y`td{3 -" =T{V0n!\@:UfS1-543U]YJ\(RKE@ψql/n#vbc 0খ.>_##N @n;wYAq1 ]/l{+! {@";e.\xJ`OT;+։c1&*U*Ge>M̸> 4eԩqBc-j2 K1ٰ:H tEq.R焂 we/5UWtwĨ\aA/h<h3 xӄeަ㞋GU8BFz.K/5.?ԽB(%ʉfX-HnXE#)ZY@a.<[C>wUA,0yad 0p≒UQ+zEܰ\˃aw(]J07hJ.WTK3 Lwe DKmZk y޶kՌXY3*|=l& 7lHT&NF%4WL& kl)C)e@nRk.n YDD_pP;Pf-*:.Td g](KT~i*?yΪfR%pB%MKeU5a> -|p0ll.:\!:SQ'\=8!hu-xQ IU:댐^"rW9|[Z}LG2x:^#,.5%=lRwbD2%ޖ.\%F{ wj&+FײF+gjRb3Sm~ĂӰ -c"beUb>=T>TeơRT##1grܜSPBn`wJiP^L_%EITوwnPJd2`h-%L3[VDPPCQp* qZ*c [h}?JLNUeeb\rP⪳E]Uee&8 {FRlߘC;!Q ;ݥ N0˗u(4kuCХe]S(nY>FZ hQ[.X -xY "_*xPMK 8R8k)`|N}єZV a JrRi`VFUE5LA`x׍x`~說pq3FFLX0KlA˶0#ij^Dĸbz D+e1_nVTɹ6Z"%b,j>~#ucOg88rZ̺B&njVsVdQe%:uZa1 v^U'GWųȺƾkVlbГiVL0_^4vy.뎡RQZLy] ֡ ]7xjT^hh&cx 64Q)۝j(F vǠ UH!8kK8.nii`OX0*j“q'B7[T|Q8IOȎT-z%O9#m Uߟb"'O#:"nI8^#+R)+op_([7}Cf췒:#4JI7Uޫ@UBā@N)_2͚ʹM/113}Oqs[ -Lƣ}e-3˩x+xlup8UH^1%2ohƃ!c{2(b` |ݓ0Fԉx<2+RX[N We+" 0o(Sג~P@yp.ѫessI"8=[֥C5UDg@z&ݎ"1H԰r{4c}Ta+nU52]qYlFc<0% ?&戉S/^y00;H{8^L}Gg [f߈JO8)F*K ql=f X,[. JM>¢Й<ڥ1[töڊ#*}J*ZGy_R-zs,owm8.4V):Z<*%]ʋ -)0Rq2Zn3J`x~uab]x42Cm*WJd \CBI1d_mHqΏ6l-fux/j4*aH)[Ͳ+RQq J -/ZBgw.%LVc#Yxqu.\\f<ïDX: u*_vf]bP-o<0pE{`GqCpRW[X{Ajs;k@V -)nVT {;1D1!X9hwhx*j02;LԦF7\ .5kN]:ľ8fQԢi1sS\ydji(1)ZuDtad[+$8(FY8ҠAJDxHq{eBs ЪbUh~;hHj)ֹGl+WǐVJ`ؚ@9;R#)\aaYB,]!qrBˍVc~e˫-߀7 cPV}2ƿJOA~R 'w*\ZLpuGeӎRyANH5I*-ew1#Vm|5E^AWw}~ -ikeLAtͷ/+ &}sZXf_,,.)otD4Ԑ[u3[KʕhMviX[T8. 5P uƀ;|@kL!Da*TUR u0J:hA5m2izw{%_Rښ"֙fW-kO胢FVHMl ϧіX8er+d#FChK5sDAm"ߝ"+Dc cqK*Iwթ]V+LEFT -)١SW2ut+/Wk7@-Da[zyש#+0RsZ?$Ũ񋻆nmfywp/||z[qy)3u/=0 Wm !m:Fڅp\*U_"Jy ( c|},x< Uw).e pؒ{7PPgpIrF+fkQ#6}ar @jFӷTك孹 2;:mѨ1/z`ql`׺ u5n =$9_-WB7gÇ$$93F{ /5*[6*WVu\0 S+{5.^*+OZ\qtƯȾke59w_¿QKzLTPzZ;LK\$/|J*?1x_rSju;f R9#rf .S15X.P*ℼuW)+bEfYn:ilfRjK!ٜ?1 -Jv)! esmc8,Т7˗/Sn\_1w*.1u [rqqj$c%sf,Zڈ!u9CAH.zz҆!R5cO$'tQJTåJ5FPRPy! N=|0a`TcZ -Pf@jcXjGaMrkCt}%!j6MLPIyZ]G dF%Z˺ 1Gpm2]⎜v *:DbwUSfІ\!Q^zV>f -H[[ɮo^bEJovxYDjnaW{Ko.izeX֩bYuK4ZD?ܔԒ©R("Խbb.jR3{,La@qC(wrޖrq^ -gKBՇ…;"e{ eFXS6ʼ%SRґa&jcCcSVU!'rO'$U- -aL*WiqVTi9.m^9U{VU.4Hj%dʧrO^jPe|\95\fa*RsথY 5R-rq]-6FǍNLv˶+uܬW[;X&}P(Ժ'aRq[`pbYu^VpEش$+/AMvfȉqrPz,,'=Tb+wA"rlܫФ@9*;`j.]" -K6ƫu\4‚DY_eҔf[x¤B֭/G2"-&#d{n'_p6l,M:ߚƨj.eʈ_o -+Jvݿr9عIn’\\` $ .{0 K]PīnRK 2F[  ېdҠ*0~.:,L˼NV"[0fC4KԶĈ숓6^p>Q -{V(%ٛ*^eb b[3# - 2I[a.0  XXhCcH Ԫ3Q:%[L+̿3K&%cRFgq6K9i%e35W -ޡS3,n"n$R /P8]uc0K%poƵM|=d tW8ep7_][Gd}fi?&QpR//wPp "jf m;8`to߭bevӦ臽f.ljSxz~vG!w -PU3MSamDfp%J#|J&\pE<.%SwUܪ+|AuL7Vxr’T~ˌ!DxIPbX7[21NOUt * _Q(Bψ"ۨI()57Bx&xVr*6*iSCmEQ1DFJ7- J E;ۅAuIq?7'44C=Wxk{ڼU{P:[/].3:!:m%=7o50j,D^SeJ*%aL+'JJgeRN.3-!ZKxzeK-(e;|]Qo}d~,%EJ\_Y/*|쟏|T']AEpxCW X|\/9j -i' -y bmJЅZWBݱ]J=dRjg9j|Eo\R%jge.Q[pLWr[, -+*rʦ#mH -#w1uGLPLBVRGJ`w1^ jYR@kkU@pVoJ8Xr娚n,R%@}JrPeBY~8H0Զ"U0-&\ O*U~;A]E #S=,BU -Yt|GK.󹍵"R^hНX[%xpj]ՄDT0L[%& IRѲ[ )X)=VZc(+DHC88necEΥ|Lp36 ds b52a6?W*Q[;!&/\cHR\d/u3xTQ11N(d&D]VHq,Dlg3ȡYLs8F^zQ'Uw-] Uj G7d8z\6֧$x,"ʢ,tFx ܨᗎԹYm^+S1lBz@׈er1@DpFFX"Ù|[mEVԺ1Qj=jU&UPj/U}K\$OM@9/egWw_}h tt3q TVf/${GxLpPeV.-"(MKg!8:F5HCf{7(\hC|̷9ϘVYAľ4}!ՒZAL)YԽ*x!@p3%2u5. 2Ŷ6$Du7+1*WQ - ҽNK_0+P>pڋkڹfqk 4pبJŻ*jE%@ Ąn ݵcҮ7Pz$D -\/5/Ցr ZP T")-QꦮWyJR \J.&jR\;\eɎFd||W!f - % 0˕OR\j7+ls~APO -n+R*3pe )LP{L/:ؽE37T:"%OqeqLib;m P$%mdnPc˨dK%ϩ.eMQq35.RՈj08%rt3ٺIl8ԫ]jmS_2.eP -:W}yJRB%?U Tip>/%9!W` -kP-!,`f8.%3\? /tKSĹQjuµ_~l`qyeJq -}L$~*<̹|T(% VAoe5 V,B70'PbRqEA+ 5 qV1!Vߨ%wfP0P'jDjq/.3L( j=JNSX"Wpyװ;w2C}[3{Xū\hćtZ}~J<`]xmrBO -RBr8XK \2P㻮\sGr|OR1baJ@fWq)UƸVJ_;1)OF|§wRbgkj.{10lk,w)̧ecG<-n t~n{#3Y%}seFQKz#SpOeԶ#)!kdw'q=ܤ{"I2;Jۨ haj-ͱ32r*Vew{1LI=HA+ IU)X`eb8p.~m,u1H|m1bc^)0$SAu|A5Z5u$g(֌ߘ%+5= pv%e?X`CQuȅ_dХU WQVnzb{`TpA \\;21jԸJmyn\,ff/oF3t\xFR%S3čk^%LLELF52#)8Xj7zũqRJV+.mnʏ"ߙ8xX4MjhLY\6,S"ЧL e)%L-cs,AO@x%)RfeXqKAhpp/XUAm$j4)r02U<#7ĎԐfx*5 RUJx5>xG P2)[щ  gL )rUZBU -xv6Tic -MׂgFt0y˺ -*ԋj:w5\J1.S-!ZV23 U)5R`:-Pqq BKF*1ocMՈ\f R4Y,t*-.-h# kw_ropj)A)υ?8yQaTsgmO \C*8{K @mܵo|c*b2NFj& JJqJ:&8/O$)1dk6dp\= +r,2JEVV#Te}U]R'I\a+\3W{6@rʸTG\TpÊn2\S[|  -Oi+F=]HksOSN>@=3X:I{0B^\'2%>a2[3RPe'`-@L[(QrLUV%Ա/Vn%C| np|dy8c[xQ1 įc!JuH&H̩\!Q"E,cu:ĩS:Jn>oK9԰ Y$5.|\ji$P oDOa*슿"`?oCR ø2$nXjk (YT@ŞÇqcUn4Sh._с Vq%l>pipآi,WL& s%VflVe>l"Ԓ9;?Z[f̂D[Ľğ0xO nbd|^c2:2@w~ﺡu?A_ c<"*Cr~WÂ\#A p>f]3\q901\Q p憒cZw  /g7KZ/zYɍp6d2<VY*Y ^ -` (kֵuEpn4u w 5U JvX!+0L鞡G5ȓRD\ -KW*|pqdmV0lur3 E\_/;&5 fG<:cg eqrKT\(n Da`n/DiP%j9/rĩOOwhKE.JKs=Ρ2cW>%p`"E *+щ^L(J3N+=+ymI]Kfˎ4ڔ> qq\R}!*$rܹDܺY B*|_": fʝ3jJ3˨_dZhl단|f\\znj*n74kCiHH>i7}_i(:٫Lqtŕ]t(z~z@EHq)V_rr>j6emKԍre2ZKQLb+U,[CYQbʅ 9Xj( &LbVeBu_Q4|7nRZ1&a=.@5]*uHL-*p)GS01IZ9S,&~q”e'pQĶذn[rٚ2;OL!RjW, 2\DT/Kž#+*[P#.^b.^bWM8HKW/\f/\). ."˖O)UQJf8e(7/,E Q̈\ӈ!k^g\(Gmr:|ɘSJ?|o!_fT`%n/ӌV; }S7 ^WQˌPYu1MmD^aa_,5.ٹIhh#]2\c0#\֦x<̋ N_W⏟;!ʺaFf2FSr02Aunx_ -oXwQ[#*[Z3odfb5bѶŅ/b;D^2}K1sI;1p]1S'Ҫ7Zzqܓ&N*نf3U seaU6YX&YeQ$l"˅5 dF^b|<_;kS[bfUcݳ{ ļslHcrNjf8~Zܵx(!fو,N2TqKIs~b,xw*.10\y_xpaT€2ؽ#,"@|͢`ڳv&"LXQc+Q- AMd_|r;-DA,QUnri%S$ևc -ٌ[Wx`Q%z5!a<_lS))O|5;ig5զ>֒hn"RKbj/dt -2h9oRf=yv!섾m0FWU;I|ƅ!70oASaEV!6]5 볷`JJH1uP\}E3nꍻbn7m]A"%7ҥ 뢬txT*^lN ,Q u -hI` -cBwlWz{Z78J*,a|Z]bX,*W2[PE(BM8Dcq3 -ƮkPng"K Srx ua7UB sfoH&(0n|q^GPS:ڊ@i}1a3Ҁ"-ܙ. -s1,X<]%d{{ >TzK?ڛ؂ma%x]Bv~ O*i FťjsFu V~?Hr%@*֑\4d[fьsBfijV]r eW eE/kKDY ߨIR.>x;-RYQqLX͢V$? -&.:'T3,pK)z't\9^\ubT-'wsW:`k /p9fG31)f4UnS2%Mfn6ii!nY?Q+QʗD̴OSBW/)[@/)8ZQcLFx - -,eC9ob$~6{b˗|1(qr?rU3RJq5ƁIk]p3\P3x -= wl>^%DOpQx\:7 -v 9a꽚 f#X_ %JT/D"&-PJM]et+eov#kA&tv#ՉTܨj:p;Fv<ЄA< HOZ 2}V4ǫR˨,Yjꢖ.Nl= :|p7/A Gfaun8\b6%`KeVJ{OLN-,\*Vzx<1YܷQ<2 - J+<%fs/{2/W3l.>9W=0K\ɻr<_6_K-7qb[qWRޡMpAH9LԳy|8\-RR?ZYE]e&?ZW%{~ߐzxXI&DŏcWMA*#cSќ;'_^)ׂKUK]JnV.7f|ķn+Y<:,${@N̠<8xmT=sz U(񁚈m(J˹|^!, b^jU*TJjd0JF"qUަXbeuydYN3ey'3x _;O Bo,ś%_j7r~,Lw/A+\WkpWdmP -R`[_HeT6苹^Y@3>-N.NR:qQd@k$[+ƱD)XKT.R4k^fa)L^5늄5Rۋ,R?\75pPġ 3d3_C/r[.T.u3<? \rA|3URuDwR/bb* W(;V$rOSX`V:-3]ŘJZjj3J-K6TPt⣗~HJT6$5vQ=mk4xx欕2ahPIKW]P-!dݥ)ٻu*cܵz| NW-;tU;BqN9 ,rGLĬl% -AIhnuO>m.tZQg0SP*[5 34+6@iV ?Z`ӯ4=\J7\Qu\R/re*̡Ր*si6K4@(gF-fm+/) aHʗC <2<"+Frnp%]9q.}.($v! *Ab\6Y.f07r3*c:qe%*Ձk|-<*T.u0K UpbjW"5.xYIr8Iu #-/jb2*phJjMl'~N?EVjc4ԠFBq=,nO -:YC-Yc+ܼW5|Oa. &TJRj+ij2E"OGR^× >,́VV{$#gw)JԸGwKu-w m JW*%gL%lj2E\9Ի+jnu.\UFWKR_Ǯ^,prC?qRwoR.kK4cң -K,cW==̷]KG5*#j# E1 ?\-#}Kyc5lB[ k#nxz6%gZBX 9 _og0F*Z\ - mC\z<1j[0/&OZ %D5ρb"ܫC!.Ae(Srd%jjRagܹl (]`fgհΈ-m.#;UΣmA%\.ҵ]3Wu+z%Nd3 Al]^\+&x1oz @h#KQsO%t@^t)7ZF3Qj.ImAm Qn_4*" -Ff eAZ.fT%YR 7AT*DqЁ\[pPu\> DE c n6⁧M\%m?{<F ZKAxe@yM@ftgU!/ˇM@7R,VCLj|:8q<{ES0NDžmʍ1RcҸ(\*) F5:#dԶKQ.TeL< oDc.W -_Ij]j>_@݄7X 'ؗGp>f01GENbֱa.YrAad6cXR.:IJK 9a-2bkr-HfUK Ρ+RC+SPexyQ$ -O4]͹VX7>bZ n䒠PǻDu_x[=*r~\o0ӷѹXef0wǹ/F&Ƅ!2>(6To%])@Ɩ{EUxW-x3Az̢.Ošz.7b5}FñƊp,FQ&v= ,2֥ԺQDzkܺB.̹/1sԮCMx+JfqEa[*J _g*0j5so~7LuÃTw.\%'+%eYme. M<JDڻf^L8ֽ1Jhp+ܧ7 17j?-hZXg<#5Ue5[3/pV\O3C@[hPc[LB*3/VxD xb\s01 .xE\ "|8U+U:ydIL4ޭ?^ ӎvjs QKzE:ij5Z(Qǝ M%4A pW4H*HKcMQsl Fca5#.Z0[pA$~?p]Jq6wWOܰܵoU>e4\ZǏ7'eV&`T1 pxb_4uQⷘ٨_qV-EG^Ί $.rNyNpQ15d܃ !plпlڨiz!W  u%S01noãڬT+/, osGň,=5GEYtjE`T`˾.Zb71Re*d9 -x]jznR1S 76%@U\ &OuZ -"MqܰwjŷIOv?'-}ͳQ|^ic_ea}njG!d7L#W\W|\xqkܸq3ImTn+ph0&3 Dsr8ze,U9h`ZMʁ1|++#*[W k|^++/0(sKSd`Q.]w7\6ԥngw3] -Kc5@aJnU5K%d5qY&nVp047Cs7\a(Γ05Sl&j:T_#<2P) 猪LDjmwFRFP+=:)Gjk >Z b#l{q3*'%=3'D6\cG,%x"[Q=_`Gh[(4ՐR#jP˨T-@*u JMRˆqs< θ!ۈ ʝWje#i.X(-;Y{OF5)u -xHDnZ%|1+zπ5F񎫈^j0D̹o&7d9@cڢ?Ok?lk4oLrm}X}NEғ73@1b*&+dWHnKfͱKWc/Tj|DԹM˛n EMt cmTdZE{ ({Н-d0s*c`?I1k3leZ7*#"ϲn]㛙K-M̃2j+ƂTeIҦw4-.`̧Pc1R;C<wXPzY{p(Lj0Tn6-|lĥ/엊u +!5Թ R]FTq#[┮%|Tt/7* C5wk<E<͟ܔ|;f( -<<߭4_?ŰUzc5ejbkpUZC::-KkCV'!P% -5Nn^"*ZvV`Q06\s *K=MzE#P%n\%eAeƨ~\?!`)Y|j,iK&k0}V% ?Ƿhҏ@faNa,u<Ϲk䗾-.i!*2MBE Yfn-B A[%qJ8WMB7 wMOpQYL-`<(M)e_4KF<~jQbr^M;. QGpZi*W4[H!qߘM{<6w)J'l -k31?T9OSXKXv> -`\ay|}"CqJ=ڵE󚎠$2wcKr8;n R\L^'fe b.Dj*4d*ťjJS 51Xpx8JFU0ػ9boDq!؁8-K|z>zO{? *46QL|5'B#_G҈LzTyviELP 3Tqx;*`%pUB< і&81d&x]}˙vc-{yeVjRxi oRa_˽MqP7 ϞUU|O pM$"%,w0#nRѿLY宫JZeZ"'evoq[5o -(?e0I?u?⹻/jw1 e}zՊᄳ3[{#N|%k8EW ^ls8$v E,rhD" /gsXZe˦8`M~d#Md_dE -̥H-͌45(#_YT O Uw)Hܖ4<&j0/4JG9~nZdAS :_ tt.brW)e<4NQyhRVag {ķdZ25S)_)TRpkb@mvʏ@J`Y"rRJ` ^]Jxh'P7 -EZT?3A N4I&JTItMkQ/4 FGjWQ`ywJ P+TRŌ -U; ŎP%&9"%.,HԹ|%T@fi*W5̦!R%-nfBWCKkoUXj]4_4 VSPQiAA-)3 G'% +b1Yvߩeq4|M˧\+Ժ0mJik],,=vXbCImD%dCbM@UpbM1~z3t`ŭXP_7 [갦s6e2Yxs9 (yh.TGFyZU+Wqh ͭz!ܪL6VA;6]tTѴ)p~q&}JzJ'2B -pU<_Pd~@Ot҅hPlMKhɶ?42೥P8Eo ۆ#錨df[fg\S)(D2NTq4ykLe=CU*b4!}C,JTqP!BĉnCl!G*6AԹ3$wrJ%Fh*QP-4WDu*b bUh&Gx,)ʫgO";OE4՜]5Q_jL3]jbJY3"հ,$ -:'~Ij+X!SI?F/>ʕk{K;V4aL\NYWQKS,[wʌ@ UD:xʮ -6`vncRQfԩAc1X, f;4SF}O>,[u\GQ74SMc̼:4l 7Mģ7RwaV9x\'c^JJn;,eT7)Y6Q_27p%KGԾ+0H\RyjfFLظ&w!+c6YX<7cVҥ@[uoTAQpIKYL8RԶ3p *R4S<-b-sq95bRu;eu—c]10$t`Q17!RO|<ьܪJ8n*00 :mexCbL!kF`o">4TAu *bYQ`md.sv%ŇuO4?W&-_0%KF=A+0+j_q 7|Qn>b8L"˗ nJDa[(RsSatL s(]Į -B94~&9AYp.47Jˌ&R+&*Pf5v2ڧrF5\;RȔqK3տ0ן?\ܹ9y)Ha> *{_ ?J  1nl/0nʥk5x0TM9ܴ^c$aQlϦ,h=$nYaYRjLJ1T1?=$}5[:l $(™D&" Mkd1KM%@n(qT0:`@-YrBt@:`VV_W0GpRiV`SO*vR`%Q>ώ +LĤVE -Ŏ]T[|ʐ1`݃Yf'dQ -)7+uUUMN{̡!.V!v45bd=NJn53%* =\V@lz?s|0FU5*SR]WREc,9Z)R HtK<0r/=o+N/rsѶ?L Exb2 }`x֡ZV c0 3u /r|x~eQM2T) D}qFf.fgpZL>c|6.Cg1r,sωkWҧXc-Rme -7H0 -YR#ԁA\(n$*홾 d~cah0K,Deo1b!-afe˾kqo,g0G>1㺄~eJa(IX!Q J˚epj[ ,B5tᆷ?N".5JL@}A YQQGuo gDbCVMv8R©cb/O`կdk:%w $ 1u IjpbW|#{*uP' !Q.])5^ϼBj.,kGHIlD[wk*gU@΢D -IC: E^Nf#L}6\@ -ƕ - ÉjKu_\JL|Q._.iˎ CCДS \'\2.^8U LCYt3+xg_lbqQU|4Ker+eNgKxNz8O+?dV3~$C>', .Na~]JTqɥk RΦ+p`bT˨pKԨC Szc+r%)]RJ z.ꤨcU}]"A1UTʼ0O?E{rDYrp0E`+fR|CGmctQ\b[^vf6k1:MuIk4*lji`Aݠ,4%Q &jAX+u'Ln`ql51ԡe ~կ1%J:Y`g~h쫶H -mJeLB%%f!XXA-  l,!Qf# -33e]ſuLc:AxK/(eTbsM%<,g\|̌_S3Dع dU|c&33G@nt.HC?@=$Hp|J⛋\fj\ -Y|BȐ*4 W[c5[錆]o|ぷ3(=fSFj^ :^A]0s11P."Bt1}'.+|NG:iVQ[M]ntqPa3 }G YaU*T0AӬw3nس n=;Gf,Uu ecY!SiRyd'@;L؋X{pSc(C^ ή&c|/抆^% ڰ3;!{.iW0@biu:5)| pÚ|ws5hTn f2fPB*] -?(%G LZ -w Pfzi-#|i5 *1%s`w%DŲFa%l:jV֣Y\@;EOmGFR(AD?3T+e?<u ֥2K5S -ێ;%Չ) ]i~h1bP[X)l,?]^W w<ї 2.T߉jL l.ԺTbD7VJD%6maVT0[E[\YN_ RP_ZgV Pҩno -R$[$#׀2ж$=~Ǘ95u:H!xc\荃ssrB}1p,SEpw4gJL/ʼn!i Kfop^⎥W0٩r*Ww;E. L%{#1HR*YS, ,LT'BzbQuMXJB⢡rDpO*v@\ g XA-yvJË'a2n -NYt #MW|[=o앑Y+[j:ezJLouB+bkRKơʹI c`i]oqFanhZaܳ-G -4Fkuǻtݖ_e\M.|Z‘_Lq1 P 2&| ܨzs\1.˃R \Rul]%B|d:~jz"*+2 -h0pj7(q)Ee˕,8#lo HC]t嵌)QD y -|RHF"KֺS}|]iRV(ZJNrTpBL1RQxRP8c~0qu5aTnSN,&5#kbJ>cR3b*xf7;D1k: h"<x 8|HҞ0Tvg"kM@hީ|pr!|.sP@qrrB_ -P=Ibڂl,F> ++QIgD{IDd׋'{K'.U6If -7kBT"̰R%ʩf#'i3x.UQC\[-\E*$oDx(z;@Gm_~r`0W`1m/RtK%lŪ(_X5cAC?}m}d"*ܩ?7K-K8U?iv$m L*J X%joqrNy^ zUNg[d-(Ǻ7eTYB[%y)E mu›jt2׈ʉRY0n'B+ FW7԰1>R -0c刘,xc3R%w1a *JƦ.\\G3Q-95+ĉX*2ڗP1n -ee%R 2׉HV!_Nvz&1y!`Xѕu..t "k1uW.JcUq!-`.0rK-pq.p(s.^&X|330%f*,A0g̻Rbw4qW,VV^(eA5}5\hb L=S!_b}?iwIs[.C_pM͌ ?#/-A}K7rx⸨/]B08bbTTfzUoCB!?*J+ `*2Y/ Qf* 4:Řd_bcyDk]imɯ,n?d.eZ),DѥoLg!ڄ:nUՖ{? YjZ|n֘03G ]Py)sA,3OT{**#,xfXL57 cڗN]2r+M -!}2*s[r!kf%YPTht\q7>cJzXfr\'S*RZKJYd 6K9*fciN9)Z\IA~_<&}:bB1u e̶8 VeƢJ(%y>pe(_ -R`(Y_wUb_ Ae-{OG߇M, -v{ 1=D_F ?!A({*LNϨd`Ԧ0¸ILEڭKr,O{\:DsS4ıKwIC Z:%5>+1]nkeChJ8Lԫ%ԸQ1,G T"ٱ: +ƅqY:iV>BF? -5 -^6ۥ"T72\YP^5: Tū"hdlz#_ʎc!. TJy'D-SH(E8*nR!82uI*;W51FeTa- -RW)!=U!M~b*5.)["trGr1(n7Rx".&Qr7A YH%xKV Ţ%[@ eF$Oq sˆV!) IOBdeSdaLj2fernffdwܶDO>}Z!;.CWgR8,MY #aگ䒎wE\۽\Pڱ@%ǪKR\TjiR w4*+T\ n)zyF::tARUKB[Z)ĝ}f?yFWDx[]!"N%KӸ5KN_q)ʍ$SHlW4V!.ZiGz./p-73 g2!60co+.384x&NIJ-J3BCQ) 7 5LZs+pT9&ng*z>&D4"Yb l"B\M>/AI2J.# 7(D=ƗQ!FXY6Wyry -/T,3)*"@ke|&,tb D -7|[&A$d@CT~&e TW7ʊJQlGEYjecRoJ2EbR7rDγ ܫc̦]A,=%M@1ɟCRRvSLÜXhôLv+%*YsH?[;WUL|3ՖmbR#fBgfDyNNЪ) Y ha>ڥh*ˇ̵n eWn6TQe ˉxqcO? xgw -TrS,39ܜ\vK|8NB@xkxs %;6=B  FAAyfyNqO0ޥ x0%p[O#9v]ϹnX:Uʈ7>cu.UaYT.\L3N o"K7ࢯv񤇿oO8~?,B{D$"o;'w(@cja&bzan -3ac כga3h;W/-RQ~έl"L!mb{_ؗ5\\+? *9ST 7qwLI3Oy{(E~;b@C^R:"0Bu^d #0c"DF֪.{Y9Txqrksz-1#x%BzpBc|_NjT@^Dc_jR1%4&1Dxfg,K0JJc:wrȳT p)qܷ_.A ;]L\eNf&%L-2Y/c~,f DTi \;fɊJr93w5ms$m%ʍܱ)ݕxA8n\,WlJ%_+~]sDBfrL3ᛃrK%8I`EK=.WAvĪZa~HUJR'Uu48,QΦg(j*: -. -55X9%10$3LFnj>n&ef|hw0\!fYnP y jˮ~JCs*%1azUP*4IJ+x:I~.% 9-s:Pn_L.[D@VC8%Eɕ\TPq+${Y( |C*ɁP6#.GOI<S:ӏ(y;H$G`G TPR]C,.㰷ͤYєyHoYu|@p`$)3*T}pGTD#l?i-"c۔}u߂dբF9v|*Tg`Dw G#SS\_qKF, i4,,&U[(@ˉKn;+5t^R98"s+ITψB\li\腬$0e~͖` \ķPw{ #-{LE]Fc m]:Rĵ{z*LUų fn[mq72b7c q_P_ALIMC4֣a pN}w9u a,Lʙ2L? .8cL6*dc5_zb [G+%L|x\9kS -LBvFK_YAS//e b0"|1|ḾgE zW)B< ^:JL:6\ {Ԣ?]MK@ /jMKfi*Tpp%R8jRD.Vd2ti4P[/X"*f-i#xՆ FZ"[ٯH?ӁRA7Qn)` ]mcUJ]ctH^1SB2m/ΊR1zK#Ar |51-.c#B0C'eoܢ!+1q>ef)/#:aL_%GDKQ3+FK%1E`/'5/Ml+1)6-j,\* -.͜PX@LQ0`!ƉW*+eWNNHULjl'pa730j0lF|g74@X`C(QpTG|Nj_R,1]Ĉ-Fe}@(Zc2n -ҝzÆohLPl>/hFz *xj8s93o|X%@i/sSd꽞ZZW -pS1.Nn14R2. BW!y_rƯQ6B-qbn[Ds2|q=R:!ㄊ@~,"e-eZ't7*8BA62gw%`UU Jßފ)@}44kB_.3Da*֥WQx$u;epYoYvb(u2iu^zpό\BQFqf '3Tz7c% 4A>`&P;D`:%Qٯ`GZ-3~"QnhpC -/0xb<'FN31>)EnjLè1:# &buy&+rLk!6>' eb\#e5Y. 3^k,3΂DJj [u|eQ>]C?ũ>ɨuP JD}wi{p~ %K4%/Dd8;⊔eQJ|,)X}DN%3rϸqɨ,٘b\0".+%||KQ2j [q_PHUd抝}eaJYrᚇ4a2pG7U&u2TEnUjTԹW..T7uu -4'p ^_peล,^SRR7R2L&jXKa-@bT? -%~gl&.So0GEmZ`c:T-&%L!>I/bƥ e"<-wXrsHvv+ 7[g~KP^R Dz=al=<ꗫ@ޕmZ^/ؙ 碈J Eý%9WҔz%9j~]ܿd~ B`V#$i3dG-*0^|VX7AyȖq- BXqZQFV:4)!TqRJ5 TFڪ*@* lW97-;SMiv$3e=E@YAv#)QY ;1Uc4JPI]fff^pǸa.lX⣆mFѪRpZY,2Ҍsy^ᙫ\L_'Jr2RTⅲD)rep^*oXKIJt%^-Ƹ-9VbLR%>'pvJ8MbԵ2[R|W jf*Ì7*(+\ùC *  T]b_r]Y2Vx&O eQP)vʣ{Z u-Lʽ*5* .s) BùખfPN,0R[ZĴax.j:fbTSvK/r`13WTYNf8Gr=^%T1 -:+TSEB&Kj9᪂.n+5DOʭ)ʇ7ze\c)QJ:벵/3+*z*/| աk`@% [^NOH0SYcO˚7 E3q1|xowM; jap1b&#}pj3-q"ֱ27-. pg t-ʌ8UጤdWq⚁7PQVND6AcIX Oe!2K@D 4(sST8Ծ \3 nUp*o]p)xa2JW\ Gpa?bp - BdSF8>+.f%FS -& ԯ.: c>` -̷ZRXhM/#]F.=˖L[R±KDˬ%5+17 s,]O! -`n`ВB|Ϲj/Se O,]%!.-IBi46Vm׉!nP~aiҭU~ :+yQT8/?x[AJ|E,@R!'ê!Mc9k\f뮀X_ (?n+ݢPXGW)ө[#&: %(Gܟ 冱.eELamұ;5f>ئA:ѣ#^ cKP|nkgF=ņJX &KuqE~tM5U A` tK={g ),†;=.euXĊ5.یfdPܲx ->~Zœ^Rշ=d>iH S-^YJWxEZ8 -g˰ES\WԩRʶBiYn6)9gfQv -J$Zv0]hnlȂ .TZ.OaTy2Ʈ'g.9H E z8ڬLǖ7Ș޹na6c}L38x*5.gLIfQkD '2eMuA#\;AuUlZ཭ER-E( |*Unf.-JYMg8{2)ap)l9%o. Q[ ~F2F)jA#QZ>Qa@PfԼ؇`Y(,, >;@EM=4lҪY{ܻC>}-V-bjoCS -qWtćΆQo.g[Xy#\TDU,16@Vë[d6k 3D0ނ"bNP\YCMe t:~"[k%!CtE]&> 0?ZbX)&4*+6>.bmbQI|fbـ[E{DQ;ʑZJ%2c -7>1ܿ1$1#q K)v -OܨFK|<QxyKZLSR+EǚU* p85*&85ԬMbkwRFPG - -A$/JcjyP, Bwpi\%RۋMhcgYf+3st&op+Y h/BU|Ei -*]:RAP .nv=.^tWl,(UBкJxe#d⃸b_@ ~gbf;Y1aɒ\fUKPA^.6xyaM1&lTwSցPmHc+-YOV]|9K{f*|tş -0sV~$etoFڟ)t˃mrcWjޯ'EsxݐeNÏњ߈gy+W0%= kvu+e,BrqpWp_ %ʾ,DxYp]0s@7{WTFQ(kͺ|;z}z[~Bئn~xҬ\ݞ&a$GeLcw)#Si܅mЦ5/9$ -_$ cx4 t؊:Nڹl%,RjUJW=\g&jA[FT2KGlcn45S]D%bTE]TНˊpANۛG\\T_|YPQ+~ -?ϾX]fcjQ[2LBSMJRGL)ڗ-c FPUszȞ fw,'! 0ɬԮnW=@*OHiA"B[6By^p7)%K`ܹDpAqxᐖ щ`)W:|}@AR|^u*Y,D7l#'2#]2RFرR20KX`AM:-I22xx%.xY%AhV=1qZ3 -%;D G -_K",PGѕZ),qFP^8`箼2KIi(&nRWI3Qǜ~EPK xx%u0}͢"ɌĶ c \u 닩~r؏L-U8tKa:8+r$ou1(tK(jQW.[?V?0;\;A"M*0>ؒB\w}q1~0(_\xTw;z0$ -)!DkFLqp8cuI,]CAqpd⟫ŗ^ :=N% o|1r ڭvQ @Go<@(x`uN%\d!x_x+?"C8^jgq3 -;_1xL-Rc`}}IS>s.+`{w,[X=ɶy=]C*>`0n -]kTL~pd5M˕4("PrMlT8~ NcVnikxY{9hQ~u,/=W]PQgkYu+Wmwtyy&* .= -/䍒d\*Z`Q[eyKV!>[ܜ [fxqU\x.>YoKX{RW R]. ꑻ%x&xxu+D-xq5:*4KQn >Z%<ʍ!E JSH>UjU\!\.}~ X奪[/ %e91sit\JZTḕ23wR]֥ # -pd%GK:ܯK9ݬL拔T2,Ы˸ TDkK5ܵ8iQ,ĭ1>q~GY)Ttas6 2ڱ4b 7>Hv`aⵈͷz[Eg:FVi.H1dKL^|AM˧Գr˰(n3*c*[o?3;fj*Z d)>8dZBD_B3gUUL a.<\_l? ʹ a֘9 ,q[ -0/~bȞ菬} 16XdTgVp^Ky Vng$]G: 9a`X*Q(? - #@DVL3e,"ھ&EQ@Oj74JPRV^Wslf!9cІW,"!Nk,q -x6E(S}rCPx,&eYzZ'\E)Ɏ/A|/7D[8-$uV7G3Ny`S6+EXś7y$D{Ȕiq uGRXsP~gP^@T0PD-; - qGai)MGPH'6j\XTRT7v։v^"J&o3/v0ҺA]+ .`JMG%È1 l,a]] @Q+)ʰPc2g-yP#٥T/5v IAX͘&&.U(L1*&\_Vr!.h##W!THohZ~cF -?C1+n?Vw+c&-$k$ɫ-r![YVX%x%}J:R׈IXAW6ٙAt Il[oV -0t<b /vca^Z rB%-#$qoļE >FnPEtlHVN(PZDB݄\+.θ -J(+T@ EZXXػl PAt`[n`F.koM%]Cs̹+}tKl˳T;F.z``sܼ$2طܯPj ISmjWpjJo?rӑ,!}0Ix[NUUY U2iZlF4χbZa̯=a,~!7yɴ5>t%;.ѝ%֟K2h^sAՌuD $n^!Q C+c脑RcYJF܊u;' S2Uuw~P0tK% ^Dg yiUGxYRTsS3)Wz":up/̑STʈYiu3|X.& N'1D^)&g蔥~\()jM b 'l_"X>҆!:-GmAQjs:Q5q;GW+TE"vn_\Kjj]ƹ# nok >Km1C>jIxȢqkEi -(So 7qp._攕fW ׍ ;3P)]Yi[\ %>e# -%D"͢u t& YiZчPF5UL 3Yc}]Þ.}`84^eԣV!TL*Ti-JMG}_ gQr.RgqZQ%=.ܖ*Usnȏc+'qj +4(d f+c1EȁnFQ2VW 2D?1\b% -KW4cP4b/%(Uo)[].X{gU}e|cA%»tlՌCIg[-˶DPlu-6]8xLJ9/;ctң°=Pd]{KD0m˸#@xkJrJ㎣r-c3,'eإV)Ԭo5a)cyS_ʌ|ʢvX MJtǻʸ=ŷ._!`VD|+eJKuYƒsm Sg_0"Ŵ3P+5_|^BVg`TxGd9P%'@7*cO ֧cNS-~ݪH!^.L| -"30TƄLZyeq/a?2-xz Q7S^mr\\c|{Ga#4*#۶?B" {lK'f1CQ2';gi*[S%w /vMBSorP-ꪑ iX#ďLlt )wp -,Vcvq< (fb2qK=y?O &doJ( - {0 -QZv O%;Эimܯ3fCHW+(1|n 0B\2B!3qJ)YIXYFj#)!&l1pY -pb]i -3kY - 7EF~bT幩q&<Ƴ%_ V+Ÿ3Mʣ WVcH3L=R@Š N@Q;@E6B"VBK^ j{R./ ȯLu>gR_l%*'"4 -Z~P'ʛkyY |nk&#U.u τr2B2bw5olDas8~`6\_nZAʮĉPs_;eÌ.W%}`Y~bpJ.cA-BNR˒ lH8y%FZ2Bܡ2?Ă,P(\ ef Cݟ#4_!Ъ*Y<2OueT}YOL[#vJKk+M ]*VA"r0IfMͅegGIyl3 *d @nUtk,N%^:Z C^uܭ7:aËm nL ,pj eL~}຋}0x>_T$ZqY|d#tθequ֭QZDΒY_H,尘ƸIU.)=/I|jH ߶F`N}k$qWQQ~{\+rU.'˯K>EE2zŎ\ 7^ -8t8BXrYkmY/});fC35 BNBּLK%ō1 ez$R1qRGi*b*l o0y!Gjʱ]mNg"HR cZ=o0 `1mYZwaGe2 0,GYۈ_ŋ늆`-QS텈JETd&)$ծϿ1 -I3SpT +1<8aHg 'ۅ8P7Z%8[K9mD!'epYZf[o!RvHI6x升IAj,/?[o!]ǃ@Ɇҩxr2f\簀%' (Ұu` ]nX@*8.ѯ`KD6j>Ox(]W=pa2:S &XآtK]H`n`wTC*K'Wg}`#QmsI.[1Oqu-7xs+hX$9οYhؿ\T v33F]Ԕ E`T}Zs7Lf!` -E2J)ālPrD eRp5*=ԭ(ۈ#NqP>5;pԸG#<|/̬1ƿf<ܾ{9l.;a8.`X^ȃ]Γ~FpSV  |ތRhX1ܨm.WRylBFnt?3ܗ\+w+a:}bJؔ,K=@ -o-r\SB_|~VtzY `Sϙb[,JFw%*"15XZ=v.9`\W}ͶemoFNߘ?U]DUć3ݟ1 2ThJmذҜNB$VEl~j߸&_qƸMAB%tOvlV]r$ܲ3%)<~ɺﶌ¬ryc'Y{/Bb\nPcKy"bRTkգ#7*wr1QmX̾߇)e@WJ[w.؜%+iXS D,E\zm]q|3IO^KgH+*4.?Eo "G $* )P*gxf t4\-p/d[urc#TVK=+6LoT%,3hifEf*/i w}6}s0m1] `\h*ޡ,EjeRWR(WC~_Whx ^ A#y\ % ,_\Թ[x ؜^tĥ#u-LLw.G^Dm[]VDh4RT.PsxTx*e pG5esd,3.R(itk`MY%?)%K[+yTi~% -[YH+?ղ.2ı.< K4FBS-Snn#ΏbVxʓ`qh PzYK̹XzgDc\*`Bwʚh 񢶕׺{W @eMA(xhP-+"*bF@n+?ҪKHuȔ- fUQ76d&sJ~i ǖ -MO Q]*6#Ya{-JY04^S6ӖNhXOzimBYg?W:CLyxab̔fVqW:l%fgWC-¼1xbyǿʎrmH{u2Y h:qkl[ #_sĹle|0Rȝ$=* F< ץ$i811p1n=%Ft!|6m,FU7>ܧYw -#ѣJ`* (&cR( ٿ]4-<+Ikٽa1ia'r8rU`Lo|J;0J!}Cݼij-a*]$ƅa߉s/ .5E|3PAeeΡ bDyZĩ, mkŨ_? ?XCS -?OۯJQ8rV -Veþn*]*[Ҍ*zDNyJӺ|0aƩPeUA|,|ycB`Eڛ7*0u۱OxE9%9fao<Fj;)EH jھYft@2)0 y>c*0q)gܚkWv^9? r]j#l(zj_,Z0X];".(v{D!Ew`iF4J ~!Q۪EʏAʊL*uO@'}|hvqXN #cd1"[hԍ]q6<'io1YBKqXoH/H7t $uM2En0 TDl wm`*/a 6KaCx/0^*+v*M*U[lP[]JH>%cDBtb_ы=e?Jg]C_wQ1 pHZ6c(e o,qA.k0 FeL8Z_MEvz~,lK,/Q`FBoۢa]T0oj)<[猟E??ْ@ةlN_Ò%wB4xa^~bϘs-~+)|8,ࢊD__1^Kb?xD6gC@MW! Ml̄?^`d?ѹ/4%59qbCV&uK qu?)*!0rbP/d] 0CL [9j"OS=`uF;V,qOxg~,a)vCK%Aa5/ p¦Oa͕PCoqN `)IΥa/1Iyb65ܲCUJL hZ[;;3|Rq<7.5*}A|uvǵK4Bq>'rR  yUb£)@e?-cx|ϩbRR|{}ƻWt`t* <<\sUpW@mwB[.:q, qM뀭UhªEVUeķ̶7eܾ%Ku=р6e8R&( e \6?ѵ*G d[h%xk_-Tp{'ѕeGǍ1*#a|N) ~ddoe*(ӎۘGU*<+ |QP,Z1[Um*KXQB0ݥ] `UW9 T!b,HJ2 5W.m5G\#eܺq,--4)UB6W]4CG;FtJk{VxVܨlx.٩rXIC n;+ݧj>ʼPwB TU'R&:0; oRONK, *ѳ;թ[HdlUI[WO%_5/1em7ԼFʘé{j){NbB~.deLsqISj' T)BX,M9ڷ&Xr۟MYŠñBC0ef1_{0ҹykuvYٕ+*]{׎_`)q=bv߹ в()诂0o%>CR4L]W,y?] ShbM8nSy|$_ k2dv=K{䩉zVXF&ֵʁ6rb @Tّl}zlḛ#/5(T1 Vg` pZ#%hV`i 97iS(3);gCײ|e$U B(gh9H|_rq0ZZX8g4 -@GFF8_,\PVw -F+odŪmV'sGa 0~gj ߁Sᙨ3OF˕0ԸG/)VHؑ[r5Ҍ}|qR;F7*  -r,~bs~k^nۘ% ]FɛZxi)Yp\*j-裣NJmYKkg蟸$>hJ|+*0Y\g-SUc%z"^uK%Ħ2]`k1GۿM@.nKX֣hQ"P*H!CIڍD)plư! K['nSNM㤺ߐHF{!}Ii/b +Sa(Fĉ.>fe$2e< KQ=˾Voň"T%SzP0NGz-h/eټ*h{\&K*L-Glrp6U/*5[Uu j%B6~f_Ԇj[w <t2Rh(*הSEHϖ^|C3*=,AX#"1` u ĊBn0 -䩖*,5͝Cc>窩!̤/WWf]WEJy%.yYу,9&4|.P"׌ -"vBW&2DQul6Y8 mqQ,@ʘ%˗nQ*̧_ wPicLٝuFgl;.O\fU1zIY_F6Y0 -`r --ʴL2ri`5,%"Q4P%ݗ@ Y:˩ad 2 -@iwT ..= [0kiN"E gZ0% lli-_͡x!Jx 8Tz5N,K"[]61nRcVT[ij^x%%)~jSpo,U\\>Ta|mGE@/@5#:]M{hQH2tkԏ}VZl_Fl[fe LbEGRw`c`A߂e%*fcL8yƥ9.,Q - Q==XS6 - "[|vDn~TjtϲhiN*X&*- !4(?jG.vQUhh7:H*f]Ƶ>n8KeE -7r_q3c`YO2/x ]45MSWb$pwUv]=˺{;02mQ^Xk)M3kLWV 1OgnWVf{ -a2][*0e]@uh0Gsp -m:Z)kY'm*_ ]]v&ᘨqPy# hqa-Z -3]dBUlD1oqe‡E%޻c Vg4j}Y`F\,c5?g6<" n[ `aurjUBMm\0hEh%bWv>fMN; -RSd L<&n X=Vt}mO(gJb-j]5*z}N>e0 DvF^>xl5p\,QDGjqq -Dj찖Vs?̔uemi1юe)KAScŪLcHkB+;/qԩS$̷,LQzK]a[LA L}5F˼m_1[) Ʋ&q/.+˾Ya~.wI<ʜ@0 \CogRꏕp5zD֠+ғ-?-;@WE?,Mg}Ypj*_ܪ:R^5.]u$nZw n ( (lKD%WكطXs^&J=3lTJ7q上-fK/jϨyJ #M~nqJ\Γv/R|f"A;5i!Ɓ9#}Tß:*o,3x<ٰ!.,l:GTKBf&,"4CaWl3j\Y -ո?IkmQbLU,B0o@[P8J`6@-hHXWj>o,G+!Jâ R(dGJE?-{/KZ-Ro Hf^-5E\%9<ƳS7rE6 |Vas,x\"MiɈ-ͭˍQ~0$[t} LO#7qq"IWws[Rk".x)dĵ*Z˖T H.\HG@!ރ%@J`)Jz:e `o3@`_<]ؚp0<āZ< -e?)a2R< -V9nrAK;Gk I>\Cp%Y7ɛ*SZ T"˃n>NF* Gޠؑo'oD E(K8Wu+.3ԱG1[=YE^,0B,bp[+3G2襖Pj\2e)eTnxa:wȺ1?dgȄ}hng|*Q3?bN 7eGsqIWj#!xw;r Zpxj2)9⪙|*ڇ'Cj5\O%Pj @Kh5^ A'go] ;;U: -h>m&7Qb,< Uu{1{KVPqcЫF\'n-{[ >].3U|XMv/CΤr"C4 ͑bl/ab_mND?5K|Oy7 +,Ax{E[O&byKuX]Dzt21s^42XZ,J?:4(u>aڔNI7uB[_La`{L #_k}dP\1dq% Q31KܣvP0Euhnjy d)wԹG+J/fPfh B_!w:!]D\OR]+pܦ(+0.w0MJ!7Q(zu< Ճũe՘#1)͐fgR֋+GtyPZ+tq_,LJo!@Yg -/iꌡYTX}@E댶V̡鶟Gw ERSMۤI?A0[}j&oqg.w.(l+a4_r;,[j_. -8(MQZS_og%PJnT]Í熂e.UJYx%GCD09y˄] 2b$B Q s܈(wQV{G{7o}9f"h$ 2-_JJJnEL[(--V(|\#(W~&OLh}R+ wh? )) ɽC+ -F%[Uf"(yWW)t6k0jSA=Ku`AP5.-$ƪW5ψ ڪ%CjwDK88fSP`ÙEǢdvEMܸb ,rM| aݫHT?ŵ@ AY.d\VA1(M1/t0v"-]#싷%]Y" ƺu-Uh!$29Y_ҟ fPXYK.'1&&HZ9p~G W۫FR*P`&7Siw':y Stve`S9l¥(w*aosM̷\h qt o#--+ gx"))Ilk+LD2џ?˄8;Yu踩!xQs7T>^/4)nd.{ewIrvHKzWJՖJ= lOGkEj % .E2lITZv3*A R-m*f_T -|9I/<ƥ֢\\DCm-,3/}w3uE5OeC\N\Uf5qW@Bj$#: /4V(SYlTø5p nesph]IM,3Hld!vupJƺa p5-Z3H+ T3Z4wg;>Y;TC-i |(n=Jc`T(5bD#%N4vp`{_X5eBIz°*<9q5(z38LL5vm )Fx*xk,n;6&4">U~|0(Z -!ru4 m+-d337#zD!MDt 0hRr-RTTGXgxC5PF\8+T 6ۦԹpxgu FgLws21fAo-"֥NK7ܜ 1ʘP%9eBowLRjגedRzJ.!-@BwD~RW3Բ /P. 8|X6.PWU3zKwfaqrӺRz%7wf -W5 -)PF3J%5o'l^lyL- PW̚++CCaQt7wJ -7Zxu}J}\n&K'C}0*)nHzڮQى@I҄T|<>I_pBJ{-6j~A)b3oc 7+ > q)* |LebMQNQ X@Eƨ5.DLf@ʶruJ-8x[{$f2]}"j҄+Xfb/촽JZLڻa!:~uGyf-%"!Rּ({ILH -U#gBmf-z4K+C[64QCLe;!~`%BpL >)YvMڼ]Ҥ]N+o `2Ө?W3;C=, !KBٙph\ -KNZu`2.zbvpM -a"0}*2q$ -JƣUL>ͻY zQ`*U]F\%0[T`T/% _5잿,յStn.Gu;l6^_)W{"c_htESW[P.%TxA3 e`+\"M\ɶtS3q#vQB=*5Sp$UmbȼܪN/Bu5<5 -sLGfa}X*Pz1GUpf]ؽBqYG-\UJ3 -8OqL.ܯp`YE^X{/Q:F5UEd,I}N5 X b ]鵀Hc9JBP*Uk/6Z<BV3V @Mɖ)4xLg4~ށclFUs] ^mȔRϊ# D瞂L -ul#]le8ˆ T5?L(xɞ -eIJ -uP wYQe!6sQfxRpS$sh׋p ˳p~.Q̬ClW f.TOrlYU[&$xY{ -jRl'сL+@`] t#iQ"ѽ(!u2~25W_.Zw㺕-m*WQ& M{m#)]n +?p~MJ4Fv>x F|S+.Rv4]J\ZhjYB^$IeSB_Q[>o -Buzp5ꨲ|xD =Phgr+(;Σ~q*i䩥jKGFm&sE4O9Ƙ -2S<]zYH]’b"kUgN~=Q6Je [W>i[dv"\ ),-\ -QϹYK1xڰAx,0UPGXf!pQX0U - TŦXR{nfgoQ;0j\4Y).XJEaq]\J<[K/2Ug{4|DhWRʄc0foJ|1WKXH:YZFU?'Ke]^;ky cWcQc<-ĵqҧK^^Sg۞_x2 o?"XPO x&7yn=q\MAʫWB#"QK&_HUO8qsAik-qXh@bmhuKpWkR?#?%r 1qZ{6ϑLr/U>,=sKl)48U_s~&`iùLԫBh/H#Jϡ_lu]Q 5njXmXR^&lvԶR/-|18KvƐUDwrq02PKRԺ %{E22bfE.eScwGRߪk5U6j\Y.FXh?m穠Ś4Fzb -D%-E>4zuwD@`X-B] P":M ZjU K_^FKR[V^W,`UB c8ag~2izp~PJ2Mt+ڕ-O )۶w2(n06~-(~j:_F(|h5C[3P*EzU``g c7@;W%:S>a -4h{W?o54LD֥w -%;DžDuP;Ftab"]2QK]1IiݶesX 7l,"^(w*_uA.CۮZ@K28,ATc-@n\Ul[MJTc.0S|"TnaP5|p6C]f|:jiIK>IXw_ṋP2Zi]?=nb43R=?d>-Y4 OԃaO K&tOP'gXGNf}+LψKG8G2*RT-C*u)kJpruMB[HDFQE,do$-t%0j"qRU\JL%FƻVD]%꒔կl IB -1 > GIF}}MQu APXcM=;'nk~ -kЍ#&ӌ“>D; MJ6qo0.K{2̕#H3e?0%Fݤ< OV)l e4qRS˭Fϐރ`s? L@~\/ܻQ"PPZT. +)lgg"Зg.i}c47]lxT*ƥCZG ,^7\jtn"b4w"^͏H fRJ! -ͺڀ:HCS5nI@8 <ؠZB=U7MC}MX:Q LI@1'6z$2:5q:VĖ26h]pfoPO^-u d_USVS-6DDl[atTwPd^،q.qn=a\GS+$:29!T(|P.QCL0e_AƸ:g ,"Vu>IbRĭ3on>͔Cpj?G{1eH[[i<1^5DnD,i)LmUf5sqJ:P{Ck DSʵa님[R)a Et<3[ѨkmAXdPۺD^R/5V;ݰVmEcmNBZͭ G,1\lkdKz){"崽7 Q)-d*{:@Eg#d]T Lm8IRJ)+C̬ Xad}33eC}MTMQ[YǔR9w*T.\_$ʁ` -hc Tyq ]x'cyζa(*@lzZg*^v {Tv*'7ԊK4 UR+(ܸLIJ3W DZr2cFτcl -y_(GoIynezX[yqj(5uqy`Q-}4|"LoT /01 -ܿrȢb¯eDZG)@`!^@% ^LVZUe[UlliU!`G\Iw,,0K1{sJ |i)Tж5 *M% K^˞9,!+ - {k,!+3AlB9SGjkV]]\Z_0TpHĐlv -C -#.vY㠂AÐ 4d+,4Ae[< -7҉R$DDNĦz&%T5`"WP:X%ttuy2 -@)p:jQLqJ$. x1Oc_R*_I=ޅ5o([X<ES+ Ȼkn#8P*4GdP ~Zn0҂>F~-;s8"!X3Z2i!B;#iU*\ m -9.*nxB;2 [C2-J&%V iԹaG3Z -J[ Fl1p%⇹^%Jb\/3Kx`NRԮhkԥ?7j0v>I1ɤb_~m~ 1H?,b w\>0\d#c#zeTbs$%;!-$o(ȪF1)ef wRx'W,TDTT -ⒽCXm>Fmgn$~UK*8 4wCcxpTsek3QHYEA -@s(ٴ&[|hB-hI҉ͳ\P3BϒˍF {la f8jC/a[\OH}Irz;9?D3UD_e0s n_j0a 2ȵù\s9T)ӆB'1@~I䅕f#ٜAgr6оkRʰ>X|WglHԉ;bPXCB5ܲXRr;j.J6H[X7Gݪ;*.3GO] qV#, -] Ymc=p< G{ |*` VY]\g1n+ )- !fJE}v bJ <Ա{дV)Mp/~[H렕~ۄ3%h뎥7*卲P_x[g̍ ; )F(l"D -hr˕)Cc޽3P0 -cEc'>d$:(ry*I0T  rI wY^XH!ddn6\o^z ,oԩsulr_Gsb,Q#/m`j_Vu7E^&IEpaHVf/Y Y9w"2rRh$G7kˠWsb(Ct+YhrٸM׃ = nں)3HZI}$r^kYa醐 :͕nHbE2Fd*ҀWYFiJ"ݑS\X"fڗ~ % -É}尓VJ.Y*M[{|Y'[x3+qiVH3'o523E 1:4RZIMGːV: \@PRfSbtR4͐rܷukܠs_@."B_]j(pZ䌧r0H3\KRaѤi ] ]Eu-ԮQ(.ֽK\#\L% aO@Jq\-/5#@mAj-m -G8{mW@ sw{|Mp|0f oj/h2(L8jy"J+w1Y$-K]|c}k`gSHA{pVw*2QlF2Bb(v@QH*am-;%F=8Ysg -CfZsmtJNgaJ/Tj-MbaVĩ,$P@p2;jc]V\?_P̩q/Lhǟ5}K"+vFnC[51zBFKƁNš3R[MJɪJEl1D Rՙ |=޶}Eh n8ה2m yKj#j+u"t=٫ER\U07>!-!m[ksdh PMKp&&(u~Ir> 2b3Cf$PƵ n[EpG#n.xflm:/(yeq`Vd.T\yvtUf9i V`r8Z後_tw -# B_(VmLaY\~eTgUFK]P%E:9e~f/fڬ?QvTc4n-ʭœ}USU+-JUekVv^-!#96x-CV+Ļ3 tX;R7l f +$NL-Ʉ -=p0״|EB7p%vR*Wb_G}o\6 )r^ 3˚SmA5lcG} :f=+ظf;sHak -4͐WcXBSd#-ijy-'X$K66]? X}m^f%m}vҟ4lB댫}Sh,MډMi4:\KT7Et%I ,OQM6)RN޻KmȲRLJMX-Ԩ nQnh7e %@u*7nd7 -n rOM Y%k1W//ˍBL}ˊ}}D] v!sIr>YKwuB)n^6&"S5Rڸ)/ͳ(?:Qi_:E"7S~b8[ ӣh) IQ.))YFB\IirĔQ80/arIr*$|K4x%3^ԤE/JAX縲¨e87%\^F .3[.Y4_ᔔhyj,+QZ"E AHL+Rϐ C\LgFZiOs7C>GX'5:ͬ=e)A>Px"Ij.? ̾T:>yw- .*tv!idm q ݳwb0K2 sHgbЗi噍8y6]UD4VV"EˍG9ٸwPL;`ED`]jjXT=e}Ȣկl#)/OSVU{V\lf⛙Ŝ"UCvp*[[(nvwzvKn@h KtP )_ĕqLt[ADeokE$}"3`*\ Yb0"t?J[D~b,jpxHjkLG[!(X}AT7DO_0wfT&}B2VݦHP'/05B3 UnxtFFE`-X,e'k+զO3R?u+Yӛ=X(RV$ oq R Q Gjʀ!E%K?l#_2S 醺+3P)s>Cfyt~0/pF視_D=ۨ7yiu2 . sѕ9F`\e!nY;]*M[hïY"~+(N?0IT"kw 8^@ -ї!DVc9}*!~PUEiB 5)Ng{<7-v|USֈ4Y4 &P 7<2喁hH%kw8acfc ldZ]WuE;@%(d{9~Hm.vawHs|KIqo( ӵcFj٦_0CTɈGn/!v6zjQ<ԴVV0%}wݸOXcWU}EdekB -r&*u)Y@1+W g NBvsM'Vjʗ]K-T+YpDMe闡;U֡AD1 - +XD+A]1 U -4JURJ|i31SJMlZ~-&'^2ZwC/ z10Yg *zN8HJus54w7|ukuk?Q)¬R}il(w3ϲɺ㧋eܻf[*\vwP|+/DkҎsA/EHɥSIG&JH_[sփ+P4]WA-"J-]@1}ˉ5| WQ -qkB!oN")#1#xX[/̳S%/2%MI+kREVYR*,˸wưA3oi<̲LP2lsUyjw j7)1KB#5,:Ġ2A0~ Cg q0X -RH # jI+螠 * OKm`(\@tN…_Q~) -m~r0X )vQ̮Γ膬 >A-6 ffj-FbD.Rv-.^Ϣ/ -ڥ=T)E 5Xf!vXoU6ZbH̍G`Ke&Oh,KՃj$VP[4bZCpXb0L헬T[ʨ%#ܴCme{.ft1 K -Pw.P&S*1TTV-ogaF*b,>pԷOſ!"[ R!.h^XÛ|Z*1{He=(̿xp}jL^0Cx{l{"^=AfvaQKYd)w:JHʛHvrCdbOjj7g6~ GxAMD~`Dks-IVwxLE@KEﴓpHb:e=Y״flڑv<--QTX掾ScږaHƵ I0 -Uп2!D*À/TՑC)G0νYƣm BB:7;T5&!haH,?2l54_h07ln \JZx..Xu)2f^hqd bQ) % aw.#4kϭ7Q=ql3PUς .*VC6հU8H]IA[yE@cN!l#=^x>KBrPW 5_qt~>_jwiH!E0:l*lHqP%r$ VQeb2VY*U}Jn*xeQۃo=c;J{epRb$:"UQߩ֠-8bܨĕmN.JngY^eקDTPQP^TesL;koyaymFDSi]b c:3.B+7p/ -n.BE;q_$-2 R9#,v*-Gh}.[/j e<3ef1eYPUphsQUj+/Tw)ẗp<$!jp, M`;ig{'Y^0E1R֭=K (рpۣ%;OƊAdcMxc{zNW q[t\YE|p)~ԗ<} iUdoXڱqE >EtDe|+?R[t&쑭_\v3{;Wu ~$f}?RPPX (`m̲S5JbwJ>YP. 튂p>*!-!\j Ws& ) 04լ=Sp+OWjMD,RVX"Ez豖a?VAQ5)J~pWݷY ¶՛dn|B菬ЃHSV(;bd=Ф%!#zbdo --!MZ)HlkadfǞջj\1& -_&,mP2HB+A| nnXAA:(,4Ia~hZ;pgCG]w -ыrEj%8-pR`0c]ڰIGΐ_W9\ȵy^us&Q%JzTj.[ȷ Srv1ݲb-h% -jjAƼa Mԯk\^8gX86qC T$Eiw}Mj|Eiq/Qp6Ã4];t? A7 x^% -yKԬJ3 W-Ki/ w2*-# -kbgmkuI DsxR$0ͣ?JRR[ɩEʶ>L-(9IJ7]k`8>HgD_ҭpgkQi?X 'EԂy%+aK f~ En{#(HaaR$ZN}!,5HK *E)8)2JQ&"[:QEtMV_hnl@Y6JX}. T.ԺnTGDX("HH[xwdW&W ,D_#J6xÈբ`q9\24I!wѠbj.hU1C/?eW0_K1H]2S5aUElU*`DY+A`)K-UhёPOg X!(էZ51( R/ozgI؅5Zhu¦ g ~Vf`l镂ȝ-Y٨Dqwh6mB7w`U0Zti,ɧ}`B4MueR#:ω56B>$彨q4VdQfT"K̽e\H7tTLWԲQ*;%T Lp^ Ip̤c|+N4Uڭupsn\aKO n ނjq(;KmCScܨ[Hj 1 T%D @SخciޕU ^^x>%蹬vŨL\[/\d &kZI-8 <g<Xao-RUAKP?K19yہ+(o3;%áry_p%4Ŕ<jYUK9o~j6$e sTTLA:bdSsQQ,7M/"gBDԑȯoܟaX 7xO c-^-D=uP\qU:m7䉰ڞ[X<M0mR{˙L;E+gZ=B2|li~xQ(ݟM:cGH@R3R--;colqpkVOGĻɯnWnGH$!0PIkeC7[ɬ{wD^~P/ꆪE<;@ -MJ -&YG6%J9;ٍRHpˎfernkdY%N pb FfQP\k@6+Z=u"G\e7* mPSZ3ih;hޣV`B8u380ɟ3w ܵmV.ȦvBeg#.O hȒ ~tDԸz+sG+ɭ`@Uͤjg+'Do|pi&. -H utP[@PRd6|o -^% +J# rs829cQB*CJ1I29\a -_b VEq! -7,y ԾS9n%`i,ݑߞ72b֕-܆vh ^ψyP,nRTګӣd`KSHƱ0ę&f! ׷iov̕IMDe3| -GG»NaR֖QuWczkRe:E 1ҡDY?pNjw - m Q+77@+a srp^!!\3-cOu2*Tx))jU`r -/|ꐿww7}WJˇDCsWCK\[U_ +V[|DnEB K ]^]S\vp;Uaf0E$US\7J2+a,Cq~l͓#,)7q+z*]u 9&(#C -΢%3PUJ1W}_YF'E{ -Ju5*)bWCN3' X>Y$]'1_Hq+}y*˜Av *Y0kD. -Kj-?Əi A.U p`!1~5(Q%gC3S3V}0@*b.ǭE1.Yx̬J%pYII躌X|ItɌ|4n m(fc7XF\BU-:MWszR:1-ޠb""FßDT }BBc{NS; R -WAaX)x_#7q'uԣVz2ϒ !Bvl\LV, o0O}ﮯ }\fif;Ʌ]j>eY]9][h|\exaeQ+*z7bTśolX%J/y_w\_fW'bJP%wc09 f&DǼ?䡻NtUw[.tLe#XLmVƈ -PF۹JUpMxF -u}02(G4%#.a'7oMRX7Ae*[2 -WlE-B*RlǶb:wjD -QV m0qcõeCcWQ:!1ʸT_{K^"Y6@ }Qa -Gf"[f4+UT&5:%5Il -FCHXo5(3[c|Z.5dl`FЉŨlߘu|^'1- ^:PtCtj!(mkHg舆bVd[Us,6ҹK>Ƀ}af E/Q&f<|݆Vhf*Գ9cY% -lk{7)C1[ugb,Q+ jO wt5|q"uQwѨ0U §V& -w;eq @%N.>ĩRą-#+!aymr奀'ZWb#%?1Tsj/`MUj5*_@LkuZ 7(o} H@C0\{Z0+SG@,R WMj-HzߺRis/a#ȋ5Mv>ƅ"uShJ宙_s/kB\\qrܨ˖ECEQkCl -#0JL $34U1)xZ;+hX}cmᵘZfnYxHGYXÌrS9{P 0(n@v Ҡ} ݽX6̺f#՝Gk30FQ f!D]>||,l)xo=vEqw,&;"R\lN#UvVD^wvBluc:)Q0Hӏj*f4 )vPg.|O&4@i1Լٜ)bb<h%*궻nQ ̊nFcJR7Ӣ,xWn:@Y?L%RUZ~*lGaS~Fi#J֟wxQŽ ewƭK j#PG4)>VM O?chldmp'`.`{l:FA^_̽AYP̮Z?W :!^)|"q+ճGD#~lAx֍Ś/r]ƈ'zđs/@@n[*[F[vRC;B\htc}> s"ۤkDE-!TNJ\=RFU887&:x -Hg(Ԭ.dCQMA]BȻ8x -h$5.u?<a~ưe?T\$LŘF;R)2\%ks>ef~Lqs lV7f{dwDe[A(ap8j~*G>,`}V )Y[.&JYqBWC&?*n Ӹ|ąp_@.⑖bjXp1t䎅1:/K!7`ú+B{#Չ®IU pܺ -8n1^.STƮT)?.w?>$F=o{ɂڔPb?s5#7; dI~]bf<WQ躁Q5< Mn',7?=Tke@tI|T ]&,/:әX:upTCOx=Ih5 V g|ü$ݢeV ޡGlQ`#ߗ>B#+V_uE2ˋ-g6zC*ԡnz/LoOChM̼km8e_ 3,{P3,Tu -{L{>act|XgץnQn Tj_L7qecVؤ3],5 :b]!b^T8h.n_/Th4a. E*>M ځ+%-5/ y?˦}x⥚{,~wk]EiEFǤS(#ҝbĦi3TB7 (jbK)#PeG͘xu*6zPhe(҆v@WĮW4ĥK\Mg cA*0YԪ{"4f|`@x,aDdٕrQV0 -U}pc%1Wfרt"jW PLUaH)X vP%P01aS ~>?l?.؇bamCh+&xGԋ"c -eSr -u7(gZjV5eg6lwңA8սGu|FeѷK0+Hj&V)*egs\ SP Pc[:X!u]jZԶU_=)baz4rޛZ+DF <RSމ^-G"?O<킉_1f pm!S$RǏe>8\*jSd}Lc)0KvZ6D~M%vWDEMiK*V!/8W;ٖ҈ .aeg̸,7 T.׫IT|ܶ:suď )~4%)Mt>JY - U3 0v(>L w|fԲeXi\|JqRsyrx,;Q7(\aJ -1 G~,ynZk/Qx&/**Kơ蕙sM2[AYsZaB7> b${2F̏ *1Hiecsl|`_j9(mh:.<渻€ /rj '[$RvR!X^i] -JIVP1c>Z3Du?#g/$9}4.gky,7 ڄLl$+xIEǡ FZ{ -1Z@PVز j 5v",Ow ~rȡuZKJje%rX \*;0{v\C^qau`!4\]]F P笿2kPPޫ -H#e-oRǎp[ -%v --Gٌd/k&-PiW L*bkHtQ൤<~U  UB3V3g 8mk/%_!b -*pڴ2UkMP%~ [L PD5G[J F݀Ty֚6OnJ;*DgxDm'oA}b0hhՈiKBVxg,j sP(wLpqy*X%F͐%b+Rr.\Q.TRbֶr>:5KmƢz~˹[׍Z>~M}!K̹D^ȒWK|T<).Ac5sPu͗tYuІ VۖIcȰ*C^a.S3TEj^#Lc/.ڶShy%r3k*P_`xHtr:I[ȥ{1R%bGBX/^v.1x^r %͑N|@Qdme4V f..Eu.-3R%a 61KwFH+!`1׋J!|@Vd=T1#~#J)KCm.TH\n-COA'LΥowm\ &s[sD*1fwRTcN*>akؑ Nܒ]_u?l2zDV[W#赝zNq -oAp`wgp_jo2fɜj~Z@;榃uCJ -6Cg{z6m6`T@kC -L(_2 mF>wEYP#bNS"gCRX$v֭GCH`kq~`Sis+-iJ'jjfP31[k aC:%pdĺƥf ;@lJ\ 0l؎ZF-= ꣮d z5\Cp˵3:w4P?,F6Z ?'Gr{KXw)sh87T sU+{4Kaf%a -fB(_P$0=FW2+tkIM nru -* 1d(B |$OMl+W~|Շ -8֞uib &2uъ?`d jG/MCϝl?sEWq_&W!97\+ʃB_17T_&]WR@*|`2Nn]up|K\JtJIRDd,tU๺dzK XD0H<)D{FMl`𚛉*r3§L"ĝj]JTMĨL^c;檖[ ~ϚܢK)rtˉ؍eEV9艶āW -Dek<at,WP8u? S"rܦ2]-8|&uᎧp-mn/ k̾FVw\-_Amenhqc5muQ/o$Dmr}`I]@)\qD\*RNF%_V‘HueJ;~j! -]킭jJS6^d#eY2rf$XGqt}BK"JU15c=xp7b>CnIw޷i%k]@ *[e_Mmkl T-Q}3itJ/Xh|NS*Y?L!a_j6e8Q`,)u%QvS7BE 5 L}E0 -Bqj̐GVɸR4(]Kyhu>0ehJ%v7,T6t_O{-o+XKަ 4uYDZU>ȤU|on"[lwܝO!#t/BR0;?V5dVX->z85Zk޷UvڧQ[: -_p=tkö;5<+c{pp_M}#0/"\?Z:4DH_ETo0*}iV3L 69k}"W`09 Fq/A_'O +NP Q!hwdcd9֢K"Qc*4B T ;#Gtifٯ.˪br+),Y$PSϰ&fs7(rOFSE/0EQ| @Q,ƉM!T籰 26M6*LT@u*CtEėH,峲6K¼(&\/Y)w])2,{ ]ƱD`.zŔǺ'ΡPD rKC2U$q\!o)DE1HjEY(HJVA $t~x,a)?(UVUΖk7 շҺ-%MT,]#Jm'?ҍf߅?.FC lsT'Y| K|+cSE*"l~fy:=Ł{+CۍR,yMLgRĉbD6:Xg'OȰvs,|-+exQƣ5șGKn b!G 3.7p\qi%d E55{ynX'K^Ʈ 3nCXQsa"LZ]2K;~p07WK LF!u!BQ*?C\-b]_ -b;xajKБ; =ia4  vҘ/1&(+d4qhPD -z4QJl< &XZNEP.&fՖO"꩙"D:1tMGS 5|]LGq0D*018[j%\ 0Ж׀+/LTkNoZ-hEڎk^ Es::l!;h1nɵx:{''#1VHv0(`&b -tuuwTmQ]"BZZ*5&%UYl>YS_I8HuWB-pM*o 2*s`8-:t>F*5>[x!v2}h efbH4u:%UV! - v1[LP] w>B[n;j&=#[S .Չ.Y}Y"֩ؖɻR=d>-Z/QrD;tQy8;7E4yXڱư ,U>0Ȩ&&d[Tw Dko ,9+Y!Am-@UR"-Q E'fnYO  `qƇRUmr7TU 2 DK(BzF3ۿi Eml;Lzbl2p YְDUr0/U^OŒI(j֒OZ 2õ*F}ا@ jY}u rZC~$X&ݖOnq!L¤* C1bCs8YT[؇}ܳ5گ@GUS7ODO&CCqEe,jH)7-TS9X\B_u_reUL8@He_A%t[qrv_5 Ŭ D/<]Gw T^2EZ1 -p懊{⸮MJ -B_I:eUpԼK)f8&͓_1h츶PgNQ^DW )m¥]Q}c4}ѐz!QCt%Ll A~{)O7Z'CGea ?断'p=j#{)o-{Tf:N&jC,x왌4;Lx"0|IL`+i1s;1Y-&#c\-Kx~_ -$5o⬖OE/ф:9ZWzPJ%:Ĥ1Ql % `eT- SJ&P/o(ZP - `^_)miJemgp 9Pj\ns8?,/<8i_!@-yf@7wŜ 4\xQsD*$cn85Ig5Ga ^KG>ڵZS+Ei7n+v,X/X*kq A -.[n8.x$Ln%Կ2\%n ܶnuLUH&b$ŰcƵy.)Ӆ# 7EOY[ƔnP o -_^_>)c(%kJ+*$LŮ i7`Z#s7eT* e*I-qQfSLȷ.bb]L #Qn~1lxh  0mՌMfl# ^DS|08vkBXF[o@Pf;%:$^-X~1dzkGG0/FX5zF9iؒz{iIND[Y49%LWP4ʰ.%sQQ)_%>{8|Z[/I map1[ZJ \k> -FQD &,P?¥nJ1}_;_\]$}.)^‚F?2GG+ sLljM,Ԩ12{X J|N̴ۡQA?:2w ٳ6%%-c=?A6ǴJIKpzd6U-Xw{F4j8%mH]CWt}KɨQnvv.(C@vġjlCP[QV5./nthlrX wITXc|B`] Ru^'Kcg~7p`Ah}veUn);& Fy$uIP+ Nˌ,..(#T1@ů~ N]AlNsqA~cfL%!0iǧFSN˸ҫuE@D|z]U@կcB=m12bj8"{)TYBT4lhxHnELtR]ѳcD|G/ ڨ.>%ԵfNT$%Z\֣F{,!^e<:%Աuė-H0s.Ӕ m3r7Q%y[qeU 厝J]TnnYKRqe#[/%/X]+YQU4Yb~_}>TY35׆3ӻ SǞ$Yҿc]#BdL" D -RnUULJ[:4qRhU g̩SCJe.%w"j͆ͻG*m($Ys&U\/LS5|+ԡ#p=R6=J04k{'ffeuurTw7vZ! -x+f0T6?LKBdoIq+:CC+ȩPhTkr*⺖Ti$4RM#ԦYpv2s86ʞ"D; -tGo\u U%f)*BSKp-[1u-E*\x('R G&j W嘵p+$|cĀϑ -ǽef -۩kQ]UfԸƺ0*\<ʼnd6Xa!z3LUJoeu5FҐ2/0DGp~ GS@cWעdHfiAHtje1ij.=J*RaDaq P`#aulz`a -x kaZT*fSFr[+SPD\:γ.^crbhE`ʿ64Ȕ^t.5Q?M=°'" asqOVj<# U˞3&wSrxEQ;pjªmWV71m]KH|#&S)5e{݄ rs}+1U6JSQ:q=Mb7X_G%|D'eƛH/pUZ%Ļ#UpT}1IVzpOwf0q`Ԭ3X$AEv,y]lyNⳛV.=jPV0@h8a5vO{0mR[¥IEIP c ڼnwoS41$}HX%"B"3EBKhX\l9Dcl  WU6 Ģ>H C׿Y"fꋕ,e6kzTHӗ[F*mlNi+B !L%zT:n$ hȢK |+qeqy`7W xJ+B.ڕ^6jSkXd].| C&`u;QZ2~HKRe^&a_.7E%)mt>l-ߕcft170Lj_<{m|jfSܩE\5ÍTwSU7u7edԭ蚋.]ƪf.=I 2'Ff3(^җ = C\SG -GEL5!bq** *DdD -EMyY3#"SPeeeARcouEczV 7I|b+6lUϠKtǺzF__d12|QD: BVPbJҺ4Rc2bP6S,'cU/BWh3Ԩy m8/JYc4U`4Sb|Lx\mNKKy\/bl׈@Կi4OVQ=D~UfHLK#t;5uی(m`XtQ=\(: ǂM C,?6(9bM!Kete1/VJm39D\:ǏlŴNӺFjZ~ENHqԗT-;PQiV| `JX¬Z!a%6F'1 4W -9 jݜ jdX[Z.8*wPt}ȣ?Gl -B@,~slNgp>qo0]K; SK0*o+RQsq)y(50sbc5p2!]{JcRUT4|rU;7?C`GOE(YR(Ќd? t`&+Fy`Dϫ;“2Tu{"IvWF.TЀ+k-3|( Y<qE 5Әa!Թn"X?1|rۓӕ gqmjt(04=/(vC6K;3Q)'a%HG;>!=N -t^ r"rƛ$Ƕ=APxΆmg?Qp=gLGDbVzFxlY GTWֱ57sew -|Ƹ M%u {RۨĨB`cg숔W&u]H}?A".vѫawS+s8.ul f/)bgu7Hp -g7Mot.62 BHZt6Sh`MvnBPHAfhgx7~#EQ]7 UCdʮ8S-|\"([ B֯h*[Tehܨz,c%PL m0<4ne0 B$7*%q<1+(Z&"xLiek+7)ny0̾T# -b{rS2/lR0HBR7`]Wܾ9fr|Lஞ-̣>eˢ,Bo'oP8 &EӮw7,uSRHG+X6@~,Y*Ɇ{YpA-hC GTEdP5 %םVTh~'&j% pbK},K -5:`2 Ԟ 2\YSEKE -Tob'6]gA`D_C$_%?B΅m$EIy -0#8(N -*QQ%bUrC/ԩT\7o &w ~;(i׹j Xv -?(IM7/EOrR¡.l2QWi͘ڡi$ls⽑ -2PbxK`e˔ql)3Cf\B2S_qH, ^*(?㗘%*?d{0@1mMu8&"N 5>aӳSVłOp۸+ʪ^&{嘶0n3bN]-"]K246%e; ,H0U"ElX1_qڮ-l(Ɉ}~GPndT-\bSr0/G s znSsAPR.4Pۚ|Q<ײA:aːa 09.-_2z=@Q-{U a4_ KE]M(u`N+wZ/W3>0jOv*˔BUc.e%Vr0;(ypFF%]%ԲTƢ¼pUq1, _T e%G@F.3r[0$ {n]\NI|.ek&~Y6{K+RQpVQ#e7~_bP#;Kj R\j.rKҟU$m:KRfus6ƻ1JD =OP˕T/1.1$W^vP"1b1ln=ʯ!HQ3*/6]ℱUP݄/CKIbTXI#A-hH) -VQ, ˀ-kv4kDC -] GUǥ~{|U1{-;X nI}J zn+ω|`o`}Y\WmB%xW+EVJ]Fu gLa(:IvΡ>Le|Z pJqsֵB:|\[䕝57, ֿK׺k|f7i"n*S``}2M2`U㻄haL -yjʼsL*j啧1Pp/M~P QP.+0-@ma4_*h'@XWZ<٪t4C/ZQ+5m~ją+6垟r^h2Kpo[̅"X60P>ph0 K. ""0|Kj,!7?Fqek v4'&2Rc -4bHeI#}_qBTK(U^EQajv -ܞ(Vy~Al9~ϷV.P*7VeBgCIYR!Q[V+S -G͵݋SW4rg7jT&0K@7)Q;t n`{,uZ]C,40,Ŗb* ܨF)Y狭b;Ġ|3KP~N ê]R:.__>b,=gˇVUx.%8b*o44>qLT&jj))U}KV_FT)6{&y+-C]**x -LRNvjk-b`ci -# XO#h[eH8q^g-ԔX_GZ -2 &z)SQ% -EXoD6|6$mծ[ط-JE:33XL5rZC!l U aDIbiUGo.{5D"+u4$ s5eW -]ʁ -A"5SXBSlضich$U eT\s 1|]DP8k,2̀SqU6 jfW:/5 -3G$F -uKYTr{`1%R3|T]SR?&&x c8#}N/5{ݒ(F%vxb@nel(M#)컠S9[R//5H,p]tK&*[DF*5 -R-}wtKjXPGj+4rp`7c)Ei6828|Cmzj5X,%Jx'W pm^*0GP`bj=q Cv2C_8j0OW=2_/"L e2pQm$c-n8Vї+"98v1طa89k~^-~eMUfLi!WU?uc1l-V(?C)>'wrP%H{e 32RYd⡫" VKh\ė+,%F1%T+tJ n'f F7:B*̝C=1 m֦ ]0cURk/ @6P1`DpuZNĪD! -E\u5;kP#7*a5|2ʞNM#\AotbO^i!F_qp%T,ጹiS<]: -NQ]F?$?j6:BbAƒ.Jk>zFݱ3ZzcYy S՚K_D~f,ȘUՆ,GPXE"i[UĘ41``U;ȑ;yjdjҡ,*&ZÀ-e(=` j)[u䴯6C$q&Y9] n#ۘ(Aev;nGMʪW1Q:[USw@&LycִTN.)ڸj>*5'e`* Y@|NZvz'Jnwh>00 KgzS_QVn}ϲSMÊ̹}MU4%d,XfbFU"_ar*; Җ1\A2FkYz8@;G̸mnQ2Y~+B@7S){!mVj^6 e"՟M\]ib1#Z iW(U.~aҷԭ+Ci1C>xic1d+Ŕׯ/V~1XZU/)ȁYeq}i!As` -[ZO -醙LN{%V(qBAo}4GNĻf ԥP9ѥ?mbCoU03a г,~T9vL9d]:%ip/`F( -R{;cU wzR "ή2_rWbA}F\ -A5BLQ/_@ČOv d Ǹ^"ΦIݱch5v;xL?&>56y2T"A5J:;cާA6EȨ6A Z KIg20pKIJ>%`wnTUVKJ.D(hA]KCZ.RAtG^~uծ=|LdI&f)mSn!aܮßo .u.7QCl3cFø1j,rq\l*&bBW%W/¦e%Q%qSS4,Lt -FT{#َ2b]vmor@"ȫW: X''pB5uU8\74"߶6!zKZU|JÅJډ/)[.xsPG|_ .-F}pax&cQ)lJXwPb/5+ 1*U<۹}~F&^c^0$&3#}j{mFMY -FވuޠR$n>IUAwXR~Jc\ܻvmv U|,.Nql<ľtWKBĉD K͏Kn7L` !J],A %.YT - e%}=T<\BڐUR5 -p^X,nϹxTdmLQJoܝz{ QMm8qsARܞܱ0[)\UjTڋn!sjUDOxBj\.[,uj6XZ:uv+utMERq7t5XuIXTjE<ӯv ^k+#Lvփ)^j-WV%eVAr (UW=quIk仵﹚Y\ pV %@dd]b%/I66v,0k{HyU}AzUkQJ[YڃieW t>:p{[}]c1^ -v`kWB %6U |ͪ{Zћ";OXy U%NAsjhUvK>>cD {r -Q|ƙF| M1Tˤ{KhK<ս P/ʭitpB/j% ¶Z^?t=qoNbF/uBnKXY{"k5pa>ݙ7]+z`@Wd2N SmS0=c_(i*iDPKTE>! {wR<.;yj oki.RʄhK)h{G@M[Bk/uY -ص%Vt.SjV=3ʱ4ui,2-+ڂXJBKS.Z,!Z|! 0f#u[]A]q9~Y'f3Jt<B .u5RB`XD[Y ܀qE&^<3%[_P!B&k-]0DdzhtP/0oV -"Va qFmD퍢~eͱZY#<y .Skj@eM0S9~"0%AGMav^٘^Xu{`mP ^e=Ю,$g,c+ٲljap`-Cicv#U# z*YCm&D>:q*i9z,5AWM'2;pG6 m P-}g 7ѕzؾբ hGEpʚTbjUT8|!Q7QHbnP5oQizͣ=be#:/⦳Ӫjm'ÿR:~pmK+o:R+k hT؂ T6`%8Vĕ-΃ՌJjFQ7Pe]'W5]y(ZL\nf4[_'tU*!y"MAL;n3 ->45t ~d@G'T[J'm]HbPT{T!o&,u)Y_.! QچL,x@RS#.aA-ڠ`ʴ,kӭz_i~AVc܌XHo,\ބ-G'#@bٲ'{jZ͍r|ڗ-Ae.lN@VWIQ4ԥG#OS5TLAaUSJ *M}uӅOLGlJ};[6pН63| 1˟2eT$cT*Pe#F`Չ) 8r09RTUsU ]m -o8ǝEdz?CP((yY.bʉP̨NNT8V\8nܫ5-j'MNcS)}qS+ƇI@;t[1wSC$#_A>xkE3oR2W/@FKN`o>.}dL1Y+2lJ.Wsm-eW>\)%~qA)vJj0I5. bʞlRGAC+3_3.\Ե,D*Z< m/<0Ca'HLS)6U~;VKl #-\]|n-X v"(vy0WT>w%S]S+B op6.HQAw۟آב9PE0n諉& \TmmQ -5PXt*Nf3>E[nu-55beu^un5dJe6X\0.V`ɼPa ~eBg4.t5mDRk9ӳi! XdG(6;Ԡ86Q1/>q7VD%ѦYڑ{+52TlV`R5)o3=\=S40m(ݣړXTR.)e̊0/_ɐf KlE"\~>nMp<~)^E{+iiaG,Vп/jFg}7ݟ}k/#",uD3@kbJa!OFQLe; ^["7*5Y?^hԗI677jXQng?CG vhZs20ۂ&䦫NI&L&*wںd &j }Z/T|qb" UHPفBn -^@+H-?p?2cZ+eCWfatD\~Z’K-σD+]%Bv$Gn@W Pň(MY۴fc&.WEe0 ,g`(@JטO6^(s0dR*@baD.^ `rK|f!\cCxe^rG'Co!FjYBQ -%(eQT!w3W+rī/|7w/-EX{>Sؤ~ D'MQ#c##T>;&-ޡiS`GwΜں2ݺi `V!UD!s ֿe.]3rOS73 2L]J-L̬Øtod*OaS#]t5}A -L_u4UW2#i20tw<26P*j H}r"ISLh{1!~e\YeVn_jFF8̵q M堪B(\R0H4.ZDΐ -}2#v?)eb$fUFTRڎ>0 -})VcjjzigN'3c, - b3>v肎P_P@=qs,F0j^vd(mXREeuc;e GR\EBaaڸy⦄~ ,*A5SA6*Ҵ{QbA[Vuࠛo,ٗJB .$+~dU5lt3j27Rm_QnՇ4*pRkEc1|'Lۗ0! --(PBWE -ϦaY+'$пP>H-TPcܤʫs|u'D×|QE@E)8X3?yEB7c>ޟ!޼eiU0*,S-3{!nSur y:5߹J'uԶ^ -l01Yn/DorDbo;p![./N(=Coe -`DMF=7N]UO[F\n.mAtp bU`?1*rC &+ٹqlWQ:L!sU*R8#~"4tMN^hU~N~+rZ\GuMFTQ֥l2|5a}(AfPE{(VbD57sl #8w&Yn; ܤyfpFr\Q|ܮQD(vxW|$. -*VLICwWYីHb7G 1YU.\r a u76 X0ߨQ$[2tJ#3UWaR+PmCc$:c rI'-wEQ"PKʼn -2ڪFRsUDO먓4`הusT΅bcVo!Wc"R.l^eu}Y;?^A+mꊊ6!?ǢcM`We/HleO&hZ}DA}u,E1{&n6V&!UEJȵXw+ٿmBu۱FJ'j8a-[UjYD?*e=@_?ԣߨmw8eY򄔔Fv7kV\A"S l([u2 -eB4K3,뵺TYj0_ A^ -(Ձ<2kim\RS[%.]yUk]k if$'w *D0{d0fP꭪hqD'{5x!Ȯ1>n~ I'T?"r?eH%+bCl gan]Į]p"W 𒹹dO<U^$=D >-ڈ!t9JP+PY^r@?UBS0;$%fgp1kULJ\.1jxcG90.xE% T;Ĩ.p_]ӱ, -K7WĶ^fUIqa3w0( -L /L-`JXH^&"Q4*!-˨Wr㰏"qpa W -%Ws/wPJ 1?qxIVK×9$&,!/qVf$;& ELXVQвLuFLKY}FkhU| -?USt;3`|Ӂ \"#R/GweLf1u27xteJc GFkKvTԬg0䘩Y8!h!-B.Wʝ:uf7Ejf`ˊY]EA#^b4 8bA710D(drJ~̾ lB1|X]pH/OkETZYe+ }H*^A;ZVqar1/&%g*jwg'5ƽ'Rog2ƪ0V&#]b!{.WsbuAGB_ ʌW%ø8U٣O\Km/*NC˶"zֈ˽˸g2RᴈC,,{_4$_\A tԩȬL%U:°KĻ suvC.GI{SQ)o![m)4^ yR:ͫtk}ؔip (r_l}}ZC(G[XX/DHK(z!) -!Z=L-`?.\,EeVe(RŽ!.̎M*(j_2ܰנ֧lԚD8[2Uei4^pW߅Vt=1`4@qVĥP FɏQp&棓J -#z445?Ҕ@.ʥiI"HOpQ#zPħʽu"`Ca=0WJhZx@kLWs~?1L!r޸$۳FjQ!ih_>sfVi:ջW:oKz.mPKP*v0W-++e'DaT,>j.[UWrmc~蒋J[fn9!(_ˉ #LV4̊lh֍^( 5d@.պ]Tpm\|闸ZԨu{u͟KQZѩᜍa%C+"gZ~ - # o#Mjv˗BS+حaJ(+dK`B=XRڶ"4Ьb Bn2vՆJ偈JOƸRCMT*<d WY/#UF#T)pf J ,Op豤?KE/ΕOkr?nzŒsfs>'dS%ƚfIl2놐{GoiXz8Pp*40%M?/T KԨxH5Sn3T^TĴWd%+'7-nY$8Tn5>fvK>5qyIJmK>!\)A+ )L^51Pxɺ9([k$_ N^FQ*@m)hY.dwSRmX7 6Clo`[#.,[mn8k" jrLxF$c?J R$5Q͆X{!z./OE:0zB%baؾM7l12#L&7)^ 2r0ZDk?ě, %eZ@Ngv#oeV1'_CqGC+?u7_IU_Ub],.gqMZ11p݌#_ݟTbe^zR>b 2B[Gl66Ew(|C.V}FU=]PڱruߘN7n/L(V -!Vg>TzYvr|1Wm12,>-U56H"UoF.9HhvTUԼݩE^}7(mkxQ|C_7R-ﰫef|]Y}ܺv1~^%?]'qùw SX&Fؚ`pjڰnN EQ*Q6 L A?` !@ BkҶ7hV$麀%W>d>LMNz qu`Mxsd$rjtԎ,0 7ڞRBtLdٯH-OP̎ܗCm*-R>y}wQģcu=!6K]`E am>VtCfoV1q۝O~e| N@syFjLWm }Kؿ18/YD╜CHo$܎FQt$Dl̃!wƗAaڋ/t؅ylw'@fb,4 1h6La?\ugY!F}Y6%QkWU {_7yV?'FP;-`p -"DR37,I'oH:T1UQ1b@kT5F'kG'J#2\gnq/g\= gzUH枵Ճ.(xN׋ՐKujSXԨLu^7- LZNDmWF+n%.Z*O]PG{ :"{Wԩ\wɮ1Z***ZAM2ɩv*.e:kc,_s8̊&mfuE >S9A',u]c=CL.㏘%C7`0./ < XQ.YW O~|:mXK2 @2ʇ%F\Xn LjhU0#reG]Jx7ѧ>GEmļ`%,}S<2Êpu\{ԨK0PO88dcS|Σ/pD c(ѿOϻn̅Te>h[<M^Fwh9Ba@(&$i?L^RT1t2>*%[,N#_g MMƽ^իA+ kWY <7DyAb -&]UQH_mǵ̒~,J) F6JMtLtU- F`3H1} \>db@BҰ҉"ms =N+HMǰOY v&-z{qe޼ml1T+C[z`Sքއ2&ۦEQlBڪY Ah({_ uA\s&d)UkB;ɥCCBڌ2zE~kڧCVWƀȲQWbnbiH\)ZH$7&Sb7} CށKB/p.ނba2VfBEV --rbD"stƢZV_s=C9Oʀ+i$gsyO d^Vŀht\n&"@"`vySMU(dƃ3}elcY>a~jH\}CTA7'jou6FW#k$ll(a -[KU ~ȪA$<;{*Q)ϛI  ˍ]FT/ -*yV --XUQKvv:Z g|RJC djThif5`3sɳk 7mCUFa+ -[tWԩl.6Yp=KYvWޝ_•Nb K5eE)*JmRBm{g2YEG,2v[B&0%Qpr]7tpDlG_&F&Mf JJt,1H(F Ţov%z\/Pm1+R+a٢ ` -~u T8hfʙP*69>s~]i:F%ǵ÷OFb" ڨA, j8ʖ lb+!:]"U@ZCkjHs:1dvf -h,Ic UJ0ʉ^PGQ1L'`&$(fN22[eX&!PPXA.~L~zl1p&Q E֬"cٔ0Yu$R#P \q|2w -ƌ֠)an01b2jwlbQo*MB",K!>"G#!us*Zs4߹MrQV.}3q)JP*5Uu݆J )kijɳ|8-/ E=FJuG -ȮL -- @I]@l65k/  h_,qlRvrX|*W_w@ee4W(})?JĢV[Q<@AX~ ) O^jWZQF}XmKrB$3)!n:I]ѯld?j6=ɳwbKڜ=*wdlvIQNT\ ?+π<Ib."') 4EbuJ Wz*hKXQ0C±*zaMbZ0(hmf2 RjO% =lj \!9Ii$w1i@L-QR0Fb\ k0}<{]|rDz˟wY7>wu;4r 0Od\Vfd&hH.Y]¡X \E2NRQGu/R J􌧳}oq:@R*a F0-V#w}AI?}S1ᐆ^C#bձaX07OįPNkkaQ FY*%ψsu)SJ+RE -<ŽhY*m" ЅZ#! ԸࡅKŤ;c IKll} p>aDvP筎rAFɘR\[,UA\%B^%"Zp]̢zd6(PKmArቤI\/9θjnw+Ufopg\Ys5".>R9eYRKvA"*6$j}D9#'DWȓ3:5XH?/P]!55TQߜ`jG{ w4qsbsZ-׍v@gV*ZFG ,1E[ܿ3 Z)BW K%U mD# CUlݳ³ 4b+VUQIҘP'@8-w6`5 -63 >$L*V?YTdY+=?mM<<+{k)nq -06ʑaiRIJ05[!7q0hZ.9T&jKaCWY1T0Y*j*.D0\R=j쀻rk E9'uPljC*]} Op70reݫSzңª[ -W2>T`IO -J\{ Iw$7t00\=&MKJ8G8 KETi8R*S׊c5 X|̕:`QbTwBKxAq.sZ6LN"% -'cDټ4ODKCl2;2)1*y2 -0hs4 -/YSL(#ŐRc"=|d̺[A'Ɯ~ -6udMfjWqܬ/`e< rH۹$.HX!Lx wU/D6AL@5 -R&7 J}AbQ/̾R]#/+h<˱CFv\R]$ًo¦K_ -yΥ7< gA 0p]jVD>N jΓ{n$ѵ-8 hTJ> x)lPV(* O ŲfqgqRSoRue7 -ĮKՋL}LXTуЭHcuV()݋4Na5 Գfbu,KU_ŏ[mXl d+*]E|\q D:Q_/&_PK4F|ʌ+ZHvwqn;e,&`~5)w5J8 L\de2ɊpD:Pklnƈ J ڀR;[@*(XgK*,fP=y_")~N  x Ӹmhmߩ5_$z!G\gRE/!Fu ZRܼnQW%sVS_Q%WPyCcՎíF? {w," -L_ -ʃ`.p1P_bb< @.zU@0n%1젿LdEaXE&+F5?X>1ԄWqL2gn@E A*7$ԇЃ8i/<:#K.'v o \eޣ711:#mAmX} -خ5XAՕE.h%RkK:LCpba}@*> :Z!?C{g.( xT iyK!"+E36PC#r LJ5d\ESQ7"-G@YMUh Rd[W ̱="y#b7P,FUn! -vl=XSl.dIBOLd{0 [GUZ@*F6JtCdvݱ]A(!~ݝP2"=S6VB* EnkOpnqbx ٕ>);_/Dy#\UbT7V$jZ) )`{(_Ņ*=v@@ѿE+'eWtBDiE٪O >%Ñ7SWl زj4u&HVaU|rU x$svb:7ewuzwI7]~ohۨYAӵڌ * -?lrWwMP(h+~NܳP(g7Լ/lAï#0c۟c -.ԁi]LAKīal#?d!IA|2t'e*6 a>tHUHIQ$#Kx`XEF!_}k2lro[;Z]oL y<r)1z UVi,3mRNCZUyW60tV؛IwduRqedsPIvKܑ6ynA/T'r]zGP_-6=CרYx.c)].daJYZޡ2z8eƗYYX~ -(>Qڭl-A[|B rCh;#?L\z'>o. _4߮4jp؊!:W,C)`a޶%m*jнYZ=c@tL<yYc0CBZ J[NpiK}0ڥdXn:x!;ahU`n9FR Z N?2 6M6 )|Ԫ>JJT8j%-FДt&*ѨG+wQڞ9ɇ r'_<_^.<8p RUTMQ+ECQ+E\0J -om~"R%5N]s2wƧq EcAX9aAoYC0612cmC}ݎn6KkⰗ~`A\n2n=EۃsS2ڥ1&%QClbܧsRr:|^{s0a8c.\&^#cdT5 p%u(gp!/|xH&_J̘g{3a&;SGȵꙪ}$zyK$ b}KBdiV/ >  R2uB?=X/)Q@J@!PSϵᗈe+6NJ \/FV/wPB|D}%WKI)+ ހ PzJLCmjCgcwnયPDFϴP%z>*.6U8۲bck<"w/̗yWUQu93ac0 wV萔'smR?0zdWClq!(ۺjvmY_0U4J -6(?j-|*=V}՛A>'9/ ^KUfUS?fo[wZm"C]hIʐDFTڻW̅j&C5͗zgT# M"{.Qഺ/RP5悅1zo5|EnjBoen|hW,'?ĄΚ];D|j E'"e*-Z߽>D t첋L 2[/V6̀r `hU8YJ-ٷgO^DR~"TWJ=t1E }͋+0χG΁o4_|(uXu\;_hD8K2zQQ cl1;fSډPx;>0-XE)'ux9/;f͚mYOE1΋^y_,RDcǯ - Y22i1:̛O!(.@yPi̼RDn_CU_S(p~y"[EѤC)Nd=7&hJ#w(Zp]>|J!`@p 0P! ?#Q3?,/{V{-ЌM ̬1b~gVybhDFfΉqzǶћ Ll!O7m{G#Ge37:<{:i71G<ߵM[{vR<QF9m!:38<.D>/}fu: >Gdr" F;Y3VpA>#m"# ">FL3}yVܖ^#338933x$y2`jag! IѤFv#ffy(ϙLH/pFp43Fu# ~8GlRg˂3:>m:.6ς|ngNPRDu}g$#I p ?6t.-0C NJ -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000013534 00000 n -0000440843 00000 n -0000440974 00000 n -0000441172 00000 n -trailer -<> -startxref -441309 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/eb201b06-97e4-4c10-8a37-a297e3a4767d.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/eb201b06-97e4-4c10-8a37-a297e3a4767d.pdf deleted file mode 100644 index cc1c8c2..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/eb201b06-97e4-4c10-8a37-a297e3a4767d.pdf +++ /dev/null @@ -1,2552 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 0.0000 -792.0000 206.0116 0.0000 0.0000 792.0000 cm /Im0 Do Q q 0.1908 0.0000 0.0000 0.1908 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -35.283 0 0 46.25 1.82 3642 Tm -(Di:83460 ) Tj -28.1725 0 0 47.5 -1.15 3591 Tm -(P.ROIOR:ARIAN ) Tj -21.5449 0 0 47.5 210.95 3591 Tm -(VMLENTIN ) Tj -21.0402 0 0 47.5 350.97 3591 Tm -(UNGIREANU ) Tj -15.9575 0 0 46.25 0.81 3538 Tm -(-R ) Tj -23.1347 0 0 46.25 31.89 3538 Tm -(PO: ) Tj -35.9232 0 0 46.25 75.08 3538 Tm -(:C3S-C12 ) Tj -31.9778 0 0 51.25 0.81 3432 Tm -(LENI ) Tj -33.9707 0 0 51.25 88.64 3432 Tm -(C.U.1./C.LF.:RO1879856 ) Tj -21.4526 0 0 45 18.6 1993 Tm -(SUBTOIAL ) Tj -43.7464 0 0 52.5 3.93 3317 Tm -(UH: ) Tj -26.2254 0 0 52.5 93.51 3317 Tm -(SPAARE ) Tj -27.8232 0 0 52.5 202.87 3317 Tm -(PRBRIZE ) Tj -32.0602 0 0 52.5 325.81 3317 Tm -(ESTIVLP ) Tj -32.7778 0 0 65 17.8 3255 Tm -(E18:2X03-) Tj -26.5243 0 0 65 161.68 3255 Tm -(\(62507 ) Tj -34.6887 0 0 65 245.56 3255 Tm -(6-261550117 ) Tj -46.9609 0 0 47.5 10.89 3207 Tm -(AT: ) Tj -30.6398 0 0 47.5 103.78 3207 Tm -(I6 ) Tj -30.2736 0 0 47.5 140.82 3207 Tm -(ENIC ) Tj -22.6023 0 0 47.5 220.89 3207 Tm -(MRFUYATA ) Tj -21.0127 0 0 47.5 357.09 3207 Tm -(NARINO ) Tj -0 Tc -53.75 0 0 53.75 11.8 3150 Tm -(Z ) Tj --0.035 Tc -31.9656 0 0 53.75 41.66 3150 Tm -(00:7E3 ) Tj -28.8709 0 0 53.75 143.63 3150 Tm -(6422 ) Tj -31.364 0 0 53.75 199.66 3150 Tm -(76061637 ) Tj -45.6565 0 0 51.25 11.9 3102 Tm -(AT: ) Tj -23.8736 0 0 51.25 107.83 3102 Tm -(IG ) Tj -22.4127 0 0 51.25 141.87 3102 Tm -(ENICA ) Tj -20.8675 0 0 51.25 221.9 3102 Tm -(PARFUYATA ) Tj -19.6462 0 0 51.25 357.91 3102 Tm -(MARINO ) Tj -0 Tc -47.5 0 0 47.5 11.82 3047 Tm -(Z ) Tj --0.035 Tc -26.8469 0 0 47.5 40.87 3047 Tm -(H00:763 ) Tj -27.8016 0 0 47.5 143.65 3047 Tm -(6422 ) Tj -24.9965 0 0 47.5 201.73 3047 Tm -(763061 ) Tj -25.6155 0 0 47.5 277.67 3047 Tm -(637 ) Tj -0 Tc -47.5 0 0 47.5 11.77 3001 Tm -(P ) Tj --0.035 Tc -23.5179 0 0 47.5 40.95 3001 Tm -(AY ) Tj -22.9691 0 0 47.5 88.95 3001 Tm -(AIRCO, ) Tj -23.0586 0 0 47.5 183.76 3001 Tm -(CRATATOR ) Tj -19.2489 0 0 47.5 317.96 3001 Tm -(AER ) Tj -20.9591 0 0 47.5 371.78 3001 Tm -(CONDIT ) Tj -42.343 0 0 53.75 27.84 2950 Tm -(Z0 ) Tj -27.7502 0 0 53.75 95.65 2950 Tm -(697 ) Tj -30.7535 0 0 53.75 142.56 2950 Tm -(54|1 ) Tj -27.4792 0 0 53.75 200.04 2950 Tm -(183170704 ) Tj -28.683 0 0 48.75 41.83 2895 Tm -(ED. ) Tj -21.8521 0 0 48.75 89.77 2895 Tm -(CERE ) Tj -29.0073 0 0 48.75 170.59 2895 Tm -(58 ) Tj -25.7833 0 0 51.25 11.87 2849 Tm -(RJNOTIE ) Tj -23.516 0 0 51.25 163.89 2849 Tm -(BRI ) Tj -0 Tc -51.25 0 0 51.25 219.89 2849 Tm -(X ) Tj --0.035 Tc -23.0785 0 0 51.25 237.89 2849 Tm -(FEST ) Tj -19.9163 0 0 51.25 304.63 2849 Tm -(SOUCA ) Tj -32.3819 0 0 45 12.84 2799 Tm -(PAY ) Tj -25.1525 0 0 45 89.53 2799 Tm -(SILICON ) Tj -35.8912 0 0 45 198.57 2799 Tm -(300 ) Tj -23.5477 0 0 45 265.95 2799 Tm -(ANTISTATIC ) Tj -23.516 0 0 45 412.75 2799 Tm -(CIR ) Tj -0 Tc -52.5 0 0 52.5 31.68 2746 Tm -(E ) Tj --0.035 Tc -28.5987 0 0 52.5 44.67 2746 Tm -(900:018 ) Tj -30.7671 0 0 52.5 144.61 2746 Tm -(642689018499 ) Tj -42.0273 0 0 102.5001 21.94 1845 Tm -(UA ) Tj -22.1702 0 0 102.5001 91.87 1845 Tm -(LE ) Tj -28.7803 0 0 51.25 304.87 3943 Tm -(FIV\311-HILDIG ) Tj -28.0753 0 0 51.25 481.48 3943 Tm -(S.A. ) Tj -18.6536 0 0 47.5 223.96 3893 Tm -(AUD. ) Tj -21.362 0 0 47.5 290.77 3893 Tm -(COMSTANTA, ) Tj -17.8322 0 0 47.5 441.92 3893 Tm -(MUN. ) Tj -20.6943 0 0 47.5 509.78 3893 Tm -(CONSTANTA ) Tj -24.1963 0 0 43.75 291.55 3846 Tm -(STR. ) Tj -21.3258 0 0 43.75 363.74 3846 Tm -(\(ON ) Tj -20.3049 0 0 43.75 413.9 3846 Tm -(RONTA ) Tj -21.0452 0 0 43.75 496.09 3846 Tm -(NR. ) Tj -0 Tc -43.75 0 0 43.75 550.47 3846 Tm -(3 ) Tj --0.035 Tc -20.266 0 0 52.5 188.76 3796 Tm -(3INE ) Tj -23.9116 0 0 52.5 256.95 3796 Tm -(ATI ) Tj -24.87 0 0 52.5 305.94 3796 Tm -(VENII ) Tj -19.8947 0 0 52.5 391.86 3796 Tm -(IN ) Tj -22.1501 0 0 52.5 428.89 3796 Tm -(MIGAZINUL ) Tj -21.7888 0 0 52.5 565.9 3796 Tm -(BRICK ) Tj -28.7323 0 0 46.25 319.69 3745 Tm -(CIF: ) Tj -26.8208 0 0 46.25 387.87 3745 Tm -(RO10562600 ) Tj -21.21 0 0 45 13.67 2699 Tm -($P ) Tj -15.704 0 0 45 42.92 2699 Tm -(RAY ) Tj -20.5019 0 0 45 90.78 2699 Tm -(CL ) Tj -20.9445 0 0 45 131.61 2699 Tm -(SFUNA ) Tj -21.7017 0 0 45 212.95 2699 Tm -(ACTIVA ) Tj -20.5647 0 0 45 306.9 2699 Tm -(PENTRU ) Tj -18.8722 0 0 45 400.8 2699 Tm -(CURA ) Tj -33.9509 0 0 53.75 14.8 2639 Tm -(E18:2\242051 ) Tj -29.6673 0 0 53.75 185.58 2639 Tm -(52354 ) Tj -28.4045 0 0 53.75 254.64 2639 Tm -(6426489007929 ) Tj -39.4395 0 0 51.25 16.27 2590 Tm -(SA1 ) Tj -26.665 0 0 51.25 98.84 2590 Tm -(ENAJ ) Tj -32.5934 0 0 51.25 160.79 2590 Tm -(240. ) Tj -22.5813 0 0 51.25 227.87 2590 Tm -(ECOFRIEND ) Tj -32.8392 0 0 43.75 12.81 2544 Tm -(LZI0210162112 ) Tj -28.7846 0 0 43.75 228.48 2544 Tm -(8646809520908 ) Tj -33.1906 0 0 43.75 12.38 2495 Tm -(SAI ) Tj -28.3853 0 0 43.75 80.83 2495 Tm -(EAAJ ) Tj -21.0881 0 0 43.75 160.88 2495 Tm -(EXTRA ) Tj -25.9464 0 0 43.75 242.69 2495 Tm -(35L ) Tj -25.7198 0 0 43.75 296.64 2495 Tm -(508UC/SET ) Tj -27.6479 0 0 43.75 430.65 2495 Tm -(60 ) Tj -36.8407 0 0 41.25 10.86 2449 Tm -(ZI ) Tj -30.0217 0 0 41.25 49.68 2449 Tm -(02:1\2540021033182 ) Tj -28.0599 0 0 41.25 269.64 2449 Tm -(642276E020146 ) Tj -34.5182 0 0 51.25 9.36 2398 Tm -(SAI ) Tj -26.665 0 0 51.25 97.84 2398 Tm -(ENAJ ) Tj -21.0881 0 0 51.25 159.88 2398 Tm -(EXTRA ) Tj -26.6117 0 0 51.25 241.68 2398 Tm -(35L ) Tj -25.9359 0 0 51.25 296.63 2398 Tm -(508UC/SET ) Tj -25.5211 0 0 51.25 431.68 2398 Tm -(60 ) Tj -33.3391 0 0 57.5 10.88 2348 Tm -(ZI0221e082183102 ) Tj -28.0742 0 0 57.5 269.64 2348 Tm -(6402768028146 ) Tj -32.8904 0 0 61.25 11.39 2295 Tm -(SA:1 ) Tj -27.0066 0 0 61.25 80.96 2295 Tm -(UFER ) Tj -24.0942 0 0 61.25 170.75 2295 Tm -(OPTIN ) Tj -29.7118 0 0 61.25 256.64 2295 Tm -(35L\(15\) ) Tj -21.2168 0 0 61.25 365.96 2295 Tm -(ALBASTR ) Tj -32.3836 0 0 47.5 14.8 2247 Tm -(2:8210113106 ) Tj -28.0742 0 0 47.5 207.69 2247 Tm -(7290014006522 ) Tj -25.9154 0 0 47.5 15.85 2196 Tm -(LAAL ) Tj -22.2339 0 0 47.5 94.76 2196 Tm -(CFBLU ) Tj -22.8748 0 0 47.5 176.89 2196 Tm -(PUS ) Tj -18.7772 0 0 47.5 231.8 2196 Tm -(CU ) Tj -22.3278 0 0 47.5 271.95 2196 Tm -(ADEZIV ) Tj -19.7692 0 0 47.5 365.96 2196 Tm -(ALB ) Tj -24.6743 0 0 47.5 418.14 2196 Tm -(12X ) Tj -31.6492 0 0 56.25 10.81 2143 Tm -(EL/90:488 ) Tj -29.9402 0 0 56.25 151.62 2143 Tm -(6699 ) Tj -26.6369 0 0 56.25 213.88 2143 Tm -(490919743 ) Tj -22.1976 0 0 56.25 9.89 2093 Tm -(PUNGA ) Tj -19.133 0 0 56.25 96.91 2093 Tm -(MESTERLUL ) Tj -21.0926 0 0 56.25 218.78 2093 Tm -(CHSTOR ) Tj -23.8151 0 0 56.25 311.72 2093 Tm -(30X65CH ) Tj -21.6093 0 0 56.25 417.9 2093 Tm -(BRI ) Tj -31.4072 0 0 43.75 19.89 2051 Tm -(Z960:950 ) Tj -27.3474 0 0 43.75 149.84 2051 Tm -(EKI09022318 ) Tj -28.3496 0 0 42.5 12.83 1693 Tm -(EST ) Tj -37.7998 0 0 53.75 7.72 961 Tm -(ID ) Tj -31.0173 0 0 53.75 47.85 961 Tm -(B/: ) Tj -31.7444 0 0 56.25 9.89 1589 Tm -(10A. ) Tj -20.8382 0 0 56.25 85.82 1589 Tm -(TUA ) Tj -31.2455 0 0 56.25 139.93 1589 Tm -(AI-) Tj -21.2817 0 0 56.25 194.26 1589 Tm -(19% ) Tj -39.8436 0 0 45 10.57 1540 Tm -(0A. ) Tj -21.3464 0 0 45 80.81 1540 Tm -(TUA ) Tj -20.8001 0 0 45 132.88 1540 Tm -(EON ) Tj -0 Tc -58.75 0 0 58.75 19.7 1485 Tm -(R ) Tj --0.035 Tc -58.2617 0 0 58.75 28.71 1485 Tm -(PZ ) Tj -31.4416 0 0 58.75 114.85 1485 Tm -(M1. ) Tj -36.8051 0 0 58.75 174.73 1485 Tm -(IN ) Tj -22.5624 0 0 58.75 224.89 1485 Tm -(BON: ) Tj -36.4314 0 0 46.25 10.99 862 Tm -(/4:0:4700110\)7 ) Tj -27.1121 0 0 55 326.71 1151 Tm -(CKPOS-CT2183460 ) Tj -0 Tc -56.25 0 0 56.25 607.03 3270 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 56.25 622.9 3270 Tm -(BUC ) Tj -0 Tc -56.25 0 0 56.25 676.88 3270 Tm -(X ) Tj --0.035 Tc -30.7249 0 0 56.25 703.64 3270 Tm -(9.01= ) Tj -30.8624 0 0 56.25 784.64 3270 Tm -(9.01 ) Tj -0 Tc -56.25 0 0 56.25 852.87 3270 Tm -(A ) Tj --0.035 Tc -19.3223 0 0 47.5 364.91 758 Tm -(BON ) Tj -23.0709 0 0 47.5 417.89 758 Tm -(FISCAL ) Tj -0 Tc -46.25 0 0 46.25 288.73 711 Tm -(L ) Tj --0.035 Tc -28.3256 0 0 46.25 359.67 711 Tm -(9000221498 ) Tj -0 Tc -46.25 0 0 46.25 586.38 3176 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 46.25 596.56 3176 Tm -(SET ) Tj -0 Tc -46.25 0 0 46.25 650.9 3176 Tm -(X ) Tj --0.035 Tc -28.8653 0 0 46.25 677.99 3176 Tm -(16. ) Tj -25.3634 0 0 46.25 718.64 3176 Tm -(50= ) Tj -32.3752 0 0 46.25 772.87 3176 Tm -(16.50 ) Tj -0 Tc -46.25 0 0 46.25 853.9 3176 Tm -(A ) Tj -50 0 0 50 584.25 3075 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 50 597.56 3075 Tm -(SET ) Tj -0 Tc -50 0 0 50 651.9 3075 Tm -(X ) Tj --0.035 Tc -33.7631 0 0 50 678.82 3075 Tm -(16.50: ) Tj -32.3752 0 0 50 773.87 3075 Tm -(16.50 ) Tj -0 Tc -50 0 0 50 854.89 3075 Tm -(A ) Tj -52.5 0 0 52.5 579.16 2969 Tm -(1 ) Tj --0.035 Tc -21.912 0 0 52.5 597.9 2969 Tm -(BUC ) Tj -0 Tc -52.5 0 0 52.5 651.89 2969 Tm -(X ) Tj --0.035 Tc -35.0049 0 0 52.5 678.58 2969 Tm -(38.16-) Tj -33.7659 0 0 52.5 772.59 2969 Tm -(38.16 ) Tj -0 Tc -52.5 0 0 52.5 854.88 2969 Tm -(A ) Tj --0.035 Tc -31.7874 0 0 46.25 776.62 2916 Tm -(-1.91 ) Tj -0 Tc -46.25 0 0 46.25 856.9 2916 Tm -(A ) Tj -48.75 0 0 48.75 586.29 2763 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 48.75 599.9 2763 Tm -(BUC ) Tj -0 Tc -48.75 0 0 48.75 653.9 2763 Tm -(X ) Tj --0.035 Tc -29.2827 0 0 48.75 679.82 2763 Tm -(25. ) Tj -25.8258 0 0 48.75 720.73 2763 Tm -(07= ) Tj -32.0406 0 0 48.75 774.8 2763 Tm -(25.07 ) Tj -0 Tc -48.75 0 0 48.75 855.89 2763 Tm -(A ) Tj -46.25 0 0 46.25 584.38 2663 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 46.25 599.9 2663 Tm -(BUC ) Tj -0 Tc -46.25 0 0 46.25 653.9 2663 Tm -(X ) Tj --0.035 Tc -34.2379 0 0 46.25 679.8 2663 Tm -(14.99-) Tj -32.8658 0 0 46.25 774.85 2663 Tm -(14.99 ) Tj -0 Tc -46.25 0 0 46.25 855.9 2663 Tm -(A ) Tj -50 0 0 50 562.25 2557 Tm -(1 ) Tj --0.035 Tc -19.9028 0 0 50 588.9 2557 Tm -(ROLA ) Tj -0 Tc -50 0 0 50 654.9 2557 Tm -(X ) Tj --0.035 Tc -34.2776 0 0 50 683.8 2557 Tm -(10, ) Tj -26.7305 0 0 50 723.07 2557 Tm -(15= ) Tj -31.8847 0 0 50 774.88 2557 Tm -(10,15 ) Tj -0 Tc -50 0 0 50 855.89 2557 Tm -(A ) Tj -43.75 0 0 43.75 610.47 2458 Tm -(1 ) Tj --0.035 Tc -19.1969 0 0 43.75 628.91 2458 Tm -(BIJC ) Tj -0 Tc -43.75 0 0 43.75 681.91 2458 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 43.75 708.54 2458 Tm -(5.53-) Tj -31.6613 0 0 43.75 788.55 2458 Tm -(5.53 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2458 Tm -(A ) Tj --0.035 Tc -22.0252 0 0 50 616.8 2356 Tm -(TBUC ) Tj -0 Tc -50 0 0 50 690.9 2356 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 50 710.54 2356 Tm -(5.53-) Tj -28.5573 0 0 50 794.6 2356 Tm -(5.53 ) Tj -0 Tc -50 0 0 50 858.89 2356 Tm -(A ) Tj -52.5 0 0 52.5 614.16 2249 Tm -(1 ) Tj --0.035 Tc -21.0765 0 0 52.5 629.9 2249 Tm -(BLC ) Tj -0 Tc -52.5 0 0 52.5 682.89 2249 Tm -(X ) Tj --0.035 Tc -39.7318 0 0 52.5 709.43 2249 Tm -(5.94 ) Tj -32.9029 0 0 52.5 789.53 2249 Tm -(5,94 ) Tj -0 Tc -52.5 0 0 52.5 857.88 2249 Tm -(A ) Tj -43.75 0 0 43.75 589.8 2157 Tm -(4 ) Tj --0.035 Tc -18.8722 0 0 43.75 615.91 2157 Tm -(BARA ) Tj -0 Tc -43.75 0 0 43.75 680.91 2157 Tm -(X ) Tj --0.035 Tc -33.1889 0 0 43.75 707.79 2157 Tm -(2.24: ) Tj -31.6791 0 0 43.75 787.43 2157 Tm -(8.96 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2157 Tm -(A ) Tj -51.25 0 0 51.25 610.2 2050 Tm -(1 ) Tj --0.035 Tc -19.8736 0 0 51.25 628.91 2050 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 681.89 2050 Tm -(X ) Tj --0.035 Tc -30.213 0 0 51.25 708.68 2050 Tm -(0.72= ) Tj -32.6476 0 0 51.25 789.65 2050 Tm -(0.72 ) Tj -0 Tc -51.25 0 0 51.25 857.88 2050 Tm -(A ) Tj -52.5 0 0 52.5 215.88 658 Tm -(A ) Tj --0.035 Tc -19.0521 0 0 52.5 230.91 658 Tm -(RUGAH ) Tj -20.6877 0 0 52.5 310.62 658 Tm -(SA ) Tj -25.2082 0 0 52.5 350.88 658 Tm -(PESIRATI ) Tj -19.8147 0 0 52.5 470.91 658 Tm -(BONUL ) Tj -20.3024 0 0 52.5 549.91 658 Tm -(FISCAL ) Tj -19.4211 0 0 47.5 148.95 613 Tm -(VOCEA ) Tj -23.7876 0 0 47.5 228.75 613 Tm -(CLIENTULUI: ) Tj -33.6288 0 0 47.5 388.64 613 Tm -(0808 ) Tj -21.6271 0 0 47.5 468.9 613 Tm -(BiRICK; ) Tj -26.8317 0 0 47.5 562.72 613 Tm -(OBO032745 ) Tj -31.5442 0 0 51.25 162.72 556 Tm -(TIPRIT ) Tj -23.0709 0 0 51.25 268.89 556 Tm -(DIN ) Tj -22.3564 0 0 51.25 321.76 556 Tm -(COGITO ) Tj -22.2966 0 0 51.25 415.87 556 Tm -(ERP ) Tj -19.5136 0 0 51.25 468.93 556 Tm -(WWI. ) Tj -21.1535 0 0 51.25 521.78 556 Tm -(COGI ) Tj -24.7121 0 0 51.25 575.78 556 Tm -(TO-ERP. ) Tj -18.6521 0 0 51.25 668.81 556 Tm -(GO ) Tj -31.1552 0 0 42.5 788.91 2006 Tm -(155.15 ) Tj -34.7994 0 0 42.5 790.78 1748 Tm -(15i. ) Tj -31.334 0 0 42.5 844.9 1748 Tm -(15 ) Tj -32.0316 0 0 42.5 819.66 1697 Tm -(0.09 ) Tj -32.5188 0 0 43.75 806.8 1593 Tm -(24.77 ) Tj -31.5624 0 0 43.75 807.8 1541 Tm -(24.77 ) Tj -21.0452 0 0 51.25 703.09 993 Tm -(NR. ) Tj -19.5035 0 0 51.25 743.96 993 Tm -(AMEF ) Tj -35.7727 0 0 51.25 801.08 993 Tm -(:001 ) Tj -28.4541 0 0 77.5001 431.67 932 Tm -(90002214982024D02818480721100293 ) Tj -19.6793 0 0 50 232.9 909 Tm -(DATA: ) Tj -30.0086 0 0 50 312.81 909 Tm -(28-06-2024 ) Tj -20.3563 0 0 50 458.79 909 Tm -(ORA: ) Tj -31.196 0 0 50 525.91 909 Tm -(18:48:07 ) Tj -27.9768 0 0 43.75 852.02 1489 Tm -(12 ) Tj -21.6742 0 0 43.75 713.81 850 Tm -(TD: ) Tj -27.8567 0 0 43.75 753.7 850 Tm -(00665388 ) Tj -23.7415 0 0 48.75 753.75 798 Tm -(OASIER ) Tj -0 Tc -48.75 0 0 48.75 850.29 798 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF"ExifII*  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw88"2 ][i,ϩC?.t>ƾ"|ށ~(;yzt&\ڌ .̇ñ\esӳ*.  UebHY*UDBǗcɌ.3V"deM]|RI10DP#̌dWc2CnjdwZ̺5% Q -BE@R) ,RT(! ShX2hf  VCĖd*Ḧ"  1bd!@[2c,)1 A,2"rfV,y] 7[’V CHiYȠLXbVTIDh.* s(`{aDuLN1$\&BR) !2,$2pʎkV.7$`a$c( ,aAI!HHà! $k[(@E%IPc "1HEȖ%Y3Y}LRI)IEhQT Dh ` ,1 -fɬMLkdk0Q0m:2weWD+T|@{јij[ʾC=ugi^=ͤo+>j>WS˃t}+}+@7g$ dTY!C%+)AU! 0a$G ύ>\Ycl` pB"HA$aa -3cEc)FC ms$#BX!1&\@ *ĘlYe 1YkfIREhU$ T9 v5u̮W! 1!!"hR#c" - l"1HT*%4Yx$$V$U!D2E rT`", -ep¨ B&LC4ll f7Y#bu(549os} -3:c#PA$B!@r)W"q15+B !c=r x)L쾮c#fG2bvʨ\VhD%e@<6"XCB1RA!$VR@ #1AH`HBD+$0`AXLĈ̥` |X&<[8םyVA#)Q$$ aJBAW)F2trO 嬑J;cdb#BEJ -A G !@4B00I AZH BB"q  P@#) J" -Eq0B: d,=ir dC h) Ch "I 8cY LDHI!ʒH $!$)Y Y*:[P - Xq16*r,bC-E  $:Ȭ~ìu3rV(WTK"ZAT P0LaPP$Ej+ N,He00#+ȡ`$*1)ؙS EXb(ab +YD)Tca #@ a U>AOl<5ՓWg"P-*Yl굞էd̙ud 2>©_-vqU_v w+NJX  oBi1n&5SjV;ꭏ!uL=_g(W_2@%hG(vDL(B%^6]d+Y  D)TKﯛ?&Tlke<&baҴWI<د:rz)y-\C_6zpI `2BC R$,b@ٵhlX1d|,g82YTDȫ:BQcz "E+BѮ:1(/m|5vZ*kq:LNsBT@UcI@)``@CK! *HH x1:ʮB,Y/yuTtz1.P$0:C"@ b$X@  @CC -  d ciYD X&<1jIdIA͑3V1&Ȩd2jcuwR\}xQflpDL.ȥ -$`ȪdTK<-6VwwM1S#J`ŕ~}>)@,Wp{)K`̆W +D ,ȈUבg^ ;jd_V[ D1 !e0i1IjbzG&E# *IjKbcYF۷*;V>2  FL$kSWӺ$À<ۗΪi1vur13klY cU/< jaߐK@#^aMX!%j=N%s= P47x1kzTS:tma򐞡^EW{:r -&1eԩw|zMVpŋDV?ٳ6네K鉗X2QW4~/ xU߯,0[W,lyժ^l"]yws/Ks)%*a$!B8 0*dCM1I -FH!bq<2azˌAU]I!FR"4L9 JkӪ9[vezG%z&Ŗ,2wɬMLan]|oB㕆7 1 +IA" `0 -221Q\keH0A%g^pH)SnB"! `#rH!I +,< M!W$Ta@`@(V$P,JݜˑD zh&Nzmby8] /&@A. F WpQqfI|y;^5Yuc+cq+W -Mu+dVX)жXBFBioӄaneXDȁU!L)7 -0Gwus*QY2 H'fR WV WX@,L&s]Bl>ïDِ,Gɋ*dBGWa/raᖒy7V;  -C!5Լ;wgѾȬTbe,)ьYlFI2^YBeϢ&c,VI 2J@.@]r,XAJ6҅ԛ5 -`fl+,`z57t-5ޤr,b3rWYXI (H,$ -d|N, c1Dc*Qd0ܠ"U&c $r*C% $,]JH!$ bP,0!XB+AAZ, -T^Cq&C#c*!cFlfWLbQS"F8VVEլ[U$*:$ UXV @[dz^7SSשrl~VשTRK&g{F>AwW@cȈ* ߷[ߠzGj 2 I_?7"[իG{JηN: P4V 2 8r(=nPj7_=$aQ ? 'lc}ҵ;" !@NoikcGB-YH F82VMبFh3.K$ -c˶q\k欯"eɇ%1XjP,μ٬u>דb#f?C~*ZH :Ϻlz تCй"^aiq;6uVo۠V[,ggǣwy D k:g O}ν27<7w`حB? /C9~!#OۼPIZ\ԩ\huIT -yqseLk/YJa$4R3E@c8`͍ -=HBBe[Z3La6Z eDVIͥs_-o;7{4gWSfur$<8?[e %cf+UgwУ!SA X4B<AV0,+H $0 -iI*BI $ -q R0I! *C 1LI DD 0*<0uiH!5ȄGIaTQrc GuLl @2hcȐjBb*R*jv(X}U-|٪V($ .}U41b@AEr.jjV -C/qLy)c -+t1pl:˙7F3%Dˈ(21Ȱb"y@$WҸl29]70`CXȐ1nKl"AaH `qǭW4[+c2l!]c[u6ss뽙r{2Ι6ݔ+&68V:o~bhxCYک^2(WSKlIrSTAۍ}j_ۣP4EW+ uRf[zWwC8>U8>\!`uh0Bz:Bou| -Kdaj1u\" -$ a̢?V,[~/ٱ:xUm+Ot)[_'IRstDe(d2@I$0b#1XD G223c0j -4" ,`I #'Tlps/`T֦ߑ*y9.AD -@5rŷ/Z\BNWR2 a#:n >=k.byϣSLK91eEǛCɹ\^VoΒ羃YS.\n_&&\d{ tziz>]Ő%ddlfHa(ks-EۻCOPJup.^ :yf5p';:{\,9qy-OpZ=(ttUPHPd5jvtH !$dj,84qM$HF a -`HTG*ƥNδeDߋ3HE#+&sC(_P2 La6'HZ=`!MX+aHys ;@HHK5c _-ٴYdʇ*,[Z{N^E`Dt$F!`c u;)0B)BLp}ב@H!$$TD"@IH $"e*A$Jb0$R("!`@`I^d0Y ``dXqljsa( -SdYq(Zb *DeP`bE1)BdgƨC -GQU(1[ۅ^}Z5vżu "TCzXC!ݩAǕWA*B.}z3m!z|^@Z`2D)V^IG%2**u$ B _Y|&ª>wц<^*ݟ:kyA$&2*C,ϥUK!rǯ  K$٧3irkIY\dhcScY6ug|̧3&J؝X1L]cI -x 1Xˣ+;H LҹSU\XBDx';]  Lkv0B"HeX -T.*ECdd+ #" -H()X2Eȶ!dXƲ,0ەS;mjcKObCZ  W #Xe)*dtk OGF*Đe0r`edz2HiRnYJ'kCЏ,RnT(n"V,w2Dt``_}Zg?~Ij$:!.5k'Rx)e82`)d! &`FVQd A(0R,"Y$$Y/0=yY$a6%XK$$$K$R1  `k 2cr D %2&CKCUR eUVQ1e e"0D+,)5iE&<X_(?>JL\yaHPWU[Yu/Ov˼Bf+YDBd#  -UQ@$ cʭTJUQ⩐2WJ2AؘdˆT Ā@I2cS>5$e5`+a 0ˌe_%o4"5HLx羁Aζ,ܭEdr6tؚd;K/ z)τQfHdrD؊[=z6 Qd -H-ޥB,0Q$ f摇e#Ȅ)#49`S @YD&DKu}[d2@GǑ a dY"rc! K3Opg:ek##HHTV hr`CP4a*F40AqEFQbY0_TW{k1fyoGVdr)-׭8OHlYrCJkɥڊhdS]ZaqOb@J0HH``#)cc0#4 - RB2 YH_d*yI $!$ Z) X$I @ZEb"Ae!F ( -b@ H Jq"7Y A S!F2,EǑe2TP -"Ȫ`]WhaL)1ƨI,F60ͩ5|]'=GRsmI -aU_(w ,EtJ(ϥɎ2 QHPm%h @$0B0bA40$W-Z*H[7NZ !B^rlwwZ6 eqaveR1@LPV-XDfX@JdP$XFRVy/:2B  LD$R!!E, 0I$D@!&ԫgPc"F) - VS!Pd+cX!qgǕ:Phy&3+* j隐gz?cTln+*RFoa5'S_'m2'7LnG#?B^9`+ V {Zs3XH@ '#ߜ]N1r,)"@A@  }O}t !U 7{/F:zW}z~6 Z2@IXW*~zo^1ee as̞u*޷C7Hd[)6'e(~tӶWf9jW &VÑ2rŶvx+*Ryc  OWz{^eW10$`L$e6C*45ufYwD2qACAcA!Yc)yh0Ń rc\ԐV(!#  BI+K`*B`#)$" ! Bu!RIb$A$ &<^nJD2B2P@!"X,*ƪ lUP+yƙq,`,1d*RQ`> `lh=->osz:dX@r6*]}o+ն+f¼7Ƶs'y*e2 aAL|:94)2b!HC 2Hg 6ͽVo& -82xDz"P/ܣr 9#I a}^8_c,x^Qԣu8wd&L,Jd} +^sԩ -0Ho?M yvrEC -*WO[qA"CA$h `#E#@A -+$ g ˌzK`͊:ivQ #A*#3jgEyVbxz;ymn] 5̽2&s/v['a((UW-swQ6A%21O -AҘEPF ID`aA@bJh'^dHE`,$ `  !0D"BHA"!#Sh6(flYEVSdƊLF3eYV)I -2QFP$7Ac"Lc,.0 TJ+$ZEdGX9K3>6:r:2WiRJ4w`H -A"`̧ n'h.JQ)$$pcGcXt8*XIY`E(h$!"ٷR}Z+,4*P~uO=(Z.B1w[7nXD`NbfՂx&H.`r9ܜu)&XöMq|V2ʨ6L.^,$A!'0LbL8dej:)I) 0'X*HdA##H - YPU&X!q{ݭ{Ks6P&H!$:H q400,x+F#) h0$!!6j]]6F @59Q:Gt2$ьd{aߘ!` 2AX@" $%`A#I!(RBI!`"u9`ϣ("I  -Q:(&:V PAHbp(B&czb.Hva1X*4t\ּYq;Q YXuvf&LpP+Uжӑ否Z:+)|(bu>6=% !@X("$R -X -D cB0BL7mlre #%H`bUm[XX^0BA!Ay`ZaTIJ(er!!nWqv$2A=Y .{mC-Rά(uEL#cs7z Bc(~Wv7\vSf`כ2i` &,s}G5}\EE2 @ ZPaC+B!@a$$ 32F nO::axA T$A 0:>5H!05ɮwy83\l٨"AmjK'E~mާg)}t:{k.%+ ,2pdFPΫX,I I+k^bM%2ǛdHA$WPCFt a(Y!ri0 k|&9GcMjź+ ZtYH)#ՖD@dA E *@ !0DA -bT`$d0 *HDU|r&DQtmC*"1cVX`p -DHqdJ2UlphMΟ_v[eUFQQ\*CuG0 -D$`)LݛXIL1$m"vi{24 !H t!0*@@ G$#D y;տח5kRhq )%ٳT;f8) IY!B2H 1`HaCIC $Y H $Y"Lzr/ -ªR $QH\|҅ F(AQ@@L2ӫUϏ*!LpAYV*_שRd΂2[ǐuk9;:zu'4}GNgԸͅpFP[HUܳԭbHD TC-{__hw !E(;~d} -O/x7bFHA (Lr"+'zo*k'<[2NH$ 0gW霺m]$WQIHQ(״x*v|`B{YpǽzlBCŵ\k3cyyqg:ͣ\pwe@pҩɯ$ˮ&&2+w}Zcl>jzy޲ !P`zY^b@ASUԬtrtoG:Yb1V1LKm{NR]ˇzZ#) [)Rs8ʥCų7nx˗W:f|9+3azSzy[ws܏IR|&В 1NbMOC͊ YI08 8Dx2B"xF1`h eG$. B1jy4 b8R`H(qutAڡIk'7\{j(mcXìߜH`*4$*b $dSny$1<|)_+Tk0HD"Bc Y֬J !PE0Ude1(@@ *oZ@!UQdn/ b3d Qd8W٩5R>sdŖj6'CnVyߢ(w\ *^m{E '1~HU"`I <c3蚇k}Ŕ -`*CB "@&o1'JO*j4!XsGrʥ/v>?Xx Dˀ1ϻ֬eZ a!RةSʮVI^}@KR@ I|qv|Z쒟x0ͅϋ-E^8-Kbfǖ28:7(w*l:ѵj=bVwLQw ΡzTI0a%E0@8D%B@XCCDHPh3b0HD4dYZ3o:ս -0c@ aF Aƺ+ -5m;R2cEPX7W -zU}`Aue!B`ς52Tg[盵|!d#@I #+E 0ArR;;UzRJnRѲqv$$TY8{²brp1=sCzz5R.&LZ.-LsZb2&B:c>}yQ_èzY2SDH@IzV)ǒv!T* {C !"@RA$2BAI#l!E R0 ,! V\Df4%GTBBTB Bpg9{: 1>,fHD5vRюae,hs +Ҝ-v3L-[M%LR"F  !RZV2$ ȀR;:[~h_3Wˇscvܭ$H Z*u(KIBBV#a9Ӯmnv;fRPn4iŭ\w+ijuޏkk-%Yj b$$(VBD¡$VRCTHI THJ//+Sw3$,6<:zJV‚P" ZgySH$C" $Qa -1nht)$!e&7Q*,dUi4vWhofyQq͊&4Z[KRܥ.S:ljHJ" 㾕УUkv* -®J)\{'jrߓ>ۭrX1$ͽ&-ED/ n^x!LPd `fH*B -"Fs.x_yg}RM1`D(`x}<{CV>RC I DL -[Ԯwyb@h &o76epA$_422&6y1n`+>q@] %J<e!XF %I0 h!r -e!XdE,V FFB<4(#) $@$`)PˀUYΗ3nTeT7} <}:WLUC|#P]ٽeDZut&,22[#@I$S R2!@¦EdTpw8Տ.'BRZir;ԫ/~OHޔ1 ֕r)eQ HC$WB+3cʕ^_CܣU,VBUy7D*gWSp>l1ȼlG'V(u"*TCAYXS"I!$JKƭ{4gDK*E ZZ(+lۤ!×n[aJS +1cYl,"(J1",\c< -ej&D\x$*H2 `))D*/rz -P+ĽׇٽǞn]́р $*ioۏ -͖HPB)2(ʙ`JB -@!׋>SApт qd cbAH`-VGBu1N!d7ƲscK!ezǙ FFFB" ܻ 2Dj1x 0h@`t0`@Jq`!L 0Vb  DeC!HU\Ah%Xq%faqCi ]! HH -[cXUmڦ2#ɭhS H@SsJ!##|'Ac%D"#1NCՖHҬ20C.tG!FXJ){Nu~YSxNtU660nB ̦ -RPZH`  !P+"xBq8 lMhmYhw%fɲٰy Pףz]HH{R`BI$ JDHA $Y!EνaKe"+3*65\iPf.6&6uF ꩁ3*$2- E  J#BT*ŐPQb"jV:@ǕD&6AId)*Ȩ+H)(ŗ$P &,kck 4F,S@dHLy1VT%I a$b!"JBHV $! :2 :X!2+"S$$$R:1J$Fd(X! 2u(筼Ғh eeBbUVǑ$QKdr XHh%d$&D$Z,"$tK@d!Ii+ 1 )TKy<ˁ2`l FR%j9!65*p+cΘV A$Vac((*@D*gndrb&6F'XI1IND2VXTiX"0DY#^;vηC $R^BT,EdU$HXd!JV ) d XA &1U0`FRA$!²!8d9VSi Sj2*` +0r e9bc2Ș-ц|l T &E>9&rRZ̐b!F%HD!+DP@#LqrnPB1 P$ J%4hC !ɏȓ$ȦE% "$6 cˊ9zkW -cɎ\@ OFm4[>c=C7O,'O%SmOkFѠ|U} >+Shqß4]H@G"NgLU 1}lq:ԵSpvYa HDb`D20]Lk{%+@LX\W段垝f6:^Lg]1+T=HүW)- oWbΟS鍢p$ $$(ZY"@GA$QL!E,0(+e$ T@T$D%D jBEHDG,D @" B -@R-o-z\lY3cF #,Ve5!8!dHe1XFՔ Q8E0(cAAUS &BI&9UQ2BI$#F+0BH&Z5ѩI,h !CǙcRsdeedH޷?"Nd:yK]sלhvG; 옛"n5z4d$ @< $h`1-;˝W4 +Z@1X1F@C 2,  2H !Lyp(:n.nw{~rNTشV6FOcewi2+z+ߑ8` @ $D X.eͭH.䩑ua PUȭŋ.+]UcZcQY4Nom\H C$FFBDGC@d <#CEɮrzLYJ$Ǝ -(œDV찡*btYc  &6%ljl\:cWBI@ 2 FS "`P " WJ5I"WU%I$F*$"Jf THE 2a(,&"2gþ2AU*!!yM.l!2E!2E4`$*X2FX``VdC$H +)Hd)!G.H 0JBf%@Ԥ*d$0DAdH00q -*ĀH2 2VƜ7O"έ&.,\֙- -d4=.UdYY`RW]K.r-o lJG/1&bD1\\6*oLzB民j ʃWQb 57bQ{57;{joQQܫׅZ@$0$`"05y.uRlS&~νfɱf=\Տv$#NjNq?/<0Ȃ*Q~(AUG,Hdh6u+ɽ,i"ꍱfq{q.!ƫojgx `Y8Ji=;l&0cpTfRU *Y UZBFUMMiHjnTuWELnΫނqY#u! -EEY uqعq0 -00DC%@I!`@ X$@Z*Z m ,,~@D G"Qlm]h֜ jMZnyGAbCE$P[fV,&gWط?cm`6t3l.ݣܐ.>{GΦKxدK1ץZ<2$=sGD @$$H@QYC\X"&t\*nhmioח~U[mi+Wۣi\ݓNYV*ݗV,jߓ Kyۣ $,kSЧCЇ@C -!D6:ͥ1ύ0ÎTWAc%ďdGpUB\ -ejvF>ξś]^_OY**:FB BD2HH `("e * -20@HLhmF0+0 $ X40Y K: p<ZE-'QN`ŕ&XhAd&FYM$$ ,5U2 -`BrEebIA,Ar)$WIIb+Z$RA$$0J$H‹uW+nVZjzco܊d䀐@h02yQ5t9a2y/V *^\Bu3x]j}sg]&vmtgp#2byi}+xEzEyɠ8"EI&o>FQ  - $LHQ]Niҏ^ˆ;eJLvzzy=' -z<&zgY)^}q|wz ! -S U1<駧fƀ4X* -'+-) "Il12b"69W|q> *p@P2ɗM62_CydYl -ȂIR@!$!D)S"Q1LA R #A S, -c B) @ZL5ۑv0$Q*U9$"A " Xvl֖C2MGzڍpI6yb,$,Q[:t[Ҧe2fT22Unydj喗"EfGtH ZwŔ)#\E2BIC$e`(2c(`$S `Q hI -RRV -!@82u dJgH$A Ha18Z^v/Bi_g[4ICp,F*2pMAe[=X*{fiP3dF` !!2H@ -m·L=T'ZMfc5"V^O_S.uB $H@ I |~.=C蛳"mك=Z#ؼLz!xa l+6h wS',Z9oK.@W![n';0;A3& ei!Xk4㕯ZxsnI QuBNԶv\"]I/q:`P(! 8Ik:w<};X,bbO*׷fZs';=֡͢{K_4qƬ3`%0 +2.{%tۧ qlf=LB#\F#Çzd@+6U<ˣ~^eI-?HRTTes.lF䧍n{4l^?x!X1IcF?c}2E=Ww(vKQPHcTŊsdd $mGO*+aVGi #2{?NU;ߞ/<{S,L`!0Ԇ@Px"8 01 "b, Q)+ XD2*uR@ K0fZ!`*I 7:=7<0C.9@1d[y*xP2d+!*i؊v++LӃv>DTvÆ<߶W5Kv'n.zխn.LYroWf;Br|#9dE,0hE`(u@DM]>wr:X5r;ɐ<]KUK9y"UKiB(ȵ;w*gr凷XEnt6 XC_Ƚik"h쯩 P@[: kM[PT{&/7H|~%K2ʆa3/EQfG5@sj}2MK_@@%>*^s\]ѶݸbƿX^/W}?eXBHE!ӡ?wDB$HQ:+TZ<62+\7Oד3.6[vy~yORC $L D̏L,Rw3Ǘ\,ܲh9fnMts/>ܓrCEF]iE>㎸&VQ08}YB..T. P h2޿hW{4Qʠt:ַI]%Xp_™1y37+vR\ϕz`sNWn-{Hv5נy=7yJ]PDE`)(\{{by{p D#@y]>!H:h>"o[I$BHaK -ACBV*t.ВP 4E` ^y&*y'f5ޓɷ0IPpi~r:;5;^_W,2jyR޽'z^69UFr:N1{|^u_p#Ce_?{y濦,y R#Ϯ5^U+HHx Vkڶմ HwS"(@ kr>W>i'[6zIKZٰ厄DNl-Bu/>k9,)eJCSsƮ}K_<9_:"0O==׻@  R:$WZ^ıPDB!V! (x%p6u~?Sz<[V56LqgDeQW!1AP@T"7X@T*ve䷃˖"L5" ꤚľYh$[uPh+ S}J"y*WAy6>} -6jgеm׫80h_ty;ס$ HN%/.uS=oϺ)|R@Iq^?Էյ:7C0`5)c,%=һWMbyOWѠ -7?@>ux{Vlz[ DS#$x^u:+˴ςfvnIO1<[=O^~/hz'lڧ0KAb4WeدsҧۗC7—Hsst4-˗ՃSOUJ6[O5E|O-}W -=K)cQ{۸/:Pdq$Lf @`(1#a$H)X !$0fFS$CZ"6$x,2Db!91<4R VE -W-{{G\r$S $[<D7O8yL_9ݽ9W< |wղ00bQxr7$u~Co ,r#c'3HQHJ(`<뭩ӠۢΞcx ) 0ELdfdYYbzeu{9hymt8׮vg&CV_?6.CKm+JLiPgf"lڲ֖oˊ ,dyZH^{?πcuǏce. HA(wOVxOK cPZ(A\yJ61yǤb{FV#ḛvl)/سc<`X>G@.^U P4I{F*bRZ62I A ' -=7@Z&LpwR _RUU42T00qdr``(44璧C"F -a`Tbˆ^E1jpVę.(Hֽ^眨E^Z dJ;Q8oڋeƳjn14Ci%׸|v2m˞@9P5c$ xHsxcx+AyO>Z:5J?()7l!*Ti!QZĔǬ='{ioڬ[/})G yOԋ~+\Q4vދ>&ʴ\hr5P٣"4I랞)@ɂS69+2ű$)`b>qĸp*fn*ީV/\,{Qf< -D%P[1X__"_gf=UJFlc!*ZݧWgvz:.rI 2H(!+/1^}NrR[מw #UR$Y  _'_=^ zZ"U^f/9Xъk#|ίO$ f˫W;&_3%oKy侓]>n,󬻤w맴ioIu^7PXB> -,G^VXg]xu=Fj}n@ -eǯ7z<._RPFM]ihF_FM*ed#2J910큕К eH4ŀD"I$+(dQ+k #0R1H;,V X 0I!V X r|c<;tDT|P!G{vŻ~6clI`z-KO9y}7u+7{33TaJd|Rzj޵kҟX1b` a# -C$Jb4-}+69"$.E D  "D``n.mp,]G& \ ;9<׸i':a`^ڻlA$ !#)*bgV˳WfDZey}2FWkeEWՋY)C0؍|&LI_^_|kaH1PWȄuk"R"(@`4U`$2J1Ɗ^]-)|c=~ e^?Brn(`ɫ?Ti@ti0ffGZ]P9s=}]{N T010wy [z= DF $xI܃^)o "4*Lw/NAykǐPO͎RFn_*eB}CkegrLW픺KWgmWltt7v ^aP:5^礽=z͗=F<7חcԯó5 Sp;uŢnT2%3ֱqka0cP&[NzD@d T:"pw:WJfד<̾yGşy*W1v10yy1h7>nBcl{{˅ky@!-F -!,0VRN"J|zbN~8*,*TEaT{Pk.+zYNT} ;`Q2$1cL^uNnpgЬr<ѓ.jZnjrVIHws\摡G/"ƫ| -{:|rs9EdQ ԛ%)cS<Y -e/ω˺%23c`(|չ1B\~Ez8/V@оga[z%x6\Kd7"YAP8)e( +Kv/hw5˯R$scK9ǴR5}VE\pA\_K#v{-|Yzڮv.16TeǯۼONU>˾E=PE?=qm;ҪbL(b"e5:V;--.V:m:loѫ'7^-Mcϙr,U._YVvLu'Fx_vwGa]޵WV.?oG*5ۧ|٩32Okԧz2='{CFB!LU eMXq]kՋ.ZS/T-އ]cBDt8ysg\+ .fO>mKӵ q7<_zχE͡dBo[4JϔkX=n?c<;<ݴ[|z\^qɭO=9ܽ{ f#nҕZjbQ/q=;^Eޯ)qfǟ./4̾u%j1[U+zb_Fԙh1.ͩ{cLѴҮ\ӷ^FPI$ \PG0)V4V X;!EBFE̒H !ak1abCeF2D7}Úc~z۾:UɎT@HW)ܪ53fMG66yNGqp=|}[;TE.HF0:"&Qѡ!$V$@H`!02%/KpV$B0 `P€2#,CG= ys xƅӾ6dúqSvjwv^ĄӮTnnW^i2HX/ $X,"HVXI!T(d( `FB  UhP+]ס -p2vA4d$ _#)"P!|+gҪu+МЊ@TȚ((y:ɓWFe SlQ{2(ؓC6K^:fJl9꽯l1&Z@] ]np6zKwm]L|%e6 =2V%oyM -Ǧn<<3[au;: .c$(I>1xp\Ja{ޑ澡1GXuuVlXe=w~OsLgjܫbbצۓޗǰr<+=+ͽIXټXOwVǛ ǽS̗5f{<'6|^c3&xaK_y};OL;7[^]ԲEf!枧_U|輵ZٯXPoQ8]YY:QX.dǪ͖NxFus!8X^7kN*ܳ' 4חRwV5,a3x7tznȬde#|y8L -21HB##,a*̼ ŐzY)dju XҦQQWЭ]!K}k./>8a$^o Q(l᳓γHE RdNp%I! -7 b@a ޕ懤e)RD$hyVۛ٬XWiZrB$26*"EFR0*b[foc^#VoMٿyz c5T[.[ePNj.@&I/[7oO!)$DX@Ee@HT TˡFp\dI /_;Lutv[ PӘ!P$(U>}TVQb U#QQԩw]EGҗO枪]iэcV4emiP@ublU`h&o>x}ZTCޭ2B7z6i<}O]ŜItKT:ڽRo >S];[tlygBS"tq_>j}R>B4c"yg7XZoxd2Pwd^?k u6O0^OٵqȚ{:5x5_ГgfvVۛO>yw7< I a`E&HH@a!"I 9R@b0b´!$TȑAW;jNjw$TI -0FX* VVt|WѺ羅)Ll*kےnZ.Tx6\Mu&EJIߟzSY$hA$"Ҥ 0AI.}ËU o,1! `Q<[2cZpyv䫤YP.\~xzL|h`@A~O0|<iN,*((AqJR- $ʧ-yoDX -j"TFƼ1yÒF$ˀԪջX͜{|ԕWtMVJyWv]V-= oo=?Pkm-߸yl?g׻G;r"=`t3J\k_ҏ%XI᷋ O=߬t!BY#$UV>y7 -WZ\`I֧n"ϭkKUjK{OXO(GwEz_/f!χ5o^S|D\iR<:힅qrسFmlyyyzbRz5>yTzygZϦ?-s8β!*~ƭjݸ|dZn}2.5(ޥ-3i6bzF} JIK x{_D[G:=$ F *da0brx0S" -U@A!FRG8$>Gl8S#+ $AYJ|L+T/<$&?7AY6$@ehvR|./`J -bT ZNd{}[ *(2&5eT $*X܄킭*8wuu -J}mMGsq>5XZnhTϛVmiS̽CHͫo:UN'QS}[|֌T[EsB鐦ZY7ݚX|[udW:wΫr";~-ӓ9]Or0 L:;a[[3yxWY5$]2yNUUE4xR_ĞPkkz:Uf\f-n*RkE z6Ċ^k|C]Jsza{ʮk+fV-x 7תzҺU_N0&f-mL6<ˆᢵll3zʟ>[ny-szx4gNsՇNZ7+=}fɯuأ.֞1S];y;*]:{rq)^h׳uGKwNˇGeeH`HD"B Xs*m !2Ha$1 ,Αr&RI!).qƩOUNw۳v$2@'q}w_0V)~83:Ödk_^<9pzk/=%1mUF?>t׮vزi9*޵HZ3s:vO(mBr\uέgu0짞z^^=TrݚžDW!eŖyz[#+ H`X\-x`*HXth6Ly$&LYAHH(bRp>J9E0d(BI NK˗ݏq~mybukq+@[q7sm6moZM}Ğy=#)c5cϧbV"$,!RHbReŶZl5h;xcF:;U[lJi-,z^ՀuHvM>2HHI R "3)$, ȣݩWOW[5TZkM}|˃b-ˇW 4vy3&U[Fm[\դŇD[ -=֪[гVBǏ&(ةBZ[OY:tJնj^w@ONfDZ+ںr徜d\[z}UmByPENRH{,^0R{kd5OymJ"ٟgb{&Ş;mT-v<䓩9#_>}*Un<Ҩg_D%9ǏI&UZee)^Wv%׏ى]k-5WGK> zgl+͏^oTFVdw͡uFuȷWR!hPh`̤iDE $ c{\Ȧ@1VF+ 0B0Q+)Vlc2SΞKElޘHLjCZ(^j|1nUSvcyOrs3С JzsN 1WK?j%%q۱DfzXx_lYBH e02$9(0bАO<+s:Y0I$CJ\F*Dzp -{rt.F|ʡ!V(B|ldC^ nF0oc5Zs:ѭF*NV:gGw44 G3<[ڽ<@$2cI a6,P4@+d`HHH BHa ( "0B+Gꥳ]M8=3kei8$E"XѸxؼckg cdh ihQ {KSC[}g[˯V6tע ۚv^PnFZXS5mi஖G:dGsiFSd+)o"RaGOJK-?rm4yyu枵ֈdN!_sҸOfy`8>װXbK?ljDž:-,{WWlt(Zu_ף.= :~G^=z󥥎Dvt<$\s[.L(|+n[҉cYiz jtu?H;t*}T*txO`kl<_>}+;IJ5rTڝ-;]9)LdRZ*XAji˻Wu@Z GIXiSe Ϳ;h]дTܖڤJU9 kGI P#Ń! TGR8:IR;&i$XBB b1BFZ[Ζ n1 $LA"g$ؚ6ƼͶd@Ad!R$$44;98yӨMɑy,Yw^=/*yny9)vgB0^ a!P9x-q.>tUӷszC400b`&>\-)vѱٚ1#W +)|oBA !Ad=JeյL/dn &Psd`I?|O+ +)BH"|r`"D@ -`` -4R3p@HE1.Dhc%XT,0A?3PLb +p5򫷡.1תڗ.J$놟r7izPF\ф yA=2$M/3\&HxvZS*7+}񆭴ޢ681kw?ElxߤWMZwʣ5}s׸*[t8y,{uJιK|NnC " -ޞX!# $HAHDXPVI@!]TV C &Ah -@@D@@B D\ $@׉5X[jÞRϡ}BȮ.7r@C9ē?'յje%ɦmx\c}C-fe՗r6)I1:ud5?6c%VHS‘kVsz+(ҮZwR9=W6e¼촐>MBw>7AQ#Ewlɻ82S/FX737Ų幫Jm@[^Ǘu֤Zz}vRdN<:4ӣ]t×> .,Ԝ˩_=Ǒ3suG]Ovw୛,oܞ:k%;M⑇BSWl 1H^ d*B`I c -\,1V \CAY$# FDWX0"68ɍUە,XF.D)5a6/U=y/_=V.:V쐅`$V !8v]J>&ȭ*U5fJɖ.LS^]+}:3cc!RH"0%`LdI@~^d_:ؙ%!2I%d+ش7Vvzr#f !FW@2,JCW[8^~ X L1Dim̟M8 !a $ U+ $WYP@DR"$Ah%[ч8"FR $$ WB26Δ U`PB0J\7uO>)vgLLq}>#ƳEmwc(yitG+)WIDԢ'&Dyz;gXtiC^uk&~EOJZe覶y|Mgox=^A5:ڜ[{垠p{(^bϢy6{v0dQn$S+}K[ڗv(f`9|[^7fY4>myհQ/̹M>ͭ%-ҽh2+\d&U9V@5HeBTII Y`5 i@J9R(Ò^46)9.zίY #h=3K̻]^0(G(iX%0BVS @ HTb) H`$#*Bפ߀B*?#PIf]ŗxއY<15KrдqeWWWvK I -^S9gӫk.:=eOR^\۳wz=1hި[-+\J[b*M*X7NJx\ν(6UW> -8zU; mM Ϝ+"^K[Mu2.}^moj:d<&ҕwwe,ZšgK6ct>]UYbk[L^k4*XizdXOǷ_bK~i\;FwO.٥y%F^VfyZ4;L_);_ҥ0ֿ s:ކuxŰB RxŖ<ۖYjޒV 8 ȶG#CCf.|zKWn^Bz2"TvDf0HAH2h9p t[ͦhV$826mlJljER;ϝoj1l]>oG $ "I SWBlmW՘z>SqZxv>&Qѐ @RHBH4]pjdcDX $0A : Nyt[d׋LmuMS2H"0@HX@((4Q@ -J6<lM R 'hƯ$(X-.+VZMXw OQήT-$͞t[lPBTGبѱp{GKKd\^WM}y?׮jrxwS/mwwWavzQW}sgQ/zUWMޥg`yiuzmgjҙWMsKMڿ`9tKm[`ּ͙4/}c4&v+]%֋=K"J,4AೞzrڢmuШl|N1x_2 $R")Tq;i5(k;[Gpsm^ܾ/F%W{IC_B[}nd[i5IJa" J+ CGG c@" q8e ! 9;QI &ibٹR/sF e`$xuv:ٸ OUpM8 jI BHD a@C$!#*ВB+ Hsf$@ *BrD* "ȋ"B0`]C`B2I $ "*>[U2=&jQ/|ޠ L.O#-eKQmu69[|ۊeOrAQ(9y1Lƙq&:Ǭo/6d=bv2ch78_&qr=ڻ|siZۚȐV -@C o*Y{[jK3(p}6{э+vw$9>v{6XT1O@p'Zjq21SsЭYkp96popgQY*Jyִݵ|׼ݖΔnE.1<ԼnK񮙩~}"=#nYK60lw ZoGWl9ggP(׏_r[䞑ʾU'zN\(=!\F"A{NStW̽ANU_dArR;!`tRh  -1IrLtv\>1R:-|y(V2yz\JV%d\ɍzHT $ (`FRd UAGL0I `ezH!@N'jvCx/RB)HD^x_Үcu|WJn $2PB)px%dӊWOy)c'B.8HdJSsTR"ETDEǑ_Ľz aQ2LHfhz^KMCN{I)Z͖;ŇXڮضFYه/QAn 6Vc3^)niڕ" -U41u1חl؎h6Y4~ĕo[Ǔb:< ƥu4Wd0u7,+cC -k]ןUM266F)@Hňl].U>,k-[&-$d_yw高iI:M뮟S Zέ-8u253)Fܦ־Ytj7^CFj%*4Wm5jW6nmSWӶ]D'Y}"8MK#2-mpded%rQ*X&0]2#hH-X`!TZWt1!)^EF_<]@ܬVϥ +z͏>*:̣?z׋gW=nmOIlإBT@BJ)fR$!aa2P` A(̯P@s0`[-3_!f܀7%zұ[`0,0`0YηIlUvZ";ӁC 0 -,"2#, x,WaS2{uHVHHV/ѻtRr{yU(PaUf~>{>NDd1di!2,{g񹧧`̓9Iԓϵ٠ޓKܩjU=kpu8=؞}ugS>_:+I]Ɵ'jW^n.7s뿟qM^=lH -#9L -mr7kg -rޤSX폕*҆fzQ/++QC67^7oD*F#WE2h"Nbkէ>7$$< BF !0d>'L afR0!*$>ZQj^緒K!G^_Gq3\1@}I\ 9\2CObi2i"E$Xi200X!$ RH@Hb( luݼCA -\,1* -( 2ADX$C0 -YHAr@MH $J@H BJ Pr: -°TqUDkNUXV3+36dSKsVWѶ/}2fhB!+.1$uu*^vE{vwvƙV05{4U% -;ii{Hū-f*գp: ңޥJśӻ@Y;&_}C#a ȱPDN1#OPťCu6m@*|׬:Qykw9KE{h, y|.:kJŖ{ 5qlf=gӓӥ{.EKb~z}z]+PޝD%y_гb}OJ(^\TZ1dSdg "Y8TyiL9[h\Czqp{}eǓs{YЎ5n{t_:P&ג6}G}c{ o*ήzl.Sb-oj]yqӖ``:̮Ss/@s;*M!v͖|IuhHaҼ$bZ'KYuWq:fL9k`yǤu),8^1?W=_S*֊me*`0$h@L@X  VVdt24IP14idYB58Ke=N&޽G<L+z%h$ٱ릨de\o]G˒B  DL(e)`TC,ǐd+ÿmdEq$Q0i^YE("#H aU` "I%0b `D aA 1 e-tn&7O!fړA#;=Ձ5cz`oSTIft6[lCtZUA}?#)4꥞Ovɭu2ilMQ.+FCSgdlԤAi}*6=_-BөojA6!!uUr<+ܼ7;y,oG cL$ rai -e Z0 -@$(H -I]4UA:uq__91̊ 1XeU}N~iו9ٹ}Zkv #+T2J Re5+ &,Dj|X=Kn;X4 H$moQKY I $PXH! A @+ A"DB!Y%"BaɠP⣡ofKCD*罵%[sw+om}:2dEeg U`bլv]}7`+Vd4aAٛ];a56|9l%?V?0t+U Xӻ]SxңѵvV|[zm &Mg/#B$㆕ާuP_#-P}gi|OkzI+o3ڢv%Z)vӰsVD+J釉ޯ]'8usY ,U{;2hNo^Rz#='wֽ{w!<=x2Oҷ{Gͣ}/Y>Kk|3~?5)LO+yA=xc$}:>f 5} ->{y>=_#9<.9i:T;Q9ݍ3CҮm!||e̫mfNj;"8^CZ; ҪGT)>eq,j_cvdHa$ABIa0 ' ,1g:`l AƘD;09a9Mi&Rp)ږgKҸaWn'e>~֜tO?/L@XҰ$ 8]jW}څ"򸹬g|G-RdqBH)9 -C>]7 vV}eUKd,,29-lsɩ$HdVHI!B  2PH$HH $2,@JVB4$2.9%ȑ:E $/HoITN rEdBFiڐJ^|ؑ$UHu:Mhsdi$UFI@ȋ$&)#ߒI^K9$4Zri&7NJMY%ݒcrI#!HbK2<,͆BmHke7y53 Rv $ (I +$k4$D$ S$$$!HHMC$Ua$$$d $I! $_~HLrYC搛.v'ڐI$ג51I %kIK5Ē d$D2h$I %$I I1Lhd LpddF|2X%G7!I$I0erI3c $$rII02JBI*I,E~o$,om#Ԓ #G"uȞ[ّYj +$jޤImnq̒I!@HgI pɦ=) zj& #B@$42aVH*!S,2CI$d6$$i!d%<$>ăI2fIfؐc""L$d]D$2C +elDy$ A% A2H">9+GWtT=c֏O*6faSݡF/}k%?#G9hΤ.ѮZ*?c.9mb`}&:q湯ͭOCiçbI4G425S6sLPpz=齊$YLYNא螓 _κyY*4V -YκuԳU=ݚ%3},J̛eGy<:Xx1gO\XXyLJ8e[iS ^w؞qd94p]}&`=z#<Ɔy,8\ha:ytdOh]j6b=o-q%{IRn `i@NVn_'q( py ͔r^X} Z' G|]DN˽>^`! /bijVev: r{sM)J2t()OoVQi i(F;d:W0d  .vwXUtǒy58 dM8J~dX -m3oE -~_o2Q赚H)"J7#OĆ'Qz JVK uņ:r'2.c]OC)Mkʲ.ɠ3M0R{(*+sЮylYԩdA*laB!Ί-sM3ˠL胓^[\{17(B=}q΅su|%6/=P_\+hMiuΈ<{ oG^aLF0BtDiMY&:`鮧LDI55sIJ5}vMYf|1rwiNȰH]h#o%héV3`-5B^IeIFϰo26-th@} ,5XXR#mk`wf dӈW\$3L(`Đ:7OP}e-뜫 w>jsqq|,7};x8S_pս K» ~&tyn1 qL鸠[?Es9ƄKYQPB^5>O[!bl_|;*f7AR1NwXdhPh!Sŧ8fX_ A--O}+hz !,Z.Mas5Yz5e#\>Dh1#خ `> `'AζkdrG(=0qFU)?qz?ѡ "[a -jwb݉}$xWɢ8m@\Ή$V}qO卦#~I2TR>g'AfOۭ9ڞbl].Y3݊ } z8*D`K~r&@"3Fo=y'NS3h$:◹8]Xq? $={?.dE3HJ=aNmn+y0[V-b:#0֤)ʍ%uU&`NH4;җ/t%H]?:O 稩!u8lC h4ybIQ)}yUK,_cxK2/ɍeG;':Dɤ -CLl r -:#QtO ;}}}ccJ׮NTxMkD@4ПE#s#$'V?f hC]2H5;tJxf1)CgMUSC77uwYJ0g$$4j,|GN$)(DGr~""ҷԮB~O9D9~$ysGy))ډGҖXMy7/YvUSH}"ȑIۙC5~jAQZ?Ar[u%rMY?f^cT OWxM+B _ImUrД5)vʲIN3I8Jtݾ~Y:Ixt9Wg2ƅMh[s2MY^L[GŔk?6 -s p/ dR dohSA_]Nwo hEƚ$#m j|QV$x,ɫif'k2髝'{ycѰsl.`8`YWhHQ/}?%@3h!.cNܾpͬW>ÇAeVbS("gcnXظ(T@3Z3rEQlKEIc"J²xdFz3+Oa92*lEx:(e!D*2US{A ֳáeЎ!Olnѵ bHF_*A9x-5AO^'v0sV xΎJ^_&Nl6d*D}G qfYT4rޭdL,$qwYкz\C4Vg==E mb2-eanJRU--][*i;y=MM`Z|_u>"=;ҩ&(v#VyΉ I(Gjc_L*ivfg+=0TvhB@G_G&&P$ #U(:J.<Ҙ-W{AD+rb\fNckyōU9`,]_1=udo5y58+Ny|{ -xap3OI?2ȡz=oODQ/=_4I{D n68ii9xYo - FOI&mr -Wo5:ӝT.Z'RDa>UDu.ě#4)1$d w3hIO:JytwnuHYE\b $:OW6ns\_m*TF 醅u/5ڝ uu$ I+KS#; g^]b^3_[Uz(:Js>bjA-+˘It~ٞuM-()q{. Ұa,ٹszsȅ*,t2B5 8ﵳE PAQmK.7j`~ %\'ζ|fe<$b2< 2; +jZK!lM6ŨǂK|:mlsiŨ9(b2H0Ѣt7"L2>%"ٳ-nyЬxwbrAhF2RyNoyGׄ`6^AgӾK" -2=[fʅHQԷ3\R5~o2|_qLqN!b QKq̊-͹0}5ډ,FkX@)9%IXUjx{rK73h큮V,F~-<T[d91i?ȭJfj( -+3q|Ī2"3q_]iT{Kq#:ۊ)5=ZgVCv Q| ZI[qc1:D&xㅞDt4t4׶tgM[:z:{4zRx5kAuAf;(̞i c}SeR-r# B`~w|O\(r5i|oҵkC$Z -WH|+LjmsgΦ5d84@>m5>my-3j,@^4q zwHx@錴b5Dɑ\bj٧Kϵt䈌Ὢwo#GS$ty9#.ޫ,%W)Jv:s-En9e\ytFu^`-DlWMv*nXƠ2rDtJPHJCǦN^6בhѣz YNJU$Zд{X=&i/1#RIH.\I4֥ʭhI8oG'Jv9z3Cʎ2Vй"ҿ(6ҿ hRXuZU1:ނW4eKB0qZvje]/ ]$sd H.*_p|$KJ6ɪON{i5sʪgT+WO!8SbzOS.%rȩ:*9HMC:{3ۿYk]Y _UYJTvoxfl9,^ $ihPnÂDooW}v_ZJOg(ڴ1ډKS]Kx}CBCkOdASbq8F\i~aO.PfwyIW1OԳ]Nv!>a9}>_p!έj5VNn9>59jpg."SL1"} .u~F0VE\u4PI^"A+^9]ol8i*u Y>nG-TW]^LΎ -=kXs%Iuζ4kjx'-m9V?(s/Zy_Lе/x5dq|ZMsб /&IsˬgX!zʊR +Eqd"8rB6TGc҇_1}8~TIF~ו:KѿzC\2F=d@5(rkXKT`UI ҋJ>W-E^V؜D?cj$on~$8@Q\)m-GP;RضXp=\\p};ўnJ0?W1R$ȟǾ]uJ)*m?D`6otrzUCyY}2^CݖX`%݁|? IC'WCħY#T5)qi̭ P: :Jͦ }(X|/ BV>xlEi 07^vpkq{G%w4m}inŹH{GĢ-hw}9wr&+M[^ C UR=ae UXhǕ*^ݻ9|K#ˇW)Ǎd;pVT:;s9l@d6R3yS -aj8s PJ&4ס#L߸/z 8$^z# t\Gkϖ>,T= ɞh)Sn[)mttd@X_yrx -'>^W;_Fzb= qqXj7#LT׍Q&]guYe7nJv)h ~Fw_q"-vrp#QN+JR7+=:s;*YwG++ڊӑ@J=ͭ[6ml١ͧ493Cd5#AI,Q}k<rDVR3xFT?ܽ!`ݯ&퍶 $]O$f8UizRk,%v+Dq4s5P~%V*:t5"l<0hO{V!mx,رM٭p8 #RΒ-ZuqfvͼZ1]xHkq)Ya+#OFz&xu bhUs-A.P2%#@ێn9[N~ +naDS4>2G4,p$`Ț޾|fDaZY -/3@AS[&zC6+=ȜM徵#hƍW:g/_GDj3?lyacL3el[k:YκySOec<|Vr. ~PvGn}"Q}9#gȫ2K5pD˽-t>O9u|9Ü`rg'w۞HV[LrqD5jDk _@6nNpn9RsR3Fo\m'O<$PL~kD$>` 1]<j|PjhUE@}ʲ3M䐼~xƛɇNQ>?$B>VC14l f۽6+/;ė%ܫieTW[z}#p1Wϥ2Eӥ^O@}a UbO3::9Yή|&κL/ȷS ʧߪU,SC:^utsOG "&U~FV)v^5S螡;} / -izJUΎG1RHJ~z)wt+ MO1#%.y百ygg瘌}nğC#6uK=>4qNIQj - N4&4)aR+VrG^k֧59jsX>6m[ rƭrȑwsw:mށfܶ&j3=ef=礹~P@>MnJע]xA!QaK! Q :xMiz.«0xwPTњy2hURjtv(( ]S]3T0bmI:}g19I.:[YZRȧhaeMo:[yNΖtvpհE @pnv)|f', ~W(ڋ!6=oNv`-_s!SQ̶Tŏbqew NT$2_EsVeo?q\L49fͭ6h٣gϟ?9="aG2盇WT_eA+$Ǡ~uq$]̈́{ A6;)xY>id2W_ŸUw1 [s"u \6.pcLgR2cG#߷kDv8o[<ڮy%1دj@z'yfv#m>\KHʧTj' ~ԑ)`z!w.Ѳ`_Sag ^7voFa}Yx6rfh ,r ylXc>q&{x1"D<̀>eYUXUMe\~v`ٛFhaoa2 G2k ;DjΎLZ~l׺".W {JG=`.`mVJr̄a QS/&CZ=6Myb_M۬hP r.H4PM8%{eA xy`ȩ=`UۅGT -0F~V֐KQ]NjsSȉ,e$$=ᯤA#wjsqƂH$>m7!I }beMhU"׊=BrEmFPX$=K57ԨVȄ>|"nlp|e9@B.ͭ[6h٣g͟6|fjf[76nlٹҳ>Ngy@gS:V]d-~&n;$|c|g;i]7 rWif':gΕ:Ys:YFrg*r.r.rlY`O?bo2*}-F$yLK2ml뫞ٮLuZ!HHV9sNb;BV)S2#B2b%>2ۚ>=4ۛ}=L;Gz< ͇49׈"Of -;ue&E7kNў@P޽7#ERm 24[s6[mzٷ)`1]JGW *W΂E^8u۴aH:)mpض6k2^aiFm=tUa8T4#)iC?vU/SKh[1»ў973ɥQ~ -Y -hE ->P5pXcJL9[AB^K5p?/1d=I..3gR1($c⾃_4kWG6b7qr,gY6Ց+s݅JWGBu2n!_Tp%c/):VDQJhex}mOb܁ Ydꪟn}l*o4<=3{,0|0?nquX -H [-| Βt::%|`J aΆ!/<sW9ؚ^Bq'f~0ߍFZHڨ՗j.ՖY*wlwZy!(X|!LU9rTOFHao0h7%4iZ>6ǻan9--j[ -O˕7l\{trG6 mVc XA=+fY#>t2W5IӅEWN|eOnGӖvm\2Dp.hVs&&⋔zM^f:| \Κr/g"r/'`rlYf%xiijGZ_NdfD F[B',L/tiͭ[6h|mHC#G[ϿL*|e.N;*L?jsqNj}]zHu>_ytai8-ד3LV,N,7ĦȬٱ"}Yz1%!.>q4ܔ e̠3M>Z@ @wğ$pD5fF -uſYQ}b}0cO& - ֖f]K \sb֝dg.lnfKyxff̾3!H'ӕD<KtǿHi('+_nl X D !#]c׈EWʖ+B;#Vӫ,R}*F5p}Ib\C9\CZ'ղ\4ظ>=S] `o؏UcR/#w8tKĂˆy#-䜔іh$WM5c r\0dd1=fy9uqXWWO7pmFIҼ{߭(#pȲ{Ce{LkjsHs˓!,Srf>dxh]Ά!Pω3[8-wϥRVA u>|5-~T5v3l n!sr=|d":ȡђ:SG T4]9ˤ3G9s5,gKK:Jx+VƭSqD賢#Ѷ#ݬUiNtdRMPGsXXS Ýf ?]dGYQיsf5%7ɿZdJF~6oK!mw~XʻɭGHڟH>%4Iیz -9/r͆UfDKrfOV]4 e#yX/zbt>]kY| pyލS)L[Nhr(,[H(%Yd<',g7`{HgTG?QW:-&XA%h])\әlkNtYvH@6@ht)gjvO 9%6C@mENRgN]舆m5ŹU(gp|mMʏL?E=:}A[hr]C|RVFxKj(H ?R?þj۟6Q-y28d]Gf2yԛʑ9]`eA O8TyyF1#EP-Jk%m܋{zG,r~~z]>/~9wZ}7 ]wjΩ( ݚl3"35龜lE"5T07W3s9wrɘfGg8k#LJ@̭emELټNyH7sV5>'կ7|=q͛nl#%;D*8V}~T9ʃ9UGaέ ՘ HZ&l8TȐH6t-gDѾto>tG6tSgA.t` Ή*SM8ɛkm%)9>([t+op+ -MWvZASn(ʜE9'B7ƯnWR3QbD-)RF1n^6HO sĬ{q {5~L0&;)Yno&؂]sG!>-GGgJDf )!#ƒ‹E3}\'Bl5$8{0$YnV]P_6 =N]̞IiOnsៈ`eIo-4vkפ~a3iG.>c5j=,gMO:ZyΖtsItgIt᪹ -o#I&GU'x`٬QbJ9G}A>at͟&e -ˮ'&rͰmƦc$TƑ,QPe`Q԰KPe]uZ@Nº7Ayq<+hSтneN2@=+d=޳ YYX_Y($a >+0Re/4UD{c0Qoov,*' -G#@83CK F+i|v<\?+# 1עY:8~%<ܨxNZ-zy!N2Ez#&<=X\du -}E]IsgUk@{bxɉnMmњdC?1c[<ƶCb sS鴰#m~u󪩦,8Gݚ&>nrOgHܒ$}n:n?gݟ۳nióNxvmṳg/g/g'#OC:j TkUN̳lH6F /:jHr"{o$ˡاq3zBHß-L;ŵ#=ۤvI-8Ndj:#$0#??߆4o8EȲbGfoPF -Ser:x|co(  4qq,pNWN#ؒ켈bVۜHT -8DOgxB>TR$y45s-45GV~d*YJhY3ȿp׼Cf>͛2?=alگ̶l`ۈ1]pW8Tr Fno>?g;ᓋWjTOz?HsqG5ɣx!sf㛏Xc]=S}sa -Άt4 L$.>"@=aOK􎜠us n'mvK\u1g&,/a+,I4"9aqz=n~A7\F xJ4xFQ.RG -hiOn)s%/  } 3CgX?>MWN 9)C.ԩ1ԢG!m~t3‡T7sy퇿{f͚Der$kt$)v5;_~OLv+8uYrZ ' I?͘-ğЬˡ>Z:t-\4ΎtPgEt1@&yzg.yvynynyi-9.Sn#<[G:ʓDW7K -N>}9bWD:f򟖽V]^rB#2ucq+j#4V+,1t$Ѽ)܊4(R˓Ejd2Ž? %TX adMR>O$OqW5wMЗM /2_>+-6'Ӯ}ڼ~K?M=Yk]tgO6tg"\K3.r%Lɓ92g"\K)Ԅsʗ9R*\K@I.~\[xH'%c}=Y؝Gvy&$jDf (w65kcR ZLşjqn M@,W i!'[gH$D |}P>x3yܩ Ft7GI"&zw2  Z=uUV1xyC2EUQRVXaCJ~jXu*,8W9sW?zV:kxJ@( f xX˧g6fC*%g\/'\u:xμg^3׌צÂ~z3< R\=9,_:&$YQ0xM׮զY+]2y^M'85 -w}DU6>bg˟h!*ٮm{l?}b)_gOIF=AԬEa{Ӿ+Ű?5p}C2nUG:z^"r(.t=,OG:z9ΚtԳ=gKK J =JŘ%ee`C%$hU1$uk,Mrr {7s=֭kcUT3eYT|&}za&Izh<B\debŨ.*eVVcβ!Ýl9Cl9GtYCzg]ug]ug]ug_u+Y_7&z^dpҳ 1"ϾO|Hۙ`؛@vn}ő: saQ0,"΢<ǜstyΏ9g6,Ŝpooqyie&N5EeQuq$/.3^ʲ\KoL[JAƵrI=l4k`J@у/.l>L$S4~4"SctP! =ʯ_k:YȺ-G3HAE&r8PDMvy/{ֵ ٷl>2nDG5|kIt:H3:JΖt󤯝%| Ύ E_:hū z5cz9+ݬޫV 77z>4/P5E^BY<ɾ^!'b*Z'7TdH?-G HcC&"\ֆޒ,tO]HT#rO*[w%|yu-~ $>}fa}{ N. Mg:[Zss%,Oo:{yȷ=^o#~?|K ve?q-mL|;fJu钐N4!zy5+}sQO'ݳλWϵX-<L4AC!>h' 3;VӻE: a읽C"q5>2"$d}s{7nlٹ{Gvy# 9؀₞dO@߰zF3ІSi5x t~\9ˇƽ󬫝el*H_ 6VRti~En@L&JWa%as`o.HX+u #nYuIAe[#'w(oq')񵸦ņ.\c4$A.t΃<~Oy#=fgga36l6Oc9v3>r9ɗ9R*\˜2G|znu?udzQ$aۻFl`=-aa9 Vhy'Hƭw wMce}^ôKlc}0& I5cU{:k Cx+5+g?4݇B:'}++#"nXq|OͻgMo]>LǮr95$D[cdoyZb*3&0'=ztOsB |WǠ}|:K@F )Yb@Uon,14eK >7㚟 rT[; Ij`R-t2ܓp4c CLY-4]O9B/oT؊>:XD2!Xڌw -we˼$T0FG/98_ww qݯG@.k!hg.2Z;9UC̓9ɬm9 /<46m9igrN#>0Cųr$v@?xE%?\ WcaK_9ΑcE;t'9M4I4>t'tc:<Γ:FΑ|HzI"#ᅴx,FǘD -[EjCAd+͠ha{j$\1"$~΢%Zfgdk̵A<L㍛*dSSaQxgUw_?#Ů޶L/[ +loiLA?d/E_3VCt΃ѳ'p4'u2yQ'}xJ8d(ۼe6)R*7)''xK;~妟&Ө++N-ir|fs|9̇9g6 3_::WΪuUUlgU[#GbWm*~O#Yq*>R6)^B3Ĩy/j1 -#׀x甝-}t({,\}|0Trub -#z .(E2@T -gae^@X$x1XKyɯQQ&-f˷,AyN^;l^$ʿ;9Tڜ[Nm>2JcɖĮ"fp4 4J;#q#P1^??w^(FWوsG'46y`yxsaϢi4aEūyA[EkaH}{{!Fג8XL]?'LA"nQ,gIc:;9XΒt3gE6t3gC6t3gC6t2A.tg͞_6y|M]6E 5SbCʌwg]#h ͍fxllU+3[uel#ݩFFvu=4aaR6܉ָz{{fK"d߶rӴH/[sL'zL_.:;ЂhLe7UWu lî g=O#u[ZS me S SaEZQ r;Ρ.7t9σ&=y; -$E vj59HdhP@Ĝ_:T ZH$@GO㚟lԘ^CʻrD |8sxr8m@ہ#QGz]e~Aoky{/JΝZ\N5es4 -42Նo(I>ƞy?RcE&?49cfͧ]:TųQF'۞kK4ȧ6 !%px>O[56Y4dF>&z]ÆSj嵰U`;pZvUYHbFS&] gpdvCg-K1P koගۛO>K*vٱk}̒ -lߴӵ˕X-M6uV+@[]#Z+qYWQ'e $|4ZWZ!,pvp pk 6pv]އ'\d01.bV]ĥikQ/$eTA]kGr*7Ʋ>֫6=nd6I6.֖d*[G/ѝ<-td86l+s9_s6F|\DX fGJ&kS7T3_9c۝[99[ VTGw; p&巆[e9y: -sC0~\990D D|6,v q N6`sC(`OOwbD{/|͍3.rLʓ93aAɗ #Pfs Fh4K;. })ɶqJȗ!Q,<']-bLK[מZ $9r Ć2# sgͼKc+.O`B3[dvImL)˟d>o΢u7r g}y2J^ -pgC\ȷk4M!?.Bf&-Q#}B(srP`F >[:1n+?Ύ~"F$ -8d|ym'tl%^N)O)qxAMz]ޜ!9A4(o:׸4 <;ehǯ\UVszy<|ϟ>|-N `W:٨>pv4]uy5nY;WˍY6QwHWVVbGe0U(]:K5IWk&ݫP`3s|8!!|&å:IkN8N6q zVٷ!8"R?[_WIr|2H!r8bttw!Ƞ哆1ZXϳEwod@'7?뜵,[_r[M'[UF ZٱiT{F/Xv0~3ƿ+g2G%]ݣDѮI4ҷͦ3l[#U!A{N#'7E}~5ob~ -5(Nb2d6Xȼ>+/k;*WS<25; NC*ޣZ87*XVQhafyjVB*ȍӑ6k=;6fήuv3Ug<96lc7XlgVsaϮc !U\9ɇ9QEmw1~fKo /_:Aٮ6,WhYV$J-X1h!{ّ>[5$hcbѫO&^YnAv9qӃ+*9=8]tī_vǃebzɰ) w6SeC 0mYcEřH5"h`W:~JژQF # #A$D{!43̨gR"VcxMfCIc┣/7O ~'2ӘU|hd'PnҼ|5v3G:ŵLg>+Csma=8ͧ6&?OAZN9Ƚ~.ؼ@Hᑂ8+5 *[1$r S+'a7OY׈PBU\;~8SEjdQ8_7 oLqH|1ӋL65zY4uSߐ$6QzyLuYb<#Nʔ<ʉEܬf :VUsC[4#k`TSK?o !allٱ3Opy6l9gOiuẃg#\Cr?'c:FfBfAF2PIO::xUB|@kk4u.G]9j㞸-V͝]m3sg:so7g3g3333g3g3bH2^Ս UR-vZE:fvw},#s nO&%mXރN%]~Xh -+VɃ:Jر -Vy8 SY ^ij́L#HdS O~IjӇmM~`x O}Vۺ,ԏ0'F}uΖt3!]C6vߵ'Up,WK,R;p X`ɭ 2\V~Vs}0_6ה~fH-r.!A"UnR;'6s0?H䑷[9~9[fԷl.)'fJVft^' 9 }T_&o|pGޟ%wmJswϛ4"/jC!ՇS._SiڞMW:jUΞrz2,${,rqNjsS 奫Mhա~y7+ -U٫z;3L[wC.ؠ?K,踖V[,ԥa0,gOHqb'<甶/ -с--(I]Uz3:3@Q=/@@ׯ ZfcE:Noԕ+H]?!c+h㛛76nlճϛ>l>lѳF4l٣fg#?nl96_NO,`$*7؃BK<kN[OIN-hmbiPEn+OgK>[[*۔7+`PY5eB R^3VXDyLBeNT޷Hm~Gj,%~7 X3t2*DڷަG*T3b]+mO 8T28=Q0gȸtu f]fӅ\7Ȼc Vˇjݷ79~_˹8 {m$I,>xl.%]Ǣ@NAS-N J󦯛>x99|G $wT|Ec)k|w/ˊuZF&yDcL[~,#w!5țTa(tǶ&^ {K>l;F]E{aΦKtWEء|%Ȫ"= |kgC_QWU-_\h%`OTVh3}|2}˾- I1ye,yAfW3uIȀKlv:7*0u D[koȼ_mدY}J x!qO%'g%EN͈1.$+Jj+Xp7J)>YeP7<]1_9 R̯ovW144TǸ3pڼ##$~ÊG-RԹg t5(YSe}zX5.eJkCǿ<6$^Mu`q*Kc$BBRK\BWAӃh'ZX[ԈE+Zd\f=6|kaG81՚s/V=ۂԐ|/2Y篘uƶ U$РmDO##q ,z+]vtNMk=9'<lZӼϺExUg AH%d 앜,ݏF>0,lΕ|ۀ/ϓ/4?su\W7U3}L֞+SgoBI#M4OWx+#W$5RF̺;V ޼^J~hT1dWPˏ"nX󠉻shøn6$U'Β|'Ȣ3xF|ϋ9d:xmM*G\ra#+<\o}!g~W7A$%v؂ _2gGvɧ x~kC)CI>: ӯ)O-]C: -9ðq[r+zrIj]1ٲ%ifD HUiycL>&k]9ndqں{[gҐg9cppEXgO_:z@U&KO"330pNuybM6p節T 265cr2"K󴜱 !7Luv:s/fi]ӜȽ+Ζt󣵞_>y|XL󠰽«(sլͩZuiVjE=;r4ؠ}j fT eW4?cfFf=dMOjoA .H0(B}uh@n]L{i -r[/gH_)Ҋҙ]0N] sg‡ĩxIOkar3.%kѰXM55Vވޓmؿ9K 3< {ʑ1fKu:ʸ/W?t>+{AP8jegɐfFXW΄߹r -E!,q})a!Cͥ^Q*ۧ:htޑf$h*F!̟WLr_iXܲ!>߫3D7Hj`2$GVs6$XǐF-K(y3q'/F>;O|BSr9\?m+TiakqR0.?)so_W/𸲛q#gOŰVZ6ȁgX{/͠XHsKG&7^i`ȦYrz|3&܍xyTEnfyCjg8 -~mjVϛ;ZU9ëV&2t50F.! Aaoog+u@{]+2ʁΑNZIQ{ k4qH\HqK~qnkⲢ8+%XU bՈG ӆkS,VnNJ > ╛i%߿yfp9ͼC6 6^͗{9~V jq* \Jud}78ʆ즀JF/0s, u@ڊWcĀ7^`q ʚ=uq -ˏa kDZIpmh}#,L;O]yO av$+hǤ+gI6tkn|㣼RsO*HpN+ @ǃ9ppuic 3F4l[kKfGRrzG'[,ųųŰhǧfy~ Zr0sy9/U|0ӛTX A'8rEf)9':ǓbYHd -vI )ͧxWjsom3eHN'V݉4x7DZOa*`0#Ш\hpQ,yuL(&lW3Yל:qdg.0BOq -K8kO@ HsinWy#9DZ5M#=,Ȼc.rܰ4P3F5vTfZ֖df~½Z'%jȪr)"Yv#Of͂,I -aӜp҄wb'pF)}AwA%~6YxraXd$ $!q})>m|,<[p;>lϟ4lѳF|y̋7śd9̋9g6ÜȿO!y#F Ś 03B.(u`]IΨ۟nÞQN vW훾4'7ś,HenL{[Gn`[Lsd,vX]]Gˎv c< -5$HJt\G:>#NS|d7jzm*u1m@E?Rk#}9fhvCTϓ5Wj[s !\RB3c&ߡOk_Juotͩ9=``to*-{/g.la| sj~C* |dӉx28om}ԡ&AP߱/Ize9GZ/Nu0b=1tɝMlWGg=Nk@:(LSLN#[MԺ)WhŰ("!O6Eg`b#əx>T'̓RUy2E/m0UY6x UdsI%)z'_^%fU1!ey"3#:k@u;ao`؉+s -F۠1!3jˤZr8bT;]f1l:XGe ɆSg }l11g g!s󥯝5|K_:Z+3rbLYɋ91g"FDQVjyza'p8Bd!1@4JF:{}񴐺,]|H /kߓtLf^}r)^Mwxy|gA JWh45dқ2}ʩ$UqkVn*@|]A#1q%k|˸稳kglO59I#"35y 1k3i!\d̝gPF"TL4:j#+Lmވ < 7ƿ*5`OS69s_9+1sbe B.dz YQJ"=>9/(,y4˘Բe8eLyJG6uO $q-)>[E'&sn:ԻFm̻^Au%dL5%J.{/8l -LQM).u+An\;=.O[c<|~h!)fE%8ݷ#JeZydO -sFH<+a1iJTh?9u54֎M#%_O]tԕF\P1?aj>~ul3VQW.A Xi6tnNW:V3]ތ/g> [}op~5p[Ji#qmF]Rp†8#Fˏ"ACvHASϒޱ"%XI23*~!X\ʸCo|l:rGΣgQű4 - -Wv8̚`wN\hAqƳ -BywSTXǙC~2JsΞs%I -Vt8?7>,(u0A$*ANdmrV}Ļ;)A'Q\Β-UXz3BPmnRQ' t" -F8=sد*5y~B%8UԜ3DBӜ,gGg: : NmlsiW.uW6̾S8,sE3;Y;S[V*ւ/PɾRjKzWt=51:I5$H},]1@\6M-?^vKMj2 9hL̊i;Rc]_.ug[>Vq7 5( d]R=}5jlQ\6\9jT)M1mIXB%?,MjVw"+4'g̛Xz>'>x#Ҟ>=G مkDupl⠓T 0Ue725s#ZjrN T*t QFx55eu_E׈[B-0˯FKURQu!7gjhxR_ i"|VhFs,H}xd\>X-嚸wūvyQylxDj:k.$LUYۭex>If% WzU~g"xaX95駅"!aĭX c&ѿ;vI,·HS@f3ƌ5_ HAS+4=(Ev+"v+)[﫤H -0ԷCW Б_|^R oq qyFTKThin^-A-چo#'#R1=-ll̠j9pXCs6!s.I,iac)XsEg:)  UEb( )j*\ ay _NJgMOunc4**oS d3Q۔WYɫmi$,2 pKD)H{ GE]rW"Wþjsq%Au@ԂNL0%:ɮLNWSb vKBS_h<9ɳx 8/ LypF ۲Lhs\FI~JJ\$~ܡ x BGpY&5 -ԏQ5Xe8_OC[6llޭr{*$A,qǵ4tS_UPxv$ts -Q~ 'HF6yWָ{k0'~aŁvŀ<4G4w˯ξuְ[ޕ;ëxw1[ztճbd tLܥBuUx/]GJn -%`kׂqny8]g|Oey\GOV'7\qFKC9zXl[#@i̥.Q=#B`#9'Xh:@7EG~ByeQX֚ts##Y$pQBU|/ג -3h'Yq jwuzf-$:MC[S;U,g Ik pP0ґXSjO^(p"& z0{][LINKfڎ+`Tؗk&_v+~5:̾,}`b y]$ÍG&< ~tYϋ:s:3:Wζξ,ξ~<nAU3hˌgfZLvVGW4UT}g-A F#mJA";l%ݻ5WNs/Usk"k?T>};rY&-XaӗUSuy^?AտD2R#<L*` S^}I#ߝ3~ޤ\r9"cwY;iToĒGW 7+Zryu\rXRe{1mϧu6E,yrж9*"&JRYHI4Vސ<^)- rY9P Qn_'\OC wx[ lI2_y_&"pnӷO+a|g#Jb2iO -]^زԟ88e؜&@yMueL Z[t~\Q")GkHanJ0:s ?eyώHB*,j՘i*+*itl>V*D ~Bh{KvXKǵGBjSxO.^n$0//Vצ#tʫPĚMH K(1pSX<<Juwi>hӜ5hRΚtA\g. l6E 7fݚsq5?|[b<2|jaRòAQ8 =r ,ro9 -?,H#ȕrmNo D]yj疮yvDe?!u9Nj~>I–/ϫj34t_}X7igRĩegI#>U{V -l.l;5yD p*jt>kK<֞5gZ<{3Eɭ)>K;ʗet`h^['ΊIR4oׅKa"r2_nW#M"\[Su>=[3]\+baLEjw.Ю%E,Z{0H4jE;J\‡XF8cZ92DCV)`~= -̪0b;g)Wt~ՠD~YYY -OzďrG+Zb~4RoqTIZqV]VM1髾U3CRY8uF N>]D_ kf>[}M rj1L'\ʫ!LH9ܲֆ\F5D㛎jsiґ9.IkM4"z3hwHCV.4 RfGU$2LIQ2o Zr5oavApN'<;Lnka_:3.Vs:9n#,׉f%8lXx7geUƍʄ{c?V>B-wwAU:DAUpU+O-i1:Z 0UX{ ӈ~xy '376~>}ӫ! -9/׭vavu=]LkF$*_N!}Q=k59mpȗ$cD/&U:֋9{r͈eQ$J.ax_J2R;DɃ90BqmɪIL3Gp.TkEI,>ph!JE<-U6?ӯF¸ylEjՍG;GgWWLg_O"MF"lpċmcc}xp"Kf) .FӆWbv5hU4^]uQG9VMiKQ9yD|V*_ jW27'a,9:*rȉb:eAq錧Pëv'vvؓv6MmY+%_oX<_|I+ o_:V_.O\i؀FѺt|F[I\%rGS]J Y[Bkt]Lh\JT֦u<&ξ|ac:9YΪuV3UKs&set SX\tLYУ5\Ir w|3+Az`2SId.[Vw ?W/;(_C,/Y$00 Zܭeyo֌՘_Ief>" !,gIOM28vj6HRC0ԝ <.F:æLO0Wi%e]QQ/4HF$/iz2hQ(Ӗ+rYYB(Za:bѫ i -$튽f*bwO% -ct1b-)2^{G x| 5"$ l9#7'|Fr :OT64hA1Ζt3 ͝^syvyr&yrgG]ytYgC(u?e&]h$-9<*gYS:ʙĚ5ك+9g:  -^Z{sK_iЏ^%әΚt3![ 9=u|@'69dXm-F]r6IcnI.m1L.2 !Róכk-25~nBL Ď -NͺprP66 >`+GIZ2\<7!a]i/ԕJ50[Dq3,C 6WۛB$j觝U虇.[b:g*Q$@"L!(zȋE5jF&{u%r)8i"T S4Q7mÍm42@3s`U(y\->*=qqY=qdq R﵅+Dvkl ÈM75k8K7YRP -Pe)_scJiXw֭ygn[[Bj͜5@4Z&yY8X -6bu!2gh֌1?m #{pYUg:rIW&mX&}*UǸǂljDw}va`%׆ |XD$ u؄+4dcOf2϶H:xc^#{3Ѭ܇:v72 cC:kU"F\ZhXDi,Vx|_BMɣA{uѷ)W]s/ы5Y&Xtׯ]39׾ҟnu6{9^!q ^9ΚtsCkI9hI5ԉ"FX?U"$h|,$ Wcm3Lq49c4T8AiAØ{b(;,v{ӻ% sw:úPfk9v14[r"'VX;"u==|ӷI q|F﷓)++衿9$Tα?~u*Xnkn5Cm,: >@Y.O[>x3ip? zΑemzh&#O߃}+Oj<-[yt9WΊ0ؐ\&/f!d{yHI*զ$/CAȡyyKN))S_/_vC?jNN*ٰq;z ƼD!hPݺYӡhl >ib}ŻMNKX'`P#U_ -[O1K4bEɠO:vԊ8}zwPX|?Me ocf<$s2Wd2qRuJFOi -s5ͧ6p.i.xH`gB56?F5[)4߁I͇6s1w]! pDĈ #ݜ@ S\"S؉#}80YO,VR(lȡc:I:ҫ8=lPeK E} UYX\'tA&HZGz㮍tF˱ # 'AeOdJ1p蒡GT{EW,\<1P~w>sۆHeۨew2zog&3~kC9ԳELn<:`~<\̧2!#%-S֓ū#gg Vw[R5Szm|NmɃ(m0?\ێbNo*wOjO/BVlR}''QO!s?H&Iɗ,迣/KJ>4ȚvS3&rTRx/ZG}$~ΈSeu)5Ʊ![0Zn^ΡxTD~uj0[H -Z6 *@җA@#΢ ;(Yֻq q\q\Վee0rݸHyf/|` FOqfX˧.<\.JmM.xy!&ySg甯 -i] aQ3PNg5{-8Zޭ$@ -ڔbi)MfZ9,|dEꛔuNz%#i/q5iX[@RIυwq37և8%>akl4MX xOQ 9i+}@ L?ȊYZ TE*`ژ8@W&'@m\(V,LVgQ_ $Y9DL2hkBrJn1pPOA%H#`|''YITbw؉{$r'In?4Y.s8gȭ{*Ü3kOriZh+Se^Dz"Cj7,}1oִ/TC5j4AR8« Q/0LYkB6>rP<Βtv3:: }ly!Z88Lq/+~q4_5̓ -nbȍ\uŎ&m9rI"Tmt=;}wz ߹h~T*7E5}5d`z:ik~X g{A,!I9F!RwJÇ FIOMb(WW=&[Bq%?+ݽXgx<ĥ^1=?7_9rfX~|=I n2Yv#I$6 76ol٩n%YyljgfM L\T9n*\#]d|)éðJ/:I --Ѩv^fZnWתntղzԹMc6>Dί]ltBz:E) $sa]2R73LדNDВ܊O&$Ҭrc#Uv$6#tn]Yaȷo49cuĨYyd"$ڙ|3@Gâ1#7V-[_#(o%C,/& %%]Eږ.uAádWlsQ;wTPjI Rans*k4s\ssf6|fNm9sL&|o}Cjn Ξ L#5J*,Ė+r^l]#c?f%[_g!F9ZTbL'뵸lP= 29e,O_2ɞlt4_yQDj\.:qY 7 ҊH Oe'ʳʎyRq~|2 -Aq7= |2O C}dUZ'kVQ o 22FJ֭-U -1lJn(S鯻F!X -!i;v伐eKmoŪSD˔Ux,An\1uq -*[WTxq* he4cQ¼VJm_,q.j싇$UI t|[ȶyx9Űvon1Y}݈н:_a?b1ŵ'b._ -ONT2ixPf%x96jX_^u50ax3VY㛎o9 eGRC_u3 f$\?yڜ1)Na$5c}o{pN A(ux)xdp蜮/j4%}桫^%V')94bhed\S9pr*4 ,q*s!wcXԿ]G4R.UOLX F Lۛ^'y\h9˵Y?8o; -< ijİhqĆ<|IeqߖkE2zO -q.^-[5 - g")ʏ!i̯n*}{Rн;s|*bAuɗ|!>:zN6,~99w{9K.tgM}4YA=,ɣxnirOv}Mp}:qUÇÒU:}26c˓9rf;o)sӝIyMS Ĥ$ᇋ |Ӌ/k&MQsvn5>t=M59G{^CiC"F{W'} i- !]ɳr]ImH5\ݎؚ,U,s5(dg:=sfO姤ʲݠWZugU* cK͆&>ޣƺw'۷:8lpM>nc4XΎtV3˧.<|˦iGs}5Z&')@z<1:~y#julg][$[(,G\fUf stb0{u2?gL-F];<+dbz氟j ,_v[,d{J!Qn,88$6 2^.L"?Lpƭق"}*OƟQ܄"..C\^І&r+/ dB,\N,n*yW Flj浿o[ ztcdɚ3*9\Mlnw NT [n6ݱG\^m+'Gfv;z;(u^Yȁ_59: pKoIerh։/rg_K'N1iS*%J䍣]YPUVMm+Y̕c2ՅDkh$'0m|'ȓmPz!}+n-sc rU1d~nڤ]w}VgTvmr~ !7ǚU;͖9_Qf6#XםFc[&s$M暫 FIzӖ1H qԯ窏:d_1} d;vNZe6rNJ2)@wf3+u*2si$e}c N\5_i١kSަh/^yd`|22* u5쬤)NL:[)΂l&/l3\OS:zyʢ=Ӈf;?܋rt7~DFɝ5N#L)\gB ]?UU@+ͮ}%k>*YW:ei%÷OuΚts8f -ʏN+hcf{g]صɫq :e[V`ߝ}2JԖM>XWUr^3uz~YTjRDfNk9pdeL#킥4/:0"wc ?]<_R1xuڨ{SNe_{~8oV<,E@jvʸ#Q#yΤu<m; zpp'3IPӎvK?DoQ:*xmܼ sW]:|7lԿ2potm#6=FU':̈6qm&̒񬋌ȃsPbUnIģ Br9#ǎE*[WAhf8Dvso+;=8lXBcvCm[䛸9$ ʠjsq7vw*`߆RRU[ڰZW͖h!ܱU@"NdUlwc.'#{ᬋG"n_,#u'xfZY9M8|A#`:5?H,hHqz6hI,h^*?Y 3e:muRCSoё]9fͯl|پCd\s{SEf s3|y,Or?n}C7fцrTE04$ C]>>CK1Άɝz#mdb$ܞՖqyU\RN_`#l)3F b/3Kg rdAbE?:8|91`H/nC =5y]/ΪWo}o s\͞D{ۑjՉf>ޟ4 )Yk(wf{ޓdF4icM]U$ks-ݜثnNاicd+U}xm~8Ȓ?ebHSbdR7aJymLژxm\7q|2OVuDeQ(P 9(KE9^_P&9O7Nv9؀Fq:C'*(j^+ -ڳWg - _\{fJsH<E6yr|H;'7@Eˆ5;{ k_̗-δdsoL#QηJ*>'ֲ@#O })g20Ee!lLv5`ͳKb9r١񱿖ju,{5-6RR S[6IOܰUX_Pecs㱳cf͍xYlE^#ٛsy7:HX6vy_9g:YwFm[o:KOֲtKxٱ+H` -|q9]^&VDS'isT daHqRL1›S_͑?RgiJydڔs^nܭ VeRhIJ7>ly\YyU{xL:]llOA}cߦ=LQٻ Pu,Ϊ uαOT}tv;Q!%s:Z_[LkTd:ALt+qayr&3A3eގXLy#!&mNF`#.!oZJ؊4L+bA LY===MT{ u|mq S=2 1MÖB̩P_xm> kE7啳jtU(T];K2K+uVhEH$qi꼮EX*SL,;5į>)@6,m8 Ө}'M\fIM'Enͧ`3n`q/[o+{f7xFZ;gba>:Om\L)7D0.^u HWC!XE 'aR^(!r3"g7򣻵PC!cRɲw7C5buf 6m9;uQu;t~'ӚvY]PY:+t˶E~Nc휘󔙱Gu1ۮ5cDvLOeyK ٱcf=)i+>_y|)H$I4U#UM!>rZ(@V;ӛNhFDBPuEY:RB3ꑕHI_ۮl*(U#܇N_.yc8LyGMbf=xe؏ -;o#Gn5@Dʹz.1[>,ҜPgKt󦭂3r=>|wu+ܐNH$`&,W8jK>hy˦˗lE&Н$ʻ'$C!vaR$i捼%wr i9Sr7? )}O2RhX5kutY[r5x]*dQNI?v*l4y ĻhK+iF!oBu_O# Gc9 0#J̍8*̮AW3\ZkUɰtD^6< r/#JS^RnJ4AJrhZUytwGuɚENa&9 - bB"־!]I9Z$!Kգm5cQr7  4*ȳr>cTNuUun\gή΢C,Ͽѵ4I`oVfͿ:r8NXJ*q 14S.~g%ux -L$L.(Kçy]'38/+g\XnpkӶMjq݇JKv%ΊLpXǣ:9s"X݄E&/~EG'3F ʽ☃7_HvKYeV$ NnMlU PqD#Z5/AgIWc<49͇6*|]o17zsKeY=$9GvSю" )2omw&n\ܹzVd3:93]sP GolpoBG3~Xp}^c.yiβ7lno S|( =4β bε?v }kͽ9Yȼs-Kw!d>"+b}+|^wt#$U]sW\:%I| -Fn -6NS"1#8ׄ Fs,^$i|)ܹ>@]*:L=F%?0TgW_ ؒFO1P|2>7cچ3UET\LЈnxHФQUybEģPo͜W{I)|"#%Ik(CH4ue?n^KHk:l*Xhj*ȱΉ%i"TFo܀\i$.̳$xps8I?ozρ߱I{F<3q9ŵĚ^P|F =L;Ў0^2̗zxxb#֝jo0V+YqU κ.p2ð|Jɷ~I~d`&IB}Hb$_P][4#喊3CUΆ?҂Ns]gW{ ԏZټ"ư̓M;zmnunEAˤ3#۬tŇ/3Ny͞a6u]c:οۄy?8GoR{f?WiXg;boSqߪV#}H%"(ǧ!|0v?5HƯvJmO΃>\p}u<$@%PPGg]%XRދK_L΢ S_"6M -b'X9a<.U|y:D2pw&i%N.ٲl);4SSb̓-T՗GW^$\˳2 ]&Mcʥ%=PSHB1hw_QCb)+iW÷l37LKdV|]&ә_rk&~)9 ƕ<ҞrkXNG16sR2H+epy CAX^r췛,.W]mAhREպ̗"h85}v]W%5dG]:[6oq;*I/_7B%):9R_]_:.8-V$p_-Z¤gӱ;BV3ϕM+#)TN}-v߄$_Ec~a#M֬3D pj~h'Y5XkHk.tPu Xeae*׊qRy x_UQ%/0ֱ0:>eb]J,+*QqTKbHʢ's H-+d=}~!-WHѽ4CA2GiHj"nZ dҴ̍:TVyugoG=}Cxf*Z浳ke&HBaxrehE< xB?Ch -2-4,VDzs{660w"Uή%B:v#$ᯡ#׾E`.ˡ.< k!#?@shŪdtb/F9c[Ÿ،Ft{ KemI,QriLuHI*TD~\X;hskfӛNm9ss!T_eM=b29,r}.TGWh==sCk_Essr5GxFrT#>~NF.77i{xE#}/0ج0K i! -Nllrl=9.쮝Pc'I*G8%$κr7x&'__:3W{2#] _Yo v_%KR0[Pu]-3b۰Qj)|-v]<z iA^&xTeHY5K栍GΈt=dyElG#:5,M+A˵Ol:n9.YTGTv7ߛqMd48۶h݌TΚt3BvY ώq͛5>?=U\gWW:ڸ6ϗ%Tdm4o  adhlWt m8ꮯ%~\,^xYH<2Qbb $549x,'}=TӻY?0ad: ~m)oid_"$MFmm/b8F7SS.sbKٲr-?|: yÝ 9ÝVΒ%h:YʃjMtr;Cx%{f3 "]}vPTڧ*JVFGL"6 G$Bdͮ0O7*&|'I]Y8D䟾"X]ܘW\Zd:iY:pxQѵ]6t6#H= -yX4M4zRFJpu^b>o./<4tuDX/|5Ť$9$ՓUer9Xæ;*c@fٛNM,p*oLdw2Ob8!U$:N$pX՞x 쨤{1.1nW5LOQGj7-[QV+%DD56nWIgg_Or͉t[.$_5VMO5&!H 8BcFmPޝ$v>hZ~zJTCPPFqF 3*dPE"? 6ٴ[FBΣ#qP +Yz9ci2(p4+R3g@Uɹ|ENy}|:DuLilU΂%ZeZX+iHβjbM GU\$jn[Y[k=qH;/x2,j0.q4455s_CNm9kfÛ6sOFWPxrw~ !ĀE>ń4NUk6[~T.l&Ό܎ =na؅戠NieȈZV[CZhV:Eh)=϶sWI?ݧI[65A%v?87oa$ctsp$BX&Sp°Gqz#)]6/ -@js[<@ع? Y<3S qě#2u:n*CJ&KA6bU*U}=EW|4@w//)5IvݠN!<#o3nv#k\@llEp |\&>76o9P<>9ΆJ/8dEdKvq څ]t>PԬYW"pcMaj3~p \6snm|Zc M3֓z~2Y29VU޾3XY ~n,Cx'^Pp~b! OǃW9;6`W ut41_H -ٯdÝQ>LϴOneͷtkM,i1yx΂<"΂,~M,`#h)A_O99"]@DѮ t[221O/i,=f}/Ψ3Plk̍+D<3aFkpDqmnNe`~ C貧+?\=7xm -[B Wj3{Kkcn9N!_DFU +iskᖯA/F̐FbqR(ΪKrӐJB|[`5i^h_6>ߝhsC/;ܘE!, f=VKh8[#}X8pT,_*Mlfٱa hmX+V-/"m3AGhskfrُDV3XToAMrq~gX^g|yA{_" -#}wk9@5IY5ݺġ4$G6TsIPuB"t L)N"XW`õT;6@Nd͡ԫ-Ȣ%!^&ڧ0q|1u9͐چvھciZ=:r1f<*8xD县Ex%vī;4S$Bճj|P=ŷr5_xˁXdQsԘ=# rO&<dt8lB3:3R>^s.~7_wG qq9~0aQDsXE);_itFI r-b]RmN))@2*]WʠQ1+n8y⹯ +/QC^vr"S9)$xKjh ']lbV8k4Zh=ɹ\6hgȤYP:orRWIN:gb5MKq*雓hlI~s VO58;fgdF$p6(YnlrU"{tgtOoϘRx,94r+f}̯rˬCn; VXF2MĮ|4\UJqlyx=U`莹nՌbI)wKVtG/M67&e`6Ya5_8ۯPBU"6&O$]k< -?9É/sFyu~:?j:x{<jHJIq[@*R(XUuF2!t d6cߺDz]FcCçPWѕ58bA)lU Qn:?|Om,Wc sml8Vf!ݝޛ"7ԐƟKƒ (P/-Z.u~!6e}ZphR!@qFbΆs`S n<5ՖJؔMG$53i_<ξ)]>]rZHdPӓP3qvF"WF4 4Y{I.c eȠ -kf*IXM2\<-EjER$&Yc^%.EXB۸zi -=$p/2(@ŲSx؜HE8kA68hLTţK îJVo3Rtu7@ҭDL9uՁ40_Fe%&ı-9]FϺhpDIcw'Jmw UFXjea՛6yҝaN8^}$/̩M\3h<{ ]>q|j&gHл%3rQ݇8Ly@siͭOSʍ@ @D` Z,ډu;r -sE.t'Ύ kO[r\81湮n9OVhƑjA֣ )&T mow،c&˝jM|y}Gs3kj}WZ -ehs2(!U*u*|C~Zʳ -\YWS$wg8j| p 4HWO[90fsHd",vXªuq'Cfb^|.sȣtԿWL8\88mQh(3K^ML -g\ :w1xAw᫤dl>YW.`2T&UKEqq~0`N>g$YD-]q %B3ڜ;%+Xiw؋n㩻[.}f.LPx6 F1# -*$*mЌ)C5 pQ呭ir"n@)د[_Z܍2/60mO&kqBY؂#l -@=hD"09T*ȶ>s^->[4r %&N1`3Wy}WD5)#[Sgke}3G;h~`\'ci嫉:rigu4b&f*f/U&Ee/ ekھ'NZտ0Du,`bXuQ_O<W;{ 2iȘj(VΖhm\XK5Xlu2.Zbf<|X`fA;nMDUc]qkqH_+uxtR7lSgw~,uPo%^#kIjP\dޫ/ݖR,$7/Dqc,Zָ4^&mgpWD^'Q 92g.@RQ{j.f͝ -FZS~#͵O &='ZY[:ؓG'`!eZF0Bޮ:¨&Qڄ'j4abMyuɣN %d_ʃe݄Q@?vNg* VZF&%UQ}NW oPw99TVV:Zid cRfxrYH*'&ִt@xsk:ZFZ7j*vhM<]3nAWb*Zcԅ*;JƿOܱ1ß@XjiyӮ?X!4d f?mF4YI]cī{3to -+OY jbq -ҰA$&krQ߂lx]2vDHB;e ŢJ浲yQW!3FS s˪$))e2^S=;*Z.鏅Ƙr*\f7xP;s$k؆΃>Nǟsg:s澟.ɯȫ=S%L$qhk#$(i*:T&FUsJdtEOɷWm|V-r]tfo8,OeWR'HxԐj"<X:ÿ ]uŖ;Gw&0pp!Ej2pFӆgׇH)1Ď4sk6ym\6 -53ZQٮk'.rjo{xVǍ\h$ß4#}hGDZOsQᯉ6zȯ5\ }>DiCP47h5pʣSζuԳjşiQi - r)ZEԻ_sS]9uFndRf,ʀaJe06۩)|-YP(`hreYQM?JFbq44Ų]+$I&4t\hXb:LSi!<ӝ!Ttt"GR2>O07ЫXe XNÆ^R/M[:jVW}mOeFjqsT궞raeN7rZm${~A}.w|5ˀi%(BMHF'v,Bq٦?\b]N}NoYЁ -M r+١p^_bqasswF$K|49(#:Dy͹Oh~)k%7 @&s j6 -yqk\d9Tͥ7ɅW4 $F]<#U1dS_! w>[TwI٬=βu1X0z'YldY̏92, K3t<׶7._ x$7:Á>"^<9|[I72 y|W9'hAb "]E%j߇R fPCW-wIPgq?1[I_`|-ٶڍ:ÑRm'Yދiάg:h>X5q -xPskgU9TκZ~n]vorQmbgid۰GǦw2 O_A#ٺylMuyYʏ~ Y,Y˚v$h$뛆x<:5w˹#nFv1ـbfaz,C(si͍Nj49EÁѾ Y4D9?JA :gO -I+n? .NZypx l#z1D\LLLYɇ9iiqM.nF3Mp?ͳKV(8@6H:Bt1Cܝ/}a2:?O]nB_e.مuF V4J_oi<"BPg2/v}dqSbkqmlwYnY4s,M :Q9LM(0D!ݳ$HS{fw#%t o5 xv,[=WIlXb9RYz,40ij J[u6ksnib3}\[SYh8t09G9K%^!)=pYyL}"UWs?HWhrzrI\D!SIg2*NHd] I]"weN1;j vZ(+:eSsaƚ0Ol'v5(ACU5E$KS# l?* YK1+ Bwoi'bOv_O#71 -ք5k_J:xfKEϷIt#} 9}3CGij}Y/ݣBG,P)IΙˣhFr"}0Ns1) vtrxHWE`£HGYgUTgYOg /WfyP5n#Oa>koo53E\Yaslʭ$\OMr(8+%eyy3xOzs?&/lOk |Gpb^Dį[ߣ=oGFx_H{52ݧŧXrsW}*"اb,WoWTACgk0g˭n®@86?H/ZY!f^>\WoZem\^b=eFFkݽ֗&s2 /4MrConWs9^-*K(g<2USql bϛʖŮozAk6cYdjeC'Avk Nsf3v0,&fN!wdΚ?[XnēI#q~?^0]'ڽFI93Jʼg+i/`5dŻT()َ Uw.ZjA4Шv3aq5a~IG x,[0κlVuoK6Fw8OK -h&Y3Ap8"0]s>iOs Suӱe>tӚ kxE<]Odw,vONK:>[ u5f''MeJj7+V6[k,cEzEΓ:UΛ בpYMtsVG -[I,2Nwʈ4_ȓ y> `|}5hP+,1JHZL03n|2!RN9KBŗSK B5k'>nYLlQp -'b5LDc_IĜ6q+BMxIri ѡфkHKgǞY|_zVԦhШ4RNv͘P2x&6D5qS؉Ybp%'Pᔏ)F{iC$S'\Ĝy|v 4OD}{k|٧r|^eᆹgIW#(t,G !G>lykզZ^#O߈,4v>ej#K@/B;w9Vi 6nEsݱ5'MsVn>LYϏ7=)el*C\/è'fHMt=#]K -BW1#ݱaJ߰lsr=ɧ˂Z[-M H xM9Ni7\Icp3LBpy g} djzk&tݤ_y|9&w:ݥz}rޮjzzMklqdV5?C ijs{(ԼJ!'suܟϘ]S#\1LOʵ}FUЅyUAIN]dF/OV4j`2U"AR~~ E'8|/3ql$X{d-sFd$+ uRZv(7k;O_4F[ߚq'\Mc6q R\V \o4Q>6KO - E˽Ldh |,ٙXGOf;ܟyHc_ ^o5St|.FHؤCwӈɬ|ۯW8#;.馃~1;;gOtۑfrSM3=)#I6ATlȿ1ע; uF>@xl^tH#]*@u\sAmgx/F׺@4܃Nc^T-{jpn`pҦs.C$/kal&dӗ\&%۠:~}ck篃ıE&H6kY#~L%ۙ"_C-vK##%NB#;jsuve^.^Rь? 4Y-qWJQzYK~m+uu3_]o0sxƏP7$#b S;3B /ՍHQ- hw5\ g|5;pn =>vk3S6jp5ܫv_4sO:7Gءolja&Mbxk1vsM9Ni|qƨdkfH;g#8tleΆLdBB4ʒM 3ƅܕJ#aiF<|% ͹ydef3Fޏ}I.ؔ# ,<3 kjZȲ};40 ܴݍfweVgY[!_Z뛉SQxBĚJ.Vb"tV^"x}#ªo,IZn9"dZlb6.$Ca^E|&T@|ݻ5آZ|YXE>J.:$4%ov(XoCn5҄-EkӿU<$d+´D;M$ "07 ЍV\j+8a]¹.Gv+22H5N!8tq#VbbbۤqqHZтxZI -xmt] ֹ,l&]v)ihc8GGs-9R钱HdaI*,I:5 eS[}v`4|C=`pׇI= vrIp\sbo{ \EpȃqvxGP٭.` -8)$o+GrkC\q/MչJyt$]C"]]$[#AŊ/&8N1B(%4L9qusBvَyNi$yKVP+sK"ҭ^#|XR=v`ʩ*Fɳ.;.Nì8[@'CҥcG2J!aKdn㇤+ӝs3ijesŶܲg:"iï+[,9:-9|O7ɖè@EFIR~!6LӊgL30ΎY)ҹՍ$xÀ5$2J(>q%X'nw -V5:7?l/r}ϽTNk$]5DiY6FX*F$t؝D8uu'efQvε vPBbYkE1 #Y;C qcDXI#$W,2HcilSh3vz@;sAAaeLK*x[{)(v;aƱXea#* %~Loc4ηIdd)oDezZv ̈́ݻ- V r(DwZY ctM*/G^̶F>Cm-4uZ\kӱo~eWU?.dXtXcL!ꗇ daNq%G$CXn~W8>}q%VBBi.+Z:$QW+#᷾># Q]M,nuo'@s)cCãɼH'!!bѷ!/*2dފqY9nv_BVg"z3 djw"7MK@pq`3xC3<ƶylx3.^G8cU9k :Uu QmIk1^k.;q)c1Uu6d3UcBIҟ=^ "6_'Lo˺/&Bq쵢E]blB["|lU+Klוu&)dMZ`4dzpZ&`hbv$mڳæs=fafVʠ{f(lȃW:<Φ# t{2%墦HXF x,SȠXwr8#vhsCͭsl%t9d[ ^kfͭ66llٰ͍,:损6hg͟6hsL49hsCXQg2ϱ 2J.3ؚ,`$5tP"2sы"ws*8dƳTw I0{뙖Ft9ܢ׺ Ԏ8 Ul׈jǒe]%՟ӷ:[klc[V+> *ݺADl02q]䩓O}+H%(. -q~T -T[pGsg6m|V/)uϗ+z#ͭ_4lz`pQPi+%UP1(pRr{hȚX'](Qt!Fx#BU"E:i~m|VΪβsay9C<<uV36s|Λ9g:lMs.stΗ96\˜s6setΗ:6s<9'jβuu 70q;c5-ϛ9af>${e#B$qϛ:󩱝UYg:9XΦu63]gUc ':Xζuvsvξu󬵆ݣ塝Mg[k:ODO6st${s=>l͝MU 7s̮3\3-gXe/:8bb{y$S1umgYg 9af>{: 5]H|ض쯰WpqKco6y-R#K3%i6 QW[r΂R+\_XsxI_m'VL5e>i61Nmb=-m9|8fgSW :0ߋ<oǘKa6yζusD,ϛ9g:lKs.setΗ9:\M6s|ϟ:Yζuֳu_ky839yyYYCIb0gAa_:ξu󮭂S]LgWS:U5cί3s`l9̇92,ÜȰ2o]3L6skfͧ6ٵkfͭӛ[6hp~l9͇9gUW:Tξyx2c% !0@P1A"Q`qaI%I$QDp#y$K53S53S53Ql?3Qk5_{"Ю.G\v} 4]DbŸlm=-)_GF! @],_]D>sG"FU0`L"}Cb"ˢ?b0N.?HP`]|#=GC-B#. $ pYuQg8oQ#Bpw+m\gF2ӳd/\l٩|G['3j!AE#O}ucJfoa{!2# kȵvoiwNs(}ģªW"|쭇WwFDI4J.o|6!Y/TwW:;R4M&C43C40GT~T*jCnŨ-GSb$wK%FDdXo/u1܉'ȖjfjfjfjK%##4ܽ4Dx$+17U͝HZFQFjD|t]QU#jG~Fk4ǰID~qܡjE_Ol]&L2dɒ^tU}vd1UP㓞C;,\FiXU骨Q.h{]*z?V5"Q$$վ$lY!I:PUcUcَڌ|9p'ӾQ4G+?|\2Q$J%ɨl>*:ȝu}6wQFjFjCj8H̎$D ~j,{KvN-I!D"iGpD0&>HtDetkuXIG] kWS5R0(yoaQ -#fG&Id&i9ǁ+$21Ic6oc]ɚd͙+j/Bٞ͐@tLbTJHdlȘ5b$j;,ɢcgzigj5#Qk5?);&ēO͓`}VM!jvG!]$U}ו!ګ$؉?[80>R!R"7D4E{.ʍڑ,i!4E%A~C*jR>DSBDlc2I6[EAF ,Ji -89JFl#$ȏp7ۻY$bY[[btb0ctoZ5LLLL7'?+Id %mtVX%bI}: [R:1Ovո1I$K%cKfn[^Cْi* B06RY-I.3d(V6"b2P.q]I G if6@ŹfbK%M2&3Ю\%MT+:p` F F9^UbkJhӁ/rxaxȬ'W1R(gwiFi4A=ض'F,ؑ sHF&8Iё:*Q>]r+7č7F,p#]LY5ɑɎ)zh%EI+/DTBz*WkG6@]"T& E93̐A 5Y":4F(Br9x:$ٍ1_$.ѹyB5Lkfkfj|xF3GFLY,mLgʥ%x(bUrK;!:5uKEpbs,:ǺiDIĨaܙ-UI'a]+0`(GOM#Q׭'|d D:!T;ELnG[zDQ&QdbG8뢓#O$ő_fƈUlW?Q(I$guX9^sC:Eb0F!-}GD3$~I IbQ$d6BL؁p&Gf݊I}z%J%5, G .k5gܪQ -:xvLAnFV\uTvM%gQHёQADJ^Ȅɤdyѻfȳ2=>+6r&D!k&E -ҹ*} L}(hOG;GlY$] C,5d1&C!Y ,,d3C43CM&i4 I,CpC!EbغZI,y\.")PQąD -V!B*!dUޫP$BHh1D:uT&~膅DRXF"F4bt Q<`҈BH$DRҪDBD"҈D"ҍ(҈D"ҍ(J!H! ʼnA^(Ѕ  0@P!1A`v,Ez%b3B(qv~;OJŘ8FӑwCyX(((qH߶E9#GC 8 p4x7aN_<zGz Z("OC7q1G< Z?s%܌~ tq0:=ZCzWG=+%ft+|Rp dhSp-ː5xgXޅvx3?ù -c1|#jG(iQ(cح#7Ӄqq/4n0h'# F(O83p+ۣ>:xf|%C#fh>a9T,R|k; L=R|N8)uE@ⵊ8S!?5mQKZph:Gh9нcb e?cCC_3hXHt?A}#(bs#2cb`ЇιG``ʢQ5b}`>Qz䝢TVjv,t,?>"4!_'|x 8!=!)k{gQн5t=wBK3DY n8`wtF-[0cn㎏8IRtGzJ.A*v}0POA#1AҀEʷӱn:'w=pƶjH''="'@Rb48f08`4 -(y$ x -pb 4|elF!q^J-f֑0-CNE;6]uCcDi<(`(;`7zJK7OyzYv!РPy"=J,qNkCZԩdBB`53bwOPD0Cз烎 (+ѥ dmq9<^/bb0гB -c@1~"lX~4qN=G!01AQaq @"PR2Bbr`#p3CSs ?oc9[y=QfRL8Z;+Ge9S*Iz/3Mvi5٨j.B -Vv;U̔,@̔ @̔,(ے`4xv_(< @P*.Gܦ挝ޞ#N2SO=AQ ->E(_(&@>@mQE4@&L>db.Fs)5|zH+ϕp 8Cg}SOl@uC`l 7>G`ۿ#O_!5#GU Z -@yoةGC*u8R('VU!ȩq:v){7bFȸ>씈=5N}d$yd^ê)d=6LkT!Hr*Syǖ87b9"Ii:dH=Vq#]У@Dn>_֚ (\9jsF#QnҶRzl^O iCMϾU?Jѕԫ ;iq Ht8›o%fg> mTd4 ;&.`t?:TCX:) +'Ȧ})xF_PLk%BSDo?*F(#MZB(r]̐G̊#d9jU y( I(]L^PǒPҴMoA+QD~F2QPfHPjvڼo) )QCAFjnYY{pP4媯PÉPF0*̓h8jM P!CL FYJ7gTM -&m,1\3p_ 0{~b7WjĚQM)`5t]\pQKAҪV\' -mO'7T"ׂ@BSiAJhF~&&^?25](1w4EǛ\Rfi<+1^JEO]\UJKBu5ABGT/'MP?1Lfj6MμEzj7jV+gejNMkuUȍ 䭄z+ssVU|ժeh5+TM9)U4Sl&ΩM2cꦘzW<VV4٧8454sRy8G0+dekWk[e7d_ȟz=V(^\𸊽ZvJxx+>JJ) =j2VfUggoL`9xziSTOz{Ԏ[ -mP=7,/?SL jiw5C PPwP@*OOO%#}()^^2}ݾ+ChB3ثHդ}J>+g*ʵm[Ru>ʕY;)$DMq\x+3IDVcuV'ﻍ|6>Wቯ5޾]3$D_=ei|g#t6>^rJ^?*%BVe=>A[_Na኶5hCK# 3NKx< 1>p[^;'k7~?)rZ(Vw+4TSzӊo-M%89!*+Cꬅ{5Ƽq<a脃5 zK_m~m[xU9-QW}iL>LOoxotYn* ڡrc;4r >.QF}Shkm?>RFfj:s -duOxQFjWU43O~vUktm*>+;)YҪ;#; znj8op:o4Jb, 6 -۪{9(UCzn]be?2.u'jnݨ QIJp ST ݓ - -av+7cbsZ8T)dqL+ƵԌhͼ& - f;^bZ -uс1šѣuDޮ_A5X6 -ڥfjfS_m6VVCT࿮'TS&8,N+wz( -`@v*jvI+i WA_<1AQԑrFvPP7 -߂)(HF5ԏ:SQ>n=:E|I -aU 2(N4TnVNh{~:6}*X: ,0X\]?U'e(@:@652+BMi0_oP7# 9(oGY 21kUREcUdwԬOA%?2aMNd'4NF#^]NVZ rq´[)4 ƽ4<5Exq8+ -*ثgTW:OǛU+r&+o*ܦ{۰^u>N o-LΉ*j}FsMQMGrA - Fӭr3%gfIBU5S@STڂ?QPwMN#.Fs)jaM|ivʰ*QR;+جqjXw6 Yʳ5YЬDYؠ>SiEN7R4IEumdv&J1Nu] [H8!G#8ׂx1({y+!h&=1PnͽL(7"ꨥ2h j#Lj5p5+\F˧Ŵ9-z5›([ʚҘѵ_lwk~0C -a@rkS.V)MF.㺚N)vX87`iU9l4L++6E -vv&mwQz˜pkv9Jg\ PBOiLM}g'Wk.lSTYSSn*'4s)<[ߋn8ULrSVfp @x -FURQR533^̻NOͥRj=ݒlSo#%d%d$TAB#NX_< -0sSr5bzY\Tp>68SytnLBm5Tݱ0Ϛ0w^ 'e5Wx#F|4sէRhС d -)Pp֊~Ud -i!ԫ;A`pkk`PE,䡇%B=DQcz`GY4D;&ID\(w&۴]#SNŵs8o0;{92 -LФoSlM;+ T QS V:>nmkMuBv)O+ˆMa n2S?B}pSQrQ^`ڰ44PoB9Q{Ǣa5LS<檷:9[\E㇒i!9^k^GiW\~RHP>^bmouzSGZzamO&w!@:HpҬ#U?PV8㴡CMK/:&NFZ7"R;"N~J;dwe9iNZ\~W¤uד0)^|"2*ҵVڅ(nel)Fm㡄S3Gf)S7=WMFCy5q:dh)৆S4븄k+JSjz!ji=U@3*k?ʬO`oUPr+vKCܢof8e]UGk QS3533Sǚ{]Tީ*H,'8XVzy(#tBx9pGz)闲SvS5LQ{G+>cAV,7iisfjEG%zѿ8:-ڭ@Ვ`B;o +$$2R5;>+Dh!; 2ng5Ly^iR+W9NUVU pշ`PM Ҫ2:Rm1 }}L}U5rQ -xK}wɻTߙI/b!%({]XG?E/ Je8k?ڃZ_LezT17Y8XO -> -# 6/EFsA_Mlj/}6OǰdLf^@Eܦ C|i<$aiqVO{ -r*rP+-[chqۂGxYnNtzejuWz{?e3G_=(e")BłVjNZɯ$o15GbeS -YĹ0y4 =Ğ>:{z(8ԨS'PZ -{皴Phڧ.k}(4cBhJӖ=Uh 5z"Vʔi ĚO|*}: -5SL+Rpk Vyj*#0{vU*:@ $Tl0ƉAUiBSpԊc)J+S -KP.fڵ@Y]Eg9Wk%c+ܡ̊*G4˿QJKwQƈkz;fVj$~Bz"%iJ%L:Az}Nf)-nc0CTqGFGSZ96 -?x UZqF@$9=;Rk$lBs6۸|`j x:J»qG^{pR2Z -,@ܔ-P\uU$xe$ -Al:RgSފ{qN -nq~ӷATi.Sl[ZiT1HZvRI -կ4PT5g9jo^ZjAa@ i]sxWYGC@A  n)*t7aS8S?}I -IAT=?ݩiܘ}ϪTN.8b?+;R{ Tee.B. -=C@e^78nrzg$zSLQDxRMY ~ Sv+]0( -7ukzhfjݻ$Q8hEզa7fa[q\;\QS״t?e+R+R!R);'` d2MfKBS)ODrsR~7bj@<E8y -J57ȟ _:kC]+ݪ;5Y;ݽjN)خẉoUo -fOuGkujvLpS=ܚOD.5+LvD)]_uq? n wߎ0B(BVcVSVS*0Y՘d -+7`݂ -rP=B5_qg*OkVdiN4VUke:dtP㾚(rjxPcE74ךo5u=]`>p쓉TBx<'-JRlT=TZ#Ok Tܤq4ym -CrJLǎ]VwSzw/SU5ީT*ҧ\ۿ~mSmFU[6k6\AΓ$wE+*B!]WUcTaFMP@gj5YXUh#E\z&0h U\߂oB٩l dr!>'SpL۪!Tݻi+y> [S -R9tVj/ioT;r*Tn4W6WTwb*#~TRj~0LT51PnЧT*a+sR4x+1TCQ!T_JP2SvS?e)wBs4R7*46/Vd1mv; -0gjlOzV~+C3j2n:۳)ޭf/-]apjryu7]9)}8'UnDhssV{Sm7B}df#5QߔU4kMxš8r,y'hJ;yk=SR5+3R4ꨈE ҟS@B} -y?uFYPnhqCڋ6n󬯐U[#* S PJ=骝OONy&ț"Wê'D U .B( !+C=C >tB}hmTM1n P5@SZ+ʋzFJP~e}SoZc}( CR - =pVPiM-qT:^/GG-U<Tn5E/2'Woe+a.4"A(ͤo;N:cA՚(Qs ~lx ['?;O!-šKAx'9MN YXk+4yf%[T\|\fZFBZTkA -J-p[O*:Ua!׫餦6je-~棻Ux<) -8s@D9`sEv|bGw7Jk'uloLmz(7)O>& -5of=TW)εG8S DcJUIVZs*ҭ*vnjvjP;"K(s" - YWuR;$ H(58=DrѴ5KnSWRo5j?<;'CKFU+opIBP|Ɗ(o'av1J+ DWvJ1ݽ84sDU`Vp";B̨CkvE%p0 ܅jvTr؛xAQT4P=AAD[]jkqz*p?$;)1&5DAD3Q #5ACDsQaFTnLrɏLz:eVk怽|0PE{}ZҬ($mB?@FsA]2:H_(ל8#\5)1ZuVZȦF(O̭`IsU֛[|)D(5^ u[<(@6y?bdBtߪp.}Y\-S=9+/nJ@ ~9VИHuߪg;ic[MnWÇʄ$ t҇T;$pĩ˜W-SO;35;pFee0Si`V -l8S^>5]iQҨ?zgijLPP4p:=E#?gCߒBisI?TnRFq)Ԍ)7iOM;$(ѹq''S,[+l_wu= nrHVv3US$#)(jy&E|Z~Uٚ35ӉU$lxU;3Vfn.fpO'Ik -l^Zj͒ϳeOC31< -; עBePQ8Vr:|*m@) 5Nj1܊|{iyN?OYZ;+u5R/uO-Jq؊8hFE Sg_D3cadd1d p=vL&d=f? -=;\iSj:. yEuq9(.gdXX(}Sz HVx}!AκJjt_J,d -XgQ%^$!6wLl"̨?@ϬZ=keM`ijL7龴0Q-rmҪ +&N#ܶC}oSS5ة@x!FQRQ5BxlkGS{lբ\Bij1 }?ބ7 )Xh`Sfh7SU -qp f9Gr:+4+4( wTw`zX_yګ(pyX{ưcO1٣qLAV1邱~fcZ/.򪟸VZ;hVV*ҭ*ԭJ[;bVmVi.XAo?XcoUSnY:j{Í}aYXV_/!WfeVMTqjwS}ڵA#NvO#ޯ*]RG_{h4ާ%ifJ2VT@O -JI>"Njb0O'Q7ǸmBDq.=UHQSzybrV tD\}F\wQFgs9H7U]?5U%RR OQȠUy(Ue%Y{P&rdvLcj7aGW+AbSN au5uuy^WrN=u#B*R*sVLOq -;jUˆV'$_ -yOrsEwQHj5VnS_nJq@h+3T5dx~º7<|^(7%J -OPm_cyLiJ$+m5;iHOq})ٍW·8~݁[ |+G*+ī)Uvmԃ\6+#ϡVW6ÑV,"puN@gbh -\A@ 5`8:!Dcښܓ"5b5grT=Lpc~<"^vۧAB̔,4?%7h4Uiz+k[U3/7uF EHƷ5<+vVy)sRw)^z{q4߫4rί󦇊5bٮ'Q(PhSi=upVZ[?Si4u6\tQNffii VЍ0T P52'V~݀N0 -\N'W -(%!AOB~kطyЂkƬB{BxQHrO9'ݒ8I&&HǦ8acy:z#FADTAD3* ->FT}ʋQw*.Eܨj3i;YNjEt*=Fgχ\Q,g4cMn+UvҜ캘צmJgfJ&V.Sn?=׸W|v[Z̫y{u׎eZ \<T]_2?PVvdYْ٪.FHhg?g΀o-N..,:cnQ:Y689!٥oJplT:yT-J_KޭȫszV|CB(-[޿=[V⠐=@X5Iһ|#ftHU5UV/J2y-Â$ӎ~n)N액NT59NsShVZZek -PF:PqL7Fb|oe T QSK}ʌSqQw)wpqUJ#hm4w<]Q\v<E<׳Q>]1V9}}}}]ʋQw*.Gܨj3aFsQ*>>2}ѼK^:F=Jƾ葵 -:?SVz"\{i4$9T|:5DM-E_T1)\`/TO4Ӛ>EtVЭ'VdT~~n%>sR'ӢlYj`rgJͥ|@$8|Ѽ*sL9]9j3P*.FsQg5DsQg4f^'P4SVֻXJfvVt{( j}P)BO:i$1G -db< -(0Btj+{7;nf4R7u?u0ZSʴVi=դVZZUZj)QZbRH)#WLWbJ4N$M7d}_=}4jv(8ӷu6/d&J׾ iS$2L2-cvWWMqV?X²4,)xHN'+p׊H_iqŤ*SqN:IN: -qN)8Q:NÊ &;C]Q̃; w(cFy쓎I$ُ凡B=Oo{)"9vYE(S#d97@pޣ/Y*4;e|1{xFyީWCQvFjhw'J% R RvRvRvRvR %'e O =؝DT,dSFeF]X9Y!Vb> god< kd4;~ -w0UƥEu։4^'eRy q -"HR+wyM5UuUY@t x#Vv(᧚H)ù<3uhSU^dEȹ_䋑r.E4\NviNr.N~I,QXeX]ٹXOuo#q5V"791M!$WO9)JiOy(ےhCWj8+q_qVҭnw-2Ѕ)=J쓝^zd!ܶ%'/_Jl?GkW}_WQ$SL~E1(ݒ(ݒcLvH]K6xIw3&EDnGXuW1J<]DvLD{((A>%YAVoU@O9YsQ:IV%ei(PG=lաZb+d*q# cJy?}4tQV&5A5]]S%w%w%w%w%w%s"̊p=5q_jeXZ֑Md -RzŽt]Z:5>U}Xug#2q:DHiOpV7Z{&^ʒ'"IZnf QLkmAW3O|׉$If|ng<ߦFR&NNN$dݒyOr{ܜ^秽9Nzs]AJ*-S^fFN4r!0CpBb{:(B+_););#QpuVwVO_+K5E-6#tL/) 1DG+4Y$ %ǒʢ!QW_zb /*Z--Xx(8..EuFZi=ըQVEZZ -;SNhr9Z\NVqeTm-8ZWX_]6Dǣ#Bp1>TO*SrSǛ͈VF91 裍Ǣ߂d{0L4lVv]~/b q+b#5d*kVK"=kLz软e i{Ke[=UL̕lZޭ/SIJG^^W8x!PS?exW;vFfjVffjfjVBKIIIIIIة{/b]DlTƅHrNiSEGtA]E@}0QjrcGO##:NW;"].F<׍Kf8ToV -[ÊsST@LpOgdvRF}ZƇ -bՔ]$ PW՜fӴs^{0Jt$uک"-ZުH8|Dj5ȠA*Euٿ}v*/f#8y؉}P#RL(3WsEnh4[s3Nfi94fٚ{3DWP=kҪ(TӖlLt4Vs‰+Tp/k{^W\U -j3<‘XbfjSv*nMة7bT݊Sv(j+DzE~jEb9`V2:8if=Si4ÚmBd5mu:k;mNč_7Ŧs:+sպ\RH@ĖdQ&Ή\ΊWS,U{E踦 - ÚT]Р%SPۜӟ{B[b1eNςw!\wאڣ>b7S̫Mjp@O/w ʑ^ؽsO& O'ȈN|[6`V]0VCyUb*k@ -m7PvE|Ub5ÂaZ靅*kzœis䦔' ]KIUmSJgMkdFDW:c]e!>עj7bNkUNn5LUo)T=ʋQLQFGdJk٣|HƝ|I# -+IUQRPzp @>xQYIVq OQ]b -!T}m=P9GvuVUD)KrS3?{ET$dW[h TnDsM 8@Rpr{UUgQ4U1(5WvS50 -nZ8:pʮ -;nh=T,B̔,Dܐ*qձly#*_En t_\SOM5a*%))DZJQt=ێpS7e/bFZNJw)JcukrPw*m/jRwV)#7[!+Ln0tīLyLyC's^ -W^zm^J D(+!$qrWq*ӹBs*Pʊ6zg*Rө*ߣ}Ug4(o+5UTdUT'3)Z -֟#\w![mPFܓI&&j^N= ;" Cx8+=GUg-Lc¦ 8xU^CwR+e0ѰC 9j*FqsVި:^JZNt3k5k54|w`oNn7qN{OU {hLB(Qƃ SvUuݔ5y'WKԙ=lCZZkJCJ( -&eUD⾕ kx1OǢNTL#PRx-M鰜gb"=:i&;Œ^TAԬ*@=ʴ(ȟڥ|cOʹiRd/Q䃆&O DҊ@jwE ԯNWn*:ݯ۹0A0vX:[+[}U}E[=J#w=4m> r[o7j$a!rm+4*qC@COvW3VvE O$[CG-kCܨ{r}}Z)V~YmYUY+7eg -d - -0 -0 -0jA~NL|k['V) -% T]g#mB&)Vw -|MJ#+TǢמT*ӓT[wnS]{[^Z?QRO~muMv(L(Mq1;ѼS:i5]2'Ś۾ u#n(ذ]cM7 e'ШT*+*څ]GnVUkjjZ?IR=)jLj3Qw*Pw)U j(bLTOVµS -fp<r)ZOftiLhT]6 k# ->g*0+z.uAԗߢ -[JrVӒ;SLmht*#G`{!)'cp ڵz5JHvC*j}Nh5[|( rbngu+<_fjvLמe9n8('{=/sVGUl[a[OW 6}ZQw-2cMة{)ȩ1G6G4iӇ0(?5 1f:Ȅ_â+ c+$aYb!GssDz+U)+MT aT. -.&Kh=e SwS -grk=հVҭH^xTR=J$4:X]~n_Ü?33]Z#W1i -ԭ+We9w-.)>SNIQ<$Z4hVz՜+!46{f}ЏtGtAB@6VV<N_* j cu A#mn2Q-ThuռU:Q4S&zewۮ8oy*"JJh_-jM+IUJLNIT>kfԄRǪd̨C&eY̨dP>J;Wnʪܩs4>? Z8r@zMoeQ<(T-VP j4GU*#9DbMWL3հT͢Ӓpp[VP6@&9?)[FѥÚa0 ,u9Oz<PHr( *a<VV0|>nItLzwɂփ٫0Lz'^*9v]~ 90oLz\G],wbV^B*8`9/b熨lSnEZD1hנ*r*{'(lMc^h;#eظhJ͐pP۵4I5ίF>S e}{&J\(ɦQ7J\NhoGQ0ewiEҙTo3*(W4C~U!VR*(Ei!iЕfIVoU}%BZw5 OhVrB*ب֟7 ЍF%%2^׺+Rԫ'ԤN4uܭl#zMS}] +-4Ա=Z<.x}7+?OxGxlHS% R.4Ц8tMz($)S++sQ:֧F, -:tR54+OmSd1PZ2POTnWmBA|ecDu6"oڬBТj-2 agNI˭)ׇIZ^{BЭEkܚU~{FƊ`'s(Z-5(<|64U{hۿ}0N)Wqu m?Cm>SDa_]1k -SآwP"aԶo"U4@)yWnQ~5BP2Ǣ}v.N&ӗ#5+>+3R5+3R5+3R533S1HJNanjFYm}OaFsO8GqV=ygE-;7Z(efjV}JV}AJϨ)I祵r+@>g2S~Nw f j+jUi39)';$Mzxc}B_XV7NY}QShmrN -+P4rPYR{I].=TVWxO`'ldSb8(qU#n0#8})OyutHjm<էVfkS\\\3f5i5i=6a%90FUok(=ji]جPQ`/Jh4$`TW!4)vҪ/l7G=*xD\̅foҬG#?eES񺩀]֚L^*Vy[sR4ffjfffh9jkhw)jfNCCz_v7]njzL榗4瞥4T}}}}J!([(d@VhY#xx/(]6c='=^=|h8ENU -sPi{dNz{݁ߦ;j@))8̏U++(QPmHأp mT`4Vf}J(B!4vrVp8qP6QUrMzb{:)Zx#ԩ+Tn Ǩܡ%LOjvg}ZZjY2 -Y;)d쥗^IT'֟7ըB*)?6VU쓟~M2ZJhJW[]xyzNԠ;*JpхURa6V1 -K0jZGU!yQj7N/p~TnVZZ/4ͪ}hԍR0SZXjjiVZaN* (Ez+YM2߷IVI.|)nlyVf+;j9+32P-o  -;𵥽+ -bzMxxeT1Ò+Dnq:cLp<5 K<dNVUiEZT}VVhy#SȺي8R*ʱ]7-Z6&\< ʱz[cB̔ c] q؜w&c'5 -WDUjUꦑޥL+h[k%am*S3ѱ2=f>-W _NHPHT0VZ;1Iߒ(]م((aD~&w ]@F oLQpO9"]衻κV$d[;SNDzy6bxdByUJrUE7OqS0KqRaj-V5)jiTY`I+4NЦ%ةM,,8o cuZu7CTS|N[rT#QtEPAJfSG^jQ9ԇlV#Xua*êu?x;1d>E Y&t,qQ83 N;dt -ۮ⁡̪^U_袹\5M(Nj1bP֨P$oe)謅UDWT.oF U*ܔA)T96U5B}K -vZmR4 -Tg kVR5 -` LTڥF$:!O75H5[iƻR4pL5 N>ez{ڭ5S)w+Y?U%ZSdž%UQWt6NOMWM.#*F){UKa܁U'H3TKHrO9';$ צ5Lz7(ߩc]((Yk+ɶ&biE/t*v}C&BLh ,P +p{!QMٟn_4>ώ;;{^4/g -gjMJtVpͫi -&dnI5VnJtS/#g5FsFAUʅEuEE'Kv)ZO-ZKJS*cR$j4:O# ^PpzW8zaz';9ǁܬdjS)Uu*N򏻠B*6P#G6iO *N{'hx{oȒ.hʔnG:5NčF:6Ò|ޥuy}BީRi[U![r%ˆ+h\)^w#ȥ86N;_2^PwVCXueTWNZ6?*66 Gi%HY$/S\4VИ)u}U/n ڰiFLJGGܨ…dfJ&dܓBh@ >#^^(wV':ӊ}FkthFytnoҦ+|>;բ<էfJԭ')NGRvsնElztrR;$qr4w /PUI:*r*+*`୭գhEZ:xkxY\x-@uS356JSr[4:דiU5w);}L{JSup 6Ax&wN3QLS.9],yn/Wy\vhu V:+Sz)]e.jXQT -QY{)zlV4Kjf$t00*VdfZ^rս,V+K3VQ8/x7'QOkܛq0MqN%%x9#QthioMs:+8/M;]no(FB1߁xS5D6S0IAf9@)b0!1?F %v?vP[yYZ@a*dIH*B*BvjGfvjGfvjCDStVOԭMh?MX}U7*(/^`j j;#F#^zG´ -&b}6*U?e:.>!Z -vM+Wwo<:>1Vۃ -pE-GBaB|qӽ[0R!}7K;VT݊w?P)T+D68qѸ(H<f³zNN&yꬎcCj-R,mA/( -|h4 -DX8(qFZ\+8 G]KIr2LWsWsNj)yOr{'99qJ۸ &HrROC:)b5# 妗}? -1WP|~*gfJ(46M!8 -R5+3R4kߊ5WM oEh}yyF;Q -MW}2R-wJTS)iKySm(̠gzNWv54Y)Bvh -nblB5Jm!UDžti'/}wHO:D۷C YsBSZ8-GΈnh𮞴Wi4vT 8d ~eh530AVp/R5̫Knb-ǙS0t%ZQS_@*#UjA~W#z]㒥p}BϚ/h֋q -gD'Lx' E{!/eS^;uP(i~adhVAcoSnl"~%B2Qa^JJ~T=06@gbwIy'Tm:j`WrT9=H(HSܞtu;i_?2J'8RJ)E<{/k{'IR8:m)+EV{IS75# Q* -YX;5tV9)<[SSŸ =Nؤ=RZ[uoM)H씎R=97n-WӞ1Kֈ9ʏCܨNeA@4@ޡe(ZbaM%@2PBq7;JS7fjUZj.KoVn㊘ኵ>Js8)$NZvJ}tnU^; -5M8l - -G}PӴ5QWzW J/FEC-ꚧT5Exhtv Bjd[nRh7w6m* CMb@EORG2G4y(Iz8!"5F1p4ݮSM9[t}RuF&xtlX*~~[u~cMP?9MDFע٢Cx^Z]){1Vug -PDSd̐fH xyo<݊ẅYug??f\{6G-4K#mS%™xcA`hݩ}l߫ڡ)GVkUYؘu<2U< m<-8ׄM^[>dN.CzeIP涪vfmC3S.9+F*ij&THKAݔߤ5)\blr#G5Ej9+INrRݠqi2N'F˭mFPWjMNJ+/*x~fIVz7"5QPnIiTzʞ'3opWU1VorQ[ovE[*vh>1`uZx{w򦒿_F5hҧ%1up6gyi*%iy#Sʴ-]@TJO{]K ¾U-՘V4lLs -:(jakGfJPG<0̧B:Q88rс.^֋O'@2N0P =?A%XrW<Hq\K/9jx 1(]ih4[,9 -Q'ɉJrR%&=<VWmU&kA޺^9)kCLԩj*{Y̩|f sPEp۵wC[cObp[yLQ%Uo]m;(w88Wzssb0Pe=T8h4ZN@u[xUmU)pV#2㴊`%)V6+;}eG n8\Q51Q7Wi=k1DG-[К xD>Ɂd7ޢ~gՍYPēи~f\ qF]Ab sgb26s-hg -J4QF&ںF>RڟXٹEjdcnvTnj%v;rhw ;:F)]Gd((xSHVÕe6HVfSvZ*Fj|qUlQ1F?rR*s'l[0<NTl:?;sMz#wj.k+,'3@E ;(ُD(u<~MJTݓ>T)PT֩(iurMĨiF)Se)KЩӱ<;?*yN{5FM8qܙ"o)S]YmQGj7 +&(1Na"` -YIVz)#~e$\:o:ңݕvOJ#0ɫo㥯u7}tVWqpN -i( -l=ף2Rf3cl׹U+,yd htX'P -hw8陌y Ίʵʵ -sqOk. -ChӑSqn4Nۧe -;QO>w|\{Wv -օY}UTnew=teبB")Z -ԭEZդ5hV*BSt];Np;ԇ%)X2}P[8pպ,(F䣹'O5)8SvO'fFU+y+tV}*JJ#)ΊAX+9c M6XInH{/TEwCmV -hSE,Ԭ=4Y1Z V8mU%0y*GL}ѽ4vlA;*Se]&ެ~ J0ԊW"4Su1E+ڤKS~xQ<5ۊہڍN:7Jo -V{: kPiѶ{'dʃ{[KFimfMzcTnLLNP~PwL}M68Ph8B9 Z _i +Cywy!q^Ӂ aÏoTjx9nRHnc#_!Ǫ5穦*E!R9QQZs3Nfhyy+TuFEo)HrRʈm5 R(S3533Xf+++)֋o/~ךrQ˒d)j cA(MϚ3 w"S.>OĬ]ݱXrP%ciESeoN}z9.(4iM\g2ChJ,aiƵط|w~p%B wPw] 1nĕ#P*lh4^>_ŵ^>4{J~*h_õ +=N[*B`?Mvnڙ OJ(iƉupJ_ŷR:\ Z4UٿnVhWniсRt{Q[$A?1+5QO&Y:X>pDgDoQJj S #Bs]-袕HV7ҞV'g -]Q SnN#ڽP|\<4P5p>%FGEU6E\8>0AJCsbt)UieZGTO&uM pNMN`r9<Հk -F\T=Qo]}/n ªTݔܞicNFܕ:5A.ItK?)RcJ|JG}%N?J.J/N RIZ3duH\OIe$@AEf% L4E*{Tڢ夀w@Fk:={9i[*x5ko T+O;m4KZeBΥ@xpox .8~ h&i潦j:kN4fTg?^Ы'XYK#cz8~uVcՙއO;'͚kʌM,CJVh -AM? -w hq@QhO*/z'Ҝ@Ě)z'A8({G -\RVxr~.iMeAB<3xesy[^jYuSMRm(aV|9!oꨞЧ9,Яml&?0(Zc>rrlY+%pB|ɯ&,B̔, - 1YpToBc@쭧 2[-dh=TT/z@Vw7yoDǿ -~f4؂yhޥLzԣ#utܔM1S ׺8 Cn5R]o+jj]6:}2q wN_K4ڥ)'`=k%܅*m%I^[G5FG'K@Bu}݋mtLWپFudAo-B㴣yOk)@y ?\@*6JX>^䬿@=S<5T:]>7X;Պ{)qCvNǚ=(,]^m> Mz9wPޔFB!h5 -+_AuܚJvj(F&(xDno:Nճ8z)~=uO V;HL󪷏LռA+wͥ9&&q Nx}AZ2wXޤ =HT rW'Tic*7Njw( nۂycy{†;T!CVK=QkVH0mATEy 88SF{B*KixQ:+):ԕF {*UBixRv]SMWު}qSr -;irh],Rܜ窒xBʨ=5Q;0?PVw$~oK3JHCuti_'C WgUVh;?hB6%2O̧Ǣu)EEu8)B+HV*'tP7YBXڬ91U -yE.XbTNեYIQPdwunPQ:cS^k~*̓)UԨy`QКdkz9h8)5B)ݐVSzi82:]ϙ+YktVZLxV VzT(եnLӠѡYơYOȬq*f.HAibܡ+;2Vvd ѱYC0(oBj5iځ̠飼QWjӍ&{@P@۽ iSޞ90B'DqyԷ ॼzSCiV%7lW9ZK6SPdfzI5VHd$8;1]T)jTOrs);‰([&y;w(犅dj|RݕЦT7'ZVqoeQ3 `|g4e~R uA2ށ3Ua=ՈVNYR]Q{ǀ*}UChS sRzhyjI TOct) n -b_ qN;rVުfLI{٢M@h/ -Z7 2Mz+Tc}m^.tSlVDPT)\ynqܬOV+VԬ垺=ٰqS mHMnkxUʉA"QrX -K¿b1 {ohe-NZ(98:Za䢐c}8DFJI;)$iEpଲNn*8Px oѰL1ޛ"2BHiqj^5MciJJgcSjSdha* :1VCSYu9آe(C_Gu265hnjʴyt8j֭VHUVOQH:ww e[/]TRԧ 1p;SKkhÇk8ָz{Jot0nJ&dnHm[|l[ m[xy(zT=ʇL+.)ЯbA; bfT]m)[jpV׫[V?MEZ|զlӜZS^) 1x)p{N [n5L-'hrQ3$dVD#Njv'U+G 6ۭliFsՎufx#ftՑ׹QX]U}H_N6-ǘ_c+8+ѰmVxx֊[Q A -'Щ^葆PHhp7q曮7F 0ᤰB8{&ޚakvg(qvT]LQF4eWfi?ZJU/` -Rzf$*W?iRcS(ƻv:@Ocg:wJ56qQ{`GOJ lN>-L-5۝Z[}OE ݂`wuWAp -VDE(dYߩD6%쓣 -q~i!Z{+QZdZޭuW+ErQW8¶:{QR?:Rv)NzךF hx++"ǧ!u*UV'wPQ/(ҪvPm]}*'U}tY?edod¸w 2uTQ -otP$NeEOSU -zcczbT ႲMiPtWr`R/ -mQ^SMX/ -$S=AFSݳS=>y}jnS{iCzTTEKUk"s ;iLRv*^CyM;Op~پ!FOõ'=Q0^9PO:w f~RTsF\O4F>{MFܓEDFiR0zp>u'f -V- ꭁ<9|Vj}]&r((Yx)0):B)>*TF&Dy!WpGKO4Ǧ9CBEwvDz=Uմ>t<@*nT׉?)e, -s*W?MRVRJ{H3*gQE<6izEiFչsM91:[鶧b$U Ќ=v+f(y9'JLO|nu.4j{r.Y)\p$;UTn4Ӽ da}UesҊAN"A .Hڣs Rw%j8(Û`WMӽm:B'S.' SުxéM{YRis=9P gs`=^]-#/E_w8֏ [ժC :_y)VzUY^gm;ty -;(u -8 G"x)iN~!ܢ;).zUZJ~@OnnV{-w5@Un'+cVV:HS -haV=cܨҊOZ;+GdtETݔ%1 - 7FA=<{SޯH@-GCN_ <, -dnJdКF<ʉC -qR(@ -+[+k[xlQ#ҭ.g V+SFoSL<+{Q/7;i41Smপ4Ll@j@nIGʱ?E+TW\w 'N1Ӫ_jrN:6[AR:U|4D'V Hx(ZSz}I(|xF6]ܫyr>)}WBimAsOxp- ;)vhi~) +9VcADA)jܫINSܞ)DC3 Y{M([/kUhТT ;j:?Rut}ژ[2f`HL՗VC b)3N_]4u -z;T{L- qѹ6jRnITR5+T&1er̠ -Zoe{&+yDz#O'sVEjr"pB(BimMkS5T1AHrݥrFݛo+4Qʌ9;|4uwT-A TLrTCFixicT^z:oG@Q?}1SGrʴuO-,D(Zʞdt>x (n -˧Y*SY8c Jn𢎉F uC&|;sJm}PԢM,ukM-Ac 5ؿԭ=ʵw)Kt*PtFKyF==UjEZQRV!R_mq!HiSԫWr]ʵw*xyڜ_xh V_@צ>o8ܣQ Q(wiIFs*3Qk`ڢ5T,P144p.LgdeNVbqt 1kLފpjin# 椌dge34lS](ђ}Fu -;U6M:S8̍J;h|*wen 1dy<{IxSHoVwV+\t4Wh_UIB8y,2 -S % -WIqB22OJܧMSkAXXG <.Q7-]Vz͠i犲v*YIVqw-,!Yf?*7fih(q; -6mS fP)SG533O.ao*O)ׇ\ -xڧP))MFb 4mO>\E5 64U>Z}j~>Ryvͺ8TOQ=G"DׂtpEDqpD+hާUZ5l:ACIDi1ѽLDqS~!Oz.+T}ʄb~Mncu;3Squ榐嶚MLÉD -!M5YVzl6&FӶ[Puy&k@OvJST݊R)eh< 𴻐P -/C/0No\t4B[QRvK>,<<5{ܤ)&vNԱPhvQȣ>qt:NqE Ee~ -y fP'ѿ*AH;)E2F;Nᾪ@l!ON5)57)ZU3hy+Zsvia@^M 1F!& -M,E?eZVƜTG29@h)DN -74pO(za3 QiXJTݔݓjx-A*sM9珀hMdܓBhCK!1)#o*ºdhTfI-d,@̔ @̔ @T*.6Ͳډ8oE+ S#9($<8X=T,6yƃJZS7NBx0?$x]JPRQLxkapFJ,<.Wwnq^.>AqFZ^ZXЦ@ߡ-)^h7CEӖzމ)41wӕScTzrDŽ :A^SSSuU -q*xVS)G"43 ¥ky)m)"U4S4 V.-Z/8QBbh>BκU5‰Ft==W@Lw*A'ThOTBt -@.P4 i" -` `[M*vjv4nhj գ'f(\1x֚P3-,7j1L"58ךB݂;n"GSLN#@7j֌+) uEnGUM= tŇ?z 5y7 4~CR8+VOz{Squ SLݔZn\O]-\^ЧfQ_9*W+sS3533FZ(>p;+2+3R5+3R74tjV)=0LiTƎ`Y{'Vڜk :8B{:VVn;ż -N21։J4hw y4lMcc1H4tG1J{ QQL4H1cBKIoi;ѻ؜GEpWo5;1p•X&鹒cP˒c+(:=+<+4+,Uo$s ?V?ԬC]ͮw*@0ҜiJ4-mpZ, -}֦hvUshNmxMOISLқm9,]ک#oŠvO:kXpݩ{(]#k)J o|śW GȩS{7bM'QVߪpc URWM#jQ}㆜]cqsUX9 Vx=ɔpFF'y#J[SHե ƪQ/7p'%)Jr)HoIwN( pORJ;&4pѼQ.P/spp#Pjcw}(tQ -';<1ǚhn 9 u*ffnjVfzK(& AeuTDTBE_]AxP:%1Y%m;l)V3XY+n/*f 7 8z!AS9QY{f>ϊ"κD TGS)nԬ\7<Udt IRx<ꫮ@wx)D -+3Onh7iDz謕o[5SK\բlբlԲLjj*3yÂ|#ñDܔy]LiDƏD{i0-G$۽SfjFO 2⪞imFҟ6j2wd4=<;FᚻSS40f(LQ1mM \aq^B&D/T% !*6i:EJ2Oatcb' 8GU|h*dWДo6\PŚ uu 9茺[Zqw rP$U/rG=6eZʴ 4T&)J.7'HRnR©Gג{ԎRJ#MujMot(H١Wet7O)ݔ9SHa#9Zj -VƨD<1Q3$\N4S34Tͪ'Ti[{5LlrQ7%2Q7$S"w[SÿH(%1=Sk^:]D)\ - }NS53z}7QAXA}W_|.\UES#F C\x.SK6+.RamH/WyRGD~*jF)ٳsZKULqmuW*߽6.hpwP}](NeV*U;tÂkǢ5AhW5R4i>iqc c(u5[4 -4F<</o2 -FejoU(;uPDzB[x>z nDuŗ$zM? T2y:6' -zu `uB̕ӪZB֪f UdmѩuTПJ"pVb{K=+D4oLjD;+)VG+1*;qU~!邛5 GCS'5S5J;]?Ȯ&z <VW`x,R -!FƷ_qռQ=FtNBM(%ΟY fu$@=4zu0nID{qu)&fJӆ -dh=4fJdfJCJɌo4$YnJ&Ykw`Nr&ڂ)h;B4D]'[m4PQ^'+)DWXF0ߪ Wzx'w}Gp x{7=m N@*QwPW]`&iZdb￰` -{p~mrKWU@A{W}Bݮx>ImJ聯PoODkEZ*ӞgC@AJ`₎    &&h)nb{#ՌgT(cF(}]1 - -R+@Ncqb -)b>()v#Ko=ݔ6=qMi *aêaaNm&Kةf=By'uww([Aw7Zt`uNy9cwat`rSHhhu18D5cƘ޺JnJ?>9jo"ݨeFPPA(NAA -?y7QT eSp 5(6Bp=74Zfjբ<բcQDR5S,{>*VG姄XMcy^RtꙊDUL/e!#5PnIRJԯpR;4~jWTLL3S?53S?53S;5+R5+LS?53L1R3S?53JԥJ+R5+R5+R;5#Ovi?*W~jg~jw)e7`JHGdy(U;zjdR*GfJqR53RN5(Voԡpݒzٚ!QZm'[3 -f9if=TʴԂ*f#PSpLV4fjf;'8 ?B3Q1&$Rv -R*gvjW~jWvjGfvjGfvjGfvjGf~jW~jW~jWrJT^I' -JH3$dI1(ءjfFj9ܘǦA=_9HrR*^Kة{3TS3533S3533SǚJԍ>_ACLLϩLMة{k&=DsP~Q1+!1AQa 0q@P`?!Hs:-2Q򑞫}FvLa-To;k-f~20~4='Ѡ߬}sp]dH6ӊ hM95SvnFueuG Iqy'"-a<.a8 -ԂS|ӈ19F\9Uc 1Kpb8\hhpa28 9i_\k`Jd|<pC.@Ax, Bn\ <'G'Mf,\ ^SLtG[-܀Sτ'{' ΓXV!b /|CB{y5%G`fnFc>x_)\4*)Af !#C9W^8*|өa8N\|| 133P' |5#2-0B℉ӂCG8 Nj\c:um7؄Mb% h9x6Gd{O&M?\\489'P/ pe⁤| 8? Lj x^9Fbpp c8vb*5/_Q ;# q|?.KXx#!>R>_p<ӂ:@%ߖx'<8G"q%gffnGEXRTRU"e `q([K,溭ְ1_ W~( O8H.e!q.BŸ!˴g^ppۖ0XmT#rǗ!qgq\TS[58sӆ eA,a8\%~3pQEpsoh:x׋80]%ՂcHN_ xL`BR)|㋑Nʳ b#i#, D5#.!๳( B2VE:ʃ%nfpP(/_@E.oʛ?L.J>"6=h}|"<2}F &nD`uӽ81$ -Th>-WBqK<ƕ'% bȃ7S })D6qeJ +]g=ׁ4?p?'g~r$0U(H>sHEQ88=WHP"<>z/T#1djrL|%fT^l̚~cȳ KX8h8Փ# S!&T4|a-`x!\'%r9tE3R[ʑF}>t W,tF#f$sL}Or3JJՔ#!s$7#ߓ|&H>O^F`e0-x҄l41Toȭm&8PIEWcP*eBP 3>$L\*WXUhk ,ÓU(դoeŐ!ʥ~::IpӇh闖c2t48X2u`A<1A5 B#8I4rhHe8 -Q2:@%N"uVk`MσJqD!IR $Behfl&|fQP3D[Ltms -3aB`օ xy -Q"EA8k\//^&p -t +`kA ?'`҂.RuV f#!3+&|' `X9@re&"Jb$CH2y1p:+P1r B-Yi'|.!|~$pUAQ{*zm'`2ʣK\4s¸P)HVJ +B?L%zdy߼ C~xOpPCx{3F EЁ7 Ei^ *յ -tLAl -a [d (%N< *:B-`IVR2$Fw9XڈtHw/hQ=r= F" h!oXk N$ -%<J9q}&|L'AoZA%+b Z5lԫHua MPEAQȴ$zЄ6PJgM ߄A&e~`A ߳G]}H.d'@ -SD -d ө?ʠ 60,=qI.~N2_:|y $'D8'(EH@Yo4B )~d錘eHm_/ 9,O| -@ane:Rkxr9?_)̗+8G>8O!$f:U"6͋MFa6C -DEv~$ĒD8g&22G,:X~0prPKC~e\>]p"|hڙ&r|18"PqD)ⷍ,k=`@CTe  U53CTaD#.%q((oIerC~FQM(GJ 995q -E[ƄT+|eY>5|kk4Uh!¼4x>}\t.r;-|C*cj}3*uQb?FJ3B/0)B* q9*?Eԃ](SJ~Dӿn- A cFd7oܕX6~Wja|Ƹ$;Y dCL ͂"#BHsD2vpiD؞#bhEb#=62T0Kd&G.9 %Lrq3udK&@k&z #  PN1v<&`0VzIP/#Nurs@],2(KLxd,t+Kƛ7eKeK* 6P71QWd&tS M$B8`Xٌ3y!),@su)_+BUz^w!a_r}>zY-A`tϪH+>E-Bx-ra9tdx~J`?L(qkԉ${BޜKȷoA'ɓЊϒ  -|/oKƱꕖSQUPKY?3>;M|@(qmc&;*, &Sw Jl0iX3#uUFWMAl g2gZ{Cw@ѣU38ʤ*)@ -ʧ"wV&KB[!8O -TZH?l9b ɷTnxVZhFpCỳ#C()ø<^b#{f$g[" R`Td -/pA׀%]wU%)Lկ^2 JB'.r M D)(). -}zHxQGQ@􊶀4P9!BGtAFCXHUCժ6x⠚#m2'5.hcFF -fHAwM- -lTn3n'| \Rk? |5E TaSK f@>FVf\Ou չ)7K d0b5Q,]Il‘X=]DGXo}GH"b(v9٬Kq(4R'J/=fe3*EeJ%8S A0Jxg',?SgN9A( B)HU flH_!BvZ"s5Br43f!O|35zϑ~Tuq>0$q_!C|Kzq<lp,8$?~;BAD&e@K C"0 wc4`A0":'2L`BUW4!euK_ I %fFE:: -b^w=-A3@a)i7]Xw۬x:t*! +.k:G -jzumvsbn |e`͎M)l|A$C;F)[@QyRa/ zj(񫶊 72qǂ= -/ӟU2CBGu-IO=a^KP4BÐJE`ݔK0hJ"U?r'gpd+ -@ 8Nx*W<Ū`R;\T:aU*~!UOND+s>_p\EzA!Tج6TJx"1%At4ج h*Axbᠤ3Id -ACs[^.`)M& Hk-oX^qa^dDrELFgˎnc343^׍}bР. -^eD0Ti YƤ 6. -"ˑ]y6p.0 %{*@mGqpb*z9RX*GT0OΰM -s\OCĻ24,mi.GH{&{hu<寊0$'Á|}L]H^.,? ~ <<Ɖ] VJ3C[>>/8wd#i>?"&^CLoe0UlrW3 `.GS!`Lpp@ˆ(L,nX\P\Թh<.6AiZk `c8hN)D >׳BZ9paBv9v*. ,DJ"-7lV%4ц(@7xg&xWP&#@&r3,ݏ/j=*hy(T"&iOƈ¬IC8J/gLTe$?4\ALH6!% -Q 1ٟ_"Jџ,JQdQ>MG֛Q"Oփgi12 ^ja1%RTXVSK ,1[`9F& -qS ֪<τޠ[ ٵ0Ax>oyoYME C -r |@4RcYmyshEw@r )̥1'`;6C<$Cj^]@Kr;$IU*J Xzp.g/_PZ<[;2 yf/cRUQa>{qzxN9I.CaC|cnD*2830RE {f G6Љ ")[ N܀~HwJi)j/đ Fŕ=f [< Ѓ[BD"ᡅGhzEplpD*tt*h])|C(NAq)PpC Rakϣ0jX QAk*y!:% nP??>AS|{q-[c*2y%># k$AUSW C7E6H~Qb97 -Dp<9c>B3 H]c>qN}@ႵJ|c tYNi_xR߬ E0 &0R:cTcv8҈Ka3f>&`#<;P"tΨy"@0[ {!KkyP,cC\vw)ND$H+O7n t011} Rj$4&6fGIJG)ञCB7 $s0+.υ+P_UacB@DKV#sQ4@<s}P"a@@&ZBnA0cZoIabx.ب ϢXZ2b-Bcxv\A j45ZO 8|vy)opAʀ -#T0y39  V& Cⱨ"n%z ϒ,\gLRDEo ʸ̘ ç^*ZPKJеCr7k[ߍ,/ mī9pR_0N -ro-Q:Mi Ty*cR'OQ&Y/5)5iZ+3*zF/[Ҏz>/|j&W 2KQ}Pn#1>{Of0Ud&w %ˑkxAB A - <4 npY{vr9a\)KMi%1# PD1LsXqEKl5T !@Z@hO^R>0%w”8pCB :h@U噌 Fr*(+?!{ШyiGkCӇwaKY<ACm -)BP*MYV$Cy2 6D  '\7i,Axz\Bdz%E{ZA`X'ą=:@%B%,!N28EtN@J28 3s=! pXFQ" ({'BBX017ꈱLRZS! Ec*qB= !o: G1)0k1EpcXL6ѱPH}&23kx/B!,>QCX -כ[hW=f T;[3(e.ܓ2??U\K>Idn2`@cpf 30K9РDfXU*_3j :v,*o --eY`oʦpܡ@ @EK_̂` Xt6A c {YAZu`/ -=iټ(FdĘZE7'ao0χڛ w0c$1yRЃ(mB% "f7l0=[d@Z;CP+hЉFǬ,tF@ z!B vQWN7q &At4@5Vp¸ scaqa"%5%A:CZ0zCSNĢkBb9WO9= |t\#\?FNˠ31Wp#xM:@DavFx,=pP+T޵P'+[dΪg3-Ql<(@K0cdY2{|w rZ d!`9]Si!QG,W!6!lA:GΦG r:B`pZsox3x3!26f rUث'H( =YG;P!d0a1Hod:yY|A24x/h[4y1QKetTp*K&|(tZ/!V!L,SV{zϔ=S~ܑ1`c,/p)^"u76R!؀1 ʖo9?!b=d%Dq\~\k(+rIHWxn@ye  - 1^:q5YHJ9p{$@Ph?reZ -2-2@ȋR Lm0v"y~B%bZ$`UL!x8gXr^1Adg2IBn/1* ׃3QB]x9r|Ox#,2Mپ&o&6y6"2~) LBR €9\Ch[7׹vvhI_ 4iqU Bg>K# G |Ip4~<WAZC{K'G#J }O"`!pЙTZȁSj͙q =b>oI" -Ht<`ȍI+2[@0¢Η8`RMTwj<)j&`Vn` =D=JHIul!TCT؟[@!00B*<7c -2(y IxǏTQr;_)[|A mJZ<.CGZr( 3%\)ɇ)_b|B_q&AE"a01NBSNfSBGUqiw( :k)$e PRAM^R֣q4! \ȩ`h :dd$u3CLB* .@gX@]!qʆ):CJ]ԳHn1t78 ^ 2,;iX/,In*吙LŪ?'~D&yeeҋ5B=.$[}O}ϒ~=D%~4Jhm%=󿱃Ƿ[ p D9DU!zNxplylp fv'A)|ZWCW1$bFW]ԅ7Kq I9׀~xN4)% p&{KErˤFQ CMA]Uh ?hAmm1.C̹CiG:<@M z#cQ68a*)g/?cЍ;(uoBΈ-)H-PAǰ2EIԿ~a ohAIqpx+xB$p>yߐy o< > IXD2"̬8{&À>ǒD$A&UWD܊44:QW9%<+&;Pd']Ÿ<ߠ0j?JJ^ƨ?WVB4݄Y@( a.lD!R^c f)N5O8p1GE+9.a?xL{q.PgxF/.e6[0! '?W~ QA:{C\c }.I~'z1Z `v0/.!Bg0V%}nܷ(5lԯH7Ww~(dIfH*N=Mu󢵃mvG*zDhU [3冋hhYb*NWs$T(  <sB.e;Y)ŹGsGC*ci@">h;`4]aNx6G($h`rʹD95{>>>(yo /jX=s -2l <KgZ=gg@Go+9;C)=Bx|BN b!p#KRhCw':V4C0CWhO$YTՀKR a9lqHޠBFMr@([86o,A8 xTG8 -.pUg/A~:2UP#qyS -}$$]C6aC$'Åf).Bqx\(N)i@pTJ? I*"&f(V:5Kt\ 3znrސt̓p\ FI қ@Ym7 ՉrTBY<72v pF,J>08p @# - ReӒIKQ U&3=!mi O %RZ1X\'YDW&S8^7G0QuR*)[RVk+XЃfC )6L3blb߈uf;3:vu1FC[sx :{0 >đɼyP+gw dhJ V3SqcL]N?1"G_7N232\n#2ܕQ!hЕDt_L+\T[s.2GNyO'hs=懍 o>3O}wg>!$Na' }C("(|T1faB6Ew@Rȧ4X.et  7XD# z^0^z+%K?yNy yQYaٌ/hڏ`T9:_Ŋ . -]M.A! Kb8, uBTC \mNP8Ёn '%zi~H%.;D4x s Bz>Kՙ/z?^B0$= c,xk6M;2q0A#h$l|c0[B g֡OQ=Qt +0`m;%򀃭! @E6A6D,&[6h@ 8+{S* rb1OhY6_=& y(˟>}3Q>4J+8XA=biR0= -{s`0FfMDJ(xn+M, w Z}ib= E-~Z1b95B< `ưKnqњXnKq!-IFFvƥ+R 5g"va :i/ ,6&M\aXrAjkqrDΪVB(ڰƠ~ -*FH -T 39BHlt,9F0hW -̩n~P2cpBZTH>,>lR[}qiw9|+Z7^\iTv -=ώ="A O'ϡ@T+mz+(90 Mh _iD?E%PE57؉q7@tm}IQA=c\xzǣ*7=>M3T0:@bY:')8bcÀE)d`N~IƊj,PGbJP 9$K0!;.tAAx -g5% g^~QtT3:+ #; epgB\=,|ub!˼ȼ߅ D,i.2 '%ۂԇ#| ݫEH8 ()}oY7!AՃ 0 @E.9~zd=#\Ou31_ F.<,'+4n˓ZzOSX - g<9BdaaK! Oi?ɛ >XنTh/oE>Z=↘?j_ *[}% -ӂbhE5E -;X S ث AE ?)@(vkfbPv, 憰`ִCw HQ vGr'9fg9NY!{O=>{6TGC3LW'SMFlcxfX |@|ʗ]8  F -u!lXo'|{ d+@c`R]g؈? r!cPp/7˄-ć` \ -o%_Eԧ rb^'1 2s8i%؞HO YX1ƞ/rҞQyϷUc?v{r_ԔQa.\k_Ds?PzL/6FA&'_笣:y]:`r?H m.+kΛB_"8|xA!,ܦ5kƼ %3" @ 0e6@h2I1)I( A`a+=C(eɊ<:%aq00 j xͲx%e&,+- -qHK8WP~5ӛr^RD?(blhey 5Pp=icledyQF: !tIy;XO,F Qtg$̒lab=D8^FxJ=%6@)PAL]H:$sdobphܛo`?=CĖ 3{#FRs,n5)C/$+jWC'xN':o.ATiB pиx'C#-bC-M2>O)>ȟ<zwBBeopNHy32l*yXBo13 #7=3?cmBLYp:Q)MȠa/e C(8v 딴t䇃 Flp9EdT&IͨHJ9'4"8VYo_!Z>HtXD2D 8r{J -HyM5bH4\CfQCp(Uy%CdY@@35"]TYNQ9C a6"*m~4 Hw$y od.D@2;B0M~P!PC ԩUPH;_nio#s.eQT膡ӗX]96Cx Y5RK8G՝1JC\ - ! "_17#ahHN<O j)`!@-8Lzf8o |d*8WiHIAɔ X,a'PTf:C:^Y?ϭUԇq-Ci (nC/aM黆C3b8"}7vo'hGhgG#1n\JDx3ϰuu>]хx29VaK?H4?<0 . nצ@q@Cvs(9'a"h(*T0U[I#5R%8oQL5E D' -r1;ϽG|(*2Jj(_Ł݁(Rw2C6ܓ#R;)zs& tc+es)#[~77/Cq<\D* ;Gb JyJ:|s'@`t> $!' D)a ! -[l6Sk710&(>w|τf@%)/7BуۀDw-ySae# C'D1T*gRWa>Atf ?L"HZ5!Ӓ3$lH)69rH`Đ$CWxp -r)㇚aA\̎h aF,p -bQE `2D%+ZNl-33(aiB"}G(I -ЀH.4ƾBB#G8[P`g; `n8]hIJ0o<Meq#b!0dY>>| -+FX. gYμ+ cD?:m -TC[Kn G1ȗq)\1O -|iǯ"y?bΟDnsA8# zi^$;m:K/A0 _q_NKxDh^7n[x> v ng*,:$I4'Ty3.BYsuB$>7WJ" y80` ؘG` `0VX8+g, -z?IE7n0*[Okk 49Pta|)2f*!!"*Foxi6o Up1"\c ꁉb؄.H!-=PdKnz )dd}YhtPB$9+t<nnfbx(fWH -aLr̽TE RI~c(0Ӕ"p4,a{ (K&epn2aHByF8"{D4 Ϡ/U J@jF2(O!_}'|oy^Do1IB߸{8(Ġ闄qBl#)WE! h>A0A%ҍ"EaH rO:0DڹъQ]LdY n8*u ( k Ĭ/Xs-:AFzpWCz)jv046WaJg˥@Afػ,a J.W xK^6q -G2/~K<  @:ϟES`Q #'l.t+U @!; דRq|`!O X>S#eR+uxHL}'DH1"'D(PAv) )(^:p|9x !'BQ7x>$]=FQA00QIr2EI"_ Re0JG,6Rֿ=Xx0Z(wb_U3ƐwDQW 3nPrLu!jC>\@u?0W&Cf҇GG_ zM`ޣF<$"/I齠 `$fWR58{P@/+Umbez3EjjbBOfii)ߤAn޻-% NJ| 揑#}x;b[r{#`Cbkx h'J.BX'Pb<@ck@r ּN1 17l# -:zW P&P%BXey}|rw9ȪQ 6|4=AB֎&P/G}[}JAO `L/⋈%dx~B>..G%Y!>mx`]74.$F>o|̣JԎ3gϟ?>h5j?|a>H,B t@-EqK9fwcCVѨW!1!d0;G{J_?9XSHB,o8W |wT?% 6#,OĵdY _1Ze/יP^.(9GDj((1ϼ{}rF+8@]rrVՊg!6W89K؉T u/,cnWxQPC 8zqܾ$YگtO1) YP,߂u-C*zCgv3@ƢGE#BN53ӊhɃ V!R.ۂ.GG>>{M߃}3}3}3}͉oDHz2leE%@Ap9 @GT2܎b^(wA\Y^Se5H|yZ+TвԏxѴ&1.G`5r4R{#BYc;O H:}&Kiy ;eV7RMa 4$QQ7\\BG1J -p8["~SƷ(8,]wnfou17H" X? p5 88^q+LW䬇-ϊns{O{{{xggg`%~ӍU.t$ #x:ra{"UW\ʹ0 #w[:|_? 6!Ff+@\T.  -Q2(/E#s8ahD"Gf%.*tRf. -Ɍdr2},3ÜGX ̵jp&RlƫO4+ -G--QZ/בpxˈ3 ZbY}};`y >>>0{3RgrrO=5o0Uq?0 􃽝M:I -0q7O=wx-ڟA9/;'_A.Pq?r'`":>1O/耮FO8p_+|SWp %`"|ɾ13S%Ô~f@E9gccф>GWEx3FT/$,&ځ7AN: Eeߎ`[d ve ;0}8A=pKXg>}#}H0(QsHCSĩoNݙ%,H"(G Ed\ta4I!Bd>>3I=Lɂ9] 6}LxAf+b#*ž yaw*` +8c.8s7oF%  f`EmFx B `Li0|l -CwŦ ~x00$>,(g/m] b@bʯiMF17GF 'qTX/ 0iC -aaG3чs L W_A#UPL&g/oR:ՠ$e}CL*M0RRt\t%`G AK_< 5Ct@#F:` -~;%8wVZ 3/!_ JT% `/}p>ۛds!^0OODxx%9>V%=!a>(SN=FsiS7_W!2*|q>?VyAy `vqux -Q,@&C6##Fc&P &p|2S@/2sӤS~b<1dz5A0o6J\\k)ӌr^#-@ x)8T0S|O ~FWXxF}O,D ѻܧݧ&qZ&\C3-ɱ%|ͥ# HDU]'䍂x-+#*IF`'>C0:e0C?dXEY_ܪ_ e0^&2~0; C1R4g 3ߒwAc&7EmCx@76ԿB] !PfV`.L;C@x/aiJN$)# m9<;863>)P#̠m5.qW8P2MVmHGHCy}aS>ARM( T=`tH<&Nr#1 }Q -ϖ/gpK020;mj(Ya"fX tvot~LQ8+ 'Ujve;A]CA@gyqT{O=hm, DŽ `rpz4@հQOD=8lWp$O |> A`XR:%#HDоq&xMj111< -i\`J&aRwC)fs<:j^ zS&tSo+J^2مm$378y`1vDvxO~4H;u )Q{JĝS ~X:qr@{N2N5 9"S<b-Y x hh.F`,gJ12v,2D+]eռ00PaX*+&s_ +X*bKQ|7`xKpN[{"@)ib7(`?-kc 1HHWA`R(t 5 8Ϛ}kCٙvM"9~P}ӟx1]I@/.@Q>XI` #P`˘ DBxX/8 ]S=O|q}_T/\6ŸQW2 F]L{3[U{lƋB20Hs0BP& eC͌; -V&PVp>DC C*:*yT`DS*|TH@w dBJ~C ΉR?1bl:}C#" o(V9~hLBHh$GȋV4Y8 8-kX b8?_r r ro i2d"BP.   3xJ@gswS㛿O+Hu+*+tX?XH@ {P9h2o @ cSy(xFB쬻ʁ h븵1={4e쇯Xe.,4x@@ -h` .L \W;jPRS=@, W: A@aAS"a5a@aNo~s._'HN֕C*q>HnwFdC!qHt4 \0􁖞:`^|)ʲ::T]laB3h`"'l! ^09jp(K -)}07a׍r%e,'F'0сe P{r wUiAc1'V_#>b‘~z\` .Mp=2U؀yHU&0Od!>>>>>޽u\uHw;:;KDuJ} z|f!`HHL ԣ>~ɣذEBPJT^<¾.7&>7A2n=L|IU&:{xuQ/J%ax` VE*E= Q[S5қa D~S!َQ%Z,)^a%$R,>PιJ~WAL*>34,p0O>ex 1(j0 ڒH@c]Y g!\ -#Q7 aI]0;;Gj)^P7m$OXhB+1>! $Tz5W&%^p|U0`* 4r; .S+ 2،\<5 ,*l1p. C`2J O' F))ϋ2g|o3oOO?>?|_d(ߌAB"j€(@Ktk嵞-`Hb[¥(=~"!Kb!9+aP ȁqh? (*139T֌Yh ϗ3Y*wz!ҨkDI̘!NAgxγrn$ܼE3vo s#*Ǟ.<]! -Gg >4V4RedrpY A#H$pw[@ՂcJT~1BƘ\:,*Do})xYҼg@XP^x8'h( 6XGMa9q 6V܇h512Gf2eA1#tyCXm(E҅Ke`y`9;@{@uS p Tq8%1G $HL|\<(D'Oo>}ȀkMܷKy-ԷKu L8@--n"e .YM/j}+(zO mQyCl`YtB}2dfDe0sBF&0C/MP!t(4C4 %#tcfXB  pÌ? q6=U 6,,ÏJGMt"Q6x(cSDRF -*Ue9Tea#0ԙTxxsw( - -hqsF5tWc3Iw)ꃛ֮ \kz(xGAS!-`űԳ>_ c R̊:PyqExI3;$oPϲ5["2'eeοUV=awcs8`s1"Ɂ7_eB)z<'@Q i !F Pڴ& zH%4QOL7PTs7~K1$&O3>LeZ Cu|p_0j[Xb̌16Xo -J߶$zBʡdO D|դ -uo[hAױL+Yzt\H50˚g0FPq~A (θe~tr`7f4O&60}(˾Pai (W)Qf R9Pߗ0lCiH7rh)B(f*# 6v:e,+1Hٓ^`Sh\ W9]`5TBQFѲYB˂NPh~ Pj|ET 5|j|A5JG%uRA" D'V[r^EB@w| F[- 2W\* d ~]5!F 2G\+]= F\M>0Ό| -jHR$YdL -9%1`7 qzH\ٕP=cJ'yQ-/~zs(ax5fIuy&O%α(cC!:{,xkِkJ PWa1 2 '{JB\GAaʮNg;!V"Cno]a88d5J%骅͛GDeG CPeO>>> -v7iAvPAtB"! tgO?|Zyky>E7\lߐ3O ni*9@H|$6` 3ToI񀋮z+3 0p n^9W2zƴT|Rl~[Kv4a!݁Jy彧#ݘ/Jʹv9^-!؂^x k ->p9A*Jd[F'n0\1B {` CSS0b(IT - e:C8H) z ^` (mOOOOʪTԣ}K tF6GQxh?^920Վ%CUZUꝔ`k`/ZAC) -&:46] {;GB?ajK8`PQ|>#yi"*[@ ں䔬 $sG_]aW{Me>(gAMЋ{*L`2 %MxS?f@$اx ?@rF=!?>%J_ֲ(w.Pߊ }xxv0Z#MGenX,@M3J}Ua-D@1C 88xHvӐfjBcG>U'jŠg }FQzeS ) 4T?hof -la -_~K ׋잙8D!fΪKHB}&}F}, jB9`D 3O''@.&U֑ 8u@pVQ? I`nYc >TН D\{G"@&\J>#] Vݏ6U\fZKNA-u&ҽнGL4i\NQ-f krG0ECS ?ꡂҴ/H4E2 c^PF DَBv蒲gA8?Di(73"hC'F!C5m(؆+PĆ+ -*Lؗ- N4֟3GZn^Eo3{ʀKP` 94䊐kYOv*~!h9[?ԄܛA%FA[mE8HphaXT{ȎRۼl^X]ܒA*@\#Kf10(A}>`sՓBD_C7)eހ܈-3a?3ۀ!+ Xr -yq+Ԁw@0n:rCK]0L2 hdu'e72)^R}m5+q:X^Sh6̲,GR׀(d/ ,;K -{| ;p*#d̦; Pj9Hy, N4CVx,59 *ŨDX50SD" H1 Vj{3 q!SM m7;BB4`dmRlFR!(x {bk y4TV> {%QPnϼT$>x-UhPD jܓ `<ՕrQU>#0Djtx}}Wh [}6퀽%Hϟ8a2 Ta_LxD-[8i(÷+[ɛFWW׬{RYn$0J¦'a j e A ?Oy}IC@!y+/`? Rću+c -/Ź7 sbe&@.%Ұë=<U  -$gƵP`e\0p<>B{D&h ?r;"'it x%a)A2 --w|f6xaX| 0{~>xrEC>0O=oT*e gVV -' \x*>bi"ibAGǘxh8K($ǥang&%q>`}vU>bȠS] ,:Q /^\C*P@R3/ܑC/ܜwB & ДHRLl-R`_V -%!85EڄA.@"ZuH -̰dGU8w(^E(PR0M8z5%5\-Ȥπ}sQM|W+M#ΰpFf#iQ^1IN\<^hTMF$G 7+V0iHF!#p nFs#VinGTBdI+@^X&}2L)Vr -.ޣtQBXyc(rEҦUG#٬?&\ (z^[Fq -JjǁN9t@E\Xj(b dvDtY,\( @H@݈%<ܣ'r8D|̸#XK "yhI,I cn^]nPM8H#o?`}ݟi}p}irEzJEbgZX- {30{+9 _7BEWA,AhÉ:rh-T(;ƕς :1uZ"~­obEC``AJCP\t~OMHruxE;aO\ O% - 5|)gCGrKU9ܩ>_!kBe)->)OCKp3M@9:@ 68V5ϰOE@ĕ<-W,/Rg!B-1$h0D5TL%[t/H9f~F9}d%QkSfmHA(@KA:K"|# zaEQ.06Gt71ZM%jRaZGJUGA9y+ 1g׍_/lf nmiVRDmO: P\?nwCӗ0;L!qv4d qgxT+Ԅ*{AFG%E54޵0ϡ80s#Q5D d# H<"xd edˆzŀF5D@ ji6St!3q:JAf:@jr -^VZuAX )K,JRӮ'Ct[Ӥ||i)2rn@D8~!b(CF C %p@gt -1Av.*t8rcY]9P;-Dueӛ7>"|6>>9/h0! pouT<6Q-M%ա$.Xgg/bx[ΰb9)c)ۛ Ar]cO{M\}'CiK2?bzO߇2^`C - )B"r?;V;0&M> 200LC#|!> (  - -B7gsH\ t4p4m!!s㖀{JC0j{ ?՞-,I:& BRt]R0Qb_! %c&PR{PpMB~J:Q%518/Y&谛-z@4a{/agF \%eHoT#ho)'J`L7 #,7$" v&p YfpϙPpʷW*W0‡G"A5C=.2$E6 3B)Da3@Tejʫ6Ѫ^5q|NNFs#lCL -;[xL"ΰl#ߘ *g : ^SUF C8z$aY'G@a5$ a0\91%mgMwzKff9 oRΓ=O}>wkj SA` lV,PQ@Dw߸Dp j:Ee˥?+ - \-^9a q^W0lx݄xL`q#p Dv#mxM 9>79GdO>o,OХ`׌^nP;1\DD\sDȚfpτӴh2\EV5EF|dUhF5Hx$旋/'>Dȯ3 _1.h8zټEF/*5Ck>>lL_͘_C&4ydDG k!/| :OkƵ7nmͣ b[/|s2#7dƄhu4h^'6*lR|B`(q`&PVZuD` ,>-N;-`IL:,A#NʡR -kN2;C(QvFjV#I -xUu適>( @Q$tK/9FC ΈV]P3oU-ķR8N("@FN>Fܛua3ɲ-N|:Y-+zxO}.w±`}3U5E o,^060p2JF>ְtOU8HV%]&`[ӭ'ӽ>(v@lh%. %A=HA0P35wC,pQE2 -FU Hg]@%D`MJ*ԑ+R!(ڀ_^D@dK;s0qbx~ CpBIaD |c0c8:&x F0邊=( X;`n}Xu1w@̓7 DdpMX 4Нv3w!xt@HH@I%^WOP<#h%YdlO %Vguy.wfXߡг @eSJ LPGH_hIlF#HG,lF6&FH(SYv @IE%ʅ8(sRŢBKW›4V^ҩUBij]!7T l_6w9Lc"`Q6kQfN~px>`v"}G|&M *WH ˪@EK\]8r;a0S,ý~~c+1rB"=^ - -zFd>_+J9F2``B[I/{V8Rlγr63‚!RU}`"27[t~2WaX>H{lHIWI{@4?XpFwIx.p^'"-Pws #u:EA$u;V$,Z0'q+S]N?1K|j0ts{F~S=]-; CI)!.RbzE ZxmB8&iDD_+'󣀆`M b U9ò]f 1$89E2nΕU*ʣebQUVn'vrĽ3kq$P Ue&C4J l0V⢋P@T\M9#LtQ}C}@7*D>[>({OOOOd6q-1CHA|`Xuh3\g XiH7Q\6?iuB -o] *@CΘ(j^/JxbP@;nuk+87%gd; Ys29ƳV}nuPdAt:PKH9 G` AQO7rYNF`+ ʟD)E]W8$B(Q\N#? Xh{7ri4}p$= A&K{H0 ntAz@cAGn"iIvg^] ~l>0(ɋ! TNK F4%>D@^ $9Pw8iOA# }N (=%9JTNR L%_ c a$YuxkKs8`[?4q6CnCjaM iC*h4;Mߐ|huC@sϋއǶ) -f:LPGq]W9%2^6E!NE`x"n4;݇s;x€auOϫϩ@} v<2 A*m^cE)$돇i :3p8=\{@ajK -x>y`;$T p?Boi r$6*/B܂:!n=`[W# Ly(ϬWqt-aL P BX+;uGAyhNTC;E*Ux@`plx* -# XCzqi ݄=x ʪ0Y|OHe 4!07>Ahn(&O_ cf:H|A8k*nj_h;`8(#7(5!:Hw ՂB0pD| X`ʕht1uE@(˟ґ~q/rT.y\2Sn?Mh |@j!6P<8 -p9Mn) ` `y*.EMBYP1=`mQj9?xYY -$b*u*YHNCz_B<P{ p0JC\ Pq"h%:p\MiA4 't;lR0Df`JR˿p< ` e 8# D0#wOH!(P80cU_|a>tb/20mB.VXWS2\Np$" -XW7LODH<.eBmEn{<#MULebW]~8IIJI^~)zǶ0=Ji_HtF!8Us{A_%{,hZ -9>^>-؇x%Oz P*rXDPuNR JmTC!"蕡HRCeD܈# -Ru -/\ $nUfd8~v?B~%8FȨ@pn3TSe1{d l #>DX -Sp^u”*5%`Ñ/8k˖8s噖]Q.,u(VggҠ(t:o3 }}lIa3*O ή71AKai@K)Gb,9FHge2ꄜr[C:>R0NСTrܞF*+1eaFZ@_9GwR_Ġΰu?m)U!N@QO|t^\ Y-]Ph!Oxza%Ǹс ٢ A3 0]rW!G|{!u?W5~N.ګ| *JU6f "On I "gs5Sed *r=x>^,(4&д@P?q! \xHRaO({"ӣ-rҷ\+ %&}['h<''\Mʩ)c0T2Pp%I^Rl܃f H/@R \ucmX.@(iOZDž#d%r%9gl5-fO%:XL_]8pu`6~"l y&Z|LF8%3'%4A o¼ =ȚO7?~8:~7fPYŸh1N͘XgM'G|π`zXYT;'}LĻLK q@Z4ژYZ O缻. PI  -Ae2(g f3yReJ% {ԄyQ#dI(l\: Qʟf}}0+T 5p0>!1~t̓(^U0mI=SEL%o):fH|>y[4A-aH\>y2Uddb3 (# Ef^ p9Tm8;PX*e% #2""!IQ0@V+O^Qֆ"j߳69`C@@ ha%C /-g(& ZЏ5vѳ{+}^.V.d=([GT8,:C!^G1j'!%w ]즪#BebRW *g3扑G yAF~yp.p; -e -&Ͳ__}\a٢C SP?pu< cTG(@{ϔ:8/ čÓb7m -X@PYxO>Y\Or*T(MCW^}EPI Qy-R !.ӊ~ -7_j}^𦫩ِ0a6M3T4tFR01@ -?>yˇ]meGZEȦ#: -߲Wy0[=jҀs  2pKGJ( @rPU*o1ww zE  -;b .5yXs\- E*2q@hDs7haP] bj{# w. *i5V>@SPED^ˤф 08i-N#@/^QӂOPrD:zmQ! i tϕD5?Cu3UT)H, A Nꏜ;/)I`[r `x<_9T9)@u'9n o,xƄrV؂xJ9@?b3"|a>O(On=' ,]5! -J(m+N-(BTpC^Н[Q -I]b{/Խd,Wp:X?Ay@ 7_Am ևWŤzy-lBGɪ+Tf L&uq,n&TI?nPª&E< n0>ID`5X/0k0IW|ɯڌ"Sz~i FՉu?@"d 0TU!>\.0I6@~wY4?6\)E H\pEu_- @2T*!i_ DB pkOߌ%kو8O!}R7M,g&<#(oCl$.c X0&I 2,{C3 yƀDK XB--28FCK(l A80F!r --.YC -67A5P 2W"ePz˒2?ALRB;H%="YV^H*":u(P<|:LaCM h)su3 sDw+u50gZ(UrzJaROE)!_ΓK>4SBW @wL^i|(&2FP"b_,B`>3JuyEJKP \ :A,Hs -n ʆԄjF[Q -<GIBًf j A$myr0r_( \9E`0g*$O=7,1QOȟHKOQ@?'^QY gf%[̷.> _/.e*+"t엍"L3O5 ڤ>`RTmZeVpD r!%*ai7j3c*%r m;̀0H%+B4Sc$TOLެ+Xn],9<%61sq#䒠/ 9k(аcӮt 8-jnBQFC6=&(zCRX"% (DZj`t`{;A"o" + \&j\!TPa$-@Pl`o -~@ (3|R&5B -ނm;2Z N$z_QPgf3(֓0P:\(CTG1YQר\fLI  )`g6 ru7@ -_2⁈ -"0Ԇ(^)QXwI -Y8|ު L DCu0 i HFq`Q=c<"O#-?2Ԉ,8BEym --*gT-hsӨ I4W S= XS,^ -}p*+Z_0\{R0+8&Zt+ 2"^c/D.n#*9Ch]wlyIQh`܂ biɂ3"2+%0P'"Өg7|A{WHy -.JD$7kIF^ɈA`״Qؤ15xΏ YؕV$JS0gpZHXp{%4SdIXXKhVd=ZDu"ڪhI _ Ca>RAj7Y.!y٠'!_ -%.H@fl;êeRaԊ w%P\yiC^  B Qeg = Be*Wb$sXG)XzhQPJ&CBE•t(ڢdJmO8wH Nŕ -4 `ԑQY.F!O/ Lv9˸_Aģ/[rW ?U"dJKe bc L2y7 x6H7 -kϥ]EK>|A>($ 2?P&9~+c*?p[X7Izahfgf[d/z1QG_+J|BxѶ_DYâVrm[υLXxP@j0`d1rCPꚕa#M6`L.2⩨' ~D&}`] \YRHuC(\&Ļe0pWd%t(a m!<r`p=d$% PfP(O/x w7xx{ax\C+qز -!*8Y;xeZ0F=cp37Ny@x -]ʙU\ "l$C_U!3 c.*p+K$;@m%iC 7b CdC~+P膢plҹnөxhp2s-*be{S* ae2\Li#ӂ}_+t|wƴH $6:xBY'"-Vn2PkYnW4c5_p &Ii`K 鏚_Y1SlAߢ^P% D(Q5],p  h¬hg)*]E8EXSj oC،wxԴO,lpI MlTwyS֬U@CQ 0oLUNW5@}/Shpan.Ƙ%1p q\Lsѵ@wy@ IX6|LmaFȌƪ~=g۰f>> QwT `y5k:gCԏ+J|"^\>^ރ&@ԑ2EF4* o-0tDNE<289H4ӁJpq;Cp)N CB39xP&".^T.<)P&r8FR ` ؠpFl't8庪! s`Ix=#*Pj?I/>TUOKOxlWÁwzK8Z>0K0}o? mB Ue[>nZC![PuBMfiުj9`D9ol&p@{45ăQXFBW` `ҿ|>H>Ѕ K%CMdj !O셩0 !YHWLF+e;g ArT 1## -b -0o`=4;60fP&( j+C%%x  TT_f]䠁isdK'Sp%]%81"(#!U*n#&d2@D@s#JN?cـ@tbFb0fo @PXER9,=Lw\KAg -N2 >W.- DnM& ` ZXb0< -Jҽ pqiƸ>k&',io yhiᛒ: 7>|av U8Zy +ɦy|bjaMA7s[GW6b$盤"ӫ+dpCx\~?=`mT oH >H1 EQpIAC>>:M-,%ܰc({~(ɀO,ʂaWM{  -;ipa+Px -}&L`0 -1 B EJ454#. c7 L@_PpSRf^oxѨǂ*o bGj,ѬNDjx!X&#d=l1>ȅf G#CgÙ{}N._*;*(ю@(7G&F@@03xH.vǢB0?Va#zGQ< ѿsE[⁑`(䐶`΀R2MMF9Mڝ \eYljK$epEC(ˤSxP !hN"rh[ݽ=fڲG9/`[u0EXS<1VHz# ؅q2Ґ"u4!:$9]k*ʡPUQ [Xm3@#<AQT6,QS,)P "(:'HSXa'cVTB$ỖA!wAΐ`ݩSefw.p0.axArKh&@.5MQ WR> S&$79[>%'R@7zCJLA&= hh(&V /G@D2BJDW|Ƚn]YU薤bFg'|>)^TtAD}ntApgD&p`0##ƫ*'84p+޷bm9!ZYh5‰X:&!ڜW'E 4 PELp;^uDްAx-G(LH6 %SospleY˜dMAY¸<, d~$&CP>F,=p "^3\GU .#8L -(P yܦ>uqebtO6 `[fQFMvW Dg'*%)P3>81K0%avNE*c!I@'(SϨ7|>8uZX/0z@ L]!R@2v-] >@}@ !جW%sEIWJO  ]Yt|x?ĕ*lhGIXh.rhyR:3%Á( -KN` ް8hg -u{|a|<7`~A,@ifusM(f lr`qb&Lh>V*EX}&Xʆ rW^1p+ Op҅!f!_{՚pGhB6JUoPOCP[/]ajTyEu(:M+T,(Ѓ7'ҚN1?IJ{gUaP'zTe>leH\8Rb+hM$=>,KAEcB`樁M |Rצ Ô *}*}BM𰖴!C$(X`6!TBC ؟ ^-B xh81H4C 2+'|ĉ~@Ai5LQ^/hxT?Z~/h0V[ӫyyLleSƴ=(T.  E7cX8#l¨tnCff,_rls6COt&!g=p[#MKw= oo'l'Fn|Jd yUkg4 +\2U䠺Jo((RrR, ;2myC{H@M2xqVqx#M/=rH?r*'<{:&5Mqb-%NL:?yz|-ܾw5fHe=3"pi}hAcBc[1ʡC8W/GƖDH'@`AQHk:76YbZSg - -HLԓG˂)T -(&Q YM!-֌!bVM11"P,@..f%w5urf8LPQH|^pbZ e=?(E u qW@ Z$ ؤ JSu#KHaB!3~e>=ςf\-G=1#}X%&#ȃiH`\s5> ro!g;|$JIT×3!M ''(VnJ,O)F J\UH o3CfMhH-`}UXa4 -S#Gf pN,XCvEMYA:X"Xh L ԖbN,"46t)OiSRJ]a0"00!%H%/()ʖ*5&.dOGQ.H4W*U1ZAu XQ:([Y"x'Rh:yg&i 5%% 0reS'>_mz@}*mLSτD4廔M"|PdfHI[i 3)x!IZ!JƚCѦ%,MRCxAF.gO¯@;CF ID" ^ߩe(,KЈ Ic+Z([7x vH0l's 8wu6s3O#>>>4ːN/ˢ Ynk0~ Hm09%ߗۢs"$=(4F4ZjvF4@2tc(qp̜e *^ -Ƣa.[KfA`(":I4<0#!Zܨt3#iF).Ax8m /^ͩ`G;`U,+ WĜ<$ 0dDLADgxA. t%K{L2=EW<ШѥW 5>5[$!S 6Q  -U k޻4j+XTOP`XT!{0BZhuBPyo< @6‚CE!!衂0'ܽ"ٖ'>(o(7iYT*",y jΙ)zhU"uMMhEULs'>hT9`RSFWIAݟ#: C"`" -.N&˂>TοKo=0WCt`(I5Y%~Kwi'C0~rB d{ )~ 1\bp"WI@fQY"lP]"dQkW )jb&i 0hX+7SO >m=J+1 U#C;]e$OINW`Ŕl'brX([Ĵsה!E;x->X[?"X8ąt3yiM-~ T@bY5)t ^< jW(ؒACr`hv8rHDb>*vAI1_aw UO| -&DFpHx%8^'灄B Ac>`509"ua2>Դ/bduP a:2oL{tܱSS"|i`Blߜ ph@5 -t RR%Q$`?hA.ʔ p { e>~҆ El%ࡌ D|~WZ/2,miSX0dp<"4a(iG@Kl{J@[xUկ7<5X ̨HhF)D3uO3)rnF9qɃ>Qg.# --mFVmiZEGF -= D0?'m|P-OSQhP0W -U)5`B9 !@$ zmtiBGPw%% MW r?ry@ JIJ40Lka\)A?)B#)H/(K6H\>ԢT(3 0I0\m?gL~КוֺOh ,*E!v5;Ž&/3_Z7yG^0amn6*fcS̴8`΅ -"51|2=':AѾCs)ؕn}!Xul{I2 #3T.Po0r #@6$ yF5Z tH 2nde[)䛏 <7w@2f -<-f1QԱ  [Cܝ 5ʁz##HɅN - l~z"Y;8}JR.ɧJ&g-4p0"sB+2>`"ETBې(fO5`> -^ȉJ==6%-1}Q,t8FMH4z}H`lcAO"F`fMHVxs1jy#H-3:&?S.: i}. *fgIS6kv_2㖄5\"6'P6%Ov#3Qenagk~ #C 5 . W}G(0=}BRL5CiMg V'eFz[24{Óσ6z?L $$AChtpP`TwC+A^g p%4΄$;!VWUPؔoɄQ B8.X2ͩYLw0\RY -VnqBܲR)d#Xv ܝgB)^yٮ" -p CժE{XyMCr] $\hz߅ ?- J3=~U+x)]m{(% B 86a]72at`yDP6\yrJqK1&b{5X -"e4@jKƉiN }B4p5ڼ*|-YfY`;b%jȫdpU+ Ā+#5eК2naff"у\նiS@heOJ>ӺsU8"q F!tz}-.[@s@KlXuVZTpe LXZ#Ԅ@LvG qg1yg8Wi -$GY8ftDNmo!$z1CaR,Wx TPhjxxӰ?5PM `C,<~\HY RVACPC#xP) OX%Fcx6iKJ`IlHVV WingCP %HGR#31-P$R lnPOqT73 7h &A,nC?f`Aevȿ%w۰C_Ik Daқ'8 m#Q4SG QHC 8Hdq3􉌮ԃ17r Mp#F .9[X|ޑ.[`[{RZxit^=` -~3:]T"+~^@+UCl |("|(>?кXiD3 -_/-Κ:!np0 rV"c 5?Q-#gS`Dc+Tqa}S9HLpaE!vULjj<^׮V['J#(k;\0W6CPAASPԈ!4v8kTM@OA+<V:8#AZ(54G?DsDD,XJrh\& ႽaLCQbCM838d @ 2$@LRh@yEI^ך0 - -y$ҕ|ZTgהv̳i<6vTõ#,4Ń8/G99Mix <|p?s1 @R]<"ZݿL_h83Ѹ|9#hV:ݘ -Hl'pP<I!hJ&%齣 -OT†Hz P#nGAO" A<;|PAxx ֣&vgxBt0tr `.Zfm -ÏT\d(hAotX"Q -`m`vQ|="4-4^gM8(-2zP+Tթw A@(JFQ5ߔ!֭ 299"LM\S,0Iv,O"7L\6U -)bl3AaY`x% uD(F%*Qͅ@( -/P򗄗:>>-!(fP0 re(@1TA%qT=AS'%DA8w2P=i*+Cq:_dAz B @mNۡ9Dbm -1T֠L7q+;-T¸aU:W=rsoQ0ߋ; ;q&CMq XaQE`h\ۦ%VvI| -yP Wzug)m@@Qˉ`4TmA8D4B - Z20l - ]:AEcZtCaܡ tWFஸn%0 )U+[J_ x>ރ3@6h](A::2SBxsh(XgfE,K'ډc -zJM ah 6 -D;/ugTrr<;13$;(dZI$!a oHD˘rSSϧy2<#2p,Z P .aV39u l hE+pmcQ1.j$3@(Y$olA G\>1^"ʫuqDTu'giqwaûRN@({\l@8YKHB^As -nXR`5h؄1'ABgy`;CꅙFLIB-`#aFYm^ - rd?1Li - -נpA JD -:zB?0ԿhE=6xɀjZ E&Xz0 - 0uK $P|#eLGC -X$u H`l1$ Ѷy8B`" - I\_T2=FcX8)+ʐWFBp -a6F `_QiRʔ)A1nD!DWl U|'%p UA{طÞ@D1@H\3z)@$cI}rpV[J"fn510 ŋ,|ߌ)RA̅B@f|YIg1M=Ob&9؃=A_ys$Bs0hPs{?cRt̩^ --{MO7 5τ3),ljz :O1C̃.\1Ps/8ï P!Alg@mb>ZFU|Tq=DF萎6 wpp;r~/ ĥ HY$7+uQIx\@i ~@׎2"4(b:,器uߗTIEnum6aZ!2X6Q.'BL -L[LL$(] +Tρn1kpf }X/hu?P`Зр`ab& -8(rCtaM ]%E{JC/L50 -Gk7 O8وGxiX&tk_H NHLMe78܌Q=+H}U(:eWS ZDN"=(d%F BL xIϴO_4D( -Si Si"ȼ!=@AKTNpa)IxwcQaGUtxWF\`(ZY{d pz.7G & DQ,*3MZ2ns^'t -]HNHk*`~-ؤP" -( t @ I٧4bd.VFaj -Q'ڈtT2#݂*2xT/h+}> -̗0lψX=J5 -C -*_6 l=t %+H.O~̿sF ~w#)WJiBȿXilcgޕş8E$Zna@0l0QrPw=h}MEN -  (d%uw.oɱEC=9/xG{ {raeg-%"|f7M@'OX.ri & 0Rތ*[yK%I^|)Q㗐pg=P@! 2 -D@^,`5@?QYvTijȆDŽhta`xaS.Y$,41S$.HZԔ"P*R$sz!`< /hv+)bMܫL[3+kpvRĬ!l BY*exiRIJB -2axQt0-`XUCŅxk~[ƁƉDTsxx_Kʀ&Pia&BKy%Uh})qG#ͬ~S /KUL"eDzsx#lPN:^-vU Ss,VB@d:@pT}a*fflR>O5I ,.DYTBq f qds5KjB/T/!ޮ1GU*`G) o>_zN0%%AɃ;(Unc\C9@lBolC|B ʂU(w}oP7*ސ tE\M(g ,ʀO=7q -A p` 5%lM(G ts7zpoڍCΙ`,5 s 3guj-O){!'@hކ2^rs;{eIYTXy1BňNhVA a w"`m5Tuhi -C岻(&(H69tV! -{۸w)h0[d+CИ0(Βo \0n/+]RY- "y{SvBnp ђ&Sj=FX82eХ \ꃔ 3>JJ7 -XBM!bS|cX.o Dו f -F(R"E,+O -]`o" i2@XT|Kc`,u7h -^|.a 9/ -Y(?Ey`΅s`Z W @[ 0N8kB 316@j`bo.W. -nPe0` - -u5xܙR84ЊZP@OJWDEՙSQT= I"T*1Be_%yV܈P%eCˬʐReMr(GP.hP§8q@SVgc.T~Y!eXm.7)eHeND{.Ot>܏˔ -;?AWGG:YP[BD/80Z"Q Zh(mhtvWԃD -2˥ib8\ h"@OjzpATIR`(Ek,Vt8C -3`DcAZ"kIQQ\CDt8`Aΰ%oͿ|1>JJ\}nXx%"C)H3P3i - g*CKך^0H2Z([dJB )Y* -(oZ-(N(/wS7;*,G%=ńnDt0x/~HТ(W`%c πuPBcs 醅ڐA1*V6[JE^It{r&"3,~A~x -t@Gf^F^u%>a8+5E8J|?I44j0R- z̹ؠYeot " H1>'|g!j2E| -=VXi= ->=AB?g2VDn T3i$/A^=#Q:c|N0]& 0p<#@dŽxy4Ź~7"fN[:g("ٴ[`ʺ{8 8NоmE#@e_QX_]2l+e22\胯S:(ACx(P&#QHd52莓9FhQKb\«@0rX5֯-M1J~ȷ -wB*j3K1pRxC:a;qeֱޥ{{lGqg ș?:ωC` zQfX۠hif(2^%ԣRP( x|"8{L>0LI:[J$qR#iů U>?} 40 Qђg3$ˣG A!4>)r*)`-.|CYm;WzIR$E_O  {a% "*3ߏhl@A&EP>h@se|W `,5ӄy 7m^sÙ7/`l2f@ A8HHEoHlo=̇`)^I{R'С6K`0sr8MMwhM]p''0}7ĸ \WS}|iz(\.C^ @Eʧ%sFe@P<{O=+irb}8 !|#b6Q)% - P >|bQ 3p0psӆ&́QK 7uWUBk@RH@`H9FFtlCypJ #v0vEL*8Ҽ cpD5Qה -yOl=`iPe~,=~~,b:CNZ u R\"NG38 - *e ]@,N(G!0X?\cP _ @Lpf>;ѪKH]|GQ>x }Z/Sh%R -Uҳd+ `:#h}BGw~Q E?Y=Dw~Z[w;aoto#d$ ZBHQ(!@j=s !)h0q4 -|`UGV0 ->cwuҀ'x @)S?5<#8o! !pb` Ю뼪#gvPC0`vf32C0 jM!s.pM(t#XI5="כ -Fh8ZA`P 2S x@ROl  -K@ͥǬ&j|yD`2̕j?0֒Gƴ} M[6] :V..!D90k&.aE-Ifl ;J'^ѾAv=)Lkr-ÊŚ>3dZ 4MD =qsJZt!D2EF -oP@405MÕU] d( m(Zh7dF!PMq0P/ε')DO9=Һ2)dT) D,)h?]!iH.RHy70]i#+TS8 -97}v=LȓRƼπ :P=tQf)T#1SyR4˄/|CE; r!Є4#( ~YŌOγxpj`c3I`Cū(+T{V-$G -DŽ&B2Hä5+i)5.ru%2%.hUo(*m,'x]E)>uѲ(l[xϗy:ԟIZ҇S^6}ə"W8p" /*&FՖ HӯaO\&eQXC>N9Oh19(Ԯx%1vd`&W.BI`M#5ox2q(gA_;_kX'$0 "- -51]<_y^0v_xgqֈyMz&­$Q%n - {ϔ=0 SAM7VP5 Ǵ11# G QЁjxl{;y -`0)& -HQcDQRsX 񍯈ARI>0WSX WTjH)GQCE` M` E1CP8U…C} 0@LEb=a0> -1&LLq % Ahڄi퉠Q9@",OH `5P9釼q3TeS4`c~fWLƟ}@8Fa_>l Tw10 kx.{ϐ |`U>t~~V HW0 G?"|4-HTʉ9ۚjot_dl"i)%_^űLiN uYZ+nb(;$eEgY_,@z|· 7c;zG9M=14rMC^O6e&AǹQpYB4;X7q4u#9q䮸&_5ސ+){;uO{J+J&<i6p7Ή6Rr(4PdB>[` #p/>74Dfl#iZtEN#Eʼn $>ê0 ~atf2 5?F70B}bEU =ə !`%d3^ =]hzE{ gB;8i["|P it?ӍO>/|/t$. :s2w8%7+%D7iX oϰ> 4^#[!%Rx.U`8%by Q.;[6Aft_ʆJYC!w<> :7A,&#Z_DF)x߯3ۯnaR\ifGH~s;b5a? C5. -A"sY.dzSH @+) .X, ҐSr[[usl^7˥+evGԼ*%rpNA2 _i+1()8S - F_NU RRm%x!8Xn DVA 94z!~P @1rws_0s~^ ܗfL !v{ mzF>?y]jW\o)$XH'!?em@yEA }6>OX@φgՀ$aP:X* b rBah\%6X #C.X8пzCgliFC_I A&-x[ U -"S aBO g/]ܭ)g3@#+aXM`0F(w@-><1\me]y#.fh=D5JRɂR)%ZqJt끯gv¤|ZjN5"Ƿ5ZA8{MڝO5%Z η8?b-!> s~j)tY`Ao>HSQ\$I1#Tal~U\äN|0HBUD=v(1M@~_BpϠp~ @pzV)!Z8 R[ho(=qik $lʏsq?˖ɆlKARXc2 -T2Pr`Kb4wbTӳ - <:%=ari|䋇S {AD@ڎ헩aڍ - A1ʉAE絟y rO=]d${a=m:0jX,-Cp7xD}.VD]2<lhjAžАi2>2 @(m#Yo%7 -`sYCG0j N qEF.*Cj(@`(7&Mh" -oBАA>h<P9;~E}"C!qE* I6=MWhWHA5@֐XNS?zBOO>+|ݐ,;5٘d.#Q+"Ɍ8zѝfȼA_-zsUᅄ@x;&Wh/B &&@ĕ_؀ -63Iy71k me'/Ƕ -PTs*E/}E= '\jrLQ ߗƛ@O63Ha1 (2$o"G9@?`/6'ELU?N?  ˬ0iGR{ CIDT_EΊ)vi ^;ctH'P2"{$Jl-g 6d hMZ< +M҃Gťixᙄ `c2 -Ǭ|=bw(خPfxЅ&s>Ne[ByNCZT2XYkL )1K r@2¨A^YhIHK[ԩjb,O7,W&G 5kCXN8CTC9Bdi?nVZSTmTVriCe\uϦzڡaYS^j$@A_x -(ȨhcGz#:D؉,耶(ѧ5peAZ#)GheiWCq߂#b*I/E"d+(`A J;FOшX2 \L2<UqW05Md.dz?2߬$Rsʃ〲.nFUIFpԣʪ -$ dbyeˁx&(43Pd`+p٘YL^tV1pЫ -^LPV9BO3F=s°g!ˌP ̚@6U8^aBy}hk0H2\s"_=hϥ{ϫw;<%{Pbzs'ף򌲪%烕~&Rg'j1Ȫ~I_{)Q"XTnAx{ARu!H(@6`Fb3àwu,ZR9iX#ZԸh5 -w^[JsV+8Qd Q On5AC# `D9p>k=i5Ī/odvPj -{?Iw|CBg{-Á+4T*/x'yWnBĝBn"<6Ӽ8;"`m N_:peRO}1 kxSx36U@3lg| - F^P,Fcx (~,UssI*T\ ^El6ľX*âU'LCבPf"M{H&UAp'H - 锲#{`IrRz)f;C Mz"5;D 2wtx&]}0(=e-),B -Hs-`'LĜjZb;@<Bt7w>p' WD}*v;^:*;SBկoh3z[#aM*iJA6 tTinr}dkzt:ݹB3=bzZ-Q4t g"QQxNh  acȠ]|hgB+l5bEv 2k -&B}Oޕ$a+T}LQ\Oac xPPn/Pۂ` 5+m:cP٨ -<+q) .-k" -89x!~QZ9MjE)#ۋ;~cE `AX/? F;lL"=#ï/<i!^oS;zn=t$-()eM'KTVw$ Al\(ʁjU-T t!z(!(௣A0huM#VEk4 -Ad&Zsx?l@6"=dH~N()o - zkv{n:DĚ [Xg36/:83]@e l.UKt sP1B؅YED-JTyj2D`8Tc8 7X0Δ17@Ae7j'!Љ[ c|A)ԇR 6 V6Q*<1Ø#5=L3 .[Än7gL efX\  o~%B%B(po8ʠ |Q>HgpkZCQ"T7=7 EfӀ^L>qթa3-J_H8%cW*"lQ,@B> -Cc1RfEO!Kjha4΂;$et4b - 'F`/r`Ve )B͟:#tC8T$v0L¥˩^2j4\ֆ|Anߺ Q2 0T#+.&\:B5 9T ߅@'8$ 2ĄD G<\kGI]/ HrGc p{`(2KH}~Y<(x?\VA@T.ȃ" 2EpWa pj|>(Q|qPׂ<6^GEdx8TuB>\1W+"dX߄9Kc^!guP .a<0@ "T hERN)aPV1G -naB{42CウX<ȐZUP na I13.< Z+QFg8@ 3$ZRHs:R4 1y0KOۼb=aR X&S5: -zwBA7IJCFdfӢ03^{"0<]G!ϏA\Fz.ک*@\sd<%M7pha{XT" @&@\AqW9 dV`&d5]n&3}mCdsM~K{ޯO,AAbP:|d͊ℚ5/c&WJQ5dMLjMr†Y]@  -D5z>If.ހL@k}N\cfT2ӡLL^`M#)YLǗ{}iy!+)XnS{K7rra -jn '>cf#Q6,iJe7?hK`-p(Ю@<v -)/I0`A,03@0Pe;8Dd>OA}?c} 4m0I*o& -=cmB0@\;K "%z(PD(P&\(y2h2c"0kТVH DF1Aɠm!蝄 N⺎ ůc*~5BJ Zl60w9®5#Eꫩ8,6&e */hղ0{N8@8mdZ CzhyLͦyύa$f̚L{_; . ckh\TZY' 4.\&U-<*m} ڭ? O @ OX19p$] 1aQ *Pd2H8]Gxf9#Ch0!Hz42.Шc,S -ihIPUgêIp;*q,y[nS*'0bFf -PXI(o*[B X$Cd,̓*q2%e6UJSHgK&v qpl4( o+"6#g )b[qq">O GfA`};CȁD}1 :4|"PцlY$ - - W'6]K8\$lzBCA_4z) ϼ uyJګSFd8N2T_eL&Cip%b[Q*R'/oX3̡O>dDb=(IR; Yhfٳ -QK0\N\` bx+TX)l=yj} kh"*I"|gMFo+r}Z3d"·%ϴ-62$ }pNKha07^qACK\Zt $`)}z@ d`=*s̺JS.|G"_4Ba -\t-LC_lp ED Хј.BAH BYarp`8axADPbv s2Aʝ%5~.|`S4#b" =!g]  -ko q$xT@O3oY㌷/GPDFN!Q3@p+(RƖ&T{V$`vGl8 +M0$OŮ )T757@o>>>xмi|FΥ!X#Ӂ+(Nŀ%XI](>Szc{BzH9yCDT'|3nV%r, (P6I?B`ZV̩Y -͞ Y:XEŊA3'+w;CǴ=@%7`mTTٌ& &Ívv5hh,ü,܄dג$X0_OA'kj:2;pW>U5!bED2G`zR$6eJ֬y}\NB -?h[|Rn!>T TU -](|,۬feZ*)`C$ MQRl foiV;6B5$"NЪ(UEZg -7* L! r-j0gx#?/) @Zq ۞UYr+H~C]zV8hD*@sB 94CrKTK VN?PI`P1;A:Q O3@`K5\\, AKY؍K70,9\ @͆  Q a;ɀ1 d$j,`Nc ~ ]K('h <0䌼m. - Q0Ch:-jJ(gZC\F]Bb:ؠ w0 삁.*  Nj! ]L%4DX@ -mPb;Q̧I@ 4b-\蠉-@l 7aͧe;A@"@3sap "5ńZnʗt(Ro9yL/QƇ0 Љ -a(ݭν - BEFhcsȘAS~úfG\8ۈIGc4|ɚzYsƠ RDTI,Yh833xM=eVY &,aVxZH<ͭXoX< iK4 Ę&T%cbH[=Dd^L}=biʔ3Z& J)(̫`*o% .bF_f /Dž$Iz":Z Lq'ga5/  L?=c -5 [0\FC)e6evs2!6eE/|@ - -\HɣAzna' voE \[  . -0@ ]5ɲfQQlPPyn]a`C(u(ڱ1Ro HxC_5Z8t8TX2ՕY/>^ÌC}V?Ҥ$tE" a)CL\AЬ*kΩ>_Qzb`XNz7P rI֘A b+7 fTCˢWĜx%y0 AK.?IoP`)TWW= -~6>>L%AY 1.w b` %+hIpDQ@U=@_+!E[B\ d{W+R R)-9-t1:Aߨz~A -E?TMrFQư-:l=@ky(!6@GuBGLd[@)-Xt2L5! Xr 8f"eY&@'g|,Dir) v7mm2o0%8qMa}hikædc I|Nܱd)mMk,J{%*i$hZ8!1peu le D$2!8T ."+Q D: NM_[Ck~z]>)߀` ->!nTi.!>Qf_)]e= R[ׇNK@X0ǴosL~JaT^3J0De&H jn*mZ#L7%fL0&^:+ -Q "<MQ'VM+6p[(cR{N'@(p`4  i>?Ԯ (7O7R&C0^l2?\B%F/ zR!p%5`6(Nа$ΰH!)BA! 36W k[XW [L,aG~Q pb6B4I]!cӦ,3=,,J@ΞV&`v@h n>?d/:`E +RDI5vQbyOI@,OOXКkaCxqu+g)Rk\ WH`;#nϬ# #CbjJsC1FEcW!@\[hL) Y=eam`@6Cx0j\:tcMOD.{2*R)z;̄!}z"0aDF az_dq4wcQt 0a1D8#|!z#)*p Σ;h4^++?{X$U,T ܋YJyƄ_)/NQ#Y ڜqt6'lO_ܙ=5HCYvCE&b\fe4㪨>{Ox)$ &`$H]*t {CBBe,qNp Dt1 -UÇ8pB7/~>H?,F SQ@`0 !Ѐ0CIf@ OeQ\/򴖼$S4^m(˄ |%ͤu:ʷ I uX]5ga;_SzbXh`N&\XaϺ,/-} xz`q|"@ - pCyG#F_@Shze YRzG2O[PUϟBi^UTCee)V iȓQ4mN?BY7"K*/,O,V`{MȅI^PFLGBa1C7pR]8/SXIz^ d1M!uU^ &}Tn0+3^$-zbZ TH qvT 5>v3.` bA(4(ЄP5"+ !T= - g'C{ג#BEGUQP.%:&)4AB[/Xe[4ba86E2{@9Gd*8R,(sE(h*/®@ud^KU $ Wx ZPP>C|:m DHFP'XSL)Xfn - 7y3wf@t|EVna:JB1\;RK0QRP3AM ҄bF*URoLV4"L!A쫂&ԩS0ch51%rRYAYIILֻ4R]< '!8aVphUSw'8`Qb#_ Vdyb$ .j6JE"TX۔@wEL #p,ސ$7 F0d>c*.SIJl@GҠ{gjT!7M$24>scp*Pp 50>3`\R?C(ǁ ъT0Cώ}џx\jpƎA B!)G21hh cP^ GUj9T - =~#Bg>|>`4O"\.rAۀcLekhptTt< ( JĨ& -*@IepaA{ŠaԄ,cpw*eS#>3e1dIcuU 6ӷ)`dJ1hպEԒ+h -5nDq 9'+T@+? B0"  ̯VvkEF!B�Z@QtcāY -` WM~ -*\̋47#ip5*'''A=8õȆXôR1O_R87;gzAzf}0~s=^(Hy)LSV9|]gp}IIt^',~C)m:BPXdo/WPT"X#԰ +LR \N3|!wDŽIc X -!l9yZ1ZAys8yeL&feD6~t1O Pd# Lz HQ)=%BE#hA5Tt~z;Uw X"ZQ0 ԣ(&tb/djiAŬVeL' -X ^|uccA -h+T뙃$X$.zW f?f30c -)0+© fD$9{$aV{u o `chU*$VjRBsj"7cQ>i>(JV,**`I93{[:Q./xIn.23MXA8u*A1:+ywAWLۍ>8O\<@*!l9PoO;k IРS+)5͝FD0a*^Ox!K-" -Q8ӢjvcPIk-! ޲ =Iar/uHt`|wKkz4k L:%6 Y\`jQ?zx0d0WB%9w 7W_B8.vQۂ@w(#0Pٖ pnP&қ'UB&R>XnqD-`q$CM6f¸h98Bc!=7Ͳ 4+g31eϴ%cȜ7i}bnj) -ׄKsF!XD.Nl=Lh"j|B+#1V kp &|5$HEpNо.)tYژT*# xx .ЏxGS8qe@&L2/|_ ;+ |؃03xs wJ)^?.#hU8;LKXpC}fJ @k QBu҉ tPe %a`(,u;8нJT+l1mRZ01(LH m(pPE~uA*hR]LXG`XX 8P ~J 2ێ׻R`=HӉNtL@eE(PAxѧ ,h#&dG)+^3԰XJv=Bl*nėf6+05%xs(a"AP h<="o$9 suȰ%0F2Ci ŐbTui^5J85X m0q<#= z ̔NMHgҾ -%pn#*:v!.!O#QLX@2l:1čpI:V y.'U<m ࣟ><> QG%F lФ`M(x@`dS(?8rG=V Nh@";IϴCǴ"wCi\]5>A"g *Z .FF;W5)C֞4%G4)bmPͼ`KB\ 1?3ޣ $ h=vь!byk -#!=J.{3J -9*X)9_אVm#f< EHvBQOm_(K(|Vz)o1A9^+Tg2KF+5`Y P < D{ -`W ao3z`H7Ab - \I{KjP ;gh#AvO j\g g,HLP ":IA!& -RݔCglsޏDV_,yƄ"4P`wօ%WĦH,FXp=QF747ֽ`P]Rj:fI6?x4hU*BW(X%A4^`d'&%W-6H".ɡ&e/B1,A+ve" 暥?rK vi4URIU~0 (h0F@06d3V0uyF+U 3 6r;BI2殜CYP{LuN"a D#:Rg(A%M7}7w%Q -GT -"h;S}@ O0`VѦ6&,|}7Xf#\9I Q!Tuo /Yj@9*RfajZ@_kff+fmhK$Kilo?k(Y_/pY w $ײW[@` 8ίxBaXĝMh8UM9# r?`0ϱ7F`1-8GQ yT-I1NLXQ[CDh>ylȫxϔ" -| `(0c8D\I?% s r0%a@)MK Z!(Mh&VmI1ȂSndKa$>z̴yKF ~V3 603:rsD~b@8JxT 1Y*"t17@d@K! -d %S[BC|Btg]c(b#CuuSyY¦DϊSjlMuW#b^o0_eGWϦ*}1yߖl,V:=@?*~-LDOBW0RsF-yP)Q -| I"Pe PB7%t_0Z0Uj@ŀ -ư%WX胨< -U![FU?xcm#;9a%r&Xd& ,@;„ЇHGvSpNpl:c=t' i+rwꃛn!B}PT' bZ۟eaG31>}}}}}}}}}}}}}}}}> 1' -jG xX<@3Cs],5qkU HOBhCTz*-iMsb$g'_ )& B0Ű:z B{} ԗ#b$s0WD Ϻ@?s =쐖 ?}+v'ߠSP02 AN>R^%a'kO!)>>gggۥt)\gYnI"I$Ype733Xxk>xF'b_F?l)`tX~o|`?7GџgH?ʺh"5ۃ,I!ujdi(!mggC0X >:@4h>qw~1D:%Y4@Ѧ5j>Zyc**3 ?XUMDH%kG AGH5b Cճد?V{S0ϴ׿؟H'pmqqorz{gooyimymu~Bnx @r>>>>3>~miO'ǼQ>{[d^7c9_uOY\,$8?J6KQQ:3o :鼛ɼShQlOagЧMԈ8@L7f*!1AQaq 0@P?Av34Ucτ/S uwV8x,-S5O><'k|_~LΟs~,V-|#\.Ljg{ -ZZOUQ,ޠ-&rQEb+D%" WpOrFVRqD lʣ*6nŶf;{ *&H.9 Kn+ rո^#H\ -bP){*bf<IJKӂ3Gľ0 Sg/H>SQ@-"ԹeEpxkx7:T.Q]beDSr1-6M7U7eiu*e9wKi^cWR6X(&+LuH{s"Pk^d[#XxXkQG؛#P_!f=.!Y[cPG!ozq&`SڞI5m X e-o101QRj.U=i+Bw,VlU hf[u*-wpIML .UMIêw3\Tq@tQzjT(o2JGk=ˋPeؘe&մdŌ]K:qU*W -j) U J닍%h&&noLMpܪE\)·YV͔lS[˱OmaAQ?RގUd0%TW)|E'H_7ÖjWk˲E=r햌'RsPEVXS*XUOc7k/ |\r]@1s|AzqcR1)`,$q0#]GsXblRl˃m ^eK kmseJNvW|1 bf2zP -d2nBTFr9B8j/6K: Pʞ -R5+:dJ*"pq`%1AHdEl-0E6p=됲-cNmW i/*fu:K dŸb \ u.b$Nap4=#^w0#`\c+AıYLE~i 7)˫=j\%Qi|U"n.jZ4ܴj]TO\PY`:hHLܻ V1B&+ 2"3P"ϩA,E)EFH:%JL\]``0Oxj5/34Kơyҥ*4*Alۋ K;ff9[Ze˕RT3P! ԧÀSĮ;G Q - -JFާ̪௚!{UKԶl䡖Gdj[\- Ūj-w-fַS/3;qN3{u\YF_τd-\DHn<\3Q p(1q0/dS(ʸ<..C -*f5>W$cQfC)eF$1T1,c!%cž+ܸ+"$T bc1 5¸2b$F.pTPpAot2-C9'K\X5 ܵʳ Jp>#.TIU[t̑E1Ōlj|7hQl׾ qsX6P5l&q5Pljd8.6DbQ) Bjw P&B6S3/SB2&y7;{B,2MEIp8*V_Пq٧H*jKb\^.ø~~$.끃Y3>UB/8˨d8F7\_,pV9D`V]_ \K|qbj"T2xKǒ~7o؇hG709"rK,⸅C<Ɠ^رbʊe&eNԩ*h+R .qw*#SiǸIܺI|YYh~@ V EW^cMFcq[u/IJŚ\GPfRsSPҥ|<;tAqJW vAd\ʽB\5,YZ5M.%,:RZ1&ʍmD)C,`HUƈĘ"#|Xg<٣k-*)Fѩq'psP)CRUbA+9 WW GIVE2kF) /yK6YVԺcpF+,5%CV@|S83 Iv©L\Q9 U>qNa`+E;.,w~TCKTxhz> qhܾ7G~C0 ,x Ko/&cQ |beY\ő]-|.b(U=J:@<ɋ qpɗ.m,OΥJ1,Tn2DJ 2Xf`d|bu‚8-z 8.;8[eQc7\[djl#"C5AeXQ5W -u(5JAL95Uw0n(\KWhf%K&a,u.&Xe\VՆ!+Lrk}B͒bNb4\fRiru.oW4^j#R[eT|L -. Kc33>Jݘ1\j~% QcPܯq>`ύ̪|Jp}qF"f+2DUuS*8[0,F(*T-Q;K -_]'F3*oxu.et4pLD QpFXWryL54 ~ pk7/\NZ&!7fLƮX2'1+\f"L281Q%a.|T=İ"u Hˌxp#|i1X -jmjVk vgPᆥp2oYr/~Dn\%8 - /,̶,m^o%J@h7 *늈5YWQIa)'pR;33$%o -SKrarȱR,^TJbb8IkQbK.:%^#Ɨ#}J+5sD!_/B%_/:hE]θhxu CP qt 'r#Kp CԻ*LWwLȾnɑ1>wxX>-JjZ-%-*X) LԻ1rRn:Ĩ tl/#3r^Wi?UD0B@XL:vT̰Y[j4QPDB@QK#n)w/:ĩ`!CwFQ5 LC,(#rߙ@tQ1PV]#YSjfVW%̤Vpq\a;K*AXC:SgİX <`7Knpq43x23|u,W u U;KUi$rxb.,.\)"U<ኗAV\{l`Ը],TPy|cljRڨ~jWy5sR ̩W*Ts*)>咆:eL!*T1/&o˨Ԩ!IQ*0!3熙g,`nd*ܠ*le;|v\b61̹0|L$>x yԩ o] Lf xLE QMLߩ3(2p(5IPꥥETn*^fܨe8q. /9* zyArtKqVVJ4J=$E1WM$ĺ1PZ@DeDQjkQbRjUa2B/p*؅}eDQPCr0.^0$#h&TxB\A" z*5HU4J$b݌:d TЖQ,q0sa0pNȽraS0J8QTY>Q A[G:o\g)~#qspN:&yjθ,^z|ˎItT\bj5/p:Nxܾ1Q%DBa1*qx?\ x7edrWĮp< -<5$7k @UJKUDFcθnUKy7ŋq:b:5DBTIenF<LKoY7f !wqp4rTf縖MQ.0omJe\"BʖBeYJbqHeta{ n#::KB[c)̴O\\ԷV_-|Ge6,inTjxT}pnʬ1ܺH(AmG6Εp}]#>'bPr&+@CJQ({PT-t_0U ^j.#1UKc1(‘fnWݮ&Vg5._޵QAq-*#*sL9q".A0f@MyQ:]̿LьVʞ岛RK{GU5;@mI|MFɡT%lt" Nv#R YXS:O@,ex:ڰ_ HH_TCQ(s.ZI+h\ -B1s H<,YYxJ%Wxe\2/)=fUokui9i5 ]dc5+jJy38w;Pcr?Rܨ˗. Cp|1%$PԨB c1LM~.<%̃D e V[: 狲&- B>"!@J"W;>&APM .1 3 ?`Vb ܞu ]*xԼKqy˺Z>ɿ;cQX+RQ9O1.1Ѵ@?hʱJ:c+rꖱ Q.6STܺF䖌Ů2 ~wʛwÂkrĪl q Bb4 $Al{[hUNkA!j5oE3E7TRk)PUڥ' !s ;Z6Grx<4Q/J~wt\(6UPPT T!e_W$Ske6"*:xQXbȆagD6 kd͵Q` ;%ʔ@ie_fל'M+a -rE՞dL#5pYA2Dk*ʅX]v,ߴdM ļE X;"0" &r~X( -eR"3kfvDM:IQ@U3pϸ̂Y>+5G B& : NH+(@YNYƮłAJJ mT5x\ȋ脦oVٻ:òh-" <&>Ժ>d]*X;a2Lيܹ} MXX1}H#kD=rq\C)@Br_JLhb; jؕfc.[ÔM3 Կhp~#R,*ܺ䫍> F!i! /+upuz7|Q nq Ev˨%dO)Kj.41^C#e[&}4_A}#KTFڡ}֣% -)eS/MO,ǙQ#|eXwR9Wܮ3|7\&t f*5}!,4 aAZpGxwW(+7>$38ufyo&9I07if K67R˨UVV mα>b`ܯYe>bu34‚? %ི ܀$vJQ)ukD\ 7)3x"4@zzc-nGRKuhC+1`h-%4Zv2&'Ej`.u9QϽFX%j M1$/exv$hR-bVcJCT?s2rhbիNBw7oٸLp:ƵqɈ v.4KζGea3BP4*|~UڼT?y4 B)e|;?a4}C*|ef -r}cX|K㩣/H*%BYsPf'0-,0 T%]\b0isZ?#0u?$`mP-Z*G, eeDhPPۘ쎢 X$5zqD^"~awXirg.04qDd 4ÂqâmqyNYwOAe񁋊1|PAyaiG~%ɗKfo_r1\TxUb1q}T5M|3mRWHqB&c(*rMBed'0 ҧED!;gU+ٸo6rӁ5.Z QXpQ\>F[_ H[>,$$ -%MŲI1+# b B,r:Ff.ߘEu -bEK˸틦WZj\,FRJT?hfbq Tj mn]bUf%g CK@T!3@:D] b\B\ "5Mшj^$&%%OAHK+1:is* FUf%F"DžVb1EslŞo/55\H(IDѿ,&ڏ=e:a(J -%]xtM8~PQCWpDm9ho۹, M[78n!i9#КܯV~$EUWQ"p^Y~Yo"dϥ;FJ'jW;oqp}[ۨ $‰~#hVڱku"W)ݢ|ݭQED?P&a<š E-tD35(>&׍(q,jYqOpPb Ic7XY.+ ܫ$D_yZ>u T~$ _G -IRcD~Q% *ʽ%MC)/x:o| +n d[S+|RYne@Hgko <ߥmbقY\MK -Ç-u/1\o/ IQ"J'\YUi|rrk,w.-lY0} 6;Q_^܂)ϕLN»&a'I`1 K%ch9]Ĵ.0/\p7Ńj\G٢RnVɹG&ҢT].ae Cڵ>EHiEm,cDܪA -hzqWl: h+~$ -Nn`}pRʆ^BR,QTWֆ}nUfPDaEP()2ŽK3oJ5ntS @o%AYoz>j%6Ξf'g3){&ؘNA'._e ljuu^,Q6V\ak.,d ^yi >#.6`$ IkZ,\Pq>h%\oW釢wTT :cbH(c̜F:56;@!'Fs7֣%4{H- &SЁc9x]!-0Dl!=og@^T zu1 -[74w,vM~HCypFR8 ML qs[KjkuP)En_9e𜌧Y/*Jf$[>SpXԶrx. -KFŲOAH>حdH? vQݻ*Hä́t2?EBD1n¥JuQ5RPf40+)ڢI* --\*ApoR&wu3CNLmej YESv 4mT%n*X~\/]Ajj Ol ]Eu𭡰BnJjZADBC\QZĪWuvtfJ McEQTn}2w,7NCL,FP;wD)PF$6x:(aaw U^w PypBCAmnA\r۬Nw[LKIڳ%#npj,|&* DcP?a^`9C|y3+fe_Rzk,8YL s Q _N,6<@[c=@ 2Ww?w8nSmU˃/0[j|553*V? -#_rf3)z8ZRTWA| -a1Rܤ[/O=fqL<0E䒴o}mN AZơKl.wAB^\kd/̦z\Odm1fS+W)J ۡ!@Wè- \#\1ak#ji>-ni .rȚQaa #hi|2vPLRԶNJiQè)@xo[+*֖]>ٳ⤭aA\L#U0_jm)-kX^5 Y`td{3 -" =T{V0n!\@:UfS1-543U]YJ\(RKE@ψql/n#vbc 0খ.>_##N @n;wYAq1 ]/l{+! {@";e.\xJ`OT;+։c1&*U*Ge>M̸> 4eԩqBc-j2 K1ٰ:H tEq.R焂 we/5UWtwĨ\aA/h<h3 xӄeަ㞋GU8BFz.K/5.?ԽB(%ʉfX-HnXE#)ZY@a.<[C>wUA,0yad 0p≒UQ+zEܰ\˃aw(]J07hJ.WTK3 Lwe DKmZk y޶kՌXY3*|=l& 7lHT&NF%4WL& kl)C)e@nRk.n YDD_pP;Pf-*:.Td g](KT~i*?yΪfR%pB%MKeU5a> -|p0ll.:\!:SQ'\=8!hu-xQ IU:댐^"rW9|[Z}LG2x:^#,.5%=lRwbD2%ޖ.\%F{ wj&+FײF+gjRb3Sm~ĂӰ -c"beUb>=T>TeơRT##1grܜSPBn`wJiP^L_%EITوwnPJd2`h-%L3[VDPPCQp* qZ*c [h}?JLNUeeb\rP⪳E]Uee&8 {FRlߘC;!Q ;ݥ N0˗u(4kuCХe]S(nY>FZ hQ[.X -xY "_*xPMK 8R8k)`|N}єZV a JrRi`VFUE5LA`x׍x`~說pq3FFLX0KlA˶0#ij^Dĸbz D+e1_nVTɹ6Z"%b,j>~#ucOg88rZ̺B&njVsVdQe%:uZa1 v^U'GWųȺƾkVlbГiVL0_^4vy.뎡RQZLy] ֡ ]7xjT^hh&cx 64Q)۝j(F vǠ UH!8kK8.nii`OX0*j“q'B7[T|Q8IOȎT-z%O9#m Uߟb"'O#:"nI8^#+R)+op_([7}Cf췒:#4JI7Uޫ@UBā@N)_2͚ʹM/113}Oqs[ -Lƣ}e-3˩x+xlup8UH^1%2ohƃ!c{2(b` |ݓ0Fԉx<2+RX[N We+" 0o(Sג~P@yp.ѫessI"8=[֥C5UDg@z&ݎ"1H԰r{4c}Ta+nU52]qYlFc<0% ?&戉S/^y00;H{8^L}Gg [f߈JO8)F*K ql=f X,[. JM>¢Й<ڥ1[töڊ#*}J*ZGy_R-zs,owm8.4V):Z<*%]ʋ -)0Rq2Zn3J`x~uab]x42Cm*WJd \CBI1d_mHqΏ6l-fux/j4*aH)[Ͳ+RQq J -/ZBgw.%LVc#Yxqu.\\f<ïDX: u*_vf]bP-o<0pE{`GqCpRW[X{Ajs;k@V -)nVT {;1D1!X9hwhx*j02;LԦF7\ .5kN]:ľ8fQԢi1sS\ydji(1)ZuDtad[+$8(FY8ҠAJDxHq{eBs ЪbUh~;hHj)ֹGl+WǐVJ`ؚ@9;R#)\aaYB,]!qrBˍVc~e˫-߀7 cPV}2ƿJOA~R 'w*\ZLpuGeӎRyANH5I*-ew1#Vm|5E^AWw}~ -ikeLAtͷ/+ &}sZXf_,,.)otD4Ԑ[u3[KʕhMviX[T8. 5P uƀ;|@kL!Da*TUR u0J:hA5m2izw{%_Rښ"֙fW-kO胢FVHMl ϧіX8er+d#FChK5sDAm"ߝ"+Dc cqK*Iwթ]V+LEFT -)١SW2ut+/Wk7@-Da[zyש#+0RsZ?$Ũ񋻆nmfywp/||z[qy)3u/=0 Wm !m:Fڅp\*U_"Jy ( c|},x< Uw).e pؒ{7PPgpIrF+fkQ#6}ar @jFӷTك孹 2;:mѨ1/z`ql`׺ u5n =$9_-WB7gÇ$$93F{ /5*[6*WVu\0 S+{5.^*+OZ\qtƯȾke59w_¿QKzLTPzZ;LK\$/|J*?1x_rSju;f R9#rf .S15X.P*ℼuW)+bEfYn:ilfRjK!ٜ?1 -Jv)! esmc8,Т7˗/Sn\_1w*.1u [rqqj$c%sf,Zڈ!u9CAH.zz҆!R5cO$'tQJTåJ5FPRPy! N=|0a`TcZ -Pf@jcXjGaMrkCt}%!j6MLPIyZ]G dF%Z˺ 1Gpm2]⎜v *:DbwUSfІ\!Q^zV>f -H[[ɮo^bEJovxYDjnaW{Ko.izeX֩bYuK4ZD?ܔԒ©R("Խbb.jR3{,La@qC(wrޖrq^ -gKBՇ…;"e{ eFXS6ʼ%SRґa&jcCcSVU!'rO'$U- -aL*WiqVTi9.m^9U{VU.4Hj%dʧrO^jPe|\95\fa*RsথY 5R-rq]-6FǍNLv˶+uܬW[;X&}P(Ժ'aRq[`pbYu^VpEش$+/AMvfȉqrPz,,'=Tb+wA"rlܫФ@9*;`j.]" -K6ƫu\4‚DY_eҔf[x¤B֭/G2"-&#d{n'_p6l,M:ߚƨj.eʈ_o -+Jvݿr9عIn’\\` $ .{0 K]PīnRK 2F[  ېdҠ*0~.:,L˼NV"[0fC4KԶĈ숓6^p>Q -{V(%ٛ*^eb b[3# - 2I[a.0  XXhCcH Ԫ3Q:%[L+̿3K&%cRFgq6K9i%e35W -ޡS3,n"n$R /P8]uc0K%poƵM|=d tW8ep7_][Gd}fi?&QpR//wPp "jf m;8`to߭bevӦ臽f.ljSxz~vG!w -PU3MSamDfp%J#|J&\pE<.%SwUܪ+|AuL7Vxr’T~ˌ!DxIPbX7[21NOUt * _Q(Bψ"ۨI()57Bx&xVr*6*iSCmEQ1DFJ7- J E;ۅAuIq?7'44C=Wxk{ڼU{P:[/].3:!:m%=7o50j,D^SeJ*%aL+'JJgeRN.3-!ZKxzeK-(e;|]Qo}d~,%EJ\_Y/*|쟏|T']AEpxCW X|\/9j -i' -y bmJЅZWBݱ]J=dRjg9j|Eo\R%jge.Q[pLWr[, -+*rʦ#mH -#w1uGLPLBVRGJ`w1^ jYR@kkU@pVoJ8Xr娚n,R%@}JrPeBY~8H0Զ"U0-&\ O*U~;A]E #S=,BU -Yt|GK.󹍵"R^hНX[%xpj]ՄDT0L[%& IRѲ[ )X)=VZc(+DHC88necEΥ|Lp36 ds b52a6?W*Q[;!&/\cHR\d/u3xTQ11N(d&D]VHq,Dlg3ȡYLs8F^zQ'Uw-] Uj G7d8z\6֧$x,"ʢ,tFx ܨᗎԹYm^+S1lBz@׈er1@DpFFX"Ù|[mEVԺ1Qj=jU&UPj/U}K\$OM@9/egWw_}h tt3q TVf/${GxLpPeV.-"(MKg!8:F5HCf{7(\hC|̷9ϘVYAľ4}!ՒZAL)YԽ*x!@p3%2u5. 2Ŷ6$Du7+1*WQ - ҽNK_0+P>pڋkڹfqk 4pبJŻ*jE%@ Ąn ݵcҮ7Pz$D -\/5/Ցr ZP T")-QꦮWyJR \J.&jR\;\eɎFd||W!f - % 0˕OR\j7+ls~APO -n+R*3pe )LP{L/:ؽE37T:"%OqeqLib;m P$%mdnPc˨dK%ϩ.eMQq35.RՈj08%rt3ٺIl8ԫ]jmS_2.eP -:W}yJRB%?U Tip>/%9!W` -kP-!,`f8.%3\? /tKSĹQjuµ_~l`qyeJq -}L$~*<̹|T(% VAoe5 V,B70'PbRqEA+ 5 qV1!Vߨ%wfP0P'jDjq/.3L( j=JNSX"Wpyװ;w2C}[3{Xū\hćtZ}~J<`]xmrBO -RBr8XK \2P㻮\sGr|OR1baJ@fWq)UƸVJ_;1)OF|§wRbgkj.{10lk,w)̧ecG<-n t~n{#3Y%}seFQKz#SpOeԶ#)!kdw'q=ܤ{"I2;Jۨ haj-ͱ32r*Vew{1LI=HA+ IU)X`eb8p.~m,u1H|m1bc^)0$SAu|A5Z5u$g(֌ߘ%+5= pv%e?X`CQuȅ_dХU WQVnzb{`TpA \\;21jԸJmyn\,ff/oF3t\xFR%S3čk^%LLELF52#)8Xj7zũqRJV+.mnʏ"ߙ8xX4MjhLY\6,S"ЧL e)%L-cs,AO@x%)RfeXqKAhpp/XUAm$j4)r02U<#7ĎԐfx*5 RUJx5>xG P2)[щ  gL )rUZBU -xv6Tic -MׂgFt0y˺ -*ԋj:w5\J1.S-!ZV23 U)5R`:-Pqq BKF*1ocMՈ\f R4Y,t*-.-h# kw_ropj)A)υ?8yQaTsgmO \C*8{K @mܵo|c*b2NFj& JJqJ:&8/O$)1dk6dp\= +r,2JEVV#Te}U]R'I\a+\3W{6@rʸTG\TpÊn2\S[|  -Oi+F=]HksOSN>@=3X:I{0B^\'2%>a2[3RPe'`-@L[(QrLUV%Ա/Vn%C| np|dy8c[xQ1 įc!JuH&H̩\!Q"E,cu:ĩS:Jn>oK9԰ Y$5.|\ji$P oDOa*슿"`?oCR ø2$nXjk (YT@ŞÇqcUn4Sh._с Vq%l>pipآi,WL& s%VflVe>l"Ԓ9;?Z[f̂D[Ľğ0xO nbd|^c2:2@w~ﺡu?A_ c<"*Cr~WÂ\#A p>f]3\q901\Q p憒cZw  /g7KZ/zYɍp6d2<VY*Y ^ -` (kֵuEpn4u w 5U JvX!+0L鞡G5ȓRD\ -KW*|pqdmV0lur3 E\_/;&5 fG<:cg eqrKT\(n Da`n/DiP%j9/rĩOOwhKE.JKs=Ρ2cW>%p`"E *+щ^L(J3N+=+ymI]Kfˎ4ڔ> qq\R}!*$rܹDܺY B*|_": fʝ3jJ3˨_dZhl단|f\\znj*n74kCiHH>i7}_i(:٫Lqtŕ]t(z~z@EHq)V_rr>j6emKԍre2ZKQLb+U,[CYQbʅ 9Xj( &LbVeBu_Q4|7nRZ1&a=.@5]*uHL-*p)GS01IZ9S,&~q”e'pQĶذn[rٚ2;OL!RjW, 2\DT/Kž#+*[P#.^b.^bWM8HKW/\f/\). ."˖O)UQJf8e(7/,E Q̈\ӈ!k^g\(Gmr:|ɘSJ?|o!_fT`%n/ӌV; }S7 ^WQˌPYu1MmD^aa_,5.ٹIhh#]2\c0#\֦x<̋ N_W⏟;!ʺaFf2FSr02Aunx_ -oXwQ[#*[Z3odfb5bѶŅ/b;D^2}K1sI;1p]1S'Ҫ7Zzqܓ&N*نf3U seaU6YX&YeQ$l"˅5 dF^b|<_;kS[bfUcݳ{ ļslHcrNjf8~Zܵx(!fو,N2TqKIs~b,xw*.10\y_xpaT€2ؽ#,"@|͢`ڳv&"LXQc+Q- AMd_|r;-DA,QUnri%S$ևc -ٌ[Wx`Q%z5!a<_lS))O|5;ig5զ>֒hn"RKbj/dt -2h9oRf=yv!섾m0FWU;I|ƅ!70oASaEV!6]5 볷`JJH1uP\}E3nꍻbn7m]A"%7ҥ 뢬txT*^lN ,Q u -hI` -cBwlWz{Z78J*,a|Z]bX,*W2[PE(BM8Dcq3 -ƮkPng"K Srx ua7UB sfoH&(0n|q^GPS:ڊ@i}1a3Ҁ"-ܙ. -s1,X<]%d{{ >TzK?ڛ؂ma%x]Bv~ O*i FťjsFu V~?Hr%@*֑\4d[fьsBfijV]r eW eE/kKDY ߨIR.>x;-RYQqLX͢V$? -&.:'T3,pK)z't\9^\ubT-'wsW:`k /p9fG31)f4UnS2%Mfn6ii!nY?Q+QʗD̴OSBW/)[@/)8ZQcLFx - -,eC9ob$~6{b˗|1(qr?rU3RJq5ƁIk]p3\P3x -= wl>^%DOpQx\:7 -v 9a꽚 f#X_ %JT/D"&-PJM]et+eov#kA&tv#ՉTܨj:p;Fv<ЄA< HOZ 2}V4ǫR˨,Yjꢖ.Nl= :|p7/A Gfaun8\b6%`KeVJ{OLN-,\*Vzx<1YܷQ<2 - J+<%fs/{2/W3l.>9W=0K\ɻr<_6_K-7qb[qWRޡMpAH9LԳy|8\-RR?ZYE]e&?ZW%{~ߐzxXI&DŏcWMA*#cSќ;'_^)ׂKUK]JnV.7f|ķn+Y<:,${@N̠<8xmT=sz U(񁚈m(J˹|^!, b^jU*TJjd0JF"qUަXbeuydYN3ey'3x _;O Bo,ś%_j7r~,Lw/A+\WkpWdmP -R`[_HeT6苹^Y@3>-N.NR:qQd@k$[+ƱD)XKT.R4k^fa)L^5늄5Rۋ,R?\75pPġ 3d3_C/r[.T.u3<? \rA|3URuDwR/bb* W(;V$rOSX`V:-3]ŘJZjj3J-K6TPt⣗~HJT6$5vQ=mk4xx欕2ahPIKW]P-!dݥ)ٻu*cܵz| NW-;tU;BqN9 ,rGLĬl% -AIhnuO>m.tZQg0SP*[5 34+6@iV ?Z`ӯ4=\J7\Qu\R/re*̡Ր*si6K4@(gF-fm+/) aHʗC <2<"+Frnp%]9q.}.($v! *Ab\6Y.f07r3*c:qe%*Ձk|-<*T.u0K UpbjW"5.xYIr8Iu #-/jb2*phJjMl'~N?EVjc4ԠFBq=,nO -:YC-Yc+ܼW5|Oa. &TJRj+ij2E"OGR^× >,́VV{$#gw)JԸGwKu-w m JW*%gL%lj2E\9Ի+jnu.\UFWKR_Ǯ^,prC?qRwoR.kK4cң -K,cW==̷]KG5*#j# E1 ?\-#}Kyc5lB[ k#nxz6%gZBX 9 _og0F*Z\ - mC\z<1j[0/&OZ %D5ρb"ܫC!.Ae(Srd%jjRagܹl (]`fgհΈ-m.#;UΣmA%\.ҵ]3Wu+z%Nd3 Al]^\+&x1oz @h#KQsO%t@^t)7ZF3Qj.ImAm Qn_4*" -Ff eAZ.fT%YR 7AT*DqЁ\[pPu\> DE c n6⁧M\%m?{<F ZKAxe@yM@ftgU!/ˇM@7R,VCLj|:8q<{ES0NDžmʍ1RcҸ(\*) F5:#dԶKQ.TeL< oDc.W -_Ij]j>_@݄7X 'ؗGp>f01GENbֱa.YrAad6cXR.:IJK 9a-2bkr-HfUK Ρ+RC+SPexyQ$ -O4]͹VX7>bZ n䒠PǻDu_x[=*r~\o0ӷѹXef0wǹ/F&Ƅ!2>(6To%])@Ɩ{EUxW-x3Az̢.Ošz.7b5}FñƊp,FQ&v= ,2֥ԺQDzkܺB.̹/1sԮCMx+JfqEa[*J _g*0j5so~7LuÃTw.\%'+%eYme. M<JDڻf^L8ֽ1Jhp+ܧ7 17j?-hZXg<#5Ue5[3/pV\O3C@[hPc[LB*3/VxD xb\s01 .xE\ "|8U+U:ydIL4ޭ?^ ӎvjs QKzE:ij5Z(Qǝ M%4A pW4H*HKcMQsl Fca5#.Z0[pA$~?p]Jq6wWOܰܵoU>e4\ZǏ7'eV&`T1 pxb_4uQⷘ٨_qV-EG^Ί $.rNyNpQ15d܃ !plпlڨiz!W  u%S01noãڬT+/, osGň,=5GEYtjE`T`˾.Zb71Re*d9 -x]jznR1S 76%@U\ &OuZ -"MqܰwjŷIOv?'-}ͳQ|^ic_ea}njG!d7L#W\W|\xqkܸq3ImTn+ph0&3 Dsr8ze,U9h`ZMʁ1|++#*[W k|^++/0(sKSd`Q.]w7\6ԥngw3] -Kc5@aJnU5K%d5qY&nVp047Cs7\a(Γ05Sl&j:T_#<2P) 猪LDjmwFRFP+=:)Gjk >Z b#l{q3*'%=3'D6\cG,%x"[Q=_`Gh[(4ՐR#jP˨T-@*u JMRˆqs< θ!ۈ ʝWje#i.X(-;Y{OF5)u -xHDnZ%|1+zπ5F񎫈^j0D̹o&7d9@cڢ?Ok?lk4oLrm}X}NEғ73@1b*&+dWHnKfͱKWc/Tj|DԹM˛n EMt cmTdZE{ ({Н-d0s*c`?I1k3leZ7*#"ϲn]㛙K-M̃2j+ƂTeIҦw4-.`̧Pc1R;C<wXPzY{p(Lj0Tn6-|lĥ/엊u +!5Թ R]FTq#[┮%|Tt/7* C5wk<E<͟ܔ|;f( -<<߭4_?ŰUzc5ejbkpUZC::-KkCV'!P% -5Nn^"*ZvV`Q06\s *K=MzE#P%n\%eAeƨ~\?!`)Y|j,iK&k0}V% ?Ƿhҏ@faNa,u<Ϲk䗾-.i!*2MBE Yfn-B A[%qJ8WMB7 wMOpQYL-`<(M)e_4KF<~jQbr^M;. QGpZi*W4[H!qߘM{<6w)J'l -k31?T9OSXKXv> -`\ay|}"CqJ=ڵE󚎠$2wcKr8;n R\L^'fe b.Dj*4d*ťjJS 51Xpx8JFU0ػ9boDq!؁8-K|z>zO{? *46QL|5'B#_G҈LzTyviELP 3Tqx;*`%pUB< і&81d&x]}˙vc-{yeVjRxi oRa_˽MqP7 ϞUU|O pM$"%,w0#nRѿLY宫JZeZ"'evoq[5o -(?e0I?u?⹻/jw1 e}zՊᄳ3[{#N|%k8EW ^ls8$v E,rhD" /gsXZe˦8`M~d#Md_dE -̥H-͌45(#_YT O Uw)Hܖ4<&j0/4JG9~nZdAS :_ tt.brW)e<4NQyhRVag {ķdZ25S)_)TRpkb@mvʏ@J`Y"rRJ` ^]Jxh'P7 -EZT?3A N4I&JTItMkQ/4 FGjWQ`ywJ P+TRŌ -U; ŎP%&9"%.,HԹ|%T@fi*W5̦!R%-nfBWCKkoUXj]4_4 VSPQiAA-)3 G'% +b1Yvߩeq4|M˧\+Ժ0mJik],,=vXbCImD%dCbM@UpbM1~z3t`ŭXP_7 [갦s6e2Yxs9 (yh.TGFyZU+Wqh ͭz!ܪL6VA;6]tTѴ)p~q&}JzJ'2B -pU<_Pd~@Ot҅hPlMKhɶ?42೥P8Eo ۆ#錨df[fg\S)(D2NTq4ykLe=CU*b4!}C,JTqP!BĉnCl!G*6AԹ3$wrJ%Fh*QP-4WDu*b bUh&Gx,)ʫgO";OE4՜]5Q_jL3]jbJY3"հ,$ -:'~Ij+X!SI?F/>ʕk{K;V4aL\NYWQKS,[wʌ@ UD:xʮ -6`vncRQfԩAc1X, f;4SF}O>,[u\GQ74SMc̼:4l 7Mģ7RwaV9x\'c^JJn;,eT7)Y6Q_27p%KGԾ+0H\RyjfFLظ&w!+c6YX<7cVҥ@[uoTAQpIKYL8RԶ3p *R4S<-b-sq95bRu;eu—c]10$t`Q17!RO|<ьܪJ8n*00 :mexCbL!kF`o">4TAu *bYQ`md.sv%ŇuO4?W&-_0%KF=A+0+j_q 7|Qn>b8L"˗ nJDa[(RsSatL s(]Į -B94~&9AYp.47Jˌ&R+&*Pf5v2ڧrF5\;RȔqK3տ0ן?\ܹ9y)Ha> *{_ ?J  1nl/0nʥk5x0TM9ܴ^c$aQlϦ,h=$nYaYRjLJ1T1?=$}5[:l $(™D&" Mkd1KM%@n(qT0:`@-YrBt@:`VV_W0GpRiV`SO*vR`%Q>ώ +LĤVE -Ŏ]T[|ʐ1`݃Yf'dQ -)7+uUUMN{̡!.V!v45bd=NJn53%* =\V@lz?s|0FU5*SR]WREc,9Z)R HtK<0r/=o+N/rsѶ?L Exb2 }`x֡ZV c0 3u /r|x~eQM2T) D}qFf.fgpZL>c|6.Cg1r,sωkWҧXc-Rme -7H0 -YR#ԁA\(n$*홾 d~cah0K,Deo1b!-afe˾kqo,g0G>1㺄~eJa(IX!Q J˚epj[ ,B5tᆷ?N".5JL@}A YQQGuo gDbCVMv8R©cb/O`կdk:%w $ 1u IjpbW|#{*uP' !Q.])5^ϼBj.,kGHIlD[wk*gU@΢D -IC: E^Nf#L}6\@ -ƕ - ÉjKu_\JL|Q._.iˎ CCДS \'\2.^8U LCYt3+xg_lbqQU|4Ker+eNgKxNz8O+?dV3~$C>', .Na~]JTqɥk RΦ+p`bT˨pKԨC Szc+r%)]RJ z.ꤨcU}]"A1UTʼ0O?E{rDYrp0E`+fR|CGmctQ\b[^vf6k1:MuIk4*lji`Aݠ,4%Q &jAX+u'Ln`ql51ԡe ~կ1%J:Y`g~h쫶H -mJeLB%%f!XXA-  l,!Qf# -33e]ſuLc:AxK/(eTbsM%<,g\|̌_S3Dع dU|c&33G@nt.HC?@=$Hp|J⛋\fj\ -Y|BȐ*4 W[c5[錆]o|ぷ3(=fSFj^ :^A]0s11P."Bt1}'.+|NG:iVQ[M]ntqPa3 }G YaU*T0AӬw3nس n=;Gf,Uu ecY!SiRyd'@;L؋X{pSc(C^ ή&c|/抆^% ڰ3;!{.iW0@biu:5)| pÚ|ws5hTn f2fPB*] -?(%G LZ -w Pfzi-#|i5 *1%s`w%DŲFa%l:jV֣Y\@;EOmGFR(AD?3T+e?<u ֥2K5S -ێ;%Չ) ]i~h1bP[X)l,?]^W w<ї 2.T߉jL l.ԺTbD7VJD%6maVT0[E[\YN_ RP_ZgV Pҩno -R$[$#׀2ж$=~Ǘ95u:H!xc\荃ssrB}1p,SEpw4gJL/ʼn!i Kfop^⎥W0٩r*Ww;E. L%{#1HR*YS, ,LT'BzbQuMXJB⢡rDpO*v@\ g XA-yvJË'a2n -NYt #MW|[=o앑Y+[j:ezJLouB+bkRKơʹI c`i]oqFanhZaܳ-G -4Fkuǻtݖ_e\M.|Z‘_Lq1 P 2&| ܨzs\1.˃R \Rul]%B|d:~jz"*+2 -h0pj7(q)Ee˕,8#lo HC]t嵌)QD y -|RHF"KֺS}|]iRV(ZJNrTpBL1RQxRP8c~0qu5aTnSN,&5#kbJ>cR3b*xf7;D1k: h"<x 8|HҞ0Tvg"kM@hީ|pr!|.sP@qrrB_ -P=Ibڂl,F> ++QIgD{IDd׋'{K'.U6If -7kBT"̰R%ʩf#'i3x.UQC\[-\E*$oDx(z;@Gm_~r`0W`1m/RtK%lŪ(_X5cAC?}m}d"*ܩ?7K-K8U?iv$m L*J X%joqrNy^ zUNg[d-(Ǻ7eTYB[%y)E mu›jt2׈ʉRY0n'B+ FW7԰1>R -0c刘,xc3R%w1a *JƦ.\\G3Q-95+ĉX*2ڗP1n -ee%R 2׉HV!_Nvz&1y!`Xѕu..t "k1uW.JcUq!-`.0rK-pq.p(s.^&X|330%f*,A0g̻Rbw4qW,VV^(eA5}5\hb L=S!_b}?iwIs[.C_pM͌ ?#/-A}K7rx⸨/]B08bbTTfzUoCB!?*J+ `*2Y/ Qf* 4:Řd_bcyDk]imɯ,n?d.eZ),DѥoLg!ڄ:nUՖ{? YjZ|n֘03G ]Py)sA,3OT{**#,xfXL57 cڗN]2r+M -!}2*s[r!kf%YPTht\q7>cJzXfr\'S*RZKJYd 6K9*fciN9)Z\IA~_<&}:bB1u e̶8 VeƢJ(%y>pe(_ -R`(Y_wUb_ Ae-{OG߇M, -v{ 1=D_F ?!A({*LNϨd`Ԧ0¸ILEڭKr,O{\:DsS4ıKwIC Z:%5>+1]nkeChJ8Lԫ%ԸQ1,G T"ٱ: +ƅqY:iV>BF? -5 -^6ۥ"T72\YP^5: Tū"hdlz#_ʎc!. TJy'D-SH(E8*nR!82uI*;W51FeTa- -RW)!=U!M~b*5.)["trGr1(n7Rx".&Qr7A YH%xKV Ţ%[@ eF$Oq sˆV!) IOBdeSdaLj2fernffdwܶDO>}Z!;.CWgR8,MY #aگ䒎wE\۽\Pڱ@%ǪKR\TjiR w4*+T\ n)zyF::tARUKB[Z)ĝ}f?yFWDx[]!"N%KӸ5KN_q)ʍ$SHlW4V!.ZiGz./p-73 g2!60co+.384x&NIJ-J3BCQ) 7 5LZs+pT9&ng*z>&D4"Yb l"B\M>/AI2J.# 7(D=ƗQ!FXY6Wyry -/T,3)*"@ke|&,tb D -7|[&A$d@CT~&e TW7ʊJQlGEYjecRoJ2EbR7rDγ ܫc̦]A,=%M@1ɟCRRvSLÜXhôLv+%*YsH?[;WUL|3ՖmbR#fBgfDyNNЪ) Y ha>ڥh*ˇ̵n eWn6TQe ˉxqcO? xgw -TrS,39ܜ\vK|8NB@xkxs %;6=B  FAAyfyNqO0ޥ x0%p[O#9v]ϹnX:Uʈ7>cu.UaYT.\L3N o"K7ࢯv񤇿oO8~?,B{D$"o;'w(@cja&bzan -3ac כga3h;W/-RQ~έl"L!mb{_ؗ5\\+? *9ST 7qwLI3Oy{(E~;b@C^R:"0Bu^d #0c"DF֪.{Y9Txqrksz-1#x%BzpBc|_NjT@^Dc_jR1%4&1Dxfg,K0JJc:wrȳT p)qܷ_.A ;]L\eNf&%L-2Y/c~,f DTi \;fɊJr93w5ms$m%ʍܱ)ݕxA8n\,WlJ%_+~]sDBfrL3ᛃrK%8I`EK=.WAvĪZa~HUJR'Uu48,QΦg(j*: -. -55X9%10$3LFnj>n&ef|hw0\!fYnP y jˮ~JCs*%1azUP*4IJ+x:I~.% 9-s:Pn_L.[D@VC8%Eɕ\TPq+${Y( |C*ɁP6#.GOI<S:ӏ(y;H$G`G TPR]C,.㰷ͤYєyHoYu|@p`$)3*T}pGTD#l?i-"c۔}u߂dբF9v|*Tg`Dw G#SS\_qKF, i4,,&U[(@ˉKn;+5t^R98"s+ITψB\li\腬$0e~͖` \ķPw{ #-{LE]Fc m]:Rĵ{z*LUų fn[mq72b7c q_P_ALIMC4֣a pN}w9u a,Lʙ2L? .8cL6*dc5_zb [G+%L|x\9kS -LBvFK_YAS//e b0"|1|ḾgE zW)B< ^:JL:6\ {Ԣ?]MK@ /jMKfi*Tpp%R8jRD.Vd2ti4P[/X"*f-i#xՆ FZ"[ٯH?ӁRA7Qn)` ]mcUJ]ctH^1SB2m/ΊR1zK#Ar |51-.c#B0C'eoܢ!+1q>ef)/#:aL_%GDKQ3+FK%1E`/'5/Ml+1)6-j,\* -.͜PX@LQ0`!ƉW*+eWNNHULjl'pa730j0lF|g74@X`C(QpTG|Nj_R,1]Ĉ-Fe}@(Zc2n -ҝzÆohLPl>/hFz *xj8s93o|X%@i/sSd꽞ZZW -pS1.Nn14R2. BW!y_rƯQ6B-qbn[Ds2|q=R:!ㄊ@~,"e-eZ't7*8BA62gw%`UU Jßފ)@}44kB_.3Da*֥WQx$u;epYoYvb(u2iu^zpό\BQFqf '3Tz7c% 4A>`&P;D`:%Qٯ`GZ-3~"QnhpC -/0xb<'FN31>)EnjLè1:# &buy&+rLk!6>' eb\#e5Y. 3^k,3΂DJj [u|eQ>]C?ũ>ɨuP JD}wi{p~ %K4%/Dd8;⊔eQJ|,)X}DN%3rϸqɨ,٘b\0".+%||KQ2j [q_PHUd抝}eaJYrᚇ4a2pG7U&u2TEnUjTԹW..T7uu -4'p ^_peล,^SRR7R2L&jXKa-@bT? -%~gl&.So0GEmZ`c:T-&%L!>I/bƥ e"<-wXrsHvv+ 7[g~KP^R Dz=al=<ꗫ@ޕmZ^/ؙ 碈J Eý%9WҔz%9j~]ܿd~ B`V#$i3dG-*0^|VX7AyȖq- BXqZQFV:4)!TqRJ5 TFڪ*@* lW97-;SMiv$3e=E@YAv#)QY ;1Uc4JPI]fff^pǸa.lX⣆mFѪRpZY,2Ҍsy^ᙫ\L_'Jr2RTⅲD)rep^*oXKIJt%^-Ƹ-9VbLR%>'pvJ8MbԵ2[R|W jf*Ì7*(+\ùC *  T]b_r]Y2Vx&O eQP)vʣ{Z u-Lʽ*5* .s) BùખfPN,0R[ZĴax.j:fbTSvK/r`13WTYNf8Gr=^%T1 -:+TSEB&Kj9᪂.n+5DOʭ)ʇ7ze\c)QJ:벵/3+*z*/| աk`@% [^NOH0SYcO˚7 E3q1|xowM; jap1b&#}pj3-q"ֱ27-. pg t-ʌ8UጤdWq⚁7PQVND6AcIX Oe!2K@D 4(sST8Ծ \3 nUp*o]p)xa2JW\ Gpa?bp - BdSF8>+.f%FS -& ԯ.: c>` -̷ZRXhM/#]F.=˖L[R±KDˬ%5+17 s,]O! -`n`ВB|Ϲj/Se O,]%!.-IBi46Vm׉!nP~aiҭU~ :+yQT8/?x[AJ|E,@R!'ê!Mc9k\f뮀X_ (?n+ݢPXGW)ө[#&: %(Gܟ 冱.eELamұ;5f>ئA:ѣ#^ cKP|nkgF=ņJX &KuqE~tM5U A` tK={g ),†;=.euXĊ5.یfdPܲx ->~Zœ^Rշ=d>iH S-^YJWxEZ8 -g˰ES\WԩRʶBiYn6)9gfQv -J$Zv0]hnlȂ .TZ.OaTy2Ʈ'g.9H E z8ڬLǖ7Ș޹na6c}L38x*5.gLIfQkD '2eMuA#\;AuUlZ཭ER-E( |*Unf.-JYMg8{2)ap)l9%o. Q[ ~F2F)jA#QZ>Qa@PfԼ؇`Y(,, >;@EM=4lҪY{ܻC>}-V-bjoCS -qWtćΆQo.g[Xy#\TDU,16@Vë[d6k 3D0ނ"bNP\YCMe t:~"[k%!CtE]&> 0?ZbX)&4*+6>.bmbQI|fbـ[E{DQ;ʑZJ%2c -7>1ܿ1$1#q K)v -OܨFK|<QxyKZLSR+EǚU* p85*&85ԬMbkwRFPG - -A$/JcjyP, Bwpi\%RۋMhcgYf+3st&op+Y h/BU|Ei -*]:RAP .nv=.^tWl,(UBкJxe#d⃸b_@ ~gbf;Y1aɒ\fUKPA^.6xyaM1&lTwSցPmHc+-YOV]|9K{f*|tş -0sV~$etoFڟ)t˃mrcWjޯ'EsxݐeNÏњ߈gy+W0%= kvu+e,BrqpWp_ %ʾ,DxYp]0s@7{WTFQ(kͺ|;z}z[~Bئn~xҬ\ݞ&a$GeLcw)#Si܅mЦ5/9$ -_$ cx4 t؊:Nڹl%,RjUJW=\g&jA[FT2KGlcn45S]D%bTE]TНˊpANۛG\\T_|YPQ+~ -?ϾX]fcjQ[2LBSMJRGL)ڗ-c FPUszȞ fw,'! 0ɬԮnW=@*OHiA"B[6By^p7)%K`ܹDpAqxᐖ щ`)W:|}@AR|^u*Y,D7l#'2#]2RFرR20KX`AM:-I22xx%.xY%AhV=1qZ3 -%;D G -_K",PGѕZ),qFP^8`箼2KIi(&nRWI3Qǜ~EPK xx%u0}͢"ɌĶ c \u 닩~r؏L-U8tKa:8+r$ou1(tK(jQW.[?V?0;\;A"M*0>ؒB\w}q1~0(_\xTw;z0$ -)!DkFLqp8cuI,]CAqpd⟫ŗ^ :=N% o|1r ڭvQ @Go<@(x`uN%\d!x_x+?"C8^jgq3 -;_1xL-Rc`}}IS>s.+`{w,[X=ɶy=]C*>`0n -]kTL~pd5M˕4("PrMlT8~ NcVnikxY{9hQ~u,/=W]PQgkYu+Wmwtyy&* .= -/䍒d\*Z`Q[eyKV!>[ܜ [fxqU\x.>YoKX{RW R]. ꑻ%x&xxu+D-xq5:*4KQn >Z%<ʍ!E JSH>UjU\!\.}~ X奪[/ %e91sit\JZTḕ23wR]֥ # -pd%GK:ܯK9ݬL拔T2,Ы˸ TDkK5ܵ8iQ,ĭ1>q~GY)Ttas6 2ڱ4b 7>Hv`aⵈͷz[Eg:FVi.H1dKL^|AM˧Գr˰(n3*c*[o?3;fj*Z d)>8dZBD_B3gUUL a.<\_l? ʹ a֘9 ,q[ -0/~bȞ菬} 16XdTgVp^Ky Vng$]G: 9a`X*Q(? - #@DVL3e,"ھ&EQ@Oj74JPRV^Wslf!9cІW,"!Nk,q -x6E(S}rCPx,&eYzZ'\E)Ɏ/A|/7D[8-$uV7G3Ny`S6+EXś7y$D{Ȕiq uGRXsP~gP^@T0PD-; - qGai)MGPH'6j\XTRT7v։v^"J&o3/v0ҺA]+ .`JMG%È1 l,a]] @Q+)ʰPc2g-yP#٥T/5v IAX͘&&.U(L1*&\_Vr!.h##W!THohZ~cF -?C1+n?Vw+c&-$k$ɫ-r![YVX%x%}J:R׈IXAW6ٙAt Il[oV -0t<b /vca^Z rB%-#$qoļE >FnPEtlHVN(PZDB݄\+.θ -J(+T@ EZXXػl PAt`[n`F.koM%]Cs̹+}tKl˳T;F.z``sܼ$2طܯPj ISmjWpjJo?rӑ,!}0Ix[NUUY U2iZlF4χbZa̯=a,~!7yɴ5>t%;.ѝ%֟K2h^sAՌuD $n^!Q C+c脑RcYJF܊u;' S2Uuw~P0tK% ^Dg yiUGxYRTsS3)Wz":up/̑STʈYiu3|X.& N'1D^)&g蔥~\()jM b 'l_"X>҆!:-GmAQjs:Q5q;GW+TE"vn_\Kjj]ƹ# nok >Km1C>jIxȢqkEi -(So 7qp._攕fW ׍ ;3P)]Yi[\ %>e# -%D"͢u t& YiZчPF5UL 3Yc}]Þ.}`84^eԣV!TL*Ti-JMG}_ gQr.RgqZQ%=.ܖ*Usnȏc+'qj +4(d f+c1EȁnFQ2VW 2D?1\b% -KW4cP4b/%(Uo)[].X{gU}e|cA%»tlՌCIg[-˶DPlu-6]8xLJ9/;ctң°=Pd]{KD0m˸#@xkJrJ㎣r-c3,'eإV)Ԭo5a)cyS_ʌ|ʢvX MJtǻʸ=ŷ._!`VD|+eJKuYƒsm Sg_0"Ŵ3P+5_|^BVg`TxGd9P%'@7*cO ֧cNS-~ݪH!^.L| -"30TƄLZyeq/a?2-xz Q7S^mr\\c|{Ga#4*#۶?B" {lK'f1CQ2';gi*[S%w /vMBSorP-ꪑ iX#ďLlt )wp -,Vcvq< (fb2qK=y?O &doJ( - {0 -QZv O%;Эimܯ3fCHW+(1|n 0B\2B!3qJ)YIXYFj#)!&l1pY -pb]i -3kY - 7EF~bT幩q&<Ƴ%_ V+Ÿ3Mʣ WVcH3L=R@Š N@Q;@E6B"VBK^ j{R./ ȯLu>gR_l%*'"4 -Z~P'ʛkyY |nk&#U.u τr2B2bw5olDas8~`6\_nZAʮĉPs_;eÌ.W%}`Y~bpJ.cA-BNR˒ lH8y%FZ2Bܡ2?Ă,P(\ ef Cݟ#4_!Ъ*Y<2OueT}YOL[#vJKk+M ]*VA"r0IfMͅegGIyl3 *d @nUtk,N%^:Z C^uܭ7:aËm nL ,pj eL~}຋}0x>_T$ZqY|d#tθequ֭QZDΒY_H,尘ƸIU.)=/I|jH ߶F`N}k$qWQQ~{\+rU.'˯K>EE2zŎ\ 7^ -8t8BXrYkmY/});fC35 BNBּLK%ō1 ez$R1qRGi*b*l o0y!Gjʱ]mNg"HR cZ=o0 `1mYZwaGe2 0,GYۈ_ŋ늆`-QS텈JETd&)$ծϿ1 -I3SpT +1<8aHg 'ۅ8P7Z%8[K9mD!'epYZf[o!RvHI6x升IAj,/?[o!]ǃ@Ɇҩxr2f\簀%' (Ұu` ]nX@*8.ѯ`KD6j>Ox(]W=pa2:S &XآtK]H`n`wTC*K'Wg}`#QmsI.[1Oqu-7xs+hX$9οYhؿ\T v33F]Ԕ E`T}Zs7Lf!` -E2J)ālPrD eRp5*=ԭ(ۈ#NqP>5;pԸG#<|/̬1ƿf<ܾ{9l.;a8.`X^ȃ]Γ~FpSV  |ތRhX1ܨm.WRylBFnt?3ܗ\+w+a:}bJؔ,K=@ -o-r\SB_|~VtzY `Sϙb[,JFw%*"15XZ=v.9`\W}ͶemoFNߘ?U]DUć3ݟ1 2ThJmذҜNB$VEl~j߸&_qƸMAB%tOvlV]r$ܲ3%)<~ɺﶌ¬ryc'Y{/Bb\nPcKy"bRTkգ#7*wr1QmX̾߇)e@WJ[w.؜%+iXS D,E\zm]q|3IO^KgH+*4.?Eo "G $* )P*gxf t4\-p/d[urc#TVK=+6LoT%,3hifEf*/i w}6}s0m1] `\h*ޡ,EjeRWR(WC~_Whx ^ A#y\ % ,_\Թ[x ؜^tĥ#u-LLw.G^Dm[]VDh4RT.PsxTx*e pG5esd,3.R(itk`MY%?)%K[+yTi~% -[YH+?ղ.2ı.< K4FBS-Snn#ΏbVxʓ`qh PzYK̹XzgDc\*`Bwʚh 񢶕׺{W @eMA(xhP-+"*bF@n+?ҪKHuȔ- fUQ76d&sJ~i ǖ -MO Q]*6#Ya{-JY04^S6ӖNhXOzimBYg?W:CLyxab̔fVqW:l%fgWC-¼1xbyǿʎrmH{u2Y h:qkl[ #_sĹle|0Rȝ$=* F< ץ$i811p1n=%Ft!|6m,FU7>ܧYw -#ѣJ`* (&cR( ٿ]4-<+Ikٽa1ia'r8rU`Lo|J;0J!}Cݼij-a*]$ƅa߉s/ .5E|3PAeeΡ bDyZĩ, mkŨ_? ?XCS -?OۯJQ8rV -Veþn*]*[Ҍ*zDNyJӺ|0aƩPeUA|,|ycB`Eڛ7*0u۱OxE9%9fao<Fj;)EH jھYft@2)0 y>c*0q)gܚkWv^9? r]j#l(zj_,Z0X];".(v{D!Ew`iF4J ~!Q۪EʏAʊL*uO@'}|hvqXN #cd1"[hԍ]q6<'io1YBKqXoH/H7t $uM2En0 TDl wm`*/a 6KaCx/0^*+v*M*U[lP[]JH>%cDBtb_ы=e?Jg]C_wQ1 pHZ6c(e o,qA.k0 FeL8Z_MEvz~,lK,/Q`FBoۢa]T0oj)<[猟E??ْ@ةlN_Ò%wB4xa^~bϘs-~+)|8,ࢊD__1^Kb?xD6gC@MW! Ml̄?^`d?ѹ/4%59qbCV&uK qu?)*!0rbP/d] 0CL [9j"OS=`uF;V,qOxg~,a)vCK%Aa5/ p¦Oa͕PCoqN `)IΥa/1Iyb65ܲCUJL hZ[;;3|Rq<7.5*}A|uvǵK4Bq>'rR  yUb£)@e?-cx|ϩbRR|{}ƻWt`t* <<\sUpW@mwB[.:q, qM뀭UhªEVUeķ̶7eܾ%Ku=р6e8R&( e \6?ѵ*G d[h%xk_-Tp{'ѕeGǍ1*#a|N) ~ddoe*(ӎۘGU*<+ |QP,Z1[Um*KXQB0ݥ] `UW9 T!b,HJ2 5W.m5G\#eܺq,--4)UB6W]4CG;FtJk{VxVܨlx.٩rXIC n;+ݧj>ʼPwB TU'R&:0; oRONK, *ѳ;թ[HdlUI[WO%_5/1em7ԼFʘé{j){NbB~.deLsqISj' T)BX,M9ڷ&Xr۟MYŠñBC0ef1_{0ҹykuvYٕ+*]{׎_`)q=bv߹ в()诂0o%>CR4L]W,y?] ShbM8nSy|$_ k2dv=K{䩉zVXF&ֵʁ6rb @Tّl}zlḛ#/5(T1 Vg` pZ#%hV`i 97iS(3);gCײ|e$U B(gh9H|_rq0ZZX8g4 -@GFF8_,\PVw -F+odŪmV'sGa 0~gj ߁Sᙨ3OF˕0ԸG/)VHؑ[r5Ҍ}|qR;F7*  -r,~bs~k^nۘ% ]FɛZxi)Yp\*j-裣NJmYKkg蟸$>hJ|+*0Y\g-SUc%z"^uK%Ħ2]`k1GۿM@.nKX֣hQ"P*H!CIڍD)plư! K['nSNM㤺ߐHF{!}Ii/b +Sa(Fĉ.>fe$2e< KQ=˾Voň"T%SzP0NGz-h/eټ*h{\&K*L-Glrp6U/*5[Uu j%B6~f_Ԇj[w <t2Rh(*הSEHϖ^|C3*=,AX#"1` u ĊBn0 -䩖*,5͝Cc>窩!̤/WWf]WEJy%.yYу,9&4|.P"׌ -"vBW&2DQul6Y8 mqQ,@ʘ%˗nQ*̧_ wPicLٝuFgl;.O\fU1zIY_F6Y0 -`r --ʴL2ri`5,%"Q4P%ݗ@ Y:˩ad 2 -@iwT ..= [0kiN"E gZ0% lli-_͡x!Jx 8Tz5N,K"[]61nRcVT[ij^x%%)~jSpo,U\\>Ta|mGE@/@5#:]M{hQH2tkԏ}VZl_Fl[fe LbEGRw`c`A߂e%*fcL8yƥ9.,Q - Q==XS6 - "[|vDn~TjtϲhiN*X&*- !4(?jG.vQUhh7:H*f]Ƶ>n8KeE -7r_q3c`YO2/x ]45MSWb$pwUv]=˺{;02mQ^Xk)M3kLWV 1OgnWVf{ -a2][*0e]@uh0Gsp -m:Z)kY'm*_ ]]v&ᘨqPy# hqa-Z -3]dBUlD1oqe‡E%޻c Vg4j}Y`F\,c5?g6<" n[ `aurjUBMm\0hEh%bWv>fMN; -RSd L<&n X=Vt}mO(gJb-j]5*z}N>e0 DvF^>xl5p\,QDGjqq -Dj찖Vs?̔uemi1юe)KAScŪLcHkB+;/qԩS$̷,LQzK]a[LA L}5F˼m_1[) Ʋ&q/.+˾Ya~.wI<ʜ@0 \CogRꏕp5zD֠+ғ-?-;@WE?,Mg}Ypj*_ܪ:R^5.]u$nZw n ( (lKD%WكطXs^&J=3lTJ7q上-fK/jϨyJ #M~nqJ\Γv/R|f"A;5i!Ɓ9#}Tß:*o,3x<ٰ!.,l:GTKBf&,"4CaWl3j\Y -ո?IkmQbLU,B0o@[P8J`6@-hHXWj>o,G+!Jâ R(dGJE?-{/KZ-Ro Hf^-5E\%9<ƳS7rE6 |Vas,x\"MiɈ-ͭˍQ~0$[t} LO#7qq"IWws[Rk".x)dĵ*Z˖T H.\HG@!ރ%@J`)Jz:e `o3@`_<]ؚp0<āZ< -e?)a2R< -V9nrAK;Gk I>\Cp%Y7ɛ*SZ T"˃n>NF* Gޠؑo'oD E(K8Wu+.3ԱG1[=YE^,0B,bp[+3G2襖Pj\2e)eTnxa:wȺ1?dgȄ}hng|*Q3?bN 7eGsqIWj#!xw;r Zpxj2)9⪙|*ڇ'Cj5\O%Pj @Kh5^ A'go] ;;U: -h>m&7Qb,< Uu{1{KVPqcЫF\'n-{[ >].3U|XMv/CΤr"C4 ͑bl/ab_mND?5K|Oy7 +,Ax{E[O&byKuX]Dzt21s^42XZ,J?:4(u>aڔNI7uB[_La`{L #_k}dP\1dq% Q31KܣvP0Euhnjy d)wԹG+J/fPfh B_!w:!]D\OR]+pܦ(+0.w0MJ!7Q(zu< Ճũe՘#1)͐fgR֋+GtyPZ+tq_,LJo!@Yg -/iꌡYTX}@E댶V̡鶟Gw ERSMۤI?A0[}j&oqg.w.(l+a4_r;,[j_. -8(MQZS_og%PJnT]Í熂e.UJYx%GCD09y˄] 2b$B Q s܈(wQV{G{7o}9f"h$ 2-_JJJnEL[(--V(|\#(W~&OLh}R+ wh? )) ɽC+ -F%[Uf"(yWW)t6k0jSA=Ku`AP5.-$ƪW5ψ ڪ%CjwDK88fSP`ÙEǢdvEMܸb ,rM| aݫHT?ŵ@ AY.d\VA1(M1/t0v"-]#싷%]Y" ƺu-Uh!$29Y_ҟ fPXYK.'1&&HZ9p~G W۫FR*P`&7Siw':y Stve`S9l¥(w*aosM̷\h qt o#--+ gx"))Ilk+LD2џ?˄8;Yu踩!xQs7T>^/4)nd.{ewIrvHKzWJՖJ= lOGkEj % .E2lITZv3*A R-m*f_T -|9I/<ƥ֢\\DCm-,3/}w3uE5OeC\N\Uf5qW@Bj$#: /4V(SYlTø5p nesph]IM,3Hld!vupJƺa p5-Z3H+ T3Z4wg;>Y;TC-i |(n=Jc`T(5bD#%N4vp`{_X5eBIz°*<9q5(z38LL5vm )Fx*xk,n;6&4">U~|0(Z -!ru4 m+-d337#zD!MDt 0hRr-RTTGXgxC5PF\8+T 6ۦԹpxgu FgLws21fAo-"֥NK7ܜ 1ʘP%9eBowLRjגedRzJ.!-@BwD~RW3Բ /P. 8|X6.PWU3zKwfaqrӺRz%7wf -W5 -)PF3J%5o'l^lyL- PW̚++CCaQt7wJ -7Zxu}J}\n&K'C}0*)nHzڮQى@I҄T|<>I_pBJ{-6j~A)b3oc 7+ > q)* |LebMQNQ X@Eƨ5.DLf@ʶruJ-8x[{$f2]}"j҄+Xfb/촽JZLڻa!:~uGyf-%"!Rּ({ILH -U#gBmf-z4K+C[64QCLe;!~`%BpL >)YvMڼ]Ҥ]N+o `2Ө?W3;C=, !KBٙph\ -KNZu`2.zbvpM -a"0}*2q$ -JƣUL>ͻY zQ`*U]F\%0[T`T/% _5잿,յStn.Gu;l6^_)W{"c_htESW[P.%TxA3 e`+\"M\ɶtS3q#vQB=*5Sp$UmbȼܪN/Bu5<5 -sLGfa}X*Pz1GUpf]ؽBqYG-\UJ3 -8OqL.ܯp`YE^X{/Q:F5UEd,I}N5 X b ]鵀Hc9JBP*Uk/6Z<BV3V @Mɖ)4xLg4~ށclFUs] ^mȔRϊ# D瞂L -ul#]le8ˆ T5?L(xɞ -eIJ -uP wYQe!6sQfxRpS$sh׋p ˳p~.Q̬ClW f.TOrlYU[&$xY{ -jRl'сL+@`] t#iQ"ѽ(!u2~25W_.Zw㺕-m*WQ& M{m#)]n +?p~MJ4Fv>x F|S+.Rv4]J\ZhjYB^$IeSB_Q[>o -Buzp5ꨲ|xD =Phgr+(;Σ~q*i䩥jKGFm&sE4O9Ƙ -2S<]zYH]’b"kUgN~=Q6Je [W>i[dv"\ ),-\ -QϹYK1xڰAx,0UPGXf!pQX0U - TŦXR{nfgoQ;0j\4Y).XJEaq]\J<[K/2Ug{4|DhWRʄc0foJ|1WKXH:YZFU?'Ke]^;ky cWcQc<-ĵqҧK^^Sg۞_x2 o?"XPO x&7yn=q\MAʫWB#"QK&_HUO8qsAik-qXh@bmhuKpWkR?#?%r 1qZ{6ϑLr/U>,=sKl)48U_s~&`iùLԫBh/H#Jϡ_lu]Q 5njXmXR^&lvԶR/-|18KvƐUDwrq02PKRԺ %{E22bfE.eScwGRߪk5U6j\Y.FXh?m穠Ś4Fzb -D%-E>4zuwD@`X-B] P":M ZjU K_^FKR[V^W,`UB c8ag~2izp~PJ2Mt+ڕ-O )۶w2(n06~-(~j:_F(|h5C[3P*EzU``g c7@;W%:S>a -4h{W?o54LD֥w -%;DžDuP;Ftab"]2QK]1IiݶesX 7l,"^(w*_uA.CۮZ@K28,ATc-@n\Ul[MJTc.0S|"TnaP5|p6C]f|:jiIK>IXw_ṋP2Zi]?=nb43R=?d>-Y4 OԃaO K&tOP'gXGNf}+LψKG8G2*RT-C*u)kJpruMB[HDFQE,do$-t%0j"qRU\JL%FƻVD]%꒔կl IB -1 > GIF}}MQu APXcM=;'nk~ -kЍ#&ӌ“>D; MJ6qo0.K{2̕#H3e?0%Fݤ< OV)l e4qRS˭Fϐރ`s? L@~\/ܻQ"PPZT. +)lgg"Зg.i}c47]lxT*ƥCZG ,^7\jtn"b4w"^͏H fRJ! -ͺڀ:HCS5nI@8 <ؠZB=U7MC}MX:Q LI@1'6z$2:5q:VĖ26h]pfoPO^-u d_USVS-6DDl[atTwPd^،q.qn=a\GS+$:29!T(|P.QCL0e_AƸ:g ,"Vu>IbRĭ3on>͔Cpj?G{1eH[[i<1^5DnD,i)LmUf5sqJ:P{Ck DSʵa님[R)a Et<3[ѨkmAXdPۺD^R/5V;ݰVmEcmNBZͭ G,1\lkdKz){"崽7 Q)-d*{:@Eg#d]T Lm8IRJ)+C̬ Xad}33eC}MTMQ[YǔR9w*T.\_$ʁ` -hc Tyq ]x'cyζa(*@lzZg*^v {Tv*'7ԊK4 UR+(ܸLIJ3W DZr2cFτcl -y_(GoIynezX[yqj(5uqy`Q-}4|"LoT /01 -ܿrȢb¯eDZG)@`!^@% ^LVZUe[UlliU!`G\Iw,,0K1{sJ |i)Tж5 *M% K^˞9,!+ - {k,!+3AlB9SGjkV]]\Z_0TpHĐlv -C -#.vY㠂AÐ 4d+,4Ae[< -7҉R$DDNĦz&%T5`"WP:X%ttuy2 -@)p:jQLqJ$. x1Oc_R*_I=ޅ5o([X<ES+ Ȼkn#8P*4GdP ~Zn0҂>F~-;s8"!X3Z2i!B;#iU*\ m -9.*nxB;2 [C2-J&%V iԹaG3Z -J[ Fl1p%⇹^%Jb\/3Kx`NRԮhkԥ?7j0v>I1ɤb_~m~ 1H?,b w\>0\d#c#zeTbs$%;!-$o(ȪF1)ef wRx'W,TDTT -ⒽCXm>Fmgn$~UK*8 4wCcxpTsek3QHYEA -@s(ٴ&[|hB-hI҉ͳ\P3BϒˍF {la f8jC/a[\OH}Irz;9?D3UD_e0s n_j0a 2ȵù\s9T)ӆB'1@~I䅕f#ٜAgr6оkRʰ>X|WglHԉ;bPXCB5ܲXRr;j.J6H[X7Gݪ;*.3GO] qV#, -] Ymc=p< G{ |*` VY]\g1n+ )- !fJE}v bJ <Ա{дV)Mp/~[H렕~ۄ3%h뎥7*卲P_x[g̍ ; )F(l"D -hr˕)Cc޽3P0 -cEc'>d$:(ry*I0T  rI wY^XH!ddn6\o^z ,oԩsulr_Gsb,Q#/m`j_Vu7E^&IEpaHVf/Y Y9w"2rRh$G7kˠWsb(Ct+YhrٸM׃ = nں)3HZI}$r^kYa醐 :͕nHbE2Fd*ҀWYFiJ"ݑS\X"fڗ~ % -É}尓VJ.Y*M[{|Y'[x3+qiVH3'o523E 1:4RZIMGːV: \@PRfSbtR4͐rܷukܠs_@."B_]j(pZ䌧r0H3\KRaѤi ] ]Eu-ԮQ(.ֽK\#\L% aO@Jq\-/5#@mAj-m -G8{mW@ sw{|Mp|0f oj/h2(L8jy"J+w1Y$-K]|c}k`gSHA{pVw*2QlF2Bb(v@QH*am-;%F=8Ysg -CfZsmtJNgaJ/Tj-MbaVĩ,$P@p2;jc]V\?_P̩q/Lhǟ5}K"+vFnC[51zBFKƁNš3R[MJɪJEl1D Rՙ |=޶}Eh n8ה2m yKj#j+u"t=٫ER\U07>!-!m[ksdh PMKp&&(u~Ir> 2b3Cf$PƵ n[EpG#n.xflm:/(yeq`Vd.T\yvtUf9i V`r8Z後_tw -# B_(VmLaY\~eTgUFK]P%E:9e~f/fڬ?QvTc4n-ʭœ}USU+-JUekVv^-!#96x-CV+Ļ3 tX;R7l f +$NL-Ʉ -=p0״|EB7p%vR*Wb_G}o\6 )r^ 3˚SmA5lcG} :f=+ظf;sHak -4͐WcXBSd#-ijy-'X$K66]? X}m^f%m}vҟ4lB댫}Sh,MډMi4:\KT7Et%I ,OQM6)RN޻KmȲRLJMX-Ԩ nQnh7e %@u*7nd7 -n rOM Y%k1W//ˍBL}ˊ}}D] v!sIr>YKwuB)n^6&"S5Rڸ)/ͳ(?:Qi_:E"7S~b8[ ӣh) IQ.))YFB\IirĔQ80/arIr*$|K4x%3^ԤE/JAX縲¨e87%\^F .3[.Y4_ᔔhyj,+QZ"E AHL+Rϐ C\LgFZiOs7C>GX'5:ͬ=e)A>Px"Ij.? ̾T:>yw- .*tv!idm q ݳwb0K2 sHgbЗi噍8y6]UD4VV"EˍG9ٸwPL;`ED`]jjXT=e}Ȣկl#)/OSVU{V\lf⛙Ŝ"UCvp*[[(nvwzvKn@h KtP )_ĕqLt[ADeokE$}"3`*\ Yb0"t?J[D~b,jpxHjkLG[!(X}AT7DO_0wfT&}B2VݦHP'/05B3 UnxtFFE`-X,e'k+զO3R?u+Yӛ=X(RV$ oq R Q Gjʀ!E%K?l#_2S 醺+3P)s>Cfyt~0/pF視_D=ۨ7yiu2 . sѕ9F`\e!nY;]*M[hïY"~+(N?0IT"kw 8^@ -ї!DVc9}*!~PUEiB 5)Ng{<7-v|USֈ4Y4 &P 7<2喁hH%kw8acfc ldZ]WuE;@%(d{9~Hm.vawHs|KIqo( ӵcFj٦_0CTɈGn/!v6zjQ<ԴVV0%}wݸOXcWU}EdekB -r&*u)Y@1+W g NBvsM'Vjʗ]K-T+YpDMe闡;U֡AD1 - +XD+A]1 U -4JURJ|i31SJMlZ~-&'^2ZwC/ z10Yg *zN8HJus54w7|ukuk?Q)¬R}il(w3ϲɺ㧋eܻf[*\vwP|+/DkҎsA/EHɥSIG&JH_[sփ+P4]WA-"J-]@1}ˉ5| WQ -qkB!oN")#1#xX[/̳S%/2%MI+kREVYR*,˸wưA3oi<̲LP2lsUyjw j7)1KB#5,:Ġ2A0~ Cg q0X -RH # jI+螠 * OKm`(\@tN…_Q~) -m~r0X )vQ̮Γ膬 >A-6 ffj-FbD.Rv-.^Ϣ/ -ڥ=T)E 5Xf!vXoU6ZbH̍G`Ke&Oh,KՃj$VP[4bZCpXb0L헬T[ʨ%#ܴCme{.ft1 K -Pw.P&S*1TTV-ogaF*b,>pԷOſ!"[ R!.h^XÛ|Z*1{He=(̿xp}jL^0Cx{l{"^=AfvaQKYd)w:JHʛHvrCdbOjj7g6~ GxAMD~`Dks-IVwxLE@KEﴓpHb:e=Y״flڑv<--QTX掾ScږaHƵ I0 -Uп2!D*À/TՑC)G0νYƣm BB:7;T5&!haH,?2l54_h07ln \JZx..Xu)2f^hqd bQ) % aw.#4kϭ7Q=ql3PUς .*VC6հU8H]IA[yE@cN!l#=^x>KBrPW 5_qt~>_jwiH!E0:l*lHqP%r$ VQeb2VY*U}Jn*xeQۃo=c;J{epRb$:"UQߩ֠-8bܨĕmN.JngY^eקDTPQP^TesL;koyaymFDSi]b c:3.B+7p/ -n.BE;q_$-2 R9#,v*-Gh}.[/j e<3ef1eYPUphsQUj+/Tw)ẗp<$!jp, M`;ig{'Y^0E1R֭=K (рpۣ%;OƊAdcMxc{zNW q[t\YE|p)~ԗ<} iUdoXڱqE >EtDe|+?R[t&쑭_\v3{;Wu ~$f}?RPPX (`m̲S5JbwJ>YP. 튂p>*!-!\j Ws& ) 04լ=Sp+OWjMD,RVX"Ez豖a?VAQ5)J~pWݷY ¶՛dn|B菬ЃHSV(;bd=Ф%!#zbdo --!MZ)HlkadfǞջj\1& -_&,mP2HB+A| nnXAA:(,4Ia~hZ;pgCG]w -ыrEj%8-pR`0c]ڰIGΐ_W9\ȵy^us&Q%JzTj.[ȷ Srv1ݲb-h% -jjAƼa Mԯk\^8gX86qC T$Eiw}Mj|Eiq/Qp6Ã4];t? A7 x^% -yKԬJ3 W-Ki/ w2*-# -kbgmkuI DsxR$0ͣ?JRR[ɩEʶ>L-(9IJ7]k`8>HgD_ҭpgkQi?X 'EԂy%+aK f~ En{#(HaaR$ZN}!,5HK *E)8)2JQ&"[:QEtMV_hnl@Y6JX}. T.ԺnTGDX("HH[xwdW&W ,D_#J6xÈբ`q9\24I!wѠbj.hU1C/?eW0_K1H]2S5aUElU*`DY+A`)K-UhёPOg X!(էZ51( R/ozgI؅5Zhu¦ g ~Vf`l镂ȝ-Y٨Dqwh6mB7w`U0Zti,ɧ}`B4MueR#:ω56B>$彨q4VdQfT"K̽e\H7tTLWԲQ*;%T Lp^ Ip̤c|+N4Uڭupsn\aKO n ނjq(;KmCScܨ[Hj 1 T%D @SخciޕU ^^x>%蹬vŨL\[/\d &kZI-8 <g<Xao-RUAKP?K19yہ+(o3;%áry_p%4Ŕ<jYUK9o~j6$e sTTLA:bdSsQQ,7M/"gBDԑȯoܟaX 7xO c-^-D=uP\qU:m7䉰ڞ[X<M0mR{˙L;E+gZ=B2|li~xQ(ݟM:cGH@R3R--;colqpkVOGĻɯnWnGH$!0PIkeC7[ɬ{wD^~P/ꆪE<;@ -MJ -&YG6%J9;ٍRHpˎfernkdY%N pb FfQP\k@6+Z=u"G\e7* mPSZ3ih;hޣV`B8u380ɟ3w ܵmV.ȦvBeg#.O hȒ ~tDԸz+sG+ɭ`@Uͤjg+'Do|pi&. -H utP[@PRd6|o -^% +J# rs829cQB*CJ1I29\a -_b VEq! -7,y ԾS9n%`i,ݑߞ72b֕-܆vh ^ψyP,nRTګӣd`KSHƱ0ę&f! ׷iov̕IMDe3| -GG»NaR֖QuWczkRe:E 1ҡDY?pNjw - m Q+77@+a srp^!!\3-cOu2*Tx))jU`r -/|ꐿww7}WJˇDCsWCK\[U_ +V[|DnEB K ]^]S\vp;Uaf0E$US\7J2+a,Cq~l͓#,)7q+z*]u 9&(#C -΢%3PUJ1W}_YF'E{ -Ju5*)bWCN3' X>Y$]'1_Hq+}y*˜Av *Y0kD. -Kj-?Əi A.U p`!1~5(Q%gC3S3V}0@*b.ǭE1.Yx̬J%pYII躌X|ItɌ|4n m(fc7XF\BU-:MWszR:1-ޠb""FßDT }BBc{NS; R -WAaX)x_#7q'uԣVz2ϒ !Bvl\LV, o0O}ﮯ }\fif;Ʌ]j>eY]9][h|\exaeQ+*z7bTśolX%J/y_w\_fW'bJP%wc09 f&DǼ?䡻NtUw[.tLe#XLmVƈ -PF۹JUpMxF -u}02(G4%#.a'7oMRX7Ae*[2 -WlE-B*RlǶb:wjD -QV m0qcõeCcWQ:!1ʸT_{K^"Y6@ }Qa -Gf"[f4+UT&5:%5Il -FCHXo5(3[c|Z.5dl`FЉŨlߘu|^'1- ^:PtCtj!(mkHg舆bVd[Us,6ҹK>Ƀ}af E/Q&f<|݆Vhf*Գ9cY% -lk{7)C1[ugb,Q+ jO wt5|q"uQwѨ0U §V& -w;eq @%N.>ĩRą-#+!aymr奀'ZWb#%?1Tsj/`MUj5*_@LkuZ 7(o} H@C0\{Z0+SG@,R WMj-HzߺRis/a#ȋ5Mv>ƅ"uShJ宙_s/kB\\qrܨ˖ECEQkCl -#0JL $34U1)xZ;+hX}cmᵘZfnYxHGYXÌrS9{P 0(n@v Ҡ} ݽX6̺f#՝Gk30FQ f!D]>||,l)xo=vEqw,&;"R\lN#UvVD^wvBluc:)Q0Hӏj*f4 )vPg.|O&4@i1Լٜ)bb<h%*궻nQ ̊nFcJR7Ӣ,xWn:@Y?L%RUZ~*lGaS~Fi#J֟wxQŽ ewƭK j#PG4)>VM O?chldmp'`.`{l:FA^_̽AYP̮Z?W :!^)|"q+ճGD#~lAx֍Ś/r]ƈ'zđs/@@n[*[F[vRC;B\htc}> s"ۤkDE-!TNJ\=RFU887&:x -Hg(Ԭ.dCQMA]BȻ8x -h$5.u?<a~ưe?T\$LŘF;R)2\%ks>ef~Lqs lV7f{dwDe[A(ap8j~*G>,`}V )Y[.&JYqBWC&?*n Ӹ|ąp_@.⑖bjXp1t䎅1:/K!7`ú+B{#Չ®IU pܺ -8n1^.STƮT)?.w?>$F=o{ɂڔPb?s5#7; dI~]bf<WQ躁Q5< Mn',7?=Tke@tI|T ]&,/:әX:upTCOx=Ih5 V g|ü$ݢeV ޡGlQ`#ߗ>B#+V_uE2ˋ-g6zC*ԡnz/LoOChM̼km8e_ 3,{P3,Tu -{L{>act|XgץnQn Tj_L7qecVؤ3],5 :b]!b^T8h.n_/Th4a. E*>M ځ+%-5/ y?˦}x⥚{,~wk]EiEFǤS(#ҝbĦi3TB7 (jbK)#PeG͘xu*6zPhe(҆v@WĮW4ĥK\Mg cA*0YԪ{"4f|`@x,aDdٕrQV0 -U}pc%1Wfרt"jW PLUaH)X vP%P01aS ~>?l?.؇bamCh+&xGԋ"c -eSr -u7(gZjV5eg6lwңA8սGu|FeѷK0+Hj&V)*egs\ SP Pc[:X!u]jZԶU_=)baz4rޛZ+DF <RSމ^-G"?O<킉_1f pm!S$RǏe>8\*jSd}Lc)0KvZ6D~M%vWDEMiK*V!/8W;ٖ҈ .aeg̸,7 T.׫IT|ܶ:suď )~4%)Mt>JY - U3 0v(>L w|fԲeXi\|JqRsyrx,;Q7(\aJ -1 G~,ynZk/Qx&/**Kơ蕙sM2[AYsZaB7> b${2F̏ *1Hiecsl|`_j9(mh:.<渻€ /rj '[$RvR!X^i] -JIVP1c>Z3Du?#g/$9}4.gky,7 ڄLl$+xIEǡ FZ{ -1Z@PVز j 5v",Ow ~rȡuZKJje%rX \*;0{v\C^qau`!4\]]F P笿2kPPޫ -H#e-oRǎp[ -%v --Gٌd/k&-PiW L*bkHtQ൤<~U  UB3V3g 8mk/%_!b -*pڴ2UkMP%~ [L PD5G[J F݀Ty֚6OnJ;*DgxDm'oA}b0hhՈiKBVxg,j sP(wLpqy*X%F͐%b+Rr.\Q.TRbֶr>:5KmƢz~˹[׍Z>~M}!K̹D^ȒWK|T<).Ac5sPu͗tYuІ VۖIcȰ*C^a.S3TEj^#Lc/.ڶShy%r3k*P_`xHtr:I[ȥ{1R%bGBX/^v.1x^r %͑N|@Qdme4V f..Eu.-3R%a 61KwFH+!`1׋J!|@Vd=T1#~#J)KCm.TH\n-COA'LΥowm\ &s[sD*1fwRTcN*>akؑ Nܒ]_u?l2zDV[W#赝zNq -oAp`wgp_jo2fɜj~Z@;榃uCJ -6Cg{z6m6`T@kC -L(_2 mF>wEYP#bNS"gCRX$v֭GCH`kq~`Sis+-iJ'jjfP31[k aC:%pdĺƥf ;@lJ\ 0l؎ZF-= ꣮d z5\Cp˵3:w4P?,F6Z ?'Gr{KXw)sh87T sU+{4Kaf%a -fB(_P$0=FW2+tkIM nru -* 1d(B |$OMl+W~|Շ -8֞uib &2uъ?`d jG/MCϝl?sEWq_&W!97\+ʃB_17T_&]WR@*|`2Nn]up|K\JtJIRDd,tU๺dzK XD0H<)D{FMl`𚛉*r3§L"ĝj]JTMĨL^c;檖[ ~ϚܢK)rtˉ؍eEV9艶āW -Dek<at,WP8u? S"rܦ2]-8|&uᎧp-mn/ k̾FVw\-_Amenhqc5muQ/o$Dmr}`I]@)\qD\*RNF%_V‘HueJ;~j! -]킭jJS6^d#eY2rf$XGqt}BK"JU15c=xp7b>CnIw޷i%k]@ *[e_Mmkl T-Q}3itJ/Xh|NS*Y?L!a_j6e8Q`,)u%QvS7BE 5 L}E0 -Bqj̐GVɸR4(]Kyhu>0ehJ%v7,T6t_O{-o+XKަ 4uYDZU>ȤU|on"[lwܝO!#t/BR0;?V5dVX->z85Zk޷UvڧQ[: -_p=tkö;5<+c{pp_M}#0/"\?Z:4DH_ETo0*}iV3L 69k}"W`09 Fq/A_'O +NP Q!hwdcd9֢K"Qc*4B T ;#Gtifٯ.˪br+),Y$PSϰ&fs7(rOFSE/0EQ| @Q,ƉM!T籰 26M6*LT@u*CtEėH,峲6K¼(&\/Y)w])2,{ ]ƱD`.zŔǺ'ΡPD rKC2U$q\!o)DE1HjEY(HJVA $t~x,a)?(UVUΖk7 շҺ-%MT,]#Jm'?ҍf߅?.FC lsT'Y| K|+cSE*"l~fy:=Ł{+CۍR,yMLgRĉbD6:Xg'OȰvs,|-+exQƣ5șGKn b!G 3.7p\qi%d E55{ynX'K^Ʈ 3nCXQsa"LZ]2K;~p07WK LF!u!BQ*?C\-b]_ -b;xajKБ; =ia4  vҘ/1&(+d4qhPD -z4QJl< &XZNEP.&fՖO"꩙"D:1tMGS 5|]LGq0D*018[j%\ 0Ж׀+/LTkNoZ-hEڎk^ Es::l!;h1nɵx:{''#1VHv0(`&b -tuuwTmQ]"BZZ*5&%UYl>YS_I8HuWB-pM*o 2*s`8-:t>F*5>[x!v2}h efbH4u:%UV! - v1[LP] w>B[n;j&=#[S .Չ.Y}Y"֩ؖɻR=d>-Z/QrD;tQy8;7E4yXڱư ,U>0Ȩ&&d[Tw Dko ,9+Y!Am-@UR"-Q E'fnYO  `qƇRUmr7TU 2 DK(BzF3ۿi Eml;Lzbl2p YְDUr0/U^OŒI(j֒OZ 2õ*F}ا@ jY}u rZC~$X&ݖOnq!L¤* C1bCs8YT[؇}ܳ5گ@GUS7ODO&CCqEe,jH)7-TS9X\B_u_reUL8@He_A%t[qrv_5 Ŭ D/<]Gw T^2EZ1 -p懊{⸮MJ -B_I:eUpԼK)f8&͓_1h츶PgNQ^DW )m¥]Q}c4}ѐz!QCt%Ll A~{)O7Z'CGea ?断'p=j#{)o-{Tf:N&jC,x왌4;Lx"0|IL`+i1s;1Y-&#c\-Kx~_ -$5o⬖OE/ф:9ZWzPJ%:Ĥ1Ql % `eT- SJ&P/o(ZP - `^_)miJemgp 9Pj\ns8?,/<8i_!@-yf@7wŜ 4\xQsD*$cn85Ig5Ga ^KG>ڵZS+Ei7n+v,X/X*kq A -.[n8.x$Ln%Կ2\%n ܶnuLUH&b$ŰcƵy.)Ӆ# 7EOY[ƔnP o -_^_>)c(%kJ+*$LŮ i7`Z#s7eT* e*I-qQfSLȷ.bb]L #Qn~1lxh  0mՌMfl# ^DS|08vkBXF[o@Pf;%:$^-X~1dzkGG0/FX5zF9iؒz{iIND[Y49%LWP4ʰ.%sQQ)_%>{8|Z[/I map1[ZJ \k> -FQD &,P?¥nJ1}_;_\]$}.)^‚F?2GG+ sLljM,Ԩ12{X J|N̴ۡQA?:2w ٳ6%%-c=?A6ǴJIKpzd6U-Xw{F4j8%mH]CWt}KɨQnvv.(C@vġjlCP[QV5./nthlrX wITXc|B`] Ru^'Kcg~7p`Ah}veUn);& Fy$uIP+ Nˌ,..(#T1@ů~ N]AlNsqA~cfL%!0iǧFSN˸ҫuE@D|z]U@կcB=m12bj8"{)TYBT4lhxHnELtR]ѳcD|G/ ڨ.>%ԵfNT$%Z\֣F{,!^e<:%Աuė-H0s.Ӕ m3r7Q%y[qeU 厝J]TnnYKRqe#[/%/X]+YQU4Yb~_}>TY35׆3ӻ SǞ$Yҿc]#BdL" D -RnUULJ[:4qRhU g̩SCJe.%w"j͆ͻG*m($Ys&U\/LS5|+ԡ#p=R6=J04k{'ffeuurTw7vZ! -x+f0T6?LKBdoIq+:CC+ȩPhTkr*⺖Ti$4RM#ԦYpv2s86ʞ"D; -tGo\u U%f)*BSKp-[1u-E*\x('R G&j W嘵p+$|cĀϑ -ǽef -۩kQ]UfԸƺ0*\<ʼnd6Xa!z3LUJoeu5FҐ2/0DGp~ GS@cWעdHfiAHtje1ij.=J*RaDaq P`#aulz`a -x kaZT*fSFr[+SPD\:γ.^crbhE`ʿ64Ȕ^t.5Q?M=°'" asqOVj<# U˞3&wSrxEQ;pjªmWV71m]KH|#&S)5e{݄ rs}+1U6JSQ:q=Mb7X_G%|D'eƛH/pUZ%Ļ#UpT}1IVzpOwf0q`Ԭ3X$AEv,y]lyNⳛV.=jPV0@h8a5vO{0mR[¥IEIP c ڼnwoS41$}HX%"B"3EBKhX\l9Dcl  WU6 Ģ>H C׿Y"fꋕ,e6kzTHӗ[F*mlNi+B !L%zT:n$ hȢK |+qeqy`7W xJ+B.ڕ^6jSkXd].| C&`u;QZ2~HKRe^&a_.7E%)mt>l-ߕcft170Lj_<{m|jfSܩE\5ÍTwSU7u7edԭ蚋.]ƪf.=I 2'Ff3(^җ = C\SG -GEL5!bq** *DdD -EMyY3#"SPeeeARcouEczV 7I|b+6lUϠKtǺzF__d12|QD: BVPbJҺ4Rc2bP6S,'cU/BWh3Ԩy m8/JYc4U`4Sb|Lx\mNKKy\/bl׈@Կi4OVQ=D~UfHLK#t;5uی(m`XtQ=\(: ǂM C,?6(9bM!Kete1/VJm39D\:ǏlŴNӺFjZ~ENHqԗT-;PQiV| `JX¬Z!a%6F'1 4W -9 jݜ jdX[Z.8*wPt}ȣ?Gl -B@,~slNgp>qo0]K; SK0*o+RQsq)y(50sbc5p2!]{JcRUT4|rU;7?C`GOE(YR(Ќd? t`&+Fy`Dϫ;“2Tu{"IvWF.TЀ+k-3|( Y<qE 5Әa!Թn"X?1|rۓӕ gqmjt(04=/(vC6K;3Q)'a%HG;>!=N -t^ r"rƛ$Ƕ=APxΆmg?Qp=gLGDbVzFxlY GTWֱ57sew -|Ƹ M%u {RۨĨB`cg숔W&u]H}?A".vѫawS+s8.ul f/)bgu7Hp -g7Mot.62 BHZt6Sh`MvnBPHAfhgx7~#EQ]7 UCdʮ8S-|\"([ B֯h*[Tehܨz,c%PL m0<4ne0 B$7*%q<1+(Z&"xLiek+7)ny0̾T# -b{rS2/lR0HBR7`]Wܾ9fr|Lஞ-̣>eˢ,Bo'oP8 &EӮw7,uSRHG+X6@~,Y*Ɇ{YpA-hC GTEdP5 %םVTh~'&j% pbK},K -5:`2 Ԟ 2\YSEKE -Tob'6]gA`D_C$_%?B΅m$EIy -0#8(N -*QQ%bUrC/ԩT\7o &w ~;(i׹j Xv -?(IM7/EOrR¡.l2QWi͘ڡi$ls⽑ -2PbxK`e˔ql)3Cf\B2S_qH, ^*(?㗘%*?d{0@1mMu8&"N 5>aӳSVłOp۸+ʪ^&{嘶0n3bN]-"]K246%e; ,H0U"ElX1_qڮ-l(Ɉ}~GPndT-\bSr0/G s znSsAPR.4Pۚ|Q<ײA:aːa 09.-_2z=@Q-{U a4_ KE]M(u`N+wZ/W3>0jOv*˔BUc.e%Vr0;(ypFF%]%ԲTƢ¼pUq1, _T e%G@F.3r[0$ {n]\NI|.ek&~Y6{K+RQpVQ#e7~_bP#;Kj R\j.rKҟU$m:KRfus6ƻ1JD =OP˕T/1.1$W^vP"1b1ln=ʯ!HQ3*/6]ℱUP݄/CKIbTXI#A-hH) -VQ, ˀ-kv4kDC -] GUǥ~{|U1{-;X nI}J zn+ω|`o`}Y\WmB%xW+EVJ]Fu gLa(:IvΡ>Le|Z pJqsֵB:|\[䕝57, ֿK׺k|f7i"n*S``}2M2`U㻄haL -yjʼsL*j啧1Pp/M~P QP.+0-@ma4_*h'@XWZ<٪t4C/ZQ+5m~ją+6垟r^h2Kpo[̅"X60P>ph0 K. ""0|Kj,!7?Fqek v4'&2Rc -4bHeI#}_qBTK(U^EQajv -ܞ(Vy~Al9~ϷV.P*7VeBgCIYR!Q[V+S -G͵݋SW4rg7jT&0K@7)Q;t n`{,uZ]C,40,Ŗb* ܨF)Y狭b;Ġ|3KP~N ê]R:.__>b,=gˇVUx.%8b*o44>qLT&jj))U}KV_FT)6{&y+-C]**x -LRNvjk-b`ci -# XO#h[eH8q^g-ԔX_GZ -2 &z)SQ% -EXoD6|6$mծ[ط-JE:33XL5rZC!l U aDIbiUGo.{5D"+u4$ s5eW -]ʁ -A"5SXBSlضich$U eT\s 1|]DP8k,2̀SqU6 jfW:/5 -3G$F -uKYTr{`1%R3|T]SR?&&x c8#}N/5{ݒ(F%vxb@nel(M#)컠S9[R//5H,p]tK&*[DF*5 -R-}wtKjXPGj+4rp`7c)Ei6828|Cmzj5X,%Jx'W pm^*0GP`bj=q Cv2C_8j0OW=2_/"L e2pQm$c-n8Vї+"98v1طa89k~^-~eMUfLi!WU?uc1l-V(?C)>'wrP%H{e 32RYd⡫" VKh\ė+,%F1%T+tJ n'f F7:B*̝C=1 m֦ ]0cURk/ @6P1`DpuZNĪD! -E\u5;kP#7*a5|2ʞNM#\AotbO^i!F_qp%T,ጹiS<]: -NQ]F?$?j6:BbAƒ.Jk>zFݱ3ZzcYy S՚K_D~f,ȘUՆ,GPXE"i[UĘ41``U;ȑ;yjdjҡ,*&ZÀ-e(=` j)[u䴯6C$q&Y9] n#ۘ(Aev;nGMʪW1Q:[USw@&LycִTN.)ڸj>*5'e`* Y@|NZvz'Jnwh>00 KgzS_QVn}ϲSMÊ̹}MU4%d,XfbFU"_ar*; Җ1\A2FkYz8@;G̸mnQ2Y~+B@7S){!mVj^6 e"՟M\]ib1#Z iW(U.~aҷԭ+Ci1C>xic1d+Ŕׯ/V~1XZU/)ȁYeq}i!As` -[ZO -醙LN{%V(qBAo}4GNĻf ԥP9ѥ?mbCoU03a г,~T9vL9d]:%ip/`F( -R{;cU wzR "ή2_rWbA}F\ -A5BLQ/_@ČOv d Ǹ^"ΦIݱch5v;xL?&>56y2T"A5J:;cާA6EȨ6A Z KIg20pKIJ>%`wnTUVKJ.D(hA]KCZ.RAtG^~uծ=|LdI&f)mSn!aܮßo .u.7QCl3cFø1j,rq\l*&bBW%W/¦e%Q%qSS4,Lt -FT{#َ2b]vmor@"ȫW: X''pB5uU8\74"߶6!zKZU|JÅJډ/)[.xsPG|_ .-F}pax&cQ)lJXwPb/5+ 1*U<۹}~F&^c^0$&3#}j{mFMY -FވuޠR$n>IUAwXR~Jc\ܻvmv U|,.Nql<ľtWKBĉD K͏Kn7L` !J],A %.YT - e%}=T<\BڐUR5 -p^X,nϹxTdmLQJoܝz{ QMm8qsARܞܱ0[)\UjTڋn!sjUDOxBj\.[,uj6XZ:uv+utMERq7t5XuIXTjE<ӯv ^k+#Lvփ)^j-WV%eVAr (UW=quIk仵﹚Y\ pV %@dd]b%/I66v,0k{HyU}AzUkQJ[YڃieW t>:p{[}]c1^ -v`kWB %6U |ͪ{Zћ";OXy U%NAsjhUvK>>cD {r -Q|ƙF| M1Tˤ{KhK<ս P/ʭitpB/j% ¶Z^?t=qoNbF/uBnKXY{"k5pa>ݙ7]+z`@Wd2N SmS0=c_(i*iDPKTE>! {wR<.;yj oki.RʄhK)h{G@M[Bk/uY -ص%Vt.SjV=3ʱ4ui,2-+ڂXJBKS.Z,!Z|! 0f#u[]A]q9~Y'f3Jt<B .u5RB`XD[Y ܀qE&^<3%[_P!B&k-]0DdzhtP/0oV -"Va qFmD퍢~eͱZY#<y .Skj@eM0S9~"0%AGMav^٘^Xu{`mP ^e=Ю,$g,c+ٲljap`-Cicv#U# z*YCm&D>:q*i9z,5AWM'2;pG6 m P-}g 7ѕzؾբ hGEpʚTbjUT8|!Q7QHbnP5oQizͣ=be#:/⦳Ӫjm'ÿR:~pmK+o:R+k hT؂ T6`%8Vĕ-΃ՌJjFQ7Pe]'W5]y(ZL\nf4[_'tU*!y"MAL;n3 ->45t ~d@G'T[J'm]HbPT{T!o&,u)Y_.! QچL,x@RS#.aA-ڠ`ʴ,kӭz_i~AVc܌XHo,\ބ-G'#@bٲ'{jZ͍r|ڗ-Ae.lN@VWIQ4ԥG#OS5TLAaUSJ *M}uӅOLGlJ};[6pН63| 1˟2eT$cT*Pe#F`Չ) 8r09RTUsU ]m -o8ǝEdz?CP((yY.bʉP̨NNT8V\8nܫ5-j'MNcS)}qS+ƇI@;t[1wSC$#_A>xkE3oR2W/@FKN`o>.}dL1Y+2lJ.Wsm-eW>\)%~qA)vJj0I5. bʞlRGAC+3_3.\Ե,D*Z< m/<0Ca'HLS)6U~;VKl #-\]|n-X v"(vy0WT>w%S]S+B op6.HQAw۟آב9PE0n諉& \TmmQ -5PXt*Nf3>E[nu-55beu^un5dJe6X\0.V`ɼPa ~eBg4.t5mDRk9ӳi! XdG(6;Ԡ86Q1/>q7VD%ѦYڑ{+52TlV`R5)o3=\=S40m(ݣړXTR.)e̊0/_ɐf KlE"\~>nMp<~)^E{+iiaG,Vп/jFg}7ݟ}k/#",uD3@kbJa!OFQLe; ^["7*5Y?^hԗI677jXQng?CG vhZs20ۂ&䦫NI&L&*wںd &j }Z/T|qb" UHPفBn -^@+H-?p?2cZ+eCWfatD\~Z’K-σD+]%Bv$Gn@W Pň(MY۴fc&.WEe0 ,g`(@JטO6^(s0dR*@baD.^ `rK|f!\cCxe^rG'Co!FjYBQ -%(eQT!w3W+rī/|7w/-EX{>Sؤ~ D'MQ#c##T>;&-ޡiS`GwΜں2ݺi `V!UD!s ֿe.]3rOS73 2L]J-L̬Øtod*OaS#]t5}A -L_u4UW2#i20tw<26P*j H}r"ISLh{1!~e\YeVn_jFF8̵q M堪B(\R0H4.ZDΐ -}2#v?)eb$fUFTRڎ>0 -})VcjjzigN'3c, - b3>v肎P_P@=qs,F0j^vd(mXREeuc;e GR\EBaaڸy⦄~ ,*A5SA6*Ҵ{QbA[Vuࠛo,ٗJB .$+~dU5lt3j27Rm_QnՇ4*pRkEc1|'Lۗ0! --(PBWE -ϦaY+'$пP>H-TPcܤʫs|u'D×|QE@E)8X3?yEB7c>ޟ!޼eiU0*,S-3{!nSur y:5߹J'uԶ^ -l01Yn/DorDbo;p![./N(=Coe -`DMF=7N]UO[F\n.mAtp bU`?1*rC &+ٹqlWQ:L!sU*R8#~"4tMN^hU~N~+rZ\GuMFTQ֥l2|5a}(AfPE{(VbD57sl #8w&Yn; ܤyfpFr\Q|ܮQD(vxW|$. -*VLICwWYីHb7G 1YU.\r a u76 X0ߨQ$[2tJ#3UWaR+PmCc$:c rI'-wEQ"PKʼn -2ڪFRsUDO먓4`הusT΅bcVo!Wc"R.l^eu}Y;?^A+mꊊ6!?ǢcM`We/HleO&hZ}DA}u,E1{&n6V&!UEJȵXw+ٿmBu۱FJ'j8a-[UjYD?*e=@_?ԣߨmw8eY򄔔Fv7kV\A"S l([u2 -eB4K3,뵺TYj0_ A^ -(Ձ<2kim\RS[%.]yUk]k if$'w *D0{d0fP꭪hqD'{5x!Ȯ1>n~ I'T?"r?eH%+bCl gan]Į]p"W 𒹹dO<U^$=D >-ڈ!t9JP+PY^r@?UBS0;$%fgp1kULJ\.1jxcG90.xE% T;Ĩ.p_]ӱ, -K7WĶ^fUIqa3w0( -L /L-`JXH^&"Q4*!-˨Wr㰏"qpa W -%Ws/wPJ 1?qxIVK×9$&,!/qVf$;& ELXVQвLuFLKY}FkhU| -?USt;3`|Ӂ \"#R/GweLf1u27xteJc GFkKvTԬg0䘩Y8!h!-B.Wʝ:uf7Ejf`ˊY]EA#^b4 8bA710D(drJ~̾ lB1|X]pH/OkETZYe+ }H*^A;ZVqar1/&%g*jwg'5ƽ'Rog2ƪ0V&#]b!{.WsbuAGB_ ʌW%ø8U٣O\Km/*NC˶"zֈ˽˸g2RᴈC,,{_4$_\A tԩȬL%U:°KĻ suvC.GI{SQ)o![m)4^ yR:ͫtk}ؔip (r_l}}ZC(G[XX/DHK(z!) -!Z=L-`?.\,EeVe(RŽ!.̎M*(j_2ܰנ֧lԚD8[2Uei4^pW߅Vt=1`4@qVĥP FɏQp&棓J -#z445?Ҕ@.ʥiI"HOpQ#zPħʽu"`Ca=0WJhZx@kLWs~?1L!r޸$۳FjQ!ih_>sfVi:ջW:oKz.mPKP*v0W-++e'DaT,>j.[UWrmc~蒋J[fn9!(_ˉ #LV4̊lh֍^( 5d@.պ]Tpm\|闸ZԨu{u͟KQZѩᜍa%C+"gZ~ - # o#Mjv˗BS+حaJ(+dK`B=XRڶ"4Ьb Bn2vՆJ偈JOƸRCMT*<d WY/#UF#T)pf J ,Op豤?KE/ΕOkr?nzŒsfs>'dS%ƚfIl2놐{GoiXz8Pp*40%M?/T KԨxH5Sn3T^TĴWd%+'7-nY$8Tn5>fvK>5qyIJmK>!\)A+ )L^51Pxɺ9([k$_ N^FQ*@m)hY.dwSRmX7 6Clo`[#.,[mn8k" jrLxF$c?J R$5Q͆X{!z./OE:0zB%baؾM7l12#L&7)^ 2r0ZDk?ě, %eZ@Ngv#oeV1'_CqGC+?u7_IU_Ub],.gqMZ11p݌#_ݟTbe^zR>b 2B[Gl66Ew(|C.V}FU=]PڱruߘN7n/L(V -!Vg>TzYvr|1Wm12,>-U56H"UoF.9HhvTUԼݩE^}7(mkxQ|C_7R-ﰫef|]Y}ܺv1~^%?]'qùw SX&Fؚ`pjڰnN EQ*Q6 L A?` !@ BkҶ7hV$麀%W>d>LMNz qu`Mxsd$rjtԎ,0 7ڞRBtLdٯH-OP̎ܗCm*-R>y}wQģcu=!6K]`E am>VtCfoV1q۝O~e| N@syFjLWm }Kؿ18/YD╜CHo$܎FQt$Dl̃!wƗAaڋ/t؅ylw'@fb,4 1h6La?\ugY!F}Y6%QkWU {_7yV?'FP;-`p -"DR37,I'oH:T1UQ1b@kT5F'kG'J#2\gnq/g\= gzUH枵Ճ.(xN׋ՐKujSXԨLu^7- LZNDmWF+n%.Z*O]PG{ :"{Wԩ\wɮ1Z***ZAM2ɩv*.e:kc,_s8̊&mfuE >S9A',u]c=CL.㏘%C7`0./ < XQ.YW O~|:mXK2 @2ʇ%F\Xn LjhU0#reG]Jx7ѧ>GEmļ`%,}S<2Êpu\{ԨK0PO88dcS|Σ/pD c(ѿOϻn̅Te>h[<M^Fwh9Ba@(&$i?L^RT1t2>*%[,N#_g MMƽ^իA+ kWY <7DyAb -&]UQH_mǵ̒~,J) F6JMtLtU- F`3H1} \>db@BҰ҉"ms =N+HMǰOY v&-z{qe޼ml1T+C[z`Sքއ2&ۦEQlBڪY Ah({_ uA\s&d)UkB;ɥCCBڌ2zE~kڧCVWƀȲQWbnbiH\)ZH$7&Sb7} CށKB/p.ނba2VfBEV --rbD"stƢZV_s=C9Oʀ+i$gsyO d^Vŀht\n&"@"`vySMU(dƃ3}elcY>a~jH\}CTA7'jou6FW#k$ll(a -[KU ~ȪA$<;{*Q)ϛI  ˍ]FT/ -*yV --XUQKvv:Z g|RJC djThif5`3sɳk 7mCUFa+ -[tWԩl.6Yp=KYvWޝ_•Nb K5eE)*JmRBm{g2YEG,2v[B&0%Qpr]7tpDlG_&F&Mf JJt,1H(F Ţov%z\/Pm1+R+a٢ ` -~u T8hfʙP*69>s~]i:F%ǵ÷OFb" ڨA, j8ʖ lb+!:]"U@ZCkjHs:1dvf -h,Ic UJ0ʉ^PGQ1L'`&$(fN22[eX&!PPXA.~L~zl1p&Q E֬"cٔ0Yu$R#P \q|2w -ƌ֠)an01b2jwlbQo*MB",K!>"G#!us*Zs4߹MrQV.}3q)JP*5Uu݆J )kijɳ|8-/ E=FJuG -ȮL -- @I]@l65k/  h_,qlRvrX|*W_w@ee4W(})?JĢV[Q<@AX~ ) O^jWZQF}XmKrB$3)!n:I]ѯld?j6=ɳwbKڜ=*wdlvIQNT\ ?+π<Ib."') 4EbuJ Wz*hKXQ0C±*zaMbZ0(hmf2 RjO% =lj \!9Ii$w1i@L-QR0Fb\ k0}<{]|rDz˟wY7>wu;4r 0Od\Vfd&hH.Y]¡X \E2NRQGu/R J􌧳}oq:@R*a F0-V#w}AI?}S1ᐆ^C#bձaX07OįPNkkaQ FY*%ψsu)SJ+RE -<ŽhY*m" ЅZ#! ԸࡅKŤ;c IKll} p>aDvP筎rAFɘR\[,UA\%B^%"Zp]̢zd6(PKmArቤI\/9θjnw+Ufopg\Ys5".>R9eYRKvA"*6$j}D9#'DWȓ3:5XH?/P]!55TQߜ`jG{ w4qsbsZ-׍v@gV*ZFG ,1E[ܿ3 Z)BW K%U mD# CUlݳ³ 4b+VUQIҘP'@8-w6`5 -63 >$L*V?YTdY+=?mM<<+{k)nq -06ʑaiRIJ05[!7q0hZ.9T&jKaCWY1T0Y*j*.D0\R=j쀻rk E9'uPljC*]} Op70reݫSzңª[ -W2>T`IO -J\{ Iw$7t00\=&MKJ8G8 KETi8R*S׊c5 X|̕:`QbTwBKxAq.sZ6LN"% -'cDټ4ODKCl2;2)1*y2 -0hs4 -/YSL(#ŐRc"=|d̺[A'Ɯ~ -6udMfjWqܬ/`e< rH۹$.HX!Lx wU/D6AL@5 -R&7 J}AbQ/̾R]#/+h<˱CFv\R]$ًo¦K_ -yΥ7< gA 0p]jVD>N jΓ{n$ѵ-8 hTJ> x)lPV(* O ŲfqgqRSoRue7 -ĮKՋL}LXTуЭHcuV()݋4Na5 Գfbu,KU_ŏ[mXl d+*]E|\q D:Q_/&_PK4F|ʌ+ZHvwqn;e,&`~5)w5J8 L\de2ɊpD:Pklnƈ J ڀR;[@*(XgK*,fP=y_")~N  x Ӹmhmߩ5_$z!G\gRE/!Fu ZRܼnQW%sVS_Q%WPyCcՎíF? {w," -L_ -ʃ`.p1P_bb< @.zU@0n%1젿LdEaXE&+F5?X>1ԄWqL2gn@E A*7$ԇЃ8i/<:#K.'v o \eޣ711:#mAmX} -خ5XAՕE.h%RkK:LCpba}@*> :Z!?C{g.( xT iyK!"+E36PC#r LJ5d\ESQ7"-G@YMUh Rd[W ̱="y#b7P,FUn! -vl=XSl.dIBOLd{0 [GUZ@*F6JtCdvݱ]A(!~ݝP2"=S6VB* EnkOpnqbx ٕ>);_/Dy#\UbT7V$jZ) )`{(_Ņ*=v@@ѿE+'eWtBDiE٪O >%Ñ7SWl زj4u&HVaU|rU x$svb:7ewuzwI7]~ohۨYAӵڌ * -?lrWwMP(h+~NܳP(g7Լ/lAï#0c۟c -.ԁi]LAKīal#?d!IA|2t'e*6 a>tHUHIQ$#Kx`XEF!_}k2lro[;Z]oL y<r)1z UVi,3mRNCZUyW60tV؛IwduRqedsPIvKܑ6ynA/T'r]zGP_-6=CרYx.c)].daJYZޡ2z8eƗYYX~ -(>Qڭl-A[|B rCh;#?L\z'>o. _4߮4jp؊!:W,C)`a޶%m*jнYZ=c@tL<yYc0CBZ J[NpiK}0ڥdXn:x!;ahU`n9FR Z N?2 6M6 )|Ԫ>JJT8j%-FДt&*ѨG+wQڞ9ɇ r'_<_^.<8p RUTMQ+ECQ+E\0J -om~"R%5N]s2wƧq EcAX9aAoYC0612cmC}ݎn6KkⰗ~`A\n2n=EۃsS2ڥ1&%QClbܧsRr:|^{s0a8c.\&^#cdT5 p%u(gp!/|xH&_J̘g{3a&;SGȵꙪ}$zyK$ b}KBdiV/ >  R2uB?=X/)Q@J@!PSϵᗈe+6NJ \/FV/wPB|D}%WKI)+ ހ PzJLCmjCgcwnયPDFϴP%z>*.6U8۲bck<"w/̗yWUQu93ac0 wV萔'smR?0zdWClq!(ۺjvmY_0U4J -6(?j-|*=V}՛A>'9/ ^KUfUS?fo[wZm"C]hIʐDFTڻW̅j&C5͗zgT# M"{.Qഺ/RP5悅1zo5|EnjBoen|hW,'?ĄΚ];D|j E'"e*-Z߽>D t첋L 2[/V6̀r `hU8YJ-ٷgO^DR~"TWJ=t1E }͋+0χG΁o4_|(uXu\;_hD8K2zQQ cl1;fSډPx;>0-XE)'ux9/;f͚mYOE1΋^y_,RDcǯ - Y22i1:̛O!(.@yPi̼RDn_CU_S(p~y"[EѤC)Nd=7&hJ#w(Zp]>|J!`@p 0P! ?#Q3?,/{V{-ЌM ̬1b~gVybhDFfΉqzǶћ Ll!O7m{G#Ge37:<{:i71G<ߵM[{vR<QF9m!:38<.D>/}fu: >Gdr" F;Y3VpA>#m"# ">FL3}yVܖ^#338933x$y2`jag! IѤFv#ffy(ϙLH/pFp43Fu# ~8GlRg˂3:>m:.6ς|ngNPRDu}g$#I p ?6t.-0C NJ -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000013534 00000 n -0000440843 00000 n -0000440974 00000 n -0000441172 00000 n -trailer -<> -startxref -441309 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/ed4460ac-cb8f-45a5-8cbf-a27e69efc9f7.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/ed4460ac-cb8f-45a5-8cbf-a27e69efc9f7.pdf deleted file mode 100644 index 3143458..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/ed4460ac-cb8f-45a5-8cbf-a27e69efc9f7.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/edb581dd-95a6-4680-9525-6978893731ef.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/edb581dd-95a6-4680-9525-6978893731ef.pdf deleted file mode 100644 index 46981c2..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/edb581dd-95a6-4680-9525-6978893731ef.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f1bfc5ad-1f64-41a9-a6dd-9802ecda83ca.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f1bfc5ad-1f64-41a9-a6dd-9802ecda83ca.pdf deleted file mode 100644 index 345ca56..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f1bfc5ad-1f64-41a9-a6dd-9802ecda83ca.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f220e5bf-a9ad-4ae6-ac59-9866a5da4925.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f220e5bf-a9ad-4ae6-ac59-9866a5da4925.pdf deleted file mode 100644 index eaf45b2..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f220e5bf-a9ad-4ae6-ac59-9866a5da4925.pdf +++ /dev/null @@ -1,2292 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 0.0000 -792.0000 272.3976 0.0000 0.0000 792.0000 cm /Im0 Do Q q 0.1968 0.0000 0.0000 0.1968 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -51.6498 0 0 62.5 102.04 3416 Tm -(S:3/946 ) Tj -51.4479 0 0 68.7501 394.69 3783 Tm -(JD. ) Tj -31.8504 0 0 68.7501 493.66 3783 Tm -(CONSTANTA, ) Tj -27.5589 0 0 68.7501 711.87 3783 Tm -(MUN. ) Tj -33.0138 0 0 68.7501 810.65 3783 Tm -(CINSTANTA ) Tj -32.9481 0 0 61.25 495.39 3717 Tm -(STR. ) Tj -30.1366 0 0 61.25 597.78 3717 Tm -(ION ) Tj -29.0936 0 0 61.25 671.86 3717 Tm -(ROATA ) Tj -27.4226 0 0 61.25 791.11 3717 Tm -(NR. ) Tj -0 Tc -61.25 0 0 61.25 872.26 3717 Tm -(3 ) Tj --0.035 Tc -34.4765 0 0 75 336.83 3643 Tm -(BINE ) Tj -36.4966 0 0 75 446.92 3643 Tm -(ATI ) Tj -39.293 0 0 75 517.9 3643 Tm -(VENIT ) Tj -51.7261 0 0 75 635.62 3643 Tm -(IN ) Tj -32.9459 0 0 75 691.84 3643 Tm -(MAGAZINIL ) Tj -34.5853 0 0 75 890.83 3643 Tm -(BRICK ) Tj -0 Tc -75 0 0 75 1012.5 3643 Tm -(! ) Tj --0.035 Tc -39.287 0 0 76.2501 537.58 3566 Tm -(CIF: ) Tj -34.3531 0 0 76.2501 636.83 3566 Tm -(RO105C ) Tj -40.1204 0 0 76.2501 776.43 3566 Tm -(500 ) Tj -35.3476 0 0 58.75 514.83 3852 Tm -(FIVE-HOLDING ) Tj -39.0613 0 0 58.75 773.27 3852 Tm -(S.A. ) Tj -43.6198 0 0 63.75 65.68 3355 Tm -(IFRTIR:FCRIAN ) Tj -31.8791 0 0 63.75 378.92 3355 Tm -(VALENTIN ) Tj -28.7849 0 0 63.75 575.96 3355 Tm -(UNGUREANU ) Tj -45.9871 0 0 73.7501 67.77 3139 Tm -(RENT ) Tj -44.6869 0 0 73.7501 203.52 3139 Tm -(C.U.1L/ ) Tj -42.5802 0 0 73.7501 377.54 3139 Tm -(C.I.F.:RO187985 ) Tj -52.3975 0 0 81.2501 82.02 2991 Tm -(SCI ) Tj -38.0489 0 0 81.2501 181.77 2991 Tm -(ENA ) Tj -33.9928 0 0 81.2501 293.8 2991 Tm -(EKTRA ) Tj -37.9217 0 0 81.2501 401.54 2991 Tm -(35L ) Tj -37.8232 0 0 81.2501 480.46 2991 Tm -(506UC/SET ) Tj -39.345 0 0 81.2501 675.5 2991 Tm -(60 ) Tj -50.042 0 0 63.75 69.63 2927 Tm -(IF ) Tj -41.6405 0 0 63.75 128.55 2927 Tm -(022100121038102 ) Tj -41.6158 0 0 63.75 441.47 2927 Tm -(6422768920146 ) Tj -55.8447 0 0 72.5001 75.96 2855 Tm -(SCI ) Tj -25.3004 0 0 72.5001 184.9 2855 Tm -(WENA ) Tj -33.0485 0 0 72.5001 295.8 2855 Tm -(EXTRA ) Tj -38.587 0 0 72.5001 402.54 2855 Tm -(35L ) Tj -36.0959 0 0 72.5001 481.49 2855 Tm -(50BUC/SET ) Tj -39.345 0 0 72.5001 676.5 2855 Tm -(60 ) Tj -0 Tc -62.5 0 0 62.5 70.62 2787 Tm -(E ) Tj --0.035 Tc -41.7836 0 0 62.5 130.55 2787 Tm -(022100021033102 ) Tj -41.6158 0 0 62.5 442.47 2787 Tm -(6422768320146 ) Tj -61.8461 0 0 63.75 73.62 2716 Tm -(E" ) Tj -37.9 0 0 63.75 155.77 2716 Tm -(ESELA ) Tj -52.879 0 0 63.75 287.25 2716 Tm -(5. ) Tj -30.0507 0 0 63.75 352.78 2716 Tm -(INTERMAR ) Tj -39.0208 0 0 63.75 522.94 2716 Tm -(UZ83829791160 ) Tj -49.434 0 0 60 75.3 2652 Tm -(501 ) Tj -37.0445 0 0 60 155.55 2652 Tm -(33-1026660 ) Tj -34.1789 0 0 62.5 76.83 2578 Tm -(PAICOP ) Tj -32.5007 0 0 62.5 212.84 2578 Tm -(HARTIE ) Tj -29.6798 0 0 62.5 348.85 2578 Tm -(ROLLOX ) Tj -42.6911 0 0 62.5 484.5 2578 Tm -(100 ) Tj -0 Tc -62.5 0 0 62.5 562.69 2578 Tm -(M ) Tj --0.035 Tc -30.4536 0 0 62.5 601.67 2578 Tm -(CELULO ) Tj -53.0458 0 0 60 78.8 2510 Tm -(W93415 ) Tj -40.6337 0 0 60 272.76 2510 Tm -(E944568000289 ) Tj -34.7343 0 0 62.5 80.83 2440 Tm -(HFRTIE ) Tj -33.434 0 0 62.5 219.7 2440 Tm -(TGIENICA ) Tj -29.8144 0 0 62.5 389.86 2440 Tm -(PARFUMATA ) Tj -0 Tc -62.5 0 0 62.5 583.25 2440 Tm -(3 ) Tj --0.035 Tc -32.4177 0 0 62.5 621.4 2440 Tm -(STR ) Tj -0 Tc -62.5 0 0 62.5 698.69 2440 Tm -(M ) Tj --0.035 Tc -49.3321 0 0 60 81.93 2373 Tm -(U904619 ) Tj -48.7767 0 0 60 275.38 2373 Tm -(62276806594 ) Tj -41.2209 0 0 60 83.79 2304 Tm -(HRTIE ) Tj -36.0569 0 0 60 222.74 2304 Tm -(IG. ) Tj -30.6377 0 0 60 295.85 2304 Tm -(PRRFUNATA ) Tj -0 Tc -60 0 0 60 489.28 2304 Tm -(3 ) Tj --0.035 Tc -38.6087 0 0 60 527.28 2304 Tm -(SIR ) Tj -37.7141 0 0 60 604.82 2304 Tm -(PIERSI ) Tj -50.0912 0 0 58.75 84.75 2236 Tm -(R034620 ) Tj -43.0825 0 0 58.75 278.45 2236 Tm -(622768C66907 ) Tj -40.6456 0 0 75 86.84 2162 Tm -(WRUE ) Tj -38.2657 0 0 75 233.72 2162 Tm -(IGIENICA ) Tj -31.2628 0 0 75 404.85 2162 Tm -(PERFUMATA ) Tj -0 Tc -75 0 0 75 604.09 2162 Tm -(3 ) Tj --0.035 Tc -31.8388 0 0 75 624.41 2162 Tm -(STR ) Tj -0 Tc -75 0 0 75 700.83 2162 Tm -(A ) Tj --0.035 Tc -55.518 0 0 58.75 88.35 2102 Tm -(90I4318 ) Tj -38.8769 0 0 58.75 281.5 2102 Tm -(6-422768065987 ) Tj -34.1303 0 0 61.25 90.83 2035 Tm -(HFRTIE ) Tj -35.6349 0 0 61.25 228.74 2035 Tm -(IGIENICA ) Tj -29.8107 0 0 61.25 397.86 2035 Tm -(PARFUNATA ) Tj -0 Tc -61.25 0 0 61.25 587.26 2035 Tm -(3 ) Tj --0.035 Tc -31.8388 0 0 61.25 625.41 2035 Tm -(STR ) Tj -0 Tc -61.25 0 0 61.25 701.86 2035 Tm -(A ) Tj --0.035 Tc -34.8856 0 0 60 91.8 1974 Tm -(LER0D4318 ) Tj -41.0978 0 0 60 282.48 1974 Tm -(6-22768065987 ) Tj -34.7873 0 0 57.5 93.35 1907 Tm -(SLBTDTL ) Tj -47.157 0 0 70 67.58 1365 Tm -(TCE. ) Tj -33.0361 0 0 70 194.7 1365 Tm -(TUA ) Tj -53.2445 0 0 70 261.88 1365 Tm -(A-) Tj -33.696 0 0 70 338.82 1365 Tm -(19% ) Tj -0.0369 Tc -60 0 0 60 68.46 1299 Tm -(TC. ) Tj --0.035 Tc -27.9536 0 0 60 186.75 1299 Tm -(TVA ) Tj -26.2584 0 0 60 261.87 1299 Tm -(BON ) Tj -38.5607 0 0 76.2501 149.81 1226 Tm -(P02. ) Tj -46.7772 0 0 76.2501 243.77 1226 Tm -(RT. ) Tj -35.8104 0 0 76.2501 352.74 1226 Tm -(IN ) Tj -33.6224 0 0 76.2501 402.84 1226 Tm -(BON: ) Tj -0.05 Tc -68.9394 0 0 62.5 106.56 627 Tm -(247 ) Tj --0.035 Tc -43.7946 0 0 62.5 237.79 627 Tm -(BF:C99 ) Tj -51.204 0 0 60 108.04 420 Tm -(S:84700011006 ) Tj -47.6263 0 0 61.25 109.77 356 Tm -(PSER ) Tj -40.2626 0 0 61.25 240.59 356 Tm -(1: ) Tj -34.3271 0 0 55 560.63 836 Tm -(C3POS-CT3N8G7043 ) Tj -0 Tc -73.7501 0 0 73.7501 945.41 2937 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 73.7501 967.86 2937 Tm -(BUC ) Tj -0 Tc -73.7501 0 0 73.7501 1053.84 2937 Tm -(X ) Tj --0.035 Tc -47.1501 0 0 73.7501 1096.33 2937 Tm -(5.53-) Tj -45.3278 0 0 73.7501 1203.35 2937 Tm -(5.E1 ) Tj -0 Tc -70 0 0 70 947.54 2798 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 70 966.86 2798 Tm -(BUC ) Tj -0 Tc -70 0 0 70 1044.85 2798 Tm -(X ) Tj --0.035 Tc -42.2151 0 0 70 1092.4 2798 Tm -(5.53 ) Tj -47.1816 0 0 70 1201.33 2798 Tm -(5,61 ) Tj -0 Tc -70 0 0 70 1305.84 2798 Tm -(A ) Tj --0.035 Tc -25.763 0 0 61.25 621.88 292 Tm -(BON ) Tj -30.0071 0 0 61.25 696.86 292 Tm -(FISCAL. ) Tj -0 Tc -73.7501 0 0 73.7501 547.83 224 Tm -(A ) Tj --0.035 Tc -39.862 0 0 73.7501 615.75 224 Tm -(2000221497 ) Tj -0 Tc -70 0 0 70 908.54 2658 Tm -(1 ) Tj --0.035 Tc -25.6592 0 0 70 926.88 2658 Tm -(BUIC ) Tj -0 Tc -70 0 0 70 1006.85 2658 Tm -(X ) Tj --0.035 Tc -36.9837 0 0 70 1048.7 2658 Tm -(19. ) Tj -36.0939 0 0 70 1105.6 2658 Tm -(79= ) Tj -45.1196 0 0 70 1179.42 2658 Tm -(15.7 ) Tj -0 Tc -70 0 0 70 1299.84 2658 Tm -(A ) Tj -70 0 0 70 901.54 2519 Tm -(1 ) Tj --0.035 Tc -30.8042 0 0 70 926.85 2519 Tm -(BLC ) Tj -0 Tc -70 0 0 70 1005.85 2519 Tm -(X ) Tj --0.035 Tc -49.6123 0 0 70 1041.26 2519 Tm -(12. ) Tj -44.792 0 0 70 1111.19 2519 Tm -(82-) Tj -47.9412 0 0 70 1178.32 2519 Tm -(12.E! ) Tj -0 Tc -70 0 0 70 1296.84 2519 Tm -(A ) Tj -68.7501 0 0 68.7501 899.59 2380 Tm -(1 ) Tj --0.035 Tc -34.1021 0 0 68.7501 925.37 2380 Tm -(SET ) Tj -0 Tc -68.7501 0 0 68.7501 1004.85 2380 Tm -(X ) Tj --0.035 Tc -43.6376 0 0 68.7501 1041.47 2380 Tm -(13.82= ) Tj -44.2149 0 0 68.7501 1177.45 2380 Tm -(13.&! ) Tj -0 Tc -68.7501 0 0 68.7501 1295.84 2380 Tm -(A ) Tj -71.2501 0 0 71.2501 907.5 2245 Tm -(1 ) Tj --0.035 Tc -33.5038 0 0 71.2501 925.38 2245 Tm -(SET ) Tj -0 Tc -71.2501 0 0 71.2501 1003.85 2245 Tm -(X ) Tj --0.035 Tc -43.6376 0 0 71.2501 1040.47 2245 Tm -(13.82= ) Tj -47.4365 0 0 71.2501 1176.34 2245 Tm -(13.E! ) Tj -0 Tc -71.2501 0 0 71.2501 1293.16 2245 Tm -(9 ) Tj -67.5001 0 0 67.5001 909.63 2109 Tm -(1 ) Tj --0.035 Tc -31.709 0 0 67.5001 925.41 2109 Tm -(SET ) Tj -0 Tc -67.5001 0 0 67.5001 1003.86 2109 Tm -(X ) Tj --0.035 Tc -34.2776 0 0 67.5001 1043.8 2109 Tm -(13. ) Tj -33.6101 0 0 67.5001 1108.39 2109 Tm -(82= ) Tj -42.5776 0 0 67.5001 1179.51 2109 Tm -(13.8 ) Tj -0 Tc -67.5001 0 0 67.5001 1293.85 2109 Tm -(A ) Tj -71.2501 0 0 71.2501 908.5 1969 Tm -(1 ) Tj --0.035 Tc -33.5038 0 0 71.2501 926.38 1969 Tm -(SET ) Tj -0 Tc -71.2501 0 0 71.2501 1004.85 1969 Tm -(X ) Tj --0.035 Tc -47.933 0 0 71.2501 1039.32 1969 Tm -(13.82-) Tj -43.7495 0 0 71.2501 1174.47 1969 Tm -(13.&! ) Tj -0 Tc -71.2501 0 0 71.2501 1292.84 1969 Tm -(A ) Tj --0.035 Tc -29.6916 0 0 68.7501 428.85 497 Tm -(DATA: ) Tj -43.6551 0 0 68.7501 541.53 497 Tm -(08-10-2024 ) Tj -30.9769 0 0 68.7501 750.68 497 Tm -(ORA: ) Tj -46.0218 0 0 68.7501 845.39 497 Tm -(19:30:12 ) Tj -46.1102 0 0 60 1236.38 1364 Tm -(16.33 ) Tj -50.0779 0 0 67.5001 713.68 563 Tm -(20021.4972241031930122<7CS ) Tj -46.6007 0 0 61.25 1232.37 1296 Tm -(16.30 ) Tj -29.9735 0 0 63.75 1092.12 633 Tm -(NR. ) Tj -35.4334 0 0 63.75 1149.92 633 Tm -(AIEF:CU31 ) Tj -28.9665 0 0 57.5 378.93 163 Tm -(VR ) Tj -29.2695 0 0 57.5 435.85 163 Tm -(RJGAM ) Tj -30.6177 0 0 57.5 548.43 163 Tm -(SA ) Tj -32.1177 0 0 57.5 605.85 163 Tm -(PASTRATI ) Tj -29.2071 0 0 57.5 776.86 163 Tm -(BONUI. ) Tj -34.1449 0 0 57.5 891.84 163 Tm -(FISCAL ) Tj -0 Tc -57.5 0 0 57.5 1027.58 163 Tm -(I ) Tj --0.035 Tc -28.2213 0 0 51.25 325.93 107 Tm -(VOCEA ) Tj -35.199 0 0 51.25 437.62 107 Tm -(CLIENTULU|: ) Tj -40.1985 0 0 51.25 663.57 107 Tm -(08008 ) Tj -33.8291 0 0 51.25 777.84 107 Tm -(BRICK: ) Tj -40.0996 0 0 51.25 910.57 107 Tm -(0300827425 ) Tj -35.7981 0 0 46.25 347.68 56 Tm -(TIPARIT ) Tj -35.4936 0 0 46.25 496.82 56 Tm -(DIN ) Tj -30.74 0 0 46.25 573.67 56 Tm -(COGITO ) Tj -31.4439 0 0 46.25 703.81 56 Tm -(ERP ) Tj -32.0492 0 0 46.25 778.88 56 Tm -(WW. ) Tj -33.6304 0 0 46.25 854.64 56 Tm -(COGITO-ERP.RO ) Tj -41.0396 0 0 60 1115.63 425 Tm -(TD:005771:0 ) Tj -32.5285 0 0 60 1173.65 362 Tm -(CASIEK ) Tj -0 Tc -60 0 0 60 1309.9 362 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF"ExifII*  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqwh"1 _ꪏG_~~y_mg+/`G ;9>dw{Wŝ8q벜-]M+Ty^.XaP[mf]OΟG7_+&enҍ?3ߨh~vbC ?F~4oʿU_f~V~5kc?b9ehQq~~,lVj*[3qHOŘkcYgb~gBOƋaL+슗>D~*?d,^C?Tk/Ɵґg ->>';oƼ|23u!9q3:Vo)$A|&4c~S>ߙq(\(!Q -$.>*AF9C&ITWȅhBR6yr{OK>O_~Pq!{."#ُߓɸ>_.ߣ?Kt|? Fꞣ%ߖo4x6-h5ѓ_ki_pg?Azh?U}#??YnW+L'.cץܤYD34m]f7flHGɓ8c(kgӏFl"> ->O诔>1|}GArBijV&kmGl}YjNht../!Pp3K_Ϳ7ciYyy~S!N':7/5|L ,b ZI}{s}U̎G*]{넟rR?;rYCg(~kY~ɇ_G2?Kg>mʣ$ƫT'L^~~ɫk\~ğ')?# ~H?Zc?'itE 1+#%gnN4u|1˞S۳G4XL&8@a-1T UMYW4X.,iU#K[D %, X -e-UJ,DTP$JQhh1TC%M6,.&_6,3-TnDiHfG7JQ-P1IL93比3}5_U|r}?-3O*\`r>L^|X}4yk7QDѪF.mtisNwiEQh]s7JG29^/8vH:vq]Xðwo,ğg~k?_?/وo_ I nRWgseu,G~“2l`徦U}Fh0ɚ1sJlrIsexĘ"ǒ `f( -` "M$C ZH@h4T (*IxDgɤ#H1`iV,iq43r3]qo7.{8/yoZyUjv'eO2Oٞ1!IP")ieڤi0VIr+Y"LUR&ИɌcQ GfƲf¤g)pBiqDcأ -0]=QQ.1 V"JB"@TɎb )RЂ ECn\ eu, +$SAdBj\1I&9`QV :LЇ#`RƘb.|WɝS‘R!i,+K`\bT44) lL@Մ $TiԴ X4ʖKQ Y3& &HBR Ub &!@ -"E.6%a#V4NMfϋ͋6*I3p$ 44 @@@&  rCCMȎXS#jHŠJT#aI -cR9HIGV5 "P*%p '@ H NQ0t>LYJV*˩Nьh MSPJMHqKR@ P d(8!RI$.1"icZJe8SIqu̔fDK`d0 Y1dL+QRڠa$%M&1c"U (jM'RE*@1TUC8Sr)!l1D0BPPLDP hq,c͆>|y#jЯ+]ufkzC,cuf;FW*%ȍiILL26PX-$R@ MEti( TY 7n,N@J&65," *\, L0sVCE@VܲiN*'zqeA"MB@M2%hC - &XQr3#O=^DY2L̾R}P!DXTy^v%qlzy~ۮե@>}.>k?._oVI<;HKd~NubZƪQEL*)`kI.eHIL4 R!1sQ> gud ׆˓u#)!N(@!#X1ؼ v1D cq'󯦼)6zK-<,x1,v)P@ 0ʑBM\n HHXA5,&e&1RT %hbJ-ʄb V i"U* H9)&0r|ʑ܂h`Y-X4nhcKB -%C@ C3SM!Ei\LdǏ.LJ>,XLbp}46ˑ8%  *Xrk+뚧|^lKBhCM*k=l~>Ο"4ETXȪxm_66}9=g0mRMƲ}qm'y޷ی˥ƲJ ϱ\4?qgP@* lMc=p~̙AiK)Dͳaeב Xpl~y&t~~锫>qrF;1K`=~_NlLv_>Mj R'#M,:>G=1xfRi>kV{`|l_֍1jKDVb =SX:6+,b'I#nޜԬ>S˗>-$H&RIκˑʘ45 7ƼܙRbvԓBEH Y)IM@S() fY&()(N"n"Fr\2q 9 hjdI`S9)0C1`TEzi&J&g"he-4 .F"ІB` Rrb`~i -N<| 1S0v nYiHVQ6*\fU#$XQ+(1/J?Ͽ_ߘ%C*rƀl~YGi&BӶǃd0PE4L`x5|R*>~G޿HTپi|c{>sm>ϣͼ_T4!|Ɉsh DMHd搁CJT"@CT& @9@д6|9rֲ%cmTyd=4y1.'_hǓbH(Q97Hיi*tPcK(Rdb BD% MI1))5KI8cA)1(&:1S]rTdh11 &IN@%hT@10iHXrX)Hb(L&UC@ CiB,`}%R۟<ymؐE'Hh*uމMϦHCHMB4&j*# 1Z]j}ǒZ -1x0Fk?,P$Q*)~\nI/TBbb;˅A*JFM)PRqh ohɟqY3Yf5rj&xMcl\aXKy#hC 9!ER.Bh&i$ʴHJ\%k[\B$5MV%88L$hi(bX"dBj% re C) hH 1J"˨kg3\cr^;RPHk5mm.-_|)e>'+(JF  K_?N!g~m>tJ~63+jJD!H5D&)I\TBE3q -*5(b!d -Rbcm I) j@ċ@1&@cQ"TJՌiG,Q &Ph6~?MBE 57JE|Z;?:9Z;4}Bu-ܲ1 }Z\@K JKP 5* -%$'(0*M@ h`U>̀JWtS |W][\i['ݭٳf#{oGծQ^DB1 Lv\Ʈ⹾^m^\gO<~ͮC!&* E"fSH9i!5,iKPb#\i#hq5#&ʁ6 ,X -",C -@D CCC& -@F lEheTa9 AR%`6=]E[&nX4 g9E(j\8aqMMKZӏ~EֺS4(VRN٤'u_}yɰm&h!x:8uz`"Q,lxu}-/ӃF'L~IA:>_B̟Ozջb9F'* Kݸ)S }KEH -+>Ckg//Rxީ/J! 0dxhgy3sE.A]O9Y uTrs_o}sX>Pf2E,ctueluBϛϝ& $Kb_=~HT6P 3(aYrv,\p:nA'díjeî.ظuɨX9?J> 9! ͘E#4Բ9Q4 -hrE\ -ABHrЀNF K^Ly+0}S Q$կ]&|]6Tڃ^f{*g]qIkzܺqr" 4!nnok{fy~}G޷'L7u#o.sރ`"h !h۾K[WZDpVeC$ 5t>>zK"G`~Y>5,B@䑄]0 Fa1I52i& 85+B "&6h,͇=͉ܼuw5jѰi2h{ֶG*6ߧ5=&8LhM,Og;ߜϏOFfn> z7~Їh5D5R#H@ ZBN`9r\D˘1&jLi̸KZ{ZԠ bLJT#H&1dtIR2@sV9E'HL `Al핰@&Th-ESp J3lc͋d%yY=φ/m7|_oL7?=,YpTrzus0<Y}ЛY)HB$h)@hrԠ%J -Cn0R*jT@ Rh@Zrh!@ې@T4JTB@H,h`U"MJ(@n%}9c5JBMj~3r-~daĶug, q:BpnsCfC 6<P~p驼שu6p=ԷSzp/`==lJȂh&~w/X| $H`@dJiP BHJK BE$H P`4 -rcl2A,hI1!M2QBoGnu`;0hh -J#?C\#s> DZ,=a'%6/@"BI|7q 4D~̑,MlF|_IuM2eM@4 TjF$.eLd$i d3ILYMJЁ|"%9LYL iA$Q(Lsrr -j@*J  -H11Q#J bhC2eÜϖ2.w%dkkmOoɚ[|O_J=O޳yOHO"k|k{l!l~-؆n%\ [sqiCP}gF7;gV_iIi-EL(L\.13IA1r($&PIDb -d/Yjl 4Aq(bP B$ J&H(mQ3DlIF}{B!0,` *Xɜ7,nA  -RE - _'|DUM*JdT0Lf<9K3b"ܯ5}H{ȷtL@bcA&Do_ﳛ-T$P M?*\4 Cįon -M%TˊF*h, &VlYyLҷ>Ksذe¢i@&*0B%,B4hHmK!!#r@}- @\-BqJIRR@S`C+TmZA)jHr  HЛr49(@BbV X9詭fheUe1dkd+tOٌ>fvƞF xM~`Bi#!0'K| }RІ4J% HBM@%H䙹̔y1Ó%R!99"/"51SLSS)RƀsR&9ȥ͔ڱA9 C!0 - 9ƜiRj KU!M0AR2@JBZ&nUБ&iV1S##8qY͌y4nV7=쩯%XaaduOGmVW}~*f{Sz=}񾚾-M\wϻ'JA\?)2YrTtwctsDE\9횎G:dNJ3T|k=_ Ϫ[k!J C<-mFWm>e2)0ͨU͟ --B% @B1*ѴWaDLDĜۧHi -h4YM%#BRXJ"4?ZJiX$D$flDi0MNV V*\7YmV62rSm_6121ԟ__!r1!PxGAyKyݰ U.QM T@C ͈R)ԡ$'1)UcU" c]m b!"e1Ҡ@0B`WU"bT)1BMhlM1 d7#vTX!HR&%m L`4%E ͒ ;(!)\˃l1k-ZG2f͵:Tf24J[  3)Շ_}PRTJdKI> z a%R&/:tM{vd7cPPT&n-yעxwo'}fhےtD:@啓uNk[.~١nZ -$HA[:oc몑\cMĎW\×WFO~O{6c>Ȝڱ4꾏g;V6٩jhL%4 `C%5 Q6J9!*U I̠R!U2BhB`*b -XjIle.%PIXM)eD}I]g\~|w;:;q{>˨駓⡈ `ۛChbSTӪvST6k?a}+o[LyWYvM -CA#ygC|dbc@j,c{Wptߛ%Hp#@(@DfI Ma2R MLԓ.W qj#Lkךz4 *Dh -nH(`HJrЀY,͢X2LiZX& )˦ycY]0`4 dPU"1rJ`D)[@6!stIS4GEɆC1*ɆYR7B+Mܨhvc&6d(\CLt45qj_5^9ձP -@ص-HϨzBhbEC *H'8/ -/D@$/?>t5 um)PˊԖA~|OνjR?4z$24F3wm+TԴQF H!cxh>o]-D3cSY߇ssދ9qTTKCP hJ!X!IbF8Zr#*P$>_)|Iir1!Rjҡn"n($h1H#ll./FLY xB.nqr-T|][iWϛ3vܙa}NzZ->8<,Xw;M7HtOcY!@܃Nę h&F'H*%9r0XBT%R%2WbG"g'$Êbɉq} R` -"*@ 0SS @d@E0 -AB\C 6ܴbb -iT9IJi@6%S L{2M!) cşie7/睛_FCf/  -ne9OivtҹfĄ`0r#m5P_ړP U$N,u}V}INX優q0&W3eyiUȒ.tLbwϹz(Y, blvTWчYc )}9IZO\L ҤFN  I@.$CB2A*h qRI"H`@JQ+$9h@,%<߃Ia,R*~v9T{3|r3_G='r~;xٽFbVS*2}7ѬXⴶW F@ﭖrwa*g={їO2j4P0K '% !@ RJw0 I&X@vS_WjrL39è};' f(b h@ J@HI*4 hRM h -Q% CT0E!*`! B!kKH14S*B -Kh Rc@0""{eHIr d?u^L@3=v:X&Jy_`joוqq63G^O S&r$M \F'Yl>K=e0} p}-9Z4s_UꡊZܱ;?om6߾86;C*k0nޤ7/EF6ACW6=bMݸڱ:5 QdFoCOujJ  KR&2MH!%H 1*IԴr<&Uz"ƮAł eZ&HA5))!Br -s -1NrJ^r`(cW]AzB^oAt#~>liiE_%g#dwR,4'sJ`#$ -ok9(v<Ǫ&r%E/r{m6&K6 2S'>9qpnW`yv&Eg -ܒ &Z!-hI0*) -XBb A !¡C|s9L} & 0 U*r*" ę$&$r_" -diR gddcq|u|ڐN][OX2?~#=HWvb4RY}?6{2vej47)  M汾rCr4uڼ?hQEE6(4`&Rh$)lpbB"jc$Gӓjy xk |Cq''wVdH!ˌC Rh&" *D& R2Jbh J % @(J4445\&PBD9-c1"R25n,%-0kOLC[RFHE@DQ#bUcEFW50× "ؚԯ& ˌtBj*@<԰W}2m "tPD Kz7(7#r-(HL(M DИ#+?;jߦ0.A4 -&|P>3Å `HДR6`GYTb(*AK>A+w" -ZY7Y'WQ:hO˟oJCyCJH 0$r4r'4U - -4$%g$ |K~OlBT%QP9b` sBjUm.d|B )aTBK}_-#/Z3h\M꥛CMXjzqwъ&H2(͋"}9U*ZUM[~?㦝 QchC@0CZ>_6!@$lHb7RE*M(Bi# W9#)̲ts?Ow>.ooXG5 5m_3=CO5wYdi"op!(P,r, 1!+\ )1YBPh* `y~DHB16HS! -5LVN]!Wٚ%8)l3YTԱ!T"f*Qe[w]M;WՎ`*4d\|tM:Va~fXˤؚviu,ϛhޭd2i9NG?Dqz_;g`M(״v~gKM *JYm(ذW3пCu-x~.G-$Ey[z\>HѺ>히a2DR\?i;7) &Ls7R%PH%iNA0I` 4 r,ĜrȇJ -&0_ܓ@B.4* -$r, (`4"fISh1,`bXHgZ^z?Wa~@OOgOԫؿa}{|?v$%J1Ŗs\Y6\^0# X(6Q{8xP4 h(@4#@`@ jE4ȌN!"F5&QRP#ꏛU:)˶~_SIӷ d-œ( ` 2@ 4؅BB&#3t5Ϝ{frRb©F)ZԻI}K>uV'e5SH \p -O ۦPJMHc -,جMUBR@4 Ldc?$h -CCW(b@,b#"ݖ1vq{=MfZU3LLU Zt5xW~rDY46HA##}$?k )+% K@ ψ"T*R+$҉1@ h!,X9F9J((T$ca-m&L~|bBX4$Hb&r1e jdBMIc *F QHLG0THK$CD +.rIPƵ=#УDx&ioFz;7Z27|$g/%}Y4 *"H}pe2\Tu4nI7F*4crnM_thg-6Oc7ܱX&0@9&rArɆrcʘHR<.oq΃kZo즣mW_"Kg7=^27dwlbq5j&%K9`KdR\L -(@=??߇ -/GҶ4C+I%!?cO]G\?nf֓*DPЗ{&PA0L -n;*mauJ Cr@ćmZWA""BpMIY弹/".)y=7peA1ܕ5z_5RJd J\^ýu8vd&:hI5Ӷ.M:޽ApXZrM͔E`*JH ^l>\WqeyK65䠩`@KF]^tUqI7싶}~'oq{&m|KE ! a-U.HW6$R%)CJcv_4s?ߓPټk<>vu}3"1I%_aISH1L ~5Wql}9WRQr4Xjj{v aԾ$C]`~/g&(dQRC U7 &jF-ŗVKX%b h' qJDSe@OΩ㬨x=UCG"ЀT1dfl+T[@UcakȾ]/'2:FiD /9׻>SMg}" 5 审|MW9t y{HmЁSDS~ -:U@4Yg9:fޓ=_m+#D M>Np(tIHdŗX**BQ,@$FjTr&ҀJ Q) -jFTLcl)4'")&1ʵ4RCAY3s::r(3SS^rV-WYAGZ/cwXs AAH`+>L9YwZǒn2ԱJ$(#u&ӗB:vhV@5݃>3-؏ eDDĩ"%qrNͫ]=:q`Ki41& U}Bq)Xφ&@`~*y>۫Vu ZF~Ii-?7ձW4ߎM9btdܮ&)7!$dMQs,MĜCM^y]{}aQ5`LdWa5Gf4^첝 <>jʠD0TnY?r͌B&JJ#4 XY&$hYr|, 9bʩ$ NZ=ꚐhE+.>ȱ?Q_~v @0 >3ꯈ2add *A'Vpﷴ rqo0LRX"3pyFO"L]yYщdd2d&eJ&F{^ΚRP離jߥh]7*~y IȜ ˌ݂tQ>1c~.%3/lj\˾ ,L0agwm:PLCbjU $@!ʀ,+I%i@*d@_Q @ r) -%PHE&3I *NaB@yOӀN!"J&2&6Ζ{~NWqôX;9O~n7vuf5a9ҾT_>]C6_orlOV[vhc15+vPZ ")EJ\x >;Ͼ/{ -ex@Ŕw7P^s$2cfo'ιm Z8K_eMTR;1h R!Zh*iЕˑ+%MyODH@$Pb&p4+5mA42⸂|8(rT ;X#) RDdU -&1ԄDde͐2%RB\ Km fG5+rZEĒ2,*5iTRU4PS\NѹbQ&0M -B'#l`1R -Iɬor5 ! M%ILfJ%JfabU(B%}eoHI0Jb$%4) JS!V0<6ᬉiRXb<K[O!T6zYfҵMN p= v^c5k/i˓bW"$u4^|?EfPYn-*[W%Wjհܰ`(@Ba}YO7otCwˎvH9>Ӡt* C -rdRHTC@*Jcœ,w+2ǟDokf:n+5M$g+Gw]rۏ|׶YS] 1)F0Z1$r@T̿[Ok$ѾkgaT=r'I>-;qӊ^^=/W}F"Źϓ1) -qG6ľ E7--)Zh@ -)!J.Bg6ǹȬn7 UR22(ZnS QgSRh4UjJd:B ,Jh¾n֥vfpݟc+T!s q}kt9h'|jm}=䠐LbPjFk8eS8jgu]Xhl} -#D4rIU2߯s*JS>W L@3&lVFrUd X\IHSH@qSjDH"(Ih4R(B}]o|D&4`@HCŢjhCBD4q>>fAM@C~x ߶>anj2 d% oʽK~ˣeÛh@/>GZ[Uqw]U㤯?uzM恀 LH4=uQҎqM7)GgqM7cz:,2hB 1-2bчp97#]o>OKm_+}sAmDHwvyqymM=&E,"䁍v,HI%-hD#%_}M}ۤ>QC8OzZgE4Wi}G$&:H)peAPEJJr (I DcI9r`ɏ-֠*@p堩eÕC!4܇S4fbbF4:Tu/KH9EI+OH%&# Hi*jP i Y%Y%4$ -QrihD4 -)"' $M B0MIDYh-$K2hHL >F, cP @$H4QH"JaTMP9jQ@JAH@J9Ҁr1@&!0I `LG˙e@HCG_x~xJV/ח2{5vEJoL)dףa>lJ/%rQFO}LYrKǒV umn5}:0cBim'ʷ>.s/ANZw~.mM/YiI J,NqCMl0MBRe4dI&i'ɏ.Dfbǒg&+W4} Kk:4&l}vr`TT1I/So/]B԰I0Lg<˷4&2efbDd 4.]BA(8*Zc Wv[6!=#\aH@0T. HR|Fi- L n7N`)ZG,ajTRmI#0L*@U42YNZm RIE@a#KrD@ -EZ&"P*rZ0$Qk#BPi5! \P 0gOL) @ P"$)'Z ) @i) r*Gk1oZ*($Pp!@&jXBrNH@91i"5uKM|.Q"}x9[/k}brǣI&W>=WZomO0oS#WSTx<k``Jp%AQX*q?B\|[ztSb'͐_kÆ]c!SDR dL䑈)UR!$aτ2ZetNI_ӂ1扟J7_#غ-]Vnzڷۗ7f>OQEռ;IhLi604OȾv绾\De]Kd"1&Z@H4( n;3ԉD );%)ėXH+hK|wQr]L\z>͉wm>|`_i1ŗƻֲ&4 h@ZϾܣwpu/>>(޹}1mq\<\u_[j;Gz7]vnD/ZSjv:QhU짴9c$jW$E8cb%X!125Cȥc4=}"hI]PJm0)=#yr42J0T%@i.*M:r( Sh0M NA4)Ii*Jj4cYi%'  P X0+`0y0Ul5!BE)NTN - ЪDhT -.Bv9rP-0X<~g~of!h@&DR* -D6j&nb$`CSJM&#ގwHDÎA/!BKB([:L!eRVJAr9]~|YDg?8W!5?OZ/C??>}9WߢyOW54&2Kw.*r1Tk;?y/鎊T0RV:%|_u} 2T1d RIL%06JX-.caldZY1XơS׽Z?z?:&n.}y'^xLÚv+ٽ24LLT5#Ia4E&jN#uz.FHɮ+>,qjSk=-_25)pplY+i|'ͶO5= XS#W^>nDę+ *4. -)v J%^6SRjV:V¥ʌ4F|>đ*L%1fFy2hM(B)+E"͐m*B*LX8&-*,SsjH2bDJuSFi bi0LT2B@@ CQkD(Ru *DT r4`dI܅&ʋj?Gу?LiU" -J#r & --K!K$)(hCv}ci!14*L%4i"%Z%TDRh[|h$ELʋU.u~n[sp8q'h\d`vzbì'2 0H-=>Ac4jgqExS`0hiTScu/_}%J>e.a + -R@H4ZMX"1}/͏ZLԑ{=hϷlZ׷GdN*b1Ddi4 &4! h۩Xi)h~?[(־վ>mYGm?gzobRI~yŠv/av 3&2@` Y\ qBhI!j@rKn)LM@ -rT*BBA*bHShtrjJr0V02P iiIDҪ -bd*"hBr9i%@ Eh6IH(i@҃P'  bBNN@Wr2 誆Q nZy.~s! Q@ - b$@@H0C%VK$b0HbfY YL$)! S!)R.HN)UIQҩfKF?O|0׫ŗr|-}91] 7ٗ<|6mtzFf{$dLC *Mv_O&VHfKZ-4w5OtCعA3JrKϵZ^+6~KgY޿&|bh)|}L^;n:FFh9 -CTL+B}NY'.:Ǜ|l?!V'Rz~>=/kjOO'/n~{tW~7K=k^>M_aw2CX a*@-{ך;M:Y1 SBmSWQ\/Z.pCY<4[=F%tItN]mrc 4.1!)"˼y?Ϙ%EG%Rh*,Ri&Q&¨7/6~*XP TR"rtSeQ-%i 2KGHCh(5H@T679HJ,bHLiʱ↑R 4 9(5H f:$ T`H'#Ѐ%\@ $ jJ*YB,)RLwq'ٵj0BNVb.dD! -6iLz IHB$HI-TiAd#ݴޟY3DfIk\<Ϸ^8ڬ'gG9995<66p&g~ -qM/ȕ˴ŐUC)@67ӽe^[tϩڳ_}:b*Xh fc7Κ:l^]xHsGjE{_땓Kyv_VVæ͸s΃>My*+Ol0y[Foa5]S2k}xR5X& h =mM-_#d,{ 9f~.#.8 ?_1=Zlƍx_W>? )FH9c&n|v#Wdɪ)61-O3`9a7#H y>P"fĆ"Q!E - E*T O J~4 䭑u>Ξ'wChE$ -7+ m 1D`4!MͪbH1@& PIRa@ 1҉e(`E0%rQeTֳ}_'׵쑠+@#p -D!4ID0_ " M<@ -FZCM2Bb>"$s -DR41F{|ar{YޑF[X%RZr-wcũ|Эx35eFJOY'V-\ڗ>KӠh_W|?.qE:}Q~ɂs~whnX SfF$7O=,~XIt}]ٿV$NwK%gkIA%V0wp0b-Ԗ0ɍjT3`F&jP#P`EA6 (K $IR )FE1]@=%:ϳ,1$C,U)o&0L!c%9Z&2iL4J4! D `hHCȁ@jh 9 -4cU`KrV,]ˬ?gmUbNJ$% W"r!0*%&X KJBT"4 \x'7W hV C\b D -*DmBU$*-P"ZVD7k?PuLW?+ƿ/?5q9H>O79r-Ol4yn7l~Yry&rk%MVLsNTdD4Ls/7k'_d\wRqݖ1w8?fQ-0H X,i "Tn<=5h>/ñfL?DesŖ^SuK'6O+L96#=2sQTb_|ǯLc񎅛A،lj"j/ai 1 M!O9i~Wg,FjQޣ^ɼ-;΃OEP}9ϯḩu7(Ow;Rc75KuݾNSWc$JqgVuLfT˘Jk$F,SQr{^NK&:JAaI.D0G?"*h!I*.bPa#``PG9*$ ]ؾ=L-R%r "*TLIl@r iFIb&D&J&i BxVH*@4@ :QP P@(Ñi4(ֳo! LH@&^8iTPM1!(hkP*D40s5夗R!cH@07a0H -D%JMzS$dIa V#Z?Ǿ昶Ml_)eq~u6gv}:nMK<hi&PVi&}gr茹*2-n̍\ I:Q,rr quɐϧ{=TRb BZ hyuӎqʎ'/Lڸ_xG}1tRӓZ@zׄyFܲs/`Ulhrn|knpc=3ˍN}{4^B ~]5zS & Q??dshRǯwؖ"\x|qn4o vΟSxW7Ef:Q߿W;FX:_Dީn'+쩡* Wר,ynP҉&8ғS.&#I6MW= K edF%s/?5~j!t2h9d*D^oYtK:nɯrK`Bo~fIs?W鳰k ~m]v^{ilH%rR4#k dr&Mt!J YAi9f>lvKa3rb!d0DDMQi:jZi 0_$*(R$4bx$DKJBTM.GkN]qWsGfeܾrA}y'=Ac٤VmN]|R_rʿk *D4BBZ5ͨgsyCo4}z_>g9GVyzv['|w Nnj= -M?pwv4o13Pgqw+ -& ȿg7z9zz\ЄÎsΉ*oen=ѽ?cV'>f]./y~NY3ؙK;*9poR -*I_<ϯgZBi=G~|UcWsH'%"2%DSɌ>h/\Lu1DNa7h|;37_GkG8GKײvǓg?~om֟.%V]Ol$< @4?nڗx7ar@DM䔚~%Lq;#+D(ie@XǑ5يbK@ ߜEN۹ɡ~ ƮdLbRIHE>c632jQR%+$B7 42ǚpe⊒hJT HGzy\riM `\"D@*TBM*i4iiP(1f E@V bb:H" Z5&61if!3|-Ƅ0`rp2q^OΟOͮ ^rHܗAy_rg|U7"CZFwjszQ$YC}>5|I4AڨQHh415F~mNqϣr^[+B -*@5!r@Ӳ%;r;~~ > tUo4*<@wh7CWK9ĝ`W`&+8e:Bg.}o^~-XEOlm1]IUnO/i^R\[ˉ2A>K9v79>tf^gsmy}|YH<_{Q%hi>~=tv\vX"}Hk]e4!c{|?z!ŀ2BV'k%?{<ovx`Fӕ* Z7{h\*&CuͳzFvŻ>m  Yǒ>yڿQSt uv~lCM2U8CF~nt%CQ4@411w%}wh& hF&dhF$N\ -@R*B.D 4W)p*T9(@1*M@r)a x5w.E.`@ |/[\&Vu}^CY{vyz%W2w關"rϳ?[ 6L>IrT(zU7m0SIlUi V `.ihG -'#>>í}[`Z` ANB S@htkGӹ=xѣa_giulngz|<Ǫ~O.x5|{:wl D1xfjUK0I$@j< IzurO6nk*f$ObcY"jGΞr[Dzz$w?X%5GdzgqwDiB-W$o_6;SӶMK4Hu6* *]OL-[Ȏ̾/)6>l!"sR y/^Lfq0.%sE,fh>[>DozgeD -_̈́5K7u|f=(i44 a}.-'Q@k>$0Tp\:5| W MFd}xA=crY2D -nUL_I̺΁s7EWFcQi9AiwXȉ4h nN)ZL"{EHЉM MD"SVIHId L4,NHIm @ƨwL{єL8cÝlnY)8 AHȓKhQhƲ@2eBO]K^r:ZXM.np2n\ϯCT6ϯo/H5SV]MQrYgBAbIbB}Eн$?[ƺNU '6) @ -ɬgU\̿&;!nߛ#tko^oU8t|Oʺc:^[GOo9T9a!;=CҀ$ 9_-<;~x3|n.4\} .S^\I|wvxs컵ˡ|?Lo6F=W~b`)). Ƽݎ?*Ѽ[UI68Icjd2f+koMgX5 zAjIW(T#-%Nh;ϙ,k3x {9/R|9OGޜ6+Օ񜏣k!?l_jI佋l|l+GڄWҽJ8Ov~X$hnAW!ꚺpԫqͺJ R##ǖу9;~8*  JoǶe4pk]t1dj$P|?Ls݃k}cYi2Ȫ`HMHML.xN|)"@Ť+B +GQi}jkrрiR4#@YH4BW$l@*ZRƆ%!CYP$+JK -jPHc C m4I*vh5(R\h$5OVs|EKN&Wm^i~cMX8nN[G9q+&,7IYa+ÙYĻ'`cd@*TE"JS`I+o'hrH !҄.iLbOf?t7O;mt?Uz7 Ok31t{I/(aZErlPϨō4BJXBg.Wb7kgڄ֏two>-x7j?d3[V7D) @̦6d%BjY@χ{onH(ADdcnNY= װE㒫K!.K{ k 4=u`^\n+Y$2bw>G$K_t~1{_/&^ts"v#.u~ѷ^w~x{G_θccS:wѹ5pܯa^s߹>NW?Q}{<ع}BFƒ@v[[>{8=@{%&Z'$Q`78ymyܽ$*BV-O"n65*\g qvtߺ8U⩛igOM?OsM9 hSi>ޙrc:L -ZT0CSr$ҪKITː Tn{Np*ȁ,dD &E(LMX4Q`qZD' m|Wk_$7>qkÃ*'w~8@r?NY 9Lh)*hzX}b7NoNNwTJ+JL"ˁ*@ Q4H\JNkҴ ~g{{ȾM,XcY DSD^Y۔:p\#޵=M[5Fo]?B,x;BMGbp ~Ok>vӾs^k/RU q6l$҉ȓi(7?keƥ¶O×6,no>}_|Wy쟞DYoonZV~9&uc8D]pں>,".WX;.{/%q$bsJ4y[Og^םOkU2@ȴ#CP6"DWi  I1fGb`;F4i YJ5+OSGHV+A6?di412*Q3#To7-ZH`CěV:@6.5rIP9`!(҇y1+"T,D $)4Jj@Bp 0ԓ4E"+T23I9G̢̰~g<|[hMʼw|dHWiǃ-)7}VԵQwHXj]ŃlY&NN>0b`E@U{ԜliN̜fۋfةTG, r:&'4!2FlNC#\)r`ay0LUnV٣\^_|>cm3=_<_ͭ%c&2ĝ-!-J)ǒGǦFi'æ.jdJSef >h+Jp;nK|cgǓY3^f;h>Cxb8 ;&CAZ?Luݗ525g4权YꅸRRRhb{/.+In]@m6Ni\u}=(#Û_'k=~V3 3A]ΉsʋSYoױwb9Il| զKwF7vзē>~E{G7{ƺru:>VqsqǤҭ]9*C`AhiuH!T\؁ 3Ay2{fļL> -tQaR -QC91+DeQ,XMcC vq˔M努 ~):@gË2$@`B@,S9; :+P$Г`5,JIcBCHP1$Ld  \&g *T%%D)STw.'ϥTR=lzhsW1~zf.OO5 #M٪erƶ.{/ϬɅv@HICD|M&[.zl"d!qy3vn$@0k{rA-vؼ<_UMNr“~1kǓ̓^_ s1Z款SǨ WU5k_?\C\P,M% |cygDL=Ij2P3x MK 0C!_ܝ^Jt NHG-@*)5d L鏙nω,[Գo8lS֏П/+`L9oAzY+ӑ #Wt=N۬+N2YQLuDy&xdYzږ_P  -C@4 -@!Zg&ۗռ~sͷ@^7e(@9`)$+\Ӥ8'um4mF^˥sj]z>ǛA'j~UtMcJg>,iED#7tb dEĘ&8gsy'`}w AS󟏹W6uiIl4j^/Fҩ~HON-{i͋IHҷ:kS>츲MYUͪV蜣j5@m@JA QJ*ieF5a!Mj[pX~۾psG;gJ>lM,F~U̵[orD;%׼~yҵݏ9>̘o6BJ塒!$'520I%dT%H RW(/:$brP) R3HB!(ȈW 1#=$A43M^-w]z}5g9}>_զzY0Ƥntk= 3Ph4֋mfGg+mP]$Y -4=v h`0iJ[M@C@WiG}gtW4@* T04&E e#>F$)ZhW6ThQ`I:.1%Tσѵ%oc<O|j"eLdžcHRv5q1H\KL.Ӱ Q[Q|;[6ɩj}iq.N1t:g -}k?}}(_գD7V4ܒhu*BHJgŖ2ǗQdfk&XUiѶPs@$ LPhk#ANI'ل5(JA66ʡ/v,nzu$U6O?b>lyG|^sύzoɣlIy~Zmy]+YRD.1vV$&JF0*_U0=S`yq,FI1Oww9~^x>KcvZVpowk[i] -_:UZ %b)ʲrRܵ&$_AjEmn}$M-!L@lh/mϵs+?GY$bqMG/?x~Og. 'FܼԱt4%uGl^EIzg(hkKܧ}]2<{&HW/~߀vxDx's_^Zq<ΰd:o*{_6'B&Z=m^4/D{\>n73uoY7}'ҥiRIW ,jJ -Ankqb^Λnyzgy5s.cɊ97_stuHϬ>2Wrnh"Vgĝ -~Fv]oduxueOz׷ŗ/% .6:;'19bk=O3]lQSNRv[CLCefÚeidj쫚W,ctiR)@4&C@$ZN97ߢB9$!2SHcM4UVă=4s|kǑVx|vפi~^Bz.{_լ.&n"\C3;CU2!"DJ\j5eey]{ 96 ͢8ܥ9jM .Z[i\m:u4D9`$\&ε}sE- i -BiMHi69y ɱmd z͋.˥{ͼ{{^}|PX[;g'6siٽv9baӵ/W}m34 :DQxm7cԶ T>ۙ1}~x6.]913Jk#`VVI# -l^g0%qlrxO:>| 馑yS'潗@7wWi>=&v.T˶ n Ml[ێmzw&[ٖNa4]fnks &gC{6.QLwŗ,hl ߓ뙔$hB/>g>\1JibŅR#9DH I!%SJ%R%V4hcRk{(j;N\ETCL-fJHW*!M8j[EĈ0!?&l/|cKy<~1Go}3P4 1ÙsR+&,dxˬYi+*i6}[h_qJ4@ -PM '}NyIc{H9rs}ہl?/6[x_gzkЫn>?>RS>nK{_x>IsN_t9/ZQ}-sKh[5NIh&H`o>XX_OY՜~fvAԫ)G"3;/wߕ?/}%u\|=sk -5!HTZ/;1;2mךu?ٯjpzO`nw9 0l|Cuc ٧FyYOgo>I{n~?4J޿W~>@ e2&:%gz_GASRd%'#B.IBLhT5 -i 9ie\`Iyb"$PqaHB%|׋5Rcs+vˬ`vo}/joGOy$w&=sz_;Z -ˋ2lHg ;tQ6 - @`!m (L.λTt3}K4",1XB I r -T @&R$ܹm6_?й5>S5d֍_п*DE@ 2bJBB@ !M"&*Mk-kdDDQ4n6о(lGֺr Bm~[fǔ)R*ULdD6]oǼ o6,5 T828v= 'ܸ3߿xW~G7)"Mcvy͌yyM7MLר -QN5#rt\:ORJ&qf[vг׻|H*RJbCȵ}]hm9wz̗z<_kdF2￟u1\_՟QCt_.nubv_R<o`_(p~y|F=2>v#tdܳL0_z$_8>jZ=։5/1y/$^k69wL4S%QpZC|~7{6c|#蟚>X#uꓖƍmy}侙,`@(bĊ!&Mj=)=>u>vg4AD hhTBT0L`LQ5#w/8 jK}~Wa?&{Ϋ{WѾ^qRL\9I,5٨[ -J\Ԉ@Bh$@>^,n>fN>NtZF9$I0)(_'K˦wcIϋ9|/0=ҤS|q{~ék5s\K'$EH #x " MHTL%c$'}Sl[vW(0s.K9U4!)L(Xn-Ei{#d`iIjƖY~k3yg_ۮlz9RJb!}/c=4i>taWV! -UumA-Bri=>U}G/oxu.TJ3`ŭKkصOXջ͵NAd17Uz,=wijr>+~3h5o{]LӚ]'\Ӵ;oν:-uy}/꺟?oo}nY#l֝wq>D=]u͚4y^vOj1:,'`-7b>Qs=Fn >u/=_s ^6ctL%Y1Z]c_}=sSL"F1Q-(HЌNir$ʊa1aMI */;;`ҷ@&U !P(4+P:ѷ 6DBWZCD&lֿekn+{>::@v?0員{Ϯ -?/U޽ua&d`&|?B*ʵZFeTZ!K4+! CBTXՇݽO_F1Q@',ܥ (! #!DhH9Nts $Ny̅ޱc0A2sg#}}M8̼$㹖FMvT- N@M!0MI(1k^27ܺ^Ciu[I4IOO@,;|PP%?DP Fij%pWa;h; f׬=7U|GϓkOm>橶ڹLJ:7w jh!H؄M&ޢrK|os΂eWOУzvn5YqqN<0qi۹{]_WO6nLLsu|_C~{ο3cgN%t1juD.yLw3'۷^o@>Y]kؾ^-zے>7'Lag/zq_7<| ~+||T_V EŒCYJ  -YI &!U$)*@Q@Dғ@F"A#I{rdD -"rJ '#U*oj˳o^҄5m¤̧*)5xWB[ڼ몸K8^˂9W߽$ϏGӦewHY2Mjdrd*증IB>8XTU d&Y4 }@Ē` !4*B[pM8Mctwѓv~Ynծ^YHIjJ36FI$h`TVW6dKp aBhi(Dr RT$1 j?ByOoM41,Ф FЎ/E1 @ cv}n-cd:9~ȉ*bLnC!f=(Me0bY"-З`K}&"кSĎqҹn:# _Sx}/hIJNkӐkM[^ZYY97Y2S ޶3YPJ! ӥIeϭ-znD?&9 )[Qzׅ9wӝlVl(%9eϛ_jwOSXzʍ6M?[=Gy0yM 0?}͓loa#o.gڻ9]?|2Ε. _wn|O>EVY<~9gm#ElldUϩ9{ YU 5@A 5!R-H\ H$!ϫ.3_f=vFybdD&W2][$j4)Գ4iHLBJj%O5 L3ӽ /t %2$jघGWW]0B4L+T9`}a5 I{K=wMm!~ M+HF73)>0gFSoCExNu/ ls;O:D d:N|n29g3>TK/!zb ~>?Y|[&BZM NZNWɨ˿>\EWCyX|ѿ=w4IgZWK}SIgk'#y4˺wZ#yw:/e㝒\+X}jguեejZ0ܮZW,KD4'4! JMԒ8 y<ϬkFioX!LJt@H9Xv9<6lxo?'5ݛuzu͇繷gu8"nULԁ5ـR%" 4hJdU!HdlwӸ.*o7M\Rjhun -!DT .fa2cW橱oɺ&HݓP>8/2Мqk3r&Vv~Ow<+ͮ NE{LcjwkޭFb)x٬1^-y:yOMX7~3?^KҾ+8mk]瞴|?rH( CTZ^\Yl~&(Sp0A#PHH[tH D&jJJAM*L'6$7<9ƩkqܤHq ɜa{}Dl^6!3 dVeRJi 9𯉋[z& >=*GKg[jO`:'@@3Q -9N/1Uz.7=2 X Ƞ,%6TBMOzbyd^w>0~t̩KE 7;&J9c@КłJjQ0HIHC@@ЕHMQ~W6NoCX:Lh{$BH p;^ǣV" !s}>Wsu2`69lf7R А*TH-<ߴ\{?6>uyTv9m=Wvx|ݯ9oIo#;>鉸SjsO,rz*}tK}v5xjO ?ÀU\/$::9w|~q'0yV+~>Qzax?ҹ;Gד{ׯl).&&mk#󞌒5( |χ/Lw&RՃ@@4KCBTp!rbH&,p%HR\~ONs<}eUH)dЬDΛ!D1 Ag>`ΙÛAz}vǦ}&P =~7Nfŕ2RbUsuT:,bbVXqɫ?kxN{=t8`PmQ -IDQs~sZ`7/!4 !F 6D6HJ&rBjjT#xG:Ub c-)q3SBHT )J"hNJ@I2$h*BЏٻj8oW.) VG -n(h@>t/1?pҺ< 4uI9D滅H~ -L:C ~`ȡmR 7dt2wO >jvyѣir[#G1iqKh\H_Jڿ^6J>iAZՀB aR0T›Dr?9>+S,֜O~^g٧KFIJo8~|Zo53rb~/:W]#Gg݃ƚب?eJ4|n].^ge>xoi_*,Z3_Wyؾ$~ 7e]ri"d qSI1J/.,Gђ/pUD4)\4 M(URS֒5RBmT`h;J LIm""@X\(P8Y -AԂ Ld߮~xg۬ CǟG|FU[ -tOHf_'Ս1$+7_Ceȯxu5WJu64ИD/ũ)A _GυMϧ޼]ܼf2Q& -m&i"|Ϭ}U6kW}O+擄) i1W+ *RK&"SBM4ʼOq6X*DQ K] H@ Sh)5P@, c*h4T CA-"`1IHCc%4R@۟-$TTXB|\c^? -}gl>W~]Fno씐ihgT5=!Ϸ J#r^|BL5]Kp"B`~ hO{}m[NVn)yr]fNq<+kze1־8M -:NmKm ->f-Śլt#L= 潛#]'K:+4zgzv ]ur]7Hy0Jds<~p.+r輞u71ؽܓ'[/3N1>V{6'É3}KÞ4??^Ӯ| z\|6U/z7_^_&L2Ni_~66wWi;17~_7[ܴ3mdDКPVL9>>ǓyhJ\Ķ"TBBɌnXH$h%C@ d@'#NF)jFIR: Y$/lJi ȉM=K HjkjI -zqS -! G͇upohN`] r^L{͏&lJ@bd&\y529˼T:N̒ĕHD|_`g:{ڗn>gg߳x;m5LC@$& XL7y{)RBV &TDRbˑ*8<3c\>cQhƲ!\&jdDhrUʠR4)e*N B -H!2S@&Di00-HIHJ* H4M щ\i'_y_Kx9^y61A<|9Zt醉T H}Kʟ1Y`nZRr㦩1@* z:R->9P>y_wHس=wds_7DksKni<|Hźǩrn>_Iݴk<+pֱw_5۹bsi:ԼsY߷,a̿/ϳfwNOU?=q^+yOR99ys>?o~J} pәmӷn9ϩnג7\O_8v٫mLmy%<Fy>(>{Fhif/;vM5psYL~=~kх>s =}G-fIA -mT T \9>/>3o4b"4 -C҈*T*U I H&%5!zMsjնBJ'D{y c>(nKVNRͪYr3^KӾ%9ngY -Tc>繣fs#9k6hLZˋ.M2A[KsU@t=C} -4yH9Ƚo8-)I -@D,%4x.נ&ׇ]וklmm$lRJb+M R -!4LgS4 FTM%SH ȀhĚ\c%,7*JRА LC@ @SiD4  @R[BCDR$$hTXJG.[kR{_xog>oxVdҦ5_?-(ңxi/7ҏ)guv[ĝ'BعBt%qof:^fwE/ſkړju:ʟjV/ڥ:nTy~%q*Doeu(yI6( -G]N]/u.HY32 -2(+L\F"_Q}}5M>ӓC&"~df?S\jO.6F"v_cy_t<NLRh~nuYߟm4n'y~}G>3Q|ZiݱhdZ49B>߷7ujI%PfĒHV EȢB`PU)L+6 Jʟ| TkzлVDZ(y鵮+5]S ~b'D"U3DԐ!T۳ tW6~ܻ$M)gI-l=/ldm\kf^?~K' "$'Y.d*}2W+70%RP$2c3F5N̿G7tEͅ7IT i-:`>|TNFliϙĨj -V$i}ye閛@ %#@$IVhCrh -MLw&yLTU{.Nqc~W)Zέ|O:tOqމNxIdtLAO/QvrD*@J!XkO2>V<d>?hӼxvw{Guf~o#š12cU3Y.I(DA&FwgYQ4:Ro5~vXmH0 !LD4 [Mo'WFGGͧn2f\\sN]' %* $АCH*HD -ja'&1HfMoaTR(X m& l Q hɡtFI @%B *6u}Y '>m{ZUi;ݢ9+M3];_rN~ϕ&ll^b˨lqⱂ*9|Fm-+xl1 )D>'ZGjѲn??雷Փ8ѣ:7n秸ɔ`ͽw*k}Gx^ިokzK})>>IL1h/ -w=Y`}NFs?;#C^N:v/$^qFMS^Hvsw -Kɏ}m~{~5.Oj|{=dw__SXtU=YDkp5OE?εޱNUwG]*/ku]) -+JxyixfrȔqe+@Ef>CX3|W;鏏ʽsopOOe "A4!%cT4$-BURE7+2zʤdF{ QPřG_|)5\kIt:Zӏ/KuOaϟOwqCm}sE@ʢTdgɎQ{[TCC$*ZR¢m)[4>|=2{äF$T[D4a[oOIڮkhrvszTBmM RY`7 R@1 -2I3j&.hI1q*&!4@] aQ4@@NA h%9) Y@SA-L&ml@$Đ 4 Q4*\:=0!69x^}a~<D{EC7̱{9>μNgetm9,o%"/ͩl^V*w 17|º-y|*qs)z^ iڎ1Nh̵)_G'U|#H@&_G6 qqe'Ūu͂˺xl.uAy^RD!@%"FJP4IH/_c F-{Y?AG)4B2ιg}'At ,x^NߨRsQ R*BhV\wYsq&;%M궩)\h#z<8Z$DbME"1q6Ze0ICs`2)BTƟQ@A, ;eѶ[{5]ͻ!ew&n~zW4z.zXsj~tg%c(HŬl_ͩƹ9GW\ -冥'AP ~G/nan|ҽ3e4->:9Oїq=;>[9Ϳj&?Gycnomx.!r^{{_?cxsޙOzB~r=ff<==N8g[ܧ7ѰZkC<¼~}c/; _?awcΣ}1^ь~y@A7c$&|\;v[/+Wu9ˊLX>/3az~tHгEêp=ʷ]֮c,95LfÛ)ƿDY#Լ6iW~jqH PܸҐ#D#` LZ~acC'&*8k/V_>|"9^ԭ5OpI1L ˅b|tKw8\ RTQ` PJH@`%fl\Ly4ɒ*e#MX4+A*dk0Q70$P%&Z%4 $Cx~>[6"<4R=D4!*BB@xrԲT 4i 52 TbȦ&n #Fofh1p"VlłL$!A-#!&& "k@0ITZA!'ǐ玍<ބW ޭI×G ס}‹?N磡06yat#`& -̚!_~a7C͔8Z2*x:}oZDl)*Sq}/g޲f76$O\zZĿWy@RG̱{Y/z#|ؼ?ikt6Tx~}/ sr/t$ab4R2FlU ҠCC)!܍h0M&>C>?i&&>ܰ[A8fWթs^ҹm;ޒno~q -&ֺ{TMH&S0@JC',"!CDBp6fd^ϫm!{8z?yYɴkY$z3:/|NƗ'c}7v|>y^ -oR wKgoLٹ"_eKz|_&?+#.#\2sF9LچҿLvlgO'x^_}^έ1tsof3çp᯻~uOk)[]4qR*GC][XL\Xw:,ky߻/ lv-%^+LzN yrŠh@QT*BT nh*2E )"qw(TUˎw~^&ji<'| ΓJǻ#\O֤m]<%Z'ME5*M5 -l& -i &)9j%6,6dZ( ` ЕI|j1is&׹yPꗕO+hW|6H  ǬY{NC}{z9A_-Zl&ϕtM!5 &*&6sR g&1*BNM7 LjĒ&2KQ!Mv;}qR Œ!ZsaRsr!1MH M@I );Pr @ s'̻4x?Bl5z'É ێ/;Vam_7ӢFMǐ쵱۴s߹:`'L@˺u|̧[!XL jk9Rt?+M+yѵez7Vbg]6B#bȻzѶO^mSw6`Lw)?<߿D_on5rV{2s_}=sJ}w7~Fxo똸bbDד{9Ƚg=ͽ5M)^;@^|x[#~W]mWnᛛtŗt -?F'*pn,F^]FjlínNg1ݳ/0:Z?4I7m&NF tOO|˦iy=%ͿO2-4)\\P:CRKr5RTH`0MM C022g2nojb-LCB Lw.,znfǛt_ -}}]]^\ @&*IOg۵Uc OCIs/$l!!If41qXYY.m!`dba2RXٜ%Ңk6N\U KhCPM)ҀRZF`Tk@PJH8@0W:enѩm&rZGxun?n03\w_yв/&7-||M+gN@Tݸd/ -2-Wlg@+~ -dYbLܑ!Rr~tMlGw7[idv9Zb_juMSpns}.ӲRoOJ)I=7k^v3*5 #_<0˴kl7,d~"h7ؗ]>>^c=OBW鉼Od}2f1zSԹ3kS{A̓C;N#_s+'޿NW^7Zv u5mjXϴB^@_w&qL+vgŲƵ;e_Ȼ }'[D J "JT?LJMH$rRR!*WBhI͎-M$/ߩ큇} j~Kb j+Wdƨ @Ri&@! @@/>;FkǓk`JMB!.RGo7>Uk>K)ˌvWl~l7|V0@&Kǫk>O|R{L:Vyyl^hMR~^auׯ{t~a -˂\:ꓐlzY%>(͵͖gɉ8]7/g,/*S"Igܜ˭|޻'֣pQ8_>WX~_sbǖ`vm^Jmɞ2|f֍LB{On>51;SS`JlCC/gɏ7^m˯Uz-:SwOU/#>MLKJKCyOUv]2{NfĿscm: 趛}HM/1\*I6#^~}acZ_tX?Ub|ɞb)qH R̍(i&*X 0 EȘ2fŚ/şyn-2JvjPh^w] #+_ɎW}Σ皑茣+hMcE^noOU#>Ul|˯lAY%"h!&Y@ CBTfRa*K ȱ܉2qK}2 Rc410D,I)jT&s (JZcjfQG"T36Zpg9i=/N>k9Wk"6_Qi{{n'?FϤ@4 -ۄu.G2kx=փw -bZ&1?gLvVz `_Bpʺ?׌mlGϮ<3rk8| ?sXŖm__S6zZ,y|}P>6_^tht5%~{͎EϜmZ5}^?!z<vƺ}k9GAͪl}ռyp닖fc=03gIH - "I=^esKxY^|MR$<yKpjK=俻l|~{~Ժ$Iz[][~\&H}?-}7 iĪĂ J` 0Sp4lC@*hɛhbͼ﬿(+Zb擴ǝzQu2_^s:ɨxZ_fi1z&mb:nkMb{Ybˍ">ƹ.f.+iz8l''}c#@Hgqa+. `y~|V\ߞ^sGif?'{fUT>otU> -{Ɏrc_'=?]W& :ɴv-'6}3/ӨmlƮ{xQZkL<= s4@'&#[q|yS pT9U/t~4s81i|6\2^g/K&Zu&"cj_Y3`]js.&(o Z@ Y)H%qDi^6;>_㑹g.b|S:'kQ-i^}!"=lJWγP&Lqe4GK21"Jj2F` P cχ1XJK4@1"_6_. /7Ŭ5}C4>vwbM-nvsCsQ&@r|c>m,>&ѮǢnҚ*nO٨)4P!L%P""@IE!e!+ (IQu -2^ӝ9j؉@14 D*%CIBZDt -NA#VK`fnf\)=~I#6?˿?X!IYMDȫ#1|kRoFܓ-KiJ폎=7>upy~^y'/>/KZW7o>/"_>L>il_#v-Hۧ|}N n{.lֶ3j U7/CݣqHO?T _Y=_V&<jFχ}jN=tuQy;>kt?b[6dxwS5=-[lAͺG]Act^o&O'G:*. us9y{Nzyg={WT+;Yu_x>C^NIo?>y'Y=5{ß -*)da__~?\79X,0]>Fl,}ޖ x\ RԒ'k&q*!'|<{?r5`I zGG#eˏ]6]9f>j𞿋j{`%^Տ3@E hPM F%R&lRM 3eǛ|dǗfP-Uje.-JjBIM N`M +DXr -H Ve Шc5$EiS -Sr JK H/X6B`SXLTD2NH##YYU* 4IB(&LR @60@RӖfTT 聁*|fM|.-y~ԏz9Enڱ"h Cy~TN -tP{@ϔ@-GoMDMguz0~*^~АAtNCY5+r&':h][|n9_c5wE3*MZڴ h56C5sr,/cRvo?txnO)]g'Ϻ>סO6#݊r=1v8^S/*^o㷔>G.wI`֙嘺ʳ>yeؼ7DY #j6f3"ieFJm\R}1 -2"FZȤL4 *"h"#"+> }GuZM"IR P *P!{!1Fy=L9DԶ3}=3l'؂n#>5w/+28Q|_5vKrI}7Py5G:t8N)ʼ.gSkUz^}f唙4%@X6JK!IA- 4 - yǖ/ыejA5 -0Y"JDC%R '2$o@1!RQI1"F"+j@CDRfLPišUH YQAYc@$CEX$C@ 5`Q`M %%D["_ڗ"N;Z9G& kg^KAꓔ~Ӓ ԉ11~?SM7Dֈ=X 0ŒPP>/Y`V}yW臍ֳpvdb}<_Laj3N&h Ȕ [sca(r4`InU$i@7,1DM )b k"! W"($jMPe Q)!bb($a}Oϟ/7ϗy"6c&1 K@KhƁR2L!RZ>8k=y{m膧س72?yRrҩO)Aġ,|?r>/Id UMY*Y$!9T@@ЀMi9,@ @زEσkY:f,Pʐ  Y%A+#MK$i#01 B hi$`qm1#J!DbETR+P!M !6Pc_D. .r -[NN 8?tԾ1`  bMd0% r @M 51 h *@5-KCAR4M1T40C&mAd2QJ4բL!`4REG4e $`6%E7*)RG,$HH) D0@HV`6ܨIW,l@!XZ.Z9V  !**DR NYbc̀[?tìwiDDD0E"S"FMC$M -M("ԩT$C edDR#A 6@Z$ J4PJQj%3$$Ҥ4  0Lr119cqq/,#շچ]og}ŚX>O~~5Cf" D&M**bDJ`K@bm- VC L¾32_\}!+X8~c<|guΙ =W8<^\KwcoIꯗgw3u/o|E)Ra2}y3<@?h<ʥ$ Hh  \҄$*R!$'64uB& ) 4 1-1SM 4iE Ei$JJ28h4 VL6 C0f) Ɖ4Q%MT(T%0 i(  - -\0CIY WSpV)`TIJTFH(rЂb*(-fF8>CO -+xwo;i޶.$@qHi"EJ L \rZSSSJ*I*d HTjIR8C@Ԃ*YU$*q#AR4!.+Z:%.>7>AiܵnF L@}">̭OC{yֻό^rWXyqqI]7 gr8[;^'Goś[ :&zu|:^>pGDpYЎzmuIy>DF\A Y*Ud\)\Fl:rIeLCTs H*|D7|˞>Q~ qj㲦agHРT0-'#P41rȱI&@hbcJ4  bP P`@@wV0`S`l!5M҅/=3O}jثn5,iy͸b: -Ptcc$G^9#%p|;S+m~f~k_ -?^hfO ~(M3~̈́~_ --{ŝv&&-#6f3Y>C2k>>kϯ}[juMȡc;S?}?DS:b=^~c.5H UR1+D@@KV sR$ISJXh"$%srJ -B *jL"aO|xڝoFvO3[+B:0v fY0e/>?rx+=/Zg=#ɟ|TYvc=P!rg'ȞCܟ"Ɏ_N+1Lb^|e<_a!%|G&$2}X3l>8K}XsV:#_}77߇_/%پ 1|P/? q>pB\R T )(@f X  3aMT}Ac ~7?|>*~_ BY2*'x&_+>@\,#A~$+P\E}|}I@e\b=o}XC'3 r|`'y%ppDf;! "01A#2@P$%3BQ`4pCaq5DRESb&matk[]"GK褺2̺3. -l~z4KF0DFe]tW]EYtQ]5ѢOF4KD4 x>B4KDˣ."Үatk Z]|&&s4=n&:|".qt]].Nmnq5nkKK[ r/arW+ar-ar-ar-a<37╽'\ζe\bu/ٗ<#{5܋buζ'\뗰&\\:ؙ=yr-ar+erW+erW)erlN99ewwYlYiwoQtgjYr;>ۺa&|,vlvu˒4mnFjvl68g懴3-)ɞ1;؈_J.ٌ=9bF@l/#g{0Hn -)v\e9-},v}]ܤR6Z9jvd"%Nn G!}ԭ鷗L -5ѭfݰS(AtXFUhW!Er%ErTW'I45j - ,YjZlֵַZjZ[:SkZԵkRԉ`ogм7pO eY=jJkK]2Q|t]%tJtᖙ>k,'i$l2ؙmJrud%h/mnL[3-bu:ٙl̴q7>o7Yn:KY-dKY-d[ZkuZk%ַZkZn:K[n[n-KRԵ:[N[nKSnK[N:S2Zktfp?/U/Ur+MrWNm.MtO0eۣ.뢒覺5,=E5qt]t]2闗N}}ݟK9䊭[3-V6hem뮙y6uE. `jU]6jtrn[RSNuunvOTUzt@ , ,[R~SG#lL.:Pw]>ut]lE%WF]"WI 6EN})N䨮N.^تL_b]k5fRԵ:Sn:KY-dY-dKQ-dSnu[UeY=jjdJd*kEӫ -WN>a'eNuh.At ]2T]253]"WG ]WH=U.fteWF]EuMtYWE> c]IMU.WMu\\ERNf[3-̫jU/oSW el>n͂E6 U]4) -iڝjuoۛku'WEgzYe>>]inU8DtMĺL MRMB>kJkb6ZֲZjuLNz3uf7Zk%Zj%Zku֥yW8CYrW/Qr\4).ViM pڳYЬ:on?KgGyMYoœd뿇X7Kv2O}R&vgݝjɳ!1vSm3{fNhef;ְO -FOdߚoɿ'Y:UPFz4yuˊդdLVI 4ND/8cJe_inpu,rF{\/Y?PhhCFq3x[^&z?H{7{V -{; 7{^hMsݍ ^ޣvNRok;͞>CKK'- #[dsO$q (&x37jGoȠ#g-[S&'vfc4?LA')'Uջ>$okK$S0f"re$RF1Ys5_߭IVt%}֒YȖ]f7خdy?*? ` ,2N!n4ؙd2L:nG.KD -cŨQLd27n* -u뻐zn M 2D7 w3/:wYsg]f8oldžkX 74E/3cl@v$7C4o.%$Fby&mr'c|S6L׬@#̓!L! [5·j1m]`f>]B9!{ܖhtC(I+ [Bmx3uzXB ?P@\ʣnju>޳CϥD}.;ҾSZG -mTЋE;QmREeKMsE.z$/vi $يn& dN>`ru$ G+JV*ޱةZM_PR5wv.杬i4-qnD0f٬j8nl\ -d+[vZ-mX6! -EZ16rQ65nՊPZnLmOfN=`'k$pGo!Ps.ӫz;6qB1Rӊs C$QLpdLJ7t> y0w휑@E9E?g+KzKJӱhg+ ɳI06Af)/\ɽF$dJT{ -! #f>Iի%W&Z {ozZU{"`~-U3v=vw~fp.d9`"4ecB ztf-[\ P9 =#eb(XdR!!*H%uZDS @:>H{jxd@cNN6ccF! >7Ş?eZfp96caHA;N&3ݱ>Dp-5}Ǐ1qUK?A7`/ǪBąu,Mlg"7o#Vfќ28]68*dR&VpeCgpgu۟d#'wL3e͠r0 0flV jafaRC  6`lˎ_?M'稧UG\dz]iudOLr?eftnA ʹOI% dxl:c& n|o C -Uɼsw,O,w𼑷Z('O;nٷN͟E}k1Y);:GGu4RG.i7LpU=j:c)C{ LnJDdg$sQh2zr95ms6[YI#ǒ,^fgwtu:9(gvrc)GT~Y>T%÷ւY;zzgS~Y~YnG8tjоqY'wi?fEmrr$ ]>o,\'x~CL6jQB>X:r?IX?ߒ!"')2ު̹#6B̂zku_36m՟ѐ}<&Od $1L`&AG% h`]4o(e"}1kQ)mJ3ˎ a 5>,gs95 (;nBFQe#'IVLZAi=uzMա=&wP1,&va Nϡ~6U͡L1gMN#rbO2)Wwpf;4<+i'zlx⇘x3vK `W,͟x' ag)`\Ff:"qSuqVɸYyvu,mgԞdkFX5BGbi['<=I>#WlEcȣ( g^^lZ?>h Sz/ V[5eٶOmF"ټ#-g+RPs)+eaRR~xEVYufuD1140>Az @n` ̞fy`ُ͓=?v]t+&ՐGm?S|Mۣ.,0NO٘Ygԏ{W7KZ[oeI%).P,)O8VIH\O -D!l*V@+T -UvKz"Ǡ#l:HDDR B6_}7T7"ٓ{?aO\6OZ Nr͉\ۛf9*ve 9dy&u -"4jl"(%ԯ afro#z^qfmu!Iym~3D:Qaќu_ P6)]Ճ"N`,K50v冰sf܀&u1 A{P\6gOv)HD.>Ppn: 9C&'yb<16hB9F9<7WqxOLG8h:F7'93TX+K:#Nb.fBQHf"dioI/3=fX^m'T\n]Yteu}W%bV2xA{NJg R4Q.zx!sF' +7MW\uiNZ~xUVbrCr(GA;bHm@o黰zF6WNvZcBA-E lh'M<3y"-˘^BgbJ'0报gI{.$ky3 pv&h%,q"ӫNiqY޹wbN^da17Pt 3wO yw+jam$1IҩۦW].:|> ;|pl2Sw֢Zftiy%XE[8rUި7v%iS4EE ;s36ussgfOx 8hFRIjRS/T lz}R\%St͓չ䵒V|<ǩS7r~E*@cPox&;pgu%:&vRabVv;32cyqZȰ۰J3b.^ZnHlaIMVUܩ͔axq#&n͛ZyKUѮ.mPrI-ag.g]ZUOoՒ8uWRF? sq/7`:\Ao'MreY6l<6ȑdP_vfkQ,Na!;xt}#MTd?K.g~eDuu:Ե-Kɞi?M$uZ*=rO81D18a>r>Mr/T.Y0tլ$,x4AJc$çr#=MqwYG_٥͖XƤ1Eo_#7f(l֛(%w%v~gEXp(p% A;Vfr5D$w_9$Z`^5zٶknQ@MٿڳGӅZla (G !%z)׵cT6@H+5j܀3}|;ez|kn<6Kh=cQ]bIvT}יw\ae{{az`דYz"kdA,=X]ٙyg ;eDm)? Hq1-nd+1$DmKvN⣐J{hv,?vfOrHq@f+wT,I`fsfT$B lK$n>F;8dqڤHgx q5;,]x'k9?v5Z5[М'y;>q.|}u:čG7Xv@dy:&O6fr ZI0)Ig0 ?IEZm`vd\OAn ~dB./ݡ6Nxqi?c8K8t*sz68 UF6mvmZ܆Ve"P\I^)[u-jYq AzQJ0MԸ_%]4"[jH?G~J)Suhjr]b5?\WwrtoVBr8,c4O]ѣC:F@0~ -b#''¬ jsR̦ *K4olN mu=)Zj[!.g=#3k8t/,A LDl>gSy 6BVqb9=w7uc "Iq -UaJ9",$t30":pN&nvLJeRAqš? 4or!r:ef6tXkh،\ E3$A̚%>{F}ʵ~SiMq-# nz_EzwgUWLߦE!}53 D7[* xH5wӵrYizԨ.Au+yoAyX'>IbZIhu}Y8fiD@p:79;0=* YEF '*ݘYGG 37 c݄Qa@o跂UwWylu'fdG`ul{.ډC&j8f`1!6\/Wok-NǑUÆ\%9Irw2tt 3!l$1&ZM2h~\)\)?c=:3uB~ANm N7<b-j՟dsD27HtxFUj5`&^HGZ;Y9M5,U)2 ry;l,qCqbꭋ# >;3ݟ -е9'Veի.Yuj9X@1F>'*yJLO-N/[h;kwQbA,'ؽF0y@^owȴ@\lY+Vmj$}nr*-6c|7~G55[X@FQNlV;ZDC(DbdG10шY \#!lK;HIrwv˱J3P!,/?vL8tG뾒'VUҳPpY*D^jX7WyLkDIoi+#yb(j딦ᅽ)2%8bICr}U)x"h*zdm%>`ڄc js>BUTe%Z.<aF6HpE LU!zOT2ĩ;uɊuLm#2VuGnxc\_XW8V5m7{d}ve]lBf;ra2iX&׵˯qfj$9|k^ȫ~iA9u7ݽ!C/;+ Lؖ♳zc9X})jn< fv ; Eޖ8 o0 8VGa&Ȼ3d߷2'Ygt7kä₽|86j`BT]#dZEWfɜyם>nu3k(uyǧ5S;MV|9)AvvwgRQ@> ;FFc'ËN*zL谆rUF"Sӎe$Xu3h3|*Gμ]GK8|Sqؽ|ŪҺֆS/v&AV5gv39&Uz;i0<&9A]Ii6VpHlZ[2^Ӏu]ʤ bM6 A-$Kiu֗Yp[;{գ'g~}k>^%jAYGK fMv]6CqH Mj;EebzvZ yQ2;RP/w #/Hc8;mؼC"ƣ&KǠpڲ$l6Τ|Ăi[ -,l/\Yar]i}06FRO+Vj y٪I6$ M]8`) 皊xxJ@nxLbaWˆ2EĊK XDLT*^p%(8ͅb{~3!yUs}/YkN )1rjp0hd:)+JOJ](KKfxdזCnY͡o!]K$!ymAL7͂3Uv9X6&ܚF1XKV{$+DEzRɵ *r=^bm3bm"*tuN@M]>֥Y;m&Fu)OHzsC$TU31uIjvtq\n[atuIE UL^I1=&r| #1[SoIbV;$G#04[JpYQ2uaٹ -YdmE.Ut.]t\KD\k|):KKr|rWW%wK3zdbg?" \^ ͢"oF]i*dпal|HmUlQ[2v9Emn?wh*.n%ٻl\L =?O2wtE0ްeBUؾU~Y\N)CmVUA8X7ڱ0') ٙ6X}cYع J#i#0Īn] 1}nKTO^y -(\ƕ뻰A~ l}~Ez.Ϟ^L'aN0tue/qa8jz=&S-.Œl M d&͹y M̺i9>PرeəזE ;4174e #7tq]WG%  |ۃf&6]Ve\5\5\5S]>uӪYt˧Ck'".b ۥô/ f=jh{6"Lݿgz fx6Lկfau ɷ!6V k GxT8~OTG*Z*k+ܭVQCNXAkB*s5=2vGpQGRk0FN燝'A3)9{hY)) &|ٰ%)*StBClbcVxO(:{c {Q}&gR[ݣsmgrV!ܴIpW'W'Z]iuiuNY? eSEba+: "h3BTzC9 .A|苓b)~Ɏ6JG)gZvsMr}wcc5hO}-Kkk1ivq&}68x arAV##R`7v3j4r Wٔw?IL -Zv)' K6riGbw+[o YH;"%nU8kwݖ!Un u5JӐ b:nsw͕yL:鵷-\͖ \b|8"hNxwx޵@٬#w7h_/E~з48޼ 6%HG^(?PZ]F~ꓧfM%wl,F?v$]PTuT]QuDؘ&?MRϳfzoX]$B:,RC/8yJXg<(^r;n#3ԣFO'2QhD?&_#s~{ -KAn ~s -ށoW[,ۆ'j: $"L~an(Ip3h(bVv8s-ח)fsP~ ase껈u -IʑjO(HC1QE&{~͛f9=Yz͚O|ߴ#r,no݊|c<>Ir=Ն\ݕX\Y\\\\\ZMz.zҎݓY7ޝ!ɩnihc RéMBBFtˤQK4X}wQ1 5fh )`o Gjw,䥎AŅ77n~#ӱŗ;_/ܞ@T _YC'}8Ȣ1fGlRCs61:%-RbB49$%.  ;O'R6`\KӞr8V 6 /f͞!k~OzA?O~7a6dq -F:=O0U)\ I}!RXe9X1|)ZӏS9c'ɋ"I7aEV3|Z{G~ {-Ğ9LfI[SO Bjyi\;.z+n4xbo8٥ԖDZNL\i" =6xBjS;ra^&oKԒ<3;h%𳼡7FSlomj.ZO=S!oϙFܮ_V3il38s%$nd/~0lĶq3戵jui%WNR.gl#пǭnv00+h+51 .:a"oI՚k>w/rs6` ɅL'q|2X<" -76&?Ոܽ9nJ?6ĮǤmpzn؍]SKz3Oh! -y5+uc]hPۭ.=l,Nܡ,#^;'8knF#ZZZNP%%u54 _Eg -fn~~U[Jӊrx1ӱqlKќw"-iy+3\H^6\1/*;U@U`KyiD,CBbCF4n韆B6rwLNȫ,Vx(GѰJ:dTpC ߤ@&.4)cWIKQ6M6ɽ&c(#6J?2 FydJ5cE`eLZ>6 +QA4,,J:a9u.u -X-|eV\eXLsH-Vlٿ1kVZmNîNHu t]$HM uWI]%t]6_ -)t])6bÚ#cM\rP2).B*-gk,⢳ S_d2uq:MT%xk%xaUZ]蓼$OFϊ7~y9KNšU( '9:yntd .Fv^Rvwnc6#ſCplоg5Hl;9ˤVRP(3f(a75ѫ(IM*;hI$2q%. d͗#܆HM]zzy~o͗Ҋcw?l@癪ٙj[-[Ane t-["[Eny5dw$ޛz>sz,^S3׌.JQ}d,}PɂjXfg`|܎Q+NlFQNNZ1$u%k%B \ 4W_H*.$ 5[Tk"?͛w'l7Hm~ W#Մ,\A!,LE%F%zr? 5y@a;צ] SFiFtщI;\.ӲzSG 2B jzFZwRܒܻEFwb?gz$U*ʯfj\\%Oޚ0ݷ`5܃uhC&וySw]ɠdeiNޛ~^'¢)'?s;*E&HXlBLիlx]@eOz d&u4",IJ0ڀLK&%oJ|6GF)\1@RD:gɰ뒆,hCSqPfwL5.w'.O&eҩQW }NdVcã<,>IfZpR_~Xt;sUieD-E@pDqj>-䧃hHjT:OXkIߧ`ޏŔ_l dY[q (- ;C~O~yIu C,&D19zL:FheށY]abٲVyiLůҺU5鮕MtkR]=,Y!|"voD>v.mѝtg]tgU(9x%[kn룺9(h=x ԭ%mC)"ff#6=2s/Z*,d凿g&|9gTəm_˙|቟w2jMMR_tU&a8JgffEѳ+C[ѝ`9QIfj穠9[0R6b;O%Uoml1D1ᓩ2(?>R\uMӪxYGn,,hga)K4j=|'~&'ofSjtfKSD1WuelbؐNTbC-w9/fdvӚkr 짚d:;g?υo uZHDxwP[y$)ٞ1 g3ۍk?~9沍d 鯢}%YjgkȳkjkWogl\:4U4NLټ_m,e[!tr,f`D61X3=\? jebm 4_kFoO/Vh hZ]e`.Ҍ^F{y.}P,b*19[5Y3 0%$:RxeY6Z dkIcJ^?o;i&|Ն=F.Ibv7hy~9+Kd7(D:9_oVg?hՙ,4Y69:~#xm+%~HNRRL[C1jlV-]6J3܌OviYv3PN37A>wyA(Zr,O:PM=3wa /뒽q\Vk#&lGkrطpo!M~ES>)/UucUlN^.YugO:~k#O:aPauGO2G=&vٷpaQg9 ܥ;d-c`m(fճj]5=Yh|Wtah &q g\;8wɳGݕ׳jV BG)ACFŷye<SX)X^ֳ15g^VG"ZI8WٕoL힂ϾFӻd vhp6ã7&lR.]MS0ȁ)֝>3/W6/.~xnG3vg%s[QQ"nɞs\p)wJ2ݯ$*ԅiZDCD|%#a%Y4?S39SdUz祽zM_ДfقuW!:oB\4 -W@HG']~U84ϒ;k &xs[nwaISnݳM'pFl`Ǎ'|.r?I,se$\')笚#qDْ}f^1+EvQ03GnpF1l!_g#3337za#5`hwPBvuvH=ZvRi%0s9gpq (^Fh|L2j\ -sé;372cJ2f³ 2 >N&UeYmW[P-1ea6YԵ-nKQ-d:b>w+uKQdX"Q2vxdĪWX>/X͘~c719 11%d0X b[l3[߲vnmP}kUi^i݉HU8O? gdTKTvϴT=mD~_3atI|zުk-~j2.r)ri~{QeԠ]F_Q6^oȺYDjǜ0y#jm`g -N #7 -h++ժzƛ#3+Vw|9Yc;Ю.Τe iQ#bFL-uNvTQ3yG'7[\%+ .Yk[(U"9)K^#/bhcϬ~߳V-PSR[IDOoݲ]::՗!Qr5#Ur5W%Qrt'Mr-MlV[5#,^G[p+,EAGdީT-q>@Pӆ'$Uk7avȊ9fF/~!59 Z62[yO f]ś7;3&ca5j}ɠ`ezS9v uj{C僖m4a0ߖtK._I,:Ld~YioblOYU*yE[j]?g=b9'W,9Ms;M59#\خi=\͇[Vm<$!k+U_R5\D޶^(>drV썘_#R - 0&)s.IR*LDbgQݽ]oV[ՑKPġ/H2DIgg;4$l-Qts3f -RCTB`]B1;H_3΂i)7Uz4ҕӸ4EkJmS}TU(!`%vB/&Cfc -fg^W@O%y_Q}EYE -ޅoBڬ˜ʋel6mC@tN[jݓ2jl37EsN&XN8Dl#>9\2*{ih6%U7ٰGӳLJ3,vP gn- NĎ*Fd<|4D#oe9څ!OFR.RQl?MI.V.Z)3ڂR%!vnJtvx+R/+--)NS/+<)oݹ )Ug|IG3 OlCBY2Yτm\E+'ĠA>j$A+d|Ui6$;=-ZXwg,֣rlOPMڑ7@RE\U#m"O[fN -E;#AV͏d.i깦fffnDS]*5Q!8 fGAg,jk #Eě m%j.Qtj -0W-a0h<2:PZD@XGR2OB"߀"ߺ8t YbIRPB0o'{3⏳x -$[MkLb<%Lߙ=iz_"fvjLϛÈAu%Hd@W^va3a/g7>$H3f6=Zݨɷ3dpŚ.R*E"2=.-aqi3gf&jfO%st3' - 0/K$U܀qf]fu%MW{:]\2 -ҸᴡJI4VWӍku=$[RSW)arvW%i5 Nul2R‹oNMhuW7LJD2_f^;"lɽFV1 ;n8JڙK<ƛع"݉rtxexlٻaajL~xzq Ńze4Jk2V6 ^ξ\@AXew;.p&M!U-L_+tɉ8azOO0~O׌ -aUm'.:5I!4o,N ^ܵ.3d|F5B8'\͗\͕~,?r&Lcsff6L+JZ[:۶7Jbo~َK\#ua8HP9iqL$$7ZsQbщ`'{v}'+f=Se H,mY֢]۔f1s%(C;v;%nvF]ȸS}b --::XmR -\WJY9?EqA䄵ׄ/*p -G_q$5wvCsҾIփ[R.^w\Z\[]6#3ISO5J,L#z[|RK4Ԏ-&n2.4kScsܞ6d<aг;+՟=-QՆ'84KSdw0> -巃HOknaD$ak[U,Z"PN%T'fwB]Ƒ3Xlh(7^@c3̐i&b0dc\"ǧ)KQ8v9a_\"#|R"V9޲`LG fWNvRvswV=r?"XtQ׈ +C _'9{!BGRgU8ݼa0ų-+Yks -egogIQ uS]Ful'u .&d\sߐU% zԂGuoÉfzA$"jz0͆LM~`~<8C*H" --fܗRQ'&Ey6 N āl˖|EQ5-ȩhc}<2Vv<5I\haO'a |qGd!rvm,##~&9qwZE )}cW趡|7,1:O]:՗#Uru'Qrt/U+-飅ΫF̵1 KTB{02ŷC[vggg 7YSŊy(bQ}Uw\%-Pe)(`xҫԜ.59Sƒ=j|4ĵ6I#rNz+.JKCgovtgzL$iȞ UoA҉IB8ʴ0쥩^gwr2!'ih,wNe1}N~Qܠ|0s-˖>n%VoȞVǜH#,VcxƬp 7&6tK].wjw'ԏr @&1YoW[&܌H0ۓO }Gu^;v ŏ O Z7<֯KV` -{}ty6RjWuŁl)xW.t]a3 -=¥6W!i83wS_Xbfhp7InIJZvb20ۓH{'DC|4duN]jу{du_Q6Bf\5SOz.YuSAS|1lRF2OeQԎvl0>ٗ=~W2%֌]1>,^ NKQ~4mmXt 單 -oUEiMuj MjLbY=BTA?dܫE mjKZsb iސcP17C~1òf vQXҳdXxq7e\]]:b[  -N*Z [12Ҳu''Nϴps]V˦aX7Yu -Sb#!͟[(ɽ=,e{}{3U&YYn/f/ۿ;v_~7ٝZk%R>j1#<6瓎`EH:NC$0} G^q)r\39uIoP\ jhicn%ӛ4Pݤi*WZ 8MJi -|bƢ83I2=!-'IoT[E[rIVMR}v't`VMڃ!8jϮm"?vy)e:Fg8U0jA3>1S>̣7uh}M^g.MցڱJOCCxâiu} 6v*FC&>9{Lri`6XP(xeOz9Ɉ+p'9^]ƍ`t]V]*¯ŢOd?S'Y:No);6U5 -:x+K,μεW1+.r{YuSxͳl|[q{srwifY8MQ&lּFXY',edH+Igv#؂j96v]Z4k: 6Yp4&hpn(/E+_P\|1`WO*iom;13[ob.ē~o,V)An:w~0UB)סHJErƖX{ 'hm04=[t7x|dçmU東wgg#?n 9\0صA.1WCF(q7C#3;Lo򘏳l 1fieScx: &|lC%b -k0es_#߬~ ?e;;Es?Eu -+,b6E㍣coY -.]uzˬC~"]uX%դPbE, 6Z]i%_ݧn"{uq5NlqLcҖP'շh3g[XÖk͐& vvY;eٴ.&vSk͇[_bfvcmC(l&Wݚ뷫/S[`MWOll4]X}ZE%&a6.8LٶlwNr-Br Zxrqd(lz>GnHŀsvxדAk7sŔ}fOY0[Jy)H? -DPCgo~"- FիmߖONMO+yRrp.ln7/Jы6]WFPɔd f U#]a;ۤ޳Kn./ѓ6jNhFQa;fLܫ_ud]È\ /Xk&<*:UsSӞI?H}ӝOԌ>|.6MVb^\ .ӮjNwq;R)܎NZ\3Өxej:_ ̤؟g+W\,}EU6o5Υ^8^LdjehfoĀʖ!B?I_3L/b4ݛ>IvɝѮDGa!m'ibN;Aa"ڕl̹K+KMMκT.\_/Bh|{x#H#o&[@_v_e~~%VG -'ه3 +>je`J[&6rx,Y1C03l{g4R"Q>`_VNkݛWD# 17b gvs`ϩ^daTsH272;[vgll6tU]"<&p?V#KԨEu*I:M *'>*r<9ݱZ˫]Z1ek|[WXuũ!aK~{Q;]֖C6kיyӿmί- c%br:鲓 e6SaۥZw]*DzK #D  ̘E۾J[ɥ( C8}9WNQtT]*NwrI$B(B(Jv\ $㼾bp.lNwsT:z{w!;~`|WNV귶^+|Y3yv\"]ݪ^혳w% Ge -mJjNq|r3&I#r}՚*)h;QgGxS,Zn'|#/6'Ozh1j;81mZnjaԵp[`}?uU\5\EON׮ߖz "=YeٌWQ0UEb6!/Yٟ_f `Q_bVjx#/pSb7a&ݎXr>nU![Pwl#S Ӕ !c D0ӊHkIv檷^)fsM#%'ogV(CfgU21KaX{Xh*tbofiwY{xenqNߊ6 -QaxݦEbri$7Aa]].l(zJ鐦f9]jY"Aᷡյ&$ߍ~[,\ܭkuU0h@ ~dS˕5VRSb7A\9ٓÉ.$4of vA hWf Zgt0aBv>KO6c`kQwo<Ֆ(hPGZ]iu'YZ80wz?{ *XvvmM b/+g,ևY3{$D^Vfm{-2|.Bs8z}YE}U#.IݶuXi gp̻vvY-;SOU|17/ݝ!{Ml,<1@2wwnfm#^ar~١]NzX]&4I:.J0DR0Qw [jUKQbUtkÜ+TwFHԍn+iޙn̞чRyCzvmW,-/ FA#gyιI۶x8.WuvOc. !o $7i#iI5.ʵGoTXUv7b(|( a&QO!v%tM>{\&캝Me' "d?C7)rWh*q|]2k$2*.v R dy[Wq}XĀա"&cg $1A;I]NJ a1]"tP3?G`IՓ )L* -28|*v&#Clo[ ^L6ﮤ'afwai^AP@u>A|lR`v K6?g";'zA,^e}hby yzc2 4{3\Fh\TMXҊiM Sgrh\3U x-_*7DPbR?q=Õx=nԧM;#{~1aRL@C- #5`WMuT*Nتjf}2Է k%]0I-fõ)+X,\uY=v^e8 3vG׳5ZIT;vxY CB>Nu4c.qVjnP@+f[0-f)ݟ'65مL0is%!hHL\I>G$D_UW(W4xu1hOveө! 棣V97oufzmSl٥ t+Pҧ 5D('Ky6}yt; Qfu%_Q}Ee5wLzcm?KtP@Zi1`~ގ=dil ͘p28͓b_f5nxY}*@.\Te&LԩD.N{1%Z)"q6%_x׊-xoؿm3dFm_ !aVv6v?h.'ъ Umb,K{mݳ2J.'Ub£؊ -Wo'u^e^tYdVĹ˖˳Gf:zXLeYMvj>(A)6}2IlQ]68O^6:rמm^,-Q=:n1&!D$JsZl7\45kFba!&Ȯn]rU6k&`yt!si{q`*_R|N筮vү4(ob!7ل09.l ɿ!kTr|\V*qTX*ŒgQlsOS'pY՛5IN-WPoZ*FbzR&.,-.*݇VyN3.Կ`x"cNG,wO%eBn4n;xA/FBC,atiS`.Jg9?3"~'TpmJ(I<v6vvgoZ֨U+nFG d)@ 8k2`?3 ϳ◑Y̘0V-G[F! Yy6u]auvPقHLHE^GRX铃\1fSqbg亼XbMGIK[ &ޯ4Rǜrׅ+s21u6í0˯Y)1@1;T'zBٺz[&[!Ob:êM6I,ٶjFn8FY5.MuJKSF,MBѱ[@Qѭo_`(jP aHFO$~$D5,6FRV,&\rf#~Z/d߳9w\lv!&}+Mv{6o̷dN6M\u,'])aa:._ dᅊ;.fM\3#0D/XkDߍ$B:,_|V6۟&4scs܊d8aA֫ۆbhpsab#A>ig0-oBO(#_%Q1GpwɝRZ+۳$/Hb-Лp*/_"u>k|,).z_oa."|&F˶Qֳ7Uvt͐qebl&wƺ).|6Q=B%fdžǝVI63PWg8kj jTwK wLd͐xq)(EKw ݊Ejf错^uDŽRoub9YP/fug-~ dčmd`$:31쟿 gX;>CU&_\Z,onTfȄʙZ (ʟ&입sY$W!ErW#Etzg՜>HͤVqM:<9,Jh"gŦKq$j77z9b89y 6Ē!aoYI7GM(DDD[ҕ3M8P[Z0RioՍ>+?StvTO"jAR eR4 |_4jBbG~f.M-ʹ;ȯQv,92o3;f!LĂZ>+1 -F@y3N|;batd=G݆VYiVY\kّ\Bk}>&v5044`I7ZSֈ_T\U7~MG,s5`{BSo燦UݗU鉈X a6/YٵuZkT]Zzlu9heībHXWv kx2Cx(VL@݆Hۧڋ -dCWKKq̫ah鐪^j<0e~r" 8z,߆k7;~pxZMKϥ~3)-T둴YMOtd=:jU+Ml[Uוo[ s#nčAN]{3~!&ȥ+:C.ɰvA@?p#e^gMZ.^ت8]6yڡFu=ܣxq&F "͖&lFfbm"҃-WnUk]Aky߅v%Zv⢂&rX2jU[p8fM MPG\bk5SQsP٪΀n3HU/~F)zЄqAıl'd'Z]d'=p+8y;O,vO?T]R0s3m.Wu$CmpN6!i[erJ84pɤz1Bó3FMiyU0߄mE$8'#zB9 qI+kL;LJO`,4傯E1M118>MfN:VSVyQ ~VCNۗ)+ڱRՍҰN1ëGfByBght$eƉizqrJh$mߎY񚤧mٙ2D@U xX@ FBoJꭚb7w`"61g瘝C\qz|8`x X;@ ,:<;.g\*YvQjُRou}\wZeeTkz %!(w6ݳ=`c_)27L8m@o8h(n_3I)2`;o` -BϔqЄ᭑M ]b>!?hZ[ol,f-kR~+}جPqv"۸J߄qإ09'#I~f ^DPHR9Hd&#d( gjBD7nښ;e:vq41m8Ro?LCӫF&U^VpbCH!4f >oЩR`e -{i7oR Q4#Ir5'QGnz_AY]1nbOZef]hM7aЪ4?ިVZ<nXPb6X]}erj6uffwvf:oݳS뿅ݛݝeYwrG8o"N^.Z٦7U*E\]kP>+7kDEZ -sAby R&v'~2HFb/V@o0͋xoW6Lm#wSnPc/T=2,c zyf$)4f< -:,"g@3](g1j^МDLzx9W,,Xc7V \8a}sk'XtU - #~Pgл1JMjuY]֒Z]dow.np[\tKL_)edWdN6snMOn{% er28|WPXO22BۍЁ:ݰ#Yd7n檮r'O%;3w]u Q]JTڥe(N15QVmr΅7ׇxY!Pq>Mty.MtjL&фIՉ3 |XA<*A|bU|͹Y3o4gGmi3pl:hyGZvvvgnP y/drfv2fy(dǎyE.VG͟ ?WB\GlgB8ojVDW_wVXġ6,س6EfyU Rӆi 'l=\,Y/#եvK'Mv(n5#gvEYvͲQ(W7쮄X\,&'y?B>affY2s}rjr%͊_~3iݢI7zQQl- -h#0[GZ#Zn/44~͈e&})ۄR$C'z߬A,r}Ō_t Vdu(IBٳ#\՜UlG'|:uNN<*S1>-xާcStwl*TJUEc0-p}.I5l'V:0 -Ue*範@×K&%j#V,ah})]Evo1P}G,\nNU4Zֹ$x3RWfUr8CS\~1C*Se~hy٦X Tb0ib(pLuy㌜l1e#꺙>k̟W7+6 z5GԈ4bSdu]h%Z;e>7eRVW?m%'u'"%i6i7M,W4둬손E(iM~,M݂Z ,;[2!amƦsW*[Bߗwiaa$nlIMl|y:eYӚXNUU#m)lWr-UrP;?z@[kʎ%+U^)$hcy^wmMN3fu+@q*Jvdt5/nRm.Bl6vWJ5L瓢g e]naBab',Uݟ#99qm1ĥK( ;6!/{>@,BAte6ḴX=1ߘ W%L{&>jJ2(Q!PzCEl C&~*<*RH~GqbQb1yfA42vg ջ! WNz4&,M$Ŗr@HLXҒ{_˞NGl2I?͓p|߬顺^9}16]T5㗏>Q;AtK Tvm['"1,.gYع$sxW8mwjLݙ̘c6evOvY囮]%1R_3R<'Z]d,.Z[e,ۆI>6sN+L[}Q8u؋Gdu=)%<*@mPՒvI40!b5Ah gUV&hP,6&IٸO7Pa1Xv<2{Q#2Ye-YVjUzK.f;72DR5OukP9A,˛X9;32ǩs.ifh@xq;ψ(kߊ}սLC/.VxH>kÈ(qU(lL%J.Ng6'fM ?$A'o^ ֗n*J{SO%N*l-M\ҶM\1 A5(5Yl{(>Ӎ,Mf>2:ĭN-ҽNf #6;HrbVWh Dޘ+k.]t˥VPᑤI'WnDqk 9=j7O0FI$~W㤼c3sۧ^u^t#6'gM Qm=M\럦iHX3f&|r77kSNZIh%օ]9Q&čZ#f?ɱʵͲ˷nQxc-A LُLkvbT 5GH.Y>#s}/Ó/:s< ,?R8W(k9 )w,{q' -r Dα.`btp]48¦67٬~گj˗94Չc ,>SPQCnCRc}/]:%թQY-X#")4f/VՑ>4NgiT5'ζ-1}j+,.#I6ȤNFxQשZx\^RIz+' ͤ N=Yԯ./ז Xax2n!j2"'cjn(c޿jWjڱ OIfiVFz'n;rCj47qx8[!'zwFgXUlgßyڳM۴8tm}> -ԫ4' R9C֎6ϕJWW#c_C^td P%^n,NjudL`*d(G BAzBI*dgݪYx5g=YUZ{AhȺu =CNM1jm]f~.BԪSZ%(mL˝Poh7à2ɤKXgfieըXZ3;>^ON2hzU̝ߐ:b(LJ5UP Ÿ겧ħ6Q[I瘽4u1oAUfij^ufWvev *A/EbXp|۪ 0ܘ]N$SֿS "Rsv}w֊m:f9Dt 3|4gh]O,@l7r79cbOfRي<&-->Ryg{TeDՖKa e<6hlķ-QcoX0i8bzS -iȢ z掸B9FfaxdbF!m0IMvy w sb\7Z3Djՠ\#P> ;YlJރuFÖaLfʤ1ŸYV?R¬?r gAfA.q'NIEbNSlT+" #dSޫ\D#.^"ͤrՓMfq"=*S`~1/KbS6 )B0bdeۄPIn}ة{mb2P44}իX6$9?gkm;,Jx.f7m쉱z\ʅ9"#OjalK9J>ޓwujYsdE`7؝%i6eavJ%琪k{,p_د ǥ~Ņyۺ,HkD-ߓLF1q~_GSH!Ie8ĥ.m.q3QW;VVYڱf8&P^]uX|NS&* spӔ~Z':?Q)Z@[5nKnYSmX[tˣ6 ="E$QDF #@֎8ɞ]ԕpĶ}pei<h) v~t(yIPF6%zb듙φ:L<(Uĝ,^3P+;%J8-_:-(0"n0US5uq1 U<:ye:HVD*4Q -fݖ1lŐnY,JmWcmv=|vV~70uT愁45UnR X?IsPZVuSa]VLQ*GC,*eoAr5ؘ|6#w'l2zTGo d兊i{ԛ۩WoncO%tC Pd/nX&xi&Y;24qaԘdٌ0M18h/ٛ/29HYv&fYR'p-׳6X?qlaʐ8ԅOy*ЋeWG,$k -@ y6!ڂ ikVtP@b,Je+GV$;\`;t_`h㓞` zv`{mavi#㕳3.ʵ@ŗ 7>S&E!pxoՈtU+3 2͛7~-~뫪0Ɵ.E(dԳtn[z p&3D,m1멋kE(nzӧa"&ɷZIfh,ߌB.fzݧ,.DZ̆?Gh@w"ڕ@ nV_*hNm5Zhcqztr8KOWOםЦu_jYi.ItK]*aafC1q6H]?u;+3 z}Fݠwx'ez0S{v8wSɉE'Ӧw&{ `ALU7.s:N8Ҭ8oO_c?p8IK]7!5q3hnΧ3)!% -\tg|/NHtq:#WR+t CF@ifk~3=Y91ڎqP7!;E2bQ z8؍;yz*+X90w0јs]&mY{#êJ ˦SOVpv 8 {)b@@4YivUR?Bl[Ud#BsUaofٯ{]n+2|B.|L3 >%?޴͂y$uEoz iGUdw\) +|ݗu, sEB9 ߋ ;JbgJI/bVd?j4n /[1vHB1gvG8y;ܷC f d.ثg,N>Dɠ+NSŨ} ?[?g VZ+#6Є۞yO.Je5 < #ݕ v_R|lJhOk;I:nvitĠLgp%]5Y8/^lٝo\}plOD3S֯+b=m6!NaUFQv՘;]a>1'Y$شL;39z"-B}˟؉4s 6zj&G>9v`sYx/[*LɸrkRDu9&>G8bY򝰭[2{ ŸP9p,Fs *Ǯ.R8[3J0dlf8 b -DBFZa7j3n,"Ĵ -ꄟO~ӮnޙgZ3f;eM /4>z}uUC A1vQӎ1]sUW7M5D_gʝ'%N Qa_qՒG̡ĩD: XHoiYb-Nb՘onKswbFi;3 VBDqRYc+,g4%-11d X3Y/bb-In;nԫ1pzX؆<$ 8Lw5>3iP:A`B&9댅> -yFV!\gXZыa̧}w$c i޻Sq,%I\5 F +~٬q06ɷQ0FD)Z@ >h`!RBa -%58r*Fs_[ʌ$X=L|vPL"~TIV]Mj0^G!gnm5^;߱01dd]?u]&[zL`2nJjtL]-M5 -̚V[G ,ٽ,|2%N"g&- oǒj4d44j[3Y9MIoǷm\اg۲f}/ -Hl\D_Mgmpݭ;vԒPϞ1,-ⱊSF?7o NY,2Nbko afۉ~+ cТdkLDJC Hrc -\y b=Zk> .KA+mQ!܉]Z-Tx3^2ŤKڔxl5e(t1]o$W'.Fݙ^Y6!M&Va,W'9m!zqɃ-:@r -Ցz={7 qZea>N0C%ęֶۗjK0<'b +tJ<*:.+ˆy>ETWڲffn VR)8pCK ,ty)'{&mSy+“ӻ? l刡=̣J+O\+_fplj+C Wp(?'U-s13Њss]!lpcEY$8ma|/j%֒Z i>TGnv.}sV]-8Z;?rGE #/ɱ d@ߋjZUl9#љda "a1I]޴zRQ̬wH2:i7ۻ乌Abc7qkpc7n='H?S(0!+fYj7erkX&1ICxsɳ]BWQVYr*T4j*!t ]8_+sj]8DgܗQQB1#iU IۄI Kbw~$:Q: i=VIV13.ШC/yGLq7Z14^u]?6a0႞|1ߪ?oS؄W.^[.Sw6`b7evaD,;JwOy-2ُ: p@@XU U=rŐRBC#ߪ˨SR2'\6i =?f- r,?8vNןXLDN]%]" zpOw3}Y͔ hZOZ̲D9?%ֵַZ;{V+3xaK ɭ+r%.GUdێk2Y? -|Wn9OlEֻ'y*٪HUΞ?Q uGc{Cj)ٿa뙉v7i2&M>F˰ fߣ|-.Pq B< -VP!7wjKB|}qgq;`@Ee*.Qtr}8~6oy .޾Ndng۾׉:"ښN; ;w|*Apf6k[H*3@/e-{lN!݈3%hV%fVg`nXmϳvP>aI7i-ڶX`ř8ζoQ> -SM<ƹ;1œ`vYoZ9O<˞HCXv쪽x_vLI M^\IHwe_1,Ěnp#䐬=a5{Uq ˹x 33fսZY6UW 1~K5I꼓Odw'>O [DP9_Nf$YE1]&F{T-l~1fMDyZ *ޤ-۞8:Ĭ|>!esV+"~4!woɚ@ٔs ~3Ҩok\5SMJ{~ Q܀#ViwlrO1wٿ=Mަ^r֠4A8[1Fgb7\̋|yw_hM '/efH6킝BQg;Mђ2ix$sR ۀfy4[2HXA"I|;rhf܈)5گO۫N[@d13'hb)-j;C84[vgqєGݧ.q󘒜 ``x[y39 dqb 46LlLCZ:qPs7fؾkG'6er9PLItrE'jGMVæea>zY|T|\JfX* yiuKK>Oj:j'YsèF#g)K(:m׎ػb= Vy/扺je;Xlzs1lSm2eF]e3~u/9e,R{ޯV*J X k?:˿\O&Ƒc/B䶊V?KVnЕ͎t}Mui{/l<u׭ձ9M [:¶6)G8i:VG> ?V#'Ɲl=eGjrdYf_yhXmU1t}VQQUb|r߯fr9Ke)vdULw&{܄[45CQb^(oO;/&[&LoʷXk觬?w;I?݋m^V fpQ`c])Ejb,ƽA7$l>jV p6`Xx% (mUaC<2>AI 0"eNLU^Xj)h`aUҡjKZ5Ui @ #6Y0z|:|WnHn6>c><jo$laF2W93 -^۝>~ 2V##A q%Q |4NG X@WP(J$\#L <>Itk]:V~Bl[VdZb297 H" o -\RS}xè$cwgύc1x,B!@|ɫp]Mׂ'A+K&tXmY]N@*Җ!rPT<-JPVyU U,RM c8"͇ɮt=ݔ&?mQ{?.i/-TE_PPmZvu4?nQ]nr6pNgx -&#l6M;u)#/*#Sݫ0hxV8FJ q?5h{77y4(8#I{3R!3I PQwڹF;8s{e8reaOYz3iQJ2g; jE>$?{2|k-#Fu,β@97ٻ}CDz .5fcv"/ -{@i˴U+iO^ݭRmRVWn%Z&4.;!1\%8NkLr?GVFjs-JAHxsImGNEr^a菺y̢F]7x=rAI'ɿan/j&_fg"<@Š=ԡe9>:l{?"%"ZBZbFbxńRQ -Qm_4#{7Nζ0sKkS&W&U]BEǗhX 𱭘J=E߶"o\zՊ'/ٚH19$;s8KU9.Ur<`,L,HMeZ7?bUֱԅ.IAz奲$A(h8 5cЫZ "N*{\5;9à5kY Q62kO֦]ZlNC߷9&!ɇ/|sNd&#fAk9UgfyAglDž=Q/$~b# ENi͐zw3O{ ]F]6U: 1pL0"- Ua\e~W6^z,J fS8؜;14׎wX䯐B48PhIwH4!~*LS1eqKfGFMHQ Uy=:+rg燜R4=DcuP㯅yABf11hIԗ?Iu*M'f]8ǞOS3ԫl̘#vMXKut4sYoa+R'9;rݛ͓ܪs?Muk3 ~_L7wϥpq IKVB5ao;n (ݘf{?iĤ3g5 BfB?N˘aB1c X*+F_8;mᴳsv]iu=`4^xN)a0Ǒ))LXHy&VXӍmh1Oe^Y -0ÓV߅j{Uw2ByjZqS҂ctxG Kb7|V _5k.Y3zGJLn[0WQPW9`j16Bju0^a9ߎO5v[VD2opbxGt0L}mӚƺm&]6It(#  8 )@vX5-1=tڲr=\ʼn1r_Vs Iik1MAbInit)D]m٘^ ` A(c4F XdB焳[Pxozv=I%Ztp5K[N֯#|%4x34m?T?T>VۨS5ɼ3'OZ}&.өZD.V"٩)Bc{-*jYXBqQ.ARb쥘#8HCbdٻ6~q'Wj'o[Jk<)ZhFl4'őC fqQ)?HlŽ9LK^+#!BM ۞<:R`h, ܬ,oE[1&fanNś?X/x^<<ÂXNHI#E ~c8;5ʔdss?NxHjh^qʕ*LMnM#ӫZcM9vN5D4'ou^RKnnspMZ0lufay5^1 -h%ar`kP*nϔ7j@ 1Ybpz堞V V_;y~ōӽ ZPG$x8Yؿ #^9+됽|>T,-~c*0k7%QZE*RkV8{Y MQrfjZ+x}].mBAZqCYd޶l,Ubf{ٿ;ԘY_̣ d\둙r.k4#X|'ΉF&K-p"O6Agll=[%P7 VCQrUg䩶a·Euvm󸣪gtLG*dv ][1,bpgJ 6YeĬ(/G(ObFaUh;0υE+]ac_E? RM[|XLXa*IiwE$dU"ovVh؞˻HaӣK.(JP #Xa2 ݥj!eܦn؇(mLP)&B[VerB Iz܎@>eBz oَV $LJi%0oHzݫnVYnb^.-Y>Be̚y)=hÇ݋ Q^Nfvn}xG4fӻes5;O6z|H"hŅ&bp933`$.YGSˉA(2)3/3l˩Td؍4Ek.]ڃ3Gky.=I'v@?Y-_%nd>w7=i0M@ B,8ׅXjxIՕs4&|JCא!bl ؙFd-3d?XatbKӳσ6j'ݢR.O3>vq9$bTn\/$ Bsn%wr*:׭6MZi?M\#lhI]y5lb%6# -욝f[0&ɸr~.Yx j|G0pxaS -獿 +U(j\D*'U QzC(,/'u4W`|ۨ>ggfvk7Yfpf(\bj)Q!/?-_DYӝz&NҮрYWG>l. 1 8p7ȴn:Eo#2]=OӁrff]`<> N^irL"2K!AWNxL]De5ӨVv¾)jرCM3Dߙ"O4x-P ƺD WQǢ>kZ0uD.-\:0$;/<<,Z{@G.^Xmr|Q8>dF9LG~M=H5,3![TeOr.I,ZIdžp%wx,b@>,QU3&Xt~($=V)'fX#!"53i,efu[ڪTe#nd^?Drfo`pr}=)9d]~#jZ]iuɿH{e.f۟@V/FtQeG ᤆ!{M2g'\* b"#t͇֛<8&c^)C4!iwYpIopNnA^ -B:ZV*V&gQ\',A c>BٛU}1ra#0NI) -N0vt2ݰI)1HCb?ֱB'f׋VByv˅<,mRwouwdmDr*<2,CbVra]?'ozl2>&L,) :t?aXUo=n8B1YRf #\TI6Y$뼙i9^!oƷ@&d -Zіx ;TJ7l=Rq5JgGV3#~Qtk]>Xͤ3GݱDqE&+D\7q$٧ e/:ȓ؝ iQsޮZ:JXϣnC/Yf&ه̹h -`nzE\?s|Rb 2uC.ZGly0H5a 3h3e(4DR3Чë])"V*k#:{x+oB뷼v" xcOG6la gkƋbv= {./`%-gQ22t><.HmXe'n[v% n پ%./1A^ ɣ>Jc 69lcY 1ЊHi>~ZZeXx -קa^z+tsPXc9m߭rxJlYy\^#h8/vwOjzq[qv\e+->408;D24!YasbhۍchX֪*PLZA|GT g$o!c P!իk8;EQ[Ӂ_b?țOV,sz[ui\0Uo,:1(]ϷK;Z6C,ovVpq2i6ѱPdSH$5!G߰dZjb6j#U6X/'ӹ-YB&r>eGo 6rS16O\dի2hnퟋK+rOj.~y3?޽g-+3dߔfHlSGn!?=IsVG+?yXG# 3d-uyG?[o8&aVhxߣƛV]"zp'x$'@1 !!o/gP@{e6 b O6y*-[;>J72HY" IsBգ:dIJqDl1f!:k}\S?E>xUX3+  o3&¥!g[TzwmiX [I>724"Qp(#6E%Ir/UrsL 'aQĤ a/Jzkي X)O+Yݔ!Ԓsօf.?{ bPA16?V9ǃ0<ڈEިHS86Y7IrD|5X"||nX+ׂ͖̳a3=/)f|e-Оfѝʍ> 蠸oc\sJv$b6NEXc-A =Z(.@ Ugl?g?IJ:|:H'hMk=zl.y!oVMv7ߺoZ.K†:o#I@kX!0{DBq\A#?m٠cZIbLCRB,l9[FG ;7^Li%,:mrg:k7ȅJ@/16#`1݃G33{xtٶZ i%8?rElI !b;ْe#9ȳu-F~8#׺{m?'xY$.E>%MSe nO؝GRujt٫UVFmp Et|k& 8Mvk7X!/9f K%|Y'vF6#p(IDPg<erl;+]ricJ.bXMCj@ՓY#(2 e%&4liǟ͙OIHI\>NC(ޜ6ʬN7)Yyvzݰ,zۗ;OWXKsm}ԶFFAS<e*ϹQMB.^x `sx\ƟVL[Wی\+0J-L@p0Z3cqp;Q zO#f"R87uKm:Nx?d|Ёڥa[0KI"({>!YMdB좨`yx'bgzV"}uP_J+xv"HT=R ~]>x(m۴1CA/6er%tPZ)tY)ԔTFO/UY3)&'é&é*J\[{Lz>NV f&blÆZjj%qQ".GPW^ay [d| +4[q1(mD,-GOy뱞'bp3yc<.R僳wBϩNʑƓ̤mHeh1Y}Kuc[8HPEV6fo/fPv%,l;6)aYh4w܁=FOC/8g~@˹~y*˗$×軮H_܅5p|;rB)-zNlG,jWlnSp&ͻ;,WDŽe!>YlKu*.U6M0-ԹZ]k.+q jMt+\$Wp͙ڑk=yd]FYZk. >,ӵpqr}$}&vuB u޶#M'4QT>)IW 'BjSܵ/(:'^lxwOnM8T1dV]wg-' fcA*|U b,{eH3$8*-۵쀳WtϋAj0Ӏh}H6 RTթmYӪ; ғX- |Jqj؜n |XYlU8\wρ2qF=ذtzZ-g;'JUeꮗUoruZIdA,޴U]G>%ZlCcwYf ݅,!ir}Nҋ"ٗ7Mަ8/>ͧ.䪦d,!Ҭ~vЉ!??b)$5DZ4?\Qr[p 1Ͼ3>#^#Є/N8oP#n,9xhuZipUq:í_c|7m Kou6"Bo5bqE~VbٰXb҅a|06E>Vxs=YDpl5lIg4$ -$Ԣ`b3^(4du Nɺ}MV.Z`>YR$ZK1ҳbw;lGGc?w/9Rğޞ%yHXHg}%љtpauA؟?O4QO̾{;xQR,y݁b{tsԐI?oV)(OEת1\)exd5L vfwvwz,Yq'Y,m+Y""">EP~_TXYyp"3L4WίћCdWZ5vݣ%^fê]s'Y:]#4lݠė/yY?J@i#0p3whFj{.RY(ÎY-.vo9𖍢7𷺜k[C`\xu&TUb㚧d+uJalV Ivđ[>iPZ!l iJruNQgޮekykrfhaǟ~y:G۲F:)>0g .MZg3}.K;E(wipzx.UfxcRԲf4&6?ǣ]RnݼG#F.75p+مŜvS3 Sda}qlo2.mGQz-ur\˷){$|~>N%Ӊtg bJ2qv\MjExqp6"5J]5 fO r-bgQ ׅ٤gf;4u0mI&+:gp4 OO5.k~B9y=VMrVY?sMNA|tѢ -+˓a}AĂ#[Vbجkx>朄[xė/tPY8ǩ΋쟝u[jWM6-C+٣~g!fT6|>J?`8pB1̌~F{rYrT-]e0y\}ͶowC~ $hUqo:[Yr-B{ .[ -(MoS~>OU\EEvm6فwqr+XGV֯J%-RRĩ;nX?gxkfY8\cah@\I\3\m^ - -Z-jYl1JYE涱4 ٛròelaǻ61n*Ť8O3<>n|[4CƇlٝY W>U6/_ F ПX=x'IK31n}np(BiKhrƖUJ֬N9ɨHX{Y0( YF@k`߄x -NpJiU\*Ity+|úi3vSXĘLiՈCQ&;g:r4wAۻŌ!Pf`,RXvwxrSî4fc+٬覨cj b!(^ 7+M%{Ry$Aаx:Ko ]dJ{mcQc]4ؽOA[$/?Q_8b5u&O&y&Gv|~^5e.!( r_4S7E_R8ڼ<,U7|FHHK$'xwޛ}T 5^Evv& 3+ -pdWjN!tHME*&©2(`|3܂8N[5j]ux6pŠ%i@dnqYy5=õy)p5&)f=eu9TfÖa7r|r|]Xían╳3ffh؇m3wV hx~B])0gO8"~&؀TEori:mr8sjt]qL_6#+v'vT&tY4qbo sǰgV3X|͑vv5x.%"r 1eFqc>zoZ60ER'!J{1ZsnMݙիbk;; 0s*kNJ jS-i^֋mvS4 KAy5[NyV w$)LUl6{+AN;֪_sU˖V[e¨?6j2b}xrZVdd·`[Փ8f<&+şnuK LECqifnmC˫ĥ^w<2i~b,QN9IVd霖n?mtPB< xWĕq'tծg? -vѱ^V"Q`-جA;Gݍ8uyi^|2 \U%>Z(¤4^avv,Qu:+dDcV~Fy"k2>Rel_&xhbq6S6'\4,[,eMVк,(G"4@H}ӨEt*8rg٪Dc]2̗yOl/z{3W(-FۇHVmWs7ߪUeS\$7;px wT]RWV)@L50 `Y:|bLue ZN/[ɟ[wbI⮞l]U|I>~3ʼn17ω8H bO"qŪ?.ضzA<0 nM1~,r9J: smER @2"6;XXIC\`g`.A Wmϗ ~F."&h&閗M6we^E-"➔SfKEoB]ׇ H~pG5ZVC=J~ PА(|.h7WY?.0i5F,=Xl6RE?aԕ>'@;'' q%*3C"Uj'F}2w\L0ߚ<2gc{FK5*֐,xM)6Y?ƧVlKZ4UạX(_ A4mdڞ}|<䡁ω ]*'I?Eu -+QLb -BۊSQ8Veի. -!,[;uO??UXuJd\ij+ӌ2A ^1oMp0Flюv )-߁ -oON sS6k|U]. >$inPzIS@.Z)d8cf`͖l,8q8%zg q5 -1bnҾ6.8{/ -\``V=Q؈v?s1mH.ӐYGhEݦ|Гq/O 8tO)^bN%_zW>Fz_:wMɗ=*v,Fj\ݼC$l!,to#}7/+E~9fxٲ?/;>Yih߆JR=/ݏ=%M~k^a=30ԣdȧ cu{Бlut9p*lO9+E7:]7OE fnhb+3 ٲfxxu?ë<˥MbghjXPMS]2,&Zrڂ:-^( =^ ۣp#jGm1KW%gbm83G 5-Y ´ɚ K82 wD:;u<}÷w~j6hfwyu=PpF+Eʩ8E'JU5)2əB3g[U[k 7+x[ꂻHD%jg>^ٿ ߆o]8#(:!sqD 1zN .*fӆ0Ӹ-9GK2'8c#l*]V"M!M#M HXݖd1/ǩy5ܩ/r藳oH~ǡdφ[M=_ww"Gjoyfg1v&⬵fb鮈 j _ /C's~IOG+Hd"<Mof콸~ '҈2c{?dնZpݙ|^2r"8`~& "O`tBwYтv~8z԰ \+\ r{6h.2 -E{"R%H~|Bt}[/N{PVӮlam,M+s[pqz7Xfdby?XGge. cٟE:g6$~IQXZ_Dp'WeUGUd؍6(Sr]rxnb -Z=). Rm,:q3j㇄C10bcx(|48w^. J e5ө2TP ;Glؑ컰90t͈=!tr~Khq1Oc[Ne#gurg\DPj_ӹ,qV Zb%$s [ S!Bg\kO:3 2τ՚~ fYf 2.6jYͼ^Lm38"Y}aÇlc<ٔ7c8dwNloN:ѡNduo}&rpĪK } 1C!m / |A͋?NܯNRHcaDcbAٕE*Kwnap3_]E-H}-oeLu WJ:XWHR ~.@Bdž,(AV\eNq0ɟ .UAfv$ /i:uӨ.ErF:cٵ{?lg z1U&RCdP_w/YrW߃+d!^Bz^hefm1gZK;u-K~%+!.;G8|8FEu`?ê9#T20ڮ,hQӦ>g۱dY;R&RIҝd?^WFqG!j:r׉dHFpp'sW@ouc-8>vlj:{]5 w\tעl<&ye0yˌx_w&l% nI&@ĝn`h̞F\4ZCiewY/6k7Zk&'%߶Fڎ9!52gvN ,J1h@v0;p'y 齂b^vY%,+%mBb͓qgRA -h!0 mdTiߣ d#U QdHVM^ٮ*꼐>]ج:l ddv5 Hˏ,<'"3HMUҪ(k#<"L~dxg#fŨy6ǰȣ$!6g56m͕[qϜ%q`wxN<VRs7 # #pv!vr/]l|pmO0fkfm, ΧԦl",{)Vh Xy;W};j{sԗP^iNOY?G2M6cE%#LJH7lwS{ h!fyDňn$0ҧ2iz^wZV[:źq&lX^ڒqDo$1HC;'Ԝwh/E(Z'hlť6D`3rnC 8TRJ. Y]\}&XC)NjX;gڷL$c2?&$vcˤJ.U*Mo_XĠI<% 5nv?w.~'\ MA,Ys4 9Ms.ru !QV/)k3L+HlA+H; pqglJ6\xmS8K,L.SYivåd =/9?UݛFOCGSꟐ -%Oꋱ6m¨&9E.)0/e_ |_hiq~%IφG&gM~{$ acTx. Ӕ0xF15\LnߋjsRG8ìlm`=Ñ5Ҡ]7' x pҹb$0^Vq&QϫlNR|s؂tg&A!#fόhXO5gbiw$-\&m7,6ďv-PAm1gdr032Eo'2@A[д6an N!p.oy]k-eǺKA-~&Css2>гwrLQRXlCah{t9EsW;Es}C9~7Oᒖj'M30CթW[r<3j؄쥰1ފ&~ +Uj_T-aLbٮK,pᆱ)H:byJ'݌TF9,M^eK<{+4'b:1q: -+U$aA22Xu_}꘍\ǡTm;:I$gsJgCGY/YYf/LPa#}Q lCe7)lY~48sL>W*q(+V.^hk(c_PpfXaك:l^g6v,pcl݇S2f'[^nA5+퓿KϤR- pGb8Awg&Zɠ1Ub!*lG3H|1"aנ-'+*TɼFkDORY.&5J ޤӔ},N'\Ip+522υvv9݁X ڝ,V/bc'\VGReN/(s,Wx٣g`#~zP,˥E^gyJC-:dԩ!Ql[`LZՠr;L86j*ўq$wlʼf>6,Xs&i8\qU>l;prZIi%^mzY<'m233,"8@ x)A\  Vaqn?A/{֦}Dou4I>BT-d<#x2Nafy#o)ST}i~wP)2rQC'v(Ո蟑V*ِ(ADU$Z)cN@ot깮Bj.B6̼G$-ZfٳCHT0U<&~Z.~'hlN =|6"ma+{'&/.!b8R^tX/ߓ-/aFf:ov*Ò1GPGtw@A䦷0[&7Y˲VpIeJ ))Xp$9XMRɞNIt+i51d [qr|*l5Wg!h߅C2͵[3DKqd6 a`esX9u +gx^֟V'v8].T4#}n4 ʼW ζeza݆ W6le -A 6D1>(۳v[ٲQy7n#4fd lё -ylgzܸte/6Z h%Z"|z$jCv <-O Uu:VOC1x&8\Bh~ijzVovU. yK+BO ?s1o-M27V_Ksbn㟀SVNu֒Y?ٻx;rڴm8wuLg}[eT\Dj0 dh9 nAԔ/YZ@iz+RRf@.(/< )B((zuqk0bC=]ԝWyd&ė!}rWNW-i{qM+ N}ωc|1@ /Yl@X~l0I$Zcr"^e 3j؋NӏeKI~ sd?|s%nI^{;R3ByҰ:_n;J< +Jdl a-c SGՊAHNmRqn06kr6GVsZ2pFQ i$M;(h2kj2x D}'40(? GmBBrY,> - nr*roznNw?]wKj1Ms4=I?Esٛfjc3f򍫥aD/!ȡn[[bbl5Iiα9刃@6|i?Zu[8{ӎ? _PP``O5\~jkEq:u4-t鮗Qtj*5a614;h&GsbWo-^ Z> *rbdE4ظXl?xlJw 8'/v*iAjM8A -l55lbMnn<.f}p6`XUx Oc4T%o8؝Mz']_" ӳmr0ՊѶvR0e41NFaKI$ur`2ox2wZId'FCA`PoBrWK&;fo,~kombJ&[p0sl 5H+e)asjgG<[2ic;6e^`Ku_ R˶j xZ5|7n`!zo]uWYb 5ن$9:lg]R\40qzGWX'rŋK$aJIYlC{ o:tӹG}*ghae覡EӦ$<$83BGxDTJfX&m!JVb#jȐŊm]mb5r匙y3zP U-5K冦,-YÄXnV6}+3lKu!ĥQᘳd7hwDWoi&GsbC`'Xpq0%8nk[ewT-8EW!s A1S6=*I٣\ Hkf&]V 8idj<,JC{|,VYpkUfcXKx]8j 3,m4Q-bPyc7$ +׫ mú֧N1i]d鏺ߗr XlMTߦJ~\ٶXlrGcyelZj.M6'IR0E齊>rg@F5όG1F܄*h*ARr5ЎfSR>Nϛq#IK/E;fəlmHç:.n1-lyO&K~tt;G.df}E~~zO'FRohl>z=;p]a|Thh>*kv,Ij)"I4Q7@Gx[so6)w{ؗqG 0ck3 6l2t# I j7rO?txT,#5k܎I_&>HmRlSuWWu;A>L;7wILس4ˬ4B%K\o 6Hٚ|:+&CNy>vύ>QFDyy㩈W/e.$_V,>L,OŅ@="k-Q)0> q7 C(+*NeŴQۺo+d<&P`97ˉH9)w_'fBex>~˞STs}&A^ۼBäDxvsϒDL"ρfD/|Q$OA,g#d l|6M!I:ѓxm!Q7]LEwY#!C&Z;ņ(h;G  {ѤC;H XjBq-#@jvqg:7bT7!rHz5 /_g%n81(!ꕔ30jP#?'/+=ϯ/+~/]&kr% -ˉU3wuGz?\1kAE)8{6{/?y}|x_!DW'줖([9::jL*l*{ItH6&$S\L%Mr+QGuèsjZv!If^ X5Z-L 4mFc[ k7YXOP!b%}Qdk"YΧ~=?~e Qw|z?H u*(Lݛ˪Pݎs E1D.I,O!?O; q>{Bػ{X&[8 -X,HN@ -/Ȇl%7u&]>ԗ!EGZE>{Y"ljˌv␜Q"HQM ceT^NǨ  {$/|Uy%!x'iAaf)0we'leq| 5$ٳ!fc[pbV OZF_h<ц !r)̫MS]:!MGVI>N5qOVN.^`a&;WJv@N~E >Rf{33|^6/~Z#[1oNb _B˴n6.6|یsl^G)iJ|7o̢=B T!;Kឥ'ԝv|>igTGZH0VW7.* `,".J= zZɻDiZVOl ÿu8 ,fDq@b6r=z{~ŖC$Ryr.ҢMA/Zڅ5өP#b1Gq܃VZL6acl9S^܌!6n,X) nf^hf=#v--qbҤp-1YbtkR/_G}ݛyHlӱ2/l"3%WyVh]Zp0"!XnDw?3;+H:DlD$Μ%o` @]dͥynۺA!h  Q0.V7Zwq 6Dլ}E.U>+1 ɛA.S7d%W"?&,Ő=?e=;$1OdZ`⒦}2q onx͉X&&"9k<:ݗKMM3 qvo6$lÄGZC0L.B Kq7>XLN'Z_y6j\Q 3lc9x)ar0 /44D3F_ % Sx@40yOQwo |wOAf͟j}6>&q.J{qvblbكfwl0 _K7YJSmOR 8LZ?—yzvÇЄ bf;>I{M 9{C2sl8ٸ%GG^ߟamLN9GJɣ\ˬ>fڲQM&6^nprs -3.ɔ2ERg|A& Ek-}֣e-$k']suK5] Alr/]eus\rkO V,YiqgY -XNhy|Y)..~/;n"jAp Ikb|gK]>(*CD燿e[>82,~$whe䏄C^M#'f@ر6d^&Mx报RMys^,/퓺vX;hy2z{?W*ZG9;p:Ov]Y7d'M.zrqxٵps,oM>d݂ H#e%,d=Y?Mz_Dz}NGa)@_'\ |Qc33x;o lQiv 'E$m4MLr31qp D6u\h4ǻiw Ngs\ԩ29YGh8\:qbx$?\)p &Luou|)2WA#L6sN HETT*Xv͝\5(hiTUCp}AKJy3Q2bmir`fQ̷M(Ypre\]FBGB:xdx˫VEuv~ 48D7/gO606/ǖ3bė%B FM' J̚~zUTeLqC ;Eg7ى 8fSAXТXou?R\/Q;Fex#wMqSw_!XɵY[/;'HNϝb[ށo@a|8HM3[^o 7%l9E;wQ?k qM2 ě0T&Mj.Uu -yٝX/9TM~QUZ_NbN+Ω4D~>|gP3kL8mH%mi20#w8YGV-s=Q 7]6ؾ7UmX0|.JmܓVXgy=,GTIZ6$U1 Ҭ}fjQM}QU0 у{8N CDtYKZse_D"LZ${1P>[#TuJJ PXշͰßXurPٻd{8ӹ-xՍ/*b;pHYTGoY|_kbiya9 h3֠ORo~E6'E>%Av,B6Y*>ck껔0E*Y*F'd5&ĥvzwM6/&Y1/ ?#X]*E[0|g6SpOf" "=(g&#xL\IkR\%SdjfD -K[Dnu-yٴrX{4{;ˌrAI&dMբMU|J0=lsE3gMIMᒼl^fؾ&yKrR&Λ /4BuiRb1F.«i0NщOVY A^}3Ob?b)bkľyQb6fe7;Z>x;rw9ErOm?^rk 6G:atK^) _QGf(l -գ&!~^(}VwP#t+RN"؁g.97n:Sݿ75f뿃Ln 듩+e(Hn]/@,9Il =wbOo _kY: aE^Ba3uN-A-.UwY|Jo+I9{O}3dI-6{Uߝꋩ@oVW=g$-Yit[ܧ ߞ>Tt؅?eSs7Q4\K8וd:KI-$t'Yx2Nu֗Y:KA-$JҲOf TI䁗1Us5ۨ˞keduHWTub.eu;KZ\VdۺWgO$vdKbdNWtSHOyr'Zdݗ,쫘,Y˛m)muyVu|6.}bV˿X}] Q]YU6/z.KHJLkV궗T--.qu K[ҧ9oYg,6NݻwC'Y:KK.H~j.ni|J: NꔗR%m/Ǔ=W21?Wşmukk]FPZvsfߝoLYp!qˎvP}C&˾b٬jk7T& $'aֳ]d/l 'u2LY2Ҵ- ՟g/L,Vd]ɲYx K.Y:ds7u,d˲_%ZYddvtZW OjZ{&n;d%vuײwY7N o)7wYwZWodɓC|pgY)jufYNuZdeݮzIR\hIuZiZ]^ -+.]bV\\ݕX[Sߎv/FCͩd;upzGrvdCNF$ѶO:[}ٱkgb/!M`.#͝Xb&dݖӫeg(̈́؅Cdůƍ&Ūd4؅\j:ޮF'A-$/d'Zhu>s}f\4i|N|R/_YOZtVȋrY,ZgN,d w^it8-.6:~ߋ/~%qҴ:?&ǀSfY?tJotNddL'Y|ۇKg]{qɝ\N,%fx3|47"HIystĴ̖Z {d{1' !0@P1`AQap"YɒM$K$KM%$]3kȝ("9G"Q$O7'I"`hAEdlY;g\I$9G#s99"n4lI$I$9#$NDIr9Isg&Lr$/sG4sG3G&ӎ_I$Y$r9I'"I%DM K93͒rdv\X"H=+]5*ֺO]5Ս;"EUi?ªMUBTWϓTڅz]G \ꊾ\dXyiUWr6Q^&7 l?cfQz1:7 -cv*.΋B1&7~)PH+'lB"u,]= nB2UV)==ĎᖇzqWF?E^AHgŐ$4OE7kV1߃P&6ZJ[e ȼ5^g"I$Q(J%^$cn|dE!Ƚnqjq7d.4d rdɓ&L2f??%w) yIC/F7I+`B BUiC$lKtíYD޷=A5iZ06-:A$-Rf2dɓ#jے)!}9|DI$D?:S&Ec;Fz е1\zC88N$5zj觺`m:E) "XQUhtb}Y3#JIa>_^"DW$+ݎUMGՔnI>mnC;Q V(H]XVzs顫ֈ,fL2dRAZUrн,2d` U]hvwk{^YAUt=xI.!z($_ F VÛz^ A|2EU[2?$]5/EY*;FI͐ozoBOe$M)lZ} ɦcؔz&Hd2 4QO*!nNE\Gf|Xީ3^[I$,dDJFOMJֶ$GEh+$jΥEԙ2dɓ4QA؆&:E`E(v-{`7Ar2fABYD-niVdviG;:3AH^[S$duG+ EI>nW*U Dq #I:_vLVITDtfng\$!lBbid$hid*vEMԙR AWUHMHF}FչW7:ŎoT͸1GUOUMbc1 hEkwήX!ZrԽL0J%I#Q֝LDMWi-^׹j" k҇H Q(ɓԞӦ hCM_A"UoDl+Q*q՝0GA` $q!檏ꋢ_buWv^]<^(h^6J%*'KGYc]9~:QXў^jBs^vLzb^A2fFDRuVB0;Я~TASڼC6"}hoHYE% D# D;* XO5ER+Z#B2dmBhCkl&E  $ɓ$ۗV:țߋ$b5S$C:I$Y,Qv*+ 2dSo$v/B#C!E#9Ud\8F҅W{&;J$&Hd1|GC&hl["5]5B^H䉦L~.(^{_W`b/JQ$K2d5ގHu_iy歷fܴ#XtR0J9KvsВhGv%v>J]UFFLY ĝx%L".B֙ 6.|.l?؞ VL\^G}et^NhQ܅`IfL/WdobOmغt+]w`NDXW/&=Jz?*kt3=(ؼH(K%>lųE7Ed;>N/  Dv$?2w;dG՞m TL (䉛flGR4:+ KbȲ4(rg&K'JюEFw V;l+g~4Y6$Vtd:I9 WZjwٚŎMNIjv]fb&:1rR˺U]3_њ  -IC4M-r _Qo0 Nd!ɑJ1bע7}EZD2
&H!YL_G$7ɮYh&DI5i&)csIS|s=B@!IPP",VjT tV!D  I (TtD:]X۹R(&;UC" !0@1AP`"1npf3mO88qqێ8㛎Q1QZiqqaG4 -}Sbӧqg{%V&QQ8b;q:q9կ3x]DTQg't88qNj9Oc{:b{wB!*ǥ .㎔^gԲxQx%xCc5\ϫ>W}o iSYoCc<Hbx.ІݎGN'7x& &TDT<1x(f9C8CǛ1q2|?PH#|gs\D@)/J9TD\0[8j1# }.1_=c(d\CǼ\yÃ8(5w4ryWfPdEٱOb C(`09w\wgEn< -tg㥘'x uQYQLlC#0|gόvqȡ'|ŋn 4Q`C= q ,VE=ga9|ĦyKst`o0D+FB5½Yk}Do& -j: OQs<ouVӃ~DX1qC|jf AD(2\J3ǡrpR䢵1QRx^ ,%}ӆJ''ڨ`(n8S_, F`"Ƈ7u}]+x{O ("(/ T&R!w -jG(8,Yq4ij' lt<5Cq9١{>:xxoB֠Pj(v:  -,oˈE@(!BHb?SF8qPYo̿h*t6"ׅیқ'>͉҄_"60:<(*#b=,vXn\1fogXo`,ETXq -}gOCPjv|So?g!n:\9jjn<byF 0v!jJ:Ma:[iͻp^py /;q_xK!p'#8#4QR%Va0NjPMlֲj!tڣBDd`}7(D@5fvṼN - G a& <S\M7Q^0G%(!"83t"sqxq QdiEV&|9QCقh蝪7 x(1hG1pT y#53~:QYLA[ǒM -<c&8}#;8?J!SX.K?!#80";0X|Ϛ9@+}#3)Extgo`5FCq5Lt`yQw㌙1*3C4(B`8|" &n3"湣n8pXꂥi\wfAh?Hz(N@D!}HBMx74hE ?7[mh-MpYqkt㧙@Y9'c1~Ax`s3 B# = ۭ_8 -"ȈAPq!u 1?"c1NDE T#"3 0(@Lx3Jl! -S9|b*X(}^oB:JGc!fqB>3 ssx3M1ƌ(w - -jp`!"bR)B0oP0MӃTPfpBFf[C)AF.hTX(8x+1КFlagХsSSV~XSy -8 -#@bf(UH`F8ň t80W  E<gy{Y&ݩc*pF`FhMZ9y  vij5nhv<Z}:pMkc>b/ jj!`s>qNs6=c𤋮MZۏ3q0|;0Fc8o _~#E EqP|g'n TQ`7>'ϔyO͎uq́o 4T)EX~m`J,9|BWqO=@f< в FnG r-#aCo2lw= x:4rJ}^AZҎ1 /1hCJC?8#> |Qz9 qXf00 |X()EC«3t~!G9+fP ]َG6lCCV CCEx8s@x1DXEY>(:}OiێpS8 EaSg5!^o7XCYqUf<.G5<k'gQB/T`1o!B}7noM[?rw O g]_.;8q|>bx1ŘRCO1QEO5s|bhs~:CGx0 T8NH!1AQaq "02@PBR`rbp#3SCc ?"MQjsS0LE?O*E?ފb*W)E?OS)Ίr*sW)^r:)Z=fX1 5W5A4juL S?U@T%BT.PB PE PE PE PE PE PE PEQ?EPE PEPB~7hv4(_(_PEPE PEQ?EPE PE PE PE PEM? -{4\v҄Y/gz}j>{vW 7BcO}S)j5Rf@Z=Z=R<7j:}TU@4PE4Q3DBhLn*l -@@lh@&iQEtQEtQ3E4PE4VvhP:ȤrGJ'14 /Dnx6'DO1~'~'~7~iQEQECcT,BtVvhfn?Têi*uh+CtSN#NfTY,\5A}T*P -r((ݢ&v'p 5.w);N3|h*PGtzh#>j3Vv4z(#&4y 6& B Q%x'H2"қ^2=F/@ Q3jSا+@Z=L3ԯE4ê -+;U+;4Vvhf&hfh[h@*xGQE6&7EgEz+;4P1@PJaj#ފas5WuQ/hŠ(@&DУj&Y٢+34VfhVv}T>,}TGUQU1ڦ;ULvjvzE3Բ)^zWަzsN#Ei+HZ4Vjf:=QUsT 05QC'P*(r(((ݢ&;OwePE@S=TE3)U zFG`phQHR*Dp -P)JGS!@(BSaQQQEQGh1&7EtPy+\Jt -Y5OU ɯ`6*z&7E@cx. BqvG>;1w@85wiЍMl?d$Tj*i~p FתhMT#W<δ$鲷NN2Lx4Eڣ5VE?ҥp#+E<՝o(?w 0' |GSKTB -f߇3h3GҭRɪsW+(^.tiVʊcY8 M\T+Z}S Y#U7mCcAk(Ǝ^4 4MBLO5hEs@y'TK0>  t.'qܭqZVnTᱵ x8)/%Z jI_6;!O Ț;C. M3Vo)(pr!'LABLa$qrߊ5_ 41R -xV_ҧouhEIɣp#eڮ[S^vceʌ[cNKR7rVryl0 k\ǹ5ʅr sBm1USknt4gutBJe}*4V+SբR^3"NǿU6+Eή)L鏸 -xNwb,Ymmj5ኵ:Pv@q_? L=SRQ}N|OjQ`> 0^Vo5)Tֻ!4#;(;PS-=٘w9B<8rA$ (nnUCfި`xkbqAUnZGlţsuS*a,̦<6&]<TɅrWSMܥfZS۪>#(am'}Ph~xq}na퐗Vic< w s; X낳ˣ}*T^{<hm}U}T}D' χS -T*Cg]gp=4{iΪ4*/"jLv_eʽJ5#ޥc#ژ;WrqH@sQ=0XIvYZjd|f9'ӪЧ;(H|o0& -̢CuA(OE *lm@X1>EyLu2} ps9皕Z'9"&GԄ|F^䬷r(`ǭmys̊Wcƕ_NOxҞ#UF* QSW -xdttNș^4VI -c2)ᶭ9K Xi -3hp))f9jƵ%Uj>R5滻.,|uz --MNc|ԍ=hfmn>t9L_QyOy`v{ 0Ylsi= )ɢ>]S(jkk'&{y6]]eJMTnS\O%xa7\Oǜ,qj:#蜜h|5s[+&ytSJ?ILq9Jym)ד!~#\T.ǘ3v^{ 3L+0 Xèq5Gv|AT>Du)oڵM+JW̧qMFPT9+uGE>*A[/y*dzvkc! -+) -aWOp*UhlsG(.pִŠ'~UѢt_jwO}>Tv2Vq^<QBr JEJ2ޙ?BL sI;mZ0|YB?DtCg@QЏq4빣5U=,P0.B9\PWH'h: @%D8c 㢄ڨV+UGRzj8 -m}R}l+Mm8P/VvhoL`a+ޅwHq>#傟"2&;TJ2Y٪> A xej2 !ܕh8shѐˆփc]@7S$c?FpB)D:mD1n -udˢv%O)V>ptWShUU_DOPGRix?#Q/%Fu*3kQPe1BhSEh:+HIzuFJƊshʘC{ʵpSj(tJxm@ˊ UjUg82뇇ZV(z'>)9O's ~irO¹'-*Pj9+@#x !,)fiJB*:kD˴4QEZSh=U' a(xɠ0f&hO |c@gj+jZ~$pu&^GGD{9#^I͢s]{No:"Rso'(*_D8%Wp׎xQD7O/[ԃ</rtU -up@aLPmnHp9?-8IiVy| "IT;"] (|C 6HST껗Ujvqz((t,qޢngfkp*.1{pN:A~tM;&5R*NAJX-hFǏ̦`8f>U-GxXQ^!54;Aq;c2o ЄPO 1['<8rNǸ,x˜OvTo5;S9IE'uvQe`NJdrc6XN5%p΢<~㔥Ry٪T2";˂~1kx7IiD{r>?_ܥ<~_+?F#ZV{WoVJHr e8'~0hiTêLvyrЫڦԫ'wr: -un\>8n&mCsZZǂvͪ>QGVNmVZ7,Ab_g=e<!u"{U[5mG߭vE+O1 -M"~O t+Kx)ڎ)ռkx-|qZ -L -wuF f7 8<,ky:JO'>wrczysދG%G iNqVw9Kyf{vmS5 <3VjfQ&4?Eb -dn(?V9-s -ַJ79) iJ5`>JFV-woR(k-PR9<9 .P_ ئ 7V7V颮-ߩ -AFv{eR%7R -xxaJ?@Q^vU1*7tP4+T̯j.5LY咵6 - -@MSӏL&FcC$L9˽*)TxVW3^Ouj崽E֜Tn-qA¼QPkT1LSmOӻWp MQ\]ڠFњ`P_\'5_WGԢ>d'<|Fp?rAN>`_PSS)oE(Kv:ch+< _LvӵVЭuJH >{.vႊ2VvhjH HN4Q=MpNzt -/Mx՝5B>6x5>E O3/D3̜G\v3VDy#S|1"NL޹(Giʑo5X ŚYpq'R*Q']NRPuR;JE1R)R)RQh -o>m24{9)c =օH: Dhz,(:hR/h9*fOҁ]l!i/9YOD=S=H1B:+Gҭ>4S9|*Ҭ蠈ef`WonmiUzBi!W +ʁn٘VU?և^W~ -#];]‰5Q:xGRyUCc7Z9Sj[V譮OkvT -sVl+\t-K ‡_Lʉ733?ߚVu8a±WHVu6>,pSSSХJ!0QDy*@f˞iRtwgw" 䣫JS05|IY^91UsUVз/V\p~˅ -0@TiOc)#PMڼ>&EiB4bj8oѹW,Q/T/g"9'UwS{DdJy -G9pE=Ӊ -\>]HB8]VBF'@@+[oV+s4Vߒĭ}TmTmTmT}Sξ_c}ef0jK/xW%$y| -G\qq,sYTMJ|1&11&?PaBAB5P TUCPz}kyYL:OP sj?L%@(?ⱷӳ+ƞ+4{ߎpQ-}@ث(FYDloW,h -0ѢhM!PT>UC*U -JJ@>#Q sAR]ly}KnQ]S cEtQEtQ51(ۢ&Zj+;4VvhYڠjB~+A*OB:'835SG)Jv%'xG.oOorO5)TxfKy'.w4NJmS+%\Cn^-!E(rL5(rʆ'nU%kQxl(SK,T5o)xe]~W_ao6&t:)ح@~;jWwY uGXJd~$Q8_g/ "wTP2U`zVf5co̬CV64t8x()449YTQ!<ˆ0W~ -j?JY~c}]UU#7N0! -zyw;'+P4?nYxCwiʪGoW\+jiZ =Gu9Nb{Xkb1"q}5kkOqhE?T*o[U "pӲGƉ"Y{PUZh>'UU}ʚ} ->#FmktQ2v;ْ4S-ZޭObo[ÇH!HO:)q7KGhUy#Q8i,:pFDo=3_E}Á\撥z+KUaBc+G53 vhTj8}ּ<3@Ѫ}TꤛU,IRMmTj6j6IOTRK|˪E,Ρʾ*x+Ttu]mSXsUsx \> 3h V+H.F`EZQZAo!0u*pJ|8y{d!J)”SU;S 2:CZz -4sRs*F샒q.wz T3AHӻpChySUi#Tʣ +:N,+ZQ F; )zM -:`TI-~^\ Vo7U*;Rwx"謵eYUYzzq}T^= -W)SΨDb1c_f}5q}mB54B4&t9#|WWDL'U VUg&(YC1R)sBtFeSӎg8|pPUjU@5Qe1Ugwwhɧa|b(:HOwOVy)؇M 0_&w{,N~%?*; if-8]2xi<{x WUj Wu\TTAꦊ mB/rӳ%Ynh{qfҬюW(;2 -J&;LT4UU^׿=ޡ4&i -蠗EeV94VYtL<{ET沧.WCΣpJl%EZaTno=v0Yi`7 ZOrvƃ{ -UvB@ET#QEңTJP))"0^/| -"ܛMF7^P^N߇MWznfhTRSJgT) Op}ѵb} -| .>+u -r -RS様yZd8ĵJ?nzȿdWuS9`+54}զUKR7*^T⥼ +Njh?ޝZoTUh,BZ|02V`sZ>룊2QD "{pP TMPi;_A\KQC<ÒăMG=˽]ɷ\96sWOScOҟ{wވM}KxHQx`wic_05nr\:(_sƩאQ$ӠMvD@GsVYy5YzwJ}YO ֊op*+ U$_k? )ῼ(TRQ&x iҞ~nEz;<ײ.sNqEm}UY]Mq*7 )_˒>WtA)A)M*c~T1ʢP*EEP( - -m)wZQBҠjǢ' !{ 邉r/WUR)Ls@ׁLsP5ra -~Z -`5PnQ|Awv7s -.❇瓰QExnZs5S `8/R!W*'XHRˢF9UztV9iXe4VVIP=(q&DlKRFK5#ڞ4OOORz)DxmqCƨ5N?Z @⥩@uy)s b:)O Q%uLvU^SxN($ޘSǂs֋.xG Ǐ'tClzk,ta~I~Ji«?ẕަTJTLTJTIRJQ)TOTTT}Q*.>7yB|AwUhT]D ҡ2 _a< P3EA=!vS0D=u)Z=Z>hSև4~ -qhuT_{Uru OFs}[O/c -g -Y 1ĖZ >RfBϔ0 -ii#Æ"P1@=T Ы;OD*2;;6G UjUf=9/rVa UjUf\g .)m)h@R;TqN()YB}Ee;D#mhVuqST潟`]^Ry&H{+VA碾'|''wէSz 5F{Ć -PY>&#sZ(FxNģ {|qx@l ꊚ~A"QԄ(%{.*RkΩTtSs+JCOkƉoZSx(%gc V<+֬Q'VQI!qܜHqIƴY"2Ecʕ̮֨tO H详TjTgUFuQJ@T,BLnPn]tWNJW -6(iMVW0gkAՎ1ULE jcA璎 -pMOH;t]FNM-:JJ얜X|*R4%DmU (%YYfXX\'UbV1gf(o51:eJ5XS)|QJt)>I9+dkzNTJ -6:>*tU[[[`'&=Gvjw5 #Pi_|K5 #PyNjk= -s39 Ǐ.pqUpGSDD`@m!9HC5SU;uS)Jt*CsUk)rws@%д4MÀM~ÏEgDmFW8E |򢔦ՖƂȨ<ʳYwؘOE4M >Pgj?Y٢EffˎBG-WenyZxVP>;W_&U|+7Vo@mV6גJZ+SxW=0By>CT>@C)$Ep%m! -}\N]auM**/˲6 >[Hoz!/SSFODV`vu8F<%.>~4j3El+bk.~TLLomymmBsZ7)nV4(P)} -F1ܥ WR9Qjuz㪛Lq¦=*O2urƜԘS*lJ*GT:MT j{ti!>uLhu5o7#H/k0~OG0(<1k?UԡPDj8qz!|jV)ZtN:&(PKUBT=|zxS*¼>-nԕjh軃uI߰o=PGNj'̭2S}JOz~?EA(B5QP1(0ş}kM8و&T5S< <n)!BTnM#Ú*!P5 6EQ5Pq/58a{uWWk - - Q6mSfBoDٽfW_Tê2'H".'`&M2oE|~×iϯ%dph<lqou7}ey(:Sch+9boq8vc``(Nx` -bj7VFS -riQ?4Yu8i-O|47EbBWPiPD T-@Phh%yB;_:ѷ*7hv7hv"*"WuNjP=j'z"GERJ8ؽWNȧvEÐVZ|ӚS fE}9a6伖6 e ۪SYa>CJ'5@ShM쳽h)@>C:-#B"B(OT*UFU')J\v )3ΨP hR -WiTf,*`Ո+mVwU+BrCv [>oexs -*Uz!8[`O5a7S+)wܟt#R%JGR\9i sQ-mwt E$ZhLq漾ho-5n]0k៽tLv'hr~]i^QϧQ hRW9XJ%GtF~a Q{r0? hU4YpRɪ\vЩ} -W{S+mm DTkFt 1pS8WSkH7#\{DM7wεB*c*l 7yGhUh栻uB1"0iDfִ=`UoAǯ8&PZ#p#h:'<|R~?C -P(^?4%{=)flQz h; -v -s%Nq*Jsrx/ޞ;5Mq -P-)-aW ޿ QJ0M nT{gVWgyV9UVYwOEeEcXVItPv+*HrYg\HmVY E}3ڡO%? p -q%C/iQ'S -&$z禝TgUDuP T Q0y&yi4!UƵ~VVN;nEZC+^Z_AVH^=ՂN!Y<+#xQXX5Mݢotko^RM&_ԥ⧻S(B'{5-^ 'ޮa h -vT:A0}$ਫ਼RK~4Nֽ$"?&2Vդ+lj=hɃ͏Gk_eݢ("@5sTY{)Ozڭ+]wuw'pxfVU UUN»AP}B~Rp(=9[EjhV;B%L7`ry(Ƌ͸&fA]vWF8NJ4\TjpgRU+uVzSSLviRҼJUhUhU<2۹=΀)" $eCث@xSd+N#v hWǘƊqQMx84ܜiOKթN#[EϊyRIVg'&s [w;pYm*(ƉD68'TjTKTBǨܡP TBv"B{|O*igB)0@];pW^N꬏j`B*A"s]Dqxura]zyÒusA5>Q2R'׫TD+k06HtRB:>o)E?oݢ<^߽a^>I.$?;#6C4dMzlMtD.|'nJ+woP҉ qVvS5f9W?M?T*`)ƊoE+OziFu*%tP7E0x0")JaW 9+CTB)m=Ui(Hҫ]XjW^YsM{\UJ]TkݰT(Io&ygqKUeuRY>e5U@ƴVS;efw̬{F4ګ9YΪ'؊謧VO'U*J5f VvV&c*!=&_ˊXX̬,Y㶡 -,(lS;Mi=tVUf|5PzNro^2r4VR -.:9xϺU*He % .P9@uYx_Uf0YFȬA "+M&^BO& -12r"Bs`]LOq9|HZhh -_@*g~Gk4A -y7&4vM:Juv<2NEH}y(+` i*mmNN'*(-CG/S؟Zp^4;?)lxvEI }nϙZcZ#LЬ=`>LR7US9yqN4ShimGE?{U8E?hYUnS -z+GhJrVZr<~>徟kZ8J#T4 -0ƨzSwxUY̬UgnT Q>V7OU?Y7t8P::<@ݪq={\ ='| /im]De<$Q"8:)G'ޢ7:,E{#ң4 -(szxE}h)E8U QaIc*˟#M`A֜ -hLSBbhQt}TF2vNU;G*VjnLKSby:BE$Iz'8)FuQTGR:@v`o'Tbk՟(AT'*5_D)~7TaJSޯ4ߵWWJGSvw!;htlUQ1F!TT;3ኘcGFydLUT^OD])PS̕f²0p7hǿΊXG2YJST=#T P5YۢbYY44r4cO/pP*Q}< >S٫:Z#~JV\x7?|L2ǪǪqJ;v*+q>_VӧU/EbIA5t{V֏DdqG+SOE$'諎dÚBz<<3Vg-MZ]{+RT$q<|Fޠˊ?aV`V#oo/;ށ@A>ϊmV2:Jy]7w'ySi>!{F3 ,"R$S/ NA y{w-qR+&~iK1OvtR'zGS='DTGT>Jw?:|JOrܬEQxѯ*7y -+꣯QJApGAV+ɩ$Sk_SbN(#ǵhU;o*bq. -6'rRP +ﻆIybҧ7wp*'ygRӭEÎ:+7wc'Uz$VNx*N(z輨ΪR -h`LjaEC?s.uQs+y+g\ޝ^~TߥO$~tV^RlGQ~UF^e26ӆ$栏Ez(hPM:WVqJIÓYRRR}Ήq;qDR -yk9Ny9IDC --wz;BݑEuڕj:gVwuZPedqN.ʱ2\چw-ƙo܈ 8_*eH NCd۪KRiiS -EhǢ>{^#$kWz>i(/{kC˵Q1Y³5qm~$PwEgf?ң&z&  4G_ɑo4s㐜;5SU0RqLzUFsD)zB|F>`mX٪G47- ? vލw앵%$kNJm[e*"=džq'H+̨Bha=Oh?*/LyT'Ue ->UލR}JP9{~AGJ&UDW8e/R*RtG pV&wjجLn=PU<]Y* .#$;y?j8J6/wΈU4Q,Q%{^\qدBȼ/#/h.ŨNYSOf+CtV #lj.Bok5iyꀯUZ7{rRPħ7U8Q7c7bU⯫Fu(VCmr -j(UA)\0Pgj -Y1̭hpPG=&Eb(]Tnx,85}<6,D -TLJcGCQFZ_1V3W+S*VPZ=-]dZ|:cTאӚwAޚ׏yh޴S}EJ>bS)JA' U򨾕 QA_@*Gc׷Q*潛1Fk[ -1Yݼ)٪{_&_M2y[j;[G T^(}B)F?!a -$ -ܤ?2SO֏7S3J;Uh.#]ƒ5kmyKJƥǐVG%%lB(3x;B^Ӵ_MsO1vV^7ԬVq# . :} +y"QXY³S*Ӑi2?MUEDzO H#R63{¥_%=Vg r w [8".&ȣw#&cħw&H9-*/7Ѝ?P4! -ԖEz xn*RvWQhv"LWSئS)|1lVKU׸?w* -joT*I(pꙏ5-1HOwU!Z9<œHFrsM::mܚŚuGMHMw*Э5h+Oًy+BJv -q)Ɖi[ǻnj2Ny'8ppOuy㗏~ɥS]:T|vwvwkARiȒm(1 Go+l;B*؟eRw)S4$.O =5E/R#>炭Ə5sC ׉;׎aE ԨCB~7ud*H>8Ԕ:)4 -|.h*!ARxef5%4|1z(JC+')RU#Dv'&(v#!WTê7]Oj-sDK9?2LV^ꅃ Jx-ZDBthNꬂGJ -QpWFk<ʕo0㒽+ǂMf>f'iQD0Yƪ>eg2Tߏ㰑h`w(&;JtW^'|$~!urͭVM M)פ]oSiVttpT틈%[chWnr*UOW 1ªZ#;*׫QH+*'J)Ɖz#'QЪ08sVv)6Y -MCjeAXit]{x?($&cD/DDsq|^f FtP~O*,1ϻD0JԨj(ރfI#1LP6w][6{.֋xD$kJsٽU&Ĭ>J(T -V1c'U|X̅0*!@ -Nx^}x՟骳*mz6b;$N9)̤}oHOCP%pyqC1z*A݊Yd=zᵽ -c  *]J\S9潜2z<ח:4p5 #Gvx"zU0b(MO| -QEZqja_PT#)ziO ^Wj@,d9Zc<):$}IRJ+ԯO~ -5]UgjSpJS(S?F~DMPV;P TMP~G~7U'^0@GtTTqS3U35w(( {TêaGT^6](VIJ}Yѥѣ(?:{djF%W~m(O >4l -[GʭJ ^j'̕)T˷{Vp8k&I+34L Z+5?iQT2v k88rA1v -Ҫ^B裨8sٸҹu -"wvEѻ)]{;pﮫ/TLE)2ʠj90m!O^(!}Ff;?pQihQ6`S5KU϶sQ8y/uVXP>:vnoD ٸ2UʭOq6gD~쀥C5SNA5!Ч52v+½n|aO^ꋫd4PM)u*y)٪8vO+h#qqUYJmM00̀6{4vB%&4󢌇r0krvȋ˒m*pQ_i»annI5_R3=現 |A LH-ohAµHG@#<]hwrN -F5;T<街EgEe}yଞԯS1z+TyU tL <@FRF_ pJ{wjvj!ET^ETC{k9]&A6M\:_SWR*L:ԍ<.jxwb^T`v,Hy4a#};2>F-+I/ӅAoؖRScuZ~դaصBˢIZQiTTӃ7@NWܬUTqf!Jf=6xSꤡH8[5h)0$u*Rn@y&Dj_D\ToQFwDtRJS׷9/P TDo#6og0R)55Js셒c;اr*P+ 8VYy(Bm6`[UCAŊUf -* ?iA(}UR7kʩsLZzX1y$l$^Rp;G5i{%#E1.qS1;55p6Ki8Bu+xq_p{ܡWt<#JN 2UeΊ0+57rzҠp BOA]IwvcQ;Em:F;n:<դW|cm<}rAy&޳!qێh +T)#RwO5u!Rhʴ}eL>b~AJvh2@_7aQc^.Vs=Sڵީ1M@6cPx`nT#*2:4#-(@pQ})@SẠ^a^X PxozR3U+RVs$2DOQW8ݼ -gjEA{{ʿWOE{{ƴM7Z#5Upj'Ǫ5nDED UTLZ=BxrѪ\M: NZ#ŠƩZF4^O,V?PVϨ+Aq|nG"k 5_kN8WcS9"a#S)ƊoE#=FjUԩz U8 TS4DQZZ֊+<ԭ>{Nvp+@Z+@Kb\G$usFxkۋFУC{C J/PdͥXf!V8 -_{֩#0] T{moU{PjU9(QkIq>*V\B(ڐ+h(TE)OqL:|Dޞ#Ԯ&"(EDXWmEsO,NGoW21L_2H =nZE q -@YmܪP%b DӞ0W ? vo 2%jKiT TԴ-s8PUmZ+iOo &\xOm:Z<I۩S{ӚWUhf\Vj,ZYUrRқOt hZ)qiZJt*g7+C"TU 1pn䭣VM -z+Mݦ$ZS% h i"8+;4Vvh@mڦ]`AĩMP9;ĖN4RuP늳E G`T NT<'Y}jW'4*-PzZT@Ae,Q4gm -`juܬ&.ZN$&J<Ӎ[Z]Y^a qUfG]qm7+#Y9+ ڦ]<6欣PenoXWv7%IN%H !I6HD' S=E\xJڔéN1Y){7BUjhh嵁T#DΔV_@ƻaהd"'cSB iYƪ5Vqzn-ÙA W -5E|yd)Qk2 Z1Z's%C5UURIExG8QBxiBE{}>de8jևsG!]UހjV5Sɪs0(&y*4Ξ#) ܉=vq܀hLkGAҞ̼?2U aU0@^W*jʵ}e[O>4*4V h'`G$kd+J2PCOi5UsC^ -Q/rT YIo 1W*rLa*!ܔDk}SP -ZPcDMj RTѿurVR_.uV S9L+ԯOy#y5v0OMV{V@<;^4Ni*vRZOSGlޅJBl SHOTNP TCJ{lըЧcvSx`O ǂscoB&PO -û(W5F9m»uw~ۮ8ԣb\4ߒ{\9vIΘo*VיRpަjaOP2DӞ!GՑ@uz9'qOx$"ٙiL!5 Pu՞'aTޅ;Lz7Jemğd#t U*T8g"S;q%>?aA Cxq@P?9?1Ugp\>ϙ -`Vvh/*ѼZ7=r1e1M{$$&n֡Ztn4^ުCEzG|_ʴQڦLq%Yۇ"wmJLF[8 Ә/j;=JQK_=-UTE(g -h<6pWMpRPpIZ|??^\#5ÌG& Sb_dO:&14E!R;eGwP梻 / -{T.<jˏꪀjn+co @"QRP!"<]~MWh*(\>E A.o+ 軚NϲF(;?iL)۪7SU -RRBq'PӪ|ʔpqNޥx Sh_iʴL@.<!)tQ;Ey/I_ܨ%EOQQ]+o9C,@^Y~-E+y.8|c2ETWzxۛTWuOsw<_=]ڔeZGUjT -֛֭9 -{Q7WK^MoDZr ΧDBh=Tdt*2g]D QһVWjNNF3EtqQv@:@ L ;A<^+xH5R U?8kAqS.%8Zٮ»j()ߢ*Iq4ߴjwjZ7*sYԮKI?Yډ4ࣩ4Ck(iF8&ӽD{]ZS]M;^*X:VM.BV_T*SNNלFI}2ODhM{r#p92'-({RSSƪ3P(FEj1VU9QLUьtj5'މTԩ8St$EU -# -h_ĦT:M겊nP3~i>_ &+=p4ߜi@TV V-F_58HHcUxpPJԧRQwwB䤾߽e׌1Wq@<_v*w(C {Fށ+-Gq*ɮUQ 7СiW-x37s:]ƪV%iU|m2`BM$ _nG:(PɁnY4Sf@(̬YV?8Y5ƘUY?Uwժ;*@]PW{4_AV›ܨWS,a^_oi"QJ<?YOάqJÎ؄\|YYwUc?7Z'TJl(g*UP@z5Z4VnO+TeDTA%/r'ޞ9RF;Uj;5RIҭVVE5%P5籵 -@GHOU*ip5ׯŸ"|'ȋYuȨDuB Ve!P}2;~t% -E { i~EwE<œE{3}hy='s;t*֊V5mpw3?>;q;նU%m[cV0T(۩]U++[5 z+9YVOl/W,k(y2Տ -)%S mJRIi\FEObfWESp+US -V7 +Z(\7+3P1Qju<7ƪh;.vNC[}꺻K$>JZ-+ѧeEaV^eYn}=wVKO3Eg zt :DZԅ,#D -a/74?]w9S ފG&JcB)BAk7QJBF*O5sN܂JX'$mJHjgjyou!4%DO4j)EFj ;A}kpw -SH4z3oBcK֛tVyV9<ՌꬣQ<GE}%@.O|SU>$G';=Y]Q61or?8p㱷Uff6HwCg+۸#,N)8*8=sM0m`V9ߩZZYi\M RUQrP҅)v׆(8oYTB5U53z* 94Ҡ -]nkkJq>KȣCTh74mЫ@ʴ}e9#L;EAܭ-o+GҭJ+UG.@2זƁO!'ׂګܛU uJ*w -%`Dhp*~갲袀4IYE?MS.;xs׽^ʯҁ#?ss!k}*ՇO:Q6x83 {T -Mv⬪0+E:+A*ST_z^JrϢ͢LOVg7pTͧDꝕ|NƊH;ZF&T?IU>+D&#pU7'b5;5Ok=*T=校Z?\OU4Q17P@w|0âsn W0+J8T,\s;M q?:Z~?YV)px@S5Z4STpbR*_´+ԯSچDgPUSh ׂ6jMjߕYiaJ()&MNqNCO?콢p7tsYWN:#NvƧ'DWy*/RӻnMZT-=BgC*ろ6Z)VP!ܦlo[kr$A0%&h;<4wԾ}ǚm+J~Wku,TUܢ/VCTj@ -UJuO2#L*a>J2*y'Ej7+I+FW8EDtZGKRTj6 kUQS@V] -x?4歑["d20־,Wr:)Ίg"I<|p񂍧FКF60[Ǹfvt NxCVRqQ3w0և%>=qOXOw;rǪtz( E* ;#(L-st;#vM[]Lk\*USX$!F5Eg3o *Ho =T]?3iwas~Z!YtӲQk䇆(}T?E`ޤ+c~ei*WQϢ;?ڧ)OyP]xA2O*SR#_ڍ#')hRHMرPeY դj6D v@D])|N[M ZfGZjJ^|isMhE饁٭juNq#*|(w(ZѮn\6g T L`9e8VY٢hn;ZDNLM -Q~>]DGo2FWn[|CGҭ2)|mM=IDTeFpRj=䇻ƘuL:JԦb9K*;L(j`/HSҼ{11gJzU$>U'/3/#ӟ!j$k{ՎbgW+9q =U؇<_RޛX(8$$q4VXIKCId k'%#.Ol5%SوЄQ4 -GXAB&><UUF1P7D1ۖe'la:&֙IĔj{\p]ÓG};[b9'Q<'wo;ifvkI5܍1} -}b'.C2P]P6MBQBp'k`<܊UT.&&A(ZGPjZuVg;umg+ĊSi[=S4>%Фy< D"(L}S=E69!@*oDU|EgJثO kJ>JQ(m>#kS߳oQr(YmfNjUjUg0$CW^c!W ryLlЧ)NO_בNPmi 4=-…B7~# }hB -ЬW E @uPz?yǴiJMݡ@sk (6#qW:crh -;79[ʴ;Jlo__YHQau7G'Z\ze?:RTp"kXXNAYC(Y<@Uiʉ~InU^1EHS#U===LJ \2齆 }7M#^˰ƝL`?U+2\.ȅ?Jp0VgU^ 51ϧQY~p2*G3B(#pҜ7ϲ(;kB4FxY{OC5O spGM)N 2taV9zk|*EL$WML^j@?+A0j%FaTiZG̭H^T>!3D}52B*Q抵HW?ec$QmJAJ)~_DjvoVLtWRO -x  -IO|IS+[ AP}gN K# -h(QTވ0jSk -Uq݆HF=2w&P~SKjFjs;a{Es*'+Ո?LwȚWiUPy*PNS[1NhEh)Nm.sNJu2 j.CT>CT>04m {67h 2V6gki״3c]ƪnCV+UhM>%<ZLFSR*sUhLJ1\sAIP}CT")Z5a`cVv2#8DښCf6>vKF(NajX:88C5Vj,?%9'Tw^k\iԕ&d6p"Kvjl)Vl -fv -IUMx -5@CԨ}T>@ Q[]@a)r ڦYp8,+#$_Φʖ*r O$fy).sDK028U# -rQ5y!Y+ں+R0'P(~7xS>1*bz!^'x8TMUjBzm)L}0 -5Vf[Ug i+3tVp8"D{۸2jN,JG Xh -ss]$RN[qEOB'qVq -*5jvxqz"}{FꧏUiUiffk`Gͪrw.x4êTgRAw<$V`,&ؒiz"B|J~u/wzoOJ⢾F:qGsTJz);)*W\v$)h8k'}y~G;Sz)]T9)跚GR: EJ}NZ)}UT5PAoU:Gm`hR$j=& z.IVo/U)7?B7@8(Y 1hShE-8{A{H|Y:)ƪS+GԭQO{Nq[Cq*`yn\3x+mp*LZ5wE債)S//M790Qܻ璃EsQ;a;U+;4Vvhs Xvtr&zlgE^h)U&5 -2*w VE6<ԃ^q]ҹR3S- Hi k|rA^,~뷐Cl?iʴP\jUoV*,SÇ-0FNhbZR;Bkliq8wQU:UXV{YiVq4(98Q PIhX|?k5ARUx=}2Cj'(OȚGW֋>À4;cKNziD 1QH';DUُ@?˼GSȦ ܉]'xW% TT`A54'(Nlb+Wl J{OC2TAGF}B#e+u#dSM봾 '=q4I֊f_[)y,ٛӀNu? !=׷UJ6ZkN;@ 9E)ze+ljim?dU( F&m*ՍX=UP^`\1`UmO%?}mݧtdN)&}x^.>v^{r*Ww(VaOԬj5PSfs"Lnu>++SYVqIޭ8y&ѵMW%_{w0Cx(䲮v4!1); %t#i-NM%٧0 kxqMǎ]kcAC .S L@zY?IXh-\y$ɏr2&)+YK_5%XTLoW+LCp=>D*@tO*oT *W+3Q:'?OR?rk!Z:h⃛Oƒc!O+C>MSO}iY[+t"ȜM7ˈQqd {VP7fVUbn)Yf6ٯa+_wV5eVv\+(Vqeg*0;Mӿ-!K4DqQEq=j{lrV1cnЬYZhHaMahBw(mkƁa'>Rq=硪! )UNR\X'4ަT6lAE\M2pJy^nӒ5SSGA41%hc{0j#@ΊlOu@ٻżW?}UK5C}w*vةu!5eiE{ ݯw`vƋЂآb6ZKmw;[dVuV 9ckn3T%jw -P|cUǝd>x(ޮRꭚ5Oh>j7x-W7R=-R`wHR_e_hcoGG{SȕңF6~,ڹF~ThM>/z'<|lu8(LMTj-붝Wȋ.sdAڳi]v4hMbkfmdhneD^!8'Hᵽd480OQnM(JxL'J,7qRJ [l@8Q3zuZi'zAQ5Z3mc EC0?YƪϙvXkZWEeM{ -Pz'Ip鵕R.;VJ,)qzIr= 1qF -dT޽s<׷)δ3|VE?@OVv+2{|ʗJ|zzdhШC0*3z*sAuFY7 <ʋBjm>-JO5?QAU@[?3>JwܬBO507ك4;A+b)DCZkǧ+΁[&ZZ['ZWaMxu}d y& -.#Fnm^i/Wa3;actM2X2cB?{nRW*9JCԦM4괮e~OZ+8Yƪ&Q2=x/ff߇r\͹êaBB`=O ps ~O+CJ$4<µW8[[M'79{i.'*I! U5*wi^kD˴{uU51hb em,$êb(N35R+#P+G@/{>H1j) -[iJJlmU޿^9(uH=F鱭>I>*tRcP9SIHOM9 -Dl T7)+9w4 TqPbpxe1cS)ð Z v6kaW*}*C|%G.oۄxco@Y+@Z_֭* SdV5Ҝ;i>rXw,x#yO<V|LdگyK$ʮl=*bB2M r9皳9^iT4^;(|oU+5R3.(B0ZmduT;>]ƌ(&DExw{%PlE`֬`11m(8P9yjp - -9[_w4-ƯSx{W% 7x9\Ԩ)˰vvAY⾘\]<nTGRkD˴4Cq;sY)N]J֪kײ@2N.;%v9#^Q G;gAFqC~NxklYF&#c~A] \ե譯VSU5|y(UGwʟʟU~UU_w -?R4êmpXE cEFU " &a%Myh%JЫDکeH$YMf֢73'I/L:Ϊis_g+ZLp-ʩ -n=kNc.<ՑBE8 -{%YTnj) -镧W?)J׍vVkRB Z}TnHE#Ԓ'?#A Qէ1UcXgh -79&oq -v'[2 ;0}nhGhIUjoJe<?T"Ut@?J=p94*&9{ѩ-QqE 9éPy1%DړQ -ʎIDz+cP燏98Z]_™wrSQƽG$ -5 9;B*y -6*sM& Ԩ}JgjW,*Zxn)pԠZ7m+0"+ĕ?U)n*1hS+Oҭ܏ =m -&hvB< ZʛЧTVPyǵ+dګ]VV#2(^kΟAʪ"~"65 -) _=֎Ή1PT~D, -V%|\TT))gL}UEw{Ȫ0 - -9 aw=F' -4-:P9YUGt = F xR7p<_4s<+i HxW0*9ޅcxÒȬR 'm*2׹7E7V&ӪyGwǖҏ`xOn¾DO-4ޭLVcUM~=L.UPzgj\`l~@mAw${1ڌ]G!J_Dw:&=6EA@S+TǠۖwBf"UZIPPS;2 ue;O:C>dC54?)C˶ -Gbzmñbck}l^-TMhd} ƶ[ΊU[+l[ծU#b7̭תJ<ծ_4Gȋ%(Ew`TkQ6'-QB4 kjkEuSE,A`1^#q\܏T|20xv9JԨT>:;wUP3EgEgD Sbh䦾 NRީ=SiTG ORo)?f= Rɪԅluy9Ju>iD(ΥD*Zly+D.i춵4TTq;#ŝVVj,LEW.^pNA{{,΅Jt)ODp?/PTU-U V_4qFԝowBRhB'^u1;{VU+BOo'UV+KUh~wpl$Q=Br2ޠւP4;kpBO'bQ;]qcɨA9hyΘ'H8n(?T]Vwvu#$,YE88R0Z Vwv{T8C5Vim4ġ5q.77 o HvJzrSk+(ЅgQ)ZfeeTLUۊvA>*-Qy|R1ABUׂbnRiʋ[uLnȢwȢYݚv~`YRqSt%ZT׹m}1Vօnj+{tV^OHދe;U5u\4Vjm;*ƬXUT ݆_z8@?gmxD@k(E_W -xEJl}M7%1wb P5@?gfPv<Ir$owQvҬPӡWڦr#jOTAd"Ga=LTꧏTnJSzòaGuߐX7 %g=Si60Sz)/mopͲx;ݩk4R -)]]v|劽z+W\軵5sJ!隊w#RE.$SI=z#"wt}ݭ2FIV|fn,{%DBhM 2*=T,ZYumЭDj|}E>5MǑ -_%f#Dav7XzTfZ >EwcUAA"=.9iBX_ꬎYI&]>+j>7  2"9*yvNeثՌ'ԬtBbb#opDH-+.U$ V:'Tx[Y v/J?<ψOʪ~d^Be -LgTLꃵEnM9+ڦΫ?2QI)2sOX *Bm$)K)Mk. =qKݾS:@uuR54ĩN3M)ڥX7+:!ЧVq99 -fNLxgf==`;F/!8'{OyuqJ'w)Zh=';HwN>Kܚ@W+ފ -}MtJ)QnzZ9mih:PGNVvh`=ӱ=W^zsiϲ<&OkٖrNLꍶƎJl?*Z/r]楿{ot@ߖтwf -0f&׵uqS6e=Qqp,*C5S7R^0ِAq{a/=h`uz4NVFjРm:evJZrk5S sy-Z*ii:R`6+x4bwB6eؐ8pQd'LDjKFM } qhNP+뜊vm)R=eǵJLE(&E.ZM1Y%Ȭr+V#ᵱ!LmR*}2.״ c:;*]er1R}AZ*̂8m}㻦Hpݴ6CyT -fЫEGN̮w-ݗU=ӟn״槏Uj4hrosj3TNhw4TuB -_E!<ȩ ;n-Q<OU*@|Xc{?7Z\HC3 sOzsӞĊf0V;k;*Gtq1x^w_EtM -+4jQx Kxف)k]AKWLi -lwR vuLyr`w5g)P}Y~K]rʐQ<5?Ԛ_C>p{@w):cT^j=SRo2\9_})OVKvޥ8~-"hw"}$Ql 8!N)VhBGTWzzl*TفsiTKuL:Ϊ3N&qf*Iw=i;A-OxnmkPVG!Vbwk;0*FIo R[w' -%9Rf>,:`& -,H;UET^ip*V5hoJϰCLtOqOv؄9܂N*sDgj++'VOBQ1Y:v8!@r^ꍔ=|F'˜%wM1#mpM:JKt -P3DG%tOzɢZWvg7a kil -[T۔›ZqE7{TaSlx<|Բj5RaLv}j4ǚn {bqcSBcEvGehS5C5N7UF~ EOWb2e½y h.<ղ[ߩZfI)l7ޛ"l7OV -w3ZZtQzdwE(RSS3Tv9(AL~?r8Ξvec -+@0Un.^ۧ2=Sk>Ugv+,gS5p8WFGU.Fڧ;7>7pQ&KӌT-D,Qs^q۱B*ǟn+橴/V*60&}ciA Q%OFYx]C ^uvͅ8cW=ViUd0 465v=xʭ9,F hf;rSK:|m;Rx襠西#S4%!FuQ"qA4B`zui.d3ak.e`ǴT`F:'ʟOjS#QċDzx4yC5V -T[EnYmFNmQ[ᶂΦ%Ph=?:{3r_Q>B?ryMo4}wT+CW{})]8^zNX7 N0*+'~V:^0P*m<7.3G^5_cU0nEIާ(lv{#qۈUdey⻯ᣚe'Us6@2<ա*_2{E\VOIi5n`xт#Q~]+ƝDrʹ)<ӃߺꞗwWr0;rD5DपYΪ;/+1EBӂtQ7D -!]G]ՖJ,SfSkZmȅ tP3EtM&)]UxW5VE%Y&n>An%f ,P7(ݓi Lw+!G=.$)ܥjiT(v\SR(6x+OX UgL&? GQQuPJe+UZn 轪b]ܦIHNjU=Tsm4STJB|&FKpcEcXdV9U8d1cE;?y3J54Wa2Ipm;xO'tL#KIh~Z):Xn]a -4(Egn!)R5ޅISGB?E -Lu@QiDjT4Sq3WG5#uR3U35S3TGSzj;٢U|ʮa%j&)^*@ CVg?c){[=iW)zTn?ïF8thBo8Q6&*-oAsRJG)|:5]˰K |_l7y=3X>W -@#eq5aNR+CՀ5bZ;ޭ-jyC\ObO4êTGR*:(2W -l WH岾HsG^*epb62J29 -N{a -5RΪJvגs@8*T$"f0!2pCCEuQSoU@!@,=9l;PW#D4Q(&|!܎#QSlSl:l?*#8=E>'Ȭ$LG'6/ͯ;F9!Ƽ {irXXUkp :'Wp*YuR˪]SH{%nv{0ܭr꥓T`mqᶸI3{!g`K 6:n0uS؝qXr Mdv){te;6OrLDz(cSk_¥j^o)OC~^ԂDJ=T_g`k%C\gexlz4a\ToE+R;Ejp›rd9VO7qlL8`(GJ_& 2;|>̫V[_h;AIuLШƉFiUiPŸAZ_[zRx֜F -)R4حzǽLp'hȴi7u< <' M^* -װ BLFz~m Wh&O=7dtIiGT_NUO#JQs^;3O>(4a%h+<@2όg;duXq䋁F׆hq^۟ @<{1qڨgk~0kq1wx0[ր7vi^hS1TsjIkLzMr x*c欎XOԠ,؎7 ̫)u>vև*)PaYO̬Q)%;<MTSމ<e?24*Ƭqڙsر; &A(Qa.[OU!ْ:)^zC -TWfEET>X* Z(Ɗ1&N<l #ZyL2P4OTB:#Q]6՞J}JuPR;YY(> ^wjoʡnˮD;sO0PRk]96Aty&I*(1B˻YYDo0&'4j[ܨۚjBZY+K5RD0]Z"E9+DƝ@(Wvɢ2hvF܊uӿ'kcx';E#h%c:V_8TaJKZ~~[OkM^B LljۑWaԨJ&[ZT5JZz?QSWW@ -=S.?o)OS;2\}hQ\VJ|¶+a>JEh8mcVVU5i5Q?PAGwϳ-(wF^Mwu*_ڬފZ()TުK#i5iEZ~GRʐ] -4Ӫc`)څaP5BGb:=PBB;챵fh -6ڧէ}hfhhC%hNEdhRעTI -D!jE!SԎAeP ?MNJ#SڈDvlAA6 D"ڤnVj)TD])QDPTMA+')RHQ0D֍D{d <]999wDa0sLiMh*!E0hP7UQ([ j0j`M +"4D'1S1S1R)RU+R;T|FA63G1N25^ - OJpR Y"Gq( !!8' S6vڧ -mΉhzcOP VqUD ЈN -R*GjSν>jQ5:G‘bCFшA 8'=H;5SU;5SNDhtE+NP@VqUZbc \+)=˜~W~WvNWhm jR% JST! J&8@NE!O:g1yv65D)٪ڧ -oE/{W^ר\:?@5P ShR)ܦ~g~W~Ģrgnh Pc-xE=LTI_$UBZfVjUA>6 jfڥOMzB R;TI}C,!1AQaq 0@P`p?!DP^~vJ819~|Ɯ;i!ڟE')&9RcgpA29a?ۂi^v}iaBaF=.0"~?X?L_p')?ƌGgs87𕿑?b'ZkG})*_u|0^%B{'aJrigs> g29^?~L"Z|Z{n?l[ÎA)(Q -ڷ,0S%TV5xU6Zx4 Qo9F #._hk<3k)7b -])D!vYPcN z51ŹzKt)fT&?KSKe/Iel9feZr(o r-\ۛ.AGm2&c7뎫:Ρ uAFV%1VZ2G(C q{x*wƂ:|.(!E ji}S%y)Z 3ipjk˵Lx3cE_4)Nϴod_/d:h/dӤ{A_%fSg͚;aʯdjmSXEw/4ԧC9ݗ:),0v՟ք㱀s (%OgQ -u΢tnL<)3.c5-sLk?bI58 ~[-'s|W-.\[--sδ'Ru{Qn$u< 'ZvBAȝ"a8} [KtڗN:$ggcoR<-hMm秤Va!#Z%iwEߕ?g݊h^IˉI~ ϟٛ-1~#({n )8b _:r~?|ȊoS>;^?H.o?ϝ%:{T%<-t"53M> Ex ^<+Ub/<0WaXZ*b -ѯY*hsj];yNtC-bQYupm,n\*虣{٢|u'= 5_!!& &p4SԿ>xDIhr"]tKy˗c٬O"平vrY'_/zzKc.s5%M33HYw;dtO(=' ?OK<Alt+b#W?c3ڼgd?XJ+lVKvd~I YH8;u'? qQ f5'_cN9~%~ys?EKb1ly*SLz? %Qߴ'+ϴF:io h~mHΝVu7Bj}cRrS=d~y~XO~-}`nNXu O^[3/|ϕ -( :oa^f~{ -&'βuz'Q: o՝ge%᱘ ,`#(o*$#R'^a=& Z[uX ̝t(3pU_,8[q> +Rp<_~?ǔ~ ŏ? xrx<|ox~ -rncrE#xϟ+xW\/~+x_o Nǒyįʟ|l,ӍTgOrSKTǐP'!zۤ9Jc:Q^e -U8I`'-tGkHV/D sg^*_ r>#>[_ =yr<1y+x'ヷ - |H&5>3112Ǥ}w; B / -y:QfR=,7o/.q|17%E)v%|e )W@ki5r]`hi/r\NM^<*bQ)Wzs݈W@Xԯ J3g0{Μy Ϗ/I|zprJ2ˊHpφ\i1Yaa ;Q?_I^Jm261(J6̹ɄyY ZBn#ޘfjUJ˟e\U´OXc18)pq/ɚ%.֡&)lGX&EC6h8BV ~M%CyYK5 ׍awk$r7IRB -^ QTI;d\KDR>٫(Tc\/J\A|u#p4R:Gv;ȸpg6]Ǡ2Ko,kj@!;FU9iTa%[bwW17Vr -;{CE 8mp:^:T2l W .^Qm[ʼn50!q@aguolciV~R[r,ơ]7oS˟Wq-o92,mֈ"J_j-X0eR~ert$ћ#3;I Zr!Sh :KZSjMs%(_0mRҶ‘&'&c -9h|󗤡h].;Hr'U+Ht⾾5v'5Z_D<pzJ 7cPiY˩n.!L7 jS$ E\-W^,S -, ^ *?3׆D\@305>wbQlL^cf_qoAWۡy.WBuM3qXƥ娘)&rO:*sR׽I8Na/hw͂b)]wri ׬@%V=%F_(f YKc C{B.xTS -J'=fZ($h!6GWòUKf?_[1/(ҥ̫jxgt1`dVv@Щ_f^v4|`xRv8 (_D S)֩6NnqmM A.!H7F-*j2yg.t.993l(1^n2 mռ^V:`R5GqAZw\R6kiżSՃɠO)^IIyWiTρ<7-3f\iC~z-(("991Hnҳv5%*K35+ 95S+gIR(Yj>!A:xX1;WG6HnڬsieAp_yG)І̮ӸY)FjGQ9~N>:@ehgAĖwA -UUSg(BIPhe|p9Z`)M@FƎ˴ex[ n6e[>N?>N?6)t _Xmb]9ӝt.*iǎQ3g߄?W5JJh,z&Vc;J8 -M&:vpE:E> bJ!ў|]JDMg Dab!!S5*_i>䁗[k CZN:S;ඤSmbjq.Ĥ/Moׂ牿 -`-¨YiEO'+`t{ӋP' YLv%`s.S&I乨Ф|ozBzFppprMSZL+Ej'9H^ t7^g]\W2o2ܦ|[5Y [K>2{Z\e[uu_.,6&_7fŵ,b>zp×cQzSIE%) wNز7Gg4%n俬WAbѵSFdsϗ{[;\ʿ3{?i_sgyn7=v%p5LӬt^]0序%oN]>,/Hyg`hf\=HlM .]]fj+o۞ Gr19ɣFO r _Rsi z"u1 }H^̍C <36_2)nG\࿸ekQMgʸ -:+0!ނ}SKǺ0xp\vf)9t©S ֘lux߾/,`hoR4D5&~i_Oz ܚ9_q/'*i~B |DO[/y_C:us]h&8かݜƵ4ӹ[1U Wn"G5%7՗9=P^"TBMGHp#,Ȧs D %g5 nƦ=hFy6PO|DLtD.Xg#AЖg#deÜ""\^k/ǨmhxmWBZki-V5;9jx4p8iZKU)z0#5p EY(f^W ϫ0` a̧iM:"`ij^U_Jrs KbJn''eH>_P2ק`g)(Qű}fzw̧oqG&?? F.RkbZ7Ӆy'ZBmNU%_K-bK!f%tEO=n u2:Q2855zd^68qW܋}/h AUAL LN^ݯ4E/m-0,gה QeˀNGUsoWf1t1;)ŤӞ ~mUKS ~>T89@}q -uˮV3s_1psΤќ(s4PMJz{O&(/|<3f׋F.&sD@9x/ȫ Q}& -s].I>`of?y-%$^!j|'=`YPal?d/5eM'G;RHvo=@!, @]P#׼a[YjG#C[oU塗\AC;w: U W 6`5^zuj5-\}Ԙ E46ބսW7&s[Vb _KS f/"eIMO7Ћx =h[> QE-n*GegQ3E:cͰHhu}zf0:/SFvt$:6]7d!ɲ{k <)yPÚG H'(kǯ~i'A8;SU-/2wlFjR - 7_dq?p 4.wWGv_Vڒ<X'3S:r(_^Ŀ/d^\X~Q T{E '(QBuY!7&i֛ V$gPaEH5!ό ,tcw<$٥iũ&Hv]^>{SUؠz={ -CñẎ.t[e;Jo2Z4|x[ q%);^]Ffsm+ne8偼%#I8J9k$}X2Wp/f#bm8oܵ\ex@q>SU~U)º|.?S6x*j31m/Ù$40F?S8?hy'\ʂ37ڏNhnh9ZRY]ʈE|&F8$\Jt\,ݬ(W4`F2f 1PuW!ޜ?140_~S[HچoփJNX7_$[خU /2Q{wXv4pNzT_K(DNT VpTMSFxT[As6CR訪%#F@!B*3T MU׌sKTI^|8>:Ҩ2,nDpyO}u| (i -NۙPJͯu&"22rDө -oj(4Y#^üԎ !\^rCHjMMk; 3ޣUPa<.E`U8PS\GWy^C*kdK%+~d."6j&6]~/p cٰ1aZ]*EMm-m.P\wNmn ٭Pih&]x=B=`20&EÎ&V%Fhz;ܱͨa`0.2Q Aw3FXԳNN}J,US, m7_-}幻u>kF7l::{yԘj oCXx/[G\3Wx9u&O[DʜIK$a^(=s-4 1eT陇5% o暉Fb2T%UP*úrz”-CʷoK}~ CfH{M8:R[ QSԩ4ע0K3.D iַG&=J'mo/jZU~]{nsjǖl 3)ԍT7-%pn5TvC9$B߶%.KIvBL@SJ^%@ -u[MTZ09jP@d;ưA_~E|PQ<^]فv;0j8WۚKRwzC]#b:D({ [J'fԚ&X/_I~xE郂XRptw&_^$) sȹbmO#l  -~uy?q6E|xx<@7uP\(U@6b2\U{Q% -Ҹ |d|6wՇ[2n0 -5Y`"vE7Kd[m|㢽ۺx/G.L%fm2vS)7rf\<Ŗ\ K}#tV <8)̯ydV͕X91b{Jde沼NoEN^ -э}m[Pv8?fe3O 3x QtM\ANI+L,_Hިi7ڀsMB9&HkqAkFj覓 OC=a Jl!0% |cWTkQovv#/jUk<:i>@\/IGfSOCs9 )3yRu{;A5LBpUzef; qS(,6DML%Q?DO'H=}N x&wHwbkl]URKsdpݿC +R\nPz1f,¸Z}A:Qn|sb15ZPiJr'NI }/) ǩ|9] rzr~  Z"JQ-|Tz] j+_uݒdF/a9 ha:s97q ܎77Ȩh6n4%K8x(g51)6Awy믩"YAWSع2g#gԖ@p(~q@v,bu\|)xO3Vf-: {c枱T[^.4Nݺ>S -1vE}JL_Pm)A_%59Dwf7c> B i)OD;p{m`%|y7Ws]c{3;>b]ݐü:|F}% -k78/KQYuy:񯏯xi/ O~OգF U#39c W%g -du_dy&avmSuTͼaTv5pFN|xHDVqDo:~ -<ʯe9戟Uq}:bE~+Y 7Kj\2kb!X=5tʾ oj`7ZPW&:@W|A'CdVza^3]#&yk 03jptfQxH^rR} mtJ05KvW4CnTx;Y;ϜM{[";AP{?DI1lp3iI~2NKv/h_i昶/'?Ȣ!`<=[ɨO=[8D~K29oOR-j.!z}ЍgRs%%-_ 6oyQ@h4VXgO˘uKƃ/U u t-a  9D;M='d)s Y錿0t߆#WC -v`f1RkDIך^ftDzr.Z:B| 41k77xCV6Ъ;gWikCKIn -I?*iMcÓ5.qCPW֎Q2o,ޞgJEMP``_'D!¦/LPmה|O;h^DXG+B8W& iU튇r%W;0o2s;vf#|培񺯗DyW'￉7\Ep~9+ȿ ZXL~_T ʚPd%Wuv\ś蚯24}&n* ;Y|[zZn&LP mg0, ȨW .h^XRR.0>%-^?.Rɩ/ /-eW%j k@Ayh,p. -HIiz#7ҥ7(] -͛%Oh 3ZLX+T(ZeZZp=gta[:Ko jc}Sf"SLs*$4\+ -fo#; 3 -g   xB5Zxjg>,1Ua\.J!; 5yhq†s_W~6<Oo'W:nhm_jeRa[VHU-s v!kQSdW)k3yA{yfeoRXKTue~{Lyf`؞m8WQxEzެD2i _^PˠmmAm2SXPnN=2A#IP+4msN$60 .;LZ\EO5T<&g"M3aVy\uK{{;[<}*QZ___CXNLZNt'BtB iYZW -Y^iP -PO;m_(*g UGBZ-nRg"|;F+SH X>7K5Yr=૴h|kީFI[Ɵw} -Ď(&z£ȁGM{yZDfx]^o˒*NabVbc톹ВY? rs.2P/&|`X%ǚ50Wtt>wws'9,E}*ݞM?i,"V+FRn$jmYcݣ;H -q?2W%T [PTY῝\o}dbt9R=nMMB-EYUG1 -ٺMĻbSs/(%/] -ٕ1Q ^ Hw箨t,&C6Ž/R`4< -^'jXGG?CK7!gz=q#G{Um| - wPsBk򘍷ű6g>H :8 hUX4ѿ9'0mZ~.LsBV/ծwBWMtdmʾmQ,F/ -il:xAr:Cikַ|ֈ>ujs|<-$ڰ|VI(ۆ|Do]>_閍}Jy?OOĸ˦vGD~hw"[KҪE*O*ꕯ+È5ԂS_g|.}~>ZPhJriR;'<-r yjB`v\"V#3'KoO &sw}{ZSl^#M&w'+*N) u|x E9OMD /)" yU2ΪDj xp'TTq4@bNԑٚbq-d[w/U^藃p'岞笫A2ݍhy$8 +1K+JS]PD;&W3_OhGP=#hJ -CYڏ'gYW(v;3c +x6b,^G60W6w“z~oI/h.Sgefډϼ+!y%XU -ir~S(>5>Еʏ;= -!@r^O^|O"W~=]u/ -e饔1|Icfg56NtwWfh8lq )[@u{}πX}4x[EBxyx\diQ+C[`ЛkҨp Ī˧x gPwe*xeʾ9,5jb #`v'67๯O#X RWiP%cBF:Ϊb.硎2TJfnw2ЫIR@D:݃԰hY f?Hk8Vc-`ІA`Qu:Ej2CdZߛ|p`WdHramзb'8CF~'ΈoNG-]m߾s;6吇ߊ֞{u{DU5?r/vs)AOT:mH+#3wEta9Fk%}K7_ 3/(p#Hd-n9Hṷ_C+4DۡA(Xhlko}z@#⩤tUÔEɬ=')G/+Ez>] -n%/o=~}Xw/_MʧȖDoH!iMP_ԋ{q7Bi֦:})ϞMTXҬSUOon{NpK]ja!A&;:kM~nv ` ylft9l- 8/)3t=_ѥNMjp_S )ni+ -q~9iMf3y_ELF147&PR5Q1uaE&aHv9نj-׃Ӆ=cT_/CO,fY7t)+oT3 -mbPHA>hD@n,L{%1|U*Im|߂c|c$/A ˼@%`$\LÓJ͗M"ԕ47 wO+~Y#/ V]Osirܿ@`?1@esFf49mW/q_s:e<Nn\&.6Q33+)\iуq1|#YX>K&fZ`Yg\ )I)N<04 u|iC,QÏO"Dcxz^es şpk%[(sq)N5#m}Q~a|8=>_H5_?O' ~?p'U@7p'wpt(}MRA&,}%rsDI'hLk -R)vQB19KWJ㬢67trsAdzBɊ{2XWj:01_:!V -4Z.<^Z֭´ES2%k:ա4j,G+w_8.#F7,k QŨG-^ɥªH:\A\V*rb>{}NLyrٖ&Z;-^ jOJ1c)s:,rʾrw9~iUkr.IϧXTԔ72tSxciNP3*yxvUIwdH/cټRsCART/:O9Ϥ&4!ko2ҏ8 3UwywKG\p{OLk4AGywWuz`yX;v_FhF\x˅q|6Os?>7"GJGx~ M8Nue"c|wC W0uuU -+=F -XK ln~؈׿0:g)Y+TW-M#\r.53LZnW؛ݼޙ^5jxȗEٕMyx90ΆW4˂oMܡDk5XeɾpU"Mt[j!v=1db<݈׾Ow 0*4w3yCOTɔ5>2Yp߈p=_9;P_z%hlQ/xyǓKYL)译ȶ'$+ia/: %dcU#M=}t9SNXTᏌ _xg{/ySV}PyY_Af\ -I6Or&5%Σ3:NfQ2@t&kTB ЊbfeߖŴuu7Q9lSKc^z+6ku;YAFhnΩƬ:sidޅng啀'shrYord^' ~|xQ=#Unڼ(\k~6y$71`(6yK]qS~KXVWTF@bF+VNK' -jD:y{̮Oߘy[On Y /lϑgӟ?qtr}7v"!֛a,Á8MwXE] ^AKG}c==28 4 CA%nCs6?YK>"P6GS?Gmg\$.Ӭ%ҟl2龱OOD NU}ғ^pIן?m6V05Wy+)P1L􇹊ObyhP|#b_ʮ&]ZdN">I]j{"Ai5K긥? {DJ2.i2 3;__ 7KY*^rTzΠb9be>u -pa]pD㧌!n~n\򷁶w#̑ Y=u+"KTcv=?ԅ)7Zk0aC&n?)1 |;xH__UAw~Ө{?o*ktf8;S2';ڒ̬ڼ):J@?$\_Db+]?,`+C^ wb;6<3HC٘31zwAԈ-snK VTeu򙻎W<sN:W5*&(hmx$)Х}ny|C`z tב? \Z_tNV<(6-k7gﴩ5h0<_&Mny,+@#Fhxvy R:.ٝG7qL'KʖiNS ځ&O{isP4ИRp† [eᒊY1: -̈́Rx, RC`D?4.376<(TPcy^̒ HWѽ.* S9ޓPs@V+1+h[Y柛'єWYNN_.[+jlj =bY,[R)u:n4o#9eѯ|h93(3:@S5v!,H'f|UV2h,vXVۣt3; y0B~B Okhu_vׂvrO ^>7,It_A0Ov.h ?KqML7|kb&2^8Y9{]pk>W,FEC^(QbrK6D~~%ZBᅵιFMBgQ~fAC&oǢzP5,Ʉ$j? (0u0|uv4~i°4V!Z(a -l7o ׳޿R \@FUs.GVry@Y(h>dnXD$7VcR5+-Oع8p60ӟi~.iњ淥X]/q{3$4XjZb[KolZCi}8ԯb="7NR&7]G\+w2rV-vVL3+\;:l>mڨ(8(\34_Ɋ/_.<Àxɳy6Onϴ ˴NwCnJQɝ~ [ rlǃ5[C ZBWd}]:e* Ew[* srJzk%tc ߄vCS;OZ+uT,>ɓgiSm peYg!O\!npBѻ_,e]u V4hl_"K3 . [wʠ;ۄ{ x_`uBLئi*T.~?%/dk\;v s? hx~/Wt>Xş%I|㿘hA-pQN Y/$Ε~WoFePy'.^!!NjRw'Ƽ7ċC)z2'R/)f $aZlqYy{q%rx(m?Okp/'Uz'_쎣>zI駣Γ:?|̧Åh'Z;Ghbtuj0"&sa 5"n !>-`ΦX>xn/kFw0eFb`şK8tvpF v(>7ֆsKMuUJSƼu1 -@CAcfeENE םm1Ǽa/̰JDr1^; -XKi;5߱\Na]= -eũTׂg:b`la?bWu}?y9cpt -jn),|C&^Q -N̴6?o&{LU2Mx߇Oi+8\6t͆x|K-;Z/5_-Y}ٚ:>CxxCyJ?, {t}{G>U xq+5 wb >EqKXn} _Ho|kZwg .ar0Ņ؀[<|Uu;ARVmW-\O'X|m!yeÌMDzQs?W~&O'W+l?7wׁN6 -̖=y -?O q6:N<(ji A\S1kݬ x~$fg-I,tnNEd [8QTu} j{'"ǖ'>o'jJlNKN߱J<XXݷKsoйՇ)*w‚ʁ5G9p3?>o?}'YV<3?T82} Yޟ~Lq~UBsVhijȇ -GC^}YYhhAo{!.oPѥ6:2FYݐ(^͹&݃\J>? =f0" W)*W§Ɗ(xEFX0FVa:dհ[Trh˨yt3Z13^AAJ|^4$Iy *V-kxo(tWPуtuw|o;fwDԨM2봡a8{yxfXyJHkz 12O5G E/L |-S8>.YlsR~/w}1&yI3쯴eL(~ 9oBeOj;sgý[sѶ=^uQuzxӥ*ORzjXE_ϑ\kɿNe!7xfy}}~x4&yڿ?)l}RWK n{Ě/YU?cA~$өs%xcZj_R F,Rߜ4P)؋=^>7Hjaw 2&@8ǃٽ@1'Dfy|B7#󙫨{S bsJ]8X]}RpY(=s8NjVr,t.=~τd"R"ˣ+.woXNH]p t،|*k t* lRe#U=@FQ*g ӧ(*~; c㟌?^<=7d<_N"c׍1GO ?-G~tJ3cF!T)aqEr7xj+hX3H_(ص&!+ y.c 7$w+`eCΌp__?MzTϠ_&1XoCS4YrR$X9+_q~8\~; 'o7a(_[z#׾S|H8>E.[mt؝Nz)?Пҕ#B>8J|k6J!v|`tGk[<P_8鵌%3 ]hm˭)w$iGi #{0~9g)_fZ%L2mu>[pހXxlPKk/`HG,GW7&61J),Û+É,]cm TsA-0fPܴssD0` qCy{h36t@+c -Ii] R#%zLu4?; .]î,8\X@K>rЖ`u*m>|_%m=]e![,.;9R\\hׂ3kzZ)У֪)X!Oz%<^5.}j&U' -?9/+nֱin?8#] abWywIr2" ;<s [05<Eۅ9kZ:q`OI*,MAv{|0hϬ:( ?ߤzd6E}UyCNXl[[{K'IlbpUg 1X8l6 -Ng1"N+Huʕǘks࿌<0ו8?׍gSWXiO'S N9c?:p7}% -6s'7DOm bE īZ`oiq* ; Pf?yC%^wsɛͅ#'h<\kLcr :Xm'S)v(Z T9}kٍVEƺ4e'F8FR.tˊ5%Khtik1F%i]\1WP8(ۙ[FxgMV9T~=a+4T7"K!^Vk]>厇O1L|'?G>}-tqJ">~µ5(nu=,~7GQ7 -;b1S8 -ߒ[ȠZxx]u/0/bXg/+V w)4-A50 KeS^ir ħFWcYI5?Gb_b*[fwÀY ^dʶCU50iH D4Ye._rLQr>ɍZmtG _ico:9}ƃ2 SL* {05 Yx}t:.CSgGX.[mGn#--:,{}}63Sy5%GWC}LNonHߴJ|bY0P rxsU UdnnGea|y_"׎>dҾqcxUrв- u2AtoT4*~:r ':_x@X˶Kw`(6&x㇫g8y}ȵno?Ɉ^FU2@QoJD#1L5 P ynhU9j MƮ-Ia*Cw -wi:. cLW .z1/^υk1:c%'-8M pF[ns󁦃df/f@u|[x A7R4_FyJ>{jp(6`nS;p. *7d W)eCc{k7fz6׍J%ZWXB+>[ e^jmfyM_+HkG^*avpP: _AV`+x,V>jyL,D>h4LԖ8'mD{.*_ƭkz/! myU/6&*1c0v1Bϡ4ֲ23 (ne6ogskZ*I:| -d&f K3" :Ȅpmg0iѸĥv.obk[yL@؋N_ uĩnYw>4éPgG. -aG -udcX@ -)^-G5[n$uڵ@w`l]oL\ڌ.}G R~!UaZ_fBϔsK@|+f`wc;F?ظϘǒ z*n ӵ74c2|+gA~\3& ^vlߕ^PC8T/ ->yƼ_oL1O>)~4ŚGœ;0f +_rVi0U9ʊvO eT2;pֶfr xk,eB}(:H G8V -I&o ,:;GHmp1kKcLaW' XܠmSBsl9:؄Wf`RJç\ 1[sʮ\2ޡ=x$" OS08ĩKН?m@ZC j3^sO|D~i\<50m}F{g# LޏFCNǜԌUCN6X"i!Y\F4|%{7d?Н5/:ǐͼfb/>lu+W[gk'7D^c4{r^H 'BД -˺GX_\_3y}gŽ^;}# QPۼeT{/&gVGƳsvAr]?X<ܵLQe"F=>ˏ_ -b@ -2jބN2biGdM45 a0}n -?l1P(3o:JPJl(go?*ϻMO _i4 l{.]$S=#ۯ.}uܼw3ZSUDp -[1=QĠߔSc̾fˮ\<\O wNLʞ -D{.X;w֜)1cR\?,h(zYSk,W |-B"wvkͿ.iCaE05Ϳ![ʃXXnVǖ8)-3ȄnKEkgp[P+,TGǷ>9:#zhiZzfR{!3taR clLES')[ЀлIDi`w`G P):#P[Df#q?0`oNW> -?]%~蟜JJr&G>U׭R@nP(PErG7b'zki3aWgX/V͝w%qϚ6eȞjQ?œ?M)SOb'~Ӕ:) c K|gP~37 cgUa8,@n0J1:eg ;:/.> -%B_˟e+292{H<>cޔJLH4J$ֆk<-ZJp%+ɎԂ\(j<:ܺn$vm='DJυtbnP0;u `ci'kcWP_Po9d5xK[Nb3~ (.P O2yOKV*W$&ˇ~u_ 1 פF᫤t>13Xq~ *s؋}U,VLM3oegVb -!(un(X`Uʭͽh!JP#43 -. ~ T:n&|ٻ#JOJT6q_9*S+pr,kmAU^:TnRTq6gKM  -YrZf*:dqsg>'Q ;ëRт̭3lbXUǃXҺ%A;N+g_9AV\gTTKќ6)va~m%%:Y 533P_"aEx)ɒW.D<p$ji._J^̘Fܤ>zN j𑜔08ȿ x|+>`U \h'Ko0c\]E)ߌ:OwLԦPAʘS9:>pƥx RBޑnj}"W~W}UO2 -vՋ~l XlOk03Vbb_ ?'TU2ʽ*öGz1ß337i~DBs?}S\N|k1HMo.zBBi<֛сl m6g;ZudX&4k|s8!}~rg3fõe5:ܦ7ii5⓭h\@IM>3$c-Vj|ʍ+/h^!!ZY5߬Lmcњ8/;7d9%Eh(5`F3mc?L0UZӎe奲֌L<>CIPͲw:蠳u& .fo69WR}̪rd25LyJ[ԛMs7uzzS"ھXIr}bsN 6\uvV.\ 5ߠSٷUa3?\i;{Do/BgH5H#rpD4֚d]Vk$4,r5+ࢮZeRW -X˼K3Dg@࿡(q$+IMqM{_Η*]n~?M~g+*t~STblfzL3S-o`#6>cZ׸QidM Y-s|m/Z4r&NT_Wiۈ49L"3Be.63o^nVubd~NuF{u9tM7颫Y" 1Jc. m9RTu1ŵn6ʆdft m-6˜?ηXu3ZT+7'H>i 򝼋qfa(-:M3[ %ZP1:>l?kYIWPɳ\ɑ -z3i[BJC,y!h)P"R~W+v {ȁh¼>ć@.HW%g&X~yZvls,l2ܥW\@;nƜN=k3o8J_:F wJ/iZDexw-cA,ۚ2lN.-h7K)M<,.MF'm'iQ -V~?DO&CTl&^:ҟ Ncy33oTЊdQ'T#Oֲ|1'v>\"O;qh{l6}D/i\!γ&2sYCo  >w#wB矀dd}uņԅ)Oʽ`._ʇT6=x~gmZ-%f(5lsnOhC7N=.fDf$K_NbyLɨ^zdvsHMC!(W)r|;iʣ&o0xIƬG"1qa4gKNt<#qH%W`F؊f ?%;>0-c`6^i]P򽬳e& #_OxCco_q`9#3rU^a Mm]aO(JaƝ(zg@d*ǀH{rJ5rVRbaN7Pt.,QQs.\@_#S5]?R-n6_xk<Է7~ Ϟ)uܳk$1Ѵu4EZH+|[N5T^]"&|1S"}p"1ĻfX`ey7"Hΐ֒n5A~ݺV¡xx1}(iFX $NkNkG<<8bjӹqRkqxCf\>X?cPܜr69X6Mۋ[a j0/Xt>MZ[oD&otXk5 -MB߁y\iEWx![ZW,*aHx#CZnW ;JUt'G8#)Cg*W:sq B'r| gݖV=nZCCɀpz/-@ l?+иs_2x掍Zd C L\x'#]Oy|4S)]{BkE$ꌾ/3߅W]x\n?",%e ڂ-A4vƳuϮBcߞ?Lu_R!y5EqrRM> 5k?0"t8=zM>%&<޳dSҸ1^Ls 1`T{ -RIUۃ;.ĮBcϷDf T%kS^q>E~܃Z£ePu*(oKժXsV d MECGXNC^] L "9fc'Ȓ\n;8̓+f=.n}~?ODїƬ`|g3J+,pX-(fCaL x [oT\%j/3$1ۼ);İEJARrڻC6i$ [K+6fJ5 P=& #J{Jh ->Z&EX͞B: kOiJAi eQ<H!I<.m|Y -|o%dȽe[Z]`0/0R 8sg#x_n R'w2#?D&/ukeo̼D'^+j_ R 3ePݫL^n)|'WF+H_=[ÝRNo9 ,ɐO*[NgqWa8U60OnFtt|ZX#=P {W+Y1g? R 4}ez-AFw;fX6ytu-dpY=BJe"^s |/h#]\tZRGnC-z@:@b:M=_@ uh_]~4pl0ֻŵT(0~c V_ a¥_ NWoTPrPӵ4 cz[tkGƽ W+! S*I4M<'ԅ|:v#<,Ѐ]8 ڌ2s˹ E7"v=3h3Z5 f5-WKob1/{eu+&NN`}sy/J|tte6o&NnsΥtL@q6C彼#+#k]w~[.W|ZenFz*eӬ3?dEm?k[H##{{:۪e3'hiiUnLaDeѕ{ iuzS -006\+U -/7ݎNBcV/}&Sh}eoi]zAwY);SxW^"M؇G4ä-e7pR;<:I-\BVs/\M^D]wj:fGbM~~/`VfW+!K+F@ph_x+MikEdjӛj23}{ 1;@Z.kTp6o.#L/QgD:.=Ii-\{*6 "Nr$*cq)f{* -ƳQ"s/Tp GE `Ջ hI̓}%m5Y1,ш)7naU@lELlt\>GzίvQ2^p?c?Aw}ѧ -ts=u!AŬp@L}5a@[H;h)\n/ZjnM$"zCV NNs_~P=v/JcGTzOB}Ρ|8:zԦ\Qcƶ;Nu(4ru jNʭR7~cD[ MjHkvΪ rft:l|} O,qW[\®ks qicV6t 9GI˙m4p-]/ -k9{Ғ'm11z5W1o58V dÆJ] pו~ ~QJMovg)a+IA[_&,%!? ӄGlkBK~5h#.GL<^"ϡ?n<'׆*>PrE?>vK*L*=}~wQ&Y3PѶ?0}vb52KTN'17\b\F.ң="X_Æ;<`{!޶he *Ҙ"R֏.W+oZÚKGe›\0f&}Q>>g: طJRN@N@V@loCVXn0.0r/NMc‹ \:*+{yʱ2na y yH?, Zmz%ҽvyANb^R\1oL av 'Rgj\t"SUO%TD*Og%%0E4 ˁ4Bhwtl- n;R+wDzGu?h+DNM0 $oOtgUAr9.d۠ILd :Ϲ/?S525{xo|.bg\ZDdYOTۥj%kۙmcY累e[z%ý5{JOK-$׃"ҀQg 1!z8ۆ[Mx.=.d]JE*>ս3M)-u=N}bQ_d[qd2@yf<Ym:. "GY n'Wj4λ7{Y|Y!ypJ%Lj/Q߾ҩ^=#|M5TgY4,9sFK6&v(u4³d1%oEHP~cb84 |Fǥz.Nw1õr|aNlǴG[?'`4{=?ìmʙ@Cl1\ -}\lz@84>q+&~1COi*~˾!'7xHpQ dz&v=Ղp^wi73ݒȒWYZ< nQA*eb\]ˬ\~4iQ&LzL6RxFKgxf[{`xi'cXsiS5S |.\rSDLg%G6xu** k3\!_v?py$7nF\=ʪ~O/"b1 4uS=¯mBKժ/GV/wjΓW}S&Ll ;ݿ5Ss~ڠfr0! zQ"9U:_r1,)9||b =ozQuWG" Ϭ*ѣyo)iCm#{}h^|՛@[pfǬSzc(R4:|t(9Kxez5:nR:Ѝ\fmH|_SxWFJ`t+aOGVej[^$Ӄǿ.wjV|wZXк|K3o>M\{ZH{co"v*}b.SqÀɭ_}%FxnqW)1=gHFs+;#@ `[;os*& #\ő`9-<ڦNG n рTՀ*ң7ej-Xg4[\a-3zkMt#KxSWR|7yO[tSC_&> y{̹rj\OYH޼N3K= ԽϤ@}8JЫw՝:x&\Tө.[' /AGwj_[W%K_]9Mlì(4e:}^hCUsc× Gi{/ߜ>mzwJϯn>Ȟ\c2rI͗maNO}xi:߼7:@=\*c4 X74#u=d䶒eך'J6:UCr\V3j6؆=XYD1d82ke;_ɿ(IW1j/GywVf70 _@$0] KDcvAsX}w9!Q-xQhքͺW(3ϬG# -T@& ieP>M(}J#v<"7yXE>r&ZÀ2[Hz-ڹbuF$+զ&Y2?ZW|࿠^ 7vfj s02~h]/"iWx;Wx34md?OU(>- -^g,lq?( K+HOwre|ДEw_1_I|WvXї\矎 H}<ᯈ76 LC7f9t~3Yl4Lg4XUMc3'uBwjO?=RTKٖE_q4:iv8jJ<'QI gك1KyTP+|g]'C Os˾DؔȦmO\ A<:-8'G4ETh<5V36th_J~>п E w(md.j/G̟zK>zl8UȦar^B>!6rFZ{X*o^mJTNh'JP]xFЉ1fz;K42#|[>e פߙ)Χ /;Ưu r.@5mkJ\x_[&p74guu_isc})C15C1% pֶ&27 -**G$|ei%E<ߒxTU^GҜ茵yf ~;Qpk/wcXӃտfzreyZ Bc)#> 5[kAQ^%hʸ|ƱU0©Xi_a?*(ZS5}R6o~Yo`M[h/qGMgR>1SA) J IQn2L#:~Ǒo8Wh5q\9t/=}2ΫAk3,aK>m+M^|V/}pܔ)M*Y,Pxn9f|}bI ZPaʺM>n'z{L_Ai!;Bdio3af].Gi~?lO ӣ[L(f2-mX}KbҠfgxsubm 28360W} kcB.^j{>eݳyބU(M { gw"Wj!tT=`Z-} |GqJ9ޔP!W ,U\(:C:q~Eg.n)׀j`C[lZze9SfG~jM-LTĦn6xmhh5^" :)e:ǝ-x""֋:WAWT ăHZJby8A){]c=i+ow:TП8⃴/u+Fjb};A_ =va­s3VH?ٵFo262L ѝfE n&;y}cr&㢱6 ܗ1^8#"*Ӭ˘0}~J1reIr[h.2Yև?ph5FK2^Bio-jh*Qp yЏ!H+3+Ʈ6דr:>Ep ]9BԌ\ Y3-cHA=g n .7kquk*jz?N]uo9|sW2οr?Nr`{}6[D K55 )ޚͰ:3م"ʡ¥p<|50>/nUI}j-Cw%KWf.(Xء_df'bW]TU?o3jG64O,qLA р+#&8M|Cꏟ*NeZf7}Js8ι]pwO%V?:HcR,8o c*:q5Qg4o -JWwh -<* 15^X/EK1sX4I@KVFxk cObdɎ[: kTvRMZD1ϑbζ?lXek)F]8.O3(%Q@>3Pt9#+ (iY_e9Yͯwgw.šKc]X2gF8 k/7/Gm*'劬ܚ.|;73|Zg^̇ խw1CAhv*XC?>yОs{&-2Vm|!>K `5ޠU5խUxi@ ]DLʼ;֧yo޷}^u+~Q5Dt2E_N}W\L e(wyEͥ1~[%^CCA-^ -%S f\yLeF^Yҽ']b֧+NoXS$}e>3eig5MdXAdӢBA%*'ǀyL(e(5uw%ѹL31:%+*`Ch9{ k1]Y D >\M|eG?fM~rSmƞL&<"-iaJ -[vYy}bw8K?j{.tX}kYg0"Ir Vha,/tQ]'OΉaE1\ C+W)mRmxzM:rf oӋ&Ѳ+BrC}LMKi<:B_:5p)T|93_7'3|!Goa>߲Qޝj<4j4˷{X?iَ;=ehOA/9"q*N|js-!dozpl U?xMarVttij+^W+UXz|rۗ7!7@hGw)^Ọk/ ]B\Ž@-ק1УVڌJ?'7̃.lTj2+"obc O Xw0 c{y #o5,>Y*lڳ{TE 1W׍ɗQZl vr3|o?sHV룄 -mui݌2hgLnzq>^/yvQY=t< S\h< gJ}#P0>,)OI~i0)s%]yv-x [_^DN|׆%d3o7aa6xsM1sYOz(\+O?tҢ5b>B˽ -.'ߟϜ2µ -[JZ'~y{V0\? -b3εWW]C.> |1 +j-_"w{!>?::F}/VwnNm=_/Oڢe>q}c#Qe.԰Px%4RUiͮl(EgUs}Go,bO"hW~)b8]lV2Uk+pJ*|&X [O5 /=dU-dKl+S,`jEH??5Mr!W )nY02wgfVh*OMp(~.Ԡ*uaFu%qU=\m-N(AfaSSiL6iNdmNU>ؘ-~ -G$!!Ǭ,X<ֶbVsӒh\|_SIs4v.}b]=@޿Jz2>Bǣ>Nq=SZObDNm_,yoq>55acMX|O#Dd=W\LNcmXc,yp33h2ԟ*evF52(~7'?3祇؛Bm9~XoKį [J{Nu+28k- -J]ZEioD \]Til.m6@7p'-#9hH^ u7rp9Q!wjHzbt3*Xy_Aya5HQW u#V/k Ίۯ =|8&˛ s׹-k`'hNZB;#a"h.=iZЕqE\.'vfdh{{oMe3Z^ɠkFeiE I8WV0)/t0.eW]%X AվQzNzǶ5 -Фp܌E۶7.Z*`ҙ"Tc{Bm -;CzvīTEy?Tɞ\Ki8_lW>qOFNd-zUTx{K`\ߎ&@ަ7Y=5S(vMǻt+Q -Ve]/M(pL®[&o8dabGHz%enTI^:ҙ,4#$={nm^2H=Si,gN+0ʴc&JV E[(ė/UHԪP~ Ew9tFM$H_jk>@~ $5ױƈvNE񶿱}bMunfVv]O~ECFq=pX<(xe ?3:rxNoUxc=Ϛ˦u?n?gc\1(yă53W?߆':(.z.k:^b&y=Rhu':-"5Wv>NwqN)R2|iIZiH12Ӧg ASqQySw!}(B5wiP鋊R F3Q}Q~-87<4<i::?yǘAJ8g94Y^KsC1H֢t/e0 ȗ*:nZg;b|)Q/2߸f=5zGճiԸ.]s[z1[k0O_u p1%b#8!ksXaեw L= .pSC.A\hrMCN2z[Qb[*j}):b';nұ*+y_AxeCD$HYƗc ;J@ne'̑_~)y-f<~%;o2HNi}xo+ Ny_5| -d[7=~*6xpŠDށO%Zg|4 -;v Gq- 'jJUq0-Ӕ,L_7izFrs]^_-ǧ"}~TNr%RWOֵ[('yZSݔk:1ʁ?U@_J] P;˔fк] (p2/P[X/X/&@" A 71ZYl'Fʊ0Ak1N޼5p_#G{M/XFMIGThu8jiѓL4qP?LC{JOiKb\5im{~'G;vW[gg>cQ.X9*UL[{DxS5G!_zxλgU㸀Nirn^2-)QtM= <[żJfj~j;{qh[wG℮M>hK&hU% bWm^ "Ro+=3MB$^N&(Dk7Rt_DߊYgXKa촦o) 3P? #tہ¹˯ /c>)iې|jA͟aчL͸3^'Dwgy݄aG[ޑiwYxObOQe4Lѳ@TfN uIwB'YYSt;gYMeGJxCZhE}K)Rq,+ؕ@ ,; -$L\ M~^Y{ƀr[ pr9+k^dͺTaj?}bQ5vY_@5zvk> -^R~vR)8jA+9 ?ȏ'H0:䍪msXUw!{"GImtq h+ں*Lw=e姝rJkx:Kx1[BY8@x/0S@s%)IrqʋD@;gr - ˭I"ffZ3љrTh.V-ܽ]bu);rwJ:2I_D(&S"n j$G?;ϭW` rNt2^,16fe2l]ng 4G]aŦ[\2[Զ1 m>!8$X#fAvм&T~zUE!m6ԯ{5vWHص"wjUao|~B6c0FLfH6xi’.N$1^ x+7t3#۳3'$<襓}x&آT -k5h(?L)s>T+88Ŵ0VN ֳf:ZGH+k@# vCVIa//"GVJT&>k ,ϗ\iؐ35&"1Kfu\eAX/h֊YVxo+`/NRwEҙ]EeDKE| Z;> VejK1( oϰs- -;gj%_8>/mP֐CWoYa]w%ǣzbi$JzXc`rzi|6깕#Wt@[\+Cl]gmO1=Ow Sx QB'l*rؿGx5\Vwp]uW7R^(%3މ叚'3đ`h,3(s=zǽoQ zC. YV{Ú5v. aݐa5QֳjQgZ/>trj!Bئ5o;噖y{iJ_}cA| /XỴ -*h%c JXoǫɃ(pM;C;"Hjdج6,$ Lk`hSS V Wxۺs ?)Tt{AޒwfUr@YTo3gp&>MOą694ca Z":]9M\⚗_Ycᄕ̿8AY_u;/UJ2b_8۵3/΋^iEǂ@z`S ?[at=_ 7j~R#Qn -=E-&ڣO/CܔCj~el(mH6-FU<(wZ*|s@zm݂ zu8{x= N*QIb(;}/)n19p+&;KU9C4GSIV1ˬ!. }ߑ?\Qizuwk}͝1\+cR[KEƪK; iIE# 49p:pog5PM#YΙӮeUָT4YH0`?YMMdyL*ss@nNޤՃxs~73/8S5;D=<@XiLSuXh rh:0(23BMʏc[ƝmQ0saZyFWԃr%#u}Lٻ Q2=>ڏ_ؾ- u.7֚?@0=]q~L(^A'tg6}9L7rEPJ~3prc-@MP)ԖZףs|XC8yZ& !Uܽa6+n4)ؚxER QWb\EAm.sȜS07^,MW._q2= 4WSH 47eFpof)=eq:ڂ;{d6%Mn^ ^QHiZ:0gU:P၄2=Ҭ1Wmp5*1 V6a}="(JTGc$/t }%Çĸޔ%^}\ه6CFDK/P<|݋doUk~~gA4e15FDm*)jO'9܍SB4jLF~޷(Po& ߁NE|壕 pYzfhEU Ӂèo½B[ XZU9:d& ->qKrrL%QE;TŏE+?y7b*t7Ǩ*E -U9gSwڸ-Vu 9I!#ws8JB~>n!L_M_|"v>>u,xj;h|Mv}EcӓB~({{)87: ܖ2 , aڼ!;? {'0,9 ;KQWNqiBw伞]Dؗieb{g0N"WNwܴqp=8S9 dqvG_y:<[3^?OͰV0R7 -LB腍 @߼Pi2jMNm^XJrԋjzq_(|Z$߇7_'A{`J`9DEP -8laep5Ar_ LOZ9龝Ezѣ>U\GF_U#ޢ9wJ.ֻ;5P۱_LK:)}IUh,%\bIe-4;k5NW$=\~*¢yÔ^:H=3NK;oy]O %Fwze|c w9Q-CZvbEgo1=z}f{߈7Ksu0 U0_ -x!܉g*QT,xfQswyjr~/['Y!**2Jch)QMx=0]>U ][5o{(n!oNj,?`lEM3c& 6y97SPPlP|?hzk->pBK}&|͘b"# -(S,ŁO xz@(Â*&<=[vTtص+ <^h;K,q'28=xdOo,4 b, L}n - J؅:} gt&Jϔoߗ5;n#)zMt{%0/j W>P{cP F3g Ht_Ёnҵ8}j`֐/fң9D ia8>iy~mRP&2;tQ):l ؁@1 <;"*zKG2:~ oɚv';wVWl09~s.ӠwAwv=;C.d'5gMb1f(ݙ`^'aCL ȭ5'fz%TmKc(>m >QC͠1΃o -e1X͕ :u2+nhVy)}ßO?> yz'્MD&Kzr;LVJ¡C^u{\Z=M}QAsviOY׈_9q:*VN rK D3Ogη4g>(7bWC1oN~S^_6B=a]}͗̊%T^uKh[ -ׯƻd_Hׅ&`E@*qZ.C{I -~:y4Z9T Swf]2e4}sH\i+F*ԟ9wrc)Xa7.%̍U5?HX{ף#b-~։w/E~qY 荁aOm:u0QFjزCv'x3 " зYQ$ ̀NirMu\dPbLF@Cc= 2-*:07K*ϱ&};EQ `k97R-~+87Nc1/{*aQȄצퟡ/ j-NLBq(!{˿k?C7z[_F!YGnJENKGnZ9 %dc[P[ԇfinφ&*^G+nK;q8iugk1ŮD[tn_![Puo?9aۃB}BdeIyւ_ -HLJ`1\C -b%3yXr80a -hYjWiQk q4]u.pb:, -"x_>>NO[E,#7ԛ2^\^טʭ+|=Brgiީ's~GS/.Uz?C>c'! eJSGu(k?5LKyK0ٙWH~sb/V}> =Β^(b yMjLٯh%3X0MҀ ?1+. :v]QiJ'@˶tmǵG'ˮ㽞@2u0WioYQZ]nwIb6t~DΑ9!5 Fakcp˹"bY!^d%`]:kzūWA/g˔7{.ع4#RZKijoO f6/iZk]o|gL61mx^ؐi**n [<:5XV4'"bQ> 9UUf:+p*DzUM#Fc|sK]xiME%~o eW7_".c : 7Jf5IbޣY~c{lWHo҃x -;*@"CS]0SMʷkѫT ̗>MΥMF -@VL[V2kSp4!&<6"-4*_H#T9P-*kQ0:Ӆcid;;+Dv:/^c6(-=0JMe2w)oբ0J,P~aã̳ox+L8_F5}Tso x6 9](5]D,x EE>?T}4S]׬r^%w75 _yգ8:oƷ3/K?rPo+L%aȉm!gB6@ ξ1BhߐF =DBm|V:hLd2sָ_N+s([IKs-.ȅJx^wNR7 -S/.wwwk,W4>ǫ}Ƞ5o2-_re7KkN1!diɓ/K=P=Uh#Jm}ZieRi+@GB&-eEK f_ c_#ZԵEXhlĕ]\/ǼYT2ϴv; n6)?bT^+Jnђf rKɮ5eK+2E}&xx iJAVrR`$Ý m&>5tӴpƭ޾7uUV;>ea k|N¹73*tD݆]IלkskAf| -AmRӧqmҗJFy;nC8m=KYTzEoTb!+qU݇w1u՝aή -zN%TT5;`zt^^UbQ,JIK:hyZ*j5u}YS(6㫏b&M؛{C`Awb=?8]ֈO<עW:~%b۲~H &yt(R|PX_0âK]ߨ! xO0GyG^zĩ{ٙs܋M(ۅ0s˛_)+rtJ!>Ww1,L-ѽ"wˠ]7@bT(b[ J{vdlk>P掯.F5G7|GE 5LC{Ma5m~ן (KڥΗ/=tgS.oϠ:xf#3l.I]4Oe6,oMWcJ7Dta=/OX,N;W's:z 2'۬W@k?4ang.fEҒJy1՗7aPx1w Ҟk'ΆkYJ@K}FV -mkA:7EovcWwr4923娚˻ }}_| ԛȖ'ge ھ>)ue}!u?a^%d\q4(_[MKreobb-}hOsܴTnLyLGp=jߤ$< -ўsՃcw1"(li.\8~Cz*{SuX</̺čbK@n W#!eZ*K .Síu:%G'O):kWO*n\wb,g=*R -[.פe̱u6(ۅZ19.]`chw{JJdt7ɉ׆[z>TpNe6tmRJز?rŌ_d3O?h9פľĥ 0%a@4 40Oj~d+57vT3 Yn&qFP~#6􉦁+3kL=ʞr_? Ր/LE0V4;Ak;?0pEBzNlG]a_)H+ͣjezמkׯ::ә?z6!Tso>Qy1j> ~[Y9LYd UV#B%-Iz[s_|9`v\V5`ӂX.%\oˏNC l^ѹӪa}-!)^CKap\H:FE.]' -x_?s) -6 gyjn-u*P}T:eY6صqn#.5w"3㑟@|)B3H5ODi3::APŢ \+DMڜ_SaoɁ,M|qe^ b%/7(f2X7˔pIL%Q-=F|c"!pˬB0teo^DT{U|{83LL%@׭I]Y=_b=e5.u1)nkHG Ft={NK| tYP-ϕlֵ7OtuHc{`q)*Mpht -L̟E }# 9`Cp.uMG |  p|7W)j* +7h&U<S)^גys3\0#/ +_Fia+Ql#1+,cb͌T￘<cvr@ Um`4Ogr>z" v05k<gW O6NU{ L/#fW0X)p9CELv3~R<5cdb[u5x -^z# + \71ؙO֓'Rsg'拺:Jb G-^!P]O+׆V+ʊ=4Xguk3Uc3p +$X{G7K*߳2}xR,JwPLHCWN [^CCL!%] ?4qiV#1v`6/!_2JҴқwv3ܫ߬epۉ-xokt1Ⱥ.EP7<3W wZ𜼰WkqtYtn=?X Ss5}W-z L/[\Eji?Kūq8'5(fYU#6շck0;ڏq+բ iz 5B 5*:H<`tc=5rd,ANjiqmy)2I[ϊխ9i?E -H4J)ү?%{Ue` a ,ZeɥQa.s\OR*r8,T#6S#:\ nr?3݂ ^ОrWY-|Fn t]+5l7 7\!z_I\3xПr|FcPAMtFybYu^~QĄ!i -7](L굢$6TuG>^49cpa?*HyE " %mvjBP쟉 k@hMHg˲ y:s0귡 eXK 2E3 COPpP  d:pNOyi/څ]l{B2va XI8l?EA(}1Ex߃(kiM$Ur+Moie|m҅Ռ Nk /uQ4h3!.GFsgܓ)?Ӈ) &X@!}aY*HS7>+G-#Jz٭"EϢcn*;1'OA_I]+#GR, *Ur{= >y-uœ x4c%o`ZD~ -8K9ᬬ41ǦO%]3 ~2ͼ\FUUÞ ~P:%XZ - Hk05=]X]]ß@=%K'* ҪwNUbjFY ]'U#}Kl?ddx1ޑpvC$Ifº9uj|EEL:P{& 1jw&j4ӆGU_wjVDh7XR.]f7!WGh~󒞑[) -ks`e?j"b:/fYC5TY_[s2u`v/loOy G 8q?G3@A&D5ueׁ]._igns8^6CZJ odmVf|e(~eQMjAZ'Y:p\ue/2 726Qi=7 vOT]+P-f0~W>d-Lf ToF -!^X0lؖ -$bJ:,&ic2*T耉y`Zn'KƭDɈ JS)x`&a[i"@OR9H[}Q/'[)-DF;bAˊ&fekf|9B5Q%kwk9>I"D<rur;'Y~odꟽWJjÔśMiנVWff.!ms1ʦH51YleS' zjF׆Knlk{4%{$Cq9_osscoRlF;awi L7G=au8*)ijbtHM ?|m(]/A]0bPO]=gױhٯq؂.ق7*\jw-zkP:_HX4 T,m곥;N @ -PN;.UXԘCFqޒ:FX`ii-!uބvJp:Ժ@;{}Wdttu%6q)kZTcC{ֿ@*Q*?.{ fGU|>a -2 -OXި>SpNqh|SLvæP%ـ#> L2\J!cL:v>e2/lgDpaRit9AvչE>_* vJ%u04?Gg?#9w '?dt>AlSSϙDxP w\WޱWCfT| Hw0 -K`No]e+7+% |t 4I;d;N &cIi[}aL&GH*QWcNGebZBv^eT=ƠV;O,#^!XR=V%>ptjn?JZh~0c5=ß[7|u5;"3JU6!C~@Lxi0B4rl^nk2{Bl´B -=13|$zfjoe';?};/V{9> "chzɣ@ U8'T3̣>\_~ -,_YA[!?n-_fC):@F)&& 8 9F},gzwL>i>Sğ -Xo YvN8+ȏ?x߅*3"kN%5=w /_\s=1i((0bˮ257O{cUZۻoKw>#T$`uE[l X<)֤N5K8*QjW7/EVZl;Mj9a$ʕkiXSnPwxVsv` ΃)$!_@RZ-R㹵Q_Cd*ҥFTxO6-%Xti.*U1JKxZ89$?NMPʶBT1h=42d)kKmTHQ̥㆚x((zD_\j]q3rc۝aV_{!th8TN\d,/ѫ살kF_ї=@/4\cI"-GAƬQ&7"OZc"wC{CōKunr cHb VyJg_؅gsOY#|WQhO~"z{iB:)-B%A9Q[!hmL<N'DT6KV' ?T kʩc;q0Lh6G،".*co9\Ӟ$Gwn=:̷9֝hi,]'(?k )W sb|3NrW?iR-HlAҀ "fx%ay_": CW,fviw4.<=%7\ڒH<Tԓ8EռGct0XeD~OIU[Cä>UecyVEk.)ڥWF -p4ή:Bu͘8f,v8_hA-~u#55FMO" BRR^Pyկ@KzF(?(ڱ*xtH]&V;pjke< -qma*dPx Xjn*,g,` J'WP0ve~fu\ "M - 3ucN{ c搇ȯ_>I%aIel鼷#_"v޲̾:rSՊ(ޘ%/i/8\jB5`W< F34ᷝCrAa3e暲WXhLeO!ЛSGStRs#3x̧ː>9\;&ś''4J믠OTOR =x>A-lMC)~ gw#h(h ,P1AtN7eCbc!HSQyHAR͆ۈgSo@Ե>fmԙv3z"ׯBUZ3*wF+hŽȱ/uԊ RgQ_06fEosNYv6J[]s.\Kr¸>mئV탼i0>xm+|^'Yi(1 PŊ&P -^uylu*"UxJh#߰A ZyG㇝tUgWu?vW$Sd@M)EupM(H} Oᔝ>I]4*i7T13cFegֵ²dnd"~+˾&W%ʙI|^SُDevoߕE/9Oī%H=(BO$/BT+v5)[͘ALQCct -!MѨbrK5~CkI@r/fx|/>cB^U:TnoI>_K0L{GYq.iN$.3s8@ :T}=Qf˷ -8`۱7!g-+ gpjg?$>Z5n[a0Sܝ_yDa8^6-Y덐K!}S3)*PaFsro -*bJ]AlF&iHc%ںi. [dO s??#HَpJ 2'cl_n5lFjz&z!n ]6QuC]Ό!y_x1 T'V#38l?-wY 1q*XuNO9%06ӤD~eP;oXNM]_6Vz[ 4r.8\Z_(ĪBP.lA/@`(ݯ -rhPy?Z\w"ޜ<0GIoӨt}ca9'O4ʯ5|+ HtG :*ϦWZzue]nZl9}FN_\X=("F/~7rV#%7On4Ú5Cu;M 5 ";?x/'&I_foe[3\+C˿}>YA\KsN ~bɞf,8so?{|WsxCsLMoq f?tpU@I~4'9^~WP(NfB\ ЅviU*O3#VqP zN]bNꝸ%ROI&vUjݜx63c-iL*jd3iƨnt> ~$/-sJ>Q ȝ/p4UưD߆u9 {=p5eLb.8֦֞iY̭enƇWtؗ5lpa~Y_A,Ц!g#2g(]>g30c C.8P@ӆ۶5#Pgk(\ز_XbƸk"cXe-n}{H,ruPZB^߄۳r↌e*7lOi~a::|r=)J^Ptk5*SSD􇊺-I'5 Fq@KuVm[M;oiJ#9Y=,dkw-e{%J͸g\wM hrJ?b;lSM ajQzX/t당F~1.bK{!m5;ylM>->z$ p N?N->߬dtK X 5ۂɅ%n-x8a~O?0YˆMv՘08G2?m右hKHim0zjSRXA*HrSSr7]cr/+~!ڑ/@x]yȡZ =j4֨=.hkK^q(oXYYT!wꐘAuQMxǴ{ؚߏE TjdvcV\KzVݩ{;U, ^Z-n_(}:ļ;TDH:SE9=7Wla-jr[j/ikޢ#IÚO_ٜ,aLb/,BSq2/JQ5;[&S9o=Z8C>k7h~>D -iu6|XDɯF > Y]fqp'SZMriNen]]ŚggGY+*t`By4eZw"R/Y&] jkIfw}!\'w ^D<ԉsk>~?4!S> ןaL^:mFqj -+h:b~@ Ƈ xwU`b"L*NB 5.p‡mܟ\q: li25UA4WAhxklVrE,}Ӱ,8%HuĿr:W9y`.VCbΫjMd.Uﶷ\7Bݣ"?9{ -~ؚv*,˃lS4!5.o~ev攓W\xA.+%* uAa:gڙaOb.}v L3o|ZvӍv!Ly\4uˁ,,k]4yLcy9 \Lgڛ S_:% F*' oY!l,v`z]3Dޖ]Y\.vt;wLe/l-wxþMYeu vo2l}c\ \j#~p>N 7K-ZbV8\ PK?i}߳H):o -ez>fSgU1Ү79(z_aT|nj)RYUx;X5Z{NHWT::WWvx碏@m>Z6D%bKNV2sص`zp'u,-c(P-h#3Zu9> ʚ~Uĺ?M}ezP`aN*z ^UB30׀4J\za_?RU5f 5X <nN+wgi-ruxs\m(E> Epf>S#\ <kOgЌvWЂmf! QڬAP&v2p5 +sX 1w]>[B/uUDۢwe>W+. SU{/ƤXAϱǩMewT\``IV_4]X{&#\RBn= wNw[Y KP\TٛΆem[ ы~˻}e/G @׿L!Ǔ\o|c3' ζu! -Uއ0bdUu{o;~hm.65I. cd t\<{ҽ6W/)WU(f;S3_wq5fCd0k}a J;K\2T+u_Ji=.n<Ӈ2p{l -xl_xnB/C0z+O3ω|6_:s<4|⺗pANZ4;sP &D4=9Oy&kM3@v1Ě*"kPKgG$-pJF4kD4J-?v:eMTukMZ&X@ƢڞǑȈ,?_/o6IӦA10Bò|V&IG=7X8$sQ%s*C )< _,J)-~c -&=U~5Xٷg5$ - -:Qu ?fDF%h;:?x[b7P9yv4b=` za5c2{?q?A[/u\o9rs׈j W6K?w89jW’C_1ˬQ=|^_oCۯsͤu '* a5u8 -"˪GS uNqcPjW<T~i?Yyo؄5{ݘf}b̽z .r硖9tXܿUn\k1(tJrIYGu'kngfw;&c҈,YBjU \NÉf3od!7h Xf&U)S9T[G4RAjG[G!Lv -҈|fƯ<ׁa!4!&|p]cB@#UUqt֤^MPx5alH8lSjAMx/%zK1=C+&7ڰ*{qGikZwJaG>FMF.mM y~nPZι?',^ gM,C3#)$spmrB4zgXPOzBq9G^ E =5:g?h{kbzϩLў]eN2l[EzLOS>Ӫ]oLҢ"Ҩ*#k5ʹGe)?TyjT25Q[ Mڝ*8+4Mx s1Ρ˛7 LӮ_LrTDn"y7%zA~cҿ8sۋ YE u< 9bg[jpCm5[l>]dfWéTఏ &v3 -S|-6 SHLy Պz-R9њ?vic`\^ΊWBeџkmroe u)=iYWP5c5T1b+&A* ;}e˗Q,{&o_`MRY*G(Um\)}PB\ >ku'(13!PFU'3wchJ'SS&=Q4. ۏG2ȽxIw3 -.r8l\&vt3E\7 -Mi/IJz,gMXʾRN~eQXAkK9W{<ٽ'tsN?.} -fws⚐钲lM^M4Gc =gva f~ȟ -Ȩ$DA>WvE^SΕ~(ίǃ~/{+xΏ:)_L޲Z֙_33"mcZ)Z=Jțe],a7IzKlyy -wt+h)g!kx?.@{<" K2/0Ol3AjZOeCGj1xu 0rL+ -.'\ƛxԏS> yG[U5TҺq g10eN@6%DN֋m'8r|c:cE8YҷSV'?2Ϸ _ vSB&˞ƣY4 H>p`<de㈙d-N\.yISgs'8+#K/;IURז\) .6hlvjRZ˗"]h-}-)yisȼ^Ҵ-&@ꕫT؀Wcm -^ )Qr 6H5/68uiAx.ELY M[."B(ͧWƹ\3zT{x))C 4rH,W 竩GjeJ,ԉ\y.]ZS-嵇n)eEr*R 9 %V9h,%laV=fZ`^0W]"jDlJ?)X0&/'>,5LZ+?gG#jl\'[e,hµ*v/G74PGd`"SIb5ރ5# jĩĭiϵc͚,f7%{M%{k=5N> ;dž9[qp dQ@EDXyA| -af8bĥ.cv] 9,o-YP{Tuչ@/ca~\u:=&\O&JB1U -8]qSZqk%|k3uv`1`ƢuB_~t~)+-#]9}f<%rD~jۋrC.pj}e3h~'[5:2FBլ8 T ,?ɅϞmo 9dҴrGᚕNU-$t@MK:tOJf^,e,joR)w~t]TotiD3yԤW qώIͦȎ[3p%kȶ?k>d˓*@}J%jnU?ps2=|/p,]~r'T¸bR2i~\tzk'Ino &u)\S O~:p ѵcI._ pcJBhg8ϴ "foQz6 -0eׂ k~mB`+J#-Vi(.8\~Z;YʅEvvYm֐H=uډI ؾj_-4. EvMT bwD7a " O0C "9p(ai{ʩzJ~SCX__EYb\:aFL%'W(:=QpxZ!>r<}{.)dt41`='j{r[ šu2|5֮|HϬSe$GWcn.\F`vP Uvwd?ß~ [Rg~5% &I3bkTS'>BwI\8k1^w$D'p5/%C=H c RXU6ZLJb'7niob\N{-4 8kJEom*HЇ1nW -H"6 *_>(ϟ^+v -4M1f]*F.>^fx܂j9FBZ:)"41y] [|U:__^FӜPxt,7((~-7DRj`mŻ#;e&.iCWHm-*spwqXnqSU/QBX$6aEk 4VFUй5cV\8ޅ̸rmDoζ]ُJI19Ǔ2 -n -ͪQ8ZyU*u( XS}LJa -P[+DEΜ(х=ٲX m頵7}__ .e\n.mӜ hdx 69%+Jã9c.B+db#T~X#.Pʺ<9i -nZpeuT&25at٠"ep=Ex/SrX7vL>BBHu8gcMr~NHMZ0EmM|>!}[^E Noe=jqancWnAΠ%5@)dהG#_(+ʮrJcKb| Iݘ%HZ@xRZѢp"5S)sldZ5&J S;Jem4p{%i &e2o -KULeZ0'9>$]\DׂTu\K*% +J+H*܄s|Rt=Q}fi}u<©qRy+G0@v˝z\rfsD\mQ ZrJ\m -m` #WXٕSMb+dR[ZXf/jBՉ!7$%_5Uh]@|^I^gW;3&IP2oBjF{^]G☇RͪqN6r{|yޒL^ AhCӈU1p5ڑ2@c_̲s$E'-c *Ե:q@ker۹>%kTrUa[L 2|d³5k̷b'*;qɨs4swi+X$\Yg5Fm&݉_G)ߌyt^>j03a\-`1 ͘Uczz^%Zp.lu|'f$"FDl ZEqMpߦ"^MaC|jciXvJj"c*ξ|_)N%UKAl;FO2L0<|W PQteE؉Zw`9ʚU+5%E睜[Y'~rOstZ,W;&U ^.]5`5OOnӗa@D|^y>t$v0uy _ҋx?PKN|ɗɃ{!asa29NM)R~twI@aɀ`P8u:; G/ {:WƳ{=Iޕ:qhoF1}}'pj,3fa:1ηOQeiYWQM`~;MaF^!A[P\*Z(yYI=jnO. yQxiZs }3SEbo_1N.Rֻn2kev!pv~<WN膒 n{QZE -SYNrkJ-Ih ҼDWsS b ~OtBgYo]CYvaڳS?1#Z<{e[JƜLC3vgAoNbz#Ѫrp&e9tZS.2V\z+q3q(9=Q$UM:qnUWÞpYy .[‚diaPD0@l$ )_-SٟϦɥ넙t -rW53] R#*kTm&'a³إ5 -uщFq:̰ܳGC1-]:i٘c*T-hw6jKHzbbis]5-;Bl7kh"K)zVW )~Jp(&i -n ـdY՛fo?g9Oirʑi&9M9;[pBN<PYg*[5t_&Ď\Y\3&*GTݳ%)FmHm[5&}g] veqGېkyO{ -̓Q 3TJM%oz t9nR 8[A9|5n,JYhj}y$ߕ7+z:CC2WS -3d5*e,=A{D}k7XK*ؓ&ޡ\̟>+|C[ηero _t:q`ts OVF --ky);y7!d/=S-ұ+y p3\Ӣӂ s?:9='p/"&62Z8A: 0Ѵʺ]Q-K/~'|~'o,"CF<9KF흘5X5lwxEd7G)uUWOM̜ͻϰ4!)f-t|,l u|1-+R,Qab`ڃKxoUΒNYJ\r fvu <c B ZjCe!9'MQjDΓhSi3MVHWbauJa~T}GhFS@4z7)>Ѯ~\#ʾ Zop&Vړ jXB1]kv=j^W۶DFR0G]*!;I\=_Yi ϖR-iL7 /k CMMGb]*㘾b  \Pa+E63 O$y3rTcW;~Tk3n5+C ,P DG~M֠L(ҍc6jqx -ZΤ=tsi dpAժ~ɤz$ӏu([6!^v-7tJrCRc_5RUjoLCe(GhvbǷVjm*ԮeR7jL3u44@+fNɢn=*:?0jn@oBӁؐWJ!`x n(WX=\Xٗgy: ](JFm>M:sWj\{,d61(h[q9&_$8X_B(8rp\ %<)ù.!hUqoBRi}ujmM"u2 lF}^c]Kd!/rBTиg py L%k{y`q[DCS}%}bї‹}ɜHC(jChPG 2OhM5ޥo%M#֚I{"ZFi9o9"3`Xo `&y_wY+3Gn{.Lht1oo]@:rJT=4]es -bt:;TwF?yl1ꐸCK\h{S]~~geIm~uf8sd_-_0qV/9z@o_ JIp 6A'#g=~&5rVW -Kxe'˻MmހY(-CcEAA ijk*nTۘ'- ԎFq8IX`tZ(fwπum$\:s- z@sY~M'q m̮㹇?u$ RT\pe: YY 9!\Ca j jj)}Ȇ^Vi>Jӆ[*q e|Jkc՜tcxS]yGyBxbSf4R@2jomf6Nfz!PnƲWj*a J*kŏ*[M"i֊ +/y#[doϦ]K(p; mXʵG}%i5mPCcZzƘ Rgs9B2l12ho#qGSo`ZXB`F;^ o冏X 4uH>$EѿnYACt=2^ 5f[仔8bhMO^̜QM?6}=٬us%y@/[x0%K/93HOj XtK@Nu«@NCu( 3xZ%Il6dvԡ)ٹv:& WT}W1ۓUq0A/IqU|ҽZ*x(8w~y׼8 y*~L(lMƮ ~eelDe>cJ|jjd->&MIquӢQ%KR34|7Ǔ9vr ljGϨw^WG)zY˃Ѥ3Tz'30i԰Lp;Ӎ?.LMMZ @| -m| 0O&8Wr \V vPpc*cAtD?}\:8U!8:p+y7]ي:6%<f%ǷGy*{[\\@iy=$fЍc3S-:ܛ8 qv]}Z9BQ0_ ^xoR_Wcg2Py6'0Ӂrcj@dORuVuuEkc,9Xm2T3S /F^7AeQ>c<32ٕ[gew6{#9j< ΋%C8Μ\k%" dgzјz嫆^'QT tDJ `RXQqkΓi1 ˎfߊٓ.zNO.Y*FMeM!+fڊY -]LUtmepqyM&샲i [:ё^ɂAW5DOX \#TICQ/NfKex0`)j*1x YE\2L{'j֣`jr|8;gٕ+)^HVe;X+o8kAЕ^+iPz1O!V+kZפ0Rw*oļCֹ ?6~VZWW-K#ly~c֕ĮU -DOX୓@#f,v}bva_%PkȤڻoµ=f{c0]Zl9P" L|M--ݬT -QODm3J\ -ilœ2ј~*ةO^fw⧟H{$2h'e=#qPi4nk54+]V~}Xq,G -b=f1ƺ0S4wsekӜXU l8tp(Gh5K؊JmNdqm=XM W[JfZ~/.*h@юiv{Q59oe~J+6Gc/yL285Ɯ#m=r-pQ,Xlq -eM}q-):7yOQmXlL 7[jxngjHQDATMqjfzpӃD62u)+q[V A#(}JV&(k_AV\0^$Qs=ƂIl2MXh@|]a,cDŽjg͵- -X郜 7Y`v -}g:_z Bz;oƟ |q+kd -hKQouBw%uԍ3l~^ײ.C4&Qz3|Vg> /\4%ϊOS?ZJfF"Soxj>7ϯVbW™4=]!+3l!G={O?XI0g3#>9zOvߦ.W] uVi8x f|%xtQ1B"% VxƕǛgZ|QUD.Y]~B):+bA-*ZK5"L- ynXeKx*g%Ĭh:x4iT/kκ!yl>t4yVuU%4ckhLZhg{VvkZԏ5 Sك\lL y&}I%6[]aYJW{<-i;2?WXHLm4]:K0dSH]*]UI#@ 3JZl&z +xC2u}'s)ǽ#K $y$u ˔^Α>e֤Cz0}"G+4\R:f}9Y%<`џVL93ߚS_"Rmx;Di> LrqXZN!Ǜfɖ*pً$LЕ ~g@fJI\P4TϤK5t@%VD9iPCgEwm/;8^;Y\.Ɋн]$3A~uŹg&#vCi z]Yb x`Zéy|giƣ>TIt):xu -7Il-֕sITd -reOiפ5w-5=ϬOM?npWIn{*=m5 ?Ħr\'d_N[U_48೰OHPR|Wwì5? zQ]p9CyډHO0 ۻV޳;\=81)U0M#EF.bԻ}rXt}7`R1)2u*/Vx_HG$h{ti@XҋΑBp-t8c{>P}fMtxsK/3O? G"Y`PVs3fN%^KŮ+32a\F7'xusj0^j#.IE)ex7sS6?ur kCT۞#U*84،w-w7kۦvH^Y*iUA[5('Y s -Øpݨz{zQ? !J~!t~AQp{E;en> 篱f~_I~M 4*}NO?f:V_RF]6\)Jo{I%za$߈yF,/Yqfo='t?L \i?:T3'C!@ yqm~7,Q]R}5 @ot,&-p!~:?B+TyFuf-̅ rvx0ݧxrueQ`Vn2kOR/F~Q|-x) F6XmU|2jygwdmT[8rJ`DT3蓐Dc䢳V.hpeH} 3*jٝrDG"BSvT599復~PpCk)W( ?GwZp&F E荠3Ht> trel眊=BXtL)a%6ƭL%7IRi:Pe6.B -T[GßK2ǕsǼ3uL\ɾG?nMtzORk^md]X V -[r q1sXܐ^?!؟QqIGF8-WN hx爬ƢKg7:!NGn&;:D]|7b">(C {ʜ.FD:&H/^Zaޒoj¥(hzKW*Acm^O?t~$ˡ=gӎxG8*vN؊T5^Q.SJCx -Bq8VWk\3M֯h%Z3eiz;8-Kng#Oa&i>N];px7qU"rz`+1_s Fd SKZL]Yn ˿U?Uҽ,X5)mFAT4{=2؏#J2Dw ^4JOAsX[MeZɎ0$:jj}a-UtKsQI17Qл'_p'?t.=e{z::%c̴|3ZWr0н%{'O3kHIikZ$8yU窃b}o!;MJSgSq("ZJs;ە'G:*;!3kKѼy/5wk9,= ׃ Y8j9ltj::TI05|k)?9W] d1pEzK{r;?g27Xb'}4}#FdN4@}?CU[]vxZ(wMܥ_3/Z@ -uebȩNJQF ]rC?c0-(DNs@mIjh6EuO/Ǐu;!yZ[ZcA%I?s}x)^GrVJ5\e:Í36]N JtT/,!_>u*Jv%u:/k3N2_o jtGaگD?_ ";>f- ՗ݮ ::OGb߀8:2iNs_rPݙxtλ˛Oˊ;F3.k~4 rV wGѯO 1/檇U,r)~y4\\4|}= Or~~u~Nu!AmI^,S))žRܥ -ut؟2-S%gֈ,0z^\ xA69?083Of|37%Χ~?O"=FtOg+f&]ߋ^[AT1ZKnĮ{WGI&aHv!PaK-'5JgY:lt PzΆW;P/څo 6׆N=Qj!5 9uJjš )ڎD&]:CX/PTFG2]\VdkJ,ryux^)-t'BuUyS9җ\|w07X}GPDߞjW -hUwiYHE}E+_2FAI Nc6i{oA,=(g>)5>T2&n7j%eX% 阑AuOnXΰ:pD\hphUk` -x1yE^|G1s9:|kN "kB̓FHVn+TfqZm[N `WLMF*RRpJ . -x_QS. p lǼL,-= -#r  tsU7?\77ݩ6:9oco؍e>_d[w[ ~/?~lg38^烁}_N(uM`jQRꕚqȆs f2B5bn5!$`\)|'DOrYﱂ͎Ir+ɩН)Ψ*)o+>1CG4Ou[\0i7JXƒ f%@ <.4΄u)#iLg|q(Zo)A:@b(îreʼ[Q 2p%3̗.eEFh5< 3)M0c`[1!['9 -^Y"ub !U”P\Xd@CX%ڙq*&"ddcm!_+ -+mE -~RhnOBm(F^_AT%>E،1;)bzKY,q/"1 [=dP)%5T9+ cBKq\,aпhm -\ӋV7sV[tKP8 -*?XސPg UiBmV,;’Ru -?uam%7!@tDBʜ=8(֢AQ-LՑw!"FU l"-׹x3SgNq6%p߹o,WJ{YaA|5p|SkcNTtARpR/qbԷj<7b$F5^,L- oܴn7&/L]jXF/ lm~Af׌-ajV}JUר/h< MLo20 Tɢ&||% a>+I;;)Òf -!#Wڈ:PLX^^= ֔Ȧ-leS[JA0P /Z? ?Tꍅ7 )V4Foވ)-#V!)y_r~ cF(R1p Q, -rmkG/r|wd\F_oN4Om QֳRJ\3?c(ΡPj No1>Q ,ÃbY \%F7%=ʛ*WrRB╁j_O)q%0Q#S<2CdV"10HM]za/;*-G9j,CX<8 J%FdXRWE{߶>\_q5}AraxF?R%?UP^2(gld|\V`=1H4SMZ[aq";:?oTJQ nS[m>UASG=9I{q#]ǠSًKeç;A%zAJq)=t뫜_n_n@!n*|^؍On+H?N.NȝCiR*QZȢ'P"ʯV!J| -ia<u>j 4}29~~IK - !":=Qckey%B_ԹW*'"6̿ .0OZu 0f;H5qFf^H\ܶ9<}KZYD b݉u^1iZY~1ao4wɇGyEj L܀2ot6ZiDcOF0aBOe"倘0x'gJ<[2kr{]MD*^e=njQ.n.UnfU0%JbW*-q}@3zOp/Łq 5*R tfA~__pR*m-;JxpuB䚃\q5BU_BQ 0Ssb` N>*]7;!f.ZwRZT8 2xn搹q7)%Yr0cH sx _*2¥WL8[^w)慘:B4j\.t b|k2+Pj .܍?ąwFPEXxv(wG+geO'")`ՀD萊E_#nbO -m ޅ+-W+gG`dE/45 CPQ7pWRjdqʧRߟ<$ka`METώq.V1𵇋Pq1n7.*j-urw.NȶJ P%Vb+D!D pbiJ> ?\ȕ.}ʔT+&-Sx=z 8LH2IR_4,c(q5crB\\>C:h_,T\i.-a0eJ99( -x;'l<9N^\g⡰ͳi`U9Q ? -%pN$S q,Qfxr-[1|I SYe/ŕsfS.u~X>5/TL.ہFU/9|"pc88\4w$wg㈱x%#"%PbeQ0P:yTA"/ZnrR˩aĹeˍL~摛_&~j*r\k-QƄ 0Oθ Wɫo?&]JEHqlK**h}K5/PV_/1sLFx=ūa} ʇ犋7*W\sQ+*Ư>x"0ฒQeqܹy -KSX<Թs.V8]~ -be/RԵRq^j*xXJn=&L |R]As^XU?i}A7-|.W5\'6 1,s[[ox.%Qp\qE#Hs +g.%1d0C\ʥ.L/SU$H՗&HeBJbeR@(֒@yY.~Da/:j(jY,QX.+++*3ƥ\Pps_L]JypC2Q>!P5_H -Yss\o>9Oeƪm⣈PʇJ]J#.$A1W7R -ww&Ƽ@;R$Qln -W#bܤ[Z4fm-SP/X eU1Sp<[ܳV:|(%L~FkWe,Nu0X&8nQ8Kfxx<R_quI\'ɋh } ( R)(+X/y)'| -7 z3GS,1s> ~ TFFar^|UyJ`U0l#'T s5"f|K|AKz|1NUBΙAWQ4m) $  fQ\wn% -SC5K`Fk-8?HK~5phϽLmMp,uҶ(W -ڰ`ݿA|,I^@1jF:#3 j+2qqD_ߦK -[%\SO\}P-Qji% P~.j+q\h1Ш aU".P-ָ3*cRCq/@q>Bx\ 6'|S,.'hZ S+T+1عPٸ[ xSTÆ}D–6<xq*'`IOP7.b\8V1S*!n%E#L;Ln=fAtؼ/z^Fn. WŸ~Ou ]®RqR&jƃ\~cJ335qb̺^yx|BPe#)b }fz8#%q?-5 &&f~ -,J:p&oj\u );^m!rX#7\%(嫕e,1e@P+3k3flcRJ~.ViQ} -^S'أVU)de焌aF/+gy `E`fqx3f t$u$M" @2h0o{ xp5Vڶw֞( 2P,q]45DLsy⬣+!ռM Fx& GVqpE|B?PRmPP}@]EƯAQg+` N̪Uh X%_jRlKw2Q"/B=fU /"L`k[e:yуs:QmZ :nxftb;{qD7FLmu[ԷUTc4kA)7hjX.R3Q7JKjbCS/ }p*k.\h7!𺄯Px3_ĩ] ~}ʗ*!}08WO.P8T .ru\ĤAc!ȘVVp%*9q+;{dg?;/'qxvx-b!)zG-SVP@` މC+|*8UJkn(c5*Jd26}^#ѥBCm/`\Y:pi!+a*_(]ߨ0ieiL>MuM8lG'h2MS p%R -ej"goܡ +YvxEԯ sUDڃOwfxrKأpT  HótU/)2#au,2{[ua2\8%B7UtUiw-rY RՌ4b@k:(ߋ>,@*آTx-p* 1VYP%t*;zrޢx #W+I_KzH~{{eS XZQUP5iAT\$Ahψi 6Ox;A4 xbuj~(#L>7V00lXxV@c F׏ST`5q\@Še|'BJ@jw:i%lXL=(X{*ܸ 31`ZUDfuØp^xܺw_X6rŎRWq |?ub2UaZ¸uYPq]|U,u \~NR .*8>5*Ad|LXgGxfsX*!ŕƥDkU~_F<\'-- ^ަuP -&id4- d6ŭqd~PT V>J;й(Jf@v{jU ?IBTCCkWp L]2>?PA_p1U60u)X/C'ayfo \V *^mmh;)U -Y@5\A P X g\,(rb$ Y<-W 6˗w??vk8 3Ǟu! ]JIEyICA,,8cԤ%6OSJ8y-/'7|-Ly  -Pn c> z(hy!5!Q;fJU+$\l2%G]J -\Q^]$+w/P(O!8ZBX3e|b6BDZLAxxQ,`=59Xp8y_ā0%pE#|!$r/pLyF\j$|%^u FdFNW4ȁ% _Ư uսM;*Sofn8do0r'd@ L/Z0n<+S6\ev|}N츐(bKrPe<.d#pݲ-~j!lX0X7ij&˸tauJ!P021/Xl?dQbXmy0P-@E>P|9kTV$}eQq~jVU ->jpSsJy8eP|x]MԪ3Se@SPb\-F8},; G5\W8b3\S9G\gs8%!3 0h\dmnV. 0|_VB?cw\}\xfe$j,Үp ɋ 5yC1AAD/髀0opJjʛJ:R2J =0vQbWԬ[/TMD8YRS8ϋLܐa%F2F5 -k1냀{Prz[^׎*5/| *%RU?x!p %pk0DZԺBՍ?oڣcRҥvÒG8T?A?}>0 O>%\D"_:(fJI堨QO!lW1T8sZCLodfXEH0>NM )ʖi۽@ԯ2<"GO˔e${1y{oʗ.$6 -VUC qbC@b>S6t j,B/Cn^gĭ^ b|Sx:G8bҼܿk5keMhFRX:1[w4L8UU+sb~9B @2?MS p^Qw,ꙕP`살qB'tjgԬFŢ(P6 -%֟qpNq1*(l*% AYkDxe07S=4PEsP#M1,g&IQ}ʅהc:y%RV7~e}? wc/ a!0HC8H_i8r^԰=(?`|'npJũ|l?ŨKeL/3lQ<0%g㑄S'fW%;G8_JWT0:X`U |G"eKnns [EEVnUʕDȤ[ȸ2ؿv8:gY{Bj)C셉K|2l!kvUxnN.qҊPT.xÄ% TxC*1P*\=q( $D'fNv!OU~`Ec-ΕřemhTZPO:}3(V?H@K[Q΢l,i0c튩lň$d JӃU+T{epR5ߪ]v=m:s]]ᙩfXeI|JM0 ]Uhɫ_6]L&GߎB2\S /l*vM_ vw.uVR D]K'4G*3oZOp|ELt2y_qp5䍢TByd&,n aVs=OMԖ LBY^O%uvAm'~ }iv J{qU4F=@L-0 T86ୟ0lESccS0s \U|f__^mᦡ=*"7=̚aj׈p[ =]iUPupЈ *u>=>|}uـ`R+HS\kk~bʾՃQ=?̖);ChS!Ԩ鹈cRy549(Z/C4 İS6S.ڋWԤڤ\XL#S'R8f: Hm_^-URݩvPl~څY-$fK aD@"7 Azn<-|3m?YG4qޗySLWd?ז^!P^M7;c1l4;TLnb==,c>V ,WQ|ƥKڧk;TT%_U?(녟p↚fx!)! J=- 0`W -{gzVD - ,3 ߁~cHڭnhWHL[ -v4n;:X7PLWW|Ō&1 .:.jʗGXFg uӏ:7C)3U{YTt8dcnHbFM% *|7Wy2\nf2[ >,v[-TgxA1Lz\q sqq W )jl` L7^7<\\vp8~q._,j \VuC-LSQ0J&*mmkE̾a&>WMA )!h? -_XS9*bԹ:TRm%+Iw^9fd@+e 0>3cFkw[QmLx|ȍ,dπu S?γG4E2cV/i;#>5K]a:~h;6"CV{ʄPXfN[Bq?0,r qSwv,bA3Ôx-Pe3wc{r>< yT;%3MpJ.?C5D[~-B>KEa k}S\nXuXqygLT(lkCKjTF-UqޡL/W=ua1Pɭ{]cYmYMFni*mA'ᮥ%`<ȗW?,GJ*&Ffx̓*XNaZqI%^'YRV*UP㛟q -X_=r|yCP+.Mb(CSL游?%8-巎\w 3^z0i/ſt;etp*nZW%LTfukD]lS\?P<pDW,uj33Opz%RM5o HGvW`-o5]kK*MA"J=JGqJ§sG&?`m>Ny%W<%qfnٞx!qqc/ś(/ogQSf[{1azh-Ćp&XS9?Z9|uXnuq|NO|]|.2ri犉qf|]W,7+u|lj !_.yabDn?+i]+J2QSA  -ě4ĭ,+;]‚資p=\aL2ʔo ڑ% )fwkG=}:U9.%3$`&=2sK {'rʌxj(Fz߾1Ű1ZEp<4u&Z' z`-A{WP_NCR ˗/|/pngp8r -pDeKT")4@X)NƂ{lr'_X -F~\''CyrpKz ռUJ WE֧֯f:j7bCVirQ"5sA pnW*~ Rjw{\Rb]? bg -K E^eV:brv-.^MҾ-]|%˖jb\ڢjJLg:%xQTTlPK͜4>S\BJ\h%tq25E-˜*#&4XP="9RPNm_wi.ce ]L#^j3zyuҺ-#v5QG8\fwu `K>B=p5Vj_ 8.!%q$Ľ -c#w"˨B31RS|Y2 jpQ*_esP7E)!U0!'pGk* bLw1VrqU/z(S<<V}kl"Y(žJ -bێGZWAzLS3Cゅm5=SZ"z`.U*<7-R3Ku H(Y1Q"jXq1PǏDqPò3f'p1~59ξ/y-Q]da57b'b|(LA\ƒp3®9*(JBt j) -x"&%fc KFիR>'3)̇E$jk:j -.Ƹ8r* xu[<i6mu+!mƣvĔ`@=5lxAQV(?PUv̐ g5?`] PNlGV*]c}M&Y fbwEа=rBRȮQ+Q%)Zxj6C[8'i ؟u5vQ = )wԺt0!kl#+"5P -;DzM_pfTD[/[U,. nCf%o$Ca b - -+Sdc8!bW ]k -l&kmSX[#ƱHQ<4\ R @MQ^UQ0C;_P]ʨKܲ/, ]Mŋ+~"h|33{YQ8b)+.P,b֊ iYqQpoQD; sP2Cm 1kA0[Q!΅8ZVz: 4بHe8 -PH fj$FQ\iP+ pk"-b$Pʆu|#ཋ-$yM[pQ,n5#m晍 D\ Rjdfmk]\j׈4l -fJ[e7\Yq"cy).`1q3_)/\fJ_O^c. .eJ.1?*or&@hW3+V7%rs\s?! ^u\*JH3*AyjGcQ%++a kjr]WD̽]b>QsТ(>.K> ]N*[s^(i^A -rwA@ݗjB7D焕erx'u\x`őXb1ǝ`,£ 3rYCĺ;>^xÒZL K,EoRB*ڼww/]BĢ ybl -[rޠ6KQ"T`*ɟ]V3IPک#vj=6@QJSZR05+~hE0X]-ub͊ojRV oX/F&؁CDe0rQ.M]sw~ᅗދ0)r\W!A* 1f8&.5R[7:RƧPqL 5Σ G| \jb|T~\?2!uBUJ#GbrWP\ YW\ 用%K̾sIéO -t}2Lqu_JR -c7k -$d*{PLk _+N 2@, >RKY6,9fyn2RaBZBX E Ԧ>W6[QPO3=ʄ-B؞Iw9Tl1\]kb+qOkU MyΥʋk'g] Thf57b_ӍvՌM\bvSH" 5dk=?}Y҄)+

sy9ԨFS+fW>&Q R_ e -W<\hqvT./0?AZi+W6pJx9^.(5 -G44.H*P|,Ȱ#[Ծ[8'Ss\cSW ʪpi;6m',M3¥27h'\%1#r5"jE5OJ#;u&%V2a4I1Fْlno -߹5a|g\LmƦ׾q,ȳX)mim6|K<8@a{H<<:͂hB_kRXLhZ\FFH45Kǎ]ACbqT%Cަ"|N3)f$(ش}K.k8N*f5jUfhbZ;|Jau/HIT|1ar e\% qq`vNU)S[3$PRuC)Hdڼ+pANשRl}vi,7h_ˆYYN;N]4?)?* ж) -R.ʱqsF¿e*qc픬'J-"Q4qQ.ˌ9y~؆%'1{:dK}4ƹa5¦!S7yj<\FU~xx+8G|ltU>+A0 Ȩ1÷xR8ۛErS:_= nWtWRm햞k]\_w "l Di+Ug^l@=F -0FmA&c|x넕WjWƏ1~9|к/ij.!l(PQx]ReEX;Nr+jmFsï|YpeqPcSJC=c"+:> Ό}Y]`WǶzZʹ?ʢlĪMK ˸_!ݦ%JcAݬJ9TK]# }cM&y%I ]eeRUJ_>(F`r̩6Qc5\n-qL|u7?5;'rSw|9ILY]uw7/\cr"'qS˾ -~_''+W=+qi3&n4?%oQ Y3~y G)|WY1)K50P1UF ˌи%단d*&][ޥPo*7 -{R{|z#ywqos hI l[bR-эvinNw _\7CK4vDīaq;TU-(!/ j[긼8TU0o*Pm-^j,&SQGAHfՔ#\_ j-1|ECgLpC6o!y1(%5< ĩ\301dbJ]DYj n[P5\ԳS{cwqP璆7 0(ϥ{C(ERMLss:.q?:Ng7âhu-]z>6$ya7eMŋt[k .Te`"nE̍XCQB+v_*1'D 늝u7e Gm{Rn:"Y:<2}|s\ws<2ߕ|nce 3eq[=JpL}|t\"gG*\rd\ 1/a|TyxYo\YBRru~?.;|]Tt5\/ |AX@p/zϹ/FJp!~p -[ BkMR0 ^W7Cاl4J$I ⫍7z)tmh#S$5ǞQ]1ZWJ egÚSJ{yxQ]E dž3J;|:Be>U;$qArg/W g|1灘 зC TM̍#:T {5Jno ~>V尲fΘdHGe+.FYf1U|ܿҍ{˶\dod!Ph7)П,V Tp(- Wp`ս6u)vq`-3WUR5Xj=/2+rUKrԐ4=:Y:BWy:P˟]pS) 9KEl-W<f!+Np@t6K7Dl/ Z:a8J"<؄vx/\Uoqx_5 c --̼LGG<0Ilojl[Wee\wrjff]򱹐g5S | XS:6RN AUiV0J0,cqn^{qVk݋uìNX Ew7Ԫe['^5gGz7_ A( OAo fopd,#ljc QJL}Kx,YUpˏ%Jืr C1M[.~\|8PQg+翍jơO D^j~yBkm`oݵbġʾ5K>9P i0 FS`VB](˪E {xVɫn[qb0 {/ڨK"82ͼO # &lb{9FjhEdlޓŬ"ae6"7.Y.YRVr зRiV>h%jcrR$UGC5l9} UPnW -%m0#eKPQX-&Ux%.7q1\yc<ߚEy GB,!jL#RIvqcK,?eKqUBڢJ!> DX]> L2.] R0ܬRhA,!W|D5p:cIkT# ݊[|p}G;[+/o"PyQdeơ7rpPZ<Q8q\cuS\xx0k*]`2; 1Wfk,,m@OtWqdQ孢1 + ן wp)*:6EF.Hz#K`]FS|]ET5+ -Լ@*yeQ S1LjR6AktD-IbP8og,x/iPsKCIBwYӡVg!aczk_w F%V -aigj*_MO E2R*_Xe; -*HJ-xC(7NkqT#O9E5S,Ψݬn; {A،)Hg#`Ƭ6А-Q~C*vE? -;GꙊq_b. JGq^/2.[𼳯\Ѫ&Ҩ251|θrqYZw/e38sq!5#2QF٪RuJb\dKgˎb,L ~7pUp=$"!j/XjiL"ĵ:ܥ"9!Y٫ 3O7Qނ 1%5; w2لD[~tE3TWQ/\*G)_ /S3|]D#TéLS< -upaԾVūA ˚'sþYY_Q5fGB \Y\vL"\Q.& stFZ;3o "]:(jy L]f-`ކ@Gg.9̸-JP"f#%Q ~ n/&bgmP?" ?! KȂ^7v#UN*yX3u` fDJfWKe&[ Z8jĢg3P2bRl<֠LҦ -|J:X hʪ+V*Y&'Bb0LH^MF7wCyGΚU+YdUqҋpl"^ Tޱ -^UR+ qLG nT;y~~IRd3atqǸtˏ`ˀ;p-aDʍPQeDE U 0 p"qiwbgxLrsGCªbhpS<1GxA1e2_qu!A>9({h6ޣ/;JtGfmaUY'`e -k&ܲ,s+eT7$DTcu7|${qREǂ3<qO)[uLjΡjG\W\W W| x*s@1-w/+Σ\<\9oo|kG w.[AdĚ8W/'c OLgF"5D>e.%ĊHQkha`jkk ,5E$Ho BdiXMүr鶛.?9Ur0_Z.12\^fUi?ES)Mxy.;b4k0ŖQeT:D̡ 4+Sj˻`V/h+,w e5ܭ )wlȏP(Uِ~Ӏ9fKr -k-'N(6 ZAݺSd[a5JVι@ku|Sխ5;6S3|*kh\X>`:r%()e΁|cFUw|4|/K* t|:(t~raLDޢ -NArˏ \\R6"5_OLJO'ؘZ''  &= VkGA#_#٨[P:*GV/p `ݞ`mT?pź_@]oFO .# ~ AQ P+f(#s\\eY }6[债HDG1b2 bUqԾ d{aJ.xX1 ru )0 ; k*WŝϿΣf+Ȱ`6R:lgDs#yps iBԶ3 -5\W$Eʚ߫EO-Ńq7RpUb69% ޠB% [Huo(P=E]=QȰj_M(J4X R-Ye;huDCW̠)rxp|]LmAsP3(rԧ|`c{je Ҹ-Qr8~P=3d[_KH6MΤh=K_7Α@R!}.[JRxK R\n`3u%b\1uXg\Q|ԡ*? -PHG˸D&W.\r\UU r2428\+xcb fe?geb5+^?cR.bVÏRaz)R(_1Qd.*e!x1t[F eڂǨD=(ُ/qK|13ťֹO%;jv~W:eQC.&y\M\;hLFx@,/F,#1.^8;n%rjXmx?48s#*at\UP* -/mG6BjqQ15 CPJ`6[TƂ=Ql/\G|8ЍM!m.*_.yeloVM0% %(&eb_E"R8ۮiQ@%˟J< Q3q#xr|pWdʚ,ulb_7%yRFV -Υ| R~%ćG.Ä-]|:1q Q:cLB\g 2Yqb". -8,p:Mmz.5zOj rm0Xi'epDa~'Pm3>" ZU.Sy$@h6*9j19?u zKYi\PwE\ RMf mU, o-̗*hPXUNm<-[):2,~[*bQ1m:4"/) {%ӿ16~KCs3y9V&o=k(J~Bzr|cQΥCO2~O$\$pr-B[ƒc8H{8W¡N.0RW;[C)y&gs>` . Jq\\s@H Ab |U{ % 7yދy/ 4D Hsi|"u -qXhkN.=q|\i)i)A%r6nnxupf eyEu*U\MEeUŸSW.;T=M%$xHbr˨K0\mZ;Z"Q{In\nl/OAO.~\}7- -]w,*')F  cY˕=&.buKBu̮Z>DgRʣ'rV1S<1M-ĿtVNW#|W#&nհ$ -6T-]qv30WQ>ާ>4nPf ,.+]%ˠ@k1ID4(H$2kB:.*WK&4ٱF̡epo6b Jpv3$*7y,%N)StJaҋ1樿(b -bL0UZ9q%Ju11,x>;Ŕe*fڗ3-Ep\c0v 50!~nY:DIT!Ylt~f$"P,B;o̚7,t11 -嚖uxw/⻝%|esqS>f\TўB`FNɷpܹpK`es\Qx/K6s˝K1ZL zD}叆3DJ7O~?E 8 -Bj;P&wOUh@ H$Mе!lfD)k:%2<K3r ۏ.#;&D*^%=AQZuK@{Ì\ |:ܺᰩM_ - ю=FTI\5w pPtr~aP[ ExA ̩Rr`|eב! ĈwŚp5Jg;_ a} PfN 2@x5Mp1 `\DBVs}{%,pbkQg+pjYXxE- tExquL)fDb[%L -LUZ%BcK}]X"nQTf:xQ*sK8%iD?e,d2UK%Ր .>U)b4K j,)3B 2M؁Uo"DھAoNZѫܥ(KnURWɻx ?vqli{HQgX@=5 -UK{xJ7 XfH\g3YY%\JBUH* Vyi}? Y<K9Kb8mO'7+!}OLyĤ0O=Jn,+H) 1t/5j[d#݅LGvXI_5WlIVU#) w-Ӌ`,xQ6u^UQbP+ --tYN'vhfyryM5ͼ*N:TYhL0uMgqn(|<g78U"_񠫃vv]qD=@a w/?- q\xcEn"g@tMʔ]pnUoL~J}KQLfS0u%qWܯ -q\J\hܻb.mD+X.u.P4/ -+eԻ,{(0KO[Cru^5ΔҞKYRi/]-)ZTReM]/̸fU(5j 6m[22qoȗ+B pԕ;;R߯-G_Wz -q|_++.xXĹr bW2wF%F+fjV"*'OM+<&EU@yC(ܫ!z%Y%-+hODIGPK(T0UFLvX<7L"g+kL+>.poƢ\5u7ȕxJ?Vn4pUpJȊ(-Vt'3 -ʦ`=,juJECᗸ9R`"Lep."mqޢv3)^uȤ; ͠#$a@tJnW J9! Ri-?żZ.ݽHD@ -qLljVW}[na;*j~⎦5o'W/ @(w3ƢN@ޣsHu0b胄G/bUԴ Xf~!w0dzJpX\p#֭w},^n,̮iC4Ii^ -ژjd "!]V2^N GTJg*}űHx0, :mU_/5Jpܤ<I-O> AATo؃V?5 -(h|,t2/ox>ufgZ$˹JJ&D ?qA,:-^ {~薴+b)&~/>7,R5-*pUe jsyJp|iTDBV'#m*˭iuUtNʍ_Vn_Öphy4q녟q aC -/ ;^!w j(\ UWES!}ZV*'wrMQwi -|sNO2ɗlj)v^RxH:]\SW-.+x}DEL}\2dO9ܯUqs/0aF)P9մ)}!>Ǟ K&'OD] -or@GsH 1 xup.a>*/*~e+,/=StTr kʁ*zv\eAhl2GhJa\jjP.QC|ln` '/Y]Eүe*>J4:".jtP3P~-KXf+Pc E4c ŭq;+m~ TDHKĩ]s$nco$KnfL虗<BO'tY2Vv)~Uvs g`vntK\|?ߓj_DZs˅BvNj 3TNzT.Jږ[o\*˟S,v@nd -\~RɆYtĶ_I|$R^jÖkU/dٻ-s5da֘S?&Xܕ-4ǻŸ$Yn3wR0,\BHB -!}BK)qRWY/L!_MAAD4j]n2L5ԸEΚnjG&@K6 1~|@0,9$,!}*;4q23*\.[C6Vcݸ/z%Yx]uT4eWW;r|OckQC⸷y;+ f;ek7R8\G#2A~8%s+hW/K[zbT!XZ);)ŵP:z3-eHaY \Vs1);R\C;PhoqS5-b28n *>~9z"HzhVDƸ5QXSkˈmTm¬`OZwPע]:"F/qXC|. TQվ  bbH<p~l??/J]uԸl;@?dE_"]KKx.Y<.;w(uISqp_8?fupp~8.;i udr9YL]1baŅ\=73/kp4 -ż\7qg"qQkűQҠϡ.+j"}Ib䢀ژWvOv -7G=OKH;#kw*K)O4WRmᓰ.]审3f PY."Jצa!4 je0@+2P?/*S T"L/%.p|.%UT(+@q9cu1e=wcMKV{LvE HQ!K-Qs 8#(ȋab ؑ).3拏/yQ;/w+f+ ._Wb`3x\Á2N5)U|:ˋj\x%GEFQ}ˇ1'\ иf/ Tӊ7Կ,.R|\, 6 qk,g(JƉla|=K爱'W,-W\7|]XӉtT٬ǂrda]Z@+o5pp!-W62[x1&<+A]xK%'*B-jTL.p@*og -AB:| ~ƞ8Ϗ):ħ*&}_32u-nd84@XAe1j:$T jv +t?R{}CϨ V_oN陁1稹E*\bYv,\<1 SwY-y%S4/[ -ipqV2 w H#uޫr-nX,^aXpQ ZDsU[,TJ\kGxľ.{8J8W.TqJ ^;^kx(ɠ8'1<^# - ugVSu|XPQ1qmDlj|JN26gbWQ$%E* ՃS-BTu #1 XT ^@4]R㢴ׄv* -OuB*<;e?2 l:<O$@ehWT9#)Z|<.f9J |,-RRqu`L4fMJ/P]!<˛D j{. ゾ :V::g>Q"0z@yG2/Ļ.^&iˉ(*]-<]RrgCl0iѹ%#udulʵW.Qhl}.m51ۜ@L XKTp7bYJNt'0zUSe弩EƲ,^_: >DܫWT˪U8 <9W N/,`~|pEY8\VUu$EWrBujZԳ"eu0U-<3ߎ1ľV?DA1t|xΟ6DR"#H|t\T!/aZGsDz QYcVhSP%#/lk -zO/], UdE@P-_F\W8q8Fk8c)|&cKgN4ܷw̙Y";VP#=Bqa֞ɿe{+{HlIJ=a.@NՑЈKļ:uKoa #).3ʙ_2ӊ"%b"J:jgA}pW Pjl&z \?<]-Dϥdr(f-NF17*#QBf@H\ك5MgiT9[d`%4WPMBptdb62rnkːO5.ġGګy>dsf?T&cͤ$&ԕKH'Okn~Xe -m : q]-e\ -}3P^qU!M{jG*')F|;)3z-mm #]wF& 7ԜI@2ʖ=Z.!fq,aڋhTGFyET¡J1rW/]Z\:#r }:K+1>@P~Ko1U_\ _҆BPlj>At}*CJ>)/r.}Þ:,~Nc,Q? I|$%\M$ ^b|6|5/K!^xc-usHwPJs|6_dN#ɀw~B4U?=45?A#b}lb}EƯ#&KRzmqd`u "K]r̬Q0&j'JJW"SLZNwaMvq8<4nS632dZm>!]1/2&8K81} Xs+$#`ZJc@u2]K- -a7Z) ]dߋ}˸_~S kmHkK{6Bd}FŞw`)%k~GepPs\8䟟^R %8-,e̦IeN^2B`T ~.!*lxb4er .u;(S늋>G̨lquq^`S/#1E. MpʨGQ ->b1iܰزlֵpxfLnI YX yVC9. F xI`U;X'cQI]@Kj yhl L-0Tݓ)h,J9&ZZfs"b)]grn}Wc(liWKIcc+V}ۼǸ˂ҭ -~EnU|o7yD~9^e_ LƼ˩v,Üz*?qTR'GU o)#Vx -ά#j*2^׏ @zkZS=[~uQ1@5>J<ZlEj}"BHQ\=T~m'7+DL#@DL4܌*`zz >ao{:`Rl"RK! \0  >uFǒ1.TVe$!H1x8>$rXsh+\((OûԹtJT&B du*?da(ڕl.!P+\%<(LU)c+q4-oTv26p,8w0K3 4=E`55QJnT+׉nfȉ hӾ&a}A,#NpyȰX̬b\gR -gCfơ3*(,_Ƨd9K@S_4_O쥦NڅPFXH"QRxf w^FSp_idTj@Yb-槇>b?2Tx6#/45ᖐ?inFZDݦdI6Z&EJUNȝ'KUxPMJy~;:g߶8qtV@GXú gEU,LQQDbDhq-@|рZ9!ԄfQD.02sJ+̉Dq-" 랋( mv|(ᘅK-]٢8*zқl4 -ƟrpCȂzK7q3R -ʪ D N.HQˢQr{!~A8Ov7T`0⍈]1gNQ3kh 6 -6T֥1ŧ$M-!|zvH&+P¾}n aBO3jWqf5xjX.u3 H]L;w:T>8z _\7q0ԵK>ujh?r*{^ iy)=|S5a`bE;Ix_.Wu0˥KMK)#j7 -N._-` -}:x }Z.YVQ:LCU1ʔôn10.=-(C|*<R YRݴ bi_3^%Ar .e 6}(^(f8*j~,E_HPVIώz/ǘ6k\$@P1nLdT> ss2h_a -2V}S7_9uh)'N`jIfþF;cfɛJC-1?p<_aHGҀDWۧ`UԤBǟP]JfҼp"KDjǣP9i,~6JD(-kC%:)T rp3Rq-WnzqV\>.TGހGR׏=%DǾ*  wmP552u3ޡ=K fS zb"`<7+W -%>eaΦG]oϷ6_\.恏K}Mo A:( mQ?`TGwg (W0pheU1fybE;H ނ.bj+qfïC^%A:@a|dR8%T 5f D Xŏ^k^;翂.^eH0ux<bNn1nXaXj?˕ pYhI|bhO$`PJṶ`XWS\d,5X8cEG[A֙ovKzZtJX1IQ$(Ecky@̍}T-ai*E04-Ј23cwYZk% Jw֘\ؖ*Ce#\σn#)u-,XcJJIT%\\lޑ%?u5"^U-&ƮWlc/p50^;?3W p7ɘqZfgxv;f0ܬRK%l^}Mon+1:H8xl A)INѿAJ0&D+ ʿ8FGqň#O'B? -QV^@ K?IR5=H+UǩAqo%p7\p|˃3ϯ`U#Wۡ"%Bb*n7B)hajE}*%_@;C8KF:umTt'ӪGM4tM:}.U0JX݆^Fغl.!hbo͗tS(`E.-}FiuM[cZ܌[$-3dy]s%Y3 7%ߘ.sL2_"F^YR\w^,*|: - 6oq\tp6D,CSk~(Gɐ}z g - 2~_:$ 1p{rKc Y ^"zL U,`Y\"pt<<--|[D'>F]L~zQu 5p\V]E,W}3jƁ(q*Lx> 7/<%5 WB~~]IUWa~YI2= ܶ1TU`!eAZ&삾ԭoMOYtǔ+2Ŕ U -B{s19ĺ.)/I+K1' jQ{ -¹h>vB9p.c6(LauP~o6$/*ߘAcaub+R"fXB\ (S+k1n8cw;8Ap ~R^wHwu><\"(#'P~oԈ\W}AawukfV]B}U^u"GUFr$e3|RrrM#⧂`5`eԱܢ}DbIb;aؾĢXE*_CzeG EKm_=Qe1 5| qx(jqWf40PW9ޫ}VZᑩpũR]=P7Q[ԣ ꋺ6[€DxqpžeԺ|O2N`۱TLkj<]AMPʲan;P3[cKqPUS+GWl3HKoh1?r+3)n^wŜx<7U{Hߏwż"BįތѶ6bSpmy]v #:}:,! a)Nj<@Ac~lP[-]c?nY>]-5\7pPtJwg -uMPr/kDTu$n/r;a-Xj[̈́}TQ*>ƍ v f=m+*T̶hh[$Q4zndʘ,DU1԰ - + K!\j^J86^q*+ʕdR)%00FS1XDdt3p[cEZ<7XyǠ_."SIX|h?)W1U[ ?mUDbΨ5 =|rRU'^]3P K;8ebVa+>+%Ҡ5,7\Ε0~k JZsx]DB؍5UJ -aJ,$y5Up: -Q,^e((M ,GP k/zb57ԻL ܹlS2CD*LNGƸZ pMw7ܷE(o늹Q]*y$ Uyc"p;I v?i쯤8;  8(p>`mlل|9NÊ p}ó݂ =Sz\POpSbv濟aŲ̃^(Lf˞K .j"-R, VOd5lw{Cu s7Fd=vF|B8$f-Sd~Sd>x]"\; -겨 8R{9yWC).kK/3Կv j\|\uhydU^wZ!!Se@Au~ CPo T9e_!g|XGU_rӼKc bXOm׳ser%Z995;]G7RrblR\"6"W\j^U–(f<~i5pbF ;'?ɚgmX&1D?ԝ^?`o%̻%UqyEq;G*ˆ\n \\#G(y\$(*K`>Ub6Xn]EXF$bFJQ~m$K/?J.1Xb9YBUhÚEKqN&J#iˁD"jJeSw⧢,2JĪYTF/I0fq|.-fu3 -NM]8⫝̸/0^Q$fqԧ2>M쮡eyQ6,x_~|j?*ϥh.;CP+<\2ȡ* c>>GZmK)[;}#靷r6 K"E0xAͺK i?1]̃ /\Zzz`5S*jWp1pdcLY=IPbfL欋| \/ir (!# 8Ҁ-51q+$}K{|[ˑ_hopU:1ys|n^#du-{%cdZ&1/JOM$u(OsaVbp>'PssR18OԨKe5eT-" rэkx;Ke,|u??]l\1ι a<ueKX"@T qa 7wl)Gr K%Vpu X:b>IpqaNi*{,!k\0 cAhy? Mg჊LE |oGo$q\H.?S "` b.f\14|_`|pr3qw :H@H|ZqsY낵 wW5O'7a씷&Z^`6΍>+'zXoQd#xEj A!$Kj\^$Zv}+U`;{ k{5˭5rc1쓆ot/Cn)vԟjYaw @.SXjVw)7VC׃P/s 1'ZE Eݞ}`P$+PV񵪾TK]QԵ HX4$f_Wu~ ^qbu-ᯅ>~U |wE|~q?y)Xga|JJF+UYy"ÁX1: `A_!u_\ L)rb2Wof5RFv0/rqYdn00ŷ|[PkX@\[8^h2҇Q!xÔ!n@яEjWrΡNJJ:}F,#|SP7R/mD2rn~c+OV&k&G/cC CWW±vqR-#ƌf%3'%n kmu) ?Z~3ҭ\LQ.\3jٿUT?#a(=%왨m<hb9' B݅@S$Q=@[FmzVffeUƨ*QK%pJÊ'S6B -L8%C? YL>5ze:cU^=TpL:|_ó"U_^^6{TnzQZ ~~E/"l;ޮ%oszt1jW;h Ug@QQqJh!^?3S(r~WB֣-2ڦ DIK=rV0/ԉUR}}%SX2 w E D^{J8ڶP*x:RcoԹv4JaIuP<Ξ*2Xukေu"eKr)VRejdbQ&: -zƹ̹{<ٲ_\V`|O_'P5*2W pX-DĪ7*2AD|jU.1eÊI|2\ZK客,[FV2 >%j5ˈwn;t -,updžHTͻ% -Cc*-F3h) -dntK{f~Y VJPne^kNg\U1 -nWlDf.[ -XL~vC3.lx_:Tfn\x~fɵ Wa\Wj)74ooX0Lܮ+|6wwNR9*BcPqw-e"TuqRmJJk*_\jgb&h8w31Qso˱ߞo*DN*=~2ry% CrK"71U;y R1#b>Ws0f{N7=~D8yiwb3/ԋgq: @_:m__ÿ`_kJ"uxw\8?p*s: jcqSKܮ - ]K.(\ r-Eqk$y}ϰ8tU\b] A/7ȜzR:7LÑfEJ҅P e?G|nKQ38zF]j^ 𘀳u޽ƒ[U7xS\gmO+ )"쮩'3EW0Tԣ2ӿzYPsفcFogJbTS's3.L[" k!gЂP~"+f\)IRo\WRb⌋v>aߖ&QA**V9x8.U~ Nu|/wŏS.a\jw._%w+\`Y'3W~/Ľ)V1+51!FL -zxv_4ᶘ bp*Qgq|tĕ_ -y~]WʏS+ -p&̫5*3~ep3[TKr}|SS`0pS/80#Q_&,"ZQ̷1{s)ۃ3C:'T| g9{:P?QD֙sd|Q$_V/Rp:ԁl9'O#Ww%Ar4K;R E-+A=DJ^ ,QZ*]E u(S#)h\`P.J*TÛ~1+g-T=a\'%nA{:o;Q4;*"pjjZjRBP,KN^⡄k+ I'? Ua2]SeG}(ib, -s-k -[[7qիn,6#T -P,6Lo#gı~%KS$/n]EM"*-Ȏ;/!5 f&BA!\QܻԾZV"FkT*̪7!\3|q(_f|\slRb]L398#?|ˮdU>'2(icewy3FZUp(I{ ):Ԭ@m@OЪe?/% 3Iur,[ƕt- -n-P)H"C;u6QJ &qp|W(x`0|w  -t`]L -]IU-l?I3Ɵԩ.!!8}BŞ #l]ˮk6#yOS2Ce? m<@[  J4QT֯l0RqK3ƾU+akAlGmc[zo?ZʔBȖ.I@󌺿pI[3-eX=QE KI`uhct5{a,2b}hn -óbIj{12l|ܸBY75S=yಂ SE33ԼžH\[hvGQ+ʷfpLP bT(,.*[)2Ëzu|A^_y$>gX0q|a a%V؏Cnd~Aww1G>t$LPnx|4|Ǜ`TzbRߩ/zd(+/<k4g\XLu35+~5: 8uWksB ~ۻ,q~Ȳ~PFlNWdQ];) P:q*&pD'ot@ @ceby>c̿lң=N60B~ `fB;bXtjHIхmc?7Uq:%wٖ'm[,YB[玉uR|] _ڟjvp a@Cbh<ܕt E)>6.x_ sQ.]05XnXQe[:c}K\X,J 9<-sGP,7/+xIs3/4a/\yQaܲ.fxn ,&+yEA4cQ]K%K K1܈hVyHS|j+Pef!{qSy\i*7TAs{stCPT]Pxq?u0t"(_h~ ?-KQlC~Չn,[_F&C]BѤ[}R@;A/}(-p0!& 4D)L췵bB?d)JF.PaKVH%ь4n8D6j? {LA'gw+D!m/"2W'>]U.]lj mȳPsiTc)Io\v@ \ynhtWn|IH[%6𕻿>Qc*84J)D?QԩTle<|Y9pYh,\C&4S|!1;,c"h,wuSe$ R ĦDΣQW =b(V@cSWp̹eVƥۃRk @PO ._6@{0y -!qT -@Do ZtĠ)g0^f-,WC -_n"Mb)C{c.ʏFZ`pKaEJΠQ |Ì;c H#Mb9 ,w(o#myfh~6&Ţa_pG,[|*K6szݢ?gCQeR0.\rQ?|1pW#L Q1l&5aU򈼄IY mthr/ԦPoY^˚m5U})PC^306[/KP㉪MUE:ƐqQÿy]|jUTx׹U._.`EY|R<HL"ۮŜCdʼD5\e8U. 1P]<8L KupP3V3S]90>!nW*05O\~`W.\KF\#/UQuq(b&o8 xr,OR/7g{nfz,,Va.1\zW2rvJ7]pdR\s Mכ<1Ծ:Fe⑸-pjkqP к-x8H wB ^j+-/*;%ZN|TSQ7ndFG%B D@@PBXVYbpMJ4īOo1^ z -'efao1q"Cqk踾"oGt:'ү~ l+u|?TG*UKwbF7pMJavֿ .Bj8& vUa@z)Y:!w`ԫRJmu|FکgWfuϻrİ/ԦY}L$p _ r_R`U8/|+0 |Os+L%b\.|#6(,GX:HElAE N~YPMLWT_ƊPB %]Ap^e+5 -9RrښvØPEl#AWRY3N*WB\l.zA hIQ'2^\@ -Zh}qb̾/s  HKer -VueEEd "sL?*1Uܦ&ylpd20 \WTP.^RԷɐEvJkԯ蚿ͤA9VZ=;>='U?@nd+84Unm2EH3@o zM5at-hdnb BP_`mT/pΡry<@ LA$<\y l̴1l@ 7Y0W٤OݖeyhI*h1˟Qi\bz%G*}LΛ`慧$>:?bnM鸀Q+"%1I1mTGM%5ܼVM%( wM@b~f1 KO[MxbiW.8 * F0\%Quش6-:Zƪb9ܩ# j_/T'g넬F=ǵ߉%d nh?D/VtD!+URu72J.W,?]|nW-` 9̀˨ny/[e]Ke -Yf}|ҮxԢezjAUR-D#!%@Ahuܸwd%p '20}"bN/+$z[dRc^ʡH hODwC-XցSZi1w PaM2.bg0Lʳ Po 䰝"W)mD%@W7o&`A)c$c,w\_\f8Ƨf%JfVn;LOrlr,.k9~ R5o -*Qjq,,.er7^LS*T\3r J&,CG.Gs3(!w2o7^ Rsx0R_ -Z"<8x1k[3q|RۘH,]~ aDfjgqr5ַtw@o~_cє_(}X%QKæ~?4ηWh.ALq 7:*ʀZBakO@=EMW+tbX}DX/C6B .T3/8 @WЕb++],٘rxG7"ٍؖܖf#[)E츩CWd tk;feƈ #+BC3D %Ƴ>%D R =`7h$TS1zV=,ERpv?<] ԙ:UmD*P(\}̍p`26$X2p_<2ʄ])T[ -U{a/1J,ͯ\SiqeܹYhs*jz_1Uɩj#[9#6:dL1O2ˤ{RNuwhsrixau*g; _(7o.2d!|1\Bq 5.5\4ָM1~gPa<;⋎p+O5(c.r끭a\qmUWܹ?Iu ~y-x#?|9橃G$F}H8&茖"~'x?L)A0&b/ + r>H0NM}* Qs\_$( taF΅<+A2IavDXǸ E2{UD Psq$7L>"& ChiV+[)n^T8Rxj(Rעqift.bfq_P>> `0WXM(n F^/DnoeRM?sJ[θgW£)Y>~ TuU*|r{YXh4}nQujnRaI&DBA .S;X0&:2TH~` -)șNbUL_fk$1!ŗ/TFT8B? }poq -VU.%YK{pEq|aa,%4#,mo*]t<O%!U*_6MW, xiD87\ 7y~)/D74 ,x%T8 -rx]q_%K[&7>l -q| Dw5xID3 24 c3Ì˖&z~xs7e̹uK"Mrбڭumi=Ho\}{ՖCZ -Ys=iB -A4ÏD*k+Rݼh`⒊(w#K6LFU K!<Cq^ʉ 0Ju4.VX~UƳѳ2ְEBM~c8ЖweuS WeC\~I%66&:9H bUcro1Ĵi%C5ӷdi͍68Ir\kпu* 'r۩VQW !` E!*D!z[>iKLՋ_zgWxjZ!zP lVd%暂]JϮ.}Se>2&j'ria`S_bnkCrETlV<:*{F6*KV -,thc/nS*4-)@|aRL$:?WEVx\*i m## <5Y#׫ȜuqvW#^q5ݢ¡cŭL[*C<0ʕ=㛯zΗtlFx?݃b(bm(CCL+qĥкm5-lέ}RD'e~zo|ӽ=w:WFP |p*Ў/H?ŀU6!T%VKe<zxC.|=ffBˢЛPdZ8_16D*T MmnZ6}Ldfa/p3!/sj+C)r\m*:HIGW\83-X0mXqΣ3*&oâer{Gxկ5E\~K@6o-.uFg;u)OTxx `㿅|.TaG¥}L7QY|&wPUKS8S][0~D7)v|1Y4%/SFucv/GQZhۖvÆ4e1 V c|3DqZegZ*VfCUVBk(|1D+RݯQic@go [w^i5}&wE7S&PdEm[J'E/C!p^ )]2y(DWˉJ&Y%\C(=ĕ+P0U< -X5MEAp, l 7P_{| )pK, KL؊1&S"}'D PтTT Sy alʈݱ.ԯr8Os d^ -\Һ"h!CJ P8%{QT1tC%;]\Bv@|źf<r$RTGpQ+M.FFw y\ ]t#~Y5ztˊJ;ep|K~Ua@߳$œ_sܖX -3Pb~# IT[ [Qܠ TqHqCSKɖZ -T |K\B]]Kp`1D5_J.cS_"=9XBFVk\ xy!ǢTSjf䖩 P )Rc m~ͱyJF\\:QxE*'(Cy*ٲ#~ H^|2r k?S͔5Pd̯¥MZ\6W 8Qnn0*[Zg)̨_PRf8\'%if`m!+R.7#uSĦ_QΡ qo >(G]W\0-* Va/(qP( ]R9.9`4>w1ˮ.Wc;[a'm:YOOL.|T-iޛ%SuR "G`P6hxT(zd>PO a/ PϿe,@B+J_"`I-e#` ^Jo0sG}0wGm.\ˊ!E?5s4#Y/㪊 S >hAv ę3Ġhn %択!Tj-w:_b`XۀX}۹X:'n!_%,V ={R@h0ܑkQe)آ"DZ?H{%$ڛnCЀl{nxrpQCW!1DiiPǩwъke4 Zg(Y+P*eڨX]]•o ]ԛil5l;Sǧ$|;]*@Dv-76\OjWO6iDͰxM Q,M 0{-!J-fW GnQ;gKA%8y#O.Hjc SRV E;F`SbZ!iϲV6#k}W-Tvz!p~ -mu/<1*%1qncgl/R*wVljrrGU$!9heBαoe2zVo\9 H|G7X2w*0W *wE* smŴ*diz2)T=R ĪFxoQ]35m2㤨A̦2fZ -e.^huǩ38 -M\H*QfjY.#_*8xcNZ` qN~(ͪ{}Vm+^cq[0~jjutE$J.!*<<gJeԪ mQ -£V;o7lԦP_`]U$U"Xq4@|zP\A!Wᯨ=7T JtkF ekd]F4*ˆB䆗1 upb!eдڬ|au<wY:2Q(#Bg,ڬٖU4kqR̥wSYU,r%soavn]Uz7 -(*AGlfCf:5j_,$t+_w[+gP&\9셤Ti 'YJb-E6E1j%@@=Źn$i˖͘l~ݲBIIW<ʵ<9Of?Zg%<|3DX% zE5W.G=`Pi_%]bQI[H%M Lҥ\+ɽF-R'[>" -nahL:rEb;{1 Y~YkܵiA <.\#p*#b2,UƊ䎡p􊻲`x2YןE(0-?o{a+^ܠrTUrod:\A=J-ŲU=- < Oi-Xtx*k+JHhJRfL.kg(aPc+K20fTeJ7q J|C?Lf+P%JN}[1583놸s)x{^](z\:ߋbqYu<2qEw@7n'*^iy`57Q,x`> EjKu)QL}CESgB@Oc3=)iN?zE6rە1E2,7.ݵom Qko ]!@ + OP6ex}Y|QrxxB1N30崳 x:iLN tm͞ '4CQ_Tyg*`T3UihbdaWliT\CS#K ίAk^ӆT/Cy - -X\aPawkV iP Q v'.H=m)0..45!n*(Aol0&U:OD"ڥ\13gt-gY\?$2mD;>{;*jr!LtXܩP)0[-yAnd/l+0 z-PGNh 5Agmf.%|O% -dD/dK@_EF,7$:A3 -pƗ'q⹪wɣwK -lG{5kYpH;'lΉ+DBĔ ԋy"ّߔt#`#=8WLvO PBygNjFfu {p/Qb\5F4- wU}:ܓdt!1*bI]1ׅ&Ώ9kdՖȈ5/QqlEGEL"vB?" LhԻoPz5R4upK"V+/W;鸂JӖ>j30NDՠ4x}|vSc?P*OGbol2+X7K%6Yx˦ kCV{c5R"Z_عt@Htbvm ve+aU`ؔj"U *W @nc-jEzKR V{o#|u |'TVMXX2>=]SiƐZY|蔹LoUݰlߝEmr+=-5?qز@d;%[Z?3_b/DBe`YcZځBO*4@vG02xx<=+5 mh jc&@] -UX<$_`JBih -#BYPR™K-.2&Wirsfju2w{ - iۣ -۽M.Y : &yI -}!Ye5*^/do^O*e+- H'/P^U>żue΢Ti%pj>;n\>5އQ^7 -6,J=:h(:!kp={}(4Y`+-kqBC:eL~e}rlg3b ?Ԧ[nPr_4b@CC7d[|ZO(K(յ<pS-j!N%uKp60Rd*7S|Z!Us{jt,4T,PLL u~~h{(1峓 "cޖk@T?!3tRHCrC,QN£\h`tP!|y!.r/~H`X- cY6E3&uZ8<cqEp̴A~瞿 -Sd8Iw¼yKgܸ6/>lIw.a_fBP*:~L5n•U&ղ\ -cqځYAݭ}{ A : -Pk)+ *JTh\i| 7E/pW7qԦ࣡齋'r@1l ϵn}$?fm] 4,u |?[8RyHTV͐S꤇ǭZi'0$ㅗ[]ruJY3KSM"&Toa@EP[IrK<%Q6h> \A#3 CE5en]e}J[b i4 ujҲ6E0/v,Df@2 T%资Avta<2?LDLwf޺#ܗ}6I#29M`āw"Rwh]FLC*_Q=+|āb+j#"97I@#`αђ1siIg@/] -`+V:zio:_u>d8 -_R*]BbP!*JSl) -%Z[s<ղ8oP(.ڠ,7œ& [!L2,Mt"FӂӺM'}piWFl3S*1UdfVt25U,1@YN>!SW%s0!n3~cg2%˅TyjxXs)aaXM9 [x(`^L܍?̇"E0Y Jʺ,-XO՗%#SIsbE%1lkP&HE%N! #kzнoq_2á 4, -% wP*Ρ8e5hh}Uu5Pj (pen+[˘[nYE]ĭpW,uxj;q}衖?IGX\2C`^QF-gq*%PT~!nR?ۋj(S#q.^ڟnZf5K!W!zK ^ĵ}33 /jJ4'9kg+?q*1bkL_/.~IҜ<. Q'Ddh}ͱl-~y2emT$+<\QZmz;|yd< ؼGpښr%A p}$jJAZbq -qJ5J79)W ->Xl%Լj,Չ^/w\S4fWG+Hk)ARE"jz!mDE]|"NjH wh_=4$=(V7D%&bgiw/)Tͱ#e\-(w-Xni2jd9ltḲmݦ#B)`%PESx^$q"lE&ȫe -~)?rۯ>KfQj-v,v|y_\a;fi"%L*Wt(!g/f'F5Ve{-l= : wPX@-w{b1 WQI#m8.,an3m!hl*>+^6Im ї-x; t|3T;Ŗ٧e6ymK~?ֆfe K~SgH NAM\l @+UpQV)z:p]Xy9bBT4VU\\$COchTfubP&r/MLSVWxV+ܪiao YVNsٛNПg]])}EV&t?%)o-'>ŴsS*0$ĻGjw0$ ~p%+̎|Q ND;IGW!6E5ˋW'/2!Ie'"$ebTCzpirJ{^Si_*fWpHn5lҁKL2p9%ChĹdr6,'qg\ӢHІ "TyZ` {yb:YwHje,zqo%W/4S'Š<⩛ſldXnPStQDfr"[ !N:x?^+|d㿪Y Lr8RQ {oA7O@ 29QT -ͩ-utݹj0p}7j>nh'ƯcQGL |PXn-m>l'PhH,JXjz`7BjἸ -B)vj gt:O*6ų.hWmָ/菈UGb:aqP+1|_/σىr3sL7R~>|LdSo]OQ%%J9IPwĪto5fwpwɥtX:DL+R&L e[bw,< B`_DܮR?"E, }"2!O cvPf¥ @D[ab"U&˖9upT0\rc7Ī̾)|I))F5X-z/Q0Ե(&vh%yi|X[={jᲮ2;JFFP`交J6A7jnP_"ޟE PwQ -:T`02,t - Bb& \p,G:ؔCiX|v0"WɷiVA_bh(+5!R n$a+\V5-B#|Q1!s\m3:nXH]*%6_65FANK.^%;7g$)a/%}WI[Tװi<=eZ7r:?0z]r+kYMF](2˭Bp\#*4fM&P͕En/e\.oJ*@Qe rʼn-n;n2}%'ʬddF[`55ђPDS ||∐3|bxuŚ -7='x<7$_` 7Âcչw08 l ȗ 14!p5 -/Cw0je# -"zIF”P(6=a5iFt 5?0ܯ\|eEsSM?=ՑŜ&Ц^\UAPq7&D6az1%iҠTZD\hTA0n.`cF82nG-H U!fm [i~ ;8pc׸ -A]~+l>( -TbTDɍGe2lL[L0҆2ڨ].6/f);Iz?xJ>j6\ -6xyc~dXW' $ -.HNXtʸ=S\y\B*VT=D++e!R*cqߥ\nHu A.m=Ca!.kOP) \"FQ򚊩9lXii(\OKy.:x72si%30 'Q.dvgAzRylK0j,bdW'a5e "!YR[g= -n[ZeTk$)& ߦY`*r,4BAUi@leͅCJ ~Qor9TEkPRdcTԧAPSq)o2anV+^{\VԕP/?"\ z3S~e+2RWROi`jjLTfv)^Ot(şxYU<1?,\zmzu.@WYbwwڕ̮ƦrL#r:iv֩#=N贫J %bwQc˓oVflO.nr._d;a,6B'Ƙ˄[\b2Cv|s_w -7|xfSqnU2>pʾ]ù{)6`#q@~p63VW0_X/PO]_%[-r.U -'j'Ac:lREtM_#߁ cn J猓JĪ- ~gr'x.y`-Gx4)lĪd篃S Qf<2$vAϦ/H{0v:,뾖d؊ݬU5L aMrF]E2eΦKԞۥ]D&TTQN#0XFMȕRso$3 -J#@( U]+NwvJ}z%<TupE!>ǘ_(drU}7 TK6] T-~Dۅ4ԪTSuKF"Ia5\`Cfr7iY߿K!vx0] )0ʌ,h^REPcq`2q;!t#Q*V0E@]W=2i3@ -UTRX0^'GQ*y~@BTJ=՛e*\~^W†|2MApaN3*]z:ߌ -VtD&5X@U=R* .cMbЅ`h-݀ _+q"&0ub蔖b5RQ - )1seZ~!QWV2y^Kbక?QLKbtz+zDNW.DSNB@Qzͫ(COkl=i0-F`$ -n0PADju?zrBTX;nw=̩^riG@{+ԩ\j?-ˋ_u7_n?ņdj,Vm_ ݿ݅Wl.ZA+ O#' ]WH*X07}u[&` `yuCE"/J4tv] xEbKmVp 3:b N(#iM6x`1HڑQP~wp5+20AJ8urj^%ɺCKxy%G/7j'zmDS BUPgL.1qT"se`$1a &P; ;/mJޘ8L#UFkq@ qF$Q>XT~޴i`ZU~dBBcD9V2T$fp3Ayh5Ʋ:@+f߭4ꠎQ5|? bgF -*`(qRpAS4PDf9%>V6uW*XGt9\; -ПAWe(/.wG|02=M˩'Jg6< -Cc+t76N!2(X -,\wLQآ'3ߞ*ۃYo{ A]]JbטQ^N37$gNsI5:R. BwSYŠに/ΎCiDuT>z.YZb4O;3V'qjp[x%6Be/+,VџmKq!i Q^TL72h.JPHkUw > vɚ쉱R -àrjyvQkHE6 Q \5pB1#S&feWBho]2"\.ejƨQwg["59qD75(@\Gr]+S/zX%*$+M M|6\/ow6]_!#t'[}@DL_;1-*e뒿?tۈ$|{F]be?S |!H)3ZM@W ^炤we[hEm@n .ω}w A:Ltg#KEAޠAh.Y\RWEp*/Vcj ;M"P?Dq7qJmV%<{͹H+fL-tW,]_5vyZmerj , {m$$(zF<,]RQhm :ffn+mRaP؋(%6.eyrYGW 6ʙ T -5eqxk;0Zɣ-߳rl38)+&|Eb]{_-+q\"f ƪI D޾ƙqOk0cq]K5chA 6S,?l@Hm&UTZ! D$Y3Kcnѷ#5f޻ie;+jFڊT^ -$_fX d F R^T(E\ h 鏃gdUJ(<$5ݤAU6@K˂͂իڋ} -T*V0Xs8526@Z,/RN= KǞuDYrĦm?FKQ[<-MeK hܶ[eJ%˕;/e&!LLryH-Ln'Qw_%LiR$D(HoSP"J}\Ԩb|cZcHB\;s0BUSIѺf\\JLa*Pfv*`˿ͣF\<@A%}2_`/%aO a׀ND" ׬FWepԳ .Ct3 )yO,WRP(-~a q+,ޮR~;9{9O2Vh%kXRh\wd`=3I51->Nb$ -¬|/&*"R06Co)CW SfT˄>["8xgapVE(sBFb1^ 1F lI; P|##M40W[)2V1qnX&Pq7\S$$3yHVRpj+VE2q$a֥3`Xc/4"!<:PB#Z4-G8c (xgߝH(6NZ1+;?X}ĊN09Fnj,Ze P7E~o^x MeVzEg%(/$U}yvV;[_j,r|vj -d+.QiQU_ $E׋t>B -{c1WDL +z%sGZJhȧ0d#?PU험ppw1`$ -\Kol+w1 q8W*; 0v6 핥<#'3ZP}iѐ>XɄ<?Cr`o wL -mbp]k쳠S"bn%S 0> .c22:Taqqy7"D"y0l_]  았pLv˃w5 2vSQ`ӓJDJ5qFWr+Xmq<-?0 oˆȯ> e*  Ú 7_% Oc"BWs*'UNnvXBVo-$FSgB<PbZw|:nؠl%^wAB =ǥ V+,hCQ/l`iZϼ-iZmxN|%a/s犽MDrSPpm0x:j7S1 Wp} %-HԵAD 1-)%;J -jH53F$NB;BڋDE{ b[ 9MA,ОHq"ܩR~d̺}EǸWmd?yԧ(4C4+"![¼D| d$iH_ {T<܃UCR?J~y1!c`)heA.ֵ-U^V2~1a*|jTQrbfAY B9[.=/쫠ĺ ޥk 88s0TT2L@L1:

d ˬ ❹Y!1$脦RNA|l i.y{句Lەx%IERv!G3êu'q -^}l>Y⡎)݅Gì 4t%PR"3,dsޡL`@s& N[y\{$11,H"<^9s̢Wqg'@-8-wyqL˟mWۛvL;bڑ(Aݚ'}vRR1- 0-T?\{ϹS|TP(?d EgSlp0W,uBɱ+k/ aF9:Ju0;~&ڜQҗȠ3x욂>ϻژ -@.&9R,LP/K /q>/OGM΁-lsq`p:*ye'W`$:n\ZX}WDZcpWp OרgATċUU+w<~?x',YJL5(`C3vIStKf:Yd_w -qc;_nMzd̛J嘚[Ej]{H+`^K˩y5 Pr|{%|uiԷG8~ ^b2gƦ%F.8厈x4 Q -j0z!0fu*1XL?sFD~Yo*KvPNqBXazBVv E` @ے%&RZowې` EBs> w -簗Rt^8\a|< s_ 5o#Bd ᆭ|-ⓡe;}K~ۨql3ISbB)\\.Sq|Ĉ2{<@Ac?eDr+#.YVv61/KJWl&MjlD:n=M|/0#zO<# H -FJ|QD :Ԙ1jb΂-b3U,+P16Xm=IBne" U"]VHnk=R,˖VeeX=i -\\+?+.rLm&mWT蹎JŃZ@"TVjnY ^[Tj|Iյ0NjUr.aʹcþ7-fXS1/rF %│#7tRXOm$1J#X:|*ousmk*h' UYuи\ab'zf@FuɓzU>ue#1TFֈMa)YJ1pcmm[OKFA0j<=wL=*7e0[U/̯ >h0ʕ5P,xjB W*T*;a-[ _e"0ceFۊ6e"݆5ycWrȅ,.Z*U%ԥ%ԥ -=CgJ;U:JbenwqU'tF73$x.SElz*V dذ ~.˗r$ -.˦5)+><8eKǾF\cCQHA{J+ws\Tq#)"ʌ%MzH̠d[e%W+:cka#r;ߢ0mpXC;E\- X/Æ܊8Pҙ_=E ]fD: - K,n ! }뢺=RB^4Ka*v5P/Wpj! \3n[R97+wǓt+QZh]ޫ˵ -D^|F-3g||Zx13#Ku.-B* -~Gx`U,#P`UcEOQ7!a=H_q!JjX m ]kZ&m{!]eZFU)GCPi.4,%n.x<I 6Y=]Q(‘9FCtЅ Y=ґ#BӁWkdSf^kJ OqxD5s$rl~ɖ˝WZB q*)eu% F-*v(eo>U6B6 *dT{*+P$ _fU\7@, BXj@UL$ctFxX\nPt@A[b?Yg("J+2^ ^njKpj\JAE}8=Jv [h%cEBv7\PE`#ZcH$܇" iV1#Ü WK!LDaO#ʸ-BiZc/+ɒ&hKPi^~VIw+BTޮZk~Yx؍\~xR mP:mU^UqxT< +/UoM6np$WW:)[B4ffT͇F^:ܪ#[KQqpX#0||T+q1LW$+dd0ğ\/ChԹSv#PM)~~O5SN}\`ThpǩoEe$R}4zs_Xᗆeqm5 l_Jhd5jѽE\}!skZ"AeÝ?M`LE|GGԕ_gkz+mkUJ-!u jv!Ҙ_rXɿJh`>. -)4Cf -ĕ5i)(f5 "d+[6F 5п78u$]LݑZs࿅TLT|VΦnw|P5nV$Q 1)(bEZ@ -V,T}5/R8vNzS;}lAol~hV61y/En6z3W/.IL&QeG??3 -"yA8'قʈ,֪Ya \] -z{z]ǀl6:R%yP*y%4p%C'|,2mơ `+m'NԬU#؀SV x1ݡJR¸!D̷Pj\> ^2u4WVJq\bUpN1PS=U@^i@'=%&#/8XI%ӷq7H Ip_ -%A%j(mPGdw]C$w=h yl*i`DZ'n9IWYHbB>ы}.-$[{_~ݎaD koMGcBI#ei.n'Sp -"4PZ[,Ԥ; iX+RLjI./˒`/pOFInp #E/a1}$Vje9LDԦµ gokLfniL> .&ˢYn~x,17-e.㲺 - &Ɫʚ~r؏i[S=jaA.: ԹvoWzFYZefBIT̂)H4湨j!+%\nf^OxSfbVcpsTq5sG]FT^%򀊊@G,u ljhc&ef$KKwnzR.<A3 ]V..UP -"*JK<2\^ - )?)̭Z)P8Tq[H[ -Ul`xY\P+xܣ >h5DSlPSH X[[xl:2o싟͈'|8)! ?jqj0DļjTq[]rˎ#Ej3¦U6jz᦭<)+Wg|QG c֊c6=K҃%.4c4!G$ibpSYЎa|4A:Īj^8ldya ^p.@Ž0 --Gu5HJ7uB+gD|eWR;w3u3wNܷW Ln*fZU\ه.\}-]PYkSU@"I=5UmWlwn[%AwT,3ZxK^O}3~ _ Ib5\S DuuP XPFr!5S+`gem)XvCV r^#U:+,R)&o tZ)5 Gx{C;-a$[S\WqQhQ ^_GtGw\'¥w ;op+o00M'?eFLfeJDj8𚼷9jae'EbphTθ8",׸#[缾׿rZ;T-?7&5~A¢ -\6e -~uٕZʯ2*'_H&Z| aJ) U#]1ABEp2YbfW|y@<˚¹*vGs6|=ciB^qTf?CEL캊lD9":[R|h[;=u0<<%EJPA@iN/ߊy%5nLAI) Kˁɺ`dm^g ؠIPmWԎƿBV}Cp T"`@[hA?f6l V>tƣxu땎; >2IțQBSD > MX~`'go#3q3ݙIT}ŏȬ(ҥp1 K8M6 6uf8^-!%B"7kRL :Nv>*Ct԰XiV8mm =ST_̹RF*/ǨFx 73i[{*E*zp#}<.mA_ 4^fg1 {%^x 1XW" 8^HԣzGqTV-rQKjrr"X "*wd̗~e9M*عp}^'j>,#aEfe  _JOhfV "B%:G)QJK`MoY܃.V:=?^߰"rĮ.Cp.8( M2&.Rn!%kQzs^rB-JK)@XF~b<Ǝ*Ww9gdP -0F9k, QQZH_+&L8ep)X_rKnMtj.l}.Bf_FZ`xRienTU@Xͼ/rŧQR -X_!mbFI7 3씻j֟~K?D J>:8X -)A5c哺5U YU"~\ bxq uݻDl_ߞio)ech0_&>6-)k=p)iHQ~)Q,zLP&;S - -$V|kgNO;e_R9ȾqQ਴%ЉAZ-(uh6/ E -8.6O]7K6=cLGyff==M7+ZmtANDPɂĥ8@ Dr-$ 15-T5JMBHGW `1 -eu*v-)UWEۂvL2/:pr1mDmDYSY,/JM[Uaf)ܧk.\ݏ~MF܇@u -Q.vpicl5SXQ)* NF7PR %To;jdʦu+4awJAf̾7{JmH<ܿquT%%41Ʌ]mR֢n=4_rMobja4U[tUL%b[:>teKjwr'ŖWj0EjO&M+-lid+ǯnor؊̉8Ftج '0AE7",U_X][B}¤ .a̩vfmop|,p|˘8>wP4)F)e$x -IVR.pԂ䭲e2pF-@^CO=. 0lupBec1_r&n t 1Rsԋ?Ѻ.k:+Ԧ!L4N.E%˙SC|3rArUzA_ipͶ=Yk}BYΙ^)TTcT% St.^NRv۟etJ@ef OOb?BdR]Հx^*CF+j/P 2,$o~";ϳ%F홪B0NuRFcuNX!aڕT(v}uuYP A_Pe@M*]0ndRwR̰2hvYj?K&baeq+ųd*#F"%E:RF DU#uB%Zr h閃9Ztcb7mּ9_,aM73*=>w)u+W\6[+Q> s,p.3 (s|+/;X";1|ܳR - +/2 Ko EP}E{J2<Ý]. =(8z~Ze4WeO]7: -qP!u떍pPK3i[/*ĢOpÍqqEl⬤T2.w/dei]ˉxnM2ngu O\VXpN.Љ3"rgM5M'%l7 +DBL }y(q[&2%f&M3Dqljj@W" -gHM_ i3, ق,+-Zj<+J;/8ȏqƣeϖilyv $V۩^L)/A,Jodx#n+ dĭMBsjamtIqj+2ܪ>5gWhG?ϲ]rYvnab,ngĵK. -\TRBtV 렱IHKՐƈzSK9A:Dec Uq}s'5RJhW5喉\keIԬ@0ROsOZRSiՐ(~5,ReX[/JjK;pLнĥڅuPQǸ;3~n]c 5/{V+<+bxߪhT`\0J٨FDpܧ}FDAlnQ#a%B଱+ZE"p#uuaynU9B;*o%=kG]۳bxS;&z!/i[? ץa1`aX/rڪR[Fõ%Yxpjڧ͸#Md TmV#)rC+ܱ @FicsYvܪG/P18!]Sr>":X˫!aw/ֈUqk1GgByֵӞ%HEosW󥻭KB˚Kmgac=Lv9]Erq}S@_3iP?yTKALU_ۘ-ÌXLTa0W0( y~p}b{sMROĶ'x*3[keX7n$Cl^TɊT3]N~z#/gl%b΋^ˢ IZ5=ìBiZcB=0WqeB&g]4p_~7UyG'vD@5 fm;M'/<y e.;7-ku{^XViu;\@N.'14$_:-Lɪ?كlSY|;Aew?&xNɮ@yDHX,08re&W.t_[[S~.bfmETTsU2ŢOz\G/(pDϜxq瀪p0+JNDpS (kPh/5KŶG'Zh4<^ -ų+ g9Ga;Ϟ=y`:Yժe[P_q lrU }Wy~uºĪg22f]i!EUn#Ju3@?_@-=˞vRv3=XТEfGG)-BU -ǩew!QKOD() HcL 5.yK'v?-sk2KR[ P Lap0o{Rz% j3;9aߕI>'K/a -L8.WD⥄sw(=Sd7Y'WKXm'c -_3/*\Ows5{BjTj[ $9qoEAUQo9GMt a0q̨|/?l"ܾ1;GS[oH@D#6)ULD4ɜpPC0XBKnc+s\^+W:3[|Gi Ks}Y.Iqܿ-暷2GWP98e 8/j]:.;GK~<$l"*vtmQ4 *{#XS -i#Mz~,Y|_d/hASƩzDQ~ 0nw="Ҹ&+.%W&gآJ|j+Q(ZLYwJ?&mA2I(%ybR*;+FUkNqaɩPZ0_Ԛx萟C!M^_y ~+,.8*de gu -pe7$7.AMqW,/y;yKǂKY>[@xPG f;뚒7L44Niw=wv0UZ,Csz='vXXʗtOA0٩3*=gEV>#*XYNv]ADqH;imv#3iHhPA:؁m@DSћ%P"^騜 ._S+t=\Nh1=K@B4\zni3pU -&VYx !y4Rڸv..e]qBy)5@**7_'"R=$Zid'Ld DRei>q慁M=^UEvA>5|']1E*P+E0 zQvIxΩ< uH$=gDrbyC2-l-=[.V5$<>K;Ѹg+0hٸ,f)F_@L]vKa.%(tP*.VEFsq[pWN"yOT֤a_VމgX.SmA -!:TA:}5|2J UmgsQ|S,bF +OõHP%S8^/_jk/ȫ6H:zMǢ&UX2k8=Nޞ`ԡ?SKbç0#‹P!n^YW@pgLY~ȍGIKƃ5 MMÃSBfSMgp=a̡pqK :J> dYl3C*U6\SxP2߿R߶y\ fԪĺ_PC#oNU4<{w6@`yjBtYEVj*03ر;E]qZ`w75 .ZWBZ߯E)_B6ILn/h\P9a̮ob(YQ PBf:!;_O2Y Eև[j'+^caFz([/dIj'[5/5 rIZPq'l'bK,LJԖETh܄FBe#zVEYOڐ#Z c(̏8tiuKd'YT V[;i(ďmg  -aAv4xܳG@P({eV\+kyC4M^o*9h_3s]TRI`G#ΑOvHgclvEUWcRG:jJ)`^Zkm`*c4^  lR]41S 58ɜ슥[ 4Ai+ғB%khbM[UnXqćaXD)m7e*s:VVሼXrt-q/Yzv՘?-$_"c.@-SKj*ofuV oaMcQ-xS #f*IEuNZh|i60[e5IUʤi{68 e}į^=L#7R'3’,?0h:na -/,+~~.xi<+_%+-kKdihz&?P'cީ7ߌ%|R(_EWwe3̈́B v_ a2BDSɸWP[Qn8pM֮`+.\Q1G1yXd!%1 -/m~x arC(GwpUC೨+gz'{BhpBulq -PgP7h蔳*A"!m$UwbO}`z.f!GEB4 x!VIq%EcSȋ`7v .URYyS)RֲZZ7/*fE˜.{i9nVQ~YbTMț7G̪d._rZVP,\"suFt?\+ETcbҥ$oq/ XQX5*:Ul_ m@TCyKjF`7L`&1u%<-2;l!ÿjnl#ۼas](w߼>'3v~=1V((zmNjP_l%5&%wj&JhO ޲׀h/lVhqr'vMJ 52e72p@q$_X3ܛG@o&!_4 g%B.%[FGKqTAhZ4vmIkqVvxuQI}jN5 8M΢K#}|. P*~9~`WW#,eJ&8opV6d$WFT(82> -s<.wY] mB6w3ۜVPbu+a3l=,j_dJf+x#?Im|W ,a3Lʽk3.i0Ra`e%[ LBùP!J1D4W|x/#Nʮ‰g䝒<=rzT=|R#\w1Z⯃HG|?3iRu) -pF9]x -ś?*[xwfx [ x|J[K,BψݿRϪA U7W5Ot!W| -KoomcS3晛 qc*˘Fۙ6JJ3&m>Dh:-"hMÅ ωb^ӍWRo!Ddl/TBCU?7pW?Z7-ʖ9NV(T$_#C?quƎ7R0)0,kn\uM| ,k(Fycpܲc\o\. ;kP#6 %TkoQɹ+"0ix~+Hpp%b~u >_!AuPL1~I\U08}G~3f<\b/.\x`lQ) [mbd6v Zoց+i/l#xbm.чPZH?] ZLK݄3ʛZ*ms.R<xqQ2B u5ЅRyUxY+.y/j u!%i>̨6< Y1n_Ԩ0Tn+k .^wsg;7Us4xT]&;$t -`'B$e8*b4-F buݶ%+9>&:Զ+\21LbWp UR( N(ka4 ̕n| -|&'URڂV(@ [%kͳ1䫰QqGٛon5x@+PfAL ܡ TOdsqqyXML /0Uʕ<kM\8r2EKrC{e>a,-ۅ.}~(/ -һ\*(cSŵP[hy5L̋vAu8Nn5 -"#]ou=<.")]5NlCPu.h>, \!>,,FHPl:T( 2Ku jT*e/P,<p*QF]Coa׌-6D]7It ϫt꡵f7(!MZ|O5RU֞1/tFm:PUz֠*"Oos u%̫aW|-{yp34C!T%3|+iq,:y'հÙtTe(hq( (!|k09 -(C*㭫@V3J-xj@n\yl^#=$Gd!3W;/;y,"[lY.^| ׺pcկe \ԬLl!Uu -Fn G 6K/, UοKR!p~(=G2+`KJ{bS(\Mzdk[XR|SȊH[0 Wk!~XG9Ki{(}HDt_B/cuB'SSId"uڏRE8f1h2jU`<:38W up'PTJ7WbmJ14j;o|*WT Еjv £k K,+*c+/W*&kc/̿.aT˺qNvv)G88O%Ḣ}l}kj/U.֧ѐ/'s-vB -QFʲt.7PF%]Ꮈ&8x}  -߭6J#+"n.PT)AFIBTagơKπ#' Iv*~Bٴ/[׬lnf~5)8a:Ԩ+n#-i1Kf)QmJ_.3\*W#%`6|N4_E{w"."QVKu4qVPә\W*2nK1H .4W%.5rVn *iirA }&LX OB mZ,W^1GM+R-'De~-%H1"V jў ݜ+UcÆq\up(RD^z5XVx0{9gSIԜ{:&nN:r,UV_7/az0ҧ! nKV=N٢>ː1/\RtGU.*b-?R檠t".Dr.ѝIxKJ|TE6y$|?X{n_j6ok`8A> 1iBG"?9HDԬBccHz-B$ީ{Ml,_R3BwCgU]mu?2H/ m -bZ݃W mH}=BOߨ-% ɶo{4̕h'`h#椒_ rjE-ƗPL%s7̞eDs:ÿr -=J^ԿmлCYkX -Ət=v$g]+"EV8|5U5B7S6LaggA\:3̓)uT-5%|3e7.hA9U"Wq@~,7.X/13(%CM|JghXq˴,,[ݖ}yu68cBTJUjs4Re]ɑ [G]ť`~nS:TLz5I0jط8X-g .-I-NHIY 9Vwij|5s*JƖa־La$NVye@]12n_R i/.8B^i,[׻F{Dy\TǸ|N啩LJ/pLTQP.EJe@d^㌱ZgLU{%e?$Zr &}+ IrA3`0)Q#j;xJ. iܬ^7%[&EDJpMk'㔗x^W勷'me.i[8*DFȄ IU[nڲ6;\1aLp'lJpK˾fHkj$w}x5d.53h8/P!0uqxu(._ -rj~x_ķ#D  ^ዧܸ(Tŷ$S ' ']Ǫ3P03Kju*Sa1(?+5w*5EJz*:>kx<(imؑQdۥZʦ+^TzDy*wYp@)Dz~ 4&Έmh^ j*qX a5>77tFnR=?i;RǷBRBT:ls|!:`KS|r̕{4˛N] E&,o.,2tyͷ\+r O d<%{l*<%J[ًnI-K Uɍs\@5 [3OHNTs Vza"m<&lU郖}r 7p ÆDMhҭf@Je{ܠf_A bRU;.ޣBw] -e2>*wߖd{d˺ܥ͛W6wq`]JnǕ,*|XoV qw⅖Cgmk,SMgeD 3KӺQ`-Pӕˤˆ1pcg¾wx­lm9 /lUjw\+I7Pn \FQFku[wBŧ]me0{zdߗŃuV)[N\HBòuW[⑒,aAr5S`˘wb2(i_1~PZ)|*eV%J*†:gjZM]\8 >KqFO1^0TeEPVѺ*o(Cc(G~zȲf,ݚ0^)S &8ز1'3 UuheIJo'Q?lq(8O{:+ #17ࡅ&v();[zfL)IBTܬEu*}@7* j\~ G'/|S,4HG[t:g DH@HوZ.Ue&}AR\^9.*詞:ĨGY~$r!y6cfϹTmʣv&㠬/,&u4Z܍%S2 ƒ6kHnm㼫:Sb[ X MDx \{'|D1<˘Ѫa2M66vAFbʇ-B fN*_qy~Yw5:]UxY= bTfV;9P3/ԧ.Gd)y'$!1yiYA-ds4 \;<*4/yC ЃV?PA6Sj+EJ|^"X aBxV B@'[TY}砆wR}Sgtnڀ靲՜6ֺlcj7K\B#B D :s ԗzgI^M=OeX<^BT? zq_5`O?EL(ty/(R*td?>3@ .-*P{^ڑ[gEepqZ't˟R&s6yբB+$qY%nWS^WGUAffb T\]FTf̌J*+ 1-^TZĵR`͞2Va ]s<_~!Cr\\'I?Dx73˗/ -b׈.+C$DAk[ `HtsmTeҭ%~J%b$c'n[ԸerɎ3*}y^8zT-Og!ŸS3\ n B{[xlphmҲ~@!K_7/_CMa51Zj`1(AѤI~ WЊ-5"y^U+UL6 jWQ*3r\+7|3|PAƙPխYc;CI{;?X7ȑg7>5&?`ctXBP J8|ǖ=@r.[ -BRW5*R76r7UjaN V2ii%ϨiyxsMW« -F{TVx@b2Q<~"4 olПx@Ѕ|v͒K&ǝ ^ƙE crSܼ -۝c&ȝF7H.Z[\Z['TRʃY@jhI0-yf$|?x^L B~;4%K\-rtl*bp[/R?͘Wd$Rl;S RJ+ZH9h]b^YzǹoF? -|$У `-dncذ"GF! xmj( -Ԯz}R_zʕ؂>z%a ʟuCPٌcʘf1=MeXUlϠcpfClH>g;+XP:(rW|Uj_Ǩ[pzxwnHRngyu\)/0F"J1*hXŹ+讳[V.1wmym!z6oj~漖 -{hQIVhG)g?i~Q~ɖ[p|E y0upw,x[˻ \!(;GS^f1rnWYd#4 -| /5\0щR}tK-]yz(4/>/PLKu9.f]onk[%"j3!iGj2F-̯4Jjeƿ*--p: -"Q<̃xa7!PKtб-linqO^3G3 _,CLb*=ٶJBG*:M7ɮ+tb9$zI*ḟ ,CUpN a~3bl ,AHc:g'7_ ZUV0AAgl֨GD1* e} d;n#yI -Cەh27p.7B >=K5u ~yvU¬/ JKx*Ww2/qR?*J%F 9JfOFv00Ӧ(-32ڒ37g=O` d0+;hA%WM P jz$D!{3ײƟʝH|`eg,K׽qSspjXOMX'6x8_LS[]ku=-ToіJFlnEU "{\&"06 K?<;} 9]"kұ=/;kl>N|Aqqg(̃]]yt7d@z/h%1͖FOK0bang 哝")2q\"4/x@v -HkCy dG'C Pƽp̫AnQ;'Ž>-,Ud*XtgHGgYjT&z,0%daD3P'R<_yψ?:'fZԼ\ͩubJǵV*E.דqҰAjp†=rˮ.ype+20U/Nji.Y3/RB^P?X t-jTtTƊUY0z͓H):\ĵ52F2Fun8k.F,ݘ}?O4giaʷ%3SPPflO1bˠSdX bbwnj`rV;s ntGzBQE4w}%RþjXE;Y/mNw~bIO k0WO<<Un\BSԴ3oͰPT-̿o=)Mґ6nbBtΉKY (X'I+݆faP)ݱ6qp ڹ7ۻ%u> lQ=C -:\Cww˩]K̵ʞe]aeP: - Gz61m]"ayt5D|m @ê@aغ,9KEw_RGY71R:b/41f@ps1_eB*V: G7|Q;u:lWk:f+b^vu={+P8FQʢ7/K(+pŞȭЌ6w\L p{ 0x8]u -#߆ʓ Z#E'۠ͱOe5D,-j|%ƢCX/_㳚_rGIc+G7bSXjRVO _HxEn+7* -5So@@(|ܫ+[ua>e{ Vl@0x1y"!q_*eVSB5<!k0Mh鄐 UV7wXQtNUN׆Søf$F_ТB$˶E4{EPS3pQ,ͶbF7nkPrMLeķV%E/6 -@Jyd 蕙\PZ@>X~sf MNSC<=S-F5{W]/[Cr2j:XmoWD=K.jVY -= t%6N7^]T AkGxΡQxM#cuWI޲T*sOkSz3V?//1ĻY%h6A@' aEkL:0:3LQ*viYHܥh8P≭lJxM@Y Ѵp5.)zP?pJ ȏ_O'BWCT(RJtPQgF5}V[,ڕ\+/ -숼Mu1b~KЀ&.sB;mD8Ϧ$ y5]|;_,[,`|+#cfx,V`䎴LT Gŗ wqK'+Uv{ҰթjM]Em.ŴGԬ8T|.EVѹQڌ RM -_e55MT~lPC2r00L";y -QF 1@ /5bxu?%*clPP|.4 eZrƸ.;F:yTenջs;('_}Y^]/n@iQ})KJ?qtU*VGRt j , Z[;VLKpppTeJeh\x0NO"Z= 嘛&*:2jԵEHǤ~b,"jI $rJj_RR˾+~GZ./fL#2-y8z8}Yn͘kݗ26@q(/3?qT\T\CKJ-\zN~z$G4P*nUً&BM5Hg,¨[v+r*HBoZ7аE\6 qգv+Fy݇Жyju0M616 6\T}SJ[Xkz֑+*ƥw@:n!Z) -څsOjo -MĘbߒ7Md -mZ ˎ:$\-wONHrᴌ2-5EyZ s/Abf3H^ -=(TtW³RB55RͤeϾ |>531V(+o;˸Q#v=f OS0WB$tgjE +.;iELmf5SSUթtyQǽ&|,mZ0QG8jZ3_ГBcCQF]hTX; R~J`u[h Aw~ YxM!px) r}pw2?Am-AEI7ZW @ttz5˝)t |Y:Ow҅&RBd}/ TWXM$^7B9̶b;O1c;/ziwxR uҺ'LlX5-c%Ym";4pfKzens -!R1cr#͉qW-A#$OxUp]x&n%A,rܲW lzeه8>  v긣ܾr2@XG Ke - .2F$U䎤(cK* rf^B"ogb6c\n8NMK1c,#Glj[$ -4ti:a܂OS?x`t},SkPbfaU+g|P*vSI~9 q+pȭ~bܻձPXE᮳=(a F3=1 Y*fa};H[.J?TX\}̳05nPJT*Uu,H5_ӡq7j")RR?}0ﷷ櫠̪Zǹc\ /Îr_CQc/{FdvRAL~Y-P`6[XYRIp6DQ6DǿJp2qJ¸x -WL h'_hi@D)y`2r@ILG-hCA^%p^ 4ǻDM9#HH%pM/9T{ aK{Y?Pg .F1_3zbh(KGܩ]C+lB22-J$ -cat@F>D,bkQ"ò4bЈU4M}4 -b BSܧ?B/.0)L`vOt(̫e |'GܵQq mLVP6 u6Ex,*y][/RVɵӣU#!.ʖ@|3s}ŭeM{-!%+BuTSvc=_ȋ[F}}_] ΃xY!퉅]ߙkq\({36F EZ,ZwQyJТ?8;ƪvܨZXn3 Lx˜+hTK!p&Z|¥sJE7 vػj(wvnj1sZL Xp>H:-nl!m4v6PGVFiξ# qy%aM] x-]ɱN/T'#7ˍ_Wq4Z:3w„?,qBS\W 7}#GTg4 fO뢲X_R @-&5c-mx~ZH^l²'ForXc6,JB+!R]vBڃ<([aCreZ%^)VgO)wM[Dl+7ԺaDܼ]w.O9u˷*@TBhmjd>-23R̽ff5YU -}J5 㤸yr`WQgB\.+^l&PAޛlWKq< pZ&c\#Q kuÿ74S4\k BdۓXF7b3SS+,T*O -mOGV[ B: -XT"mqKNNA@y#LԚH݅B:!^.^eKEHT/ơc)Aw]4`XcQ%<ذ v\^$A:&/M~ԙ^ꡩdTZ,(<(C-٢mࡁ E+n| _MP˵J͚SUsf[?\bpw1 ˔3G[3Sf-H -_,2E)|{ Jf(I>=(oqę9Q.f"s/])sDXNH!GoB̙L"1;vibرSIA&wP}7OnJ -V&$cT@ ^\'b>*Z.+ DB.[=ܨN{fMQiƨzg85VKAkwm XFODl}`M`Am0TݐT+p!'tIQnAGF9qICelL -0'F%u))Pw$\WR2O0> 1/qjXB2KkU\n!2.\(Jg CZW{g^w:G|j IDH)kdxڟ1Ι@QUþ\i~cch  p}}*36A~#q%F<TL_ 2J #k"m4{Qg㎹];DYO+*KX̻8.E!Kkw35;.g8/|3 l`e֊H߂Fc4Vd%=Ag{1;*Ȍq+152*ɹBQ M"ݫ-dҊ-He|qGQ88\T-p1}˩@4j?0=?MTU1K[̹_ӴJxW|-%Œ? \:lZvЕ奆.,]5&U Yk,ֲOAa -.Hۣܷ֭k00#e>vCXj+",g8YeʮGn"UIesd$Ml]i}i.-{5nXֵo X;;@ F|^^ydxO)}.R^0qR+EЛoȱɌ4R2nT!JO/Gt]9a$KA!>?*uP-{\X&\lg[u].vȜ Z=M:R3䨨>")j -~*Ӱ0QnA`YrCYZܯe\pLQΥxw kQA[d]Et.qYS6mJ>ZʾB2 GrڦݴJ }I_1cj M7lgㅹ5[?H첎1ěIڧD.:Za۝XAKqX2řg5ǩ7bۊKKƣsP8!9Iu#Cw9k4EV[/ ; - ńr;-0%,&jC}c3[FP| WԢA?Qp]D=?q^{ĹV;< N0i4F=ͅ@‹XW3 U*^jEYSf5K%UQMUɑ6!|CT6Ұ,TZe%lf9T._})Oxe.E (TApjo/Z -=Yrc g{B,0v4eR~K7g&cRzbIWl$`.xRסiM2j/8,2PW'S(k­5,iQ/<Ȱw!l~{aJs'pʻM51ﶠ@C̦$y@SS5?tXX:lF3+,.,)= my;Z󗨺ؼD 1*],Mcw[S -_qecboʢ +\{D -7Tb%wT?2~HNw# DR]|q{Oׁ1${H ,~@14Q)dHTq[7ZFpP ~EYSM'}M5w-BSE?#j<5c.z۶ LD "0C0ep'6Ks:#P%j_k{M~پ!Zi=k'Jw#\nd{跅bī[[ A[/L#hY1#(跍XAlLM5RKKjj[68 f4,^?nf;XEk#4t$7 KE%#\Z(򳸏M{ֱ,Q@ /6 {:dV.ضdl3PDaAFkݺ"ujXmH4wnfɲje}ٻDaJXrLa|ԨR jku!p8B[D̵fc_6Re5ƪhGqI%\:O@̱iRB|l<9=kdHE*j,hv oo˃5q಻ &G7~xAH-7)ian~Ek]nj4PB -U%lA ^ &8'3AZ)1ZJiUȾ (@f9qFl[ʴ!b7k`5uT\e:2]5B4JU4b* a,C` 0~gG~Oǟ`ab׆Yԫ׺Gm|FĚ6F (ty`y+"V6#4&C[hHH%bUXR+MZUjp{#UYfsPFAؙ#/ΰ+Fb'M.\9,EYqtNP5= -IbTvΠ8*RhU6TY(z!SSZXu&V5`_UyF6p MLQX c;/be!\UrJ]C("4T:_@aQ^u. -g -\Ց`V%֎lQ E>ME W?P&4l.Jft*&>vSY!/T*}ʞɝKU:D#7i*)j=)K?ZIGO?%ĹeLK:w>tBf -F>k~\"C;Vhw41TU 3`w-q]߮Ŝ=+|I\ݡlyΖ^Y-Xג,=\ĚM mh2.Yrp=VxVeDMŠ!"cq"LTbbksSj<+_%eVI+P[!ЗF%Ӌx@Flju!]\ 찺:eOne$.4̎ACJ*PL3oV)3hM\l˸Q6lmO4]m/HlBG+ԦjZ$qPN=oJeo!_+bؠRK*3Rl)(Hv,]+*/\Ged-9_ڗ%$I (p=Vb <tÇY`]^_^GL^B -e#fDJjx*}D$_x%b koZj -faFBza^bMWrM5b.BxWt+MCbyTjf jVlD4Լ-}Iq2;Cv>\v\ql/3 `!-'|Α(~SNU.林mbǣv?ZQ`4ZÜOBȀy"QnWωg/f\Z10Rz eqd#zH]D㞥 ]DyZ -T,g?^%Z|JfeZH+\Q2*QQU)A 5f=ԫ(l1A?Ԥ_D镎D"qi7c0.<13ir锝K|pM h :ߛOOXk(Q Z5pƼjcLBu?D {f . 4oDDA2!бs,慂YQ>aT΢镓yrUʝw*J+>Cc2H<Ţ`vX0.#Sepf{*RpF.3UV>HO#C{Un*wLb^`@ey⮵+eMY7ʘcfeQ=}E»fTU3M$:m(o'D>d犀\c(Mx**1I`̃0˒ w0 Lгk!n}S?K:wrb-_B%z;*^/jgemϺ>tm&Y &V7rGOp~q1۫cWrQ-*,VHuYד<`ݒ/YyvE0@2\fݛĤ+2YJ>&$/yELc~n_ v b~[3*{"SQ(L\Üf?O&wolՎ3f> þ-lG/"*j^_Ib-\B\,N)34r-` V:iA}]CLj(_mʫ~RRv@j ԧ/4x-`]& ;>H^2JDaUsʴDQ5 GڐL<ŵ-rrbJ x*VpUGSqiaDJ>!d3r7lA*aXfEh\ILjx+9Wr0Xqm~J'N0,XΛҝe+jbW_B2yyar4v GD{CCu~lw(WߋI0V<5._M5>joUv32kid*4sLۭ]/0)bĴ@ ܸ0ۗDkzٶlջw0m*k.ǓR$^I I1(F$|iDrvSۗ?m&bLԬـ7gf -W q*W/A!FF\G.s/KC,\Xj_Z8N: a6sgᩈ.%NHĉ13vwJ[u VH/)نNZF, kȎ1!폩[΢inѕmˉX*]T=F8SK)dj&&z㪕k[%5<!.@>߻?QKx#)1V"5k_M8H+^ -u(DHfNy> ,;N2 -\OTqˈDOeqSGq_|kp/xeJK7>.xi鯱1jVuz(%2_Y7栱G*Sqj.%@}ˆA{g;J\|Ō]gK>_ÉUq2%2|gzUǯM*&9"@clMӸ}R0nuQ?xTNxIJ;G -cJz?l3bȖ۴0?RG':W؊dkPPsಔWf[PiyZ&jJ1bk| -\Wp1W /jz>`h ͫ%]qUʖiIa&Е -qS b`j3y4s`nٕhtY3sdFTB\\bTmJ>JD#ںfCtABzieix`o[Mepk˓^+<ԭdv琣DU. D2J1ȡ\w;_LO c4E/AhW2Rc9U Uw]$"H#lwr#X -Y-TblFؖLjP"51\WT577FZü|0d[np¶ -bY%>ڔ" -ce㴏L<@c^@D{Va|E!y%|w3Y<xxvUTj"T%TS_S*\1ÌQ_ -% ГR*41R`)N\muM5,ۭK ؕQ8TPh-?]7Xr6E^.ZUkadH9e_F)G;! mUpD( -Ĥ+14Bi$ =-6vTm@u)󖝤*3嚸:*JؾJfc{džZ,-Fh/e/WL-z%s_0cRh4ER(Dku C6rb)\>%L -4.TŬ=}EQk$(- Q!ߓ2(?\h3<,fjf^#q-f:8o=/"g'/)o\3 >GmB>g[a_8 PKD %UcF?QU)2ݽ,9?IM3Aҋ5Jiʡ.>0WB"k:Ք?'ODA]# 0$X83i]/5S7C_jLM_Z`Q -UvAsQjP)BޫKlP۶5/tw(L/d$Q?>R%Fæ<[F5kg/̽aT6 e}&fqvBɰ3P{zRl -ZQڝluwLuEj["l6vI6XR'@';#JoꥯYhe[&]q[cB"~Yxi ~DXe'w.\X.#dd xYeO.; su¡= I rqQ@g۞qA4LCC.E1b_U/2[ uT;>D?J_!afBZR@#o"O !u.=H,K*-\a̼7p)eUʏr5H̹ -]rWMhM - -.g?kZ֖SD -R?zXG 8"1/~%2`4PA9X W(L   jP JV4u[}KCV_->sDh[" W84-,4PZ5>r| QDb/nrA*LGVfGoj qr!_l@M~ yHf評UjkN(0cmonIr?NL{E@K#/05XLٝHu0"!DBWaӇ~ ;I3e#|<%CS(j|\ZS8elH=$aT.0CA}1g!3* -ZAyLܪ dFsg69qP>i Jך&l)mcƻove[_āWgYܴs0['/ -Ĥa%Ex'HdI,{ZQ k*~Fҍ% ]x6n(->(*uaEmqoThyo2/Z4k++qU"ښwE] p.+.D|YdD)h^-V@zJ ~h3zmӡj~T5*KWP5-~%\Ke1tlX·WG5_W^b= .Ыrttb. Fy%QbybٻBV灯YSH4ֵm0JeK*થB]ŷm>w-hWcFk8tcIs1Q%Kgܽ 4[*#nZm0,!¹qPi+SVpTj;Q~1KpJedRo0H?})\s5>}T`?3F([XՔ˽."-s|Yi%S-9L87U #A8ĄGlqkԑ8F$6+Ho>5nSLmVMZ2gsfWiTFweyS] "W"j'è&;dgtqDxQ6`,֠-.0o-1;e1?"2=wsKxk(UK鬡HXD̚X -dAI&Vh5j'a$r;?tӿ,٥_1VTx:~ } 29GШl/ Zf/n`kLJ+¸cͽtYxTInߖⷼKM3;(M*'"Sºȶ \EZx@ԕ)eDWx,2s. T9GgRĶ1azp\ԨƳƥA*TxFI7x2FW>ιY:+ܵ\=bguлEvtTtr:ĤBC$Db5Gݬrxt0 ΎW0} >!u鋄!ڊt}U뇷X/v/2gruh };6F>%U7U ^B.  -Qc@p,umMȾp%x#4͞F V Q,ƫAS^Q^A_,[P Fa1.JGH' -%nXwuS+D]ߚ,K9Zoo}^377E6xjF% TQ?p';MeƅbGrdhi QOaLODЄM[ dwpWP\Y@)sXFOK{|VɊ6Bv>|px-aگQGrLF!rYc Wqzk~k9JM,^a%,z9dla;w,T7SaR)HYOd>!RFGV%PQYYNf4h_%^"61ۉfVŌS -ܱ*z7~%1Lgߕbm=ʡ[E"6buC6HtA{IYB~<)kӄ*SrN97*7kJb)2YgSOKETؓ9`n\X.*l5Tq5{]ZOPx7ڴ0Q(D8OzoO)RU1ǒ"No260DϘc<^z]!*T8Έbڊ(7wR$"3@D2|-˩r՛[⪷2v%ID%Y(#_%4VY"YE>#V}GP88W rGP@pqpn'H1'#L@UK1$jUu̦'7xGr׃:F Da6q;H:'<ʓٝ(ҳx-~8@4JJJ2ǫe8}pEfx1U:`G\f.%Թw%ݘM2|2Wj%O;Uq)N0.%ΧEeڛb)hjZ렲?(Ym)RK,^W"q ǙS+\1*%Ʃ; іJeՎdķ5 'c]1E,1 -Ȭ dUD á\\jj<YC5M .D0#8Mj-cF^톑k(کJ kAͪ06<#bzf7(ke/ΫKRl0֙.덐@-z;ըH{99Մ2(Q^;/F!w(ÂMkP[K0.lY -"Dc3^I+r vB1vYT`L5J3[PM!=JFiĭ _.`{CHt '_V# n -]uRݯ"MLUh*_*U0hGhO"+S u0~mdP;vE;[\Nn[j`&xS~`biRxOIf劬WaW?Q+Gy -WPaL 2 Bn+KBU(֮l`r'+/3^pije1^ "bXBK9(cK R$:9{Ur"#ƣ=1P ٲ ZG'~5Œ7.Łcof|b-bR)(D9CF&Hwnb]ClID0 U"P˿P5 -CDaIxB5tO8/+CEQ|,j/=͵j'mT:\\rb ~ Sj#H%cyg$N7鈥j#+n=`UWJLE^jl0PIڝTZEf2_%CA@.aL6A]ʂZƭ6t7 mf3nIɀX(mTx욍ZCӸa:f4 ~DxTx!w*qkYW:v,qL lXRRO&X9ժ-$y9}Ao˙SETg֟BQu+f?y$(caLB ? k]D_ʯ]ʄ0"`U6{(k |lp%1T׳Jcۃc6+*iR:T>҈j )к&X"77B%hJ' TXSq[ U -D!]㊢M5]B}G떍\ޥB+g~9 `hu_H^DT%} -ȸUR%b2e.VqP.7yx8q~*W%Дl\.5\X}q.\7gyW*7>s/n,>'SVWܺ/<1.<įs >:&[Ő£emҌէQ̃#g}H$zA>,YQW3(Kj[(|D!Λ>XWψ2 D}K' /Oxr :U>%/옍^y +nf8,i2BPFAjItĪ  d>I`^0'(Iư -!_@_-2DD&[z&?PP`kK#kL,ٿԓۚc06"-QIʝ-W4ܖʔIDʖJ!~ -,so3] wmv&eg\~ hSa.&c~XHE6$Z}0Ux{%"WG7T$׋5u,U_ - -4]纺{)S %-5< - `;\ucǮ@_ƑU11Ad:µI˲/P9/ -YjlvmV -Ң@CrSX;sK!3hcVYF_kn݄rU Lu:Tb c;Fn&0QgPRʠkX#Wme/<#U!LĻ+,8&Z` K, M#Huш-jգD)Yr R -E#KoVvˢ!/S7R0<e+KNba3/0؁8xZ-D/w(bTĴߞ*nwu>у PfV&f;Ԭ|r Zx9l$y^%M̨6#bʗZ'Kj +[jSx*/6wUf '.rŦ *W< Qݍv7[[ 1zR -ȵηd XI3|ox$#WJ0pTZqVj7{F"UB .u::Z=q~&iPs/dz]^Y\aɯxq)%㎢)PF;f])eѫ؆kkpWKW sp;"Oq2b⬇yeğԍHαZ`O0E6Sjч6JcLA!jcl.~:ܱ뭗R}6:P4w:.iKI3#5*0kP[Un4, -~N b'bBA2ER؊he/!-2OԲJ X,\7oTKV<% m kX]y#+#6&3B[;d ]h%hX݌ڇTY}De|~"}'\K1*S!o&'~6X#Qw2J5~b3 -c\\_xx*j,'FYվ#0;WO >=Bjf{|'gxyW\LB\8x9_ "~3EdyfvxAi^$F?=aTG:Rf'gv||_ ح{XhnڋD]|AYXXMHTYJUJ]C$ùz늉x ;qCHvZΘ?D E.noK%H$v JPa FLrER[1PCYRRTCa4=,ko} fuSP\rn6 Yl폜_[5,F7G^&pA0u`GKNorA ڬx, -ȴUZLG2AĪ1Dq-2'Z̭%jJ=[,(PNՈq|&)_]@]Ťv1>@RɥE.3D RT$JNYTɳ=z8lVLKsPKjK8XuisT2eEkBX 脝 Fe@s}tpʰ[%3m[Â.A%]fc0ݠ5N.-ꪏS 0`2٫\[DYR{lKuY- ܂UDhaCmnjGQ)kؘlcR4r\? YE+o\W 6BD0Q&-ZPk[2 odL->,#W|\ >D#ȷ+urJc*en="WQ*f+\2|1p1"^ Իx|de}wpG\;*\>+C-,'P%p]􉠀:{U/}ȇ)OA=+kA%WW@$Ww1ak<}Ŗ` {*{͵1*6]^8#s/MdJ4&F[@5se%p-Wzq5g5=;En6b2`tUkkA(*`֭L-3}{aY -EiZ_eT7_C@ 4ޫE(?iUD[ Nhq"O1*$Dp@5-vql UA^@/GV"!H:쀖+Ԓ5s]mf-jzQw+ 䒗'Pluxja=H -0.\_oWb5gp  e7+~8P:+!wJ*eB@ +Gd A`C^uvt{gEX5=w-vMʔOfC1|Zbd1W ncQc] AG: }B^yF~ ܨs2%Cp&/2WA#UuL%k3Or7-fW -{ -^㊗V^ضݡԔ-tjZjg%m~ [gM>mDkMq(0W[Aۯ}1U7X6?O=FҦ$K.$j*t: x St#:H {*}6w@joy[<' @trKkL{9Sxeэh6Lw.Yς$C*ş2qFG|:߼ <ěj]%Z`&l9CPokԱjS|Q¡t Gn8WĭM*Ui<@VaGr-AOWXUGN% ̑LOV ->9uJ"ZsT\xwPJTU8 | $\NGt%Ywڲ̐cݕ,Tz2b1hBmq6 ]U%w(8JyW,l!fڗ)6. E ڑ=p}X`U u,+ -(&bPwT.m~cȴ 4ʄ4>WQ5nwTFƶLM]ݣ`ɵ+VدH#P]B1~q|;MmL -ᙾ2Lnv_ (bqy*RZ)1QO,|Y3*3Iep__UuƮ-3'0RT~G -o \eSsfR}|*⧨\`*{\/\#+uX-:q4;j}qc>D~}r?4Vkn&xNIUFb3\蕬,ʱ29ik0M {Qq mڽɂG -*_ ~FQ" MMm ->c冋 <ܛ8@{$+o܅a(/߉@75h!p4O ,03 lᐙLf2P{h.c~L(A)OP!z*}dM-t1clGWReAU7lBט)S\oAG0$/Vu<k뒌%5trYZywƞaRL07d\5ӉV/,dpEy4%F煷?RPTJ0]6XW;L@C!_$B}f,~T<1~":yRJk_@!<^1(ԤU; Au|a},CE*U0*UDdu|4]cH'q, dx5 -o\_5;DR+:v܈ѩFC;.M3@Gj-I,+GJTK;∎*b. ^1:b\T0yp±6Uw;%Cp\CEEW ZMB}t'IߡAaGv{R %08 yg uT]7/NÅRUi^l#15d{ t@˨|jMMх VչoÖfB4YwrڱP|@qk/Ĺ؇#3;_@ -#^xnL5w;"`? -w:>d@nQ0$. -n}) U-èbJ5ՠf%:FXz4t}haHbZC3 qb -ew'zcjN/Dq}'QO2*7lVYSP1SazZ-I/Tֵ[7~0AU˿?løJ-bW/c%ЉR(pGe,U <ܪaQI_QQMEeNXU7ql"zɫbTtV -gͽ&d앩@Z<.;L^aW2y( )GMM~߾d;R\HyP;LA :ؖ mWE -,QV=I +M`j`L=Ʒr9My8:fHxl8èo\>] =WP~O@ʏ‡+ƣMݺ徉J2]hUpndK}C 0)Yf>@e|,&p AR% Ò*w8uQT[+1{rFF]8 -L$=8y` ((<;8t`05F,k2%E1OHaqs bZjBՈ CK' A%ш !/4Z[감 (5:)< H p_Q1\7u61`#d#qKR3φRdn_h,3K EqP%w:FeC_ -IA@e. tVb@Jb  (5b aa#pҘ= L!x6Yy" kUܼj-s%A{+Ll*i !B6 #0@VGERo--A4 TGz5J>AC7=-ϪP~z dP{ȑM쿍sieq#e!<ʦ -PG4F1 p.5?nI|/,⒂1QmТAUh@Uq](ʒ-!)]M- c8]>T:7kDÓ$yb6,PbVU膕=ktdMYNqV8f@eM_ 9"[ktQU#*TzWk仦JS3^\Kxj;ʏ -L|U~IʭB(vcYd --&@,X&ni6˜θ;= -{v}9>\jmD 53YTzEnI|/HYMT!FTIw%Jx-]IJ? K 05a&Ys -6_6Ӫ)VW -5xV1{09,ulh}BH{Oı8YG2wuK(8P,=θjb|DYN?ygW,rʹ\_ܾO㎸KYD2 oڲ\25JCow)G e>ۨH UӶyv jpcz ǍK,(~d2Zmu-w*T|jͳR#ΥƓ&Yl!Bcplu=2ʼn~H U2ɸȠq^-ZqlL,$pUTpP $ d0YcD0RP]petg$jy~)|PqA{*]gSo3^Lǘ5"6bJ\ kp%[>pҶӪsr+=A=/]"v3&!\̹~% 4[SiFXNB:Em -_Y4L vb>+RU,z.|=:/ ˬ ]fO!fl%u.ƦZ]5iG=lo5ɶ6xxp -AYH .Ny[DuLT+NQ2\1d~:׀B,0υwz%!q/qJyn4we;٪?R_3)) "ì{rG!GQIUI8A5V~Ov~R7sme1F jS*dknSqHD#R=D\b{'?O|sc);&ofxߨu|wÚlc068r}R1]vwu؉n~һKo9::_DpL%n_Rw@T#\ xP -\\A+zS{UKe!jiM u?LΨ;!H"Fc:0[LUWP4"DX"*3]qDz$-PA@VR7eԌmN|$ Xm,ꊝ6਺;"rĦNt_ſޅGU QOAGo¡&&c_)xu#5p?S?( H=%wl3T,^ߺ ÛS\e0dc%I_ЈYk(Öb*.iiR[<),޺⴨w9dU2V9pj춅ΚP#y|4X<{Li߄d2˦$)bn2z=$VYi(=5V&AWܫ-E2/ę۰5XArv\?FB4{*o -9"jqv4_;.$7j5ՈZׄtnDcQmxPM -Jj<߼!Gd ٩c1\sFcr-ħ? A? 6-Iڃ!m/̵;]qvjRo&뷍XƆ]i~ޫ 5. J޾NlטF$E|OW_B*1]:|I%Zf@v^IhYx65)R: ]TČ7NZL|$LiW(Oj/SZm{z_emn#'|~ii545 -e*4 4<;KK {*S!Z{)X PE2zT)!Q?*CV0wkUF ?t*hEK3@PZ#S VEVŗl ]e*;PFb,A} -~-eH5aY - Į`k+y*@Eltr92AB:T1rZS3J ;J8RYbk?/4H7AiJ#tGwM1ZjD|Y)ˌbQS+Yq `_} ]6NPGD\w"x^]G_us s"žp앣nYaw3eb']<F'Fp7+Wbfo(TăX]0ԗhoƛҲD0OO.fHu;7+ P"թ{t)D%&+Tu,($JP7^(ԩyVGq:S"_G%mĬu*Q&s}!W K91+cs5F/ +T$fQ_LQ%)Ƌ6YU< 3_i Xa8/8X -U˓IV$҄m& *) p5xzVvR}4Ab ސ ϓfR -U}_ -~m&*f:#2G ` m@ qBu3.\ekV >n6]>Cyr&PIԐcw05e2Ɓ/kA:-*,™2HMH(`UJ;* -IwKZ!( #j~ZꊃCͰ:_KQ& -?cIM 4<\F3jxCmrЛ_-cWC !u1)]TPAfqJؕ -;.EJ68aHZbStu$F557&)Q -kqsl`SD`66m#|'~(*[Pl# Ns/\S)ͥT^CWpݏCZ.^bqVCW³.WAsrOrdX_Cie3*QyxRc~>ւU+膱 lǙ=T+6Z梥̀W*+~9 ={XR8R~O =aMD ZypKYT=cm`,JTʼn$\oa=K6Bb w X_mSH!ZYQ|4DR%DOm~N$/Q޾G$!eit‰RT rWĮ,9QZ -Ug!N@. 45٩qWJ&5_O tY(Wؓg 3H"*V!is -L h 0RdRP`hi( -f~Y8TR^0 Eɨ2pOeeq஭OWU"B[1pw+h5e%!\ -'eƪ-fT4OjDa\V#]peNl2@tPr/ܯNQ3 !VgFvmL-Q% 3#kLUtJ<2SffXĭ&y$’ח5pg<Z)w(IQ([. p5^ei}FiؙVVT#}I*l%+5v#%_5r|-TeV &jjiJ9KLLY#cE=g2=Bj -r!UCs*07IGZOҚ̥GQj b2ub(&H@R߆CY︚*kFbZ5JODyJfp:R$}ky-ũwh~QqQe4Y*;0*e1"07< ̧vhQ0\w8mE -RZI=v\f̧/;Lq\n \E" x9)EĢ^()am)%3K9řC(_5a]U_ w߸zF[GgV]sPDpWyIFҊo х _,،*R wl*kfq6 HBi<O %OKepyhI\,UpFQIsܻ13|1(ܣż8cqĦf"F 7r0*W5(-~L|@%D6 A=HjQ vm'a,@{P}#gR* 5!Eo -9۵[8Tuma)XN{O%D3s -;}T% wڠShm.8~Ԉr7Ka`Vzr|NQ~d;), e䃊P& %@E٫ сvW[+ AH"bD=O5ji}(o5O1$ N NP.hTYxS;;" X%C,sՙٯYX &T;nbf<{Qt-m`?%;KG#}1 wa6ƚ]WDԛ)/l%c$^j&[VaGNx,qy:@[?_X3Xg ]^c_5kolAINF\IC)Pa"BkhQ'52_Q~U۱CP\ƣ}r>5((bk!3*論v׋8XZ\auQ6kQ2 JTHBr (Wc?T)kѰU`-^h<kkˊ+FpZA*!eH&ɚ|(?$ t N]zEjb}ծj _~0-ᮻ:cv!W -VGV +LUjT*M b_F5gq3t肢宦KW|?Aٔ6~.1+V,f(PM@:ůlgx*rFYt\⁵.[fPU?vC c\ rJҺ>,C'?lxIJVYon~l`q_,<NV5WX`(׉Sּ87Hᡌ0>8DDH:" L{렷|[) -@PJZ*JbCj;5'SZmeD ٘6[$eqP錻cfAt٭$O`__/+O~TtB>3-S=~UFFeV}5t4t@0w.E]x q쎩WAzPUqj)-éO AGctH $l~6 pZ%@1!V~*5q\!Il5 .TQƠfxJ}T62J8q"b7Q %x@14 q_ LCqᗨJXLk־*ט:Lq cork`eHzp -p[擋TFgu+& ⊁)xعU8qnb,2sr*?Ԫxi*tn ]C s9;!,,8#S8yl8jq]+ -YRƥ -: l/"M&~DEw,u$_A};!l)"ڧ<5;5 -,@+|3ƍԢYrøаt^[EeWN -3~FBjOj<]CG#z ?>nʀ}W. K(*2?z;TBvGfcbtUeQ|^@{tL"ʕiBn[*f9vˋ:(7.e>qQቍr^cVJ)e -C+̃b%mZ 1b6`0Ic?سTy"Cx>x54!|x^RdDZok>KMFb2Ql몀ScA;ԴlX.)-D~p`wh9E3IV*C֯N"; A۰ -q׃rt՗ /˄sW@QfFhXRbf5p(~74y^Vlc5P55m 5kpni-p;͒czBE@1)-ӄOha5>-Zŝr$醳Fo#G-L,Q3}bUz5Q'sD5q,YS̥Iw*WQq'%Nƹt@w*٨!r\uJL8"L㡨2L3R+3URe0|u,f8-Y:LnQ^ (!)|Ҭ+/O1j,ʄ!8M J`.6dU+T`\᮵ -np>묦UY u{ -+/]jRSdQoChiXC;eHѻJ2 KIW >ԧRZ7wx.,C`fRD*_bFWt}V&`5 -栲({ܪ0W14!b9k^x0{7 lB1 8v3n JА>0f]|jt_(4@recZ8=&,HD^鍜\tѥ- '#yj2񏅜0f3jRc1梴qpe'o`qP xԲ.'*#sWģ?ܷW=2O 3\U$x==|(?6C2wo$*W7rS0bf^$|hs~,aG>9{Rpz6HVT\1y `˗ZZOd/iRj0h dHPvP[gbΪ^/\p*#!a_4v+>'K%9'P 48E84wY\39-iU¯CW[u i淹E ?K~0!Kt]F>kn`II54RO۶ v`+!8.ۙb[IS-P}TIjh{\ wud`eYx6ӹVjWi0eAB<էAU.g~o+Prv)/>6 %b W3ÁP*JP}Ar(8f -R1x@$RRE3]Ww57sXKfkĸL/ٟe^f|+|85ZC3nwKTiƧqX]fR_+,dil(вՌu2ړlqo\1NX4+&KWM_a5Q%<9|[EԾ1ʔ@;_=\൚ī@8\~'%bMIuOfkR/l1fO# 0*TK~%eԸk㙂2K FTf_=W Ve& 97+G lSW̯f8|+8KN]yB~| TV$JҪh}/t|Lwh5JszҋO[F[MS{-{b*T/@=ǿމ}8,KFf -a8xq\6-K+/<ȥs6%{J/N$ `P+MUe;3;dE*WVX -rX(c$KC57JG#}TmP!TI) -h{io?IqX-U.xtE51Իcwͱ@|qo،^-ܩRN.}J%Mp|1\ya0upj!\*8棍7+%'.2o3>R}0[n\3U6uy?< |D#q8iBb{E]SsC̷wQ#}oBi12⍿iU`'I^+)JMz8bnY4otWGK[}C|ىQ'g?=ʎ79|c|˼ERQ#o,_ % "cc7eUMCsK3Sc n}N.±FużSUq:>8ԳQ3/Qx ,(oBkopy5/Y.#+kLs|uqi˚r? {=ApJ)Q ^JيafWV.mHF%ukaؑ꿨TB`btNo&T-  ]!KH~ %orG s \"o]JdɠUF :'pRϞ_Tq h%|3/Lc*\4dž~_!+:5|[ǯW9ᙨr˸ Mwlx.V'ZyN~!' UqW n,WR.cbXwc|L˭+p<S)%B:/Q&aFNF*==~ pN5;@}FE~cEm;\/ EG:Ep>'rdRb/Ÿ;9q lʿ _ĹGs: S2*^ Q-ؕ<ݕVtx"6&&>100@P bZeSFr{'fnL%)@D{%ī.oڶ } iX#jhMF,y㯁0o 'xMpy)K`ԡΧhx^ -i8W; u3b EJq(mk4A5?00UBfd+J21!%>4xD+֎La_cUE%Fɣ 1kas@r?K!=Hx?CF_M/$nf3kljVD5Njj1<\>nFj+p#8R$pzT"bd.[@ i)WK`w-1Pb HW~k\Wί ~;_-uYe²pjĸurIm%X~b&Iw7aj5^)Υ#/v0AG+ -Fqv>+q[$~1,/WeXraRTw/0 ?s/ypGaZlTzb7qd\lVd, P-5AҠ«0*UbU#('Oߨ⇱۹xQD }堿)AL7)Ijy/kp> VvDZ*'ϋ|_)[2T\L[4G^xW[8xME\ز P=&TN #Ic!=̲mL9?kqA}I,[Jq+H 4Ӧ.4X_(]J wq| EdDQ_HXMu"A5, [_+̮j%B%MDQ3ƒjL1О3$H1KKPf} -q#T#b5*$hePz1j*7*A~R{a+%'Ģa -`Zlf,-X#1+$9*X1p98NS.)xR/7\w.W1ʱL#f7/L燞inUcO֡Ci! 6Tq~SX>>b:ܨFn8;2pø7QwL:qfTG -\3X?p?q#!!~@EþXi0 -҈֤{uzJ_1~ca&ӉG7GҬn]3CMO"z?46mJ)Rc>yd ˯ԝ*z?j|"=~X.C=X,6jeJ+Q-?[.!lL@gc9+KVŽToqU{.|lʬ)J]/'H*]}CEIGqƗܫ:b.c73Ř=9?! r?n$d$ e@SS\p`Qb6N%pE橘*Q5_Tss\xc\|+"fb*VH KѹjQR[ll!>mg#?`?t.Qr{ƵQN5bʿRn=kȝtYKn~ e[E^0WK8 joaПLF!%⡞ڌo=B *$le׈YJJ@-h5 +0Tl R|ܱ킷 rRxDb>míh6Ewe0VƶQfZ^]imIpq0!Ŵ`B\42raK qvKbe]`.}C -#Va D.ETr^d74M!H*{ SjF >XU@`U\l,CmEaEԹHH5^ -ߋ5I@)4p*Ӆ\a0Lw,U@}*"ǖaۈMt)yx-zA.6,rc-J b`_QUCN+\**J98,T@#߈6Cf^Mk <歃 u0HSQIqHP09qjDu0 c(XV?ȊH#BcD1q0/50r9]ՕJSII*\ -)GS7And"-O"+Ru{Jo$-1sba3jxeR:;^<4P¿2xUhS!pU,dDA c;h#PXBtǵHh -sɗWʛ0ƋCeb.0&˪no*5heHb,Hy"4#p*0{֡-%4r&Aj#d05MJ*e " -RasRq*TRK M@>HQvEj8zyZe؂fsFW}JlU:u( Ü$wN*[@l.fPf)ISY4Gf; ֪[įU|„ \!hCh2Wp,4Cߙ\WbZ!p` 0P@ ?OBNz{cs'r|z9Fba݆3oK_GD$rmӶDZo3̰Fy Q l3i4׺(;<9k4όI_nsn:eI?I %,p@0P ?'ćĭ)k =afV#p&? -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000010057 00000 n -0000476482 00000 n -0000476613 00000 n -0000476811 00000 n -trailer -<> -startxref -476948 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f5cfbb91-104f-483b-a429-971f0e162559.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f5cfbb91-104f-483b-a429-971f0e162559.pdf deleted file mode 100644 index 9ffaf2f..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f5cfbb91-104f-483b-a429-971f0e162559.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f5f3b73f-d3f5-4509-8891-66f9f9c3522c.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f5f3b73f-d3f5-4509-8891-66f9f9c3522c.pdf deleted file mode 100644 index cc1c8c2..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f5f3b73f-d3f5-4509-8891-66f9f9c3522c.pdf +++ /dev/null @@ -1,2552 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 0.0000 -792.0000 206.0116 0.0000 0.0000 792.0000 cm /Im0 Do Q q 0.1908 0.0000 0.0000 0.1908 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -35.283 0 0 46.25 1.82 3642 Tm -(Di:83460 ) Tj -28.1725 0 0 47.5 -1.15 3591 Tm -(P.ROIOR:ARIAN ) Tj -21.5449 0 0 47.5 210.95 3591 Tm -(VMLENTIN ) Tj -21.0402 0 0 47.5 350.97 3591 Tm -(UNGIREANU ) Tj -15.9575 0 0 46.25 0.81 3538 Tm -(-R ) Tj -23.1347 0 0 46.25 31.89 3538 Tm -(PO: ) Tj -35.9232 0 0 46.25 75.08 3538 Tm -(:C3S-C12 ) Tj -31.9778 0 0 51.25 0.81 3432 Tm -(LENI ) Tj -33.9707 0 0 51.25 88.64 3432 Tm -(C.U.1./C.LF.:RO1879856 ) Tj -21.4526 0 0 45 18.6 1993 Tm -(SUBTOIAL ) Tj -43.7464 0 0 52.5 3.93 3317 Tm -(UH: ) Tj -26.2254 0 0 52.5 93.51 3317 Tm -(SPAARE ) Tj -27.8232 0 0 52.5 202.87 3317 Tm -(PRBRIZE ) Tj -32.0602 0 0 52.5 325.81 3317 Tm -(ESTIVLP ) Tj -32.7778 0 0 65 17.8 3255 Tm -(E18:2X03-) Tj -26.5243 0 0 65 161.68 3255 Tm -(\(62507 ) Tj -34.6887 0 0 65 245.56 3255 Tm -(6-261550117 ) Tj -46.9609 0 0 47.5 10.89 3207 Tm -(AT: ) Tj -30.6398 0 0 47.5 103.78 3207 Tm -(I6 ) Tj -30.2736 0 0 47.5 140.82 3207 Tm -(ENIC ) Tj -22.6023 0 0 47.5 220.89 3207 Tm -(MRFUYATA ) Tj -21.0127 0 0 47.5 357.09 3207 Tm -(NARINO ) Tj -0 Tc -53.75 0 0 53.75 11.8 3150 Tm -(Z ) Tj --0.035 Tc -31.9656 0 0 53.75 41.66 3150 Tm -(00:7E3 ) Tj -28.8709 0 0 53.75 143.63 3150 Tm -(6422 ) Tj -31.364 0 0 53.75 199.66 3150 Tm -(76061637 ) Tj -45.6565 0 0 51.25 11.9 3102 Tm -(AT: ) Tj -23.8736 0 0 51.25 107.83 3102 Tm -(IG ) Tj -22.4127 0 0 51.25 141.87 3102 Tm -(ENICA ) Tj -20.8675 0 0 51.25 221.9 3102 Tm -(PARFUYATA ) Tj -19.6462 0 0 51.25 357.91 3102 Tm -(MARINO ) Tj -0 Tc -47.5 0 0 47.5 11.82 3047 Tm -(Z ) Tj --0.035 Tc -26.8469 0 0 47.5 40.87 3047 Tm -(H00:763 ) Tj -27.8016 0 0 47.5 143.65 3047 Tm -(6422 ) Tj -24.9965 0 0 47.5 201.73 3047 Tm -(763061 ) Tj -25.6155 0 0 47.5 277.67 3047 Tm -(637 ) Tj -0 Tc -47.5 0 0 47.5 11.77 3001 Tm -(P ) Tj --0.035 Tc -23.5179 0 0 47.5 40.95 3001 Tm -(AY ) Tj -22.9691 0 0 47.5 88.95 3001 Tm -(AIRCO, ) Tj -23.0586 0 0 47.5 183.76 3001 Tm -(CRATATOR ) Tj -19.2489 0 0 47.5 317.96 3001 Tm -(AER ) Tj -20.9591 0 0 47.5 371.78 3001 Tm -(CONDIT ) Tj -42.343 0 0 53.75 27.84 2950 Tm -(Z0 ) Tj -27.7502 0 0 53.75 95.65 2950 Tm -(697 ) Tj -30.7535 0 0 53.75 142.56 2950 Tm -(54|1 ) Tj -27.4792 0 0 53.75 200.04 2950 Tm -(183170704 ) Tj -28.683 0 0 48.75 41.83 2895 Tm -(ED. ) Tj -21.8521 0 0 48.75 89.77 2895 Tm -(CERE ) Tj -29.0073 0 0 48.75 170.59 2895 Tm -(58 ) Tj -25.7833 0 0 51.25 11.87 2849 Tm -(RJNOTIE ) Tj -23.516 0 0 51.25 163.89 2849 Tm -(BRI ) Tj -0 Tc -51.25 0 0 51.25 219.89 2849 Tm -(X ) Tj --0.035 Tc -23.0785 0 0 51.25 237.89 2849 Tm -(FEST ) Tj -19.9163 0 0 51.25 304.63 2849 Tm -(SOUCA ) Tj -32.3819 0 0 45 12.84 2799 Tm -(PAY ) Tj -25.1525 0 0 45 89.53 2799 Tm -(SILICON ) Tj -35.8912 0 0 45 198.57 2799 Tm -(300 ) Tj -23.5477 0 0 45 265.95 2799 Tm -(ANTISTATIC ) Tj -23.516 0 0 45 412.75 2799 Tm -(CIR ) Tj -0 Tc -52.5 0 0 52.5 31.68 2746 Tm -(E ) Tj --0.035 Tc -28.5987 0 0 52.5 44.67 2746 Tm -(900:018 ) Tj -30.7671 0 0 52.5 144.61 2746 Tm -(642689018499 ) Tj -42.0273 0 0 102.5001 21.94 1845 Tm -(UA ) Tj -22.1702 0 0 102.5001 91.87 1845 Tm -(LE ) Tj -28.7803 0 0 51.25 304.87 3943 Tm -(FIV\311-HILDIG ) Tj -28.0753 0 0 51.25 481.48 3943 Tm -(S.A. ) Tj -18.6536 0 0 47.5 223.96 3893 Tm -(AUD. ) Tj -21.362 0 0 47.5 290.77 3893 Tm -(COMSTANTA, ) Tj -17.8322 0 0 47.5 441.92 3893 Tm -(MUN. ) Tj -20.6943 0 0 47.5 509.78 3893 Tm -(CONSTANTA ) Tj -24.1963 0 0 43.75 291.55 3846 Tm -(STR. ) Tj -21.3258 0 0 43.75 363.74 3846 Tm -(\(ON ) Tj -20.3049 0 0 43.75 413.9 3846 Tm -(RONTA ) Tj -21.0452 0 0 43.75 496.09 3846 Tm -(NR. ) Tj -0 Tc -43.75 0 0 43.75 550.47 3846 Tm -(3 ) Tj --0.035 Tc -20.266 0 0 52.5 188.76 3796 Tm -(3INE ) Tj -23.9116 0 0 52.5 256.95 3796 Tm -(ATI ) Tj -24.87 0 0 52.5 305.94 3796 Tm -(VENII ) Tj -19.8947 0 0 52.5 391.86 3796 Tm -(IN ) Tj -22.1501 0 0 52.5 428.89 3796 Tm -(MIGAZINUL ) Tj -21.7888 0 0 52.5 565.9 3796 Tm -(BRICK ) Tj -28.7323 0 0 46.25 319.69 3745 Tm -(CIF: ) Tj -26.8208 0 0 46.25 387.87 3745 Tm -(RO10562600 ) Tj -21.21 0 0 45 13.67 2699 Tm -($P ) Tj -15.704 0 0 45 42.92 2699 Tm -(RAY ) Tj -20.5019 0 0 45 90.78 2699 Tm -(CL ) Tj -20.9445 0 0 45 131.61 2699 Tm -(SFUNA ) Tj -21.7017 0 0 45 212.95 2699 Tm -(ACTIVA ) Tj -20.5647 0 0 45 306.9 2699 Tm -(PENTRU ) Tj -18.8722 0 0 45 400.8 2699 Tm -(CURA ) Tj -33.9509 0 0 53.75 14.8 2639 Tm -(E18:2\242051 ) Tj -29.6673 0 0 53.75 185.58 2639 Tm -(52354 ) Tj -28.4045 0 0 53.75 254.64 2639 Tm -(6426489007929 ) Tj -39.4395 0 0 51.25 16.27 2590 Tm -(SA1 ) Tj -26.665 0 0 51.25 98.84 2590 Tm -(ENAJ ) Tj -32.5934 0 0 51.25 160.79 2590 Tm -(240. ) Tj -22.5813 0 0 51.25 227.87 2590 Tm -(ECOFRIEND ) Tj -32.8392 0 0 43.75 12.81 2544 Tm -(LZI0210162112 ) Tj -28.7846 0 0 43.75 228.48 2544 Tm -(8646809520908 ) Tj -33.1906 0 0 43.75 12.38 2495 Tm -(SAI ) Tj -28.3853 0 0 43.75 80.83 2495 Tm -(EAAJ ) Tj -21.0881 0 0 43.75 160.88 2495 Tm -(EXTRA ) Tj -25.9464 0 0 43.75 242.69 2495 Tm -(35L ) Tj -25.7198 0 0 43.75 296.64 2495 Tm -(508UC/SET ) Tj -27.6479 0 0 43.75 430.65 2495 Tm -(60 ) Tj -36.8407 0 0 41.25 10.86 2449 Tm -(ZI ) Tj -30.0217 0 0 41.25 49.68 2449 Tm -(02:1\2540021033182 ) Tj -28.0599 0 0 41.25 269.64 2449 Tm -(642276E020146 ) Tj -34.5182 0 0 51.25 9.36 2398 Tm -(SAI ) Tj -26.665 0 0 51.25 97.84 2398 Tm -(ENAJ ) Tj -21.0881 0 0 51.25 159.88 2398 Tm -(EXTRA ) Tj -26.6117 0 0 51.25 241.68 2398 Tm -(35L ) Tj -25.9359 0 0 51.25 296.63 2398 Tm -(508UC/SET ) Tj -25.5211 0 0 51.25 431.68 2398 Tm -(60 ) Tj -33.3391 0 0 57.5 10.88 2348 Tm -(ZI0221e082183102 ) Tj -28.0742 0 0 57.5 269.64 2348 Tm -(6402768028146 ) Tj -32.8904 0 0 61.25 11.39 2295 Tm -(SA:1 ) Tj -27.0066 0 0 61.25 80.96 2295 Tm -(UFER ) Tj -24.0942 0 0 61.25 170.75 2295 Tm -(OPTIN ) Tj -29.7118 0 0 61.25 256.64 2295 Tm -(35L\(15\) ) Tj -21.2168 0 0 61.25 365.96 2295 Tm -(ALBASTR ) Tj -32.3836 0 0 47.5 14.8 2247 Tm -(2:8210113106 ) Tj -28.0742 0 0 47.5 207.69 2247 Tm -(7290014006522 ) Tj -25.9154 0 0 47.5 15.85 2196 Tm -(LAAL ) Tj -22.2339 0 0 47.5 94.76 2196 Tm -(CFBLU ) Tj -22.8748 0 0 47.5 176.89 2196 Tm -(PUS ) Tj -18.7772 0 0 47.5 231.8 2196 Tm -(CU ) Tj -22.3278 0 0 47.5 271.95 2196 Tm -(ADEZIV ) Tj -19.7692 0 0 47.5 365.96 2196 Tm -(ALB ) Tj -24.6743 0 0 47.5 418.14 2196 Tm -(12X ) Tj -31.6492 0 0 56.25 10.81 2143 Tm -(EL/90:488 ) Tj -29.9402 0 0 56.25 151.62 2143 Tm -(6699 ) Tj -26.6369 0 0 56.25 213.88 2143 Tm -(490919743 ) Tj -22.1976 0 0 56.25 9.89 2093 Tm -(PUNGA ) Tj -19.133 0 0 56.25 96.91 2093 Tm -(MESTERLUL ) Tj -21.0926 0 0 56.25 218.78 2093 Tm -(CHSTOR ) Tj -23.8151 0 0 56.25 311.72 2093 Tm -(30X65CH ) Tj -21.6093 0 0 56.25 417.9 2093 Tm -(BRI ) Tj -31.4072 0 0 43.75 19.89 2051 Tm -(Z960:950 ) Tj -27.3474 0 0 43.75 149.84 2051 Tm -(EKI09022318 ) Tj -28.3496 0 0 42.5 12.83 1693 Tm -(EST ) Tj -37.7998 0 0 53.75 7.72 961 Tm -(ID ) Tj -31.0173 0 0 53.75 47.85 961 Tm -(B/: ) Tj -31.7444 0 0 56.25 9.89 1589 Tm -(10A. ) Tj -20.8382 0 0 56.25 85.82 1589 Tm -(TUA ) Tj -31.2455 0 0 56.25 139.93 1589 Tm -(AI-) Tj -21.2817 0 0 56.25 194.26 1589 Tm -(19% ) Tj -39.8436 0 0 45 10.57 1540 Tm -(0A. ) Tj -21.3464 0 0 45 80.81 1540 Tm -(TUA ) Tj -20.8001 0 0 45 132.88 1540 Tm -(EON ) Tj -0 Tc -58.75 0 0 58.75 19.7 1485 Tm -(R ) Tj --0.035 Tc -58.2617 0 0 58.75 28.71 1485 Tm -(PZ ) Tj -31.4416 0 0 58.75 114.85 1485 Tm -(M1. ) Tj -36.8051 0 0 58.75 174.73 1485 Tm -(IN ) Tj -22.5624 0 0 58.75 224.89 1485 Tm -(BON: ) Tj -36.4314 0 0 46.25 10.99 862 Tm -(/4:0:4700110\)7 ) Tj -27.1121 0 0 55 326.71 1151 Tm -(CKPOS-CT2183460 ) Tj -0 Tc -56.25 0 0 56.25 607.03 3270 Tm -(1 ) Tj --0.035 Tc -20.8928 0 0 56.25 622.9 3270 Tm -(BUC ) Tj -0 Tc -56.25 0 0 56.25 676.88 3270 Tm -(X ) Tj --0.035 Tc -30.7249 0 0 56.25 703.64 3270 Tm -(9.01= ) Tj -30.8624 0 0 56.25 784.64 3270 Tm -(9.01 ) Tj -0 Tc -56.25 0 0 56.25 852.87 3270 Tm -(A ) Tj --0.035 Tc -19.3223 0 0 47.5 364.91 758 Tm -(BON ) Tj -23.0709 0 0 47.5 417.89 758 Tm -(FISCAL ) Tj -0 Tc -46.25 0 0 46.25 288.73 711 Tm -(L ) Tj --0.035 Tc -28.3256 0 0 46.25 359.67 711 Tm -(9000221498 ) Tj -0 Tc -46.25 0 0 46.25 586.38 3176 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 46.25 596.56 3176 Tm -(SET ) Tj -0 Tc -46.25 0 0 46.25 650.9 3176 Tm -(X ) Tj --0.035 Tc -28.8653 0 0 46.25 677.99 3176 Tm -(16. ) Tj -25.3634 0 0 46.25 718.64 3176 Tm -(50= ) Tj -32.3752 0 0 46.25 772.87 3176 Tm -(16.50 ) Tj -0 Tc -46.25 0 0 46.25 853.9 3176 Tm -(A ) Tj -50 0 0 50 584.25 3075 Tm -(1 ) Tj --0.035 Tc -23.9313 0 0 50 597.56 3075 Tm -(SET ) Tj -0 Tc -50 0 0 50 651.9 3075 Tm -(X ) Tj --0.035 Tc -33.7631 0 0 50 678.82 3075 Tm -(16.50: ) Tj -32.3752 0 0 50 773.87 3075 Tm -(16.50 ) Tj -0 Tc -50 0 0 50 854.89 3075 Tm -(A ) Tj -52.5 0 0 52.5 579.16 2969 Tm -(1 ) Tj --0.035 Tc -21.912 0 0 52.5 597.9 2969 Tm -(BUC ) Tj -0 Tc -52.5 0 0 52.5 651.89 2969 Tm -(X ) Tj --0.035 Tc -35.0049 0 0 52.5 678.58 2969 Tm -(38.16-) Tj -33.7659 0 0 52.5 772.59 2969 Tm -(38.16 ) Tj -0 Tc -52.5 0 0 52.5 854.88 2969 Tm -(A ) Tj --0.035 Tc -31.7874 0 0 46.25 776.62 2916 Tm -(-1.91 ) Tj -0 Tc -46.25 0 0 46.25 856.9 2916 Tm -(A ) Tj -48.75 0 0 48.75 586.29 2763 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 48.75 599.9 2763 Tm -(BUC ) Tj -0 Tc -48.75 0 0 48.75 653.9 2763 Tm -(X ) Tj --0.035 Tc -29.2827 0 0 48.75 679.82 2763 Tm -(25. ) Tj -25.8258 0 0 48.75 720.73 2763 Tm -(07= ) Tj -32.0406 0 0 48.75 774.8 2763 Tm -(25.07 ) Tj -0 Tc -48.75 0 0 48.75 855.89 2763 Tm -(A ) Tj -46.25 0 0 46.25 584.38 2663 Tm -(1 ) Tj --0.035 Tc -20.3832 0 0 46.25 599.9 2663 Tm -(BUC ) Tj -0 Tc -46.25 0 0 46.25 653.9 2663 Tm -(X ) Tj --0.035 Tc -34.2379 0 0 46.25 679.8 2663 Tm -(14.99-) Tj -32.8658 0 0 46.25 774.85 2663 Tm -(14.99 ) Tj -0 Tc -46.25 0 0 46.25 855.9 2663 Tm -(A ) Tj -50 0 0 50 562.25 2557 Tm -(1 ) Tj --0.035 Tc -19.9028 0 0 50 588.9 2557 Tm -(ROLA ) Tj -0 Tc -50 0 0 50 654.9 2557 Tm -(X ) Tj --0.035 Tc -34.2776 0 0 50 683.8 2557 Tm -(10, ) Tj -26.7305 0 0 50 723.07 2557 Tm -(15= ) Tj -31.8847 0 0 50 774.88 2557 Tm -(10,15 ) Tj -0 Tc -50 0 0 50 855.89 2557 Tm -(A ) Tj -43.75 0 0 43.75 610.47 2458 Tm -(1 ) Tj --0.035 Tc -19.1969 0 0 43.75 628.91 2458 Tm -(BIJC ) Tj -0 Tc -43.75 0 0 43.75 681.91 2458 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 43.75 708.54 2458 Tm -(5.53-) Tj -31.6613 0 0 43.75 788.55 2458 Tm -(5.53 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2458 Tm -(A ) Tj --0.035 Tc -22.0252 0 0 50 616.8 2356 Tm -(TBUC ) Tj -0 Tc -50 0 0 50 690.9 2356 Tm -(X ) Tj --0.035 Tc -32.4812 0 0 50 710.54 2356 Tm -(5.53-) Tj -28.5573 0 0 50 794.6 2356 Tm -(5.53 ) Tj -0 Tc -50 0 0 50 858.89 2356 Tm -(A ) Tj -52.5 0 0 52.5 614.16 2249 Tm -(1 ) Tj --0.035 Tc -21.0765 0 0 52.5 629.9 2249 Tm -(BLC ) Tj -0 Tc -52.5 0 0 52.5 682.89 2249 Tm -(X ) Tj --0.035 Tc -39.7318 0 0 52.5 709.43 2249 Tm -(5.94 ) Tj -32.9029 0 0 52.5 789.53 2249 Tm -(5,94 ) Tj -0 Tc -52.5 0 0 52.5 857.88 2249 Tm -(A ) Tj -43.75 0 0 43.75 589.8 2157 Tm -(4 ) Tj --0.035 Tc -18.8722 0 0 43.75 615.91 2157 Tm -(BARA ) Tj -0 Tc -43.75 0 0 43.75 680.91 2157 Tm -(X ) Tj --0.035 Tc -33.1889 0 0 43.75 707.79 2157 Tm -(2.24: ) Tj -31.6791 0 0 43.75 787.43 2157 Tm -(8.96 ) Tj -0 Tc -43.75 0 0 43.75 855.9 2157 Tm -(A ) Tj -51.25 0 0 51.25 610.2 2050 Tm -(1 ) Tj --0.035 Tc -19.8736 0 0 51.25 628.91 2050 Tm -(BUC ) Tj -0 Tc -51.25 0 0 51.25 681.89 2050 Tm -(X ) Tj --0.035 Tc -30.213 0 0 51.25 708.68 2050 Tm -(0.72= ) Tj -32.6476 0 0 51.25 789.65 2050 Tm -(0.72 ) Tj -0 Tc -51.25 0 0 51.25 857.88 2050 Tm -(A ) Tj -52.5 0 0 52.5 215.88 658 Tm -(A ) Tj --0.035 Tc -19.0521 0 0 52.5 230.91 658 Tm -(RUGAH ) Tj -20.6877 0 0 52.5 310.62 658 Tm -(SA ) Tj -25.2082 0 0 52.5 350.88 658 Tm -(PESIRATI ) Tj -19.8147 0 0 52.5 470.91 658 Tm -(BONUL ) Tj -20.3024 0 0 52.5 549.91 658 Tm -(FISCAL ) Tj -19.4211 0 0 47.5 148.95 613 Tm -(VOCEA ) Tj -23.7876 0 0 47.5 228.75 613 Tm -(CLIENTULUI: ) Tj -33.6288 0 0 47.5 388.64 613 Tm -(0808 ) Tj -21.6271 0 0 47.5 468.9 613 Tm -(BiRICK; ) Tj -26.8317 0 0 47.5 562.72 613 Tm -(OBO032745 ) Tj -31.5442 0 0 51.25 162.72 556 Tm -(TIPRIT ) Tj -23.0709 0 0 51.25 268.89 556 Tm -(DIN ) Tj -22.3564 0 0 51.25 321.76 556 Tm -(COGITO ) Tj -22.2966 0 0 51.25 415.87 556 Tm -(ERP ) Tj -19.5136 0 0 51.25 468.93 556 Tm -(WWI. ) Tj -21.1535 0 0 51.25 521.78 556 Tm -(COGI ) Tj -24.7121 0 0 51.25 575.78 556 Tm -(TO-ERP. ) Tj -18.6521 0 0 51.25 668.81 556 Tm -(GO ) Tj -31.1552 0 0 42.5 788.91 2006 Tm -(155.15 ) Tj -34.7994 0 0 42.5 790.78 1748 Tm -(15i. ) Tj -31.334 0 0 42.5 844.9 1748 Tm -(15 ) Tj -32.0316 0 0 42.5 819.66 1697 Tm -(0.09 ) Tj -32.5188 0 0 43.75 806.8 1593 Tm -(24.77 ) Tj -31.5624 0 0 43.75 807.8 1541 Tm -(24.77 ) Tj -21.0452 0 0 51.25 703.09 993 Tm -(NR. ) Tj -19.5035 0 0 51.25 743.96 993 Tm -(AMEF ) Tj -35.7727 0 0 51.25 801.08 993 Tm -(:001 ) Tj -28.4541 0 0 77.5001 431.67 932 Tm -(90002214982024D02818480721100293 ) Tj -19.6793 0 0 50 232.9 909 Tm -(DATA: ) Tj -30.0086 0 0 50 312.81 909 Tm -(28-06-2024 ) Tj -20.3563 0 0 50 458.79 909 Tm -(ORA: ) Tj -31.196 0 0 50 525.91 909 Tm -(18:48:07 ) Tj -27.9768 0 0 43.75 852.02 1489 Tm -(12 ) Tj -21.6742 0 0 43.75 713.81 850 Tm -(TD: ) Tj -27.8567 0 0 43.75 753.7 850 Tm -(00665388 ) Tj -23.7415 0 0 48.75 753.75 798 Tm -(OASIER ) Tj -0 Tc -48.75 0 0 48.75 850.29 798 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF"ExifII*  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw88"2 ][i,ϩC?.t>ƾ"|ށ~(;yzt&\ڌ .̇ñ\esӳ*.  UebHY*UDBǗcɌ.3V"deM]|RI10DP#̌dWc2CnjdwZ̺5% Q -BE@R) ,RT(! ShX2hf  VCĖd*Ḧ"  1bd!@[2c,)1 A,2"rfV,y] 7[’V CHiYȠLXbVTIDh.* s(`{aDuLN1$\&BR) !2,$2pʎkV.7$`a$c( ,aAI!HHà! $k[(@E%IPc "1HEȖ%Y3Y}LRI)IEhQT Dh ` ,1 -fɬMLkdk0Q0m:2weWD+T|@{јij[ʾC=ugi^=ͤo+>j>WS˃t}+}+@7g$ dTY!C%+)AU! 0a$G ύ>\Ycl` pB"HA$aa -3cEc)FC ms$#BX!1&\@ *ĘlYe 1YkfIREhU$ T9 v5u̮W! 1!!"hR#c" - l"1HT*%4Yx$$V$U!D2E rT`", -ep¨ B&LC4ll f7Y#bu(549os} -3:c#PA$B!@r)W"q15+B !c=r x)L쾮c#fG2bvʨ\VhD%e@<6"XCB1RA!$VR@ #1AH`HBD+$0`AXLĈ̥` |X&<[8םyVA#)Q$$ aJBAW)F2trO 嬑J;cdb#BEJ -A G !@4B00I AZH BB"q  P@#) J" -Eq0B: d,=ir dC h) Ch "I 8cY LDHI!ʒH $!$)Y Y*:[P - Xq16*r,bC-E  $:Ȭ~ìu3rV(WTK"ZAT P0LaPP$Ej+ N,He00#+ȡ`$*1)ؙS EXb(ab +YD)Tca #@ a U>AOl<5ՓWg"P-*Yl굞էd̙ud 2>©_-vqU_v w+NJX  oBi1n&5SjV;ꭏ!uL=_g(W_2@%hG(vDL(B%^6]d+Y  D)TKﯛ?&Tlke<&baҴWI<د:rz)y-\C_6zpI `2BC R$,b@ٵhlX1d|,g82YTDȫ:BQcz "E+BѮ:1(/m|5vZ*kq:LNsBT@UcI@)``@CK! *HH x1:ʮB,Y/yuTtz1.P$0:C"@ b$X@  @CC -  d ciYD X&<1jIdIA͑3V1&Ȩd2jcuwR\}xQflpDL.ȥ -$`ȪdTK<-6VwwM1S#J`ŕ~}>)@,Wp{)K`̆W +D ,ȈUבg^ ;jd_V[ D1 !e0i1IjbzG&E# *IjKbcYF۷*;V>2  FL$kSWӺ$À<ۗΪi1vur13klY cU/< jaߐK@#^aMX!%j=N%s= P47x1kzTS:tma򐞡^EW{:r -&1eԩw|zMVpŋDV?ٳ6네K鉗X2QW4~/ xU߯,0[W,lyժ^l"]yws/Ks)%*a$!B8 0*dCM1I -FH!bq<2azˌAU]I!FR"4L9 JkӪ9[vezG%z&Ŗ,2wɬMLan]|oB㕆7 1 +IA" `0 -221Q\keH0A%g^pH)SnB"! `#rH!I +,< M!W$Ta@`@(V$P,JݜˑD zh&Nzmby8] /&@A. F WpQqfI|y;^5Yuc+cq+W -Mu+dVX)жXBFBioӄaneXDȁU!L)7 -0Gwus*QY2 H'fR WV WX@,L&s]Bl>ïDِ,Gɋ*dBGWa/raᖒy7V;  -C!5Լ;wgѾȬTbe,)ьYlFI2^YBeϢ&c,VI 2J@.@]r,XAJ6҅ԛ5 -`fl+,`z57t-5ޤr,b3rWYXI (H,$ -d|N, c1Dc*Qd0ܠ"U&c $r*C% $,]JH!$ bP,0!XB+AAZ, -T^Cq&C#c*!cFlfWLbQS"F8VVEլ[U$*:$ UXV @[dz^7SSשrl~VשTRK&g{F>AwW@cȈ* ߷[ߠzGj 2 I_?7"[իG{JηN: P4V 2 8r(=nPj7_=$aQ ? 'lc}ҵ;" !@NoikcGB-YH F82VMبFh3.K$ -c˶q\k欯"eɇ%1XjP,μ٬u>דb#f?C~*ZH :Ϻlz تCй"^aiq;6uVo۠V[,ggǣwy D k:g O}ν27<7w`حB? /C9~!#OۼPIZ\ԩ\huIT -yqseLk/YJa$4R3E@c8`͍ -=HBBe[Z3La6Z eDVIͥs_-o;7{4gWSfur$<8?[e %cf+UgwУ!SA X4B<AV0,+H $0 -iI*BI $ -q R0I! *C 1LI DD 0*<0uiH!5ȄGIaTQrc GuLl @2hcȐjBb*R*jv(X}U-|٪V($ .}U41b@AEr.jjV -C/qLy)c -+t1pl:˙7F3%Dˈ(21Ȱb"y@$WҸl29]70`CXȐ1nKl"AaH `qǭW4[+c2l!]c[u6ss뽙r{2Ι6ݔ+&68V:o~bhxCYک^2(WSKlIrSTAۍ}j_ۣP4EW+ uRf[zWwC8>U8>\!`uh0Bz:Bou| -Kdaj1u\" -$ a̢?V,[~/ٱ:xUm+Ot)[_'IRstDe(d2@I$0b#1XD G223c0j -4" ,`I #'Tlps/`T֦ߑ*y9.AD -@5rŷ/Z\BNWR2 a#:n >=k.byϣSLK91eEǛCɹ\^VoΒ羃YS.\n_&&\d{ tziz>]Ő%ddlfHa(ks-EۻCOPJup.^ :yf5p';:{\,9qy-OpZ=(ttUPHPd5jvtH !$dj,84qM$HF a -`HTG*ƥNδeDߋ3HE#+&sC(_P2 La6'HZ=`!MX+aHys ;@HHK5c _-ٴYdʇ*,[Z{N^E`Dt$F!`c u;)0B)BLp}ב@H!$$TD"@IH $"e*A$Jb0$R("!`@`I^d0Y ``dXqljsa( -SdYq(Zb *DeP`bE1)BdgƨC -GQU(1[ۅ^}Z5vżu "TCzXC!ݩAǕWA*B.}z3m!z|^@Z`2D)V^IG%2**u$ B _Y|&ª>wц<^*ݟ:kyA$&2*C,ϥUK!rǯ  K$٧3irkIY\dhcScY6ug|̧3&J؝X1L]cI -x 1Xˣ+;H LҹSU\XBDx';]  Lkv0B"HeX -T.*ECdd+ #" -H()X2Eȶ!dXƲ,0ەS;mjcKObCZ  W #Xe)*dtk OGF*Đe0r`edz2HiRnYJ'kCЏ,RnT(n"V,w2Dt``_}Zg?~Ij$:!.5k'Rx)e82`)d! &`FVQd A(0R,"Y$$Y/0=yY$a6%XK$$$K$R1  `k 2cr D %2&CKCUR eUVQ1e e"0D+,)5iE&<X_(?>JL\yaHPWU[Yu/Ov˼Bf+YDBd#  -UQ@$ cʭTJUQ⩐2WJ2AؘdˆT Ā@I2cS>5$e5`+a 0ˌe_%o4"5HLx羁Aζ,ܭEdr6tؚd;K/ z)τQfHdrD؊[=z6 Qd -H-ޥB,0Q$ f摇e#Ȅ)#49`S @YD&DKu}[d2@GǑ a dY"rc! K3Opg:ek##HHTV hr`CP4a*F40AqEFQbY0_TW{k1fyoGVdr)-׭8OHlYrCJkɥڊhdS]ZaqOb@J0HH``#)cc0#4 - RB2 YH_d*yI $!$ Z) X$I @ZEb"Ae!F ( -b@ H Jq"7Y A S!F2,EǑe2TP -"Ȫ`]WhaL)1ƨI,F60ͩ5|]'=GRsmI -aU_(w ,EtJ(ϥɎ2 QHPm%h @$0B0bA40$W-Z*H[7NZ !B^rlwwZ6 eqaveR1@LPV-XDfX@JdP$XFRVy/:2B  LD$R!!E, 0I$D@!&ԫgPc"F) - VS!Pd+cX!qgǕ:Phy&3+* j隐gz?cTln+*RFoa5'S_'m2'7LnG#?B^9`+ V {Zs3XH@ '#ߜ]N1r,)"@A@  }O}t !U 7{/F:zW}z~6 Z2@IXW*~zo^1ee as̞u*޷C7Hd[)6'e(~tӶWf9jW &VÑ2rŶvx+*Ryc  OWz{^eW10$`L$e6C*45ufYwD2qACAcA!Yc)yh0Ń rc\ԐV(!#  BI+K`*B`#)$" ! Bu!RIb$A$ &<^nJD2B2P@!"X,*ƪ lUP+yƙq,`,1d*RQ`> `lh=->osz:dX@r6*]}o+ն+f¼7Ƶs'y*e2 aAL|:94)2b!HC 2Hg 6ͽVo& -82xDz"P/ܣr 9#I a}^8_c,x^Qԣu8wd&L,Jd} +^sԩ -0Ho?M yvrEC -*WO[qA"CA$h `#E#@A -+$ g ˌzK`͊:ivQ #A*#3jgEyVbxz;ymn] 5̽2&s/v['a((UW-swQ6A%21O -AҘEPF ID`aA@bJh'^dHE`,$ `  !0D"BHA"!#Sh6(flYEVSdƊLF3eYV)I -2QFP$7Ac"Lc,.0 TJ+$ZEdGX9K3>6:r:2WiRJ4w`H -A"`̧ n'h.JQ)$$pcGcXt8*XIY`E(h$!"ٷR}Z+,4*P~uO=(Z.B1w[7nXD`NbfՂx&H.`r9ܜu)&XöMq|V2ʨ6L.^,$A!'0LbL8dej:)I) 0'X*HdA##H - YPU&X!q{ݭ{Ks6P&H!$:H q400,x+F#) h0$!!6j]]6F @59Q:Gt2$ьd{aߘ!` 2AX@" $%`A#I!(RBI!`"u9`ϣ("I  -Q:(&:V PAHbp(B&czb.Hva1X*4t\ּYq;Q YXuvf&LpP+Uжӑ否Z:+)|(bu>6=% !@X("$R -X -D cB0BL7mlre #%H`bUm[XX^0BA!Ay`ZaTIJ(er!!nWqv$2A=Y .{mC-Rά(uEL#cs7z Bc(~Wv7\vSf`כ2i` &,s}G5}\EE2 @ ZPaC+B!@a$$ 32F nO::axA T$A 0:>5H!05ɮwy83\l٨"AmjK'E~mާg)}t:{k.%+ ,2pdFPΫX,I I+k^bM%2ǛdHA$WPCFt a(Y!ri0 k|&9GcMjź+ ZtYH)#ՖD@dA E *@ !0DA -bT`$d0 *HDU|r&DQtmC*"1cVX`p -DHqdJ2UlphMΟ_v[eUFQQ\*CuG0 -D$`)LݛXIL1$m"vi{24 !H t!0*@@ G$#D y;տח5kRhq )%ٳT;f8) IY!B2H 1`HaCIC $Y H $Y"Lzr/ -ªR $QH\|҅ F(AQ@@L2ӫUϏ*!LpAYV*_שRd΂2[ǐuk9;:zu'4}GNgԸͅpFP[HUܳԭbHD TC-{__hw !E(;~d} -O/x7bFHA (Lr"+'zo*k'<[2NH$ 0gW霺m]$WQIHQ(״x*v|`B{YpǽzlBCŵ\k3cyyqg:ͣ\pwe@pҩɯ$ˮ&&2+w}Zcl>jzy޲ !P`zY^b@ASUԬtrtoG:Yb1V1LKm{NR]ˇzZ#) [)Rs8ʥCų7nx˗W:f|9+3azSzy[ws܏IR|&В 1NbMOC͊ YI08 8Dx2B"xF1`h eG$. B1jy4 b8R`H(qutAڡIk'7\{j(mcXìߜH`*4$*b $dSny$1<|)_+Tk0HD"Bc Y֬J !PE0Ude1(@@ *oZ@!UQdn/ b3d Qd8W٩5R>sdŖj6'CnVyߢ(w\ *^m{E '1~HU"`I <c3蚇k}Ŕ -`*CB "@&o1'JO*j4!XsGrʥ/v>?Xx Dˀ1ϻ֬eZ a!RةSʮVI^}@KR@ I|qv|Z쒟x0ͅϋ-E^8-Kbfǖ28:7(w*l:ѵj=bVwLQw ΡzTI0a%E0@8D%B@XCCDHPh3b0HD4dYZ3o:ս -0c@ aF Aƺ+ -5m;R2cEPX7W -zU}`Aue!B`ς52Tg[盵|!d#@I #+E 0ArR;;UzRJnRѲqv$$TY8{²brp1=sCzz5R.&LZ.-LsZb2&B:c>}yQ_èzY2SDH@IzV)ǒv!T* {C !"@RA$2BAI#l!E R0 ,! V\Df4%GTBBTB Bpg9{: 1>,fHD5vRюae,hs +Ҝ-v3L-[M%LR"F  !RZV2$ ȀR;:[~h_3Wˇscvܭ$H Z*u(KIBBV#a9Ӯmnv;fRPn4iŭ\w+ijuޏkk-%Yj b$$(VBD¡$VRCTHI THJ//+Sw3$,6<:zJV‚P" ZgySH$C" $Qa -1nht)$!e&7Q*,dUi4vWhofyQq͊&4Z[KRܥ.S:ljHJ" 㾕УUkv* -®J)\{'jrߓ>ۭrX1$ͽ&-ED/ n^x!LPd `fH*B -"Fs.x_yg}RM1`D(`x}<{CV>RC I DL -[Ԯwyb@h &o76epA$_422&6y1n`+>q@] %J<e!XF %I0 h!r -e!XdE,V FFB<4(#) $@$`)PˀUYΗ3nTeT7} <}:WLUC|#P]ٽeDZut&,22[#@I$S R2!@¦EdTpw8Տ.'BRZir;ԫ/~OHޔ1 ֕r)eQ HC$WB+3cʕ^_CܣU,VBUy7D*gWSp>l1ȼlG'V(u"*TCAYXS"I!$JKƭ{4gDK*E ZZ(+lۤ!×n[aJS +1cYl,"(J1",\c< -ej&D\x$*H2 `))D*/rz -P+ĽׇٽǞn]́р $*ioۏ -͖HPB)2(ʙ`JB -@!׋>SApт qd cbAH`-VGBu1N!d7ƲscK!ezǙ FFFB" ܻ 2Dj1x 0h@`t0`@Jq`!L 0Vb  DeC!HU\Ah%Xq%faqCi ]! HH -[cXUmڦ2#ɭhS H@SsJ!##|'Ac%D"#1NCՖHҬ20C.tG!FXJ){Nu~YSxNtU660nB ̦ -RPZH`  !P+"xBq8 lMhmYhw%fɲٰy Pףz]HH{R`BI$ JDHA $Y!EνaKe"+3*65\iPf.6&6uF ꩁ3*$2- E  J#BT*ŐPQb"jV:@ǕD&6AId)*Ȩ+H)(ŗ$P &,kck 4F,S@dHLy1VT%I a$b!"JBHV $! :2 :X!2+"S$$$R:1J$Fd(X! 2u(筼Ғh eeBbUVǑ$QKdr XHh%d$&D$Z,"$tK@d!Ii+ 1 )TKy<ˁ2`l FR%j9!65*p+cΘV A$Vac((*@D*gndrb&6F'XI1IND2VXTiX"0DY#^;vηC $R^BT,EdU$HXd!JV ) d XA &1U0`FRA$!²!8d9VSi Sj2*` +0r e9bc2Ș-ц|l T &E>9&rRZ̐b!F%HD!+DP@#LqrnPB1 P$ J%4hC !ɏȓ$ȦE% "$6 cˊ9zkW -cɎ\@ OFm4[>c=C7O,'O%SmOkFѠ|U} >+Shqß4]H@G"NgLU 1}lq:ԵSpvYa HDb`D20]Lk{%+@LX\W段垝f6:^Lg]1+T=HүW)- oWbΟS鍢p$ $$(ZY"@GA$QL!E,0(+e$ T@T$D%D jBEHDG,D @" B -@R-o-z\lY3cF #,Ve5!8!dHe1XFՔ Q8E0(cAAUS &BI&9UQ2BI$#F+0BH&Z5ѩI,h !CǙcRsdeedH޷?"Nd:yK]sלhvG; 옛"n5z4d$ @< $h`1-;˝W4 +Z@1X1F@C 2,  2H !Lyp(:n.nw{~rNTشV6FOcewi2+z+ߑ8` @ $D X.eͭH.䩑ua PUȭŋ.+]UcZcQY4Nom\H C$FFBDGC@d <#CEɮrzLYJ$Ǝ -(œDV찡*btYc  &6%ljl\:cWBI@ 2 FS "`P " WJ5I"WU%I$F*$"Jf THE 2a(,&"2gþ2AU*!!yM.l!2E!2E4`$*X2FX``VdC$H +)Hd)!G.H 0JBf%@Ԥ*d$0DAdH00q -*ĀH2 2VƜ7O"έ&.,\֙- -d4=.UdYY`RW]K.r-o lJG/1&bD1\\6*oLzB民j ʃWQb 57bQ{57;{joQQܫׅZ@$0$`"05y.uRlS&~νfɱf=\Տv$#NjNq?/<0Ȃ*Q~(AUG,Hdh6u+ɽ,i"ꍱfq{q.!ƫojgx `Y8Ji=;l&0cpTfRU *Y UZBFUMMiHjnTuWELnΫނqY#u! -EEY uqعq0 -00DC%@I!`@ X$@Z*Z m ,,~@D G"Qlm]h֜ jMZnyGAbCE$P[fV,&gWط?cm`6t3l.ݣܐ.>{GΦKxدK1ץZ<2$=sGD @$$H@QYC\X"&t\*nhmioח~U[mi+Wۣi\ݓNYV*ݗV,jߓ Kyۣ $,kSЧCЇ@C -!D6:ͥ1ύ0ÎTWAc%ďdGpUB\ -ejvF>ξś]^_OY**:FB BD2HH `("e * -20@HLhmF0+0 $ X40Y K: p<ZE-'QN`ŕ&XhAd&FYM$$ ,5U2 -`BrEebIA,Ar)$WIIb+Z$RA$$0J$H‹uW+nVZjzco܊d䀐@h02yQ5t9a2y/V *^\Bu3x]j}sg]&vmtgp#2byi}+xEzEyɠ8"EI&o>FQ  - $LHQ]Niҏ^ˆ;eJLvzzy=' -z<&zgY)^}q|wz ! -S U1<駧fƀ4X* -'+-) "Il12b"69W|q> *p@P2ɗM62_CydYl -ȂIR@!$!D)S"Q1LA R #A S, -c B) @ZL5ۑv0$Q*U9$"A " Xvl֖C2MGzڍpI6yb,$,Q[:t[Ҧe2fT22Unydj喗"EfGtH ZwŔ)#\E2BIC$e`(2c(`$S `Q hI -RRV -!@82u dJgH$A Ha18Z^v/Bi_g[4ICp,F*2pMAe[=X*{fiP3dF` !!2H@ -m·L=T'ZMfc5"V^O_S.uB $H@ I |~.=C蛳"mك=Z#ؼLz!xa l+6h wS',Z9oK.@W![n';0;A3& ei!Xk4㕯ZxsnI QuBNԶv\"]I/q:`P(! 8Ik:w<};X,bbO*׷fZs';=֡͢{K_4qƬ3`%0 +2.{%tۧ qlf=LB#\F#Çzd@+6U<ˣ~^eI-?HRTTes.lF䧍n{4l^?x!X1IcF?c}2E=Ww(vKQPHcTŊsdd $mGO*+aVGi #2{?NU;ߞ/<{S,L`!0Ԇ@Px"8 01 "b, Q)+ XD2*uR@ K0fZ!`*I 7:=7<0C.9@1d[y*xP2d+!*i؊v++LӃv>DTvÆ<߶W5Kv'n.zխn.LYroWf;Br|#9dE,0hE`(u@DM]>wr:X5r;ɐ<]KUK9y"UKiB(ȵ;w*gr凷XEnt6 XC_Ƚik"h쯩 P@[: kM[PT{&/7H|~%K2ʆa3/EQfG5@sj}2MK_@@%>*^s\]ѶݸbƿX^/W}?eXBHE!ӡ?wDB$HQ:+TZ<62+\7Oד3.6[vy~yORC $L D̏L,Rw3Ǘ\,ܲh9fnMts/>ܓrCEF]iE>㎸&VQ08}YB..T. P h2޿hW{4Qʠt:ַI]%Xp_™1y37+vR\ϕz`sNWn-{Hv5נy=7yJ]PDE`)(\{{by{p D#@y]>!H:h>"o[I$BHaK -ACBV*t.ВP 4E` ^y&*y'f5ޓɷ0IPpi~r:;5;^_W,2jyR޽'z^69UFr:N1{|^u_p#Ce_?{y濦,y R#Ϯ5^U+HHx Vkڶմ HwS"(@ kr>W>i'[6zIKZٰ厄DNl-Bu/>k9,)eJCSsƮ}K_<9_:"0O==׻@  R:$WZ^ıPDB!V! (x%p6u~?Sz<[V56LqgDeQW!1AP@T"7X@T*ve䷃˖"L5" ꤚľYh$[uPh+ S}J"y*WAy6>} -6jgеm׫80h_ty;ס$ HN%/.uS=oϺ)|R@Iq^?Էյ:7C0`5)c,%=һWMbyOWѠ -7?@>ux{Vlz[ DS#$x^u:+˴ςfvnIO1<[=O^~/hz'lڧ0KAb4WeدsҧۗC7—Hsst4-˗ՃSOUJ6[O5E|O-}W -=K)cQ{۸/:Pdq$Lf @`(1#a$H)X !$0fFS$CZ"6$x,2Db!91<4R VE -W-{{G\r$S $[<D7O8yL_9ݽ9W< |wղ00bQxr7$u~Co ,r#c'3HQHJ(`<뭩ӠۢΞcx ) 0ELdfdYYbzeu{9hymt8׮vg&CV_?6.CKm+JLiPgf"lڲ֖oˊ ,dyZH^{?πcuǏce. HA(wOVxOK cPZ(A\yJ61yǤb{FV#ḛvl)/سc<`X>G@.^U P4I{F*bRZ62I A ' -=7@Z&LpwR _RUU42T00qdr``(44璧C"F -a`Tbˆ^E1jpVę.(Hֽ^眨E^Z dJ;Q8oڋeƳjn14Ci%׸|v2m˞@9P5c$ xHsxcx+AyO>Z:5J?()7l!*Ti!QZĔǬ='{ioڬ[/})G yOԋ~+\Q4vދ>&ʴ\hr5P٣"4I랞)@ɂS69+2ű$)`b>qĸp*fn*ީV/\,{Qf< -D%P[1X__"_gf=UJFlc!*ZݧWgvz:.rI 2H(!+/1^}NrR[מw #UR$Y  _'_=^ zZ"U^f/9Xъk#|ίO$ f˫W;&_3%oKy侓]>n,󬻤w맴ioIu^7PXB> -,G^VXg]xu=Fj}n@ -eǯ7z<._RPFM]ihF_FM*ed#2J910큕К eH4ŀD"I$+(dQ+k #0R1H;,V X 0I!V X r|c<;tDT|P!G{vŻ~6clI`z-KO9y}7u+7{33TaJd|Rzj޵kҟX1b` a# -C$Jb4-}+69"$.E D  "D``n.mp,]G& \ ;9<׸i':a`^ڻlA$ !#)*bgV˳WfDZey}2FWkeEWՋY)C0؍|&LI_^_|kaH1PWȄuk"R"(@`4U`$2J1Ɗ^]-)|c=~ e^?Brn(`ɫ?Ti@ti0ffGZ]P9s=}]{N T010wy [z= DF $xI܃^)o "4*Lw/NAykǐPO͎RFn_*eB}CkegrLW픺KWgmWltt7v ^aP:5^礽=z͗=F<7חcԯó5 Sp;uŢnT2%3ֱqka0cP&[NzD@d T:"pw:WJfד<̾yGşy*W1v10yy1h7>nBcl{{˅ky@!-F -!,0VRN"J|zbN~8*,*TEaT{Pk.+zYNT} ;`Q2$1cL^uNnpgЬr<ѓ.jZnjrVIHws\摡G/"ƫ| -{:|rs9EdQ ԛ%)cS<Y -e/ω˺%23c`(|չ1B\~Ez8/V@оga[z%x6\Kd7"YAP8)e( +Kv/hw5˯R$scK9ǴR5}VE\pA\_K#v{-|Yzڮv.16TeǯۼONU>˾E=PE?=qm;ҪbL(b"e5:V;--.V:m:loѫ'7^-Mcϙr,U._YVvLu'Fx_vwGa]޵WV.?oG*5ۧ|٩32Okԧz2='{CFB!LU eMXq]kՋ.ZS/T-އ]cBDt8ysg\+ .fO>mKӵ q7<_zχE͡dBo[4JϔkX=n?c<;<ݴ[|z\^qɭO=9ܽ{ f#nҕZjbQ/q=;^Eޯ)qfǟ./4̾u%j1[U+zb_Fԙh1.ͩ{cLѴҮ\ӷ^FPI$ \PG0)V4V X;!EBFE̒H !ak1abCeF2D7}Úc~z۾:UɎT@HW)ܪ53fMG66yNGqp=|}[;TE.HF0:"&Qѡ!$V$@H`!02%/KpV$B0 `P€2#,CG= ys xƅӾ6dúqSvjwv^ĄӮTnnW^i2HX/ $X,"HVXI!T(d( `FB  UhP+]ס -p2vA4d$ _#)"P!|+gҪu+МЊ@TȚ((y:ɓWFe SlQ{2(ؓC6K^:fJl9꽯l1&Z@] ]np6zKwm]L|%e6 =2V%oyM -Ǧn<<3[au;: .c$(I>1xp\Ja{ޑ澡1GXuuVlXe=w~OsLgjܫbbצۓޗǰr<+=+ͽIXټXOwVǛ ǽS̗5f{<'6|^c3&xaK_y};OL;7[^]ԲEf!枧_U|輵ZٯXPoQ8]YY:QX.dǪ͖NxFus!8X^7kN*ܳ' 4חRwV5,a3x7tznȬde#|y8L -21HB##,a*̼ ŐzY)dju XҦQQWЭ]!K}k./>8a$^o Q(l᳓γHE RdNp%I! -7 b@a ޕ懤e)RD$hyVۛ٬XWiZrB$26*"EFR0*b[foc^#VoMٿyz c5T[.[ePNj.@&I/[7oO!)$DX@Ee@HT TˡFp\dI /_;Lutv[ PӘ!P$(U>}TVQb U#QQԩw]EGҗO枪]iэcV4emiP@ublU`h&o>x}ZTCޭ2B7z6i<}O]ŜItKT:ڽRo >S];[tlygBS"tq_>j}R>B4c"yg7XZoxd2Pwd^?k u6O0^OٵqȚ{:5x5_ГgfvVۛO>yw7< I a`E&HH@a!"I 9R@b0b´!$TȑAW;jNjw$TI -0FX* VVt|WѺ羅)Ll*kےnZ.Tx6\Mu&EJIߟzSY$hA$"Ҥ 0AI.}ËU o,1! `Q<[2cZpyv䫤YP.\~xzL|h`@A~O0|<iN,*((AqJR- $ʧ-yoDX -j"TFƼ1yÒF$ˀԪջX͜{|ԕWtMVJyWv]V-= oo=?Pkm-߸yl?g׻G;r"=`t3J\k_ҏ%XI᷋ O=߬t!BY#$UV>y7 -WZ\`I֧n"ϭkKUjK{OXO(GwEz_/f!χ5o^S|D\iR<:힅qrسFmlyyyzbRz5>yTzygZϦ?-s8β!*~ƭjݸ|dZn}2.5(ޥ-3i6bzF} JIK x{_D[G:=$ F *da0brx0S" -U@A!FRG8$>Gl8S#+ $AYJ|L+T/<$&?7AY6$@ehvR|./`J -bT ZNd{}[ *(2&5eT $*X܄킭*8wuu -J}mMGsq>5XZnhTϛVmiS̽CHͫo:UN'QS}[|֌T[EsB鐦ZY7ݚX|[udW:wΫr";~-ӓ9]Or0 L:;a[[3yxWY5$]2yNUUE4xR_ĞPkkz:Uf\f-n*RkE z6Ċ^k|C]Jsza{ʮk+fV-x 7תzҺU_N0&f-mL6<ˆᢵll3zʟ>[ny-szx4gNsՇNZ7+=}fɯuأ.֞1S];y;*]:{rq)^h׳uGKwNˇGeeH`HD"B Xs*m !2Ha$1 ,Αr&RI!).qƩOUNw۳v$2@'q}w_0V)~83:Ödk_^<9pzk/=%1mUF?>t׮vزi9*޵HZ3s:vO(mBr\uέgu0짞z^^=TrݚžDW!eŖyz[#+ H`X\-x`*HXth6Ly$&LYAHH(bRp>J9E0d(BI NK˗ݏq~mybukq+@[q7sm6moZM}Ğy=#)c5cϧbV"$,!RHbReŶZl5h;xcF:;U[lJi-,z^ՀuHvM>2HHI R "3)$, ȣݩWOW[5TZkM}|˃b-ˇW 4vy3&U[Fm[\դŇD[ -=֪[гVBǏ&(ةBZ[OY:tJնj^w@ONfDZ+ںr徜d\[z}UmByPENRH{,^0R{kd5OymJ"ٟgb{&Ş;mT-v<䓩9#_>}*Un<Ҩg_D%9ǏI&UZee)^Wv%׏ى]k-5WGK> zgl+͏^oTFVdw͡uFuȷWR!hPh`̤iDE $ c{\Ȧ@1VF+ 0B0Q+)Vlc2SΞKElޘHLjCZ(^j|1nUSvcyOrs3С JzsN 1WK?j%%q۱DfzXx_lYBH e02$9(0bАO<+s:Y0I$CJ\F*Dzp -{rt.F|ʡ!V(B|ldC^ nF0oc5Zs:ѭF*NV:gGw44 G3<[ڽ<@$2cI a6,P4@+d`HHH BHa ( "0B+Gꥳ]M8=3kei8$E"XѸxؼckg cdh ihQ {KSC[}g[˯V6tע ۚv^PnFZXS5mi஖G:dGsiFSd+)o"RaGOJK-?rm4yyu枵ֈdN!_sҸOfy`8>װXbK?ljDž:-,{WWlt(Zu_ף.= :~G^=z󥥎Dvt<$\s[.L(|+n[҉cYiz jtu?H;t*}T*txO`kl<_>}+;IJ5rTڝ-;]9)LdRZ*XAji˻Wu@Z GIXiSe Ϳ;h]дTܖڤJU9 kGI P#Ń! TGR8:IR;&i$XBB b1BFZ[Ζ n1 $LA"g$ؚ6ƼͶd@Ad!R$$44;98yӨMɑy,Yw^=/*yny9)vgB0^ a!P9x-q.>tUӷszC400b`&>\-)vѱٚ1#W +)|oBA !Ad=JeյL/dn &Psd`I?|O+ +)BH"|r`"D@ -`` -4R3p@HE1.Dhc%XT,0A?3PLb +p5򫷡.1תڗ.J$놟r7izPF\ф yA=2$M/3\&HxvZS*7+}񆭴ޢ681kw?ElxߤWMZwʣ5}s׸*[t8y,{uJιK|NnC " -ޞX!# $HAHDXPVI@!]TV C &Ah -@@D@@B D\ $@׉5X[jÞRϡ}BȮ.7r@C9ē?'յje%ɦmx\c}C-fe՗r6)I1:ud5?6c%VHS‘kVsz+(ҮZwR9=W6e¼촐>MBw>7AQ#Ewlɻ82S/FX737Ų幫Jm@[^Ǘu֤Zz}vRdN<:4ӣ]t×> .,Ԝ˩_=Ǒ3suG]Ovw୛,oܞ:k%;M⑇BSWl 1H^ d*B`I c -\,1V \CAY$# FDWX0"68ɍUە,XF.D)5a6/U=y/_=V.:V쐅`$V !8v]J>&ȭ*U5fJɖ.LS^]+}:3cc!RH"0%`LdI@~^d_:ؙ%!2I%d+ش7Vvzr#f !FW@2,JCW[8^~ X L1Dim̟M8 !a $ U+ $WYP@DR"$Ah%[ч8"FR $$ WB26Δ U`PB0J\7uO>)vgLLq}>#ƳEmwc(yitG+)WIDԢ'&Dyz;gXtiC^uk&~EOJZe覶y|Mgox=^A5:ڜ[{垠p{(^bϢy6{v0dQn$S+}K[ڗv(f`9|[^7fY4>myհQ/̹M>ͭ%-ҽh2+\d&U9V@5HeBTII Y`5 i@J9R(Ò^46)9.zίY #h=3K̻]^0(G(iX%0BVS @ HTb) H`$#*Bפ߀B*?#PIf]ŗxއY<15KrдqeWWWvK I -^S9gӫk.:=eOR^\۳wz=1hި[-+\J[b*M*X7NJx\ν(6UW> -8zU; mM Ϝ+"^K[Mu2.}^moj:d<&ҕwwe,ZšgK6ct>]UYbk[L^k4*XizdXOǷ_bK~i\;FwO.٥y%F^VfyZ4;L_);_ҥ0ֿ s:ކuxŰB RxŖ<ۖYjޒV 8 ȶG#CCf.|zKWn^Bz2"TvDf0HAH2h9p t[ͦhV$826mlJljER;ϝoj1l]>oG $ "I SWBlmW՘z>SqZxv>&Qѐ @RHBH4]pjdcDX $0A : Nyt[d׋LmuMS2H"0@HX@((4Q@ -J6<lM R 'hƯ$(X-.+VZMXw OQήT-$͞t[lPBTGبѱp{GKKd\^WM}y?׮jrxwS/mwwWavzQW}sgQ/zUWMޥg`yiuzmgjҙWMsKMڿ`9tKm[`ּ͙4/}c4&v+]%֋=K"J,4AೞzrڢmuШl|N1x_2 $R")Tq;i5(k;[Gpsm^ܾ/F%W{IC_B[}nd[i5IJa" J+ CGG c@" q8e ! 9;QI &ibٹR/sF e`$xuv:ٸ OUpM8 jI BHD a@C$!#*ВB+ Hsf$@ *BrD* "ȋ"B0`]C`B2I $ "*>[U2=&jQ/|ޠ L.O#-eKQmu69[|ۊeOrAQ(9y1Lƙq&:Ǭo/6d=bv2ch78_&qr=ڻ|siZۚȐV -@C o*Y{[jK3(p}6{э+vw$9>v{6XT1O@p'Zjq21SsЭYkp96popgQY*Jyִݵ|׼ݖΔnE.1<ԼnK񮙩~}"=#nYK60lw ZoGWl9ggP(׏_r[䞑ʾU'zN\(=!\F"A{NStW̽ANU_dArR;!`tRh  -1IrLtv\>1R:-|y(V2yz\JV%d\ɍzHT $ (`FRd UAGL0I `ezH!@N'jvCx/RB)HD^x_Үcu|WJn $2PB)px%dӊWOy)c'B.8HdJSsTR"ETDEǑ_Ľz aQ2LHfhz^KMCN{I)Z͖;ŇXڮضFYه/QAn 6Vc3^)niڕ" -U41u1חl؎h6Y4~ĕo[Ǔb:< ƥu4Wd0u7,+cC -k]ןUM266F)@Hňl].U>,k-[&-$d_yw高iI:M뮟S Zέ-8u253)Fܦ־Ytj7^CFj%*4Wm5jW6nmSWӶ]D'Y}"8MK#2-mpded%rQ*X&0]2#hH-X`!TZWt1!)^EF_<]@ܬVϥ +z͏>*:̣?z׋gW=nmOIlإBT@BJ)fR$!aa2P` A(̯P@s0`[-3_!f܀7%zұ[`0,0`0YηIlUvZ";ӁC 0 -,"2#, x,WaS2{uHVHHV/ѻtRr{yU(PaUf~>{>NDd1di!2,{g񹧧`̓9Iԓϵ٠ޓKܩjU=kpu8=؞}ugS>_:+I]Ɵ'jW^n.7s뿟qM^=lH -#9L -mr7kg -rޤSX폕*҆fzQ/++QC67^7oD*F#WE2h"Nbkէ>7$$< BF !0d>'L afR0!*$>ZQj^緒K!G^_Gq3\1@}I\ 9\2CObi2i"E$Xi200X!$ RH@Hb( luݼCA -\,1* -( 2ADX$C0 -YHAr@MH $J@H BJ Pr: -°TqUDkNUXV3+36dSKsVWѶ/}2fhB!+.1$uu*^vE{vwvƙV05{4U% -;ii{Hū-f*գp: ңޥJśӻ@Y;&_}C#a ȱPDN1#OPťCu6m@*|׬:Qykw9KE{h, y|.:kJŖ{ 5qlf=gӓӥ{.EKb~z}z]+PޝD%y_гb}OJ(^\TZ1dSdg "Y8TyiL9[h\Czqp{}eǓs{YЎ5n{t_:P&ג6}G}c{ o*ήzl.Sb-oj]yqӖ``:̮Ss/@s;*M!v͖|IuhHaҼ$bZ'KYuWq:fL9k`yǤu),8^1?W=_S*֊me*`0$h@L@X  VVdt24IP14idYB58Ke=N&޽G<L+z%h$ٱ릨de\o]G˒B  DL(e)`TC,ǐd+ÿmdEq$Q0i^YE("#H aU` "I%0b `D aA 1 e-tn&7O!fړA#;=Ձ5cz`oSTIft6[lCtZUA}?#)4꥞Ovɭu2ilMQ.+FCSgdlԤAi}*6=_-BөojA6!!uUr<+ܼ7;y,oG cL$ rai -e Z0 -@$(H -I]4UA:uq__91̊ 1XeU}N~iו9ٹ}Zkv #+T2J Re5+ &,Dj|X=Kn;X4 H$moQKY I $PXH! A @+ A"DB!Y%"BaɠP⣡ofKCD*罵%[sw+om}:2dEeg U`bլv]}7`+Vd4aAٛ];a56|9l%?V?0t+U Xӻ]SxңѵvV|[zm &Mg/#B$㆕ާuP_#-P}gi|OkzI+o3ڢv%Z)vӰsVD+J釉ޯ]'8usY ,U{;2hNo^Rz#='wֽ{w!<=x2Oҷ{Gͣ}/Y>Kk|3~?5)LO+yA=xc$}:>f 5} ->{y>=_#9<.9i:T;Q9ݍ3CҮm!||e̫mfNj;"8^CZ; ҪGT)>eq,j_cvdHa$ABIa0 ' ,1g:`l AƘD;09a9Mi&Rp)ږgKҸaWn'e>~֜tO?/L@XҰ$ 8]jW}څ"򸹬g|G-RdqBH)9 -C>]7 vV}eUKd,,29-lsɩ$HdVHI!B  2PH$HH $2,@JVB4$2.9%ȑ:E $/HoITN rEdBFiڐJ^|ؑ$UHu:Mhsdi$UFI@ȋ$&)#ߒI^K9$4Zri&7NJMY%ݒcrI#!HbK2<,͆BmHke7y53 Rv $ (I +$k4$D$ S$$$!HHMC$Ua$$$d $I! $_~HLrYC搛.v'ڐI$ג51I %kIK5Ē d$D2h$I %$I I1Lhd LpddF|2X%G7!I$I0erI3c $$rII02JBI*I,E~o$,om#Ԓ #G"uȞ[ّYj +$jޤImnq̒I!@HgI pɦ=) zj& #B@$42aVH*!S,2CI$d6$$i!d%<$>ăI2fIfؐc""L$d]D$2C +elDy$ A% A2H">9+GWtT=c֏O*6faSݡF/}k%?#G9hΤ.ѮZ*?c.9mb`}&:q湯ͭOCiçbI4G425S6sLPpz=齊$YLYNא螓 _κyY*4V -YκuԳU=ݚ%3},J̛eGy<:Xx1gO\XXyLJ8e[iS ^w؞qd94p]}&`=z#<Ɔy,8\ha:ytdOh]j6b=o-q%{IRn `i@NVn_'q( py ͔r^X} Z' G|]DN˽>^`! /bijVev: r{sM)J2t()OoVQi i(F;d:W0d  .vwXUtǒy58 dM8J~dX -m3oE -~_o2Q赚H)"J7#OĆ'Qz JVK uņ:r'2.c]OC)Mkʲ.ɠ3M0R{(*+sЮylYԩdA*laB!Ί-sM3ˠL胓^[\{17(B=}q΅su|%6/=P_\+hMiuΈ<{ oG^aLF0BtDiMY&:`鮧LDI55sIJ5}vMYf|1rwiNȰH]h#o%héV3`-5B^IeIFϰo26-th@} ,5XXR#mk`wf dӈW\$3L(`Đ:7OP}e-뜫 w>jsqq|,7};x8S_pս K» ~&tyn1 qL鸠[?Es9ƄKYQPB^5>O[!bl_|;*f7AR1NwXdhPh!Sŧ8fX_ A--O}+hz !,Z.Mas5Yz5e#\>Dh1#خ `> `'AζkdrG(=0qFU)?qz?ѡ "[a -jwb݉}$xWɢ8m@\Ή$V}qO卦#~I2TR>g'AfOۭ9ڞbl].Y3݊ } z8*D`K~r&@"3Fo=y'NS3h$:◹8]Xq? $={?.dE3HJ=aNmn+y0[V-b:#0֤)ʍ%uU&`NH4;җ/t%H]?:O 稩!u8lC h4ybIQ)}yUK,_cxK2/ɍeG;':Dɤ -CLl r -:#QtO ;}}}ccJ׮NTxMkD@4ПE#s#$'V?f hC]2H5;tJxf1)CgMUSC77uwYJ0g$$4j,|GN$)(DGr~""ҷԮB~O9D9~$ysGy))ډGҖXMy7/YvUSH}"ȑIۙC5~jAQZ?Ar[u%rMY?f^cT OWxM+B _ImUrД5)vʲIN3I8Jtݾ~Y:Ixt9Wg2ƅMh[s2MY^L[GŔk?6 -s p/ dR dohSA_]Nwo hEƚ$#m j|QV$x,ɫif'k2髝'{ycѰsl.`8`YWhHQ/}?%@3h!.cNܾpͬW>ÇAeVbS("gcnXظ(T@3Z3rEQlKEIc"J²xdFz3+Oa92*lEx:(e!D*2US{A ֳáeЎ!Olnѵ bHF_*A9x-5AO^'v0sV xΎJ^_&Nl6d*D}G qfYT4rޭdL,$qwYкz\C4Vg==E mb2-eanJRU--][*i;y=MM`Z|_u>"=;ҩ&(v#VyΉ I(Gjc_L*ivfg+=0TvhB@G_G&&P$ #U(:J.<Ҙ-W{AD+rb\fNckyōU9`,]_1=udo5y58+Ny|{ -xap3OI?2ȡz=oODQ/=_4I{D n68ii9xYo - FOI&mr -Wo5:ӝT.Z'RDa>UDu.ě#4)1$d w3hIO:JytwnuHYE\b $:OW6ns\_m*TF 醅u/5ڝ uu$ I+KS#; g^]b^3_[Uz(:Js>bjA-+˘It~ٞuM-()q{. Ұa,ٹszsȅ*,t2B5 8ﵳE PAQmK.7j`~ %\'ζ|fe<$b2< 2; +jZK!lM6ŨǂK|:mlsiŨ9(b2H0Ѣt7"L2>%"ٳ-nyЬxwbrAhF2RyNoyGׄ`6^AgӾK" -2=[fʅHQԷ3\R5~o2|_qLqN!b QKq̊-͹0}5ډ,FkX@)9%IXUjx{rK73h큮V,F~-<T[d91i?ȭJfj( -+3q|Ī2"3q_]iT{Kq#:ۊ)5=ZgVCv Q| ZI[qc1:D&xㅞDt4t4׶tgM[:z:{4zRx5kAuAf;(̞i c}SeR-r# B`~w|O\(r5i|oҵkC$Z -WH|+LjmsgΦ5d84@>m5>my-3j,@^4q zwHx@錴b5Dɑ\bj٧Kϵt䈌Ὢwo#GS$ty9#.ޫ,%W)Jv:s-En9e\ytFu^`-DlWMv*nXƠ2rDtJPHJCǦN^6בhѣz YNJU$Zд{X=&i/1#RIH.\I4֥ʭhI8oG'Jv9z3Cʎ2Vй"ҿ(6ҿ hRXuZU1:ނW4eKB0qZvje]/ ]$sd H.*_p|$KJ6ɪON{i5sʪgT+WO!8SbzOS.%rȩ:*9HMC:{3ۿYk]Y _UYJTvoxfl9,^ $ihPnÂDooW}v_ZJOg(ڴ1ډKS]Kx}CBCkOdASbq8F\i~aO.PfwyIW1OԳ]Nv!>a9}>_p!έj5VNn9>59jpg."SL1"} .u~F0VE\u4PI^"A+^9]ol8i*u Y>nG-TW]^LΎ -=kXs%Iuζ4kjx'-m9V?(s/Zy_Lе/x5dq|ZMsб /&IsˬgX!zʊR +Eqd"8rB6TGc҇_1}8~TIF~ו:KѿzC\2F=d@5(rkXKT`UI ҋJ>W-E^V؜D?cj$on~$8@Q\)m-GP;RضXp=\\p};ўnJ0?W1R$ȟǾ]uJ)*m?D`6otrzUCyY}2^CݖX`%݁|? IC'WCħY#T5)qi̭ P: :Jͦ }(X|/ BV>xlEi 07^vpkq{G%w4m}inŹH{GĢ-hw}9wr&+M[^ C UR=ae UXhǕ*^ݻ9|K#ˇW)Ǎd;pVT:;s9l@d6R3yS -aj8s PJ&4ס#L߸/z 8$^z# t\Gkϖ>,T= ɞh)Sn[)mttd@X_yrx -'>^W;_Fzb= qqXj7#LT׍Q&]guYe7nJv)h ~Fw_q"-vrp#QN+JR7+=:s;*YwG++ڊӑ@J=ͭ[6ml١ͧ493Cd5#AI,Q}k<rDVR3xFT?ܽ!`ݯ&퍶 $]O$f8UizRk,%v+Dq4s5P~%V*:t5"l<0hO{V!mx,رM٭p8 #RΒ-ZuqfvͼZ1]xHkq)Ya+#OFz&xu bhUs-A.P2%#@ێn9[N~ +naDS4>2G4,p$`Ț޾|fDaZY -/3@AS[&zC6+=ȜM徵#hƍW:g/_GDj3?lyacL3el[k:YκySOec<|Vr. ~PvGn}"Q}9#gȫ2K5pD˽-t>O9u|9Ü`rg'w۞HV[LrqD5jDk _@6nNpn9RsR3Fo\m'O<$PL~kD$>` 1]<j|PjhUE@}ʲ3M䐼~xƛɇNQ>?$B>VC14l f۽6+/;ė%ܫieTW[z}#p1Wϥ2Eӥ^O@}a UbO3::9Yή|&κL/ȷS ʧߪU,SC:^utsOG "&U~FV)v^5S螡;} / -izJUΎG1RHJ~z)wt+ MO1#%.y百ygg瘌}nğC#6uK=>4qNIQj - N4&4)aR+VrG^k֧59jsX>6m[ rƭrȑwsw:mށfܶ&j3=ef=礹~P@>MnJע]xA!QaK! Q :xMiz.«0xwPTњy2hURjtv(( ]S]3T0bmI:}g19I.:[YZRȧhaeMo:[yNΖtvpհE @pnv)|f', ~W(ڋ!6=oNv`-_s!SQ̶Tŏbqew NT$2_EsVeo?q\L49fͭ6h٣gϟ?9="aG2盇WT_eA+$Ǡ~uq$]̈́{ A6;)xY>id2W_ŸUw1 [s"u \6.pcLgR2cG#߷kDv8o[<ڮy%1دj@z'yfv#m>\KHʧTj' ~ԑ)`z!w.Ѳ`_Sag ^7voFa}Yx6rfh ,r ylXc>q&{x1"D<̀>eYUXUMe\~v`ٛFhaoa2 G2k ;DjΎLZ~l׺".W {JG=`.`mVJr̄a QS/&CZ=6Myb_M۬hP r.H4PM8%{eA xy`ȩ=`UۅGT -0F~V֐KQ]NjsSȉ,e$$=ᯤA#wjsqƂH$>m7!I }beMhU"׊=BrEmFPX$=K57ԨVȄ>|"nlp|e9@B.ͭ[6h٣g͟6|fjf[76nlٹҳ>Ngy@gS:V]d-~&n;$|c|g;i]7 rWif':gΕ:Ys:YFrg*r.r.rlY`O?bo2*}-F$yLK2ml뫞ٮLuZ!HHV9sNb;BV)S2#B2b%>2ۚ>=4ۛ}=L;Gz< ͇49׈"Of -;ue&E7kNў@P޽7#ERm 24[s6[mzٷ)`1]JGW *W΂E^8u۴aH:)mpض6k2^aiFm=tUa8T4#)iC?vU/SKh[1»ў973ɥQ~ -Y -hE ->P5pXcJL9[AB^K5p?/1d=I..3gR1($c⾃_4kWG6b7qr,gY6Ց+s݅JWGBu2n!_Tp%c/):VDQJhex}mOb܁ Ydꪟn}l*o4<=3{,0|0?nquX -H [-| Βt::%|`J aΆ!/<sW9ؚ^Bq'f~0ߍFZHڨ՗j.ՖY*wlwZy!(X|!LU9rTOFHao0h7%4iZ>6ǻan9--j[ -O˕7l\{trG6 mVc XA=+fY#>t2W5IӅEWN|eOnGӖvm\2Dp.hVs&&⋔zM^f:| \Κr/g"r/'`rlYf%xiijGZ_NdfD F[B',L/tiͭ[6h|mHC#G[ϿL*|e.N;*L?jsqNj}]zHu>_ytai8-ד3LV,N,7ĦȬٱ"}Yz1%!.>q4ܔ e̠3M>Z@ @wğ$pD5fF -uſYQ}b}0cO& - ֖f]K \sb֝dg.lnfKyxff̾3!H'ӕD<KtǿHi('+_nl X D !#]c׈EWʖ+B;#Vӫ,R}*F5p}Ib\C9\CZ'ղ\4ظ>=S] `o؏UcR/#w8tKĂˆy#-䜔іh$WM5c r\0dd1=fy9uqXWWO7pmFIҼ{߭(#pȲ{Ce{LkjsHs˓!,Srf>dxh]Ά!Pω3[8-wϥRVA u>|5-~T5v3l n!sr=|d":ȡђ:SG T4]9ˤ3G9s5,gKK:Jx+VƭSqD賢#Ѷ#ݬUiNtdRMPGsXXS Ýf ?]dGYQיsf5%7ɿZdJF~6oK!mw~XʻɭGHڟH>%4Iیz -9/r͆UfDKrfOV]4 e#yX/zbt>]kY| pyލS)L[Nhr(,[H(%Yd<',g7`{HgTG?QW:-&XA%h])\әlkNtYvH@6@ht)gjvO 9%6C@mENRgN]舆m5ŹU(gp|mMʏL?E=:}A[hr]C|RVFxKj(H ?R?þj۟6Q-y28d]Gf2yԛʑ9]`eA O8TyyF1#EP-Jk%m܋{zG,r~~z]>/~9wZ}7 ]wjΩ( ݚl3"35龜lE"5T07W3s9wrɘfGg8k#LJ@̭emELټNyH7sV5>'կ7|=q͛nl#%;D*8V}~T9ʃ9UGaέ ՘ HZ&l8TȐH6t-gDѾto>tG6tSgA.t` Ή*SM8ɛkm%)9>([t+op+ -MWvZASn(ʜE9'B7ƯnWR3QbD-)RF1n^6HO sĬ{q {5~L0&;)Yno&؂]sG!>-GGgJDf )!#ƒ‹E3}\'Bl5$8{0$YnV]P_6 =N]̞IiOnsៈ`eIo-4vkפ~a3iG.>c5j=,gMO:ZyΖtsItgIt᪹ -o#I&GU'x`٬QbJ9G}A>at͟&e -ˮ'&rͰmƦc$TƑ,QPe`Q԰KPe]uZ@Nº7Ayq<+hSтneN2@=+d=޳ YYX_Y($a >+0Re/4UD{c0Qoov,*' -G#@83CK F+i|v<\?+# 1עY:8~%<ܨxNZ-zy!N2Ez#&<=X\du -}E]IsgUk@{bxɉnMmњdC?1c[<ƶCb sS鴰#m~u󪩦,8Gݚ&>nrOgHܒ$}n:n?gݟ۳nióNxvmṳg/g/g'#OC:j TkUN̳lH6F /:jHr"{o$ˡاq3zBHß-L;ŵ#=ۤvI-8Ndj:#$0#??߆4o8EȲbGfoPF -Ser:x|co(  4qq,pNWN#ؒ켈bVۜHT -8DOgxB>TR$y45s-45GV~d*YJhY3ȿp׼Cf>͛2?=alگ̶l`ۈ1]pW8Tr Fno>?g;ᓋWjTOz?HsqG5ɣx!sf㛏Xc]=S}sa -Άt4 L$.>"@=aOK􎜠us n'mvK\u1g&,/a+,I4"9aqz=n~A7\F xJ4xFQ.RG -hiOn)s%/  } 3CgX?>MWN 9)C.ԩ1ԢG!m~t3‡T7sy퇿{f͚Der$kt$)v5;_~OLv+8uYrZ ' I?͘-ğЬˡ>Z:t-\4ΎtPgEt1@&yzg.yvynynyi-9.Sn#<[G:ʓDW7K -N>}9bWD:f򟖽V]^rB#2ucq+j#4V+,1t$Ѽ)܊4(R˓Ejd2Ž? %TX adMR>O$OqW5wMЗM /2_>+-6'Ӯ}ڼ~K?M=Yk]tgO6tg"\K3.r%Lɓ92g"\K)Ԅsʗ9R*\K@I.~\[xH'%c}=Y؝Gvy&$jDf (w65kcR ZLşjqn M@,W i!'[gH$D |}P>x3yܩ Ft7GI"&zw2  Z=uUV1xyC2EUQRVXaCJ~jXu*,8W9sW?zV:kxJ@( f xX˧g6fC*%g\/'\u:xμg^3׌צÂ~z3< R\=9,_:&$YQ0xM׮զY+]2y^M'85 -w}DU6>bg˟h!*ٮm{l?}b)_gOIF=AԬEa{Ӿ+Ű?5p}C2nUG:z^"r(.t=,OG:z9ΚtԳ=gKK J =JŘ%ee`C%$hU1$uk,Mrr {7s=֭kcUT3eYT|&}za&Izh<B\debŨ.*eVVcβ!Ýl9Cl9GtYCzg]ug]ug]ug_u+Y_7&z^dpҳ 1"ϾO|Hۙ`؛@vn}ő: saQ0,"΢<ǜstyΏ9g6,Ŝpooqyie&N5EeQuq$/.3^ʲ\KoL[JAƵrI=l4k`J@у/.l>L$S4~4"SctP! =ʯ_k:YȺ-G3HAE&r8PDMvy/{ֵ ٷl>2nDG5|kIt:H3:JΖt󤯝%| Ύ E_:hū z5cz9+ݬޫV 77z>4/P5E^BY<ɾ^!'b*Z'7TdH?-G HcC&"\ֆޒ,tO]HT#rO*[w%|yu-~ $>}fa}{ N. Mg:[Zss%,Oo:{yȷ=^o#~?|K ve?q-mL|;fJu钐N4!zy5+}sQO'ݳλWϵX-<L4AC!>h' 3;VӻE: a읽C"q5>2"$d}s{7nlٹ{Gvy# 9؀₞dO@߰zF3ІSi5x t~\9ˇƽ󬫝el*H_ 6VRti~En@L&JWa%as`o.HX+u #nYuIAe[#'w(oq')񵸦ņ.\c4$A.t΃<~Oy#=fgga36l6Oc9v3>r9ɗ9R*\˜2G|znu?udzQ$aۻFl`=-aa9 Vhy'Hƭw wMce}^ôKlc}0& I5cU{:k Cx+5+g?4݇B:'}++#"nXq|OͻgMo]>LǮr95$D[cdoyZb*3&0'=ztOsB |WǠ}|:K@F )Yb@Uon,14eK >7㚟 rT[; Ij`R-t2ܓp4c CLY-4]O9B/oT؊>:XD2!Xڌw -we˼$T0FG/98_ww qݯG@.k!hg.2Z;9UC̓9ɬm9 /<46m9igrN#>0Cųr$v@?xE%?\ WcaK_9ΑcE;t'9M4I4>t'tc:<Γ:FΑ|HzI"#ᅴx,FǘD -[EjCAd+͠ha{j$\1"$~΢%Zfgdk̵A<L㍛*dSSaQxgUw_?#Ů޶L/[ +loiLA?d/E_3VCt΃ѳ'p4'u2yQ'}xJ8d(ۼe6)R*7)''xK;~妟&Ө++N-ir|fs|9̇9g6 3_::WΪuUUlgU[#GbWm*~O#Yq*>R6)^B3Ĩy/j1 -#׀x甝-}t({,\}|0Trub -#z .(E2@T -gae^@X$x1XKyɯQQ&-f˷,AyN^;l^$ʿ;9Tڜ[Nm>2JcɖĮ"fp4 4J;#q#P1^??w^(FWوsG'46y`yxsaϢi4aEūyA[EkaH}{{!Fג8XL]?'LA"nQ,gIc:;9XΒt3gE6t3gC6t3gC6t2A.tg͞_6y|M]6E 5SbCʌwg]#h ͍fxllU+3[uel#ݩFFvu=4aaR6܉ָz{{fK"d߶rӴH/[sL'zL_.:;ЂhLe7UWu lî g=O#u[ZS me S SaEZQ r;Ρ.7t9σ&=y; -$E vj59HdhP@Ĝ_:T ZH$@GO㚟lԘ^CʻrD |8sxr8m@ہ#QGz]e~Aoky{/JΝZ\N5es4 -42Նo(I>ƞy?RcE&?49cfͧ]:TųQF'۞kK4ȧ6 !%px>O[56Y4dF>&z]ÆSj嵰U`;pZvUYHbFS&] gpdvCg-K1P koගۛO>K*vٱk}̒ -lߴӵ˕X-M6uV+@[]#Z+qYWQ'e $|4ZWZ!,pvp pk 6pv]އ'\d01.bV]ĥikQ/$eTA]kGr*7Ʋ>֫6=nd6I6.֖d*[G/ѝ<-td86l+s9_s6F|\DX fGJ&kS7T3_9c۝[99[ VTGw; p&巆[e9y: -sC0~\990D D|6,v q N6`sC(`OOwbD{/|͍3.rLʓ93aAɗ #Pfs Fh4K;. })ɶqJȗ!Q,<']-bLK[מZ $9r Ć2# sgͼKc+.O`B3[dvImL)˟d>o΢u7r g}y2J^ -pgC\ȷk4M!?.Bf&-Q#}B(srP`F >[:1n+?Ύ~"F$ -8d|ym'tl%^N)O)qxAMz]ޜ!9A4(o:׸4 <;ehǯ\UVszy<|ϟ>|-N `W:٨>pv4]uy5nY;WˍY6QwHWVVbGe0U(]:K5IWk&ݫP`3s|8!!|&å:IkN8N6q zVٷ!8"R?[_WIr|2H!r8bttw!Ƞ哆1ZXϳEwod@'7?뜵,[_r[M'[UF ZٱiT{F/Xv0~3ƿ+g2G%]ݣDѮI4ҷͦ3l[#U!A{N#'7E}~5ob~ -5(Nb2d6Xȼ>+/k;*WS<25; NC*ޣZ87*XVQhafyjVB*ȍӑ6k=;6fήuv3Ug<96lc7XlgVsaϮc !U\9ɇ9QEmw1~fKo /_:Aٮ6,WhYV$J-X1h!{ّ>[5$hcbѫO&^YnAv9qӃ+*9=8]tī_vǃebzɰ) w6SeC 0mYcEřH5"h`W:~JژQF # #A$D{!43̨gR"VcxMfCIc┣/7O ~'2ӘU|hd'PnҼ|5v3G:ŵLg>+Csma=8ͧ6&?OAZN9Ƚ~.ؼ@Hᑂ8+5 *[1$r S+'a7OY׈PBU\;~8SEjdQ8_7 oLqH|1ӋL65zY4uSߐ$6QzyLuYb<#Nʔ<ʉEܬf :VUsC[4#k`TSK?o !allٱ3Opy6l9gOiuẃg#\Cr?'c:FfBfAF2PIO::xUB|@kk4u.G]9j㞸-V͝]m3sg:so7g3g3333g3g3bH2^Ս UR-vZE:fvw},#s nO&%mXރN%]~Xh -+VɃ:Jر -Vy8 SY ^ij́L#HdS O~IjӇmM~`x O}Vۺ,ԏ0'F}uΖt3!]C6vߵ'Up,WK,R;p X`ɭ 2\V~Vs}0_6ה~fH-r.!A"UnR;'6s0?H䑷[9~9[fԷl.)'fJVft^' 9 }T_&o|pGޟ%wmJswϛ4"/jC!ՇS._SiڞMW:jUΞrz2,${,rqNjsS 奫Mhա~y7+ -U٫z;3L[wC.ؠ?K,踖V[,ԥa0,gOHqb'<甶/ -с--(I]Uz3:3@Q=/@@ׯ ZfcE:Noԕ+H]?!c+h㛛76nlճϛ>l>lѳF4l٣fg#?nl96_NO,`$*7؃BK<kN[OIN-hmbiPEn+OgK>[[*۔7+`PY5eB R^3VXDyLBeNT޷Hm~Gj,%~7 X3t2*DڷަG*T3b]+mO 8T28=Q0gȸtu f]fӅ\7Ȼc Vˇjݷ79~_˹8 {m$I,>xl.%]Ǣ@NAS-N J󦯛>x99|G $wT|Ec)k|w/ˊuZF&yDcL[~,#w!5țTa(tǶ&^ {K>l;F]E{aΦKtWEء|%Ȫ"= |kgC_QWU-_\h%`OTVh3}|2}˾- I1ye,yAfW3uIȀKlv:7*0u D[koȼ_mدY}J x!qO%'g%EN͈1.$+Jj+Xp7J)>YeP7<]1_9 R̯ovW144TǸ3pڼ##$~ÊG-RԹg t5(YSe}zX5.eJkCǿ<6$^Mu`q*Kc$BBRK\BWAӃh'ZX[ԈE+Zd\f=6|kaG81՚s/V=ۂԐ|/2Y篘uƶ U$РmDO##q ,z+]vtNMk=9'<lZӼϺExUg AH%d 앜,ݏF>0,lΕ|ۀ/ϓ/4?su\W7U3}L֞+SgoBI#M4OWx+#W$5RF̺;V ޼^J~hT1dWPˏ"nX󠉻shøn6$U'Β|'Ȣ3xF|ϋ9d:xmM*G\ra#+<\o}!g~W7A$%v؂ _2gGvɧ x~kC)CI>: ӯ)O-]C: -9ðq[r+zrIj]1ٲ%ifD HUiycL>&k]9ndqں{[gҐg9cppEXgO_:z@U&KO"330pNuybM6p節T 265cr2"K󴜱 !7Luv:s/fi]ӜȽ+Ζt󣵞_>y|XL󠰽«(sլͩZuiVjE=;r4ؠ}j fT eW4?cfFf=dMOjoA .H0(B}uh@n]L{i -r[/gH_)Ҋҙ]0N] sg‡ĩxIOkar3.%kѰXM55Vވޓmؿ9K 3< {ʑ1fKu:ʸ/W?t>+{AP8jegɐfFXW΄߹r -E!,q})a!Cͥ^Q*ۧ:htޑf$h*F!̟WLr_iXܲ!>߫3D7Hj`2$GVs6$XǐF-K(y3q'/F>;O|BSr9\?m+TiakqR0.?)so_W/𸲛q#gOŰVZ6ȁgX{/͠XHsKG&7^i`ȦYrz|3&܍xyTEnfyCjg8 -~mjVϛ;ZU9ëV&2t50F.! Aaoog+u@{]+2ʁΑNZIQ{ k4qH\HqK~qnkⲢ8+%XU bՈG ӆkS,VnNJ > ╛i%߿yfp9ͼC6 6^͗{9~V jq* \Jud}78ʆ즀JF/0s, u@ڊWcĀ7^`q ʚ=uq -ˏa kDZIpmh}#,L;O]yO av$+hǤ+gI6tkn|㣼RsO*HpN+ @ǃ9ppuic 3F4l[kKfGRrzG'[,ųųŰhǧfy~ Zr0sy9/U|0ӛTX A'8rEf)9':ǓbYHd -vI )ͧxWjsom3eHN'V݉4x7DZOa*`0#Ш\hpQ,yuL(&lW3Yל:qdg.0BOq -K8kO@ HsinWy#9DZ5M#=,Ȼc.rܰ4P3F5vTfZ֖df~½Z'%jȪr)"Yv#Of͂,I -aӜp҄wb'pF)}AwA%~6YxraXd$ $!q})>m|,<[p;>lϟ4lѳF|y̋7śd9̋9g6ÜȿO!y#F Ś 03B.(u`]IΨ۟nÞQN vW훾4'7ś,HenL{[Gn`[Lsd,vX]]Gˎv c< -5$HJt\G:>#NS|d7jzm*u1m@E?Rk#}9fhvCTϓ5Wj[s !\RB3c&ߡOk_Juotͩ9=``to*-{/g.la| sj~C* |dӉx28om}ԡ&AP߱/Ize9GZ/Nu0b=1tɝMlWGg=Nk@:(LSLN#[MԺ)WhŰ("!O6Eg`b#əx>T'̓RUy2E/m0UY6x UdsI%)z'_^%fU1!ey"3#:k@u;ao`؉+s -F۠1!3jˤZr8bT;]f1l:XGe ɆSg }l11g g!s󥯝5|K_:Z+3rbLYɋ91g"FDQVjyza'p8Bd!1@4JF:{}񴐺,]|H /kߓtLf^}r)^Mwxy|gA JWh45dқ2}ʩ$UqkVn*@|]A#1q%k|˸稳kglO59I#"35y 1k3i!\d̝gPF"TL4:j#+Lmވ < 7ƿ*5`OS69s_9+1sbe B.dz YQJ"=>9/(,y4˘Բe8eLyJG6uO $q-)>[E'&sn:ԻFm̻^Au%dL5%J.{/8l -LQM).u+An\;=.O[c<|~h!)fE%8ݷ#JeZydO -sFH<+a1iJTh?9u54֎M#%_O]tԕF\P1?aj>~ul3VQW.A Xi6tnNW:V3]ތ/g> [}op~5p[Ji#qmF]Rp†8#Fˏ"ACvHASϒޱ"%XI23*~!X\ʸCo|l:rGΣgQű4 - -Wv8̚`wN\hAqƳ -BywSTXǙC~2JsΞs%I -Vt8?7>,(u0A$*ANdmrV}Ļ;)A'Q\Β-UXz3BPmnRQ' t" -F8=sد*5y~B%8UԜ3DBӜ,gGg: : NmlsiW.uW6̾S8,sE3;Y;S[V*ւ/PɾRjKzWt=51:I5$H},]1@\6M-?^vKMj2 9hL̊i;Rc]_.ug[>Vq7 5( d]R=}5jlQ\6\9jT)M1mIXB%?,MjVw"+4'g̛Xz>'>x#Ҟ>=G مkDupl⠓T 0Ue725s#ZjrN T*t QFx55eu_E׈[B-0˯FKURQu!7gjhxR_ i"|VhFs,H}xd\>X-嚸wūvyQylxDj:k.$LUYۭex>If% WzU~g"xaX95駅"!aĭX c&ѿ;vI,·HS@f3ƌ5_ HAS+4=(Ev+"v+)[﫤H -0ԷCW Б_|^R oq qyFTKThin^-A-چo#'#R1=-ll̠j9pXCs6!s.I,iac)XsEg:)  UEb( )j*\ ay _NJgMOunc4**oS d3Q۔WYɫmi$,2 pKD)H{ GE]rW"Wþjsq%Au@ԂNL0%:ɮLNWSb vKBS_h<9ɳx 8/ LypF ۲Lhs\FI~JJ\$~ܡ x BGpY&5 -ԏQ5Xe8_OC[6llޭr{*$A,qǵ4tS_UPxv$ts -Q~ 'HF6yWָ{k0'~aŁvŀ<4G4w˯ξuְ[ޕ;ëxw1[ztճbd tLܥBuUx/]GJn -%`kׂqny8]g|Oey\GOV'7\qFKC9zXl[#@i̥.Q=#B`#9'Xh:@7EG~ByeQX֚ts##Y$pQBU|/ג -3h'Yq jwuzf-$:MC[S;U,g Ik pP0ґXSjO^(p"& z0{][LINKfڎ+`Tؗk&_v+~5:̾,}`b y]$ÍG&< ~tYϋ:s:3:Wζξ,ξ~<nAU3hˌgfZLvVGW4UT}g-A F#mJA";l%ݻ5WNs/Usk"k?T>};rY&-XaӗUSuy^?AտD2R#<L*` S^}I#ߝ3~ޤ\r9"cwY;iToĒGW 7+Zryu\rXRe{1mϧu6E,yrж9*"&JRYHI4Vސ<^)- rY9P Qn_'\OC wx[ lI2_y_&"pnӷO+a|g#Jb2iO -]^زԟ88e؜&@yMueL Z[t~\Q")GkHanJ0:s ?eyώHB*,j՘i*+*itl>V*D ~Bh{KvXKǵGBjSxO.^n$0//Vצ#tʫPĚMH K(1pSX<<Juwi>hӜ5hRΚtA\g. l6E 7fݚsq5?|[b<2|jaRòAQ8 =r ,ro9 -?,H#ȕrmNo D]yj疮yvDe?!u9Nj~>I–/ϫj34t_}X7igRĩegI#>U{V -l.l;5yD p*jt>kK<֞5gZ<{3Eɭ)>K;ʗet`h^['ΊIR4oׅKa"r2_nW#M"\[Su>=[3]\+baLEjw.Ю%E,Z{0H4jE;J\‡XF8cZ92DCV)`~= -̪0b;g)Wt~ՠD~YYY -OzďrG+Zb~4RoqTIZqV]VM1髾U3CRY8uF N>]D_ kf>[}M rj1L'\ʫ!LH9ܲֆ\F5D㛎jsiґ9.IkM4"z3hwHCV.4 RfGU$2LIQ2o Zr5oavApN'<;Lnka_:3.Vs:9n#,׉f%8lXx7geUƍʄ{c?V>B-wwAU:DAUpU+O-i1:Z 0UX{ ӈ~xy '376~>}ӫ! -9/׭vavu=]LkF$*_N!}Q=k59mpȗ$cD/&U:֋9{r͈eQ$J.ax_J2R;DɃ90BqmɪIL3Gp.TkEI,>ph!JE<-U6?ӯF¸ylEjՍG;GgWWLg_O"MF"lpċmcc}xp"Kf) .FӆWbv5hU4^]uQG9VMiKQ9yD|V*_ jW27'a,9:*rȉb:eAq錧Pëv'vvؓv6MmY+%_oX<_|I+ o_:V_.O\i؀FѺt|F[I\%rGS]J Y[Bkt]Lh\JT֦u<&ξ|ac:9YΪuV3UKs&set SX\tLYУ5\Ir w|3+Az`2SId.[Vw ?W/;(_C,/Y$00 Zܭeyo֌՘_Ief>" !,gIOM28vj6HRC0ԝ <.F:æLO0Wi%e]QQ/4HF$/iz2hQ(Ӗ+rYYB(Za:bѫ i -$튽f*bwO% -ct1b-)2^{G x| 5"$ l9#7'|Fr :OT64hA1Ζt3 ͝^syvyr&yrgG]ytYgC(u?e&]h$-9<*gYS:ʙĚ5ك+9g:  -^Z{sK_iЏ^%әΚt3![ 9=u|@'69dXm-F]r6IcnI.m1L.2 !Róכk-25~nBL Ď -NͺprP66 >`+GIZ2\<7!a]i/ԕJ50[Dq3,C 6WۛB$j觝U虇.[b:g*Q$@"L!(zȋE5jF&{u%r)8i"T S4Q7mÍm42@3s`U(y\->*=qqY=qdq R﵅+Dvkl ÈM75k8K7YRP -Pe)_scJiXw֭ygn[[Bj͜5@4Z&yY8X -6bu!2gh֌1?m #{pYUg:rIW&mX&}*UǸǂljDw}va`%׆ |XD$ u؄+4dcOf2϶H:xc^#{3Ѭ܇:v72 cC:kU"F\ZhXDi,Vx|_BMɣA{uѷ)W]s/ы5Y&Xtׯ]39׾ҟnu6{9^!q ^9ΚtsCkI9hI5ԉ"FX?U"$h|,$ Wcm3Lq49c4T8AiAØ{b(;,v{ӻ% sw:úPfk9v14[r"'VX;"u==|ӷI q|F﷓)++衿9$Tα?~u*Xnkn5Cm,: >@Y.O[>x3ip? zΑemzh&#O߃}+Oj<-[yt9WΊ0ؐ\&/f!d{yHI*զ$/CAȡyyKN))S_/_vC?jNN*ٰq;z ƼD!hPݺYӡhl >ib}ŻMNKX'`P#U_ -[O1K4bEɠO:vԊ8}zwPX|?Me ocf<$s2Wd2qRuJFOi -s5ͧ6p.i.xH`gB56?F5[)4߁I͇6s1w]! pDĈ #ݜ@ S\"S؉#}80YO,VR(lȡc:I:ҫ8=lPeK E} UYX\'tA&HZGz㮍tF˱ # 'AeOdJ1p蒡GT{EW,\<1P~w>sۆHeۨew2zog&3~kC9ԳELn<:`~<\̧2!#%-S֓ū#gg Vw[R5Szm|NmɃ(m0?\ێbNo*wOjO/BVlR}''QO!s?H&Iɗ,迣/KJ>4ȚvS3&rTRx/ZG}$~ΈSeu)5Ʊ![0Zn^ΡxTD~uj0[H -Z6 *@җA@#΢ ;(Yֻq q\q\Վee0rݸHyf/|` FOqfX˧.<\.JmM.xy!&ySg甯 -i] aQ3PNg5{-8Zޭ$@ -ڔbi)MfZ9,|dEꛔuNz%#i/q5iX[@RIυwq37և8%>akl4MX xOQ 9i+}@ L?ȊYZ TE*`ژ8@W&'@m\(V,LVgQ_ $Y9DL2hkBrJn1pPOA%H#`|''YITbw؉{$r'In?4Y.s8gȭ{*Ü3kOriZh+Se^Dz"Cj7,}1oִ/TC5j4AR8« Q/0LYkB6>rP<Βtv3:: }ly!Z88Lq/+~q4_5̓ -nbȍ\uŎ&m9rI"Tmt=;}wz ߹h~T*7E5}5d`z:ik~X g{A,!I9F!RwJÇ FIOMb(WW=&[Bq%?+ݽXgx<ĥ^1=?7_9rfX~|=I n2Yv#I$6 76ol٩n%YyljgfM L\T9n*\#]d|)éðJ/:I --Ѩv^fZnWתntղzԹMc6>Dί]ltBz:E) $sa]2R73LדNDВ܊O&$Ҭrc#Uv$6#tn]Yaȷo49cuĨYyd"$ڙ|3@Gâ1#7V-[_#(o%C,/& %%]Eږ.uAádWlsQ;wTPjI Rans*k4s\ssf6|fNm9sL&|o}Cjn Ξ L#5J*,Ė+r^l]#c?f%[_g!F9ZTbL'뵸lP= 29e,O_2ɞlt4_yQDj\.:qY 7 ҊH Oe'ʳʎyRq~|2 -Aq7= |2O C}dUZ'kVQ o 22FJ֭-U -1lJn(S鯻F!X -!i;v伐eKmoŪSD˔Ux,An\1uq -*[WTxq* he4cQ¼VJm_,q.j싇$UI t|[ȶyx9Űvon1Y}݈н:_a?b1ŵ'b._ -ONT2ixPf%x96jX_^u50ax3VY㛎o9 eGRC_u3 f$\?yڜ1)Na$5c}o{pN A(ux)xdp蜮/j4%}桫^%V')94bhed\S9pr*4 ,q*s!wcXԿ]G4R.UOLX F Lۛ^'y\h9˵Y?8o; -< ijİhqĆ<|IeqߖkE2zO -q.^-[5 - g")ʏ!i̯n*}{Rн;s|*bAuɗ|!>:zN6,~99w{9K.tgM}4YA=,ɣxnirOv}Mp}:qUÇÒU:}26c˓9rf;o)sӝIyMS Ĥ$ᇋ |Ӌ/k&MQsvn5>t=M59G{^CiC"F{W'} i- !]ɳr]ImH5\ݎؚ,U,s5(dg:=sfO姤ʲݠWZugU* cK͆&>ޣƺw'۷:8lpM>nc4XΎtV3˧.<|˦iGs}5Z&')@z<1:~y#julg][$[(,G\fUf stb0{u2?gL-F];<+dbz氟j ,_v[,d{J!Qn,88$6 2^.L"?Lpƭق"}*OƟQ܄"..C\^І&r+/ dB,\N,n*yW Flj浿o[ ztcdɚ3*9\Mlnw NT [n6ݱG\^m+'Gfv;z;(u^Yȁ_59: pKoIerh։/rg_K'N1iS*%J䍣]YPUVMm+Y̕c2ՅDkh$'0m|'ȓmPz!}+n-sc rU1d~nڤ]w}VgTvmr~ !7ǚU;͖9_Qf6#XםFc[&s$M暫 FIzӖ1H qԯ窏:d_1} d;vNZe6rNJ2)@wf3+u*2si$e}c N\5_i١kSަh/^yd`|22* u5쬤)NL:[)΂l&/l3\OS:zyʢ=Ӈf;?܋rt7~DFɝ5N#L)\gB ]?UU@+ͮ}%k>*YW:ei%÷OuΚts8f -ʏN+hcf{g]صɫq :e[V`ߝ}2JԖM>XWUr^3uz~YTjRDfNk9pdeL#킥4/:0"wc ?]<_R1xuڨ{SNe_{~8oV<,E@jvʸ#Q#yΤu<m; zpp'3IPӎvK?DoQ:*xmܼ sW]:|7lԿ2potm#6=FU':̈6qm&̒񬋌ȃsPbUnIģ Br9#ǎE*[WAhf8Dvso+;=8lXBcvCm[䛸9$ ʠjsq7vw*`߆RRU[ڰZW͖h!ܱU@"NdUlwc.'#{ᬋG"n_,#u'xfZY9M8|A#`:5?H,hHqz6hI,h^*?Y 3e:muRCSoё]9fͯl|پCd\s{SEf s3|y,Or?n}C7fцrTE04$ C]>>CK1Άɝz#mdb$ܞՖqyU\RN_`#l)3F b/3Kg rdAbE?:8|91`H/nC =5y]/ΪWo}o s\͞D{ۑjՉf>ޟ4 )Yk(wf{ޓdF4icM]U$ks-ݜثnNاicd+U}xm~8Ȓ?ebHSbdR7aJymLژxm\7q|2OVuDeQ(P 9(KE9^_P&9O7Nv9؀Fq:C'*(j^+ -ڳWg - _\{fJsH<E6yr|H;'7@Eˆ5;{ k_̗-δdsoL#QηJ*>'ֲ@#O })g20Ee!lLv5`ͳKb9r١񱿖ju,{5-6RR S[6IOܰUX_Pecs㱳cf͍xYlE^#ٛsy7:HX6vy_9g:YwFm[o:KOֲtKxٱ+H` -|q9]^&VDS'isT daHqRL1›S_͑?RgiJydڔs^nܭ VeRhIJ7>ly\YyU{xL:]llOA}cߦ=LQٻ Pu,Ϊ uαOT}tv;Q!%s:Z_[LkTd:ALt+qayr&3A3eގXLy#!&mNF`#.!oZJ؊4L+bA LY===MT{ u|mq S=2 1MÖB̩P_xm> kE7啳jtU(T];K2K+uVhEH$qi꼮EX*SL,;5į>)@6,m8 Ө}'M\fIM'Enͧ`3n`q/[o+{f7xFZ;gba>:Om\L)7D0.^u HWC!XE 'aR^(!r3"g7򣻵PC!cRɲw7C5buf 6m9;uQu;t~'ӚvY]PY:+t˶E~Nc휘󔙱Gu1ۮ5cDvLOeyK ٱcf=)i+>_y|)H$I4U#UM!>rZ(@V;ӛNhFDBPuEY:RB3ꑕHI_ۮl*(U#܇N_.yc8LyGMbf=xe؏ -;o#Gn5@Dʹz.1[>,ҜPgKt󦭂3r=>|wu+ܐNH$`&,W8jK>hy˦˗lE&Н$ʻ'$C!vaR$i捼%wr i9Sr7? )}O2RhX5kutY[r5x]*dQNI?v*l4y ĻhK+iF!oBu_O# Gc9 0#J̍8*̮AW3\ZkUɰtD^6< r/#JS^RnJ4AJrhZUytwGuɚENa&9 - bB"־!]I9Z$!Kգm5cQr7  4*ȳr>cTNuUun\gή΢C,Ͽѵ4I`oVfͿ:r8NXJ*q 14S.~g%ux -L$L.(Kçy]'38/+g\XnpkӶMjq݇JKv%ΊLpXǣ:9s"X݄E&/~EG'3F ʽ☃7_HvKYeV$ NnMlU PqD#Z5/AgIWc<49͇6*|]o17zsKeY=$9GvSю" )2omw&n\ܹzVd3:93]sP GolpoBG3~Xp}^c.yiβ7lno S|( =4β bε?v }kͽ9Yȼs-Kw!d>"+b}+|^wt#$U]sW\:%I| -Fn -6NS"1#8ׄ Fs,^$i|)ܹ>@]*:L=F%?0TgW_ ؒFO1P|2>7cچ3UET\LЈnxHФQUybEģPo͜W{I)|"#%Ik(CH4ue?n^KHk:l*Xhj*ȱΉ%i"TFo܀\i$.̳$xps8I?ozρ߱I{F<3q9ŵĚ^P|F =L;Ў0^2̗zxxb#֝jo0V+YqU κ.p2ð|Jɷ~I~d`&IB}Hb$_P][4#喊3CUΆ?҂Ns]gW{ ԏZټ"ư̓M;zmnunEAˤ3#۬tŇ/3Ny͞a6u]c:οۄy?8GoR{f?WiXg;boSqߪV#}H%"(ǧ!|0v?5HƯvJmO΃>\p}u<$@%PPGg]%XRދK_L΢ S_"6M -b'X9a<.U|y:D2pw&i%N.ٲl);4SSb̓-T՗GW^$\˳2 ]&Mcʥ%=PSHB1hw_QCb)+iW÷l37LKdV|]&ә_rk&~)9 ƕ<ҞrkXNG16sR2H+epy CAX^r췛,.W]mAhREպ̗"h85}v]W%5dG]:[6oq;*I/_7B%):9R_]_:.8-V$p_-Z¤gӱ;BV3ϕM+#)TN}-v߄$_Ec~a#M֬3D pj~h'Y5XkHk.tPu Xeae*׊qRy x_UQ%/0ֱ0:>eb]J,+*QqTKbHʢ's H-+d=}~!-WHѽ4CA2GiHj"nZ dҴ̍:TVyugoG=}Cxf*Z浳ke&HBaxrehE< xB?Ch -2-4,VDzs{660w"Uή%B:v#$ᯡ#׾E`.ˡ.< k!#?@shŪdtb/F9c[Ÿ،Ft{ KemI,QriLuHI*TD~\X;hskfӛNm9ss!T_eM=b29,r}.TGWh==sCk_Essr5GxFrT#>~NF.77i{xE#}/0ج0K i! -Nllrl=9.쮝Pc'I*G8%$κr7x&'__:3W{2#] _Yo v_%KR0[Pu]-3b۰Qj)|-v]<z iA^&xTeHY5K栍GΈt=dyElG#:5,M+A˵Ol:n9.YTGTv7ߛqMd48۶h݌TΚt3BvY ώq͛5>?=U\gWW:ڸ6ϗ%Tdm4o  adhlWt m8ꮯ%~\,^xYH<2Qbb $549x,'}=TӻY?0ad: ~m)oid_"$MFmm/b8F7SS.sbKٲr-?|: yÝ 9ÝVΒ%h:YʃjMtr;Cx%{f3 "]}vPTڧ*JVFGL"6 G$Bdͮ0O7*&|'I]Y8D䟾"X]ܘW\Zd:iY:pxQѵ]6t6#H= -yX4M4zRFJpu^b>o./<4tuDX/|5Ť$9$ՓUer9Xæ;*c@fٛNM,p*oLdw2Ob8!U$:N$pX՞x 쨤{1.1nW5LOQGj7-[QV+%DD56nWIgg_Or͉t[.$_5VMO5&!H 8BcFmPޝ$v>hZ~zJTCPPFqF 3*dPE"? 6ٴ[FBΣ#qP +Yz9ci2(p4+R3g@Uɹ|ENy}|:DuLilU΂%ZeZX+iHβjbM GU\$jn[Y[k=qH;/x2,j0.q4455s_CNm9kfÛ6sOFWPxrw~ !ĀE>ń4NUk6[~T.l&Ό܎ =na؅戠NieȈZV[CZhV:Eh)=϶sWI?ݧI[65A%v?87oa$ctsp$BX&Sp°Gqz#)]6/ -@js[<@ع? Y<3S qě#2u:n*CJ&KA6bU*U}=EW|4@w//)5IvݠN!<#o3nv#k\@llEp |\&>76o9P<>9ΆJ/8dEdKvq څ]t>PԬYW"pcMaj3~p \6snm|Zc M3֓z~2Y29VU޾3XY ~n,Cx'^Pp~b! OǃW9;6`W ut41_H -ٯdÝQ>LϴOneͷtkM,i1yx΂<"΂,~M,`#h)A_O99"]@DѮ t[221O/i,=f}/Ψ3Plk̍+D<3aFkpDqmnNe`~ C貧+?\=7xm -[B Wj3{Kkcn9N!_DFU +iskᖯA/F̐FbqR(ΪKrӐJB|[`5i^h_6>ߝhsC/;ܘE!, f=VKh8[#}X8pT,_*Mlfٱa hmX+V-/"m3AGhskfrُDV3XToAMrq~gX^g|yA{_" -#}wk9@5IY5ݺġ4$G6TsIPuB"t L)N"XW`õT;6@Nd͡ԫ-Ȣ%!^&ڧ0q|1u9͐چvھciZ=:r1f<*8xD县Ex%vī;4S$Bճj|P=ŷr5_xˁXdQsԘ=# rO&<dt8lB3:3R>^s.~7_wG qq9~0aQDsXE);_itFI r-b]RmN))@2*]WʠQ1+n8y⹯ +/QC^vr"S9)$xKjh ']lbV8k4Zh=ɹ\6hgȤYP:orRWIN:gb5MKq*雓hlI~s VO58;fgdF$p6(YnlrU"{tgtOoϘRx,94r+f}̯rˬCn; VXF2MĮ|4\UJqlyx=U`莹nՌbI)wKVtG/M67&e`6Ya5_8ۯPBU"6&O$]k< -?9É/sFyu~:?j:x{<jHJIq[@*R(XUuF2!t d6cߺDz]FcCçPWѕ58bA)lU Qn:?|Om,Wc sml8Vf!ݝޛ"7ԐƟKƒ (P/-Z.u~!6e}ZphR!@qFbΆs`S n<5ՖJؔMG$53i_<ξ)]>]rZHdPӓP3qvF"WF4 4Y{I.c eȠ -kf*IXM2\<-EjER$&Yc^%.EXB۸zi -=$p/2(@ŲSx؜HE8kA68hLTţK îJVo3Rtu7@ҭDL9uՁ40_Fe%&ı-9]FϺhpDIcw'Jmw UFXjea՛6yҝaN8^}$/̩M\3h<{ ]>q|j&gHл%3rQ݇8Ly@siͭOSʍ@ @D` Z,ډu;r -sE.t'Ύ kO[r\81湮n9OVhƑjA֣ )&T mow،c&˝jM|y}Gs3kj}WZ -ehs2(!U*u*|C~Zʳ -\YWS$wg8j| p 4HWO[90fsHd",vXªuq'Cfb^|.sȣtԿWL8\88mQh(3K^ML -g\ :w1xAw᫤dl>YW.`2T&UKEqq~0`N>g$YD-]q %B3ڜ;%+Xiw؋n㩻[.}f.LPx6 F1# -*$*mЌ)C5 pQ呭ir"n@)د[_Z܍2/60mO&kqBY؂#l -@=hD"09T*ȶ>s^->[4r %&N1`3Wy}WD5)#[Sgke}3G;h~`\'ci嫉:rigu4b&f*f/U&Ee/ ekھ'NZտ0Du,`bXuQ_O<W;{ 2iȘj(VΖhm\XK5Xlu2.Zbf<|X`fA;nMDUc]qkqH_+uxtR7lSgw~,uPo%^#kIjP\dޫ/ݖR,$7/Dqc,Zָ4^&mgpWD^'Q 92g.@RQ{j.f͝ -FZS~#͵O &='ZY[:ؓG'`!eZF0Bޮ:¨&Qڄ'j4abMyuɣN %d_ʃe݄Q@?vNg* VZF&%UQ}NW oPw99TVV:Zid cRfxrYH*'&ִt@xsk:ZFZ7j*vhM<]3nAWb*Zcԅ*;JƿOܱ1ß@XjiyӮ?X!4d f?mF4YI]cī{3to -+OY jbq -ҰA$&krQ߂lx]2vDHB;e ŢJ浲yQW!3FS s˪$))e2^S=;*Z.鏅Ƙr*\f7xP;s$k؆΃>Nǟsg:s澟.ɯȫ=S%L$qhk#$(i*:T&FUsJdtEOɷWm|V-r]tfo8,OeWR'HxԐj"<X:ÿ ]uŖ;Gw&0pp!Ej2pFӆgׇH)1Ď4sk6ym\6 -53ZQٮk'.rjo{xVǍ\h$ß4#}hGDZOsQᯉ6zȯ5\ }>DiCP47h5pʣSζuԳjşiQi - r)ZEԻ_sS]9uFndRf,ʀaJe06۩)|-YP(`hreYQM?JFbq44Ų]+$I&4t\hXb:LSi!<ӝ!Ttt"GR2>O07ЫXe XNÆ^R/M[:jVW}mOeFjqsT궞raeN7rZm${~A}.w|5ˀi%(BMHF'v,Bq٦?\b]N}NoYЁ -M r+١p^_bqasswF$K|49(#:Dy͹Oh~)k%7 @&s j6 -yqk\d9Tͥ7ɅW4 $F]<#U1dS_! w>[TwI٬=βu1X0z'YldY̏92, K3t<׶7._ x$7:Á>"^<9|[I72 y|W9'hAb "]E%j߇R fPCW-wIPgq?1[I_`|-ٶڍ:ÑRm'Yދiάg:h>X5q -xPskgU9TκZ~n]vorQmbgid۰GǦw2 O_A#ٺylMuyYʏ~ Y,Y˚v$h$뛆x<:5w˹#nFv1ـbfaz,C(si͍Nj49EÁѾ Y4D9?JA :gO -I+n? .NZypx l#z1D\LLLYɇ9iiqM.nF3Mp?ͳKV(8@6H:Bt1Cܝ/}a2:?O]nB_e.مuF V4J_oi<"BPg2/v}dqSbkqmlwYnY4s,M :Q9LM(0D!ݳ$HS{fw#%t o5 xv,[=WIlXb9RYz,40ij J[u6ksnib3}\[SYh8t09G9K%^!)=pYyL}"UWs?HWhrzrI\D!SIg2*NHd] I]"weN1;j vZ(+:eSsaƚ0Ol'v5(ACU5E$KS# l?* YK1+ Bwoi'bOv_O#71 -ք5k_J:xfKEϷIt#} 9}3CGij}Y/ݣBG,P)IΙˣhFr"}0Ns1) vtrxHWE`£HGYgUTgYOg /WfyP5n#Oa>koo53E\Yaslʭ$\OMr(8+%eyy3xOzs?&/lOk |Gpb^Dį[ߣ=oGFx_H{52ݧŧXrsW}*"اb,WoWTACgk0g˭n®@86?H/ZY!f^>\WoZem\^b=eFFkݽ֗&s2 /4MrConWs9^-*K(g<2USql bϛʖŮozAk6cYdjeC'Avk Nsf3v0,&fN!wdΚ?[XnēI#q~?^0]'ڽFI93Jʼg+i/`5dŻT()َ Uw.ZjA4Шv3aq5a~IG x,[0κlVuoK6Fw8OK -h&Y3Ap8"0]s>iOs Suӱe>tӚ kxE<]Odw,vONK:>[ u5f''MeJj7+V6[k,cEzEΓ:UΛ בpYMtsVG -[I,2Nwʈ4_ȓ y> `|}5hP+,1JHZL03n|2!RN9KBŗSK B5k'>nYLlQp -'b5LDc_IĜ6q+BMxIri ѡфkHKgǞY|_zVԦhШ4RNv͘P2x&6D5qS؉Ybp%'Pᔏ)F{iC$S'\Ĝy|v 4OD}{k|٧r|^eᆹgIW#(t,G !G>lykզZ^#O߈,4v>ej#K@/B;w9Vi 6nEsݱ5'MsVn>LYϏ7=)el*C\/è'fHMt=#]K -BW1#ݱaJ߰lsr=ɧ˂Z[-M H xM9Ni7\Icp3LBpy g} djzk&tݤ_y|9&w:ݥz}rޮjzzMklqdV5?C ijs{(ԼJ!'suܟϘ]S#\1LOʵ}FUЅyUAIN]dF/OV4j`2U"AR~~ E'8|/3ql$X{d-sFd$+ uRZv(7k;O_4F[ߚq'\Mc6q R\V \o4Q>6KO - E˽Ldh |,ٙXGOf;ܟyHc_ ^o5St|.FHؤCwӈɬ|ۯW8#;.馃~1;;gOtۑfrSM3=)#I6ATlȿ1ע; uF>@xl^tH#]*@u\sAmgx/F׺@4܃Nc^T-{jpn`pҦs.C$/kal&dӗ\&%۠:~}ck篃ıE&H6kY#~L%ۙ"_C-vK##%NB#;jsuve^.^Rь? 4Y-qWJQzYK~m+uu3_]o0sxƏP7$#b S;3B /ՍHQ- hw5\ g|5;pn =>vk3S6jp5ܫv_4sO:7Gءolja&Mbxk1vsM9Ni|qƨdkfH;g#8tleΆLdBB4ʒM 3ƅܕJ#aiF<|% ͹ydef3Fޏ}I.ؔ# ,<3 kjZȲ};40 ܴݍfweVgY[!_Z뛉SQxBĚJ.Vb"tV^"x}#ªo,IZn9"dZlb6.$Ca^E|&T@|ݻ5آZ|YXE>J.:$4%ov(XoCn5҄-EkӿU<$d+´D;M$ "07 ЍV\j+8a]¹.Gv+22H5N!8tq#VbbbۤqqHZтxZI -xmt] ֹ,l&]v)ihc8GGs-9R钱HdaI*,I:5 eS[}v`4|C=`pׇI= vrIp\sbo{ \EpȃqvxGP٭.` -8)$o+GrkC\q/MչJyt$]C"]]$[#AŊ/&8N1B(%4L9qusBvَyNi$yKVP+sK"ҭ^#|XR=v`ʩ*Fɳ.;.Nì8[@'CҥcG2J!aKdn㇤+ӝs3ijesŶܲg:"iï+[,9:-9|O7ɖè@EFIR~!6LӊgL30ΎY)ҹՍ$xÀ5$2J(>q%X'nw -V5:7?l/r}ϽTNk$]5DiY6FX*F$t؝D8uu'efQvε vPBbYkE1 #Y;C qcDXI#$W,2HcilSh3vz@;sAAaeLK*x[{)(v;aƱXea#* %~Loc4ηIdd)oDezZv ̈́ݻ- V r(DwZY ctM*/G^̶F>Cm-4uZ\kӱo~eWU?.dXtXcL!ꗇ daNq%G$CXn~W8>}q%VBBi.+Z:$QW+#᷾># Q]M,nuo'@s)cCãɼH'!!bѷ!/*2dފqY9nv_BVg"z3 djw"7MK@pq`3xC3<ƶylx3.^G8cU9k :Uu QmIk1^k.;q)c1Uu6d3UcBIҟ=^ "6_'Lo˺/&Bq쵢E]blB["|lU+Klוu&)dMZ`4dzpZ&`hbv$mڳæs=fafVʠ{f(lȃW:<Φ# t{2%墦HXF x,SȠXwr8#vhsCͭsl%t9d[ ^kfͭ66llٰ͍,:损6hg͟6hsL49hsCXQg2ϱ 2J.3ؚ,`$5tP"2sы"ws*8dƳTw I0{뙖Ft9ܢ׺ Ԏ8 Ul׈jǒe]%՟ӷ:[klc[V+> *ݺADl02q]䩓O}+H%(. -q~T -T[pGsg6m|V/)uϗ+z#ͭ_4lz`pQPi+%UP1(pRr{hȚX'](Qt!Fx#BU"E:i~m|VΪβsay9C<<uV36s|Λ9g:lMs.stΗ96\˜s6setΗ:6s<9'jβuu 70q;c5-ϛ9af>${e#B$qϛ:󩱝UYg:9XΦu63]gUc ':Xζuvsvξu󬵆ݣ塝Mg[k:ODO6st${s=>l͝MU 7s̮3\3-gXe/:8bb{y$S1umgYg 9af>{: 5]H|ض쯰WpqKco6y-R#K3%i6 QW[r΂R+\_XsxI_m'VL5e>i61Nmb=-m9|8fgSW :0ߋ<oǘKa6yζusD,ϛ9g:lKs.setΗ9:\M6s|ϟ:Yζuֳu_ky839yyYYCIb0gAa_:ξu󮭂S]LgWS:U5cί3s`l9̇92,ÜȰ2o]3L6skfͧ6ٵkfͭӛ[6hp~l9͇9gUW:Tξyx2c% !0@P1A"Q`qaI%I$QDp#y$K53S53S53Ql?3Qk5_{"Ю.G\v} 4]DbŸlm=-)_GF! @],_]D>sG"FU0`L"}Cb"ˢ?b0N.?HP`]|#=GC-B#. $ pYuQg8oQ#Bpw+m\gF2ӳd/\l٩|G['3j!AE#O}ucJfoa{!2# kȵvoiwNs(}ģªW"|쭇WwFDI4J.o|6!Y/TwW:;R4M&C43C40GT~T*jCnŨ-GSb$wK%FDdXo/u1܉'ȖjfjfjfjK%##4ܽ4Dx$+17U͝HZFQFjD|t]QU#jG~Fk4ǰID~qܡjE_Ol]&L2dɒ^tU}vd1UP㓞C;,\FiXU骨Q.h{]*z?V5"Q$$վ$lY!I:PUcUcَڌ|9p'ӾQ4G+?|\2Q$J%ɨl>*:ȝu}6wQFjFjCj8H̎$D ~j,{KvN-I!D"iGpD0&>HtDetkuXIG] kWS5R0(yoaQ -#fG&Id&i9ǁ+$21Ic6oc]ɚd͙+j/Bٞ͐@tLbTJHdlȘ5b$j;,ɢcgzigj5#Qk5?);&ēO͓`}VM!jvG!]$U}ו!ګ$؉?[80>R!R"7D4E{.ʍڑ,i!4E%A~C*jR>DSBDlc2I6[EAF ,Ji -89JFl#$ȏp7ۻY$bY[[btb0ctoZ5LLLL7'?+Id %mtVX%bI}: [R:1Ovո1I$K%cKfn[^Cْi* B06RY-I.3d(V6"b2P.q]I G if6@ŹfbK%M2&3Ю\%MT+:p` F F9^UbkJhӁ/rxaxȬ'W1R(gwiFi4A=ض'F,ؑ sHF&8Iё:*Q>]r+7č7F,p#]LY5ɑɎ)zh%EI+/DTBz*WkG6@]"T& E93̐A 5Y":4F(Br9x:$ٍ1_$.ѹyB5Lkfkfj|xF3GFLY,mLgʥ%x(bUrK;!:5uKEpbs,:ǺiDIĨaܙ-UI'a]+0`(GOM#Q׭'|d D:!T;ELnG[zDQ&QdbG8뢓#O$ő_fƈUlW?Q(I$guX9^sC:Eb0F!-}GD3$~I IbQ$d6BL؁p&Gf݊I}z%J%5, G .k5gܪQ -:xvLAnFV\uTvM%gQHёQADJ^Ȅɤdyѻfȳ2=>+6r&D!k&E -ҹ*} L}(hOG;GlY$] C,5d1&C!Y ,,d3C43CM&i4 I,CpC!EbغZI,y\.")PQąD -V!B*!dUޫP$BHh1D:uT&~膅DRXF"F4bt Q<`҈BH$DRҪDBD"҈D"ҍ(҈D"ҍ(J!H! ʼnA^(Ѕ  0@P!1A`v,Ez%b3B(qv~;OJŘ8FӑwCyX(((qH߶E9#GC 8 p4x7aN_<zGz Z("OC7q1G< Z?s%܌~ tq0:=ZCzWG=+%ft+|Rp dhSp-ː5xgXޅvx3?ù -c1|#jG(iQ(cح#7Ӄqq/4n0h'# F(O83p+ۣ>:xf|%C#fh>a9T,R|k; L=R|N8)uE@ⵊ8S!?5mQKZph:Gh9нcb e?cCC_3hXHt?A}#(bs#2cb`ЇιG``ʢQ5b}`>Qz䝢TVjv,t,?>"4!_'|x 8!=!)k{gQн5t=wBK3DY n8`wtF-[0cn㎏8IRtGzJ.A*v}0POA#1AҀEʷӱn:'w=pƶjH''="'@Rb48f08`4 -(y$ x -pb 4|elF!q^J-f֑0-CNE;6]uCcDi<(`(;`7zJK7OyzYv!РPy"=J,qNkCZԩdBB`53bwOPD0Cз烎 (+ѥ dmq9<^/bb0гB -c@1~"lX~4qN=G!01AQaq @"PR2Bbr`#p3CSs ?oc9[y=QfRL8Z;+Ge9S*Iz/3Mvi5٨j.B -Vv;U̔,@̔ @̔,(ے`4xv_(< @P*.Gܦ挝ޞ#N2SO=AQ ->E(_(&@>@mQE4@&L>db.Fs)5|zH+ϕp 8Cg}SOl@uC`l 7>G`ۿ#O_!5#GU Z -@yoةGC*u8R('VU!ȩq:v){7bFȸ>씈=5N}d$yd^ê)d=6LkT!Hr*Syǖ87b9"Ii:dH=Vq#]У@Dn>_֚ (\9jsF#QnҶRzl^O iCMϾU?Jѕԫ ;iq Ht8›o%fg> mTd4 ;&.`t?:TCX:) +'Ȧ})xF_PLk%BSDo?*F(#MZB(r]̐G̊#d9jU y( I(]L^PǒPҴMoA+QD~F2QPfHPjvڼo) )QCAFjnYY{pP4媯PÉPF0*̓h8jM P!CL FYJ7gTM -&m,1\3p_ 0{~b7WjĚQM)`5t]\pQKAҪV\' -mO'7T"ׂ@BSiAJhF~&&^?25](1w4EǛ\Rfi<+1^JEO]\UJKBu5ABGT/'MP?1Lfj6MμEzj7jV+gejNMkuUȍ 䭄z+ssVU|ժeh5+TM9)U4Sl&ΩM2cꦘzW<VV4٧8454sRy8G0+dekWk[e7d_ȟz=V(^\𸊽ZvJxx+>JJ) =j2VfUggoL`9xziSTOz{Ԏ[ -mP=7,/?SL jiw5C PPwP@*OOO%#}()^^2}ݾ+ChB3ثHդ}J>+g*ʵm[Ru>ʕY;)$DMq\x+3IDVcuV'ﻍ|6>Wቯ5޾]3$D_=ei|g#t6>^rJ^?*%BVe=>A[_Na኶5hCK# 3NKx< 1>p[^;'k7~?)rZ(Vw+4TSzӊo-M%89!*+Cꬅ{5Ƽq<a脃5 zK_m~m[xU9-QW}iL>LOoxotYn* ڡrc;4r >.QF}Shkm?>RFfj:s -duOxQFjWU43O~vUktm*>+;)YҪ;#; znj8op:o4Jb, 6 -۪{9(UCzn]be?2.u'jnݨ QIJp ST ݓ - -av+7cbsZ8T)dqL+ƵԌhͼ& - f;^bZ -uс1šѣuDޮ_A5X6 -ڥfjfS_m6VVCT࿮'TS&8,N+wz( -`@v*jvI+i WA_<1AQԑrFvPP7 -߂)(HF5ԏ:SQ>n=:E|I -aU 2(N4TnVNh{~:6}*X: ,0X\]?U'e(@:@652+BMi0_oP7# 9(oGY 21kUREcUdwԬOA%?2aMNd'4NF#^]NVZ rq´[)4 ƽ4<5Exq8+ -*ثgTW:OǛU+r&+o*ܦ{۰^u>N o-LΉ*j}FsMQMGrA - Fӭr3%gfIBU5S@STڂ?QPwMN#.Fs)jaM|ivʰ*QR;+جqjXw6 Yʳ5YЬDYؠ>SiEN7R4IEumdv&J1Nu] [H8!G#8ׂx1({y+!h&=1PnͽL(7"ꨥ2h j#Lj5p5+\F˧Ŵ9-z5›([ʚҘѵ_lwk~0C -a@rkS.V)MF.㺚N)vX87`iU9l4L++6E -vv&mwQz˜pkv9Jg\ PBOiLM}g'Wk.lSTYSSn*'4s)<[ߋn8ULrSVfp @x -FURQR533^̻NOͥRj=ݒlSo#%d%d$TAB#NX_< -0sSr5bzY\Tp>68SytnLBm5Tݱ0Ϛ0w^ 'e5Wx#F|4sէRhС d -)Pp֊~Ud -i!ԫ;A`pkk`PE,䡇%B=DQcz`GY4D;&ID\(w&۴]#SNŵs8o0;{92 -LФoSlM;+ T QS V:>nmkMuBv)O+ˆMa n2S?B}pSQrQ^`ڰ44PoB9Q{Ǣa5LS<檷:9[\E㇒i!9^k^GiW\~RHP>^bmouzSGZzamO&w!@:HpҬ#U?PV8㴡CMK/:&NFZ7"R;"N~J;dwe9iNZ\~W¤uד0)^|"2*ҵVڅ(nel)Fm㡄S3Gf)S7=WMFCy5q:dh)৆S4븄k+JSjz!ji=U@3*k?ʬO`oUPr+vKCܢof8e]UGk QS3533Sǚ{]Tީ*H,'8XVzy(#tBx9pGz)闲SvS5LQ{G+>cAV,7iisfjEG%zѿ8:-ڭ@Ვ`B;o +$$2R5;>+Dh!; 2ng5Ly^iR+W9NUVU pշ`PM Ҫ2:Rm1 }}L}U5rQ -xK}wɻTߙI/b!%({]XG?E/ Je8k?ڃZ_LezT17Y8XO -> -# 6/EFsA_Mlj/}6OǰdLf^@Eܦ C|i<$aiqVO{ -r*rP+-[chqۂGxYnNtzejuWz{?e3G_=(e")BłVjNZɯ$o15GbeS -YĹ0y4 =Ğ>:{z(8ԨS'PZ -{皴Phڧ.k}(4cBhJӖ=Uh 5z"Vʔi ĚO|*}: -5SL+Rpk Vyj*#0{vU*:@ $Tl0ƉAUiBSpԊc)J+S -KP.fڵ@Y]Eg9Wk%c+ܡ̊*G4˿QJKwQƈkz;fVj$~Bz"%iJ%L:Az}Nf)-nc0CTqGFGSZ96 -?x UZqF@$9=;Rk$lBs6۸|`j x:J»qG^{pR2Z -,@ܔ-P\uU$xe$ -Al:RgSފ{qN -nq~ӷATi.Sl[ZiT1HZvRI -կ4PT5g9jo^ZjAa@ i]sxWYGC@A  n)*t7aS8S?}I -IAT=?ݩiܘ}ϪTN.8b?+;R{ Tee.B. -=C@e^78nrzg$zSLQDxRMY ~ Sv+]0( -7ukzhfjݻ$Q8hEզa7fa[q\;\QS״t?e+R+R!R);'` d2MfKBS)ODrsR~7bj@<E8y -J57ȟ _:kC]+ݪ;5Y;ݽjN)خẉoUo -fOuGkujvLpS=ܚOD.5+LvD)]_uq? n wߎ0B(BVcVSVS*0Y՘d -+7`݂ -rP=B5_qg*OkVdiN4VUke:dtP㾚(rjxPcE74ךo5u=]`>p쓉TBx<'-JRlT=TZ#Ok Tܤq4ym -CrJLǎ]VwSzw/SU5ީT*ҧ\ۿ~mSmFU[6k6\AΓ$wE+*B!]WUcTaFMP@gj5YXUh#E\z&0h U\߂oB٩l dr!>'SpL۪!Tݻi+y> [S -R9tVj/ioT;r*Tn4W6WTwb*#~TRj~0LT51PnЧT*a+sR4x+1TCQ!T_JP2SvS?e)wBs4R7*46/Vd1mv; -0gjlOzV~+C3j2n:۳)ޭf/-]apjryu7]9)}8'UnDhssV{Sm7B}df#5QߔU4kMxš8r,y'hJ;yk=SR5+3R4ꨈE ҟS@B} -y?uFYPnhqCڋ6n󬯐U[#* S PJ=骝OONy&ț"Wê'D U .B( !+C=C >tB}hmTM1n P5@SZ+ʋzFJP~e}SoZc}( CR - =pVPiM-qT:^/GG-U<Tn5E/2'Woe+a.4"A(ͤo;N:cA՚(Qs ~lx ['?;O!-šKAx'9MN YXk+4yf%[T\|\fZFBZTkA -J-p[O*:Ua!׫餦6je-~棻Ux<) -8s@D9`sEv|bGw7Jk'uloLmz(7)O>& -5of=TW)εG8S DcJUIVZs*ҭ*vnjvjP;"K(s" - YWuR;$ H(58=DrѴ5KnSWRo5j?<;'CKFU+opIBP|Ɗ(o'av1J+ DWvJ1ݽ84sDU`Vp";B̨CkvE%p0 ܅jvTr؛xAQT4P=AAD[]jkqz*p?$;)1&5DAD3Q #5ACDsQaFTnLrɏLz:eVk怽|0PE{}ZҬ($mB?@FsA]2:H_(ל8#\5)1ZuVZȦF(O̭`IsU֛[|)D(5^ u[<(@6y?bdBtߪp.}Y\-S=9+/nJ@ ~9VИHuߪg;ic[MnWÇʄ$ t҇T;$pĩ˜W-SO;35;pFee0Si`V -l8S^>5]iQҨ?zgijLPP4p:=E#?gCߒBisI?TnRFq)Ԍ)7iOM;$(ѹq''S,[+l_wu= nrHVv3US$#)(jy&E|Z~Uٚ35ӉU$lxU;3Vfn.fpO'Ik -l^Zj͒ϳeOC31< -; עBePQ8Vr:|*m@) 5Nj1܊|{iyN?OYZ;+u5R/uO-Jq؊8hFE Sg_D3cadd1d p=vL&d=f? -=;\iSj:. yEuq9(.gdXX(}Sz HVx}!AκJjt_J,d -XgQ%^$!6wLl"̨?@ϬZ=keM`ijL7龴0Q-rmҪ +&N#ܶC}oSS5ة@x!FQRQ5BxlkGS{lբ\Bij1 }?ބ7 )Xh`Sfh7SU -qp f9Gr:+4+4( wTw`zX_yګ(pyX{ưcO1٣qLAV1邱~fcZ/.򪟸VZ;hVV*ҭ*ԭJ[;bVmVi.XAo?XcoUSnY:j{Í}aYXV_/!WfeVMTqjwS}ڵA#NvO#ޯ*]RG_{h4ާ%ifJ2VT@O -JI>"Njb0O'Q7ǸmBDq.=UHQSzybrV tD\}F\wQFgs9H7U]?5U%RR OQȠUy(Ue%Y{P&rdvLcj7aGW+AbSN au5uuy^WrN=u#B*R*sVLOq -;jUˆV'$_ -yOrsEwQHj5VnS_nJq@h+3T5dx~º7<|^(7%J -OPm_cyLiJ$+m5;iHOq})ٍW·8~݁[ |+G*+ī)Uvmԃ\6+#ϡVW6ÑV,"puN@gbh -\A@ 5`8:!Dcښܓ"5b5grT=Lpc~<"^vۧAB̔,4?%7h4Uiz+k[U3/7uF EHƷ5<+vVy)sRw)^z{q4߫4rί󦇊5bٮ'Q(PhSi=upVZ[?Si4u6\tQNffii VЍ0T P52'V~݀N0 -\N'W -(%!AOB~kطyЂkƬB{BxQHrO9'ݒ8I&&HǦ8acy:z#FADTAD3* ->FT}ʋQw*.Eܨj3i;YNjEt*=Fgχ\Q,g4cMn+UvҜ캘צmJgfJ&V.Sn?=׸W|v[Z̫y{u׎eZ \<T]_2?PVvdYْ٪.FHhg?g΀o-N..,:cnQ:Y689!٥oJplT:yT-J_KޭȫszV|CB(-[޿=[V⠐=@X5Iһ|#ftHU5UV/J2y-Â$ӎ~n)N액NT59NsShVZZek -PF:PqL7Fb|oe T QSK}ʌSqQw)wpqUJ#hm4w<]Q\v<E<׳Q>]1V9}}}}]ʋQw*.Gܨj3aFsQ*>>2}ѼK^:F=Jƾ葵 -:?SVz"\{i4$9T|:5DM-E_T1)\`/TO4Ӛ>EtVЭ'VdT~~n%>sR'ӢlYj`rgJͥ|@$8|Ѽ*sL9]9j3P*.FsQg5DsQg4f^'P4SVֻXJfvVt{( j}P)BO:i$1G -db< -(0Btj+{7;nf4R7u?u0ZSʴVi=դVZZUZj)QZbRH)#WLWbJ4N$M7d}_=}4jv(8ӷu6/d&J׾ iS$2L2-cvWWMqV?X²4,)xHN'+p׊H_iqŤ*SqN:IN: -qN)8Q:NÊ &;C]Q̃; w(cFy쓎I$ُ凡B=Oo{)"9vYE(S#d97@pޣ/Y*4;e|1{xFyީWCQvFjhw'J% R RvRvRvRvR %'e O =؝DT,dSFeF]X9Y!Vb> god< kd4;~ -w0UƥEu։4^'eRy q -"HR+wyM5UuUY@t x#Vv(᧚H)ù<3uhSU^dEȹ_䋑r.E4\NviNr.N~I,QXeX]ٹXOuo#q5V"791M!$WO9)JiOy(ےhCWj8+q_qVҭnw-2Ѕ)=J쓝^zd!ܶ%'/_Jl?GkW}_WQ$SL~E1(ݒ(ݒcLvH]K6xIw3&EDnGXuW1J<]DvLD{((A>%YAVoU@O9YsQ:IV%ei(PG=lաZb+d*q# cJy?}4tQV&5A5]]S%w%w%w%w%w%s"̊p=5q_jeXZ֑Md -RzŽt]Z:5>U}Xug#2q:DHiOpV7Z{&^ʒ'"IZnf QLkmAW3O|׉$If|ng<ߦFR&NNN$dݒyOr{ܜ^秽9Nzs]AJ*-S^fFN4r!0CpBb{:(B+_););#QpuVwVO_+K5E-6#tL/) 1DG+4Y$ %ǒʢ!QW_zb /*Z--Xx(8..EuFZi=ըQVEZZ -;SNhr9Z\NVqeTm-8ZWX_]6Dǣ#Bp1>TO*SrSǛ͈VF91 裍Ǣ߂d{0L4lVv]~/b q+b#5d*kVK"=kLz软e i{Ke[=UL̕lZޭ/SIJG^^W8x!PS?exW;vFfjVffjfjVBKIIIIIIة{/b]DlTƅHrNiSEGtA]E@}0QjrcGO##:NW;"].F<׍Kf8ToV -[ÊsST@LpOgdvRF}ZƇ -bՔ]$ PW՜fӴs^{0Jt$uک"-ZުH8|Dj5ȠA*Euٿ}v*/f#8y؉}P#RL(3WsEnh4[s3Nfi94fٚ{3DWP=kҪ(TӖlLt4Vs‰+Tp/k{^W\U -j3<‘XbfjSv*nMة7bT݊Sv(j+DzE~jEb9`V2:8if=Si4ÚmBd5mu:k;mNč_7Ŧs:+sպ\RH@ĖdQ&Ή\ΊWS,U{E踦 - ÚT]Р%SPۜӟ{B[b1eNςw!\wאڣ>b7S̫Mjp@O/w ʑ^ؽsO& O'ȈN|[6`V]0VCyUb*k@ -m7PvE|Ub5ÂaZ靅*kzœis䦔' ]KIUmSJgMkdFDW:c]e!>עj7bNkUNn5LUo)T=ʋQLQFGdJk٣|HƝ|I# -+IUQRPzp @>xQYIVq OQ]b -!T}m=P9GvuVUD)KrS3?{ET$dW[h TnDsM 8@Rpr{UUgQ4U1(5WvS50 -nZ8:pʮ -;nh=T,B̔,Dܐ*qձly#*_En t_\SOM5a*%))DZJQt=ێpS7e/bFZNJw)JcukrPw*m/jRwV)#7[!+Ln0tīLyLyC's^ -W^zm^J D(+!$qrWq*ӹBs*Pʊ6zg*Rө*ߣ}Ug4(o+5UTdUT'3)Z -֟#\w![mPFܓI&&j^N= ;" Cx8+=GUg-Lc¦ 8xU^CwR+e0ѰC 9j*FqsVި:^JZNt3k5k54|w`oNn7qN{OU {hLB(Qƃ SvUuݔ5y'WKԙ=lCZZkJCJ( -&eUD⾕ kx1OǢNTL#PRx-M鰜gb"=:i&;Œ^TAԬ*@=ʴ(ȟڥ|cOʹiRd/Q䃆&O DҊ@jwE ԯNWn*:ݯ۹0A0vX:[+[}U}E[=J#w=4m> r[o7j$a!rm+4*qC@COvW3VvE O$[CG-kCܨ{r}}Z)V~YmYUY+7eg -d - -0 -0 -0jA~NL|k['V) -% T]g#mB&)Vw -|MJ#+TǢמT*ӓT[wnS]{[^Z?QRO~muMv(L(Mq1;ѼS:i5]2'Ś۾ u#n(ذ]cM7 e'ШT*+*څ]GnVUkjjZ?IR=)jLj3Qw*Pw)U j(bLTOVµS -fp<r)ZOftiLhT]6 k# ->g*0+z.uAԗߢ -[JrVӒ;SLmht*#G`{!)'cp ڵz5JHvC*j}Nh5[|( rbngu+<_fjvLמe9n8('{=/sVGUl[a[OW 6}ZQw-2cMة{)ȩ1G6G4iӇ0(?5 1f:Ȅ_â+ c+$aYb!GssDz+U)+MT aT. -.&Kh=e SwS -grk=հVҭH^xTR=J$4:X]~n_Ü?33]Z#W1i -ԭ+We9w-.)>SNIQ<$Z4hVz՜+!46{f}ЏtGtAB@6VV<N_* j cu A#mn2Q-ThuռU:Q4S&zewۮ8oy*"JJh_-jM+IUJLNIT>kfԄRǪd̨C&eY̨dP>J;Wnʪܩs4>? Z8r@zMoeQ<(T-VP j4GU*#9DbMWL3հT͢Ӓpp[VP6@&9?)[FѥÚa0 ,u9Oz<PHr( *a<VV0|>nItLzwɂփ٫0Lz'^*9v]~ 90oLz\G],wbV^B*8`9/b熨lSnEZD1hנ*r*{'(lMc^h;#eظhJ͐pP۵4I5ίF>S e}{&J\(ɦQ7J\NhoGQ0ewiEҙTo3*(W4C~U!VR*(Ei!iЕfIVoU}%BZw5 OhVrB*ب֟7 ЍF%%2^׺+Rԫ'ԤN4uܭl#zMS}] +-4Ա=Z<.x}7+?OxGxlHS% R.4Ц8tMz($)S++sQ:֧F, -:tR54+OmSd1PZ2POTnWmBA|ecDu6"oڬBТj-2 agNI˭)ׇIZ^{BЭEkܚU~{FƊ`'s(Z-5(<|64U{hۿ}0N)Wqu m?Cm>SDa_]1k -SآwP"aԶo"U4@)yWnQ~5BP2Ǣ}v.N&ӗ#5+>+3R5+3R5+3R533S1HJNanjFYm}OaFsO8GqV=ygE-;7Z(efjV}JV}AJϨ)I祵r+@>g2S~Nw f j+jUi39)';$Mzxc}B_XV7NY}QShmrN -+P4rPYR{I].=TVWxO`'ldSb8(qU#n0#8})OyutHjm<էVfkS\\\3f5i5i=6a%90FUok(=ji]جPQ`/Jh4$`TW!4)vҪ/l7G=*xD\̅foҬG#?eES񺩀]֚L^*Vy[sR4ffjfffh9jkhw)jfNCCz_v7]njzL榗4瞥4T}}}}J!([(d@VhY#xx/(]6c='=^=|h8ENU -sPi{dNz{݁ߦ;j@))8̏U++(QPmHأp mT`4Vf}J(B!4vrVp8qP6QUrMzb{:)Zx#ԩ+Tn Ǩܡ%LOjvg}ZZjY2 -Y;)d쥗^IT'֟7ըB*)?6VU쓟~M2ZJhJW[]xyzNԠ;*JpхURa6V1 -K0jZGU!yQj7N/p~TnVZZ/4ͪ}hԍR0SZXjjiVZaN* (Ez+YM2߷IVI.|)nlyVf+;j9+32P-o  -;𵥽+ -bzMxxeT1Ò+Dnq:cLp<5 K<dNVUiEZT}VVhy#SȺي8R*ʱ]7-Z6&\< ʱz[cB̔ c] q؜w&c'5 -WDUjUꦑޥL+h[k%am*S3ѱ2=f>-W _NHPHT0VZ;1Iߒ(]م((aD~&w ]@F oLQpO9"]衻κV$d[;SNDzy6bxdByUJrUE7OqS0KqRaj-V5)jiTY`I+4NЦ%ةM,,8o cuZu7CTS|N[rT#QtEPAJfSG^jQ9ԇlV#Xua*êu?x;1d>E Y&t,qQ83 N;dt -ۮ⁡̪^U_袹\5M(Nj1bP֨P$oe)謅UDWT.oF U*ܔA)T96U5B}K -vZmR4 -Tg kVR5 -` LTڥF$:!O75H5[iƻR4pL5 N>ez{ڭ5S)w+Y?U%ZSdž%UQWt6NOMWM.#*F){UKa܁U'H3TKHrO9';$ צ5Lz7(ߩc]((Yk+ɶ&biE/t*v}C&BLh ,P +p{!QMٟn_4>ώ;;{^4/g -gjMJtVpͫi -&dnI5VnJtS/#g5FsFAUʅEuEE'Kv)ZO-ZKJS*cR$j4:O# ^PpzW8zaz';9ǁܬdjS)Uu*N򏻠B*6P#G6iO *N{'hx{oȒ.hʔnG:5NčF:6Ò|ޥuy}BީRi[U![r%ˆ+h\)^w#ȥ86N;_2^PwVCXueTWNZ6?*66 Gi%HY$/S\4VИ)u}U/n ڰiFLJGGܨ…dfJ&dܓBh@ >#^^(wV':ӊ}FkthFytnoҦ+|>;բ<էfJԭ')NGRvsնElztrR;$qr4w /PUI:*r*+*`୭գhEZ:xkxY\x-@uS356JSr[4:דiU5w);}L{JSup 6Ax&wN3QLS.9],yn/Wy\vhu V:+Sz)]e.jXQT -QY{)zlV4Kjf$t00*VdfZ^rս,V+K3VQ8/x7'QOkܛq0MqN%%x9#QthioMs:+8/M;]no(FB1߁xS5D6S0IAf9@)b0!1?F %v?vP[yYZ@a*dIH*B*BvjGfvjGfvjCDStVOԭMh?MX}U7*(/^`j j;#F#^zG´ -&b}6*U?e:.>!Z -vM+Wwo<:>1Vۃ -pE-GBaB|qӽ[0R!}7K;VT݊w?P)T+D68qѸ(H<f³zNN&yꬎcCj-R,mA/( -|h4 -DX8(qFZ\+8 G]KIr2LWsWsNj)yOr{'99qJ۸ &HrROC:)b5# 妗}? -1WP|~*gfJ(46M!8 -R5+3R4kߊ5WM oEh}yyF;Q -MW}2R-wJTS)iKySm(̠gzNWv54Y)Bvh -nblB5Jm!UDžti'/}wHO:D۷C YsBSZ8-GΈnh𮞴Wi4vT 8d ~eh530AVp/R5̫Knb-ǙS0t%ZQS_@*#UjA~W#z]㒥p}BϚ/h֋q -gD'Lx' E{!/eS^;uP(i~adhVAcoSnl"~%B2Qa^JJ~T=06@gbwIy'Tm:j`WrT9=H(HSܞtu;i_?2J'8RJ)E<{/k{'IR8:m)+EV{IS75# Q* -YX;5tV9)<[SSŸ =Nؤ=RZ[uoM)H씎R=97n-WӞ1Kֈ9ʏCܨNeA@4@ޡe(ZbaM%@2PBq7;JS7fjUZj.KoVn㊘ኵ>Js8)$NZvJ}tnU^; -5M8l - -G}PӴ5QWzW J/FEC-ꚧT5Exhtv Bjd[nRh7w6m* CMb@EORG2G4y(Iz8!"5F1p4ݮSM9[t}RuF&xtlX*~~[u~cMP?9MDFע٢Cx^Z]){1Vug -PDSd̐fH xyo<݊ẅYug??f\{6G-4K#mS%™xcA`hݩ}l߫ڡ)GVkUYؘu<2U< m<-8ׄM^[>dN.CzeIP涪vfmC3S.9+F*ij&THKAݔߤ5)\blr#G5Ej9+INrRݠqi2N'F˭mFPWjMNJ+/*x~fIVz7"5QPnIiTzʞ'3opWU1VorQ[ovE[*vh>1`uZx{w򦒿_F5hҧ%1up6gyi*%iy#Sʴ-]@TJO{]K ¾U-՘V4lLs -:(jakGfJPG<0̧B:Q88rс.^֋O'@2N0P =?A%XrW<Hq\K/9jx 1(]ih4[,9 -Q'ɉJrR%&=<VWmU&kA޺^9)kCLԩj*{Y̩|f sPEp۵wC[cObp[yLQ%Uo]m;(w88Wzssb0Pe=T8h4ZN@u[xUmU)pV#2㴊`%)V6+;}eG n8\Q51Q7Wi=k1DG-[К xD>Ɂd7ޢ~gՍYPēи~f\ qF]Ab sgb26s-hg -J4QF&ںF>RڟXٹEjdcnvTnj%v;rhw ;:F)]Gd((xSHVÕe6HVfSvZ*Fj|qUlQ1F?rR*s'l[0<NTl:?;sMz#wj.k+,'3@E ;(ُD(u<~MJTݓ>T)PT֩(iurMĨiF)Se)KЩӱ<;?*yN{5FM8qܙ"o)S]YmQGj7 +&(1Na"` -YIVz)#~e$\:o:ңݕvOJ#0ɫo㥯u7}tVWqpN -i( -l=ף2Rf3cl׹U+,yd htX'P -hw8陌y Ίʵʵ -sqOk. -ChӑSqn4Nۧe -;QO>w|\{Wv -օY}UTnew=teبB")Z -ԭEZդ5hV*BSt];Np;ԇ%)X2}P[8pպ,(F䣹'O5)8SvO'fFU+y+tV}*JJ#)ΊAX+9c M6XInH{/TEwCmV -hSE,Ԭ=4Y1Z V8mU%0y*GL}ѽ4vlA;*Se]&ެ~ J0ԊW"4Su1E+ڤKS~xQ<5ۊہڍN:7Jo -V{: kPiѶ{'dʃ{[KFimfMzcTnLLNP~PwL}M68Ph8B9 Z _i +Cywy!q^Ӂ aÏoTjx9nRHnc#_!Ǫ5穦*E!R9QQZs3Nfhyy+TuFEo)HrRʈm5 R(S3533Xf+++)֋o/~ךrQ˒d)j cA(MϚ3 w"S.>OĬ]ݱXrP%ciESeoN}z9.(4iM\g2ChJ,aiƵط|w~p%B wPw] 1nĕ#P*lh4^>_ŵ^>4{J~*h_õ +=N[*B`?Mvnڙ OJ(iƉupJ_ŷR:\ Z4UٿnVhWniсRt{Q[$A?1+5QO&Y:X>pDgDoQJj S #Bs]-袕HV7ҞV'g -]Q SnN#ڽP|\<4P5p>%FGEU6E\8>0AJCsbt)UieZGTO&uM pNMN`r9<Հk -F\T=Qo]}/n ªTݔܞicNFܕ:5A.ItK?)RcJ|JG}%N?J.J/N RIZ3duH\OIe$@AEf% L4E*{Tڢ夀w@Fk:={9i[*x5ko T+O;m4KZeBΥ@xpox .8~ h&i潦j:kN4fTg?^Ы'XYK#cz8~uVcՙއO;'͚kʌM,CJVh -AM? -w hq@QhO*/z'Ҝ@Ě)z'A8({G -\RVxr~.iMeAB<3xesy[^jYuSMRm(aV|9!oꨞЧ9,Яml&?0(Zc>rrlY+%pB|ɯ&,B̔, - 1YpToBc@쭧 2[-dh=TT/z@Vw7yoDǿ -~f4؂yhޥLzԣ#utܔM1S ׺8 Cn5R]o+jj]6:}2q wN_K4ڥ)'`=k%܅*m%I^[G5FG'K@Bu}݋mtLWپFudAo-B㴣yOk)@y ?\@*6JX>^䬿@=S<5T:]>7X;Պ{)qCvNǚ=(,]^m> Mz9wPޔFB!h5 -+_AuܚJvj(F&(xDno:Nճ8z)~=uO V;HL󪷏LռA+wͥ9&&q Nx}AZ2wXޤ =HT rW'Tic*7Njw( nۂycy{†;T!CVK=QkVH0mATEy 88SF{B*KixQ:+):ԕF {*UBixRv]SMWު}qSr -;irh],Rܜ窒xBʨ=5Q;0?PVw$~oK3JHCuti_'C WgUVh;?hB6%2O̧Ǣu)EEu8)B+HV*'tP7YBXڬ91U -yE.XbTNեYIQPdwunPQ:cS^k~*̓)UԨy`QКdkz9h8)5B)ݐVSzi82:]ϙ+YktVZLxV VzT(եnLӠѡYơYOȬq*f.HAibܡ+;2Vvd ѱYC0(oBj5iځ̠飼QWjӍ&{@P@۽ iSޞ90B'DqyԷ ॼzSCiV%7lW9ZK6SPdfzI5VHd$8;1]T)jTOrs);‰([&y;w(犅dj|RݕЦT7'ZVqoeQ3 `|g4e~R uA2ށ3Ua=ՈVNYR]Q{ǀ*}UChS sRzhyjI TOct) n -b_ qN;rVުfLI{٢M@h/ -Z7 2Mz+Tc}m^.tSlVDPT)\ynqܬOV+VԬ垺=ٰqS mHMnkxUʉA"QrX -K¿b1 {ohe-NZ(98:Za䢐c}8DFJI;)$iEpଲNn*8Px oѰL1ޛ"2BHiqj^5MciJJgcSjSdha* :1VCSYu9آe(C_Gu265hnjʴyt8j֭VHUVOQH:ww e[/]TRԧ 1p;SKkhÇk8ָz{Jot0nJ&dnHm[|l[ m[xy(zT=ʇL+.)ЯbA; bfT]m)[jpV׫[V?MEZ|զlӜZS^) 1x)p{N [n5L-'hrQ3$dVD#Njv'U+G 6ۭliFsՎufx#ftՑ׹QX]U}H_N6-ǘ_c+8+ѰmVxx֊[Q A -'Щ^葆PHhp7q曮7F 0ᤰB8{&ޚakvg(qvT]LQF4eWfi?ZJU/` -Rzf$*W?iRcS(ƻv:@Ocg:wJ56qQ{`GOJ lN>-L-5۝Z[}OE ݂`wuWAp -VDE(dYߩD6%쓣 -q~i!Z{+QZdZޭuW+ErQW8¶:{QR?:Rv)NzךF hx++"ǧ!u*UV'wPQ/(ҪvPm]}*'U}tY?edod¸w 2uTQ -otP$NeEOSU -zcczbT ႲMiPtWr`R/ -mQ^SMX/ -$S=AFSݳS=>y}jnS{iCzTTEKUk"s ;iLRv*^CyM;Op~پ!FOõ'=Q0^9PO:w f~RTsF\O4F>{MFܓEDFiR0zp>u'f -V- ꭁ<9|Vj}]&r((Yx)0):B)>*TF&Dy!WpGKO4Ǧ9CBEwvDz=Uմ>t<@*nT׉?)e, -s*W?MRVRJ{H3*gQE<6izEiFչsM91:[鶧b$U Ќ=v+f(y9'JLO|nu.4j{r.Y)\p$;UTn4Ӽ da}UesҊAN"A .Hڣs Rw%j8(Û`WMӽm:B'S.' SުxéM{YRis=9P gs`=^]-#/E_w8֏ [ժC :_y)VzUY^gm;ty -;(u -8 G"x)iN~!ܢ;).zUZJ~@OnnV{-w5@Un'+cVV:HS -haV=cܨҊOZ;+GdtETݔ%1 - 7FA=<{SޯH@-GCN_ <, -dnJdКF<ʉC -qR(@ -+[+k[xlQ#ҭ.g V+SFoSL<+{Q/7;i41Smপ4Ll@j@nIGʱ?E+TW\w 'N1Ӫ_jrN:6[AR:U|4D'V Hx(ZSz}I(|xF6]ܫyr>)}WBimAsOxp- ;)vhi~) +9VcADA)jܫINSܞ)DC3 Y{M([/kUhТT ;j:?Rut}ژ[2f`HL՗VC b)3N_]4u -z;T{L- qѹ6jRnITR5+T&1er̠ -Zoe{&+yDz#O'sVEjr"pB(BimMkS5T1AHrݥrFݛo+4Qʌ9;|4uwT-A TLrTCFixicT^z:oG@Q?}1SGrʴuO-,D(Zʞdt>x (n -˧Y*SY8c Jn𢎉F uC&|;sJm}PԢM,ukM-Ac 5ؿԭ=ʵw)Kt*PtFKyF==UjEZQRV!R_mq!HiSԫWr]ʵw*xyڜ_xh V_@צ>o8ܣQ Q(wiIFs*3Qk`ڢ5T,P144p.LgdeNVbqt 1kLފpjin# 椌dge34lS](ђ}Fu -;U6M:S8̍J;h|*wen 1dy<{IxSHoVwV+\t4Wh_UIB8y,2 -S % -WIqB22OJܧMSkAXXG <.Q7-]Vz͠i犲v*YIVqw-,!Yf?*7fih(q; -6mS fP)SG533O.ao*O)ׇ\ -xڧP))MFb 4mO>\E5 64U>Z}j~>Ryvͺ8TOQ=G"DׂtpEDqpD+hާUZ5l:ACIDi1ѽLDqS~!Oz.+T}ʄb~Mncu;3Squ榐嶚MLÉD -!M5YVzl6&FӶ[Puy&k@OvJST݊R)eh< 𴻐P -/C/0No\t4B[QRvK>,<<5{ܤ)&vNԱPhvQȣ>qt:NqE Ee~ -y fP'ѿ*AH;)E2F;Nᾪ@l!ON5)57)ZU3hy+Zsvia@^M 1F!& -M,E?eZVƜTG29@h)DN -74pO(za3 QiXJTݔݓjx-A*sM9珀hMdܓBhCK!1)#o*ºdhTfI-d,@̔ @̔ @T*.6Ͳډ8oE+ S#9($<8X=T,6yƃJZS7NBx0?$x]JPRQLxkapFJ,<.Wwnq^.>AqFZ^ZXЦ@ߡ-)^h7CEӖzމ)41wӕScTzrDŽ :A^SSSuU -q*xVS)G"43 ¥ky)m)"U4S4 V.-Z/8QBbh>BκU5‰Ft==W@Lw*A'ThOTBt -@.P4 i" -` `[M*vjv4nhj գ'f(\1x֚P3-,7j1L"58ךB݂;n"GSLN#@7j֌+) uEnGUM= tŇ?z 5y7 4~CR8+VOz{Squ SLݔZn\O]-\^ЧfQ_9*W+sS3533FZ(>p;+2+3R5+3R74tjV)=0LiTƎ`Y{'Vڜk :8B{:VVn;ż -N21։J4hw y4lMcc1H4tG1J{ QQL4H1cBKIoi;ѻ؜GEpWo5;1p•X&鹒cP˒c+(:=+<+4+,Uo$s ?V?ԬC]ͮw*@0ҜiJ4-mpZ, -}֦hvUshNmxMOISLқm9,]ک#oŠvO:kXpݩ{(]#k)J o|śW GȩS{7bM'QVߪpc URWM#jQ}㆜]cqsUX9 Vx=ɔpFF'y#J[SHե ƪQ/7p'%)Jr)HoIwN( pORJ;&4pѼQ.P/spp#Pjcw}(tQ -';<1ǚhn 9 u*ffnjVfzK(& AeuTDTBE_]AxP:%1Y%m;l)V3XY+n/*f 7 8z!AS9QY{f>ϊ"κD TGS)nԬ\7<Udt IRx<ꫮ@wx)D -+3Onh7iDz謕o[5SK\բlբlԲLjj*3yÂ|#ñDܔy]LiDƏD{i0-G$۽SfjFO 2⪞imFҟ6j2wd4=<;FᚻSS40f(LQ1mM \aq^B&D/T% !*6i:EJ2Oatcb' 8GU|h*dWДo6\PŚ uu 9茺[Zqw rP$U/rG=6eZʴ 4T&)J.7'HRnR©Gג{ԎRJ#MujMot(H١Wet7O)ݔ9SHa#9Zj -VƨD<1Q3$\N4S34Tͪ'Ti[{5LlrQ7%2Q7$S"w[SÿH(%1=Sk^:]D)\ - }NS53z}7QAXA}W_|.\UES#F C\x.SK6+.RamH/WyRGD~*jF)ٳsZKULqmuW*߽6.hpwP}](NeV*U;tÂkǢ5AhW5R4i>iqc c(u5[4 -4F<</o2 -FejoU(;uPDzB[x>z nDuŗ$zM? T2y:6' -zu `uB̕ӪZB֪f UdmѩuTПJ"pVb{K=+D4oLjD;+)VG+1*;qU~!邛5 GCS'5S5J;]?Ȯ&z <VW`x,R -!FƷ_qռQ=FtNBM(%ΟY fu$@=4zu0nID{qu)&fJӆ -dh=4fJdfJCJɌo4$YnJ&Ykw`Nr&ڂ)h;B4D]'[m4PQ^'+)DWXF0ߪ Wzx'w}Gp x{7=m N@*QwPW]`&iZdb￰` -{p~mrKWU@A{W}Bݮx>ImJ聯PoODkEZ*ӞgC@AJ`₎    &&h)nb{#ՌgT(cF(}]1 - -R+@Ncqb -)b>()v#Ko=ݔ6=qMi *aêaaNm&Kةf=By'uww([Aw7Zt`uNy9cwat`rSHhhu18D5cƘ޺JnJ?>9jo"ݨeFPPA(NAA -?y7QT eSp 5(6Bp=74Zfjբ<բcQDR5S,{>*VG姄XMcy^RtꙊDUL/e!#5PnIRJԯpR;4~jWTLL3S?53S?53S;5+R5+LS?53L1R3S?53JԥJ+R5+R5+R;5#Ovi?*W~jg~jw)e7`JHGdy(U;zjdR*GfJqR53RN5(Voԡpݒzٚ!QZm'[3 -f9if=TʴԂ*f#PSpLV4fjf;'8 ?B3Q1&$Rv -R*gvjW~jWvjGfvjGfvjGfvjGf~jW~jW~jWrJT^I' -JH3$dI1(ءjfFj9ܘǦA=_9HrR*^Kة{3TS3533S3533SǚJԍ>_ACLLϩLMة{k&=DsP~Q1+!1AQa 0q@P`?!Hs:-2Q򑞫}FvLa-To;k-f~20~4='Ѡ߬}sp]dH6ӊ hM95SvnFueuG Iqy'"-a<.a8 -ԂS|ӈ19F\9Uc 1Kpb8\hhpa28 9i_\k`Jd|<pC.@Ax, Bn\ <'G'Mf,\ ^SLtG[-܀Sτ'{' ΓXV!b /|CB{y5%G`fnFc>x_)\4*)Af !#C9W^8*|өa8N\|| 133P' |5#2-0B℉ӂCG8 Nj\c:um7؄Mb% h9x6Gd{O&M?\\489'P/ pe⁤| 8? Lj x^9Fbpp c8vb*5/_Q ;# q|?.KXx#!>R>_p<ӂ:@%ߖx'<8G"q%gffnGEXRTRU"e `q([K,溭ְ1_ W~( O8H.e!q.BŸ!˴g^ppۖ0XmT#rǗ!qgq\TS[58sӆ eA,a8\%~3pQEpsoh:x׋80]%ՂcHN_ xL`BR)|㋑Nʳ b#i#, D5#.!๳( B2VE:ʃ%nfpP(/_@E.oʛ?L.J>"6=h}|"<2}F &nD`uӽ81$ -Th>-WBqK<ƕ'% bȃ7S })D6qeJ +]g=ׁ4?p?'g~r$0U(H>sHEQ88=WHP"<>z/T#1djrL|%fT^l̚~cȳ KX8h8Փ# S!&T4|a-`x!\'%r9tE3R[ʑF}>t W,tF#f$sL}Or3JJՔ#!s$7#ߓ|&H>O^F`e0-x҄l41Toȭm&8PIEWcP*eBP 3>$L\*WXUhk ,ÓU(դoeŐ!ʥ~::IpӇh闖c2t48X2u`A<1A5 B#8I4rhHe8 -Q2:@%N"uVk`MσJqD!IR $Behfl&|fQP3D[Ltms -3aB`օ xy -Q"EA8k\//^&p -t +`kA ?'`҂.RuV f#!3+&|' `X9@re&"Jb$CH2y1p:+P1r B-Yi'|.!|~$pUAQ{*zm'`2ʣK\4s¸P)HVJ +B?L%zdy߼ C~xOpPCx{3F EЁ7 Ei^ *յ -tLAl -a [d (%N< *:B-`IVR2$Fw9XڈtHw/hQ=r= F" h!oXk N$ -%<J9q}&|L'AoZA%+b Z5lԫHua MPEAQȴ$zЄ6PJgM ߄A&e~`A ߳G]}H.d'@ -SD -d ө?ʠ 60,=qI.~N2_:|y $'D8'(EH@Yo4B )~d錘eHm_/ 9,O| -@ane:Rkxr9?_)̗+8G>8O!$f:U"6͋MFa6C -DEv~$ĒD8g&22G,:X~0prPKC~e\>]p"|hڙ&r|18"PqD)ⷍ,k=`@CTe  U53CTaD#.%q((oIerC~FQM(GJ 995q -E[ƄT+|eY>5|kk4Uh!¼4x>}\t.r;-|C*cj}3*uQb?FJ3B/0)B* q9*?Eԃ](SJ~Dӿn- A cFd7oܕX6~Wja|Ƹ$;Y dCL ͂"#BHsD2vpiD؞#bhEb#=62T0Kd&G.9 %Lrq3udK&@k&z #  PN1v<&`0VzIP/#Nurs@],2(KLxd,t+Kƛ7eKeK* 6P71QWd&tS M$B8`Xٌ3y!),@su)_+BUz^w!a_r}>zY-A`tϪH+>E-Bx-ra9tdx~J`?L(qkԉ${BޜKȷoA'ɓЊϒ  -|/oKƱꕖSQUPKY?3>;M|@(qmc&;*, &Sw Jl0iX3#uUFWMAl g2gZ{Cw@ѣU38ʤ*)@ -ʧ"wV&KB[!8O -TZH?l9b ɷTnxVZhFpCỳ#C()ø<^b#{f$g[" R`Td -/pA׀%]wU%)Lկ^2 JB'.r M D)(). -}zHxQGQ@􊶀4P9!BGtAFCXHUCժ6x⠚#m2'5.hcFF -fHAwM- -lTn3n'| \Rk? |5E TaSK f@>FVf\Ou չ)7K d0b5Q,]Il‘X=]DGXo}GH"b(v9٬Kq(4R'J/=fe3*EeJ%8S A0Jxg',?SgN9A( B)HU flH_!BvZ"s5Br43f!O|35zϑ~Tuq>0$q_!C|Kzq<lp,8$?~;BAD&e@K C"0 wc4`A0":'2L`BUW4!euK_ I %fFE:: -b^w=-A3@a)i7]Xw۬x:t*! +.k:G -jzumvsbn |e`͎M)l|A$C;F)[@QyRa/ zj(񫶊 72qǂ= -/ӟU2CBGu-IO=a^KP4BÐJE`ݔK0hJ"U?r'gpd+ -@ 8Nx*W<Ū`R;\T:aU*~!UOND+s>_p\EzA!Tج6TJx"1%At4ج h*Axbᠤ3Id -ACs[^.`)M& Hk-oX^qa^dDrELFgˎnc343^׍}bР. -^eD0Ti YƤ 6. -"ˑ]y6p.0 %{*@mGqpb*z9RX*GT0OΰM -s\OCĻ24,mi.GH{&{hu<寊0$'Á|}L]H^.,? ~ <<Ɖ] VJ3C[>>/8wd#i>?"&^CLoe0UlrW3 `.GS!`Lpp@ˆ(L,nX\P\Թh<.6AiZk `c8hN)D >׳BZ9paBv9v*. ,DJ"-7lV%4ц(@7xg&xWP&#@&r3,ݏ/j=*hy(T"&iOƈ¬IC8J/gLTe$?4\ALH6!% -Q 1ٟ_"Jџ,JQdQ>MG֛Q"Oփgi12 ^ja1%RTXVSK ,1[`9F& -qS ֪<τޠ[ ٵ0Ax>oyoYME C -r |@4RcYmyshEw@r )̥1'`;6C<$Cj^]@Kr;$IU*J Xzp.g/_PZ<[;2 yf/cRUQa>{qzxN9I.CaC|cnD*2830RE {f G6Љ ")[ N܀~HwJi)j/đ Fŕ=f [< Ѓ[BD"ᡅGhzEplpD*tt*h])|C(NAq)PpC Rakϣ0jX QAk*y!:% nP??>AS|{q-[c*2y%># k$AUSW C7E6H~Qb97 -Dp<9c>B3 H]c>qN}@ႵJ|c tYNi_xR߬ E0 &0R:cTcv8҈Ka3f>&`#<;P"tΨy"@0[ {!KkyP,cC\vw)ND$H+O7n t011} Rj$4&6fGIJG)ञCB7 $s0+.υ+P_UacB@DKV#sQ4@<s}P"a@@&ZBnA0cZoIabx.ب ϢXZ2b-Bcxv\A j45ZO 8|vy)opAʀ -#T0y39  V& Cⱨ"n%z ϒ,\gLRDEo ʸ̘ ç^*ZPKJеCr7k[ߍ,/ mī9pR_0N -ro-Q:Mi Ty*cR'OQ&Y/5)5iZ+3*zF/[Ҏz>/|j&W 2KQ}Pn#1>{Of0Ud&w %ˑkxAB A - <4 npY{vr9a\)KMi%1# PD1LsXqEKl5T !@Z@hO^R>0%w”8pCB :h@U噌 Fr*(+?!{ШyiGkCӇwaKY<ACm -)BP*MYV$Cy2 6D  '\7i,Axz\Bdz%E{ZA`X'ą=:@%B%,!N28EtN@J28 3s=! pXFQ" ({'BBX017ꈱLRZS! Ec*qB= !o: G1)0k1EpcXL6ѱPH}&23kx/B!,>QCX -כ[hW=f T;[3(e.ܓ2??U\K>Idn2`@cpf 30K9РDfXU*_3j :v,*o --eY`oʦpܡ@ @EK_̂` Xt6A c {YAZu`/ -=iټ(FdĘZE7'ao0χڛ w0c$1yRЃ(mB% "f7l0=[d@Z;CP+hЉFǬ,tF@ z!B vQWN7q &At4@5Vp¸ scaqa"%5%A:CZ0zCSNĢkBb9WO9= |t\#\?FNˠ31Wp#xM:@DavFx,=pP+T޵P'+[dΪg3-Ql<(@K0cdY2{|w rZ d!`9]Si!QG,W!6!lA:GΦG r:B`pZsox3x3!26f rUث'H( =YG;P!d0a1Hod:yY|A24x/h[4y1QKetTp*K&|(tZ/!V!L,SV{zϔ=S~ܑ1`c,/p)^"u76R!؀1 ʖo9?!b=d%Dq\~\k(+rIHWxn@ye  - 1^:q5YHJ9p{$@Ph?reZ -2-2@ȋR Lm0v"y~B%bZ$`UL!x8gXr^1Adg2IBn/1* ׃3QB]x9r|Ox#,2Mپ&o&6y6"2~) LBR €9\Ch[7׹vvhI_ 4iqU Bg>K# G |Ip4~<WAZC{K'G#J }O"`!pЙTZȁSj͙q =b>oI" -Ht<`ȍI+2[@0¢Η8`RMTwj<)j&`Vn` =D=JHIul!TCT؟[@!00B*<7c -2(y IxǏTQr;_)[|A mJZ<.CGZr( 3%\)ɇ)_b|B_q&AE"a01NBSNfSBGUqiw( :k)$e PRAM^R֣q4! \ȩ`h :dd$u3CLB* .@gX@]!qʆ):CJ]ԳHn1t78 ^ 2,;iX/,In*吙LŪ?'~D&yeeҋ5B=.$[}O}ϒ~=D%~4Jhm%=󿱃Ƿ[ p D9DU!zNxplylp fv'A)|ZWCW1$bFW]ԅ7Kq I9׀~xN4)% p&{KErˤFQ CMA]Uh ?hAmm1.C̹CiG:<@M z#cQ68a*)g/?cЍ;(uoBΈ-)H-PAǰ2EIԿ~a ohAIqpx+xB$p>yߐy o< > IXD2"̬8{&À>ǒD$A&UWD܊44:QW9%<+&;Pd']Ÿ<ߠ0j?JJ^ƨ?WVB4݄Y@( a.lD!R^c f)N5O8p1GE+9.a?xL{q.PgxF/.e6[0! '?W~ QA:{C\c }.I~'z1Z `v0/.!Bg0V%}nܷ(5lԯH7Ww~(dIfH*N=Mu󢵃mvG*zDhU [3冋hhYb*NWs$T(  <sB.e;Y)ŹGsGC*ci@">h;`4]aNx6G($h`rʹD95{>>>(yo /jX=s -2l <KgZ=gg@Go+9;C)=Bx|BN b!p#KRhCw':V4C0CWhO$YTՀKR a9lqHޠBFMr@([86o,A8 xTG8 -.pUg/A~:2UP#qyS -}$$]C6aC$'Åf).Bqx\(N)i@pTJ? I*"&f(V:5Kt\ 3znrސt̓p\ FI қ@Ym7 ՉrTBY<72v pF,J>08p @# - ReӒIKQ U&3=!mi O %RZ1X\'YDW&S8^7G0QuR*)[RVk+XЃfC )6L3blb߈uf;3:vu1FC[sx :{0 >đɼyP+gw dhJ V3SqcL]N?1"G_7N232\n#2ܕQ!hЕDt_L+\T[s.2GNyO'hs=懍 o>3O}wg>!$Na' }C("(|T1faB6Ew@Rȧ4X.et  7XD# z^0^z+%K?yNy yQYaٌ/hڏ`T9:_Ŋ . -]M.A! Kb8, uBTC \mNP8Ёn '%zi~H%.;D4x s Bz>Kՙ/z?^B0$= c,xk6M;2q0A#h$l|c0[B g֡OQ=Qt +0`m;%򀃭! @E6A6D,&[6h@ 8+{S* rb1OhY6_=& y(˟>}3Q>4J+8XA=biR0= -{s`0FfMDJ(xn+M, w Z}ib= E-~Z1b95B< `ưKnqњXnKq!-IFFvƥ+R 5g"va :i/ ,6&M\aXrAjkqrDΪVB(ڰƠ~ -*FH -T 39BHlt,9F0hW -̩n~P2cpBZTH>,>lR[}qiw9|+Z7^\iTv -=ώ="A O'ϡ@T+mz+(90 Mh _iD?E%PE57؉q7@tm}IQA=c\xzǣ*7=>M3T0:@bY:')8bcÀE)d`N~IƊj,PGbJP 9$K0!;.tAAx -g5% g^~QtT3:+ #; epgB\=,|ub!˼ȼ߅ D,i.2 '%ۂԇ#| ݫEH8 ()}oY7!AՃ 0 @E.9~zd=#\Ou31_ F.<,'+4n˓ZzOSX - g<9BdaaK! Oi?ɛ >XنTh/oE>Z=↘?j_ *[}% -ӂbhE5E -;X S ث AE ?)@(vkfbPv, 憰`ִCw HQ vGr'9fg9NY!{O=>{6TGC3LW'SMFlcxfX |@|ʗ]8  F -u!lXo'|{ d+@c`R]g؈? r!cPp/7˄-ć` \ -o%_Eԧ rb^'1 2s8i%؞HO YX1ƞ/rҞQyϷUc?v{r_ԔQa.\k_Ds?PzL/6FA&'_笣:y]:`r?H m.+kΛB_"8|xA!,ܦ5kƼ %3" @ 0e6@h2I1)I( A`a+=C(eɊ<:%aq00 j xͲx%e&,+- -qHK8WP~5ӛr^RD?(blhey 5Pp=icledyQF: !tIy;XO,F Qtg$̒lab=D8^FxJ=%6@)PAL]H:$sdobphܛo`?=CĖ 3{#FRs,n5)C/$+jWC'xN':o.ATiB pиx'C#-bC-M2>O)>ȟ<zwBBeopNHy32l*yXBo13 #7=3?cmBLYp:Q)MȠa/e C(8v 딴t䇃 Flp9EdT&IͨHJ9'4"8VYo_!Z>HtXD2D 8r{J -HyM5bH4\CfQCp(Uy%CdY@@35"]TYNQ9C a6"*m~4 Hw$y od.D@2;B0M~P!PC ԩUPH;_nio#s.eQT膡ӗX]96Cx Y5RK8G՝1JC\ - ! "_17#ahHN<O j)`!@-8Lzf8o |d*8WiHIAɔ X,a'PTf:C:^Y?ϭUԇq-Ci (nC/aM黆C3b8"}7vo'hGhgG#1n\JDx3ϰuu>]хx29VaK?H4?<0 . nצ@q@Cvs(9'a"h(*T0U[I#5R%8oQL5E D' -r1;ϽG|(*2Jj(_Ł݁(Rw2C6ܓ#R;)zs& tc+es)#[~77/Cq<\D* ;Gb JyJ:|s'@`t> $!' D)a ! -[l6Sk710&(>w|τf@%)/7BуۀDw-ySae# C'D1T*gRWa>Atf ?L"HZ5!Ӓ3$lH)69rH`Đ$CWxp -r)㇚aA\̎h aF,p -bQE `2D%+ZNl-33(aiB"}G(I -ЀH.4ƾBB#G8[P`g; `n8]hIJ0o<Meq#b!0dY>>| -+FX. gYμ+ cD?:m -TC[Kn G1ȗq)\1O -|iǯ"y?bΟDnsA8# zi^$;m:K/A0 _q_NKxDh^7n[x> v ng*,:$I4'Ty3.BYsuB$>7WJ" y80` ؘG` `0VX8+g, -z?IE7n0*[Okk 49Pta|)2f*!!"*Foxi6o Up1"\c ꁉb؄.H!-=PdKnz )dd}YhtPB$9+t<nnfbx(fWH -aLr̽TE RI~c(0Ӕ"p4,a{ (K&epn2aHByF8"{D4 Ϡ/U J@jF2(O!_}'|oy^Do1IB߸{8(Ġ闄qBl#)WE! h>A0A%ҍ"EaH rO:0DڹъQ]LdY n8*u ( k Ĭ/Xs-:AFzpWCz)jv046WaJg˥@Afػ,a J.W xK^6q -G2/~K<  @:ϟES`Q #'l.t+U @!; דRq|`!O X>S#eR+uxHL}'DH1"'D(PAv) )(^:p|9x !'BQ7x>$]=FQA00QIr2EI"_ Re0JG,6Rֿ=Xx0Z(wb_U3ƐwDQW 3nPrLu!jC>\@u?0W&Cf҇GG_ zM`ޣF<$"/I齠 `$fWR58{P@/+Umbez3EjjbBOfii)ߤAn޻-% NJ| 揑#}x;b[r{#`Cbkx h'J.BX'Pb<@ck@r ּN1 17l# -:zW P&P%BXey}|rw9ȪQ 6|4=AB֎&P/G}[}JAO `L/⋈%dx~B>..G%Y!>mx`]74.$F>o|̣JԎ3gϟ?>h5j?|a>H,B t@-EqK9fwcCVѨW!1!d0;G{J_?9XSHB,o8W |wT?% 6#,OĵdY _1Ze/יP^.(9GDj((1ϼ{}rF+8@]rrVՊg!6W89K؉T u/,cnWxQPC 8zqܾ$YگtO1) YP,߂u-C*zCgv3@ƢGE#BN53ӊhɃ V!R.ۂ.GG>>{M߃}3}3}3}͉oDHz2leE%@Ap9 @GT2܎b^(wA\Y^Se5H|yZ+TвԏxѴ&1.G`5r4R{#BYc;O H:}&Kiy ;eV7RMa 4$QQ7\\BG1J -p8["~SƷ(8,]wnfou17H" X? p5 88^q+LW䬇-ϊns{O{{{xggg`%~ӍU.t$ #x:ra{"UW\ʹ0 #w[:|_? 6!Ff+@\T.  -Q2(/E#s8ahD"Gf%.*tRf. -Ɍdr2},3ÜGX ̵jp&RlƫO4+ -G--QZ/בpxˈ3 ZbY}};`y >>>0{3RgrrO=5o0Uq?0 􃽝M:I -0q7O=wx-ڟA9/;'_A.Pq?r'`":>1O/耮FO8p_+|SWp %`"|ɾ13S%Ô~f@E9gccф>GWEx3FT/$,&ځ7AN: Eeߎ`[d ve ;0}8A=pKXg>}#}H0(QsHCSĩoNݙ%,H"(G Ed\ta4I!Bd>>3I=Lɂ9] 6}LxAf+b#*ž yaw*` +8c.8s7oF%  f`EmFx B `Li0|l -CwŦ ~x00$>,(g/m] b@bʯiMF17GF 'qTX/ 0iC -aaG3чs L W_A#UPL&g/oR:ՠ$e}CL*M0RRt\t%`G AK_< 5Ct@#F:` -~;%8wVZ 3/!_ JT% `/}p>ۛds!^0OODxx%9>V%=!a>(SN=FsiS7_W!2*|q>?VyAy `vqux -Q,@&C6##Fc&P &p|2S@/2sӤS~b<1dz5A0o6J\\k)ӌr^#-@ x)8T0S|O ~FWXxF}O,D ѻܧݧ&qZ&\C3-ɱ%|ͥ# HDU]'䍂x-+#*IF`'>C0:e0C?dXEY_ܪ_ e0^&2~0; C1R4g 3ߒwAc&7EmCx@76ԿB] !PfV`.L;C@x/aiJN$)# m9<;863>)P#̠m5.qW8P2MVmHGHCy}aS>ARM( T=`tH<&Nr#1 }Q -ϖ/gpK020;mj(Ya"fX tvot~LQ8+ 'Ujve;A]CA@gyqT{O=hm, DŽ `rpz4@հQOD=8lWp$O |> A`XR:%#HDоq&xMj111< -i\`J&aRwC)fs<:j^ zS&tSo+J^2مm$378y`1vDvxO~4H;u )Q{JĝS ~X:qr@{N2N5 9"S<b-Y x hh.F`,gJ12v,2D+]eռ00PaX*+&s_ +X*bKQ|7`xKpN[{"@)ib7(`?-kc 1HHWA`R(t 5 8Ϛ}kCٙvM"9~P}ӟx1]I@/.@Q>XI` #P`˘ DBxX/8 ]S=O|q}_T/\6ŸQW2 F]L{3[U{lƋB20Hs0BP& eC͌; -V&PVp>DC C*:*yT`DS*|TH@w dBJ~C ΉR?1bl:}C#" o(V9~hLBHh$GȋV4Y8 8-kX b8?_r r ro i2d"BP.   3xJ@gswS㛿O+Hu+*+tX?XH@ {P9h2o @ cSy(xFB쬻ʁ h븵1={4e쇯Xe.,4x@@ -h` .L \W;jPRS=@, W: A@aAS"a5a@aNo~s._'HN֕C*q>HnwFdC!qHt4 \0􁖞:`^|)ʲ::T]laB3h`"'l! ^09jp(K -)}07a׍r%e,'F'0сe P{r wUiAc1'V_#>b‘~z\` .Mp=2U؀yHU&0Od!>>>>>޽u\uHw;:;KDuJ} z|f!`HHL ԣ>~ɣذEBPJT^<¾.7&>7A2n=L|IU&:{xuQ/J%ax` VE*E= Q[S5қa D~S!َQ%Z,)^a%$R,>PιJ~WAL*>34,p0O>ex 1(j0 ڒH@c]Y g!\ -#Q7 aI]0;;Gj)^P7m$OXhB+1>! $Tz5W&%^p|U0`* 4r; .S+ 2،\<5 ,*l1p. C`2J O' F))ϋ2g|o3oOO?>?|_d(ߌAB"j€(@Ktk嵞-`Hb[¥(=~"!Kb!9+aP ȁqh? (*139T֌Yh ϗ3Y*wz!ҨkDI̘!NAgxγrn$ܼE3vo s#*Ǟ.<]! -Gg >4V4RedrpY A#H$pw[@ՂcJT~1BƘ\:,*Do})xYҼg@XP^x8'h( 6XGMa9q 6V܇h512Gf2eA1#tyCXm(E҅Ke`y`9;@{@uS p Tq8%1G $HL|\<(D'Oo>}ȀkMܷKy-ԷKu L8@--n"e .YM/j}+(zO mQyCl`YtB}2dfDe0sBF&0C/MP!t(4C4 %#tcfXB  pÌ? q6=U 6,,ÏJGMt"Q6x(cSDRF -*Ue9Tea#0ԙTxxsw( - -hqsF5tWc3Iw)ꃛ֮ \kz(xGAS!-`űԳ>_ c R̊:PyqExI3;$oPϲ5["2'eeοUV=awcs8`s1"Ɂ7_eB)z<'@Q i !F Pڴ& zH%4QOL7PTs7~K1$&O3>LeZ Cu|p_0j[Xb̌16Xo -J߶$zBʡdO D|դ -uo[hAױL+Yzt\H50˚g0FPq~A (θe~tr`7f4O&60}(˾Pai (W)Qf R9Pߗ0lCiH7rh)B(f*# 6v:e,+1Hٓ^`Sh\ W9]`5TBQFѲYB˂NPh~ Pj|ET 5|j|A5JG%uRA" D'V[r^EB@w| F[- 2W\* d ~]5!F 2G\+]= F\M>0Ό| -jHR$YdL -9%1`7 qzH\ٕP=cJ'yQ-/~zs(ax5fIuy&O%α(cC!:{,xkِkJ PWa1 2 '{JB\GAaʮNg;!V"Cno]a88d5J%骅͛GDeG CPeO>>> -v7iAvPAtB"! tgO?|Zyky>E7\lߐ3O ni*9@H|$6` 3ToI񀋮z+3 0p n^9W2zƴT|Rl~[Kv4a!݁Jy彧#ݘ/Jʹv9^-!؂^x k ->p9A*Jd[F'n0\1B {` CSS0b(IT - e:C8H) z ^` (mOOOOʪTԣ}K tF6GQxh?^920Վ%CUZUꝔ`k`/ZAC) -&:46] {;GB?ajK8`PQ|>#yi"*[@ ں䔬 $sG_]aW{Me>(gAMЋ{*L`2 %MxS?f@$اx ?@rF=!?>%J_ֲ(w.Pߊ }xxv0Z#MGenX,@M3J}Ua-D@1C 88xHvӐfjBcG>U'jŠg }FQzeS ) 4T?hof -la -_~K ׋잙8D!fΪKHB}&}F}, jB9`D 3O''@.&U֑ 8u@pVQ? I`nYc >TН D\{G"@&\J>#] Vݏ6U\fZKNA-u&ҽнGL4i\NQ-f krG0ECS ?ꡂҴ/H4E2 c^PF DَBv蒲gA8?Di(73"hC'F!C5m(؆+PĆ+ -*Lؗ- N4֟3GZn^Eo3{ʀKP` 94䊐kYOv*~!h9[?ԄܛA%FA[mE8HphaXT{ȎRۼl^X]ܒA*@\#Kf10(A}>`sՓBD_C7)eހ܈-3a?3ۀ!+ Xr -yq+Ԁw@0n:rCK]0L2 hdu'e72)^R}m5+q:X^Sh6̲,GR׀(d/ ,;K -{| ;p*#d̦; Pj9Hy, N4CVx,59 *ŨDX50SD" H1 Vj{3 q!SM m7;BB4`dmRlFR!(x {bk y4TV> {%QPnϼT$>x-UhPD jܓ `<ՕrQU>#0Djtx}}Wh [}6퀽%Hϟ8a2 Ta_LxD-[8i(÷+[ɛFWW׬{RYn$0J¦'a j e A ?Oy}IC@!y+/`? Rću+c -/Ź7 sbe&@.%Ұë=<U  -$gƵP`e\0p<>B{D&h ?r;"'it x%a)A2 --w|f6xaX| 0{~>xrEC>0O=oT*e gVV -' \x*>bi"ibAGǘxh8K($ǥang&%q>`}vU>bȠS] ,:Q /^\C*P@R3/ܑC/ܜwB & ДHRLl-R`_V -%!85EڄA.@"ZuH -̰dGU8w(^E(PR0M8z5%5\-Ȥπ}sQM|W+M#ΰpFf#iQ^1IN\<^hTMF$G 7+V0iHF!#p nFs#VinGTBdI+@^X&}2L)Vr -.ޣtQBXyc(rEҦUG#٬?&\ (z^[Fq -JjǁN9t@E\Xj(b dvDtY,\( @H@݈%<ܣ'r8D|̸#XK "yhI,I cn^]nPM8H#o?`}ݟi}p}irEzJEbgZX- {30{+9 _7BEWA,AhÉ:rh-T(;ƕς :1uZ"~­obEC``AJCP\t~OMHruxE;aO\ O% - 5|)gCGrKU9ܩ>_!kBe)->)OCKp3M@9:@ 68V5ϰOE@ĕ<-W,/Rg!B-1$h0D5TL%[t/H9f~F9}d%QkSfmHA(@KA:K"|# zaEQ.06Gt71ZM%jRaZGJUGA9y+ 1g׍_/lf nmiVRDmO: P\?nwCӗ0;L!qv4d qgxT+Ԅ*{AFG%E54޵0ϡ80s#Q5D d# H<"xd edˆzŀF5D@ ji6St!3q:JAf:@jr -^VZuAX )K,JRӮ'Ct[Ӥ||i)2rn@D8~!b(CF C %p@gt -1Av.*t8rcY]9P;-Dueӛ7>"|6>>9/h0! pouT<6Q-M%ա$.Xgg/bx[ΰb9)c)ۛ Ar]cO{M\}'CiK2?bzO߇2^`C - )B"r?;V;0&M> 200LC#|!> (  - -B7gsH\ t4p4m!!s㖀{JC0j{ ?՞-,I:& BRt]R0Qb_! %c&PR{PpMB~J:Q%518/Y&谛-z@4a{/agF \%eHoT#ho)'J`L7 #,7$" v&p YfpϙPpʷW*W0‡G"A5C=.2$E6 3B)Da3@Tejʫ6Ѫ^5q|NNFs#lCL -;[xL"ΰl#ߘ *g : ^SUF C8z$aY'G@a5$ a0\91%mgMwzKff9 oRΓ=O}>wkj SA` lV,PQ@Dw߸Dp j:Ee˥?+ - \-^9a q^W0lx݄xL`q#p Dv#mxM 9>79GdO>o,OХ`׌^nP;1\DD\sDȚfpτӴh2\EV5EF|dUhF5Hx$旋/'>Dȯ3 _1.h8zټEF/*5Ck>>lL_͘_C&4ydDG k!/| :OkƵ7nmͣ b[/|s2#7dƄhu4h^'6*lR|B`(q`&PVZuD` ,>-N;-`IL:,A#NʡR -kN2;C(QvFjV#I -xUu適>( @Q$tK/9FC ΈV]P3oU-ķR8N("@FN>Fܛua3ɲ-N|:Y-+zxO}.w±`}3U5E o,^060p2JF>ְtOU8HV%]&`[ӭ'ӽ>(v@lh%. %A=HA0P35wC,pQE2 -FU Hg]@%D`MJ*ԑ+R!(ڀ_^D@dK;s0qbx~ CpBIaD |c0c8:&x F0邊=( X;`n}Xu1w@̓7 DdpMX 4Нv3w!xt@HH@I%^WOP<#h%YdlO %Vguy.wfXߡг @eSJ LPGH_hIlF#HG,lF6&FH(SYv @IE%ʅ8(sRŢBKW›4V^ҩUBij]!7T l_6w9Lc"`Q6kQfN~px>`v"}G|&M *WH ˪@EK\]8r;a0S,ý~~c+1rB"=^ - -zFd>_+J9F2``B[I/{V8Rlγr63‚!RU}`"27[t~2WaX>H{lHIWI{@4?XpFwIx.p^'"-Pws #u:EA$u;V$,Z0'q+S]N?1K|j0ts{F~S=]-; CI)!.RbzE ZxmB8&iDD_+'󣀆`M b U9ò]f 1$89E2nΕU*ʣebQUVn'vrĽ3kq$P Ue&C4J l0V⢋P@T\M9#LtQ}C}@7*D>[>({OOOOd6q-1CHA|`Xuh3\g XiH7Q\6?iuB -o] *@CΘ(j^/JxbP@;nuk+87%gd; Ys29ƳV}nuPdAt:PKH9 G` AQO7rYNF`+ ʟD)E]W8$B(Q\N#? Xh{7ri4}p$= A&K{H0 ntAz@cAGn"iIvg^] ~l>0(ɋ! TNK F4%>D@^ $9Pw8iOA# }N (=%9JTNR L%_ c a$YuxkKs8`[?4q6CnCjaM iC*h4;Mߐ|huC@sϋއǶ) -f:LPGq]W9%2^6E!NE`x"n4;݇s;x€auOϫϩ@} v<2 A*m^cE)$돇i :3p8=\{@ajK -x>y`;$T p?Boi r$6*/B܂:!n=`[W# Ly(ϬWqt-aL P BX+;uGAyhNTC;E*Ux@`plx* -# XCzqi ݄=x ʪ0Y|OHe 4!07>Ahn(&O_ cf:H|A8k*nj_h;`8(#7(5!:Hw ՂB0pD| X`ʕht1uE@(˟ґ~q/rT.y\2Sn?Mh |@j!6P<8 -p9Mn) ` `y*.EMBYP1=`mQj9?xYY -$b*u*YHNCz_B<P{ p0JC\ Pq"h%:p\MiA4 't;lR0Df`JR˿p< ` e 8# D0#wOH!(P80cU_|a>tb/20mB.VXWS2\Np$" -XW7LODH<.eBmEn{<#MULebW]~8IIJI^~)zǶ0=Ji_HtF!8Us{A_%{,hZ -9>^>-؇x%Oz P*rXDPuNR JmTC!"蕡HRCeD܈# -Ru -/\ $nUfd8~v?B~%8FȨ@pn3TSe1{d l #>DX -Sp^u”*5%`Ñ/8k˖8s噖]Q.,u(VggҠ(t:o3 }}lIa3*O ή71AKai@K)Gb,9FHge2ꄜr[C:>R0NСTrܞF*+1eaFZ@_9GwR_Ġΰu?m)U!N@QO|t^\ Y-]Ph!Oxza%Ǹс ٢ A3 0]rW!G|{!u?W5~N.ګ| *JU6f "On I "gs5Sed *r=x>^,(4&д@P?q! \xHRaO({"ӣ-rҷ\+ %&}['h<''\Mʩ)c0T2Pp%I^Rl܃f H/@R \ucmX.@(iOZDž#d%r%9gl5-fO%:XL_]8pu`6~"l y&Z|LF8%3'%4A o¼ =ȚO7?~8:~7fPYŸh1N͘XgM'G|π`zXYT;'}LĻLK q@Z4ژYZ O缻. PI  -Ae2(g f3yReJ% {ԄyQ#dI(l\: Qʟf}}0+T 5p0>!1~t̓(^U0mI=SEL%o):fH|>y[4A-aH\>y2Uddb3 (# Ef^ p9Tm8;PX*e% #2""!IQ0@V+O^Qֆ"j߳69`C@@ ha%C /-g(& ZЏ5vѳ{+}^.V.d=([GT8,:C!^G1j'!%w ]즪#BebRW *g3扑G yAF~yp.p; -e -&Ͳ__}\a٢C SP?pu< cTG(@{ϔ:8/ čÓb7m -X@PYxO>Y\Or*T(MCW^}EPI Qy-R !.ӊ~ -7_j}^𦫩ِ0a6M3T4tFR01@ -?>yˇ]meGZEȦ#: -߲Wy0[=jҀs  2pKGJ( @rPU*o1ww zE  -;b .5yXs\- E*2q@hDs7haP] bj{# w. *i5V>@SPED^ˤф 08i-N#@/^QӂOPrD:zmQ! i tϕD5?Cu3UT)H, A Nꏜ;/)I`[r `x<_9T9)@u'9n o,xƄrV؂xJ9@?b3"|a>O(On=' ,]5! -J(m+N-(BTpC^Н[Q -I]b{/Խd,Wp:X?Ay@ 7_Am ևWŤzy-lBGɪ+Tf L&uq,n&TI?nPª&E< n0>ID`5X/0k0IW|ɯڌ"Sz~i FՉu?@"d 0TU!>\.0I6@~wY4?6\)E H\pEu_- @2T*!i_ DB pkOߌ%kو8O!}R7M,g&<#(oCl$.c X0&I 2,{C3 yƀDK XB--28FCK(l A80F!r --.YC -67A5P 2W"ePz˒2?ALRB;H%="YV^H*":u(P<|:LaCM h)su3 sDw+u50gZ(UrzJaROE)!_ΓK>4SBW @wL^i|(&2FP"b_,B`>3JuyEJKP \ :A,Hs -n ʆԄjF[Q -<GIBًf j A$myr0r_( \9E`0g*$O=7,1QOȟHKOQ@?'^QY gf%[̷.> _/.e*+"t엍"L3O5 ڤ>`RTmZeVpD r!%*ai7j3c*%r m;̀0H%+B4Sc$TOLެ+Xn],9<%61sq#䒠/ 9k(аcӮt 8-jnBQFC6=&(zCRX"% (DZj`t`{;A"o" + \&j\!TPa$-@Pl`o -~@ (3|R&5B -ނm;2Z N$z_QPgf3(֓0P:\(CTG1YQר\fLI  )`g6 ru7@ -_2⁈ -"0Ԇ(^)QXwI -Y8|ު L DCu0 i HFq`Q=c<"O#-?2Ԉ,8BEym --*gT-hsӨ I4W S= XS,^ -}p*+Z_0\{R0+8&Zt+ 2"^c/D.n#*9Ch]wlyIQh`܂ biɂ3"2+%0P'"Өg7|A{WHy -.JD$7kIF^ɈA`״Qؤ15xΏ YؕV$JS0gpZHXp{%4SdIXXKhVd=ZDu"ڪhI _ Ca>RAj7Y.!y٠'!_ -%.H@fl;êeRaԊ w%P\yiC^  B Qeg = Be*Wb$sXG)XzhQPJ&CBE•t(ڢdJmO8wH Nŕ -4 `ԑQY.F!O/ Lv9˸_Aģ/[rW ?U"dJKe bc L2y7 x6H7 -kϥ]EK>|A>($ 2?P&9~+c*?p[X7Izahfgf[d/z1QG_+J|BxѶ_DYâVrm[υLXxP@j0`d1rCPꚕa#M6`L.2⩨' ~D&}`] \YRHuC(\&Ļe0pWd%t(a m!<r`p=d$% PfP(O/x w7xx{ax\C+qز -!*8Y;xeZ0F=cp37Ny@x -]ʙU\ "l$C_U!3 c.*p+K$;@m%iC 7b CdC~+P膢plҹnөxhp2s-*be{S* ae2\Li#ӂ}_+t|wƴH $6:xBY'"-Vn2PkYnW4c5_p &Ii`K 鏚_Y1SlAߢ^P% D(Q5],p  h¬hg)*]E8EXSj oC،wxԴO,lpI MlTwyS֬U@CQ 0oLUNW5@}/Shpan.Ƙ%1p q\Lsѵ@wy@ IX6|LmaFȌƪ~=g۰f>> QwT `y5k:gCԏ+J|"^\>^ރ&@ԑ2EF4* o-0tDNE<289H4ӁJpq;Cp)N CB39xP&".^T.<)P&r8FR ` ؠpFl't8庪! s`Ix=#*Pj?I/>TUOKOxlWÁwzK8Z>0K0}o? mB Ue[>nZC![PuBMfiުj9`D9ol&p@{45ăQXFBW` `ҿ|>H>Ѕ K%CMdj !O셩0 !YHWLF+e;g ArT 1## -b -0o`=4;60fP&( j+C%%x  TT_f]䠁isdK'Sp%]%81"(#!U*n#&d2@D@s#JN?cـ@tbFb0fo @PXER9,=Lw\KAg -N2 >W.- DnM& ` ZXb0< -Jҽ pqiƸ>k&',io yhiᛒ: 7>|av U8Zy +ɦy|bjaMA7s[GW6b$盤"ӫ+dpCx\~?=`mT oH >H1 EQpIAC>>:M-,%ܰc({~(ɀO,ʂaWM{  -;ipa+Px -}&L`0 -1 B EJ454#. c7 L@_PpSRf^oxѨǂ*o bGj,ѬNDjx!X&#d=l1>ȅf G#CgÙ{}N._*;*(ю@(7G&F@@03xH.vǢB0?Va#zGQ< ѿsE[⁑`(䐶`΀R2MMF9Mڝ \eYljK$epEC(ˤSxP !hN"rh[ݽ=fڲG9/`[u0EXS<1VHz# ؅q2Ґ"u4!:$9]k*ʡPUQ [Xm3@#<AQT6,QS,)P "(:'HSXa'cVTB$ỖA!wAΐ`ݩSefw.p0.axArKh&@.5MQ WR> S&$79[>%'R@7zCJLA&= hh(&V /G@D2BJDW|Ƚn]YU薤bFg'|>)^TtAD}ntApgD&p`0##ƫ*'84p+޷bm9!ZYh5‰X:&!ڜW'E 4 PELp;^uDްAx-G(LH6 %SospleY˜dMAY¸<, d~$&CP>F,=p "^3\GU .#8L -(P yܦ>uqebtO6 `[fQFMvW Dg'*%)P3>81K0%avNE*c!I@'(SϨ7|>8uZX/0z@ L]!R@2v-] >@}@ !جW%sEIWJO  ]Yt|x?ĕ*lhGIXh.rhyR:3%Á( -KN` ް8hg -u{|a|<7`~A,@ifusM(f lr`qb&Lh>V*EX}&Xʆ rW^1p+ Op҅!f!_{՚pGhB6JUoPOCP[/]ajTyEu(:M+T,(Ѓ7'ҚN1?IJ{gUaP'zTe>leH\8Rb+hM$=>,KAEcB`樁M |Rצ Ô *}*}BM𰖴!C$(X`6!TBC ؟ ^-B xh81H4C 2+'|ĉ~@Ai5LQ^/hxT?Z~/h0V[ӫyyLleSƴ=(T.  E7cX8#l¨tnCff,_rls6COt&!g=p[#MKw= oo'l'Fn|Jd yUkg4 +\2U䠺Jo((RrR, ;2myC{H@M2xqVqx#M/=rH?r*'<{:&5Mqb-%NL:?yz|-ܾw5fHe=3"pi}hAcBc[1ʡC8W/GƖDH'@`AQHk:76YbZSg - -HLԓG˂)T -(&Q YM!-֌!bVM11"P,@..f%w5urf8LPQH|^pbZ e=?(E u qW@ Z$ ؤ JSu#KHaB!3~e>=ςf\-G=1#}X%&#ȃiH`\s5> ro!g;|$JIT×3!M ''(VnJ,O)F J\UH o3CfMhH-`}UXa4 -S#Gf pN,XCvEMYA:X"Xh L ԖbN,"46t)OiSRJ]a0"00!%H%/()ʖ*5&.dOGQ.H4W*U1ZAu XQ:([Y"x'Rh:yg&i 5%% 0reS'>_mz@}*mLSτD4廔M"|PdfHI[i 3)x!IZ!JƚCѦ%,MRCxAF.gO¯@;CF ID" ^ߩe(,KЈ Ic+Z([7x vH0l's 8wu6s3O#>>>4ːN/ˢ Ynk0~ Hm09%ߗۢs"$=(4F4ZjvF4@2tc(qp̜e *^ -Ƣa.[KfA`(":I4<0#!Zܨt3#iF).Ax8m /^ͩ`G;`U,+ WĜ<$ 0dDLADgxA. t%K{L2=EW<ШѥW 5>5[$!S 6Q  -U k޻4j+XTOP`XT!{0BZhuBPyo< @6‚CE!!衂0'ܽ"ٖ'>(o(7iYT*",y jΙ)zhU"uMMhEULs'>hT9`RSFWIAݟ#: C"`" -.N&˂>TοKo=0WCt`(I5Y%~Kwi'C0~rB d{ )~ 1\bp"WI@fQY"lP]"dQkW )jb&i 0hX+7SO >m=J+1 U#C;]e$OINW`Ŕl'brX([Ĵsה!E;x->X[?"X8ąt3yiM-~ T@bY5)t ^< jW(ؒACr`hv8rHDb>*vAI1_aw UO| -&DFpHx%8^'灄B Ac>`509"ua2>Դ/bduP a:2oL{tܱSS"|i`Blߜ ph@5 -t RR%Q$`?hA.ʔ p { e>~҆ El%ࡌ D|~WZ/2,miSX0dp<"4a(iG@Kl{J@[xUկ7<5X ̨HhF)D3uO3)rnF9qɃ>Qg.# --mFVmiZEGF -= D0?'m|P-OSQhP0W -U)5`B9 !@$ zmtiBGPw%% MW r?ry@ JIJ40Lka\)A?)B#)H/(K6H\>ԢT(3 0I0\m?gL~КוֺOh ,*E!v5;Ž&/3_Z7yG^0amn6*fcS̴8`΅ -"51|2=':AѾCs)ؕn}!Xul{I2 #3T.Po0r #@6$ yF5Z tH 2nde[)䛏 <7w@2f -<-f1QԱ  [Cܝ 5ʁz##HɅN - l~z"Y;8}JR.ɧJ&g-4p0"sB+2>`"ETBې(fO5`> -^ȉJ==6%-1}Q,t8FMH4z}H`lcAO"F`fMHVxs1jy#H-3:&?S.: i}. *fgIS6kv_2㖄5\"6'P6%Ov#3Qenagk~ #C 5 . W}G(0=}BRL5CiMg V'eFz[24{Óσ6z?L $$AChtpP`TwC+A^g p%4΄$;!VWUPؔoɄQ B8.X2ͩYLw0\RY -VnqBܲR)d#Xv ܝgB)^yٮ" -p CժE{XyMCr] $\hz߅ ?- J3=~U+x)]m{(% B 86a]72at`yDP6\yrJqK1&b{5X -"e4@jKƉiN }B4p5ڼ*|-YfY`;b%jȫdpU+ Ā+#5eК2naff"у\նiS@heOJ>ӺsU8"q F!tz}-.[@s@KlXuVZTpe LXZ#Ԅ@LvG qg1yg8Wi -$GY8ftDNmo!$z1CaR,Wx TPhjxxӰ?5PM `C,<~\HY RVACPC#xP) OX%Fcx6iKJ`IlHVV WingCP %HGR#31-P$R lnPOqT73 7h &A,nC?f`Aevȿ%w۰C_Ik Daқ'8 m#Q4SG QHC 8Hdq3􉌮ԃ17r Mp#F .9[X|ޑ.[`[{RZxit^=` -~3:]T"+~^@+UCl |("|(>?кXiD3 -_/-Κ:!np0 rV"c 5?Q-#gS`Dc+Tqa}S9HLpaE!vULjj<^׮V['J#(k;\0W6CPAASPԈ!4v8kTM@OA+<V:8#AZ(54G?DsDD,XJrh\& ႽaLCQbCM838d @ 2$@LRh@yEI^ך0 - -y$ҕ|ZTgהv̳i<6vTõ#,4Ń8/G99Mix <|p?s1 @R]<"ZݿL_h83Ѹ|9#hV:ݘ -Hl'pP<I!hJ&%齣 -OT†Hz P#nGAO" A<;|PAxx ֣&vgxBt0tr `.Zfm -ÏT\d(hAotX"Q -`m`vQ|="4-4^gM8(-2zP+Tթw A@(JFQ5ߔ!֭ 299"LM\S,0Iv,O"7L\6U -)bl3AaY`x% uD(F%*Qͅ@( -/P򗄗:>>-!(fP0 re(@1TA%qT=AS'%DA8w2P=i*+Cq:_dAz B @mNۡ9Dbm -1T֠L7q+;-T¸aU:W=rsoQ0ߋ; ;q&CMq XaQE`h\ۦ%VvI| -yP Wzug)m@@Qˉ`4TmA8D4B - Z20l - ]:AEcZtCaܡ tWFஸn%0 )U+[J_ x>ރ3@6h](A::2SBxsh(XgfE,K'ډc -zJM ah 6 -D;/ugTrr<;13$;(dZI$!a oHD˘rSSϧy2<#2p,Z P .aV39u l hE+pmcQ1.j$3@(Y$olA G\>1^"ʫuqDTu'giqwaûRN@({\l@8YKHB^As -nXR`5h؄1'ABgy`;CꅙFLIB-`#aFYm^ - rd?1Li - -נpA JD -:zB?0ԿhE=6xɀjZ E&Xz0 - 0uK $P|#eLGC -X$u H`l1$ Ѷy8B`" - I\_T2=FcX8)+ʐWFBp -a6F `_QiRʔ)A1nD!DWl U|'%p UA{طÞ@D1@H\3z)@$cI}rpV[J"fn510 ŋ,|ߌ)RA̅B@f|YIg1M=Ob&9؃=A_ys$Bs0hPs{?cRt̩^ --{MO7 5τ3),ljz :O1C̃.\1Ps/8ï P!Alg@mb>ZFU|Tq=DF萎6 wpp;r~/ ĥ HY$7+uQIx\@i ~@׎2"4(b:,器uߗTIEnum6aZ!2X6Q.'BL -L[LL$(] +Tρn1kpf }X/hu?P`Зр`ab& -8(rCtaM ]%E{JC/L50 -Gk7 O8وGxiX&tk_H NHLMe78܌Q=+H}U(:eWS ZDN"=(d%F BL xIϴO_4D( -Si Si"ȼ!=@AKTNpa)IxwcQaGUtxWF\`(ZY{d pz.7G & DQ,*3MZ2ns^'t -]HNHk*`~-ؤP" -( t @ I٧4bd.VFaj -Q'ڈtT2#݂*2xT/h+}> -̗0lψX=J5 -C -*_6 l=t %+H.O~̿sF ~w#)WJiBȿXilcgޕş8E$Zna@0l0QrPw=h}MEN -  (d%uw.oɱEC=9/xG{ {raeg-%"|f7M@'OX.ri & 0Rތ*[yK%I^|)Q㗐pg=P@! 2 -D@^,`5@?QYvTijȆDŽhta`xaS.Y$,41S$.HZԔ"P*R$sz!`< /hv+)bMܫL[3+kpvRĬ!l BY*exiRIJB -2axQt0-`XUCŅxk~[ƁƉDTsxx_Kʀ&Pia&BKy%Uh})qG#ͬ~S /KUL"eDzsx#lPN:^-vU Ss,VB@d:@pT}a*fflR>O5I ,.DYTBq f qds5KjB/T/!ޮ1GU*`G) o>_zN0%%AɃ;(Unc\C9@lBolC|B ʂU(w}oP7*ސ tE\M(g ,ʀO=7q -A p` 5%lM(G ts7zpoڍCΙ`,5 s 3guj-O){!'@hކ2^rs;{eIYTXy1BňNhVA a w"`m5Tuhi -C岻(&(H69tV! -{۸w)h0[d+CИ0(Βo \0n/+]RY- "y{SvBnp ђ&Sj=FX82eХ \ꃔ 3>JJ7 -XBM!bS|cX.o Dו f -F(R"E,+O -]`o" i2@XT|Kc`,u7h -^|.a 9/ -Y(?Ey`΅s`Z W @[ 0N8kB 316@j`bo.W. -nPe0` - -u5xܙR84ЊZP@OJWDEՙSQT= I"T*1Be_%yV܈P%eCˬʐReMr(GP.hP§8q@SVgc.T~Y!eXm.7)eHeND{.Ot>܏˔ -;?AWGG:YP[BD/80Z"Q Zh(mhtvWԃD -2˥ib8\ h"@OjzpATIR`(Ek,Vt8C -3`DcAZ"kIQQ\CDt8`Aΰ%oͿ|1>JJ\}nXx%"C)H3P3i - g*CKך^0H2Z([dJB )Y* -(oZ-(N(/wS7;*,G%=ńnDt0x/~HТ(W`%c πuPBcs 醅ڐA1*V6[JE^It{r&"3,~A~x -t@Gf^F^u%>a8+5E8J|?I44j0R- z̹ؠYeot " H1>'|g!j2E| -=VXi= ->=AB?g2VDn T3i$/A^=#Q:c|N0]& 0p<#@dŽxy4Ź~7"fN[:g("ٴ[`ʺ{8 8NоmE#@e_QX_]2l+e22\胯S:(ACx(P&#QHd52莓9FhQKb\«@0rX5֯-M1J~ȷ -wB*j3K1pRxC:a;qeֱޥ{{lGqg ș?:ωC` zQfX۠hif(2^%ԣRP( x|"8{L>0LI:[J$qR#iů U>?} 40 Qђg3$ˣG A!4>)r*)`-.|CYm;WzIR$E_O  {a% "*3ߏhl@A&EP>h@se|W `,5ӄy 7m^sÙ7/`l2f@ A8HHEoHlo=̇`)^I{R'С6K`0sr8MMwhM]p''0}7ĸ \WS}|iz(\.C^ @Eʧ%sFe@P<{O=+irb}8 !|#b6Q)% - P >|bQ 3p0psӆ&́QK 7uWUBk@RH@`H9FFtlCypJ #v0vEL*8Ҽ cpD5Qה -yOl=`iPe~,=~~,b:CNZ u R\"NG38 - *e ]@,N(G!0X?\cP _ @Lpf>;ѪKH]|GQ>x }Z/Sh%R -Uҳd+ `:#h}BGw~Q E?Y=Dw~Z[w;aoto#d$ ZBHQ(!@j=s !)h0q4 -|`UGV0 ->cwuҀ'x @)S?5<#8o! !pb` Ю뼪#gvPC0`vf32C0 jM!s.pM(t#XI5="כ -Fh8ZA`P 2S x@ROl  -K@ͥǬ&j|yD`2̕j?0֒Gƴ} M[6] :V..!D90k&.aE-Ifl ;J'^ѾAv=)Lkr-ÊŚ>3dZ 4MD =qsJZt!D2EF -oP@405MÕU] d( m(Zh7dF!PMq0P/ε')DO9=Һ2)dT) D,)h?]!iH.RHy70]i#+TS8 -97}v=LȓRƼπ :P=tQf)T#1SyR4˄/|CE; r!Є4#( ~YŌOγxpj`c3I`Cū(+T{V-$G -DŽ&B2Hä5+i)5.ru%2%.hUo(*m,'x]E)>uѲ(l[xϗy:ԟIZ҇S^6}ə"W8p" /*&FՖ HӯaO\&eQXC>N9Oh19(Ԯx%1vd`&W.BI`M#5ox2q(gA_;_kX'$0 "- -51]<_y^0v_xgqֈyMz&­$Q%n - {ϔ=0 SAM7VP5 Ǵ11# G QЁjxl{;y -`0)& -HQcDQRsX 񍯈ARI>0WSX WTjH)GQCE` M` E1CP8U…C} 0@LEb=a0> -1&LLq % Ahڄi퉠Q9@",OH `5P9釼q3TeS4`c~fWLƟ}@8Fa_>l Tw10 kx.{ϐ |`U>t~~V HW0 G?"|4-HTʉ9ۚjot_dl"i)%_^űLiN uYZ+nb(;$eEgY_,@z|· 7c;zG9M=14rMC^O6e&AǹQpYB4;X7q4u#9q䮸&_5ސ+){;uO{J+J&<i6p7Ή6Rr(4PdB>[` #p/>74Dfl#iZtEN#Eʼn $>ê0 ~atf2 5?F70B}bEU =ə !`%d3^ =]hzE{ gB;8i["|P it?ӍO>/|/t$. :s2w8%7+%D7iX oϰ> 4^#[!%Rx.U`8%by Q.;[6Aft_ʆJYC!w<> :7A,&#Z_DF)x߯3ۯnaR\ifGH~s;b5a? C5. -A"sY.dzSH @+) .X, ҐSr[[usl^7˥+evGԼ*%rpNA2 _i+1()8S - F_NU RRm%x!8Xn DVA 94z!~P @1rws_0s~^ ܗfL !v{ mzF>?y]jW\o)$XH'!?em@yEA }6>OX@φgՀ$aP:X* b rBah\%6X #C.X8пzCgliFC_I A&-x[ U -"S aBO g/]ܭ)g3@#+aXM`0F(w@-><1\me]y#.fh=D5JRɂR)%ZqJt끯gv¤|ZjN5"Ƿ5ZA8{MڝO5%Z η8?b-!> s~j)tY`Ao>HSQ\$I1#Tal~U\äN|0HBUD=v(1M@~_BpϠp~ @pzV)!Z8 R[ho(=qik $lʏsq?˖ɆlKARXc2 -T2Pr`Kb4wbTӳ - <:%=ari|䋇S {AD@ڎ헩aڍ - A1ʉAE絟y rO=]d${a=m:0jX,-Cp7xD}.VD]2<lhjAžАi2>2 @(m#Yo%7 -`sYCG0j N qEF.*Cj(@`(7&Mh" -oBАA>h<P9;~E}"C!qE* I6=MWhWHA5@֐XNS?zBOO>+|ݐ,;5٘d.#Q+"Ɍ8zѝfȼA_-zsUᅄ@x;&Wh/B &&@ĕ_؀ -63Iy71k me'/Ƕ -PTs*E/}E= '\jrLQ ߗƛ@O63Ha1 (2$o"G9@?`/6'ELU?N?  ˬ0iGR{ CIDT_EΊ)vi ^;ctH'P2"{$Jl-g 6d hMZ< +M҃Gťixᙄ `c2 -Ǭ|=bw(خPfxЅ&s>Ne[ByNCZT2XYkL )1K r@2¨A^YhIHK[ԩjb,O7,W&G 5kCXN8CTC9Bdi?nVZSTmTVriCe\uϦzڡaYS^j$@A_x -(ȨhcGz#:D؉,耶(ѧ5peAZ#)GheiWCq߂#b*I/E"d+(`A J;FOшX2 \L2<UqW05Md.dz?2߬$Rsʃ〲.nFUIFpԣʪ -$ dbyeˁx&(43Pd`+p٘YL^tV1pЫ -^LPV9BO3F=s°g!ˌP ̚@6U8^aBy}hk0H2\s"_=hϥ{ϫw;<%{Pbzs'ף򌲪%烕~&Rg'j1Ȫ~I_{)Q"XTnAx{ARu!H(@6`Fb3àwu,ZR9iX#ZԸh5 -w^[JsV+8Qd Q On5AC# `D9p>k=i5Ī/odvPj -{?Iw|CBg{-Á+4T*/x'yWnBĝBn"<6Ӽ8;"`m N_:peRO}1 kxSx36U@3lg| - F^P,Fcx (~,UssI*T\ ^El6ľX*âU'LCבPf"M{H&UAp'H - 锲#{`IrRz)f;C Mz"5;D 2wtx&]}0(=e-),B -Hs-`'LĜjZb;@<Bt7w>p' WD}*v;^:*;SBկoh3z[#aM*iJA6 tTinr}dkzt:ݹB3=bzZ-Q4t g"QQxNh  acȠ]|hgB+l5bEv 2k -&B}Oޕ$a+T}LQ\Oac xPPn/Pۂ` 5+m:cP٨ -<+q) .-k" -89x!~QZ9MjE)#ۋ;~cE `AX/? F;lL"=#ï/<i!^oS;zn=t$-()eM'KTVw$ Al\(ʁjU-T t!z(!(௣A0huM#VEk4 -Ad&Zsx?l@6"=dH~N()o - zkv{n:DĚ [Xg36/:83]@e l.UKt sP1B؅YED-JTyj2D`8Tc8 7X0Δ17@Ae7j'!Љ[ c|A)ԇR 6 V6Q*<1Ø#5=L3 .[Än7gL efX\  o~%B%B(po8ʠ |Q>HgpkZCQ"T7=7 EfӀ^L>qթa3-J_H8%cW*"lQ,@B> -Cc1RfEO!Kjha4΂;$et4b - 'F`/r`Ve )B͟:#tC8T$v0L¥˩^2j4\ֆ|Anߺ Q2 0T#+.&\:B5 9T ߅@'8$ 2ĄD G<\kGI]/ HrGc p{`(2KH}~Y<(x?\VA@T.ȃ" 2EpWa pj|>(Q|qPׂ<6^GEdx8TuB>\1W+"dX߄9Kc^!guP .a<0@ "T hERN)aPV1G -naB{42CウX<ȐZUP na I13.< Z+QFg8@ 3$ZRHs:R4 1y0KOۼb=aR X&S5: -zwBA7IJCFdfӢ03^{"0<]G!ϏA\Fz.ک*@\sd<%M7pha{XT" @&@\AqW9 dV`&d5]n&3}mCdsM~K{ޯO,AAbP:|d͊ℚ5/c&WJQ5dMLjMr†Y]@  -D5z>If.ހL@k}N\cfT2ӡLL^`M#)YLǗ{}iy!+)XnS{K7rra -jn '>cf#Q6,iJe7?hK`-p(Ю@<v -)/I0`A,03@0Pe;8Dd>OA}?c} 4m0I*o& -=cmB0@\;K "%z(PD(P&\(y2h2c"0kТVH DF1Aɠm!蝄 N⺎ ůc*~5BJ Zl60w9®5#Eꫩ8,6&e */hղ0{N8@8mdZ CzhyLͦyύa$f̚L{_; . ckh\TZY' 4.\&U-<*m} ڭ? O @ OX19p$] 1aQ *Pd2H8]Gxf9#Ch0!Hz42.Шc,S -ihIPUgêIp;*q,y[nS*'0bFf -PXI(o*[B X$Cd,̓*q2%e6UJSHgK&v qpl4( o+"6#g )b[qq">O GfA`};CȁD}1 :4|"PцlY$ - - W'6]K8\$lzBCA_4z) ϼ uyJګSFd8N2T_eL&Cip%b[Q*R'/oX3̡O>dDb=(IR; Yhfٳ -QK0\N\` bx+TX)l=yj} kh"*I"|gMFo+r}Z3d"·%ϴ-62$ }pNKha07^qACK\Zt $`)}z@ d`=*s̺JS.|G"_4Ba -\t-LC_lp ED Хј.BAH BYarp`8axADPbv s2Aʝ%5~.|`S4#b" =!g]  -ko q$xT@O3oY㌷/GPDFN!Q3@p+(RƖ&T{V$`vGl8 +M0$OŮ )T757@o>>>xмi|FΥ!X#Ӂ+(Nŀ%XI](>Szc{BzH9yCDT'|3nV%r, (P6I?B`ZV̩Y -͞ Y:XEŊA3'+w;CǴ=@%7`mTTٌ& &Ívv5hh,ü,܄dג$X0_OA'kj:2;pW>U5!bED2G`zR$6eJ֬y}\NB -?h[|Rn!>T TU -](|,۬feZ*)`C$ MQRl foiV;6B5$"NЪ(UEZg -7* L! r-j0gx#?/) @Zq ۞UYr+H~C]zV8hD*@sB 94CrKTK VN?PI`P1;A:Q O3@`K5\\, AKY؍K70,9\ @͆  Q a;ɀ1 d$j,`Nc ~ ]K('h <0䌼m. - Q0Ch:-jJ(gZC\F]Bb:ؠ w0 삁.*  Nj! ]L%4DX@ -mPb;Q̧I@ 4b-\蠉-@l 7aͧe;A@"@3sap "5ńZnʗt(Ro9yL/QƇ0 Љ -a(ݭν - BEFhcsȘAS~úfG\8ۈIGc4|ɚzYsƠ RDTI,Yh833xM=eVY &,aVxZH<ͭXoX< iK4 Ę&T%cbH[=Dd^L}=biʔ3Z& J)(̫`*o% .bF_f /Dž$Iz":Z Lq'ga5/  L?=c -5 [0\FC)e6evs2!6eE/|@ - -\HɣAzna' voE \[  . -0@ ]5ɲfQQlPPyn]a`C(u(ڱ1Ro HxC_5Z8t8TX2ՕY/>^ÌC}V?Ҥ$tE" a)CL\AЬ*kΩ>_Qzb`XNz7P rI֘A b+7 fTCˢWĜx%y0 AK.?IoP`)TWW= -~6>>L%AY 1.w b` %+hIpDQ@U=@_+!E[B\ d{W+R R)-9-t1:Aߨz~A -E?TMrFQư-:l=@ky(!6@GuBGLd[@)-Xt2L5! Xr 8f"eY&@'g|,Dir) v7mm2o0%8qMa}hikædc I|Nܱd)mMk,J{%*i$hZ8!1peu le D$2!8T ."+Q D: NM_[Ck~z]>)߀` ->!nTi.!>Qf_)]e= R[ׇNK@X0ǴosL~JaT^3J0De&H jn*mZ#L7%fL0&^:+ -Q "<MQ'VM+6p[(cR{N'@(p`4  i>?Ԯ (7O7R&C0^l2?\B%F/ zR!p%5`6(Nа$ΰH!)BA! 36W k[XW [L,aG~Q pb6B4I]!cӦ,3=,,J@ΞV&`v@h n>?d/:`E +RDI5vQbyOI@,OOXКkaCxqu+g)Rk\ WH`;#nϬ# #CbjJsC1FEcW!@\[hL) Y=eam`@6Cx0j\:tcMOD.{2*R)z;̄!}z"0aDF az_dq4wcQt 0a1D8#|!z#)*p Σ;h4^++?{X$U,T ܋YJyƄ_)/NQ#Y ڜqt6'lO_ܙ=5HCYvCE&b\fe4㪨>{Ox)$ &`$H]*t {CBBe,qNp Dt1 -UÇ8pB7/~>H?,F SQ@`0 !Ѐ0CIf@ OeQ\/򴖼$S4^m(˄ |%ͤu:ʷ I uX]5ga;_SzbXh`N&\XaϺ,/-} xz`q|"@ - pCyG#F_@Shze YRzG2O[PUϟBi^UTCee)V iȓQ4mN?BY7"K*/,O,V`{MȅI^PFLGBa1C7pR]8/SXIz^ d1M!uU^ &}Tn0+3^$-zbZ TH qvT 5>v3.` bA(4(ЄP5"+ !T= - g'C{ג#BEGUQP.%:&)4AB[/Xe[4ba86E2{@9Gd*8R,(sE(h*/®@ud^KU $ Wx ZPP>C|:m DHFP'XSL)Xfn - 7y3wf@t|EVna:JB1\;RK0QRP3AM ҄bF*URoLV4"L!A쫂&ԩS0ch51%rRYAYIILֻ4R]< '!8aVphUSw'8`Qb#_ Vdyb$ .j6JE"TX۔@wEL #p,ސ$7 F0d>c*.SIJl@GҠ{gjT!7M$24>scp*Pp 50>3`\R?C(ǁ ъT0Cώ}џx\jpƎA B!)G21hh cP^ GUj9T - =~#Bg>|>`4O"\.rAۀcLekhptTt< ( JĨ& -*@IepaA{ŠaԄ,cpw*eS#>3e1dIcuU 6ӷ)`dJ1hպEԒ+h -5nDq 9'+T@+? B0"  ̯VvkEF!B�Z@QtcāY -` WM~ -*\̋47#ip5*'''A=8õȆXôR1O_R87;gzAzf}0~s=^(Hy)LSV9|]gp}IIt^',~C)m:BPXdo/WPT"X#԰ +LR \N3|!wDŽIc X -!l9yZ1ZAys8yeL&feD6~t1O Pd# Lz HQ)=%BE#hA5Tt~z;Uw X"ZQ0 ԣ(&tb/djiAŬVeL' -X ^|uccA -h+T뙃$X$.zW f?f30c -)0+© fD$9{$aV{u o `chU*$VjRBsj"7cQ>i>(JV,**`I93{[:Q./xIn.23MXA8u*A1:+ywAWLۍ>8O\<@*!l9PoO;k IРS+)5͝FD0a*^Ox!K-" -Q8ӢjvcPIk-! ޲ =Iar/uHt`|wKkz4k L:%6 Y\`jQ?zx0d0WB%9w 7W_B8.vQۂ@w(#0Pٖ pnP&қ'UB&R>XnqD-`q$CM6f¸h98Bc!=7Ͳ 4+g31eϴ%cȜ7i}bnj) -ׄKsF!XD.Nl=Lh"j|B+#1V kp &|5$HEpNо.)tYژT*# xx .ЏxGS8qe@&L2/|_ ;+ |؃03xs wJ)^?.#hU8;LKXpC}fJ @k QBu҉ tPe %a`(,u;8нJT+l1mRZ01(LH m(pPE~uA*hR]LXG`XX 8P ~J 2ێ׻R`=HӉNtL@eE(PAxѧ ,h#&dG)+^3԰XJv=Bl*nėf6+05%xs(a"AP h<="o$9 suȰ%0F2Ci ŐbTui^5J85X m0q<#= z ̔NMHgҾ -%pn#*:v!.!O#QLX@2l:1čpI:V y.'U<m ࣟ><> QG%F lФ`M(x@`dS(?8rG=V Nh@";IϴCǴ"wCi\]5>A"g *Z .FF;W5)C֞4%G4)bmPͼ`KB\ 1?3ޣ $ h=vь!byk -#!=J.{3J -9*X)9_אVm#f< EHvBQOm_(K(|Vz)o1A9^+Tg2KF+5`Y P < D{ -`W ao3z`H7Ab - \I{KjP ;gh#AvO j\g g,HLP ":IA!& -RݔCglsޏDV_,yƄ"4P`wօ%WĦH,FXp=QF747ֽ`P]Rj:fI6?x4hU*BW(X%A4^`d'&%W-6H".ɡ&e/B1,A+ve" 暥?rK vi4URIU~0 (h0F@06d3V0uyF+U 3 6r;BI2殜CYP{LuN"a D#:Rg(A%M7}7w%Q -GT -"h;S}@ O0`VѦ6&,|}7Xf#\9I Q!Tuo /Yj@9*RfajZ@_kff+fmhK$Kilo?k(Y_/pY w $ײW[@` 8ίxBaXĝMh8UM9# r?`0ϱ7F`1-8GQ yT-I1NLXQ[CDh>ylȫxϔ" -| `(0c8D\I?% s r0%a@)MK Z!(Mh&VmI1ȂSndKa$>z̴yKF ~V3 603:rsD~b@8JxT 1Y*"t17@d@K! -d %S[BC|Btg]c(b#CuuSyY¦DϊSjlMuW#b^o0_eGWϦ*}1yߖl,V:=@?*~-LDOBW0RsF-yP)Q -| I"Pe PB7%t_0Z0Uj@ŀ -ư%WX胨< -U![FU?xcm#;9a%r&Xd& ,@;„ЇHGvSpNpl:c=t' i+rwꃛn!B}PT' bZ۟eaG31>}}}}}}}}}}}}}}}}> 1' -jG xX<@3Cs],5qkU HOBhCTz*-iMsb$g'_ )& B0Ű:z B{} ԗ#b$s0WD Ϻ@?s =쐖 ?}+v'ߠSP02 AN>R^%a'kO!)>>gggۥt)\gYnI"I$Ype733Xxk>xF'b_F?l)`tX~o|`?7GџgH?ʺh"5ۃ,I!ujdi(!mggC0X >:@4h>qw~1D:%Y4@Ѧ5j>Zyc**3 ?XUMDH%kG AGH5b Cճد?V{S0ϴ׿؟H'pmqqorz{gooyimymu~Bnx @r>>>>3>~miO'ǼQ>{[d^7c9_uOY\,$8?J6KQQ:3o :鼛ɼShQlOagЧMԈ8@L7f*!1AQaq 0@P?Av34Ucτ/S uwV8x,-S5O><'k|_~LΟs~,V-|#\.Ljg{ -ZZOUQ,ޠ-&rQEb+D%" WpOrFVRqD lʣ*6nŶf;{ *&H.9 Kn+ rո^#H\ -bP){*bf<IJKӂ3Gľ0 Sg/H>SQ@-"ԹeEpxkx7:T.Q]beDSr1-6M7U7eiu*e9wKi^cWR6X(&+LuH{s"Pk^d[#XxXkQG؛#P_!f=.!Y[cPG!ozq&`SڞI5m X e-o101QRj.U=i+Bw,VlU hf[u*-wpIML .UMIêw3\Tq@tQzjT(o2JGk=ˋPeؘe&մdŌ]K:qU*W -j) U J닍%h&&noLMpܪE\)·YV͔lS[˱OmaAQ?RގUd0%TW)|E'H_7ÖjWk˲E=r햌'RsPEVXS*XUOc7k/ |\r]@1s|AzqcR1)`,$q0#]GsXblRl˃m ^eK kmseJNvW|1 bf2zP -d2nBTFr9B8j/6K: Pʞ -R5+:dJ*"pq`%1AHdEl-0E6p=됲-cNmW i/*fu:K dŸb \ u.b$Nap4=#^w0#`\c+AıYLE~i 7)˫=j\%Qi|U"n.jZ4ܴj]TO\PY`:hHLܻ V1B&+ 2"3P"ϩA,E)EFH:%JL\]``0Oxj5/34Kơyҥ*4*Alۋ K;ff9[Ze˕RT3P! ԧÀSĮ;G Q - -JFާ̪௚!{UKԶl䡖Gdj[\- Ūj-w-fַS/3;qN3{u\YF_τd-\DHn<\3Q p(1q0/dS(ʸ<..C -*f5>W$cQfC)eF$1T1,c!%cž+ܸ+"$T bc1 5¸2b$F.pTPpAot2-C9'K\X5 ܵʳ Jp>#.TIU[t̑E1Ōlj|7hQl׾ qsX6P5l&q5Pljd8.6DbQ) Bjw P&B6S3/SB2&y7;{B,2MEIp8*V_Пq٧H*jKb\^.ø~~$.끃Y3>UB/8˨d8F7\_,pV9D`V]_ \K|qbj"T2xKǒ~7o؇hG709"rK,⸅C<Ɠ^رbʊe&eNԩ*h+R .qw*#SiǸIܺI|YYh~@ V EW^cMFcq[u/IJŚ\GPfRsSPҥ|<;tAqJW vAd\ʽB\5,YZ5M.%,:RZ1&ʍmD)C,`HUƈĘ"#|Xg<٣k-*)Fѩq'psP)CRUbA+9 WW GIVE2kF) /yK6YVԺcpF+,5%CV@|S83 Iv©L\Q9 U>qNa`+E;.,w~TCKTxhz> qhܾ7G~C0 ,x Ko/&cQ |beY\ő]-|.b(U=J:@<ɋ qpɗ.m,OΥJ1,Tn2DJ 2Xf`d|bu‚8-z 8.;8[eQc7\[djl#"C5AeXQ5W -u(5JAL95Uw0n(\KWhf%K&a,u.&Xe\VՆ!+Lrk}B͒bNb4\fRiru.oW4^j#R[eT|L -. Kc33>Jݘ1\j~% QcPܯq>`ύ̪|Jp}qF"f+2DUuS*8[0,F(*T-Q;K -_]'F3*oxu.et4pLD QpFXWryL54 ~ pk7/\NZ&!7fLƮX2'1+\f"L281Q%a.|T=İ"u Hˌxp#|i1X -jmjVk vgPᆥp2oYr/~Dn\%8 - /,̶,m^o%J@h7 *늈5YWQIa)'pR;33$%o -SKrarȱR,^TJbb8IkQbK.:%^#Ɨ#}J+5sD!_/B%_/:hE]θhxu CP qt 'r#Kp CԻ*LWwLȾnɑ1>wxX>-JjZ-%-*X) LԻ1rRn:Ĩ tl/#3r^Wi?UD0B@XL:vT̰Y[j4QPDB@QK#n)w/:ĩ`!CwFQ5 LC,(#rߙ@tQ1PV]#YSjfVW%̤Vpq\a;K*AXC:SgİX <`7Knpq43x23|u,W u U;KUi$rxb.,.\)"U<ኗAV\{l`Ը],TPy|cljRڨ~jWy5sR ̩W*Ts*)>咆:eL!*T1/&o˨Ԩ!IQ*0!3熙g,`nd*ܠ*le;|v\b61̹0|L$>x yԩ o] Lf xLE QMLߩ3(2p(5IPꥥETn*^fܨe8q. /9* zyArtKqVVJ4J=$E1WM$ĺ1PZ@DeDQjkQbRjUa2B/p*؅}eDQPCr0.^0$#h&TxB\A" z*5HU4J$b݌:d TЖQ,q0sa0pNȽraS0J8QTY>Q A[G:o\g)~#qspN:&yjθ,^z|ˎItT\bj5/p:Nxܾ1Q%DBa1*qx?\ x7edrWĮp< -<5$7k @UJKUDFcθnUKy7ŋq:b:5DBTIenF<LKoY7f !wqp4rTf縖MQ.0omJe\"BʖBeYJbqHeta{ n#::KB[c)̴O\\ԷV_-|Ge6,inTjxT}pnʬ1ܺH(AmG6Εp}]#>'bPr&+@CJQ({PT-t_0U ^j.#1UKc1(‘fnWݮ&Vg5._޵QAq-*#*sL9q".A0f@MyQ:]̿LьVʞ岛RK{GU5;@mI|MFɡT%lt" Nv#R YXS:O@,ex:ڰ_ HH_TCQ(s.ZI+h\ -B1s H<,YYxJ%Wxe\2/)=fUokui9i5 ]dc5+jJy38w;Pcr?Rܨ˗. Cp|1%$PԨB c1LM~.<%̃D e V[: 狲&- B>"!@J"W;>&APM .1 3 ?`Vb ܞu ]*xԼKqy˺Z>ɿ;cQX+RQ9O1.1Ѵ@?hʱJ:c+rꖱ Q.6STܺF䖌Ů2 ~wʛwÂkrĪl q Bb4 $Al{[hUNkA!j5oE3E7TRk)PUڥ' !s ;Z6Grx<4Q/J~wt\(6UPPT T!e_W$Ske6"*:xQXbȆagD6 kd͵Q` ;%ʔ@ie_fל'M+a -rE՞dL#5pYA2Dk*ʅX]v,ߴdM ļE X;"0" &r~X( -eR"3kfvDM:IQ@U3pϸ̂Y>+5G B& : NH+(@YNYƮłAJJ mT5x\ȋ脦oVٻ:òh-" <&>Ժ>d]*X;a2Lيܹ} MXX1}H#kD=rq\C)@Br_JLhb; jؕfc.[ÔM3 Կhp~#R,*ܺ䫍> F!i! /+upuz7|Q nq Ev˨%dO)Kj.41^C#e[&}4_A}#KTFڡ}֣% -)eS/MO,ǙQ#|eXwR9Wܮ3|7\&t f*5}!,4 aAZpGxwW(+7>$38ufyo&9I07if K67R˨UVV mα>b`ܯYe>bu34‚? %ི ܀$vJQ)ukD\ 7)3x"4@zzc-nGRKuhC+1`h-%4Zv2&'Ej`.u9QϽFX%j M1$/exv$hR-bVcJCT?s2rhbիNBw7oٸLp:ƵqɈ v.4KζGea3BP4*|~UڼT?y4 B)e|;?a4}C*|ef -r}cX|K㩣/H*%BYsPf'0-,0 T%]\b0isZ?#0u?$`mP-Z*G, eeDhPPۘ쎢 X$5zqD^"~awXirg.04qDd 4ÂqâmqyNYwOAe񁋊1|PAyaiG~%ɗKfo_r1\TxUb1q}T5M|3mRWHqB&c(*rMBed'0 ҧED!;gU+ٸo6rӁ5.Z QXpQ\>F[_ H[>,$$ -%MŲI1+# b B,r:Ff.ߘEu -bEK˸틦WZj\,FRJT?hfbq Tj mn]bUf%g CK@T!3@:D] b\B\ "5Mшj^$&%%OAHK+1:is* FUf%F"DžVb1EslŞo/55\H(IDѿ,&ڏ=e:a(J -%]xtM8~PQCWpDm9ho۹, M[78n!i9#КܯV~$EUWQ"p^Y~Yo"dϥ;FJ'jW;oqp}[ۨ $‰~#hVڱku"W)ݢ|ݭQED?P&a<š E-tD35(>&׍(q,jYqOpPb Ic7XY.+ ܫ$D_yZ>u T~$ _G -IRcD~Q% *ʽ%MC)/x:o| +n d[S+|RYne@Hgko <ߥmbقY\MK -Ç-u/1\o/ IQ"J'\YUi|rrk,w.-lY0} 6;Q_^܂)ϕLN»&a'I`1 K%ch9]Ĵ.0/\p7Ńj\G٢RnVɹG&ҢT].ae Cڵ>EHiEm,cDܪA -hzqWl: h+~$ -Nn`}pRʆ^BR,QTWֆ}nUfPDaEP()2ŽK3oJ5ntS @o%AYoz>j%6Ξf'g3){&ؘNA'._e ljuu^,Q6V\ak.,d ^yi >#.6`$ IkZ,\Pq>h%\oW釢wTT :cbH(c̜F:56;@!'Fs7֣%4{H- &SЁc9x]!-0Dl!=og@^T zu1 -[74w,vM~HCypFR8 ML qs[KjkuP)En_9e𜌧Y/*Jf$[>SpXԶrx. -KFŲOAH>حdH? vQݻ*Hä́t2?EBD1n¥JuQ5RPf40+)ڢI* --\*ApoR&wu3CNLmej YESv 4mT%n*X~\/]Ajj Ol ]Eu𭡰BnJjZADBC\QZĪWuvtfJ McEQTn}2w,7NCL,FP;wD)PF$6x:(aaw U^w PypBCAmnA\r۬Nw[LKIڳ%#npj,|&* DcP?a^`9C|y3+fe_Rzk,8YL s Q _N,6<@[c=@ 2Ww?w8nSmU˃/0[j|553*V? -#_rf3)z8ZRTWA| -a1Rܤ[/O=fqL<0E䒴o}mN AZơKl.wAB^\kd/̦z\Odm1fS+W)J ۡ!@Wè- \#\1ak#ji>-ni .rȚQaa #hi|2vPLRԶNJiQè)@xo[+*֖]>ٳ⤭aA\L#U0_jm)-kX^5 Y`td{3 -" =T{V0n!\@:UfS1-543U]YJ\(RKE@ψql/n#vbc 0খ.>_##N @n;wYAq1 ]/l{+! {@";e.\xJ`OT;+։c1&*U*Ge>M̸> 4eԩqBc-j2 K1ٰ:H tEq.R焂 we/5UWtwĨ\aA/h<h3 xӄeަ㞋GU8BFz.K/5.?ԽB(%ʉfX-HnXE#)ZY@a.<[C>wUA,0yad 0p≒UQ+zEܰ\˃aw(]J07hJ.WTK3 Lwe DKmZk y޶kՌXY3*|=l& 7lHT&NF%4WL& kl)C)e@nRk.n YDD_pP;Pf-*:.Td g](KT~i*?yΪfR%pB%MKeU5a> -|p0ll.:\!:SQ'\=8!hu-xQ IU:댐^"rW9|[Z}LG2x:^#,.5%=lRwbD2%ޖ.\%F{ wj&+FײF+gjRb3Sm~ĂӰ -c"beUb>=T>TeơRT##1grܜSPBn`wJiP^L_%EITوwnPJd2`h-%L3[VDPPCQp* qZ*c [h}?JLNUeeb\rP⪳E]Uee&8 {FRlߘC;!Q ;ݥ N0˗u(4kuCХe]S(nY>FZ hQ[.X -xY "_*xPMK 8R8k)`|N}єZV a JrRi`VFUE5LA`x׍x`~說pq3FFLX0KlA˶0#ij^Dĸbz D+e1_nVTɹ6Z"%b,j>~#ucOg88rZ̺B&njVsVdQe%:uZa1 v^U'GWųȺƾkVlbГiVL0_^4vy.뎡RQZLy] ֡ ]7xjT^hh&cx 64Q)۝j(F vǠ UH!8kK8.nii`OX0*j“q'B7[T|Q8IOȎT-z%O9#m Uߟb"'O#:"nI8^#+R)+op_([7}Cf췒:#4JI7Uޫ@UBā@N)_2͚ʹM/113}Oqs[ -Lƣ}e-3˩x+xlup8UH^1%2ohƃ!c{2(b` |ݓ0Fԉx<2+RX[N We+" 0o(Sג~P@yp.ѫessI"8=[֥C5UDg@z&ݎ"1H԰r{4c}Ta+nU52]qYlFc<0% ?&戉S/^y00;H{8^L}Gg [f߈JO8)F*K ql=f X,[. JM>¢Й<ڥ1[töڊ#*}J*ZGy_R-zs,owm8.4V):Z<*%]ʋ -)0Rq2Zn3J`x~uab]x42Cm*WJd \CBI1d_mHqΏ6l-fux/j4*aH)[Ͳ+RQq J -/ZBgw.%LVc#Yxqu.\\f<ïDX: u*_vf]bP-o<0pE{`GqCpRW[X{Ajs;k@V -)nVT {;1D1!X9hwhx*j02;LԦF7\ .5kN]:ľ8fQԢi1sS\ydji(1)ZuDtad[+$8(FY8ҠAJDxHq{eBs ЪbUh~;hHj)ֹGl+WǐVJ`ؚ@9;R#)\aaYB,]!qrBˍVc~e˫-߀7 cPV}2ƿJOA~R 'w*\ZLpuGeӎRyANH5I*-ew1#Vm|5E^AWw}~ -ikeLAtͷ/+ &}sZXf_,,.)otD4Ԑ[u3[KʕhMviX[T8. 5P uƀ;|@kL!Da*TUR u0J:hA5m2izw{%_Rښ"֙fW-kO胢FVHMl ϧіX8er+d#FChK5sDAm"ߝ"+Dc cqK*Iwթ]V+LEFT -)١SW2ut+/Wk7@-Da[zyש#+0RsZ?$Ũ񋻆nmfywp/||z[qy)3u/=0 Wm !m:Fڅp\*U_"Jy ( c|},x< Uw).e pؒ{7PPgpIrF+fkQ#6}ar @jFӷTك孹 2;:mѨ1/z`ql`׺ u5n =$9_-WB7gÇ$$93F{ /5*[6*WVu\0 S+{5.^*+OZ\qtƯȾke59w_¿QKzLTPzZ;LK\$/|J*?1x_rSju;f R9#rf .S15X.P*ℼuW)+bEfYn:ilfRjK!ٜ?1 -Jv)! esmc8,Т7˗/Sn\_1w*.1u [rqqj$c%sf,Zڈ!u9CAH.zz҆!R5cO$'tQJTåJ5FPRPy! N=|0a`TcZ -Pf@jcXjGaMrkCt}%!j6MLPIyZ]G dF%Z˺ 1Gpm2]⎜v *:DbwUSfІ\!Q^zV>f -H[[ɮo^bEJovxYDjnaW{Ko.izeX֩bYuK4ZD?ܔԒ©R("Խbb.jR3{,La@qC(wrޖrq^ -gKBՇ…;"e{ eFXS6ʼ%SRґa&jcCcSVU!'rO'$U- -aL*WiqVTi9.m^9U{VU.4Hj%dʧrO^jPe|\95\fa*RsথY 5R-rq]-6FǍNLv˶+uܬW[;X&}P(Ժ'aRq[`pbYu^VpEش$+/AMvfȉqrPz,,'=Tb+wA"rlܫФ@9*;`j.]" -K6ƫu\4‚DY_eҔf[x¤B֭/G2"-&#d{n'_p6l,M:ߚƨj.eʈ_o -+Jvݿr9عIn’\\` $ .{0 K]PīnRK 2F[  ېdҠ*0~.:,L˼NV"[0fC4KԶĈ숓6^p>Q -{V(%ٛ*^eb b[3# - 2I[a.0  XXhCcH Ԫ3Q:%[L+̿3K&%cRFgq6K9i%e35W -ޡS3,n"n$R /P8]uc0K%poƵM|=d tW8ep7_][Gd}fi?&QpR//wPp "jf m;8`to߭bevӦ臽f.ljSxz~vG!w -PU3MSamDfp%J#|J&\pE<.%SwUܪ+|AuL7Vxr’T~ˌ!DxIPbX7[21NOUt * _Q(Bψ"ۨI()57Bx&xVr*6*iSCmEQ1DFJ7- J E;ۅAuIq?7'44C=Wxk{ڼU{P:[/].3:!:m%=7o50j,D^SeJ*%aL+'JJgeRN.3-!ZKxzeK-(e;|]Qo}d~,%EJ\_Y/*|쟏|T']AEpxCW X|\/9j -i' -y bmJЅZWBݱ]J=dRjg9j|Eo\R%jge.Q[pLWr[, -+*rʦ#mH -#w1uGLPLBVRGJ`w1^ jYR@kkU@pVoJ8Xr娚n,R%@}JrPeBY~8H0Զ"U0-&\ O*U~;A]E #S=,BU -Yt|GK.󹍵"R^hНX[%xpj]ՄDT0L[%& IRѲ[ )X)=VZc(+DHC88necEΥ|Lp36 ds b52a6?W*Q[;!&/\cHR\d/u3xTQ11N(d&D]VHq,Dlg3ȡYLs8F^zQ'Uw-] Uj G7d8z\6֧$x,"ʢ,tFx ܨᗎԹYm^+S1lBz@׈er1@DpFFX"Ù|[mEVԺ1Qj=jU&UPj/U}K\$OM@9/egWw_}h tt3q TVf/${GxLpPeV.-"(MKg!8:F5HCf{7(\hC|̷9ϘVYAľ4}!ՒZAL)YԽ*x!@p3%2u5. 2Ŷ6$Du7+1*WQ - ҽNK_0+P>pڋkڹfqk 4pبJŻ*jE%@ Ąn ݵcҮ7Pz$D -\/5/Ցr ZP T")-QꦮWyJR \J.&jR\;\eɎFd||W!f - % 0˕OR\j7+ls~APO -n+R*3pe )LP{L/:ؽE37T:"%OqeqLib;m P$%mdnPc˨dK%ϩ.eMQq35.RՈj08%rt3ٺIl8ԫ]jmS_2.eP -:W}yJRB%?U Tip>/%9!W` -kP-!,`f8.%3\? /tKSĹQjuµ_~l`qyeJq -}L$~*<̹|T(% VAoe5 V,B70'PbRqEA+ 5 qV1!Vߨ%wfP0P'jDjq/.3L( j=JNSX"Wpyװ;w2C}[3{Xū\hćtZ}~J<`]xmrBO -RBr8XK \2P㻮\sGr|OR1baJ@fWq)UƸVJ_;1)OF|§wRbgkj.{10lk,w)̧ecG<-n t~n{#3Y%}seFQKz#SpOeԶ#)!kdw'q=ܤ{"I2;Jۨ haj-ͱ32r*Vew{1LI=HA+ IU)X`eb8p.~m,u1H|m1bc^)0$SAu|A5Z5u$g(֌ߘ%+5= pv%e?X`CQuȅ_dХU WQVnzb{`TpA \\;21jԸJmyn\,ff/oF3t\xFR%S3čk^%LLELF52#)8Xj7zũqRJV+.mnʏ"ߙ8xX4MjhLY\6,S"ЧL e)%L-cs,AO@x%)RfeXqKAhpp/XUAm$j4)r02U<#7ĎԐfx*5 RUJx5>xG P2)[щ  gL )rUZBU -xv6Tic -MׂgFt0y˺ -*ԋj:w5\J1.S-!ZV23 U)5R`:-Pqq BKF*1ocMՈ\f R4Y,t*-.-h# kw_ropj)A)υ?8yQaTsgmO \C*8{K @mܵo|c*b2NFj& JJqJ:&8/O$)1dk6dp\= +r,2JEVV#Te}U]R'I\a+\3W{6@rʸTG\TpÊn2\S[|  -Oi+F=]HksOSN>@=3X:I{0B^\'2%>a2[3RPe'`-@L[(QrLUV%Ա/Vn%C| np|dy8c[xQ1 įc!JuH&H̩\!Q"E,cu:ĩS:Jn>oK9԰ Y$5.|\ji$P oDOa*슿"`?oCR ø2$nXjk (YT@ŞÇqcUn4Sh._с Vq%l>pipآi,WL& s%VflVe>l"Ԓ9;?Z[f̂D[Ľğ0xO nbd|^c2:2@w~ﺡu?A_ c<"*Cr~WÂ\#A p>f]3\q901\Q p憒cZw  /g7KZ/zYɍp6d2<VY*Y ^ -` (kֵuEpn4u w 5U JvX!+0L鞡G5ȓRD\ -KW*|pqdmV0lur3 E\_/;&5 fG<:cg eqrKT\(n Da`n/DiP%j9/rĩOOwhKE.JKs=Ρ2cW>%p`"E *+щ^L(J3N+=+ymI]Kfˎ4ڔ> qq\R}!*$rܹDܺY B*|_": fʝ3jJ3˨_dZhl단|f\\znj*n74kCiHH>i7}_i(:٫Lqtŕ]t(z~z@EHq)V_rr>j6emKԍre2ZKQLb+U,[CYQbʅ 9Xj( &LbVeBu_Q4|7nRZ1&a=.@5]*uHL-*p)GS01IZ9S,&~q”e'pQĶذn[rٚ2;OL!RjW, 2\DT/Kž#+*[P#.^b.^bWM8HKW/\f/\). ."˖O)UQJf8e(7/,E Q̈\ӈ!k^g\(Gmr:|ɘSJ?|o!_fT`%n/ӌV; }S7 ^WQˌPYu1MmD^aa_,5.ٹIhh#]2\c0#\֦x<̋ N_W⏟;!ʺaFf2FSr02Aunx_ -oXwQ[#*[Z3odfb5bѶŅ/b;D^2}K1sI;1p]1S'Ҫ7Zzqܓ&N*نf3U seaU6YX&YeQ$l"˅5 dF^b|<_;kS[bfUcݳ{ ļslHcrNjf8~Zܵx(!fو,N2TqKIs~b,xw*.10\y_xpaT€2ؽ#,"@|͢`ڳv&"LXQc+Q- AMd_|r;-DA,QUnri%S$ևc -ٌ[Wx`Q%z5!a<_lS))O|5;ig5զ>֒hn"RKbj/dt -2h9oRf=yv!섾m0FWU;I|ƅ!70oASaEV!6]5 볷`JJH1uP\}E3nꍻbn7m]A"%7ҥ 뢬txT*^lN ,Q u -hI` -cBwlWz{Z78J*,a|Z]bX,*W2[PE(BM8Dcq3 -ƮkPng"K Srx ua7UB sfoH&(0n|q^GPS:ڊ@i}1a3Ҁ"-ܙ. -s1,X<]%d{{ >TzK?ڛ؂ma%x]Bv~ O*i FťjsFu V~?Hr%@*֑\4d[fьsBfijV]r eW eE/kKDY ߨIR.>x;-RYQqLX͢V$? -&.:'T3,pK)z't\9^\ubT-'wsW:`k /p9fG31)f4UnS2%Mfn6ii!nY?Q+QʗD̴OSBW/)[@/)8ZQcLFx - -,eC9ob$~6{b˗|1(qr?rU3RJq5ƁIk]p3\P3x -= wl>^%DOpQx\:7 -v 9a꽚 f#X_ %JT/D"&-PJM]et+eov#kA&tv#ՉTܨj:p;Fv<ЄA< HOZ 2}V4ǫR˨,Yjꢖ.Nl= :|p7/A Gfaun8\b6%`KeVJ{OLN-,\*Vzx<1YܷQ<2 - J+<%fs/{2/W3l.>9W=0K\ɻr<_6_K-7qb[qWRޡMpAH9LԳy|8\-RR?ZYE]e&?ZW%{~ߐzxXI&DŏcWMA*#cSќ;'_^)ׂKUK]JnV.7f|ķn+Y<:,${@N̠<8xmT=sz U(񁚈m(J˹|^!, b^jU*TJjd0JF"qUަXbeuydYN3ey'3x _;O Bo,ś%_j7r~,Lw/A+\WkpWdmP -R`[_HeT6苹^Y@3>-N.NR:qQd@k$[+ƱD)XKT.R4k^fa)L^5늄5Rۋ,R?\75pPġ 3d3_C/r[.T.u3<? \rA|3URuDwR/bb* W(;V$rOSX`V:-3]ŘJZjj3J-K6TPt⣗~HJT6$5vQ=mk4xx欕2ahPIKW]P-!dݥ)ٻu*cܵz| NW-;tU;BqN9 ,rGLĬl% -AIhnuO>m.tZQg0SP*[5 34+6@iV ?Z`ӯ4=\J7\Qu\R/re*̡Ր*si6K4@(gF-fm+/) aHʗC <2<"+Frnp%]9q.}.($v! *Ab\6Y.f07r3*c:qe%*Ձk|-<*T.u0K UpbjW"5.xYIr8Iu #-/jb2*phJjMl'~N?EVjc4ԠFBq=,nO -:YC-Yc+ܼW5|Oa. &TJRj+ij2E"OGR^× >,́VV{$#gw)JԸGwKu-w m JW*%gL%lj2E\9Ի+jnu.\UFWKR_Ǯ^,prC?qRwoR.kK4cң -K,cW==̷]KG5*#j# E1 ?\-#}Kyc5lB[ k#nxz6%gZBX 9 _og0F*Z\ - mC\z<1j[0/&OZ %D5ρb"ܫC!.Ae(Srd%jjRagܹl (]`fgհΈ-m.#;UΣmA%\.ҵ]3Wu+z%Nd3 Al]^\+&x1oz @h#KQsO%t@^t)7ZF3Qj.ImAm Qn_4*" -Ff eAZ.fT%YR 7AT*DqЁ\[pPu\> DE c n6⁧M\%m?{<F ZKAxe@yM@ftgU!/ˇM@7R,VCLj|:8q<{ES0NDžmʍ1RcҸ(\*) F5:#dԶKQ.TeL< oDc.W -_Ij]j>_@݄7X 'ؗGp>f01GENbֱa.YrAad6cXR.:IJK 9a-2bkr-HfUK Ρ+RC+SPexyQ$ -O4]͹VX7>bZ n䒠PǻDu_x[=*r~\o0ӷѹXef0wǹ/F&Ƅ!2>(6To%])@Ɩ{EUxW-x3Az̢.Ošz.7b5}FñƊp,FQ&v= ,2֥ԺQDzkܺB.̹/1sԮCMx+JfqEa[*J _g*0j5so~7LuÃTw.\%'+%eYme. M<JDڻf^L8ֽ1Jhp+ܧ7 17j?-hZXg<#5Ue5[3/pV\O3C@[hPc[LB*3/VxD xb\s01 .xE\ "|8U+U:ydIL4ޭ?^ ӎvjs QKzE:ij5Z(Qǝ M%4A pW4H*HKcMQsl Fca5#.Z0[pA$~?p]Jq6wWOܰܵoU>e4\ZǏ7'eV&`T1 pxb_4uQⷘ٨_qV-EG^Ί $.rNyNpQ15d܃ !plпlڨiz!W  u%S01noãڬT+/, osGň,=5GEYtjE`T`˾.Zb71Re*d9 -x]jznR1S 76%@U\ &OuZ -"MqܰwjŷIOv?'-}ͳQ|^ic_ea}njG!d7L#W\W|\xqkܸq3ImTn+ph0&3 Dsr8ze,U9h`ZMʁ1|++#*[W k|^++/0(sKSd`Q.]w7\6ԥngw3] -Kc5@aJnU5K%d5qY&nVp047Cs7\a(Γ05Sl&j:T_#<2P) 猪LDjmwFRFP+=:)Gjk >Z b#l{q3*'%=3'D6\cG,%x"[Q=_`Gh[(4ՐR#jP˨T-@*u JMRˆqs< θ!ۈ ʝWje#i.X(-;Y{OF5)u -xHDnZ%|1+zπ5F񎫈^j0D̹o&7d9@cڢ?Ok?lk4oLrm}X}NEғ73@1b*&+dWHnKfͱKWc/Tj|DԹM˛n EMt cmTdZE{ ({Н-d0s*c`?I1k3leZ7*#"ϲn]㛙K-M̃2j+ƂTeIҦw4-.`̧Pc1R;C<wXPzY{p(Lj0Tn6-|lĥ/엊u +!5Թ R]FTq#[┮%|Tt/7* C5wk<E<͟ܔ|;f( -<<߭4_?ŰUzc5ejbkpUZC::-KkCV'!P% -5Nn^"*ZvV`Q06\s *K=MzE#P%n\%eAeƨ~\?!`)Y|j,iK&k0}V% ?Ƿhҏ@faNa,u<Ϲk䗾-.i!*2MBE Yfn-B A[%qJ8WMB7 wMOpQYL-`<(M)e_4KF<~jQbr^M;. QGpZi*W4[H!qߘM{<6w)J'l -k31?T9OSXKXv> -`\ay|}"CqJ=ڵE󚎠$2wcKr8;n R\L^'fe b.Dj*4d*ťjJS 51Xpx8JFU0ػ9boDq!؁8-K|z>zO{? *46QL|5'B#_G҈LzTyviELP 3Tqx;*`%pUB< і&81d&x]}˙vc-{yeVjRxi oRa_˽MqP7 ϞUU|O pM$"%,w0#nRѿLY宫JZeZ"'evoq[5o -(?e0I?u?⹻/jw1 e}zՊᄳ3[{#N|%k8EW ^ls8$v E,rhD" /gsXZe˦8`M~d#Md_dE -̥H-͌45(#_YT O Uw)Hܖ4<&j0/4JG9~nZdAS :_ tt.brW)e<4NQyhRVag {ķdZ25S)_)TRpkb@mvʏ@J`Y"rRJ` ^]Jxh'P7 -EZT?3A N4I&JTItMkQ/4 FGjWQ`ywJ P+TRŌ -U; ŎP%&9"%.,HԹ|%T@fi*W5̦!R%-nfBWCKkoUXj]4_4 VSPQiAA-)3 G'% +b1Yvߩeq4|M˧\+Ժ0mJik],,=vXbCImD%dCbM@UpbM1~z3t`ŭXP_7 [갦s6e2Yxs9 (yh.TGFyZU+Wqh ͭz!ܪL6VA;6]tTѴ)p~q&}JzJ'2B -pU<_Pd~@Ot҅hPlMKhɶ?42೥P8Eo ۆ#錨df[fg\S)(D2NTq4ykLe=CU*b4!}C,JTqP!BĉnCl!G*6AԹ3$wrJ%Fh*QP-4WDu*b bUh&Gx,)ʫgO";OE4՜]5Q_jL3]jbJY3"հ,$ -:'~Ij+X!SI?F/>ʕk{K;V4aL\NYWQKS,[wʌ@ UD:xʮ -6`vncRQfԩAc1X, f;4SF}O>,[u\GQ74SMc̼:4l 7Mģ7RwaV9x\'c^JJn;,eT7)Y6Q_27p%KGԾ+0H\RyjfFLظ&w!+c6YX<7cVҥ@[uoTAQpIKYL8RԶ3p *R4S<-b-sq95bRu;eu—c]10$t`Q17!RO|<ьܪJ8n*00 :mexCbL!kF`o">4TAu *bYQ`md.sv%ŇuO4?W&-_0%KF=A+0+j_q 7|Qn>b8L"˗ nJDa[(RsSatL s(]Į -B94~&9AYp.47Jˌ&R+&*Pf5v2ڧrF5\;RȔqK3տ0ן?\ܹ9y)Ha> *{_ ?J  1nl/0nʥk5x0TM9ܴ^c$aQlϦ,h=$nYaYRjLJ1T1?=$}5[:l $(™D&" Mkd1KM%@n(qT0:`@-YrBt@:`VV_W0GpRiV`SO*vR`%Q>ώ +LĤVE -Ŏ]T[|ʐ1`݃Yf'dQ -)7+uUUMN{̡!.V!v45bd=NJn53%* =\V@lz?s|0FU5*SR]WREc,9Z)R HtK<0r/=o+N/rsѶ?L Exb2 }`x֡ZV c0 3u /r|x~eQM2T) D}qFf.fgpZL>c|6.Cg1r,sωkWҧXc-Rme -7H0 -YR#ԁA\(n$*홾 d~cah0K,Deo1b!-afe˾kqo,g0G>1㺄~eJa(IX!Q J˚epj[ ,B5tᆷ?N".5JL@}A YQQGuo gDbCVMv8R©cb/O`կdk:%w $ 1u IjpbW|#{*uP' !Q.])5^ϼBj.,kGHIlD[wk*gU@΢D -IC: E^Nf#L}6\@ -ƕ - ÉjKu_\JL|Q._.iˎ CCДS \'\2.^8U LCYt3+xg_lbqQU|4Ker+eNgKxNz8O+?dV3~$C>', .Na~]JTqɥk RΦ+p`bT˨pKԨC Szc+r%)]RJ z.ꤨcU}]"A1UTʼ0O?E{rDYrp0E`+fR|CGmctQ\b[^vf6k1:MuIk4*lji`Aݠ,4%Q &jAX+u'Ln`ql51ԡe ~կ1%J:Y`g~h쫶H -mJeLB%%f!XXA-  l,!Qf# -33e]ſuLc:AxK/(eTbsM%<,g\|̌_S3Dع dU|c&33G@nt.HC?@=$Hp|J⛋\fj\ -Y|BȐ*4 W[c5[錆]o|ぷ3(=fSFj^ :^A]0s11P."Bt1}'.+|NG:iVQ[M]ntqPa3 }G YaU*T0AӬw3nس n=;Gf,Uu ecY!SiRyd'@;L؋X{pSc(C^ ή&c|/抆^% ڰ3;!{.iW0@biu:5)| pÚ|ws5hTn f2fPB*] -?(%G LZ -w Pfzi-#|i5 *1%s`w%DŲFa%l:jV֣Y\@;EOmGFR(AD?3T+e?<u ֥2K5S -ێ;%Չ) ]i~h1bP[X)l,?]^W w<ї 2.T߉jL l.ԺTbD7VJD%6maVT0[E[\YN_ RP_ZgV Pҩno -R$[$#׀2ж$=~Ǘ95u:H!xc\荃ssrB}1p,SEpw4gJL/ʼn!i Kfop^⎥W0٩r*Ww;E. L%{#1HR*YS, ,LT'BzbQuMXJB⢡rDpO*v@\ g XA-yvJË'a2n -NYt #MW|[=o앑Y+[j:ezJLouB+bkRKơʹI c`i]oqFanhZaܳ-G -4Fkuǻtݖ_e\M.|Z‘_Lq1 P 2&| ܨzs\1.˃R \Rul]%B|d:~jz"*+2 -h0pj7(q)Ee˕,8#lo HC]t嵌)QD y -|RHF"KֺS}|]iRV(ZJNrTpBL1RQxRP8c~0qu5aTnSN,&5#kbJ>cR3b*xf7;D1k: h"<x 8|HҞ0Tvg"kM@hީ|pr!|.sP@qrrB_ -P=Ibڂl,F> ++QIgD{IDd׋'{K'.U6If -7kBT"̰R%ʩf#'i3x.UQC\[-\E*$oDx(z;@Gm_~r`0W`1m/RtK%lŪ(_X5cAC?}m}d"*ܩ?7K-K8U?iv$m L*J X%joqrNy^ zUNg[d-(Ǻ7eTYB[%y)E mu›jt2׈ʉRY0n'B+ FW7԰1>R -0c刘,xc3R%w1a *JƦ.\\G3Q-95+ĉX*2ڗP1n -ee%R 2׉HV!_Nvz&1y!`Xѕu..t "k1uW.JcUq!-`.0rK-pq.p(s.^&X|330%f*,A0g̻Rbw4qW,VV^(eA5}5\hb L=S!_b}?iwIs[.C_pM͌ ?#/-A}K7rx⸨/]B08bbTTfzUoCB!?*J+ `*2Y/ Qf* 4:Řd_bcyDk]imɯ,n?d.eZ),DѥoLg!ڄ:nUՖ{? YjZ|n֘03G ]Py)sA,3OT{**#,xfXL57 cڗN]2r+M -!}2*s[r!kf%YPTht\q7>cJzXfr\'S*RZKJYd 6K9*fciN9)Z\IA~_<&}:bB1u e̶8 VeƢJ(%y>pe(_ -R`(Y_wUb_ Ae-{OG߇M, -v{ 1=D_F ?!A({*LNϨd`Ԧ0¸ILEڭKr,O{\:DsS4ıKwIC Z:%5>+1]nkeChJ8Lԫ%ԸQ1,G T"ٱ: +ƅqY:iV>BF? -5 -^6ۥ"T72\YP^5: Tū"hdlz#_ʎc!. TJy'D-SH(E8*nR!82uI*;W51FeTa- -RW)!=U!M~b*5.)["trGr1(n7Rx".&Qr7A YH%xKV Ţ%[@ eF$Oq sˆV!) IOBdeSdaLj2fernffdwܶDO>}Z!;.CWgR8,MY #aگ䒎wE\۽\Pڱ@%ǪKR\TjiR w4*+T\ n)zyF::tARUKB[Z)ĝ}f?yFWDx[]!"N%KӸ5KN_q)ʍ$SHlW4V!.ZiGz./p-73 g2!60co+.384x&NIJ-J3BCQ) 7 5LZs+pT9&ng*z>&D4"Yb l"B\M>/AI2J.# 7(D=ƗQ!FXY6Wyry -/T,3)*"@ke|&,tb D -7|[&A$d@CT~&e TW7ʊJQlGEYjecRoJ2EbR7rDγ ܫc̦]A,=%M@1ɟCRRvSLÜXhôLv+%*YsH?[;WUL|3ՖmbR#fBgfDyNNЪ) Y ha>ڥh*ˇ̵n eWn6TQe ˉxqcO? xgw -TrS,39ܜ\vK|8NB@xkxs %;6=B  FAAyfyNqO0ޥ x0%p[O#9v]ϹnX:Uʈ7>cu.UaYT.\L3N o"K7ࢯv񤇿oO8~?,B{D$"o;'w(@cja&bzan -3ac כga3h;W/-RQ~έl"L!mb{_ؗ5\\+? *9ST 7qwLI3Oy{(E~;b@C^R:"0Bu^d #0c"DF֪.{Y9Txqrksz-1#x%BzpBc|_NjT@^Dc_jR1%4&1Dxfg,K0JJc:wrȳT p)qܷ_.A ;]L\eNf&%L-2Y/c~,f DTi \;fɊJr93w5ms$m%ʍܱ)ݕxA8n\,WlJ%_+~]sDBfrL3ᛃrK%8I`EK=.WAvĪZa~HUJR'Uu48,QΦg(j*: -. -55X9%10$3LFnj>n&ef|hw0\!fYnP y jˮ~JCs*%1azUP*4IJ+x:I~.% 9-s:Pn_L.[D@VC8%Eɕ\TPq+${Y( |C*ɁP6#.GOI<S:ӏ(y;H$G`G TPR]C,.㰷ͤYєyHoYu|@p`$)3*T}pGTD#l?i-"c۔}u߂dբF9v|*Tg`Dw G#SS\_qKF, i4,,&U[(@ˉKn;+5t^R98"s+ITψB\li\腬$0e~͖` \ķPw{ #-{LE]Fc m]:Rĵ{z*LUų fn[mq72b7c q_P_ALIMC4֣a pN}w9u a,Lʙ2L? .8cL6*dc5_zb [G+%L|x\9kS -LBvFK_YAS//e b0"|1|ḾgE zW)B< ^:JL:6\ {Ԣ?]MK@ /jMKfi*Tpp%R8jRD.Vd2ti4P[/X"*f-i#xՆ FZ"[ٯH?ӁRA7Qn)` ]mcUJ]ctH^1SB2m/ΊR1zK#Ar |51-.c#B0C'eoܢ!+1q>ef)/#:aL_%GDKQ3+FK%1E`/'5/Ml+1)6-j,\* -.͜PX@LQ0`!ƉW*+eWNNHULjl'pa730j0lF|g74@X`C(QpTG|Nj_R,1]Ĉ-Fe}@(Zc2n -ҝzÆohLPl>/hFz *xj8s93o|X%@i/sSd꽞ZZW -pS1.Nn14R2. BW!y_rƯQ6B-qbn[Ds2|q=R:!ㄊ@~,"e-eZ't7*8BA62gw%`UU Jßފ)@}44kB_.3Da*֥WQx$u;epYoYvb(u2iu^zpό\BQFqf '3Tz7c% 4A>`&P;D`:%Qٯ`GZ-3~"QnhpC -/0xb<'FN31>)EnjLè1:# &buy&+rLk!6>' eb\#e5Y. 3^k,3΂DJj [u|eQ>]C?ũ>ɨuP JD}wi{p~ %K4%/Dd8;⊔eQJ|,)X}DN%3rϸqɨ,٘b\0".+%||KQ2j [q_PHUd抝}eaJYrᚇ4a2pG7U&u2TEnUjTԹW..T7uu -4'p ^_peล,^SRR7R2L&jXKa-@bT? -%~gl&.So0GEmZ`c:T-&%L!>I/bƥ e"<-wXrsHvv+ 7[g~KP^R Dz=al=<ꗫ@ޕmZ^/ؙ 碈J Eý%9WҔz%9j~]ܿd~ B`V#$i3dG-*0^|VX7AyȖq- BXqZQFV:4)!TqRJ5 TFڪ*@* lW97-;SMiv$3e=E@YAv#)QY ;1Uc4JPI]fff^pǸa.lX⣆mFѪRpZY,2Ҍsy^ᙫ\L_'Jr2RTⅲD)rep^*oXKIJt%^-Ƹ-9VbLR%>'pvJ8MbԵ2[R|W jf*Ì7*(+\ùC *  T]b_r]Y2Vx&O eQP)vʣ{Z u-Lʽ*5* .s) BùખfPN,0R[ZĴax.j:fbTSvK/r`13WTYNf8Gr=^%T1 -:+TSEB&Kj9᪂.n+5DOʭ)ʇ7ze\c)QJ:벵/3+*z*/| աk`@% [^NOH0SYcO˚7 E3q1|xowM; jap1b&#}pj3-q"ֱ27-. pg t-ʌ8UጤdWq⚁7PQVND6AcIX Oe!2K@D 4(sST8Ծ \3 nUp*o]p)xa2JW\ Gpa?bp - BdSF8>+.f%FS -& ԯ.: c>` -̷ZRXhM/#]F.=˖L[R±KDˬ%5+17 s,]O! -`n`ВB|Ϲj/Se O,]%!.-IBi46Vm׉!nP~aiҭU~ :+yQT8/?x[AJ|E,@R!'ê!Mc9k\f뮀X_ (?n+ݢPXGW)ө[#&: %(Gܟ 冱.eELamұ;5f>ئA:ѣ#^ cKP|nkgF=ņJX &KuqE~tM5U A` tK={g ),†;=.euXĊ5.یfdPܲx ->~Zœ^Rշ=d>iH S-^YJWxEZ8 -g˰ES\WԩRʶBiYn6)9gfQv -J$Zv0]hnlȂ .TZ.OaTy2Ʈ'g.9H E z8ڬLǖ7Ș޹na6c}L38x*5.gLIfQkD '2eMuA#\;AuUlZ཭ER-E( |*Unf.-JYMg8{2)ap)l9%o. Q[ ~F2F)jA#QZ>Qa@PfԼ؇`Y(,, >;@EM=4lҪY{ܻC>}-V-bjoCS -qWtćΆQo.g[Xy#\TDU,16@Vë[d6k 3D0ނ"bNP\YCMe t:~"[k%!CtE]&> 0?ZbX)&4*+6>.bmbQI|fbـ[E{DQ;ʑZJ%2c -7>1ܿ1$1#q K)v -OܨFK|<QxyKZLSR+EǚU* p85*&85ԬMbkwRFPG - -A$/JcjyP, Bwpi\%RۋMhcgYf+3st&op+Y h/BU|Ei -*]:RAP .nv=.^tWl,(UBкJxe#d⃸b_@ ~gbf;Y1aɒ\fUKPA^.6xyaM1&lTwSցPmHc+-YOV]|9K{f*|tş -0sV~$etoFڟ)t˃mrcWjޯ'EsxݐeNÏњ߈gy+W0%= kvu+e,BrqpWp_ %ʾ,DxYp]0s@7{WTFQ(kͺ|;z}z[~Bئn~xҬ\ݞ&a$GeLcw)#Si܅mЦ5/9$ -_$ cx4 t؊:Nڹl%,RjUJW=\g&jA[FT2KGlcn45S]D%bTE]TНˊpANۛG\\T_|YPQ+~ -?ϾX]fcjQ[2LBSMJRGL)ڗ-c FPUszȞ fw,'! 0ɬԮnW=@*OHiA"B[6By^p7)%K`ܹDpAqxᐖ щ`)W:|}@AR|^u*Y,D7l#'2#]2RFرR20KX`AM:-I22xx%.xY%AhV=1qZ3 -%;D G -_K",PGѕZ),qFP^8`箼2KIi(&nRWI3Qǜ~EPK xx%u0}͢"ɌĶ c \u 닩~r؏L-U8tKa:8+r$ou1(tK(jQW.[?V?0;\;A"M*0>ؒB\w}q1~0(_\xTw;z0$ -)!DkFLqp8cuI,]CAqpd⟫ŗ^ :=N% o|1r ڭvQ @Go<@(x`uN%\d!x_x+?"C8^jgq3 -;_1xL-Rc`}}IS>s.+`{w,[X=ɶy=]C*>`0n -]kTL~pd5M˕4("PrMlT8~ NcVnikxY{9hQ~u,/=W]PQgkYu+Wmwtyy&* .= -/䍒d\*Z`Q[eyKV!>[ܜ [fxqU\x.>YoKX{RW R]. ꑻ%x&xxu+D-xq5:*4KQn >Z%<ʍ!E JSH>UjU\!\.}~ X奪[/ %e91sit\JZTḕ23wR]֥ # -pd%GK:ܯK9ݬL拔T2,Ы˸ TDkK5ܵ8iQ,ĭ1>q~GY)Ttas6 2ڱ4b 7>Hv`aⵈͷz[Eg:FVi.H1dKL^|AM˧Գr˰(n3*c*[o?3;fj*Z d)>8dZBD_B3gUUL a.<\_l? ʹ a֘9 ,q[ -0/~bȞ菬} 16XdTgVp^Ky Vng$]G: 9a`X*Q(? - #@DVL3e,"ھ&EQ@Oj74JPRV^Wslf!9cІW,"!Nk,q -x6E(S}rCPx,&eYzZ'\E)Ɏ/A|/7D[8-$uV7G3Ny`S6+EXś7y$D{Ȕiq uGRXsP~gP^@T0PD-; - qGai)MGPH'6j\XTRT7v։v^"J&o3/v0ҺA]+ .`JMG%È1 l,a]] @Q+)ʰPc2g-yP#٥T/5v IAX͘&&.U(L1*&\_Vr!.h##W!THohZ~cF -?C1+n?Vw+c&-$k$ɫ-r![YVX%x%}J:R׈IXAW6ٙAt Il[oV -0t<b /vca^Z rB%-#$qoļE >FnPEtlHVN(PZDB݄\+.θ -J(+T@ EZXXػl PAt`[n`F.koM%]Cs̹+}tKl˳T;F.z``sܼ$2طܯPj ISmjWpjJo?rӑ,!}0Ix[NUUY U2iZlF4χbZa̯=a,~!7yɴ5>t%;.ѝ%֟K2h^sAՌuD $n^!Q C+c脑RcYJF܊u;' S2Uuw~P0tK% ^Dg yiUGxYRTsS3)Wz":up/̑STʈYiu3|X.& N'1D^)&g蔥~\()jM b 'l_"X>҆!:-GmAQjs:Q5q;GW+TE"vn_\Kjj]ƹ# nok >Km1C>jIxȢqkEi -(So 7qp._攕fW ׍ ;3P)]Yi[\ %>e# -%D"͢u t& YiZчPF5UL 3Yc}]Þ.}`84^eԣV!TL*Ti-JMG}_ gQr.RgqZQ%=.ܖ*Usnȏc+'qj +4(d f+c1EȁnFQ2VW 2D?1\b% -KW4cP4b/%(Uo)[].X{gU}e|cA%»tlՌCIg[-˶DPlu-6]8xLJ9/;ctң°=Pd]{KD0m˸#@xkJrJ㎣r-c3,'eإV)Ԭo5a)cyS_ʌ|ʢvX MJtǻʸ=ŷ._!`VD|+eJKuYƒsm Sg_0"Ŵ3P+5_|^BVg`TxGd9P%'@7*cO ֧cNS-~ݪH!^.L| -"30TƄLZyeq/a?2-xz Q7S^mr\\c|{Ga#4*#۶?B" {lK'f1CQ2';gi*[S%w /vMBSorP-ꪑ iX#ďLlt )wp -,Vcvq< (fb2qK=y?O &doJ( - {0 -QZv O%;Эimܯ3fCHW+(1|n 0B\2B!3qJ)YIXYFj#)!&l1pY -pb]i -3kY - 7EF~bT幩q&<Ƴ%_ V+Ÿ3Mʣ WVcH3L=R@Š N@Q;@E6B"VBK^ j{R./ ȯLu>gR_l%*'"4 -Z~P'ʛkyY |nk&#U.u τr2B2bw5olDas8~`6\_nZAʮĉPs_;eÌ.W%}`Y~bpJ.cA-BNR˒ lH8y%FZ2Bܡ2?Ă,P(\ ef Cݟ#4_!Ъ*Y<2OueT}YOL[#vJKk+M ]*VA"r0IfMͅegGIyl3 *d @nUtk,N%^:Z C^uܭ7:aËm nL ,pj eL~}຋}0x>_T$ZqY|d#tθequ֭QZDΒY_H,尘ƸIU.)=/I|jH ߶F`N}k$qWQQ~{\+rU.'˯K>EE2zŎ\ 7^ -8t8BXrYkmY/});fC35 BNBּLK%ō1 ez$R1qRGi*b*l o0y!Gjʱ]mNg"HR cZ=o0 `1mYZwaGe2 0,GYۈ_ŋ늆`-QS텈JETd&)$ծϿ1 -I3SpT +1<8aHg 'ۅ8P7Z%8[K9mD!'epYZf[o!RvHI6x升IAj,/?[o!]ǃ@Ɇҩxr2f\簀%' (Ұu` ]nX@*8.ѯ`KD6j>Ox(]W=pa2:S &XآtK]H`n`wTC*K'Wg}`#QmsI.[1Oqu-7xs+hX$9οYhؿ\T v33F]Ԕ E`T}Zs7Lf!` -E2J)ālPrD eRp5*=ԭ(ۈ#NqP>5;pԸG#<|/̬1ƿf<ܾ{9l.;a8.`X^ȃ]Γ~FpSV  |ތRhX1ܨm.WRylBFnt?3ܗ\+w+a:}bJؔ,K=@ -o-r\SB_|~VtzY `Sϙb[,JFw%*"15XZ=v.9`\W}ͶemoFNߘ?U]DUć3ݟ1 2ThJmذҜNB$VEl~j߸&_qƸMAB%tOvlV]r$ܲ3%)<~ɺﶌ¬ryc'Y{/Bb\nPcKy"bRTkգ#7*wr1QmX̾߇)e@WJ[w.؜%+iXS D,E\zm]q|3IO^KgH+*4.?Eo "G $* )P*gxf t4\-p/d[urc#TVK=+6LoT%,3hifEf*/i w}6}s0m1] `\h*ޡ,EjeRWR(WC~_Whx ^ A#y\ % ,_\Թ[x ؜^tĥ#u-LLw.G^Dm[]VDh4RT.PsxTx*e pG5esd,3.R(itk`MY%?)%K[+yTi~% -[YH+?ղ.2ı.< K4FBS-Snn#ΏbVxʓ`qh PzYK̹XzgDc\*`Bwʚh 񢶕׺{W @eMA(xhP-+"*bF@n+?ҪKHuȔ- fUQ76d&sJ~i ǖ -MO Q]*6#Ya{-JY04^S6ӖNhXOzimBYg?W:CLyxab̔fVqW:l%fgWC-¼1xbyǿʎrmH{u2Y h:qkl[ #_sĹle|0Rȝ$=* F< ץ$i811p1n=%Ft!|6m,FU7>ܧYw -#ѣJ`* (&cR( ٿ]4-<+Ikٽa1ia'r8rU`Lo|J;0J!}Cݼij-a*]$ƅa߉s/ .5E|3PAeeΡ bDyZĩ, mkŨ_? ?XCS -?OۯJQ8rV -Veþn*]*[Ҍ*zDNyJӺ|0aƩPeUA|,|ycB`Eڛ7*0u۱OxE9%9fao<Fj;)EH jھYft@2)0 y>c*0q)gܚkWv^9? r]j#l(zj_,Z0X];".(v{D!Ew`iF4J ~!Q۪EʏAʊL*uO@'}|hvqXN #cd1"[hԍ]q6<'io1YBKqXoH/H7t $uM2En0 TDl wm`*/a 6KaCx/0^*+v*M*U[lP[]JH>%cDBtb_ы=e?Jg]C_wQ1 pHZ6c(e o,qA.k0 FeL8Z_MEvz~,lK,/Q`FBoۢa]T0oj)<[猟E??ْ@ةlN_Ò%wB4xa^~bϘs-~+)|8,ࢊD__1^Kb?xD6gC@MW! Ml̄?^`d?ѹ/4%59qbCV&uK qu?)*!0rbP/d] 0CL [9j"OS=`uF;V,qOxg~,a)vCK%Aa5/ p¦Oa͕PCoqN `)IΥa/1Iyb65ܲCUJL hZ[;;3|Rq<7.5*}A|uvǵK4Bq>'rR  yUb£)@e?-cx|ϩbRR|{}ƻWt`t* <<\sUpW@mwB[.:q, qM뀭UhªEVUeķ̶7eܾ%Ku=р6e8R&( e \6?ѵ*G d[h%xk_-Tp{'ѕeGǍ1*#a|N) ~ddoe*(ӎۘGU*<+ |QP,Z1[Um*KXQB0ݥ] `UW9 T!b,HJ2 5W.m5G\#eܺq,--4)UB6W]4CG;FtJk{VxVܨlx.٩rXIC n;+ݧj>ʼPwB TU'R&:0; oRONK, *ѳ;թ[HdlUI[WO%_5/1em7ԼFʘé{j){NbB~.deLsqISj' T)BX,M9ڷ&Xr۟MYŠñBC0ef1_{0ҹykuvYٕ+*]{׎_`)q=bv߹ в()诂0o%>CR4L]W,y?] ShbM8nSy|$_ k2dv=K{䩉zVXF&ֵʁ6rb @Tّl}zlḛ#/5(T1 Vg` pZ#%hV`i 97iS(3);gCײ|e$U B(gh9H|_rq0ZZX8g4 -@GFF8_,\PVw -F+odŪmV'sGa 0~gj ߁Sᙨ3OF˕0ԸG/)VHؑ[r5Ҍ}|qR;F7*  -r,~bs~k^nۘ% ]FɛZxi)Yp\*j-裣NJmYKkg蟸$>hJ|+*0Y\g-SUc%z"^uK%Ħ2]`k1GۿM@.nKX֣hQ"P*H!CIڍD)plư! K['nSNM㤺ߐHF{!}Ii/b +Sa(Fĉ.>fe$2e< KQ=˾Voň"T%SzP0NGz-h/eټ*h{\&K*L-Glrp6U/*5[Uu j%B6~f_Ԇj[w <t2Rh(*הSEHϖ^|C3*=,AX#"1` u ĊBn0 -䩖*,5͝Cc>窩!̤/WWf]WEJy%.yYу,9&4|.P"׌ -"vBW&2DQul6Y8 mqQ,@ʘ%˗nQ*̧_ wPicLٝuFgl;.O\fU1zIY_F6Y0 -`r --ʴL2ri`5,%"Q4P%ݗ@ Y:˩ad 2 -@iwT ..= [0kiN"E gZ0% lli-_͡x!Jx 8Tz5N,K"[]61nRcVT[ij^x%%)~jSpo,U\\>Ta|mGE@/@5#:]M{hQH2tkԏ}VZl_Fl[fe LbEGRw`c`A߂e%*fcL8yƥ9.,Q - Q==XS6 - "[|vDn~TjtϲhiN*X&*- !4(?jG.vQUhh7:H*f]Ƶ>n8KeE -7r_q3c`YO2/x ]45MSWb$pwUv]=˺{;02mQ^Xk)M3kLWV 1OgnWVf{ -a2][*0e]@uh0Gsp -m:Z)kY'm*_ ]]v&ᘨqPy# hqa-Z -3]dBUlD1oqe‡E%޻c Vg4j}Y`F\,c5?g6<" n[ `aurjUBMm\0hEh%bWv>fMN; -RSd L<&n X=Vt}mO(gJb-j]5*z}N>e0 DvF^>xl5p\,QDGjqq -Dj찖Vs?̔uemi1юe)KAScŪLcHkB+;/qԩS$̷,LQzK]a[LA L}5F˼m_1[) Ʋ&q/.+˾Ya~.wI<ʜ@0 \CogRꏕp5zD֠+ғ-?-;@WE?,Mg}Ypj*_ܪ:R^5.]u$nZw n ( (lKD%WكطXs^&J=3lTJ7q上-fK/jϨyJ #M~nqJ\Γv/R|f"A;5i!Ɓ9#}Tß:*o,3x<ٰ!.,l:GTKBf&,"4CaWl3j\Y -ո?IkmQbLU,B0o@[P8J`6@-hHXWj>o,G+!Jâ R(dGJE?-{/KZ-Ro Hf^-5E\%9<ƳS7rE6 |Vas,x\"MiɈ-ͭˍQ~0$[t} LO#7qq"IWws[Rk".x)dĵ*Z˖T H.\HG@!ރ%@J`)Jz:e `o3@`_<]ؚp0<āZ< -e?)a2R< -V9nrAK;Gk I>\Cp%Y7ɛ*SZ T"˃n>NF* Gޠؑo'oD E(K8Wu+.3ԱG1[=YE^,0B,bp[+3G2襖Pj\2e)eTnxa:wȺ1?dgȄ}hng|*Q3?bN 7eGsqIWj#!xw;r Zpxj2)9⪙|*ڇ'Cj5\O%Pj @Kh5^ A'go] ;;U: -h>m&7Qb,< Uu{1{KVPqcЫF\'n-{[ >].3U|XMv/CΤr"C4 ͑bl/ab_mND?5K|Oy7 +,Ax{E[O&byKuX]Dzt21s^42XZ,J?:4(u>aڔNI7uB[_La`{L #_k}dP\1dq% Q31KܣvP0Euhnjy d)wԹG+J/fPfh B_!w:!]D\OR]+pܦ(+0.w0MJ!7Q(zu< Ճũe՘#1)͐fgR֋+GtyPZ+tq_,LJo!@Yg -/iꌡYTX}@E댶V̡鶟Gw ERSMۤI?A0[}j&oqg.w.(l+a4_r;,[j_. -8(MQZS_og%PJnT]Í熂e.UJYx%GCD09y˄] 2b$B Q s܈(wQV{G{7o}9f"h$ 2-_JJJnEL[(--V(|\#(W~&OLh}R+ wh? )) ɽC+ -F%[Uf"(yWW)t6k0jSA=Ku`AP5.-$ƪW5ψ ڪ%CjwDK88fSP`ÙEǢdvEMܸb ,rM| aݫHT?ŵ@ AY.d\VA1(M1/t0v"-]#싷%]Y" ƺu-Uh!$29Y_ҟ fPXYK.'1&&HZ9p~G W۫FR*P`&7Siw':y Stve`S9l¥(w*aosM̷\h qt o#--+ gx"))Ilk+LD2џ?˄8;Yu踩!xQs7T>^/4)nd.{ewIrvHKzWJՖJ= lOGkEj % .E2lITZv3*A R-m*f_T -|9I/<ƥ֢\\DCm-,3/}w3uE5OeC\N\Uf5qW@Bj$#: /4V(SYlTø5p nesph]IM,3Hld!vupJƺa p5-Z3H+ T3Z4wg;>Y;TC-i |(n=Jc`T(5bD#%N4vp`{_X5eBIz°*<9q5(z38LL5vm )Fx*xk,n;6&4">U~|0(Z -!ru4 m+-d337#zD!MDt 0hRr-RTTGXgxC5PF\8+T 6ۦԹpxgu FgLws21fAo-"֥NK7ܜ 1ʘP%9eBowLRjגedRzJ.!-@BwD~RW3Բ /P. 8|X6.PWU3zKwfaqrӺRz%7wf -W5 -)PF3J%5o'l^lyL- PW̚++CCaQt7wJ -7Zxu}J}\n&K'C}0*)nHzڮQى@I҄T|<>I_pBJ{-6j~A)b3oc 7+ > q)* |LebMQNQ X@Eƨ5.DLf@ʶruJ-8x[{$f2]}"j҄+Xfb/촽JZLڻa!:~uGyf-%"!Rּ({ILH -U#gBmf-z4K+C[64QCLe;!~`%BpL >)YvMڼ]Ҥ]N+o `2Ө?W3;C=, !KBٙph\ -KNZu`2.zbvpM -a"0}*2q$ -JƣUL>ͻY zQ`*U]F\%0[T`T/% _5잿,յStn.Gu;l6^_)W{"c_htESW[P.%TxA3 e`+\"M\ɶtS3q#vQB=*5Sp$UmbȼܪN/Bu5<5 -sLGfa}X*Pz1GUpf]ؽBqYG-\UJ3 -8OqL.ܯp`YE^X{/Q:F5UEd,I}N5 X b ]鵀Hc9JBP*Uk/6Z<BV3V @Mɖ)4xLg4~ށclFUs] ^mȔRϊ# D瞂L -ul#]le8ˆ T5?L(xɞ -eIJ -uP wYQe!6sQfxRpS$sh׋p ˳p~.Q̬ClW f.TOrlYU[&$xY{ -jRl'сL+@`] t#iQ"ѽ(!u2~25W_.Zw㺕-m*WQ& M{m#)]n +?p~MJ4Fv>x F|S+.Rv4]J\ZhjYB^$IeSB_Q[>o -Buzp5ꨲ|xD =Phgr+(;Σ~q*i䩥jKGFm&sE4O9Ƙ -2S<]zYH]’b"kUgN~=Q6Je [W>i[dv"\ ),-\ -QϹYK1xڰAx,0UPGXf!pQX0U - TŦXR{nfgoQ;0j\4Y).XJEaq]\J<[K/2Ug{4|DhWRʄc0foJ|1WKXH:YZFU?'Ke]^;ky cWcQc<-ĵqҧK^^Sg۞_x2 o?"XPO x&7yn=q\MAʫWB#"QK&_HUO8qsAik-qXh@bmhuKpWkR?#?%r 1qZ{6ϑLr/U>,=sKl)48U_s~&`iùLԫBh/H#Jϡ_lu]Q 5njXmXR^&lvԶR/-|18KvƐUDwrq02PKRԺ %{E22bfE.eScwGRߪk5U6j\Y.FXh?m穠Ś4Fzb -D%-E>4zuwD@`X-B] P":M ZjU K_^FKR[V^W,`UB c8ag~2izp~PJ2Mt+ڕ-O )۶w2(n06~-(~j:_F(|h5C[3P*EzU``g c7@;W%:S>a -4h{W?o54LD֥w -%;DžDuP;Ftab"]2QK]1IiݶesX 7l,"^(w*_uA.CۮZ@K28,ATc-@n\Ul[MJTc.0S|"TnaP5|p6C]f|:jiIK>IXw_ṋP2Zi]?=nb43R=?d>-Y4 OԃaO K&tOP'gXGNf}+LψKG8G2*RT-C*u)kJpruMB[HDFQE,do$-t%0j"qRU\JL%FƻVD]%꒔կl IB -1 > GIF}}MQu APXcM=;'nk~ -kЍ#&ӌ“>D; MJ6qo0.K{2̕#H3e?0%Fݤ< OV)l e4qRS˭Fϐރ`s? L@~\/ܻQ"PPZT. +)lgg"Зg.i}c47]lxT*ƥCZG ,^7\jtn"b4w"^͏H fRJ! -ͺڀ:HCS5nI@8 <ؠZB=U7MC}MX:Q LI@1'6z$2:5q:VĖ26h]pfoPO^-u d_USVS-6DDl[atTwPd^،q.qn=a\GS+$:29!T(|P.QCL0e_AƸ:g ,"Vu>IbRĭ3on>͔Cpj?G{1eH[[i<1^5DnD,i)LmUf5sqJ:P{Ck DSʵa님[R)a Et<3[ѨkmAXdPۺD^R/5V;ݰVmEcmNBZͭ G,1\lkdKz){"崽7 Q)-d*{:@Eg#d]T Lm8IRJ)+C̬ Xad}33eC}MTMQ[YǔR9w*T.\_$ʁ` -hc Tyq ]x'cyζa(*@lzZg*^v {Tv*'7ԊK4 UR+(ܸLIJ3W DZr2cFτcl -y_(GoIynezX[yqj(5uqy`Q-}4|"LoT /01 -ܿrȢb¯eDZG)@`!^@% ^LVZUe[UlliU!`G\Iw,,0K1{sJ |i)Tж5 *M% K^˞9,!+ - {k,!+3AlB9SGjkV]]\Z_0TpHĐlv -C -#.vY㠂AÐ 4d+,4Ae[< -7҉R$DDNĦz&%T5`"WP:X%ttuy2 -@)p:jQLqJ$. x1Oc_R*_I=ޅ5o([X<ES+ Ȼkn#8P*4GdP ~Zn0҂>F~-;s8"!X3Z2i!B;#iU*\ m -9.*nxB;2 [C2-J&%V iԹaG3Z -J[ Fl1p%⇹^%Jb\/3Kx`NRԮhkԥ?7j0v>I1ɤb_~m~ 1H?,b w\>0\d#c#zeTbs$%;!-$o(ȪF1)ef wRx'W,TDTT -ⒽCXm>Fmgn$~UK*8 4wCcxpTsek3QHYEA -@s(ٴ&[|hB-hI҉ͳ\P3BϒˍF {la f8jC/a[\OH}Irz;9?D3UD_e0s n_j0a 2ȵù\s9T)ӆB'1@~I䅕f#ٜAgr6оkRʰ>X|WglHԉ;bPXCB5ܲXRr;j.J6H[X7Gݪ;*.3GO] qV#, -] Ymc=p< G{ |*` VY]\g1n+ )- !fJE}v bJ <Ա{дV)Mp/~[H렕~ۄ3%h뎥7*卲P_x[g̍ ; )F(l"D -hr˕)Cc޽3P0 -cEc'>d$:(ry*I0T  rI wY^XH!ddn6\o^z ,oԩsulr_Gsb,Q#/m`j_Vu7E^&IEpaHVf/Y Y9w"2rRh$G7kˠWsb(Ct+YhrٸM׃ = nں)3HZI}$r^kYa醐 :͕nHbE2Fd*ҀWYFiJ"ݑS\X"fڗ~ % -É}尓VJ.Y*M[{|Y'[x3+qiVH3'o523E 1:4RZIMGːV: \@PRfSbtR4͐rܷukܠs_@."B_]j(pZ䌧r0H3\KRaѤi ] ]Eu-ԮQ(.ֽK\#\L% aO@Jq\-/5#@mAj-m -G8{mW@ sw{|Mp|0f oj/h2(L8jy"J+w1Y$-K]|c}k`gSHA{pVw*2QlF2Bb(v@QH*am-;%F=8Ysg -CfZsmtJNgaJ/Tj-MbaVĩ,$P@p2;jc]V\?_P̩q/Lhǟ5}K"+vFnC[51zBFKƁNš3R[MJɪJEl1D Rՙ |=޶}Eh n8ה2m yKj#j+u"t=٫ER\U07>!-!m[ksdh PMKp&&(u~Ir> 2b3Cf$PƵ n[EpG#n.xflm:/(yeq`Vd.T\yvtUf9i V`r8Z後_tw -# B_(VmLaY\~eTgUFK]P%E:9e~f/fڬ?QvTc4n-ʭœ}USU+-JUekVv^-!#96x-CV+Ļ3 tX;R7l f +$NL-Ʉ -=p0״|EB7p%vR*Wb_G}o\6 )r^ 3˚SmA5lcG} :f=+ظf;sHak -4͐WcXBSd#-ijy-'X$K66]? X}m^f%m}vҟ4lB댫}Sh,MډMi4:\KT7Et%I ,OQM6)RN޻KmȲRLJMX-Ԩ nQnh7e %@u*7nd7 -n rOM Y%k1W//ˍBL}ˊ}}D] v!sIr>YKwuB)n^6&"S5Rڸ)/ͳ(?:Qi_:E"7S~b8[ ӣh) IQ.))YFB\IirĔQ80/arIr*$|K4x%3^ԤE/JAX縲¨e87%\^F .3[.Y4_ᔔhyj,+QZ"E AHL+Rϐ C\LgFZiOs7C>GX'5:ͬ=e)A>Px"Ij.? ̾T:>yw- .*tv!idm q ݳwb0K2 sHgbЗi噍8y6]UD4VV"EˍG9ٸwPL;`ED`]jjXT=e}Ȣկl#)/OSVU{V\lf⛙Ŝ"UCvp*[[(nvwzvKn@h KtP )_ĕqLt[ADeokE$}"3`*\ Yb0"t?J[D~b,jpxHjkLG[!(X}AT7DO_0wfT&}B2VݦHP'/05B3 UnxtFFE`-X,e'k+զO3R?u+Yӛ=X(RV$ oq R Q Gjʀ!E%K?l#_2S 醺+3P)s>Cfyt~0/pF視_D=ۨ7yiu2 . sѕ9F`\e!nY;]*M[hïY"~+(N?0IT"kw 8^@ -ї!DVc9}*!~PUEiB 5)Ng{<7-v|USֈ4Y4 &P 7<2喁hH%kw8acfc ldZ]WuE;@%(d{9~Hm.vawHs|KIqo( ӵcFj٦_0CTɈGn/!v6zjQ<ԴVV0%}wݸOXcWU}EdekB -r&*u)Y@1+W g NBvsM'Vjʗ]K-T+YpDMe闡;U֡AD1 - +XD+A]1 U -4JURJ|i31SJMlZ~-&'^2ZwC/ z10Yg *zN8HJus54w7|ukuk?Q)¬R}il(w3ϲɺ㧋eܻf[*\vwP|+/DkҎsA/EHɥSIG&JH_[sփ+P4]WA-"J-]@1}ˉ5| WQ -qkB!oN")#1#xX[/̳S%/2%MI+kREVYR*,˸wưA3oi<̲LP2lsUyjw j7)1KB#5,:Ġ2A0~ Cg q0X -RH # jI+螠 * OKm`(\@tN…_Q~) -m~r0X )vQ̮Γ膬 >A-6 ffj-FbD.Rv-.^Ϣ/ -ڥ=T)E 5Xf!vXoU6ZbH̍G`Ke&Oh,KՃj$VP[4bZCpXb0L헬T[ʨ%#ܴCme{.ft1 K -Pw.P&S*1TTV-ogaF*b,>pԷOſ!"[ R!.h^XÛ|Z*1{He=(̿xp}jL^0Cx{l{"^=AfvaQKYd)w:JHʛHvrCdbOjj7g6~ GxAMD~`Dks-IVwxLE@KEﴓpHb:e=Y״flڑv<--QTX掾ScږaHƵ I0 -Uп2!D*À/TՑC)G0νYƣm BB:7;T5&!haH,?2l54_h07ln \JZx..Xu)2f^hqd bQ) % aw.#4kϭ7Q=ql3PUς .*VC6հU8H]IA[yE@cN!l#=^x>KBrPW 5_qt~>_jwiH!E0:l*lHqP%r$ VQeb2VY*U}Jn*xeQۃo=c;J{epRb$:"UQߩ֠-8bܨĕmN.JngY^eקDTPQP^TesL;koyaymFDSi]b c:3.B+7p/ -n.BE;q_$-2 R9#,v*-Gh}.[/j e<3ef1eYPUphsQUj+/Tw)ẗp<$!jp, M`;ig{'Y^0E1R֭=K (рpۣ%;OƊAdcMxc{zNW q[t\YE|p)~ԗ<} iUdoXڱqE >EtDe|+?R[t&쑭_\v3{;Wu ~$f}?RPPX (`m̲S5JbwJ>YP. 튂p>*!-!\j Ws& ) 04լ=Sp+OWjMD,RVX"Ez豖a?VAQ5)J~pWݷY ¶՛dn|B菬ЃHSV(;bd=Ф%!#zbdo --!MZ)HlkadfǞջj\1& -_&,mP2HB+A| nnXAA:(,4Ia~hZ;pgCG]w -ыrEj%8-pR`0c]ڰIGΐ_W9\ȵy^us&Q%JzTj.[ȷ Srv1ݲb-h% -jjAƼa Mԯk\^8gX86qC T$Eiw}Mj|Eiq/Qp6Ã4];t? A7 x^% -yKԬJ3 W-Ki/ w2*-# -kbgmkuI DsxR$0ͣ?JRR[ɩEʶ>L-(9IJ7]k`8>HgD_ҭpgkQi?X 'EԂy%+aK f~ En{#(HaaR$ZN}!,5HK *E)8)2JQ&"[:QEtMV_hnl@Y6JX}. T.ԺnTGDX("HH[xwdW&W ,D_#J6xÈբ`q9\24I!wѠbj.hU1C/?eW0_K1H]2S5aUElU*`DY+A`)K-UhёPOg X!(էZ51( R/ozgI؅5Zhu¦ g ~Vf`l镂ȝ-Y٨Dqwh6mB7w`U0Zti,ɧ}`B4MueR#:ω56B>$彨q4VdQfT"K̽e\H7tTLWԲQ*;%T Lp^ Ip̤c|+N4Uڭupsn\aKO n ނjq(;KmCScܨ[Hj 1 T%D @SخciޕU ^^x>%蹬vŨL\[/\d &kZI-8 <g<Xao-RUAKP?K19yہ+(o3;%áry_p%4Ŕ<jYUK9o~j6$e sTTLA:bdSsQQ,7M/"gBDԑȯoܟaX 7xO c-^-D=uP\qU:m7䉰ڞ[X<M0mR{˙L;E+gZ=B2|li~xQ(ݟM:cGH@R3R--;colqpkVOGĻɯnWnGH$!0PIkeC7[ɬ{wD^~P/ꆪE<;@ -MJ -&YG6%J9;ٍRHpˎfernkdY%N pb FfQP\k@6+Z=u"G\e7* mPSZ3ih;hޣV`B8u380ɟ3w ܵmV.ȦvBeg#.O hȒ ~tDԸz+sG+ɭ`@Uͤjg+'Do|pi&. -H utP[@PRd6|o -^% +J# rs829cQB*CJ1I29\a -_b VEq! -7,y ԾS9n%`i,ݑߞ72b֕-܆vh ^ψyP,nRTګӣd`KSHƱ0ę&f! ׷iov̕IMDe3| -GG»NaR֖QuWczkRe:E 1ҡDY?pNjw - m Q+77@+a srp^!!\3-cOu2*Tx))jU`r -/|ꐿww7}WJˇDCsWCK\[U_ +V[|DnEB K ]^]S\vp;Uaf0E$US\7J2+a,Cq~l͓#,)7q+z*]u 9&(#C -΢%3PUJ1W}_YF'E{ -Ju5*)bWCN3' X>Y$]'1_Hq+}y*˜Av *Y0kD. -Kj-?Əi A.U p`!1~5(Q%gC3S3V}0@*b.ǭE1.Yx̬J%pYII躌X|ItɌ|4n m(fc7XF\BU-:MWszR:1-ޠb""FßDT }BBc{NS; R -WAaX)x_#7q'uԣVz2ϒ !Bvl\LV, o0O}ﮯ }\fif;Ʌ]j>eY]9][h|\exaeQ+*z7bTśolX%J/y_w\_fW'bJP%wc09 f&DǼ?䡻NtUw[.tLe#XLmVƈ -PF۹JUpMxF -u}02(G4%#.a'7oMRX7Ae*[2 -WlE-B*RlǶb:wjD -QV m0qcõeCcWQ:!1ʸT_{K^"Y6@ }Qa -Gf"[f4+UT&5:%5Il -FCHXo5(3[c|Z.5dl`FЉŨlߘu|^'1- ^:PtCtj!(mkHg舆bVd[Us,6ҹK>Ƀ}af E/Q&f<|݆Vhf*Գ9cY% -lk{7)C1[ugb,Q+ jO wt5|q"uQwѨ0U §V& -w;eq @%N.>ĩRą-#+!aymr奀'ZWb#%?1Tsj/`MUj5*_@LkuZ 7(o} H@C0\{Z0+SG@,R WMj-HzߺRis/a#ȋ5Mv>ƅ"uShJ宙_s/kB\\qrܨ˖ECEQkCl -#0JL $34U1)xZ;+hX}cmᵘZfnYxHGYXÌrS9{P 0(n@v Ҡ} ݽX6̺f#՝Gk30FQ f!D]>||,l)xo=vEqw,&;"R\lN#UvVD^wvBluc:)Q0Hӏj*f4 )vPg.|O&4@i1Լٜ)bb<h%*궻nQ ̊nFcJR7Ӣ,xWn:@Y?L%RUZ~*lGaS~Fi#J֟wxQŽ ewƭK j#PG4)>VM O?chldmp'`.`{l:FA^_̽AYP̮Z?W :!^)|"q+ճGD#~lAx֍Ś/r]ƈ'zđs/@@n[*[F[vRC;B\htc}> s"ۤkDE-!TNJ\=RFU887&:x -Hg(Ԭ.dCQMA]BȻ8x -h$5.u?<a~ưe?T\$LŘF;R)2\%ks>ef~Lqs lV7f{dwDe[A(ap8j~*G>,`}V )Y[.&JYqBWC&?*n Ӹ|ąp_@.⑖bjXp1t䎅1:/K!7`ú+B{#Չ®IU pܺ -8n1^.STƮT)?.w?>$F=o{ɂڔPb?s5#7; dI~]bf<WQ躁Q5< Mn',7?=Tke@tI|T ]&,/:әX:upTCOx=Ih5 V g|ü$ݢeV ޡGlQ`#ߗ>B#+V_uE2ˋ-g6zC*ԡnz/LoOChM̼km8e_ 3,{P3,Tu -{L{>act|XgץnQn Tj_L7qecVؤ3],5 :b]!b^T8h.n_/Th4a. E*>M ځ+%-5/ y?˦}x⥚{,~wk]EiEFǤS(#ҝbĦi3TB7 (jbK)#PeG͘xu*6zPhe(҆v@WĮW4ĥK\Mg cA*0YԪ{"4f|`@x,aDdٕrQV0 -U}pc%1Wfרt"jW PLUaH)X vP%P01aS ~>?l?.؇bamCh+&xGԋ"c -eSr -u7(gZjV5eg6lwңA8սGu|FeѷK0+Hj&V)*egs\ SP Pc[:X!u]jZԶU_=)baz4rޛZ+DF <RSމ^-G"?O<킉_1f pm!S$RǏe>8\*jSd}Lc)0KvZ6D~M%vWDEMiK*V!/8W;ٖ҈ .aeg̸,7 T.׫IT|ܶ:suď )~4%)Mt>JY - U3 0v(>L w|fԲeXi\|JqRsyrx,;Q7(\aJ -1 G~,ynZk/Qx&/**Kơ蕙sM2[AYsZaB7> b${2F̏ *1Hiecsl|`_j9(mh:.<渻€ /rj '[$RvR!X^i] -JIVP1c>Z3Du?#g/$9}4.gky,7 ڄLl$+xIEǡ FZ{ -1Z@PVز j 5v",Ow ~rȡuZKJje%rX \*;0{v\C^qau`!4\]]F P笿2kPPޫ -H#e-oRǎp[ -%v --Gٌd/k&-PiW L*bkHtQ൤<~U  UB3V3g 8mk/%_!b -*pڴ2UkMP%~ [L PD5G[J F݀Ty֚6OnJ;*DgxDm'oA}b0hhՈiKBVxg,j sP(wLpqy*X%F͐%b+Rr.\Q.TRbֶr>:5KmƢz~˹[׍Z>~M}!K̹D^ȒWK|T<).Ac5sPu͗tYuІ VۖIcȰ*C^a.S3TEj^#Lc/.ڶShy%r3k*P_`xHtr:I[ȥ{1R%bGBX/^v.1x^r %͑N|@Qdme4V f..Eu.-3R%a 61KwFH+!`1׋J!|@Vd=T1#~#J)KCm.TH\n-COA'LΥowm\ &s[sD*1fwRTcN*>akؑ Nܒ]_u?l2zDV[W#赝zNq -oAp`wgp_jo2fɜj~Z@;榃uCJ -6Cg{z6m6`T@kC -L(_2 mF>wEYP#bNS"gCRX$v֭GCH`kq~`Sis+-iJ'jjfP31[k aC:%pdĺƥf ;@lJ\ 0l؎ZF-= ꣮d z5\Cp˵3:w4P?,F6Z ?'Gr{KXw)sh87T sU+{4Kaf%a -fB(_P$0=FW2+tkIM nru -* 1d(B |$OMl+W~|Շ -8֞uib &2uъ?`d jG/MCϝl?sEWq_&W!97\+ʃB_17T_&]WR@*|`2Nn]up|K\JtJIRDd,tU๺dzK XD0H<)D{FMl`𚛉*r3§L"ĝj]JTMĨL^c;檖[ ~ϚܢK)rtˉ؍eEV9艶āW -Dek<at,WP8u? S"rܦ2]-8|&uᎧp-mn/ k̾FVw\-_Amenhqc5muQ/o$Dmr}`I]@)\qD\*RNF%_V‘HueJ;~j! -]킭jJS6^d#eY2rf$XGqt}BK"JU15c=xp7b>CnIw޷i%k]@ *[e_Mmkl T-Q}3itJ/Xh|NS*Y?L!a_j6e8Q`,)u%QvS7BE 5 L}E0 -Bqj̐GVɸR4(]Kyhu>0ehJ%v7,T6t_O{-o+XKަ 4uYDZU>ȤU|on"[lwܝO!#t/BR0;?V5dVX->z85Zk޷UvڧQ[: -_p=tkö;5<+c{pp_M}#0/"\?Z:4DH_ETo0*}iV3L 69k}"W`09 Fq/A_'O +NP Q!hwdcd9֢K"Qc*4B T ;#Gtifٯ.˪br+),Y$PSϰ&fs7(rOFSE/0EQ| @Q,ƉM!T籰 26M6*LT@u*CtEėH,峲6K¼(&\/Y)w])2,{ ]ƱD`.zŔǺ'ΡPD rKC2U$q\!o)DE1HjEY(HJVA $t~x,a)?(UVUΖk7 շҺ-%MT,]#Jm'?ҍf߅?.FC lsT'Y| K|+cSE*"l~fy:=Ł{+CۍR,yMLgRĉbD6:Xg'OȰvs,|-+exQƣ5șGKn b!G 3.7p\qi%d E55{ynX'K^Ʈ 3nCXQsa"LZ]2K;~p07WK LF!u!BQ*?C\-b]_ -b;xajKБ; =ia4  vҘ/1&(+d4qhPD -z4QJl< &XZNEP.&fՖO"꩙"D:1tMGS 5|]LGq0D*018[j%\ 0Ж׀+/LTkNoZ-hEڎk^ Es::l!;h1nɵx:{''#1VHv0(`&b -tuuwTmQ]"BZZ*5&%UYl>YS_I8HuWB-pM*o 2*s`8-:t>F*5>[x!v2}h efbH4u:%UV! - v1[LP] w>B[n;j&=#[S .Չ.Y}Y"֩ؖɻR=d>-Z/QrD;tQy8;7E4yXڱư ,U>0Ȩ&&d[Tw Dko ,9+Y!Am-@UR"-Q E'fnYO  `qƇRUmr7TU 2 DK(BzF3ۿi Eml;Lzbl2p YְDUr0/U^OŒI(j֒OZ 2õ*F}ا@ jY}u rZC~$X&ݖOnq!L¤* C1bCs8YT[؇}ܳ5گ@GUS7ODO&CCqEe,jH)7-TS9X\B_u_reUL8@He_A%t[qrv_5 Ŭ D/<]Gw T^2EZ1 -p懊{⸮MJ -B_I:eUpԼK)f8&͓_1h츶PgNQ^DW )m¥]Q}c4}ѐz!QCt%Ll A~{)O7Z'CGea ?断'p=j#{)o-{Tf:N&jC,x왌4;Lx"0|IL`+i1s;1Y-&#c\-Kx~_ -$5o⬖OE/ф:9ZWzPJ%:Ĥ1Ql % `eT- SJ&P/o(ZP - `^_)miJemgp 9Pj\ns8?,/<8i_!@-yf@7wŜ 4\xQsD*$cn85Ig5Ga ^KG>ڵZS+Ei7n+v,X/X*kq A -.[n8.x$Ln%Կ2\%n ܶnuLUH&b$ŰcƵy.)Ӆ# 7EOY[ƔnP o -_^_>)c(%kJ+*$LŮ i7`Z#s7eT* e*I-qQfSLȷ.bb]L #Qn~1lxh  0mՌMfl# ^DS|08vkBXF[o@Pf;%:$^-X~1dzkGG0/FX5zF9iؒz{iIND[Y49%LWP4ʰ.%sQQ)_%>{8|Z[/I map1[ZJ \k> -FQD &,P?¥nJ1}_;_\]$}.)^‚F?2GG+ sLljM,Ԩ12{X J|N̴ۡQA?:2w ٳ6%%-c=?A6ǴJIKpzd6U-Xw{F4j8%mH]CWt}KɨQnvv.(C@vġjlCP[QV5./nthlrX wITXc|B`] Ru^'Kcg~7p`Ah}veUn);& Fy$uIP+ Nˌ,..(#T1@ů~ N]AlNsqA~cfL%!0iǧFSN˸ҫuE@D|z]U@կcB=m12bj8"{)TYBT4lhxHnELtR]ѳcD|G/ ڨ.>%ԵfNT$%Z\֣F{,!^e<:%Աuė-H0s.Ӕ m3r7Q%y[qeU 厝J]TnnYKRqe#[/%/X]+YQU4Yb~_}>TY35׆3ӻ SǞ$Yҿc]#BdL" D -RnUULJ[:4qRhU g̩SCJe.%w"j͆ͻG*m($Ys&U\/LS5|+ԡ#p=R6=J04k{'ffeuurTw7vZ! -x+f0T6?LKBdoIq+:CC+ȩPhTkr*⺖Ti$4RM#ԦYpv2s86ʞ"D; -tGo\u U%f)*BSKp-[1u-E*\x('R G&j W嘵p+$|cĀϑ -ǽef -۩kQ]UfԸƺ0*\<ʼnd6Xa!z3LUJoeu5FҐ2/0DGp~ GS@cWעdHfiAHtje1ij.=J*RaDaq P`#aulz`a -x kaZT*fSFr[+SPD\:γ.^crbhE`ʿ64Ȕ^t.5Q?M=°'" asqOVj<# U˞3&wSrxEQ;pjªmWV71m]KH|#&S)5e{݄ rs}+1U6JSQ:q=Mb7X_G%|D'eƛH/pUZ%Ļ#UpT}1IVzpOwf0q`Ԭ3X$AEv,y]lyNⳛV.=jPV0@h8a5vO{0mR[¥IEIP c ڼnwoS41$}HX%"B"3EBKhX\l9Dcl  WU6 Ģ>H C׿Y"fꋕ,e6kzTHӗ[F*mlNi+B !L%zT:n$ hȢK |+qeqy`7W xJ+B.ڕ^6jSkXd].| C&`u;QZ2~HKRe^&a_.7E%)mt>l-ߕcft170Lj_<{m|jfSܩE\5ÍTwSU7u7edԭ蚋.]ƪf.=I 2'Ff3(^җ = C\SG -GEL5!bq** *DdD -EMyY3#"SPeeeARcouEczV 7I|b+6lUϠKtǺzF__d12|QD: BVPbJҺ4Rc2bP6S,'cU/BWh3Ԩy m8/JYc4U`4Sb|Lx\mNKKy\/bl׈@Կi4OVQ=D~UfHLK#t;5uی(m`XtQ=\(: ǂM C,?6(9bM!Kete1/VJm39D\:ǏlŴNӺFjZ~ENHqԗT-;PQiV| `JX¬Z!a%6F'1 4W -9 jݜ jdX[Z.8*wPt}ȣ?Gl -B@,~slNgp>qo0]K; SK0*o+RQsq)y(50sbc5p2!]{JcRUT4|rU;7?C`GOE(YR(Ќd? t`&+Fy`Dϫ;“2Tu{"IvWF.TЀ+k-3|( Y<qE 5Әa!Թn"X?1|rۓӕ gqmjt(04=/(vC6K;3Q)'a%HG;>!=N -t^ r"rƛ$Ƕ=APxΆmg?Qp=gLGDbVzFxlY GTWֱ57sew -|Ƹ M%u {RۨĨB`cg숔W&u]H}?A".vѫawS+s8.ul f/)bgu7Hp -g7Mot.62 BHZt6Sh`MvnBPHAfhgx7~#EQ]7 UCdʮ8S-|\"([ B֯h*[Tehܨz,c%PL m0<4ne0 B$7*%q<1+(Z&"xLiek+7)ny0̾T# -b{rS2/lR0HBR7`]Wܾ9fr|Lஞ-̣>eˢ,Bo'oP8 &EӮw7,uSRHG+X6@~,Y*Ɇ{YpA-hC GTEdP5 %םVTh~'&j% pbK},K -5:`2 Ԟ 2\YSEKE -Tob'6]gA`D_C$_%?B΅m$EIy -0#8(N -*QQ%bUrC/ԩT\7o &w ~;(i׹j Xv -?(IM7/EOrR¡.l2QWi͘ڡi$ls⽑ -2PbxK`e˔ql)3Cf\B2S_qH, ^*(?㗘%*?d{0@1mMu8&"N 5>aӳSVłOp۸+ʪ^&{嘶0n3bN]-"]K246%e; ,H0U"ElX1_qڮ-l(Ɉ}~GPndT-\bSr0/G s znSsAPR.4Pۚ|Q<ײA:aːa 09.-_2z=@Q-{U a4_ KE]M(u`N+wZ/W3>0jOv*˔BUc.e%Vr0;(ypFF%]%ԲTƢ¼pUq1, _T e%G@F.3r[0$ {n]\NI|.ek&~Y6{K+RQpVQ#e7~_bP#;Kj R\j.rKҟU$m:KRfus6ƻ1JD =OP˕T/1.1$W^vP"1b1ln=ʯ!HQ3*/6]ℱUP݄/CKIbTXI#A-hH) -VQ, ˀ-kv4kDC -] GUǥ~{|U1{-;X nI}J zn+ω|`o`}Y\WmB%xW+EVJ]Fu gLa(:IvΡ>Le|Z pJqsֵB:|\[䕝57, ֿK׺k|f7i"n*S``}2M2`U㻄haL -yjʼsL*j啧1Pp/M~P QP.+0-@ma4_*h'@XWZ<٪t4C/ZQ+5m~ją+6垟r^h2Kpo[̅"X60P>ph0 K. ""0|Kj,!7?Fqek v4'&2Rc -4bHeI#}_qBTK(U^EQajv -ܞ(Vy~Al9~ϷV.P*7VeBgCIYR!Q[V+S -G͵݋SW4rg7jT&0K@7)Q;t n`{,uZ]C,40,Ŗb* ܨF)Y狭b;Ġ|3KP~N ê]R:.__>b,=gˇVUx.%8b*o44>qLT&jj))U}KV_FT)6{&y+-C]**x -LRNvjk-b`ci -# XO#h[eH8q^g-ԔX_GZ -2 &z)SQ% -EXoD6|6$mծ[ط-JE:33XL5rZC!l U aDIbiUGo.{5D"+u4$ s5eW -]ʁ -A"5SXBSlضich$U eT\s 1|]DP8k,2̀SqU6 jfW:/5 -3G$F -uKYTr{`1%R3|T]SR?&&x c8#}N/5{ݒ(F%vxb@nel(M#)컠S9[R//5H,p]tK&*[DF*5 -R-}wtKjXPGj+4rp`7c)Ei6828|Cmzj5X,%Jx'W pm^*0GP`bj=q Cv2C_8j0OW=2_/"L e2pQm$c-n8Vї+"98v1طa89k~^-~eMUfLi!WU?uc1l-V(?C)>'wrP%H{e 32RYd⡫" VKh\ė+,%F1%T+tJ n'f F7:B*̝C=1 m֦ ]0cURk/ @6P1`DpuZNĪD! -E\u5;kP#7*a5|2ʞNM#\AotbO^i!F_qp%T,ጹiS<]: -NQ]F?$?j6:BbAƒ.Jk>zFݱ3ZzcYy S՚K_D~f,ȘUՆ,GPXE"i[UĘ41``U;ȑ;yjdjҡ,*&ZÀ-e(=` j)[u䴯6C$q&Y9] n#ۘ(Aev;nGMʪW1Q:[USw@&LycִTN.)ڸj>*5'e`* Y@|NZvz'Jnwh>00 KgzS_QVn}ϲSMÊ̹}MU4%d,XfbFU"_ar*; Җ1\A2FkYz8@;G̸mnQ2Y~+B@7S){!mVj^6 e"՟M\]ib1#Z iW(U.~aҷԭ+Ci1C>xic1d+Ŕׯ/V~1XZU/)ȁYeq}i!As` -[ZO -醙LN{%V(qBAo}4GNĻf ԥP9ѥ?mbCoU03a г,~T9vL9d]:%ip/`F( -R{;cU wzR "ή2_rWbA}F\ -A5BLQ/_@ČOv d Ǹ^"ΦIݱch5v;xL?&>56y2T"A5J:;cާA6EȨ6A Z KIg20pKIJ>%`wnTUVKJ.D(hA]KCZ.RAtG^~uծ=|LdI&f)mSn!aܮßo .u.7QCl3cFø1j,rq\l*&bBW%W/¦e%Q%qSS4,Lt -FT{#َ2b]vmor@"ȫW: X''pB5uU8\74"߶6!zKZU|JÅJډ/)[.xsPG|_ .-F}pax&cQ)lJXwPb/5+ 1*U<۹}~F&^c^0$&3#}j{mFMY -FވuޠR$n>IUAwXR~Jc\ܻvmv U|,.Nql<ľtWKBĉD K͏Kn7L` !J],A %.YT - e%}=T<\BڐUR5 -p^X,nϹxTdmLQJoܝz{ QMm8qsARܞܱ0[)\UjTڋn!sjUDOxBj\.[,uj6XZ:uv+utMERq7t5XuIXTjE<ӯv ^k+#Lvփ)^j-WV%eVAr (UW=quIk仵﹚Y\ pV %@dd]b%/I66v,0k{HyU}AzUkQJ[YڃieW t>:p{[}]c1^ -v`kWB %6U |ͪ{Zћ";OXy U%NAsjhUvK>>cD {r -Q|ƙF| M1Tˤ{KhK<ս P/ʭitpB/j% ¶Z^?t=qoNbF/uBnKXY{"k5pa>ݙ7]+z`@Wd2N SmS0=c_(i*iDPKTE>! {wR<.;yj oki.RʄhK)h{G@M[Bk/uY -ص%Vt.SjV=3ʱ4ui,2-+ڂXJBKS.Z,!Z|! 0f#u[]A]q9~Y'f3Jt<B .u5RB`XD[Y ܀qE&^<3%[_P!B&k-]0DdzhtP/0oV -"Va qFmD퍢~eͱZY#<y .Skj@eM0S9~"0%AGMav^٘^Xu{`mP ^e=Ю,$g,c+ٲljap`-Cicv#U# z*YCm&D>:q*i9z,5AWM'2;pG6 m P-}g 7ѕzؾբ hGEpʚTbjUT8|!Q7QHbnP5oQizͣ=be#:/⦳Ӫjm'ÿR:~pmK+o:R+k hT؂ T6`%8Vĕ-΃ՌJjFQ7Pe]'W5]y(ZL\nf4[_'tU*!y"MAL;n3 ->45t ~d@G'T[J'm]HbPT{T!o&,u)Y_.! QچL,x@RS#.aA-ڠ`ʴ,kӭz_i~AVc܌XHo,\ބ-G'#@bٲ'{jZ͍r|ڗ-Ae.lN@VWIQ4ԥG#OS5TLAaUSJ *M}uӅOLGlJ};[6pН63| 1˟2eT$cT*Pe#F`Չ) 8r09RTUsU ]m -o8ǝEdz?CP((yY.bʉP̨NNT8V\8nܫ5-j'MNcS)}qS+ƇI@;t[1wSC$#_A>xkE3oR2W/@FKN`o>.}dL1Y+2lJ.Wsm-eW>\)%~qA)vJj0I5. bʞlRGAC+3_3.\Ե,D*Z< m/<0Ca'HLS)6U~;VKl #-\]|n-X v"(vy0WT>w%S]S+B op6.HQAw۟آב9PE0n諉& \TmmQ -5PXt*Nf3>E[nu-55beu^un5dJe6X\0.V`ɼPa ~eBg4.t5mDRk9ӳi! XdG(6;Ԡ86Q1/>q7VD%ѦYڑ{+52TlV`R5)o3=\=S40m(ݣړXTR.)e̊0/_ɐf KlE"\~>nMp<~)^E{+iiaG,Vп/jFg}7ݟ}k/#",uD3@kbJa!OFQLe; ^["7*5Y?^hԗI677jXQng?CG vhZs20ۂ&䦫NI&L&*wںd &j }Z/T|qb" UHPفBn -^@+H-?p?2cZ+eCWfatD\~Z’K-σD+]%Bv$Gn@W Pň(MY۴fc&.WEe0 ,g`(@JטO6^(s0dR*@baD.^ `rK|f!\cCxe^rG'Co!FjYBQ -%(eQT!w3W+rī/|7w/-EX{>Sؤ~ D'MQ#c##T>;&-ޡiS`GwΜں2ݺi `V!UD!s ֿe.]3rOS73 2L]J-L̬Øtod*OaS#]t5}A -L_u4UW2#i20tw<26P*j H}r"ISLh{1!~e\YeVn_jFF8̵q M堪B(\R0H4.ZDΐ -}2#v?)eb$fUFTRڎ>0 -})VcjjzigN'3c, - b3>v肎P_P@=qs,F0j^vd(mXREeuc;e GR\EBaaڸy⦄~ ,*A5SA6*Ҵ{QbA[Vuࠛo,ٗJB .$+~dU5lt3j27Rm_QnՇ4*pRkEc1|'Lۗ0! --(PBWE -ϦaY+'$пP>H-TPcܤʫs|u'D×|QE@E)8X3?yEB7c>ޟ!޼eiU0*,S-3{!nSur y:5߹J'uԶ^ -l01Yn/DorDbo;p![./N(=Coe -`DMF=7N]UO[F\n.mAtp bU`?1*rC &+ٹqlWQ:L!sU*R8#~"4tMN^hU~N~+rZ\GuMFTQ֥l2|5a}(AfPE{(VbD57sl #8w&Yn; ܤyfpFr\Q|ܮQD(vxW|$. -*VLICwWYីHb7G 1YU.\r a u76 X0ߨQ$[2tJ#3UWaR+PmCc$:c rI'-wEQ"PKʼn -2ڪFRsUDO먓4`הusT΅bcVo!Wc"R.l^eu}Y;?^A+mꊊ6!?ǢcM`We/HleO&hZ}DA}u,E1{&n6V&!UEJȵXw+ٿmBu۱FJ'j8a-[UjYD?*e=@_?ԣߨmw8eY򄔔Fv7kV\A"S l([u2 -eB4K3,뵺TYj0_ A^ -(Ձ<2kim\RS[%.]yUk]k if$'w *D0{d0fP꭪hqD'{5x!Ȯ1>n~ I'T?"r?eH%+bCl gan]Į]p"W 𒹹dO<U^$=D >-ڈ!t9JP+PY^r@?UBS0;$%fgp1kULJ\.1jxcG90.xE% T;Ĩ.p_]ӱ, -K7WĶ^fUIqa3w0( -L /L-`JXH^&"Q4*!-˨Wr㰏"qpa W -%Ws/wPJ 1?qxIVK×9$&,!/qVf$;& ELXVQвLuFLKY}FkhU| -?USt;3`|Ӂ \"#R/GweLf1u27xteJc GFkKvTԬg0䘩Y8!h!-B.Wʝ:uf7Ejf`ˊY]EA#^b4 8bA710D(drJ~̾ lB1|X]pH/OkETZYe+ }H*^A;ZVqar1/&%g*jwg'5ƽ'Rog2ƪ0V&#]b!{.WsbuAGB_ ʌW%ø8U٣O\Km/*NC˶"zֈ˽˸g2RᴈC,,{_4$_\A tԩȬL%U:°KĻ suvC.GI{SQ)o![m)4^ yR:ͫtk}ؔip (r_l}}ZC(G[XX/DHK(z!) -!Z=L-`?.\,EeVe(RŽ!.̎M*(j_2ܰנ֧lԚD8[2Uei4^pW߅Vt=1`4@qVĥP FɏQp&棓J -#z445?Ҕ@.ʥiI"HOpQ#zPħʽu"`Ca=0WJhZx@kLWs~?1L!r޸$۳FjQ!ih_>sfVi:ջW:oKz.mPKP*v0W-++e'DaT,>j.[UWrmc~蒋J[fn9!(_ˉ #LV4̊lh֍^( 5d@.պ]Tpm\|闸ZԨu{u͟KQZѩᜍa%C+"gZ~ - # o#Mjv˗BS+حaJ(+dK`B=XRڶ"4Ьb Bn2vՆJ偈JOƸRCMT*<d WY/#UF#T)pf J ,Op豤?KE/ΕOkr?nzŒsfs>'dS%ƚfIl2놐{GoiXz8Pp*40%M?/T KԨxH5Sn3T^TĴWd%+'7-nY$8Tn5>fvK>5qyIJmK>!\)A+ )L^51Pxɺ9([k$_ N^FQ*@m)hY.dwSRmX7 6Clo`[#.,[mn8k" jrLxF$c?J R$5Q͆X{!z./OE:0zB%baؾM7l12#L&7)^ 2r0ZDk?ě, %eZ@Ngv#oeV1'_CqGC+?u7_IU_Ub],.gqMZ11p݌#_ݟTbe^zR>b 2B[Gl66Ew(|C.V}FU=]PڱruߘN7n/L(V -!Vg>TzYvr|1Wm12,>-U56H"UoF.9HhvTUԼݩE^}7(mkxQ|C_7R-ﰫef|]Y}ܺv1~^%?]'qùw SX&Fؚ`pjڰnN EQ*Q6 L A?` !@ BkҶ7hV$麀%W>d>LMNz qu`Mxsd$rjtԎ,0 7ڞRBtLdٯH-OP̎ܗCm*-R>y}wQģcu=!6K]`E am>VtCfoV1q۝O~e| N@syFjLWm }Kؿ18/YD╜CHo$܎FQt$Dl̃!wƗAaڋ/t؅ylw'@fb,4 1h6La?\ugY!F}Y6%QkWU {_7yV?'FP;-`p -"DR37,I'oH:T1UQ1b@kT5F'kG'J#2\gnq/g\= gzUH枵Ճ.(xN׋ՐKujSXԨLu^7- LZNDmWF+n%.Z*O]PG{ :"{Wԩ\wɮ1Z***ZAM2ɩv*.e:kc,_s8̊&mfuE >S9A',u]c=CL.㏘%C7`0./ < XQ.YW O~|:mXK2 @2ʇ%F\Xn LjhU0#reG]Jx7ѧ>GEmļ`%,}S<2Êpu\{ԨK0PO88dcS|Σ/pD c(ѿOϻn̅Te>h[<M^Fwh9Ba@(&$i?L^RT1t2>*%[,N#_g MMƽ^իA+ kWY <7DyAb -&]UQH_mǵ̒~,J) F6JMtLtU- F`3H1} \>db@BҰ҉"ms =N+HMǰOY v&-z{qe޼ml1T+C[z`Sքއ2&ۦEQlBڪY Ah({_ uA\s&d)UkB;ɥCCBڌ2zE~kڧCVWƀȲQWbnbiH\)ZH$7&Sb7} CށKB/p.ނba2VfBEV --rbD"stƢZV_s=C9Oʀ+i$gsyO d^Vŀht\n&"@"`vySMU(dƃ3}elcY>a~jH\}CTA7'jou6FW#k$ll(a -[KU ~ȪA$<;{*Q)ϛI  ˍ]FT/ -*yV --XUQKvv:Z g|RJC djThif5`3sɳk 7mCUFa+ -[tWԩl.6Yp=KYvWޝ_•Nb K5eE)*JmRBm{g2YEG,2v[B&0%Qpr]7tpDlG_&F&Mf JJt,1H(F Ţov%z\/Pm1+R+a٢ ` -~u T8hfʙP*69>s~]i:F%ǵ÷OFb" ڨA, j8ʖ lb+!:]"U@ZCkjHs:1dvf -h,Ic UJ0ʉ^PGQ1L'`&$(fN22[eX&!PPXA.~L~zl1p&Q E֬"cٔ0Yu$R#P \q|2w -ƌ֠)an01b2jwlbQo*MB",K!>"G#!us*Zs4߹MrQV.}3q)JP*5Uu݆J )kijɳ|8-/ E=FJuG -ȮL -- @I]@l65k/  h_,qlRvrX|*W_w@ee4W(})?JĢV[Q<@AX~ ) O^jWZQF}XmKrB$3)!n:I]ѯld?j6=ɳwbKڜ=*wdlvIQNT\ ?+π<Ib."') 4EbuJ Wz*hKXQ0C±*zaMbZ0(hmf2 RjO% =lj \!9Ii$w1i@L-QR0Fb\ k0}<{]|rDz˟wY7>wu;4r 0Od\Vfd&hH.Y]¡X \E2NRQGu/R J􌧳}oq:@R*a F0-V#w}AI?}S1ᐆ^C#bձaX07OįPNkkaQ FY*%ψsu)SJ+RE -<ŽhY*m" ЅZ#! ԸࡅKŤ;c IKll} p>aDvP筎rAFɘR\[,UA\%B^%"Zp]̢zd6(PKmArቤI\/9θjnw+Ufopg\Ys5".>R9eYRKvA"*6$j}D9#'DWȓ3:5XH?/P]!55TQߜ`jG{ w4qsbsZ-׍v@gV*ZFG ,1E[ܿ3 Z)BW K%U mD# CUlݳ³ 4b+VUQIҘP'@8-w6`5 -63 >$L*V?YTdY+=?mM<<+{k)nq -06ʑaiRIJ05[!7q0hZ.9T&jKaCWY1T0Y*j*.D0\R=j쀻rk E9'uPljC*]} Op70reݫSzңª[ -W2>T`IO -J\{ Iw$7t00\=&MKJ8G8 KETi8R*S׊c5 X|̕:`QbTwBKxAq.sZ6LN"% -'cDټ4ODKCl2;2)1*y2 -0hs4 -/YSL(#ŐRc"=|d̺[A'Ɯ~ -6udMfjWqܬ/`e< rH۹$.HX!Lx wU/D6AL@5 -R&7 J}AbQ/̾R]#/+h<˱CFv\R]$ًo¦K_ -yΥ7< gA 0p]jVD>N jΓ{n$ѵ-8 hTJ> x)lPV(* O ŲfqgqRSoRue7 -ĮKՋL}LXTуЭHcuV()݋4Na5 Գfbu,KU_ŏ[mXl d+*]E|\q D:Q_/&_PK4F|ʌ+ZHvwqn;e,&`~5)w5J8 L\de2ɊpD:Pklnƈ J ڀR;[@*(XgK*,fP=y_")~N  x Ӹmhmߩ5_$z!G\gRE/!Fu ZRܼnQW%sVS_Q%WPyCcՎíF? {w," -L_ -ʃ`.p1P_bb< @.zU@0n%1젿LdEaXE&+F5?X>1ԄWqL2gn@E A*7$ԇЃ8i/<:#K.'v o \eޣ711:#mAmX} -خ5XAՕE.h%RkK:LCpba}@*> :Z!?C{g.( xT iyK!"+E36PC#r LJ5d\ESQ7"-G@YMUh Rd[W ̱="y#b7P,FUn! -vl=XSl.dIBOLd{0 [GUZ@*F6JtCdvݱ]A(!~ݝP2"=S6VB* EnkOpnqbx ٕ>);_/Dy#\UbT7V$jZ) )`{(_Ņ*=v@@ѿE+'eWtBDiE٪O >%Ñ7SWl زj4u&HVaU|rU x$svb:7ewuzwI7]~ohۨYAӵڌ * -?lrWwMP(h+~NܳP(g7Լ/lAï#0c۟c -.ԁi]LAKīal#?d!IA|2t'e*6 a>tHUHIQ$#Kx`XEF!_}k2lro[;Z]oL y<r)1z UVi,3mRNCZUyW60tV؛IwduRqedsPIvKܑ6ynA/T'r]zGP_-6=CרYx.c)].daJYZޡ2z8eƗYYX~ -(>Qڭl-A[|B rCh;#?L\z'>o. _4߮4jp؊!:W,C)`a޶%m*jнYZ=c@tL<yYc0CBZ J[NpiK}0ڥdXn:x!;ahU`n9FR Z N?2 6M6 )|Ԫ>JJT8j%-FДt&*ѨG+wQڞ9ɇ r'_<_^.<8p RUTMQ+ECQ+E\0J -om~"R%5N]s2wƧq EcAX9aAoYC0612cmC}ݎn6KkⰗ~`A\n2n=EۃsS2ڥ1&%QClbܧsRr:|^{s0a8c.\&^#cdT5 p%u(gp!/|xH&_J̘g{3a&;SGȵꙪ}$zyK$ b}KBdiV/ >  R2uB?=X/)Q@J@!PSϵᗈe+6NJ \/FV/wPB|D}%WKI)+ ހ PzJLCmjCgcwnયPDFϴP%z>*.6U8۲bck<"w/̗yWUQu93ac0 wV萔'smR?0zdWClq!(ۺjvmY_0U4J -6(?j-|*=V}՛A>'9/ ^KUfUS?fo[wZm"C]hIʐDFTڻW̅j&C5͗zgT# M"{.Qഺ/RP5悅1zo5|EnjBoen|hW,'?ĄΚ];D|j E'"e*-Z߽>D t첋L 2[/V6̀r `hU8YJ-ٷgO^DR~"TWJ=t1E }͋+0χG΁o4_|(uXu\;_hD8K2zQQ cl1;fSډPx;>0-XE)'ux9/;f͚mYOE1΋^y_,RDcǯ - Y22i1:̛O!(.@yPi̼RDn_CU_S(p~y"[EѤC)Nd=7&hJ#w(Zp]>|J!`@p 0P! ?#Q3?,/{V{-ЌM ̬1b~gVybhDFfΉqzǶћ Ll!O7m{G#Ge37:<{:i71G<ߵM[{vR<QF9m!:38<.D>/}fu: >Gdr" F;Y3VpA>#m"# ">FL3}yVܖ^#338933x$y2`jag! IѤFv#ffy(ϙLH/pFp43Fu# ~8GlRg˂3:>m:.6ς|ngNPRDu}g$#I p ?6t.-0C NJ -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000013534 00000 n -0000440843 00000 n -0000440974 00000 n -0000441172 00000 n -trailer -<> -startxref -441309 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f61e51bc-35eb-4291-8241-36fca83bd93a.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f61e51bc-35eb-4291-8241-36fca83bd93a.pdf deleted file mode 100644 index 47b76c3..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f61e51bc-35eb-4291-8241-36fca83bd93a.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f67a9330-0d2d-4f44-b34a-4ee3ba3d26e0.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f67a9330-0d2d-4f44-b34a-4ee3ba3d26e0.pdf deleted file mode 100644 index f41c0c5..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f67a9330-0d2d-4f44-b34a-4ee3ba3d26e0.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f8dbaea0-8cab-433b-b3b0-715879fd9cc7.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f8dbaea0-8cab-433b-b3b0-715879fd9cc7.pdf deleted file mode 100644 index 5d78f89..0000000 --- a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/f8dbaea0-8cab-433b-b3b0-715879fd9cc7.pdf +++ /dev/null @@ -1,1139 +0,0 @@ -%PDF-1.3 -%âãÏÓ -1 0 obj -<> -endobj -2 0 obj -<> -endobj -3 0 obj -<>/Font<>>>>>/Rotate 0/AF[6 0 R]/Type/Page>> -endobj -4 0 obj<>stream -q 284.5049 0.0000 0.0000 792.0000 0.0000 0.0000 cm /Im0 Do Q q 0.1922 0.0000 0.0000 0.1922 0.0000 0.0000 cm BT -3 Tr -/Ft0 1 Tf --0.035 Tc -30.386 0 0 47.5 65.13 3457 Tm -(NOS: ) Tj -39.1475 0 0 47.5 138.63 3457 Tm -(1029812 ) Tj -31.8513 0 0 50 63.67 3401 Tm -(OPERATOR:ELEN? ) Tj -28.3739 0 0 50 338.47 3401 Tm -(SOARE ) Tj -25.8674 0 0 63.75 65.11 3324 Tm -(NR ) Tj -33.6573 0 0 63.75 117.84 3324 Tm -(POS: ) Tj -33.1591 0 0 63.75 196.65 3324 Tm -(C3POS-) Tj -31.4652 0 0 63.75 315.66 3324 Tm -(CT3 ) Tj -0 Tc -61.25 0 0 61.25 316.32 3783 Tm -(e ) Tj --0.035 Tc -30.9668 0 0 58.75 379.81 3790 Tm -(JUD. ) Tj -30.0064 0 0 48.75 468.68 3804 Tm -(CONSTANTA, ) Tj -25.9378 0 0 58.75 672.88 3810 Tm -(MUN. ) Tj -29.7371 0 0 48.75 765.68 3824 Tm -(CONSTANTA ) Tj -32.9481 0 0 56.25 468.39 3753 Tm -(STR. ) Tj -30.1366 0 0 56.25 566.78 3753 Tm -(ION ) Tj -28.1844 0 0 56.25 635.86 3753 Tm -(ROATA ) Tj -28.698 0 0 56.25 749.12 3753 Tm -(NR. ) Tj -0 Tc -56.25 0 0 56.25 823.32 3753 Tm -(3 ) Tj --0.035 Tc -33.0909 0 0 58.75 61.65 3186 Tm -(CLIENT ) Tj -32.9284 0 0 63.75 203.65 3193 Tm -(C.U. ) Tj -0.0087 Tc -63.75 0 0 63.75 263.53 3198 Tm -(I./ ) Tj --0.035 Tc -53.6974 0 0 58.75 338.42 3208 Tm -(CLF. ) Tj -40.4222 0 0 51.25 444.96 3222 Tm -(:RO1879855 ) Tj -26.9316 0 0 57.5 55.5 2521 Tm -(SUBTOTAL ) Tj -34.0229 0 0 63.75 322.84 3659 Tm -(BINE ) Tj -33.9796 0 0 65 423.93 3665 Tm -(ATI ) Tj -32.978 0 0 61.25 485.92 3672 Tm -(VENIT ) Tj -33.8209 0 0 65 602.75 3676 Tm -(IN ) Tj -25.6086 0 0 62.5 660.88 3682 Tm -(MAGAZ ) Tj -31.7559 0 0 63.75 751.77 3687 Tm -(INUL ) Tj -33.5478 0 0 61.25 839.84 3695 Tm -(BRICK ) Tj -0 Tc -67.5001 0 0 67.5001 955.75 3697 Tm -(! ) Tj --0.035 Tc -39.8733 0 0 43.75 503.57 3626 Tm -(CIF: ) Tj -37.4702 0 0 43.75 595.81 3626 Tm -(RO10562600 ) Tj -27.3716 0 0 62.5 57.86 3052 Tm -(HEY ) Tj -30.4245 0 0 57.5 129.92 3061 Tm -(VESELA ) Tj -33.628 0 0 62.5 254.52 3065 Tm -(5L ) Tj -38.7587 0 0 53.75 314.72 3076 Tm -(INTERIR ) Tj -37.1044 0 0 46.25 476.95 3094 Tm -(UZ&5829791160 ) Tj -0.0231 Tc -35 0 0 35 55.5 3004 Tm -(5701334020560 ) Tj --0.035 Tc -26.4211 0 0 56.25 55.72 2186 Tm -(CARD ) Tj -28.2692 0 0 57.5 54.86 2119 Tm -(REST ) Tj -36.7184 0 0 58.75 499.61 3872 Tm -(CUE ) Tj -28.8561 0 0 58.75 590.86 3872 Tm -(HOLDING ) Tj -37.8406 0 0 58.75 729.3 3872 Tm -(S.A. ) Tj -29.8245 0 0 52.5 55.86 2924 Tm -(PROSOP ) Tj -33.7908 0 0 52.5 180.85 2932 Tm -(4STR. ) Tj -31.827 0 0 43.75 289.85 2947 Tm -(PROFESIONAL ) Tj -32.7197 0 0 52.5 512.39 2954 Tm -(STAR ) Tj -36.9624 0 0 43.75 55.95 2883 Tm -(UZ434101137344 ) Tj -40.1295 0 0 43.75 325.49 2883 Tm -(6425667000530 ) Tj -29.2671 0 0 56.25 56.86 2791 Tm -(PROSOP ) Tj -33.7908 0 0 56.25 179.85 2797 Tm -(4STR. ) Tj -31.827 0 0 50 288.85 2808 Tm -(PROFESIONAL ) Tj -31.063 0 0 58.75 512.42 2813 Tm -(STAR ) Tj -36.8169 0 0 47.5 56.95 2743 Tm -(UZ434101137344 ) Tj -40.1295 0 0 47.5 326.49 2743 Tm -(6425667000530 ) Tj -30.5273 0 0 63.75 56.86 2672 Tm -(FIERASTRAU ) Tj -34.8558 0 0 63.75 262.83 2672 Tm -(MIC ) Tj -28.1152 0 0 63.75 327.86 2672 Tm -(DE ) Tj -25.515 0 0 63.75 382.88 2672 Tm -(MANA ) Tj -42.315 0 0 63.75 476.81 2672 Tm -(400M ) Tj -52.4414 0 0 63.75 589.67 2672 Tm -(220 ) Tj -34.4063 0 0 65 55.83 2600 Tm -(ME9001424 ) Tj -35.3216 0 0 65 240.5 2600 Tm -(5905061 ) Tj -38.168 0 0 65 369.59 2600 Tm -(034740 ) Tj -39.6333 0 0 52.5 55.85 1201 Tm -(Z:0297 ) Tj -38.8688 0 0 52.5 182.81 1201 Tm -(BF:0160 ) Tj -29.842 0 0 56.25 61.78 1129 Tm -(ID ) Tj -35.5265 0 0 56.25 110.83 1129 Tm -(BF: ) Tj -27.9066 0 0 61.25 55.75 1985 Tm -(TOTAL ) Tj -26.9371 0 0 61.25 165.76 1985 Tm -(TUA ) Tj -0 Tc -61.25 0 0 61.25 238.86 1985 Tm -(A ) Tj -61.25 0 0 61.25 276.26 1985 Tm -(-) Tj --0.035 Tc -31.535 0 0 61.25 311.8 1985 Tm -(21% ) Tj -27.2651 0 0 56.25 55.76 1922 Tm -(TOTAL ) Tj -26.4289 0 0 56.25 164.76 1922 Tm -(TUA ) Tj -26.7539 0 0 56.25 236.87 1922 Tm -(BON ) Tj -27.4226 0 0 58.75 55.11 1854 Tm -(NR. ) Tj -31.2244 0 0 58.75 126.85 1854 Tm -(POZ. ) Tj -29.478 0 0 58.75 218.94 1854 Tm -(ART. ) Tj -29.842 0 0 58.75 315.78 1854 Tm -(IN ) Tj -30.5256 0 0 58.75 364.85 1854 Tm -(BON: ) Tj -38.9622 0 0 50 54.27 1004 Tm -(S/N:D84700011006 ) Tj -33.0263 0 0 56.25 54.65 938 Tm -(CRSIER ) Tj -41.7538 0 0 56.25 182.54 938 Tm -(1: ) Tj -30.2988 0 0 62.5 490.68 1402 Tm -(C3POS ) Tj -37.5439 0 0 62.5 579.55 1402 Tm -(-CT3#1029812 ) Tj -0 Tc -67.5001 0 0 67.5001 851.63 3026 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 67.5001 873.86 3026 Tm -(BUC ) Tj -0 Tc -67.5001 0 0 67.5001 949.86 3026 Tm -(X ) Tj --0.035 Tc -46.0425 0 0 67.5001 987.71 3026 Tm -(20.53-) Tj -45.9089 0 0 67.5001 1121.71 3026 Tm -(20.53 ) Tj -0 Tc -67.5001 0 0 67.5001 1236.85 3026 Tm -(A ) Tj -68.7501 0 0 68.7501 849.59 2889 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 68.7501 871.86 2889 Tm -(BUC ) Tj -0 Tc -68.7501 0 0 68.7501 947.85 2889 Tm -(X ) Tj --0.035 Tc -42.4687 0 0 68.7501 986.51 2889 Tm -(19.55= ) Tj -45.6196 0 0 68.7501 1120.4 2889 Tm -(19.55 ) Tj -0 Tc -68.7501 0 0 68.7501 1234.84 2889 Tm -(A ) Tj --0.035 Tc -26.2584 0 0 58.75 549.87 877 Tm -(BON ) Tj -30.4536 0 0 58.75 623.86 877 Tm -(FISCAL ) Tj --0.0224 Tc -50 0 0 50 447.75 816 Tm -(R2000221497 ) Tj -0 Tc -67.5001 0 0 67.5001 851.63 2750 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 67.5001 869.86 2750 Tm -(BUC ) Tj -0 Tc -67.5001 0 0 67.5001 945.86 2750 Tm -(X ) Tj --0.035 Tc -40.5919 0 0 67.5001 984.58 2750 Tm -(19. ) Tj -43.1315 0 0 67.5001 1041.39 2750 Tm -(55-) Tj -46.1102 0 0 67.5001 1118.38 2750 Tm -(19.55 ) Tj -0 Tc -67.5001 0 0 67.5001 1233.85 2750 Tm -(A ) Tj -68.7501 0 0 68.7501 853.59 2613 Tm -(1 ) Tj --0.035 Tc -29.0461 0 0 68.7501 867.86 2613 Tm -(BUC ) Tj -0 Tc -68.7501 0 0 68.7501 943.85 2613 Tm -(X ) Tj --0.035 Tc -42.3228 0 0 68.7501 981.81 2613 Tm -(40.46= ) Tj -41.2123 0 0 68.7501 1115.81 2613 Tm -(40. ) Tj -42.1185 0 0 68.7501 1173.81 2613 Tm -(46 ) Tj -0 Tc -68.7501 0 0 68.7501 1231.84 2613 Tm -(A ) Tj --0.035 Tc -27.9653 0 0 66.2501 368.86 1069 Tm -(DATA: ) Tj -41.7812 0 0 66.2501 477.74 1069 Tm -(22-12-2025 ) Tj -27.8792 0 0 66.2501 680.71 1069 Tm -(ORA: ) Tj -43.8597 0 0 66.2501 772.46 1069 Tm -(14:27:53 ) Tj -40.6712 0 0 57.5 1135.58 2548 Tm -(100. ) Tj -41.34 0 0 57.5 1210.56 2548 Tm -(09 ) Tj -31.3424 0 0 68.7501 317.95 743 Tm -(UA ) Tj -24.3105 0 0 68.7501 367.88 743 Tm -(RUGAM ) Tj -27.3077 0 0 68.7501 477.49 743 Tm -(SA ) Tj -31.6239 0 0 68.7501 531.85 743 Tm -(PRSTRAIT ) Tj -25.9115 0 0 68.7501 696.88 743 Tm -(BONUL ) Tj -32.2992 0 0 68.7501 805.85 743 Tm -(FISCAL ) Tj -0 Tc -68.7501 0 0 68.7501 937.49 743 Tm -(I ) Tj --0.035 Tc -27.1534 0 0 70 257.96 677 Tm -(UOCER ) Tj -37.4292 0 0 73.7501 381.6 671 Tm -(CLIENTLUI: ) Tj -37.6326 0 0 68.7501 586.6 669 Tm -(08008 ) Tj -31.5951 0 0 68.7501 696.85 666 Tm -(BRICK: ) Tj -36.1034 0 0 71.2501 834.61 661 Tm -(0800827 ) Tj -33.9295 0 0 67.5001 957.85 660 Tm -(405 ) Tj -34.1081 0 0 73.7501 277.7 613 Tm -(TIPRRIT ) Tj -30.1696 0 0 70 422.85 611 Tm -(DIN ) Tj -30.1811 0 0 73.7501 495.68 606 Tm -(COGITO ) Tj -29.1571 0 0 71.2501 623.83 604 Tm -(ERP ) Tj -0 Tc -71.2501 0 0 71.2501 695.49 601 Tm -(. ) Tj --0.035 Tc -34.2253 0 0 71.2501 771.63 599 Tm -(00GI ) Tj -34.3697 0 0 73.7501 839.69 595 Tm -(TO-ERP. ) Tj -25.9125 0 0 71.2501 970.87 593 Tm -(RO ) Tj -0.006 Tc -53.75 0 0 53.75 1132.12 2213 Tm -(10. ) Tj --0.035 Tc -42.4 0 0 53.75 1206.55 2213 Tm -(09 ) Tj -46.1994 0 0 57.5 1170.5 2142 Tm -(0.00 ) Tj -46.1102 0 0 58.75 1151.38 2003 Tm -(17.37 ) Tj -46.6007 0 0 60 1150.37 1934 Tm -(17.37 ) Tj -39.8763 0 0 102.5001 645.75 1108 Tm -(20002214972025122214275302970160 ) Tj -0 Tc -55 0 0 55 1229.75 1866 Tm -(4 ) Tj --0.035 Tc -26.1471 0 0 62.5 1015.11 1191 Tm -(NR. ) Tj -34.7737 0 0 62.5 1071.92 1191 Tm -(ANEF:0001 ) Tj -39.1032 0 0 80 1032.65 969 Tm -(TD:00064686 ) Tj -33.6323 0 0 68.7501 1086.64 904 Tm -(CRSIER ) Tj -0 Tc -68.7501 0 0 68.7501 1220.59 904 Tm -(1 ) Tj -ET - Q -endstream -endobj -5 0 obj -<>stream -JFIF  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw  - -   ++&.%#%.&D5//5DNB>BN_UU_wqw"1 2W/>|n?N_#g'/fOv?|<m6IxgYs>8= sXBE `bY@J ,F6*İXPPX@aYDARl I&Q`$Lcan4XX DPP@!PYa -@ -IeB(Y@5,ڟKKKK -e, ,e",RⰨ" `2Qe@Iq,e$H"X Q@X(EbRk깎",( (PHRB(", ,Y2 -( (Y`%YJE(@% F+"@ ,($, ->K}&-QeX% -J(!,R(" -@B,",)bX@,V$LrƀJ1(DX@E a,ȀKP  ! - -J"D_]P*, B%"K!+$@ -$X I $KUfD(X@&XQPQbJ" -BJ%(B EEQ`Snq@.%A` XPED%Ya h -!(. "Bİ\le @[e* - `(X!RJ@T%`QeReQ,K( ,gofń,@@J\r%E -@P%T!WY *n9bTDV4,,K Ae@(DA."AF+%U6y%X!`(e%DPK!`ZJ @ `,@ ,KJ[12x|9:.K#_}7jK1,BAB, !H.%JT0(J%@x=%!` -J`cBD,@ J J"'SM.|Wlx+_厓䓩zaWhqz9S|9k7ܚeҽuNY/w@ V%)Hc$$% BY , @",,!(BJ1AJ\rXE),G%^[>vm9Ώ>ћ˶v{7߿Mg x]mOv]>ϑ}vDvG-v%\{vz~2Km<=L7 -`F $(% XXEE d%Q% `QowI$PTXI,BKPe'&e/?U__wq|v|?WKs5;E>=4[Һ;c}=w5ڗCKFoe|^}(Q(AXJ1X%X, -,B -JbK -@` w>' - $,c&6SK,!7=i?p{%}_?||bk>rPDHe%gDjr1|,,?-zZCOgkK9{;UgrXX%(E)Q,@ק,QX( `2ƟKTC+),E>n1d{ZmvڷN_TNףsjQ;7+-Ff,ﹾQiwRWu:WA֟qFQEo9ޗ]!w\6Ggտ/n۝9^#ԙbJD` DX!a%9ARbfDQ|~b,K@!PPb* ,,1gqa N8궼v6YE1xCwO}Wwn1~xEXIarƉ`J@%DDK"#ĥ%B 辟1c!(EQ V)VY٣MW\*e,dp}.P4[ /Au>pvT3~/G!>!|y}v¾]KlmCs^S:s,?o١բza}$ahYbK*z,@ q*R`@!RX,J1YD* ,6YD1J BXKH( Z?&_]Os~FXɯhS}zl;/X112He1,Ɖ!,ϣgY퍌~'c|ޑrgSq~ggߍJ 9_/Wv{-NR%@,`H. 2 ",XDIDXPEtL3 ,* @(@ %B - E㐰d$|~ܹsw}z\/rkzw|Jn\Hz:mo=T rÃt;Ovs,R,*R%-J `PAq1DX)%X`XPTA -'iO\zksvnNj,]Yq ww&k4Oo|Qy]՚<8-ߢl>/nu98g۟-$1o;mXX%PX -bAbD `!n4 @:1 D,X%X@TYAX%(ETAPXX<ޞD?5f]jx~]Lj$ןχu2}^fϞﭯ?͔i{}/A\eG)Һ C݈6}A`V#&9 !XɈ -J%YD BLP@DXA`IU(%e*`TyΊfo,=_AG `Q2* BRن4wQ3j%}1|ӧQxu>-v7^xoazokx|CL֗wQ"TD `X)E%K), *R"@(9J `JEBPbi~Uha|qin~~n?DiJRW -,(łR,X,VYPI`*EƉ`P(".%BeN__淎vY7_彧8sݍz?/7y.a;>[sz7+~Nk+uo~]|a\~J7 9^Kk*y/dQk=xaaƙbPBXKP *J X\jP"R,TH`eR\h, ,J%BaB=~O8뫝t$6rl>M&Ktۑ`Y!bdD2cCLe槢ys}Ǖ.9n4,",Wiyi}F)].qV=N9-3<}7!G7+˼涇An9|} k7- :GuKvRKA,Ee .5@ňXY%Zb B BU@Q!X@PYD D\A -(% BX* -B%%BK+{k>_?gz|>~SM'ķ蹫5_Y<7ov|wa\ߞ?>,z=fI.׭Kup{ u+S0i0?/f6-O_O_+קxOmZz}Et&4 P%eQ a`E!RAHXI`AH ȒOP&}: [(|2t9w*z6F,MnEf۞K|4z90%5oP ?*cB-1RDQ( )PQB,!T DQ,S DX% `XXT12XGDc^KIy -4Mܫ݅cLK\B" -*"İ -EA+@* ,, -TBPX@T( K , (A !0K> 3f}kդ[xv).cDQXI `XT dX -B -X aAHYa X -"PE,BPABJ@t-Ls񞌹OLticr et xry~[מ?W;6|ZnY2HqΖ'qÚmDy<5kbRaRF  -iA`(*Br  D Y@K( - XtꈢL ,1e%,KReA`!KY b%` T@q cJ  -J,XI -@ib `Q!n4 *R -%HQ%J Tq`Ya% -EUTJ@%)BUE l, Qʴ@QR ` qJ@ Ab(AR X !@ -""KOyl<ǭy-:o}͓ܛ;֝S<^]] (@ BPA (,X*JJX.XT!  ,@  -B,Y@1,!PPIA Q(X,DXKs]/gWLm{4//.o^+i=|=;.ǛO_TzuZ=w%Kts{Rʄ K"D) -@JK)@+E؅XP%@(X% DXPX6 @ \Y(qhMNNx]Ei_'ۤˮmuekwv&G5U٧ݓ\]+D*,K  ,e21\T`  -%XK( ,%PPBXPX, -Duȓ(ARX8˖g\sf_Wg?Mk:k4u^D9ksK^oaEE(,BFH+e$Ʌ2 ! -ADE@@ 2KPBR,%Y`P\K - KBX*Q,b@UI1}>_h|>*%[ae10ȸ$bO>ώI|_=I 1=Of\C1N{h( b Je` - ARdXXX!AXT!PPJ)T$GݸuFk>#vmqVw͠Kui'5Jϯתcsl#gG?1Ot{>f;ifu:o⻎ c8͞C~w AHX DP(@@ * -@e H - AEJ(JTuhU"ǔ= }r]r\f̟L>^éΟ]w =W^O?vs,9Nz5p}vg5zD * J*P. XTPR a!aKPY` -[A"ZQ,0^&γx[گ1z8{u57mqw>Y9lMyr']C\{;tp?X&P "`%%Iq€$ @AP"LT* -Ҡ (*`1RKr_-f_{sg^/kϿAl~26>=7 };a]GIMG`iN_mSMaKK9^myyްhw%%(, AHT@Ac -$%dX ?a^s}+\n۵Ԕ6YjFIqMK/=M/%&-a* L!cK'<^>|ޅHWזG()OIƖK@b9Ώx>g-_ui7W8jãQ zs(Xb-@,"K -DKq&RUcqCgp̓/A yM&?PK 1s/<OD* /1Oh(x^LyP= >^ l) `@DX-1A,"KA@A `""*\ %S!/~Iƌq9:wد/Pz>}XM>9>oI4MX|[kIK VXEe9BKq%V#&͆zMmTA l -"((@%(Q -Qb()BX R-AX%&+}wDƢ_B,XD,IX n a%J1"# Ec5Ts6oܛoohaatFVƛ6[pgRXRET@Aqba -`cJI2X1d1e PKbKi!VDQ%e(RR(( -\A2a2@K*,K %cBYKc|?s퍁y<ϙr偡q/u BX,{u۝Nk?_ΗM~{}^٪xwkr4].zMLn1Rձ!X  -+cPP\BYH%RPPa-PXIJdm`Q*K$ -EV2?9hsGV7hyKw'UxK sOٖm?CgeL3ͦ??'%cp,Uz<{{9-^奔:>vNSyޜYg5j='7G?f.l~J@Q!P\B @, - EAR@YAX(c"(E%P((KF4$EQbuȒ+9Og8ۜMjuB{Q|3R(K(B5d,* (T -E`)E$J@[E(,*"iR9I1XIDVgeѭMoUuvRu7a֛q,Sb\8>;g˞%NggӬxΡr񽆋xk~/i$\l^[>L2!!AI,X*RT,DEH "D -D U`)``!T(XJ,,iPI," -ÀNo,u6z'^ ]$cD:+KdM^h7?Y^?VR09̡e!% B!ahARYq?3}DCt2 O[f}ˮ o4kqȌ5ѧٟdxf}<E?|=(}=mor6jfvM^/h=8,r]-zc\o3BiPvX e@ a(!$KJ1!%BJX+&%B>qꍻO2A诓>?_!A鲯CG_T|/HeEHT,40O0cizgT{c5M1QCgO`d% pcBX -;C8I,2* $2b+R(X( (!@ @ alE,TJe!,X* -c$X MsϨs%TE@K PbBX\K$2 HY12|}`}g?M7Kt_v~}:_Flvz5SghX][M_ס>9h<[wq~i5ysv|xO7ĠTQjRAD -Ƃ́ e*P EJ%RYDYDX, %Lh,(@ ,IeEĩ`ATW&8IIX ݯ6-. tpn? 6^gMt?קyfi? ->op&w³fMLrǞy]_!gWAI] οoSeo]VwKoq]j6'gkt9ӪzF7~M1V:yΔ|;CnOAtKtD+r=A>hw:zhK%I-Je *PK"JP%",%( 1UIa|߆oU]MUs7+[n3 ݬv'/M%/m[u;Gy8/gK?@}Yƌyiut\ޏuafӄB#o9_n宗~7MMkpu:73˙ϠʴNr~#x.Cb_C?eQ8w_\ӝ*~=v' {\fX D-DPJ an9@E -J )@J BX -l D)x V˛凃gn5;|6鵖/ =MEGǀ3ϑW+ivX:]N]}s6eV|umwWWך㻏 -GmM~V4^9ߢ v0XYLXPK% d4B )PQE2ƖJ1 ᑕTAR 4YOM}I7 6W>_B#mqF+Xϯ˲|:95ou;ӧ=5G#~+E}W0yw$M~߿W $$, 1Y@@"\@(,1! e -> 'ֺ%F>(-[G3KtO= %}t?silf5 :}Vpz|W-zc'ϝ{t7jW)m9_^; KnBΓ4Ç9O^[-9RGc, -n]KʀI "+T ><>cmTo&ޞo,$HX%XB!% -, $XbaR!@ `XUd ?uD"g,tMr_ݧ6hn{;9fzNC֦:Jvw`fqLt_ N_uf폵|4oBuy᜾MMM'=og\9.c)PZ쥂1y<kH:t^#mn8m_uugyv _io4m19S--:wg_m:MKɝ5.$$K (, JcabJ1XPTI IH aPƞ fW],XoeYO&ޗhs7GνOaޓN3zj.7=;5WO涇?m6:랧y{btO_;s8#Mn(('b@qޭokgS<^:6]/)漛at -|rr?| 'o< zh~;=ҦP Z}8A7'?t ~X-P <-Mg o_?*L3<吊$JPNPLr[qM5+yu|vQ˯aGߤp{=ooV3-B}?E^{GwmÓaX9|w-|~[=ꄲe1% APYe(%A" L q*R2J!RX((!@ -BDR( -`@ -(P K.%@-c'3,{6y>ce2u%qߡcYWv]>?W+_!81 \n" - O|[= g5Cs&$%:K/<6Qu|ay$n6Jo%ARPY@I@"AP*Q, e"HP e R `.$eIqP - /s/n1&ppjYwY$~OFߧ>洿~~No]9ޛNGi赛6^.ԕ|NKvuWqc\4vOI=:eBRDXX -PP`*RAI@YL@@P -!R (K()Eq@x<b<ھ_ԟt'mCu[cUxA羋K2A+z|ݟ5}Gnlnۙ~gYxL:ë;ώ÷vn9ޗgw'1q#6>OYkl9:M=gi eQ,iR -P@ZJ @XQTE`,K!R,V9BXLAA`P!`0i~>njlz-^KkLr<=IxY2=mK5-i:{xÓo;>#s])igo/1yk>G;~6n/={oYcG|y~s}\>\onSm&pF$(a`J (PJRP AlX% (DX@Le(@QEDP(TJ}~J6kppS}eflQj~qy&ǫF8nA}v -z(F> 9JC;\I#Ez %cC1ELn%b(!n4J$Pd* -K -X -T% )3Ox=36oKQf_86,j٪k˝8n6bJ=T):0y׃-O̶݇Ӌ?K1TDKq\csĦ$! Ē#2ϼpjߟw!鮕Ѱ>gOspٝƻQu>>onvo,ct˖}z_a^Ha%PRQ,DA@(>Gq^s{#5h{:in9 vz?o䯗כ>]7翠tvK-JϏCG+n 6U\j?{~4jnb;.cY/=ߟy9Gg5\ "$\#7;njs'-]N> bogsg}{9>^.]=Gկˏ!qj/o~wWgEtqy>:5;ItߧzO?yuyy|z}:_棳A%P[)h"JI%PX|wv{%^7k_Oi{^+_U)y=N|;n78·ͿSs.Ӎ_{9VО;FRŜGqpި|=_+嗓tjzcdu@g>9z*K'Ui=yVL|=)/i?ܑz6g_<$W9п?zoOg˪rCϟ>z}]/9q{5Uy>9^.]Ix~]wKsτn=S亞Z;4JXBUJ)deJ B"BsR9nso'GjvWeYz97$k=}s8~׌_}t9.U厓xuz A+WWK6=cR[9Y,Qu|#9N.ߜelNGͽ~sOe7iv'#mPq1r=w(mj4= o;GWGyN;^+e_cgi~>nȻ&Gh_xv=G~+Kgӫw (@X-+- E,7l$G>5{LwC^O]4mޔn>}E>r&د7h0ȉ,(.9PYBR*Q(T -!`}GowkuߞgNAOzu~yܜ^[}frw˝y7{Í>t8~U&u+1lt?HF}!Xc2, J1X@EXI`llȥ(X ((,`PXb(*,J - ,E(Pq圇5EI?>yXx|>I1bLr[ĸH1D^ǩ,1?@rcGcis9<\tqx|C<6[ViƧriK%Q*)br( , -K(*@ (E!@P" a%|񯬘_s<3jrF-Ӝ7_.+_g~n_ېcCpݝ%5G{MSvht^ό#<>ץl}2s;.;Y<ĝN۪~{)apݗ7𮿐x8~7{/]^͒*r-2LD,,(R@("PY@ BU@, ׄa%olu/ <1g#tc-Kc+"_vͶ5_hq7kgiBY˜7gSudv<lz;˅l |8mygyG+~{^}{/ |}MW/&l篯1ʶDt7qȞ'};,}/6K 9\h -KQe P,R,* - -Pe "KX@_x[lWuӰ~_Ӯڷ ? p_ 'Ofq=G+ ; +x8l9~{}zng;^#Wg|zr>_zފ[>[u(cZdΰ_=E#ucw^ja%QY2ƙY@* - JYEаe - .$d", ([+I ?9ؚR@Ia`LqU-Yй=isz+?WQv\o kq>7Nǒ{"B DXB-,r(({/#Wv<؝_#rq8̟L2|o_dl<?ts>o_ךktW*Rc:/Vu(q]ג8^7㺮;|ns/cenvq_Lz4J((I'!qV[W%ޞ: isC^S_=w8jxձ[nIp i#;4ӫxeo%8#p}-Nߐsy}z=ncWQ|i6}W=W无nB:7ɞ͒)jl?Zןu/KǺg>A\JFV%J ,N8ֳ#6CN~اӯ56c{cWݷӓcuu:GjX79gkƩo9\?>:&t=_Cfs:+k=߯'MQTeB'i]xOM-07&{I$eFVd2@. @"s?;Z/VΧEK젅Ə >_xL>1T(%`2@Bμ@Q|֒Ͽչ}Z~Q5o/̿B}6 'ӞqotI|l9,Iىrg TID$ -KB2cD!!RvdZQ(,TX,([!`(cJ( -"A`(ʈBd%횾?l>k9BD"eb YF,q3 `Vƻ*L2MET>Go'>;4:p/^2ːyҫ6a}>i2o3;??CSR9NSX>49x]ǖ%<3Ee((`H* -P% -(Q(PJ*XeB넉`c.%hy;yl3an}o1.}|Fo>|fל<޼]_%FYcK.% -Ee -( -X,X( -, -,H,!Wc,J1^P qVnnۈ[,i}.=>=|]G:9csl:6U%͞s??ֿO9suvU×iw,{ƫ 4_/eR E P ` q -DPXPPTRe",* -J¥Q`cb* Q%~tˬ|6k:G❟{t?7CݢfSN~6Gy?OZyE̹Ooթv`7kq{G#=Q p6l̽U#vڪߡj/' 6 ﷮=M},"r^ s^9_hxy.eUs';Q\h -* -$(B, -J"b,PB"K(Z,aezhY~s;tzZ}|lYKY{bh~qLr<}xw8y a11"Q1e%!`%cj!lrƙeq -!Ll @!@V9X[_k_ "0irÃQ(Kυ10X,kp};Ȋ9iv{:oo!~M,]z"J"lTbq[,lb\DyΎaϝda H -rj=IA'%;o:?'t%|:?ϿAO,VTAP 1"*Z<3)a2DX%5.R'فƣmW[v\2{>]zerFG=ts!ίy(}6ϩze ٯ8ޥ4ߠ/ԑ7|=*^3vkͿIU%XI,X%ox]}~m?6_oe7_~'ZwnO17nw~7WDZvny~]_wg޶w_C۷x9^ h;~sӬ>6Z^U+toxo3XD c,AR,e9Be(1B9Krsɬ(x~7=7;K>ڳ꽲s;Wŧgvv]X>ku -uW4Nkg3x~><~Ym&$i{Kxx>[qb2~ˬOmiM5!ׯ?-vz9-hrf /K^c廔|+̻UtiWNx5}/m=λEg3prWɹ|lnSX@@E2,$J R.xdgq`.9bK(PPz|9eaX1|Zӝ-^dVmWW{.j{4^>F>]x7w6#6@+9]/*-fy>㴿S>-?AX-K N,OϺnk9j5Yyow~sG)Kv5y:睚>q?7w^27rMMYM7˯4]g=]/3}u2=V|1lw>]Fs$xicޏdIa%X@Lr+Rbe -P4J 3/t(k_,={~"" -Ɩ㑒 VT[) -X@X -eU jv̅"a8>7´?>_.~M܎kmq&:-8ܻx=f}Y,<{!ЀL3!c$%XB q,Ā `!**2!A -BQ((&P(*PƖ,UIF9)?9>NDm5]7Gy<ѯn9Zh}a=-)jLe rAQY>Gysϑ`KAD!HKa%X@"JIq ,1BP% `YHEZX3[(EJ%T`)&XD`P[(XPxOx3oηQ/7C:xλ28|?GT>h{iY%jyݮC>o&v}9tx'ex%K,1aq$A, $ , $,K -r- ̶RI`PX,Q1YLˀ8>ǃ8ٶv1~63Υ&{yBQO:5 a\SioQӧz<:W4__8Ϳ蟝.1%L` qI` .%B DXEˈX@EQan4ee.Xil D,JJ(,XEAPrn%{2q8|NDR^#1o=ܳ`%s)py0}>~^bjK5>/wr=g_wc5,I`,LVa%%X1XXca%$U*2!eX(@K -@(),Td"%X(-Ư fPc ]lI8op;&trN1>~Xg,ē(Iq$K X\F6X@E\Ac $PYBYr"* X@P@J[(QRPJ"2$UA ()&P`RĢ5?BIF+Z%(%K!%bIa%XEX&XXI$Ae ,$K(e.x (Q,* -@BPX,`}ZѲk4s`yiuW9q;:xӰNW;;LyW؝gɒX][(AH D A@a%2% l ,$(b.""UIQ%UJ `e62)*`!R, X>Jhݫ]ލOb?c n;Ex#<>Oyb((I*㑣`>YY@@EX"XHe fXJ1bLr b l"(DK,1,IPBK9E eJ")HP@ `(AR%AHT  ee]R!(A(.$̱@%Xc,$K Tc(K(K .# -KQ(@ qW+2RL)%APP TJ,B -IK, %& , ,! ,X@% fX",$b9CaJ"X$! -,-̢(ID !n9@PTK,[( - Q?!MA]}=c6Ore+,r9żLV6 BYQD!b a% rċ 2"K ,$K ,$@ .#.! eDPeQ"j@EX(X[(J - w;ƻAѧ)?8M&K8S[9χiʔ'LNu,K\w%_;g?VǚW9!_#'=Ojsi覣{&P\DB@$@$,K % - A,R( 2 ,%b 9E, @TJPT!(~QzuBip -wԗu܁rG*tzْRێG,Ö.OF4{I;h)ےiC/C}L?K fX% $ ,"@@2b%DQDAe\3)X+( aPTPB$YBP@  V4e]}I}>_ѥGc-VUg[#?W4!r#w~OV9S{~5]Ԝ?AKፖׯYLgQG ۟/pߨvoZ}1K V(E`X%|rQF (" )s((Q(%"(S`J%H(y9N^#'7oĝƮgovT *.X_ ;PzMs8`10 c3*1d1 &PŐŕ>w111QX2,6FBd,dR(&9-1d1d0d1XYi!&CD 2@R,$U"((EBRs~ft[9u_=:?4*5~{&{s\ښ(e,~":\yJ/7mztێfOи^넮ELeM_K 9-?,1e fPa&P(c(d18a3,(E1e Y,L>_OPE D1!Z"ee32QE*1 Ycm1Y fp}a}7|A}>o>OϬ5U[2X " rĄ剌L! ˈ@K@A,LKYEe(,rTPP!(ZX*P@,%@"  -P _A鹝Or|~U}uߛ5 -zOƀK_GLⳝSGZ?<^}oʿV?1Oy-ǒޣ府iχL1R|~ =OG#YF}[K"!%$K e (,! , A@YQaJ -\r>` e R(" ` Q@ -A`MG=>'r9g?`~_?G[K`~|:gb^XD]^ tGC~9'_=5lc5.&+9BK H b,1Xc,"@@E1K % (`.X,rXYb` EJ%Q@T(Q,(Al( !@12cbyv - +J$V{}p=.]ca%1XBe K ,$3X @@c, "` (4J\"@YEDPRH`BR61}wvXKדjL6>_/4 -V -K3rTcѝs7ޛJ\F6XI$b1BK eCac2XP#;2Xҁ2@ -RL(J`J,()x^~Ϗ;.^>_h:nT[_{԰\r8o? PgN'?GE~EzKIq",$.6K $XH.$X\l%YD*,"YFXeFi`P`, `X  -P @-}gt:r}L>7vcaJ)N5[ - ?5]q]ko!Sr]ԖDe ,I`X.2@D&9bc,&9BK , %B*@%.R,rX( ,XPR `Al,@!WRh7k/=ށAHIylcRRAMVœ滤Vp=&9OaF2BAdˈELr±bEX1XP IaQ K( )9J%(YKe9X, -"R(!e) -B - Y@@ `(J9٬L,@Q&C1U"K Ia1ĖBc$K$a,,1(JX1,  -(Rc \QlJ*J BP - @J PYD X*+T`(q(ZS`^YRXb$KXEQL(QF3(Ibbc,"K ,TLl2I#>jX-{#+9̭ߵK7,Lqcyܫjˎ91c{+In~-c~dO!eؓ;z|#hs=9a߯dluʶԏWiFj9gIyv/M^[Y :NՑ|ɵȹc|ѯ>AmzGP}zc=@}BJ1A fB2D@)IA(\hBRAAɫy]DYO'qnYK7CrkvC纃>M5 d>?RW@a!%9!0L!&C畂,)I`XPRFYcRP@(D2J q*eE -Q©*SF,AD!"BUbDI.51) KX%XID\JRJ ¥)a9ʴH@ -(*R(cJ`"T( P%QlJ%)>ꚏJ{.ϟЖQb9a?Q,$P "ca%9A bH\jKA "h%$KRDP YB%JfX -@B,)( -XaXAn4>.>OO7\ܮ&Wm9¾%+dXY2ʟ?cl,uO4{~V~y-D]fi;Jxx;q=L{qg,1!/9?ߠ/1bn>?nQe@"X@ P@,ERX.4(c+FWƖU( r% AI(X* -A`#oLIڟhd?39nqJTG2Pb l>sݿWY1{jsޭQEpWq]t<}:2W>%<޶cMUv<_lr~ŖT 2K D%(JPJYcLR,!`@ `, (T7厏ƣ/AƓ;*r31lJKovh{N+9LjGiۜО?ѿ2$AXp]'%_EhwYu]I"ˡ+Zj9Q% %TQ%Q`X FV#,( X,","YH,BBy=|~x|><ޥ7%SnM!n5?ij5zNC݂Y/9|~y|j=IG?SJ,%uo}!xW`%P," -,,* Te`"JBA` @ƈ*P%Qgכ796̓I퍅GU>UY@9 ԥ E02\e\D'cL@|yDb}}$,@ @[, J\"( - "* (X-$G?9;rK߅r{_/rߡy眶L9YeO?LFtxN۝_՞@kXtX/NG)Fۖйܼqْ\eK (\iX1XIE EY@<3eI BX* -%"S.3=^OT~ߕYT}/q_t9Bۍ.XӗGLYIF٪ 8ދt}_27gZKcn;~/[Vve~Zmw=-V>Dn8~GEpqٽ2 ,I,,! I`Q%Xܱȱr"a,*,!RA@L@(c"X[ /IS$sz]=^~owef/Q`APP(cae` B[ -%*Q`B@HPK(rfPT(:Oe"U(|y~H|_\IP>yXL3G͜>O-B ̆ EDH"J1e@ B EXIaEUÉa -Pc2T(% - J",(J! -Hah EPMR'5XHdK ,&XD!@c0XIDX%IF8  D,Lhee`@R, ؞)3+7>YC6Oܦ5Ԣx|k f{B.O ۼ^¦&WS=<#e,?>B,-}̒}<Ǫ>k(Pr]39JK>ezl`|Ϥzv$I4P&*-\llytgI5[AX)V4n!u -K2rSx}y|6o 559`i>l=?:/{7*#U貭>b}#_69c.!pZE?]4^͊|7GoE9EO&~9}eO7у/R>>F{_սavj,-es1{u"ݎ)VGÐVE(9F Tb"{g3KYy?s?AH>}|jGCю;BE뱭6,I؍ D}gUGM7C˝mkt89jFsvA%ucQoO@,T*X(e( - qbsAbQ,"aq* tlI_/Nȝ-rz]h?gg'4gM~qZ{?a#?t}._~|ly>#,u:W=_r[_^}4}5"?KW>4~Nν~ GU?'A&6/f 2u~~9F7~;h6:iwZCߐ~xˠk}in[c/k>?-J_ɿOR(~k?~կjo!?O%Y}|Uܗ]7[L./埴/Mzi*QaD% )V #b B `@B"\A~%oA_O%uz~~[&?3/u?5/e幎Ngtu{]m~__~bluv?~j|sOEs]1ڬhK5~?woh93yݟ`z-KK;⫤OWՋp ~1?`nөOϿA,;Dêzs궲}1=o;ߠLMy?=o?$~gߘg_.:m~W.^:.w7y> u|U?=꘲*U -`-Tplq9BXT* DC?j~˻nr=w$t t[Ge^Wy9/lu7䟬~N~ig{%~/Oggj}v;O[^Uyo/~rw+6Z͙4xw'uO} :펾<ߚ~/7{9"w?\|~i?? mu[s]>uk6gG_az>>4?>~lknλg[V//#~G_kQ~g4?gn59|oa;9'E7<ힴChuՓ9.MT",!(" -(JsQ, REi%~cnOgr2^vn?8Y?g^cy9?2~W~wr~37eSmޝNk͚mƖo_7h:>sͩco4#?x*b8^O_?JS/4_~3gZ_ϿBSeo;3r}FukvGI~?z}>lп8gz3f_Iz?Vx{MKe?;?kuӌ8?`zS:ⷼCu[mYu|Q.j~?HO?d=͊"RU@XJp ]s9԰ ! ,7 -T q[ @~3'㚟z|ntۓ<톶L6M?~/1iۏ4;r'CT?/dolJͶ[7+$:wkm5Y]Aֻ٣َk:W>~qgk=_?k6Zz~`*f6+=gkmk29k׳%sy=~ֳγW˿R9&Uh7[o?ٞ,~?鿘~g~qG~ׯs+p9UԝMuY-L~k?ߴqR@ A) BXXp [i,I,K, $(yOѽ/Yhwy>:}v\y]~3~w7ߴ/1hۏ_}T#_.kmF}_ѿ6N{u65fYSsiۙGr}w#f8:C{g7柦kxsy,2~wkmΚk%s}/:kf1y?20|ޏt:=?5lu?L>ǿa{S俬~wg k/~賬y.O3xot4vW+_i=߷/~'aVlEE!i J> bcibI`%(@ 1L<~Χ75}<[ɯGSϺn?7َWKh//?s?9:>j _?F_=lonRͦQ3ok'I"z:s=fðY/? t=Fq.G,p=_xpZ~"]zw;y:Zr׳,矠}ݙ\wagz^]-C'׿#S/9~\ğH6c=~]~q??eoYʿVN[Wo?9Ig_.K+orv햧GҝIrOi2ퟋ~}ћ`dP -".%* - C6.Y%%BK ,<ߎ~|{=\Yȝ7_Qudcm6Rg~~stş~Er>whwz~;o?F.裪9MY|?ۿ9ǐ37~w]#k@4WC?03=/ÝG͝O⿶g9~m7zMpY:.w߳l=X?JqFQӟjcgOǿ^Y~W俨[s}:r}g%_r]o-{7==>~s/}#y~mO_ef @X@PP@1qtT@ HBXy?C~{/l5iw2~5_k?~K6ڳOyoǿbv_>w.6[R:K}QW蹛<>_F:_cR;&2k_8p_g~}:7I~~.Nsο?AY4ۓx:ncgls~Kͯ?!]s,| NjO{9y]ޏ|_b};G_̦7״TS_/]}g']/_}0ߚVwv|o`a]$l:o9'~y~70ʺVQ'?WyyAZϧQɿX7;*ΓμmS+tosau܁vEο7?4W%,R,e@,QeD0t21Dc$XXBD!Ry?MO=/|j>_-gSϖQ?A{Oοh[t?G/g꿏~{g?o]~"l7Z=Fw_~oznkKgYs&?f9NӉsy];S?BNͧq~,~Ƴ?,g}Oٵ-noGt~-G㔼~iwWf.覶^>Kǧk~3~SxcwO?(}gQG~yG⟵K~u\5m:p7<gƟecW3a -e(RPR(#?ƤDD F5`%B\E_w^5;/הc쵆;m>sừ?6ڎ[KG~su\~A\~淿~7vahN_?7MIhƣm\'mǥzm۩}IKoOw<~hGItGjv WO꿔;< ɿZ?2?eK?rOMOx.|/gS;?V궙~_]^ _ƿf2Y ,J*ETGOf';%$AX!` YQ`I)x([mNaFUr}g(uZ}Ɯn5;S?i_ntg_|M꟏~~?z~_i?*z.SϢh7':|A/c3Z ?ƿe9~3gtv|^M5~y?-7?~ɭzNSN_ڿYpz\Wcx?ͻ\{$~E{v]Gwz~^)?i4XO6_p]ߏ~_s=;v<~5֧?|}>p/_ݬ//ذJ%2,D* -j˘:cpKqA -c`Y `ǃ?"C붋9\^:6LglO?B?:؎GK~mu\~7'kp~>qYyMΝ;_ͿEz-^GfVɰYNK:oFlu;}a&c6€J *"X,@X-1![\~2ǖc"XBT\A @Xog}z]fg~MDJTI?q=LhYF2ʄK,,(@XY% ,$ ` e (*P -T$ )J2U -%P@J@C( RXI - - *,UD#Du9BTB a D ABIPK "Xl *dE - -I``1l% - IJ(X.4@E*R"(%BYVe.4@L3}?us) &RB !"*C)%XX,!PX!2DX2TP,ɍ*C&0̀ɍ.X $șAA -ƕSg0c乾d>c6&4Fl)H2|2S& -ɈɈɈ2+DYW`.4 -A~Hgig:%ƬbYAXd27}1ɀ0l1>}g}&L!|`>}&ɀ0.SFR VQqI 1b,͍2cK|s2\Cd>.lƛ5q<b\iq"TPBcLEK1b-dƕɊ pFWL S6>c;0K/GY1913bYC&#) -)!bd. !@P%QQR `_BuX_jSk6G ]8h,=>u=AʺnX> -:Vit&Wacomuo1 eX X,a, QPEPPX,!PXH_X2tk=$(c2K, H9@ -IDQEYIP,MU/G.l}s}!Ԟ]=_sYg]v}>YzK7:Nӳe~otYil}4=Zm~_6[߇Yx=\Kae!JEPh JPZ pb~TW=XA,P@(,(P{|Z}m9c}Tr}^m]FY4oYٵ&py{m<:>{_c<='7_>G{֞W#U>?E>w2ar)SCD>o0}?1<}<ފ ",,RK -@ 2JPJ1X>_Lȕ< @RTIeEDXEHP%X)%Q%BQ(#(XK(,&PRRAHX)IJAqQPK2X) -A @PXJ*1F3L2ǝc#j@,Sƈ,1Xe`B("TD,Q -@ -ID6eXKAaK`",X,"A`E(%T(KXJE,X T0NYr@YIQ@@%eAI`X@J( A("P%RPIBj qHQE (KaK,2% @`B.W;0\@K (%LB,BDQ@`QEP)* -R,XYb,ȋPJ$(B @a@XJ - F*""P e?dއ=LrĀjTAeDDKJ%)(%PT,( e(JBP,PB `R,$ ,,R,%RJ - X%Y`RM?%X%(@%PJEF4HXQ, -1e BP e -XXl,TJ!@* U"ƖQPYD ( -J!LeAaX҅,,/Uˏ=bD%$@Ka,,*P ,%SDApylO]CFRI}OmNn}.xk'_?qeijOdIq-LTKD%`X,QIi q-1TAB(J ( ([pƘRDA䳩xi6\oS[FR1D2}=ZlOh[Y_{M,M_sOU쉭E_ BP=#d.lDv}ڙYMgk? izR}^{ }TG᱇2/4 챜l4hYcO3矞^ lc~:YQaF" BPŔ%e% @( -eP -HU@XPVT*R ."P PK(AA% DQA@ DRc)s` n!׹>W7MWϾY9cneP֏ˠoK:ۣ)@ J%, -%HfF4BRjReU)$Q P&PJe))|ᯫ?|=OZwC˦m.AlOk5}oL>CK=f$w>Mzb>]KIFezϰ~t_ʄRXJP@(,((XQ"!( @ fCͩp=ٰ4%͚=fiԝfnuon^~b:e/ǘ۴9]I<I}7[IV''L~9&9b|ymm~z~wM>s/;sdUK}z>fӢc^_=Ctr6~_O#ttoUɯiݛlk4z\NL=鬬"|%~=EQ%z._齞|\^~llu}-T=lyIy|O6}~{]9wq^s_%YBTDK!HBTU`J@U*P.%J -c@@R`Y@%, XYDWt΁>އ l3.xzBkI}8иy3pCmt?19n:^k]YV\?o |]qPϨŐ?>yeOOOA1d"Ri(Ed$(P@ (" -K -{|u5yj~f׮2=-^iK!,ɍZ@#(b``&P|x$WG{SO8-GWל瞑tܵ|>]s-tZt[teձ#/_θ-`A]_'i5[Ij|̜Ο/WYB,KBR,-PJX`(kٰ\=ZyStngDZ0kniɻ:aϟΧaW>pekt82Jyosۨ|znvMg]Mi*E!`AP X, ( ARIP%5?N/7gaw\>n{}^>;>^ѢjA%}56hwR^emOgtzymntSos=oO|]=^n{jqps9n g_ɦPgkM᭏:Nm~܆GAez{?ᮾ[k>U^fpQlCrByymϽ溳e} Σm3=IAJI @ -PKeP-@%,bs;aeluY{yڕ>4/¹CNKWǗWukqի/_^]x}M믿դ>}Gkvuku\׺5]>vT'ի_ }:K{Fםfk:m|^Ut=qm[}Ei3jQj?Ѩm?9yɣ~ ᜷~_SC囖CET* ( -K q@X aS"J$I2Ā"jX@b6dŐ%#"Ϩ(I<3Mgv WL9E+n!ӍwM7K4}$s.zMoFC5:l]SQ=KgCx ƻϼۻ&O؞^W~~.徾?R{oXllz:c!RQQ,%UY `! -Q )7w={ggs#bmFDx9fyAgM] T֞q?~z}d]&}Nm1ϙ7^S]&\?,-:|*1 BT s,,>W8|y|OS#Yq[''ԎC|~vx:^`ur}Fxq&fFwNlѝX5E~:c0R(@)`He,}6gYYyQǟ?VV(ZƖX:c%g=K2%R%(D@! - (P\>ku{ nKl|Rycf;?Fu5c(h7=~<{oٸ;.:>/~6nej}U|}O'I;.Dx.녳kNn_wAe 8׉^XO1jrWVmXE8?:ڛ|~O@`,L -(KP&Be JX ` P-Atۍ=utZ%&Xҁ`JQ( D*X -XBsIxku(?3QN; nYUgjmtXՕuz񝮭>{O'~q zmWs~&۰Ǜ]_׫t['aofnN_@u}AP1CGʼZyt=ly>*u\睍Žμk=Nk~L% ) q -PB(H D,JT,! -JJ -EA`P -In5lBX!I,Jj f}ϤE #!2ٌ>TB㐜aj~R. >Qo.|>yH('Z#x`@\2%zkc7ߵxu%klzDy.^577=W]W>\tm6ZXXWk~>N=Ȓj( JE%X(%DPAPTP- +l]grK˧z =}6:rv9܁K~N -(PT @)RX[Y` D,E%X)R"k4{ O]_'qo[iKy殟Y#uNϊW ذ@ PDRX3* P@FX -@"Q, Ys(a ]R@%Ƃ ()%b@ `PA%Q1`[eP!ReK nfi=B?cPyp:ע9zuoMϿ(X(@e P `YH**RX- V4K -\8NNr")(TaPJ ,"R( , -1HBK 1+3z}aOd}lT`BeRUl -C(AR[`X 2 -\{j~f7k)"T(TD` -@H!HB3g3~ӽ0h;/r&3%Y2|fk;>-.x?gg X,\J%JE (Q( -RT -D(JJX aR~}Q1=?7ז;̼I3:ruQ~2HT )H -ETP1XY`X,(% Y`), -5?8d?,sX -` H -* q#+%JV4""P}S)ƽ/cَ՛_H,<DzhU_`3cJX(*RS(XQ,(%K(X.4T)eX.4_ҿ4x4o?, -%KWB -(-"K @*Sŗ+>k<fnQz>:_}\c}w's]]Tn9t5>}ٮ}5ոKt>ku=dE=WWY9ⴻ%k=oV=: &OyRعjg~) pi@!bX.4 -R@D2AeARJR@iW[p~QvXTTPX(R( ` K,x}zNGfxu|s]/.o6ls~{Cy:7s}?nvU.o-7{}J5^En֙yM=;'Adl~nSkZ-;o^Yˡ\[]z>/Ev\]{͜GtycZMۦ )m]B͵&gur.6[>~ -XR)(%5 - q(~gg:ql[j{QJ1aP `A`.$ -c!bG[u=:^K|>^:K7?7Ǫ;3=l.L].ՠ}cl|SfB8|lu?|3gOKm>^ Mfr~==4_?ekC^^|J>z0'ҟj},|j>}1"L \m$:|phg׻{\OC\e^MNI=KiOauȚ|34{3+!@!*  2@,X),w8ɬGÞ ,U -ARgaꚏqy|ٟQ lm}y+A/og!tV^u|FVT|ӧ]9΂ft-/:ilsr:Sp/6>_cAE)Zf>_UO^|5[rnֿgrW{ -RhT (\h APT'ages԰T AB㐗J YGUY4z?Yϡ:e跋n{ͷC7|t:'臛4u 7_wo>XiIt{ -=gl%M#4E\`P-$` %,ƀ, -ADc鿚jq [b9*RX d -b`% Q*؊Ǧh,iwNys]Nu|yIcqƴ;-fs4GYf=^OUtݯ:y\H]ƫmt{7۝>t}}w||-i}?ˣNW,z^w-YoߪK}lFk;<}uYzu}Mt_/7Χs|߯ ƻcO7/yқoOaYZ|zcO\=z;I]gdt,,$ (T aTa鿖Y2o?d礰S!RX,!R!Pd Ǜuj2ϥ揎ᮮe.Ej{=-Ͷo&uVKw3O{c}Vk} }ot~\/gcg)>_hqNZ]g=z/-iy|=u_^oik6͜zWӎlo6tOh Bq!b R?*ӕI9J - -`- tlM$o|I][:O1䮫uf7Oo\tΓ/N7|U57_lZEt}:>8}GWϚO5u<şv^h7Xy>9iM-)[w S_FWΒxFy>b321e fha/Yl0_(cÔYyK}IaXX -ERT(D[տ$ӘGLFÖ¢B,,X2A,!vڍgѲz=Ͼr!3si%ߞq}>o]|ۗ6}4g}ś3^sF>g`T@K(XʱDd$d,79wѼE9,*RT, %K -@!=s7}&^$ίϴkl9,2KYOuʓvݝXezKvs##omk>o/fS;-UφNck?mN7ǧiKchwZgI򍏷P:\_YR! KķʨAAHRAlLCD*L ,* -,*P - *Ov/ͤsii%leK.V|O>(h u4ͥ9-/V5<~ʚqi8xSU ExѷK}=MN.|߷6-W[=|E&Uћ.~嶙~jEfy|Ǫ|w1뫝k7yk:~iJ@("%,HDLTPx(_N|o?ÞHd13e$+P -ƕIDFXHd(K&Q(RY@ % "@"TƁjJ -q<}Nj>V8جp/c<5=Lޡ0Mֻ#|~qb QJ+) B!X'~Uύ6J)I`K1XLC$EEQ JR qdƗ .X҅@*LX lX rJ1 p☲.,<}۵L+S$,,* - -@B7_jh_6 qJ.4   (22! -e1P\L ȩ@*A!BQ,, -P$2A` LrĹa@e%$)V,€% ,,X* @,Q~S亚Vmۆ\QD !APP"R qb,P2ep\h(\h)(PRXՑxٗ%% H,)e (, EL (YE `X2J `%%Yտ*Ұo?gnk~YVYaPYPJ%, `cKE(YB¬cKPXТ\r -Q(dEP-XJbq(%B*JAAPRA`E]'j} 5oIgܟe?>~g~꿡v[>kx})- ,[,"*P -R*+&6* PR()IB -RL% DP T*X,!"B-ƭRJ1 , -%,Z!`6)S6X@@| T s (|z/}g#O[ !/Ы@3DhX C (Z@@1J @@, `($ -[F9 !04@$%1235P"#`A&6pBCEDF$c@YƊ0:=+S ]mCJRtWJ{'##_䤅u1( %%tAyp9=ξJa*ӍtJ^\曋!:LwΌ)DG+3V?Ӗ,XړldV4 ڬi &j]J.o\Ʊ1vDŽJ}a6R4p,! -G.t\G3Bt\>ZX·0R#@ƑVLm #m~Fߖt6?It6vҍhCI"Уjӡ(@ƺ&k\:πV{'K-4UK+:CJv; @|0SվsR[HΝs3TڲQmwgkHM0MPRS#@ cX @/.u{h:6i ƓGS] hBuf5@κȁDkkpγD=`GӏJO0ޥN!zOsIg庙 3jTKla֟}(;GǤO=v0~_>aG,xG؎w8$ }y<#?>HTmACSi|qnOBt<:4`vU_*"=^<\~xyNNi{Q[PROO3>|2tTTo!2 2óf/ƒS4&et5e?? [On3f""t<ԉew+ȿȅ4,&"#lm5-0CIԩE OiВp#mYj%.I1U=K}FMz_t 'O3N^? U%nآ B9CT}iv!㹏GW9{MmYk[|TR+$͹P:W6nMX ;3qTOjBlƗw8f=-Qo8[qc؃,ʐ-Yun@T^d|q^C>ηO8$g: ֗ot]Ki=pږ ?O5DoJaAaם Ik v̅ Xj't{w/Y3Xh$;$ȫr")Ȋ#? uɿ_ѶǾޜWVDݘ9Dغjg71m~ou.G ]9|I: Dtr'Z][^>SOIro Bg\4x ЯYT44MN - b%1[֔fpW۝vQ)v -8YFTF+l!(,s&,6KCImeq~KCuS"d*rCq9K4W 2[`7k8iԸ8nRXRIlu9m0ɇTԪ!-HL -V(*}ULi4i"-{OuY{9q4<| -յbE5 ve9x;4aHYw^͊ -BGIz;j3*#!l$(3:γNasNHCi]DZXrJB !LX6cLKKx,\wwv_LǷdEE9k6WYi'ߨ$}P[ǭWgW *_, -ZM\r FapG /Bp!]f)!:gAm'<;;G UAk?V+~*Bnaį\Bpu ᝷"!p҄Dܧ*yHVij J PcrW":ݮlRMj -^`HLkT?K˰#3b_Ns'C)?LK'P!n^+APp,)`]LU Ji^o/}DZ[װZu`O CٓR1U5V}e~[kwxZS6_q\gܽuݔR\;>"Hpp̝;,@p+O#B ڿ?6Qj"  OKda,5c(~.\r5{1ucn:hKq`t ?Hx;"8j;u~zf>BlyY"R-_O"R죇Xy=/r~;oدܭ?b6xfw-͓jȋVvjBѡ!m% :5YBH0"!Fp'VaM׭At 4!uC\v'aC! 6֮AbV}+O s8gICZd3M߲߱ Gn쭨S۔̗.!Yea-OS0lv)-֦T:]tu:%a%Ɣd'*:jק9-,=J7#`Ƨ-Ջ%pu.d 7eyS]zބϦ.w{1m(S-ȴjyeQvos -5x\ 1_o-bJYM՟m=޴bM͛!ص-ncbCFDu5Sq~zn4|V`|sC<3JP:QƺD(vP('@`$54,Ki ̵ɧrdz.S[K_(T(>R׾ճܾFu3$._qԥtN6m нn:䎶#4g1

ڜ@~]P ݌}W`aњ2tݞL1uanaԟgugD:+AqXiɳkGTaބ!7:Lo/\.>?Z;V%jѺPg㹼vڂ!% eb$W>E]Xx;u[I+as'>Fy,UԠɗ>|Nm8fD; "ߛ@!KmnXXO9FL㈻la넕A-[LlҡI:̞6e։-ٲ7 Ej,HmGPN+oVҕ$9H9Z.jD*R{Wn8Zy 0*f5^b [Km).ۧ~7W#v71~óEro6Hv.a IJOCAcE͏)mt,Jw`tۡF,mϸzD= E5 -,SYYDu71\UNXLQ"R -#׆deoYXE\KMQZeR+[uhFⶵv+o( 0AnCZ}_&07ӈ~ZC|:w}q$Ý/?_ݍ8JoDRȶ^6%S(C7G՚Ir/taP6W'6mqs2ty RPz[1_Rl兾0X6SM -ۇZ")y[YmІqTCHHд4k>!v8?(úGiw"w|6-Y/š!qk嶾05;܍aXE\1-M*=إu.:kؼe٦m֢rCB\piNġalG,ʫy9Pjf=;50Df@Ci@#0a~-PBVN!~<]+Ы#it3X -qqmEd1ZMRi)V1ave!@Js: $:γu|Aj|}MY=:cZeC.^lꁋQs99|;ld?.P2FiO{XVP)9Ԅ -L>8_LCpCvLыD}kq -BD5<jv`%5u /?ӟAy8`?nۏZX^?F{mn7)N$njBRm!K4;*}92SkS9"1:2tee %]tuk㲡zp,Ӽlar5[#'Y2Dȋ[K+Jy_yPRE4~ $c#-i[ 1[}Pm<HJ{XcGγdsγ:`=:c:'Cuuu==qmg44UN+a -<X@躐Gq)p88>:}&u$ p8XMTu,u#y/ZB!k*BBG -J \VtHYBOZ?юuJTДi':ˎ)R-)89 ]]|ejk.JP*oJ*#Ra=X!?=ug4n*}qr8;),>Jd{np䣢Z{RV+ +H=nP<h,h'];|%CZkHڃn!|gȋh`kY(1Ŭ|Ch-牖 -&~jcuj<.\џF}|:&X%ִgOgfJ!!MN!R[4 S("-9C 3iWJsĝi0H\8?p;ԏB{'xgYggDYVN͢P:RtЍ3%3NޒU$!31NtuCońPٯnZDdm-)`Ԧ%XڳI~e*)ΥS!R"4)i\?>瑩"a:ja>Ƥ?\6[e~;YSa`UWzm v--/Fkօ6BCYMu*aY9$mo7Ҫ0)[6؝İ/:m LiVpX-m-_t EVXN%fIom:r0P 1[> j,wyT)sVP+J2 ʪL&XV j[b% CC=^E|^|H Fmjys,R#=_τ?ˏ rC3K9o naVK;_/XRO5` !7[RgJa/WU[|Hep6 9 #4 -E4G$]ODɲUN1yRc^19tG-іX,jrE;;r& Rᆭ{FY\Kb]r‘*@Nc6iW -Y2igQ":^atRb4%$tpγ:γ:΁v=;6̩jJJF5ʝ`M{@\Xy#Nm"4Ԕ:jKRIuL?F|L<3ugY:ݱ >qQJ V2N7N%6P3)}\X[r%o#ق -QS N`B,*Ty1kJb~s̥ڪ"+0Q4liVkjWW.sCVolN"".JKd5]=%Iӷ|u|1nt|M0$AZI1$Ũw ڹӿaŸR|e[}!W(SFyqS ;)BGOAn?0ٓZm ܄ 'R.Ι [{1r 2G.E4h m -VjόFbX[%P,ُV@m۰AdXۍ &*PzIFC -"ա-8 LUGm5P?n2GHvޘ|PrbN`Ms:0u m S -եr~**jd{("c - 7)r04DVP46JT M*sϢG=(USXn8`E&Of(Ktf e2c4Ɣ@ -Nxγ: >~{Ys3 6NqQҝJtRњHu%&|q2RԫVc6JCARu.'YhN UN[ڴbg-TiVY1a5%mvz뛼@єtԦ]<uJ"eY1r􉍴g-UJc )v -CZuMDS)ZTH~M\:g5Z캓b5/:Wp,v`C(yy2lÝ^M\]0qMKgDy26yqH3O="Ұ%HmX83)ՋK @fh86(*–ݹ. 5nSmg[kGu8&:52, Yꎷt}a"N?8i]ѴX^eѹ;Ȅu(*ar"m/E] pTi$5&2#y Ëy0ڔS&$JJ+s%}ucN6.&{YU؝nsàuq%ܲs>p{UqDxV.f@ {]_sy -2VU;S8+JvqWx:Qꐸ`ƬKGr5@V5YGnCs+[UNY{\DjbzgcZyP4Z28¢Nm5!cA{ͬΊgugYNγ'Y쓠{{utc::qc-YH] ['閎f6ۡWQeX"8ˍCf1dC}qʙ& 6ݬ|U&KoXCL>:\ϫCU1c&;\\@ L=F}utu'JyM 4\HΒ$NZ]wUj{n(|:[XP2}Ty 8 m*M$pvKm`i(xZB4m@iGRLcM+q-2tRt8ZQGx]q6x8t$6t7 EPam tTHb- [F*>$aN$3S-LF}*^#.qlDeV%=Jx籞tt\NI -DMc i))SU7|tZL6@:NFιq)JXd0OEN:}騬2x(d*e2H˧FL6ipu4"4d 4Ii<P8(d&i(O(T:XޙO#-i5`z qĆbGJDEkA;e -Bx>1Gu'Yt8ߠG%F5/=JWzd՘)= +5γáϫ>!s'\ -tlFcXa8JT_-e* 7;G} :'ggN цӇߕ+1ܰZGJikE{ {,|Co:n v's<ci6q|;Kp~ x: LZ?>gͮnÏ!GO6代 9Jj,tdd04u\Ήgǀ x - -f%'#G* 7.Ε75nuk%RbCDQ[sBQ2gu͠k\+Ke%SӣIfͧWяJPIۥm OWVcA v3uͬ\Kp'HXXRGl).ոr2laq%Y&;(@W" -!80N;xOh=kh,v3jb%7Ti<&ءHdlz{4jR^K[V_f5GYb+l6ڙmlPf2e'!Av 이)\(zL[Bl2J F{Gc{855c5 }yOu69unIiO a -ÂAncc@alLX͠C=z#Q5ָ%ٞfL]FXLM UB)y0ᰈ5oêor$.ϬƏ k|=u6TL#_m$n+ &c)pW˝1,.CuQWFy i2٫csFt26K,!I2e4^<*PQZu+Nz>6`|3Ǡ=uͮqtV4ut͹\,P5)\\v(esf1Z·^%9.$$^8j7WeQn3bE_ObN\\w5Hy{ `+r,§ myk-R}kSY٫ܶqr,S1k Y#E ~kkQW-˦qknS[C+I\ZcПF=8:c7IsX}R+W5Zq]'s8j\m*9u#5a)f^#nN>|ckq su(XRu* RVBl=냍>z$ɘ3W/QZ-3aXn3j4FfP1?u}).!/ZeVjBZEe ԠEtnw7DpW~N^~ 69Zɜ3m/EĔ=z`-;OY+I5rܐsZAC<]ӮcH-tm?lyOre_#|WOpMmܣ%&|ʚs[xfW~u|\\Xp]d؃̜U0^njc*\-%9`=F}Zbsv.Bly}/缓6 [jPSg(FH HWUnDVP닲j cC msf rux[y '\- 6\%UnS (.ĭ6$8Ny%N:mGLBńDuSCBU`,L[0ei t,!=}71|*S [*n-i13+ZS)7)8>Fd,˚'<:~2 hMzꑴe W*'HȞCam⤅h0κ8:8ǡ>=ugt(%+e%mi9:%j"K|jcMCep tmxY0?St8֒r8KC{[E yHV#mi )):AtO:SdkA@uav1Qknt (<rqe$ÊLHBS?<|:*Aĝ2e5F [rBUIKuq_Jg:φ}qu2(n%I,.$Eyo7\sٝ@f[|ejXPƘuh}v{YxgYugEZVA}k@:Vuu͠?J^u;uXe,!ƀ sh+\q(cMKei*ZnEMWkB \ĴwBrϰS$ΚAnLЮd 91c51RY* YX*>0j3?:γ:γgD\\E`ko %Á֦YyF ΒMaJ/‡V,ůj6d)RDAPȥٷ1Z1cp4se!< [ R\zB$Ɯe\[0LxfbMk:3e'gY{YuNM'FcZJjH\S]Le'$ܨ7h-@j3l[K(nud)`F;|Q.&;H>í!_a+դOEhDy bjcҒsYƋYdhGbS}Ie3KW&t7/SYX$M D*ɴ ̪=cȐmׁ_T%BA!,FYEHh.OZ]VYm-9#9ɷ9+V딹ʺqn%C{]ɭdAS3e!QTϑۣu>UGpXTُ\ hdVgY{Ysk\+Zt%ah-XIk -^tF6.KT2zKZfN'WGt9ѿS12`WƬ,MyV!Я59yԢV-b5aP4]Kb4>OyOF1>WnSi:9 ii}ڒ+=P6ZRf{e8;+u[ٵKV bcO0ze5"[r^U+H2GKEv*lзM[PkT"cC0b\G"L"-SjCDjŻ1TdYW`bG'M As3&H0#,:V!mfs0luhYa$D_gm W)wWdBjs;QXYKwj o`ܷbFӀƄuoh>W-{.kUb[ͧ;"Ԯn 'pu$ Y(泟=qIiP.L V뜌<)#4EM2 ']z*u5rX: 28BTR -i @$4xWYfkMwB]K9Vpk[ -zjyN5[Ț-K"T\ -ˊ5j5b%3o#y}H_F)闫r<5'[=gyzH -m֋mnVh6Kalqp>qB*a9X22&zO-{mꇠs'YxgYgYNՈ024!aiiW!S)1e:Vx^Uij$ݥ*ʾJר!X\WCo,w3f;W˟`j p:Cel"㹘 Ca.2BaFNi"|gxYggYu:tV4mrAL\FkOk>Hؗ9E -(p( ).a fSOi&3[sI9:/aR Kf"Jm6:%' i)Krdؑ-b QIJ{iq -Yfbr5$"%: 6lSlAQ .*oK\U{B5C5m)#!Z%@qj$~r_-0!-rF'Ōt/a4-'~N%/6⾴Q@@b;L%m6xǵgu`Oco$$q8.pS0 Ư} G_hG V2^(oh|U#spǐԧ:ntsNH%Մ!$Ο8!Ym >OSFcV4,bQ[ShHAsZ.[Kdžt|L:: -:+A@-#Iy΅BCZ&Z¹nA~J[CUcc(~\oЧ%!ƫ!(Bآ؛]$ϔf*8H+fbDŽ ڽ+9gcŗtGD)<fjXff\Ta1`F#ԑՔDiӿh0^*[@:tNm7!Bu 6Aԩhd>DllgYqv:}QV{$(FU 3U66QsPMfOTO_>u[~:l-RBNG -bհ=2dpZ.Ki njyyBYWx-A:BW|,hjN@B8Lx2kKYokRP9*sW= Wҹ' iߵfltOtd."iL˴FPݫ -&FTYmJ[%nw.ETY!mnKY]nX,"$TJ߶!e5 `[foJnUe<ƣDtćlVH+iㅡ=?Ƚ! DŽ:Hu T}md.]*d#Җ7ѰU}(B.bBJE Hi/< DiT01ټ$1]=E]do|i 7O&ϔgܷtR{ڟ㖄-bn VH2O Q#M!RChoBmNTƱvϦ:!,UDZmp6u=p/AWvpOĥhuW6rɋR -7lǀyn_uS&F%z9fm^Ba $CXFqi1.^;cD$*gqib0Jgt}0!/p\6]HLɐd]#ߟƊ-cuxf5f_vCS%LZڈyL]D~l$hm3*":γ z:RG5ձTgt[Z+g-%Lmֹ eI| -AG۬L+k{PqA)4Ɛ@ Hh>6{9<9uŽY1#Df=G]МƥN n^uȋO1#`bapX8Fp 6*I9 nHmn '㎟}ꔍE?γ'YVD(TX[֖=IV۵?q9믤Ҡ؞q -$Ϳ{! -kk_V bpGB r%0Dn!PD iZ껁)+#jLjKUJy ;IĨG%jsYΆ̘ybN>i81G؜o6Ԧ.7 H}bySq4ug)1@L-\U3ޣߜ{]xk%ObVAzJNj˥h^X>3ecm[dZY5ln )0 ---;ze v`; '0h85Ķ"QٙJ-6 -j}LGqld2a+.!Fyӥ|u5/Hۖ s9c.X9[O&p.:v%W2d*5D7m-7|g np5$e7cb,= U`قYy=n&/Xi]Z{" VʡwF&b4-+,-5E7GR*k+ޏ*|s&:(Kuf%7-y"-lh݂JP)I4PcA)*F@qU|"{bUr mYuĉ LR\+ [Da2-mge&MӨ]%*ATR_x{.GJčxpeNYALf8K:2Pm1LtjƝ3b6E!x7[ J`hcFƓιͮa4s+[0lk% @)J񏅞VTg֌u -fKo6V*XxtSwro FڨuΫ;UJ[P]2Y~et3Dǭga>,xȔUTCcWli["0XD']Dy-uxT1KKY%r -]f!+L 7[7 2y_K6޲"J -mi6(9O 1SKS)|IA3\<̋\+n=:~ZUۡ1i;~<3 . **m'MmHQl#uԶLYս/)QyeĴi nyR"m;~!n-CÌϫqO4,42_Hi:":Xdo8<!l#u8Cp%ΗC-:i垵rPkO4wE`.bFMy m)>S{mq_1rs핈{lan&$QzтYe `qi*5TNi r 1JQ0V҆@M~Z}=񝰔ьDc:: LJƐk*V52,EW\Fp$CL*8wVvhg<e,6OZi /cբ6u4ɱt& ܔ4!ADDxTUBRFl$s75f5~zP]"U_&ZV:slveX_P.qS%lIJfqz֯c! -J2>EL8_DLD ~=?_q}IkX -nLy0I5m߷DFR"$fⲕHV6y˖bڷbFPlQw=kJtQ!-m%;-Fm Syo*SHZՀԽ#7Jeńm)vm~eՄXMյ!d*B#59 myHTnOXT\P:/)N^0ӒUk+j]Ԯu UCtҷEذK-U?ak2a\()qQub#Isj -7rd+=4t+ -:uB r3bGWV|;pSc06}Ɛbp#3ӣp:q@Ge_q\b[hM8Lcem#)OGCBz;3qzЈ@(r.T7RbX~tˢɠy[փ+JjeΕŻnK]|L3=2%N&&ZTMIXFO\mT=x9S WX:VܶkՌ9V͸0[fUܾHCJKk$DrWt U`>YV:wwQ;HJR [Aa^Ct;Q䍸< -z}Q=;jէ8zYn'шzJm%1Ue޸>SJG]4C#_rFRU9b88/6Q`ʂ~QaMLY-EH >WhIszhe\mKeJG-C2tVAXrkC2ZMT֕iؤ }r"Z/5 -)`L^V'.ۇ3P 8Av3cw&Ի"`Um}oQ.=QnM^WTmmNtMi-&ψutf}i[䎗ޚy8Gq~K)*#b܈VӮm09[1/ef"Tatr\fl2^Ɏ7p7 Vߊa/L"* -Bb͛%yt7ċk^QQZ5jSpL‰2[`"iƃ&[*y"͔Uu -99ŔC EmMźYix4!#N4Q3#l謾Q %(Jd$5vF-շ-]=Eb2,/fwPTscq} TGۅ[1|C{juLv(\dW3gK\|te3Kzs,E%Ut$Ig`Ymiu{uڤHo=(jDfMZ_R$Į 8\ȃ̆[MIeI(ư=0=BVcIik(IJG5+D~'p~Dv s4H*-* ZV)n9ˉ?ckyˑ_@ u=ni%9[a=*z)nb.LveBML)RByմJ-1uQfiPIԝ.Ҋ("0Nv ~x Zp"Y{ukn-'V(jQ흉cfۑ +}%bJIclI2 ZWC['X*ݍ7VspcuX#7!lB*&:m@h q '}jz RAQt--dQ50CJP.KFCL4B<#3 k 5ӳaܶZaLOOeqRESN +92eP,e*0Ynjg4 RH#ΈAư4N{D]+zIӒkIzΝ)E-M4ۦ#zNiKfU۩rܷng-^K2l6ܱ,ꤕLW,8rP+2".\Ro"Pmi:Fb4&Lktt]E<ԡ o E3u RАSca1|^i*͋l9m3UVϲ}šWnVG$X :f桺*ij\F1m舕km\V&>jM!=\y֥*=A}6-#TK m @0_R5. Q41#YP7`tUXEBPz[l%2&n_jĶwު܊}ԐCK9B#\rjLfOeFYV*Mk~'bU ,>GBUa-ZnEr^P= -zÕQ5)[Xf\#'>җ5@DDM%>qEY]RHRẅ^ZDZ;C &4lKAիWvE\md3q)tv F~PIisޓe>uzeVP7*#,¹q}R[tt/.d "kщeUmM`q .

/'FDD(#e\_ARkum51"Ä\A2 -fG%>FPH踄:h$>ҿ3cRQ2,E÷jR[^ðRgY&ޖKҒ2-ʫ^3gk'uA42fS,M]e,2_;OqVKm[`%*fS4 qdrzdYb Jd.1uHN#gl. -&N+p@IhLmmJmuM: ԾZ9=gD#YtA:}KNp9F6NC}f3s,] - K/YY8#T!j[}=t -ʤO\¹"S1b"K_N_1">R3L(5q٨i,V!3kW-W˅*4wX^}؞^r#tObeWTu -MCU<8Fcn 5[X,Z*cKnaDbcHW2sKhS4þ&Ry6#ƮS0&d~F)VQpFb_CAޏ<3$hsh;6;%y*PmNnq&KqۓKm}Vm -E-,WnN$&|coTg[-Es@ՊU:}+I,!3̛ [ ᴎʰ"[ -U-5)4!Zyǣv8fnC +1XUM?~M.9}K(\XX<`/6zWm-ESqR{G>%pJgU2ú.UJPKi1% wEvT -B蜻CXZ꣨iF',wX3-yڤvJ?LfX/ShOzs=\-}ZdoWMsz/3aDqQ MK"E3$N6#16yڨCP|H4[q -7!vT4K*cii10_qh 3KOXQmBbݣޡ1]I[Sy+kujƙ E}ŋG%V1ܓikb"&Y]mv 6Je mI@D,%CF~ kq\R5l7[,8ê G̗B9lf½[|bGcoNm~A,m-̥jcDžVd#x1h,^0c2\Jp6#EwKlm1VSc!SwGV%Zg܈ -̈́LBk1kNcXדz91ĵ|J" Qtl!o!QU>^~R^BcLҙBcZέ!Vf>4޷D9Ȑ5:F^ujޓ.KA.ߧbO ŹJ u? JCmY%DKun@ҙKT-W mU3r~>e5O4nmʜ4rBqIiin(%1Sׯ5%@92(ݜpln& s_IpKHTjTtrreĠuz Ǵ$Wc'm'+o.F$[%:K/"d9aSbsU3ۧTxXP,Z}y s)S2Zꐕ~g,cT>M11TdfZaXLҢжW&;!Ql͔&*će*HD3C¥qZ>6NUa =Q24LXe"}i -vXuL,<5&3R(Va𚘨-Bm‘n0z~o1Ύ>`)SN-%OGb߳hb)g_J`{8>β ]_'[E0({t!ۉ"<=@P:CeCCl.|<\HZOQH՝SѝZ4U8 ]Z8\Mfؙl8"%s9""#`>.ə>UG`gA()tM6B_opuƞKⳀ_yd'pKZJKY^8˱fD!Ϸ->m\l%)ɃWȗ.ƹY[ Cۙj5ktۻ.JNsOdqZ솚kWhUfE͕7QE3vciz!mWʞ.}w+jsm, 9nSl.`1eo࣫\ctc9U)ě2q Wm>\4-) )գB[ya Do EP~9'O[tWuSt,;=q= }$W1p\l:5̈́96VSl۬"bEکŅus I]$IeZW5 վVaKA62ž9lCp6]aj"EJLQلؓ?!rN. "UȒ{ȽXBO<6 JT~hhh:cu0ۊvտ#gz+B!a*QY1UIw%1#qcSfpMjշ^Ox+{YĤRJi>q 8RMn[!ACqJkO& vIʆͭL_A؏ qǖ@嶸($!iX7ԔGyLQ/+d@n!zT !Iا1vHp䔊u^yvˋ=h5/la}|9†*RaW?xBu`O7)9L+ >u;]{1ImEHcs3ik_9e<8vb2]#Nrq5TʺP«6dwbnh Ern:T?#vy1[l]@?w$3ep-\ӿ]^)HN1PM՗7z89,kPiXvIq#"lt jqa -!mA%ZثaLǵ{=/c;,Ɣ-ʞMC#-SꡇVҟFu.$6cWOۯ1](C00.7Zס(i$v&fŹ!-M.vbzN劈{qKeΞht(*AaBi-Ȯ9Sl߅F՜IЁW%6U$-YICzPf-yNX[eRC#-%ak5`q:ƏQT:(AF޹GIBP8WÚ: V\ -D銫xo#lGsEMʯ1 l-{<;WEbEq3 -cRD*hKsS.;1 1YC~/8P -U H㲽!N;8gg$ s +BK!=rF$'끴DZKu@cn48k O +TډC~]Z߰Huqٱ+^!ٝ6Q -*+r5QyBR"SH^H:)=ϧ>(òΓaD,֛.)XJ%,HϜrb}K,KذX뱱sU=a=yul3PdTp/lz43`9lRr7 S+U3\G-g8pfńЌz a>3:'AaZ'\(uCc\) ͲڷCzz.1`67<#hzSU 8߭Zv٬]aTl8 eSk_SѸ^!Hq%P)y1ٗ T0c"w'rfjdOCtՍJuk坾W;))Rʂ# }4S"Jbo,h$0k#Ɏ}m\s|\H)rJk3dEě KF0Qj<ݵ&Տ򢘁P"J*Q:]pj=7?OV!. d]W+Ar. jCo7eo0L:#w=[b˒J \MTXiㆠW>ނ×U2u[cu!r] dC8=-,GF=FV#Z8q+V':vvV Ij9jyi=e0ClR}sUoopiNa饤)qR+_lƇIgh2ؐnG/ 6&UÓ9ăwV5Vg`Rn)ӥ?3X4->&*vh\m̃4{5V-Bs!xvȲ_}Qj9!)L=~_RCuʕէZiT GQ۞Kr9~qp>Ժ;y -*2cé7JzVq]=8 6O} c<%z_1 -uS !LH>#77QTWBcM9 ~Nm2'H |hp8YfwpԖ%svlSd}4ZO $Q"9̚LXS.OIl h)'KDʉndk0jq]6[F.3> #pm)P[FF#m Gyn6|g|TX{pYE`DG0ά+B3vrbȋRK"7iWL;XdP2[Yəl'bգ3j)ܝBWNz7̯`Dpy 1s*uI  -]jRbȗH|Qc= .|LV'o fz_?ߣ^ejC -F([IvS>ͣt8ZC2om>"lO`F:{"9eԺK(K(ӂ:X0HP* ~-ȩa-uPua.E^3%;=5R 6}: [֏Ex-A^*-S_X"vx6ꌵ1%Gj;i,E!&8ҭ,f#DqL[>OJ gp 4jնP'n$ ZBbP| -fH6|#p0{Db1Uaխ*'Cb`6yiCN_>ڑLz>1F婓xݯm)H~$NX.*3Re׾=pSQOFZ\z0bҽO*RIbuj \&[Ez:p꘍_mBEV!mzC(G2S5ʞ5cԬ+s=jNجaYoVӶeVfna&Vt![o#Naz(74H؛o/lLHי5r`5ei*|>OK8MmK܎;_YxVr%2U [6 uTSX0!A )t(tuf[e Ƃ5\;C@>=g\h8wvդ<,.dBnBu-7Av>ݧ[mb}uh6s"k.ҍR X0_GPӡr$i05pԘ,RRa"f4YQKhN\up2bm}=ՋÕ@|2Nctŏj8(mfG5hJy뭱T.;zK%Կ\}qgrJoe6]Z9S@T m#saZRzuvR^,vdGM nxbbB՞TEÿZKMtY .Qb(=Lk @S2kTU(5c}s^HH;pΊ$oe-m&e^ھRrֆ;q۟G$.X4J ~!5sIb;hYqg*bo{Opt$#W7K.޼إh YZ" oFm&Ki&сm#7vD -{[t|+u~}1m޲]7?G}ۆﺷiy g٬.%Z8b{ 4ŅCȕJ1,'5a E꾸GՕSrX0b&;}S^ѦZil_p9U;c V4 -tVnȣ՟KBV|gҎ#*x`k<8<ON4M:O-Ϳ6-7Jlv;nUnoɧ+/o W[a7uG c1dq \)zc&@tgp21 wnM}7O2''rE16O=ep3j =X n[#q_1r=ӏЍYTo  ۶Kv/ m-(4yYHqZKBFEj@m mCaYkM|D ~~055=?JzCߍ::γ:β5at:FDh>H!+ -\Пߍ8m>ԏjG˳:jͷKoBݭ79.mڍ΍tr/LZPwb"{Jiԙfd(~vP©O/I8Lfb5SeQnWycdp Rfb :}֛T}Ƅ6=Bt0 6UhDdi11amtMF$ r\*uʝrr*^`?ˎ+ן@`?d?Oꏢ`ܿ܏]+q?ӊ>zA뇢γ@V+qCCCgҺDD'SULҔ%v Jk2"4:V[tU5&;#[zqۜ(I*nű$GkdLFuO8쇠Ȅ<Z~ŇCv}aQG4<11J6t1)%{Be'1k!1XWSIӪn:41-t{j":)r'`k{+ݼ<:2uΝŽO!&ryK Oxc<^8fvzqr/mn0ğ>AI^"wvCxOV._rW)9uqYEm2Ld`$欠o,R~;Oa,ݣ45m<s79wp18g7F$5} %^@Mkp7#ݤOIuލʞY͜>'J#8l197)׫f>/]SY#Em\ɲ[?.lg+wd_IYpz=[eE6RvD3fH8;r\]n [snИPQU|ꎕ>Fn1؞k;8b` ̬Vъ,f!s&Ʊے2V%noDڧ_ḯSW\! .i?|p~UgV ӌWx8cc;85<h><㷍c5c5cX5cX5cX5cX5cX5cX55cX5cX5ˬk 2t=h8#K ˄)n3k T6ҀR)X(Vci-qjB#ۯW( rjUMU{sn5T$rx'BQC=LڅCt bGX 5cƱ5cX5cX5cX5cX5cX5cX5cX5rX5cX.kƱkX5cXԤFOx6gk&茩oBcjrCN#'v(nts8"non=5di[޳}6XXBUud(:>,::>v xc8XcX5cXc K(϶m{9* -quM6 c7,8_iFeȖDܑ qƅ/6Zwp;ZV;[> ]p6f-CqL1Q6)}f9 )z(yX齐#Xq{_'o2+;>?l8-3;Wu>u!K퓖qM |͢sU/)Za&0L]DN\HOa%}OGqy7)3~!䎎?կ!tm2;j8%f0o,X}ħfͨ:ˁ>x*.~qGC?#{_ghG#x6'# W[cVL)׹C?D%۟KWUe|UHmtwe *vcK&@>qJ\]u.H- -9 -ɾxemY"k9׶HږCJ^B3{Xhd"&XU~T:b߾_f~/>(vڜa;Ĉ#L5NCbƜ4tU/)U qJqۊɑ~;{EJrUxT2MTkmԭn{\.$i*FTD(/yёN\j8qpZi 'p=gk8DgSR86j|H2T|{[QrŨLjՖ-G (ոXBbu=XGT~5F!p9NVzuvZ}3]y򘙃f7\wPR`]NY\Q [婸n,ę.3po |8N8~Ju'UK۵8kٓ[OO܏uª &#&꭮ˎ- i0S׎ n3rGF7mT=Eg o@ nl -SMqIeV]MIiwoځȏEzҚջBK*c.X! IO;Θ㦵BpݔiOFgy +n\ޝ#y)H\D]KU(=[q.#v=[%%ۨ-%,򈓙XSջza1J?j6=yw+TAeդZcn l-қ݇P{g> h+[۰h"ErX%![!賛U[G4Z\ zCRn8cX8c>|q]?3Z{gΆadq*A@qRB_iZS<%iWVJ}.e"S+y -W!"s$c(CNL[s^- -wE:U!p"-ʛ Tp3By_O3:F4 !׮z@d&͵J P*GBݟJOv;6'HQ H 6QaDJ8 }٪m0]S"TBsCVjp0[Am qiÄ)KvPXG F^yb<2cEIK::䘯^𚕭^BG#<$Cq*5[5 -[p8DzP|CB}e+wY2X*i")|W+m"|3᪍jD>8|,dhdk:NIϭ{ -}0^WS饞 -Ͳ% "X(̴e wOmń!7 ̦5+rŊ7lE&dn y4%v,d:oĺ}F[f3ӱ/;2i-o6Hɟ1@XuЄFKy\KJ= GKvzQoF!\%bݣ5=#rԴZ -%Vați؟sOVvJYjP- PܰLDvBuA;~*^N掆sZWFlۧGn݅?(i6sJۧemXe.7ʵTT;[e^SV*3-l6cr6Qj%nkwTvη0m7uj! ܳcm^G%3).v |u ƨ~?8H۟X"ŷ^j1k:Xmݘ-6t}Ԟfj+|rmnE1*'CH+m'/+ G=3r`}?GFHwrރFگ6E:8J۠W#.L*VzR;݄V (v4)e`\Ry\n&D45h8A kG8r'\XH: Heh<ə`UZ7%|eXM]2➖;'HI%:F;>g 牢,\b]r$f+8:Fۆ*zH7^W*| Gaa saRGNΌrA: -E'IZT-Iee^!W?LJ.7XqRĈ,X"ybη,ۍZ`aM;þ$5>kq,ʰLH{U=mN۲eArRʰ,zxذ&kga+njl^.ęRx<Ε}KlH͡κU-%*;m[? n\R B\6HTibm'#[ܮ,!5p@䶕5JgݦSt4$GntAOٯאW)!ДRٝf"75\>8Ϲq-*%*ރ4Sjop-2̈́DTgf,!!iu|-f9& -be56zX״3`څ+\׺?ӵa6oCTkbvwGsN#mӸScΪTO*urdSI 6ʙl%Q׀M{I㐦Qʹa-nH.&ȋA ) pRzo%K*\v0*T??٪#]]]8anŤ9jKk OT%i]d%\G +O<ƝZlJ`{||n.HM(ť~9bEgtb+ovJ@'b w?P3۞{oy)D*cH@:NtO+;s|nenֹ^ja(*a>,YQm,V2"io1UDZyDV61%uS֜Qg&goNA^豪fkmm 68IQĄDqRAl4q:VBBBABNi:hw  54 `h1qd~ |}<#O?GϮƱ%'Ҟ#>1O$ aӂ.G@{ -q'#O8m6-v4ҹp Kd" 8՛.4<&On bHmopuԲWL-nNi)mai*ѶE C2P6sPRSf91.Qm[ӚLԾ -PHE ZmB-2[u| ]l%* -:m:fʸ:Nt\||Yq FNx!XՔwJ䴐GvCiIq' &dUp -Mc툌<8I$f1[icCO4Sܢ*t%5l7az:vuʢ!k4VXw"ʚG"4*yNTL*lXT ogo>:\'0җf QJDȐp¾`I3(gy2gLtKrG KZ0f&6skDur퓍**Sq<%njy Im-ȏo Y.uԴ-h!Ah҈˖sQKlG 71]DY6p#0mJ|0W 6Rr(9gKq]W[w/Qg -Ճe%Q=RN6ꥺSm5^)lFkMeo6)U$!*4̔VKdi:ʔi Ok=lj5#@vyE : Jxc] yDM6% OkiQRǀumbkL-QʷKz{ %' PZ*4*@A/Q:?'Ҩ ToBBiBaa+% Q0,e&$TUtMvn8{93n'!|mBl1#Ju -61mai2QGX|M]$D,BfjÖM% i Kۋ125*SqдĦ% 0,#HRe4->#mA/ĠДXc^ԇ.6͌ۉq.>@Ot\BuΑ kh:N:hg@nϷGx<3::D#Eh -q5r-mk5YJ>^aʈoibSd]uM֙ϫT=N==eЮs#ҐvsiUm2U_xk㈛{N+fW,]s6w`-'wF9f[__+?O|EfEE8V^bnYQ~;wy` 2];yU8>勳rNp;Gkw+"Uutlo]2ZgD>9

E߷ct]}١QWY6Tn|? :}.Fa߳<|BtIZqi?s7QW)4f6mq]S ~w$rX$kkAng1jSߵ@ߓ~V(L|@|Av]ϫu}u&BV_qRGayo]Ϭ [~C/ 1n<w>VNj+}z/ݞz|BU4oii٬[\wkt/}娱 jcܜE +bwM}1W?%CI4XLm!6?ӳԬOR!nffi~NϹXgvT/)qϓaϢ*~a7n?O#Is>jԑ;l og}>#fT#]Vm]jRc`yjԬGGݬ۸,鼍L~m},jҫVXz!ʋmaζy՘7 r!"s^5Dj,!}> HnWŗT5`^OoW/.*r%w@uQu;mn`Xk\5!V]p?pm!o|cR>ыvSQJr˟Eush;7߬|t_ƪO| -o$۸>~!UEHzqE my~v?)f.#eU ԒXAڳ>:MeG-nn걭_t \a -m+P͟ j>vcHS[| jc?j> 2͊}u~zX渰u7_vN[ܧT}3)6~X>DjesF1ÛG_+1tֳR n,bXle_t9b?ٸ,`[Yfko6D.?ZJnUY+6<-LNVgqwkgs/j Bd+<ÈG.nsѭR`nLogu)1 5?>ԋ*}g½㷂bW|Kї2l@8ڣ6[ؼc5l`˴8?#׍_V ŗwi^[W^im(ӟE? cᣖP1eAϻ@_ a{&9\3ȝ>8ŝ}U\+Vd7#1){b6TҀnkͤ~'1g"4sp~BR7x./6 HCyjBJ/! C[C;|F`z1[G;P W$&F>5n]dbS糼~#K7oWGW?N݀uV/@5?9DګT$o5 FRCE+)&?oApߑ &9WvgᔞQϷq綠ܝ7Oi;DdsYtOv ûTO3b5{A>Ã6v͎8,IԿ\܇:??\c r9/Q"Oj`%9ovy}pj#7Psփߵ|_,|*+/%P*325f];VweG_>8/|;_ 3uy ~'nmp n;Y筇*7eGsS-8^[W)̖>Ϳ)17u1𘟕JvcEb;2jTU"lv"~;8NM9W-{qi!Ds2f|qs>VIRȁUUVwE“:s6osyu\;_Q6dn՛- gy&Ji]noci# -+Y0Xm/(&]€?=}΋{1t.Fdns0v7;/[Gl5#3F`3Wiqww'J?5@ڽ/-up}?ظ>]E}MF#iq</O<(tŏbݳܝvx̉>)N=x n9Ry|Q#0.[MCv)%7(}_T5!Ⱦ]b߲iĶ䷩!Zپsw~GhBk&]ܿζ~~8>U6SЌGζ}va G/ߵاF`]윲z$ꍦ3duma=rno%窈mC6Ǣlj}L3-u:8[ ơ oj.}1gFwɃ巀T/Nﭤ}/?[FCӳ47^R";8uڇ9'8-ÎJ>勵^1_MͥI "^8[t[~PjRH'DN[G-;܎}l9#Vs -P}0w4~/#UYy*qv8aњ5*!=m:/3R1ۛk Yku_o/fWھC[g>RM뷪ǃjjt|&n:caNxo%G`m+|_MR -Gs\~y@NO)|>;EǕ9٠t۰o8-2f#%GTm2GWICJ4.HwXp ?`30f=҅YnY~ھKrĪ' 9|G~~IT =_<ڮUJC}[OnR:N(8z$*Tc7I,;۔SN,1?x ?>OٛkG_T!Wyo+C(԰"wy^[wyÉߍ?:C]֒N+Ϸo 緗Ѵ~3v^y:o'Xn}~i?+bpE6AT܆]xDrί!Smy 3/ -l93P -9R=ʁ[X|;qw50+ m {6sS'?Cr"=vH>{4Ь{7= -?{#o$u$_x6܅ut}?سJp6۸z|,S?,sw_;ab_PXi@{I?Mϖ7ۯW{IT?-7Zj_.pB~R?Ox뼦]-OΓSe'ʻ!#,nN -AijRy=6wպ:gtcO2{/'{V?k/=x99xJl7_unVr/7o33L<̛-]unz\6h?G˾rN܇ 9:3&kk~:uwɱ~?ۿv^8^;˝[3fw~$ʿ->^Ww9m-~)_IW'?x|.}g6ęktwsvÉOr -+# Xfy]nj;xy-;檿%d3<,s*PF;TÛ*%hav6[zޝ|m9N@rU&G>gxME?؞{VV;_Y?qnPx}E õvj}LÛyy5^Ys7{<.99>MFtKx}ݝ Fq|WrZ=FZrYݩ~՟9|~'N+ ?v|ڶǴ:y׶o zӘsSpYmǯ4͍%H=Bs`{^x=fwoumWhn}b'}]N#y>WwՊk(&ѸN!R-v݇+g?fkqp|M3W,˱O-4f5{w?uwP&|w"^7}f Y=Qoٸ[0|6X=giv{;u9jN2N~?[[2|8z1'dsidzy]Ue@A_eFFRьgѭ{3<Ş}Hk2un}sh#9]Nj E onI?~CW䷇ٽN*uO{CM7Ty.9U?#[}yF+;6䷏ݍyyZw*O]M;.9}7n}(R_.lvw֝mD┙4N#U9Sk;m䶁[o㢤98H=g[{W:bmQ,Zy=&(0mw#[|Bۊ*w -͖ﱺY 뷧sNIU5^̱l~g[yzR:E s~"unͦO"ftaۃsk#U߷ycǿ>N,jl|ӳ6qigod|hkpD]YNlwxLsqJo2WY|R+!sc49ݶnYmOldkgdvo -"5W|)WjSj"&{P !Pǒ? ycnV%ehqWo/1{/)?&yDٞ`k{}0ڬ'0o5O-sno~Je U=|_}߱<Ć>έO3wK*rkF>?F8~fAdrMϢ;a@Of {!{s>b&[K纎gUj^^ɱ qQ?' -he=gMl>Qí+mp)Wk7vYmAM5<9ӊ媼[ƶ"xնp=vw|Zj_y -~t#7cຫ8m -W){0d;}?k{aʷv[p>)GW;J"űzѭ2GSOUy[4է}]ݜC*߁wy't5'r{{;,6wx܍> y矉#=(|{@={lƯB 1b=ɠD3Q7m`]OGoJ7~rvf<_˸ROלß6ro;6$un8X1|MEZNݠ=>/^O]y6@Ud[U gG%)O=!pgzy}?ZpwW|OiN1Gs7W[9A}v?'vfym?7]J/(ڴOŔ>Z>* on߿ ju?`sbes{>y{L{63o!6պGUlZj)Qr&5dN)䷈š? Eڱ?p(&f8r/Z׻ڕ69ډ[/n o{_okmʰ$EQ2|Odw*n'U*"8y;˽sTq~yٿF?ۿ? |T< v'vtZ?oc--M]o}_enfD!۴G{tU4b|.˯]֛78Ņ櫱Lڀ$}(!o׺iևGϵt4/-b3 Gr by:hZW'iy+fnT"< -npGu0Ɍ2ŃaZ)j9;r{,rEdolUʄ%r3`0IDi16 -ݹ5BiޙX"U I%!gwn:XC2lͦm~Ou]u| <{GM>wzrNPN9}X(fC}#)dJR-i-[-RBFJ)mЦ-/B+IHI8ƹu544R4]il]I[,VCğ)N?2lգMp@[R:kU֬,ޒ50ٖ*# :Ν?׸N'p'g'0JnLo-k= i*Kj%f\d3fĨhTjq8nBzxL RJZCiu.ɵu(&cb4U%!1vH LZĄ|oķ!|1:jvHdD - -=[l7=>ČMV!U6'2[axu) -I!>̘SS%EQkp*Sg6թ$ l+ đrĴNab-Z@,2[z}،4LqM6b85jCiK/'-pLkmjn}<1~\:6+ U -Bm:Y }tJeYpDY>Y*1-|Ul͑ѷ*ќUD3*.?ݴ~Ɋm??1?m:%v<zkirvΡۍĘ0m܌1 -ěG(8fMW/A@G/;v琵j(VeK΃c1lz;Ʒg_DKl69Hv,GLj f u3I S}+FuSE$eʆCiDKѫbuX2IUuieL]aO^1LUZmk -T7(RjnR jy=}7&lCA5'Qk )U5! -Z5ڊzr3ka!#)c@c\ 5 c@k&tSh:ӤRA $=+"3(Wg> &tS]cXcC;X;X7 D?TlΏ`==GG_Ѹ<F?P5N}QcsJ}hSjoGV?~D}Aϭwޫ߻'8B}H8?|g`ǣ?? 72?>ұ7ҟԏxY8HWߐ>P?RƟZ)N!e4Ć CQgس}: '@cNuѧ@(H.ƀFcƱčcXg;;kC/`BBGb꽝Liԕ!Ũm!ag}bh8;-`p?kFz=gYrc1Yu9nu )?HS,JMj3j*KqOD1v+E甗go-c3j9CgR%Vn[m!,FȨHxjDT1-n 0;P@ӛ0pRFc =;wm{_ڤNGp̢Fq Am~H2u2.)RP33*y€Uj3۷JW9ZY*T0G"joA17㠡T%.$ƎI 2glOAY)[ WT 08_fQ/Fl=&ْV48S&PdB E鱔Jƒ?f- -W عNIp{AܩS*;}h -xA:p5zqmHZ)Cwi䫕5qfwNr(+jt:!õ;Yֻj=&B% Nգk<ƚXJimğFpSk Lv6XBZ@lJ2ӕ1c7SΖ#֔**QkJll!)D4W؜D۩Ʒ\nv\\5o!R4dCݷ'|s[ָ>R F1=R:UB^Dj?;S̾&4$NiH &)ƱƱkƱk#X':,Gx楐3!hvȔ[jX|<6!3h8\&͠YCHAAARJ ugY1hyc.uc@k ƊPm%Z1ZV}&+)"#IXt*e5%g5lYpO"1oR,U|ݮa`4l ђ_izSNW#GA%s&4,U-碓f򊛎J1%0)QbAm 1qoɓ fQ'%b$]:mdJq:YqI[2` s$%3 XIbBCiil%ŭ6pSR[u m E.%iR@X:ιѬ:KcDv.]hғcq=~+RX,<~j[R}4Gq+j,kx] -9LP"ۯf2BU2tDX(K@B^<舞i5S*r^xTg0W+uH(PC[Xj]-_5O$Z7μ<Ę= -+@lc-Km`X2"W5-ir'8A!o:n Ż;JTaUCE%2 )nM֦iMBvи4w15d4M%}20%*>ҭsh(CYxgY6( jyjqmIrƤ}V*G|] 6XkL^pKp=i찀5d+5L45rZ؊ۣqa)tM^n@ z O0 耴3^lGe+jbe0ZS1[RV\&exezd*u5Y[*A!d){LJUeX7ٔɓ` YIyI)Oک>k婾}?ZI6Lz]:h4Uʖe!x?EW9%GKin5LsI3LhLǩ:GJ5tڐ춛 HU=`MZfǐrWP+T=- MPcV]жGE>@P\'fr}mvH0Հ%/TfV}&T#S8M@Gk &0D=̥% "Am1fOv$ V_= -V}( G3aV3R jPUs?-=X -b\H?֡6DDi /͋"aٴ>˾GyZd˞Ou=i.c1!x?WU b: (U΍}C)[糝RFR06В CƢ7|ݏ^km*+i%[QƗm-RZƯou:y, 孨PkIm8opsV/tmAcj\0HHq=iHՠ~ҞKO8 -y\Fz:y S9iLDBӸ]tnDo:G"!G9edzC-k5rc4 ,?LFպVu+f}Ҙ', O,)pwt-)X#,I"?+u) $x#uˬh r c\ƹuˢr r$cJHPJp12-pY$Xʵ6䢾@ 0h]cuV..smF~ZܒíJ"DQkp`ŷذ }Nx% Y,kdŢ[l,4$B@,6`%^nrI܈.y)%9m J弡RQF?jsÆ*T ݌$ɂct5΀TcP5ٳ=8zqt `!#B4(l'}QЁxX kA:.u5ˢNHJqCm ZEdtm%ڐ°KYiZ~Rr#H16pa":t4p;Tiٳ |_>c]Bk5FߖwvΑpj݌ɋO䱄G)#ݪMbƤ@ګ$݁ƱO=gYOc 5c4S4RI zDfR1ڸ?4K%HBQvZ5+Q;lb>5)Ŝ p!ee- -5 BcS7:`zcV5*9e(Y9,P"5=4MW29q4Zj3rPdf9;l:&`G6c0 (sPY )a&tzc=jc E\H՚9n{8tmpWTZ Mh#5cX;7Cdw?`{'8}xŚU%KnEgc^yj -P*դb(ar8,A@w4>Gw:(6"ŝ&I$'qZ-1O"svU*\l\ޙ%BcHpJbUe۴epPG&5f RNj,5_M1e'%mhϏNˋD6So! 8RhAHtP5'Ii)Ӎ%ZTF%Q.@vɊ"uoo3^ڛˬ`M^%a@XEdv=ɍ;]ܖE0T`;'?8}Ǣ)9҆t:#CDg@hcS]c\`cDkXxƱkqvqpoCF8.u(@2"xcDjҡ_EL#^F;&P}t8gҟG;%9 .`6|^BZm Ez#8gP-_Q*ݜ"Ay -w ]C3ɯIfFg#ut.[]" -\u4ZB"YsUlغb9\[@B`qyUڏr^ 9 $ɔٷN:Z.(0Tݎ%%ӄNbD8#BψZ?$vFCX2ZȆDI}.CEf%8 7)+:ͷbK -WSTq\KBz_/N=f-/ڛ\d;|k :>Os1;A˖`1\v o E/Ls% IR>ABW&8,%tR&u -Ru'q2 >JTr) CKMFCŏ"d:Nu548cX4.qĤc@p#@kƱ4c1lp'Lm}N3ýj(C2#G{CSFoT=tNoNb2)Cd|e%ݗ1O[ Q8Զ LqNjzL~x:j:K1DHS-nɆ4"Ky:lvۦPCN'Ѭ*jRBZ}(Cq38e`ն"٠ybn0k|gsFys$h:4B$R4Y[BMQEVa5.;tJ?L4|3eHuVJ#X%.Q+Ƭlj4>l>ͳ6CcuLd1=} -U"bzLGgX8Qt.zZlCQتC*:Y/Ez&-p!,5?I#YqƱ]c\\E r. -i$cJ5tu3^mL|y_yFjTxnj -;NEqj9-堕0>IZw\5݈m<=^$q<l۾YbBzǮσ'X8cX..tS0ڴ^"`Xuk:(tF`Gq.&gE}ƔٶFB*-18> Tv3>K ^ dvr58W_϶8Yb7!FJd&TeC驒=פc%Lҁ-`$7); r7u^py Y? ha}*cIjTyOZ2hwjGx-I%-:Y[JB뫣]i#E( r=!iȶ?.[=q1HO:'9hR0~ŪM]>3!o5*}e58-ZZrdu1GS< uRUŷ,9)ܔ,ZuHs+~dupO7>xD\.*Rrߔ :\o%1 jgتEӋi][?mz둜T(1ջ+Dk;N&ٌdBA} -֞j/ؔkEJTRceahn>on_c8Zyζs[lg9r*ݩNr=zҸDz9[mሕ(=uw>xvIL,)LWhv4Ω톛錘d[SBlAXFcu|ßϦ>ro"+rO4:S45dݣSY^YyJ<6\nH;WpƱrcJa$=@BR4[Ύ[{'[XedxG;Yέa(1^Qq~|t%0Z5ڷ0,bӌGyaqXqhv*~"NҸpH!wi⩴$cu{'?|ug)xg 5Pzhm'Sm;cj>ͻb(-Uʽ)a ⸕={_||S?eWAb"UkKHf#Nޭ*f=_GO6Wh>ZQJ,-!S`Dq.yDR $5I~S?=hhkX5c@xGl,C6'\<γ:*0Vtg2BCAp:[Fr4HKQSFVT'IZOn|菄82 tEh+HHG][2k4938e2RZyOO:Ö&4"uO;İ-cjtphOO)aR"Bُ=S_t8D?Svqʐ>:XAȴh;y'k%/ -!*h6RXb: $sZ=,= jyi; !\H] #/Ɲ g,_0PQsn9DDBA賬ηr(뇅.ZXM.kq$t M5 k+^߮ GH Vk \Ԗ_矄@82ʡ_pOOa.rZj.3a ^}YBgH-Ѽv nFǎv;[1fx?%-&ܭĻ̺M3Z/ 6Xa u%-5.T>e2צ'O{ڂXt-CiXHؒTK&oQ;MQ['gw*;cGp<[E%LHyJmsbC˥mה=`hvq$dc@;U#)"'o(~Y;'|l*8Գd@j+7i~3%د*5l5X#-\WL`KuhH#[4c&HOW*XuEx: -K.ԀܒXymVuN"݅G.lFZ]V%;#-Ʈh~`~v>z| -Kע21u}H$u~k%?FqÈM)(CeQh*,a&ZLt$YHVkA $ 2i'A)Ch !=nu#G(I{DcHκ$t H Fpp:ƱvgƱς|cgݺH#Ǐ{Dς<1#Cg}t=(=^{G底}8''ugF4c@!i:*4u5#FtDiAћ Bm84ν]e% CeR=hZu'hĦ! 2aG<2;G`z|1ʾ[ >$*IatN=b6)I\ j5$]-Ţmd8˙Ѷl"[-G -vlAg[YWZ"DOq\F\EpS oÑ6cJym)% MAjGT$Iv0j,Ab0'Ya<.r-bM;PZCR&lZg8y)8:3ϫ|WOlvsEgV'kfH<.OsQf&!ɝ?VT)Iuߕ*KW1]0 -6'USJ|ISi؆v#P"c)O`3S,%߱Oɵoxyc1-͋ L=h{8{2iTs?5Rv&̚ʎud6EUi.%`8:΁}i[!x?υj2i9f Өn? \ш`7R3`IPKUxXYr4{w+0 $::bDQ&!IP?jf,86*_2ϻU_f^SO.IasE{Wuh [yk=Iq!K%֢v4llJZss@{Gӎ*n#ӏ}3.>Z[|doV &/?°KT\7SLa#vtpzRzO&88$')_]7͠m1 %z]ϹdqMj!InC%U -95uj<%bBBZvY[I+SH6>Lx[c0܆T0ޫSg]m- e -eR|I W<3N ^ ҍ:Lk,Ӱfh:j8Ō.YHKeN-[~{Ϳȉh OHQ@ WyM/脎kj{Z1P -fmO+Wm,%Q!/|~OS=|jn$ntuvS^9IPiUMۃGKaf2q+fiF 1;F>\b'_Gth+?R0hy -i9~I2eg"l&$I>{ާ>j3b>z+n8(s liϢ+ Z!Kf%1Zà"ȊB$5[jC6m)0u0ZyMU[ Xʙt[Ml)=i6-k^Z̋E%1jH\PDLvPNT -Ƴ_(8]-ˊ*^Wpt.mxe5?!Ϧ'|9YҾ[/>K0۰Tܿ0ӣYgmPR^VԀڌzGt~l -by2M2X^)dNNX:J + KhJ@5-rC8] Јj'Gc[u*->Y.8^7'`*s(Sr[s\Ait`v;DAOdsvϏ;U*׹Q~ĎQ|ÍiZEYOFH"WX8[}P 1GWj؜@G{E"K·`T{,d|e4d?>ԓ*F:H`3V.(#L */)rϕA)fyfm -ap$GCuOA Rݱ+c[v @?ʕi Ŕ2> ItrB`LZ.@\{WҵHHBZI1ҧ%լ+Y3C>Ɍ/H{yt;S~gܵy}ρnV^"34\-8svWrcrtumqRƿe1t U. HHS4 )#/V2js Gm֚A(!12J0ݐq@V@pj<$.2B 2l6o_|>Pˊ/gTPIODӀ"Bݞ,3[cݞμYy135/m"ىK$AXV3q3 S?`uMCGD+W*gfVfftp8"7-ۯ)R9$w5 NY^bLuR;lrl%E8s-d;TlA#2',$iZ?rGE\gjWy%iՔ^ .AK(Eet;wa~h:HL -̊3:7Ҋ),TԈӒL7'4GQUL THہ'Q[h S@ LHiɌe!8D"!FD j6\fA i惍Ƃr8$"2"h= h ![HVZ r'Euՙ[Jx Pu0ȟsbqeLEqmI\Hn1Kla9=MW8>UpLt80F#N$)%߭h5S̝H{4:0,Bo ʚJPV\v`Siܲ RV>\dp>~ȯC k#Xk1 kƱkk p#XFpM[8XZ4Rz--0&XZl'Jmm$7xHЖKBDĭK_*zpq*q) 糞{x4Fu4[Jՙ:\dDv:>#R GBRʋ 6%G7!aBY6W03=)ՒGW@12Bګ%8Z+ -r̞Q,`Z9Fj\{W\2aA%iVhvH8 фΓ J:1`%H|GJ6}:!z_nz1+~0K=c}hHu?Q@SQR+߳M$>@:8R2jk;& (!}GKWZ/L51jY\a:un% V/X1E#K>kOYG 45 4BtT"9̋E&=12aqIv,6Jt=CȿGy'uh!eXhv08䧧CgJkeq䖑ʋ1}"l/W[-,&-0;aeMhM~BBQ˘h{16ce+ gFgHwkv:9AZ&SqPl;U6-8=?sO}#o FkwhC+}'V{F-־~c9n(FթP<ӟDD1 h2,%;1 :ߒ˛*$?SPdY%s!JH+_OV) rGnjHTg:t<ڀ9)b\¦'$%V̤ǘހ;/w;GG /p''v'oV*;A󡣩Jd8(V >Bbtv(N@H$@bts*\! ?>r-D 6by=˜NIKKW%򚵌=Ժ0,>Iop-.g3 -[ae u{̧y:E/A~7c?e_!XeMm&2Ґ̆-cIu.1I%N&:4 HOS@Vѩ)A-y#xgY hRNJF4|gT9 -{<]#q#t:?'J0+B0iPyPRbۜ,íZU*9tGomeoRj95]6*%˨D(1@/; YNRTgTLvԄ;R˫,u4!Қ#R/4< M.\%:!FfbrʚP{8(b$zLӇ4K,-#g m>ڍ/ VñSHl5 sRmh@V~Zp'C80cQĄ}>w92ǃpƱƱkX5v1p)h5pXGk1cƱv NF:S`CMb-T!ܬłȒ~9Zs9a_$yt9iϡiץ|摂,;C!IdU&R!,|+QȐ0i^iG|3R&Qg;yН@;'8@t[1%-%v+nCiPHSg8ةF4%7d%'(qeэ߃g(U{=>xxY gYg4;#Y3C=c=τ{5c@p:rN+٬hNԈdsSx]'G1$GF,GBK5vg=q'R~>9c@pƊtR4Pt%*HzUΦ}<#=I;xg|hc=ς.<1>uE;kLJxC>I#'Eaihmt γ{G`x'|31p:CڶA鱍5ꃹR曵`ٰt'΄Yuggp> k< X;6n!XXu#H0gIEh]J7,Q/ hn47j4ކ썤zF脽bhB&i7NYȝDIuұ$>{F`k=ko:1GNE`iZNtt%ZΊI:YҴ4 E@:9kXy&KЗ#BlN/r4?CtNN|:FXz 7^b:Fℭ z7t/`h\E׶bcBH]n6 <:5Νts\C;y4<,}Y={'C|Y 5>!1qr"AQa 2b0P`p3@BR#sSc$?v0-rSٝnBܷ`Z33ZRR50fy>jsB[O3[}Rg&i^O@Q͝ 7%|fxY)b4NUDgK3a%4k=>ZL*Q14'D<6MgiH4C@kff3Xf){K+(IS]7ݔZ#DrO3hJhu ՕYVQM/DL}2mll_$o&eh8bEhj R[I͕v"qi5leEq~hE2/R"TR' QR6\?6UR!K~[xF,űnSY$+^ u.&UT"86&056ir*\3I,fїnّOb"lp书U/陲rzO{kԫijW9%^Qok6kdGb -ޚrN^WK,ry%zF8C.R.HK_߻c*b%8LFm}KEՑihD|_[?Tʸ|c%K-g  /v/Ю0%(dܟ5:సNqq)oz\L7E}rK,ZK/XCM$l\T+yC\t6vN0YyB㇒91Bv>fJ;YJ,VZ0E6ħcQܜ%8czsY-#L! XBk"S#,hra Nfe$ 83ELs (('bDs.Iףb9|/ RҞFUTSA(GeZDc8$!xP2eUq~Rm, 8(N̫ᷫ*Ymџ pcui!'LX*xYh5:,)_ -R6_Rђ !dޯ^eX8/"\WE-.mMz"-?6c.mF;QZՓY$6r=ׯvИL$36%,zK9>$!&+^R(S1F='nUĐ D#|؟h7]oW9ůRQ -lOs5k(uظX6~0,o6\Ժdl\˙>yҾ9RD%ؤW6bǩeRTKgn)?Yd%^➍"ZĞ"ji},$.EjCKf<Ė˻PNYflV%)K+R6&Y'ͣet6Nkg=r[qGiID}ElIJ^}O|͟^#K,1+F\ _?~q*k!)<K ɐ|'tX|2)_b^6md%ue -L'H ͤ[b^Rfl% v3hePgIy,_= t'ͫͩ5*$*o쑵~d&+Kءz`]c)sgudrPU6ߪd+)^I"ǛҮÂF왴2Ms6~fӋ^]edm=z+\A),|jy,Iv3j-g bHFpi&lQQ^У'G Qm;1v/+hl{3Kz3iBĹ?] !U+$&|'|idC^كQ#刢0$Az#sJX|Hs_&pJkD(Hd;8W˲ cͧOGCdh]>"dmE.yiilsRHyev3hd[Ʀυ͛_i8^1kKY2]ȄV[yf)_,}l J-K$)GۏsrLWԢqK80|LO1.G -jWSINV?m=}ȥ}/_gerrZDq$)esԂ(V|i`{DZ^%UlFæ&ƣ!PAj’[y)Ev, + mpB)!,dKC -WXB+ɡBOv|л=%EDU|B`1 -BSQ3Aaf!, a En#Y1%a,!q8|JĴOY% -=?-EQ{I<3)aܹ!F 0^$GKbb*;KwMEciKc\OVFO -ؗ5 #g)~OF!4pJRCzz&64m~)J7u @ylñQhlwJ:/#FimdF}LXԞW(IdI>x" @R4"bVDںBql3؟ߢ&a Z~8H<"Yvwsj RZ}%]z'Ͳ_k6.MQ\BF+ Q5szE_{s;7ɯcj{KkCk-3/s:wjޟ%*_˙43W]ؕ0'Hv|6AܭbkU] &6C(EE?]`_hz`Ȼw3?)$ AWjh-^Ee_:Eem/<m|I ox+]?lIBrb)Bf(^ J< 8SX\!K9I6lv"}R\6 kHV-fXFx摈؛8V[k,qWq/TUZo,^uk^܊Qr!ՐLoOߴv2Vdmm6l?૱^kvyw?aV uԄ=._[$Lt꙳"V_*EIh2!/,y-fHٟ!$%M.LM>So OG{5VK,z,7pa7Rտhe]ß$V8Pde2Qh_ފwQx]e#Q/oO26&W4IPFI Xf*f%t.ٗw\AOj"VXw>H(/L CEʼnSG"QJ$swY#E, -pz tp,Y'8Y+c2!7YY4Q.2mOݲ/o; Wl+i`mKgȹWSf^_r+6fU|V)7/W\b\c'|]Cj$} EBIk.BT=ńq7iPoPO"M#-xYF [)I2Z1< -Ryh!!M_"~}E)Eq4g<}˻YemcF/#gb#v3k[BվzŗSSW@/C/ R-!U/r+6QCЈG-*6OfNZ%QʔVpa7x.)SPŖ\1&2Y1٤"he򨧙`[՗1[D&<+\-c}=PPo%ڻvv7![#g_҆.}K3}B>Rh_$a\[-48c^,Q;%%6edGu3Ó - "`Wdnarbٛ|I+r[8a{_ -ˊfN"m=۶VWھDBMj84(Մg$ՎVE%8Y_&=fUeлY{fUھJQ؈M-2I{f-eF-_2٬иXq&Jp(8Dd[lRKGXwۍse9$W8x7k|+FS#G G3$y*RpIFܕ=fFR2k#Y> sÌrm jU$*o ZdkQi#Z͌%UQy,YItFD)!0 J~I)qL_<"g(| sTsb$Ͳs~HJI.hcBnRlpQY'W6vM2-~;(F -Mභ2/'^4%܈ue<<2lB,^n\J_qOqd'T%\ߏ+-ɜr LYoMǫ.oYGg#vEbL)8.m`#BE j'"m%}̧i(pEЏ%ܮMWl^يQgVK/fнKS?o{Yx"ډ4~GԪ.gM.fIw%T3†\_ж~vOv/">5XeyQODԮ/?/,+_qGnIM<|_q\IU'eg?N~iR^DGL#y-'IX6F|\͜.&oh3/=!3,*%7Q,nMIJ>}}+RΤazKG%5dױnbcDpxlr>q9T/# hir|<4~p'!)!EQiog1,ZɘKi)lq2ؚ'ʒS\ul[$%FT%&\_w3H&d5NLJmD%9\UM᎘ȍ7<\7A$>mouV1#>-.eN&S_ - =l-S6FyɲoHpX8J璥9Tޱ"EAX#ƭD/I&G/bGo+;Ƒgpv?R&Kf<%KQM 焝-2m{G+%9ZH {v/o[xK/Y/cgKT×MqZ%B喋:NKR)^ovlLҖD'ZxL6qducZvEq)z"M$A%FȽ_j^_;=scuβudD洖2fr&14(zr뗪&19y"_LZȱtKrQl-R,h&+̲(U JU,SEkDd|Y,Eh#ح-$%pC֌n\;8٬KS _ dX[HE~.5 #q8,Kv_5h┰Rc#T7lXɫFFghℓ_' -՜27\[' $:)#sQ2NMJ'y7Ñg/fvf80YbcPlYK{~ŰUh)Y*\ -!&fWSeI)Rl {[e8evֱ,M)( _Ͷ+H^%\sm0-Mɥ脼Lܢ9KT8C)BO'M`L%d4VKc'"dYK[B؜6.gZ{q.Md}b*6ej&%l}PO^WY͖BSijNy~)G.QԺ-Djo%=7T8yL|KX $l/Ѳm=Y+>|i㉓ffhOFY郓/Yb(NI5S,KvWж{B+6l:H9iDZ,:!Or-|,6bT055mXm6m)vEv:B]՗/RbCϘ5\쨬~̹/vr+ލuueͪ&Axt+2S66lb6/ITl2`6iJO ĉ.ԇj-Ƞ\ܱ1d9qXK]1m)J;M?w.eYT|HyGBMsHusΆӺ=ۺuћ*Q؊ݎ|$']pզQ>" ><`澤pL\J+ +SXbnÅ<ȯ,R1Suhiy;J; ^ ohgKeiI2>mgE+|$̅\) R_ͣ+#82ɢq{%*™7# bV)t+gy2s"^R+册+J&6- |G E"GHkh\2)-٭YII'qIF c&1±8YpuA)&N~[YL|QK75|f3ˊFS_zhaسOAшKs'ZcN/~f|<,E)leJٷ )rk#'zW-$8! Ÿ&qt3_|)='^xH+|;MdM3o 6ȬWe"4qb,u2M9o٣F1#l.f- Ea9BX̊Ub$SkB3rHYC>5 -Uh5QdmRfϗRO1Yen1ѱ.H|?VV(fF$y6̈ٺA4CV߲wv2C%oRP#ПeKT[~iɛJQ(-bGe³Ns/MdW<˥)x!VޥkF؍&nPg -qTt[foGcEM5K,4,"z{`<զm=~m,>$PזyWj񯒬sx#ǩbQfԙDg,6zReĻZWe#%冀n]9pS/dJMEO}6F9P!i(`(G,5D:Lk? -U)O V ޤg:= M>luVe_2` ,𣌗VJ2S,zU:ۖ1˦m[uCh)IFr2YLbhK&3'&cqQK~pg8.2Ff##M dO~$9g=o34&FO;I?y2ҹ2J2D|߳/4!|mFȻ'q5x"ahG)~o#)oĥ1,iU%8͚F!r_.GEUFc[8ֳ07Lʈjrc[3Eu9o՚Io{G̩1-lٔ7bjlKWFB>q#v|Ksq\)bG{2M&fR%o̲y8ѕ,KzicQ7-´d#45Ş, {<و/'bɔH5 ;oo\(_O>Eg]cRB<V5,1Hg?$8%^7Xm"|;ɟS3~ǧ}hYF#?]1x<^-Jx$r S[υ!(PG'sՙv6(oru8_e4bSHK#lʡ|ud!w&)/3&V%^Q,N0_Oe)ySI/3)#Kd%"9Rn,M*lZ&N$S8<1^9pkȜ>R$\[y#22\>1*F&($Y)~u:xȔY.4/Y>rTR)x %mɩ"˛)Ⱥi)h#&OY5̝K<;_qJ_JWRR>>(gy/F̮RB+ T,V;)_j!7)/ZjB$E"Q8%Ú>,v}LsZ['*C'˜)~~htyz[ef)zE=Q/t.h%1hC߳G!to׹Wj1#=^{Y3-q.[к^VO+te6W$VG[.*8_6V2~HO8hs\' Vl~\LF)n -__Oh4ͮ_v>}ӲXXb<+ OmR+^.tGٿf o}TղH.W<[j-e.+DB/_$l|5Y3%fݿghilcOC,6lKX]/%/DY/~͞Ka|;")Ǒ9!_%khvS 틌aG998|[~ln8dQeW,6n}`:L_;g䒆,KLTouweč1 dvX)PRIC1#Dx by/}yDz<&LKt},fg͞q霖%8Yə,KNr|D,Y2G4K,MR)!Y_&,Y1q<$q/],~w0 bK{Tu38PV7V֣3et1'^>F#8Óf&jؒ#\k(š4{iZ0'Ԏ&$< Ńx1p3'o# _?wc81 0x,o⤌K;K'xk>}+ɬQəE3FcᬣZѕfu1ɣKY6UQھX*F$eݥH0Di$9`˟ 6Gԛ*bM8[Or!ȤN}JOEywB}ۨSڊ'deE(U\ʡv?V[;lχ{o^"/^"[ڙiVqiJu,M>l[[Y"Tպ΅LJrP}= -!{'4][{m8?6VKqEzVDpCܫh 5fU$dT3daƴE' ,z^CG2|D5h18n% +,MIc]U4˛'I5线bCEW .bJDV?M]G_(hetK;Y*353ei$&31({bʡ)/nhG)^vҥ{G%ؿrj'GEJE"IyJoqƾC6[ry!cؗl[8rhƃpI[r[ꌨ-ؒ07x%?90L %dpٳ*e#eRb̈#ǵX)o_$!8 -E4+ș % fH[*6Vd8FPWjj(E]ȔKZj][Ԏ"p71U2pdבl8gφËz#|bORO2IJHy"#ԣ4m; -<͞ QOj,%^CVuM{G,j-l-5}+XDk4FKW'cƠMeU ~Úɣ⦲g{cEL)?LIdM?e&BJChQbQŠ(U4c4d .'#J (–;xjЫ4THE3 -$r+E/d|SyFS~c.GqΨ_-8/#)rfxt^+" -8,B\ -x_>&|[~3mg͑LSa2ygQ%%E6()oɄ%%p<4n+%)}Ls^HWgdMN>JbFȬ4/8žMt.dde\2Aqb-1Qg6*SS8q *}̛Yɦp(Q|1qYZ :b e"ǒd:ndox!ZJzNm8k♅V~JF7Ȱbx$%<^F<Ht?9/WcSUے2$_#ț䔙Z :"+ d<2=7K'/VXh}$$I&c#p!<*FZė:2ܥkC<,V"Kw %ZшLݢjz¨9>HhK™OyO./&M/}ҋ#)~Ĕ$m.?]}JY*>WKR4QE==>-.kpLyfv<)r]c cTm$לB=J!2} 7qBYF$6y6&ޜ&Ғbi&JSٮKš#)MgK.[֨2Z"{M{E 5N>m9gxЍq'|,$+X!d|IbPX-K_K!d[QB$vyE/t\ETבMJGOB+8IX[~Lӱg.*efUxIM>Ha^Rg &e~\?\y9R(Ie47[pֆ3U&B)-ܿk#[49ܛ2o&+# r8'L.D湢S%FR\(mi()2=>K$22aE(Z -⢲[Q N\s䆝Gi^"Jsm؏ b[,3ž..q!ԧ]I6n%.H&Ɩ%Q,HRѶ'&(H!k..culYucgzKF+8 -']Vmi|L  +㜓MG|zSE L+F[#yhZӈO +n#0kv'lP &9Y8j ɡ$JLqN)rθкE[7(,E HGά\RhRneH5%EO:pu끗>{9H$RH<3(mڤȣ1iq#fD:|d-bNU'͢C< 9eܹ% ~tJD,.9KvK1lCn>OYzmS6k'[lT]z)dw(H_)cUW3iQ\h -2圊 X*m)q7_ -j)4WVCe-i|-.-^|M塪EJ\օ}JW@KtGb|SSfτlIŏ/\"Wvf>Yqcɲ/nμ8J iODm=nQJI*~mGE-2F+Qڈ!Vɽq]Xx6HUKu]Q.,>&qc|/QF+D[Ge,)c3*e;B6FQp{6\,kźBOBrr-OЗq] -$dXQ.y^ǡYIDN'P$M<&BI] xeI -ݝ{sxJ&״Axu69dim3dKɢ`SB[&6V;Q ج船Ũy%#y@RJ9R<&ʥSԟi&d,)1|v}ۨ(&[Oˑ9KdKƴ,~M}R\tr -+.l"!Y'Pg"sN͜ -rG6x#əA3kY$j$S,mo+pvR8#$ߚZDx؊"#upm\%YKĤSӖJ{Wq>i^Fϴ ->%^h-yqdlŗ18#3rLN 1[8&b1Iz/?Rufx"f /6[Ol%VIz9FOWv.5G RX.ebW_rlM+6.I-3b)3ZRݗMY|9$}h34,G^W!9E(P>+HP=I2??B^T$EZ|Oh=GқLlR%]S|,v]"W̓HHhd#qIv#MxZTFCdbqMsz`jzLMj(xN%?S'BK*C( OMX%$92r8c,OeMF'0m1b͌POish申TJq<4VEgIxW{/Î2pXŽ'RȔRH%8,d·MphZ!F51XMdug FC+M@S(Z[T=9+@PۉI5ʟ'G#("sy4D!EJ֤T=J|(I:&sd⾛нM&Buu+*YѐrBBOԛIILO\}(┒8dȦO%Tc2=giko- -!*'*źބ6FSelSFDS&fnrDV>{Wdl;ix#ő?hUđ]UxB7&]FtEe8N#qM38F\V;X9QCM,,$j*O ^'\}ߤKWµ*} r~d"2Q%ԩ:*F\V~ElG I,, -) N1Bu#GkÑ>e|T_&clK+)% /:+rLJićO\w5&Ð'Lt#x7\{5\IMc߱uyd)R\8'$a=nd[ƣ^rMx#9"j߬>=bW>Qֹe*( HU,mHǑ|=\F٭d*.d-/4*DRʻF,|ȓ>q.I{1drW*e KgJ^$G%16h6A}Yc,[]u*1E-W=E=зRqJW/rӃ:2F&'_q)z!U%&8'L6}+凳?8ZdE#qnjU\Dk#ThixL4g&j[S'z-^xlO>yp76]9,{ -"D#.i|&qF)I!ŜsMY1b&e@J+ |ig/vy{]؋zOfb\Y'=TJEԙYC6(p9%"} S2V6FkEQGĭrXE¶[)[;&ruK2:3e*e#KrRO %XS̎1tR͐H3dLS8lfKvFn_)_'Џ RݬQKce;47 -"6W򈭇ذcfQU)eV[̳ EI=W3f5qcmot:*NݡT<c[x?_8N8Zep|SE%?QiiJ3 -9#Hؚ3Myӄ'ft9 -O$:K+< "ڹ 3gp&km4N.hc,6=i%_tosB8RlU>3gd_q*Ggl(ʘK-6Y ,k"Dglb{^$`n{¿"FraI69I!<6X<!AXcaщׁf/oglu%C)1F&WiHhGŹɤjm/M1|llQ<(qX)EDe\!96C9zh Msy'}xl DD:|5Yu#G`}98TYjQLM KM6;"g1ŎRi}3Nu->Ӓ'ӑXI.b⎬rUTiO\35Aq"JiJϪK׹%2SFTlN+в4i4b+pKzcudַNئf-49$8!bɓcSUL8>9g hD)0|9"ZF-9M8G^fc+\o[B,6͗*MiF!fx2FqWR:=Y|_:7SbV6(ԍ,ee}V6gමLcՎ<N+FmT)7Gy &ٱH)B,ǹw%S#RBw]S%&9oFѶ[I]vf9QȚ~?5()͐@%Нt&ǵMB^L]IW%ݥd9q86dJҊ6NJ|+(i2= -;KbD;VꟹOTC|t,z@-l#ݙ{rQ6`ٵ)I/ bv![f͟qQ{ň} lBy+.QNԲreG rW'"~彬eq'L?N9jL?REx>+ e㖣ݳu+D.IG7!ɮl{+=grB9N\^Uoq%*h -d`8ŴB/ -|9\F>𒔑$Y.5g<kQ,^7nPsgl]%?ѤslJ\mi:?W6Y%K%˩^61͡[-IFrHV2"l^)s'tofWa)(H?TE%r~coJ*'ԊdhE{pRC}ߓ[)+EI?rRD[-e% )"F1R&d))Aeز<,"ߒX m/QO:^{ "l}H +IءU4h야"ȯb=M5i?Ux*szI6̧8?}Lm`JF"k1ͬhII0f -1-OYJm& +X=7p)xKROE&ԏiNb5d%HOMI%ȶS#RrԄbZD./xĤEWȦRrB_ir' g(Ǔ%س$d$Fm>)ܮU86*d~6Z#ZTNMsc3%&86##̨# oĐrЗl};KR&zKɬK!$3X|^\0-ۭ\)~i[fʑ>lOCyKͬ"l՚3gr6ihp_oe6 VY&6/6Ǚ4BszWx+k)MJ2˒,UUq2h/DrW"N -x:c;o^!N#SR%hs8#$qbho&!8?ə1sJBxy#3|'eHJSP<~B_&52dG<1K%EF/iyMk-X__Ċ [ZISlVgiuR6ޯr* Y88rY8m͔&qxh"jH+\ѱ9 gzkDi}Ot8c2<'q7e}Bs")c8̇#-),%. ')ne*j-(<-dIy!Bp4F"t_,%%Zrˈ}ҋ BtN+-N+ʡ%O'9UgK*g4JppQLҸui*\XL4˭^gFv~G#|z4ˆnqDy㲴\TV(&j_.2YF](QRCfhn?*j/8?ܚGĥ,dM39x;$8bFτ;H1O'¦9bWDS8!T^+3*򳽱”lp9b&[ VXdp8ٕ2xFb,d>L_i - -bkŒ8F6Gs^HjY(EV5S>Ch%G$ojlCM*)Z.پ|\yE9Epj*f¾=~J\ME}f̷f/+|z6,^#s,ZX߹OT-?+ ,,^ŝw1%g6e|K%^S~{!ԏhݾM: jO0G8Un,ma_KG!dUju6;f(wԤ:?TU6u!ڋUD˟;,e fh{v|/r+?oiw1d$B޲8[s[BO,ZYԇRMEOnWʤEje3Ȼb  |\i\xxÞ!-pbh눸-p8+_DJ`-3e^)K.ޤe2ҹ= -;B6)ȚoV@z.!u&57qZbrQ[MYuD[9yd}Q)E>ʡz-ڠ#~N^D2E1o--wi>cy29\n u0Q>~_HQ#1b_qs6GܓCUZͻ!Ex͕yE D iEu/$l1LK66+KV,\|)sR #LZX砡\wYPP58||Xǻ 9~v5h\%bFbk{>zM|vkaŋ\8Y,JXq#9 e!?,o\?!:b)[ؓ4pGgv%ls^Q$pSbq{&qI --nrdG^) [XoRz'̍ɬjbOT8̟idII22="y`$p\3Z6-_IWDA#Z3ʺ"QjE}{,~H>EoTTߩs5f8I!Ir{%5ą͊^8h%d#>*~D9!A엒$hP~Gzɟ'2J3\By߲͒٪m![n*vz Ep69>mNpFpX!'x'C؜v HP[gk(Ȫ+mjA zա{$bMhO M͘%C"^ vJwNmk[/y],4/MIROInk_gÌw"$bvKW,K ]ybyrHImBn,˳}D6g'Ks^\R)cY+)ienKh5\b3gџJ_Ft|泉Sl`[87;-o2%]2,oвdY6 )73N+'EĊcC~ |o zIܘ咨cԆBީ1E {")q\(P8Dđu6bպOjOT""oV3}.DlҥáNrm˞UU,9hɩmXUhp9r_ADq'ݺ#+~[E"(Ϳ-Ⱗnl9d1̦UdǩmOe" -YE-h咫1yPORzn_E˛WK!Ԫ)kV5qKVaivt, }%LϹoBeάՒ'&Y)fνYa>?&pCJ_BrZpǖVY55S"~F'uRqcn$N rT:OOsm| -"!ɶqgW#`_tJ䠋%/- L9T!bsXJ*ZEu 56+k0ee|;dPl~H̴X6YuAږDU"`/KKW&"n^hD~HL+!L}HGdk,eG΄HoKoBl HOobiG3eYFg)/w#ɒ=UrHPHqO,_.J( h|k"gDҎ#9#k$aErdSM싞9(JMVhl|>7Z@6+͆OP\f'"ͮ*%9<%wX\Kvn:/RŹ7ÂHrlщDiap"d(VPYи{2Ҿ*,QDq||i;1S,ym,%HF2Mϟv'R ՟1xȠ G䏁B[-2J&xadVp(c\)˄s2SIHk3Z -Z֌B81%xV7OB˔|\'#Idu>hqvx 1hڦ#a^+ik-^ TJn+z˙YrhuƦ;"Źdz3K%0L٥.I"SX6ɲ[>lU),ɐmrHQ3^2| eĶmǎG Jds;Q".1KK\"KD%*;a.d`n/$bq2a#3<3gbYE}ۨroNmy<\dr!^|NF),a(]H,F z$/5fuպK؝O*|IU,6/QYRDTX$MKiˊgPQ%;d% Jz -Cc$q5(Ea-ؒKC±h~’sYKBՖF^Z|QGU ddN{4[\˅=r:KAД$k\%ͽx5{+xEo31-u R5Gҿ]ƨ4'(,ql.MoJpr'U\ELWN}K泵 sd4N)s?RLk(ʪ&3(&"_8hQ.~M˔Y"(TNh4Te88 ~k;_PK,]O?&˺kٗވveI_okGwԷxDe=8&i&ס<B.^-uEyҴm58^TK>y+$wg)x}FS3ٖr8<8M`"k4# -(Q#9rۛ~s5s7nl)z!nyhѡMW%7䏅'?(]̳lW*Ebgk6zXzcѕgE}~ \ ilUgƥ[*cp~7ȮSǙ;8'ͦ {Dʥ(a&J/G[|>h٣#d_r!@[fleؗFU_j_Į>.IJ&WTV6B8 -fD,$QWѤRjo7Qؗ.?})l5KKRAk̷+r[_ߤѲ[hƜ&OSko>Y~[t]kd*hQ^Hko/92VH([(٫O4 -_WIHحڋ}/aIo~">XFȾl'nIgQ\0Q>X2^߅'jճh^6yH"?r-/yKueo{YzDYBZ^Wl0]?Me}xVrlpע-ǤIKe6}$qk(~aGݏb jY|+x_ͼEq[,~UlєDi}esDel7Wf_伦_a5KaHl6z/cE&}s0YBF/J{Q"A^,6{ﰩ:Ѳբ^=^f_,6~ax\}[6fSԑl͟/}<,E_q^] -_媉e+%.h|&lQoDHRT^M!75ws{mt+l]}66xİ.^le=ȣRO TFZ\9evr!F6VH4_il=Qeqr卥>8^0|I/m߅'mlܤثR!ڍL[l2}}؆^3 F/"1%7A -3VQ nvJ)Hqgl[/Y~ ۧ6K^EʌM~_)zɛqEJ$0%lFfMlPX8z'\ԹE`ǐao_)9j!F+1>] 3h^3͟2~?4sTnhN&aj(edsFbyNBS>&Gj14jhߑ(2y;&؜[q[?D6KyԺ=Hʭ*Z'S#h I DM&N n}%_54|HɉX11b97fԬ1^fe纸$v,"'&Gj% GI8ews,Mo"8Hi-Z&ynp&d/VNmx]諵n~Y'[qBm'RZA;c/E}]Q/.9!GDU߲ N$ޢqh^Q#gxYtW%ǦqqEK' W&j?}< }<$ -jv8o(i"%̜p\ഗ#^EDYei"_#GŧFFDFw"3&lH5&P H6? 7T18,Fx$ - -BBwk62أGj6[U\~#҆RG v/h^q9xK6!eE|#L\t٢ETת+6N --ߧ6HyGGV,\M)g "y7yGji8|(>{M!ct:Oc.^$JqZI}(oвzÙ  I ~ӧOc'ei]Vԗ҉$imjI"*K6Ux~r W%T^(ٝi@QS|GPI>d?7™EhKH_4&[49rY3G$&om*FxlјMg{lN'$).O ܠ5%1|^d!MCQ䏉! '|'$c;dߑF1#9 BBos$q&ex)aѳy"I6Gox3 71yD`7ryG B:#_|]_˩^g3G$ 1ſ,4Ɇ^[㉈lh/^Kdɗedđ;.G#"[r[TaoFVOQ_'#|~VS|.^fz͎ TƦdy=+-3Y>KzijĮ[ʖ 18R|DYຶ9>[%$Ş[ۉƛ#E?M|e|{\b[ڏ3/鹎LBy~7dbCQ9/ +OCRof"/TZcQ#ZrxVþ<~G 8ɘ328bQMpF`ˬM$ngsg2bh`OKKhŒJG f>?bœOYl&f#T=\l~쿠0mBĚ6>Z;WiTɒ/Z69\tɩzجN$r*~ϏTSAyjGEkZ ϙ8<1z|9d'.lMDM{y6{a>4l=z/g()<"2<"vOeͯbx׉ɿrޅ,)_q#'2F$ݙ,[QGɁ7_wh/Dc9p|VdM/37yM邾+ BY6~[xC/O[dV %^5K+D)XzIѴc2\>Ue47 Ek4YlyH%ɎrHqK! I͉JȌ#-&8Ln 5KĜΣr2<)CIV4Uo/f?8P)UQ-+~x%8m3\͠.k\UԥNi54Fpdg!##UYDBpo,s^-eZJ1')<ωSھl~gOTl?l<܄mJ0XIoќ1d`Y %7# |92bhd>zt#+mJ#m1E]F]LA8 >m~KQ+W[ͣA4OeB} Ԟ2SzY<[g䫩WB%E{D ,3N)r3RȜ~k*#[#*k<%K.ܑ֢gZhR^bj9qRy)OQ ++9Ǟ_٤4=fM吪IDpY I"HL/G1Evppk,6pֲk #̒o?,~xD+#tVP{!JRm 5hL+ɴ ^?nK' Q$|EFG/-/ۖn_o㘜Ys1jЌ`n^(jإ빲Y^̦q#kL޸[0 S$p?QK:JH|>[s)eyS\HGo~Xނ7*IliIsX2ĚFc$%dF_GK1Rc#Y!=͎<)s8biNS)? -3\N;"0r8r1)>[CO\z - |Va$b<9K;Zxɖ"(}72S# O-N+y-yK{k3[f-X䞥t B/[$6'mچr(*ű"$'QR8<9X[g6'7>QMs1m;3'שyDV!LQa3~/TKY3XE7O$6Z -(21=\Ã\*)[7m1+q\nWB{O{fqp8)qf(ї' -;4\/i"2S#sk,PzVKZOF$f/(33'q7 -nXX&qE1yFHxF;flդh9GkZ>'94 #XN7 =Q'De'ʒ<c'Ig_[/rR[ɐdx0{K KPIJY-iqd}oin|*L!'_*NmHϤS0&I,\Q#%)%, JO6(ZlN[M஼A|DViǂ xo2qǑ%R\).LK%x>2(`_QL'|;֚>3MzE!oJвx$ȌGœCͬHaGѭ~o؟B+:) ?1GRDu] - -L}w\xNblzZKu]t{Ke XRKse̥}reM"ExaﬧF??%2Q}JWnInC<М\D{I?vB)6v_䣩%3ȶOɦ$2DeG{-+#ze+)CCWB]ω}=GpKt"**[ˉAv,_RȇQnbeJ{V"$"ASވ$i+}yq!t+e]+$?fK>.O;ʍCn?^'іԒ4CϪufCWRO|D!܊v"¾{JI{Wiok6MI*Y\cБ2^Z.-eU}D7ݟRWݺ芛&n)^.s=$OјU&v]e=ue}ԗR] :v~쨣R.90p DHeo؁wqyO2V;t1WBoD⮄2e]]7SڊA%"Cʺt.enr-^Rɕ?r}D7Oٗu*܈y>ѿuK#/أ ?⮟ϯgЗz?RUue} Bo JC_)%ۺ>CD eEeL'lSXT#HzA?uOܫgh_`ȭE]tWj*hK%v_\؊XޛpAk]_ݹ/i`uWj*oФnb";к#e]?]BO1Y_MՐKta_zT;_MnIt,&WHRLuB^c-ݺ*YFG$:?dVo -^2TLvnGRެGR%}E>=n:GqOj1C R>;g-dWDW Y_Bdtw>)>>kد{ЇioRUЇ}ORn{t,ܙZZ,^LOiI_j}>va"ܣK2k-ϫ-iqv*7 ]/S#ԯJ'پ}tܙGqkٞ_z?6JʻwVWL%ђ?CRʊ;&OD{D"}+^t; >0\2ݺUY}dQ[Wigk.>=l]]I/KJQok/."΅K:=d[͠ٲݺzu%ٺ7ne= -UڊvIwQv7zGX>>cTWu,Ɨ.ȿ:YOQ)ţz?^KOpJK.VІD]QhGqVUзȉvJHw"KTdE] - -PR/ϩwQgAn}:t^-fԻлWvw[ovn)E])j*dY.L!M6u#+~ϿgЗz:Dl }It&c#)J{Y #t_.GVЏ \Z#$w\DLAHꊺrިڊn?R%eiOj./6= -V^}JݬC-fԴ ߾.w!ftE]TL~}O;~(.#ۺ%Oܯ'eXUF@n&Й% ue, l!KatBDYS zh.)b;B( **,{R}VuE]/RicQOTGu+E}dYg=/DLC K-e7D"]Zm_BRO޽̿]GT5섽X{(w1viYWo^ϡ%#uE]u,%ԗA(Ԩ Q܇%ԇa/{DuiS-~}/b=./uIWik"!܊Qok6ysJE[FP>>U]ͣpw[ЌCaok6f} TM!%ԩ}yWDUԏR "+u+k ͛7yw?Ww {!2պHq.^7Sފ Gq.ѕ?舓mTLB̷PGu =l%} z_PG/DA_r*-/IGeeE] v^< ni"X^gM oizj{ڈڲ]J܉vn?r=Jz {!?Ey僢(-tMO]FTV"LBF=k#c )DԣRO=eFҒΣaws'ЩBeEAq*Eݤ?%J>r TV;Yu-ǔ_JTWj#ԗBYV{Yw{3On껊{K{Y{,Os˻Yw˻Kt:q'{7L/*EO UШ]P]>}~{B}D?nD:$>?%> "?nv -_zDz!_]$2/.^匧}H6Eh -KY[F ȭvh.)FʽZOCg+DZOXS[6;C,ORޏ{$˻Yu-~췡Ry=)3 u´WTSТ+&=KvXWچ2RЩ:>Boj%Ԩ ~#gWr+E{?y]D:-\..{YsW+.B.ވt3JKE@_r*E ]٢lJQŝ),/ɴu!7Oi[ d{YweݥUڊ{ nk%a[)!܊?t<|BE}"Bq_.RՕbCKhw" -;#+_i5E} w"Τ-yl:wiA!܊ڋ;Y{.Oj6y" vڊ -Pgio=sh#U+S[ͥ[͡ue mH}OQu+G7e/bAD7e%ܞ -چH_CvdQ!Б.B,!$J܊6~?hyEt>JoRrD{Kz~"БyY}۠Wл%Ѓ+*_r*-/m6nT{ME]> -;Qb6h#SVmKznw][z3ib!Ч/Qމ-ϡUЯ"TMKܜ:erP?qK%VW]:"{Й>⮥=诡Q܇1?HTG>FQ} ޥ"=ԭeeW%"5Azŕv//yJQF}QfT.O/Jͣk(oivsKe&mD:Dn{J{J_r*U7C*, -P -:#=:/va}HL}It&G{!]:w"w2>BojE}] -$C{{"=V@DM9/]:+^Ž=%C E]ywyKHGiJ+D:vOj$tHv(.fн7A\]Փ-o;J?z' ϴQZOiRD;-YIki_j%аI:;oij{PBC~ dd:YOz+A}̣d;I.ѓEЁb$A}Ž}Q^׹gDz^+XTdKiOBU[^͟3t6vUڈr] {_QcY/!Qu;Gԫwc6CwiVZ.6l}vމt)WBUЭ2Ot;aYaaB’]~ ;gBVtR!h}It$G>%+CGz%1/HEڷO+/$Anŝ4GV\GGqu+]W2 -Wj-e-)E}OE+ܫDYo EC>,~i#S_͡!m/oBطl)_BUV2eܩ] -Iv_lI麲7VtK܏a^+eOE}w]D.}h6O.,uB2:?y~+[B rkOإE]{l u EL'_җm/6fϺGl.WB ܙok6?D v޷'"SV{"$JW%п_FRK#BR|ذ"7Vt$K/wVʻ_B&މv]]It.? D=G^ퟸA{e} H$%ȩ}?Sh(j6f"Qڊz:2Y)JQwk6ifB=WSڋY{-Y_]USGr#7g%)WiYJOi_RYukECe] /*(D -GvCD0VCB= nAz~#GWBYGz%ٹt&D{.4G"%eFވ%/wZ. Q?d.ҢUڋYv#g麎f+CDY?J{KM]7]{QjYs^GeQ{ew{WDln}w.]eȭ}:w뺮1t,D>@ Ͼ̗$:ntF Y_r+'Qif2~1-XG&E.eDznYx6] /Miwk ++E=J.yOj6eM6rFq>[͟//?{>}R]{-n= F ?f[ԨٗG[Cn]_]*DgDz1z"OQv9%;>[D!t:=7"] =eh}"މvn]3>;Y2Ō /DQ"Q_BҿPj.f~)E:rT= -a(l +B̒,aA%p8j- bLDrK(⮗(sXyW[ĊZ x@_V^Lk-bR ݳ)_~CJP;Lࠟ]ww t'пϮ:XA CDzD2KѤЇ{#>VQފ߱މ a'Eۢ⾨CQh~SN"H'77U²EHKOTd"X#'tHV4IAsT[~xc J)q0>[|3G ?,!+jP8Me2Pa2R>DM7sd+| S|#EwO "1i;>ƪ$e:2 (Pn%RuIE>m_i"nII{+';ٟDR5 _1/wV"hMIh%Xd0(c^J -DWd1 -JI#:eVZQIRK棁ŅŒ4] [9O2Gtl38'5v2JN,,4$(K+L8#n˂2Y?܂[lS88Z\0\(vI,FRo)>hk"0[ordnWcዧĺq!/vE3& 9K8r|jCj8hqhROA#0Y>i$VO(< L|gSc]%On[,OՒYz198eɑ\ЬVIR3G)/u QXqDҚ'd#et8ֲK#8de(Lv$:lm~A -|DW)<6WTS8id/"FNZ9-d(.LR~/"%PMc%I’EUÚ<#ghKYw:Lg{kMH6vlN'8}&Գ,sD<rv?Ы!7[b]F>m'(ĎV愞Bu;\D:nKX< XFiR*/qWz)D:0tÚ*fΡ4FmxD3ok#ןw9+ǦI%˗<ȃkAy2RaS<\#6H[͡ni,6bd5*mʻ{QWz'ǞC("ɤ:_^tE{bJb; ȯK,DWK\a#gQ؊س~AN,KЛK/:R\*_j6K+ǔ擊ma< 3FlOSdCi࿡ǜcDKXu AGT$s_IYx/_Qi`w"HN_Sp>X+dWZ.\(U #[*}ek%5%)ɓN<:#mN%ktbd+Q!o\1Io;HCwj'Z<1fFy-H\qɥHN0IK]n%ВBq>} BYq>} } OcBq>9œ -kĦ4s3 YÍ~ĸq%p6 nQ|6(ƚVr-f,M7 29[Tf/+{}cpw$},w@>IFxLKNK|p<9w7(8)OM)&15cO,ѱAo1)É-g_'$rlhʂO{G&.b[%kY4嗽|$1G& - 74i4eoI#I/'л *ֻ}Le Aq+{CAG{sޔG8߃Fr2&7ѥƳoo BV-~5qK'6xɭFOw?r_//?J0G#0sv| g$jF1<59_ϡ{Q-~ cn,_q>ߒ}K~wi&j#)bL,՘pĞIgpֲcs[ӏ1NYq*'G!^{ίƛvH^-y%3\4FzS~skQ'ƴK-Qэg\r\perK'5mAlM1X1/Y ۢ9ꄟ6./3&LJxgxWRdbT/hc5f<|YCɑWL4{m")Hq,~kz3oiɴOZK{G KFq!Hd!Mo؛%$<$"Oh|/V/4yIhrM8f̍y Lc緡s2R8"أI1ZdtD}!ZE{o 'S'ICE:+DK?RZzO$f4 IDg+-eQZORջ985Y<R|R'1O_΅R8RܐA" jSG8ϑVN|E]kȌV76Tߡ{IvYб%ݬlL! -cdek%9M$pg,2\*dbH׈XƦ - 2=Fߡ/rSb= {^Oc&ő}$D&E$E)?AO_%bJK)%b8f;:'pG -!%Q3,c#qĥ^ʭu\ě;їm;6j*E~x1$F\B. gvG !$Kjy!4L1'~brx<,B[hHw tx%⾄ƾY[\^_R|X6L2*щ^kls\bmU3ϹmY$_ћGq5~fpXߡtӂoܯ%^QH9M8Q49I+$$dQ)"M2/2dNYEsx F1VFM /*l_!-f4L̤p·Lh}gаd+} |>cɢ~d+H^Q(z?W6g͓"l=0ͤTU'9HC1~or6~T&KJs"ݎ-Y:"J>/ܥ -zVO!YƽK/=\ܼWT~6DbB9?"5_r^1ψ dS|bOsƨO EGԮ慧/1N/pi!=Q޸ԚGòZr0⹉N,I,)$t,s,>E]xN4G,S#~f'&EC8YL"͖mhFf9gO-{{Y1%=S-}`L"²PmĐ&[зWq[oE5#%lr 8"ȒCly䄌"fG͓xׅxHQЙ!SV'u˜LTà#%8ԮMykbkr TRR󑈯"냍 /UOgs-%^rLW>9ձb< 5lCQD)4q,kTхx;#NņEEyQ5Y^X> 2)Q,,EkmoePO̦nrz"c,5Uub|(ƬmjbKtzv3|1%|*JK]ЩrDR\Y$#B^b %ɔȯd%3.Mгس^rG H])/1eaq~DDi,^frc%dJs{潉a4,F$XuBK{c&Tu8I,#K Frc`NסR9hK#cj/ iKԥ?B"~fDXz}+ա/bVT>96]&Jr$7Ź:}l&~)+y?K:Hn&FGʰ]b&!K泡g_ i_&eE%TiE.4$f)<3Q=Wj䅺/"ܦI.|1R8󻉧'EŦy G\gB΢=<+"TW~} =9>|D%YЛ~5f?VaXs54{FS5gܞ |E9?/0Ʊ>}ܸ^$x$o R: -UČ\5p+c98"JOj_$eyz8.}|d^D-]5r88&cqE(hi k9G X78}G97MomA?=ʚoPzGIG^%ZbĽ¨<6'=qڛf%3Bq5*mz꥿3xBy=0Y2HI~I>h3S(MQ3.{"ZdDZ8lLrqB$b"id׻O#LYxbmy= )YW8ioD )Q g/.(KزvGōrUƗK=_"{P)>E 4&Һڑ שAV⏆G7QRyhS`|N,$N>ia1<SVߦN0#QPT}+v4d毹BiᲆQ$׹wBzȫGi\}<i>$L)I&gziORפˆ떲WፉҌ^e- 2dOqWi/\%%8:`_-b/S)KD}ʞWҷJMXGć]ғJaM.+-KYznkԎ|p,} 3I(VC2~T^o$uDT0gM M&"7̪Iaqn%͋Սr&8Eʵ2ovXpOmv?ڙR.~ĥ-cl1gǩ)-'2Or?JbX);̗c䆽("] rbhD8&C?fK"T\79еy Y WVe'?Dpl[QgOl*".KПqJ_WLce%'(IK~lkL{9&~M}̛dJKKD9|G<)XM2s\aL/RcePoSH<[,e&cMy!Je*(J5. sT6(o_ Ia)/!4_ʻQŎr8ddת)^Z! y< M$7|'-c͐7#E`_r-Qю Gz"O'/;⠳'N\ĝc|8mOsGIg#' 8&}LȫɢIv_Μi -&"XVDZu<tci]1>Y8LՑOeȡ(()EdJI`2љOS>GzoQr%DE&ۈ59e)2U~K$%$J2ܡCROUF#L_,V 8SxL%5<~1K"Ъ1[xr<-JkW"= KKD^ić.C=_4Y.)he,8c"S -%pE)4C"ٿdDH*~-^.!Пs,K>c A -DcnQ8Z3%Y.pXskVA^LIeDУ렬Fп%d:օkm?tkv?t.h߻)h{rS#ɉ<᳙=D Ǔ 7JK Mc94߇%_.;1D#Z$9G3WО=H'K>NV&Vȷg2] W1Bv]]eJzv,"sD_#FL W,%Y9vh+vgy<5\`1`IqW~gk&HR6'Q~Eb_h_R}dȭ2|ؒ>YԂc6Y8Lds$gZ؏.?s20ip.dJ>F<~[\иN j)X$NE̋·4JkY1ţZ -(f#Y.hH#8RnIhִbFELJZL3Ex,ii8q?QjZ21LR49 z1(r8Iȡk_:} OYpA2 "{IgW# R%ԚYLxӊYiG|v?efr٤d2ُe3,Y<#[ .9`ni Oq4_#0GF ?EI,<O ZDɏ8I9X sO}? So%""ūY>$&$68ɋ\ij.q<0Kslc9!BeƤqn-Vރ<p'?RVߓ"$ɐ IVI$M#&!46쎱4_=BC̭&Eܲ)"eH ( 8$OW. -3YCk{|Ţb}?뽺kmY8%K%aE"άXc|8T^= >GîLVJrx)$$,s1$k1f,$,m" K_hߩ>Iz3,=~O! -0zObI&pYy!:G$t#6В8x8y#W|'̛#9V<-j>lQ$G` -e}Lqcc߮_OLI8R8(z) -V6b6E?#!FHK GGy^'%&J}wR1oBOG FW)^uNK_kvFv&W#2f!-ڙ쾲HѤ#-i$Fƪȕ2=NE,1K#p91F|ː+,z=Ht[[?FKNYL1uMGc&x#<)SOO6%7-$NSDdZ2 !K~ȓ'VB^XF beyʽ[# E⾥} 2V~]ߡΣeY\З>Ma&/6FR^'BP^REz7#Ut%d= e CK'6^EavG&Jbl&f#<' /ϡ$ar,,7&Rȿvln[E}'q,q?2F"_# F2\d(tF,grvJ*X8gVF1aBlb"{ F-2K 9i`y'VVJXElyEE+!9JՑ7X=L+HMsCS##p8'W%Ph^oAf'(p8餵bq$FqEcZg%jXM!\44.)< {CqHO9f䥆a<݃<&NpOЍHTha/8¾^HQdWg?hѭ4jG*HĮ4&]%x㎣Nxj^^DߞdiyB9IV44wYE\GAJ<R8h47<B3q/%-K_|N'ЗyD 4#'(̌VN19I4O\cgeԚ~o(%73Ū2ȷ~xVt-}“,ъ7Ď'G"k.dHO͎. J sDv&W(Ǔ!^E{p1&{-n%WnX6?Yqz4JyZXWԯl\Q/r{,gmm#94RiE$$*!zM`)/]#D8$FifB-(q8y,1T^<ȻWn81Jl97 1Y:fK܂!?&Ep&[_T-Y~坬"y׬Q >Y?=WR|rOdؔVdEI%GdkV.c4`8Ó{#bZ>i ŝO7".mt  %Kt{DECMp83ŝ%[܈̑!K%Ւ^ѳg}]Ֆ|jx& ܯ= 5Yu!`sƄ>{hAߑǁׂ*IuBYՖ K{)- k\!պ] ^{++Z:zY5%A%B-jQ$shs|A[zRb^ y9dN\VMG&iϩ `h%\Yr'2Y{WoQsH\X, /&c6e5cB0>'&8RnQ#ΣN-{LGf [ܔR{FZ0# cvoKX"RSbRcx;ԯI}$2)2}#qXEoAcֹa#[308EVLe} rEK3=ڳI-ؔ<2Ov&S޸$eAhKsG#{q0 Ɇ(gd| |pωh߉ɑRDe)1dROCGOY1d`8ԝi脛bsG cm8a<Λ◙,6\[d 2/i.CbhdPD<+t$O2'б|BD:^LY'~eenO Mi1{0s~H#Bfu Dב_͆ 9RH!D:u#i=1c| -Ƣ^|z_>}}VGK"λG5,[E=XC0%%VJms&y䭑b x-z\E“8GF^坥1Ǒ䳾 ܇O&"=H%u{xȺocdzͤ>>C"VS&J+%4qF9F'KG SO~_33͑"C>LCݏt9&}4'{2H!4V$Oud{I?r B}؛d:!е{YБ?ivKɽUISbd:WI^[!қ'?9jǨD6 E9$*a2Rғxʼn3ƵQ=ȿ!fi4Y%C#{9~&o"}H$DHZ SD}3%crk5)$i4MG=R'?BhIo D\GuI%|ӗ!|)P0g‹b|129zdko19 z FBLrE~EqZ-~"KĹݢ݄q47Qo3'o1ɭ=} -Ivcos }Ia,Q~M.y4 HK⑚|]X>m3In(yzzL:1~M.\jxXŽ&xQMJYG{_3#8x2f"63'HC#6e<%Ilp+b\:zK[[b˖.78x2*MP{׸(M-504 = 4rq1~M._5p-"Cz1TlI6B|ouJOà)Eܙ9Łk%(R>';9>y#(aI|-=ąda#!iIE}D^DGWM/tij+5J)!/"Oz%R6EF~;VzLcvyt$: "H'ԑ29D@A(&HG# u*<,~} MY ϸĈndFXcrIȜWБ}>0G$<1#'ZLlcL=Dfp67j $p&?K/ʢWЗA%[~4' -׸%)6ĈOb.$M{DdC\tn:OđV@cd Gs,2%"-e,qTZ^1^Y8cHQD::jdyY[8,՜@B}Dj";t%nc,!N>b8r*彳flճ'd*D:"D}F4B^ET%2D -k[4!)15b&x9C$%c" 32x̅)9!#4WG6" 'wfԞZ"Dc>ag6%Fm)1nb!LIfHQ!~M!U`isb3{ BLP8F/arp&I"BnqcjxF[̫  Ym&TGS -&ZK,>Ϯ!yןԡ4?вW/#IBȕREhFPyWeвP,8[bExZOy]E]FqȲǓGi^ ):? l6ReyBg~Lѩ07ХdqC ,Kz+į,LF/ĪLG+yG LYg]r?XM9hXb,ayLY -iMt/4B)X˝YQ~/e -P臟D9B1F!y8C臟BQs[8y8?BJ^&!l#F2]]TБEV*(ѳg5F`ل,8!BȿU&hSl '#SX4!,aɉ8΋Y68F/eGc9?XQBC(cȟ袊j7f0W&,9e_~őͣ68F+HY?.f/L]ѡlbCY~8smZET](pX! -l~8QbYB ~ߴU4QSSWFB!=hP(?H]lqUP -m)|:ыu|5Q]iB-!P㭍_1tP; ש׽QECT2Z(qQER2<xR=74)pz6_cxS^ -(Уp͌" śt(8Bh Z}c)x}1B5%P~FF(}Pc?+Pk/=% # Mz-uC腑%Ҋ(pfv9Bƍn>G4f͞+.Y㥖\_WD_KQE־wcN8 (C6y1Xx^a/Kh"dQbbǁ 1c;Ye_ֲ_UE9j<QSE -CֺQ(KC1]#4?ҸJ8B,1`QFkcC}]4>Xe,je4WE}*QQEB< K_*PurQEE -\ -]4hp #ȍ_e}6?1FB,7Jp |;n%Ƅ,Nly|6\Oq 9]RE -/E;$PwC鲇͗6_Eu؇뭖\KQEQEzU6_̽uzǮz3cM zu]Qs}u]WTlQUŸ}z3?ZRCk&Q]+- -N -t(&Yse]jǁ`Ϫ|7NX_5J'ju]k੮?DX}/7u/SQr. rur.Ϣ]KQN>K_F+];tr*o;Լt],vetPԨ1qJ_+⹿Uܷs~ucV=uzՏJR 4lJƊ**+X͌BWl^F3Ga`؎00b,F<#ɨAcc4,ز,Y6,hilX7My< "61 GQ,|x4#p1df8Eb6l1hX7X7MǃHЅ`в!c#BɳqAcRBXhlYMY6rŃf&lf8#PbNC#BɳqAc]7 3ebMhX &Ńb8xOybF< dٸ?F9 &őd؅g!4jlFǃQ`Q#9 4,\j9}zBGEbȲl1FBDn03#BɳfG/t8FHbXdYEdcаlF87vlY63Fply؇Xdٳc?thХz6r"ٱMhX4,B6qlY61ѣ #ر1ɣM6j_:.q6lF͋"fB!eض#gc#GGb6#cdвlY6j_?]qX&͈؅g!4,l[8Mx4hc,B&lr R1ٱBȲl1XbEbزlx 8 #c"Ⱥr}Xr!l؆,&1,1`ء&<4q!dF3B?EC_}BC8E "ɱx_8[.4Xڄ"Z9}_.e__F<8b}_h^j5.n6xFmWkDe.,up?B]R*+ qtlYKX1FBU`N\_[,J4hB͎V}.'E2ަo⨮W]BhЍ<.ǁB먯g5;?q}X8g#4X !5+?Wo#sCc5+?zEQR+Yen&ghQ] -5B(}!}Y#F>QqCq9pˇݱ4xġMCLJ}AzQ^?Pa#PxȰ,=(b鼨**+*nY}PlBF"/fѱ1yE5+= BW6\Yevgfjt'7s٘FQF#!*n9ceh)<]vHhF*|*n_9];8F0# *V7] L(Ye]4%҅5884qT5 -R4hXsy8`y2hxP̡ȒlGqySpR}?aBß8Yc^0PhP`~Fh8Q&U!dK1?fqZ./j8ETJ*+ᢦESG thEqtvC8L<[%d,cȲ4mвExgiMO _S|=wR((S5EEQE1$ 0`@AP1!p?BB -('@( P(P( ~j]C\?ΎuA RzCK(1p߭ c~kWU -{ "@(PxŽqCI(Ao0CDwB+A:Wk*6 yDWz5v }yRt*Whl[ ۏJ\EE@"_(xP?PpͣhQ(1Qĕ*TzҊ(?OJ+-&CF|Ԕ(T$`2 ! -Rzg]<^P8>9 $(2 lJ9 -4q9-8J*ZT䆎Y⟹>P"ܮ`ÕZTOpT(PŎECǀxi~qv -tb/BAB<~Oڔl,h|Bva>4(P(P(]tt]4_K -endstream -endobj -6 0 obj -<>/F(pageEntities.json)/Type/Filespec/UF(pageEntities.json)>> -endobj -7 0 obj -<>/Subtype/application#2Fjson/Type/EmbeddedFile>>stream -{ "type": "Document", "isBackSide": false } -endstream -endobj -8 0 obj -<> -endobj -xref -0 9 -0000000001 65535 f -0000000021 00000 n -0000000070 00000 n -0000000124 00000 n -0000000357 00000 n -0000008216 00000 n -0000205041 00000 n -0000205172 00000 n -0000205370 00000 n -trailer -<> -startxref -205507 -%%EOF diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/fb182b0d-bd10-4988-9597-726e89db7c7f.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/fb182b0d-bd10-4988-9597-726e89db7c7f.pdf deleted file mode 100644 index 45e27cf..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/fb182b0d-bd10-4988-9597-726e89db7c7f.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/fc3baae4-0872-4b22-bfdb-bee579f607e5.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/fc3baae4-0872-4b22-bfdb-bee579f607e5.pdf deleted file mode 100644 index f6f71a2..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/fc3baae4-0872-4b22-bfdb-bee579f607e5.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/fd954387-52a7-4ddd-ac8f-17700cc73bb9.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/fd954387-52a7-4ddd-ac8f-17700cc73bb9.pdf deleted file mode 100644 index 3ac31e0..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/01/fd954387-52a7-4ddd-ac8f-17700cc73bb9.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/02/0a4a5854-2165-4175-9c46-988fff8cbf9c.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/02/0a4a5854-2165-4175-9c46-988fff8cbf9c.pdf deleted file mode 100644 index 39f7e96..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/02/0a4a5854-2165-4175-9c46-988fff8cbf9c.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/02/281a8265-496c-445c-ab6c-166ca89984a6.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/02/281a8265-496c-445c-ab6c-166ca89984a6.pdf deleted file mode 100644 index 691a4ea..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/02/281a8265-496c-445c-ab6c-166ca89984a6.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/02/e797cf2e-785f-4cf1-bf2f-f7aed56356ce.pdf b/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/02/e797cf2e-785f-4cf1-bf2f-f7aed56356ce.pdf deleted file mode 100644 index 6f68f7f..0000000 Binary files a/deploy-package-20260223-151231/backend/data/receipts/uploads/2026/02/e797cf2e-785f-4cf1-bf2f-f7aed56356ce.pdf and /dev/null differ diff --git a/deploy-package-20260223-151231/backend/data/telegram/.gitkeep b/deploy-package-20260223-151231/backend/data/telegram/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/main.py b/deploy-package-20260223-151231/backend/main.py deleted file mode 100644 index 51e5f3c..0000000 --- a/deploy-package-20260223-151231/backend/main.py +++ /dev/null @@ -1,685 +0,0 @@ -""" -ROA2WEB Unified Backend - Single FastAPI Application -Consolidates Reports, Data Entry, and Telegram modules into one process -""" - -# ============================================================================= -# UTF-8 ENCODING FIX FOR WINDOWS CONSOLE -# Must be at the TOP, before any logging or print statements -# Fixes: 'charmap' codec can't encode character errors with Romanian diacritics -# ============================================================================= -import sys -if sys.platform == 'win32': - # Force UTF-8 encoding on Windows console - # This prevents encoding errors when logging Romanian characters (ă, î, ș, ț) - import io - sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8', errors='replace') - sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-8', errors='replace') - -import asyncio -import logging -import os -import sys -from datetime import datetime -from pathlib import Path -from contextlib import asynccontextmanager - -from dotenv import load_dotenv -from fastapi import FastAPI -from fastapi.middleware.cors import CORSMiddleware - -# Load environment variables -load_dotenv() - -# Add project root and shared modules to path -project_root = Path(__file__).parent.parent -sys.path.insert(0, str(project_root)) # Enable 'from backend.xxx import yyy' -sys.path.insert(0, str(project_root / "shared")) # Enable 'from shared.xxx import yyy' - -# Import configuration -from backend.config import settings - -# Import shared infrastructure -from shared.database.oracle_pool import oracle_pool -from shared.auth.middleware import AuthenticationMiddleware -from shared.auth.routes import create_auth_router -from shared.routes.companies import create_companies_router -from shared.routes.calendar import create_calendar_router -from shared.routes.system import create_system_router - -# Import module router factories -from backend.modules.reports.routers import create_reports_router -from backend.modules.data_entry.routers import create_data_entry_router -from backend.modules.telegram.routers import create_telegram_router - -# Configure logging (level from env: DEBUG, INFO, WARNING, ERROR) -log_level = os.getenv('LOG_LEVEL', 'INFO').upper() -logging.basicConfig( - level=getattr(logging, log_level, logging.INFO), - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', - datefmt='%H:%M:%S' -) -# Reduce noise from third-party libraries -logging.getLogger('httpcore').setLevel(logging.WARNING) -logging.getLogger('httpx').setLevel(logging.WARNING) -logging.getLogger('multipart').setLevel(logging.WARNING) -logging.getLogger('doctr').setLevel(logging.WARNING) -logging.getLogger('tensorflow').setLevel(logging.WARNING) -logging.getLogger('PIL').setLevel(logging.WARNING) -logger = logging.getLogger(__name__) - -# Global variables for background tasks -telegram_bot_task = None -ocr_job_worker_running = False -cleanup_task_running = False -email_cache_running = False -ssh_tunnel_monitoring = False - - -# ============================================================================ -# INITIALIZATION FUNCTIONS -# ============================================================================ - -async def init_oracle_pool(): - """Initialize Oracle connection pool (shared by all modules).""" - logger.info("[ORACLE] Initializing connection pool...") - - # Get configured servers - servers = settings.get_oracle_servers() - - if servers: - # Multi-server mode: register all servers for lazy pool creation - logger.info(f"[ORACLE] Registering {len(servers)} servers for lazy pool creation:") - for srv in servers: - oracle_pool.register_server( - server_id=srv.id, - host=srv.host, - port=srv.port, - user=srv.user, - password=srv.password, - sid=srv.sid, - service_name=srv.service_name, - ) - logger.info(f"[ORACLE] - {srv.id}: {srv.name} @ {srv.host}:{srv.port}") - - # Mark as initialized (pools will be created lazily on first connection) - await oracle_pool.initialize() - else: - # Legacy single-server mode: initialize with env vars - logger.info("[ORACLE] Using legacy single-server configuration") - await oracle_pool.initialize() - - logger.info("[ORACLE] ✅ Pool manager initialized successfully") - - -async def init_reports_cache(): - """Initialize Reports cache system.""" - logger.info("[REPORTS] Initializing cache system...") - try: - from backend.modules.reports.cache import init_cache, init_event_monitor, get_cache - from backend.modules.reports.cache.config import CacheConfig - - cache_config = CacheConfig.from_env() - await init_cache(cache_config) - logger.info(f"[REPORTS] ✅ Cache initialized: type={cache_config.cache_type}, enabled={cache_config.enabled}") - - # Initialize event monitor - cache = get_cache() - await init_event_monitor(cache, cache_config) - if cache_config.auto_invalidate_enabled: - logger.info("[REPORTS] Event-based auto-invalidation ENABLED") - else: - logger.info("[REPORTS] Event-based auto-invalidation DISABLED") - - except Exception as e: - logger.error(f"[REPORTS] ⚠️ Cache initialization error: {e}", exc_info=True) - logger.warning("[REPORTS] Continuing without cache") - - -async def init_data_entry_db(): - """Initialize Data Entry SQLite database.""" - logger.info("[DATA-ENTRY] Initializing SQLite database...") - try: - from backend.modules.data_entry.db.database import init_db - await init_db() - logger.info(f"[DATA-ENTRY] ✅ Database initialized: {settings.data_entry_sqlite_database_path}") - - # Ensure upload directory exists - settings.data_entry_upload_path_resolved - logger.info(f"[DATA-ENTRY] Upload path: {settings.data_entry_upload_path_resolved}") - - except Exception as e: - logger.error(f"[DATA-ENTRY] ❌ Database initialization error: {e}", exc_info=True) - raise - - -async def init_telegram_db(): - """Initialize Telegram SQLite database.""" - logger.info("[TELEGRAM] Initializing SQLite database...") - try: - from backend.modules.telegram.db import init_database, cleanup_expired_codes, cleanup_expired_sessions, cleanup_expired_email_codes - - await init_database() - logger.info(f"[TELEGRAM] ✅ Database initialized: {settings.telegram_sqlite_database_path}") - - # Cleanup expired data - expired_codes = await cleanup_expired_codes() - expired_sessions = await cleanup_expired_sessions() - expired_email_codes = await cleanup_expired_email_codes() - logger.info(f"[TELEGRAM] Cleanup: {expired_codes} codes, {expired_sessions} sessions, {expired_email_codes} email codes removed") - - except Exception as e: - logger.error(f"[TELEGRAM] ❌ Database initialization error: {e}", exc_info=True) - raise - - -async def init_ocr_job_worker(): - """Initialize OCR job worker with persistent PaddleOCR. - - This replaces the old background thread approach: - - Starts ProcessPoolExecutor with persistent worker - - Pre-warms PaddleOCR (loads once, reuses for all requests) - - Starts job queue background task - """ - global ocr_job_worker_running - - logger.info("[OCR] Initializing OCR job worker...") - try: - from backend.modules.data_entry.services.ocr.job_worker import start_job_worker, is_running - - success = await start_job_worker() - ocr_job_worker_running = is_running() - - if success: - logger.info("[OCR] ✅ Job worker started (PaddleOCR persistent)") - else: - logger.warning("[OCR] ⚠️ Job worker failed to start, falling back to sync mode") - - except Exception as e: - logger.warning(f"[OCR] ⚠️ OCR job worker init failed: {e}") - logger.warning("[OCR] Continuing with sync OCR mode") - ocr_job_worker_running = False - - -async def init_cleanup_task(): - """Initialize the cleanup background task for expired failed receipts (US-008). - - Runs cleanup at startup and then every 24 hours: - - Finds receipts with processing_status='failed' older than 7 days - - Deletes the receipts and their attachment files from storage - """ - global cleanup_task_running - - logger.info("[CLEANUP] Initializing cleanup background task...") - try: - from backend.modules.data_entry.services.cleanup_service import start_cleanup_task - from backend.modules.data_entry.db.database import get_session - - success = await start_cleanup_task(get_session) - cleanup_task_running = success - - if success: - logger.info("[CLEANUP] ✅ Cleanup task started (runs daily)") - else: - logger.warning("[CLEANUP] ⚠️ Cleanup task failed to start") - - except Exception as e: - logger.warning(f"[CLEANUP] ⚠️ Cleanup task init failed: {e}") - cleanup_task_running = False - - -async def init_email_server_cache(): - """Initialize the email-server cache for multi-Oracle auto-discovery (US-003). - - Builds a cache mapping emails to server IDs by querying CONTAFIN_ORACLE.UTILIZATORI - on each configured Oracle server. Starts auto-refresh every 15 minutes. - """ - global email_cache_running - - # Only initialize if multi-server mode is configured - servers = settings.get_oracle_servers() - if not servers or len(servers) <= 1: - logger.info("[EMAIL-CACHE] Single-server mode, skipping email cache initialization") - return - - logger.info("[EMAIL-CACHE] Initializing email-server cache...") - try: - from shared.auth.email_server_cache import ( - email_server_cache, - build_email_cache, - start_email_cache_refresh - ) - - # Build initial cache - await build_email_cache() - - # Start auto-refresh - await start_email_cache_refresh() - email_cache_running = True - - stats = email_server_cache.get_cache_stats() - logger.info(f"[EMAIL-CACHE] ✅ Cache initialized: {stats['total_emails']} emails") - - except Exception as e: - logger.warning(f"[EMAIL-CACHE] ⚠️ Cache init failed: {e}") - logger.warning("[EMAIL-CACHE] Multi-server email lookup will not be available") - email_cache_running = False - - -async def init_ssh_tunnel_monitoring(): - """Initialize SSH tunnel monitoring with auto-reconnect. - - This does NOT start tunnels - they should already be running - (started by start.sh / start.ps1 / start-backend-service.ps1). - - Responsibilities: - - Monitor tunnel health via port checks (every 30s) - - Auto-restart tunnels if they go down - - Expose status for /health endpoint - """ - global ssh_tunnel_monitoring - - logger.info("[SSH-MONITOR] Initializing tunnel monitoring...") - try: - from backend.shared.ssh_tunnel_manager import ssh_tunnel_manager - - success = await ssh_tunnel_manager.start_monitoring() - ssh_tunnel_monitoring = success - - if success: - status = ssh_tunnel_manager.get_status() - if status["status"] == "not_configured": - logger.info("[SSH-MONITOR] No tunnels configured (direct connection mode)") - else: - logger.info(f"[SSH-MONITOR] ✅ Monitoring active: {status['status']}") - else: - logger.warning("[SSH-MONITOR] ⚠️ Failed to start monitoring") - - except Exception as e: - logger.warning(f"[SSH-MONITOR] ⚠️ Init failed: {e}") - ssh_tunnel_monitoring = False - - -async def run_telegram_bot(): - """Run Telegram bot as background task.""" - logger.info("[TELEGRAM] Starting bot...") - try: - from telegram.ext import Application, CommandHandler, CallbackQueryHandler, MessageHandler, filters - from backend.modules.telegram.bot.handlers import ( - start_command, help_command, clear_command, companies_command, - unlink_command, selectcompany_command, dashboard_command, sold_command, - facturi_command, trezorerie_command, menu_command, trezorerie_casa_command, - trezorerie_banca_command, clienti_command, furnizori_command, evolutie_command, - clearcache_command, togglecache_command, handle_text_message, button_callback, - error_handler - ) - from backend.modules.telegram.bot.email_handlers import email_login_handler - - # Create Telegram application - application = Application.builder().token(settings.telegram_bot_token).build() - - # Register handlers - application.add_handler(email_login_handler) - application.add_handler(CommandHandler("start", start_command)) - application.add_handler(CommandHandler("menu", menu_command)) - application.add_handler(CommandHandler("help", help_command)) - application.add_handler(CommandHandler("unlink", unlink_command)) - application.add_handler(CommandHandler("clear", clear_command)) - application.add_handler(CommandHandler("companies", companies_command)) - application.add_handler(CommandHandler("selectcompany", selectcompany_command)) - application.add_handler(CommandHandler("dashboard", dashboard_command)) - application.add_handler(CommandHandler("sold", sold_command)) - application.add_handler(CommandHandler("facturi", facturi_command)) - application.add_handler(CommandHandler("trezorerie", trezorerie_command)) - application.add_handler(CommandHandler("trezorerie_casa", trezorerie_casa_command)) - application.add_handler(CommandHandler("trezorerie_banca", trezorerie_banca_command)) - application.add_handler(CommandHandler("clienti", clienti_command)) - application.add_handler(CommandHandler("furnizori", furnizori_command)) - application.add_handler(CommandHandler("evolutie", evolutie_command)) - application.add_handler(CommandHandler("clearcache", clearcache_command)) - application.add_handler(CommandHandler("togglecache", togglecache_command)) - application.add_handler(MessageHandler(filters.TEXT & ~filters.COMMAND, handle_text_message)) - application.add_handler(CallbackQueryHandler(button_callback)) - application.add_error_handler(error_handler) - - # Initialize and start - await application.initialize() - await application.start() - await application.updater.start_polling( - drop_pending_updates=True, - poll_interval=0, # No delay between polls - timeout=30 # Long poll timeout 30 seconds (reduces requests from ~6/min to ~2/min) - ) - - bot_info = await application.bot.get_me() - logger.info(f"[TELEGRAM] ✅ Bot running: @{bot_info.username}") - - # Keep bot running - while True: - await asyncio.sleep(1) - - except asyncio.CancelledError: - logger.info("[TELEGRAM] Bot task cancelled, stopping...") - if 'application' in locals(): - await application.updater.stop() - await application.stop() - await application.shutdown() - logger.info("[TELEGRAM] ✅ Bot stopped") - raise - except Exception as e: - logger.error(f"[TELEGRAM] ❌ Bot error: {e}", exc_info=True) - raise - - -# ============================================================================ -# FASTAPI APPLICATION -# ============================================================================ - -app = FastAPI( - title="ROA2WEB Unified Backend", - description="Unified FastAPI backend for Reports, Data Entry, and Telegram modules", - version="1.0.0" -) - - -# ============================================================================ -# STARTUP/SHUTDOWN EVENT HANDLERS -# ============================================================================ - -@app.on_event("startup") -async def startup_event(): - """Application startup - Initialize all resources.""" - global telegram_bot_task - - logger.info("=" * 80) - logger.info("[STARTUP] ROA2WEB Unified Backend") - logger.info("=" * 80) - - try: - # Step 1: Initialize Oracle pool (shared by all modules) - await init_oracle_pool() - - # Step 2: Parallel initialization of module-specific resources - logger.info("[STARTUP] Initializing module resources in parallel...") - await asyncio.gather( - init_reports_cache(), - init_data_entry_db(), - init_telegram_db(), - ) - - # Step 3: Initialize OCR job worker (with persistent PaddleOCR) - await init_ocr_job_worker() - - # Step 4: Initialize cleanup task for expired failed receipts (US-008) - await init_cleanup_task() - - # Step 5: Initialize email-server cache for multi-Oracle (US-003) - await init_email_server_cache() - - # Step 6: Initialize SSH tunnel monitoring (auto-reconnect) - await init_ssh_tunnel_monitoring() - - # Step 7: Start Telegram bot as background task - if settings.telegram_bot_token: - telegram_bot_task = asyncio.create_task(run_telegram_bot()) - logger.info("[STARTUP] ✅ Telegram bot task created") - else: - logger.warning("[STARTUP] ⚠️ TELEGRAM_BOT_TOKEN not set, bot disabled") - - logger.info("=" * 80) - logger.info("[STARTUP] ✅ All modules initialized successfully") - logger.info(f"[STARTUP] ✅ Server running on http://{settings.api_host}:{settings.api_port}") - logger.info("=" * 80) - - except Exception as e: - logger.error(f"[STARTUP] ❌ Initialization failed: {e}", exc_info=True) - raise - - -@app.on_event("shutdown") -async def shutdown_event(): - """Application shutdown - Cleanup resources.""" - global telegram_bot_task, ocr_job_worker_running, cleanup_task_running, email_cache_running, ssh_tunnel_monitoring - - logger.info("=" * 80) - logger.info("[SHUTDOWN] Stopping ROA2WEB Unified Backend...") - logger.info("=" * 80) - - try: - # Stop SSH tunnel monitoring - if ssh_tunnel_monitoring: - logger.info("[SHUTDOWN] Stopping SSH tunnel monitoring...") - try: - from backend.shared.ssh_tunnel_manager import ssh_tunnel_manager - await ssh_tunnel_manager.stop_monitoring() - ssh_tunnel_monitoring = False - logger.info("[SHUTDOWN] SSH tunnel monitoring stopped") - except Exception as e: - logger.error(f"[SHUTDOWN] SSH tunnel monitoring error: {e}") - - # Stop email cache auto-refresh (US-003) - if email_cache_running: - logger.info("[SHUTDOWN] Stopping email cache auto-refresh...") - try: - from shared.auth.email_server_cache import stop_email_cache_refresh - await stop_email_cache_refresh() - email_cache_running = False - logger.info("[SHUTDOWN] Email cache stopped") - except Exception as e: - logger.error(f"[SHUTDOWN] Email cache error: {e}") - - # Stop cleanup task (US-008) - if cleanup_task_running: - logger.info("[SHUTDOWN] Stopping cleanup task...") - try: - from backend.modules.data_entry.services.cleanup_service import stop_cleanup_task - await stop_cleanup_task() - cleanup_task_running = False - logger.info("[SHUTDOWN] Cleanup task stopped") - except Exception as e: - logger.error(f"[SHUTDOWN] Cleanup task error: {e}") - - # Stop OCR job worker - if ocr_job_worker_running: - logger.info("[SHUTDOWN] Stopping OCR job worker...") - try: - from backend.modules.data_entry.services.ocr.job_worker import stop_job_worker - await stop_job_worker() - ocr_job_worker_running = False - logger.info("[SHUTDOWN] OCR job worker stopped") - except Exception as e: - logger.error(f"[SHUTDOWN] OCR worker error: {e}") - - # Stop Telegram bot - if telegram_bot_task and not telegram_bot_task.done(): - logger.info("[SHUTDOWN] Stopping Telegram bot...") - telegram_bot_task.cancel() - try: - await telegram_bot_task - except asyncio.CancelledError: - pass - - # Stop Reports cache event monitor - try: - from backend.modules.reports.cache import close_cache, get_event_monitor - monitor = get_event_monitor() - if monitor: - await monitor.stop() - logger.info("[SHUTDOWN] Reports cache monitor stopped") - - await close_cache() - logger.info("[SHUTDOWN] Reports cache closed") - except Exception as e: - logger.error(f"[SHUTDOWN] Cache error: {e}") - - # Close Oracle pool - await oracle_pool.close_pool() - logger.info("[SHUTDOWN] Oracle pool closed") - - logger.info("=" * 80) - logger.info("[SHUTDOWN] ✅ Shutdown complete") - logger.info("=" * 80) - - except Exception as e: - logger.error(f"[SHUTDOWN] Error during shutdown: {e}", exc_info=True) - - -# ============================================================================ -# MIDDLEWARE -# ============================================================================ - -# CORS middleware -app.add_middleware( - CORSMiddleware, - allow_origins=["*"], # Allow all origins for production deployment - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - -# Authentication middleware -app.add_middleware( - AuthenticationMiddleware, - excluded_paths=[ - "/", "/docs", "/health", "/redoc", "/openapi.json", - "/api/auth/login", "/api/auth/refresh", "/api/auth/check-email", - "/api/auth/check-identity", # US-013: Dual login support (email + username) - "/api/system/auth-mode", # Public endpoint for login mode detection - "/api/telegram/auth/verify-user", - "/api/telegram/auth/verify-email", - "/api/telegram/auth/login-with-email", - "/api/telegram/auth/refresh-token", - "/api/telegram/health", - "/api/telegram/internal/save-code" - ] -) - - -# ============================================================================ -# ROUTER REGISTRATION -# ============================================================================ - -# Module routers with prefixes -app.include_router(create_reports_router(), prefix="/api/reports", tags=["reports"]) -app.include_router(create_data_entry_router(), prefix="/api/data-entry", tags=["data-entry"]) -app.include_router(create_telegram_router(), prefix="/api/telegram", tags=["telegram"]) - -# Shared routers -auth_router = create_auth_router(prefix="", tags=["authentication"]) -app.include_router(auth_router, prefix="/api/auth") - -companies_router = create_companies_router(oracle_pool, tags=["companies"]) -app.include_router(companies_router, prefix="/api/companies") - -calendar_router = create_calendar_router(oracle_pool, tags=["calendar"]) -app.include_router(calendar_router, prefix="/api/calendar") - -system_router = create_system_router() -app.include_router(system_router, prefix="/api/system", tags=["system"]) - - -# ============================================================================ -# ROOT & HEALTH ENDPOINTS -# ============================================================================ - -@app.get("/") -async def root(): - """Root endpoint - API information.""" - return { - "name": settings.app_name, - "version": settings.app_version, - "status": "running", - "modules": ["reports", "data-entry", "telegram"], - "docs": "/docs", - "health": "/health" - } - - -@app.get("/health") -async def health_check(): - """Health check endpoint with module status.""" - health_status = { - "api": "healthy", - "timestamp": datetime.utcnow().isoformat(), - "modules": {} - } - - # Check Oracle connection - try: - async with oracle_pool.get_connection() as conn: - with conn.cursor() as cursor: - cursor.execute("SELECT 1 FROM DUAL") - health_status["modules"]["oracle"] = "connected" - except Exception as e: - health_status["modules"]["oracle"] = f"error: {str(e)}" - - # Check Reports cache - try: - from backend.modules.reports.cache import get_cache - cache = get_cache() - health_status["modules"]["reports_cache"] = "initialized" if cache else "disabled" - except Exception as e: - health_status["modules"]["reports_cache"] = f"error: {str(e)}" - - # Check Data Entry DB - try: - db_path = Path(settings.data_entry_sqlite_database_path) - health_status["modules"]["data_entry_db"] = "exists" if db_path.exists() else "missing" - except Exception as e: - health_status["modules"]["data_entry_db"] = f"error: {str(e)}" - - # Check Telegram bot - global telegram_bot_task - if telegram_bot_task: - if telegram_bot_task.done(): - health_status["modules"]["telegram_bot"] = "stopped" - else: - health_status["modules"]["telegram_bot"] = "running" - else: - health_status["modules"]["telegram_bot"] = "disabled" - - # Check OCR job worker - global ocr_job_worker_running - try: - from backend.modules.data_entry.services.ocr.job_worker import is_running - from backend.modules.data_entry.services.ocr.job_queue import job_queue - - if is_running(): - # Get queue stats - stats = await job_queue.get_queue_stats() - health_status["modules"]["ocr_worker"] = { - "status": "running", - "pending_jobs": stats.get("pending", 0), - "processing_jobs": stats.get("processing", 0), - "avg_time_seconds": stats.get("average_time_seconds", 0) - } - else: - health_status["modules"]["ocr_worker"] = "stopped" - except Exception as e: - health_status["modules"]["ocr_worker"] = f"error: {str(e)}" - - # Check SSH tunnels - global ssh_tunnel_monitoring - try: - from backend.shared.ssh_tunnel_manager import ssh_tunnel_manager - health_status["modules"]["ssh_tunnels"] = ssh_tunnel_manager.get_status() - except Exception as e: - health_status["modules"]["ssh_tunnels"] = f"error: {str(e)}" - - return health_status - - -# ============================================================================ -# MAIN ENTRY POINT -# ============================================================================ - -if __name__ == "__main__": - import uvicorn - - uvicorn.run( - "backend.main:app", - host=settings.api_host, - port=settings.api_port, - reload=False, - log_level="info" - ) diff --git a/deploy-package-20260223-151231/backend/modules/__init__.py b/deploy-package-20260223-151231/backend/modules/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/__init__.py b/deploy-package-20260223-151231/backend/modules/data_entry/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/alembic.ini b/deploy-package-20260223-151231/backend/modules/data_entry/alembic.ini deleted file mode 100644 index 800e3b6..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/alembic.ini +++ /dev/null @@ -1,94 +0,0 @@ -# Alembic configuration for Data Entry module - -[alembic] -# path to migration scripts -script_location = migrations - -# template used to generate migration files -file_template = %%(year)d%%(month).2d%%(day).2d_%%(slug)s - -# sys.path path, will be prepended to sys.path if present. -prepend_sys_path = . - -# timezone to use when rendering the date within the migration file -# as well as the filename. -# string value is passed to dateutil.tz.gettz() -# leave blank for localtime -# timezone = - -# max length of characters to apply to the -# "slug" field -# truncate_slug_length = 40 - -# set to 'true' to run the environment during -# the 'revision' command, regardless of autogenerate -# revision_environment = false - -# set to 'true' to allow .pyc and .pyo files without -# a source .py file to be detected as revisions in the -# versions/ directory -# sourceless = false - -# version location specification; This defaults -# to migrations/versions. When using multiple version -# directories, initial revisions must be specified with --version-path. -# version_locations = %(here)s/bar:%(here)s/bat:migrations/versions - -# version path separator -# version_path_separator = : - -# set to 'true' to search source files recursively -# in each "version_locations" directory -# recursive_version_locations = false - -# the output encoding used when revision files -# are written from script.py.mako -# output_encoding = utf-8 - -# SQLite database URL - will be overridden by env.py using SQLITE_DATABASE_PATH env var -sqlalchemy.url = sqlite:///data/receipts/receipts.db - -[post_write_hooks] -# post_write_hooks defines scripts or Python functions that are run -# on newly generated revision scripts. See the documentation for further -# detail and examples - -# format using "black" - disabled -# hooks = black -# black.type = console_scripts -# black.entrypoint = black -# black.options = -q - -[loggers] -keys = root,sqlalchemy,alembic - -[handlers] -keys = console - -[formatters] -keys = generic - -[logger_root] -level = WARN -handlers = console -qualname = - -[logger_sqlalchemy] -level = WARN -handlers = -qualname = sqlalchemy.engine - -[logger_alembic] -level = INFO -handlers = -qualname = alembic - -[handler_console] -class = StreamHandler -args = (sys.stderr,) -level = NOTSET -formatter = generic - -[formatter_generic] -format = %(levelname)-5.5s [%(name)s] %(message)s -datefmt = %H:%M:%S diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/config.py b/deploy-package-20260223-151231/backend/modules/data_entry/config.py deleted file mode 100644 index a2ecf36..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/config.py +++ /dev/null @@ -1,110 +0,0 @@ -"""Application configuration using pydantic-settings.""" - -import os -from pathlib import Path -from typing import List -from pydantic_settings import BaseSettings -from functools import lru_cache - - -class Settings(BaseSettings): - """Application settings loaded from environment variables.""" - - # App info - app_name: str = "Data Entry API" - app_version: str = "1.0.0" - debug: bool = False - - # API - api_host: str = "0.0.0.0" - api_port: int = 8003 - - # SQLite Database - sqlite_database_path: str = "data/receipts/receipts.db" - - # File uploads - upload_path: str = "data/uploads" - max_upload_size_mb: int = 10 - allowed_mime_types: List[str] = [ - "image/jpeg", - "image/png", - "image/gif", - "image/webp", - "application/pdf", - ] - - # Oracle Database (for nomenclatures) - oracle_user: str = "" - oracle_password: str = "" - oracle_host: str = "localhost" - oracle_port: int = 1526 - oracle_sid: str = "ROA" - - # JWT Authentication - jwt_secret_key: str = "change-me-in-production" - jwt_algorithm: str = "HS256" - jwt_expire_minutes: int = 480 - - # CORS - cors_origins: str = "http://localhost:3010,http://localhost:3000" - - # OCR Engines (comma-separated list of active engines shown in UI) - # Available: tesseract, paddleocr, doctr, doctr_plus - # doctr_plus is recommended (2-tier sequential with early exit) - ocr_active_engines: str = "doctr,doctr_plus" - - class Config: - env_file = ".env" - env_file_encoding = "utf-8" - extra = "ignore" - - @property - def database_url(self) -> str: - """Get SQLite database URL for async.""" - # Resolve to absolute path for Windows/IIS compatibility - abs_path = Path(self.sqlite_database_path).resolve() - return f"sqlite+aiosqlite:///{abs_path}" - - @property - def sync_database_url(self) -> str: - """Get SQLite database URL for sync operations (Alembic).""" - # Resolve to absolute path for Windows/IIS compatibility - abs_path = Path(self.sqlite_database_path).resolve() - return f"sqlite:///{abs_path}" - - @property - def upload_path_resolved(self) -> Path: - """Get resolved upload path.""" - path = Path(self.upload_path) - path.mkdir(parents=True, exist_ok=True) - return path - - @property - def max_upload_size_bytes(self) -> int: - """Get max upload size in bytes.""" - return self.max_upload_size_mb * 1024 * 1024 - - @property - def cors_origins_list(self) -> List[str]: - """Get CORS origins as list.""" - return [origin.strip() for origin in self.cors_origins.split(",")] - - @property - def ocr_active_engines_list(self) -> List[str]: - """Get OCR active engines as list.""" - return [engine.strip() for engine in self.ocr_active_engines.split(",")] - - @property - def oracle_dsn(self) -> str: - """Get Oracle DSN string.""" - return f"{self.oracle_host}:{self.oracle_port}/{self.oracle_sid}" - - -@lru_cache() -def get_settings() -> Settings: - """Get cached settings instance.""" - return Settings() - - -# Convenience instance -settings = get_settings() diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/__init__.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/__init__.py deleted file mode 100644 index d31153e..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -# Database module -from .database import get_session, init_db, engine - -__all__ = ["get_session", "init_db", "engine"] diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/__init__.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/__init__.py deleted file mode 100644 index bce6e73..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -# CRUD operations -from .receipt import ReceiptCRUD -from .attachment import AttachmentCRUD -from .accounting_entry import AccountingEntryCRUD -from .ocr_settings import OCRPreferenceCRUD, OCRMetricsCRUD - -__all__ = [ - "ReceiptCRUD", - "AttachmentCRUD", - "AccountingEntryCRUD", - "OCRPreferenceCRUD", - "OCRMetricsCRUD", -] diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/accounting_entry.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/accounting_entry.py deleted file mode 100644 index f321295..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/accounting_entry.py +++ /dev/null @@ -1,197 +0,0 @@ -"""CRUD operations for accounting entries.""" - -from datetime import datetime -from typing import Optional, List - -from sqlalchemy import select, delete -from sqlalchemy.ext.asyncio import AsyncSession - -from backend.modules.data_entry.db.models.accounting_entry import AccountingEntry, EntryType -from backend.modules.data_entry.schemas.receipt import AccountingEntryCreate, AccountingEntryUpdate - - -class AccountingEntryCRUD: - """CRUD operations for AccountingEntry model.""" - - @staticmethod - async def create( - session: AsyncSession, - receipt_id: int, - data: AccountingEntryCreate, - sort_order: int = 0, - is_auto_generated: bool = True, - ) -> AccountingEntry: - """Create a new accounting entry.""" - entry = AccountingEntry( - receipt_id=receipt_id, - entry_type=data.entry_type, - account_code=data.account_code, - account_name=data.account_name, - amount=data.amount, - partner_id=data.partner_id, - cost_center_id=data.cost_center_id, - is_auto_generated=is_auto_generated, - sort_order=sort_order, - ) - - session.add(entry) - await session.commit() - await session.refresh(entry) - return entry - - @staticmethod - async def create_bulk( - session: AsyncSession, - receipt_id: int, - entries: List[AccountingEntryCreate], - is_auto_generated: bool = True, - ) -> List[AccountingEntry]: - """Create multiple accounting entries at once.""" - created_entries = [] - - for idx, entry_data in enumerate(entries): - entry = AccountingEntry( - receipt_id=receipt_id, - entry_type=entry_data.entry_type, - account_code=entry_data.account_code, - account_name=entry_data.account_name, - amount=entry_data.amount, - partner_id=entry_data.partner_id, - cost_center_id=entry_data.cost_center_id, - is_auto_generated=is_auto_generated, - sort_order=idx, - ) - session.add(entry) - created_entries.append(entry) - - await session.commit() - - for entry in created_entries: - await session.refresh(entry) - - return created_entries - - @staticmethod - async def get_by_id( - session: AsyncSession, - entry_id: int, - ) -> Optional[AccountingEntry]: - """Get accounting entry by ID.""" - query = select(AccountingEntry).where(AccountingEntry.id == entry_id) - result = await session.execute(query) - return result.scalar_one_or_none() - - @staticmethod - async def get_by_receipt_id( - session: AsyncSession, - receipt_id: int, - ) -> List[AccountingEntry]: - """Get all accounting entries for a receipt.""" - query = select(AccountingEntry).where( - AccountingEntry.receipt_id == receipt_id - ).order_by(AccountingEntry.sort_order.asc()) - - result = await session.execute(query) - return list(result.scalars().all()) - - @staticmethod - async def update( - session: AsyncSession, - entry: AccountingEntry, - data: AccountingEntryUpdate, - modified_by: str, - ) -> AccountingEntry: - """Update an accounting entry.""" - update_data = data.model_dump(exclude_unset=True) - - for field, value in update_data.items(): - setattr(entry, field, value) - - entry.is_auto_generated = False - entry.modified_by = modified_by - entry.modified_at = datetime.utcnow() - - session.add(entry) - await session.commit() - await session.refresh(entry) - return entry - - @staticmethod - async def delete(session: AsyncSession, entry: AccountingEntry) -> bool: - """Delete an accounting entry.""" - await session.delete(entry) - await session.commit() - return True - - @staticmethod - async def delete_all_for_receipt(session: AsyncSession, receipt_id: int) -> int: - """Delete all accounting entries for a receipt.""" - query = delete(AccountingEntry).where(AccountingEntry.receipt_id == receipt_id) - result = await session.execute(query) - await session.commit() - return result.rowcount - - @staticmethod - async def replace_all_for_receipt( - session: AsyncSession, - receipt_id: int, - entries: List[AccountingEntryCreate], - modified_by: str, - ) -> List[AccountingEntry]: - """Replace all entries for a receipt with new ones.""" - # Delete existing entries - await AccountingEntryCRUD.delete_all_for_receipt(session, receipt_id) - - # Create new entries (marked as manually modified) - created_entries = [] - - for idx, entry_data in enumerate(entries): - entry = AccountingEntry( - receipt_id=receipt_id, - entry_type=entry_data.entry_type, - account_code=entry_data.account_code, - account_name=entry_data.account_name, - amount=entry_data.amount, - partner_id=entry_data.partner_id, - cost_center_id=entry_data.cost_center_id, - is_auto_generated=False, - modified_by=modified_by, - modified_at=datetime.utcnow(), - sort_order=idx, - ) - session.add(entry) - created_entries.append(entry) - - await session.commit() - - for entry in created_entries: - await session.refresh(entry) - - return created_entries - - @staticmethod - async def validate_entries(entries: List[AccountingEntryCreate]) -> tuple[bool, str]: - """ - Validate accounting entries. - Returns (is_valid, error_message). - """ - if not entries: - return False, "At least one entry is required" - - total_debit = sum( - e.amount for e in entries if e.entry_type == EntryType.DEBIT - ) - total_credit = sum( - e.amount for e in entries if e.entry_type == EntryType.CREDIT - ) - - # Check balance (debit should equal credit) - if abs(total_debit - total_credit) > 0.01: - return False, f"Entries not balanced: Debit={total_debit}, Credit={total_credit}" - - # Check for valid account codes - for entry in entries: - if not entry.account_code or len(entry.account_code) < 3: - return False, f"Invalid account code: {entry.account_code}" - - return True, "" diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/attachment.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/attachment.py deleted file mode 100644 index df9ec86..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/attachment.py +++ /dev/null @@ -1,140 +0,0 @@ -"""CRUD operations for receipt attachments.""" - -import os -import uuid -import aiofiles -from datetime import datetime -from pathlib import Path -from typing import Optional, List - -from sqlalchemy import select -from sqlalchemy.ext.asyncio import AsyncSession -from fastapi import UploadFile - -from backend.modules.data_entry.db.models.receipt import ReceiptAttachment -from backend.config import settings - - -class AttachmentCRUD: - """CRUD operations for ReceiptAttachment model.""" - - @staticmethod - def _generate_stored_filename(original_filename: str) -> str: - """Generate unique filename for storage.""" - ext = Path(original_filename).suffix.lower() - return f"{uuid.uuid4()}{ext}" - - @staticmethod - def _get_upload_path(stored_filename: str) -> Path: - """Get full path for storing file, organized by year/month.""" - now = datetime.utcnow() - relative_path = Path(str(now.year)) / f"{now.month:02d}" - full_path = settings.data_entry_upload_path_resolved / relative_path - - # Ensure directory exists - full_path.mkdir(parents=True, exist_ok=True) - - return relative_path / stored_filename - - @staticmethod - async def create( - session: AsyncSession, - receipt_id: int, - file: UploadFile, - ) -> ReceiptAttachment: - """Create attachment by saving file and creating DB record.""" - # Generate stored filename - stored_filename = AttachmentCRUD._generate_stored_filename(file.filename or "upload") - - # Get relative path - relative_path = AttachmentCRUD._get_upload_path(stored_filename) - - # Full path for saving - full_path = settings.data_entry_upload_path_resolved / relative_path - - # Read file content - content = await file.read() - file_size = len(content) - - # Validate file size - if file_size > settings.data_entry_max_upload_size_bytes: - raise ValueError(f"File too large. Maximum size is {settings.data_entry_max_upload_size_mb}MB") - - # Validate MIME type - mime_type = file.content_type or "application/octet-stream" - if mime_type not in settings.data_entry_allowed_mime_types: - raise ValueError(f"File type not allowed: {mime_type}") - - # Save file - async with aiofiles.open(full_path, "wb") as f: - await f.write(content) - - # Create DB record - attachment = ReceiptAttachment( - receipt_id=receipt_id, - filename=file.filename or "upload", - stored_filename=stored_filename, - file_path=str(relative_path), - file_size=file_size, - mime_type=mime_type, - ) - - session.add(attachment) - await session.commit() - await session.refresh(attachment) - - return attachment - - @staticmethod - async def get_by_id( - session: AsyncSession, - attachment_id: int, - ) -> Optional[ReceiptAttachment]: - """Get attachment by ID.""" - query = select(ReceiptAttachment).where(ReceiptAttachment.id == attachment_id) - result = await session.execute(query) - return result.scalar_one_or_none() - - @staticmethod - async def get_by_receipt_id( - session: AsyncSession, - receipt_id: int, - ) -> List[ReceiptAttachment]: - """Get all attachments for a receipt.""" - query = select(ReceiptAttachment).where( - ReceiptAttachment.receipt_id == receipt_id - ).order_by(ReceiptAttachment.uploaded_at.asc()) - - result = await session.execute(query) - return list(result.scalars().all()) - - @staticmethod - def get_file_path(attachment: ReceiptAttachment) -> Path: - """Get full file path for an attachment.""" - return settings.data_entry_upload_path_resolved / attachment.file_path - - @staticmethod - async def delete(session: AsyncSession, attachment: ReceiptAttachment) -> bool: - """Delete attachment (file and DB record).""" - # Delete file - file_path = AttachmentCRUD.get_file_path(attachment) - if file_path.exists(): - os.remove(file_path) - - # Delete DB record - await session.delete(attachment) - await session.commit() - - return True - - @staticmethod - async def delete_all_for_receipt(session: AsyncSession, receipt_id: int) -> int: - """Delete all attachments for a receipt.""" - attachments = await AttachmentCRUD.get_by_receipt_id(session, receipt_id) - count = 0 - - for attachment in attachments: - await AttachmentCRUD.delete(session, attachment) - count += 1 - - return count diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/ocr_settings.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/ocr_settings.py deleted file mode 100644 index 9c2a4a6..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/ocr_settings.py +++ /dev/null @@ -1,222 +0,0 @@ -"""CRUD operations for OCR settings and metrics.""" - -from datetime import datetime, timedelta -from typing import List, Optional - -from sqlalchemy import func, select, and_ -from sqlalchemy.ext.asyncio import AsyncSession - -from backend.modules.data_entry.db.models.ocr_settings import ( - UserOCRPreference, - OCRJobMetrics, - OCRMetricsSummary, - OCREngine, -) - - -class OCRPreferenceCRUD: - """CRUD operations for user OCR preferences.""" - - @staticmethod - async def get_by_username(session: AsyncSession, username: str) -> Optional[UserOCRPreference]: - """Get user's OCR preference by username.""" - result = await session.execute( - select(UserOCRPreference).where(UserOCRPreference.username == username) - ) - return result.scalar_one_or_none() - - @staticmethod - async def create_or_update( - session: AsyncSession, - username: str, - preferred_engine: OCREngine - ) -> UserOCRPreference: - """Create or update user's OCR preference.""" - existing = await OCRPreferenceCRUD.get_by_username(session, username) - - if existing: - existing.preferred_engine = preferred_engine - existing.updated_at = datetime.utcnow() - await session.commit() - await session.refresh(existing) - return existing - else: - preference = UserOCRPreference( - username=username, - preferred_engine=preferred_engine - ) - session.add(preference) - await session.commit() - await session.refresh(preference) - return preference - - @staticmethod - async def delete_by_username(session: AsyncSession, username: str) -> bool: - """Delete user's OCR preference.""" - existing = await OCRPreferenceCRUD.get_by_username(session, username) - if existing: - await session.delete(existing) - await session.commit() - return True - return False - - -class OCRMetricsCRUD: - """CRUD operations for OCR job metrics.""" - - @staticmethod - async def create( - session: AsyncSession, - job_id: str, - username: str, - engine_requested: str, - engine_used: str, - processing_time_ms: int = 0, - file_size_bytes: int = 0, - file_type: str = "image/jpeg", - original_filename: Optional[str] = None, - success: bool = True, - error_message: Optional[str] = None, - overall_confidence: float = 0.0, - fields_extracted: int = 0, - needs_manual_review: Optional[bool] = None, - validation_warnings_count: int = 0, - validation_errors_count: int = 0, - company_id: Optional[int] = None - ) -> OCRJobMetrics: - """Create a new OCR job metrics record.""" - metrics = OCRJobMetrics( - job_id=job_id, - username=username, - company_id=company_id, - engine_requested=engine_requested, - engine_used=engine_used, - processing_time_ms=processing_time_ms, - file_size_bytes=file_size_bytes, - file_type=file_type, - original_filename=original_filename, - success=success, - error_message=error_message, - overall_confidence=overall_confidence, - fields_extracted=fields_extracted, - needs_manual_review=needs_manual_review, - validation_warnings_count=validation_warnings_count, - validation_errors_count=validation_errors_count, - ) - session.add(metrics) - await session.commit() - await session.refresh(metrics) - return metrics - - @staticmethod - async def get_by_job_id(session: AsyncSession, job_id: str) -> Optional[OCRJobMetrics]: - """Get metrics by job ID.""" - result = await session.execute( - select(OCRJobMetrics).where(OCRJobMetrics.job_id == job_id) - ) - return result.scalar_one_or_none() - - @staticmethod - async def get_user_history( - session: AsyncSession, - username: str, - limit: int = 50, - offset: int = 0 - ) -> List[OCRJobMetrics]: - """Get user's OCR job history.""" - result = await session.execute( - select(OCRJobMetrics) - .where(OCRJobMetrics.username == username) - .order_by(OCRJobMetrics.created_at.desc()) - .limit(limit) - .offset(offset) - ) - return list(result.scalars().all()) - - @staticmethod - async def get_summary_by_engine( - session: AsyncSession, - days: int = 30, - username: Optional[str] = None - ) -> List[OCRMetricsSummary]: - """Get summary metrics grouped by engine.""" - cutoff_date = datetime.utcnow() - timedelta(days=days) - - # Build query - conditions = [OCRJobMetrics.created_at >= cutoff_date] - if username: - conditions.append(OCRJobMetrics.username == username) - - # Query for aggregated metrics - result = await session.execute( - select( - OCRJobMetrics.engine_used, - func.count(OCRJobMetrics.id).label('total_jobs'), - func.sum(func.cast(OCRJobMetrics.success, sa.Integer)).label('successful_jobs'), - func.avg(OCRJobMetrics.processing_time_ms).label('avg_processing_time_ms'), - func.avg(OCRJobMetrics.overall_confidence).label('avg_confidence'), - func.avg(OCRJobMetrics.fields_extracted).label('avg_fields_extracted'), - ) - .where(and_(*conditions)) - .group_by(OCRJobMetrics.engine_used) - .order_by(func.count(OCRJobMetrics.id).desc()) - ) - - summaries = [] - for row in result.all(): - total = row.total_jobs or 0 - successful = row.successful_jobs or 0 - success_rate = successful / total if total > 0 else 0.0 - summaries.append(OCRMetricsSummary( - engine=row.engine_used, - total_jobs=total, - successful_jobs=successful, - failed_jobs=total - successful, - success_rate=success_rate, - avg_processing_time_ms=float(row.avg_processing_time_ms or 0), - avg_confidence=float(row.avg_confidence or 0), - avg_fields_extracted=float(row.avg_fields_extracted or 0), - )) - - return summaries - - @staticmethod - async def get_overall_stats( - session: AsyncSession, - days: int = 30, - username: Optional[str] = None - ) -> dict: - """Get overall OCR statistics.""" - cutoff_date = datetime.utcnow() - timedelta(days=days) - - conditions = [OCRJobMetrics.created_at >= cutoff_date] - if username: - conditions.append(OCRJobMetrics.username == username) - - result = await session.execute( - select( - func.count(OCRJobMetrics.id).label('total_jobs'), - func.sum(func.cast(OCRJobMetrics.success, sa.Integer)).label('successful_jobs'), - func.avg(OCRJobMetrics.processing_time_ms).label('avg_processing_time_ms'), - func.avg(OCRJobMetrics.overall_confidence).label('avg_confidence'), - ) - .where(and_(*conditions)) - ) - - row = result.one() - total = row.total_jobs or 0 - successful = row.successful_jobs or 0 - - return { - "total_jobs": total, - "successful_jobs": successful, - "failed_jobs": total - successful, - "success_rate": (successful / total * 100) if total > 0 else 0.0, - "avg_processing_time_ms": float(row.avg_processing_time_ms or 0), - "avg_confidence": float(row.avg_confidence or 0), - "period_days": days, - } - - -# Import sqlalchemy for func.cast -import sqlalchemy as sa diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/receipt.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/receipt.py deleted file mode 100644 index 6a0fa06..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/crud/receipt.py +++ /dev/null @@ -1,418 +0,0 @@ -"""CRUD operations for receipts.""" - -import json -from datetime import datetime, date -from decimal import Decimal -from typing import Optional, List, Tuple, Any -from sqlalchemy import select, func, or_ -from sqlalchemy.ext.asyncio import AsyncSession -from sqlalchemy.orm import selectinload - -from backend.modules.data_entry.db.models.receipt import Receipt, ReceiptStatus -from backend.modules.data_entry.schemas.receipt import ReceiptCreate, ReceiptUpdate, ReceiptFilter - - -def _serialize_tva_breakdown(tva_breakdown: Optional[List[Any]]) -> Optional[str]: - """Serialize TVA breakdown list to JSON string for SQLite storage.""" - if tva_breakdown is None: - return None - - # Convert Decimal to float for JSON serialization - serializable = [] - for entry in tva_breakdown: - if hasattr(entry, 'model_dump'): - # Pydantic model - item = entry.model_dump() - elif isinstance(entry, dict): - item = entry.copy() - else: - item = dict(entry) - - # Convert Decimal to float - if 'amount' in item and isinstance(item['amount'], Decimal): - item['amount'] = float(item['amount']) - - serializable.append(item) - - return json.dumps(serializable) - - -def _serialize_payment_methods(payment_methods: Optional[List[Any]]) -> Optional[str]: - """Serialize payment methods list to JSON string for SQLite storage.""" - if payment_methods is None: - return None - - serializable = [] - for pm in payment_methods: - if hasattr(pm, 'model_dump'): - item = pm.model_dump() - elif isinstance(pm, dict): - item = pm.copy() - else: - item = dict(pm) - - # Convert Decimal to float for JSON - if 'amount' in item: - if hasattr(item['amount'], '__float__'): - item['amount'] = float(item['amount']) - - serializable.append(item) - - return json.dumps(serializable) - - -class ReceiptCRUD: - """CRUD operations for Receipt model.""" - - @staticmethod - async def create( - session: AsyncSession, - data: ReceiptCreate, - created_by: str, - ) -> Receipt: - """Create a new receipt.""" - # Get data as dict and serialize tva_breakdown and payment_methods to JSON string - receipt_data = data.model_dump() - receipt_data['tva_breakdown'] = _serialize_tva_breakdown(receipt_data.get('tva_breakdown')) - receipt_data['payment_methods'] = _serialize_payment_methods(receipt_data.get('payment_methods')) - - receipt = Receipt( - **receipt_data, - created_by=created_by, - status=ReceiptStatus.DRAFT, - ) - session.add(receipt) - await session.commit() - await session.refresh(receipt) - - # Reload with relationships to avoid lazy loading issues with async - return await ReceiptCRUD.get_by_id(session, receipt.id, include_relations=True) - - @staticmethod - async def get_by_id( - session: AsyncSession, - receipt_id: int, - include_relations: bool = True, - ) -> Optional[Receipt]: - """Get receipt by ID, optionally with relationships.""" - query = select(Receipt).where(Receipt.id == receipt_id) - - if include_relations: - query = query.options( - selectinload(Receipt.attachments), - selectinload(Receipt.entries), - ) - - result = await session.execute(query) - return result.scalar_one_or_none() - - @staticmethod - async def get_list( - session: AsyncSession, - filters: ReceiptFilter, - ) -> Tuple[List[Receipt], int]: - """Get paginated list of receipts with filters.""" - # Base query - query = select(Receipt).options( - selectinload(Receipt.attachments), - selectinload(Receipt.entries), - ) - - # Apply filters - if filters.status: - query = query.where(Receipt.status == filters.status) - - if filters.direction: - query = query.where(Receipt.direction == filters.direction) - - if filters.company_id: - query = query.where(Receipt.company_id == filters.company_id) - - if filters.created_by: - query = query.where(Receipt.created_by == filters.created_by) - - if filters.date_from: - query = query.where(Receipt.receipt_date >= filters.date_from) - - if filters.date_to: - query = query.where(Receipt.receipt_date <= filters.date_to) - - if filters.search: - search_term = f"%{filters.search}%" - query = query.where( - or_( - Receipt.description.ilike(search_term), - Receipt.partner_name.ilike(search_term), - Receipt.receipt_number.ilike(search_term), - ) - ) - - # Bulk upload filters (US-012) - # US-005: Support comma-separated values for processing_status filter (e.g., "pending,processing") - if filters.processing_status: - statuses = [s.strip() for s in filters.processing_status.split(",")] - if len(statuses) == 1: - query = query.where(Receipt.processing_status == statuses[0]) - else: - query = query.where(Receipt.processing_status.in_(statuses)) - - if filters.batch_id: - query = query.where(Receipt.batch_id == filters.batch_id) - - # Count total - count_query = select(func.count()).select_from(query.subquery()) - total_result = await session.execute(count_query) - total = total_result.scalar() or 0 - - # Apply ordering based on sort_by parameter (US-012) - if filters.sort_by == "processing_started_at": - query = query.order_by(Receipt.processing_started_at.desc()) - elif filters.sort_by == "processing_started_at_asc": - query = query.order_by(Receipt.processing_started_at.asc()) - else: - # Default ordering - query = query.order_by(Receipt.created_at.desc()) - - # Apply pagination - offset = (filters.page - 1) * filters.page_size - query = query.offset(offset).limit(filters.page_size) - - # Execute - result = await session.execute(query) - receipts = result.scalars().all() - - return list(receipts), total - - @staticmethod - async def get_processing_stats( - session: AsyncSession, - company_id: Optional[int] = None, - batch_id: Optional[str] = None, - ) -> dict: - """Get processing status counts for bulk uploaded receipts (US-012).""" - # Build base query for counting by processing_status - base_conditions = [] - - if company_id: - base_conditions.append(Receipt.company_id == company_id) - - if batch_id: - base_conditions.append(Receipt.batch_id == batch_id) - - # Only count receipts that have a processing_status (bulk uploads) - base_conditions.append(Receipt.processing_status.isnot(None)) - - query = select( - Receipt.processing_status, - func.count(Receipt.id).label("count") - ) - - for condition in base_conditions: - query = query.where(condition) - - query = query.group_by(Receipt.processing_status) - - result = await session.execute(query) - rows = result.all() - - # Initialize stats - stats = { - "pending_count": 0, - "processing_count": 0, - "completed_count": 0, - "failed_count": 0, - } - - # Map results - for row in rows: - status = row.processing_status - count = row.count - if status == "pending": - stats["pending_count"] = count - elif status == "processing": - stats["processing_count"] = count - elif status == "completed": - stats["completed_count"] = count - elif status == "failed": - stats["failed_count"] = count - - return stats - - @staticmethod - async def get_pending_review( - session: AsyncSession, - company_id: Optional[int] = None, - ) -> List[Receipt]: - """Get all receipts pending review.""" - query = select(Receipt).where( - Receipt.status == ReceiptStatus.PENDING_REVIEW - ).options( - selectinload(Receipt.attachments), - selectinload(Receipt.entries), - ) - - if company_id: - query = query.where(Receipt.company_id == company_id) - - query = query.order_by(Receipt.submitted_at.asc()) - - result = await session.execute(query) - return list(result.scalars().all()) - - @staticmethod - async def update( - session: AsyncSession, - receipt: Receipt, - data: ReceiptUpdate, - ) -> Receipt: - """Update receipt fields. - - US-407: When a receipt is manually updated, reset processing_status and - processing_error to NULL. This allows failed OCR receipts to be corrected - manually and then submitted for approval without showing as "error" status. - """ - update_data = data.model_dump(exclude_unset=True) - - # Recalculate tva_total from tva_breakdown if breakdown is being updated - if 'tva_breakdown' in update_data and update_data['tva_breakdown']: - tva_total = sum( - float(entry.get('amount', 0) if isinstance(entry, dict) else getattr(entry, 'amount', 0)) - for entry in update_data['tva_breakdown'] - ) - update_data['tva_total'] = round(tva_total, 2) - - # Serialize tva_breakdown and payment_methods to JSON string if present - if 'tva_breakdown' in update_data: - update_data['tva_breakdown'] = _serialize_tva_breakdown(update_data['tva_breakdown']) - if 'payment_methods' in update_data: - update_data['payment_methods'] = _serialize_payment_methods(update_data['payment_methods']) - - for field, value in update_data.items(): - setattr(receipt, field, value) - - # US-407: Reset processing status when receipt is manually edited - # This clears the "failed" status so edited receipts can be submitted for approval - if receipt.processing_status == 'failed': - receipt.processing_status = None - receipt.processing_error = None - - receipt.updated_at = datetime.utcnow() - - session.add(receipt) - await session.commit() - await session.refresh(receipt) - - # Reload with relationships to avoid lazy loading issues with async - return await ReceiptCRUD.get_by_id(session, receipt.id, include_relations=True) - - @staticmethod - async def update_status( - session: AsyncSession, - receipt: Receipt, - new_status: ReceiptStatus, - reviewed_by: Optional[str] = None, - rejection_reason: Optional[str] = None, - ) -> Receipt: - """Update receipt workflow status.""" - receipt.status = new_status - receipt.updated_at = datetime.utcnow() - - if new_status == ReceiptStatus.PENDING_REVIEW: - receipt.submitted_at = datetime.utcnow() - - if new_status in [ReceiptStatus.APPROVED, ReceiptStatus.REJECTED]: - receipt.reviewed_by = reviewed_by - receipt.reviewed_at = datetime.utcnow() - - if new_status == ReceiptStatus.REJECTED: - receipt.rejection_reason = rejection_reason - - if new_status == ReceiptStatus.DRAFT: - # Reset review fields when moving back to draft - receipt.rejection_reason = None - - session.add(receipt) - await session.commit() - await session.refresh(receipt) - - # Reload with relationships to avoid lazy loading issues with async - return await ReceiptCRUD.get_by_id(session, receipt.id, include_relations=True) - - @staticmethod - async def delete(session: AsyncSession, receipt: Receipt) -> bool: - """Delete a receipt (cascade deletes attachments and entries).""" - await session.delete(receipt) - await session.commit() - return True - - @staticmethod - async def can_edit(receipt: Receipt, username: str) -> bool: - """Check if user can edit receipt.""" - # DRAFT and REJECTED receipts can be edited (to fix and resubmit) - if receipt.status not in [ReceiptStatus.DRAFT, ReceiptStatus.REJECTED]: - return False - - # Only creator can edit their own receipts - return receipt.created_by == username - - @staticmethod - async def can_delete(receipt: Receipt, username: str) -> bool: - """Check if user can delete receipt.""" - # Only DRAFT receipts can be deleted - if receipt.status != ReceiptStatus.DRAFT: - return False - - # Only creator can delete their own drafts - return receipt.created_by == username - - @staticmethod - async def can_submit(receipt: Receipt, username: str) -> bool: - """Check if user can submit receipt for review.""" - # Only DRAFT or REJECTED receipts can be submitted - if receipt.status not in [ReceiptStatus.DRAFT, ReceiptStatus.REJECTED]: - return False - - # Only creator can submit their own receipts - return receipt.created_by == username - - @staticmethod - async def get_stats( - session: AsyncSession, - company_id: int, - created_by: Optional[str] = None, - ) -> dict: - """Get receipt statistics.""" - base_query = select( - Receipt.status, - func.count(Receipt.id).label("count"), - func.sum(Receipt.amount).label("total_amount"), - ).where( - Receipt.company_id == company_id - ) - - if created_by: - base_query = base_query.where(Receipt.created_by == created_by) - - query = base_query.group_by(Receipt.status) - result = await session.execute(query) - rows = result.all() - - stats = { - "draft": {"count": 0, "amount": 0}, - "pending_review": {"count": 0, "amount": 0}, - "approved": {"count": 0, "amount": 0}, - "rejected": {"count": 0, "amount": 0}, - "synced": {"count": 0, "amount": 0}, - "total": {"count": 0, "amount": 0}, - } - - for row in rows: - status_key = row.status.value - stats[status_key] = { - "count": row.count, - "amount": float(row.total_amount or 0), - } - stats["total"]["count"] += row.count - stats["total"]["amount"] += float(row.total_amount or 0) - - return stats diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/database.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/database.py deleted file mode 100644 index 4e2aac6..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/database.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Database configuration and session management using SQLModel.""" - -from pathlib import Path -from typing import AsyncGenerator -from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession -from sqlalchemy.orm import sessionmaker -from sqlmodel import SQLModel - -from backend.config import settings - - -# Create async engine -# Note: echo=False to disable SQL query logging (too verbose) -engine = create_async_engine( - settings.data_entry_database_url, - echo=False, - future=True, -) - -# Create async session factory -async_session_maker = sessionmaker( - engine, - class_=AsyncSession, - expire_on_commit=False, -) - - -async def init_db() -> None: - """Initialize database - create tables if they don't exist.""" - # Ensure data directory exists - db_path = Path(settings.data_entry_sqlite_database_path) - db_path.parent.mkdir(parents=True, exist_ok=True) - - async with engine.begin() as conn: - await conn.run_sync(SQLModel.metadata.create_all) - - -async def get_session() -> AsyncGenerator[AsyncSession, None]: - """Get async database session for dependency injection.""" - async with async_session_maker() as session: - try: - yield session - finally: - await session.close() - - -# Convenience function for manual session usage -async def get_db_session() -> AsyncSession: - """Get a new database session (manual management).""" - return async_session_maker() diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/migrations.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/migrations.py deleted file mode 100644 index 28e8a62..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/migrations.py +++ /dev/null @@ -1,131 +0,0 @@ -""" -Alembic migrations helper for Data Entry module. - -Provides automatic migration execution at backend startup. -""" - -import logging -import os -from pathlib import Path - -logger = logging.getLogger(__name__) - - -def run_migrations() -> bool: - """ - Run pending Alembic migrations at startup. - - Returns: - True if migrations ran successfully (or no pending migrations), - False if migrations failed (backend should continue with WARNING). - """ - try: - from alembic.config import Config - from alembic import command - from alembic.runtime.migration import MigrationContext - from sqlalchemy import create_engine - - # Get the path to alembic.ini - data_entry_module = Path(__file__).parent.parent - alembic_ini_path = data_entry_module / "alembic.ini" - - if not alembic_ini_path.exists(): - logger.warning(f"[MIGRATIONS] alembic.ini not found at {alembic_ini_path}") - return False - - # Get database path from environment or default - db_path = Path(os.getenv( - "SQLITE_DATABASE_PATH", - "data/receipts/receipts.db" - )).resolve() - - # Ensure database directory exists - db_path.parent.mkdir(parents=True, exist_ok=True) - - # Create Alembic config - alembic_cfg = Config(str(alembic_ini_path)) - - # Override database URL - sync_db_url = f"sqlite:///{db_path}" - alembic_cfg.set_main_option("sqlalchemy.url", sync_db_url) - - # Set script location relative to alembic.ini - alembic_cfg.set_main_option( - "script_location", - str(data_entry_module / "migrations") - ) - - # Get current revision before upgrade - engine = create_engine(sync_db_url) - with engine.connect() as connection: - context = MigrationContext.configure(connection) - current_rev = context.get_current_revision() - engine.dispose() - - logger.info(f"[MIGRATIONS] Current revision: {current_rev or 'None (fresh database)'}") - logger.info(f"[MIGRATIONS] Database path: {db_path}") - - # Run upgrade to head - logger.info("[MIGRATIONS] Checking for pending migrations...") - command.upgrade(alembic_cfg, "head") - - # Get new revision after upgrade - engine = create_engine(sync_db_url) - with engine.connect() as connection: - context = MigrationContext.configure(connection) - new_rev = context.get_current_revision() - engine.dispose() - - if current_rev != new_rev: - logger.info(f"[MIGRATIONS] Applied: {current_rev or 'None'} -> {new_rev}") - else: - logger.info(f"[MIGRATIONS] No pending migrations. Current: {new_rev}") - - return True - - except ImportError as e: - logger.warning(f"[MIGRATIONS] Alembic not installed: {e}") - logger.warning("[MIGRATIONS] Skipping migrations - install alembic to enable") - return False - - except Exception as e: - logger.error(f"[MIGRATIONS] Migration error: {e}", exc_info=True) - logger.warning("[MIGRATIONS] Backend will continue without migrations") - return False - - -def get_current_revision() -> str: - """ - Get the current Alembic revision. - - Returns: - Current revision string, or 'unknown' if cannot be determined. - """ - try: - from alembic.runtime.migration import MigrationContext - from sqlalchemy import create_engine - - # Get database path from environment or default - db_path = Path(os.getenv( - "SQLITE_DATABASE_PATH", - "data/receipts/receipts.db" - )).resolve() - - if not db_path.exists(): - return "no_database" - - sync_db_url = f"sqlite:///{db_path}" - engine = create_engine(sync_db_url) - - with engine.connect() as connection: - context = MigrationContext.configure(connection) - revision = context.get_current_revision() - - engine.dispose() - return revision or "none" - - except ImportError: - return "alembic_not_installed" - except Exception as e: - logger.debug(f"[MIGRATIONS] Could not get revision: {e}") - return "unknown" diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/models/__init__.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/models/__init__.py deleted file mode 100644 index 2fd0f74..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/models/__init__.py +++ /dev/null @@ -1,29 +0,0 @@ -# Database models -from .receipt import Receipt, ReceiptAttachment, ReceiptStatus, ReceiptType, ReceiptDirection, ProcessingStatus -from .accounting_entry import AccountingEntry, EntryType -from .nomenclature import SyncedSupplier, LocalSupplier, SyncedCashRegister -from .ocr_settings import UserOCRPreference, OCRJobMetrics, OCRMetricsSummary, OCREngine -from .batch import BatchUpload, BatchJob, BatchStatus - -__all__ = [ - "Receipt", - "ReceiptAttachment", - "ReceiptStatus", - "ReceiptType", - "ReceiptDirection", - "ProcessingStatus", - "AccountingEntry", - "EntryType", - "SyncedSupplier", - "LocalSupplier", - "SyncedCashRegister", - # OCR Settings & Metrics - "UserOCRPreference", - "OCRJobMetrics", - "OCRMetricsSummary", - "OCREngine", - # Batch Upload - "BatchUpload", - "BatchJob", - "BatchStatus", -] diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/models/accounting_entry.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/models/accounting_entry.py deleted file mode 100644 index 6398adc..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/models/accounting_entry.py +++ /dev/null @@ -1,49 +0,0 @@ -"""AccountingEntry SQLModel model for proposed accounting entries.""" - -from datetime import datetime -from decimal import Decimal -from enum import Enum -from typing import Optional, TYPE_CHECKING - -from sqlmodel import SQLModel, Field, Relationship - -if TYPE_CHECKING: - from .receipt import Receipt - - -class EntryType(str, Enum): - """Type of accounting entry.""" - DEBIT = "debit" - CREDIT = "credit" - - -class AccountingEntry(SQLModel, table=True): - """Proposed accounting entry for a receipt.""" - - __tablename__ = "accounting_entries" - - id: Optional[int] = Field(default=None, primary_key=True) - receipt_id: int = Field(foreign_key="receipts.id", index=True) - - # Account - entry_type: EntryType - account_code: str = Field(max_length=20) # e.g., 6022, 5311, 4426 - account_name: Optional[str] = Field(default=None, max_length=200) # Cache: "Cheltuieli combustibil" - - # Amount - amount: Decimal = Field(decimal_places=2, max_digits=15) - - # Analytics (optional) - partner_id: Optional[int] = Field(default=None) - cost_center_id: Optional[int] = Field(default=None) - - # Entry metadata - is_auto_generated: bool = Field(default=True) # True if system-generated - modified_by: Optional[str] = Field(default=None, max_length=100) # Username if modified - modified_at: Optional[datetime] = Field(default=None) - - # Order for display - sort_order: int = Field(default=0) - - # Relationship - receipt: Optional["Receipt"] = Relationship(back_populates="entries") diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/models/batch.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/models/batch.py deleted file mode 100644 index bc7beab..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/models/batch.py +++ /dev/null @@ -1,64 +0,0 @@ -"""BatchUpload and BatchJob SQLModel models for bulk receipt processing.""" - -from datetime import datetime -from enum import Enum -from typing import Optional - -from sqlmodel import SQLModel, Field - - -class BatchStatus(str, Enum): - """Status of a batch upload.""" - PENDING = "pending" # Batch created, jobs queued - PROCESSING = "processing" # At least one job is processing - COMPLETED = "completed" # All jobs completed (success or failed) - FAILED = "failed" # Batch-level failure (e.g., all jobs failed) - - -class BatchUpload(SQLModel, table=True): - """ - Batch upload record for grouping multiple OCR jobs. - - Tracks overall progress and status of a bulk upload operation. - """ - - __tablename__ = "batch_uploads" - - id: Optional[int] = Field(default=None, primary_key=True) - - # User info - user_id: str = Field(max_length=100, index=True) # Username who created the batch - company_id: int = Field(index=True) # Company ID for receipt creation - - # Timestamps - created_at: datetime = Field(default_factory=datetime.utcnow) - - # Status tracking - status: BatchStatus = Field(default=BatchStatus.PENDING) - total_files: int = Field(default=0) - - -class BatchJob(SQLModel, table=True): - """ - Junction table linking batch_uploads to ocr_jobs. - - Each record represents one file in a batch, linking to its OCR job. - Also stores the receipt_id once the job completes and auto-creates a receipt. - """ - - __tablename__ = "batch_jobs" - - id: Optional[int] = Field(default=None, primary_key=True) - - # Foreign keys - batch_id: int = Field(foreign_key="batch_uploads.id", index=True) - job_id: str = Field(max_length=36, index=True) # UUID from ocr_jobs table - - # Original filename for display - filename: str = Field(max_length=255) - - # Receipt reference (set after auto-create) - receipt_id: Optional[int] = Field(default=None, foreign_key="receipts.id") - - # Timestamps - created_at: datetime = Field(default_factory=datetime.utcnow) diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/models/nomenclature.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/models/nomenclature.py deleted file mode 100644 index 1be5c12..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/models/nomenclature.py +++ /dev/null @@ -1,46 +0,0 @@ -"""Nomenclature models for synced and local data.""" - -from typing import Optional -from datetime import datetime -from sqlmodel import SQLModel, Field - - -class SyncedSupplier(SQLModel, table=True): - """Suppliers synced from Oracle NOM_PARTENERI.""" - __tablename__ = "synced_suppliers" - - id: Optional[int] = Field(default=None, primary_key=True) - oracle_id: int = Field(index=True) # Original Oracle ID - company_id: int = Field(index=True) # Company this supplier belongs to - name: str = Field(max_length=200) - fiscal_code: Optional[str] = Field(default=None, max_length=50, index=True) # CUI/CIF - address: Optional[str] = Field(default=None, max_length=500) - synced_at: datetime = Field(default_factory=datetime.utcnow) - - -class LocalSupplier(SQLModel, table=True): - """Suppliers created locally from OCR (not in Oracle).""" - __tablename__ = "local_suppliers" - - id: Optional[int] = Field(default=None, primary_key=True) - company_id: int = Field(index=True) - name: str = Field(max_length=200) - fiscal_code: Optional[str] = Field(default=None, max_length=50, index=True) - address: Optional[str] = Field(default=None, max_length=500) - created_by: str = Field(max_length=100) # Username who created it - created_at: datetime = Field(default_factory=datetime.utcnow) - # Flag to indicate if it should be synced to Oracle later - pending_oracle_sync: bool = Field(default=True) - - -class SyncedCashRegister(SQLModel, table=True): - """Cash registers and bank accounts synced from Oracle.""" - __tablename__ = "synced_cash_registers" - - id: Optional[int] = Field(default=None, primary_key=True) - oracle_id: int = Field(index=True) - company_id: int = Field(index=True) - name: str = Field(max_length=100) - account_code: str = Field(max_length=20) # 5311, 5121, etc. - register_type: str = Field(max_length=10) # 'cash' or 'bank' - synced_at: datetime = Field(default_factory=datetime.utcnow) diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/models/ocr_settings.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/models/ocr_settings.py deleted file mode 100644 index d90db6d..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/models/ocr_settings.py +++ /dev/null @@ -1,102 +0,0 @@ -"""OCR settings and metrics SQLModel models.""" - -from datetime import datetime -from decimal import Decimal -from enum import Enum -from typing import Optional - -from sqlmodel import SQLModel, Field - - -class OCREngine(str, Enum): - """Available OCR engines.""" - TESSERACT = "tesseract" - DOCTR = "doctr" - DOCTR_PLUS = "doctr_plus" # docTR with 2-tier sequential processing + early exit (optimized, recommended) - PADDLEOCR = "paddleocr" - - -class UserOCRPreference(SQLModel, table=True): - """ - User's preferred OCR engine setting. - - Each user can have one preferred OCR engine that will be - auto-selected when they upload new receipts for processing. - """ - - __tablename__ = "user_ocr_preferences" - - id: Optional[int] = Field(default=None, primary_key=True) - - # User identification - username: str = Field(max_length=100, unique=True, index=True) - - # Preference settings - preferred_engine: OCREngine = Field(default=OCREngine.DOCTR_PLUS) - - # Timestamps - created_at: datetime = Field(default_factory=datetime.utcnow) - updated_at: datetime = Field(default_factory=datetime.utcnow) - - -class OCRJobMetrics(SQLModel, table=True): - """ - OCR job processing metrics for analytics. - - Stores metrics for each OCR job to enable: - - Performance tracking by engine - - Success rate analysis - - Processing time trends - - User-specific analytics - """ - - __tablename__ = "ocr_job_metrics" - - id: Optional[int] = Field(default=None, primary_key=True) - - # Job identification - job_id: str = Field(max_length=50, unique=True, index=True) - - # User and company context - username: str = Field(max_length=100, index=True) - company_id: Optional[int] = Field(default=None, index=True) - - # Engine used - engine_requested: str = Field(max_length=20) # What user/auto requested - engine_used: str = Field(max_length=50) # What was actually used (e.g., "doctr-light") - - # Processing metrics - processing_time_ms: int = Field(default=0) - file_size_bytes: int = Field(default=0) - file_type: str = Field(max_length=50, default="image/jpeg") # MIME type - original_filename: Optional[str] = Field(default=None, max_length=255) # Original uploaded filename - - # Success metrics - success: bool = Field(default=True) - error_message: Optional[str] = Field(default=None, max_length=500) - - # Extraction quality metrics - overall_confidence: float = Field(default=0.0) - fields_extracted: int = Field(default=0) # Number of fields successfully extracted - needs_manual_review: Optional[bool] = Field(default=None) - validation_warnings_count: int = Field(default=0) - validation_errors_count: int = Field(default=0) - - # Timestamps - created_at: datetime = Field(default_factory=datetime.utcnow) - - -class OCRMetricsSummary(SQLModel): - """ - Summary metrics for OCR analytics. - - Not a database table - used for API responses. - """ - engine: str - total_jobs: int - successful_jobs: int - failed_jobs: int - success_rate: float # Computed: successful_jobs / total_jobs - avg_processing_time_ms: float - avg_confidence: float - avg_fields_extracted: float diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/db/models/receipt.py b/deploy-package-20260223-151231/backend/modules/data_entry/db/models/receipt.py deleted file mode 100644 index 39a4445..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/db/models/receipt.py +++ /dev/null @@ -1,143 +0,0 @@ -"""Receipt and ReceiptAttachment SQLModel models.""" - -from datetime import datetime, date -from decimal import Decimal -from enum import Enum -from typing import Optional, List, TYPE_CHECKING - -from sqlmodel import SQLModel, Field, Relationship - - -class ReceiptType(str, Enum): - """Type of receipt document.""" - BON_FISCAL = "bon_fiscal" - CHITANTA = "chitanta" - - -class ReceiptDirection(str, Enum): - """Direction of receipt - expense or income.""" - CHELTUIALA = "cheltuiala" # Expense (receipt from supplier) - INCASARE = "incasare" # Income (receipt issued to client) - - -class ReceiptStatus(str, Enum): - """Workflow status of receipt.""" - DRAFT = "draft" # User is filling in data - PENDING_REVIEW = "pending_review" # Awaiting accountant approval - APPROVED = "approved" # Approved by accountant - REJECTED = "rejected" # Rejected by accountant - SYNCED = "synced" # Synced to Oracle (Phase 2) - - -class PaymentMode(str, Enum): - """Payment mode - how the expense was paid.""" - CASA = "casa" # Numerar firma (5311) - BANCA = "banca" # Virament/POS (5121) - AVANS_DECONTARE = "avans_decontare" # Decont angajat (542) - - -class ProcessingStatus(str, Enum): - """Processing status for bulk uploaded receipts.""" - PENDING = "pending" # Waiting in queue - PROCESSING = "processing" # Currently being processed by OCR - COMPLETED = "completed" # Successfully processed - FAILED = "failed" # Processing failed with error - - -if TYPE_CHECKING: - from .accounting_entry import AccountingEntry - - -class Receipt(SQLModel, table=True): - """Receipt (Bon Fiscal / Chitanta) with approval workflow.""" - - __tablename__ = "receipts" - - id: Optional[int] = Field(default=None, primary_key=True) - - # Document identification - receipt_type: ReceiptType = Field(default=ReceiptType.BON_FISCAL) - direction: ReceiptDirection = Field(default=ReceiptDirection.CHELTUIALA) - receipt_number: Optional[str] = Field(default=None, max_length=50) - receipt_series: Optional[str] = Field(default=None, max_length=20) - - # Main data - receipt_date: date - amount: Decimal = Field(decimal_places=2, max_digits=15) - description: Optional[str] = Field(default=None, max_length=500) - - # TVA info (extracted from OCR) - stored as JSON for multiple entries - tva_breakdown: Optional[str] = Field(default=None, max_length=1000) # JSON: [{"code":"A","percent":19,"amount":"15.20"}] - tva_total: Optional[Decimal] = Field(default=None, decimal_places=2, max_digits=15) - items_count: Optional[int] = Field(default=None) - vendor_address: Optional[str] = Field(default=None, max_length=500) - - # Expense type (for auto-generating accounting entries) - expense_type_code: Optional[str] = Field(default=None, max_length=20) - - # Oracle references (nomenclatures) - company_id: int - # partner_id removed - supplier data is text-only (partner_name, cui) - partner_name: Optional[str] = Field(default=None, max_length=200) # Supplier name from OCR/selection - cui: Optional[str] = Field(default=None, max_length=20) # Fiscal code from OCR - ocr_raw_text: Optional[str] = Field(default=None) # Raw OCR text for debugging - payment_methods: Optional[str] = Field(default=None, max_length=500) # JSON: [{"method":"CARD","amount":"50.00"}] - cash_register_id: Optional[int] = Field(default=None) # Cash/Bank ID from Oracle - cash_register_name: Optional[str] = Field(default=None, max_length=100) # Cache for display - cash_register_account: Optional[str] = Field(default=None, max_length=20) # Account code (5311, 5121) - payment_mode: Optional[str] = Field(default=None, max_length=20) # PaymentMode value: casa/banca/avans_decontare - - # Workflow - status: ReceiptStatus = Field(default=ReceiptStatus.DRAFT) - created_by: str = Field(max_length=100) # Username of creator - created_at: datetime = Field(default_factory=datetime.utcnow) - updated_at: datetime = Field(default_factory=datetime.utcnow) - submitted_at: Optional[datetime] = Field(default=None) # When submitted for approval - - # Approval - reviewed_by: Optional[str] = Field(default=None, max_length=100) # Accountant username - reviewed_at: Optional[datetime] = Field(default=None) - rejection_reason: Optional[str] = Field(default=None, max_length=500) # Reason for rejection - - # Phase 2 - Oracle sync - oracle_synced_at: Optional[datetime] = Field(default=None) - oracle_act_id: Optional[int] = Field(default=None) - oracle_error: Optional[str] = Field(default=None, max_length=500) - - # Bulk upload batch tracking - batch_id: Optional[str] = Field(default=None, max_length=50, index=True) - processing_status: Optional[str] = Field(default=None, max_length=20, index=True) # ProcessingStatus enum value - processing_error: Optional[str] = Field(default=None) # Full error message text - file_hash: Optional[str] = Field(default=None, max_length=64, index=True) # SHA-256 hash for duplicate detection - processing_started_at: Optional[datetime] = Field(default=None) - processing_completed_at: Optional[datetime] = Field(default=None) - - # Relationships - attachments: List["ReceiptAttachment"] = Relationship( - back_populates="receipt", - sa_relationship_kwargs={"cascade": "all, delete-orphan"} - ) - entries: List["AccountingEntry"] = Relationship( - back_populates="receipt", - sa_relationship_kwargs={"cascade": "all, delete-orphan"} - ) - - -class ReceiptAttachment(SQLModel, table=True): - """Attachment (photo or PDF) for a receipt.""" - - __tablename__ = "receipt_attachments" - - id: Optional[int] = Field(default=None, primary_key=True) - receipt_id: int = Field(foreign_key="receipts.id", index=True) - - # File info - filename: str = Field(max_length=255) # Original filename - stored_filename: str = Field(max_length=255) # Filename on disk (UUID) - file_path: str = Field(max_length=500) # Relative path - file_size: int # Size in bytes - mime_type: str = Field(max_length=100) # MIME type (image/jpeg, application/pdf) - uploaded_at: datetime = Field(default_factory=datetime.utcnow) - - # Relationship - receipt: Optional[Receipt] = Relationship(back_populates="attachments") diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/env.py b/deploy-package-20260223-151231/backend/modules/data_entry/migrations/env.py deleted file mode 100644 index 739aa33..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/env.py +++ /dev/null @@ -1,92 +0,0 @@ -"""Alembic environment configuration.""" - -import os -from pathlib import Path -from logging.config import fileConfig -from dotenv import load_dotenv - -from sqlalchemy import engine_from_config -from sqlalchemy import pool - -from alembic import context -from sqlmodel import SQLModel - -# Load environment variables from .env file -load_dotenv() - -# Import all models to ensure they're registered with SQLModel -from backend.modules.data_entry.db.models.receipt import Receipt, ReceiptAttachment -from backend.modules.data_entry.db.models.accounting_entry import AccountingEntry -from backend.modules.data_entry.db.models.nomenclature import SyncedSupplier, LocalSupplier, SyncedCashRegister -from backend.modules.data_entry.db.models.ocr_settings import UserOCRPreference, OCRJobMetrics - -# this is the Alembic Config object, which provides -# access to the values within the .ini file in use. -config = context.config - -# Override sqlalchemy.url from environment variable if set -# Resolve to absolute path for Windows/IIS compatibility -db_path = Path(os.getenv("SQLITE_DATABASE_PATH", "data/receipts/receipts.db")).resolve() -config.set_main_option("sqlalchemy.url", f"sqlite:///{db_path}") - -# Interpret the config file for Python logging. -# This line sets up loggers basically. -if config.config_file_name is not None: - fileConfig(config.config_file_name) - -# add your model's MetaData object here -# for 'autogenerate' support -target_metadata = SQLModel.metadata - - -def run_migrations_offline() -> None: - """Run migrations in 'offline' mode. - - This configures the context with just a URL - and not an Engine, though an Engine is acceptable - here as well. By skipping the Engine creation - we don't even need a DBAPI to be available. - - Calls to context.execute() here emit the given string to the - script output. - """ - url = config.get_main_option("sqlalchemy.url") - context.configure( - url=url, - target_metadata=target_metadata, - literal_binds=True, - dialect_opts={"paramstyle": "named"}, - render_as_batch=True, # Required for SQLite ALTER TABLE support - ) - - with context.begin_transaction(): - context.run_migrations() - - -def run_migrations_online() -> None: - """Run migrations in 'online' mode. - - In this scenario we need to create an Engine - and associate a connection with the context. - """ - connectable = engine_from_config( - config.get_section(config.config_ini_section, {}), - prefix="sqlalchemy.", - poolclass=pool.NullPool, - ) - - with connectable.connect() as connection: - context.configure( - connection=connection, - target_metadata=target_metadata, - render_as_batch=True, # Required for SQLite ALTER TABLE support - ) - - with context.begin_transaction(): - context.run_migrations() - - -if context.is_offline_mode(): - run_migrations_offline() -else: - run_migrations_online() diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/script.py.mako b/deploy-package-20260223-151231/backend/modules/data_entry/migrations/script.py.mako deleted file mode 100644 index 6ce3351..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/script.py.mako +++ /dev/null @@ -1,27 +0,0 @@ -"""${message} - -Revision ID: ${up_revision} -Revises: ${down_revision | comma,n} -Create Date: ${create_date} - -""" -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -import sqlmodel -${imports if imports else ""} - -# revision identifiers, used by Alembic. -revision: str = ${repr(up_revision)} -down_revision: Union[str, None] = ${repr(down_revision)} -branch_labels: Union[str, Sequence[str], None] = ${repr(branch_labels)} -depends_on: Union[str, Sequence[str], None] = ${repr(depends_on)} - - -def upgrade() -> None: - ${upgrades if upgrades else "pass"} - - -def downgrade() -> None: - ${downgrades if downgrades else "pass"} diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/001_initial_receipts.py b/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/001_initial_receipts.py deleted file mode 100644 index fcabcde..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/001_initial_receipts.py +++ /dev/null @@ -1,112 +0,0 @@ -"""Initial receipts schema - -Revision ID: 001_initial -Revises: -Create Date: 2024-12-11 - -""" -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -import sqlmodel - -# revision identifiers, used by Alembic. -revision: str = '001_initial' -down_revision: Union[str, None] = None -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # Create receipts table - op.create_table( - 'receipts', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('receipt_type', sa.Enum('BON_FISCAL', 'CHITANTA', name='receipttype'), nullable=False), - sa.Column('direction', sa.Enum('CHELTUIALA', 'INCASARE', name='receiptdirection'), nullable=False), - sa.Column('receipt_number', sa.String(length=50), nullable=True), - sa.Column('receipt_series', sa.String(length=20), nullable=True), - sa.Column('receipt_date', sa.Date(), nullable=False), - sa.Column('amount', sa.Numeric(precision=15, scale=2), nullable=False), - sa.Column('description', sa.String(length=500), nullable=True), - sa.Column('expense_type_code', sa.String(length=20), nullable=True), - sa.Column('company_id', sa.Integer(), nullable=False), - sa.Column('partner_id', sa.Integer(), nullable=True), - sa.Column('partner_name', sa.String(length=200), nullable=True), - sa.Column('cash_register_id', sa.Integer(), nullable=True), - sa.Column('cash_register_name', sa.String(length=100), nullable=True), - sa.Column('cash_register_account', sa.String(length=20), nullable=True), - sa.Column('status', sa.Enum('DRAFT', 'PENDING_REVIEW', 'APPROVED', 'REJECTED', 'SYNCED', name='receiptstatus'), nullable=False), - sa.Column('created_by', sa.String(length=100), nullable=False), - sa.Column('created_at', sa.DateTime(), nullable=False), - sa.Column('updated_at', sa.DateTime(), nullable=False), - sa.Column('submitted_at', sa.DateTime(), nullable=True), - sa.Column('reviewed_by', sa.String(length=100), nullable=True), - sa.Column('reviewed_at', sa.DateTime(), nullable=True), - sa.Column('rejection_reason', sa.String(length=500), nullable=True), - sa.Column('oracle_synced_at', sa.DateTime(), nullable=True), - sa.Column('oracle_act_id', sa.Integer(), nullable=True), - sa.Column('oracle_error', sa.String(length=500), nullable=True), - sa.PrimaryKeyConstraint('id') - ) - op.create_index(op.f('ix_receipts_company_id'), 'receipts', ['company_id'], unique=False) - op.create_index(op.f('ix_receipts_status'), 'receipts', ['status'], unique=False) - op.create_index(op.f('ix_receipts_created_by'), 'receipts', ['created_by'], unique=False) - op.create_index(op.f('ix_receipts_receipt_date'), 'receipts', ['receipt_date'], unique=False) - - # Create receipt_attachments table - op.create_table( - 'receipt_attachments', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('receipt_id', sa.Integer(), nullable=False), - sa.Column('filename', sa.String(length=255), nullable=False), - sa.Column('stored_filename', sa.String(length=255), nullable=False), - sa.Column('file_path', sa.String(length=500), nullable=False), - sa.Column('file_size', sa.Integer(), nullable=False), - sa.Column('mime_type', sa.String(length=100), nullable=False), - sa.Column('uploaded_at', sa.DateTime(), nullable=False), - sa.ForeignKeyConstraint(['receipt_id'], ['receipts.id'], ondelete='CASCADE'), - sa.PrimaryKeyConstraint('id') - ) - op.create_index(op.f('ix_receipt_attachments_receipt_id'), 'receipt_attachments', ['receipt_id'], unique=False) - - # Create accounting_entries table - op.create_table( - 'accounting_entries', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('receipt_id', sa.Integer(), nullable=False), - sa.Column('entry_type', sa.Enum('DEBIT', 'CREDIT', name='entrytype'), nullable=False), - sa.Column('account_code', sa.String(length=20), nullable=False), - sa.Column('account_name', sa.String(length=200), nullable=True), - sa.Column('amount', sa.Numeric(precision=15, scale=2), nullable=False), - sa.Column('partner_id', sa.Integer(), nullable=True), - sa.Column('cost_center_id', sa.Integer(), nullable=True), - sa.Column('is_auto_generated', sa.Boolean(), nullable=False), - sa.Column('modified_by', sa.String(length=100), nullable=True), - sa.Column('modified_at', sa.DateTime(), nullable=True), - sa.Column('sort_order', sa.Integer(), nullable=False), - sa.ForeignKeyConstraint(['receipt_id'], ['receipts.id'], ondelete='CASCADE'), - sa.PrimaryKeyConstraint('id') - ) - op.create_index(op.f('ix_accounting_entries_receipt_id'), 'accounting_entries', ['receipt_id'], unique=False) - - -def downgrade() -> None: - op.drop_index(op.f('ix_accounting_entries_receipt_id'), table_name='accounting_entries') - op.drop_table('accounting_entries') - - op.drop_index(op.f('ix_receipt_attachments_receipt_id'), table_name='receipt_attachments') - op.drop_table('receipt_attachments') - - op.drop_index(op.f('ix_receipts_receipt_date'), table_name='receipts') - op.drop_index(op.f('ix_receipts_created_by'), table_name='receipts') - op.drop_index(op.f('ix_receipts_status'), table_name='receipts') - op.drop_index(op.f('ix_receipts_company_id'), table_name='receipts') - op.drop_table('receipts') - - # Drop enums (SQLite doesn't actually use these, but for consistency) - op.execute("DROP TYPE IF EXISTS receipttype") - op.execute("DROP TYPE IF EXISTS receiptdirection") - op.execute("DROP TYPE IF EXISTS receiptstatus") - op.execute("DROP TYPE IF EXISTS entrytype") diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251212_140422_add_tva_breakdown_to_receipt.py b/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251212_140422_add_tva_breakdown_to_receipt.py deleted file mode 100644 index ad8408a..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251212_140422_add_tva_breakdown_to_receipt.py +++ /dev/null @@ -1,37 +0,0 @@ -"""add_tva_breakdown_to_receipt - -Revision ID: 1cfb423c6953 -Revises: 001_initial -Create Date: 2025-12-12 14:04:22.464289+00:00 - -""" -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -import sqlmodel - - -# revision identifiers, used by Alembic. -revision: str = '1cfb423c6953' -down_revision: Union[str, None] = '001_initial' -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # Add TVA-related columns to receipts table - with op.batch_alter_table('receipts', schema=None) as batch_op: - batch_op.add_column(sa.Column('tva_breakdown', sqlmodel.sql.sqltypes.AutoString(length=1000), nullable=True)) - batch_op.add_column(sa.Column('tva_total', sa.Numeric(precision=15, scale=2), nullable=True)) - batch_op.add_column(sa.Column('items_count', sa.Integer(), nullable=True)) - batch_op.add_column(sa.Column('vendor_address', sqlmodel.sql.sqltypes.AutoString(length=500), nullable=True)) - - -def downgrade() -> None: - # Remove TVA-related columns from receipts table - with op.batch_alter_table('receipts', schema=None) as batch_op: - batch_op.drop_column('vendor_address') - batch_op.drop_column('items_count') - batch_op.drop_column('tva_total') - batch_op.drop_column('tva_breakdown') diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251213_002805_add_nomenclature_tables.py b/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251213_002805_add_nomenclature_tables.py deleted file mode 100644 index bf3d5c3..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251213_002805_add_nomenclature_tables.py +++ /dev/null @@ -1,89 +0,0 @@ -"""add nomenclature tables - -Revision ID: 3a653da79002 -Revises: 1cfb423c6953 -Create Date: 2025-12-13 00:28:05.719430+00:00 - -""" -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -import sqlmodel - - -# revision identifiers, used by Alembic. -revision: str = '3a653da79002' -down_revision: Union[str, None] = '1cfb423c6953' -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - op.create_table('local_suppliers', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('company_id', sa.Integer(), nullable=False), - sa.Column('name', sqlmodel.sql.sqltypes.AutoString(length=200), nullable=False), - sa.Column('fiscal_code', sqlmodel.sql.sqltypes.AutoString(length=50), nullable=True), - sa.Column('address', sqlmodel.sql.sqltypes.AutoString(length=500), nullable=True), - sa.Column('created_by', sqlmodel.sql.sqltypes.AutoString(length=100), nullable=False), - sa.Column('created_at', sa.DateTime(), nullable=False), - sa.Column('pending_oracle_sync', sa.Boolean(), nullable=False), - sa.PrimaryKeyConstraint('id') - ) - with op.batch_alter_table('local_suppliers', schema=None) as batch_op: - batch_op.create_index(batch_op.f('ix_local_suppliers_company_id'), ['company_id'], unique=False) - batch_op.create_index(batch_op.f('ix_local_suppliers_fiscal_code'), ['fiscal_code'], unique=False) - - op.create_table('synced_cash_registers', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('oracle_id', sa.Integer(), nullable=False), - sa.Column('company_id', sa.Integer(), nullable=False), - sa.Column('name', sqlmodel.sql.sqltypes.AutoString(length=100), nullable=False), - sa.Column('account_code', sqlmodel.sql.sqltypes.AutoString(length=20), nullable=False), - sa.Column('register_type', sqlmodel.sql.sqltypes.AutoString(length=10), nullable=False), - sa.Column('synced_at', sa.DateTime(), nullable=False), - sa.PrimaryKeyConstraint('id') - ) - with op.batch_alter_table('synced_cash_registers', schema=None) as batch_op: - batch_op.create_index(batch_op.f('ix_synced_cash_registers_company_id'), ['company_id'], unique=False) - batch_op.create_index(batch_op.f('ix_synced_cash_registers_oracle_id'), ['oracle_id'], unique=False) - - op.create_table('synced_suppliers', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('oracle_id', sa.Integer(), nullable=False), - sa.Column('company_id', sa.Integer(), nullable=False), - sa.Column('name', sqlmodel.sql.sqltypes.AutoString(length=200), nullable=False), - sa.Column('fiscal_code', sqlmodel.sql.sqltypes.AutoString(length=50), nullable=True), - sa.Column('address', sqlmodel.sql.sqltypes.AutoString(length=500), nullable=True), - sa.Column('synced_at', sa.DateTime(), nullable=False), - sa.PrimaryKeyConstraint('id') - ) - with op.batch_alter_table('synced_suppliers', schema=None) as batch_op: - batch_op.create_index(batch_op.f('ix_synced_suppliers_company_id'), ['company_id'], unique=False) - batch_op.create_index(batch_op.f('ix_synced_suppliers_fiscal_code'), ['fiscal_code'], unique=False) - batch_op.create_index(batch_op.f('ix_synced_suppliers_oracle_id'), ['oracle_id'], unique=False) - - # ### end Alembic commands ### - - -def downgrade() -> None: - # ### commands auto generated by Alembic - please adjust! ### - with op.batch_alter_table('synced_suppliers', schema=None) as batch_op: - batch_op.drop_index(batch_op.f('ix_synced_suppliers_oracle_id')) - batch_op.drop_index(batch_op.f('ix_synced_suppliers_fiscal_code')) - batch_op.drop_index(batch_op.f('ix_synced_suppliers_company_id')) - - op.drop_table('synced_suppliers') - with op.batch_alter_table('synced_cash_registers', schema=None) as batch_op: - batch_op.drop_index(batch_op.f('ix_synced_cash_registers_oracle_id')) - batch_op.drop_index(batch_op.f('ix_synced_cash_registers_company_id')) - - op.drop_table('synced_cash_registers') - with op.batch_alter_table('local_suppliers', schema=None) as batch_op: - batch_op.drop_index(batch_op.f('ix_local_suppliers_fiscal_code')) - batch_op.drop_index(batch_op.f('ix_local_suppliers_company_id')) - - op.drop_table('local_suppliers') - # ### end Alembic commands ### diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251215_add_ocr_fields_to_receipt.py b/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251215_add_ocr_fields_to_receipt.py deleted file mode 100644 index a50afaa..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251215_add_ocr_fields_to_receipt.py +++ /dev/null @@ -1,35 +0,0 @@ -"""add_ocr_fields_to_receipt - -Revision ID: 4b8e5f2a1d93 -Revises: 3a653da79002 -Create Date: 2025-12-15 10:00:00.000000+00:00 - -""" -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa -import sqlmodel - - -# revision identifiers, used by Alembic. -revision: str = '4b8e5f2a1d93' -down_revision: Union[str, None] = '3a653da79002' -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - # Add OCR-related columns to receipts table - with op.batch_alter_table('receipts', schema=None) as batch_op: - batch_op.add_column(sa.Column('cui', sqlmodel.sql.sqltypes.AutoString(length=20), nullable=True)) - batch_op.add_column(sa.Column('ocr_raw_text', sa.Text(), nullable=True)) - batch_op.add_column(sa.Column('payment_methods', sqlmodel.sql.sqltypes.AutoString(length=500), nullable=True)) - - -def downgrade() -> None: - # Remove OCR-related columns from receipts table - with op.batch_alter_table('receipts', schema=None) as batch_op: - batch_op.drop_column('payment_methods') - batch_op.drop_column('ocr_raw_text') - batch_op.drop_column('cui') diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251215_remove_partner_id.py b/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251215_remove_partner_id.py deleted file mode 100644 index 81456ec..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251215_remove_partner_id.py +++ /dev/null @@ -1,29 +0,0 @@ -"""Remove partner_id from receipts - supplier data is text-only - -Revision ID: 20251215_remove_partner_id -Revises: 20251216_payment_mode -Create Date: 2025-12-15 - -""" -from typing import Sequence, Union - -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision: str = '20251215_remove_partner_id' -down_revision: Union[str, None] = '20251216_payment_mode' -branch_labels: Union[str, Sequence[str], None] = None -depends_on: Union[str, Sequence[str], None] = None - - -def upgrade() -> None: - """Remove partner_id column - supplier data is now text-only (partner_name, cui).""" - # Drop the partner_id column - op.drop_column('receipts', 'partner_id') - - -def downgrade() -> None: - """Re-add partner_id column.""" - op.add_column('receipts', sa.Column('partner_id', sa.Integer(), nullable=True)) diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251216_add_payment_mode.py b/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251216_add_payment_mode.py deleted file mode 100644 index 2b83c73..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251216_add_payment_mode.py +++ /dev/null @@ -1,44 +0,0 @@ -"""Add payment_mode field to receipts table. - -Revision ID: 20251216_payment_mode -Revises: 4b8e5f2a1d93 -Create Date: 2024-12-16 -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '20251216_payment_mode' -down_revision = '4b8e5f2a1d93' -branch_labels = None -depends_on = None - - -def upgrade() -> None: - """Add payment_mode column and migrate existing data.""" - with op.batch_alter_table('receipts', schema=None) as batch_op: - batch_op.add_column(sa.Column('payment_mode', sa.String(length=20), nullable=True)) - - # Migrate existing data based on cash_register_account - op.execute(""" - UPDATE receipts - SET payment_mode = 'casa' - WHERE cash_register_account LIKE '531%' AND payment_mode IS NULL - """) - op.execute(""" - UPDATE receipts - SET payment_mode = 'banca' - WHERE cash_register_account LIKE '512%' AND payment_mode IS NULL - """) - op.execute(""" - UPDATE receipts - SET payment_mode = 'avans_decontare' - WHERE cash_register_account LIKE '542%' AND payment_mode IS NULL - """) - - -def downgrade() -> None: - """Remove payment_mode column.""" - with op.batch_alter_table('receipts', schema=None) as batch_op: - batch_op.drop_column('payment_mode') diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251230_add_needs_manual_review.py b/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251230_add_needs_manual_review.py deleted file mode 100644 index 707a410..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251230_add_needs_manual_review.py +++ /dev/null @@ -1,40 +0,0 @@ -"""Add needs_manual_review flag to receipts table. - -Revision ID: 20251230_needs_manual_review -Revises: 20251216_payment_mode -Create Date: 2025-12-30 -""" -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '20251230_needs_manual_review' -down_revision = '20251216_payment_mode' -branch_labels = None -depends_on = None - - -def upgrade() -> None: - """Add needs_manual_review column for OCR validation tracking. - - This column tracks whether a receipt needs manual supervisor review - based on OCR extraction validation warnings: - - NULL = not validated yet (old receipts before validation feature) - - FALSE = validated, no review needed - - TRUE = validated, needs review - """ - with op.batch_alter_table('receipts', schema=None) as batch_op: - batch_op.add_column( - sa.Column('needs_manual_review', sa.Boolean(), nullable=True) - ) - - # NOTE: We do NOT set a default value for existing rows. - # NULL indicates the receipt was created before validation was implemented. - # Only new receipts (created after this migration) will have TRUE/FALSE values. - - -def downgrade() -> None: - """Remove needs_manual_review column.""" - with op.batch_alter_table('receipts', schema=None) as batch_op: - batch_op.drop_column('needs_manual_review') diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251231_add_ocr_settings_metrics.py b/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251231_add_ocr_settings_metrics.py deleted file mode 100644 index 530c21f..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251231_add_ocr_settings_metrics.py +++ /dev/null @@ -1,74 +0,0 @@ -"""Add OCR settings and metrics tables. - -Revision ID: add_ocr_settings_metrics -Revises: 20251230_add_needs_manual_review -Create Date: 2025-12-31 - -This migration adds: -- user_ocr_preferences: Store user's preferred OCR engine -- ocr_job_metrics: Store OCR job processing metrics for analytics -""" -from alembic import op -import sqlalchemy as sa - - -# Revision identifiers -revision = 'add_ocr_settings_metrics' -down_revision = '20251230_add_needs_manual_review' -branch_labels = None -depends_on = None - - -def upgrade() -> None: - """Create OCR settings and metrics tables.""" - - # Create user_ocr_preferences table - op.create_table( - 'user_ocr_preferences', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('username', sa.String(length=100), nullable=False), - sa.Column('preferred_engine', sa.String(length=20), nullable=False, server_default='doctr_plus'), - sa.Column('created_at', sa.DateTime(), nullable=False, server_default=sa.func.now()), - sa.Column('updated_at', sa.DateTime(), nullable=False, server_default=sa.func.now()), - sa.PrimaryKeyConstraint('id') - ) - op.create_index('ix_user_ocr_preferences_username', 'user_ocr_preferences', ['username'], unique=True) - - # Create ocr_job_metrics table - op.create_table( - 'ocr_job_metrics', - sa.Column('id', sa.Integer(), nullable=False), - sa.Column('job_id', sa.String(length=50), nullable=False), - sa.Column('username', sa.String(length=100), nullable=False), - sa.Column('company_id', sa.Integer(), nullable=True), - sa.Column('engine_requested', sa.String(length=20), nullable=False), - sa.Column('engine_used', sa.String(length=50), nullable=False), - sa.Column('processing_time_ms', sa.Integer(), nullable=False, server_default='0'), - sa.Column('file_size_bytes', sa.Integer(), nullable=False, server_default='0'), - sa.Column('file_type', sa.String(length=50), nullable=False, server_default='image/jpeg'), - sa.Column('success', sa.Boolean(), nullable=False, server_default='1'), - sa.Column('error_message', sa.String(length=500), nullable=True), - sa.Column('overall_confidence', sa.Float(), nullable=False, server_default='0.0'), - sa.Column('fields_extracted', sa.Integer(), nullable=False, server_default='0'), - sa.Column('needs_manual_review', sa.Boolean(), nullable=True), - sa.Column('validation_warnings_count', sa.Integer(), nullable=False, server_default='0'), - sa.Column('validation_errors_count', sa.Integer(), nullable=False, server_default='0'), - sa.Column('created_at', sa.DateTime(), nullable=False, server_default=sa.func.now()), - sa.PrimaryKeyConstraint('id') - ) - op.create_index('ix_ocr_job_metrics_job_id', 'ocr_job_metrics', ['job_id'], unique=True) - op.create_index('ix_ocr_job_metrics_username', 'ocr_job_metrics', ['username'], unique=False) - op.create_index('ix_ocr_job_metrics_company_id', 'ocr_job_metrics', ['company_id'], unique=False) - op.create_index('ix_ocr_job_metrics_created_at', 'ocr_job_metrics', ['created_at'], unique=False) - - -def downgrade() -> None: - """Drop OCR settings and metrics tables.""" - op.drop_index('ix_ocr_job_metrics_created_at', table_name='ocr_job_metrics') - op.drop_index('ix_ocr_job_metrics_company_id', table_name='ocr_job_metrics') - op.drop_index('ix_ocr_job_metrics_username', table_name='ocr_job_metrics') - op.drop_index('ix_ocr_job_metrics_job_id', table_name='ocr_job_metrics') - op.drop_table('ocr_job_metrics') - - op.drop_index('ix_user_ocr_preferences_username', table_name='user_ocr_preferences') - op.drop_table('user_ocr_preferences') diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251231_add_original_filename_to_metrics.py b/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251231_add_original_filename_to_metrics.py deleted file mode 100644 index 40cae9f..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20251231_add_original_filename_to_metrics.py +++ /dev/null @@ -1,30 +0,0 @@ -"""Add original_filename to ocr_job_metrics. - -Revision ID: add_original_filename_to_metrics -Revises: add_ocr_settings_metrics -Create Date: 2025-12-31 - -Adds original_filename column to track the uploaded filename. -""" -from alembic import op -import sqlalchemy as sa - - -# Revision identifiers -revision = 'add_original_filename_to_metrics' -down_revision = 'add_ocr_settings_metrics' -branch_labels = None -depends_on = None - - -def upgrade() -> None: - """Add original_filename column to ocr_job_metrics.""" - op.add_column( - 'ocr_job_metrics', - sa.Column('original_filename', sa.String(length=255), nullable=True) - ) - - -def downgrade() -> None: - """Remove original_filename column.""" - op.drop_column('ocr_job_metrics', 'original_filename') diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20260109_add_company_id_to_batch_uploads.py b/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20260109_add_company_id_to_batch_uploads.py deleted file mode 100644 index c40e670..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20260109_add_company_id_to_batch_uploads.py +++ /dev/null @@ -1,54 +0,0 @@ -"""Add company_id to batch_uploads table. - -Revision ID: 20260109_batch_company -Revises: 20251231_add_original_filename_to_metrics -Create Date: 2026-01-09 - -This migration adds the company_id column to batch_uploads to support -automatic receipt creation during bulk upload processing. -""" - -from alembic import op -import sqlalchemy as sa - - -# revision identifiers, used by Alembic. -revision = '20260109_batch_company' -down_revision = None # Will be auto-detected -branch_labels = None -depends_on = None - - -def upgrade() -> None: - """Add company_id column to batch_uploads table.""" - # Check if column already exists (SQLModel may have created it) - conn = op.get_bind() - inspector = sa.inspect(conn) - - # Check if batch_uploads table exists - if 'batch_uploads' in inspector.get_table_names(): - columns = [col['name'] for col in inspector.get_columns('batch_uploads')] - if 'company_id' not in columns: - op.add_column( - 'batch_uploads', - sa.Column('company_id', sa.Integer(), nullable=True) - ) - # Create index for company_id - op.create_index( - 'ix_batch_uploads_company_id', - 'batch_uploads', - ['company_id'], - unique=False - ) - - -def downgrade() -> None: - """Remove company_id column from batch_uploads table.""" - conn = op.get_bind() - inspector = sa.inspect(conn) - - if 'batch_uploads' in inspector.get_table_names(): - columns = [col['name'] for col in inspector.get_columns('batch_uploads')] - if 'company_id' in columns: - op.drop_index('ix_batch_uploads_company_id', table_name='batch_uploads') - op.drop_column('batch_uploads', 'company_id') diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20260111_add_batch_processing_fields.py b/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20260111_add_batch_processing_fields.py deleted file mode 100644 index 2f07212..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/migrations/versions/20260111_add_batch_processing_fields.py +++ /dev/null @@ -1,125 +0,0 @@ -"""Add batch processing fields to receipts table. - -Revision ID: add_batch_processing_fields -Revises: add_original_filename_to_metrics -Create Date: 2026-01-11 - -Adds fields for bulk upload batch tracking: -- batch_id: UUID string for grouping receipts from same upload -- processing_status: enum (pending/processing/completed/failed) -- processing_error: full error message text -- file_hash: SHA-256 hash for duplicate detection -- processing_started_at: when OCR processing started -- processing_completed_at: when OCR processing completed - -Also creates indexes for efficient querying. -""" -from alembic import op -import sqlalchemy as sa - - -# Revision identifiers -revision = 'add_batch_processing_fields' -down_revision = 'add_original_filename_to_metrics' -branch_labels = None -depends_on = None - - -def upgrade() -> None: - """Add batch processing columns to receipts table.""" - conn = op.get_bind() - inspector = sa.inspect(conn) - - # Get existing columns - columns = [col['name'] for col in inspector.get_columns('receipts')] - - # Add batch_id column with index - if 'batch_id' not in columns: - op.add_column( - 'receipts', - sa.Column('batch_id', sa.String(length=50), nullable=True) - ) - op.create_index( - 'ix_receipts_batch_id', - 'receipts', - ['batch_id'], - unique=False - ) - - # Add processing_status column with index - if 'processing_status' not in columns: - op.add_column( - 'receipts', - sa.Column('processing_status', sa.String(length=20), nullable=True) - ) - op.create_index( - 'ix_receipts_processing_status', - 'receipts', - ['processing_status'], - unique=False - ) - - # Add processing_error column (TEXT for full error messages) - if 'processing_error' not in columns: - op.add_column( - 'receipts', - sa.Column('processing_error', sa.Text(), nullable=True) - ) - - # Add file_hash column with index for duplicate detection - if 'file_hash' not in columns: - op.add_column( - 'receipts', - sa.Column('file_hash', sa.String(length=64), nullable=True) - ) - op.create_index( - 'ix_receipts_file_hash', - 'receipts', - ['file_hash'], - unique=False - ) - - # Add processing_started_at column - if 'processing_started_at' not in columns: - op.add_column( - 'receipts', - sa.Column('processing_started_at', sa.DateTime(), nullable=True) - ) - - # Add processing_completed_at column - if 'processing_completed_at' not in columns: - op.add_column( - 'receipts', - sa.Column('processing_completed_at', sa.DateTime(), nullable=True) - ) - - -def downgrade() -> None: - """Remove batch processing columns from receipts table.""" - conn = op.get_bind() - inspector = sa.inspect(conn) - - columns = [col['name'] for col in inspector.get_columns('receipts')] - indexes = [idx['name'] for idx in inspector.get_indexes('receipts')] - - # Remove indexes first (SQLite batch mode) - if 'ix_receipts_batch_id' in indexes: - op.drop_index('ix_receipts_batch_id', table_name='receipts') - if 'ix_receipts_processing_status' in indexes: - op.drop_index('ix_receipts_processing_status', table_name='receipts') - if 'ix_receipts_file_hash' in indexes: - op.drop_index('ix_receipts_file_hash', table_name='receipts') - - # Remove columns (in reverse order of addition) - if 'processing_completed_at' in columns: - op.drop_column('receipts', 'processing_completed_at') - if 'processing_started_at' in columns: - op.drop_column('receipts', 'processing_started_at') - if 'file_hash' in columns: - op.drop_column('receipts', 'file_hash') - if 'processing_error' in columns: - op.drop_column('receipts', 'processing_error') - if 'processing_status' in columns: - op.drop_column('receipts', 'processing_status') - if 'batch_id' in columns: - op.drop_column('receipts', 'batch_id') diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/routers/__init__.py b/deploy-package-20260223-151231/backend/modules/data_entry/routers/__init__.py deleted file mode 100644 index 4cbc633..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/routers/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -"""Data Entry module router factory.""" - -from fastapi import APIRouter - - -def create_data_entry_router() -> APIRouter: - """ - Create and configure Data Entry module router. - - Includes all data entry endpoints: - - /receipts - Receipt CRUD and workflow - - /ocr - OCR processing for receipts - - /nomenclature - Nomenclature syncing from Oracle - - /settings - User settings (OCR preferences) - - /metrics - OCR analytics and metrics - - /bulk - Bulk upload for batch processing - - Returns: - APIRouter: Configured router for data entry module - """ - router = APIRouter() - - # Import routers here to avoid circular imports - from .receipts import router as receipts_router - from .ocr import router as ocr_router - from .nomenclature import router as nomenclature_router - from .ocr_settings import router as ocr_settings_router - from .bulk import router as bulk_router - - # Include all sub-routers (no prefix - already prefixed in main.py with /api/data-entry) - router.include_router(receipts_router, prefix="/receipts", tags=["data-entry-receipts"]) - router.include_router(ocr_router, prefix="/ocr", tags=["data-entry-ocr"]) - router.include_router(nomenclature_router, prefix="/nomenclature", tags=["data-entry-nomenclature"]) - # OCR settings and metrics (endpoints at /settings/* and /metrics/*) - router.include_router(ocr_settings_router, tags=["data-entry-settings"]) - # Bulk upload for batch processing - router.include_router(bulk_router, prefix="/bulk", tags=["data-entry-bulk"]) - - return router diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/routers/bulk.py b/deploy-package-20260223-151231/backend/modules/data_entry/routers/bulk.py deleted file mode 100644 index bfc1dfe..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/routers/bulk.py +++ /dev/null @@ -1,997 +0,0 @@ -""" -Bulk upload API endpoints for batch receipt processing. - -Endpoints: -- POST /upload - Submit multiple files for OCR processing in a single batch -- GET /batches/{batch_id}/status - Get batch status with optional long-polling - -Validation: -- Max 100 files per batch -- Max 10MB per file -- Allowed types: PDF, PNG, JPG - -Duplicate Detection (US-007): -- SHA-256 hash calculated for each file -- Duplicate files (same hash + company_id) are rejected with 409 Conflict info -- Duplicates reported in error list, non-duplicates processed normally -""" - -import asyncio -import hashlib -import logging -from datetime import datetime -from decimal import Decimal -from pathlib import Path -from typing import Annotated, List, Optional, Union - -from fastapi import APIRouter, HTTPException, UploadFile, File, Depends, Query, Header -from sqlalchemy import select, func, and_ -from sqlalchemy.ext.asyncio import AsyncSession - -from backend.modules.data_entry.db.database import get_session -from backend.modules.data_entry.db.models import BatchUpload, BatchJob, BatchStatus, Receipt, ReceiptAttachment -from backend.modules.data_entry.schemas.bulk import ( - BulkUploadResponse, - BulkUploadResponseWithDuplicates, - BatchStatusResponse, - BatchJobInfo, - DuplicateFileInfo, - RetryResponse, - BatchRetryResponse, - CancelJobResponse, - CancelBatchResponse -) -from backend.modules.data_entry.services.ocr.job_queue import job_queue, OCRJobStatus -from backend.config import settings - -# Auth integration -from shared.auth.dependencies import get_current_user -from shared.auth.models import CurrentUser - -logger = logging.getLogger(__name__) - -router = APIRouter() - - -# ============ Helper for selected company from header ============ - -async def get_selected_company( - current_user: CurrentUser = Depends(get_current_user), - x_selected_company: Annotated[Optional[str], Header()] = None -) -> int: - """ - Get selected company from X-Selected-Company header. - - Validates that the user has access to the specified company. - Falls back to user's first company if no header is provided. - """ - if x_selected_company: - try: - company_id = int(x_selected_company) - except ValueError: - raise HTTPException( - status_code=400, - detail=f"Invalid company ID format: {x_selected_company}" - ) - - if str(company_id) in current_user.companies: - return company_id - - raise HTTPException( - status_code=403, - detail=f"Nu aveți acces la firma {company_id}" - ) - - # No header - use first company from user's list - if current_user.companies: - try: - return int(current_user.companies[0]) - except (ValueError, IndexError): - pass - - raise HTTPException( - status_code=400, - detail="Nu aveți nicio firmă asignată" - ) - -# Validation constants -MAX_FILES_PER_BATCH = 100 -MAX_FILE_SIZE_BYTES = 10 * 1024 * 1024 # 10MB -ALLOWED_MIME_TYPES = {"image/jpeg", "image/png", "application/pdf"} - - -def compute_file_hash(content: bytes) -> str: - """ - Compute SHA-256 hash of file content. - - Used for duplicate detection - same file content = same hash. - - Args: - content: Raw file bytes - - Returns: - Hexadecimal string of SHA-256 hash (64 characters) - """ - return hashlib.sha256(content).hexdigest() - - -async def check_duplicate_hashes( - session: AsyncSession, - file_hashes: List[str], - company_id: int -) -> dict[str, int]: - """ - Check which file hashes already exist in the database for this company. - - Args: - session: Database session - file_hashes: List of SHA-256 hashes to check - company_id: Company ID to scope the duplicate check - - Returns: - Dict mapping hash -> existing receipt_id for duplicates found - """ - if not file_hashes: - return {} - - # Query for existing receipts with these hashes for this company - result = await session.execute( - select(Receipt.file_hash, Receipt.id).where( - and_( - Receipt.file_hash.in_(file_hashes), - Receipt.company_id == company_id - ) - ) - ) - - # Build hash -> receipt_id mapping - # Note: result.all() is synchronous in SQLAlchemy async, returns list of tuples - duplicates = {} - rows = result.all() - for row in rows: - duplicates[row[0]] = row[1] - - return duplicates - - -@router.post("/upload", response_model=Union[BulkUploadResponse, BulkUploadResponseWithDuplicates]) -async def bulk_upload( - files: List[UploadFile] = File(..., description="Multiple files to upload"), - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), - selected_company: int = Depends(get_selected_company) -): - """ - Upload multiple files for batch OCR processing. - - Creates a batch record and queues all files as OCR jobs. - Invalid files cause entire batch rejection (validation errors). - Duplicate files are reported separately and skipped - non-duplicates are processed. - - Duplicate Detection (US-007): - - SHA-256 hash calculated for each file before processing - - Files with existing hash for same company are rejected with 409 info - - Response includes duplicate details with existing_receipt_id - - Args: - files: List of image/PDF files (max 100 files, max 10MB each) - - Returns: - BulkUploadResponse with batch_id and list of job_ids - BulkUploadResponseWithDuplicates if some files were duplicates - - Raises: - 400: If validation fails (too many files, file too large, invalid type) - 409: If ALL files are duplicates - 500: If job creation fails - """ - # Validate file count - if len(files) == 0: - raise HTTPException( - status_code=400, - detail="No files provided" - ) - - if len(files) > MAX_FILES_PER_BATCH: - raise HTTPException( - status_code=400, - detail=f"Too many files. Maximum {MAX_FILES_PER_BATCH} files per batch." - ) - - # Pre-validate all files before creating any jobs (atomic check) - invalid_files = [] - file_contents = [] - - for file in files: - # Check MIME type - if file.content_type not in ALLOWED_MIME_TYPES: - invalid_files.append(f"{file.filename}: Invalid type ({file.content_type})") - continue - - # Read content and check size - content = await file.read() - if len(content) > MAX_FILE_SIZE_BYTES: - invalid_files.append(f"{file.filename}: File too large ({len(content) // (1024*1024)}MB > 10MB)") - continue - - # Compute SHA-256 hash for duplicate detection (US-007) - file_hash = compute_file_hash(content) - - # Store for later processing - file_contents.append({ - "filename": file.filename, - "content": content, - "mime_type": file.content_type, - "file_hash": file_hash - }) - - # If any files are invalid, reject the entire batch - if invalid_files: - raise HTTPException( - status_code=400, - detail={ - "message": f"Validation failed for {len(invalid_files)} file(s)", - "invalid_files": invalid_files - } - ) - - # Check for duplicates BEFORE creating batch (US-007) - all_hashes = [f["file_hash"] for f in file_contents] - existing_duplicates = await check_duplicate_hashes(session, all_hashes, selected_company) - - # Separate duplicate files from processable files - duplicate_files: List[DuplicateFileInfo] = [] - processable_files = [] - - for file_data in file_contents: - if file_data["file_hash"] in existing_duplicates: - existing_receipt_id = existing_duplicates[file_data["file_hash"]] - duplicate_files.append(DuplicateFileInfo( - filename=file_data["filename"], - error="duplicate", - existing_receipt_id=existing_receipt_id, - message=f"Fișier duplicat - există deja ca bon #{existing_receipt_id}" - )) - logger.info( - f"[BulkUpload] Duplicate detected: {file_data['filename']} " - f"(hash={file_data['file_hash'][:16]}...) matches receipt #{existing_receipt_id}" - ) - else: - processable_files.append(file_data) - - # If ALL files are duplicates, return 409 Conflict - if len(duplicate_files) == len(file_contents): - raise HTTPException( - status_code=409, - detail={ - "error": "all_duplicates", - "message": f"Toate cele {len(duplicate_files)} fișiere sunt duplicate", - "duplicates": [d.model_dump() for d in duplicate_files] - } - ) - - # If no processable files remain after filtering (shouldn't happen but be safe) - if not processable_files: - raise HTTPException( - status_code=409, - detail={ - "error": "no_files_to_process", - "message": "Nu există fișiere de procesat", - "duplicates": [d.model_dump() for d in duplicate_files] - } - ) - - # Create batch record with company_id for auto-save - batch = BatchUpload( - user_id=current_user.username, - company_id=selected_company, - status=BatchStatus.PENDING, - total_files=len(processable_files) # Only count processable files - ) - session.add(batch) - await session.flush() # Get batch.id before creating jobs - - # Create OCR jobs for processable files only - job_ids = [] - batch_jobs = [] - - try: - for file_data in processable_files: - # Create OCR job using existing job_queue - # Pass batch_id and file_hash for tracking - job = await job_queue.create_job( - file_bytes=file_data["content"], - mime_type=file_data["mime_type"], - engine="doctr_plus", # Default engine for bulk - username=current_user.username, - original_filename=file_data["filename"], - batch_id=batch.id, # Link job to batch for auto-save integration - file_hash=file_data["file_hash"] # Pass hash for storage in receipt - ) - - job_ids.append(job.id) - - # Create batch_job link - batch_job = BatchJob( - batch_id=batch.id, - job_id=job.id, - filename=file_data["filename"] - ) - batch_jobs.append(batch_job) - - # Add all batch_job records - for bj in batch_jobs: - session.add(bj) - - # Commit everything atomically - await session.commit() - - logger.info( - f"[BulkUpload] Created batch {batch.id} with {len(job_ids)} jobs " - f"for user {current_user.username}" - f"{f', {len(duplicate_files)} duplicates skipped' if duplicate_files else ''}" - ) - - # Return response with duplicate info if any duplicates were found - if duplicate_files: - return BulkUploadResponseWithDuplicates( - batch_id=batch.id, - job_ids=job_ids, - total_files=len(file_contents), - processed_files=len(job_ids), - duplicate_files=len(duplicate_files), - duplicates=duplicate_files, - message=f"{len(job_ids)} fișier(e) în procesare, {len(duplicate_files)} duplicate ignorate" - ) - - return BulkUploadResponse( - batch_id=batch.id, - job_ids=job_ids, - total_files=len(job_ids), - message=f"{len(job_ids)} files queued for processing" - ) - - except Exception as e: - # Rollback on any error - await session.rollback() - logger.error(f"[BulkUpload] Failed to create batch: {e}") - raise HTTPException( - status_code=500, - detail=f"Failed to create batch: {str(e)}" - ) - - -# Long-polling constants -MAX_WAIT_SECONDS = 30 -POLL_INTERVAL_SECONDS = 0.5 - - -async def _get_batch_status_snapshot( - batch_id: int, - session: AsyncSession -) -> Optional[dict]: - """ - Get current batch status snapshot. - - Returns dict with status counts and jobs list, or None if batch not found. - """ - # Get batch record - batch_result = await session.execute( - select(BatchUpload).where(BatchUpload.id == batch_id) - ) - batch = batch_result.scalar_one_or_none() - - if not batch: - return None - - # Get all batch_jobs for this batch - batch_jobs_result = await session.execute( - select(BatchJob).where(BatchJob.batch_id == batch_id) - ) - batch_jobs = batch_jobs_result.scalars().all() - - if not batch_jobs: - return { - "batch": batch, - "pending_count": 0, - "processing_count": 0, - "completed_count": 0, - "failed_count": 0, - "jobs": [], - "total_amount": None - } - - # Get job statuses and error_messages from OCR job queue (SQLite) - job_statuses = {} - job_errors = {} - for bj in batch_jobs: - job = await job_queue.get_job(bj.job_id) - if job: - job_statuses[bj.job_id] = job.status.value - job_errors[bj.job_id] = job.error_message - else: - # Job not found in queue - treat as failed - job_statuses[bj.job_id] = "failed" - job_errors[bj.job_id] = "Job not found in queue" - - # Count by status - pending_count = sum(1 for s in job_statuses.values() if s == "pending") - processing_count = sum(1 for s in job_statuses.values() if s == "processing") - completed_count = sum(1 for s in job_statuses.values() if s == "completed") - failed_count = sum(1 for s in job_statuses.values() if s == "failed") - - # Build jobs list with status info - jobs_info = [] - for bj in batch_jobs: - jobs_info.append({ - "job_id": bj.job_id, - "filename": bj.filename, - "status": job_statuses.get(bj.job_id, "failed"), - "receipt_id": bj.receipt_id, - "error_message": job_errors.get(bj.job_id) - }) - - # Calculate total_amount from completed receipts - total_amount = None - receipt_ids = [bj.receipt_id for bj in batch_jobs if bj.receipt_id is not None] - if receipt_ids: - amount_result = await session.execute( - select(func.sum(Receipt.amount)).where(Receipt.id.in_(receipt_ids)) - ) - total_sum = amount_result.scalar() - if total_sum is not None: - total_amount = float(total_sum) - - return { - "batch": batch, - "pending_count": pending_count, - "processing_count": processing_count, - "completed_count": completed_count, - "failed_count": failed_count, - "jobs": jobs_info, - "total_amount": total_amount - } - - -def _compute_batch_overall_status(pending: int, processing: int, completed: int, failed: int, total: int) -> str: - """Compute overall batch status from job counts.""" - if pending + processing == 0: - # All jobs finished - if failed == total: - return BatchStatus.FAILED.value - return BatchStatus.COMPLETED.value - elif processing > 0 or completed > 0 or failed > 0: - return BatchStatus.PROCESSING.value - else: - return BatchStatus.PENDING.value - - -@router.get("/batches/{batch_id}/status", response_model=BatchStatusResponse) -async def get_batch_status( - batch_id: int, - wait: Optional[int] = Query( - default=None, - ge=0, - le=MAX_WAIT_SECONDS, - description="Long-polling wait time in seconds (max 30)" - ), - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Get batch processing status with optional long-polling. - - Returns aggregated status counts and individual job statuses. - When `wait` parameter is provided, the endpoint will poll until: - - Status changes from initial snapshot - - All jobs complete (pending + processing = 0) - - Timeout is reached - - Args: - batch_id: Batch ID to query - wait: Optional wait time in seconds for long-polling (0-30) - - Returns: - BatchStatusResponse with status counts and job details - - Raises: - 404: If batch not found - """ - # Get initial snapshot - snapshot = await _get_batch_status_snapshot(batch_id, session) - - if snapshot is None: - raise HTTPException( - status_code=404, - detail=f"Batch {batch_id} not found" - ) - - # If long-polling requested and jobs still in progress - if wait and wait > 0: - initial_pending = snapshot["pending_count"] - initial_processing = snapshot["processing_count"] - initial_completed = snapshot["completed_count"] - initial_failed = snapshot["failed_count"] - - # Only wait if there are still jobs in progress - if initial_pending + initial_processing > 0: - elapsed = 0.0 - while elapsed < wait: - await asyncio.sleep(POLL_INTERVAL_SECONDS) - elapsed += POLL_INTERVAL_SECONDS - - # Refresh snapshot - snapshot = await _get_batch_status_snapshot(batch_id, session) - if snapshot is None: - # Batch deleted during polling (edge case) - raise HTTPException(status_code=404, detail=f"Batch {batch_id} not found") - - # Check if status changed - current_pending = snapshot["pending_count"] - current_processing = snapshot["processing_count"] - current_completed = snapshot["completed_count"] - current_failed = snapshot["failed_count"] - - if (current_pending != initial_pending or - current_processing != initial_processing or - current_completed != initial_completed or - current_failed != initial_failed): - # Status changed, return immediately - break - - # Check if all jobs finished - if current_pending + current_processing == 0: - break - - # Build response - batch = snapshot["batch"] - total_files = batch.total_files - - overall_status = _compute_batch_overall_status( - snapshot["pending_count"], - snapshot["processing_count"], - snapshot["completed_count"], - snapshot["failed_count"], - total_files - ) - - jobs = [ - BatchJobInfo( - job_id=j["job_id"], - filename=j["filename"], - status=j["status"], - receipt_id=j["receipt_id"], - error_message=j.get("error_message") - ) - for j in snapshot["jobs"] - ] - - return BatchStatusResponse( - batch_id=batch.id, - status=overall_status, - total_files=total_files, - pending_count=snapshot["pending_count"], - processing_count=snapshot["processing_count"], - completed_count=snapshot["completed_count"], - failed_count=snapshot["failed_count"], - jobs=jobs, - total_amount=snapshot["total_amount"], - created_at=batch.created_at - ) - - -# ============ Retry Endpoints (US-006) ============ - - -async def _retry_single_receipt( - session: AsyncSession, - receipt: Receipt, - username: str -) -> tuple[bool, Optional[str], Optional[str]]: - """ - Retry processing for a single receipt. - - Finds the original file from attachments, resets processing status, - and creates a new OCR job. - - Args: - session: Database session - receipt: Receipt to retry - username: Username for the new OCR job - - Returns: - Tuple of (success, job_id, error_message) - """ - # Get the first attachment to find the source file - attachments_result = await session.execute( - select(ReceiptAttachment) - .where(ReceiptAttachment.receipt_id == receipt.id) - .limit(1) - ) - attachment = attachments_result.scalar_one_or_none() - - if not attachment: - return False, None, "Bonul nu are fișier atașat" - - # Construct full path to attachment file - file_path = settings.data_entry_upload_path_resolved / attachment.file_path - - if not file_path.exists(): - return False, None, "Fișierul original nu mai este disponibil" - - # Read file content - try: - with open(file_path, 'rb') as f: - file_bytes = f.read() - except Exception as e: - logger.error(f"[Retry] Failed to read file {file_path}: {e}") - return False, None, f"Eroare la citirea fișierului: {str(e)}" - - # Create new OCR job - try: - job = await job_queue.create_job( - file_bytes=file_bytes, - mime_type=attachment.mime_type, - engine="doctr_plus", - username=username, - original_filename=attachment.filename, - batch_id=None, # No batch for retry - direct processing - file_hash=receipt.file_hash - ) - - # Reset receipt processing status - receipt.processing_status = "pending" - receipt.processing_error = None - receipt.processing_started_at = datetime.utcnow() - receipt.processing_completed_at = None - - await session.flush() - - logger.info(f"[Retry] Receipt {receipt.id} requeued as job {job.id}") - return True, job.id, None - - except Exception as e: - logger.error(f"[Retry] Failed to create job for receipt {receipt.id}: {e}") - return False, None, f"Eroare la crearea job-ului OCR: {str(e)}" - - -@router.post("/retry/{receipt_id}", response_model=RetryResponse) -async def retry_receipt( - receipt_id: int, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), - selected_company: int = Depends(get_selected_company) -): - """ - Retry OCR processing for a single failed receipt. - - Resets the receipt's processing_status to 'pending' and creates - a new OCR job using the original attachment file. - - Args: - receipt_id: ID of the receipt to retry - - Returns: - RetryResponse with success status and new job ID - - Raises: - 404: If receipt not found - 400: If receipt is not in 'failed' status - 400: If original file is not available - """ - # Get the receipt - result = await session.execute( - select(Receipt).where( - and_( - Receipt.id == receipt_id, - Receipt.company_id == selected_company - ) - ) - ) - receipt = result.scalar_one_or_none() - - if not receipt: - raise HTTPException( - status_code=404, - detail=f"Bonul #{receipt_id} nu a fost găsit" - ) - - # Verify receipt is in failed status - if receipt.processing_status != "failed": - raise HTTPException( - status_code=400, - detail=f"Bonul nu este în stare de eroare (status actual: {receipt.processing_status})" - ) - - # Attempt retry - success, job_id, error = await _retry_single_receipt( - session, receipt, current_user.username - ) - - if not success: - raise HTTPException( - status_code=400, - detail=error or "Eroare necunoscută la reîncărcare" - ) - - await session.commit() - - return RetryResponse( - success=True, - receipt_id=receipt_id, - job_id=job_id, - message="Bon reîncarcat în procesare" - ) - - -@router.post("/retry-batch/{batch_id}", response_model=BatchRetryResponse) -async def retry_batch_failed( - batch_id: str, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), - selected_company: int = Depends(get_selected_company) -): - """ - Retry all failed receipts in a batch. - - Finds all receipts with batch_id matching and processing_status='failed', - then attempts to retry each one. - - Args: - batch_id: Batch ID (UUID string from receipt.batch_id) - - Returns: - BatchRetryResponse with counts of successful and failed retries - - Raises: - 404: If no failed receipts found for batch - """ - # Find all failed receipts in this batch - result = await session.execute( - select(Receipt).where( - and_( - Receipt.batch_id == batch_id, - Receipt.company_id == selected_company, - Receipt.processing_status == "failed" - ) - ) - ) - failed_receipts = result.scalars().all() - - if not failed_receipts: - raise HTTPException( - status_code=404, - detail=f"Nu există bonuri cu erori în batch-ul {batch_id}" - ) - - # Retry each receipt - retried_count = 0 - failed_count = 0 - errors = [] - - for receipt in failed_receipts: - success, job_id, error = await _retry_single_receipt( - session, receipt, current_user.username - ) - - if success: - retried_count += 1 - else: - failed_count += 1 - errors.append(f"Bon #{receipt.id}: {error}") - - await session.commit() - - return BatchRetryResponse( - success=retried_count > 0, - batch_id=batch_id, - retried_count=retried_count, - failed_count=failed_count, - errors=errors, - message=f"{retried_count} bonuri reîncarcate în procesare" - + (f", {failed_count} erori" if failed_count > 0 else "") - ) - - -# ============ Cancel Endpoints (US-014) ============ - - -@router.post("/cancel/{job_id}", response_model=CancelJobResponse) -async def cancel_job( - job_id: str, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Cancel a single OCR processing job. - - Only jobs with status 'pending' or 'processing' can be cancelled. - Jobs with status 'completed' or 'failed' cannot be cancelled. - - Important: If a receipt has already been created from this job, - it will NOT be deleted - receipts are preserved for audit purposes. - - Args: - job_id: The UUID of the OCR job to cancel - - Returns: - CancelJobResponse with cancellation details - - Raises: - 404: If job not found in batch_jobs table - 400: If job has already completed or failed - """ - # Find the job in batch_jobs table - batch_job_result = await session.execute( - select(BatchJob).where(BatchJob.job_id == job_id) - ) - batch_job = batch_job_result.scalar_one_or_none() - - if not batch_job: - raise HTTPException( - status_code=404, - detail=f"Job {job_id} nu a fost găsit" - ) - - # Get the OCR job from job_queue to check current status - ocr_job = await job_queue.get_job(job_id) - - if not ocr_job: - raise HTTPException( - status_code=404, - detail=f"Job {job_id} nu există în coada de procesare" - ) - - # Check if job can be cancelled - current_status = ocr_job.status.value - - if current_status == OCRJobStatus.completed.value: - raise HTTPException( - status_code=400, - detail=f"Job-ul a fost deja procesat cu succes. Nu poate fi anulat." - ) - - if current_status == OCRJobStatus.failed.value: - raise HTTPException( - status_code=400, - detail=f"Job-ul a eșuat deja. Folosiți opțiunea de reîncercare în loc de anulare." - ) - - if current_status == OCRJobStatus.cancelled.value: - raise HTTPException( - status_code=400, - detail=f"Job-ul a fost deja anulat." - ) - - # Update job status to cancelled in job_queue (SQLite) - cancelled_at = datetime.utcnow() - success = await job_queue.update_status( - job_id=job_id, - status=OCRJobStatus.cancelled, - error="Cancelled by user" - ) - - if not success: - raise HTTPException( - status_code=500, - detail=f"Eroare la anularea job-ului" - ) - - logger.info( - f"[CancelJob] Job {job_id} cancelled by {current_user.username} " - f"(previous status: {current_status})" - ) - - return CancelJobResponse( - success=True, - job_id=job_id, - cancelled_at=cancelled_at, - message=f"Job anulat cu succes" - ) - - -@router.post("/cancel-batch/{batch_id}", response_model=CancelBatchResponse) -async def cancel_batch( - batch_id: int, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Cancel all pending/processing jobs in a batch. - - Finds all jobs with status 'pending' or 'processing' in the specified batch - and marks them as 'cancelled'. Jobs with status 'completed' or 'failed' - are not affected. - - Important: Receipts that have already been created from completed jobs - will NOT be deleted - they are preserved for audit purposes. - - Args: - batch_id: The batch ID to cancel - - Returns: - CancelBatchResponse with counts of cancelled and skipped jobs - - Raises: - 404: If batch not found or no jobs exist for batch - """ - # Verify batch exists - batch_result = await session.execute( - select(BatchUpload).where(BatchUpload.id == batch_id) - ) - batch = batch_result.scalar_one_or_none() - - if not batch: - raise HTTPException( - status_code=404, - detail=f"Batch {batch_id} nu a fost găsit" - ) - - # Get all batch_jobs for this batch - batch_jobs_result = await session.execute( - select(BatchJob).where(BatchJob.batch_id == batch_id) - ) - batch_jobs = batch_jobs_result.scalars().all() - - if not batch_jobs: - raise HTTPException( - status_code=404, - detail=f"Nu există job-uri în batch-ul {batch_id}" - ) - - # Process each job - cancel pending/processing, skip completed/failed - cancelled_count = 0 - skipped_count = 0 - - for batch_job in batch_jobs: - # Get current job status from OCR job queue - ocr_job = await job_queue.get_job(batch_job.job_id) - - if not ocr_job: - # Job not found in queue - treat as skipped - skipped_count += 1 - continue - - current_status = ocr_job.status.value - - # Only cancel pending or processing jobs - if current_status in (OCRJobStatus.pending.value, OCRJobStatus.processing.value): - success = await job_queue.update_status( - job_id=batch_job.job_id, - status=OCRJobStatus.cancelled, - error="Cancelled by user (batch cancel)" - ) - - if success: - cancelled_count += 1 - logger.debug(f"[CancelBatch] Cancelled job {batch_job.job_id}") - else: - # Failed to cancel - count as skipped - skipped_count += 1 - logger.warning( - f"[CancelBatch] Failed to cancel job {batch_job.job_id}" - ) - else: - # Job is completed, failed, or already cancelled - skip it - skipped_count += 1 - - logger.info( - f"[CancelBatch] Batch {batch_id} cancelled by {current_user.username}: " - f"{cancelled_count} cancelled, {skipped_count} skipped" - ) - - # Build message - if cancelled_count == 0: - message = f"Nu există job-uri de anulat în batch-ul {batch_id}" - elif skipped_count == 0: - message = f"{cancelled_count} job-uri anulate" - else: - message = f"{cancelled_count} job-uri anulate, {skipped_count} ignorate (deja procesate)" - - return CancelBatchResponse( - success=cancelled_count > 0, - batch_id=batch_id, - cancelled_count=cancelled_count, - skipped_count=skipped_count, - message=message - ) diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/routers/nomenclature.py b/deploy-package-20260223-151231/backend/modules/data_entry/routers/nomenclature.py deleted file mode 100644 index 3ec1a4f..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/routers/nomenclature.py +++ /dev/null @@ -1,260 +0,0 @@ -"""Nomenclature API endpoints.""" - -from typing import Optional, List, Annotated -from fastapi import APIRouter, Depends, HTTPException, Header, Request -from sqlalchemy.ext.asyncio import AsyncSession -from pydantic import BaseModel - -from backend.modules.data_entry.db.database import get_session -from backend.modules.data_entry.services.sync_service import SyncService - -# Import auth dependencies -import sys -from pathlib import Path -# Path setup handled by main.py - this is redundant -# project_root = Path(__file__).parent.parent.parent.parent.parent -# sys.path.insert(0, str(project_root / "shared")) - -from shared.auth.dependencies import get_current_user -from shared.auth.models import CurrentUser - -router = APIRouter() - - -# ============ Selected Company Dependency ============ - -async def get_selected_company( - current_user: CurrentUser = Depends(get_current_user), - x_selected_company: Annotated[Optional[str], Header()] = None -) -> int: - """ - Get selected company from X-Selected-Company header. - Validates user access. Falls back to first company if no header. - """ - if x_selected_company: - try: - company_id = int(x_selected_company) - except ValueError: - raise HTTPException(400, f"Invalid company ID: {x_selected_company}") - - if str(company_id) in current_user.companies: - return company_id - raise HTTPException(403, f"Nu aveți acces la firma {company_id}") - - if current_user.companies: - try: - return int(current_user.companies[0]) - except (ValueError, IndexError): - pass - - raise HTTPException(400, "Nu aveți nicio firmă asignată") - - -SelectedCompany = Annotated[int, Depends(get_selected_company)] - - -# Request/Response Models -class SupplierSearchResult(BaseModel): - found: bool - supplier: Optional[dict] = None - source: str # 'synced', 'local', 'not_found' - - -class LocalSupplierCreate(BaseModel): - name: str - fiscal_code: Optional[str] = None - address: Optional[str] = None - - -class LocalSupplierResponse(BaseModel): - id: int - name: str - fiscal_code: Optional[str] - address: Optional[str] - is_local: bool = True - - -class SyncResult(BaseModel): - synced: int - errors: int - message: str - - -class SupplierOption(BaseModel): - id: int - oracle_id: Optional[int] = None - name: str - fiscal_code: Optional[str] - source: str # 'synced' or 'local' - - -class CashRegisterOption(BaseModel): - id: int - oracle_id: int - name: str - account_code: str - register_type: str - - -# Endpoints -@router.get("/suppliers/search", response_model=SupplierSearchResult) -async def search_supplier( - fiscal_code: Optional[str] = None, - name: Optional[str] = None, - company_id: Optional[int] = None, - session: AsyncSession = Depends(get_session), - selected_company: SelectedCompany = None, -): - """Search for supplier by fiscal code or name.""" - if not fiscal_code and not name: - raise HTTPException(status_code=400, detail="Provide fiscal_code or name") - - cid = company_id or selected_company - - found, supplier, source = await SyncService.search_supplier( - session, cid, fiscal_code, name - ) - - return SupplierSearchResult(found=found, supplier=supplier, source=source) - - -@router.get("/suppliers", response_model=List[SupplierOption]) -async def get_suppliers( - search: Optional[str] = None, - company_id: Optional[int] = None, - session: AsyncSession = Depends(get_session), - selected_company: SelectedCompany = None, -): - """Get all suppliers (synced + local) for dropdown/autocomplete.""" - cid = company_id or selected_company - - suppliers = await SyncService.get_all_suppliers(session, cid, search) - - return [ - SupplierOption( - id=s["id"], - oracle_id=s.get("oracle_id"), - name=s["name"], - fiscal_code=s.get("fiscal_code"), - source=s["source"] - ) - for s in suppliers - ] - - -@router.post("/suppliers/local", response_model=LocalSupplierResponse) -async def create_local_supplier( - data: LocalSupplierCreate, - company_id: Optional[int] = None, - session: AsyncSession = Depends(get_session), - selected_company: SelectedCompany = None, - current_user: CurrentUser = Depends(get_current_user), -): - """Create a local supplier from OCR data.""" - cid = company_id or selected_company - - supplier = await SyncService.create_local_supplier( - session, cid, data.name, data.fiscal_code, data.address, current_user.username - ) - - return LocalSupplierResponse( - id=supplier.id, - name=supplier.name, - fiscal_code=supplier.fiscal_code, - address=supplier.address, - ) - - -@router.get("/cash-registers", response_model=List[CashRegisterOption]) -async def get_cash_registers( - company_id: Optional[int] = None, - session: AsyncSession = Depends(get_session), - selected_company: SelectedCompany = None, -): - """Get all cash registers for a company.""" - cid = company_id or selected_company - - registers = await SyncService.get_all_cash_registers(session, cid) - - return [ - CashRegisterOption( - id=r["id"], - oracle_id=r["oracle_id"], - name=r["name"], - account_code=r["account_code"], - register_type=r["register_type"] - ) - for r in registers - ] - - -@router.post("/sync/suppliers", response_model=SyncResult) -async def sync_suppliers( - request: Request, - company_id: Optional[int] = None, - session: AsyncSession = Depends(get_session), - selected_company: SelectedCompany = None, -): - """Manually trigger supplier sync from Oracle.""" - cid = company_id or selected_company - server_id = getattr(request.state, 'server_id', None) - - synced, errors = await SyncService.sync_suppliers(session, cid, server_id=server_id) - - return SyncResult( - synced=synced, - errors=errors, - message=f"Synced {synced} suppliers with {errors} errors" - ) - - -@router.post("/sync/cash-registers", response_model=SyncResult) -async def sync_cash_registers( - request: Request, - company_id: Optional[int] = None, - session: AsyncSession = Depends(get_session), - selected_company: SelectedCompany = None, -): - """Manually trigger cash register sync from Oracle.""" - cid = company_id or selected_company - server_id = getattr(request.state, 'server_id', None) - - synced, errors = await SyncService.sync_cash_registers(session, cid, server_id=server_id) - - return SyncResult( - synced=synced, - errors=errors, - message=f"Synced {synced} cash registers with {errors} errors" - ) - - -@router.post("/sync/all", response_model=dict) -async def sync_all_nomenclatures( - request: Request, - company_id: Optional[int] = None, - session: AsyncSession = Depends(get_session), - selected_company: SelectedCompany = None, -): - """Sync all nomenclatures (suppliers + cash registers) from Oracle.""" - cid = company_id or selected_company - server_id = getattr(request.state, 'server_id', None) - - # Sync suppliers - suppliers_synced, suppliers_errors = await SyncService.sync_suppliers(session, cid, server_id=server_id) - - # Sync cash registers - registers_synced, registers_errors = await SyncService.sync_cash_registers(session, cid, server_id=server_id) - - return { - "suppliers": { - "synced": suppliers_synced, - "errors": suppliers_errors - }, - "cash_registers": { - "synced": registers_synced, - "errors": registers_errors - }, - "total_synced": suppliers_synced + registers_synced, - "total_errors": suppliers_errors + registers_errors, - "message": f"Synced {suppliers_synced} suppliers and {registers_synced} cash registers" - } diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/routers/ocr.py b/deploy-package-20260223-151231/backend/modules/data_entry/routers/ocr.py deleted file mode 100644 index 933f3e1..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/routers/ocr.py +++ /dev/null @@ -1,715 +0,0 @@ -""" -OCR API endpoints with async job queue support. - -Endpoints: -- POST /extract - Submit OCR job (returns job_id immediately) -- GET /jobs/{job_id} - Get job status and result -- GET /queue/status - Get queue statistics -- GET /status - Check OCR service availability - -For backwards compatibility, we also support sync mode via query param: -- POST /extract?sync=true - Process synchronously (blocks until complete) -""" - -import os -import tempfile -from datetime import datetime -from decimal import Decimal -from pathlib import Path -from typing import Optional - -from fastapi import APIRouter, HTTPException, UploadFile, File, Depends, Query, Response -from sqlalchemy.ext.asyncio import AsyncSession - -from backend.modules.data_entry.db.database import get_session -from backend.modules.data_entry.db.crud.attachment import AttachmentCRUD -from backend.modules.data_entry.services.ocr_service import ocr_service -from backend.modules.data_entry.services.ocr_engine import OCREngine -from backend.modules.data_entry.services.ocr.job_queue import job_queue, OCRJobStatus as JobStatus -from backend.modules.data_entry.services.ocr.job_worker import estimate_wait_time -from backend.modules.data_entry.services.ocr.validation import OCRValidationEngine -from backend.modules.data_entry.schemas.ocr import ( - OCRResponse, - OCRStatusResponse, - ExtractionData, - TvaEntry, - PaymentMethod, - # New job queue schemas - OCREngineChoice, - OCRJobStatus, - OCRJobSubmitResponse, - OCRJobResponse, - OCRQueueStatusResponse, -) - -# Auth integration -from shared.auth.dependencies import get_current_user -from shared.auth.models import CurrentUser - -router = APIRouter() - - -# ============================================================================ -# OCR Job Queue Endpoints (NEW) -# ============================================================================ - -@router.post("/extract", response_model=OCRJobSubmitResponse) -async def submit_ocr_job( - file: UploadFile = File(...), - engine: OCREngineChoice = Query(default=OCREngineChoice.doctr_plus, description="OCR engine to use"), - sync: bool = Query(default=False, description="If true, process synchronously (blocks)"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Submit an OCR job for processing. - - By default, returns immediately with a job_id. Poll GET /jobs/{job_id} for result. - - Use ?sync=true for synchronous processing (blocks until complete). - This is for backwards compatibility but not recommended for production. - - Args: - file: Image or PDF file (max 10MB) - engine: OCR engine choice (tesseract, doctr, doctr_plus, paddleocr) - sync: If true, process synchronously (legacy mode) - - Returns: - OCRJobSubmitResponse with job_id, queue_position, estimated_wait - """ - allowed_types = ['image/jpeg', 'image/png', 'application/pdf'] - - if file.content_type not in allowed_types: - raise HTTPException( - status_code=400, - detail=f"File type not supported: {file.content_type}. Allowed: JPG, PNG, PDF" - ) - - # Read file content - content = await file.read() - - # Check file size (10MB limit) - if len(content) > 10 * 1024 * 1024: - raise HTTPException( - status_code=400, - detail="File too large. Maximum size is 10MB." - ) - - # Sync mode - use legacy processing (blocks) - if sync: - return await _process_sync(content, file, engine, current_user) - - # Async mode - create job and return immediately - try: - job = await job_queue.create_job( - file_bytes=content, - mime_type=file.content_type, - engine=engine.value, - username=current_user.username, - original_filename=file.filename - ) - - # Get queue position - queue_position = await job_queue.get_queue_position(job.id) - estimated_wait = estimate_wait_time(queue_position or 1) - - return OCRJobSubmitResponse( - job_id=job.id, - status=OCRJobStatus.pending, - queue_position=queue_position or 1, - estimated_wait_seconds=estimated_wait, - created_at=job.created_at or datetime.utcnow() - ) - - except Exception as e: - raise HTTPException( - status_code=500, - detail=f"Failed to create OCR job: {str(e)}" - ) - - -@router.get("/jobs/{job_id}", response_model=OCRJobResponse) -async def get_job_status( - job_id: str, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Get OCR job status and result (instant response). - - For efficient polling, use GET /jobs/{job_id}/wait instead (long-polling). - - Args: - job_id: Job UUID from POST /extract response - - Returns: - OCRJobResponse with status, queue_position, and result (if completed) - """ - job = await job_queue.get_job(job_id) - - if not job: - raise HTTPException(status_code=404, detail="Job not found") - - # Get queue position for pending jobs - queue_position = None - estimated_wait = None - - if job.status == JobStatus.pending: - queue_position = await job_queue.get_queue_position(job_id) - estimated_wait = estimate_wait_time(queue_position or 1) - elif job.status == JobStatus.processing: - queue_position = 0 - # Estimate remaining time based on average - avg_time = await job_queue.get_average_processing_time() - estimated_wait = int(avg_time * 0.5) # Rough estimate: half remaining - - # Convert result to ExtractionData if available - result_data = None - if job.status == JobStatus.completed and job.result: - result_data = _dict_to_extraction_data(job.result) - # Apply fuzzy CUI matching - result_data = await _apply_fuzzy_cui_matching(result_data, session) - # Debug: log suggested_payment_mode being returned - print(f"[OCR Router] Returning job {job_id} with suggested_payment_mode={result_data.suggested_payment_mode}", flush=True) - - return OCRJobResponse( - job_id=job.id, - status=OCRJobStatus(job.status.value), - queue_position=queue_position, - estimated_wait_seconds=estimated_wait, - created_at=job.created_at or datetime.utcnow(), - started_at=job.started_at, - completed_at=job.completed_at, - queue_wait_ms=job.queue_wait_ms, - ocr_time_ms=job.ocr_time_ms, - processing_time_ms=job.processing_time_ms, - result=result_data, - error=job.error_message - ) - - -@router.get("/jobs/{job_id}/wait", response_model=OCRJobResponse) -async def wait_for_job_status( - job_id: str, - response: Response, - timeout: int = Query(default=30, ge=1, le=60, description="Max wait time in seconds"), - wait_for_terminal: bool = Query(default=False, description="If true, only return on completed/failed"), - _t: int = Query(default=None, description="Cache-busting timestamp (ignored)"), - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Long-poll for OCR job status change. - - Waits until: - - Job status changes (default behavior - returns on any status change) - - Job reaches terminal state (if wait_for_terminal=true) - - Timeout expires (returns current status) - - Recommended client timeout: timeout + 5 seconds - - Args: - job_id: Job UUID from POST /extract response - timeout: Max wait time in seconds (1-60, default 30) - wait_for_terminal: If true, wait until completed/failed only - - Returns: - OCRJobResponse with status, queue_position, and result (if completed) - """ - # Prevent caching - critical for long-polling - response.headers["Cache-Control"] = "no-store, no-cache, must-revalidate, max-age=0" - response.headers["Pragma"] = "no-cache" - response.headers["Expires"] = "0" - import asyncio - import time - - start_time = time.time() - end_time = start_time + timeout - last_status = None - iteration = 0 - - print(f"[OCR Wait] Starting long-poll for job {job_id}, timeout={timeout}s, wait_for_terminal={wait_for_terminal}", flush=True) - - while time.time() < end_time: - iteration += 1 - job = await job_queue.get_job(job_id) - - if not job: - print(f"[OCR Wait] Job {job_id} not found after {iteration} iterations", flush=True) - raise HTTPException(status_code=404, detail="Job not found") - - # Return immediately if job completed or failed (terminal states) - if job.status in [JobStatus.completed, JobStatus.failed]: - elapsed = time.time() - start_time - print(f"[OCR Wait] Job {job_id} {job.status.value} after {elapsed:.1f}s ({iteration} iterations)", flush=True) - return await get_job_status(job_id, session, current_user) - - # Return on status change (unless wait_for_terminal is set) - if not wait_for_terminal and last_status is not None and job.status != last_status: - elapsed = time.time() - start_time - print(f"[OCR Wait] Job {job_id} status changed {last_status.value}->{job.status.value} after {elapsed:.1f}s", flush=True) - return await get_job_status(job_id, session, current_user) - - last_status = job.status - - # Wait 500ms before next internal check (faster polling for better responsiveness) - await asyncio.sleep(0.5) - - # Timeout - return current status - elapsed = time.time() - start_time - print(f"[OCR Wait] Job {job_id} timeout after {elapsed:.1f}s ({iteration} iterations), status={last_status.value if last_status else 'unknown'}", flush=True) - return await get_job_status(job_id, session, current_user) - - -@router.get("/queue/status", response_model=OCRQueueStatusResponse) -async def get_queue_status( - current_user: CurrentUser = Depends(get_current_user) -): - """ - Get OCR queue statistics. - - Returns: - Queue status with pending/processing counts and average time - """ - stats = await job_queue.get_queue_stats() - - return OCRQueueStatusResponse( - pending_jobs=stats["pending"], - processing_jobs=stats["processing"], - average_time_seconds=stats["average_time_seconds"] - ) - - -# ============================================================================ -# Legacy Endpoints (backwards compatibility) -# ============================================================================ - -@router.get("/status", response_model=OCRStatusResponse) -async def get_ocr_status(): - """Check OCR service status and available engines.""" - engines = OCREngine.get_available_engines() - available = len(engines) > 0 - - if available: - message = f"OCR service ready with engines: {', '.join(engines)}" - else: - message = "No OCR engines available. Install PaddleOCR or Tesseract." - - return OCRStatusResponse( - available=available, - engines=engines, - message=message - ) - - -@router.get("/engines") -async def get_available_engines(): - """ - Get list of enabled OCR engines based on .env configuration. - - Returns engines availability and available processing modes. - Frontend should use this to filter engine selection dropdown. - - Available engines: tesseract, doctr, doctr_plus, paddleocr - """ - # Check which engines are enabled via .env - paddle_enabled = os.getenv("OCR_ENABLE_PADDLEOCR", "true").lower() == "true" - tesseract_enabled = os.getenv("OCR_ENABLE_TESSERACT", "true").lower() == "true" - default_engine = os.getenv("OCR_DEFAULT_ENGINE", "doctr_plus") - - # Build engines dict - engines = { - "tesseract": tesseract_enabled, - "doctr": True, # Always available (primary engine) - "doctr_plus": True, # Always available (recommended) - "paddleocr": paddle_enabled, - } - - # Build available modes based on enabled engines - modes = [] - - if tesseract_enabled: - modes.append("tesseract") - - modes.append("doctr") - modes.append("doctr_plus") - - if paddle_enabled: - modes.append("paddleocr") - - return { - "engines": engines, - "available_modes": modes, - "default_mode": default_engine, - "memory_estimate_mb": { - "tesseract": 50, - "doctr": 600, - "doctr_plus": 600, - "paddleocr": 800, - } - } - - -@router.post("/extract-attachment/{attachment_id}", response_model=OCRResponse) -async def extract_from_attachment( - attachment_id: int, - engine: OCREngineChoice = Query(default=OCREngineChoice.doctr_plus), - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Extract receipt data from an existing attachment. - - Re-processes an already uploaded file with OCR. - This endpoint always processes synchronously. - """ - attachment = await AttachmentCRUD.get_by_id(session, attachment_id) - - if not attachment: - raise HTTPException(status_code=404, detail="Attachment not found") - - file_path = AttachmentCRUD.get_file_path(attachment) - - if not file_path.exists(): - raise HTTPException(status_code=404, detail="File not found on disk") - - # Check if file type is supported - if attachment.mime_type not in ['image/jpeg', 'image/png', 'application/pdf']: - raise HTTPException( - status_code=400, - detail=f"File type not supported for OCR: {attachment.mime_type}" - ) - - # TODO: Could use job queue here too, but keeping sync for now - success, message, result = await ocr_service.process_image( - file_path, attachment.mime_type - ) - - if not success: - raise HTTPException(status_code=422, detail=message) - - data = _result_to_extraction_data(result) - # Apply fuzzy CUI matching - data = await _apply_fuzzy_cui_matching(data, session) - return OCRResponse(success=True, message=message, data=data) - - -# ============================================================================ -# Helper Functions -# ============================================================================ - -async def _apply_fuzzy_cui_matching( - extraction_data: ExtractionData, - session: AsyncSession -) -> ExtractionData: - """ - Apply fuzzy CUI matching to extraction data. - - ONLY applies fuzzy matching if CUI is missing OR has invalid checksum. - If CUI has valid checksum, we trust the OCR and skip fuzzy matching. - - Args: - extraction_data: ExtractionData with CUI to potentially correct - session: AsyncSession for database lookups - - Returns: - ExtractionData with CUI corrected if a match was found - """ - from backend.modules.data_entry.services.ocr.validation import CUIChecksumRule - - # Skip if no CUI and no vendor name (nothing to match) - if not extraction_data.cui and not extraction_data.partner_name: - return extraction_data - - # Check if CUI has valid checksum - if valid, skip fuzzy matching - if extraction_data.cui: - cui_digits = CUIChecksumRule.extract_digits(extraction_data.cui) - if len(cui_digits) >= 6 and CUIChecksumRule.validate_checksum(cui_digits): - print(f"[Fuzzy Match] CUI {extraction_data.cui} has valid checksum, skipping fuzzy match", flush=True) - return extraction_data - - # CUI missing or invalid checksum - try fuzzy matching - try: - match = await OCRValidationEngine.fuzzy_match_supplier( - cui=extraction_data.cui, - vendor_name=extraction_data.partner_name, - db_session=session - ) - - if match: - corrected_cui, supplier_name = match - if corrected_cui != extraction_data.cui: - print(f"[Fuzzy Match] Corrected: {extraction_data.cui} -> {corrected_cui} ({supplier_name})", flush=True) - extraction_data.cui = corrected_cui - # Also set partner_name if not already set - if not extraction_data.partner_name: - extraction_data.partner_name = supplier_name - except Exception as e: - print(f"[Fuzzy Match] Error: {e}", flush=True) - - return extraction_data - - -async def _process_sync( - content: bytes, - file: UploadFile, - engine: OCREngineChoice, - current_user: CurrentUser -) -> OCRJobSubmitResponse: - """ - Process OCR synchronously (legacy mode). - - Creates a job, processes it immediately, and returns the result - wrapped in a JobSubmitResponse for API consistency. - """ - # Get file extension - suffix = Path(file.filename).suffix.lower() if file.filename else '.jpg' - if suffix not in ['.jpg', '.jpeg', '.png', '.pdf']: - suffix = '.jpg' - - # Save to temp file - with tempfile.NamedTemporaryFile(delete=False, suffix=suffix) as tmp: - tmp.write(content) - tmp_path = Path(tmp.name) - - try: - success, message, result = await ocr_service.process_image( - tmp_path, file.content_type - ) - - if not success: - raise HTTPException(status_code=422, detail=message) - - # Create a fake job response with the result embedded - # This maintains API compatibility - now = datetime.utcnow() - - # For sync mode, we return a special response that includes - # the result directly. Clients should check if result is present. - return OCRJobSubmitResponse( - job_id="sync-" + str(hash(content))[:16], - status=OCRJobStatus.completed, - queue_position=0, - estimated_wait_seconds=0, - created_at=now - ) - - finally: - # Clean up temp file - if tmp_path.exists(): - os.unlink(tmp_path) - - -def _result_to_extraction_data(result) -> ExtractionData: - """Convert ExtractionResult to ExtractionData schema.""" - # Convert tva_entries from dict to TvaEntry objects - tva_entries_schema = [ - TvaEntry(code=e.get('code'), percent=e['percent'], amount=e['amount']) - for e in result.tva_entries - ] if result.tva_entries else [] - - # Convert payment_methods from dict to PaymentMethod objects - payment_methods_list = [ - PaymentMethod(method=pm['method'], amount=Decimal(str(pm['amount']))) - for pm in result.payment_methods - ] if result.payment_methods else [] - - # Auto-suggest payment_mode based on detected methods - suggested_payment_mode = None - if payment_methods_list: - has_card = any(pm.method == 'CARD' for pm in payment_methods_list) - if has_card: - suggested_payment_mode = 'banca' - - return ExtractionData( - receipt_type=result.receipt_type, - receipt_number=result.receipt_number, - receipt_series=result.receipt_series, - receipt_date=result.receipt_date, - amount=result.amount, - partner_name=result.partner_name, - cui=result.cui, - description=result.description, - tva_entries=tva_entries_schema, - tva_total=result.tva_total, - address=result.address, - items_count=result.items_count, - payment_methods=payment_methods_list, - suggested_payment_mode=suggested_payment_mode, - client_name=result.client_name, - client_cui=result.client_cui, - client_address=result.client_address, - confidence_amount=result.confidence_amount, - confidence_date=result.confidence_date, - confidence_vendor=result.confidence_vendor, - confidence_client=getattr(result, 'confidence_client', 0.0), - overall_confidence=result.overall_confidence, - raw_text=result.raw_text, - raw_texts=getattr(result, 'raw_texts', []), - ocr_engine=result.ocr_engine, - processing_time_ms=result.processing_time_ms, - needs_manual_review=result.needs_manual_review, - validation_warnings=result.validation_warnings, - validation_errors=result.validation_errors, - inter_ocr_ratios=result.inter_ocr_ratios, - ) - - -def _dict_to_extraction_data(data: dict) -> ExtractionData: - """Convert result dict (from job queue) to ExtractionData schema.""" - from datetime import date - - # Parse date if string - receipt_date = data.get('receipt_date') - if isinstance(receipt_date, str): - try: - receipt_date = date.fromisoformat(receipt_date) - except (ValueError, TypeError): - receipt_date = None - - # Convert tva_entries - tva_entries = data.get('tva_entries', []) or [] - tva_entries_schema = [] - for e in tva_entries: - if isinstance(e, dict): - tva_entries_schema.append(TvaEntry( - code=e.get('code'), - percent=e.get('percent', 0), - amount=Decimal(str(e.get('amount', 0))) - )) - - # Convert payment_methods - payment_methods = data.get('payment_methods', []) or [] - payment_methods_list = [] - for pm in payment_methods: - if isinstance(pm, dict): - payment_methods_list.append(PaymentMethod( - method=pm.get('method', 'NUMERAR'), - amount=Decimal(str(pm.get('amount', 0))) - )) - - # Convert amount and tva_total to Decimal - amount = data.get('amount') - if amount is not None: - amount = Decimal(str(amount)) - - tva_total = data.get('tva_total') - if tva_total is not None: - tva_total = Decimal(str(tva_total)) - - return ExtractionData( - receipt_type=data.get('receipt_type', 'bon_fiscal'), - receipt_number=data.get('receipt_number'), - receipt_series=data.get('receipt_series'), - receipt_date=receipt_date, - amount=amount, - partner_name=data.get('partner_name'), - cui=data.get('cui'), - description=data.get('description'), - tva_entries=tva_entries_schema, - tva_total=tva_total, - address=data.get('address'), - items_count=data.get('items_count'), - payment_methods=payment_methods_list, - suggested_payment_mode=data.get('suggested_payment_mode'), - client_name=data.get('client_name'), - client_cui=data.get('client_cui'), - client_address=data.get('client_address'), - confidence_amount=data.get('confidence_amount', 0.0), - confidence_date=data.get('confidence_date', 0.0), - confidence_vendor=data.get('confidence_vendor', 0.0), - confidence_client=data.get('confidence_client', 0.0), - confidence_tva=data.get('confidence_tva', 0.0), - confidence_payment=data.get('confidence_payment', 0.0), - overall_confidence=data.get('overall_confidence', 0.0), - raw_text=data.get('raw_text', ''), - raw_texts=data.get('raw_texts', []), - ocr_engine=data.get('ocr_engine', ''), - processing_time_ms=data.get('processing_time_ms', 0), - needs_manual_review=data.get('needs_manual_review'), - validation_warnings=data.get('validation_warnings', []), - validation_errors=data.get('validation_errors', []), - inter_ocr_ratios=data.get('inter_ocr_ratios', {}), - ) - - -# ============================================================================ -# Store Profiles Management Endpoints -# ============================================================================ - -@router.post("/profiles/reload") -async def reload_store_profiles( - current_user: CurrentUser = Depends(get_current_user) -) -> dict: - """ - Hot-reload all store profiles. - - Reloads profile Python modules without server restart. - Use after adding/modifying profile files. - - Returns: - Dict with reloaded count and profile list - """ - from backend.modules.data_entry.services.ocr.profiles import ProfileRegistry - - count = ProfileRegistry.reload_all() - status = ProfileRegistry.get_reload_status() - - return { - "success": True, - "reloaded_modules": count, - "profiles_count": status["profiles_count"], - "registered_cuis": status["registered_cuis"], - "last_reload": status["last_reload"], - } - - -@router.get("/profiles") -async def list_store_profiles( - current_user: CurrentUser = Depends(get_current_user) -) -> dict: - """ - List all registered store profiles. - - Returns: - Dict with profiles list and status - """ - from backend.modules.data_entry.services.ocr.profiles import ProfileRegistry - - profiles = ProfileRegistry.list_profiles() - status = ProfileRegistry.get_reload_status() - - return { - "profiles": profiles, - "count": len(profiles), - "last_reload": status["last_reload"], - } - - -@router.get("/profiles/{cui}") -async def get_store_profile( - cui: str, - current_user: CurrentUser = Depends(get_current_user) -) -> dict: - """ - Get details for a specific store profile. - - Args: - cui: Store CUI (with or without RO prefix) - - Returns: - Profile details including validation hints - - Raises: - 404: If no profile exists for this CUI - """ - from backend.modules.data_entry.services.ocr.profiles import ProfileRegistry - - info = ProfileRegistry.get_profile_info(cui) - - if not info: - raise HTTPException( - status_code=404, - detail=f"No profile registered for CUI: {cui}" - ) - - return info diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/routers/ocr_settings.py b/deploy-package-20260223-151231/backend/modules/data_entry/routers/ocr_settings.py deleted file mode 100644 index 35331b9..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/routers/ocr_settings.py +++ /dev/null @@ -1,268 +0,0 @@ -""" -OCR Settings and Metrics API endpoints. - -Endpoints: -- GET /settings/ocr-preference - Get user's preferred OCR engine -- POST /settings/ocr-preference - Set user's preferred OCR engine -- GET /metrics/ocr/summary - Get OCR metrics summary by engine -- GET /metrics/ocr/history - Get user's OCR job history -- GET /metrics/ocr/stats - Get overall OCR statistics -""" - -from typing import List, Optional - -from fastapi import APIRouter, Depends, HTTPException, Query -from pydantic import BaseModel, Field -from sqlalchemy.ext.asyncio import AsyncSession - -from backend.modules.data_entry.db.database import get_session -from backend.modules.data_entry.db.crud.ocr_settings import OCRPreferenceCRUD, OCRMetricsCRUD -from backend.modules.data_entry.db.models.ocr_settings import OCREngine, OCRMetricsSummary - -# Auth integration -from shared.auth.dependencies import get_current_user -from shared.auth.models import CurrentUser - -router = APIRouter() - - -# ============================================================================ -# Schemas -# ============================================================================ - -class OCRPreferenceResponse(BaseModel): - """Response for OCR preference endpoint.""" - username: str - preferred_engine: str - available_engines: List[str] = Field( - default=["tesseract", "doctr", "doctr_plus", "paddleocr"], - description="Available OCR engines" - ) - - -class OCRPreferenceRequest(BaseModel): - """Request to set OCR preference.""" - preferred_engine: str = Field( - default="doctr_plus", - description="Preferred OCR engine: tesseract, doctr, doctr_plus, paddleocr" - ) - - -class OCRMetricsHistoryItem(BaseModel): - """Single OCR job metrics item.""" - job_id: str - engine_requested: str - engine_used: str - processing_time_ms: int - success: bool - overall_confidence: float - fields_extracted: int - created_at: str - original_filename: Optional[str] = None - - -class OCRMetricsHistoryResponse(BaseModel): - """Response for OCR history endpoint.""" - items: List[OCRMetricsHistoryItem] - total: int - - -class OCRStatsResponse(BaseModel): - """Response for OCR stats endpoint.""" - total_jobs: int - successful_jobs: int - failed_jobs: int - success_rate: float - avg_processing_time_ms: float - avg_confidence: float - period_days: int - - -class OCRActiveEnginesResponse(BaseModel): - """Response for active OCR engines endpoint.""" - engines: List[str] = Field(description="List of active OCR engines from .env config") - recommended: str = Field(default="doctr_plus", description="Recommended engine") - - -# ============================================================================ -# OCR Engines Configuration Endpoint -# ============================================================================ - -@router.get("/settings/ocr-engines", response_model=OCRActiveEnginesResponse) -async def get_active_ocr_engines(): - """ - Get list of active OCR engines configured in .env. - - Returns the engines that should be shown in the frontend dropdown. - Configured via OCR_ACTIVE_ENGINES environment variable. - - Default: doctr,doctr_plus - Available: tesseract, paddleocr, doctr, doctr_plus - """ - from backend.modules.data_entry.config import settings - - return OCRActiveEnginesResponse( - engines=settings.ocr_active_engines_list, - recommended="doctr_plus" - ) - - -# ============================================================================ -# OCR Preference Endpoints -# ============================================================================ - -@router.get("/settings/ocr-preference", response_model=OCRPreferenceResponse) -async def get_ocr_preference( - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Get user's preferred OCR engine. - - Returns the user's saved preference or 'doctr_plus' if not set. - Also returns list of available engines. - """ - from backend.modules.data_entry.services.ocr_engine import OCREngine as OCREngineClass - - preference = await OCRPreferenceCRUD.get_by_username(session, current_user.username) - - # Get available engines from OCR service - available = OCREngineClass.get_available_engines() - - return OCRPreferenceResponse( - username=current_user.username, - preferred_engine=preference.preferred_engine.value if preference else "doctr_plus", - available_engines=available - ) - - -@router.post("/settings/ocr-preference", response_model=OCRPreferenceResponse) -async def set_ocr_preference( - request: OCRPreferenceRequest, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Set user's preferred OCR engine. - - Valid engines: tesseract, doctr, doctr_plus, paddleocr - Note: Available engines depend on .env configuration (OCR_ENABLE_PADDLEOCR, OCR_ENABLE_TESSERACT) - """ - from backend.modules.data_entry.services.ocr_engine import OCREngine as OCREngineClass - - # Get dynamically available engines - available = OCREngineClass.get_available_engines() - - if request.preferred_engine not in available: - raise HTTPException( - status_code=400, - detail=f"Invalid engine. Must be one of: {', '.join(available)}" - ) - - # Map string to enum - engine_map = { - "tesseract": OCREngine.TESSERACT, - "doctr": OCREngine.DOCTR, - "doctr_plus": OCREngine.DOCTR_PLUS, - "paddleocr": OCREngine.PADDLEOCR, - } - engine_enum = engine_map.get(request.preferred_engine, OCREngine.DOCTR_PLUS) - - # Save preference - preference = await OCRPreferenceCRUD.create_or_update( - session, - current_user.username, - engine_enum - ) - - # Get available engines - available = OCREngineClass.get_available_engines() - - return OCRPreferenceResponse( - username=current_user.username, - preferred_engine=preference.preferred_engine.value, - available_engines=available - ) - - -# ============================================================================ -# OCR Metrics Endpoints -# ============================================================================ - -@router.get("/metrics/ocr/summary", response_model=List[OCRMetricsSummary]) -async def get_ocr_metrics_summary( - days: int = Query(default=30, ge=1, le=365, description="Number of days to include"), - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Get OCR metrics summary grouped by engine. - - Returns aggregated metrics for each engine used in the specified period. - """ - summaries = await OCRMetricsCRUD.get_summary_by_engine( - session, - days=days, - username=current_user.username - ) - return summaries - - -@router.get("/metrics/ocr/history", response_model=OCRMetricsHistoryResponse) -async def get_ocr_metrics_history( - limit: int = Query(default=50, ge=1, le=200, description="Max items to return"), - offset: int = Query(default=0, ge=0, description="Items to skip"), - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Get user's OCR job history. - - Returns list of OCR jobs with their metrics, ordered by most recent first. - """ - items = await OCRMetricsCRUD.get_user_history( - session, - username=current_user.username, - limit=limit, - offset=offset - ) - - history_items = [ - OCRMetricsHistoryItem( - job_id=item.job_id, - engine_requested=item.engine_requested, - engine_used=item.engine_used, - processing_time_ms=item.processing_time_ms, - success=item.success, - overall_confidence=item.overall_confidence, - fields_extracted=item.fields_extracted, - created_at=item.created_at.isoformat(), - original_filename=item.original_filename - ) - for item in items - ] - - return OCRMetricsHistoryResponse( - items=history_items, - total=len(history_items) - ) - - -@router.get("/metrics/ocr/stats", response_model=OCRStatsResponse) -async def get_ocr_stats( - days: int = Query(default=30, ge=1, le=365, description="Number of days to include"), - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Get overall OCR statistics for the user. - - Returns aggregated stats including success rate, average processing time, etc. - """ - stats = await OCRMetricsCRUD.get_overall_stats( - session, - days=days, - username=current_user.username - ) - - return OCRStatsResponse(**stats) diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/routers/receipts.py b/deploy-package-20260223-151231/backend/modules/data_entry/routers/receipts.py deleted file mode 100644 index 8ac6c96..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/routers/receipts.py +++ /dev/null @@ -1,705 +0,0 @@ -"""API endpoints for receipts.""" - -from typing import List, Optional, Annotated -from pathlib import Path - -from fastapi import APIRouter, Depends, HTTPException, UploadFile, File, Query, Header, Response -from fastapi.responses import FileResponse, StreamingResponse -from sqlalchemy.ext.asyncio import AsyncSession - -from backend.modules.data_entry.db.database import get_session -from backend.modules.data_entry.db.crud.receipt import ReceiptCRUD -from backend.modules.data_entry.db.crud.attachment import AttachmentCRUD -from backend.modules.data_entry.db.crud.accounting_entry import AccountingEntryCRUD -from backend.modules.data_entry.services.receipt_service import ReceiptService -from backend.modules.data_entry.services.nomenclature_service import NomenclatureService -from backend.modules.data_entry.schemas.receipt import ( - ReceiptCreate, - ReceiptUpdate, - ReceiptResponse, - ReceiptListResponse, - ReceiptFilter, - ProcessingStats, - AttachmentResponse, - AccountingEntryResponse, - WorkflowAction, - RejectRequest, - EntriesUpdateRequest, - PartnerOption, - AccountOption, - CashRegisterOption, - ExpenseTypeOption, - BulkDeleteRequest, - BulkDeleteResponse, - BulkDeleteFailure, -) -from backend.modules.data_entry.db.models.receipt import ReceiptStatus, ReceiptDirection -from backend.modules.data_entry.services import sse_service - -# Auth integration -from shared.auth.dependencies import get_current_user -from shared.auth.models import CurrentUser - - -router = APIRouter() - - -# ============ Helper for selected company from header ============ - -async def get_selected_company( - current_user: CurrentUser = Depends(get_current_user), - x_selected_company: Annotated[Optional[str], Header()] = None -) -> int: - """ - Get selected company from X-Selected-Company header. - - Validates that the user has access to the specified company. - Falls back to user's first company if no header is provided. - - Raises: - HTTPException 403: If user doesn't have access to specified company - HTTPException 400: If user has no companies assigned - """ - if x_selected_company: - try: - company_id = int(x_selected_company) - except ValueError: - raise HTTPException( - status_code=400, - detail=f"Invalid company ID format: {x_selected_company}" - ) - - # Validate user has access to this company - # Auth stores companies as strings - if str(company_id) in current_user.companies: - return company_id - - raise HTTPException( - status_code=403, - detail=f"Nu aveți acces la firma {company_id}" - ) - - # No header - use first company from user's list - if current_user.companies: - try: - return int(current_user.companies[0]) - except (ValueError, IndexError): - pass - - raise HTTPException( - status_code=400, - detail="Nu aveți nicio firmă asignată" - ) - - -# Dependency for injection -SelectedCompany = Annotated[int, Depends(get_selected_company)] - - -# Legacy function for backwards compatibility (deprecated) -def get_current_user_company(current_user: CurrentUser) -> int: - """ - DEPRECATED: Use get_selected_company() dependency instead. - This function returns the first company, ignoring X-Selected-Company header. - """ - if current_user.companies: - try: - return int(current_user.companies[0]) - except (ValueError, IndexError): - return 1 - return 1 - - -# ============ SSE Endpoint for Real-time Status Updates ============ - -@router.get("/sse/status") -async def sse_status_stream( - batch_id: Optional[str] = Query( - default=None, - description="Optional batch_id to filter events for a specific batch" - ), -): - """ - Server-Sent Events endpoint for real-time receipt status updates. - - This endpoint provides a persistent connection that streams status change - events as they occur. Clients receive updates for CRUD operations on receipts - without needing to poll. - - Query Parameters: - batch_id: Optional filter to only receive events for a specific batch upload. - - Event Format: - data: {"receipt_id": 123, "status": "DRAFT", "processing_status": "completed", ...} - - Headers: - - Content-Type: text/event-stream - - Cache-Control: no-cache - - Connection: keep-alive - - Reconnection: - The retry: 3000 header hints clients to reconnect after 3 seconds if disconnected. - - Example: - curl -N http://localhost:8000/api/data-entry/receipts/sse/status - curl -N http://localhost:8000/api/data-entry/receipts/sse/status?batch_id=abc-123 - """ - return StreamingResponse( - sse_service.subscribe(batch_id=batch_id), - media_type="text/event-stream", - headers={ - "Cache-Control": "no-cache", - "Connection": "keep-alive", - "X-Accel-Buffering": "no", # Disable nginx buffering - }, - ) - - -# ============ Receipt CRUD Endpoints ============ - -@router.post("/", response_model=ReceiptResponse) -async def create_receipt( - data: ReceiptCreate, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), -): - """Create a new receipt in DRAFT status.""" - receipt = await ReceiptService.create_receipt(session, data, current_user.username) - return ReceiptResponse.model_validate(receipt) - - -@router.get("/", response_model=ReceiptListResponse) -async def list_receipts( - response: Response, - status: Optional[ReceiptStatus] = None, - direction: Optional[ReceiptDirection] = None, - company_id: Optional[int] = None, - created_by: Optional[str] = None, - date_from: Optional[str] = None, - date_to: Optional[str] = None, - search: Optional[str] = None, - # Bulk upload filters (US-012) - processing_status: Optional[str] = Query(default=None, description="Filter by processing status: pending, processing, completed, failed"), - batch_id: Optional[str] = Query(default=None, description="Filter by batch_id UUID"), - sort_by: Optional[str] = Query(default=None, description="Sort field: processing_started_at, processing_started_at_asc"), - # Pagination - page: int = Query(default=1, ge=1), - page_size: int = Query(default=20, ge=1, le=100), - session: AsyncSession = Depends(get_session), - selected_company: SelectedCompany = None, -): - """Get paginated list of receipts with filters. - - US-012: Extended with batch_id, processing_status filters and processing_stats. - """ - # Disable browser caching to always get fresh data - response.headers["Cache-Control"] = "no-store, no-cache, must-revalidate, max-age=0" - response.headers["Pragma"] = "no-cache" - - from datetime import date as date_type - - filters = ReceiptFilter( - status=status, - direction=direction, - company_id=company_id or selected_company, - created_by=created_by, - date_from=date_type.fromisoformat(date_from) if date_from else None, - date_to=date_type.fromisoformat(date_to) if date_to else None, - search=search, - processing_status=processing_status, - batch_id=batch_id, - sort_by=sort_by, - page=page, - page_size=page_size, - ) - - return await ReceiptService.get_receipts(session, filters) - - -@router.get("/pending", response_model=List[ReceiptResponse]) -async def list_pending_receipts( - response: Response, - company_id: Optional[int] = None, - session: AsyncSession = Depends(get_session), - selected_company: SelectedCompany = None, -): - """Get all receipts pending review (for accountant view).""" - # Disable browser caching to always get fresh data - response.headers["Cache-Control"] = "no-store, no-cache, must-revalidate, max-age=0" - response.headers["Pragma"] = "no-cache" - - receipts = await ReceiptCRUD.get_pending_review( - session, company_id or selected_company - ) - return [ReceiptResponse.model_validate(r) for r in receipts] - - -@router.get("/stats") -async def get_receipt_stats( - response: Response, - company_id: Optional[int] = None, - my_receipts: bool = False, - session: AsyncSession = Depends(get_session), - selected_company: SelectedCompany = None, - current_user: CurrentUser = Depends(get_current_user), -): - """Get receipt statistics.""" - # Disable browser caching to always get fresh data - response.headers["Cache-Control"] = "no-store, no-cache, must-revalidate, max-age=0" - response.headers["Pragma"] = "no-cache" - - return await ReceiptCRUD.get_stats( - session, - company_id or selected_company, - created_by=current_user.username if my_receipts else None, - ) - - -@router.get("/{receipt_id}", response_model=ReceiptResponse) -async def get_receipt( - receipt_id: int, - response: Response, - session: AsyncSession = Depends(get_session), -): - """Get receipt details with attachments and accounting entries.""" - # Disable browser caching to always get fresh data - response.headers["Cache-Control"] = "no-store, no-cache, must-revalidate, max-age=0" - response.headers["Pragma"] = "no-cache" - - receipt = await ReceiptService.get_receipt(session, receipt_id) - - if not receipt: - raise HTTPException(status_code=404, detail="Receipt not found") - - return ReceiptResponse.model_validate(receipt) - - -@router.put("/{receipt_id}", response_model=ReceiptResponse) -async def update_receipt( - receipt_id: int, - data: ReceiptUpdate, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), -): - """Update receipt (only DRAFT status, only by creator).""" - success, message, receipt = await ReceiptService.update_receipt( - session, receipt_id, data, current_user.username - ) - - if not success: - raise HTTPException(status_code=400, detail=message) - - return ReceiptResponse.model_validate(receipt) - - -@router.delete("/bulk", response_model=BulkDeleteResponse) -async def bulk_delete_receipts( - data: BulkDeleteRequest, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), -): - """ - Bulk delete receipts (US-024). - - Deletes multiple receipts in a single request with partial success support. - - Validation rules: - - Each receipt must be in DRAFT status - - Each receipt must be created by the current user - - Receipts with processing_status 'pending' or 'processing' cannot be deleted - - Returns: - BulkDeleteResponse with deleted IDs and failed items with error messages - """ - deleted: List[int] = [] - failed: List[BulkDeleteFailure] = [] - - for receipt_id in data.ids: - # Get receipt with relationships for deletion - receipt = await ReceiptCRUD.get_by_id(session, receipt_id, include_relations=True) - - if not receipt: - failed.append(BulkDeleteFailure(id=receipt_id, error="Bonul nu a fost găsit")) - continue - - # Check if receipt is being processed (bulk upload in progress) - if receipt.processing_status in ["pending", "processing"]: - failed.append(BulkDeleteFailure( - id=receipt_id, - error="Bonul este în curs de procesare și nu poate fi șters" - )) - continue - - # Check status - only DRAFT can be deleted - if receipt.status != ReceiptStatus.DRAFT: - failed.append(BulkDeleteFailure( - id=receipt_id, - error=f"Doar bonurile în status DRAFT pot fi șterse (status curent: {receipt.status.value})" - )) - continue - - # Check ownership - if receipt.created_by != current_user.username: - failed.append(BulkDeleteFailure( - id=receipt_id, - error="Doar creatorul bonului poate să-l șteargă" - )) - continue - - # All validations passed - delete the receipt - # Note: Cascade delete handles attachments and accounting entries - await ReceiptCRUD.delete(session, receipt) - deleted.append(receipt_id) - - return BulkDeleteResponse(deleted=deleted, failed=failed) - - -@router.delete("/{receipt_id}") -async def delete_receipt( - receipt_id: int, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), -): - """Delete receipt (only DRAFT status, only by creator).""" - success, message = await ReceiptService.delete_receipt( - session, receipt_id, current_user.username - ) - - if not success: - raise HTTPException(status_code=400, detail=message) - - return {"success": True, "message": message} - - -# ============ Workflow Endpoints ============ - -@router.post("/{receipt_id}/submit", response_model=WorkflowAction) -async def submit_receipt( - receipt_id: int, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), -): - """Submit receipt for review (DRAFT → PENDING_REVIEW).""" - success, message, receipt = await ReceiptService.submit_for_review( - session, receipt_id, current_user.username - ) - - # Broadcast SSE event on success (US-030) - if success and receipt: - await sse_service.broadcast_status_change( - receipt_id=receipt.id, - status=receipt.status.value, - processing_status=receipt.processing_status, - batch_id=receipt.batch_id, - ) - - return WorkflowAction( - success=success, - message=message, - receipt=ReceiptResponse.model_validate(receipt) if receipt else None, - ) - - -@router.post("/{receipt_id}/approve", response_model=WorkflowAction) -async def approve_receipt( - receipt_id: int, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), -): - """Approve receipt (PENDING_REVIEW → APPROVED). Accountant action.""" - success, message, receipt = await ReceiptService.approve_receipt( - session, receipt_id, current_user.username - ) - - # Broadcast SSE event on success (US-030) - if success and receipt: - await sse_service.broadcast_status_change( - receipt_id=receipt.id, - status=receipt.status.value, - processing_status=receipt.processing_status, - batch_id=receipt.batch_id, - ) - - return WorkflowAction( - success=success, - message=message, - receipt=ReceiptResponse.model_validate(receipt) if receipt else None, - ) - - -@router.post("/{receipt_id}/reject", response_model=WorkflowAction) -async def reject_receipt( - receipt_id: int, - data: RejectRequest, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), -): - """Reject receipt (PENDING_REVIEW → REJECTED). Accountant action.""" - success, message, receipt = await ReceiptService.reject_receipt( - session, receipt_id, current_user.username, data.reason - ) - - # Broadcast SSE event on success (US-030) - if success and receipt: - await sse_service.broadcast_status_change( - receipt_id=receipt.id, - status=receipt.status.value, - processing_status=receipt.processing_status, - batch_id=receipt.batch_id, - ) - - return WorkflowAction( - success=success, - message=message, - receipt=ReceiptResponse.model_validate(receipt) if receipt else None, - ) - - -@router.post("/{receipt_id}/resubmit", response_model=WorkflowAction) -async def resubmit_receipt( - receipt_id: int, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), -): - """Resubmit rejected receipt after corrections (REJECTED → PENDING_REVIEW).""" - success, message, receipt = await ReceiptService.resubmit_receipt( - session, receipt_id, current_user.username - ) - - # Broadcast SSE event on success (US-030) - if success and receipt: - await sse_service.broadcast_status_change( - receipt_id=receipt.id, - status=receipt.status.value, - processing_status=receipt.processing_status, - batch_id=receipt.batch_id, - ) - - return WorkflowAction( - success=success, - message=message, - receipt=ReceiptResponse.model_validate(receipt) if receipt else None, - ) - - -@router.post("/{receipt_id}/unapprove", response_model=WorkflowAction) -async def unapprove_receipt( - receipt_id: int, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), -): - """Unapprove receipt (APPROVED → PENDING_REVIEW). Returns to pending for corrections.""" - success, message, receipt = await ReceiptService.unapprove_receipt( - session, receipt_id, current_user.username - ) - - # Broadcast SSE event on success (US-030) - if success and receipt: - await sse_service.broadcast_status_change( - receipt_id=receipt.id, - status=receipt.status.value, - processing_status=receipt.processing_status, - batch_id=receipt.batch_id, - ) - - return WorkflowAction( - success=success, - message=message, - receipt=ReceiptResponse.model_validate(receipt) if receipt else None, - ) - - -# ============ Accounting Entries Endpoints ============ - -@router.get("/{receipt_id}/entries", response_model=List[AccountingEntryResponse]) -async def get_receipt_entries( - receipt_id: int, - session: AsyncSession = Depends(get_session), -): - """Get accounting entries for a receipt.""" - entries = await AccountingEntryCRUD.get_by_receipt_id(session, receipt_id) - return [AccountingEntryResponse.model_validate(e) for e in entries] - - -@router.put("/{receipt_id}/entries", response_model=List[AccountingEntryResponse]) -async def update_receipt_entries( - receipt_id: int, - data: EntriesUpdateRequest, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), -): - """Update accounting entries for a receipt (accountant action).""" - success, message, entries = await ReceiptService.update_entries( - session, receipt_id, data.entries, current_user.username - ) - - if not success: - raise HTTPException(status_code=400, detail=message) - - return [AccountingEntryResponse.model_validate(e) for e in entries] - - -@router.post("/{receipt_id}/entries/regenerate", response_model=List[AccountingEntryResponse]) -async def regenerate_entries( - receipt_id: int, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), -): - """Regenerate accounting entries based on receipt data.""" - success, message, _ = await ReceiptService.regenerate_entries( - session, receipt_id, current_user.username - ) - - if not success: - raise HTTPException(status_code=400, detail=message) - - entries = await AccountingEntryCRUD.get_by_receipt_id(session, receipt_id) - return [AccountingEntryResponse.model_validate(e) for e in entries] - - -# ============ Attachment Endpoints ============ - -@router.post("/{receipt_id}/attachments", response_model=AttachmentResponse) -async def upload_attachment( - receipt_id: int, - file: UploadFile = File(...), - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), -): - """Upload attachment for a receipt.""" - # Check receipt exists and user can modify it - receipt = await ReceiptCRUD.get_by_id(session, receipt_id, include_relations=False) - - if not receipt: - raise HTTPException(status_code=404, detail="Receipt not found") - - # Only allow uploads for DRAFT and REJECTED receipts - if receipt.status not in [ReceiptStatus.DRAFT, ReceiptStatus.REJECTED]: - raise HTTPException( - status_code=400, - detail="Cannot upload attachments for this receipt status" - ) - - # Only creator can upload - if receipt.created_by != current_user.username: - raise HTTPException( - status_code=403, - detail="Only the creator can upload attachments" - ) - - try: - attachment = await AttachmentCRUD.create(session, receipt_id, file) - return AttachmentResponse.model_validate(attachment) - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - - -@router.get("/{receipt_id}/attachments", response_model=List[AttachmentResponse]) -async def list_attachments( - receipt_id: int, - session: AsyncSession = Depends(get_session), -): - """Get all attachments for a receipt.""" - attachments = await AttachmentCRUD.get_by_receipt_id(session, receipt_id) - return [AttachmentResponse.model_validate(a) for a in attachments] - - -@router.get("/attachments/{attachment_id}/download") -async def download_attachment( - attachment_id: int, - session: AsyncSession = Depends(get_session), -): - """Download an attachment file.""" - attachment = await AttachmentCRUD.get_by_id(session, attachment_id) - - if not attachment: - raise HTTPException(status_code=404, detail="Attachment not found") - - file_path = AttachmentCRUD.get_file_path(attachment) - - if not file_path.exists(): - raise HTTPException(status_code=404, detail="File not found on disk") - - return FileResponse( - path=str(file_path), - filename=attachment.filename, - media_type=attachment.mime_type, - ) - - -@router.delete("/attachments/{attachment_id}") -async def delete_attachment( - attachment_id: int, - session: AsyncSession = Depends(get_session), - current_user: CurrentUser = Depends(get_current_user), -): - """Delete an attachment.""" - attachment = await AttachmentCRUD.get_by_id(session, attachment_id) - - if not attachment: - raise HTTPException(status_code=404, detail="Attachment not found") - - # Get receipt to check permissions - receipt = await ReceiptCRUD.get_by_id(session, attachment.receipt_id, include_relations=False) - - if not receipt: - raise HTTPException(status_code=404, detail="Receipt not found") - - # Only allow deletion for DRAFT receipts by creator - if receipt.status != ReceiptStatus.DRAFT: - raise HTTPException( - status_code=400, - detail="Cannot delete attachments for this receipt status" - ) - - if receipt.created_by != current_user.username: - raise HTTPException( - status_code=403, - detail="Only the creator can delete attachments" - ) - - await AttachmentCRUD.delete(session, attachment) - return {"success": True, "message": "Attachment deleted"} - - -# ============ Nomenclature Endpoints ============ - -@router.get("/nomenclature/partners", response_model=List[PartnerOption]) -async def get_partners( - search: Optional[str] = None, - company_id: Optional[int] = None, - session: AsyncSession = Depends(get_session), - selected_company: SelectedCompany = None, -): - """Get partners (suppliers/customers) for dropdown.""" - return await NomenclatureService.get_partners( - company_id or selected_company, search, session - ) - - -@router.get("/nomenclature/accounts", response_model=List[AccountOption]) -async def get_accounts( - prefix: Optional[str] = None, - company_id: Optional[int] = None, - selected_company: SelectedCompany = None, -): - """Get chart of accounts for dropdown.""" - return await NomenclatureService.get_accounts( - company_id or selected_company, prefix - ) - - -@router.get("/nomenclature/cash-registers", response_model=List[CashRegisterOption]) -async def get_cash_registers( - company_id: Optional[int] = None, - session: AsyncSession = Depends(get_session), - selected_company: SelectedCompany = None, -): - """Get cash registers and bank accounts for dropdown.""" - return await NomenclatureService.get_cash_registers(company_id or selected_company, session) - - -@router.get("/nomenclature/expense-types", response_model=List[ExpenseTypeOption]) -async def get_expense_types(): - """Get predefined expense types for dropdown.""" - return await NomenclatureService.get_expense_types() diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/schemas/__init__.py b/deploy-package-20260223-151231/backend/modules/data_entry/schemas/__init__.py deleted file mode 100644 index da5d992..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/schemas/__init__.py +++ /dev/null @@ -1,39 +0,0 @@ -# Pydantic schemas -from .receipt import ( - ReceiptCreate, - ReceiptUpdate, - ReceiptResponse, - ReceiptListResponse, - ReceiptFilter, - AttachmentResponse, - AccountingEntryCreate, - AccountingEntryUpdate, - AccountingEntryResponse, - WorkflowAction, - RejectRequest, -) -from .bulk import ( - BulkUploadResponse, - BatchJobInfo, - BatchStatusResponse, - BulkUploadError, -) - -__all__ = [ - "ReceiptCreate", - "ReceiptUpdate", - "ReceiptResponse", - "ReceiptListResponse", - "ReceiptFilter", - "AttachmentResponse", - "AccountingEntryCreate", - "AccountingEntryUpdate", - "AccountingEntryResponse", - "WorkflowAction", - "RejectRequest", - # Bulk upload schemas - "BulkUploadResponse", - "BatchJobInfo", - "BatchStatusResponse", - "BulkUploadError", -] diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/schemas/bulk.py b/deploy-package-20260223-151231/backend/modules/data_entry/schemas/bulk.py deleted file mode 100644 index 42f3e46..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/schemas/bulk.py +++ /dev/null @@ -1,212 +0,0 @@ -"""Pydantic schemas for bulk upload endpoints.""" - -from datetime import datetime -from typing import List, Optional - -from pydantic import BaseModel, Field - - -class BulkUploadResponse(BaseModel): - """Response schema for bulk upload endpoint.""" - - batch_id: int = Field(..., description="Unique batch identifier for tracking") - job_ids: List[str] = Field(..., description="List of OCR job UUIDs created") - total_files: int = Field(..., description="Number of files in the batch") - message: str = Field(..., description="Status message") - - class Config: - json_schema_extra = { - "example": { - "batch_id": 1, - "job_ids": [ - "550e8400-e29b-41d4-a716-446655440001", - "550e8400-e29b-41d4-a716-446655440002", - ], - "total_files": 2, - "message": "2 files queued for processing" - } - } - - -class BatchJobInfo(BaseModel): - """Information about a single job in a batch.""" - - job_id: str = Field(..., description="OCR job UUID") - filename: str = Field(..., description="Original filename") - status: str = Field(..., description="Job status: pending, processing, completed, failed") - receipt_id: Optional[int] = Field(None, description="Created receipt ID (if completed)") - error_message: Optional[str] = Field(None, description="Error message (if failed)") - - -class BatchStatusResponse(BaseModel): - """Response schema for batch status endpoint.""" - - batch_id: int = Field(..., description="Batch identifier") - status: str = Field(..., description="Overall batch status") - total_files: int = Field(..., description="Total number of files in batch") - pending_count: int = Field(..., description="Number of pending jobs") - processing_count: int = Field(..., description="Number of processing jobs") - completed_count: int = Field(..., description="Number of completed jobs") - failed_count: int = Field(..., description="Number of failed jobs") - jobs: List[BatchJobInfo] = Field(..., description="List of jobs with their status") - total_amount: Optional[float] = Field(None, description="Sum of all receipt amounts") - created_at: datetime = Field(..., description="Batch creation timestamp") - - class Config: - json_schema_extra = { - "example": { - "batch_id": 1, - "status": "processing", - "total_files": 5, - "pending_count": 2, - "processing_count": 1, - "completed_count": 2, - "failed_count": 0, - "jobs": [ - {"job_id": "abc-123", "filename": "bon1.pdf", "status": "completed", "receipt_id": 15}, - {"job_id": "def-456", "filename": "bon2.jpg", "status": "processing", "receipt_id": None}, - ], - "total_amount": 150.50, - "created_at": "2025-01-09T10:30:00" - } - } - - -class DuplicateFileInfo(BaseModel): - """Information about a duplicate file detected during upload.""" - - filename: str = Field(..., description="Name of the duplicate file") - error: str = Field(default="duplicate", description="Error type (always 'duplicate')") - existing_receipt_id: int = Field(..., description="ID of the existing receipt with same file hash") - message: str = Field(..., description="Human-readable error message") - - class Config: - json_schema_extra = { - "example": { - "filename": "bon_lidl.pdf", - "error": "duplicate", - "existing_receipt_id": 123, - "message": "Fișier duplicat - există deja ca bon #123" - } - } - - -class BulkUploadResponseWithDuplicates(BaseModel): - """Response schema for bulk upload with partial success (some duplicates).""" - - batch_id: Optional[int] = Field(None, description="Batch ID (None if all files were duplicates)") - job_ids: List[str] = Field(default_factory=list, description="List of OCR job UUIDs created") - total_files: int = Field(..., description="Total number of files submitted") - processed_files: int = Field(..., description="Number of files successfully queued") - duplicate_files: int = Field(..., description="Number of duplicate files rejected") - duplicates: List[DuplicateFileInfo] = Field(default_factory=list, description="List of duplicate file details") - message: str = Field(..., description="Status message") - - class Config: - json_schema_extra = { - "example": { - "batch_id": 1, - "job_ids": ["550e8400-e29b-41d4-a716-446655440001"], - "total_files": 3, - "processed_files": 1, - "duplicate_files": 2, - "duplicates": [ - { - "filename": "bon_lidl.pdf", - "error": "duplicate", - "existing_receipt_id": 123, - "message": "Fișier duplicat - există deja ca bon #123" - } - ], - "message": "1 fișier în procesare, 2 duplicate ignorate" - } - } - - -class BulkUploadError(BaseModel): - """Error response for bulk upload validation failures.""" - - detail: str = Field(..., description="Error message") - invalid_files: Optional[List[str]] = Field(None, description="List of invalid filenames") - - -class RetryResponse(BaseModel): - """Response schema for retry endpoints.""" - - success: bool = Field(..., description="Whether the retry was successful") - receipt_id: int = Field(..., description="Receipt ID that was retried") - job_id: Optional[str] = Field(None, description="New OCR job ID created") - message: str = Field(..., description="Status message") - - class Config: - json_schema_extra = { - "example": { - "success": True, - "receipt_id": 123, - "job_id": "550e8400-e29b-41d4-a716-446655440001", - "message": "Bon reîncarcat în procesare" - } - } - - -class BatchRetryResponse(BaseModel): - """Response schema for batch retry endpoint.""" - - success: bool = Field(..., description="Whether any retries were successful") - batch_id: str = Field(..., description="Batch ID that was retried") - retried_count: int = Field(..., description="Number of receipts successfully retried") - failed_count: int = Field(..., description="Number of receipts that couldn't be retried") - errors: List[str] = Field(default_factory=list, description="List of error messages") - message: str = Field(..., description="Status message") - - class Config: - json_schema_extra = { - "example": { - "success": True, - "batch_id": "abc-123", - "retried_count": 3, - "failed_count": 0, - "errors": [], - "message": "3 bonuri reîncarcate în procesare" - } - } - - -class CancelJobResponse(BaseModel): - """Response schema for cancel job endpoint.""" - - success: bool = Field(..., description="Whether the cancellation was successful") - job_id: str = Field(..., description="Job ID that was cancelled") - cancelled_at: datetime = Field(..., description="Timestamp when the job was cancelled") - message: str = Field(..., description="Status message") - - class Config: - json_schema_extra = { - "example": { - "success": True, - "job_id": "550e8400-e29b-41d4-a716-446655440001", - "cancelled_at": "2025-01-11T15:30:00", - "message": "Job anulat cu succes" - } - } - - -class CancelBatchResponse(BaseModel): - """Response schema for cancel batch endpoint.""" - - success: bool = Field(..., description="Whether any jobs were cancelled") - batch_id: int = Field(..., description="Batch ID that was cancelled") - cancelled_count: int = Field(..., description="Number of jobs successfully cancelled") - skipped_count: int = Field(..., description="Number of jobs skipped (completed/failed)") - message: str = Field(..., description="Status message") - - class Config: - json_schema_extra = { - "example": { - "success": True, - "batch_id": 1, - "cancelled_count": 3, - "skipped_count": 2, - "message": "3 job-uri anulate, 2 ignorate (deja procesate)" - } - } diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/schemas/ocr.py b/deploy-package-20260223-151231/backend/modules/data_entry/schemas/ocr.py deleted file mode 100644 index 352c514..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/schemas/ocr.py +++ /dev/null @@ -1,243 +0,0 @@ -"""Pydantic schemas for OCR API.""" - -from datetime import date -from decimal import Decimal -from typing import Optional, List - -from pydantic import BaseModel, Field - - -class TvaEntry(BaseModel): - """Single TVA entry with code, percentage and amount.""" - code: Optional[str] = Field(default=None, description="TVA code: A, B, C, D") - percent: int = Field(description="TVA percentage: 0, 5, 9, 19, 21") - amount: Decimal = Field(description="TVA amount for this rate") - - -class PaymentMethod(BaseModel): - """Payment method entry from OCR.""" - method: str = Field(description="CARD or NUMERAR") - amount: Decimal = Field(description="Amount paid") - - -class ValidationWarning(BaseModel): - """Validation warning from OCR extraction.""" - field: str = Field(description="Field name (e.g., 'amount', 'tva_total')") - rule: str = Field(description="Rule name (e.g., 'amount_range', 'tva_ratio')") - message: str = Field(description="Human-readable warning message") - severity: str = Field(description="Severity: 'info', 'warning', 'error'") - suggested_value: Optional[str] = Field(default=None, description="Suggested corrected value") - - -class ExtractionData(BaseModel): - """Extracted receipt data from OCR.""" - - receipt_type: str = Field(default='bon_fiscal', description="Receipt type: bon_fiscal or chitanta") - receipt_number: Optional[str] = Field(default=None, description="Receipt number") - receipt_series: Optional[str] = Field(default=None, description="Receipt series") - receipt_date: Optional[date] = Field(default=None, description="Receipt date") - amount: Optional[Decimal] = Field(default=None, description="Total amount") - partner_name: Optional[str] = Field(default=None, description="Vendor/partner name") - cui: Optional[str] = Field(default=None, description="CUI (fiscal identification code)") - description: Optional[str] = Field(default=None, description="Optional description") - - # Additional extracted fields - Multiple TVA entries support - tva_entries: List[TvaEntry] = Field(default=[], description="List of TVA entries by rate (A, B, C, D)") - tva_total: Optional[Decimal] = Field(default=None, description="Total TVA amount") - address: Optional[str] = Field(default=None, description="Vendor address") - items_count: Optional[int] = Field(default=None, description="Number of items/articles") - - # Payment methods extracted from receipt - payment_methods: List[PaymentMethod] = Field(default=[], description="Payment methods from receipt (CARD, NUMERAR)") - suggested_payment_mode: Optional[str] = Field(default=None, description="Auto-suggested payment mode based on OCR (casa/banca)") - - # Client data (for B2B receipts - buyer information) - client_name: Optional[str] = Field(default=None, description="Client/customer company name") - client_cui: Optional[str] = Field(default=None, description="Client CUI/CIF fiscal code") - client_address: Optional[str] = Field(default=None, description="Client address") - - confidence_amount: float = Field(default=0.0, ge=0, le=1, description="Amount extraction confidence") - confidence_date: float = Field(default=0.0, ge=0, le=1, description="Date extraction confidence") - confidence_vendor: float = Field(default=0.0, ge=0, le=1, description="Vendor extraction confidence") - confidence_client: float = Field(default=0.0, ge=0, le=1, description="Client extraction confidence") - confidence_tva: float = Field(default=0.0, ge=0, le=1, description="TVA extraction confidence") - confidence_payment: float = Field(default=0.0, ge=0, le=1, description="Payment extraction confidence") - overall_confidence: float = Field(default=0.0, ge=0, le=1, description="Overall confidence score") - raw_text: str = Field(default="", description="Raw OCR text (primary)") - raw_texts: List[str] = Field(default=[], description="Raw OCR texts from all engine passes (for analysis)") - ocr_engine: str = Field(default="", description="OCR engine used: paddleocr or tesseract") - processing_time_ms: int = Field(default=0, ge=0, description="Processing time in milliseconds") - - # Validation results (added by bon-ocr-validation feature) - # needs_manual_review: None = not validated yet (old receipts), False = no review needed, True = needs review - needs_manual_review: Optional[bool] = Field(default=None, description="Flag for supervisor review (None=not validated, False=ok, True=needs review)") - validation_warnings: List[str] = Field(default=[], description="Validation warnings") - validation_errors: List[str] = Field(default=[], description="Validation errors") - inter_ocr_ratios: dict[str, float] = Field(default={}, description="Inter-OCR consistency ratios") - - class Config: - """Pydantic config.""" - json_schema_extra = { - "example": { - "receipt_type": "bon_fiscal", - "receipt_number": "1360760", - "receipt_series": "0146", - "receipt_date": "2025-10-11", - "amount": 186.16, - "partner_name": "FIVE-HOLDING S.A.", - "cui": "10562600", - "description": None, - "tva_entries": [ - {"code": "A", "percent": 19, "amount": 25.00}, - {"code": "B", "percent": 9, "amount": 7.31} - ], - "tva_total": 32.31, - "address": "JUD. CONSTANTA, MUN. CONSTANTA, STR. ION ROATA NR. 3", - "items_count": 17, - "confidence_amount": 0.98, - "confidence_date": 0.98, - "confidence_vendor": 0.95, - "overall_confidence": 0.97, - "raw_text": "FIVE-HOLDING S.A.\nCIF: RO10562600\n..." - } - } - - -class OCRResponse(BaseModel): - """OCR API response.""" - - success: bool = Field(description="Whether OCR processing was successful") - message: str = Field(description="Status message") - data: Optional[ExtractionData] = Field(default=None, description="Extracted data") - - class Config: - """Pydantic config.""" - json_schema_extra = { - "example": { - "success": True, - "message": "OCR processing successful. Found: amount, date, vendor", - "data": { - "receipt_type": "bon_fiscal", - "receipt_number": "12345", - "receipt_date": "2024-01-15", - "amount": 125.50, - "partner_name": "MEGA IMAGE SRL", - "cui": "12345678", - "confidence_amount": 0.95, - "confidence_date": 0.90, - "confidence_vendor": 0.75, - "overall_confidence": 0.87, - "raw_text": "BON FISCAL\nMEGA IMAGE SRL\n..." - } - } - } - - -class OCRStatusResponse(BaseModel): - """OCR service status response.""" - - available: bool = Field(description="Whether OCR service is available") - engines: list[str] = Field(description="Available OCR engines") - message: str = Field(description="Status message") - - -# ============================================================================ -# Job Queue Schemas (for async OCR processing) -# ============================================================================ - -from datetime import datetime -from enum import Enum - - -class OCREngineChoice(str, Enum): - """OCR engine selection options.""" - tesseract = "tesseract" - doctr = "doctr" # 3.3x faster than PaddleOCR with same accuracy (90/100) - doctr_plus = "doctr_plus" # docTR with 2-tier sequential processing + early exit (optimized, recommended) - paddleocr = "paddleocr" - - -class OCRJobStatus(str, Enum): - """OCR job status.""" - pending = "pending" - processing = "processing" - completed = "completed" - failed = "failed" - - -class OCRJobSubmitResponse(BaseModel): - """Response when submitting an OCR job.""" - - job_id: str = Field(description="Unique job identifier (UUID)") - status: OCRJobStatus = Field(description="Initial job status (pending)") - queue_position: int = Field(description="Position in queue (1 = next to process)") - estimated_wait_seconds: int = Field(description="Estimated wait time in seconds") - created_at: datetime = Field(description="Job creation timestamp") - - class Config: - """Pydantic config.""" - json_schema_extra = { - "example": { - "job_id": "abc123-def456-ghi789", - "status": "pending", - "queue_position": 3, - "estimated_wait_seconds": 21, - "created_at": "2024-01-15T12:00:00" - } - } - - -class OCRJobResponse(BaseModel): - """Full OCR job status response.""" - - job_id: str = Field(description="Unique job identifier") - status: OCRJobStatus = Field(description="Current job status") - queue_position: Optional[int] = Field(default=None, description="Queue position (None if processing/completed)") - estimated_wait_seconds: Optional[int] = Field(default=None, description="Estimated wait time") - created_at: datetime = Field(description="Job creation timestamp") - started_at: Optional[datetime] = Field(default=None, description="Processing start timestamp") - completed_at: Optional[datetime] = Field(default=None, description="Completion timestamp") - # Detailed timing breakdown - queue_wait_ms: Optional[int] = Field(default=None, description="Time waiting in queue (started_at - created_at)") - ocr_time_ms: Optional[int] = Field(default=None, description="Actual OCR engine processing time") - processing_time_ms: Optional[int] = Field(default=None, description="Total job processing time (completed_at - started_at)") - result: Optional[ExtractionData] = Field(default=None, description="Extraction result (only if completed)") - error: Optional[str] = Field(default=None, description="Error message (only if failed)") - - class Config: - """Pydantic config.""" - json_schema_extra = { - "example": { - "job_id": "abc123-def456-ghi789", - "status": "completed", - "queue_position": None, - "estimated_wait_seconds": 0, - "created_at": "2024-01-15T12:00:00", - "started_at": "2024-01-15T12:00:21", - "completed_at": "2024-01-15T12:00:28", - "processing_time_ms": 6543, - "result": { - "receipt_number": "123", - "amount": 85.99, - "ocr_engine": "paddleocr-light" - } - } - } - - -class OCRQueueStatusResponse(BaseModel): - """Queue statistics response.""" - - pending_jobs: int = Field(description="Number of jobs waiting in queue") - processing_jobs: int = Field(description="Number of jobs currently processing") - average_time_seconds: float = Field(description="Average processing time in seconds") - - class Config: - """Pydantic config.""" - json_schema_extra = { - "example": { - "pending_jobs": 5, - "processing_jobs": 1, - "average_time_seconds": 7.2 - } - } diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/schemas/receipt.py b/deploy-package-20260223-151231/backend/modules/data_entry/schemas/receipt.py deleted file mode 100644 index af77bf4..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/schemas/receipt.py +++ /dev/null @@ -1,311 +0,0 @@ -"""Pydantic schemas for receipts API.""" - -import json -from datetime import datetime, date -from decimal import Decimal -from typing import Optional, List, Any, Union -from pydantic import BaseModel, Field, ConfigDict, field_validator - -from backend.modules.data_entry.db.models.receipt import ReceiptType, ReceiptDirection, ReceiptStatus, ProcessingStatus -from backend.modules.data_entry.db.models.accounting_entry import EntryType - - -# ============ Accounting Entry Schemas ============ - -class AccountingEntryBase(BaseModel): - """Base schema for accounting entry.""" - entry_type: EntryType - account_code: str = Field(max_length=20) - account_name: Optional[str] = Field(default=None, max_length=200) - amount: Decimal - partner_id: Optional[int] = None - cost_center_id: Optional[int] = None - - -class AccountingEntryCreate(AccountingEntryBase): - """Schema for creating an accounting entry.""" - pass - - -class AccountingEntryUpdate(BaseModel): - """Schema for updating an accounting entry.""" - entry_type: Optional[EntryType] = None - account_code: Optional[str] = Field(default=None, max_length=20) - account_name: Optional[str] = Field(default=None, max_length=200) - amount: Optional[Decimal] = None - partner_id: Optional[int] = None - cost_center_id: Optional[int] = None - - -class AccountingEntryResponse(AccountingEntryBase): - """Schema for accounting entry response.""" - model_config = ConfigDict(from_attributes=True) - - id: int - receipt_id: int - is_auto_generated: bool - modified_by: Optional[str] = None - modified_at: Optional[datetime] = None - sort_order: int - - -# ============ Attachment Schemas ============ - -class AttachmentResponse(BaseModel): - """Schema for attachment response.""" - model_config = ConfigDict(from_attributes=True) - - id: int - receipt_id: int - filename: str - stored_filename: str - file_path: str - file_size: int - mime_type: str - uploaded_at: datetime - - -# ============ TVA Schema ============ - -class TvaEntrySchema(BaseModel): - """Single TVA entry with code, percentage and amount.""" - code: Optional[str] = Field(default=None, description="TVA code: A, B, C, D") - percent: int = Field(description="TVA percentage: 0, 5, 9, 19, 21") - amount: Decimal = Field(description="TVA amount for this rate") - - -class PaymentMethodSchema(BaseModel): - """Payment method entry (CARD/NUMERAR).""" - method: str = Field(description="Payment method: CARD or NUMERAR") - amount: Decimal = Field(description="Amount paid with this method") - - -# ============ Receipt Schemas ============ - -class ReceiptBase(BaseModel): - """Base schema for receipt.""" - receipt_type: ReceiptType = ReceiptType.BON_FISCAL - direction: ReceiptDirection = ReceiptDirection.CHELTUIALA - receipt_number: Optional[str] = Field(default=None, max_length=50) - receipt_series: Optional[str] = Field(default=None, max_length=20) - receipt_date: date - amount: Decimal = Field(gt=0) - description: Optional[str] = Field(default=None, max_length=500) - # TVA info (multiple entries support) - tva_breakdown: Optional[List[TvaEntrySchema]] = Field(default=None, description="List of TVA entries") - tva_total: Optional[Decimal] = Field(default=None, description="Total TVA amount") - items_count: Optional[int] = Field(default=None, description="Number of items") - vendor_address: Optional[str] = Field(default=None, max_length=500, description="Vendor address") - # Other fields - expense_type_code: Optional[str] = Field(default=None, max_length=20) - company_id: int - # partner_id removed - supplier data is text-only (partner_name, cui) - partner_name: Optional[str] = Field(default=None, max_length=200) - cui: Optional[str] = Field(default=None, max_length=20, description="Fiscal code (CUI) from OCR") - ocr_raw_text: Optional[str] = Field(default=None, description="Raw OCR text for debugging") - payment_methods: Optional[List[PaymentMethodSchema]] = Field(default=None, description="Payment methods from OCR") - cash_register_id: Optional[int] = None - cash_register_name: Optional[str] = Field(default=None, max_length=100) - cash_register_account: Optional[str] = Field(default=None, max_length=20) - payment_mode: Optional[str] = Field(default=None, description="Payment mode: casa/banca/avans_decontare") - - -class ReceiptCreate(ReceiptBase): - """Schema for creating a receipt.""" - pass - - -class ReceiptUpdate(BaseModel): - """Schema for updating a receipt (DRAFT only).""" - receipt_type: Optional[ReceiptType] = None - direction: Optional[ReceiptDirection] = None - receipt_number: Optional[str] = Field(default=None, max_length=50) - receipt_series: Optional[str] = Field(default=None, max_length=20) - receipt_date: Optional[date] = None - amount: Optional[Decimal] = Field(default=None, gt=0) - description: Optional[str] = Field(default=None, max_length=500) - # TVA info (multiple entries support) - tva_breakdown: Optional[List[TvaEntrySchema]] = Field(default=None, description="List of TVA entries") - tva_total: Optional[Decimal] = Field(default=None, description="Total TVA amount") - items_count: Optional[int] = Field(default=None, description="Number of items") - vendor_address: Optional[str] = Field(default=None, max_length=500, description="Vendor address") - # Other fields - expense_type_code: Optional[str] = Field(default=None, max_length=20) - # partner_id removed - supplier data is text-only (partner_name, cui) - partner_name: Optional[str] = Field(default=None, max_length=200) - cui: Optional[str] = Field(default=None, max_length=20, description="Fiscal code (CUI) from OCR") - ocr_raw_text: Optional[str] = Field(default=None, description="Raw OCR text for debugging") - payment_methods: Optional[List[PaymentMethodSchema]] = Field(default=None, description="Payment methods from OCR") - cash_register_id: Optional[int] = None - cash_register_name: Optional[str] = Field(default=None, max_length=100) - cash_register_account: Optional[str] = Field(default=None, max_length=20) - payment_mode: Optional[str] = Field(default=None, description="Payment mode: casa/banca/avans_decontare") - - -class ReceiptResponse(ReceiptBase): - """Schema for receipt response with all fields.""" - model_config = ConfigDict(from_attributes=True) - - id: int - # Override amount to allow zero values in response (validation is on input, not output) - amount: Decimal - status: ReceiptStatus - created_by: str - created_at: datetime - updated_at: datetime - submitted_at: Optional[datetime] = None - reviewed_by: Optional[str] = None - reviewed_at: Optional[datetime] = None - rejection_reason: Optional[str] = None - oracle_synced_at: Optional[datetime] = None - oracle_act_id: Optional[int] = None - oracle_error: Optional[str] = None - - # Bulk upload batch tracking (US-012) - batch_id: Optional[str] = None - processing_status: Optional[str] = None - processing_error: Optional[str] = None - file_hash: Optional[str] = None - processing_started_at: Optional[datetime] = None - processing_completed_at: Optional[datetime] = None - - # Relationships (optional, loaded when needed) - attachments: List[AttachmentResponse] = [] - entries: List[AccountingEntryResponse] = [] - - @field_validator('tva_breakdown', mode='before') - @classmethod - def parse_tva_breakdown(cls, v: Any) -> Optional[List[dict]]: - """Deserialize tva_breakdown from JSON string if needed.""" - if v is None: - return None - if isinstance(v, str): - try: - return json.loads(v) - except (json.JSONDecodeError, TypeError): - return None - if isinstance(v, list): - return v - return None - - @field_validator('payment_methods', mode='before') - @classmethod - def parse_payment_methods(cls, v: Any) -> Optional[List[dict]]: - """Deserialize payment_methods from JSON string if needed.""" - if v is None: - return None - if isinstance(v, str): - try: - return json.loads(v) - except (json.JSONDecodeError, TypeError): - return None - if isinstance(v, list): - return v - return None - - -class ProcessingStats(BaseModel): - """Statistics for bulk upload processing status (US-012).""" - pending_count: int = 0 - processing_count: int = 0 - completed_count: int = 0 - failed_count: int = 0 - - -class ReceiptListResponse(BaseModel): - """Schema for paginated receipt list response.""" - items: List[ReceiptResponse] - total: int - page: int - page_size: int - pages: int - # Processing stats for bulk upload filtering (US-012) - processing_stats: Optional[ProcessingStats] = None - - -class ReceiptFilter(BaseModel): - """Schema for filtering receipts.""" - status: Optional[ReceiptStatus] = None - direction: Optional[ReceiptDirection] = None - company_id: Optional[int] = None - created_by: Optional[str] = None - date_from: Optional[date] = None - date_to: Optional[date] = None - search: Optional[str] = None # Search in description, partner_name - # Bulk upload filters (US-012) - processing_status: Optional[str] = None # ProcessingStatus enum value - batch_id: Optional[str] = None # Filter by batch_id - sort_by: Optional[str] = None # Sort field (e.g., "processing_started_at") - # Pagination - page: int = Field(default=1, ge=1) - page_size: int = Field(default=20, ge=1, le=100) - - -# ============ Workflow Schemas ============ - -class WorkflowAction(BaseModel): - """Schema for workflow action response.""" - success: bool - message: str - receipt: Optional[ReceiptResponse] = None - - -class RejectRequest(BaseModel): - """Schema for rejection request.""" - reason: str = Field(min_length=5, max_length=500) - - -class EntriesUpdateRequest(BaseModel): - """Schema for bulk updating accounting entries.""" - entries: List[AccountingEntryCreate] - - -# ============ Nomenclature Schemas ============ - -class PartnerOption(BaseModel): - """Schema for partner dropdown option (used for autocomplete assistance).""" - name: str - fiscal_code: Optional[str] = None - address: Optional[str] = None - source: str = "oracle" # 'oracle' (synced) or 'local' - - -class AccountOption(BaseModel): - """Schema for account dropdown option.""" - code: str - name: str - - -class CashRegisterOption(BaseModel): - """Schema for cash register dropdown option.""" - id: int - name: str - account_code: str # 5311, 5121, etc. - - -class ExpenseTypeOption(BaseModel): - """Schema for expense type dropdown option.""" - code: str - name: str - account_code: str - has_vat: bool - vat_percent: Decimal = Decimal("19") - - -# ============ Bulk Delete Schemas (US-024) ============ - -class BulkDeleteRequest(BaseModel): - """Request schema for bulk delete endpoint.""" - ids: List[int] = Field(..., min_length=1, description="List of receipt IDs to delete") - - -class BulkDeleteFailure(BaseModel): - """Schema for a single failed deletion.""" - id: int - error: str - - -class BulkDeleteResponse(BaseModel): - """Response schema for bulk delete with partial success support.""" - deleted: List[int] = Field(default_factory=list, description="IDs of successfully deleted receipts") - failed: List[BulkDeleteFailure] = Field(default_factory=list, description="IDs that failed with error messages") diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/__init__.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/__init__.py deleted file mode 100644 index 744d6e1..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -# Business logic services -from .receipt_service import ReceiptService -from .nomenclature_service import NomenclatureService -from .expense_types import EXPENSE_TYPES, ExpenseType -from .receipt_auto_create import ReceiptAutoCreateService, ReceiptCreateResult -from . import sse_service - -__all__ = [ - "ReceiptService", - "NomenclatureService", - "EXPENSE_TYPES", - "ExpenseType", - "ReceiptAutoCreateService", - "ReceiptCreateResult", - "sse_service", -] diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/cleanup_service.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/cleanup_service.py deleted file mode 100644 index 301c360..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/cleanup_service.py +++ /dev/null @@ -1,215 +0,0 @@ -""" -Cleanup service for auto-deleting expired failed receipts. - -US-008: Backend - Auto-Cleanup Erori După 7 Zile -- Finds receipts with processing_status='failed' and processing_completed_at < now() - 7 days -- Deletes the receipts and their attached files from storage -- Runs at startup and then daily as a background task -""" - -import asyncio -import logging -from datetime import datetime, timedelta -from pathlib import Path -from typing import Optional - -from sqlalchemy import select, and_ -from sqlalchemy.ext.asyncio import AsyncSession -from sqlalchemy.orm import selectinload - -from backend.modules.data_entry.db.models.receipt import Receipt, ReceiptAttachment -from backend.modules.data_entry.config import settings - -logger = logging.getLogger(__name__) - -# Cleanup configuration -CLEANUP_RETENTION_DAYS = 7 -CLEANUP_INTERVAL_HOURS = 24 - -# In-memory storage for last cleanup stats (optional - for login notification) -_last_cleanup_stats: dict = { - "count": 0, - "timestamp": None -} - - -def get_last_cleanup_stats() -> dict: - """Get stats from the last cleanup run for notification purposes.""" - return _last_cleanup_stats.copy() - - -async def cleanup_expired_failed_receipts(session: AsyncSession) -> int: - """ - Find and delete receipts with processing_status='failed' older than 7 days. - - This function: - 1. Queries for failed receipts where processing_completed_at < now() - 7 days - 2. Deletes attachment files from disk - 3. Deletes the receipt records (cascade deletes attachment records) - - Args: - session: AsyncSession for database operations - - Returns: - Number of receipts deleted - """ - global _last_cleanup_stats - - cutoff_date = datetime.utcnow() - timedelta(days=CLEANUP_RETENTION_DAYS) - - # Find expired failed receipts with their attachments - query = select(Receipt).options( - selectinload(Receipt.attachments) - ).where( - and_( - Receipt.processing_status == "failed", - Receipt.processing_completed_at.isnot(None), - Receipt.processing_completed_at < cutoff_date - ) - ) - - result = await session.execute(query) - expired_receipts = result.scalars().all() - - if not expired_receipts: - logger.debug("[Cleanup] No expired failed receipts found") - return 0 - - deleted_count = 0 - deleted_files = 0 - - upload_base_path = settings.upload_path_resolved - - for receipt in expired_receipts: - try: - # Delete attachment files from disk - for attachment in receipt.attachments: - file_path = upload_base_path / attachment.file_path - if file_path.exists(): - try: - file_path.unlink() - deleted_files += 1 - logger.debug(f"[Cleanup] Deleted file: {file_path}") - except OSError as e: - logger.warning(f"[Cleanup] Failed to delete file {file_path}: {e}") - - # Also try to clean up empty parent directories - parent_dir = file_path.parent - if parent_dir.exists() and parent_dir != upload_base_path: - try: - # Only remove if directory is empty - if not any(parent_dir.iterdir()): - parent_dir.rmdir() - logger.debug(f"[Cleanup] Removed empty directory: {parent_dir}") - except OSError: - pass # Directory not empty or permission issue, skip - - # Delete receipt (cascade deletes attachment records in DB) - await session.delete(receipt) - deleted_count += 1 - - except Exception as e: - logger.error(f"[Cleanup] Error deleting receipt {receipt.id}: {e}") - continue - - # Commit all deletions - if deleted_count > 0: - await session.commit() - - # Update stats for notification - _last_cleanup_stats = { - "count": deleted_count, - "files_deleted": deleted_files, - "timestamp": datetime.utcnow().isoformat() - } - - logger.info(f"[Cleanup] Cleaned up {deleted_count} expired failed receipts ({deleted_files} files)") - - return deleted_count - - -async def run_cleanup_task(get_session_func) -> None: - """ - Background task that runs cleanup at startup and then every 24 hours. - - Args: - get_session_func: Async generator function that yields database sessions - """ - logger.info("[Cleanup] Starting cleanup background task") - - # Run immediately at startup - try: - async for session in get_session_func(): - count = await cleanup_expired_failed_receipts(session) - if count > 0: - logger.info(f"[Cleanup] Initial cleanup: {count} receipts removed") - break - except Exception as e: - logger.error(f"[Cleanup] Initial cleanup failed: {e}") - - # Then run every 24 hours - while True: - try: - await asyncio.sleep(CLEANUP_INTERVAL_HOURS * 3600) - - async for session in get_session_func(): - count = await cleanup_expired_failed_receipts(session) - if count > 0: - logger.info(f"[Cleanup] Daily cleanup: {count} receipts removed") - break - - except asyncio.CancelledError: - logger.info("[Cleanup] Cleanup task cancelled") - raise - except Exception as e: - logger.error(f"[Cleanup] Daily cleanup failed: {e}") - # Continue running even if one cleanup fails - - -# Global reference to cleanup task for graceful shutdown -_cleanup_task: Optional[asyncio.Task] = None - - -async def start_cleanup_task(get_session_func) -> bool: - """ - Start the cleanup background task. - - Args: - get_session_func: Async generator function that yields database sessions - - Returns: - True if task started successfully, False otherwise - """ - global _cleanup_task - - if _cleanup_task is not None and not _cleanup_task.done(): - logger.warning("[Cleanup] Cleanup task already running") - return False - - try: - _cleanup_task = asyncio.create_task(run_cleanup_task(get_session_func)) - logger.info("[Cleanup] ✅ Cleanup background task started") - return True - except Exception as e: - logger.error(f"[Cleanup] Failed to start cleanup task: {e}") - return False - - -async def stop_cleanup_task() -> None: - """Stop the cleanup background task gracefully.""" - global _cleanup_task - - if _cleanup_task is not None and not _cleanup_task.done(): - _cleanup_task.cancel() - try: - await _cleanup_task - except asyncio.CancelledError: - pass - logger.info("[Cleanup] Cleanup task stopped") - - _cleanup_task = None - - -def is_cleanup_task_running() -> bool: - """Check if the cleanup task is currently running.""" - return _cleanup_task is not None and not _cleanup_task.done() diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/expense_types.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/expense_types.py deleted file mode 100644 index fcb238e..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/expense_types.py +++ /dev/null @@ -1,101 +0,0 @@ -"""Predefined expense types for automatic accounting entry generation.""" - -from decimal import Decimal -from dataclasses import dataclass -from typing import Dict, Optional - - -@dataclass -class ExpenseType: - """Expense type definition with accounting configuration.""" - code: str - name: str - account_code: str - account_name: str - has_vat: bool - vat_percent: Decimal = Decimal("19") - vat_account: str = "4426" - - -# Predefined expense types -EXPENSE_TYPES: Dict[str, ExpenseType] = { - "FUEL": ExpenseType( - code="FUEL", - name="Combustibil", - account_code="6022", - account_name="Cheltuieli cu combustibilii", - has_vat=True, - ), - "MATERIALS": ExpenseType( - code="MATERIALS", - name="Materiale consumabile", - account_code="6028", - account_name="Alte cheltuieli cu materiale consumabile", - has_vat=True, - ), - "OFFICE": ExpenseType( - code="OFFICE", - name="Rechizite birou", - account_code="6024", - account_name="Cheltuieli privind materialele pentru ambalat", - has_vat=True, - ), - "PHONE": ExpenseType( - code="PHONE", - name="Telefonie / Internet", - account_code="626", - account_name="Cheltuieli postale si taxe de telecomunicatii", - has_vat=True, - ), - "PARKING": ExpenseType( - code="PARKING", - name="Parcare", - account_code="6022", - account_name="Cheltuieli cu combustibilii", - has_vat=True, - ), - "FOOD": ExpenseType( - code="FOOD", - name="Alimentatie", - account_code="6028", - account_name="Alte cheltuieli cu materiale consumabile", - has_vat=False, # No deductible VAT for food - ), - "TRANSPORT": ExpenseType( - code="TRANSPORT", - name="Transport", - account_code="624", - account_name="Cheltuieli cu transportul de bunuri si personal", - has_vat=True, - ), - "OTHER": ExpenseType( - code="OTHER", - name="Altele", - account_code="628", - account_name="Alte cheltuieli cu serviciile executate de terti", - has_vat=True, - ), -} - - -def get_expense_type(code: str) -> Optional[ExpenseType]: - """Get expense type by code.""" - return EXPENSE_TYPES.get(code) - - -def get_all_expense_types() -> Dict[str, ExpenseType]: - """Get all expense types.""" - return EXPENSE_TYPES.copy() - - -# Default cash register accounts -CASH_REGISTER_ACCOUNTS = { - "CASA": { - "code": "5311", - "name": "Casa in lei", - }, - "BANCA": { - "code": "5121", - "name": "Conturi la banci in lei", - }, -} diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/image_preprocessor.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/image_preprocessor.py deleted file mode 100644 index 26374a4..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/image_preprocessor.py +++ /dev/null @@ -1,366 +0,0 @@ -"""Image preprocessing for optimal OCR results.""" - -from pathlib import Path -from typing import List - -import numpy as np -import cv2 - -try: - import pdf2image - PDF_AVAILABLE = True -except ImportError: - PDF_AVAILABLE = False - - -class ImagePreprocessor: - """Preprocess receipt images for OCR.""" - - def _add_safety_padding(self, image: np.ndarray, padding: int = 50) -> np.ndarray: - """Add white padding around image to protect edge content during rotation. - - This prevents left/right margin truncation in OCR by ensuring text near - edges isn't lost during deskew rotation. - """ - if len(image.shape) == 2: - # Grayscale - return cv2.copyMakeBorder( - image, padding, padding, padding, padding, - cv2.BORDER_CONSTANT, value=255 - ) - else: - # Color (BGR) - return cv2.copyMakeBorder( - image, padding, padding, padding, padding, - cv2.BORDER_CONSTANT, value=(255, 255, 255) - ) - - def load_image(self, path: Path) -> np.ndarray: - """Load image from file.""" - image = cv2.imread(str(path)) - if image is None: - raise ValueError(f"Could not load image: {path}") - return image - - def pdf_to_images(self, path: Path, dpi: int = 300) -> List[np.ndarray]: - """ - Convert PDF to images. - - Args: - path: Path to PDF file - dpi: Resolution (300 = fast & good quality, 400 = better but slower) - """ - if not PDF_AVAILABLE: - raise RuntimeError("pdf2image not available. Install with: pip install pdf2image") - images = pdf2image.convert_from_path(str(path), dpi=dpi) - return [np.array(img) for img in images] - - def preprocess(self, image: np.ndarray, high_quality: bool = True) -> np.ndarray: - """ - Apply LIGHT preprocessing - better for clear PDFs. - Heavy binarization can destroy text on clear images. - """ - return self.preprocess_light(image) - - def preprocess_light(self, image: np.ndarray) -> np.ndarray: - """ - Light preprocessing for CLEAR images (PDFs, good scans). - Preserves original quality, only enhances contrast. - """ - # 0. Add safety padding to protect edge content during deskew rotation - image = self._add_safety_padding(image) - - # 1. Grayscale - if len(image.shape) == 3: - gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) - else: - gray = image.copy() - - # 2a. Scale DOWN if any side exceeds 4000px (PaddleOCR limit) - height, width = gray.shape - max_side = max(height, width) - if max_side > 4000: - scale = 4000 / max_side - gray = cv2.resize(gray, None, fx=scale, fy=scale, interpolation=cv2.INTER_AREA) - height, width = gray.shape - - # 2b. Scale UP if too small - if width < 1500: - scale = 1500 / width - # Ensure we don't exceed 4000px after upscaling - new_width = int(width * scale) - new_height = int(height * scale) - if max(new_width, new_height) > 4000: - scale = 4000 / max(new_width, new_height) - gray = cv2.resize(gray, None, fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC) - - # 3. Deskew - gray = self._deskew(gray) - - # 4. Light contrast enhancement only - clahe = cv2.createCLAHE(clipLimit=1.5, tileGridSize=(8, 8)) - enhanced = clahe.apply(gray) - - # NO binarization, NO morphological ops - preserve original quality - return enhanced - - def preprocess_medium(self, image: np.ndarray) -> np.ndarray: - """ - Medium preprocessing for MIXED-QUALITY images. - Balance between Light (too gentle) and Heavy (too aggressive). - - Use cases: - - Moderately faded receipts - - Photos with uneven lighting - - Scans with slight blur - - Preprocessing steps: - - Moderate contrast enhancement (CLAHE clipLimit=2.0) - - Light denoising (fastNlMeansDenoising h=6) - - Gentle sharpening - - NO binarization (preserves text boundaries) - - NO morphological operations (avoids digit concatenation) - - This method was created to replace preprocess_heavy() which caused - digit concatenation errors on high-quality PDFs (85.99 → 859,762.16). - """ - # 0. Add safety padding to protect edge content during deskew rotation - image = self._add_safety_padding(image) - - # 1. Grayscale - if len(image.shape) == 3: - gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) - else: - gray = image.copy() - - # 2a. Scale DOWN if any side exceeds 4000px (PaddleOCR limit) - height, width = gray.shape - max_side = max(height, width) - if max_side > 4000: - scale = 4000 / max_side - gray = cv2.resize(gray, None, fx=scale, fy=scale, interpolation=cv2.INTER_AREA) - height, width = gray.shape - - # 2b. Scale UP if too small - if width < 1500: - scale = 1500 / width - # Ensure we don't exceed 4000px after upscaling - new_width = int(width * scale) - new_height = int(height * scale) - if max(new_width, new_height) > 4000: - scale = 4000 / max(new_width, new_height) - gray = cv2.resize(gray, None, fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC) - - # 3. Deskew - gray = self._deskew(gray) - - # 4. Moderate contrast enhancement (CLAHE clipLimit=2.0) - clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) - enhanced = clahe.apply(gray) - - # 5. Light denoising (less aggressive than Heavy) - denoised = cv2.fastNlMeansDenoising(enhanced, h=6, templateWindowSize=7, searchWindowSize=15) - - # 6. Gentle sharpening - gaussian = cv2.GaussianBlur(denoised, (0, 0), 1.0) - sharpened = cv2.addWeighted(denoised, 1.3, gaussian, -0.3, 0) - - # NO binarization, NO morphological operations - # This preserves text boundaries and avoids digit concatenation - return sharpened - - def preprocess_heavy(self, image: np.ndarray) -> np.ndarray: - """ - Heavy preprocessing for FADED thermal receipts. - Aggressive binarization to recover faded text. - - ⚠️ DEPRECATED: Use preprocess_medium() instead. - Heavy preprocessing causes digit concatenation on clear PDFs - (e.g., 85.99 → 859,762.16 due to binarization + morphological operations). - Kept for backward compatibility only. - """ - # 0. Add safety padding to protect edge content during deskew rotation - image = self._add_safety_padding(image) - - # 1. Grayscale - if len(image.shape) == 3: - gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) - else: - gray = image.copy() - - # 2a. Scale DOWN if any side exceeds 4000px (PaddleOCR limit) - height, width = gray.shape - max_side = max(height, width) - if max_side > 4000: - scale = 4000 / max_side - gray = cv2.resize(gray, None, fx=scale, fy=scale, interpolation=cv2.INTER_AREA) - height, width = gray.shape - - # 2b. Scale UP if too small (larger = better OCR) - if width < 1500: - scale = 1500 / width - # Ensure we don't exceed 4000px after upscaling - new_width = int(width * scale) - new_height = int(height * scale) - if max(new_width, new_height) > 4000: - scale = 4000 / max(new_width, new_height) - gray = cv2.resize(gray, None, fx=scale, fy=scale, interpolation=cv2.INTER_CUBIC) - - # 3. Deskew - gray = self._deskew(gray) - - # 4. Contrast enhancement with CLAHE - clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) - enhanced = clahe.apply(gray) - - # 5. Denoise - denoised = cv2.fastNlMeansDenoising(enhanced, h=8, templateWindowSize=7, searchWindowSize=21) - - # 6. Sharpening - gaussian = cv2.GaussianBlur(denoised, (0, 0), 2.0) - sharpened = cv2.addWeighted(denoised, 1.5, gaussian, -0.5, 0) - - # 7. Adaptive thresholding (binarization) - binary = cv2.adaptiveThreshold( - sharpened, 255, - cv2.ADAPTIVE_THRESH_GAUSSIAN_C, - cv2.THRESH_BINARY, - blockSize=11, C=5 - ) - - # 8. Morphological operations - kernel_close = cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) - result = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel_close) - - return result - - def preprocess_for_tesseract(self, image: np.ndarray, binarize: bool = False, - padding: int = 0, clahe_clip: float = 1.5) -> np.ndarray: - """ - Tesseract-optimized preprocessing (based on comprehensive benchmark). - - BENCHMARK FINDINGS: - - DPI 200 is optimal (not 300!) - - Padding 40px fixes left margin truncation issues - - CLAHE 1.5 for most receipts, 2.0 for difficult ones - - NO deskew, NO denoising for clear PDFs - - Recommended usage: - - Simple receipts: padding=0, clahe_clip=1.5 - - Complex receipts: padding=40, clahe_clip=1.5 - - Difficult/faded: padding=40, clahe_clip=2.0, binarize=True - - Args: - image: Input image (RGB from pdf2image or BGR from OpenCV) - binarize: Apply Otsu binarization (for faded receipts) - padding: White padding in pixels (40px recommended for edge protection) - clahe_clip: CLAHE clip limit (1.5 normal, 2.0 for difficult) - - Returns: - Preprocessed grayscale image - """ - # 1. Grayscale (handle both RGB and BGR) - if len(image.shape) == 3: - gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) - else: - gray = image.copy() - - # 2. Add padding if specified (protects against left margin truncation) - if padding > 0: - gray = cv2.copyMakeBorder( - gray, padding, padding, padding, padding, - cv2.BORDER_CONSTANT, value=255 - ) - - # 3. CLAHE contrast enhancement - clahe = cv2.createCLAHE(clipLimit=clahe_clip, tileGridSize=(8, 8)) - enhanced = clahe.apply(gray) - - # NO deskew, NO denoising - these DEGRADE quality on clear PDFs! - - if not binarize: - return enhanced - - # Binarization only for faded receipts - _, binary = cv2.threshold(enhanced, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) - - # Ensure correct polarity - if np.mean(binary) < 127: - binary = 255 - binary - - return binary - - def preprocess_for_tesseract_padded(self, image: np.ndarray) -> np.ndarray: - """ - Tesseract preprocessing with optimal padding (40px). - - Best for complex receipts where left margin gets truncated. - """ - return self.preprocess_for_tesseract(image, padding=40) - - def preprocess_for_tesseract_faded(self, image: np.ndarray) -> np.ndarray: - """ - Tesseract preprocessing for FADED thermal receipts. - Uses binarization to recover faded text. - """ - return self.preprocess_for_tesseract(image, binarize=True) - - def get_all_variants(self, image: np.ndarray) -> List[np.ndarray]: - """ - Generate 2 preprocessing variants for OCR (fast mode). - Returns: [light_processed, heavy_processed] - """ - return [ - self.preprocess_light(image), - self.preprocess_heavy(image), - ] - - def _deskew(self, image: np.ndarray) -> np.ndarray: - """Correct image rotation/skew using Hough lines. - - Uses expanded canvas to preserve all content during rotation, - preventing left/right margin truncation. - """ - edges = cv2.Canny(image, 50, 150, apertureSize=3) - lines = cv2.HoughLinesP( - edges, 1, np.pi / 180, - threshold=100, minLineLength=100, maxLineGap=10 - ) - - if lines is None: - return image - - angles = [] - for line in lines: - x1, y1, x2, y2 = line[0] - angle = np.arctan2(y2 - y1, x2 - x1) * 180 / np.pi - if abs(angle) < 45: - angles.append(angle) - - if not angles: - return image - - median_angle = np.median(angles) - if abs(median_angle) < 0.5: - return image - - h, w = image.shape[:2] - center = (w // 2, h // 2) - M = cv2.getRotationMatrix2D(center, median_angle, 1.0) - - # Calculate new canvas size to fit entire rotated image (prevents edge truncation) - cos_angle = abs(np.cos(np.radians(median_angle))) - sin_angle = abs(np.sin(np.radians(median_angle))) - new_w = int(h * sin_angle + w * cos_angle) - new_h = int(h * cos_angle + w * sin_angle) - - # Adjust rotation matrix for new canvas center - M[0, 2] += (new_w - w) / 2 - M[1, 2] += (new_h - h) / 2 - - return cv2.warpAffine( - image, M, (new_w, new_h), - flags=cv2.INTER_CUBIC, - borderMode=cv2.BORDER_CONSTANT, - borderValue=255 # White background (grayscale) - ) diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/nomenclature_service.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/nomenclature_service.py deleted file mode 100644 index eb6c18f..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/nomenclature_service.py +++ /dev/null @@ -1,216 +0,0 @@ -"""Service for fetching nomenclatures from Oracle (read-only).""" - -from typing import List, Optional -from decimal import Decimal - -from sqlmodel import select -from sqlalchemy.ext.asyncio import AsyncSession - -from backend.modules.data_entry.schemas.receipt import ( - PartnerOption, - AccountOption, - CashRegisterOption, - ExpenseTypeOption, -) -from backend.modules.data_entry.services.expense_types import EXPENSE_TYPES -from backend.modules.data_entry.db.models.nomenclature import SyncedSupplier, LocalSupplier, SyncedCashRegister - - -class NomenclatureService: - """ - Service for fetching nomenclatures. - - In Phase 1 (MVP), some nomenclatures are hardcoded. - In Phase 2, these will be fetched from Oracle. - """ - - @staticmethod - async def get_partners( - company_id: int, - search: Optional[str] = None, - session: Optional[AsyncSession] = None - ) -> List[PartnerOption]: - """ - Get partners (suppliers/customers) for a company. - - Returns synced suppliers from Oracle + local suppliers created from OCR. - If no suppliers exist, returns empty list (frontend will trigger sync). - """ - partners = [] - - if not session: - return partners - - # Get synced suppliers from Oracle - stmt = select(SyncedSupplier).where(SyncedSupplier.company_id == company_id) - if search: - stmt = stmt.where( - (SyncedSupplier.name.ilike(f"%{search}%")) | - (SyncedSupplier.fiscal_code.ilike(f"%{search}%")) - ) - stmt = stmt.order_by(SyncedSupplier.name) - - result = await session.execute(stmt) - suppliers = result.scalars().all() - - for s in suppliers: - partners.append(PartnerOption( - name=s.name, - fiscal_code=s.fiscal_code, - address=s.address, - source="oracle" - )) - - # Always get local suppliers (not just when synced exist) - local_stmt = select(LocalSupplier).where(LocalSupplier.company_id == company_id) - if search: - local_stmt = local_stmt.where( - (LocalSupplier.name.ilike(f"%{search}%")) | - (LocalSupplier.fiscal_code.ilike(f"%{search}%")) - ) - local_stmt = local_stmt.order_by(LocalSupplier.name) - - local_result = await session.execute(local_stmt) - local_suppliers = local_result.scalars().all() - - for l in local_suppliers: - partners.append(PartnerOption( - name=l.name, - fiscal_code=l.fiscal_code, - address=l.address, - source="local" - )) - - return partners - - @staticmethod - async def get_accounts(company_id: int, prefix: Optional[str] = None) -> List[AccountOption]: - """ - Get chart of accounts for a company. - - Phase 1: Returns common expense/income accounts. - Phase 2: Will fetch from Oracle PLAN_CONTURI. - """ - # Common accounts for expenses and receipts - accounts = [ - # Expense accounts (Class 6) - AccountOption(code="6022", name="Cheltuieli cu combustibilii"), - AccountOption(code="6024", name="Cheltuieli materiale pentru ambalat"), - AccountOption(code="6028", name="Alte cheltuieli cu materiale consumabile"), - AccountOption(code="624", name="Cheltuieli cu transportul de bunuri si personal"), - AccountOption(code="626", name="Cheltuieli postale si taxe telecomunicatii"), - AccountOption(code="628", name="Alte cheltuieli cu serviciile executate de terti"), - - # VAT - AccountOption(code="4426", name="TVA deductibila"), - AccountOption(code="4427", name="TVA colectata"), - - # Cash and Bank (Class 5) - AccountOption(code="5311", name="Casa in lei"), - AccountOption(code="5121", name="Conturi la banci in lei"), - - # Income accounts (Class 7) - AccountOption(code="7588", name="Alte venituri din exploatare"), - ] - - if prefix: - accounts = [a for a in accounts if a.code.startswith(prefix)] - - return accounts - - @staticmethod - async def get_cash_registers( - company_id: int, - session: Optional[AsyncSession] = None - ) -> List[CashRegisterOption]: - """ - Get cash registers and bank accounts for a company. - - Phase 1: Returns default options. - Phase 2: Returns synced data from SQLite (from Oracle sync). - Phase 3: Will fetch live from Oracle NOM_CASE / NOM_BANCI. - """ - # If session is provided, try to get from synced SQLite data - if session: - stmt = select(SyncedCashRegister).where(SyncedCashRegister.company_id == company_id) - result = await session.execute(stmt) - registers = result.scalars().all() - - if registers: - return [ - CashRegisterOption(id=r.id, name=r.name, account_code=r.account_code) - for r in registers - ] - - # Fallback to default cash registers for Phase 1 - return [ - CashRegisterOption(id=1, name="Casa principala", account_code="5311"), - CashRegisterOption(id=2, name="Cont BCR", account_code="5121"), - CashRegisterOption(id=3, name="Cont BRD", account_code="5121"), - ] - - @staticmethod - async def get_expense_types() -> List[ExpenseTypeOption]: - """ - Get predefined expense types with their accounting configuration. - """ - return [ - ExpenseTypeOption( - code=et.code, - name=et.name, - account_code=et.account_code, - has_vat=et.has_vat, - vat_percent=et.vat_percent, - ) - for et in EXPENSE_TYPES.values() - ] - - @staticmethod - async def get_companies(username: str) -> List[dict]: - """ - Get companies accessible by user. - - Phase 1: Returns mock data. - Phase 2: Will fetch from shared auth based on user permissions. - """ - # TODO: Integrate with shared auth to get user's companies - return [ - {"id": 1, "name": "SC Test SRL", "cui": "RO12345678"}, - {"id": 2, "name": "SC Demo SA", "cui": "RO87654321"}, - ] - - # ============ Phase 2 Oracle Integration Methods ============ - - @staticmethod - async def _fetch_partners_oracle(company_id: int, search: Optional[str] = None) -> List[PartnerOption]: - """ - Fetch partners from Oracle NOM_PARTENERI. - - Will be implemented in Phase 2. - """ - # TODO: Implement using shared oracle_pool - # Example query: - # SELECT ID_PART, DEN_PART, COD_FISCAL - # FROM {schema}.NOM_PARTENERI - # WHERE DEN_PART LIKE :search - raise NotImplementedError("Oracle integration pending - Phase 2") - - @staticmethod - async def _fetch_accounts_oracle(company_id: int, prefix: Optional[str] = None) -> List[AccountOption]: - """ - Fetch chart of accounts from Oracle PLAN_CONTURI. - - Will be implemented in Phase 2. - """ - # TODO: Implement using shared oracle_pool - raise NotImplementedError("Oracle integration pending - Phase 2") - - @staticmethod - async def _fetch_cash_registers_oracle(company_id: int) -> List[CashRegisterOption]: - """ - Fetch cash registers from Oracle NOM_CASE / NOM_BANCI. - - Will be implemented in Phase 2. - """ - # TODO: Implement using shared oracle_pool - raise NotImplementedError("Oracle integration pending - Phase 2") diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/__init__.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/__init__.py deleted file mode 100644 index 2d0f1e1..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/__init__.py +++ /dev/null @@ -1,42 +0,0 @@ -""" -OCR Services Module - -Provides persistent OCR worker pool with job queue for efficient processing. - -Components: -- ocr_worker_pool: Manages ProcessPoolExecutor with persistent PaddleOCR -- job_queue: SQLite-based job queue for async processing -- job_worker: Background task that processes queued jobs -- tesseract_engine: Optimized Tesseract with multi-PSM and polarity fix - -Architecture: - FastAPI → job_queue.create_job() → SQLite - ↓ - job_worker loop → ocr_worker_pool.submit_task() → Worker Process - ↓ - PaddleOCR/Tesseract -""" - -from .ocr_worker_pool import ocr_worker_pool, OCRWorkerPool -from .job_queue import job_queue, OCRJobQueue, OCRJob, OCRJobStatus -from .job_worker import start_job_worker, stop_job_worker -from .tesseract_engine import TesseractEngine -from .validation import OCRValidationEngine - -__all__ = [ - # Worker pool - "ocr_worker_pool", - "OCRWorkerPool", - # Job queue - "job_queue", - "OCRJobQueue", - "OCRJob", - "OCRJobStatus", - # Job worker - "start_job_worker", - "stop_job_worker", - # Engines - "TesseractEngine", - # Validation - "OCRValidationEngine", -] diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/job_queue.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/job_queue.py deleted file mode 100644 index 1a8a260..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/job_queue.py +++ /dev/null @@ -1,653 +0,0 @@ -""" -SQLite Job Queue Manager for OCR Processing - -Provides async job queue for OCR requests: -- Jobs are stored in SQLite for persistence -- Queue position and time estimation -- Automatic expiration after 24 hours -- Statistics for monitoring - -Schema: - ocr_jobs ( - id TEXT PRIMARY KEY, -- UUID - status TEXT NOT NULL, -- pending, processing, completed, failed - file_path TEXT NOT NULL, -- Path to uploaded file - mime_type TEXT NOT NULL, - engine TEXT DEFAULT 'doctr_plus', - created_at TIMESTAMP, - started_at TIMESTAMP, - completed_at TIMESTAMP, - result_json TEXT, -- JSON extraction result - error_message TEXT, - processing_time_ms INTEGER, -- Total job time (started_at to completed_at) - ocr_time_ms INTEGER, -- Actual OCR engine processing time - created_by TEXT, -- Username - original_filename TEXT, - expires_at TIMESTAMP, - batch_id INTEGER, -- Foreign key to batch_uploads (for bulk processing) - file_hash TEXT -- SHA-256 hash for duplicate detection (US-007) - ) -""" - -import asyncio -import json -from decimal import Decimal - - -class DecimalEncoder(json.JSONEncoder): - """JSON encoder that handles Decimal types.""" - def default(self, obj): - if isinstance(obj, Decimal): - return float(obj) - return super().default(obj) -import logging -import os -import uuid -from dataclasses import dataclass, field -from datetime import datetime, timedelta -from enum import Enum -from pathlib import Path -from typing import Any, Dict, List, Optional - -import aiosqlite - -logger = logging.getLogger(__name__) - -# Default paths -DEFAULT_QUEUE_DIR = Path(__file__).parent.parent.parent.parent.parent / "data" / "ocr_queue" -DEFAULT_DB_PATH = DEFAULT_QUEUE_DIR / "ocr_jobs.db" -DEFAULT_FILES_DIR = DEFAULT_QUEUE_DIR / "files" - -# Job expiration -JOB_EXPIRY_HOURS = 24 - -# SQLite busy timeout (milliseconds) - prevents "database is locked" errors -SQLITE_BUSY_TIMEOUT_MS = 5000 - - -class OCRJobStatus(str, Enum): - """Job status enum.""" - pending = "pending" - processing = "processing" - completed = "completed" - failed = "failed" - cancelled = "cancelled" - - -@dataclass -class OCRJob: - """OCR Job data class.""" - id: str - status: OCRJobStatus - file_path: str - mime_type: str - engine: str = "doctr_plus" - created_at: Optional[datetime] = None - started_at: Optional[datetime] = None - completed_at: Optional[datetime] = None - result_json: Optional[str] = None - error_message: Optional[str] = None - processing_time_ms: Optional[int] = None # Total job time (started_at to completed_at) - ocr_time_ms: Optional[int] = None # Actual OCR engine processing time - created_by: Optional[str] = None - original_filename: Optional[str] = None - expires_at: Optional[datetime] = None - batch_id: Optional[int] = None # Links to batch_uploads table for bulk processing - file_hash: Optional[str] = None # SHA-256 hash for duplicate detection (US-007) - - @property - def queue_wait_ms(self) -> Optional[int]: - """Calculate queue wait time (created_at to started_at).""" - if self.created_at and self.started_at: - delta = self.started_at - self.created_at - return int(delta.total_seconds() * 1000) - return None - - @property - def result(self) -> Optional[Dict]: - """Parse result_json to dict.""" - if self.result_json: - try: - return json.loads(self.result_json) - except json.JSONDecodeError: - return None - return None - - -class OCRJobQueue: - """ - SQLite-based job queue for OCR processing. - - Provides async methods for job management with position - tracking and time estimation. - """ - - def __init__( - self, - db_path: Optional[Path] = None, - files_dir: Optional[Path] = None - ): - """ - Initialize job queue. - - Args: - db_path: Path to SQLite database (default: data/ocr_queue/ocr_jobs.db) - files_dir: Path to files directory (default: data/ocr_queue/files/) - """ - self.db_path = Path(db_path) if db_path else DEFAULT_DB_PATH - self.files_dir = Path(files_dir) if files_dir else DEFAULT_FILES_DIR - self._lock = asyncio.Lock() - self._initialized = False - - async def initialize(self) -> None: - """ - Initialize database and directories. - - Creates SQLite database and tables if they don't exist. - Creates files directory for uploaded files. - """ - if self._initialized: - return - - # Create directories - self.db_path.parent.mkdir(parents=True, exist_ok=True) - self.files_dir.mkdir(parents=True, exist_ok=True) - - # Create database and tables - async with aiosqlite.connect(str(self.db_path)) as db: - # Enable WAL mode for better concurrency and set busy timeout - await db.execute("PRAGMA journal_mode=WAL") - await db.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - - await db.execute(''' - CREATE TABLE IF NOT EXISTS ocr_jobs ( - id TEXT PRIMARY KEY, - status TEXT NOT NULL DEFAULT 'pending', - file_path TEXT NOT NULL, - mime_type TEXT NOT NULL, - engine TEXT DEFAULT 'doctr_plus', - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - started_at TIMESTAMP, - completed_at TIMESTAMP, - result_json TEXT, - error_message TEXT, - processing_time_ms INTEGER, - ocr_time_ms INTEGER, - created_by TEXT, - original_filename TEXT, - expires_at TIMESTAMP, - batch_id INTEGER - ) - ''') - - # Migration: add ocr_time_ms column if it doesn't exist - try: - await db.execute('ALTER TABLE ocr_jobs ADD COLUMN ocr_time_ms INTEGER') - logger.info("[OCRJobQueue] Added ocr_time_ms column to existing table") - except Exception: - pass # Column already exists - - # Migration: add batch_id column if it doesn't exist - try: - await db.execute('ALTER TABLE ocr_jobs ADD COLUMN batch_id INTEGER') - logger.info("[OCRJobQueue] Added batch_id column to existing table") - except Exception: - pass # Column already exists - - # Migration: add file_hash column if it doesn't exist (US-007) - try: - await db.execute('ALTER TABLE ocr_jobs ADD COLUMN file_hash TEXT') - logger.info("[OCRJobQueue] Added file_hash column to existing table") - except Exception: - pass # Column already exists - - # Index for efficient queue queries - await db.execute(''' - CREATE INDEX IF NOT EXISTS idx_ocr_jobs_status - ON ocr_jobs(status, created_at) - ''') - - # Index for expiration cleanup - await db.execute(''' - CREATE INDEX IF NOT EXISTS idx_ocr_jobs_expires - ON ocr_jobs(expires_at) - ''') - - await db.commit() - - self._initialized = True - logger.info(f"[OCRJobQueue] Initialized: db={self.db_path}, files={self.files_dir}") - - async def create_job( - self, - file_bytes: bytes, - mime_type: str, - engine: str = "doctr_plus", - username: Optional[str] = None, - original_filename: Optional[str] = None, - batch_id: Optional[int] = None, - file_hash: Optional[str] = None - ) -> OCRJob: - """ - Create a new OCR job. - - Saves file to disk and creates database record. - - Args: - file_bytes: Raw file bytes - mime_type: MIME type of file - engine: OCR engine ('tesseract', 'doctr', 'doctr_plus', 'paddleocr') - username: Username of requester - original_filename: Original filename from upload - batch_id: Optional batch ID for bulk upload processing - file_hash: Optional SHA-256 hash for duplicate detection (US-007) - - Returns: - Created OCRJob instance - """ - await self.initialize() - - # Generate job ID - job_id = str(uuid.uuid4()) - - # Determine file extension - ext_map = { - 'image/jpeg': '.jpg', - 'image/png': '.png', - 'application/pdf': '.pdf', - } - ext = ext_map.get(mime_type, '.bin') - - # Save file - file_path = self.files_dir / f"{job_id}{ext}" - with open(file_path, 'wb') as f: - f.write(file_bytes) - - # Calculate expiration - now = datetime.utcnow() - expires_at = now + timedelta(hours=JOB_EXPIRY_HOURS) - - # Insert job record - async with aiosqlite.connect(str(self.db_path)) as db: - await db.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - await db.execute(''' - INSERT INTO ocr_jobs ( - id, status, file_path, mime_type, engine, - created_at, created_by, original_filename, expires_at, batch_id, file_hash - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - ''', ( - job_id, OCRJobStatus.pending.value, str(file_path), mime_type, engine, - now.isoformat(), username, original_filename, expires_at.isoformat(), batch_id, file_hash - )) - await db.commit() - - logger.info(f"[OCRJobQueue] Created job {job_id}: engine={engine}, file={file_path.name}, batch_id={batch_id}") - - return OCRJob( - id=job_id, - status=OCRJobStatus.pending, - file_path=str(file_path), - mime_type=mime_type, - engine=engine, - created_at=now, - created_by=username, - original_filename=original_filename, - expires_at=expires_at, - batch_id=batch_id, - file_hash=file_hash - ) - - async def get_job(self, job_id: str) -> Optional[OCRJob]: - """ - Get job by ID. - - Args: - job_id: Job UUID - - Returns: - OCRJob or None if not found - """ - await self.initialize() - - async with aiosqlite.connect(str(self.db_path)) as db: - await db.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - db.row_factory = aiosqlite.Row - async with db.execute( - 'SELECT * FROM ocr_jobs WHERE id = ?', - (job_id,) - ) as cursor: - row = await cursor.fetchone() - if row: - return self._row_to_job(row) - return None - - async def get_queue_position(self, job_id: str) -> Optional[int]: - """ - Get position in queue for a pending job. - - Args: - job_id: Job UUID - - Returns: - Queue position (1 = next to process) or None if not pending - """ - await self.initialize() - - async with aiosqlite.connect(str(self.db_path)) as db: - await db.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - # Check if job is pending - async with db.execute( - 'SELECT status, created_at FROM ocr_jobs WHERE id = ?', - (job_id,) - ) as cursor: - row = await cursor.fetchone() - if not row or row[0] != OCRJobStatus.pending.value: - return None - job_created_at = row[1] - - # Count jobs ahead in queue (created before this job) - async with db.execute(''' - SELECT COUNT(*) FROM ocr_jobs - WHERE status = 'pending' AND created_at < ? - ''', (job_created_at,)) as cursor: - count = await cursor.fetchone() - return (count[0] + 1) if count else 1 - - async def get_next_pending(self) -> Optional[OCRJob]: - """ - Get the next pending job (oldest first) and atomically mark it as processing. - - This prevents race conditions in parallel processing - only one worker - can claim each job. - - Returns: - Next OCRJob to process or None if queue empty - """ - await self.initialize() - - now = datetime.utcnow() - - async with self._lock: # Serialize access to prevent race conditions - async with aiosqlite.connect(str(self.db_path)) as db: - await db.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - db.row_factory = aiosqlite.Row - - # Get the next pending job - async with db.execute(''' - SELECT * FROM ocr_jobs - WHERE status = 'pending' - ORDER BY created_at ASC - LIMIT 1 - ''') as cursor: - row = await cursor.fetchone() - if not row: - return None - - job_id = row['id'] - - # Atomically mark as processing - await db.execute(''' - UPDATE ocr_jobs - SET status = 'processing', started_at = ? - WHERE id = ? AND status = 'pending' - ''', (now.isoformat(), job_id)) - await db.commit() - - # Fetch the updated job - async with db.execute( - 'SELECT * FROM ocr_jobs WHERE id = ?', - (job_id,) - ) as cursor: - updated_row = await cursor.fetchone() - if updated_row: - return self._row_to_job(updated_row) - - return None - - async def update_status( - self, - job_id: str, - status: OCRJobStatus, - result: Optional[Dict] = None, - error: Optional[str] = None, - processing_time_ms: Optional[int] = None, - ocr_time_ms: Optional[int] = None - ) -> bool: - """ - Update job status. - - Args: - job_id: Job UUID - status: New status - result: Extraction result dict (for completed) - error: Error message (for failed) - processing_time_ms: Total job processing time (started_at to completed_at) - ocr_time_ms: Actual OCR engine processing time - - Returns: - True if update successful - """ - await self.initialize() - - now = datetime.utcnow() - result_json = json.dumps(result, cls=DecimalEncoder) if result else None - - # Build update query based on status - if status == OCRJobStatus.processing: - query = ''' - UPDATE ocr_jobs - SET status = ?, started_at = ? - WHERE id = ? - ''' - params = (status.value, now.isoformat(), job_id) - - elif status == OCRJobStatus.completed: - query = ''' - UPDATE ocr_jobs - SET status = ?, completed_at = ?, result_json = ?, processing_time_ms = ?, ocr_time_ms = ? - WHERE id = ? - ''' - params = (status.value, now.isoformat(), result_json, processing_time_ms, ocr_time_ms, job_id) - - elif status == OCRJobStatus.failed: - query = ''' - UPDATE ocr_jobs - SET status = ?, completed_at = ?, error_message = ?, processing_time_ms = ?, ocr_time_ms = ? - WHERE id = ? - ''' - params = (status.value, now.isoformat(), error, processing_time_ms, ocr_time_ms, job_id) - - else: - query = 'UPDATE ocr_jobs SET status = ? WHERE id = ?' - params = (status.value, job_id) - - async with aiosqlite.connect(str(self.db_path)) as db: - await db.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - cursor = await db.execute(query, params) - await db.commit() - return cursor.rowcount > 0 - - async def get_average_processing_time(self) -> float: - """ - Calculate average processing time from recent completed jobs. - - Uses last 50 completed jobs for accuracy. - - Returns: - Average time in seconds (default 7.0 if no data) - """ - await self.initialize() - - async with aiosqlite.connect(str(self.db_path)) as db: - await db.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - async with db.execute(''' - SELECT AVG(processing_time_ms) - FROM ( - SELECT processing_time_ms FROM ocr_jobs - WHERE status = 'completed' AND processing_time_ms IS NOT NULL - ORDER BY completed_at DESC - LIMIT 50 - ) - ''') as cursor: - row = await cursor.fetchone() - if row and row[0]: - return row[0] / 1000.0 # Convert ms to seconds - return 7.0 # Default estimate - - async def count_pending(self) -> int: - """Count pending jobs in queue.""" - await self.initialize() - - async with aiosqlite.connect(str(self.db_path)) as db: - await db.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - async with db.execute( - 'SELECT COUNT(*) FROM ocr_jobs WHERE status = ?', - (OCRJobStatus.pending.value,) - ) as cursor: - row = await cursor.fetchone() - return row[0] if row else 0 - - async def count_processing(self) -> int: - """Count currently processing jobs.""" - await self.initialize() - - async with aiosqlite.connect(str(self.db_path)) as db: - await db.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - async with db.execute( - 'SELECT COUNT(*) FROM ocr_jobs WHERE status = ?', - (OCRJobStatus.processing.value,) - ) as cursor: - row = await cursor.fetchone() - return row[0] if row else 0 - - async def cleanup_expired(self) -> int: - """ - Delete expired jobs and their files. - - Returns: - Number of jobs deleted - """ - await self.initialize() - - now = datetime.utcnow() - deleted = 0 - - async with aiosqlite.connect(str(self.db_path)) as db: - await db.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - db.row_factory = aiosqlite.Row - - # Get expired jobs - async with db.execute(''' - SELECT id, file_path FROM ocr_jobs - WHERE expires_at < ? - ''', (now.isoformat(),)) as cursor: - rows = await cursor.fetchall() - - for row in rows: - # Delete file - file_path = Path(row['file_path']) - if file_path.exists(): - try: - file_path.unlink() - except Exception as e: - logger.warning(f"[OCRJobQueue] Failed to delete file {file_path}: {e}") - - # Delete job record - await db.execute('DELETE FROM ocr_jobs WHERE id = ?', (row['id'],)) - deleted += 1 - - await db.commit() - - if deleted > 0: - logger.info(f"[OCRJobQueue] Cleaned up {deleted} expired job(s)") - - return deleted - - async def cleanup_job_file(self, job_id: str) -> bool: - """ - Delete the file associated with a job. - - Called after processing to free disk space. - - Args: - job_id: Job UUID - - Returns: - True if file deleted - """ - job = await self.get_job(job_id) - if job: - file_path = Path(job.file_path) - if file_path.exists(): - try: - file_path.unlink() - return True - except Exception as e: - logger.warning(f"[OCRJobQueue] Failed to delete file {file_path}: {e}") - return False - - async def get_queue_stats(self) -> Dict[str, Any]: - """ - Get queue statistics. - - Returns: - Dict with pending, processing, completed, failed counts - """ - await self.initialize() - - stats = { - "pending": 0, - "processing": 0, - "completed": 0, - "failed": 0, - "average_time_seconds": 0.0, - } - - async with aiosqlite.connect(str(self.db_path)) as db: - await db.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - async with db.execute(''' - SELECT status, COUNT(*) as count - FROM ocr_jobs - GROUP BY status - ''') as cursor: - rows = await cursor.fetchall() - for row in rows: - if row[0] in stats: - stats[row[0]] = row[1] - - stats["average_time_seconds"] = await self.get_average_processing_time() - return stats - - def _row_to_job(self, row: aiosqlite.Row) -> OCRJob: - """Convert database row to OCRJob.""" - def parse_datetime(val): - if val: - try: - return datetime.fromisoformat(val) - except (ValueError, TypeError): - return None - return None - - return OCRJob( - id=row['id'], - status=OCRJobStatus(row['status']), - file_path=row['file_path'], - mime_type=row['mime_type'], - engine=row['engine'] or 'doctr_plus', - created_at=parse_datetime(row['created_at']), - started_at=parse_datetime(row['started_at']), - completed_at=parse_datetime(row['completed_at']), - result_json=row['result_json'], - error_message=row['error_message'], - processing_time_ms=row['processing_time_ms'], - ocr_time_ms=row['ocr_time_ms'] if 'ocr_time_ms' in row.keys() else None, - created_by=row['created_by'], - original_filename=row['original_filename'], - expires_at=parse_datetime(row['expires_at']), - batch_id=row['batch_id'] if 'batch_id' in row.keys() else None, - file_hash=row['file_hash'] if 'file_hash' in row.keys() else None, - ) - - -# Singleton instance -job_queue = OCRJobQueue() diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/job_worker.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/job_worker.py deleted file mode 100644 index b731d4d..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/job_worker.py +++ /dev/null @@ -1,665 +0,0 @@ -""" -OCR Job Worker - Background Task for Queue Processing - -Runs as an asyncio background task in FastAPI. -Continuously polls the job queue and processes OCR requests IN PARALLEL. - -Architecture: - FastAPI startup - ↓ - start_job_worker() - ↓ - asyncio.create_task(_job_worker_loop()) - ↓ - while True: - # Process up to OCR_WORKERS jobs concurrently - jobs = get_pending_jobs(limit=available_slots) - for job in jobs: - asyncio.create_task(_process_job(job)) - await asyncio.sleep(0.1) -""" - -import asyncio -import logging -import os -import time -from pathlib import Path -from typing import Optional, Set - -from .job_queue import job_queue, OCRJobStatus, OCRJob -from .ocr_worker_pool import ocr_worker_pool -from backend.modules.data_entry.schemas.ocr import ExtractionData - -logger = logging.getLogger(__name__) - -# Global task reference -_job_worker_task: Optional[asyncio.Task] = None -_cleanup_task: Optional[asyncio.Task] = None -_shutdown_event: Optional[asyncio.Event] = None -_active_tasks: Set[asyncio.Task] = set() # Track active job tasks -_concurrency_semaphore: Optional[asyncio.Semaphore] = None # Limit concurrent jobs - -# Configuration -POLL_INTERVAL_SECONDS = 0.1 # How often to check for new jobs (faster for parallel) -CLEANUP_INTERVAL_SECONDS = 3600 # Clean expired jobs every hour -OCR_TIMEOUT_SECONDS = 120 # Max time for OCR processing - - -async def _job_worker_loop() -> None: - """ - Main worker loop - processes jobs from queue IN PARALLEL. - - Runs continuously until shutdown. Uses semaphore to limit - concurrent jobs to OCR_WORKERS count. Launches jobs as - background tasks without waiting for completion. - """ - global _shutdown_event, _active_tasks, _concurrency_semaphore - - # Get max concurrent jobs from env (matches worker pool size) - max_concurrent = int(os.getenv('OCR_WORKERS', '2')) - _concurrency_semaphore = asyncio.Semaphore(max_concurrent) - _active_tasks = set() - - logger.info(f"[JobWorker] Starting PARALLEL worker loop (max_concurrent={max_concurrent})...") - _shutdown_event = asyncio.Event() - - consecutive_errors = 0 - max_consecutive_errors = 10 - - while not _shutdown_event.is_set(): - try: - # Clean up completed tasks - done_tasks = {t for t in _active_tasks if t.done()} - for task in done_tasks: - _active_tasks.discard(task) - # Check for exceptions - try: - task.result() - except Exception as e: - logger.error(f"[JobWorker] Task failed: {e}") - - # Check if we have capacity for more jobs - active_count = len(_active_tasks) - available_slots = max_concurrent - active_count - - if available_slots > 0: - # Get next pending job - job = await job_queue.get_next_pending() - - if job: - consecutive_errors = 0 - # Launch job processing as background task - task = asyncio.create_task(_process_job_with_semaphore(job)) - _active_tasks.add(task) - logger.debug(f"[JobWorker] Launched job {job.id} (active={len(_active_tasks)}/{max_concurrent})") - else: - # No pending jobs - wait briefly - try: - await asyncio.wait_for( - _shutdown_event.wait(), - timeout=POLL_INTERVAL_SECONDS - ) - if _shutdown_event.is_set(): - break - except asyncio.TimeoutError: - pass - else: - # At capacity - wait for a slot to free up - await asyncio.sleep(POLL_INTERVAL_SECONDS) - - except asyncio.CancelledError: - logger.info("[JobWorker] Worker loop cancelled") - break - - except Exception as e: - consecutive_errors += 1 - logger.error(f"[JobWorker] Error in worker loop ({consecutive_errors}/{max_consecutive_errors}): {e}") - - if consecutive_errors >= max_consecutive_errors: - logger.error("[JobWorker] Too many consecutive errors, stopping worker") - break - - await asyncio.sleep(min(consecutive_errors * 2, 30)) - - # Wait for active tasks to complete on shutdown - if _active_tasks: - logger.info(f"[JobWorker] Waiting for {len(_active_tasks)} active tasks to complete...") - await asyncio.gather(*_active_tasks, return_exceptions=True) - - logger.info("[JobWorker] Worker loop stopped") - - -async def _process_job_with_semaphore(job: OCRJob) -> None: - """ - Process job with semaphore to limit concurrency. - - Acquires semaphore before processing, releases after. - This ensures we don't exceed OCR_WORKERS concurrent jobs. - """ - global _concurrency_semaphore - - async with _concurrency_semaphore: - await _process_job(job) - - -async def _process_job(job: OCRJob) -> None: - """ - Process a single OCR job. - - Reads file, submits to worker pool, updates job status, - and saves metrics for analytics. - - Args: - job: OCRJob to process - """ - logger.info(f"[JobWorker] Processing job {job.id}: engine={job.engine}, file={Path(job.file_path).name}") - start_time = time.time() - file_size = 0 - file_type = "image/jpeg" - - try: - # Note: Job already marked as 'processing' atomically in get_next_pending() - - # Read file bytes - file_path = Path(job.file_path) - if not file_path.exists(): - raise FileNotFoundError(f"File not found: {file_path}") - - with open(file_path, 'rb') as f: - file_bytes = f.read() - - file_size = len(file_bytes) - # Determine file type from job or extension - file_type = getattr(job, 'mime_type', 'image/jpeg') or 'image/jpeg' - - # Submit to worker pool - result = await ocr_worker_pool.submit_task( - image_bytes=file_bytes, - engine=job.engine, - preprocessing="auto", - timeout=OCR_TIMEOUT_SECONDS - ) - - elapsed_ms = int((time.time() - start_time) * 1000) - - if result.get("success"): - # Job completed successfully - extraction = result.get("extraction", {}) - - # Include raw_texts for analysis (from all OCR engine passes) - extraction['raw_texts'] = result.get("raw_texts", []) - - # Extract actual OCR processing time from extraction result - ocr_time_ms = extraction.get('processing_time_ms', 0) - - # Debug: log suggested_payment_mode - spm = extraction.get('suggested_payment_mode') - logger.info(f"[JobWorker] Job {job.id} extraction has suggested_payment_mode={spm}") - - await job_queue.update_status( - job_id=job.id, - status=OCRJobStatus.completed, - result=extraction, - processing_time_ms=elapsed_ms, - ocr_time_ms=ocr_time_ms - ) - - logger.info(f"[JobWorker] Job {job.id} completed in {elapsed_ms}ms (ocr: {ocr_time_ms}ms)") - - # Save metrics for successful job - await _save_job_metrics( - job_id=job.id, - username=job.created_by or 'unknown', - engine_requested=job.engine, - engine_used=extraction.get('ocr_engine', job.engine), - processing_time_ms=elapsed_ms, - file_size_bytes=file_size, - file_type=file_type, - original_filename=job.original_filename, - success=True, - overall_confidence=extraction.get('overall_confidence', 0.0), - fields_extracted=_count_extracted_fields(extraction), - needs_manual_review=extraction.get('needs_manual_review'), - validation_warnings_count=len(extraction.get('validation_warnings', [])), - validation_errors_count=len(extraction.get('validation_errors', [])), - ) - - # Auto-save receipt for batch jobs - if job.batch_id: - auto_save_result = await _auto_save_batch_receipt( - job=job, - extraction=extraction, - file_path=str(file_path) - ) - if not auto_save_result: - # Auto-save failed - mark job as failed - # Note: job_queue status already updated to 'completed' above - # We need to update it back to failed with the auto-save error - logger.warning( - f"[JobWorker] Job {job.id} OCR succeeded but auto-save failed" - ) - - else: - # Job failed - error_msg = result.get("error", "Unknown error") - - await job_queue.update_status( - job_id=job.id, - status=OCRJobStatus.failed, - error=error_msg, - processing_time_ms=elapsed_ms - ) - - logger.warning(f"[JobWorker] Job {job.id} failed after {elapsed_ms}ms: {error_msg}") - - # Save metrics for failed job - await _save_job_metrics( - job_id=job.id, - username=job.created_by or 'unknown', - engine_requested=job.engine, - engine_used=job.engine, - processing_time_ms=elapsed_ms, - file_size_bytes=file_size, - file_type=file_type, - original_filename=job.original_filename, - success=False, - error_message=error_msg, - ) - - except Exception as e: - elapsed_ms = int((time.time() - start_time) * 1000) - - logger.error(f"[JobWorker] Job {job.id} error after {elapsed_ms}ms: {e}") - - await job_queue.update_status( - job_id=job.id, - status=OCRJobStatus.failed, - error=str(e), - processing_time_ms=elapsed_ms - ) - - # Save metrics for error job - await _save_job_metrics( - job_id=job.id, - username=job.created_by or 'unknown', - engine_requested=job.engine, - engine_used=job.engine, - processing_time_ms=elapsed_ms, - file_size_bytes=file_size, - file_type=file_type, - original_filename=job.original_filename, - success=False, - error_message=str(e), - ) - - finally: - # Cleanup file after processing - try: - await job_queue.cleanup_job_file(job.id) - except Exception as e: - logger.warning(f"[JobWorker] Failed to cleanup file for job {job.id}: {e}") - - -async def _cleanup_loop() -> None: - """ - Periodic cleanup of expired jobs. - - Runs every hour to delete jobs older than 24 hours. - """ - global _shutdown_event - - logger.info("[JobWorker] Starting cleanup loop...") - - while not _shutdown_event.is_set(): - try: - # Wait for interval or shutdown - try: - await asyncio.wait_for( - _shutdown_event.wait(), - timeout=CLEANUP_INTERVAL_SECONDS - ) - if _shutdown_event.is_set(): - break - except asyncio.TimeoutError: - pass # Normal timeout, do cleanup - - # Run cleanup - deleted = await job_queue.cleanup_expired() - if deleted > 0: - logger.info(f"[JobWorker] Cleanup: deleted {deleted} expired jobs") - - except asyncio.CancelledError: - logger.info("[JobWorker] Cleanup loop cancelled") - break - - except Exception as e: - logger.error(f"[JobWorker] Cleanup error: {e}") - await asyncio.sleep(60) # Retry after 1 minute - - logger.info("[JobWorker] Cleanup loop stopped") - - -async def start_job_worker() -> bool: - """ - Start the job worker background task. - - Called at FastAPI startup to begin processing queue. - - Returns: - True if started successfully - """ - global _job_worker_task, _cleanup_task, _shutdown_event - - if _job_worker_task is not None and not _job_worker_task.done(): - logger.warning("[JobWorker] Already running") - return True - - try: - # Initialize job queue - await job_queue.initialize() - - # Initialize worker pool - if not ocr_worker_pool.initialize(): - logger.error("[JobWorker] Failed to initialize worker pool") - return False - - # Pre-warm worker pool in BACKGROUND (don't block startup) - # First OCR request may be slower if prewarm isn't done yet - async def _background_prewarm(): - logger.info("[JobWorker] Pre-warming OCR worker pool (background)...") - warmup_success = await ocr_worker_pool.prewarm(timeout=90.0) - if warmup_success: - logger.info("[JobWorker] OCR worker pool pre-warmed successfully") - else: - logger.warning("[JobWorker] Worker pool pre-warm failed, first request will be slower") - - asyncio.create_task(_background_prewarm()) - - # Start worker loop - _shutdown_event = asyncio.Event() - _job_worker_task = asyncio.create_task(_job_worker_loop()) - - # Start cleanup loop - _cleanup_task = asyncio.create_task(_cleanup_loop()) - - logger.info("[JobWorker] Started successfully") - return True - - except Exception as e: - logger.error(f"[JobWorker] Failed to start: {e}") - return False - - -async def stop_job_worker() -> None: - """ - Stop the job worker background task. - - Called at FastAPI shutdown to gracefully stop processing. - """ - global _job_worker_task, _cleanup_task, _shutdown_event - - logger.info("[JobWorker] Stopping...") - - # Signal shutdown - if _shutdown_event: - _shutdown_event.set() - - # Cancel worker task - if _job_worker_task and not _job_worker_task.done(): - _job_worker_task.cancel() - try: - await _job_worker_task - except asyncio.CancelledError: - pass - - # Cancel cleanup task - if _cleanup_task and not _cleanup_task.done(): - _cleanup_task.cancel() - try: - await _cleanup_task - except asyncio.CancelledError: - pass - - # Shutdown worker pool - ocr_worker_pool.shutdown(wait=True) - - _job_worker_task = None - _cleanup_task = None - _shutdown_event = None - - logger.info("[JobWorker] Stopped") - - -def is_running() -> bool: - """Check if job worker is running.""" - return _job_worker_task is not None and not _job_worker_task.done() - - -def estimate_wait_time(queue_position: int) -> int: - """ - Estimate wait time for a job in queue. - - Args: - queue_position: Position in queue (1 = next) - - Returns: - Estimated wait time in seconds - """ - if queue_position <= 0: - return 0 - - # Get average processing time (synchronous fallback) - # Default ~7 seconds per job if no data - avg_time = 7.0 - - try: - # Try to get from queue stats - import asyncio - loop = asyncio.get_event_loop() - if loop.is_running(): - # Can't use sync call in async context, use default - pass - else: - avg_time = loop.run_until_complete(job_queue.get_average_processing_time()) - except Exception: - pass - - # Estimate: position * average_time - return int(queue_position * avg_time) - - -# ============================================================================ -# Metrics Helper Functions -# ============================================================================ - -async def _save_job_metrics( - job_id: str, - username: str, - engine_requested: str, - engine_used: str, - processing_time_ms: int = 0, - file_size_bytes: int = 0, - file_type: str = "image/jpeg", - original_filename: Optional[str] = None, - success: bool = True, - error_message: Optional[str] = None, - overall_confidence: float = 0.0, - fields_extracted: int = 0, - needs_manual_review: Optional[bool] = None, - validation_warnings_count: int = 0, - validation_errors_count: int = 0, -) -> None: - """ - Save OCR job metrics to database for analytics. - - Called after each job completes (success or failure). - Errors are logged but don't affect job processing. - """ - try: - from backend.modules.data_entry.db.database import get_db_session - from backend.modules.data_entry.db.crud.ocr_settings import OCRMetricsCRUD - - async with await get_db_session() as session: - await OCRMetricsCRUD.create( - session=session, - job_id=job_id, - username=username, - engine_requested=engine_requested, - engine_used=engine_used, - processing_time_ms=processing_time_ms, - file_size_bytes=file_size_bytes, - file_type=file_type, - original_filename=original_filename, - success=success, - error_message=error_message, - overall_confidence=overall_confidence, - fields_extracted=fields_extracted, - needs_manual_review=needs_manual_review, - validation_warnings_count=validation_warnings_count, - validation_errors_count=validation_errors_count, - ) - logger.debug(f"[JobWorker] Saved metrics for job {job_id}") - - except Exception as e: - # Log but don't fail - metrics are nice-to-have - logger.warning(f"[JobWorker] Failed to save metrics for job {job_id}: {e}") - - -def _count_extracted_fields(extraction: dict) -> int: - """ - Count number of successfully extracted fields from OCR result. - - Counts non-None values in key fields. - """ - key_fields = [ - 'receipt_number', - 'receipt_date', - 'amount', - 'partner_name', - 'cui', - 'tva_total', - 'address', - 'items_count', - ] - - count = 0 - for field in key_fields: - value = extraction.get(field) - if value is not None and value != '' and value != []: - count += 1 - - # Also count TVA entries if present - tva_entries = extraction.get('tva_entries', []) - if tva_entries and len(tva_entries) > 0: - count += 1 - - # Count payment methods if present - payment_methods = extraction.get('payment_methods', []) - if payment_methods and len(payment_methods) > 0: - count += 1 - - return count - - -# ============================================================================ -# Auto-Save Batch Receipt Helper -# ============================================================================ - -async def _auto_save_batch_receipt( - job: OCRJob, - extraction: dict, - file_path: str -) -> bool: - """ - Automatically create a receipt from OCR result for batch jobs. - - Called when a batch job completes successfully. Creates the receipt, - attachment, and accounting entries using ReceiptAutoCreateService. - - Args: - job: Completed OCRJob with batch_id set - extraction: OCR extraction result dict - file_path: Path to the original uploaded file - - Returns: - True if receipt created successfully, False otherwise - """ - if not job.batch_id: - return True # Not a batch job, nothing to do - - logger.info(f"[JobWorker] Auto-saving receipt for batch job {job.id} (batch_id={job.batch_id})") - - try: - # Import here to avoid circular imports - from backend.modules.data_entry.db.database import get_db_session - from backend.modules.data_entry.db.models import BatchUpload - from backend.modules.data_entry.services.receipt_auto_create import ReceiptAutoCreateService - from sqlalchemy import select - - # Convert extraction dict to ExtractionData schema - ocr_result = ExtractionData(**extraction) - - async with await get_db_session() as session: - # Get batch info to retrieve company_id and user_id - batch_result = await session.execute( - select(BatchUpload).where(BatchUpload.id == job.batch_id) - ) - batch = batch_result.scalar_one_or_none() - - if not batch: - error_msg = f"Batch {job.batch_id} not found" - logger.error(f"[JobWorker] Auto-save failed for job {job.id}: {error_msg}") - await job_queue.update_status( - job_id=job.id, - status=OCRJobStatus.failed, - error=f"Auto-save error: {error_msg}" - ) - return False - - # Call ReceiptAutoCreateService - result = await ReceiptAutoCreateService.create_from_ocr_result( - session=session, - job_id=job.id, - ocr_result=ocr_result, - username=job.created_by or batch.user_id, - batch_id=job.batch_id, - company_id=batch.company_id, - file_path=file_path, - original_filename=job.original_filename, - file_hash=job.file_hash # Pass file_hash for duplicate detection (US-007) - ) - - if result.success: - logger.info( - f"[JobWorker] Auto-save successful for job {job.id}: " - f"receipt_id={result.receipt_id}" - ) - return True - else: - error_msg = result.error_message or "Unknown error" - logger.warning( - f"[JobWorker] Auto-save validation failed for job {job.id}: {error_msg}" - ) - # Update job status to failed with the auto-save error - await job_queue.update_status( - job_id=job.id, - status=OCRJobStatus.failed, - error=f"Auto-save error: {error_msg}" - ) - return False - - except Exception as e: - error_msg = str(e) - logger.error(f"[JobWorker] Auto-save exception for job {job.id}: {error_msg}") - - # Update job status to failed - try: - await job_queue.update_status( - job_id=job.id, - status=OCRJobStatus.failed, - error=f"Auto-save error: {error_msg}" - ) - except Exception as update_err: - logger.error(f"[JobWorker] Failed to update job status after auto-save error: {update_err}") - - return False diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/ocr_worker_pool.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/ocr_worker_pool.py deleted file mode 100644 index 679e838..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/ocr_worker_pool.py +++ /dev/null @@ -1,561 +0,0 @@ -""" -OCR Worker Pool Manager - -Manages a ProcessPoolExecutor with persistent OCR engine initialization. -Key features: -- ProcessPoolExecutor with configurable max_workers (from OCR_WORKERS env) -- Configurable max_tasks_per_child (from OCR_MAX_TASKS_PER_CHILD env, 0=no restart) -- mp_context='spawn' for Windows IIS compatibility -- docTR/PaddleOCR loaded ONCE at worker spawn (not 30s per request) -- atexit + signal handlers for cleanup -- Health check with auto-respawn -- Orphan process cleanup on Windows - -Architecture: - Main Process │ Worker Process (PERSISTENT) - ──────────────────────│────────────────────────────────── - OCRWorkerPool │ Worker initialized once - ↓ │ ↓ - submit_task() ────────│────→ process_ocr() - ↓ │ ↓ - Future.result() ←─────│──── Return result -""" - -import asyncio -import atexit -import gc -import logging -import multiprocessing as mp -import os -import signal -import sys -import time -from concurrent.futures import ProcessPoolExecutor, Future, ThreadPoolExecutor, as_completed -from pathlib import Path -from typing import Any, Callable, Optional - -logger = logging.getLogger(__name__) - -# Try to import psutil for orphan process cleanup -try: - import psutil - PSUTIL_AVAILABLE = True -except ImportError: - PSUTIL_AVAILABLE = False - logger.warning("[OCRWorkerPool] psutil not available - orphan cleanup disabled") - - -class OCRWorkerPool: - """ - Singleton manager for OCR ProcessPoolExecutor. - - Ensures OCR engines are loaded once and reused for all requests. - Uses max_tasks_per_child=5 to restart worker every 5 tasks (prevents memory leak). - """ - - _instance: Optional["OCRWorkerPool"] = None - _initialized: bool = False - - def __new__(cls) -> "OCRWorkerPool": - """Singleton pattern - only one pool instance.""" - if cls._instance is None: - cls._instance = super().__new__(cls) - return cls._instance - - def __init__(self): - """Initialize worker pool (runs only once due to singleton).""" - if self._initialized: - return - - self._executor: Optional[ProcessPoolExecutor] = None - self._worker_pid: Optional[int] = None - self._is_warming: bool = False - self._is_shutdown: bool = False - self._lock = asyncio.Lock() if asyncio.get_event_loop_policy() else None - self._sync_lock = mp.Lock() - - # Register cleanup handlers - # NOTE: Only use atexit, NOT signal handlers! - # Signal handlers interfere with FastAPI's shutdown handling. - # FastAPI's shutdown event calls stop_job_worker() which calls shutdown(). - atexit.register(self._cleanup_on_exit) - - self._initialized = True - logger.info("[OCRWorkerPool] Singleton instance created") - - def initialize(self) -> bool: - """ - Initialize the ProcessPoolExecutor. - - Creates executor with spawn context for Windows compatibility. - Uses max_tasks_per_child=5 to restart worker periodically (prevents memory leak). - - Returns: - True if initialization successful - """ - if self._executor is not None: - logger.warning("[OCRWorkerPool] Already initialized") - return True - - if self._is_shutdown: - logger.error("[OCRWorkerPool] Cannot initialize - pool is shutdown") - return False - - try: - # Cleanup any orphan workers from previous runs - self._cleanup_orphan_workers() - - # Read configuration from environment - max_workers = int(os.getenv('OCR_WORKERS', '2')) - max_tasks_raw = os.getenv('OCR_MAX_TASKS_PER_CHILD', '0') - # 0 means no restart (None in ProcessPoolExecutor) - max_tasks_per_child = int(max_tasks_raw) if max_tasks_raw and int(max_tasks_raw) > 0 else None - - # Create executor with spawn context (Windows compatible) - # Use mp_context='spawn' explicitly for cross-platform consistency - mp_context = mp.get_context('spawn') - - # max_tasks_per_child only available in Python 3.11+ - executor_kwargs = { - 'max_workers': max_workers, - 'mp_context': mp_context, - 'initializer': _worker_initializer, - } - if sys.version_info >= (3, 11) and max_tasks_per_child is not None: - executor_kwargs['max_tasks_per_child'] = max_tasks_per_child - else: - logger.info(f"[OCRWorkerPool] max_tasks_per_child not supported (Python {sys.version_info.major}.{sys.version_info.minor})") - - self._executor = ProcessPoolExecutor(**executor_kwargs) - - logger.info(f"[OCRWorkerPool] ProcessPoolExecutor created (spawn context, max_workers={max_workers}, max_tasks_per_child={max_tasks_per_child})") - return True - - except Exception as e: - logger.error(f"[OCRWorkerPool] Initialization failed: {e}") - return False - - async def prewarm(self, timeout: float = 60.0) -> bool: - """ - Pre-warm the worker by loading PaddleOCR before first request. - - This is called at FastAPI startup to avoid 30s delay on first request. - Submits a dummy task that triggers PaddleOCR initialization. - - Args: - timeout: Maximum seconds to wait for warmup (default 60s) - - Returns: - True if warmup successful, False if timeout or error - """ - if self._executor is None: - logger.error("[OCRWorkerPool] Cannot prewarm - not initialized") - return False - - if self._is_warming: - logger.warning("[OCRWorkerPool] Already warming up") - return False - - self._is_warming = True - logger.info("[OCRWorkerPool] Starting pre-warm (loading PaddleOCR in worker)...") - start_time = time.time() - - try: - # Submit warmup task that initializes PaddleOCR - loop = asyncio.get_event_loop() - future = self._executor.submit(_warmup_task) - - # Wait with timeout - result = await loop.run_in_executor(None, future.result, timeout) - - elapsed = time.time() - start_time - if result.get("success"): - logger.info(f"[OCRWorkerPool] Pre-warm complete in {elapsed:.1f}s - PaddleOCR ready") - self._worker_pid = result.get("pid") - return True - else: - logger.error(f"[OCRWorkerPool] Pre-warm failed: {result.get('error')}") - return False - - except Exception as e: - elapsed = time.time() - start_time - logger.error(f"[OCRWorkerPool] Pre-warm failed after {elapsed:.1f}s: {e}") - return False - finally: - self._is_warming = False - - async def submit_task( - self, - image_bytes: bytes, - engine: str = "doctr_plus", - preprocessing: str = "auto", - timeout: float = 120.0 - ) -> dict: - """ - Submit OCR task to worker process. - - Args: - image_bytes: Raw image bytes - engine: OCR engine ('tesseract', 'doctr', 'doctr_plus', 'paddleocr') - preprocessing: Preprocessing mode ('light', 'medium', 'heavy', 'auto') - timeout: Maximum processing time in seconds - - Returns: - Dict with extraction results - - Raises: - RuntimeError: If pool not initialized or task fails - """ - if self._executor is None: - raise RuntimeError("OCR worker pool not initialized") - - if self._is_shutdown: - raise RuntimeError("OCR worker pool is shutdown") - - logger.info(f"[OCRWorkerPool] Submitting task: engine={engine}, preprocessing={preprocessing}, size={len(image_bytes)} bytes") - - try: - loop = asyncio.get_event_loop() - future = self._executor.submit( - _process_ocr_task, - image_bytes, - engine, - preprocessing - ) - - # Wait for result with timeout - result = await loop.run_in_executor(None, future.result, timeout) - - logger.info(f"[OCRWorkerPool] Task complete: success={result.get('success')}") - return result - - except TimeoutError: - logger.error(f"[OCRWorkerPool] Task timed out after {timeout}s") - raise RuntimeError(f"OCR processing timed out after {timeout}s") - - except Exception as e: - logger.error(f"[OCRWorkerPool] Task failed: {e}") - raise RuntimeError(f"OCR processing failed: {e}") - - def is_healthy(self) -> bool: - """ - Check if worker pool is healthy. - - Returns: - True if pool is ready to accept tasks - """ - if self._executor is None: - return False - if self._is_shutdown: - return False - - # Check if worker process is still alive - if self._worker_pid and PSUTIL_AVAILABLE: - try: - proc = psutil.Process(self._worker_pid) - if not proc.is_running(): - logger.warning("[OCRWorkerPool] Worker process died, needs respawn") - return False - except psutil.NoSuchProcess: - logger.warning("[OCRWorkerPool] Worker process not found") - return False - - return True - - def shutdown(self, wait: bool = True, timeout: float = 10.0) -> None: - """ - Shutdown the worker pool gracefully. - - Args: - wait: Wait for pending tasks to complete - timeout: Maximum wait time in seconds - """ - if self._executor is None: - return - - logger.info("[OCRWorkerPool] Shutting down...") - self._is_shutdown = True - - try: - self._executor.shutdown(wait=wait, cancel_futures=True) - logger.info("[OCRWorkerPool] Executor shutdown complete") - except Exception as e: - logger.error(f"[OCRWorkerPool] Shutdown error: {e}") - - self._executor = None - self._worker_pid = None - - # Final orphan cleanup - self._cleanup_orphan_workers() - logger.info("[OCRWorkerPool] Shutdown complete") - - def _cleanup_orphan_workers(self) -> int: - """ - Clean up orphan Python processes from previous runs. - - On Windows with NSSM, orphan processes may remain after service restart. - This finds and kills any python.exe processes that were OCR workers. - - Returns: - Number of processes killed - """ - if not PSUTIL_AVAILABLE: - return 0 - - killed = 0 - current_pid = os.getpid() - - try: - for proc in psutil.process_iter(['pid', 'name', 'cmdline']): - try: - # Skip self - if proc.pid == current_pid: - continue - - # Look for Python processes with OCR-related cmdline - if proc.name().lower() in ('python.exe', 'python3.exe', 'python', 'python3'): - cmdline = ' '.join(proc.cmdline() or []) - - # Check if this is an OCR worker process - if 'ocr_worker_process' in cmdline.lower() or 'process_ocr_task' in cmdline.lower(): - logger.warning(f"[OCRWorkerPool] Killing orphan worker: PID={proc.pid}") - proc.kill() - proc.wait(timeout=5) - killed += 1 - - except (psutil.NoSuchProcess, psutil.AccessDenied, psutil.ZombieProcess): - continue - - except Exception as e: - logger.error(f"[OCRWorkerPool] Orphan cleanup error: {e}") - - if killed > 0: - logger.info(f"[OCRWorkerPool] Cleaned up {killed} orphan worker(s)") - - return killed - - def _cleanup_on_exit(self) -> None: - """atexit handler for cleanup.""" - logger.info("[OCRWorkerPool] atexit cleanup triggered") - self.shutdown(wait=False) - - def _signal_handler(self, signum: int, frame: Any) -> None: - """Signal handler for SIGTERM/SIGINT.""" - logger.info(f"[OCRWorkerPool] Received signal {signum}, shutting down...") - self.shutdown(wait=False) - - -# ============================================================================ -# WORKER PROCESS FUNCTIONS -# ============================================================================ -# These functions run in the child process, not the main FastAPI process. - -# Global engines - persist between tasks in worker process -_paddle_engine = None -_tesseract_engine = None -_doctr_engine = None # docTR engine (PyTorch backend) -_worker_initialized = False - - -def _worker_initializer() -> None: - """ - Called once when worker process spawns. - - Initializes global OCR engines IN PARALLEL for faster startup. - Uses ThreadPoolExecutor to load enabled engines concurrently. - Respects OCR_ENABLE_PADDLEOCR and OCR_ENABLE_TESSERACT from .env. - - Total warmup time = max(engine_times) instead of sum(engine_times). - """ - global _paddle_engine, _tesseract_engine, _doctr_engine, _worker_initialized - - if _worker_initialized: - print(f"[Worker {os.getpid()}] Already initialized", flush=True) - return - - # Check which engines are enabled via .env - paddle_enabled = os.getenv("OCR_ENABLE_PADDLEOCR", "true").lower() == "true" - tesseract_enabled = os.getenv("OCR_ENABLE_TESSERACT", "true").lower() == "true" - - enabled_engines = ["doctr"] # docTR is always loaded (primary engine) - if paddle_enabled: - enabled_engines.append("paddle") - if tesseract_enabled: - enabled_engines.append("tesseract") - - print(f"[Worker {os.getpid()}] Initializing OCR engines: {enabled_engines}", flush=True) - if not paddle_enabled: - print(f"[Worker {os.getpid()}] PaddleOCR DISABLED - saving ~800MB RAM", flush=True) - if not tesseract_enabled: - print(f"[Worker {os.getpid()}] Tesseract DISABLED - saving ~50MB RAM", flush=True) - - start_time = time.time() - - # Define loader functions - each runs in its own thread - def load_doctr(): - try: - from backend.modules.data_entry.services.ocr.ocr_worker_process import initialize_doctr_engine - engine = initialize_doctr_engine() - return ("doctr", engine, None) - except Exception as e: - return ("doctr", None, str(e)) - - def load_paddle(): - if not paddle_enabled: - return ("paddle", None, "disabled via OCR_ENABLE_PADDLEOCR=false") - try: - from backend.modules.data_entry.services.ocr.ocr_worker_process import initialize_paddle_engine - engine = initialize_paddle_engine() - return ("paddle", engine, None) - except Exception as e: - return ("paddle", None, str(e)) - - def load_tesseract(): - if not tesseract_enabled: - return ("tesseract", None, "disabled via OCR_ENABLE_TESSERACT=false") - try: - from backend.modules.data_entry.services.ocr.tesseract_engine import TesseractEngine - engine = TesseractEngine() - return ("tesseract", engine, None) - except Exception as e: - return ("tesseract", None, str(e)) - - # Build list of futures for enabled engines only - futures_to_submit = [load_doctr] # docTR always loaded - if paddle_enabled: - futures_to_submit.append(load_paddle) - if tesseract_enabled: - futures_to_submit.append(load_tesseract) - - # Load engines in parallel using ThreadPoolExecutor - with ThreadPoolExecutor(max_workers=len(futures_to_submit)) as executor: - futures = [executor.submit(fn) for fn in futures_to_submit] - - for future in as_completed(futures): - name, engine, error = future.result() - if error and "disabled" not in error: - print(f"[Worker {os.getpid()}] {name} init failed: {error}", flush=True) - elif engine: - print(f"[Worker {os.getpid()}] {name} loaded", flush=True) - if name == "doctr": - _doctr_engine = engine - elif name == "paddle": - _paddle_engine = engine - elif name == "tesseract": - _tesseract_engine = engine - - elapsed = time.time() - start_time - _worker_initialized = True - print(f"[Worker {os.getpid()}] Initialization complete in {elapsed:.1f}s (engines: {enabled_engines})", flush=True) - - -def _warmup_task() -> dict: - """ - Warmup task that ensures engines are loaded. - - Called at FastAPI startup to pre-warm the worker. - Returns success status and worker PID. - """ - global _paddle_engine, _tesseract_engine, _doctr_engine, _worker_initialized - - try: - # Ensure initialization - if not _worker_initialized: - _worker_initializer() - - # Quick test - create a small dummy image - import numpy as np - dummy_img = np.ones((100, 100, 3), dtype=np.uint8) * 255 - - # Test docTR if available (fastest engine) - if _doctr_engine is not None: - try: - _doctr_engine([dummy_img]) - print(f"[Worker {os.getpid()}] docTR warmup OK", flush=True) - except Exception as e: - print(f"[Worker {os.getpid()}] docTR warmup error: {e}", flush=True) - - # Test PaddleOCR if available - if _paddle_engine is not None: - try: - _paddle_engine.predict(dummy_img) - print(f"[Worker {os.getpid()}] PaddleOCR warmup OK", flush=True) - except Exception as e: - print(f"[Worker {os.getpid()}] PaddleOCR warmup error: {e}", flush=True) - - # Cleanup - gc.collect() - - return { - "success": True, - "pid": os.getpid(), - "doctr_available": _doctr_engine is not None, - "paddle_available": _paddle_engine is not None, - "tesseract_available": _tesseract_engine is not None - } - - except Exception as e: - return { - "success": False, - "pid": os.getpid(), - "error": str(e) - } - - -def _process_ocr_task( - image_bytes: bytes, - engine: str = "doctr_plus", - preprocessing: str = "auto" -) -> dict: - """ - Process OCR task in worker process. - - This is the main work function called for each OCR request. - Uses persistent global engines loaded at worker init. - - Args: - image_bytes: Raw image bytes - engine: OCR engine choice ('tesseract', 'doctr', 'doctr_plus', 'paddleocr') - preprocessing: Preprocessing mode - - Returns: - Dict with extraction results - """ - global _paddle_engine, _tesseract_engine, _doctr_engine, _worker_initialized - - try: - # Ensure initialization - if not _worker_initialized: - _worker_initializer() - - # Import processing function - from backend.modules.data_entry.services.ocr.ocr_worker_process import process_ocr - - # Run OCR - result = process_ocr( - image_bytes=image_bytes, - paddle_engine=_paddle_engine, - tesseract_engine=_tesseract_engine, - engine=engine, - preprocessing=preprocessing, - doctr_engine=_doctr_engine - ) - - # Cleanup after each task - gc.collect() - - return result - - except Exception as e: - print(f"[Worker {os.getpid()}] Task error: {e}", flush=True) - import traceback - traceback.print_exc() - return { - "success": False, - "error": str(e), - "pid": os.getpid() - } - - -# Singleton instance -ocr_worker_pool = OCRWorkerPool() diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/ocr_worker_process.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/ocr_worker_process.py deleted file mode 100644 index e557d8a..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/ocr_worker_process.py +++ /dev/null @@ -1,1052 +0,0 @@ -""" -OCR Worker Process Functions - -Contains code that runs in the worker subprocess. -Handles OCR processing with persistent engine instances. - -Key features: -- PaddleOCR initialized ONCE at process spawn -- docTR initialized ONCE at process spawn (PyTorch backend) -- Tesseract as fallback/complement engine -- Multi-pass preprocessing (light → medium → tesseract) -- Automatic engine selection based on results -- Memory cleanup after each task -""" - -import gc -import io -import os -import time -from dataclasses import dataclass, field -from decimal import Decimal -from typing import Any, Dict, List, Optional, Tuple - -import cv2 -import numpy as np - -# Disable PaddleOCR model source check for faster startup -os.environ['PADDLE_PDX_DISABLE_MODEL_SOURCE_CHECK'] = 'True' - -# Memory optimization for docTR (prevents memory leak in multiprocessing) -# Source: https://github.com/mindee/doctr/issues/1594 -os.environ['DOCTR_MULTIPROCESSING_DISABLE'] = 'TRUE' - -# Reduce Intel oneDNN cache to save memory -os.environ['ONEDNN_PRIMITIVE_CACHE_CAPACITY'] = '1' - - -@dataclass -class OCRResult: - """Raw OCR result from engine.""" - text: str - confidence: float - boxes: List[dict] = field(default_factory=list) - engine: str = "" - - -def initialize_paddle_engine(): - """ - Initialize PaddleOCR engine. - - Called once at worker spawn. Returns the engine instance - that will be reused for all subsequent requests. - - Returns: - PaddleOCR instance or None if unavailable - """ - try: - print(f"[Worker {os.getpid()}] Loading PaddleOCR...", flush=True) - start_time = time.time() - - from paddleocr import PaddleOCR - - # PaddleOCR 3.x API - optimized for Romanian receipts - paddle = PaddleOCR( - lang='en', # 'en' handles Latin alphabet well for receipts - det_db_thresh=0.3, - det_db_box_thresh=0.5, - det_db_unclip_ratio=1.8, - rec_batch_num=6, - use_angle_cls=True, - ) - - elapsed = time.time() - start_time - print(f"[Worker {os.getpid()}] PaddleOCR loaded in {elapsed:.1f}s", flush=True) - return paddle - - except Exception as e: - print(f"[Worker {os.getpid()}] PaddleOCR init failed: {e}", flush=True) - return None - - -def initialize_doctr_engine(): - """ - Initialize docTR engine (CPU only). - - Called once at worker spawn. Returns the engine instance - that will be reused for all subsequent requests. - - Note: DirectML (AMD GPU) has compatibility issues with docTR. - CUDA (NVIDIA) works but requires separate PyTorch build. - CPU mode is stable and well-optimized. - - Returns: - docTR predictor instance or None if unavailable - """ - try: - print(f"[Worker {os.getpid()}] Loading docTR (PyTorch backend, CPU)...", flush=True) - start_time = time.time() - - from doctr.models import ocr_predictor - - # Initialize docTR predictor with pretrained models - # Uses db_resnet50 for detection and crnn_vgg16_bn for recognition - doctr = ocr_predictor( - det_arch='db_resnet50', - reco_arch='crnn_vgg16_bn', - pretrained=True, - assume_straight_pages=True, - straighten_pages=False, - preserve_aspect_ratio=True, - ) - - elapsed = time.time() - start_time - print(f"[Worker {os.getpid()}] docTR loaded in {elapsed:.1f}s", flush=True) - return doctr - - except Exception as e: - print(f"[Worker {os.getpid()}] docTR init failed: {e}", flush=True) - return None - - -def process_ocr( - image_bytes: bytes, - paddle_engine, - tesseract_engine, - engine: str = "doctr_plus", - preprocessing: str = "auto", - doctr_engine=None -) -> dict: - """ - Process OCR on image bytes. - - Main entry point for OCR processing in worker process. - Uses the specified engine for text recognition. - - Args: - image_bytes: Raw image bytes (JPEG, PNG, or PDF) - paddle_engine: Pre-initialized PaddleOCR instance (or None) - tesseract_engine: Pre-initialized TesseractEngine instance (or None) - engine: Engine selection ('tesseract', 'doctr', 'doctr_plus', 'paddleocr') - preprocessing: Preprocessing mode ('auto', 'light', 'medium', 'heavy') - doctr_engine: Pre-initialized docTR instance (or None) - - Returns: - Dict with extraction results: - { - "success": bool, - "extraction": {...}, # ExtractionResult as dict - "raw_texts": [...], # Raw OCR outputs - "processing_time_ms": int, - "ocr_engine": str - } - """ - import sys - start_time = time.time() - print(f"[Worker {os.getpid()}] Processing OCR: engine={engine}, preprocessing={preprocessing}, size={len(image_bytes)} bytes", flush=True) - sys.stdout.flush() - - try: - # Decode image from bytes - print(f"[Worker {os.getpid()}] Decoding image...", flush=True) - sys.stdout.flush() - image = _decode_image(image_bytes) - if image is None: - return {"success": False, "error": "Failed to decode image"} - print(f"[Worker {os.getpid()}] Image decoded: shape={image.shape}, dtype={image.dtype}, size={image.nbytes/1024/1024:.1f}MB", flush=True) - sys.stdout.flush() - - # Import preprocessor - from backend.modules.data_entry.services.image_preprocessor import ImagePreprocessor - from backend.modules.data_entry.services.ocr_extractor import ReceiptExtractor - - preprocessor = ImagePreprocessor() - extractor = ReceiptExtractor() - print(f"[Worker {os.getpid()}] Preprocessor and extractor initialized", flush=True) - sys.stdout.flush() - - raw_texts = [] - extraction = None - - # Engine routing (available: tesseract, doctr, doctr_plus, paddleocr) - print(f"[Worker {os.getpid()}] Routing to engine: {engine}", flush=True) - sys.stdout.flush() - if engine == "tesseract": - extraction, raw_texts = _process_tesseract_only( - image, tesseract_engine, preprocessor, extractor - ) - elif engine == "doctr": - extraction, raw_texts = _process_doctr_only( - image, doctr_engine, preprocessor, extractor - ) - elif engine == "doctr_plus": - extraction, raw_texts = _process_doctr_plus( - image, doctr_engine, preprocessor, extractor - ) - elif engine == "paddleocr": - extraction, raw_texts = _process_paddleocr_only( - image, paddle_engine, preprocessor, extractor - ) - else: - # Default to doctr_plus if unknown engine specified - print(f"[OCR] Unknown engine '{engine}', defaulting to doctr_plus", flush=True) - extraction, raw_texts = _process_doctr_plus( - image, doctr_engine, preprocessor, extractor - ) - - # Calculate processing time - elapsed_ms = int((time.time() - start_time) * 1000) - - if extraction: - extraction.processing_time_ms = elapsed_ms - - # Convert extraction to dict for serialization - result = { - "success": extraction is not None, - "extraction": _extraction_to_dict(extraction) if extraction else None, - "raw_texts": raw_texts, - "processing_time_ms": elapsed_ms, - "ocr_engine": extraction.ocr_engine if extraction else "none", - "pid": os.getpid() - } - - print(f"[Worker {os.getpid()}] OCR complete in {elapsed_ms}ms", flush=True) - return result - - except Exception as e: - elapsed_ms = int((time.time() - start_time) * 1000) - print(f"[Worker {os.getpid()}] OCR error after {elapsed_ms}ms: {e}", flush=True) - import traceback - traceback.print_exc() - return { - "success": False, - "error": str(e), - "processing_time_ms": elapsed_ms, - "pid": os.getpid() - } - - finally: - # Cleanup memory - gc.collect() - - -def _decode_image(image_bytes: bytes) -> Optional[np.ndarray]: - """Decode image from bytes (JPEG, PNG, or first page of PDF). - - For PDFs, uses 200 DPI which is sufficient for receipt OCR - and reduces processing time by ~50% vs 300 DPI. - """ - try: - # Try as regular image first - nparr = np.frombuffer(image_bytes, np.uint8) - image = cv2.imdecode(nparr, cv2.IMREAD_COLOR) - - if image is not None: - return image - - # Try as PDF - use 200 DPI for faster processing (sufficient for receipts) - try: - import pdf2image - from PIL import Image - - # 200 DPI is sufficient for receipt text recognition - # 300 DPI was overkill and slowed down processing - images = pdf2image.convert_from_bytes(image_bytes, dpi=200) - if images: - # Convert first page to numpy array - pil_img = images[0] - print(f"[Worker {os.getpid()}] PDF decoded: {pil_img.width}x{pil_img.height} @ 200 DPI", flush=True) - return np.array(pil_img) - except Exception as e: - print(f"[Worker {os.getpid()}] PDF decode error: {e}", flush=True) - - return None - - except Exception as e: - print(f"[Worker {os.getpid()}] Image decode error: {e}", flush=True) - return None - - -def _process_paddleocr_only( - image: np.ndarray, - paddle_engine, - preprocessor, - extractor -) -> Tuple[Any, List[str]]: - """Process using PaddleOCR only (light + medium preprocessing).""" - raw_texts = [] - extraction = None - - if paddle_engine is None: - return None, ["PaddleOCR not available"] - - # Step 1: Light preprocessing - print("[OCR] Step 1: PaddleOCR + Light", flush=True) - light_img = preprocessor.preprocess_light(image) - paddle_light = _paddle_recognize(paddle_engine, light_img) - - if paddle_light and paddle_light.text: - extraction = extractor.extract(paddle_light.text) - extraction.ocr_engine = "paddle-light" - raw_texts.append(f"=== PaddleOCR Light (conf: {paddle_light.confidence:.0%}) ===\n{paddle_light.text}") - - if _is_extraction_complete(extraction): - return extraction, raw_texts - - # Step 2: Medium preprocessing - print("[OCR] Step 2: PaddleOCR + Medium", flush=True) - medium_img = preprocessor.preprocess_medium(image) - paddle_medium = _paddle_recognize(paddle_engine, medium_img) - - if paddle_medium and paddle_medium.text: - extraction_medium = extractor.extract(paddle_medium.text) - extraction_medium.ocr_engine = "paddle-medium" - raw_texts.append(f"=== PaddleOCR Medium (conf: {paddle_medium.confidence:.0%}) ===\n{paddle_medium.text}") - - if extraction: - extraction = _merge_extractions(extraction, extraction_medium) - extraction.ocr_engine = "paddle-adaptive" - else: - extraction = extraction_medium - - return extraction, raw_texts - - -def _process_tesseract_only( - image: np.ndarray, - tesseract_engine, - preprocessor, - extractor -) -> Tuple[Any, List[str]]: - """Process using Tesseract only with optimized preprocessing.""" - raw_texts = [] - extraction = None - - if tesseract_engine is None: - return None, ["Tesseract not available"] - - print("[OCR] Tesseract-only mode", flush=True) - tesseract_img = preprocessor.preprocess_for_tesseract(image) - tesseract_result = tesseract_engine.recognize(tesseract_img) - - if tesseract_result and tesseract_result.text: - extraction = extractor.extract(tesseract_result.text) - extraction.ocr_engine = "tesseract" - raw_texts.append(f"=== Tesseract (conf: {tesseract_result.confidence:.0%}) ===\n{tesseract_result.text}") - - return extraction, raw_texts - - -def _process_doctr_only( - image: np.ndarray, - doctr_engine, - preprocessor, - extractor -) -> Tuple[Any, List[str]]: - """ - Process using docTR only (light + medium preprocessing). - - docTR uses EXACT same preprocessing as PaddleOCR for consistency. - """ - raw_texts = [] - extraction = None - - if doctr_engine is None: - return None, ["docTR not available"] - - # Step 1: Light preprocessing (same as PaddleOCR) - print("[OCR] Step 1: docTR + Light", flush=True) - light_img = preprocessor.preprocess_light(image) - doctr_light = _doctr_recognize(doctr_engine, light_img) - - if doctr_light and doctr_light.text: - extraction = extractor.extract(doctr_light.text) - extraction.ocr_engine = "doctr-light" - raw_texts.append(f"=== docTR Light (conf: {doctr_light.confidence:.0%}) ===\n{doctr_light.text}") - - if _is_extraction_complete(extraction): - return extraction, raw_texts - - # Step 2: Medium preprocessing (same as PaddleOCR) - print("[OCR] Step 2: docTR + Medium", flush=True) - medium_img = preprocessor.preprocess_medium(image) - doctr_medium = _doctr_recognize(doctr_engine, medium_img) - - if doctr_medium and doctr_medium.text: - extraction_medium = extractor.extract(doctr_medium.text) - extraction_medium.ocr_engine = "doctr-medium" - raw_texts.append(f"=== docTR Medium (conf: {doctr_medium.confidence:.0%}) ===\n{doctr_medium.text}") - - if extraction: - extraction = _merge_extractions(extraction, extraction_medium) - extraction.ocr_engine = "doctr-adaptive" - else: - extraction = extraction_medium - - return extraction, raw_texts - - -def _process_doctr_plus( - image: np.ndarray, - doctr_engine, - preprocessor, - extractor -) -> Tuple[Any, List[str]]: - """ - docTR Plus - Optimized 2-tier sequential processing with early exit. - - Architecture: - - Tier 1: Light preprocessing (~4-5s) - → Early exit if confidence >= 0.75 AND all fields valid AND cross-validations pass - - Tier 2: Medium preprocessing (only if Tier 1 insufficient, ~4-5s additional) - → Merge with Tier 1 results - → Mark for review if still problems - - Performance: - - Fast path (80% receipts): ~4-5s (Tier 1 only) - - Slow path (20% receipts): ~8-9s (Tier 1 + Tier 2) - - Average: ~5-6s - - Returns: - Tuple of (extraction_result, raw_texts_list) - extraction_result.needs_review = True if validation issues remain - """ - raw_texts = [] - extraction = None - - if doctr_engine is None: - return None, ["docTR not available"] - - # ========== TIER 1: Light Preprocessing ========== - print("[docTR+] TIER 1: Light preprocessing", flush=True) - import time - tier1_start = time.time() - - light_img = preprocessor.preprocess_light(image) - doctr_light = _doctr_recognize(doctr_engine, light_img) - - tier1_time = time.time() - tier1_start - print(f"[docTR+] TIER 1 completed in {tier1_time:.1f}s", flush=True) - - if doctr_light and doctr_light.text: - extraction = extractor.extract(doctr_light.text) - extraction.ocr_engine = "doctr-plus-light" - raw_texts.append(f"=== docTR+ Tier1/Light (conf: {doctr_light.confidence:.0%}) ===\n{doctr_light.text}") - - # Early Exit Check: confidence >= 0.75 + cross-validations - if _is_extraction_valid_for_early_exit(extraction, min_confidence=0.75): - print(f"[docTR+] EARLY EXIT - Tier 1 sufficient (conf: {extraction.overall_confidence:.0%})", flush=True) - extraction.ocr_engine = "doctr-plus" - return extraction, raw_texts - - print(f"[docTR+] Tier 1 incomplete or validation failed, proceeding to Tier 2...", flush=True) - - # ========== TIER 2: Medium Preprocessing (only if needed) ========== - print("[docTR+] TIER 2: Medium preprocessing", flush=True) - tier2_start = time.time() - - medium_img = preprocessor.preprocess_medium(image) - doctr_medium = _doctr_recognize(doctr_engine, medium_img) - - tier2_time = time.time() - tier2_start - print(f"[docTR+] TIER 2 completed in {tier2_time:.1f}s", flush=True) - - if doctr_medium and doctr_medium.text: - extraction_medium = extractor.extract(doctr_medium.text) - extraction_medium.ocr_engine = "doctr-plus-medium" - raw_texts.append(f"=== docTR+ Tier2/Medium (conf: {doctr_medium.confidence:.0%}) ===\n{doctr_medium.text}") - - if extraction: - # Merge Tier 1 + Tier 2 results - extraction = _merge_extractions(extraction, extraction_medium) - else: - extraction = extraction_medium - - # ========== FINAL VALIDATION ========== - if extraction: - extraction.ocr_engine = "doctr-plus" - - # Mark for review if validation still fails after both tiers - passes_validation, penalty, errors = _quick_cross_validate(extraction) - - if not passes_validation or extraction.overall_confidence < 0.75: - # Mark for human review using existing fields - extraction.needs_manual_review = True - - if extraction.overall_confidence < 0.75: - extraction.validation_warnings.append(f"Low confidence: {extraction.overall_confidence:.0%}") - - if not extraction.amount: - extraction.validation_errors.append("TOTAL not detected") - if not extraction.cui: - extraction.validation_warnings.append("CUI not detected") - if not extraction.tva_total and not extraction.tva_entries: - extraction.validation_warnings.append("TVA not detected") - if not extraction.receipt_date: - extraction.validation_warnings.append("Date not detected") - - # Add cross-validation errors - extraction.validation_errors.extend(errors) - - print(f"[docTR+] Marked for review: {extraction.validation_errors + extraction.validation_warnings}", flush=True) - else: - extraction.needs_manual_review = False - - total_time = tier1_time + (tier2_time if 'tier2_time' in dir() else 0) - print(f"[docTR+] Total processing time: {total_time:.1f}s", flush=True) - - return extraction, raw_texts - - -# ============================================================================= -# VALIDATION HELPERS (used by doctr_plus for early exit decisions) -# ============================================================================= - -def _quick_cross_validate(extraction) -> tuple[bool, float, list[str]]: - """ - Quick cross-validation for OCR results. - - Checks critical field correlations to detect obvious OCR errors. - Used by doctr_plus to decide whether to proceed to Tier 2 or exit early. - - Returns: - Tuple of (passes_validation, confidence_penalty, error_messages) - """ - try: - from backend.modules.data_entry.services.ocr.validation import OCRValidationEngine - - if extraction is None: - return False, 1.0, ["No extraction result"] - - # Convert extraction to dict for validation - # Build TVA entries dict for TVAEntriesSumRule (expects {code: amount}) - tva_entries_dict = {} - if extraction.tva_entries: - for entry in extraction.tva_entries: - if isinstance(entry, dict): - code = entry.get('code', 'A') - amount = entry.get('amount', 0) - try: - tva_entries_dict[code] = float(amount) - except (TypeError, ValueError): - pass - - validation_data = { - "amount": float(extraction.amount) if extraction.amount else None, - "tva": float(extraction.tva_total) if extraction.tva_total else None, - "tva_entries": tva_entries_dict, # For TVAEntriesSumRule: {code: amount} - "cui": extraction.cui, # For CUI checksum validation - } - - # Also pass raw tva_entries for TVABasedTotalRule (for rate detection) - if extraction.tva_entries: - validation_data['tva_entries_raw'] = extraction.tva_entries - - # Add payment methods if available (for TOTAL vs CARD+CASH validation) - if extraction.payment_methods: - try: - card_amount = sum( - float(p.get('amount', 0) if isinstance(p, dict) else 0) - for p in extraction.payment_methods - if isinstance(p, dict) and p.get('method') == 'CARD' - ) - cash_amount = sum( - float(p.get('amount', 0) if isinstance(p, dict) else 0) - for p in extraction.payment_methods - if isinstance(p, dict) and p.get('method') == 'NUMERAR' - ) - validation_data['card_amount'] = card_amount - validation_data['cash_amount'] = cash_amount - except Exception as e: - print(f"[Worker {os.getpid()}] Payment method validation error: {e}", flush=True) - - # Run quick validation - validator = OCRValidationEngine() - return validator.quick_validate_for_hybrid(validation_data) - - except Exception as e: - # Never crash the process on validation errors - print(f"[Worker {os.getpid()}] Cross-validation error: {e}", flush=True) - import traceback - traceback.print_exc() - # Return "passes" to allow processing to continue - return True, 0.0, [f"Validation skipped due to error: {str(e)}"] - - -def _is_extraction_valid_for_early_exit(extraction, min_confidence: float = 0.85) -> bool: - """ - Check if extraction is valid for early exit in doctr_plus. - - Combines confidence check with cross-validation to prevent - early exit on OCR errors (e.g., wrong TOTAL but correct TVA). - - Returns: - True only if: - 1. Overall confidence >= min_confidence - 2. Critical fields are present (AMOUNT, DATE, CUI) - 3. Cross-validation passes (TOTAL matches TVA calculation, or no TVA) - """ - try: - # First check basic completeness (relaxed for early exit) - if not _is_extraction_complete(extraction, min_confidence, for_early_exit=True): - return False - - # Then run cross-validation - passes_validation, penalty, errors = _quick_cross_validate(extraction) - - if not passes_validation: - print(f"[Early Exit] BLOCKED: cross-validation failed: {errors}", flush=True) - return False - - print(f"[Early Exit] OK: conf={extraction.overall_confidence:.0%}, validation passed", flush=True) - return True - - except Exception as e: - # Never crash on validation - just continue to next engine - print(f"[Worker {os.getpid()}] Early exit check error: {e}", flush=True) - return False # Continue to next engine on error - -def _paddle_recognize(paddle_engine, image: np.ndarray) -> Optional[OCRResult]: - """Run PaddleOCR recognition on image.""" - try: - # Ensure 3-channel image - if len(image.shape) == 2: - image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) - - result = paddle_engine.predict(image, use_textline_orientation=True) - - if not result or len(result) == 0: - return OCRResult(text="", confidence=0.0, boxes=[], engine="paddleocr") - - ocr_result = result[0] - rec_texts = ocr_result.get('rec_texts', []) - rec_scores = ocr_result.get('rec_scores', []) - dt_polys = ocr_result.get('dt_polys', []) - - if not rec_texts: - return OCRResult(text="", confidence=0.0, boxes=[], engine="paddleocr") - - boxes = [] - for i, text in enumerate(rec_texts): - conf = rec_scores[i] if i < len(rec_scores) else 0.0 - box = dt_polys[i].tolist() if i < len(dt_polys) else [] - boxes.append({'text': text, 'confidence': float(conf), 'box': box}) - - avg_conf = sum(rec_scores) / len(rec_scores) if rec_scores else 0.0 - text_result = '\n'.join(rec_texts) - - return OCRResult( - text=text_result, - confidence=float(avg_conf), - boxes=boxes, - engine="paddleocr" - ) - - except Exception as e: - print(f"[Worker] PaddleOCR error: {e}", flush=True) - return None - - -def _doctr_recognize(doctr_engine, image: np.ndarray) -> Optional[OCRResult]: - """ - Run docTR recognition on image. - - docTR requires RGB images, handles conversion automatically. - Uses same preprocessing as PaddleOCR for consistent results. - """ - try: - # docTR requires RGB images - if len(image.shape) == 2: - # Convert grayscale to RGB - image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB) - elif image.shape[2] == 3: - # Convert BGR (OpenCV) to RGB - image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) - elif image.shape[2] == 4: - # Convert RGBA to RGB - image = cv2.cvtColor(image, cv2.COLOR_RGBA2RGB) - - # docTR expects a list of numpy arrays (pages) - result = doctr_engine([image]) - - if not result or not result.pages: - return OCRResult(text="", confidence=0.0, boxes=[], engine="doctr") - - # Extract text from all pages - all_texts = [] - all_confidences = [] - boxes = [] - - for page in result.pages: - for block in page.blocks: - for line in block.lines: - line_text = ' '.join(word.value for word in line.words) - line_confidence = sum(w.confidence for w in line.words) / len(line.words) if line.words else 0.0 - all_texts.append(line_text) - all_confidences.append(line_confidence) - - # Store word-level boxes - for word in line.words: - boxes.append({ - 'text': word.value, - 'confidence': float(word.confidence), - 'box': word.geometry # (xmin, ymin), (xmax, ymax) - }) - - text_result = '\n'.join(all_texts) - avg_conf = sum(all_confidences) / len(all_confidences) if all_confidences else 0.0 - - return OCRResult( - text=text_result, - confidence=float(avg_conf), - boxes=boxes, - engine="doctr" - ) - - except Exception as e: - print(f"[Worker] docTR error: {e}", flush=True) - return None - - -def _is_extraction_complete(ext, min_confidence: float = 0.85, for_early_exit: bool = False) -> bool: - """ - Check if extraction has required fields. - - Args: - ext: Extraction result - min_confidence: Minimum overall confidence - for_early_exit: If True, use relaxed criteria (AMOUNT + DATE + CUI required) - If False, require all fields (strict mode for final validation) - - Returns: - True if extraction meets completeness criteria - """ - # Check confidence first - if ext.overall_confidence < min_confidence: - if for_early_exit: - print(f"[Early Exit] BLOCKED: confidence {ext.overall_confidence:.0%} < {min_confidence:.0%}", flush=True) - return False - - has_date = bool(ext.receipt_date) - has_amount = bool(ext.amount) - has_tva = bool(ext.tva_total) or bool(ext.tva_entries) - has_cui = bool(ext.cui) - - if for_early_exit: - # Relaxed criteria for early exit: - # - AMOUNT is required (core field) - # - DATE is required (needed for accounting) - # - CUI is required (needed for supplier identification) - # - TVA is NOT required (some receipts have 0% TVA) - # - receipt_number is NOT required (often missing) - required_ok = all([has_amount, has_date, has_cui]) - - if not required_ok: - missing = [] - if not has_amount: missing.append("AMOUNT") - if not has_date: missing.append("DATE") - if not has_cui: missing.append("CUI") - print(f"[Early Exit] BLOCKED: missing required fields: {', '.join(missing)}", flush=True) - - return required_ok - else: - # Strict criteria for final validation (all fields required) - has_number = bool(ext.receipt_number) - return all([has_number, has_date, has_amount, has_tva, has_cui]) - - -def _merge_extractions(primary, secondary): - """Merge two extractions, picking best fields from each. - - Primary should be the higher-quality engine (e.g., docTR). - Secondary is the fallback engine (e.g., Tesseract). - - Priority logic: - - AMOUNT: TVA validation wins over confidence. If both valid or both invalid, - uses confidence (or TVA diff for invalid cases). - - DATE/CUI: Validation-based, then confidence, then primary wins ties. - - OTHER FIELDS: Primary wins when both have values. - """ - from backend.modules.data_entry.services.ocr_extractor import ExtractionResult - - result = ExtractionResult() - - # Helper: Check if amount matches TVA calculation - def amount_passes_tva_validation(amount, tva_total, tva_entries): - if not amount or not tva_total: - return False, 0.0 - try: - tva_rate = 0.21 # Default Romanian TVA - if tva_entries: - for entry in tva_entries: - if isinstance(entry, dict) and entry.get('percent'): - tva_rate = float(entry['percent']) / 100.0 - break - # Expected TOTAL = TVA / rate * (1 + rate) - expected = float(tva_total) * (1 + tva_rate) / tva_rate - actual = float(amount) - diff_percent = abs(actual - expected) / expected if expected > 0 else 1.0 - return diff_percent < 0.03, diff_percent # 3% tolerance - except: - return False, 1.0 - - # Amount - prefer TVA-validated value over confidence - if primary.amount and secondary.amount: - # Get TVA from the one with entries, or use any available - tva_total = primary.tva_total or secondary.tva_total - tva_entries = primary.tva_entries or secondary.tva_entries - - primary_valid, primary_diff = amount_passes_tva_validation( - primary.amount, tva_total, tva_entries - ) - secondary_valid, secondary_diff = amount_passes_tva_validation( - secondary.amount, tva_total, tva_entries - ) - - print(f"[Merge] Amount comparison: primary={primary.amount} (valid={primary_valid}, diff={primary_diff:.1%}), " - f"secondary={secondary.amount} (valid={secondary_valid}, diff={secondary_diff:.1%})", flush=True) - - if secondary_valid and not primary_valid: - # Secondary passes validation, primary doesn't - use secondary! - print(f"[Merge] Using secondary amount {secondary.amount} (passes TVA validation)", flush=True) - result.amount = secondary.amount - result.confidence_amount = secondary.confidence_amount - elif primary_valid and not secondary_valid: - # Primary passes validation - result.amount = primary.amount - result.confidence_amount = primary.confidence_amount - elif primary_valid and secondary_valid: - # Both valid - use higher confidence - if primary.confidence_amount >= secondary.confidence_amount: - result.amount = primary.amount - result.confidence_amount = primary.confidence_amount - else: - result.amount = secondary.amount - result.confidence_amount = secondary.confidence_amount - else: - # Neither valid - use the one closer to TVA calculation - if secondary_diff < primary_diff: - print(f"[Merge] Neither valid, using secondary {secondary.amount} (closer to TVA)", flush=True) - result.amount = secondary.amount - result.confidence_amount = secondary.confidence_amount - else: - result.amount = primary.amount - result.confidence_amount = primary.confidence_amount - elif primary.amount: - result.amount = primary.amount - result.confidence_amount = primary.confidence_amount - elif secondary.amount: - result.amount = secondary.amount - result.confidence_amount = secondary.confidence_amount - - # Date - prefer higher confidence - if primary.receipt_date and secondary.receipt_date: - if primary.confidence_date >= secondary.confidence_date: - result.receipt_date = primary.receipt_date - result.confidence_date = primary.confidence_date - else: - result.receipt_date = secondary.receipt_date - result.confidence_date = secondary.confidence_date - elif primary.receipt_date: - result.receipt_date = primary.receipt_date - result.confidence_date = primary.confidence_date - elif secondary.receipt_date: - result.receipt_date = secondary.receipt_date - result.confidence_date = secondary.confidence_date - - # CUI - prefer valid format and version with RO prefix - # Use CUIChecksumRule static methods (single source of truth) - from backend.modules.data_entry.services.ocr.validation import CUIChecksumRule - - def is_valid_cui(cui): - if not cui: - return False - digits = CUIChecksumRule.extract_digits(cui) - return len(digits) >= 6 and len(digits) <= 10 - - if primary.cui and secondary.cui: - if is_valid_cui(primary.cui) and not is_valid_cui(secondary.cui): - result.cui = primary.cui - elif is_valid_cui(secondary.cui) and not is_valid_cui(primary.cui): - result.cui = secondary.cui - else: - # Both valid - prefer the one with RO prefix if digits match - primary_digits = CUIChecksumRule.extract_digits(primary.cui) - secondary_digits = CUIChecksumRule.extract_digits(secondary.cui) - if primary_digits == secondary_digits: - if CUIChecksumRule.has_ro_prefix(secondary.cui) and not CUIChecksumRule.has_ro_prefix(primary.cui): - result.cui = secondary.cui # Prefer version with RO - print(f"[CUI Complement] Preferring secondary with RO: {secondary.cui}", flush=True) - else: - result.cui = primary.cui - else: - result.cui = primary.cui - elif primary.cui: - result.cui = primary.cui - elif secondary.cui: - result.cui = secondary.cui - - # TVA entries - ALWAYS prefer primary (docTR) when both have entries - if primary.tva_entries and secondary.tva_entries: - # Always use primary (docTR) - higher quality OCR - result.tva_entries = primary.tva_entries - result.tva_total = primary.tva_total - result.confidence_tva = getattr(primary, 'confidence_tva', 0.0) - elif primary.tva_entries: - result.tva_entries = primary.tva_entries - result.tva_total = primary.tva_total - result.confidence_tva = getattr(primary, 'confidence_tva', 0.0) - elif secondary.tva_entries: - result.tva_entries = secondary.tva_entries - result.tva_total = secondary.tva_total - result.confidence_tva = getattr(secondary, 'confidence_tva', 0.0) - - # Other fields - prefer primary - result.receipt_number = primary.receipt_number or secondary.receipt_number - result.receipt_series = primary.receipt_series or secondary.receipt_series - result.receipt_type = primary.receipt_type or secondary.receipt_type - result.partner_name = primary.partner_name or secondary.partner_name - result.address = primary.address or secondary.address - result.items_count = primary.items_count or secondary.items_count - # Payment methods with confidence - if primary.payment_methods: - result.payment_methods = primary.payment_methods - result.confidence_payment = getattr(primary, 'confidence_payment', 0.0) - elif secondary.payment_methods: - result.payment_methods = secondary.payment_methods - result.confidence_payment = getattr(secondary, 'confidence_payment', 0.0) - result.suggested_payment_mode = getattr(primary, 'suggested_payment_mode', None) or getattr(secondary, 'suggested_payment_mode', None) - - # Client fields - result.client_name = primary.client_name or secondary.client_name - result.client_cui = primary.client_cui or secondary.client_cui - result.client_address = primary.client_address or secondary.client_address - - # Confidence fields - preserve from primary or pick best - if primary.confidence_vendor >= secondary.confidence_vendor: - result.confidence_vendor = primary.confidence_vendor - else: - result.confidence_vendor = secondary.confidence_vendor - - if hasattr(primary, 'confidence_client') and hasattr(secondary, 'confidence_client'): - if primary.confidence_client >= secondary.confidence_client: - result.confidence_client = primary.confidence_client - else: - result.confidence_client = secondary.confidence_client - - # Raw text - combine both for debugging/display - raw_texts = [] - if primary.raw_text: - raw_texts.append(primary.raw_text) - if secondary.raw_text and secondary.raw_text != primary.raw_text: - raw_texts.append(secondary.raw_text) - result.raw_text = '\n---\n'.join(raw_texts) if raw_texts else '' - - # Note: overall_confidence is a computed @property on ExtractionResult - # It automatically calculates from confidence_amount, confidence_date, confidence_vendor - - return result - - -def _complement_extraction(primary, secondary): - """Complement primary with missing fields from secondary (never overrides).""" - # Only fill missing fields - if not primary.amount and secondary.amount: - primary.amount = secondary.amount - primary.confidence_amount = secondary.confidence_amount - - if not primary.receipt_date and secondary.receipt_date: - primary.receipt_date = secondary.receipt_date - primary.confidence_date = secondary.confidence_date - - if not primary.partner_name and secondary.partner_name: - primary.partner_name = secondary.partner_name - primary.confidence_vendor = secondary.confidence_vendor - - if not primary.cui and secondary.cui: - primary.cui = secondary.cui - - if not primary.tva_entries and secondary.tva_entries: - primary.tva_entries = secondary.tva_entries - primary.tva_total = secondary.tva_total - primary.confidence_tva = getattr(secondary, 'confidence_tva', 0.0) - - if not getattr(primary, 'payment_methods', None) and getattr(secondary, 'payment_methods', None): - primary.payment_methods = secondary.payment_methods - primary.confidence_payment = getattr(secondary, 'confidence_payment', 0.0) - - if not primary.receipt_number and secondary.receipt_number: - primary.receipt_number = secondary.receipt_number - - if not primary.address and secondary.address: - primary.address = secondary.address - - if not primary.client_name and secondary.client_name: - primary.client_name = secondary.client_name - primary.client_cui = secondary.client_cui - primary.client_address = secondary.client_address - - return primary - - -def _extraction_to_dict(extraction) -> dict: - """Convert ExtractionResult to serializable dict.""" - if extraction is None: - return None - - def safe_decimal(val): - if val is None: - return None - return float(val) if isinstance(val, Decimal) else val - - def safe_date(val): - if val is None: - return None - return val.isoformat() if hasattr(val, 'isoformat') else str(val) - - return { - "receipt_type": extraction.receipt_type, - "receipt_number": extraction.receipt_number, - "receipt_series": extraction.receipt_series, - "receipt_date": safe_date(extraction.receipt_date), - "amount": safe_decimal(extraction.amount), - "partner_name": extraction.partner_name, - "cui": extraction.cui, - "description": extraction.description, - "tva_entries": extraction.tva_entries, - "tva_total": safe_decimal(extraction.tva_total), - "address": extraction.address, - "items_count": extraction.items_count, - "payment_methods": extraction.payment_methods, - "suggested_payment_mode": getattr(extraction, 'suggested_payment_mode', None), - # Client data - "client_name": extraction.client_name, - "client_cui": extraction.client_cui, - "client_address": extraction.client_address, - # Confidence scores - "confidence_amount": extraction.confidence_amount, - "confidence_date": extraction.confidence_date, - "confidence_vendor": extraction.confidence_vendor, - "confidence_client": getattr(extraction, 'confidence_client', 0.0), - "confidence_tva": getattr(extraction, 'confidence_tva', 0.0), - "confidence_payment": getattr(extraction, 'confidence_payment', 0.0), - "overall_confidence": extraction.overall_confidence, - "raw_text": extraction.raw_text, - "ocr_engine": extraction.ocr_engine, - "processing_time_ms": extraction.processing_time_ms, - # Validation (if present) - "needs_manual_review": getattr(extraction, 'needs_manual_review', None), - "validation_warnings": getattr(extraction, 'validation_warnings', []), - "validation_errors": getattr(extraction, 'validation_errors', []), - "inter_ocr_ratios": getattr(extraction, 'inter_ocr_ratios', {}), - } diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/profiles/README.md b/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/profiles/README.md deleted file mode 100644 index 65c7695..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/profiles/README.md +++ /dev/null @@ -1,258 +0,0 @@ -# Store Profiles - OCR Extraction - -Sistem de profile specifice pentru extracție OCR cu hot-reload. - ---- - -## Quick Start: Adaugă un profil nou - -```bash -# 1. Generează profil din PDF-uri (dry-run pentru preview) -python scripts/generate_store_profile.py \ - --name "Magazin Nou SRL" \ - --cui "12345678" \ - --receipts "docs/data-entry/MagazinNou*.pdf" \ - --dry-run - -# 2. Generează și salvează -python scripts/generate_store_profile.py \ - --name "Magazin Nou SRL" \ - --cui "12345678" \ - --receipts "docs/data-entry/MagazinNou*.pdf" \ - --output backend/modules/data_entry/services/ocr/profiles/magazin_nou.py - -# 3. Hot-reload (fără restart server) -curl -X POST http://localhost:8000/api/data-entry/ocr/profiles/reload - -# 4. Verifică -curl http://localhost:8000/api/data-entry/ocr/profiles -``` - ---- - -## Structura directorului - -``` -profiles/ -├── __init__.py # ProfileRegistry + hot-reload (~390 linii) -├── base.py # BaseStoreProfile + pattern-uri generice (~410 linii) -├── lidl.py # Multi-rate TVA (A/B) -├── omv.py # B2B, date YYYY.MM.DD -├── socar.py # B2B, date YYYY.MM.DD -├── brick.py # Standard TVA -├── dedeman.py # E-factura support -├── kineterra.py # Non-VAT payer -├── gama_ink.py # Standard TVA (toner/cartușe) -├── electrobering.py # Standard TVA (electronice) -├── pictus_velum.py # Standard TVA (rechizite) -├── unlimited_keys.py # Standard TVA, NUMERAR payment -├── best_print.py # Non-VAT payer (neplătitor TVA) -├── stepout_market.py # TVA 5% (cărți/librărie) -└── README.md # Acest fișier -``` - ---- - -## Profile existente (12 profile) - -> **Note**: Pattern-urile TVA sunt **flexibile** și acceptă ORICE cotă (5%, 9%, 11%, 19%, 21%, etc.) -> pentru a gestiona atât datele istorice cât și schimbările viitoare ale legislației. - -| Magazin | CUI | Fișier | Caracteristici | -|---------|-----|--------|----------------| -| LIDL DISCOUNT S.R.L. | 22891860 | `lidl.py` | Multi-rate TVA (coduri A, B, C, D) | -| OMV PETROM MARKETING S.R.L. | 11201891 | `omv.py` | B2B (client CUI), date YYYY.MM.DD | -| SOCAR PETROLEUM S.A. | 12546600 | `socar.py` | B2B (client CUI), date YYYY.MM.DD | -| FIVE-HOLDING S.A. (BRICK) | 10562600 | `brick.py` | Standard TVA | -| DEDEMAN SRL | 2816464 | `dedeman.py` | E-factura support | -| KINETERRA CONCEPT SRL | 31180432 | `kineterra.py` | Non-VAT payer (returnează `[]`) | -| GAMA INK SERVICE SRL | 17741882 | `gama_ink.py` | Standard TVA (toner, cartușe) | -| ELECTROBERING S.R.L. | 2744937 | `electrobering.py` | Standard TVA (electronice) | -| PICTUS VELUM SRL | 39634534 | `pictus_velum.py` | Standard TVA (rechizite) | -| UNLIMITED KEYS S.R.L. | 18993187 | `unlimited_keys.py` | Standard TVA, **NUMERAR** plată | -| BEST PRINT TRADE ACTIV SRL | 45417955 | `best_print.py` | **Non-VAT payer** (neplătitor TVA) | -| STEPOUT MARKET SRL | 35532655 | `stepout_market.py` | TVA 5% (cărți, librărie) | - ---- - -## API Endpoints - -| Endpoint | Metodă | Descriere | -|----------|--------|-----------| -| `/api/data-entry/ocr/profiles` | GET | Lista toate profilele | -| `/api/data-entry/ocr/profiles/{cui}` | GET | Detalii profil (acceptă RO prefix) | -| `/api/data-entry/ocr/profiles/reload` | POST | Hot-reload toate profilele | - -### Exemple API - -```bash -# Lista profile -curl http://localhost:8000/api/data-entry/ocr/profiles \ - -H "Authorization: Bearer " - -# Detalii profil (cu sau fără RO prefix) -curl http://localhost:8000/api/data-entry/ocr/profiles/22891860 -curl http://localhost:8000/api/data-entry/ocr/profiles/RO22891860 - -# Hot-reload după modificări -curl -X POST http://localhost:8000/api/data-entry/ocr/profiles/reload \ - -H "Authorization: Bearer " - -# Response reload: -{ - "success": true, - "reloaded_modules": 12, - "profiles_count": 12, - "registered_cuis": ["22891860", "11201891", "12546600", "10562600", ...], - "last_reload": "2026-01-06T22:37:05.000000" -} -``` - ---- - -## Cum funcționează sistemul - -### Flow de extracție - -``` -ReceiptExtractor.extract() - │ - ├─► STEP 1: Extrage vendor + CUI - │ └─► _extract_vendor(), _extract_cui() - │ - ├─► ProfileRegistry.get_profile(cui) - │ └─► Returnează profil specific sau None - │ - ├─► STEP 2: Extracție cu profil (dacă există) - │ ├─► profile.extract_total() - │ ├─► profile.extract_date() - │ ├─► profile.extract_receipt_number() - │ ├─► profile.extract_tva_entries() - │ ├─► profile.extract_payment_methods() - │ └─► profile.extract_client_cui() - │ - └─► STEP 3-4: Validare + post-procesare -``` - -### Fallback - -Dacă nu există profil pentru CUI, se folosește logica generică din `ReceiptExtractor`. - ---- - -## Structura unui profil - -```python -from .base import BaseStoreProfile -from . import ProfileRegistry - -@ProfileRegistry.register -class MagazinNouProfile(BaseStoreProfile): - """Docstring cu descriere magazin.""" - - CUI_LIST = ["12345678"] # Poate avea mai multe CUI-uri - NAME_PATTERNS = ["MAGAZIN", "MAGAZIN NOU", "MAG4ZIN"] # OCR variants - STORE_NAME = "Magazin Nou SRL" - - # Override doar ce e diferit de base class - def extract_tva_entries(self, text: str) -> List[dict]: - # Pattern-uri specifice magazinului - ... - - def get_validation_hints(self) -> Dict[str, Any]: - return { - "has_multi_rate_tva": False, - "card_equals_total": True, - "has_client_cui": False, - "has_efactura": False, - "is_non_vat_payer": False, - } -``` - ---- - -## Pattern-uri disponibile în base.py - -BaseStoreProfile include pattern-uri generice OCR-tolerant: - -| Pattern | Descriere | -|---------|-----------| -| `TOTAL_PATTERNS` | 8 variante pentru TOTAL (TOTAL:, TOTAL DE PLATA, etc.) | -| `DATE_PATTERNS` | 6 variante (DD.MM.YYYY, YYYY-MM-DD, DD/MM/YYYY) | -| `DATE_PATTERNS_OCR_SPACES` | 4 variante cu spații OCR ("2025. 08. 14") | -| `NUMBER_PATTERNS` | 11 variante pentru număr bon (NDS, BF, C3POS) | -| `PAYMENT_PATTERNS` | 8 variante pentru CARD/NUMERAR | -| `CLIENT_MARKERS` | 6 variante pentru secțiune CLIENT | -| `CLIENT_CUI_PATTERNS` | 7 variante pentru CUI client | - -### Metode implementate în base class - -- `extract_total(text)` → `Tuple[Decimal, float]` -- `extract_date(text)` → `Tuple[date, float]` -- `extract_receipt_number(text)` → `Tuple[str, float]` -- `extract_payment_methods(text)` → `List[dict]` -- `extract_client_cui(text)` → `Tuple[str, float]` -- `extract_client_name(text)` → `Tuple[str, float]` - ---- - -## Când ai nevoie de profil custom? - -| Situație | Exemplu | Ce trebuie override | -|----------|---------|---------------------| -| **Multi-rate TVA** | Lidl (TVA A, TVA B) | `extract_tva_entries()` | -| **Format dată special** | OMV/Socar (YYYY.MM.DD) | `DATE_PATTERNS_OCR_SPACES` | -| **B2B receipts** | Benzinării (au client CUI) | `extract_client_cui()` | -| **Non-VAT payer** | Kineterra | `extract_tva_entries()` returnează `[]` | -| **E-factura** | Dedeman | `extract_efactura_reference()` | - ---- - -## Decizii de design - -1. **Hot-reload manual** - endpoint `/profiles/reload` apelat când se modifică fișiere -2. **Persistență în Python** - profile în Git, version controlled -3. **Fallback graceful** - dacă nu există profil, folosește logica generică -4. **CUI normalization** - gestionează automat prefixul "RO" și whitespace -5. **Deduplicare TVA** - folosește `seen = set()` pentru a evita duplicate - ---- - -## Comenzi utile - -```bash -# Verifică syntax Python pentru toate profilele -for f in backend/modules/data_entry/services/ocr/profiles/*.py; do - python3 -m py_compile "$f" && echo "✓ $(basename $f)" -done - -# Lista profile -ls -la backend/modules/data_entry/services/ocr/profiles/ - -# Pornește backend pentru testare -cd backend && source venv/bin/activate -uvicorn main:app --host 0.0.0.0 --port 8000 --workers 1 - -# Test OCR pe un PDF -curl -X POST -F "file=@docs/data-entry/test.pdf" \ - -H "Authorization: Bearer " \ - "http://localhost:8000/api/data-entry/ocr/extract?engine=doctr_plus" -``` - ---- - -## Script generare profile - -`scripts/generate_store_profile.py` - generator automat de profile - -```bash -# Vezi help -python scripts/generate_store_profile.py --help - -# Funcționalități: -# - Analizează PDF-uri via OCR API -# - Detectează: TVA format, date format, payment patterns, B2B -# - Generează cod Python cu OCR error variants -# - Suportă glob patterns (*.pdf) -# - Verifică sintaxa după generare -``` diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/profiles/__init__.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/profiles/__init__.py deleted file mode 100644 index 2470174..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/profiles/__init__.py +++ /dev/null @@ -1,398 +0,0 @@ -""" -Store Profiles Registry with Hot-Reload Support. - -This module provides a registry for store-specific OCR extraction profiles. -Profiles can be reloaded at runtime without restarting the server. - -Usage: - from backend.modules.data_entry.services.ocr.profiles import ProfileRegistry - - # Get profile for a CUI - profile = ProfileRegistry.get_profile("22891860") - if profile: - tva_entries = profile.extract_tva_entries(text) - - # Reload all profiles (after file changes) - count = ProfileRegistry.reload_all() - -Architecture: - - ProfileRegistry: Singleton registry with class methods - - BaseStoreProfile: Abstract base class for profiles - - @ProfileRegistry.register: Decorator for profile classes - -Hot-Reload Mechanism: - 1. Admin calls POST /profiles/reload endpoint - 2. Registry clears instance cache - 3. importlib.reload() re-executes each profile module - 4. @register decorator re-registers classes with new code -""" - -from __future__ import annotations - -import importlib -import logging -import sys -from datetime import datetime -from pathlib import Path -from typing import Dict, List, Optional, Type, TYPE_CHECKING - -if TYPE_CHECKING: - from .base import BaseStoreProfile - -logger = logging.getLogger(__name__) - -# Directory containing profile modules -PROFILES_DIR = Path(__file__).parent - - -class ProfileRegistry: - """ - Registry for store-specific OCR extraction profiles. - - Uses class methods for singleton-like behavior without explicit instantiation. - Supports hot-reload via importlib.reload() for runtime updates. - - Attributes: - _profiles: Maps CUI -> profile class (not instance) - _instances: Maps CUI -> profile instance (lazy, cleared on reload) - _last_reload: Timestamp of last reload - _loaded: Whether initial load has been performed - """ - - # Class-level storage (singleton pattern via class methods) - _profiles: Dict[str, Type["BaseStoreProfile"]] = {} - _instances: Dict[str, "BaseStoreProfile"] = {} - _last_reload: Optional[datetime] = None - _loaded: bool = False - - # ------------------------------------------------------------------------- - # Registration - # ------------------------------------------------------------------------- - - @classmethod - def register(cls, profile_class: Type["BaseStoreProfile"]) -> Type["BaseStoreProfile"]: - """ - Decorator to register a store profile class. - - Registers the profile for all CUIs in the class's CUI_LIST. - Safe for re-registration during hot-reload (overwrites existing). - - Usage: - @ProfileRegistry.register - class LidlProfile(BaseStoreProfile): - CUI_LIST = ["22891860"] - ... - - Args: - profile_class: Profile class to register - - Returns: - The same class (allows use as decorator) - - Raises: - ValueError: If CUI_LIST is empty - """ - cui_list = getattr(profile_class, 'CUI_LIST', []) - store_name = getattr(profile_class, 'STORE_NAME', profile_class.__name__) - - if not cui_list: - logger.warning(f"Profile {profile_class.__name__} has empty CUI_LIST, skipping") - return profile_class - - # Register for each CUI - for cui in cui_list: - # Normalize CUI (remove RO prefix, strip whitespace) - normalized_cui = cls._normalize_cui(cui) - - if normalized_cui in cls._profiles: - old_class = cls._profiles[normalized_cui] - logger.debug( - f"Re-registering CUI {normalized_cui}: " - f"{old_class.__name__} -> {profile_class.__name__}" - ) - # Clear cached instance for this CUI - cls._instances.pop(normalized_cui, None) - - cls._profiles[normalized_cui] = profile_class - logger.debug(f"Registered profile {profile_class.__name__} for CUI {normalized_cui}") - - logger.info(f"Registered {store_name} for CUIs: {cui_list}") - return profile_class - - # ------------------------------------------------------------------------- - # Lookup - # ------------------------------------------------------------------------- - - @classmethod - def get_profile(cls, cui: Optional[str]) -> Optional["BaseStoreProfile"]: - """ - Get profile instance for a CUI. - - Uses lazy instantiation - creates instance on first access. - Returns None if no profile is registered for this CUI. - - Args: - cui: CUI to lookup (with or without RO prefix) - - Returns: - Profile instance or None - """ - if not cui: - return None - - # Ensure profiles are loaded - if not cls._loaded: - cls._load_all_profiles() - - normalized_cui = cls._normalize_cui(cui) - - # Check if profile exists - profile_class = cls._profiles.get(normalized_cui) - if not profile_class: - return None - - # Lazy instantiation - if normalized_cui not in cls._instances: - try: - cls._instances[normalized_cui] = profile_class() - logger.debug(f"Instantiated {profile_class.__name__} for CUI {normalized_cui}") - except Exception as e: - logger.error(f"Failed to instantiate {profile_class.__name__}: {e}") - return None - - return cls._instances[normalized_cui] - - @classmethod - def has_profile(cls, cui: Optional[str]) -> bool: - """Check if a profile exists for this CUI.""" - if not cui: - return False - if not cls._loaded: - cls._load_all_profiles() - return cls._normalize_cui(cui) in cls._profiles - - # ------------------------------------------------------------------------- - # Listing - # ------------------------------------------------------------------------- - - @classmethod - def list_profiles(cls) -> List[Dict]: - """ - List all registered profiles. - - Returns: - List of dicts with cui, class_name, store_name, name_patterns - """ - if not cls._loaded: - cls._load_all_profiles() - - result = [] - seen_classes = set() - - for cui, profile_class in cls._profiles.items(): - # Avoid duplicates for profiles with multiple CUIs - if profile_class.__name__ in seen_classes: - continue - seen_classes.add(profile_class.__name__) - - result.append({ - "cuis": list(getattr(profile_class, 'CUI_LIST', [])), - "class_name": profile_class.__name__, - "store_name": getattr(profile_class, 'STORE_NAME', profile_class.__name__), - "name_patterns": list(getattr(profile_class, 'NAME_PATTERNS', [])), - }) - - return result - - @classmethod - def get_profile_info(cls, cui: str) -> Optional[Dict]: - """ - Get detailed info about a profile. - - Args: - cui: CUI to lookup - - Returns: - Dict with profile details or None - """ - profile = cls.get_profile(cui) - if not profile: - return None - - return { - "cui": cui, - "cuis": list(profile.CUI_LIST), - "class_name": profile.__class__.__name__, - "store_name": profile.STORE_NAME, - "name_patterns": list(profile.NAME_PATTERNS), - "validation_hints": profile.get_validation_hints(), - } - - # ------------------------------------------------------------------------- - # Hot-Reload - # ------------------------------------------------------------------------- - - @classmethod - def reload_all(cls) -> int: - """ - Hot-reload all profile modules. - - Clears instance cache and reloads all .py files in profiles directory. - Decorator re-registers classes with updated code. - - Returns: - Number of modules reloaded - """ - logger.info("Starting profile hot-reload...") - - # Clear instance cache (will be recreated on next get_profile) - cls._instances.clear() - - # Get list of profile modules (exclude __init__, base) - module_names = cls._get_profile_module_names() - - # Determine the module prefix based on how THIS module was imported - base_package = cls.__module__ - - count = 0 - for module_name in module_names: - full_name = f"{base_package}.{module_name}" - - try: - if full_name in sys.modules: - # Reload existing module - importlib.reload(sys.modules[full_name]) - logger.debug(f"Reloaded module: {module_name}") - else: - # Import new module - importlib.import_module(full_name) - logger.debug(f"Imported new module: {module_name}") - count += 1 - except Exception as e: - logger.error(f"Failed to reload {module_name}: {e}") - - cls._last_reload = datetime.utcnow() - cls._loaded = True - - logger.info(f"Profile hot-reload complete: {count} modules, {len(cls._profiles)} profiles") - return count - - @classmethod - def get_reload_status(cls) -> Dict: - """Get status of the registry including last reload time.""" - return { - "loaded": cls._loaded, - "last_reload": cls._last_reload.isoformat() if cls._last_reload else None, - "profiles_count": len(cls._profiles), - "instances_count": len(cls._instances), - "registered_cuis": list(cls._profiles.keys()), - } - - # ------------------------------------------------------------------------- - # Internal methods - # ------------------------------------------------------------------------- - - @classmethod - def _normalize_cui(cls, cui: str) -> str: - """ - Normalize CUI for consistent lookup. - - - Removes RO prefix (with or without space) - - Strips whitespace - - Converts to uppercase - - Args: - cui: Raw CUI string - - Returns: - Normalized CUI (digits only) - """ - if not cui: - return "" - - cui = str(cui).strip().upper() - - # Remove RO prefix (handles "RO12345" and "RO 12345") - if cui.startswith("RO"): - cui = cui[2:].lstrip() - - return cui.strip() - - @classmethod - def _get_profile_module_names(cls) -> List[str]: - """ - Get list of profile module names from profiles directory. - - Excludes __init__.py and base.py. - - Returns: - List of module names (without .py extension) - """ - excluded = {"__init__", "base", "__pycache__"} - modules = [] - - for path in PROFILES_DIR.glob("*.py"): - name = path.stem - if name not in excluded: - modules.append(name) - - return sorted(modules) - - @classmethod - def _load_all_profiles(cls) -> None: - """ - Initial load of all profile modules. - - Called automatically on first get_profile() if not already loaded. - """ - if cls._loaded: - return - - logger.info("Loading store profiles...") - - module_names = cls._get_profile_module_names() - - # Determine the module prefix based on how THIS module was imported - # This handles both: - # - Running from backend dir: "modules.data_entry.services.ocr.profiles" - # - Running from project root: "backend.modules.data_entry.services.ocr.profiles" - this_module = cls.__module__ # e.g. "backend.modules..." or "modules..." - base_package = this_module # Use the same prefix for child modules - - for module_name in module_names: - full_name = f"{base_package}.{module_name}" - try: - importlib.import_module(full_name) - logger.debug(f"Loaded module: {module_name}") - except Exception as e: - logger.error(f"Failed to load {module_name}: {e}") - - cls._loaded = True - cls._last_reload = datetime.utcnow() - - logger.info(f"Loaded {len(cls._profiles)} store profiles") - - @classmethod - def clear(cls) -> None: - """ - Clear all registered profiles. - - Mainly useful for testing. - """ - cls._profiles.clear() - cls._instances.clear() - cls._loaded = False - cls._last_reload = None - - -# ------------------------------------------------------------------------- -# Module exports -# ------------------------------------------------------------------------- - -__all__ = [ - "ProfileRegistry", - "BaseStoreProfile", -] - -# Re-export BaseStoreProfile for convenience -from .base import BaseStoreProfile diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/profiles/base.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/profiles/base.py deleted file mode 100644 index 69ed9c2..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/profiles/base.py +++ /dev/null @@ -1,1122 +0,0 @@ -""" -Base class for store-specific OCR extraction profiles. - -Each store can have different receipt formats (TVA layout, total position, etc.). -Store profiles allow customizing extraction logic per-store for better accuracy. - -Usage: - from .base import BaseStoreProfile - from . import ProfileRegistry - - @ProfileRegistry.register - class LidlProfile(BaseStoreProfile): - CUI_LIST = ["22891860"] - NAME_PATTERNS = ["LIDL", "LDL"] - - def extract_tva_entries(self, text: str) -> Tuple[List[dict], float]: - # Custom Lidl TVA extraction logic - # Returns (entries_list, confidence_score) - ... -""" - -import re -from abc import ABC -from decimal import Decimal, InvalidOperation -from typing import List, Optional, Tuple, Dict, Any -from datetime import date - - -class BaseStoreProfile(ABC): - """ - Abstract base class for store-specific extraction profiles. - - Each profile defines: - - CUI_LIST: CUI codes that identify this store (without RO prefix) - - NAME_PATTERNS: OCR-tolerant name patterns for fallback matching - - Custom extraction methods for TVA, total, date, etc. - - The ProfileRegistry uses CUI_LIST to lookup profiles during extraction. - """ - - # ------------------------------------------------------------------------- - # Class attributes - override in subclasses - # ------------------------------------------------------------------------- - - # List of CUI codes (without RO prefix) that identify this store - CUI_LIST: List[str] = [] - - # OCR-tolerant name patterns for fallback matching - NAME_PATTERNS: List[str] = [] - - # Store display name - STORE_NAME: str = "Unknown Store" - - # Flag for known non-VAT payer stores (skips TVA extraction) - IS_NON_VAT_PAYER: bool = False - - # ------------------------------------------------------------------------- - # Generic patterns - can be overridden in subclasses - # ------------------------------------------------------------------------- - - # Total amount patterns (confidence-weighted) - TOTAL_PATTERNS = [ - (r'T[O0]TAL[.\s]+L[E3][I1!]\s*:?\s*([\d\s.,]+)', 0.98), - (r'TOTAL\s+LEI\s*([\d\s.,]+)', 0.98), - (r'[OT]?OTAL\s+LEI\s*([\d\s.,]+)', 0.95), - (r'TOTAL\s*:?\s*([\d\s.,]+)\s*(?:RON|LEI)?', 0.95), - (r'TOTAL\s+(?:RON|LEI)\s*([\d\s.,]+)', 0.95), - (r'SUBTOTAL\s*([\d\s.,]+)', 0.90), - (r'DE\s+PLATA\s*:?\s*([\d\s.,]+)', 0.90), - (r'SUMA\s*:?\s*([\d\s.,]+)', 0.85), - ] - - # Date patterns (confidence-weighted) - DATE_PATTERNS = [ - (r'D[AR]TA\s*:?\s*(\d{2}[-./]\d{2}[-./]\d{4})', 0.98), - (r'DATA\s*:?\s*(\d{2}[-./]\d{2}[-./]\d{4})', 0.98), - (r'(\d{2}[-./]\d{2}[-./]\d{4})\s+[O0]RA\s*:?\s*\d{2}:\d{2}', 0.95), - (r'(\d{2}[-./]\d{2}[-./]\d{4})\s+\d{2}:\d{2}', 0.90), - (r'(\d{2}[-./]\d{2}[-./]\d{4})', 0.80), - (r'(\d{4}[-./]\d{2}[-./]\d{2})', 0.75), - ] - - # Date patterns with OCR-introduced spaces (separate because format is different) - DATE_PATTERNS_OCR_SPACES = [ - (r'(\d{4})[.,]\s*(\d{2})[.,]\s*(\d{2})\s+\d{2}:\d{2}', 0.92, 'ymd'), - (r'(\d{4})[.,]\s*(\d{2})[.,]\s*(\d{2})', 0.85, 'ymd'), - (r'(\d{2})[.,]\s*(\d{2})[.,]\s*(\d{4})\s+\d{2}:\d{2}', 0.92, 'dmy'), - (r'(\d{2})[.,]\s*(\d{2})[.,]\s*(\d{4})', 0.85, 'dmy'), - ] - - # Receipt number patterns (confidence-weighted) - NUMBER_PATTERNS = [ - (r'NDS\s*:?\s*(\d+)', 0.98), - (r'C3POS[-A-Z0-9]*[N:](\d{6,7})', 0.98), - (r'C3POS.*?(\d{6,7})\b', 0.95), - (r'BF\s*:\s*(\d{4,})', 0.96), - (r'BF\s+(\d{4,})', 0.93), - (r'NIVS\s*:?\s*(\d+)', 0.95), - (r'NR\.?\s*BON\s*:?\s*(\d+)', 0.95), - (r'BON\s+(?:FISCAL\s+)?NR\.?\s*:?\s*(\d+)', 0.95), - (r'CHITANTA\s+NR\.?\s*:?\s*(\d+)', 0.95), - (r'NR\.?\s+DOCUMENT\s*:?\s*(\d+)', 0.90), - (r'ID\s*BF\s*:?\s*(\d+)', 0.90), - ] - - # Payment method patterns (pattern, method_type, confidence) - # Handles ALL payment types: CARD, NUMERAR, and card brand names - PAYMENT_PATTERNS = [ - # CARTE CREDIT variants (OMV/Petrom/Socar receipts) - (r'CARTE\s+CREDIT\s*:?\s*([\d\s.,]+)', 'CARD', 0.98), - (r'CARTE\s+CREDIT\s*:?\s*\n\s*([\d\s.,]+)', 'CARD', 0.97), - (r'CARTE\s+DE\s+CREDIT\s*:?\s*([\d\s.,]+)', 'CARD', 0.98), - (r'CARTE\s+DE\s+CREDIT\s*:?\s*\n\s*([\d\s.,]+)', 'CARD', 0.97), - # CARD standard - (r'(?:PLATA\s+)?CARD\s*[:\sA-Z]?\s*([\d\s.,]+)', 'CARD', 0.95), - # Card brand names - (r'VISA\s*:?\s*([\d\s.,]+)', 'CARD', 0.95), - (r'MASTERCARD\s*:?\s*([\d\s.,]+)', 'CARD', 0.95), - (r'MAESTR[O0]\s*:?\s*([\d\s.,]+)', 'CARD', 0.95), - (r'CONTACTLESS\s*:?\s*([\d\s.,]+)', 'CARD', 0.90), - (r'DEBIT\s*:?\s*([\d\s.,]+)', 'CARD', 0.90), - (r'CREDIT\s*:?\s*([\d\s.,]+)', 'CARD', 0.88), - # Cash variants - (r'NUMERAR\s*:?\s*([\d\s.,]+)', 'NUMERAR', 0.95), - (r'CASH\s*:?\s*([\d\s.,]+)', 'NUMERAR', 0.90), - # Truncation recovery patterns (for OCR left-margin issues) - (r'(?:^|\n|\s)RD\s*:?\s*(\d{1,6}[.,]\d{2})\b', 'CARD', 0.70), - (r'(?:^|\n|\s)ARD\s*:?\s*(\d{1,6}[.,]\d{2})\b', 'CARD', 0.75), - (r'(?:^|\n|\s)MERAR\s*:?\s*(\d{1,6}[.,]\d{2})\b', 'NUMERAR', 0.70), - ] - - # Client section markers (for B2B receipts) - More flexible patterns - # Includes OCR corruption variants (LIENT, C IENT, L IENT) - CLIENT_MARKERS = [ - r'C\.?\s*[I1]\.?\s*F\.?\s+CLIENT', # "CIF CLIENT" (with or without colon) - r'C\.?\s*U\.?\s*[I1]\.?\s+CLIENT', # "CUI CLIENT" - r'CLIENT\s+C\.?\s*[UI1]\.?\s*[IF1]', # "CLIENT CIF" / "CLIENT CUI" - r'CLIENT\s*:', # "CLIENT:" - r'CUMPARATOR\s*:', # "CUMPARATOR:" - r'BENEFICIAR\s*:', # "BENEFICIAR:" - r'CUMP[AĂ]R[AĂ]TOR', # "CUMPARATOR" without colon - r'COD\s+FISCAL\s+CLIENT', # "COD FISCAL CLIENT" - # OCR corruption patterns - r'C[I1]F\s+[A-Z\s]{0,6}IENT\s*:', # "CIF a IENT:", "CIF CL IENT:", "CIF L IENT:" - r'C[I1]F\s+LIENT\s*:', # "CIF LIENT:" (missing C) - r'LIENT\s*:', # "LIENT:" (missing C and I/L) - # Brick-specific (I→L OCR error) - r'CLIENT\s+C\.?U\.?[LI1]\.?\s*/', # "CLIENT C.U.L./" (I read as L) - ] - - # Client CUI patterns (pattern, confidence) - Comprehensive - # Handles: docTR reordering, doubled letters, corruption, CUMPARATOR, Brick L/I swap - CLIENT_CUI_PATTERNS = [ - # === CUI on line BEFORE CLIENT marker (docTR/OCR reordering) === - (r'(R[O0]\d{6,10})\s*\n\s*CLIENT\s+C\.?\s*U\.?\s*[I1]\.?', 0.99), - (r'(R[O0]\d{6,10})\s*\n\s*CLIENT\s+C\.?\s*[I1]\.?\s*F\.?', 0.99), - (r'(R[O0]\d{6,10})\s*:?\s*\n\s*CLIENT', 0.98), - # === "CIF I CLIENT:" format (OCR extra chars) === - (r'C[I1]F\s+[A-Z]*\s*CLIENT\s*:?\s*(R[O0]\d{6,10})', 0.98), - (r'C[I1]F\s+[A-Z]*\s*CLIENT\s*:?\s*(R[O0]?\d{6,10})', 0.97), - # === CIF CLIENT: (reversed - CIF before CLIENT) === - (r'C\.?\s*[I1]\.?\s*F\.?\s+CLIENT\s*:?\s*(R[O0]?\d{6,10})', 0.98), - (r'C\.?\s*U\.?\s*[I1]\.?\s+CLIENT\s*:?\s*(R[O0]?\d{6,10})', 0.98), - (r'C\.?\s*[I1]\.?\s*F\.?\s+CLIENT\s*:?\s*(?:R[O0])?(\d{6,10})', 0.98), - (r'C\.?\s*U\.?\s*[I1]\.?\s+CLIENT\s*:?\s*(?:R[O0])?(\d{6,10})', 0.98), - # === CLIENT C.U.I/C.I.F. (slash variants) === - (r'CLIENT\s+C\.?\s*U\.?\s*[I1]\.?\s*/\s*C\.?\s*[I1]\.?\s*F\.?\s*:?\s*(R[O0]?\d{6,10})', 0.97), - (r'CLIENT\s+C\.?\s*U\.?\s*[I1]\.?\s*/\s*C\.?\s*[I1]\.?\s*F\.?\s*:?\s*(?:R[O0])?(\d{6,10})', 0.97), - # === Doubled letters (docTR artifact: "C.U U.I") === - (r'CLIENT\s+C\.?\s*U\.?\s*U?\.?\s*[I1]\.?\s*/\s*C\.?\s*[I1]\.?\s*F\.?\s*:?\s*(R[O0]?\d{6,10})', 0.96), - (r'CLIENT\s+C\.?\s*U\.?\s*U?\.?\s*[I1]\.?\s*/\s*C\.?\s*[I1]\.?\s*F\.?\s*:?\s*(?:R[O0])?(\d{6,10})', 0.96), - # === CLIENT C.U.I. or CLIENT CUI (without slash) === - (r'CLIENT\s+C\.?\s*U\.?\s*[I1]\.?\s*:?\s*(R[O0]?\d{6,10})', 0.96), - (r'CLIENT\s+C\.?\s*U\.?\s*[I1]\.?\s*:?\s*(?:R[O0])?(\d{6,10})', 0.96), - (r'CLIENT\s+C\.?\s*[I1]\.?\s*F\.?\s*:?\s*(R[O0]?\d{6,10})', 0.96), - (r'CLIENT\s+C\.?\s*[I1]\.?\s*F\.?\s*:?\s*(?:R[O0])?(\d{6,10})', 0.96), - # === Corrupted CLIENT after CIF (OCR errors) === - (r'CIF\s+[a-zA-Z\s]{2,8}IENT\s*:?\s*(R[O0]?\d{6,10})', 0.93), - (r'CIF\s+[a-zA-Z\s]{2,8}IENT\s*:?\s*(?:R[O0])?(\d{6,10})', 0.93), - (r'CIF\s+LIENT\s*:?\s*(R[O0]?\d{6,10})', 0.92), - (r'CIF\s+LIENT\s*:?\s*(?:R[O0])?(\d{6,10})', 0.92), - # === CUMPARATOR variants === - (r'CUMPARATOR\s+C\.?\s*U\.?\s*[I1]\.?\s*:?\s*(?:R[O0])?(\d{6,10})', 0.95), - (r'CUMPARATOR\s+C\.?\s*[I1]\.?\s*F\.?\s*:?\s*(?:R[O0])?(\d{6,10})', 0.95), - # CUMPARATOR with CUI/CIF on next line - (r'CUMPARATOR\s*:.*\n\s*C\.?\s*U\.?\s*[I1]\.?\s*:?\s*(?:R[O0])?(\d{6,10})', 0.93), - (r'CUMPARATOR\s*:.*\n\s*C\.?\s*[I1]\.?\s*[FT]\.?\s*:?\s*(?:R[O0])?(\d{6,10})', 0.93), - # CUMPARATOR with CUI/CIF two lines down - (r'CUMPARATOR\s*:.*\n.*\n\s*C\.?\s*[I1]\.?\s*[FT]\.?\s*:?\s*(?:R[O0])?(\d{6,10})', 0.90), - # === CLIENT on next line === - (r'CLIENT\s*:\s*\n\s*C\.?\s*U\.?\s*[I1]\.?\s*:?\s*(?:R[O0])?(\d{6,10})', 0.95), - (r'CLIENT\s*:.*\n\s*C\.?\s*U\.?\s*[I1]\.?\s*:?\s*(?:R[O0])?(\d{6,10})', 0.90), - # === Standard fallback patterns === - (r'CLIENT\s*:?\s*(R?[O0]?\s*\d{6,10})', 0.90), - (r'COD\s+FISCAL\s+CLIENT\s*:?\s*(R?[O0]?\s*\d{6,10})', 0.95), - # === Brick-specific (I→L OCR error) === - # Matches: "CLIENT C.U.L./C.IF. :R01879855" - (r'CLIENT\s+C\.?U\.?[LI1]\.?\s*/\s*C\.?[LI1]\.?F\.?\s*:?\s*(R?O?\d{6,10})', 0.99), - ] - - # Company type indicators (for identifying company names) - COMPANY_INDICATORS = [ - r'\bS\.?\s*R\.?\s*L\.?\b', # S.R.L. or S. R. L. - r'\bS\.?\s*A\.?\b', # S.A. or S. A. - r'\bS\.?\s*N\.?\s*C\.?\b', # S.N.C. or S. N. C. - r'\bS\.?\s*C\.?\s*S\.?\b', # S.C.S. or S. C. S. - r'\bI\.?\s*I\.?\b', # I.I. or I. I. - r'\bP\.?\s*F\.?\s*A\.?\b', # P.F.A. or P. F. A. - r'\bS\.?\s*C\.?\s+[A-Z]', # S.C. followed by company name - r'HOLDING', - r'COMPANY', - r'GROUP', - ] - - # Maximum reasonable payment amount (to filter OCR errors) - MAX_PAYMENT = Decimal('100000') - - # ------------------------------------------------------------------------- - # TVA (VAT) patterns - ALL FORMATS unified - # OCR tolerant: T[VU][AR] matches TVA, TUA, TVR - # ------------------------------------------------------------------------- - TVA_PATTERNS = [ - # === FORMAT 1: INLINE cu cod și procent (Lidl-style) === - # "TVA A 21,00% 7.71" sau "TVA B 11,00% 2.13" - (r'T[VU][AR]\s+([A-D])\s+(\d{1,2})[.,]?\d{0,2}\s*%\s+([\d.,]+)', 0.98, 'inline'), - (r'T[VU][AR]\s+([A-D])\s+\\?(\d{1,2})[.,]?\d{0,2}\s*%\s+([\d.,]+)', 0.97, 'inline'), - (r'IVA\s+([A-D])\s+(\d{1,2})[.,]?\d{0,2}\s*%\s+([\d.,]+)', 0.95, 'inline'), - - # === FORMAT 2: REVERSED (Stepout-style) === - # "5.00% TUA*B" - procent ÎNAINTE de TVA - (r'(\d{1,2})[.,]\d{0,2}\s*%\s*T[UV]A\*?([A-D])', 0.97, 'reversed'), - - # === FORMAT 3: TABLE (OMV-style) === - # "A-21,00% 285,66 49,58" (cod-procent bază tva) - (r'([A-D])\s*[-:]\s*(\d{1,2})[.,\s]*\d{0,2}\s*%\s+([\d.,\s]+)\s+([\d.,\s]+)', 0.96, 'table'), - (r'TOTAL\s+TAXE\s*:?\s*([\d.,\s]+)', 0.95, 'taxe'), - - # === FORMAT 4: MULTILINE (Brick/Electrobering) === - # "TOTAL TVA A - 19%" pe o linie, amount pe următoarea - (r'TOTAL\s+TVA\s*([A-D])\s*[-\s]+(\d{1,2})\s*%', 0.96, 'multiline'), - (r'TOTAL\s+TVA\s+([A-D])\s+(\d{1,2})\s*%', 0.95, 'multiline'), - (r'TOTAL\s+T[VU][AR]\s*([A-D])?\s*[-:]?\s*(\d{1,2})\s*%', 0.94, 'multiline'), - - # === FORMAT 5: STANDARD (din extractor) === - (r'TOTAL\s+(?:T[VU][AR]|IVA)\s+BON\s*:?\s*([\d\s.,]+)', 0.98, 'bon'), - (r'T[O0]TAL\s+(?:T[VU][AR]|IVA)\s*:?\s*([\d\s.,]+)', 0.95, 'standard'), - (r'TOTAL\s+IVA\s*:?\s*([\d\s.,]+)', 0.95, 'standard'), - (r'T[VU][AR]\s+(?:A\s*[-:]?\s*)?(\d{1,2})\s*%\s*:?\s*([\d\s.,]+)', 0.95, 'percent'), - (r'T[VU][AR]\s+[A-Z]\s*[-:]\s*(\d{1,2})\s*%\s*([\d\s.,]+)', 0.93, 'percent'), - (r'T[VU][AR]\s*[C5]\s*[-:]\s*5\s*%\s*:?\s*([\d\s.,]+)', 0.93, 'books'), - (r'(?:T[VU][AR]|IVA)\s+5\s*%\s*:?\s*([\d\s.,]+)', 0.92, 'books'), - - # === FORMAT 6: CODED inline (cu code A-D) === - (r'T[UV]A\s*[-:]?\s*([A-D])\s*:?\s*(\d{1,2})\s*%\s*[=:]?\s*([\d.,\s]+)', 0.95, 'coded'), - (r'([A-D])\s*[-:]\s*(\d{1,2})[.,]?\d{0,2}\s*%\s*[=:]?\s*([\d.,\s]+)', 0.93, 'coded'), - - # === FALLBACK patterns === - (r'T[O0]T[AE]L\s+(?:T[VUAI]+[AR]?|IVA)\s*:?\s*([\d\s.,]+)', 0.88, 'fallback'), - (r'TOTAL\s+TA\s*[F\s]?\s*\d*\s*:?\s*([\d\s.,]+)', 0.85, 'fallback'), - (r'(?:T[VU][AR]|IVA)\s*:?\s*([\d\s.,]+)', 0.85, 'fallback'), - (r'TOTAL\s+T[UV]A\s*:?\s*([\d.,\s]+)', 0.90, 'standard'), - ] - - # Non-VAT payer patterns - NEPLATITOR DE TVA - # OCR variants: NEPLATTOR, NEPLATITOR, NEPLATOR, ANEPLATHTOR, MEPLATITOR - NON_VAT_PATTERNS = [ - r'NEPLAT\w*OR', # NEPLATITOR, NEPLATTOR, NEPLATOR - r'[ANM]EPLAT\w*O?R', # OCR errors: ANEPLATHTOR, MEPLATITOR - r'TOTAL\s+NEPLAT', # TOTAL NEPLATITOR... - r'TOTAL\s+[ANM]EPLAT', # TOTAL ANEPLAT... (OCR error) - r'SCUTIT\s*(?:DE\s+)?T[VU]A', # SCUTIT DE TVA - r'NEPLAT\w*\s+T[VU]A', # NEPLATITOR TVA - r'NEPLAT\w*\s+DE\s+T', # NEPLATITOR DE T... (truncated) - ] - - # CUI (fiscal code) patterns - VENDOR CUI (exclude CLIENT) - # OCR errors: R0 instead of RO, C1F instead of CIF - CUI_PATTERNS = [ - # CIF at start of line (definitely vendor) - (r'^CIF\s*:?\s*(R[O0]?\d{6,10})', 0.98), - (r'^CIF\s*:?\s*(\d{6,10})', 0.97), - (r'^C[I1]F\s*:?\s*(R[O0]?\d{6,10})', 0.95), - (r'^C[I1]F\s*:?\s*(\d{6,10})', 0.94), - # CIF not preceded by CLIENT (negative lookbehind) - (r'(? Tuple[List[dict], float]: - """ - Extract TVA entries from receipt text - GENERIC implementation. - - Handles ALL formats: - - Multi-rate inline (Lidl): "TVA A 21% 7.71" - - Reversed (Stepout): "5.00% TUA*B" - - Table (OMV): "A-21,00% 285,66 49,58" - - Multiline: "TOTAL TVA A - 19%" + amount on next line - - Non-VAT payers: Returns empty list - - Args: - text: Raw OCR text from receipt - - Returns: - Tuple of (List of dicts with keys: code, percent, amount, confidence float) - """ - entries = [] - max_confidence = 0.0 - text_upper = text.upper() - - # Step 1: Check for known non-VAT payer (by class flag or text detection) - if self.IS_NON_VAT_PAYER or self._is_non_vat_payer(text_upper): - return ([], 0.0) # No TVA entries for non-VAT payers - - # Step 2: Normalize OCR spaces in numbers - normalized = re.sub(r'(\d+)[.,]\s+(\d{2})', r'\1.\2', text_upper) - lines = normalized.split('\n') - - # Step 3: Try all formats, collect candidates with confidence - candidates = [] - - # Try inline multi-rate (Lidl-style) - inline_entries, inline_conf = self._try_tva_inline(normalized) - candidates.extend(inline_entries) - if inline_conf > max_confidence: - max_confidence = inline_conf - - # Try reversed format (Stepout-style) - reversed_entries, reversed_conf = self._try_tva_reversed(normalized, lines) - candidates.extend(reversed_entries) - if reversed_conf > max_confidence: - max_confidence = reversed_conf - - # Try multiline format (Brick/Electrobering) - multiline_entries, multiline_conf = self._try_tva_multiline(normalized, lines) - candidates.extend(multiline_entries) - if multiline_conf > max_confidence: - max_confidence = multiline_conf - - # Try table format (OMV-style) - table_entries, table_conf = self._try_tva_table(normalized) - candidates.extend(table_entries) - if table_conf > max_confidence: - max_confidence = table_conf - - # Try standard/fallback patterns - if not candidates: - standard_entries, standard_conf = self._try_tva_standard(normalized) - candidates.extend(standard_entries) - if standard_conf > max_confidence: - max_confidence = standard_conf - - # Step 4: Deduplicate and return - seen = set() - for entry in candidates: - key = (entry.get('code', 'A'), entry.get('percent', 19)) - if key not in seen and entry.get('amount') and entry['amount'] > 0: - entries.append(entry) - seen.add(key) - - return (entries, max_confidence if entries else 0.0) - - def _is_non_vat_payer(self, text: str) -> bool: - """Check if receipt is from non-VAT payer.""" - for pattern in self.NON_VAT_PATTERNS: - if re.search(pattern, text, re.IGNORECASE): - return True - return False - - def _try_tva_inline(self, text: str) -> Tuple[List[dict], float]: - """Try Lidl-style inline format: 'TVA A 21,00% 7.71'""" - entries = [] - max_confidence = 0.0 - # Pattern: "TVA A 21,00% 7.71" or "TVA B 11,00% 2.13" - for pattern, confidence, fmt in self.TVA_PATTERNS: - if fmt != 'inline': - continue - for match in re.finditer(pattern, text, re.IGNORECASE): - try: - groups = match.groups() - if len(groups) >= 3: - code = groups[0].upper() if groups[0] else 'A' - percent = int(groups[1]) - amount = self._parse_decimal(self._clean_ocr_number(groups[2])) - if amount and amount > 0: - entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - if confidence > max_confidence: - max_confidence = confidence - except (ValueError, InvalidOperation, IndexError): - continue - return (entries, max_confidence) - - def _try_tva_reversed(self, text: str, lines: List[str]) -> Tuple[List[dict], float]: - """Try Stepout-style reversed format: '5.00% TUA*B 2.00' (rate BEFORE TVA marker)""" - entries = [] - confidence = 0.97 # Default confidence for reversed format - # Pattern: "5.00% TUA*B 2.00" - procent BEFORE TVA, amount same line or next - for i, line in enumerate(lines): - # Try pattern with amount on SAME line: "5.00% TUA*B 2.00" - match = re.search( - r'(\d{1,2})[.,]?\d{0,2}\s*%\s*T[UV][AR]\s*\*?\s*([A-D])?\s+([\d\s.,]+)', - line, re.IGNORECASE - ) - if match: - try: - percent = int(match.group(1)) - code = match.group(2).upper() if match.group(2) else 'A' - amount_str = match.group(3).strip() - amount = self._parse_decimal(amount_str) - if amount and amount > 0: - entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - continue # Check for more entries - except (ValueError, InvalidOperation, IndexError): - pass - - # Fallback: amount on NEXT line - match = re.search(r'(\d{1,2})[.,]?\d{0,2}\s*%\s*T[UV][AR]\s*\*?\s*([A-D])?$', line, re.IGNORECASE) - if match: - try: - percent = int(match.group(1)) - code = match.group(2).upper() if match.group(2) else 'A' - if i + 1 < len(lines): - amount_str = lines[i + 1].strip() - amount = self._parse_decimal(amount_str) - if amount and amount > 0: - entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - except (ValueError, InvalidOperation, IndexError): - continue - return (entries, confidence if entries else 0.0) - - def _try_tva_multiline(self, text: str, lines: List[str]) -> Tuple[List[dict], float]: - """Try multiline format: 'TOTAL TVA A - 19%' + amount on next line""" - entries = [] - confidence = 0.95 # Default confidence for multiline format - # Pattern: "TOTAL TVA A - 19%" or "TOTAL TVA A 19%" on one line, amount on next - multiline_patterns = [ - r'TOTAL\s+TVA\s*([A-D])\s*[-\s]+(\d{1,2})\s*%', - r'TOTAL\s+TVA\s+([A-D])\s+(\d{1,2})\s*%', - r'TOTAL\s+T[VU][AR]\s*([A-D])?\s*[-:]?\s*(\d{1,2})\s*%', - r'O?TAL\s+[IT]VA\s*([A-D])\s*[-:]?\s*(\d{1,2})\s*%', - ] - for i, line in enumerate(lines): - for pattern in multiline_patterns: - match = re.search(pattern, line, re.IGNORECASE) - if match: - try: - code = match.group(1).upper() if match.group(1) else 'A' - percent = int(match.group(2)) - # Amount is on next line - if i + 1 < len(lines): - amount_str = lines[i + 1].strip() - amount = self._parse_decimal(amount_str) - if amount and amount > 0: - entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - return (entries, confidence) - except (ValueError, InvalidOperation, IndexError): - continue - return (entries, 0.0) - - def _try_tva_table(self, text: str) -> Tuple[List[dict], float]: - """Try OMV-style table format: 'A-21,00% 285,66 49,58'""" - entries = [] - confidence = 0.96 # Default confidence for table format - # Pattern: "A-21,00% 285,66 49,58" (code-percent base_amount tva_amount) - table_pattern = r'([A-D])\s*[-:]\s*(\d{1,2})[.,\s]*\d{0,2}\s*%\s+([\d.,\s]+)\s+([\d.,\s]+)' - for match in re.finditer(table_pattern, text, re.IGNORECASE): - try: - code = match.group(1).upper() - percent = int(match.group(2)) - # Group 4 is the TVA amount (last column in table) - tva_amount_str = self._clean_ocr_number(match.group(4)) - tva_amount = self._parse_decimal(tva_amount_str) - if tva_amount and tva_amount > 0: - entries.append({ - 'code': code, - 'percent': percent, - 'amount': tva_amount - }) - except (ValueError, InvalidOperation, IndexError): - continue - - # Fallback: "TOTAL TAXE: 55,22" - if not entries: - taxe_match = re.search(r'TOTAL\s+TAXE\s*:?\s*([\d.,\s]+)', text, re.IGNORECASE) - if taxe_match: - try: - amount_str = self._clean_ocr_number(taxe_match.group(1)) - amount = self._parse_decimal(amount_str) - if amount and amount > 0: - entries.append({ - 'code': 'A', - 'percent': 19, # Default rate - 'amount': amount - }) - confidence = 0.90 # Lower confidence for fallback - except (ValueError, InvalidOperation): - pass - return (entries, confidence if entries else 0.0) - - def _try_tva_standard(self, text: str) -> Tuple[List[dict], float]: - """Try standard TVA patterns as fallback""" - entries = [] - matched_confidence = 0.0 - standard_fmts = ['standard', 'bon', 'percent', 'coded', 'fallback', 'books'] - for pattern, confidence, fmt in self.TVA_PATTERNS: - if fmt not in standard_fmts: - continue - match = re.search(pattern, text, re.IGNORECASE) - if match: - try: - groups = match.groups() - if len(groups) >= 2: - # Could be (percent, amount) or (code, percent, amount) - if groups[0] and groups[0].isalpha(): - code = groups[0].upper() - percent = int(groups[1]) if len(groups) > 1 else 19 - amount_str = groups[2] if len(groups) > 2 else None - else: - code = 'A' - percent = int(groups[0]) if groups[0] and groups[0].isdigit() else 19 - amount_str = groups[1] if len(groups) > 1 else groups[0] - if amount_str: - amount = self._parse_decimal(self._clean_ocr_number(amount_str)) - if amount and amount > 0: - entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - return (entries, confidence) - elif len(groups) == 1: - # Just amount - amount = self._parse_decimal(self._clean_ocr_number(groups[0])) - if amount and amount > 0: - entries.append({ - 'code': 'A', - 'percent': 19, - 'amount': amount - }) - return (entries, confidence) - except (ValueError, InvalidOperation, IndexError): - continue - return (entries, matched_confidence) - - def _clean_ocr_number(self, value: str) -> str: - """Remove OCR spaces from numbers (e.g., '55, 22' -> '55,22').""" - if not value: - return "" - value = re.sub(r'\s*([.,])\s*', r'\1', value) - value = value.replace(' ', '') - return value - - def extract_total(self, text: str) -> Tuple[Optional[Decimal], float]: - """ - Extract total amount from receipt text. - - Supports both single-line and multiline formats: - - Single line: "TOTAL: 78.00", "SUMA TOTALA: 78.00" - - Multiline: "SUMA\nTOTALA:\n78.00" (common in thermal receipts) - - Args: - text: Raw OCR text from receipt - - Returns: - Tuple of (amount, confidence) or (None, 0.0) - """ - text_upper = text.upper() - lines = text_upper.split('\n') - - # ===================================================================== - # STRATEGY 1: Multiline "SUMA TOTALA" pattern (thermal receipts) - # Format: SUMA on one line, TOTALA: on next, amount on third - # ===================================================================== - for i, line in enumerate(lines): - line_clean = line.strip() - - # Check for "SUMA" keyword (with OCR variants: SUNA, SUHA, SUM A) - if re.search(r'S[UU]M[AĂ\s]', line_clean): - # Look at next 3 lines for "TOTALA" and amount - for j in range(i, min(i + 4, len(lines))): - check_line = lines[j].strip() - - # Check for "TOTALA:" or "TOTALA -" followed by amount - match = re.search(r'T[O0]TALA\s*[:\-]\s*([\d\s.,]+)', check_line) - if match: - amount = self._parse_decimal(self._clean_ocr_number(match.group(1))) - if amount and amount > 0 and amount < self.MAX_PAYMENT: - return (amount, 0.98) - - # Check for "TOTALA" without amount, amount on next line - if re.search(r'T[O0]TALA\s*[:\-]?\s*$', check_line): - if j + 1 < len(lines): - amount_line = lines[j + 1].strip() - amount = self._parse_decimal(amount_line) - if amount and amount > 0 and amount < self.MAX_PAYMENT: - return (amount, 0.97) - - # Check for "SUMA TOTALA" on single line with amount - match = re.search(r'S[UU]M[AĂ]\s+T[O0]TALA\s*[:\-]\s*([\d\s.,]+)', line_clean) - if match: - amount = self._parse_decimal(self._clean_ocr_number(match.group(1))) - if amount and amount > 0 and amount < self.MAX_PAYMENT: - return (amount, 0.98) - - # Check for "SUMA TOTALA" without amount, amount on next line - if re.search(r'S[UU]M[AĂ]\s+T[O0]TALA\s*[:\-]?\s*$', line_clean): - if i + 1 < len(lines): - next_line = lines[i + 1].strip() - amount = self._parse_decimal(next_line) - if amount and amount > 0 and amount < self.MAX_PAYMENT: - return (amount, 0.96) - - # ===================================================================== - # STRATEGY 2: Standard single-line patterns - # ===================================================================== - for pattern, confidence in self.TOTAL_PATTERNS: - match = re.search(pattern, text_upper) - if match: - amount = self._parse_decimal(match.group(1)) - if amount and amount > 0 and amount < self.MAX_PAYMENT: - return (amount, confidence) - - return (None, 0.0) - - def extract_date(self, text: str) -> Tuple[Optional[date], float]: - """ - Extract receipt date from text. - - Args: - text: Raw OCR text from receipt - - Returns: - Tuple of (date, confidence) or (None, 0.0) - """ - text_upper = text.upper() - - # Try standard patterns first - for pattern, confidence in self.DATE_PATTERNS: - match = re.search(pattern, text_upper) - if match: - parsed = self._parse_date(match.group(1)) - if parsed: - return (parsed, confidence) - - # Try OCR-corrupted patterns with spaces - for pattern, confidence, fmt in self.DATE_PATTERNS_OCR_SPACES: - match = re.search(pattern, text_upper) - if match: - try: - if fmt == 'ymd': - year, month, day = int(match.group(1)), int(match.group(2)), int(match.group(3)) - else: # dmy - day, month, year = int(match.group(1)), int(match.group(2)), int(match.group(3)) - - if 1 <= day <= 31 and 1 <= month <= 12 and 2000 <= year <= 2100: - return (date(year, month, day), confidence) - except (ValueError, TypeError): - continue - - return (None, 0.0) - - def extract_receipt_number(self, text: str) -> Tuple[Optional[str], float]: - """ - Extract receipt number from text. - - Args: - text: Raw OCR text from receipt - - Returns: - Tuple of (number, confidence) or (None, 0.0) - """ - text_upper = text.upper() - - for pattern, confidence in self.NUMBER_PATTERNS: - match = re.search(pattern, text_upper) - if match: - number = match.group(1).strip() - if number and len(number) >= 3: - return (number, confidence) - - return (None, 0.0) - - def extract_payment_methods(self, text: str) -> List[dict]: - """ - Extract payment methods (CARD/NUMERAR) from receipt. - - Supports: - - Multiline patterns: "CARD\n78.00" (common in thermal receipts) - - Multiple payments (split CARD + NUMERAR) - - REST (change) detection to calculate actual CARD amount - - Keyword-only CARD/NUMERAR that infers from total - - Fallback for fiscal receipts without explicit payment - - Args: - text: Raw OCR text from receipt - - Returns: - List of dicts: [{'method': 'CARD'/'NUMERAR', 'amount': Decimal, 'confidence': float}] - """ - text_upper = text.upper() - lines = text_upper.split('\n') - methods = [] - seen_entries = set() - - # ===================================================================== - # STEP 0: Try MULTILINE patterns first (thermal receipts) - # Format: "CARD" on one line, amount on next line - # ===================================================================== - for i, line in enumerate(lines): - line_clean = line.strip() - - # Standalone CARD keyword (not part of MASTERCARD, etc.) - if re.match(r'^CARD\s*$', line_clean): - if i + 1 < len(lines): - next_line = lines[i + 1].strip() - # Must be a valid amount (not another keyword) - if re.match(r'^[\d\s.,]+$', next_line): - amount = self._parse_decimal(next_line) - if amount and amount > 0 and amount < self.MAX_PAYMENT: - entry_key = ('CARD', amount) - if entry_key not in seen_entries: - methods.append({ - 'method': 'CARD', - 'amount': amount, - 'confidence': 0.95 - }) - seen_entries.add(entry_key) - - # Standalone NUMERAR keyword - if re.match(r'^NUMERAR\s*$', line_clean): - if i + 1 < len(lines): - next_line = lines[i + 1].strip() - if re.match(r'^[\d\s.,]+$', next_line): - amount = self._parse_decimal(next_line) - if amount and amount > 0 and amount < self.MAX_PAYMENT: - entry_key = ('NUMERAR', amount) - if entry_key not in seen_entries: - methods.append({ - 'method': 'NUMERAR', - 'amount': amount, - 'confidence': 0.95 - }) - seen_entries.add(entry_key) - - # If multiline extraction found methods, return them - if methods: - return methods - - # ===================================================================== - # STEP 1: Try pattern-based extraction with explicit amounts - # ===================================================================== - for pattern, method, confidence in self.PAYMENT_PATTERNS: - for match in re.finditer(pattern, text_upper): - try: - amount = self._parse_decimal(match.group(1)) - if amount and amount > 0 and amount < self.MAX_PAYMENT: - entry_key = (method, amount) - if entry_key not in seen_entries: - methods.append({ - 'method': method, - 'amount': amount, - 'confidence': confidence - }) - seen_entries.add(entry_key) - except (ValueError, InvalidOperation): - continue - - # If we found explicit amounts, we're done - if methods: - return methods - - # Step 2: Try keyword-only detection with REST logic - # Get total amount for inference - total_amount, _ = self.extract_total(text) - if not total_amount: - return [] - - # Check for payment keywords - has_card = any(kw in text_upper for kw in ['CARD', 'CARTE CREDIT', 'VISA', 'MASTERCARD', 'DEBIT', 'CREDIT', 'CONTACTLESS']) - has_numerar = any(kw in text_upper for kw in ['NUMERAR', 'CASH']) - - # Find REST (change) amount - rest_amount = Decimal('0') - for i, line in enumerate(lines): - if 'REST' in line: - # REST on same line: "REST 0.00" or "REST: 0.00" - match = re.search(r'REST\s*:?\s*([\d.,]+)', line) - if match: - rest_amount = self._parse_decimal(match.group(1)) or Decimal('0') - elif i + 1 < len(lines): - # REST on separate line - rest_amount = self._parse_decimal(lines[i + 1].strip()) or Decimal('0') - break - - # Calculate payment amounts - if has_card: - card_amount = total_amount - rest_amount - if card_amount > 0: - methods.append({ - 'method': 'CARD', - 'amount': card_amount, - 'confidence': 0.90 - }) - - if has_numerar: - if has_card and rest_amount > 0: - # Mixed payment: NUMERAR is the change given back - methods.append({ - 'method': 'NUMERAR', - 'amount': rest_amount, - 'confidence': 0.85 - }) - elif not has_card: - # Cash only - methods.append({ - 'method': 'NUMERAR', - 'amount': total_amount, - 'confidence': 0.90 - }) - - # Step 3: Fallback for fiscal receipts without explicit payment - if not methods and total_amount and total_amount > 0: - is_fiscal = 'BON FISCAL' in text_upper or 'FISCAL' in text_upper - if is_fiscal: - # Default to CARD for business purchases (most common) - methods.append({ - 'method': 'CARD', - 'amount': total_amount, - 'confidence': 0.70 - }) - - return methods - - def extract_client_cui(self, text: str) -> Tuple[Optional[str], float]: - """ - Extract client CUI from B2B receipts. - - Args: - text: Raw OCR text from receipt - - Returns: - Tuple of (cui, confidence) or (None, 0.0) - """ - text_upper = text.upper() - - # First check if there's a CLIENT section - has_client_section = any( - re.search(marker, text_upper, re.IGNORECASE) - for marker in self.CLIENT_MARKERS - ) - - if not has_client_section: - return (None, 0.0) - - # Try to extract CUI - for pattern, confidence in self.CLIENT_CUI_PATTERNS: - match = re.search(pattern, text_upper, re.IGNORECASE | re.MULTILINE) - if match: - cui = match.group(1) - # Normalize: remove RO prefix for storage - cui_digits = re.sub(r'[^0-9]', '', cui) - if 6 <= len(cui_digits) <= 10: - return (cui_digits, confidence) - - return (None, 0.0) - - def extract_client_name(self, text: str) -> Tuple[Optional[str], float]: - """ - Extract client/buyer company name from B2B receipts. - - Args: - text: Raw OCR text from receipt - - Returns: - Tuple of (client_name, confidence) or (None, 0.0) - """ - text_upper = text.upper() - lines = text.split('\n') - - # First check if there's a CLIENT section - client_section_idx = None - for i, line in enumerate(lines): - line_upper = line.upper().strip() - if any(re.search(marker, line_upper, re.IGNORECASE) for marker in self.CLIENT_MARKERS): - client_section_idx = i - break - - if client_section_idx is None: - return (None, 0.0) - - # Look for company name in CLIENT section - line = lines[client_section_idx].strip() - line_upper = line.upper() - - # Strategy 1: Check if name is on same line after ":" - if ':' in line: - name_part = line.split(':', 1)[1].strip() - if name_part and len(name_part) >= 3: - # Skip if it looks like a CUI (RO followed by digits) - if re.match(r'^R[O0]?\d{6,10}$', name_part.upper()): - pass # This is CUI, not name - continue to next strategy - else: - # Check for company indicators - name_upper = name_part.upper() - if any(re.search(ind, name_upper) for ind in self.COMPANY_INDICATORS): - return (self._clean_company_name(name_part), 0.95) - elif len(name_part) >= 5 and not name_part.isdigit(): - return (self._clean_company_name(name_part), 0.80) - - # Strategy 2: Check next line for company name - if client_section_idx + 1 < len(lines): - next_line = lines[client_section_idx + 1].strip() - next_upper = next_line.upper() - - # Skip if it's a CUI/CIF line or looks like CUI - if not re.search(r'C\.?\s*[UI]\.?\s*[IF]\.?', next_upper): - if not re.match(r'^R[O0]?\d{6,10}$', next_upper): - if any(re.search(ind, next_upper) for ind in self.COMPANY_INDICATORS): - return (self._clean_company_name(next_line), 0.90) - elif len(next_line) >= 5 and not next_line.isdigit(): - # Check it's not CUI/CIF/COD keywords - if not any(kw in next_upper for kw in ['CUI', 'CIF', 'COD', 'FISCAL']): - return (self._clean_company_name(next_line), 0.75) - - # Strategy 3: Look for any line with company indicators in CLIENT section region - search_end = min(client_section_idx + 5, len(lines)) - for i in range(client_section_idx + 1, search_end): - line = lines[i].strip() - line_upper = line.upper() - - # Skip CUI/CIF lines - if re.search(r'C\.?\s*[UI]\.?\s*[IF]\.?', line_upper): - continue - if re.match(r'^R[O0]?\d{6,10}$', line_upper): - continue - - if any(re.search(ind, line_upper) for ind in self.COMPANY_INDICATORS): - return (self._clean_company_name(line), 0.85) - - return (None, 0.0) - - @staticmethod - def _clean_company_name(name: str) -> str: - """Clean company name for storage.""" - if not name: - return "" - # Remove extra whitespace - name = re.sub(r'\s+', ' ', name).strip() - # Remove trailing punctuation except periods in S.R.L., S.A., etc. - name = re.sub(r'[,;:]+$', '', name).strip() - return name - - # ------------------------------------------------------------------------- - # Validation hints - override to customize validation behavior - # ------------------------------------------------------------------------- - - def get_validation_hints(self) -> Dict[str, Any]: - """ - Return validation hints for this store. - - Returns: - Dict with validation hints. Common keys: - - has_multi_rate_tva: bool - Store uses multiple TVA rates - - card_equals_total: bool - CARD payment equals total - - has_client_cui: bool - Receipt includes client CUI - - has_efactura: bool - Store uses e-factura format - - is_non_vat_payer: bool - Store is not a VAT payer - """ - return {} - - # ------------------------------------------------------------------------- - # Helper methods - available to all subclasses - # ------------------------------------------------------------------------- - - @staticmethod - def _normalize_number(text: str) -> str: - """ - Normalize a number string for Decimal conversion. - - Handles Romanian formats: "1.234,56" -> "1234.56" - """ - if not text: - return "0" - - # Remove spaces - text = text.replace(" ", "") - - # Determine decimal separator - last_comma = text.rfind(",") - last_dot = text.rfind(".") - - if last_comma > last_dot: - text = text.replace(".", "").replace(",", ".") - elif last_dot > last_comma: - text = text.replace(",", "") - else: - text = text.replace(",", ".") - - return text - - @staticmethod - def _parse_decimal(text: str) -> Optional[Decimal]: - """Parse a string to Decimal, handling various formats.""" - try: - normalized = BaseStoreProfile._normalize_number(text) - return Decimal(normalized) - except (InvalidOperation, ValueError, TypeError): - return None - - @staticmethod - def _parse_date(text: str) -> Optional[date]: - """ - Parse date string in various formats. - - Supports: DD-MM-YYYY, DD/MM/YYYY, DD.MM.YYYY, YYYY-MM-DD - """ - if not text: - return None - - # Normalize separators - text = text.replace('/', '-').replace('.', '-') - - try: - parts = text.split('-') - if len(parts) != 3: - return None - - # Determine format based on first part length - if len(parts[0]) == 4: - # YYYY-MM-DD - year, month, day = int(parts[0]), int(parts[1]), int(parts[2]) - else: - # DD-MM-YYYY - day, month, year = int(parts[0]), int(parts[1]), int(parts[2]) - - # Validate ranges - if 1 <= day <= 31 and 1 <= month <= 12 and 2000 <= year <= 2100: - return date(year, month, day) - except (ValueError, TypeError, IndexError): - pass - - return None - - @staticmethod - def _clean_text(text: str) -> str: - """Clean OCR text for pattern matching.""" - if not text: - return "" - text = re.sub(r'\s+', ' ', text) - text = re.sub(r'[\x00-\x09\x0b\x0c\x0e-\x1f\x7f]', '', text) - return text.strip() - - # ------------------------------------------------------------------------- - # Magic methods - # ------------------------------------------------------------------------- - - def __repr__(self) -> str: - return f"<{self.__class__.__name__} CUI={self.CUI_LIST}>" - - def __str__(self) -> str: - return f"{self.STORE_NAME} ({', '.join(self.CUI_LIST)})" diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/tesseract_engine.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/tesseract_engine.py deleted file mode 100644 index 27340b0..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/tesseract_engine.py +++ /dev/null @@ -1,655 +0,0 @@ -""" -Optimized Tesseract Engine for OCR - SPEED + QUALITY OPTIMIZED - -Performance optimizations (vs previous version): -- Single PSM mode (PSM 4) instead of multi-PSM (4 modes × 2 calls = 8x faster) -- Single Tesseract call per image (skip image_to_data for speed) -- Lighter preprocessing (no over-binarization) -- --dpi 300 flag for proper scaling -- OEM 3 (default LSTM+Legacy) for balanced speed/accuracy - -Quality optimizations for Romanian receipts: -- PSM 4: Single column layout (optimal for receipts) -- Polarity correction: ensures black text on white background -- Language: Romanian only (-l ron) for faster recognition -- Fallback to PSM 6 if PSM 4 produces poor results - -Previous issues fixed: -- Was 8x slower than PaddleOCR due to multi-PSM + dual calls -- Produced gibberish on clear PDFs due to over-binarization -""" - -import logging -import os -from dataclasses import dataclass, field -from typing import List, Optional, Tuple - -import cv2 -import numpy as np - -# Check Tesseract availability -try: - import pytesseract - TESSERACT_AVAILABLE = True -except ImportError: - TESSERACT_AVAILABLE = False - pytesseract = None - -logger = logging.getLogger(__name__) - - -@dataclass -class OCRResult: - """Raw OCR result from Tesseract.""" - text: str - confidence: float - boxes: List[dict] = field(default_factory=list) - engine: str = "tesseract" - - -class TesseractEngine: - """ - Optimized Tesseract engine for receipt OCR. - - TESTED OPTIMAL SETTINGS (from comprehensive benchmark): - - DPI 200 for PDF loading (not 300!) - - Padding 40px for edge protection - - PSM 6 for complex receipts, PSM 4 for simple ones - - Multi-pass strategy when quality is critical - - SPEED vs QUALITY tradeoff: - - Fast mode (single pass): ~0.9s, ~6-7 keywords - - Quality mode (multi-pass): ~1.7s, ~8-9 keywords (+2 more keywords) - - BENCHMARK RESULTS: - - padded_psm6_40: Best for complex receipts (igiena, five-holding) - - baseline_psm4: Best for simple receipts (rechizite, benzina) - - multi-pass: Best overall quality but slower - """ - - # PSM modes for receipts - PSM_SINGLE_COLUMN = 4 # Best for simple vertical receipts - PSM_UNIFORM_BLOCK = 6 # Best for complex layouts - PSM_SPARSE_TEXT = 11 # Fallback for difficult receipts - - # Optimal padding (from benchmark) - DEFAULT_PADDING = 40 - - def __init__(self): - """Initialize Tesseract engine.""" - if not TESSERACT_AVAILABLE: - raise RuntimeError("pytesseract not available. Install with: pip install pytesseract") - - # Verify Tesseract installation - try: - self._version = pytesseract.get_tesseract_version() - except Exception as e: - raise RuntimeError(f"Tesseract not installed or not in PATH: {e}") - - logger.info(f"[TesseractEngine] Initialized (v{self._version})") - - def recognize(self, image: np.ndarray, fast_mode: bool = True) -> OCRResult: - """ - Perform OCR recognition on image (OPTIMIZED). - - SPEED: Uses single PSM mode + single Tesseract call. - Previously used 4 PSM modes × 2 calls = 8 Tesseract invocations. - Now uses 1-2 calls maximum (with fallback). - - Args: - image: Preprocessed grayscale image (DO NOT binarize for clear PDFs!) - fast_mode: If True, skip confidence calculation for maximum speed - - Returns: - OCRResult with text and confidence - """ - if not TESSERACT_AVAILABLE: - return OCRResult(text="", confidence=0.0, boxes=[], engine="tesseract") - - # Ensure grayscale - if len(image.shape) == 3: - image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) - - # Fix polarity (black text on white background) - image = self._ensure_correct_polarity(image) - - # Try PSM 4 first (single column - best for receipts) - result = self._recognize_fast(image, self.PSM_SINGLE_COLUMN, fast_mode) - - # If poor result, try PSM 6 as fallback - if not result.text.strip() or result.confidence < 0.3: - logger.debug(f"[Tesseract] PSM {self.PSM_SINGLE_COLUMN} poor result, trying PSM {self.PSM_UNIFORM_BLOCK}") - fallback = self._recognize_fast(image, self.PSM_UNIFORM_BLOCK, fast_mode) - if len(fallback.text) > len(result.text): - result = fallback - - if result.text.strip(): - logger.info(f"[TesseractEngine] Result: {len(result.text)} chars, conf={result.confidence:.0%}") - - return result - - def _recognize_fast(self, image: np.ndarray, psm: int, fast_mode: bool = True) -> OCRResult: - """ - Fast single-call Tesseract recognition. - - Optimizations: - - Single call (image_to_string only in fast mode) - - OEM 3 (LSTM+Legacy) - faster than OEM 1 - - --dpi 300 for proper scaling - - Romanian only (-l ron) - - Args: - image: Grayscale image - psm: Page segmentation mode - fast_mode: Skip confidence calculation for speed - - Returns: - OCRResult - """ - # Build optimized config: - # OEM 3 = LSTM + Legacy (faster than pure LSTM) - # --dpi 300 = proper scaling hint - # -l ron = Romanian only (faster, avoids eng confusion) - config = f'--psm {psm} --oem 3 --dpi 300 -l ron' - - try: - if fast_mode: - # Fast path: just get text, estimate confidence - text = pytesseract.image_to_string(image, config=config) - # Estimate confidence based on text quality - confidence = self._estimate_confidence(text) - else: - # Accurate path: get text + real confidence - text = pytesseract.image_to_string(image, config=config) - data = pytesseract.image_to_data( - image, config=config, output_type=pytesseract.Output.DICT - ) - confidences = [int(c) for c in data['conf'] if int(c) > 0] - confidence = sum(confidences) / len(confidences) / 100 if confidences else 0.0 - - return OCRResult( - text=text, - confidence=confidence, - boxes=[], - engine="tesseract" - ) - - except Exception as e: - logger.warning(f"[Tesseract] PSM {psm} error: {e}") - return OCRResult(text="", confidence=0.0, boxes=[], engine="tesseract") - - def _estimate_confidence(self, text: str) -> float: - """ - Estimate OCR confidence based on text quality. - - Heuristics: - - More alphanumeric chars = higher confidence - - Less garbage chars = higher confidence - - Romanian-specific patterns boost confidence - """ - if not text.strip(): - return 0.0 - - # Count valid vs garbage chars - valid_chars = sum(1 for c in text if c.isalnum() or c in '.,;:-/\n ') - total_chars = len(text) - - if total_chars == 0: - return 0.0 - - # Base confidence from char ratio - confidence = valid_chars / total_chars - - # Boost for Romanian receipt patterns - text_lower = text.lower() - if any(word in text_lower for word in ['total', 'lei', 'ron', 'buc', 'tva', 'cif', 'bon']): - confidence = min(confidence + 0.1, 1.0) - - return confidence - - def recognize_multipass(self, image: np.ndarray) -> OCRResult: - """ - Multi-pass OCR for maximum quality (slower but more accurate). - - Strategy (from benchmark testing): - - Pass 1: PSM 4 (single column) - no padding, fast baseline - - Pass 2: PSM 6 (uniform block) - with 40px padding, better for complex layouts - - Pass 3: PSM 11 (sparse text) - with 40px padding + stronger CLAHE, for difficult receipts - - Merges results: picks the pass with highest keyword count. - On average finds +2.1 more keywords than single-pass (~8.7 vs 6.6). - - Time: ~1.7s (vs ~0.9s for single pass) - - Args: - image: Input image (RGB or grayscale) - - Returns: - OCRResult from the best pass - """ - if not TESSERACT_AVAILABLE: - return OCRResult(text="", confidence=0.0, boxes=[], engine="tesseract") - - # Ensure grayscale - if len(image.shape) == 3: - gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) - else: - gray = image.copy() - - # Define passes with different settings - passes = [ - # Pass 1: Fast baseline (no padding) - good for simple receipts - {"name": "pass1_psm4", "psm": 4, "padding": 0, "clahe_clip": 1.5}, - # Pass 2: Padded PSM 6 - good for complex receipts - {"name": "pass2_psm6_padded", "psm": 6, "padding": 40, "clahe_clip": 1.5}, - # Pass 3: Sparse text with stronger enhancement - for difficult cases - {"name": "pass3_psm11", "psm": 11, "padding": 40, "clahe_clip": 2.0}, - ] - - best_result = None - best_score = -1 - all_keywords = set() - - for p in passes: - # Apply preprocessing for this pass - processed = gray.copy() - - # Add padding if specified - if p["padding"] > 0: - processed = cv2.copyMakeBorder( - processed, p["padding"], p["padding"], p["padding"], p["padding"], - cv2.BORDER_CONSTANT, value=255 - ) - - # Apply CLAHE - clahe = cv2.createCLAHE(clipLimit=p["clahe_clip"], tileGridSize=(8, 8)) - processed = clahe.apply(processed) - - # Ensure correct polarity - processed = self._ensure_correct_polarity(processed) - - # Run OCR - config = f'--psm {p["psm"]} --oem 3 -l ron' - try: - text = pytesseract.image_to_string(processed, config=config) - confidence = self._estimate_confidence(text) - - # Score based on Romanian receipt keywords - text_lower = text.lower() - keywords = ['cif', 'total', 'tva', 'lei', 'ron', 'buc', 'fiscal', 'bon', - 'hartie', 'prosop', 'saci', 'creion', 'constanta', 'bucuresti'] - found_keywords = [kw for kw in keywords if kw in text_lower] - all_keywords.update(found_keywords) - - # Score: keywords + CIF bonus + TOTAL bonus - score = len(found_keywords) * 10 - if self._has_cif_pattern(text): - score += 15 - if self._has_total_pattern(text): - score += 10 - - logger.debug(f"[Tesseract] {p['name']}: {len(found_keywords)} keywords, score={score}") - - if score > best_score: - best_score = score - best_result = OCRResult( - text=text, - confidence=confidence, - boxes=[], - engine=f"tesseract-multipass-{p['name']}" - ) - - except Exception as e: - logger.warning(f"[Tesseract] {p['name']} failed: {e}") - continue - - if best_result: - logger.info(f"[TesseractEngine] Multi-pass best: {best_result.engine}, " - f"{len(all_keywords)} total keywords found") - return best_result - - return OCRResult(text="", confidence=0.0, boxes=[], engine="tesseract-multipass") - - def _has_cif_pattern(self, text: str) -> bool: - """Check if text contains a valid CIF/CUI pattern.""" - import re - text_upper = text.upper() - patterns = [ - r'CIF[:\s]*RO?\d{6,10}', - r'CUI[:\s]*RO?\d{6,10}', - r'C\.?I\.?F\.?[:\s]*RO?\d{6,10}', - ] - for pattern in patterns: - if re.search(pattern, text_upper): - return True - return bool(re.search(r'RO\d{7,10}', text_upper)) - - def _has_total_pattern(self, text: str) -> bool: - """Check if TOTAL is properly recognized (not truncated to BTOTAL/OTAL).""" - import re - text_upper = text.upper() - return bool(re.search(r'(^|\s)TOTAL\s', text_upper, re.MULTILINE)) - - def recognize_with_boxes(self, image: np.ndarray, psm: int = 4) -> OCRResult: - """ - Recognition with bounding boxes (slower, for debugging/visualization). - - Use this only when you need box coordinates. - For normal OCR, use recognize() which is faster. - - Args: - image: Grayscale image - psm: Page segmentation mode (default: 4 for receipts) - - Returns: - OCRResult with text, confidence, and boxes - """ - if not TESSERACT_AVAILABLE: - return OCRResult(text="", confidence=0.0, boxes=[], engine="tesseract") - - # Ensure grayscale - if len(image.shape) == 3: - image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) - - image = self._ensure_correct_polarity(image) - config = f'--psm {psm} --oem 3 --dpi 300 -l ron' - - try: - text = pytesseract.image_to_string(image, config=config) - data = pytesseract.image_to_data( - image, config=config, output_type=pytesseract.Output.DICT - ) - - confidences = [int(c) for c in data['conf'] if int(c) > 0] - avg_conf = sum(confidences) / len(confidences) / 100 if confidences else 0.0 - - boxes = [] - for i in range(len(data['text'])): - if data['text'][i].strip() and int(data['conf'][i]) > 0: - boxes.append({ - 'text': data['text'][i], - 'confidence': int(data['conf'][i]) / 100, - 'box': [data['left'][i], data['top'][i], data['width'][i], data['height'][i]] - }) - - return OCRResult(text=text, confidence=avg_conf, boxes=boxes, engine="tesseract") - - except Exception as e: - logger.warning(f"[Tesseract] recognize_with_boxes error: {e}") - return OCRResult(text="", confidence=0.0, boxes=[], engine="tesseract") - - def _ensure_correct_polarity(self, image: np.ndarray) -> np.ndarray: - """ - Ensure image has black text on white background. - - Receipts should have dark text on light background. - If image is inverted (light text on dark), invert it. - - Detection method: - - Calculate mean pixel value - - If mean < 127, image is mostly dark (inverted) - - Invert to correct polarity - - Args: - image: Grayscale image - - Returns: - Polarity-corrected image - """ - mean_value = np.mean(image) - - if mean_value < 127: - # Image is mostly dark = inverted (white text on black) - logger.debug(f"[TesseractEngine] Detected inverted polarity (mean={mean_value:.1f}), correcting...") - return 255 - image - - return image - - def recognize_numbers_only(self, image: np.ndarray) -> OCRResult: - """ - OCR optimized for numeric content (amounts, totals). - - Uses character whitelist to reduce errors on numbers. - - Args: - image: Preprocessed grayscale image - - Returns: - OCRResult with numeric text - """ - if not TESSERACT_AVAILABLE: - return OCRResult(text="", confidence=0.0, boxes=[], engine="tesseract") - - # Ensure grayscale - if len(image.shape) == 3: - image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) - - # Fix polarity - image = self._ensure_correct_polarity(image) - - # Config for numbers only - # Whitelist: digits, comma, period, space, RON, LEI - config = '--psm 6 --oem 1 -c tessedit_char_whitelist=0123456789.,- ' - - try: - text = pytesseract.image_to_string(image, config=config) - - data = pytesseract.image_to_data( - image, - config=config, - output_type=pytesseract.Output.DICT - ) - - confidences = [int(c) for c in data['conf'] if int(c) > 0] - avg_conf = sum(confidences) / len(confidences) / 100 if confidences else 0.0 - - return OCRResult( - text=text.strip(), - confidence=avg_conf, - boxes=[], - engine="tesseract-numeric" - ) - - except Exception as e: - logger.error(f"[TesseractEngine] Numeric OCR error: {e}") - return OCRResult(text="", confidence=0.0, boxes=[], engine="tesseract") - - def recognize_cif_optimized(self, image: np.ndarray) -> Optional[str]: - """ - Optimized CIF extraction using multi-strategy approach. - - BENCHMARK RESULTS (from test_critical_fields.py): - - digit_opt_dpi200: 33% accuracy (best) - - digit_whitelist: Works well on specific receipts - - basic_ron_eng: Good backup - - Strategy: - 1. Try digit-optimized preprocessing (2x scale + Otsu) - 2. Try character whitelist (RO + digits only) - 3. Try standard ron+eng config - 4. Return best match based on CIF pattern validation - - Args: - image: Input image (RGB from pdf2image or BGR from OpenCV) - - Returns: - Extracted CIF string (e.g., "RO10562600") or None - """ - import re - - if not TESSERACT_AVAILABLE: - return None - - # Ensure grayscale - if len(image.shape) == 3: - gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) - else: - gray = image.copy() - - # Extract top 35% of image (where CIF is typically found) - height = gray.shape[0] - top_region = gray[:int(height * 0.35), :] - - candidates = [] - - # Strategy 1: Digit-optimized preprocessing (best performer: 33% accuracy) - try: - # Scale up 2x + Otsu binarization - scaled = cv2.resize(top_region, None, fx=2.0, fy=2.0, interpolation=cv2.INTER_CUBIC) - clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8, 8)) - enhanced = clahe.apply(scaled) - _, binary = cv2.threshold(enhanced, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) - if np.mean(binary) < 127: - binary = 255 - binary - - text = pytesseract.image_to_string(binary, config='--psm 6 --oem 3 -l ron') - cif = self._extract_cif_from_text(text) - if cif: - candidates.append(('digit_opt', cif)) - except Exception as e: - logger.debug(f"[TesseractEngine] digit_opt strategy failed: {e}") - - # Strategy 2: Character whitelist (RO + digits only) - try: - # Add padding - padded = cv2.copyMakeBorder(top_region, 40, 40, 40, 40, cv2.BORDER_CONSTANT, value=255) - scaled = cv2.resize(padded, None, fx=2.0, fy=2.0, interpolation=cv2.INTER_CUBIC) - - config = '--psm 6 --oem 1 -c tessedit_char_whitelist=0123456789ROro' - text = pytesseract.image_to_string(scaled, config=config) - cif = self._extract_cif_from_text(text) - if cif: - candidates.append(('whitelist', cif)) - except Exception as e: - logger.debug(f"[TesseractEngine] whitelist strategy failed: {e}") - - # Strategy 3: Standard ron+eng config (good backup) - try: - padded = cv2.copyMakeBorder(top_region, 40, 40, 40, 40, cv2.BORDER_CONSTANT, value=255) - clahe = cv2.createCLAHE(clipLimit=1.5, tileGridSize=(8, 8)) - enhanced = clahe.apply(padded) - - text = pytesseract.image_to_string(enhanced, config='--psm 6 --oem 3 -l ron+eng') - cif = self._extract_cif_from_text(text) - if cif: - candidates.append(('ron_eng', cif)) - except Exception as e: - logger.debug(f"[TesseractEngine] ron_eng strategy failed: {e}") - - if not candidates: - return None - - # Log all candidates - for strategy, cif in candidates: - logger.debug(f"[TesseractEngine] CIF candidate from {strategy}: {cif}") - - # Use majority voting if multiple strategies agree - from collections import Counter - cif_counts = Counter(cif for _, cif in candidates) - most_common_cif, count = cif_counts.most_common(1)[0] - - if count > 1: - # Multiple strategies agree - logger.info(f"[TesseractEngine] CIF extracted (majority {count} strategies): {most_common_cif}") - return most_common_cif - - # No agreement - prefer digit_opt strategy (33% accuracy in benchmarks) - for strategy, cif in candidates: - if strategy == 'digit_opt': - logger.info(f"[TesseractEngine] CIF extracted via digit_opt (preferred): {cif}") - return cif - - # Fallback to first candidate - strategy, cif = candidates[0] - logger.info(f"[TesseractEngine] CIF extracted via {strategy}: {cif}") - return cif - - def _extract_cif_from_text(self, text: str) -> Optional[str]: - """Extract CIF/CUI from OCR text.""" - import re - text_upper = text.upper().replace(' ', '') - - patterns = [ - r'CIF[:\s]*R?O?(\d{6,10})', - r'CUI[:\s]*R?O?(\d{6,10})', - r'C\.?I\.?F\.?[:\s]*R?O?(\d{6,10})', - r'RO(\d{7,10})', - r'R\.?O\.?[\s:]*(\d{6,10})', - ] - - for pattern in patterns: - match = re.search(pattern, text_upper) - if match: - digits = match.group(1).lstrip('0') or '0' - return f"RO{digits}" - - return None - - @staticmethod - def validate_romanian_cif(cif: str) -> bool: - """ - Validate Romanian CIF/CUI using checksum algorithm. - - Romanian CIF format: RO + 2-10 digits - The last digit is a control digit calculated using modulo 11. - - Algorithm: - 1. Multiply each digit by corresponding weight (from right to left: 2,3,4,5,6,7,2,3,4,5) - 2. Sum all products - 3. Remainder of sum / 11 is the control digit - 4. If remainder is 10, control digit is 0 - - Args: - cif: CIF string (e.g., "RO10562600", "10562600") - - Returns: - True if CIF is valid, False otherwise - """ - # Remove RO prefix and spaces - cif = cif.upper().replace(' ', '').replace('RO', '') - - # Must be 2-10 digits - if not cif.isdigit() or len(cif) < 2 or len(cif) > 10: - return False - - # Weights for checksum calculation (right to left) - weights = [2, 3, 4, 5, 6, 7, 2, 3, 4, 5] - - # Pad with zeros on the left to make it 10 digits - cif_padded = cif.zfill(10) - - # Calculate checksum (excluding last digit which is control) - total = 0 - for i in range(9): - total += int(cif_padded[i]) * weights[i] - - # Control digit - control = total % 11 - if control == 10: - control = 0 - - # Compare with last digit - return int(cif_padded[9]) == control - - @staticmethod - def is_available() -> bool: - """Check if Tesseract is available.""" - if not TESSERACT_AVAILABLE: - return False - - try: - pytesseract.get_tesseract_version() - return True - except Exception: - return False - - @staticmethod - def get_version() -> Optional[str]: - """Get Tesseract version string.""" - if not TESSERACT_AVAILABLE: - return None - - try: - return str(pytesseract.get_tesseract_version()) - except Exception: - return None diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/validation.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/validation.py deleted file mode 100644 index 345ea12..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr/validation.py +++ /dev/null @@ -1,1394 +0,0 @@ -""" -OCR Data Validation Module - -Provides multi-layer validation for OCR extraction results to prevent -incorrect data from entering the system. - -Validation Layers: -1. Absolute sanity checks (value ranges) -2. Cross-field validation (correlation between fields) -3. Inter-OCR consistency (compare multiple OCR results) -4. Auto-correction (fix obvious errors) - -Usage: - engine = OCRValidationEngine() - validated_result = engine.validate_extraction( - merged_result, - light_ocr_result, - medium_ocr_result - ) -""" - -from abc import ABC, abstractmethod -from dataclasses import dataclass, field -from typing import Any, Optional - - -@dataclass -class ValidationResult: - """Result of a single validation rule execution. - - Attributes: - is_valid: Whether the validation passed - confidence_penalty: Penalty to apply to confidence score (0.0-1.0) - 0.0 = no penalty, 1.0 = complete rejection - message: Human-readable description of validation result - severity: "info" | "warning" | "error" - """ - is_valid: bool - confidence_penalty: float = 0.0 - message: str = "" - severity: str = "info" # "info" | "warning" | "error" - - def __post_init__(self): - """Validate penalty is in valid range.""" - if not 0.0 <= self.confidence_penalty <= 1.0: - raise ValueError(f"Confidence penalty must be 0.0-1.0, got {self.confidence_penalty}") - - -class ValidationRule(ABC): - """Abstract base class for OCR validation rules. - - Each rule implements a specific validation check and returns - a ValidationResult indicating success/failure with optional - confidence penalty. - """ - - @abstractmethod - def validate(self, data: dict[str, Any]) -> ValidationResult: - """Execute validation rule on extraction data. - - Args: - data: Dictionary containing extraction fields to validate - Example: {"amount": 85.99, "tva": 14.92, ...} - - Returns: - ValidationResult with is_valid flag and optional penalty - """ - pass - - @property - @abstractmethod - def rule_name(self) -> str: - """Human-readable name of this validation rule.""" - pass - - -# ============================================================================ -# VALIDATION RULES -# ============================================================================ - - -class AmountRangeRule(ValidationRule): - """Validate amount is within reasonable bounds for Romanian receipts. - - Romanian receipts rarely exceed 100,000 RON. This catches obvious - OCR errors like digit concatenation (85.99 → 859,762.16). - - Example: - rule = AmountRangeRule(min_amount=0.01, max_amount=100_000.0) - result = rule.validate({"amount": 859762.16}) - # result.is_valid = False, penalty = 0.5 - """ - - def __init__(self, min_amount: float = 0.01, max_amount: float = 100_000.0): - self.min_amount = min_amount - self.max_amount = max_amount - - @property - def rule_name(self) -> str: - return "Amount Range Check" - - def validate(self, data: dict[str, Any]) -> ValidationResult: - amount = data.get("amount") - - if amount is None: - return ValidationResult( - is_valid=True, - message="No amount to validate" - ) - - if amount < self.min_amount: - return ValidationResult( - is_valid=False, - confidence_penalty=0.5, - message=f"Amount {amount:.2f} RON below minimum {self.min_amount:.2f} RON", - severity="error" - ) - - if amount > self.max_amount: - return ValidationResult( - is_valid=False, - confidence_penalty=0.5, - message=f"Amount {amount:.2f} RON exceeds maximum {self.max_amount:.2f} RON (likely OCR error)", - severity="error" - ) - - return ValidationResult( - is_valid=True, - message=f"Amount {amount:.2f} RON within valid range" - ) - - -class TVARatioRule(ValidationRule): - """Validate TVA is reasonable percentage of TOTAL amount. - - Romanian TVA rates: 5%, 9%, 19%, 21% (most common: 19-21%) - This catches errors where TVA > TOTAL (impossible). - - Example: - rule = TVARatioRule(min_ratio=0.05, max_ratio=0.24) - result = rule.validate({"amount": 85.99, "tva": 149.21}) - # result.is_valid = False (149.21 > 85.99!) - """ - - def __init__(self, min_ratio: float = 0.05, max_ratio: float = 0.24): - self.min_ratio = min_ratio - self.max_ratio = max_ratio - - @property - def rule_name(self) -> str: - return "TVA Ratio Check" - - def validate(self, data: dict[str, Any]) -> ValidationResult: - amount = data.get("amount") - tva = data.get("tva") - - if not amount or not tva: - return ValidationResult( - is_valid=True, - message="Insufficient data for TVA correlation" - ) - - # Type safety: ensure numeric types before division - if not isinstance(amount, (int, float)) or not isinstance(tva, (int, float)): - return ValidationResult( - is_valid=True, - message="Non-numeric values, skipping TVA correlation" - ) - - # Avoid division by zero - if amount <= 0: - return ValidationResult( - is_valid=True, - message="Amount is zero or negative, skipping TVA ratio" - ) - - tva_ratio = tva / amount - - if tva_ratio < self.min_ratio or tva_ratio > self.max_ratio: - return ValidationResult( - is_valid=False, - confidence_penalty=0.3, - message=f"TVA ratio {tva_ratio:.1%} outside valid range ({self.min_ratio:.0%}-{self.max_ratio:.0%})", - severity="warning" - ) - - return ValidationResult( - is_valid=True, - message=f"TVA ratio {tva_ratio:.1%} valid" - ) - - -class PaymentSumRule(ValidationRule): - """Validate CARD + NUMERAR = TOTAL BON (within tolerance). - - This is a CRITICAL validation that catches cases where OCR extracts - wrong TOTAL but correct payment methods. - - Example: - rule = PaymentSumRule(tolerance=0.02) - result = rule.validate({ - "amount": 859762.16, # Wrong from OCR - "card_amount": 85.99, # Correct - "cash_amount": 0.0 - }) - # result.is_valid = False, suggests auto-correction - """ - - def __init__(self, tolerance: float = 0.02): - self.tolerance = tolerance - - @property - def rule_name(self) -> str: - return "Payment Sum Check" - - def validate(self, data: dict[str, Any]) -> ValidationResult: - total = data.get("amount") - card = data.get("card_amount", 0.0) or 0.0 - cash = data.get("cash_amount", 0.0) or 0.0 - - if not total: - return ValidationResult( - is_valid=True, - message="No total amount to validate" - ) - - payment_sum = card + cash - - if payment_sum == 0: - return ValidationResult( - is_valid=True, - message="No payment methods extracted" - ) - - diff = abs(total - payment_sum) - - if diff > self.tolerance: - return ValidationResult( - is_valid=False, - confidence_penalty=0.4, - message=f"Payment sum {payment_sum:.2f} RON != Total {total:.2f} RON (diff: {diff:.2f} RON). Consider auto-correction.", - severity="error" - ) - - return ValidationResult( - is_valid=True, - message=f"Payment sum matches total (diff: {diff:.2f} RON)" - ) - - -class TVAEntriesSumRule(ValidationRule): - """Validate Σ(TVA entries) = TVA TOTAL (within tolerance). - - TVA breakdown (A, B, C, D rates) should sum to total TVA. - - Example: - rule = TVAEntriesSumRule(tolerance=0.02) - result = rule.validate({ - "tva": 14.92, - "tva_entries": {"A": 14.92, "B": 0.0} - }) - # result.is_valid = True - """ - - def __init__(self, tolerance: float = 0.02): - self.tolerance = tolerance - - @property - def rule_name(self) -> str: - return "TVA Entries Sum Check" - - def validate(self, data: dict[str, Any]) -> ValidationResult: - tva_total = data.get("tva") - tva_entries = data.get("tva_entries", {}) - - if not tva_total: - return ValidationResult( - is_valid=True, - message="No TVA total to validate" - ) - - if not tva_entries: - return ValidationResult( - is_valid=True, - message="No TVA entries extracted" - ) - - entries_sum = sum(tva_entries.values()) - - if entries_sum == 0: - return ValidationResult( - is_valid=True, - message="TVA entries sum is zero" - ) - - diff = abs(tva_total - entries_sum) - - if diff > self.tolerance: - return ValidationResult( - is_valid=False, - confidence_penalty=0.2, - message=f"TVA entries sum {entries_sum:.2f} RON != TVA total {tva_total:.2f} RON (diff: {diff:.2f} RON)", - severity="warning" - ) - - return ValidationResult( - is_valid=True, - message=f"TVA entries sum matches total (diff: {diff:.2f} RON)" - ) - - -class CUIFormatRule(ValidationRule): - """Validate CUI format: RO + 6-10 digits. - - Romanian CUI (Cod Unic de Identificare) format: - - Optional "RO" prefix (or "R0" from OCR errors) - - 6-10 numeric digits - - Example: - rule = CUIFormatRule() - result = rule.validate({"cui": "RO10562600"}) - # result.is_valid = True - """ - - @property - def rule_name(self) -> str: - return "CUI Format Check" - - def validate(self, data: dict[str, Any]) -> ValidationResult: - cui = data.get("cui") - - if not cui: - return ValidationResult( - is_valid=True, - message="No CUI to validate" - ) - - # Normalize: remove RO/R0 prefix - cui_clean = cui.strip().upper() - if cui_clean.startswith("RO"): - cui_clean = cui_clean[2:] - elif cui_clean.startswith("R0"): - cui_clean = cui_clean[2:] - - # Check if numeric - if not cui_clean.isdigit(): - return ValidationResult( - is_valid=False, - confidence_penalty=0.3, - message=f"CUI '{cui}' contains non-numeric characters", - severity="warning" - ) - - # Check length - if len(cui_clean) < 6 or len(cui_clean) > 10: - return ValidationResult( - is_valid=False, - confidence_penalty=0.3, - message=f"CUI '{cui}' length {len(cui_clean)} outside valid range (6-10 digits)", - severity="warning" - ) - - return ValidationResult( - is_valid=True, - message=f"CUI '{cui}' format valid" - ) - - -class CUIChecksumRule(ValidationRule): - """Validate Romanian CIF/CUI using Mod 11 checksum algorithm. - - Algorithm: - 1. Remove RO prefix if present - 2. Extract last digit as declared checksum - 3. Apply multipliers [7,5,3,2,1,7,5,3,2] to first N-1 digits - 4. Calculate: (sum * 10) mod 11 - 5. If result = 10, expected checksum = 0 - 6. Else, expected checksum = result - 7. Compare with declared checksum - - Example: - rule = CUIChecksumRule() - result = rule.validate({"cui": "RO10562600"}) - # result.is_valid = True (checksum correct) - - result = rule.validate({"cui": "R01879855"}) - # result.is_valid = False (checksum mismatch) - - Static methods available for direct use: - CUIChecksumRule.calculate_checksum("1056260") -> 0 - CUIChecksumRule.validate_checksum("10562600") -> True - CUIChecksumRule.has_ro_prefix("RO10562600") -> True - """ - - # Fixed multipliers for 9 positions (Romanian Mod 11) - MULTIPLIERS = [7, 5, 3, 2, 1, 7, 5, 3, 2] - - @staticmethod - def calculate_checksum(cui_base: str) -> int: - """Calculate expected CUI checksum using Romanian Mod 11 algorithm. - - Args: - cui_base: CUI digits WITHOUT the checksum digit (last digit) - - Returns: - Expected checksum digit (0-9), or -1 if invalid input - """ - if not cui_base or not cui_base.isdigit(): - return -1 - - # Pad base to 9 digits from LEFT - base_padded = cui_base.zfill(9) - base_digits = [int(d) for d in base_padded] - - # Calculate weighted sum - weighted_sum = sum(d * m for d, m in zip(base_digits, CUIChecksumRule.MULTIPLIERS)) - - # Calculate checksum - checksum = (weighted_sum * 10) % 11 - if checksum == 10: - checksum = 0 - - return checksum - - @staticmethod - def validate_checksum(cui_digits: str) -> bool: - """Check if CUI checksum is valid. - - Args: - cui_digits: Full CUI digits (including checksum as last digit) - - Returns: - True if checksum is valid, False otherwise - """ - if not cui_digits or len(cui_digits) < 6 or not cui_digits.isdigit(): - return False - - base = cui_digits[:-1] - declared = int(cui_digits[-1]) - expected = CUIChecksumRule.calculate_checksum(base) - - return expected == declared - - @staticmethod - def has_ro_prefix(cui: str) -> bool: - """Check if CUI has RO prefix (proper format for VAT payers).""" - if not cui: - return False - return cui.upper().strip().startswith('RO') - - @staticmethod - def extract_digits(cui: str) -> str: - """Extract digits from CUI, removing RO/R0 prefix.""" - if not cui: - return "" - cui = cui.strip().upper() - if cui.startswith("RO"): - cui = cui[2:] - elif cui.startswith("R0"): # Fix OCR error R0 → RO - cui = cui[2:] - return ''.join(c for c in cui if c.isdigit()) - - @property - def rule_name(self) -> str: - return "CUI Checksum Check (Mod 11)" - - def validate(self, data: dict[str, Any]) -> ValidationResult: - cui = data.get("cui") - - if not cui: - return ValidationResult( - is_valid=True, - message="No CUI to validate" - ) - - # Use static method to extract digits - cui_clean = CUIChecksumRule.extract_digits(cui) - - # Check format first - if not cui_clean: - return ValidationResult( - is_valid=True, # Don't fail checksum if format invalid (handled by CUIFormatRule) - message="CUI format invalid, skipping checksum" - ) - - if len(cui_clean) < 6 or len(cui_clean) > 10: - return ValidationResult( - is_valid=True, - message="CUI length invalid, skipping checksum" - ) - - # Use static method to validate checksum - if not CUIChecksumRule.validate_checksum(cui_clean): - # Calculate expected for error message - expected = CUIChecksumRule.calculate_checksum(cui_clean[:-1]) - declared = int(cui_clean[-1]) - return ValidationResult( - is_valid=False, - confidence_penalty=0.3, - message=f"CUI '{cui}' checksum mismatch: expected {expected}, got {declared}", - severity="warning" - ) - - return ValidationResult( - is_valid=True, - message=f"CUI '{cui}' checksum valid" - ) - - -class TVABasedTotalRule(ValidationRule): - """Validate TOTAL using reverse calculation from TVA amount. - - This is a CRITICAL validation that catches cases where OCR extracts - wrong TOTAL but correct TVA. Since TVA = BASE * rate and TOTAL = BASE + TVA, - we can calculate expected TOTAL from TVA alone. - - Formula: - Expected TOTAL = TVA / rate * (1 + rate) - Or equivalently: Expected TOTAL = TVA * (1 + rate) / rate - - For TVA rate 21%: - Expected TOTAL = TVA / 0.21 * 1.21 = TVA * 5.7619 - - Example (benzina 27 oct): - TVA = 49.58, rate = 21% - Expected TOTAL = 49.58 / 0.21 * 1.21 = 285.68 - Extracted TOTAL = 205.66 (WRONG!) - Rule detects mismatch and flags for escalation - - Usage in multi-tier processing (e.g., doctr_plus): - If this rule fails, the engine should proceed to next tier - instead of returning early with potentially wrong data. - """ - - def __init__(self, tolerance_percent: float = 0.02): - """ - Args: - tolerance_percent: Allowed difference as percentage (0.02 = 2%) - """ - self.tolerance_percent = tolerance_percent - - @property - def rule_name(self) -> str: - return "TVA-Based Total Check" - - def validate(self, data: dict[str, Any]) -> ValidationResult: - total = data.get("amount") - tva = data.get("tva") - tva_entries = data.get("tva_entries", []) - - if not total or not tva: - return ValidationResult( - is_valid=True, - message="Insufficient data for TVA-based total validation" - ) - - # Type safety - try: - total = float(total) - tva = float(tva) - except (TypeError, ValueError): - return ValidationResult( - is_valid=True, - message="Non-numeric values, skipping TVA-based total validation" - ) - - if tva <= 0 or total <= 0: - return ValidationResult( - is_valid=True, - message="Zero or negative values, skipping TVA-based total validation" - ) - - # Try to determine TVA rate from entries - tva_rate = None - - # Check tva_entries for rate information - if tva_entries: - for entry in tva_entries: - if isinstance(entry, dict): - percent = entry.get('percent') - if percent: - try: - tva_rate = float(percent) / 100.0 - break - except (TypeError, ValueError): - pass - - # Fallback: try to calculate rate from TVA/TOTAL ratio - if not tva_rate: - # TVA = BASE * rate, TOTAL = BASE + TVA = BASE * (1 + rate) - # TVA/TOTAL = rate / (1 + rate) - # So rate = TVA / (TOTAL - TVA) = TVA / BASE - base = total - tva - if base > 0: - calculated_rate = tva / base - # Validate it's a reasonable Romanian TVA rate (5%, 9%, 19%, 21%) - if 0.04 <= calculated_rate <= 0.25: - tva_rate = calculated_rate - - if not tva_rate: - # Assume most common rate: 21% - tva_rate = 0.21 - - # Calculate expected TOTAL from TVA - # TVA = BASE * rate → BASE = TVA / rate - # TOTAL = BASE + TVA = (TVA / rate) + TVA = TVA * (1 + 1/rate) = TVA * (1 + rate) / rate - expected_total = tva * (1 + tva_rate) / tva_rate - - # Calculate difference - diff = abs(total - expected_total) - diff_percent = diff / expected_total if expected_total > 0 else 1.0 - - if diff_percent > self.tolerance_percent: - # Significant mismatch - OCR likely extracted TOTAL wrong - return ValidationResult( - is_valid=False, - confidence_penalty=0.5, # High penalty - this is a critical error - message=( - f"TOTAL mismatch: Extracted {total:.2f} RON vs " - f"TVA-calculated {expected_total:.2f} RON " - f"(TVA={tva:.2f}, rate={tva_rate:.0%}, diff={diff_percent:.1%}). " - f"Likely OCR error on TOTAL." - ), - severity="error" - ) - - return ValidationResult( - is_valid=True, - message=f"TOTAL {total:.2f} matches TVA-calculated {expected_total:.2f} (diff: {diff_percent:.1%})" - ) - - -class InterOCRConsistencyRule(ValidationRule): - """Validate consistency between multiple OCR results. - - If Light OCR and Medium OCR produce values that differ by >10x, - one is clearly wrong (likely digit concatenation error). - - Example: - rule = InterOCRConsistencyRule(max_ratio=10.0) - result = rule.validate({ - "light_amount": 85.99, - "medium_amount": 859762.16 - }) - # result.is_valid = False (ratio = 10,000x!) - """ - - def __init__(self, max_ratio: float = 10.0): - self.max_ratio = max_ratio - - @property - def rule_name(self) -> str: - return "Inter-OCR Consistency Check" - - def validate(self, data: dict[str, Any]) -> ValidationResult: - light_value = data.get("light_value") - medium_value = data.get("medium_value") - field_name = data.get("field_name", "value") - - if not light_value or not medium_value: - return ValidationResult( - is_valid=True, - message="Insufficient OCR results for consistency check" - ) - - # Avoid division by zero - if light_value == 0 or medium_value == 0: - return ValidationResult( - is_valid=True, - message="One value is zero, skipping consistency check" - ) - - ratio = max(light_value, medium_value) / min(light_value, medium_value) - - if ratio > self.max_ratio: - return ValidationResult( - is_valid=False, - confidence_penalty=0.2, - message=f"{field_name}: OCR results differ by {ratio:.1f}x (Light: {light_value}, Medium: {medium_value})", - severity="warning" - ) - - return ValidationResult( - is_valid=True, - message=f"{field_name}: OCR results consistent (ratio: {ratio:.2f}x)" - ) - - -# ============================================================================ -# VALIDATION ENGINE -# ============================================================================ - - -@dataclass -class EnhancedExtractionResult: - """Enhanced extraction result with validation metadata. - - This wraps the original extraction data and adds validation results. - """ - # Original data - data: dict[str, Any] - - # Validation results - needs_manual_review: bool = False - validation_warnings: list[str] = field(default_factory=list) - validation_errors: list[str] = field(default_factory=list) - confidence_adjustments: dict[str, float] = field(default_factory=dict) - - # Inter-OCR metadata - inter_ocr_ratios: dict[str, float] = field(default_factory=dict) - - -class OCRValidationEngine: - """Orchestrate all validation rules for OCR extraction results. - - This engine applies validation rules in order: - 1. Sanity checks (amount range, format checks) - 2. Cross-field correlation (TVA ratio, payment sum) - 3. Inter-OCR consistency checks - - Example: - engine = OCRValidationEngine() - result = engine.validate_extraction( - extraction_result=merged_data, - light_result=light_ocr_data, - medium_result=medium_ocr_data - ) - """ - - def __init__(self): - """Initialize validation engine with default rules.""" - # Sanity check rules (absolute value validation) - self.sanity_rules = [ - AmountRangeRule(min_amount=0.01, max_amount=100_000.0), - CUIFormatRule(), - CUIChecksumRule(), - ] - - # Cross-field validation rules (correlation between fields) - self.cross_field_rules = [ - TVARatioRule(min_ratio=0.05, max_ratio=0.24), - PaymentSumRule(tolerance=0.02), - TVAEntriesSumRule(tolerance=0.02), - TVABasedTotalRule(tolerance_percent=0.02), # Critical: detect TOTAL errors via TVA - ] - - # Inter-OCR consistency rules - self.inter_ocr_rules = [ - InterOCRConsistencyRule(max_ratio=10.0), - ] - - def validate_extraction( - self, - extraction_result: dict[str, Any], - light_result: Optional[dict[str, Any]] = None, - medium_result: Optional[dict[str, Any]] = None - ) -> EnhancedExtractionResult: - """Run all validation rules and return enhanced result. - - Args: - extraction_result: Merged OCR extraction data (required) - light_result: Light OCR preprocessing results (optional) - medium_result: Medium OCR preprocessing results (optional) - - Returns: - EnhancedExtractionResult with validation warnings and metadata - """ - warnings = [] - errors = [] - confidence_adjustments = {} - inter_ocr_ratios = {} - - # Step 1: Sanity checks - print("\n[Validation] Step 1: Sanity checks...", flush=True) - for rule in self.sanity_rules: - result = rule.validate(extraction_result) - - if not result.is_valid: - msg = f"[{rule.rule_name}] {result.message}" - - if result.severity == "error": - errors.append(msg) - else: - warnings.append(msg) - - print(f" [X] {msg}", flush=True) - - # Track confidence penalty for the relevant field based on rule - if result.confidence_penalty > 0: - rule_field_map = { - "Amount Range Check": ["amount"], - "CUI Format Check": ["cui"], - "CUI Checksum Check (Mod 11)": ["cui"], - } - fields = rule_field_map.get(rule.rule_name, ["amount", "tva", "cui"]) - for f in fields: - if f in extraction_result: - confidence_adjustments[f] = result.confidence_penalty - else: - print(f" [OK] {rule.rule_name}: {result.message}", flush=True) - - # Step 2: Cross-field validation - print("\n[Validation] Step 2: Cross-field validation...", flush=True) - for rule in self.cross_field_rules: - result = rule.validate(extraction_result) - - if not result.is_valid: - msg = f"[{rule.rule_name}] {result.message}" - - if result.severity == "error": - errors.append(msg) - else: - warnings.append(msg) - - print(f" [X] {msg}", flush=True) - - # Track confidence penalty for the relevant field based on rule - if result.confidence_penalty > 0: - rule_field_map = { - "TVA Ratio Check": ["tva"], - "Payment Sum Check": ["amount"], - "TVA Entries Sum Check": ["tva"], - } - fields = rule_field_map.get(rule.rule_name, ["amount", "tva"]) - for f in fields: - if f in extraction_result: - confidence_adjustments[f] = result.confidence_penalty - else: - print(f" [OK] {rule.rule_name}: {result.message}", flush=True) - - # Step 3: Inter-OCR consistency checks - if light_result and medium_result: - print("\n[Validation] Step 3: Inter-OCR consistency...", flush=True) - - # Check amount consistency - if "amount" in light_result and "amount" in medium_result: - consistency_data = { - "light_value": light_result["amount"], - "medium_value": medium_result["amount"], - "field_name": "amount" - } - - result = self.inter_ocr_rules[0].validate(consistency_data) - - if not result.is_valid: - msg = f"[Inter-OCR] {result.message}" - warnings.append(msg) - print(f" [X] {msg}", flush=True) - - # Store ratio for metadata - ratio = max( - light_result["amount"], - medium_result["amount"] - ) / min(light_result["amount"], medium_result["amount"]) - inter_ocr_ratios["amount"] = ratio - else: - print(f" [OK] {result.message}", flush=True) - - # Determine if manual review is needed - # Only flag for review if there are errors OR high-severity warnings - high_severity_warnings = [w for w in warnings if "[Amount Range" in w or "[Payment Sum" in w or "[Inter-OCR]" in w] - needs_manual_review = ( - len(errors) > 0 or - len(high_severity_warnings) > 0 or - any(ratio > 10.0 for ratio in inter_ocr_ratios.values()) - ) - - print(f"\n[Validation] Summary:", flush=True) - print(f" Errors: {len(errors)}", flush=True) - print(f" Warnings: {len(warnings)}", flush=True) - print(f" Manual review needed: {needs_manual_review}", flush=True) - - return EnhancedExtractionResult( - data=extraction_result, - needs_manual_review=needs_manual_review, - validation_warnings=warnings, - validation_errors=errors, - confidence_adjustments=confidence_adjustments, - inter_ocr_ratios=inter_ocr_ratios - ) - - def quick_validate_for_hybrid(self, extraction_result: dict[str, Any]) -> tuple[bool, float, list[str]]: - """Quick validation for early-exit decisions (e.g., doctr_plus Tier 1). - - Runs critical cross-validation rules to detect obvious OCR errors. - Used to decide whether to proceed to next processing tier or exit early. - - Args: - extraction_result: Extraction data dict with fields: - - amount: Extracted TOTAL - - tva: Extracted TVA total - - tva_entries: List of TVA entries with rates - - Returns: - Tuple of (passes_validation, confidence_penalty, error_messages) - - passes_validation: True if no critical errors detected - - confidence_penalty: Cumulative penalty (0.0-1.0) - - error_messages: List of validation error messages - - Example usage: - passes, penalty, errors = validation_engine.quick_validate_for_hybrid(extraction_data) - if not passes: - print(f"Validation failed: {errors}, proceeding to next tier") - # Continue to next processing tier instead of early exit - """ - errors = [] - total_penalty = 0.0 - - # Critical rules for early-exit decision-making - # These determine if we can trust the extraction or need to proceed to next tier - critical_rules = [ - # Cross-field validations (most important for detecting OCR errors) - TVABasedTotalRule(tolerance_percent=0.02), # Critical: detect TOTAL errors via TVA calculation - PaymentSumRule(tolerance=0.05), # Cross-validate TOTAL vs CARD+CASH payments - TVARatioRule(min_ratio=0.05, max_ratio=0.24), # TVA should be 5-24% of TOTAL - TVAEntriesSumRule(tolerance=0.05), # Sum of TVA entries should match TVA total - - # Format & checksum validations - CUIChecksumRule(), # Validate CUI/CIF with Romanian Mod11 checksum algorithm - CUIFormatRule(), # CUI should be 6-10 digits - - # Sanity checks - AmountRangeRule(min_amount=0.01, max_amount=100_000.0), # Reasonable amount range - ] - - for rule in critical_rules: - result = rule.validate(extraction_result) - if not result.is_valid: - errors.append(result.message) - total_penalty += result.confidence_penalty - - # Cap penalty at 1.0 - total_penalty = min(1.0, total_penalty) - - passes = len(errors) == 0 - return passes, total_penalty, errors - - # NOTE: _calculate_cui_checksum and _is_cui_checksum_valid removed - # Use CUIChecksumRule.calculate_checksum() and CUIChecksumRule.validate_checksum() instead - - @staticmethod - def _repair_cui_checksum(cui_digits: str) -> Optional[str]: - """Try to repair CUI by attempting 1-digit corrections. - - OCR often misreads similar-looking digits: - - 5 ↔ 8 (most common in receipts) - - 6 ↔ 0 - - 1 ↔ 7 - - 3 ↔ 8 - - Algorithm: - 1. Check middle positions first (2,3,4,5...) - OCR errors more common there - 2. Skip first digit (position 0) - usually reliable in CUI - 3. Check checksum digit (last position) last - 4. Prefer common OCR digit confusions (5↔8, 6↔0) - - Args: - cui_digits: Original CUI digits (without RO prefix) - - Returns: - Repaired CUI digits if 1-digit fix found, else None - """ - if len(cui_digits) < 6 or not cui_digits.isdigit(): - return None - - # If already valid, return as-is - if CUIChecksumRule.validate_checksum(cui_digits): - return cui_digits - - # Common OCR digit confusions (try these first) - confusion_pairs = { - '5': ['8', '6'], # 5 often misread as 8 or 6 - '8': ['5', '3', '0'], # 8 often misread as 5, 3, or 0 - '6': ['0', '8'], # 6 often misread as 0 or 8 - '0': ['6', '8'], # 0 often misread as 6 or 8 - '1': ['7', '4'], # 1 often misread as 7 or 4 - '7': ['1'], # 7 often misread as 1 - '3': ['8'], # 3 often misread as 8 - '4': ['1'], # 4 often misread as 1 - '2': ['7'], # 2 sometimes misread as 7 - '9': ['0'], # 9 sometimes misread as 0 - } - - n = len(cui_digits) - last_pos = n - 1 # checksum position - - # Position check order: middle positions first, then position 1, then 0, then checksum - # Skip position 0 (first digit) - it's usually reliable - # Example for 8-digit CUI: [2,3,4,5,6, 1, 7(checksum)] - middle_positions = list(range(2, last_pos)) # positions 2 to n-2 - position_order = middle_positions + [1, last_pos, 0] # check pos 0 last (rarely wrong) - - for pos in position_order: - if pos >= n: - continue - - original_digit = cui_digits[pos] - - # Try common confusions first for this digit - candidates = confusion_pairs.get(original_digit, []) - # Then try all other digits - all_digits = [d for d in '0123456789' if d != original_digit and d not in candidates] - - for replacement in candidates + all_digits: - candidate = cui_digits[:pos] + replacement + cui_digits[pos+1:] - if CUIChecksumRule.validate_checksum(candidate): - print(f"[CUI Repair] Fixed {cui_digits} -> {candidate} (position {pos}: {original_digit}->{replacement})", flush=True) - return candidate - - # No single-digit fix found - return None - - @staticmethod - def normalize_cui(cui: Optional[str]) -> Optional[str]: - """Normalize CUI - fix OCR errors but preserve original format. - - Rules: - - R0 → RO (fix OCR error where O is read as 0) - - Keep RO prefix if original had it (platitor TVA) - - Do NOT add RO if original didn't have it (neplatitor TVA) - - Try to repair 1-digit checksum errors (OCR mistakes like 5↔8) - - Examples: - 45417955 → 45417955 (no prefix = neplatitor TVA, keep as-is) - R010562600 → RO10562600 (fix R0 OCR error) - RO10562600 → RO10562600 (unchanged) - RO10862600 → RO10562600 (repaired: 8→5 at position 2) - - Args: - cui: Raw CUI string from OCR - - Returns: - Normalized CUI, or None if invalid - """ - if not cui: - return None - - cui = cui.strip().upper() - - # Check if original had RO/R0 prefix - had_ro_prefix = cui.startswith("RO") or cui.startswith("R0") - - # Extract digits - if cui.startswith("RO"): - cui_digits = cui[2:] - elif cui.startswith("R0"): # Fix OCR error R0 → RO - cui_digits = cui[2:] - else: - cui_digits = cui - - # Remove any non-digit characters - cui_digits = ''.join(c for c in cui_digits if c.isdigit()) - - # Validate length - if len(cui_digits) < 6 or len(cui_digits) > 10: - print(f"[CUI Normalize] Invalid length: {len(cui_digits)} digits (expected 6-10)", flush=True) - return None - - # Try to repair checksum if invalid - if not CUIChecksumRule.validate_checksum(cui_digits): - repaired = OCRValidationEngine._repair_cui_checksum(cui_digits) - if repaired: - cui_digits = repaired - - # Return with RO prefix only if original had it - if had_ro_prefix: - return f"RO{cui_digits}" - else: - return cui_digits - - @staticmethod - async def fuzzy_match_cui_from_db( - cui: Optional[str], - db_session - ) -> Optional[tuple[str, str]]: - """Fuzzy match CUI against database of known suppliers. - - This function: - 1. Validates CUI checksum - 2. If valid, looks up in database (exact match) - 3. If invalid, tries 1-digit corrections and looks up each candidate - 4. Returns the first match found in database - - Args: - cui: Extracted CUI from OCR (may be invalid) - db_session: SQLAlchemy async session for database lookups - - Returns: - Tuple of (corrected_cui, supplier_name) if found, else None - - Usage in OCR extraction: - from backend.modules.data_entry.services.ocr.validation import OCRValidationEngine - match = await OCRValidationEngine.fuzzy_match_cui_from_db(extracted_cui, session) - if match: - corrected_cui, supplier_name = match - """ - from sqlalchemy import select, or_ - from backend.modules.data_entry.db.models.nomenclature import SyncedSupplier, LocalSupplier - - if not cui: - return None - - cui = cui.strip().upper() - - # Check if original had RO/R0 prefix - had_ro_prefix = cui.startswith("RO") or cui.startswith("R0") - - # Extract digits - if cui.startswith("RO"): - cui_digits = cui[2:] - elif cui.startswith("R0"): # Fix OCR error R0 → RO - cui_digits = cui[2:] - else: - cui_digits = cui - - # Remove any non-digit characters - cui_digits = ''.join(c for c in cui_digits if c.isdigit()) - - # Validate length - if len(cui_digits) < 6 or len(cui_digits) > 10: - return None - - # Helper to format CUI with optional RO prefix - def format_cui(digits: str) -> str: - if had_ro_prefix: - return f"RO{digits}" - return digits - - # Helper to search database for CUI - async def lookup_cui_in_db(digits: str) -> Optional[tuple[str, str]]: - """Search both synced and local suppliers for CUI.""" - # Search patterns: with and without RO prefix, with and without space - # Database may have: "22891860", "RO22891860", "RO 22891860" - search_patterns = [ - digits, # Just digits: 22891860 - f"RO{digits}", # With RO prefix: RO22891860 - f"RO {digits}", # With RO prefix and space: RO 22891860 - digits.lstrip('0'), # Handle leading zeros - ] - - # Search synced_suppliers first (more data) - stmt = select(SyncedSupplier.fiscal_code, SyncedSupplier.name).where( - or_( - SyncedSupplier.fiscal_code == digits, - SyncedSupplier.fiscal_code == f"RO{digits}", - SyncedSupplier.fiscal_code == f"RO {digits}", # With space - SyncedSupplier.fiscal_code == digits.lstrip('0'), # Handle leading zeros - ) - ).limit(1) - result = await db_session.execute(stmt) - row = result.first() - if row: - return (format_cui(digits), row.name) - - # Search local_suppliers - stmt = select(LocalSupplier.fiscal_code, LocalSupplier.name).where( - or_( - LocalSupplier.fiscal_code == digits, - LocalSupplier.fiscal_code == f"RO{digits}", - LocalSupplier.fiscal_code == f"RO {digits}", # With space - LocalSupplier.fiscal_code == digits.lstrip('0'), - ) - ).limit(1) - result = await db_session.execute(stmt) - row = result.first() - if row: - return (format_cui(digits), row.name) - - return None - - # 1. If checksum is valid, check if it exists in database (exact match) - if CUIChecksumRule.validate_checksum(cui_digits): - match = await lookup_cui_in_db(cui_digits) - if match: - print(f"[Fuzzy CUI] Exact match found: {cui} -> {match[0]} ({match[1]})", flush=True) - return match - # Valid checksum but not in DB - return as-is (it might be a new supplier) - return None - - # 2. Invalid checksum - try 1-digit corrections and verify against database - print(f"[Fuzzy CUI] Invalid checksum for {cui}, trying corrections...", flush=True) - - # Common OCR digit confusions (try these first) - confusion_pairs = { - '5': ['8', '6'], # 5 often misread as 8 or 6 - '8': ['5', '3', '0'], # 8 often misread as 5, 3, or 0 - '6': ['0', '8'], # 6 often misread as 0 or 8 - '0': ['6', '8'], # 0 often misread as 6 or 8 - '1': ['7', '4'], # 1 often misread as 7 or 4 - '7': ['1'], # 7 often misread as 1 - '3': ['8'], # 3 often misread as 8 - '4': ['1'], # 4 often misread as 1 - '2': ['7'], # 2 sometimes misread as 7 - '9': ['0'], # 9 sometimes misread as 0 - } - - n = len(cui_digits) - last_pos = n - 1 # checksum position - - # Position check order: middle positions first, then ends - middle_positions = list(range(2, last_pos)) - position_order = middle_positions + [1, last_pos, 0] - - for pos in position_order: - if pos >= n: - continue - - original_digit = cui_digits[pos] - - # Try common confusions first for this digit - candidates = confusion_pairs.get(original_digit, []) - # Then try all other digits - all_digits = [d for d in '0123456789' if d != original_digit and d not in candidates] - - for replacement in candidates + all_digits: - candidate = cui_digits[:pos] + replacement + cui_digits[pos+1:] - - # Only consider if checksum is valid - if not CUIChecksumRule.validate_checksum(candidate): - continue - - # Check if this corrected CUI exists in database - match = await lookup_cui_in_db(candidate) - if match: - print(f"[Fuzzy CUI] DB match: {cui} -> {match[0]} ({match[1]}) [pos {pos}: {original_digit}->{replacement}]", flush=True) - return match - - # No match found in database - print(f"[Fuzzy CUI] No database match found for {cui}", flush=True) - return None - - @staticmethod - async def fuzzy_match_by_name_and_cui( - vendor_name: Optional[str], - cui: Optional[str], - db_session - ) -> Optional[tuple[str, str]]: - """Fuzzy match supplier by NAME, then narrow down by CUI. - - Algorithm: - 1. Normalize vendor name (remove S.R.L., S.A., punctuation, etc.) - 2. Search suppliers by fuzzy name match (LIKE %name%) - 3. If multiple results, use fuzzy CUI matching to pick best one - 4. Return the best match - - Args: - vendor_name: Extracted vendor name from OCR - cui: Extracted CUI from OCR (may be invalid/incomplete) - db_session: SQLAlchemy async session - - Returns: - Tuple of (matched_cui, supplier_name) if found, else None - """ - from sqlalchemy import select, or_, func - from backend.modules.data_entry.db.models.nomenclature import SyncedSupplier, LocalSupplier - import re - - if not vendor_name or len(vendor_name) < 3: - return None - - # Normalize vendor name for search - def normalize_name(name: str) -> str: - """Normalize name for fuzzy matching.""" - name = name.upper() - # Remove company type suffixes - for suffix in ['S.R.L.', 'SRL', 'S.A.', 'SA', 'S.C.', 'SC', 'I.F.', 'IF', 'P.F.A.', 'PFA']: - name = name.replace(suffix, '') - # Remove punctuation and extra spaces - name = re.sub(r'[.,\-_/\\()"\']', ' ', name) - name = ' '.join(name.split()) - return name.strip() - - # Extract key words from vendor name (for fuzzy search) - normalized_name = normalize_name(vendor_name) - name_words = [w for w in normalized_name.split() if len(w) >= 3] - - if not name_words: - return None - - print(f"[Fuzzy Name] Searching for vendor: '{vendor_name}' -> keywords: {name_words}", flush=True) - - # Build search pattern - use first significant word - primary_word = name_words[0] - search_pattern = f"%{primary_word}%" - - candidates = [] - - # Search synced_suppliers - stmt = select(SyncedSupplier.fiscal_code, SyncedSupplier.name).where( - func.upper(SyncedSupplier.name).like(search_pattern) - ).limit(20) - result = await db_session.execute(stmt) - for row in result: - if row.fiscal_code: - candidates.append((row.fiscal_code, row.name)) - - # Search local_suppliers - stmt = select(LocalSupplier.fiscal_code, LocalSupplier.name).where( - func.upper(LocalSupplier.name).like(search_pattern) - ).limit(20) - result = await db_session.execute(stmt) - for row in result: - if row.fiscal_code: - candidates.append((row.fiscal_code, row.name)) - - if not candidates: - print(f"[Fuzzy Name] No name matches found for '{primary_word}'", flush=True) - return None - - print(f"[Fuzzy Name] Found {len(candidates)} name matches for '{primary_word}'", flush=True) - - # If only one candidate, return it - if len(candidates) == 1: - print(f"[Fuzzy Name] Single match: {candidates[0][0]} ({candidates[0][1]})", flush=True) - return candidates[0] - - # Multiple candidates - try to narrow down by CUI - if cui: - cui_digits = ''.join(c for c in cui.upper().replace('RO', '').replace('R0', '') if c.isdigit()) - - if len(cui_digits) >= 6: - # Score each candidate by how similar their CUI is to the extracted one - def cui_similarity(candidate_cui: str) -> int: - """Calculate how many digits match in the same position.""" - cand_digits = ''.join(c for c in candidate_cui.upper().replace('RO', '') if c.isdigit()) - if len(cand_digits) != len(cui_digits): - return 0 - return sum(1 for a, b in zip(cand_digits, cui_digits) if a == b) - - # Sort candidates by CUI similarity (descending) - scored = [(cui_similarity(c[0]), c) for c in candidates] - scored.sort(key=lambda x: x[0], reverse=True) - - best_score, best_match = scored[0] - # Require at least 70% digit match for CUI similarity - min_matching = int(len(cui_digits) * 0.7) - - if best_score >= min_matching: - print(f"[Fuzzy Name] Best CUI match: {best_match[0]} ({best_match[1]}) - score {best_score}/{len(cui_digits)}", flush=True) - return best_match - - print(f"[Fuzzy Name] No strong CUI match (best score: {best_score}/{len(cui_digits)})", flush=True) - - # If still multiple and no CUI match, try name similarity - def name_similarity(candidate_name: str) -> int: - """Count how many keywords match.""" - norm_cand = normalize_name(candidate_name) - return sum(1 for w in name_words if w in norm_cand) - - scored = [(name_similarity(c[1]), c) for c in candidates] - scored.sort(key=lambda x: x[0], reverse=True) - - if scored[0][0] >= 2: # At least 2 keywords match - best_match = scored[0][1] - print(f"[Fuzzy Name] Best name match: {best_match[0]} ({best_match[1]})", flush=True) - return best_match - - # Return first candidate if nothing else works - print(f"[Fuzzy Name] Returning first candidate: {candidates[0][0]} ({candidates[0][1]})", flush=True) - return candidates[0] - - @staticmethod - async def fuzzy_match_supplier( - cui: Optional[str], - vendor_name: Optional[str], - db_session - ) -> Optional[tuple[str, str]]: - """Combined fuzzy matching: try CUI first, then fallback to NAME+CUI. - - Strategy: - 1. Try fuzzy CUI matching (1-digit corrections with checksum validation) - 2. If no CUI match, try fuzzy NAME matching, narrowed by CUI similarity - - Args: - cui: Extracted CUI from OCR (may be invalid/incomplete) - vendor_name: Extracted vendor name from OCR - db_session: SQLAlchemy async session - - Returns: - Tuple of (matched_cui, supplier_name) if found, else None - """ - # Step 1: Try fuzzy CUI matching - cui_match = await OCRValidationEngine.fuzzy_match_cui_from_db(cui, db_session) - if cui_match: - return cui_match - - # Step 2: Fallback to fuzzy NAME + CUI matching - name_match = await OCRValidationEngine.fuzzy_match_by_name_and_cui( - vendor_name, cui, db_session - ) - if name_match: - return name_match - - return None diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr_engine.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr_engine.py deleted file mode 100644 index 07af2b4..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr_engine.py +++ /dev/null @@ -1,476 +0,0 @@ -"""OCR engine wrapper for PaddleOCR, docTR, and Tesseract.""" - -import os -import logging -import threading -import time -from dataclasses import dataclass -from typing import List, Optional, Tuple - -import numpy as np - -# Setup logging (respects LOG_LEVEL env var set in main.py) -logger = logging.getLogger(__name__) - -# Disable PaddleOCR model source check for faster startup (PaddleX 3.x) -os.environ['PADDLE_PDX_DISABLE_MODEL_SOURCE_CHECK'] = 'True' - -# Lazy imports - these will be imported on first use -PaddleOCR = None # Will be imported lazily -pytesseract = None # Will be imported lazily -doctr_ocr_predictor = None # Will be imported lazily - -# Check availability without importing heavy libraries -def _check_paddle_available() -> bool: - """Check if paddleocr is installed without importing it.""" - try: - import importlib.util - return importlib.util.find_spec("paddleocr") is not None - except Exception: - return False - -def _check_tesseract_available() -> bool: - """Check if pytesseract is installed without importing it.""" - try: - import importlib.util - return importlib.util.find_spec("pytesseract") is not None - except Exception: - return False - -def _check_doctr_available() -> bool: - """Check if doctr is installed without importing it.""" - try: - import importlib.util - return importlib.util.find_spec("doctr") is not None - except Exception: - return False - -PADDLE_AVAILABLE = _check_paddle_available() -TESSERACT_AVAILABLE = _check_tesseract_available() -DOCTR_AVAILABLE = _check_doctr_available() - - -@dataclass -class OCRResult: - """Raw OCR result.""" - text: str - confidence: float - boxes: List[dict] - engine: str = "" # OCR engine used: paddleocr or tesseract - - -class OCREngine: - """Unified OCR engine with fallback support.""" - - def __init__(self): - self._paddle = None - self._paddle_init_started = False - self._paddle_ready = threading.Event() # Signals when PaddleOCR is FULLY ready - self._paddle_init_lock = threading.Lock() - - self._doctr = None - self._doctr_init_started = False - self._doctr_ready = threading.Event() # Signals when docTR is FULLY ready - self._doctr_init_lock = threading.Lock() - - def _init_paddle_lazy(self): - """Lazy initialize PaddleOCR on first use (avoids slow startup).""" - global PaddleOCR - - with self._paddle_init_lock: - if self._paddle_init_started: - return # Already initializing or done - self._paddle_init_started = True - - if PADDLE_AVAILABLE: - try: - print("Importing PaddleOCR (first use, may take ~15-20 seconds)...", flush=True) - from paddleocr import PaddleOCR as _PaddleOCR - PaddleOCR = _PaddleOCR - - print("Initializing PaddleOCR engine...", flush=True) - # PaddleOCR 3.x API - optimized for Romanian receipts - # Note: 'latin' not available in PaddleOCR 3.x, 'en' works well for receipts - self._paddle = PaddleOCR( - lang='en', # 'en' handles Latin alphabet well for receipts - # High quality settings for better accuracy - det_db_thresh=0.3, # Lower threshold = detect more text (default 0.3) - det_db_box_thresh=0.5, # Box confidence threshold (default 0.5) - det_db_unclip_ratio=1.8, # Expand detected boxes slightly (default 1.5) - rec_batch_num=6, # Batch size for recognition - use_angle_cls=True, # Enable text angle classification - ) - print("PaddleOCR initialized successfully with high-quality settings", flush=True) - except Exception as e: - print(f"Warning: Failed to initialize PaddleOCR: {e}", flush=True) - self._paddle = None - - # Signal that initialization is complete (success or failure) - self._paddle_ready.set() - - def _init_doctr_lazy(self): - """Lazy initialize docTR on first use (avoids slow startup).""" - global doctr_ocr_predictor - - with self._doctr_init_lock: - if self._doctr_init_started: - return # Already initializing or done - self._doctr_init_started = True - - if DOCTR_AVAILABLE: - try: - print("Importing docTR (first use, may take ~10-15 seconds)...", flush=True) - from doctr.io import DocumentFile - from doctr.models import ocr_predictor - - print("Initializing docTR engine (PyTorch backend)...", flush=True) - # Initialize docTR predictor with pretrained models - # Uses db_resnet50 for detection and crnn_vgg16_bn for recognition - self._doctr = ocr_predictor( - det_arch='db_resnet50', - reco_arch='crnn_vgg16_bn', - pretrained=True, - assume_straight_pages=True, - straighten_pages=False, - preserve_aspect_ratio=True, - ) - doctr_ocr_predictor = self._doctr - print("docTR initialized successfully with PyTorch backend", flush=True) - except Exception as e: - print(f"Warning: Failed to initialize docTR: {e}", flush=True) - self._doctr = None - - # Signal that initialization is complete (success or failure) - self._doctr_ready.set() - - def wait_for_doctr(self, timeout: float = 30.0) -> bool: - """ - Wait for docTR to be fully initialized. - - Args: - timeout: Max seconds to wait (default 30s) - - Returns: - True if docTR is ready, False if timeout or unavailable - """ - if not DOCTR_AVAILABLE: - return False - - if self._doctr is not None: - return True # Already ready - - if not self._doctr_init_started: - # Start initialization if not already started - self._init_doctr_lazy() - - # Wait for initialization to complete - print(f"[OCR] Waiting for docTR to be ready (max {timeout}s)...", flush=True) - start = time.time() - ready = self._doctr_ready.wait(timeout=timeout) - elapsed = time.time() - start - - if ready and self._doctr is not None: - print(f"[OCR] docTR ready after {elapsed:.1f}s", flush=True) - return True - else: - print(f"[OCR] docTR not ready after {elapsed:.1f}s (timeout or failed)", flush=True) - return False - - def is_doctr_ready(self) -> bool: - """Check if docTR is ready without waiting.""" - return self._doctr is not None - - def wait_for_paddle(self, timeout: float = 30.0) -> bool: - """ - Wait for PaddleOCR to be fully initialized. - - Args: - timeout: Max seconds to wait (default 30s) - - Returns: - True if PaddleOCR is ready, False if timeout or unavailable - """ - if not PADDLE_AVAILABLE: - return False - - if self._paddle is not None: - return True # Already ready - - if not self._paddle_init_started: - # Start initialization if not already started - self._init_paddle_lazy() - - # Wait for initialization to complete - print(f"[OCR] Waiting for PaddleOCR to be ready (max {timeout}s)...", flush=True) - start = time.time() - ready = self._paddle_ready.wait(timeout=timeout) - elapsed = time.time() - start - - if ready and self._paddle is not None: - print(f"[OCR] PaddleOCR ready after {elapsed:.1f}s", flush=True) - return True - else: - print(f"[OCR] PaddleOCR not ready after {elapsed:.1f}s (timeout or failed)", flush=True) - return False - - def is_paddle_ready(self) -> bool: - """Check if PaddleOCR is ready without waiting.""" - return self._paddle is not None - - def recognize(self, image: np.ndarray) -> OCRResult: - """Perform OCR on preprocessed image.""" - logger.info(f"[OCR] Starting recognition, image shape: {image.shape}, dtype: {image.dtype}") - - # Lazy init PaddleOCR on first call - self._init_paddle_lazy() - - if PADDLE_AVAILABLE and self._paddle: - logger.info("[OCR] Using PaddleOCR engine") - return self._paddle_recognize(image) - elif TESSERACT_AVAILABLE: - logger.info("[OCR] Using Tesseract engine (PaddleOCR not available)") - return self._tesseract_recognize(image) - else: - logger.error("[OCR] No OCR engine available!") - raise RuntimeError( - "No OCR engine available. Install PaddleOCR or Tesseract." - ) - - def _paddle_recognize(self, image: np.ndarray) -> OCRResult: - """Recognize text using PaddleOCR 3.x API.""" - # Wait for PaddleOCR to be fully ready (handles background init) - if not self.wait_for_paddle(timeout=30.0): - logger.warning("[PaddleOCR] Not ready, falling back to Tesseract") - if TESSERACT_AVAILABLE: - return self._tesseract_recognize(image) - raise RuntimeError("PaddleOCR not ready and Tesseract not available") - - try: - logger.info(f"[PaddleOCR] Processing image, shape: {image.shape}") - - # PaddleOCR 3.x requires 3-channel images - if len(image.shape) == 2: - # Convert grayscale to 3-channel BGR - import cv2 - image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) - logger.info(f"[PaddleOCR] Converted to BGR, new shape: {image.shape}") - - # PaddleOCR 3.x uses predict() with new parameter names - logger.info("[PaddleOCR] Calling predict()...") - result = self._paddle.predict(image, use_textline_orientation=True) - logger.info(f"[PaddleOCR] predict() returned, result type: {type(result)}") - - if not result or len(result) == 0: - logger.warning("[PaddleOCR] No results returned") - return OCRResult(text="", confidence=0.0, boxes=[], engine="paddleocr") - - # PaddleOCR 3.x returns OCRResult objects with different structure - ocr_result = result[0] - - # Extract texts and scores from the new format - rec_texts = ocr_result.get('rec_texts', []) - rec_scores = ocr_result.get('rec_scores', []) - dt_polys = ocr_result.get('dt_polys', []) - - if not rec_texts: - return OCRResult(text="", confidence=0.0, boxes=[], engine="paddleocr") - - boxes = [] - for i, text in enumerate(rec_texts): - conf = rec_scores[i] if i < len(rec_scores) else 0.0 - box = dt_polys[i].tolist() if i < len(dt_polys) else [] - boxes.append({ - 'text': text, - 'confidence': float(conf), - 'box': box - }) - - avg_conf = sum(rec_scores) / len(rec_scores) if rec_scores else 0.0 - text_result = '\n'.join(rec_texts) - logger.info(f"[PaddleOCR] SUCCESS - Found {len(rec_texts)} text lines, avg confidence: {avg_conf:.2%}") - logger.debug(f"[PaddleOCR] Raw text preview: {text_result[:200]}...") - return OCRResult( - text=text_result, - confidence=float(avg_conf), - boxes=boxes, - engine="paddleocr" - ) - except Exception as e: - logger.error(f"[PaddleOCR] ERROR: {e}, falling back to Tesseract") - if TESSERACT_AVAILABLE: - return self._tesseract_recognize(image) - raise - - def _tesseract_recognize(self, image: np.ndarray) -> OCRResult: - """Recognize text using Tesseract.""" - global pytesseract - - logger.info(f"[Tesseract] Processing image, shape: {image.shape}") - - # Lazy import pytesseract - if pytesseract is None: - logger.info("[Tesseract] Importing pytesseract...") - import pytesseract as _pytesseract - pytesseract = _pytesseract - - # PSM 4: Single column (best for receipts) - config = '--psm 4 -l ron+eng' - text = pytesseract.image_to_string(image, config=config) - - # Quick confidence estimate - data = pytesseract.image_to_data(image, config=config, output_type=pytesseract.Output.DICT) - confidences = [int(c) for c in data['conf'] if int(c) > 0] - avg_conf = sum(confidences) / len(confidences) / 100 if confidences else 0.0 - - logger.info(f"[Tesseract] Done: {len(text)} chars, conf: {avg_conf:.2%}") - return OCRResult(text=text, confidence=avg_conf, boxes=[], engine="tesseract") - - def _doctr_recognize(self, image: np.ndarray) -> OCRResult: - """Recognize text using docTR.""" - # Wait for docTR to be fully ready - if not self.wait_for_doctr(timeout=30.0): - logger.warning("[docTR] Not ready, falling back to Tesseract") - if TESSERACT_AVAILABLE: - return self._tesseract_recognize(image) - raise RuntimeError("docTR not ready and Tesseract not available") - - try: - logger.info(f"[docTR] Processing image, shape: {image.shape}") - - # docTR requires RGB images - import cv2 - if len(image.shape) == 2: - # Convert grayscale to RGB - image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB) - logger.info(f"[docTR] Converted grayscale to RGB, new shape: {image.shape}") - elif image.shape[2] == 4: - # Convert RGBA to RGB - image = cv2.cvtColor(image, cv2.COLOR_RGBA2RGB) - logger.info(f"[docTR] Converted RGBA to RGB, new shape: {image.shape}") - elif image.shape[2] == 3: - # Check if BGR (from OpenCV) and convert to RGB - image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) - logger.info(f"[docTR] Converted BGR to RGB, shape: {image.shape}") - - # Process image with docTR - logger.info("[docTR] Running prediction...") - from doctr.io import DocumentFile - - # docTR expects a document (list of pages as numpy arrays) - result = self._doctr([image]) - - if not result or not result.pages: - logger.warning("[docTR] No results returned") - return OCRResult(text="", confidence=0.0, boxes=[], engine="doctr") - - # Extract text from all pages - all_texts = [] - all_confidences = [] - boxes = [] - - for page in result.pages: - for block in page.blocks: - for line in block.lines: - line_text = ' '.join(word.value for word in line.words) - line_confidence = sum(w.confidence for w in line.words) / len(line.words) if line.words else 0.0 - all_texts.append(line_text) - all_confidences.append(line_confidence) - - # Store word-level boxes - for word in line.words: - boxes.append({ - 'text': word.value, - 'confidence': float(word.confidence), - 'box': word.geometry # (xmin, ymin), (xmax, ymax) - }) - - text_result = '\n'.join(all_texts) - avg_conf = sum(all_confidences) / len(all_confidences) if all_confidences else 0.0 - - logger.info(f"[docTR] SUCCESS - Found {len(all_texts)} text lines, avg confidence: {avg_conf:.2%}") - logger.debug(f"[docTR] Raw text preview: {text_result[:200]}...") - - return OCRResult( - text=text_result, - confidence=float(avg_conf), - boxes=boxes, - engine="doctr" - ) - - except Exception as e: - logger.error(f"[docTR] ERROR: {e}, falling back to Tesseract") - if TESSERACT_AVAILABLE: - return self._tesseract_recognize(image) - raise - - def recognize_dual(self, image: np.ndarray) -> Tuple[OCRResult, Optional[OCRResult]]: - """ - Run both OCR engines and return both results. - - Returns: - Tuple of (paddle_result, tesseract_result) - tesseract_result may be None if Tesseract is not available - """ - logger.info(f"[OCR Dual] Starting dual recognition, image shape: {image.shape}") - - # Lazy init PaddleOCR - self._init_paddle_lazy() - - paddle_result = None - tesseract_result = None - - # Run PaddleOCR - if PADDLE_AVAILABLE and self._paddle: - try: - logger.info("[OCR Dual] Running PaddleOCR...") - paddle_result = self._paddle_recognize(image) - logger.info(f"[OCR Dual] PaddleOCR: {len(paddle_result.text)} chars, conf: {paddle_result.confidence:.2%}") - except Exception as e: - logger.error(f"[OCR Dual] PaddleOCR failed: {e}") - paddle_result = OCRResult(text="", confidence=0.0, boxes=[], engine="paddleocr") - - # Run Tesseract - if TESSERACT_AVAILABLE: - try: - logger.info("[OCR Dual] Running Tesseract...") - tesseract_result = self._tesseract_recognize(image) - logger.info(f"[OCR Dual] Tesseract: {len(tesseract_result.text)} chars, conf: {tesseract_result.confidence:.2%}") - except Exception as e: - logger.error(f"[OCR Dual] Tesseract failed: {e}") - tesseract_result = OCRResult(text="", confidence=0.0, boxes=[], engine="tesseract") - - # Fallback if PaddleOCR not available - if paddle_result is None: - if tesseract_result: - paddle_result = tesseract_result - else: - raise RuntimeError("No OCR engine available") - - return paddle_result, tesseract_result - - @staticmethod - def get_available_engines() -> List[str]: - """ - Return list of available OCR engines. - - Respects OCR_ENABLE_PADDLEOCR and OCR_ENABLE_TESSERACT from .env. - Engines that are disabled via .env are not returned even if installed. - - Available engines: tesseract, doctr, doctr_plus, paddleocr - """ - # Check .env settings - paddle_enabled = os.getenv("OCR_ENABLE_PADDLEOCR", "true").lower() == "true" - tesseract_enabled = os.getenv("OCR_ENABLE_TESSERACT", "true").lower() == "true" - - engines = [] - - # Base engines (only if installed AND enabled) - if TESSERACT_AVAILABLE and tesseract_enabled: - engines.append('tesseract') - if DOCTR_AVAILABLE: - engines.append('doctr') - engines.append('doctr_plus') # docTR with 2-tier sequential + early exit - if PADDLE_AVAILABLE and paddle_enabled: - engines.append('paddleocr') - - return engines diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr_extractor.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr_extractor.py deleted file mode 100644 index 46bda79..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr_extractor.py +++ /dev/null @@ -1,2233 +0,0 @@ -"""Extract structured fields from OCR text (Romanian receipts).""" - -import re -from datetime import date, datetime -from decimal import Decimal, InvalidOperation -from typing import Optional, Tuple, List -from dataclasses import dataclass, field - -from backend.modules.data_entry.services.ocr.validation import OCRValidationEngine -from backend.modules.data_entry.services.ocr.profiles import ProfileRegistry - - -@dataclass -class ExtractionResult: - """Structured extraction result from receipt.""" - receipt_type: str = 'bon_fiscal' - receipt_number: Optional[str] = None - receipt_series: Optional[str] = None - receipt_date: Optional[date] = None - amount: Optional[Decimal] = None - partner_name: Optional[str] = None - cui: Optional[str] = None - description: Optional[str] = None - # Additional extracted fields - Multiple TVA entries support - tva_entries: List[dict] = field(default_factory=list) # [{code, percent, amount}] - tva_total: Optional[Decimal] = None - address: Optional[str] = None - items_count: Optional[int] = None - payment_methods: List[dict] = field(default_factory=list) # [{"method":"CARD","amount":Decimal}] - suggested_payment_mode: Optional[str] = None # 'banca' if CARD detected, 'numerar' if cash only - - # Client data (for B2B receipts - buyer information) - client_name: Optional[str] = None - client_cui: Optional[str] = None - client_address: Optional[str] = None - - confidence_amount: float = 0.0 - confidence_date: float = 0.0 - confidence_vendor: float = 0.0 - confidence_client: float = 0.0 - confidence_tva: float = 0.0 - confidence_payment: float = 0.0 - raw_text: str = "" - ocr_engine: str = "" # OCR engine used: paddleocr or tesseract - processing_time_ms: int = 0 # Processing time in milliseconds - - # Validation tracking (added by bon-ocr-validation feature) - needs_manual_review: Optional[bool] = None # None=not validated, False=ok, True=needs review - validation_warnings: List[str] = field(default_factory=list) - validation_errors: List[str] = field(default_factory=list) - confidence_adjustments: dict[str, float] = field(default_factory=dict) # Field -> penalty - inter_ocr_ratios: dict[str, float] = field(default_factory=dict) # Field -> ratio - - @property - def overall_confidence(self) -> float: - """Calculate weighted overall confidence score including TVA and payment.""" - weights = { - 'amount': 0.35, # Most important - receipt total - 'date': 0.20, # Receipt date - 'vendor': 0.20, # Vendor identification - 'tva': 0.15, # TVA extraction accuracy - 'payment': 0.10 # Payment method detection - } - return round( - self.confidence_amount * weights['amount'] + - self.confidence_date * weights['date'] + - self.confidence_vendor * weights['vendor'] + - self.confidence_tva * weights['tva'] + - self.confidence_payment * weights['payment'], - 2 - ) - - -class ReceiptExtractor: - """Extract receipt fields using pattern matching for Romanian receipts.""" - - # ========================================================================= - # DEPRECATED: STORE_PROFILES dict - USE ProfileRegistry INSTEAD - # ========================================================================= - # Store profiles are now managed by ProfileRegistry in: - # backend/modules/data_entry/services/ocr/profiles/ - # - # This dict is kept for reference only. All extraction logic now uses: - # ProfileRegistry.get_profile(cui) - # - # See: backend/modules/data_entry/services/ocr/profiles/README.md - # ========================================================================= - STORE_PROFILES = { - # Lidl - multi-rate TVA (A+B), specific format without hyphen/colon - "22891860": { - "name": "LIDL DISCOUNT S.R.L.", - "tva_pattern": "lidl", - "tva_format": "TVA {code} {percent}% {amount}", - "has_multi_rate_tva": True, - "card_equals_total": True, - }, - # OMV Petrom - single TVA rate, client CUI included - "11201891": { - "name": "OMV PETROM MARKETING S.R.L.", - "tva_pattern": "standard", - "has_client_cui": True, - }, - # FIVE-HOLDING (BRICK) - standard format - "10562600": { - "name": "FIVE-HOLDING S.A.", - "tva_pattern": "standard", - }, - # Dedeman - e-factura format - "2816464": { - "name": "DEDEMAN SRL", - "tva_pattern": "standard", - "has_efactura": True, - }, - # SOCAR Petroleum - "12546600": { - "name": "SOCAR PETROLEUM S.A.", - "tva_pattern": "standard", - "has_client_cui": True, - }, - # Kineterra - non-VAT payer - "31180432": { - "name": "KINETERRA CONCEPT SRL", - "tva_pattern": "none", - "is_non_vat_payer": True, - }, - } - - # Total amount patterns (most specific first) - # Romanian receipts use various formats: TOTAL LEI, TOTAL:, TOTAL RON, etc. - # OCR often produces errors, so patterns must be tolerant - TOTAL_PATTERNS = [ - # Most common: TOTAL LEI followed by amount (with OCR-tolerant variations) - # Handles: TOTAL LEI, TOTAL. LE!, T0TAL LEI, TOTAL LE1, etc. - (r'T[O0]TAL[.\s]+L[E3][I1!]\s*:?\s*([\d\s.,]+)', 0.98), # OCR-tolerant: TOTAL. LE!, T0TAL LEI - (r'TOTAL\s+LEI\s*([\d\s.,]+)', 0.98), # Standard clean pattern - (r'[OT]?OTAL\s+LEI\s*([\d\s.,]+)', 0.95), # OCR may miss first letter - # Standard patterns - (r'TOTAL\s*:?\s*([\d\s.,]+)\s*(?:RON|LEI)?', 0.95), - (r'TOTAL\s+(?:RON|LEI)\s*([\d\s.,]+)', 0.95), - # SUBTOTAL when TOTAL not found - (r'SUBTOTAL\s*([\d\s.,]+)', 0.90), - (r'[SB]?UBTOTAL\s*([\d\s.,]+)', 0.88), # OCR variations - # Payment methods - (r'DE\s+PLATA\s*:?\s*([\d\s.,]+)', 0.90), - (r'SUMA\s*:?\s*([\d\s.,]+)', 0.85), - (r'PLATA\s+CARD\s*:?\s*([\d\s.,]+)', 0.85), - (r'NUMERAR\s*:?\s*([\d\s.,]+)', 0.80), - (r'REST\s*:?\s*([\d\s.,]+)', 0.70), # Sometimes total is near REST - ] - - # Fallback: Find the largest repeated amount (likely the total) - # This handles cases where OCR doesn't capture "TOTAL" keyword - - # Date patterns - support dash, dot, and slash separators - # OCR may produce DRTA instead of DATA, DAIA, etc. - # OCR may also add spaces/commas in dates: "27. 10, 2025" instead of "27.10.2025" - DATE_PATTERNS = [ - # DATA/DRTA/DAIA: DD-MM-YYYY (OCR tolerant) - (r'D[AR]TA\s*:?\s*(\d{2}[-./]\d{2}[-./]\d{4})', 0.98), - (r'DATA\s*:?\s*(\d{2}[-./]\d{2}[-./]\d{4})', 0.98), - # Date followed by ORA (time) - OCR may produce 0RA - (r'(\d{2}[-./]\d{2}[-./]\d{4})\s+[O0]RA\s*:?\s*\d{2}:\d{2}', 0.95), - # Date followed by time without ORA keyword - (r'(\d{2}[-./]\d{2}[-./]\d{4})\s+\d{2}:\d{2}', 0.90), - # Standalone date - (r'(\d{2}[-./]\d{2}[-./]\d{4})', 0.80), - # YYYY-MM-DD format (less common) - (r'(\d{4}[-./]\d{2}[-./]\d{2})', 0.75), - ] - - # OCR-corrupted date patterns with spaces/commas - # Handles: "27. 10, 2025", "27, 10. 2025", "2025. 08. 14", etc. - DATE_PATTERNS_OCR_SPACES = [ - # YYYY. MM. DD format with spaces (OMV/Petrom receipts) - with time - (r'(\d{4})[.,]\s*(\d{2})[.,]\s*(\d{2})\s+\d{2}:\d{2}', 0.92, 'ymd'), - # YYYY. MM. DD format with spaces (standalone) - (r'(\d{4})[.,]\s*(\d{2})[.,]\s*(\d{2})', 0.85, 'ymd'), - # DD. MM, YYYY or DD, MM. YYYY (with time following) - (r'(\d{2})[.,]\s*(\d{2})[.,]\s*(\d{4})\s+\d{2}:\d{2}', 0.92, 'dmy'), - # DD. MM, YYYY or DD, MM. YYYY (standalone) - (r'(\d{2})[.,]\s*(\d{2})[.,]\s*(\d{4})', 0.85, 'dmy'), - ] - - # Receipt number patterns - Romanian fiscal receipt formats - # OCR may produce N instead of : or other errors - NUMBER_PATTERNS = [ - # NDS format (common in Romanian POS) - (r'NDS\s*:?\s*(\d+)', 0.98), - # C3POS terminal format - OCR may have N instead of : (C3POS-CT2N1360760) - (r'C3POS[-A-Z0-9]*[N:](\d{6,7})', 0.98), # CT2N1360760 format - (r'C3POS.*?(\d{6,7})\b', 0.95), # Any C3POS followed by 6-7 digit number - (r'CT2[N:]\s*(\d{6,})', 0.95), # CT2N prefix - # BF (Bon Fiscal) number - high priority - # Format: "Z:0864 BF:0018" - extract only the number after BF: - (r'BF\s*:\s*(\d{4,})', 0.96), # BF: with colon (most specific) - (r'BF\s+(\d{4,})', 0.93), # BF followed by space and number - # NIVS format - (r'NIVS\s*:?\s*(\d+)', 0.95), - # Standard NR BON formats - (r'NR\.?\s*BON\s*:?\s*(\d+)', 0.95), - (r'BON\s+(?:FISCAL\s+)?NR\.?\s*:?\s*(\d+)', 0.95), - (r'CHITANTA\s+NR\.?\s*:?\s*(\d+)', 0.95), - # Document number - (r'NR\.?\s+DOCUMENT\s*:?\s*(\d+)', 0.90), - # ID BF format - (r'ID\s*BF\s*:?\s*(\d+)', 0.90), - # TD format (transaction ID) - (r'TD\s*:?\s*(\d+)', 0.85), - # 6-8 digit number (typical receipt number length) - (r'\b(\d{6,8})\b', 0.70), - # Generic long number at end (fallback) - (r'NR\.?\s*:?\s*(\d{4,})', 0.65), - ] - - # CUI (fiscal code) patterns - IMPORTANT: exclude CLIENT CUI - # CIF = Cod de Identificare Fiscală (vendor's tax ID) - # CLIENT C.U.I. = client's tax ID (should be ignored) - # OCR errors: R0 instead of RO, C1F instead of CIF - CUI_PATTERNS = [ - # CIF at start of line (definitely vendor) - tolerant to OCR errors - # NOTE: Capture full CUI including RO prefix: (R[O0]?\d{6,10}) or ((?:R[O0])?\d{6,10}) - (r'^CIF\s*:?\s*(R[O0]?\d{6,10})', 0.98), - (r'^CIF\s*:?\s*(\d{6,10})', 0.97), # Without RO prefix - (r'^C[I1]F\s*:?\s*(R[O0]?\d{6,10})', 0.95), # C1F OCR error - (r'^C[I1]F\s*:?\s*(\d{6,10})', 0.94), # C1F without RO - # CIF not preceded by CLIENT (negative lookbehind) - (r'(? ExtractionResult: - """Extract all fields from OCR text.""" - result = ExtractionResult() - result.raw_text = text - text_upper = text.upper() - - # ========================================================================= - # STEP 1: Extract vendor info FIRST to find store profile - # ========================================================================= - result.partner_name, result.confidence_vendor = self._extract_vendor(text) - result.cui, _ = self._extract_cui(text_upper, text) - result.cui = OCRValidationEngine.normalize_cui(result.cui) - - # Lookup store-specific profile for enhanced extraction accuracy - store_profile = ProfileRegistry.get_profile(result.cui) if result.cui else None - if store_profile: - print(f"[Profile] ✅ Using {store_profile.STORE_NAME} ({store_profile.__class__.__name__}) for CUI {result.cui}", flush=True) - else: - print(f"[Profile] ⚠️ No profile found for CUI '{result.cui}' - using GENERIC extraction", flush=True) - - # ========================================================================= - # STEP 2: Extract ALL fields using profile (if available) or generic - # ========================================================================= - if store_profile: - # Profile-specific extraction (higher accuracy for known stores) - result.amount, result.confidence_amount = store_profile.extract_total(text_upper) - result.receipt_date, result.confidence_date = store_profile.extract_date(text_upper) - result.receipt_number, _ = store_profile.extract_receipt_number(text_upper) - result.tva_entries, result.confidence_tva = store_profile.extract_tva_entries(text_upper) - result.tva_total = sum((e['amount'] for e in result.tva_entries), Decimal(0)) if result.tva_entries else None - result.payment_methods = store_profile.extract_payment_methods(text_upper) - # Calculate payment confidence from individual payment method confidences - if result.payment_methods: - payment_confidences = [pm.get('confidence', 0.0) for pm in result.payment_methods] - result.confidence_payment = max(payment_confidences) if payment_confidences else 0.0 - else: - result.confidence_payment = 0.0 - - # Client data extraction via profile (CUI + name) - profile_client_cui, cui_confidence = store_profile.extract_client_cui(text_upper) - profile_client_name, name_confidence = store_profile.extract_client_name(text) - - if profile_client_cui or profile_client_name: - # Use profile extraction results - result.client_cui = OCRValidationEngine.normalize_cui(profile_client_cui) if profile_client_cui else None - result.client_name = profile_client_name - result.confidence_client = max(cui_confidence, name_confidence) - # Address still via generic (no profile method) - _, _, client_address, _ = self._extract_client_data(text_upper, text) - result.client_address = client_address - else: - # Fallback to generic client extraction - client_name, client_cui, client_address, confidence = self._extract_client_data(text_upper, text) - result.client_name = client_name - result.client_cui = OCRValidationEngine.normalize_cui(client_cui) - result.client_address = client_address - result.confidence_client = confidence - - # Log extraction results for debugging - tva_summary = ", ".join([f"{e.get('percent', '?')}%={e.get('amount', '?')}" for e in result.tva_entries]) if result.tva_entries else "none" - payment_summary = ", ".join([f"{p.get('method', '?')}={p.get('amount', '?')}" for p in result.payment_methods]) if result.payment_methods else "none" - print(f"[Profile] Extracted: total={result.amount}, date={result.receipt_date}, " - f"TVA=[{tva_summary}], payments=[{payment_summary}], client_cui={result.client_cui}", flush=True) - else: - # Generic extraction for unknown stores - result.amount, result.confidence_amount = self._extract_amount(text_upper) - result.receipt_date, result.confidence_date = self._extract_date(text_upper) - result.receipt_number, _ = self._extract_number(text_upper) - result.tva_entries, result.tva_total, result.confidence_tva = self._extract_tva_entries(text_upper) - result.payment_methods, result.confidence_payment = self._extract_payment_methods(text_upper) - - # Generic client extraction - client_name, client_cui, client_address, confidence = self._extract_client_data(text_upper, text) - result.client_name = client_name - result.client_cui = OCRValidationEngine.normalize_cui(client_cui) - result.client_address = client_address - result.confidence_client = confidence - - # Log generic extraction results for debugging - tva_summary = ", ".join([f"{e.get('percent', '?')}%={e.get('amount', '?')}" for e in result.tva_entries]) if result.tva_entries else "none" - payment_summary = ", ".join([f"{p.get('method', '?')}={p.get('amount', '?')}" for p in result.payment_methods]) if result.payment_methods else "none" - print(f"[Generic] Extracted: total={result.amount}, date={result.receipt_date}, " - f"TVA=[{tva_summary}], payments=[{payment_summary}], client_cui={result.client_cui}", flush=True) - - # Series extraction (no profile method, always generic) - result.receipt_series, _ = self._extract_series(text_upper) - - # ========================================================================= - # STEP 3: Debug logging and validation - # ========================================================================= - if not result.tva_entries: - print(f"[TVA Debug] No TVA found. Checking patterns...", flush=True) - normalized = re.sub(r'(\d+)[.,]\s+(\d{2})', r'\1.\2', text_upper) - taxe_match = re.search(r'T?OTAL\s+TAXE', normalized, re.IGNORECASE) - rev_match = re.search(r'([\d.,]+)\s*T?OTAL\s+TAXE', normalized, re.IGNORECASE) - print(f"[TVA Debug] 'OTAL TAXE' found: {bool(taxe_match)}, reversed: {rev_match.group(1) if rev_match else None}", flush=True) - - # Log TVA vs TOTAL for debugging - if result.tva_total and result.amount: - if result.tva_total > result.amount: - print(f"[TVA Extraction] TVA ({result.tva_total}) > TOTAL ({result.amount}) - will be corrected in final validation", flush=True) - elif result.tva_total > result.amount * Decimal('0.5'): - print(f"[TVA Extraction] Warning: TVA ({result.tva_total}) is > 50% of TOTAL ({result.amount}) - suspicious", flush=True) - - # Additional generic extractions - result.items_count = self._extract_items_count(text_upper) - result.address = self._extract_address(text_upper) - - # ========================================================================= - # STEP 4: Validate and post-process - # ========================================================================= - # Save original payment methods before validation (for payment mode detection) - original_payment_methods = result.payment_methods.copy() if result.payment_methods else [] - - # Validate payment methods against extracted amount - result.payment_methods = self._validate_payment_methods(result.payment_methods, result.amount) - - # Auto-suggest payment_mode based on detected payment methods - payment_methods_for_mode = result.payment_methods if result.payment_methods else original_payment_methods - if payment_methods_for_mode: - card_amount = sum( - pm.get('amount', Decimal('0')) - for pm in payment_methods_for_mode - if pm.get('method') == 'CARD' - ) - if card_amount > 0: - result.suggested_payment_mode = 'banca' - print(f"[Payment Mode] CARD detected ({card_amount}), suggesting 'banca'", flush=True) - else: - result.suggested_payment_mode = 'numerar' - print(f"[Payment Mode] Cash only detected, suggesting 'numerar'", flush=True) - - # Detect receipt type - result.receipt_type = self._detect_receipt_type(text_upper) - - # Reverse TVA validation - if result.tva_entries and result.amount: - is_valid, expected_total, msg = self._validate_tva_reverse(result.tva_entries, result.amount) - if not is_valid: - print(f"[TVA Reverse Validation] {msg}", flush=True) - - # Cross-validate amount using payment methods and TVA - original_amount = result.amount - validated_amount, validated_confidence, source = self._cross_validate_and_calculate_amount( - result.amount, - result.confidence_amount, - result.payment_methods, - result.tva_entries, - result.tva_total - ) - - # Add validation warnings when TOTAL is calculated (not directly extracted) - if 'calculated from TVA' in source: - warning_msg = f"TOTAL ({validated_amount}) calculat din TVA (nu a fost extras direct din bon)" - result.validation_warnings.append(warning_msg) - print(f"[Cross-Validation] ⚠️ {warning_msg}", flush=True) - - # Add comparison if original was different - if original_amount and original_amount != validated_amount: - diff = abs(float(validated_amount) - float(original_amount)) - result.validation_warnings.append( - f"TOTAL extras ({original_amount}) diferă de cel calculat ({validated_amount}) cu {diff:.2f} RON" - ) - - elif 'calculated from payment methods' in source: - warning_msg = f"TOTAL ({validated_amount}) calculat din suma metodelor de plată (nu a fost extras direct)" - result.validation_warnings.append(warning_msg) - print(f"[Cross-Validation] ⚠️ {warning_msg}", flush=True) - - if original_amount and original_amount != validated_amount: - diff = abs(float(validated_amount) - float(original_amount)) - result.validation_warnings.append( - f"TOTAL extras ({original_amount}) diferă de suma plăților ({validated_amount}) cu {diff:.2f} RON" - ) - - elif source == 'not found': - result.validation_warnings.append("TOTAL nu a fost detectat și nu a putut fi calculat") - print("[Cross-Validation] ⚠️ TOTAL nu a fost detectat", flush=True) - - elif validated_amount != original_amount: - print(f"[Cross-Validation] Amount updated: {original_amount} -> {validated_amount} (source: {source})", flush=True) - - result.amount = validated_amount - result.confidence_amount = validated_confidence - - return result - - def _extract_amount(self, text: str) -> Tuple[Optional[Decimal], float]: - """Extract total amount from text.""" - # PRE-FILTER: Remove lines containing REST (rest = change, not total) - # When paid by card, there's no change - exact amount is paid - lines = text.split('\n') - filtered_lines = [] - for line in lines: - # Skip lines with REST pattern (change amount, not total) - if re.search(r'\bREST\b', line, re.IGNORECASE): - continue - filtered_lines.append(line) - text = '\n'.join(filtered_lines) - - # First try standard patterns (TOTAL, SUBTOTAL, etc.) - for pattern, confidence in self.TOTAL_PATTERNS: - match = re.search(pattern, text, re.IGNORECASE | re.MULTILINE) - if match: - try: - # IMPORTANT: Call _normalize_number FIRST to handle "190 60" → "190.60" - # before stripping other characters - amount_str = match.group(1).strip() - amount_str = self._normalize_number(amount_str) - # Now remove any remaining non-numeric chars (except decimal point) - amount_str = re.sub(r'[^\d.]', '', amount_str) - amount = Decimal(amount_str) - if amount > 0: - return amount, confidence - except (InvalidOperation, ValueError): - continue - - # Strategy 2: Find amounts AFTER product lines end - # Products have pattern: "X BUC/ROLA X price = price" - # Total appears after all products - product_pattern = r'\d\s+(?:BUC|ROLA|ROLN|ROL)\s+X' - product_matches = list(re.finditer(product_pattern, text, re.IGNORECASE)) - if product_matches: - # Get text after the last product line - last_product_pos = product_matches[-1].end() - after_products = text[last_product_pos:] - - # Find standalone amounts on their own line after products - line_amount_pattern = r'^[\s]*(\d{2,4}[.,]\s*\d{2})[\s]*$' - standalone_amounts = [] - for match in re.finditer(line_amount_pattern, after_products, re.MULTILINE): - try: - amount_str = match.group(1).replace(' ', '') - amount_str = self._normalize_number(amount_str) - amount = Decimal(amount_str) - if amount > 10: # Filter out small values - standalone_amounts.append(amount) - except (InvalidOperation, ValueError): - continue - - if standalone_amounts: - # The largest standalone amount after products is likely the total - max_amount = max(standalone_amounts) - # Higher confidence if it appears multiple times - count = standalone_amounts.count(max_amount) - confidence = 0.85 if count >= 2 else 0.75 - return max_amount, confidence - - # Strategy 3: Find the most repeated large amount - # Normalize spaces in numbers (OCR may produce "186. 16") - normalized_text = re.sub(r'(\d+)[.,]\s+(\d{2})', r'\1.\2', text) - amount_pattern = r'(\d{2,4}[.,]\d{2})\b' - amounts = re.findall(amount_pattern, normalized_text) - if amounts: - from collections import Counter - amount_counts = Counter(amounts) - # Filter amounts that appear 2+ times and are > 20 - candidates = [] - for amt_str, count in amount_counts.items(): - try: - amt = Decimal(self._normalize_number(amt_str)) - if count >= 2 and amt > 20: - candidates.append((amt, count)) - except (InvalidOperation, ValueError): - continue - - if candidates: - # Return the LARGEST amount that appears multiple times - candidates.sort(key=lambda x: x[0], reverse=True) - return candidates[0][0], 0.65 - - # Last resort: Find any standalone large amount - line_amount_pattern = r'^[\s]*(\d{2,4}[.,]\s*\d{2})[\s]*$' - for match in re.finditer(line_amount_pattern, text, re.MULTILINE): - try: - amount_str = match.group(1).replace(' ', '') - amount_str = self._normalize_number(amount_str) - amount = Decimal(amount_str) - if amount > 50: # Higher threshold for fallback - return amount, 0.50 - except (InvalidOperation, ValueError): - continue - - return None, 0.0 - - def _normalize_number(self, num_str: str) -> str: - """Normalize Romanian number format to standard decimal.""" - # OCR often reads "." as " " (space) - handle "190 60" as "190.60" - # Pattern: digits + space + exactly 2 digits at end - space_decimal_match = re.match(r'^(\d+)\s+(\d{2})$', num_str.strip()) - if space_decimal_match: - num_str = f"{space_decimal_match.group(1)}.{space_decimal_match.group(2)}" - else: - # Handle "1 234 56" pattern (thousands + decimal with spaces) - # Match: digits + space(s) + digits + space + 2 digits - multi_space_match = re.match(r'^([\d\s]+?)\s+(\d{2})$', num_str.strip()) - if multi_space_match: - integer_part = multi_space_match.group(1).replace(' ', '') - decimal_part = multi_space_match.group(2) - num_str = f"{integer_part}.{decimal_part}" - else: - # Remove remaining spaces (thousands separators) - num_str = num_str.replace(' ', '') - - # Handle comma as decimal separator - if ',' in num_str and '.' in num_str: - # Romanian format: 1.234,56 - num_str = num_str.replace('.', '').replace(',', '.') - elif ',' in num_str: - # Could be 1,50 or 1,234 - parts = num_str.split(',') - if len(parts) == 2 and len(parts[1]) <= 2: - # Decimal comma: 1,50 - num_str = num_str.replace(',', '.') - else: - # Thousands comma: 1,234 - num_str = num_str.replace(',', '') - elif '.' in num_str: - parts = num_str.split('.') - if len(parts) > 2: - # Multiple dots: 1.234.567 -> 1234567 - num_str = ''.join(parts[:-1]) + '.' + parts[-1] - - return num_str - - def _calculate_multi_rate_tva_total(self, tva_entries: List[dict]) -> Optional[Decimal]: - """ - Calculate implied total from ALL TVA entries (multi-rate support). - - Formula for each entry: total_for_entry = tva * (100 + rate) / rate - Final total = sum of all entry totals - - Example for Lidl (TVA A 21% = 7.71, TVA B 11% = 2.13): - Entry A: 7.71 * 121 / 21 = 44.45 - Entry B: 2.13 * 111 / 11 = 21.49 - Total: 44.45 + 21.49 = 65.94 ≈ 65.86 (within tolerance) - - Returns: - Implied total Decimal, or None if calculation not possible - """ - if not tva_entries: - return None - - total = Decimal('0') - for entry in tva_entries: - rate = entry.get('percent', 0) - tva_amount = entry.get('amount') - if tva_amount and rate > 0: - try: - tva_dec = Decimal(str(tva_amount)) - # Formula: total_for_entry = tva * (100 + rate) / rate - entry_total = tva_dec * Decimal(100 + rate) / Decimal(rate) - total += entry_total - print(f"[Multi-rate TVA] Entry {entry.get('code', '?')}: tva={tva_amount}, rate={rate}% -> implied={entry_total:.2f}", flush=True) - except (InvalidOperation, ValueError, TypeError): - continue - - return total.quantize(Decimal('0.01')) if total > 0 else None - - def _cross_validate_and_calculate_amount( - self, - amount: Optional[Decimal], - confidence_amount: float, - payment_methods: List[dict], - tva_entries: List[dict], - tva_total: Optional[Decimal] - ) -> Tuple[Optional[Decimal], float, str]: - """ - Cross-validate and potentially calculate total from payment methods and TVA. - - Returns: (amount, confidence, source_description) - - Logic: - 1. Collect all available sources: extracted amount, payment sum, TVA-implied total - 2. Find consensus: 2+ sources within 3% tolerance - 3. If consensus found, use the higher-confidence source value - 4. If extracted differs >10% from all others, it's an outlier - correct it - 5. If no consensus possible, fallback to individual validations - """ - # Calculate payment methods sum - payment_sum = Decimal('0') - if payment_methods: - for pm in payment_methods: - try: - pm_amount = pm.get('amount') - if pm_amount: - payment_sum += Decimal(str(pm_amount)) - except (InvalidOperation, ValueError, TypeError): - continue - - # Calculate TVA-implied total using ALL entries (multi-rate fix) - tva_implied_total = self._calculate_multi_rate_tva_total(tva_entries) - - # Multi-source consensus approach (3% tolerance for multi-rate TVA rounding) - CONSENSUS_TOLERANCE = 3.0 # 3% tolerance - - # Collect all available sources with their confidences - sources = [] - if amount and amount > 0: - sources.append(('extracted', float(amount), confidence_amount)) - if payment_sum > 0: - sources.append(('payment', float(payment_sum), 0.92)) # Payment is very reliable - if tva_implied_total and tva_implied_total > 0: - sources.append(('tva_calc', float(tva_implied_total), 0.88)) # TVA calc is reliable - - print(f"[Cross-Validation] Sources: {[(s[0], f'{s[1]:.2f}', f'{s[2]:.2f}') for s in sources]}", flush=True) - - # Find consensus: 2+ sources within tolerance - if len(sources) >= 2: - for i, (name1, val1, conf1) in enumerate(sources): - for name2, val2, conf2 in sources[i+1:]: - if val1 <= 0 or val2 <= 0: - continue - diff_pct = abs(val1 - val2) / max(val1, val2) * 100 - if diff_pct <= CONSENSUS_TOLERANCE: - # Consensus found! Use value from higher-confidence source - if conf1 >= conf2: - consensus_val, consensus_conf = val1, conf1 - else: - consensus_val, consensus_conf = val2, conf2 - # Boost confidence for consensus - consensus_conf = min(0.98, consensus_conf + 0.05) - print(f"[Cross-Validation] Consensus: {name1}={val1:.2f} ≈ {name2}={val2:.2f} (diff={diff_pct:.1f}%)", flush=True) - return Decimal(str(round(consensus_val, 2))), consensus_conf, f"consensus ({name1}+{name2})" - - # No consensus - check if extracted is an outlier (differs >10% from all others) - if amount and amount > 0 and len(sources) >= 2: - other_sources = [s for s in sources if s[0] != 'extracted'] - if other_sources: - extracted_val = float(amount) - all_differ = all( - abs(extracted_val - s[1]) / max(extracted_val, s[1]) * 100 > 10 - for s in other_sources if s[1] > 0 - ) - if all_differ: - # Extracted differs significantly from all others - use the best other source - best_other = max(other_sources, key=lambda s: s[2]) - print(f"[Cross-Validation] Extracted outlier: {extracted_val:.2f} differs >10% from all others, using {best_other[0]}={best_other[1]:.2f}", flush=True) - return Decimal(str(round(best_other[1], 2))), best_other[2], f"corrected (extracted outlier, using {best_other[0]})" - - # Fallback: Case 1 - Amount valid with high confidence - if amount and amount > 0 and confidence_amount >= 0.8: - # Check TVA-implied total - if tva_implied_total and tva_implied_total > 0: - tva_diff_percent = abs(float(amount) - float(tva_implied_total)) / float(tva_implied_total) * 100 - if tva_diff_percent <= 3: - return amount, min(0.98, confidence_amount + 0.05), "extracted (validated by TVA)" - elif tva_diff_percent > 10: - print(f"[Cross-Validation] Amount mismatch with TVA: extracted={amount}, tva_implied={tva_implied_total} (diff={tva_diff_percent:.1f}%)", flush=True) - return tva_implied_total, 0.90, "calculated from TVA (extracted amount mismatch)" - - # Cross-validate with payment methods - if payment_sum > 0 and abs(amount - payment_sum) <= Decimal('0.02'): - return amount, min(0.98, confidence_amount + 0.05), "extracted (validated by payment methods)" - elif payment_sum > 0: - payment_diff_percent = abs(float(amount) - float(payment_sum)) / float(payment_sum) * 100 - if payment_diff_percent > 10: - print(f"[Cross-Validation] Amount mismatch with payments: extracted={amount}, payments={payment_sum} (diff={payment_diff_percent:.1f}%)", flush=True) - return payment_sum, 0.88, "calculated from payment methods (extracted amount mismatch)" - - return amount, confidence_amount, "extracted" - - # Case 2: Amount exists but low confidence - try to validate/correct - if amount and amount > 0: - if tva_implied_total and tva_implied_total > 0: - tva_diff_percent = abs(float(amount) - float(tva_implied_total)) / float(tva_implied_total) * 100 - if tva_diff_percent <= 3: - return amount, 0.88, "extracted (validated by TVA)" - elif tva_diff_percent > 10: - print(f"[Cross-Validation] Amount mismatch with TVA: extracted={amount}, tva_implied={tva_implied_total} (diff={tva_diff_percent:.1f}%)", flush=True) - return tva_implied_total, 0.85, "calculated from TVA" - - if payment_sum > 0: - payment_diff_percent = abs(float(amount) - float(payment_sum)) / float(payment_sum) * 100 - if payment_diff_percent <= 1: - return amount, 0.90, "extracted (validated by payment methods)" - elif payment_diff_percent > 10: - print(f"[Cross-Validation] Amount mismatch: extracted={amount}, payments={payment_sum}", flush=True) - return payment_sum, 0.85, "calculated from payment methods" - - return amount, confidence_amount, "extracted (unvalidated)" - - # Case 3: Amount is 0 or None - calculate from payment methods - if payment_sum > 0: - print(f"[Cross-Validation] Amount not found, using payment sum: {payment_sum}", flush=True) - return payment_sum, 0.85, "calculated from payment methods" - - # Case 4: Try TVA-implied total as last resort - if tva_implied_total and tva_implied_total > 0: - print(f"[Cross-Validation] Amount not found, using TVA-implied total: {tva_implied_total}", flush=True) - return tva_implied_total, 0.70, "calculated from TVA" - - # Nothing worked - return original - return amount, confidence_amount, "not found" - - def _extract_date(self, text: str) -> Tuple[Optional[date], float]: - """Extract receipt date from text.""" - # First try standard patterns (clean dates) - for pattern, confidence in self.DATE_PATTERNS: - match = re.search(pattern, text) - if match: - try: - # Normalize separators to dots - date_str = match.group(1).replace('/', '.').replace('-', '.') - - # Try DD.MM.YYYY format first - try: - parsed = datetime.strptime(date_str, '%d.%m.%Y').date() - except ValueError: - # Try YYYY.MM.DD format - parsed = datetime.strptime(date_str, '%Y.%m.%d').date() - - # Validate date range - today = date.today() - if parsed <= today and parsed.year >= 2020: - return parsed, confidence - except ValueError: - continue - - # Then try OCR-corrupted patterns (dates with spaces/commas) - # Handles: "27. 10, 2025", "27, 10. 2025", "2025. 08. 14", etc. - for pattern, confidence, fmt in self.DATE_PATTERNS_OCR_SPACES: - match = re.search(pattern, text) - if match: - try: - if fmt == 'ymd': - # YYYY. MM. DD format (OMV/Petrom) - year = match.group(1) - month = match.group(2) - day = match.group(3) - else: - # DD. MM. YYYY format (default) - day = match.group(1) - month = match.group(2) - year = match.group(3) - - date_str = f"{day}.{month}.{year}" - parsed = datetime.strptime(date_str, '%d.%m.%Y').date() - - # Validate date range - today = date.today() - if parsed <= today and parsed.year >= 2020: - return parsed, confidence - except ValueError: - continue - - return None, 0.0 - - def _extract_number(self, text: str) -> Tuple[Optional[str], float]: - """Extract receipt number from text.""" - for pattern, confidence in self.NUMBER_PATTERNS: - match = re.search(pattern, text, re.IGNORECASE) - if match: - return match.group(1), confidence - return None, 0.0 - - def _extract_series(self, text: str) -> Tuple[Optional[str], float]: - """Extract receipt series from text.""" - for pattern, confidence in self.SERIES_PATTERNS: - match = re.search(pattern, text, re.IGNORECASE) - if match: - return match.group(1).upper(), confidence - return None, 0.0 - - def _extract_vendor(self, text: str) -> Tuple[Optional[str], float]: - """ - Extract vendor/partner name from text. - Uses multiple strategies: - 1. Look for lines with company type indicators (S.R.L., S.A., etc.) - 2. Look for company name + SRL on separate lines - 3. Look for lines near CIF - 4. Use first valid line as fallback - """ - lines = text.split('\n') - skip_keywords = [ - 'BON', 'FISCAL', 'TOTAL', 'DATA', 'NR', 'ORA', - 'SUBTOTAL', 'TVA', 'PLATA', 'CARD', 'NUMERAR', - 'RON', 'LEI', 'CHITANTA', 'REST', 'CLIENT', - 'OPERATOR', 'CASIER', 'POS', 'AMEF', 'BINE ATI VENIT', - 'VA RUGAM', 'PASTRATI', 'VOCEA', 'TIPARIT', - 'DETERGENT', 'PROSOP', 'HARTIE', 'SACI', 'SPRAY', - 'BUC', 'ROLA', 'CUMPARATOR', 'MAGAZIN', 'BRICK', - 'NIVS', 'BENZINA', 'PETROM', 'OMV' - ] - - # Strategy 0: Look for company name followed by SRL/SA on next line - # Pattern: "COMPANY NAME\nSRL" or "COMPANY NAME\nS.R.L." - for i, line in enumerate(lines[:15]): - line = line.strip() - if not line or len(line) < 3: - continue - - line_upper = line.upper() - - # Skip lines with skip keywords - if any(kw in line_upper for kw in skip_keywords): - continue - - # Check if next line is standalone SRL, S.R.L., SA, S.A., etc. - if i + 1 < len(lines): - next_line = lines[i + 1].strip().upper() - # Match standalone company type suffix - if re.match(r'^S\.?\s*R\.?\s*L\.?$', next_line) or \ - re.match(r'^S\.?\s*A\.?$', next_line) or \ - re.match(r'^S\.?\s*N\.?\s*C\.?$', next_line) or \ - re.match(r'^P\.?\s*F\.?\s*A\.?$', next_line) or \ - re.match(r'^I\.?\s*I\.?$', next_line): - # Combine: "COMPANY NAME" + " " + "SRL" - vendor = self._clean_vendor_name(f"{line} {next_line}") - if vendor and len(vendor) >= 5: - return vendor, 0.95 - - # Strategy 1: Look for lines with vendor indicators (S.R.L., S.A., HOLDING, etc.) - for i, line in enumerate(lines[:15]): # Check first 15 lines - line = line.strip() - if not line or len(line) < 3: - continue - - line_upper = line.upper() - - # Skip lines with skip keywords (CUMPARATOR, CLIENT, etc.) - if any(kw in line_upper for kw in skip_keywords): - continue - - # Check for vendor indicators - for indicator in self.VENDOR_INDICATORS: - if re.search(indicator, line_upper): - # Found a company name indicator - vendor = self._clean_vendor_name(line) - if vendor and len(vendor) >= 3: - # High confidence for lines with company indicators - return vendor, 0.95 - - # Strategy 2: Look for lines right before or after CIF - for i, line in enumerate(lines[:15]): - line_upper = line.upper() - if 'CIF' in line_upper and 'CLIENT' not in line_upper: - # Check line before - if i > 0: - prev_line = lines[i-1].strip() - if prev_line and len(prev_line) >= 3: - if not any(kw in prev_line.upper() for kw in skip_keywords): - vendor = self._clean_vendor_name(prev_line) - if vendor: - return vendor, 0.85 - - # Strategy 3: First valid line as fallback - for i, line in enumerate(lines[:10]): - line = line.strip() - - # Skip empty lines - if not line or len(line) < 3: - continue - - # Skip lines that are just numbers or codes - if re.match(r'^[\d.,\s:]+$', line): - continue - - # Skip lines with barcodes/product codes - if re.match(r'^[A-Z]*\d{6,}', line): - continue - - # Skip lines with keywords - if any(kw in line.upper() for kw in skip_keywords): - continue - - # Clean the line - vendor = self._clean_vendor_name(line) - - if vendor and len(vendor) >= 3: - # Confidence decreases for lines further down - confidence = max(0.3, 0.7 - (i * 0.05)) - return vendor, confidence - - return None, 0.0 - - def _clean_vendor_name(self, name: str) -> Optional[str]: - """Clean and normalize vendor name.""" - if not name: - return None - - # Remove common OCR artifacts - name = re.sub(r'[^\w\s.,&\-()]', ' ', name) - # Normalize whitespace - name = re.sub(r'\s+', ' ', name).strip() - - name_upper = name.upper() - - # Skip if it looks like an address line only - # Note: SC (Scara/staircase) is tricky because S.C. also means "Societate Comercială" (company) - # Only reject SC when followed by a number (staircase), not when followed by company name - # Pattern: STR, JUD, MUN, NR, BL, ET, AP are always address prefixes - # SC is only address when followed by digit (e.g., "SC 2", "SC. 5") - if re.match(r'^(STR|JUD|MUN|NR|BL|ET|AP)\.?\s', name_upper): - return None - - # SC followed by digit = staircase (address), reject - # SC followed by letter/company name = "Societate Comercială", keep - if re.match(r'^S\.?\s*C\.?\s+\d', name_upper): - return None - - # Skip if too short after cleaning - if len(name) < 3: - return None - - return name - - def _get_store_profile(self, cui: Optional[str]) -> Optional[dict]: - """ - Get store-specific profile by CUI. - - DEPRECATED: Use ProfileRegistry.get_profile() directly for profile objects. - This method is kept for backward compatibility and returns validation hints dict. - - Args: - cui: The CUI extracted from receipt (with or without RO prefix) - - Returns: - Store profile validation hints dict or None if not found - """ - profile = ProfileRegistry.get_profile(cui) - if profile: - # Return validation hints for backward compatibility - hints = profile.get_validation_hints() - hints['name'] = profile.STORE_NAME - print(f"[Store Profile] Found profile for {cui}: {profile.STORE_NAME}", flush=True) - return hints - return None - - def _extract_cui(self, text_upper: str, original_text: str) -> Tuple[Optional[str], float]: - """ - Extract vendor CUI (fiscal identification code) from text. - Excludes CLIENT CUI which appears as 'CLIENT C.U.I./C.I.F.:...' - """ - def get_cui_digit_count(cui: str) -> int: - """Get the count of digits in CUI (excluding RO/R0 prefix).""" - cui_upper = cui.upper().strip() - if cui_upper.startswith('RO') or cui_upper.startswith('R0'): - return len(cui_upper) - 2 - return len(cui_upper) - - # Strategy 0: Check for reversed format (CIF NUMBER on line BEFORE "C.I.F." label) - # This is common in some receipts: "RO11201891\nC. I. F." - for pattern, confidence in self.CUI_REVERSED_PATTERNS: - match = re.search(pattern, text_upper, re.IGNORECASE | re.MULTILINE) - if match: - cui = match.group(1) - digit_count = get_cui_digit_count(cui) - if 6 <= digit_count <= 10: - # Verify this is not the CLIENT CUI by checking context - start = match.start() - # Check 50 chars before the match for CLIENT keyword - context_start = max(0, start - 50) - context = text_upper[context_start:start] - if 'CLIENT' not in context and 'LIENT' not in context: - return cui, confidence - - # Strategy 1: Try to find CIF on a line that doesn't contain CLIENT - lines = text_upper.split('\n') - for line in lines: - # Skip lines that contain CLIENT (these are buyer's CUI, not vendor's) - if 'CLIENT' in line or 'CUMPARATOR' in line or 'LIENT' in line: - continue - - # Look for CIF in this line - for pattern, confidence in self.CUI_PATTERNS: - match = re.search(pattern, line, re.IGNORECASE | re.MULTILINE) - if match: - cui = match.group(1) - digit_count = get_cui_digit_count(cui) - if 6 <= digit_count <= 10: - return cui, confidence - - # Strategy 2: Fallback - search entire text but exclude CLIENT patterns - for pattern, confidence in self.CUI_PATTERNS: - # Find all matches - for match in re.finditer(pattern, text_upper, re.IGNORECASE | re.MULTILINE): - cui = match.group(1) - digit_count = get_cui_digit_count(cui) - if 6 <= digit_count <= 10: - # Check if this match is preceded by CLIENT in the same line - start = match.start() - line_start = text_upper.rfind('\n', 0, start) + 1 - line_text = text_upper[line_start:start] - if 'CLIENT' not in line_text and 'LIENT' not in line_text: - return cui, confidence - - return None, 0.0 - - def _detect_receipt_type(self, text: str) -> str: - """Detect receipt type from text content. - - BON FISCAL variants: "BON FISCAL", "BON FISCAL.", "BON FISCAL" - CHITANTA variants: "CHITANTA", "CHITANȚĂ" - """ - # Check for explicit BON FISCAL first (handles OCR spacing variations) - if re.search(r'BON\s+FISCAL', text): - return 'bon_fiscal' - if 'CHITANTA' in text or 'CHITANȚĂ' in text: - return 'chitanta' - # Default to bon_fiscal if neither found - return 'bon_fiscal' - - def _try_pattern_lidl(self, text: str) -> List[dict]: - """ - Try Lidl-style TVA pattern: "TVA A 21,00% 7.71" (no hyphen/colon separator). - - Lidl receipts format: - TOTAL TVA 9,84 - TVA A 21,00% 7,71 - TVA B 11,00% 2,13 - - Returns list of TVA entries found. - """ - entries = [] - seen = set() - - # Pattern: TVA/TUA/IVA + code (A-D) + percent + amount (on same line) - # Handles: "TVA A 21,00% 7,71", "TVA B 11,00% 2,13", "TUA A 21% 7.71" - lidl_patterns = [ - # Same line: "TVA A 21,00% 7.71" (with various spacing) - r'T[VU][AR]\s+([A-D])\s+(\d{1,2})[.,]?\d{0,2}\s*%\s+([\d.,]+)', - # Same line with backslash (OCR artifact): "TVA A \21,00% 7.71" - r'T[VU][AR]\s+([A-D])\s+\\?(\d{1,2})[.,]?\d{0,2}\s*%\s+([\d.,]+)', - # IVA variant - r'IVA\s+([A-D])\s+(\d{1,2})[.,]?\d{0,2}\s*%\s+([\d.,]+)', - ] - - for pattern in lidl_patterns: - for match in re.finditer(pattern, text, re.IGNORECASE): - try: - code = match.group(1).upper() - percent = int(match.group(2)) - amount_str = self._normalize_number(match.group(3)) - amount = Decimal(amount_str) - - if amount > 0: - entry_key = (code, percent) - if entry_key not in seen: - entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - seen.add(entry_key) - print(f"[TVA Lidl] Found: TVA {code} {percent}% = {amount}", flush=True) - except (ValueError, InvalidOperation): - continue - - return entries - - def _select_best_tva_candidate( - self, - candidates: List[tuple], - tva_bon_total: Optional[Decimal] - ) -> Tuple[List[dict], Optional[Decimal], float]: - """ - Select the best TVA candidate from collected candidates. - - Selection criteria (priority order): - 1. Sum matches TOTAL TVA BON (highest priority) - 2. More entries = better (for multi-rate receipts) - 3. Pattern confidence as tiebreaker - - Args: - candidates: List of (pattern_name, confidence, entries, sum) - tva_bon_total: Authoritative TOTAL TVA BON value (if extracted) - - Returns: - (best_entries, best_sum, confidence) - """ - if not candidates: - return [], None, 0.0 - - # Score each candidate - scored = [] - for name, confidence, entries, sum_val in candidates: - score = 0.0 - - # Criterion 1: Sum matches TOTAL TVA BON (highest priority) - if tva_bon_total and sum_val: - tolerance = max(Decimal('0.02'), tva_bon_total * Decimal('0.02')) # 2% tolerance - if abs(sum_val - tva_bon_total) <= tolerance: - score += 100 # High bonus for matching authoritative total - print(f"[TVA Select] {name}: sum {sum_val} matches tva_bon_total {tva_bon_total}", flush=True) - - # Criterion 2: More entries (for multi-rate receipts) - score += len(entries) * 10 - - # Criterion 3: Pattern confidence - score += confidence * 5 - - scored.append((score, name, confidence, entries, sum_val)) - print(f"[TVA Select] Candidate {name}: score={score:.1f}, entries={len(entries)}, sum={sum_val}", flush=True) - - # Sort by score descending - scored.sort(key=lambda x: x[0], reverse=True) - best = scored[0] - print(f"[TVA Select] Winner: {best[1]} (score={best[0]:.1f})", flush=True) - - return best[3], best[4], best[2] # entries, sum, confidence - - def _extract_tva_entries(self, text: str) -> Tuple[List[dict], Optional[Decimal], float]: - """ - Extract multiple TVA (VAT) entries from text. - Romanian receipts can have multiple TVA rates (A=19%, B=9%, C=5%, D=0%). - - Uses CANDIDATE COLLECTION approach: - - Try ALL patterns and collect candidates - - Select best candidate based on matching TOTAL TVA BON - - Returns (tva_entries, tva_total, confidence) where tva_entries is a list of: - {'code': 'A', 'percent': 19, 'amount': Decimal('15.20')} - """ - tva_entries = [] - seen_entries = set() # To avoid duplicates - confidence = 0.0 # Track extraction confidence - - # Check for non-VAT payer (NEPLATITOR DE TVA) - TVA = 0 - # OCR variants: NEPLATTOR, NEPLATITOR, NEPLATOR, NEPLATTOR, ANEPLATHTOR, MEPLATITOR, etc. - # Also handles: "TOTAL NEPLATITOR TVA", "(NEPLATITOR DE TVA)" - non_vat_patterns = [ - # Main pattern - flexible for OCR errors: NEPLAT + any chars + OR/R - r'NEPLAT\w*OR', # NEPLATITOR, NEPLATTOR, NEPLATOR - r'[ANM]EPLAT\w*O?R', # OCR errors: ANEPLATHTOR, MEPLATITOR - r'TOTAL\s+NEPLAT', # TOTAL NEPLATITOR... - r'TOTAL\s+[ANM]EPLAT', # TOTAL ANEPLAT... (OCR error) - r'SCUTIT\s*(?:DE\s+)?T[VU]A', # SCUTIT DE TVA - r'NEPLAT\w*\s+T[VU]A', # NEPLATITOR TVA - r'NEPLAT\w*\s+DE\s+T', # NEPLATITOR DE T... (truncated) - ] - for pattern in non_vat_patterns: - if re.search(pattern, text, re.IGNORECASE): - # Non-VAT payer - return TVA = 0, high confidence - return [{'code': 'D', 'percent': 0, 'amount': Decimal('0.00')}], Decimal('0.00'), 0.95 - - # Normalize spaces in numbers first (OCR may produce "32. 31" or "49, 58") - normalized_text = re.sub(r'(\d+)[.,]\s+(\d{2})', r'\1.\2', text) - # Also normalize comma followed by space to comma (for "21, 00%" -> "21,00%") - normalized_text = re.sub(r'(\d+),\s+(\d{2})\s*%', r'\1.\2%', normalized_text) - - # Extract TOTAL TVA BON/TOTAL TVA first as the authoritative reference - tva_bon_total = self._extract_total_tva_bon(normalized_text) - print(f"[TVA Debug] TOTAL TVA BON: {tva_bon_total}", flush=True) - - # CANDIDATE COLLECTION APPROACH: Try all patterns, collect candidates, select best - all_candidates = [] # List of (pattern_name, confidence, entries, sum) - - # === LIDL-STYLE PATTERNS (NEW) === - # Lidl format: "TVA A 21,00% 7.71" or "TVA B 11,00% 2.13" (no hyphen/colon) - # This pattern handles multi-rate TVA receipts - lidl_entries = self._try_pattern_lidl(normalized_text) - if lidl_entries: - lidl_sum = sum(e['amount'] for e in lidl_entries) - all_candidates.append(('lidl', 0.96, lidl_entries, lidl_sum)) - print(f"[TVA Debug] Lidl pattern: {len(lidl_entries)} entries, sum={lidl_sum}", flush=True) - - # Pattern 0a: First try to get TVA from "TOTAL TAXE:" which is most reliable - # Format: "TOTAL TAXE: 55,22" - this is always the TVA amount - # OCR may cut "T" producing "OTAL TAXE:" instead of "TOTAL TAXE:" - # OCR may also put amount BEFORE "OTAL TAXE": "55,22OTAL TAXE:" - total_taxe_pattern = r'T?OTAL\s+TAXE\s*:?\s*([\d\s.,]+)' - taxe_match = re.search(total_taxe_pattern, normalized_text, re.IGNORECASE) - - # Also try pattern where amount comes BEFORE "OTAL TAXE" (OCR line break issue) - if not taxe_match: - reversed_taxe_pattern = r'([\d.,]+)\s*T?OTAL\s+TAXE' - taxe_match = re.search(reversed_taxe_pattern, normalized_text, re.IGNORECASE) - - if taxe_match: - # Also need to find the TVA rate from the table - # Pattern handles: "A-21%", "-21,00%", "21%" etc. - rate_pattern = r'([A-D])?\s*[-:]?\s*(\d{1,2})[.,]?\s*\d{0,2}\s*%' - rate_match = re.search(rate_pattern, normalized_text, re.IGNORECASE) - if rate_match: - try: - code = rate_match.group(1).upper() if rate_match.group(1) else 'A' # Default to A if missing - percent = int(rate_match.group(2)) - amount_str = taxe_match.group(1).replace(' ', '') - amount_str = self._normalize_number(re.sub(r'[^\d.,]', '', amount_str)) - amount = Decimal(amount_str) - if amount > 0: - entry_key = (code, percent) - if entry_key not in seen_entries: - tva_entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - seen_entries.add(entry_key) - except (ValueError, InvalidOperation): - pass - - # Pattern 0b: Table format "A-21,00% 285,66 49,58" (code-percent base tva_amount) - # This format appears after a TVA header line like "TVA TOTAL VALDARE" - # The TVA amount position depends on header: VALDARE last = TVA last, VALOARE middle = TVA middle - if not tva_entries: - table_pattern = r'([A-D])\s*[-:]\s*(\d{1,2})[.,]\s*\d{2}\s*%\s*([\d\s.,]+)\s+([\d\s.,]+)' - for match in re.finditer(table_pattern, normalized_text, re.IGNORECASE): - try: - code = match.group(1).upper() - percent = int(match.group(2)) - amount1_str = match.group(3).replace(' ', '') - amount2_str = match.group(4).replace(' ', '') - amount1 = Decimal(self._normalize_number(re.sub(r'[^\d.,]', '', amount1_str))) - amount2 = Decimal(self._normalize_number(re.sub(r'[^\d.,]', '', amount2_str))) - - # Determine which is TVA: the smaller amount is usually TVA - # (TVA is a fraction of the total, so it's always smaller) - tva_amount = min(amount1, amount2) - - if tva_amount > 0: - entry_key = (code, percent) - if entry_key not in seen_entries: - tva_entries.append({ - 'code': code, - 'percent': percent, - 'amount': tva_amount - }) - seen_entries.add(entry_key) - except (ValueError, InvalidOperation): - continue - - # Pattern 0c: REVERSED FORMAT "5.00% TUA*B" followed by amount on next line - # This handles receipts where percentage comes BEFORE TVA code (e.g., books with 5% rate) - # Matches: "5.00% TUA*B", "5% TVA B", "5.00% TVA", "9% TUA", "5% IVA" - if not tva_entries: - # Pattern: PERCENT% + TVA/IVA + optional code, then amount on next line - reversed_tva_pattern = r'(\d{1,2})[.,]?\d{0,2}\s*%\s*(?:T[VU][AR]|IVA)\s*\*?([A-D])?' - for match in re.finditer(reversed_tva_pattern, normalized_text, re.IGNORECASE): - try: - percent = int(match.group(1)) - code = (match.group(2) or self._get_tva_code_from_percent(percent)).upper() - - # Look for amount on the next line(s) after the match - after_match = normalized_text[match.end():] - # Find standalone number (amount) - skip empty lines - amount_match = re.search(r'^[\s\n]*([\d]+[.,]\d{2})\b', after_match) - if amount_match: - amount_str = self._normalize_number(amount_match.group(1)) - amount = Decimal(amount_str) - if amount > 0: - entry_key = (code, percent) - if entry_key not in seen_entries: - tva_entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - seen_entries.add(entry_key) - except (ValueError, InvalidOperation): - continue - - # Pattern 0d: "TOTAL TUA:", "TOTAL TVA:", "TOTAL IVA:" with amount (OCR variants) - if not tva_entries: - total_tva_simple = r'TOTAL\s+(?:T[VU][AR]|IVA)\s*:?\s*([\d.,]+)' - match = re.search(total_tva_simple, normalized_text, re.IGNORECASE) - if match: - try: - amount_str = self._normalize_number(match.group(1)) - amount = Decimal(amount_str) - if amount > 0: - # Try to find the rate in nearby text - percent = self._detect_tva_percent(text) - if percent: - code = self._get_tva_code_from_percent(percent) - entry_key = (code, percent) - if entry_key not in seen_entries: - tva_entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - seen_entries.add(entry_key) - except (ValueError, InvalidOperation): - pass - - # Pattern 0e: Multiline "TOTAL TUA\n198\n30.43" where: - # - "TOTAL TUA" on one line - # - "198" or similar (corrupted "19%") on next line (optional) - # - "30.43" (TVA amount) on following line - # OCR often splits this across multiple lines - if not tva_entries: - multiline_tva = r'TOTAL\s+(?:T[VU][AR]L?|TU[AR]L|IVA)\s*\n\s*\d*\s*\n?\s*([\d]+[.,]\d{2})\b' - match = re.search(multiline_tva, normalized_text, re.IGNORECASE) - if match: - try: - amount_str = self._normalize_number(match.group(1)) - amount = Decimal(amount_str) - if amount > 0: - percent = self._detect_tva_percent(text) - if percent: - code = self._get_tva_code_from_percent(percent) - entry_key = (code, percent) - if entry_key not in seen_entries: - tva_entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - seen_entries.add(entry_key) - except (ValueError, InvalidOperation): - pass - - # Pattern 1: "TVA A - 19%: 15.20" or "TVAA - 21% 32.31" or "IVA A - 19%" (with code) - # OCR tolerant: TUA, TVR, IVA, etc. - pattern_with_code = r'(?:T[VU][AR]|IVA)\s*([A-D])\s*[-:]\s*(\d{1,2})\s*%\s*:?\s*([\d\s.,]+)' - for match in re.finditer(pattern_with_code, normalized_text, re.IGNORECASE): - try: - code = match.group(1).upper() - percent = int(match.group(2)) - amount_str = match.group(3).replace(' ', '') - amount_str = self._normalize_number(re.sub(r'[^\d.,]', '', amount_str)) - amount = Decimal(amount_str) - if amount > 0: - entry_key = (code, percent) - if entry_key not in seen_entries: - tva_entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - seen_entries.add(entry_key) - except (ValueError, InvalidOperation): - continue - - # Pattern 2: "TVA - 21%: 32.31" or "IVA - 21%: 32.31" (without explicit code, assume 'A') - if not tva_entries: - pattern_no_code = r'(?:T[VU][AR]|IVA)\s*[-:]\s*(\d{1,2})\s*%\s*:?\s*([\d\s.,]+)' - for match in re.finditer(pattern_no_code, normalized_text, re.IGNORECASE): - try: - percent = int(match.group(1)) - amount_str = match.group(2).replace(' ', '') - amount_str = self._normalize_number(re.sub(r'[^\d.,]', '', amount_str)) - amount = Decimal(amount_str) - if amount > 0: - # Determine code based on percent - code = self._get_tva_code_from_percent(percent) - entry_key = (code, percent) - if entry_key not in seen_entries: - tva_entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - seen_entries.add(entry_key) - except (ValueError, InvalidOperation): - continue - - # Pattern 3: "TOTAL TVA A - 21%" or "TOTAL IVA" with amount on same line or "TOTAL TVA BON" with amount - if not tva_entries: - # First try: "TOTAL TVA A - 21% 32.31" or "TOTAL IVA A - 21% 32.31" (amount on same line) - tva_with_amount = r'TOTAL\s+(?:T[VU][AR]|IVA)\s+([A-D])\s*[-:]\s*(\d{1,2})\s*%\s*([\d.,]+)' - for match in re.finditer(tva_with_amount, normalized_text, re.IGNORECASE): - try: - code = match.group(1).upper() - percent = int(match.group(2)) - amount_str = self._normalize_number(match.group(3)) - amount = Decimal(amount_str) - if amount > 0: - entry_key = (code, percent) - if entry_key not in seen_entries: - tva_entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - seen_entries.add(entry_key) - except (ValueError, InvalidOperation): - continue - - # Pattern 3b: "TOTAL TVA A - 21%" or "TOTAL IVA A - 21%" on one line, look for "TOTAL TVA BON" amount - if not tva_entries: - tva_total_pattern = r'TOTAL\s+(?:T[VU][AR]|IVA)\s+([A-D])\s*[-:]\s*(\d{1,2})\s*%' - for match in re.finditer(tva_total_pattern, normalized_text, re.IGNORECASE): - try: - code = match.group(1).upper() - percent = int(match.group(2)) - - # Look for "TOTAL TVA BON" or "TOTAL IVA BON" followed by amount - tva_bon_pattern = r'TOTAL\s+(?:T[VU][AR]|IVA)\s+BON[:\s]*([\d.,]+)' - tva_bon_match = re.search(tva_bon_pattern, normalized_text, re.IGNORECASE) - if tva_bon_match: - amount_str = self._normalize_number(tva_bon_match.group(1)) - amount = Decimal(amount_str) - if amount > 0: - entry_key = (code, percent) - if entry_key not in seen_entries: - tva_entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - seen_entries.add(entry_key) - continue - - # Fallback: Amount after TOTAL TVA BON or TOTAL IVA BON on next line - tva_bon_pos = re.search(r'TOTAL\s+(?:T[VU][AR]|IVA)\s+BON', normalized_text, re.IGNORECASE) - if tva_bon_pos: - after_bon = normalized_text[tva_bon_pos.end():] - # Find first standalone number (likely TVA amount) - amount_match = re.search(r'[\s\n]*([\d]+[.,]\d{2})\s*\n', after_bon) - if amount_match: - amount_str = self._normalize_number(amount_match.group(1)) - amount = Decimal(amount_str) - if amount > 0: - entry_key = (code, percent) - if entry_key not in seen_entries: - tva_entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - seen_entries.add(entry_key) - except (ValueError, InvalidOperation): - continue - - # Pattern 3c: "TVAA - 21%" or "IVA A - 21%" on one line, amount on next line (simpler format) - if not tva_entries: - tva_line_pattern = r'(?:T[VU][AR]|IVA)\s*([A-D])?\s*[-:]\s*(\d{1,2})\s*%' - for match in re.finditer(tva_line_pattern, normalized_text, re.IGNORECASE): - try: - code = (match.group(1) or 'A').upper() - percent = int(match.group(2)) - - # Look for amount on the next line or immediately after - after_tva = normalized_text[match.end():] - amount_match = re.search(r'^[\s\n]*([\d.,]+)', after_tva) - if amount_match: - amount_str = self._normalize_number(amount_match.group(1)) - amount = Decimal(amount_str) - if amount > 0: - entry_key = (code, percent) - if entry_key not in seen_entries: - tva_entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - seen_entries.add(entry_key) - except (ValueError, InvalidOperation): - continue - - # Pattern 4: Use TVA_PATTERNS for fallback - if not tva_entries: - for pattern, _ in self.TVA_PATTERNS: - match = re.search(pattern, normalized_text, re.IGNORECASE) - if match: - try: - # Some patterns have 2 groups (percent, amount), others just amount - if match.lastindex >= 2: - percent = int(match.group(1)) - amount_str = match.group(2) - else: - amount_str = match.group(1) - # Try to detect percent from text - percent = self._detect_tva_percent(text) - - amount_str = amount_str.replace(' ', '') - amount_str = self._normalize_number(re.sub(r'[^\d.,]', '', amount_str)) - amount = Decimal(amount_str) - if amount > 0 and percent: - code = self._get_tva_code_from_percent(percent) - entry_key = (code, percent) - if entry_key not in seen_entries: - tva_entries.append({ - 'code': code, - 'percent': percent, - 'amount': amount - }) - seen_entries.add(entry_key) - break # Only use first match from fallback - except (ValueError, InvalidOperation): - continue - - # Add existing extraction results to candidates (if any) - if tva_entries: - entries_sum = sum(entry['amount'] for entry in tva_entries) - all_candidates.append(('standard', 0.90, tva_entries, entries_sum)) - print(f"[TVA Debug] Standard patterns: {len(tva_entries)} entries, sum={entries_sum}", flush=True) - - # === CANDIDATE SELECTION === - # Select best candidate using TOTAL TVA BON as authoritative reference - if all_candidates: - best_entries, best_sum, confidence = self._select_best_tva_candidate(all_candidates, tva_bon_total) - if best_entries: - tva_entries = best_entries - entries_sum = best_sum - - # Calculate sum from entries (if not set by candidate selection) - entries_sum = None - if tva_entries: - entries_sum = sum((entry['amount'] for entry in tva_entries), Decimal(0)) - - # Validate and correct TVA values - tva_entries, tva_total = self._validate_and_correct_tva( - tva_entries, entries_sum, tva_bon_total - ) - - # Sort by code (A, B, C, D) - tva_entries.sort(key=lambda x: x.get('code', 'Z')) - - return tva_entries, tva_total, confidence if tva_entries else 0.0 - - def _get_tva_code_from_percent(self, percent: int) -> str: - """Map TVA percentage to standard Romanian code. - - Romanian TVA rates changed in August 2025: - - Standard rate: 19% → 21% - - Reduced rate: 9% → 11% - - Other rates (5%, 0%) remain unchanged - - Old rates (before Aug 2025): New rates (from Aug 2025): - - A = 19% (standard) - A = 21% (standard) - - B = 9% (reduced) - B = 11% (reduced) - - C = 5% (reduced) - C = 5% (reduced) - - D = 0% (exempt) - D = 0% (exempt) - - Both old and new rates are supported for historical receipts. - """ - if percent in (19, 21): - return 'A' # Standard rate (19% old, 21% new from Aug 2025) - elif percent in (9, 11): - return 'B' # Reduced rate (9% old, 11% new from Aug 2025) - elif percent == 5: - return 'C' # Reduced rate (unchanged) - elif percent == 0: - return 'D' # Exempt (unchanged) - else: - return 'A' # Default to standard rate - - def _extract_total_tva_bon(self, text: str) -> Optional[Decimal]: - """ - Extract TOTAL TVA BON value separately as the reference. - This is the authoritative total TVA on the receipt. - - Handles OCR variations: TOTAL TVA BON, OTAL TUA BON, TOTAL IVA BON, etc. - """ - # Pattern for TOTAL TVA BON or TOTAL IVA BON with amount after - # OCR corruptions: TUAL (TVA+L merged), TVAL, TUAI, etc. - patterns = [ - # Standard: TOTAL TVA BON: 14.92 or TOTAL IVA BON: 14.92 - # Handles: TUAL (TVA+L), TVAL, TUAI, etc. with optional trailing letters - r'T?OTAL\s+(?:T[VU][AR]L?|TU[AR]L|IVA)\s+BON\s*:?\s*([\d]+[.,]\d{2})\b', - # Amount before: 14.92 OTAL TUA BON (OCR line break) - r'([\d]+[.,]\d{2})\s*\n?\s*T?OTAL\s+(?:T[VU][AR]L?|TU[AR]L|IVA)\s+BON', - # Amount on next line after TOTAL TVA BON or TOTAL IVA BON - r'T?OTAL\s+(?:T[VU][AR]L?|TU[AR]L|IVA)\s+BON\s*\n\s*([\d]+[.,]\d{2})\b', - ] - - for pattern in patterns: - match = re.search(pattern, text, re.IGNORECASE) - if match: - try: - amount_str = self._normalize_number(match.group(1)) - amount = Decimal(amount_str) - if amount > 0: - return amount - except (InvalidOperation, ValueError): - continue - - return None - - def _validate_and_correct_tva( - self, - tva_entries: List[dict], - entries_sum: Optional[Decimal], - tva_bon_total: Optional[Decimal] - ) -> Tuple[List[dict], Optional[Decimal]]: - """ - Validate and correct TVA values. - - Rules: - 1. TVA cannot be greater than TOTAL amount (will be validated at higher level) - 2. Sum of TVA A + TVA B + ... should equal TOTAL TVA BON - 3. If single entry and sum != tva_bon_total, use tva_bon_total - 4. Detect and fix OCR concatenation errors (e.g., 14.921492 from 14.92 + 14.92) - """ - if not tva_entries: - return tva_entries, tva_bon_total - - # Check for OCR concatenation errors in individual entries - # Pattern: X.XX followed by another decimal (e.g., 14.921492 from 14.92 + 14.92) - corrected_entries = [] - for entry in tva_entries: - amount = entry['amount'] - amount_str = str(amount) - - # Check if amount looks like concatenated decimals - # e.g., 14.921492 could be 14.92 + 14.92 incorrectly joined - # or 32.3132.31 from 32.31 + 32.31 - if len(amount_str) > 6 and '.' in amount_str: - int_part, dec_part = amount_str.split('.') - - # If decimal part > 2 digits, it's likely concatenation - if len(dec_part) > 2: - # Try to extract the first valid decimal amount - # e.g., from 14.921492, extract 14.92 - try: - corrected_amount = Decimal(f"{int_part}.{dec_part[:2]}") - print(f"[TVA Validation] Corrected concatenation error: {amount} -> {corrected_amount}", flush=True) - entry['amount'] = corrected_amount - except InvalidOperation: - pass - - corrected_entries.append(entry) - - tva_entries = corrected_entries - - # Recalculate sum after corrections - entries_sum = sum((entry['amount'] for entry in tva_entries), Decimal(0)) if tva_entries else None - - # Validate sum against TOTAL TVA BON - if tva_bon_total and entries_sum: - # Allow small tolerance for rounding (0.02) - tolerance = Decimal('0.02') - difference = abs(entries_sum - tva_bon_total) - - if difference > tolerance: - print(f"[TVA Validation] Sum mismatch: entries_sum={entries_sum}, tva_bon_total={tva_bon_total}", flush=True) - - # If single entry and sum doesn't match, use TOTAL TVA BON as reference - if len(tva_entries) == 1: - print(f"[TVA Validation] Single entry - using TOTAL TVA BON as reference: {tva_bon_total}", flush=True) - tva_entries[0]['amount'] = tva_bon_total - entries_sum = tva_bon_total - # If multiple entries and sum > tva_bon_total, likely double counting - elif entries_sum > tva_bon_total: - # Check if one entry is the duplicate of another - amounts = [e['amount'] for e in tva_entries] - unique_amounts = set(amounts) - if len(unique_amounts) < len(amounts): - # Duplicate detected - likely TOTAL TVA BON counted as separate entry - print(f"[TVA Validation] Duplicate TVA detected, removing duplicates", flush=True) - # Keep only unique entries - seen = set() - unique_entries = [] - for entry in tva_entries: - key = (entry.get('code'), entry['amount']) - if key not in seen: - seen.add(key) - unique_entries.append(entry) - tva_entries = unique_entries - entries_sum = sum((e['amount'] for e in tva_entries), Decimal(0)) - - # Final total - tva_total = entries_sum if entries_sum else tva_bon_total - - return tva_entries, tva_total - - def _detect_tva_percent(self, text: str) -> Optional[int]: - """Detect TVA percentage from text content. - - IMPORTANT: Prioritize rates found near TVA markers over rates found elsewhere. - E.g., "REDUCERE 5%" should not override "TVA A 19%". - Also handle OCR corruptions like "194" for "19%" in "TOTAL TA F 194". - """ - import re as regex - - # First, look for percent NEAR TVA markers (most reliable) - # This handles "TVA A 19%", "TVA 19,00%", "TOTAL TVA 19%" - tva_context_patterns = [ - r'T[VU][AR]\s*[A-D]?\s*[-:]?\s*(19|21|11|9|5)[.,]?\s*\d{0,2}\s*%', - r'IVA\s*[A-D]?\s*[-:]?\s*(19|21|11|9|5)[.,]?\s*\d{0,2}\s*%', - # OCR corruption: "TOTAL TA F 194" where 194 = 19% (4 is artifact) - r'TOTAL\s+T[VA][AR]?\s*[F\s]?\s*(19|21)\d\b', - ] - for pattern in tva_context_patterns: - match = regex.search(pattern, text, regex.IGNORECASE) - if match: - rate = int(match.group(1)) - if rate in (19, 21, 11, 9, 5): - return rate - - # Fallback: Look for common Romanian TVA percentages anywhere - # But EXCLUDE patterns near "REDUCERE", "DISCOUNT", "RED." (these are discounts, not TVA) - # Clean text by removing discount context - # Handle OCR corruptions: RED.CERE (C instead of U), RED CERE, REDUC, etc. - text_no_discount = regex.sub(r'(?:REDUC|DISCOUNT|RED)[.\sA-Z]*\d+[.,]?\d*\s*%', '', text, flags=regex.IGNORECASE) - - # Now search in cleaned text (priority order: 19% > 21% > 11% > 9% > 5%) - if regex.search(r'\b19[.,]?\s*\d{0,2}\s*%', text_no_discount): - return 19 - elif regex.search(r'\b21[.,]?\s*\d{0,2}\s*%', text_no_discount): - return 21 - elif regex.search(r'\b11[.,]?\s*\d{0,2}\s*%', text_no_discount): - return 11 - elif regex.search(r'\b9[.,]?\s*\d{0,2}\s*%', text_no_discount): - return 9 - elif regex.search(r'\b5[.,]?\s*\d{0,2}\s*%', text_no_discount): - return 5 - - # Default: If no percent found but we're in Romanian receipt context, - # assume 19% (standard rate) - if regex.search(r'T[VU][AR]|IVA', text, regex.IGNORECASE): - return 19 - - return None - - def _validate_tva_reverse( - self, - tva_entries: List[dict], - total_amount: Optional[Decimal] - ) -> Tuple[bool, Optional[Decimal], str]: - """ - Reverse TVA validation: from TVA amount and rate, calculate expected total. - - Formula (CORRECT): - For TVA that is INCLUDED in total (standard Romanian receipts): - total = base + tva - tva = base * rate/100 - Therefore: base = tva * 100 / rate - And: total = base + tva = tva * 100 / rate + tva = tva * (100 + rate) / rate - - Returns (is_valid, expected_total, message) - """ - if not tva_entries or not total_amount: - return True, None, "Insufficient data for reverse validation" - - expected_total = Decimal('0') - for entry in tva_entries: - tva_amount = entry['amount'] - rate = Decimal(str(entry['percent'])) - - print(f"[TVA Debug] Entry: amount={tva_amount}, rate={rate}%", flush=True) - - if rate > 0: - # CORRECT formula: total = tva * (100 + rate) / rate - # Example: tva=55.22, rate=21 → total = 55.22 * 121 / 21 = 318.16 - gross_for_entry = tva_amount * (Decimal('100') + rate) / rate - expected_total += gross_for_entry - print(f"[TVA Debug] Calculated gross: {gross_for_entry}", flush=True) - else: - # 0% TVA - can't calculate base, skip - pass - - if expected_total == 0: - return True, None, "Cannot calculate expected total (0% TVA only)" - - # Tolerance: max(0.50 RON, 1% of total) - tolerance = max(Decimal('0.50'), total_amount * Decimal('0.01')) - difference = abs(expected_total - total_amount) - - if difference <= tolerance: - return True, expected_total, f"TVA reverse validation passed (expected: {expected_total}, actual: {total_amount}, diff: {difference})" - else: - return False, expected_total, f"TVA reverse validation WARNING: expected {expected_total}, actual {total_amount}, diff {difference}" - - def _extract_items_count(self, text: str) -> Optional[int]: - """Extract number of items/articles from receipt.""" - for pattern, _ in self.ITEMS_COUNT_PATTERNS: - match = re.search(pattern, text, re.IGNORECASE) - if match: - try: - count = int(match.group(1)) - if 0 < count < 1000: # Reasonable range - return count - except ValueError: - continue - return None - - def _extract_address(self, text: str) -> Optional[str]: - """Extract vendor address from text.""" - lines = text.split('\n') - address_parts = [] - - for line in lines[:15]: # Check first 15 lines - line = line.strip() - if not line: - continue - - # Check for address patterns - line_upper = line.upper() - - # JUD. (county) pattern - if re.search(r'\bJUD\.?\s+', line_upper): - address_parts.append(line) - continue - - # STR. (street) pattern - if re.search(r'\bSTR\.?\s+', line_upper): - address_parts.append(line) - continue - - # MUN./OR./COM. (city/town) pattern - if re.search(r'\b(MUN|OR|COM)\.?\s+', line_upper): - address_parts.append(line) - continue - - if address_parts: - # Join and clean address parts - address = ', '.join(address_parts) - # Clean up - address = re.sub(r'\s+', ' ', address).strip() - address = re.sub(r',\s*,', ',', address) - return address if len(address) >= 5 else None - - return None - - def _extract_payment_methods(self, text: str) -> Tuple[List[dict], float]: - """ - Extract payment methods (CARD/NUMERAR) from receipt. - These appear after TOTAL LEI and before TOTAL TVA section. - - Returns tuple of: (list of {'method': 'CARD'/'NUMERAR', 'amount': Decimal}, confidence) - """ - payment_methods = [] - seen_methods = set() - max_confidence = 0.0 - - # Normalize spaces in numbers - normalized_text = re.sub(r'(\d+)[.,]\s+(\d{2})', r'\1.\2', text) - - # Find the region between TOTAL LEI and TOTAL TVA - total_lei_match = re.search(r'TOTAL\s+LEI\s*([\d\s.,]+)', normalized_text, re.IGNORECASE) - total_tva_match = re.search(r'TOTAL\s+(?:T[VU][AR]|IVA)', normalized_text, re.IGNORECASE) - - # Define search region (after TOTAL LEI, before TOTAL TVA if exists) - if total_lei_match: - start_pos = total_lei_match.end() - end_pos = total_tva_match.start() if total_tva_match else len(normalized_text) - search_region = normalized_text[start_pos:end_pos] - else: - search_region = normalized_text # Fallback to full text - - for pattern, method, confidence in self.PAYMENT_METHOD_PATTERNS: - for match in re.finditer(pattern, search_region, re.IGNORECASE | re.MULTILINE): - try: - amount_str = match.group(1).replace(' ', '') - amount_str = self._normalize_number(re.sub(r'[^\d.,]', '', amount_str)) - amount = Decimal(amount_str) - # Validate: amount must be positive and reasonable (< MAX_REASONABLE_PAYMENT) - # This prevents OCR errors like CUI being parsed as payment - if amount > 0 and amount < self.MAX_REASONABLE_PAYMENT and method not in seen_methods: - payment_methods.append({ - 'method': method, - 'amount': amount - }) - seen_methods.add(method) - if confidence > max_confidence: - max_confidence = confidence - print(f"[Payment] Found {method}: {amount} (pattern matched, conf={confidence})", flush=True) - elif amount >= self.MAX_REASONABLE_PAYMENT: - print(f"[Payment] Rejected unreasonable amount {amount} for {method} (likely OCR error)", flush=True) - except (InvalidOperation, ValueError): - continue - - return payment_methods, max_confidence if payment_methods else 0.0 - - def _validate_payment_methods( - self, payment_methods: List[dict], total: Optional[Decimal] - ) -> List[dict]: - """ - Validate payment methods against extracted total. - - If payment sum is way larger than total (>10x), it's likely an OCR error - (e.g., CUI number parsed as payment amount). Clear invalid payments. - - Args: - payment_methods: List of {'method': str, 'amount': Decimal} - total: Extracted total amount - - Returns: - Validated payment methods (may be empty if all were invalid) - """ - if not total or not payment_methods: - return payment_methods - - payment_sum = sum(pm.get('amount', Decimal('0')) for pm in payment_methods) - - # If payment sum > 10x total, it's definitely an error - if payment_sum > total * 10: - print(f"[Payment Validation] Payment sum {payment_sum} >> Total {total} (>10x), clearing invalid payments", flush=True) - return [] - - # If payment sum > 2x total, it's suspicious but might be valid in some edge cases - # Just log a warning - if payment_sum > total * 2: - print(f"[Payment Validation] Warning: Payment sum {payment_sum} > 2x Total {total}, possible OCR error", flush=True) - - return payment_methods - - def _extract_client_data( - self, text_upper: str, original_text: str - ) -> Tuple[Optional[str], Optional[str], Optional[str], float]: - """ - Extract client/buyer data from B2B receipts. - - Returns (client_name, client_cui, client_address, confidence) - """ - client_name = None - client_cui = None - client_address = None - confidence = 0.0 - - # Step 1: Find CLIENT section marker - client_section_start = None - for marker in self.CLIENT_SECTION_MARKERS: - match = re.search(marker, text_upper, re.IGNORECASE) - if match: - client_section_start = match.start() - break - - if client_section_start is None: - # No client section found - return None, None, None, 0.0 - - # Step 2: Extract client CUI - for pattern, conf in self.CLIENT_CUI_PATTERNS: - match = re.search(pattern, text_upper, re.IGNORECASE | re.MULTILINE) - if match: - cui = match.group(1) - if 6 <= len(cui) <= 10: - client_cui = cui - confidence = max(confidence, conf) - break - - # Step 3: Extract client name from CLIENT section - # Look for company name after CLIENT: marker - lines = original_text.split('\n') - for i, line in enumerate(lines): - line_upper = line.upper().strip() - - # Check if this line contains CLIENT marker - if any(re.search(marker, line_upper) for marker in self.CLIENT_SECTION_MARKERS): - # Check if name is on same line after ":" - if ':' in line: - name_part = line.split(':', 1)[1].strip() - if name_part and len(name_part) >= 3: - # Skip if it looks like a CUI (R/RO followed by digits) - if re.match(r'^R[O0]?\d{6,10}$', name_part.upper()): - # This is a CUI, not a name - extract it if not already found - if not client_cui: - cui_digits = re.sub(r'[^0-9]', '', name_part) - if 6 <= len(cui_digits) <= 10: - client_cui = cui_digits - confidence = max(confidence, 0.90) - continue - # Check for company indicators - if any(re.search(ind, name_part.upper()) for ind in self.VENDOR_INDICATORS): - client_name = self._clean_vendor_name(name_part) - confidence = max(confidence, 0.95) - break - elif len(name_part) >= 5 and not name_part.isdigit(): - client_name = self._clean_vendor_name(name_part) - confidence = max(confidence, 0.80) - break - - # Check next line for company name - if i + 1 < len(lines): - next_line = lines[i + 1].strip() - next_upper = next_line.upper() - - # Skip if it's a CUI/CIF line - if not re.search(r'C\.?\s*[UI]\.?\s*[IF]\.?', next_upper): - if any(re.search(ind, next_upper) for ind in self.VENDOR_INDICATORS): - client_name = self._clean_vendor_name(next_line) - confidence = max(confidence, 0.90) - break - elif len(next_line) >= 5 and not next_line.isdigit(): - # Check if it looks like a company name - if not any(kw in next_upper for kw in ['CUI', 'CIF', 'COD', 'FISCAL']): - client_name = self._clean_vendor_name(next_line) - confidence = max(confidence, 0.75) - break - - # Step 4: Extract client address (if present after client section) - if client_section_start: - # Look for address patterns after client section - client_region = text_upper[client_section_start:client_section_start + 500] - for pattern, _ in self.ADDRESS_PATTERNS: - match = re.search(pattern, client_region) - if match: - client_address = match.group(1).strip() - break - - # Log extraction result - if client_cui or client_name: - print(f"[Client Extraction] Found: name={client_name}, cui={client_cui}, conf={confidence}", flush=True) - - return client_name, client_cui, client_address, confidence diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr_service.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr_service.py deleted file mode 100644 index d6cb742..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/ocr_service.py +++ /dev/null @@ -1,735 +0,0 @@ -"""Main OCR service coordinating preprocessing, recognition, and extraction.""" - -import os -import re -import gc -import logging -import threading - -# Disable PaddleOCR model source check for faster startup (PaddleX 3.x) - must be set before import -os.environ['PADDLE_PDX_DISABLE_MODEL_SOURCE_CHECK'] = 'True' - -import time -import asyncio -from concurrent.futures import ThreadPoolExecutor -from decimal import Decimal -from pathlib import Path -from typing import Optional, Tuple - -from backend.modules.data_entry.services.ocr_engine import OCREngine -from backend.modules.data_entry.services.ocr_extractor import ReceiptExtractor, ExtractionResult -from backend.modules.data_entry.services.image_preprocessor import ImagePreprocessor -from backend.modules.data_entry.services.ocr.validation import OCRValidationEngine - -# Setup logging -logger = logging.getLogger(__name__) - - -def get_memory_usage_mb() -> float: - """Get current process memory usage in MB.""" - try: - import resource - # Get memory in KB, convert to MB - rusage = resource.getrusage(resource.RUSAGE_SELF) - return rusage.ru_maxrss / 1024 # Linux returns KB - except Exception: - return 0.0 - - -class OCRService: - """Service for OCR processing of receipt images.""" - - # Single worker to prevent memory accumulation from parallel OCR - _executor = ThreadPoolExecutor(max_workers=1) - # Semaphore to ensure only one OCR operation at a time (memory protection) - _ocr_semaphore = threading.Semaphore(1) - # Memory threshold in MB - if exceeded, force GC before processing - _memory_threshold_mb = 2500 - - def __init__(self): - self.preprocessor = ImagePreprocessor() - self.ocr_engine = OCREngine() - self.extractor = ReceiptExtractor() - - async def process_image( - self, - image_path: Path, - mime_type: str - ) -> Tuple[bool, str, Optional[ExtractionResult]]: - """ - Process receipt image and extract structured data. - - Args: - image_path: Path to the image file - mime_type: MIME type of the file - - Returns: - Tuple of (success, message, extraction_result) - """ - try: - loop = asyncio.get_event_loop() - result = await loop.run_in_executor( - self._executor, - self._process_sync, - image_path, - mime_type - ) - return result - except Exception as e: - return False, f"OCR processing failed: {str(e)}", None - - def _cleanup_memory(self, *arrays): - """Explicitly delete numpy arrays and force garbage collection.""" - for arr in arrays: - if arr is not None: - try: - del arr - except: - pass - gc.collect() - - def _process_sync( - self, - image_path: Path, - mime_type: str - ) -> Tuple[bool, str, Optional[ExtractionResult]]: - """Synchronous processing with ADAPTIVE OCR pipeline.""" - - # Acquire semaphore to ensure only one OCR at a time - acquired = self._ocr_semaphore.acquire(timeout=120) # 2 min timeout - if not acquired: - return False, "OCR service busy - please try again", None - - try: - return self._process_sync_internal(image_path, mime_type) - finally: - # Always release semaphore and cleanup - self._ocr_semaphore.release() - # Force garbage collection after EVERY OCR request - gc.collect() - mem_after = get_memory_usage_mb() - print(f"[OCR Service] Memory after cleanup: {mem_after:.0f}MB", flush=True) - - def _process_sync_internal( - self, - image_path: Path, - mime_type: str - ) -> Tuple[bool, str, Optional[ExtractionResult]]: - """Internal processing - called with semaphore held.""" - - start_time = time.time() - mem_before = get_memory_usage_mb() - print(f"[OCR Service] Starting processing: {image_path}, mime: {mime_type}", flush=True) - print(f"[OCR Service] Memory before: {mem_before:.0f}MB", flush=True) - - # Check if memory is high - force GC before processing - if mem_before > self._memory_threshold_mb: - print(f"[OCR Service] WARNING: Memory high ({mem_before:.0f}MB > {self._memory_threshold_mb}MB), forcing GC...", flush=True) - gc.collect() - mem_after_gc = get_memory_usage_mb() - print(f"[OCR Service] Memory after pre-GC: {mem_after_gc:.0f}MB", flush=True) - - # Load image - images = None # For cleanup - image = None - if mime_type == 'application/pdf': - try: - images = self.preprocessor.pdf_to_images(image_path) - if not images: - return False, "Failed to extract images from PDF", None - image = images[0] - # Delete other pages immediately to save memory - if len(images) > 1: - for i in range(1, len(images)): - del images[i] - images = [image] - except RuntimeError as e: - return False, str(e), None - else: - try: - image = self.preprocessor.load_image(image_path) - except ValueError as e: - return False, str(e), None - - raw_texts = [] - extraction = None - - # ══════════════════════════════════════════════════════════════ - # STEP 1: PaddleOCR + Light (fastest, best for clear PDFs) - # ══════════════════════════════════════════════════════════════ - print("=" * 60, flush=True) - print("[OCR] STEP 1: PaddleOCR + Light preprocessing", flush=True) - print("=" * 60, flush=True) - light_img = self.preprocessor.preprocess_light(image) - - try: - paddle_light = self.ocr_engine._paddle_recognize(light_img) - # Cleanup light_img immediately after OCR - del light_img - light_img = None - - if paddle_light and paddle_light.text: - extraction = self.extractor.extract(paddle_light.text) - extraction.ocr_engine = "paddle-light" - raw_texts.append(f"═══ PaddleOCR (light, conf: {paddle_light.confidence:.0%}) ═══\n{paddle_light.text}") - - # Log extraction results - print(f"[OCR] Step 1 Results:", flush=True) - print(f" - OCR Confidence: {paddle_light.confidence:.0%}", flush=True) - print(f" - Amount: {extraction.amount}", flush=True) - print(f" - Date: {extraction.receipt_date}", flush=True) - print(f" - Number: {extraction.receipt_number}", flush=True) - print(f" - CUI: {extraction.cui}", flush=True) - print(f" - TVA: {extraction.tva_total} (entries: {len(extraction.tva_entries) if extraction.tva_entries else 0})", flush=True) - print(f" - Overall Confidence: {extraction.overall_confidence:.0%}", flush=True) - - # Early exit if complete - if self._is_extraction_complete(extraction): - extraction.raw_text = "\n\n".join(raw_texts) - elapsed_ms = int((time.time() - start_time) * 1000) - extraction.processing_time_ms = elapsed_ms - print(f"[OCR] *** EARLY EXIT at Step 1 - All fields found! ({elapsed_ms}ms) ***", flush=True) - # Cleanup before return - del image - if images: - del images - return True, "OCR complete (fast mode)", extraction - else: - print("[OCR] -> Step 1 incomplete, continuing to Step 2...", flush=True) - except Exception as e: - print(f"[OCR] PaddleOCR light failed: {e}", flush=True) - extraction = ExtractionResult() - # Cleanup on error - if light_img is not None: - del light_img - - # ══════════════════════════════════════════════════════════════ - # STEP 2: PaddleOCR + Medium (balanced preprocessing) - # ══════════════════════════════════════════════════════════════ - print("=" * 60, flush=True) - print("[OCR] STEP 2: PaddleOCR + Medium preprocessing", flush=True) - print("=" * 60, flush=True) - medium_img = self.preprocessor.preprocess_medium(image) - - try: - paddle_medium = self.ocr_engine._paddle_recognize(medium_img) - # Cleanup medium_img immediately after OCR - del medium_img - medium_img = None - - if paddle_medium and paddle_medium.text: - extraction_medium = self.extractor.extract(paddle_medium.text) - extraction_medium.ocr_engine = "paddle-medium" - raw_texts.append(f"═══ PaddleOCR (medium, conf: {paddle_medium.confidence:.0%}) ═══\n{paddle_medium.text}") - - print(f"[OCR] Step 2 (Medium) Results:", flush=True) - print(f" - OCR Confidence: {paddle_medium.confidence:.0%}", flush=True) - print(f" - Amount: {extraction_medium.amount}", flush=True) - print(f" - Date: {extraction_medium.receipt_date}", flush=True) - print(f" - CUI: {extraction_medium.cui}", flush=True) - - # Merge with previous - extraction = self._merge_extractions(extraction, extraction_medium) - - print(f"[OCR] After merge:", flush=True) - print(f" - Amount: {extraction.amount}", flush=True) - print(f" - Date: {extraction.receipt_date}", flush=True) - print(f" - Number: {extraction.receipt_number}", flush=True) - print(f" - CUI: {extraction.cui}", flush=True) - print(f" - TVA: {extraction.tva_total}", flush=True) - print(f" - Overall Confidence: {extraction.overall_confidence:.0%}", flush=True) - - if self._is_extraction_complete(extraction): - extraction.raw_text = "\n\n".join(raw_texts) - extraction.ocr_engine = "paddle-adaptive" - elapsed_ms = int((time.time() - start_time) * 1000) - extraction.processing_time_ms = elapsed_ms - print(f"[OCR] *** EARLY EXIT at Step 2 - All fields found after merge! ({elapsed_ms}ms) ***", flush=True) - # Cleanup before return - del image - if images: - del images - return True, "OCR complete (paddle dual)", extraction - else: - print("[OCR] -> Step 2 incomplete, continuing to Step 3 (Tesseract)...", flush=True) - except Exception as e: - print(f"[OCR] PaddleOCR medium failed: {e}", flush=True) - # Cleanup on error - if medium_img is not None: - del medium_img - - # ══════════════════════════════════════════════════════════════ - # STEP 3: Tesseract - ONLY to complete missing fields - # Uses Tesseract-optimized preprocessing (binarized, high contrast) - # ══════════════════════════════════════════════════════════════ - print("=" * 60, flush=True) - print("[OCR] STEP 3: Tesseract (complement only, not override)", flush=True) - print("=" * 60, flush=True) - - tesseract_img = None - try: - # Use Tesseract-specific preprocessing (Otsu binarization) - tesseract_img = self.preprocessor.preprocess_for_tesseract(image) - tesseract_result = self.ocr_engine._tesseract_recognize(tesseract_img) - # Cleanup tesseract_img immediately after OCR - del tesseract_img - tesseract_img = None - - if tesseract_result and tesseract_result.text: - extraction_tess = self.extractor.extract(tesseract_result.text) - extraction_tess.ocr_engine = "tesseract" - raw_texts.append(f"═══ Tesseract (conf: {tesseract_result.confidence:.0%}) ═══\n{tesseract_result.text}") - - print(f"[OCR] Step 3 (Tesseract) Results:", flush=True) - print(f" - OCR Confidence: {tesseract_result.confidence:.0%}", flush=True) - print(f" - Amount: {extraction_tess.amount}", flush=True) - print(f" - Date: {extraction_tess.receipt_date}", flush=True) - print(f" - CUI: {extraction_tess.cui}", flush=True) - - # IMPORTANT: Tesseract only COMPLETES missing fields, never overrides! - extraction = self._complement_extraction(extraction, extraction_tess) - except Exception as e: - print(f"[OCR] Tesseract failed: {e}", flush=True) - # Cleanup on error - if tesseract_img is not None: - del tesseract_img - - # Cleanup original image - no longer needed - del image - if images: - del images - - # ══════════════════════════════════════════════════════════════ - # FINAL VALIDATION: Fix impossible values - # ══════════════════════════════════════════════════════════════ - if extraction: - extraction = self._final_validation(extraction) - - # Final result - if extraction is None: - return False, "No text detected", None - - extraction.raw_text = "\n\n".join(raw_texts) - extraction.ocr_engine = "adaptive-full" - - # Build result message - fields_found = [] - if extraction.amount: fields_found.append("amount") - if extraction.receipt_date: fields_found.append("date") - if extraction.receipt_number: fields_found.append("number") - if extraction.cui: fields_found.append("CUI") - if extraction.tva_total or extraction.tva_entries: fields_found.append("TVA") - - message = f"OCR complete (full pipeline). Found: {', '.join(fields_found) or 'no fields'}" - - elapsed_ms = int((time.time() - start_time) * 1000) - extraction.processing_time_ms = elapsed_ms - - print("=" * 60, flush=True) - print(f"[OCR] FINAL RESULT (full pipeline) - {elapsed_ms}ms", flush=True) - print("=" * 60, flush=True) - print(f" - Amount: {extraction.amount}", flush=True) - print(f" - Date: {extraction.receipt_date}", flush=True) - print(f" - Number: {extraction.receipt_number}", flush=True) - print(f" - CUI: {extraction.cui}", flush=True) - print(f" - TVA: {extraction.tva_total}", flush=True) - print(f" - Overall Confidence: {extraction.overall_confidence:.0%}", flush=True) - print(f" - Processing Time: {elapsed_ms}ms", flush=True) - print(f" - Message: {message}", flush=True) - - # ══════════════════════════════════════════════════════════════ - # VALIDATION: Apply validation rules to final extraction - # ══════════════════════════════════════════════════════════════ - print("\n" + "=" * 60, flush=True) - print("[Validation] Applying validation rules...", flush=True) - print("=" * 60, flush=True) - - validator = OCRValidationEngine() - - # Prepare data for validation with safe type conversions - def safe_float(value) -> Optional[float]: - """Safely convert Decimal or number to float.""" - if value is None: - return None - try: - return float(value) - except (TypeError, ValueError): - return None - - def safe_payment_sum(methods: list, method_type: str) -> Optional[float]: - """Safely sum payment amounts for a given method type.""" - if not methods: - return None - try: - total = sum( - float(pm.get('amount', 0) or 0) - for pm in methods - if pm.get('method') == method_type - ) - return total if total > 0 else None - except (TypeError, ValueError): - return None - - validation_data = { - 'amount': safe_float(extraction.amount), - 'tva': safe_float(extraction.tva_total), - 'cui': extraction.cui, - 'card_amount': safe_payment_sum(extraction.payment_methods, 'CARD'), - 'cash_amount': safe_payment_sum(extraction.payment_methods, 'NUMERAR'), - 'tva_entries': { - entry.get('code', ''): safe_float(entry.get('amount')) - for entry in (extraction.tva_entries or []) - if entry.get('code') and safe_float(entry.get('amount')) is not None - } - } - - # Run validation (no light/medium comparison for final result) - validated_result = validator.validate_extraction(validation_data) - - # Apply validation results to extraction - extraction.needs_manual_review = validated_result.needs_manual_review - extraction.validation_warnings = validated_result.validation_warnings - extraction.validation_errors = validated_result.validation_errors - extraction.confidence_adjustments = validated_result.confidence_adjustments - extraction.inter_ocr_ratios = validated_result.inter_ocr_ratios - - print(f"[Validation] Complete:", flush=True) - print(f" - Warnings: {len(extraction.validation_warnings)}", flush=True) - print(f" - Errors: {len(extraction.validation_errors)}", flush=True) - print(f" - Needs Manual Review: {extraction.needs_manual_review}", flush=True) - if extraction.validation_warnings: - for warning in extraction.validation_warnings: - print(f" [!] {warning}", flush=True) - - return True, message, extraction - - def _merge_extractions( - self, - paddle: Optional[ExtractionResult], - tesseract: Optional[ExtractionResult] - ) -> ExtractionResult: - """ - Merge two extractions, picking best fields from each engine. - - Strategy: - - For each field, prefer the one with higher confidence - - Use validation rules (CUI format, date validity, company indicators) - - Combine TVA entries if different - """ - result = ExtractionResult() - - # Handle case where one is None - if paddle is None and tesseract is None: - return result - if paddle is None: - return tesseract - if tesseract is None: - return paddle - - print("[Merge] Comparing PaddleOCR vs Tesseract extractions...", flush=True) - - # === AMOUNT === - # Pick higher confidence, both must be positive - if paddle.amount and tesseract.amount: - if paddle.confidence_amount >= tesseract.confidence_amount: - result.amount = paddle.amount - result.confidence_amount = paddle.confidence_amount - print(f"[Merge] Amount: PaddleOCR {paddle.amount} (conf: {paddle.confidence_amount:.0%})", flush=True) - else: - result.amount = tesseract.amount - result.confidence_amount = tesseract.confidence_amount - print(f"[Merge] Amount: Tesseract {tesseract.amount} (conf: {tesseract.confidence_amount:.0%})", flush=True) - elif paddle.amount: - result.amount = paddle.amount - result.confidence_amount = paddle.confidence_amount - elif tesseract.amount: - result.amount = tesseract.amount - result.confidence_amount = tesseract.confidence_amount - - # === DATE === - # Pick higher confidence, validate date reasonableness - if paddle.receipt_date and tesseract.receipt_date: - if paddle.confidence_date >= tesseract.confidence_date: - result.receipt_date = paddle.receipt_date - result.confidence_date = paddle.confidence_date - print(f"[Merge] Date: PaddleOCR {paddle.receipt_date}", flush=True) - else: - result.receipt_date = tesseract.receipt_date - result.confidence_date = tesseract.confidence_date - print(f"[Merge] Date: Tesseract {tesseract.receipt_date}", flush=True) - elif paddle.receipt_date: - result.receipt_date = paddle.receipt_date - result.confidence_date = paddle.confidence_date - elif tesseract.receipt_date: - result.receipt_date = tesseract.receipt_date - result.confidence_date = tesseract.confidence_date - - # === VENDOR NAME === - # Prefer one with company indicators (S.R.L., S.A., etc.) - paddle_has_indicator = self._has_company_indicator(paddle.partner_name) - tesseract_has_indicator = self._has_company_indicator(tesseract.partner_name) - - if paddle.partner_name and tesseract.partner_name: - if paddle_has_indicator and not tesseract_has_indicator: - result.partner_name = paddle.partner_name - result.confidence_vendor = paddle.confidence_vendor - print(f"[Merge] Vendor: PaddleOCR '{paddle.partner_name}' (has company indicator)", flush=True) - elif tesseract_has_indicator and not paddle_has_indicator: - result.partner_name = tesseract.partner_name - result.confidence_vendor = tesseract.confidence_vendor - print(f"[Merge] Vendor: Tesseract '{tesseract.partner_name}' (has company indicator)", flush=True) - elif paddle.confidence_vendor >= tesseract.confidence_vendor: - result.partner_name = paddle.partner_name - result.confidence_vendor = paddle.confidence_vendor - print(f"[Merge] Vendor: PaddleOCR '{paddle.partner_name}' (higher conf)", flush=True) - else: - result.partner_name = tesseract.partner_name - result.confidence_vendor = tesseract.confidence_vendor - print(f"[Merge] Vendor: Tesseract '{tesseract.partner_name}' (higher conf)", flush=True) - elif paddle.partner_name: - result.partner_name = paddle.partner_name - result.confidence_vendor = paddle.confidence_vendor - elif tesseract.partner_name: - result.partner_name = tesseract.partner_name - result.confidence_vendor = tesseract.confidence_vendor - - # === CUI (Fiscal Code) === - # Validate format: 6-10 digits, prefer valid one - paddle_cui_valid = self._is_valid_cui(paddle.cui) - tesseract_cui_valid = self._is_valid_cui(tesseract.cui) - - if paddle.cui and tesseract.cui: - if paddle_cui_valid and not tesseract_cui_valid: - result.cui = paddle.cui - print(f"[Merge] CUI: PaddleOCR {paddle.cui} (valid format)", flush=True) - elif tesseract_cui_valid and not paddle_cui_valid: - result.cui = tesseract.cui - print(f"[Merge] CUI: Tesseract {tesseract.cui} (valid format)", flush=True) - else: - # Both valid or both invalid - prefer PaddleOCR - result.cui = paddle.cui - print(f"[Merge] CUI: PaddleOCR {paddle.cui}", flush=True) - elif paddle.cui and paddle_cui_valid: - result.cui = paddle.cui - elif tesseract.cui and tesseract_cui_valid: - result.cui = tesseract.cui - elif paddle.cui: - result.cui = paddle.cui - elif tesseract.cui: - result.cui = tesseract.cui - - # === TVA ENTRIES === - # Prefer non-empty, use the one with more entries or higher amounts - if paddle.tva_entries and tesseract.tva_entries: - # Compare: prefer the one with actual amounts (not just 0) - paddle_total = sum(e.get('amount', Decimal('0')) for e in paddle.tva_entries) - tesseract_total = sum(e.get('amount', Decimal('0')) for e in tesseract.tva_entries) - - if paddle_total >= tesseract_total: - result.tva_entries = paddle.tva_entries - result.tva_total = paddle.tva_total - print(f"[Merge] TVA: PaddleOCR (total: {paddle_total})", flush=True) - else: - result.tva_entries = tesseract.tva_entries - result.tva_total = tesseract.tva_total - print(f"[Merge] TVA: Tesseract (total: {tesseract_total})", flush=True) - elif paddle.tva_entries: - result.tva_entries = paddle.tva_entries - result.tva_total = paddle.tva_total - elif tesseract.tva_entries: - result.tva_entries = tesseract.tva_entries - result.tva_total = tesseract.tva_total - - # === OTHER FIELDS === - # Simple preference: paddle > tesseract - result.receipt_number = paddle.receipt_number or tesseract.receipt_number - result.receipt_series = paddle.receipt_series or tesseract.receipt_series - result.receipt_type = paddle.receipt_type or tesseract.receipt_type - result.items_count = paddle.items_count or tesseract.items_count - result.address = paddle.address or tesseract.address - result.description = paddle.description or tesseract.description - - return result - - def _has_company_indicator(self, name: Optional[str]) -> bool: - """Check if vendor name has company type indicator (S.R.L., S.A., etc.)""" - if not name: - return False - name_upper = name.upper() - indicators = [ - r'\bS\.?\s*R\.?\s*L\.?\b', - r'\bS\.?\s*A\.?\b', - r'\bS\.?\s*N\.?\s*C\.?\b', - r'\bP\.?\s*F\.?\s*A\.?\b', - r'\bI\.?\s*I\.?\b', - r'\bHOLDING\b', - r'\bGROUP\b', - r'\bCOMPANY\b', - ] - for indicator in indicators: - if re.search(indicator, name_upper): - return True - return False - - def _is_valid_cui(self, cui: Optional[str]) -> bool: - """Validate CUI format: 6-10 digits.""" - if not cui: - return False - # Remove any RO prefix - cui_clean = re.sub(r'^RO', '', cui.upper()) - # Must be 6-10 digits - return bool(re.match(r'^\d{6,10}$', cui_clean)) - - def _is_extraction_complete(self, ext: ExtractionResult, min_confidence: float = 0.85) -> bool: - """ - Check if extraction has ALL required fields to skip further processing. - - Required for early exit (ALL must be true): - - Overall confidence >= 85% - - ALL 5 critical fields present: number, date, amount, TVA, CUI - """ - # Must have high confidence - if ext.overall_confidence < min_confidence: - print(f"[OCR] Confidence {ext.overall_confidence:.0%} < {min_confidence:.0%} - continuing", flush=True) - return False - - # Check all required fields - has_number = bool(ext.receipt_number) - has_date = bool(ext.receipt_date) - has_amount = bool(ext.amount) - has_tva = bool(ext.tva_total) or bool(ext.tva_entries) - has_cui = bool(ext.cui) - - missing = [] - if not has_number: missing.append("number") - if not has_date: missing.append("date") - if not has_amount: missing.append("amount") - if not has_tva: missing.append("TVA") - if not has_cui: missing.append("CUI") - - if missing: - print(f"[OCR] Missing: {', '.join(missing)} - continuing", flush=True) - return False - - print(f"[OCR] OK: All 5 fields found with {ext.overall_confidence:.0%} confidence", flush=True) - return True - - def _complement_extraction( - self, - primary: Optional[ExtractionResult], - secondary: Optional[ExtractionResult] - ) -> ExtractionResult: - """ - Complement primary extraction with missing fields from secondary. - NEVER overrides existing values - only fills in gaps. - - This is different from _merge_extractions which can override values. - """ - if primary is None and secondary is None: - return ExtractionResult() - if primary is None: - return secondary - if secondary is None: - return primary - - print("[Complement] Adding missing fields from Tesseract...", flush=True) - - # Only fill missing amount - if not primary.amount and secondary.amount: - primary.amount = secondary.amount - primary.confidence_amount = secondary.confidence_amount - print(f"[Complement] Added amount: {secondary.amount}", flush=True) - - # Only fill missing date - if not primary.receipt_date and secondary.receipt_date: - primary.receipt_date = secondary.receipt_date - primary.confidence_date = secondary.confidence_date - print(f"[Complement] Added date: {secondary.receipt_date}", flush=True) - - # Only fill missing vendor - if not primary.partner_name and secondary.partner_name: - primary.partner_name = secondary.partner_name - primary.confidence_vendor = secondary.confidence_vendor - print(f"[Complement] Added vendor: {secondary.partner_name}", flush=True) - - # Only fill missing CUI - if not primary.cui and secondary.cui and self._is_valid_cui(secondary.cui): - primary.cui = secondary.cui - print(f"[Complement] Added CUI: {secondary.cui}", flush=True) - - # Only fill missing TVA - if not primary.tva_entries and secondary.tva_entries: - primary.tva_entries = secondary.tva_entries - primary.tva_total = secondary.tva_total - print(f"[Complement] Added TVA: {secondary.tva_total}", flush=True) - - # Only fill missing receipt number - if not primary.receipt_number and secondary.receipt_number: - primary.receipt_number = secondary.receipt_number - print(f"[Complement] Added number: {secondary.receipt_number}", flush=True) - - # Only fill missing address - if not primary.address and secondary.address: - primary.address = secondary.address - print(f"[Complement] Added address: {secondary.address}", flush=True) - - return primary - - def _final_validation(self, extraction: ExtractionResult) -> ExtractionResult: - """ - Final validation and correction of impossible values. - - Key rules: - 1. TVA cannot be greater than TOTAL (it's always a fraction) - 2. If TVA > TOTAL, recalculate TOTAL from TVA using known rates - 3. Validate TVA entries sum equals TVA total - """ - print("[Final Validation] Checking extracted values...", flush=True) - - # Rule 1: TVA cannot be greater than TOTAL - if extraction.tva_total and extraction.amount: - if extraction.tva_total > extraction.amount: - print(f"[Final Validation] TVA ({extraction.tva_total}) > TOTAL ({extraction.amount}) - IMPOSSIBLE!", flush=True) - - # Calculate TOTAL from TVA using reverse formula: - # total = base + tva = tva * (100/rate + 1) = tva * (100 + rate) / rate - # For 9% TVA: total = tva * 109 / 9 = tva * 12.11 - # For 19% TVA: total = tva * 119 / 19 = tva * 6.26 - # For 21% TVA: total = tva * 121 / 21 = tva * 5.76 - - rate = 19 # Default rate assumption - if extraction.tva_entries: - # Use the rate from the first entry - rate = extraction.tva_entries[0].get('percent', 19) - - if rate > 0: - # Formula: total = tva * (100 + rate) / rate - calculated_total = extraction.tva_total * (Decimal('100') + Decimal(str(rate))) / Decimal(str(rate)) - calculated_total = calculated_total.quantize(Decimal('0.01')) - - print(f"[Final Validation] Calculated TOTAL from TVA: {calculated_total} (using {rate}% rate)", flush=True) - - extraction.amount = calculated_total - extraction.confidence_amount = 0.70 # Lower confidence for calculated value - - # Rule 2: TVA cannot be more than ~25% of total (max Romanian rate is 21%) - if extraction.tva_total and extraction.amount: - tva_percent = extraction.tva_total / extraction.amount * Decimal('100') - if tva_percent > Decimal('25'): - print(f"[Final Validation] Warning: TVA is {tva_percent:.1f}% of total - suspicious", flush=True) - - # Rule 3: Validate TVA entries sum - if extraction.tva_entries and extraction.tva_total: - entries_sum = sum(e.get('amount', Decimal('0')) for e in extraction.tva_entries) - tolerance = Decimal('0.05') - if abs(entries_sum - extraction.tva_total) > tolerance: - print(f"[Final Validation] TVA entries sum ({entries_sum}) != tva_total ({extraction.tva_total})", flush=True) - # Use the sum as it's more reliable - extraction.tva_total = entries_sum - - print(f"[Final Validation] Done. Amount={extraction.amount}, TVA={extraction.tva_total}", flush=True) - return extraction - - -# Singleton instance -ocr_service = OCRService() diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/receipt_auto_create.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/receipt_auto_create.py deleted file mode 100644 index 14decdf..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/receipt_auto_create.py +++ /dev/null @@ -1,385 +0,0 @@ -""" -Auto-create Receipt from OCR results for bulk upload flow. - -This service handles automatic creation of Receipt records from OCR extraction -results, enabling end-to-end processing without manual UI intervention. - -The service: -1. Maps OCR ExtractionData fields to Receipt fields -2. Creates attachment from the original uploaded file -3. Generates accounting entries -4. Links the receipt back to the batch job for tracking -""" - -import logging -import shutil -import uuid -from dataclasses import dataclass -from datetime import date, datetime -from decimal import Decimal -from pathlib import Path -from typing import Optional, List - -from sqlalchemy import select, update -from sqlalchemy.ext.asyncio import AsyncSession - -from backend.modules.data_entry.db.models.receipt import ( - Receipt, - ReceiptAttachment, - ReceiptStatus, - ReceiptType, - ReceiptDirection, -) -from backend.modules.data_entry.db.models.batch import BatchJob -from backend.modules.data_entry.db.crud.receipt import ReceiptCRUD -from backend.modules.data_entry.db.crud.accounting_entry import AccountingEntryCRUD -from backend.modules.data_entry.schemas.receipt import ReceiptCreate, TvaEntrySchema, PaymentMethodSchema -from backend.modules.data_entry.schemas.ocr import ExtractionData -from backend.modules.data_entry.services.receipt_service import ReceiptService -from backend.modules.data_entry.services import sse_service -from backend.config import settings - - -logger = logging.getLogger(__name__) - - -@dataclass -class ReceiptCreateResult: - """Result of auto-create operation.""" - success: bool - receipt_id: Optional[int] = None - error_message: Optional[str] = None - - -class ReceiptAutoCreateService: - """ - Service for automatically creating receipts from OCR results. - - Used by the bulk upload flow to create receipts without user intervention. - Created receipts are in DRAFT status and require review before approval. - """ - - @staticmethod - def _validate_ocr_result(ocr_result: ExtractionData) -> tuple[bool, str]: - """ - Perform minimal validation on OCR result. - - Validates: - - amount > 0 (required for receipt) - - date is valid and not in future - - Args: - ocr_result: Extracted data from OCR - - Returns: - Tuple of (is_valid, error_message) - """ - # Validate amount exists and is positive - if ocr_result.amount is None: - return False, "Amount not extracted from receipt" - - if ocr_result.amount <= 0: - return False, f"Invalid amount: {ocr_result.amount} (must be > 0)" - - # Validate date exists and is not in the future - if ocr_result.receipt_date is None: - return False, "Receipt date not extracted" - - today = date.today() - if ocr_result.receipt_date > today: - return False, f"Receipt date {ocr_result.receipt_date} is in the future" - - return True, "" - - @staticmethod - def _map_ocr_to_receipt( - ocr_result: ExtractionData, - company_id: int, - ) -> ReceiptCreate: - """ - Map OCR ExtractionData fields to ReceiptCreate schema. - - Args: - ocr_result: Extracted data from OCR - company_id: Company ID for the receipt - - Returns: - ReceiptCreate schema ready for database insertion - """ - # Map receipt type - receipt_type = ReceiptType.BON_FISCAL - if ocr_result.receipt_type == "chitanta": - receipt_type = ReceiptType.CHITANTA - - # Map TVA breakdown from OCR TvaEntry to schema TvaEntrySchema - tva_breakdown: Optional[List[TvaEntrySchema]] = None - if ocr_result.tva_entries: - tva_breakdown = [ - TvaEntrySchema( - code=entry.code, - percent=entry.percent, - amount=entry.amount - ) - for entry in ocr_result.tva_entries - ] - - # Map payment methods - payment_methods: Optional[List[PaymentMethodSchema]] = None - if ocr_result.payment_methods: - payment_methods = [ - PaymentMethodSchema( - method=pm.method, - amount=pm.amount - ) - for pm in ocr_result.payment_methods - ] - - # Create receipt data - return ReceiptCreate( - receipt_type=receipt_type, - direction=ReceiptDirection.CHELTUIALA, # Default to expense - receipt_number=ocr_result.receipt_number, - receipt_series=ocr_result.receipt_series, - receipt_date=ocr_result.receipt_date, - amount=ocr_result.amount, - description=ocr_result.description, - tva_breakdown=tva_breakdown, - tva_total=ocr_result.tva_total, - items_count=ocr_result.items_count, - vendor_address=ocr_result.address, - company_id=company_id, - partner_name=ocr_result.partner_name, - cui=ocr_result.cui, - ocr_raw_text=ocr_result.raw_text[:5000] if ocr_result.raw_text else None, # Limit size - payment_methods=payment_methods, - payment_mode=ocr_result.suggested_payment_mode, - ) - - @staticmethod - async def _create_attachment_from_file( - session: AsyncSession, - receipt_id: int, - source_file_path: str, - original_filename: Optional[str] = None, - ) -> Optional[ReceiptAttachment]: - """ - Create attachment by copying file from OCR job location. - - Args: - session: Database session - receipt_id: Receipt ID to attach to - source_file_path: Path to the original file from OCR job - original_filename: Original filename from upload (optional) - - Returns: - Created ReceiptAttachment or None if failed - """ - source_path = Path(source_file_path) - - if not source_path.exists(): - logger.warning(f"[ReceiptAutoCreate] Source file not found: {source_path}") - return None - - # Generate stored filename - ext = source_path.suffix.lower() - stored_filename = f"{uuid.uuid4()}{ext}" - - # Determine relative path (organized by year/month) - now = datetime.utcnow() - relative_path = Path(str(now.year)) / f"{now.month:02d}" - - # Full destination path - dest_dir = settings.data_entry_upload_path_resolved / relative_path - dest_dir.mkdir(parents=True, exist_ok=True) - dest_path = dest_dir / stored_filename - - # Copy file to attachments directory - try: - shutil.copy2(source_path, dest_path) - except Exception as e: - logger.error(f"[ReceiptAutoCreate] Failed to copy file: {e}") - return None - - # Get file size - file_size = dest_path.stat().st_size - - # Determine MIME type - mime_map = { - '.jpg': 'image/jpeg', - '.jpeg': 'image/jpeg', - '.png': 'image/png', - '.pdf': 'application/pdf', - } - mime_type = mime_map.get(ext, 'application/octet-stream') - - # Use original filename if provided, otherwise use source filename - display_filename = original_filename or source_path.name - - # Create attachment record - attachment = ReceiptAttachment( - receipt_id=receipt_id, - filename=display_filename, - stored_filename=stored_filename, - file_path=str(relative_path / stored_filename), - file_size=file_size, - mime_type=mime_type, - ) - - session.add(attachment) - await session.flush() - - return attachment - - @staticmethod - async def _update_batch_job_receipt_id( - session: AsyncSession, - job_id: str, - receipt_id: int, - ) -> None: - """ - Update batch_jobs table with the created receipt_id. - - Args: - session: Database session - job_id: OCR job UUID - receipt_id: Created receipt ID - """ - await session.execute( - update(BatchJob) - .where(BatchJob.job_id == job_id) - .values(receipt_id=receipt_id) - ) - - @staticmethod - async def create_from_ocr_result( - session: AsyncSession, - job_id: str, - ocr_result: ExtractionData, - username: str, - batch_id: int, - company_id: int, - file_path: Optional[str] = None, - original_filename: Optional[str] = None, - file_hash: Optional[str] = None, - ) -> ReceiptCreateResult: - """ - Create a receipt from OCR extraction result. - - This method: - 1. Validates the OCR result (amount > 0, date valid) - 2. Maps OCR fields to Receipt fields - 3. Creates the Receipt in DRAFT status - 4. Creates attachment from original file - 5. Generates accounting entries - 6. Updates batch_jobs with receipt_id - - Args: - session: Database session - job_id: OCR job UUID for tracking - ocr_result: Extracted data from OCR processing - username: User who initiated the upload - batch_id: Batch ID for grouping - company_id: Company ID for the receipt - file_path: Path to the original uploaded file - original_filename: Original filename from upload - file_hash: SHA-256 hash of the file for duplicate detection (US-007) - - Returns: - ReceiptCreateResult with success status and receipt_id or error - """ - try: - # Step 1: Validate OCR result - is_valid, error_msg = ReceiptAutoCreateService._validate_ocr_result(ocr_result) - if not is_valid: - logger.warning(f"[ReceiptAutoCreate] Validation failed for job {job_id}: {error_msg}") - return ReceiptCreateResult( - success=False, - error_message=error_msg - ) - - # Step 2: Map OCR to Receipt schema - receipt_data = ReceiptAutoCreateService._map_ocr_to_receipt( - ocr_result=ocr_result, - company_id=company_id, - ) - - # Step 3: Create receipt in DRAFT status - receipt = await ReceiptCRUD.create(session, receipt_data, created_by=username) - - # Set batch tracking fields (US-007, US-011) - receipt.batch_id = str(batch_id) - receipt.file_hash = file_hash - receipt.processing_status = "completed" - session.add(receipt) - await session.flush() - - logger.info( - f"[ReceiptAutoCreate] Created receipt {receipt.id} for job {job_id}: " - f"amount={receipt.amount}, vendor={receipt.partner_name}, file_hash={file_hash[:16] if file_hash else None}..." - ) - - # Step 4: Create attachment from original file (if path provided) - if file_path: - attachment = await ReceiptAutoCreateService._create_attachment_from_file( - session=session, - receipt_id=receipt.id, - source_file_path=file_path, - original_filename=original_filename, - ) - if attachment: - logger.info(f"[ReceiptAutoCreate] Created attachment for receipt {receipt.id}") - else: - logger.warning(f"[ReceiptAutoCreate] Failed to create attachment for receipt {receipt.id}") - - # Step 5: Generate accounting entries - # Note: For DRAFT status, entries are generated but not required for validation - try: - entries = ReceiptService.generate_accounting_entries(receipt) - if entries: - await AccountingEntryCRUD.create_bulk( - session, receipt.id, entries, is_auto_generated=True - ) - logger.info( - f"[ReceiptAutoCreate] Generated {len(entries)} accounting entries " - f"for receipt {receipt.id}" - ) - except Exception as e: - # Don't fail the receipt creation if entry generation fails - logger.warning( - f"[ReceiptAutoCreate] Failed to generate entries for receipt {receipt.id}: {e}" - ) - - # Step 6: Update batch_jobs with receipt_id - await ReceiptAutoCreateService._update_batch_job_receipt_id( - session=session, - job_id=job_id, - receipt_id=receipt.id, - ) - - # Commit all changes - await session.commit() - - # Broadcast SSE event for real-time updates (US-030) - try: - await sse_service.broadcast_status_change( - receipt_id=receipt.id, - status=receipt.status.value, - processing_status=receipt.processing_status, - batch_id=receipt.batch_id, - ) - except Exception as e: - # Don't fail the receipt creation if SSE broadcast fails - logger.warning(f"[ReceiptAutoCreate] SSE broadcast failed for receipt {receipt.id}: {e}") - - return ReceiptCreateResult( - success=True, - receipt_id=receipt.id - ) - - except Exception as e: - logger.error(f"[ReceiptAutoCreate] Failed to create receipt for job {job_id}: {e}") - await session.rollback() - return ReceiptCreateResult( - success=False, - error_message=str(e) - ) diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/receipt_service.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/receipt_service.py deleted file mode 100644 index d28b8fc..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/receipt_service.py +++ /dev/null @@ -1,457 +0,0 @@ -"""Business logic service for receipts workflow.""" - -from decimal import Decimal, ROUND_HALF_UP -from typing import List, Optional, Tuple - -from sqlalchemy.ext.asyncio import AsyncSession - -from backend.modules.data_entry.db.models.receipt import Receipt, ReceiptStatus, ReceiptDirection -from backend.modules.data_entry.db.models.accounting_entry import EntryType -from backend.modules.data_entry.db.crud.receipt import ReceiptCRUD -from backend.modules.data_entry.db.crud.accounting_entry import AccountingEntryCRUD -from backend.modules.data_entry.schemas.receipt import ( - ReceiptCreate, - ReceiptUpdate, - ReceiptFilter, - ReceiptResponse, - ReceiptListResponse, - ProcessingStats, - AccountingEntryCreate, -) -from backend.modules.data_entry.services.expense_types import EXPENSE_TYPES, get_expense_type - - -# Payment mode to accounting account mapping -PAYMENT_MODE_ACCOUNTS = { - 'casa': ('5311', 'Casa in lei'), - 'banca': ('5121', 'Conturi la banci in lei'), - 'avans_decontare': ('542', 'Avansuri de trezorerie'), -} - - -class ReceiptService: - """Service for receipt business logic and workflow.""" - - @staticmethod - async def create_receipt( - session: AsyncSession, - data: ReceiptCreate, - created_by: str, - ) -> Receipt: - """Create a new receipt in DRAFT status.""" - return await ReceiptCRUD.create(session, data, created_by) - - @staticmethod - async def get_receipt( - session: AsyncSession, - receipt_id: int, - ) -> Optional[Receipt]: - """Get receipt by ID with all relationships.""" - return await ReceiptCRUD.get_by_id(session, receipt_id, include_relations=True) - - @staticmethod - async def get_receipts( - session: AsyncSession, - filters: ReceiptFilter, - ) -> ReceiptListResponse: - """Get paginated list of receipts with processing_stats (US-012).""" - receipts, total = await ReceiptCRUD.get_list(session, filters) - - pages = (total + filters.page_size - 1) // filters.page_size if total > 0 else 1 - - # Get processing stats for bulk uploaded receipts (US-012) - stats_dict = await ReceiptCRUD.get_processing_stats( - session, - company_id=filters.company_id, - batch_id=filters.batch_id, - ) - processing_stats = ProcessingStats(**stats_dict) - - return ReceiptListResponse( - items=[ReceiptResponse.model_validate(r) for r in receipts], - total=total, - page=filters.page, - page_size=filters.page_size, - pages=pages, - processing_stats=processing_stats, - ) - - @staticmethod - async def update_receipt( - session: AsyncSession, - receipt_id: int, - data: ReceiptUpdate, - username: str, - ) -> Tuple[bool, str, Optional[Receipt]]: - """ - Update receipt (only DRAFT status). - Returns (success, message, receipt). - """ - receipt = await ReceiptCRUD.get_by_id(session, receipt_id) - - if not receipt: - return False, "Receipt not found", None - - if not await ReceiptCRUD.can_edit(receipt, username): - return False, "Cannot edit this receipt", None - - updated = await ReceiptCRUD.update(session, receipt, data) - return True, "Receipt updated", updated - - @staticmethod - async def delete_receipt( - session: AsyncSession, - receipt_id: int, - username: str, - ) -> Tuple[bool, str]: - """ - Delete receipt (only DRAFT status). - Returns (success, message). - """ - receipt = await ReceiptCRUD.get_by_id(session, receipt_id) - - if not receipt: - return False, "Receipt not found" - - if not await ReceiptCRUD.can_delete(receipt, username): - return False, "Cannot delete this receipt" - - await ReceiptCRUD.delete(session, receipt) - return True, "Receipt deleted" - - @staticmethod - def generate_accounting_entries(receipt: Receipt) -> List[AccountingEntryCreate]: - """ - Generate accounting entries based on receipt data and expense type. - """ - entries: List[AccountingEntryCreate] = [] - - # Get expense type configuration - expense_type = get_expense_type(receipt.expense_type_code or "OTHER") - if not expense_type: - expense_type = EXPENSE_TYPES["OTHER"] - - amount = Decimal(str(receipt.amount)) - - if receipt.direction == ReceiptDirection.CHELTUIALA: - # Expense: Debit expense account, Credit cash/bank - if expense_type.has_vat: - # Calculate net and VAT - vat_rate = expense_type.vat_percent / Decimal("100") - net_amount = (amount / (1 + vat_rate)).quantize( - Decimal("0.01"), rounding=ROUND_HALF_UP - ) - vat_amount = amount - net_amount - - # Debit: Expense account (net) - entries.append(AccountingEntryCreate( - entry_type=EntryType.DEBIT, - account_code=expense_type.account_code, - account_name=expense_type.account_name, - amount=net_amount, - )) - - # Debit: VAT deductible - entries.append(AccountingEntryCreate( - entry_type=EntryType.DEBIT, - account_code=expense_type.vat_account, - account_name="TVA deductibila", - amount=vat_amount, - )) - else: - # No VAT - full amount to expense - entries.append(AccountingEntryCreate( - entry_type=EntryType.DEBIT, - account_code=expense_type.account_code, - account_name=expense_type.account_name, - amount=amount, - )) - - # Credit entry - based on payment_mode (new) or cash_register (legacy) - if receipt.payment_mode and receipt.payment_mode in PAYMENT_MODE_ACCOUNTS: - credit_account, credit_name = PAYMENT_MODE_ACCOUNTS[receipt.payment_mode] - elif receipt.cash_register_account: - # Backwards compatibility for existing receipts - credit_account = receipt.cash_register_account - credit_name = receipt.cash_register_name or "Casa/Banca" - else: - # Default fallback - credit_account = "5311" - credit_name = "Casa in lei" - - entries.append(AccountingEntryCreate( - entry_type=EntryType.CREDIT, - account_code=credit_account, - account_name=credit_name, - amount=amount, - )) - - else: - # Income: Debit cash/bank, Credit income account - # Based on payment_mode (new) or cash_register (legacy) - if receipt.payment_mode and receipt.payment_mode in PAYMENT_MODE_ACCOUNTS: - cash_account, cash_name = PAYMENT_MODE_ACCOUNTS[receipt.payment_mode] - elif receipt.cash_register_account: - cash_account = receipt.cash_register_account - cash_name = receipt.cash_register_name or "Casa/Banca" - else: - cash_account = "5311" - cash_name = "Casa in lei" - - # Debit: Cash/Bank - entries.append(AccountingEntryCreate( - entry_type=EntryType.DEBIT, - account_code=cash_account, - account_name=cash_name, - amount=amount, - )) - - # Credit: Income account (7xx - to be configured) - entries.append(AccountingEntryCreate( - entry_type=EntryType.CREDIT, - account_code="7588", - account_name="Alte venituri din exploatare", - amount=amount, - )) - - return entries - - @staticmethod - async def submit_for_review( - session: AsyncSession, - receipt_id: int, - username: str, - ) -> Tuple[bool, str, Optional[Receipt]]: - """ - Submit receipt for review (DRAFT/REJECTED → PENDING_REVIEW). - Generates accounting entries automatically. - """ - receipt = await ReceiptCRUD.get_by_id(session, receipt_id) - - if not receipt: - return False, "Receipt not found", None - - if not await ReceiptCRUD.can_submit(receipt, username): - return False, "Cannot submit this receipt", None - - # Check if receipt has at least one attachment - if not receipt.attachments: - return False, "Receipt must have at least one attachment", None - - # Check required fields - if not receipt.expense_type_code: - return False, "Expense type is required", None - - # Validate payment_mode or cash_register (backwards compatibility) - if not receipt.payment_mode and not receipt.cash_register_account: - return False, "Modul de plata este obligatoriu", None - - # Generate accounting entries - entries = ReceiptService.generate_accounting_entries(receipt) - - # Delete existing entries and create new ones - await AccountingEntryCRUD.delete_all_for_receipt(session, receipt_id) - await AccountingEntryCRUD.create_bulk(session, receipt_id, entries, is_auto_generated=True) - - # Refresh receipt to clear stale relationship references after entry deletion - await session.refresh(receipt) - - # Update status - updated = await ReceiptCRUD.update_status( - session, receipt, ReceiptStatus.PENDING_REVIEW - ) - - # Reload with entries - updated = await ReceiptCRUD.get_by_id(session, receipt_id) - - return True, "Receipt submitted for review", updated - - @staticmethod - async def approve_receipt( - session: AsyncSession, - receipt_id: int, - username: str, - ) -> Tuple[bool, str, Optional[Receipt]]: - """ - Approve receipt (PENDING_REVIEW → APPROVED). - Requires valid CUI (fiscal code) for approval. - """ - receipt = await ReceiptCRUD.get_by_id(session, receipt_id) - - if not receipt: - return False, "Receipt not found", None - - if receipt.status != ReceiptStatus.PENDING_REVIEW: - return False, "Receipt is not pending review", None - - # Validate CUI is present (required for Oracle import) - if not receipt.cui: - return False, "Trebuie completat codul fiscal (CUI) pentru aprobare", None - - # Validate accounting entries - if not receipt.entries: - return False, "Receipt has no accounting entries", None - - # Update status - updated = await ReceiptCRUD.update_status( - session, receipt, ReceiptStatus.APPROVED, reviewed_by=username - ) - - return True, "Receipt approved", updated - - @staticmethod - async def unapprove_receipt( - session: AsyncSession, - receipt_id: int, - username: str, - ) -> Tuple[bool, str, Optional[Receipt]]: - """ - Unapprove receipt (APPROVED → PENDING_REVIEW). - Returns receipt to pending review for corrections. - """ - receipt = await ReceiptCRUD.get_by_id(session, receipt_id) - - if not receipt: - return False, "Receipt not found", None - - if receipt.status != ReceiptStatus.APPROVED: - return False, "Receipt is not approved", None - - # Update status back to pending review - updated = await ReceiptCRUD.update_status( - session, receipt, ReceiptStatus.PENDING_REVIEW - ) - - return True, "Receipt returned to pending review", updated - - @staticmethod - async def reject_receipt( - session: AsyncSession, - receipt_id: int, - username: str, - reason: str, - ) -> Tuple[bool, str, Optional[Receipt]]: - """ - Reject receipt (PENDING_REVIEW → REJECTED). - """ - receipt = await ReceiptCRUD.get_by_id(session, receipt_id) - - if not receipt: - return False, "Receipt not found", None - - if receipt.status != ReceiptStatus.PENDING_REVIEW: - return False, "Receipt is not pending review", None - - # Update status - updated = await ReceiptCRUD.update_status( - session, - receipt, - ReceiptStatus.REJECTED, - reviewed_by=username, - rejection_reason=reason, - ) - - return True, "Receipt rejected", updated - - @staticmethod - async def resubmit_receipt( - session: AsyncSession, - receipt_id: int, - username: str, - ) -> Tuple[bool, str, Optional[Receipt]]: - """ - Resubmit rejected receipt after corrections (REJECTED → PENDING_REVIEW). - """ - receipt = await ReceiptCRUD.get_by_id(session, receipt_id) - - if not receipt: - return False, "Receipt not found", None - - if receipt.status != ReceiptStatus.REJECTED: - return False, "Receipt is not rejected", None - - if receipt.created_by != username: - return False, "Only the creator can resubmit", None - - # Re-generate accounting entries - entries = ReceiptService.generate_accounting_entries(receipt) - await AccountingEntryCRUD.delete_all_for_receipt(session, receipt_id) - await AccountingEntryCRUD.create_bulk(session, receipt_id, entries, is_auto_generated=True) - - # Refresh receipt to clear stale relationship references after entry deletion - await session.refresh(receipt) - - # Update status - updated = await ReceiptCRUD.update_status( - session, receipt, ReceiptStatus.PENDING_REVIEW - ) - - # Reload with entries - updated = await ReceiptCRUD.get_by_id(session, receipt_id) - - return True, "Receipt resubmitted for review", updated - - @staticmethod - async def regenerate_entries( - session: AsyncSession, - receipt_id: int, - username: str, - ) -> Tuple[bool, str, List[AccountingEntryCreate]]: - """ - Regenerate accounting entries for a receipt. - """ - receipt = await ReceiptCRUD.get_by_id(session, receipt_id) - - if not receipt: - return False, "Receipt not found", [] - - if receipt.status not in [ReceiptStatus.DRAFT, ReceiptStatus.PENDING_REVIEW]: - return False, "Cannot regenerate entries for this receipt status", [] - - # Generate new entries - entries = ReceiptService.generate_accounting_entries(receipt) - - # Replace existing entries - await AccountingEntryCRUD.delete_all_for_receipt(session, receipt_id) - await AccountingEntryCRUD.create_bulk(session, receipt_id, entries, is_auto_generated=True) - - return True, "Entries regenerated", entries - - @staticmethod - async def update_entries( - session: AsyncSession, - receipt_id: int, - entries: List[AccountingEntryCreate], - username: str, - ) -> Tuple[bool, str, List]: - """ - Update accounting entries for a receipt (accountant action). - """ - receipt = await ReceiptCRUD.get_by_id(session, receipt_id) - - if not receipt: - return False, "Receipt not found", [] - - if receipt.status != ReceiptStatus.PENDING_REVIEW: - return False, "Can only modify entries for receipts pending review", [] - - # Validate entries - is_valid, error = await AccountingEntryCRUD.validate_entries(entries) - if not is_valid: - return False, error, [] - - # Replace entries - updated_entries = await AccountingEntryCRUD.replace_all_for_receipt( - session, receipt_id, entries, username - ) - - return True, "Entries updated", updated_entries - - @staticmethod - async def get_pending_count( - session: AsyncSession, - company_id: Optional[int] = None, - ) -> int: - """Get count of receipts pending review.""" - receipts = await ReceiptCRUD.get_pending_review(session, company_id) - return len(receipts) diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/sse_service.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/sse_service.py deleted file mode 100644 index 34e041c..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/sse_service.py +++ /dev/null @@ -1,197 +0,0 @@ -""" -Server-Sent Events (SSE) service for real-time status updates. - -This module implements an event broadcaster pattern using asyncio.Queue per client. -When receipt status changes occur (CRUD operations), events are pushed to all -connected clients who are listening for that specific batch or all receipts. - -Usage: - # In router endpoint (SSE stream): - async for event in sse_service.subscribe(batch_id=None): - yield event - - # When status changes (from CRUD operations): - await sse_service.broadcast_status_change(receipt_id, status, processing_status, batch_id) -""" - -import asyncio -import json -import logging -from dataclasses import dataclass, asdict -from typing import AsyncGenerator, Optional -from datetime import datetime - -logger = logging.getLogger(__name__) - - -@dataclass -class StatusChangeEvent: - """Event data for receipt status changes.""" - receipt_id: int - status: str - processing_status: Optional[str] = None - batch_id: Optional[str] = None - timestamp: Optional[str] = None - - def __post_init__(self): - if self.timestamp is None: - self.timestamp = datetime.utcnow().isoformat() - - def to_sse_data(self) -> str: - """Format as SSE data line.""" - data = asdict(self) - return f"data: {json.dumps(data)}\n\n" - - -class SSEEventBroadcaster: - """ - Manages SSE client connections and broadcasts events. - - Each client gets its own asyncio.Queue. When an event occurs, - it's pushed to all relevant queues based on batch_id filtering. - """ - - def __init__(self): - # Dict of {client_id: (queue, batch_id_filter)} - # batch_id_filter is None for clients that want all events - self._clients: dict[str, tuple[asyncio.Queue, Optional[str]]] = {} - self._client_counter = 0 - self._lock = asyncio.Lock() - - async def _generate_client_id(self) -> str: - """Generate unique client ID.""" - async with self._lock: - self._client_counter += 1 - return f"client_{self._client_counter}_{datetime.utcnow().timestamp()}" - - async def subscribe( - self, - batch_id: Optional[str] = None, - ) -> AsyncGenerator[str, None]: - """ - Subscribe to SSE events. - - Args: - batch_id: Optional filter - only receive events for this batch. - If None, receives all events. - - Yields: - SSE-formatted event strings (ready to send to client). - """ - client_id = await self._generate_client_id() - queue: asyncio.Queue = asyncio.Queue() - - # Register client - async with self._lock: - self._clients[client_id] = (queue, batch_id) - - logger.info( - f"SSE client {client_id} connected (batch_id filter: {batch_id}). " - f"Total clients: {len(self._clients)}" - ) - - try: - # Send initial retry hint for reconnection - yield "retry: 3000\n\n" - - # Keep connection alive and yield events - while True: - try: - # Wait for events with timeout for keep-alive - event = await asyncio.wait_for(queue.get(), timeout=30.0) - yield event - except asyncio.TimeoutError: - # Send keep-alive comment to prevent connection timeout - yield ": keep-alive\n\n" - except asyncio.CancelledError: - logger.info(f"SSE client {client_id} subscription cancelled") - raise - finally: - # Cleanup: remove client from registry - async with self._lock: - self._clients.pop(client_id, None) - logger.info( - f"SSE client {client_id} disconnected. " - f"Remaining clients: {len(self._clients)}" - ) - - async def broadcast_status_change( - self, - receipt_id: int, - status: str, - processing_status: Optional[str] = None, - batch_id: Optional[str] = None, - ) -> int: - """ - Broadcast a status change event to all relevant clients. - - Args: - receipt_id: The receipt ID that changed. - status: New workflow status (DRAFT, PENDING_REVIEW, etc.). - processing_status: New processing status (pending, processing, completed, failed). - batch_id: The batch ID this receipt belongs to (for filtering). - - Returns: - Number of clients notified. - """ - event = StatusChangeEvent( - receipt_id=receipt_id, - status=status, - processing_status=processing_status, - batch_id=batch_id, - ) - sse_data = event.to_sse_data() - - notified = 0 - async with self._lock: - for client_id, (queue, client_batch_filter) in self._clients.items(): - # Send event if: - # 1. Client has no filter (wants all events), OR - # 2. Client's filter matches the event's batch_id - if client_batch_filter is None or client_batch_filter == batch_id: - try: - queue.put_nowait(sse_data) - notified += 1 - except asyncio.QueueFull: - logger.warning( - f"SSE queue full for client {client_id}, dropping event" - ) - - if notified > 0: - logger.debug( - f"SSE broadcast: receipt_id={receipt_id}, status={status}, " - f"processing_status={processing_status}, notified={notified} clients" - ) - - return notified - - @property - def client_count(self) -> int: - """Get current number of connected clients.""" - return len(self._clients) - - -# Singleton instance for the application -sse_broadcaster = SSEEventBroadcaster() - - -# Convenience functions for external use -async def subscribe(batch_id: Optional[str] = None) -> AsyncGenerator[str, None]: - """Subscribe to SSE status change events.""" - async for event in sse_broadcaster.subscribe(batch_id): - yield event - - -async def broadcast_status_change( - receipt_id: int, - status: str, - processing_status: Optional[str] = None, - batch_id: Optional[str] = None, -) -> int: - """Broadcast a status change event.""" - return await sse_broadcaster.broadcast_status_change( - receipt_id=receipt_id, - status=status, - processing_status=processing_status, - batch_id=batch_id, - ) diff --git a/deploy-package-20260223-151231/backend/modules/data_entry/services/sync_service.py b/deploy-package-20260223-151231/backend/modules/data_entry/services/sync_service.py deleted file mode 100644 index 990404e..0000000 --- a/deploy-package-20260223-151231/backend/modules/data_entry/services/sync_service.py +++ /dev/null @@ -1,451 +0,0 @@ -"""Service for syncing nomenclatures from Oracle to SQLite.""" - -import sys -from pathlib import Path -from typing import Optional, List, Tuple -from datetime import datetime -import logging - -from sqlmodel import select -from sqlalchemy.ext.asyncio import AsyncSession - -# Path setup handled by main.py - this is redundant -# project_root = Path(__file__).parent.parent.parent.parent.parent -# sys.path.insert(0, str(project_root / "shared")) - -from shared.database.oracle_pool import oracle_pool -from backend.modules.data_entry.db.models.nomenclature import SyncedSupplier, LocalSupplier, SyncedCashRegister - -logger = logging.getLogger(__name__) - -# Cache for schema lookups (populated dynamically from Oracle) -# Key format: (server_id, company_id) for multi-server support -_schema_cache: dict[tuple, str] = {} - - -class SyncService: - """Service for syncing nomenclatures from Oracle.""" - - @staticmethod - async def get_schema_for_company(company_id: int, server_id: Optional[str] = None) -> Optional[str]: - """ - Get Oracle schema for company ID from V_NOM_FIRME view. - Results are cached in memory for performance. - - Args: - company_id: The company ID to look up - server_id: Optional Oracle server ID for multi-server mode - """ - # Check cache first - use (server_id, company_id) as key for multi-server support - cache_key = (server_id, company_id) - if cache_key in _schema_cache: - return _schema_cache[cache_key] - - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - cursor.execute(""" - SELECT SCHEMA - FROM CONTAFIN_ORACLE.V_NOM_FIRME - WHERE ID_FIRMA = :company_id - """, {'company_id': company_id}) - result = cursor.fetchone() - - if result: - schema = result[0] - _schema_cache[cache_key] = schema - logger.info(f"Resolved schema for company {company_id} on server {server_id}: {schema}") - return schema - else: - logger.warning(f"No schema found for company {company_id} on server {server_id}") - return None - - except Exception as e: - logger.error(f"Error fetching schema for company {company_id} on server {server_id}: {e}") - return None - - @staticmethod - async def sync_suppliers(session: AsyncSession, company_id: int, server_id: Optional[str] = None) -> Tuple[int, int]: - """ - Sync suppliers (furnizori, id_tip_part=17) from Oracle to SQLite. - Uses CORESP_TIP_PART joined with VNOM_PARTENERI view. - Returns (synced_count, error_count). - - Args: - session: SQLAlchemy async session for SQLite - company_id: The company ID to sync suppliers for - server_id: Optional Oracle server ID for multi-server mode - """ - schema = await SyncService.get_schema_for_company(company_id, server_id) - if not schema: - logger.warning(f"No schema mapping for company {company_id} on server {server_id}") - return 0, 0 - - synced = 0 - errors = 0 - - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Fetch active suppliers from Oracle - # id_tip_part = 17 means "furnizori" (suppliers) - # Using CORESP_TIP_PART to filter by partner type - cursor.execute(f""" - SELECT B.ID_PART, B.DENUMIRE, B.COD_FISCAL, B.ADRESA - FROM {schema}.CORESP_TIP_PART A - INNER JOIN {schema}.VNOM_PARTENERI B ON A.ID_PART = B.ID_PART - WHERE A.ID_TIP_PART = 17 - AND (B.INACTIV = 0 OR B.INACTIV IS NULL) - AND B.ID_PART IS NOT NULL - ORDER BY B.DENUMIRE - """) - rows = cursor.fetchall() - - for row in rows: - try: - oracle_id, name, fiscal_code, address = row - - # Check if already exists - stmt = select(SyncedSupplier).where( - SyncedSupplier.oracle_id == oracle_id, - SyncedSupplier.company_id == company_id - ) - result = await session.execute(stmt) - existing = result.scalar_one_or_none() - - if existing: - # Update existing record - existing.name = name or "" - existing.fiscal_code = fiscal_code - existing.address = address - existing.synced_at = datetime.utcnow() - logger.debug(f"Updated supplier {oracle_id}: {name}") - else: - # Create new record - supplier = SyncedSupplier( - oracle_id=oracle_id, - company_id=company_id, - name=name or "", - fiscal_code=fiscal_code, - address=address, - ) - session.add(supplier) - logger.debug(f"Created supplier {oracle_id}: {name}") - - synced += 1 - - except Exception as e: - logger.error(f"Error processing supplier row {row}: {e}") - errors += 1 - - # Commit all changes - await session.commit() - logger.info(f"Synced {synced} suppliers for company {company_id}, {errors} errors") - - except Exception as e: - logger.error(f"Error syncing suppliers for company {company_id}: {e}") - errors += 1 - await session.rollback() - - return synced, errors - - @staticmethod - async def sync_cash_registers(session: AsyncSession, company_id: int, server_id: Optional[str] = None) -> Tuple[int, int]: - """ - Sync cash registers and bank accounts from Oracle to SQLite. - Returns (synced_count, error_count). - - Uses CORESP_TIP_PART with: - - id_tip_part = 22: CASA LEI - - id_tip_part = 23: CASA VALUTA - - id_tip_part = 24: BANCA LEI - - id_tip_part = 25: BANCA VALUTA - - Args: - session: SQLAlchemy async session for SQLite - company_id: The company ID to sync cash registers for - server_id: Optional Oracle server ID for multi-server mode - """ - schema = await SyncService.get_schema_for_company(company_id, server_id) - if not schema: - logger.warning(f"No schema mapping for company {company_id} on server {server_id}") - return 0, 0 - - synced = 0 - errors = 0 - - # Partner types mapping - # 22=CASA LEI, 23=CASA VALUTA -> cash - # 24=BANCA LEI, 25=BANCA VALUTA -> bank - partner_types = [22, 23, 24, 25] - - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Fetch cash/bank partners from CORESP_TIP_PART - cursor.execute(f""" - SELECT B.ID_PART, B.DENUMIRE, A.ID_TIP_PART - FROM {schema}.CORESP_TIP_PART A - INNER JOIN {schema}.VNOM_PARTENERI B ON A.ID_PART = B.ID_PART - WHERE A.ID_TIP_PART IN (22, 23, 24, 25) - AND (B.INACTIV = 0 OR B.INACTIV IS NULL) - AND B.ID_PART IS NOT NULL - ORDER BY A.ID_TIP_PART, B.DENUMIRE - """) - rows = cursor.fetchall() - - # Type mapping: 22=CASA LEI, 23=CASA VALUTA -> cash; 24=BANCA LEI, 25=BANCA VALUTA -> bank - type_mapping = { - 22: ("cash", "CASA_LEI"), - 23: ("cash", "CASA_VALUTA"), - 24: ("bank", "BANCA_LEI"), - 25: ("bank", "BANCA_VALUTA"), - } - - for row in rows: - try: - oracle_id, name, tip_part_id = row - - # Determine type based on partner type - register_type, account_code = type_mapping.get(tip_part_id, ("cash", "UNKNOWN")) - - # Check if already exists - stmt = select(SyncedCashRegister).where( - SyncedCashRegister.oracle_id == oracle_id, - SyncedCashRegister.company_id == company_id - ) - result = await session.execute(stmt) - existing = result.scalar_one_or_none() - - if existing: - # Update existing record - existing.name = name or "" - existing.account_code = account_code - existing.register_type = register_type - existing.synced_at = datetime.utcnow() - logger.debug(f"Updated cash register {oracle_id}: {name}") - else: - # Create new record - cash_register = SyncedCashRegister( - oracle_id=oracle_id, - company_id=company_id, - name=name or "", - account_code=account_code, - register_type=register_type, - ) - session.add(cash_register) - logger.debug(f"Created cash register {oracle_id}: {name}") - - synced += 1 - - except Exception as e: - logger.error(f"Error processing cash register row {row}: {e}") - errors += 1 - - # Commit all changes - await session.commit() - logger.info(f"Synced {synced} cash registers for company {company_id}, {errors} errors") - - except Exception as e: - logger.error(f"Error syncing cash registers for company {company_id}: {e}") - errors += 1 - await session.rollback() - - return synced, errors - - @staticmethod - def _get_fiscal_code_variants(fiscal_code: str) -> list: - """ - Generate all possible variants of a Romanian fiscal code (CUI). - Database may store: "22891860", "RO22891860", "RO 22891860" - OCR may extract: "RO22891860" or "22891860" - """ - import re - # Extract just the digits - digits = re.sub(r'[^0-9]', '', fiscal_code) - if not digits: - return [fiscal_code] - - # Generate all variants - variants = [ - digits, # Just digits: 22891860 - f"RO{digits}", # With RO prefix: RO22891860 - f"RO {digits}", # With RO prefix and space: RO 22891860 - ] - # Also add the original if different - if fiscal_code not in variants: - variants.append(fiscal_code) - - return variants - - @staticmethod - async def search_supplier( - session: AsyncSession, - company_id: int, - fiscal_code: Optional[str] = None, - name: Optional[str] = None - ) -> Tuple[bool, Optional[dict], str]: - """ - Search for supplier in SQLite first, then Oracle if not found. - Returns (found, supplier_data, source). - Source can be: 'synced', 'local', 'not_found' - """ - # 1. Search in synced suppliers - if fiscal_code: - # Search all variants of the fiscal code (with/without RO, with/without space) - variants = SyncService._get_fiscal_code_variants(fiscal_code) - stmt = select(SyncedSupplier).where( - SyncedSupplier.company_id == company_id, - SyncedSupplier.fiscal_code.in_(variants) - ) - elif name: - stmt = select(SyncedSupplier).where( - SyncedSupplier.company_id == company_id, - SyncedSupplier.name.ilike(f"%{name}%") - ) - else: - return False, None, "no_query" - - result = await session.execute(stmt) - supplier = result.scalar_one_or_none() - - if supplier: - # Return only text data - no IDs needed for autocomplete - return True, { - "name": supplier.name, - "fiscal_code": supplier.fiscal_code, - "address": supplier.address, - }, "synced" - - # 2. Search in local suppliers - if fiscal_code: - # Search all variants of the fiscal code (with/without RO, with/without space) - variants = SyncService._get_fiscal_code_variants(fiscal_code) - stmt = select(LocalSupplier).where( - LocalSupplier.company_id == company_id, - LocalSupplier.fiscal_code.in_(variants) - ) - elif name: - stmt = select(LocalSupplier).where( - LocalSupplier.company_id == company_id, - LocalSupplier.name.ilike(f"%{name}%") - ) - - result = await session.execute(stmt) - local = result.scalar_one_or_none() - - if local: - # Return only text data - no IDs needed for autocomplete - return True, { - "name": local.name, - "fiscal_code": local.fiscal_code, - "address": local.address, - }, "local" - - # 3. Try live Oracle search (optional fallback for unsynced data) - # This is a fallback - ideally sync should be up to date - # TODO: Implement live Oracle search if needed - - return False, None, "not_found" - - @staticmethod - async def create_local_supplier( - session: AsyncSession, - company_id: int, - name: str, - fiscal_code: Optional[str], - address: Optional[str], - created_by: str - ) -> LocalSupplier: - """Create a local supplier entry from OCR data.""" - supplier = LocalSupplier( - company_id=company_id, - name=name, - fiscal_code=fiscal_code, - address=address, - created_by=created_by, - ) - session.add(supplier) - await session.commit() - await session.refresh(supplier) - logger.info(f"Created local supplier: {name} (CUI: {fiscal_code})") - return supplier - - @staticmethod - async def get_all_suppliers( - session: AsyncSession, - company_id: int, - search: Optional[str] = None - ) -> List[dict]: - """ - Get all suppliers (synced + local) for a company. - Used for dropdown/autocomplete in UI. - """ - suppliers = [] - - # Get synced suppliers - stmt = select(SyncedSupplier).where(SyncedSupplier.company_id == company_id) - if search: - stmt = stmt.where( - (SyncedSupplier.name.ilike(f"%{search}%")) | - (SyncedSupplier.fiscal_code.ilike(f"%{search}%")) - ) - stmt = stmt.limit(50) # Limit results for performance - - result = await session.execute(stmt) - synced = result.scalars().all() - - for s in synced: - suppliers.append({ - "id": s.id, - "oracle_id": s.oracle_id, - "name": s.name, - "fiscal_code": s.fiscal_code, - "source": "synced" - }) - - # Get local suppliers - stmt = select(LocalSupplier).where(LocalSupplier.company_id == company_id) - if search: - stmt = stmt.where( - (LocalSupplier.name.ilike(f"%{search}%")) | - (LocalSupplier.fiscal_code.ilike(f"%{search}%")) - ) - stmt = stmt.limit(50) - - result = await session.execute(stmt) - local = result.scalars().all() - - for l in local: - suppliers.append({ - "id": l.id, - "name": l.name, - "fiscal_code": l.fiscal_code, - "source": "local" - }) - - return suppliers - - @staticmethod - async def get_all_cash_registers( - session: AsyncSession, - company_id: int - ) -> List[dict]: - """ - Get all cash registers for a company. - Used for dropdown in UI. - """ - stmt = select(SyncedCashRegister).where(SyncedCashRegister.company_id == company_id) - result = await session.execute(stmt) - registers = result.scalars().all() - - return [ - { - "id": r.id, - "oracle_id": r.oracle_id, - "name": r.name, - "account_code": r.account_code, - "register_type": r.register_type - } - for r in registers - ] diff --git a/deploy-package-20260223-151231/backend/modules/reports/__init__.py b/deploy-package-20260223-151231/backend/modules/reports/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/modules/reports/cache/__init__.py b/deploy-package-20260223-151231/backend/modules/reports/cache/__init__.py deleted file mode 100644 index 11f50cd..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/cache/__init__.py +++ /dev/null @@ -1,66 +0,0 @@ -""" -Cache module for ROA2WEB - -Provides hybrid two-tier caching (Memory L1 + SQLite L2) -with performance tracking and event-based invalidation. - -Usage: - # Initialize cache at app startup - from app.cache import init_cache - from app.cache.config import CacheConfig - - config = CacheConfig.from_env() - await init_cache(config) - - # Use @cached decorator in services - from app.cache.decorators import cached - - @cached(cache_type='dashboard_summary', key_params=['company', 'username']) - async def get_complete_summary(company: str, username: str): - # ... Oracle query logic ... - - # Get cache manager for manual operations - from app.cache import get_cache - - cache = get_cache() - await cache.invalidate(company_id=123) -""" - -from .config import CacheConfig -from .cache_manager import ( - init_cache, - get_cache, - close_cache, - CacheManager -) -from .decorators import cached -from .event_monitor import ( - init_event_monitor, - get_event_monitor, - toggle_event_monitor, - preload_all_schema_mappings -) -from .benchmarks import run_baseline_benchmarks - -__all__ = [ - # Configuration - 'CacheConfig', - - # Cache Manager - 'init_cache', - 'get_cache', - 'close_cache', - 'CacheManager', - - # Decorators - 'cached', - - # Event Monitor - 'init_event_monitor', - 'get_event_monitor', - 'toggle_event_monitor', - 'preload_all_schema_mappings', - - # Benchmarks - 'run_baseline_benchmarks', -] diff --git a/deploy-package-20260223-151231/backend/modules/reports/cache/benchmarks.py b/deploy-package-20260223-151231/backend/modules/reports/cache/benchmarks.py deleted file mode 100644 index 83a64ee..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/cache/benchmarks.py +++ /dev/null @@ -1,269 +0,0 @@ -""" -Baseline performance benchmarking - -Runs at startup to establish baseline Oracle query times -Used for calculating "time saved" by cache -""" -import time -import logging -from typing import Dict - -logger = logging.getLogger(__name__) - - -async def run_baseline_benchmarks() -> Dict[str, float]: - """ - Run baseline benchmarks for Oracle queries (without cache) - - Measures typical query times to establish performance baselines - These are used to calculate time saved when cache hits occur - - NOTE: This implementation provides a framework. Actual benchmark - implementations need access to Oracle services and sample data. - - Returns: - Dictionary mapping cache_type to average query time (ms) - """ - from .cache_manager import get_cache - - cache = get_cache() - if not cache: - logger.warning("Cache not initialized - skipping benchmarks") - return {} - - logger.info("Starting baseline performance benchmarks...") - benchmarks = {} - - try: - # Benchmark: Schema lookup - logger.info("Benchmarking: schema lookup") - schema_times = await _benchmark_schema_lookup() - if schema_times: - avg_schema = sum(schema_times) / len(schema_times) - benchmarks['schema'] = avg_schema - await cache.sqlite.set_benchmark('schema', avg_schema, len(schema_times)) - logger.info(f" Schema lookup: {avg_schema:.2f}ms (avg of {len(schema_times)} samples)") - - # Benchmark: Companies list - logger.info("Benchmarking: companies list") - companies_time = await _benchmark_companies_list() - if companies_time: - benchmarks['companies'] = companies_time - await cache.sqlite.set_benchmark('companies', companies_time, 1) - logger.info(f" Companies list: {companies_time:.2f}ms") - - # Benchmark: Dashboard summary - logger.info("Benchmarking: dashboard summary") - dashboard_time = await _benchmark_dashboard_summary() - if dashboard_time: - benchmarks['dashboard_summary'] = dashboard_time - await cache.sqlite.set_benchmark('dashboard_summary', dashboard_time, 1) - logger.info(f" Dashboard summary: {dashboard_time:.2f}ms") - - # Benchmark: Dashboard trends - logger.info("Benchmarking: dashboard trends") - trends_time = await _benchmark_dashboard_trends() - if trends_time: - benchmarks['dashboard_trends'] = trends_time - await cache.sqlite.set_benchmark('dashboard_trends', trends_time, 1) - logger.info(f" Dashboard trends: {trends_time:.2f}ms") - - # Benchmark: Invoices - logger.info("Benchmarking: invoices") - invoices_time = await _benchmark_invoices() - if invoices_time: - benchmarks['invoices'] = invoices_time - await cache.sqlite.set_benchmark('invoices', invoices_time, 1) - logger.info(f" Invoices: {invoices_time:.2f}ms") - - # Benchmark: Treasury - logger.info("Benchmarking: treasury") - treasury_time = await _benchmark_treasury() - if treasury_time: - benchmarks['treasury'] = treasury_time - await cache.sqlite.set_benchmark('treasury', treasury_time, 1) - logger.info(f" Treasury: {treasury_time:.2f}ms") - - logger.info(f"Baseline benchmarks completed: {len(benchmarks)} types measured") - return benchmarks - - except Exception as e: - logger.error(f"Benchmark error: {e}", exc_info=True) - return benchmarks - - -async def _benchmark_schema_lookup() -> list: - """ - Benchmark schema lookup queries - - Returns: - List of query times (ms) for multiple samples - """ - try: - # Import here to avoid circular dependency - import sys - import os - sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../..'))) - from shared.database.oracle_pool import oracle_pool - - # Get sample company IDs to test - sample_companies = await _get_sample_company_ids(limit=10) - if not sample_companies: - logger.warning("No sample companies found for schema benchmark") - return [] - - times = [] - for company_id in sample_companies: - start = time.time() - async with oracle_pool.get_connection() as connection: - with connection.cursor() as cursor: - cursor.execute(""" - SELECT schema - FROM CONTAFIN_ORACLE.v_nom_firme - WHERE id_firma = :id - """, {'id': company_id}) - cursor.fetchone() - elapsed_ms = (time.time() - start) * 1000 - times.append(elapsed_ms) - - return times - - except Exception as e: - logger.error(f"Schema benchmark error: {e}") - return [] - - -async def _benchmark_companies_list() -> float: - """ - Benchmark companies list query - - Returns: - Query time (ms) - """ - try: - import sys - import os - sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../..'))) - from shared.database.oracle_pool import oracle_pool - - # Get sample username - sample_user = await _get_sample_username() - if not sample_user: - return 0 - - start = time.time() - async with oracle_pool.get_connection() as connection: - with connection.cursor() as cursor: - cursor.execute(""" - SELECT nf.id_firma, nf.denumire, nf.cui, nf.schema - FROM CONTAFIN_ORACLE.v_nom_firme nf - JOIN CONTAFIN_ORACLE.vdef_util_firme uf ON nf.id_firma = uf.id_firma - WHERE uf.nume_utilizator = :username - ORDER BY nf.denumire - """, {'username': sample_user}) - cursor.fetchall() - elapsed_ms = (time.time() - start) * 1000 - return elapsed_ms - - except Exception as e: - logger.error(f"Companies benchmark error: {e}") - return 0 - - -async def _benchmark_dashboard_summary() -> float: - """ - Benchmark dashboard summary query - - Returns: - Query time (ms) - """ - try: - # This requires access to DashboardService - # For now, return estimated value - logger.warning("Dashboard summary benchmark not implemented - using estimate") - return 250.0 # Estimated 250ms based on plan - - except Exception as e: - logger.error(f"Dashboard benchmark error: {e}") - return 0 - - -async def _benchmark_dashboard_trends() -> float: - """Benchmark dashboard trends query""" - try: - logger.warning("Dashboard trends benchmark not implemented - using estimate") - return 400.0 # Estimated 400ms - - except Exception as e: - logger.error(f"Trends benchmark error: {e}") - return 0 - - -async def _benchmark_invoices() -> float: - """Benchmark invoices query""" - try: - logger.warning("Invoices benchmark not implemented - using estimate") - return 180.0 # Estimated 180ms - - except Exception as e: - logger.error(f"Invoices benchmark error: {e}") - return 0 - - -async def _benchmark_treasury() -> float: - """Benchmark treasury query""" - try: - logger.warning("Treasury benchmark not implemented - using estimate") - return 250.0 # Estimated 250ms - - except Exception as e: - logger.error(f"Treasury benchmark error: {e}") - return 0 - - -# Helper functions - -async def _get_sample_company_ids(limit: int = 10) -> list: - """Get sample company IDs for testing""" - try: - import sys - import os - sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../..'))) - from shared.database.oracle_pool import oracle_pool - - async with oracle_pool.get_connection() as connection: - with connection.cursor() as cursor: - cursor.execute(f""" - SELECT id_firma - FROM CONTAFIN_ORACLE.v_nom_firme - WHERE ROWNUM <= {limit} - """) - results = cursor.fetchall() - return [row[0] for row in results] - - except Exception as e: - logger.error(f"Get sample companies error: {e}") - return [] - - -async def _get_sample_username() -> str: - """Get sample username for testing""" - try: - import sys - import os - sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../..'))) - from shared.database.oracle_pool import oracle_pool - - async with oracle_pool.get_connection() as connection: - with connection.cursor() as cursor: - cursor.execute(""" - SELECT nume_utilizator - FROM CONTAFIN_ORACLE.vdef_util_firme - WHERE ROWNUM <= 1 - """) - result = cursor.fetchone() - return result[0] if result else "admin" - - except Exception as e: - logger.error(f"Get sample username error: {e}") - return "admin" diff --git a/deploy-package-20260223-151231/backend/modules/reports/cache/cache_manager.py b/deploy-package-20260223-151231/backend/modules/reports/cache/cache_manager.py deleted file mode 100644 index a181a72..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/cache/cache_manager.py +++ /dev/null @@ -1,339 +0,0 @@ -""" -Cache Manager - Orchestrator for hybrid L1 + L2 cache -""" -import logging -import asyncio -from typing import Any, Optional -from .config import CacheConfig -from .memory_cache import MemoryCache -from .sqlite_cache import SQLiteCache - -logger = logging.getLogger(__name__) - - -class CacheManager: - """ - Hybrid cache manager (Memory L1 + SQLite L2) - - Features: - - Two-tier caching: fast memory + persistent SQLite - - Automatic TTL management per cache type - - Performance tracking and benchmarking - - Per-user cache enable/disable - - Global cache toggle - """ - - def __init__(self, config: CacheConfig): - """ - Initialize cache manager - - Args: - config: Cache configuration - """ - self.config = config - self.memory = MemoryCache(max_size=config.memory_max_size) - self.sqlite = SQLiteCache(db_path=config.sqlite_path) - self._cleanup_task: Optional[asyncio.Task] = None - self._initialized = False - self._last_cache_source: Optional[str] = None # Track last cache source (L1/L2) - - async def init(self): - """Initialize cache system""" - if self._initialized: - logger.warning("Cache already initialized") - return - - # Initialize SQLite database schema - await self.sqlite.init_db() - - # Start cleanup task - if self.config.enabled: - self._cleanup_task = asyncio.create_task(self._cleanup_loop()) - - self._initialized = True - logger.info(f"Cache initialized: type={self.config.cache_type}, enabled={self.config.enabled}") - - async def close(self): - """Close cache and cleanup""" - if self._cleanup_task: - self._cleanup_task.cancel() - try: - await self._cleanup_task - except asyncio.CancelledError: - pass - - # Close SQLite connection manager - if hasattr(self.sqlite, 'close'): - await self.sqlite.close() - - logger.info("Cache closed") - - async def get(self, key: str, cache_type: str) -> Optional[Any]: - """ - Get value from cache (L1 → L2) - - Args: - key: Cache key - cache_type: Type of cache entry - - Returns: - Cached value or None if not found - """ - if not self.config.enabled: - self._last_cache_source = None - return None - - # Try L1 (Memory) first - value = await self.memory.get(key) - if value is not None: - self._last_cache_source = "L1" - logger.debug(f"Cache HIT L1 (memory): {key}") - return value - - # Try L2 (SQLite) - value = await self.sqlite.get(key) - if value is not None: - self._last_cache_source = "L2" - logger.debug(f"Cache HIT L2 (sqlite): {key}") - - # Populate L1 for next time - ttl = self.config.get_ttl_for_type(cache_type) - await self.memory.set(key, value, ttl) - - return value - - # Cache MISS - self._last_cache_source = None - logger.debug(f"Cache MISS: {key}") - return None - - def get_last_cache_source(self) -> Optional[str]: - """ - Get source of last cache hit (L1/L2/None) - - Returns: - "L1" if last hit was from memory cache - "L2" if last hit was from SQLite cache - None if last call was a cache miss or cache disabled - """ - return self._last_cache_source - - async def set(self, key: str, value: Any, cache_type: str, company_id: Optional[int] = None, - ttl: Optional[int] = None): - """ - Set value in cache (both L1 and L2) - - Args: - key: Cache key - value: Value to cache - cache_type: Type of cache entry - company_id: Company ID (for company-specific caches) - ttl: Time to live (uses default for cache_type if not provided) - """ - if not self.config.enabled: - return - - if ttl is None: - ttl = self.config.get_ttl_for_type(cache_type) - - # Store in both L1 and L2 - await self.memory.set(key, value, ttl) - await self.sqlite.set(key, value, cache_type, company_id, ttl) - - logger.debug(f"Cache SET (L1 + L2): {key} (TTL: {ttl}s)") - - async def delete(self, key: str): - """Delete entry from both L1 and L2""" - await self.memory.delete(key) - await self.sqlite.delete(key) - logger.debug(f"Cache deleted: {key}") - - async def invalidate(self, company_id: Optional[int] = None, cache_type: Optional[str] = None): - """ - Invalidate cache entries - - Args: - company_id: If provided, clear only this company's cache - cache_type: If provided, clear only this cache type - """ - if company_id is not None and cache_type is not None: - # Clear specific company + type - from .keys import generate_key_pattern - pattern = generate_key_pattern(cache_type, company_id) - await self.memory.clear_by_pattern(pattern) - # SQLite: clear by company + type (needs query) - # For now, just clear by company - await self.sqlite.clear_by_company(company_id) - logger.info(f"Cache invalidated: company={company_id}, type={cache_type}") - - elif company_id is not None: - # Clear all for company - from .keys import generate_key_pattern - # Clear all types for this company (pattern match all) - # Memory: need to iterate and match company_id in key - # For simplicity, clear by pattern prefix - await self.memory.clear() # TODO: improve pattern matching - await self.sqlite.clear_by_company(company_id) - logger.info(f"Cache invalidated: company={company_id}") - - elif cache_type is not None: - # Clear all for type - from .keys import generate_key_pattern - pattern = generate_key_pattern(cache_type) - await self.memory.clear_by_pattern(pattern) - await self.sqlite.clear_by_type(cache_type) - logger.info(f"Cache invalidated: type={cache_type}") - - else: - # Clear everything - await self.memory.clear() - await self.sqlite.clear() - logger.info("Cache invalidated: ALL") - - async def is_enabled_for_user(self, username: Optional[str]) -> bool: - """ - Check if cache is enabled for specific user - - Args: - username: Username to check - - Returns: - True if cache enabled for user, False otherwise - """ - if not self.config.enabled: - return False - - if username is None: - return True - - # Check per-user setting - return await self.sqlite.get_user_cache_enabled(username) - - async def set_user_cache_enabled(self, username: str, enabled: bool): - """Set user cache enabled/disabled""" - await self.sqlite.set_user_cache_enabled(username, enabled) - logger.info(f"User cache setting: {username} -> {enabled}") - - # Benchmarking - - async def get_benchmark(self, cache_type: str) -> Optional[float]: - """Get average benchmark time for cache type""" - return await self.sqlite.get_benchmark(cache_type) - - async def update_benchmark(self, cache_type: str, new_time_ms: float): - """ - Update benchmark with new measurement (exponential moving average) - - Args: - cache_type: Type of cache - new_time_ms: New measured time in milliseconds - """ - current_avg = await self.sqlite.get_benchmark(cache_type) - - if current_avg is None: - # First measurement - new_avg = new_time_ms - sample_count = 1 - else: - # Exponential moving average (alpha = 0.1) - new_avg = 0.9 * current_avg + 0.1 * new_time_ms - # Get current sample count (TODO: retrieve from DB) - sample_count = 1 # Simplified for now - - await self.sqlite.set_benchmark(cache_type, new_avg, sample_count) - logger.debug(f"Benchmark updated: {cache_type} -> {new_avg:.2f}ms") - - # Performance Tracking - - async def track_performance(self, cache_type: str, is_hit: bool, actual_time_ms: float, - time_saved_ms: Optional[float] = None, - estimated_oracle_time_ms: Optional[float] = None, - company_id: Optional[int] = None, - username: Optional[str] = None): - """ - Track performance metric - - Args: - cache_type: Type of cache - is_hit: True if cache hit, False if cache miss - actual_time_ms: Actual response time - time_saved_ms: Time saved by cache (for hits) - estimated_oracle_time_ms: Estimated Oracle time (for hits) - company_id: Company ID - username: Username - """ - if not self.config.track_performance: - return - - await self.sqlite.log_performance( - cache_type=cache_type, - company_id=company_id, - cache_hit=is_hit, - response_time_ms=actual_time_ms, - estimated_oracle_time_ms=estimated_oracle_time_ms, - time_saved_ms=time_saved_ms, - username=username - ) - - # Statistics - - async def get_stats(self) -> dict: - """Get comprehensive cache statistics""" - memory_stats = self.memory.get_stats() - sqlite_stats = await self.sqlite.get_stats() - - return { - 'enabled': self.config.enabled, - 'cache_type': self.config.cache_type, - 'memory': memory_stats, - 'sqlite': sqlite_stats, - } - - # Cleanup - - async def _cleanup_loop(self): - """Background task to cleanup expired entries""" - while True: - try: - await asyncio.sleep(self.config.cleanup_interval) - await self._cleanup_expired() - except asyncio.CancelledError: - break - except Exception as e: - logger.error(f"Cleanup error: {e}", exc_info=True) - - async def _cleanup_expired(self): - """Remove expired entries from both caches""" - logger.info("Running cache cleanup...") - await self.memory.cleanup_expired() - await self.sqlite.cleanup_expired() - logger.info("Cache cleanup completed") - - -# Global cache manager instance -_cache_manager: Optional[CacheManager] = None - - -async def init_cache(config: CacheConfig): - """Initialize global cache manager""" - global _cache_manager - if _cache_manager is not None: - logger.warning("Cache already initialized") - return - - _cache_manager = CacheManager(config) - await _cache_manager.init() - logger.info("Global cache manager initialized") - - -def get_cache() -> Optional[CacheManager]: - """Get global cache manager instance""" - return _cache_manager - - -async def close_cache(): - """Close global cache manager""" - global _cache_manager - if _cache_manager is not None: - await _cache_manager.close() - _cache_manager = None diff --git a/deploy-package-20260223-151231/backend/modules/reports/cache/config.py b/deploy-package-20260223-151231/backend/modules/reports/cache/config.py deleted file mode 100644 index 0ba07c9..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/cache/config.py +++ /dev/null @@ -1,89 +0,0 @@ -""" -Cache configuration from environment variables -""" -import os -from dataclasses import dataclass -from typing import Optional - - -@dataclass -class CacheConfig: - """Cache configuration loaded from environment variables""" - - # Core Settings - enabled: bool - cache_type: str # 'hybrid', 'memory', 'sqlite', 'disabled' - sqlite_path: str - memory_max_size: int - default_ttl: int - - # TTL per Cache Type (seconds) - ttl_schema: int - ttl_companies: int - ttl_dashboard_summary: int - ttl_dashboard_trends: int - ttl_invoices: int - ttl_invoices_summary: int - ttl_treasury: int - ttl_trial_balance: int - ttl_calendar_periods: int - - # Maintenance - cleanup_interval: int - - # Event-Based Invalidation - auto_invalidate_enabled: bool - check_interval: int - - # Performance Tracking - track_performance: bool - benchmark_on_startup: bool - - @classmethod - def from_env(cls) -> 'CacheConfig': - """Load configuration from environment variables""" - return cls( - # Core Settings - enabled=os.getenv('CACHE_ENABLED', 'True').lower() == 'true', - cache_type=os.getenv('CACHE_TYPE', 'hybrid'), - sqlite_path=os.getenv('CACHE_SQLITE_PATH', './data/cache/roa2web_cache.db'), - memory_max_size=int(os.getenv('CACHE_MEMORY_MAX_SIZE', '1000')), - default_ttl=int(os.getenv('CACHE_DEFAULT_TTL', '900')), - - # TTL per Cache Type - ttl_schema=int(os.getenv('CACHE_TTL_SCHEMA', '86400')), - ttl_companies=int(os.getenv('CACHE_TTL_COMPANIES', '1800')), - ttl_dashboard_summary=int(os.getenv('CACHE_TTL_DASHBOARD_SUMMARY', '1800')), - ttl_dashboard_trends=int(os.getenv('CACHE_TTL_DASHBOARD_TRENDS', '1800')), - ttl_invoices=int(os.getenv('CACHE_TTL_INVOICES', '600')), - ttl_invoices_summary=int(os.getenv('CACHE_TTL_INVOICES_SUMMARY', '900')), - ttl_treasury=int(os.getenv('CACHE_TTL_TREASURY', '600')), - ttl_trial_balance=int(os.getenv('CACHE_TTL_TRIAL_BALANCE', '600')), - ttl_calendar_periods=int(os.getenv('CACHE_TTL_CALENDAR_PERIODS', '3600')), - - # Maintenance - cleanup_interval=int(os.getenv('CACHE_CLEANUP_INTERVAL', '3600')), - - # Event-Based Invalidation - auto_invalidate_enabled=os.getenv('CACHE_AUTO_INVALIDATE', 'False').lower() == 'true', - check_interval=int(os.getenv('CACHE_CHECK_INTERVAL', '300')), - - # Performance Tracking - track_performance=os.getenv('CACHE_TRACK_PERFORMANCE', 'True').lower() == 'true', - benchmark_on_startup=os.getenv('CACHE_BENCHMARK_ON_STARTUP', 'True').lower() == 'true', - ) - - def get_ttl_for_type(self, cache_type: str) -> int: - """Get TTL for specific cache type""" - ttl_map = { - 'schema': self.ttl_schema, - 'companies': self.ttl_companies, - 'dashboard_summary': self.ttl_dashboard_summary, - 'dashboard_trends': self.ttl_dashboard_trends, - 'invoices': self.ttl_invoices, - 'invoices_summary': self.ttl_invoices_summary, - 'treasury': self.ttl_treasury, - 'trial_balance': self.ttl_trial_balance, - 'calendar_periods': self.ttl_calendar_periods, - } - return ttl_map.get(cache_type, self.default_ttl) diff --git a/deploy-package-20260223-151231/backend/modules/reports/cache/decorators.py b/deploy-package-20260223-151231/backend/modules/reports/cache/decorators.py deleted file mode 100644 index 24e3721..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/cache/decorators.py +++ /dev/null @@ -1,285 +0,0 @@ -""" -Cache decorators for service methods -""" -import time -import logging -import sqlite3 -import asyncio -from functools import wraps -from typing import Callable, Optional, List - -from .cache_manager import get_cache -from .keys import generate_cache_key - -logger = logging.getLogger(__name__) - -# Retry configuration for SQLite locked database errors -SQLITE_MAX_RETRIES = 3 -SQLITE_RETRY_BASE_DELAY = 0.1 # 100ms base delay, exponential backoff - - -def cached(cache_type: str, ttl: Optional[int] = None, key_params: Optional[List[str]] = None): - """ - Decorator for caching service method results with performance tracking - - Usage: - @cached(cache_type='dashboard_summary', key_params=['company', 'username']) - async def get_complete_summary(company: str, username: str): - # ... Oracle query logic ... - - Features: - - Automatic cache key generation from function parameters - - Performance timing (cache hit vs miss) - - Benchmark tracking for time saved calculation - - Per-user cache enable/disable - - Global cache toggle - - Transparent - zero changes to function logic - - Args: - cache_type: Type of cache (used for TTL lookup and stats) - ttl: Optional custom TTL (overrides config default) - key_params: List of parameter names to include in cache key - - Returns: - Decorated async function - """ - def decorator(func: Callable): - @wraps(func) - async def wrapper(*args, **kwargs): - start_time = time.time() - cache = get_cache() - - # Extract username for per-user settings - username = _extract_username(args, kwargs, key_params) - - # Check if cache is enabled (global + per-user) - cache_enabled = await cache.is_enabled_for_user(username) if cache else False - - if not cache or not cache_enabled: - # Cache disabled - execute directly - result = await func(*args, **kwargs) - elapsed_ms = (time.time() - start_time) * 1000 - - # Set metadata in request.state if available (for API responses) - if 'request' in kwargs and hasattr(kwargs['request'], 'state'): - kwargs['request'].state.cache_hit = False - kwargs['request'].state.response_time_ms = elapsed_ms - kwargs['request'].state.cache_source = None - - if cache and cache.config.track_performance: - await cache.track_performance( - cache_type=cache_type, - is_hit=False, - actual_time_ms=elapsed_ms, - username=username - ) - - return result - - # Generate cache key from function parameters - cache_key = generate_cache_key(cache_type, key_params, args, kwargs) - - # Try to get from cache with retry logic for SQLite locks - cached_value = None - for attempt in range(SQLITE_MAX_RETRIES): - try: - cached_value = await cache.get(cache_key, cache_type) - break - except sqlite3.OperationalError as e: - if "database is locked" in str(e) and attempt < SQLITE_MAX_RETRIES - 1: - delay = SQLITE_RETRY_BASE_DELAY * (attempt + 1) - logger.warning(f"SQLite locked on cache.get, retry {attempt + 1}/{SQLITE_MAX_RETRIES} after {delay}s") - await asyncio.sleep(delay) - else: - logger.error(f"SQLite error after {attempt + 1} retries: {e}") - cached_value = None - break - - if cached_value is not None: - # ✅ CACHE HIT - elapsed_ms = (time.time() - start_time) * 1000 - - # Set metadata in request.state if available (for API responses) - if 'request' in kwargs and hasattr(kwargs['request'], 'state'): - cache_source_value = cache.get_last_cache_source() # L1 or L2 - kwargs['request'].state.cache_hit = True - kwargs['request'].state.response_time_ms = elapsed_ms - kwargs['request'].state.cache_source = cache_source_value - - # Get benchmark for calculating time saved - benchmark = await cache.get_benchmark(cache_type) - time_saved_ms = (benchmark - elapsed_ms) if benchmark else None - - # Track performance - if cache.config.track_performance: - await cache.track_performance( - cache_type=cache_type, - is_hit=True, - actual_time_ms=elapsed_ms, - time_saved_ms=time_saved_ms, - estimated_oracle_time_ms=benchmark, - company_id=_extract_company_id(args, kwargs, key_params), - username=username - ) - - return cached_value - - # ❌ CACHE MISS - execute function (query Oracle) - result = await func(*args, **kwargs) - elapsed_ms = (time.time() - start_time) * 1000 - - # Set metadata in request.state if available (for API responses) - if 'request' in kwargs and hasattr(kwargs['request'], 'state'): - kwargs['request'].state.cache_hit = False - kwargs['request'].state.response_time_ms = elapsed_ms - kwargs['request'].state.cache_source = None - - # Update benchmark with real Oracle time - await cache.update_benchmark(cache_type, elapsed_ms) - - # Track performance - if cache.config.track_performance: - await cache.track_performance( - cache_type=cache_type, - is_hit=False, - actual_time_ms=elapsed_ms, - company_id=_extract_company_id(args, kwargs, key_params), - username=username - ) - - # Store in cache for next time (with retry logic for SQLite locks) - company_id = _extract_company_id(args, kwargs, key_params) - for attempt in range(SQLITE_MAX_RETRIES): - try: - await cache.set(cache_key, result, cache_type, company_id, ttl) - break - except sqlite3.OperationalError as e: - if "database is locked" in str(e) and attempt < SQLITE_MAX_RETRIES - 1: - delay = SQLITE_RETRY_BASE_DELAY * (attempt + 1) - logger.warning(f"SQLite locked on cache.set, retry {attempt + 1}/{SQLITE_MAX_RETRIES} after {delay}s") - await asyncio.sleep(delay) - else: - logger.error(f"SQLite error on cache.set after {attempt + 1} retries: {e}") - # Don't fail the request, just skip caching - break - - return result - - return wrapper - return decorator - - -def _extract_username(args, kwargs, key_params: Optional[List[str]]) -> Optional[str]: - """ - Extract username from function parameters (args or kwargs) - - Checks: - 1. key_params position in args (if username is in key_params) - 2. Direct username in kwargs - 3. current_user object in kwargs - 4. user object in kwargs - 5. request.state.user (from AuthenticationMiddleware) - - Args: - args: Positional arguments - kwargs: Keyword arguments - key_params: List of parameter names (for finding position in args) - - Returns: - Username string or None - """ - # Try to find username in args based on key_params position - if key_params and 'username' in key_params: - try: - username_idx = key_params.index('username') - if username_idx < len(args): - username = args[username_idx] - if username: - return str(username) - except (ValueError, IndexError): - pass - - # Direct username parameter in kwargs - if 'username' in kwargs: - return kwargs['username'] - - # Current user object (from FastAPI Depends) - if 'current_user' in kwargs: - user = kwargs['current_user'] - if hasattr(user, 'username'): - return user.username - elif isinstance(user, dict) and 'username' in user: - return user['username'] - return str(user) - - # User object - if 'user' in kwargs: - user = kwargs['user'] - if hasattr(user, 'username'): - return user.username - elif isinstance(user, dict) and 'username' in user: - return user['username'] - return str(user) - - # Extract from request.state.user (set by AuthenticationMiddleware) - if 'request' in kwargs: - request = kwargs['request'] - if hasattr(request, 'state') and hasattr(request.state, 'user'): - user = request.state.user - if hasattr(user, 'username'): - return user.username - elif isinstance(user, dict) and 'username' in user: - return user['username'] - - return None - - -def _extract_company_id(args, kwargs, key_params: Optional[List[str]]) -> Optional[int]: - """ - Extract company_id from function parameters for cache indexing - - Tries multiple approaches: - 1. Direct company_id in kwargs - 2. company parameter (converted to int) - 3. Positional args based on key_params position - - Args: - args: Positional arguments - kwargs: Keyword arguments - key_params: List of parameter names - - Returns: - Company ID as integer or None - """ - # Try kwargs first - if 'company_id' in kwargs: - try: - return int(kwargs['company_id']) - except (ValueError, TypeError): - pass - - if 'company' in kwargs: - try: - return int(kwargs['company']) - except (ValueError, TypeError): - pass - - # Try positional args based on key_params - if key_params: - if 'company_id' in key_params: - idx = key_params.index('company_id') - if idx < len(args): - try: - return int(args[idx]) - except (ValueError, TypeError): - pass - - elif 'company' in key_params: - idx = key_params.index('company') - if idx < len(args): - try: - return int(args[idx]) - except (ValueError, TypeError): - pass - - return None diff --git a/deploy-package-20260223-151231/backend/modules/reports/cache/event_monitor.py b/deploy-package-20260223-151231/backend/modules/reports/cache/event_monitor.py deleted file mode 100644 index ad2ea68..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/cache/event_monitor.py +++ /dev/null @@ -1,333 +0,0 @@ -""" -Event-based cache invalidation monitor - -Monitors {schema}.act tables for changes and invalidates cache automatically -""" -import asyncio -import logging -import sys -import os -from typing import Optional - -# Path setup handled by main.py - this is redundant but kept for module isolation -# sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../../../..'))) - -logger = logging.getLogger(__name__) - - -class EventMonitor: - """ - Monitors schema.act tables for changes to trigger cache invalidation - - Runs as background task, checking max(id_act) at configured intervals - Uses permanent schema_mappings cache to avoid repeated schema lookups - """ - - def __init__(self, cache_manager, config): - """ - Initialize event monitor - - Args: - cache_manager: CacheManager instance - config: CacheConfig instance - """ - self.cache = cache_manager - self.config = config - self.running = False - self.task: Optional[asyncio.Task] = None - - async def start(self): - """Start monitoring task""" - if self.running: - logger.warning("Event monitor already running") - return - - self.running = True - self.task = asyncio.create_task(self._monitor_loop()) - logger.info( - f"Event monitor started (interval: {self.config.check_interval}s)" - ) - - async def stop(self): - """Stop monitoring task""" - if not self.running: - return - - self.running = False - if self.task: - self.task.cancel() - try: - await self.task - except asyncio.CancelledError: - pass - - logger.info("Event monitor stopped") - - async def _monitor_loop(self): - """Main monitoring loop""" - while self.running: - try: - await self._check_all_companies() - await asyncio.sleep(self.config.check_interval) - - except asyncio.CancelledError: - break - except Exception as e: - logger.error(f"Event monitor error: {e}", exc_info=True) - # Wait 1 minute on error before retrying - await asyncio.sleep(60) - - async def _check_all_companies(self): - """ - Check all companies with active cache for changes - - Queries max(id_act) from {schema}.act for each cached company - and invalidates cache if changes detected - """ - try: - # Get list of companies with active cache entries - cached_companies = await self.cache.sqlite.get_cached_company_ids() - - if not cached_companies: - logger.debug("No cached companies to monitor") - return - - logger.info(f"Checking {len(cached_companies)} companies for changes...") - invalidated_count = 0 - - for company_id in cached_companies: - try: - # Check if company data changed - changed = await self._check_company_changes(company_id) - - if changed: - # Invalidate cache for this company - await self.cache.invalidate(company_id=company_id) - invalidated_count += 1 - logger.info( - f"Cache invalidated for company {company_id} due to act changes" - ) - - except Exception as e: - # Error for one company shouldn't stop checking others - logger.error(f"Error checking company {company_id}: {e}") - continue - - if invalidated_count > 0: - logger.info( - f"Auto-invalidation complete: {invalidated_count} companies affected" - ) - - except Exception as e: - logger.error(f"Check all companies error: {e}", exc_info=True) - - async def _check_company_changes(self, company_id: int) -> bool: - """ - Check if company data changed (monitor max(id_act) in schema.act) - - Args: - company_id: Company ID to check - - Returns: - True if cache should be invalidated, False otherwise - """ - try: - # 1. Get schema (from permanent cache) - schema = await self._get_schema_for_company(company_id) - if not schema: - logger.warning(f"Schema not found for company {company_id}") - return False - - # 2. Get current max(id_act) from Oracle - current_max = await self._get_max_id_act(schema) - - # 3. Get cached watermark - cached_watermark = await self.cache.sqlite.get_watermark(company_id) - - # 4. Compare - if cached_watermark is None: - # First time checking - store watermark, no invalidation - await self.cache.sqlite.set_watermark(company_id, schema, current_max) - logger.debug( - f"Watermark initialized for company {company_id}: {current_max}" - ) - return False - - if current_max > cached_watermark: - # Changes detected! - logger.info( - f"Schema {schema} (company {company_id}): " - f"id_act changed {cached_watermark} -> {current_max}" - ) - - # Update watermark - await self.cache.sqlite.set_watermark(company_id, schema, current_max) - - return True # Invalidate cache - - # No changes - return False - - except Exception as e: - logger.error(f"Check company {company_id} changes error: {e}") - return False # Don't invalidate on error - - async def _get_schema_for_company(self, company_id: int) -> Optional[str]: - """ - Get schema for company (with permanent caching) - - First checks permanent schema_mappings cache, - falls back to Oracle query if not cached - - Args: - company_id: Company ID - - Returns: - Schema name or None - """ - # Check permanent cache first - cached_schema = await self.cache.sqlite.get_schema_mapping(company_id) - if cached_schema: - logger.debug(f"Schema mapping HIT for company {company_id}: {cached_schema}") - return cached_schema - - # Cache MISS - query Oracle - logger.info(f"Schema mapping MISS for company {company_id}, querying Oracle...") - - try: - from shared.database.oracle_pool import oracle_pool - - async with oracle_pool.get_connection() as connection: - with connection.cursor() as cursor: - cursor.execute(""" - SELECT schema - FROM CONTAFIN_ORACLE.v_nom_firme - WHERE id_firma = :id - """, {'id': company_id}) - result = cursor.fetchone() - - if not result: - logger.warning(f"Company {company_id} not found in v_nom_firme") - return None - - schema = result[0] - - # Store PERMANENT in schema_mappings (never expires) - await self.cache.sqlite.set_schema_mapping(company_id, schema) - - logger.info(f"Schema mapping stored for company {company_id}: {schema}") - return schema - - except Exception as e: - logger.error(f"Get schema for company {company_id} error: {e}") - return None - - async def _get_max_id_act(self, schema: str) -> int: - """ - Query max(id_act) from {schema}.act - - Args: - schema: Schema name - - Returns: - Max id_act value (0 if table empty) - """ - try: - from shared.database.oracle_pool import oracle_pool - - async with oracle_pool.get_connection() as connection: - with connection.cursor() as cursor: - # IMPORTANT: Schema comes from v_nom_firme (trusted source) - # so it's safe from SQL injection - query = f"SELECT MAX(id_act) FROM {schema}.act" - cursor.execute(query) - - result = cursor.fetchone() - max_id_act = result[0] if result and result[0] is not None else 0 - - return max_id_act - - except Exception as e: - logger.error(f"Get max_id_act for schema {schema} error: {e}") - return 0 - - -# Optional: Preload all schema mappings at startup - -async def preload_all_schema_mappings(): - """ - Preload all schema mappings at startup (optional) - - Prevents cache misses on first requests by populating - schema_mappings table with all companies - """ - from .cache_manager import get_cache - - cache = get_cache() - if not cache: - logger.warning("Cache not initialized - skipping schema preload") - return - - logger.info("Preloading all schema mappings...") - - try: - from shared.database.oracle_pool import oracle_pool - - async with oracle_pool.get_connection() as connection: - with connection.cursor() as cursor: - cursor.execute(""" - SELECT id_firma, schema - FROM CONTAFIN_ORACLE.v_nom_firme - """) - results = cursor.fetchall() - - for id_firma, schema in results: - await cache.sqlite.set_schema_mapping(id_firma, schema) - - logger.info(f"Preloaded {len(results)} schema mappings") - - except Exception as e: - logger.error(f"Schema preload error: {e}") - - -# Global event monitor instance -_event_monitor: Optional[EventMonitor] = None - - -async def init_event_monitor(cache_manager, config): - """ - Initialize global event monitor - - Args: - cache_manager: CacheManager instance - config: CacheConfig instance - """ - global _event_monitor - _event_monitor = EventMonitor(cache_manager, config) - - # Start if auto-invalidate enabled - if config.auto_invalidate_enabled: - await _event_monitor.start() - - -def get_event_monitor() -> Optional[EventMonitor]: - """Get global event monitor instance""" - return _event_monitor - - -async def toggle_event_monitor(enabled: bool): - """ - Toggle event monitor on/off - - Args: - enabled: True to start monitoring, False to stop - """ - monitor = get_event_monitor() - if not monitor: - logger.warning("Event monitor not initialized") - return - - if enabled and not monitor.running: - await monitor.start() - elif not enabled and monitor.running: - await monitor.stop() diff --git a/deploy-package-20260223-151231/backend/modules/reports/cache/keys.py b/deploy-package-20260223-151231/backend/modules/reports/cache/keys.py deleted file mode 100644 index c7d0849..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/cache/keys.py +++ /dev/null @@ -1,150 +0,0 @@ -""" -Cache key generation utilities -""" -import hashlib -import json -from typing import Any, List, Optional - - -def generate_cache_key(cache_type: str, key_params: Optional[List[str]], args: tuple, kwargs: dict) -> str: - """ - Generate cache key from function parameters - - Format: "{cache_type}:{param1_value}:{param2_value}:..." - - Args: - cache_type: Type of cache (e.g., 'dashboard_summary', 'invoices') - key_params: List of parameter names to include in key - args: Positional arguments from function call - kwargs: Keyword arguments from function call - - Returns: - Cache key string - - Examples: - generate_cache_key('schema', ['company_id'], (123,), {}) - -> "schema:123" - - generate_cache_key('dashboard_summary', ['company', 'username'], (), {'company': '123', 'username': 'john'}) - -> "dashboard_summary:123:john" - - generate_cache_key('invoices', ['company', 'invoice_type', 'status'], (123, 'CLIENTI', 'neplatite'), {}) - -> "invoices:123:CLIENTI:neplatite" - """ - key_parts = [cache_type] - - if not key_params: - # No specific params - use all args/kwargs (fallback) - if args: - key_parts.extend([str(arg) for arg in args]) - if kwargs: - # Sort kwargs for consistent key generation - sorted_kwargs = sorted(kwargs.items()) - key_parts.extend([f"{k}={v}" for k, v in sorted_kwargs]) - else: - # Extract specific params - for i, param_name in enumerate(key_params): - # Try to get from kwargs first - if param_name in kwargs: - value = kwargs[param_name] - # Then try positional args - elif i < len(args): - value = args[i] - else: - # Parameter not found - use placeholder - value = "none" - - key_parts.append(str(value)) - - return ":".join(key_parts) - - -def generate_key_pattern(cache_type: str, company_id: Optional[int] = None) -> str: - """ - Generate cache key pattern for matching multiple keys - - Used for invalidation by type or company - - Args: - cache_type: Type of cache - company_id: Optional company ID to filter by - - Returns: - Pattern string (prefix) - - Examples: - generate_key_pattern('dashboard_summary') - -> "dashboard_summary:" - - generate_key_pattern('dashboard_summary', 123) - -> "dashboard_summary:123" - """ - if company_id is not None: - return f"{cache_type}:{company_id}" - return f"{cache_type}:" - - -def hash_complex_params(params: dict) -> str: - """ - Generate hash for complex parameters (e.g., filters, queries) - - Used when cache key would be too long with full param values - - Args: - params: Dictionary of parameters to hash - - Returns: - 8-character hash string - - Example: - filters = {'status': 'neplatite', 'date_from': '2024-01-01', 'date_to': '2024-12-31'} - hash_complex_params(filters) - -> "a3f8b2c1" - """ - # Sort keys for consistent hashing - sorted_params = json.dumps(params, sort_keys=True) - hash_obj = hashlib.sha256(sorted_params.encode()) - # Return first 8 characters of hex digest - return hash_obj.hexdigest()[:8] - - -def extract_company_id_from_key(cache_key: str) -> Optional[int]: - """ - Extract company_id from cache key - - Assumes format: "cache_type:company_id:..." - - Args: - cache_key: Cache key string - - Returns: - Company ID or None if not found - - Example: - extract_company_id_from_key("dashboard_summary:123:john") - -> 123 - """ - parts = cache_key.split(":") - if len(parts) >= 2: - try: - return int(parts[1]) - except (ValueError, TypeError): - pass - return None - - -def extract_cache_type_from_key(cache_key: str) -> str: - """ - Extract cache_type from cache key - - Args: - cache_key: Cache key string - - Returns: - Cache type (first part before colon) - - Example: - extract_cache_type_from_key("dashboard_summary:123:john") - -> "dashboard_summary" - """ - return cache_key.split(":")[0] diff --git a/deploy-package-20260223-151231/backend/modules/reports/cache/memory_cache.py b/deploy-package-20260223-151231/backend/modules/reports/cache/memory_cache.py deleted file mode 100644 index a1e9d45..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/cache/memory_cache.py +++ /dev/null @@ -1,180 +0,0 @@ -""" -In-memory cache with TTL (L1 cache) -Fast, limited size, lost on restart -""" -import time -import logging -from typing import Any, Optional, Dict -from collections import OrderedDict - -logger = logging.getLogger(__name__) - - -class MemoryCache: - """ - In-memory LRU cache with TTL support - - Features: - - LRU eviction when max_size reached - - Per-entry TTL expiration - - Thread-safe operations - - Fast O(1) get/set operations - """ - - def __init__(self, max_size: int = 1000): - """ - Initialize memory cache - - Args: - max_size: Maximum number of entries to store - """ - self.max_size = max_size - self._cache: OrderedDict[str, Dict[str, Any]] = OrderedDict() - self._stats = { - 'hits': 0, - 'misses': 0, - 'sets': 0, - 'evictions': 0 - } - - async def get(self, key: str) -> Optional[Any]: - """ - Get value from cache - - Args: - key: Cache key - - Returns: - Cached value or None if not found/expired - """ - if key not in self._cache: - self._stats['misses'] += 1 - return None - - entry = self._cache[key] - - # Check TTL expiration - if entry['expires_at'] < time.time(): - # Expired - remove and return None - del self._cache[key] - self._stats['misses'] += 1 - logger.debug(f"Memory cache expired: {key}") - return None - - # Move to end (LRU - most recently used) - self._cache.move_to_end(key) - - self._stats['hits'] += 1 - logger.debug(f"Memory cache HIT: {key}") - return entry['value'] - - async def set(self, key: str, value: Any, ttl: int): - """ - Set value in cache - - Args: - key: Cache key - value: Value to cache - ttl: Time to live in seconds - """ - expires_at = time.time() + ttl - - # Check if we need to evict (LRU) - if key not in self._cache and len(self._cache) >= self.max_size: - # Evict oldest entry (first item in OrderedDict) - evicted_key = next(iter(self._cache)) - del self._cache[evicted_key] - self._stats['evictions'] += 1 - logger.debug(f"Memory cache evicted (LRU): {evicted_key}") - - # Store entry - self._cache[key] = { - 'value': value, - 'expires_at': expires_at, - 'created_at': time.time() - } - - # Move to end (most recently used) - self._cache.move_to_end(key) - - self._stats['sets'] += 1 - logger.debug(f"Memory cache SET: {key} (TTL: {ttl}s)") - - async def delete(self, key: str) -> bool: - """ - Delete entry from cache - - Args: - key: Cache key - - Returns: - True if deleted, False if not found - """ - if key in self._cache: - del self._cache[key] - logger.debug(f"Memory cache deleted: {key}") - return True - return False - - async def clear(self): - """Clear all entries from cache""" - count = len(self._cache) - self._cache.clear() - logger.info(f"Memory cache cleared: {count} entries removed") - - async def clear_by_pattern(self, pattern: str): - """ - Clear entries matching pattern (simple prefix match) - - Args: - pattern: Key prefix to match (e.g., "dashboard_summary:123") - """ - keys_to_delete = [key for key in self._cache.keys() if key.startswith(pattern)] - for key in keys_to_delete: - del self._cache[key] - - logger.info(f"Memory cache cleared by pattern '{pattern}': {len(keys_to_delete)} entries") - - async def cleanup_expired(self): - """Remove all expired entries""" - now = time.time() - expired_keys = [ - key for key, entry in self._cache.items() - if entry['expires_at'] < now - ] - - for key in expired_keys: - del self._cache[key] - - if expired_keys: - logger.info(f"Memory cache cleanup: {len(expired_keys)} expired entries removed") - - def get_stats(self) -> Dict[str, Any]: - """ - Get cache statistics - - Returns: - Dictionary with stats (hits, misses, size, etc.) - """ - total_requests = self._stats['hits'] + self._stats['misses'] - hit_rate = (self._stats['hits'] / total_requests * 100) if total_requests > 0 else 0 - - return { - 'size': len(self._cache), - 'max_size': self.max_size, - 'hits': self._stats['hits'], - 'misses': self._stats['misses'], - 'sets': self._stats['sets'], - 'evictions': self._stats['evictions'], - 'hit_rate': hit_rate, - 'total_requests': total_requests - } - - def reset_stats(self): - """Reset statistics counters""" - self._stats = { - 'hits': 0, - 'misses': 0, - 'sets': 0, - 'evictions': 0 - } diff --git a/deploy-package-20260223-151231/backend/modules/reports/cache/sqlite_cache.py b/deploy-package-20260223-151231/backend/modules/reports/cache/sqlite_cache.py deleted file mode 100644 index 2ae24b3..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/cache/sqlite_cache.py +++ /dev/null @@ -1,594 +0,0 @@ -""" -SQLite persistent cache (L2 cache) -Persistent, survives restarts, unlimited size - -Uses singleton connection pattern with asyncio.Lock for write serialization -to prevent "database is locked" errors under concurrent access. -""" -import time -import json -import logging -import asyncio -import aiosqlite -from typing import Any, Optional, List, Dict -from pathlib import Path -from decimal import Decimal -from datetime import datetime, date - -# SQLite busy timeout in milliseconds (wait for lock instead of failing immediately) -SQLITE_BUSY_TIMEOUT_MS = 5000 - -logger = logging.getLogger(__name__) - - -class CustomJSONEncoder(json.JSONEncoder): - """Custom JSON encoder that handles Pydantic models, Decimal, datetime, etc.""" - def default(self, obj): - # Handle Pydantic models - if hasattr(obj, 'dict'): - return obj.dict() - if hasattr(obj, 'model_dump'): # Pydantic v2 - return obj.model_dump() - # Handle Decimal - if isinstance(obj, Decimal): - return float(obj) - # Handle datetime/date - if isinstance(obj, (datetime, date)): - return obj.isoformat() - return super().default(obj) - - -class SQLiteConnectionManager: - """ - Singleton connection manager with write serialization. - - Solves "database is locked" errors by: - 1. Maintaining a single persistent connection (instead of N connections per request) - 2. Serializing all write operations through an asyncio.Lock - 3. Using WAL mode for better concurrent read performance - - Architecture: - ┌─────────────────────────────────────┐ - │ SQLiteConnectionManager │ - │ (SINGLETON) │ - │ │ - │ _connection: aiosqlite.Connection │ - │ _write_lock: asyncio.Lock │ - └─────────────────────────────────────┘ - │ - ┌───────────────┼───────────────┐ - ▼ ▼ ▼ - Task 1 Task 2 Task N - cache.get() cache.set() cache.get() - │ │ │ - └───────────────┴───────────────┘ - │ - async with _write_lock: - (serialized writes) - """ - - _instance: Optional['SQLiteConnectionManager'] = None - _instance_lock: asyncio.Lock = None # Will be created on first use - - def __init__(self, db_path: str): - """ - Initialize connection manager (called only by get_instance). - - Args: - db_path: Path to SQLite database file - """ - self.db_path = db_path - self._connection: Optional[aiosqlite.Connection] = None - self._write_lock: Optional[asyncio.Lock] = None - self._initialized = False - - @classmethod - async def get_instance(cls, db_path: str) -> 'SQLiteConnectionManager': - """ - Get or create singleton instance. - - Thread-safe singleton pattern using asyncio.Lock. - - Args: - db_path: Path to SQLite database file - - Returns: - SQLiteConnectionManager singleton instance - """ - # Create instance lock on first call (must be done in async context) - if cls._instance_lock is None: - cls._instance_lock = asyncio.Lock() - - async with cls._instance_lock: - if cls._instance is None or cls._instance.db_path != db_path: - cls._instance = cls(db_path) - return cls._instance - - async def initialize(self): - """ - Create connection with WAL mode and busy timeout. - - Sets up: - - Busy timeout (5 seconds) - wait for locks instead of failing - - WAL journal mode - allows concurrent reads while writing - - Write lock for serializing write operations - """ - if self._initialized: - return - - # Create write lock in async context - self._write_lock = asyncio.Lock() - - # Create persistent connection - self._connection = await aiosqlite.connect(self.db_path) - await self._connection.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - await self._connection.execute("PRAGMA journal_mode=WAL") - await self._connection.commit() - - self._initialized = True - logger.info(f"SQLite connection manager initialized: {self.db_path}") - - async def get_connection(self) -> aiosqlite.Connection: - """ - Get the persistent connection, with health check. - - If connection is unhealthy (closed or stale), reconnects automatically. - - Returns: - Active aiosqlite connection - """ - if self._connection is None or not await self._is_healthy(): - await self._reconnect() - return self._connection - - async def _is_healthy(self) -> bool: - """ - Check if connection is valid. - - Returns: - True if connection can execute queries, False otherwise - """ - try: - async with self._connection.execute("SELECT 1") as cursor: - await cursor.fetchone() - return True - except Exception: - return False - - async def _reconnect(self): - """Reconnect if connection was lost.""" - logger.warning("SQLite connection unhealthy, reconnecting...") - - # Close old connection if exists - if self._connection: - try: - await self._connection.close() - except Exception: - pass - - # Create new connection - self._connection = await aiosqlite.connect(self.db_path) - await self._connection.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - await self._connection.execute("PRAGMA journal_mode=WAL") - await self._connection.commit() - - logger.info("SQLite connection re-established") - - @property - def write_lock(self) -> asyncio.Lock: - """Get the write lock for serializing write operations.""" - return self._write_lock - - async def close(self): - """Close the connection and reset singleton.""" - if self._connection: - try: - await self._connection.close() - except Exception as e: - logger.warning(f"Error closing SQLite connection: {e}") - - self._connection = None - self._initialized = False - - # Reset singleton - SQLiteConnectionManager._instance = None - logger.info("SQLite connection manager closed") - - -class SQLiteCache: - """ - SQLite-based persistent cache - - Features: - - Persistent storage (survives restarts) - - JSON serialization for complex objects - - Schema mappings (permanent cache for company->schema) - - Watermarks for event-based invalidation - - Performance tracking and benchmarks - - Singleton connection with write serialization (prevents "database is locked") - """ - - def __init__(self, db_path: str): - """ - Initialize SQLite cache - - Args: - db_path: Path to SQLite database file - """ - self.db_path = db_path - self._conn_manager: Optional[SQLiteConnectionManager] = None - self._ensure_db_dir() - - def _ensure_db_dir(self): - """Ensure database directory exists""" - db_dir = Path(self.db_path).parent - db_dir.mkdir(parents=True, exist_ok=True) - - async def init_db(self): - """Initialize database schema with WAL mode enabled""" - # Get or create singleton connection manager - self._conn_manager = await SQLiteConnectionManager.get_instance(self.db_path) - await self._conn_manager.initialize() - - # Create tables using the persistent connection - async with self._conn_manager.write_lock: - conn = await self._conn_manager.get_connection() - - # Table: cache_entries - await conn.execute(""" - CREATE TABLE IF NOT EXISTS cache_entries ( - cache_key TEXT PRIMARY KEY, - cache_type TEXT NOT NULL, - company_id INTEGER, - data_json TEXT NOT NULL, - created_at REAL NOT NULL, - expires_at REAL NOT NULL, - hit_count INTEGER DEFAULT 0, - last_accessed REAL - ) - """) - await conn.execute("CREATE INDEX IF NOT EXISTS idx_cache_type ON cache_entries(cache_type)") - await conn.execute("CREATE INDEX IF NOT EXISTS idx_company_id ON cache_entries(company_id)") - await conn.execute("CREATE INDEX IF NOT EXISTS idx_expires_at ON cache_entries(expires_at)") - - # Table: schema_mappings (PERMANENT) - await conn.execute(""" - CREATE TABLE IF NOT EXISTS schema_mappings ( - id_firma INTEGER PRIMARY KEY, - schema TEXT NOT NULL, - created_at REAL NOT NULL, - last_verified REAL - ) - """) - - # Table: query_benchmarks - await conn.execute(""" - CREATE TABLE IF NOT EXISTS query_benchmarks ( - cache_type TEXT PRIMARY KEY, - avg_time_ms REAL NOT NULL, - sample_count INTEGER DEFAULT 0, - last_updated REAL - ) - """) - - # Table: performance_log - await conn.execute(""" - CREATE TABLE IF NOT EXISTS performance_log ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - cache_type TEXT NOT NULL, - company_id INTEGER, - cache_hit BOOLEAN NOT NULL, - response_time_ms REAL NOT NULL, - estimated_oracle_time_ms REAL, - time_saved_ms REAL, - username TEXT, - timestamp REAL NOT NULL - ) - """) - await conn.execute("CREATE INDEX IF NOT EXISTS idx_perf_timestamp ON performance_log(timestamp)") - await conn.execute("CREATE INDEX IF NOT EXISTS idx_perf_cache_type ON performance_log(cache_type)") - - # Table: user_cache_settings - await conn.execute(""" - CREATE TABLE IF NOT EXISTS user_cache_settings ( - username TEXT PRIMARY KEY, - cache_enabled BOOLEAN DEFAULT TRUE, - created_at REAL, - updated_at REAL - ) - """) - - # Table: cache_config - await conn.execute(""" - CREATE TABLE IF NOT EXISTS cache_config ( - key TEXT PRIMARY KEY, - value TEXT NOT NULL, - updated_at REAL - ) - """) - - # Table: cache_watermarks - await conn.execute(""" - CREATE TABLE IF NOT EXISTS cache_watermarks ( - company_id INTEGER PRIMARY KEY, - schema TEXT NOT NULL, - max_id_act INTEGER NOT NULL, - checked_at REAL NOT NULL - ) - """) - - await conn.commit() - logger.info("SQLite cache database initialized") - - async def get(self, key: str) -> Optional[Any]: - """ - Get value from cache - - Args: - key: Cache key - - Returns: - Cached value or None if not found/expired - """ - # Use write lock because we may update hit_count or delete expired entries - async with self._conn_manager.write_lock: - conn = await self._conn_manager.get_connection() - - async with conn.execute(""" - SELECT data_json, expires_at - FROM cache_entries - WHERE cache_key = ? - """, (key,)) as cursor: - result = await cursor.fetchone() - - if not result: - return None - - data_json, expires_at = result - - # Check TTL expiration - if expires_at < time.time(): - # Expired - delete and return None - await conn.execute("DELETE FROM cache_entries WHERE cache_key = ?", (key,)) - await conn.commit() - logger.debug(f"SQLite cache expired: {key}") - return None - - # Update hit_count and last_accessed - await conn.execute(""" - UPDATE cache_entries - SET hit_count = hit_count + 1, last_accessed = ? - WHERE cache_key = ? - """, (time.time(), key)) - await conn.commit() - - logger.debug(f"SQLite cache HIT: {key}") - return json.loads(data_json) - - async def set(self, key: str, value: Any, cache_type: str, company_id: Optional[int], ttl: int): - """ - Set value in cache - - Args: - key: Cache key - value: Value to cache - cache_type: Type of cache entry - company_id: Company ID (None for global caches) - ttl: Time to live in seconds - """ - # Use custom encoder to handle Pydantic models, Decimal, datetime, etc. - data_json = json.dumps(value, cls=CustomJSONEncoder) - now = time.time() - expires_at = now + ttl - - async with self._conn_manager.write_lock: - conn = await self._conn_manager.get_connection() - await conn.execute(""" - INSERT OR REPLACE INTO cache_entries - (cache_key, cache_type, company_id, data_json, created_at, expires_at, hit_count, last_accessed) - VALUES (?, ?, ?, ?, ?, ?, 0, ?) - """, (key, cache_type, company_id, data_json, now, expires_at, now)) - await conn.commit() - - logger.debug(f"SQLite cache SET: {key} (TTL: {ttl}s)") - - async def delete(self, key: str) -> bool: - """Delete entry from cache""" - async with self._conn_manager.write_lock: - conn = await self._conn_manager.get_connection() - cursor = await conn.execute("DELETE FROM cache_entries WHERE cache_key = ?", (key,)) - await conn.commit() - deleted = cursor.rowcount > 0 - if deleted: - logger.debug(f"SQLite cache deleted: {key}") - return deleted - - async def clear(self): - """Clear all cache entries""" - async with self._conn_manager.write_lock: - conn = await self._conn_manager.get_connection() - cursor = await conn.execute("DELETE FROM cache_entries") - await conn.commit() - count = cursor.rowcount - logger.info(f"SQLite cache cleared: {count} entries removed") - - async def clear_by_company(self, company_id: int): - """Clear all entries for specific company""" - async with self._conn_manager.write_lock: - conn = await self._conn_manager.get_connection() - cursor = await conn.execute("DELETE FROM cache_entries WHERE company_id = ?", (company_id,)) - await conn.commit() - count = cursor.rowcount - logger.info(f"SQLite cache cleared for company {company_id}: {count} entries") - - async def clear_by_type(self, cache_type: str): - """Clear all entries of specific type""" - async with self._conn_manager.write_lock: - conn = await self._conn_manager.get_connection() - cursor = await conn.execute("DELETE FROM cache_entries WHERE cache_type = ?", (cache_type,)) - await conn.commit() - count = cursor.rowcount - logger.info(f"SQLite cache cleared for type '{cache_type}': {count} entries") - - async def cleanup_expired(self): - """Remove all expired entries""" - async with self._conn_manager.write_lock: - conn = await self._conn_manager.get_connection() - cursor = await conn.execute("DELETE FROM cache_entries WHERE expires_at < ?", (time.time(),)) - await conn.commit() - count = cursor.rowcount - if count > 0: - logger.info(f"SQLite cache cleanup: {count} expired entries removed") - - # Schema Mappings (PERMANENT) - - async def get_schema_mapping(self, company_id: int) -> Optional[str]: - """Get permanent cached schema for company (READ-ONLY, no lock needed)""" - conn = await self._conn_manager.get_connection() - async with conn.execute(""" - SELECT schema - FROM schema_mappings - WHERE id_firma = ? - """, (company_id,)) as cursor: - result = await cursor.fetchone() - return result[0] if result else None - - async def set_schema_mapping(self, company_id: int, schema: str): - """Set permanent schema mapping (never expires)""" - async with self._conn_manager.write_lock: - conn = await self._conn_manager.get_connection() - await conn.execute(""" - INSERT OR REPLACE INTO schema_mappings - (id_firma, schema, created_at, last_verified) - VALUES (?, ?, ?, ?) - """, (company_id, schema, time.time(), time.time())) - await conn.commit() - - # Benchmarks - - async def get_benchmark(self, cache_type: str) -> Optional[float]: - """Get average benchmark time for cache type (READ-ONLY, no lock needed)""" - conn = await self._conn_manager.get_connection() - async with conn.execute(""" - SELECT avg_time_ms - FROM query_benchmarks - WHERE cache_type = ? - """, (cache_type,)) as cursor: - result = await cursor.fetchone() - return result[0] if result else None - - async def set_benchmark(self, cache_type: str, avg_time_ms: float, sample_count: int): - """Set/update benchmark""" - async with self._conn_manager.write_lock: - conn = await self._conn_manager.get_connection() - await conn.execute(""" - INSERT OR REPLACE INTO query_benchmarks - (cache_type, avg_time_ms, sample_count, last_updated) - VALUES (?, ?, ?, ?) - """, (cache_type, avg_time_ms, sample_count, time.time())) - await conn.commit() - - # Performance Tracking - - async def log_performance(self, cache_type: str, company_id: Optional[int], cache_hit: bool, - response_time_ms: float, estimated_oracle_time_ms: Optional[float], - time_saved_ms: Optional[float], username: Optional[str]): - """Log performance metric""" - async with self._conn_manager.write_lock: - conn = await self._conn_manager.get_connection() - await conn.execute(""" - INSERT INTO performance_log - (cache_type, company_id, cache_hit, response_time_ms, estimated_oracle_time_ms, - time_saved_ms, username, timestamp) - VALUES (?, ?, ?, ?, ?, ?, ?, ?) - """, (cache_type, company_id, cache_hit, response_time_ms, estimated_oracle_time_ms, - time_saved_ms, username, time.time())) - await conn.commit() - - # User Settings - - async def get_user_cache_enabled(self, username: str) -> bool: - """Get user cache setting (default True) - READ-ONLY, no lock needed""" - conn = await self._conn_manager.get_connection() - async with conn.execute(""" - SELECT cache_enabled - FROM user_cache_settings - WHERE username = ? - """, (username,)) as cursor: - result = await cursor.fetchone() - return bool(result[0]) if result else True # Default enabled, explicit bool conversion - - async def set_user_cache_enabled(self, username: str, enabled: bool): - """Set user cache setting""" - async with self._conn_manager.write_lock: - conn = await self._conn_manager.get_connection() - await conn.execute(""" - INSERT OR REPLACE INTO user_cache_settings - (username, cache_enabled, created_at, updated_at) - VALUES (?, ?, ?, ?) - """, (username, enabled, time.time(), time.time())) - await conn.commit() - - # Watermarks - - async def get_watermark(self, company_id: int) -> Optional[int]: - """Get cached watermark (max_id_act) for company - READ-ONLY, no lock needed""" - conn = await self._conn_manager.get_connection() - async with conn.execute(""" - SELECT max_id_act - FROM cache_watermarks - WHERE company_id = ? - """, (company_id,)) as cursor: - result = await cursor.fetchone() - return result[0] if result else None - - async def set_watermark(self, company_id: int, schema: str, max_id_act: int): - """Set/update watermark for company""" - async with self._conn_manager.write_lock: - conn = await self._conn_manager.get_connection() - await conn.execute(""" - INSERT OR REPLACE INTO cache_watermarks - (company_id, schema, max_id_act, checked_at) - VALUES (?, ?, ?, ?) - """, (company_id, schema, max_id_act, time.time())) - await conn.commit() - - async def get_cached_company_ids(self) -> List[int]: - """Get list of company_ids with active cache entries - READ-ONLY, no lock needed""" - conn = await self._conn_manager.get_connection() - async with conn.execute(""" - SELECT DISTINCT company_id - FROM cache_entries - WHERE company_id IS NOT NULL - AND expires_at > ? - """, (time.time(),)) as cursor: - results = await cursor.fetchall() - return [row[0] for row in results] - - # Statistics - - async def get_stats(self) -> Dict[str, Any]: - """Get cache statistics - READ-ONLY, no lock needed""" - conn = await self._conn_manager.get_connection() - - # Total entries - async with conn.execute("SELECT COUNT(*) FROM cache_entries") as cursor: - total_entries = (await cursor.fetchone())[0] - - # Active entries (not expired) - async with conn.execute(""" - SELECT COUNT(*) FROM cache_entries WHERE expires_at > ? - """, (time.time(),)) as cursor: - active_entries = (await cursor.fetchone())[0] - - return { - 'total_entries': total_entries, - 'active_entries': active_entries, - 'expired_entries': total_entries - active_entries - } - - async def close(self): - """Close the connection manager""" - if self._conn_manager: - await self._conn_manager.close() - self._conn_manager = None diff --git a/deploy-package-20260223-151231/backend/modules/reports/models/__init__.py b/deploy-package-20260223-151231/backend/modules/reports/models/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/modules/reports/models/calendar.py b/deploy-package-20260223-151231/backend/modules/reports/models/calendar.py deleted file mode 100644 index 6b35f88..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/models/calendar.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -Calendar period models for accounting period selector -""" -from pydantic import BaseModel -from typing import List, Optional - - -class CalendarPeriod(BaseModel): - """Model for an accounting period""" - an: int # Year - luna: int # Month (1-12) - display_name: str # Format: "Decembrie 2025" - - -class CalendarPeriodsResponse(BaseModel): - """Response model for calendar periods list""" - periods: List[CalendarPeriod] - current_period: Optional[CalendarPeriod] = None # Most recent period - total_count: int diff --git a/deploy-package-20260223-151231/backend/modules/reports/models/dashboard.py b/deploy-package-20260223-151231/backend/modules/reports/models/dashboard.py deleted file mode 100644 index 3413a21..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/models/dashboard.py +++ /dev/null @@ -1,156 +0,0 @@ -from pydantic import BaseModel -from decimal import Decimal -from typing import List, Dict, Optional, Any - - -class BudgetDebtSubAccount(BaseModel): - """Cont individual din cadrul unui grup de datorii buget""" - cont: str # ex: "4311" - label: str # ex: "4311 - CAS angajat" - precedent: Decimal # sold luna precedentă (pozitiv=datorie, negativ=creanță) - curent: Decimal # sold luna curentă (pozitiv=datorie, negativ=creanță) - datorat: Decimal = Decimal('0') # datorie din luna precedentă (= preccred - precdeb) - achitat: Decimal = Decimal('0') # plăți efectuate luna curentă (= ruldeb) - sold: Decimal = Decimal('0') # sold final real (= soldcred - solddeb) - -class BudgetDebtGroup(BaseModel): - """Grup de datorii la buget (TVA / BASS / CAM)""" - key: str # 'TVA', 'BASS', 'CAM' - label: str # 'TVA', 'BASS', 'CAM' - precedent: Decimal # total grup luna prec (semn ±) - curent: Decimal # total grup luna crt (semn ±) - sub_accounts: List[BudgetDebtSubAccount] = [] - datorat: Decimal = Decimal('0') # total datorie grup luna precedentă - achitat: Decimal = Decimal('0') # total plăți grup luna curentă - sold: Decimal = Decimal('0') # sold final real al grupului - -class TreasuryAccount(BaseModel): - """Cont de trezorerie (bancă/casă)""" - cont: str # 5121, 5124, 5311, 5314 - nume_cont: str # "Bancă LEI", "Casă VALUTA" etc - nume_banca: str # Numele băncii din vbalanta_parteneri.nume - sold: Decimal - valuta: str - -class TrendData(BaseModel): - """Model pentru datele de trend - MODEL VECHI""" - labels: List[str] - incasari: List[Decimal] - plati: List[Decimal] - trezorerie: List[Decimal] - incasari_total: Decimal - plati_total: Decimal - trezorerie_total: Decimal - incasari_change: Optional[float] = None - plati_change: Optional[float] = None - trezorerie_change: Optional[float] = None - -class TrendsResponse(BaseModel): - """Model pentru răspunsul endpoint-ului de trenduri - MODEL NOU""" - # Current period data - periods: List[str] - clienti_facturat: List[float] - clienti_incasat: List[float] - furnizori_facturat: List[float] - furnizori_achitat: List[float] - clienti_sold: List[float] - furnizori_sold: List[float] - trezorerie_sold: Optional[List[float]] = None - rata_incasare_clienti: List[float] - rata_achitare_furnizori: List[float] - - # Previous period data (for year-over-year comparison in sparklines) - previous_periods: Optional[List[str]] = None - clienti_facturat_prev: Optional[List[float]] = None - clienti_incasat_prev: Optional[List[float]] = None - furnizori_facturat_prev: Optional[List[float]] = None - furnizori_achitat_prev: Optional[List[float]] = None - clienti_sold_prev: Optional[List[float]] = None - furnizori_sold_prev: Optional[List[float]] = None - trezorerie_sold_prev: Optional[List[float]] = None - - # Metadata and analytics - metadata: Dict[str, Any] - growth_rates: Optional[Dict[str, float]] = None - - # Cache metadata (optional, for Telegram Bot) - cache_hit: Optional[bool] = None - response_time_ms: Optional[float] = None - cache_source: Optional[str] = None - -class DashboardSummary(BaseModel): - """Model pentru toate datele dashboard-ului""" - # CLIENȚI - statistici existente - clienti_total_facturat: Decimal # precdeb + debit (conturi 4111, 461) - clienti_total_incasat: Decimal # preccred + credit (conturi 4111, 461) - clienti_avansuri: Decimal # sold 419 (pasiv): credit - debit - clienti_sold_total: Decimal # (facturat - incasat) - avansuri - clienti_sold_restant: Decimal # sold cu datascad < azi - - # CLIENȚI - NOI câmpuri pentru sold în termen - clienti_sold_in_termen: Decimal # sold cu datascad >= azi - - # CLIENȚI - NOI detalieri restanțe (sold cu datascad < azi) - clienti_restant_7: Decimal # restant 1-7 zile - clienti_restant_14: Decimal # restant 8-14 zile - clienti_restant_30: Decimal # restant 15-30 zile - clienti_restant_60: Decimal # restant 31-60 zile - clienti_restant_90: Decimal # restant 61-90 zile - clienti_restant_90plus: Decimal # restant 90+ zile - - # CLIENȚI - NOI detalieri scadențe (sold cu datascad >= azi) - clienti_scadent_7: Decimal # scadent în 1-7 zile - clienti_scadent_14: Decimal # scadent în 8-14 zile - clienti_scadent_30: Decimal # scadent în 15-30 zile - clienti_scadent_60: Decimal # scadent în 31-60 zile - clienti_scadent_90: Decimal # scadent în 61-90 zile - clienti_scadent_90plus: Decimal # scadent în 90+ zile - - # FURNIZORI - statistici existente - furnizori_total_facturat: Decimal # preccred + credit (conturi 401, 404, 462) - furnizori_total_achitat: Decimal # precdeb + debit (conturi 401, 404, 462) - furnizori_avansuri: Decimal # sold 409x (activ): debit - credit - furnizori_sold_total: Decimal # (facturat - achitat) - avansuri - furnizori_sold_restant: Decimal # sold cu datascad < azi - - # FURNIZORI - NOI câmpuri pentru sold în termen - furnizori_sold_in_termen: Decimal # sold cu datascad >= azi - - # FURNIZORI - NOI detalieri restanțe (sold cu datascad < azi) - furnizori_restant_7: Decimal # restant 1-7 zile - furnizori_restant_14: Decimal # restant 8-14 zile - furnizori_restant_30: Decimal # restant 15-30 zile - furnizori_restant_60: Decimal # restant 31-60 zile - furnizori_restant_90: Decimal # restant 61-90 zile - furnizori_restant_90plus: Decimal # restant 90+ zile - - # FURNIZORI - NOI detalieri scadențe (sold cu datascad >= azi) - furnizori_scadent_7: Decimal # scadent în 1-7 zile - furnizori_scadent_14: Decimal # scadent în 8-14 zile - furnizori_scadent_30: Decimal # scadent în 15-30 zile - furnizori_scadent_60: Decimal # scadent în 31-60 zile - furnizori_scadent_90: Decimal # scadent în 61-90 zile - furnizori_scadent_90plus: Decimal # scadent în 90+ zile - - # TREZORERIE - existente - treasury_accounts: List[TreasuryAccount] - treasury_totals_by_currency: Dict[str, Decimal] - - # DATE SUPLIMENTARE pentru trend analysis - clienti_facturat_luna_anterioara: Optional[Decimal] = Decimal('0') - furnizori_facturat_luna_anterioara: Optional[Decimal] = Decimal('0') - clienti_facturat_an_curent: Optional[Decimal] = Decimal('0') - clienti_facturat_an_anterior: Optional[Decimal] = Decimal('0') - furnizori_facturat_an_curent: Optional[Decimal] = Decimal('0') - furnizori_facturat_an_anterior: Optional[Decimal] = Decimal('0') - - # SOLDURI TVA - tva_plata_precedent: Decimal = Decimal('0') - tva_recuperat_precedent: Decimal = Decimal('0') - tva_plata_curent: Decimal = Decimal('0') - tva_recuperat_curent: Decimal = Decimal('0') - - # DATORII LA BUGET - breakdown pe grupe (TVA / BASS / CAM) cu sub-conturi - budget_debt_breakdown: List[BudgetDebtGroup] = [] - budget_debt_total_precedent: Decimal = Decimal('0') # suma tuturor grupurilor luna prec - budget_debt_total_sold: Decimal = Decimal('0') # sold final total (cât mai rămâne de plată) \ No newline at end of file diff --git a/deploy-package-20260223-151231/backend/modules/reports/models/financial_indicators.py b/deploy-package-20260223-151231/backend/modules/reports/models/financial_indicators.py deleted file mode 100644 index 8908f35..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/models/financial_indicators.py +++ /dev/null @@ -1,1099 +0,0 @@ -""" -Pydantic models pentru indicatori financiari. - -Definește structurile de date pentru: -- BalanceSheetAggregates: Solduri agregate din balanța de verificare -- IndicatorResult: Rezultatul standardizat cu sparkline data pentru vizualizare trend -- Modele pentru indicatori de lichiditate, eficiență, risc și Altman Z-Score -""" -from decimal import Decimal -from typing import Optional, List - -from pydantic import BaseModel, Field - - -class BalanceSheetAggregates(BaseModel): - """ - Solduri agregate din balanța de verificare (VBAL) pe categorii de conturi. - - Agregă datele din VBAL folosind prefixe de conturi conform Planului de - Conturi General (PCG) românesc pentru calculul indicatorilor financiari. - - Attributes: - company_id: ID-ul firmei - luna: Luna contabilă (1-12) - an: Anul contabil - active_imobilizate: Active imobilizate nete (brut - amortizări - ajustări) - stocuri: Valoarea stocurilor (brut - ajustări depreciere) - creante: Creanțe nete (brut - ajustări depreciere) - disponibilitati: Disponibilități bănești (bancă + casă) - capital_propriu: Capital social + prime + rezerve - rezultat: Rezultat reportat + rezultatul exercițiului curent - datorii_termen_lung: Datorii cu scadență > 1 an - datorii_curente: Datorii cu scadență <= 1 an - venituri: Venituri din exploatare (pentru calcul EBIT) - cheltuieli_operationale: Cheltuieli de exploatare (pentru calcul EBIT) - """ - company_id: int = Field(description="ID-ul firmei") - luna: int = Field(ge=1, le=12, description="Luna contabilă (1-12)") - an: int = Field(ge=2000, le=2100, description="Anul contabil") - - # Active - active_imobilizate: Decimal = Field( - default=Decimal('0'), - description="Active imobilizate nete (Clasa 2 - amortizări)" - ) - stocuri: Decimal = Field( - default=Decimal('0'), - description="Stocuri (Clasa 3 - ajustări depreciere)" - ) - creante: Decimal = Field( - default=Decimal('0'), - description="Creanțe comerciale și alte creanțe (4111, 461, etc.)" - ) - disponibilitati: Decimal = Field( - default=Decimal('0'), - description="Disponibilități (bancă 512x + casă 531x)" - ) - - # Pasive - Capitaluri - capital_propriu: Decimal = Field( - default=Decimal('0'), - description="Capital social + prime + rezerve (101, 104, 105, 106)" - ) - rezultat: Decimal = Field( - default=Decimal('0'), - description="Rezultat reportat + rezultat curent (107, 117, 121)" - ) - - # Pasive - Datorii - datorii_termen_lung: Decimal = Field( - default=Decimal('0'), - description="Datorii pe termen lung (Clasa 16)" - ) - datorii_curente: Decimal = Field( - default=Decimal('0'), - description="Datorii curente (401, 421, 4423, 462, etc.)" - ) - - # Venituri și Cheltuieli (pentru calcul EBIT în Altman Z-Score) - venituri: Decimal = Field( - default=Decimal('0'), - description="Venituri din exploatare (Clasa 7)" - ) - cheltuieli_operationale: Decimal = Field( - default=Decimal('0'), - description="Cheltuieli operaționale (Clasa 6 fără 66x)" - ) - cheltuieli_financiare: Decimal = Field( - default=Decimal('0'), - description="Cheltuieli financiare (Clasa 66 - dobânzi, diferențe curs)" - ) - capital_social_strict: Decimal = Field( - default=Decimal('0'), - description="Capital Social strict (doar contul 101 - subscris și vărsat)" - ) - cifra_afaceri: Decimal = Field( - default=Decimal('0'), - description="Cifra de afaceri (doar 70x FĂRĂ TVA, fără 71x-75x)" - ) - achizitii_stocuri: Decimal = Field( - default=Decimal('0'), - description="Achiziții stocuri YTD (Clasa 3 TOTDEB, FĂRĂ TVA)" - ) - - # Computed properties pentru calculele ulterioare - @property - def active_curente(self) -> Decimal: - """Active curente = stocuri + creanțe + disponibilități""" - return self.stocuri + self.creante + self.disponibilitati - - @property - def total_active(self) -> Decimal: - """Total active = active imobilizate + active curente""" - return self.active_imobilizate + self.active_curente - - @property - def total_datorii(self) -> Decimal: - """Total datorii = datorii termen lung + datorii curente""" - return self.datorii_termen_lung + self.datorii_curente - - @property - def capitaluri_proprii(self) -> Decimal: - """Capitaluri proprii = capital propriu + rezultat""" - return self.capital_propriu + self.rezultat - - @property - def ebit(self) -> Decimal: - """EBIT (Earnings Before Interest and Taxes) = venituri - cheltuieli operaționale""" - return self.venituri - self.cheltuieli_operationale - - @property - def working_capital(self) -> Decimal: - """Working capital (fond de rulment) = active curente - datorii curente""" - return self.active_curente - self.datorii_curente - - class Config: - """Configurare Pydantic""" - from_attributes = True - json_schema_extra = { - "example": { - "company_id": 123, - "luna": 12, - "an": 2024, - "active_imobilizate": 1500000.00, - "stocuri": 350000.00, - "creante": 420000.00, - "disponibilitati": 180000.00, - "capital_propriu": 800000.00, - "rezultat": 250000.00, - "datorii_termen_lung": 500000.00, - "datorii_curente": 400000.00, - "venituri": 2500000.00, - "cheltuieli_operationale": 2100000.00 - } - } - - -class IndicatorResult(BaseModel): - """ - Rezultatul standardizat pentru un indicator financiar. - - Fiecare indicator returnează valoarea calculată împreună cu - statusul (good/warning/danger), pragurile de referință și - date pentru sparkline (evoluția pe ultimele 12 luni). - - Attributes: - value: Valoarea calculată a indicatorului (None dacă nu se poate calcula) - status: Statusul indicatorului - 'good', 'warning', sau 'danger' - threshold_min: Pragul minim pentru status 'good' - threshold_max: Pragul maxim pentru status 'good' (opțional) - message: Mesaj explicativ (opțional, pentru cazuri speciale) - sparkline_data: Array cu valorile indicatorului pe ultimele 12 luni (pentru vizualizare trend) - sparkline_labels: Array cu etichetele lunilor în format 'MMM YY' (ex: 'Feb 24', 'Mar 24') - """ - value: Optional[float] = Field( - default=None, - description="Valoarea calculată a indicatorului" - ) - status: str = Field( - default="warning", - description="Statusul: 'good', 'warning', sau 'danger'" - ) - threshold_min: Optional[float] = Field( - default=None, - description="Pragul minim pentru status 'good'" - ) - threshold_max: Optional[float] = Field( - default=None, - description="Pragul maxim pentru status 'good'" - ) - message: Optional[str] = Field( - default=None, - description="Mesaj explicativ pentru cazuri speciale" - ) - sparkline_data: Optional[List[Optional[float]]] = Field( - default=None, - description="Array cu valorile indicatorului pe ultimele 12 luni (pentru sparkline)" - ) - sparkline_labels: Optional[List[str]] = Field( - default=None, - description="Array cu etichetele lunilor în format 'MMM YY' (ex: 'Feb 24', 'Mar 24')" - ) - - class Config: - json_schema_extra = { - "example": { - "value": 1.25, - "status": "good", - "threshold_min": 1.0, - "threshold_max": None, - "message": None, - "sparkline_data": [1.15, 1.18, 1.20, 1.22, 1.19, 1.21, 1.23, 1.25, 1.24, 1.26, 1.25, 1.25], - "sparkline_labels": ["Feb 24", "Mar 24", "Apr 24", "May 24", "Jun 24", "Jul 24", "Aug 24", "Sep 24", "Oct 24", "Nov 24", "Dec 24", "Jan 25"] - } - } - - -class LiquidityIndicators(BaseModel): - """ - Indicatori de lichiditate pentru evaluarea capacității de plată - a datoriilor pe termen scurt. - - Attributes: - lichiditate_curenta: Current Ratio = active_curente / datorii_curente - - Măsoară capacitatea de a plăti datoriile pe termen scurt cu active curente - - Good: >= 2.0, Warning: 1.0-2.0, Danger: < 1.0 - - lichiditate_imediata: Quick Ratio = (disponibilități + creanțe) / datorii_curente - - Măsoară capacitatea de plată fără a depinde de vânzarea stocurilor - - Good: >= 1.0, Warning: 0.5-1.0, Danger: < 0.5 - - lichiditate_vedere: Cash Ratio = disponibilități / datorii_curente - - Măsoară capacitatea de plată imediată doar din numerar - - Good: >= 0.2, Warning: 0.1-0.2, Danger: < 0.1 - - Sub-indicatori pentru verificare: - - active_curente: Active Curente = Stocuri + Creanțe + Disponibilități - - disponibilitati: Disponibilități (bancă + casă) - - creante: Creanțe comerciale - - datorii_curente: Datorii pe termen scurt - """ - lichiditate_curenta: IndicatorResult = Field( - description="Current Ratio = active_curente / datorii_curente" - ) - lichiditate_imediata: IndicatorResult = Field( - description="Quick Ratio = (disponibilități + creanțe) / datorii_curente" - ) - lichiditate_vedere: IndicatorResult = Field( - description="Cash Ratio = disponibilități / datorii_curente" - ) - # Sub-indicatori pentru verificare manuală în balanță - active_curente: Optional[IndicatorResult] = Field( - default=None, - description="Active Curente = Stocuri + Creanțe + Disponibilități (RON)" - ) - disponibilitati: Optional[IndicatorResult] = Field( - default=None, - description="Disponibilități = Bancă (512x) + Casă (531x) (RON)" - ) - creante: Optional[IndicatorResult] = Field( - default=None, - description="Creanțe comerciale = Clienți (411x) + Debitori (461x) (RON)" - ) - datorii_curente: Optional[IndicatorResult] = Field( - default=None, - description="Datorii pe termen scurt = Furnizori + TVA + Salarii etc. (RON)" - ) - - class Config: - json_schema_extra = { - "example": { - "lichiditate_curenta": { - "value": 2.37, - "status": "good", - "threshold_min": 2.0, - "threshold_max": None - }, - "lichiditate_imediata": { - "value": 1.50, - "status": "good", - "threshold_min": 1.0, - "threshold_max": None - }, - "lichiditate_vedere": { - "value": 0.45, - "status": "good", - "threshold_min": 0.2, - "threshold_max": None - } - } - } - - -class EfficiencyIndicators(BaseModel): - """ - Indicatori de eficiență pentru evaluarea vitezei de conversie - a resurselor în numerar (working capital efficiency). - - Attributes: - dso: Days Sales Outstanding (Durata medie de încasare) - - Formula: (clienti_sold / facturari_lunare) * 30 - - Măsoară câte zile durează în medie încasarea creanțelor - - Good: < 30 zile, Warning: 30-45 zile, Danger: > 45 zile - - dpo: Days Payables Outstanding (Durata medie de plată) - - Formula: (furnizori_sold / achizitii_lunare) * 30 - - Măsoară câte zile durează în medie plata furnizorilor - - Valoare mai mare = folosim mai mult creditul furnizorilor - - cash_conversion_cycle: Ciclu de conversie a numerarului - - Formula: DSO - DPO - - Pozitiv = numerar blocat în ciclul de afaceri - - Negativ = folosim creditul furnizorilor (favorabil) - - rata_incasare: Rata de încasare (Collection Rate) - - Formula: incasari / facturari * 100 - - Măsoară ce procent din facturări s-a încasat - - Good: >= 95%, Warning: 80-95%, Danger: < 80% - - rata_plata: Rata de plată (Payment Rate) - - Formula: plati / achizitii * 100 - - Măsoară ce procent din achiziții s-a achitat - """ - dso: IndicatorResult = Field( - description="Days Sales Outstanding = (clienti_sold / facturari_lunare) * 30" - ) - dpo: IndicatorResult = Field( - description="Days Payables Outstanding = (furnizori_sold / achizitii_lunare) * 30" - ) - cash_conversion_cycle: IndicatorResult = Field( - description="Cash Conversion Cycle = DSO - DPO" - ) - rata_incasare: IndicatorResult = Field( - description="Rata de încasare = incasari / facturari * 100" - ) - rata_plata: IndicatorResult = Field( - description="Rata de plată = plati / achizitii * 100" - ) - # Sub-indicatori pentru verificare manuală - sold_clienti: Optional[IndicatorResult] = Field( - default=None, - description="Sold Clienți la final de lună (RON)" - ) - facturari_lunare: Optional[IndicatorResult] = Field( - default=None, - description="Total facturări în luna curentă (RON)" - ) - sold_furnizori: Optional[IndicatorResult] = Field( - default=None, - description="Sold Furnizori la final de lună (RON)" - ) - achizitii_lunare: Optional[IndicatorResult] = Field( - default=None, - description="Total achiziții în luna curentă (RON)" - ) - incasari_luna: Optional[IndicatorResult] = Field( - default=None, - description="Încasări efectuate în luna curentă (RON)" - ) - plati_luna: Optional[IndicatorResult] = Field( - default=None, - description="Plăți efectuate în luna curentă (RON)" - ) - - class Config: - json_schema_extra = { - "example": { - "dso": { - "value": 28.5, - "status": "good", - "threshold_min": None, - "threshold_max": 30 - }, - "dpo": { - "value": 35.2, - "status": "good", - "threshold_min": None, - "threshold_max": None, - "message": "Folosim bine creditul furnizorilor" - }, - "cash_conversion_cycle": { - "value": -6.7, - "status": "good", - "threshold_min": None, - "threshold_max": 0, - "message": "Ciclu negativ = finanțare gratuită de la furnizori" - }, - "rata_incasare": { - "value": 92.5, - "status": "warning", - "threshold_min": 95, - "threshold_max": None - }, - "rata_plata": { - "value": 88.3, - "status": "good", - "threshold_min": None, - "threshold_max": None - } - } - } - - -class RiskIndicators(BaseModel): - """ - Indicatori de risc și aging pentru evaluarea sănătății - portofoliului de creanțe și datorii. - - Attributes: - creante_restante_pct: Procentul creanțelor restante din total clienți - - Formula: clienti_sold_restant / clienti_sold_total * 100 - - Măsoară ce procent din creanțe sunt depășite ca termen - - Good: < 20%, Warning: 20-30%, Danger: > 30% - - creante_90plus_pct: Procentul creanțelor restante > 90 zile din total - - Formula: clienti_restant_90plus / clienti_sold_total * 100 - - Indică creanțele cu risc mare de nerecuperare - - Good: < 5%, Warning: 5-10%, Danger: > 10% - - datorii_restante_pct: Procentul datoriilor restante din total furnizori - - Formula: furnizori_sold_restant / furnizori_sold_total * 100 - - Măsoară nivelul de întârzieri la plată - - Good: < 10%, Warning: 10-20%, Danger: > 20% - - raport_datorii_trezorerie: Raportul între datorii furnizori și trezorerie - - Formula: furnizori_sold_total / trezorerie - - Indică câte luni de cash sunt necesare pentru a plăti furnizorii - - Good: < 2, Warning: 2-4, Danger: > 4 - """ - creante_restante_pct: IndicatorResult = Field( - description="Procentul creanțelor restante = clienti_sold_restant / clienti_sold_total * 100" - ) - creante_90plus_pct: IndicatorResult = Field( - description="Procentul creanțelor > 90 zile = clienti_restant_90plus / clienti_sold_total * 100" - ) - datorii_restante_pct: IndicatorResult = Field( - description="Procentul datoriilor restante = furnizori_sold_restant / furnizori_sold_total * 100" - ) - raport_datorii_trezorerie: IndicatorResult = Field( - description="Raport datorii/trezorerie = furnizori_sold_total / trezorerie" - ) - # Sub-indicatori pentru verificare manuală - total_clienti: Optional[IndicatorResult] = Field( - default=None, - description="Sold total clienți (411x) (RON)" - ) - clienti_restanti: Optional[IndicatorResult] = Field( - default=None, - description="Sold clienți cu facturi restante (RON)" - ) - clienti_90plus: Optional[IndicatorResult] = Field( - default=None, - description="Sold clienți cu facturi >90 zile restant (RON)" - ) - total_furnizori: Optional[IndicatorResult] = Field( - default=None, - description="Sold total furnizori (401x) (RON)" - ) - furnizori_restanti: Optional[IndicatorResult] = Field( - default=None, - description="Sold furnizori cu facturi restante (RON)" - ) - trezorerie: Optional[IndicatorResult] = Field( - default=None, - description="Disponibilități (512x + 531x) (RON)" - ) - - class Config: - json_schema_extra = { - "example": { - "creante_restante_pct": { - "value": 15.5, - "status": "good", - "threshold_min": None, - "threshold_max": 20 - }, - "creante_90plus_pct": { - "value": 3.2, - "status": "good", - "threshold_min": None, - "threshold_max": 5 - }, - "datorii_restante_pct": { - "value": 8.5, - "status": "good", - "threshold_min": None, - "threshold_max": 10 - }, - "raport_datorii_trezorerie": { - "value": 1.8, - "status": "good", - "threshold_min": None, - "threshold_max": 2, - "message": "Trezorerie suficientă pentru acoperirea datoriilor" - } - } - } - - -class CashFlowIndicators(BaseModel): - """ - Indicatori de cash flow pentru evaluarea generării și consumului de numerar. - - Attributes: - flux_net_lunar: Fluxul net de numerar lunar (încasări - plăți) - - Formula: incasari_luna - plati_luna - - Pozitiv = firma generează numerar, Negativ = firma consumă numerar - - Good: > 0, Danger: < 0 - - cash_flow_ytd: Fluxul de numerar cumulat de la începutul anului (Year-To-Date) - - Formula: suma fluxurilor nete de la ianuarie până la luna curentă - - Arată tendința generală a anului în curs - - flux_net_yoy_pct: Variația procentuală YoY (Year-over-Year) - - Formula: (cf_curent - cf_anterior) / abs(cf_anterior) * 100 - - Compară cash flow-ul curent cu aceeași perioadă din anul anterior - - acoperire_cash_flow: Rata de acoperire a datoriilor restante - - Formula: cash_flow_ytd / datorii_restante - - Arată de câte ori cash flow-ul YTD poate acoperi datoriile restante - - Good: > 1 (cash flow suficient), Danger: < 0.5 - """ - flux_net_lunar: IndicatorResult = Field( - description="Flux net lunar = incasari_luna - plati_luna" - ) - cash_flow_ytd: IndicatorResult = Field( - description="Cash flow cumulat YTD = suma fluxurilor de la ianuarie" - ) - flux_net_yoy_pct: IndicatorResult = Field( - description="Variația YoY = (cf_curent - cf_anterior) / abs(cf_anterior) * 100" - ) - acoperire_cash_flow: IndicatorResult = Field( - description="Acoperire datorii = cash_flow_ytd / datorii_restante" - ) - # Sub-indicatori pentru verificare manuală - incasari_luna: Optional[IndicatorResult] = Field( - default=None, - description="Încasări luna curentă (RON)" - ) - plati_luna: Optional[IndicatorResult] = Field( - default=None, - description="Plăți luna curentă (RON)" - ) - cf_an_precedent: Optional[IndicatorResult] = Field( - default=None, - description="Cash Flow aceeași perioadă an precedent (RON)" - ) - datorii_restante: Optional[IndicatorResult] = Field( - default=None, - description="Total datorii cu scadență depășită (RON)" - ) - - class Config: - json_schema_extra = { - "example": { - "flux_net_lunar": { - "value": 125000.50, - "status": "good", - "threshold_min": 0, - "threshold_max": None, - "message": "Firma generează numerar" - }, - "cash_flow_ytd": { - "value": 850000.00, - "status": "good", - "threshold_min": 0, - "threshold_max": None - }, - "flux_net_yoy_pct": { - "value": 15.5, - "status": "good", - "threshold_min": 0, - "threshold_max": None, - "message": "Creștere cash flow față de anul anterior" - }, - "acoperire_cash_flow": { - "value": 2.5, - "status": "good", - "threshold_min": 1.0, - "threshold_max": None, - "message": "Cash flow suficient pentru acoperirea datoriilor" - } - } - } - - -class DynamicsIndicators(BaseModel): - """ - Indicatori de dinamică pentru evaluarea evoluției vânzărilor și achizițiilor. - - Arată dacă afacerea crește sau scade prin comparație YoY (Year-over-Year). - - SURSE DE DATE (toate FĂRĂ TVA): - - Vânzări: Cifra de Afaceri din VBAL (Clasa 7 - conturile 70x) - - Achiziții: Registru Jurnal ACT (stocuri 3x=4x + cheltuieli directe 6x=4x) - - Attributes: - crestere_vanzari_yoy: Creșterea procentuală a Cifrei de Afaceri față de anul anterior - - Formula: (CA_curent - CA_anterior) / CA_anterior * 100 - - Sursa: VBAL TOTCRED(70x) - TOTDEB(709) - - Good: > 5%, Warning: 0-5%, Danger: < 0% - - crestere_achizitii_yoy: Creșterea procentuală a achizițiilor totale față de anul anterior - - Formula: (achizitii_curent - achizitii_anterior) / achizitii_anterior * 100 - - Sursa: ACT (stocuri 3x=4x + cheltuieli directe 6x=4x, fără TVA) - - Creșterea achizițiilor poate indica expansiune sau costuri mai mari - - marja_implicita: Marja implicită din diferența CA - achiziții totale - - Formula: (CA - achizitii_totale) / CA * 100 - - Arată ce procent din Cifra de Afaceri rămâne după achiziții - - Good: > 20%, Warning: 10-20%, Danger: < 10% - """ - crestere_vanzari_yoy: IndicatorResult = Field( - description="Creștere vânzări YoY = (facturari_curent - facturari_anterior) / facturari_anterior * 100" - ) - crestere_achizitii_yoy: IndicatorResult = Field( - description="Creștere achiziții YoY = (achizitii_curent - achizitii_anterior) / achizitii_anterior * 100" - ) - marja_implicita: IndicatorResult = Field( - description="Marja implicită = (facturari - achizitii) / facturari * 100" - ) - # Sub-indicatori pentru verificare manuală - vanzari_an_curent: Optional[IndicatorResult] = Field( - default=None, - description="Total vânzări YTD an curent (RON)" - ) - vanzari_an_precedent: Optional[IndicatorResult] = Field( - default=None, - description="Total vânzări YTD an precedent (RON)" - ) - achizitii_an_curent: Optional[IndicatorResult] = Field( - default=None, - description="Total achiziții YTD an curent (stocuri + cheltuieli directe, fără TVA)" - ) - achizitii_an_precedent: Optional[IndicatorResult] = Field( - default=None, - description="Total achiziții YTD an precedent (stocuri + cheltuieli directe, fără TVA)" - ) - - class Config: - json_schema_extra = { - "example": { - "crestere_vanzari_yoy": { - "value": 12.5, - "status": "good", - "threshold_min": 5.0, - "threshold_max": None, - "message": "Creștere semnificativă a vânzărilor" - }, - "crestere_achizitii_yoy": { - "value": 8.3, - "status": "good", - "threshold_min": None, - "threshold_max": None, - "message": "Achiziții în creștere" - }, - "marja_implicita": { - "value": 25.5, - "status": "good", - "threshold_min": 20.0, - "threshold_max": None, - "message": "Marjă implicită sănătoasă" - } - } - } - - -class AltmanZScore(BaseModel): - """ - Altman Z-Score pentru evaluarea riscului de faliment. - - Folosim formula modificată pentru companii private (Z'-Score): - Z' = 6.56*X1 + 3.26*X2 + 6.72*X3 + 1.05*X4 - - Coeficienții sunt specifici pentru companii care nu sunt listate la bursă, - unde se folosește valoarea contabilă a capitalurilor proprii în loc de - valoarea de piață a acțiunilor. - - Componente: - X1: Working Capital / Total Assets - - Măsoară lichiditatea pe termen scurt - - Working capital = active curente - datorii curente - - X2: Retained Earnings / Total Assets - - Măsoară profitabilitatea cumulată (rezultat reportat) - - Include conturile 117 și 121 (rezultat reportat + rezultat curent) - - X3: EBIT / Total Assets - - Măsoară eficiența operațională - - EBIT = venituri din exploatare - cheltuieli operaționale - - X4: Book Value of Equity / Total Liabilities - - Măsoară solvabilitatea (acoperirea datoriilor cu capital propriu) - - Capital propriu / (datorii curente + datorii termen lung) - - Zone de risc: - - Safe Zone (zscore > 2.60): Risc minim de faliment - - Grey Zone (1.10 <= zscore <= 2.60): Risc moderat, necesită atenție - - Distress Zone (zscore < 1.10): Risc ridicat de faliment - - Attributes: - zscore: Scorul Altman Z calculat - status: Zona de risc ('safe', 'grey', sau 'distress') - x1: Componenta X1 (Working Capital / Total Assets) - x2: Componenta X2 (Retained Earnings / Total Assets) - x3: Componenta X3 (EBIT / Total Assets) - x4: Componenta X4 (Equity / Total Liabilities) - working_capital: Fondul de rulment (active curente - datorii curente) - total_assets: Total active - """ - zscore: IndicatorResult = Field( - description="Scorul Altman Z = 6.56*X1 + 3.26*X2 + 6.72*X3 + 1.05*X4" - ) - x1: IndicatorResult = Field( - description="X1 = Working Capital / Total Assets (lichiditate)" - ) - x2: IndicatorResult = Field( - description="X2 = Retained Earnings / Total Assets (profitabilitate)" - ) - x3: IndicatorResult = Field( - description="X3 = EBIT / Total Assets (eficiență operațională)" - ) - x4: IndicatorResult = Field( - description="X4 = Capitaluri Proprii / Datorii Totale (solvabilitate)" - ) - # Valori absolute pentru verificare manuală în balanță - capital_de_lucru: IndicatorResult = Field( - description="Capital de lucru = Active Curente - Datorii Curente" - ) - active_totale: IndicatorResult = Field( - description="Active Totale = Active Imobilizate + Active Curente" - ) - datorii_totale: IndicatorResult = Field( - description="Datorii Totale = Datorii Curente + Datorii Termen Lung" - ) - - class Config: - json_schema_extra = { - "example": { - "zscore": { - "value": 3.25, - "status": "safe", - "threshold_min": 2.60, - "threshold_max": None, - "message": "Zona sigură - risc minim de faliment" - }, - "x1": { - "value": 0.25, - "status": "good", - "threshold_min": 0, - "threshold_max": None - }, - "x2": { - "value": 0.15, - "status": "good", - "threshold_min": 0, - "threshold_max": None - }, - "x3": { - "value": 0.12, - "status": "good", - "threshold_min": 0, - "threshold_max": None - }, - "x4": { - "value": 1.80, - "status": "good", - "threshold_min": 1.0, - "threshold_max": None - }, - "capital_de_lucru": { - "value": 450000.00, - "status": "good", - "message": "Active Curente - Datorii Curente" - }, - "active_totale": { - "value": 1800000.00, - "status": "good", - "message": "Active Imobilizate + Active Curente" - }, - "datorii_totale": { - "value": 1200000.00, - "status": "good", - "message": "Datorii Curente + Datorii Termen Lung" - } - } - } - - -class ProfitabilityIndicators(BaseModel): - """ - Indicatori de profitabilitate pentru evaluarea randamentului afacerii. - - Calculează indicatori cheie pentru evaluarea profitabilității pe baza - datelor din balanța de verificare (VBAL): venituri, cheltuieli, active, capital. - - Attributes: - cifra_afaceri: Total venituri din activitatea operațională (Clasa 7) - - Reprezintă volumul total al vânzărilor - - Sursa: suma conturilor 70x-75x din VBAL - - cheltuieli_totale: Total cheltuieli operaționale (Clasa 6) - - Reprezintă costurile activității - - Sursa: suma conturilor 60x-65x din VBAL - - profit_brut: Diferența dintre venituri și cheltuieli (EBIT) - - Formula: cifra_afaceri - cheltuieli_totale - - Good: > 0, Danger: < 0 - - marja_profit_brut: Procentul de profit din vânzări - - Formula: profit_brut / cifra_afaceri * 100 - - Good: > 10%, Warning: 5-10%, Danger: < 5% - - roa: Return on Assets - randamentul activelor - - Formula: profit_brut / total_active * 100 - - Măsoară eficiența utilizării activelor - - Good: > 5%, Warning: 2-5%, Danger: < 2% - - roe: Return on Equity - randamentul capitalului propriu - - Formula: profit_brut / capitaluri_proprii * 100 - - Măsoară randamentul pentru acționari - - Good: > 10%, Warning: 5-10%, Danger: < 5% - """ - cifra_afaceri: IndicatorResult = Field( - description="Cifra de afaceri = Total venituri operaționale (Clasa 7)" - ) - # Cheltuieli separate pentru verificare - cheltuieli_operationale: IndicatorResult = Field( - description="Cheltuieli operaționale = Clasa 60x-65x + 68x (fără dobânzi 66x)" - ) - cheltuieli_financiare: IndicatorResult = Field( - description="Cheltuieli financiare = Clasa 66x (dobânzi, diferențe curs valutar)" - ) - cheltuieli_totale: IndicatorResult = Field( - description="Cheltuieli totale = Operaționale + Financiare" - ) - profit_brut: IndicatorResult = Field( - description="Profit brut (EBIT) = Venituri - Cheltuieli operaționale" - ) - # Sub-indicator pentru verificare EBIT - venituri: Optional[IndicatorResult] = Field( - default=None, - description="Total venituri (Clasa 7) - pentru verificare calcul EBIT (RON)" - ) - marja_profit_brut: IndicatorResult = Field( - description="Marja de profit = Profit brut / Cifra afaceri * 100" - ) - # Indicatori de bază pentru verificare ROA/ROE - active_totale: IndicatorResult = Field( - description="Active Totale - bază calcul ROA" - ) - capitaluri_proprii: IndicatorResult = Field( - description="Capitaluri Proprii - bază calcul ROE" - ) - roa: IndicatorResult = Field( - description="Randament Active (ROA) = Profit / Active Totale * 100" - ) - roe: IndicatorResult = Field( - description="Randament Capitaluri (ROE) = Profit / Capital Propriu * 100" - ) - - class Config: - json_schema_extra = { - "example": { - "cifra_afaceri": { - "value": 2500000.00, - "status": "good", - "threshold_min": None, - "threshold_max": None - }, - "cheltuieli_totale": { - "value": 2100000.00, - "status": "good", - "threshold_min": None, - "threshold_max": None - }, - "profit_brut": { - "value": 400000.00, - "status": "good", - "threshold_min": 0, - "threshold_max": None, - "message": "Profit operațional pozitiv" - }, - "marja_profit_brut": { - "value": 16.0, - "status": "good", - "threshold_min": 10.0, - "threshold_max": None - }, - "roa": { - "value": 8.5, - "status": "good", - "threshold_min": 5.0, - "threshold_max": None, - "message": "Randament bun al activelor" - }, - "roe": { - "value": 15.2, - "status": "good", - "threshold_min": 10.0, - "threshold_max": None, - "message": "Randament atractiv pentru acționari" - } - } - } - - -class SolvabilityIndicators(BaseModel): - """ - Indicatori de solvabilitate pentru evaluarea capacității firmei - de a-și acoperi datoriile pe termen lung. - - Conform articolului UniversulFiscal despre Activul Net Contabil (ANC): - - ANC = Total Active - Total Datorii - - Implicații legale (din 1 ianuarie 2026): Sub 50% din capital social - → restricții dividende, restituire împrumuturi, acordare împrumuturi noi - - Attributes: - activ_net_contabil: Activul Net Contabil (ANC) în RON - - Formula: Total Active - Total Datorii - - Good: > 0 (firma are avere netă pozitivă) - - Danger: <= 0 (firma este insolvabilă tehnic) - - rata_anc_capital: Rata ANC / Capital Social în % - - Formula: (ANC / Capital Social) × 100 - - Good: >= 100% (ANC acoperă integral capitalul social) - - Warning: 50-100% (ANC sub capital, dar peste pragul legal) - - Danger: < 50% (sub pragul legal - restricții aplicabile) - - total_active: Total Active - valoare de verificare - total_datorii: Total Datorii - valoare de verificare - capital_social: Capital Social - valoare de verificare - """ - activ_net_contabil: IndicatorResult = Field( - description="Activ Net Contabil = Total Active - Total Datorii (RON)" - ) - rata_anc_capital: IndicatorResult = Field( - description="Rata ANC/Capital = (ANC / Capital Social) × 100 (%)" - ) - # Valori de bază pentru verificare manuală în balanță - total_active: IndicatorResult = Field( - description="Total Active - bază calcul ANC" - ) - total_datorii: IndicatorResult = Field( - description="Total Datorii - bază calcul ANC" - ) - capital_social: IndicatorResult = Field( - description="Capital Social - bază calcul Rata ANC" - ) - - class Config: - json_schema_extra = { - "example": { - "activ_net_contabil": { - "value": 850000.00, - "status": "good", - "threshold_min": 0, - "threshold_max": None, - "message": "Activ net pozitiv - firma solvabilă" - }, - "rata_anc_capital": { - "value": 125.5, - "status": "good", - "threshold_min": 100.0, - "threshold_max": None, - "message": "ANC peste capitalul social - situație sănătoasă" - }, - "total_active": { - "value": 1800000.00, - "status": "good", - "threshold_min": None, - "threshold_max": None, - "message": "Active Imobilizate + Active Curente" - }, - "total_datorii": { - "value": 950000.00, - "status": "good", - "threshold_min": None, - "threshold_max": None, - "message": "Datorii Curente + Datorii Termen Lung" - }, - "capital_social": { - "value": 680000.00, - "status": "good", - "threshold_min": None, - "threshold_max": None, - "message": "Capital subscris și vărsat" - } - } - } - - -class FinancialIndicatorsResponse(BaseModel): - """ - Răspunsul complet al endpoint-ului /api/reports/dashboard/financial-indicators. - - Agregă toți indicatorii financiari calculați pentru o firmă și perioadă dată. - Acest model este folosit pentru serializarea JSON a răspunsului API. - - Attributes: - lichiditate: Indicatori de lichiditate (Current Ratio, Quick Ratio, Cash Ratio) - eficienta: Indicatori de eficiență (DSO, DPO, CCC, rate încasare/plată) - risc: Indicatori de risc (creanțe/datorii restante, raport datorii/trezorerie) - cash_flow: Indicatori de cash flow (flux net lunar, YTD, YoY, acoperire) - dinamica: Indicatori de dinamică (creștere vânzări/achiziții YoY, marjă) - altman_zscore: Scorul Altman Z-Score și componentele X1-X4 - profitabilitate: Indicatori de profitabilitate (ROA, ROE, marjă profit) - solvabilitate: Indicatori de solvabilitate (ANC, rata ANC/Capital Social) - - Usage: - GET /api/reports/dashboard/financial-indicators?company=123&luna=12&an=2024 - - Response example: - { - "lichiditate": { ... }, - "eficienta": { ... }, - "risc": { ... }, - "cash_flow": { ... }, - "dinamica": { ... }, - "altman_zscore": { ... }, - "profitabilitate": { ... }, - "solvabilitate": { ... } - } - """ - lichiditate: LiquidityIndicators = Field( - description="Indicatori de lichiditate: Current Ratio, Quick Ratio, Cash Ratio" - ) - eficienta: EfficiencyIndicators = Field( - description="Indicatori de eficiență: DSO, DPO, CCC, rate încasare/plată" - ) - risc: RiskIndicators = Field( - description="Indicatori de risc: creanțe/datorii restante, raport datorii/trezorerie" - ) - cash_flow: CashFlowIndicators = Field( - description="Indicatori de cash flow: flux net lunar, YTD, YoY, acoperire" - ) - dinamica: DynamicsIndicators = Field( - description="Indicatori de dinamică: creștere vânzări/achiziții YoY, marjă implicită" - ) - altman_zscore: AltmanZScore = Field( - description="Altman Z-Score și componentele X1-X4" - ) - profitabilitate: ProfitabilityIndicators = Field( - description="Indicatori de profitabilitate: ROA, ROE, marja de profit" - ) - solvabilitate: SolvabilityIndicators = Field( - description="Indicatori de solvabilitate: ANC, rata ANC/Capital Social" - ) - - class Config: - json_schema_extra = { - "example": { - "lichiditate": { - "lichiditate_curenta": {"value": 2.37, "status": "good", "threshold_min": 2.0}, - "lichiditate_imediata": {"value": 1.50, "status": "good", "threshold_min": 1.0}, - "lichiditate_vedere": {"value": 0.45, "status": "good", "threshold_min": 0.2} - }, - "eficienta": { - "dso": {"value": 28.5, "status": "good", "threshold_max": 30}, - "dpo": {"value": 35.2, "status": "good"}, - "cash_conversion_cycle": {"value": -6.7, "status": "good", "threshold_max": 0}, - "rata_incasare": {"value": 92.5, "status": "warning", "threshold_min": 95}, - "rata_plata": {"value": 88.3, "status": "good"} - }, - "risc": { - "creante_restante_pct": {"value": 15.5, "status": "good", "threshold_max": 20}, - "creante_90plus_pct": {"value": 3.2, "status": "good", "threshold_max": 5}, - "datorii_restante_pct": {"value": 8.5, "status": "good", "threshold_max": 10}, - "raport_datorii_trezorerie": {"value": 1.8, "status": "good", "threshold_max": 2} - }, - "cash_flow": { - "flux_net_lunar": {"value": 125000.50, "status": "good", "threshold_min": 0}, - "cash_flow_ytd": {"value": 850000.00, "status": "good", "threshold_min": 0}, - "flux_net_yoy_pct": {"value": 15.5, "status": "good", "threshold_min": 0}, - "acoperire_cash_flow": {"value": 2.5, "status": "good", "threshold_min": 1.0} - }, - "dinamica": { - "crestere_vanzari_yoy": {"value": 12.5, "status": "good", "threshold_min": 5.0}, - "crestere_achizitii_yoy": {"value": 8.3, "status": "good"}, - "marja_implicita": {"value": 25.5, "status": "good", "threshold_min": 20.0} - }, - "altman_zscore": { - "zscore": {"value": 3.25, "status": "safe", "threshold_min": 2.60}, - "x1": {"value": 0.25, "status": "good"}, - "x2": {"value": 0.15, "status": "good"}, - "x3": {"value": 0.12, "status": "good"}, - "x4": {"value": 1.80, "status": "good"}, - "working_capital": 450000.00, - "total_assets": 1800000.00 - }, - "solvabilitate": { - "activ_net_contabil": {"value": 850000.00, "status": "good", "threshold_min": 0}, - "rata_anc_capital": {"value": 125.5, "status": "good", "threshold_min": 100.0}, - "total_active": {"value": 1800000.00, "status": "good"}, - "total_datorii": {"value": 950000.00, "status": "good"}, - "capital_social": {"value": 680000.00, "status": "good"} - } - } - } diff --git a/deploy-package-20260223-151231/backend/modules/reports/models/invoice.py b/deploy-package-20260223-151231/backend/modules/reports/models/invoice.py deleted file mode 100644 index 844e509..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/models/invoice.py +++ /dev/null @@ -1,79 +0,0 @@ -""" -Modele Pydantic pentru facturi - Compatibile cu aplicația Flask existentă -""" -from pydantic import BaseModel, Field, validator -from datetime import date -from typing import Optional, List, Literal -from decimal import Decimal - -class InvoiceBase(BaseModel): - """Model de bază pentru factură - mapează exact pe rezultatul query-ului Flask""" - nume: str = Field(description="Numele partenerului") - nract: int = Field(description="Numărul actului") - dataact: Optional[date] = Field(description="Data actului") - datascad: Optional[date] = Field(description="Data scadentă") - contract: Optional[str] = Field(description="Numărul contractului") - cod_fiscal: Optional[str] = Field(description="Codul fiscal") - reg_comert: Optional[str] = Field(description="Registrul comerțului") - cont: Optional[str] = Field(description="Contul contabil") - valuta: str = Field(default="RON", description="Valuta (RON, EUR, USD, etc.)") - -class Invoice(InvoiceBase): - """Model complet pentru factură cu calcule financiare""" - totctva: Decimal = Field(description="Total cu TVA", decimal_places=2) - achitat: Decimal = Field(description="Suma achitată", decimal_places=2) - soldfinal: Decimal = Field(description="Soldul final", decimal_places=2) - css_class: Literal["", "invoice-paid", "invoice-overdue"] = Field( - default="", description="Clasa CSS pentru stilizare" - ) - - @validator('css_class', always=True) - def determine_css_class(cls, v, values): - """Determină automat clasa CSS bazată pe status factură""" - if 'soldfinal' in values and 'datascad' in values: - sold = values['soldfinal'] - data_scad = values['datascad'] - - if sold < 1: - return 'invoice-paid' - elif data_scad and data_scad < date.today() and sold != 0: - return 'invoice-overdue' - return '' - -class InvoiceFilter(BaseModel): - """Filtru pentru căutarea facturilor""" - company: str = Field(description="Codul firmei (schema Oracle)") - partner_type: Literal["CLIENTI", "FURNIZORI"] = Field(description="Tipul partenerului") - luna: Optional[int] = Field(default=None, ge=1, le=12, description="Luna contabilă (1-12)") - an: Optional[int] = Field(default=None, ge=2000, le=2100, description="Anul contabil") - partner_name: Optional[str] = Field(description="Filtru după nume") - cont: Optional[str] = Field(description="Filtru după cont contabil") - only_unpaid: bool = Field(default=True, description="Doar neachitate") - min_amount: Optional[Decimal] = Field(description="Suma minimă") - max_amount: Optional[Decimal] = Field(description="Suma maximă") - page: int = Field(default=1, ge=1, description="Pagina") - page_size: int = Field(default=50, ge=1, le=10000000, description="Mărimea paginii") - -class InvoiceListResponse(BaseModel): - """Răspuns pentru lista de facturi""" - invoices: List[Invoice] - total_count: int - filtered_count: int - total_amount: Decimal - page: int - page_size: int - has_more: bool - accounting_period: Optional[dict] = Field(default=None, description="Perioada contabilă (an, luna)") - # Total sold din TOATE facturile filtrate (nu doar pagina curentă) - total_sold_all: Decimal = Field(default=Decimal('0.00'), description="Total sold din toate facturile filtrate") - -class InvoiceSummary(BaseModel): - """Rezumat pentru facturi - pentru dashboard""" - company: str - partner_type: str - total_invoices: int - total_amount: Decimal - paid_amount: Decimal - outstanding_amount: Decimal - overdue_amount: Decimal - overdue_count: int \ No newline at end of file diff --git a/deploy-package-20260223-151231/backend/modules/reports/models/treasury.py b/deploy-package-20260223-151231/backend/modules/reports/models/treasury.py deleted file mode 100644 index bc652fd..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/models/treasury.py +++ /dev/null @@ -1,52 +0,0 @@ -from pydantic import BaseModel -from decimal import Decimal -from datetime import datetime -from typing import Optional, List - -class AccountingPeriod(BaseModel): - """Model pentru perioada contabilă""" - an: Optional[int] = None - luna: Optional[int] = None - -class BankCashRegister(BaseModel): - """Model pentru Registrul de Casă și Bancă""" - nume: str - nract: Optional[int] = None - dataact: Optional[datetime] = None - nume_cont_bancar: str # din vbalanta_parteneri.nume - incasari: Decimal - plati: Decimal - sold: Decimal - valuta: Optional[str] = None - tip_registru: str # "BANCA LEI", "CASA VALUTA" etc - explicatia: str - -class RegisterFilter(BaseModel): - """Filtre pentru registrul de casă și bancă""" - company: str - register_type: Optional[str] = None # BANCA_LEI, BANCA_VALUTA, CASA_LEI, CASA_VALUTA sau None pentru toate - luna: Optional[int] = None # Luna contabilă (1-12) pentru PACK_SESIUNE - an: Optional[int] = None # Anul contabil pentru PACK_SESIUNE - date_from: Optional[datetime] = None - date_to: Optional[datetime] = None - partner_name: Optional[str] = None - bank_account: Optional[str] = None # Filter for specific bank/cash account (bancasa) - page: int = 1 - page_size: int = 50 - -class RegisterListResponse(BaseModel): - """Răspuns pentru lista din registru""" - registers: List[BankCashRegister] - total_count: int - filtered_count: int - total_incasari: Decimal - total_plati: Decimal - page: int - page_size: int - has_more: bool - accounting_period: Optional[AccountingPeriod] = None - # Totaluri din TOATE înregistrările filtrate (nu doar pagina curentă) - sold_precedent_all: Decimal = Decimal('0.00') - total_incasari_all: Decimal = Decimal('0.00') - total_plati_all: Decimal = Decimal('0.00') - sold_final_all: Decimal = Decimal('0.00') \ No newline at end of file diff --git a/deploy-package-20260223-151231/backend/modules/reports/models/trial_balance.py b/deploy-package-20260223-151231/backend/modules/reports/models/trial_balance.py deleted file mode 100644 index 23741df..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/models/trial_balance.py +++ /dev/null @@ -1,102 +0,0 @@ -""" -Pydantic models for Trial Balance (Balanță de Verificare) -Maps to Oracle VBAL VIEW (exists in each company schema) -""" -from pydantic import BaseModel, Field -from typing import Optional, List -from decimal import Decimal - -class TrialBalanceItem(BaseModel): - """ - Individual trial balance record from VBAL VIEW - Real structure from Oracle: - - CONT: account number - - DENUMIRE: account description - - PRECDEB/PRECCRED: previous balance debit/credit - - RULDEB/RULCRED: monthly movement debit/credit - - SOLDDEB/SOLDCRED: final balance debit/credit - """ - cont: str = Field(description="Număr cont contabil (CONT)") - denumire: Optional[str] = Field(default="", description="Denumire cont (DENUMIRE)") - sold_precedent_debit: Decimal = Field(description="Sold precedent debit (PRECDEB)", decimal_places=2) - sold_precedent_credit: Decimal = Field(description="Sold precedent credit (PRECCRED)", decimal_places=2) - rulaj_lunar_debit: Decimal = Field(description="Rulaj lunar debit (RULDEB)", decimal_places=2) - rulaj_lunar_credit: Decimal = Field(description="Rulaj lunar credit (RULCRED)", decimal_places=2) - sold_final_debit: Decimal = Field(description="Sold final debit (SOLDDEB)", decimal_places=2) - sold_final_credit: Decimal = Field(description="Sold final credit (SOLDCRED)", decimal_places=2) - - class Config: - from_attributes = True - - -class TrialBalanceFilters(BaseModel): - """ - Filters applied to trial balance data - """ - luna: int = Field(description="Luna (1-12)") - an: int = Field(description="An") - cont_filter: Optional[str] = Field(default=None, description="Filtru număr cont (partial match)") - denumire_filter: Optional[str] = Field(default=None, description="Filtru denumire cont (partial match, case-insensitive)") - - -class TrialBalancePagination(BaseModel): - """ - Pagination metadata - """ - total_items: int = Field(description="Total number of items") - total_pages: int = Field(description="Total number of pages") - current_page: int = Field(description="Current page number") - page_size: int = Field(description="Items per page") - - -class TrialBalanceTotals(BaseModel): - """ - Totals for all 6 columns from all filtered records (not just current page) - """ - total_sold_precedent_debit: Decimal = Decimal('0.00') - total_sold_precedent_credit: Decimal = Decimal('0.00') - total_rulaj_lunar_debit: Decimal = Decimal('0.00') - total_rulaj_lunar_credit: Decimal = Decimal('0.00') - total_sold_final_debit: Decimal = Decimal('0.00') - total_sold_final_credit: Decimal = Decimal('0.00') - - -class TrialBalanceResponse(BaseModel): - """ - Complete response for trial balance endpoint - """ - success: bool = Field(default=True, description="Request success status") - data: dict = Field(description="Trial balance data with items, pagination, and filters") - - class Config: - json_schema_extra = { - "example": { - "success": True, - "data": { - "items": [ - { - "cont": "4111", - "dcont": "Furnizori interni", - "sold_precedent_debit": 0.00, - "sold_precedent_credit": 15000.00, - "rulaj_lunar_debit": 5000.00, - "rulaj_lunar_credit": 8000.00, - "sold_final_debit": 0.00, - "sold_final_credit": 18000.00 - } - ], - "pagination": { - "total_items": 150, - "total_pages": 3, - "current_page": 1, - "page_size": 50 - }, - "filters_applied": { - "luna": 11, - "an": 2025, - "cont_filter": None, - "denumire_filter": "furnizori" - } - } - } - } diff --git a/deploy-package-20260223-151231/backend/modules/reports/routers/__init__.py b/deploy-package-20260223-151231/backend/modules/reports/routers/__init__.py deleted file mode 100644 index 1df06cb..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/routers/__init__.py +++ /dev/null @@ -1,36 +0,0 @@ -"""Reports module router factory.""" - -from fastapi import APIRouter - - -def create_reports_router() -> APIRouter: - """ - Create and configure Reports module router. - - Includes all report-related endpoints: - - /invoices - Invoice management - - /dashboard - Dashboard and metrics - - /treasury - Treasury operations - - /trial-balance - Trial balance reports - - /cache - Cache management - - Returns: - APIRouter: Configured router for reports module - """ - router = APIRouter() - - # Import routers here to avoid circular imports - from .invoices import router as invoices_router - from .dashboard import router as dashboard_router - from .treasury import router as treasury_router - from .trial_balance import router as trial_balance_router - from .cache import router as cache_router - - # Include all sub-routers (no prefix - already prefixed in main.py with /api/reports) - router.include_router(invoices_router, prefix="/invoices", tags=["reports-invoices"]) - router.include_router(dashboard_router, prefix="/dashboard", tags=["reports-dashboard"]) - router.include_router(treasury_router, prefix="/treasury", tags=["reports-treasury"]) - router.include_router(trial_balance_router, prefix="/trial-balance", tags=["reports-trial-balance"]) - router.include_router(cache_router, prefix="/cache", tags=["reports-cache"]) - - return router diff --git a/deploy-package-20260223-151231/backend/modules/reports/routers/cache.py b/deploy-package-20260223-151231/backend/modules/reports/routers/cache.py deleted file mode 100644 index 195de57..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/routers/cache.py +++ /dev/null @@ -1,398 +0,0 @@ -""" -API Router pentru managementul cache-ului -""" -from fastapi import APIRouter, Depends, HTTPException, Request -from pydantic import BaseModel -from typing import Optional, Dict, Any -# import sys # Removed - no longer needed -import os -import time -from datetime import datetime, timedelta - - -from shared.auth.dependencies import get_current_user -from shared.auth.models import CurrentUser -from ..cache import get_cache, get_event_monitor, toggle_event_monitor - -router = APIRouter(tags=["cache"]) - - -# Pydantic Models - -class CacheStatsResponse(BaseModel): - """Răspuns statistici cache""" - enabled: bool - global_enabled: bool - user_enabled: bool - cache_type: str - hit_rate: float - total_hits: int - total_misses: int - queries_saved: Dict[str, int] - response_times: Dict[str, Dict[str, Any]] - cache_size: Dict[str, int] - auto_invalidate: bool - last_cleanup: Optional[str] = None - - -class InvalidateCacheRequest(BaseModel): - """Request pentru invalidare cache""" - company_id: Optional[int] = None - cache_type: Optional[str] = None - - -class ToggleUserCacheRequest(BaseModel): - """Request pentru toggle cache per-user""" - enabled: bool - - -class ToggleGlobalCacheRequest(BaseModel): - """Request pentru toggle cache global""" - enabled: bool - - -class ToggleAutoInvalidateRequest(BaseModel): - """Request pentru toggle auto-invalidation""" - enabled: bool - - -# Helper Functions - -async def _calculate_cache_stats() -> Dict[str, Any]: - """Calculate comprehensive cache statistics""" - cache = get_cache() - if not cache: - raise HTTPException(status_code=503, detail="Cache not initialized") - - # Get basic cache stats - stats = await cache.get_stats() - - # Calculate hit rate - memory_stats = stats.get('memory', {}) - total_hits = memory_stats.get('hits', 0) - total_misses = memory_stats.get('misses', 0) - total_requests = total_hits + total_misses - hit_rate = (total_hits / total_requests * 100) if total_requests > 0 else 0 - - # Calculate queries saved (from performance_log) - queries_saved = await _calculate_queries_saved(cache) - - # Calculate response times per cache type - response_times = await _calculate_response_times(cache) - - # Get cache sizes - cache_size = { - 'memory': memory_stats.get('size', 0), - 'sqlite': stats.get('sqlite', {}).get('active_entries', 0) - } - - # Get event monitor status - monitor = get_event_monitor() - auto_invalidate = monitor.running if monitor else False - - return { - 'enabled': cache.config.enabled, - 'global_enabled': cache.config.enabled, - 'cache_type': cache.config.cache_type, - 'hit_rate': round(hit_rate, 1), - 'total_hits': total_hits, - 'total_misses': total_misses, - 'queries_saved': queries_saved, - 'response_times': response_times, - 'cache_size': cache_size, - 'auto_invalidate': auto_invalidate, - 'last_cleanup': None # TODO: track last cleanup time - } - - -async def _calculate_queries_saved(cache) -> Dict[str, int]: - """Calculate queries saved by time period""" - import aiosqlite - - try: - async with aiosqlite.connect(cache.sqlite.db_path) as db: - now = time.time() - today_start = now - 86400 # 24 hours - week_start = now - 604800 # 7 days - - # Today - async with db.execute(""" - SELECT COUNT(*) FROM performance_log - WHERE cache_hit = 1 AND timestamp >= ? - """, (today_start,)) as cursor: - today = (await cursor.fetchone())[0] - - # This week - async with db.execute(""" - SELECT COUNT(*) FROM performance_log - WHERE cache_hit = 1 AND timestamp >= ? - """, (week_start,)) as cursor: - week = (await cursor.fetchone())[0] - - # All time - async with db.execute(""" - SELECT COUNT(*) FROM performance_log - WHERE cache_hit = 1 - """) as cursor: - total = (await cursor.fetchone())[0] - - return { - 'today': today, - 'week': week, - 'total': total - } - except Exception as e: - return {'today': 0, 'week': 0, 'total': 0} - - -async def _calculate_response_times(cache) -> Dict[str, Dict[str, Any]]: - """Calculate average response times per cache type""" - import aiosqlite - - try: - async with aiosqlite.connect(cache.sqlite.db_path) as db: - # Get average times per cache type - async with db.execute(""" - SELECT - cache_type, - AVG(CASE WHEN cache_hit = 1 THEN response_time_ms ELSE NULL END) as avg_cached, - AVG(CASE WHEN cache_hit = 0 THEN response_time_ms ELSE NULL END) as avg_oracle - FROM performance_log - WHERE timestamp >= ? - GROUP BY cache_type - """, (time.time() - 86400,)) as cursor: # Last 24 hours - results = await cursor.fetchall() - - response_times = {} - for row in results: - cache_type, avg_cached, avg_oracle = row - if avg_cached and avg_oracle: - improvement = int((avg_oracle - avg_cached) / avg_oracle * 100) - response_times[cache_type] = { - 'cached': int(avg_cached), - 'oracle': int(avg_oracle), - 'improvement': improvement - } - - return response_times - except Exception as e: - return {} - - -# API Endpoints - -@router.get("/stats", response_model=CacheStatsResponse) -async def get_cache_stats( - current_user: CurrentUser = Depends(get_current_user) -): - """ - Obține statistici complete cache - - Returns: - - Hit rate, queries saved, response times - - Cache sizes (memory + SQLite) - - Auto-invalidation status - - Per-user cache setting - """ - try: - cache = get_cache() - if not cache: - raise HTTPException(status_code=503, detail="Cache not initialized") - - # Get base stats - stats = await _calculate_cache_stats() - - # Add user-specific setting - user_enabled = await cache.is_enabled_for_user(current_user.username) - stats['user_enabled'] = user_enabled - - return CacheStatsResponse(**stats) - - except Exception as e: - raise HTTPException(status_code=500, detail=f"Error retrieving cache stats: {str(e)}") - - -@router.post("/invalidate") -async def invalidate_cache( - request: InvalidateCacheRequest, - current_user: CurrentUser = Depends(get_current_user) -): - """ - Invalidează cache - - Args: - company_id: Opțional - invalidează doar pentru această companie - cache_type: Opțional - invalidează doar acest tip de cache - - Returns: - Message de confirmare - """ - try: - cache = get_cache() - if not cache: - raise HTTPException(status_code=503, detail="Cache not initialized") - - await cache.invalidate( - company_id=request.company_id, - cache_type=request.cache_type - ) - - if request.company_id and request.cache_type: - message = f"Cache invalidated for company {request.company_id}, type {request.cache_type}" - elif request.company_id: - message = f"Cache invalidated for company {request.company_id}" - elif request.cache_type: - message = f"Cache invalidated for type {request.cache_type}" - else: - message = "All cache invalidated" - - return { - "success": True, - "message": message, - "invalidated_at": datetime.now().isoformat() - } - - except Exception as e: - raise HTTPException(status_code=500, detail=f"Error invalidating cache: {str(e)}") - - -@router.post("/toggle-user") -async def toggle_user_cache( - request: ToggleUserCacheRequest, - current_user: CurrentUser = Depends(get_current_user) -): - """ - Toggle cache per-user - - Permite utilizatorului să activeze/dezactiveze cache-ul pentru el - Folosit pentru A/B testing și comparații de performanță - - Args: - enabled: True pentru activare, False pentru dezactivare - - Returns: - Noul status - """ - try: - cache = get_cache() - if not cache: - raise HTTPException(status_code=503, detail="Cache not initialized") - - await cache.set_user_cache_enabled(current_user.username, request.enabled) - - return { - "success": True, - "username": current_user.username, - "cache_enabled": request.enabled, - "message": f"Cache {'enabled' if request.enabled else 'disabled'} for user {current_user.username}" - } - - except Exception as e: - raise HTTPException(status_code=500, detail=f"Error toggling user cache: {str(e)}") - - -@router.post("/toggle-global") -async def toggle_global_cache( - request: ToggleGlobalCacheRequest, - current_user: CurrentUser = Depends(get_current_user) -): - """ - Toggle cache global (ADMIN only) - - Activează/dezactivează cache-ul la nivel global pentru toți utilizatorii - - Args: - enabled: True pentru activare, False pentru dezactivare - - Returns: - Noul status global - """ - try: - # TODO: Add admin permission check - # For now, allow any authenticated user - - cache = get_cache() - if not cache: - raise HTTPException(status_code=503, detail="Cache not initialized") - - # Update config (NOTE: This is runtime only, .env needs manual update) - cache.config.enabled = request.enabled - - return { - "success": True, - "global_enabled": request.enabled, - "message": f"Cache {'enabled' if request.enabled else 'disabled'} globally", - "note": "This change is runtime only. Update .env CACHE_ENABLED for persistence." - } - - except Exception as e: - raise HTTPException(status_code=500, detail=f"Error toggling global cache: {str(e)}") - - -@router.post("/toggle-auto-invalidate") -async def toggle_auto_invalidation( - request: ToggleAutoInvalidateRequest, - current_user: CurrentUser = Depends(get_current_user) -): - """ - Toggle auto-invalidation monitoring - - Activează/dezactivează monitorizarea automată a {schema}.act - pentru invalidarea cache-ului când se detectează modificări - - Args: - enabled: True pentru activare, False pentru dezactivare - - Returns: - Noul status auto-invalidation - """ - try: - # TODO: Add admin permission check - # For now, allow any authenticated user - - await toggle_event_monitor(request.enabled) - - return { - "success": True, - "auto_invalidate_enabled": request.enabled, - "message": f"Auto-invalidation {'enabled' if request.enabled else 'disabled'}", - "note": "Monitors max(id_act) in {schema}.act tables for changes" - } - - except Exception as e: - raise HTTPException(status_code=500, detail=f"Error toggling auto-invalidation: {str(e)}") - - -@router.get("/health") -async def cache_health(): - """ - Health check pentru sistemul de cache - - Returns: - Status cache, mărime, și uptime - """ - try: - cache = get_cache() - if not cache: - return { - "status": "not_initialized", - "enabled": False - } - - stats = await cache.get_stats() - monitor = get_event_monitor() - - return { - "status": "healthy", - "enabled": cache.config.enabled, - "cache_type": cache.config.cache_type, - "memory_size": stats.get('memory', {}).get('size', 0), - "sqlite_size": stats.get('sqlite', {}).get('active_entries', 0), - "auto_invalidate_running": monitor.running if monitor else False - } - - except Exception as e: - return { - "status": "error", - "error": str(e) - } diff --git a/deploy-package-20260223-151231/backend/modules/reports/routers/dashboard.py b/deploy-package-20260223-151231/backend/modules/reports/routers/dashboard.py deleted file mode 100644 index a9cd6e2..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/routers/dashboard.py +++ /dev/null @@ -1,661 +0,0 @@ -from fastapi import APIRouter, Depends, HTTPException, Query, Request -from typing import Optional -import os - -from shared.auth.dependencies import get_current_user -from shared.auth.models import CurrentUser -import logging - -logger = logging.getLogger(__name__) -from ..models.dashboard import DashboardSummary, TrendsResponse, TrendData -from ..models.financial_indicators import FinancialIndicatorsResponse -from ..services.dashboard_service import DashboardService -from ..services.financial_indicators_service import FinancialIndicatorsService -from ..cache.decorators import cached - -router = APIRouter() - -@router.get("/summary") -async def get_dashboard_summary( - request: Request, - company: str = Query(description="Codul firmei"), - luna: Optional[int] = Query(None, ge=1, le=12, description="Luna contabilă (1-12)"), - an: Optional[int] = Query(None, ge=2000, le=2100, description="Anul contabil"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Obține toate datele pentru dashboard într-un singur apel - - - Necesită autentificare JWT - - Returnează statistici clienți/furnizori și trezorerie - - Include metadata cache pentru Telegram Bot (X-Include-Cache-Metadata header) - - Suportă filtrare pe luna/an contabil (dacă nu sunt specificate, folosește ultima perioadă) - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if company not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - result = await DashboardService.get_complete_summary(company, current_user.username, luna=luna, an=an, request=request, server_id=server_id) - - # Convert Pydantic model to dict for JSON serialization - result_dict = result.dict() if hasattr(result, 'dict') else result - - # Add cache metadata if requested (for Telegram Bot) - include_metadata = request.headers.get('X-Include-Cache-Metadata', '').lower() == 'true' - if include_metadata: - cache_hit = getattr(request.state, 'cache_hit', False) - response_time = getattr(request.state, 'response_time_ms', 0) - cache_source = getattr(request.state, 'cache_source', None) - result_dict['cache_hit'] = cache_hit - result_dict['response_time_ms'] = response_time - # Always include cache_source, even if None - result_dict['cache_source'] = cache_source - - return result_dict - - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - raise HTTPException(status_code=500, detail=f"Eroare la obținerea datelor dashboard: {str(e)}") - -@router.get("/trends", response_model=TrendsResponse) -async def get_dashboard_trends( - request: Request, - company: str = Query(description="Codul firmei"), - period: str = Query(default="30d", description="Perioada pentru trends: 7d, 30d, ytd, 12m"), - luna: Optional[int] = Query(None, ge=1, le=12, description="Luna contabilă (1-12)"), - an: Optional[int] = Query(None, ge=2000, le=2100, description="Anul contabil"), - compare_previous: bool = Query(default=True, description="Compară cu perioada anterioară"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Obține trenduri pentru indicatorii principali (clienți/furnizori) - - - period: "7d" (7 zile), "30d" (30 zile), "ytd" (year to date), "12m" (12 luni) - - luna/an: perioada contabilă de referință (dacă nu sunt specificate, folosește ultima perioadă) - - compare_previous: dacă să compare cu perioada anterioară - - Necesită autentificare JWT - - Returnează date pentru grafice de trenduri - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if company not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - # Validează perioada - valid_periods = ["7d", "30d", "ytd", "12m"] - if period not in valid_periods: - raise HTTPException( - status_code=400, - detail=f"Perioadă nevalidă: {period}. Valori permise: {', '.join(valid_periods)}" - ) - - server_id = getattr(request.state, 'server_id', None) - # Obține datele de trenduri - result = await DashboardService.get_trends(int(company), period, luna=luna, an=an, request=request, server_id=server_id) - - # Convert to dict if needed - result_dict = result.dict() if hasattr(result, 'dict') else result - - # Add cache metadata if requested (for Telegram Bot) - include_metadata = request.headers.get('X-Include-Cache-Metadata', '').lower() == 'true' - if include_metadata: - cache_hit = getattr(request.state, 'cache_hit', False) - response_time = getattr(request.state, 'response_time_ms', 0) - cache_source = getattr(request.state, 'cache_source', None) - result_dict['cache_hit'] = cache_hit - result_dict['response_time_ms'] = response_time - # Always include cache_source, even if None - result_dict['cache_source'] = cache_source - - # Return as TrendsResponse - return TrendsResponse(**result_dict) - - except ValueError as e: - logger.error(f"Value error in trends endpoint: {str(e)}") - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - logger.error(f"Eroare la obținerea trendurilor: {str(e)}") - raise HTTPException(status_code=500, detail=f"Eroare la obținerea trendurilor: {str(e)}") - -@router.get("/detailed-data") -async def get_detailed_data( - request: Request, - company: str = Query(description="Codul firmei"), - data_type: str = Query(description="Tipul de date: clients, suppliers, treasury"), - luna: Optional[int] = Query(None, ge=1, le=12, description="Luna contabilă (1-12)"), - an: Optional[int] = Query(None, ge=2000, le=2100, description="Anul contabil"), - page: int = Query(default=1, ge=1), - page_size: int = Query(default=25, ge=1, le=100), - search: str = Query(default="", description="Termen de căutare"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Obține date detaliate pentru tabelele din dashboard - """ - logger.info(f"[ROUTER] detailed-data called: company={company}, data_type={data_type}") - try: - if company not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - logger.info(f"[ROUTER] Calling DashboardService.get_detailed_data") - result = await DashboardService.get_detailed_data( - company=company, - data_type=data_type, - luna=luna, - an=an, - page=page, - page_size=page_size, - search=search, - server_id=server_id - ) - - logger.info(f"[ROUTER] Service returned: {len(result.get('data', []))} rows") - return result - - except Exception as e: - logger.error(f"Eroare la obținerea datelor detaliate: {str(e)}") - raise HTTPException(status_code=500, detail=str(e)) - -@router.get("/performance") -async def get_performance( - request: Request, - company: int = Query(..., description="ID-ul firmei"), - period: str = Query("7d", regex="^(7d|1m|3m|6m|ytd|12m)$", description="Perioada pentru analiză"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Returnează date performanță pentru perioada selectată - - - Necesită autentificare JWT - - Returnează grafice încasări vs plăți pentru perioada selectată - - Calculează indicatori: rata încasării, cash conversion, working capital - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if str(company) not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - result = await DashboardService.get_performance_data(company, period, server_id=server_id) - - # Convert to Chart.js compatible format - return { - "labels": result.get("labels", []), - "datasets": [{ - "data": result.get("data", []), - "label": result.get("label", "Performance"), - "borderColor": result.get("borderColor", "#3B82F6"), - "backgroundColor": result.get("backgroundColor", "rgba(59, 130, 246, 0.1)"), - "tension": 0.4 - }] - } - - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - logger.error(f"Eroare la obținerea datelor de performanță: {str(e)}") - raise HTTPException(status_code=500, detail=f"Eroare la obținerea datelor de performanță: {str(e)}") - -@router.get("/cashflow") -async def get_cashflow( - request: Request, - company: int = Query(..., description="ID-ul firmei"), - period: str = Query("7d", regex="^(7d|1m|3m|6m)$", description="Perioada pentru previziune"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Returnează previziune cash flow pentru perioada selectată - - - Necesită autentificare JWT - - Analizează scadențele viitoare pentru calculul cash flow-ului - - Identifică zilele critice cu deficit de cash - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if str(company) not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - result = await DashboardService.get_cashflow_forecast(company, period, server_id=server_id) - - # Convert to Chart.js compatible format - return { - "labels": result.get("labels", []), - "datasets": [{ - "data": result.get("data", []), - "label": result.get("label", "Cash Flow"), - "borderColor": result.get("borderColor", "#10B981"), - "backgroundColor": result.get("backgroundColor", "rgba(16, 185, 129, 0.1)"), - "tension": 0.4 - }] - } - - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - logger.error(f"Eroare la obținerea previziunii cash flow: {str(e)}") - raise HTTPException(status_code=500, detail=f"Eroare la obținerea previziunii cash flow: {str(e)}") - -@router.get("/maturity") -async def get_maturity_analysis( - request: Request, - company: int = Query(..., description="ID-ul firmei"), - period: str = Query("7d", regex="^(7d|1m|3m|6m|12m|all)$", description="Orizont de planificare pentru analiza scadențelor"), - luna: Optional[int] = Query(None, ge=1, le=12, description="Luna contabilă (1-12)"), - an: Optional[int] = Query(None, ge=2000, le=2100, description="Anul contabil"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Returnează analiza scadențelor pentru orizontul de planificare selectat - - - Necesită autentificare JWT - - Logică: Include TOATE restanțele + scadențele viitoare din perioada selectată - - luna/an: perioada contabilă de referință (dacă nu sunt specificate, folosește ultima perioadă) - - Perioade disponibile: - * 7d: Toate restanțele + scadențe următoarelor 7 zile - * 1m: Toate restanțele + scadențe următoarelor 30 zile - * 3m: Toate restanțele + scadențe următoarelor 90 zile - * 6m: Toate restanțele + scadențe următoarelor 180 zile - * 12m: Toate restanțele + scadențe următoarelor 365 zile - * all: Toate soldurile (fără filtru) - - Compară scadențele clienți vs furnizori - - Calculează balanța și oferă recomandări - - Returnează metadate cu statistici complete - - Include metadata cache pentru Telegram Bot (X-Include-Cache-Metadata header) - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if str(company) not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - result = await DashboardService.get_maturity_analysis(company, period, luna=luna, an=an, request=request, server_id=server_id) - - # Convert to dict if needed - result_dict = result.dict() if hasattr(result, 'dict') else result - - # Add cache metadata if requested (for Telegram Bot) - include_metadata = request.headers.get('X-Include-Cache-Metadata', '').lower() == 'true' - if include_metadata: - cache_hit = getattr(request.state, 'cache_hit', False) - response_time = getattr(request.state, 'response_time_ms', 0) - cache_source = getattr(request.state, 'cache_source', None) - result_dict['cache_hit'] = cache_hit - result_dict['response_time_ms'] = response_time - # Always include cache_source, even if None - result_dict['cache_source'] = cache_source - - return result_dict - - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - logger.error(f"Eroare la obținerea analizei scadențelor: {str(e)}") - raise HTTPException(status_code=500, detail=f"Eroare la obținerea analizei scadențelor: {str(e)}") - -@router.get("/monthly-flows") -async def get_monthly_flows( - request: Request, - company: int = Query(..., description="ID-ul firmei"), - luna: Optional[int] = Query(None, ge=1, le=12, description="Luna contabilă (1-12)"), - an: Optional[int] = Query(None, ge=2000, le=2100, description="Anul contabil"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Returnează fluxurile lunare pentru firma selectată - - - Necesită autentificare JWT - - Returnează date pentru analiza fluxurilor lunare - - luna/an: perioada contabilă de referință (dacă nu sunt specificate, folosește ultima perioadă) - - Include metadata cache pentru Telegram Bot (X-Include-Cache-Metadata header) - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if str(company) not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - # Apelăm serviciul cu request pentru cache metadata - result = await DashboardService.get_monthly_flows(company, luna=luna, an=an, request=request, server_id=server_id) - - # Convert to dict if needed - result_dict = result.dict() if hasattr(result, 'dict') else result - - # Add cache metadata if requested (for Telegram Bot / Dashboard) - include_metadata = request.headers.get('X-Include-Cache-Metadata', '').lower() == 'true' - if include_metadata: - cache_hit = getattr(request.state, 'cache_hit', False) - response_time = getattr(request.state, 'response_time_ms', 0) - cache_source = getattr(request.state, 'cache_source', None) - result_dict['cache_hit'] = cache_hit - result_dict['response_time_ms'] = response_time - result_dict['cache_source'] = cache_source - - return result_dict - - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - logger.error(f"Eroare la obținerea fluxurilor lunare: {str(e)}") - raise HTTPException(status_code=500, detail=f"Eroare la obținerea fluxurilor lunare: {str(e)}") - -@router.get("/treasury-breakdown") -async def get_treasury_breakdown( - request: Request, - company: int = Query(..., description="ID-ul firmei"), - luna: Optional[int] = Query(None, ge=1, le=12, description="Luna contabilă (1-12)"), - an: Optional[int] = Query(None, ge=2000, le=2100, description="Anul contabil"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Returnează defalcarea trezoreriei pentru firma selectată - - - Necesită autentificare JWT - - Returnează distribuția soldurilor pe conturi și tipuri - - luna/an: perioada contabilă de referință (dacă nu sunt specificate, folosește ultima perioadă) - - Include metadata cache pentru Telegram Bot (X-Include-Cache-Metadata header) - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if str(company) not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - result = await DashboardService.get_treasury_breakdown(company, luna=luna, an=an, request=request, server_id=server_id) - - # Convert to dict if needed - result_dict = result.dict() if hasattr(result, 'dict') else result - - # Add cache metadata if requested (for Telegram Bot) - include_metadata = request.headers.get('X-Include-Cache-Metadata', '').lower() == 'true' - if include_metadata: - cache_hit = getattr(request.state, 'cache_hit', False) - response_time = getattr(request.state, 'response_time_ms', 0) - cache_source = getattr(request.state, 'cache_source', None) - result_dict['cache_hit'] = cache_hit - result_dict['response_time_ms'] = response_time - # Always include cache_source, even if None - result_dict['cache_source'] = cache_source - - return result_dict - - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - logger.error(f"Eroare la obținerea defalcării trezoreriei: {str(e)}") - raise HTTPException(status_code=500, detail=f"Eroare la obținerea defalcării trezoreriei: {str(e)}") - -@router.get("/net-balance-breakdown") -async def get_net_balance_breakdown( - request: Request, - company: int = Query(..., description="ID-ul firmei"), - luna: Optional[int] = Query(None, ge=1, le=12, description="Luna contabilă (1-12)"), - an: Optional[int] = Query(None, ge=2000, le=2100, description="Anul contabil"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Returnează defalcarea balanței nete pentru firma selectată - - - Necesită autentificare JWT - - Returnează analiza detaliată a balanței nete - - luna/an: perioada contabilă de referință (dacă nu sunt specificate, folosește ultima perioadă) - - Include metadata cache pentru Telegram Bot (X-Include-Cache-Metadata header) - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if str(company) not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - result = await DashboardService.get_net_balance_breakdown(company, luna=luna, an=an, request=request, server_id=server_id) - - # Convert to dict if needed - result_dict = result.dict() if hasattr(result, 'dict') else result - - # Add cache metadata if requested (for Telegram Bot) - include_metadata = request.headers.get('X-Include-Cache-Metadata', '').lower() == 'true' - if include_metadata: - cache_hit = getattr(request.state, 'cache_hit', False) - response_time = getattr(request.state, 'response_time_ms', 0) - cache_source = getattr(request.state, 'cache_source', None) - result_dict['cache_hit'] = cache_hit - result_dict['response_time_ms'] = response_time - # Always include cache_source, even if None - result_dict['cache_source'] = cache_source - - return result_dict - - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - logger.error(f"Eroare la obținerea defalcării balanței nete: {str(e)}") - raise HTTPException(status_code=500, detail=f"Eroare la obținerea defalcării balanței nete: {str(e)}") - -@router.get("/current-period") -async def get_current_period( - request: Request, - company: int = Query(..., description="ID-ul firmei"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Returnează perioada curentă (an și lună) din calendarul Oracle - - - Necesită autentificare JWT - - Returnează anul, luna și perioada curentă în format YYYY-MM - - Folosit pentru afișarea lunii curente în dashboard - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if str(company) not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - result = await DashboardService.get_current_period(company, server_id=server_id) - return result - - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - logger.error(f"Eroare la obținerea perioadei curente: {str(e)}") - raise HTTPException(status_code=500, detail=f"Eroare la obținerea perioadei curente: {str(e)}") - - -@router.get( - "/financial-indicators", - tags=["dashboard"] -) -async def get_financial_indicators( - request: Request, - company: int = Query(..., description="ID-ul firmei (required)"), - luna: Optional[int] = Query(None, ge=1, le=12, description="Luna contabilă (1-12)"), - an: Optional[int] = Query(None, ge=2000, le=2100, description="Anul contabil"), - include_sparklines: bool = Query(True, description="Include date istorice pentru sparklines (12 luni)"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Returnează toți indicatorii financiari calculați pentru firma selectată. - - Acest endpoint agregă datele din: - - Lichiditate: Current Ratio, Quick Ratio, Cash Ratio - - Eficiență: DSO, DPO, Cash Conversion Cycle, rate încasare/plată - - Risc: creanțe/datorii restante, raport datorii/trezorerie - - Cash Flow: flux net lunar, YTD, YoY, acoperire - - Dinamică: creștere vânzări/achiziții YoY, marjă implicită - - Altman Z-Score: scor și componente X1-X4 - - Parametri: - - company (required): ID-ul firmei pentru care se calculează indicatorii - - luna (optional): Luna contabilă (1-12). Dacă nu este specificată, - se folosește ultima perioadă disponibilă. - - an (optional): Anul contabil (2000-2100). Dacă nu este specificat, - se folosește anul curent. - - include_sparklines (optional, default=true): Dacă să includă date istorice - pentru vizualizarea trendului pe ultimele 12 luni (sparkline_data și sparkline_labels - în fiecare indicator) - - Cache: - - TTL: 30 minute pentru indicatori curenți (cache_type='financial_indicators') - - TTL: 1 oră pentru date istorice sparkline (cache_type='financial_indicators_historical') - - Se invalidează automat la schimbarea datelor din balanță - - Necesită autentificare JWT și acces la firma specificată. - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if str(company) not in current_user.companies: - raise HTTPException( - status_code=403, - detail=f"Nu aveți acces la firma {company}" - ) - - # Dacă luna/an nu sunt specificate, obținem perioada curentă - # Folosim variabile tipizate explicit pentru a evita erori de tip - resolved_luna: int - resolved_an: int - - server_id = getattr(request.state, 'server_id', None) - - if luna is None or an is None: - try: - current_period = await DashboardService.get_current_period(company, server_id=server_id) - resolved_luna = luna if luna is not None else current_period.get('luna', 12) - resolved_an = an if an is not None else current_period.get('an', 2024) - except Exception as e: - logger.warning(f"Could not get current period: {e}, using defaults") - from datetime import datetime - resolved_luna = luna if luna is not None else datetime.now().month - resolved_an = an if an is not None else datetime.now().year - else: - resolved_luna = luna - resolved_an = an - - # Dacă include_sparklines este True, folosim metoda care include datele istorice - if include_sparklines: - response = await FinancialIndicatorsService.get_indicators_with_sparklines( - company, resolved_luna, resolved_an, months=12, request=request, server_id=server_id - ) - - # FIX: Cache poate returna dict în loc de obiect Pydantic - # Extragem valorile pentru logging în mod compatibil cu ambele tipuri - if isinstance(response, dict): - zscore_val = response.get('altman_zscore', {}).get('zscore', {}).get('value') - zscore_status = response.get('altman_zscore', {}).get('zscore', {}).get('status') - else: - zscore_val = response.altman_zscore.zscore.value - zscore_status = response.altman_zscore.zscore.status - - logger.info( - f"Financial indicators with sparklines for company {company}, " - f"luna={resolved_luna}, an={resolved_an}: " - f"Z-Score={zscore_val} ({zscore_status}), " - f"cache_hit={getattr(request.state, 'cache_hit', False)}, " - f"response_time={getattr(request.state, 'response_time_ms', 0):.1f}ms" - ) - - # Add cache metadata if requested (for Telegram Bot / Dashboard) - include_metadata = request.headers.get('X-Include-Cache-Metadata', '').lower() == 'true' - if include_metadata: - result_dict = response.dict() if hasattr(response, 'dict') else response - result_dict['cache_hit'] = getattr(request.state, 'cache_hit', False) - result_dict['response_time_ms'] = getattr(request.state, 'response_time_ms', 0) - result_dict['cache_source'] = getattr(request.state, 'cache_source', None) - return result_dict - return response - - # Dacă include_sparklines este False, calculăm doar indicatorii curenți - import asyncio - - # Apelăm serviciul pentru fiecare categorie de indicatori - lichiditate_task = FinancialIndicatorsService.calculate_liquidity_indicators( - company, resolved_luna, resolved_an, server_id=server_id - ) - eficienta_task = FinancialIndicatorsService.calculate_efficiency_indicators( - company, resolved_luna, resolved_an, server_id=server_id - ) - risc_task = FinancialIndicatorsService.calculate_risk_indicators( - company, resolved_luna, resolved_an, server_id=server_id - ) - cash_flow_task = FinancialIndicatorsService.calculate_cashflow_indicators( - company, resolved_luna, resolved_an, server_id=server_id - ) - dinamica_task = FinancialIndicatorsService.calculate_dynamics_indicators( - company, resolved_luna, resolved_an, server_id=server_id - ) - altman_task = FinancialIndicatorsService.calculate_altman_zscore( - company, resolved_luna, resolved_an, server_id=server_id - ) - profitabilitate_task = FinancialIndicatorsService.calculate_profitability_indicators( - company, resolved_luna, resolved_an, server_id=server_id - ) - solvabilitate_task = FinancialIndicatorsService.calculate_solvability_indicators( - company, resolved_luna, resolved_an, server_id=server_id - ) - - # Executăm toate calculele în paralel pentru performanță - ( - lichiditate, - eficienta, - risc, - cash_flow, - dinamica, - altman_zscore, - profitabilitate, - solvabilitate - ) = await asyncio.gather( - lichiditate_task, - eficienta_task, - risc_task, - cash_flow_task, - dinamica_task, - altman_task, - profitabilitate_task, - solvabilitate_task - ) - - # Construim răspunsul - response = FinancialIndicatorsResponse( - lichiditate=lichiditate, - eficienta=eficienta, - risc=risc, - cash_flow=cash_flow, - dinamica=dinamica, - altman_zscore=altman_zscore, - profitabilitate=profitabilitate, - solvabilitate=solvabilitate - ) - - # FIX: Cache poate returna dict în loc de obiect Pydantic - if isinstance(altman_zscore, dict): - zscore_val = altman_zscore.get('zscore', {}).get('value') - zscore_status = altman_zscore.get('zscore', {}).get('status') - else: - zscore_val = altman_zscore.zscore.value - zscore_status = altman_zscore.zscore.status - - logger.info( - f"Financial indicators for company {company}, luna={resolved_luna}, an={resolved_an}: " - f"Z-Score={zscore_val} ({zscore_status})" - ) - - # Add cache metadata if requested (for Telegram Bot / Dashboard) - include_metadata = request.headers.get('X-Include-Cache-Metadata', '').lower() == 'true' - if include_metadata: - result_dict = response.dict() if hasattr(response, 'dict') else response - result_dict['cache_hit'] = getattr(request.state, 'cache_hit', False) - result_dict['response_time_ms'] = getattr(request.state, 'response_time_ms', 0) - result_dict['cache_source'] = getattr(request.state, 'cache_source', None) - return result_dict - return response - - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - logger.error(f"Eroare la obținerea indicatorilor financiari: {str(e)}") - raise HTTPException( - status_code=500, - detail=f"Eroare la obținerea indicatorilor financiari: {str(e)}" - ) \ No newline at end of file diff --git a/deploy-package-20260223-151231/backend/modules/reports/routers/invoices.py b/deploy-package-20260223-151231/backend/modules/reports/routers/invoices.py deleted file mode 100644 index 17787c3..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/routers/invoices.py +++ /dev/null @@ -1,140 +0,0 @@ -""" -API Router pentru facturi -""" -from fastapi import APIRouter, Depends, HTTPException, Query, Request -from typing import List, Optional -from datetime import date -# import sys # Removed - no longer needed -import os - -from shared.auth.dependencies import get_current_user, require_company_access -from shared.auth.models import CurrentUser -from ..models.invoice import InvoiceFilter, InvoiceListResponse, InvoiceSummary -from ..services.invoice_service import InvoiceService - -router = APIRouter() - -@router.get("/", response_model=InvoiceListResponse) -async def get_invoices( - request: Request, - company: str = Query(description="Codul firmei"), - partner_type: str = Query("CLIENTI", description="CLIENTI sau FURNIZORI"), - luna: Optional[int] = Query(None, ge=1, le=12, description="Luna contabilă (1-12)"), - an: Optional[int] = Query(None, ge=2000, le=2100, description="Anul contabil"), - partner_name: Optional[str] = Query(None, description="Filtru nume partener"), - cont: Optional[str] = Query(None, description="Filtru după cont contabil"), - only_unpaid: bool = Query(True, description="Doar facturile neachitate"), - min_amount: Optional[float] = Query(None, description="Suma minimă"), - max_amount: Optional[float] = Query(None, description="Suma maximă"), - page: int = Query(1, ge=1, description="Pagina"), - page_size: int = Query(50, ge=1, le=10000000, description="Mărimea paginii"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Obține lista de facturi pentru o firmă - - - Necesită autentificare JWT - - Utilizatorul trebuie să aibă acces la firma specificată - - Suportă filtrare după luna/an contabil și paginare - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if company not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - - filter_params = InvoiceFilter( - company=company, - partner_type=partner_type, - luna=luna, - an=an, - partner_name=partner_name, - cont=cont, - only_unpaid=only_unpaid, - min_amount=min_amount, - max_amount=max_amount, - page=page, - page_size=page_size - ) - - result = await InvoiceService.get_invoices(filter_params, current_user.username, server_id=server_id) - return result - - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - raise HTTPException(status_code=500, detail=f"Eroare la obținerea facturilor: {str(e)}") - -@router.get("/summary", response_model=InvoiceSummary) -async def get_invoices_summary( - request: Request, - company: str = Query(description="Codul firmei"), - partner_type: str = Query("CLIENTI", description="CLIENTI sau FURNIZORI"), - current_user: CurrentUser = Depends(get_current_user) -): - """Obține rezumatul facturilor pentru dashboard""" - try: - # Verifică dacă utilizatorul are acces la firma specificată - if company not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - - result = await InvoiceService.get_invoice_summary(company, partner_type, current_user.username, server_id=server_id) - return result - - except Exception as e: - raise HTTPException(status_code=500, detail=f"Eroare la obținerea rezumatului facturilor: {str(e)}") - -@router.get("/{invoice_number}") -async def get_invoice_details( - request: Request, - invoice_number: str, - company: str = Query(description="Codul firmei"), - current_user: CurrentUser = Depends(get_current_user) -): - """Obține detaliile unei facturi specifice""" - try: - # Verifică dacă utilizatorul are acces la firma specificată - if company not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - - result = await InvoiceService.get_invoice_details(company, invoice_number, current_user.username, server_id=server_id) - return result - - except ValueError as e: - raise HTTPException(status_code=404, detail=str(e)) - except Exception as e: - raise HTTPException(status_code=500, detail=f"Eroare la obținerea detaliilor facturii: {str(e)}") - -@router.get("/export/{format}") -async def export_invoices( - request: Request, - format: str, - company: str = Query(description="Codul firmei"), - partner_type: str = Query("CLIENTI", description="CLIENTI sau FURNIZORI"), - date_from: Optional[str] = Query(None, description="Data început (YYYY-MM-DD)"), - date_to: Optional[str] = Query(None, description="Data sfârșit (YYYY-MM-DD)"), - partner_name: Optional[str] = Query(None, description="Filtru nume partener"), - only_unpaid: bool = Query(True, description="Doar facturile neachitate"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Export facturi în format specificat (excel, pdf, csv) - Această funcție va fi implementată în viitor - """ - # Verifică dacă utilizatorul are acces la firma specificată - if company not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) # For future use - - # Verifică formatul - if format not in ["excel", "pdf", "csv"]: - raise HTTPException(status_code=400, detail="Format invalid. Formatele suportate sunt: excel, pdf, csv") - - # Pentru moment, returnează o eroare că funcția nu este implementată - raise HTTPException(status_code=501, detail=f"Export în format {format} nu este încă implementat") \ No newline at end of file diff --git a/deploy-package-20260223-151231/backend/modules/reports/routers/treasury.py b/deploy-package-20260223-151231/backend/modules/reports/routers/treasury.py deleted file mode 100644 index d37d63f..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/routers/treasury.py +++ /dev/null @@ -1,123 +0,0 @@ -from fastapi import APIRouter, Depends, HTTPException, Query, Request -from typing import Optional, List -from datetime import date -# import sys # Removed - no longer needed -import os - -from shared.auth.dependencies import get_current_user -from shared.auth.models import CurrentUser -from ..models.treasury import RegisterFilter, RegisterListResponse -from ..services.treasury_service import TreasuryService - -router = APIRouter() - -@router.get("/bank-cash-register", response_model=RegisterListResponse) -async def get_bank_cash_register( - request: Request, - company: str = Query(description="Codul firmei"), - register_type: Optional[str] = Query(None, description="Tipul registrului: BANCA_LEI, BANCA_VALUTA, CASA_LEI, CASA_VALUTA sau None pentru toate"), - luna: Optional[int] = Query(None, ge=1, le=12, description="Luna contabilă (1-12)"), - an: Optional[int] = Query(None, ge=2000, le=2100, description="Anul contabil"), - date_from: Optional[str] = Query(None, description="Data început (YYYY-MM-DD)"), - date_to: Optional[str] = Query(None, description="Data sfârșit (YYYY-MM-DD)"), - partner_name: Optional[str] = Query(None, description="Filtru nume partener"), - bank_account: Optional[str] = Query(None, description="Filtru cont bancă/casă (bancasa)"), - page: int = Query(1, ge=1, description="Pagina"), - page_size: int = Query(50, ge=1, le=10000000, description="Mărimea paginii"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Obține registrul de casă și bancă - - - Necesită autentificare JWT - - Suportă filtrare pe tip registru: BANCA_LEI, BANCA_VALUTA, CASA_LEI, CASA_VALUTA - - Suportă filtrare și paginare - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if company not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - - # Validează register_type dacă e specificat - valid_types = ['BANCA_LEI', 'BANCA_VALUTA', 'CASA_LEI', 'CASA_VALUTA'] - if register_type and register_type not in valid_types: - raise HTTPException( - status_code=400, - detail=f"Tip registru invalid. Valori acceptate: {', '.join(valid_types)}" - ) - - # Convertește datele - date_from_obj = None - date_to_obj = None - - if date_from: - try: - date_from_obj = date.fromisoformat(date_from) - except ValueError: - raise HTTPException(status_code=400, detail="Format dată început invalid") - - if date_to: - try: - date_to_obj = date.fromisoformat(date_to) - except ValueError: - raise HTTPException(status_code=400, detail="Format dată sfârșit invalid") - - filter_params = RegisterFilter( - company=company, - register_type=register_type, - luna=luna, - an=an, - date_from=date_from_obj, - date_to=date_to_obj, - partner_name=partner_name, - bank_account=bank_account, - page=page, - page_size=page_size - ) - - result = await TreasuryService.get_bank_cash_register(filter_params, current_user.username, server_id=server_id) - return result - - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - raise HTTPException(status_code=500, detail=f"Eroare la obținerea registrului: {str(e)}") - - -@router.get("/bank-cash-accounts", response_model=List[str]) -async def get_bank_cash_accounts( - request: Request, - company: str = Query(description="Codul firmei"), - register_type: str = Query(description="Tipul registrului: BANCA_LEI, BANCA_VALUTA, CASA_LEI, CASA_VALUTA"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Obține lista distinctă de conturi bancă/casă pentru dropdown - - - Necesită autentificare JWT - - Returnează lista de valori bancasa pentru tipul de registru selectat - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if company not in current_user.companies: - raise HTTPException(status_code=403, detail=f"Nu aveți acces la firma {company}") - - server_id = getattr(request.state, 'server_id', None) - - # Validează register_type - valid_types = ['BANCA_LEI', 'BANCA_VALUTA', 'CASA_LEI', 'CASA_VALUTA'] - if register_type not in valid_types: - raise HTTPException( - status_code=400, - detail=f"Tip registru invalid. Valori acceptate: {', '.join(valid_types)}" - ) - - result = await TreasuryService.get_bank_cash_accounts(int(company), register_type, server_id=server_id) - return result - - except ValueError as e: - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - raise HTTPException(status_code=500, detail=f"Eroare la obținerea conturilor: {str(e)}") \ No newline at end of file diff --git a/deploy-package-20260223-151231/backend/modules/reports/routers/trial_balance.py b/deploy-package-20260223-151231/backend/modules/reports/routers/trial_balance.py deleted file mode 100644 index bc1f460..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/routers/trial_balance.py +++ /dev/null @@ -1,94 +0,0 @@ -""" -API Router for Trial Balance (Balanță de Verificare) -Refactored to use service layer with caching -""" -from fastapi import APIRouter, Depends, HTTPException, Query, Request -from typing import Optional -from datetime import date -# import sys # Removed - no longer needed -import os - -from shared.auth.dependencies import get_current_user -from shared.auth.models import CurrentUser -from ..models.trial_balance import TrialBalanceResponse -from ..services.trial_balance_service import TrialBalanceService -import logging - -logger = logging.getLogger(__name__) -router = APIRouter() - - -@router.get("/", response_model=TrialBalanceResponse) -async def get_trial_balance( - request: Request, - company: str = Query(description="Codul firmei (ID)"), - luna: Optional[int] = Query(None, ge=1, le=12, description="Luna (1-12), default: luna curentă"), - an: Optional[int] = Query(None, ge=2000, le=2100, description="An, default: anul curent"), - cont_filter: Optional[str] = Query(None, description="Filtru număr cont (ex: '512', '4111')"), - denumire_filter: Optional[str] = Query(None, description="Filtru denumire cont (partial match, case-insensitive)"), - sort_by: str = Query("CONT", description="Coloană pentru sortare"), - sort_order: str = Query("asc", description="Ordinea sortării (asc | desc)"), - page: int = Query(1, ge=1, description="Pagina"), - page_size: int = Query(50, ge=1, le=1000000, description="Mărimea paginii"), - current_user: CurrentUser = Depends(get_current_user) -): - """ - Obține balanța de verificare sintetică pentru o firmă - - - Necesită autentificare JWT - - Utilizatorul trebuie să aibă acces la firma specificată - - Suportă filtrare după cont și denumire - - Suportă paginare și sortare - - **CACHED 10 min** - folosește sistem cache two-tier (L1 Memory + L2 SQLite) - """ - try: - # Verifică dacă utilizatorul are acces la firma specificată - if company not in current_user.companies: - raise HTTPException( - status_code=403, - detail=f"Nu aveți acces la firma {company}" - ) - - server_id = getattr(request.state, 'server_id', None) - - # Setează valorile implicite pentru lună și an (luna și anul curent) - current_date = date.today() - if luna is None: - luna = current_date.month - if an is None: - an = current_date.year - - # Convert company to int - company_id = int(company) - - # Call service (with caching) - all business logic moved to service - data = await TrialBalanceService.get_trial_balance( - company_id=company_id, - luna=luna, - an=an, - cont_filter=cont_filter, - denumire_filter=denumire_filter, - sort_by=sort_by, - sort_order=sort_order, - page=page, - page_size=page_size, - username=current_user.username, - server_id=server_id - ) - - return TrialBalanceResponse( - success=True, - data=data - ) - - except ValueError as e: - # Schema not found or validation error - logger.error(f"Validation error in trial balance: {str(e)}") - raise HTTPException(status_code=400, detail=str(e)) - except Exception as e: - # Log unexpected errors - logger.error(f"Error fetching trial balance: {str(e)}", exc_info=True) - raise HTTPException( - status_code=500, - detail=f"Eroare la obținerea balanței de verificare: {str(e)}" - ) diff --git a/deploy-package-20260223-151231/backend/modules/reports/schemas/__init__.py b/deploy-package-20260223-151231/backend/modules/reports/schemas/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/modules/reports/services/__init__.py b/deploy-package-20260223-151231/backend/modules/reports/services/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/modules/reports/services/calendar_service.py b/deploy-package-20260223-151231/backend/modules/reports/services/calendar_service.py deleted file mode 100644 index 35b3ca8..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/services/calendar_service.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -Calendar service for fetching available accounting periods -""" -# import sys # Removed - no longer needed -import os -from typing import Optional - -from shared.database.oracle_pool import oracle_pool -from ..models.calendar import CalendarPeriod, CalendarPeriodsResponse -from ..cache.decorators import cached -import logging - -logger = logging.getLogger(__name__) - - -class CalendarService: - """Service for calendar/accounting period operations""" - - # Romanian month names for display - MONTH_NAMES_RO = [ - "Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", - "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie" - ] - - @staticmethod - @cached(cache_type='schema', key_params=['company_id', 'server_id']) - async def _get_schema(company_id: int, server_id: Optional[str] = None) -> str: - """Get schema for company (CACHED 24h)""" - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - cursor.execute(""" - SELECT schema FROM CONTAFIN_ORACLE.v_nom_firme - WHERE id_firma = :company_id - """, {'company_id': company_id}) - result = cursor.fetchone() - return result[0] if result else None - - @staticmethod - @cached(cache_type='calendar_periods', key_params=['company_id', 'server_id']) - async def get_available_periods(company_id: int, server_id: Optional[str] = None) -> CalendarPeriodsResponse: - """ - Get all available accounting periods for a company (CACHED 1h) - - Returns periods ordered by year DESC, month DESC with Romanian month names. - """ - schema = await CalendarService._get_schema(company_id, server_id) - if not schema: - logger.warning(f"Schema not found for company {company_id}") - return CalendarPeriodsResponse(periods=[], current_period=None, total_count=0) - - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - cursor.execute(f""" - SELECT anul, luna - FROM {schema}.calendar - ORDER BY anul DESC, luna DESC - """) - rows = cursor.fetchall() - - periods = [] - for row in rows: - an, luna = row[0], row[1] - month_name = CalendarService.MONTH_NAMES_RO[luna - 1] - periods.append(CalendarPeriod( - an=an, - luna=luna, - display_name=f"{month_name} {an}" - )) - - current_period = periods[0] if periods else None - - logger.info(f"Loaded {len(periods)} accounting periods for company {company_id}") - - return CalendarPeriodsResponse( - periods=periods, - current_period=current_period, - total_count=len(periods) - ) diff --git a/deploy-package-20260223-151231/backend/modules/reports/services/dashboard_service.py b/deploy-package-20260223-151231/backend/modules/reports/services/dashboard_service.py deleted file mode 100644 index cbb54aa..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/services/dashboard_service.py +++ /dev/null @@ -1,2177 +0,0 @@ -# import sys # Removed - no longer needed -import os - -from shared.database.oracle_pool import oracle_pool -from ..models.dashboard import DashboardSummary, TreasuryAccount, TrendData, BudgetDebtGroup, BudgetDebtSubAccount -from ..cache.decorators import cached -from decimal import Decimal -from typing import Dict, Any, List, Optional -from datetime import datetime, timedelta -from fastapi import Request -import logging - -logger = logging.getLogger(__name__) - -# Grupuri de conturi pentru Datorii la Buget (3 grupe: TVA / BASS / CAM) -BUDGET_GROUPS = [ - { - 'key': 'TVA', - 'label': 'TVA', - 'accounts': ['4423', '4424'], - }, - { - 'key': 'BASS', - 'label': 'BASS', - 'accounts': ['431', '4311', '4313', '4315', '4316', '437', '444', '4411', '4418', '446', '447'], - }, - { - 'key': 'CAM', - 'label': 'CAM', - 'accounts': ['436'], - }, -] - -ACCOUNT_LABELS = { - '4311': '4311 - CAS angajat', - '4313': '4313 - CAS accidente muncă', - '4315': '4315 - CAS suplimentar', - '4316': '4316 - CASS angajat', - '431': '431 - CAS (cont total)', - '437': '437 - CASS (cont total)', - '444': '444 - Impozit salarii', - '4411': '4411 - Impozit pe profit', - '4418': '4418 - Impozit amânat', - '446': '446 - Alte impozite și taxe', - '447': '447 - Fonduri speciale', - '4423': '4423 - TVA de plată', - '4424': '4424 - TVA de recuperat', - '4426': '4426 - TVA deductibilă', - '4427': '4427 - TVA colectată', - '436': '436 - CAM', -} - - -class DashboardService: - """Service pentru dashboard - date agregate""" - - @staticmethod - def _build_period_cte(schema: str, luna: Optional[int] = None, an: Optional[int] = None) -> tuple[str, dict]: - """ - Construiește CTE pentru luna curentă. - - Dacă luna și an sunt specificate, le folosește. - Altfel, folosește MAX(anul*12+luna) din calendar. - - Returns: - tuple: (cte_sql, params_dict) - """ - if luna is not None and an is not None: - # Folosește parametrii specificați - cte_sql = f""" - WITH luna_curenta AS ( - SELECT :param_an as anul, :param_luna as luna FROM DUAL - )""" - params = {'param_an': an, 'param_luna': luna} - else: - # Folosește MAX din calendar - cte_sql = f""" - WITH luna_curenta AS ( - SELECT anul, luna FROM {schema}.calendar - WHERE anul*12+luna = (SELECT MAX(anul*12+luna) FROM {schema}.calendar) - )""" - params = {} - return cte_sql, params - - @staticmethod - @cached(cache_type='schema', key_params=['company_id', 'server_id']) - async def _get_schema(company_id: int, server_id: Optional[str] = None) -> str: - """ - Obține schema pentru company_id (CACHED PERMANENT) - - CRITICAL: Acest query este cel mai frecvent - executat la FIECARE request API. - Cache permanent reduce queries cu 99.99%. - """ - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - schema_query = """ - SELECT schema - FROM CONTAFIN_ORACLE.v_nom_firme - WHERE id_firma = :company_id - """ - cursor.execute(schema_query, {'company_id': company_id}) - schema_result = cursor.fetchone() - - if not schema_result: - raise ValueError(f"Schema not found for company {company_id}") - - return schema_result[0] - - @staticmethod - @cached(cache_type='dashboard_summary', key_params=['company', 'username', 'luna', 'an', 'server_id']) - async def get_complete_summary(company: str, username: str, luna: Optional[int] = None, an: Optional[int] = None, request: Optional[Request] = None, server_id: Optional[str] = None) -> DashboardSummary: - """ - Obține toate datele pentru dashboard într-un singur apel (CACHED 30 min) - Execută 2 query-uri separate: facturi și trezorerie - - Args: - company: ID-ul firmei - username: Numele utilizatorului - luna: Luna contabilă (1-12), opțional - an: Anul contabil, opțional - request: Request object pentru cache metadata - server_id: ID-ul serverului Oracle (pentru multi-server) - """ - company_id = int(company) - schema = await DashboardService._get_schema(company_id, server_id) - - # Construiește CTE pentru perioada curentă - period_cte, period_params = DashboardService._build_period_cte(schema, luna, an) - - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - - # Query 1: Statistici facturi cu breakdown pe perioade - FIXED ORA-00937 - facturi_query = f""" - {period_cte}, - perioada_stats AS ( - SELECT - an, luna, - -- CLIENȚI - SUM(CASE - WHEN cont IN ('4111','461') - THEN precdeb + debit ELSE 0 - END) as clienti_facturat_luna, - - SUM(CASE - WHEN cont IN ('4111','461') - THEN preccred + credit ELSE 0 - END) as clienti_incasat_luna, - - -- FURNIZORI - SUM(CASE - WHEN cont IN ('401','404','462') - THEN preccred + credit ELSE 0 - END) as furnizori_facturat_luna, - - SUM(CASE - WHEN cont IN ('401','404','462') - THEN precdeb + debit ELSE 0 - END) as furnizori_achitat_luna - - FROM {schema}.vireg_parteneri - WHERE cont IN ('4111', '461', '401', '404', '462') - AND an >= (SELECT anul-1 FROM luna_curenta) - GROUP BY an, luna - ), - facturi_stats AS ( - SELECT - -- CLIENȚI - Totaluri - SUM(CASE - WHEN cont IN ('4111','461') - THEN precdeb + debit ELSE 0 - END) as clienti_total_facturat, - - SUM(CASE - WHEN cont IN ('4111','461') - THEN preccred + credit ELSE 0 - END) as clienti_total_incasat, - - SUM(CASE - WHEN cont = '419' - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as clienti_avansuri, - - -- CLIENȚI - Sold Net Total - SUM(CASE - WHEN cont IN ('4111','461') - THEN (precdeb + debit) - (preccred + credit) - WHEN cont = '419' - THEN -((preccred + credit) - (precdeb + debit)) - ELSE 0 - END) as clienti_sold_total, - - -- CLIENȚI - Sold În Termen (datascad >= azi sau NULL) - SUM(CASE - WHEN cont IN ('4111','461') - AND (datascad IS NULL OR datascad >= TRUNC(SYSDATE)) - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_sold_in_termen, - - -- CLIENȚI - Sold Restant (datascad < azi) - SUM(CASE - WHEN cont IN ('4111','461') - AND datascad < TRUNC(SYSDATE) - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_sold_restant, - - -- CLIENȚI - Restanțe pe perioade - SUM(CASE - WHEN cont IN ('4111','461') - AND TRUNC(SYSDATE) - datascad BETWEEN 1 AND 7 - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_restant_7, - - SUM(CASE - WHEN cont IN ('4111','461') - AND TRUNC(SYSDATE) - datascad BETWEEN 8 AND 14 - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_restant_14, - - SUM(CASE - WHEN cont IN ('4111','461') - AND TRUNC(SYSDATE) - datascad BETWEEN 15 AND 30 - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_restant_30, - - SUM(CASE - WHEN cont IN ('4111','461') - AND TRUNC(SYSDATE) - datascad BETWEEN 31 AND 60 - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_restant_60, - - SUM(CASE - WHEN cont IN ('4111','461') - AND TRUNC(SYSDATE) - datascad BETWEEN 61 AND 90 - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_restant_90, - - SUM(CASE - WHEN cont IN ('4111','461') - AND TRUNC(SYSDATE) - datascad > 90 - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_restant_90plus, - - -- CLIENȚI - Scadențe pe perioade (datascad în viitor) - SUM(CASE - WHEN cont IN ('4111','461') - AND datascad - TRUNC(SYSDATE) BETWEEN 1 AND 7 - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_scadent_7, - - SUM(CASE - WHEN cont IN ('4111','461') - AND datascad - TRUNC(SYSDATE) BETWEEN 8 AND 14 - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_scadent_14, - - SUM(CASE - WHEN cont IN ('4111','461') - AND datascad - TRUNC(SYSDATE) BETWEEN 15 AND 30 - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_scadent_30, - - SUM(CASE - WHEN cont IN ('4111','461') - AND datascad - TRUNC(SYSDATE) BETWEEN 31 AND 60 - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_scadent_60, - - SUM(CASE - WHEN cont IN ('4111','461') - AND datascad - TRUNC(SYSDATE) BETWEEN 61 AND 90 - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_scadent_90, - - SUM(CASE - WHEN cont IN ('4111','461') - AND datascad - TRUNC(SYSDATE) > 90 - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as clienti_scadent_90plus, - - -- FURNIZORI - Totaluri - SUM(CASE - WHEN cont IN ('401','404','462') - THEN preccred + credit ELSE 0 - END) as furnizori_total_facturat, - - SUM(CASE - WHEN cont IN ('401','404','462') - THEN precdeb + debit ELSE 0 - END) as furnizori_total_achitat, - - SUM(CASE - WHEN cont LIKE '409%' - THEN (precdeb + debit) - (preccred + credit) ELSE 0 - END) as furnizori_avansuri, - - -- FURNIZORI - Sold Net Total - SUM(CASE - WHEN cont IN ('401','404','462') - THEN (preccred + credit) - (precdeb + debit) - WHEN cont LIKE '409%' - THEN -((precdeb + debit) - (preccred + credit)) - ELSE 0 - END) as furnizori_sold_total, - - -- FURNIZORI - Sold În Termen - SUM(CASE - WHEN cont IN ('401','404','462') - AND (datascad IS NULL OR datascad >= TRUNC(SYSDATE)) - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_sold_in_termen, - - -- FURNIZORI - Sold Restant - SUM(CASE - WHEN cont IN ('401','404','462') - AND datascad < TRUNC(SYSDATE) - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_sold_restant, - - -- FURNIZORI - Restanțe pe perioade - SUM(CASE - WHEN cont IN ('401','404','462') - AND TRUNC(SYSDATE) - datascad BETWEEN 1 AND 7 - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_restant_7, - - SUM(CASE - WHEN cont IN ('401','404','462') - AND TRUNC(SYSDATE) - datascad BETWEEN 8 AND 14 - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_restant_14, - - SUM(CASE - WHEN cont IN ('401','404','462') - AND TRUNC(SYSDATE) - datascad BETWEEN 15 AND 30 - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_restant_30, - - SUM(CASE - WHEN cont IN ('401','404','462') - AND TRUNC(SYSDATE) - datascad BETWEEN 31 AND 60 - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_restant_60, - - SUM(CASE - WHEN cont IN ('401','404','462') - AND TRUNC(SYSDATE) - datascad BETWEEN 61 AND 90 - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_restant_90, - - SUM(CASE - WHEN cont IN ('401','404','462') - AND TRUNC(SYSDATE) - datascad > 90 - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_restant_90plus, - - -- FURNIZORI - Scadențe pe perioade - SUM(CASE - WHEN cont IN ('401','404','462') - AND datascad - TRUNC(SYSDATE) BETWEEN 1 AND 7 - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_scadent_7, - - SUM(CASE - WHEN cont IN ('401','404','462') - AND datascad - TRUNC(SYSDATE) BETWEEN 8 AND 14 - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_scadent_14, - - SUM(CASE - WHEN cont IN ('401','404','462') - AND datascad - TRUNC(SYSDATE) BETWEEN 15 AND 30 - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_scadent_30, - - SUM(CASE - WHEN cont IN ('401','404','462') - AND datascad - TRUNC(SYSDATE) BETWEEN 31 AND 60 - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_scadent_60, - - SUM(CASE - WHEN cont IN ('401','404','462') - AND datascad - TRUNC(SYSDATE) BETWEEN 61 AND 90 - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_scadent_90, - - SUM(CASE - WHEN cont IN ('401','404','462') - AND datascad - TRUNC(SYSDATE) > 90 - THEN (preccred + credit) - (precdeb + debit) ELSE 0 - END) as furnizori_scadent_90plus - - FROM {schema}.vireg_parteneri - WHERE an = (SELECT anul FROM luna_curenta) - AND luna = (SELECT luna FROM luna_curenta) - AND cont IN ('4111', '461', '419', '401', '404', '462', '409','4091','4092','4093','4094') - ) - SELECT - fs.*, - -- BREAKDOWN pe perioade - Luna anterioară - (SELECT NVL(clienti_facturat_luna, 0) FROM perioada_stats p - WHERE p.an*12+p.luna = (SELECT anul*12+luna-1 FROM luna_curenta)) as clienti_facturat_luna_anterioara, - - (SELECT NVL(furnizori_facturat_luna, 0) FROM perioada_stats p - WHERE p.an*12+p.luna = (SELECT anul*12+luna-1 FROM luna_curenta)) as furnizori_facturat_luna_anterioara, - - -- BREAKDOWN pe perioade - Anul curent vs anterior - (SELECT NVL(SUM(clienti_facturat_luna), 0) FROM perioada_stats p - WHERE p.an = (SELECT anul FROM luna_curenta)) as clienti_facturat_an_curent, - - (SELECT NVL(SUM(clienti_facturat_luna), 0) FROM perioada_stats p - WHERE p.an = (SELECT anul-1 FROM luna_curenta)) as clienti_facturat_an_anterior, - - (SELECT NVL(SUM(furnizori_facturat_luna), 0) FROM perioada_stats p - WHERE p.an = (SELECT anul FROM luna_curenta)) as furnizori_facturat_an_curent, - - (SELECT NVL(SUM(furnizori_facturat_luna), 0) FROM perioada_stats p - WHERE p.an = (SELECT anul-1 FROM luna_curenta)) as furnizori_facturat_an_anterior - - FROM facturi_stats fs - """ - - cursor.execute(facturi_query, period_params) - facturi_row = cursor.fetchone() - - # Query 2: Trezorerie (folosește același period_cte) - treasury_query = f""" - {period_cte} - SELECT - cont, - nume as nume_banca, - CASE - WHEN cont = '5121' THEN 'Bancă LEI' - WHEN cont = '5124' THEN 'Bancă VALUTA' - WHEN cont = '5311' THEN 'Casă LEI' - WHEN cont = '5314' THEN 'Casă VALUTA' - END as nume_cont, - SUM(CASE - WHEN cont IN ('5121','5311') THEN solddeb - soldcred - WHEN cont IN ('5124','5314') THEN soldvaldeb - soldvalcred - END) as sold, - CASE - WHEN cont IN ('5121','5311') THEN 'RON' - WHEN cont IN ('5124','5314') THEN NVL(nume_val, 'EUR') - END as valuta - FROM {schema}.vbalanta_parteneri - WHERE an = (SELECT anul FROM luna_curenta) - AND luna = (SELECT luna FROM luna_curenta) - AND cont IN ('5121', '5124', '5311', '5314') - AND ((cont IN ('5121','5311') AND soldcred - solddeb != 0) - OR (cont IN ('5124','5314') AND soldvalcred - soldvaldeb != 0)) - GROUP BY cont, nume, nume_val - ORDER BY - CASE WHEN cont IN ('5121','5311') THEN 0 ELSE 1 END, - cont, - UPPER(nume) - """ - - cursor.execute(treasury_query, period_params) - treasury_rows = cursor.fetchall() - - # Query 3: Solduri datorii buget din tabelul vbal (43xx + 44xx) - # Extins față de TVA-only pentru a include CAS, CASS, impozite, etc. - tva_query = f""" - {period_cte} - SELECT - cont, - precdeb, - preccred, - ruldeb, - rulcred, - solddeb, - soldcred - FROM {schema}.vbal - WHERE an = (SELECT anul FROM luna_curenta) - AND luna = (SELECT luna FROM luna_curenta) - AND (cont LIKE '43%' OR cont LIKE '44%') - ORDER BY cont - """ - - cursor.execute(tva_query, period_params) - tva_rows = cursor.fetchall() - - # Procesare solduri: dict generic pentru toate conturile 43xx/44xx - _zero = {'precdeb': Decimal('0'), 'preccred': Decimal('0'), 'ruldeb': Decimal('0'), 'rulcred': Decimal('0'), 'solddeb': Decimal('0'), 'soldcred': Decimal('0')} - all_budget_data: Dict[str, Any] = {} - - for row in tva_rows: - cont = row[0] - all_budget_data[cont] = { - 'precdeb': Decimal(str(row[1] or 0)), - 'preccred': Decimal(str(row[2] or 0)), - 'ruldeb': Decimal(str(row[3] or 0)), - 'rulcred': Decimal(str(row[4] or 0)), - 'solddeb': Decimal(str(row[5] or 0)), - 'soldcred': Decimal(str(row[6] or 0)), - } - - # Backward compat: tva_data dict cu doar conturile TVA clasice - tva_data = { - k: all_budget_data.get(k, dict(_zero)) - for k in ['4423', '4424', '4426', '4427'] - } - - # Calcul TVA Luna Precedentă - FIE de plată (4423) FIE de recuperat (4424) - # Primary: folosim soldurile conturilor de regularizare TVA (luna anterioară închisă) - sold_4423 = tva_data['4423']['preccred'] - tva_data['4423']['precdeb'] - sold_4424 = tva_data['4424']['precdeb'] - tva_data['4424']['preccred'] - - if sold_4423 > 0: - tva_plata_precedent = sold_4423 - tva_recuperat_precedent = Decimal('0') - elif sold_4424 > 0: - tva_recuperat_precedent = sold_4424 - tva_plata_precedent = Decimal('0') - else: - # Fallback: când luna anterioară nu e închisă (4423/4424 = 0), - # calculăm soldul lunar net al conturilor 4427/4426 - sold_4427_prec = tva_data['4427']['preccred'] - tva_data['4427']['precdeb'] - sold_4426_prec = tva_data['4426']['precdeb'] - tva_data['4426']['preccred'] - diferenta_prec = sold_4427_prec - sold_4426_prec - if diferenta_prec > 0: - tva_plata_precedent = diferenta_prec - tva_recuperat_precedent = Decimal('0') - else: - tva_recuperat_precedent = -diferenta_prec - tva_plata_precedent = Decimal('0') - - # Calcul TVA Luna Curentă - rulaj lunar 4423/4424 (nu sold cumulat) - sold_4423_cur = tva_data['4423']['rulcred'] - tva_data['4423']['ruldeb'] - sold_4424_cur = tva_data['4424']['ruldeb'] - tva_data['4424']['rulcred'] - - if sold_4423_cur > 0: - tva_plata_curent = sold_4423_cur - tva_recuperat_curent = Decimal('0') - elif sold_4424_cur > 0: - tva_recuperat_curent = sold_4424_cur - tva_plata_curent = Decimal('0') - else: - # Fallback: rulaj lunar net 4427/4426 (ruldeb/rulcred = doar luna curentă) - sold_4427_cur = tva_data['4427']['rulcred'] - tva_data['4427']['ruldeb'] - sold_4426_cur = tva_data['4426']['ruldeb'] - tva_data['4426']['rulcred'] - diferenta_curent = sold_4427_cur - sold_4426_cur - if diferenta_curent > 0: - tva_plata_curent = diferenta_curent - tva_recuperat_curent = Decimal('0') - else: - tva_recuperat_curent = -diferenta_curent - tva_plata_curent = Decimal('0') - - # Calcul Datorii la Buget - 3 grupe (TVA / BASS / CAM) cu sub-conturi - budget_debt_breakdown = [] - for group_def in BUDGET_GROUPS: - sub_accounts = [] - group_prec = Decimal('0') - group_cur = Decimal('0') - group_datorat = Decimal('0') - group_achitat = Decimal('0') - group_sold = Decimal('0') - - if group_def['key'] == 'TVA': - # TVA special: valorile deja calculate (semn ±) - tva_prec = tva_plata_precedent - tva_recuperat_precedent - tva_cur = tva_plata_curent - tva_recuperat_curent - group_prec = tva_prec - group_cur = tva_cur - - # Achitat TVA = plăți efective din luna curentă (ruldeb pe contul de TVA plată) - if sold_4423 > 0: - tva_achitat_prec = tva_data['4423']['ruldeb'] - else: - tva_achitat_prec = tva_data['4427']['ruldeb'] - group_datorat = tva_prec - group_achitat = tva_achitat_prec - group_sold = max(Decimal('0'), tva_prec - tva_achitat_prec) - - # Sub-conturi TVA (doar cele cu sold non-zero) - for cont in ['4423', '4424', '4426', '4427']: - if cont in all_budget_data: - d = all_budget_data[cont] - if cont == '4424': # creanță → semn negativ - val_prec = -(d['precdeb'] - d['preccred']) - val_cur = -(d['rulcred']) - val_sold = Decimal('0') # creanță: nu are sold de plată - else: # 4423, 4426, 4427 - val_prec = d['preccred'] - d['precdeb'] - val_cur = d['rulcred'] # obligații noi luna curentă - val_sold = max(Decimal('0'), val_prec - d['ruldeb']) - val_datorat = val_prec - val_achitat = d['ruldeb'] - if val_prec != 0 or val_cur != 0: - sub_accounts.append(BudgetDebtSubAccount( - cont=cont, - label=ACCOUNT_LABELS[cont], - precedent=val_prec, - curent=val_cur, - datorat=val_datorat, - achitat=val_achitat, - sold=val_sold, - )) - else: - # BASS și CAM: matching exact pe codul contului - for account_code in group_def['accounts']: - if account_code in all_budget_data: - d = all_budget_data[account_code] - val_prec = d['preccred'] - d['precdeb'] # pozitiv = datorie - val_cur = d['rulcred'] # obligații noi luna curentă - val_datorat = val_prec - val_achitat = d['ruldeb'] # plăți directe (debit) - val_sold = max(Decimal('0'), val_datorat - val_achitat) # datorat - achitat - if val_prec != 0 or val_cur != 0: - sub_accounts.append(BudgetDebtSubAccount( - cont=account_code, - label=ACCOUNT_LABELS.get(account_code, account_code), - precedent=val_prec, - curent=val_cur, - datorat=val_datorat, - achitat=val_achitat, - sold=val_sold, - )) - group_prec += val_prec - group_cur += val_cur - group_datorat += val_datorat - group_achitat += val_achitat - group_sold += val_sold - - if group_prec != 0 or group_cur != 0 or sub_accounts: - budget_debt_breakdown.append(BudgetDebtGroup( - key=group_def['key'], - label=group_def['label'], - precedent=group_prec, - curent=group_cur, - sub_accounts=sub_accounts, - datorat=group_datorat, - achitat=group_achitat, - sold=group_sold, - )) - - budget_debt_total_precedent = sum(g.precedent for g in budget_debt_breakdown) - budget_debt_total_sold = sum(g.sold for g in budget_debt_breakdown) - - # Procesare trezorerie - treasury_accounts = [] - treasury_totals = {} - - for row in treasury_rows: - account = TreasuryAccount( - cont=row[0], - nume_banca=row[1], - nume_cont=row[2], - sold=Decimal(str(row[3] or 0)), - valuta=row[4] - ) - treasury_accounts.append(account) - - # Calculează totaluri pe valută - if account.valuta not in treasury_totals: - treasury_totals[account.valuta] = Decimal('0') - treasury_totals[account.valuta] += account.sold - - # Returnează rezultatul complet cu toate câmpurile calculate - return DashboardSummary( - # CLIENȚI - Totaluri principale - clienti_total_facturat=Decimal(str(facturi_row[0] or 0)), - clienti_total_incasat=Decimal(str(facturi_row[1] or 0)), - clienti_avansuri=Decimal(str(facturi_row[2] or 0)), - clienti_sold_total=Decimal(str(facturi_row[3] or 0)), - clienti_sold_in_termen=Decimal(str(facturi_row[4] or 0)), - clienti_sold_restant=Decimal(str(facturi_row[5] or 0)), - - # CLIENȚI - Restanțe pe perioade - clienti_restant_7=Decimal(str(facturi_row[6] or 0)), - clienti_restant_14=Decimal(str(facturi_row[7] or 0)), - clienti_restant_30=Decimal(str(facturi_row[8] or 0)), - clienti_restant_60=Decimal(str(facturi_row[9] or 0)), - clienti_restant_90=Decimal(str(facturi_row[10] or 0)), - clienti_restant_90plus=Decimal(str(facturi_row[11] or 0)), - - # CLIENȚI - Scadențe pe perioade - clienti_scadent_7=Decimal(str(facturi_row[12] or 0)), - clienti_scadent_14=Decimal(str(facturi_row[13] or 0)), - clienti_scadent_30=Decimal(str(facturi_row[14] or 0)), - clienti_scadent_60=Decimal(str(facturi_row[15] or 0)), - clienti_scadent_90=Decimal(str(facturi_row[16] or 0)), - clienti_scadent_90plus=Decimal(str(facturi_row[17] or 0)), - - # FURNIZORI - Totaluri principale - furnizori_total_facturat=Decimal(str(facturi_row[18] or 0)), - furnizori_total_achitat=Decimal(str(facturi_row[19] or 0)), - furnizori_avansuri=Decimal(str(facturi_row[20] or 0)), - furnizori_sold_total=Decimal(str(facturi_row[21] or 0)), - furnizori_sold_in_termen=Decimal(str(facturi_row[22] or 0)), - furnizori_sold_restant=Decimal(str(facturi_row[23] or 0)), - - # FURNIZORI - Restanțe pe perioade - furnizori_restant_7=Decimal(str(facturi_row[24] or 0)), - furnizori_restant_14=Decimal(str(facturi_row[25] or 0)), - furnizori_restant_30=Decimal(str(facturi_row[26] or 0)), - furnizori_restant_60=Decimal(str(facturi_row[27] or 0)), - furnizori_restant_90=Decimal(str(facturi_row[28] or 0)), - furnizori_restant_90plus=Decimal(str(facturi_row[29] or 0)), - - # FURNIZORI - Scadențe pe perioade - furnizori_scadent_7=Decimal(str(facturi_row[30] or 0)), - furnizori_scadent_14=Decimal(str(facturi_row[31] or 0)), - furnizori_scadent_30=Decimal(str(facturi_row[32] or 0)), - furnizori_scadent_60=Decimal(str(facturi_row[33] or 0)), - furnizori_scadent_90=Decimal(str(facturi_row[34] or 0)), - furnizori_scadent_90plus=Decimal(str(facturi_row[35] or 0)), - - # TREZORERIE - treasury_accounts=treasury_accounts, - treasury_totals_by_currency=treasury_totals, - - # Date suplimentare pentru trend analysis - clienti_facturat_luna_anterioara=Decimal(str(facturi_row[36] or 0)), - furnizori_facturat_luna_anterioara=Decimal(str(facturi_row[37] or 0)), - clienti_facturat_an_curent=Decimal(str(facturi_row[38] or 0)), - clienti_facturat_an_anterior=Decimal(str(facturi_row[39] or 0)), - furnizori_facturat_an_curent=Decimal(str(facturi_row[40] or 0)), - furnizori_facturat_an_anterior=Decimal(str(facturi_row[41] or 0)), - - # Solduri TVA - tva_plata_precedent=tva_plata_precedent, - tva_recuperat_precedent=tva_recuperat_precedent, - tva_plata_curent=tva_plata_curent, - tva_recuperat_curent=tva_recuperat_curent, - - # Datorii la buget pe grupe cu sub-conturi - budget_debt_breakdown=budget_debt_breakdown, - budget_debt_total_precedent=budget_debt_total_precedent, - budget_debt_total_sold=budget_debt_total_sold, - ) - - @staticmethod - @cached(cache_type='dashboard_trends', key_params=['company_id', 'period', 'luna', 'an', 'server_id']) - async def get_trends(company_id: int, period: str = "12m", luna: Optional[int] = None, an: Optional[int] = None, request: Optional[Request] = None, server_id: Optional[str] = None) -> Dict[str, Any]: - """Get comprehensive trend analysis data for all dashboard indicators (CACHED 30 min) - - Args: - company_id: ID-ul firmei - period: Perioada pentru trends (7d, 30d, ytd, 12m) - luna: Luna contabilă (1-12), opțional - dacă nu e specificată, folosește MAX - an: Anul contabil, opțional - dacă nu e specificat, folosește MAX - request: Request object pentru cache metadata - server_id: ID-ul serverului Oracle (pentru multi-server) - """ - try: - schema = await DashboardService._get_schema(company_id, server_id) - - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - - # Determine current period from params or database - if luna is not None and an is not None: - current_year = an - current_month = luna - else: - # Get current period from database - current_period_query = f""" - WITH luna_curenta AS ( - SELECT anul, luna FROM {schema}.calendar - WHERE anul*12+luna = (SELECT MAX(anul*12+luna) FROM {schema}.calendar) - ) - SELECT anul, luna FROM luna_curenta - """ - - cursor.execute(current_period_query) - current_period = cursor.fetchone() - - if not current_period: - # Fallback to current system date - current_year = 2024 - current_month = 12 - else: - current_year = current_period[0] - current_month = current_period[1] - - # Determine period parameters - if period == 'ytd': - # Year to date - from January to current month of current year - start_year = current_year - start_month = 1 - end_year = current_year - end_month = current_month - elif period == '12m': - # Last 12 months - from datetime import date - from dateutil.relativedelta import relativedelta - - current_date = date(current_year, current_month, 1) - start_date = current_date - relativedelta(months=11) # 12 months including current - - start_year = start_date.year - start_month = start_date.month - end_year = current_year - end_month = current_month - else: - # Default to 12 months - from datetime import date - from dateutil.relativedelta import relativedelta - - current_date = date(current_year, current_month, 1) - start_date = current_date - relativedelta(months=11) - - start_year = start_date.year - start_month = start_date.month - end_year = current_year - end_month = current_month - - # Calculate previous period (12 months before current period) - from datetime import date - from dateutil.relativedelta import relativedelta - - prev_start_date = date(start_year, start_month, 1) - relativedelta(months=12) - prev_end_date = date(end_year, end_month, 1) - relativedelta(months=12) - - prev_start_year = prev_start_date.year - prev_start_month = prev_start_date.month - prev_end_year = prev_end_date.year - prev_end_month = prev_end_date.month - - # Comprehensive trends query for all indicators (current + previous period) - trends_query = f""" - WITH trend_periods AS ( - SELECT DISTINCT an as anul, luna - FROM {schema}.vbalanta_parteneri - WHERE (an*100 + luna >= {start_year * 100 + start_month}) - AND (an*100 + luna <= {end_year * 100 + end_month}) - ), - prev_trend_periods AS ( - SELECT DISTINCT an as anul, luna - FROM {schema}.vbalanta_parteneri - WHERE (an*100 + luna >= {prev_start_year * 100 + prev_start_month}) - AND (an*100 + luna <= {prev_end_year * 100 + prev_end_month}) - ), - comprehensive_data AS ( - SELECT - tp.anul, - tp.luna, - tp.anul||'-'||LPAD(tp.luna,2,'0') as perioada, - - -- CLIENTI - facturat (cifra de afaceri - vanzari) - COALESCE(SUM(CASE - WHEN vb.cont in ('4111', '461') THEN vb.debit - ELSE 0 - END), 0) as clienti_facturat, - - -- CLIENTI - incasat (incasari de la clienti) - COALESCE(SUM(CASE - WHEN vb.cont IN ('4111', '461') THEN vb.credit - WHEN vb.cont in ('419') THEN vb.debit - ELSE 0 - END), 0) as clienti_incasat, - - -- FURNIZORI - facturat (achizitii) - COALESCE(SUM(CASE - WHEN vb.cont in ('401', '404', '462') THEN vb.credit - ELSE 0 - END), 0) as furnizori_facturat, - - -- FURNIZORI - achitat (plati catre furnizori) - COALESCE(SUM(CASE - WHEN vb.cont in ('401', '404', '462') THEN vb.debit - WHEN vb.cont in ('409') THEN vb.credit - ELSE 0 - END), 0) as furnizori_achitat, - - -- CLIENTI SOLD (balanta clienti) - COALESCE(SUM(CASE - WHEN vb.cont IN ('4111', '461') THEN vb.solddeb - vb.soldcred - WHEN vb.cont IN ('419') THEN vb.soldcred - vb.solddeb - ELSE 0 - END), 0) as clienti_sold, - - -- FURNIZORI SOLD (balanta furnizori) - COALESCE(SUM(CASE - WHEN vb.cont in ('401', '404', '462') THEN vb.soldcred - vb.solddeb - WHEN vb.cont IN ('409') THEN vb.solddeb - vb.soldcred - ELSE 0 - END), 0) as furnizori_sold, - - -- TREZORERIE SOLD - COALESCE(SUM(CASE - WHEN vb.cont IN ('5121','5311','5124','5314') THEN vb.solddeb - vb.soldcred - ELSE 0 - END), 0) as trezorerie_sold - - FROM trend_periods tp - LEFT JOIN {schema}.vbalanta_parteneri vb - ON vb.an = tp.anul - AND vb.luna = tp.luna - AND vb.cont in ('4111', '461', '419', '401', '404', '462', '409','5121','5311','5124','5314') - GROUP BY tp.anul, tp.luna - ), - prev_comprehensive_data AS ( - SELECT - tp.anul, - tp.luna, - tp.anul||'-'||LPAD(tp.luna,2,'0') as perioada, - - -- CLIENTI - facturat (cifra de afaceri - vanzari) - COALESCE(SUM(CASE - WHEN vb.cont in ('4111', '461') THEN vb.debit - ELSE 0 - END), 0) as clienti_facturat, - - -- CLIENTI - incasat (incasari de la clienti) - COALESCE(SUM(CASE - WHEN vb.cont IN ('4111', '461') THEN vb.credit - WHEN vb.cont in ('419') THEN vb.debit - ELSE 0 - END), 0) as clienti_incasat, - - -- FURNIZORI - facturat (achizitii) - COALESCE(SUM(CASE - WHEN vb.cont in ('401', '404', '462') THEN vb.credit - ELSE 0 - END), 0) as furnizori_facturat, - - -- FURNIZORI - achitat (plati catre furnizori) - COALESCE(SUM(CASE - WHEN vb.cont in ('401', '404', '462') THEN vb.debit - WHEN vb.cont in ('409') THEN vb.credit - ELSE 0 - END), 0) as furnizori_achitat, - - -- CLIENTI SOLD (balanta clienti) - COALESCE(SUM(CASE - WHEN vb.cont IN ('4111', '461') THEN vb.solddeb - vb.soldcred - WHEN vb.cont IN ('419') THEN vb.soldcred - vb.solddeb - ELSE 0 - END), 0) as clienti_sold, - - -- FURNIZORI SOLD (balanta furnizori) - COALESCE(SUM(CASE - WHEN vb.cont in ('401', '404', '462') THEN vb.soldcred - vb.solddeb - WHEN vb.cont IN ('409') THEN vb.solddeb - vb.soldcred - ELSE 0 - END), 0) as furnizori_sold, - - -- TREZORERIE SOLD - COALESCE(SUM(CASE - WHEN vb.cont IN ('5121','5311','5124','5314') THEN vb.solddeb - vb.soldcred - ELSE 0 - END), 0) as trezorerie_sold - - FROM prev_trend_periods tp - LEFT JOIN {schema}.vbalanta_parteneri vb - ON vb.an = tp.anul - AND vb.luna = tp.luna - AND vb.cont in ('4111', '461', '419', '401', '404', '462', '409','5121','5311','5124','5314') - GROUP BY tp.anul, tp.luna - ) - SELECT - 'current' as data_type, - cd.anul, - cd.luna, - cd.perioada, - cd.clienti_facturat, - cd.clienti_incasat, - cd.furnizori_facturat, - cd.furnizori_achitat, - cd.clienti_sold, - cd.furnizori_sold, - cd.trezorerie_sold - FROM comprehensive_data cd - UNION ALL - SELECT - 'previous' as data_type, - pcd.anul, - pcd.luna, - pcd.perioada, - pcd.clienti_facturat, - pcd.clienti_incasat, - pcd.furnizori_facturat, - pcd.furnizori_achitat, - pcd.clienti_sold, - pcd.furnizori_sold, - pcd.trezorerie_sold - FROM prev_comprehensive_data pcd - ORDER BY data_type DESC, anul ASC, luna ASC - """ - - cursor.execute(trends_query) - all_results = cursor.fetchall() - - # Separate current and previous results - result = [row[1:] for row in all_results if row[0] == 'current'] - prev_result = [row[1:] for row in all_results if row[0] == 'previous'] - - if not result: - # Return empty arrays in the expected format - return { - "periods": [], - "clienti_facturat": [], - "clienti_incasat": [], - "furnizori_facturat": [], - "furnizori_achitat": [], - "clienti_sold": [], - "furnizori_sold": [], - "trezorerie_sold": [], - "rata_incasare_clienti": [], - "rata_achitare_furnizori": [], - "previous_periods": [], - "clienti_facturat_prev": [], - "clienti_incasat_prev": [], - "furnizori_facturat_prev": [], - "furnizori_achitat_prev": [], - "clienti_sold_prev": [], - "furnizori_sold_prev": [], - "trezorerie_sold_prev": [], - "metadata": { - "period": period, - "company_id": company_id, - "data_points": 0, - "grouping": "monthly" - } - } - - # Process results into the expected format - periods = [] - clienti_facturat = [] - clienti_incasat = [] - furnizori_facturat = [] - furnizori_achitat = [] - clienti_sold = [] - furnizori_sold = [] - trezorerie_sold = [] - rata_incasare_clienti = [] - rata_achitare_furnizori = [] - - # Process previous period results - previous_periods = [] - clienti_facturat_prev = [] - clienti_incasat_prev = [] - furnizori_facturat_prev = [] - furnizori_achitat_prev = [] - clienti_sold_prev = [] - furnizori_sold_prev = [] - trezorerie_sold_prev = [] - - for row in result: - # After row[1:], indices are: 0=anul, 1=luna, 2=perioada, 3=clienti_facturat, etc. - periods.append(row[2]) # perioada - clienti_facturat.append(float(row[3] or 0)) - clienti_incasat.append(float(row[4] or 0)) - furnizori_facturat.append(float(row[5] or 0)) - furnizori_achitat.append(float(row[6] or 0)) - clienti_sold.append(float(row[7] or 0)) - furnizori_sold.append(float(row[8] or 0)) - trezorerie_sold.append(float(row[9] or 0)) - - # Calculate collection and payment rates - cf = float(row[3] or 0) # clienti_facturat - ci = float(row[4] or 0) # clienti_incasat - ff = float(row[5] or 0) # furnizori_facturat - fa = float(row[6] or 0) # furnizori_achitat - - # Collection rate (rata incasare clienti) - rata_incasare = (ci / cf * 100) if cf > 0 else 0 - rata_incasare_clienti.append(round(rata_incasare, 2)) - - # Payment rate (rata achitare furnizori) - rata_achitare = (fa / ff * 100) if ff > 0 else 0 - rata_achitare_furnizori.append(round(rata_achitare, 2)) - - # Process previous period data - for row in prev_result: - previous_periods.append(row[2]) # perioada - clienti_facturat_prev.append(float(row[3] or 0)) - clienti_incasat_prev.append(float(row[4] or 0)) - furnizori_facturat_prev.append(float(row[5] or 0)) - furnizori_achitat_prev.append(float(row[6] or 0)) - clienti_sold_prev.append(float(row[7] or 0)) - furnizori_sold_prev.append(float(row[8] or 0)) - trezorerie_sold_prev.append(float(row[9] or 0)) - - # Calculate growth rates - growth_rates = {} - if len(periods) >= 2: - datasets = { - 'clienti_facturat': clienti_facturat, - 'clienti_incasat': clienti_incasat, - 'furnizori_facturat': furnizori_facturat, - 'furnizori_achitat': furnizori_achitat, - 'trezorerie_sold': trezorerie_sold - } - - for key, values in datasets.items(): - if len(values) >= 2: - previous_value = values[0] - current_value = values[-1] - if previous_value != 0: - growth_rate = round((current_value - previous_value) / abs(previous_value) * 100, 2) - else: - growth_rate = 100.0 if current_value > 0 else -100.0 if current_value < 0 else 0.0 - growth_rates[key] = growth_rate - - return { - "periods": periods, - "clienti_facturat": clienti_facturat, - "clienti_incasat": clienti_incasat, - "furnizori_facturat": furnizori_facturat, - "furnizori_achitat": furnizori_achitat, - "clienti_sold": clienti_sold, - "furnizori_sold": furnizori_sold, - "trezorerie_sold": trezorerie_sold, - "rata_incasare_clienti": rata_incasare_clienti, - "rata_achitare_furnizori": rata_achitare_furnizori, - "previous_periods": previous_periods, - "clienti_facturat_prev": clienti_facturat_prev, - "clienti_incasat_prev": clienti_incasat_prev, - "furnizori_facturat_prev": furnizori_facturat_prev, - "furnizori_achitat_prev": furnizori_achitat_prev, - "clienti_sold_prev": clienti_sold_prev, - "furnizori_sold_prev": furnizori_sold_prev, - "trezorerie_sold_prev": trezorerie_sold_prev, - "metadata": { - "period": period, - "company_id": company_id, - "data_points": len(periods), - "previous_data_points": len(previous_periods), - "grouping": "monthly" - }, - "growth_rates": growth_rates - } - - except Exception as e: - logger.error(f"Error getting comprehensive trends: {str(e)}") - raise - - @staticmethod - async def get_detailed_data(company: str, data_type: str, luna: Optional[int] = None, an: Optional[int] = None, page: int = 1, page_size: int = 25, search: str = "", server_id: Optional[str] = None): - """ - Obține date detaliate pentru tabelele din dashboard - Fixed to use existing vireg_parteneri view instead of missing tables - - Args: - company: ID-ul firmei - data_type: Tipul datelor (clients, suppliers, treasury) - luna: Luna contabilă (1-12), opțional - an: Anul contabil, opțional - page: Pagina curentă - page_size: Mărimea paginii - search: Termen de căutare - server_id: ID-ul serverului Oracle (pentru multi-server) - """ - logger.info(f"get_detailed_data called: company={company}, data_type={data_type}, luna={luna}, an={an}, page={page}") - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - try: - # Get schema for company - schema_query = """ - SELECT schema - FROM CONTAFIN_ORACLE.v_nom_firme - WHERE id_firma = :company_id - """ - cursor.execute(schema_query, {'company_id': int(company)}) - schema_result = cursor.fetchone() - - if not schema_result: - logger.error(f"Schema not found for company {company}") - return {"error": "Schema not found for company", "data": [], "total": 0} - - schema = schema_result[0] - logger.info(f"Found schema: {schema}") - - # Construiește CTE pentru perioada curentă - period_cte, period_params = DashboardService._build_period_cte(schema, luna, an) - - # Calculate offset for pagination - offset = (page - 1) * page_size - logger.info(f"Pagination params: page={page}, page_size={page_size}, offset={offset}") - - # Handle treasury early return - if data_type == "treasury": - return { - "data": [], - "total": 0, - "page": page, - "page_size": page_size, - "total_pages": 0, - "message": "Date detaliate pentru trezorerie nu sunt disponibile" - } - - # Build query based on data type - if data_type == "clients": - # Query cu paginare pe CLIENȚI (nu pe facturi individuale) - base_query = f""" - {period_cte}, - clienti_cu_sold AS ( - -- Pasul 1: Identifică TOȚI clienții cu sold != 0 - SELECT DISTINCT vp.nume as client_name - FROM {schema}.vireg_parteneri vp, luna_curenta lc - WHERE vp.an = lc.anul - AND vp.luna = lc.luna - AND vp.cont IN ('4111','461') - AND vp.nume IS NOT NULL - AND ((vp.precdeb + vp.debit) - (vp.preccred + vp.credit)) <> 0 - AND (UPPER(vp.nume) LIKE UPPER('%{search}%') OR '{search}' = '') - ORDER BY vp.nume ASC - ), - clienti_pagina AS ( - -- Pasul 2: Paginează pe CLIENȚI (25 clienți/pagină) - SELECT * FROM ( - SELECT t.*, ROWNUM as rn FROM clienti_cu_sold t WHERE ROWNUM <= {offset + page_size} - ) WHERE rn > {offset} - ) - -- Pasul 3: Ia TOATE facturile pentru clienții din pagina curentă - SELECT - vp.nume as client, - vp.nract as numar_document, - vp.dataact as data_document, - (vp.precdeb + vp.debit) as facturat, - (vp.preccred + vp.credit) as incasat, - (vp.precdeb + vp.debit) - (vp.preccred + vp.credit) as sold, - NVL(vp.datascad, vp.dataact + 30) as data_scadenta, - CASE - WHEN NVL(vp.datascad, vp.dataact + 30) < TRUNC(SYSDATE) THEN 'Restant' - ELSE 'In termen' - END as status - FROM {schema}.vireg_parteneri vp, luna_curenta lc, clienti_pagina cp - WHERE vp.an = lc.anul - AND vp.luna = lc.luna - AND vp.nume = cp.client_name - AND vp.cont IN ('4111','461') - AND ((vp.precdeb + vp.debit) - (vp.preccred + vp.credit)) <> 0 - ORDER BY vp.nume ASC, vp.dataact DESC - """ - - elif data_type == "suppliers": - # Query cu paginare pe FURNIZORI (nu pe facturi individuale) - base_query = f""" - {period_cte}, - furnizori_cu_sold AS ( - -- Pasul 1: Identifică TOȚI furnizorii cu sold != 0 - SELECT DISTINCT vp.nume as furnizor_name - FROM {schema}.vireg_parteneri vp, luna_curenta lc - WHERE vp.an = lc.anul - AND vp.luna = lc.luna - AND vp.cont IN ('401','404','462') - AND vp.nume IS NOT NULL - AND ((vp.preccred + vp.credit) - (vp.precdeb + vp.debit)) <> 0 - AND (UPPER(vp.nume) LIKE UPPER('%{search}%') OR '{search}' = '') - ORDER BY vp.nume ASC - ), - furnizori_pagina AS ( - -- Pasul 2: Paginează pe FURNIZORI (25 furnizori/pagină) - SELECT * FROM ( - SELECT t.*, ROWNUM as rn FROM furnizori_cu_sold t WHERE ROWNUM <= {offset + page_size} - ) WHERE rn > {offset} - ) - -- Pasul 3: Ia TOATE facturile pentru furnizorii din pagina curentă - SELECT - vp.nume as furnizor, - vp.nract as numar_document, - vp.dataact as data_document, - (vp.preccred + vp.credit) as facturat, - (vp.precdeb + vp.debit) as achitat, - (vp.preccred + vp.credit) - (vp.precdeb + vp.debit) as sold, - NVL(vp.datascad, vp.dataact + 30) as data_scadenta, - CASE - WHEN NVL(vp.datascad, vp.dataact + 30) < TRUNC(SYSDATE) THEN 'Restant' - ELSE 'In termen' - END as status - FROM {schema}.vireg_parteneri vp, luna_curenta lc, furnizori_pagina fp - WHERE vp.an = lc.anul - AND vp.luna = lc.luna - AND vp.nume = fp.furnizor_name - AND vp.cont IN ('401','404','462') - AND ((vp.preccred + vp.credit) - (vp.precdeb + vp.debit)) <> 0 - ORDER BY vp.nume ASC, vp.dataact DESC - """ - else: - return {"error": "Invalid data type", "data": [], "total": 0} - - # Get total count of CLIENȚI/FURNIZORI (not individual invoices) - if data_type == "clients": - count_query = f""" - {period_cte} - SELECT COUNT(DISTINCT vp.nume) - FROM {schema}.vireg_parteneri vp, luna_curenta lc - WHERE vp.an = lc.anul - AND vp.luna = lc.luna - AND vp.cont IN ('4111','461') - AND vp.nume IS NOT NULL - AND ((vp.precdeb + vp.debit) - (vp.preccred + vp.credit)) <> 0 - AND (UPPER(vp.nume) LIKE UPPER('%{search}%') OR '{search}' = '') - """ - elif data_type == "suppliers": - count_query = f""" - {period_cte} - SELECT COUNT(DISTINCT vp.nume) - FROM {schema}.vireg_parteneri vp, luna_curenta lc - WHERE vp.an = lc.anul - AND vp.luna = lc.luna - AND vp.cont IN ('401','404','462') - AND vp.nume IS NOT NULL - AND ((vp.preccred + vp.credit) - (vp.precdeb + vp.debit)) <> 0 - AND (UPPER(vp.nume) LIKE UPPER('%{search}%') OR '{search}' = '') - """ - - cursor.execute(count_query, period_params) - total = cursor.fetchone()[0] - logger.info(f"Total {data_type}: {total}") - - # Execute base query directly (pagination already included in CTE) - logger.info(f"Executing query with offset={offset}, page_size={page_size}") - cursor.execute(base_query, period_params) - columns = [desc[0].lower() for desc in cursor.description] - - data = [] - for row in cursor.fetchall(): - # Map row data to column names - data.append(dict(zip(columns, row))) - - # Count unique clients/suppliers in returned data - if data_type == "clients": - unique_names = len(set(row.get('client') for row in data)) - logger.info(f"Returned {len(data)} invoices from {unique_names} unique clients (expected max {page_size} clients)") - elif data_type == "suppliers": - unique_names = len(set(row.get('furnizor') for row in data)) - logger.info(f"Returned {len(data)} invoices from {unique_names} unique suppliers (expected max {page_size} suppliers)") - - logger.info(f"Detailed data query returned {len(data)} rows out of {total} total") - - return { - "data": data, - "total": total, - "page": page, - "page_size": page_size, - "total_pages": (total + page_size - 1) // page_size - } - - except Exception as e: - logger.error(f"Error in get_detailed_data: {str(e)}") - return {"error": f"Database error: {str(e)}", "data": [], "total": 0} - - @staticmethod - async def get_performance_data(company_id: int, period: str = "7d", server_id: Optional[str] = None) -> Dict[str, Any]: - """ - Calculează performanța încasări/plăți pentru perioada selectată - - Args: - company_id: ID-ul companiei - period: Perioada ("7d", "1m", "3m", "6m", "ytd", "12m") - server_id: ID-ul serverului Oracle (pentru multi-server) - - Returns: - { - labels: List[str] - etichete pentru perioadele de timp - incasari: List[float] - valorile încasărilor pe perioadă - plati: List[float] - valorile plăților pe perioadă - indicators: { - rataIncasare: float - rata de încasare (%) - cashConversion: int - zilele de conversie cash - workingCapital: float - capitalul de lucru - trend: str - tendința ("up", "down", "stable") - } - } - """ - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Get schema - schema_query = "SELECT schema FROM CONTAFIN_ORACLE.v_nom_firme WHERE id_firma = :company_id" - cursor.execute(schema_query, {'company_id': company_id}) - schema_result = cursor.fetchone() - - if not schema_result: - raise ValueError(f"Schema nu a fost găsită pentru id_firma {company_id}") - - schema = schema_result[0] - - # Pentru acum returnăm date mock cu structura corectă - # TODO: Implementați query-uri Oracle pentru perioada selectată - - # Mock data based on period - if period == "7d": - labels = ["Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"] - incasari = [45000, 52000, 38000, 61000, 49000, 33000, 28000] - plati = [31000, 44000, 29000, 48000, 37000, 25000, 19000] - elif period == "1m": - labels = ["Săpt 1", "Săpt 2", "Săpt 3", "Săpt 4"] - incasari = [185000, 201000, 168000, 195000] - plati = [142000, 156000, 133000, 151000] - elif period == "3m": - labels = ["Luna 1", "Luna 2", "Luna 3"] - incasari = [749000, 698000, 823000] - plati = [582000, 519000, 634000] - elif period == "6m": - labels = ["Ian", "Feb", "Mar", "Apr", "Mai", "Iun"] - incasari = [749000, 698000, 823000, 756000, 681000, 792000] - plati = [582000, 519000, 634000, 588000, 523000, 612000] - elif period == "ytd": - labels = ["Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Nov", "Dec"] - incasari = [749000, 698000, 823000, 756000, 681000, 792000, 834000, 712000, 768000, 695000, 743000, 821000] - plati = [582000, 519000, 634000, 588000, 523000, 612000, 647000, 553000, 596000, 539000, 577000, 638000] - else: # 12m - labels = ["Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Nov", "Dec"] - incasari = [749000, 698000, 823000, 756000, 681000, 792000, 834000, 712000, 768000, 695000, 743000, 821000] - plati = [582000, 519000, 634000, 588000, 523000, 612000, 647000, 553000, 596000, 539000, 577000, 638000] - - # Calculate indicators - total_incasari = sum(incasari) - total_plati = sum(plati) - - rata_incasare = round((total_incasari / (total_incasari * 1.15)) * 100, 1) if total_incasari > 0 else 0 # Assuming 15% more was invoiced - cash_conversion = 45 # Days - mock value - working_capital = total_incasari - total_plati - - # Determine trend - if len(incasari) >= 2: - trend = "up" if incasari[-1] > incasari[-2] else "down" if incasari[-1] < incasari[-2] else "stable" - else: - trend = "stable" - - return { - "labels": labels, - "incasari": incasari, - "plati": plati, - "indicators": { - "rataIncasare": rata_incasare, - "cashConversion": cash_conversion, - "workingCapital": working_capital, - "trend": trend - } - } - - except Exception as e: - logger.error(f"Error getting performance data: {str(e)}") - raise - - @staticmethod - async def get_cashflow_forecast(company_id: int, period: str = "7d", server_id: Optional[str] = None) -> Dict[str, Any]: - """ - Calculează previziunea cash flow bazată pe scadențe - - Args: - company_id: ID-ul companiei - period: Perioada ("7d", "1m", "3m", "6m") - server_id: ID-ul serverului Oracle (pentru multi-server) - - Returns: - { - periods: List[str] - perioadele de timp - inflows: List[float] - intrările de cash estimate - outflows: List[float] - ieșirile de cash estimate - netFlow: List[float] - fluxul net pe perioadă - cumulative: List[float] - fluxul cumulativ - criticalDays: List[str] - zilele cu deficit critic - netTotal: float - totalul net al perioadei - } - """ - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Get schema - schema_query = "SELECT schema FROM CONTAFIN_ORACLE.v_nom_firme WHERE id_firma = :company_id" - cursor.execute(schema_query, {'company_id': company_id}) - schema_result = cursor.fetchone() - - if not schema_result: - raise ValueError(f"Schema nu a fost găsită pentru id_firma {company_id}") - - schema = schema_result[0] - - # Pentru acum returnăm date mock cu structura corectă - # TODO: Implementați query-uri pentru scadențe viitoare - - # Mock data based on period - if period == "7d": - periods = ["Lun", "Mar", "Mie", "Joi", "Vin", "Sâm", "Dum"] - inflows = [25000, 18000, 32000, 45000, 28000, 15000, 12000] - outflows = [31000, 22000, 19000, 38000, 25000, 18000, 8000] - elif period == "1m": - periods = ["Săpt 1", "Săpt 2", "Săpt 3", "Săpt 4"] - inflows = [95000, 112000, 88000, 105000] - outflows = [108000, 92000, 75000, 89000] - elif period == "3m": - periods = ["Luna 1", "Luna 2", "Luna 3"] - inflows = [400000, 365000, 420000] - outflows = [364000, 298000, 385000] - else: # 6m - periods = ["Ian", "Feb", "Mar", "Apr", "Mai", "Iun"] - inflows = [400000, 365000, 420000, 385000, 342000, 396000] - outflows = [364000, 298000, 385000, 356000, 289000, 367000] - - # Calculate net flow and cumulative - net_flow = [inf - out for inf, out in zip(inflows, outflows)] - - cumulative = [] - running_total = 150000 # Starting cash position (mock) - for net in net_flow: - running_total += net - cumulative.append(running_total) - - # Identify critical days (negative cumulative) - critical_days = [] - for i, (period_name, cum) in enumerate(zip(periods, cumulative)): - if cum < 0: - critical_days.append(period_name) - - net_total = sum(net_flow) - - return { - "periods": periods, - "inflows": inflows, - "outflows": outflows, - "netFlow": net_flow, - "cumulative": cumulative, - "criticalDays": critical_days, - "netTotal": net_total - } - - except Exception as e: - logger.error(f"Error getting cashflow forecast: {str(e)}") - raise - - @staticmethod - @cached(cache_type='maturity_analysis', key_params=['company_id', 'period', 'luna', 'an', 'server_id']) - async def get_maturity_analysis(company_id: int, period: str = "7d", luna: Optional[int] = None, an: Optional[int] = None, request: Optional[Request] = None, server_id: Optional[str] = None) -> Dict[str, Any]: - """ - Analizează scadențele clienți vs furnizori cu date reale din Oracle (CACHED 30 min) - - Args: - company_id: ID-ul companiei - period: Perioada ("7d", "1m", "3m", "6m", "12m", "over12m") - luna: Luna contabilă (1-12), opțional - an: Anul contabil, opțional - server_id: ID-ul serverului Oracle (pentru multi-server) - - Returns: - { - clients: List[Dict] - [{name, amount, dueDate, daysOverdue}, ...] - suppliers: List[Dict] - [{name, amount, dueDate, daysOverdue}, ...] - balance: float - balanța între clienți și furnizori - recommendations: List[str] - recomandări pentru îmbunătățire - } - """ - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Get schema - schema_query = "SELECT schema FROM CONTAFIN_ORACLE.v_nom_firme WHERE id_firma = :company_id" - cursor.execute(schema_query, {'company_id': company_id}) - schema_result = cursor.fetchone() - - if not schema_result: - raise ValueError(f"Schema nu a fost găsită pentru id_firma {company_id}") - - schema = schema_result[0] - - # Construiește CTE pentru perioada curentă - period_cte, period_params = DashboardService._build_period_cte(schema, luna, an) - - # Determină filtrele pentru perioada selectată (orizont de planificare) - # Logică: Include TOATE restanțele + scadențele viitoare din perioada selectată - if period == "7d": - days_filter = "datascad <= TRUNC(SYSDATE) + 7" - elif period == "1m": - days_filter = "datascad <= TRUNC(SYSDATE) + 30" - elif period == "3m": - days_filter = "datascad <= TRUNC(SYSDATE) + 90" - elif period == "6m": - days_filter = "datascad <= TRUNC(SYSDATE) + 180" - elif period == "12m": - days_filter = "datascad <= TRUNC(SYSDATE) + 365" - else: # "all" - toate soldurile - days_filter = "1=1" - - # Query pentru clienți (facturi de încasat) - clients_query = f""" - {period_cte} - SELECT client_name, - SUM(amount) as amount, - MAX(due_date) as due_date, - MAX(days_overdue) as days_overdue - FROM (SELECT vp.nume as client_name, - ((vp.precdeb + vp.debit) - (vp.preccred + vp.credit)) as amount, - NVL(vp.datascad, vp.DATAACT + 30) as due_date, - TRUNC(SYSDATE) - NVL(vp.datascad, vp.DATAACT + 30) as days_overdue - FROM {schema}.vireg_parteneri vp, luna_curenta lc - WHERE vp.an = lc.anul - AND vp.luna = lc.luna - AND vp.cont IN ('4111', '461') - AND vp.nume IS NOT NULL - AND {days_filter} - AND ((vp.precdeb + vp.debit) - (vp.preccred + vp.credit)) <> 0) - GROUP BY client_name - HAVING SUM (amount) <> 0 - ORDER BY days_overdue desc - """ - - cursor.execute(clients_query, period_params) - clients_rows = cursor.fetchall() - - clients = [] - for row in clients_rows: - client_name = row[0] - amount = float(row[1] or 0) - due_date = row[2].strftime('%Y-%m-%d') if row[2] else None - days_overdue = int(row[3] or 0) - - clients.append({ - "name": client_name, - "amount": amount, - "dueDate": due_date, - "daysOverdue": days_overdue - }) - - # Sortare îmbunătățită: Restanțe primele (descrescător), apoi scadențe viitoare (crescător) - clients.sort(key=lambda x: (-1 if x["daysOverdue"] > 0 else 1, -x["daysOverdue"] if x["daysOverdue"] > 0 else x["daysOverdue"])) - - # Query pentru furnizori (facturi de plătit) - suppliers_query = f""" - {period_cte} - SELECT client_name, - SUM(amount) as amount, - MIN(due_date) as due_date, - MAX(days_overdue) as days_overdue - FROM (SELECT vp.nume as client_name, - ((vp.preccred + vp.credit)-(vp.precdeb + vp.debit)) as amount, - NVL(vp.datascad, vp.DATAACT + 30) as due_date, - TRUNC(SYSDATE) - NVL(vp.datascad, vp.DATAACT + 30) as days_overdue - FROM {schema}.vireg_parteneri vp, luna_curenta lc - WHERE vp.an = lc.anul - AND vp.luna = lc.luna - AND vp.cont IN ('401', '404', '462') - AND vp.nume IS NOT NULL - AND {days_filter} - AND ((vp.preccred + vp.credit)-(vp.precdeb + vp.debit)) <> 0) - GROUP BY client_name - HAVING SUM (amount) <> 0 - ORDER BY days_overdue desc - """ - - cursor.execute(suppliers_query, period_params) - suppliers_rows = cursor.fetchall() - - suppliers = [] - for row in suppliers_rows: - supplier_name = row[0] - amount = float(row[1] or 0) - due_date = row[2].strftime('%Y-%m-%d') if row[2] else None - days_overdue = int(row[3] or 0) - - suppliers.append({ - "name": supplier_name, - "amount": amount, - "dueDate": due_date, - "daysOverdue": days_overdue - }) - - # Sortare îmbunătățită: Restanțe primele (descrescător), apoi scadențe viitoare (crescător) - suppliers.sort(key=lambda x: (-1 if x["daysOverdue"] > 0 else 1, -x["daysOverdue"] if x["daysOverdue"] > 0 else x["daysOverdue"])) - - # Calculează balanța - total_clients = sum(c["amount"] for c in clients) - total_suppliers = sum(s["amount"] for s in suppliers) - balance = total_clients - total_suppliers - - # Generează recomandări bazate pe date reale - recommendations = [] - - if balance < -50000: - recommendations.extend([ - "Deficit de cash flow identificat - prioritizați încasările", - "Negociați termeni de plată mai buni cu furnizorii", - "Considerați finanțare pe termen scurt" - ]) - elif balance > 100000: - recommendations.extend([ - "Surplus de cash disponibil pentru investiții", - "Considerați plăți anticipate pentru reduceri", - "Evaluați oportunități de investire a excesului" - ]) - else: - recommendations.append("Balanța cash flow este echilibrată") - - overdue_clients = [c for c in clients if c["daysOverdue"] > 0] - if overdue_clients: - total_overdue = sum(c["amount"] for c in overdue_clients) - recommendations.append(f"Atenție: {len(overdue_clients)} clienți în restanță (total: {total_overdue:,.0f} RON)") - - overdue_suppliers = [s for s in suppliers if s["daysOverdue"] > 0] - if overdue_suppliers: - total_overdue = sum(s["amount"] for s in overdue_suppliers) - recommendations.append(f"Urgent: {len(overdue_suppliers)} furnizori în restanță (total: {total_overdue:,.0f} RON)") - - # Adaugă recomandări specifice pentru clienți cu restanțe mari - critical_clients = [c for c in overdue_clients if c["daysOverdue"] > 30] - if critical_clients: - recommendations.append(f"Critică: {len(critical_clients)} clienți cu restanțe peste 30 de zile") - - # Adaugă metadate pentru context complet - metadata = { - "period": period, - "total_clients": len(clients), - "total_suppliers": len(suppliers), - "overdue_clients": len(overdue_clients), - "overdue_suppliers": len(overdue_suppliers), - "critical_clients": len(critical_clients) if critical_clients else 0, - "total_overdue_amount_clients": sum(c["amount"] for c in overdue_clients) if overdue_clients else 0, - "total_overdue_amount_suppliers": sum(s["amount"] for s in overdue_suppliers) if overdue_suppliers else 0 - } - - return { - "clients": clients, - "suppliers": suppliers, - "balance": balance, - "recommendations": recommendations, - "metadata": metadata - } - - except Exception as e: - logger.error(f"Error getting maturity analysis: {str(e)}") - raise - - @staticmethod - @cached(cache_type='monthly_flows', key_params=['company', 'luna', 'an', 'server_id']) - async def get_monthly_flows(company: int, luna: Optional[int] = None, an: Optional[int] = None, request: Optional[Request] = None, server_id: Optional[str] = None) -> Dict[str, Any]: - """ - Obține fluxurile lunare de intrare și ieșire pentru luna curentă (CACHED 30 min) - - Args: - company: ID-ul firmei - luna: Luna contabilă (1-12), opțional - an: Anul contabil, opțional - request: Request object pentru cache metadata - server_id: ID-ul serverului Oracle (pentru multi-server) - """ - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Obține schema - company_id = company - schema_query = "SELECT schema FROM CONTAFIN_ORACLE.v_nom_firme WHERE id_firma = :company_id" - cursor.execute(schema_query, {'company_id': company_id}) - schema_result = cursor.fetchone() - - if not schema_result: - raise ValueError(f"Schema nu a fost găsită pentru id_firma {company_id}") - - schema = schema_result[0] - - # Construiește CTE pentru perioada curentă (cu period column) - if luna is not None and an is not None: - period_cte = f""" - WITH luna_curenta AS ( - SELECT :param_an as anul, :param_luna as luna, - :param_an || '-' || LPAD(:param_luna, 2, '0') as period - FROM DUAL - )""" - period_params = {'param_an': an, 'param_luna': luna} - else: - period_cte = f""" - WITH luna_curenta AS ( - SELECT anul, luna, anul || '-' || LPAD(luna, 2, '0') as period - FROM {schema}.calendar - WHERE anul * 12 + luna = (SELECT MAX(c2.anul * 12 + c2.luna) FROM {schema}.calendar c2) - )""" - period_params = {} - - # Query pentru fluxuri lunare - flows_query = f""" - {period_cte} - SELECT - SUM(CASE - WHEN vp.cont IN ('4111', '461') THEN - vp.credit - WHEN vp.cont IN ('419') THEN - vp.debit - ELSE - 0 - END) as monthly_inflows, - SUM(CASE - WHEN vp.cont IN ('401', '404', '462') THEN - vp.debit - WHEN vp.cont IN ('409') THEN - vp.credit - ELSE - 0 - END) as monthly_outflows, - MAX(lc.period) as period - FROM {schema}.vireg_parteneri vp, luna_curenta lc - WHERE vp.an = lc.anul - AND vp.luna = lc.luna - AND vp.cont IN ('4111', '461', '419', '401', '404', '462', '409') - """ - - cursor.execute(flows_query, period_params) - flow_row = cursor.fetchone() - - if not flow_row: - # Default period from params or current date - default_period = f"{an}-{str(luna).zfill(2)}" if luna and an else "2025-12" - return { - "inflows": 0, - "outflows": 0, - "period": default_period, - "currency": "RON" - } - - return { - "inflows": float(flow_row[0] or 0), - "outflows": float(flow_row[1] or 0), - "period": flow_row[2] or "2025-08", - "currency": "RON" - } - except Exception as e: - logger.error(f"Error in get_monthly_flows: {str(e)}") - raise - - @staticmethod - @cached(cache_type='treasury_breakdown', key_params=['company', 'luna', 'an', 'server_id']) - async def get_treasury_breakdown(company: int, luna: Optional[int] = None, an: Optional[int] = None, request: Optional[Request] = None, server_id: Optional[str] = None) -> Dict[str, Any]: - """ - Obține breakdown-ul trezoreriei pe casă și bancă (CACHED 30 min) - - Args: - company: ID-ul firmei - luna: Luna contabilă (1-12), opțional - an: Anul contabil, opțional - server_id: ID-ul serverului Oracle (pentru multi-server) - """ - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Obține schema - company_id = company - schema_query = "SELECT schema FROM CONTAFIN_ORACLE.v_nom_firme WHERE id_firma = :company_id" - cursor.execute(schema_query, {'company_id': company_id}) - schema_result = cursor.fetchone() - - if not schema_result: - raise ValueError(f"Schema nu a fost găsită pentru id_firma {company_id}") - - schema = schema_result[0] - - # Construiește CTE pentru perioada curentă - period_cte, period_params = DashboardService._build_period_cte(schema, luna, an) - - # Query pentru breakdown trezorerie - cu nume reale și sub-breakdown - treasury_query = f""" - {period_cte} - SELECT - vb.cont, - vb.nume as nume_real, - (vb.solddeb - vb.soldcred) as sold, - CASE - WHEN vb.cont IN ('5311', '5314', '5328') THEN 'casa' - WHEN vb.cont IN ('5121', '5124') THEN 'banca' - END as tip - FROM {schema}.vbalanta_parteneri vb, luna_curenta lc - WHERE vb.an = lc.anul - AND vb.luna = lc.luna - AND vb.cont IN ('5311', '5314', '5328', '5121', '5124') - AND (vb.solddeb - vb.soldcred) <> 0 - ORDER BY tip, - CASE WHEN vb.cont IN ('5121','5311') THEN 0 ELSE 1 END, - UPPER(vb.nume) - """ - - cursor.execute(treasury_query, period_params) - treasury_rows = cursor.fetchall() - - if not treasury_rows: - return { - "total": 0, - "breakdown": { - "casa": {"total": 0, "items": []}, - "banca": {"total": 0, "items": []} - }, - "currency": "RON" - } - - # Procesare rezultate cu grupare pe tip - casa_items = [] - banca_items = [] - casa_total = 0 - banca_total = 0 - - for row in treasury_rows: - cont = row[0] - nume_real = row[1] # Nume din vbalanta_parteneri.nume - sold = float(row[2] or 0) - tip = row[3] - - item = { - "nume": nume_real or f"Cont {cont}", # Fallback la nume generic - "cont": cont, - "sold": sold - } - - if tip == 'casa': - casa_items.append(item) - casa_total += sold - else: # banca - banca_items.append(item) - banca_total += sold - - total = casa_total + banca_total - - return { - "total": total, - "breakdown": { - "casa": { - "total": casa_total, - "items": casa_items - }, - "banca": { - "total": banca_total, - "items": banca_items - } - }, - "currency": "RON" - } - except Exception as e: - logger.error(f"Error in get_treasury_breakdown: {str(e)}") - raise - - @staticmethod - @cached(cache_type='net_balance_breakdown', key_params=['company', 'luna', 'an', 'server_id']) - async def get_net_balance_breakdown(company: int, luna: Optional[int] = None, an: Optional[int] = None, request: Optional[Request] = None, server_id: Optional[str] = None) -> Dict[str, Any]: - """ - Obține breakdown-ul balanței nete pe clienți și furnizori cu detaliere pe perioade (CACHED 30 min) - - Args: - company: ID-ul firmei - luna: Luna contabilă (1-12), opțional - an: Anul contabil, opțional - server_id: ID-ul serverului Oracle (pentru multi-server) - """ - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Obține schema - company_id = company - schema_query = "SELECT schema FROM CONTAFIN_ORACLE.v_nom_firme WHERE id_firma = :company_id" - cursor.execute(schema_query, {'company_id': company_id}) - schema_result = cursor.fetchone() - - if not schema_result: - raise ValueError(f"Schema nu a fost găsită pentru id_firma {company_id}") - - schema = schema_result[0] - - # Construiește CTE pentru perioada curentă - period_cte, period_params = DashboardService._build_period_cte(schema, luna, an) - - # Query extins pentru breakdown detaliat pe perioade - balance_query = f""" - {period_cte} - SELECT - -- CLIENȚI - Sold total - SUM(CASE - WHEN vp.cont IN ('4111','461') - THEN (vp.precdeb + vp.debit) - (vp.preccred + vp.credit) - WHEN vp.cont = '419' - THEN -((vp.preccred + vp.credit) - (vp.precdeb + vp.debit)) - ELSE 0 - END) as clienti_total, - - -- CLIENȚI - În termen (total) - SUM(CASE - WHEN vp.cont IN ('4111','461') - AND NVL(vp.datascad, vp.dataact + 30) >= TRUNC(SYSDATE) - THEN (vp.precdeb + vp.debit) - (vp.preccred + vp.credit) - WHEN vp.cont = '419' - AND NVL(vp.datascad, vp.dataact + 30) >= TRUNC(SYSDATE) - THEN -((vp.preccred + vp.credit) - (vp.precdeb + vp.debit)) - ELSE 0 - END) as clienti_in_termen, - - -- CLIENȚI - Restanți (total) - SUM(CASE - WHEN vp.cont IN ('4111','461') - AND NVL(vp.datascad, vp.dataact + 30) < TRUNC(SYSDATE) - THEN (vp.precdeb + vp.debit) - (vp.preccred + vp.credit) - WHEN vp.cont = '419' - AND NVL(vp.datascad, vp.dataact + 30) < TRUNC(SYSDATE) - THEN -((vp.preccred + vp.credit) - (vp.precdeb + vp.debit)) - ELSE 0 - END) as clienti_restanti, - - -- CLIENȚI - Restanți pe perioade - SUM(CASE WHEN vp.cont IN ('4111','461') AND TRUNC(SYSDATE) - NVL(vp.datascad, vp.dataact + 30) BETWEEN 1 AND 7 - THEN (vp.precdeb + vp.debit) - (vp.preccred + vp.credit) ELSE 0 END) as clienti_restant_7, - SUM(CASE WHEN vp.cont IN ('4111','461') AND TRUNC(SYSDATE) - NVL(vp.datascad, vp.dataact + 30) BETWEEN 8 AND 14 - THEN (vp.precdeb + vp.debit) - (vp.preccred + vp.credit) ELSE 0 END) as clienti_restant_14, - SUM(CASE WHEN vp.cont IN ('4111','461') AND TRUNC(SYSDATE) - NVL(vp.datascad, vp.dataact + 30) BETWEEN 15 AND 30 - THEN (vp.precdeb + vp.debit) - (vp.preccred + vp.credit) ELSE 0 END) as clienti_restant_30, - SUM(CASE WHEN vp.cont IN ('4111','461') AND TRUNC(SYSDATE) - NVL(vp.datascad, vp.dataact + 30) BETWEEN 31 AND 60 - THEN (vp.precdeb + vp.debit) - (vp.preccred + vp.credit) ELSE 0 END) as clienti_restant_60, - SUM(CASE WHEN vp.cont IN ('4111','461') AND TRUNC(SYSDATE) - NVL(vp.datascad, vp.dataact + 30) BETWEEN 61 AND 90 - THEN (vp.precdeb + vp.debit) - (vp.preccred + vp.credit) ELSE 0 END) as clienti_restant_90, - SUM(CASE WHEN vp.cont IN ('4111','461') AND TRUNC(SYSDATE) - NVL(vp.datascad, vp.dataact + 30) > 90 - THEN (vp.precdeb + vp.debit) - (vp.preccred + vp.credit) ELSE 0 END) as clienti_restant_90plus, - - -- FURNIZORI - Sold total - SUM(CASE - WHEN vp.cont IN ('401','404','462') - THEN (vp.preccred + vp.credit) - (vp.precdeb + vp.debit) - WHEN vp.cont IN ('409') - THEN -((vp.precdeb + vp.debit) - (vp.preccred + vp.credit)) - ELSE 0 - END) as furnizori_total, - - -- FURNIZORI - În termen (total) - SUM(CASE - WHEN vp.cont IN ('401','404','462') AND NVL(vp.datascad, vp.dataact + 30) >= TRUNC(SYSDATE) - THEN (vp.preccred + vp.credit) - (vp.precdeb + vp.debit) - WHEN vp.cont IN ('409') AND NVL(vp.datascad, vp.dataact + 30) >= TRUNC(SYSDATE) - THEN -((vp.precdeb + vp.debit) - (vp.preccred + vp.credit)) - ELSE 0 - END) as furnizori_in_termen, - - -- FURNIZORI - Restanți (total) - SUM(CASE - WHEN vp.cont IN ('401','404','462') AND NVL(vp.datascad, vp.dataact + 30) < TRUNC(SYSDATE) - THEN (vp.preccred + vp.credit) - (vp.precdeb + vp.debit) - WHEN vp.cont IN ('409') AND NVL(vp.datascad, vp.dataact + 30) < TRUNC(SYSDATE) - THEN -((vp.precdeb + vp.debit) - (vp.preccred + vp.credit)) - ELSE 0 - END) as furnizori_restanti, - - -- FURNIZORI - Restanți pe perioade - SUM(CASE WHEN vp.cont IN ('401','404','462') AND TRUNC(SYSDATE) - NVL(vp.datascad, vp.dataact + 30) BETWEEN 1 AND 7 - THEN (vp.preccred + vp.credit) - (vp.precdeb + vp.debit) ELSE 0 END) as furnizori_restant_7, - SUM(CASE WHEN vp.cont IN ('401','404','462') AND TRUNC(SYSDATE) - NVL(vp.datascad, vp.dataact + 30) BETWEEN 8 AND 14 - THEN (vp.preccred + vp.credit) - (vp.precdeb + vp.debit) ELSE 0 END) as furnizori_restant_14, - SUM(CASE WHEN vp.cont IN ('401','404','462') AND TRUNC(SYSDATE) - NVL(vp.datascad, vp.dataact + 30) BETWEEN 15 AND 30 - THEN (vp.preccred + vp.credit) - (vp.precdeb + vp.debit) ELSE 0 END) as furnizori_restant_30, - SUM(CASE WHEN vp.cont IN ('401','404','462') AND TRUNC(SYSDATE) - NVL(vp.datascad, vp.dataact + 30) BETWEEN 31 AND 60 - THEN (vp.preccred + vp.credit) - (vp.precdeb + vp.debit) ELSE 0 END) as furnizori_restant_60, - SUM(CASE WHEN vp.cont IN ('401','404','462') AND TRUNC(SYSDATE) - NVL(vp.datascad, vp.dataact + 30) BETWEEN 61 AND 90 - THEN (vp.preccred + vp.credit) - (vp.precdeb + vp.debit) ELSE 0 END) as furnizori_restant_90, - SUM(CASE WHEN vp.cont IN ('401','404','462') AND TRUNC(SYSDATE) - NVL(vp.datascad, vp.dataact + 30) > 90 - THEN (vp.preccred + vp.credit) - (vp.precdeb + vp.debit) ELSE 0 END) as furnizori_restant_90plus - - FROM {schema}.vireg_parteneri vp, luna_curenta lc - WHERE vp.an = lc.anul - AND vp.luna = lc.luna - AND vp.cont IN ('4111', '461', '419', '401', '404', '462','409') - """ - - cursor.execute(balance_query, period_params) - row = cursor.fetchone() - - if not row: - return { - "clienti_total": 0, - "furnizori_total": 0, - "breakdown": { - "clienti": { - "total": 0, - "in_termen": {"total": 0}, - "restant": {"total": 0, "perioade": {}} - }, - "furnizori": { - "total": 0, - "in_termen": {"total": 0}, - "restant": {"total": 0, "perioade": {}} - } - }, - "currency": "RON" - } - - # Procesare rezultate - INDEXARE CORECTATĂ - # Coloane: 0-8 = clienti (9 coloane), 9-17 = furnizori (9 coloane) - return { - "clienti_total": float(row[0] or 0), - "furnizori_total": float(row[9] or 0), # CORECTAT: row[9] nu row[10] - "breakdown": { - "clienti": { - "total": float(row[0] or 0), - "in_termen": { - "total": float(row[1] or 0) - }, - "restant": { - "total": float(row[2] or 0), - "perioade": { - "7_zile": float(row[3] or 0), - "14_zile": float(row[4] or 0), - "30_zile": float(row[5] or 0), - "60_zile": float(row[6] or 0), - "90_zile": float(row[7] or 0), - "peste_90_zile": float(row[8] or 0) - } - } - }, - "furnizori": { - "total": float(row[9] or 0), # CORECTAT: row[9] nu row[10] - "in_termen": { - "total": float(row[10] or 0) # CORECTAT: row[10] nu row[11] - }, - "restant": { - "total": float(row[11] or 0), # CORECTAT: row[11] nu row[12] - "perioade": { - "7_zile": float(row[12] or 0), # CORECTAT - "14_zile": float(row[13] or 0), # CORECTAT - "30_zile": float(row[14] or 0), # CORECTAT - "60_zile": float(row[15] or 0), # CORECTAT - "90_zile": float(row[16] or 0), # CORECTAT - "peste_90_zile": float(row[17] or 0) # CORECTAT - } - } - } - }, - "currency": "RON" - } - except Exception as e: - logger.error(f"Error in get_net_balance_breakdown: {str(e)}") - raise - - @staticmethod - async def get_current_period(company: int, server_id: Optional[str] = None) -> Dict[str, Any]: - """ - Obține perioada curentă (an și lună) din calendarul Oracle - - Args: - company: ID-ul companiei - server_id: ID-ul serverului Oracle (pentru multi-server) - - Returns: - { - year: int - anul curent - month: int - luna curentă (1-12) - period: str - perioada în format YYYY-MM - } - """ - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Obține schema - company_id = company - schema_query = "SELECT schema FROM CONTAFIN_ORACLE.v_nom_firme WHERE id_firma = :company_id" - cursor.execute(schema_query, {'company_id': company_id}) - schema_result = cursor.fetchone() - - if not schema_result: - raise ValueError(f"Schema nu a fost găsită pentru id_firma {company_id}") - - schema = schema_result[0] - - # Query pentru perioada curentă din calendar Oracle - current_period_query = f""" - SELECT anul, luna, anul || '-' || LPAD(luna, 2, '0') as period - FROM {schema}.calendar - WHERE anul*12+luna = (SELECT MAX(anul*12+luna) FROM {schema}.calendar) - """ - - cursor.execute(current_period_query) - period_row = cursor.fetchone() - - if not period_row: - # Fallback la data curentă sistem - from datetime import datetime - now = datetime.now() - return { - "year": now.year, - "month": now.month, - "period": f"{now.year}-{now.month:02d}" - } - - return { - "year": int(period_row[0]), - "month": int(period_row[1]), - "period": period_row[2] - } - except Exception as e: - logger.error(f"Error in get_current_period: {str(e)}") - raise - diff --git a/deploy-package-20260223-151231/backend/modules/reports/services/financial_indicators_service.py b/deploy-package-20260223-151231/backend/modules/reports/services/financial_indicators_service.py deleted file mode 100644 index 8445c79..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/services/financial_indicators_service.py +++ /dev/null @@ -1,3072 +0,0 @@ -""" -Service pentru indicatori financiari - agregate din VBAL pentru calculul -ratelor de lichiditate, eficiență, risc și Altman Z-Score - -Acest serviciu agregă soldurile din balanța de verificare (VBAL) pe clase -de conturi conform Planului de Conturi General (PCG) românesc. -""" -import logging -from decimal import Decimal -from typing import Optional, Dict, List, Any - -from fastapi import Request -from shared.database.oracle_pool import oracle_pool -from ..cache.decorators import cached -from ..models.dashboard import DashboardSummary -from ..models.financial_indicators import ( - BalanceSheetAggregates, - IndicatorResult, - LiquidityIndicators, - EfficiencyIndicators, - RiskIndicators, - CashFlowIndicators, - DynamicsIndicators, - AltmanZScore, - ProfitabilityIndicators, - SolvabilityIndicators, - FinancialIndicatorsResponse -) - -logger = logging.getLogger(__name__) - - -# Prefixele conturilor conform PCG (Planul de Conturi General) românesc -# Folosite pentru agregarea soldurilor din VBAL -ACCOUNT_GROUPS = { - # ACTIVE IMOBILIZATE (Clasa 2) - # 20 - Imobilizări necorporale - # 21 - Imobilizări corporale - # 23 - Imobilizări în curs - # 26 - Imobilizări financiare - # 28 - Amortizări (se scad - sold creditor) - # 29 - Ajustări pentru depreciere (se scad - sold creditor) - "active_imobilizate": { - "debit": ["20", "21", "23", "26"], # Active brute (sold debitor) - "credit": ["28", "29"] # Amortizări și ajustări (sold creditor - se scad) - }, - - # STOCURI (Clasa 3) - # 30 - Materii prime - # 31 - Materiale consumabile - # 32 - Obiecte de inventar - # 33 - Producție în curs - # 34 - Produse finite - # 35 - Stocuri aflate la terți - # 36 - Animale - # 37 - Mărfuri - # 38 - Ambalaje - # 39 - Ajustări pentru depreciere (se scad - sold creditor) - "stocuri": { - "debit": ["30", "31", "32", "33", "34", "35", "36", "37", "38"], - "credit": ["39"] # Ajustări depreciere stocuri - }, - - # CREANȚE (din Clasa 4) - # 4111 - Clienți - # 413 - Efecte de primit - # 418 - Clienți - facturi de întocmit - # 425 - Avansuri acordate personalului - # 428 - Alte datorii și creanțe în legătură cu personalul (dacă debitoare) - # 431 - Asigurări sociale (dacă debitoare) - # 437 - Ajutor de șomaj (dacă debitoare) - # 4411 - Impozit pe profit (dacă debitor) - # 4424 - TVA de recuperat - # 444 - Impozit pe venituri de natură salarială (dacă debitor) - # 445 - Subvenții (dacă debitoare) - # 446 - Alte impozite și taxe (dacă debitoare) - # 447 - Fonduri speciale (dacă debitoare) - # 451 - Decontări între entitățile afiliate (dacă debitoare) - # 453 - Decontări privind interesele de participare (dacă debitoare) - # 456 - Decontări cu acționarii (dacă debitoare) - # 461 - Debitori diverși - # 473 - Decontări din operații în curs (dacă debitoare) - "creante": { - "debit": ["4111", "413", "418", "425", "4424", "461"], - "credit": ["491", "496"] # Ajustări pentru deprecierea creanțelor - }, - - # DISPONIBILITĂȚI (din Clasa 5) - # 5121 - Conturi la bănci în lei - # 5124 - Conturi la bănci în valută - # 5311 - Casa în lei - # 5314 - Casa în valută - # 532 - Alte valori - # 541 - Acreditive - # 542 - Avansuri de trezorerie - "disponibilitati": { - "debit": ["5121", "5124", "5311", "5314", "532", "541", "542"], - "credit": [] - }, - - # CAPITAL PROPRIU (din Clasa 1) - # 101 - Capital social - # 104 - Prime de capital - # 105 - Rezerve din reevaluare - # 106 - Rezerve - # 107 - Rezultatul reportat (poate fi debitor sau creditor) - # 108 - Interese minoritare - # 117 - Rezultatul reportat (cont distinct în unele planuri) - # 121 - Profit sau pierdere (rezultatul exercițiului) - "capital_propriu": { - "debit": [], # Capitalurile sunt în general creditoare - "credit": ["101", "104", "105", "106"] - }, - - # CAPITAL SOCIAL STRICT (doar contul 101) - # Folosit pentru calculul Rata ANC / Capital Social conform definiției legale stricte - # 101 - Capital social subscris și vărsat - "capital_social_strict": { - "debit": [], - "credit": ["101"] # Doar Capital Social subscris și vărsat - }, - - # REZULTAT (Profit/Pierdere) - # 107 - Rezultatul reportat - # 117 - Rezultatul reportat (în unele versiuni PCG) - # 121 - Profit sau pierdere - # 129 - Repartizarea profitului (se scade din profit) - "rezultat": { - "debit": ["107", "117", "129"], # Pierdere sau repartizare - "credit": ["107", "117", "121"] # Profit - }, - - # DATORII PE TERMEN LUNG (peste 1 an) - # 161 - Împrumuturi din emisiuni de obligațiuni - # 162 - Credite bancare pe termen lung - # 166 - Datorii care privesc imobilizările financiare - # 167 - Alte împrumuturi și datorii asimilate - # 168 - Dobânzi aferente împrumuturilor și datoriilor asimilate - # 169 - Prime privind rambursarea obligațiunilor - "datorii_termen_lung": { - "debit": [], - "credit": ["161", "162", "166", "167", "168", "169"] - }, - - # DATORII CURENTE (sub 1 an) - # 401 - Furnizori - # 403 - Efecte de plătit - # 404 - Furnizori de imobilizări - # 408 - Furnizori - facturi nesosite - # 419 - Clienți - creditori - # 421 - Personal - salarii datorate - # 423 - Personal - ajutoare materiale datorate - # 424 - Prime reprezentând participarea personalului la profit - # 426 - Drepturi de personal neridicate - # 427 - Rețineri din salarii datorate terților - # 431 - Asigurări sociale (dacă creditoare) - # 437 - Ajutor de șomaj (dacă creditoare) - # 4411 - Impozit pe profit de plătit - # 4423 - TVA de plată - # 4428 - TVA neexigibilă (NU ESTE DATORIE) - # 444 - Impozit pe venituri salariale de plată - # 446 - Alte impozite și taxe - # 447 - Fonduri speciale - # 462 - Creditori diverși - # 509 - Vărsăminte de efectuat pentru investiții financiare pe termen scurt - # 512 - Credite bancare pe termen scurt (5191) - "datorii_curente": { - "debit": [], - "credit": ["401", "403", "404", "408", "419", "421", "423", "424", - "426", "427", "4311", "4371", "4411", "4423", - "444", "446", "447", "462", "509", "5191", "5192", "5198"] - }, - - # VENITURI (Clasa 7) - pentru calculul EBIT în Altman Z-Score - # 70 - Venituri din vânzarea produselor - # 71 - Venituri din vânzarea mărfurilor - # 72 - Venituri din producția de imobilizări - # 74 - Venituri din subvenții de exploatare - # 75 - Alte venituri din exploatare - # 709 - Reduceri comerciale acordate (se scade din venituri) - # IMPORTANT: Folosim TOTCRED/TOTDEB (YTD - de la începutul anului) pentru că - # conturile din clasa 7 se închid lunar în 121 (SOLD=0 după închidere) - # RULCRED/RULDEB ar da doar valoarea lunară, nu YTD! - "venituri": { - "tot_credit": ["70", "701", "702", "703", "704", "705", "706", "707", "708", - "71", "72", "74", "75", "758"], - "tot_debit": ["709"] # Reduceri acordate clienților - funcționează INVERS - }, - - # CHELTUIELI OPERAȚIONALE (din Clasa 6, FĂRĂ 66x) - pentru calculul EBIT - # 60 - Cheltuieli privind stocurile - # 61 - Cheltuieli cu serviciile executate de terți - # 62 - Cheltuieli cu alte servicii executate de terți - # 63 - Cheltuieli cu alte impozite, taxe - # 64 - Cheltuieli cu personalul - # 65 - Alte cheltuieli de exploatare - # 68 - Amortizări și provizioane (adăugat) - # 609 - Reduceri comerciale primite (se scade din cheltuieli) - # IMPORTANT: Folosim TOTDEB/TOTCRED (YTD - de la începutul anului) pentru că - # conturile din clasa 6 se închid lunar în 121 (SOLD=0 după închidere) - # RULDEB/RULCRED ar da doar valoarea lunară, nu YTD! - "cheltuieli_operationale": { - "tot_debit": ["60", "601", "602", "603", "604", "605", "606", "607", "608", - "61", "611", "612", "613", "614", - "62", "621", "622", "623", "624", "625", "626", "627", "628", - "63", "635", - "64", "641", "642", "643", "644", "645", - "65", "654", "658", - "68", "681", "686"], - "tot_credit": ["609"] # Reduceri primite de la furnizori - funcționează INVERS - }, - - # CHELTUIELI FINANCIARE (Clasa 66) - separat de cheltuieli operaționale - # 661 - Cheltuieli privind titlurile de plasament cedate - # 663 - Pierderi din creanțe legate de participații - # 664 - Cheltuieli privind investițiile financiare cedate - # 665 - Cheltuieli din diferențe de curs valutar - # 666 - Cheltuieli privind dobânzile - # 667 - Cheltuieli privind sconturile acordate - # 668 - Alte cheltuieli financiare - # IMPORTANT: Folosim TOTDEB (YTD - de la începutul anului) pentru că - # conturile din clasa 6 se închid lunar în 121 (SOLD=0 după închidere) - # RULDEB ar da doar valoarea lunară, nu YTD! - "cheltuieli_financiare": { - "tot_debit": ["66", "661", "663", "664", "665", "666", "667", "668"] - }, - - # CIFRA DE AFACERI (doar conturile 70x - venituri din vânzări) - # Conform definiției oficiale, CA include DOAR venituri din vânzarea de bunuri și servicii - # NU include: - # - 71x (Variația stocurilor) - # - 72x (Venituri din producția de imobilizări) - # - 74x (Venituri din subvenții de exploatare) - # - 75x (Alte venituri din exploatare) - # - 76x (Venituri financiare) - # Formula: TOTCRED(701-708) - TOTDEB(709 reduceri comerciale acordate) - # IMPORTANT: Acesta este FĂRĂ TVA - TVA-ul merge în 4427, nu în 7xx - "cifra_afaceri": { - "tot_credit": ["701", "702", "703", "704", "705", "706", "707", "708"], - "tot_debit": ["709"] # Reduceri comerciale acordate (se scad) - }, - - # ACHIZIȚII STOCURI (Clasa 3 - intrări în stocuri FĂRĂ TVA) - # Când cumpărăm: Debit 301/371 = Credit 401 → 301/371 DEBIT este FĂRĂ TVA - # TVA-ul merge în 4426/4428, NU în contul de stoc - # Aceasta evită complexitatea TVA la încasare, facturi nesosită, etc. - # Include: materii prime (30x), materiale (31x, 32x), producție în curs (33x), - # produse finite (34x), stocuri la terți (35x), animale (36x), mărfuri (37x), ambalaje (38x) - "achizitii_stocuri": { - "tot_debit": ["30", "301", "302", "303", "308", - "31", "311", "312", - "32", "321", "322", "323", - "33", "331", "332", - "34", "341", "345", "346", "348", - "35", "351", "354", "356", "357", "358", - "36", "361", "368", - "37", "371", "378", - "38", "381", "388"] - } -} - - -class FinancialIndicatorsService: - """ - Service pentru calculul indicatorilor financiari din balanța de verificare. - - Agregă soldurile din VBAL pe categorii de conturi pentru: - - Active imobilizate - - Stocuri - - Creanțe - - Disponibilități - - Capital propriu - - Rezultat - - Datorii pe termen lung - - Datorii curente - - Venituri - - Cheltuieli operaționale - """ - - @staticmethod - @cached(cache_type='schema', key_params=['company_id', 'server_id']) - async def _get_schema(company_id: int, server_id: Optional[str] = None) -> str: - """ - Obține schema pentru company_id (CACHED PERMANENT) - - Schema este stocată permanent în cache deoarece nu se schimbă. - """ - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - schema_query = """ - SELECT schema - FROM CONTAFIN_ORACLE.v_nom_firme - WHERE id_firma = :company_id - """ - cursor.execute(schema_query, {'company_id': company_id}) - schema_result = cursor.fetchone() - - if not schema_result: - raise ValueError(f"Schema not found for company {company_id}") - - return schema_result[0] - - @staticmethod - def _build_aggregate_case(prefixes: list[str], column: str) -> str: - """ - Construiește expresie CASE pentru agregarea soldurilor pe prefixe de conturi. - - Args: - prefixes: Lista de prefixe de conturi (ex: ["20", "21", "23"]) - column: Coloana de sumat (SOLDDEB sau SOLDCRED) - - Returns: - Expresie SQL CASE pentru SUM - """ - if not prefixes: - return "0" - - conditions = " OR ".join([f"CONT LIKE '{prefix}%'" for prefix in prefixes]) - return f"SUM(CASE WHEN ({conditions}) THEN NVL({column}, 0) ELSE 0 END)" - - @staticmethod - @cached(cache_type='fin_balance_sheet', key_params=['company_id', 'luna', 'an', 'server_id']) - async def get_balance_sheet_aggregates( - company_id: int, - luna: int, - an: int, - server_id: Optional[str] = None - ) -> BalanceSheetAggregates: - """ - Obține soldurile agregate din balanța de verificare pentru calculul - indicatorilor financiari (CACHED 30 min). - - Agregă soldurile din VBAL pe categorii de conturi folosind prefixe - conform Planului de Conturi General (PCG) românesc. - - Args: - company_id: ID-ul firmei - luna: Luna contabilă (1-12) - an: Anul contabil - - Returns: - BalanceSheetAggregates cu soldurile agregate pentru fiecare categorie - - Raises: - ValueError: Dacă schema nu este găsită pentru firma specificată - """ - schema = await FinancialIndicatorsService._get_schema(company_id, server_id) - - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Construim query-ul cu CASE pentru fiecare categorie - # Soldurile din VBAL: SOLDDEB (sold debitor), SOLDCRED (sold creditor) - # - # Pentru active: valoarea = SOLDDEB - amortizări (SOLDCRED pentru 28, 29) - # Pentru pasive: valoarea = SOLDCRED - # Pentru venituri: valoarea = SOLDCRED (conturile de venituri sunt creditoare) - # Pentru cheltuieli: valoarea = SOLDDEB (conturile de cheltuieli sunt debitoare) - - query = f""" - SELECT - -- ACTIVE IMOBILIZATE (brut - amortizări - ajustări) - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["active_imobilizate"]["debit"], "SOLDDEB" - )} - - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["active_imobilizate"]["credit"], "SOLDCRED" - )} as active_imobilizate, - - -- STOCURI (brut - ajustări depreciere) - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["stocuri"]["debit"], "SOLDDEB" - )} - - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["stocuri"]["credit"], "SOLDCRED" - )} as stocuri, - - -- CREANȚE (brut - ajustări depreciere) - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["creante"]["debit"], "SOLDDEB" - )} - - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["creante"]["credit"], "SOLDCRED" - )} as creante, - - -- DISPONIBILITĂȚI - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["disponibilitati"]["debit"], "SOLDDEB" - )} as disponibilitati, - - -- CAPITAL PROPRIU (sold creditor) - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["capital_propriu"]["credit"], "SOLDCRED" - )} as capital_propriu, - - -- REZULTAT (credit - debit: profit dacă pozitiv, pierdere dacă negativ) - -- Conturile 107, 117, 121 pot avea sold fie debitor (pierdere) fie creditor (profit) - -- 129 (repartizare profit) este debitor și se scade - ({FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["rezultat"]["credit"], "SOLDCRED" - )} - - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["rezultat"]["debit"], "SOLDDEB" - )}) as rezultat, - - -- DATORII TERMEN LUNG (sold creditor) - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["datorii_termen_lung"]["credit"], "SOLDCRED" - )} as datorii_termen_lung, - - -- DATORII CURENTE (sold creditor) - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["datorii_curente"]["credit"], "SOLDCRED" - )} as datorii_curente, - - -- VENITURI YTD (TOTCRED - TOTDEB pentru 709) - -- Folosim TOTCRED/TOTDEB pentru valori cumulate de la începutul anului - ({FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["venituri"]["tot_credit"], "TOTCRED" - )} - - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["venituri"]["tot_debit"], "TOTDEB" - )}) as venituri, - - -- CHELTUIELI OPERAȚIONALE YTD (TOTDEB - TOTCRED pentru 609) - -- Folosim TOTDEB/TOTCRED pentru valori cumulate de la începutul anului - ({FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["cheltuieli_operationale"]["tot_debit"], "TOTDEB" - )} - - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["cheltuieli_operationale"]["tot_credit"], "TOTCRED" - )}) as cheltuieli_operationale, - - -- CHELTUIELI FINANCIARE YTD (TOTDEB - Clasa 66) - -- Folosim TOTDEB pentru valori cumulate de la începutul anului - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["cheltuieli_financiare"]["tot_debit"], "TOTDEB" - )} as cheltuieli_financiare, - - -- CAPITAL SOCIAL STRICT (sold creditor - doar contul 101) - -- Pentru calculul Rata ANC / Capital Social conform definiției legale stricte - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["capital_social_strict"]["credit"], "SOLDCRED" - )} as capital_social_strict, - - -- CIFRA DE AFACERI YTD (doar 70x - venituri din vânzări, FĂRĂ TVA) - -- NU include: 71x variația stocurilor, 72x producție imobilizări, - -- 74x subvenții, 75x alte venituri - -- Formula: TOTCRED(701-708) - TOTDEB(709 reduceri comerciale acordate) - ({FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["cifra_afaceri"]["tot_credit"], "TOTCRED" - )} - - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["cifra_afaceri"]["tot_debit"], "TOTDEB" - )}) as cifra_afaceri, - - -- ACHIZIȚII STOCURI YTD (Clasa 3 TOTDEB - intrări în stocuri, FĂRĂ TVA) - -- TVA-ul merge în 4426/4428, nu în conturile de stoc - {FinancialIndicatorsService._build_aggregate_case( - ACCOUNT_GROUPS["achizitii_stocuri"]["tot_debit"], "TOTDEB" - )} as achizitii_stocuri - - FROM {schema}.VBAL - WHERE AN = :an - AND LUNA = :luna - """ - - params = {'an': an, 'luna': luna} - cursor.execute(query, params) - row = cursor.fetchone() - - if not row: - # Returnăm agregate cu valori zero dacă nu există date - logger.warning( - f"No VBAL data for company {company_id}, " - f"luna={luna}, an={an}" - ) - return BalanceSheetAggregates( - company_id=company_id, - luna=luna, - an=an, - active_imobilizate=Decimal('0'), - stocuri=Decimal('0'), - creante=Decimal('0'), - disponibilitati=Decimal('0'), - capital_propriu=Decimal('0'), - rezultat=Decimal('0'), - datorii_termen_lung=Decimal('0'), - datorii_curente=Decimal('0'), - venituri=Decimal('0'), - cheltuieli_operationale=Decimal('0'), - cheltuieli_financiare=Decimal('0'), - capital_social_strict=Decimal('0'), - cifra_afaceri=Decimal('0'), - achizitii_stocuri=Decimal('0') - ) - - # Construim modelul cu valorile agregate - aggregates = BalanceSheetAggregates( - company_id=company_id, - luna=luna, - an=an, - active_imobilizate=Decimal(str(row[0] or 0)), - stocuri=Decimal(str(row[1] or 0)), - creante=Decimal(str(row[2] or 0)), - disponibilitati=Decimal(str(row[3] or 0)), - capital_propriu=Decimal(str(row[4] or 0)), - rezultat=Decimal(str(row[5] or 0)), - datorii_termen_lung=Decimal(str(row[6] or 0)), - datorii_curente=Decimal(str(row[7] or 0)), - venituri=Decimal(str(row[8] or 0)), - cheltuieli_operationale=Decimal(str(row[9] or 0)), - cheltuieli_financiare=Decimal(str(row[10] or 0)), - capital_social_strict=Decimal(str(row[11] or 0)), - cifra_afaceri=Decimal(str(row[12] or 0)), - achizitii_stocuri=Decimal(str(row[13] or 0)) - ) - - logger.info( - f"Financial aggregates for company {company_id}, " - f"luna={luna}, an={an}: " - f"active_imobilizate={aggregates.active_imobilizate}, " - f"stocuri={aggregates.stocuri}, " - f"disponibilitati={aggregates.disponibilitati}, " - f"datorii_curente={aggregates.datorii_curente}, " - f"venituri={aggregates.venituri}, " - f"cheltuieli_op={aggregates.cheltuieli_operationale}, " - f"cifra_afaceri={aggregates.cifra_afaceri}, " - f"achizitii_stocuri={aggregates.achizitii_stocuri}" - ) - - # Warning: venituri/cheltuieli = 0 but balance sheet has data - # This typically means VBAL doesn't have Class 6/7 data for this period - # (accounting period may not be closed yet) - has_balance_data = ( - aggregates.active_imobilizate > 0 or - aggregates.disponibilitati > 0 or - aggregates.datorii_curente > 0 - ) - if has_balance_data and aggregates.venituri == 0 and aggregates.cheltuieli_operationale == 0: - logger.warning( - f"Company {company_id}, luna={luna}, an={an}: " - f"Balance sheet data exists but venituri/cheltuieli = 0. " - f"VBAL may not have Class 6/7 data for this period " - f"(accounting period not closed?)." - ) - - return aggregates - - @staticmethod - @cached(cache_type='fin_achizitii', key_params=['company_id', 'luna', 'an', 'server_id']) - async def get_achizitii_ytd( - company_id: int, - luna: int, - an: int, - server_id: Optional[str] = None - ) -> Decimal: - """ - Calculează totalul achizițiilor YTD din Registrul Jurnal (ACT). - - Această metodă folosește tabelul ACT (înregistrări contabile) în loc de VBAL - deoarece captează TOATE achizițiile: - - Achiziții stocuri: 3x = 4x/46x (materii prime, mărfuri, materiale) - - Achiziții directe: 6x = 4x/46x (servicii, consumabile pe cheltuieli) - - IMPORTANT: SUMA în tabelul ACT este ÎNTOTDEAUNA fără TVA! - TVA-ul merge în conturi separate (4426, 4428). - - Formula: - - (+) Intrări în stocuri/cheltuieli: SCD în 3x sau 6x, SCC în 4x sau 46x - - (-) Discount/rabat primit: SCD în 40x, SCC în 667 sau 609 - - Args: - company_id: ID-ul firmei - luna: Luna contabilă (1-12) - calcul YTD până la această lună - an: Anul contabil - - Returns: - Total achiziții YTD fără TVA (Decimal) - """ - schema = await FinancialIndicatorsService._get_schema(company_id, server_id) - - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - query = f""" - SELECT - NVL(SUM(CASE - WHEN (SCD LIKE '3%' OR SCD LIKE '6%') - AND (SCC LIKE '4%' OR SCC LIKE '46%') - THEN SUMA - ELSE 0 - END), 0) - - - NVL(SUM(CASE - WHEN SCD LIKE '40%' AND (SCC = '667' OR SCC = '609') - THEN SUMA - ELSE 0 - END), 0) as achizitii_ytd - FROM {schema}.ACT - WHERE AN = :an - AND LUNA <= :luna - AND NVL(STERS, 0) = 0 - """ - cursor.execute(query, {'an': an, 'luna': luna}) - row = cursor.fetchone() - - achizitii_total = Decimal(str(row[0] or 0)) - - logger.info( - f"Achiziții YTD from ACT for company {company_id}, " - f"luna<={luna}, an={an}: {achizitii_total}" - ) - - return achizitii_total - - @staticmethod - @cached(cache_type='fin_cashflow_vbal', key_params=['company_id', 'luna', 'an', 'server_id']) - async def get_cashflow_from_vbal( - company_id: int, - luna: int, - an: int, - server_id: Optional[str] = None - ) -> dict: - """ - Calculează datele de Cash Flow direct din VBAL (balanța de verificare). - - Aceasta este sursa preferată pentru Cash Flow, în loc de vbalanta_parteneri, - pentru consistență cu celelalte calcule de indicatori. - - IMPORTANT: Cash Flow INCLUDE TVA deoarece măsoară fluxuri reale de numerar. - Când clientul plătește 1.190 RON, primim 1.190 RON (nu 1.000). - - Coloane VBAL utilizate: - - RULCRED/RULDEB: Rulaj lunar (mișcări în luna curentă) - - TOTCRED/TOTDEB: Total YTD (de la 1 ianuarie până la luna curentă) - - Args: - company_id: ID-ul firmei - luna: Luna contabilă (1-12) - an: Anul contabil - - Returns: - Dict cu: - - incasari_luna: Încasări lunare (4111+461 RULCRED) - - plati_luna: Plăți lunare (401+404+462 RULDEB) - - incasari_ytd: Încasări YTD (4111+461 TOTCRED) - - plati_ytd: Plăți YTD (401+404+462 TOTDEB) - """ - schema = await FinancialIndicatorsService._get_schema(company_id, server_id) - - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - query = f""" - SELECT - -- Încasări luna curentă (4111+461 RULCRED) - -- Credit pe 4111 = client plătește - NVL(SUM(CASE - WHEN CONT IN ('4111', '461') THEN RULCRED - ELSE 0 - END), 0) as incasari_luna, - - -- Plăți luna curentă (401+404+462 RULDEB) - -- Debit pe 401 = plătim furnizorul - NVL(SUM(CASE - WHEN CONT IN ('401', '404', '462') THEN RULDEB - ELSE 0 - END), 0) as plati_luna, - - -- Încasări YTD (4111+461 TOTCRED) - NVL(SUM(CASE - WHEN CONT IN ('4111', '461') THEN TOTCRED - ELSE 0 - END), 0) as incasari_ytd, - - -- Plăți YTD (401+404+462 TOTDEB) - NVL(SUM(CASE - WHEN CONT IN ('401', '404', '462') THEN TOTDEB - ELSE 0 - END), 0) as plati_ytd - - FROM {schema}.VBAL - WHERE AN = :an AND LUNA = :luna - """ - cursor.execute(query, {'an': an, 'luna': luna}) - row = cursor.fetchone() - - result = { - 'incasari_luna': Decimal(str(row[0] or 0)), - 'plati_luna': Decimal(str(row[1] or 0)), - 'incasari_ytd': Decimal(str(row[2] or 0)), - 'plati_ytd': Decimal(str(row[3] or 0)) - } - - logger.info( - f"Cash flow from VBAL for company {company_id}, " - f"luna={luna}, an={an}: " - f"incasari_luna={result['incasari_luna']}, " - f"plati_luna={result['plati_luna']}, " - f"incasari_ytd={result['incasari_ytd']}, " - f"plati_ytd={result['plati_ytd']}" - ) - - return result - - @staticmethod - def _calculate_indicator_status( - value: float, - good_threshold: float, - warning_threshold: float, - higher_is_better: bool = True - ) -> str: - """ - Determină statusul unui indicator pe baza pragurilor. - - Args: - value: Valoarea indicatorului - good_threshold: Pragul pentru status 'good' - warning_threshold: Pragul pentru status 'warning' - higher_is_better: True dacă valori mai mari sunt mai bune - - Returns: - Status: 'good', 'warning', sau 'danger' - """ - if higher_is_better: - if value >= good_threshold: - return "good" - elif value >= warning_threshold: - return "warning" - else: - return "danger" - else: - # Pentru indicatori unde valori mai mici sunt mai bune (ex: DSO) - if value <= good_threshold: - return "good" - elif value <= warning_threshold: - return "warning" - else: - return "danger" - - @staticmethod - async def calculate_liquidity_indicators( - company_id: int, - luna: int, - an: int, - server_id: Optional[str] = None - ) -> LiquidityIndicators: - """ - Calculează indicatorii de lichiditate pentru evaluarea capacității - de plată a datoriilor pe termen scurt. - - Indicatori calculați: - - Lichiditate curentă (Current Ratio) = active_curente / datorii_curente - - Lichiditate imediată (Quick Ratio) = (disponibilități + creanțe) / datorii_curente - - Lichiditate la vedere (Cash Ratio) = disponibilități / datorii_curente - - Praguri de referință (conform standardelor bancare): - - Lichiditate curentă: good >= 2.0, warning 1.0-2.0, danger < 1.0 - - Lichiditate imediată: good >= 1.0, warning 0.5-1.0, danger < 0.5 - - Lichiditate la vedere: good >= 0.2, warning 0.1-0.2, danger < 0.1 - - Args: - company_id: ID-ul firmei - luna: Luna contabilă (1-12) - an: Anul contabil - - Returns: - LiquidityIndicators cu cele trei rate de lichiditate - """ - # Obținem agregatele din balanță - aggregates = await FinancialIndicatorsService.get_balance_sheet_aggregates( - company_id, luna, an, server_id - ) - # Ensure aggregates is a BalanceSheetAggregates model (cache may return dict) - if isinstance(aggregates, dict): - aggregates = BalanceSheetAggregates(**aggregates) - - # Calculăm active curente (stocuri + creanțe + disponibilități) - active_curente = float(aggregates.active_curente) - disponibilitati = float(aggregates.disponibilitati) - creante = float(aggregates.creante) - datorii_curente = float(aggregates.datorii_curente) - - # Handle cazul special: datorii_curente = 0 - if datorii_curente == 0: - # Compania nu are datorii pe termen scurt - situație excelentă - # Returnăm None pentru valoare dar status "good" cu mesaj explicativ - no_debt_message = "Fără datorii curente - lichiditate maximă" - - return LiquidityIndicators( - lichiditate_curenta=IndicatorResult( - value=None, - status="good", - threshold_min=2.0, - threshold_max=None, - message=no_debt_message - ), - lichiditate_imediata=IndicatorResult( - value=None, - status="good", - threshold_min=1.0, - threshold_max=None, - message=no_debt_message - ), - lichiditate_vedere=IndicatorResult( - value=None, - status="good", - threshold_min=0.2, - threshold_max=None, - message=no_debt_message - ), - # Sub-indicatori pentru verificare manuală în balanță - active_curente=IndicatorResult( - value=round(active_curente, 2), - status="good", - message="Stocuri + Creanțe + Disponibilități" - ), - disponibilitati=IndicatorResult( - value=round(disponibilitati, 2), - status="good", - message="Bancă (512x) + Casă (531x)" - ), - creante=IndicatorResult( - value=round(creante, 2), - status="good", - message="Clienți (411x) + Debitori (461x)" - ), - datorii_curente=IndicatorResult( - value=0, - status="good", - message="Fără datorii pe termen scurt" - ) - ) - - # Calculăm ratele de lichiditate - # 1. Lichiditate curentă (Current Ratio) - lichiditate_curenta_val = active_curente / datorii_curente - lichiditate_curenta_status = FinancialIndicatorsService._calculate_indicator_status( - lichiditate_curenta_val, - good_threshold=2.0, - warning_threshold=1.0 - ) - - # 2. Lichiditate imediată (Quick Ratio) - # Exclude stocurile - măsoară lichiditatea "rapidă" - lichiditate_imediata_val = (disponibilitati + creante) / datorii_curente - lichiditate_imediata_status = FinancialIndicatorsService._calculate_indicator_status( - lichiditate_imediata_val, - good_threshold=1.0, - warning_threshold=0.5 - ) - - # 3. Lichiditate la vedere (Cash Ratio) - # Doar disponibilități - lichiditatea imediată - lichiditate_vedere_val = disponibilitati / datorii_curente - lichiditate_vedere_status = FinancialIndicatorsService._calculate_indicator_status( - lichiditate_vedere_val, - good_threshold=0.2, - warning_threshold=0.1 - ) - - # Rotunjim valorile la 2 zecimale pentru afișare - result = LiquidityIndicators( - lichiditate_curenta=IndicatorResult( - value=round(lichiditate_curenta_val, 2), - status=lichiditate_curenta_status, - threshold_min=2.0, - threshold_max=None - ), - lichiditate_imediata=IndicatorResult( - value=round(lichiditate_imediata_val, 2), - status=lichiditate_imediata_status, - threshold_min=1.0, - threshold_max=None - ), - lichiditate_vedere=IndicatorResult( - value=round(lichiditate_vedere_val, 2), - status=lichiditate_vedere_status, - threshold_min=0.2, - threshold_max=None - ), - # Sub-indicatori pentru verificare manuală în balanță - active_curente=IndicatorResult( - value=round(active_curente, 2), - status="good", - message="Stocuri + Creanțe + Disponibilități" - ), - disponibilitati=IndicatorResult( - value=round(disponibilitati, 2), - status="good", - message="Bancă (512x) + Casă (531x)" - ), - creante=IndicatorResult( - value=round(creante, 2), - status="good", - message="Clienți (411x) + Debitori (461x)" - ), - datorii_curente=IndicatorResult( - value=round(datorii_curente, 2), - status="good", - message="Furnizori + TVA + Salarii etc." - ) - ) - - logger.info( - f"Liquidity indicators for company {company_id}, luna={luna}, an={an}: " - f"curenta={result.lichiditate_curenta.value} ({result.lichiditate_curenta.status}), " - f"imediata={result.lichiditate_imediata.value} ({result.lichiditate_imediata.status}), " - f"vedere={result.lichiditate_vedere.value} ({result.lichiditate_vedere.status})" - ) - - return result - - @staticmethod - @cached(cache_type='fin_efficiency', key_params=['company_id', 'luna', 'an', 'server_id']) - async def calculate_efficiency_indicators( - company_id: int, - luna: int, - an: int, - server_id: Optional[str] = None - ) -> EfficiencyIndicators: - """ - Calculează indicatorii de eficiență pentru evaluarea vitezei de conversie - a resurselor în numerar. - - Indicatori calculați: - - DSO (Days Sales Outstanding) = (clienti_sold / facturari_lunare) * 30 - - DPO (Days Payables Outstanding) = (furnizori_sold / achizitii_lunare) * 30 - - Cash Conversion Cycle = DSO - DPO - - Rata încasare = incasari / facturari * 100 - - Rata plată = plati / achizitii * 100 - - Praguri de referință pentru DSO: - - Good: < 30 zile (încasare rapidă) - - Warning: 30-45 zile (încasare moderată) - - Danger: > 45 zile (încasare lentă - risc de cash flow) - - Args: - company_id: ID-ul firmei - luna: Luna contabilă (1-12) - an: Anul contabil - - Returns: - EfficiencyIndicators cu cele cinci rate de eficiență - """ - # Import DashboardService here to avoid circular imports - from .dashboard_service import DashboardService - - # Obținem datele din summary (solduri clienți/furnizori) - summary = await DashboardService.get_complete_summary( - company=str(company_id), - username="system", # System call for indicators - luna=luna, - an=an, - server_id=server_id - ) - # Ensure summary is a DashboardSummary model (cache may return dict) - if isinstance(summary, dict): - summary = DashboardSummary(**summary) - - # Obținem datele din trends (facturări/încasări/achiziții/plăți lunare) - trends = await DashboardService.get_trends( - company_id=company_id, - period='12m', # Ultimele 12 luni pentru media lunară - server_id=server_id - ) - - # Extragem soldurile din summary - clienti_sold = float(summary.clienti_sold_total) - furnizori_sold = float(summary.furnizori_sold_total) - - # Extragem datele lunare din trends - # Folosim ultima lună disponibilă pentru facturări/încasări/achiziții/plăți - clienti_facturat = trends.get("clienti_facturat", []) - clienti_incasat = trends.get("clienti_incasat", []) - furnizori_facturat = trends.get("furnizori_facturat", []) - furnizori_achitat = trends.get("furnizori_achitat", []) - - # Calculăm media lunară (pentru stabilitate) sau folosim ultima lună - # Pentru DSO/DPO, folosim media ultimelor 3 luni pentru a evita fluctuații - def safe_avg(values: list, n: int = 3) -> float: - """Calculează media ultimelor n valori, sau toate dacă sunt mai puține""" - if not values: - return 0 - recent = values[-n:] if len(values) >= n else values - return sum(recent) / len(recent) if recent else 0 - - facturari_lunare = safe_avg(clienti_facturat) - incasari_lunare = safe_avg(clienti_incasat) - achizitii_lunare = safe_avg(furnizori_facturat) - plati_lunare = safe_avg(furnizori_achitat) - - # Calculăm indicatorii - - # 1. DSO (Days Sales Outstanding) - Durata medie de încasare - # Formula: (clienti_sold / facturari_lunare) * 30 - if facturari_lunare > 0: - dso_val = (clienti_sold / facturari_lunare) * 30 - dso_status = FinancialIndicatorsService._calculate_indicator_status( - dso_val, - good_threshold=30, - warning_threshold=45, - higher_is_better=False # Pentru DSO, mai mic e mai bine - ) - dso = IndicatorResult( - value=round(dso_val, 1), - status=dso_status, - threshold_min=None, - threshold_max=30 # Good if <= 30 days - ) - else: - dso = IndicatorResult( - value=None, - status="warning", - threshold_min=None, - threshold_max=30, - message="Fără facturări în perioada analizată" - ) - - # 2. DPO (Days Payables Outstanding) - Durata medie de plată - # Formula: (furnizori_sold / achizitii_lunare) * 30 - if achizitii_lunare > 0: - dpo_val = (furnizori_sold / achizitii_lunare) * 30 - # Pentru DPO nu avem praguri stricte - depinde de strategia firmei - # Un DPO mai mare înseamnă că folosim creditul furnizorilor - dpo = IndicatorResult( - value=round(dpo_val, 1), - status="good", # DPO nu are praguri de "danger" - threshold_min=None, - threshold_max=None, - message="Durata medie de plată furnizori" - ) - else: - dpo = IndicatorResult( - value=None, - status="warning", - threshold_min=None, - threshold_max=None, - message="Fără achiziții în perioada analizată" - ) - - # 3. Cash Conversion Cycle = DSO - DPO - # Negativ = firma se finanțează din creditul furnizorilor (favorabil) - # Pozitiv = cash blocat în ciclul de afaceri - if dso.value is not None and dpo.value is not None: - ccc_val = dso.value - dpo.value - # CCC negativ e bun (ne finanțăm din creditul furnizorilor) - ccc_status = FinancialIndicatorsService._calculate_indicator_status( - ccc_val, - good_threshold=0, - warning_threshold=15, - higher_is_better=False - ) - ccc_message = ( - "Ciclu negativ = finanțare din creditul furnizorilor" - if ccc_val < 0 - else "Numerar blocat în ciclul de afaceri" - ) - cash_conversion_cycle = IndicatorResult( - value=round(ccc_val, 1), - status=ccc_status, - threshold_min=None, - threshold_max=0, - message=ccc_message - ) - else: - cash_conversion_cycle = IndicatorResult( - value=None, - status="warning", - threshold_min=None, - threshold_max=0, - message="Nu se poate calcula - lipsesc date DSO/DPO" - ) - - # 4. Rata încasare = incasari / facturari * 100 - # Calculăm pentru perioada YTD din trends (suma totală) - total_facturari = sum(clienti_facturat) if clienti_facturat else 0 - total_incasari = sum(clienti_incasat) if clienti_incasat else 0 - - if total_facturari > 0: - rata_incasare_val = (total_incasari / total_facturari) * 100 - rata_incasare_status = FinancialIndicatorsService._calculate_indicator_status( - rata_incasare_val, - good_threshold=95, - warning_threshold=80 - ) - rata_incasare = IndicatorResult( - value=round(rata_incasare_val, 1), - status=rata_incasare_status, - threshold_min=95, - threshold_max=None - ) - else: - rata_incasare = IndicatorResult( - value=None, - status="warning", - threshold_min=95, - threshold_max=None, - message="Fără facturări în perioada analizată" - ) - - # 5. Rata plată = plati / achizitii * 100 - total_achizitii = sum(furnizori_facturat) if furnizori_facturat else 0 - total_plati = sum(furnizori_achitat) if furnizori_achitat else 0 - - if total_achizitii > 0: - rata_plata_val = (total_plati / total_achizitii) * 100 - # Pentru rata de plată, nu există "danger" - depinde de strategia firmei - rata_plata = IndicatorResult( - value=round(rata_plata_val, 1), - status="good", # Informativ, fără praguri stricte - threshold_min=None, - threshold_max=None - ) - else: - rata_plata = IndicatorResult( - value=None, - status="warning", - threshold_min=None, - threshold_max=None, - message="Fără achiziții în perioada analizată" - ) - - result = EfficiencyIndicators( - dso=dso, - dpo=dpo, - cash_conversion_cycle=cash_conversion_cycle, - rata_incasare=rata_incasare, - rata_plata=rata_plata, - # Sub-indicatori pentru verificare manuală - sold_clienti=IndicatorResult( - value=round(clienti_sold, 2), - status="good", - message="Sold Clienți la final de lună" - ), - facturari_lunare=IndicatorResult( - value=round(facturari_lunare, 2), - status="good", - message="Media facturărilor lunare (3 luni)" - ), - sold_furnizori=IndicatorResult( - value=round(furnizori_sold, 2), - status="good", - message="Sold Furnizori la final de lună" - ), - achizitii_lunare=IndicatorResult( - value=round(achizitii_lunare, 2), - status="good", - message="Media achizițiilor lunare (3 luni)" - ), - incasari_luna=IndicatorResult( - value=round(incasari_lunare, 2), - status="good", - message="Media încasărilor lunare (3 luni)" - ), - plati_luna=IndicatorResult( - value=round(plati_lunare, 2), - status="good", - message="Media plăților lunare (3 luni)" - ) - ) - - logger.info( - f"Efficiency indicators for company {company_id}, luna={luna}, an={an}: " - f"DSO={dso.value} ({dso.status}), " - f"DPO={dpo.value}, " - f"CCC={cash_conversion_cycle.value} ({cash_conversion_cycle.status}), " - f"rata_incasare={rata_incasare.value}% ({rata_incasare.status})" - ) - - return result - - @staticmethod - @cached(cache_type='fin_risk', key_params=['company_id', 'luna', 'an', 'server_id']) - async def calculate_risk_indicators( - company_id: int, - luna: int, - an: int, - server_id: Optional[str] = None - ) -> RiskIndicators: - """ - Calculează indicatorii de risc și aging pentru evaluarea sănătății - portofoliului de creanțe și datorii. - - Indicatori calculați: - - creante_restante_pct: Procentul creanțelor restante din total clienți - Formula: clienti_sold_restant / clienti_sold_total * 100 - Good: < 20%, Warning: 20-30%, Danger: > 30% - - - creante_90plus_pct: Procentul creanțelor restante > 90 zile din total - Formula: clienti_restant_90plus / clienti_sold_total * 100 - Good: < 5%, Warning: 5-10%, Danger: > 10% - - - datorii_restante_pct: Procentul datoriilor restante din total furnizori - Formula: furnizori_sold_restant / furnizori_sold_total * 100 - Good: < 10%, Warning: 10-20%, Danger: > 20% - - - raport_datorii_trezorerie: Raportul între datorii furnizori și trezorerie - Formula: furnizori_sold_total / trezorerie - Good: < 2, Warning: 2-4, Danger: > 4 - - Args: - company_id: ID-ul firmei - luna: Luna contabilă (1-12) - an: Anul contabil - - Returns: - RiskIndicators cu cei patru indicatori de risc - """ - # Import DashboardService here to avoid circular imports - from .dashboard_service import DashboardService - - # Obținem datele din summary (solduri clienți/furnizori/aging) - summary = await DashboardService.get_complete_summary( - company=str(company_id), - username="system", # System call for indicators - luna=luna, - an=an, - server_id=server_id - ) - # Ensure summary is a DashboardSummary model (cache may return dict) - if isinstance(summary, dict): - summary = DashboardSummary(**summary) - - # Extragem soldurile din summary - clienti_sold_total = float(summary.clienti_sold_total) - clienti_sold_restant = float(summary.clienti_sold_restant) - clienti_restant_90plus = float(summary.clienti_restant_90plus) - furnizori_sold_total = float(summary.furnizori_sold_total) - furnizori_sold_restant = float(summary.furnizori_sold_restant) - - # Calculăm trezoreria totală din treasury_totals_by_currency (sumă pe toate valutele) - trezorerie = sum(float(v) for v in summary.treasury_totals_by_currency.values()) - - # 1. Creanțe restante % - procentul din solduri clienți care sunt restante - if clienti_sold_total > 0: - creante_restante_val = (clienti_sold_restant / clienti_sold_total) * 100 - creante_restante_status = FinancialIndicatorsService._calculate_indicator_status( - creante_restante_val, - good_threshold=20, - warning_threshold=30, - higher_is_better=False # Mai mic e mai bine - ) - creante_restante_pct = IndicatorResult( - value=round(creante_restante_val, 1), - status=creante_restante_status, - threshold_min=None, - threshold_max=20 - ) - else: - creante_restante_pct = IndicatorResult( - value=None, - status="good", - threshold_min=None, - threshold_max=20, - message="Fără sold clienți" - ) - - # 2. Creanțe 90+ zile % - creanțe cu risc mare de nerecuperare - if clienti_sold_total > 0: - creante_90plus_val = (clienti_restant_90plus / clienti_sold_total) * 100 - creante_90plus_status = FinancialIndicatorsService._calculate_indicator_status( - creante_90plus_val, - good_threshold=5, - warning_threshold=10, - higher_is_better=False # Mai mic e mai bine - ) - creante_90plus_pct = IndicatorResult( - value=round(creante_90plus_val, 1), - status=creante_90plus_status, - threshold_min=None, - threshold_max=5 - ) - else: - creante_90plus_pct = IndicatorResult( - value=None, - status="good", - threshold_min=None, - threshold_max=5, - message="Fără sold clienți" - ) - - # 3. Datorii restante % - procentul din solduri furnizori care sunt restante - if furnizori_sold_total > 0: - datorii_restante_val = (furnizori_sold_restant / furnizori_sold_total) * 100 - datorii_restante_status = FinancialIndicatorsService._calculate_indicator_status( - datorii_restante_val, - good_threshold=10, - warning_threshold=20, - higher_is_better=False # Mai mic e mai bine - ) - datorii_restante_pct = IndicatorResult( - value=round(datorii_restante_val, 1), - status=datorii_restante_status, - threshold_min=None, - threshold_max=10 - ) - else: - datorii_restante_pct = IndicatorResult( - value=None, - status="good", - threshold_min=None, - threshold_max=10, - message="Fără sold furnizori" - ) - - # 4. Raport datorii/trezorerie - câte unități de cash trebuie pentru a plăti furnizorii - if trezorerie > 0: - raport_val = furnizori_sold_total / trezorerie - raport_status = FinancialIndicatorsService._calculate_indicator_status( - raport_val, - good_threshold=2, - warning_threshold=4, - higher_is_better=False # Mai mic e mai bine (mai puțin datorie per cash) - ) - raport_message = ( - "Trezorerie suficientă pentru acoperirea datoriilor" - if raport_val < 2 - else "Trezorerie insuficientă pentru datorii" - if raport_val > 4 - else "Trezorerie moderată pentru datorii" - ) - raport_datorii_trezorerie = IndicatorResult( - value=round(raport_val, 2), - status=raport_status, - threshold_min=None, - threshold_max=2, - message=raport_message - ) - elif furnizori_sold_total == 0: - # Fără datorii furnizori - situație bună - raport_datorii_trezorerie = IndicatorResult( - value=0, - status="good", - threshold_min=None, - threshold_max=2, - message="Fără datorii furnizori" - ) - else: - # Trezorerie 0 dar avem datorii - situație critică - raport_datorii_trezorerie = IndicatorResult( - value=None, - status="danger", - threshold_min=None, - threshold_max=2, - message="Trezorerie zero - nu se poate acoperi datoriile" - ) - - result = RiskIndicators( - creante_restante_pct=creante_restante_pct, - creante_90plus_pct=creante_90plus_pct, - datorii_restante_pct=datorii_restante_pct, - raport_datorii_trezorerie=raport_datorii_trezorerie, - # Sub-indicatori pentru verificare manuală - total_clienti=IndicatorResult( - value=round(clienti_sold_total, 2), - status="good", - message="Sold total clienți (411x)" - ), - clienti_restanti=IndicatorResult( - value=round(clienti_sold_restant, 2), - status="good", - message="Clienți cu facturi restante" - ), - clienti_90plus=IndicatorResult( - value=round(clienti_restant_90plus, 2), - status="good", - message="Clienți restant >90 zile" - ), - total_furnizori=IndicatorResult( - value=round(furnizori_sold_total, 2), - status="good", - message="Sold total furnizori (401x)" - ), - furnizori_restanti=IndicatorResult( - value=round(furnizori_sold_restant, 2), - status="good", - message="Furnizori cu facturi restante" - ), - trezorerie=IndicatorResult( - value=round(trezorerie, 2), - status="good", - message="Disponibilități (512x + 531x)" - ) - ) - - logger.info( - f"Risk indicators for company {company_id}, luna={luna}, an={an}: " - f"creante_restante={creante_restante_pct.value}% ({creante_restante_pct.status}), " - f"creante_90plus={creante_90plus_pct.value}% ({creante_90plus_pct.status}), " - f"datorii_restante={datorii_restante_pct.value}% ({datorii_restante_pct.status}), " - f"raport_datorii_trez={raport_datorii_trezorerie.value} ({raport_datorii_trezorerie.status})" - ) - - return result - - @staticmethod - @cached(cache_type='fin_cashflow', key_params=['company_id', 'luna', 'an', 'server_id']) - async def calculate_cashflow_indicators( - company_id: int, - luna: int, - an: int, - server_id: Optional[str] = None - ) -> CashFlowIndicators: - """ - Calculează indicatorii de cash flow pentru evaluarea generării și - consumului de numerar. - - Indicatori calculați: - - flux_net_lunar: Încasări luna - plăți luna (fluxul net de numerar lunar) - Good: > 0 (firma generează numerar), Danger: < 0 (firma consumă numerar) - - - cash_flow_ytd: Suma fluxurilor nete de la ianuarie până la luna curentă - Arată tendința generală a anului în curs - - - flux_net_yoy_pct: Variația procentuală an-la-an - Formula: (cf_curent - cf_anterior) / abs(cf_anterior) * 100 - - - acoperire_cash_flow: Cash flow YTD / datorii restante - Good: > 1 (cash flow suficient), Warning: 0.5-1, Danger: < 0.5 - - Args: - company_id: ID-ul firmei - luna: Luna contabilă (1-12) - an: Anul contabil - - Returns: - CashFlowIndicators cu cei patru indicatori de cash flow - """ - # Import DashboardService here to avoid circular imports (for datorii restante) - from .dashboard_service import DashboardService - - # Obținem datele de cash flow din VBAL (sursa preferată) - # VBAL oferă date directe: RULCRED/RULDEB pentru lunar, TOTCRED/TOTDEB pentru YTD - cf_data_curent = await FinancialIndicatorsService.get_cashflow_from_vbal( - company_id, luna, an, server_id - ) - cf_data_anterior = await FinancialIndicatorsService.get_cashflow_from_vbal( - company_id, luna, an - 1, server_id - ) - - # Obținem datele din summary pentru datorii restante - summary = await DashboardService.get_complete_summary( - company=str(company_id), - username="system", - luna=luna, - an=an, - server_id=server_id - ) - # Ensure summary is a DashboardSummary model (cache may return dict) - if isinstance(summary, dict): - summary = DashboardSummary(**summary) - - # Calculăm valorile de cash flow din VBAL - # Flux net lunar = încasări luna - plăți luna (RULCRED - RULDEB) - incasari_luna = float(cf_data_curent['incasari_luna']) - plati_luna = float(cf_data_curent['plati_luna']) - flux_net_val = incasari_luna - plati_luna - - # Cash flow YTD = încasări YTD - plăți YTD (TOTCRED - TOTDEB) - incasari_ytd = float(cf_data_curent['incasari_ytd']) - plati_ytd = float(cf_data_curent['plati_ytd']) - cf_ytd_val = incasari_ytd - plati_ytd - - # Cash flow YTD an anterior (pentru comparație YoY) - incasari_ytd_prev = float(cf_data_anterior['incasari_ytd']) - plati_ytd_prev = float(cf_data_anterior['plati_ytd']) - cf_ytd_anterior = incasari_ytd_prev - plati_ytd_prev - - # 1. Flux net lunar - flux_net_status = "good" if flux_net_val > 0 else "danger" - flux_net_message = ( - "Firma generează numerar" - if flux_net_val > 0 - else "Firma consumă numerar" - ) - flux_net_lunar = IndicatorResult( - value=round(flux_net_val, 2), - status=flux_net_status, - threshold_min=0, - threshold_max=None, - message=flux_net_message - ) - - # 2. Cash flow YTD (încasări YTD - plăți YTD din VBAL TOTCRED/TOTDEB) - cf_ytd_status = "good" if cf_ytd_val > 0 else "danger" - cash_flow_ytd = IndicatorResult( - value=round(cf_ytd_val, 2), - status=cf_ytd_status, - threshold_min=0, - threshold_max=None - ) - - # 3. Flux net YoY % (variația an-la-an) - # Comparăm cash flow-ul YTD curent cu cel din aceeași perioadă a anului anterior - if abs(cf_ytd_anterior) > 0: - yoy_pct = ((cf_ytd_val - cf_ytd_anterior) / abs(cf_ytd_anterior)) * 100 - yoy_status = "good" if yoy_pct >= 0 else "danger" - yoy_message = ( - "Creștere cash flow față de anul anterior" - if yoy_pct >= 0 - else "Scădere cash flow față de anul anterior" - ) - flux_net_yoy_pct = IndicatorResult( - value=round(yoy_pct, 1), - status=yoy_status, - threshold_min=0, - threshold_max=None, - message=yoy_message - ) - else: - # Cash flow anterior era zero - if cf_ytd_val > 0: - flux_net_yoy_pct = IndicatorResult( - value=100.0, - status="good", - threshold_min=0, - threshold_max=None, - message="Cash flow pozitiv vs zero anul anterior" - ) - elif cf_ytd_val < 0: - flux_net_yoy_pct = IndicatorResult( - value=-100.0, - status="danger", - threshold_min=0, - threshold_max=None, - message="Cash flow negativ vs zero anul anterior" - ) - else: - flux_net_yoy_pct = IndicatorResult( - value=0.0, - status="warning", - threshold_min=0, - threshold_max=None, - message="Cash flow zero în ambii ani" - ) - - # 4. Acoperire cash flow = cash_flow_ytd / datorii_restante - # Datoriile restante sunt furnizori_sold_restant din summary - datorii_restante = float(summary.furnizori_sold_restant) - - if datorii_restante > 0 and cf_ytd_val is not None: - acoperire_val = cf_ytd_val / datorii_restante - acoperire_status = FinancialIndicatorsService._calculate_indicator_status( - acoperire_val, - good_threshold=1.0, - warning_threshold=0.5 - ) - acoperire_message = ( - "Cash flow suficient pentru acoperirea datoriilor restante" - if acoperire_val >= 1.0 - else "Cash flow insuficient pentru acoperirea datoriilor restante" - if acoperire_val < 0.5 - else "Cash flow parțial pentru datorii restante" - ) - acoperire_cash_flow = IndicatorResult( - value=round(acoperire_val, 2), - status=acoperire_status, - threshold_min=1.0, - threshold_max=None, - message=acoperire_message - ) - elif datorii_restante == 0: - # Fără datorii restante - situație excelentă - acoperire_cash_flow = IndicatorResult( - value=None, - status="good", - threshold_min=1.0, - threshold_max=None, - message="Fără datorii restante - nu este nevoie de acoperire" - ) - else: - # Nu avem date de cash flow - acoperire_cash_flow = IndicatorResult( - value=None, - status="warning", - threshold_min=1.0, - threshold_max=None, - message="Nu se poate calcula acoperirea cash flow" - ) - - # Sub-indicatori pentru verificare manuală - # NOTA: incasari_luna și plati_luna sunt calculate mai sus din VBAL (liniile 1442-1443) - # cf_ytd_anterior este calculat mai sus din VBAL (linia 1454) - - result = CashFlowIndicators( - flux_net_lunar=flux_net_lunar, - cash_flow_ytd=cash_flow_ytd, - flux_net_yoy_pct=flux_net_yoy_pct, - acoperire_cash_flow=acoperire_cash_flow, - # Sub-indicatori pentru verificare manuală (din VBAL) - incasari_luna=IndicatorResult( - value=round(incasari_luna, 2), - status="good", - message="Încasări luna curentă (4111+461 RULCRED)" - ), - plati_luna=IndicatorResult( - value=round(plati_luna, 2), - status="good", - message="Plăți luna curentă (401+404+462 RULDEB)" - ), - cf_an_precedent=IndicatorResult( - value=round(cf_ytd_anterior, 2), - status="good", - message="Cash Flow YTD an precedent (din VBAL)" - ), - datorii_restante=IndicatorResult( - value=round(datorii_restante, 2), - status="good", - message="Datorii cu scadență depășită" - ) - ) - - logger.info( - f"Cash flow indicators for company {company_id}, luna={luna}, an={an}: " - f"flux_net_lunar={flux_net_lunar.value} ({flux_net_lunar.status}), " - f"cash_flow_ytd={cash_flow_ytd.value} ({cash_flow_ytd.status}), " - f"flux_net_yoy_pct={flux_net_yoy_pct.value}% ({flux_net_yoy_pct.status}), " - f"acoperire_cf={acoperire_cash_flow.value} ({acoperire_cash_flow.status})" - ) - - return result - - @staticmethod - @cached(cache_type='fin_dynamics', key_params=['company_id', 'luna', 'an', 'server_id']) - async def calculate_dynamics_indicators( - company_id: int, - luna: int, - an: int, - server_id: Optional[str] = None - ) -> DynamicsIndicators: - """ - Calculează indicatorii de dinamică pentru evaluarea evoluției afacerii. - - Compară vânzările și achizițiile cu anul anterior (YoY - Year-over-Year) - pentru a determina dacă afacerea crește sau scade. - - SURSE DE DATE (toate FĂRĂ TVA): - - Vânzări: Cifra de Afaceri din VBAL (Clasa 7 - conturile 70x) - - Achiziții: Registru Jurnal ACT (stocuri 3x=4x + cheltuieli directe 6x=4x) - - Anterior, indicatorii foloseau vbalanta_parteneri care include TVA în 4111 - (Clienți DEBIT), ceea ce ducea la cifre ~20% mai mari decât realitatea. - - Indicatori calculați: - - crestere_vanzari_yoy: Creșterea procentuală a Cifrei de Afaceri față de anul anterior - Formula: (CA_curent - CA_anterior) / CA_anterior * 100 - Good: > 5%, Warning: 0-5%, Danger: < 0% - - - crestere_achizitii_yoy: Creșterea procentuală a achizițiilor totale față de anul anterior - Formula: (achizitii_curent - achizitii_anterior) / achizitii_anterior * 100 - Sursa: ACT (include stocuri + cheltuieli directe, fără TVA) - Informativ - creșterea achizițiilor poate indica expansiune - - - marja_implicita: Marja implicită din diferența CA - achiziții totale - Formula: (CA - achizitii) / CA * 100 - Good: > 20%, Warning: 10-20%, Danger: < 10% - - Args: - company_id: ID-ul firmei - luna: Luna contabilă (1-12) - an: Anul contabil - - Returns: - DynamicsIndicators cu cei trei indicatori de dinamică - """ - # Obținem agregatele pentru anul curent și anul anterior - # Cifra de Afaceri (70x) din VBAL - FĂRĂ TVA - aggregates_curent = await FinancialIndicatorsService.get_balance_sheet_aggregates( - company_id, luna, an, server_id - ) - aggregates_anterior = await FinancialIndicatorsService.get_balance_sheet_aggregates( - company_id, luna, an - 1, server_id - ) - - # Ensure aggregates is a BalanceSheetAggregates model (cache may return dict) - if isinstance(aggregates_curent, dict): - aggregates_curent = BalanceSheetAggregates(**aggregates_curent) - if isinstance(aggregates_anterior, dict): - aggregates_anterior = BalanceSheetAggregates(**aggregates_anterior) - - # Cifra de Afaceri YTD (Clasa 7 - 70x, FĂRĂ TVA) - # Aceasta este sursa corectă pentru vânzări - total_vanzari_curent = float(aggregates_curent.cifra_afaceri) - total_vanzari_anterior = float(aggregates_anterior.cifra_afaceri) - - # Achiziții TOTALE YTD din ACT (stocuri + cheltuieli directe, FĂRĂ TVA) - # Include: 3x=4x (stocuri) + 6x=4x (servicii, consumabile) - # Exclude: discount/rabat (40x=667/609) - achizitii_curent = await FinancialIndicatorsService.get_achizitii_ytd( - company_id, luna, an, server_id - ) - achizitii_anterior = await FinancialIndicatorsService.get_achizitii_ytd( - company_id, luna, an - 1, server_id - ) - total_achizitii_curent = float(achizitii_curent) - total_achizitii_anterior = float(achizitii_anterior) - - # 1. Creștere vânzări YoY (Cifra de Afaceri) - # Formula: (CA_curent - CA_anterior) / CA_anterior * 100 - if total_vanzari_anterior > 0: - crestere_vanzari_val = ( - (total_vanzari_curent - total_vanzari_anterior) / - total_vanzari_anterior * 100 - ) - # Status: good > 5%, warning 0-5%, danger < 0% - crestere_vanzari_status = FinancialIndicatorsService._calculate_indicator_status( - crestere_vanzari_val, - good_threshold=5.0, - warning_threshold=0.0 - ) - crestere_vanzari_message = ( - "Creștere semnificativă a vânzărilor" - if crestere_vanzari_val > 5 - else "Vânzări stabile" - if crestere_vanzari_val >= 0 - else "Vânzări în scădere" - ) - crestere_vanzari_yoy = IndicatorResult( - value=round(crestere_vanzari_val, 1), - status=crestere_vanzari_status, - threshold_min=5.0, - threshold_max=None, - message=crestere_vanzari_message - ) - elif total_vanzari_curent > 0: - # Anul anterior nu avea vânzări, dar anul curent da - crestere_vanzari_yoy = IndicatorResult( - value=100.0, - status="good", - threshold_min=5.0, - threshold_max=None, - message="Vânzări noi - nu existau în anul anterior" - ) - else: - # Fără vânzări în niciun an - crestere_vanzari_yoy = IndicatorResult( - value=None, - status="warning", - threshold_min=5.0, - threshold_max=None, - message="Fără date de vânzări pentru comparație" - ) - - # 2. Creștere achiziții YoY - # Formula: (achizitii_curent - achizitii_anterior) / achizitii_anterior * 100 - if total_achizitii_anterior > 0: - crestere_achizitii_val = ( - (total_achizitii_curent - total_achizitii_anterior) / - total_achizitii_anterior * 100 - ) - # Pentru achiziții, creșterea poate fi neutră (expansiune) sau negativă (reducere) - # Nu există un "danger" clar - e informativ - crestere_achizitii_message = ( - "Achiziții în creștere - posibilă expansiune" - if crestere_achizitii_val > 5 - else "Achiziții stabile" - if crestere_achizitii_val >= -5 - else "Achiziții în scădere" - ) - crestere_achizitii_yoy = IndicatorResult( - value=round(crestere_achizitii_val, 1), - status="good", # Informativ - nu are praguri stricte - threshold_min=None, - threshold_max=None, - message=crestere_achizitii_message - ) - elif total_achizitii_curent > 0: - crestere_achizitii_yoy = IndicatorResult( - value=100.0, - status="good", - threshold_min=None, - threshold_max=None, - message="Achiziții noi - nu existau în anul anterior" - ) - else: - crestere_achizitii_yoy = IndicatorResult( - value=None, - status="warning", - threshold_min=None, - threshold_max=None, - message="Fără date de achiziții pentru comparație" - ) - - # 3. Marja implicită - # Formula: (CA - achizitii_stocuri) / CA * 100 - # Arată ce procent din Cifra de Afaceri rămâne după achiziții de stocuri - if total_vanzari_curent > 0: - marja_val = ( - (total_vanzari_curent - total_achizitii_curent) / - total_vanzari_curent * 100 - ) - # Status: good > 20%, warning 10-20%, danger < 10% - marja_status = FinancialIndicatorsService._calculate_indicator_status( - marja_val, - good_threshold=20.0, - warning_threshold=10.0 - ) - marja_message = ( - "Marjă implicită sănătoasă" - if marja_val > 20 - else "Marjă implicită moderată" - if marja_val >= 10 - else "Marjă implicită redusă - verificați costurile" - ) - marja_implicita = IndicatorResult( - value=round(marja_val, 1), - status=marja_status, - threshold_min=20.0, - threshold_max=None, - message=marja_message - ) - else: - marja_implicita = IndicatorResult( - value=None, - status="warning", - threshold_min=20.0, - threshold_max=None, - message="Fără vânzări - nu se poate calcula marja" - ) - - result = DynamicsIndicators( - crestere_vanzari_yoy=crestere_vanzari_yoy, - crestere_achizitii_yoy=crestere_achizitii_yoy, - marja_implicita=marja_implicita, - # Sub-indicatori pentru verificare manuală - # IMPORTANT: Acestea sunt acum FĂRĂ TVA (Cifra de Afaceri din Clasa 7) - vanzari_an_curent=IndicatorResult( - value=round(total_vanzari_curent, 2), - status="good", - message="Cifra de Afaceri YTD an curent (fără TVA)" - ), - vanzari_an_precedent=IndicatorResult( - value=round(total_vanzari_anterior, 2), - status="good", - message="Cifra de Afaceri YTD an precedent (fără TVA)" - ), - achizitii_an_curent=IndicatorResult( - value=round(total_achizitii_curent, 2), - status="good", - message="Achiziții totale YTD an curent (stocuri + cheltuieli directe, fără TVA)" - ), - achizitii_an_precedent=IndicatorResult( - value=round(total_achizitii_anterior, 2), - status="good", - message="Achiziții totale YTD an precedent (stocuri + cheltuieli directe, fără TVA)" - ) - ) - - logger.info( - f"Dynamics indicators for company {company_id}, luna={luna}, an={an}: " - f"crestere_vanzari_yoy={crestere_vanzari_yoy.value}% ({crestere_vanzari_yoy.status}), " - f"crestere_achizitii_yoy={crestere_achizitii_yoy.value}% ({crestere_achizitii_yoy.status}), " - f"marja_implicita={marja_implicita.value}% ({marja_implicita.status})" - ) - - return result - - @staticmethod - @cached(cache_type='fin_altman', key_params=['company_id', 'luna', 'an', 'server_id']) - async def calculate_altman_zscore( - company_id: int, - luna: int, - an: int, - server_id: Optional[str] = None - ) -> AltmanZScore: - """ - Calculează Altman Z-Score pentru evaluarea riscului de faliment. - - Folosim formula modificată pentru companii private (Z'-Score): - Z' = 6.56*X1 + 3.26*X2 + 6.72*X3 + 1.05*X4 - - Aceasta este versiunea pentru companii care nu sunt listate la bursă, - unde se folosește valoarea contabilă a capitalurilor proprii (Book Value) - în loc de valoarea de piață a acțiunilor. - - Componente: - - X1 = Working Capital / Total Assets (lichiditate pe termen scurt) - - X2 = Retained Earnings / Total Assets (profitabilitate cumulată) - - X3 = EBIT / Total Assets (eficiență operațională) - - X4 = Book Value of Equity / Total Liabilities (solvabilitate) - - Zone de risc: - - Safe (Z > 2.60): Risc minim de faliment - situație financiară solidă - - Grey (1.10 <= Z <= 2.60): Zona de incertitudine - necesită monitorizare - - Distress (Z < 1.10): Risc ridicat de faliment - situație critică - - Args: - company_id: ID-ul firmei - luna: Luna contabilă (1-12) - an: Anul contabil - - Returns: - AltmanZScore cu scorul calculat și componentele individuale x1, x2, x3, x4 - """ - # Obținem agregatele din balanță - aggregates = await FinancialIndicatorsService.get_balance_sheet_aggregates( - company_id, luna, an, server_id - ) - # Ensure aggregates is a BalanceSheetAggregates model (cache may return dict) - if isinstance(aggregates, dict): - aggregates = BalanceSheetAggregates(**aggregates) - - # Calculăm componentele necesare - # Working Capital = active_curente - datorii_curente - working_capital = float(aggregates.working_capital) - - # Total Assets = active_imobilizate + active_curente - total_assets = float(aggregates.total_active) - - # Rezultat reportat (cont 117 + 121) - deja agregat în `rezultat` - rezultat_reportat = float(aggregates.rezultat) - - # EBIT = venituri - cheltuieli_operationale - ebit = float(aggregates.ebit) - - # Capital propriu (inclusiv rezultat) pentru X4 - capital_propriu = float(aggregates.capitaluri_proprii) - - # Total datorii (curente + termen lung) - total_datorii = float(aggregates.total_datorii) - datorii_curente = float(aggregates.datorii_curente) - datorii_termen_lung = float(aggregates.datorii_termen_lung) - - # Verificăm dacă avem date suficiente pentru calcul - if total_assets == 0: - # Nu putem calcula Z-Score fără active - return AltmanZScore( - zscore=IndicatorResult( - value=None, - status="warning", - threshold_min=2.60, - threshold_max=None, - message="Nu se poate calcula - total active este zero" - ), - x1=IndicatorResult(value=None, status="warning"), - x2=IndicatorResult(value=None, status="warning"), - x3=IndicatorResult(value=None, status="warning"), - x4=IndicatorResult(value=None, status="warning"), - capital_de_lucru=IndicatorResult( - value=round(working_capital, 2), - status="warning", - message="Active Curente - Datorii Curente" - ), - active_totale=IndicatorResult( - value=0, - status="warning", - message="Nu există active în balanță" - ), - datorii_totale=IndicatorResult( - value=round(total_datorii, 2), - status="warning", - message="Datorii Curente + Datorii Termen Lung" - ) - ) - - # Calculăm componentele X1-X4 - - # X1 = Working Capital / Total Assets - # Măsoară lichiditatea - cât de mult din active este finanțat din surse pe termen scurt - x1_val = working_capital / total_assets - x1_status = "good" if x1_val > 0 else "danger" - x1 = IndicatorResult( - value=round(x1_val, 4), - status=x1_status, - threshold_min=0, - threshold_max=None, - message="Lichiditate pe termen scurt" if x1_val > 0 else "Working capital negativ" - ) - - # X2 = Retained Earnings / Total Assets - # Măsoară profitabilitatea cumulată - câștigurile reinvestite în companie - x2_val = rezultat_reportat / total_assets - x2_status = "good" if x2_val > 0 else ("warning" if x2_val == 0 else "danger") - x2 = IndicatorResult( - value=round(x2_val, 4), - status=x2_status, - threshold_min=0, - threshold_max=None, - message="Profitabilitate cumulată" if x2_val >= 0 else "Pierderi cumulate" - ) - - # X3 = EBIT / Total Assets - # Măsoară eficiența operațională - randamentul activelor - x3_val = ebit / total_assets - x3_status = "good" if x3_val > 0 else ("warning" if x3_val == 0 else "danger") - x3 = IndicatorResult( - value=round(x3_val, 4), - status=x3_status, - threshold_min=0, - threshold_max=None, - message="Eficiență operațională" if x3_val >= 0 else "Pierdere operațională" - ) - - # X4 = Book Value of Equity / Total Liabilities - # Măsoară solvabilitatea - acoperirea datoriilor cu capital propriu - if total_datorii > 0: - x4_val = capital_propriu / total_datorii - x4_status = FinancialIndicatorsService._calculate_indicator_status( - x4_val, - good_threshold=1.0, - warning_threshold=0.5 - ) - x4 = IndicatorResult( - value=round(x4_val, 4), - status=x4_status, - threshold_min=1.0, - threshold_max=None, - message="Solvabilitate bună" if x4_val >= 1 else "Îndatorare ridicată" - ) - else: - # Fără datorii - situație excelentă pentru solvabilitate - x4_val = None # Infinit teoretic, dar nu putem reprezenta - x4 = IndicatorResult( - value=None, - status="good", - threshold_min=1.0, - threshold_max=None, - message="Fără datorii - solvabilitate maximă" - ) - - # Calculăm Z-Score folosind formula pentru companii private - # Z' = 6.56*X1 + 3.26*X2 + 6.72*X3 + 1.05*X4 - if x4_val is not None: - zscore_val = ( - 6.56 * x1_val + - 3.26 * x2_val + - 6.72 * x3_val + - 1.05 * x4_val - ) - else: - # Dacă X4 este infinit (fără datorii), calculăm Z-Score fără componenta X4 - # În practică, firmele fără datorii au un Z-Score foarte bun - # Folosim o valoare foarte mare pentru X4 (ex: 10) ca proxy - zscore_val = ( - 6.56 * x1_val + - 3.26 * x2_val + - 6.72 * x3_val + - 1.05 * 10.0 # Proxy pentru solvabilitate maximă - ) - - # Determinăm zona de risc - if zscore_val > 2.60: - zscore_status = "safe" - zscore_message = "Zona sigură - risc minim de faliment" - elif zscore_val >= 1.10: - zscore_status = "grey" - zscore_message = "Zona gri - necesită monitorizare atentă" - else: - zscore_status = "distress" - zscore_message = "Zona de risc - risc ridicat de faliment" - - zscore = IndicatorResult( - value=round(zscore_val, 2), - status=zscore_status, - threshold_min=2.60, - threshold_max=None, - message=zscore_message - ) - - # Indicatori de bază pentru verificare manuală în balanță - capital_de_lucru = IndicatorResult( - value=round(working_capital, 2), - status="good" if working_capital > 0 else "danger", - threshold_min=0, - threshold_max=None, - message="Active Curente - Datorii Curente" - ) - - active_totale_ind = IndicatorResult( - value=round(total_assets, 2), - status="good", - threshold_min=None, - threshold_max=None, - message="Active Imobilizate + Active Curente" - ) - - datorii_totale_ind = IndicatorResult( - value=round(total_datorii, 2), - status="good", - threshold_min=None, - threshold_max=None, - message="Datorii Curente + Datorii Termen Lung" - ) - - result = AltmanZScore( - zscore=zscore, - x1=x1, - x2=x2, - x3=x3, - x4=x4, - capital_de_lucru=capital_de_lucru, - active_totale=active_totale_ind, - datorii_totale=datorii_totale_ind - ) - - logger.info( - f"Altman Z-Score for company {company_id}, luna={luna}, an={an}: " - f"zscore={zscore.value} ({zscore.status}), " - f"X1={x1.value}, X2={x2.value}, X3={x3.value}, X4={x4.value}" - ) - - return result - - @staticmethod - @cached(cache_type='fin_profitability', key_params=['company_id', 'luna', 'an', 'server_id']) - async def calculate_profitability_indicators( - company_id: int, - luna: int, - an: int, - server_id: Optional[str] = None - ) -> ProfitabilityIndicators: - """ - Calculează indicatorii de profitabilitate pentru evaluarea randamentului afacerii. - - Indicatori calculați: - - cifra_afaceri: Total venituri operaționale (Clasa 7) - - cheltuieli_totale: Total cheltuieli operaționale (Clasa 6) - - profit_brut: EBIT = venituri - cheltuieli - - marja_profit_brut: profit / venituri * 100 - - roa: Return on Assets = profit / total_active * 100 - - roe: Return on Equity = profit / capitaluri_proprii * 100 - - Praguri de referință: - - Marja profit: good > 10%, warning 5-10%, danger < 5% - - ROA: good > 5%, warning 2-5%, danger < 2% - - ROE: good > 10%, warning 5-10%, danger < 5% - - Args: - company_id: ID-ul firmei - luna: Luna contabilă (1-12) - an: Anul contabil - - Returns: - ProfitabilityIndicators cu cei șase indicatori de profitabilitate - """ - # Obținem agregatele din balanță (include venituri, cheltuieli, active, capital) - aggregates = await FinancialIndicatorsService.get_balance_sheet_aggregates( - company_id, luna, an, server_id - ) - # Ensure aggregates is a BalanceSheetAggregates model (cache may return dict) - if isinstance(aggregates, dict): - aggregates = BalanceSheetAggregates(**aggregates) - - # Extragem valorile necesare - venituri = float(aggregates.venituri) - cheltuieli_oper = float(aggregates.cheltuieli_operationale) - cheltuieli_fin = float(aggregates.cheltuieli_financiare) - cheltuieli_total = cheltuieli_oper + cheltuieli_fin - profit_brut_val = float(aggregates.ebit) # EBIT = venituri - cheltuieli operaționale - total_active = float(aggregates.total_active) - capitaluri_proprii_val = float(aggregates.capitaluri_proprii) - - # Detect if balance sheet has data but income/expense accounts are 0 - # This typically means the accounting period is not closed in Oracle - has_balance_data = total_active > 0 or float(aggregates.datorii_curente) > 0 - no_income_data = venituri == 0 and cheltuieli_oper == 0 - period_not_closed = has_balance_data and no_income_data - - # 1. Cifra de afaceri (venituri totale) - informativ - if period_not_closed: - cifra_afaceri_status = "warning" - cifra_afaceri_message = "Date indisponibile - perioada contabilă neînchisă?" - else: - cifra_afaceri_status = "good" - cifra_afaceri_message = "Total venituri din activitatea operațională" - - cifra_afaceri = IndicatorResult( - value=round(venituri, 2), - status=cifra_afaceri_status, - threshold_min=None, - threshold_max=None, - message=cifra_afaceri_message - ) - - # 2. Cheltuieli operaționale (fără dobânzi 66x) - pentru verificare - cheltuieli_operationale = IndicatorResult( - value=round(cheltuieli_oper, 2), - status="good", # Informativ - nu are praguri - threshold_min=None, - threshold_max=None, - message="Clasa 60x-65x + 68x (fără dobânzi)" - ) - - # 3. Cheltuieli financiare (66x) - pentru verificare - cheltuieli_financiare = IndicatorResult( - value=round(cheltuieli_fin, 2), - status="good", # Informativ - nu are praguri - threshold_min=None, - threshold_max=None, - message="Clasa 66x (dobânzi, diferențe curs)" - ) - - # 4. Cheltuieli totale (operaționale + financiare) - cheltuieli_totale = IndicatorResult( - value=round(cheltuieli_total, 2), - status="good", # Informativ - nu are praguri - threshold_min=None, - threshold_max=None, - message="Operaționale + Financiare" - ) - - # 3. Profit brut (EBIT) - if period_not_closed: - profit_status = "warning" - profit_message = "Date indisponibile - perioada contabilă neînchisă?" - elif profit_brut_val > 0: - profit_status = "good" - profit_message = "Profit operațional pozitiv" - else: - profit_status = "danger" - profit_message = "Pierdere operațională - costuri depășesc veniturile" - - profit_brut = IndicatorResult( - value=round(profit_brut_val, 2), - status=profit_status, - threshold_min=0, - threshold_max=None, - message=profit_message - ) - - # 4. Marja de profit = profit / venituri * 100 - if venituri > 0: - marja_val = (profit_brut_val / venituri) * 100 - marja_status = FinancialIndicatorsService._calculate_indicator_status( - marja_val, - good_threshold=10.0, - warning_threshold=5.0 - ) - marja_message = ( - "Marjă de profit sănătoasă" - if marja_val > 10 - else "Marjă de profit moderată" - if marja_val >= 5 - else "Marjă de profit scăzută - verificați costurile" - ) - marja_profit_brut = IndicatorResult( - value=round(marja_val, 1), - status=marja_status, - threshold_min=10.0, - threshold_max=None, - message=marja_message - ) - else: - marja_profit_brut = IndicatorResult( - value=None, - status="warning", - threshold_min=10.0, - threshold_max=None, - message="Fără venituri - nu se poate calcula marja" - ) - - # 5. ROA (Return on Assets) = profit / total_active * 100 - if total_active > 0: - roa_val = (profit_brut_val / total_active) * 100 - roa_status = FinancialIndicatorsService._calculate_indicator_status( - roa_val, - good_threshold=5.0, - warning_threshold=2.0 - ) - roa_message = ( - "Randament bun al activelor" - if roa_val > 5 - else "Randament moderat al activelor" - if roa_val >= 2 - else "Randament scăzut al activelor" - ) - roa = IndicatorResult( - value=round(roa_val, 2), - status=roa_status, - threshold_min=5.0, - threshold_max=None, - message=roa_message - ) - else: - roa = IndicatorResult( - value=None, - status="warning", - threshold_min=5.0, - threshold_max=None, - message="Fără active - nu se poate calcula ROA" - ) - - # Indicatori de bază pentru verificare manuală în balanță - active_totale = IndicatorResult( - value=round(total_active, 2), - status="good", - threshold_min=None, - threshold_max=None, - message="Active Imobilizate + Active Curente (bază calcul ROA)" - ) - - capitaluri_proprii = IndicatorResult( - value=round(capitaluri_proprii_val, 2), - status="good" if capitaluri_proprii_val > 0 else "danger", - threshold_min=None, - threshold_max=None, - message="Capital Social + Rezultat (bază calcul ROE)" - ) - - # ROE (Return on Equity) = profit / capitaluri_proprii * 100 - if capitaluri_proprii_val > 0: - roe_val = (profit_brut_val / capitaluri_proprii_val) * 100 - roe_status = FinancialIndicatorsService._calculate_indicator_status( - roe_val, - good_threshold=10.0, - warning_threshold=5.0 - ) - roe_message = ( - "Randament atractiv pentru acționari" - if roe_val > 10 - else "Randament moderat pentru acționari" - if roe_val >= 5 - else "Randament scăzut pentru acționari" - ) - roe = IndicatorResult( - value=round(roe_val, 2), - status=roe_status, - threshold_min=10.0, - threshold_max=None, - message=roe_message - ) - elif capitaluri_proprii_val <= 0 and profit_brut_val > 0: - # Capital negativ dar profit pozitiv - situație neobișnuită - roe = IndicatorResult( - value=None, - status="danger", - threshold_min=10.0, - threshold_max=None, - message="Capital propriu negativ sau zero - situație de risc" - ) - else: - roe = IndicatorResult( - value=None, - status="warning", - threshold_min=10.0, - threshold_max=None, - message="Nu se poate calcula ROE" - ) - - result = ProfitabilityIndicators( - cifra_afaceri=cifra_afaceri, - cheltuieli_operationale=cheltuieli_operationale, - cheltuieli_financiare=cheltuieli_financiare, - cheltuieli_totale=cheltuieli_totale, - profit_brut=profit_brut, - # Sub-indicator pentru verificare calcul EBIT - venituri=IndicatorResult( - value=round(venituri, 2), - status="good", - message="Total venituri (Clasa 7) - verificare EBIT" - ), - marja_profit_brut=marja_profit_brut, - active_totale=active_totale, - capitaluri_proprii=capitaluri_proprii, - roa=roa, - roe=roe - ) - - logger.info( - f"Profitability indicators for company {company_id}, luna={luna}, an={an}: " - f"cifra_afaceri={cifra_afaceri.value}, " - f"profit_brut={profit_brut.value} ({profit_brut.status}), " - f"marja={marja_profit_brut.value}% ({marja_profit_brut.status}), " - f"roa={roa.value}% ({roa.status}), " - f"roe={roe.value}% ({roe.status})" - ) - - return result - - @staticmethod - async def calculate_solvability_indicators( - company_id: int, - luna: int, - an: int, - server_id: Optional[str] = None - ) -> SolvabilityIndicators: - """ - Calculează indicatorii de solvabilitate pentru evaluarea capacității - firmei de a-și acoperi datoriile pe termen lung. - - Indicatori calculați: - - Activ Net Contabil (ANC) = Total Active - Total Datorii - - Rata ANC/Capital Social = (ANC / Capital Social) × 100 - - Praguri de referință: - - ANC: Good: > 0, Danger: <= 0 - - Rata ANC/Capital: Good: >= 100%, Warning: 50-100%, Danger: < 50% - - Implicații legale (din 1 ianuarie 2026): - Sub 50% din capital social → restricții dividende, restituire împrumuturi, - acordare împrumuturi noi. - - Args: - company_id: ID-ul firmei - luna: Luna contabilă (1-12) - an: Anul contabil - - Returns: - SolvabilityIndicators cu ANC și rata ANC/Capital Social - """ - # Obținem agregatele din balanță - aggregates = await FinancialIndicatorsService.get_balance_sheet_aggregates( - company_id, luna, an, server_id - ) - # Ensure aggregates is a BalanceSheetAggregates model (cache may return dict) - if isinstance(aggregates, dict): - aggregates = BalanceSheetAggregates(**aggregates) - - # Extragem valorile necesare - total_active = float(aggregates.total_active) - total_datorii = float(aggregates.total_datorii) - # Folosim capital_social_strict (doar contul 101) conform definiției legale stricte - capital_social = float(aggregates.capital_social_strict) # Capital Social = doar contul 101 - - # 1. Calculăm Activul Net Contabil (ANC) - anc_val = total_active - total_datorii - - # Status pentru ANC: pozitiv = good, negativ sau zero = danger - if anc_val > 0: - anc_status = "good" - anc_message = "Activ net pozitiv - firma solvabilă" - else: - anc_status = "danger" - anc_message = "Activ net negativ sau zero - risc de insolvență" - - activ_net_contabil = IndicatorResult( - value=round(anc_val, 2), - status=anc_status, - threshold_min=0, - threshold_max=None, - message=anc_message - ) - - # 2. Calculăm Rata ANC / Capital Social - if capital_social > 0: - rata_val = (anc_val / capital_social) * 100 - - # Praguri conform legislației din 2026 - if rata_val >= 100: - rata_status = "good" - rata_message = "ANC peste capitalul social - situație sănătoasă" - elif rata_val >= 50: - rata_status = "warning" - rata_message = "ANC între 50-100% din capital - atenție la evoluție" - else: - rata_status = "danger" - rata_message = "ANC sub 50% din capital - restricții legale aplicabile" - - rata_anc_capital = IndicatorResult( - value=round(rata_val, 2), - status=rata_status, - threshold_min=100.0, - threshold_max=None, - message=rata_message - ) - else: - # Capital social zero sau negativ - situație critică - rata_anc_capital = IndicatorResult( - value=None, - status="danger", - threshold_min=100.0, - threshold_max=None, - message="Capital social zero sau negativ - situație critică" - ) - - # Indicatori de bază pentru verificare - total_active_indicator = IndicatorResult( - value=round(total_active, 2), - status="good", - threshold_min=None, - threshold_max=None, - message="Active Imobilizate + Active Curente" - ) - - total_datorii_indicator = IndicatorResult( - value=round(total_datorii, 2), - status="good" if total_datorii < total_active else "warning", - threshold_min=None, - threshold_max=None, - message="Datorii Curente + Datorii Termen Lung" - ) - - capital_social_indicator = IndicatorResult( - value=round(capital_social, 2), - status="good" if capital_social > 0 else "danger", - threshold_min=None, - threshold_max=None, - message="Capital social subscris și vărsat" - ) - - result = SolvabilityIndicators( - activ_net_contabil=activ_net_contabil, - rata_anc_capital=rata_anc_capital, - total_active=total_active_indicator, - total_datorii=total_datorii_indicator, - capital_social=capital_social_indicator - ) - - logger.info( - f"Solvability indicators for company {company_id}, luna={luna}, an={an}: " - f"ANC={activ_net_contabil.value} ({activ_net_contabil.status}), " - f"Rata ANC/CS={rata_anc_capital.value}% ({rata_anc_capital.status})" - ) - - return result - - @staticmethod - def _generate_month_labels(luna: int, an: int, months: int = 12) -> List[str]: - """ - Generează etichetele lunilor în format 'MMM YY' pentru sparkline. - - Generează etichete pentru ultimele `months` luni, terminând cu luna/an specificată. - Folosim abrevieri în engleză pentru consistență internațională. - - Args: - luna: Luna finală (1-12) - an: Anul final - months: Numărul de luni de generat (default 12) - - Returns: - Lista de etichete în format 'MMM YY' (ex: ['Feb 24', 'Mar 24', ...]) - """ - MONTH_ABBR = [ - 'Ian', 'Feb', 'Mar', 'Apr', 'Mai', 'Iun', - 'Iul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' - ] - - labels = [] - current_luna = luna - current_an = an - - # Generăm etichetele de la luna curentă înapoi - for _ in range(months): - year_short = str(current_an)[-2:] # Ultimele 2 cifre ale anului - label = f"{MONTH_ABBR[current_luna - 1]} {year_short}" - labels.insert(0, label) # Inserăm la început pentru ordine cronologică - - # Mergem la luna anterioară - current_luna -= 1 - if current_luna < 1: - current_luna = 12 - current_an -= 1 - - return labels - - @staticmethod - def _get_historical_periods(luna: int, an: int, months: int = 12) -> List[tuple]: - """ - Generează lista de perioade (luna, an) pentru ultimele `months` luni. - - Args: - luna: Luna finală (1-12) - an: Anul final - months: Numărul de luni (default 12) - - Returns: - Lista de tuple (luna, an) în ordine cronologică - """ - periods = [] - current_luna = luna - current_an = an - - for _ in range(months): - periods.insert(0, (current_luna, current_an)) - - current_luna -= 1 - if current_luna < 1: - current_luna = 12 - current_an -= 1 - - return periods - - @staticmethod - @cached(cache_type='financial_indicators_historical', ttl=3600, key_params=['company_id', 'months', 'luna', 'an', 'server_id']) - async def get_historical_indicators( - company_id: int, - months: int = 12, - luna: Optional[int] = None, - an: Optional[int] = None, - server_id: Optional[str] = None - ) -> Dict[str, Any]: - """ - Calculează indicatorii financiari pentru ultimele `months` luni - și returnează datele pentru sparklines. - - Această metodă este optimizată pentru performanță cu cache separat - (TTL 1 oră) deoarece datele istorice se schimbă rar. - - Args: - company_id: ID-ul firmei - months: Numărul de luni pentru istoric (default 12) - luna: Luna de referință (dacă None, folosește luna curentă) - an: Anul de referință (dacă None, folosește anul curent) - - Returns: - Dict cu: - - sparkline_labels: Array cu etichetele lunilor - - lichiditate: Dict cu sparkline_data pentru fiecare indicator - - eficienta: Dict cu sparkline_data pentru fiecare indicator - - risc: Dict cu sparkline_data pentru fiecare indicator - - cash_flow: Dict cu sparkline_data pentru fiecare indicator - - dinamica: Dict cu sparkline_data pentru fiecare indicator - - altman_zscore: Dict cu sparkline_data pentru fiecare indicator - """ - from datetime import datetime - - # Dacă luna/an nu sunt specificate, folosim data curentă - resolved_luna: int - resolved_an: int - - if luna is None or an is None: - try: - from .dashboard_service import DashboardService - current_period = await DashboardService.get_current_period(company_id) - resolved_luna = luna if luna is not None else current_period.get('luna', datetime.now().month) - resolved_an = an if an is not None else current_period.get('an', datetime.now().year) - except Exception as e: - logger.warning(f"Could not get current period: {e}, using defaults") - resolved_luna = luna if luna is not None else datetime.now().month - resolved_an = an if an is not None else datetime.now().year - else: - resolved_luna = luna - resolved_an = an - - # Generăm perioadele și etichetele - periods = FinancialIndicatorsService._get_historical_periods(resolved_luna, resolved_an, months) - labels = FinancialIndicatorsService._generate_month_labels(resolved_luna, resolved_an, months) - - # Inițializăm structurile pentru sparkline data - historical_data = { - 'sparkline_labels': labels, - 'lichiditate': { - 'lichiditate_curenta': [], - 'lichiditate_imediata': [], - 'lichiditate_vedere': [] - }, - 'eficienta': { - 'dso': [], - 'dpo': [], - 'cash_conversion_cycle': [], - 'rata_incasare': [], - 'rata_plata': [] - }, - 'risc': { - 'creante_restante_pct': [], - 'creante_90plus_pct': [], - 'datorii_restante_pct': [], - 'raport_datorii_trezorerie': [] - }, - 'cash_flow': { - 'flux_net_lunar': [], - 'cash_flow_ytd': [], - 'flux_net_yoy_pct': [], - 'acoperire_cash_flow': [] - }, - 'dinamica': { - 'crestere_vanzari_yoy': [], - 'crestere_achizitii_yoy': [], - 'marja_implicita': [] - }, - 'altman_zscore': { - 'zscore': [], - 'x1': [], - 'x2': [], - 'x3': [], - 'x4': [] - }, - 'profitabilitate': { - 'cifra_afaceri': [], - 'cheltuieli_totale': [], - 'profit_brut': [], - 'marja_profit_brut': [], - 'roa': [], - 'roe': [] - }, - 'solvabilitate': { - 'activ_net_contabil': [], - 'rata_anc_capital': [] - } - } - - # Calculăm indicatorii pentru fiecare perioadă - all_categories = ['lichiditate', 'eficienta', 'risc', 'cash_flow', 'dinamica', 'altman_zscore', 'profitabilitate', 'solvabilitate'] - - for period_luna, period_an in periods: - # Track which categories were successfully processed in this period - processed_categories = set() - - try: - # Lichiditate - lichiditate = await FinancialIndicatorsService.calculate_liquidity_indicators( - company_id, period_luna, period_an, server_id - ) - # Ensure lichiditate is a model (cache may return dict) - if isinstance(lichiditate, dict): - lichiditate = LiquidityIndicators(**lichiditate) - historical_data['lichiditate']['lichiditate_curenta'].append( - lichiditate.lichiditate_curenta.value - ) - historical_data['lichiditate']['lichiditate_imediata'].append( - lichiditate.lichiditate_imediata.value - ) - historical_data['lichiditate']['lichiditate_vedere'].append( - lichiditate.lichiditate_vedere.value - ) - processed_categories.add('lichiditate') - - # Eficiență - eficienta = await FinancialIndicatorsService.calculate_efficiency_indicators( - company_id, period_luna, period_an, server_id - ) - # Ensure eficienta is a model (cache may return dict) - if isinstance(eficienta, dict): - eficienta = EfficiencyIndicators(**eficienta) - historical_data['eficienta']['dso'].append(eficienta.dso.value) - historical_data['eficienta']['dpo'].append(eficienta.dpo.value) - historical_data['eficienta']['cash_conversion_cycle'].append( - eficienta.cash_conversion_cycle.value - ) - historical_data['eficienta']['rata_incasare'].append(eficienta.rata_incasare.value) - historical_data['eficienta']['rata_plata'].append(eficienta.rata_plata.value) - processed_categories.add('eficienta') - - # Risc - risc = await FinancialIndicatorsService.calculate_risk_indicators( - company_id, period_luna, period_an, server_id - ) - # Ensure risc is a model (cache may return dict) - if isinstance(risc, dict): - risc = RiskIndicators(**risc) - historical_data['risc']['creante_restante_pct'].append( - risc.creante_restante_pct.value - ) - historical_data['risc']['creante_90plus_pct'].append(risc.creante_90plus_pct.value) - historical_data['risc']['datorii_restante_pct'].append( - risc.datorii_restante_pct.value - ) - historical_data['risc']['raport_datorii_trezorerie'].append( - risc.raport_datorii_trezorerie.value - ) - processed_categories.add('risc') - - # Cash Flow - cash_flow = await FinancialIndicatorsService.calculate_cashflow_indicators( - company_id, period_luna, period_an, server_id - ) - # Ensure cash_flow is a model (cache may return dict) - if isinstance(cash_flow, dict): - cash_flow = CashFlowIndicators(**cash_flow) - historical_data['cash_flow']['flux_net_lunar'].append(cash_flow.flux_net_lunar.value) - historical_data['cash_flow']['cash_flow_ytd'].append(cash_flow.cash_flow_ytd.value) - historical_data['cash_flow']['flux_net_yoy_pct'].append( - cash_flow.flux_net_yoy_pct.value - ) - historical_data['cash_flow']['acoperire_cash_flow'].append( - cash_flow.acoperire_cash_flow.value - ) - processed_categories.add('cash_flow') - - # Dinamica - dinamica = await FinancialIndicatorsService.calculate_dynamics_indicators( - company_id, period_luna, period_an, server_id - ) - # Ensure dinamica is a model (cache may return dict) - if isinstance(dinamica, dict): - dinamica = DynamicsIndicators(**dinamica) - historical_data['dinamica']['crestere_vanzari_yoy'].append( - dinamica.crestere_vanzari_yoy.value - ) - historical_data['dinamica']['crestere_achizitii_yoy'].append( - dinamica.crestere_achizitii_yoy.value - ) - historical_data['dinamica']['marja_implicita'].append(dinamica.marja_implicita.value) - processed_categories.add('dinamica') - - # Altman Z-Score - altman = await FinancialIndicatorsService.calculate_altman_zscore( - company_id, period_luna, period_an, server_id - ) - # Ensure altman is a model (cache may return dict) - if isinstance(altman, dict): - altman = AltmanZScore(**altman) - historical_data['altman_zscore']['zscore'].append(altman.zscore.value) - historical_data['altman_zscore']['x1'].append(altman.x1.value) - historical_data['altman_zscore']['x2'].append(altman.x2.value) - historical_data['altman_zscore']['x3'].append(altman.x3.value) - historical_data['altman_zscore']['x4'].append(altman.x4.value) - processed_categories.add('altman_zscore') - - # Profitabilitate - profitabilitate = await FinancialIndicatorsService.calculate_profitability_indicators( - company_id, period_luna, period_an, server_id - ) - # Ensure profitabilitate is a model (cache may return dict) - if isinstance(profitabilitate, dict): - profitabilitate = ProfitabilityIndicators(**profitabilitate) - historical_data['profitabilitate']['cifra_afaceri'].append( - profitabilitate.cifra_afaceri.value - ) - historical_data['profitabilitate']['cheltuieli_totale'].append( - profitabilitate.cheltuieli_totale.value - ) - historical_data['profitabilitate']['profit_brut'].append( - profitabilitate.profit_brut.value - ) - historical_data['profitabilitate']['marja_profit_brut'].append( - profitabilitate.marja_profit_brut.value - ) - historical_data['profitabilitate']['roa'].append(profitabilitate.roa.value) - historical_data['profitabilitate']['roe'].append(profitabilitate.roe.value) - processed_categories.add('profitabilitate') - - # Solvabilitate - solvabilitate = await FinancialIndicatorsService.calculate_solvability_indicators( - company_id, period_luna, period_an, server_id - ) - # Ensure solvabilitate is a model (cache may return dict) - if isinstance(solvabilitate, dict): - solvabilitate = SolvabilityIndicators(**solvabilitate) - historical_data['solvabilitate']['activ_net_contabil'].append( - solvabilitate.activ_net_contabil.value - ) - historical_data['solvabilitate']['rata_anc_capital'].append( - solvabilitate.rata_anc_capital.value - ) - processed_categories.add('solvabilitate') - - except Exception as e: - logger.warning( - f"Error calculating indicators for company {company_id}, " - f"luna={period_luna}, an={period_an}: {e}" - ) - - # Add None ONLY for categories that were NOT successfully processed - # This prevents duplicate entries when an exception occurs mid-way - for category in all_categories: - if category not in processed_categories: - for indicator in historical_data[category]: - historical_data[category][indicator].append(None) - - logger.info( - f"Historical indicators for company {company_id}: " - f"{months} months ending {resolved_luna}/{resolved_an}" - ) - - return historical_data - - @staticmethod - @cached(cache_type='financial_indicators_sparklines', key_params=['company_id', 'luna', 'an', 'months', 'server_id']) - async def get_indicators_with_sparklines( - company_id: int, - luna: int, - an: int, - months: int = 12, - request: Optional[Request] = None, - server_id: Optional[str] = None - ) -> FinancialIndicatorsResponse: - """ - Calculează toți indicatorii financiari și adaugă datele de sparkline - pentru vizualizarea trendului pe ultimele luni (CACHED 30 min). - - Această metodă combină calculele curente ale indicatorilor cu - datele istorice pentru sparklines. - - Args: - company_id: ID-ul firmei - luna: Luna contabilă (1-12) - an: Anul contabil - months: Numărul de luni pentru sparkline (default 12) - request: Request object pentru cache metadata - - Returns: - FinancialIndicatorsResponse cu sparkline_data integrat în fiecare indicator - """ - import asyncio - - # Obținem datele istorice și indicatorii curenți în paralel - historical_task = FinancialIndicatorsService.get_historical_indicators( - company_id, months, luna, an, server_id - ) - - lichiditate_task = FinancialIndicatorsService.calculate_liquidity_indicators( - company_id, luna, an, server_id - ) - eficienta_task = FinancialIndicatorsService.calculate_efficiency_indicators( - company_id, luna, an, server_id - ) - risc_task = FinancialIndicatorsService.calculate_risk_indicators( - company_id, luna, an, server_id - ) - cash_flow_task = FinancialIndicatorsService.calculate_cashflow_indicators( - company_id, luna, an, server_id - ) - dinamica_task = FinancialIndicatorsService.calculate_dynamics_indicators( - company_id, luna, an, server_id - ) - altman_task = FinancialIndicatorsService.calculate_altman_zscore( - company_id, luna, an, server_id - ) - profitabilitate_task = FinancialIndicatorsService.calculate_profitability_indicators( - company_id, luna, an, server_id - ) - solvabilitate_task = FinancialIndicatorsService.calculate_solvability_indicators( - company_id, luna, an, server_id - ) - - ( - historical_data, - lichiditate, - eficienta, - risc, - cash_flow, - dinamica, - altman_zscore, - profitabilitate, - solvabilitate - ) = await asyncio.gather( - historical_task, - lichiditate_task, - eficienta_task, - risc_task, - cash_flow_task, - dinamica_task, - altman_task, - profitabilitate_task, - solvabilitate_task - ) - - # Ensure all indicator results are models (cache may return dicts) - if isinstance(lichiditate, dict): - lichiditate = LiquidityIndicators(**lichiditate) - if isinstance(eficienta, dict): - eficienta = EfficiencyIndicators(**eficienta) - if isinstance(risc, dict): - risc = RiskIndicators(**risc) - if isinstance(cash_flow, dict): - cash_flow = CashFlowIndicators(**cash_flow) - if isinstance(dinamica, dict): - dinamica = DynamicsIndicators(**dinamica) - if isinstance(altman_zscore, dict): - altman_zscore = AltmanZScore(**altman_zscore) - if isinstance(profitabilitate, dict): - profitabilitate = ProfitabilityIndicators(**profitabilitate) - if isinstance(solvabilitate, dict): - solvabilitate = SolvabilityIndicators(**solvabilitate) - - # Extragem etichetele comune - sparkline_labels = historical_data['sparkline_labels'] - - # Actualizăm indicatorii de lichiditate cu sparkline data - lichiditate.lichiditate_curenta.sparkline_data = historical_data['lichiditate']['lichiditate_curenta'] - lichiditate.lichiditate_curenta.sparkline_labels = sparkline_labels - lichiditate.lichiditate_imediata.sparkline_data = historical_data['lichiditate']['lichiditate_imediata'] - lichiditate.lichiditate_imediata.sparkline_labels = sparkline_labels - lichiditate.lichiditate_vedere.sparkline_data = historical_data['lichiditate']['lichiditate_vedere'] - lichiditate.lichiditate_vedere.sparkline_labels = sparkline_labels - - # Actualizăm indicatorii de eficiență cu sparkline data - eficienta.dso.sparkline_data = historical_data['eficienta']['dso'] - eficienta.dso.sparkline_labels = sparkline_labels - eficienta.dpo.sparkline_data = historical_data['eficienta']['dpo'] - eficienta.dpo.sparkline_labels = sparkline_labels - eficienta.cash_conversion_cycle.sparkline_data = historical_data['eficienta']['cash_conversion_cycle'] - eficienta.cash_conversion_cycle.sparkline_labels = sparkline_labels - eficienta.rata_incasare.sparkline_data = historical_data['eficienta']['rata_incasare'] - eficienta.rata_incasare.sparkline_labels = sparkline_labels - eficienta.rata_plata.sparkline_data = historical_data['eficienta']['rata_plata'] - eficienta.rata_plata.sparkline_labels = sparkline_labels - - # Actualizăm indicatorii de risc cu sparkline data - risc.creante_restante_pct.sparkline_data = historical_data['risc']['creante_restante_pct'] - risc.creante_restante_pct.sparkline_labels = sparkline_labels - risc.creante_90plus_pct.sparkline_data = historical_data['risc']['creante_90plus_pct'] - risc.creante_90plus_pct.sparkline_labels = sparkline_labels - risc.datorii_restante_pct.sparkline_data = historical_data['risc']['datorii_restante_pct'] - risc.datorii_restante_pct.sparkline_labels = sparkline_labels - risc.raport_datorii_trezorerie.sparkline_data = historical_data['risc']['raport_datorii_trezorerie'] - risc.raport_datorii_trezorerie.sparkline_labels = sparkline_labels - - # Actualizăm indicatorii de cash flow cu sparkline data - cash_flow.flux_net_lunar.sparkline_data = historical_data['cash_flow']['flux_net_lunar'] - cash_flow.flux_net_lunar.sparkline_labels = sparkline_labels - cash_flow.cash_flow_ytd.sparkline_data = historical_data['cash_flow']['cash_flow_ytd'] - cash_flow.cash_flow_ytd.sparkline_labels = sparkline_labels - cash_flow.flux_net_yoy_pct.sparkline_data = historical_data['cash_flow']['flux_net_yoy_pct'] - cash_flow.flux_net_yoy_pct.sparkline_labels = sparkline_labels - cash_flow.acoperire_cash_flow.sparkline_data = historical_data['cash_flow']['acoperire_cash_flow'] - cash_flow.acoperire_cash_flow.sparkline_labels = sparkline_labels - - # Actualizăm indicatorii de dinamică cu sparkline data - dinamica.crestere_vanzari_yoy.sparkline_data = historical_data['dinamica']['crestere_vanzari_yoy'] - dinamica.crestere_vanzari_yoy.sparkline_labels = sparkline_labels - dinamica.crestere_achizitii_yoy.sparkline_data = historical_data['dinamica']['crestere_achizitii_yoy'] - dinamica.crestere_achizitii_yoy.sparkline_labels = sparkline_labels - dinamica.marja_implicita.sparkline_data = historical_data['dinamica']['marja_implicita'] - dinamica.marja_implicita.sparkline_labels = sparkline_labels - - # Actualizăm Altman Z-Score cu sparkline data - altman_zscore.zscore.sparkline_data = historical_data['altman_zscore']['zscore'] - altman_zscore.zscore.sparkline_labels = sparkline_labels - altman_zscore.x1.sparkline_data = historical_data['altman_zscore']['x1'] - altman_zscore.x1.sparkline_labels = sparkline_labels - altman_zscore.x2.sparkline_data = historical_data['altman_zscore']['x2'] - altman_zscore.x2.sparkline_labels = sparkline_labels - altman_zscore.x3.sparkline_data = historical_data['altman_zscore']['x3'] - altman_zscore.x3.sparkline_labels = sparkline_labels - altman_zscore.x4.sparkline_data = historical_data['altman_zscore']['x4'] - altman_zscore.x4.sparkline_labels = sparkline_labels - - # Actualizăm indicatorii de profitabilitate cu sparkline data - profitabilitate.cifra_afaceri.sparkline_data = historical_data['profitabilitate']['cifra_afaceri'] - profitabilitate.cifra_afaceri.sparkline_labels = sparkline_labels - profitabilitate.cheltuieli_totale.sparkline_data = historical_data['profitabilitate']['cheltuieli_totale'] - profitabilitate.cheltuieli_totale.sparkline_labels = sparkline_labels - profitabilitate.profit_brut.sparkline_data = historical_data['profitabilitate']['profit_brut'] - profitabilitate.profit_brut.sparkline_labels = sparkline_labels - profitabilitate.marja_profit_brut.sparkline_data = historical_data['profitabilitate']['marja_profit_brut'] - profitabilitate.marja_profit_brut.sparkline_labels = sparkline_labels - profitabilitate.roa.sparkline_data = historical_data['profitabilitate']['roa'] - profitabilitate.roa.sparkline_labels = sparkline_labels - profitabilitate.roe.sparkline_data = historical_data['profitabilitate']['roe'] - profitabilitate.roe.sparkline_labels = sparkline_labels - - # Actualizăm indicatorii de solvabilitate cu sparkline data - solvabilitate.activ_net_contabil.sparkline_data = historical_data['solvabilitate']['activ_net_contabil'] - solvabilitate.activ_net_contabil.sparkline_labels = sparkline_labels - solvabilitate.rata_anc_capital.sparkline_data = historical_data['solvabilitate']['rata_anc_capital'] - solvabilitate.rata_anc_capital.sparkline_labels = sparkline_labels - - # FIX: Sincronizare ultima valoare sparkline cu valoarea curentă calculată - # Aceasta rezolvă inconsistențele când cache-ul pentru indicatori curenți - # se reîmprospătează mai des decât cache-ul pentru istoric (sparklines) - def sync_last_sparkline_value(indicator_obj, attr_name): - """Înlocuiește ultima valoare din sparkline cu valoarea curentă calculată""" - indicator = getattr(indicator_obj, attr_name, None) - if indicator and hasattr(indicator, 'sparkline_data') and indicator.sparkline_data: - if hasattr(indicator, 'value') and indicator.value is not None: - indicator.sparkline_data[-1] = indicator.value - - # Sincronizăm toți indicatorii - for ind_obj, attrs in [ - (lichiditate, ['lichiditate_curenta', 'lichiditate_imediata', 'lichiditate_vedere']), - (eficienta, ['dso', 'dpo', 'cash_conversion_cycle', 'rata_incasare', 'rata_plata']), - (risc, ['creante_restante_pct', 'creante_90plus_pct', 'datorii_restante_pct', 'raport_datorii_trezorerie']), - (cash_flow, ['flux_net_lunar', 'cash_flow_ytd', 'flux_net_yoy_pct', 'acoperire_cash_flow']), - (dinamica, ['crestere_vanzari_yoy', 'crestere_achizitii_yoy', 'marja_implicita']), - (altman_zscore, ['zscore', 'x1', 'x2', 'x3', 'x4']), - (profitabilitate, ['cifra_afaceri', 'cheltuieli_totale', 'profit_brut', 'marja_profit_brut', 'roa', 'roe']), - (solvabilitate, ['activ_net_contabil', 'rata_anc_capital']), - ]: - for attr in attrs: - sync_last_sparkline_value(ind_obj, attr) - - # Construim răspunsul final - response = FinancialIndicatorsResponse( - lichiditate=lichiditate, - eficienta=eficienta, - risc=risc, - cash_flow=cash_flow, - dinamica=dinamica, - altman_zscore=altman_zscore, - profitabilitate=profitabilitate, - solvabilitate=solvabilitate - ) - - logger.info( - f"Indicators with sparklines for company {company_id}, luna={luna}, an={an}: " - f"Z-Score={altman_zscore.zscore.value} ({altman_zscore.zscore.status}), " - f"ROA={profitabilitate.roa.value}% ({profitabilitate.roa.status}), " - f"ANC={solvabilitate.activ_net_contabil.value} ({solvabilitate.activ_net_contabil.status})" - ) - - return response diff --git a/deploy-package-20260223-151231/backend/modules/reports/services/invoice_service.py b/deploy-package-20260223-151231/backend/modules/reports/services/invoice_service.py deleted file mode 100644 index 87afa61..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/services/invoice_service.py +++ /dev/null @@ -1,324 +0,0 @@ -""" -Service pentru logica facturi - Portează query-urile din aplicația Flask -""" -# import sys # Removed - no longer needed -import os - -from shared.database.oracle_pool import oracle_pool -from typing import List, Tuple, Optional -from ..models.invoice import Invoice, InvoiceFilter, InvoiceListResponse, InvoiceSummary -from ..cache.decorators import cached -from decimal import Decimal -import logging - -logger = logging.getLogger(__name__) - -class InvoiceService: - """Service pentru gestionarea facturilor""" - - @staticmethod - @cached(cache_type='schema', key_params=['company_id', 'server_id']) - async def _get_schema(company_id: int, server_id: Optional[str] = None) -> str: - """Obține schema pentru company_id (CACHED PERMANENT)""" - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - schema_query = """ - SELECT schema - FROM CONTAFIN_ORACLE.v_nom_firme - WHERE id_firma = :company_id - """ - cursor.execute(schema_query, {'company_id': company_id}) - schema_result = cursor.fetchone() - - if not schema_result: - raise ValueError(f"Schema not found for company {company_id}") - - return schema_result[0] - - @staticmethod - @cached(cache_type='invoices', key_params=['filter_params', 'username', 'server_id']) - async def get_invoices(filter_params: InvoiceFilter, username: str, server_id: Optional[str] = None) -> InvoiceListResponse: - """ - Obține lista de facturi - Query simplu pentru afișare în tabel (CACHED 10 min) - """ - company_id = int(filter_params.company) - schema = await InvoiceService._get_schema(company_id, server_id) - - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - - # Determină conturile în funcție de partner_type - if filter_params.partner_type == "CLIENTI": - conturi = "'4111', '461'" - elif filter_params.partner_type == "FURNIZORI": - conturi = "'401', '404', '462'" - else: - conturi = "'4111'" # default - - # Determine period to use: from params or MAX from calendar - if filter_params.luna and filter_params.an: - period_condition = "vp.an = :an AND vp.luna = :luna" - use_param_period = True - else: - period_condition = f"""vp.an = (SELECT anul FROM {schema}.calendar WHERE anul*12+luna = (SELECT MAX(anul*12+luna) FROM {schema}.calendar)) - AND vp.luna = (SELECT luna FROM {schema}.calendar WHERE anul*12+luna = (SELECT MAX(anul*12+luna) FROM {schema}.calendar))""" - use_param_period = False - - # Query cu calculele corecte pentru solduri - base_query = f""" - SELECT - vp.NUME, - vp.NRACT, - vp.DATAACT, - vp.DATASCAD, - vp.CONTRACT, - vp.COD_FISCAL, - vp.REG_COMERT, - CASE - WHEN vp.CONT IN ('4111','461') THEN vp.PRECDEB + vp.DEBIT -- Total facturat clienți - WHEN vp.CONT IN ('401','404','462') THEN vp.PRECCRED + vp.CREDIT -- Total facturat furnizori - END as total_facturat, - CASE - WHEN vp.CONT IN ('4111','461') THEN vp.PRECCRED + vp.CREDIT -- Încasat clienți - WHEN vp.CONT IN ('401','404','462') THEN vp.PRECDEB + vp.DEBIT -- Achitat furnizori - END as achitat, - CASE - WHEN vp.CONT IN ('4111','461') THEN - (vp.PRECDEB + vp.DEBIT) - (vp.PRECCRED + vp.CREDIT) -- Sold clienți - WHEN vp.CONT IN ('401','404','462') THEN - (vp.PRECCRED + vp.CREDIT) - (vp.PRECDEB + vp.DEBIT) -- Sold furnizori - END as sold, - vp.CONT, - NVL(vp.NUME_VAL, 'RON') as valuta, - CASE - WHEN vp.DATASCAD < SYSDATE THEN 'restant' - ELSE 'in_termen' - END as status - FROM {schema}.vireg_parteneri vp - WHERE {period_condition} - AND ( - (:partner_type = 'CLIENTI' AND vp.cont IN ('4111', '461')) - OR - (:partner_type = 'FURNIZORI' AND vp.cont IN ('401', '404', '462')) - ) - """ - - params = {'partner_type': filter_params.partner_type} - - # Add period params if using explicit period - if use_param_period: - params['an'] = filter_params.an - params['luna'] = filter_params.luna - - if filter_params.partner_name: - base_query += " AND UPPER(vp.nume) LIKE UPPER(:partner_name)" - params['partner_name'] = f"%{filter_params.partner_name}%" - - if filter_params.cont: - base_query += " AND vp.cont = :cont" - params['cont'] = filter_params.cont - - if filter_params.min_amount: - base_query += " AND total_facturat >= :min_amount" - params['min_amount'] = filter_params.min_amount - - if filter_params.max_amount: - base_query += " AND total_facturat <= :max_amount" - params['max_amount'] = filter_params.max_amount - - if filter_params.only_unpaid: - # Nu putem folosi aliasul "sold" în WHERE în Oracle, trebuie să repetăm calculul - base_query += """ AND ( - CASE - WHEN vp.CONT IN ('4111','461') THEN - (vp.PRECDEB + vp.DEBIT) - (vp.PRECCRED + vp.CREDIT) - WHEN vp.CONT IN ('401','404','462') THEN - (vp.PRECCRED + vp.CREDIT) - (vp.PRECDEB + vp.DEBIT) - END - ) > 0""" - - # Count total pentru paginare - count_query = f"SELECT COUNT(*) FROM ({base_query})" - cursor.execute(count_query, params) - total_count = cursor.fetchone()[0] - - # Query pentru TOTAL SOLD din TOATE facturile filtrate (nu doar pagina curentă) - total_sold_query = f""" - SELECT NVL(SUM(sold), 0) as total_sold - FROM ({base_query}) - """ - cursor.execute(total_sold_query, params) - total_sold_result = cursor.fetchone() - total_sold_all = Decimal(str(total_sold_result[0])) if total_sold_result else Decimal('0.00') - - # Get accounting period - use params if provided, else from calendar - if use_param_period: - accounting_period = { - 'an': filter_params.an, - 'luna': filter_params.luna - } - else: - period_query = f""" - SELECT anul, luna - FROM {schema}.calendar - WHERE anul*12+luna = (SELECT MAX(anul*12+luna) FROM {schema}.calendar) - """ - cursor.execute(period_query) - period_result = cursor.fetchone() - accounting_period = { - 'an': period_result[0] if period_result else None, - 'luna': period_result[1] if period_result else None - } - - # Adaugă ORDER BY și paginare - Ordonare cronologică (DATAACT, NRACT, NUME) - base_query += " ORDER BY vp.DATAACT ASC, vp.NRACT ASC, vp.NUME" - - # Paginare Oracle - offset = (filter_params.page - 1) * filter_params.page_size - limit = offset + filter_params.page_size - paginated_query = f""" - SELECT * FROM ( - SELECT ROWNUM as rn, t.* FROM ({base_query}) t WHERE ROWNUM <= :limit - ) WHERE rn > :offset - """ - params['offset'] = offset - params['limit'] = limit - - cursor.execute(paginated_query, params) - rows = cursor.fetchall() - - # Procesează rezultatele cu structura nouă - invoices = [] - total_amount = Decimal('0.00') - - for row in rows: - # Skip ROWNUM, extrage valorile din query-ul nou - nume = row[1] - nract = row[2] - dataact = row[3] - datascad = row[4] - contract = row[5] - cod_fiscal = row[6] - reg_comert = row[7] - total_facturat = Decimal(str(row[8] or 0)) - achitat = Decimal(str(row[9] or 0)) - sold = Decimal(str(row[10] or 0)) - cont = row[11] - valuta = row[12] or 'RON' - status = row[13] - - invoice_data = { - 'nume': nume or '', - 'nract': nract or 0, - 'dataact': dataact, - 'datascad': datascad, - 'contract': contract, - 'cod_fiscal': cod_fiscal, - 'reg_comert': reg_comert, - 'cont': cont, - 'totctva': total_facturat, - 'achitat': achitat, - 'soldfinal': sold, - 'valuta': valuta - } - - invoice = Invoice(**invoice_data) - invoices.append(invoice) - total_amount += total_facturat - - return InvoiceListResponse( - invoices=invoices, - total_count=total_count, - filtered_count=len(invoices), - total_amount=total_amount, - page=filter_params.page, - page_size=filter_params.page_size, - has_more=len(invoices) == filter_params.page_size, - accounting_period=accounting_period, - # Total sold din TOATE facturile filtrate - total_sold_all=total_sold_all - ) - - @staticmethod - async def get_invoice_details(company: str, invoice_number: str, username: str, server_id: Optional[str] = None) -> Invoice: - """ - Obține detaliile unei facturi specifice - """ - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Obține schema din v_nom_firme bazat pe id_firma - company_id = int(company) - schema_query = "SELECT schema FROM CONTAFIN_ORACLE.v_nom_firme WHERE id_firma = :company_id" - cursor.execute(schema_query, {'company_id': company_id}) - schema_result = cursor.fetchone() - - if not schema_result: - raise ValueError(f"Schema nu a fost găsită pentru id_firma {company_id}") - - schema = schema_result[0] - - # Query simplu pentru detalii factură - detail_query = f""" - SELECT - NUME, - NRACT, - DATAACT, - DATASCAD, - CONTRACT, - COD_FISCAL, - REG_COMERT, - PRECDEB, - PRECCRED, - DEBIT, - CREDIT, - CONT - FROM {schema}.vireg_parteneri - WHERE nract = :invoice_number - AND an = (select anul from {schema}.calendar where anul*12+luna = (select max(anul*12+luna) as anmax from {schema}.calendar)) - AND luna = (select luna from {schema}.calendar where anul*12+luna = (select max(anul*12+luna) as anmax from {schema}.calendar)) - """ - - cursor.execute(detail_query, {'invoice_number': invoice_number}) - row = cursor.fetchone() - - if not row: - raise ValueError(f"Factura {invoice_number} nu a fost găsită") - - # Extrage valorile - nume = row[0] - nract = row[1] - dataact = row[2] - datascad = row[3] - contract = row[4] - cod_fiscal = row[5] - reg_comert = row[6] - precdeb = Decimal(str(row[7] or 0)) - preccred = Decimal(str(row[8] or 0)) - debit = Decimal(str(row[9] or 0)) - credit = Decimal(str(row[10] or 0)) - cont = row[11] - - # Calculează valorile în funcție de tipul contului - if cont in ('4111', '461'): # CLIENTI - totctva = precdeb + debit - achitat = preccred + credit - soldfinal = precdeb - preccred + debit - credit - else: # FURNIZORI - totctva = preccred + credit - achitat = precdeb + debit - soldfinal = preccred - precdeb + credit - debit - - invoice_data = { - 'nume': nume or '', - 'nract': nract or 0, - 'dataact': dataact, - 'datascad': datascad, - 'contract': contract, - 'cod_fiscal': cod_fiscal, - 'reg_comert': reg_comert, - 'totctva': totctva, - 'achitat': achitat, - 'soldfinal': soldfinal - } - - return Invoice(**invoice_data) \ No newline at end of file diff --git a/deploy-package-20260223-151231/backend/modules/reports/services/treasury_service.py b/deploy-package-20260223-151231/backend/modules/reports/services/treasury_service.py deleted file mode 100644 index 1611f05..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/services/treasury_service.py +++ /dev/null @@ -1,410 +0,0 @@ -# import sys # Removed - no longer needed -import os -from typing import Optional, List, Tuple, Any - -import oracledb -from shared.database.oracle_pool import oracle_pool -from ..models.treasury import BankCashRegister, RegisterFilter, RegisterListResponse, AccountingPeriod -from ..cache.decorators import cached -from decimal import Decimal -import logging - -logger = logging.getLogger(__name__) - -class TreasuryService: - """Service pentru trezorerie - registru casă și bancă""" - - @staticmethod - @cached(cache_type='schema', key_params=['company_id', 'server_id']) - async def _get_schema(company_id: int, server_id: Optional[str] = None) -> str: - """Obține schema pentru company_id (CACHED PERMANENT)""" - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - schema_query = """ - SELECT schema - FROM CONTAFIN_ORACLE.v_nom_firme - WHERE id_firma = :company_id - """ - cursor.execute(schema_query, {'company_id': company_id}) - schema_result = cursor.fetchone() - - if not schema_result: - raise ValueError(f"Schema not found for company {company_id}") - - return schema_result[0] - - @staticmethod - def _get_view_query(schema: str, register_type: Optional[str] = None) -> str: - """ - Construiește query-ul pentru view-ul vbancasa corespunzător. - Dacă register_type este None, returnează UNION ALL pentru toate tipurile. - NU se filtrează pe incasari/plati > 0 - se afișează TOATE înregistrările! - """ - view_configs = { - 'BANCA_LEI': { - 'view': f'{schema}.vbancasa_5121_cum', - 'incasari_col': 'incasari', - 'plati_col': 'plati', - 'valuta': "'RON'", - 'tip': "'BANCA LEI'" - }, - 'BANCA_VALUTA': { - 'view': f'{schema}.vbancasa_5124_cum', - 'incasari_col': 'incasval', - 'plati_col': 'platival', - 'valuta': "COALESCE(numeval, 'EUR')", - 'tip': "'BANCA VALUTA'" - }, - 'CASA_LEI': { - 'view': f'{schema}.vbancasa_5311_cum', - 'incasari_col': 'incasari', - 'plati_col': 'plati', - 'valuta': "'RON'", - 'tip': "'CASA LEI'" - }, - 'CASA_VALUTA': { - 'view': f'{schema}.vbancasa_5314_cum', - 'incasari_col': 'incasval', - 'plati_col': 'platival', - 'valuta': "COALESCE(numeval, 'EUR')", - 'tip': "'CASA VALUTA'" - } - } - - def build_select(config): - # NU se filtrează - se afișează TOATE înregistrările - # SOLD CUMULAT: Running balance per bancasa using window function - # NULL-date rows (opening balance) come first due to NULLS FIRST - return f""" - SELECT - nume, nract, dataact, bancasa, - {config['incasari_col']} as incasari, - {config['plati_col']} as plati, - SUM({config['incasari_col']} - {config['plati_col']}) OVER ( - PARTITION BY bancasa - ORDER BY dataact ASC NULLS FIRST, nract ASC NULLS FIRST - ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW - ) as sold, - {config['valuta']} as valuta, - {config['tip']} as tip_registru, - explicatia - FROM {config['view']} - """ - - if register_type and register_type in view_configs: - return build_select(view_configs[register_type]) - else: - # UNION ALL pentru toate tipurile - queries = [build_select(cfg) for cfg in view_configs.values()] - return " UNION ALL ".join(queries) - - @staticmethod - @cached(cache_type='treasury', key_params=['filter_params', 'username', 'server_id']) - async def get_bank_cash_register(filter_params: RegisterFilter, username: str, server_id: Optional[str] = None) -> RegisterListResponse: - """ - Obține registrul de casă și bancă din vbancasa views (CACHED 10 min) - - IMPORTANT: PACK_SESIUNE.SETAN și SETLUNA trebuie executate în ACEEAȘI - tranzacție cu SELECT-ul din vbancasa* views! - - Folosim un bloc PL/SQL anonim care: - 1. Obține anul și luna curentă din calendar - 2. Apelează PACK_SESIUNE.SETAN și SETLUNA - 3. Execută SELECT-ul din vbancasa* - Toate în aceeași tranzacție! - """ - company_id = int(filter_params.company) - schema = await TreasuryService._get_schema(company_id, server_id) - - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - - # Construiește query-ul pentru tipul de registru selectat - base_select = TreasuryService._get_view_query(schema, filter_params.register_type) - - # Construiește WHERE conditions - where_conditions = [] - - # Date filter preserves NULL-date rows (opening balance) - # for correct cumulative sum calculation - if filter_params.date_from and filter_params.date_to: - where_conditions.append(f"(dataact IS NULL OR (dataact >= TO_DATE('{filter_params.date_from.strftime('%Y-%m-%d')}', 'YYYY-MM-DD') AND dataact <= TO_DATE('{filter_params.date_to.strftime('%Y-%m-%d')}', 'YYYY-MM-DD')))") - elif filter_params.date_from: - where_conditions.append(f"(dataact IS NULL OR dataact >= TO_DATE('{filter_params.date_from.strftime('%Y-%m-%d')}', 'YYYY-MM-DD'))") - elif filter_params.date_to: - where_conditions.append(f"(dataact IS NULL OR dataact <= TO_DATE('{filter_params.date_to.strftime('%Y-%m-%d')}', 'YYYY-MM-DD'))") - - if filter_params.partner_name: - # Escape single quotes pentru SQL - partner_escaped = filter_params.partner_name.replace("'", "''") - where_conditions.append(f"UPPER(nume) LIKE UPPER('%{partner_escaped}%')") - - if filter_params.bank_account: - # Escape single quotes pentru SQL - bank_escaped = filter_params.bank_account.replace("'", "''") - where_conditions.append(f"bancasa = '{bank_escaped}'") - - where_clause = "" - if where_conditions: - where_clause = " WHERE " + " AND ".join(where_conditions) - - # Paginare Oracle - offset = (filter_params.page - 1) * filter_params.page_size - limit_val = filter_params.page_size - - # Determine period to use: from params or MAX from calendar - if filter_params.luna and filter_params.an: - use_param_period = True - period_select = f""" - v_an := :param_an; - v_luna := :param_luna; - """ - else: - use_param_period = False - period_select = f""" - SELECT anul, luna INTO v_an, v_luna - FROM {schema}.calendar - WHERE anul*12+luna = (SELECT MAX(anul*12+luna) FROM {schema}.calendar); - """ - - # Bloc PL/SQL anonim care face totul într-o singură tranzacție: - # 1. Obține anul și luna din params sau calendar - # 2. Setează PACK_SESIUNE.SETAN și SETLUNA - # 3. Returnează datele prin REF CURSOR - # IMPORTANT: Folosim ROW_NUMBER() pentru paginare corectă cu ORDER BY NULLS FIRST - plsql_block = f""" - DECLARE - v_an NUMBER; - v_luna NUMBER; - v_cursor SYS_REFCURSOR; - BEGIN - -- Obține anul și luna din parametri sau calendar - {period_select} - - -- Setează contextul de sesiune (OBLIGATORIU înainte de SELECT din vbancasa*) - {schema}.PACK_SESIUNE.SETAN(v_an); - {schema}.PACK_SESIUNE.SETLUNA(v_luna); - - -- Return accounting period - :out_an := v_an; - :out_luna := v_luna; - - -- Returnează datele prin cursor cu ROW_NUMBER pentru paginare corectă - -- Pentru rânduri cu dataact=NULL (solduri precedente), sortare după bancasa - -- Pentru rânduri cu date, sortare după data, număr, bancasa - OPEN :result_cursor FOR - SELECT * FROM ( - SELECT t.*, ROW_NUMBER() OVER ( - ORDER BY dataact ASC NULLS FIRST, - CASE WHEN dataact IS NULL THEN bancasa END ASC, - nract ASC NULLS FIRST, - bancasa ASC - ) as rn - FROM ({base_select}) t{where_clause} - ) WHERE rn > {offset} AND rn <= {offset + limit_val}; - END; - """ - - # Creează cursor pentru rezultate (oracledb.CURSOR pentru REF CURSOR) - result_cursor = cursor.var(oracledb.CURSOR) - out_an = cursor.var(int) - out_luna = cursor.var(int) - - # Build params dict - exec_params = {'result_cursor': result_cursor, 'out_an': out_an, 'out_luna': out_luna} - if use_param_period: - exec_params['param_an'] = filter_params.an - exec_params['param_luna'] = filter_params.luna - - # Execută blocul PL/SQL cu REF CURSOR - cursor.execute(plsql_block, exec_params) - - # Get accounting period values - accounting_year = out_an.getvalue() - accounting_month = out_luna.getvalue() - - # Obține rezultatele din cursor - ref_cursor = result_cursor.getvalue() - rows = ref_cursor.fetchall() - ref_cursor.close() - - # Pentru count total, executăm alt bloc PL/SQL - count_plsql = f""" - DECLARE - v_an NUMBER; - v_luna NUMBER; - BEGIN - -- Obține anul și luna din parametri sau calendar - {period_select} - - {schema}.PACK_SESIUNE.SETAN(v_an); - {schema}.PACK_SESIUNE.SETLUNA(v_luna); - - SELECT COUNT(*) INTO :total_count FROM ({base_select}) sub{where_clause}; - END; - """ - - total_count_var = cursor.var(int) - count_params = {'total_count': total_count_var} - if use_param_period: - count_params['param_an'] = filter_params.an - count_params['param_luna'] = filter_params.luna - cursor.execute(count_plsql, count_params) - total_count = total_count_var.getvalue() - - # Query pentru TOTALURI din TOATE înregistrările filtrate (nu doar pagina curentă) - # sold_precedent = suma sold pentru rânduri cu dataact IS NULL - # total_incasari = suma incasari pentru rânduri cu dataact IS NOT NULL - # total_plati = suma plati pentru rânduri cu dataact IS NOT NULL - # Notă: where_clause poate fi gol sau poate conține "WHERE ..." - # Dacă e gol, adăugăm WHERE; dacă nu, adăugăm AND - dataact_null_cond = " AND dataact IS NULL" if where_clause else " WHERE dataact IS NULL" - dataact_not_null_cond = " AND dataact IS NOT NULL" if where_clause else " WHERE dataact IS NOT NULL" - - totals_plsql = f""" - DECLARE - v_an NUMBER; - v_luna NUMBER; - BEGIN - -- Obține anul și luna din parametri sau calendar - {period_select} - - {schema}.PACK_SESIUNE.SETAN(v_an); - {schema}.PACK_SESIUNE.SETLUNA(v_luna); - - -- Sold precedent: suma sold pentru rânduri fără dată (opening balance) - SELECT NVL(SUM(sold), 0) INTO :sold_precedent_all - FROM ({base_select}) sub{where_clause}{dataact_null_cond}; - - -- Total încasări: suma incasari pentru rânduri cu dată (transactions) - SELECT NVL(SUM(incasari), 0) INTO :total_incasari_all - FROM ({base_select}) sub{where_clause}{dataact_not_null_cond}; - - -- Total plăți: suma plati pentru rânduri cu dată (transactions) - SELECT NVL(SUM(plati), 0) INTO :total_plati_all - FROM ({base_select}) sub{where_clause}{dataact_not_null_cond}; - END; - """ - - sold_precedent_all_var = cursor.var(oracledb.NUMBER) - total_incasari_all_var = cursor.var(oracledb.NUMBER) - total_plati_all_var = cursor.var(oracledb.NUMBER) - - totals_params = { - 'sold_precedent_all': sold_precedent_all_var, - 'total_incasari_all': total_incasari_all_var, - 'total_plati_all': total_plati_all_var - } - if use_param_period: - totals_params['param_an'] = filter_params.an - totals_params['param_luna'] = filter_params.luna - - cursor.execute(totals_plsql, totals_params) - - sold_precedent_all = Decimal(str(sold_precedent_all_var.getvalue() or 0)) - total_incasari_all = Decimal(str(total_incasari_all_var.getvalue() or 0)) - total_plati_all = Decimal(str(total_plati_all_var.getvalue() or 0)) - sold_final_all = sold_precedent_all + total_incasari_all - total_plati_all - - # Procesare rezultate - registers = [] - total_incasari = Decimal('0.00') - total_plati = Decimal('0.00') - - for row in rows: - # Coloane: nume, nract, dataact, bancasa, incasari, plati, sold, valuta, tip_registru, explicatia, rn - # row[0-9] = date, row[10] = rn (ROW_NUMBER la final) - register_data = BankCashRegister( - nume=row[0] or '', - nract=row[1], - dataact=row[2], - nume_cont_bancar=row[3] or '', - incasari=Decimal(str(row[4] or 0)), - plati=Decimal(str(row[5] or 0)), - sold=Decimal(str(row[6] or 0)), - valuta=row[7], - tip_registru=row[8], - explicatia=row[9] or '' - ) - registers.append(register_data) - total_incasari += register_data.incasari - total_plati += register_data.plati - - logger.info(f"Treasury query for company {company_id}, type={filter_params.register_type}: {len(registers)} records, total={total_count}") - - return RegisterListResponse( - registers=registers, - total_count=total_count, - filtered_count=len(registers), - total_incasari=total_incasari, - total_plati=total_plati, - page=filter_params.page, - page_size=filter_params.page_size, - has_more=len(registers) == filter_params.page_size, - accounting_period=AccountingPeriod(an=accounting_year, luna=accounting_month), - # Totaluri din TOATE înregistrările filtrate - sold_precedent_all=sold_precedent_all, - total_incasari_all=total_incasari_all, - total_plati_all=total_plati_all, - sold_final_all=sold_final_all - ) - - @staticmethod - @cached(cache_type='treasury', key_params=['company_id', 'register_type', 'server_id']) - async def get_bank_cash_accounts(company_id: int, register_type: str, server_id: Optional[str] = None) -> List[str]: - """ - Obține lista distinctă de conturi bancă/casă (bancasa) pentru dropdown. - Cached pentru performanță. - IMPORTANT: Trebuie să setăm contextul PACK_SESIUNE înainte de a accesa vbancasa views! - """ - schema = await TreasuryService._get_schema(company_id, server_id) - - # Map register_type to view - view_map = { - 'BANCA_LEI': f'{schema}.vbancasa_5121_cum', - 'BANCA_VALUTA': f'{schema}.vbancasa_5124_cum', - 'CASA_LEI': f'{schema}.vbancasa_5311_cum', - 'CASA_VALUTA': f'{schema}.vbancasa_5314_cum' - } - - if register_type not in view_map: - return [] - - view_name = view_map[register_type] - - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # PL/SQL block to set session context and get accounts - plsql_block = f""" - DECLARE - v_an NUMBER; - v_luna NUMBER; - BEGIN - -- Get current year and month from calendar - SELECT anul, luna INTO v_an, v_luna - FROM {schema}.calendar - WHERE anul*12+luna = (SELECT MAX(anul*12+luna) FROM {schema}.calendar); - - -- Set session context (REQUIRED before accessing vbancasa* views) - {schema}.PACK_SESIUNE.SETAN(v_an); - {schema}.PACK_SESIUNE.SETLUNA(v_luna); - - -- Return accounts via cursor - OPEN :result_cursor FOR - SELECT DISTINCT bancasa - FROM {view_name} - WHERE bancasa IS NOT NULL - ORDER BY bancasa; - END; - """ - - result_cursor = cursor.var(oracledb.CURSOR) - cursor.execute(plsql_block, {'result_cursor': result_cursor}) - - ref_cursor = result_cursor.getvalue() - rows = ref_cursor.fetchall() - ref_cursor.close() - - accounts = [row[0] for row in rows if row[0]] - logger.info(f"Found {len(accounts)} bank/cash accounts for company {company_id}, type={register_type}") - return accounts diff --git a/deploy-package-20260223-151231/backend/modules/reports/services/trial_balance_service.py b/deploy-package-20260223-151231/backend/modules/reports/services/trial_balance_service.py deleted file mode 100644 index c8264ab..0000000 --- a/deploy-package-20260223-151231/backend/modules/reports/services/trial_balance_service.py +++ /dev/null @@ -1,219 +0,0 @@ -""" -Service pentru Trial Balance (Balanță de Verificare) - Query VBAL VIEW -Refactored to use caching system for optimal performance -""" -# import sys # Removed - no longer needed -import os -from typing import Dict, Any, Optional - -from shared.database.oracle_pool import oracle_pool -from ..models.trial_balance import ( - TrialBalanceItem, - TrialBalanceFilters, - TrialBalancePagination, - TrialBalanceResponse -) -from ..cache.decorators import cached -from decimal import Decimal -import math -import logging - -logger = logging.getLogger(__name__) - - -class TrialBalanceService: - """Service pentru gestionarea balanței de verificare cu cache""" - - @staticmethod - @cached(cache_type='schema', key_params=['company_id', 'server_id']) - async def _get_schema(company_id: int, server_id: Optional[str] = None) -> str: - """ - Obține schema pentru company_id (CACHED 24h) - - This is cached permanently because company schemas rarely change. - """ - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - schema_query = """ - SELECT schema - FROM CONTAFIN_ORACLE.v_nom_firme - WHERE id_firma = :company_id - """ - cursor.execute(schema_query, {'company_id': company_id}) - schema_result = cursor.fetchone() - - if not schema_result: - raise ValueError(f"Schema not found for company {company_id}") - - return schema_result[0] - - @staticmethod - @cached(cache_type='trial_balance', key_params=['company_id', 'luna', 'an', 'cont_filter', - 'denumire_filter', 'sort_by', 'sort_order', - 'page', 'page_size', 'username', 'server_id']) - async def get_trial_balance( - company_id: int, - luna: int, - an: int, - cont_filter: str | None, - denumire_filter: str | None, - sort_by: str, - sort_order: str, - page: int, - page_size: int, - username: str, - server_id: Optional[str] = None - ) -> Dict[str, Any]: - """ - Obține balanța de verificare sintetică (CACHED 10 min) - - Cache key includes all filter parameters to ensure unique cache entries - for different query variations. - - Args: - company_id: ID firmei - luna: Luna (1-12) - an: Anul - cont_filter: Filtru număr cont (optional) - denumire_filter: Filtru denumire cont (optional) - sort_by: Coloană pentru sortare - sort_order: Ordinea sortării (asc/desc) - page: Pagina - page_size: Mărimea paginii - username: Username pentru cache tracking - server_id: Optional Oracle server identifier for multi-server support - - Returns: - Dictionary cu items, pagination, filters_applied - """ - # Get schema (cached separately) - schema = await TrialBalanceService._get_schema(company_id, server_id) - - # Validate sort_order - if sort_order.lower() not in ['asc', 'desc']: - sort_order = 'asc' - - # Validate sort_by (prevent SQL injection) - valid_sort_columns = ['CONT', 'DENUMIRE', 'PRECDEB', 'PRECCRED', - 'RULDEB', 'RULCRED', 'SOLDDEB', 'SOLDCRED'] - if sort_by.upper() not in valid_sort_columns: - sort_by = 'CONT' - - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Build base query for VBAL VIEW - base_query = f""" - SELECT - CONT, - NVL(DENUMIRE, '') as DENUMIRE, - NVL(PRECDEB, 0) as PRECDEB, - NVL(PRECCRED, 0) as PRECCRED, - NVL(RULDEB, 0) as RULDEB, - NVL(RULCRED, 0) as RULCRED, - NVL(SOLDDEB, 0) as SOLDDEB, - NVL(SOLDCRED, 0) as SOLDCRED - FROM {schema}.VBAL - WHERE AN = :an - AND LUNA = :luna - """ - - params = { - 'an': an, - 'luna': luna - } - - # Add dynamic filters - if cont_filter: - base_query += " AND CONT LIKE :cont_filter" - params['cont_filter'] = f"{cont_filter}%" - - if denumire_filter: - base_query += " AND UPPER(DENUMIRE) LIKE UPPER(:denumire_filter)" - params['denumire_filter'] = f"%{denumire_filter}%" - - # Count total for pagination - count_query = f"SELECT COUNT(*) FROM ({base_query})" - cursor.execute(count_query, params) - total_count = cursor.fetchone()[0] - - # Query pentru TOTALURI din TOATE înregistrările filtrate (nu doar pagina curentă) - totals_query = f""" - SELECT - NVL(SUM(PRECDEB), 0) as total_prec_deb, - NVL(SUM(PRECCRED), 0) as total_prec_cred, - NVL(SUM(RULDEB), 0) as total_rul_deb, - NVL(SUM(RULCRED), 0) as total_rul_cred, - NVL(SUM(SOLDDEB), 0) as total_sold_deb, - NVL(SUM(SOLDCRED), 0) as total_sold_cred - FROM ({base_query}) - """ - cursor.execute(totals_query, params) - totals_row = cursor.fetchone() - - totals = { - "total_sold_precedent_debit": Decimal(str(totals_row[0])) if totals_row else Decimal('0.00'), - "total_sold_precedent_credit": Decimal(str(totals_row[1])) if totals_row else Decimal('0.00'), - "total_rulaj_lunar_debit": Decimal(str(totals_row[2])) if totals_row else Decimal('0.00'), - "total_rulaj_lunar_credit": Decimal(str(totals_row[3])) if totals_row else Decimal('0.00'), - "total_sold_final_debit": Decimal(str(totals_row[4])) if totals_row else Decimal('0.00'), - "total_sold_final_credit": Decimal(str(totals_row[5])) if totals_row else Decimal('0.00') - } - - # Add sorting - base_query += f" ORDER BY {sort_by.upper()} {sort_order.upper()}" - - # Pagination (Oracle ROWNUM with ORDER BY) - offset = (page - 1) * page_size - limit = offset + page_size - - paginated_query = f""" - SELECT * FROM ( - SELECT a.*, ROWNUM rnum FROM ( - {base_query} - ) a WHERE ROWNUM <= :limit - ) WHERE rnum > :offset - """ - params['offset'] = offset - params['limit'] = limit - - cursor.execute(paginated_query, params) - rows = cursor.fetchall() - - # Process results - # Index: CONT(0), DENUMIRE(1), PRECDEB(2), PRECCRED(3), - # RULDEB(4), RULCRED(5), SOLDDEB(6), SOLDCRED(7), rnum(8) - items = [] - for row in rows: - item = TrialBalanceItem( - cont=row[0] or '', - denumire=row[1] or '', - sold_precedent_debit=Decimal(str(row[2] or 0)), - sold_precedent_credit=Decimal(str(row[3] or 0)), - rulaj_lunar_debit=Decimal(str(row[4] or 0)), - rulaj_lunar_credit=Decimal(str(row[5] or 0)), - sold_final_debit=Decimal(str(row[6] or 0)), - sold_final_credit=Decimal(str(row[7] or 0)) - ) - items.append(item.dict()) - - # Calculate pagination - total_pages = math.ceil(total_count / page_size) if page_size > 0 else 0 - - # Build response - return { - "items": items, - "pagination": { - "total_items": total_count, - "total_pages": total_pages, - "current_page": page, - "page_size": page_size - }, - "filters_applied": { - "luna": luna, - "an": an, - "cont_filter": cont_filter, - "denumire_filter": denumire_filter - }, - # Totaluri din TOATE înregistrările filtrate (nu doar pagina curentă) - "totals": totals - } diff --git a/deploy-package-20260223-151231/backend/modules/telegram/__init__.py b/deploy-package-20260223-151231/backend/modules/telegram/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/modules/telegram/agent/__init__.py b/deploy-package-20260223-151231/backend/modules/telegram/agent/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/modules/telegram/agent/session.py b/deploy-package-20260223-151231/backend/modules/telegram/agent/session.py deleted file mode 100644 index 211faec..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/agent/session.py +++ /dev/null @@ -1,313 +0,0 @@ -""" -Session Management for Telegram Bot - -This module handles session state for Telegram users, specifically managing -the active company selection for command handlers. -""" - -import logging -import json -from typing import Dict, Any, Optional -from datetime import datetime - -from backend.modules.telegram.db.operations import ( - create_session, - get_user_active_session, - update_session_state, - delete_user_sessions -) - -logger = logging.getLogger(__name__) - - -class ConversationSession: - """ - Manages session state for a single user. - - Attributes: - telegram_user_id: Telegram user ID - session_id: UUID of the session - active_company_id: Selected company ID - active_company_name: Selected company name - active_company_cui: Selected company CUI - """ - - def __init__( - self, - telegram_user_id: int, - session_id: Optional[str] = None - ): - """ - Initialize a session. - - Args: - telegram_user_id: Telegram user ID - session_id: Existing session ID (if resuming), or None for new session - """ - self.telegram_user_id = telegram_user_id - self.session_id = session_id - self.created_at = datetime.now() - self.updated_at = datetime.now() - - # Active company for this session - self.active_company_id: Optional[int] = None - self.active_company_name: Optional[str] = None - self.active_company_cui: Optional[str] = None - - def set_active_company( - self, - company_id: int, - company_name: str, - company_cui: Optional[str] = None - ): - """ - Set the active company for this session. - - Args: - company_id: Company ID - company_name: Company name - company_cui: Company CUI (optional) - """ - self.active_company_id = company_id - self.active_company_name = company_name - self.active_company_cui = company_cui - self.updated_at = datetime.now() - logger.info( - f"Active company set for user {self.telegram_user_id}: " - f"{company_name} (ID: {company_id})" - ) - - def get_active_company(self) -> Optional[Dict[str, Any]]: - """ - Get the active company information. - - Returns: - Dict with company info (id, name, cui) or None if no company selected - """ - if self.active_company_id is not None: - return { - "id": self.active_company_id, - "name": self.active_company_name, - "cui": self.active_company_cui - } - return None - - def clear_active_company(self): - """ - Clear the active company selection. - """ - logger.info( - f"Clearing active company for user {self.telegram_user_id} " - f"(was: {self.active_company_name})" - ) - self.active_company_id = None - self.active_company_name = None - self.active_company_cui = None - self.updated_at = datetime.now() - - def to_dict(self) -> Dict[str, Any]: - """ - Serialize session to dictionary (for database storage). - - Returns: - Dict representation of session - """ - return { - "telegram_user_id": self.telegram_user_id, - "session_id": self.session_id, - "created_at": self.created_at.isoformat(), - "updated_at": self.updated_at.isoformat(), - "active_company_id": self.active_company_id, - "active_company_name": self.active_company_name, - "active_company_cui": self.active_company_cui - } - - @classmethod - def from_dict(cls, data: Dict[str, Any]) -> 'ConversationSession': - """ - Deserialize session from dictionary. - - Args: - data: Dict representation of session - - Returns: - ConversationSession instance - """ - session = cls( - telegram_user_id=data["telegram_user_id"], - session_id=data.get("session_id") - ) - - # Restore active company - session.active_company_id = data.get("active_company_id") - session.active_company_name = data.get("active_company_name") - session.active_company_cui = data.get("active_company_cui") - - if "created_at" in data: - session.created_at = datetime.fromisoformat(data["created_at"]) - if "updated_at" in data: - session.updated_at = datetime.fromisoformat(data["updated_at"]) - - return session - - -class SessionManager: - """ - Manages sessions for all users. - - Provides methods to create, retrieve, update, and delete sessions. - Sessions are stored both in memory (for quick access) and in database - (for persistence). - """ - - def __init__(self): - """ - Initialize the session manager. - """ - self._sessions: Dict[int, ConversationSession] = {} - logger.info("SessionManager initialized") - - async def get_or_create_session( - self, - telegram_user_id: int - ) -> ConversationSession: - """ - Get existing session for a user or create a new one. - - Args: - telegram_user_id: Telegram user ID - - Returns: - ConversationSession for the user - """ - # Check in-memory cache first - if telegram_user_id in self._sessions: - logger.debug(f"Found session in cache for user {telegram_user_id}") - return self._sessions[telegram_user_id] - - # Check database for existing session - session_data = await get_user_active_session(telegram_user_id) - - if session_data: - # Restore session from database - conversation_state_json = session_data.get('conversation_state') - - if conversation_state_json: - try: - session_dict = json.loads(conversation_state_json) - session = ConversationSession.from_dict(session_dict) - session.session_id = session_data['session_id'] - self._sessions[telegram_user_id] = session - logger.info(f"Restored session from database for user {telegram_user_id}") - return session - except json.JSONDecodeError as e: - logger.error(f"Failed to parse session state: {e}") - - # Create new session - session = ConversationSession(telegram_user_id) - - # Save to database - session_id = await create_session( - telegram_user_id=telegram_user_id, - conversation_state=json.dumps(session.to_dict()), - expires_in_hours=24 - ) - - session.session_id = session_id - self._sessions[telegram_user_id] = session - - logger.info(f"Created new session for user {telegram_user_id} (ID: {session_id})") - return session - - async def save_session(self, telegram_user_id: int) -> bool: - """ - Save session to database. - - Args: - telegram_user_id: Telegram user ID - - Returns: - bool: True if saved successfully - """ - session = self._sessions.get(telegram_user_id) - - if not session or not session.session_id: - logger.warning(f"No session to save for user {telegram_user_id}") - return False - - try: - conversation_state = json.dumps(session.to_dict()) - - success = await update_session_state( - session_id=session.session_id, - conversation_state=conversation_state - ) - - if success: - logger.debug(f"Saved session for user {telegram_user_id}") - else: - logger.warning(f"Failed to save session for user {telegram_user_id}") - - return success - - except Exception as e: - logger.error(f"Error saving session for user {telegram_user_id}: {e}") - return False - - async def delete_session(self, telegram_user_id: int) -> bool: - """ - Delete session completely (from memory and database). - - Args: - telegram_user_id: Telegram user ID - - Returns: - bool: True if deleted successfully - """ - # Remove from memory - if telegram_user_id in self._sessions: - del self._sessions[telegram_user_id] - - # Delete from database - success = await delete_user_sessions(telegram_user_id) - - if success: - logger.info(f"Deleted session for user {telegram_user_id}") - else: - logger.warning(f"Failed to delete session for user {telegram_user_id}") - - return success - - def get_active_sessions_count(self) -> int: - """ - Get count of active sessions in memory. - - Returns: - int: Number of active sessions - """ - return len(self._sessions) - - -# Singleton instance -_session_manager_instance: Optional[SessionManager] = None - - -def get_session_manager() -> SessionManager: - """ - Get or create the singleton SessionManager instance. - - Returns: - SessionManager: Singleton instance - """ - global _session_manager_instance - if _session_manager_instance is None: - _session_manager_instance = SessionManager() - return _session_manager_instance - - -# Export main classes and functions -__all__ = [ - 'ConversationSession', - 'SessionManager', - 'get_session_manager' -] diff --git a/deploy-package-20260223-151231/backend/modules/telegram/api/__init__.py b/deploy-package-20260223-151231/backend/modules/telegram/api/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/modules/telegram/api/client.py b/deploy-package-20260223-151231/backend/modules/telegram/api/client.py deleted file mode 100644 index 2602807..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/api/client.py +++ /dev/null @@ -1,969 +0,0 @@ -""" -API Client for ROA2WEB Backend Communication - -This module provides an async HTTP client for communicating with the FastAPI backend. -Handles authentication, requests, error handling, and response parsing. -""" - -import logging -import os -from typing import Optional, Dict, Any, List -from datetime import datetime - -import httpx -from httpx import AsyncClient, Response, HTTPError, ConnectError - -logger = logging.getLogger(__name__) - -# Backend configuration from environment -# Default to port 8000 (production) instead of 8001 (development) -BACKEND_URL = os.getenv("BACKEND_URL", "http://localhost:8000") -REQUEST_TIMEOUT = float(os.getenv("API_TIMEOUT", "30.0")) # 30 seconds default - - -class BackendAPIClient: - """ - Async HTTP client for ROA2WEB FastAPI backend. - - Provides methods for all API endpoints used by the Telegram bot: - - Dashboard data - - Invoices search and retrieval - - Treasury/payment data - - Report exports - - Company listings - - User authentication and token management - """ - - def __init__(self, base_url: str = BACKEND_URL): - """ - Initialize the API client. - - Args: - base_url: Base URL of the FastAPI backend - """ - self.base_url = base_url.rstrip('/') - self.client: Optional[AsyncClient] = None - logger.info(f"Backend API client initialized with base URL: {self.base_url}") - - async def __aenter__(self): - """Async context manager entry.""" - self.client = AsyncClient( - base_url=self.base_url, - timeout=REQUEST_TIMEOUT, - follow_redirects=True - ) - return self - - async def __aexit__(self, exc_type, exc_val, exc_tb): - """Async context manager exit.""" - if self.client: - await self.client.aclose() - - def _get_auth_headers(self, jwt_token: str) -> Dict[str, str]: - """ - Generate authentication headers with JWT token. - - Args: - jwt_token: JWT access token - - Returns: - Dict with Authorization header - """ - return { - "Authorization": f"Bearer {jwt_token}", - "Content-Type": "application/json" - } - - async def _handle_response(self, response: Response) -> Dict[str, Any]: - """ - Handle API response and extract data. - - Args: - response: HTTP response object - - Returns: - Dict: Response JSON data - - Raises: - HTTPError: If response status is not successful - """ - try: - response.raise_for_status() - return response.json() - except HTTPError as e: - logger.error(f"API request failed: {e}") - logger.error(f"Response body: {response.text}") - raise - except Exception as e: - logger.error(f"Failed to parse response: {e}") - raise - - # ========================================================================= - # AUTHENTICATION & USER ENDPOINTS - # ========================================================================= - - async def verify_user( - self, - oracle_username: str, - linking_code: str, - server_id: Optional[str] = None - ) -> Optional[Dict[str, Any]]: - """ - Verify user exists in Oracle and get JWT token. - Called during Telegram linking process (auto-linking flow). - - Args: - oracle_username: Oracle username extracted from linking code - linking_code: The 8-character linking code for validation - - Returns: - Dict with: - - success: True if verification succeeded - - access_token: JWT access token - - refresh_token: JWT refresh token - - user: Dict with user_id, username, companies, permissions - - message: Status message - - None if user not found or error - - Example: - result = await client.verify_user("JOHN.DOE", "ABC12345") - if result and result['success']: - jwt_token = result['access_token'] - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - # Flow A: Auto-linking (no password required) - response = await self.client.post( - "/api/telegram/auth/verify-user", - json={ - "linking_code": linking_code, - "oracle_username": oracle_username, - "server_id": server_id - } - ) - - return await self._handle_response(response) - - except ConnectError as e: - logger.error(f"Cannot connect to backend at {self.base_url}: {e}") - logger.error("Verify that backend service is running and BACKEND_URL is correct") - return None - except HTTPError as e: - if e.response.status_code == 404: - logger.warning(f"User {oracle_username} not found in Oracle") - return None - logger.error(f"Failed to verify user {oracle_username}: {e}") - return None - except Exception as e: - logger.error(f"Error verifying user: {e}") - return None - - async def refresh_token(self, refresh_token: str) -> Optional[str]: - """ - Refresh JWT token for a user. - - Args: - refresh_token: JWT refresh token - - Returns: - str: New JWT access token, None if failed - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - response = await self.client.post( - "/api/telegram/auth/refresh-token", - json={"refresh_token": refresh_token} - ) - - data = await self._handle_response(response) - return data.get('access_token') - - except Exception as e: - logger.error(f"Failed to refresh token: {e}") - return None - - async def verify_email(self, email: str, server_id: Optional[str] = None) -> dict: - """ - Verify if email exists in Oracle database - - Args: - email: Email address to verify - server_id: Optional Oracle server ID (for multi-server mode) - - Returns: - dict with 'success' (bool), 'username' (str or None), and 'message' (str) - - Raises: - httpx.HTTPError: On network or HTTP errors - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - response = await self.client.post( - "/api/telegram/auth/verify-email", - json={"email": email, "server_id": server_id} - ) - response.raise_for_status() - return response.json() - - except httpx.HTTPStatusError as e: - logger.error(f"HTTP error verifying email {email}: {e.response.status_code}") - return { - "success": False, - "username": None, - "message": "Eroare la verificarea email-ului" - } - except Exception as e: - logger.error(f"Failed to verify email {email}: {e}") - return { - "success": False, - "username": None, - "message": "Eroare la verificarea email-ului" - } - - async def login_with_email( - self, - email: str, - password: str, - telegram_user_id: int, - session_token: str, - server_id: Optional[str] = None - ) -> dict: - """ - Login via email + password with session token - - Args: - email: User email address - password: Oracle password - telegram_user_id: Telegram user ID - session_token: Signed token from code validation - server_id: Optional Oracle server ID (for multi-server mode) - - Returns: - Login response with JWT tokens and user data - - Raises: - httpx.HTTPError: On network or HTTP errors - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - response = await self.client.post( - "/api/telegram/auth/login-with-email", - json={ - "email": email, - "password": password, - "telegram_user_id": telegram_user_id, - "session_token": session_token, - "server_id": server_id - }, - timeout=30.0 # 30 seconds timeout - ) - - response.raise_for_status() - - data = response.json() - logger.info(f"Email login successful for user {telegram_user_id}") - - return data - - except httpx.HTTPStatusError as e: - logger.error(f"Email login HTTP error: {e.response.status_code} - {e.response.text}") - - # Parse error detail if available - try: - error_data = e.response.json() - return { - "success": False, - "message": error_data.get("detail", "Autentificare eșuată") - } - except: - return { - "success": False, - "message": "Autentificare eșuată" - } - - except httpx.TimeoutException: - logger.error("Email login timeout") - return { - "success": False, - "message": "Timeout. Te rugăm să încerci din nou." - } - - except Exception as e: - logger.error(f"Email login error: {e}", exc_info=True) - return { - "success": False, - "message": "Eroare de conexiune" - } - - async def switch_server( - self, - jwt_token: str, - oracle_username: str, - new_server_id: str, - oracle_password: str = None - ) -> dict: - """ - Switch the active Oracle server for the authenticated user. - - Args: - jwt_token: Current JWT access token (used for authentication) - oracle_username: Oracle username of the current user - new_server_id: Target Oracle server ID - oracle_password: Oracle password on the new server (required if servers have different passwords) - - Returns: - Dict with success, access_token, refresh_token, message - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - payload = {"oracle_username": oracle_username, "new_server_id": new_server_id} - if oracle_password: - payload["oracle_password"] = oracle_password - - response = await self.client.post( - "/api/telegram/auth/switch-server", - json=payload, - headers=self._get_auth_headers(jwt_token) - ) - response.raise_for_status() - return response.json() - - except httpx.HTTPStatusError as e: - logger.error(f"Switch server HTTP error: {e.response.status_code}") - try: - return {"success": False, "message": e.response.json().get("detail", "Eroare")} - except Exception: - return {"success": False, "message": "Eroare la schimbarea serverului"} - - except Exception as e: - logger.error(f"Switch server error: {e}") - return {"success": False, "message": "Eroare de conexiune"} - - async def get_user_companies(self, jwt_token: str) -> List[Dict[str, Any]]: - """ - Get list of companies the user has access to. - - Args: - jwt_token: JWT access token - - Returns: - List of company dicts with id, nume_firma, cui, etc. - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - response = await self.client.get( - "/api/companies", - headers=self._get_auth_headers(jwt_token) - ) - - data = await self._handle_response(response) - - # Backend returns {"companies": [...], "total_count": N} - if isinstance(data, dict) and "companies" in data: - return data["companies"] - - return data if isinstance(data, list) else [] - - except Exception as e: - logger.error(f"Failed to get companies: {e}") - return [] - - # ========================================================================= - # DASHBOARD ENDPOINTS - # ========================================================================= - - async def get_dashboard_data( - self, - company_id: int, - jwt_token: str - ) -> Optional[Dict[str, Any]]: - """ - Get dashboard statistics for a company. - - Args: - company_id: Company ID - jwt_token: JWT access token - - Returns: - Dict with dashboard data (sold_total, facturi, plati, etc.) - Includes _cache_hit and _response_time_ms metadata - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - # Add cache metadata header for Telegram Bot - headers = self._get_auth_headers(jwt_token) - headers['X-Include-Cache-Metadata'] = 'true' - - response = await self.client.get( - "/api/reports/dashboard/summary", - params={"company": str(company_id)}, - headers=headers - ) - - return await self._handle_response(response) - - except Exception as e: - logger.error(f"Failed to get dashboard data for company {company_id}: {e}") - return None - - async def get_treasury_breakdown( - self, - company_id: int, - jwt_token: str - ) -> Optional[Dict[str, Any]]: - """ - Get detailed treasury breakdown (casa + banca accounts). - - Args: - company_id: Company ID - jwt_token: JWT access token - - Returns: - Dict with treasury breakdown data (accounts by type) - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - # Add cache metadata header for Telegram Bot - headers = self._get_auth_headers(jwt_token) - headers['X-Include-Cache-Metadata'] = 'true' - - response = await self.client.get( - f"/api/reports/dashboard/treasury-breakdown?company={company_id}", - headers=headers - ) - - return await self._handle_response(response) - - except Exception as e: - logger.error(f"Failed to get treasury breakdown for company {company_id}: {e}") - return None - - async def get_detailed_data( - self, - company_id: int, - jwt_token: str, - data_type: str - ) -> Optional[Dict[str, Any]]: - """ - Get detailed data for clients or suppliers. - - Args: - company_id: Company ID - jwt_token: JWT access token - data_type: Type of data ('clients' or 'suppliers') - - Returns: - Dict with detailed data (list of clients/suppliers with balances) - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - # Add cache metadata header for Telegram Bot - headers = self._get_auth_headers(jwt_token) - headers['X-Include-Cache-Metadata'] = 'true' - - response = await self.client.get( - f"/api/reports/dashboard/detailed-data?company={company_id}&data_type={data_type}", - headers=headers - ) - - return await self._handle_response(response) - - except Exception as e: - logger.error(f"Failed to get detailed data ({data_type}) for company {company_id}: {e}") - return None - - async def get_maturity_data( - self, - company_id: int, - jwt_token: str, - period: str = "all" - ) -> Optional[Dict[str, Any]]: - """ - Get maturity data (in term/overdue breakdown). - - Args: - company_id: Company ID - jwt_token: JWT access token - period: Period filter ('all', '30', '60', '90') - - Returns: - Dict with maturity data (in_term, overdue, total) - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - # Add cache metadata header for Telegram Bot - headers = self._get_auth_headers(jwt_token) - headers['X-Include-Cache-Metadata'] = 'true' - - response = await self.client.get( - f"/api/reports/dashboard/maturity?company={company_id}&period={period}", - headers=headers - ) - - return await self._handle_response(response) - - except Exception as e: - logger.error(f"Failed to get maturity data for company {company_id}: {e}") - return None - - async def get_performance_data( - self, - company_id: int, - jwt_token: str - ) -> Optional[Dict[str, Any]]: - """ - Get performance data (incasari/plati totals). - - Args: - company_id: Company ID - jwt_token: JWT access token - - Returns: - Dict with performance data (incasari_total, plati_total, net) - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - # Add cache metadata header for Telegram Bot - headers = self._get_auth_headers(jwt_token) - headers['X-Include-Cache-Metadata'] = 'true' - - response = await self.client.get( - f"/api/reports/dashboard/performance?company={company_id}", - headers=headers - ) - - return await self._handle_response(response) - - except Exception as e: - logger.error(f"Failed to get performance data for company {company_id}: {e}") - return None - - async def get_monthly_flows( - self, - company_id: int, - jwt_token: str, - months: int = 12 - ) -> Optional[Dict[str, Any]]: - """ - Get monthly cash flows data. - - Args: - company_id: Company ID - jwt_token: JWT access token - months: Number of months to retrieve - - Returns: - Dict with monthly flows (months, incasari, plati arrays) - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - # Add cache metadata header for Telegram Bot - headers = self._get_auth_headers(jwt_token) - headers['X-Include-Cache-Metadata'] = 'true' - - response = await self.client.get( - f"/api/reports/dashboard/monthly-flows?company={company_id}&months={months}", - headers=headers - ) - - return await self._handle_response(response) - - except Exception as e: - logger.error(f"Failed to get monthly flows for company {company_id}: {e}") - return None - - async def get_trends( - self, - company_id: int, - jwt_token: str, - period: str = "12m" - ) -> Optional[Dict[str, Any]]: - """ - Get trends data (12-month historical data for collections/payments). - - Args: - company_id: Company ID - jwt_token: JWT access token - period: Period for trends (e.g., "12m", "6m", "ytd") - - Returns: - Dict with trends data including periods, clienti_incasat, furnizori_achitat arrays - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - # Add cache metadata header for Telegram Bot - headers = self._get_auth_headers(jwt_token) - headers['X-Include-Cache-Metadata'] = 'true' - - response = await self.client.get( - f"/api/reports/dashboard/trends?company={company_id}&period={period}", - headers=headers - ) - - return await self._handle_response(response) - - except Exception as e: - logger.error(f"Failed to get trends for company {company_id}: {e}") - return None - - # ========================================================================= - # INVOICES ENDPOINTS - # ========================================================================= - - async def search_invoices( - self, - company_id: int, - jwt_token: str, - filters: Optional[Dict[str, Any]] = None - ) -> List[Dict[str, Any]]: - """ - Search invoices with optional filters. - - Args: - company_id: Company ID - jwt_token: JWT access token - filters: Optional filters dict: - - date_from: str (YYYY-MM-DD) - - date_to: str (YYYY-MM-DD) - - status: str (paid, unpaid, overdue) - - client_name: str - - partner_type: str (CLIENTI, FURNIZORI) - - partner_name: str - - series: str - - number: str - - Returns: - List of invoice dicts - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - params = {"company": company_id} - if filters: - params.update(filters) - - response = await self.client.get( - "/api/reports/invoices/", - params=params, - headers=self._get_auth_headers(jwt_token) - ) - - data = await self._handle_response(response) - - if isinstance(data, dict) and 'invoices' in data: - invoice_list = data['invoices'] - return invoice_list - elif isinstance(data, list): - return data - else: - logger.warning(f"📥 Unexpected response format: {type(data)}") - return [] - - except Exception as e: - logger.error(f"Failed to search invoices for company {company_id}: {e}") - return [] - - async def get_invoice_summary( - self, - company_id: int, - jwt_token: str, - partner_type: str = "CLIENTI" - ) -> Optional[Dict[str, Any]]: - """ - Get invoice summary statistics. - - Args: - company_id: Company ID - jwt_token: JWT access token - - Returns: - Dict with summary (total_count, total_amount, paid, unpaid, etc.) - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - response = await self.client.get( - "/api/reports/invoices/summary", - params={ - "company": str(company_id), - "partner_type": partner_type - }, - headers=self._get_auth_headers(jwt_token) - ) - - return await self._handle_response(response) - - except Exception as e: - logger.error(f"Failed to get invoice summary for company {company_id}: {e}") - return None - - # ========================================================================= - # TREASURY ENDPOINTS - # ========================================================================= - - async def get_treasury_data( - self, - company_id: int, - jwt_token: str - ) -> Optional[Dict[str, Any]]: - """ - Get treasury/cash flow data for a company. - - Args: - company_id: Company ID - jwt_token: JWT access token - - Returns: - Dict with treasury data (cash_balance, incoming, outgoing, etc.) - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - response = await self.client.get( - "/api/reports/treasury/bank-cash-register", - params={ - "company": str(company_id), - "page": 1, - "page_size": 1000 - }, - headers=self._get_auth_headers(jwt_token) - ) - - return await self._handle_response(response) - - except Exception as e: - logger.error(f"Failed to get treasury data for company {company_id}: {e}") - return None - - # ========================================================================= - # EXPORT ENDPOINTS - # ========================================================================= - - async def export_report( - self, - jwt_token: str, - report_type: str, - company_id: int, - format: str = "xlsx", - filters: Optional[Dict[str, Any]] = None - ) -> Optional[bytes]: - """ - Generate and export a report. - - Args: - jwt_token: JWT access token - report_type: Type of report ('dashboard', 'invoices', 'treasury') - company_id: Company ID - format: Export format ('xlsx', 'csv', 'pdf') - filters: Optional filters for data - - Returns: - bytes: File content, None if failed - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - request_data = { - "type": report_type, - "company_id": company_id, - "format": format, - "filters": filters or {} - } - - response = await self.client.post( - "/api/telegram/export", - json=request_data, - headers=self._get_auth_headers(jwt_token) - ) - - response.raise_for_status() - return response.content - - except Exception as e: - logger.error(f"Failed to export report: {e}") - return None - - # ========================================================================= - # CACHE MANAGEMENT - # ========================================================================= - - async def invalidate_cache( - self, - jwt_token: str, - company_id: Optional[int] = None, - cache_type: Optional[str] = None - ) -> bool: - """ - Invalidate cache entries. - - Args: - jwt_token: JWT access token - company_id: Optional company ID (None = all companies) - cache_type: Optional cache type (None = all types) - - Returns: - bool: True if successful - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - request_data = {} - if company_id is not None: - request_data['company_id'] = company_id - if cache_type is not None: - request_data['cache_type'] = cache_type - - response = await self.client.post( - "/api/reports/cache/invalidate", - json=request_data, - headers=self._get_auth_headers(jwt_token) - ) - - response.raise_for_status() - logger.info(f"Cache invalidated: company_id={company_id}, cache_type={cache_type}") - return True - - except Exception as e: - logger.error(f"Failed to invalidate cache: {e}") - return False - - async def toggle_user_cache( - self, - jwt_token: str, - enabled: bool - ) -> bool: - """ - Toggle cache for current user. - - Args: - jwt_token: JWT access token - enabled: True to enable cache, False to disable - - Returns: - bool: True if successful - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - response = await self.client.post( - "/api/reports/cache/toggle-user", - json={"enabled": enabled}, - headers=self._get_auth_headers(jwt_token) - ) - - response.raise_for_status() - logger.info(f"User cache toggled: enabled={enabled}") - return True - - except Exception as e: - logger.error(f"Failed to toggle user cache: {e}") - return False - - async def get_cache_stats( - self, - jwt_token: str - ) -> Optional[Dict[str, Any]]: - """ - Get cache statistics including user-specific settings. - - Args: - jwt_token: JWT access token - - Returns: - Dict with cache stats including 'user_enabled' field - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - response = await self.client.get( - "/api/reports/cache/stats", - headers=self._get_auth_headers(jwt_token) - ) - - response.raise_for_status() - return response.json() - - except Exception as e: - logger.error(f"Failed to get cache stats: {e}") - return None - - # ========================================================================= - # HEALTH CHECK - # ========================================================================= - - async def health_check(self) -> bool: - """ - Check if backend is healthy and reachable. - - Returns: - bool: True if backend is healthy - """ - try: - if not self.client or self.client.is_closed: - self.client = AsyncClient(base_url=self.base_url, timeout=REQUEST_TIMEOUT) - - response = await self.client.get("/api/telegram/health") - return response.status_code == 200 - - except Exception as e: - logger.error(f"Backend health check failed: {e}") - return False - - -# Singleton instance for global use -_backend_client_instance: Optional[BackendAPIClient] = None - - -def get_backend_client() -> BackendAPIClient: - """ - Get or create the singleton BackendAPIClient instance. - - Returns: - BackendAPIClient: Singleton instance - """ - global _backend_client_instance - if _backend_client_instance is None: - _backend_client_instance = BackendAPIClient() - return _backend_client_instance - - -# Export main classes and functions -__all__ = [ - 'BackendAPIClient', - 'get_backend_client', - 'BACKEND_URL' -] diff --git a/deploy-package-20260223-151231/backend/modules/telegram/auth/__init__.py b/deploy-package-20260223-151231/backend/modules/telegram/auth/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/modules/telegram/auth/email_auth.py b/deploy-package-20260223-151231/backend/modules/telegram/auth/email_auth.py deleted file mode 100644 index 892ad13..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/auth/email_auth.py +++ /dev/null @@ -1,172 +0,0 @@ -""" -Email authentication logic with crypto-secure code generation -""" -import secrets -import re -import logging -from datetime import datetime, timedelta -from typing import Optional, Dict -from collections import defaultdict - -logger = logging.getLogger(__name__) - -# ============================================================================ -# RATE LIMITING (In-Memory) -# ============================================================================ -# NOTE: For production with multiple bot instances, migrate to Redis -# See "Optional Future Enhancements" section in plan - -_rate_limit_store: Dict[str, list] = defaultdict(list) - - -async def check_rate_limit( - identifier: str, - max_attempts: int = 3, - window_minutes: int = 60 -) -> bool: - """ - Check if identifier is within rate limit - - Args: - identifier: Email or telegram_user_id (as string) - max_attempts: Maximum attempts allowed - window_minutes: Time window in minutes - - Returns: - True if within limit (can proceed), False if exceeded - - NOTE: In-memory implementation - resets on bot restart - """ - now = datetime.now() - cutoff = now - timedelta(minutes=window_minutes) - - # Clean old attempts - _rate_limit_store[identifier] = [ - attempt for attempt in _rate_limit_store[identifier] - if attempt > cutoff - ] - - # Check limit - if len(_rate_limit_store[identifier]) >= max_attempts: - logger.warning(f"Rate limit exceeded for {identifier}") - return False - - # Add new attempt - _rate_limit_store[identifier].append(now) - return True - - -def clear_rate_limit(identifier: str) -> None: - """Clear rate limit for identifier (e.g., after successful auth)""" - if identifier in _rate_limit_store: - del _rate_limit_store[identifier] - logger.debug(f"Rate limit cleared for {identifier}") - - -# ============================================================================ -# CODE GENERATION (Crypto-Secure) -# ============================================================================ - -def generate_email_code() -> str: - """ - Generate crypto-secure 6-digit code - - Uses secrets module (not random) for cryptographic security - - Returns: - 6-digit string (000000 - 999999) - """ - # Generate 6-digit code using secrets (crypto-secure) - code = ''.join(secrets.choice('0123456789') for _ in range(6)) - - logger.debug(f"Generated email auth code (length: {len(code)})") - return code - - -# ============================================================================ -# EMAIL VALIDATION -# ============================================================================ - -def is_valid_email_format(email: str) -> bool: - """ - Validate email format (basic regex) - - Args: - email: Email address to validate - - Returns: - True if format is valid - """ - pattern = r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$' - return bool(re.match(pattern, email)) - - -async def verify_email_in_oracle(email: str, server_id: Optional[str] = None) -> Optional[str]: - """ - Verify email exists in Oracle UTILIZATORI table via backend API - - Args: - email: Email address to check - server_id: Optional Oracle server ID (for multi-server mode) - - Returns: - Oracle username if found and active, None otherwise - - NOTE: Uses backend API endpoint /api/telegram/auth/verify-email - """ - try: - from backend.modules.telegram.api.client import get_backend_client - - backend_client = get_backend_client() - - # Call backend API to verify email (on specific server if provided) - response = await backend_client.verify_email(email, server_id=server_id) - - if response.get('success'): - username = response.get('username') - logger.info(f"Email verified via backend: {email} -> {username}") - return username - else: - logger.warning(f"Email not found or inactive: {email}") - return None - - except Exception as e: - logger.error(f"Error verifying email via backend: {e}", exc_info=True) - return None - - -# ============================================================================ -# SESSION TOKEN GENERATION (Prevent User ID Spoofing) -# ============================================================================ - -def generate_session_token(telegram_user_id: int, email: str) -> str: - """ - Generate signed session token for backend verification - - This prevents user ID spoofing attacks where malicious clients - could impersonate Telegram users by sending arbitrary user IDs - - Args: - telegram_user_id: Telegram user ID - email: Verified email address - - Returns: - Signed token (simple implementation - upgrade to JWT in future) - - NOTE: For production, use proper JWT signing with shared secret - """ - import hashlib - import os - - # Get secret from env (should match backend) - secret = os.getenv("AUTH_SESSION_SECRET", "change-me-in-production") - - # Create signature: HMAC-like hash - payload = f"{telegram_user_id}:{email}:{secret}" - signature = hashlib.sha256(payload.encode()).hexdigest()[:16] - - # Token format: user_id:email:signature - token = f"{telegram_user_id}:{email}:{signature}" - - logger.debug(f"Generated session token for user {telegram_user_id}") - return token diff --git a/deploy-package-20260223-151231/backend/modules/telegram/auth/linking.py b/deploy-package-20260223-151231/backend/modules/telegram/auth/linking.py deleted file mode 100644 index 8295b17..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/auth/linking.py +++ /dev/null @@ -1,352 +0,0 @@ -""" -Authentication and User Linking Logic - -This module handles the linking process between Telegram users and Oracle ERP accounts. -It manages authentication codes, verifies users through the backend API, and maintains -user sessions with JWT tokens. -""" - -import logging -from typing import Optional, Dict, Any -from datetime import datetime, timedelta - -from telegram import User as TelegramUser - -from backend.modules.telegram.db.operations import ( - get_user, - create_or_update_user, - link_user_to_oracle, - update_user_tokens, - verify_and_use_auth_code, - is_user_linked -) -from backend.modules.telegram.api.client import get_backend_client - -logger = logging.getLogger(__name__) - - -async def link_telegram_account( - telegram_user: TelegramUser, - auth_code: str -) -> Optional[Dict[str, Any]]: - """ - Link a Telegram account to an Oracle ERP account using an authentication code. - - Flow: - 1. Verify auth code in database (check exists, not used, not expired) - 2. Extract oracle_username from code - 3. Call backend API to verify user in Oracle and get JWT token - 4. Create/update Telegram user record - 5. Link user to Oracle account with JWT tokens - 6. Return success with user data - - Args: - telegram_user: Telegram User object from python-telegram-bot - auth_code: 8-character authentication code from web frontend - - Returns: - Dict with: - - success: True if linking succeeded - - username: Oracle username - - jwt_token: JWT access token - - companies: List of companies user has access to - OR None if linking failed - - Example: - result = await link_telegram_account(telegram_user, "ABC12345") - if result: - print(f"Linked to {result['username']}") - else: - print("Linking failed") - """ - try: - telegram_user_id = telegram_user.id - telegram_username = telegram_user.username - first_name = telegram_user.first_name - last_name = telegram_user.last_name - - logger.info( - f"Attempting to link Telegram user {telegram_user_id} " - f"(@{telegram_username}) with code {auth_code}" - ) - - # Step 1: Verify auth code - code_data = await verify_and_use_auth_code(auth_code) - - if not code_data: - logger.warning(f"Invalid, expired, or already used auth code: {auth_code}") - return None - - oracle_username = code_data.get('oracle_username') - server_id = code_data.get('server_id') # Extract server_id from the stored code - logger.info(f"Auth code valid for Oracle user: {oracle_username} (server_id={server_id})") - - # Step 2: Create/update Telegram user record (basic info) - user_created = await create_or_update_user( - telegram_user_id=telegram_user_id, - username=telegram_username, - first_name=first_name, - last_name=last_name - ) - - if not user_created: - logger.error(f"Failed to create/update Telegram user {telegram_user_id}") - return None - - # Step 3: Verify user in Oracle and get JWT token via backend API (auto-linking flow) - backend_client = get_backend_client() - async with backend_client: - user_data = await backend_client.verify_user( - oracle_username=oracle_username, - linking_code=auth_code, - server_id=server_id - ) - - if not user_data or not user_data.get('success'): - logger.error(f"Failed to verify Oracle user {oracle_username} via backend") - return None - - # Extract tokens and user info from response - jwt_token = user_data.get('access_token') - jwt_refresh_token = user_data.get('refresh_token', jwt_token) - user_info = user_data.get('user', {}) - companies = user_info.get('companies', []) - permissions = user_info.get('permissions', []) - - # Token expiration (typically 30 minutes for access token) - token_expires_at = datetime.now() + timedelta(minutes=30) - - # Step 4: Link Telegram user to Oracle account - linked = await link_user_to_oracle( - telegram_user_id=telegram_user_id, - oracle_username=oracle_username, - jwt_token=jwt_token, - jwt_refresh_token=jwt_refresh_token, - token_expires_at=token_expires_at - ) - - if not linked: - logger.error(f"Failed to link user {telegram_user_id} to Oracle account") - return None - - logger.info( - f"Successfully linked Telegram user {telegram_user_id} " - f"to Oracle user {oracle_username}" - ) - - return { - "success": True, - "telegram_user_id": telegram_user_id, - "username": oracle_username, - "jwt_token": jwt_token, - "jwt_refresh_token": jwt_refresh_token, - "companies": companies, - "permissions": permissions, - "linked_at": datetime.now().isoformat() - } - - except Exception as e: - logger.error(f"Error linking Telegram account: {e}", exc_info=True) - return None - - -async def get_user_auth_data(telegram_user_id: int) -> Optional[Dict[str, Any]]: - """ - Get authentication data for a linked Telegram user. - - This function retrieves the user's Oracle account information and JWT tokens. - If the token is expired, it automatically refreshes it. - - Args: - telegram_user_id: Telegram user ID - - Returns: - Dict with: - - telegram_user_id: Telegram user ID - - username: Oracle username - - jwt_token: Valid JWT access token (refreshed if needed) - - jwt_refresh_token: JWT refresh token - - companies: List of companies (fetched if not cached) - OR None if user is not linked or error occurred - - Example: - auth_data = await get_user_auth_data(12345) - if auth_data: - jwt = auth_data['jwt_token'] - # Use JWT for API calls - """ - try: - # Get user from database - user_data = await get_user(telegram_user_id) - - if not user_data: - logger.warning(f"User {telegram_user_id} not found in database") - return None - - if not user_data.get('oracle_username'): - logger.warning(f"User {telegram_user_id} is not linked to Oracle account") - return None - - oracle_username = user_data['oracle_username'] - jwt_token = user_data['jwt_token'] - jwt_refresh_token = user_data['jwt_refresh_token'] - token_expires_at_str = user_data['token_expires_at'] - - # Parse token expiration - token_expires_at = datetime.fromisoformat(token_expires_at_str) if token_expires_at_str else None - - # Check if token is expired or about to expire (< 5 minutes remaining) - token_expired = ( - token_expires_at is None or - datetime.now() >= token_expires_at - timedelta(minutes=5) - ) - - if token_expired: - logger.info(f"Token expired for user {telegram_user_id}, refreshing...") - - # Refresh token via backend API - backend_client = get_backend_client() - async with backend_client: - new_token = await backend_client.refresh_token(jwt_refresh_token) - - if new_token: - # Update token in database - new_expires_at = datetime.now() + timedelta(minutes=30) - await update_user_tokens( - telegram_user_id=telegram_user_id, - jwt_token=new_token, - jwt_refresh_token=jwt_refresh_token, # Keep same refresh token - token_expires_at=new_expires_at - ) - - jwt_token = new_token - logger.info(f"Token refreshed for user {telegram_user_id}") - else: - logger.error(f"Failed to refresh token for user {telegram_user_id}") - return None - - # Fetch user companies (fresh from backend) - backend_client = get_backend_client() - async with backend_client: - companies = await backend_client.get_user_companies(jwt_token) - - return { - "telegram_user_id": telegram_user_id, - "username": oracle_username, - "jwt_token": jwt_token, - "jwt_refresh_token": jwt_refresh_token, - "companies": companies - } - - except Exception as e: - logger.error(f"Error getting user auth data: {e}", exc_info=True) - return None - - -async def check_user_linked(telegram_user_id: int) -> bool: - """ - Check if a Telegram user is linked to an Oracle account. - - Args: - telegram_user_id: Telegram user ID - - Returns: - bool: True if user is linked, False otherwise - - Example: - if await check_user_linked(12345): - print("User is linked") - else: - print("User needs to link account") - """ - try: - return await is_user_linked(telegram_user_id) - except Exception as e: - logger.error(f"Error checking if user is linked: {e}") - return False - - -async def get_user_companies(telegram_user_id: int) -> Optional[list]: - """ - Get list of companies a user has access to. - - This is a convenience function that fetches user auth data and returns - just the companies list. - - Args: - telegram_user_id: Telegram user ID - - Returns: - List of company dicts, or None if user not linked - - Example: - companies = await get_user_companies(12345) - if companies: - for company in companies: - print(f"{company['id']}: {company['nume_firma']}") - """ - try: - auth_data = await get_user_auth_data(telegram_user_id) - - if auth_data: - return auth_data.get('companies', []) - - return None - - except Exception as e: - logger.error(f"Error getting user companies: {e}") - return None - - -async def unlink_user(telegram_user_id: int) -> bool: - """ - Unlink a Telegram user from their Oracle account. - - This removes the linking but keeps the Telegram user record. - Used for account disconnection or security purposes. - - Args: - telegram_user_id: Telegram user ID - - Returns: - bool: True if successfully unlinked - - Example: - if await unlink_user(12345): - print("Account unlinked") - """ - try: - # Set Oracle username and tokens to NULL - from backend.modules.telegram.db.database import DB_PATH - import aiosqlite - - async with aiosqlite.connect(DB_PATH) as db: - db.row_factory = aiosqlite.Row - await db.execute(""" - UPDATE telegram_users - SET oracle_username = NULL, - jwt_token = NULL, - jwt_refresh_token = NULL, - token_expires_at = NULL, - linked_at = NULL - WHERE telegram_user_id = ? - """, (telegram_user_id,)) - - await db.commit() - - logger.info(f"User {telegram_user_id} unlinked from Oracle account") - return True - - except Exception as e: - logger.error(f"Error unlinking user {telegram_user_id}: {e}") - return False - - -# Export main functions -__all__ = [ - 'link_telegram_account', - 'get_user_auth_data', - 'check_user_linked', - 'get_user_companies', - 'unlink_user' -] diff --git a/deploy-package-20260223-151231/backend/modules/telegram/bot/__init__.py b/deploy-package-20260223-151231/backend/modules/telegram/bot/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/modules/telegram/bot/email_handlers.py b/deploy-package-20260223-151231/backend/modules/telegram/bot/email_handlers.py deleted file mode 100644 index 8d799a1..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/bot/email_handlers.py +++ /dev/null @@ -1,856 +0,0 @@ -""" -Telegram bot handlers for email-based authentication flow -""" -from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup -from telegram.ext import ( - ContextTypes, - ConversationHandler, - CommandHandler, - MessageHandler, - CallbackQueryHandler, - filters -) -import logging -from datetime import datetime -import asyncio - -from typing import Optional - -from backend.modules.telegram.auth.email_auth import ( - is_valid_email_format, - verify_email_in_oracle, - generate_email_code, - generate_session_token, - check_rate_limit, - clear_rate_limit -) -from shared.auth.email_server_cache import email_server_cache -from backend.modules.telegram.utils.email_service import get_email_service -from backend.modules.telegram.db.operations import ( - create_email_auth_code, - get_email_auth_code, - get_pending_email_code, - mark_email_code_used, - increment_failed_attempts, - delete_user_email_codes, - is_user_authenticated, - link_user_to_oracle, - create_or_update_user -) -from backend.modules.telegram.api.client import get_backend_client - -logger = logging.getLogger(__name__) - -# Conversation states -AWAITING_EMAIL, AWAITING_CODE, AWAITING_PASSWORD, AWAITING_SERVER_SELECTION = range(4) - -# Constants -MAX_CODE_ATTEMPTS = 3 - - -# ============================================================================ -# HELPER FUNCTIONS -# ============================================================================ - -async def edit_login_message( - context: ContextTypes.DEFAULT_TYPE, - chat_id: int, - text: str, - reply_markup=None, - parse_mode="Markdown" -): - """ - Helper function to edit the login message stored in context. - If message_id is not stored, creates a new message instead. - """ - message_id = context.user_data.get('login_message_id') - - if message_id: - try: - await context.bot.edit_message_text( - chat_id=chat_id, - message_id=message_id, - text=text, - reply_markup=reply_markup, - parse_mode=parse_mode - ) - except Exception as e: - logger.warning(f"Could not edit message {message_id}: {e}") - # Fallback: send new message and update ID - msg = await context.bot.send_message( - chat_id=chat_id, - text=text, - reply_markup=reply_markup, - parse_mode=parse_mode - ) - context.user_data['login_message_id'] = msg.message_id - else: - # No message ID stored - create new message - msg = await context.bot.send_message( - chat_id=chat_id, - text=text, - reply_markup=reply_markup, - parse_mode=parse_mode - ) - context.user_data['login_message_id'] = msg.message_id - - -async def delete_login_message(context: ContextTypes.DEFAULT_TYPE, chat_id: int): - """Delete the login message and clear the message_id from context""" - message_id = context.user_data.get('login_message_id') - - if message_id: - try: - await context.bot.delete_message(chat_id=chat_id, message_id=message_id) - except Exception as e: - logger.warning(f"Could not delete message {message_id}: {e}") - - # Clear from context - context.user_data.pop('login_message_id', None) - - -# ============================================================================ -# ENTRY POINTS: /login command and action:login button -# ============================================================================ - -async def login_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handler pentru /login command - Oferă opțiuni de autentificare: Email sau Web App - """ - user = update.effective_user - - # Check dacă e deja autentificat - if await is_user_authenticated(user.id): - await update.message.reply_text( - "Ești deja autentificat.\n\n" - "Folosește:\n" - "• /companies - Vezi companiile tale\n" - "• /help - Comenzi disponibile\n" - "• /unlink - Deautentifică-te" - ) - return ConversationHandler.END - - # Check rate limiting (3 requests per hour) - if not await check_rate_limit(f"login_{user.id}", max_attempts=3, window_minutes=60): - await update.message.reply_text( - "Prea multe încercări de autentificare.\n\n" - "Te rugăm să aștepți 60 de minute înainte de a încerca din nou." - ) - return ConversationHandler.END - - # Afișează opțiuni de autentificare - keyboard = [ - [InlineKeyboardButton("Login cu Email + Parolă", callback_data="email_login")], - [InlineKeyboardButton("Login din Web App", callback_data="web_login_info")], - [InlineKeyboardButton("Anulează", callback_data="cancel")] - ] - reply_markup = InlineKeyboardMarkup(keyboard) - - # CREATE message and SAVE message_id - msg = await update.message.reply_text( - "Alege metoda de autentificare:", - reply_markup=reply_markup, - parse_mode="Markdown" - ) - - # Save message ID for future edits - context.user_data['login_message_id'] = msg.message_id - - return AWAITING_EMAIL - - -async def action_login_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handler pentru butonul Login din meniu (action:login) - Oferă opțiuni de autentificare: Email sau Web App - """ - query = update.callback_query - user = update.effective_user - - logger.info(f"[EMAIL_AUTH] action_login_callback triggered for user {user.id}") - - await query.answer() - - # Check dacă e deja autentificat - if await is_user_authenticated(user.id): - await query.edit_message_text( - "Ești deja autentificat.\n\n" - "Folosește:\n" - "• /companies - Vezi companiile tale\n" - "• /help - Comenzi disponibile\n" - "• /unlink - Deautentifică-te" - ) - return ConversationHandler.END - - # Check rate limiting (3 requests per hour) - if not await check_rate_limit(f"login_{user.id}", max_attempts=3, window_minutes=60): - await query.edit_message_text( - "Prea multe încercări de autentificare.\n\n" - "Te rugăm să aștepți 60 de minute înainte de a încerca din nou." - ) - return ConversationHandler.END - - # Afișează opțiuni de autentificare - keyboard = [ - [InlineKeyboardButton("Login cu Email + Parolă", callback_data="email_login")], - [InlineKeyboardButton("Login din Web App", callback_data="web_login_info")], - [InlineKeyboardButton("Anulează", callback_data="cancel")] - ] - reply_markup = InlineKeyboardMarkup(keyboard) - - # EDIT existing menu message and SAVE message_id - await query.edit_message_text( - "Alege metoda de autentificare:", - reply_markup=reply_markup, - parse_mode="Markdown" - ) - - # Save message ID for future edits - context.user_data['login_message_id'] = query.message.message_id - - return AWAITING_EMAIL - - -# ============================================================================ -# CALLBACK: Email Login -# ============================================================================ - -async def email_login_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): - """Callback pentru butonul 'Login cu Email'""" - query = update.callback_query - user = update.effective_user - - logger.info(f"[EMAIL_AUTH] email_login_callback triggered for user {user.id}") - - await query.answer() - - # IMPORTANT: Salvează message_id înainte de a edita - context.user_data['login_message_id'] = query.message.message_id - - # EDIT same message - remove buttons, ask for email - await query.edit_message_text( - text="Introdu adresa de email ROA:", - parse_mode="Markdown" - ) - - return AWAITING_EMAIL - - -async def web_login_info_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): - """Info despre web app login""" - query = update.callback_query - await query.answer() - - await query.edit_message_text( - "**Login din Web App**\n\n" - "Pentru această metodă:\n\n" - "1. Accesează aplicația web ROA2WEB\n" - "2. Autentifică-te cu username + parolă\n" - "3. Apasă butonul \"Link Telegram\"\n" - "4. Copiază codul generat (8 caractere)\n" - "5. Trimite-mi codul: /start ABC123XY\n\n" - "Vei fi autentificat automat.", - parse_mode="Markdown" - ) - - # IMPORTANT: Salvează message_id pentru ca /start să poată edita același mesaj - context.user_data['web_login_message_id'] = query.message.message_id - - return ConversationHandler.END - - -# ============================================================================ -# STATE: AWAITING_EMAIL -# ============================================================================ - -async def _send_email_code( - context: ContextTypes.DEFAULT_TYPE, - chat_id: int, - email: str, - server_id: Optional[str], - user_id: int -) -> int: - """ - Generate and send email verification code on the specified server. - Returns AWAITING_CODE on success or ConversationHandler.END on failure. - """ - try: - # Verify email in Oracle (on specific server if known) - username = await verify_email_in_oracle(email, server_id=server_id) - - # IMPORTANT: Generic response to prevent email enumeration - # We always say "code sent" even if email doesn't exist - if username: - code = generate_email_code() - code_saved = await create_email_auth_code( - code=code, - email=email, - username=username, - telegram_user_id=user_id, - expiry_minutes=5 - ) - - if not code_saved: - await edit_login_message( - context=context, - chat_id=chat_id, - text="Eroare la salvarea codului.\n\nIncearcă din nou cu /login" - ) - return ConversationHandler.END - - email_service = get_email_service() - email_sent = await email_service.send_auth_code(email, code, username) - - if email_sent: - logger.info(f"[EMAIL-AUTH] ✅ Code sent for {email[:3]}***@*** (user {user_id}, server={server_id})") - else: - logger.error(f"[EMAIL-AUTH] ❌ Failed to send code (user {user_id}, server={server_id})") - - # Wait 1 second for UX (looks like verification happened) - await asyncio.sleep(1) - - # ALWAYS show success (prevent enumeration) - await edit_login_message( - context=context, - chat_id=chat_id, - text=f"Cod trimis pe {email}\n\nIntrodu codul primit pe email:", - reply_markup=InlineKeyboardMarkup([ - [InlineKeyboardButton("Retrimite Cod", callback_data=f"resend:{email}")], - [InlineKeyboardButton("Anulează", callback_data="cancel")] - ]) - ) - - context.user_data['pending_email'] = email - context.user_data['pending_username'] = username - - return AWAITING_CODE - - except Exception as e: - logger.error(f"Error sending email code: {e}", exc_info=True) - await edit_login_message( - context=context, - chat_id=chat_id, - text="Eroare internă.\n\nIncearcă din nou mai târziu." - ) - return ConversationHandler.END - - -async def receive_email(update: Update, context: ContextTypes.DEFAULT_TYPE): - """Handler pentru primirea email-ului""" - email = update.message.text.strip().lower() - user_id = update.effective_user.id - chat_id = update.effective_chat.id - - # ȘTERG mesajul utilizatorului imediat (chat curat) - try: - await update.message.delete() - except Exception as e: - logger.warning(f"Could not delete email message: {e}") - - # Validare format email - if not is_valid_email_format(email): - await edit_login_message( - context=context, - chat_id=chat_id, - text="Email invalid\n\nIntrodu o adresă validă (nume@domeniu.ro)", - reply_markup=InlineKeyboardMarkup([ - [InlineKeyboardButton("Anulează", callback_data="cancel")] - ]) - ) - return AWAITING_EMAIL - - # Clean up old pending codes - existing_code = await get_pending_email_code(user_id) - if existing_code: - await delete_user_email_codes(user_id) - logger.info(f"Deleted existing pending code for user {user_id}") - - # Show loading - await edit_login_message( - context=context, - chat_id=chat_id, - text="Verificare email...", - reply_markup=None - ) - - # Check server cache for multi-server routing - try: - await email_server_cache.refresh_if_needed() - servers = email_server_cache.get_servers_for_email(email) - except Exception as e: - logger.warning(f"Could not check email server cache: {e}") - servers = [] - - if len(servers) > 1: - # Multiple servers — ask user to select before sending code - context.user_data['pending_email'] = email - - try: - from backend.config import settings - keyboard = [] - for srv_id in servers: - srv = settings.get_oracle_server(srv_id) - srv_name = srv.name if srv else srv_id - keyboard.append([InlineKeyboardButton(srv_name, callback_data=f"select_server:{srv_id}")]) - except Exception: - # Fallback: use server IDs as labels - keyboard = [ - [InlineKeyboardButton(srv_id, callback_data=f"select_server:{srv_id}")] - for srv_id in servers - ] - keyboard.append([InlineKeyboardButton("Anulează", callback_data="cancel")]) - - await edit_login_message( - context=context, - chat_id=chat_id, - text="Email identificat pe mai multe servere.\n\nSelectează serverul pentru autentificare:", - reply_markup=InlineKeyboardMarkup(keyboard) - ) - return AWAITING_SERVER_SELECTION - - # Single server or no cache hit — proceed directly - server_id = servers[0] if servers else None - context.user_data['server_id'] = server_id - - return await _send_email_code(context, chat_id, email, server_id, user_id) - - -# ============================================================================ -# STATE: AWAITING_SERVER_SELECTION -# ============================================================================ - -async def handle_server_selected(update: Update, context: ContextTypes.DEFAULT_TYPE): - """Callback pentru selectarea serverului Oracle (mod multi-server)""" - query = update.callback_query - user_id = update.effective_user.id - chat_id = update.effective_chat.id - - await query.answer() - - # Extract server_id from callback data: "select_server:" - server_id = query.data.split(":", 1)[1] - - email = context.user_data.get('pending_email') - if not email: - await edit_login_message( - context=context, - chat_id=chat_id, - text="Sesiune expirată\n\nIncearcă din nou cu /login" - ) - return ConversationHandler.END - - # Save selected server to context - context.user_data['server_id'] = server_id - logger.info(f"[EMAIL-AUTH] User {user_id} selected server '{server_id}' for {email[:3]}***") - - # Clean up old pending codes then send code on selected server - await delete_user_email_codes(user_id) - - return await _send_email_code(context, chat_id, email, server_id, user_id) - - -# ============================================================================ -# STATE: AWAITING_CODE -# ============================================================================ - -async def receive_code(update: Update, context: ContextTypes.DEFAULT_TYPE): - """Handler pentru primirea codului din email""" - code = update.message.text.strip() - user_id = update.effective_user.id - - # ȘTERG mesajul utilizatorului imediat (chat curat) - try: - await update.message.delete() - except Exception as e: - logger.warning(f"Could not delete code message: {e}") - - # Validare format cod (6 digits) - if not (code.isdigit() and len(code) == 6): - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Cod invalid\n\nIntrodu cele 6 cifre din email.", - reply_markup=InlineKeyboardMarkup([ - [InlineKeyboardButton("Retrimite Cod", callback_data=f"resend:{context.user_data.get('pending_email', '')}")], - [InlineKeyboardButton("Anulează", callback_data="cancel")] - ]) - ) - return AWAITING_CODE - - # Verifică cod în DB - try: - code_data = await get_email_auth_code(code) - - if not code_data: - # EDIT login message to show error - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Cod invalid sau expirat\n\nIncearcă din nou cu /login" - ) - return ConversationHandler.END - - # Verificări de securitate - - # 1. Check if already used - if code_data['used']: - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Cod deja folosit\n\nIncearcă din nou cu /login" - ) - return ConversationHandler.END - - # 2. Check if expired - if datetime.now() > code_data['expires_at']: - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Cod expirat\n\nIncearcă din nou cu /login" - ) - return ConversationHandler.END - - # 3. Check if belongs to this user - if code_data['telegram_user_id'] != user_id: - logger.warning( - f"User {user_id} tried to use code belonging to " - f"user {code_data['telegram_user_id']}" - ) - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Cod invalid" - ) - return ConversationHandler.END - - # 4. Check failed attempts (max 3) - if code_data['failed_attempts'] >= MAX_CODE_ATTEMPTS: - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Prea multe încercări greșite\n\nIncearcă din nou cu /login" - ) - return ConversationHandler.END - - # Cod valid - Marchează ca folosit - await mark_email_code_used(code) - - # Salvează date verificate în context - context.user_data['verified_username'] = code_data['oracle_username'] - context.user_data['verified_email'] = code_data['email'] - context.user_data['session_token'] = generate_session_token( - user_id, - code_data['email'] - ) - - # EDIT same message - ask for password - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Cod validat!\n\nIntroduci parola ROA:", - reply_markup=None # No buttons for security - ) - - return AWAITING_PASSWORD - - except Exception as e: - logger.error(f"Error validating code: {e}", exc_info=True) - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Eroare la validarea codului.\n\nIncearcă din nou." - ) - return ConversationHandler.END - - -async def resend_code_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): - """Retrimite codul pe email""" - query = update.callback_query - await query.answer("Retrimitem codul...") - - # Extract email from callback data - callback_data = query.data # Format: "resend:email@example.com" - if not callback_data.startswith("resend:"): - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Eroare\n\nIncearcă din nou cu /login" - ) - return ConversationHandler.END - - email = callback_data.split(":", 1)[1] - user_id = update.effective_user.id - - # Check rate limiting for resend (max 2 per 10 minutes) - if not await check_rate_limit(f"resend_{user_id}", max_attempts=2, window_minutes=10): - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Prea multe solicitări\n\nAșteaptă 10 minute." - ) - return ConversationHandler.END - - # Get username from context or re-verify - username = context.user_data.get('pending_username') - - if not username: - username = await verify_email_in_oracle(email) - if not username: - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Eroare\n\nIncearcă din nou cu /login" - ) - return ConversationHandler.END - - # Delete old code and generate new one - await delete_user_email_codes(user_id) - - code = generate_email_code() - - # Save new code - await create_email_auth_code( - code=code, - email=email, - username=username, - telegram_user_id=user_id, - expiry_minutes=5 - ) - - # Send email - email_service = get_email_service() - await email_service.send_auth_code(email, code, username) - - # FIX BUG: EDIT message and KEEP buttons! - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text=f"Cod retrimis pe {email}\n\nIntrodu codul primit pe email:", - reply_markup=InlineKeyboardMarkup([ - [InlineKeyboardButton("Retrimite Cod", callback_data=f"resend:{email}")], - [InlineKeyboardButton("Anulează", callback_data="cancel")] - ]) - ) - - return AWAITING_CODE - - -# ============================================================================ -# STATE: AWAITING_PASSWORD -# ============================================================================ - -async def receive_password(update: Update, context: ContextTypes.DEFAULT_TYPE): - """Handler pentru primirea parolei Oracle""" - password = update.message.text.strip() - user_id = update.effective_user.id - - # Șterge IMEDIAT mesajul cu parola (securitate) - try: - await update.message.delete() - logger.info(f"Password message deleted for user {user_id}") - except Exception as e: - logger.warning(f"Could not delete password message: {e}") - - # Get verified data from context - username = context.user_data.get('verified_username') - email = context.user_data.get('verified_email') - session_token = context.user_data.get('session_token') - - if not all([username, email, session_token]): - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Sesiune expirată\n\nIncearcă din nou cu /login" - ) - return ConversationHandler.END - - # EDIT login message to show loading - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Verificare...", - reply_markup=None - ) - - try: - # Call backend endpoint pentru verificare parolă + JWT - backend_client = get_backend_client() - server_id = context.user_data.get('server_id') - - response = await backend_client.login_with_email( - email=email, - password=password, - telegram_user_id=user_id, - session_token=session_token, - server_id=server_id - ) - - if not response.get('success'): - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Credențiale invalide\n\nParolă incorectă sau cont inactiv.\n\nIncearcă din nou cu /login" - ) - return ConversationHandler.END - - # Success - Salvează user în telegram_users - # First create or update user record - await create_or_update_user( - telegram_user_id=user_id, - username=update.effective_user.username, - first_name=update.effective_user.first_name, - last_name=update.effective_user.last_name - ) - - # Then link to Oracle - from datetime import datetime, timedelta - token_expires_at = datetime.now() + timedelta(minutes=30) # Default expiry - - await link_user_to_oracle( - telegram_user_id=user_id, - oracle_username=response['username'], - jwt_token=response['access_token'], - jwt_refresh_token=response['refresh_token'], - token_expires_at=token_expires_at - ) - - # Clear rate limits on successful auth - clear_rate_limit(f"login_{user_id}") - clear_rate_limit(f"resend_{user_id}") - - # Get session and active company BEFORE editing message - from backend.modules.telegram.agent.session import get_session_manager - from backend.modules.telegram.bot.menus import create_main_menu, pad_message_for_wide_buttons - - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(user_id) - company = session.get_active_company() - - company_name = company['name'] if company else None - company_cui = company.get('cui') if company else None - - # Create main menu keyboard - keyboard = create_main_menu( - company_name=company_name, - company_cui=company_cui, - is_authenticated=True, # Now authenticated - cache_enabled=True # Default enabled - ) - - # Menu message with company info - companies_count = len(response.get('companies', [])) - - if company_name: - menu_text = f"{company_name}" - else: - menu_text = f"Companii disponibile: {companies_count}\n\nSelectează o companie pentru a continua" - - menu_message = pad_message_for_wide_buttons(menu_text) - - # EDIT login message to show menu (no deletion, direct edit) - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text=menu_message, - reply_markup=keyboard - ) - - # Clear sensitive data from context - context.user_data.clear() - - logger.info(f"User {user_id} authenticated successfully via email") - - return ConversationHandler.END - - except Exception as e: - logger.error(f"Error during password verification: {e}", exc_info=True) - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Eroare la autentificare.\n\nIncearcă din nou cu /login" - ) - return ConversationHandler.END - - -# ============================================================================ -# CANCEL HANDLER -# ============================================================================ - -async def cancel_login(update: Update, context: ContextTypes.DEFAULT_TYPE): - """Cancel conversation""" - - # EDIT login message to show cancellation (don't delete) - if update.callback_query: - # Called from button - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Login anulat", - reply_markup=None - ) - elif update.message: - # Called from /cancel command - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Login anulat", - reply_markup=None - ) - - # Clear context - context.user_data.clear() - - return ConversationHandler.END - - -async def conversation_timeout(update: Update, context: ContextTypes.DEFAULT_TYPE): - """Handler for conversation timeout""" - - # EDIT login message to show timeout - await edit_login_message( - context=context, - chat_id=update.effective_chat.id, - text="Sesiune expirată\n\nConversația a expirat după 5 minute.\n\nIncearcă din nou cu /login" - ) - - # Clear context - context.user_data.clear() - - return ConversationHandler.END - - -# ============================================================================ -# CONVERSATION HANDLER SETUP -# ============================================================================ - -email_login_handler = ConversationHandler( - entry_points=[ - CommandHandler('login', login_command), - CallbackQueryHandler(action_login_callback, pattern='^action:login$'), - CallbackQueryHandler(email_login_callback, pattern='^email_login$') - ], - states={ - AWAITING_EMAIL: [ - MessageHandler(filters.TEXT & ~filters.COMMAND, receive_email) - ], - AWAITING_SERVER_SELECTION: [ - CallbackQueryHandler(handle_server_selected, pattern='^select_server:') - ], - AWAITING_CODE: [ - MessageHandler(filters.TEXT & ~filters.COMMAND, receive_code), - CallbackQueryHandler(resend_code_callback, pattern='^resend:') - ], - AWAITING_PASSWORD: [ - MessageHandler(filters.TEXT & ~filters.COMMAND, receive_password) - ], - }, - fallbacks=[ - CommandHandler('cancel', cancel_login), - CallbackQueryHandler(cancel_login, pattern='^cancel$'), - CallbackQueryHandler(web_login_info_callback, pattern='^web_login_info$') - ], - per_message=False, # Track conversation per user, not per message - allow_reentry=True, # Allow starting new conversation even if previous one is active - name="email_login_conversation" -) diff --git a/deploy-package-20260223-151231/backend/modules/telegram/bot/formatters.py b/deploy-package-20260223-151231/backend/modules/telegram/bot/formatters.py deleted file mode 100644 index d3b02e8..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/bot/formatters.py +++ /dev/null @@ -1,693 +0,0 @@ -""" -Response formatters for bot commands. -Formats API responses into user-friendly Telegram messages. -""" - -from typing import Dict, List, Any - - -def format_dashboard_response(data: Dict[str, Any], company_name: str = None) -> str: - """ - Format dashboard data for Telegram (content only, no header). - - Note: company_name parameter kept for backwards compatibility but not used. - Use format_response_with_company() in handlers to add company header. - """ - text = "" - - # Sold total trezorerie (casa + banca) - rotunjit la leu - treasury_totals = data.get('treasury_totals_by_currency', {}) - sold_trezorerie = round(float(treasury_totals.get('RON', 0))) - text += f"**Sold Trezorerie:** {sold_trezorerie:,}\n\n" - - # Sold Clienți - rotunjit la leu - clienti_sold = round(float(data.get('clienti_sold_total', 0))) - clienti_in_termen = round(float(data.get('clienti_sold_in_termen', 0))) - clienti_restant = round(float(data.get('clienti_sold_restant', 0))) - - text += f"**Sold Clienți:** {clienti_sold:,}\n" - text += f" - În termen: {clienti_in_termen:,}\n" - text += f" - Restanță: {clienti_restant:,}\n\n" - - # Sold Furnizori BRUT (pentru consistență cu detaliile) - rotunjit la leu - furnizori_in_termen = round(float(data.get('furnizori_sold_in_termen', 0))) - furnizori_restant = round(float(data.get('furnizori_sold_restant', 0))) - furnizori_sold_brut = furnizori_in_termen + furnizori_restant - furnizori_avansuri = round(float(data.get('furnizori_avansuri', 0))) - furnizori_sold_net = round(float(data.get('furnizori_sold_total', 0))) - - text += f"**Sold Furnizori:** {furnizori_sold_brut:,}\n" - text += f" - În termen: {furnizori_in_termen:,}\n" - text += f" - Restanță: {furnizori_restant:,}\n" - if furnizori_avansuri != 0: - text += f" - Avansuri: {furnizori_avansuri:,}\n" - text += f" - Net (după avansuri): {furnizori_sold_net:,}" - else: - text += f" - Net: {furnizori_sold_net:,}" - - # Datorii la Buget - două secțiuni: luna precedentă și luna curentă - budget_breakdown = data.get('budget_debt_breakdown', []) - if budget_breakdown: - grupe_prec = [g for g in budget_breakdown if round(float(g.get('datorat', g.get('precedent', 0)))) > 0] - grupe_crt = [g for g in budget_breakdown if round(float(g.get('curent', 0))) > 0] - - if grupe_prec or grupe_crt: - text += "\n\n**Datorii la Buget:**\n" - - if grupe_prec: - total_sold = sum(round(float(g.get('sold', 0))) for g in grupe_prec) - total_dat = sum(round(float(g.get('datorat', g.get('precedent', 0)))) for g in grupe_prec) - sold_total_str = f"{total_sold:,}" if total_sold > 0 else "0 \u2713" - text += f"\n _Precedent: dat: {total_dat:,}, sold: {sold_total_str}_\n" - for g in grupe_prec: - datorat = round(float(g.get('datorat', g.get('precedent', 0)))) - sold = round(float(g.get('sold', 0))) - label = g.get('label', '') - sold_str = f"{sold:,}" if sold > 0 else "0 \u2713" - text += f" {label:<6} {datorat:,} · {sold_str}\n" - - if grupe_crt: - items = [f"{g.get('label', '')} {round(float(g.get('curent', 0))):,}" for g in grupe_crt] - total_crt = sum(round(float(g.get('curent', 0))) for g in grupe_crt) - sep = ' · ' - text += f"\n _Curent: {sep.join(items)} = {total_crt:,}_\n" - - return text - - -def format_invoices_response( - invoices: List[Dict[str, Any]], - company_name: str = None, - limit: int = 10 -) -> str: - """ - Format invoices list for Telegram - COMPACT TABLE FORMAT. - - Args: - invoices: List of invoice dicts - company_name: Company name (kept for compatibility, not used) - limit: Maximum number of invoices to display - - Returns: - Formatted Markdown string for Telegram (compact, no emojis) - """ - if not invoices: - return "Nu s-au gasit facturi cu aceste criterii." - - # Header (o singură dată) - text = f"**Facturi** ({len(invoices)} total)\n\n" - text += "Nr | Client | Suma | Status\n" - text += "---|--------|------|-------\n" - - # Lista facturi - compact, o linie per factură - for idx, inv in enumerate(invoices[:limit], 1): - seria = inv.get('seria', '') - numar = inv.get('numar', '') - client = inv.get('client', 'N/A') - suma = inv.get('suma_totala', 0) - status = inv.get('status', 'N/A') - - # Truncate long client names for compact display - client_short = client[:20] + "..." if len(client) > 20 else client - - # Status marker (no emoji) - status_marker = "PLATIT" if status == "platit" else "NEPLATIT" - - text += f"{seria}{numar} | {client_short} | {suma:,.0f} | {status_marker}\n" - - if len(invoices) > limit: - text += f"\n+{len(invoices) - limit} facturi" - - return text - - -# ========================================================================= -# FAZA 2: New Formatter Functions for Button Interface -# ========================================================================= - - -def format_treasury_casa_response(data: Dict[str, Any], company_name: str = None) -> str: - """ - Format treasury CASH data for Telegram (content only, no header). - - Args: - data: Dict with casa accounts and total from treasury breakdown - company_name: Company name (kept for compatibility, not used) - - Returns: - Formatted Markdown string for Telegram - - Example: - data = {'accounts': [...], 'total': 5000} - text = format_treasury_casa_response(data) - """ - text = "" - - # Total cash balance - rotunjit la leu (0 zecimale) - total_cash = round(data.get('total', 0)) - text += f"**Sold Total Cash:** {total_cash:,} RON\n\n" - - # Cash accounts - casa_accounts = data.get('accounts', []) - if casa_accounts: - text += "**Conturi de Casa:**\n" - for acc in casa_accounts: # Show all accounts - name = acc.get('name', 'N/A') - balance = round(acc.get('balance', 0)) - text += f" - {name}: {balance:,} RON\n" - else: - text += "Nu exista conturi de casa configurate." - - return text - - -def format_treasury_banca_response(data: Dict[str, Any], company_name: str = None) -> str: - """ - Format treasury BANK data for Telegram (content only, no header). - - Args: - data: Dict with banca accounts and total from treasury breakdown - company_name: Company name (kept for compatibility, not used) - - Returns: - Formatted Markdown string for Telegram - - Example: - data = {'accounts': [...], 'total': 15000} - text = format_treasury_banca_response(data) - """ - text = "" - - # Total bank balance - rotunjit la leu (0 zecimale) - total_bank = round(data.get('total', 0)) - text += f"**Sold Total Banca:** {total_bank:,} RON\n\n" - - # Bank accounts - bank_accounts = data.get('accounts', []) - if bank_accounts: - text += "**Conturi Bancare:**\n" - for acc in bank_accounts: # Show all accounts - name = acc.get('name', 'N/A') - balance = round(acc.get('balance', 0)) - text += f" - {name}: {balance:,} RON\n" - else: - text += "Nu exista conturi bancare configurate." - - return text - - -def format_treasury_combined_response(data: Dict[str, Any], company_name: str = None) -> str: - """ - Format combined treasury data (Casa + Banca) for Telegram. - - Shows grand total, Casa section with accounts, and Banca section with accounts - in a single unified message. Compact format without section titles. - - Args: - data: Dict with 'casa' and 'banca' keys from get_treasury_breakdown_split() - company_name: Company name (kept for compatibility, not used) - - Returns: - Formatted Markdown string with grand total and both sections - - Example: - data = {'casa': {...}, 'banca': {...}} - text = format_treasury_combined_response(data) - """ - def format_amount(amount: int) -> str: - """Format amount with period as thousands separator (Romanian style).""" - return f"{amount:,}".replace(",", ".") - - text = "" - - # Extract totals - rounded to whole RON - casa_total = round(data.get('casa', {}).get('total', 0)) - banca_total = round(data.get('banca', {}).get('total', 0)) - grand_total = casa_total + banca_total - - # Grand total header - text += f"**Sold Trezorerie:** {format_amount(grand_total)} RON\n\n" - - # Casa section - compact - text += f"**Casa:** {format_amount(casa_total)} RON\n" - casa_accounts = data.get('casa', {}).get('accounts', []) - if casa_accounts: - for acc in casa_accounts: - name = acc.get('name', 'N/A') - balance = round(acc.get('balance', 0)) - text += f" - {name}: {format_amount(balance)} RON\n" - - text += "\n" - - # Banca section - compact - text += f"**Banca:** {format_amount(banca_total)} RON\n" - banca_accounts = data.get('banca', {}).get('accounts', []) - if banca_accounts: - for acc in banca_accounts: - name = acc.get('name', 'N/A') - balance = round(acc.get('balance', 0)) - text += f" - {name}: {format_amount(balance)} RON\n" - - return text - - -def format_clients_balance_response( - clients: List[Dict[str, Any]], - maturity_data: Dict[str, Any], - company_name: str = None -) -> str: - """ - Format clients balance with maturity breakdown (content only, no header). - - Args: - clients: List of client dicts with id, name, balance - maturity_data: Dict with in_term, overdue, total - company_name: Company name (kept for compatibility, not used) - - Returns: - Formatted Markdown string for Telegram - - Example: - clients = [{'id': 1, 'name': 'Client A', 'balance': 15000}] - maturity = {'in_term': 10000, 'overdue': 5000, 'total': 15000} - text = format_clients_balance_response(clients, maturity) - """ - text = "" - - # Maturity breakdown - rotunjit la leu (0 zecimale) - total = round(maturity_data.get('total', 0)) - in_term = round(maturity_data.get('in_term', 0)) - overdue = round(maturity_data.get('overdue', 0)) - - text += f"**Sold Total:** {total:,} RON\n\n" - - text += "**Defalcare:**\n" - text += f" - In termen: {in_term:,} RON\n" - text += f" - Restanta: {overdue:,} RON\n\n" - - # Top 10 clients - if clients: - text += f"**Top 10 Clienti** ({len(clients)} total):\n" - # Sort by balance descending - sorted_clients = sorted( - clients, - key=lambda x: x.get('balance', 0), - reverse=True - ) - - for idx, client in enumerate(sorted_clients[:10], 1): - name = client.get('name', 'N/A') - balance = round(client.get('balance', 0)) - text += f"{idx}. {name}: {balance:,} RON\n" - - if len(clients) > 10: - text += f"\nApasa butonul pentru lista completa" - else: - text += "Nu exista clienti cu solduri." - - return text - - -def format_suppliers_balance_response( - suppliers: List[Dict[str, Any]], - maturity_data: Dict[str, Any], - company_name: str = None -) -> str: - """ - Format suppliers balance with maturity breakdown (content only, no header). - - Args: - suppliers: List of supplier dicts with id, name, balance - maturity_data: Dict with in_term, overdue, total - company_name: Company name (kept for compatibility, not used) - - Returns: - Formatted Markdown string for Telegram - - Example: - suppliers = [{'id': 1, 'name': 'Supplier A', 'balance': 5000}] - maturity = {'in_term': 4000, 'overdue': 1000, 'total': 5000} - text = format_suppliers_balance_response(suppliers, maturity) - """ - text = "" - - # Maturity breakdown - rotunjit la leu (0 zecimale) - total = round(maturity_data.get('total', 0)) - in_term = round(maturity_data.get('in_term', 0)) - overdue = round(maturity_data.get('overdue', 0)) - - text += f"**Sold Total:** {total:,} RON\n\n" - - text += "**Defalcare:**\n" - text += f" - In termen: {in_term:,} RON\n" - text += f" - Restanta: {overdue:,} RON\n\n" - - # Top 10 suppliers - if suppliers: - text += f"**Top 10 Furnizori** ({len(suppliers)} total):\n" - # Sort by balance descending - sorted_suppliers = sorted( - suppliers, - key=lambda x: x.get('balance', 0), - reverse=True - ) - - for idx, supplier in enumerate(sorted_suppliers[:10], 1): - name = supplier.get('name', 'N/A') - balance = round(supplier.get('balance', 0)) - text += f"{idx}. {name}: {balance:,} RON\n" - - if len(suppliers) > 10: - text += f"\nApasa butonul pentru lista completa" - else: - text += "Nu exista furnizori cu solduri." - - return text - - -def format_cashflow_evolution_response( - performance_data: Dict[str, Any], - monthly_data: Dict[str, Any], - company_name: str = None -) -> str: - """ - Format cash flow evolution data - Table format with mini-charts. - - Args: - performance_data: Dict with current_year and previous_year YTD data - monthly_data: Dict with months, incasari, plati arrays + prev year data - company_name: Company name (kept for compatibility, not used) - - Returns: - Formatted Markdown string for Telegram (monospace table) - - Example: - YTD 2024 vs 2023: - 2024 2023 Δ Trend - Inc: 500,000 480,000 +4.2% ████░ - Plt: 450,000 440,000 +2.3% ███░ - Net: 50,000 40,000 +25.0% █████ - """ - text = "" - - # Helper functions - def calc_percent_change(current: float, previous: float) -> str: - """Calculate percentage change: +4.2% or -3.5%""" - if previous == 0: - return "+100%" if current > 0 else "0.0%" - change = ((current - previous) / previous) * 100 - sign = "+" if change >= 0 else "" - return f"{sign}{change:.1f}%" - - def create_mini_chart(current: float, previous: float, width: int = 5) -> str: - """Create mini bar chart: ████░ (proportional bars)""" - if current == 0 and previous == 0: - return "─" * width - - max_val = max(current, previous) - if max_val == 0: - return "─" * width - - curr_bars = int((current / max_val) * width) - prev_bars = int((previous / max_val) * width) - - # Use filled and light blocks - filled = "█" * curr_bars - light = "░" * (width - curr_bars) - return filled + light - - def get_trend_arrow(current: float, previous: float) -> str: - """Get trend arrow: ↑ or ↓ or →""" - if current > previous * 1.02: # More than 2% increase - return "↑" - elif current < previous * 0.98: # More than 2% decrease - return "↓" - else: - return "→" - - # Extract YTD data - current = performance_data.get('current_year', {}) - previous = performance_data.get('previous_year', {}) - - current_year = current.get('year', '2024') - previous_year = previous.get('year', '2023') - - inc_cur = round(current.get('incasari', 0)) - plt_cur = round(current.get('plati', 0)) - net_cur = round(current.get('net', 0)) - - inc_prev = round(previous.get('incasari', 0)) - plt_prev = round(previous.get('plati', 0)) - net_prev = round(previous.get('net', 0)) - - # YTD Table Header - text += f"**YTD {current_year} vs {previous_year}:**\n" - text += f"` {current_year:>10} {previous_year:>10} Δ `\n" - - # YTD Rows - inc_pct = calc_percent_change(inc_cur, inc_prev) - text += f"`Inc: {inc_cur:>10,} {inc_prev:>10,} {inc_pct:>6}`\n" - - plt_pct = calc_percent_change(plt_cur, plt_prev) - text += f"`Plt: {plt_cur:>10,} {plt_prev:>10,} {plt_pct:>6}`\n" - - net_pct = calc_percent_change(net_cur, net_prev) - text += f"`Net: {net_cur:>10,} {net_prev:>10,} {net_pct:>6}`\n\n" - - # Monthly Evolution Table - Simplified (Net only) - months = monthly_data.get('months', []) - incasari = monthly_data.get('incasari', []) - plati = monthly_data.get('plati', []) - incasari_prev = monthly_data.get('incasari_prev', []) - plati_prev = monthly_data.get('plati_prev', []) - - if months and len(months) > 0: - text += "**Evolutie Net (12 luni):**\n" - text += f"` {current_year:>10} {previous_year:>10} Δ `\n" - - for i, month in enumerate(months): - inc = incasari[i] if i < len(incasari) else 0 - plt = plati[i] if i < len(plati) else 0 - inc_p = incasari_prev[i] if i < len(incasari_prev) else 0 - plt_p = plati_prev[i] if i < len(plati_prev) else 0 - - net = inc - plt - net_p = inc_p - plt_p - - # Extract short month name (first 3 chars before apostrophe) - month_short = month.split("'")[0][:3] if "'" in month else month[:3] - - # Calculate percentage change - net_pct = calc_percent_change(net, net_p) - - # Format row: Luna Net'current Net'prev Δ (aligned with YTD) - text += f"`{month_short:<4} {int(net):>10,} {int(net_p):>10,} {net_pct:>6}`\n" - else: - text += "Nu exista date lunare disponibile." - - return text - - -def format_client_detail_response( - client: Dict[str, Any], - invoices: List[Dict[str, Any]], - company_name: str = None -) -> str: - """ - Format client details with invoices - COMPACT TABLE FORMAT. - - Args: - client: Dict with client info (id, name, balance) - invoices: List of invoice dicts for this client - company_name: Company name (kept for compatibility, not used) - - Returns: - Formatted Markdown string for Telegram (compact, no emojis) - - Example: - client = {'id': 1, 'name': 'Client A', 'balance': 15000} - invoices = [{'id': 1, 'number': 'FV001', 'amount': 5000, 'status': 'unpaid'}] - text = format_client_detail_response(client, invoices) - """ - client_name = client.get('name', 'N/A') - balance = client.get('balance', 0) - - # Header with client info - text = f"**{client_name}**\n" - text += f"**Sold total: {balance:,.2f} RON**" - if invoices and len(invoices) > 1: - text += f" • {len(invoices)} facturi" - text += "\n\n" - - # Invoices - compact table format (no emojis) - if invoices: - from datetime import datetime - - # Sort invoices by date (most recent first) - sorted_invoices = sorted(invoices, key=lambda x: x.get('dataact') or datetime.min, reverse=True) - - # Invoice list - simple format without table - text += "Facturi cu sold:\n" - text += "━━━━━━━━━━━━━━━━━━━━\n" - - # Invoice rows - one line each, simple format - for inv in sorted_invoices[:10]: - # Backend returns: nract, totctva, soldfinal, datascad, dataact, achitat - number = str(inv.get('nract', 'N/A')) - dataact = inv.get('dataact') - - # Parse date - handle various formats to ensure dd.mm.yyyy - if dataact: - if isinstance(dataact, str): - try: - # Try ISO format first: "2024-10-25" or "2024-10-25 00:00:00" - if '-' in dataact and len(dataact) >= 10: - parsed_date = datetime.strptime(dataact[:10], '%Y-%m-%d') - date_str = parsed_date.strftime('%d.%m.%Y') - # Already in dd.mm.yyyy format - elif '.' in dataact: - date_str = dataact.split()[0][:10] # Take just date part - else: - date_str = dataact[:10] if len(dataact) >= 10 else dataact - except: - date_str = dataact[:10] if len(dataact) >= 10 else dataact - else: - # Datetime object - format as dd.mm.yyyy - date_str = dataact.strftime('%d.%m.%Y') - else: - date_str = 'N/A' - - sold = float(inv.get('soldfinal', 0) or 0) - - # Simple format: Nr • Data • Sold - text += f"Nr {number} • {date_str} • {sold:,.2f} RON\n" - - if len(invoices) > 10: - text += f"\n\n+{len(invoices) - 10} facturi" - else: - text += "Nu exista facturi neachitate" - - return text - - -def format_supplier_detail_response( - supplier: Dict[str, Any], - invoices: List[Dict[str, Any]], - company_name: str = None -) -> str: - """ - Format supplier details with invoices - COMPACT TABLE FORMAT. - - Args: - supplier: Dict with supplier info (id, name, balance) - invoices: List of invoice dicts for this supplier - company_name: Company name (kept for compatibility, not used) - - Returns: - Formatted Markdown string for Telegram (compact, no emojis) - - Example: - supplier = {'id': 1, 'name': 'Supplier A', 'balance': 5000} - invoices = [{'id': 1, 'number': 'FC001', 'amount': 2000, 'status': 'unpaid'}] - text = format_supplier_detail_response(supplier, invoices) - """ - supplier_name = supplier.get('name', 'N/A') - balance = supplier.get('balance', 0) - - # Header with supplier info - text = f"**{supplier_name}**\n" - text += f"**Sold total: {balance:,.2f} RON**" - if invoices and len(invoices) > 1: - text += f" • {len(invoices)} facturi" - text += "\n\n" - - # Invoices - compact table format (no emojis) - if invoices: - from datetime import datetime - - # Sort invoices by date (most recent first) - sorted_invoices = sorted(invoices, key=lambda x: x.get('dataact') or datetime.min, reverse=True) - - # Invoice list - simple format without table - text += "Facturi cu sold:\n" - text += "━━━━━━━━━━━━━━━━━━━━\n" - - # Invoice rows - one line each, simple format - for inv in sorted_invoices[:10]: - # Backend returns: nract, totctva, soldfinal, datascad, dataact, achitat - number = str(inv.get('nract', 'N/A')) - dataact = inv.get('dataact') - - # Parse date - handle various formats to ensure dd.mm.yyyy - if dataact: - if isinstance(dataact, str): - try: - # Try ISO format first: "2024-10-25" or "2024-10-25 00:00:00" - if '-' in dataact and len(dataact) >= 10: - parsed_date = datetime.strptime(dataact[:10], '%Y-%m-%d') - date_str = parsed_date.strftime('%d.%m.%Y') - # Already in dd.mm.yyyy format - elif '.' in dataact: - date_str = dataact.split()[0][:10] # Take just date part - else: - date_str = dataact[:10] if len(dataact) >= 10 else dataact - except: - date_str = dataact[:10] if len(dataact) >= 10 else dataact - else: - # Datetime object - format as dd.mm.yyyy - date_str = dataact.strftime('%d.%m.%Y') - else: - date_str = 'N/A' - - sold = float(inv.get('soldfinal', 0) or 0) - - # Simple format: Nr • Data • Sold - text += f"Nr {number} • {date_str} • {sold:,.2f} RON\n" - - if len(invoices) > 10: - text += f"\n\n+{len(invoices) - 10} facturi" - else: - text += "Nu exista facturi neachitate" - - return text - - -# ========================================================================= -# FAZA 6: Performance Footer for Cache Monitoring -# ========================================================================= - - -def add_performance_footer(message: str, cache_hit: bool, time_ms: float, cache_source: str = None) -> str: - """ - Add compact performance footer to bot responses. - - Shows data source (cached L1/L2 or database) and response time. - Format: "cached L1 | 15ms", "cached L2 | 25ms" or "db | 285ms" - - Args: - message: Existing message text - cache_hit: True if data came from cache - time_ms: Response time in milliseconds - cache_source: Cache source ("L1" for memory, "L2" for SQLite) if cache_hit is True - - Returns: - Message with performance footer appended - - Example: - >>> add_performance_footer("Dashboard data...", True, 52.3, "L1") - "Dashboard data...\n\ncached L1 | 52ms" - >>> add_performance_footer("Dashboard data...", True, 25.8, "L2") - "Dashboard data...\n\ncached L2 | 26ms" - >>> add_performance_footer("Dashboard data...", False, 285.7) - "Dashboard data...\n\ndb | 286ms" - """ - if cache_hit and cache_source: - source = f"cached {cache_source}" - elif cache_hit: - source = "cached" # Fallback if source not provided - else: - source = "db" - - footer = f"\n\n`{source} | {time_ms:.0f}ms`" - return message + footer - diff --git a/deploy-package-20260223-151231/backend/modules/telegram/bot/handlers.py b/deploy-package-20260223-151231/backend/modules/telegram/bot/handlers.py deleted file mode 100644 index 65171dc..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/bot/handlers.py +++ /dev/null @@ -1,3291 +0,0 @@ -""" -Telegram Bot Handlers for ROA2WEB ERP Assistant - -This module implements all message and command handlers for the Telegram bot. -Handles user interactions, authentication, and routes messages to Claude Agent. -""" - -import logging -from typing import Optional, Dict, Any -from io import BytesIO - -from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup -from telegram.ext import ContextTypes -from telegram.constants import ParseMode - -from backend.modules.telegram.auth.linking import ( - link_telegram_account, - check_user_linked, - get_user_auth_data, - get_user_companies -) -from backend.modules.telegram.agent.session import get_session_manager -from backend.modules.telegram.db.operations import update_user_last_active, link_user_to_oracle -from backend.modules.telegram.api.client import get_backend_client - -logger = logging.getLogger(__name__) - - -# ============================================================================ -# COMMAND HANDLERS -# ============================================================================ - -async def start_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /start command. - - Handles two cases: - 1. /start - Link Telegram account to Oracle account - 2. /start - Show welcome message and instructions - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user = update.effective_user - telegram_user_id = telegram_user.id - args = context.args # Command arguments - - logger.info(f"/start command from user {telegram_user_id} (@{telegram_user.username})") - - # Case 1: /start - Link account - if args and len(args) > 0: - auth_code = args[0].upper() - logger.info(f"Attempting to link user {telegram_user_id} with code {auth_code}") - - # ȘTERGE mesajul utilizatorului imediat (chat curat) - try: - await update.message.delete() - except Exception as e: - logger.warning(f"Could not delete /start message: {e}") - - # Check dacă user-ul a apăsat pe "Login din Web App" înainte - web_login_msg_id = context.user_data.get('web_login_message_id') - - if web_login_msg_id: - # EDITEAZĂ mesajul existent cu "Login din Web App" - try: - await context.bot.edit_message_text( - chat_id=update.effective_chat.id, - message_id=web_login_msg_id, - text="Conectare cont...", - parse_mode=ParseMode.MARKDOWN - ) - # IMPORTANT: NU ștergem message_id - îl păstrăm pentru editări ulterioare - except Exception as e: - logger.warning(f"Could not edit web_login message: {e}") - # Fallback: creează mesaj nou dacă editarea a eșuat - web_login_msg_id = None - - # Dacă nu avem mesaj de editat, creăm unul nou - if not web_login_msg_id: - # Creează mesaj nou și salvează ID-ul în context pentru editări ulterioare - new_msg = await update.effective_chat.send_message( - "Conectare cont...", - parse_mode=ParseMode.MARKDOWN - ) - web_login_msg_id = new_msg.message_id - # Salvează în context pentru consistență - context.user_data['web_login_message_id'] = web_login_msg_id - - # Attempt linking - result = await link_telegram_account(telegram_user, auth_code) - - if result: - # Success! - username = result['username'] - jwt_token = result['jwt_token'] - - # Get session and company info - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - company_name = company['name'] if company else None - company_cui = company.get('cui') if company else None - - # Get cache status - cache_enabled = None - try: - from backend.modules.telegram.api.client import get_backend_client - client = get_backend_client() - async with client: - cache_stats = await client.get_cache_stats(jwt_token=jwt_token) - cache_enabled = cache_stats.get('user_enabled', True) - except Exception as e: - logger.warning(f"Could not get cache status in /start: {e}") - - from backend.modules.telegram.bot.menus import create_main_menu, pad_message_for_wide_buttons - keyboard = create_main_menu(company_name, company_cui, is_authenticated=True, cache_enabled=cache_enabled) - - # EDIT message to show menu with company - if company_name: - menu_text = f"{company_name}" - else: - menu_text = "Selectează o companie pentru a continua" - - menu_message = pad_message_for_wide_buttons(menu_text) - - # EDIT the login message (same message throughout the flow) - await context.bot.edit_message_text( - chat_id=update.effective_chat.id, - message_id=web_login_msg_id, - text=menu_message, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - logger.info(f"User {telegram_user_id} successfully linked to {username}") - - else: - # Failed linking - EDIT message to show error - await context.bot.edit_message_text( - chat_id=update.effective_chat.id, - message_id=web_login_msg_id, - text="Cod invalid sau expirat\n\n" - "Generează un cod nou din aplicația web și trimite:\n" - "/start CODUL_TAU", - parse_mode=ParseMode.MARKDOWN - ) - - logger.warning(f"Failed to link user {telegram_user_id} with code {auth_code}") - - return - - # Case 2: /start (no args) - Show welcome/instructions - is_linked = await check_user_linked(telegram_user_id) - - if is_linked: - # FAZA 3: User is already linked - SHOW MENU - auth_data = await get_user_auth_data(telegram_user_id) - username = auth_data.get('username', 'utilizator') if auth_data else 'utilizator' - - # Get active company - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - company_name = company['name'] if company else None - company_cui = company.get('cui') if company else None - - # Create main menu - from backend.modules.telegram.bot.menus import create_main_menu, get_menu_message - keyboard = create_main_menu(company_name, company_cui, is_authenticated=True) - menu_text = get_menu_message(company_name, company_cui) - - await update.message.reply_text( - f"Bun venit, **{username}**\n\n{menu_text}", - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - else: - # User not linked - show main menu with Login button - from backend.modules.telegram.bot.menus import create_main_menu, pad_message_for_wide_buttons - - keyboard = create_main_menu( - company_name=None, - company_cui=None, - is_authenticated=False, # Not authenticated - shows Login button - cache_enabled=None - ) - - welcome_text = pad_message_for_wide_buttons( - "**Bun venit la ROA2WEB Bot**\n\n" - "Pentru a incepe, te rog să te autentifici.\n\n" - "Selectează o companie pentru a continua" - ) - - await update.message.reply_text( - welcome_text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in start_command: {e}", exc_info=True) - await update.message.reply_text( - "A aparut o eroare. Te rog incearca din nou mai tarziu." - ) - - -async def help_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /help command. - - Shows comprehensive help about bot capabilities and usage. - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user_id = update.effective_user.id - - logger.info(f"/help command from user {telegram_user_id}") - - help_text = """ -**ROA2WEB Bot - Asistent Financiar** - -**Cum folosesc bot-ul?** - -Dupa conectarea contului, foloseste **butoanele interactive** pentru: - -**Operatiuni:** -- Selectare companie activa -- Vizualizare sold si situatie financiara -- Trezorerie (Casa, Banca) -- Sold Clienti cu detalii facturi -- Sold Furnizori cu detalii facturi -- Evolutie incasari/plati lunare - -**Navigare:** -- Toate optiunile sunt accesibile prin butoane -- Apasa pe numele companiei pentru a schimba compania activa -- Foloseste butoanele "Refresh" pentru actualizare date -- Foloseste "Meniu Principal" pentru a reveni la menu - -**Comenzi disponibile:** -/start - Porneste bot-ul (cu/fara cod de linking) -/menu - Afiseaza meniul principal cu butoane -/help - Acest mesaj de ajutor -/unlink - Deconecteaza contul (securitate) - -**Comenzi Cache (optimizare performanta):** -/togglecache - Activeaza/Dezactiveaza cache pentru tine -/clearcache - Sterge cache pentru compania activa -/clearcache all - Sterge tot cache-ul - -**Conectare cont:** -1. Loghează-te în aplicația web ROA2WEB -2. Accesează Setări → Telegram Linking -3. Generează cod (valabil 15 minute) -4. Trimite codul în Telegram: `/start CODUL_TAU` - -**Securitate:** -Datele sunt protejate prin autentificare JWT. -Poti deconecta oricand cu /unlink. -""" - - await update.message.reply_text(help_text, parse_mode=ParseMode.MARKDOWN) - - except Exception as e: - logger.error(f"Error in help_command: {e}", exc_info=True) - await update.message.reply_text( - "A aparut o eroare. Te rog incearca din nou." - ) - - -async def clear_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /clear command. - - Clears the active company selection for the user. - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user_id = update.effective_user.id - - logger.info(f"/clear command from user {telegram_user_id}") - - # Clear active company from session - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - session.clear_active_company() - await session_manager.save_session(telegram_user_id) - - await update.message.reply_text( - "**Companie activa stearsa**\n\n" - "Foloseste /selectcompany pentru a selecta alta companie.", - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in clear_command: {e}", exc_info=True) - await update.message.reply_text( - "A apărut o eroare la ștergerea companiei active." - ) - - -async def clearcache_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /clearcache command. - - Clears the cache for the current company or all companies. - - Usage: - - /clearcache - Clear cache for current company - - /clearcache all - Clear entire cache (all companies) - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user_id = update.effective_user.id - logger.info(f"/clearcache command from user {telegram_user_id}") - - # Check if user is linked - is_linked = await check_user_linked(telegram_user_id) - if not is_linked: - await update.message.reply_text( - "**Cont neconectat**\n\nFoloseste /start pentru a conecta contul.", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Get auth data - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - # Check if user wants to clear all cache - clear_all = len(context.args) > 0 and context.args[0].lower() == 'all' - - client = get_backend_client() - async with client: - if clear_all: - # Clear entire cache - result = await client.client.post( - "/api/cache/invalidate", - json={}, - headers=client._get_auth_headers(jwt_token) - ) - if result.status_code == 200: - await update.message.reply_text( - "✅ **Cache șters complet**\n\n" - "Toate datele cached au fost șterse.", - parse_mode=ParseMode.MARKDOWN - ) - else: - await update.message.reply_text("❌ Eroare la ștergerea cache-ului.") - else: - # Get active company - session_manager = get_session_manager() - from backend.modules.telegram.bot.helpers import get_active_company_or_prompt - company = await get_active_company_or_prompt(update, session_manager, telegram_user_id) - - if not company: - return - - # Clear cache for current company - result = await client.client.post( - "/api/cache/invalidate", - json={"company_id": company['id']}, - headers=client._get_auth_headers(jwt_token) - ) - - if result.status_code == 200: - await update.message.reply_text( - f"✅ **Cache șters pentru {company['name']}**\n\n" - "Datele vor fi reîncărcate la următoarea interogare.", - parse_mode=ParseMode.MARKDOWN - ) - else: - await update.message.reply_text("❌ Eroare la ștergerea cache-ului.") - - except Exception as e: - logger.error(f"Error in clearcache_command: {e}", exc_info=True) - await update.message.reply_text("Eroare la ștergerea cache-ului.") - - -async def togglecache_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /togglecache command. - - Toggles cache on/off for the current user. - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user_id = update.effective_user.id - logger.info(f"/togglecache command from user {telegram_user_id}") - - # Check if user is linked - is_linked = await check_user_linked(telegram_user_id) - if not is_linked: - await update.message.reply_text( - "**Cont neconectat**\n\nFoloseste /start pentru a conecta contul.", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Get auth data - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - client = get_backend_client() - async with client: - # Get current cache stats to determine current state - stats_response = await client.client.get( - "/api/cache/stats", - headers=client._get_auth_headers(jwt_token) - ) - - if stats_response.status_code == 200: - stats = stats_response.json() - current_enabled = stats.get('user_cache_enabled', True) - - # Toggle to opposite state - new_state = not current_enabled - - toggle_response = await client.client.post( - "/api/cache/toggle-user", - json={"enabled": new_state}, - headers=client._get_auth_headers(jwt_token) - ) - - if toggle_response.status_code == 200: - if new_state: - await update.message.reply_text( - "✅ **Cache activat**\n\n" - "Interogările tale vor folosi cache-ul pentru răspunsuri mai rapide.", - parse_mode=ParseMode.MARKDOWN - ) - else: - await update.message.reply_text( - "⚠️ **Cache dezactivat**\n\n" - "Interogările tale vor accesa direct baza de date Oracle.", - parse_mode=ParseMode.MARKDOWN - ) - else: - await update.message.reply_text("❌ Eroare la comutarea cache-ului.") - else: - await update.message.reply_text("❌ Eroare la citirea stării cache-ului.") - - except Exception as e: - logger.error(f"Error in togglecache_command: {e}", exc_info=True) - await update.message.reply_text("Eroare la comutarea cache-ului.") - - -async def companies_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /companies command. - - Shows list of companies the user has access to. - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user_id = update.effective_user.id - - logger.info(f"/companies command from user {telegram_user_id}") - - # Check if user is linked - is_linked = await check_user_linked(telegram_user_id) - - if not is_linked: - await update.message.reply_text( - "**Cont neconectat**\n\n" - "Conecteaza-ti contul cu /start", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Get companies - companies = await get_user_companies(telegram_user_id) - - if not companies: - await update.message.reply_text( - "**Nicio companie gasita**\n\n" - "Contacteaza administratorul pentru permisiuni.", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Format companies list - companies_text = f"**Companiile tale ({len(companies)}):**\n\n" - - for i, comp in enumerate(companies, 1): - nume = comp.get('nume_firma', 'N/A') - comp_id = comp.get('id', 'N/A') - cui = comp.get('cui', 'N/A') - - companies_text += f"{i}. **{nume}**\n" - companies_text += f" - ID: {comp_id}\n" - companies_text += f" - CUI: {cui}\n\n" - - companies_text += "\nFoloseste /selectcompany pentru a selecta compania activa." - - await update.message.reply_text(companies_text, parse_mode=ParseMode.MARKDOWN) - - except Exception as e: - logger.error(f"Error in companies_command: {e}", exc_info=True) - await update.message.reply_text( - "A aparut o eroare la incarcarea companiilor." - ) - - -async def unlink_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /unlink command. - - Unlinks the user's Telegram account from Oracle account (security feature). - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user_id = update.effective_user.id - - logger.info(f"/unlink command from user {telegram_user_id}") - - # Check if linked - is_linked = await check_user_linked(telegram_user_id) - - if not is_linked: - await update.message.reply_text( - "Contul tau nu este linkuit.", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Create confirmation keyboard - keyboard = [ - [ - InlineKeyboardButton("Da, deconecteaza", callback_data="unlink_confirm"), - InlineKeyboardButton("Anuleaza", callback_data="unlink_cancel") - ] - ] - reply_markup = InlineKeyboardMarkup(keyboard) - - await update.message.reply_text( - "**Confirmare Deconectare**\n\n" - "Esti sigur ca vrei sa deconectezi contul?\n\n" - "Accesul la date va fi oprit. Poti reconecta oricand cu un cod nou.\n\n" - "Confirma:", - reply_markup=reply_markup, - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in unlink_command: {e}", exc_info=True) - await update.message.reply_text( - "A aparut o eroare." - ) - - -async def selectcompany_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /selectcompany [search_term] command. - - Permite căutare și selectare companie cu PAGINARE (identic cu butoanele). - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user_id = update.effective_user.id - - logger.info(f"/selectcompany command from user {telegram_user_id}") - - # Check if user is linked - is_linked = await check_user_linked(telegram_user_id) - if not is_linked: - await update.message.reply_text( - "**Cont neconectat**\n\nFoloseste /start", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Get auth data - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - # Get search term from command arguments (optional) - search_term = " ".join(context.args) if context.args else "" - - # ✅ MODIFICARE: Folosim funcția comună cu paginare - await _handle_selectcompany_view( - query_or_update=update, - telegram_user_id=telegram_user_id, - jwt_token=jwt_token, - is_callback=False, - page=0, - search_term=search_term - ) - - except Exception as e: - logger.error(f"Error in selectcompany_command: {e}", exc_info=True) - await update.message.reply_text("A aparut o eroare. Te rog incearca din nou.") - - -async def dashboard_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """Handle /dashboard command - shows financial dashboard.""" - try: - telegram_user_id = update.effective_user.id - - logger.info(f"/dashboard command from user {telegram_user_id}") - - # Check linked - is_linked = await check_user_linked(telegram_user_id) - if not is_linked: - await update.message.reply_text( - "**Cont neconectat**\n\nFoloseste /start", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Get active company - session_manager = get_session_manager() - from backend.modules.telegram.bot.helpers import get_active_company_or_prompt - company = await get_active_company_or_prompt(update, session_manager, telegram_user_id) - - if not company: - return # Prompt already sent - - # Get auth data - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - # ✅ MODIFICARE: Folosim funcția comună - await _handle_sold_view( - query_or_update=update, - telegram_user_id=telegram_user_id, - company=company, - jwt_token=jwt_token, - is_callback=False - ) - - except Exception as e: - logger.error(f"Error in dashboard_command: {e}", exc_info=True) - await update.message.reply_text("Eroare la incarcarea dashboard-ului.") - - -async def sold_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """Handle /sold command - alias for /dashboard.""" - await dashboard_command(update, context) - - -async def facturi_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """Handle /facturi [filtru] command - shows invoices list.""" - try: - telegram_user_id = update.effective_user.id - - logger.info(f"/facturi command from user {telegram_user_id}") - - # Check linked - is_linked = await check_user_linked(telegram_user_id) - if not is_linked: - await update.message.reply_text( - "**Cont nelinkuit**\n\nFoloseste /start.", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Get active company - session_manager = get_session_manager() - from backend.modules.telegram.bot.helpers import get_active_company_or_prompt - company = await get_active_company_or_prompt(update, session_manager, telegram_user_id) - - if not company: - return - - # Parse filters from args (optional: "neplatite", "platite", etc.) - filters = {} - if context.args: - status_arg = context.args[0].lower() - if status_arg in ['neplatite', 'unpaid']: - filters['status'] = 'unpaid' - elif status_arg in ['platite', 'paid']: - filters['status'] = 'paid' - - # Get auth data - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - # Call API - client = get_backend_client() - async with client: - invoices = await client.search_invoices( - company_id=company['id'], - jwt_token=jwt_token, - filters=filters if filters else None - ) - - # Format response - from backend.modules.telegram.bot.formatters import format_invoices_response - response = format_invoices_response(invoices, company['name']) - - # FAZA 3: Add action buttons - from backend.modules.telegram.bot.menus import create_action_buttons - keyboard = create_action_buttons("facturi", show_export=True) - - await update.message.reply_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in facturi_command: {e}", exc_info=True) - await update.message.reply_text("Eroare la incarcarea facturilor.") - - -async def trezorerie_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /trezorerie command - shows total treasury (casa + banca). - - Afișează sold total trezorerie cu defalcare și butoane pentru detalii. - """ - try: - telegram_user_id = update.effective_user.id - - logger.info(f"/trezorerie command from user {telegram_user_id}") - - # Check linked - is_linked = await check_user_linked(telegram_user_id) - if not is_linked: - await update.message.reply_text( - "**Cont neconectat**\n\nFoloseste /start", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Get active company - session_manager = get_session_manager() - from backend.modules.telegram.bot.helpers import get_active_company_or_prompt - company = await get_active_company_or_prompt(update, session_manager, telegram_user_id) - - if not company: - return - - # Get auth data - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - # ✅ MODIFICARE: Folosim treasury_breakdown_split ca în Casa/Banca - from backend.modules.telegram.bot.helpers import get_treasury_breakdown_split - treasury_data = await get_treasury_breakdown_split( - company_id=company['id'], - jwt_token=jwt_token - ) - - if not treasury_data: - await update.message.reply_text("Eroare la incarcarea trezoreriei.") - return - - # Extract cache metadata - cache_hit = treasury_data.get('cache_hit', False) - response_time_ms = treasury_data.get('response_time_ms', 0) - cache_source = treasury_data.get('cache_source', None) - - # Format combined response (casa + banca) - rotunjit la leu (0 zecimale) - casa_total = round(treasury_data['casa']['total']) - banca_total = round(treasury_data['banca']['total']) - total_treasury = casa_total + banca_total - - content = f"**Sold Total:** {total_treasury:,} RON\n\n" - content += f"**Defalcare:**\n" - content += f" - Casa: {casa_total:,} RON\n" - content += f" - Banca: {banca_total:,} RON\n\n" - content += "Foloseste butoanele pentru detalii:" - - # Apply company header formatting - from backend.modules.telegram.bot.menus import format_response_with_company - text = format_response_with_company(content, company['name']) - - # Add performance footer - if response_time_ms > 0: - from backend.modules.telegram.bot.formatters import add_performance_footer - text = add_performance_footer(text, cache_hit, response_time_ms, cache_source) - - # Add buttons to view details - from telegram import InlineKeyboardButton, InlineKeyboardMarkup - keyboard = InlineKeyboardMarkup([ - [ - InlineKeyboardButton("Detalii Casa", callback_data="menu:casa"), - InlineKeyboardButton("Detalii Banca", callback_data="menu:banca") - ], - [ - InlineKeyboardButton("Meniu Principal", callback_data="action:menu") - ] - ]) - - await update.message.reply_text( - text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in trezorerie_command: {e}", exc_info=True) - await update.message.reply_text("Eroare la incarcarea trezoreriei.") - - -async def menu_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /menu command - shows main menu with interactive buttons. - - Displays the main menu with 6 financial options organized in a 2-column layout. - Requires user to be linked and have an active company selected. - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user_id = update.effective_user.id - logger.info(f"/menu command from user {telegram_user_id}") - - # Check if user is linked - is_linked = await check_user_linked(telegram_user_id) - if not is_linked: - await update.message.reply_text( - "**Cont neconectat**\n\nFoloseste /start", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Get active company - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - # Get company data for menu - company_name = company['name'] if company else None - company_cui = company.get('cui') if company else None - - # Get cache status for user - cache_enabled = None - try: - from backend.modules.telegram.api.client import get_backend_client - client = get_backend_client() - async with client: - cache_stats = await client.get_cache_stats(jwt_token=auth_data['jwt_token']) - cache_enabled = cache_stats.get('user_enabled', True) - except Exception as e: - logger.warning(f"Could not get cache status: {e}") - - # Create main menu (user is authenticated if they passed the is_linked check) - from backend.modules.telegram.bot.menus import create_main_menu, get_menu_message - keyboard = create_main_menu(company_name, company_cui, is_authenticated=True, cache_enabled=cache_enabled) - menu_text = get_menu_message(company_name, company_cui) - - await update.message.reply_text( - menu_text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in menu_command: {e}", exc_info=True) - await update.message.reply_text("Eroare la afisarea meniului.") - - -async def trezorerie_casa_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /trezorerie_casa command - shows cash treasury data. - - Displays treasury data for cash accounts only (Casa). - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user_id = update.effective_user.id - logger.info(f"/trezorerie_casa command from user {telegram_user_id}") - - # Check linked - is_linked = await check_user_linked(telegram_user_id) - if not is_linked: - await update.message.reply_text( - "**Cont neconectat**\n\nFoloseste /start", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Get active company - session_manager = get_session_manager() - from backend.modules.telegram.bot.helpers import get_active_company_or_prompt - company = await get_active_company_or_prompt(update, session_manager, telegram_user_id) - - if not company: - return # Prompt already sent - - # Get auth data - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - # Get treasury breakdown split - from backend.modules.telegram.bot.helpers import get_treasury_breakdown_split - treasury_data = await get_treasury_breakdown_split( - company_id=company['id'], - jwt_token=jwt_token - ) - - if not treasury_data: - await update.message.reply_text("Eroare la incarcarea trezoreriei cash.") - return - - # Format response - from backend.modules.telegram.bot.formatters import format_treasury_casa_response, add_performance_footer - from backend.modules.telegram.bot.menus import create_action_buttons, format_response_with_company - - content = format_treasury_casa_response(treasury_data['casa']) - response = format_response_with_company(content, company['name']) - - # Add performance footer if cache metadata is available - if 'cache_hit' in treasury_data and 'response_time_ms' in treasury_data: - cache_hit = treasury_data['cache_hit'] - response_time_ms = treasury_data['response_time_ms'] - cache_source = treasury_data.get('cache_source', None) - response = add_performance_footer(response, cache_hit, response_time_ms, cache_source) - - keyboard = create_action_buttons("casa", show_export=True) - - await update.message.reply_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in trezorerie_casa_command: {e}", exc_info=True) - await update.message.reply_text("Eroare la incarcarea trezoreriei cash.") - - -async def trezorerie_banca_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /trezorerie_banca command - shows bank treasury data. - - Displays treasury data for bank accounts only (Banca). - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user_id = update.effective_user.id - logger.info(f"/trezorerie_banca command from user {telegram_user_id}") - - # Check linked - is_linked = await check_user_linked(telegram_user_id) - if not is_linked: - await update.message.reply_text( - "**Cont neconectat**\n\nFoloseste /start", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Get active company - session_manager = get_session_manager() - from backend.modules.telegram.bot.helpers import get_active_company_or_prompt - company = await get_active_company_or_prompt(update, session_manager, telegram_user_id) - - if not company: - return # Prompt already sent - - # Get auth data - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - # Get treasury breakdown split - from backend.modules.telegram.bot.helpers import get_treasury_breakdown_split - treasury_data = await get_treasury_breakdown_split( - company_id=company['id'], - jwt_token=jwt_token - ) - - if not treasury_data: - await update.message.reply_text("Eroare la incarcarea trezoreriei bancare.") - return - - # Format response - from backend.modules.telegram.bot.formatters import format_treasury_banca_response, add_performance_footer - from backend.modules.telegram.bot.menus import create_action_buttons, format_response_with_company - - content = format_treasury_banca_response(treasury_data['banca']) - response = format_response_with_company(content, company['name']) - - # Add performance footer if cache metadata is available - if 'cache_hit' in treasury_data and 'response_time_ms' in treasury_data: - cache_hit = treasury_data['cache_hit'] - response_time_ms = treasury_data['response_time_ms'] - cache_source = treasury_data.get('cache_source', None) - response = add_performance_footer(response, cache_hit, response_time_ms, cache_source) - - keyboard = create_action_buttons("banca", show_export=True) - - await update.message.reply_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in trezorerie_banca_command: {e}", exc_info=True) - await update.message.reply_text("Eroare la incarcarea trezoreriei bancare.") - - -async def clienti_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /clienti command - shows clients balance with maturity breakdown. - - Displays total clients balance, in-term and overdue amounts, and list of clients - with interactive buttons to view details. - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user_id = update.effective_user.id - logger.info(f"/clienti command from user {telegram_user_id}") - - # Check linked - is_linked = await check_user_linked(telegram_user_id) - if not is_linked: - await update.message.reply_text( - "**Cont neconectat**\n\nFoloseste /start", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Get active company - session_manager = get_session_manager() - from backend.modules.telegram.bot.helpers import get_active_company_or_prompt - company = await get_active_company_or_prompt(update, session_manager, telegram_user_id) - - if not company: - return # Prompt already sent - - # Get auth data - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - # Get clients with maturity data - from backend.modules.telegram.bot.helpers import get_clients_with_maturity - clients_data = await get_clients_with_maturity( - company_id=company['id'], - jwt_token=jwt_token - ) - - if not clients_data: - await update.message.reply_text("Eroare la incarcarea datelor clienti.") - return - - # Extract cache metadata - cache_hit = clients_data.get('cache_hit', False) - response_time_ms = clients_data.get('response_time_ms', 0) - cache_source = clients_data.get('cache_source', None) - - # Format response - from backend.modules.telegram.bot.formatters import format_clients_balance_response, add_performance_footer - from backend.modules.telegram.bot.menus import create_client_list_keyboard, format_response_with_company - - content = format_clients_balance_response( - clients_data['clients'], - clients_data['maturity'] - ) - response = format_response_with_company(content, company['name']) - - # Add performance footer - if response_time_ms > 0: - response = add_performance_footer(response, cache_hit, response_time_ms, cache_source) - - keyboard = create_client_list_keyboard(clients_data['clients'], page=0) - - await update.message.reply_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in clienti_command: {e}", exc_info=True) - await update.message.reply_text("Eroare la incarcarea datelor clienti.") - - -async def furnizori_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /furnizori command - shows suppliers balance with maturity breakdown. - - Displays total suppliers balance, in-term and overdue amounts, and list of suppliers - with interactive buttons to view details. - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user_id = update.effective_user.id - logger.info(f"/furnizori command from user {telegram_user_id}") - - # Check linked - is_linked = await check_user_linked(telegram_user_id) - if not is_linked: - await update.message.reply_text( - "**Cont neconectat**\n\nFoloseste /start", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Get active company - session_manager = get_session_manager() - from backend.modules.telegram.bot.helpers import get_active_company_or_prompt - company = await get_active_company_or_prompt(update, session_manager, telegram_user_id) - - if not company: - return # Prompt already sent - - # Get auth data - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - # Get suppliers with maturity data - from backend.modules.telegram.bot.helpers import get_suppliers_with_maturity - suppliers_data = await get_suppliers_with_maturity( - company_id=company['id'], - jwt_token=jwt_token - ) - - if not suppliers_data: - await update.message.reply_text("Eroare la incarcarea datelor furnizori.") - return - - # Extract cache metadata - cache_hit = suppliers_data.get('cache_hit', False) - response_time_ms = suppliers_data.get('response_time_ms', 0) - cache_source = suppliers_data.get('cache_source', None) - - # Format response - from backend.modules.telegram.bot.formatters import format_suppliers_balance_response, add_performance_footer - from backend.modules.telegram.bot.menus import create_supplier_list_keyboard, format_response_with_company - - content = format_suppliers_balance_response( - suppliers_data['suppliers'], - suppliers_data['maturity'] - ) - response = format_response_with_company(content, company['name']) - - # Add performance footer - if response_time_ms > 0: - response = add_performance_footer(response, cache_hit, response_time_ms, cache_source) - - keyboard = create_supplier_list_keyboard(suppliers_data['suppliers'], page=0) - - await update.message.reply_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in furnizori_command: {e}", exc_info=True) - await update.message.reply_text("Eroare la incarcarea datelor furnizori.") - - -async def evolutie_command(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle /evolutie command - shows cash flow evolution (collections/payments). - - Displays performance data and monthly cash flow trends for collections and payments. - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user_id = update.effective_user.id - logger.info(f"/evolutie command from user {telegram_user_id}") - - # Check linked - is_linked = await check_user_linked(telegram_user_id) - if not is_linked: - await update.message.reply_text( - "**Cont neconectat**\n\nFoloseste /start", - parse_mode=ParseMode.MARKDOWN - ) - return - - # Get active company - session_manager = get_session_manager() - from backend.modules.telegram.bot.helpers import get_active_company_or_prompt - company = await get_active_company_or_prompt(update, session_manager, telegram_user_id) - - if not company: - return # Prompt already sent - - # Get auth data - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - # Get cash flow evolution data - from backend.modules.telegram.bot.helpers import get_cashflow_evolution_data - evolution_data = await get_cashflow_evolution_data( - company_id=company['id'], - jwt_token=jwt_token - ) - - if not evolution_data: - await update.message.reply_text("Eroare la incarcarea datelor evolutie.") - return - - # Format response - from backend.modules.telegram.bot.formatters import format_cashflow_evolution_response, add_performance_footer - from backend.modules.telegram.bot.menus import create_action_buttons, format_response_with_company - - content = format_cashflow_evolution_response( - evolution_data['performance'], - evolution_data['monthly'] - ) - response = format_response_with_company(content, company['name']) - - # Add performance footer if cache metadata is available - if 'cache_hit' in evolution_data and 'response_time_ms' in evolution_data: - cache_hit = evolution_data['cache_hit'] - response_time_ms = evolution_data['response_time_ms'] - cache_source = evolution_data.get('cache_source', None) - response = add_performance_footer(response, cache_hit, response_time_ms, cache_source) - - keyboard = create_action_buttons("evolutie", show_export=False, show_refresh=False) - - await update.message.reply_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in evolutie_command: {e}", exc_info=True) - await update.message.reply_text("Eroare la incarcarea datelor evolutie.") - - -# ============================================================================ -# TEXT MESSAGE HANDLERS -# ============================================================================ - -async def handle_text_message(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle regular text messages. - - Automatically detects and processes linking codes when user sends - a text that matches the code format (8 alphanumeric characters). - - Args: - update: Telegram update object - context: Telegram context - """ - try: - telegram_user = update.effective_user - telegram_user_id = telegram_user.id - text = update.message.text.strip() - - logger.info(f"Text message from user {telegram_user_id}") - - # Check if user is awaiting password for server switch - pending_server_id = context.user_data.get('pending_switch_server_id') - if pending_server_id: - # Șterge IMEDIAT mesajul cu parola (securitate) - try: - await update.message.delete() - except Exception as e: - logger.warning(f"Could not delete password message: {e}") - - # Șterge și mesajul prompt "Parolă:" (ForceReply) - prompt_msg_id = context.user_data.pop('pending_switch_prompt_message_id', None) - if prompt_msg_id: - try: - await context.bot.delete_message( - chat_id=update.effective_chat.id, - message_id=prompt_msg_id - ) - except Exception: - pass - - oracle_password = text - jwt_token = context.user_data.pop('pending_switch_jwt_token', None) - username = context.user_data.pop('pending_switch_username', None) - context.user_data.pop('pending_switch_server_id', None) - # Recuperează message_id-ul și chat_id-ul pentru editare in-place - switch_msg_id = context.user_data.get('pending_switch_message_id') - switch_chat_id = context.user_data.get('pending_switch_chat_id') - - if not jwt_token or not username: - await update.effective_chat.send_message("Sesiune expirată. Încearcă din nou.") - return - - if switch_msg_id and switch_chat_id: - await context.bot.edit_message_text( - chat_id=switch_chat_id, - message_id=switch_msg_id, - text="Se verifică parola și se schimbă serverul..." - ) - else: - await update.effective_chat.send_message("Se verifică parola și se schimbă serverul...") - - client = get_backend_client() - async with client: - result = await client.switch_server( - jwt_token=jwt_token, - oracle_username=username, - new_server_id=pending_server_id, - oracle_password=oracle_password - ) - - if not result.get('success'): - from telegram import InlineKeyboardButton, InlineKeyboardMarkup - error_text = f"❌ {result.get('message', 'Eroare la schimbarea serverului')}\n\nReîncearcă cu /menu → Schimbă server." - error_markup = InlineKeyboardMarkup([[InlineKeyboardButton("« Meniu", callback_data="action:menu")]]) - if switch_msg_id and switch_chat_id: - context.user_data.pop('pending_switch_message_id', None) - context.user_data.pop('pending_switch_chat_id', None) - await context.bot.edit_message_text( - chat_id=switch_chat_id, - message_id=switch_msg_id, - text=error_text, - reply_markup=error_markup - ) - else: - await update.effective_chat.send_message(error_text, reply_markup=error_markup) - return - - # Salvează noul JWT în SQLite - from datetime import datetime, timedelta - token_expires_at = datetime.now() + timedelta(minutes=30) - await link_user_to_oracle( - telegram_user_id=telegram_user_id, - oracle_username=result.get('username', username), - jwt_token=result['access_token'], - jwt_refresh_token=result['refresh_token'], - token_expires_at=token_expires_at - ) - - # Curăță compania din sesiune — aparținea serverului vechi - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - session.clear_active_company() - await session_manager.save_session(telegram_user_id) - - try: - from backend.config import settings - srv = settings.get_oracle_server(pending_server_id) - srv_display = srv.name if srv else pending_server_id - except Exception: - srv_display = pending_server_id - - edit_chat_id = switch_chat_id if (switch_msg_id and switch_chat_id) else None - edit_message_id = switch_msg_id if (switch_msg_id and switch_chat_id) else None - if switch_msg_id and switch_chat_id: - context.user_data.pop('pending_switch_message_id', None) - context.user_data.pop('pending_switch_chat_id', None) - - await _handle_selectcompany_view( - query_or_update=update, - telegram_user_id=telegram_user_id, - jwt_token=result['access_token'], - is_callback=False, - page=0, - search_term="", - header=f"Server schimbat: **{srv_display}**\n\n", - bot=context.bot, - edit_chat_id=edit_chat_id, - edit_message_id=edit_message_id - ) - return - - # Check if user is already linked - is_linked = await check_user_linked(telegram_user_id) - - if is_linked: - # User is already linked - ignore text messages - # (could add natural language processing here in the future) - return - - text = text.upper() # Only uppercase for linking code check - - # User is NOT linked - check if text looks like a linking code - # Linking codes are exactly 8 alphanumeric characters - if len(text) == 8 and text.isalnum(): - logger.info(f"Detected potential linking code: {text} from user {telegram_user_id}") - - # ȘTERGE mesajul utilizatorului cu codul (chat curat) - try: - await update.message.delete() - except Exception as e: - logger.warning(f"Could not delete code message: {e}") - - # Check dacă există mesaj de editat din "Login din Web App" - web_login_msg_id = context.user_data.get('web_login_message_id') - - if web_login_msg_id: - # EDITEAZĂ mesajul existent cu instrucțiunile - try: - await context.bot.edit_message_text( - chat_id=update.effective_chat.id, - message_id=web_login_msg_id, - text="Conectare cont...", - parse_mode=ParseMode.MARKDOWN - ) - except Exception as e: - logger.warning(f"Could not edit web_login message: {e}") - # Fallback: creează mesaj nou - web_login_msg_id = None - - # Dacă nu există mesaj de editat, creează unul nou - if not web_login_msg_id: - linking_msg = await update.effective_chat.send_message( - "Conectare cont...", - parse_mode=ParseMode.MARKDOWN - ) - web_login_msg_id = linking_msg.message_id - - # Attempt linking - result = await link_telegram_account(telegram_user, text) - - if result: - # Success! - username = result['username'] - # Show main menu with buttons for newly linked user - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - company_name = company['name'] if company else None - company_cui = company.get('cui') if company else None - - from backend.modules.telegram.bot.menus import create_main_menu, pad_message_for_wide_buttons - keyboard = create_main_menu(company_name, company_cui, is_authenticated=True) - - # Create menu text - if company_name: - menu_text = f"{company_name}" - else: - menu_text = "Selectează o companie pentru a continua" - - menu_message = pad_message_for_wide_buttons(menu_text) - - # EDIT the same message to show menu (no new messages!) - await context.bot.edit_message_text( - chat_id=update.effective_chat.id, - message_id=web_login_msg_id, - text=menu_message, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - logger.info(f"User {telegram_user_id} successfully linked to {username} via direct code input") - else: - # Failed linking - EDIT the same message to show error - await context.bot.edit_message_text( - chat_id=update.effective_chat.id, - message_id=web_login_msg_id, - text="Cod invalid sau expirat\n\n" - "Generează un cod nou din aplicația web și trimite-l direct.\n\n" - "Codul expiră în 15 minute.", - parse_mode=ParseMode.MARKDOWN - ) - - logger.warning(f"Failed to link user {telegram_user_id} with direct code: {text}") - else: - # Text doesn't look like a linking code - # Show helpful message - keyboard = InlineKeyboardMarkup([ - [InlineKeyboardButton("Cum obtin codul de link?", callback_data="login_help")], - [InlineKeyboardButton("Am deja cod - Linkez contul", callback_data="login_prompt")] - ]) - - await update.message.reply_text( - "**Salut**\n\n" - "Pentru a folosi bot-ul, conecteaza contul tau ROA2WEB.\n\n" - "Codul are exact 8 caractere (exemplu: ABC12XYZ)\n\n" - "Alege o optiune:", - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in handle_text_message: {e}", exc_info=True) - await update.message.reply_text( - "A aparut o eroare. Te rog incearca din nou." - ) - - -# ============================================================================ -# CALLBACK QUERY HANDLERS (for inline buttons) -# ============================================================================ - -async def handle_menu_callback(query, telegram_user_id: int, callback_data: str): - """ - Handle main menu button clicks. - - Callback format: menu:{action} - Actions: sold, casa, banca, clienti, furnizori, evolutie, select_company - - Args: - query: CallbackQuery object - telegram_user_id: Telegram user ID - callback_data: Callback data string - """ - action = callback_data.split(":")[1] - - # Get auth data - auth_data = await get_user_auth_data(telegram_user_id) - - # If user is not authenticated and trying to access financial data, show auth required message - if auth_data is None and action != "select_company": - from backend.modules.telegram.bot.menus import create_main_menu, pad_message_for_wide_buttons - keyboard = create_main_menu(company_name=None, company_cui=None, is_authenticated=False) - menu_text = pad_message_for_wide_buttons( - "⚠️ **Autentificare necesară**\n\n" - "Pentru a accesa date financiare,\n" - "apasă **Login** și urmează instrucțiunile." - ) - - await query.edit_message_text( - menu_text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - return - - # If action is select_company and user is not authenticated, allow it (will show empty list or error) - if action == "select_company" and auth_data is None: - await query.answer("Pentru a vedea companiile, trebuie să te autentifici mai întâi.", show_alert=True) - return - - jwt_token = auth_data['jwt_token'] - - # Get active company - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - if not company and action != "select_company": - # Get companies and show selection directly - client = get_backend_client() - async with client: - companies = await client.get_user_companies(jwt_token=jwt_token) - - if not companies: - await query.edit_message_text( - "Nu ai acces la nicio companie.\n" - "Contacteaza administratorul.", - parse_mode=ParseMode.MARKDOWN - ) - return - - from backend.modules.telegram.bot.helpers import create_company_selection_keyboard_paginated - keyboard = create_company_selection_keyboard_paginated(companies, page=0) - - await query.edit_message_text( - f"**Selecteaza mai intai o companie**\n\n" - f"Companiile tale ({len(companies)}):", - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - return - - # Route to appropriate handler - if action == "sold": - # ✅ MODIFICARE: Folosim funcția comună - await _handle_sold_view( - query_or_update=query, - telegram_user_id=telegram_user_id, - company=company, - jwt_token=jwt_token, - is_callback=True - ) - - elif action == "trezorerie": - # Trezorerie unified (Casa + Banca combined) - from backend.modules.telegram.bot.helpers import get_treasury_breakdown_split - treasury_data = await get_treasury_breakdown_split(company['id'], jwt_token) - - from backend.modules.telegram.bot.formatters import format_treasury_combined_response, add_performance_footer - from backend.modules.telegram.bot.menus import create_action_buttons, format_response_with_company - - content = format_treasury_combined_response(treasury_data) - response = format_response_with_company(content, company['name']) - - # Add performance footer if cache metadata is available - if 'cache_hit' in treasury_data and 'response_time_ms' in treasury_data: - cache_hit = treasury_data['cache_hit'] - response_time_ms = treasury_data['response_time_ms'] - cache_source = treasury_data.get('cache_source', None) - response = add_performance_footer(response, cache_hit, response_time_ms, cache_source) - - keyboard = create_action_buttons("trezorerie", show_export=False, show_refresh=False) - - try: - await query.edit_message_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - except Exception as e: - # Ignore "Message is not modified" error - if "Message is not modified" not in str(e): - raise - - elif action == "casa": - # Trezorerie casa - from backend.modules.telegram.bot.helpers import get_treasury_breakdown_split - treasury_data = await get_treasury_breakdown_split(company['id'], jwt_token) - - from backend.modules.telegram.bot.formatters import format_treasury_casa_response, add_performance_footer - from backend.modules.telegram.bot.menus import create_action_buttons, format_response_with_company - - content = format_treasury_casa_response(treasury_data['casa']) - response = format_response_with_company(content, company['name']) - - # Add performance footer if cache metadata is available - if 'cache_hit' in treasury_data and 'response_time_ms' in treasury_data: - cache_hit = treasury_data['cache_hit'] - response_time_ms = treasury_data['response_time_ms'] - cache_source = treasury_data.get('cache_source', None) - response = add_performance_footer(response, cache_hit, response_time_ms, cache_source) - - keyboard = create_action_buttons("casa", show_export=False, show_refresh=False) - - try: - await query.edit_message_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - except Exception as e: - # Ignore "Message is not modified" error - if "Message is not modified" not in str(e): - raise - - elif action == "banca": - # Trezorerie banca - from backend.modules.telegram.bot.helpers import get_treasury_breakdown_split - treasury_data = await get_treasury_breakdown_split(company['id'], jwt_token) - - from backend.modules.telegram.bot.formatters import format_treasury_banca_response, add_performance_footer - from backend.modules.telegram.bot.menus import create_action_buttons, format_response_with_company - - content = format_treasury_banca_response(treasury_data['banca']) - response = format_response_with_company(content, company['name']) - - # Add performance footer if cache metadata is available - if 'cache_hit' in treasury_data and 'response_time_ms' in treasury_data: - cache_hit = treasury_data['cache_hit'] - response_time_ms = treasury_data['response_time_ms'] - cache_source = treasury_data.get('cache_source', None) - response = add_performance_footer(response, cache_hit, response_time_ms, cache_source) - - keyboard = create_action_buttons("banca", show_export=False, show_refresh=False) - - try: - await query.edit_message_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - except Exception as e: - # Ignore "Message is not modified" error - if "Message is not modified" not in str(e): - raise - - elif action == "clienti": - # Sold clienți + listă cu paginare - from backend.modules.telegram.bot.helpers import get_clients_with_maturity - clients_data = await get_clients_with_maturity(company['id'], jwt_token) - - from backend.modules.telegram.bot.formatters import format_clients_balance_response, add_performance_footer - from backend.modules.telegram.bot.menus import create_client_list_keyboard, format_response_with_company - - content = format_clients_balance_response( - clients_data['clients'], - clients_data['maturity'] - ) - response = format_response_with_company(content, company['name']) - - # Add performance footer if cache metadata is available - if 'cache_hit' in clients_data and 'response_time_ms' in clients_data: - cache_hit = clients_data['cache_hit'] - response_time_ms = clients_data['response_time_ms'] - cache_source = clients_data.get('cache_source', None) - response = add_performance_footer(response, cache_hit, response_time_ms, cache_source) - - keyboard = create_client_list_keyboard(clients_data['clients'], page=0) - - await query.edit_message_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - elif action == "furnizori": - # Sold furnizori + listă cu paginare - from backend.modules.telegram.bot.helpers import get_suppliers_with_maturity - suppliers_data = await get_suppliers_with_maturity(company['id'], jwt_token) - - from backend.modules.telegram.bot.formatters import format_suppliers_balance_response, add_performance_footer - from backend.modules.telegram.bot.menus import create_supplier_list_keyboard, format_response_with_company - - content = format_suppliers_balance_response( - suppliers_data['suppliers'], - suppliers_data['maturity'] - ) - response = format_response_with_company(content, company['name']) - - # Add performance footer if cache metadata is available - if 'cache_hit' in suppliers_data and 'response_time_ms' in suppliers_data: - cache_hit = suppliers_data['cache_hit'] - response_time_ms = suppliers_data['response_time_ms'] - cache_source = suppliers_data.get('cache_source', None) - response = add_performance_footer(response, cache_hit, response_time_ms, cache_source) - - keyboard = create_supplier_list_keyboard(suppliers_data['suppliers'], page=0) - - await query.edit_message_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - elif action == "evolutie": - # Evoluție cash flow - from backend.modules.telegram.bot.helpers import get_cashflow_evolution_data - evolution_data = await get_cashflow_evolution_data(company['id'], jwt_token) - - from backend.modules.telegram.bot.formatters import format_cashflow_evolution_response, add_performance_footer - from backend.modules.telegram.bot.menus import create_action_buttons, format_response_with_company - - content = format_cashflow_evolution_response( - evolution_data['performance'], - evolution_data['monthly'] - ) - response = format_response_with_company(content, company['name']) - - # Add performance footer if cache metadata is available - if 'cache_hit' in evolution_data and 'response_time_ms' in evolution_data: - cache_hit = evolution_data['cache_hit'] - response_time_ms = evolution_data['response_time_ms'] - cache_source = evolution_data.get('cache_source', None) - response = add_performance_footer(response, cache_hit, response_time_ms, cache_source) - - keyboard = create_action_buttons("evolutie", show_export=False, show_refresh=False) - - await query.edit_message_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - elif action == "togglecache": - # Toggle cache pentru user - try: - client = get_backend_client() - async with client: - cache_stats = await client.get_cache_stats(jwt_token=jwt_token) - user_enabled = cache_stats.get('user_enabled', True) - - # Create toggle buttons - from telegram import InlineKeyboardButton, InlineKeyboardMarkup - keyboard = [ - [ - InlineKeyboardButton( - "✅ Activează" if not user_enabled else "❌ Dezactivează", - callback_data=f"cache_toggle:{'on' if not user_enabled else 'off'}" - ) - ], - [InlineKeyboardButton("« Înapoi la Meniu", callback_data="action:menu")] - ] - reply_markup = InlineKeyboardMarkup(keyboard) - - status = "ACTIVAT" if user_enabled else "DEZACTIVAT" - message = f"**Cache Status**\n\nCurent: {status}\n\n" - - if user_enabled: - message += "Vrei să dezactivezi cache-ul temporar?\nFolosește pentru teste de performanță." - else: - message += "Cache-ul este dezactivat.\nToate queries merg direct la Oracle." - - await query.edit_message_text( - message, - reply_markup=reply_markup, - parse_mode=ParseMode.MARKDOWN - ) - except Exception as e: - logger.error(f"Toggle cache menu error: {e}", exc_info=True) - await query.answer("Eroare la obținerea status cache.", show_alert=True) - - elif action == "clearcache": - # Clear cache - try: - # Create inline keyboard - from telegram import InlineKeyboardButton, InlineKeyboardMarkup - keyboard = [ - [ - InlineKeyboardButton("Toate companiile", callback_data="cache_clear:all"), - InlineKeyboardButton("Doar compania mea", callback_data="cache_clear:current") - ], - [InlineKeyboardButton("« Înapoi la Meniu", callback_data="action:menu")] - ] - reply_markup = InlineKeyboardMarkup(keyboard) - - message = "**🔄 Invalidare Cache**\n\n" - if company: - message += f"Compania curentă: {company['name']}\n\n" - message += "Alege scope:" - - await query.edit_message_text( - message, - reply_markup=reply_markup, - parse_mode=ParseMode.MARKDOWN - ) - except Exception as e: - logger.error(f"Clear cache menu error: {e}", exc_info=True) - await query.answer("Eroare la afișarea opțiuni cache.", show_alert=True) - - elif action == "select_company": - # ✅ MODIFICARE: Folosim funcția comună - await _handle_selectcompany_view( - query_or_update=query, - telegram_user_id=telegram_user_id, - jwt_token=jwt_token, - is_callback=True, - page=0, - search_term="" - ) - - elif action == "switch_server": - from telegram import InlineKeyboardButton, InlineKeyboardMarkup - from shared.auth.email_server_cache import email_server_cache - from backend.modules.telegram.bot.menus import pad_message_for_wide_buttons - - username = auth_data['username'] - - try: - servers = await email_server_cache.get_servers_for_username(username) - except Exception as e: - logger.error(f"Could not get servers for {username}: {e}") - await query.answer("Eroare la obținerea serverelor.", show_alert=True) - return - - if len(servers) <= 1: - await query.answer("Ești pe singurul server disponibil.", show_alert=True) - return - - # Build server selection keyboard - try: - from backend.config import settings - keyboard_rows = [] - for srv_id in servers: - srv = settings.get_oracle_server(srv_id) - srv_name = srv.name if srv else srv_id - keyboard_rows.append([InlineKeyboardButton(srv_name, callback_data=f"switch_server_confirm:{srv_id}")]) - except Exception: - keyboard_rows = [[InlineKeyboardButton(s, callback_data=f"switch_server_confirm:{s}")] for s in servers] - - keyboard_rows.append([InlineKeyboardButton("« Înapoi", callback_data="action:menu")]) - - await query.edit_message_text( - pad_message_for_wide_buttons(f"Selectează serverul Oracle:\n\nUtilizator: {username}"), - reply_markup=InlineKeyboardMarkup(keyboard_rows), - parse_mode=ParseMode.MARKDOWN - ) - - -async def handle_action_callback(query, telegram_user_id: int, callback_data: str): - """ - Handle action button clicks (Refresh, Export, Menu, Help, Login, Logout). - - Callback format: action:{type}:{view} - Types: refresh, export, menu, help, login, logout - - Args: - query: CallbackQuery object - telegram_user_id: Telegram user ID - callback_data: Callback data string - """ - parts = callback_data.split(":") - action_type = parts[1] - - if action_type == "menu": - # Back to main menu - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - # Check if user is authenticated - auth_data = await get_user_auth_data(telegram_user_id) - is_authenticated = auth_data is not None - - # Get cache status for user - cache_enabled = None - if is_authenticated: - try: - from backend.modules.telegram.api.client import get_backend_client - client = get_backend_client() - async with client: - cache_stats = await client.get_cache_stats(jwt_token=auth_data['jwt_token']) - cache_enabled = cache_stats.get('user_enabled', True) - except Exception as e: - logger.warning(f"Could not get cache status: {e}") - - from backend.modules.telegram.bot.menus import create_main_menu, get_menu_message - company_name = company['name'] if company else None - company_cui = company.get('cui') if company else None - keyboard = create_main_menu(company_name, company_cui, is_authenticated, cache_enabled) - menu_text = get_menu_message(company_name, company_cui) - - await query.edit_message_text( - menu_text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - elif action_type == "refresh": - # Refresh current view - view = parts[2] if len(parts) > 2 else "sold" - - # Check if it's a detail view (client_detail:name or supplier_detail:name) - if view.startswith("client_detail:"): - entity_name = view.split(":", 1)[1] # Extract entity name - # Limit name to 40 chars for Telegram callback_data limit (64 bytes) - safe_name = entity_name[:40] if len(entity_name) > 40 else entity_name - await handle_details_callback(query, telegram_user_id, f"details:client:{safe_name}:0") - elif view.startswith("supplier_detail:"): - entity_name = view.split(":", 1)[1] # Extract entity name - # Limit name to 40 chars for Telegram callback_data limit (64 bytes) - safe_name = entity_name[:40] if len(entity_name) > 40 else entity_name - await handle_details_callback(query, telegram_user_id, f"details:supplier:{safe_name}:0") - else: - # Regular menu view refresh - await handle_menu_callback(query, telegram_user_id, f"menu:{view}") - - elif action_type == "export": - # Export functionality (placeholder for now) - await query.answer("Functia de export va fi disponibila in curand", show_alert=True) - - elif action_type == "help": - # Show help message above menu (edit current message) - from backend.modules.telegram.bot.menus import pad_message_for_wide_buttons, create_main_menu - - # Get auth status and company info - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - auth_data = await get_user_auth_data(telegram_user_id) - is_authenticated = auth_data is not None - - company_name = company['name'] if company else None - company_cui = company.get('cui') if company else None - - keyboard = create_main_menu(company_name, company_cui, is_authenticated) - - help_text = pad_message_for_wide_buttons( - "**Ghid Rapid**\n\n" - "**Selectare Companie** - Alege compania activă\n\n" - "**Sold Companie** - Dashboard financiar complet\n" - "**Trezorerie Casa** - Situație conturi cash\n" - "**Trezorerie Banca** - Situație conturi bancare\n" - "**Sold Clienti** - Clienți + facturi neplătite\n" - "**Sold Furnizori** - Furnizori + facturi\n" - "**Evolutie Incasari** - Trend lunar încasări\n\n" - "**Logout** - Deconectează contul\n\n" - "_Toate datele sunt în timp real din Oracle._" - ) - - await query.edit_message_text( - help_text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - elif action_type == "logout": - # Show logout confirmation - from backend.modules.telegram.bot.menus import pad_message_for_wide_buttons - confirmation_text = pad_message_for_wide_buttons( - "**Confirmare Deconectare**\n\n" - "Ești sigur că vrei să deconectezi contul?\n\n" - "Accesul la date va fi oprit.\n" - "Poți reconecta oricând cu un cod nou." - ) - - keyboard = InlineKeyboardMarkup([ - [ - InlineKeyboardButton("Da, deconectează", callback_data="logout_confirm"), - InlineKeyboardButton("Anulează", callback_data="logout_cancel") - ] - ]) - - await query.edit_message_text( - confirmation_text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - # NOTE: action:login is handled by email_login_handler ConversationHandler - # See app/bot/email_handlers.py for the complete email authentication flow - - -async def handle_details_callback(query, telegram_user_id: int, callback_data: str): - """ - Handle client/supplier detail clicks. - - Callback format: details:{type}:{name}:{page} - Types: client, supplier - - Args: - query: CallbackQuery object - telegram_user_id: Telegram user ID - callback_data: Callback data string - """ - parts = callback_data.split(":") - detail_type = parts[1] # client or supplier - entity_name = parts[2] # client/supplier name - page = int(parts[3]) if len(parts) > 3 else 0 # invoice page number - - # Get auth data and company - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - if detail_type == "client": - # Get client details (from clients list) - # entity_name might be truncated to 40 chars, so search by startswith - from backend.modules.telegram.bot.helpers import get_clients_with_maturity - clients_data = await get_clients_with_maturity(company['id'], jwt_token) - - # Find client by full or partial name match - client = next((c for c in clients_data['clients'] if c['name'].startswith(entity_name)), None) - - if not client: - await query.answer("Client negăsit", show_alert=True) - return - - # Use FULL client name for invoice search (not truncated) - full_client_name = client['name'] - - # Get client invoices by FULL name - from backend.modules.telegram.bot.helpers import get_client_invoices - invoices = await get_client_invoices(company['id'], full_client_name, jwt_token) - - # Format response - from backend.modules.telegram.bot.formatters import format_client_detail_response - from backend.modules.telegram.bot.menus import create_action_buttons, format_response_with_company - - content = format_client_detail_response(client, invoices) - response = format_response_with_company(content, company['name']) - - # Use truncated name for callback_data (to stay within 64 byte limit) - safe_name = entity_name[:40] if len(entity_name) > 40 else entity_name - keyboard = create_action_buttons(f"client_detail:{safe_name}", show_export=False, show_back=True, show_refresh=False) - - await query.edit_message_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - elif detail_type == "supplier": - # Get supplier details (from suppliers list) - # entity_name might be truncated to 40 chars, so search by startswith - from backend.modules.telegram.bot.helpers import get_suppliers_with_maturity - suppliers_data = await get_suppliers_with_maturity(company['id'], jwt_token) - - # Find supplier by full or partial name match - supplier = next((s for s in suppliers_data['suppliers'] if s['name'].startswith(entity_name)), None) - - if not supplier: - await query.answer("Furnizor negăsit", show_alert=True) - return - - # Use FULL supplier name for invoice search (not truncated) - full_supplier_name = supplier['name'] - - # Get supplier invoices by FULL name - from backend.modules.telegram.bot.helpers import get_supplier_invoices - invoices = await get_supplier_invoices(company['id'], full_supplier_name, jwt_token) - - # Format response - from backend.modules.telegram.bot.formatters import format_supplier_detail_response - from backend.modules.telegram.bot.menus import create_action_buttons, format_response_with_company - - content = format_supplier_detail_response(supplier, invoices) - response = format_response_with_company(content, company['name']) - - # Use truncated name for callback_data (to stay within 64 byte limit) - safe_name = entity_name[:40] if len(entity_name) > 40 else entity_name - keyboard = create_action_buttons(f"supplier_detail:{safe_name}", show_export=False, show_back=True, show_refresh=False) - - await query.edit_message_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - -async def handle_invoice_callback(query, telegram_user_id: int, callback_data: str): - """ - Handle invoice detail clicks. - - Callback format: invoice:{partner_type}:{id} - - Args: - query: CallbackQuery object - telegram_user_id: Telegram user ID - callback_data: Callback data string - """ - parts = callback_data.split(":") - partner_type = parts[1] # CLIENTI or FURNIZORI - invoice_id = int(parts[2]) - - # Get invoice details from API (placeholder for now) - await query.answer("Detalii factura (in dezvoltare)", show_alert=True) - - -async def handle_navigation_back(query, telegram_user_id: int, callback_data: str): - """ - Handle back navigation. - - Callback format: nav:back:{location} - Locations: menu, clienti, furnizori - - Args: - query: CallbackQuery object - telegram_user_id: Telegram user ID - callback_data: Callback data string - """ - location = callback_data.split(":")[2] - - if location == "menu": - # Back to main menu - await handle_action_callback(query, telegram_user_id, "action:menu") - - elif location == "clienti": - # Back to clients list - await handle_menu_callback(query, telegram_user_id, "menu:clienti") - - elif location == "furnizori": - # Back to suppliers list - await handle_menu_callback(query, telegram_user_id, "menu:furnizori") - - -async def button_callback(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle inline button callbacks. - - Callback data formats: - - login_help - Show help on how to get link code - - login_prompt - Prompt user to enter link code - - login_back - Back to welcome message - - menu:{action} - Main menu buttons - - action:{type}:{view} - Action buttons (refresh, export, menu) - - details:{type}:{id} - Client/Supplier details - - invoice:{partner_type}:{id} - Invoice details - - nav:back:{location} - Navigation back - - select_company:{id} - Company selection (existing) - - unlink_confirm/unlink_cancel - Unlink confirmation (existing) - - Args: - update: Telegram update object - context: Telegram context - """ - try: - query = update.callback_query - callback_data = query.data - - # ========== IGNORE CALLBACKS HANDLED BY CONVERSATION HANDLER ========== - # These callbacks are managed by email_login_handler ConversationHandler - # Return immediately without answering to let ConversationHandler process them - conversation_patterns = [ - 'action:login', # Login button from menu - 'email_login', # Email login button - 'web_login_info', # Web app login info button - 'cancel', # Cancel button - ] - - # Check exact matches - if callback_data in conversation_patterns: - logger.info(f"[BUTTON_CALLBACK] Ignoring {callback_data} - handled by ConversationHandler") - return - - # Check prefix matches (e.g., resend:email@example.com) - if callback_data.startswith('resend:'): - logger.info(f"[BUTTON_CALLBACK] Ignoring {callback_data} - handled by ConversationHandler") - return - - # ========== PROCESS ALL OTHER CALLBACKS ========== - await query.answer() - - telegram_user_id = update.effective_user.id - - logger.info(f"Button callback: {callback_data} from user {telegram_user_id}") - - # ========== EXISTING CALLBACKS (preserve) ========== - - # Handle pagination for company selection - if callback_data.startswith("select_company_page:"): - # Extract page number - page = int(callback_data.split(":")[1]) - - # Get companies - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - client = get_backend_client() - async with client: - companies = await client.get_user_companies(jwt_token=jwt_token) - - # Create paginated keyboard for requested page - from backend.modules.telegram.bot.helpers import create_company_selection_keyboard_paginated - keyboard = create_company_selection_keyboard_paginated(companies, page=page) - - await query.edit_message_text( - f"**Selecteaza Compania**\n\n" - f"Companiile tale ({len(companies)}):", - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - elif callback_data == "select_company_alpha_menu": - # Show A-Z letter filter keyboard - from backend.modules.telegram.bot.helpers import create_alpha_filter_keyboard - await query.edit_message_text( - "**Selectează litera**\n\nAlege prima literă a firmei:", - reply_markup=create_alpha_filter_keyboard(), - parse_mode=ParseMode.MARKDOWN - ) - - elif callback_data.startswith("select_company_alpha:"): - # Filter companies by starting letter and show page 0 - letter = callback_data.split(":", 1)[1] # "A" or "ALL" - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - client = get_backend_client() - async with client: - all_companies = await client.get_user_companies(jwt_token=jwt_token) - - if letter == "ALL": - filtered = all_companies - else: - filtered = [ - c for c in all_companies - if c.get('name', c.get('nume_firma', '')).upper().startswith(letter) - ] - - if not filtered: - await query.answer(f"Nicio firmă cu litera {letter}.", show_alert=True) - return - - from backend.modules.telegram.bot.helpers import create_company_selection_keyboard_paginated - keyboard = create_company_selection_keyboard_paginated( - filtered, page=0, - back_callback="select_company_alpha_menu", - page_callback_prefix="select_company_alpha_page", - page_callback_suffix=f":{letter}" - ) - label = f"Firme cu litera {letter}" if letter != "ALL" else "Toate firmele" - await query.edit_message_text( - f"**{label}** ({len(filtered)}):", - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - elif callback_data.startswith("select_company_alpha_page:"): - # Paginate within an alpha-filtered company list - # Callback format: select_company_alpha_page:PAGE:LETTER - parts = callback_data.split(":") - page = int(parts[1]) - letter = parts[2] # "A"–"Z" or "ALL" - - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - client = get_backend_client() - async with client: - all_companies = await client.get_user_companies(jwt_token=jwt_token) - - if letter == "ALL": - filtered = all_companies - else: - filtered = [ - c for c in all_companies - if c.get('name', c.get('nume_firma', '')).upper().startswith(letter) - ] - - from backend.modules.telegram.bot.helpers import create_company_selection_keyboard_paginated - keyboard = create_company_selection_keyboard_paginated( - filtered, page=page, - back_callback="select_company_alpha_menu", - page_callback_prefix="select_company_alpha_page", - page_callback_suffix=f":{letter}" - ) - label = f"Firme cu litera {letter}" if letter != "ALL" else "Toate firmele" - await query.edit_message_text( - f"**{label}** ({len(filtered)}):", - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - elif callback_data == "clients_alpha_menu": - # Show A-Z letter filter keyboard for clients - from backend.modules.telegram.bot.helpers import create_alpha_filter_keyboard_partner - await query.edit_message_text( - "**Selecteaza litera**\n\nAlege prima litera a clientului:", - reply_markup=create_alpha_filter_keyboard_partner("clients"), - parse_mode=ParseMode.MARKDOWN - ) - - elif callback_data.startswith("clients_alpha:"): - # Filter clients by starting letter and show page 0 - letter = callback_data.split(":", 1)[1] # "A" or "ALL" - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - from backend.modules.telegram.bot.helpers import get_clients_with_maturity - clients_data = await get_clients_with_maturity(company['id'], jwt_token) - all_clients = clients_data['clients'] - - if letter == "ALL": - filtered = all_clients - else: - filtered = [ - c for c in all_clients - if c.get('name', '').upper().startswith(letter) - ] - - if not filtered: - await query.answer(f"Niciun client cu litera {letter}.", show_alert=True) - return - - from backend.modules.telegram.bot.menus import create_client_list_keyboard, format_response_with_company - from backend.modules.telegram.bot.formatters import format_clients_balance_response - content = format_clients_balance_response(filtered, clients_data['maturity']) - label = f"Clienti cu litera {letter}" if letter != "ALL" else "Toti clientii" - response = format_response_with_company(f"**{label}** ({len(filtered)}):\n\n{content}", company['name']) - keyboard = create_client_list_keyboard(filtered, page=0, letter=letter) - await query.edit_message_text(response, reply_markup=keyboard, parse_mode=ParseMode.MARKDOWN) - - elif callback_data.startswith("clients_alpha_page:"): - # Paginate within an alpha-filtered client list - # Callback format: clients_alpha_page:PAGE:LETTER - parts = callback_data.split(":") - page = int(parts[1]) - letter = parts[2] # "A"–"Z" or "ALL" - - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - from backend.modules.telegram.bot.helpers import get_clients_with_maturity - clients_data = await get_clients_with_maturity(company['id'], jwt_token) - all_clients = clients_data['clients'] - - if letter == "ALL": - filtered = all_clients - else: - filtered = [ - c for c in all_clients - if c.get('name', '').upper().startswith(letter) - ] - - from backend.modules.telegram.bot.menus import create_client_list_keyboard, format_response_with_company - from backend.modules.telegram.bot.formatters import format_clients_balance_response - content = format_clients_balance_response(filtered, clients_data['maturity']) - label = f"Clienti cu litera {letter}" if letter != "ALL" else "Toti clientii" - response = format_response_with_company(f"**{label}** ({len(filtered)}):\n\n{content}", company['name']) - keyboard = create_client_list_keyboard(filtered, page=page, letter=letter) - await query.edit_message_text(response, reply_markup=keyboard, parse_mode=ParseMode.MARKDOWN) - - elif callback_data == "suppliers_alpha_menu": - # Show A-Z letter filter keyboard for suppliers - from backend.modules.telegram.bot.helpers import create_alpha_filter_keyboard_partner - await query.edit_message_text( - "**Selecteaza litera**\n\nAlege prima litera a furnizorului:", - reply_markup=create_alpha_filter_keyboard_partner("suppliers"), - parse_mode=ParseMode.MARKDOWN - ) - - elif callback_data.startswith("suppliers_alpha:"): - # Filter suppliers by starting letter and show page 0 - letter = callback_data.split(":", 1)[1] # "A" or "ALL" - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - from backend.modules.telegram.bot.helpers import get_suppliers_with_maturity - suppliers_data = await get_suppliers_with_maturity(company['id'], jwt_token) - all_suppliers = suppliers_data['suppliers'] - - if letter == "ALL": - filtered = all_suppliers - else: - filtered = [ - s for s in all_suppliers - if s.get('name', '').upper().startswith(letter) - ] - - if not filtered: - await query.answer(f"Niciun furnizor cu litera {letter}.", show_alert=True) - return - - from backend.modules.telegram.bot.menus import create_supplier_list_keyboard, format_response_with_company - from backend.modules.telegram.bot.formatters import format_suppliers_balance_response - content = format_suppliers_balance_response(filtered, suppliers_data['maturity']) - label = f"Furnizori cu litera {letter}" if letter != "ALL" else "Toti furnizorii" - response = format_response_with_company(f"**{label}** ({len(filtered)}):\n\n{content}", company['name']) - keyboard = create_supplier_list_keyboard(filtered, page=0, letter=letter) - await query.edit_message_text(response, reply_markup=keyboard, parse_mode=ParseMode.MARKDOWN) - - elif callback_data.startswith("suppliers_alpha_page:"): - # Paginate within an alpha-filtered supplier list - # Callback format: suppliers_alpha_page:PAGE:LETTER - parts = callback_data.split(":") - page = int(parts[1]) - letter = parts[2] # "A"–"Z" or "ALL" - - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - from backend.modules.telegram.bot.helpers import get_suppliers_with_maturity - suppliers_data = await get_suppliers_with_maturity(company['id'], jwt_token) - all_suppliers = suppliers_data['suppliers'] - - if letter == "ALL": - filtered = all_suppliers - else: - filtered = [ - s for s in all_suppliers - if s.get('name', '').upper().startswith(letter) - ] - - from backend.modules.telegram.bot.menus import create_supplier_list_keyboard, format_response_with_company - from backend.modules.telegram.bot.formatters import format_suppliers_balance_response - content = format_suppliers_balance_response(filtered, suppliers_data['maturity']) - label = f"Furnizori cu litera {letter}" if letter != "ALL" else "Toti furnizorii" - response = format_response_with_company(f"**{label}** ({len(filtered)}):\n\n{content}", company['name']) - keyboard = create_supplier_list_keyboard(filtered, page=page, letter=letter) - await query.edit_message_text(response, reply_markup=keyboard, parse_mode=ParseMode.MARKDOWN) - - elif callback_data.startswith("select_company:"): - # Handle company selection - company_id = int(callback_data.split(":")[1]) - - # Get company details - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - client = get_backend_client() - async with client: - companies = await client.get_user_companies(jwt_token=jwt_token) - - # Find selected company - selected = next( - (c for c in companies if c.get('id_firma', c.get('id')) == company_id), - None - ) - - if selected: - # Set active company in session - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - - # Extract company data with backwards compatibility - company_name = selected.get('name', selected.get('nume_firma', 'N/A')) - company_cui = selected.get('fiscal_code', selected.get('cui')) - - session.set_active_company( - company_id=company_id, - company_name=company_name, - company_cui=company_cui - ) - await session_manager.save_session(telegram_user_id) - - # Show main menu directly (no confirmation message) - from backend.modules.telegram.bot.menus import create_main_menu, get_menu_message - keyboard = create_main_menu( - company_name=company_name, - company_cui=company_cui - ) - menu_text = get_menu_message(company_name, company_cui) - - await query.edit_message_text( - menu_text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - else: - await query.edit_message_text( - "Companie negasita sau nu ai acces la ea." - ) - - # ========== SWITCH SERVER CALLBACKS ========== - - elif callback_data.startswith("switch_server_confirm:"): - new_server_id = callback_data.split(":", 1)[1] - telegram_user_id = update.effective_user.id - - auth_data = await get_user_auth_data(telegram_user_id) - if not auth_data: - await query.edit_message_text("Sesiune expirată. Re-autentifică-te cu /login") - return - - # Stochează serverul țintă și cere parola — servere diferite pot avea parole diferite - context.user_data['pending_switch_server_id'] = new_server_id - context.user_data['pending_switch_jwt_token'] = auth_data['jwt_token'] - context.user_data['pending_switch_username'] = auth_data['username'] - - try: - from backend.config import settings - srv = settings.get_oracle_server(new_server_id) - srv_display = srv.name if srv else new_server_id - except Exception: - srv_display = new_server_id - - from telegram import ForceReply - await query.edit_message_text( - f"🔐 **Schimbare server: {srv_display}**\n\n" - f"Introdu parola Oracle pentru acest server:\n" - f"_(Mesajul cu parola va fi șters automat)_", - parse_mode=ParseMode.MARKDOWN - ) - # Salvează message_id-ul mesajului "🔐 Schimbare server" pentru editare ulterioară - context.user_data['pending_switch_message_id'] = query.message.message_id - context.user_data['pending_switch_chat_id'] = query.message.chat_id - - # Trimite un mesaj separat cu ForceReply pentru a forța input-ul - force_reply_msg = await context.bot.send_message( - chat_id=update.effective_chat.id, - text="Parolă:", - reply_markup=ForceReply(selective=True, input_field_placeholder="Parola Oracle...") - ) - # Salvează message_id-ul prompt-ului "Parolă:" pentru ștergere ulterioară - context.user_data['pending_switch_prompt_message_id'] = force_reply_msg.message_id - return - - # ========== LOGOUT CALLBACKS ========== - - elif callback_data == "logout_confirm": - # Logout user (same as unlink but shows menu after) - from backend.modules.telegram.auth.linking import unlink_user - - success = await unlink_user(telegram_user_id) - - if success: - # Clear session too - session_manager = get_session_manager() - await session_manager.delete_session(telegram_user_id) - - # Show login menu (non-authenticated) - from backend.modules.telegram.bot.menus import create_main_menu, get_menu_message, pad_message_for_wide_buttons - keyboard = create_main_menu(company_name=None, company_cui=None, is_authenticated=False) - menu_text = pad_message_for_wide_buttons( - "**Deconectat cu succes**\n\n" - "Contul tău a fost deconectat.\n\n" - "Pentru a te reconecta, apasă **Login**." - ) - - await query.edit_message_text( - menu_text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - else: - await query.edit_message_text( - "A apărut o eroare la deconectare.\n" - "Te rog încearcă din nou." - ) - - elif callback_data == "logout_cancel": - # Cancel logout - return to main menu - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - # Check auth - auth_data = await get_user_auth_data(telegram_user_id) - is_authenticated = auth_data is not None - - from backend.modules.telegram.bot.menus import create_main_menu, get_menu_message - company_name = company['name'] if company else None - company_cui = company.get('cui') if company else None - keyboard = create_main_menu(company_name, company_cui, is_authenticated) - menu_text = get_menu_message(company_name, company_cui) - - await query.edit_message_text( - menu_text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - # ========== UNLINK CALLBACKS (LEGACY) ========== - - elif callback_data == "unlink_confirm": - # Unlink user - from backend.modules.telegram.auth.linking import unlink_user - - success = await unlink_user(telegram_user_id) - - if success: - # Clear session too - session_manager = get_session_manager() - await session_manager.delete_session(telegram_user_id) - - await query.edit_message_text( - "**Cont deconectat cu succes**\n\n" - "Datele tale au fost șterse din sistem.\n\n" - "Pentru a te reconecta, folosește `/start CODUL_TAU`", - parse_mode=ParseMode.MARKDOWN - ) - else: - await query.edit_message_text( - "A aparut o eroare la deconectare.\n" - "Te rog incearca din nou." - ) - - elif callback_data == "unlink_cancel": - await query.edit_message_text( - "Deconectare anulata.\n\n" - "Contul tau ramane linkuit." - ) - - # ========== LOGIN CALLBACKS ========== - - elif callback_data == "login_help": - # Show detailed help on how to get link code - await query.edit_message_text( - "**Cum obțin codul de link?**\n\n" - "1. Loghează-te în aplicația web ROA2WEB\n" - "2. Mergi la: Setări → Telegram Linking\n" - "3. Apasă **Generează Cod**\n" - "4. Vei primi un cod din 8 caractere (ex: ABC12XYZ)\n" - "5. Trimite-mi comanda: `/start CODUL_TAU`\n\n" - "**Important:** Codul expiră în 15 minute.", - reply_markup=InlineKeyboardMarkup([ - [InlineKeyboardButton("Am deja cod - Linkez acum", callback_data="login_prompt")], - [InlineKeyboardButton("« Înapoi la Meniu", callback_data="action:menu")] - ]), - parse_mode=ParseMode.MARKDOWN - ) - - elif callback_data == "login_prompt": - # Prompt user to enter link code directly - from telegram import ForceReply - - await query.edit_message_text( - "**Conectare Cont ROA2WEB**\n\n" - "Trimite-mi codul primit din aplicatia web.\n\n" - "Poti trimite:\n" - "- Doar codul: ABC12XYZ\n" - "- Sau comanda: /start ABC12XYZ\n\n" - "Codul expira in 15 minute.", - parse_mode=ParseMode.MARKDOWN - ) - - # Send a follow-up message with ForceReply to prompt input - await context.bot.send_message( - chat_id=telegram_user_id, - text="Scrie sau lipeste codul aici:", - reply_markup=ForceReply( - selective=True, - input_field_placeholder="ABC12XYZ" - ) - ) - - elif callback_data == "login_back": - # Go back to welcome message - keyboard = InlineKeyboardMarkup([ - [InlineKeyboardButton("Cum obtin codul de link?", callback_data="login_help")], - [InlineKeyboardButton("Am deja cod - Linkez contul", callback_data="login_prompt")] - ]) - - await query.edit_message_text( - "**Bun venit la ROA2WEB Bot!**\n\n" - "Sunt asistentul tau financiar pentru sistemul ERP ROA2WEB.\n\n" - "**Pentru a incepe, trebuie sa-ti linkezi contul Telegram cu contul tau ROA2WEB.**\n\n" - "Alege o optiune:", - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - # ========== NEW CALLBACKS (FAZA 4) ========== - - # NIVEL 1: Main Menu Buttons - elif callback_data.startswith("menu:"): - await handle_menu_callback(query, telegram_user_id, callback_data) - - # Action Buttons - elif callback_data.startswith("action:"): - await handle_action_callback(query, telegram_user_id, callback_data) - - # NIVEL 2: Client/Supplier Details - elif callback_data.startswith("details:"): - await handle_details_callback(query, telegram_user_id, callback_data) - - # NIVEL 3: Invoice Details - elif callback_data.startswith("invoice:"): - await handle_invoice_callback(query, telegram_user_id, callback_data) - - # Navigation Back - elif callback_data.startswith("nav:back:"): - await handle_navigation_back(query, telegram_user_id, callback_data) - - # ========== CACHE CALLBACKS (FAZA 6) ========== - - elif callback_data.startswith("cache_toggle:"): - # Handle cache toggle button - action = callback_data.split(":")[1] - enabled = action == "on" - - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - try: - client = get_backend_client() - async with client: - await client.toggle_user_cache(jwt_token=jwt_token, enabled=enabled) - - status = "activat" if enabled else "dezactivat" - message = f"✅ **Cache {status}** pentru tine.\n\n" - - if enabled: - message += "Queries vor fi servite din cache când e posibil." - else: - message += "Toate queries vor merge direct la Oracle.\nFolosește /togglecache din nou pentru reactivare." - - # Add back button - keyboard = InlineKeyboardMarkup([ - [InlineKeyboardButton("« Înapoi la Meniu", callback_data="action:menu")] - ]) - - await query.edit_message_text( - message, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - except Exception as e: - logger.error(f"Toggle cache callback error: {e}", exc_info=True) - await query.answer("❌ Eroare la modificarea setării cache.", show_alert=True) - - elif callback_data.startswith("cache_clear:"): - # Handle clear cache button - scope = callback_data.split(":")[1] - - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - try: - client = get_backend_client() - - if scope == "all": - # Clear all cache - async with client: - await client.invalidate_cache(jwt_token=jwt_token, company_id=None) - message = "✅ Cache invalidat pentru **toate companiile**.\n\nDatele vor fi refreshate la următoarea interogare." - - elif scope == "current": - # Clear only current company - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - if not company: - await query.answer("Nu ai o companie selectată.", show_alert=True) - return - - async with client: - await client.invalidate_cache(jwt_token=jwt_token, company_id=company['id']) - message = f"✅ Cache invalidat pentru **{company['name']}**.\n\nDatele vor fi refreshate la următoarea interogare." - - # Add back button - keyboard = InlineKeyboardMarkup([ - [InlineKeyboardButton("« Înapoi la Meniu", callback_data="action:menu")] - ]) - - await query.edit_message_text( - message, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - except Exception as e: - logger.error(f"Clear cache callback error: {e}", exc_info=True) - await query.answer("❌ Eroare la ștergerea cache-ului.", show_alert=True) - - # ========== PAGINATION CALLBACKS ========== - - elif callback_data.startswith("clients_page:"): - # Handle clients pagination - page = int(callback_data.split(":")[1]) - - # Get auth data and company - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - # Get clients with maturity - from backend.modules.telegram.bot.helpers import get_clients_with_maturity - clients_data = await get_clients_with_maturity(company['id'], jwt_token) - - from backend.modules.telegram.bot.formatters import format_clients_balance_response - from backend.modules.telegram.bot.menus import create_client_list_keyboard, format_response_with_company - - content = format_clients_balance_response( - clients_data['clients'], - clients_data['maturity'] - ) - response = format_response_with_company(content, company['name']) - keyboard = create_client_list_keyboard(clients_data['clients'], page=page) - - await query.edit_message_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - elif callback_data.startswith("suppliers_page:"): - # Handle suppliers pagination - page = int(callback_data.split(":")[1]) - - # Get auth data and company - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - # Get suppliers with maturity - from backend.modules.telegram.bot.helpers import get_suppliers_with_maturity - suppliers_data = await get_suppliers_with_maturity(company['id'], jwt_token) - - from backend.modules.telegram.bot.formatters import format_suppliers_balance_response - from backend.modules.telegram.bot.menus import create_supplier_list_keyboard, format_response_with_company - - content = format_suppliers_balance_response( - suppliers_data['suppliers'], - suppliers_data['maturity'] - ) - response = format_response_with_company(content, company['name']) - keyboard = create_supplier_list_keyboard(suppliers_data['suppliers'], page=page) - - await query.edit_message_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - elif callback_data.startswith("invoices_page:"): - # Handle invoices pagination - # Format: invoices_page:PARTNER_TYPE:PARTNER_NAME:PAGE - parts = callback_data.split(":") - partner_type = parts[1] # CLIENTI or FURNIZORI - partner_name = parts[2] - page = int(parts[3]) - - # Get auth data and company - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - # Get invoices for this partner - if partner_type == "CLIENTI": - from backend.modules.telegram.bot.helpers import get_client_invoices, get_clients_with_maturity - invoices = await get_client_invoices(company['id'], partner_name, jwt_token) - - # Get client details - clients_data = await get_clients_with_maturity(company['id'], jwt_token) - partner = next((c for c in clients_data['clients'] if c['name'] == partner_name), None) - - from backend.modules.telegram.bot.formatters import format_client_detail_response - content = format_client_detail_response(partner, invoices) - else: - from backend.modules.telegram.bot.helpers import get_supplier_invoices, get_suppliers_with_maturity - invoices = await get_supplier_invoices(company['id'], partner_name, jwt_token) - - # Get supplier details - suppliers_data = await get_suppliers_with_maturity(company['id'], jwt_token) - partner = next((s for s in suppliers_data['suppliers'] if s['name'] == partner_name), None) - - from backend.modules.telegram.bot.formatters import format_supplier_detail_response - content = format_supplier_detail_response(partner, invoices) - - from backend.modules.telegram.bot.menus import create_invoice_list_keyboard, format_response_with_company - response = format_response_with_company(content, company['name']) - keyboard = create_invoice_list_keyboard(invoices, partner_type, partner_name, page=page) - - await query.edit_message_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - elif callback_data == "noop": - # No operation - just acknowledge - pass - - except Exception as e: - logger.error(f"Error in button_callback: {e}", exc_info=True) - - -# ============================================================================ -# ERROR HANDLER -# ============================================================================ - -async def error_handler(update: Update, context: ContextTypes.DEFAULT_TYPE): - """ - Handle errors in bot operations. - - Args: - update: Telegram update object - context: Telegram context with error - """ - logger.error(f"Update {update} caused error {context.error}", exc_info=context.error) - - # Try to send error message to user - try: - if update and update.effective_message: - await update.effective_message.reply_text( - "**A aparut o eroare tehnica**\n\n" - "Te rog incearca din nou sau contacteaza support.\n\n" - "Daca problema persista, foloseste /clear pentru a reseta conversatia.", - parse_mode=ParseMode.MARKDOWN - ) - except Exception as e: - logger.error(f"Failed to send error message to user: {e}") - - -# ============================================================================ -# COMMON HANDLER FUNCTIONS (pentru consistență comenzi/butoane) -# ============================================================================ - -async def _handle_expired_auth(query_or_update, telegram_user_id: int, auth_data: Optional[Dict[str, Any]]) -> bool: - """ - Check if auth_data is None (token expired/refresh failed) and send user-friendly message. - - Args: - query_or_update: Update (command) or CallbackQuery (button) - telegram_user_id: Telegram user ID - auth_data: Authentication data from get_user_auth_data() - - Returns: - True if auth is expired (stop execution), False if auth is valid (continue) - """ - if auth_data is None: - logger.warning(f"Auth expired for user {telegram_user_id}, sending re-authentication message") - - # Create re-authentication message - message = ( - "⚠️ **Sesiunea ta a expirat**\n\n" - "Token-ul de autentificare a expirat și nu a putut fi reînnoit automat.\n\n" - "**Pentru a continua:**\n" - "1. Accesează aplicația web ROA2WEB\n" - "2. Loginează-te cu contul tău Oracle\n" - "3. Generează un nou cod de link pentru Telegram\n" - "4. Trimite comanda `/start CODUL_TAU`\n\n" - "_Sau folosește `/unlink` pentru a deconecta contul actual._" - ) - - # Send message based on source type - from telegram import CallbackQuery - if isinstance(query_or_update, CallbackQuery): - # It's a button callback - transform menu to Login menu - await query_or_update.answer("Sesiunea a expirat. Te rog să te reconectezi.", show_alert=True) - - # Transform the current message (menu) to Login menu - from backend.modules.telegram.bot.menus import create_main_menu, pad_message_for_wide_buttons - keyboard = create_main_menu(company_name=None, company_cui=None, is_authenticated=False) - menu_text = pad_message_for_wide_buttons( - "⚠️ **Sesiunea a expirat**\n\n" - "Pentru a continua, apasă **Login**\n" - "și urmează instrucțiunile." - ) - - await query_or_update.edit_message_text( - menu_text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - else: - # It's a command (Update) - just send message - await query_or_update.message.reply_text(message, parse_mode=ParseMode.MARKDOWN) - - return True # Stop execution - - return False # Continue execution - - -async def _handle_sold_view( - query_or_update, - telegram_user_id: int, - company: Dict[str, Any], - jwt_token: str, - is_callback: bool = False -): - """ - Common handler pentru sold view (dashboard). - - Folosit de: - - Comanda /dashboard - - Comanda /sold - - Butonul menu:sold - - Args: - query_or_update: Query (callback) sau Update (command) - telegram_user_id: Telegram user ID - company: Dict cu id, name, cui - jwt_token: JWT token - is_callback: True dacă e apelat din callback, False dacă e command - """ - try: - client = get_backend_client() - async with client: - data = await client.get_dashboard_data( - company_id=company['id'], - jwt_token=jwt_token - ) - - if not data: - error_msg = "Eroare la incarcarea dashboard-ului." - if is_callback: - await query_or_update.edit_message_text(error_msg) - else: - await query_or_update.message.reply_text(error_msg) - return - - from backend.modules.telegram.bot.formatters import format_dashboard_response, add_performance_footer - from backend.modules.telegram.bot.menus import create_action_buttons, format_response_with_company - - # Extract cache metadata - cache_hit = data.get('cache_hit', False) - response_time_ms = data.get('response_time_ms', 0) - cache_source = data.get('cache_source', None) - - content = format_dashboard_response(data) - response = format_response_with_company(content, company['name']) - - # Add performance footer - if response_time_ms > 0: - response = add_performance_footer(response, cache_hit, response_time_ms, cache_source) - keyboard = create_action_buttons("sold", show_export=False, show_refresh=False) - - if is_callback: - await query_or_update.edit_message_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - else: - await query_or_update.message.reply_text( - response, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in _handle_sold_view: {e}", exc_info=True) - error_msg = "Eroare la incarcarea dashboard-ului." - if is_callback: - await query_or_update.answer(error_msg, show_alert=True) - else: - await query_or_update.message.reply_text(error_msg) - - -async def _handle_selectcompany_view( - query_or_update, - telegram_user_id: int, - jwt_token: str, - is_callback: bool = False, - page: int = 0, - search_term: str = "", - header: str = "", - bot=None, - edit_chat_id: int = None, - edit_message_id: int = None -): - """ - Common handler pentru company selection cu paginare. - - Folosit de: - - Comanda /selectcompany - - Butonul menu:select_company - - Callback-urile de paginare (select_company_page:N) - - Args: - query_or_update: Query (callback) sau Update (command) - telegram_user_id: Telegram user ID - jwt_token: JWT token - is_callback: True dacă e apelat din callback, False dacă e command - page: Numărul paginii (0-indexed) - search_term: Termen de căutare (opțional) - """ - try: - client = get_backend_client() - async with client: - companies = await client.get_user_companies(jwt_token=jwt_token) - - # Apply search filter if provided - if search_term: - from backend.modules.telegram.bot.helpers import search_companies_by_name - companies = await search_companies_by_name(search_term, jwt_token) - - if not companies: - error_msg = f"Nu am gasit companii care contin '{search_term}'.\n\n" \ - "Incearca alt termen sau /selectcompany pentru lista completa." - if is_callback: - await query_or_update.answer(error_msg, show_alert=True) - else: - await query_or_update.message.reply_text(error_msg) - return - - if not companies: - error_msg = "Nu ai acces la nicio companie.\nContacteaza administratorul." - if is_callback: - await query_or_update.edit_message_text( - error_msg, - parse_mode=ParseMode.MARKDOWN - ) - else: - await query_or_update.message.reply_text( - error_msg, - parse_mode=ParseMode.MARKDOWN - ) - return - - # Auto-selectează dacă există exact o singură firmă - if len(companies) == 1: - selected = companies[0] - company_id = selected.get('id_firma', selected.get('id')) - company_name = selected.get('name', selected.get('nume_firma', 'N/A')) - company_cui = selected.get('fiscal_code', selected.get('cui')) - - session_manager = get_session_manager() - session = await session_manager.get_or_create_session(telegram_user_id) - session.set_active_company( - company_id=company_id, - company_name=company_name, - company_cui=company_cui - ) - await session_manager.save_session(telegram_user_id) - - from backend.modules.telegram.bot.menus import create_main_menu, get_menu_message - keyboard = create_main_menu(company_name=company_name, company_cui=company_cui) - menu_text = header + f"Firma selectata automat: **{company_name}**\n\n" + get_menu_message(company_name, company_cui) - - if is_callback: - await query_or_update.edit_message_text( - menu_text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - elif bot and edit_chat_id and edit_message_id: - await bot.edit_message_text( - chat_id=edit_chat_id, - message_id=edit_message_id, - text=menu_text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - else: - await query_or_update.message.reply_text( - menu_text, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - return - - from backend.modules.telegram.bot.helpers import create_company_selection_keyboard_paginated - keyboard = create_company_selection_keyboard_paginated(companies, page=page) - - message = header + f"**Selecteaza Compania**\n\n" - if search_term: - message += f"Rezultate '{search_term}' ({len(companies)}):" - else: - message += f"Companiile tale ({len(companies)}):" - - if is_callback: - await query_or_update.edit_message_text( - message, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - elif bot and edit_chat_id and edit_message_id: - await bot.edit_message_text( - chat_id=edit_chat_id, - message_id=edit_message_id, - text=message, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - else: - await query_or_update.message.reply_text( - message, - reply_markup=keyboard, - parse_mode=ParseMode.MARKDOWN - ) - - except Exception as e: - logger.error(f"Error in _handle_selectcompany_view: {e}", exc_info=True) - error_msg = "A aparut o eroare. Te rog incearca din nou." - if is_callback: - await query_or_update.answer(error_msg, show_alert=True) - else: - await query_or_update.message.reply_text(error_msg) - - -# Export all handlers -__all__ = [ - 'start_command', - 'help_command', - 'clear_command', - 'companies_command', - 'unlink_command', - 'selectcompany_command', - 'dashboard_command', - 'sold_command', - 'facturi_command', - 'trezorerie_command', - # FAZA 3: New command handlers with button interface - 'menu_command', - 'trezorerie_casa_command', - 'trezorerie_banca_command', - 'clienti_command', - 'furnizori_command', - 'evolutie_command', - # Text message handlers - 'handle_text_message', - # FAZA 4: Callback helper functions - 'handle_menu_callback', - 'handle_action_callback', - 'handle_details_callback', - 'handle_invoice_callback', - 'handle_navigation_back', - # Callback and error handlers - 'button_callback', - 'error_handler', - # Common handler functions - '_handle_sold_view', - '_handle_selectcompany_view' -] diff --git a/deploy-package-20260223-151231/backend/modules/telegram/bot/helpers.py b/deploy-package-20260223-151231/backend/modules/telegram/bot/helpers.py deleted file mode 100644 index 710186a..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/bot/helpers.py +++ /dev/null @@ -1,877 +0,0 @@ -""" -Helper functions for Telegram bot command handlers. -Provides utilities for company selection, API calls, and response formatting. -""" - -import logging -from typing import Optional, Dict, List, Any -from telegram import Update, InlineKeyboardButton, InlineKeyboardMarkup - -from backend.modules.telegram.api.client import get_backend_client -from backend.modules.telegram.agent.session import SessionManager -from backend.modules.telegram.bot.menus import pad_message_for_wide_buttons - -logger = logging.getLogger(__name__) - - -async def get_active_company_or_prompt( - update: Update, - session_manager: SessionManager, - telegram_user_id: int -) -> Optional[Dict[str, Any]]: - """ - Get active company from session or prompt user to select one with buttons. - - This function checks if the user has an active company set in their session. - If not, it fetches companies and displays selection buttons directly. - - Args: - update: Telegram Update object (for sending messages) - session_manager: SessionManager instance - telegram_user_id: Telegram user ID - - Returns: - Dict with company info (id, name, cui) if set, None if user needs to select - - Example: - company = await get_active_company_or_prompt(update, session_manager, user_id) - if not company: - return # User was shown company selection buttons - # Continue with company operations... - """ - session = await session_manager.get_or_create_session(telegram_user_id) - company = session.get_active_company() - - if not company: - # Get auth data and companies - from backend.modules.telegram.auth.linking import get_user_auth_data - auth_data = await get_user_auth_data(telegram_user_id) - jwt_token = auth_data['jwt_token'] - - client = get_backend_client() - async with client: - companies = await client.get_user_companies(jwt_token=jwt_token) - - if companies: - keyboard = create_company_selection_keyboard_paginated(companies, page=0) - message = ( - f"**Selecteaza mai intai o companie**\n\n" - f"Companiile tale ({len(companies)}):" - ) - # Apply padding to make inline keyboard buttons wider - message = pad_message_for_wide_buttons(message) - await update.message.reply_text( - message, - reply_markup=keyboard, - parse_mode="Markdown" - ) - else: - await update.message.reply_text( - "Nu ai acces la nicio companie.\n" - "Contacteaza administratorul.", - parse_mode="Markdown" - ) - return None - - return company - - -async def search_companies_by_name( - name_query: str, - jwt_token: str -) -> List[Dict[str, Any]]: - """ - Search companies by partial name match (case-insensitive). - - Fetches all companies from backend and filters them by name. - Uses case-insensitive partial matching for flexible search. - - Args: - name_query: Search term (partial match, e.g., "ACME") - jwt_token: JWT authentication token - - Returns: - List of matching company dicts (each with id, nume_firma, cui, etc.) - - Example: - companies = await search_companies_by_name("acme", token) - # Returns all companies with "acme" in their name (case-insensitive) - """ - client = get_backend_client() - async with client: - all_companies = await client.get_user_companies(jwt_token=jwt_token) - - # Filter by name (case-insensitive partial match) - query_lower = name_query.lower() - matches = [ - comp for comp in all_companies - if query_lower in comp.get('name', comp.get('nume_firma', '')).lower() - ] - - logger.info( - f"Search '{name_query}': {len(matches)} matches out of {len(all_companies)} total" - ) - - return matches - - -def create_company_selection_keyboard( - companies: List[Dict[str, Any]], - max_buttons: int = 10 -) -> InlineKeyboardMarkup: - """ - Create inline keyboard for company selection (legacy - without pagination). - - Generates a vertical list of buttons, one per company. - Each button shows company name and CUI, and triggers a callback. - - NOTE: This function is deprecated in favor of create_company_selection_keyboard_paginated. - It's kept for backwards compatibility only. - - Args: - companies: List of company dicts (with id, nume_firma, cui) - max_buttons: Maximum number of buttons to show (default: 10) - - Returns: - InlineKeyboardMarkup with company selection buttons - - Example: - keyboard = create_company_selection_keyboard(companies) - await update.message.reply_text("Select company:", reply_markup=keyboard) - """ - keyboard = [] - - for company in companies[:max_buttons]: - company_id = company.get('id_firma', company.get('id')) - company_name = company.get('name', company.get('nume_firma', 'N/A')) - company_cui = company.get('fiscal_code', company.get('cui', '')) - - # Button text: "ACME SRL (CUI: 12345)" - button_text = f"{company_name}" - if company_cui: - button_text += f" ({company_cui})" - - # Callback data: "select_company:123" - callback_data = f"select_company:{company_id}" - - keyboard.append([InlineKeyboardButton(button_text, callback_data=callback_data)]) - - # Add overflow indicator if there are more companies - if len(companies) > max_buttons: - keyboard.append([InlineKeyboardButton( - f"... și încă {len(companies) - max_buttons} companii", - callback_data="noop" - )]) - - return InlineKeyboardMarkup(keyboard) - - -def create_company_selection_keyboard_paginated( - companies: List[Dict[str, Any]], - page: int = 0, - per_page: int = 20, - back_callback: str = "action:menu", - page_callback_prefix: str = "select_company_page", - page_callback_suffix: str = "" -) -> InlineKeyboardMarkup: - """ - Create paginated inline keyboard for company selection. - - Generates a vertical list of buttons for one page of companies, - with navigation buttons for previous/next pages. - - Args: - companies: Full list of company dicts (with id, nume_firma, cui) - page: Current page number (0-indexed) - per_page: Number of companies per page (default: 20) - back_callback: Callback data for the back button (default: "action:menu") - page_callback_prefix: Prefix for pagination callbacks (default: "select_company_page") - page_callback_suffix: Suffix appended after page number in pagination callbacks - - Returns: - InlineKeyboardMarkup with company buttons and pagination controls - - Example: - keyboard = create_company_selection_keyboard_paginated(companies, page=0) - await update.message.reply_text("Select company:", reply_markup=keyboard) - """ - keyboard = [] - - # Calculate pagination - total_companies = len(companies) - total_pages = (total_companies + per_page - 1) // per_page # Ceiling division - start_idx = page * per_page - end_idx = min(start_idx + per_page, total_companies) - - # Display companies for current page - page_companies = companies[start_idx:end_idx] - - for company in page_companies: - company_id = company.get('id_firma', company.get('id')) - company_name = company.get('name', company.get('nume_firma', 'N/A')) - company_cui = company.get('fiscal_code', company.get('cui', '')) - - # Button text: "ACME SRL (CUI: 12345)" - button_text = f"{company_name}" - if company_cui: - button_text += f" ({company_cui})" - - # Callback data: "select_company:123" - callback_data = f"select_company:{company_id}" - - keyboard.append([InlineKeyboardButton(button_text, callback_data=callback_data)]) - - # Pagination controls (only if more than one page) - if total_pages > 1: - nav_buttons = [] - - # Previous button - if page > 0: - prev_cb = f"{page_callback_prefix}:{page-1}{page_callback_suffix}" - nav_buttons.append( - InlineKeyboardButton("< Anterior", callback_data=prev_cb) - ) - - # Page indicator (non-clickable) - nav_buttons.append( - InlineKeyboardButton(f"Pagina {page+1}/{total_pages}", callback_data="noop") - ) - - # Next button - if page < total_pages - 1: - next_cb = f"{page_callback_prefix}:{page+1}{page_callback_suffix}" - nav_buttons.append( - InlineKeyboardButton("Urmator >", callback_data=next_cb) - ) - - keyboard.append(nav_buttons) - - # A-Z filter + back button - keyboard.append([ - InlineKeyboardButton("Filtrare A-Z", callback_data="select_company_alpha_menu") - ]) - keyboard.append([ - InlineKeyboardButton("« Înapoi", callback_data=back_callback) - ]) - - return InlineKeyboardMarkup(keyboard) - - -def create_alpha_filter_keyboard() -> InlineKeyboardMarkup: - """ - Create inline keyboard with A–Z letter buttons for filtering companies. - - Displays 26 letter buttons in rows of 6, plus a 'Toată lista' button - that shows all companies without filtering. - - Returns: - InlineKeyboardMarkup with letter buttons and navigation - """ - letters = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ") - keyboard = [] - row_size = 6 - for i in range(0, len(letters), row_size): - row = [ - InlineKeyboardButton(l, callback_data=f"select_company_alpha:{l}") - for l in letters[i:i + row_size] - ] - keyboard.append(row) - keyboard.append([ - InlineKeyboardButton("Toată lista", callback_data="select_company_alpha:ALL"), - InlineKeyboardButton("« Meniu", callback_data="action:menu") - ]) - return InlineKeyboardMarkup(keyboard) - - -def create_alpha_filter_keyboard_partner(partner_type: str) -> InlineKeyboardMarkup: - """ - Create inline keyboard with A–Z letter buttons for filtering clients or suppliers. - - Args: - partner_type: "clients" or "suppliers" - - Returns: - InlineKeyboardMarkup with letter buttons and navigation - """ - letters = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ") - keyboard = [] - row_size = 6 - for i in range(0, len(letters), row_size): - row = [ - InlineKeyboardButton(l, callback_data=f"{partner_type}_alpha:{l}") - for l in letters[i:i + row_size] - ] - keyboard.append(row) - keyboard.append([ - InlineKeyboardButton("Toata lista", callback_data=f"{partner_type}_alpha:ALL"), - InlineKeyboardButton("« Meniu", callback_data="action:menu") - ]) - return InlineKeyboardMarkup(keyboard) - - -def format_company_context_footer(company_name: str) -> str: - """ - Format discrete footer with company context. - - Adds a subtle footer to command responses showing the active company - and a quick link to change it. - - Args: - company_name: Active company name - - Returns: - Formatted footer string with separator and company name - - Example: - footer = format_company_context_footer("ACME SRL") - message = f"Dashboard data...\n{footer}" - # Output: "Dashboard data...\n\n━━━━━━━━━━━━━━\nCompanie: ACME SRL" - """ - return f"\n\n━━━━━━━━━━━━━━\nCompanie: {company_name}" - - -# ========================================================================= -# FAZA 2: New Helper Functions for Button Interface -# ========================================================================= - - -async def get_treasury_breakdown_split( - company_id: int, - jwt_token: str -) -> Optional[Dict[str, Any]]: - """ - Get treasury breakdown split into casa and banca. - - Fetches treasury breakdown from backend and transforms it - to the format expected by formatters. - - Backend returns: - { - "total": float, - "breakdown": { - "casa": {"total": float, "items": [{"nume": str, "cont": str, "sold": float}]}, - "banca": {"total": float, "items": [{"nume": str, "cont": str, "sold": float}]} - }, - "currency": "RON" - } - - Args: - company_id: Company ID - jwt_token: JWT authentication token - - Returns: - Dict with two keys: - - 'casa': Dict with 'accounts' (list) and 'total' (float) - - 'banca': Dict with 'accounts' (list) and 'total' (float) - - None if request fails - - Example: - data = await get_treasury_breakdown_split(1, token) - casa_total = data['casa']['total'] # Total cash balance - bank_accounts = data['banca']['accounts'] # List of bank accounts - """ - try: - client = get_backend_client() - async with client: - breakdown = await client.get_treasury_breakdown( - company_id=company_id, - jwt_token=jwt_token - ) - - if not breakdown: - return None - - # Backend already splits data into casa and banca - # Transform backend structure to match formatter expectations - breakdown_data = breakdown.get('breakdown', {}) - casa_data = breakdown_data.get('casa', {}) - banca_data = breakdown_data.get('banca', {}) - - # Transform items to accounts format (nume->name, sold->balance) - casa_accounts = [ - { - 'name': item.get('nume', f"Cont {item.get('cont', 'N/A')}"), - 'balance': float(item.get('sold', 0)), - 'cont': item.get('cont', '') - } - for item in casa_data.get('items', []) - ] - - banca_accounts = [ - { - 'name': item.get('nume', f"Cont {item.get('cont', 'N/A')}"), - 'balance': float(item.get('sold', 0)), - 'cont': item.get('cont', '') - } - for item in banca_data.get('items', []) - ] - - result = { - 'casa': { - 'accounts': casa_accounts, - 'total': float(casa_data.get('total', 0)) - }, - 'banca': { - 'accounts': banca_accounts, - 'total': float(banca_data.get('total', 0)) - } - } - - # Pass through cache metadata if present - if 'cache_hit' in breakdown: - result['cache_hit'] = breakdown['cache_hit'] - if 'response_time_ms' in breakdown: - result['response_time_ms'] = breakdown['response_time_ms'] - if 'cache_source' in breakdown: - result['cache_source'] = breakdown['cache_source'] - - return result - - except Exception as e: - logger.error(f"Error getting treasury breakdown split: {e}", exc_info=True) - return None - - -async def get_clients_with_maturity( - company_id: int, - jwt_token: str -) -> Optional[Dict[str, Any]]: - """ - Get clients list with maturity breakdown. - - Uses maturity analysis endpoint which returns client summaries - with amounts and overdue status. - - Backend returns: - { - "clients": [{"name": str, "amount": float, "dueDate": str, "daysOverdue": int}], - "suppliers": [...], - "balance": float, - "metadata": {...} - } - - Args: - company_id: Company ID - jwt_token: JWT authentication token - - Returns: - Dict with: - - 'clients': List of client dicts (id, name, balance) - - 'maturity': Dict with 'in_term', 'overdue', 'total' amounts - - None if request fails - - Example: - data = await get_clients_with_maturity(1, token) - clients = data['clients'] # List of all clients - overdue = data['maturity']['overdue'] # Overdue amount - """ - try: - client = get_backend_client() - async with client: - # Get maturity analysis (contains client summaries) - maturity_response = await client.get_maturity_data( - company_id=company_id, - jwt_token=jwt_token, - period='all' - ) - - if not maturity_response: - return None - - # Extract clients from maturity response - clients_raw = maturity_response.get('clients', []) - - # Transform to expected format: amount → balance - clients = [ - { - 'name': c.get('name', 'N/A'), - 'balance': float(c.get('amount', 0)), - 'daysOverdue': c.get('daysOverdue', 0) - } - for c in clients_raw - ] - - # Calculate maturity breakdown from clients data - total = sum(c['balance'] for c in clients) - overdue = sum(c['balance'] for c in clients if c.get('daysOverdue', 0) > 0) - in_term = total - overdue - - result = { - 'clients': clients, - 'maturity': { - 'in_term': in_term, - 'overdue': overdue, - 'total': total - } - } - - # Pass through cache metadata if present - if 'cache_hit' in maturity_response: - result['cache_hit'] = maturity_response['cache_hit'] - if 'response_time_ms' in maturity_response: - result['response_time_ms'] = maturity_response['response_time_ms'] - if 'cache_source' in maturity_response: - result['cache_source'] = maturity_response['cache_source'] - - return result - - except Exception as e: - logger.error(f"Error getting clients with maturity: {e}", exc_info=True) - return None - - -async def get_suppliers_with_maturity( - company_id: int, - jwt_token: str -) -> Optional[Dict[str, Any]]: - """ - Get suppliers list with maturity breakdown. - - Uses maturity analysis endpoint which returns supplier summaries - with amounts and overdue status. - - Backend returns: - { - "clients": [...], - "suppliers": [{"name": str, "amount": float, "dueDate": str, "daysOverdue": int}], - "balance": float, - "metadata": {...} - } - - Args: - company_id: Company ID - jwt_token: JWT authentication token - - Returns: - Dict with: - - 'suppliers': List of supplier dicts (id, name, balance) - - 'maturity': Dict with 'in_term', 'overdue', 'total' amounts - - None if request fails - - Example: - data = await get_suppliers_with_maturity(1, token) - suppliers = data['suppliers'] # List of all suppliers - in_term = data['maturity']['in_term'] # In-term amount - """ - try: - client = get_backend_client() - async with client: - # Get maturity analysis (contains supplier summaries) - maturity_response = await client.get_maturity_data( - company_id=company_id, - jwt_token=jwt_token, - period='all' - ) - - if not maturity_response: - return None - - # Extract suppliers from maturity response - suppliers_raw = maturity_response.get('suppliers', []) - - # Transform to expected format: amount → balance - suppliers = [ - { - 'name': s.get('name', 'N/A'), - 'balance': float(s.get('amount', 0)), - 'daysOverdue': s.get('daysOverdue', 0) - } - for s in suppliers_raw - ] - - # Calculate maturity breakdown from suppliers data - total = sum(s['balance'] for s in suppliers) - overdue = sum(s['balance'] for s in suppliers if s.get('daysOverdue', 0) > 0) - in_term = total - overdue - - result = { - 'suppliers': suppliers, - 'maturity': { - 'in_term': in_term, - 'overdue': overdue, - 'total': total - } - } - - # Pass through cache metadata if present - if 'cache_hit' in maturity_response: - result['cache_hit'] = maturity_response['cache_hit'] - if 'response_time_ms' in maturity_response: - result['response_time_ms'] = maturity_response['response_time_ms'] - if 'cache_source' in maturity_response: - result['cache_source'] = maturity_response['cache_source'] - - return result - - except Exception as e: - logger.error(f"Error getting suppliers with maturity: {e}", exc_info=True) - return None - - -async def get_cashflow_evolution_data( - company_id: int, - jwt_token: str, - period: str = "12m" -) -> Optional[Dict[str, Any]]: - """ - Get cash flow evolution data with YTD comparison. - - Uses trends endpoint which returns 12-month historical data for current and previous year. - Calculates YTD for comparison and extracts last 12 months in reverse chronological order. - - Args: - company_id: Company ID - jwt_token: JWT authentication token - period: Period for trends data (default: "12m") - - Returns: - Dict with: - - 'performance': Dict with YTD data for current and previous year - - 'monthly': Dict with last 12 months data (reverse chronological) + prev year comparison - - None if request fails - - Example: - data = await get_cashflow_evolution_data(1, token) - ytd_2025 = data['performance']['current_year'] - ytd_2024 = data['performance']['previous_year'] - """ - try: - client = get_backend_client() - async with client: - # Get trends data (12 months of historical data) - trends_data = await client.get_trends( - company_id=company_id, - jwt_token=jwt_token, - period="12m" - ) - - if not trends_data: - return None - - # Extract current year data - periods = trends_data.get('periods', []) # ["2024-01", "2024-02", ...] - clienti_incasat = trends_data.get('clienti_incasat', []) - furnizori_achitat = trends_data.get('furnizori_achitat', []) - - # Extract previous year data - previous_periods = trends_data.get('previous_periods', []) - clienti_incasat_prev = trends_data.get('clienti_incasat_prev', []) - furnizori_achitat_prev = trends_data.get('furnizori_achitat_prev', []) - - if not periods or not clienti_incasat or not furnizori_achitat: - logger.warning("Trends data missing required fields") - return None - - # Calculate YTD (Year-To-Date) = sum of all available months - incasari_ytd = sum(clienti_incasat) - plati_ytd = sum(furnizori_achitat) - net_ytd = incasari_ytd - plati_ytd - - incasari_ytd_prev = sum(clienti_incasat_prev) if clienti_incasat_prev else 0 - plati_ytd_prev = sum(furnizori_achitat_prev) if furnizori_achitat_prev else 0 - net_ytd_prev = incasari_ytd_prev - plati_ytd_prev - - # Extract years from periods - current_year = periods[-1].split('-')[0] if periods else "2025" - previous_year = previous_periods[-1].split('-')[0] if previous_periods else "2024" - - # Take last 12 months (current year) - last_12_periods = periods[-12:] - last_12_incasari = clienti_incasat[-12:] - last_12_plati = furnizori_achitat[-12:] - - # Take corresponding previous year months - last_12_periods_prev = previous_periods[-12:] if previous_periods else [] - last_12_incasari_prev = clienti_incasat_prev[-12:] if clienti_incasat_prev else [0] * 12 - last_12_plati_prev = furnizori_achitat_prev[-12:] if furnizori_achitat_prev else [0] * 12 - - # Month abbreviations (Romanian) - month_abbr = { - '01': 'Ian', '02': 'Feb', '03': 'Mar', '04': 'Apr', - '05': 'Mai', '06': 'Iun', '07': 'Iul', '08': 'Aug', - '09': 'Sep', '10': 'Oct', '11': 'Noi', '12': 'Dec' - } - - # Format months as "Noi'25/'24" - formatted_months = [] - for i, period_str in enumerate(last_12_periods): - if '-' in period_str: - year = period_str.split('-')[0][-2:] # Last 2 digits: "25" - month_num = period_str.split('-')[1] - month_name = month_abbr.get(month_num, month_num) - - # Get previous year month - prev_year = previous_year[-2:] if previous_year else "24" - - formatted_months.append(f"{month_name}'{year}/'{prev_year}") - else: - formatted_months.append(period_str) - - # Reverse chronological order (newest first) - formatted_months.reverse() - last_12_incasari.reverse() - last_12_plati.reverse() - last_12_incasari_prev.reverse() - last_12_plati_prev.reverse() - - # Build performance summary (YTD) - performance = { - 'current_year': { - 'year': current_year, - 'incasari': incasari_ytd, - 'plati': plati_ytd, - 'net': net_ytd - }, - 'previous_year': { - 'year': previous_year, - 'incasari': incasari_ytd_prev, - 'plati': plati_ytd_prev, - 'net': net_ytd_prev - } - } - - # Build monthly breakdown (reverse chronological with prev year comparison) - monthly = { - 'months': formatted_months, - 'incasari': last_12_incasari, - 'plati': last_12_plati, - 'incasari_prev': last_12_incasari_prev, - 'plati_prev': last_12_plati_prev - } - - result = { - 'performance': performance, - 'monthly': monthly - } - - # Pass through cache metadata if present - if 'cache_hit' in trends_data: - result['cache_hit'] = trends_data['cache_hit'] - if 'response_time_ms' in trends_data: - result['response_time_ms'] = trends_data['response_time_ms'] - if 'cache_source' in trends_data: - result['cache_source'] = trends_data['cache_source'] - - return result - - except Exception as e: - logger.error(f"Error getting cashflow evolution data: {e}", exc_info=True) - return None - - -async def get_client_invoices( - company_id: int, - client_name: str, - jwt_token: str -) -> List[Dict[str, Any]]: - """ - Get invoices for a specific client. - - Args: - company_id: Company ID - client_name: Client name to filter by - jwt_token: JWT authentication token - - Returns: - List of invoice dicts for the specified client - - Example: - invoices = await get_client_invoices(1, "ACME Corp", token) - for inv in invoices: - print(inv['number'], inv['amount']) - """ - try: - logger.info(f"Fetching invoices for client '{client_name}' (company_id={company_id})") - - client = get_backend_client() - async with client: - # Filter only by unpaid invoices (with balance > 0) - invoices = await client.search_invoices( - company_id=company_id, - jwt_token=jwt_token, - filters={ - 'partner_type': 'CLIENTI', - 'partner_name': client_name, - 'only_unpaid': True # Only show unpaid invoices (matching balance > 0) - } - ) - - logger.info(f"Found {len(invoices) if invoices else 0} invoices for client '{client_name}'") - - if invoices: - logger.debug(f"First invoice sample: {invoices[0]}") - - return invoices or [] - - except Exception as e: - logger.error(f"Error getting client invoices for '{client_name}': {e}", exc_info=True) - return [] - - -async def get_supplier_invoices( - company_id: int, - supplier_name: str, - jwt_token: str -) -> List[Dict[str, Any]]: - """ - Get invoices for a specific supplier. - - Args: - company_id: Company ID - supplier_name: Supplier name to filter by - jwt_token: JWT authentication token - - Returns: - List of invoice dicts for the specified supplier - - Example: - invoices = await get_supplier_invoices(1, "Supplier Inc", token) - for inv in invoices: - print(inv['number'], inv['amount']) - """ - try: - logger.info(f"Fetching invoices for supplier '{supplier_name}' (company_id={company_id})") - - client = get_backend_client() - async with client: - # Filter only by unpaid invoices (with balance > 0) - invoices = await client.search_invoices( - company_id=company_id, - jwt_token=jwt_token, - filters={ - 'partner_type': 'FURNIZORI', - 'partner_name': supplier_name, - 'only_unpaid': True # Only show unpaid invoices (matching balance > 0) - } - ) - - logger.info(f"Found {len(invoices) if invoices else 0} invoices for supplier '{supplier_name}'") - - if invoices: - logger.debug(f"First invoice sample: {invoices[0]}") - - return invoices or [] - - except Exception as e: - logger.error(f"Error getting supplier invoices for '{supplier_name}': {e}", exc_info=True) - return [] - - -# Export all helper functions -__all__ = [ - 'get_active_company_or_prompt', - 'search_companies_by_name', - 'create_company_selection_keyboard', - 'create_company_selection_keyboard_paginated', - 'format_company_context_footer', - 'get_treasury_breakdown_split', - 'get_clients_with_maturity', - 'get_suppliers_with_maturity', - 'get_cashflow_evolution_data', - 'get_client_invoices', - 'get_supplier_invoices' -] diff --git a/deploy-package-20260223-151231/backend/modules/telegram/bot/keyboards.py b/deploy-package-20260223-151231/backend/modules/telegram/bot/keyboards.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/modules/telegram/bot/menus.py b/deploy-package-20260223-151231/backend/modules/telegram/bot/menus.py deleted file mode 100644 index 9e9122f..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/bot/menus.py +++ /dev/null @@ -1,642 +0,0 @@ -""" -Menu builders for Telegram bot inline keyboards. - -This module provides functions to create InlineKeyboardMarkup objects -for different menu levels and navigation patterns in the bot. - -NOTE: All button texts are plain text WITHOUT emojis/icons as per requirements. - -BUTTON WIDTH: Inline keyboard width is determined by the message text width. -To make buttons wider, we pad message text with invisible characters. -""" - -from telegram import InlineKeyboardButton, InlineKeyboardMarkup -from typing import List, Dict, Optional -from datetime import datetime - -# ============================================================================ -# IMPORTANT: BUTTON WIDTH CONFIGURATION -# ============================================================================ -# Inline keyboard button width is determined by MESSAGE TEXT WIDTH! -# DO NOT REMOVE PADDING - it makes buttons wide like BotFather! -# ============================================================================ - -# Zero-Width Joiner character - invisible but prevents Telegram from trimming spaces -# This character has ZERO width (invisible) but prevents space trimming -ZERO_WIDTH_JOINER = '\u200D' - -# Target character count per line to make buttons VERY WIDE -# Higher value = wider buttons (BotFather uses ~45-50 chars) -# DO NOT DECREASE THIS VALUE - buttons will become narrow! -TARGET_WIDTH = 50 # Increased from 40 to make buttons WIDER - -# Enable/disable padding globally (useful for testing) -# KEEP THIS TRUE - disabling makes buttons narrow! -ENABLE_BUTTON_PADDING = True - - -def _get_current_month_ro() -> str: - """Get current month name in Romanian.""" - months_ro = { - 1: "Ianuarie", 2: "Februarie", 3: "Martie", 4: "Aprilie", - 5: "Mai", 6: "Iunie", 7: "Iulie", 8: "August", - 9: "Septembrie", 10: "Octombrie", 11: "Noiembrie", 12: "Decembrie" - } - now = datetime.now() - return f"{months_ro[now.month]} {now.year}" - - -def _pad_line_for_wide_buttons(text: str, target_width: int = TARGET_WIDTH) -> str: - """ - Pad a single line of text with invisible characters to make inline buttons wider. - - ⚠️ CRITICAL: DO NOT REMOVE THIS FUNCTION - it makes buttons wide! - The width of InlineKeyboardMarkup buttons is determined by the message text width. - By padding text with spaces + zero-width joiner, we force wider buttons. - - How it works: - 1. Calculate how many characters needed to reach target_width - 2. Add spaces + Zero-Width Joiner (invisible character) - 3. Result: wider message = wider buttons (like BotFather) - - Args: - text: The text line to pad - target_width: Target character count (default 50 for VERY WIDE buttons) - - Returns: - Padded text with invisible characters (user sees normal text, Telegram sees wider text) - """ - current_length = len(text) - if current_length >= target_width: - return text - - # ⚠️ DO NOT REMOVE: Add spaces + zero-width joiner at the end - # This makes buttons WIDE without changing visible text! - padding_needed = target_width - current_length - padding = ' ' * padding_needed + ZERO_WIDTH_JOINER - - return text + padding - - -def pad_message_for_wide_buttons(message: str, target_width: int = TARGET_WIDTH, force: bool = False) -> str: - """ - Pad all lines in a message to make inline keyboard buttons wider. - - ⚠️ CRITICAL: DO NOT REMOVE THIS FUNCTION - it makes buttons wide! - This is the MAIN function that applies padding to ALL messages with keyboards. - - Why we need this: - - Telegram determines button width based on MESSAGE TEXT width - - Short messages = narrow buttons - - Wide messages (with invisible padding) = WIDE buttons like BotFather - - Args: - message: Multi-line message text - target_width: Target character count per line (default 50) - force: Force padding even if ENABLE_BUTTON_PADDING is False - - Returns: - Message with all lines padded (if enabled or forced) - """ - # ⚠️ DO NOT REMOVE: Check if padding is enabled - if not ENABLE_BUTTON_PADDING and not force: - return message - - # ⚠️ DO NOT REMOVE: Apply padding to each line - lines = message.split('\n') - padded_lines = [_pad_line_for_wide_buttons(line, target_width) for line in lines] - return '\n'.join(padded_lines) - - -def format_response_with_company( - content: str, - company_name: Optional[str] = None, - apply_padding: bool = True -) -> str: - """ - Format a response with company name at the top (simplified format). - - ⚠️ IMPORTANT: Applies padding by default to make buttons WIDE! - - Format: - Company Name - - [Content] - - Args: - content: The main content text - company_name: Company name to show at top (if None, just returns content) - apply_padding: Whether to apply invisible padding for wider buttons (default TRUE) - - Returns: - Formatted response with company name header AND padding for wide buttons - """ - if company_name: - message = f"{company_name}\n\n{content}" - else: - message = content - - # ⚠️ DO NOT REMOVE: Apply padding to make inline keyboard buttons WIDE! - # Without this, buttons become narrow like before - if apply_padding: - message = pad_message_for_wide_buttons(message) - - return message - - -def get_menu_message( - company_name: Optional[str] = None, - company_cui: Optional[str] = None, - apply_padding: bool = True -) -> str: - """ - Get the menu message text with company details (simplified format). - - ⚠️ IMPORTANT: Applies padding by default to make menu buttons WIDE! - - Format without labels - just values: - - Line 1: Company name - - Line 2: CUI - - Line 3: Accounting month - - Args: - company_name: Active company name - company_cui: Company fiscal code (CUI) - apply_padding: Whether to apply invisible padding for wider buttons (default TRUE) - - Returns: - Formatted message text for menu WITH padding for wide buttons - """ - if company_name: - # Simplified format: just values, no labels - message = f"{company_name}\n" - if company_cui: - message += f"{company_cui}\n" - message += f"{_get_current_month_ro()}" - else: - # No company selected - just prompt - message = "Selectează o companie pentru a continua" - - # ⚠️ DO NOT REMOVE: Apply padding to make inline keyboard buttons WIDE! - # This makes buttons look like BotFather (wide, not narrow) - if apply_padding: - message = pad_message_for_wide_buttons(message) - - return message - - -def create_main_menu( - company_name: Optional[str] = None, - company_cui: Optional[str] = None, - is_authenticated: bool = True, - cache_enabled: Optional[bool] = None -) -> InlineKeyboardMarkup: - """ - Create main menu keyboard (Level 1) with financial options. - - Layout: Full-width buttons with company selection at top - - Args: - company_name: Active company name, or None if no company selected - company_cui: Company fiscal code (CUI), or None - is_authenticated: Whether user is authenticated (affects Login/Logout button) - cache_enabled: Cache state for user (True=ON, False=OFF, None=unknown) - - Returns: - InlineKeyboardMarkup with main menu buttons - """ - keyboard = [] - - # Only show financial menu if authenticated - if is_authenticated: - # Row 1: Company selection (full width, single line - InlineKeyboardButton doesn't support multiline) - if company_name: - # Short company name for button (CUI and month will be shown in message text) - # Truncate long names to fit in button - max_length = 35 - display_name = company_name if len(company_name) <= max_length else company_name[:max_length-3] + "..." - - keyboard.append([ - InlineKeyboardButton( - f"{display_name}", - callback_data="menu:select_company" - ) - ]) - else: - keyboard.append([ - InlineKeyboardButton( - "Selectare Companie", - callback_data="menu:select_company" - ) - ]) - - # Rows 2-4: Financial options (compact layout with unified Trezorerie button) - keyboard.extend([ - [ - InlineKeyboardButton("Sold Companie", callback_data="menu:sold"), - InlineKeyboardButton("Trezorerie", callback_data="menu:trezorerie") - ], - [ - InlineKeyboardButton("Sold Clienti", callback_data="menu:clienti"), - InlineKeyboardButton("Sold Furnizori", callback_data="menu:furnizori") - ], - [ - InlineKeyboardButton("Evolutie Incasari", callback_data="menu:evolutie") - ] - ]) - - # Row 5: Cache options (2 buttons per row, only if authenticated) - if is_authenticated: - # Dynamic cache toggle button showing current state - if cache_enabled is None: - cache_button_text = "Toggle Cache" - elif cache_enabled: - cache_button_text = "Cache: ON" - else: - cache_button_text = "Cache: OFF" - - keyboard.append([ - InlineKeyboardButton(cache_button_text, callback_data="menu:togglecache"), - InlineKeyboardButton("Clear Cache", callback_data="menu:clearcache") - ]) - - # Row 6: Switch Server button (authenticated only) - if is_authenticated: - keyboard.append([ - InlineKeyboardButton("Schimba Server", callback_data="menu:switch_server"), - ]) - - # Row 7: Help/Logout buttons (authenticated) or Login button (non-authenticated) - if is_authenticated: - keyboard.append([ - InlineKeyboardButton("Help", callback_data="action:help"), - InlineKeyboardButton("Logout", callback_data="action:logout") - ]) - else: - keyboard.append([ - InlineKeyboardButton("Login", callback_data="action:login") - ]) - - return InlineKeyboardMarkup(keyboard) - - -def create_action_buttons(current_view: str, show_export: bool = True, show_back: bool = False, show_refresh: bool = True) -> InlineKeyboardMarkup: - """ - Create action buttons for responses (Refresh, Export, Back, Menu). - - Layout (buttons made wide by message text padding): - [Refresh] [Export] (if show_refresh=True and show_export=True) - [Refresh] (if show_refresh=True and show_export=False) - [Înapoi] (if show_back=True, full width) - [Menu] (full width, always shown) - - Args: - current_view: View identifier for refresh callback (e.g., "sold", "clienti") - show_export: Whether to show Export button - show_back: Whether to show Back button to list - show_refresh: Whether to show Refresh button - - Returns: - InlineKeyboardMarkup with action buttons - """ - keyboard = [] - - # Row 1: Refresh and optionally Export (only if show_refresh is True) - if show_refresh: - if show_export: - keyboard.append([ - InlineKeyboardButton("Refresh", callback_data=f"action:refresh:{current_view}"), - InlineKeyboardButton("Export", callback_data=f"action:export:{current_view}") - ]) - else: - keyboard.append([ - InlineKeyboardButton("Refresh", callback_data=f"action:refresh:{current_view}") - ]) - - # Row 2: Back to List (if show_back is True) - if show_back: - # Determine back callback based on current view - # ✅ FIX: Handle detail views (client_detail:name, supplier_detail:name) - if current_view.startswith("client_detail:"): - back_callback = "menu:clienti" # Back to client list - elif current_view.startswith("supplier_detail:"): - back_callback = "menu:furnizori" # Back to supplier list - elif current_view == "clienti": - back_callback = "clients_page:0" # Match handlers.py:1689 - elif current_view == "furnizori": - back_callback = "suppliers_page:0" # Match handlers.py:1721 - else: - back_callback = "action:menu" # Fallback to menu - - keyboard.append([ - InlineKeyboardButton("« Înapoi", callback_data=back_callback) - ]) - - # Row 3: Back to Menu (full width) - keyboard.append([ - InlineKeyboardButton("Meniu Principal", callback_data="action:menu") - ]) - - return InlineKeyboardMarkup(keyboard) - - -def create_client_list_keyboard(clients: List[Dict], max_items: int = 20, page: int = 0, letter: str = None) -> InlineKeyboardMarkup: - """ - Create client list keyboard (Level 2) with client buttons and pagination. - - Layout: 1 column for clients, pagination controls, 2 columns for navigation - - Args: - clients: List of client dicts with keys: id, name, balance - max_items: Maximum number of clients per page (default: 10) - page: Current page number (0-indexed) - letter: Optional letter filter (e.g. "A", "ALL") - when set, uses alpha pagination - - Returns: - InlineKeyboardMarkup with client list buttons and pagination - """ - keyboard = [] - - # Sort clients alphabetically by name - sorted_clients = sorted(clients, key=lambda x: x.get('name', '').lower()) - - # Calculate pagination - total_clients = len(sorted_clients) - total_pages = (total_clients + max_items - 1) // max_items # Ceiling division - start_idx = page * max_items - end_idx = min(start_idx + max_items, total_clients) - - # Display clients for current page - display_clients = sorted_clients[start_idx:end_idx] - - # Add client buttons (1 per row) - for client in display_clients: - client_name = client.get('name', 'N/A') - balance = client.get('balance', 0) - - # Format balance with thousands separator - balance_str = f"{balance:,.0f}" if balance else "0" - - button_text = f"{client_name} - {balance_str} RON" - - # Limit callback_data to 64 bytes (Telegram limit) - # Use only first 40 chars of name to stay within limit - safe_name = client_name[:40] if len(client_name) > 40 else client_name - - keyboard.append([ - InlineKeyboardButton( - button_text, - callback_data=f"details:client:{safe_name}:0" # name:page - ) - ]) - - # Pagination controls (only if more than one page) - if total_pages > 1: - nav_buttons = [] - - # Choose pagination callback based on whether letter filter is active - if letter: - prev_cb = f"clients_alpha_page:{page-1}:{letter}" - next_cb = f"clients_alpha_page:{page+1}:{letter}" - else: - prev_cb = f"clients_page:{page-1}" - next_cb = f"clients_page:{page+1}" - - # Previous button - if page > 0: - nav_buttons.append( - InlineKeyboardButton("< Anterior", callback_data=prev_cb) - ) - - # Page indicator (non-clickable) - nav_buttons.append( - InlineKeyboardButton(f"Pagina {page+1}/{total_pages}", callback_data="noop") - ) - - # Next button - if page < total_pages - 1: - nav_buttons.append( - InlineKeyboardButton("Urmator >", callback_data=next_cb) - ) - - keyboard.append(nav_buttons) - - # Filtrare A-Z button - keyboard.append([ - InlineKeyboardButton("Filtrare A-Z", callback_data="clients_alpha_menu") - ]) - - # Back button: to A-Z menu if filtering, otherwise to main menu - back_callback = "clients_alpha_menu" if letter else "action:menu" - keyboard.append([ - InlineKeyboardButton("< Inapoi", callback_data=back_callback) - ]) - - return InlineKeyboardMarkup(keyboard) - - -def create_supplier_list_keyboard(suppliers: List[Dict], max_items: int = 20, page: int = 0, letter: str = None) -> InlineKeyboardMarkup: - """ - Create supplier list keyboard (Level 2) with supplier buttons and pagination. - - Layout: 1 column for suppliers, pagination controls, 2 columns for navigation - - Args: - suppliers: List of supplier dicts with keys: id, name, balance - max_items: Maximum number of suppliers per page (default: 10) - page: Current page number (0-indexed) - letter: Optional letter filter (e.g. "A", "ALL") - when set, uses alpha pagination - - Returns: - InlineKeyboardMarkup with supplier list buttons and pagination - """ - keyboard = [] - - # Sort suppliers alphabetically by name - sorted_suppliers = sorted(suppliers, key=lambda x: x.get('name', '').lower()) - - # Calculate pagination - total_suppliers = len(sorted_suppliers) - total_pages = (total_suppliers + max_items - 1) // max_items # Ceiling division - start_idx = page * max_items - end_idx = min(start_idx + max_items, total_suppliers) - - # Display suppliers for current page - display_suppliers = sorted_suppliers[start_idx:end_idx] - - # Add supplier buttons (1 per row) - for supplier in display_suppliers: - supplier_name = supplier.get('name', 'N/A') - balance = supplier.get('balance', 0) - - # Format balance with thousands separator - balance_str = f"{balance:,.0f}" if balance else "0" - - button_text = f"{supplier_name} - {balance_str} RON" - - # Limit callback_data to 64 bytes (Telegram limit) - # Use only first 40 chars of name to stay within limit - safe_name = supplier_name[:40] if len(supplier_name) > 40 else supplier_name - - keyboard.append([ - InlineKeyboardButton( - button_text, - callback_data=f"details:supplier:{safe_name}:0" # name:page - ) - ]) - - # Pagination controls (only if more than one page) - if total_pages > 1: - nav_buttons = [] - - # Choose pagination callback based on whether letter filter is active - if letter: - prev_cb = f"suppliers_alpha_page:{page-1}:{letter}" - next_cb = f"suppliers_alpha_page:{page+1}:{letter}" - else: - prev_cb = f"suppliers_page:{page-1}" - next_cb = f"suppliers_page:{page+1}" - - # Previous button - if page > 0: - nav_buttons.append( - InlineKeyboardButton("< Anterior", callback_data=prev_cb) - ) - - # Page indicator (non-clickable) - nav_buttons.append( - InlineKeyboardButton(f"Pagina {page+1}/{total_pages}", callback_data="noop") - ) - - # Next button - if page < total_pages - 1: - nav_buttons.append( - InlineKeyboardButton("Urmator >", callback_data=next_cb) - ) - - keyboard.append(nav_buttons) - - # Filtrare A-Z button - keyboard.append([ - InlineKeyboardButton("Filtrare A-Z", callback_data="suppliers_alpha_menu") - ]) - - # Back button: to A-Z menu if filtering, otherwise to main menu - back_callback = "suppliers_alpha_menu" if letter else "action:menu" - keyboard.append([ - InlineKeyboardButton("< Inapoi", callback_data=back_callback) - ]) - - return InlineKeyboardMarkup(keyboard) - - -def create_invoice_list_keyboard( - invoices: List[Dict], - partner_type: str, - partner_name: str, - max_items: int = 10, - page: int = 0 -) -> InlineKeyboardMarkup: - """ - Create invoice list keyboard (Level 3) with invoice buttons and pagination. - - Layout: 1 column for invoices, pagination controls, 2 columns for navigation - - Args: - invoices: List of invoice dicts with keys: id, number, amount, status - partner_type: "CLIENTI" or "FURNIZORI" - partner_name: Client/supplier name (for back navigation) - max_items: Maximum number of invoices per page (default: 10) - page: Current page number (0-indexed) - - Returns: - InlineKeyboardMarkup with invoice list buttons and pagination - """ - keyboard = [] - - # Limit partner_name to 30 chars for Telegram callback_data limit (64 bytes) - safe_partner_name = partner_name[:30] if len(partner_name) > 30 else partner_name - - # Calculate pagination - total_invoices = len(invoices) - total_pages = (total_invoices + max_items - 1) // max_items # Ceiling division - start_idx = page * max_items - end_idx = min(start_idx + max_items, total_invoices) - - # Display invoices for current page - display_invoices = invoices[start_idx:end_idx] - - # Add invoice buttons (1 per row) - for invoice in display_invoices: - invoice_id = invoice.get('id', 0) - invoice_number = invoice.get('number', 'N/A') - amount = invoice.get('amount', 0) - status = invoice.get('status', 'unknown') - - # Format amount with thousands separator - amount_str = f"{amount:,.0f}" if amount else "0" - - # Status text indicator (no emojis) - status_text = "[NEPLATIT]" if status in ['unpaid', 'overdue'] else "[PLATIT]" - - button_text = f"{status_text} {invoice_number} - {amount_str} RON" - keyboard.append([ - InlineKeyboardButton( - button_text, - callback_data=f"invoice:{partner_type}:{invoice_id}" - ) - ]) - - # Pagination controls (only if more than one page) - if total_pages > 1: - nav_buttons = [] - - # Previous button - if page > 0: - nav_buttons.append( - InlineKeyboardButton("< Anterior", callback_data=f"invoices_page:{partner_type}:{safe_partner_name}:{page-1}") - ) - - # Page indicator (non-clickable) - nav_buttons.append( - InlineKeyboardButton(f"Pagina {page+1}/{total_pages}", callback_data="noop") - ) - - # Next button - if page < total_pages - 1: - nav_buttons.append( - InlineKeyboardButton("Următor >", callback_data=f"invoices_page:{partner_type}:{safe_partner_name}:{page+1}") - ) - - keyboard.append(nav_buttons) - - # Navigation row: Back and Export (2 buttons per row) - back_target = "clienti" if partner_type == "CLIENTI" else "furnizori" - keyboard.append([ - InlineKeyboardButton("< Înapoi", callback_data=f"nav:back:{back_target}"), - InlineKeyboardButton("Export", callback_data=f"action:export:{partner_type.lower()}") - ]) - - return InlineKeyboardMarkup(keyboard) - - -def create_navigation_buttons(back_to: str) -> InlineKeyboardMarkup: - """ - Create simple navigation buttons (just Back button). - - Args: - back_to: Target location identifier (e.g., "menu", "clienti", "furnizori") - - Returns: - InlineKeyboardMarkup with navigation button - """ - keyboard = [ - [ - InlineKeyboardButton( - f"< Înapoi la {back_to}", - callback_data=f"nav:back:{back_to}" - ) - ] - ] - - return InlineKeyboardMarkup(keyboard) diff --git a/deploy-package-20260223-151231/backend/modules/telegram/bot_main.py b/deploy-package-20260223-151231/backend/modules/telegram/bot_main.py deleted file mode 100644 index 46b6161..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/bot_main.py +++ /dev/null @@ -1,296 +0,0 @@ -""" -Main entry point for ROA2WEB Telegram Bot - -This bot provides access to the ROA2WEB ERP system through Telegram -using direct command handlers for financial data queries. -""" - -import asyncio -import logging -import os -from pathlib import Path -from dotenv import load_dotenv -# Note: uvicorn and threading removed - internal API now served via main.py - -# ============================================================================ -# LOAD ENVIRONMENT VARIABLES FIRST - BEFORE ANY APP IMPORTS -# ============================================================================ -# This ensures all modules can access environment variables at import time -env_path = Path(__file__).parent.parent / '.env' -load_dotenv(env_path) - -# Telegram imports -from telegram.ext import ( - Application, - CommandHandler, - CallbackQueryHandler, - MessageHandler, - filters -) - -# Import database initialization -from backend.modules.telegram.db import ( - init_database, - cleanup_expired_codes, - cleanup_expired_sessions, - cleanup_expired_email_codes -) - -# Import bot handlers -from backend.modules.telegram.bot.handlers import ( - start_command, - help_command, - clear_command, - companies_command, - unlink_command, - selectcompany_command, - dashboard_command, - sold_command, - facturi_command, - trezorerie_command, - # FAZA 3: New command handlers with button interface - menu_command, - trezorerie_casa_command, - trezorerie_banca_command, - clienti_command, - furnizori_command, - evolutie_command, - # FAZA 6: Cache management commands - clearcache_command, - togglecache_command, - # Text message handlers - handle_text_message, - # FAZA 4: Callback and error handlers - button_callback, - error_handler -) - -# Import email authentication handler -from backend.modules.telegram.bot.email_handlers import email_login_handler - -# Note: internal_api import removed - now served via main.py at /api/telegram/internal/* - -# Configure logging -logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' -) -logger = logging.getLogger(__name__) - -# Environment variables (already loaded above) -TELEGRAM_BOT_TOKEN = os.getenv('TELEGRAM_BOT_TOKEN') -BACKEND_URL = os.getenv('BACKEND_URL', 'http://localhost:8000') -# Note: INTERNAL_API_PORT removed - internal API now served via main.py - - -# ============================================================================ -# TELEGRAM BOT SETUP -# ============================================================================ - -def create_telegram_application() -> Application: - """ - Create and configure the Telegram bot application. - - Returns: - Application: Configured Telegram application - """ - logger.info("Creating Telegram application...") - - # Create application - application = Application.builder().token(TELEGRAM_BOT_TOKEN).build() - - # Register email authentication conversation handler (must be before other handlers) - application.add_handler(email_login_handler) - - # Register essential command handlers - application.add_handler(CommandHandler("start", start_command)) - application.add_handler(CommandHandler("menu", menu_command)) - application.add_handler(CommandHandler("help", help_command)) - application.add_handler(CommandHandler("unlink", unlink_command)) - - # ========================================================================= - # LEGACY COMMAND HANDLERS (kept for backwards compatibility, hidden from help) - # ========================================================================= - # NOTE: These commands are redundant with the button interface. - # They're kept for users who already know them, but we push buttons in help. - # Consider removing completely if migration is successful. - - application.add_handler(CommandHandler("clear", clear_command)) - application.add_handler(CommandHandler("companies", companies_command)) - application.add_handler(CommandHandler("selectcompany", selectcompany_command)) - application.add_handler(CommandHandler("dashboard", dashboard_command)) - application.add_handler(CommandHandler("sold", sold_command)) - application.add_handler(CommandHandler("facturi", facturi_command)) - application.add_handler(CommandHandler("trezorerie", trezorerie_command)) - application.add_handler(CommandHandler("trezorerie_casa", trezorerie_casa_command)) - application.add_handler(CommandHandler("trezorerie_banca", trezorerie_banca_command)) - application.add_handler(CommandHandler("clienti", clienti_command)) - application.add_handler(CommandHandler("furnizori", furnizori_command)) - application.add_handler(CommandHandler("evolutie", evolutie_command)) - - # FAZA 6: Cache management commands - application.add_handler(CommandHandler("clearcache", clearcache_command)) - application.add_handler(CommandHandler("togglecache", togglecache_command)) - - # Text message handler (for direct code input and future NLP) - # IMPORTANT: This must be registered BEFORE CallbackQueryHandler - # filters.TEXT & ~filters.COMMAND ensures we only process non-command text messages - application.add_handler(MessageHandler( - filters.TEXT & ~filters.COMMAND, - handle_text_message - )) - - # FAZA 4: Register callback query handler (for inline buttons) - application.add_handler(CallbackQueryHandler(button_callback)) - - # Register error handler - application.add_error_handler(error_handler) - - logger.info("Telegram application configured with all handlers") - - return application - - -# ============================================================================ -# STARTUP/SHUTDOWN -# ============================================================================ -# Note: Internal API server removed - now served via main.py at /api/telegram/internal/* - -async def startup(): - """ - Initialize the bot application on startup. - """ - logger.info("🚀 ROA2WEB Telegram Bot - Starting up...") - - # Initialize database - try: - logger.info("Initializing SQLite database...") - await init_database() - logger.info("✅ Database initialized successfully") - except Exception as e: - logger.error(f"❌ Failed to initialize database: {e}") - raise - - # Cleanup expired data - try: - logger.info("Cleaning up expired data...") - expired_codes = await cleanup_expired_codes() - expired_sessions = await cleanup_expired_sessions() - expired_email_codes = await cleanup_expired_email_codes() - logger.info(f"✅ Cleanup complete: {expired_codes} codes, {expired_sessions} sessions, {expired_email_codes} email codes removed") - except Exception as e: - logger.warning(f"⚠️ Cleanup failed (non-critical): {e}") - - logger.info("✅ Startup complete") - - -async def shutdown(): - """ - Clean up resources on shutdown. - """ - logger.info("👋 ROA2WEB Telegram Bot - Shutting down...") - logger.info("✅ Shutdown complete") - - -async def scheduled_cleanup(): - """ - Background task to periodically clean up expired data. - Runs every hour to remove expired auth codes, sessions, and email codes. - """ - while True: - try: - await asyncio.sleep(3600) # Sleep for 1 hour - logger.info("🧹 Running scheduled cleanup...") - expired_codes = await cleanup_expired_codes() - expired_sessions = await cleanup_expired_sessions() - expired_email_codes = await cleanup_expired_email_codes() - logger.info(f"✅ Scheduled cleanup: {expired_codes} codes, {expired_sessions} sessions, {expired_email_codes} email codes removed") - except Exception as e: - logger.error(f"❌ Error in scheduled cleanup: {e}") - - -# ============================================================================ -# MAIN APPLICATION -# ============================================================================ - -async def main(): - """ - Main application entry point. - - Runs both the Telegram bot and internal API server concurrently. - """ - try: - # Run startup - await startup() - - # Create Telegram application - telegram_app = create_telegram_application() - - # Note: Internal API server removed - now served via main.py - - # Start scheduled cleanup task in background - cleanup_task = asyncio.create_task(scheduled_cleanup()) - logger.info("✅ Scheduled cleanup task started") - - # Initialize and start Telegram bot - logger.info("🤖 Starting Telegram bot polling...") - await telegram_app.initialize() - await telegram_app.start() - await telegram_app.updater.start_polling( - drop_pending_updates=True, - poll_interval=0, # No delay between polls - timeout=30 # Long poll timeout 30 seconds (reduces requests from ~6/min to ~2/min) - ) - - logger.info("✅ Telegram bot is now running and polling for updates") - logger.info(f"📱 Bot ready to receive messages at @{(await telegram_app.bot.get_me()).username}") - logger.info("🎯 Bot is operational with direct command handlers!") - - # Keep running until interrupted - await asyncio.Event().wait() - - except KeyboardInterrupt: - logger.info("⚠️ Received interrupt signal") - except Exception as e: - logger.error(f"❌ Fatal error: {e}", exc_info=True) - raise - finally: - # Stop Telegram bot gracefully - try: - if 'telegram_app' in locals(): - logger.info("Stopping Telegram bot...") - await telegram_app.updater.stop() - await telegram_app.stop() - await telegram_app.shutdown() - logger.info("✅ Telegram bot stopped") - except Exception as e: - logger.error(f"Error stopping Telegram bot: {e}") - - await shutdown() - - -# ============================================================================ -# ENTRY POINT -# ============================================================================ - -if __name__ == "__main__": - # Check required environment variables - if not os.getenv('TELEGRAM_BOT_TOKEN'): - logger.error("❌ TELEGRAM_BOT_TOKEN is required") - logger.error("Please set it in .env file") - exit(1) - - # Display startup banner - logger.info("=" * 60) - logger.info(" ROA2WEB TELEGRAM BOT") - logger.info(" Financial ERP Assistant with Direct Commands") - logger.info("=" * 60) - - # Run the main application - try: - asyncio.run(main()) - except KeyboardInterrupt: - logger.info("👋 Application stopped by user") - except Exception as e: - logger.error(f"❌ Application failed: {e}", exc_info=True) - exit(1) diff --git a/deploy-package-20260223-151231/backend/modules/telegram/db/__init__.py b/deploy-package-20260223-151231/backend/modules/telegram/db/__init__.py deleted file mode 100644 index 7be9f02..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/db/__init__.py +++ /dev/null @@ -1,86 +0,0 @@ -""" -Database module for Telegram Bot - -Provides SQLite database operations for: -- User management and Oracle account linking -- Authentication code management -- Conversation session management -""" - -from .database import ( - init_database, - get_db_connection, - cleanup_expired_codes, - cleanup_expired_sessions, - cleanup_expired_email_codes, - get_database_stats, - DB_PATH, -) - -from .operations import ( - # User operations - create_or_update_user, - get_user, - link_user_to_oracle, - update_user_tokens, - update_user_last_active, - is_user_linked, - is_user_authenticated, - # Auth code operations - create_auth_code, - get_auth_code, - verify_and_use_auth_code, - get_pending_codes_for_user, - # Email auth code operations - get_pending_email_code, - create_email_auth_code, - get_email_auth_code, - increment_failed_attempts, - mark_email_code_used, - delete_user_email_codes, - # Session operations - create_session, - get_session, - get_user_active_session, - update_session_state, - delete_session, - delete_user_sessions, -) - -__all__ = [ - # Database setup - 'init_database', - 'get_db_connection', - 'cleanup_expired_codes', - 'cleanup_expired_sessions', - 'cleanup_expired_email_codes', - 'get_database_stats', - 'DB_PATH', - # User operations - 'create_or_update_user', - 'get_user', - 'link_user_to_oracle', - 'update_user_tokens', - 'update_user_last_active', - 'is_user_linked', - 'is_user_authenticated', - # Auth code operations - 'create_auth_code', - 'get_auth_code', - 'verify_and_use_auth_code', - 'get_pending_codes_for_user', - # Email auth code operations - 'get_pending_email_code', - 'create_email_auth_code', - 'get_email_auth_code', - 'increment_failed_attempts', - 'mark_email_code_used', - 'delete_user_email_codes', - # Session operations - 'create_session', - 'get_session', - 'get_user_active_session', - 'update_session_state', - 'delete_session', - 'delete_user_sessions', -] diff --git a/deploy-package-20260223-151231/backend/modules/telegram/db/database.py b/deploy-package-20260223-151231/backend/modules/telegram/db/database.py deleted file mode 100644 index 9fd7a35..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/db/database.py +++ /dev/null @@ -1,325 +0,0 @@ -""" -SQLite Database Setup for Telegram Bot - -This module handles database connection, initialization, and schema creation. -Uses aiosqlite for async SQLite operations. -""" - -import aiosqlite -import logging -from pathlib import Path -from datetime import datetime, timedelta -from typing import Optional - -logger = logging.getLogger(__name__) - -# Database file location -DB_DIR = Path(__file__).parent.parent.parent / "data" -DB_PATH = DB_DIR / "telegram_bot.db" - -# SQLite busy timeout in milliseconds (wait for locks instead of failing immediately) -SQLITE_BUSY_TIMEOUT_MS = 5000 - - -async def get_db_connection() -> aiosqlite.Connection: - """ - Get a database connection. - - Returns: - aiosqlite.Connection: Database connection - """ - conn = await aiosqlite.connect(DB_PATH) - conn.row_factory = aiosqlite.Row # Enable column access by name - return conn - - -async def init_database() -> None: - """ - Initialize the database and create all tables. - Safe to call multiple times - only creates tables if they don't exist. - """ - try: - # Ensure data directory exists - DB_DIR.mkdir(parents=True, exist_ok=True) - logger.info(f"Database directory: {DB_DIR}") - - async with aiosqlite.connect(DB_PATH) as db: - # Enable WAL mode for better concurrent access - await db.execute("PRAGMA journal_mode=WAL") - # Set busy timeout to wait for locks instead of failing immediately - await db.execute(f"PRAGMA busy_timeout={SQLITE_BUSY_TIMEOUT_MS}") - # Enable foreign keys - await db.execute("PRAGMA foreign_keys = ON") - - # Create telegram_users table - await db.execute(""" - CREATE TABLE IF NOT EXISTS telegram_users ( - telegram_user_id INTEGER PRIMARY KEY, - username TEXT, - first_name TEXT NOT NULL, - last_name TEXT, - oracle_username TEXT, - jwt_token TEXT, - jwt_refresh_token TEXT, - token_expires_at TIMESTAMP, - linked_at TIMESTAMP, - last_active_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - is_active BOOLEAN DEFAULT 1 - ) - """) - - # Create telegram_auth_codes table - await db.execute(""" - CREATE TABLE IF NOT EXISTS telegram_auth_codes ( - code TEXT PRIMARY KEY, - telegram_user_id INTEGER, - oracle_username TEXT, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - expires_at TIMESTAMP NOT NULL, - used BOOLEAN DEFAULT 0, - used_at TIMESTAMP, - FOREIGN KEY (telegram_user_id) REFERENCES telegram_users(telegram_user_id) - ) - """) - - # Create telegram_sessions table - await db.execute(""" - CREATE TABLE IF NOT EXISTS telegram_sessions ( - session_id TEXT PRIMARY KEY, - telegram_user_id INTEGER NOT NULL, - conversation_state TEXT, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - expires_at TIMESTAMP NOT NULL, - FOREIGN KEY (telegram_user_id) REFERENCES telegram_users(telegram_user_id) - ) - """) - - # Create email_auth_codes table (email-based authentication) - await db.execute(""" - CREATE TABLE IF NOT EXISTS email_auth_codes ( - code TEXT PRIMARY KEY, - email TEXT NOT NULL, - oracle_username TEXT NOT NULL, - telegram_user_id INTEGER NOT NULL, - created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - expires_at TIMESTAMP NOT NULL, - used INTEGER DEFAULT 0, - used_at TIMESTAMP, - failed_attempts INTEGER DEFAULT 0, - FOREIGN KEY (telegram_user_id) REFERENCES telegram_users(telegram_user_id) - ) - """) - - # Create indexes for better query performance - await db.execute(""" - CREATE INDEX IF NOT EXISTS idx_auth_codes_telegram_user - ON telegram_auth_codes(telegram_user_id) - """) - - await db.execute(""" - CREATE INDEX IF NOT EXISTS idx_auth_codes_expires - ON telegram_auth_codes(expires_at) - """) - - await db.execute(""" - CREATE INDEX IF NOT EXISTS idx_sessions_telegram_user - ON telegram_sessions(telegram_user_id) - """) - - await db.execute(""" - CREATE INDEX IF NOT EXISTS idx_sessions_expires - ON telegram_sessions(expires_at) - """) - - # Create indexes for email_auth_codes table - await db.execute(""" - CREATE INDEX IF NOT EXISTS idx_email_auth_email - ON email_auth_codes(email) - """) - - await db.execute(""" - CREATE INDEX IF NOT EXISTS idx_email_auth_telegram_user - ON email_auth_codes(telegram_user_id) - """) - - await db.execute(""" - CREATE INDEX IF NOT EXISTS idx_email_auth_expires - ON email_auth_codes(expires_at) - """) - - # Migration: add server_id column to telegram_auth_codes if missing - try: - await db.execute("ALTER TABLE telegram_auth_codes ADD COLUMN server_id TEXT") - await db.commit() - logger.info("Migration: added server_id column to telegram_auth_codes") - except Exception: - pass # Column already exists - - await db.commit() - logger.info("Database initialized successfully") - - # Log table info - cursor = await db.execute(""" - SELECT name FROM sqlite_master - WHERE type='table' - ORDER BY name - """) - tables = await cursor.fetchall() - logger.info(f"Existing tables: {[t[0] for t in tables]}") - - except Exception as e: - logger.error(f"Failed to initialize database: {e}") - raise - - -async def cleanup_expired_codes() -> int: - """ - Delete expired authentication codes from the database. - This should be called periodically (e.g., every hour). - - Returns: - int: Number of expired codes deleted - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - db.row_factory = aiosqlite.Row - cursor = await db.execute(""" - DELETE FROM telegram_auth_codes - WHERE expires_at < ? - """, (datetime.now(),)) - - await db.commit() - deleted = cursor.rowcount - - if deleted > 0: - logger.info(f"Cleaned up {deleted} expired auth codes") - - return deleted - - except Exception as e: - logger.error(f"Failed to cleanup expired codes: {e}") - return 0 - - -async def cleanup_expired_sessions() -> int: - """ - Delete expired sessions from the database. - This should be called periodically (e.g., daily). - - Returns: - int: Number of expired sessions deleted - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - db.row_factory = aiosqlite.Row - cursor = await db.execute(""" - DELETE FROM telegram_sessions - WHERE expires_at < ? - """, (datetime.now(),)) - - await db.commit() - deleted = cursor.rowcount - - if deleted > 0: - logger.info(f"Cleaned up {deleted} expired sessions") - - return deleted - - except Exception as e: - logger.error(f"Failed to cleanup expired sessions: {e}") - return 0 - - -async def cleanup_expired_email_codes() -> int: - """ - Delete expired and old used email codes from the database. - This should be called periodically (e.g., hourly). - - Returns: - int: Number of email codes deleted - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - db.row_factory = aiosqlite.Row - # Delete expired codes or used codes older than 1 day - cursor = await db.execute(""" - DELETE FROM email_auth_codes - WHERE expires_at < ? - OR (used = 1 AND used_at < ?) - """, ( - datetime.now(), - datetime.now() - timedelta(days=1) - )) - - await db.commit() - deleted = cursor.rowcount - - if deleted > 0: - logger.info(f"Cleaned up {deleted} expired/old email auth codes") - - return deleted - - except Exception as e: - logger.error(f"Failed to cleanup email codes: {e}") - return 0 - - -async def get_database_stats() -> dict: - """ - Get database statistics for monitoring. - - Returns: - dict: Database statistics - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - db.row_factory = aiosqlite.Row - stats = {} - - # Count users - cursor = await db.execute("SELECT COUNT(*) FROM telegram_users") - stats['total_users'] = (await cursor.fetchone())[0] - - cursor = await db.execute( - "SELECT COUNT(*) FROM telegram_users WHERE is_active = 1" - ) - stats['active_users'] = (await cursor.fetchone())[0] - - # Count pending codes - cursor = await db.execute(""" - SELECT COUNT(*) FROM telegram_auth_codes - WHERE used = 0 AND expires_at > ? - """, (datetime.now(),)) - stats['pending_codes'] = (await cursor.fetchone())[0] - - # Count active sessions - cursor = await db.execute(""" - SELECT COUNT(*) FROM telegram_sessions - WHERE expires_at > ? - """, (datetime.now(),)) - stats['active_sessions'] = (await cursor.fetchone())[0] - - # Database file size - if DB_PATH.exists(): - stats['db_size_mb'] = DB_PATH.stat().st_size / (1024 * 1024) - else: - stats['db_size_mb'] = 0 - - return stats - - except Exception as e: - logger.error(f"Failed to get database stats: {e}") - return {} - - -# Export main functions -__all__ = [ - 'get_db_connection', - 'init_database', - 'cleanup_expired_codes', - 'cleanup_expired_sessions', - 'cleanup_expired_email_codes', - 'get_database_stats', - 'DB_PATH', -] diff --git a/deploy-package-20260223-151231/backend/modules/telegram/db/operations.py b/deploy-package-20260223-151231/backend/modules/telegram/db/operations.py deleted file mode 100644 index 5569162..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/db/operations.py +++ /dev/null @@ -1,838 +0,0 @@ -""" -Database Operations for Telegram Bot - -This module provides CRUD operations for: -- telegram_users: Telegram user management and Oracle account linking -- telegram_auth_codes: Authentication code management -- telegram_sessions: Conversation session management -""" - -import logging -import uuid -from datetime import datetime, timedelta -from typing import Optional, Dict, Any, List - -import aiosqlite - -from .database import DB_PATH - -logger = logging.getLogger(__name__) - - -# ============================================================================ -# TELEGRAM USERS OPERATIONS -# ============================================================================ - -async def create_or_update_user( - telegram_user_id: int, - username: Optional[str], - first_name: str, - last_name: Optional[str] -) -> bool: - """ - Create or update a Telegram user record. - - Args: - telegram_user_id: Telegram user ID - username: Telegram username (without @) - first_name: User's first name - last_name: User's last name - - Returns: - bool: True if successful - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - await db.execute(""" - INSERT INTO telegram_users ( - telegram_user_id, username, first_name, last_name, last_active_at - ) - VALUES (?, ?, ?, ?, ?) - ON CONFLICT(telegram_user_id) DO UPDATE SET - username = excluded.username, - first_name = excluded.first_name, - last_name = excluded.last_name, - last_active_at = excluded.last_active_at - """, (telegram_user_id, username, first_name, last_name, datetime.now())) - - await db.commit() - logger.info(f"User {telegram_user_id} created/updated") - return True - - except Exception as e: - logger.error(f"Failed to create/update user {telegram_user_id}: {e}") - return False - - -async def get_user(telegram_user_id: int) -> Optional[Dict[str, Any]]: - """ - Get user information by Telegram user ID. - - Args: - telegram_user_id: Telegram user ID - - Returns: - Optional[Dict]: User data or None if not found - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - cursor = await db.execute(""" - SELECT * FROM telegram_users - WHERE telegram_user_id = ? - """, (telegram_user_id,)) - - row = await cursor.fetchone() - if row: - return dict(row) - return None - - except Exception as e: - logger.error(f"Failed to get user {telegram_user_id}: {e}") - return None - - -async def link_user_to_oracle( - telegram_user_id: int, - oracle_username: str, - jwt_token: str, - jwt_refresh_token: str, - token_expires_at: datetime -) -> bool: - """ - Link a Telegram user to an Oracle account and save JWT tokens. - - Args: - telegram_user_id: Telegram user ID - oracle_username: Oracle username - jwt_token: JWT access token - jwt_refresh_token: JWT refresh token - token_expires_at: Token expiration timestamp - - Returns: - bool: True if successful - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - await db.execute(""" - UPDATE telegram_users - SET oracle_username = ?, - jwt_token = ?, - jwt_refresh_token = ?, - token_expires_at = ?, - linked_at = ?, - is_active = 1 - WHERE telegram_user_id = ? - """, ( - oracle_username, - jwt_token, - jwt_refresh_token, - token_expires_at, - datetime.now(), - telegram_user_id - )) - - await db.commit() - logger.info(f"User {telegram_user_id} linked to Oracle user {oracle_username}") - return True - - except Exception as e: - logger.error(f"Failed to link user {telegram_user_id}: {e}") - return False - - -async def update_user_tokens( - telegram_user_id: int, - jwt_token: str, - jwt_refresh_token: str, - token_expires_at: datetime -) -> bool: - """ - Update JWT tokens for a user. - - Args: - telegram_user_id: Telegram user ID - jwt_token: New JWT access token - jwt_refresh_token: New JWT refresh token - token_expires_at: New token expiration timestamp - - Returns: - bool: True if successful - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - await db.execute(""" - UPDATE telegram_users - SET jwt_token = ?, - jwt_refresh_token = ?, - token_expires_at = ? - WHERE telegram_user_id = ? - """, (jwt_token, jwt_refresh_token, token_expires_at, telegram_user_id)) - - await db.commit() - logger.info(f"Tokens updated for user {telegram_user_id}") - return True - - except Exception as e: - logger.error(f"Failed to update tokens for user {telegram_user_id}: {e}") - return False - - -async def update_user_last_active(telegram_user_id: int) -> bool: - """ - Update the last active timestamp for a user. - - Args: - telegram_user_id: Telegram user ID - - Returns: - bool: True if successful - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - await db.execute(""" - UPDATE telegram_users - SET last_active_at = ? - WHERE telegram_user_id = ? - """, (datetime.now(), telegram_user_id)) - - await db.commit() - return True - - except Exception as e: - logger.error(f"Failed to update last active for user {telegram_user_id}: {e}") - return False - - -async def is_user_linked(telegram_user_id: int) -> bool: - """ - Check if a user is linked to an Oracle account. - - Args: - telegram_user_id: Telegram user ID - - Returns: - bool: True if user is linked - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - cursor = await db.execute(""" - SELECT oracle_username FROM telegram_users - WHERE telegram_user_id = ? AND oracle_username IS NOT NULL - """, (telegram_user_id,)) - - row = await cursor.fetchone() - return row is not None - - except Exception as e: - logger.error(f"Failed to check if user {telegram_user_id} is linked: {e}") - return False - - -async def is_user_authenticated(telegram_user_id: int) -> bool: - """ - Check if a user is authenticated (linked and has valid token). - - Args: - telegram_user_id: Telegram user ID - - Returns: - bool: True if user is authenticated - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - cursor = await db.execute(""" - SELECT oracle_username, jwt_token, token_expires_at - FROM telegram_users - WHERE telegram_user_id = ? - AND oracle_username IS NOT NULL - AND jwt_token IS NOT NULL - """, (telegram_user_id,)) - - row = await cursor.fetchone() - if not row: - return False - - # Check if token is expired (with some buffer) - if row[2]: # token_expires_at - expires_at = datetime.fromisoformat(row[2]) - # Token should have at least 5 minutes remaining - if expires_at < datetime.now() + timedelta(minutes=5): - return False - - return True - - except Exception as e: - logger.error(f"Failed to check if user {telegram_user_id} is authenticated: {e}") - return False - - -# ============================================================================ -# AUTHENTICATION CODES OPERATIONS -# ============================================================================ - -async def create_auth_code( - code: str, - telegram_user_id: int, - oracle_username: str, - expires_in_minutes: int = 5, - server_id: Optional[str] = None -) -> bool: - """ - Create a new authentication code for linking. - - Args: - code: 8-character authentication code - telegram_user_id: Telegram user ID - oracle_username: Oracle username to link - expires_in_minutes: Code expiration time in minutes (default: 5) - server_id: Oracle server ID (for multi-server mode) - - Returns: - bool: True if successful - """ - try: - expires_at = datetime.now() + timedelta(minutes=expires_in_minutes) - - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - await db.execute(""" - INSERT INTO telegram_auth_codes ( - code, telegram_user_id, oracle_username, expires_at, server_id - ) - VALUES (?, ?, ?, ?, ?) - """, (code, telegram_user_id, oracle_username, expires_at, server_id)) - - await db.commit() - logger.info(f"Auth code created for user {telegram_user_id} (server_id={server_id})") - return True - - except Exception as e: - logger.error(f"Failed to create auth code: {e}") - return False - - -async def get_auth_code(code: str) -> Optional[Dict[str, Any]]: - """ - Get authentication code information. - - Args: - code: 8-character authentication code - - Returns: - Optional[Dict]: Code data or None if not found - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - cursor = await db.execute(""" - SELECT * FROM telegram_auth_codes - WHERE code = ? - """, (code,)) - - row = await cursor.fetchone() - if row: - return dict(row) - return None - - except Exception as e: - logger.error(f"Failed to get auth code: {e}") - return None - - -async def verify_and_use_auth_code(code: str) -> Optional[Dict[str, Any]]: - """ - Verify an authentication code and mark it as used. - - Args: - code: 8-character authentication code - - Returns: - Optional[Dict]: Code data if valid, None if invalid/expired - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - # Check if code exists, is not used, and not expired - cursor = await db.execute(""" - SELECT * FROM telegram_auth_codes - WHERE code = ? - AND used = 0 - AND expires_at > ? - """, (code, datetime.now())) - - row = await cursor.fetchone() - if not row: - logger.warning(f"Invalid or expired code: {code}") - return None - - # Mark code as used - await db.execute(""" - UPDATE telegram_auth_codes - SET used = 1, used_at = ? - WHERE code = ? - """, (datetime.now(), code)) - - await db.commit() - logger.info(f"Auth code {code} verified and used") - - return dict(row) - - except Exception as e: - logger.error(f"Failed to verify auth code: {e}") - return None - - -async def get_pending_codes_for_user(telegram_user_id: int) -> List[Dict[str, Any]]: - """ - Get all pending (unused, non-expired) codes for a user. - - Args: - telegram_user_id: Telegram user ID - - Returns: - List[Dict]: List of pending codes - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - cursor = await db.execute(""" - SELECT * FROM telegram_auth_codes - WHERE telegram_user_id = ? - AND used = 0 - AND expires_at > ? - ORDER BY created_at DESC - """, (telegram_user_id, datetime.now())) - - rows = await cursor.fetchall() - return [dict(row) for row in rows] - - except Exception as e: - logger.error(f"Failed to get pending codes for user {telegram_user_id}: {e}") - return [] - - -# ============================================================================ -# EMAIL AUTHENTICATION CODES OPERATIONS -# ============================================================================ - -async def get_pending_email_code( - telegram_user_id: int -) -> Optional[Dict]: - """ - Get pending (non-expired, non-used) email code for user - - Returns: - Code data dict or None if no pending code - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - cursor = await db.execute(""" - SELECT code, email, oracle_username, expires_at, failed_attempts - FROM email_auth_codes - WHERE telegram_user_id = ? - AND used = 0 - AND expires_at > ? - ORDER BY created_at DESC - LIMIT 1 - """, (telegram_user_id, datetime.now())) - - row = await cursor.fetchone() - - if row: - return { - 'code': row[0], - 'email': row[1], - 'oracle_username': row[2], - 'expires_at': datetime.fromisoformat(row[3]), - 'failed_attempts': row[4] - } - - return None - - except Exception as e: - logger.error(f"Failed to get pending email code: {e}") - return None - - -async def create_email_auth_code( - code: str, - email: str, - username: str, - telegram_user_id: int, - expiry_minutes: int = 5 -) -> bool: - """ - Create new email authentication code - - NOTE: Caller should check for existing pending codes first - """ - expires_at = datetime.now() + timedelta(minutes=expiry_minutes) - - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - await db.execute(""" - INSERT INTO email_auth_codes - (code, email, oracle_username, telegram_user_id, expires_at) - VALUES (?, ?, ?, ?, ?) - """, (code, email, username, telegram_user_id, expires_at)) - - await db.commit() - - logger.info( - f"Email auth code created for user {telegram_user_id}, " - f"expires at {expires_at.isoformat()}" - ) - return True - - except Exception as e: - logger.error(f"Error creating email auth code: {e}", exc_info=True) - return False - - -async def get_email_auth_code(code: str) -> Optional[Dict]: - """Get email auth code details""" - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - cursor = await db.execute(""" - SELECT code, email, oracle_username, telegram_user_id, - created_at, expires_at, used, used_at, failed_attempts - FROM email_auth_codes - WHERE code = ? - """, (code,)) - - row = await cursor.fetchone() - - if not row: - return None - - return { - 'code': row[0], - 'email': row[1], - 'oracle_username': row[2], - 'telegram_user_id': row[3], - 'created_at': datetime.fromisoformat(row[4]), - 'expires_at': datetime.fromisoformat(row[5]), - 'used': bool(row[6]), - 'used_at': datetime.fromisoformat(row[7]) if row[7] else None, - 'failed_attempts': row[8] - } - - except Exception as e: - logger.error(f"Failed to get email auth code: {e}") - return None - - -async def increment_failed_attempts(code: str) -> bool: - """Increment failed validation attempts for code""" - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - await db.execute(""" - UPDATE email_auth_codes - SET failed_attempts = failed_attempts + 1 - WHERE code = ? - """, (code,)) - - await db.commit() - return True - - except Exception as e: - logger.error(f"Error incrementing failed attempts: {e}") - return False - - -async def mark_email_code_used(code: str) -> bool: - """Mark email code as used""" - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - await db.execute(""" - UPDATE email_auth_codes - SET used = 1, used_at = ? - WHERE code = ? - """, (datetime.now(), code)) - - await db.commit() - - logger.info(f"Email auth code marked as used: {code}") - return True - - except Exception as e: - logger.error(f"Error marking email code as used: {e}") - return False - - -async def delete_user_email_codes(telegram_user_id: int) -> int: - """Delete all email codes for user (cleanup)""" - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - cursor = await db.execute(""" - DELETE FROM email_auth_codes - WHERE telegram_user_id = ? - """, (telegram_user_id,)) - - await db.commit() - - deleted = cursor.rowcount - logger.info(f"Deleted {deleted} email codes for user {telegram_user_id}") - return deleted - - except Exception as e: - logger.error(f"Error deleting user email codes: {e}") - return 0 - - -# ============================================================================ -# SESSION OPERATIONS -# ============================================================================ - -async def create_session( - telegram_user_id: int, - conversation_state: Optional[str] = None, - expires_in_hours: int = 24 -) -> Optional[str]: - """ - Create a new conversation session. - - Args: - telegram_user_id: Telegram user ID - conversation_state: JSON string of conversation state - expires_in_hours: Session expiration time in hours (default: 24) - - Returns: - Optional[str]: Session ID if successful, None otherwise - """ - try: - session_id = str(uuid.uuid4()) - expires_at = datetime.now() + timedelta(hours=expires_in_hours) - - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - await db.execute(""" - INSERT INTO telegram_sessions ( - session_id, telegram_user_id, conversation_state, expires_at - ) - VALUES (?, ?, ?, ?) - """, (session_id, telegram_user_id, conversation_state, expires_at)) - - await db.commit() - logger.info(f"Session {session_id} created for user {telegram_user_id}") - return session_id - - except Exception as e: - logger.error(f"Failed to create session: {e}") - return None - - -async def get_session(session_id: str) -> Optional[Dict[str, Any]]: - """ - Get session information. - - Args: - session_id: Session UUID - - Returns: - Optional[Dict]: Session data or None if not found/expired - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - cursor = await db.execute(""" - SELECT * FROM telegram_sessions - WHERE session_id = ? - AND expires_at > ? - """, (session_id, datetime.now())) - - row = await cursor.fetchone() - if row: - return dict(row) - return None - - except Exception as e: - logger.error(f"Failed to get session {session_id}: {e}") - return None - - -async def get_user_active_session(telegram_user_id: int) -> Optional[Dict[str, Any]]: - """ - Get the most recent active session for a user. - - Args: - telegram_user_id: Telegram user ID - - Returns: - Optional[Dict]: Session data or None if no active session - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - cursor = await db.execute(""" - SELECT * FROM telegram_sessions - WHERE telegram_user_id = ? - AND expires_at > ? - ORDER BY updated_at DESC - LIMIT 1 - """, (telegram_user_id, datetime.now())) - - row = await cursor.fetchone() - if row: - return dict(row) - return None - - except Exception as e: - logger.error(f"Failed to get active session for user {telegram_user_id}: {e}") - return None - - -async def update_session_state( - session_id: str, - conversation_state: str -) -> bool: - """ - Update the conversation state for a session. - - Args: - session_id: Session UUID - conversation_state: JSON string of conversation state - - Returns: - bool: True if successful - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - await db.execute(""" - UPDATE telegram_sessions - SET conversation_state = ?, - updated_at = ? - WHERE session_id = ? - """, (conversation_state, datetime.now(), session_id)) - - await db.commit() - logger.info(f"Session {session_id} state updated") - return True - - except Exception as e: - logger.error(f"Failed to update session {session_id}: {e}") - return False - - -async def delete_session(session_id: str) -> bool: - """ - Delete a session. - - Args: - session_id: Session UUID - - Returns: - bool: True if successful - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - await db.execute(""" - DELETE FROM telegram_sessions - WHERE session_id = ? - """, (session_id,)) - - await db.commit() - logger.info(f"Session {session_id} deleted") - return True - - except Exception as e: - logger.error(f"Failed to delete session {session_id}: {e}") - return False - - -async def delete_user_sessions(telegram_user_id: int) -> bool: - """ - Delete all sessions for a user. - - Args: - telegram_user_id: Telegram user ID - - Returns: - bool: True if successful - """ - try: - async with aiosqlite.connect(DB_PATH) as db: - await db.execute("PRAGMA busy_timeout=5000") - db.row_factory = aiosqlite.Row - cursor = await db.execute(""" - DELETE FROM telegram_sessions - WHERE telegram_user_id = ? - """, (telegram_user_id,)) - - await db.commit() - deleted = cursor.rowcount - logger.info(f"Deleted {deleted} sessions for user {telegram_user_id}") - return True - - except Exception as e: - logger.error(f"Failed to delete sessions for user {telegram_user_id}: {e}") - return False - - -# Export all functions -__all__ = [ - # User operations - 'create_or_update_user', - 'get_user', - 'link_user_to_oracle', - 'update_user_tokens', - 'update_user_last_active', - 'is_user_linked', - 'is_user_authenticated', - # Auth code operations - 'create_auth_code', - 'get_auth_code', - 'verify_and_use_auth_code', - 'get_pending_codes_for_user', - # Email auth code operations - 'get_pending_email_code', - 'create_email_auth_code', - 'get_email_auth_code', - 'increment_failed_attempts', - 'mark_email_code_used', - 'delete_user_email_codes', - # Session operations - 'create_session', - 'get_session', - 'get_user_active_session', - 'update_session_state', - 'delete_session', - 'delete_user_sessions', -] diff --git a/deploy-package-20260223-151231/backend/modules/telegram/routers/__init__.py b/deploy-package-20260223-151231/backend/modules/telegram/routers/__init__.py deleted file mode 100644 index 153af18..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/routers/__init__.py +++ /dev/null @@ -1,32 +0,0 @@ -"""Telegram module router factory.""" - -from fastapi import APIRouter - - -def create_telegram_router() -> APIRouter: - """ - Create and configure Telegram module router. - - Includes all Telegram bot internal API endpoints: - - /auth/verify-user - Verify Telegram user authentication - - /auth/generate-code - Generate auth code for linking - - /auth/verify-code - Verify auth code - - /stats - Bot database statistics - - Returns: - APIRouter: Configured router for Telegram module - """ - router = APIRouter() - - # Import routers here to avoid circular imports - from .auth_codes import router as auth_codes_router - from .internal_api import internal_api as internal_api_router - - # Include all sub-routers (no prefix - already prefixed in main.py with /api/telegram) - # Auth codes router provides /auth/* endpoints - router.include_router(auth_codes_router, tags=["telegram-auth"]) - - # Internal API router provides additional endpoints like /stats - router.include_router(internal_api_router, tags=["telegram-internal"]) - - return router diff --git a/deploy-package-20260223-151231/backend/modules/telegram/routers/auth_codes.py b/deploy-package-20260223-151231/backend/modules/telegram/routers/auth_codes.py deleted file mode 100644 index fdee6cb..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/routers/auth_codes.py +++ /dev/null @@ -1,945 +0,0 @@ -""" -API Router pentru Telegram Bot Integration -Furnizează endpoint-uri pentru autentificare, linking și export rapoarte pentru Telegram bot -""" -from fastapi import APIRouter, Body, Depends, HTTPException, Request -from typing import List, Optional, Dict, Any -# import sys # Removed - no longer needed -import os -import secrets -import string -import httpx -from datetime import datetime, timedelta -from pydantic import BaseModel, Field - - -from shared.auth.dependencies import get_current_user -from shared.auth.models import CurrentUser -from shared.auth.jwt_handler import jwt_handler -from shared.database.oracle_pool import oracle_pool - -# Telegram bot internal API URL (running on same server) -TELEGRAM_BOT_INTERNAL_API = os.getenv("TELEGRAM_BOT_INTERNAL_API", "http://localhost:8000/api/telegram") - -router = APIRouter(redirect_slashes=False) - -# ==================== Schemas ==================== - -class GenerateCodeRequest(BaseModel): - """Request pentru generarea unui cod de linking""" - telegram_user_id: int = Field(description="ID-ul utilizatorului Telegram") - telegram_username: Optional[str] = Field(default=None, description="Username-ul Telegram") - telegram_first_name: Optional[str] = Field(default=None, description="Prenumele utilizatorului") - telegram_last_name: Optional[str] = Field(default=None, description="Numele utilizatorului") - - -class GenerateCodeResponse(BaseModel): - """Response pentru generarea unui cod de linking""" - linking_code: str = Field(description="Codul de linking generat (8 caractere)") - expires_at: datetime = Field(description="Data și ora expirării codului") - expires_in_minutes: int = Field(description="Minutele până la expirare") - - -class VerifyUserRequest(BaseModel): - """ - Request pentru verificarea utilizatorului în Oracle - - Suportă 2 flow-uri: - 1. Auto-linking (recomandat): doar linking_code și oracle_username - - Bot-ul verifică codul în SQLite, extrage oracle_username - - Backend face lookup în Oracle fără verificare parolă - - Codul valid este proof-of-authorization - - 2. Full verification (opțional): username, password, linking_code - - Verificare completă cu parolă în Oracle - """ - linking_code: str = Field(description="Codul de linking de la /generate-code") - oracle_username: Optional[str] = Field(default=None, description="Username Oracle (pentru auto-linking)") - username: Optional[str] = Field(default=None, description="Username pentru verificare completă") - password: Optional[str] = Field(default=None, description="Parolă pentru verificare completă") - server_id: Optional[str] = Field(default=None, description="Oracle server ID (pentru multi-server mode)") - - -class VerifyUserResponse(BaseModel): - """Response pentru verificarea utilizatorului""" - success: bool = Field(description="True dacă verificarea a avut succes") - access_token: Optional[str] = Field(default=None, description="JWT access token") - refresh_token: Optional[str] = Field(default=None, description="JWT refresh token") - user: Optional[Dict[str, Any]] = Field(default=None, description="Detalii utilizator") - message: str = Field(description="Mesaj de status") - - -class RefreshTokenRequest(BaseModel): - """Request pentru refresh JWT token""" - refresh_token: str = Field(description="Refresh token-ul obținut la autentificare") - - -class RefreshTokenResponse(BaseModel): - """Response pentru refresh token""" - access_token: str = Field(description="Noul JWT access token") - expires_in: int = Field(description="Timpul de expirare în secunde") - token_type: str = Field(default="bearer", description="Tipul token-ului") - - -class ExportReportRequest(BaseModel): - """Request pentru exportul unui raport""" - company_id: int = Field(description="ID-ul firmei") - report_type: str = Field(description="Tipul raportului (invoices, payments, dashboard)") - format: str = Field(default="excel", description="Formatul exportului (excel, pdf, csv)") - filters: Optional[Dict[str, Any]] = Field(default=None, description="Filtre pentru raport") - - -class ExportReportResponse(BaseModel): - """Response pentru exportul raportului""" - success: bool = Field(description="True dacă exportul a avut succes") - file_url: Optional[str] = Field(default=None, description="URL-ul fișierului generat") - file_name: Optional[str] = Field(default=None, description="Numele fișierului generat") - file_size_bytes: Optional[int] = Field(default=None, description="Mărimea fișierului în bytes") - message: str = Field(description="Mesaj de status") - - -class VerifyEmailRequest(BaseModel): - """Request pentru verificarea email-ului în Oracle""" - email: str = Field(description="Adresa de email Oracle") - server_id: Optional[str] = Field(default=None, description="Oracle server ID (pentru multi-server mode)") - - -class VerifyEmailResponse(BaseModel): - """Response pentru verificarea email-ului""" - success: bool = Field(description="True dacă email-ul există și este activ") - username: Optional[str] = Field(default=None, description="Username-ul Oracle asociat") - message: str = Field(description="Mesaj de status") - - -class TelegramEmailLoginRequest(BaseModel): - """Request pentru autentificare prin email + parolă""" - email: str = Field(description="Adresa de email Oracle") - password: str = Field(description="Parola Oracle") - telegram_user_id: int = Field(description="ID-ul utilizatorului Telegram") - session_token: str = Field(description="Token de sesiune pentru preveni spoofing") - server_id: Optional[str] = Field(default=None, description="Oracle server ID (pentru multi-server mode)") - - -class TelegramEmailLoginResponse(BaseModel): - """Response pentru autentificare prin email + parolă""" - success: bool = Field(description="True dacă autentificarea a avut succes") - access_token: Optional[str] = Field(default=None, description="JWT access token") - refresh_token: Optional[str] = Field(default=None, description="JWT refresh token") - token_type: str = Field(default="bearer", description="Tipul token-ului") - user_id: Optional[int] = Field(default=None, description="ID-ul utilizatorului Oracle") - username: Optional[str] = Field(default=None, description="Username-ul Oracle") - companies: List[Dict[str, Any]] = Field(default_factory=list, description="Lista companiilor") - message: str = Field(description="Mesaj de status") - - -class SwitchServerRequest(BaseModel): - """Request pentru schimbarea serverului Oracle""" - oracle_username: str = Field(description="Username Oracle al utilizatorului curent") - new_server_id: str = Field(description="ID-ul noului server Oracle") - oracle_password: Optional[str] = Field(default=None, description="Parola Oracle pe noul server (obligatorie dacă servere diferite au parole diferite)") - - -class SwitchServerResponse(BaseModel): - """Response pentru schimbarea serverului Oracle""" - success: bool = Field(description="True dacă schimbarea a reușit") - access_token: Optional[str] = Field(default=None, description="Noul JWT access token") - refresh_token: Optional[str] = Field(default=None, description="Noul JWT refresh token") - message: str = Field(description="Mesaj de status") - - -# ==================== Helper Functions ==================== - -# Rate limiting storage (in-memory) -from collections import defaultdict -_endpoint_rate_limits = defaultdict(list) - - -def check_endpoint_rate_limit( - identifier: str, - max_attempts: int = 5, - window_minutes: int = 5 -) -> bool: - """Backend rate limiting for sensitive endpoints""" - now = datetime.now() - cutoff = now - timedelta(minutes=window_minutes) - - # Clean old attempts - _endpoint_rate_limits[identifier] = [ - attempt for attempt in _endpoint_rate_limits[identifier] - if attempt > cutoff - ] - - # Check limit - if len(_endpoint_rate_limits[identifier]) >= max_attempts: - return False - - # Add attempt - _endpoint_rate_limits[identifier].append(now) - return True - - -def verify_session_token( - telegram_user_id: int, - email: str, - token: str -) -> bool: - """ - Verify session token from bot to prevent user ID spoofing - - Token format: user_id:email:signature - """ - import hashlib - - try: - parts = token.split(":") - if len(parts) != 3: - return False - - token_user_id, token_email, signature = parts - - # Verify user ID and email match - if int(token_user_id) != telegram_user_id or token_email != email: - return False - - # Verify signature - secret = os.getenv("AUTH_SESSION_SECRET", "change-me-in-production") - payload = f"{telegram_user_id}:{email}:{secret}" - expected_signature = hashlib.sha256(payload.encode()).hexdigest()[:16] - - if signature != expected_signature: - return False - - return True - - except Exception: - return False - -def generate_linking_code(length: int = 8) -> str: - """ - Generează un cod alfanumeric aleatoriu pentru linking - - Args: - length: Lungimea codului (default: 8) - - Returns: - Codul generat (uppercase alphanumeric) - """ - alphabet = string.ascii_uppercase + string.digits - # Exclude caractere care pot fi confundate: 0, O, I, 1 - alphabet = alphabet.replace('0', '').replace('O', '').replace('I', '').replace('1', '') - return ''.join(secrets.choice(alphabet) for _ in range(length)) - - -async def get_oracle_user_by_username(username: str, server_id: Optional[str] = None) -> Optional[Dict[str, Any]]: - """ - Obține informații despre utilizator din Oracle FĂRĂ verificare parolă. - - Folosit pentru auto-linking când utilizatorul a fost deja autentificat - prin generarea unui linking code valid în aplicația web. - - Args: - username: Username-ul utilizatorului Oracle - server_id: ID-ul serverului Oracle (pentru multi-server mode) - - Returns: - Dict cu informații despre utilizator sau None dacă nu există - """ - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Obține detalii utilizator - cursor.execute(""" - SELECT ID_UTIL, UTILIZATOR - FROM UTILIZATORI - WHERE UPPER(UTILIZATOR) = :username - """, {'username': username.upper()}) - - user_row = cursor.fetchone() - if not user_row: - return None - - user_id = user_row[0] - actual_username = user_row[1] - - # Obține companiile utilizatorului - cursor.execute(""" - SELECT A.ID_FIRMA, A.FIRMA - FROM V_NOM_FIRME A - WHERE A.ID_FIRMA IN ( - SELECT ID_FIRMA - FROM VDEF_UTIL_FIRME - WHERE ID_PROGRAM = 2 - AND ID_UTIL = :user_id - ) - ORDER BY A.FIRMA - """, {'user_id': user_id}) - - companies_result = cursor.fetchall() - companies = [str(row[0]) for row in companies_result] - - return { - 'user_id': user_id, - 'username': actual_username, - 'companies': companies, - 'permissions': ['read', 'reports'] - } - - except Exception as e: - print(f"Error getting Oracle user by username: {e}") - return None - - -async def verify_oracle_user(username: str, password: str, server_id: Optional[str] = None) -> Optional[Dict[str, Any]]: - """ - Verifică utilizatorul în Oracle folosind pack_drepturi.verificautilizator - - Args: - username: Username-ul utilizatorului - password: Parola utilizatorului - server_id: ID-ul serverului Oracle (pentru multi-server mode) - - Returns: - Dict cu informații despre utilizator sau None dacă verificarea eșuează - """ - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Verifică autentificarea - cursor.execute(""" - SELECT pack_drepturi.verificautilizator(:username, :password) - FROM DUAL - """, { - 'username': username.upper(), - 'password': password - }) - - result = cursor.fetchone() - verification_result = result[0] if result else -1 - - if verification_result == -1: - return None - - # Obține detalii utilizator - cursor.execute(""" - SELECT ID_UTIL, UTILIZATOR - FROM UTILIZATORI - WHERE UPPER(UTILIZATOR) = :username - """, {'username': username.upper()}) - - user_row = cursor.fetchone() - if not user_row: - return None - - user_id = user_row[0] - - # Obține companiile utilizatorului - cursor.execute(""" - SELECT A.ID_FIRMA, A.FIRMA - FROM V_NOM_FIRME A - WHERE A.ID_FIRMA IN ( - SELECT ID_FIRMA - FROM VDEF_UTIL_FIRME - WHERE ID_PROGRAM = 2 - AND ID_UTIL = :user_id - ) - ORDER BY A.FIRMA - """, {'user_id': user_id}) - - companies_result = cursor.fetchall() - companies = [str(row[0]) for row in companies_result] - - return { - 'user_id': user_id, - 'username': username, - 'companies': companies, - 'permissions': ['read', 'reports'] - } - - except Exception as e: - print(f"Error verifying Oracle user: {e}") - return None - - -# ==================== Endpoints ==================== - -@router.post("/auth/generate-code", response_model=GenerateCodeResponse) -async def generate_linking_code_endpoint( - request: Request, - current_user: CurrentUser = Depends(get_current_user) -): - """ - Generează un cod de linking pentru conectarea unui utilizator Telegram - - Flow: - 1. Utilizatorul autentificat în aplicație solicită un cod - 2. Se generează un cod unic de 8 caractere - 3. Codul este trimis la Telegram bot pentru salvare în SQLite cu TTL de 15 minute - 4. Utilizatorul introduce codul în Telegram bot pentru linking - - Note: - - Acest endpoint necesită autentificare JWT (utilizatorul trebuie să fie logat în aplicație) - - Codul expiră după 15 minute - - Fiecare request generează un cod nou (codurile vechi devin invalide) - - Nu este nevoie de telegram_user_id în acest moment (utilizatorul nu e încă conectat la Telegram) - - server_id este extras automat din JWT (setat de auth middleware în request.state) - """ - try: - # Extrage server_id din JWT (setat de auth middleware) - server_id = getattr(request.state, 'server_id', None) - - # Generează cod unic - linking_code = generate_linking_code() - - # Setează expirarea la 15 minute - expires_at = datetime.utcnow() + timedelta(minutes=15) - expires_in_minutes = 15 - - # Salvează codul în database-ul Telegram bot (SQLite) via internal API - try: - async with httpx.AsyncClient(timeout=5.0) as client: - save_code_response = await client.post( - f"{TELEGRAM_BOT_INTERNAL_API}/internal/save-code", - json={ - "code": linking_code, - "telegram_user_id": 0, # Not known yet (user hasn't linked) - "oracle_username": current_user.username, - "expires_in_minutes": expires_in_minutes, - "server_id": server_id - } - ) - - # Accept both 200 (OK) and 201 (Created) as success - if save_code_response.status_code not in [200, 201]: - raise HTTPException( - status_code=500, - detail=f"Failed to save code to Telegram bot: {save_code_response.text}" - ) - except httpx.TimeoutException: - raise HTTPException( - status_code=503, - detail="Telegram bot service is not responding. Please try again later." - ) - except httpx.ConnectError: - raise HTTPException( - status_code=503, - detail="Cannot connect to Telegram bot service. Please contact administrator." - ) - - return GenerateCodeResponse( - linking_code=linking_code, - expires_at=expires_at, - expires_in_minutes=expires_in_minutes - ) - - except HTTPException: - raise - except Exception as e: - raise HTTPException( - status_code=500, - detail=f"Eroare la generarea codului de linking: {str(e)}" - ) - - -@router.post("/auth/verify-user", response_model=VerifyUserResponse) -async def verify_user_endpoint(request: VerifyUserRequest): - """ - Verifică utilizatorul în Oracle și returnează JWT tokens - - Suportă 2 flow-uri de autentificare: - - Flow A - Auto-linking (RECOMANDAT): - 1. Bot verifică linking_code în SQLite (code valid = user s-a autentificat în web app) - 2. Bot extrage oracle_username din cod - 3. Bot trimite: {linking_code, oracle_username} - 4. Backend face lookup în Oracle (FĂRĂ verificare parolă) - 5. Backend generează și returnează JWT tokens - - Flow B - Full verification (OPȚIONAL): - 1. Bot cere username și parolă de la user în Telegram - 2. Bot trimite: {linking_code, username, password} - 3. Backend verifică credențialele în Oracle - 4. Backend generează și returnează JWT tokens - - Note: - - Acest endpoint NU necesită autentificare JWT (este public pentru bot) - - Flow A oferă UX superior (fără re-introducere parolă) - - Linking code-ul valid este proof-of-authorization - """ - try: - # Flow A: Auto-linking (oracle_username provided, no password) - if request.oracle_username and not request.password: - user_data = await get_oracle_user_by_username(request.oracle_username, server_id=request.server_id) - - if not user_data: - return VerifyUserResponse( - success=False, - message=f"Utilizatorul {request.oracle_username} nu există în Oracle" - ) - - # Flow B: Full verification (username + password provided) - elif request.username and request.password: - user_data = await verify_oracle_user(request.username, request.password, server_id=request.server_id) - - if not user_data: - return VerifyUserResponse( - success=False, - message="Username sau parolă incorectă" - ) - - # Invalid request (missing required fields) - else: - return VerifyUserResponse( - success=False, - message="Trebuie furnizat fie oracle_username (auto-linking) fie username+password (verificare completă)" - ) - - # Generează JWT tokens (cu server_id pentru multi-server mode) - access_token = jwt_handler.create_access_token( - username=user_data['username'], - companies=user_data['companies'], - user_id=user_data['user_id'], - permissions=user_data['permissions'], - server_id=request.server_id - ) - - refresh_token = jwt_handler.create_refresh_token( - username=user_data['username'], - user_id=user_data['user_id'], - server_id=request.server_id - ) - - return VerifyUserResponse( - success=True, - access_token=access_token, - refresh_token=refresh_token, - user={ - 'user_id': user_data['user_id'], - 'username': user_data['username'], - 'companies': user_data['companies'], - 'permissions': user_data['permissions'] - }, - message="Autentificare reușită" - ) - - except Exception as e: - raise HTTPException( - status_code=500, - detail=f"Eroare la verificarea utilizatorului: {str(e)}" - ) - - -@router.post("/auth/refresh-token", response_model=RefreshTokenResponse) -async def refresh_token_endpoint(request: RefreshTokenRequest): - """ - Refresh-uiește un JWT access token folosind refresh token-ul - - Acest endpoint este folosit de Telegram bot pentru a obține un nou access token - când cel curent expiră, fără a solicita din nou username/password. - - Flow: - 1. Botul Telegram detectează că access token-ul a expirat - 2. Trimite refresh token-ul la acest endpoint - 3. Se validează refresh token-ul și se generează un nou access token - 4. Botul stochează noul access token în SQLite - - Note: - - Refresh token-ul este valid 7 zile (vs 30 minute pentru access token) - - Dacă refresh token-ul expiră, utilizatorul trebuie să se re-autentifice - """ - try: - # Verifică refresh token-ul - token_data = jwt_handler.verify_token(request.refresh_token) - - if not token_data or token_data.token_type != "refresh": - raise HTTPException( - status_code=401, - detail="Refresh token invalid sau expirat" - ) - - # Obține companiile actualizate din Oracle (folosind server_id din refresh token) - async with oracle_pool.get_connection(token_data.server_id) as connection: - with connection.cursor() as cursor: - cursor.execute(""" - SELECT A.ID_FIRMA - FROM V_NOM_FIRME A - WHERE A.ID_FIRMA IN ( - SELECT ID_FIRMA - FROM VDEF_UTIL_FIRME - WHERE ID_PROGRAM = 2 - AND ID_UTIL = :user_id - ) - ORDER BY A.FIRMA - """, {'user_id': token_data.user_id}) - - companies_result = cursor.fetchall() - companies = [str(row[0]) for row in companies_result] - - # Generează nou access token (păstrează server_id din refresh token) - new_access_token = jwt_handler.create_access_token( - username=token_data.username, - companies=companies, - user_id=token_data.user_id, - permissions=token_data.permissions, - server_id=token_data.server_id - ) - - return RefreshTokenResponse( - access_token=new_access_token, - expires_in=jwt_handler.access_token_expire_minutes * 60, - token_type="bearer" - ) - - except HTTPException: - raise - except Exception as e: - raise HTTPException( - status_code=500, - detail=f"Eroare la refresh token: {str(e)}" - ) - - -@router.post("/auth/verify-email", response_model=VerifyEmailResponse) -async def verify_email_endpoint(request: VerifyEmailRequest): - """ - Verify if email exists in Oracle UTILIZATORI table (PUBLIC endpoint) - - This is a PUBLIC endpoint used by the telegram bot during email authentication. - Returns username if email exists and user is active. - - Security: Generic error messages to prevent email enumeration. - """ - try: - async with oracle_pool.get_connection(request.server_id) as connection: - with connection.cursor() as cursor: - # Query to find username by email - cursor.execute(""" - SELECT UTILIZATOR - FROM CONTAFIN_ORACLE.UTILIZATORI - WHERE UPPER(EMAIL) = UPPER(:email) - AND INACTIV = 0 - AND STERS = 0 - """, {"email": request.email}) - - row = cursor.fetchone() - - if row: - username = row[0] - return VerifyEmailResponse( - success=True, - username=username, - message="Email verificat cu succes" - ) - else: - # Generic message (no enumeration) - return VerifyEmailResponse( - success=False, - username=None, - message="Email invalid sau inactiv" - ) - - except Exception as e: - # Generic error message (no details exposed) - return VerifyEmailResponse( - success=False, - username=None, - message="Eroare la verificarea email-ului" - ) - - -@router.post("/auth/login-with-email", response_model=TelegramEmailLoginResponse) -async def login_with_email_endpoint(request: TelegramEmailLoginRequest): - """ - Telegram email + password authentication endpoint - - Security features: - - Rate limiting: 5 attempts per 5 minutes - - Session token verification (prevent user ID spoofing) - - Generic error messages (no username/email enumeration) - - Password verification in Oracle (not stored) - """ - - # 1. Rate limiting - rate_limit_key = f"email_login_{request.telegram_user_id}" - if not check_endpoint_rate_limit(rate_limit_key, max_attempts=5, window_minutes=5): - raise HTTPException( - status_code=429, - detail="Prea multe încercări. Te rugăm să aștepți 5 minute." - ) - - # 2. Verify session token (prevent user ID spoofing) - if not verify_session_token( - request.telegram_user_id, - request.email, - request.session_token - ): - raise HTTPException( - status_code=401, - detail="Sesiune invalidă. Te rugăm să reîncepi autentificarea." - ) - - try: - async with oracle_pool.get_connection(request.server_id) as connection: - with connection.cursor() as cursor: - # 3. Find username by email - cursor.execute(""" - SELECT ID_UTIL, UTILIZATOR, INACTIV, STERS - FROM CONTAFIN_ORACLE.UTILIZATORI - WHERE UPPER(EMAIL) = UPPER(:email) - """, {"email": request.email}) - - user_row = cursor.fetchone() - - # SECURITY: Generic error message (no email enumeration) - if not user_row: - raise HTTPException( - status_code=401, - detail="Credențiale invalide" # Generic message - ) - - user_id, username, inactiv, sters = user_row - - # Check if user is active (INACTIV=0 means active, STERS=0 means not deleted) - if inactiv != 0 or sters != 0: - raise HTTPException( - status_code=401, - detail="Credențiale invalide" # Generic message - ) - - # 4. Verify password via Oracle stored procedure - # NOTE: This procedure returns a verification code, NOT the user_id! - # Returns -1 if authentication fails, any other value means success - cursor.execute(""" - SELECT pack_drepturi.verificautilizator(:username, :password) - FROM DUAL - """, { - "username": username.upper(), # IMPORTANT: Oracle usernames are uppercase - "password": request.password - }) - - verification_result = cursor.fetchone()[0] - - # SECURITY: Generic error message (no username leak) - if verification_result == -1: - raise HTTPException( - status_code=401, - detail="Credențiale invalide" # Generic message - ) - - # 5. Get user companies - cursor.execute(""" - SELECT A.ID_FIRMA, A.FIRMA - FROM V_NOM_FIRME A - WHERE A.ID_FIRMA IN ( - SELECT ID_FIRMA - FROM VDEF_UTIL_FIRME - WHERE ID_PROGRAM = 2 - AND ID_UTIL = :user_id - ) - ORDER BY A.FIRMA - """, {'user_id': user_id}) - - companies_result = cursor.fetchall() - companies = [ - {"id": str(row[0]), "name": row[1]} - for row in companies_result - ] - company_ids = [str(row[0]) for row in companies_result] - - # 6. Get user permissions (default for Telegram) - permissions = ['read', 'reports'] - - # 7. Generate JWT tokens (with server_id for multi-server routing) - access_token = jwt_handler.create_access_token( - username=username, - user_id=user_id, - companies=company_ids, - permissions=permissions, - server_id=request.server_id - ) - refresh_token = jwt_handler.create_refresh_token( - username=username, - user_id=user_id, - server_id=request.server_id - ) - - return TelegramEmailLoginResponse( - success=True, - access_token=access_token, - refresh_token=refresh_token, - user_id=user_id, - username=username, - companies=companies, - message="Autentificare reușită" - ) - - except HTTPException: - raise - - except Exception as e: - print(f"Error in login_with_email: {e}") - raise HTTPException( - status_code=500, - detail="Eroare internă. Te rugăm să încerci din nou mai târziu." - ) - - -@router.post("/auth/switch-server", response_model=SwitchServerResponse) -async def switch_server_endpoint( - request: SwitchServerRequest, - current_user: CurrentUser = Depends(get_current_user) -): - """ - Schimbă serverul Oracle activ fără re-autentificare. - - Flux: - 1. Verifică că oracle_username din request == username din JWT (anti-impersonare) - 2. Verifică că utilizatorul există pe noul server (fără parolă, prin get_oracle_user_by_username) - 3. Generează JWT nou cu noul server_id - 4. Returnează tokenurile noi - - Securitate: endpoint protejat cu Bearer JWT valid (Depends(get_current_user)). - """ - # Anti-impersonare: utilizatorul poate schimba serverul doar pentru propriul cont - if request.oracle_username.upper() != current_user.username.upper(): - raise HTTPException(status_code=403, detail="Acces interzis: username nepotrivit") - - # Verifică că utilizatorul există pe noul server - user_data = await get_oracle_user_by_username(request.oracle_username, request.new_server_id) - if not user_data: - return SwitchServerResponse( - success=False, - message=f"Utilizatorul nu există pe serverul {request.new_server_id}" - ) - - # Dacă parola e furnizată, verifică-o pe noul server înainte de a emite JWT - if request.oracle_password: - try: - async with oracle_pool.get_connection(request.new_server_id) as connection: - with connection.cursor() as cursor: - cursor.execute(""" - SELECT pack_drepturi.verificautilizator(:username, :password) - FROM DUAL - """, { - "username": request.oracle_username.upper(), - "password": request.oracle_password - }) - verification_result = cursor.fetchone()[0] - - if verification_result == -1: - return SwitchServerResponse( - success=False, - message="Parolă incorectă pentru acest server" - ) - except Exception as e: - logger.error(f"Password verification error during server switch: {e}") - return SwitchServerResponse( - success=False, - message="Eroare la verificarea parolei pe noul server" - ) - - # Generează JWT nou cu noul server_id - access_token = jwt_handler.create_access_token( - username=user_data['username'], - companies=user_data['companies'], - user_id=user_data['user_id'], - permissions=user_data['permissions'], - server_id=request.new_server_id - ) - refresh_token = jwt_handler.create_refresh_token( - username=user_data['username'], - user_id=user_data['user_id'], - server_id=request.new_server_id - ) - - return SwitchServerResponse( - success=True, - access_token=access_token, - refresh_token=refresh_token, - message="Server schimbat cu succes" - ) - - -@router.post("/export", response_model=ExportReportResponse) -async def export_report_endpoint( - request: ExportReportRequest, - current_user: CurrentUser = Depends(get_current_user) -): - """ - Exportă un raport în format Excel, PDF sau CSV - - Acest endpoint este folosit de Telegram bot pentru a genera rapoarte - și a le trimite utilizatorului. - - Flow: - 1. Botul trimite cerere de export cu parametrii raportului - 2. Se validează că utilizatorul are acces la firma specificată - 3. Se generează raportul în formatul solicitat - 4. Se returnează URL-ul sau conținutul fișierului - - Tipuri de rapoarte suportate: - - invoices: Facturi (cu filtre: dată, status, client) - - payments: Încasări (cu filtre: dată, metodă plată) - - dashboard: Statistici dashboard (rezumat) - - Formate suportate: - - excel: XLSX (cel mai complet) - - pdf: PDF (pentru printing) - - csv: CSV (pentru import în alte sisteme) - - Note: - - Utilizatorul trebuie să aibă acces la firma specificată - - Fișierele generate sunt temporare (șterse după 1 oră) - """ - try: - # Verifică accesul la firmă - company_id_str = str(request.company_id) - if company_id_str not in current_user.companies: - raise HTTPException( - status_code=403, - detail=f"Nu aveți acces la firma {request.company_id}" - ) - - # TODO: Implementare export în funcție de report_type și format - # Deocamdată returnăm un placeholder - - return ExportReportResponse( - success=True, - file_url=f"/api/telegram/downloads/report_{request.report_type}_{request.company_id}.{request.format}", - file_name=f"raport_{request.report_type}_{datetime.now().strftime('%Y%m%d_%H%M%S')}.{request.format}", - file_size_bytes=0, - message=f"Raport {request.report_type} generat cu succes în format {request.format}" - ) - - except HTTPException: - raise - except Exception as e: - raise HTTPException( - status_code=500, - detail=f"Eroare la generarea raportului: {str(e)}" - ) - - -@router.get("/health") -async def telegram_health_check(): - """ - Health check pentru routerul Telegram - Verifică conectivitatea la Oracle și disponibilitatea serviciilor - """ - try: - async with oracle_pool.get_connection() as connection: - with connection.cursor() as cursor: - cursor.execute("SELECT 1 FROM DUAL") - - return { - "status": "healthy", - "service": "telegram-router", - "database": "connected", - "timestamp": datetime.utcnow().isoformat() - } - except Exception as e: - return { - "status": "degraded", - "service": "telegram-router", - "database": f"error: {str(e)}", - "timestamp": datetime.utcnow().isoformat() - } diff --git a/deploy-package-20260223-151231/backend/modules/telegram/routers/internal_api.py b/deploy-package-20260223-151231/backend/modules/telegram/routers/internal_api.py deleted file mode 100644 index 4c7c31e..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/routers/internal_api.py +++ /dev/null @@ -1,358 +0,0 @@ -""" -Internal API for Backend Communication - -This FastAPI application provides internal endpoints for the ROA2WEB backend -to communicate with the Telegram bot service. Main purpose is to save -authentication codes generated in the web frontend. - -This API runs alongside the Telegram bot and is accessible only internally -(not exposed to public internet). -""" - -import logging -import os -from datetime import datetime -from typing import Optional - -from fastapi import APIRouter, HTTPException, status -from fastapi.responses import JSONResponse -from pydantic import BaseModel, Field - -from backend.modules.telegram.db.operations import create_auth_code, get_auth_code -from backend.modules.telegram.db.database import get_database_stats - -logger = logging.getLogger(__name__) - -# Initialize APIRouter (converted from FastAPI app for unified backend) -internal_api = APIRouter() - - -# ============================================================================ -# REQUEST/RESPONSE MODELS -# ============================================================================ - -class SaveAuthCodeRequest(BaseModel): - """ - Request model for saving an authentication code. - """ - code: str = Field( - ..., - description="8-character authentication code", - min_length=8, - max_length=8 - ) - telegram_user_id: int = Field( - ..., - description="Telegram user ID (if known, otherwise 0)", - ge=0 - ) - oracle_username: str = Field( - ..., - description="Oracle username to link" - ) - expires_in_minutes: int = Field( - default=5, - description="Code expiration time in minutes", - ge=1, - le=60 - ) - server_id: Optional[str] = Field( - default=None, - description="Oracle server ID (for multi-server mode)" - ) - - -class SaveAuthCodeResponse(BaseModel): - """ - Response model for save auth code endpoint. - """ - success: bool = Field(..., description="Whether the operation succeeded") - code: str = Field(..., description="The saved authentication code") - expires_at: Optional[str] = Field(None, description="Expiration timestamp (ISO format)") - message: Optional[str] = Field(None, description="Additional message") - - -class VerifyAuthCodeRequest(BaseModel): - """ - Request model for verifying an authentication code. - """ - code: str = Field(..., description="Authentication code to verify") - - -class VerifyAuthCodeResponse(BaseModel): - """ - Response model for verify auth code endpoint. - """ - valid: bool = Field(..., description="Whether the code is valid") - oracle_username: Optional[str] = Field(None, description="Oracle username if valid") - telegram_user_id: Optional[int] = Field(None, description="Telegram user ID if set") - message: Optional[str] = Field(None, description="Additional message") - - -class HealthResponse(BaseModel): - """ - Response model for health check endpoint. - """ - status: str = Field(..., description="Service status") - timestamp: str = Field(..., description="Current timestamp") - database_stats: Optional[dict] = Field(None, description="Database statistics") - - -# ============================================================================ -# ENDPOINTS -# ============================================================================ - -@internal_api.post( - "/internal/save-code", - response_model=SaveAuthCodeResponse, - status_code=status.HTTP_201_CREATED, - summary="Save Authentication Code", - description="Save an authentication code for Telegram linking (called by backend)" -) -async def save_auth_code(request: SaveAuthCodeRequest): - """ - Save an authentication code to SQLite database. - - This endpoint is called by the FastAPI backend when a user generates - a linking code in the web frontend. - - **Flow:** - 1. User logs in to web frontend - 2. User clicks "Link Telegram Account" - 3. Backend generates 8-character code - 4. Backend calls this endpoint to save code - 5. Backend returns code to user for display - 6. User sends code to Telegram bot via /start command - - Args: - request: SaveAuthCodeRequest with code, oracle_username, etc. - - Returns: - SaveAuthCodeResponse with success status and code details - - Raises: - HTTPException 400: If code already exists or invalid data - HTTPException 500: If database operation fails - """ - try: - logger.info( - f"Saving auth code for Oracle user: {request.oracle_username}, " - f"code: {request.code}" - ) - - # Check if code already exists - existing_code = await get_auth_code(request.code) - - if existing_code: - logger.warning(f"Code {request.code} already exists") - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail=f"Code {request.code} already exists. Generate a new unique code." - ) - - # Create auth code in database - success = await create_auth_code( - code=request.code, - telegram_user_id=request.telegram_user_id, - oracle_username=request.oracle_username, - expires_in_minutes=request.expires_in_minutes, - server_id=request.server_id - ) - - if not success: - logger.error(f"Failed to save auth code {request.code}") - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail="Failed to save authentication code to database" - ) - - # Calculate expiration time - from datetime import timedelta - expires_at = (datetime.now() + timedelta(minutes=request.expires_in_minutes)).isoformat() - - logger.info(f"Auth code {request.code} saved successfully") - - return SaveAuthCodeResponse( - success=True, - code=request.code, - expires_at=expires_at, - message=f"Code saved successfully, expires in {request.expires_in_minutes} minutes" - ) - - except HTTPException: - raise - except Exception as e: - logger.error(f"Error saving auth code: {e}", exc_info=True) - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail=f"Internal server error: {str(e)}" - ) - - -@internal_api.post( - "/internal/verify-code", - response_model=VerifyAuthCodeResponse, - summary="Verify Authentication Code", - description="Verify if an authentication code is valid (without using it)" -) -async def verify_auth_code(request: VerifyAuthCodeRequest): - """ - Verify if an authentication code exists and is valid. - - This is a read-only check that does NOT mark the code as used. - Useful for backend to verify codes before user links Telegram account. - - Args: - request: VerifyAuthCodeRequest with code to verify - - Returns: - VerifyAuthCodeResponse with validation status - - Raises: - HTTPException 404: If code not found - """ - try: - logger.info(f"Verifying auth code: {request.code}") - - code_data = await get_auth_code(request.code) - - if not code_data: - return VerifyAuthCodeResponse( - valid=False, - message="Code not found" - ) - - # Check if code is expired - expires_at_str = code_data.get('expires_at') - expires_at = datetime.fromisoformat(expires_at_str) if expires_at_str else None - - is_expired = expires_at and datetime.now() >= expires_at - is_used = code_data.get('used', 0) == 1 - - if is_expired: - return VerifyAuthCodeResponse( - valid=False, - oracle_username=code_data.get('oracle_username'), - message="Code expired" - ) - - if is_used: - return VerifyAuthCodeResponse( - valid=False, - oracle_username=code_data.get('oracle_username'), - message="Code already used" - ) - - # Code is valid - return VerifyAuthCodeResponse( - valid=True, - oracle_username=code_data.get('oracle_username'), - telegram_user_id=code_data.get('telegram_user_id'), - message="Code is valid" - ) - - except Exception as e: - logger.error(f"Error verifying auth code: {e}", exc_info=True) - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail=f"Internal server error: {str(e)}" - ) - - -@internal_api.get( - "/internal/health", - response_model=HealthResponse, - summary="Health Check", - description="Check if the internal API and database are healthy" -) -async def health_check(): - """ - Health check endpoint. - - Returns service status and database statistics. - - Returns: - HealthResponse with status and stats - """ - try: - # Get database stats - stats = await get_database_stats() - - return HealthResponse( - status="healthy", - timestamp=datetime.now().isoformat(), - database_stats=stats - ) - - except Exception as e: - logger.error(f"Health check failed: {e}", exc_info=True) - return HealthResponse( - status="unhealthy", - timestamp=datetime.now().isoformat(), - database_stats={"error": str(e)} - ) - - -@internal_api.get( - "/internal/stats", - summary="Database Statistics", - description="Get detailed database statistics" -) -async def get_stats(): - """ - Get detailed database statistics. - - Returns: - JSON with database statistics - """ - try: - stats = await get_database_stats() - - return JSONResponse( - status_code=status.HTTP_200_OK, - content={ - "success": True, - "timestamp": datetime.now().isoformat(), - "stats": stats - } - ) - - except Exception as e: - logger.error(f"Error getting stats: {e}", exc_info=True) - return JSONResponse( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - content={ - "success": False, - "error": str(e) - } - ) - - -# ============================================================================ -# EXCEPTION HANDLERS -# ============================================================================ - -# ============================================================================ -# NOTE: Exception handlers and startup/shutdown events removed -# These are FastAPI-specific and don't work with APIRouter -# The unified backend (main.py) handles these at the app level -# ============================================================================ - -# @internal_api.exception_handler(Exception) - Not supported by APIRouter -# async def global_exception_handler(request, exc): -# """Global exception handler - moved to main.py""" -# pass - -# @internal_api.on_event("startup") - Not supported by APIRouter -# async def startup_event(): -# """Startup event - handled by main.py lifespan""" -# pass - -# @internal_api.on_event("shutdown") - Not supported by APIRouter -# async def shutdown_event(): -# """Shutdown event - handled by main.py lifespan""" -# pass - - -# Export the APIRouter -__all__ = ['internal_api'] diff --git a/deploy-package-20260223-151231/backend/modules/telegram/utils/__init__.py b/deploy-package-20260223-151231/backend/modules/telegram/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/backend/modules/telegram/utils/email_service.py b/deploy-package-20260223-151231/backend/modules/telegram/utils/email_service.py deleted file mode 100644 index 7d456f4..0000000 --- a/deploy-package-20260223-151231/backend/modules/telegram/utils/email_service.py +++ /dev/null @@ -1,141 +0,0 @@ -""" -Async SMTP Email Service with retry logic and proper error handling -""" -import aiosmtplib -from email.message import EmailMessage -import os -import logging -from typing import Optional -import asyncio - -logger = logging.getLogger(__name__) - - -class EmailService: - """Async SMTP client for sending authentication codes""" - - def __init__(self): - self.smtp_host = os.getenv("SMTP_HOST", "mail.romfast.ro") - self.smtp_port = int(os.getenv("SMTP_PORT", "587")) - self.smtp_user = os.getenv("SMTP_USER") - self.smtp_password = os.getenv("SMTP_PASSWORD") - self.from_email = os.getenv("SMTP_FROM_EMAIL") - self.from_name = os.getenv("SMTP_FROM_NAME", "ROA2WEB") - self.use_tls = os.getenv("SMTP_USE_TLS", "true").lower() == "true" - - # Retry configuration - self.max_retries = int(os.getenv("EMAIL_MAX_RETRIES", "3")) - self.retry_delay = float(os.getenv("EMAIL_RETRY_DELAY", "2.0")) # seconds - - # Validate required config - if not all([self.smtp_user, self.smtp_password, self.from_email]): - raise ValueError("SMTP configuration incomplete. Check .env file.") - - async def send_auth_code( - self, - to_email: str, - code: str, - username: str - ) -> bool: - """ - Send authentication code via email with retry logic - - Args: - to_email: Recipient email address - code: 6-digit authentication code - username: Oracle username for personalization - - Returns: - True if email sent successfully (after retries if needed) - - Raises: - No exceptions - returns False on all failures - """ - subject = "Autentificare ROA2WEB" - text_body = self._create_email_template(code, username) - - for attempt in range(1, self.max_retries + 1): - try: - await self._send_email(to_email, subject, text_body) - logger.info( - f"[EMAIL] ✅ Sent auth code to {to_email} " - f"(attempt {attempt}/{self.max_retries}) via {self.smtp_host}:{self.smtp_port}" - ) - return True - - except aiosmtplib.SMTPException as e: - logger.error( - f"[EMAIL] ❌ Attempt {attempt}/{self.max_retries} failed for {to_email}: " - f"{type(e).__name__}: {e}" - ) - if attempt < self.max_retries: - # Exponential backoff: 2s, 4s, 8s - delay = self.retry_delay * (2 ** (attempt - 1)) - logger.info(f"[EMAIL] Retrying in {delay}s...") - await asyncio.sleep(delay) - else: - logger.error(f"[EMAIL] ❌ All {self.max_retries} attempts failed for {to_email}") - - except Exception as e: - logger.error(f"[EMAIL] ❌ Unexpected error on attempt {attempt}/{self.max_retries} for {to_email}: {type(e).__name__}: {e}", exc_info=True) - return False - - return False - - async def _send_email( - self, - to_email: str, - subject: str, - text_body: str - ) -> None: - """ - Internal async SMTP sender (plain text to avoid spam filters) - - Raises: - aiosmtplib.SMTPException: On SMTP errors - """ - message = EmailMessage() - message["From"] = f"{self.from_name} <{self.from_email}>" - message["To"] = to_email - message["Subject"] = subject - message.set_content(text_body) - - smtp = aiosmtplib.SMTP( - hostname=self.smtp_host, - port=self.smtp_port, - start_tls=self.use_tls, - timeout=30 - ) - - try: - await smtp.connect() - await smtp.login(self.smtp_user, self.smtp_password) - await smtp.send_message(message) - finally: - try: - await smtp.quit() - except: - pass - - def _create_email_template(self, code: str, username: str) -> str: - """Generate plain text email body (HTML blocked by spam filters)""" - return ( - f"Codul tau de autentificare ROA2WEB:\n\n" - f" {code}\n\n" - f"Introdu acest cod in Telegram. Expira in 5 minute.\n\n" - f"---\n" - f"Solicitat pentru: {username}\n" - f"Daca nu ai initiat aceasta autentificare, ignora acest email." - ) - - -# Singleton instance -_email_service: Optional[EmailService] = None - - -def get_email_service() -> EmailService: - """Get or create singleton email service instance""" - global _email_service - if _email_service is None: - _email_service = EmailService() - return _email_service diff --git a/deploy-package-20260223-151231/backend/requirements.txt b/deploy-package-20260223-151231/backend/requirements.txt deleted file mode 100644 index d03c720..0000000 --- a/deploy-package-20260223-151231/backend/requirements.txt +++ /dev/null @@ -1,98 +0,0 @@ -# ============================================================================ -# ROA2WEB Unified Backend - Dependencies -# ============================================================================ -# Merged from reports-app, data-entry-app, and telegram-bot -# All three modules now run in a single backend process - -# ============================================================================ -# FASTAPI CORE (Common to all modules) -# ============================================================================ -fastapi>=0.109.0 -uvicorn[standard]>=0.27.0 -python-multipart>=0.0.6 -pydantic>=2.5.3 -pydantic-settings>=2.1.0 -email-validator>=2.1.0 - -# ============================================================================ -# AUTHENTICATION (Shared across all modules) -# ============================================================================ -PyJWT>=2.8.0 -python-jose[cryptography]>=3.3.0 - -# ============================================================================ -# DATABASE - ORACLE (Shared: Reports + Data Entry nomenclatures + Auth) -# ============================================================================ -oracledb>=2.0.1 - -# ============================================================================ -# DATABASE - SQLITE (Data Entry + Telegram + Reports Cache) -# ============================================================================ -aiosqlite>=0.19.0 - -# ============================================================================ -# DATABASE - SQLMODEL + ALEMBIC (Data Entry only) -# ============================================================================ -sqlmodel>=0.0.14 -sqlalchemy[asyncio]>=2.0.25 -alembic>=1.13.1 - -# ============================================================================ -# HTTP CLIENT (Shared) -# ============================================================================ -httpx>=0.27.0 - -# ============================================================================ -# UTILITIES (Shared) -# ============================================================================ -python-dotenv>=1.0.0 -python-dateutil>=2.8.2 - -# ============================================================================ -# FILE HANDLING (Data Entry) -# ============================================================================ -aiofiles>=23.2.1 -Pillow>=10.2.0 - -# ============================================================================ -# REPORTS MODULE - Exports (Excel, PDF) -# ============================================================================ -openpyxl>=3.1.0 -fpdf2>=2.7.0 - -# ============================================================================ -# DATA ENTRY MODULE - OCR Dependencies -# ============================================================================ -# docTR - fastest OCR engine with 90/100 accuracy (3.3x faster than PaddleOCR) -python-doctr[torch]>=0.8.0 - -# PaddleOCR for receipt text extraction (fallback) -paddleocr>=2.7.0 -paddlepaddle>=2.5.0 -opencv-python>=4.8.0 -pytesseract>=0.3.10 -pdf2image>=1.16.0 -numpy>=1.24.0 -# Process management for OCR worker pool (Windows orphan cleanup) -psutil>=5.9.0 - -# ============================================================================ -# TELEGRAM MODULE - Bot SDK -# ============================================================================ -python-telegram-bot>=20.7 - -# ============================================================================ -# TELEGRAM MODULE - Email (SMTP for 2FA) -# ============================================================================ -aiosmtplib>=3.0.0 - -# ============================================================================ -# MONITORING (Optional - Telegram module) -# ============================================================================ -# sentry-sdk>=1.40.0 # Uncomment if needed - -# ============================================================================ -# TESTING -# ============================================================================ -pytest>=8.0.0 -pytest-asyncio>=0.23.3 diff --git a/deploy-package-20260223-151231/backend/run-with-restart.sh b/deploy-package-20260223-151231/backend/run-with-restart.sh deleted file mode 100755 index ac7223f..0000000 --- a/deploy-package-20260223-151231/backend/run-with-restart.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/bash -# Wrapper script that auto-restarts uvicorn on crash -# Usage: ./run-with-restart.sh [port] [log_file] - -# Get script directory and activate venv -SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -source "$SCRIPT_DIR/venv/bin/activate" - -PORT=${1:-8000} -LOG_FILE=${2:-/tmp/unified_backend.log} -MAX_RESTARTS=10 -RESTART_COUNT=0 -RESTART_DELAY=3 -UVICORN_PID="" - -# On SIGTERM or SIGINT: kill uvicorn child and exit cleanly (no restart) -cleanup_and_exit() { - echo "[Backend Runner] Received termination signal, stopping..." | tee -a "$LOG_FILE" - if [ -n "$UVICORN_PID" ] && kill -0 "$UVICORN_PID" 2>/dev/null; then - kill "$UVICORN_PID" 2>/dev/null - wait "$UVICORN_PID" 2>/dev/null - fi - exit 0 -} -trap cleanup_and_exit SIGTERM SIGINT - -echo "[Backend Runner] Starting uvicorn with auto-restart (max $MAX_RESTARTS restarts)" | tee -a "$LOG_FILE" -echo "[Backend Runner] Port: $PORT, Log: $LOG_FILE" | tee -a "$LOG_FILE" - -while [ $RESTART_COUNT -lt $MAX_RESTARTS ]; do - START_TIME=$(date +%s) - echo "" | tee -a "$LOG_FILE" - echo "[Backend Runner] $(date '+%Y-%m-%d %H:%M:%S') - Starting uvicorn (attempt $((RESTART_COUNT + 1))/$MAX_RESTARTS)..." | tee -a "$LOG_FILE" - - # Run uvicorn in background so we can track its PID and trap signals properly - uvicorn main:app --host 0.0.0.0 --port "$PORT" >> "$LOG_FILE" 2>&1 & - UVICORN_PID=$! - - # Wait for uvicorn to exit - wait "$UVICORN_PID" - EXIT_CODE=$? - UVICORN_PID="" - - END_TIME=$(date +%s) - RUNTIME=$((END_TIME - START_TIME)) - - echo "[Backend Runner] $(date '+%Y-%m-%d %H:%M:%S') - uvicorn exited with code $EXIT_CODE after ${RUNTIME}s" | tee -a "$LOG_FILE" - - # Exit if trap already fired (cleanup_and_exit sets UVICORN_PID="") - # or if uvicorn exited due to a signal (130=SIGINT, 143=SIGTERM, 137=SIGKILL) - if [ $EXIT_CODE -eq 130 ] || [ $EXIT_CODE -eq 143 ] || [ $EXIT_CODE -eq 137 ]; then - echo "[Backend Runner] Received termination signal (code $EXIT_CODE), exiting..." | tee -a "$LOG_FILE" - exit 0 - fi - - # If it ran for more than 60 seconds, reset restart counter (was stable) - if [ $RUNTIME -gt 60 ]; then - RESTART_COUNT=0 - echo "[Backend Runner] Process was stable (>${RUNTIME}s), resetting restart counter" | tee -a "$LOG_FILE" - else - RESTART_COUNT=$((RESTART_COUNT + 1)) - echo "[Backend Runner] Quick crash detected, restart count: $RESTART_COUNT/$MAX_RESTARTS" | tee -a "$LOG_FILE" - fi - - # Wait before restart - if [ $RESTART_COUNT -lt $MAX_RESTARTS ]; then - echo "[Backend Runner] Restarting in ${RESTART_DELAY}s..." | tee -a "$LOG_FILE" - sleep $RESTART_DELAY - fi -done - -echo "[Backend Runner] Max restarts ($MAX_RESTARTS) reached. Giving up." | tee -a "$LOG_FILE" -exit 1 diff --git a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/README.md b/deploy-package-20260223-151231/backend/scripts/whatsapp_import/README.md deleted file mode 100644 index 42ee09f..0000000 --- a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/README.md +++ /dev/null @@ -1,92 +0,0 @@ -# WhatsApp Import - Flux Bonuri Fiscale - -## Descriere -Scripturi pentru importul automat al bonurilor fiscale primite pe WhatsApp. - -## Flux Complet - -``` -PDF (WhatsApp) --> OCR API (doctr+, ~4sec) --> SQLite (receipts) --> Oracle (ACT) -``` - -## Pași - -### 1. Recepție PDF (Clawdbot pe moltbot) -- PDF primit pe WhatsApp ajunge în `~/.clawdbot/media/inbound/` -- Clawdbot detectează fișierul și pornește procesarea - -### 2. OCR prin API (claude-agent:8000) -```bash -# Login -TOKEN=$(curl -s -X POST "http://localhost:8000/api/auth/login" \ - -H "Content-Type: application/json" \ - -d '{"username":"USER","password":"PASS","server_id":"central"}' \ - | jq -r .access_token) - -# Submit OCR job -JOB=$(curl -s -X POST "http://localhost:8000/api/data-entry/ocr/extract" \ - -H "Authorization: Bearer $TOKEN" \ - -F "file=@bon.pdf" | jq -r .job_id) - -# Wait for result (~4 sec) -sleep 5 -curl -s "http://localhost:8000/api/data-entry/ocr/jobs/$JOB" \ - -H "Authorization: Bearer $TOKEN" -``` - -### 3. Creare Receipt în SQLite -```bash -curl -s -X POST "http://localhost:8000/api/data-entry/receipts/" \ - -H "Authorization: Bearer $TOKEN" \ - -H "Content-Type: application/json" \ - -d '{ - "receipt_type": "bon_fiscal", - "receipt_number": "NR_BON", - "receipt_date": "YYYY-MM-DD", - "amount": 123.45, - "partner_name": "FURNIZOR", - "cui": "RO12345678", - "tva_total": 23.45, - "payment_mode": "banca", - "company_id": 110 - }' -``` - -### 4. Aprobare în Frontend -- User verifică în http://claude-agent:3000/data-entry -- Editează dacă e necesar -- Aprobă bonul - -### 5. Salvare Oracle (după aprobare) -- API-ul face automat salvarea în Oracle via PACK_CONTAFIN -- Sau manual cu `save_to_oracle.py` - -## Scripturi - -| Script | Descriere | -|--------|-----------| -| `ocr_client.py` | Client OCR - submit job în SQLite queue | -| `whatsapp_flow.py` | Flux complet: OCR + SQLite + Oracle | -| `process_v2.py` | OCR + PACK_CONTAFIN (direct, fără API) | -| `save_to_oracle.py` | Doar salvare Oracle cu PACK_CONTAFIN | - -## Configurare - -### Server OCR (claude-agent) -- Backend: http://localhost:8000 -- Frontend: http://localhost:3000 -- Start: `./start.sh test` sau `./start.sh central` - -### Credențiale -- User: din CONTAFIN_ORACLE.NOM_UTILIZATORI -- Server: `central` (sau ce e configurat în .env) -- Company ID: din token după login - -## Note -- OCR folosește doctr-plus (~4 sec per bon) -- Bonurile apar în frontend cu status "draft" -- Salvarea Oracle se face după aprobare -- Fluxul e asincron - OCR rulează în background - ---- -*Creat: 2026-02-03 de Echo* diff --git a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/conftest.py b/deploy-package-20260223-151231/backend/scripts/whatsapp_import/conftest.py deleted file mode 100644 index 7e1d34a..0000000 --- a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/conftest.py +++ /dev/null @@ -1,13 +0,0 @@ -""" -Root pytest configuration for ROA2WEB. - -Ensures proper Python path setup for all test imports. -""" - -import sys -from pathlib import Path - -# Add project root to Python path at import time -project_root = Path(__file__).parent -if str(project_root) not in sys.path: - sys.path.insert(0, str(project_root)) diff --git a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/ocr_client.py b/deploy-package-20260223-151231/backend/scripts/whatsapp_import/ocr_client.py deleted file mode 100644 index 9c88c35..0000000 --- a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/ocr_client.py +++ /dev/null @@ -1,108 +0,0 @@ -#!/usr/bin/env python3 -""" -Client pentru OCR API roa2web - adaugă job direct în SQLite queue. -Folosește aceeași coadă ca backend-ul, fără HTTP auth. -""" -import asyncio -import json -import shutil -import sys -import uuid -from datetime import datetime, timedelta -from pathlib import Path - -# Paths -QUEUE_DIR = Path("/workspace/roa2web/backend/data/ocr_queue") -DB_PATH = QUEUE_DIR / "ocr_jobs.db" -FILES_DIR = QUEUE_DIR / "files" - -async def submit_ocr_job(file_path: Path, engine: str = "doctr_plus") -> str: - """Submit OCR job to queue, return job_id.""" - import aiosqlite - - job_id = str(uuid.uuid4()) - - # Copy file to queue - FILES_DIR.mkdir(parents=True, exist_ok=True) - dest_path = FILES_DIR / f"{job_id}_{file_path.name}" - shutil.copy(file_path, dest_path) - - # Determine mime type - mime_type = "application/pdf" if file_path.suffix.lower() == ".pdf" else "image/jpeg" - - async with aiosqlite.connect(str(DB_PATH), timeout=5.0) as db: - await db.execute(""" - INSERT INTO ocr_jobs ( - id, status, file_path, mime_type, engine, - created_at, original_filename, expires_at - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?) - """, ( - job_id, "pending", str(dest_path), mime_type, engine, - datetime.now().isoformat(), file_path.name, - (datetime.now() + timedelta(hours=24)).isoformat() - )) - await db.commit() - - return job_id - -async def wait_for_result(job_id: str, timeout: int = 120) -> dict: - """Wait for job completion and return result.""" - import aiosqlite - - start = datetime.now() - while (datetime.now() - start).seconds < timeout: - async with aiosqlite.connect(str(DB_PATH), timeout=5.0) as db: - db.row_factory = aiosqlite.Row - async with db.execute( - "SELECT status, result_json, error_message, processing_time_ms FROM ocr_jobs WHERE id = ?", - (job_id,) - ) as cursor: - row = await cursor.fetchone() - if row: - if row["status"] == "completed": - return { - "success": True, - "result": json.loads(row["result_json"]) if row["result_json"] else None, - "time_ms": row["processing_time_ms"] - } - elif row["status"] == "failed": - return { - "success": False, - "error": row["error_message"] - } - await asyncio.sleep(0.5) - - return {"success": False, "error": "Timeout"} - -async def process_file(file_path: Path): - """Process file through OCR queue.""" - print(f"[OCR Queue] Submitting: {file_path.name}") - job_id = await submit_ocr_job(file_path) - print(f"[OCR Queue] Job ID: {job_id}") - print(f"[OCR Queue] Waiting for result...") - - result = await wait_for_result(job_id) - - if result["success"]: - r = result["result"] - print(f"\n✅ OCR Complete ({result['time_ms']}ms)") - print(f" CUI: {r.get('cui')}") - print(f" Data: {r.get('receipt_date')}") - print(f" Total: {r.get('amount')}") - print(f" TVA: {r.get('tva_total')}") - return r - else: - print(f"\n❌ Error: {result['error']}") - return None - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Usage: python roa2web_api_client.py ") - sys.exit(1) - - file_path = Path(sys.argv[1]) - if not file_path.exists(): - print(f"File not found: {file_path}") - sys.exit(1) - - asyncio.run(process_file(file_path)) diff --git a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/process_and_save.py b/deploy-package-20260223-151231/backend/scripts/whatsapp_import/process_and_save.py deleted file mode 100644 index ccd4d4b..0000000 --- a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/process_and_save.py +++ /dev/null @@ -1,154 +0,0 @@ -#!/usr/bin/env python3 -""" -Script complet: PDF → OCR → Oracle -Usage: python process_and_save.py [--save] - -Fără --save: doar arată ce ar salva (dry run) -Cu --save: salvează efectiv în Oracle -""" -import sys -sys.path.insert(0, "/workspace/roa2web") - -import asyncio -import oracledb -from datetime import datetime -from decimal import Decimal -from pathlib import Path - -ORACLE_CONFIG = { - "user": "CONTAFIN_ORACLE", - "password": "ROMFASTSOFT", - "dsn": "10.0.20.121:1521/ROA" -} - -CUI_TO_CONT = { - "11201891": "6022", # MOL - "1590082": "6022", # OMV Petrom - "10562600": "6021", # Dedeman -} - -def get_cont_cheltuiala(cui: str) -> str: - cui_clean = cui.upper().replace("RO", "").strip() - return CUI_TO_CONT.get(cui_clean, "6028") - -async def process_pdf(pdf_path: Path): - from backend.modules.data_entry.services.ocr_service import ocr_service - - mime_type = "application/pdf" if pdf_path.suffix.lower() == ".pdf" else "image/jpeg" - - print(f"\n[OCR] Processing: {pdf_path.name}") - print("-" * 50) - - success, message, result = await ocr_service.process_image(pdf_path, mime_type) - - if not success: - print(f"ERROR: {message}") - return None - - print(f"Partner: {result.partner_name}") - print(f"CUI: {result.cui}") - print(f"Data: {result.receipt_date}") - print(f"Numar: {result.receipt_number}") - print(f"Total: {result.amount}") - print(f"TVA: {result.tva_total}") - print(f"Confidence: {result.overall_confidence:.0%}") - - return result - -def save_to_oracle(result, do_commit: bool = False): - mode = "SAVE" if do_commit else "DRY RUN" - print(f"\n[Oracle] {mode}") - print("-" * 50) - - conn = oracledb.connect(**ORACLE_CONFIG) - cursor = conn.cursor() - - try: - an = result.receipt_date.year if result.receipt_date else datetime.now().year - luna = result.receipt_date.month if result.receipt_date else datetime.now().month - receipt_date = result.receipt_date or datetime.now().date() - - cursor.execute("SELECT NVL(MAX(COD), 0) + 1 FROM MARIUSM_AUTO.ACT WHERE AN = :an AND LUNA = :luna", an=an, luna=luna) - cod = cursor.fetchone()[0] - - cui_clean = (result.cui or "").upper().replace("RO", "").strip() - cursor.execute("SELECT ID_PART FROM MARIUSM_AUTO.NOM_PARTENERI WHERE COD_FISCAL = :cui OR COD_FISCAL = :cui2", - cui=cui_clean, cui2="RO"+cui_clean) - row = cursor.fetchone() - id_part = row[0] if row else 0 - - total = float(result.amount or 0) - tva = float(result.tva_total or 0) - fara_tva = total - tva - nract = int(result.receipt_number) if result.receipt_number and result.receipt_number.isdigit() else 0 - cont = get_cont_cheltuiala(result.cui or "") - expl = f"OCR: {result.partner_name or 'N/A'}" - - print(f"COD: {cod}") - print(f"Partner ID: {id_part} (CUI: {cui_clean})") - print(f"Cont: {cont}") - - lines = [ - (cont, "401", fara_tva, expl), - ("401", "5311", total, f"Plata {expl}"), - ] - if tva > 0: - lines.insert(1, ("4426", "401", tva, f"TVA {expl}")) - - for scd, scc, suma, e in lines: - cursor.execute(""" - INSERT INTO MARIUSM_AUTO.ACT_TEMP ( - LUNA, AN, COD, DATAIREG, DATAACT, NRACT, - EXPLICATIA, SCD, SCC, SUMA, ID_PARTC, ID_UTIL, DATAORA - ) VALUES ( - :luna, :an, :cod, TRUNC(SYSDATE), :dataact, :nract, - :expl, :scd, :scc, :suma, :id_part, 0, SYSDATE - ) - """, luna=luna, an=an, cod=cod, dataact=receipt_date, nract=nract, - expl=e, scd=scd, scc=scc, suma=suma, id_part=id_part) - print(f" {scd} = {scc}: {suma:.2f}") - - if do_commit: - conn.commit() - print(f"\nSAVED to Oracle (COD={cod})") - else: - conn.rollback() - print(f"\nDRY RUN - not saved (would be COD={cod})") - - return cod - - except Exception as e: - print(f"ERROR: {e}") - conn.rollback() - raise - finally: - cursor.close() - conn.close() - -async def main(): - if len(sys.argv) < 2: - print("Usage: python process_and_save.py [--save]") - return - - pdf_path = Path(sys.argv[1]) - if not pdf_path.exists(): - pdf_path = Path(f"/workspace/roa2web/tests/fixtures/ocr-samples/{sys.argv[1]}") - - if not pdf_path.exists(): - print(f"File not found: {sys.argv[1]}") - return - - do_save = "--save" in sys.argv - - print("=" * 50) - print("PDF -> OCR -> Oracle") - print("=" * 50) - - result = await process_pdf(pdf_path) - if result: - save_to_oracle(result, do_commit=do_save) - - print("\n" + "=" * 50) - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/process_v2.py b/deploy-package-20260223-151231/backend/scripts/whatsapp_import/process_v2.py deleted file mode 100644 index 6d416df..0000000 --- a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/process_v2.py +++ /dev/null @@ -1,190 +0,0 @@ -#!/usr/bin/env python3 -""" -Script complet: PDF → OCR → Oracle (cu PACK_CONTAFIN) -Usage: python process_and_save.py [--save] -""" -import sys -sys.path.insert(0, "/workspace/roa2web") - -import asyncio -import oracledb -from datetime import datetime -from decimal import Decimal -from pathlib import Path - -ORACLE_CONFIG = { - "user": "MARIUSM_AUTO", - "password": "ROMFASTSOFT", - "dsn": "10.0.20.121:1521/ROA" -} - -CUI_TO_CONT = { - "11201891": "6022", # MOL - "1590082": "6022", # OMV Petrom - "14991381": "6022", # MOL Romania - "10562600": "6021", # Dedeman -} - -def get_cont_cheltuiala(cui: str) -> str: - cui_clean = cui.upper().replace("RO", "").strip() - return CUI_TO_CONT.get(cui_clean, "6028") - -async def process_pdf(pdf_path: Path): - from backend.modules.data_entry.services.ocr_service import ocr_service - - mime_type = "application/pdf" if pdf_path.suffix.lower() == ".pdf" else "image/jpeg" - - print(f"\n[OCR] Processing: {pdf_path.name}") - print("-" * 50) - - success, message, result = await ocr_service.process_image(pdf_path, mime_type) - - if not success: - print(f"ERROR: {message}") - return None - - print(f"Partner: {result.partner_name}") - print(f"CUI: {result.cui}") - print(f"Data: {result.receipt_date}") - print(f"Numar: {result.receipt_number}") - print(f"Total: {result.amount}") - print(f"TVA: {result.tva_total}") - print(f"Confidence: {result.overall_confidence:.0%}") - - return result - -def save_to_oracle_with_pack(result, do_commit: bool = False): - mode = "SAVE" if do_commit else "DRY RUN" - print(f"\n[Oracle + PACK_CONTAFIN] {mode}") - print("-" * 50) - - conn = oracledb.connect(**ORACLE_CONFIG) - cursor = conn.cursor() - - try: - an = result.receipt_date.year if result.receipt_date else datetime.now().year - luna = result.receipt_date.month if result.receipt_date else datetime.now().month - receipt_date = result.receipt_date or datetime.now().date() - - # Parametri - id_util = 0 # ID utilizator implicit - id_sucursala = 0 - - # 1. INITIALIZEAZA - print("[1] INITIALIZEAZA_SCRIERE_ACT_RUL...") - cursor.callproc('PACK_CONTAFIN.INITIALIZEAZA_SCRIERE_ACT_RUL', [ - id_util, - datetime.now(), - an, - luna, - 0, # suprascriere_cod - 0, # suprascriere_anluna - 0, # scrie_sterge (0=scrie) - id_sucursala - ]) - print(" OK") - - # Obține COD din secvență sau calculează - cursor.execute("SELECT NVL(MAX(COD), 0) + 1 FROM ACT WHERE AN = :an AND LUNA = :luna", an=an, luna=luna) - cod = cursor.fetchone()[0] - - # Partner - cui_clean = (result.cui or "").upper().replace("RO", "").strip() - cursor.execute("SELECT ID_PART FROM NOM_PARTENERI WHERE COD_FISCAL = :cui OR COD_FISCAL = :cui2", - cui=cui_clean, cui2="RO"+cui_clean) - row = cursor.fetchone() - id_part = row[0] if row else 0 - - total = float(result.amount or 0) - tva = float(result.tva_total or 0) - fara_tva = total - tva - nract = int(result.receipt_number) if result.receipt_number and result.receipt_number.isdigit() else 0 - cont = get_cont_cheltuiala(result.cui or "") - expl = f"OCR: {result.partner_name or 'N/A'}" - - print(f" COD: {cod}, Partner ID: {id_part}, Cont: {cont}") - - # 2. INSERT în ACT_TEMP - print("[2] INSERT ACT_TEMP...") - - lines = [ - (cont, "401", fara_tva, expl, id_part, 0), # cheltuială - partener pe credit - ("401", "5311", total, f"Plata {expl}", 0, id_part), # plată - partener pe debit - ] - if tva > 0: - lines.insert(1, ("4426", "401", tva, f"TVA {expl}", id_part, 0)) # TVA - partener pe credit - - for scd, scc, suma, e, id_partc, id_partd in lines: - cursor.execute(""" - INSERT INTO ACT_TEMP ( - LUNA, AN, COD, DATAIREG, DATAACT, NRACT, - EXPLICATIA, SCD, SCC, SUMA, - ID_PARTC, ID_PARTD, ID_UTIL, DATAORA - ) VALUES ( - :luna, :an, :cod, TRUNC(SYSDATE), :dataact, :nract, - :expl, :scd, :scc, :suma, - :id_partc, :id_partd, :id_util, SYSDATE - ) - """, luna=luna, an=an, cod=cod, dataact=receipt_date, nract=nract, - expl=e, scd=scd, scc=scc, suma=suma, - id_partc=id_partc, id_partd=id_partd, id_util=id_util) - print(f" {scd} = {scc}: {suma:.2f}") - - # 3. FINALIZEAZA - print("[3] FINALIZEAZA_SCRIERE_ACT_RUL...") - mesaj = cursor.var(oracledb.STRING, 4000) - cursor.callproc('PACK_CONTAFIN.FINALIZEAZA_SCRIERE_ACT_RUL', [ - id_util, - cod, - 0, # scrie_sterge - 0, # modificare_nota - 0, # scrie_cump_vanz - mesaj - ]) - result_msg = mesaj.getvalue() - print(f" Mesaj: {result_msg}") - - if do_commit: - conn.commit() - print(f"\n✅ SALVAT în Oracle (COD={cod})") - else: - conn.rollback() - print(f"\n⚠️ DRY RUN - rollback (COD ar fi fost {cod})") - - return cod, result_msg - - except Exception as e: - print(f"❌ Eroare: {e}") - conn.rollback() - raise - finally: - cursor.close() - conn.close() - -async def main(): - if len(sys.argv) < 2: - print("Usage: python process_and_save.py [--save]") - return - - pdf_path = Path(sys.argv[1]) - if not pdf_path.exists(): - pdf_path = Path(f"/workspace/roa2web/tests/fixtures/ocr-samples/{sys.argv[1]}") - - if not pdf_path.exists(): - print(f"File not found: {sys.argv[1]}") - return - - do_save = "--save" in sys.argv - - print("=" * 50) - print("PDF -> OCR -> Oracle (PACK_CONTAFIN)") - print("=" * 50) - - result = await process_pdf(pdf_path) - if result: - save_to_oracle_with_pack(result, do_commit=do_save) - - print("\n" + "=" * 50) - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/save_to_oracle.py b/deploy-package-20260223-151231/backend/scripts/whatsapp_import/save_to_oracle.py deleted file mode 100644 index ae4fd39..0000000 --- a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/save_to_oracle.py +++ /dev/null @@ -1,186 +0,0 @@ -#!/usr/bin/env python3 -""" -Script pentru salvare note contabile în Oracle din date OCR. -""" -import sys -sys.path.insert(0, "/workspace/roa2web") - -import oracledb -from datetime import datetime -from decimal import Decimal - -ORACLE_CONFIG = { - "user": "CONTAFIN_ORACLE", - "password": "ROMFASTSOFT", - "dsn": "10.0.20.121:1521/ROA" -} - -def get_partner_id(cursor, cui: str) -> int: - """Găsește partener după CUI.""" - cui_clean = cui.upper().replace("RO", "").strip() - - cursor.execute( - "SELECT ID_PART FROM MARIUSM_AUTO.NOM_PARTENERI WHERE COD_FISCAL = :cui", - cui=cui_clean - ) - row = cursor.fetchone() - if row: - print(f" Partner găsit: ID={row[0]} pentru CUI={cui_clean}") - return row[0] - - # Încearcă și cu RO prefix - cursor.execute( - "SELECT ID_PART FROM MARIUSM_AUTO.NOM_PARTENERI WHERE COD_FISCAL = :cui", - cui="RO" + cui_clean - ) - row = cursor.fetchone() - if row: - print(f" Partner găsit: ID={row[0]} pentru CUI=RO{cui_clean}") - return row[0] - - print(f" ⚠️ Partner NU găsit pentru CUI {cui_clean}, folosim ID=0") - return 0 - -def save_bon_achizitie( - cursor, - receipt_date: datetime, - receipt_number: str, - amount: Decimal, - tva_amount: Decimal, - partner_cui: str, - partner_name: str, - cont_cheltuiala: str = "6028", - explicatie: str = "Import OCR" -): - """ - Salvează bon fiscal în ACT_TEMP. - Notă: NU apelează PACK_CONTAFIN - doar inserează în staging. - """ - an = receipt_date.year - luna = receipt_date.month - - # Generează cod unic - cursor.execute("SELECT NVL(MAX(COD), 0) + 1 FROM MARIUSM_AUTO.ACT WHERE AN = :an AND LUNA = :luna", an=an, luna=luna) - cod = cursor.fetchone()[0] - - id_part = get_partner_id(cursor, partner_cui) - - total_cu_tva = float(amount) - total_fara_tva = float(amount - tva_amount) - tva = float(tva_amount) - nract = int(receipt_number) if receipt_number and receipt_number.isdigit() else 0 - - print(f"\nNote contabile (COD={cod}):") - print(f" Data: {receipt_date.date()}, Nr: {nract}") - print(f" Fără TVA: {total_fara_tva:.2f}, TVA: {tva:.2f}, Total: {total_cu_tva:.2f}") - - # LINIA 1: Cheltuială = Furnizor - cursor.execute(""" - INSERT INTO MARIUSM_AUTO.ACT_TEMP ( - LUNA, AN, COD, DATAIREG, DATAACT, NRACT, - EXPLICATIA, SCD, SCC, SUMA, ID_PARTC, ID_UTIL, DATAORA - ) VALUES ( - :luna, :an, :cod, TRUNC(SYSDATE), :dataact, :nract, - :expl, :scd, :scc, :suma, :id_part, 0, SYSDATE - ) - """, - luna=luna, an=an, cod=cod, - dataact=receipt_date.date(), nract=nract, - expl=f"{explicatie} - {partner_name}", - scd=cont_cheltuiala, scc="401", suma=total_fara_tva, id_part=id_part - ) - print(f" ✓ {cont_cheltuiala} = 401: {total_fara_tva:.2f}") - - # LINIA 2: TVA = Furnizor - if tva > 0: - cursor.execute(""" - INSERT INTO MARIUSM_AUTO.ACT_TEMP ( - LUNA, AN, COD, DATAIREG, DATAACT, NRACT, - EXPLICATIA, SCD, SCC, SUMA, PROC_TVA, ID_PARTC, ID_UTIL, DATAORA - ) VALUES ( - :luna, :an, :cod, TRUNC(SYSDATE), :dataact, :nract, - :expl, :scd, :scc, :suma, :proc_tva, :id_part, 0, SYSDATE - ) - """, - luna=luna, an=an, cod=cod, - dataact=receipt_date.date(), nract=nract, - expl=f"TVA {explicatie}", - scd="4426", scc="401", suma=tva, proc_tva=1.19, id_part=id_part - ) - print(f" ✓ 4426 = 401: {tva:.2f}") - - # LINIA 3: Furnizor = Casă - cursor.execute(""" - INSERT INTO MARIUSM_AUTO.ACT_TEMP ( - LUNA, AN, COD, DATAIREG, DATAACT, NRACT, - EXPLICATIA, SCD, SCC, SUMA, ID_PARTD, ID_UTIL, DATAORA - ) VALUES ( - :luna, :an, :cod, TRUNC(SYSDATE), :dataact, :nract, - :expl, :scd, :scc, :suma, :id_part, 0, SYSDATE - ) - """, - luna=luna, an=an, cod=cod, - dataact=receipt_date.date(), nract=nract, - expl=f"Plata {explicatie}", - scd="401", scc="5311", suma=total_cu_tva, id_part=id_part - ) - print(f" ✓ 401 = 5311: {total_cu_tva:.2f}") - - return cod - -def test_insert(): - """Test inserare în ACT_TEMP.""" - print("="*50) - print("TEST: Salvare note contabile în Oracle") - print("="*50) - print("\nConectare la Oracle TEST...") - - conn = oracledb.connect(**ORACLE_CONFIG) - cursor = conn.cursor() - print("Conexiune OK!") - - # Date de test din OCR - receipt_date = datetime(2024, 8, 1) - receipt_number = "1200302" - amount = Decimal("263.28") - tva_amount = Decimal("42.04") - partner_cui = "RO11201891" - partner_name = "Benzinărie Test" - - try: - cod = save_bon_achizitie( - cursor, - receipt_date=receipt_date, - receipt_number=receipt_number, - amount=amount, - tva_amount=tva_amount, - partner_cui=partner_cui, - partner_name=partner_name, - cont_cheltuiala="6022", - explicatie=f"Bon benzină {receipt_number}" - ) - - # Verificare - cursor.execute("SELECT SCD, SCC, SUMA FROM MARIUSM_AUTO.ACT_TEMP WHERE COD = :cod ORDER BY ROWID", cod=cod) - print(f"\nVerificare ACT_TEMP (COD={cod}):") - for row in cursor: - print(f" {row[0]} = {row[1]}: {row[2]:.2f}") - - # ROLLBACK - doar test - print("\n⚠️ ROLLBACK (test only)") - conn.rollback() - - print("\n" + "="*50) - print("✅ TEST REUȘIT!") - print("="*50) - - except Exception as e: - print(f"\n❌ EROARE: {e}") - conn.rollback() - raise - finally: - cursor.close() - conn.close() - -if __name__ == "__main__": - test_insert() diff --git a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/test_ocr_simple.py b/deploy-package-20260223-151231/backend/scripts/whatsapp_import/test_ocr_simple.py deleted file mode 100644 index bd13e98..0000000 --- a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/test_ocr_simple.py +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env python3 -import sys -import asyncio -from pathlib import Path - -sys.path.insert(0, "/workspace/roa2web/backend") - -async def main(): - if len(sys.argv) < 2: - print("Usage: python test_ocr_simple.py ") - return - - pdf_path = Path(sys.argv[1]) - if not pdf_path.exists(): - pdf_path = Path(f"/workspace/roa2web/tests/fixtures/ocr-samples/{sys.argv[1]}") - - if not pdf_path.exists(): - print(f"Error: File not found: {sys.argv[1]}") - return - - print(f"Processing: {pdf_path}") - - from backend.modules.data_entry.services.ocr_service import ocr_service - - mime_type = "application/pdf" if pdf_path.suffix.lower() == ".pdf" else "image/jpeg" - - print("Running OCR...") - success, message, result = await ocr_service.process_image(pdf_path, mime_type) - - if not success: - print(f"Error: {message}") - return - - print(f"Partner: {result.partner_name}") - print(f"CUI: {result.cui}") - print(f"Date: {result.receipt_date}") - print(f"Amount: {result.amount}") - print(f"TVA: {result.tva_total}") - print(f"Confidence: {result.overall_confidence:.2%}") - print("SUCCESS!") - -if __name__ == "__main__": - asyncio.run(main()) diff --git a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/whatsapp_flow.py b/deploy-package-20260223-151231/backend/scripts/whatsapp_import/whatsapp_flow.py deleted file mode 100644 index 0ad206d..0000000 --- a/deploy-package-20260223-151231/backend/scripts/whatsapp_import/whatsapp_flow.py +++ /dev/null @@ -1,189 +0,0 @@ -#!/usr/bin/env python3 -""" -Flux complet WhatsApp: PDF → OCR (via queue) → Oracle -Usage: python roa2web_whatsapp.py [--save] -""" -import asyncio -import json -import shutil -import sys -import uuid -import oracledb -from datetime import datetime, timedelta -from pathlib import Path -from decimal import Decimal - -# OCR Queue paths -QUEUE_DIR = Path("/workspace/roa2web/backend/data/ocr_queue") -DB_PATH = QUEUE_DIR / "ocr_jobs.db" -FILES_DIR = QUEUE_DIR / "files" - -# Oracle config -ORACLE_CONFIG = { - "user": "MARIUSM_AUTO", - "password": "ROMFASTSOFT", - "dsn": "10.0.20.121:1521/ROA" -} - -CUI_TO_CONT = { - "11201891": "6022", - "1590082": "6022", - "14991381": "6022", - "10562600": "6021", -} - -def get_cont(cui: str) -> str: - return CUI_TO_CONT.get(cui.upper().replace("RO", "").strip(), "6028") - -async def submit_ocr_job(file_path: Path) -> str: - import aiosqlite - job_id = str(uuid.uuid4()) - FILES_DIR.mkdir(parents=True, exist_ok=True) - dest_path = FILES_DIR / f"{job_id}_{file_path.name}" - shutil.copy(file_path, dest_path) - mime_type = "application/pdf" if file_path.suffix.lower() == ".pdf" else "image/jpeg" - - async with aiosqlite.connect(str(DB_PATH), timeout=5.0) as db: - await db.execute(""" - INSERT INTO ocr_jobs (id, status, file_path, mime_type, engine, created_at, original_filename, expires_at) - VALUES (?, ?, ?, ?, ?, ?, ?, ?) - """, (job_id, "pending", str(dest_path), mime_type, "doctr_plus", - datetime.now().isoformat(), file_path.name, - (datetime.now() + timedelta(hours=24)).isoformat())) - await db.commit() - return job_id - -async def wait_for_result(job_id: str, timeout: int = 120) -> dict: - import aiosqlite - start = datetime.now() - while (datetime.now() - start).seconds < timeout: - async with aiosqlite.connect(str(DB_PATH), timeout=5.0) as db: - db.row_factory = aiosqlite.Row - async with db.execute( - "SELECT status, result_json, error_message, processing_time_ms FROM ocr_jobs WHERE id = ?", - (job_id,) - ) as cursor: - row = await cursor.fetchone() - if row and row["status"] == "completed": - return {"success": True, "result": json.loads(row["result_json"]), "time_ms": row["processing_time_ms"]} - elif row and row["status"] == "failed": - return {"success": False, "error": row["error_message"]} - await asyncio.sleep(0.3) - return {"success": False, "error": "Timeout"} - -def save_to_oracle(ocr_result: dict, do_commit: bool = False) -> dict: - conn = oracledb.connect(**ORACLE_CONFIG) - cursor = conn.cursor() - - try: - # Parse date - date_str = ocr_result.get("receipt_date") - if date_str: - receipt_date = datetime.strptime(date_str[:10], "%Y-%m-%d").date() - else: - receipt_date = datetime.now().date() - - an, luna = receipt_date.year, receipt_date.month - - # Init - cursor.callproc('PACK_CONTAFIN.INITIALIZEAZA_SCRIERE_ACT_RUL', [0, datetime.now(), an, luna, 0, 0, 0, 0]) - - # Get COD - cursor.execute("SELECT NVL(MAX(COD), 0) + 1 FROM ACT WHERE AN = :an AND LUNA = :luna", an=an, luna=luna) - cod = cursor.fetchone()[0] - - # Partner - cui_clean = (ocr_result.get("cui") or "").upper().replace("RO", "").strip() - cursor.execute("SELECT ID_PART FROM NOM_PARTENERI WHERE COD_FISCAL = :cui OR COD_FISCAL = :cui2", - cui=cui_clean, cui2="RO"+cui_clean) - row = cursor.fetchone() - id_part = row[0] if row else 0 - - # Amounts - total = float(ocr_result.get("amount") or 0) - tva = float(ocr_result.get("tva_total") or 0) - fara_tva = total - tva - nract = int(ocr_result.get("receipt_number") or 0) if str(ocr_result.get("receipt_number", "")).isdigit() else 0 - cont = get_cont(ocr_result.get("cui") or "") - expl = f"OCR: {ocr_result.get('partner_name') or 'N/A'}" - - # Insert lines - lines = [ - (cont, "401", fara_tva, expl, id_part, 0), - ("401", "5311", total, f"Plata {expl}", 0, id_part), - ] - if tva > 0: - lines.insert(1, ("4426", "401", tva, f"TVA {expl}", id_part, 0)) - - for scd, scc, suma, e, id_partc, id_partd in lines: - cursor.execute(""" - INSERT INTO ACT_TEMP (LUNA, AN, COD, DATAIREG, DATAACT, NRACT, EXPLICATIA, SCD, SCC, SUMA, ID_PARTC, ID_PARTD, ID_UTIL, DATAORA) - VALUES (:luna, :an, :cod, TRUNC(SYSDATE), :dataact, :nract, :expl, :scd, :scc, :suma, :id_partc, :id_partd, 0, SYSDATE) - """, luna=luna, an=an, cod=cod, dataact=receipt_date, nract=nract, expl=e, scd=scd, scc=scc, suma=suma, id_partc=id_partc, id_partd=id_partd) - - # Finalize - mesaj = cursor.var(oracledb.STRING, 4000) - cursor.callproc('PACK_CONTAFIN.FINALIZEAZA_SCRIERE_ACT_RUL', [0, cod, 0, 0, 0, mesaj]) - - if do_commit: - conn.commit() - return {"success": True, "cod": cod, "luna": luna, "an": an, "saved": True} - else: - conn.rollback() - return {"success": True, "cod": cod, "luna": luna, "an": an, "saved": False} - except Exception as e: - conn.rollback() - return {"success": False, "error": str(e)} - finally: - cursor.close() - conn.close() - -async def process_whatsapp_file(file_path: Path, do_save: bool = False): - print(f"📄 Procesez: {file_path.name}") - - # OCR - print("🔍 OCR...") - job_id = await submit_ocr_job(file_path) - result = await wait_for_result(job_id) - - if not result["success"]: - print(f"❌ OCR Error: {result.get('error')}") - return None - - ocr = result["result"] - ocr_time = result["time_ms"] - print(f"✅ OCR OK ({ocr_time}ms)") - print(f" CUI: {ocr.get('cui')}, Data: {ocr.get('receipt_date')}") - print(f" Total: {ocr.get('amount')} RON, TVA: {ocr.get('tva_total')}") - - # Oracle - print("💾 Oracle...") - oracle_result = save_to_oracle(ocr, do_commit=do_save) - - if oracle_result["success"]: - if oracle_result["saved"]: - print(f"✅ SALVAT: COD={oracle_result['cod']}, {oracle_result['luna']:02d}/{oracle_result['an']}") - else: - print(f"⚠️ DRY RUN: ar fi COD={oracle_result['cod']}") - else: - print(f"❌ Oracle Error: {oracle_result.get('error')}") - - return { - "ocr": ocr, - "ocr_time_ms": ocr_time, - "oracle": oracle_result - } - -if __name__ == "__main__": - if len(sys.argv) < 2: - print("Usage: python roa2web_whatsapp.py [--save]") - sys.exit(1) - - file_path = Path(sys.argv[1]) - do_save = "--save" in sys.argv - - if not file_path.exists(): - print(f"File not found: {file_path}") - sys.exit(1) - - asyncio.run(process_whatsapp_file(file_path, do_save)) diff --git a/deploy-package-20260223-151231/backend/shared/ssh_tunnel_manager.py b/deploy-package-20260223-151231/backend/shared/ssh_tunnel_manager.py deleted file mode 100644 index b1bc293..0000000 --- a/deploy-package-20260223-151231/backend/shared/ssh_tunnel_manager.py +++ /dev/null @@ -1,350 +0,0 @@ -""" -SSH Tunnel Manager - Cross-Platform Monitoring and Auto-Reconnect - -This module provides MONITORING and AUTO-RECONNECT for SSH tunnels. -It does NOT start tunnels - that's the responsibility of: -- Linux: start.sh → ssh-tunnel.sh -- Windows: Start-ROA2WEB.ps1 → SSH-Tunnels.ps1 -- Windows Service: Start-Backend-Service.ps1 → SSH-Tunnels.ps1 - -Responsibilities: -✅ Monitor tunnel health via port checks (background asyncio task) -✅ Auto-restart tunnels if they go down (calls platform-specific scripts) -✅ Expose status for /health endpoint - -NOT responsible for: -❌ Initial tunnel startup (done by wrapper scripts before backend starts) - -Usage in main.py: - from backend.shared.ssh_tunnel_manager import ssh_tunnel_manager - - @app.on_event("startup") - async def startup(): - await ssh_tunnel_manager.start_monitoring() - - @app.on_event("shutdown") - async def shutdown(): - await ssh_tunnel_manager.stop_monitoring() - - @app.get("/health") - async def health(): - return { - "ssh_tunnels": ssh_tunnel_manager.get_status() - } -""" - -import asyncio -import json -import logging -import platform -import subprocess -from pathlib import Path -from typing import Dict, List, Optional, Any - -logger = logging.getLogger(__name__) - - -class SSHTunnelManager: - """ - Cross-platform SSH tunnel MONITOR (not starter). - - Timeline: - T=0 start.sh / Wrapper starts - T=1s ssh-tunnel.sh / SSH-Tunnels.ps1 START - T=3s Tunnels active ✅ - T=5s uvicorn backend starts - T=7s Backend startup_event() - T=8s ssh_tunnel_manager.start_monitoring() - └─ Detects tunnels already active (just monitors, doesn't start) - T=38s Monitor check #1 - OK ✅ - ... - T=XXs [Tunnel drops] - T=XX+30 Monitor detects FAIL (1/2) - T=XX+60 Monitor detects FAIL (2/2) → RESTART via script - """ - - def __init__(self): - # Configuration - self.check_interval: int = 30 # seconds between health checks - self.max_failures_before_restart: int = 2 # restart after N consecutive failures - self.restart_cooldown: int = 60 # minimum seconds between restarts - - # State - self.tunnel_configs: List[Dict] = [] - self.tunnel_status: Dict[str, bool] = {} - self.consecutive_failures: Dict[str, int] = {} - self.last_restart_time: float = 0 - self.monitor_task: Optional[asyncio.Task] = None - self._is_monitoring: bool = False - - # Paths (detected at runtime) - self._project_root: Optional[Path] = None - self._config_file: Optional[Path] = None - - def _detect_paths(self) -> bool: - """Detect project paths based on current file location.""" - # This file is at: backend/shared/ssh_tunnel_manager.py - # Project root is 2 levels up - current_file = Path(__file__) - self._project_root = current_file.parent.parent.parent - - # Config file location - self._config_file = self._project_root / "backend" / "ssh-tunnels.json" - - return self._config_file.exists() - - def _load_config(self) -> List[Dict]: - """Load tunnel configuration from ssh-tunnels.json.""" - if not self._config_file or not self._config_file.exists(): - return [] - - try: - with open(self._config_file, 'r') as f: - tunnels = json.load(f) - - # Filter to only tunnels with ssh_host (excludes direct connections) - return [t for t in tunnels if t.get("ssh_host")] - except Exception as e: - logger.error(f"[SSH-MONITOR] Failed to load config: {e}") - return [] - - async def start_monitoring(self) -> bool: - """ - Start monitoring EXISTING tunnels. - - Does NOT start tunnels - assumes they're already running - (started by start.sh / Start-ROA2WEB.ps1 / Start-Backend-Service.ps1). - """ - if self._is_monitoring: - logger.warning("[SSH-MONITOR] Already monitoring") - return True - - # Detect paths and load config - if not self._detect_paths(): - logger.info("[SSH-MONITOR] No ssh-tunnels.json found, skipping") - return True - - self.tunnel_configs = self._load_config() - - if not self.tunnel_configs: - logger.info("[SSH-MONITOR] No SSH tunnels configured (or all are direct connections)") - return True - - # Check initial status (tunnels should already be running) - logger.info(f"[SSH-MONITOR] Checking {len(self.tunnel_configs)} tunnel(s)...") - - for config in self.tunnel_configs: - tunnel_id = config.get("id", "default") - port = config.get("local_port", 1521) - name = config.get("name", tunnel_id) - - is_active = await self._check_port("127.0.0.1", port) - self.tunnel_status[tunnel_id] = is_active - self.consecutive_failures[tunnel_id] = 0 - - status = "✅ active" if is_active else "❌ NOT active" - logger.info(f"[SSH-MONITOR] [{tunnel_id}] {name} - localhost:{port} - {status}") - - # Start background monitor loop - self._is_monitoring = True - self.monitor_task = asyncio.create_task(self._monitor_loop()) - logger.info(f"[SSH-MONITOR] ✅ Monitoring started (check every {self.check_interval}s)") - - return True - - async def stop_monitoring(self) -> None: - """Stop the monitoring background task.""" - if not self._is_monitoring: - return - - self._is_monitoring = False - - if self.monitor_task and not self.monitor_task.done(): - self.monitor_task.cancel() - try: - await self.monitor_task - except asyncio.CancelledError: - pass - - logger.info("[SSH-MONITOR] ✅ Monitoring stopped") - - async def _monitor_loop(self) -> None: - """Background loop: check tunnel health every N seconds, restart if needed.""" - while self._is_monitoring: - try: - await asyncio.sleep(self.check_interval) - - if not self._is_monitoring: - break - - needs_restart = False - - for config in self.tunnel_configs: - tunnel_id = config.get("id", "default") - port = config.get("local_port", 1521) - - is_healthy = await self._check_port("127.0.0.1", port) - self.tunnel_status[tunnel_id] = is_healthy - - if is_healthy: - # Reset failure count on success - if self.consecutive_failures.get(tunnel_id, 0) > 0: - logger.info(f"[SSH-MONITOR] [{tunnel_id}] Recovered ✅") - self.consecutive_failures[tunnel_id] = 0 - else: - # Increment failure count - self.consecutive_failures[tunnel_id] = \ - self.consecutive_failures.get(tunnel_id, 0) + 1 - - failures = self.consecutive_failures[tunnel_id] - logger.warning( - f"[SSH-MONITOR] [{tunnel_id}] FAIL " - f"({failures}/{self.max_failures_before_restart})" - ) - - if failures >= self.max_failures_before_restart: - needs_restart = True - - # Restart all tunnels if any failed enough times - if needs_restart: - await self._restart_tunnels() - - except asyncio.CancelledError: - break - except Exception as e: - logger.error(f"[SSH-MONITOR] Monitor loop error: {e}") - await asyncio.sleep(5) # Brief pause before retrying - - async def _check_port(self, host: str, port: int, timeout: float = 3.0) -> bool: - """Check if a port is accessible (tunnel is working).""" - try: - # Use asyncio.open_connection for non-blocking port check - reader, writer = await asyncio.wait_for( - asyncio.open_connection(host, port), - timeout=timeout - ) - writer.close() - await writer.wait_closed() - return True - except (asyncio.TimeoutError, ConnectionRefusedError, OSError): - return False - except Exception as e: - logger.debug(f"[SSH-MONITOR] Port check error {host}:{port}: {e}") - return False - - async def _restart_tunnels(self) -> bool: - """Restart tunnels via platform-specific script.""" - import time - - # Check cooldown - now = time.time() - if now - self.last_restart_time < self.restart_cooldown: - remaining = int(self.restart_cooldown - (now - self.last_restart_time)) - logger.warning(f"[SSH-MONITOR] Restart cooldown active ({remaining}s remaining)") - return False - - self.last_restart_time = now - logger.warning("[SSH-MONITOR] 🔄 Restarting tunnels...") - - # Build platform-specific command - if platform.system() == "Windows": - # On Windows, scripts are deployed to scripts/ folder - script_path = self._project_root / "scripts" / "ssh-tunnel.ps1" - # Fallback to development path if not found - if not script_path.exists(): - script_path = self._project_root / "deployment" / "windows" / "scripts" / "ssh-tunnel.ps1" - if not script_path.exists(): - logger.error(f"[SSH-MONITOR] Script not found in scripts/ or deployment/windows/scripts/") - return False - cmd = [ - "powershell.exe", - "-ExecutionPolicy", "Bypass", - "-File", str(script_path), - "restart" - ] - else: - script_path = self._project_root / "ssh-tunnel.sh" - if not script_path.exists(): - logger.error(f"[SSH-MONITOR] Script not found: {script_path}") - return False - cmd = [str(script_path), "restart"] - - try: - # Run restart command in subprocess - result = await asyncio.get_event_loop().run_in_executor( - None, - lambda: subprocess.run( - cmd, - capture_output=True, - text=True, - timeout=60, - cwd=str(self._project_root) - ) - ) - - if result.returncode == 0: - logger.info("[SSH-MONITOR] ✅ Tunnels restarted successfully") - # Reset failure counts - for tunnel_id in self.consecutive_failures: - self.consecutive_failures[tunnel_id] = 0 - return True - else: - logger.error(f"[SSH-MONITOR] Restart failed (code {result.returncode})") - if result.stderr: - logger.error(f"[SSH-MONITOR] stderr: {result.stderr[:500]}") - return False - - except subprocess.TimeoutExpired: - logger.error("[SSH-MONITOR] Restart command timed out") - return False - except Exception as e: - logger.error(f"[SSH-MONITOR] Restart error: {e}") - return False - - def get_status(self) -> Dict[str, Any]: - """ - Get current tunnel status for /health endpoint. - - Returns: - { - "status": "connected" | "degraded" | "disconnected" | "not_configured", - "tunnels": { - "tunnel_id": true/false, - ... - }, - "monitoring": true/false - } - """ - if not self.tunnel_configs: - return { - "status": "not_configured", - "tunnels": {}, - "monitoring": False - } - - # Determine overall status - all_connected = all(self.tunnel_status.values()) if self.tunnel_status else False - any_connected = any(self.tunnel_status.values()) if self.tunnel_status else False - - if all_connected: - status = "connected" - elif any_connected: - status = "degraded" - else: - status = "disconnected" - - return { - "status": status, - "tunnels": dict(self.tunnel_status), - "monitoring": self._is_monitoring - } - - def is_healthy(self) -> bool: - """Quick check if all tunnels are healthy.""" - if not self.tunnel_configs: - return True # No tunnels configured = healthy (direct connection) - return all(self.tunnel_status.values()) if self.tunnel_status else False - - -# Global singleton instance -ssh_tunnel_manager = SSHTunnelManager() diff --git a/deploy-package-20260223-151231/backend/ssh-tunnels.json b/deploy-package-20260223-151231/backend/ssh-tunnels.json deleted file mode 100644 index f161b28..0000000 --- a/deploy-package-20260223-151231/backend/ssh-tunnels.json +++ /dev/null @@ -1,12 +0,0 @@ -[ - { - "id": "vending", - "name": "Vending Master", - "local_port": 1521, - "ssh_host": "79.119.86.134", - "ssh_port": 22122, - "ssh_user": "romfast", - "oracle_host": "127.0.0.1", - "oracle_port": 1521 - } -] diff --git a/deploy-package-20260223-151231/backend/ssh-tunnels.json.example b/deploy-package-20260223-151231/backend/ssh-tunnels.json.example deleted file mode 100644 index e3c29d4..0000000 --- a/deploy-package-20260223-151231/backend/ssh-tunnels.json.example +++ /dev/null @@ -1,25 +0,0 @@ -[ - { - "id": "romfast", - "name": "Romfast - Producție", - "local_port": 1522, - "ssh_host": "roa.romfast.ro", - "ssh_port": 22122, - "ssh_user": "roa2web", - "ssh_key": "secrets/romfast.ssh_key", - "oracle_host": "10.0.20.36", - "oracle_port": 1521, - "_comment": "SSH key or ssh_pass required for authentication" - }, - { - "id": "client_b", - "name": "Client B - Alt Server", - "local_port": 1523, - "ssh_host": "oracle.client-b.com", - "ssh_port": 22, - "ssh_user": "oracle_tunnel", - "oracle_host": "192.168.1.10", - "oracle_port": 1521, - "_comment": "Uses secrets/client_b.ssh_pass for password auth" - } -] diff --git a/deploy-package-20260223-151231/frontend/assets/BankView.Ce31w-WN.css b/deploy-package-20260223-151231/frontend/assets/BankView.Ce31w-WN.css deleted file mode 100644 index af5764b..0000000 --- a/deploy-package-20260223-151231/frontend/assets/BankView.Ce31w-WN.css +++ /dev/null @@ -1 +0,0 @@ -.register-view[data-v-dc50926c]{max-width:1400px;margin:0 auto;padding:var(--space-xl)}.mobile-layout .register-view[data-v-dc50926c]{padding-top:calc(56px + var(--space-md));padding-bottom:calc(56px + var(--space-md));padding-left:var(--space-md);padding-right:var(--space-md)}.company-selection-card[data-v-dc50926c],.filters-card[data-v-dc50926c],.data-card[data-v-dc50926c]{margin-bottom:var(--space-md)}.numeric-value[data-v-dc50926c]{display:block;text-align:right;font-variant-numeric:tabular-nums;font-family:var(--font-mono, "Roboto Mono", "Consolas", monospace)}.numeric-value.zero[data-v-dc50926c]{color:var(--color-text-muted)}.numeric-value.negative[data-v-dc50926c]{color:var(--color-error)}.mobile-totals-bar[data-v-dc50926c]{background:var(--surface-card);border:1px solid var(--surface-border);padding:var(--space-sm) var(--space-md);margin-bottom:var(--space-md);border-radius:var(--radius-md)}.mobile-totals-grid[data-v-dc50926c]{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--space-xs) var(--space-md)}.mobile-totals-bar .total-item[data-v-dc50926c]{display:flex;justify-content:space-between;align-items:center}.mobile-totals-bar .total-label[data-v-dc50926c]{font-size:var(--text-xs);color:var(--text-color-secondary);font-weight:var(--font-medium)}.mobile-totals-bar .total-value[data-v-dc50926c]{font-size:var(--text-sm);font-weight:var(--font-bold);color:var(--text-color)}.mobile-totals-bar .total-value.incasari[data-v-dc50926c]{color:var(--green-600)}.mobile-totals-bar .total-value.plati[data-v-dc50926c]{color:var(--red-600)}.mobile-card-list[data-v-dc50926c]{display:flex;flex-direction:column;gap:var(--space-sm)}.mobile-data-card[data-v-dc50926c]{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-md);padding:var(--space-md)}.mobile-data-card .card-header[data-v-dc50926c]{font-weight:var(--font-semibold);color:var(--text-color);margin-bottom:var(--space-xs);font-size:var(--text-base)}.mobile-data-card .card-row[data-v-dc50926c]{display:flex;justify-content:space-between;align-items:center;font-size:var(--text-sm);color:var(--text-color-secondary)}.mobile-data-card .card-meta[data-v-dc50926c]{font-size:var(--text-xs);color:var(--text-color-secondary)}.mobile-data-card .card-amount[data-v-dc50926c]{font-weight:var(--font-semibold);color:var(--text-color);font-variant-numeric:tabular-nums}.mobile-data-card .card-amount.positive[data-v-dc50926c]{color:var(--green-600)}.mobile-data-card .card-amount.negative[data-v-dc50926c]{color:var(--red-600)}.mobile-empty[data-v-dc50926c]{text-align:center;padding:var(--space-xl);color:var(--text-color-secondary)}.mobile-empty i[data-v-dc50926c]{font-size:var(--text-3xl);margin-bottom:var(--space-sm);display:block}.bottom-sheet-title[data-v-dc50926c]{font-size:var(--text-lg);font-weight:var(--font-semibold);color:var(--text-color);margin:0 0 var(--space-md) 0}.bottom-sheet-filters[data-v-dc50926c]{display:flex;flex-direction:column;gap:var(--space-md)}.bottom-sheet-actions[data-v-dc50926c]{display:flex;gap:var(--space-sm);justify-content:flex-end;margin-top:var(--space-md);padding-top:var(--space-md);border-top:1px solid var(--surface-border)}[data-theme=dark] .mobile-totals-bar .total-value.incasari[data-v-dc50926c]{color:var(--green-400)}[data-theme=dark] .mobile-totals-bar .total-value.plati[data-v-dc50926c]{color:var(--red-400)}[data-theme=dark] .mobile-data-card .card-amount.positive[data-v-dc50926c]{color:var(--green-400)}[data-theme=dark] .mobile-data-card .card-amount.negative[data-v-dc50926c]{color:var(--red-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .mobile-totals-bar .total-value.incasari[data-v-dc50926c]{color:var(--green-400)}:root:not([data-theme]) .mobile-totals-bar .total-value.plati[data-v-dc50926c]{color:var(--red-400)}:root:not([data-theme]) .mobile-data-card .card-amount.positive[data-v-dc50926c]{color:var(--green-400)}:root:not([data-theme]) .mobile-data-card .card-amount.negative[data-v-dc50926c]{color:var(--red-400)}}@media (max-width: 768px){.register-view[data-v-dc50926c]{padding:var(--space-md)}} diff --git a/deploy-package-20260223-151231/frontend/assets/BankView.ffk9t1AL.js b/deploy-package-20260223-151231/frontend/assets/BankView.ffk9t1AL.js deleted file mode 100644 index 571ccad..0000000 --- a/deploy-package-20260223-151231/frontend/assets/BankView.ffk9t1AL.js +++ /dev/null @@ -1,3 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/sharedStores.Bb_IRn4Y.js","assets/index.B8XI8FQW.js","assets/vendor-core.B6UiYhU_.js","assets/vendor-primevue.BN-meDW0.js","assets/vendor-utils.CO3CyGpV.js","assets/vendor-export.BWjBvx7Z.js","assets/index.Co2Dp57K.css"])))=>i.map(i=>d[i]); -import{_ as te}from"./vendor-export.BWjBvx7Z.js";import{_ as be,u as we,s as Ce}from"./index.B8XI8FQW.js";import{e as he,u as ke,b as Ae,c as xe}from"./sharedStores.Bb_IRn4Y.js";import{b as Ne,e as Se}from"./exportUtils.BtGzMnqV.js";import{M as Te}from"./MobileTopBar.BnL78WPy.js";import{M as Ve}from"./MobileBottomNav.Cp8OR33w.js";import{B as Pe}from"./BottomSheet.WKuCIyuZ.js";import{M as Be}from"./MobileDrawerMenu.DJ_STPbv.js";import{s as De}from"./splitbutton.esm.DvALhxoC.js";import{a as b,j as M,w as j,o as Fe,K as Ee,c as m,h as N,i as f,q as n,e as t,O as o,p as y,y as V,k as S,v as d,u as D,P as Le,d as i,F as U,B as Ie}from"./vendor-core.B6UiYhU_.js";import{g as Re}from"./vendor-utils.CO3CyGpV.js";import"./vendor-primevue.BN-meDW0.js";const ze={class:"bottom-sheet-filters"},Me={class:"form-group"},Ue={class:"form-group"},$e={class:"form-group"},Oe={class:"bottom-sheet-actions"},Xe={class:"register-view"},We={key:0,class:"page-header"},je={class:"company-selection"},qe={key:2,class:"mobile-totals-bar"},Ke={class:"mobile-totals-grid"},Ge={class:"total-item"},He={class:"total-value"},Je={class:"total-item"},Qe={class:"total-value incasari"},Ye={class:"total-item"},Ze={class:"total-value plati"},ea={class:"total-item"},aa={class:"total-value"},ta={class:"form"},sa={class:"form-row"},la={class:"form-col"},oa={class:"form-group"},ra={class:"form-col"},na={class:"form-group"},ia={class:"form-col"},ua={class:"form-group"},ca={class:"form-actions"},da={key:4,class:"summary-stats-inline"},pa={class:"stat-item"},ma={class:"stat-item"},va={class:"stat-value incasari"},fa={class:"stat-item"},ya={class:"stat-value plati"},ga={class:"stat-item"},_a={key:0,class:"mobile-card-list"},ba={class:"card-header"},wa={class:"card-row"},Ca={class:"card-meta"},ha={key:0,class:"mobile-empty"},ka={class:"loading-state"},Aa={key:0,class:"numeric-value"},xa={key:1,class:"numeric-value zero"},Na={key:0,class:"numeric-value"},Sa={key:1,class:"numeric-value zero"},Ta={__name:"BankView",setup(Va){var ae;const g=we(),se=Le(),u=he(),r=ke(),C=Ae(),P=xe(),F=b(((ae=r.selectedCompany)==null?void 0:ae.id_firma)||null),_=b(window.innerWidth<768),k=b(!1),$=b(!1),le=async()=>{await P.logout(),se.push("/login")},oe=async a=>{var e;await r.loadCompanies(),(e=r.selectedCompany)!=null&&e.id_firma&&await C.loadPeriods(r.selectedCompany.id_firma)},re=M(()=>[{icon:"pi pi-filter",label:"Filtre",tooltip:"Filtre",active:fe.value},{icon:"pi pi-filter-slash",label:"Resetează",tooltip:"Resetează Filtrele"},{icon:"pi pi-download",label:"Export",tooltip:"Export"}]),q=b(null),ne=b([{label:"Export PDF",icon:"pi pi-file-pdf",command:()=>X()},{label:"Export XLSX",icon:"pi pi-file-excel",command:()=>ee()}]),ie=b([{label:"Export PDF",icon:"pi pi-file-pdf",command:()=>X()},{label:"Export XLSX",icon:"pi pi-file-excel",command:()=>ee()}]),ue=(a,e)=>{a.icon==="pi pi-filter"?k.value=!k.value:a.icon==="pi pi-filter-slash"?O():a.icon==="pi pi-download"&&q.value.toggle(e)},K=()=>{_.value=window.innerWidth<768,_.value||(k.value=!1)},G=[{label:"Bancă LEI",value:"BANCA_LEI"},{label:"Bancă Valută",value:"BANCA_VALUTA"}],l=b({registerType:"BANCA_LEI",partnerName:"",bankAccount:null}),A=b([]),x=b({page:0,rows:50}),E=(a,e="RON")=>a?new Intl.NumberFormat("ro-RO",{style:"currency",currency:e}).format(a):"0,00 "+e,T=a=>a==null?"":new Intl.NumberFormat("ro-RO",{minimumFractionDigits:2,maximumFractionDigits:2}).format(a),H=a=>a?Re(new Date(a),"dd.MM.yyyy"):"",ce=a=>{if(!a)return"";const e=new Date(a);return`${String(e.getDate()).padStart(2,"0")}/${String(e.getMonth()+1).padStart(2,"0")}`},L=a=>a?Math.abs(a)>=1e4?new Intl.NumberFormat("ro-RO",{maximumFractionDigits:0}).format(a):new Intl.NumberFormat("ro-RO",{minimumFractionDigits:2,maximumFractionDigits:2}).format(a):"0",J=(a,e=100)=>a?a.length<=e?a:a.substring(0,e)+"...":"",Q=M(()=>l.value.registerType==="BANCA_VALUTA"),de=a=>a?a.replace(/[ăâ]/gi,e=>e===e.toLowerCase()?"a":"A").replace(/[îâ]/gi,e=>e===e.toLowerCase()?"i":"I").replace(/[ș]/gi,e=>e===e.toLowerCase()?"s":"S").replace(/[ț]/gi,e=>e===e.toLowerCase()?"t":"T").replace(/[Ă]/g,"A").replace(/[Â]/g,"A").replace(/[Î]/g,"I").replace(/[Ș]/g,"S").replace(/[Ț]/g,"T"):"",pe=a=>({BANCA_LEI:"Registrul de Banca LEI",BANCA_VALUTA:"Registrul de Banca Valuta"})[a]||"Registrul de Banca",I=async()=>{if(!r.selectedCompany||!l.value.registerType){A.value=[];return}try{const e=await(await te(async()=>{const{default:p}=await import("./sharedStores.Bb_IRn4Y.js").then(c=>c.i);return{default:p}},__vite__mapDeps([0,1,2,3,4,5,6]))).default.get("/treasury/bank-cash-accounts",{params:{company:r.selectedCompany.id_firma,register_type:l.value.registerType}});A.value=e.data||[]}catch(a){console.error("Failed to load bank accounts:",a),A.value=[]}};j(()=>l.value.registerType,async()=>{l.value.bankAccount=null,await I()});const me=a=>"bank-row",ve=async a=>{x.value.page=a.page,x.value.rows=a.rows,await h()},O=async()=>{l.value={registerType:"BANCA_LEI",partnerName:"",bankAccount:null},x.value.page=0,await I(),await h()},R=M(()=>u.registers.length>0),fe=M(()=>l.value.registerType!=="BANCA_LEI"||l.value.partnerName!==""||l.value.bankAccount!==null),ye=async()=>{if(!F.value)return;const a=r.getCompanyById(F.value);a&&(r.setSelectedCompany(a),await h())},z=async()=>{x.value.page=0,await h()},Y=(()=>{let a;return()=>{clearTimeout(a),a=setTimeout(async()=>{x.value.page=0,await h()},500)}})(),ge=async()=>{await h(),g.add({severity:"success",summary:"Actualizare reușită",detail:"Registrul a fost actualizat cu succes",life:3e3})},Z=async()=>{if(!r.selectedCompany)return[];if(!C.selectedPeriod)return[];try{const{luna:a,an:e}=C.selectedPeriod,p={company:r.selectedCompany.id_firma,page:1,page_size:999999,luna:a,an:e};return l.value.registerType&&(p.register_type=l.value.registerType),l.value.partnerName&&(p.partner_name=l.value.partnerName),l.value.bankAccount&&(p.bank_account=l.value.bankAccount),(await(await te(async()=>{const{default:B}=await import("./sharedStores.Bb_IRn4Y.js").then(W=>W.i);return{default:B}},__vite__mapDeps([0,1,2,3,4,5,6]))).default.get("/treasury/bank-cash-register",{params:p})).data.registers||[]}catch(a){return console.error("Failed to fetch all data:",a),[]}},ee=async()=>{if(!R.value){g.add({severity:"warn",summary:"Nu există date",detail:"Nu există înregistrări de exportat",life:3e3});return}g.add({severity:"info",summary:"Se pregătește exportul",detail:"Se încarcă toate datele...",life:2e3});const a=await Z();if(a.length===0){g.add({severity:"error",summary:"Eroare",detail:"Nu s-au putut prelua datele pentru export",life:3e3});return}const e=a.map(c=>{const v={Data:c.dataact?H(c.dataact):"","Nr.":c.nract||""};return v.Banca=c.nume_cont_bancar||"",v.Partener=c.nume||"",Q.value&&(v.Valuta=c.valuta||""),v.Încasări=parseFloat(c.incasari)||0,v.Plăți=parseFloat(c.plati)||0,v["Sold Cumulat"]=parseFloat(c.sold)||0,v.Explicație=J(c.explicatia,100),v});Se(e,`registru_banca_${r.selectedCompany.name.replace(/\s+/g,"_")}`,"Registru Bancă").success?g.add({severity:"success",summary:"Export reușit",detail:`${a.length} înregistrări exportate cu succes`,life:3e3}):g.add({severity:"error",summary:"Eroare la export",detail:"Nu s-a putut genera fișierul Excel",life:3e3})},X=async()=>{var c;if(!R.value){g.add({severity:"warn",summary:"Nu există date",detail:"Nu există înregistrări de exportat",life:3e3});return}g.add({severity:"info",summary:"Se pregătește exportul",detail:"Se încarcă toate datele...",life:2e3});const a=await Z();if(a.length===0){g.add({severity:"error",summary:"Eroare",detail:"Nu s-au putut prelua datele pentru export",life:3e3});return}const e=pe(l.value.registerType);Ne(a,{companyName:de(((c=r.selectedCompany)==null?void 0:c.name)||""),title:e,luna:u.accountingPeriod.luna,an:u.accountingPeriod.an,isBanca:!0},`registru-banca-${r.selectedCompany.name.replace(/\s+/g,"-")}`).success?g.add({severity:"success",summary:"Export reușit",detail:`${a.length} înregistrări exportate cu succes`,life:3e3}):g.add({severity:"error",summary:"Eroare la export",detail:"Nu s-a putut genera fișierul PDF",life:3e3})},h=async()=>{if(!r.selectedCompany||!C.selectedPeriod)return;u.setPagination(x.value);const{luna:a,an:e}=C.selectedPeriod,p={partner_name:l.value.partnerName||void 0,register_type:l.value.registerType||void 0,bank_account:l.value.bankAccount||void 0,luna:a,an:e};await u.loadBankCashRegister(r.selectedCompany.id_firma,p)};return Fe(async()=>{window.addEventListener("resize",K),r.hasCompanies||await r.loadCompanies(),r.selectedCompany&&await I()}),Ee(()=>{window.removeEventListener("resize",K)}),j(()=>r.selectedCompany,async a=>{a&&C.selectedPeriod&&(await I(),await h())}),j(()=>C.selectedPeriod,async a=>{a&&r.selectedCompany&&await h()},{immediate:!0}),(a,e)=>{const p=S("Dropdown"),c=S("InputText"),v=S("Button"),B=S("Card"),W=S("ProgressSpinner"),w=S("Column"),_e=S("DataTable");return i(),m("div",{class:D(["app-container",{"mobile-layout":_.value}])},[_.value?(i(),N(Te,{key:0,title:"Bancă","show-menu":!0,actions:re.value,onMenuClick:e[0]||(e[0]=s=>$.value=!0),onActionClick:ue},null,8,["actions"])):f("",!0),n(o(Ce),{ref_key:"exportMenu",ref:q,model:ne.value,popup:!0},null,8,["model"]),n(Be,{modelValue:$.value,"onUpdate:modelValue":e[1]||(e[1]=s=>$.value=s),user:o(P).user,"companies-store":o(r),"period-store":o(C),"available-servers":o(P).availableServers,"current-server-id":o(P).selectedServerId,"auth-store":o(P),onLogout:le,onServerSwitched:oe},null,8,["modelValue","user","companies-store","period-store","available-servers","current-server-id","auth-store"]),n(Pe,{modelValue:k.value,"onUpdate:modelValue":e[7]||(e[7]=s=>k.value=s)},{default:y(()=>[e[15]||(e[15]=t("h3",{class:"bottom-sheet-title"},"Filtre",-1)),t("div",ze,[t("div",Me,[e[12]||(e[12]=t("label",{class:"form-label"},"Tip Registru",-1)),n(p,{modelValue:l.value.registerType,"onUpdate:modelValue":e[2]||(e[2]=s=>l.value.registerType=s),options:G,"option-label":"label","option-value":"value",placeholder:"Selectați tipul",class:"w-full",onChange:z},null,8,["modelValue"])]),t("div",Ue,[e[13]||(e[13]=t("label",{class:"form-label"},"Banca",-1)),n(p,{modelValue:l.value.bankAccount,"onUpdate:modelValue":e[3]||(e[3]=s=>l.value.bankAccount=s),options:A.value,placeholder:"Toate băncile",showClear:!0,class:"w-full",onChange:z,disabled:!l.value.registerType||A.value.length===0},null,8,["modelValue","options","disabled"])]),t("div",$e,[e[14]||(e[14]=t("label",{class:"form-label"},"Căutare Partener",-1)),n(c,{modelValue:l.value.partnerName,"onUpdate:modelValue":e[4]||(e[4]=s=>l.value.partnerName=s),placeholder:"Nume partener...",class:"w-full",onInput:o(Y)},null,8,["modelValue","onInput"])]),t("div",Oe,[n(v,{icon:"pi pi-filter-slash",label:"Resetează",class:"p-button-outlined p-button-secondary",onClick:e[5]||(e[5]=s=>{O(),k.value=!1})}),n(v,{icon:"pi pi-check",label:"Aplică",onClick:e[6]||(e[6]=s=>k.value=!1)})])])]),_:1},8,["modelValue"]),t("div",Xe,[_.value?f("",!0):(i(),m("div",We,[...e[16]||(e[16]=[t("h1",{class:"page-title"},[t("i",{class:"pi pi-building"}),V(" Registru Bancă ")],-1)])])),o(r).selectedCompany?f("",!0):(i(),N(B,{key:1,class:"company-selection-card"},{content:y(()=>[t("div",je,[e[17]||(e[17]=t("p",{class:"text-color-secondary mb-3"}," Selectați o companie pentru a vizualiza registrul de bancă: ",-1)),n(p,{modelValue:F.value,"onUpdate:modelValue":e[8]||(e[8]=s=>F.value=s),options:o(r).companyListFormatted,"option-label":"displayName","option-value":"id_firma",placeholder:"Alegeți compania",class:"w-full",onChange:ye},null,8,["modelValue","options"])])]),_:1})),_.value&&o(r).selectedCompany&&R.value?(i(),m("div",qe,[t("div",Ke,[t("div",Ge,[e[18]||(e[18]=t("span",{class:"total-label"},"Sold Prec:",-1)),t("span",He,d(L(o(u).totals.sold_precedent_all)),1)]),t("div",Je,[e[19]||(e[19]=t("span",{class:"total-label"},"Încasări:",-1)),t("span",Qe,d(L(o(u).totals.total_incasari_all)),1)]),t("div",Ye,[e[20]||(e[20]=t("span",{class:"total-label"},"Plăți:",-1)),t("span",Ze,d(L(o(u).totals.total_plati_all)),1)]),t("div",ea,[e[21]||(e[21]=t("span",{class:"total-label"},"Sold Final:",-1)),t("span",aa,d(L(o(u).totals.sold_final_all)),1)])])])):f("",!0),o(r).selectedCompany&&!_.value?(i(),N(B,{key:3,class:"filters-card"},{content:y(()=>[t("div",ta,[t("div",sa,[t("div",la,[t("div",oa,[e[22]||(e[22]=t("label",{class:"form-label"},"Tip Registru",-1)),n(p,{modelValue:l.value.registerType,"onUpdate:modelValue":e[9]||(e[9]=s=>l.value.registerType=s),options:G,"option-label":"label","option-value":"value",placeholder:"Selectați tipul",class:"w-full",onChange:z},null,8,["modelValue"])])]),t("div",ra,[t("div",na,[e[23]||(e[23]=t("label",{class:"form-label"},"Banca",-1)),n(p,{modelValue:l.value.bankAccount,"onUpdate:modelValue":e[10]||(e[10]=s=>l.value.bankAccount=s),options:A.value,placeholder:"Toate băncile",showClear:!0,class:"w-full",onChange:z,disabled:!l.value.registerType||A.value.length===0},null,8,["modelValue","options","disabled"])])]),t("div",ia,[t("div",ua,[e[24]||(e[24]=t("label",{class:"form-label"},"Căutare Partener",-1)),n(c,{modelValue:l.value.partnerName,"onUpdate:modelValue":e[11]||(e[11]=s=>l.value.partnerName=s),placeholder:"Nume partener...",class:"w-full",onInput:o(Y)},null,8,["modelValue","onInput"])])])]),t("div",ca,[n(v,{icon:"pi pi-filter-slash",label:"Resetează Filtre",class:"p-button-outlined p-button-secondary",onClick:O}),n(o(De),{label:"Export",icon:"pi pi-download",model:ie.value,onClick:X,class:"p-button-outlined",disabled:!R.value},null,8,["model","disabled"]),n(v,{icon:"pi pi-refresh",label:"Actualizează",loading:o(u).isLoading,onClick:ge},null,8,["loading"])])])]),_:1})):f("",!0),!_.value&&o(r).selectedCompany?(i(),m("div",da,[t("div",pa,[e[25]||(e[25]=t("span",{class:"stat-label"},"Sold Precedent:",-1)),t("span",{class:D(["stat-value",o(u).totals.sold_precedent_all>=0?"incasari":"plati"])},d(E(o(u).totals.sold_precedent_all)),3)]),t("div",ma,[e[26]||(e[26]=t("span",{class:"stat-label"},"Încasări:",-1)),t("span",va,d(E(o(u).totals.total_incasari_all)),1)]),t("div",fa,[e[27]||(e[27]=t("span",{class:"stat-label"},"Plăți:",-1)),t("span",ya,d(E(o(u).totals.total_plati_all)),1)]),t("div",ga,[e[28]||(e[28]=t("span",{class:"stat-label"},"Sold Final:",-1)),t("span",{class:D(["stat-value",o(u).totals.sold_final_all>=0?"incasari":"plati"])},d(E(o(u).totals.sold_final_all)),3)])])):f("",!0),o(r).selectedCompany?(i(),N(B,{key:5,class:"data-card"},{content:y(()=>[_.value?(i(),m("div",_a,[(i(!0),m(U,null,Ie(o(u).registers,s=>(i(),m("div",{key:`${s.dataact}-${s.nract}`,class:"mobile-data-card"},[t("div",ba,d(s.nume||"Fără partener"),1),t("div",wa,[t("span",Ca,d(ce(s.dataact))+" · "+d(s.nume_cont_bancar),1),t("span",{class:D(["card-amount",s.incasari>0?"positive":s.plati>0?"negative":""])},[s.incasari>0?(i(),m(U,{key:0},[V("+"+d(T(s.incasari)),1)],64)):s.plati>0?(i(),m(U,{key:1},[V("-"+d(T(s.plati)),1)],64)):(i(),m(U,{key:2},[V(d(T(0)),1)],64))],2)])]))),128)),o(u).registers.length===0?(i(),m("div",ha,[...e[29]||(e[29]=[t("i",{class:"pi pi-info-circle"},null,-1),t("p",null,"Nu au fost găsite înregistrări",-1)])])):f("",!0)])):f("",!0),_.value?f("",!0):(i(),N(_e,{key:1,value:o(u).registers,loading:o(u).isLoading,paginator:!0,rows:x.value.rows,"total-records":o(u).pagination.totalRecords,lazy:!0,"striped-rows":!0,"paginator-template":"FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink CurrentPageReport RowsPerPageDropdown","rows-per-page-options":[25,50,100],"current-page-report-template":"Afișare {first} - {last} din {totalRecords} înregistrări","responsive-layout":"scroll",onPage:ve,class:"p-datatable-sm",rowClass:me},{empty:y(()=>[...e[30]||(e[30]=[t("div",{class:"table-empty"},[t("i",{class:"pi pi-info-circle table-empty-icon"}),t("p",{class:"table-empty-message"}," Nu au fost găsite înregistrări ")],-1)])]),loading:y(()=>[t("div",ka,[n(W),e[31]||(e[31]=t("p",null,"Se încarcă registrul...",-1))])]),default:y(()=>[n(w,{field:"dataact",header:"Data",sortable:"",class:"col-data"},{body:y(s=>[V(d(H(s.data.dataact)),1)]),_:1}),n(w,{field:"nract",header:"Nr.",sortable:"",class:"col-nr"}),n(w,{field:"nume_cont_bancar",header:"Banca",sortable:"",class:"col-cont"}),n(w,{field:"nume",header:"Partener",sortable:"",class:"col-partener"}),Q.value?(i(),N(w,{key:0,field:"valuta",header:"Valuta",sortable:"",class:"col-valuta"})):f("",!0),n(w,{field:"incasari",header:"Încasări",sortable:"",class:"col-numeric"},{body:y(s=>[s.data.incasari>0?(i(),m("span",Aa,d(T(s.data.incasari)),1)):(i(),m("span",xa,"0,00"))]),_:1}),n(w,{field:"plati",header:"Plăți",sortable:"",class:"col-numeric"},{body:y(s=>[s.data.plati>0?(i(),m("span",Na,d(T(s.data.plati)),1)):(i(),m("span",Sa,"0,00"))]),_:1}),n(w,{field:"sold",header:"Sold Cumulat",sortable:"",class:"col-numeric col-sold"},{body:y(s=>[t("span",{class:D(["numeric-value",{negative:s.data.sold<0}])},d(T(s.data.sold)),3)]),_:1}),n(w,{field:"explicatia",header:"Explicație",class:"col-explicatie"},{body:y(s=>[V(d(J(s.data.explicatia,100)),1)]),_:1})]),_:1},8,["value","loading","rows","total-records"]))]),_:1})):f("",!0)]),_.value?(i(),N(Ve,{key:1})):f("",!0)],2)}}},Oa=be(Ta,[["__scopeId","data-v-dc50926c"]]);export{Oa as default}; -//# sourceMappingURL=BankView.ffk9t1AL.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/BankView.ffk9t1AL.js.map b/deploy-package-20260223-151231/frontend/assets/BankView.ffk9t1AL.js.map deleted file mode 100644 index fe5d3e4..0000000 --- a/deploy-package-20260223-151231/frontend/assets/BankView.ffk9t1AL.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"mappings":"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","names":["toast","useToast","router","useRouter","treasuryStore","useTreasuryStore","companyStore","useCompanyStore","periodStore","useAccountingPeriodStore","authStore","useAuthStore","selectedCompanyId","ref","_a","isMobile","showFilters","showDrawer","handleLogout","handleServerSwitched","newServerId","mobileTopBarActions","computed","hasActiveFilters","exportMenu","exportMenuItems","exportPDF","exportExcel","desktopExportItems","handleTopBarAction","action","event","resetFilters","handleResize","registerTypeOptions","filters","bankAccountOptions","pagination","formatCurrency","amount","currency","formatNumber","formatDate","dateString","format","formatDateShort","date","formatCompact","truncateText","text","maxLength","isValutaType","removeDiacritics","match","getPdfTitle","type","loadBankAccounts","response","__vitePreload","__vite_default__","n","error","watch","getRowClass","data","onPage","loadData","hasData","handleCompanyChange","company","handleFilterChange","handleSearchChange","timeout","refreshData","fetchAllData","luna","an","params","allData","exportData","row","baseData","exportToExcel","pdfTitle","exportBankCashRegisterPDF","filterParams","onMounted","onUnmounted","newCompany","newPeriod","_createElementBlock","_normalizeClass","_createBlock","MobileTopBar","_createVNode","_unref","Menu","MobileDrawerMenu","$event","BottomSheet","_cache","_createElementVNode","_hoisted_1","_hoisted_2","_component_Dropdown","_hoisted_3","_hoisted_4","_component_InputText","_hoisted_5","_component_Button","_hoisted_6","_openBlock","_hoisted_7","_component_Card","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_toDisplayString","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","SplitButton","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_Fragment","_renderList","reg","_hoisted_36","_hoisted_37","_hoisted_38","_createTextVNode","_hoisted_39","_component_DataTable","_hoisted_40","_component_ProgressSpinner","_component_Column","_withCtx","slotProps","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","MobileBottomNav"],"ignoreList":[],"sources":["../../src/modules/reports/views/BankView.vue"],"sourcesContent":["\n\n\n\n\n"],"file":"assets/BankView.ffk9t1AL.js"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/BottomSheet.Bxn5CrD8.css b/deploy-package-20260223-151231/frontend/assets/BottomSheet.Bxn5CrD8.css deleted file mode 100644 index 686209b..0000000 --- a/deploy-package-20260223-151231/frontend/assets/BottomSheet.Bxn5CrD8.css +++ /dev/null @@ -1 +0,0 @@ -.bottom-sheet-overlay[data-v-3b1326f3]{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:var(--z-modal-backdrop);display:flex;align-items:flex-end;justify-content:center}.bottom-sheet[data-v-3b1326f3]{width:100%;max-height:calc(90vh - 56px);background:var(--surface-card);border-radius:var(--radius-lg) var(--radius-lg) 0 0;box-shadow:var(--shadow-xl);overflow:hidden;display:flex;flex-direction:column;z-index:var(--z-modal);margin-bottom:56px}.bottom-sheet-handle[data-v-3b1326f3]{display:flex;justify-content:center;padding:var(--space-sm) var(--space-md);cursor:pointer;min-height:32px}.handle-bar[data-v-3b1326f3]{width:40px;height:4px;background:var(--surface-border);border-radius:var(--radius-full)}.bottom-sheet-content[data-v-3b1326f3]{flex:1;padding:0 var(--space-md) var(--space-lg);overflow-y:auto;-webkit-overflow-scrolling:touch}.bottom-sheet-enter-active[data-v-3b1326f3],.bottom-sheet-leave-active[data-v-3b1326f3]{transition:opacity var(--transition-normal)}.bottom-sheet-enter-active .bottom-sheet[data-v-3b1326f3],.bottom-sheet-leave-active .bottom-sheet[data-v-3b1326f3]{transition:transform var(--transition-normal)}.bottom-sheet-enter-from[data-v-3b1326f3],.bottom-sheet-leave-to[data-v-3b1326f3]{opacity:0}.bottom-sheet-enter-from .bottom-sheet[data-v-3b1326f3],.bottom-sheet-leave-to .bottom-sheet[data-v-3b1326f3]{transform:translateY(100%)}.bottom-sheet-enter-to[data-v-3b1326f3],.bottom-sheet-leave-from[data-v-3b1326f3]{opacity:1}.bottom-sheet-enter-to .bottom-sheet[data-v-3b1326f3],.bottom-sheet-leave-from .bottom-sheet[data-v-3b1326f3]{transform:translateY(0)}[data-theme=dark] .bottom-sheet-overlay[data-v-3b1326f3]{background:#000000b3}[data-theme=dark] .bottom-sheet[data-v-3b1326f3]{background:var(--surface-card);box-shadow:0 -4px 24px #0006}[data-theme=dark] .handle-bar[data-v-3b1326f3]{background:var(--surface-border)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .bottom-sheet-overlay[data-v-3b1326f3]{background:#000000b3}:root:not([data-theme]) .bottom-sheet[data-v-3b1326f3]{background:var(--surface-card);box-shadow:0 -4px 24px #0006}:root:not([data-theme]) .handle-bar[data-v-3b1326f3]{background:var(--surface-border)}} diff --git a/deploy-package-20260223-151231/frontend/assets/BottomSheet.WKuCIyuZ.js b/deploy-package-20260223-151231/frontend/assets/BottomSheet.WKuCIyuZ.js deleted file mode 100644 index 0727163..0000000 --- a/deploy-package-20260223-151231/frontend/assets/BottomSheet.WKuCIyuZ.js +++ /dev/null @@ -1,2 +0,0 @@ -import{a as v,h as y,d as i,q as S,p as _,c as w,i as B,e as l,f as O,E as T,s as b,T as k}from"./vendor-core.B6UiYhU_.js";import{_ as D}from"./index.B8XI8FQW.js";const V={class:"bottom-sheet-content"},C=100,x={__name:"BottomSheet",props:{modelValue:{type:Boolean,default:!1},closeOnOverlay:{type:Boolean,default:!0},closeOnSwipeDown:{type:Boolean,default:!0}},emits:["update:modelValue"],setup(r,{emit:u}){const n=r,d=u,e=v(null);let o=0,s=0;const c=()=>{d("update:modelValue",!1)},f=()=>{n.closeOnOverlay&&c()},h=t=>{n.closeOnSwipeDown&&(o=t.touches[0].clientY,s=o)},m=t=>{if(!n.closeOnSwipeDown)return;s=t.touches[0].clientY;const a=Math.max(0,s-o);e.value&&a>0&&(e.value.style.transform=`translateY(${a}px)`,e.value.style.transition="none")},p=()=>{if(!n.closeOnSwipeDown||!e.value)return;const t=s-o;e.value.style.transition="",e.value.style.transform="",t>C&&c(),o=0,s=0};return(t,a)=>(i(),y(k,{to:"body"},[S(b,{name:"bottom-sheet"},{default:_(()=>[r.modelValue?(i(),w("div",{key:0,class:"bottom-sheet-overlay",onClick:T(f,["self"])},[l("div",{class:"bottom-sheet",ref_key:"sheetRef",ref:e,onTouchstart:h,onTouchmove:m,onTouchend:p},[l("div",{class:"bottom-sheet-handle",onClick:c},[...a[0]||(a[0]=[l("div",{class:"handle-bar"},null,-1)])]),l("div",V,[O(t.$slots,"default",{},void 0,!0)])],544)])):B("",!0)]),_:3})]))}},M=D(x,[["__scopeId","data-v-3b1326f3"]]);export{M as B}; -//# sourceMappingURL=BottomSheet.WKuCIyuZ.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/BottomSheet.WKuCIyuZ.js.map b/deploy-package-20260223-151231/frontend/assets/BottomSheet.WKuCIyuZ.js.map deleted file mode 100644 index 042e360..0000000 --- a/deploy-package-20260223-151231/frontend/assets/BottomSheet.WKuCIyuZ.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"BottomSheet.WKuCIyuZ.js","sources":["../../src/shared/components/mobile/BottomSheet.vue"],"sourcesContent":["\n\n\n\n\n"],"names":["SWIPE_THRESHOLD","props","__props","emit","__emit","sheetRef","ref","touchStartY","touchCurrentY","close","handleOverlayClick","handleTouchStart","event","handleTouchMove","dragDistance","handleTouchEnd","_createBlock","_Teleport","_createVNode","_Transition","_createElementBlock","_createElementVNode","_hoisted_1","_renderSlot","_ctx"],"mappings":"0MAwFMA,EAAkB,2MAhCxB,MAAMC,EAAQC,EAwBRC,EAAOC,EAGPC,EAAWC,EAAI,IAAI,EAGzB,IAAIC,EAAc,EACdC,EAAgB,EAMpB,MAAMC,EAAQ,IAAM,CAClBN,EAAK,oBAAqB,EAAK,CACjC,EAKMO,EAAqB,IAAM,CAC3BT,EAAM,gBACRQ,EAAK,CAET,EAKME,EAAoBC,GAAU,CAC7BX,EAAM,mBACXM,EAAcK,EAAM,QAAQ,CAAC,EAAE,QAC/BJ,EAAgBD,EAClB,EAKMM,EAAmBD,GAAU,CACjC,GAAI,CAACX,EAAM,iBAAkB,OAC7BO,EAAgBI,EAAM,QAAQ,CAAC,EAAE,QAGjC,MAAME,EAAe,KAAK,IAAI,EAAGN,EAAgBD,CAAW,EAGxDF,EAAS,OAASS,EAAe,IACnCT,EAAS,MAAM,MAAM,UAAY,cAAcS,CAAY,MAC3DT,EAAS,MAAM,MAAM,WAAa,OAEtC,EAKMU,EAAiB,IAAM,CAC3B,GAAI,CAACd,EAAM,kBAAoB,CAACI,EAAS,MAAO,OAEhD,MAAMS,EAAeN,EAAgBD,EAGrCF,EAAS,MAAM,MAAM,WAAa,GAClCA,EAAS,MAAM,MAAM,UAAY,GAG7BS,EAAed,GACjBS,EAAK,EAIPF,EAAc,EACdC,EAAgB,CAClB,oBAvJEQ,EAsBWC,EAAA,CAtBD,GAAG,QAAM,CACjBC,EAoBaC,EAAA,CApBD,KAAK,cAAc,EAAA,WAC7B,IAkBM,CAlBKjB,EAAA,gBAAXkB,EAkBM,MAAA,OAlBiB,MAAM,uBAAwB,UAAYV,EAAkB,CAAA,MAAA,CAAA,IACjFW,EAgBM,MAAA,CAfJ,MAAM,uBACF,WAAJ,IAAIhB,EACH,aAAYM,EACZ,YAAWE,EACX,WAAUE,IAGXM,EAEM,MAAA,CAFD,MAAM,sBAAuB,QAAOZ,oBACvCY,EAA8B,MAAA,CAAzB,MAAM,YAAY,EAAA,KAAA,EAAA,MAIzBA,EAEM,MAFNC,EAEM,CADJC,EAAaC,EAAA,OAAA,UAAA,CAAA,EAAA,OAAA,EAAA"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/CacheStatsView.44Gkb4za.css b/deploy-package-20260223-151231/frontend/assets/CacheStatsView.44Gkb4za.css deleted file mode 100644 index 38c30a7..0000000 --- a/deploy-package-20260223-151231/frontend/assets/CacheStatsView.44Gkb4za.css +++ /dev/null @@ -1 +0,0 @@ -.cache-stats-view[data-v-30640deb]{padding:var(--space-xl);max-width:1400px;margin:0 auto}.stats-header[data-v-30640deb]{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-md)}.stats-header h1[data-v-30640deb]{margin:0;color:var(--text-color)}.actions[data-v-30640deb]{display:flex;gap:var(--space-sm)}.stats-grid[data-v-30640deb]{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:var(--space-lg)}.status-content[data-v-30640deb]{display:flex;flex-direction:column;gap:var(--space-md)}.status-item[data-v-30640deb]{display:flex;align-items:center;gap:var(--space-md)}.status-item label[data-v-30640deb]{font-weight:var(--font-semibold);min-width:140px}.hit-rate[data-v-30640deb]{text-align:center}.hit-rate h3[data-v-30640deb]{margin:0 0 var(--space-sm) 0;color:var(--primary-color)}.hit-rate p[data-v-30640deb]{margin:0 0 var(--space-md) 0;color:var(--text-color-secondary);font-size:var(--text-sm)}.queries-list[data-v-30640deb]{list-style:none;padding:0;margin:0}.queries-list li[data-v-30640deb]{padding:var(--space-sm) 0;border-bottom:1px solid var(--surface-border)}.queries-list li[data-v-30640deb]:last-child{border-bottom:none}.average-row[data-v-30640deb]{margin-top:var(--space-md);padding-top:var(--space-md);border-top:2px solid var(--surface-border);text-align:center}.details-list[data-v-30640deb]{list-style:none;padding:0;margin:0}.details-list li[data-v-30640deb]{padding:var(--space-sm) 0;display:flex;justify-content:space-between}.clear-options[data-v-30640deb]{display:flex;flex-direction:column;gap:var(--space-md);margin-top:var(--space-md)}.p-field-radiobutton[data-v-30640deb]{display:flex;align-items:center;gap:var(--space-sm)}.response-times-card[data-v-30640deb]{grid-column:1 / -1}.mobile-layout[data-v-30640deb]{padding:56px 0}.mobile-layout .stats-grid[data-v-30640deb]{padding:var(--space-sm);gap:var(--space-sm);grid-template-columns:1fr}.mobile-sidebar .sidebar-header[data-v-30640deb]{padding:var(--space-md);border-bottom:1px solid var(--surface-border)}.mobile-sidebar .sidebar-title[data-v-30640deb]{font-size:var(--text-lg);font-weight:var(--font-bold);color:var(--color-primary)}.mobile-sidebar .sidebar-menu[data-v-30640deb]{padding:var(--space-sm) 0}.mobile-sidebar .sidebar-item[data-v-30640deb]{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-md) var(--space-lg);color:var(--text-color);text-decoration:none;transition:background-color var(--transition-fast)}.mobile-sidebar .sidebar-item[data-v-30640deb]:hover,.mobile-sidebar .sidebar-item[data-v-30640deb]:active{background:var(--surface-hover)}.mobile-sidebar .sidebar-item.active[data-v-30640deb]{background:var(--blue-50);color:var(--color-primary)}.mobile-sidebar .sidebar-item i[data-v-30640deb]{font-size:var(--text-xl);width:24px;text-align:center}[data-theme=dark] .mobile-sidebar .sidebar-item.active[data-v-30640deb]{background:var(--blue-900);color:var(--blue-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .mobile-sidebar .sidebar-item.active[data-v-30640deb]{background:var(--blue-900);color:var(--blue-400)}}@media (max-width: 768px){.stats-header[data-v-30640deb]{flex-direction:column;align-items:flex-start;gap:var(--space-md)}.stats-grid[data-v-30640deb]{grid-template-columns:1fr}} diff --git a/deploy-package-20260223-151231/frontend/assets/CacheStatsView.BsCa3PTo.js b/deploy-package-20260223-151231/frontend/assets/CacheStatsView.BsCa3PTo.js deleted file mode 100644 index 151710a..0000000 --- a/deploy-package-20260223-151231/frontend/assets/CacheStatsView.BsCa3PTo.js +++ /dev/null @@ -1,2 +0,0 @@ -import{N as Y,c as T,d as b,e as s,m as z,j as w,a as F,o as J,K as X,h as $,i as k,q as o,O as n,P as Z,p as v,u as ee,y as p,v as h}from"./vendor-core.B6UiYhU_.js";import{h as L,u as te,b as ae,c as se}from"./sharedStores.Bb_IRn4Y.js";import{_ as le,u as re,a as ie,b as A,d as x,e as ne}from"./index.B8XI8FQW.js";import{B as oe,g as ue,s as I,d as de,G as ce,H as O,M as P}from"./vendor-primevue.BN-meDW0.js";import{M as pe}from"./MobileTopBar.BnL78WPy.js";import{M as ve}from"./MobileBottomNav.Cp8OR33w.js";import"./vendor-utils.CO3CyGpV.js";import"./vendor-export.BWjBvx7Z.js";const he=Y("cache",{state:()=>({stats:null,loading:!1,error:null}),getters:{isLoading:t=>t.loading,hasError:t=>t.error!==null,cacheEnabled:t=>{var a;return((a=t.stats)==null?void 0:a.enabled)??!1},hitRate:t=>{var a;return((a=t.stats)==null?void 0:a.hit_rate)??0},queriesSaved:t=>{var a;return((a=t.stats)==null?void 0:a.queries_saved)??{today:0,week:0,total:0}},responseTimes:t=>{var a;return((a=t.stats)==null?void 0:a.response_times)??{}},cacheSize:t=>{var a;return((a=t.stats)==null?void 0:a.cache_size)??{memory:0,sqlite:0}}},actions:{async getStats(){var t,a;this.loading=!0,this.error=null;try{const l=await L.get("/cache/stats");return this.stats=l.data,l.data}catch(l){throw this.error=((a=(t=l.response)==null?void 0:t.data)==null?void 0:a.detail)||l.message,l}finally{this.loading=!1}},async invalidateCache(t=null,a=null){var l,i;this.loading=!0,this.error=null;try{return(await L.post("/cache/invalidate",{company_id:t,cache_type:a})).data}catch(m){throw this.error=((i=(l=m.response)==null?void 0:l.data)==null?void 0:i.detail)||m.message,m}finally{this.loading=!1}},async toggleUserCache(t){var a,l;this.loading=!0,this.error=null;try{const i=await L.post("/cache/toggle-user",{enabled:t});return this.stats&&(this.stats.user_enabled=t),i.data}catch(i){throw this.error=((l=(a=i.response)==null?void 0:a.data)==null?void 0:l.detail)||i.message,i}finally{this.loading=!1}},async toggleGlobalCache(t){var a,l;this.loading=!0,this.error=null;try{const i=await L.post("/cache/toggle-global",{enabled:t});return this.stats&&(this.stats.global_enabled=t,this.stats.enabled=t),i.data}catch(i){throw this.error=((l=(a=i.response)==null?void 0:a.data)==null?void 0:l.detail)||i.message,i}finally{this.loading=!1}},async toggleAutoInvalidate(t){var a,l;this.loading=!0,this.error=null;try{const i=await L.post("/cache/toggle-auto-invalidate",{enabled:t});return this.stats&&(this.stats.auto_invalidate=t),i.data}catch(i){throw this.error=((l=(a=i.response)==null?void 0:a.data)==null?void 0:l.detail)||i.message,i}finally{this.loading=!1}},clearError(){this.error=null}}});var me={root:{position:"relative"}},ge={root:function(a){var l=a.instance,i=a.props;return["p-inputswitch p-component",{"p-highlight":l.checked,"p-disabled":i.disabled,"p-invalid":i.invalid}]},input:"p-inputswitch-input",slider:"p-inputswitch-slider"},ye=oe.extend({name:"inputswitch",classes:ge,inlineStyles:me}),fe={name:"BaseInputSwitch",extends:ue,props:{modelValue:{type:null,default:!1},trueValue:{type:null,default:!0},falseValue:{type:null,default:!1},invalid:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},readonly:{type:Boolean,default:!1},tabindex:{type:Number,default:null},inputId:{type:String,default:null},inputClass:{type:[String,Object],default:null},inputStyle:{type:Object,default:null},ariaLabelledby:{type:String,default:null},ariaLabel:{type:String,default:null}},style:ye,provide:function(){return{$parentInstance:this}}},U={name:"InputSwitch",extends:fe,inheritAttrs:!1,emits:["update:modelValue","change","focus","blur"],methods:{getPTOptions:function(a){var l=a==="root"?this.ptmi:this.ptm;return l(a,{context:{checked:this.checked,disabled:this.disabled}})},onChange:function(a){if(!this.disabled&&!this.readonly){var l=this.checked?this.falseValue:this.trueValue;this.$emit("update:modelValue",l),this.$emit("change",a)}},onFocus:function(a){this.$emit("focus",a)},onBlur:function(a){this.$emit("blur",a)}},computed:{checked:function(){return this.modelValue===this.trueValue}}},be=["data-p-highlight","data-p-disabled"],Ce=["id","checked","tabindex","disabled","readonly","aria-checked","aria-labelledby","aria-label","aria-invalid"];function Se(t,a,l,i,m,d){return b(),T("div",z({class:t.cx("root"),style:t.sx("root")},d.getPTOptions("root"),{"data-p-highlight":d.checked,"data-p-disabled":t.disabled}),[s("input",z({id:t.inputId,type:"checkbox",role:"switch",class:[t.cx("input"),t.inputClass],style:t.inputStyle,checked:d.checked,tabindex:t.tabindex,disabled:t.disabled,readonly:t.readonly,"aria-checked":d.checked,"aria-labelledby":t.ariaLabelledby,"aria-label":t.ariaLabel,"aria-invalid":t.invalid||void 0,onFocus:a[0]||(a[0]=function(){return d.onFocus&&d.onFocus.apply(d,arguments)}),onBlur:a[1]||(a[1]=function(){return d.onBlur&&d.onBlur.apply(d,arguments)}),onChange:a[2]||(a[2]=function(){return d.onChange&&d.onChange.apply(d,arguments)})},d.getPTOptions("input")),null,16,Ce),s("span",z({class:t.cx("slider")},d.getPTOptions("slider")),null,16)],16,be)}U.render=Se;const we={key:1,class:"stats-header"},ke={class:"actions"},Be={key:3,class:"stats-grid"},Ve={class:"status-content"},Ee={class:"status-item"},Le={class:"status-item"},Ae={class:"status-item"},Te={class:"hit-rate"},_e={class:"queries-list"},qe={key:0,class:"average-row"},Fe={class:"details-list"},Ie={class:"clear-options"},Oe={class:"p-field-radiobutton"},ze={class:"p-field-radiobutton"},$e={__name:"CacheStatsView",setup(t){const a=Z(),l=he(),i=te();ae();const m=re();se();const d=w(()=>l.isLoading),D=w(()=>l.error),c=w(()=>l.stats),y=F(!0),B=F(!1),V=F("current"),E=F(window.innerWidth<768),R=w(()=>[{icon:"pi pi-refresh",label:"Actualizează",tooltip:"Actualizează statistici"}]),j=u=>{u.icon==="pi pi-refresh"&&q()},N=()=>{E.value=window.innerWidth<768},W=w(()=>{var u;return(u=c.value)!=null&&u.response_times?Object.entries(c.value.response_times).map(([e,r])=>({endpoint:Q(e),cached:r.cached,oracle:r.oracle,improvement:r.improvement})):[]}),_=w(()=>{var f;const u=Object.values(((f=c.value)==null?void 0:f.response_times)||{});if(u.length===0)return null;const e=u.reduce((g,S)=>g+S.cached,0)/u.length,r=u.reduce((g,S)=>g+S.oracle,0)/u.length,C=((r-e)/r*100).toFixed(0);return{cached:e.toFixed(0),oracle:r.toFixed(0),improvement:C}});async function q(){var u;try{await l.getStats(),y.value=((u=c.value)==null?void 0:u.user_enabled)??!0}catch{m.add({severity:"error",summary:"Error",detail:"Failed to load cache statistics",life:3e3})}}async function G(){try{await l.toggleUserCache(y.value),m.add({severity:"success",summary:"Success",detail:`Cache ${y.value?"enabled":"disabled"} for you`,life:3e3})}catch{m.add({severity:"error",summary:"Error",detail:"Failed to toggle cache",life:3e3}),y.value=!y.value}}async function H(){var u;try{const e=V.value==="current"?(u=i.currentCompany)==null?void 0:u.id_firma:null;await l.invalidateCache(e,null),m.add({severity:"success",summary:"Success",detail:"Cache cleared successfully",life:3e3}),B.value=!1,await q()}catch{m.add({severity:"error",summary:"Error",detail:"Failed to clear cache",life:3e3})}}function Q(u){return{schema:"Schema Lookup",dashboard_summary:"Dashboard",dashboard_trends:"Dashboard Trends",companies:"Companies List",invoices:"Invoices",treasury:"Treasury"}[u]||u}function K(){l.clearError()}return J(()=>{window.addEventListener("resize",N),q()}),X(()=>{window.removeEventListener("resize",N)}),(u,e)=>(b(),T("div",{class:ee(["cache-stats-view",{"mobile-layout":E.value}])},[E.value?(b(),$(pe,{key:0,title:"Statistici Cache","show-back":!0,actions:R.value,onBackClick:e[0]||(e[0]=r=>n(a).push("/settings")),onActionClick:j},null,8,["actions"])):k("",!0),E.value?k("",!0):(b(),T("div",we,[e[7]||(e[7]=s("h1",null,"Cache Statistics",-1)),s("div",ke,[o(n(I),{label:"Clear Cache",icon:"pi pi-trash",severity:"danger",onClick:e[1]||(e[1]=r=>B.value=!0),loading:d.value},null,8,["loading"]),o(n(I),{label:"Refresh",icon:"pi pi-refresh",onClick:q,loading:d.value},null,8,["loading"])])])),D.value?(b(),$(n(ie),{key:2,severity:"error",closable:!0,onClose:K},{default:v(()=>[p(h(D.value),1)]),_:1})):k("",!0),!d.value&&c.value?(b(),T("div",Be,[o(n(A),{class:"status-card"},{title:v(()=>[...e[8]||(e[8]=[p("Cache Status",-1)])]),content:v(()=>[s("div",Ve,[s("div",Ee,[e[9]||(e[9]=s("label",null,"Global Status:",-1)),o(n(x),{value:c.value.global_enabled?"ENABLED":"DISABLED",severity:c.value.global_enabled?"success":"danger"},null,8,["value","severity"])]),s("div",Le,[e[10]||(e[10]=s("label",null,"Your Setting:",-1)),o(n(U),{modelValue:y.value,"onUpdate:modelValue":e[2]||(e[2]=r=>y.value=r),onChange:G},null,8,["modelValue"]),s("span",null,h(y.value?"ON":"OFF"),1)]),s("div",Ae,[e[11]||(e[11]=s("label",null,"Auto-Invalidation:",-1)),o(n(x),{value:c.value.auto_invalidate?"ENABLED":"DISABLED",severity:c.value.auto_invalidate?"success":"warning"},null,8,["value","severity"])])])]),_:1}),o(n(A),{class:"metrics-card"},{title:v(()=>[...e[12]||(e[12]=[p("Performance Metrics",-1)])]),content:v(()=>{var r;return[s("div",Te,[s("h3",null,"Hit Rate: "+h((r=c.value.hit_rate)==null?void 0:r.toFixed(1))+"%",1),s("p",null,h(c.value.total_hits)+" hits / "+h(c.value.total_hits+c.value.total_misses)+" total requests ",1),o(n(ne),{value:c.value.hit_rate},null,8,["value"])])]}),_:1}),o(n(A),{class:"queries-card"},{title:v(()=>[...e[13]||(e[13]=[p("Queries Saved",-1)])]),content:v(()=>{var r,C,f,g,S,M;return[s("ul",_e,[s("li",null,[e[14]||(e[14]=p(" Today: ",-1)),s("strong",null,h((C=(r=c.value.queries_saved)==null?void 0:r.today)==null?void 0:C.toLocaleString()),1),e[15]||(e[15]=p(" queries avoided ",-1))]),s("li",null,[e[16]||(e[16]=p(" This week: ",-1)),s("strong",null,h((g=(f=c.value.queries_saved)==null?void 0:f.week)==null?void 0:g.toLocaleString()),1),e[17]||(e[17]=p(" queries avoided ",-1))]),s("li",null,[e[18]||(e[18]=p(" All time: ",-1)),s("strong",null,h((M=(S=c.value.queries_saved)==null?void 0:S.total)==null?void 0:M.toLocaleString()),1),e[19]||(e[19]=p(" queries avoided ",-1))])])]}),_:1}),o(n(A),{class:"response-times-card"},{title:v(()=>[...e[20]||(e[20]=[p("Response Time Comparison",-1)])]),content:v(()=>[o(n(ce),{value:W.value,class:"p-datatable-sm"},{default:v(()=>[o(n(O),{field:"endpoint",header:"Endpoint"}),o(n(O),{field:"cached",header:"With Cache"},{body:v(({data:r})=>[p(h(r.cached)+" ms",1)]),_:1}),o(n(O),{field:"oracle",header:"Without Cache"},{body:v(({data:r})=>[p(h(r.oracle)+" ms",1)]),_:1}),o(n(O),{field:"improvement",header:"Improvement"},{body:v(({data:r})=>[o(n(x),{value:`${r.improvement}% ↓`,severity:"success"},null,8,["value"])]),_:1})]),_:1},8,["value"]),_.value?(b(),T("div",qe,[e[21]||(e[21]=s("strong",null,"Overall Average:",-1)),p(" "+h(_.value.cached)+" ms vs "+h(_.value.oracle)+" ms ("+h(_.value.improvement)+"% faster) ",1)])):k("",!0)]),_:1}),o(n(A),{class:"details-card"},{title:v(()=>[...e[22]||(e[22]=[p("Cache Details",-1)])]),content:v(()=>{var r,C,f,g;return[s("ul",Fe,[s("li",null,[e[23]||(e[23]=p(" Memory entries: ",-1)),s("strong",null,h((C=(r=c.value.cache_size)==null?void 0:r.memory)==null?void 0:C.toLocaleString()),1)]),s("li",null,[e[24]||(e[24]=p(" SQLite entries: ",-1)),s("strong",null,h((g=(f=c.value.cache_size)==null?void 0:f.sqlite)==null?void 0:g.toLocaleString()),1)]),s("li",null,[e[25]||(e[25]=p(" Cache type: ",-1)),s("strong",null,h(c.value.cache_type),1)])])]}),_:1})])):k("",!0),o(n(de),{visible:B.value,"onUpdate:visible":e[6]||(e[6]=r=>B.value=r),header:"Clear Cache",modal:!0,style:{width:"450px"}},{footer:v(()=>[o(n(I),{label:"Cancel",text:"",onClick:e[5]||(e[5]=r=>B.value=!1)}),o(n(I),{label:"Clear",severity:"danger",onClick:H,loading:d.value},null,8,["loading"])]),default:v(()=>[e[28]||(e[28]=s("p",null,"Are you sure you want to clear the cache?",-1)),s("div",Ie,[s("div",Oe,[o(n(P),{id:"clear_all",modelValue:V.value,"onUpdate:modelValue":e[3]||(e[3]=r=>V.value=r),value:"all"},null,8,["modelValue"]),e[26]||(e[26]=s("label",{for:"clear_all"},"All companies",-1))]),s("div",ze,[o(n(P),{id:"clear_current",modelValue:V.value,"onUpdate:modelValue":e[4]||(e[4]=r=>V.value=r),value:"current"},null,8,["modelValue"]),e[27]||(e[27]=s("label",{for:"clear_current"},"Current company only",-1))])])]),_:1},8,["visible"]),E.value?(b(),$(ve,{key:4})):k("",!0)],2))}},We=le($e,[["__scopeId","data-v-30640deb"]]);export{We as default}; -//# sourceMappingURL=CacheStatsView.BsCa3PTo.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/CacheStatsView.BsCa3PTo.js.map b/deploy-package-20260223-151231/frontend/assets/CacheStatsView.BsCa3PTo.js.map deleted file mode 100644 index 01477b3..0000000 --- a/deploy-package-20260223-151231/frontend/assets/CacheStatsView.BsCa3PTo.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"CacheStatsView.BsCa3PTo.js","sources":["../../src/modules/reports/stores/cacheStore.js","../../node_modules/primevue/inputswitch/style/inputswitchstyle.esm.js","../../node_modules/primevue/inputswitch/inputswitch.esm.js","../../src/modules/reports/views/CacheStatsView.vue"],"sourcesContent":["/**\n * Pinia Store pentru Cache Management\n */\nimport { defineStore } from \"pinia\";\nimport api from \"@reports/services/api\";\n\nexport const useCacheStore = defineStore(\"cache\", {\n state: () => ({\n stats: null,\n loading: false,\n error: null,\n }),\n\n getters: {\n isLoading: (state) => state.loading,\n hasError: (state) => state.error !== null,\n cacheEnabled: (state) => state.stats?.enabled ?? false,\n hitRate: (state) => state.stats?.hit_rate ?? 0,\n queriesSaved: (state) =>\n state.stats?.queries_saved ?? { today: 0, week: 0, total: 0 },\n responseTimes: (state) => state.stats?.response_times ?? {},\n cacheSize: (state) => state.stats?.cache_size ?? { memory: 0, sqlite: 0 },\n },\n\n actions: {\n /**\n * Get cache statistics\n */\n async getStats() {\n this.loading = true;\n this.error = null;\n\n try {\n const response = await api.get(\"/cache/stats\");\n this.stats = response.data;\n return response.data;\n } catch (error) {\n this.error = error.response?.data?.detail || error.message;\n throw error;\n } finally {\n this.loading = false;\n }\n },\n\n /**\n * Invalidate cache\n * @param {number|null} companyId - Optional company ID to invalidate\n * @param {string|null} cacheType - Optional cache type to invalidate\n */\n async invalidateCache(companyId = null, cacheType = null) {\n this.loading = true;\n this.error = null;\n\n try {\n const response = await api.post(\"/cache/invalidate\", {\n company_id: companyId,\n cache_type: cacheType,\n });\n\n return response.data;\n } catch (error) {\n this.error = error.response?.data?.detail || error.message;\n throw error;\n } finally {\n this.loading = false;\n }\n },\n\n /**\n * Toggle user cache setting\n * @param {boolean} enabled - Enable or disable cache for current user\n */\n async toggleUserCache(enabled) {\n this.loading = true;\n this.error = null;\n\n try {\n const response = await api.post(\"/cache/toggle-user\", {\n enabled,\n });\n\n // Update local stats\n if (this.stats) {\n this.stats.user_enabled = enabled;\n }\n\n return response.data;\n } catch (error) {\n this.error = error.response?.data?.detail || error.message;\n throw error;\n } finally {\n this.loading = false;\n }\n },\n\n /**\n * Toggle global cache (admin only)\n * @param {boolean} enabled - Enable or disable cache globally\n */\n async toggleGlobalCache(enabled) {\n this.loading = true;\n this.error = null;\n\n try {\n const response = await api.post(\"/cache/toggle-global\", {\n enabled,\n });\n\n // Update local stats\n if (this.stats) {\n this.stats.global_enabled = enabled;\n this.stats.enabled = enabled;\n }\n\n return response.data;\n } catch (error) {\n this.error = error.response?.data?.detail || error.message;\n throw error;\n } finally {\n this.loading = false;\n }\n },\n\n /**\n * Toggle auto-invalidation monitoring\n * @param {boolean} enabled - Enable or disable auto-invalidation\n */\n async toggleAutoInvalidate(enabled) {\n this.loading = true;\n this.error = null;\n\n try {\n const response = await api.post(\n \"/cache/toggle-auto-invalidate\",\n { enabled },\n );\n\n // Update local stats\n if (this.stats) {\n this.stats.auto_invalidate = enabled;\n }\n\n return response.data;\n } catch (error) {\n this.error = error.response?.data?.detail || error.message;\n throw error;\n } finally {\n this.loading = false;\n }\n },\n\n /**\n * Clear error state\n */\n clearError() {\n this.error = null;\n },\n },\n});\n","import BaseStyle from 'primevue/base/style';\n\nvar inlineStyles = {\n root: {\n position: 'relative'\n }\n};\nvar classes = {\n root: function root(_ref) {\n var instance = _ref.instance,\n props = _ref.props;\n return ['p-inputswitch p-component', {\n 'p-highlight': instance.checked,\n 'p-disabled': props.disabled,\n 'p-invalid': props.invalid\n }];\n },\n input: 'p-inputswitch-input',\n slider: 'p-inputswitch-slider'\n};\nvar InputSwitchStyle = BaseStyle.extend({\n name: 'inputswitch',\n classes: classes,\n inlineStyles: inlineStyles\n});\n\nexport { InputSwitchStyle as default };\n","import BaseComponent from 'primevue/basecomponent';\nimport InputSwitchStyle from 'primevue/inputswitch/style';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode } from 'vue';\n\nvar script$1 = {\n name: 'BaseInputSwitch',\n \"extends\": BaseComponent,\n props: {\n modelValue: {\n type: null,\n \"default\": false\n },\n trueValue: {\n type: null,\n \"default\": true\n },\n falseValue: {\n type: null,\n \"default\": false\n },\n invalid: {\n type: Boolean,\n \"default\": false\n },\n disabled: {\n type: Boolean,\n \"default\": false\n },\n readonly: {\n type: Boolean,\n \"default\": false\n },\n tabindex: {\n type: Number,\n \"default\": null\n },\n inputId: {\n type: String,\n \"default\": null\n },\n inputClass: {\n type: [String, Object],\n \"default\": null\n },\n inputStyle: {\n type: Object,\n \"default\": null\n },\n ariaLabelledby: {\n type: String,\n \"default\": null\n },\n ariaLabel: {\n type: String,\n \"default\": null\n }\n },\n style: InputSwitchStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script = {\n name: 'InputSwitch',\n \"extends\": script$1,\n inheritAttrs: false,\n emits: ['update:modelValue', 'change', 'focus', 'blur'],\n methods: {\n getPTOptions: function getPTOptions(key) {\n var _ptm = key === 'root' ? this.ptmi : this.ptm;\n return _ptm(key, {\n context: {\n checked: this.checked,\n disabled: this.disabled\n }\n });\n },\n onChange: function onChange(event) {\n if (!this.disabled && !this.readonly) {\n var newValue = this.checked ? this.falseValue : this.trueValue;\n this.$emit('update:modelValue', newValue);\n this.$emit('change', event);\n }\n },\n onFocus: function onFocus(event) {\n this.$emit('focus', event);\n },\n onBlur: function onBlur(event) {\n this.$emit('blur', event);\n }\n },\n computed: {\n checked: function checked() {\n return this.modelValue === this.trueValue;\n }\n }\n};\n\nvar _hoisted_1 = [\"data-p-highlight\", \"data-p-disabled\"];\nvar _hoisted_2 = [\"id\", \"checked\", \"tabindex\", \"disabled\", \"readonly\", \"aria-checked\", \"aria-labelledby\", \"aria-label\", \"aria-invalid\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"div\", mergeProps({\n \"class\": _ctx.cx('root'),\n style: _ctx.sx('root')\n }, $options.getPTOptions('root'), {\n \"data-p-highlight\": $options.checked,\n \"data-p-disabled\": _ctx.disabled\n }), [createElementVNode(\"input\", mergeProps({\n id: _ctx.inputId,\n type: \"checkbox\",\n role: \"switch\",\n \"class\": [_ctx.cx('input'), _ctx.inputClass],\n style: _ctx.inputStyle,\n checked: $options.checked,\n tabindex: _ctx.tabindex,\n disabled: _ctx.disabled,\n readonly: _ctx.readonly,\n \"aria-checked\": $options.checked,\n \"aria-labelledby\": _ctx.ariaLabelledby,\n \"aria-label\": _ctx.ariaLabel,\n \"aria-invalid\": _ctx.invalid || undefined,\n onFocus: _cache[0] || (_cache[0] = function () {\n return $options.onFocus && $options.onFocus.apply($options, arguments);\n }),\n onBlur: _cache[1] || (_cache[1] = function () {\n return $options.onBlur && $options.onBlur.apply($options, arguments);\n }),\n onChange: _cache[2] || (_cache[2] = function () {\n return $options.onChange && $options.onChange.apply($options, arguments);\n })\n }, $options.getPTOptions('input')), null, 16, _hoisted_2), createElementVNode(\"span\", mergeProps({\n \"class\": _ctx.cx('slider')\n }, $options.getPTOptions('slider')), null, 16)], 16, _hoisted_1);\n}\n\nscript.render = render;\n\nexport { script as default };\n","\n\n\n\n\n"],"names":["useCacheStore","defineStore","state","_a","response","api","error","_b","companyId","cacheType","enabled","inlineStyles","classes","_ref","instance","props","InputSwitchStyle","BaseStyle","script$1","BaseComponent","script","key","_ptm","event","newValue","_hoisted_1","_hoisted_2","render","_ctx","_cache","$props","$setup","$data","$options","openBlock","createElementBlock","mergeProps","createElementVNode","router","useRouter","cacheStore","companyStore","useCompanyStore","useAccountingPeriodStore","toast","useToast","useAuthStore","loading","computed","stats","userCacheEnabled","ref","showClearDialog","clearScope","isMobile","mobileTopBarActions","handleTopBarAction","action","loadStats","handleResize","responseTimesTable","data","formatEndpointName","overallAvg","times","avgCached","sum","t","avgOracle","improvement","toggleUserCache","clearCache","clearError","onMounted","onUnmounted","_createElementBlock","_normalizeClass","_createBlock","MobileTopBar","$event","_unref","_openBlock","_createElementVNode","_createVNode","Button","Message","_hoisted_3","Card","_hoisted_4","_hoisted_5","Tag","_hoisted_6","InputSwitch","_hoisted_7","_hoisted_8","_toDisplayString","ProgressBar","_hoisted_9","_d","_c","_f","_e","DataTable","Column","_withCtx","_hoisted_10","_createTextVNode","_hoisted_11","Dialog","_hoisted_12","_hoisted_13","RadioButton","_hoisted_14","MobileBottomNav"],"mappings":"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","x_google_ignoreList":[1,2]} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/CashView.1l8cukfk.js b/deploy-package-20260223-151231/frontend/assets/CashView.1l8cukfk.js deleted file mode 100644 index 333d887..0000000 --- a/deploy-package-20260223-151231/frontend/assets/CashView.1l8cukfk.js +++ /dev/null @@ -1,3 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/sharedStores.Bb_IRn4Y.js","assets/index.B8XI8FQW.js","assets/vendor-core.B6UiYhU_.js","assets/vendor-primevue.BN-meDW0.js","assets/vendor-utils.CO3CyGpV.js","assets/vendor-export.BWjBvx7Z.js","assets/index.Co2Dp57K.css"])))=>i.map(i=>d[i]); -import{_ as te}from"./vendor-export.BWjBvx7Z.js";import{_ as be,u as Ce,s as we}from"./index.B8XI8FQW.js";import{e as he,u as ke,b as Se,c as Ae}from"./sharedStores.Bb_IRn4Y.js";import{b as xe,e as Te}from"./exportUtils.BtGzMnqV.js";import{M as Ve}from"./MobileTopBar.BnL78WPy.js";import{M as Pe}from"./MobileBottomNav.Cp8OR33w.js";import{B as Ne}from"./BottomSheet.WKuCIyuZ.js";import{M as De}from"./MobileDrawerMenu.DJ_STPbv.js";import{s as Fe}from"./splitbutton.esm.DvALhxoC.js";import{a as b,j as M,w as j,o as Ee,K as Le,c as m,h as x,i as f,q as i,e as t,O as o,p as y,y as P,k as T,v as d,u as F,P as Ie,d as n,F as U,B as Re}from"./vendor-core.B6UiYhU_.js";import{g as ze}from"./vendor-utils.CO3CyGpV.js";import"./vendor-primevue.BN-meDW0.js";const Be={class:"bottom-sheet-filters"},Me={class:"form-group"},Ue={class:"form-group"},$e={class:"form-group"},Oe={class:"bottom-sheet-actions"},Xe={class:"register-view"},We={key:0,class:"page-header"},je={class:"company-selection"},qe={key:2,class:"mobile-totals-bar"},Ke={class:"mobile-totals-grid"},Ge={class:"total-item"},He={class:"total-value"},Je={class:"total-item"},Qe={class:"total-value incasari"},Ye={class:"total-item"},Ze={class:"total-value plati"},ea={class:"total-item"},aa={class:"total-value"},ta={class:"form"},sa={class:"form-row"},la={class:"form-col"},oa={class:"form-group"},ra={class:"form-col"},ia={class:"form-group"},na={class:"form-col"},ua={class:"form-group"},ca={class:"form-actions"},da={key:4,class:"summary-stats-inline"},pa={class:"stat-item"},ma={class:"stat-item"},va={class:"stat-value incasari"},fa={class:"stat-item"},ya={class:"stat-value plati"},ga={class:"stat-item"},_a={key:0,class:"mobile-card-list"},ba={class:"card-header"},Ca={class:"card-row"},wa={class:"card-meta"},ha={key:0,class:"mobile-empty"},ka={class:"loading-state"},Sa={key:0,class:"numeric-value"},Aa={key:1,class:"numeric-value zero"},xa={key:0,class:"numeric-value"},Ta={key:1,class:"numeric-value zero"},Va={__name:"CashView",setup(Pa){var ae;const g=Ce(),se=Ie(),u=he(),r=ke(),w=Se(),N=Ae(),E=b(((ae=r.selectedCompany)==null?void 0:ae.id_firma)||null),_=b(window.innerWidth<768),k=b(!1),$=b(!1),le=async()=>{await N.logout(),se.push("/login")},oe=async a=>{var e;await r.loadCompanies(),(e=r.selectedCompany)!=null&&e.id_firma&&await w.loadPeriods(r.selectedCompany.id_firma)},re=M(()=>[{icon:"pi pi-filter",label:"Filtre",tooltip:"Filtre",active:fe.value},{icon:"pi pi-filter-slash",label:"Resetează",tooltip:"Resetează Filtrele"},{icon:"pi pi-download",label:"Export",tooltip:"Export"}]),q=b(null),ie=b([{label:"Export PDF",icon:"pi pi-file-pdf",command:()=>X()},{label:"Export XLSX",icon:"pi pi-file-excel",command:()=>ee()}]),ne=b([{label:"Export PDF",icon:"pi pi-file-pdf",command:()=>X()},{label:"Export XLSX",icon:"pi pi-file-excel",command:()=>ee()}]),ue=(a,e)=>{a.icon==="pi pi-filter"?k.value=!k.value:a.icon==="pi pi-filter-slash"?O():a.icon==="pi pi-download"&&q.value.toggle(e)},K=()=>{_.value=window.innerWidth<768,_.value||(k.value=!1)},G=[{label:"Casă LEI",value:"CASA_LEI"},{label:"Casă Valută",value:"CASA_VALUTA"}],l=b({registerType:"CASA_LEI",partnerName:"",bankAccount:null}),S=b([]),A=b({page:0,rows:50}),L=(a,e="RON")=>a?new Intl.NumberFormat("ro-RO",{style:"currency",currency:e}).format(a):"0,00 "+e,V=a=>a==null?"":new Intl.NumberFormat("ro-RO",{minimumFractionDigits:2,maximumFractionDigits:2}).format(a),H=a=>a?ze(new Date(a),"dd.MM.yyyy"):"",ce=a=>{if(!a)return"";const e=new Date(a);return`${String(e.getDate()).padStart(2,"0")}/${String(e.getMonth()+1).padStart(2,"0")}`},I=a=>a?Math.abs(a)>=1e4?new Intl.NumberFormat("ro-RO",{maximumFractionDigits:0}).format(a):new Intl.NumberFormat("ro-RO",{minimumFractionDigits:2,maximumFractionDigits:2}).format(a):"0",J=(a,e=100)=>a?a.length<=e?a:a.substring(0,e)+"...":"",Q=M(()=>l.value.registerType==="CASA_VALUTA"),de=a=>a?a.replace(/[ăâ]/gi,e=>e===e.toLowerCase()?"a":"A").replace(/[îâ]/gi,e=>e===e.toLowerCase()?"i":"I").replace(/[ș]/gi,e=>e===e.toLowerCase()?"s":"S").replace(/[ț]/gi,e=>e===e.toLowerCase()?"t":"T").replace(/[Ă]/g,"A").replace(/[Â]/g,"A").replace(/[Î]/g,"I").replace(/[Ș]/g,"S").replace(/[Ț]/g,"T"):"",pe=a=>({CASA_LEI:"Registrul de Casa LEI",CASA_VALUTA:"Registrul de Casa Valuta"})[a]||"Registrul de Casa",R=async()=>{if(!r.selectedCompany||!l.value.registerType){S.value=[];return}try{const e=await(await te(async()=>{const{default:p}=await import("./sharedStores.Bb_IRn4Y.js").then(c=>c.i);return{default:p}},__vite__mapDeps([0,1,2,3,4,5,6]))).default.get("/treasury/bank-cash-accounts",{params:{company:r.selectedCompany.id_firma,register_type:l.value.registerType}});S.value=e.data||[]}catch(a){console.error("Failed to load cash accounts:",a),S.value=[]}};j(()=>l.value.registerType,async()=>{l.value.bankAccount=null,await R()});const me=a=>"cash-row",ve=async a=>{A.value.page=a.page,A.value.rows=a.rows,await h()},O=async()=>{l.value={registerType:"CASA_LEI",partnerName:"",bankAccount:null},A.value.page=0,await R(),await h()},z=M(()=>u.registers.length>0),fe=M(()=>l.value.registerType!=="CASA_LEI"||l.value.partnerName!==""||l.value.bankAccount!==null),ye=async()=>{if(!E.value)return;const a=r.getCompanyById(E.value);a&&(r.setSelectedCompany(a),await h())},B=async()=>{A.value.page=0,await h()},Y=(()=>{let a;return()=>{clearTimeout(a),a=setTimeout(async()=>{A.value.page=0,await h()},500)}})(),ge=async()=>{await h(),g.add({severity:"success",summary:"Actualizare reușită",detail:"Registrul a fost actualizat cu succes",life:3e3})},Z=async()=>{if(!r.selectedCompany)return[];if(!w.selectedPeriod)return[];try{const{luna:a,an:e}=w.selectedPeriod,p={company:r.selectedCompany.id_firma,page:1,page_size:999999,luna:a,an:e};return l.value.registerType&&(p.register_type=l.value.registerType),l.value.partnerName&&(p.partner_name=l.value.partnerName),l.value.bankAccount&&(p.bank_account=l.value.bankAccount),(await(await te(async()=>{const{default:D}=await import("./sharedStores.Bb_IRn4Y.js").then(W=>W.i);return{default:D}},__vite__mapDeps([0,1,2,3,4,5,6]))).default.get("/treasury/bank-cash-register",{params:p})).data.registers||[]}catch(a){return console.error("Failed to fetch all data:",a),[]}},ee=async()=>{if(!z.value){g.add({severity:"warn",summary:"Nu există date",detail:"Nu există înregistrări de exportat",life:3e3});return}g.add({severity:"info",summary:"Se pregătește exportul",detail:"Se încarcă toate datele...",life:2e3});const a=await Z();if(a.length===0){g.add({severity:"error",summary:"Eroare",detail:"Nu s-au putut prelua datele pentru export",life:3e3});return}const e=a.map(c=>{const v={Data:c.dataact?H(c.dataact):"","Nr.":c.nract||""};return v.Casa=c.nume_cont_bancar||"",v.Partener=c.nume||"",Q.value&&(v.Valuta=c.valuta||""),v.Încasări=parseFloat(c.incasari)||0,v.Plăți=parseFloat(c.plati)||0,v["Sold Cumulat"]=parseFloat(c.sold)||0,v.Explicație=J(c.explicatia,100),v});Te(e,`registru_casa_${r.selectedCompany.name.replace(/\s+/g,"_")}`,"Registru Casă").success?g.add({severity:"success",summary:"Export reușit",detail:`${a.length} înregistrări exportate cu succes`,life:3e3}):g.add({severity:"error",summary:"Eroare la export",detail:"Nu s-a putut genera fișierul Excel",life:3e3})},X=async()=>{var c;if(!z.value){g.add({severity:"warn",summary:"Nu există date",detail:"Nu există înregistrări de exportat",life:3e3});return}g.add({severity:"info",summary:"Se pregătește exportul",detail:"Se încarcă toate datele...",life:2e3});const a=await Z();if(a.length===0){g.add({severity:"error",summary:"Eroare",detail:"Nu s-au putut prelua datele pentru export",life:3e3});return}const e=pe(l.value.registerType);xe(a,{companyName:de(((c=r.selectedCompany)==null?void 0:c.name)||""),title:e,luna:u.accountingPeriod.luna,an:u.accountingPeriod.an,isBanca:!1},`registru-casa-${r.selectedCompany.name.replace(/\s+/g,"-")}`).success?g.add({severity:"success",summary:"Export reușit",detail:`${a.length} înregistrări exportate cu succes`,life:3e3}):g.add({severity:"error",summary:"Eroare la export",detail:"Nu s-a putut genera fișierul PDF",life:3e3})},h=async()=>{if(!r.selectedCompany||!w.selectedPeriod)return;u.setPagination(A.value);const{luna:a,an:e}=w.selectedPeriod,p={partner_name:l.value.partnerName||void 0,register_type:l.value.registerType||void 0,bank_account:l.value.bankAccount||void 0,luna:a,an:e};await u.loadBankCashRegister(r.selectedCompany.id_firma,p)};return Ee(async()=>{window.addEventListener("resize",K),r.hasCompanies||await r.loadCompanies(),r.selectedCompany&&await R()}),Le(()=>{window.removeEventListener("resize",K)}),j(()=>r.selectedCompany,async a=>{a&&w.selectedPeriod&&(await R(),await h())}),j(()=>w.selectedPeriod,async a=>{a&&r.selectedCompany&&await h()},{immediate:!0}),(a,e)=>{const p=T("Dropdown"),c=T("InputText"),v=T("Button"),D=T("Card"),W=T("ProgressSpinner"),C=T("Column"),_e=T("DataTable");return n(),m("div",{class:F(["app-container",{"mobile-layout":_.value}])},[_.value?(n(),x(Ve,{key:0,title:"Casă","show-menu":!0,actions:re.value,onMenuClick:e[0]||(e[0]=s=>$.value=!0),onActionClick:ue},null,8,["actions"])):f("",!0),i(o(we),{ref_key:"exportMenu",ref:q,model:ie.value,popup:!0},null,8,["model"]),i(De,{modelValue:$.value,"onUpdate:modelValue":e[1]||(e[1]=s=>$.value=s),user:o(N).user,"companies-store":o(r),"period-store":o(w),"available-servers":o(N).availableServers,"current-server-id":o(N).selectedServerId,"auth-store":o(N),onLogout:le,onServerSwitched:oe},null,8,["modelValue","user","companies-store","period-store","available-servers","current-server-id","auth-store"]),i(Ne,{modelValue:k.value,"onUpdate:modelValue":e[7]||(e[7]=s=>k.value=s)},{default:y(()=>[e[15]||(e[15]=t("h3",{class:"bottom-sheet-title"},"Filtre",-1)),t("div",Be,[t("div",Me,[e[12]||(e[12]=t("label",{class:"form-label"},"Tip Registru",-1)),i(p,{modelValue:l.value.registerType,"onUpdate:modelValue":e[2]||(e[2]=s=>l.value.registerType=s),options:G,"option-label":"label","option-value":"value",placeholder:"Selectați tipul",class:"w-full",onChange:B},null,8,["modelValue"])]),t("div",Ue,[e[13]||(e[13]=t("label",{class:"form-label"},"Casa",-1)),i(p,{modelValue:l.value.bankAccount,"onUpdate:modelValue":e[3]||(e[3]=s=>l.value.bankAccount=s),options:S.value,placeholder:"Toate casele",showClear:!0,class:"w-full",onChange:B,disabled:!l.value.registerType||S.value.length===0},null,8,["modelValue","options","disabled"])]),t("div",$e,[e[14]||(e[14]=t("label",{class:"form-label"},"Căutare Partener",-1)),i(c,{modelValue:l.value.partnerName,"onUpdate:modelValue":e[4]||(e[4]=s=>l.value.partnerName=s),placeholder:"Nume partener...",class:"w-full",onInput:o(Y)},null,8,["modelValue","onInput"])]),t("div",Oe,[i(v,{icon:"pi pi-filter-slash",label:"Resetează",class:"p-button-outlined p-button-secondary",onClick:e[5]||(e[5]=s=>{O(),k.value=!1})}),i(v,{icon:"pi pi-check",label:"Aplică",onClick:e[6]||(e[6]=s=>k.value=!1)})])])]),_:1},8,["modelValue"]),t("div",Xe,[_.value?f("",!0):(n(),m("div",We,[...e[16]||(e[16]=[t("h1",{class:"page-title"},[t("i",{class:"pi pi-wallet"}),P(" Registru Casă ")],-1)])])),o(r).selectedCompany?f("",!0):(n(),x(D,{key:1,class:"company-selection-card"},{content:y(()=>[t("div",je,[e[17]||(e[17]=t("p",{class:"text-color-secondary mb-3"}," Selectați o companie pentru a vizualiza registrul de casă: ",-1)),i(p,{modelValue:E.value,"onUpdate:modelValue":e[8]||(e[8]=s=>E.value=s),options:o(r).companyListFormatted,"option-label":"displayName","option-value":"id_firma",placeholder:"Alegeți compania",class:"w-full",onChange:ye},null,8,["modelValue","options"])])]),_:1})),_.value&&o(r).selectedCompany&&z.value?(n(),m("div",qe,[t("div",Ke,[t("div",Ge,[e[18]||(e[18]=t("span",{class:"total-label"},"Sold Prec:",-1)),t("span",He,d(I(o(u).totals.sold_precedent_all)),1)]),t("div",Je,[e[19]||(e[19]=t("span",{class:"total-label"},"Încasări:",-1)),t("span",Qe,d(I(o(u).totals.total_incasari_all)),1)]),t("div",Ye,[e[20]||(e[20]=t("span",{class:"total-label"},"Plăți:",-1)),t("span",Ze,d(I(o(u).totals.total_plati_all)),1)]),t("div",ea,[e[21]||(e[21]=t("span",{class:"total-label"},"Sold Final:",-1)),t("span",aa,d(I(o(u).totals.sold_final_all)),1)])])])):f("",!0),o(r).selectedCompany&&!_.value?(n(),x(D,{key:3,class:"filters-card"},{content:y(()=>[t("div",ta,[t("div",sa,[t("div",la,[t("div",oa,[e[22]||(e[22]=t("label",{class:"form-label"},"Tip Registru",-1)),i(p,{modelValue:l.value.registerType,"onUpdate:modelValue":e[9]||(e[9]=s=>l.value.registerType=s),options:G,"option-label":"label","option-value":"value",placeholder:"Selectați tipul",class:"w-full",onChange:B},null,8,["modelValue"])])]),t("div",ra,[t("div",ia,[e[23]||(e[23]=t("label",{class:"form-label"},"Casa",-1)),i(p,{modelValue:l.value.bankAccount,"onUpdate:modelValue":e[10]||(e[10]=s=>l.value.bankAccount=s),options:S.value,placeholder:"Toate casele",showClear:!0,class:"w-full",onChange:B,disabled:!l.value.registerType||S.value.length===0},null,8,["modelValue","options","disabled"])])]),t("div",na,[t("div",ua,[e[24]||(e[24]=t("label",{class:"form-label"},"Căutare Partener",-1)),i(c,{modelValue:l.value.partnerName,"onUpdate:modelValue":e[11]||(e[11]=s=>l.value.partnerName=s),placeholder:"Nume partener...",class:"w-full",onInput:o(Y)},null,8,["modelValue","onInput"])])])]),t("div",ca,[i(v,{icon:"pi pi-filter-slash",label:"Resetează Filtre",class:"p-button-outlined p-button-secondary",onClick:O}),i(o(Fe),{label:"Export",icon:"pi pi-download",model:ne.value,onClick:X,class:"p-button-outlined",disabled:!z.value},null,8,["model","disabled"]),i(v,{icon:"pi pi-refresh",label:"Actualizează",loading:o(u).isLoading,onClick:ge},null,8,["loading"])])])]),_:1})):f("",!0),!_.value&&o(r).selectedCompany?(n(),m("div",da,[t("div",pa,[e[25]||(e[25]=t("span",{class:"stat-label"},"Sold Precedent:",-1)),t("span",{class:F(["stat-value",o(u).totals.sold_precedent_all>=0?"incasari":"plati"])},d(L(o(u).totals.sold_precedent_all)),3)]),t("div",ma,[e[26]||(e[26]=t("span",{class:"stat-label"},"Încasări:",-1)),t("span",va,d(L(o(u).totals.total_incasari_all)),1)]),t("div",fa,[e[27]||(e[27]=t("span",{class:"stat-label"},"Plăți:",-1)),t("span",ya,d(L(o(u).totals.total_plati_all)),1)]),t("div",ga,[e[28]||(e[28]=t("span",{class:"stat-label"},"Sold Final:",-1)),t("span",{class:F(["stat-value",o(u).totals.sold_final_all>=0?"incasari":"plati"])},d(L(o(u).totals.sold_final_all)),3)])])):f("",!0),o(r).selectedCompany?(n(),x(D,{key:5,class:"data-card"},{content:y(()=>[_.value?(n(),m("div",_a,[(n(!0),m(U,null,Re(o(u).registers,s=>(n(),m("div",{key:`${s.dataact}-${s.nract}`,class:"mobile-data-card"},[t("div",ba,d(s.nume||"Fără partener"),1),t("div",Ca,[t("span",wa,d(ce(s.dataact))+" · "+d(s.nume_cont_bancar),1),t("span",{class:F(["card-amount",s.incasari>0?"positive":s.plati>0?"negative":""])},[s.incasari>0?(n(),m(U,{key:0},[P("+"+d(V(s.incasari)),1)],64)):s.plati>0?(n(),m(U,{key:1},[P("-"+d(V(s.plati)),1)],64)):(n(),m(U,{key:2},[P(d(V(0)),1)],64))],2)])]))),128)),o(u).registers.length===0?(n(),m("div",ha,[...e[29]||(e[29]=[t("i",{class:"pi pi-info-circle"},null,-1),t("p",null,"Nu au fost găsite înregistrări",-1)])])):f("",!0)])):f("",!0),_.value?f("",!0):(n(),x(_e,{key:1,value:o(u).registers,loading:o(u).isLoading,paginator:!0,rows:A.value.rows,"total-records":o(u).pagination.totalRecords,lazy:!0,"striped-rows":!0,"paginator-template":"FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink CurrentPageReport RowsPerPageDropdown","rows-per-page-options":[25,50,100],"current-page-report-template":"Afișare {first} - {last} din {totalRecords} înregistrări","responsive-layout":"scroll",onPage:ve,class:"p-datatable-sm",rowClass:me},{empty:y(()=>[...e[30]||(e[30]=[t("div",{class:"table-empty"},[t("i",{class:"pi pi-info-circle table-empty-icon"}),t("p",{class:"table-empty-message"}," Nu au fost găsite înregistrări ")],-1)])]),loading:y(()=>[t("div",ka,[i(W),e[31]||(e[31]=t("p",null,"Se încarcă registrul...",-1))])]),default:y(()=>[i(C,{field:"dataact",header:"Data",sortable:"",class:"col-data"},{body:y(s=>[P(d(H(s.data.dataact)),1)]),_:1}),i(C,{field:"nract",header:"Nr.",sortable:"",class:"col-nr"}),i(C,{field:"nume_cont_bancar",header:"Casa",sortable:"",class:"col-cont"}),i(C,{field:"nume",header:"Partener",sortable:"",class:"col-partener"}),Q.value?(n(),x(C,{key:0,field:"valuta",header:"Valuta",sortable:"",class:"col-valuta"})):f("",!0),i(C,{field:"incasari",header:"Încasări",sortable:"",class:"col-numeric"},{body:y(s=>[s.data.incasari>0?(n(),m("span",Sa,d(V(s.data.incasari)),1)):(n(),m("span",Aa,"0,00"))]),_:1}),i(C,{field:"plati",header:"Plăți",sortable:"",class:"col-numeric"},{body:y(s=>[s.data.plati>0?(n(),m("span",xa,d(V(s.data.plati)),1)):(n(),m("span",Ta,"0,00"))]),_:1}),i(C,{field:"sold",header:"Sold Cumulat",sortable:"",class:"col-numeric col-sold"},{body:y(s=>[t("span",{class:F(["numeric-value",{negative:s.data.sold<0}])},d(V(s.data.sold)),3)]),_:1}),i(C,{field:"explicatia",header:"Explicație",class:"col-explicatie"},{body:y(s=>[P(d(J(s.data.explicatia,100)),1)]),_:1})]),_:1},8,["value","loading","rows","total-records"]))]),_:1})):f("",!0)]),_.value?(n(),x(Pe,{key:1})):f("",!0)],2)}}},Oa=be(Va,[["__scopeId","data-v-ee872202"]]);export{Oa as default}; -//# sourceMappingURL=CashView.1l8cukfk.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/CashView.1l8cukfk.js.map b/deploy-package-20260223-151231/frontend/assets/CashView.1l8cukfk.js.map deleted file mode 100644 index de86e26..0000000 --- a/deploy-package-20260223-151231/frontend/assets/CashView.1l8cukfk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"mappings":"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","names":["toast","useToast","router","useRouter","treasuryStore","useTreasuryStore","companyStore","useCompanyStore","periodStore","useAccountingPeriodStore","authStore","useAuthStore","selectedCompanyId","ref","_a","isMobile","showFilters","showDrawer","handleLogout","handleServerSwitched","newServerId","mobileTopBarActions","computed","hasActiveFilters","exportMenu","exportMenuItems","exportPDF","exportExcel","desktopExportItems","handleTopBarAction","action","event","resetFilters","handleResize","registerTypeOptions","filters","bankAccountOptions","pagination","formatCurrency","amount","currency","formatNumber","formatDate","dateString","format","formatDateShort","date","formatCompact","truncateText","text","maxLength","isValutaType","removeDiacritics","match","getPdfTitle","type","loadBankAccounts","response","__vitePreload","__vite_default__","n","error","watch","getRowClass","data","onPage","loadData","hasData","handleCompanyChange","company","handleFilterChange","handleSearchChange","timeout","refreshData","fetchAllData","luna","an","params","allData","exportData","row","baseData","exportToExcel","pdfTitle","exportBankCashRegisterPDF","filterParams","onMounted","onUnmounted","newCompany","newPeriod","_createElementBlock","_normalizeClass","_createBlock","MobileTopBar","_createVNode","_unref","Menu","MobileDrawerMenu","$event","BottomSheet","_cache","_createElementVNode","_hoisted_1","_hoisted_2","_component_Dropdown","_hoisted_3","_hoisted_4","_component_InputText","_hoisted_5","_component_Button","_hoisted_6","_openBlock","_hoisted_7","_component_Card","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_toDisplayString","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","SplitButton","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_Fragment","_renderList","reg","_hoisted_36","_hoisted_37","_hoisted_38","_createTextVNode","_hoisted_39","_component_DataTable","_hoisted_40","_component_ProgressSpinner","_component_Column","_withCtx","slotProps","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","MobileBottomNav"],"ignoreList":[],"sources":["../../src/modules/reports/views/CashView.vue"],"sourcesContent":["\n\n\n\n\n"],"file":"assets/CashView.1l8cukfk.js"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/CashView.BBPiz9js.css b/deploy-package-20260223-151231/frontend/assets/CashView.BBPiz9js.css deleted file mode 100644 index e8644f9..0000000 --- a/deploy-package-20260223-151231/frontend/assets/CashView.BBPiz9js.css +++ /dev/null @@ -1 +0,0 @@ -.register-view[data-v-ee872202]{max-width:1400px;margin:0 auto;padding:var(--space-xl)}.mobile-layout .register-view[data-v-ee872202]{padding-top:calc(56px + var(--space-md));padding-bottom:calc(56px + var(--space-md));padding-left:var(--space-md);padding-right:var(--space-md)}.company-selection-card[data-v-ee872202],.filters-card[data-v-ee872202],.data-card[data-v-ee872202]{margin-bottom:var(--space-md)}.numeric-value[data-v-ee872202]{display:block;text-align:right;font-variant-numeric:tabular-nums;font-family:var(--font-mono, "Roboto Mono", "Consolas", monospace)}.numeric-value.zero[data-v-ee872202]{color:var(--color-text-muted)}.numeric-value.negative[data-v-ee872202]{color:var(--color-error)}.mobile-totals-bar[data-v-ee872202]{background:var(--surface-card);border:1px solid var(--surface-border);padding:var(--space-sm) var(--space-md);margin-bottom:var(--space-md);border-radius:var(--radius-md)}.mobile-totals-grid[data-v-ee872202]{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--space-xs) var(--space-md)}.mobile-totals-bar .total-item[data-v-ee872202]{display:flex;justify-content:space-between;align-items:center}.mobile-totals-bar .total-label[data-v-ee872202]{font-size:var(--text-xs);color:var(--text-color-secondary);font-weight:var(--font-medium)}.mobile-totals-bar .total-value[data-v-ee872202]{font-size:var(--text-sm);font-weight:var(--font-bold);color:var(--text-color)}.mobile-totals-bar .total-value.incasari[data-v-ee872202]{color:var(--green-600)}.mobile-totals-bar .total-value.plati[data-v-ee872202]{color:var(--red-600)}.mobile-card-list[data-v-ee872202]{display:flex;flex-direction:column;gap:var(--space-sm)}.mobile-data-card[data-v-ee872202]{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-md);padding:var(--space-md)}.mobile-data-card .card-header[data-v-ee872202]{font-weight:var(--font-semibold);color:var(--text-color);margin-bottom:var(--space-xs);font-size:var(--text-base)}.mobile-data-card .card-row[data-v-ee872202]{display:flex;justify-content:space-between;align-items:center;font-size:var(--text-sm);color:var(--text-color-secondary)}.mobile-data-card .card-meta[data-v-ee872202]{font-size:var(--text-xs);color:var(--text-color-secondary)}.mobile-data-card .card-amount[data-v-ee872202]{font-weight:var(--font-semibold);color:var(--text-color);font-variant-numeric:tabular-nums}.mobile-data-card .card-amount.positive[data-v-ee872202]{color:var(--green-600)}.mobile-data-card .card-amount.negative[data-v-ee872202]{color:var(--red-600)}.mobile-empty[data-v-ee872202]{text-align:center;padding:var(--space-xl);color:var(--text-color-secondary)}.mobile-empty i[data-v-ee872202]{font-size:var(--text-3xl);margin-bottom:var(--space-sm);display:block}.bottom-sheet-title[data-v-ee872202]{font-size:var(--text-lg);font-weight:var(--font-semibold);color:var(--text-color);margin:0 0 var(--space-md) 0}.bottom-sheet-filters[data-v-ee872202]{display:flex;flex-direction:column;gap:var(--space-md)}.bottom-sheet-actions[data-v-ee872202]{display:flex;gap:var(--space-sm);justify-content:flex-end;margin-top:var(--space-md);padding-top:var(--space-md);border-top:1px solid var(--surface-border)}[data-theme=dark] .mobile-totals-bar .total-value.incasari[data-v-ee872202]{color:var(--green-400)}[data-theme=dark] .mobile-totals-bar .total-value.plati[data-v-ee872202]{color:var(--red-400)}[data-theme=dark] .mobile-data-card .card-amount.positive[data-v-ee872202]{color:var(--green-400)}[data-theme=dark] .mobile-data-card .card-amount.negative[data-v-ee872202]{color:var(--red-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .mobile-totals-bar .total-value.incasari[data-v-ee872202]{color:var(--green-400)}:root:not([data-theme]) .mobile-totals-bar .total-value.plati[data-v-ee872202]{color:var(--red-400)}:root:not([data-theme]) .mobile-data-card .card-amount.positive[data-v-ee872202]{color:var(--green-400)}:root:not([data-theme]) .mobile-data-card .card-amount.negative[data-v-ee872202]{color:var(--red-400)}}@media (max-width: 768px){.register-view[data-v-ee872202]{padding:var(--space-md)}} diff --git a/deploy-package-20260223-151231/frontend/assets/DashboardView.BmFJSoNT.js b/deploy-package-20260223-151231/frontend/assets/DashboardView.BmFJSoNT.js deleted file mode 100644 index 9d8c253..0000000 --- a/deploy-package-20260223-151231/frontend/assets/DashboardView.BmFJSoNT.js +++ /dev/null @@ -1,2 +0,0 @@ -import{j as z,c as i,i as l,d as t,e as a,v as s,u as m,a as H,w as za,o as Ra,W as pe,t as K,q,I as J,n as Ia,F as aa,B as ra,y as qa,X as ei,E as Qt,S as _e,O as sa,h as Da,p as ca,H as ti,f as Jt,K as ai,P as ii,l as si}from"./vendor-core.B6UiYhU_.js";import{_ as ka,u as li}from"./index.B8XI8FQW.js";import{I as ni,s as ri}from"./vendor-primevue.BN-meDW0.js";import{C as Ca,r as fe}from"./vendor-charts.DHYGKspN.js";import{B as oi}from"./BottomSheet.WKuCIyuZ.js";import{M as ci}from"./MobileTopBar.BnL78WPy.js";import{M as di}from"./MobileBottomNav.Cp8OR33w.js";import{M as ui}from"./MobileDrawerMenu.DJ_STPbv.js";import{u as vi,a as pi,b as fi,c as mi,g as me}from"./sharedStores.Bb_IRn4Y.js";import"./vendor-export.BWjBvx7Z.js";import"./vendor-utils.CO3CyGpV.js";const bi={key:0,class:"cache-footer"},_i={__name:"CacheFooter",props:{cacheHit:{type:Boolean,default:!1},responseTimeMs:{type:Number,default:0},cacheSource:{type:String,default:null}},setup(d){const n=d,N=z(()=>n.responseTimeMs>0),h=z(()=>n.cacheHit&&n.cacheSource?`cached ${n.cacheSource}`:n.cacheHit?"cached":"db"),g=z(()=>n.cacheHit?n.cacheSource==="L1"?"cache-l1":"cache-l2":"cache-db");return(S,P)=>N.value?(t(),i("div",bi,[a("span",{class:m(["cache-badge",g.value])},s(h.value)+" | "+s((d.responseTimeMs||0).toFixed(2))+"ms ",3)])):l("",!0)}},Ka=ka(_i,[["__scopeId","data-v-9e2ae10a"]]),hi={class:"metric-card cashflow-card"},ki={class:"values-section"},yi={class:"value-block inflows"},gi={class:"metric-value text-success"},wi={class:"value-block outflows"},Ci={class:"metric-value text-error"},zi={class:"charts-content"},xi={key:0,class:"sparkline-dual-container"},Si={class:"sparkline-wrapper"},Di={class:"sparkline-chart"},Ii={class:"sparkline-wrapper"},Ti={class:"sparkline-chart"},$i={__name:"CashFlowMetricCard",props:{inflowsValue:{type:Number,default:0},outflowsValue:{type:Number,default:0},inflowsTrend:{type:Object,default:null},outflowsTrend:{type:Object,default:null},inflowsSparkline:{type:Array,default:()=>[]},outflowsSparkline:{type:Array,default:()=>[]},inflowsPreviousSparkline:{type:Array,default:()=>[]},outflowsPreviousSparkline:{type:Array,default:()=>[]},sparklineLabels:{type:Array,default:()=>[]},previousSparklineLabels:{type:Array,default:()=>[]},cacheInfo:{type:Object,default:()=>({hit:!1,time:0,source:null})}},setup(d){Ca.register(...fe);const n=d,N=H(null),h=H(null);let g=null,S=null;const P=H(!1),ea=()=>{P.value=!P.value},X=o=>!o&&o!==0?"0":new Intl.NumberFormat("ro-RO",{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0}).format(Math.abs(o)),A=z(()=>n.inflowsSparkline.length>0&&n.outflowsSparkline.length>0),R=async()=>{if(!N.value||n.inflowsSparkline.length===0)return;if(g&&(g.destroy(),g=null),await Ia(),!N.value){console.warn("[CashFlowMetricCard] Inflows canvas ref not available after nextTick");return}const o=N.value.getContext("2d"),r=n.sparklineLabels.length>0?n.sparklineLabels:n.inflowsSparkline.map((y,L)=>`L${L+1}`),C=[{label:"Încasări (curent)",data:n.inflowsSparkline,borderColor:"#10b981",backgroundColor:"rgba(16, 185, 129, 0.1)",borderWidth:2,fill:!0,tension:.4,pointRadius:0,pointHoverRadius:4,pointHoverBackgroundColor:"#10b981",pointHoverBorderColor:"#ffffff",pointHoverBorderWidth:2}];n.inflowsPreviousSparkline&&n.inflowsPreviousSparkline.length>0&&C.push({label:"Încasări (anul precedent)",data:n.inflowsPreviousSparkline,borderColor:"rgba(16, 185, 129, 0.4)",backgroundColor:"rgba(16, 185, 129, 0.05)",borderWidth:2,borderDash:[5,5],fill:!1,tension:.4,pointRadius:0,pointHoverRadius:4,pointHoverBackgroundColor:"rgba(16, 185, 129, 0.4)",pointHoverBorderColor:"#ffffff",pointHoverBorderWidth:2});const u=[...n.inflowsSparkline];n.inflowsPreviousSparkline&&n.inflowsPreviousSparkline.length>0&&u.push(...n.inflowsPreviousSparkline);const b=Math.min(...u),_=Math.max(...u),$=_-b,v=u.reduce((y,L)=>y+L,0)/u.length*.25,O=(b+_)/2,k=Math.max($,v);let Z=O-k/2,c=O+k/2;const e=k*.1,M=b>=0?Math.max(0,Z-e):Z-e,U=c+e;g=new Ca(o,{type:"line",data:{labels:r,datasets:C},options:{responsive:!0,maintainAspectRatio:!1,interaction:{intersect:!1,mode:"index"},plugins:{legend:{display:C.length>1,position:"top",align:"end",labels:{boxWidth:12,boxHeight:12,padding:8,font:{size:10,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},color:"rgba(107, 114, 128, 0.9)",usePointStyle:!0,pointStyle:"line"}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#ffffff",bodyColor:"#ffffff",borderColor:"rgba(255, 255, 255, 0.2)",borderWidth:1,cornerRadius:6,displayColors:!0,callbacks:{title:y=>y[0].label||"",label:y=>{const L=y.parsed.y,V=y.dataset.label||"",F=new Intl.NumberFormat("ro-RO",{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0}).format(L);return`${V}: ${F}`}}}},scales:{x:{display:!0,grid:{display:!1,drawBorder:!1},ticks:{color:"rgba(107, 114, 128, 0.7)",font:{size:10,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},maxRotation:45,minRotation:45,maxTicksLimit:6},border:{display:!1}},y:{display:!0,min:M,max:U,grid:{color:"rgba(107, 114, 128, 0.1)",drawBorder:!1},ticks:{color:"#10b981",font:{size:11,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},maxTicksLimit:3,callback:function(y){return y>=1e6?(y/1e6).toFixed(1)+"M":y>=1e3?(y/1e3).toFixed(0)+"k":y.toFixed(0)}},border:{display:!1}}}}})},I=async()=>{if(!h.value||n.outflowsSparkline.length===0)return;if(S&&(S.destroy(),S=null),await Ia(),!h.value){console.warn("[CashFlowMetricCard] Outflows canvas ref not available after nextTick");return}const o=h.value.getContext("2d"),r=n.sparklineLabels.length>0?n.sparklineLabels:n.outflowsSparkline.map((y,L)=>`L${L+1}`),C=[{label:"Plăți (curent)",data:n.outflowsSparkline,borderColor:"#ef4444",backgroundColor:"rgba(239, 68, 68, 0.1)",borderWidth:2,fill:!0,tension:.4,pointRadius:0,pointHoverRadius:4,pointHoverBackgroundColor:"#ef4444",pointHoverBorderColor:"#ffffff",pointHoverBorderWidth:2}];n.outflowsPreviousSparkline&&n.outflowsPreviousSparkline.length>0&&C.push({label:"Plăți (anul precedent)",data:n.outflowsPreviousSparkline,borderColor:"rgba(239, 68, 68, 0.4)",backgroundColor:"rgba(239, 68, 68, 0.05)",borderWidth:2,borderDash:[5,5],fill:!1,tension:.4,pointRadius:0,pointHoverRadius:4,pointHoverBackgroundColor:"rgba(239, 68, 68, 0.4)",pointHoverBorderColor:"#ffffff",pointHoverBorderWidth:2});const u=[...n.outflowsSparkline];n.outflowsPreviousSparkline&&n.outflowsPreviousSparkline.length>0&&u.push(...n.outflowsPreviousSparkline);const b=Math.min(...u),_=Math.max(...u),$=_-b,v=u.reduce((y,L)=>y+L,0)/u.length*.25,O=(b+_)/2,k=Math.max($,v);let Z=O-k/2,c=O+k/2;const e=k*.1,M=b>=0?Math.max(0,Z-e):Z-e,U=c+e;S=new Ca(o,{type:"line",data:{labels:r,datasets:C},options:{responsive:!0,maintainAspectRatio:!1,interaction:{intersect:!1,mode:"index"},plugins:{legend:{display:C.length>1,position:"top",align:"end",labels:{boxWidth:12,boxHeight:12,padding:8,font:{size:10,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},color:"rgba(107, 114, 128, 0.9)",usePointStyle:!0,pointStyle:"line"}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#ffffff",bodyColor:"#ffffff",borderColor:"rgba(255, 255, 255, 0.2)",borderWidth:1,cornerRadius:6,displayColors:!0,callbacks:{title:y=>y[0].label||"",label:y=>{const L=y.parsed.y,V=y.dataset.label||"",F=new Intl.NumberFormat("ro-RO",{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0}).format(L);return`${V}: ${F}`}}}},scales:{x:{display:!0,grid:{display:!1,drawBorder:!1},ticks:{color:"rgba(107, 114, 128, 0.7)",font:{size:10,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},maxRotation:45,minRotation:45,maxTicksLimit:6},border:{display:!1}},y:{display:!0,min:M,max:U,grid:{color:"rgba(107, 114, 128, 0.1)",drawBorder:!1},ticks:{color:"#ef4444",font:{size:11,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},maxTicksLimit:3,callback:function(y){return y>=1e6?(y/1e6).toFixed(1)+"M":y>=1e3?(y/1e3).toFixed(0)+"k":y.toFixed(0)}},border:{display:!1}}}}})};return za(()=>[n.inflowsSparkline,n.outflowsSparkline,n.sparklineLabels,n.inflowsPreviousSparkline,n.outflowsPreviousSparkline,n.previousSparklineLabels],async()=>{await Promise.all([R(),I()])},{deep:!0}),Ra(async()=>{await Promise.all([R(),I()])}),pe(()=>{g&&(g.destroy(),g=null),S&&(S.destroy(),S=null)}),(o,r)=>{var C,u,b;return t(),i("div",hi,[a("div",ki,[a("div",yi,[r[0]||(r[0]=a("div",{class:"metric-label"},"Încasări",-1)),a("div",gi,s(X(d.inflowsValue)),1)]),r[2]||(r[2]=a("div",{class:"divider"},null,-1)),a("div",wi,[r[1]||(r[1]=a("div",{class:"metric-label"},"Plăți",-1)),a("div",Ci,s(X(d.outflowsValue)),1)])]),A.value?(t(),i("div",{key:0,class:"charts-toggle-header",onClick:ea},[r[3]||(r[3]=a("span",null,"Grafice evoluție",-1)),a("i",{class:m(["pi pi-chevron-right",{expanded:P.value}])},null,2)])):l("",!0),K(a("div",zi,[A.value?(t(),i("div",xi,[a("div",Si,[r[4]||(r[4]=a("div",{class:"sparkline-title text-success"},"Încasări",-1)),a("div",Di,[a("canvas",{ref_key:"inflowsCanvas",ref:N,class:"sparkline-canvas"},null,512)])]),a("div",Ii,[r[5]||(r[5]=a("div",{class:"sparkline-title text-error"},"Plăți",-1)),a("div",Ti,[a("canvas",{ref_key:"outflowsCanvas",ref:h,class:"sparkline-canvas"},null,512)])])])):l("",!0)],512),[[J,P.value]]),q(Ka,{"cache-hit":(C=d.cacheInfo)==null?void 0:C.hit,"response-time-ms":(u=d.cacheInfo)==null?void 0:u.time,"cache-source":(b=d.cacheInfo)==null?void 0:b.source},null,8,["cache-hit","response-time-ms","cache-source"])])}}},Yt=ka($i,[["__scopeId","data-v-887a883d"]]),Pi={class:"metric-card clienti-balance-card"},Fi={class:"card-header-mobile"},Ai={class:"header-values"},Ri={key:0,class:"breakdown-section"},Mi={class:"breakdown-item"},Li={class:"breakdown-value"},Bi={class:"breakdown-group"},Ni={class:"breakdown-header-left"},Vi={class:"breakdown-value"},Oi={class:"breakdown-subitems slide-down"},Ei={class:"breakdown-sublabel"},Hi={class:"breakdown-subvalue"},Wi={class:"charts-content"},ji={key:0,class:"metric-sparkline"},Xi={class:"sparkline-chart"},Yi={__name:"ClientiBalanceCard",props:{total:{type:Number,required:!0},trend:{type:Object,default:null},sparklineData:{type:Array,default:()=>[]},previousSparklineData:{type:Array,default:()=>[]},sparklineLabels:{type:Array,default:()=>[]},previousSparklineLabels:{type:Array,default:()=>[]},breakdown:{type:Object,default:null},cacheInfo:{type:Object,default:()=>({hit:!1,time:0,source:null})}},setup(d){Ca.register(...fe);const n=d,N=H(null);let h=null;const g=H(!1),S=H(!1),P=()=>{g.value=!g.value},ea=()=>{S.value=!S.value},X=u=>!u&&u!==0?"0":new Intl.NumberFormat("ro-RO",{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0}).format(Math.abs(u)),A=u=>({"7_zile":"7 zile","14_zile":"14 zile","30_zile":"30 zile","60_zile":"60 zile","90_zile":"90 zile",peste_90_zile:"Peste 90 zile"})[u]||u,R=u=>{if(!u&&u!==0)return"neutral";const b=typeof u=="string"?parseFloat(u):u;return b>0?"positive":b<0?"negative":"neutral"},I=u=>u?{"trend-up":u.direction==="up","trend-down":u.direction==="down","trend-neutral":u.direction==="neutral"}:"",o=u=>{if(!u)return"pi pi-minus";switch(u.direction){case"up":return"pi pi-arrow-up";case"down":return"pi pi-arrow-down";case"neutral":return"pi pi-minus";default:return"pi pi-minus"}},r=z(()=>n.sparklineData&&n.sparklineData.length>0),C=async()=>{if(!N.value||!r.value)return;if(h&&(h.destroy(),h=null),await Ia(),!N.value){console.warn("[ClientiBalanceCard] Canvas ref not available after nextTick");return}const u=N.value.getContext("2d"),b=n.sparklineLabels.length>0?n.sparklineLabels:n.sparklineData.map((F,Q)=>`L${Q+1}`),_=[...n.sparklineData];n.previousSparklineData&&n.previousSparklineData.length>0&&_.push(...n.previousSparklineData);const $=Math.min(..._),w=Math.max(..._),v=w-$,k=_.reduce((F,Q)=>F+Q,0)/_.length*.25,Z=($+w)/2,c=Math.max(v,k);let e=Z-c/2,T=Z+c/2;const M=c*.1,y=$>=0?Math.max(0,e-M):e-M,L=T+M,V=[{label:"Clienți (curent)",data:n.sparklineData,borderColor:"#10b981",backgroundColor:"rgba(16, 185, 129, 0.1)",borderWidth:2,fill:!0,tension:.4,pointRadius:0,pointHoverRadius:4,pointHoverBackgroundColor:"#10b981",pointHoverBorderColor:"#ffffff",pointHoverBorderWidth:2}];n.previousSparklineData&&n.previousSparklineData.length>0&&V.push({label:"Clienți (anul precedent)",data:n.previousSparklineData,borderColor:"rgba(16, 185, 129, 0.4)",backgroundColor:"rgba(16, 185, 129, 0.05)",borderWidth:2,borderDash:[5,5],fill:!1,tension:.4,pointRadius:0,pointHoverRadius:4,pointHoverBackgroundColor:"rgba(16, 185, 129, 0.6)",pointHoverBorderColor:"#ffffff",pointHoverBorderWidth:2}),h=new Ca(u,{type:"line",data:{labels:b,datasets:V},options:{responsive:!0,maintainAspectRatio:!1,interaction:{intersect:!1,mode:"index"},plugins:{legend:{display:!0,position:"top",align:"end",labels:{boxWidth:12,boxHeight:12,padding:8,font:{size:10,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},color:"rgba(107, 114, 128, 0.8)",usePointStyle:!0}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#ffffff",bodyColor:"#ffffff",borderColor:"rgba(255, 255, 255, 0.2)",borderWidth:1,cornerRadius:6,displayColors:!0,callbacks:{title:F=>F[0].label||"",label:F=>{const Q=F.parsed.y,ta=F.dataset.label||"",ya=new Intl.NumberFormat("ro-RO",{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0}).format(Q);return`${ta}: ${ya}`}}}},scales:{x:{display:!0,grid:{display:!1,drawBorder:!1},ticks:{color:"rgba(107, 114, 128, 0.7)",font:{size:10,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},maxRotation:45,minRotation:45,maxTicksLimit:6},border:{display:!1}},y:{display:!0,min:y,max:L,grid:{color:"rgba(107, 114, 128, 0.1)",drawBorder:!1},ticks:{color:"#10b981",font:{size:11,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},maxTicksLimit:3,callback:function(F){return F>=1e6?(F/1e6).toFixed(1)+"M":F>=1e3?(F/1e3).toFixed(0)+"k":F.toFixed(0)}},border:{display:!1}}}}})};return za(()=>[n.sparklineData,n.previousSparklineData,n.sparklineLabels,n.previousSparklineLabels],async()=>{await C()},{deep:!0}),Ra(async()=>{await C()}),pe(()=>{h&&(h.destroy(),h=null)}),(u,b)=>{var _,$,w,v,O,k;return t(),i("div",Pi,[a("div",Fi,[b[0]||(b[0]=a("div",{class:"header-left"},[a("span",{class:"header-dot clienti"}),a("span",{class:"header-label"},"Clienți")],-1)),a("div",Ai,[a("span",{class:m(["header-total",R(d.total)])},s(X(d.total)),3),d.trend?(t(),i("div",{key:0,class:m(["header-trend",I(d.trend)])},[a("i",{class:m(o(d.trend))},null,2),a("span",null,s(Math.round(Math.abs(d.trend.value)))+"%",1)],2)):l("",!0)])]),d.breakdown?(t(),i("div",Ri,[a("div",Mi,[b[1]||(b[1]=a("span",{class:"breakdown-label"},"În termen",-1)),a("span",Li,s(X(((_=d.breakdown.in_termen)==null?void 0:_.total)||0)),1)]),a("div",Bi,[a("div",{class:"breakdown-header",onClick:P},[a("div",Ni,[a("i",{class:m(["pi pi-chevron-right breakdown-toggle",{expanded:g.value}])},null,2),b[2]||(b[2]=a("span",{class:"breakdown-label"},"Restant",-1))]),a("span",Vi,s(X((($=d.breakdown.restant)==null?void 0:$.total)||0)),1)]),K(a("div",Oi,[(t(!0),i(aa,null,ra((w=d.breakdown.restant)==null?void 0:w.perioade,(Z,c)=>(t(),i("div",{class:"breakdown-subitem",key:c},[a("span",Ei,s(A(c)),1),a("span",Hi,s(X(Z)),1)]))),128))],512),[[J,g.value]])])])):l("",!0),r.value?(t(),i("div",{key:1,class:"charts-toggle-header",onClick:ea},[b[3]||(b[3]=a("span",null,"Grafice evoluție",-1)),a("i",{class:m(["pi pi-chevron-right",{expanded:S.value}])},null,2)])):l("",!0),K(a("div",Wi,[r.value?(t(),i("div",ji,[a("div",Xi,[a("canvas",{ref_key:"chartCanvas",ref:N,class:"sparkline-canvas"},null,512)])])):l("",!0)],512),[[J,S.value]]),q(Ka,{"cache-hit":(v=d.cacheInfo)==null?void 0:v.hit,"response-time-ms":(O=d.cacheInfo)==null?void 0:O.time,"cache-source":(k=d.cacheInfo)==null?void 0:k.source},null,8,["cache-hit","response-time-ms","cache-source"])])}}},Zt=ka(Yi,[["__scopeId","data-v-c7f80a0b"]]),Zi={class:"metric-card furnizori-balance-card"},Gi={class:"card-header-mobile"},Ui={class:"header-values"},qi={key:0,class:"breakdown-section"},Ki={class:"breakdown-item"},Qi={class:"breakdown-value"},Ji={class:"breakdown-group"},as={class:"breakdown-header-left"},es={class:"breakdown-value"},ts={class:"breakdown-subitems slide-down"},is={class:"breakdown-sublabel"},ss={class:"breakdown-subvalue"},ls={class:"charts-content"},ns={key:0,class:"metric-sparkline"},rs={class:"sparkline-chart"},os={__name:"FurnizoriBalanceCard",props:{total:{type:Number,required:!0},trend:{type:Object,default:null},sparklineData:{type:Array,default:()=>[]},previousSparklineData:{type:Array,default:()=>[]},sparklineLabels:{type:Array,default:()=>[]},previousSparklineLabels:{type:Array,default:()=>[]},breakdown:{type:Object,default:null},cacheInfo:{type:Object,default:()=>({hit:!1,time:0,source:null})}},setup(d){Ca.register(...fe);const n=d,N=H(null);let h=null;const g=H(!1),S=H(!1),P=()=>{g.value=!g.value},ea=()=>{S.value=!S.value},X=u=>!u&&u!==0?"0":new Intl.NumberFormat("ro-RO",{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0}).format(Math.abs(u)),A=u=>({"7_zile":"7 zile","14_zile":"14 zile","30_zile":"30 zile","60_zile":"60 zile","90_zile":"90 zile",peste_90_zile:"Peste 90 zile"})[u]||u,R=u=>{if(!u&&u!==0)return"neutral";const b=typeof u=="string"?parseFloat(u):u;return b>0?"positive":b<0?"negative":"neutral"},I=u=>u?{"trend-up":u.direction==="up","trend-down":u.direction==="down","trend-neutral":u.direction==="neutral"}:"",o=u=>{if(!u)return"pi pi-minus";switch(u.direction){case"up":return"pi pi-arrow-up";case"down":return"pi pi-arrow-down";case"neutral":return"pi pi-minus";default:return"pi pi-minus"}},r=z(()=>n.sparklineData&&n.sparklineData.length>0),C=async()=>{if(!N.value||!r.value)return;if(h&&(h.destroy(),h=null),await Ia(),!N.value){console.warn("[FurnizoriBalanceCard] Canvas ref not available after nextTick");return}const u=N.value.getContext("2d"),b=n.sparklineLabels.length>0?n.sparklineLabels:n.sparklineData.map((F,Q)=>`L${Q+1}`),_=[...n.sparklineData];n.previousSparklineData&&n.previousSparklineData.length>0&&_.push(...n.previousSparklineData);const $=Math.min(..._),w=Math.max(..._),v=w-$,k=_.reduce((F,Q)=>F+Q,0)/_.length*.25,Z=($+w)/2,c=Math.max(v,k);let e=Z-c/2,T=Z+c/2;const M=c*.1,y=$>=0?Math.max(0,e-M):e-M,L=T+M,V=[{label:"Furnizori (curent)",data:n.sparklineData,borderColor:"#ef4444",backgroundColor:"rgba(239, 68, 68, 0.1)",borderWidth:2,fill:!0,tension:.4,pointRadius:0,pointHoverRadius:4,pointHoverBackgroundColor:"#ef4444",pointHoverBorderColor:"#ffffff",pointHoverBorderWidth:2}];n.previousSparklineData&&n.previousSparklineData.length>0&&V.push({label:"Furnizori (anul precedent)",data:n.previousSparklineData,borderColor:"rgba(239, 68, 68, 0.4)",backgroundColor:"rgba(239, 68, 68, 0.05)",borderWidth:2,borderDash:[5,5],fill:!1,tension:.4,pointRadius:0,pointHoverRadius:4,pointHoverBackgroundColor:"rgba(239, 68, 68, 0.6)",pointHoverBorderColor:"#ffffff",pointHoverBorderWidth:2}),h=new Ca(u,{type:"line",data:{labels:b,datasets:V},options:{responsive:!0,maintainAspectRatio:!1,interaction:{intersect:!1,mode:"index"},plugins:{legend:{display:!0,position:"top",align:"end",labels:{boxWidth:12,boxHeight:12,padding:8,font:{size:10,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},color:"rgba(107, 114, 128, 0.8)",usePointStyle:!0}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#ffffff",bodyColor:"#ffffff",borderColor:"rgba(255, 255, 255, 0.2)",borderWidth:1,cornerRadius:6,displayColors:!0,callbacks:{title:F=>F[0].label||"",label:F=>{const Q=F.parsed.y,ta=F.dataset.label||"",ya=new Intl.NumberFormat("ro-RO",{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0}).format(Q);return`${ta}: ${ya}`}}}},scales:{x:{display:!0,grid:{display:!1,drawBorder:!1},ticks:{color:"rgba(107, 114, 128, 0.7)",font:{size:10,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},maxRotation:45,minRotation:45,maxTicksLimit:6},border:{display:!1}},y:{display:!0,min:y,max:L,grid:{color:"rgba(107, 114, 128, 0.1)",drawBorder:!1},ticks:{color:"#ef4444",font:{size:11,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},maxTicksLimit:3,callback:function(F){return F>=1e6?(F/1e6).toFixed(1)+"M":F>=1e3?(F/1e3).toFixed(0)+"k":F.toFixed(0)}},border:{display:!1}}}}})};return za(()=>[n.sparklineData,n.previousSparklineData,n.sparklineLabels,n.previousSparklineLabels],async()=>{await C()},{deep:!0}),Ra(async()=>{await C()}),pe(()=>{h&&(h.destroy(),h=null)}),(u,b)=>{var _,$,w,v,O,k;return t(),i("div",Zi,[a("div",Gi,[b[0]||(b[0]=a("div",{class:"header-left"},[a("span",{class:"header-dot furnizori"}),a("span",{class:"header-label"},"Furnizori")],-1)),a("div",Ui,[a("span",{class:m(["header-total",R(d.total)])},s(X(d.total)),3),d.trend?(t(),i("div",{key:0,class:m(["header-trend",I(d.trend)])},[a("i",{class:m(o(d.trend))},null,2),a("span",null,s(Math.round(Math.abs(d.trend.value)))+"%",1)],2)):l("",!0)])]),d.breakdown?(t(),i("div",qi,[a("div",Ki,[b[1]||(b[1]=a("span",{class:"breakdown-label"},"În termen",-1)),a("span",Qi,s(X(((_=d.breakdown.in_termen)==null?void 0:_.total)||0)),1)]),a("div",Ji,[a("div",{class:"breakdown-header",onClick:P},[a("div",as,[a("i",{class:m(["pi pi-chevron-right breakdown-toggle",{expanded:g.value}])},null,2),b[2]||(b[2]=a("span",{class:"breakdown-label"},"Restant",-1))]),a("span",es,s(X((($=d.breakdown.restant)==null?void 0:$.total)||0)),1)]),K(a("div",ts,[(t(!0),i(aa,null,ra((w=d.breakdown.restant)==null?void 0:w.perioade,(Z,c)=>(t(),i("div",{class:"breakdown-subitem",key:c},[a("span",is,s(A(c)),1),a("span",ss,s(X(Z)),1)]))),128))],512),[[J,g.value]])])])):l("",!0),r.value?(t(),i("div",{key:1,class:"charts-toggle-header",onClick:ea},[b[3]||(b[3]=a("span",null,"Grafice evoluție",-1)),a("i",{class:m(["pi pi-chevron-right",{expanded:S.value}])},null,2)])):l("",!0),K(a("div",ls,[r.value?(t(),i("div",ns,[a("div",rs,[a("canvas",{ref_key:"chartCanvas",ref:N,class:"sparkline-canvas"},null,512)])])):l("",!0)],512),[[J,S.value]]),q(Ka,{"cache-hit":(v=d.cacheInfo)==null?void 0:v.hit,"response-time-ms":(O=d.cacheInfo)==null?void 0:O.time,"cache-source":(k=d.cacheInfo)==null?void 0:k.source},null,8,["cache-hit","response-time-ms","cache-source"])])}}},Gt=ka(os,[["__scopeId","data-v-0edde778"]]),cs={class:"metric-card treasury-dual-card"},ds={class:"treasury-items"},us={key:0,class:"treasury-group"},vs={class:"treasury-header-left"},ps={class:"treasury-subitems slide-down"},fs={class:"treasury-sublabel"},ms={key:0,class:"treasury-cont"},bs={key:1,class:"treasury-group"},_s={class:"treasury-header-left"},hs={class:"treasury-subitems slide-down"},ks={class:"treasury-sublabel"},ys={key:0,class:"treasury-cont"},gs={class:"charts-content sparkline-dual-container"},ws={class:"sparkline-wrapper"},Cs={class:"sparkline-chart"},zs={class:"sparkline-wrapper"},xs={class:"sparkline-chart"},Ss={__name:"TreasuryDualCard",props:{casaTotal:{type:Number,default:0},bancaTotal:{type:Number,default:0},casaItems:{type:Array,default:()=>[]},bancaItems:{type:Array,default:()=>[]},casaSparklineData:{type:Array,default:()=>[]},bancaSparklineData:{type:Array,default:()=>[]},casaPreviousSparklineData:{type:Array,default:()=>[]},bancaPreviousSparklineData:{type:Array,default:()=>[]},sparklineLabels:{type:Array,default:()=>[]},previousSparklineLabels:{type:Array,default:()=>[]},trend:{type:Object,default:null},cacheInfo:{type:Object,default:()=>({hit:!1,time:0,source:null})}},setup(d){Ca.register(...fe);const n=d,N=H(null),h=H(null);let g=null,S=null;const P=H(!1),ea=H(!1),X=H(!1),A=()=>{P.value=!P.value},R=()=>{ea.value=!ea.value},I=()=>{X.value=!X.value},o=b=>!b&&b!==0?"0":new Intl.NumberFormat("ro-RO",{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0}).format(b),r=z(()=>n.casaSparklineData.length>0&&n.bancaSparklineData.length>0),C=async()=>{if(!N.value||n.casaSparklineData.length===0)return;g&&(g.destroy(),g=null),await Ia();const b=N.value.getContext("2d"),_=n.sparklineLabels.length>0?n.sparklineLabels:n.casaSparklineData.map((c,e)=>`L${e+1}`),$=[{label:"Casa (curent)",data:n.casaSparklineData,borderColor:"#10b981",backgroundColor:"rgba(16, 185, 129, 0.1)",borderWidth:2,fill:!0,tension:.4,pointRadius:0,pointHoverRadius:4,pointHoverBackgroundColor:"#10b981",pointHoverBorderColor:"#ffffff",pointHoverBorderWidth:2}];n.casaPreviousSparklineData&&n.casaPreviousSparklineData.length>0&&$.push({label:"Casa (anul precedent)",data:n.casaPreviousSparklineData,borderColor:"rgba(16, 185, 129, 0.4)",backgroundColor:"rgba(16, 185, 129, 0.05)",borderWidth:2,borderDash:[5,5],fill:!1,tension:.4,pointRadius:0,pointHoverRadius:4,pointHoverBackgroundColor:"rgba(16, 185, 129, 0.4)",pointHoverBorderColor:"#ffffff",pointHoverBorderWidth:2});const w=[...n.casaSparklineData];n.casaPreviousSparklineData&&n.casaPreviousSparklineData.length>0&&w.push(...n.casaPreviousSparklineData);const v=Math.min(...w),O=Math.max(...w),Z=(O-v)*.05;g=new Ca(b,{type:"line",data:{labels:_,datasets:$},options:{responsive:!0,maintainAspectRatio:!1,interaction:{intersect:!1,mode:"index"},plugins:{legend:{display:$.length>1,position:"top",align:"end",labels:{boxWidth:12,boxHeight:12,padding:8,font:{size:10,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},color:"rgba(107, 114, 128, 0.9)",usePointStyle:!0,pointStyle:"line"}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#ffffff",bodyColor:"#ffffff",borderColor:"rgba(255, 255, 255, 0.2)",borderWidth:1,cornerRadius:6,displayColors:!0,callbacks:{title:c=>c[0].label||"",label:c=>{const e=c.parsed.y,T=c.dataset.label||"",M=new Intl.NumberFormat("ro-RO",{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0}).format(e);return`${T}: ${M}`}}}},scales:{x:{display:!0,grid:{display:!1,drawBorder:!1},ticks:{color:"rgba(107, 114, 128, 0.7)",font:{size:10,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},maxRotation:45,minRotation:45,maxTicksLimit:6},border:{display:!1}},y:{display:!0,min:v-Z,max:O+Z,grid:{color:"rgba(107, 114, 128, 0.1)",drawBorder:!1},ticks:{color:"#10b981",font:{size:11,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},maxTicksLimit:3,callback:function(c){return c>=1e6?(c/1e6).toFixed(1)+"M":c>=1e3?(c/1e3).toFixed(0)+"k":c.toFixed(0)}},border:{display:!1}}}}})},u=async()=>{if(!h.value||n.bancaSparklineData.length===0)return;S&&(S.destroy(),S=null),await Ia();const b=h.value.getContext("2d"),_=n.sparklineLabels.length>0?n.sparklineLabels:n.bancaSparklineData.map((c,e)=>`L${e+1}`),$=[{label:"Bancă (curent)",data:n.bancaSparklineData,borderColor:"#3b82f6",backgroundColor:"rgba(59, 130, 246, 0.1)",borderWidth:2,fill:!0,tension:.4,pointRadius:0,pointHoverRadius:4,pointHoverBackgroundColor:"#3b82f6",pointHoverBorderColor:"#ffffff",pointHoverBorderWidth:2}];n.bancaPreviousSparklineData&&n.bancaPreviousSparklineData.length>0&&$.push({label:"Bancă (anul precedent)",data:n.bancaPreviousSparklineData,borderColor:"rgba(59, 130, 246, 0.4)",backgroundColor:"rgba(59, 130, 246, 0.05)",borderWidth:2,borderDash:[5,5],fill:!1,tension:.4,pointRadius:0,pointHoverRadius:4,pointHoverBackgroundColor:"rgba(59, 130, 246, 0.4)",pointHoverBorderColor:"#ffffff",pointHoverBorderWidth:2});const w=[...n.bancaSparklineData];n.bancaPreviousSparklineData&&n.bancaPreviousSparklineData.length>0&&w.push(...n.bancaPreviousSparklineData);const v=Math.min(...w),O=Math.max(...w),Z=(O-v)*.05;S=new Ca(b,{type:"line",data:{labels:_,datasets:$},options:{responsive:!0,maintainAspectRatio:!1,interaction:{intersect:!1,mode:"index"},plugins:{legend:{display:$.length>1,position:"top",align:"end",labels:{boxWidth:12,boxHeight:12,padding:8,font:{size:10,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},color:"rgba(107, 114, 128, 0.9)",usePointStyle:!0,pointStyle:"line"}},tooltip:{backgroundColor:"rgba(0, 0, 0, 0.8)",titleColor:"#ffffff",bodyColor:"#ffffff",borderColor:"rgba(255, 255, 255, 0.2)",borderWidth:1,cornerRadius:6,displayColors:!0,callbacks:{title:c=>c[0].label||"",label:c=>{const e=c.parsed.y,T=c.dataset.label||"",M=new Intl.NumberFormat("ro-RO",{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0}).format(e);return`${T}: ${M}`}}}},scales:{x:{display:!0,grid:{display:!1,drawBorder:!1},ticks:{color:"rgba(107, 114, 128, 0.7)",font:{size:10,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},maxRotation:45,minRotation:45,maxTicksLimit:6},border:{display:!1}},y:{display:!0,min:v-Z,max:O+Z,grid:{color:"rgba(107, 114, 128, 0.1)",drawBorder:!1},ticks:{color:"#3b82f6",font:{size:11,family:"Inter, -apple-system, BlinkMacSystemFont, sans-serif"},maxTicksLimit:3,callback:function(c){return c>=1e6?(c/1e6).toFixed(1)+"M":c>=1e3?(c/1e3).toFixed(0)+"k":c.toFixed(0)}},border:{display:!1}}}}})};return za(()=>[n.casaSparklineData,n.bancaSparklineData,n.sparklineLabels,n.casaPreviousSparklineData,n.bancaPreviousSparklineData,n.previousSparklineLabels],async()=>{await Promise.all([C(),u()])},{deep:!0}),Ra(async()=>{await Promise.all([C(),u()])}),pe(()=>{g&&(g.destroy(),g=null),S&&(S.destroy(),S=null)}),(b,_)=>{var $,w,v;return t(),i("div",cs,[a("div",ds,[d.casaItems.length>0||d.casaTotal!==0?(t(),i("div",us,[a("div",{class:"treasury-header",onClick:A},[a("div",vs,[a("i",{class:m(["pi pi-chevron-right treasury-toggle",{expanded:P.value}])},null,2),_[0]||(_[0]=a("span",{class:"treasury-label"},"Casa",-1))]),a("span",{class:m(["treasury-value",d.casaTotal>=0?"text-success":"text-danger"])},s(o(d.casaTotal)),3)]),K(a("div",ps,[(t(!0),i(aa,null,ra(d.casaItems,(O,k)=>(t(),i("div",{key:k,class:"treasury-subitem"},[a("span",fs,[qa(s(O.nume||`Cont ${O.cont}`)+" ",1),O.cont?(t(),i("span",ms,"("+s(O.cont)+")",1)):l("",!0)]),a("span",{class:m(["treasury-subvalue",{"text-danger":O.sold<0}])},s(o(O.sold)),3)]))),128))],512),[[J,P.value&&d.casaItems.length>0]])])):l("",!0),d.bancaItems.length>0||d.bancaTotal!==0?(t(),i("div",bs,[a("div",{class:"treasury-header",onClick:R},[a("div",_s,[a("i",{class:m(["pi pi-chevron-right treasury-toggle",{expanded:ea.value}])},null,2),_[1]||(_[1]=a("span",{class:"treasury-label"},"Bancă",-1))]),a("span",{class:m(["treasury-value",d.bancaTotal>=0?"text-primary":"text-danger"])},s(o(d.bancaTotal)),3)]),K(a("div",hs,[(t(!0),i(aa,null,ra(d.bancaItems,(O,k)=>(t(),i("div",{key:k,class:"treasury-subitem"},[a("span",ks,[qa(s(O.nume||`Cont ${O.cont}`)+" ",1),O.cont?(t(),i("span",ys,"("+s(O.cont)+")",1)):l("",!0)]),a("span",{class:m(["treasury-subvalue",{"text-danger":O.sold<0}])},s(o(O.sold)),3)]))),128))],512),[[J,ea.value&&d.bancaItems.length>0]])])):l("",!0)]),r.value?(t(),i("div",{key:0,class:"charts-toggle-header",onClick:I},[_[2]||(_[2]=a("span",null,"Grafice evoluție",-1)),a("i",{class:m(["pi pi-chevron-right",{expanded:X.value}])},null,2)])):l("",!0),K(a("div",gs,[a("div",ws,[_[3]||(_[3]=a("div",{class:"sparkline-title text-success"},"Casa",-1)),a("div",Cs,[a("canvas",{ref_key:"casaCanvas",ref:N,class:"sparkline-canvas"},null,512)])]),a("div",zs,[_[4]||(_[4]=a("div",{class:"sparkline-title text-primary"},"Bancă",-1)),a("div",xs,[a("canvas",{ref_key:"bancaCanvas",ref:h,class:"sparkline-canvas"},null,512)])])],512),[[J,X.value]]),q(Ka,{"cache-hit":($=d.cacheInfo)==null?void 0:$.hit,"response-time-ms":(w=d.cacheInfo)==null?void 0:w.time,"cache-source":(v=d.cacheInfo)==null?void 0:v.source},null,8,["cache-hit","response-time-ms","cache-source"])])}}},Ut=ka(Ss,[["__scopeId","data-v-e3686648"]]),Ds={class:"solduri-compact-card__header"},Is={class:"solduri-compact-card__content"},Ts={class:"solduri-compact-card__label"},$s={key:1,class:"solduri-compact-card__debt-line"},Ps={class:"solduri-compact-card__value solduri-compact-card__value--sold"},Fs={key:0,class:"solduri-compact-card__breakdown"},As={class:"solduri-compact-card__breakdown-item"},Rs={class:"solduri-compact-card__breakdown-value"},Ms={class:"solduri-compact-card__breakdown-sublabel"},Ls={class:"solduri-compact-card__breakdown-subvalue"},Bs={class:"solduri-compact-card__breakdown-item"},Ns={class:"solduri-compact-card__breakdown-value"},Vs={class:"solduri-compact-card__breakdown-sublabel"},Os={class:"solduri-compact-card__breakdown-subvalue"},Es={class:"solduri-compact-card__breakdown-item"},Hs={class:"solduri-compact-card__breakdown-value"},Ws={class:"solduri-compact-card__breakdown-item"},js={class:"solduri-compact-card__breakdown-value solduri-compact-card__breakdown-value--warning"},Xs={class:"solduri-compact-card__breakdown-sublabel"},Ys={class:"solduri-compact-card__breakdown-subvalue"},Zs=["onClick"],Gs={class:"solduri-compact-card__breakdown-label solduri-compact-card__group-label"},Us={class:"solduri-compact-card__breakdown-value"},qs={class:"solduri-compact-card__breakdown-sublabel"},Ks={class:"solduri-compact-card__breakdown-subvalue"},Qs={class:"solduri-compact-card__breakdown-subvalue"},Js={class:"solduri-compact-card__curent-summary"},al={class:"solduri-compact-card__curent-total"},el={key:1,class:"solduri-compact-card__breakdown-item"},tl=ei({__name:"SolduriCompactCard",props:{type:{},total:{},soldTotal:{},breakdown:{},casaTotal:{},bancaTotal:{}},setup(d){const n=d,N=H(!1),h=H(new Set),g=o=>{h.value.has(o)?h.value.delete(o):h.value.add(o),h.value=new Set(h.value)},S=z(()=>({trezorerie:"TREZORERIE",clienti:"CLIENȚI",furnizori:"FURNIZORI",tva:"DATORII BUGET"})[n.type]||n.type.toUpperCase()),P=z(()=>n.type==="tva"?n.total>0?"solduri-compact-card__value--danger":"solduri-compact-card__value--success":""),ea=z(()=>Array.isArray(n.breakdown)?n.breakdown.filter(o=>Number(o.curent||0)>0).reduce((o,r)=>o+Number(r.curent||0),0):0),X=z(()=>n.type==="trezorerie"?n.casaTotal!==void 0||n.bancaTotal!==void 0||n.breakdown:n.type==="clienti"||n.type==="furnizori"||n.type==="tva"?n.breakdown!==null&&n.breakdown!==void 0:!1),A=()=>{X.value&&(N.value=!N.value)},R=o=>o==null?"0":new Intl.NumberFormat("ro-RO",{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0}).format(o),I=o=>({"7_zile":"7 zile","14_zile":"14 zile","30_zile":"30 zile","60_zile":"60 zile","90_zile":"90 zile",peste_90_zile:"Peste 90 zile"})[o]||o;return(o,r)=>{var C,u,b,_,$,w,v,O,k,Z,c,e;return t(),i("div",{class:m(["solduri-compact-card",[`solduri-compact-card--${d.type}`,{"solduri-compact-card--expanded":N.value}]]),onClick:A},[a("div",Ds,[a("div",Is,[a("span",Ts,s(S.value),1),d.type!=="tva"?(t(),i("span",{key:0,class:m(["solduri-compact-card__value",P.value])},s(R(d.total)),3)):(t(),i("div",$s,[a("span",{class:m(["solduri-compact-card__value",P.value])},s(R(d.total)),3),r[0]||(r[0]=a("span",{class:"solduri-compact-card__debt-sep"},"·",-1)),a("span",Ps,s(d.soldTotal!==void 0&&d.soldTotal>0?R(d.soldTotal):"0 ✓"),1)]))]),a("i",{class:m(["pi pi-chevron-down solduri-compact-card__chevron",{"solduri-compact-card__chevron--expanded":N.value}])},null,2)]),N.value&&X.value?(t(),i("div",Fs,[d.type==="trezorerie"?(t(),i(aa,{key:0},[a("div",As,[r[1]||(r[1]=a("span",{class:"solduri-compact-card__breakdown-label"},"Casa",-1)),a("span",Rs,s(R(d.casaTotal)),1)]),(b=(u=(C=d.breakdown)==null?void 0:C.casa)==null?void 0:u.items)!=null&&b.length?(t(!0),i(aa,{key:0},ra(d.breakdown.casa.items,(T,M)=>(t(),i("div",{key:`casa-${M}`,class:"solduri-compact-card__breakdown-subitem"},[a("span",Ms,s(T.nume||`Cont ${T.cont}`),1),a("span",Ls,s(R(T.sold)),1)]))),128)):l("",!0),a("div",Bs,[r[2]||(r[2]=a("span",{class:"solduri-compact-card__breakdown-label"},"Bancă",-1)),a("span",Ns,s(R(d.bancaTotal)),1)]),(w=($=(_=d.breakdown)==null?void 0:_.banca)==null?void 0:$.items)!=null&&w.length?(t(!0),i(aa,{key:1},ra(d.breakdown.banca.items,(T,M)=>(t(),i("div",{key:`banca-${M}`,class:"solduri-compact-card__breakdown-subitem"},[a("span",Vs,s(T.nume||`Cont ${T.cont}`),1),a("span",Os,s(R(T.sold)),1)]))),128)):l("",!0)],64)):d.type==="clienti"||d.type==="furnizori"?(t(),i(aa,{key:1},[a("div",Es,[r[3]||(r[3]=a("span",{class:"solduri-compact-card__breakdown-label"},"În termen",-1)),a("span",Hs,s(R(((O=(v=d.breakdown)==null?void 0:v.in_termen)==null?void 0:O.total)||0)),1)]),a("div",Ws,[r[4]||(r[4]=a("span",{class:"solduri-compact-card__breakdown-label"},"Restant",-1)),a("span",js,s(R(((Z=(k=d.breakdown)==null?void 0:k.restant)==null?void 0:Z.total)||0)),1)]),(e=(c=d.breakdown)==null?void 0:c.restant)!=null&&e.perioade?(t(!0),i(aa,{key:0},ra(d.breakdown.restant.perioade,(T,M)=>(t(),i("div",{key:M,class:"solduri-compact-card__breakdown-subitem"},[a("span",Xs,s(I(M)),1),a("span",Ys,s(R(T)),1)]))),128)):l("",!0)],64)):d.type==="tva"?(t(),i(aa,{key:2},[Array.isArray(d.breakdown)&&d.breakdown.length?(t(),i(aa,{key:0},[r[7]||(r[7]=a("div",{class:"solduri-compact-card__debt-header"},[a("span"),a("span",{class:"solduri-compact-card__col-head"},"Datorat"),a("span",{class:"solduri-compact-card__col-head"},"Sold")],-1)),(t(!0),i(aa,null,ra(d.breakdown,T=>(t(),i("div",{key:T.key},[a("div",{class:"solduri-compact-card__breakdown-group",onClick:Qt(M=>g(T.key),["stop"])},[a("span",Gs,[a("i",{class:m(["pi pi-chevron-right solduri-compact-card__group-toggle",{"solduri-compact-card__group-toggle--expanded":h.value.has(T.key)}])},null,2),qa(" "+s(T.label),1)]),a("span",Us,s(T.datorat>0?R(T.datorat):"-"),1),a("span",{class:m(["solduri-compact-card__breakdown-value",T.sold<=0&&T.datorat>0?"solduri-compact-card__cleared":""])},s(T.sold>0?R(T.sold):T.datorat>0?"✓":"-"),3)],8,Zs),K(a("div",null,[(t(!0),i(aa,null,ra(T.sub_accounts,M=>(t(),i("div",{key:M.cont,class:"solduri-compact-card__breakdown-subitem"},[a("span",qs,s(M.label),1),a("span",Ks,s(M.datorat>0?R(M.datorat):"-"),1),a("span",Qs,s(M.sold>0?R(M.sold):M.datorat>0?"✓":"-"),1)]))),128))],512),[[J,h.value.has(T.key)]])]))),128)),d.breakdown.some(T=>T.curent>0)?(t(),i(aa,{key:0},[r[6]||(r[6]=a("div",{class:"solduri-compact-card__divider"},null,-1)),a("div",Js,[r[5]||(r[5]=a("span",{class:"solduri-compact-card__curent-title"},"Obligații curente:",-1)),(t(!0),i(aa,null,ra(d.breakdown.filter(T=>T.curent>0),T=>(t(),i("span",{key:"c-"+T.key,class:"solduri-compact-card__curent-chip"},s(T.label)+" "+s(R(T.curent)),1))),128)),a("span",al," = "+s(R(ea.value)),1)])],64)):l("",!0)],64)):(t(),i("div",el,[...r[8]||(r[8]=[a("span",{class:"solduri-compact-card__breakdown-label"},"Fără date",-1),a("span",{class:"solduri-compact-card__breakdown-value"},"-",-1)])]))],64)):l("",!0)])):l("",!0)],2)}}}),ue=ka(tl,[["__scopeId","data-v-9b5bdab3"]]),il={class:"indicator-label"},sl={key:0,class:"indicator-description slide-down"},ll={class:"indicator-main"},nl=["viewBox"],rl=["points","stroke"],ol=["cx","cy","fill"],cl={class:"tooltip-label"},dl={class:"tooltip-value"},ul={class:"trend-value"},vl={key:3,class:"indicator-threshold"},Ga=200,be=40,pl={__name:"IndicatorItem",props:{label:{type:String,required:!0},value:{type:Number,default:null},unit:{type:String,default:""},status:{type:String,default:"neutral",validator:d=>["good","warning","danger","safe","grey","distress","neutral"].includes(d)},sparklineData:{type:Array,default:()=>[]},sparklineLabels:{type:Array,default:()=>[]},thresholds:{type:Object,default:()=>({})},decimals:{type:Number,default:2},description:{type:String,default:""}},setup(d){const n=H(!1),N=()=>{n.value=!n.value},h=d,g={top:4,right:4,bottom:4,left:4},S=H(null),P=H(null),ea=H(0),X=z(()=>h.value===null||h.value===void 0?"-":Number(h.value).toFixed(h.decimals)),A=z(()=>h.sparklineData&&h.sparklineData.length>0),R=z(()=>({safe:"good",grey:"warning",distress:"danger"})[h.status]||h.status),I=z(()=>`status-${R.value}`),o=z(()=>{const c={good:"pi pi-check-circle",warning:"pi pi-exclamation-circle",danger:"pi pi-times-circle",neutral:"pi pi-minus-circle"};return c[R.value]||c.neutral}),r=z(()=>"var(--primary-color)"),C=z(()=>{if(!A.value)return"";const c=h.sparklineData.filter(V=>V!=null);if(c.length<2)return"";const e=Math.min(...c),M=Math.max(...c)-e||1,U=Ga-g.left-g.right,y=be-g.top-g.bottom;return c.map((V,F)=>{const Q=g.left+F/(c.length-1)*U,ta=g.top+y-(V-e)/M*y;return`${Q},${ta}`}).join(" ")}),u=z(()=>{if(!A.value)return[];const c=h.sparklineData.filter(L=>L!=null);if(c.length<2)return[];const e=Math.min(...c),M=Math.max(...c)-e||1,U=Ga-g.left-g.right,y=be-g.top-g.bottom;return c.map((L,V)=>{var F;return{x:g.left+V/(c.length-1)*U,y:g.top+y-(L-e)/M*y,value:L,label:((F=h.sparklineLabels)==null?void 0:F[V])||`Luna ${V+1}`}})}),b=z(()=>P.value===null||!u.value[P.value]?{x:0,y:0}:u.value[P.value]),_=z(()=>{var c;return P.value===null?"":((c=u.value[P.value])==null?void 0:c.label)||""}),$=z(()=>{var e;if(P.value===null)return"";const c=(e=u.value[P.value])==null?void 0:e.value;return c==null?"-":`${Number(c).toFixed(h.decimals)}${h.unit?` ${h.unit}`:""}`}),w=z(()=>{if(P.value===null||!S.value)return{};const c=S.value.getBoundingClientRect();return{left:`${b.value.x/Ga*c.width}px`,transform:"translateX(-50%)"}}),v=z(()=>{if(!h.thresholds)return"";const c=[];return h.thresholds.threshold_min!==null&&h.thresholds.threshold_min!==void 0&&c.push(`Min: ${h.thresholds.threshold_min}`),h.thresholds.threshold_max!==null&&h.thresholds.threshold_max!==void 0&&c.push(`Max: ${h.thresholds.threshold_max}`),c.join(" | ")}),O=z(()=>{if(!h.sparklineData||h.sparklineData.length<2)return{text:"-",icon:"pi pi-minus",class:"trend-neutral"};const c=h.sparklineData.filter(L=>L!=null);if(c.length<2)return{text:"-",icon:"pi pi-minus",class:"trend-neutral"};const e=c[0],T=c[c.length-1];if(e===0)return T>0?{text:"+∞",icon:"pi pi-arrow-up",class:"trend-up"}:T<0?{text:"-∞",icon:"pi pi-arrow-down",class:"trend-down"}:{text:"0%",icon:"pi pi-minus",class:"trend-neutral"};const M=(T-e)/Math.abs(e)*100,y=`${M>0?"+":""}${M.toFixed(1)}%`;return M>0?{text:y,icon:"pi pi-arrow-up",class:"trend-up"}:M<0?{text:y,icon:"pi pi-arrow-down",class:"trend-down"}:{text:"0%",icon:"pi pi-minus",class:"trend-neutral"}}),k=c=>{if(!u.value.length||!S.value)return;const e=S.value.getBoundingClientRect(),T=c.clientX-e.left,U=T/e.width*Ga;let y=0,L=1/0;u.value.forEach((V,F)=>{const Q=Math.abs(V.x-U);Q{P.value=null};return(c,e)=>(t(),i("div",{class:m(["indicator-item",I.value])},[a("div",il,[qa(s(d.label)+" ",1),d.description?(t(),i("i",{key:0,class:m(["pi desc-toggle",n.value?"pi-chevron-up":"pi-chevron-down"]),onClick:Qt(N,["stop"]),title:"Toggle descriere"},null,2)):l("",!0)]),d.description&&n.value?(t(),i("div",sl,s(d.description),1)):l("",!0),a("div",ll,[a("div",{class:m(["indicator-value",I.value])},s(X.value)+s(d.unit?` ${d.unit}`:""),3),a("div",{class:m(["indicator-status-icon",I.value])},[a("i",{class:m(o.value)},null,2)],2)]),A.value?(t(),i("div",{key:1,class:"sparkline-container",ref_key:"sparklineContainer",ref:S},[(t(),i("svg",{class:"sparkline-svg",viewBox:`0 0 ${Ga} ${be}`,preserveAspectRatio:"none",onMousemove:k,onMouseleave:Z},[a("polyline",{points:C.value,fill:"none",stroke:r.value,"stroke-width":"2","stroke-linecap":"round","stroke-linejoin":"round",class:"sparkline-line"},null,8,rl),P.value!==null?(t(),i("circle",{key:0,cx:b.value.x,cy:b.value.y,r:"4",fill:r.value,class:"sparkline-point"},null,8,ol)):l("",!0)],40,nl)),P.value!==null?(t(),i("div",{key:0,class:"sparkline-tooltip",style:_e(w.value)},[a("div",cl,s(_.value),1),a("div",dl,s($.value),1)],4)):l("",!0)],512)):l("",!0),A.value&&O.value.text!=="-"?(t(),i("div",{key:2,class:m(["yoy-trend",O.value.class])},[a("i",{class:m(O.value.icon)},null,2),a("span",ul,s(O.value.text),1),e[0]||(e[0]=a("span",{class:"trend-label"},"vs 12 luni",-1))],2)):l("",!0),v.value?(t(),i("div",vl,s(v.value),1)):l("",!0)],2))}},ve=ka(pl,[["__scopeId","data-v-2547e9a0"]]),fl={class:"card-header"},ml={class:"period-selector-wrapper"},bl={key:0,class:"loading-state"},_l={key:1,class:"error-state"},hl={key:2,class:"card-content"},kl={key:0,class:"collapsed-view"},yl={class:"key-indicators-grid"},gl={key:0,class:"indicators-grouped"},wl={key:0,class:"indicator-section"},Cl={class:"section-items"},zl={key:0,class:"indicator-row"},xl={key:1,class:"indicator-row"},Sl={key:2,class:"indicator-row"},Dl={class:"sub-indicators-group"},Il={key:0,class:"indicator-row sub-indicator"},Tl={class:"indicator-value"},$l={key:1,class:"indicator-row sub-indicator"},Pl={class:"indicator-value"},Fl={key:2,class:"indicator-row sub-indicator"},Al={class:"indicator-value"},Rl={key:3,class:"indicator-row sub-indicator"},Ml={class:"indicator-value"},Ll={key:1,class:"indicator-section"},Bl={class:"section-items"},Nl={key:0,class:"indicator-row"},Vl={key:1,class:"indicator-row"},Ol={key:2,class:"indicator-row"},El={key:3,class:"indicator-row"},Hl={key:4,class:"indicator-row"},Wl={class:"sub-indicators-group"},jl={key:0,class:"indicator-row sub-indicator"},Xl={class:"indicator-value"},Yl={key:1,class:"indicator-row sub-indicator"},Zl={class:"indicator-value"},Gl={key:2,class:"indicator-row sub-indicator"},Ul={class:"indicator-value"},ql={key:3,class:"indicator-row sub-indicator"},Kl={class:"indicator-value"},Ql={key:4,class:"indicator-row sub-indicator"},Jl={class:"indicator-value"},an={key:5,class:"indicator-row sub-indicator"},en={class:"indicator-value"},tn={key:2,class:"indicator-section"},sn={class:"section-items"},ln={key:0,class:"indicator-row"},nn={key:1,class:"indicator-row"},rn={key:2,class:"indicator-row"},on={key:3,class:"indicator-row"},cn={class:"sub-indicators-group"},dn={key:0,class:"indicator-row sub-indicator"},un={class:"indicator-value"},vn={key:1,class:"indicator-row sub-indicator"},pn={class:"indicator-value"},fn={key:2,class:"indicator-row sub-indicator"},mn={class:"indicator-value"},bn={key:3,class:"indicator-row sub-indicator"},_n={class:"indicator-value"},hn={key:4,class:"indicator-row sub-indicator"},kn={class:"indicator-value"},yn={key:5,class:"indicator-row sub-indicator"},gn={class:"indicator-value"},wn={key:3,class:"indicator-section"},Cn={class:"section-items"},zn={key:0,class:"indicator-row"},xn={key:1,class:"indicator-row"},Sn={key:2,class:"indicator-row"},Dn={key:3,class:"indicator-row"},In={class:"sub-indicators-group"},Tn={key:0,class:"indicator-row sub-indicator"},$n={class:"indicator-value"},Pn={key:1,class:"indicator-row sub-indicator"},Fn={class:"indicator-value"},An={key:2,class:"indicator-row sub-indicator"},Rn={class:"indicator-value"},Mn={key:3,class:"indicator-row sub-indicator"},Ln={class:"indicator-value"},Bn={key:4,class:"indicator-section"},Nn={class:"section-items"},Vn={key:0,class:"indicator-row"},On={key:1,class:"indicator-row"},En={key:2,class:"indicator-row"},Hn={class:"sub-indicators-group"},Wn={key:0,class:"indicator-row sub-indicator"},jn={class:"indicator-value"},Xn={key:1,class:"indicator-row sub-indicator"},Yn={class:"indicator-value"},Zn={key:2,class:"indicator-row sub-indicator"},Gn={class:"indicator-value"},Un={key:3,class:"indicator-row sub-indicator"},qn={class:"indicator-value"},Kn={key:5,class:"indicator-section"},Qn={class:"section-items"},Jn={key:0,class:"indicator-row"},ar={key:1,class:"indicator-row"},er={key:2,class:"indicator-row"},tr={key:3,class:"indicator-row"},ir={key:4,class:"indicator-row"},sr={key:5,class:"indicator-row"},lr={class:"sub-indicators-group"},nr={key:0,class:"indicator-row sub-indicator"},rr={class:"indicator-value"},or={key:1,class:"indicator-row sub-indicator"},cr={class:"indicator-value"},dr={key:2,class:"indicator-row sub-indicator"},ur={class:"indicator-value"},vr={key:3,class:"indicator-row sub-indicator"},pr={class:"indicator-value"},fr={key:4,class:"indicator-row sub-indicator"},mr={class:"indicator-value"},br={key:6,class:"indicator-section"},_r={class:"section-items"},hr={key:0,class:"indicator-row"},kr={class:"sub-indicators-group"},yr={key:0,class:"indicator-row sub-indicator"},gr={class:"indicator-value"},wr={key:1,class:"indicator-row sub-indicator"},Cr={class:"indicator-value"},zr={key:2,class:"indicator-row sub-indicator"},xr={class:"indicator-value"},Sr={key:3,class:"indicator-row sub-indicator"},Dr={class:"indicator-value"},Ir={key:4,class:"indicator-row sub-indicator"},Tr={class:"indicator-value"},$r={key:5,class:"indicator-row sub-indicator"},Pr={class:"indicator-value"},Fr={key:6,class:"indicator-row sub-indicator"},Ar={class:"indicator-value"},Rr={key:7,class:"indicator-section"},Mr={class:"section-items"},Lr={key:0,class:"indicator-row"},Br={key:1,class:"indicator-row"},Nr={class:"sub-indicators-group"},Vr={key:0,class:"indicator-row sub-indicator"},Or={class:"indicator-value"},Er={key:1,class:"indicator-row sub-indicator"},Hr={class:"indicator-value"},Wr={key:2,class:"indicator-row sub-indicator"},jr={class:"indicator-value"},Xr={key:3,class:"card-footer"},Yr=["aria-expanded"],Zr={class:"expand-label"},Gr={key:4,class:"card-footer mobile-footer"},Ur={class:"all-indicators-sheet"},qr={class:"indicator-category"},Kr={class:"category-items"},Qr={key:0,class:"sheet-indicator-item"},Jr={key:1,class:"sheet-indicator-item"},ao={key:2,class:"sheet-indicator-item"},eo={class:"sub-indicators-group-mobile"},to={key:0,class:"sheet-indicator-item sub-item"},io={class:"item-value"},so={key:1,class:"sheet-indicator-item sub-item"},lo={class:"item-value"},no={key:2,class:"sheet-indicator-item sub-item"},ro={class:"item-value"},oo={key:3,class:"sheet-indicator-item sub-item"},co={class:"item-value"},uo={class:"indicator-category"},vo={class:"category-items"},po={key:0,class:"sheet-indicator-item"},fo={key:1,class:"sheet-indicator-item"},mo={key:2,class:"sheet-indicator-item"},bo={key:3,class:"sheet-indicator-item"},_o={key:4,class:"sheet-indicator-item"},ho={class:"sub-indicators-group-mobile"},ko={key:0,class:"sheet-indicator-item sub-item"},yo={class:"item-value"},go={key:1,class:"sheet-indicator-item sub-item"},wo={class:"item-value"},Co={key:2,class:"sheet-indicator-item sub-item"},zo={class:"item-value"},xo={key:3,class:"sheet-indicator-item sub-item"},So={class:"item-value"},Do={key:4,class:"sheet-indicator-item sub-item"},Io={class:"item-value"},To={key:5,class:"sheet-indicator-item sub-item"},$o={class:"item-value"},Po={class:"indicator-category"},Fo={class:"category-items"},Ao={key:0,class:"sheet-indicator-item"},Ro={key:1,class:"sheet-indicator-item"},Mo={key:2,class:"sheet-indicator-item"},Lo={key:3,class:"sheet-indicator-item"},Bo={class:"sub-indicators-group-mobile"},No={key:0,class:"sheet-indicator-item sub-item"},Vo={class:"item-value"},Oo={key:1,class:"sheet-indicator-item sub-item"},Eo={class:"item-value"},Ho={key:2,class:"sheet-indicator-item sub-item"},Wo={class:"item-value"},jo={key:3,class:"sheet-indicator-item sub-item"},Xo={class:"item-value"},Yo={key:4,class:"sheet-indicator-item sub-item"},Zo={class:"item-value"},Go={key:5,class:"sheet-indicator-item sub-item"},Uo={class:"item-value"},qo={class:"indicator-category"},Ko={class:"category-items"},Qo={key:0,class:"sheet-indicator-item"},Jo={key:1,class:"sheet-indicator-item"},ac={key:2,class:"sheet-indicator-item"},ec={key:3,class:"sheet-indicator-item"},tc={class:"sub-indicators-group-mobile"},ic={key:0,class:"sheet-indicator-item sub-item"},sc={class:"item-value"},lc={key:1,class:"sheet-indicator-item sub-item"},nc={class:"item-value"},rc={key:2,class:"sheet-indicator-item sub-item"},oc={class:"item-value"},cc={key:3,class:"sheet-indicator-item sub-item"},dc={class:"item-value"},uc={class:"indicator-category"},vc={class:"category-items"},pc={key:0,class:"sheet-indicator-item"},fc={key:1,class:"sheet-indicator-item"},mc={key:2,class:"sheet-indicator-item"},bc={class:"sub-indicators-group-mobile"},_c={key:0,class:"sheet-indicator-item sub-item"},hc={class:"item-value"},kc={key:1,class:"sheet-indicator-item sub-item"},yc={class:"item-value"},gc={key:2,class:"sheet-indicator-item sub-item"},wc={class:"item-value"},Cc={key:3,class:"sheet-indicator-item sub-item"},zc={class:"item-value"},xc={class:"indicator-category"},Sc={class:"category-items"},Dc={key:0,class:"sheet-indicator-item"},Ic={key:1,class:"sheet-indicator-item"},Tc={class:"item-value"},$c={key:2,class:"sheet-indicator-item"},Pc={class:"item-value"},Fc={key:3,class:"sheet-indicator-item"},Ac={class:"item-value"},Rc={key:4,class:"sheet-indicator-item"},Mc={class:"item-value"},Lc={class:"sub-indicators-group-mobile"},Bc={key:0,class:"sheet-indicator-item sub-indicator"},Nc={class:"item-value"},Vc={key:1,class:"sheet-indicator-item sub-indicator"},Oc={class:"item-value"},Ec={key:2,class:"sheet-indicator-item sub-indicator"},Hc={class:"item-value"},Wc={key:0,class:"indicator-category"},jc={class:"category-items"},Xc={key:0,class:"sheet-indicator-item"},Yc={key:1,class:"sheet-indicator-item"},Zc={key:2,class:"sheet-indicator-item"},Gc={key:3,class:"sheet-indicator-item"},Uc={key:4,class:"sheet-indicator-item"},qc={key:5,class:"sheet-indicator-item"},Kc={class:"sub-indicators-group-mobile"},Qc={key:0,class:"sheet-indicator-item sub-indicator"},Jc={class:"item-value"},ad={key:1,class:"sheet-indicator-item sub-indicator"},ed={class:"item-value"},td={key:2,class:"sheet-indicator-item sub-indicator"},id={class:"item-value"},sd={key:3,class:"sheet-indicator-item sub-indicator"},ld={class:"item-value"},nd={key:1,class:"indicator-category"},rd={class:"category-items"},od={key:0,class:"sheet-indicator-item"},cd={key:1,class:"sheet-indicator-item"},dd={class:"sub-indicators-group-mobile"},ud={key:0,class:"sheet-indicator-item sub-indicator"},vd={class:"item-value"},pd={key:1,class:"sheet-indicator-item sub-indicator"},fd={class:"item-value"},md={key:2,class:"sheet-indicator-item sub-indicator"},bd={class:"item-value"},_d={__name:"FinancialIndicatorsCard",props:{loading:{type:Boolean,default:!1},error:{type:String,default:null},data:{type:Object,default:null},mobile:{type:Boolean,default:!1},initialPeriod:{type:Object,default:null,validator:d=>d===null||typeof d=="object"&&"luna"in d&&"an"in d},cacheInfo:{type:Object,default:()=>({hit:!1,time:0,source:null})}},emits:["period-change"],setup(d,{emit:n}){const N=d,h=n,g=H(!1),S=H(!1),P=H(N.initialPeriod?{luna:N.initialPeriod.luna,an:N.initialPeriod.an}:{luna:null,an:null});za(()=>N.initialPeriod,c=>{var e,T;c&&(c.luna!==((e=P.value)==null?void 0:e.luna)||c.an!==((T=P.value)==null?void 0:T.an))&&(P.value={luna:c.luna,an:c.an})},{deep:!0});const ea=()=>{g.value=!g.value},X=z(()=>{const c=new Date,e=c.getFullYear(),T=c.getMonth()+1,M=[];for(let U=0;U<12;U++){let y=T-U,L=e;y<=0&&(y+=12,L-=1);const V=new Date(L,y-1,1).toLocaleDateString("ro-RO",{month:"long"});M.push({label:`${V.charAt(0).toUpperCase()+V.slice(1)} ${L}`,value:{luna:y,an:L}})}return M}),A=H({lichiditate:!1,eficienta:!1,risc:!1,cashflow:!1,dinamica:!1,profitabilitate:!1,altman:!1,solvabilitate:!1}),R=c=>{A.value[c]=!A.value[c]},I=z(()=>{var c;return(c=N.data)==null?void 0:c.lichiditate}),o=z(()=>{var c;return(c=N.data)==null?void 0:c.eficienta}),r=z(()=>{var c;return(c=N.data)==null?void 0:c.risc}),C=z(()=>{var c;return(c=N.data)==null?void 0:c.cash_flow}),u=z(()=>{var c;return(c=N.data)==null?void 0:c.dinamica}),b=z(()=>{var c;return(c=N.data)==null?void 0:c.altman_zscore}),_=z(()=>{var c;return(c=N.data)==null?void 0:c.profitabilitate}),$=z(()=>{var c;return(c=N.data)==null?void 0:c.solvabilitate});z(()=>{var T;const c=[],e=(M,U,y,L,V="",F=2)=>{(y==null?void 0:y.value)!==null&&(y==null?void 0:y.value)!==void 0&&c.push({indicator:M,category:U,description:L,value:y.value,formattedValue:`${Number(y.value).toFixed(F)}${V?` ${V}`:""}`,status:y.status,sparklineData:y.sparkline_data||[],thresholds:y})};return I.value&&(e("Lichiditate Curentă","Lichiditate",I.value.lichiditate_curenta,"Capacitatea de acoperire a datoriilor curente. Active Curente / Datorii Curente • Ideal: >1.5","",2),e("Quick Ratio","Lichiditate",I.value.lichiditate_imediata,"Capacitatea de plată imediată (fără stocuri). (Trezorerie + Clienți) / Furnizori • Ideal: >1.0","",2),e("Cash Ratio","Lichiditate",I.value.lichiditate_vedere,"Numerar disponibil pentru plăți imediate. Trezorerie / Furnizori • Ideal: >0.2","",2)),o.value&&(e("DSO (Zile încasare)","Eficiență",o.value.dso,"Câte zile durează încasarea creanțelor. (Sold Clienți / Facturări) × 30 • Ideal: <45 zile","zile",0),e("DPO (Zile plată)","Eficiență",o.value.dpo,"Câte zile durează plata furnizorilor. (Sold Furnizori / Achiziții) × 30 • Ideal: 30-60 zile","zile",0),e("Ciclu Conversie Cash","Eficiență",o.value.cash_conversion_cycle,"Timpul de conversie în numerar. DSO - DPO • Ideal: cât mai mic (sau negativ)","zile",0),e("Rata Încasare","Eficiență",o.value.rata_incasare,"Procentul facturilor încasate. Încasări / Facturări × 100 • Ideal: >85%","%",1),e("Rata Plată","Eficiență",o.value.rata_plata,"Disciplina de plată către furnizori. Plăți / Achiziții × 100 • Ideal: 70-90%","%",1)),r.value&&(e("Creanțe Restante","Risc",r.value.creante_restante_pct,"Procentul facturilor depășite la plată. Restante / Total × 100 • Ideal: <20%","%",1),e("Creanțe >90 zile","Risc",r.value.creante_90plus_pct,"Creanțe vechi cu risc mare de neîncasare. Restant 90+ / Total × 100 • Ideal: <5%","%",1),e("Datorii Restante","Risc",r.value.datorii_restante_pct,"Disciplina de plată față de furnizori. Restante / Total × 100 • Ideal: <10%","%",1),e("Datorii/Trezorerie","Risc",r.value.raport_datorii_trezorerie,"Câte ori datoriile depășesc numerarul disponibil. Furnizori / Trezorerie • Ideal: <3.0x","x",2)),C.value&&(e("Flux Net Lunar","Cash Flow",C.value.flux_net_lunar,"Numerar generat (+) sau consumat (-) în lună. Încasări - Plăți • Ideal: pozitiv","RON",0),e("Cash Flow YTD","Cash Flow",C.value.cash_flow_ytd,"Flux cumulat de la început de an. Σ(Încasări - Plăți) • Ideal: pozitiv","RON",0),e("Flux Net YoY","Cash Flow",C.value.flux_net_yoy_pct,"Evoluția fluxului vs anul precedent. (CF_curent - CF_prev) / CF_prev × 100 • Ideal: >0%","%",1),e("Acoperire Cash Flow","Cash Flow",C.value.acoperire_cash_flow,"Capacitate plată datorii din cash flow. Cash Flow / Datorii Restante • Ideal: >0.5x","x",2)),u.value&&(e("Creștere Vânzări YoY","Dinamică",u.value.crestere_vanzari_yoy,"Creșterea Cifrei de Afaceri vs anul trecut (Clasa 7, fără TVA). (CA_curent - CA_prev) / CA_prev × 100 • Ideal: >5%","%",1),e("Creștere Achiziții YoY","Dinamică",u.value.crestere_achizitii_yoy,"Evoluția achizițiilor totale (stocuri + cheltuieli directe, fără TVA). Trebuie corelată cu vânzările.","%",1),e("Marjă Implicită","Dinamică",u.value.marja_implicita,"Profitabilitate brută estimată. (CA - Achiziții totale) / CA × 100 • Ideal: >20%","%",1)),(T=b.value)!=null&&T.zscore&&e("Altman Z-Score","Z-Score",b.value.zscore,"Scor predicție faliment. >2.6=sigur, 1.1-2.6=gri, <1.1=risc • Formula: 6.56×X1+3.26×X2+6.72×X3+1.05×X4","",2),_.value&&(e("Cifra de Afaceri","Profitabilitate",_.value.cifra_afaceri,"Total venituri din activitatea operațională. Clasa 70x • Ideal: în creștere","RON",0),e("Cheltuieli Totale","Profitabilitate",_.value.cheltuieli_totale,"Total cheltuieli operaționale. Clasa 60x (fără dobânzi)","RON",0),e("Profit Brut","Profitabilitate",_.value.profit_brut,"EBIT = Venituri - Cheltuieli operaționale • Ideal: pozitiv","RON",0),e("Marja Profit","Profitabilitate",_.value.marja_profit_brut,"Procentul de profit din vânzări. Profit / Venituri × 100 • Ideal: >10%","%",1),e("ROA","Profitabilitate",_.value.roa,"Return on Assets. Profit / Active Totale × 100 • Ideal: >5%","%",2),e("ROE","Profitabilitate",_.value.roe,"Return on Equity. Profit / Capital Propriu × 100 • Ideal: >10%","%",2)),$.value&&(e("Activ Net Contabil (ANC)","Solvabilitate",$.value.activ_net_contabil,"Total Active - Total Datorii. Valoarea netă a firmei. • Ideal: pozitiv","RON",2),e("Rata ANC / Capital Social","Solvabilitate",$.value.rata_anc_capital,"ANC / Capital Social × 100. Sub 50% → restricții legale (din 2026). • Ideal: ≥100%","%",1)),c});const w=(c,e=2)=>c==null?"-":Number(c).toFixed(e),v=c=>{if(c==null)return"-";const e=Number(c),T=Math.abs(e).toLocaleString("ro-RO",{minimumFractionDigits:0,maximumFractionDigits:0});return`${e<0?"-":e>0?"+":""}${T}`},O=c=>({safe:"good",grey:"warning",distress:"danger"})[c]||c||"neutral",k=c=>`status-${O(c)}`,Z=()=>{P.value&&h("period-change",P.value)};return(c,e)=>{var T,M,U,y,L,V,F,Q,ta,ya,oa,da,Ta,Qa,Ma,$a,Ja,Pa,Fa,ae,ee,ga,te,La,Ba,Na,Va,Oa,Ea,Ha,Wa,wa,ja,ie,se,le,ne,Xa,Ya,Aa,ua,re,oe,ce,de,xa,f,p,x,E,j,W,Y,D,B,G,ia,la,va,pa,fa,ma,ba,_a,ha,Za,he,ke,ye,ge,we,Ce,ze,xe,Se,De,Ie,Te,$e,Pe,Fe,Ae,Re;return t(),i("div",{class:m(["financial-indicators-card",{"mobile-layout":d.mobile}])},[a("div",fl,[e[19]||(e[19]=a("h3",{class:"card-title"}," Indicatori Financiari ",-1)),a("div",ml,[q(sa(ni),{modelValue:P.value,"onUpdate:modelValue":e[0]||(e[0]=na=>P.value=na),options:X.value,optionLabel:"label",optionValue:"value",placeholder:"Selectează perioada",class:"period-dropdown",disabled:d.loading,onChange:Z},null,8,["modelValue","options","disabled"])])]),d.loading?(t(),i("div",bl,[...e[20]||(e[20]=[a("div",{class:"loading-spinner"},null,-1),a("p",null,"Se încarcă indicatorii financiari...",-1)])])):d.error?(t(),i("div",_l,[e[21]||(e[21]=a("i",{class:"pi pi-exclamation-triangle error-icon"},null,-1)),a("p",null,s(d.error),1)])):(t(),i("div",hl,[g.value?l("",!0):(t(),i("div",kl,[a("div",yl,[(T=I.value)!=null&&T.lichiditate_imediata?(t(),Da(ve,{key:0,label:"Lichiditate Imediată",description:"Capacitatea de plată imediată (fără stocuri). (Trezorerie + Clienți) / Furnizori • Ideal: >1.0",value:I.value.lichiditate_imediata.value,status:I.value.lichiditate_imediata.status,"sparkline-data":I.value.lichiditate_imediata.sparkline_data,"sparkline-labels":I.value.lichiditate_imediata.sparkline_labels,thresholds:I.value.lichiditate_imediata,decimals:2},null,8,["value","status","sparkline-data","sparkline-labels","thresholds"])):l("",!0),(M=o.value)!=null&&M.dso?(t(),Da(ve,{key:1,label:"DSO (Zile încasare)",description:"Câte zile durează încasarea creanțelor. (Sold Clienți / Facturări) × 30 • Ideal: <45 zile",value:o.value.dso.value,unit:"zile",status:o.value.dso.status,"sparkline-data":o.value.dso.sparkline_data,"sparkline-labels":o.value.dso.sparkline_labels,thresholds:o.value.dso,decimals:0},null,8,["value","status","sparkline-data","sparkline-labels","thresholds"])):l("",!0),(U=r.value)!=null&&U.creante_restante_pct?(t(),Da(ve,{key:2,label:"Creanțe Restante",description:"Procentul facturilor depășite la plată. Restante / Total Clienți × 100 • Ideal: <20%",value:r.value.creante_restante_pct.value,unit:"%",status:r.value.creante_restante_pct.status,"sparkline-data":r.value.creante_restante_pct.sparkline_data,"sparkline-labels":r.value.creante_restante_pct.sparkline_labels,thresholds:r.value.creante_restante_pct,decimals:1},null,8,["value","status","sparkline-data","sparkline-labels","thresholds"])):l("",!0),(y=b.value)!=null&&y.zscore?(t(),Da(ve,{key:3,label:"Altman Z-Score",description:"Scor de sănătate financiară. 6.56×X1 + 3.26×X2 + 6.72×X3 + 1.05×X4 • >2.6 = sigur, <1.1 = risc",value:b.value.zscore.value,status:b.value.zscore.status,"sparkline-data":b.value.zscore.sparkline_data,"sparkline-labels":b.value.zscore.sparkline_labels,thresholds:b.value.zscore,decimals:2},null,8,["value","status","sparkline-data","sparkline-labels","thresholds"])):l("",!0)])])),a("div",{class:m(["expanded-view",{"is-expanded":g.value}])},[g.value?(t(),i("div",gl,[I.value?(t(),i("div",wl,[a("h4",{class:"section-title",onClick:e[1]||(e[1]=na=>R("lichiditate"))},[e[22]||(e[22]=a("span",null,"Lichiditate",-1)),a("i",{class:m(["pi",A.value.lichiditate?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",Cl,[(L=I.value)!=null&&L.lichiditate_curenta?(t(),i("div",zl,[e[23]||(e[23]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Lichiditate Curentă"),a("span",{class:"indicator-desc"},"Capacitatea de acoperire a datoriilor curente. Active Curente / Datorii Curente • Ideal: >1.5")],-1)),a("span",{class:m(["indicator-value",k(I.value.lichiditate_curenta.status)])},s(w(I.value.lichiditate_curenta.value,2)),3)])):l("",!0),(V=I.value)!=null&&V.lichiditate_imediata?(t(),i("div",xl,[e[24]||(e[24]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Lichiditate Imediată"),a("span",{class:"indicator-desc"},"Capacitatea de plată imediată (fără stocuri). (Trezorerie + Clienți) / Furnizori • Ideal: >1.0")],-1)),a("span",{class:m(["indicator-value",k(I.value.lichiditate_imediata.status)])},s(w(I.value.lichiditate_imediata.value,2)),3)])):l("",!0),(F=I.value)!=null&&F.lichiditate_vedere?(t(),i("div",Sl,[e[25]||(e[25]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Lichiditate la Vedere"),a("span",{class:"indicator-desc"},"Numerar disponibil pentru plăți imediate. Trezorerie / Furnizori • Ideal: >0.2")],-1)),a("span",{class:m(["indicator-value",k(I.value.lichiditate_vedere.status)])},s(w(I.value.lichiditate_vedere.value,2)),3)])):l("",!0),K(a("div",Dl,[(Q=I.value)!=null&&Q.active_curente?(t(),i("div",Il,[e[26]||(e[26]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Active Curente"),a("span",{class:"indicator-desc"},"Stocuri + Creanțe + Disponibilități")],-1)),a("span",Tl,s(v(I.value.active_curente.value)),1)])):l("",!0),(ta=I.value)!=null&&ta.disponibilitati?(t(),i("div",$l,[e[27]||(e[27]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Disponibilități"),a("span",{class:"indicator-desc"},"Bancă (512x) + Casă (531x)")],-1)),a("span",Pl,s(v(I.value.disponibilitati.value)),1)])):l("",!0),(ya=I.value)!=null&&ya.creante?(t(),i("div",Fl,[e[28]||(e[28]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Creanțe"),a("span",{class:"indicator-desc"},"Clienți (411x) + Debitori (461x)")],-1)),a("span",Al,s(v(I.value.creante.value)),1)])):l("",!0),(oa=I.value)!=null&&oa.datorii_curente?(t(),i("div",Rl,[e[29]||(e[29]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Datorii Curente"),a("span",{class:"indicator-desc"},"Furnizori + TVA + Salarii + etc.")],-1)),a("span",Ml,s(v(I.value.datorii_curente.value)),1)])):l("",!0)],512),[[J,A.value.lichiditate]])])])):l("",!0),o.value?(t(),i("div",Ll,[a("h4",{class:"section-title",onClick:e[2]||(e[2]=na=>R("eficienta"))},[e[30]||(e[30]=a("span",null,"Eficiență",-1)),a("i",{class:m(["pi",A.value.eficienta?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",Bl,[(da=o.value)!=null&&da.dso?(t(),i("div",Nl,[e[31]||(e[31]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"DSO (Zile încasare)"),a("span",{class:"indicator-desc"},"Câte zile durează încasarea creanțelor. (Sold Clienți / Facturări) × 30 • Ideal: <45 zile")],-1)),a("span",{class:m(["indicator-value",k(o.value.dso.status)])},s(w(o.value.dso.value,0))+" zile ",3)])):l("",!0),(Ta=o.value)!=null&&Ta.dpo?(t(),i("div",Vl,[e[32]||(e[32]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"DPO (Zile plată)"),a("span",{class:"indicator-desc"},"Câte zile durează plata furnizorilor. (Sold Furnizori / Achiziții) × 30 • Ideal: 30-60 zile")],-1)),a("span",{class:m(["indicator-value",k(o.value.dpo.status)])},s(w(o.value.dpo.value,0))+" zile ",3)])):l("",!0),(Qa=o.value)!=null&&Qa.cash_conversion_cycle?(t(),i("div",Ol,[e[33]||(e[33]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Ciclu Conversie Cash"),a("span",{class:"indicator-desc"},"Timpul de conversie în numerar. DSO - DPO • Ideal: cât mai mic (sau negativ)")],-1)),a("span",{class:m(["indicator-value",k(o.value.cash_conversion_cycle.status)])},s(w(o.value.cash_conversion_cycle.value,0))+" zile ",3)])):l("",!0),(Ma=o.value)!=null&&Ma.rata_incasare?(t(),i("div",El,[e[34]||(e[34]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Rata Încasare"),a("span",{class:"indicator-desc"},"Procentul facturilor încasate. Încasări / Facturări × 100 • Ideal: >85%")],-1)),a("span",{class:m(["indicator-value",k(o.value.rata_incasare.status)])},s(w(o.value.rata_incasare.value,1))+"% ",3)])):l("",!0),($a=o.value)!=null&&$a.rata_plata?(t(),i("div",Hl,[e[35]||(e[35]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Rata Plată"),a("span",{class:"indicator-desc"},"Disciplina de plată către furnizori. Plăți / Achiziții × 100 • Ideal: 70-90%")],-1)),a("span",{class:m(["indicator-value",k(o.value.rata_plata.status)])},s(w(o.value.rata_plata.value,1))+"% ",3)])):l("",!0),K(a("div",Wl,[(Ja=o.value)!=null&&Ja.sold_clienti?(t(),i("div",jl,[e[36]||(e[36]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Sold Clienți"),a("span",{class:"indicator-desc"},"Sold clienți la final de lună")],-1)),a("span",Xl,s(v(o.value.sold_clienti.value)),1)])):l("",!0),(Pa=o.value)!=null&&Pa.facturari_lunare?(t(),i("div",Yl,[e[37]||(e[37]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Facturări Lunare"),a("span",{class:"indicator-desc"},"Media facturărilor (3 luni)")],-1)),a("span",Zl,s(v(o.value.facturari_lunare.value)),1)])):l("",!0),(Fa=o.value)!=null&&Fa.sold_furnizori?(t(),i("div",Gl,[e[38]||(e[38]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Sold Furnizori"),a("span",{class:"indicator-desc"},"Sold furnizori la final de lună")],-1)),a("span",Ul,s(v(o.value.sold_furnizori.value)),1)])):l("",!0),(ae=o.value)!=null&&ae.achizitii_lunare?(t(),i("div",ql,[e[39]||(e[39]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Achiziții Lunare"),a("span",{class:"indicator-desc"},"Media achizițiilor (3 luni)")],-1)),a("span",Kl,s(v(o.value.achizitii_lunare.value)),1)])):l("",!0),(ee=o.value)!=null&&ee.incasari_luna?(t(),i("div",Ql,[e[40]||(e[40]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Încasări Lunare"),a("span",{class:"indicator-desc"},"Media încasărilor (3 luni)")],-1)),a("span",Jl,s(v(o.value.incasari_luna.value)),1)])):l("",!0),(ga=o.value)!=null&&ga.plati_luna?(t(),i("div",an,[e[41]||(e[41]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Plăți Lunare"),a("span",{class:"indicator-desc"},"Media plăților (3 luni)")],-1)),a("span",en,s(v(o.value.plati_luna.value)),1)])):l("",!0)],512),[[J,A.value.eficienta]])])])):l("",!0),r.value?(t(),i("div",tn,[a("h4",{class:"section-title",onClick:e[3]||(e[3]=na=>R("risc"))},[e[42]||(e[42]=a("span",null,"Risc",-1)),a("i",{class:m(["pi",A.value.risc?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",sn,[(te=r.value)!=null&&te.creante_restante_pct?(t(),i("div",ln,[e[43]||(e[43]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Creanțe Restante"),a("span",{class:"indicator-desc"},"Procentul facturilor depășite la plată. Restante / Total × 100 • Ideal: <20%")],-1)),a("span",{class:m(["indicator-value",k(r.value.creante_restante_pct.status)])},s(w(r.value.creante_restante_pct.value,1))+"% ",3)])):l("",!0),(La=r.value)!=null&&La.creante_90plus_pct?(t(),i("div",nn,[e[44]||(e[44]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Creanțe >90 zile"),a("span",{class:"indicator-desc"},"Creanțe vechi cu risc mare de neîncasare. Restant 90+ / Total × 100 • Ideal: <5%")],-1)),a("span",{class:m(["indicator-value",k(r.value.creante_90plus_pct.status)])},s(w(r.value.creante_90plus_pct.value,1))+"% ",3)])):l("",!0),(Ba=r.value)!=null&&Ba.datorii_restante_pct?(t(),i("div",rn,[e[45]||(e[45]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Datorii Restante"),a("span",{class:"indicator-desc"},"Disciplina de plată către furnizori. Restante / Total × 100 • Ideal: <10%")],-1)),a("span",{class:m(["indicator-value",k(r.value.datorii_restante_pct.status)])},s(w(r.value.datorii_restante_pct.value,1))+"% ",3)])):l("",!0),(Na=r.value)!=null&&Na.raport_datorii_trezorerie?(t(),i("div",on,[e[46]||(e[46]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Datorii/Trezorerie"),a("span",{class:"indicator-desc"},"Câte lei de datorii pe fiecare leu în casă. Furnizori / Trezorerie • Ideal: <3.0")],-1)),a("span",{class:m(["indicator-value",k(r.value.raport_datorii_trezorerie.status)])},s(w(r.value.raport_datorii_trezorerie.value,2))+"x ",3)])):l("",!0),K(a("div",cn,[(Va=r.value)!=null&&Va.total_clienti?(t(),i("div",dn,[e[47]||(e[47]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Total Clienți"),a("span",{class:"indicator-desc"},"Sold total clienți (411x)")],-1)),a("span",un,s(v(r.value.total_clienti.value)),1)])):l("",!0),(Oa=r.value)!=null&&Oa.clienti_restanti?(t(),i("div",vn,[e[48]||(e[48]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Clienți Restanți"),a("span",{class:"indicator-desc"},"Sold clienți cu facturi restante")],-1)),a("span",pn,s(v(r.value.clienti_restanti.value)),1)])):l("",!0),(Ea=r.value)!=null&&Ea.clienti_90plus?(t(),i("div",fn,[e[49]||(e[49]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Clienți >90 zile"),a("span",{class:"indicator-desc"},"Sold clienți restant >90 zile")],-1)),a("span",mn,s(v(r.value.clienti_90plus.value)),1)])):l("",!0),(Ha=r.value)!=null&&Ha.total_furnizori?(t(),i("div",bn,[e[50]||(e[50]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Total Furnizori"),a("span",{class:"indicator-desc"},"Sold total furnizori (401x)")],-1)),a("span",_n,s(v(r.value.total_furnizori.value)),1)])):l("",!0),(Wa=r.value)!=null&&Wa.furnizori_restanti?(t(),i("div",hn,[e[51]||(e[51]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Furnizori Restanți"),a("span",{class:"indicator-desc"},"Sold furnizori cu facturi restante")],-1)),a("span",kn,s(v(r.value.furnizori_restanti.value)),1)])):l("",!0),(wa=r.value)!=null&&wa.trezorerie?(t(),i("div",yn,[e[52]||(e[52]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Trezorerie"),a("span",{class:"indicator-desc"},"Disponibilități (512x + 531x)")],-1)),a("span",gn,s(v(r.value.trezorerie.value)),1)])):l("",!0)],512),[[J,A.value.risc]])])])):l("",!0),C.value?(t(),i("div",wn,[a("h4",{class:"section-title",onClick:e[4]||(e[4]=na=>R("cashflow"))},[e[53]||(e[53]=a("span",null,"Cash Flow",-1)),a("i",{class:m(["pi",A.value.cashflow?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",Cn,[(ja=C.value)!=null&&ja.flux_net_lunar?(t(),i("div",zn,[e[54]||(e[54]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Flux Net Lunar"),a("span",{class:"indicator-desc"},"Cash generat sau consumat luna curentă. Încasări - Plăți • Ideal: >0 (pozitiv)")],-1)),a("span",{class:m(["indicator-value",k(C.value.flux_net_lunar.status)])},s(v(C.value.flux_net_lunar.value)),3)])):l("",!0),(ie=C.value)!=null&&ie.cash_flow_ytd?(t(),i("div",xn,[e[55]||(e[55]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Cash Flow YTD"),a("span",{class:"indicator-desc"},"Flux cumulat de la începutul anului. Σ(Încasări - Plăți) • Ideal: pozitiv")],-1)),a("span",{class:m(["indicator-value",k(C.value.cash_flow_ytd.status)])},s(v(C.value.cash_flow_ytd.value)),3)])):l("",!0),(se=C.value)!=null&&se.flux_net_yoy_pct?(t(),i("div",Sn,[e[56]||(e[56]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Flux Net YoY"),a("span",{class:"indicator-desc"},"Evoluția față de anul trecut. (CF curent - CF anterior) / CF anterior × 100 • Ideal: >0%")],-1)),a("span",{class:m(["indicator-value",k(C.value.flux_net_yoy_pct.status)])},s(w(C.value.flux_net_yoy_pct.value,1))+"% ",3)])):l("",!0),(le=C.value)!=null&&le.acoperire_cash_flow?(t(),i("div",Dn,[e[57]||(e[57]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Acoperire CF"),a("span",{class:"indicator-desc"},"Capacitatea de plată din flux. Cash Flow / Datorii Restante • Ideal: >0.5")],-1)),a("span",{class:m(["indicator-value",k(C.value.acoperire_cash_flow.status)])},s(w(C.value.acoperire_cash_flow.value,2))+"x ",3)])):l("",!0),K(a("div",In,[(ne=C.value)!=null&&ne.incasari_luna?(t(),i("div",Tn,[e[58]||(e[58]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Încasări Luna"),a("span",{class:"indicator-desc"},"Încasări luna curentă")],-1)),a("span",$n,s(v(C.value.incasari_luna.value)),1)])):l("",!0),(Xa=C.value)!=null&&Xa.plati_luna?(t(),i("div",Pn,[e[59]||(e[59]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Plăți Luna"),a("span",{class:"indicator-desc"},"Plăți luna curentă")],-1)),a("span",Fn,s(v(C.value.plati_luna.value)),1)])):l("",!0),(Ya=C.value)!=null&&Ya.cf_an_precedent?(t(),i("div",An,[e[60]||(e[60]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ CF An Precedent"),a("span",{class:"indicator-desc"},"Cash Flow YTD an precedent")],-1)),a("span",Rn,s(v(C.value.cf_an_precedent.value)),1)])):l("",!0),(Aa=C.value)!=null&&Aa.datorii_restante?(t(),i("div",Mn,[e[61]||(e[61]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Datorii Restante"),a("span",{class:"indicator-desc"},"Datorii cu scadență depășită")],-1)),a("span",Ln,s(v(C.value.datorii_restante.value)),1)])):l("",!0)],512),[[J,A.value.cashflow]])])])):l("",!0),u.value?(t(),i("div",Bn,[a("h4",{class:"section-title",onClick:e[5]||(e[5]=na=>R("dinamica"))},[e[62]||(e[62]=a("span",null,"Dinamică",-1)),a("i",{class:m(["pi",A.value.dinamica?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",Nn,[(ua=u.value)!=null&&ua.crestere_vanzari_yoy?(t(),i("div",Vn,[e[63]||(e[63]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Creștere Vânzări YoY"),a("span",{class:"indicator-desc"},"Trendul vânzărilor față de anul trecut. (Vânz curent - Vânz anterior) / Vânz anterior × 100 • Ideal: >5%")],-1)),a("span",{class:m(["indicator-value",k(u.value.crestere_vanzari_yoy.status)])},s(w(u.value.crestere_vanzari_yoy.value,1))+"% ",3)])):l("",!0),(re=u.value)!=null&&re.crestere_achizitii_yoy?(t(),i("div",On,[e[64]||(e[64]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Creștere Achiziții YoY"),a("span",{class:"indicator-desc"},"Trendul achizițiilor față de anul trecut. (Ach curent - Ach anterior) / Ach anterior × 100 • Corelat cu vânzări")],-1)),a("span",{class:m(["indicator-value",k(u.value.crestere_achizitii_yoy.status)])},s(w(u.value.crestere_achizitii_yoy.value,1))+"% ",3)])):l("",!0),(oe=u.value)!=null&&oe.marja_implicita?(t(),i("div",En,[e[65]||(e[65]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Marjă Implicită"),a("span",{class:"indicator-desc"},"Profitabilitatea brută estimată. (Vânzări - Achiziții) / Vânzări × 100 • Ideal: >20%")],-1)),a("span",{class:m(["indicator-value",k(u.value.marja_implicita.status)])},s(w(u.value.marja_implicita.value,1))+"% ",3)])):l("",!0),K(a("div",Hn,[(ce=u.value)!=null&&ce.vanzari_an_curent?(t(),i("div",Wn,[e[66]||(e[66]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Cifra de Afaceri An Curent"),a("span",{class:"indicator-desc"},"Clasa 7 (70x) fără TVA")],-1)),a("span",jn,s(v(u.value.vanzari_an_curent.value)),1)])):l("",!0),(de=u.value)!=null&&de.vanzari_an_precedent?(t(),i("div",Xn,[e[67]||(e[67]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Cifra de Afaceri An Precedent"),a("span",{class:"indicator-desc"},"Clasa 7 (70x) fără TVA")],-1)),a("span",Yn,s(v(u.value.vanzari_an_precedent.value)),1)])):l("",!0),(xa=u.value)!=null&&xa.achizitii_an_curent?(t(),i("div",Zn,[e[68]||(e[68]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Achiziții Totale An Curent"),a("span",{class:"indicator-desc"},"Stocuri + cheltuieli directe, fără TVA")],-1)),a("span",Gn,s(v(u.value.achizitii_an_curent.value)),1)])):l("",!0),(f=u.value)!=null&&f.achizitii_an_precedent?(t(),i("div",Un,[e[69]||(e[69]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Achiziții Totale An Precedent"),a("span",{class:"indicator-desc"},"Stocuri + cheltuieli directe, fără TVA")],-1)),a("span",qn,s(v(u.value.achizitii_an_precedent.value)),1)])):l("",!0)],512),[[J,A.value.dinamica]])])])):l("",!0),_.value?(t(),i("div",Kn,[a("h4",{class:"section-title",onClick:e[6]||(e[6]=na=>R("profitabilitate"))},[e[70]||(e[70]=a("span",null,"Profitabilitate",-1)),a("i",{class:m(["pi",A.value.profitabilitate?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",Qn,[(p=_.value)!=null&&p.cifra_afaceri?(t(),i("div",Jn,[e[71]||(e[71]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Cifra de Afaceri"),a("span",{class:"indicator-desc"},"Total venituri din activitatea operațională. Clasa 70x • Ideal: în creștere")],-1)),a("span",{class:m(["indicator-value",k(_.value.cifra_afaceri.status)])},s(v(_.value.cifra_afaceri.value)),3)])):l("",!0),(x=_.value)!=null&&x.cheltuieli_totale?(t(),i("div",ar,[e[72]||(e[72]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Cheltuieli Totale"),a("span",{class:"indicator-desc"},"Operaționale + Financiare. Clasa 60x-68x")],-1)),a("span",{class:m(["indicator-value",k(_.value.cheltuieli_totale.status)])},s(v(_.value.cheltuieli_totale.value)),3)])):l("",!0),(E=_.value)!=null&&E.profit_brut?(t(),i("div",er,[e[73]||(e[73]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Profit Brut (EBIT)"),a("span",{class:"indicator-desc"},"Venituri - Cheltuieli operaționale • Ideal: pozitiv")],-1)),a("span",{class:m(["indicator-value",k(_.value.profit_brut.status)])},s(v(_.value.profit_brut.value)),3)])):l("",!0),(j=_.value)!=null&&j.marja_profit_brut?(t(),i("div",tr,[e[74]||(e[74]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Marja Profit"),a("span",{class:"indicator-desc"},"Procentul de profit din vânzări. Profit / Venituri × 100 • Ideal: >10%")],-1)),a("span",{class:m(["indicator-value",k(_.value.marja_profit_brut.status)])},s(w(_.value.marja_profit_brut.value,1))+"% ",3)])):l("",!0),(W=_.value)!=null&&W.roa?(t(),i("div",ir,[e[75]||(e[75]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Randament Active (ROA)"),a("span",{class:"indicator-desc"},"Profit / Active Totale × 100 • Ideal: >5%")],-1)),a("span",{class:m(["indicator-value",k(_.value.roa.status)])},s(w(_.value.roa.value,2))+"% ",3)])):l("",!0),(Y=_.value)!=null&&Y.roe?(t(),i("div",sr,[e[76]||(e[76]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Randament Capitaluri (ROE)"),a("span",{class:"indicator-desc"},"Profit / Capital Propriu × 100 • Ideal: >10%")],-1)),a("span",{class:m(["indicator-value",k(_.value.roe.status)])},s(w(_.value.roe.value,2))+"% ",3)])):l("",!0),K(a("div",lr,[(D=_.value)!=null&&D.cheltuieli_operationale?(t(),i("div",nr,[e[77]||(e[77]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Cheltuieli Operaționale"),a("span",{class:"indicator-desc"},"Clasa 60x-65x + 68x (fără dobânzi 66x). Cheltuieli din activitatea curentă.")],-1)),a("span",rr,s(v(_.value.cheltuieli_operationale.value)),1)])):l("",!0),(B=_.value)!=null&&B.cheltuieli_financiare?(t(),i("div",or,[e[78]||(e[78]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Cheltuieli Financiare"),a("span",{class:"indicator-desc"},"Clasa 66x. Dobânzi, diferențe de curs valutar, etc.")],-1)),a("span",cr,s(v(_.value.cheltuieli_financiare.value)),1)])):l("",!0),(G=_.value)!=null&&G.venituri?(t(),i("div",dr,[e[79]||(e[79]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Venituri (Clasa 7)"),a("span",{class:"indicator-desc"},"Total venituri pentru verificare calcul EBIT")],-1)),a("span",ur,s(v(_.value.venituri.value)),1)])):l("",!0),(ia=_.value)!=null&&ia.active_totale?(t(),i("div",vr,[e[80]||(e[80]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Active Totale"),a("span",{class:"indicator-desc"},"Baza calcul ROA. Active Imobilizate + Active Curente")],-1)),a("span",pr,s(v(_.value.active_totale.value)),1)])):l("",!0),(la=_.value)!=null&&la.capitaluri_proprii?(t(),i("div",fr,[e[81]||(e[81]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Capitaluri Proprii"),a("span",{class:"indicator-desc"},"Baza calcul ROE. Capital Social (101-106) + Rezultat (117,121)")],-1)),a("span",mr,s(v(_.value.capitaluri_proprii.value)),1)])):l("",!0)],512),[[J,A.value.profitabilitate]])])])):l("",!0),b.value?(t(),i("div",br,[a("h4",{class:"section-title",onClick:e[7]||(e[7]=na=>R("altman"))},[e[82]||(e[82]=a("span",null,"Altman Z-Score",-1)),a("i",{class:m(["pi",A.value.altman?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",_r,[(va=b.value)!=null&&va.zscore?(t(),i("div",hr,[e[83]||(e[83]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Z-Score"),a("span",{class:"indicator-desc"},"Scor de sănătate financiară. 6.56×X1 + 3.26×X2 + 6.72×X3 + 1.05×X4 • >2.6 = sigur, <1.1 = risc")],-1)),a("span",{class:m(["indicator-value",k(b.value.zscore.status)])},s(w(b.value.zscore.value,2)),3)])):l("",!0),K(a("div",kr,[(pa=b.value)!=null&&pa.x1?(t(),i("div",yr,[e[84]||(e[84]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ X1 (Lichiditate)"),a("span",{class:"indicator-desc"},"Capital de lucru / Active totale. Măsoară lichiditatea pe termen scurt.")],-1)),a("span",gr,s(w(b.value.x1.value,3)),1)])):l("",!0),(fa=b.value)!=null&&fa.x2?(t(),i("div",wr,[e[85]||(e[85]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ X2 (Profitabilitate)"),a("span",{class:"indicator-desc"},"Rezultat reportat / Active totale. Măsoară profiturile reinvestite.")],-1)),a("span",Cr,s(w(b.value.x2.value,3)),1)])):l("",!0),(ma=b.value)!=null&&ma.x3?(t(),i("div",zr,[e[86]||(e[86]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ X3 (Eficiență)"),a("span",{class:"indicator-desc"},"EBIT / Active totale. Măsoară productivitatea activelor.")],-1)),a("span",xr,s(w(b.value.x3.value,3)),1)])):l("",!0),(ba=b.value)!=null&&ba.x4?(t(),i("div",Sr,[e[87]||(e[87]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ X4 (Solvabilitate)"),a("span",{class:"indicator-desc"},"Capital propriu / Datorii totale. Măsoară gradul de îndatorare.")],-1)),a("span",Dr,s(w(b.value.x4.value,3)),1)])):l("",!0),((ha=(_a=b.value)==null?void 0:_a.capital_de_lucru)==null?void 0:ha.value)!==null&&((he=(Za=b.value)==null?void 0:Za.capital_de_lucru)==null?void 0:he.value)!==void 0?(t(),i("div",Ir,[e[88]||(e[88]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Capital de Lucru"),a("span",{class:"indicator-desc"},"Active Curente - Datorii Curente (3xx+4xx activ+5xx) - (401,404,4xx pasiv)")],-1)),a("span",Tr,s(v(b.value.capital_de_lucru.value)),1)])):l("",!0),((ye=(ke=b.value)==null?void 0:ke.active_totale)==null?void 0:ye.value)!==null&&((we=(ge=b.value)==null?void 0:ge.active_totale)==null?void 0:we.value)!==void 0?(t(),i("div",$r,[e[89]||(e[89]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Active Totale"),a("span",{class:"indicator-desc"},"Active Imobilizate (2xx net) + Active Curente (3xx+4xx activ+5xx)")],-1)),a("span",Pr,s(v(b.value.active_totale.value)),1)])):l("",!0),((ze=(Ce=b.value)==null?void 0:Ce.datorii_totale)==null?void 0:ze.value)!==null&&((Se=(xe=b.value)==null?void 0:xe.datorii_totale)==null?void 0:Se.value)!==void 0?(t(),i("div",Fr,[e[90]||(e[90]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Datorii Totale"),a("span",{class:"indicator-desc"},"Datorii Curente (401,404,4xx pasiv) + Datorii Termen Lung (16x)")],-1)),a("span",Ar,s(v(b.value.datorii_totale.value)),1)])):l("",!0)],512),[[J,A.value.altman]])])])):l("",!0),$.value?(t(),i("div",Rr,[a("h4",{class:"section-title",onClick:e[8]||(e[8]=na=>R("solvabilitate"))},[e[91]||(e[91]=a("span",null,"Solvabilitate",-1)),a("i",{class:m(["pi",A.value.solvabilitate?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",Mr,[(De=$.value)!=null&&De.activ_net_contabil?(t(),i("div",Lr,[e[92]||(e[92]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Activ Net Contabil (ANC)"),a("span",{class:"indicator-desc"},"Total Active - Total Datorii. Valoarea netă a firmei. • Ideal: pozitiv")],-1)),a("span",{class:m(["indicator-value",k($.value.activ_net_contabil.status)])},s(v($.value.activ_net_contabil.value)),3)])):l("",!0),(Ie=$.value)!=null&&Ie.rata_anc_capital?(t(),i("div",Br,[e[93]||(e[93]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"Rata ANC / Capital Social"),a("span",{class:"indicator-desc"},"ANC / Capital Social × 100. Sub 50% → restricții legale (din 2026). • Ideal: ≥100%")],-1)),a("span",{class:m(["indicator-value",k($.value.rata_anc_capital.status)])},s(w($.value.rata_anc_capital.value,1))+"% ",3)])):l("",!0),K(a("div",Nr,[(Te=$.value)!=null&&Te.total_active?(t(),i("div",Vr,[e[94]||(e[94]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Total Active"),a("span",{class:"indicator-desc"},"Active Imobilizate + Active Curente (baza de calcul ANC)")],-1)),a("span",Or,s(v($.value.total_active.value)),1)])):l("",!0),($e=$.value)!=null&&$e.total_datorii?(t(),i("div",Er,[e[95]||(e[95]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Total Datorii"),a("span",{class:"indicator-desc"},"Datorii Curente + Datorii pe Termen Lung (se scade din active)")],-1)),a("span",Hr,s(v($.value.total_datorii.value)),1)])):l("",!0),(Pe=$.value)!=null&&Pe.capital_social?(t(),i("div",Wr,[e[96]||(e[96]=a("div",{class:"indicator-info"},[a("span",{class:"indicator-name"},"└ Capital Social"),a("span",{class:"indicator-desc"},"Capital subscris și vărsat (doar cont 101) - baza calcul Rata ANC")],-1)),a("span",jr,s(v($.value.capital_social.value)),1)])):l("",!0)],512),[[J,A.value.solvabilitate]])])])):l("",!0)])):l("",!0)],2)])),!d.loading&&!d.error&&!d.mobile?(t(),i("div",Xr,[a("button",{class:"expand-toggle-btn",onClick:ea,"aria-expanded":g.value,"aria-label":"Extinde/Restrânge detalii"},[a("span",Zr,s(g.value?"Vezi mai puțin":"Vezi toți indicatorii"),1),a("i",{class:m(["pi",g.value?"pi-chevron-up":"pi-chevron-down"])},null,2)],8,Yr)])):l("",!0),!d.loading&&!d.error&&d.mobile?(t(),i("div",Gr,[a("button",{class:"expand-toggle-btn",onClick:e[9]||(e[9]=na=>S.value=!0),"aria-label":"Vezi toți indicatorii"},[...e[97]||(e[97]=[a("span",{class:"expand-label"},"Vezi toți indicatorii",-1),a("i",{class:"pi pi-chevron-up"},null,-1)])])])):l("",!0),q(Ka,{"cache-hit":(Fe=d.cacheInfo)==null?void 0:Fe.hit,"response-time-ms":(Ae=d.cacheInfo)==null?void 0:Ae.time,"cache-source":(Re=d.cacheInfo)==null?void 0:Re.source},null,8,["cache-hit","response-time-ms","cache-source"]),q(oi,{modelValue:S.value,"onUpdate:modelValue":e[18]||(e[18]=na=>S.value=na)},{default:ca(()=>{var na,Me,Le,Be,Ne,Ve,Oe,Ee,He,We,je,Xe,Ye,Ze,Ge,Ue,qe,Ke,Qe,Je,at,et,tt,it,st,lt,nt,rt,ot,ct,dt,ut,vt,pt,ft,mt,bt,_t,ht,kt,yt,gt,wt,Ct,zt,xt,St,Dt,It,Tt,$t,Pt,Ft,At,Rt,Mt,Lt,Bt,Nt,Vt,Ot,Et,Ht,Wt,jt,Xt;return[a("div",Ur,[e[172]||(e[172]=a("h3",{class:"sheet-title"},"Toți Indicatorii Financiari",-1)),a("div",qr,[a("h4",{class:"category-title",onClick:e[10]||(e[10]=Sa=>R("lichiditate"))},[e[98]||(e[98]=a("span",null,"Lichiditate",-1)),a("i",{class:m(["pi",A.value.lichiditate?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",Kr,[(na=I.value)!=null&&na.lichiditate_curenta?(t(),i("div",Qr,[e[99]||(e[99]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Lichiditate Curentă"),a("span",{class:"item-description"},"Capacitatea de acoperire a datoriilor curente. Active Curente / Datorii Curente • Ideal: >1.5")],-1)),a("span",{class:m(["item-value",k(I.value.lichiditate_curenta.status)])},s(w(I.value.lichiditate_curenta.value,2)),3)])):l("",!0),(Me=I.value)!=null&&Me.lichiditate_imediata?(t(),i("div",Jr,[e[100]||(e[100]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Lichiditate Imediată"),a("span",{class:"item-description"},"Capacitatea de plată imediată (fără stocuri). (Trezorerie + Clienți) / Furnizori • Ideal: >1.0")],-1)),a("span",{class:m(["item-value",k(I.value.lichiditate_imediata.status)])},s(w(I.value.lichiditate_imediata.value,2)),3)])):l("",!0),(Le=I.value)!=null&&Le.lichiditate_vedere?(t(),i("div",ao,[e[101]||(e[101]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Lichiditate la Vedere"),a("span",{class:"item-description"},"Numerar disponibil pentru plăți imediate. Trezorerie / Furnizori • Ideal: >0.2")],-1)),a("span",{class:m(["item-value",k(I.value.lichiditate_vedere.status)])},s(w(I.value.lichiditate_vedere.value,2)),3)])):l("",!0),K(a("div",eo,[(Be=I.value)!=null&&Be.active_curente?(t(),i("div",to,[e[102]||(e[102]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Active Curente"),a("span",{class:"item-description"},"Stocuri + Creanțe + Disponibilități")],-1)),a("span",io,s(v(I.value.active_curente.value)),1)])):l("",!0),(Ne=I.value)!=null&&Ne.disponibilitati?(t(),i("div",so,[e[103]||(e[103]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Disponibilități"),a("span",{class:"item-description"},"Bancă + Casă")],-1)),a("span",lo,s(v(I.value.disponibilitati.value)),1)])):l("",!0),(Ve=I.value)!=null&&Ve.creante?(t(),i("div",no,[e[104]||(e[104]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Creanțe"),a("span",{class:"item-description"},"Clienți + Debitori")],-1)),a("span",ro,s(v(I.value.creante.value)),1)])):l("",!0),(Oe=I.value)!=null&&Oe.datorii_curente?(t(),i("div",oo,[e[105]||(e[105]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Datorii Curente"),a("span",{class:"item-description"},"Furnizori + TVA + Salarii")],-1)),a("span",co,s(v(I.value.datorii_curente.value)),1)])):l("",!0)],512),[[J,A.value.lichiditate]])])]),a("div",uo,[a("h4",{class:"category-title",onClick:e[11]||(e[11]=Sa=>R("eficienta"))},[e[106]||(e[106]=a("span",null,"Eficiență",-1)),a("i",{class:m(["pi",A.value.eficienta?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",vo,[(Ee=o.value)!=null&&Ee.dso?(t(),i("div",po,[e[107]||(e[107]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"DSO (Zile încasare)"),a("span",{class:"item-description"},"Câte zile durează încasarea creanțelor. (Sold Clienți / Facturări) × 30 • Ideal: <45 zile")],-1)),a("span",{class:m(["item-value",k(o.value.dso.status)])},s(w(o.value.dso.value,0))+" zile ",3)])):l("",!0),(He=o.value)!=null&&He.dpo?(t(),i("div",fo,[e[108]||(e[108]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"DPO (Zile plată)"),a("span",{class:"item-description"},"Câte zile durează plata furnizorilor. (Sold Furnizori / Achiziții) × 30 • Ideal: 30-60 zile")],-1)),a("span",{class:m(["item-value",k(o.value.dpo.status)])},s(w(o.value.dpo.value,0))+" zile ",3)])):l("",!0),(We=o.value)!=null&&We.cash_conversion_cycle?(t(),i("div",mo,[e[109]||(e[109]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Ciclu Conversie Cash"),a("span",{class:"item-description"},"Timpul de conversie în numerar. DSO - DPO • Ideal: cât mai mic (sau negativ)")],-1)),a("span",{class:m(["item-value",k(o.value.cash_conversion_cycle.status)])},s(w(o.value.cash_conversion_cycle.value,0))+" zile ",3)])):l("",!0),(je=o.value)!=null&&je.rata_incasare?(t(),i("div",bo,[e[110]||(e[110]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Rata Încasare"),a("span",{class:"item-description"},"Procentul facturilor încasate. Încasări / Facturări × 100 • Ideal: >85%")],-1)),a("span",{class:m(["item-value",k(o.value.rata_incasare.status)])},s(w(o.value.rata_incasare.value,1))+"% ",3)])):l("",!0),(Xe=o.value)!=null&&Xe.rata_plata?(t(),i("div",_o,[e[111]||(e[111]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Rata Plată"),a("span",{class:"item-description"},"Disciplina de plată către furnizori. Plăți / Achiziții × 100 • Ideal: 70-90%")],-1)),a("span",{class:m(["item-value",k(o.value.rata_plata.status)])},s(w(o.value.rata_plata.value,1))+"% ",3)])):l("",!0),K(a("div",ho,[(Ye=o.value)!=null&&Ye.sold_clienti?(t(),i("div",ko,[e[112]||(e[112]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Sold Clienți"),a("span",{class:"item-description"},"La final de lună")],-1)),a("span",yo,s(v(o.value.sold_clienti.value)),1)])):l("",!0),(Ze=o.value)!=null&&Ze.facturari_lunare?(t(),i("div",go,[e[113]||(e[113]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Facturări"),a("span",{class:"item-description"},"Media lunară (3 luni)")],-1)),a("span",wo,s(v(o.value.facturari_lunare.value)),1)])):l("",!0),(Ge=o.value)!=null&&Ge.sold_furnizori?(t(),i("div",Co,[e[114]||(e[114]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Sold Furnizori"),a("span",{class:"item-description"},"La final de lună")],-1)),a("span",zo,s(v(o.value.sold_furnizori.value)),1)])):l("",!0),(Ue=o.value)!=null&&Ue.achizitii_lunare?(t(),i("div",xo,[e[115]||(e[115]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Achiziții"),a("span",{class:"item-description"},"Media lunară (3 luni)")],-1)),a("span",So,s(v(o.value.achizitii_lunare.value)),1)])):l("",!0),(qe=o.value)!=null&&qe.incasari_luna?(t(),i("div",Do,[e[116]||(e[116]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Încasări"),a("span",{class:"item-description"},"Media lunară (3 luni)")],-1)),a("span",Io,s(v(o.value.incasari_luna.value)),1)])):l("",!0),(Ke=o.value)!=null&&Ke.plati_luna?(t(),i("div",To,[e[117]||(e[117]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Plăți"),a("span",{class:"item-description"},"Media lunară (3 luni)")],-1)),a("span",$o,s(v(o.value.plati_luna.value)),1)])):l("",!0)],512),[[J,A.value.eficienta]])])]),a("div",Po,[a("h4",{class:"category-title",onClick:e[12]||(e[12]=Sa=>R("risc"))},[e[118]||(e[118]=a("span",null,"Risc",-1)),a("i",{class:m(["pi",A.value.risc?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",Fo,[(Qe=r.value)!=null&&Qe.creante_restante_pct?(t(),i("div",Ao,[e[119]||(e[119]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Creanțe Restante"),a("span",{class:"item-description"},"Procentul facturilor depășite la plată. Restante / Total × 100 • Ideal: <20%")],-1)),a("span",{class:m(["item-value",k(r.value.creante_restante_pct.status)])},s(w(r.value.creante_restante_pct.value,1))+"% ",3)])):l("",!0),(Je=r.value)!=null&&Je.creante_90plus_pct?(t(),i("div",Ro,[e[120]||(e[120]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Creanțe >90 zile"),a("span",{class:"item-description"},"Creanțe vechi cu risc mare de neîncasare. Restant 90+ / Total × 100 • Ideal: <5%")],-1)),a("span",{class:m(["item-value",k(r.value.creante_90plus_pct.status)])},s(w(r.value.creante_90plus_pct.value,1))+"% ",3)])):l("",!0),(at=r.value)!=null&&at.datorii_restante_pct?(t(),i("div",Mo,[e[121]||(e[121]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Datorii Restante"),a("span",{class:"item-description"},"Disciplina de plată către furnizori. Restante / Total × 100 • Ideal: <10%")],-1)),a("span",{class:m(["item-value",k(r.value.datorii_restante_pct.status)])},s(w(r.value.datorii_restante_pct.value,1))+"% ",3)])):l("",!0),(et=r.value)!=null&&et.raport_datorii_trezorerie?(t(),i("div",Lo,[e[122]||(e[122]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Datorii/Trezorerie"),a("span",{class:"item-description"},"Câte lei de datorii pe fiecare leu în casă. Furnizori / Trezorerie • Ideal: <3.0")],-1)),a("span",{class:m(["item-value",k(r.value.raport_datorii_trezorerie.status)])},s(w(r.value.raport_datorii_trezorerie.value,2))+"x ",3)])):l("",!0),K(a("div",Bo,[(tt=r.value)!=null&&tt.total_clienti?(t(),i("div",No,[e[123]||(e[123]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Total Clienți"),a("span",{class:"item-description"},"Sold total clienți")],-1)),a("span",Vo,s(v(r.value.total_clienti.value)),1)])):l("",!0),(it=r.value)!=null&&it.clienti_restanti?(t(),i("div",Oo,[e[124]||(e[124]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Clienți Restanți"),a("span",{class:"item-description"},"Cu facturi restante")],-1)),a("span",Eo,s(v(r.value.clienti_restanti.value)),1)])):l("",!0),(st=r.value)!=null&&st.clienti_90plus?(t(),i("div",Ho,[e[125]||(e[125]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Clienți >90 zile"),a("span",{class:"item-description"},"Restant >90 zile")],-1)),a("span",Wo,s(v(r.value.clienti_90plus.value)),1)])):l("",!0),(lt=r.value)!=null&<.total_furnizori?(t(),i("div",jo,[e[126]||(e[126]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Total Furnizori"),a("span",{class:"item-description"},"Sold total furnizori")],-1)),a("span",Xo,s(v(r.value.total_furnizori.value)),1)])):l("",!0),(nt=r.value)!=null&&nt.furnizori_restanti?(t(),i("div",Yo,[e[127]||(e[127]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Furnizori Restanți"),a("span",{class:"item-description"},"Cu facturi restante")],-1)),a("span",Zo,s(v(r.value.furnizori_restanti.value)),1)])):l("",!0),(rt=r.value)!=null&&rt.trezorerie?(t(),i("div",Go,[e[128]||(e[128]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Trezorerie"),a("span",{class:"item-description"},"Disponibilități")],-1)),a("span",Uo,s(v(r.value.trezorerie.value)),1)])):l("",!0)],512),[[J,A.value.risc]])])]),a("div",qo,[a("h4",{class:"category-title",onClick:e[13]||(e[13]=Sa=>R("cashflow"))},[e[129]||(e[129]=a("span",null,"Cash Flow",-1)),a("i",{class:m(["pi",A.value.cashflow?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",Ko,[(ot=C.value)!=null&&ot.flux_net_lunar?(t(),i("div",Qo,[e[130]||(e[130]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Flux Net Lunar"),a("span",{class:"item-description"},"Cash generat sau consumat luna curentă. Încasări - Plăți • Ideal: >0 (pozitiv)")],-1)),a("span",{class:m(["item-value",k(C.value.flux_net_lunar.status)])},s(v(C.value.flux_net_lunar.value)),3)])):l("",!0),(ct=C.value)!=null&&ct.cash_flow_ytd?(t(),i("div",Jo,[e[131]||(e[131]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Cash Flow YTD"),a("span",{class:"item-description"},"Flux cumulat de la începutul anului. Σ(Încasări - Plăți) • Ideal: pozitiv")],-1)),a("span",{class:m(["item-value",k(C.value.cash_flow_ytd.status)])},s(v(C.value.cash_flow_ytd.value)),3)])):l("",!0),(dt=C.value)!=null&&dt.flux_net_yoy_pct?(t(),i("div",ac,[e[132]||(e[132]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Flux Net YoY"),a("span",{class:"item-description"},"Evoluția față de anul trecut. (CF curent - CF anterior) / CF anterior × 100 • Ideal: >0%")],-1)),a("span",{class:m(["item-value",k(C.value.flux_net_yoy_pct.status)])},s(w(C.value.flux_net_yoy_pct.value,1))+"% ",3)])):l("",!0),(ut=C.value)!=null&&ut.acoperire_cash_flow?(t(),i("div",ec,[e[133]||(e[133]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Acoperire CF"),a("span",{class:"item-description"},"Capacitatea de plată din flux. Cash Flow / Datorii Restante • Ideal: >0.5")],-1)),a("span",{class:m(["item-value",k(C.value.acoperire_cash_flow.status)])},s(w(C.value.acoperire_cash_flow.value,2))+"x ",3)])):l("",!0),K(a("div",tc,[(vt=C.value)!=null&&vt.incasari_luna?(t(),i("div",ic,[e[134]||(e[134]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Încasări Luna"),a("span",{class:"item-description"},"Luna curentă")],-1)),a("span",sc,s(v(C.value.incasari_luna.value)),1)])):l("",!0),(pt=C.value)!=null&&pt.plati_luna?(t(),i("div",lc,[e[135]||(e[135]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Plăți Luna"),a("span",{class:"item-description"},"Luna curentă")],-1)),a("span",nc,s(v(C.value.plati_luna.value)),1)])):l("",!0),(ft=C.value)!=null&&ft.cf_an_precedent?(t(),i("div",rc,[e[136]||(e[136]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ CF An Precedent"),a("span",{class:"item-description"},"YTD an precedent")],-1)),a("span",oc,s(v(C.value.cf_an_precedent.value)),1)])):l("",!0),(mt=C.value)!=null&&mt.datorii_restante?(t(),i("div",cc,[e[137]||(e[137]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Datorii Restante"),a("span",{class:"item-description"},"Scadență depășită")],-1)),a("span",dc,s(v(C.value.datorii_restante.value)),1)])):l("",!0)],512),[[J,A.value.cashflow]])])]),a("div",uc,[a("h4",{class:"category-title",onClick:e[14]||(e[14]=Sa=>R("dinamica"))},[e[138]||(e[138]=a("span",null,"Dinamică",-1)),a("i",{class:m(["pi",A.value.dinamica?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",vc,[(bt=u.value)!=null&&bt.crestere_vanzari_yoy?(t(),i("div",pc,[e[139]||(e[139]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Creștere Vânzări YoY"),a("span",{class:"item-description"},"Trendul vânzărilor față de anul trecut. (Vânz curent - Vânz anterior) / Vânz anterior × 100 • Ideal: >5%")],-1)),a("span",{class:m(["item-value",k(u.value.crestere_vanzari_yoy.status)])},s(w(u.value.crestere_vanzari_yoy.value,1))+"% ",3)])):l("",!0),(_t=u.value)!=null&&_t.crestere_achizitii_yoy?(t(),i("div",fc,[e[140]||(e[140]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Creștere Achiziții YoY"),a("span",{class:"item-description"},"Trendul achizițiilor față de anul trecut. (Ach curent - Ach anterior) / Ach anterior × 100 • Corelat cu vânzări")],-1)),a("span",{class:m(["item-value",k(u.value.crestere_achizitii_yoy.status)])},s(w(u.value.crestere_achizitii_yoy.value,1))+"% ",3)])):l("",!0),(ht=u.value)!=null&&ht.marja_implicita?(t(),i("div",mc,[e[141]||(e[141]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Marjă Implicită"),a("span",{class:"item-description"},"Profitabilitatea brută estimată. (Vânzări - Achiziții) / Vânzări × 100 • Ideal: >20%")],-1)),a("span",{class:m(["item-value",k(u.value.marja_implicita.status)])},s(w(u.value.marja_implicita.value,1))+"% ",3)])):l("",!0),K(a("div",bc,[(kt=u.value)!=null&&kt.vanzari_an_curent?(t(),i("div",_c,[e[142]||(e[142]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ CA An Curent"),a("span",{class:"item-description"},"Clasa 7 fără TVA")],-1)),a("span",hc,s(v(u.value.vanzari_an_curent.value)),1)])):l("",!0),(yt=u.value)!=null&&yt.vanzari_an_precedent?(t(),i("div",kc,[e[143]||(e[143]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ CA An Precedent"),a("span",{class:"item-description"},"Clasa 7 fără TVA")],-1)),a("span",yc,s(v(u.value.vanzari_an_precedent.value)),1)])):l("",!0),(gt=u.value)!=null&>.achizitii_an_curent?(t(),i("div",gc,[e[144]||(e[144]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Achiziții Totale An Curent"),a("span",{class:"item-description"},"Stocuri + cheltuieli directe, fără TVA")],-1)),a("span",wc,s(v(u.value.achizitii_an_curent.value)),1)])):l("",!0),(wt=u.value)!=null&&wt.achizitii_an_precedent?(t(),i("div",Cc,[e[145]||(e[145]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"└ Achiziții Totale An Precedent"),a("span",{class:"item-description"},"Stocuri + cheltuieli directe, fără TVA")],-1)),a("span",zc,s(v(u.value.achizitii_an_precedent.value)),1)])):l("",!0)],512),[[J,A.value.dinamica]])])]),a("div",xc,[a("h4",{class:"category-title",onClick:e[15]||(e[15]=Sa=>R("altman"))},[e[146]||(e[146]=a("span",null,"Altman Z-Score",-1)),a("i",{class:m(["pi",A.value.altman?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",Sc,[(Ct=b.value)!=null&&Ct.zscore?(t(),i("div",Dc,[e[147]||(e[147]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Z-Score"),a("span",{class:"item-description"},"Scor de sănătate financiară. 6.56×X1 + 3.26×X2 + 6.72×X3 + 1.05×X4 • >2.6 = sigur, <1.1 = risc")],-1)),a("span",{class:m(["item-value",k(b.value.zscore.status)])},s(w(b.value.zscore.value,2)),3)])):l("",!0),(zt=b.value)!=null&&zt.x1?(t(),i("div",Ic,[e[148]||(e[148]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"X1 (Lichiditate)"),a("span",{class:"item-description"},"Capital de lucru / Active totale. Măsoară lichiditatea pe termen scurt.")],-1)),a("span",Tc,s(w(b.value.x1.value,3)),1)])):l("",!0),(xt=b.value)!=null&&xt.x2?(t(),i("div",$c,[e[149]||(e[149]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"X2 (Profitabilitate)"),a("span",{class:"item-description"},"Rezultat reportat / Active totale. Măsoară profiturile reinvestite.")],-1)),a("span",Pc,s(w(b.value.x2.value,3)),1)])):l("",!0),(St=b.value)!=null&&St.x3?(t(),i("div",Fc,[e[150]||(e[150]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"X3 (Eficiență)"),a("span",{class:"item-description"},"EBIT / Active totale. Măsoară productivitatea activelor.")],-1)),a("span",Ac,s(w(b.value.x3.value,3)),1)])):l("",!0),(Dt=b.value)!=null&&Dt.x4?(t(),i("div",Rc,[e[151]||(e[151]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"X4 (Solvabilitate)"),a("span",{class:"item-description"},"Capital propriu / Datorii totale. Măsoară gradul de îndatorare.")],-1)),a("span",Mc,s(w(b.value.x4.value,3)),1)])):l("",!0),K(a("div",Lc,[(It=b.value)!=null&&It.capital_de_lucru?(t(),i("div",Bc,[e[152]||(e[152]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Capital de Lucru"),a("span",{class:"item-description"},"Active Curente - Datorii Curente (3xx+4xx activ+5xx) - (401,404,4xx pasiv)")],-1)),a("span",Nc,s(v(b.value.capital_de_lucru.value)),1)])):l("",!0),(Tt=b.value)!=null&&Tt.active_totale?(t(),i("div",Vc,[e[153]||(e[153]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Active Totale"),a("span",{class:"item-description"},"Active Imobilizate (2xx net) + Active Curente (3xx+4xx activ+5xx)")],-1)),a("span",Oc,s(v(b.value.active_totale.value)),1)])):l("",!0),($t=b.value)!=null&&$t.datorii_totale?(t(),i("div",Ec,[e[154]||(e[154]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Datorii Totale"),a("span",{class:"item-description"},"Datorii Curente (401,404,4xx pasiv) + Datorii Termen Lung (16x)")],-1)),a("span",Hc,s(v(b.value.datorii_totale.value)),1)])):l("",!0)],512),[[J,A.value.altman]])])]),_.value?(t(),i("div",Wc,[a("h4",{class:"category-title",onClick:e[16]||(e[16]=Sa=>R("profitabilitate"))},[e[155]||(e[155]=a("span",null,"Profitabilitate",-1)),a("i",{class:m(["pi",A.value.profitabilitate?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",jc,[(Pt=_.value)!=null&&Pt.cifra_afaceri?(t(),i("div",Xc,[e[156]||(e[156]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Cifra de Afaceri"),a("span",{class:"item-description"},"Total venituri din activitatea operațională. Clasa 70x • Ideal: în creștere")],-1)),a("span",{class:m(["item-value",k(_.value.cifra_afaceri.status)])},s(v(_.value.cifra_afaceri.value)),3)])):l("",!0),(Ft=_.value)!=null&&Ft.cheltuieli_totale?(t(),i("div",Yc,[e[157]||(e[157]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Cheltuieli Totale"),a("span",{class:"item-description"},"Operaționale + Financiare. Clasa 60x-68x")],-1)),a("span",{class:m(["item-value",k(_.value.cheltuieli_totale.status)])},s(v(_.value.cheltuieli_totale.value)),3)])):l("",!0),(At=_.value)!=null&&At.profit_brut?(t(),i("div",Zc,[e[158]||(e[158]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Profit Brut (EBIT)"),a("span",{class:"item-description"},"Venituri - Cheltuieli operaționale • Ideal: pozitiv")],-1)),a("span",{class:m(["item-value",k(_.value.profit_brut.status)])},s(v(_.value.profit_brut.value)),3)])):l("",!0),(Rt=_.value)!=null&&Rt.marja_profit_brut?(t(),i("div",Gc,[e[159]||(e[159]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Marja Profit"),a("span",{class:"item-description"},"Procentul de profit din vânzări. Profit / Venituri × 100 • Ideal: >10%")],-1)),a("span",{class:m(["item-value",k(_.value.marja_profit_brut.status)])},s(w(_.value.marja_profit_brut.value,1))+"% ",3)])):l("",!0),(Mt=_.value)!=null&&Mt.roa?(t(),i("div",Uc,[e[160]||(e[160]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Randament Active (ROA)"),a("span",{class:"item-description"},"Profit / Active Totale × 100 • Ideal: >5%")],-1)),a("span",{class:m(["item-value",k(_.value.roa.status)])},s(w(_.value.roa.value,2))+"% ",3)])):l("",!0),(Lt=_.value)!=null&&Lt.roe?(t(),i("div",qc,[e[161]||(e[161]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Randament Capitaluri (ROE)"),a("span",{class:"item-description"},"Profit / Capital Propriu × 100 • Ideal: >10%")],-1)),a("span",{class:m(["item-value",k(_.value.roe.status)])},s(w(_.value.roe.value,2))+"% ",3)])):l("",!0),K(a("div",Kc,[(Bt=_.value)!=null&&Bt.cheltuieli_operationale?(t(),i("div",Qc,[e[162]||(e[162]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Cheltuieli Operaționale"),a("span",{class:"item-description"},"Clasa 60x-65x + 68x (fără dobânzi 66x). Cheltuieli din activitatea curentă.")],-1)),a("span",Jc,s(v(_.value.cheltuieli_operationale.value)),1)])):l("",!0),(Nt=_.value)!=null&&Nt.cheltuieli_financiare?(t(),i("div",ad,[e[163]||(e[163]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Cheltuieli Financiare"),a("span",{class:"item-description"},"Clasa 66x. Dobânzi, diferențe de curs valutar, etc.")],-1)),a("span",ed,s(v(_.value.cheltuieli_financiare.value)),1)])):l("",!0),(Vt=_.value)!=null&&Vt.active_totale?(t(),i("div",td,[e[164]||(e[164]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Active Totale"),a("span",{class:"item-description"},"Baza calcul ROA. Active Imobilizate + Active Curente")],-1)),a("span",id,s(v(_.value.active_totale.value)),1)])):l("",!0),(Ot=_.value)!=null&&Ot.capitaluri_proprii?(t(),i("div",sd,[e[165]||(e[165]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Capitaluri Proprii"),a("span",{class:"item-description"},"Baza calcul ROE. Capital Social (101-106) + Rezultat (117,121)")],-1)),a("span",ld,s(v(_.value.capitaluri_proprii.value)),1)])):l("",!0)],512),[[J,A.value.profitabilitate]])])])):l("",!0),$.value?(t(),i("div",nd,[a("h4",{class:"category-title",onClick:e[17]||(e[17]=Sa=>R("solvabilitate"))},[e[166]||(e[166]=a("span",null,"Solvabilitate",-1)),a("i",{class:m(["pi",A.value.solvabilitate?"pi-chevron-up":"pi-chevron-down"])},null,2)]),a("div",rd,[(Et=$.value)!=null&&Et.activ_net_contabil?(t(),i("div",od,[e[167]||(e[167]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Activ Net Contabil (ANC)"),a("span",{class:"item-description"},"Total Active - Total Datorii. Valoarea netă a firmei. • Ideal: pozitiv")],-1)),a("span",{class:m(["item-value",k($.value.activ_net_contabil.status)])},s(v($.value.activ_net_contabil.value)),3)])):l("",!0),(Ht=$.value)!=null&&Ht.rata_anc_capital?(t(),i("div",cd,[e[168]||(e[168]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Rata ANC / Capital Social"),a("span",{class:"item-description"},"ANC / Capital Social × 100. Sub 50% → restricții legale (din 2026). • Ideal: ≥100%")],-1)),a("span",{class:m(["item-value",k($.value.rata_anc_capital.status)])},s(w($.value.rata_anc_capital.value,1))+"% ",3)])):l("",!0),K(a("div",dd,[(Wt=$.value)!=null&&Wt.total_active?(t(),i("div",ud,[e[169]||(e[169]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Total Active"),a("span",{class:"item-description"},"Active Imobilizate + Active Curente (baza de calcul ANC)")],-1)),a("span",vd,s(v($.value.total_active.value)),1)])):l("",!0),(jt=$.value)!=null&&jt.total_datorii?(t(),i("div",pd,[e[170]||(e[170]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Total Datorii"),a("span",{class:"item-description"},"Datorii Curente + Datorii pe Termen Lung (se scade din active)")],-1)),a("span",fd,s(v($.value.total_datorii.value)),1)])):l("",!0),(Xt=$.value)!=null&&Xt.capital_social?(t(),i("div",md,[e[171]||(e[171]=a("div",{class:"item-info"},[a("span",{class:"item-label"},"Capital Social"),a("span",{class:"item-description"},"Capital subscris și vărsat (doar cont 101) - baza calcul Rata ANC")],-1)),a("span",bd,s(v($.value.capital_social.value)),1)])):l("",!0)],512),[[J,A.value.solvabilitate]])])])):l("",!0)])]}),_:1},8,["modelValue"])],2)}}},qt=ka(_d,[["__scopeId","data-v-79941a10"]]),hd={class:"collapsible-card__content"},kd={class:"collapsible-card__label"},yd={class:"collapsible-card__body"},gd={__name:"CollapsibleCard",props:{label:{type:String,required:!0},value:{type:[Number,String],default:null},icon:{type:String,default:""},valueClass:{type:String,default:""},defaultExpanded:{type:Boolean,default:!1},formatCurrency:{type:Boolean,default:!0}},setup(d){const n=d,N=H(n.defaultExpanded),h=z(()=>n.value===null||n.value===void 0?"-":n.formatCurrency&&typeof n.value=="number"?new Intl.NumberFormat("ro-RO",{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0}).format(n.value):String(n.value)),g=()=>{N.value=!N.value};return(S,P)=>(t(),i("div",{class:m(["collapsible-card",{"collapsible-card--expanded":N.value}])},[a("div",{class:"collapsible-card__header",onClick:g,role:"button",tabindex:"0",onKeydown:ti(g,["enter"])},[a("div",hd,[d.icon?(t(),i("i",{key:0,class:m([d.icon,"collapsible-card__icon"])},null,2)):l("",!0),a("span",kd,s(d.label),1),a("span",{class:m(["collapsible-card__value",d.valueClass])},s(h.value),3)]),a("i",{class:m(["pi pi-chevron-down collapsible-card__chevron",{"collapsible-card__chevron--expanded":N.value}])},null,2)],32),K(a("div",yd,[Jt(S.$slots,"default",{},void 0,!0)],512),[[J,N.value]])],2))}},Ua=ka(gd,[["__scopeId","data-v-ed48d967"]]),wd=["onClick","aria-label"],Cd=50,zd=.3,Kt=30,xd={__name:"SwipeableCards",props:{totalCards:{type:Number,required:!0,validator:d=>d>0},showDots:{type:Boolean,default:!0},fixedDots:{type:Boolean,default:!1},fillHeight:{type:Boolean,default:!1},autoPlay:{type:Boolean,default:!1},autoPlayInterval:{type:Number,default:5e3}},emits:["update:currentIndex"],setup(d,{expose:n,emit:N}){const h=d,g=N,S=H(null),P=H(0),ea=H(!1),X=H(0),A=H("auto");let R=null;const I=async()=>{var V;if(await Ia(),!S.value)return;const L=Array.from(S.value.children)[P.value];if(L){const F=((V=L.firstElementChild)==null?void 0:V.scrollHeight)||L.scrollHeight;F>0&&(A.value=`${F}px`)}},o=()=>{typeof ResizeObserver>"u"||!S.value||(R=new ResizeObserver(I),Array.from(S.value.children).forEach(y=>{y.firstElementChild&&R.observe(y.firstElementChild)}))};let r=0,C=0,u=0,b=!1,_=null;const $=z(()=>({transform:`translateX(${-P.value*100+X.value/w()*100}%)`,transition:ea.value?"none":"transform var(--transition-normal)"})),w=()=>{var y;return((y=S.value)==null?void 0:y.clientWidth)||window.innerWidth},v=y=>{y<0||y>=h.totalCards||(P.value=y,g("update:currentIndex",y),I())},O=()=>{P.value{P.value>0&&v(P.value-1)},Z=y=>{r=y.touches[0].clientX,C=y.touches[0].clientY,u=r,b=!1,U()},c=y=>{if(!r)return;u=y.touches[0].clientX;const L=y.touches[0].clientY,V=u-r,F=L-C,Q=Math.abs(Math.atan2(F,V)*(180/Math.PI));if(!b&&(Math.abs(V)>10||Math.abs(F)>10))if(Q180-Kt)b=!0,ea.value=!0;else return;if(b){y.preventDefault();let ta=V;(P.value===0&&V>0||P.value===h.totalCards-1&&V<0)&&(ta=V*.3),X.value=ta}},e=y=>{var oa;if(!b){T();return}const L=u-r,V=w(),F=Math.abs(L)/V,Q=y.timeStamp-(((oa=y.changedTouches[0])==null?void 0:oa.timeStamp)||y.timeStamp),ta=Math.abs(L)/(Q||1);(Math.abs(L)>Cd||ta>zd&&F>.1)&&(L>0&&P.value>0?k():L<0&&P.value{r=0,C=0,u=0,b=!1,ea.value=!1,X.value=0},M=()=>{h.autoPlay&&(U(),_=setInterval(()=>{P.value{_&&(clearInterval(_),_=null)};return za(()=>h.totalCards,y=>{P.value>=y&&v(y-1)}),Ra(()=>{I(),o(),h.autoPlay&&M()}),ai(()=>{U(),R&&(R.disconnect(),R=null)}),n({goToCard:v,nextCard:O,prevCard:k,currentIndex:P}),(y,L)=>(t(),i("div",{class:m(["swipeable-cards-container",{"swipeable-cards-container--fill":d.fillHeight}]),onTouchstart:Z,onTouchmove:c,onTouchend:e},[a("div",{class:"cards-track-overflow",style:_e({height:A.value})},[a("div",{class:"cards-track",ref_key:"trackRef",ref:S,style:_e($.value)},[(t(!0),i(aa,null,ra(d.totalCards,(V,F)=>(t(),i("div",{key:F,class:m(["card-slide",{active:F===P.value}])},[Jt(y.$slots,`card-${F}`,{},void 0,!0)],2))),128))],4)],4),d.showDots&&d.totalCards>1?(t(),i("div",{key:0,class:m(["dots-indicator",{"dots-indicator--fixed":d.fixedDots}])},[(t(!0),i(aa,null,ra(d.totalCards,V=>(t(),i("button",{key:V,class:m(["dot",{active:V-1===P.value}]),onClick:F=>v(V-1),"aria-label":`Mergi la cardul ${V}`},null,10,wd))),128))],2)):l("",!0)],34))}},Sd=ka(xd,[["__scopeId","data-v-3baeea9f"]]),Dd={class:"app-container"},Id={key:0,class:"page-header"},Td={key:1,class:"loading-bar-container"},$d={class:"metrics-cards-section"},Pd={class:"solduri-grid-2x2"},Fd={key:1,class:"metrics-row"},Ad={class:"budget-debt-breakdown-desktop"},Rd=["onClick"],Md={class:"budget-debt-col-label budget-debt-group-label"},Ld={class:"budget-debt-col-value"},Bd={class:"budget-debt-col-value budget-debt-paid budget-debt-col-achitat"},Nd={class:"budget-debt-sub-accounts"},Vd={class:"budget-debt-col-label budget-debt-sub-label"},Od={class:"budget-debt-col-value budget-debt-sub-value"},Ed={class:"budget-debt-col-value budget-debt-sub-value budget-debt-paid budget-debt-col-achitat"},Hd={key:0,class:"budget-debt-breakdown-empty"},Wd={class:"budget-debt-curent-summary"},jd={class:"budget-debt-curent-total"},Xd={key:2,class:"financial-indicators-section"},Yd={__name:"DashboardView",setup(d){const n=li(),N=ii(),h=vi(),g=pi(),S=fi(),P=mi(),ea=H([]),X=H(!1),A=H(!1),R=H(0),I=H(0),o=H(null),r=H(null),C=H({hit:!1,time:0,source:null}),u=H({hit:!1,time:0,source:null}),b=H({hit:!1,time:0,source:null}),_=H("12m"),$=H("line"),w=f=>{var D,B,G;if(!((D=g.trends)!=null&&D.raw))return null;const p=g.trends.raw;let x=[];switch(f){case"clienti":x=p.clienti_sold||[];break;case"furnizori":x=p.furnizori_sold||[];break;case"treasury":x=p.trezorerie_sold||[];break;case"sold":(B=p.clienti_sold)!=null&&B.length&&((G=p.furnizori_sold)!=null&&G.length)&&(x=p.clienti_sold.map((ia,la)=>Number(ia||0)-Number(p.furnizori_sold[la]||0)));break;case"inflows":x=p.clienti_incasat||[];break;case"outflows":x=p.furnizori_achitat||[];break;default:return null}if(!x||x.length<2)return null;const E=Number(x[x.length-1])||0,j=Number(x[x.length-2])||0;if(j===0)return E>0?{value:100,direction:"up"}:E<0?{value:100,direction:"down"}:{value:0,direction:"neutral"};const W=(E-j)/Math.abs(j)*100,Y=W>.1?"up":W<-.1?"down":"neutral";return{value:Math.abs(W),direction:Y}},v=f=>{var j,W,Y;if(!((j=g.trends)!=null&&j.raw))return[];const p=g.trends.raw;let x=[];switch(f){case"clienti":x=p.clienti_sold||[];break;case"furnizori":x=p.furnizori_sold||[];break;case"treasury":x=p.trezorerie_sold||[];break;case"sold":(W=p.clienti_sold)!=null&&W.length&&((Y=p.furnizori_sold)!=null&&Y.length)&&(x=p.clienti_sold.map((D,B)=>Number(D||0)-Number(p.furnizori_sold[B]||0)));break;case"inflows":x=p.clienti_incasat||[];break;case"outflows":x=p.furnizori_achitat||[];break;default:return[]}return x.slice(-12).map(D=>Number(D)||0)},O=()=>{var p,x;return(x=(p=g.trends)==null?void 0:p.raw)!=null&&x.periods?g.trends.raw.periods.slice(-12).map(E=>{const[j,W]=E.split("-");return`${W}/${j.slice(-2)}`}):[]},k=f=>{var j;if(!((j=g.trends)!=null&&j.raw))return[];const p=g.trends.raw;let x=[];switch(f){case"clienti":x=p.clienti_sold_prev||[];break;case"furnizori":x=p.furnizori_sold_prev||[];break;case"treasury":x=p.trezorerie_sold_prev||[];break;case"inflows":x=p.clienti_incasat_prev||[];break;case"outflows":x=p.furnizori_achitat_prev||[];break;default:return[]}return x.slice(-12).map(W=>Number(W)||0)},Z=()=>{var p,x;return(x=(p=g.trends)==null?void 0:p.raw)!=null&&x.previous_periods?g.trends.raw.previous_periods.slice(-12).map(E=>{const[j,W]=E.split("-");return`${W}/${j.slice(-2)}`}):[]},c=z(()=>w("clienti")),e=z(()=>v("clienti")),T=z(()=>k("clienti")),M=z(()=>w("furnizori")),U=z(()=>v("furnizori")),y=z(()=>k("furnizori"));z(()=>w("sold")),z(()=>v("sold"));const L=z(()=>w("inflows")),V=z(()=>v("inflows")),F=z(()=>k("inflows")),Q=z(()=>w("outflows")),ta=z(()=>v("outflows")),ya=z(()=>k("outflows"));z(()=>w("treasury")),z(()=>v("treasury")),z(()=>k("treasury"));const oa=z(()=>O()),da=z(()=>Z()),Ta=z(()=>{var x,E,j,W,Y,D;const f=((j=(E=(x=o.value)==null?void 0:x.breakdown)==null?void 0:E.casa)==null?void 0:j.total)||0,p=((D=(Y=(W=o.value)==null?void 0:W.breakdown)==null?void 0:Y.banca)==null?void 0:D.total)||0;return f+p});z(()=>{const f=g.summary;return f?Number(f.tva_recuperat_curent||0)-Number(f.tva_plata_curent||0):0});const Qa=z(()=>{const f=g.summary;return f?{plata:Number(f.tva_plata_precedent||0),recuperat:Number(f.tva_recuperat_precedent||0)}:{plata:0,recuperat:0}});z(()=>{const f=g.summary;return f?{plata:Number(f.tva_plata_curent||0),recuperat:Number(f.tva_recuperat_curent||0)}:{plata:0,recuperat:0}}),z(()=>{const f=Qa.value;return(f.plata||0)-(f.recuperat||0)});const Ma=z(()=>{var f;return(((f=g.summary)==null?void 0:f.budget_debt_breakdown)||[]).filter(p=>Number(p.datorat||0)!==0||Number(p.precedent||0)!==0)}),$a=z(()=>{var f;return(((f=g.summary)==null?void 0:f.budget_debt_breakdown)||[]).filter(p=>Number(p.curent||0)>0)}),Ja=z(()=>$a.value.reduce((f,p)=>f+Number(p.curent||0),0)),Pa=z(()=>{var p;return(((p=g.summary)==null?void 0:p.budget_debt_breakdown)||[]).reduce((x,E)=>x+Number(E.precedent||0),0)}),Fa=z(()=>{var p;return(((p=g.summary)==null?void 0:p.budget_debt_breakdown)||[]).reduce((x,E)=>x+Number(E.sold||0),0)}),ae=z(()=>{const f=Pa.value,p=Fa.value;if(f===0&&p===0)return"-";const x=E=>new Intl.NumberFormat("ro-RO").format(Math.round(Math.abs(E)));return p<=0&&f>0?`${x(f)} (0 ✓)`:`${x(f)} (${x(p)})`}),ee=z(()=>{var f;return((f=g.summary)==null?void 0:f.budget_debt_breakdown)||[]}),ga=H(new Set),te=f=>{ga.value.has(f)?ga.value.delete(f):ga.value.add(f),ga.value=new Set(ga.value)},La=z(()=>(R.value||0)-(I.value||0)),Ba=z(()=>{var j,W,Y;if(!((j=o.value)!=null&&j.breakdown))return null;const f=((W=o.value.breakdown.casa)==null?void 0:W.total)||0,p=((Y=o.value.breakdown.banca)==null?void 0:Y.total)||0;if(f+p===0)return null;const E=w("treasury");return E?{...E}:null}),Na=z(()=>{var W,Y,D;if(!((W=o.value)!=null&&W.breakdown))return[];const f=v("treasury");if(!f.length)return[];const p=((Y=o.value.breakdown.casa)==null?void 0:Y.total)||0,x=((D=o.value.breakdown.banca)==null?void 0:D.total)||0,E=p+x;if(E===0)return f.map(()=>0);const j=p/E;return f.map(B=>B*j)}),Va=z(()=>{var j,W,Y;if(!((j=o.value)!=null&&j.breakdown))return null;const f=((W=o.value.breakdown.casa)==null?void 0:W.total)||0,p=((Y=o.value.breakdown.banca)==null?void 0:Y.total)||0;if(f+p===0)return null;const E=w("treasury");return E?{...E}:null}),Oa=z(()=>{var W,Y,D;if(!((W=o.value)!=null&&W.breakdown))return[];const f=v("treasury");if(!f.length)return[];const p=((Y=o.value.breakdown.casa)==null?void 0:Y.total)||0,x=((D=o.value.breakdown.banca)==null?void 0:D.total)||0,E=p+x;if(E===0)return f.map(()=>0);const j=x/E;return f.map(B=>B*j)}),Ea=z(()=>{var W,Y,D;if(!((W=o.value)!=null&&W.breakdown))return[];const f=k("treasury");if(!f.length)return[];const p=((Y=o.value.breakdown.casa)==null?void 0:Y.total)||0,x=((D=o.value.breakdown.banca)==null?void 0:D.total)||0,E=p+x;if(E===0)return f.map(()=>0);const j=p/E;return f.map(B=>B*j)}),Ha=z(()=>{var W,Y,D;if(!((W=o.value)!=null&&W.breakdown))return[];const f=k("treasury");if(!f.length)return[];const p=((Y=o.value.breakdown.casa)==null?void 0:Y.total)||0,x=((D=o.value.breakdown.banca)==null?void 0:D.total)||0,E=p+x;if(E===0)return f.map(()=>0);const j=x/E;return f.map(B=>B*j)}),Wa=H(window.innerWidth),wa=z(()=>Wa.value<768),ja=()=>{Wa.value=window.innerWidth},ie=async()=>{await P.logout(),N.push("/login")},se=async f=>{var p;await h.loadCompanies(),(p=h.selectedCompany)!=null&&p.id_firma&&await S.loadPeriods(h.selectedCompany.id_firma)},le=z(()=>[{id:"refresh",icon:X.value?"pi pi-spin pi-refresh":"pi pi-refresh",label:"Actualizează",tooltip:"Actualizează datele"}]),ne=async f=>{f.id==="refresh"&&await Xa()},Xa=async()=>{X.value||await xa()},Ya=async f=>{!h.selectedCompany||!f||await g.loadFinancialIndicators(h.selectedCompany.id_firma,f.luna,f.an)};z(()=>{if(S.selectedPeriod){const{an:f,luna:p}=S.selectedPeriod;return new Date(f,p-1,1).toLocaleDateString("ro-RO",{month:"long",year:"numeric"})}if(g.currentPeriod){const{year:f,month:p}=g.currentPeriod;return new Date(f,p-1,1).toLocaleDateString("ro-RO",{month:"long",year:"numeric"})}return"Se încarcă..."});const Aa=z(()=>{if(!S.selectedPeriod)return null;const{luna:f,an:p}=S.selectedPeriod;return f===1?{luna:12,an:p-1}:{luna:f-1,an:p}}),ua=f=>{if(!f&&f!==0)return"0";const p=typeof f=="string"?parseFloat(f):f;if(isNaN(p))return"0";try{return new Intl.NumberFormat("ro-RO",{style:"decimal",minimumFractionDigits:0,maximumFractionDigits:0}).format(p)}catch{return p.toLocaleString("ro-RO",{minimumFractionDigits:0,maximumFractionDigits:0})}},re=async()=>{var E,j;if(!h.selectedCompany){console.warn("No company selected for trend data loading");return}const f=((E=S.selectedPeriod)==null?void 0:E.luna)||null,p=((j=S.selectedPeriod)==null?void 0:j.an)||null;console.log("Loading trend data for company:",h.selectedCompany.id_firma,"luna:",f,"an:",p);const x=await g.loadTrendData(h.selectedCompany.id_firma,_.value,$.value,f,p);x.success?console.log("Trend data loaded successfully:",x.data):(console.error("Failed to load trend data:",x.error),n.add({severity:"error",summary:"Eroare la încărcarea datelor",detail:x.error||"Nu s-au putut încărca datele de trend",life:4e3}))},oe=async()=>{if(h.selectedCompany)try{const f={company:h.selectedCompany.id_firma};S.selectedPeriod&&(f.luna=S.selectedPeriod.luna,f.an=S.selectedPeriod.an);const p=await me("/dashboard/monthly-flows",{params:f});R.value=p.inflows||0,I.value=p.outflows||0,b.value={hit:p.cache_hit||!1,time:p.response_time_ms||0,source:p.cache_source||null}}catch(f){console.error("Failed to load monthly flows:",f)}},ce=async()=>{if(h.selectedCompany)try{const f={company:h.selectedCompany.id_firma};S.selectedPeriod&&(f.luna=S.selectedPeriod.luna,f.an=S.selectedPeriod.an);const p=await me("/dashboard/treasury-breakdown",{params:f});o.value=p,C.value={hit:p.cache_hit||!1,time:p.response_time_ms||0,source:p.cache_source||null}}catch(f){console.error("Failed to load treasury breakdown:",f)}},de=async()=>{if(h.selectedCompany)try{const f={company:h.selectedCompany.id_firma};S.selectedPeriod&&(f.luna=S.selectedPeriod.luna,f.an=S.selectedPeriod.an);const p=await me("/dashboard/net-balance-breakdown",{params:f});r.value={clienti_total:p.clienti_total||0,furnizori_total:p.furnizori_total||0,breakdown:p.breakdown||{clienti:{total:0,in_termen:{total:0},restant:{total:0,perioade:{}}},furnizori:{total:0,in_termen:{total:0},restant:{total:0,perioade:{}}}}},u.value={hit:p.cache_hit||!1,time:p.response_time_ms||0,source:p.cache_source||null},console.log("[NetBalance] Loaded balance data:",{clienti_total:r.value.clienti_total,furnizori_total:r.value.furnizori_total,breakdown:r.value.breakdown})}catch(f){console.error("Failed to load net balance breakdown:",f)}},xa=async()=>{var W,Y,D,B,G,ia;if(!h.selectedCompany)return;if(!((W=S.selectedPeriod)!=null&&W.luna)||!((Y=S.selectedPeriod)!=null&&Y.an)){console.log("[DashboardView] Skipping load - no valid period selected, luna:",(D=S.selectedPeriod)==null?void 0:D.luna,"an:",(B=S.selectedPeriod)==null?void 0:B.an);return}X.value=!0,o.value=null,r.value=null,R.value=0,I.value=0,C.value={hit:!1,time:0,source:null},u.value={hit:!1,time:0,source:null},b.value={hit:!1,time:0,source:null},g.financialIndicators.loading=!0,g.financialIndicators.error=null,g.financialIndicators.data=null,g.financialIndicators.cacheInfo={hit:!1,time:0,source:null};const f=((G=S.selectedPeriod)==null?void 0:G.luna)||null,p=((ia=S.selectedPeriod)==null?void 0:ia.an)||null,x=Aa.value,E=(x==null?void 0:x.luna)||null,j=(x==null?void 0:x.an)||null;try{g.loadFinancialIndicators(h.selectedCompany.id_firma,E,j),await Promise.all([g.loadDashboardSummary(h.selectedCompany.id_firma,f,p),g.loadCurrentPeriod(h.selectedCompany.id_firma),re(),oe(),ce(),de()])}catch(la){console.error("Failed to load dashboard data:",la),n.add({severity:"error",summary:"Error",detail:"Nu s-au putut încărca datele dashboard-ului",life:3e3})}finally{X.value=!1}};return za(()=>h.selectedCompany,async f=>{f&&await xa()}),za(()=>S.selectedPeriod,async(f,p)=>{h.selectedCompany&&f&&(f.luna!==(p==null?void 0:p.luna)||f.an!==(p==null?void 0:p.an))&&(console.log("Period changed, reloading dashboard:",f),await xa())},{deep:!0}),Ra(async()=>{if(window.addEventListener("resize",ja),h.hasCompanies||await h.loadCompanies(),ea.value=h.companyListFormatted,h.selectedCompany){const f=h.getCompanyById(h.selectedCompany.id_firma);f?(h.setSelectedCompany(f),await xa()):h.clearSelectedCompany()}}),ai(()=>{window.removeEventListener("resize",ja)}),(f,p)=>{var E,j,W,Y;const x=si("tooltip");return t(),i(aa,null,[wa.value?(t(),Da(ci,{key:0,title:"Dashboard","show-menu":!0,actions:le.value,onMenuClick:p[0]||(p[0]=D=>A.value=!0),onActionClick:ne},null,8,["actions"])):l("",!0),q(ui,{modelValue:A.value,"onUpdate:modelValue":p[1]||(p[1]=D=>A.value=D),user:sa(P).user,"companies-store":sa(h),"period-store":sa(S),"available-servers":sa(P).availableServers,"current-server-id":sa(P).selectedServerId,"auth-store":sa(P),onLogout:ie,onServerSwitched:se},null,8,["modelValue","user","companies-store","period-store","available-servers","current-server-id","auth-store"]),a("main",{class:m(["main-content",{"mobile-layout":wa.value}])},[a("div",Dd,[wa.value?l("",!0):(t(),i("div",Id,[p[2]||(p[2]=a("h1",{class:"page-title"},"Dashboard",-1)),K(q(sa(ri),{icon:"pi pi-refresh",text:"",rounded:"",class:m(["refresh-btn",{"is-loading":X.value}]),onClick:Xa,"aria-label":"Actualizează datele"},null,8,["class"]),[[x,"Actualizează datele",void 0,{bottom:!0}]])])),X.value?(t(),i("div",Td,[...p[3]||(p[3]=[a("div",{class:"loading-bar"},null,-1)])])):l("",!0),a("div",$d,[wa.value?(t(),Da(Sd,{key:0,totalCards:6,"fixed-dots":!0,"fill-height":!0,class:"mobile-kpi-carousel"},{"card-0":ca(()=>{var D,B,G,ia,la,va,pa,fa,ma,ba,_a,ha,Za;return[a("div",Pd,[q(ue,{type:"trezorerie",total:Ta.value,casaTotal:((G=(B=(D=o.value)==null?void 0:D.breakdown)==null?void 0:B.casa)==null?void 0:G.total)||0,bancaTotal:((va=(la=(ia=o.value)==null?void 0:ia.breakdown)==null?void 0:la.banca)==null?void 0:va.total)||0,breakdown:(pa=o.value)==null?void 0:pa.breakdown},null,8,["total","casaTotal","bancaTotal","breakdown"]),q(ue,{type:"clienti",total:((fa=r.value)==null?void 0:fa.clienti_total)||0,breakdown:(ba=(ma=r.value)==null?void 0:ma.breakdown)==null?void 0:ba.clienti},null,8,["total","breakdown"]),q(ue,{type:"furnizori",total:((_a=r.value)==null?void 0:_a.furnizori_total)||0,breakdown:(Za=(ha=r.value)==null?void 0:ha.breakdown)==null?void 0:Za.furnizori},null,8,["total","breakdown"]),q(ue,{type:"tva",total:Pa.value,"sold-total":Fa.value,breakdown:ee.value},null,8,["total","sold-total","breakdown"])])]}),"card-1":ca(()=>{var D,B,G,ia,la,va,pa,fa,ma,ba,_a,ha;return[q(Ut,{casaTotal:((G=(B=(D=o.value)==null?void 0:D.breakdown)==null?void 0:B.casa)==null?void 0:G.total)||0,bancaTotal:((va=(la=(ia=o.value)==null?void 0:ia.breakdown)==null?void 0:la.banca)==null?void 0:va.total)||0,casaItems:((ma=(fa=(pa=o.value)==null?void 0:pa.breakdown)==null?void 0:fa.casa)==null?void 0:ma.items)||[],bancaItems:((ha=(_a=(ba=o.value)==null?void 0:ba.breakdown)==null?void 0:_a.banca)==null?void 0:ha.items)||[],casaTrend:Ba.value,bancaTrend:Va.value,casaSparklineData:Na.value,bancaSparklineData:Oa.value,casaPreviousSparklineData:Ea.value,bancaPreviousSparklineData:Ha.value,sparklineLabels:oa.value,previousSparklineLabels:da.value,cacheInfo:C.value},null,8,["casaTotal","bancaTotal","casaItems","bancaItems","casaTrend","bancaTrend","casaSparklineData","bancaSparklineData","casaPreviousSparklineData","bancaPreviousSparklineData","sparklineLabels","previousSparklineLabels","cacheInfo"])]}),"card-2":ca(()=>[q(Yt,{inflowsValue:R.value,outflowsValue:I.value,inflowsTrend:L.value,outflowsTrend:Q.value,inflowsSparkline:V.value,outflowsSparkline:ta.value,inflowsPreviousSparkline:F.value,outflowsPreviousSparkline:ya.value,sparklineLabels:oa.value,previousSparklineLabels:da.value,cacheInfo:b.value},null,8,["inflowsValue","outflowsValue","inflowsTrend","outflowsTrend","inflowsSparkline","outflowsSparkline","inflowsPreviousSparkline","outflowsPreviousSparkline","sparklineLabels","previousSparklineLabels","cacheInfo"])]),"card-3":ca(()=>{var D,B,G;return[q(Zt,{total:((D=r.value)==null?void 0:D.clienti_total)||0,trend:c.value,sparklineData:e.value,previousSparklineData:T.value,sparklineLabels:oa.value,previousSparklineLabels:da.value,breakdown:(G=(B=r.value)==null?void 0:B.breakdown)==null?void 0:G.clienti,cacheInfo:u.value},null,8,["total","trend","sparklineData","previousSparklineData","sparklineLabels","previousSparklineLabels","breakdown","cacheInfo"])]}),"card-4":ca(()=>{var D,B,G;return[q(Gt,{total:((D=r.value)==null?void 0:D.furnizori_total)||0,trend:M.value,sparklineData:U.value,previousSparklineData:y.value,sparklineLabels:oa.value,previousSparklineLabels:da.value,breakdown:(G=(B=r.value)==null?void 0:B.breakdown)==null?void 0:G.furnizori,cacheInfo:u.value},null,8,["total","trend","sparklineData","previousSparklineData","sparklineLabels","previousSparklineLabels","breakdown","cacheInfo"])]}),"card-5":ca(()=>[q(qt,{loading:sa(g).financialIndicators.loading,error:sa(g).financialIndicators.error,data:sa(g).financialIndicators.data,"initial-period":Aa.value,"cache-info":sa(g).financialIndicators.cacheInfo,mobile:"",onPeriodChange:Ya},null,8,["loading","error","data","initial-period","cache-info"])]),_:1})):l("",!0),wa.value?l("",!0):(t(),i("div",Fd,[q(Ua,{label:"Trezorerie",value:Ta.value,"value-class":Ta.value>=0?"positive":"negative"},{default:ca(()=>{var D,B,G,ia,la,va,pa,fa,ma,ba,_a,ha;return[q(Ut,{casaTotal:((G=(B=(D=o.value)==null?void 0:D.breakdown)==null?void 0:B.casa)==null?void 0:G.total)||0,bancaTotal:((va=(la=(ia=o.value)==null?void 0:ia.breakdown)==null?void 0:la.banca)==null?void 0:va.total)||0,casaItems:((ma=(fa=(pa=o.value)==null?void 0:pa.breakdown)==null?void 0:fa.casa)==null?void 0:ma.items)||[],bancaItems:((ha=(_a=(ba=o.value)==null?void 0:ba.breakdown)==null?void 0:_a.banca)==null?void 0:ha.items)||[],casaTrend:Ba.value,bancaTrend:Va.value,casaSparklineData:Na.value,bancaSparklineData:Oa.value,casaPreviousSparklineData:Ea.value,bancaPreviousSparklineData:Ha.value,sparklineLabels:oa.value,previousSparklineLabels:da.value,cacheInfo:C.value},null,8,["casaTotal","bancaTotal","casaItems","bancaItems","casaTrend","bancaTrend","casaSparklineData","bancaSparklineData","casaPreviousSparklineData","bancaPreviousSparklineData","sparklineLabels","previousSparklineLabels","cacheInfo"])]}),_:1},8,["value","value-class"]),q(Ua,{label:"Cash Flow",value:La.value,"value-class":La.value>=0?"positive":"negative"},{default:ca(()=>[q(Yt,{inflowsValue:R.value,outflowsValue:I.value,inflowsTrend:L.value,outflowsTrend:Q.value,inflowsSparkline:V.value,outflowsSparkline:ta.value,inflowsPreviousSparkline:F.value,outflowsPreviousSparkline:ya.value,sparklineLabels:oa.value,previousSparklineLabels:da.value,cacheInfo:b.value},null,8,["inflowsValue","outflowsValue","inflowsTrend","outflowsTrend","inflowsSparkline","outflowsSparkline","inflowsPreviousSparkline","outflowsPreviousSparkline","sparklineLabels","previousSparklineLabels","cacheInfo"])]),_:1},8,["value","value-class"]),q(Ua,{label:"Clienți",value:((E=r.value)==null?void 0:E.clienti_total)||0,"value-class":(((j=r.value)==null?void 0:j.clienti_total)||0)>=0?"positive":"negative"},{default:ca(()=>{var D,B,G;return[q(Zt,{total:((D=r.value)==null?void 0:D.clienti_total)||0,trend:c.value,sparklineData:e.value,previousSparklineData:T.value,sparklineLabels:oa.value,previousSparklineLabels:da.value,breakdown:(G=(B=r.value)==null?void 0:B.breakdown)==null?void 0:G.clienti,cacheInfo:u.value},null,8,["total","trend","sparklineData","previousSparklineData","sparklineLabels","previousSparklineLabels","breakdown","cacheInfo"])]}),_:1},8,["value","value-class"]),q(Ua,{label:"Furnizori",value:((W=r.value)==null?void 0:W.furnizori_total)||0,"value-class":(((Y=r.value)==null?void 0:Y.furnizori_total)||0)<=0?"positive":"negative"},{default:ca(()=>{var D,B,G;return[q(Gt,{total:((D=r.value)==null?void 0:D.furnizori_total)||0,trend:M.value,sparklineData:U.value,previousSparklineData:y.value,sparklineLabels:oa.value,previousSparklineLabels:da.value,breakdown:(G=(B=r.value)==null?void 0:B.breakdown)==null?void 0:G.furnizori,cacheInfo:u.value},null,8,["total","trend","sparklineData","previousSparklineData","sparklineLabels","previousSparklineLabels","breakdown","cacheInfo"])]}),_:1},8,["value","value-class"]),q(Ua,{label:"Datorii la buget",value:ae.value,"value-class":Fa.value>0?"negative":Pa.value>0?"positive":""},{default:ca(()=>[a("div",Ad,[p[6]||(p[6]=a("div",{class:"budget-debt-breakdown-header"},[a("span"),a("span",{class:"budget-debt-col-header-value"},"Datorat"),a("span",{class:"budget-debt-col-header-value budget-debt-col-achitat"},"Achitat"),a("span",{class:"budget-debt-col-header-value"},"Sold")],-1)),(t(!0),i(aa,null,ra(Ma.value,D=>(t(),i(aa,{key:D.key},[a("div",{class:"budget-debt-breakdown-row budget-debt-group-row",onClick:B=>te(D.key)},[a("span",Md,[a("i",{class:m(["pi pi-chevron-right budget-debt-toggle",{expanded:ga.value.has(D.key)}])},null,2),qa(" "+s(D.label),1)]),a("span",Ld,s(D.datorat>0?ua(D.datorat):"-"),1),a("span",Bd,s(D.achitat>0?ua(D.achitat):"-"),1),a("span",{class:m(["budget-debt-col-value",{"budget-debt-cleared":D.sold<=0&&D.datorat>0}])},s(D.sold>0?ua(D.sold):D.datorat>0?"✓":"-"),3)],8,Rd),K(a("div",Nd,[(t(!0),i(aa,null,ra(D.sub_accounts,B=>(t(),i("div",{key:B.cont,class:"budget-debt-breakdown-row budget-debt-subrow"},[a("span",Vd,s(B.label),1),a("span",Od,s(B.datorat>0?ua(B.datorat):"-"),1),a("span",Ed,s(B.achitat>0?ua(B.achitat):"-"),1),a("span",{class:m(["budget-debt-col-value budget-debt-sub-value",{"budget-debt-cleared":B.sold<=0&&B.datorat>0}])},s(B.sold>0?ua(B.sold):B.datorat>0?"✓":"-"),3)]))),128))],512),[[J,ga.value.has(D.key)]])],64))),128)),Ma.value.length===0?(t(),i("div",Hd," Nu există datorii înregistrate ")):l("",!0),$a.value.length>0?(t(),i(aa,{key:1},[p[5]||(p[5]=a("div",{class:"budget-debt-section-divider"},null,-1)),a("div",Wd,[p[4]||(p[4]=a("span",{class:"budget-debt-curent-title"},"Obligații curente:",-1)),(t(!0),i(aa,null,ra($a.value,D=>(t(),i("span",{key:"crt-"+D.key,class:"budget-debt-curent-chip"},s(D.label)+" "+s(ua(D.curent)),1))),128)),a("span",jd,"= "+s(ua(Ja.value)),1)])],64)):l("",!0)])]),_:1},8,["value","value-class"])]))]),wa.value?l("",!0):(t(),i("div",Xd,[q(qt,{loading:sa(g).financialIndicators.loading,error:sa(g).financialIndicators.error,data:sa(g).financialIndicators.data,"initial-period":Aa.value,"cache-info":sa(g).financialIndicators.cacheInfo,onPeriodChange:Ya},null,8,["loading","error","data","initial-period","cache-info"])]))])],2),wa.value?(t(),Da(di,{key:1})):l("",!0)],64)}}},su=ka(Yd,[["__scopeId","data-v-4f86c393"]]);export{su as default}; -//# sourceMappingURL=DashboardView.BmFJSoNT.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/DashboardView.BmFJSoNT.js.map b/deploy-package-20260223-151231/frontend/assets/DashboardView.BmFJSoNT.js.map deleted file mode 100644 index 5a49f22..0000000 --- a/deploy-package-20260223-151231/frontend/assets/DashboardView.BmFJSoNT.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DashboardView.BmFJSoNT.js","sources":["../../src/shared/components/CacheFooter.vue","../../src/modules/reports/components/dashboard/cards/CashFlowMetricCard.vue","../../src/modules/reports/components/dashboard/cards/ClientiBalanceCard.vue","../../src/modules/reports/components/dashboard/cards/FurnizoriBalanceCard.vue","../../src/modules/reports/components/dashboard/cards/TreasuryDualCard.vue","../../src/modules/reports/components/solduri/SolduriCompactCard.vue","../../src/modules/reports/components/dashboard/cards/IndicatorItem.vue","../../src/modules/reports/components/dashboard/cards/FinancialIndicatorsCard.vue","../../src/shared/components/CollapsibleCard.vue","../../src/shared/components/mobile/SwipeableCards.vue","../../src/modules/reports/views/DashboardView.vue"],"sourcesContent":["\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n"],"names":["props","__props","showCacheInfo","computed","cacheText","badgeClass","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeClass","_toDisplayString","Chart","registerables","inflowsCanvas","ref","outflowsCanvas","inflowsChartInstance","outflowsChartInstance","chartsExpanded","toggleChartsExpanded","formatCurrency","amount","hasSparklineData","initializeInflowsChart","nextTick","ctx","labels","_","i","datasets","allDataPoints","dataMin","dataMax","dataRange","minVisibleRange","sum","val","center","targetRange","calculatedMin","calculatedMax","paddingAmount","yMin","yMax","context","value","label","formattedValue","initializeOutflowsChart","watch","onMounted","onBeforeUnmount","_hoisted_2","_hoisted_3","_cache","_hoisted_4","_hoisted_5","_hoisted_6","_withDirectives","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_createVNode","CacheFooter","_a","_b","_c","chartCanvas","chartInstance","isRestantExpanded","toggleRestantExpanded","formatPeriodLabel","key","getBalanceClass","numAmount","getTrendClass","trend","getTrendIconClass","initializeChart","_Fragment","_renderList","_hoisted_13","_hoisted_14","_hoisted_15","_d","_e","_f","casaCanvas","bancaCanvas","casaChartInstance","bancaChartInstance","isCasaExpanded","isBancaExpanded","toggleCasaExpanded","toggleBancaExpanded","initializeCasaChart","dataPadding","initializeBancaChart","item","idx","_createTextVNode","_hoisted_16","_hoisted_17","isExpanded","expandedGroups","toggleGroup","valueColorClass","curentTotal","g","hasBreakdown","toggleExpanded","formatAmount","_h","_g","_hoisted_18","_j","_i","_l","_k","_hoisted_19","_hoisted_20","group","_withModifiers","$event","_hoisted_22","_hoisted_23","acc","_hoisted_24","_hoisted_25","_hoisted_26","_vShow","_hoisted_27","_hoisted_28","_hoisted_29","svgWidth","svgHeight","descExpanded","toggleDescription","padding","sparklineContainer","hoveredIndex","mouseX","normalizedStatus","statusClass","statusIcon","iconMap","strokeColor","sparklinePoints","data","v","min","range","chartWidth","chartHeight","index","x","y","pointPositions","hoveredPoint","tooltipLabel","tooltipValue","tooltipStyle","containerRect","thresholdText","parts","trendInfo","validData","first","last","change","text","handleMouseMove","event","relativeX","targetX","closestIndex","closestDistance","point","distance","handleMouseLeave","emit","__emit","expanded","showAllIndicators","selectedPeriod","newPeriod","periodOptions","currentDate","currentYear","currentMonth","options","month","year","monthName","subIndicatorsExpanded","toggleSubIndicators","category","lichiditate","eficienta","risc","cash_flow","dinamica","altman_zscore","profitabilitate","solvabilitate","indicators","addIndicator","name","description","unit","decimals","formatValue","num","formatted","normalizeStatus","status","getStatusClass","handlePeriodChange","_unref","Dropdown","_createBlock","IndicatorItem","_hoisted_21","_m","_n","_o","_p","_hoisted_30","_q","_hoisted_31","_hoisted_32","_r","_hoisted_33","_hoisted_34","_s","_hoisted_35","_hoisted_36","_t","_hoisted_37","_hoisted_38","_u","_hoisted_39","_hoisted_40","_v","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_w","_hoisted_45","_x","_hoisted_46","_y","_hoisted_47","_z","_hoisted_48","_hoisted_49","_A","_hoisted_50","_hoisted_51","_B","_hoisted_52","_hoisted_53","_C","_hoisted_54","_hoisted_55","_D","_hoisted_56","_hoisted_57","_E","_hoisted_58","_hoisted_59","_F","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_G","_hoisted_64","_H","_hoisted_65","_I","_hoisted_66","_J","_hoisted_67","_hoisted_68","_K","_hoisted_69","_hoisted_70","_L","_hoisted_71","_hoisted_72","_M","_hoisted_73","_hoisted_74","_N","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_O","_hoisted_79","_P","_hoisted_80","_Q","_hoisted_81","_hoisted_82","_R","_hoisted_83","_hoisted_84","_S","_hoisted_85","_hoisted_86","_T","_hoisted_87","_hoisted_88","_U","_hoisted_89","_hoisted_90","_hoisted_91","_hoisted_92","_V","_hoisted_93","_W","_hoisted_94","_X","_hoisted_95","_Y","_hoisted_96","_Z","_hoisted_97","__","_hoisted_98","_hoisted_99","_$","_hoisted_100","_hoisted_101","_aa","_hoisted_102","_hoisted_103","_ba","_hoisted_104","_hoisted_105","_ca","_hoisted_106","_hoisted_107","_da","_hoisted_108","_hoisted_109","_hoisted_110","_hoisted_111","_ea","_hoisted_112","_hoisted_113","_fa","_hoisted_114","_hoisted_115","_ga","_hoisted_116","_hoisted_117","_ha","_hoisted_118","_hoisted_119","_ia","_hoisted_120","_hoisted_121","_ka","_ja","_ma","_la","_hoisted_122","_hoisted_123","_oa","_na","_qa","_pa","_hoisted_124","_hoisted_125","_sa","_ra","_ua","_ta","_hoisted_126","_hoisted_127","_hoisted_128","_hoisted_129","_va","_hoisted_130","_wa","_hoisted_131","_hoisted_132","_xa","_hoisted_133","_hoisted_134","_ya","_hoisted_135","_hoisted_136","_za","_hoisted_137","_hoisted_138","_hoisted_139","_hoisted_141","_hoisted_142","_Aa","_Ba","_Ca","BottomSheet","_hoisted_143","_hoisted_144","_hoisted_145","_hoisted_146","_hoisted_147","_hoisted_148","_hoisted_149","_hoisted_150","_hoisted_151","_hoisted_152","_hoisted_153","_hoisted_154","_hoisted_155","_hoisted_156","_hoisted_157","_hoisted_158","_hoisted_159","_hoisted_160","_hoisted_161","_hoisted_162","_hoisted_163","_hoisted_164","_hoisted_165","_hoisted_166","_hoisted_167","_hoisted_168","_hoisted_169","_hoisted_170","_hoisted_171","_hoisted_172","_hoisted_173","_hoisted_174","_hoisted_175","_hoisted_176","_hoisted_177","_hoisted_178","_hoisted_179","_hoisted_180","_hoisted_181","_hoisted_182","_hoisted_183","_hoisted_184","_hoisted_185","_hoisted_186","_hoisted_187","_hoisted_188","_hoisted_189","_hoisted_190","_hoisted_191","_hoisted_192","_hoisted_193","_hoisted_194","_hoisted_195","_hoisted_196","_hoisted_197","_hoisted_198","_hoisted_199","_hoisted_200","_hoisted_201","_hoisted_202","_hoisted_203","_hoisted_204","_hoisted_205","_hoisted_206","_hoisted_207","_hoisted_208","_hoisted_209","_hoisted_210","_hoisted_211","_hoisted_212","_hoisted_213","_hoisted_214","_hoisted_215","_hoisted_216","_hoisted_217","_hoisted_218","_hoisted_219","_hoisted_220","_hoisted_221","_hoisted_222","_hoisted_223","_hoisted_224","_hoisted_225","_hoisted_226","_hoisted_227","_hoisted_228","_hoisted_229","_hoisted_230","_hoisted_231","_hoisted_232","_hoisted_233","_hoisted_234","_hoisted_235","_hoisted_236","_hoisted_237","_hoisted_238","_hoisted_239","_hoisted_240","_hoisted_241","_hoisted_242","_hoisted_243","_hoisted_244","_hoisted_245","_hoisted_246","_hoisted_247","_hoisted_248","_hoisted_249","_hoisted_250","_hoisted_251","_hoisted_252","_hoisted_253","_hoisted_254","_hoisted_255","_hoisted_256","_hoisted_257","_hoisted_258","_hoisted_259","_hoisted_260","_hoisted_261","_hoisted_262","_hoisted_263","_hoisted_264","_hoisted_265","_hoisted_266","_hoisted_267","_hoisted_268","_hoisted_269","_hoisted_270","_hoisted_271","_renderSlot","_ctx","SWIPE_THRESHOLD","SWIPE_VELOCITY_THRESHOLD","ANGLE_THRESHOLD","trackRef","currentIndex","isDragging","dragOffset","activeCardHeight","resizeObserver","updateActiveHeight","activeSlide","h","setupResizeObserver","slide","touchStartX","touchStartY","touchCurrentX","isSwiping","autoPlayTimer","trackStyle","getTrackWidth","goToCard","nextCard","prevCard","handleTouchStart","stopAutoPlay","handleTouchMove","touchCurrentY","deltaX","deltaY","angle","adjustedDelta","handleTouchEnd","resetTouchState","trackWidth","percentMoved","touchDuration","velocity","startAutoPlay","newTotal","onUnmounted","__expose","toast","useToast","router","useRouter","companyStore","useCompanyStore","dashboardStore","useDashboardStore","periodStore","useAccountingPeriodStore","authStore","useAuthStore","filteredCompanies","isLoading","showDrawer","monthlyInflows","monthlyOutflows","treasuryData","netBalanceData","treasuryCacheInfo","netBalanceCacheInfo","cashflowCacheInfo","selectedChartType","calculateTrend","metric","raw","c","current","previous","direction","getSparklineData","getSparklineLabels","period","getPreviousSparklineData","getPreviousSparklineLabels","clientiTrend","clientiSparkline","clientiPreviousSparkline","furnizoriTrend","furnizoriSparkline","furnizoriPreviousSparkline","inflowsTrend","inflowsSparkline","inflowsPreviousSparkline","outflowsTrend","outflowsSparkline","outflowsPreviousSparkline","sparklineLabels","previousSparklineLabels","totalTrezorerie","casaTotal","bancaTotal","s","tvaPreviousMonth","prev","budgetDebtBreakdown","budgetDebtBreakdownCurent","budgetDebtTotalCurent","budgetDebtTotalPrecedent","budgetDebtSold","budgetDebtHeaderValue","datorat","sold","fmt","n","tvaBreakdown","expandedBudgetGroups","toggleBudgetGroup","netCashFlow","casaTrend","tTrend","casaSparkline","sparklineData","totalTreasury","casaProportion","bancaTrend","bancaSparkline","bancaProportion","casaPreviousSparkline","previousSparklineData","bancaPreviousSparkline","windowWidth","isMobile","handleResize","handleLogout","handleServerSwitched","newServerId","mobileTopBarActions","handleMobileAction","action","handleRefresh","loadDashboardData","handleFinancialIndicatorsPeriodChange","an","luna","previousPeriodForIndicators","loadTrendData","result","loadMonthlyFlows","params","getWithCacheInfo","error","loadTreasuryBreakdown","loadNetBalanceBreakdown","prevPeriod","indicatorLuna","indicatorAn","newCompany","oldPeriod","exists","MobileTopBar","MobileDrawerMenu","Button","SwipeableCards","SolduriCompactCard","TreasuryDualCard","CashFlowMetricCard","ClientiBalanceCard","FurnizoriBalanceCard","FinancialIndicatorsCard","CollapsibleCard","MobileBottomNav"],"mappings":"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"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/DashboardView.DmccouDw.css b/deploy-package-20260223-151231/frontend/assets/DashboardView.DmccouDw.css deleted file mode 100644 index c89f19e..0000000 --- a/deploy-package-20260223-151231/frontend/assets/DashboardView.DmccouDw.css +++ /dev/null @@ -1 +0,0 @@ -.trend-indicator[data-v-c6027328]{display:flex;align-items:center;gap:var(--space-xs);font-size:var(--text-sm);font-weight:var(--font-medium)}.trend-up[data-v-c6027328]{color:var(--color-success)}.trend-down[data-v-c6027328]{color:var(--color-error)}.trend-neutral[data-v-c6027328]{color:var(--color-text-secondary)}.trend-icon[data-v-c6027328]{font-size:.75rem}.trend-value[data-v-c6027328]{font-weight:var(--font-semibold)}.metric-value.positive[data-v-c6027328]{color:var(--color-success)}.metric-value.negative[data-v-c6027328]{color:var(--color-error)}.metric-breakdown[data-v-c6027328]{margin-top:var(--space-lg);padding-top:var(--space-md);border-top:1px solid var(--color-border)}.breakdown-section[data-v-c6027328]{margin-bottom:var(--space-sm)}.breakdown-section[data-v-c6027328]:last-child{margin-bottom:0}.breakdown-group[data-v-c6027328]{margin-bottom:var(--space-sm)}.breakdown-item[data-v-c6027328]{margin-bottom:var(--space-xs)}.breakdown-item[data-v-c6027328]:last-child{margin-bottom:0}.breakdown-cont[data-v-c6027328]{font-size:var(--text-sm);opacity:.7;margin-left:var(--space-xs)}.cache-footer[data-v-9e2ae10a]{display:flex;justify-content:flex-end;padding:var(--space-xs) 0;margin-top:var(--space-sm);border-top:1px solid var(--surface-border)}.cache-badge[data-v-9e2ae10a]{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm, 4px);font-size:11px;font-weight:var(--font-medium);font-family:SF Mono,Consolas,Liberation Mono,Menlo,monospace;letter-spacing:.02em}.cache-badge.cache-l1[data-v-9e2ae10a]{background:var(--green-50);color:var(--green-700)}.cache-badge.cache-l2[data-v-9e2ae10a]{background:var(--blue-50);color:var(--blue-700)}.cache-badge.cache-db[data-v-9e2ae10a]{background:var(--surface-hover);color:var(--text-color-secondary)}[data-theme=dark] .cache-badge.cache-l1[data-v-9e2ae10a]{background:#22c55e26;color:var(--green-400)}[data-theme=dark] .cache-badge.cache-l2[data-v-9e2ae10a]{background:#3b82f626;color:var(--blue-400)}[data-theme=dark] .cache-badge.cache-db[data-v-9e2ae10a]{background:var(--surface-100);color:var(--text-color-secondary)}@media (prefers-color-scheme: dark){:root:not([data-theme=light]) .cache-badge.cache-l1[data-v-9e2ae10a]{background:#22c55e26;color:var(--green-400)}:root:not([data-theme=light]) .cache-badge.cache-l2[data-v-9e2ae10a]{background:#3b82f626;color:var(--blue-400)}:root:not([data-theme=light]) .cache-badge.cache-db[data-v-9e2ae10a]{background:var(--surface-100);color:var(--text-color-secondary)}}.cashflow-card[data-v-887a883d]{min-height:420px}.metric-label[data-v-887a883d]{font-size:var(--text-sm);color:var(--text-color-secondary)}.metric-value[data-v-887a883d]{font-size:var(--text-sm);font-weight:var(--font-bold);font-family:var(--font-mono, monospace)}.values-section[data-v-887a883d]{display:grid;grid-template-columns:1fr auto 1fr;gap:1rem;align-items:start}.value-block[data-v-887a883d]{display:flex;flex-direction:row;justify-content:space-between;align-items:center;gap:1rem}.divider[data-v-887a883d]{width:1px;height:100%;background:var(--color-border);min-height:60px}.charts-toggle-header[data-v-887a883d]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) var(--space-md);margin-top:var(--space-sm);background:var(--surface-hover);border-radius:var(--radius-sm);cursor:pointer;font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--color-text-secondary);transition:background-color var(--transition-fast)}.charts-toggle-header[data-v-887a883d]:hover{background:var(--surface-border)}.charts-toggle-header i[data-v-887a883d]{transition:transform var(--transition-fast)}.charts-toggle-header i.expanded[data-v-887a883d]{transform:rotate(90deg)}.charts-content[data-v-887a883d]{margin-top:var(--space-sm)}.sparkline-dual-container[data-v-887a883d]{width:100%;display:flex;flex-direction:column;gap:.75rem;margin:.5rem 0}.sparkline-wrapper[data-v-887a883d]{width:100%;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:4px;padding:.5rem}.sparkline-chart[data-v-887a883d]{width:100%;height:150px;position:relative}.sparkline-canvas[data-v-887a883d]{width:100%!important;height:100%!important;display:block}@media (max-width: 768px){.cashflow-card[data-v-887a883d]{min-height:380px}.values-section[data-v-887a883d]{grid-template-columns:1fr;gap:.75rem}.divider[data-v-887a883d]{width:100%;height:1px;min-height:1px}.sparkline-chart[data-v-887a883d]{height:130px}}@media (max-width: 480px){.sparkline-chart[data-v-887a883d]{height:150px}.sparkline-wrapper[data-v-887a883d]{padding:.25rem}}.clienti-balance-card[data-v-c7f80a0b]{min-height:280px}.card-header-mobile[data-v-c7f80a0b]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) 0;margin-bottom:var(--space-sm);border-bottom:1px solid var(--surface-border)}.header-left[data-v-c7f80a0b]{display:flex;align-items:center;gap:var(--space-sm)}.header-dot[data-v-c7f80a0b]{width:10px;height:10px;border-radius:50%}.header-dot.clienti[data-v-c7f80a0b]{background:var(--green-500)}.header-label[data-v-c7f80a0b]{font-size:var(--text-sm);font-weight:var(--font-semibold);color:var(--text-color)}.header-values[data-v-c7f80a0b]{display:flex;align-items:center;gap:var(--space-sm)}.header-total[data-v-c7f80a0b]{font-size:var(--text-sm);font-weight:var(--font-bold);font-family:var(--font-mono, monospace)}.breakdown-label[data-v-c7f80a0b]{font-size:var(--text-sm)}.breakdown-value[data-v-c7f80a0b]{font-size:var(--text-sm);font-family:var(--font-mono, monospace)}.breakdown-sublabel[data-v-c7f80a0b]{font-size:var(--text-xs);color:var(--text-color-secondary)}.breakdown-subvalue[data-v-c7f80a0b]{font-size:var(--text-xs);font-family:var(--font-mono, monospace)}.header-total.positive[data-v-c7f80a0b]{color:var(--green-600)}.header-total.negative[data-v-c7f80a0b]{color:var(--red-600)}.header-total.neutral[data-v-c7f80a0b]{color:var(--text-color)}.header-trend[data-v-c7f80a0b]{display:flex;align-items:center;gap:2px;font-size:var(--text-sm);font-weight:var(--font-medium)}.header-trend i[data-v-c7f80a0b]{font-size:var(--text-xs)}.positive[data-v-c7f80a0b]{color:var(--green-600)}.negative[data-v-c7f80a0b]{color:var(--red-600)}.neutral[data-v-c7f80a0b]{color:var(--text-color)}.trend-up[data-v-c7f80a0b]{color:var(--green-600)}.trend-down[data-v-c7f80a0b]{color:var(--red-600)}.trend-neutral[data-v-c7f80a0b]{color:var(--text-color-secondary)}[data-theme=dark] .header-total.positive[data-v-c7f80a0b],[data-theme=dark] .positive[data-v-c7f80a0b],[data-theme=dark] .trend-up[data-v-c7f80a0b]{color:var(--green-400)}[data-theme=dark] .header-total.negative[data-v-c7f80a0b],[data-theme=dark] .negative[data-v-c7f80a0b],[data-theme=dark] .trend-down[data-v-c7f80a0b]{color:var(--red-400)}.sparkline-chart[data-v-c7f80a0b]{width:100%;height:150px;position:relative}.sparkline-canvas[data-v-c7f80a0b]{width:100%!important;height:100%!important;display:block}.charts-toggle-header[data-v-c7f80a0b]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) var(--space-md);margin-top:var(--space-sm);background:var(--surface-hover);border-radius:var(--radius-sm);cursor:pointer;font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--color-text-secondary);transition:background-color var(--transition-fast)}.charts-toggle-header[data-v-c7f80a0b]:hover{background:var(--surface-border)}.charts-toggle-header i[data-v-c7f80a0b]{transition:transform var(--transition-fast)}.charts-toggle-header i.expanded[data-v-c7f80a0b]{transform:rotate(90deg)}.charts-content[data-v-c7f80a0b]{margin-top:var(--space-sm)}@media (max-width: 768px){.clienti-balance-card[data-v-c7f80a0b]{min-height:280px}.sparkline-chart[data-v-c7f80a0b]{height:130px}}@media (max-width: 480px){.sparkline-chart[data-v-c7f80a0b]{height:150px}}.furnizori-balance-card[data-v-0edde778]{min-height:280px}.card-header-mobile[data-v-0edde778]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) 0;margin-bottom:var(--space-sm);border-bottom:1px solid var(--surface-border)}.header-left[data-v-0edde778]{display:flex;align-items:center;gap:var(--space-sm)}.header-dot[data-v-0edde778]{width:10px;height:10px;border-radius:50%}.header-dot.furnizori[data-v-0edde778]{background:var(--red-500)}.header-label[data-v-0edde778]{font-size:var(--text-sm);font-weight:var(--font-semibold);color:var(--text-color)}.header-values[data-v-0edde778]{display:flex;align-items:center;gap:var(--space-sm)}.header-total[data-v-0edde778]{font-size:var(--text-sm);font-weight:var(--font-bold);font-family:var(--font-mono, monospace)}.breakdown-label[data-v-0edde778]{font-size:var(--text-sm)}.breakdown-value[data-v-0edde778]{font-size:var(--text-sm);font-family:var(--font-mono, monospace)}.breakdown-sublabel[data-v-0edde778]{font-size:var(--text-xs);color:var(--text-color-secondary)}.breakdown-subvalue[data-v-0edde778]{font-size:var(--text-xs);font-family:var(--font-mono, monospace)}.header-total.positive[data-v-0edde778]{color:var(--green-600)}.header-total.negative[data-v-0edde778]{color:var(--red-600)}.header-total.neutral[data-v-0edde778]{color:var(--text-color)}.header-trend[data-v-0edde778]{display:flex;align-items:center;gap:2px;font-size:var(--text-sm);font-weight:var(--font-medium)}.header-trend i[data-v-0edde778]{font-size:var(--text-xs)}.positive[data-v-0edde778]{color:var(--green-600)}.negative[data-v-0edde778]{color:var(--red-600)}.neutral[data-v-0edde778]{color:var(--text-color)}.trend-up[data-v-0edde778]{color:var(--green-600)}.trend-down[data-v-0edde778]{color:var(--red-600)}.trend-neutral[data-v-0edde778]{color:var(--text-color-secondary)}[data-theme=dark] .header-total.positive[data-v-0edde778],[data-theme=dark] .positive[data-v-0edde778],[data-theme=dark] .trend-up[data-v-0edde778]{color:var(--green-400)}[data-theme=dark] .header-total.negative[data-v-0edde778],[data-theme=dark] .negative[data-v-0edde778],[data-theme=dark] .trend-down[data-v-0edde778]{color:var(--red-400)}.sparkline-chart[data-v-0edde778]{width:100%;height:150px;position:relative}.sparkline-canvas[data-v-0edde778]{width:100%!important;height:100%!important;display:block}.charts-toggle-header[data-v-0edde778]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) var(--space-md);margin-top:var(--space-sm);background:var(--surface-hover);border-radius:var(--radius-sm);cursor:pointer;font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--color-text-secondary);transition:background-color var(--transition-fast)}.charts-toggle-header[data-v-0edde778]:hover{background:var(--surface-border)}.charts-toggle-header i[data-v-0edde778]{transition:transform var(--transition-fast)}.charts-toggle-header i.expanded[data-v-0edde778]{transform:rotate(90deg)}.charts-content[data-v-0edde778]{margin-top:var(--space-sm)}@media (max-width: 768px){.furnizori-balance-card[data-v-0edde778]{min-height:280px}.sparkline-chart[data-v-0edde778]{height:130px}}@media (max-width: 480px){.sparkline-chart[data-v-0edde778]{height:150px}}.treasury-dual-card[data-v-e3686648]{min-height:320px}.treasury-items[data-v-e3686648]{display:flex;flex-direction:column;gap:var(--space-sm)}.treasury-group[data-v-e3686648]{border:1px solid var(--surface-border);border-radius:var(--radius-sm);overflow:hidden}.treasury-header[data-v-e3686648]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-md);cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--surface-ground);transition:background-color var(--transition-fast)}.treasury-header[data-v-e3686648]:hover{background:var(--surface-hover)}.treasury-header-left[data-v-e3686648]{display:flex;align-items:center;gap:var(--space-sm)}.treasury-toggle[data-v-e3686648]{color:var(--text-color-secondary);font-size:var(--text-xs);transition:transform var(--transition-fast)}.treasury-toggle.expanded[data-v-e3686648]{transform:rotate(90deg)}.treasury-label[data-v-e3686648]{font-size:var(--text-sm);font-weight:var(--font-semibold);color:var(--text-color)}.treasury-value[data-v-e3686648]{font-size:var(--text-sm);font-weight:var(--font-bold);font-family:var(--font-mono, monospace)}.treasury-subitems[data-v-e3686648]{padding:var(--space-sm) var(--space-md) var(--space-md);background:var(--surface-card);border-top:1px solid var(--surface-border)}.treasury-subitem[data-v-e3686648]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-xs) 0}.treasury-sublabel[data-v-e3686648]{font-size:var(--text-sm);color:var(--text-color-secondary)}.treasury-cont[data-v-e3686648]{font-size:var(--text-xs);opacity:.7;margin-left:var(--space-xs)}.treasury-subvalue[data-v-e3686648]{font-size:var(--text-sm);font-weight:var(--font-medium);font-family:var(--font-mono, monospace);color:var(--text-color)}.sparkline-dual-container[data-v-e3686648]{width:100%;display:flex;flex-direction:column;gap:.75rem;margin:.5rem 0}.sparkline-wrapper[data-v-e3686648]{width:100%;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:4px;padding:.5rem}.sparkline-chart[data-v-e3686648]{width:100%;height:150px;position:relative}.sparkline-canvas[data-v-e3686648]{width:100%!important;height:100%!important;display:block}.charts-toggle-header[data-v-e3686648]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) var(--space-md);margin-top:var(--space-sm);background:var(--surface-hover);border-radius:var(--radius-sm);cursor:pointer;font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--color-text-secondary);transition:background-color var(--transition-fast)}.charts-toggle-header[data-v-e3686648]:hover{background:var(--surface-border)}.charts-toggle-header i[data-v-e3686648]{transition:transform var(--transition-fast)}.charts-toggle-header i.expanded[data-v-e3686648]{transform:rotate(90deg)}.charts-content[data-v-e3686648]{margin-top:var(--space-sm)}@media (max-width: 768px){.treasury-dual-card[data-v-e3686648]{min-height:280px}.sparkline-chart[data-v-e3686648]{height:130px}}@media (max-width: 480px){.treasury-dual-card[data-v-e3686648]{min-height:240px}.treasury-header[data-v-e3686648]{padding:var(--space-sm)}.treasury-value[data-v-e3686648]{font-size:var(--text-base)}.sparkline-chart[data-v-e3686648]{height:120px}.sparkline-wrapper[data-v-e3686648]{padding:0;border:none}}.solduri-compact-card[data-v-9b5bdab3]{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-md);padding:var(--space-md);cursor:pointer;transition:all var(--transition-fast);min-height:80px;display:flex;flex-direction:column;gap:var(--space-sm)}.solduri-compact-card[data-v-9b5bdab3]:hover{box-shadow:var(--shadow-md);border-color:var(--color-primary)}.solduri-compact-card[data-v-9b5bdab3]:active{transform:scale(.98)}.solduri-compact-card__header[data-v-9b5bdab3]{display:flex;align-items:center;gap:var(--space-sm)}.solduri-compact-card__content[data-v-9b5bdab3]{flex:1;display:flex;flex-direction:column;gap:var(--space-xs);min-width:0}.solduri-compact-card__label[data-v-9b5bdab3]{font-size:var(--text-xs);font-weight:var(--font-semibold);color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.05em}.solduri-compact-card__value[data-v-9b5bdab3]{font-size:var(--text-lg);font-weight:var(--font-bold);color:var(--color-text);font-family:var(--font-mono, monospace);line-height:var(--leading-tight)}.solduri-compact-card__debt-line[data-v-9b5bdab3]{display:flex;align-items:baseline;gap:var(--space-xs);flex-wrap:wrap}.solduri-compact-card__debt-sep[data-v-9b5bdab3]{color:var(--text-color-secondary);font-size:var(--text-lg);font-weight:var(--font-bold)}.solduri-compact-card__value--sold[data-v-9b5bdab3]{color:var(--text-color-secondary)}.solduri-compact-card__value--success[data-v-9b5bdab3]{color:var(--green-600)}.solduri-compact-card__value--danger[data-v-9b5bdab3]{color:var(--red-600)}.solduri-compact-card__chevron[data-v-9b5bdab3]{color:var(--color-text-secondary);font-size:var(--text-sm);transition:transform var(--transition-fast)}.solduri-compact-card__chevron--expanded[data-v-9b5bdab3]{transform:rotate(180deg)}.solduri-compact-card__breakdown[data-v-9b5bdab3]{padding-top:var(--space-sm);border-top:1px solid var(--surface-border);display:flex;flex-direction:column;gap:var(--space-xs)}.solduri-compact-card__breakdown-item[data-v-9b5bdab3]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-xs) 0}.solduri-compact-card__breakdown-label[data-v-9b5bdab3]{font-size:var(--text-sm);color:var(--color-text-secondary);font-weight:var(--font-medium)}.solduri-compact-card__breakdown-value[data-v-9b5bdab3]{font-size:var(--text-sm);font-weight:var(--font-semibold);color:var(--color-text);font-family:var(--font-mono, monospace)}.solduri-compact-card__breakdown-value--success[data-v-9b5bdab3]{color:var(--green-600)}.solduri-compact-card__breakdown-value--danger[data-v-9b5bdab3]{color:var(--red-600)}.solduri-compact-card__breakdown-value--warning[data-v-9b5bdab3]{color:var(--orange-600)}.solduri-compact-card__breakdown-subitem[data-v-9b5bdab3]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-xs) 0;padding-left:var(--space-md)}.solduri-compact-card__breakdown-sublabel[data-v-9b5bdab3]{font-size:var(--text-sm);color:var(--color-text-secondary)}.solduri-compact-card__breakdown-subvalue[data-v-9b5bdab3]{font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--color-text);font-family:var(--font-mono, monospace)}.solduri-compact-card__debt-header[data-v-9b5bdab3],.solduri-compact-card__breakdown-group[data-v-9b5bdab3],.solduri-compact-card__breakdown-subitem[data-v-9b5bdab3]{display:grid;grid-template-columns:1fr auto auto;gap:var(--space-sm);align-items:center}.solduri-compact-card__col-head[data-v-9b5bdab3]{font-size:var(--text-xs);color:var(--text-color-secondary);text-align:right;min-width:54px}.solduri-compact-card__breakdown-group .solduri-compact-card__breakdown-value[data-v-9b5bdab3],.solduri-compact-card__breakdown-subitem .solduri-compact-card__breakdown-subvalue[data-v-9b5bdab3]{text-align:right;min-width:54px}.solduri-compact-card__breakdown-group[data-v-9b5bdab3]{cursor:pointer;font-weight:var(--font-semibold);padding:var(--space-xs) 0}.solduri-compact-card__breakdown-group[data-v-9b5bdab3]:hover{background:var(--surface-hover)}.solduri-compact-card__group-label[data-v-9b5bdab3]{display:flex;align-items:center;gap:var(--space-xs)}.solduri-compact-card__group-toggle[data-v-9b5bdab3]{font-size:var(--text-xs);color:var(--color-text-secondary);transition:transform var(--transition-fast)}.solduri-compact-card__group-toggle--expanded[data-v-9b5bdab3]{transform:rotate(90deg)}.solduri-compact-card__cleared[data-v-9b5bdab3]{color:var(--green-600);font-weight:var(--font-semibold)}.solduri-compact-card__divider[data-v-9b5bdab3]{height:1px;background:var(--surface-border);margin:var(--space-sm) 0}.solduri-compact-card__curent-summary[data-v-9b5bdab3]{display:flex;flex-wrap:wrap;gap:var(--space-xs);align-items:center}.solduri-compact-card__curent-title[data-v-9b5bdab3]{font-size:var(--text-xs);color:var(--text-color-secondary)}.solduri-compact-card__curent-chip[data-v-9b5bdab3]{font-size:var(--text-sm);font-weight:var(--font-semibold);background:var(--surface-hover);border-radius:var(--radius-sm);padding:2px var(--space-xs);color:var(--text-color)}.solduri-compact-card__curent-total[data-v-9b5bdab3]{font-size:var(--text-sm);font-weight:var(--font-bold);font-family:var(--font-mono, monospace);color:var(--text-color);margin-left:var(--space-xs)}@media (max-width: 768px){.solduri-compact-card[data-v-9b5bdab3]{padding:var(--space-sm);min-height:70px}.solduri-compact-card__value[data-v-9b5bdab3]{font-size:var(--text-base)}.solduri-compact-card__breakdown-subitem[data-v-9b5bdab3]{padding-left:var(--space-sm)}}@media (pointer: coarse){.solduri-compact-card[data-v-9b5bdab3]{min-height:80px}}.indicator-item[data-v-2547e9a0]{background:transparent;border:1px solid var(--surface-border);border-radius:var(--radius-sm);padding:var(--space-md);display:flex;flex-direction:column;gap:var(--space-xs);position:relative;transition:border-color var(--transition-fast)}.indicator-item[data-v-2547e9a0]:hover{border-color:var(--surface-hover)}.indicator-label[data-v-2547e9a0]{font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--text-color-secondary);text-align:center;display:flex;align-items:center;justify-content:center;gap:var(--space-xs)}.desc-toggle[data-v-2547e9a0]{font-size:var(--text-xs);color:var(--text-color-secondary);cursor:pointer;padding:2px;border-radius:var(--radius-sm);transition:all var(--transition-fast);opacity:.6}.desc-toggle[data-v-2547e9a0]:hover{color:var(--primary-color);opacity:1;background:var(--surface-hover)}.indicator-description[data-v-2547e9a0]{font-size:var(--text-xs);color:var(--text-color-secondary);text-align:center;opacity:.8;line-height:1.3;padding:var(--space-xs);background:var(--surface-hover);border-radius:var(--radius-sm);margin-bottom:var(--space-xs)}.slide-down[data-v-2547e9a0]{animation:slideDown-2547e9a0 .2s ease-out}@keyframes slideDown-2547e9a0{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.indicator-main[data-v-2547e9a0]{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);position:relative}.indicator-value[data-v-2547e9a0]{font-size:var(--text-2xl);font-weight:var(--font-bold);font-family:var(--font-mono);text-align:center}.indicator-status-icon[data-v-2547e9a0]{position:absolute;right:0;top:50%;transform:translateY(-50%);font-size:var(--text-lg)}.status-good[data-v-2547e9a0]{color:var(--green-600)}.status-warning[data-v-2547e9a0]{color:var(--yellow-600)}.status-danger[data-v-2547e9a0]{color:var(--red-600)}.status-neutral[data-v-2547e9a0]{color:var(--text-color-secondary)}[data-theme=dark] .status-good[data-v-2547e9a0]{color:var(--green-400)}[data-theme=dark] .status-warning[data-v-2547e9a0]{color:var(--yellow-400)}[data-theme=dark] .status-danger[data-v-2547e9a0]{color:var(--red-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .status-good[data-v-2547e9a0]{color:var(--green-400)}:root:not([data-theme]) .status-warning[data-v-2547e9a0]{color:var(--yellow-400)}:root:not([data-theme]) .status-danger[data-v-2547e9a0]{color:var(--red-400)}}.sparkline-container[data-v-2547e9a0]{width:100%;height:40px;position:relative;margin-top:var(--space-xs)}.sparkline-svg[data-v-2547e9a0]{width:100%;height:100%;display:block}.sparkline-line[data-v-2547e9a0]{vector-effect:non-scaling-stroke}.sparkline-point[data-v-2547e9a0]{transition:r .15s ease}.sparkline-tooltip[data-v-2547e9a0]{position:absolute;bottom:calc(100% + 4px);background:var(--surface-overlay);border:1px solid var(--surface-border);border-radius:var(--radius-sm);padding:var(--space-xs) var(--space-sm);box-shadow:var(--shadow-md);z-index:var(--z-tooltip);pointer-events:none;white-space:nowrap}.tooltip-label[data-v-2547e9a0]{font-size:var(--text-xs);color:var(--text-color-secondary);margin-bottom:2px}.tooltip-value[data-v-2547e9a0]{font-size:var(--text-sm);font-weight:var(--font-semibold);color:var(--text-color);font-family:var(--font-mono)}.yoy-trend[data-v-2547e9a0]{display:flex;align-items:center;justify-content:center;gap:var(--space-xs);font-size:var(--text-xs);font-weight:var(--font-medium);margin-top:var(--space-xs);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm);background:var(--surface-hover)}.yoy-trend i[data-v-2547e9a0]{font-size:var(--text-sm)}.yoy-trend .trend-value[data-v-2547e9a0]{font-family:var(--font-mono);font-weight:var(--font-semibold)}.yoy-trend .trend-label[data-v-2547e9a0]{color:var(--text-color-secondary);font-size:var(--text-2xs)}.yoy-trend.trend-up[data-v-2547e9a0]{color:var(--green-600);background:var(--green-50)}.yoy-trend.trend-down[data-v-2547e9a0]{color:var(--red-600);background:var(--red-50)}.yoy-trend.trend-neutral[data-v-2547e9a0]{color:var(--text-color-secondary)}[data-theme=dark] .yoy-trend.trend-up[data-v-2547e9a0]{color:var(--green-400);background:#22c55e26}[data-theme=dark] .yoy-trend.trend-down[data-v-2547e9a0]{color:var(--red-400);background:#ef444426}@media (prefers-color-scheme: dark){:root:not([data-theme]) .yoy-trend.trend-up[data-v-2547e9a0]{color:var(--green-400);background:#22c55e26}:root:not([data-theme]) .yoy-trend.trend-down[data-v-2547e9a0]{color:var(--red-400);background:#ef444426}}.indicator-threshold[data-v-2547e9a0]{font-size:var(--text-xs);color:var(--text-color-secondary);text-align:center;margin-top:var(--space-xs)}@media (max-width: 768px){.indicator-item[data-v-2547e9a0]{padding:var(--space-sm)}.indicator-value[data-v-2547e9a0]{font-size:var(--text-xl)}.indicator-status-icon[data-v-2547e9a0]{font-size:var(--text-base)}.sparkline-container[data-v-2547e9a0]{height:32px}}[data-theme=dark] .sparkline-tooltip[data-v-2547e9a0]{background:var(--surface-card)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .sparkline-tooltip[data-v-2547e9a0]{background:var(--surface-card)}}.financial-indicators-card[data-v-79941a10]{background:transparent;border:none;border-radius:var(--radius-md);padding:var(--space-md);display:flex;flex-direction:column;gap:var(--space-md)}.card-header[data-v-79941a10]{display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:var(--space-sm)}.card-title[data-v-79941a10]{font-size:var(--text-lg);font-weight:var(--font-semibold);color:var(--text-color);margin:0;display:flex;align-items:center;gap:var(--space-sm)}.card-title i[data-v-79941a10]{color:var(--color-primary)}.period-selector-wrapper[data-v-79941a10]{min-width:160px}.period-dropdown[data-v-79941a10]{width:100%}.loading-state[data-v-79941a10]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-xl);text-align:center;color:var(--text-color-secondary)}.loading-spinner[data-v-79941a10]{width:40px;height:40px;border:3px solid var(--surface-border);border-top-color:var(--color-primary);border-radius:50%;animation:spin-79941a10 1s linear infinite;margin-bottom:var(--space-md)}@keyframes spin-79941a10{to{transform:rotate(360deg)}}.error-state[data-v-79941a10]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-xl);text-align:center;color:var(--color-error)}.error-icon[data-v-79941a10]{font-size:var(--text-3xl);margin-bottom:var(--space-md)}.card-content[data-v-79941a10]{flex:1}.collapsed-view[data-v-79941a10]{animation:fadeIn-79941a10 var(--transition-normal)}.key-indicators-grid[data-v-79941a10]{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--space-md);padding:var(--space-sm) 0}.expanded-view[data-v-79941a10]{max-height:0;overflow:hidden;transition:max-height var(--transition-slow),opacity var(--transition-normal);opacity:0}.expanded-view.is-expanded[data-v-79941a10]{max-height:none;overflow:visible;opacity:1;animation:fadeIn-79941a10 var(--transition-normal)}@keyframes fadeIn-79941a10{0%{opacity:0}to{opacity:1}}.indicators-grouped[data-v-79941a10]{display:flex;flex-direction:column;gap:var(--space-lg);padding:var(--space-md) 0}.indicator-section[data-v-79941a10]{background:transparent;border-radius:var(--radius-md);padding:var(--space-md);border:1px solid var(--surface-border)}.section-title[data-v-79941a10]{font-size:var(--text-sm);font-weight:var(--font-semibold);color:var(--text-color);margin:0 0 var(--space-sm) 0;padding-bottom:var(--space-xs);border-bottom:1px solid var(--surface-border);display:flex;justify-content:space-between;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none;transition:color var(--transition-fast)}.section-title[data-v-79941a10]:hover{color:var(--primary-color)}.section-title i[data-v-79941a10]{font-size:var(--text-xs);color:var(--text-color-secondary);transition:transform var(--transition-fast),color var(--transition-fast)}.section-title:hover i[data-v-79941a10]{color:var(--primary-color)}.sub-indicators-group[data-v-79941a10]{animation:slideDown-79941a10 .2s ease-out}@keyframes slideDown-79941a10{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}.section-items[data-v-79941a10]{display:flex;flex-direction:column;gap:var(--space-xs)}.indicator-row[data-v-79941a10]{display:flex;justify-content:space-between;align-items:flex-start;padding:var(--space-xs) 0}.indicator-row.sub-indicator[data-v-79941a10]{padding-left:var(--space-lg);border-left:2px solid var(--surface-border);margin-left:var(--space-sm)}.sub-indicator .indicator-name[data-v-79941a10],.sub-indicator .indicator-value[data-v-79941a10]{font-size:var(--text-xs);color:var(--text-color-secondary)}.indicator-info[data-v-79941a10]{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.indicator-name[data-v-79941a10]{font-weight:var(--font-medium);color:var(--text-color);font-size:var(--text-sm)}.indicator-desc[data-v-79941a10]{font-size:var(--text-xs);color:var(--text-color-secondary);line-height:1.3}.indicator-value[data-v-79941a10]{font-weight:var(--font-semibold);font-family:var(--font-mono);font-size:var(--text-sm);white-space:nowrap;margin-left:var(--space-md)}.indicator-category[data-v-79941a10]{font-size:var(--text-xs);color:var(--text-color-secondary)}.description-cell[data-v-79941a10]{font-size:var(--text-xs);color:var(--text-color-secondary);line-height:1.4}.value-cell[data-v-79941a10]{font-weight:var(--font-semibold);font-family:var(--font-mono)}.status-badge[data-v-79941a10]{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-full);font-size:var(--text-xs);font-weight:var(--font-medium)}.badge-good[data-v-79941a10]{background:var(--green-50);color:var(--green-600)}.badge-warning[data-v-79941a10]{background:var(--yellow-50);color:var(--yellow-600)}.badge-danger[data-v-79941a10]{background:var(--red-50);color:var(--red-600)}.badge-neutral[data-v-79941a10]{background:var(--surface-ground);color:var(--text-color-secondary)}[data-theme=dark] .badge-good[data-v-79941a10]{background:var(--green-900);color:var(--green-400)}[data-theme=dark] .badge-warning[data-v-79941a10]{background:var(--yellow-900);color:var(--yellow-400)}[data-theme=dark] .badge-danger[data-v-79941a10]{background:var(--red-900);color:var(--red-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .badge-good[data-v-79941a10]{background:var(--green-900);color:var(--green-400)}:root:not([data-theme]) .badge-warning[data-v-79941a10]{background:var(--yellow-900);color:var(--yellow-400)}:root:not([data-theme]) .badge-danger[data-v-79941a10]{background:var(--red-900);color:var(--red-400)}}.trend-cell[data-v-79941a10]{display:flex;align-items:center}.trend-indicator[data-v-79941a10]{display:inline-flex;align-items:center;gap:var(--space-xs);font-size:var(--text-sm);font-weight:var(--font-medium)}.trend-up[data-v-79941a10]{color:var(--green-600)}.trend-down[data-v-79941a10]{color:var(--red-600)}.trend-neutral[data-v-79941a10],.trend-na[data-v-79941a10]{color:var(--text-color-secondary)}[data-theme=dark] .trend-up[data-v-79941a10]{color:var(--green-400)}[data-theme=dark] .trend-down[data-v-79941a10]{color:var(--red-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .trend-up[data-v-79941a10]{color:var(--green-400)}:root:not([data-theme]) .trend-down[data-v-79941a10]{color:var(--red-400)}}.status-good[data-v-79941a10]{color:var(--green-600)}.status-warning[data-v-79941a10]{color:var(--yellow-600)}.status-danger[data-v-79941a10]{color:var(--red-600)}.status-neutral[data-v-79941a10]{color:var(--text-color-secondary)}[data-theme=dark] .status-good[data-v-79941a10]{color:var(--green-400)}[data-theme=dark] .status-warning[data-v-79941a10]{color:var(--yellow-400)}[data-theme=dark] .status-danger[data-v-79941a10]{color:var(--red-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .status-good[data-v-79941a10]{color:var(--green-400)}:root:not([data-theme]) .status-warning[data-v-79941a10]{color:var(--yellow-400)}:root:not([data-theme]) .status-danger[data-v-79941a10]{color:var(--red-400)}}.card-footer[data-v-79941a10]{display:flex;justify-content:center;padding-top:var(--space-sm)}.expand-toggle-btn[data-v-79941a10]{display:inline-flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);background:transparent;border:none;border-radius:var(--radius-md);color:var(--color-primary);font-size:var(--text-sm);font-weight:var(--font-medium);cursor:pointer;transition:background-color var(--transition-fast),color var(--transition-fast)}.expand-toggle-btn[data-v-79941a10]:hover{background:var(--surface-hover)}.expand-toggle-btn[data-v-79941a10]:focus{outline:2px solid var(--color-primary);outline-offset:2px}.expand-toggle-btn i[data-v-79941a10]{font-size:var(--text-lg);transition:transform var(--transition-fast)}@media (max-width: 768px){.card-header[data-v-79941a10]{flex-direction:column;align-items:stretch}.period-selector-wrapper[data-v-79941a10]{width:100%}.key-indicators-grid[data-v-79941a10]{grid-template-columns:1fr}.expand-toggle-btn[data-v-79941a10]{width:100%;justify-content:center}.indicators-datatable[data-v-79941a10]{font-size:var(--text-sm)}}.financial-indicators-card.mobile-layout[data-v-79941a10]{padding:0;height:100%;min-height:0;display:flex;flex-direction:column}.mobile-layout .card-header[data-v-79941a10]{flex-direction:column;align-items:stretch;gap:var(--space-xs);padding:var(--space-sm)}.mobile-layout .card-title[data-v-79941a10]{font-size:var(--text-base);justify-content:center}.mobile-layout .card-title i[data-v-79941a10]{font-size:var(--text-base)}.mobile-layout .period-selector-wrapper[data-v-79941a10]{width:100%}.mobile-layout .period-dropdown[data-v-79941a10]{font-size:var(--text-sm)}.mobile-layout .card-content[data-v-79941a10]{flex:1;overflow-y:auto;padding:0 var(--space-sm)}.mobile-layout .key-indicators-grid[data-v-79941a10]{grid-template-columns:1fr;gap:var(--space-sm);padding:0}.mobile-layout .loading-state[data-v-79941a10]{padding:var(--space-lg)}.mobile-layout .loading-spinner[data-v-79941a10]{width:32px;height:32px}.mobile-layout .error-state[data-v-79941a10]{padding:var(--space-lg)}.mobile-layout .error-icon[data-v-79941a10]{font-size:var(--text-2xl)}.mobile-footer[data-v-79941a10]{padding:var(--space-sm);background:transparent}.all-indicators-sheet[data-v-79941a10]{padding:var(--space-md);max-height:70vh;overflow-y:auto}.sheet-title[data-v-79941a10]{font-size:var(--text-lg);font-weight:var(--font-semibold);color:var(--text-color);margin:0 0 var(--space-md) 0;text-align:center}.indicator-category[data-v-79941a10]{border:1px solid var(--surface-border);border-radius:var(--radius-md);padding:var(--space-md);margin-bottom:var(--space-md)}.category-title[data-v-79941a10]{font-size:var(--text-sm);font-weight:var(--font-semibold);color:var(--text-color);margin:0 0 var(--space-sm) 0;padding-bottom:var(--space-xs);border-bottom:1px solid var(--surface-border);cursor:pointer;display:flex;justify-content:space-between;align-items:center;-webkit-user-select:none;user-select:none}.category-title[data-v-79941a10]:active{opacity:.7}.category-title i[data-v-79941a10]{font-size:var(--text-xs);color:var(--text-color-secondary);transition:transform .2s ease}.sub-indicators-group-mobile[data-v-79941a10]{animation:slideDown-79941a10 .2s ease-out}.category-items[data-v-79941a10]{display:flex;flex-direction:column;gap:var(--space-xs)}.sheet-indicator-item[data-v-79941a10]{display:flex;justify-content:space-between;align-items:flex-start;padding:var(--space-sm);background:var(--surface-card);border-radius:var(--radius-sm);gap:var(--space-sm)}.sheet-indicator-item.sub-item[data-v-79941a10]{margin-left:var(--space-md);padding:var(--space-xs) var(--space-sm);background:var(--surface-ground);border-left:2px solid var(--surface-border)}.sheet-indicator-item.sub-item .item-label[data-v-79941a10]{font-size:var(--text-xs);color:var(--text-color-secondary)}.sheet-indicator-item.sub-item .item-description[data-v-79941a10]{font-size:10px}.sheet-indicator-item.sub-item .item-value[data-v-79941a10]{font-size:var(--text-xs);color:var(--text-color-secondary)}.item-info[data-v-79941a10]{display:flex;flex-direction:column;gap:2px;flex:1;min-width:0}.item-label[data-v-79941a10]{font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--text-color)}.item-description[data-v-79941a10]{font-size:var(--text-xs);color:var(--text-color-secondary);line-height:1.3;opacity:.85}.item-value[data-v-79941a10]{font-size:var(--text-sm);font-weight:var(--font-semibold);font-family:var(--font-mono);white-space:nowrap;flex-shrink:0}[data-theme=dark] .sheet-indicator-item[data-v-79941a10]{background:var(--surface-hover)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .sheet-indicator-item[data-v-79941a10]{background:var(--surface-hover)}}.sheet-indicator-item.sub-indicator[data-v-79941a10]{padding-left:var(--space-lg);border-left:2px solid var(--surface-border);margin-left:var(--space-sm);background:transparent}.sheet-indicator-item.sub-indicator .item-label[data-v-79941a10]{font-size:var(--text-xs);color:var(--text-color-secondary)}.sheet-indicator-item.sub-indicator .item-value[data-v-79941a10]{font-size:var(--text-xs)}.collapsible-card[data-v-ed48d967]{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-md);overflow:hidden;transition:all var(--transition-fast)}.collapsible-card__header[data-v-ed48d967]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-md) var(--space-lg);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color var(--transition-fast)}.collapsible-card__header[data-v-ed48d967]:hover{background:var(--surface-hover)}.collapsible-card__header[data-v-ed48d967]:focus{outline:2px solid var(--color-primary);outline-offset:-2px}.collapsible-card__content[data-v-ed48d967]{display:flex;align-items:center;gap:var(--space-sm);flex:1;min-width:0}.collapsible-card__icon[data-v-ed48d967]{font-size:var(--text-lg);color:var(--color-primary);flex-shrink:0}.collapsible-card__label[data-v-ed48d967]{font-size:var(--text-xs);color:var(--text-color-secondary);font-weight:var(--font-semibold);white-space:nowrap;text-transform:uppercase;letter-spacing:.05em}.collapsible-card__value[data-v-ed48d967]{font-size:var(--text-lg);font-weight:var(--font-bold);color:var(--text-color);font-family:var(--font-mono);margin-left:auto;white-space:nowrap}.collapsible-card__value.positive[data-v-ed48d967]{color:var(--green-600)}.collapsible-card__value.negative[data-v-ed48d967]{color:var(--red-600)}.collapsible-card__value.neutral[data-v-ed48d967]{color:var(--text-color-secondary)}[data-theme=dark] .collapsible-card__value.positive[data-v-ed48d967]{color:var(--green-400)}[data-theme=dark] .collapsible-card__value.negative[data-v-ed48d967]{color:var(--red-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .collapsible-card__value.positive[data-v-ed48d967]{color:var(--green-400)}:root:not([data-theme]) .collapsible-card__value.negative[data-v-ed48d967]{color:var(--red-400)}}.collapsible-card__chevron[data-v-ed48d967]{font-size:var(--text-lg);color:var(--text-color-secondary);transition:transform var(--transition-fast);flex-shrink:0;margin-left:var(--space-md)}.collapsible-card__chevron--expanded[data-v-ed48d967]{transform:rotate(180deg)}.collapsible-card__body[data-v-ed48d967]{border-top:1px solid var(--surface-border)}.collapsible-card--expanded .collapsible-card__body[data-v-ed48d967] .metric-card,.collapsible-card--expanded .collapsible-card__body[data-v-ed48d967] .treasury-dual-card,.collapsible-card--expanded .collapsible-card__body[data-v-ed48d967] .cash-flow-metric-card,.collapsible-card--expanded .collapsible-card__body[data-v-ed48d967] .clienti-balance-card,.collapsible-card--expanded .collapsible-card__body[data-v-ed48d967] .furnizori-balance-card{border:none;border-radius:0;box-shadow:none}@media (max-width: 768px){.collapsible-card__header[data-v-ed48d967]{padding:var(--space-sm) var(--space-md)}.collapsible-card__value[data-v-ed48d967],.collapsible-card__icon[data-v-ed48d967],.collapsible-card__chevron[data-v-ed48d967]{font-size:var(--text-base)}}.swipeable-cards-container[data-v-3baeea9f]{position:relative;width:100%;touch-action:pan-y pinch-zoom;user-select:none;-webkit-user-select:none}.swipeable-cards-container--fill[data-v-3baeea9f]{min-height:calc(100vh - 112px);min-height:calc(100dvh - 112px)}.cards-track-overflow[data-v-3baeea9f]{overflow:hidden;width:100%;transition:height var(--transition-normal)}.cards-track[data-v-3baeea9f]{display:flex;width:100%;will-change:transform}.card-slide[data-v-3baeea9f]{flex:0 0 100%;width:100%;min-width:0;padding:0 var(--space-sm);box-sizing:border-box}.card-slide[data-v-3baeea9f]:first-child{padding-left:var(--space-md)}.card-slide[data-v-3baeea9f]:last-child{padding-right:var(--space-md)}.dots-indicator[data-v-3baeea9f]{display:flex;justify-content:center;align-items:center;gap:var(--space-sm);padding:var(--space-xs) 0}.dots-indicator--fixed[data-v-3baeea9f]{position:fixed;bottom:56px;left:0;right:0;z-index:99;pointer-events:auto}.dot[data-v-3baeea9f]{width:8px;height:8px;border-radius:var(--radius-full);background:var(--surface-border);border:none;padding:0;cursor:pointer;transition:all var(--transition-fast);position:relative}.dot[data-v-3baeea9f]:before{content:"";position:absolute;top:-8px;left:-8px;right:-8px;bottom:-8px}.dot.active[data-v-3baeea9f]{width:24px;background:var(--color-primary)}.dot[data-v-3baeea9f]:hover:not(.active){background:var(--text-color-secondary)}.dot[data-v-3baeea9f]:focus{outline:none;box-shadow:0 0 0 2px var(--color-primary)}[data-theme=dark] .dot[data-v-3baeea9f]{background:var(--surface-border)}[data-theme=dark] .dot.active[data-v-3baeea9f]{background:var(--color-primary)}[data-theme=dark] .dot[data-v-3baeea9f]:hover:not(.active){background:var(--text-color-secondary)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .dot[data-v-3baeea9f]{background:var(--surface-border)}:root:not([data-theme]) .dot.active[data-v-3baeea9f]{background:var(--color-primary)}:root:not([data-theme]) .dot[data-v-3baeea9f]:hover:not(.active){background:var(--text-color-secondary)}}.main-content.mobile-layout[data-v-4f86c393]{padding-top:56px;padding-bottom:56px}.refresh-btn[data-v-4f86c393]{color:var(--color-text-secondary);transition:color var(--transition-fast),transform var(--transition-fast)}.refresh-btn[data-v-4f86c393]:hover{color:var(--color-primary)}.refresh-btn.is-loading .pi-refresh[data-v-4f86c393]{animation:spin-4f86c393 1s linear infinite}@keyframes spin-4f86c393{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.company-selection[data-v-4f86c393]{max-width:500px;margin:0 auto var(--space-xl) auto}.company-input[data-v-4f86c393]{width:100%}.no-companies[data-v-4f86c393]{text-align:center;color:var(--color-text-secondary);font-style:italic}.dashboard-section[data-v-4f86c393]{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--card-radius);overflow:hidden}.section-header[data-v-4f86c393]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-lg) var(--space-xl);background:var(--color-bg-secondary);border-bottom:1px solid var(--color-border);flex-wrap:wrap;gap:var(--space-md)}.section-title[data-v-4f86c393]{font-size:var(--text-xl);font-weight:var(--font-semibold);color:var(--color-text);margin:0}.section-controls[data-v-4f86c393]{display:flex;align-items:center;gap:var(--space-md);flex-wrap:wrap}.control-group[data-v-4f86c393]{display:flex;align-items:center;gap:var(--space-sm)}.control-group label[data-v-4f86c393]{font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--color-text-secondary);white-space:nowrap}.detail-select[data-v-4f86c393],.detail-input[data-v-4f86c393],.trend-select[data-v-4f86c393]{padding:var(--space-xs) var(--space-sm);border:1px solid var(--color-border);border-radius:var(--radius-sm);font-size:var(--text-sm);min-width:120px}.detail-select[data-v-4f86c393]:focus,.detail-input[data-v-4f86c393]:focus,.trend-select[data-v-4f86c393]:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 2px rgba(var(--color-primary-rgb),.2)}.trends-container[data-v-4f86c393]{padding:var(--space-xl)}.trend-loading[data-v-4f86c393]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-xl);color:var(--color-text-secondary);text-align:center}.trend-error[data-v-4f86c393]{text-align:center;padding:var(--space-xl);background:var(--color-bg-secondary);border-radius:var(--radius-lg);color:var(--color-text-secondary)}.error-icon[data-v-4f86c393]{font-size:48px;color:var(--color-warning);margin-bottom:var(--space-lg)}.trend-error h3[data-v-4f86c393]{font-size:var(--text-xl);font-weight:var(--font-semibold);color:var(--color-text);margin:0 0 var(--space-md) 0}.trend-error p[data-v-4f86c393]{font-size:var(--text-base);margin:0 0 var(--space-lg) 0;line-height:1.6}.trend-chart-wrapper[data-v-4f86c393]{display:flex;flex-direction:column;gap:var(--space-lg)}.trend-chart-component[data-v-4f86c393]{height:300px;background:var(--color-bg);border-radius:var(--radius-lg);padding:var(--space-md)}.trend-summary[data-v-4f86c393]{background:var(--color-bg-secondary);border-radius:var(--radius-lg);padding:var(--space-lg)}.trend-stats[data-v-4f86c393]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:var(--space-lg)}.stat-item[data-v-4f86c393]{display:flex;flex-direction:column;gap:var(--space-xs);padding:var(--space-md);background:var(--color-bg);border-radius:var(--radius-md);text-align:center}.stat-label[data-v-4f86c393]{font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.5px}.stat-value[data-v-4f86c393]{font-size:var(--text-lg);font-weight:var(--font-semibold);font-family:var(--font-mono, monospace)}.stat-item.positive .stat-value[data-v-4f86c393]{color:var(--color-success)}.stat-item.negative .stat-value[data-v-4f86c393]{color:var(--color-error)}.stat-item.neutral .stat-value[data-v-4f86c393]{color:var(--color-text)}.stat-change[data-v-4f86c393]{font-size:var(--text-sm);font-weight:var(--font-medium);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-full)}.stat-change.positive[data-v-4f86c393]{background:var(--color-success-bg);color:var(--color-success)}.stat-change.negative[data-v-4f86c393]{background:var(--color-error-bg);color:var(--color-error)}.stat-change.neutral[data-v-4f86c393]{background:var(--color-bg-muted);color:var(--color-text-secondary)}.loading-bar-container[data-v-4f86c393]{height:3px;background:var(--surface-border);border-radius:var(--radius-full);overflow:hidden;margin-bottom:var(--space-md)}.loading-bar[data-v-4f86c393]{height:100%;background:var(--color-primary);animation:loading-progress-4f86c393 1.5s ease-in-out infinite;border-radius:var(--radius-full)}@keyframes loading-progress-4f86c393{0%{width:0%;transform:translate(0)}50%{width:60%;transform:translate(60%)}to{width:30%;transform:translate(300%)}}@media (max-width: 768px){.trends-container[data-v-4f86c393]{padding:var(--space-lg)}.trend-chart-component[data-v-4f86c393]{height:250px}.trend-stats[data-v-4f86c393]{grid-template-columns:1fr;gap:var(--space-md)}.stat-item[data-v-4f86c393]{padding:var(--space-sm)}.error-icon[data-v-4f86c393]{font-size:36px}.trend-error h3[data-v-4f86c393]{font-size:var(--text-lg)}}@media print{@page{margin:.5in;size:A4}[data-v-4f86c393]{-webkit-print-color-adjust:exact;print-color-adjust:exact}.trends-container[data-v-4f86c393],.loading-state[data-v-4f86c393],.no-print[data-v-4f86c393]{display:none!important}}.metrics-cards-section[data-v-4f86c393]{margin-bottom:2rem;padding:0 var(--space-md)}.metrics-row[data-v-4f86c393]{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--space-md);margin-bottom:var(--space-lg)}.analysis-row[data-v-4f86c393]{display:grid;grid-template-columns:1fr 1fr;gap:var(--space-md);margin-bottom:var(--space-lg)}.financial-indicators-section[data-v-4f86c393]{margin-top:var(--space-lg);width:100%}.mobile-budget-card[data-v-4f86c393]{background:var(--surface-card);border-radius:var(--radius-md);border:1px solid var(--surface-border);overflow:hidden}.mobile-budget-card-header[data-v-4f86c393]{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);border-bottom:1px solid var(--surface-border)}.mobile-budget-card-title[data-v-4f86c393]{font-size:var(--text-sm);font-weight:var(--font-semibold);color:var(--text-color-secondary);text-transform:uppercase;letter-spacing:.04em}.mobile-budget-card-value[data-v-4f86c393]{font-size:var(--text-sm);font-weight:var(--font-semibold);color:var(--text-color)}.mobile-budget-card-value.positive[data-v-4f86c393]{color:var(--green-600)}.mobile-budget-card-value.negative[data-v-4f86c393]{color:var(--red-600)}.budget-debt-breakdown-desktop[data-v-4f86c393]{display:flex;flex-direction:column;padding:var(--space-md)}.budget-debt-breakdown-header[data-v-4f86c393]{display:grid;grid-template-columns:1fr auto auto auto;gap:var(--space-md);padding:var(--space-xs) 0 var(--space-sm) 0;border-bottom:1px solid var(--surface-border);margin-bottom:var(--space-xs)}.budget-debt-breakdown-row[data-v-4f86c393]{display:grid;grid-template-columns:1fr auto auto auto;gap:var(--space-md);padding:var(--space-xs) 0;align-items:center}.budget-debt-col-label[data-v-4f86c393]{font-size:var(--text-sm);color:var(--color-text-secondary);font-weight:var(--font-medium)}.budget-debt-breakdown-header .budget-debt-col-label[data-v-4f86c393]{font-size:var(--text-xs);font-weight:var(--font-semibold);text-transform:uppercase;letter-spacing:.05em}.budget-debt-col-value[data-v-4f86c393]{font-size:var(--text-sm);font-weight:var(--font-semibold);font-family:var(--font-mono, monospace);color:var(--color-text);white-space:nowrap;min-width:100px;text-align:right}.budget-debt-col-header-value[data-v-4f86c393]{font-size:var(--text-xs);font-weight:var(--font-semibold);text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-secondary);white-space:nowrap;min-width:100px;text-align:right}.budget-debt-paid[data-v-4f86c393]{color:var(--green-600)}[data-theme=dark] .budget-debt-paid[data-v-4f86c393]{color:var(--green-400)}.budget-debt-cleared[data-v-4f86c393]{color:var(--green-600);font-weight:var(--font-bold)}[data-theme=dark] .budget-debt-cleared[data-v-4f86c393]{color:var(--green-400)}.budget-debt-breakdown-empty[data-v-4f86c393]{padding:var(--space-sm) 0;color:var(--color-text-secondary);font-style:italic;font-size:var(--text-sm)}.budget-debt-group-row[data-v-4f86c393]{cursor:pointer;font-weight:var(--font-semibold);background:var(--surface-ground);border-radius:var(--radius-sm)}.budget-debt-group-row[data-v-4f86c393]:hover{background:var(--surface-hover)}.budget-debt-group-label[data-v-4f86c393]{display:flex;align-items:center;gap:var(--space-xs)}.budget-debt-toggle[data-v-4f86c393]{font-size:var(--text-xs);color:var(--text-color-secondary);transition:transform var(--transition-fast)}.budget-debt-toggle.expanded[data-v-4f86c393]{transform:rotate(90deg)}.budget-debt-sub-accounts[data-v-4f86c393]{background:var(--surface-card);border-left:2px solid var(--surface-border);margin-left:var(--space-sm)}.budget-debt-subrow[data-v-4f86c393]{opacity:.85}.budget-debt-sub-label[data-v-4f86c393]{padding-left:var(--space-md);font-size:var(--text-xs)}.budget-debt-sub-value[data-v-4f86c393]{font-size:var(--text-xs)}@media (max-width: 768px){.budget-debt-breakdown-header[data-v-4f86c393],.budget-debt-breakdown-row[data-v-4f86c393]{grid-template-columns:1fr auto auto;gap:var(--space-sm)}.budget-debt-col-achitat[data-v-4f86c393]{display:none}.budget-debt-col-value[data-v-4f86c393]{min-width:72px}.budget-debt-breakdown-desktop[data-v-4f86c393]{padding:var(--space-sm)}}.budget-debt-section-divider[data-v-4f86c393]{height:1px;background:var(--surface-border);margin:var(--space-sm) 0}.budget-debt-curent-summary[data-v-4f86c393]{display:flex;flex-wrap:wrap;align-items:center;gap:var(--space-sm);padding:var(--space-xs) 0}.budget-debt-curent-title[data-v-4f86c393]{font-size:var(--text-xs);font-weight:var(--font-semibold);color:var(--text-color-secondary);text-transform:uppercase;letter-spacing:.04em}.budget-debt-curent-chip[data-v-4f86c393]{font-size:var(--text-sm);font-weight:var(--font-semibold);font-family:var(--font-mono, monospace);color:var(--text-color-secondary)}.budget-debt-curent-total[data-v-4f86c393]{font-size:var(--text-sm);font-weight:var(--font-bold);font-family:var(--font-mono, monospace);color:var(--text-color);margin-left:var(--space-xs)}@media (max-width: 1200px){.metrics-row[data-v-4f86c393]{grid-template-columns:1fr}}@media (max-width: 1024px){.analysis-row[data-v-4f86c393]{grid-template-columns:1fr}}@media (max-width: 768px){.metrics-cards-section[data-v-4f86c393]{padding:0 .25rem}}@media (max-width: 480px){.metrics-cards-section[data-v-4f86c393]{padding:0;margin-bottom:1rem}}.mobile-kpi-carousel[data-v-4f86c393]{margin-bottom:var(--space-lg)}.mobile-kpi-carousel[data-v-4f86c393] .text-success,.mobile-kpi-carousel[data-v-4f86c393] .text-error,.mobile-kpi-carousel[data-v-4f86c393] .text-primary,.mobile-kpi-carousel[data-v-4f86c393] .text-danger,.mobile-kpi-carousel[data-v-4f86c393] .header-total.positive,.mobile-kpi-carousel[data-v-4f86c393] .header-total.negative,.mobile-kpi-carousel[data-v-4f86c393] .positive,.mobile-kpi-carousel[data-v-4f86c393] .negative,.mobile-kpi-carousel[data-v-4f86c393] .solduri-compact-card__value--success,.mobile-kpi-carousel[data-v-4f86c393] .solduri-compact-card__value--danger{color:var(--text-color)!important}.mobile-kpi-carousel[data-v-4f86c393] .trend-up,.mobile-kpi-carousel[data-v-4f86c393] .trend-down{color:var(--text-color-secondary)!important}.mobile-kpi-carousel[data-v-4f86c393] .metric-card,.mobile-kpi-carousel[data-v-4f86c393] .financial-indicators-card,.mobile-kpi-carousel .mobile-budget-card[data-v-4f86c393]{border:none;background:transparent;box-shadow:none}@media (max-width: 768px){.mobile-kpi-carousel[data-v-4f86c393] .metric-value,.mobile-kpi-carousel[data-v-4f86c393] .treasury-value,.mobile-kpi-carousel[data-v-4f86c393] .header-total,.mobile-kpi-carousel[data-v-4f86c393] .solduri-compact-card__value{font-size:1.5rem!important;line-height:1.2}.mobile-kpi-carousel[data-v-4f86c393] .metric-label,.mobile-kpi-carousel[data-v-4f86c393] .treasury-label,.mobile-kpi-carousel[data-v-4f86c393] .header-label{font-size:var(--text-xs)!important}}.solduri-grid-2x2[data-v-4f86c393]{display:flex;flex-direction:column;gap:var(--space-sm);padding:var(--space-xs)} diff --git a/deploy-package-20260223-151231/frontend/assets/DataEntryLayout.CrX1hG64.js b/deploy-package-20260223-151231/frontend/assets/DataEntryLayout.CrX1hG64.js deleted file mode 100644 index 96f8d23..0000000 --- a/deploy-package-20260223-151231/frontend/assets/DataEntryLayout.CrX1hG64.js +++ /dev/null @@ -1,2 +0,0 @@ -import{E as r}from"./ErrorBoundary.BMn00aHR.js";import{h as t,p as e,k as a,d as n,q as m}from"./vendor-core.B6UiYhU_.js";import"./index.B8XI8FQW.js";import"./vendor-primevue.BN-meDW0.js";import"./vendor-utils.CO3CyGpV.js";import"./vendor-export.BWjBvx7Z.js";const h={__name:"DataEntryLayout",setup(p){return(s,c)=>{const o=a("router-view");return n(),t(r,{"module-name":"Introduceri Date"},{default:e(()=>[m(o)]),_:1})}}};export{h as default}; -//# sourceMappingURL=DataEntryLayout.CrX1hG64.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/DataEntryLayout.CrX1hG64.js.map b/deploy-package-20260223-151231/frontend/assets/DataEntryLayout.CrX1hG64.js.map deleted file mode 100644 index dcb5e85..0000000 --- a/deploy-package-20260223-151231/frontend/assets/DataEntryLayout.CrX1hG64.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DataEntryLayout.CrX1hG64.js","sources":["../../src/modules/data-entry/DataEntryLayout.vue"],"sourcesContent":["\n\n\n"],"names":["_createBlock","ErrorBoundary","_createVNode","_component_router_view"],"mappings":"gWACEA,EAEgBC,EAAA,CAFD,cAAY,oBAAkB,WAC3C,IAAe,CAAfC,EAAeC,CAAA"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/DetailedInvoicesView.DXIThWg_.js b/deploy-package-20260223-151231/frontend/assets/DetailedInvoicesView.DXIThWg_.js deleted file mode 100644 index 897d024..0000000 --- a/deploy-package-20260223-151231/frontend/assets/DetailedInvoicesView.DXIThWg_.js +++ /dev/null @@ -1,2 +0,0 @@ -import{a as p,M as ze,j as C,w as ue,o as Re,K as $e,c as o,h as Q,i as u,q as c,e as t,O as r,u as m,v as n,p as O,F,B as E,P as Te,d as i,s as Ee}from"./vendor-core.B6UiYhU_.js";import{s as V,E as ce,I as ve,G as Ne,N as Me,H as N}from"./vendor-primevue.BN-meDW0.js";import{_ as Le,u as Pe,s as Be}from"./index.B8XI8FQW.js";import{M as Ie}from"./MobileTopBar.BnL78WPy.js";import{M as Oe}from"./MobileBottomNav.Cp8OR33w.js";import{M as Ae}from"./MobileDrawerMenu.DJ_STPbv.js";import{B as Ue}from"./BottomSheet.WKuCIyuZ.js";import{s as Ge}from"./splitbutton.esm.DvALhxoC.js";import{a as je,u as qe,b as Xe,c as We}from"./sharedStores.Bb_IRn4Y.js";import{E as He,u as Y,w as Ke}from"./vendor-export.BWjBvx7Z.js";import"./vendor-utils.CO3CyGpV.js";const Je={key:1,class:"mobile-tabs-container"},Qe={class:"mobile-tabs"},Ye={class:"app-container"},Ze={key:0,class:"page-header"},et={class:"desktop-tabs"},tt={key:1,class:"empty-state"},st={key:2,class:"invoices-container"},lt={key:0,class:"filters-card"},at={class:"filters-row"},it={class:"filter-group"},nt={class:"filter-group"},ot={class:"filters-actions"},rt={key:1,class:"mobile-filter-summary"},dt={key:0,class:"filter-chip active"},ut={key:1,class:"filter-chip active"},ct={key:2,class:"loading-state"},vt={key:3,class:"error-state"},pt={key:4,class:"data-section"},mt={key:0,class:"table-wrapper"},ft={class:"font-mono"},ht={key:1,class:"expandable-groups-table"},bt={class:"groups-table-header"},_t={class:"header-cell name-col"},yt={class:"header-cell text-right"},kt={class:"groups-table-body"},gt=["onClick"],wt={class:"row-cell expand-col"},Ct={class:"row-cell name-col"},xt={key:0,class:"count-badge"},St={class:"row-cell"},Dt={class:"row-cell"},Ft={class:"row-cell"},Vt={class:"row-cell text-right"},zt={class:"font-mono"},Rt={class:"row-cell text-right"},$t={class:"font-mono"},Tt={class:"row-cell text-right"},Et={key:0,class:"expanded-invoices"},Nt={class:"row-cell"},Mt={class:"row-cell"},Lt={class:"row-cell"},Pt={class:"row-cell text-right"},Bt={class:"font-mono"},It={class:"row-cell text-right"},Ot={class:"font-mono"},At={class:"row-cell text-right"},Ut={key:0,class:"empty-table-state"},Gt={key:1,class:"mobile-cards"},jt={class:"card-header-row"},qt={class:"card-badge"},Xt={class:"card-body"},Wt={class:"card-field"},Ht={class:"field-value"},Kt={class:"card-field highlight"},Jt={class:"field-value sold-value"},Qt=["onClick"],Yt={class:"card-header-row"},Zt={class:"header-left"},es={key:0,class:"count-badge"},ts={class:"header-right"},ss={key:0,class:"card-body"},ls={class:"card-field"},as={class:"field-value"},is={class:"card-row-inline"},ns={class:"card-field"},os={class:"field-value"},rs={class:"card-field"},ds={class:"field-value"},us={key:1,class:"card-sub-items"},cs={class:"sub-item-header"},vs={class:"sub-item-dates"},ps={key:2,class:"empty-data"},ms={class:"pagination-wrapper"},fs={key:2,class:"totals-summary"},hs={class:"total-item"},bs={class:"total-value"},_s={key:0,class:"total-item"},ys={class:"total-value"},ks={class:"filter-sheet-content"},gs={class:"filter-sheet-group"},ws={class:"filter-sheet-group"},Cs={class:"filter-sheet-actions"},xs={__name:"DetailedInvoicesView",setup(Ss){const A=Te(),U=ze(),G=Pe(),Z=je(),_=qe(),z=Xe(),R=We(),j=p(!1),x=p(U.query.tab==="suppliers"?"suppliers":U.meta.invoiceType||"clients"),d=C(()=>x.value),M=async l=>{l!==x.value&&(x.value=l,A.replace({query:{...U.query,tab:l==="suppliers"?"suppliers":void 0}}),S.value=0,k.value.clear(),await h())},ee=p(window.innerWidth),b=C(()=>ee.value<768),te=()=>{ee.value=window.innerWidth},$=p(!1),L=p(null),f=p(""),y=p("all"),q=p([]),S=p(0),P=p(25),k=p(new Set),B=p(!1),X=[{label:"Toate",value:"all"},{label:"7 zile",value:"7d"},{label:"1 lună",value:"1m"},{label:"3 luni",value:"3m"},{label:"6 luni",value:"6m"},{label:"12 luni",value:"12m"}],se=C(()=>f.value!==""||y.value!=="all"),pe=C(()=>[{icon:"pi pi-filter",label:"Filtre",tooltip:"Deschide filtre",active:se.value},{icon:"pi pi-filter-slash",label:"Resetează",tooltip:"Resetează Filtrele"},{icon:"pi pi-download",label:"Export",tooltip:"Export"}]),le=p(null),me=p([{label:"Export PDF",icon:"pi pi-file-pdf",command:()=>K()},{label:"Export XLSX",icon:"pi pi-file-excel",command:()=>de()}]),fe=p([{label:"Export PDF",icon:"pi pi-file-pdf",command:()=>K()},{label:"Export XLSX",icon:"pi pi-file-excel",command:()=>de()}]),v=l=>l==null?"0 RON":new Intl.NumberFormat("ro-RO",{style:"currency",currency:"RON",minimumFractionDigits:0,maximumFractionDigits:0}).format(Math.abs(l)),g=l=>{if(!l)return"-";const e=new Date(l);return isNaN(e.getTime())?l:e.toLocaleDateString("ro-RO",{day:"2-digit",month:"2-digit",year:"numeric"})},w=C(()=>f.value?q.value.filter(l=>Object.values(l).some(e=>String(e).toLowerCase().includes(f.value.toLowerCase()))):q.value),ae=C(()=>{if(d.value==="treasury")return[];const l={},e=d.value==="clients"?"client":"furnizor";return w.value.forEach(s=>{const a=s[e];a&&(l[a]||(l[a]={name:a,facturi:[],totalSold:0,hasRestant:!1}),l[a].facturi.push(s),l[a].totalSold+=s.sold||0,s.status==="Restant"&&(l[a].hasRestant=!0))}),Object.values(l)}),I=C(()=>d.value==="treasury"?[]:ae.value),W=C(()=>d.value!=="treasury"?[]:w.value),he=C(()=>Z.detailedDataTotal||ae.value.length),be=l=>{const e=X.find(s=>s.value===l);return(e==null?void 0:e.label)||l},ie=l=>l==="Restant"?"status-restant":"status-ok",ne=l=>{k.value.has(l)?k.value.delete(l):k.value.add(l)},T=l=>k.value.has(l),oe=l=>w.value.reduce((e,s)=>e+(s[l]||0),0),_e=()=>{A.push("/reports/dashboard")},ye=async()=>{await R.logout(),A.push("/login")},ke=async l=>{var e;await _.loadCompanies(),(e=_.selectedCompany)!=null&&e.id_firma&&await z.loadPeriods(_.selectedCompany.id_firma)},ge=l=>{l&&h()},we=()=>{},Ce=(l,e)=>{l.icon==="pi pi-filter"?xe():l.icon==="pi pi-filter-slash"?H():l.icon==="pi pi-download"&&le.value.toggle(e)},xe=()=>{B.value=!0},Se=()=>{f.value="",re()},De=()=>{y.value="all",h()},re=()=>{S.value=0,k.value.clear()},H=()=>{f.value="",y.value="all",S.value=0,k.value.clear(),h()},Fe=()=>{B.value=!1,S.value=0,k.value.clear(),h()},Ve=()=>{h()},h=async()=>{var l,e;if(_.selectedCompany){$.value=!0,L.value=null;try{const s=Math.floor(S.value/P.value)+1,a=((l=z.selectedPeriod)==null?void 0:l.luna)||null,D=((e=z.selectedPeriod)==null?void 0:e.an)||null,J=await Z.loadDetailedData(d.value,_.selectedCompany.id_firma,s,P.value,f.value,a,D);q.value=J.data,k.value.clear()}catch(s){console.error("Failed to load detailed data:",s),L.value=s.message||"Nu s-au putut încărca datele",G.add({severity:"error",summary:"Eroare",detail:"Nu s-au putut încărca facturile detaliate",life:3e3})}finally{$.value=!1}}},de=()=>{const l=Y.json_to_sheet(w.value),e=Y.book_new();Y.book_append_sheet(e,l,d.value),Ke(e,`facturi_${d.value}_${new Date().toISOString().split("T")[0]}.xlsx`),G.add({severity:"success",summary:"Export reușit",detail:`${w.value.length} înregistrări exportate`,life:3e3})},K=()=>{const l=new He,e=d.value==="treasury"?["Cont","Nume Cont","Sold","Valută","Tip"]:d.value==="clients"?["Client","Nr. Document","Data Doc.","Scadență","Facturat","Încasat","Sold"]:["Furnizor","Nr. Document","Data Doc.","Scadență","Facturat","Achitat","Sold"],s=w.value.map(a=>{if(d.value==="treasury")return[a.cont,a.nume_cont,v(a.sold),a.valuta,a.tip];const D=d.value==="clients"?"client":"furnizor",J=d.value==="clients"?"incasat":"achitat";return[a[D],a.numar_document,g(a.data_document),g(a.data_scadenta),v(a.facturat),v(a[J]),v(a.sold)]});l.autoTable({head:[e],body:s,theme:"grid",styles:{fontSize:8},headStyles:{fillColor:[59,130,246]}}),l.save(`facturi_${d.value}_${new Date().toISOString().split("T")[0]}.pdf`),G.add({severity:"success",summary:"Export reușit",detail:`PDF generat cu ${w.value.length} înregistrări`,life:3e3})};return ue(()=>_.selectedCompany,l=>{l&&h()}),ue(()=>z.selectedPeriod,(l,e)=>{l&&(l.luna!==(e==null?void 0:e.luna)||l.an!==(e==null?void 0:e.an))&&h()},{deep:!0}),Re(()=>{window.addEventListener("resize",te),_.selectedCompany&&h()}),$e(()=>{window.removeEventListener("resize",te)}),(l,e)=>(i(),o(F,null,[b.value?(i(),Q(Ie,{key:0,title:"Facturi Detaliate","show-menu":!0,actions:pe.value,onMenuClick:e[0]||(e[0]=s=>j.value=!0),onActionClick:Ce},null,8,["actions"])):u("",!0),c(Ae,{modelValue:j.value,"onUpdate:modelValue":e[1]||(e[1]=s=>j.value=s),user:r(R).user,"companies-store":r(_),"period-store":r(z),"available-servers":r(R).availableServers,"current-server-id":r(R).selectedServerId,"auth-store":r(R),onLogout:ye,onCompanyChanged:ge,onPeriodChanged:we,onServerSwitched:ke},null,8,["modelValue","user","companies-store","period-store","available-servers","current-server-id","auth-store"]),b.value?(i(),o("div",Je,[t("div",Qe,[t("button",{class:m(["mobile-tab",{active:x.value==="clients"}]),onClick:e[2]||(e[2]=s=>M("clients"))},[...e[13]||(e[13]=[t("span",{class:"tab-label"},"Clienți",-1)])],2),t("button",{class:m(["mobile-tab",{active:x.value==="suppliers"}]),onClick:e[3]||(e[3]=s=>M("suppliers"))},[...e[14]||(e[14]=[t("span",{class:"tab-label"},"Furnizori",-1)])],2)])])):u("",!0),c(r(Be),{ref_key:"exportMenu",ref:le,model:me.value,popup:!0},null,8,["model"]),t("main",{class:m(["main-content",{"mobile-layout":b.value,"has-tabs":b.value}])},[t("div",Ye,[b.value?u("",!0):(i(),o("div",Ze,[e[17]||(e[17]=t("h1",{class:"page-title"},"Facturi Detaliate",-1)),e[18]||(e[18]=t("p",{class:"page-subtitle"},"Vizualizare detaliată a facturilor clienți și furnizori",-1)),t("div",et,[t("button",{class:m(["desktop-tab",{active:x.value==="clients"}]),onClick:e[4]||(e[4]=s=>M("clients"))},[...e[15]||(e[15]=[t("i",{class:"pi pi-users"},null,-1),t("span",null,"Clienți",-1)])],2),t("button",{class:m(["desktop-tab",{active:x.value==="suppliers"}]),onClick:e[5]||(e[5]=s=>M("suppliers"))},[...e[16]||(e[16]=[t("i",{class:"pi pi-truck"},null,-1),t("span",null,"Furnizori",-1)])],2)])])),r(_).selectedCompany?(i(),o("div",st,[b.value?u("",!0):(i(),o("div",lt,[t("div",at,[t("div",it,[e[22]||(e[22]=t("label",{class:"form-label"},"Căutare",-1)),c(r(ce),{modelValue:f.value,"onUpdate:modelValue":e[6]||(e[6]=s=>f.value=s),placeholder:"Căutare...",class:"w-full",onInput:re},null,8,["modelValue"])]),t("div",nt,[e[23]||(e[23]=t("label",{class:"form-label"},"Perioadă",-1)),c(r(ve),{modelValue:y.value,"onUpdate:modelValue":e[7]||(e[7]=s=>y.value=s),options:X,optionLabel:"label",optionValue:"value",placeholder:"Selectați perioada",class:"w-full",onChange:h},null,8,["modelValue"])])]),t("div",ot,[c(r(V),{icon:"pi pi-filter-slash",label:"Resetează",severity:"secondary",outlined:"",onClick:H}),c(r(Ge),{label:"Export",icon:"pi pi-download",model:fe.value,onClick:K,outlined:"",disabled:w.value.length===0},null,8,["model","disabled"]),c(r(V),{icon:"pi pi-refresh",label:"Actualizează",loading:$.value,onClick:h},null,8,["loading"])])])),b.value&&se.value?(i(),o("div",rt,[f.value?(i(),o("div",dt,[e[24]||(e[24]=t("i",{class:"pi pi-search"},null,-1)),t("span",null,n(f.value),1),t("i",{class:"pi pi-times",onClick:Se})])):u("",!0),y.value!=="all"?(i(),o("div",ut,[e[25]||(e[25]=t("i",{class:"pi pi-calendar"},null,-1)),t("span",null,n(be(y.value)),1),t("i",{class:"pi pi-times",onClick:De})])):u("",!0)])):u("",!0),$.value?(i(),o("div",ct,[...e[26]||(e[26]=[t("div",{class:"loading-spinner"},null,-1),t("p",null,"Se încarcă facturile...",-1)])])):L.value?(i(),o("div",vt,[e[27]||(e[27]=t("i",{class:"pi pi-exclamation-circle"},null,-1)),t("p",null,n(L.value),1),c(r(V),{label:"Încearcă din nou",icon:"pi pi-refresh",onClick:h})])):(i(),o("div",pt,[b.value?u("",!0):(i(),o("div",mt,[d.value==="treasury"?(i(),Q(r(Ne),{key:0,value:W.value,loading:$.value,stripedRows:"",class:"p-datatable-sm"},{default:O(()=>[c(r(N),{field:"cont",header:"Cont",sortable:""}),c(r(N),{field:"nume_cont",header:"Nume Cont",sortable:""}),c(r(N),{field:"sold",header:"Sold",sortable:""},{body:O(s=>[t("span",ft,n(v(s.data.sold)),1)]),_:1}),c(r(N),{field:"valuta",header:"Valută",sortable:""}),c(r(N),{field:"tip",header:"Tip",sortable:""})]),_:1},8,["value","loading"])):(i(),o("div",ht,[t("div",bt,[e[28]||(e[28]=t("div",{class:"header-cell expand-col"},null,-1)),t("div",_t,n(d.value==="clients"?"Client":"Furnizor"),1),e[29]||(e[29]=t("div",{class:"header-cell"},"Nr. Document",-1)),e[30]||(e[30]=t("div",{class:"header-cell"},"Data Document",-1)),e[31]||(e[31]=t("div",{class:"header-cell"},"Data Scadență",-1)),e[32]||(e[32]=t("div",{class:"header-cell text-right"},"Facturat",-1)),t("div",yt,n(d.value==="clients"?"Încasat":"Achitat"),1),e[33]||(e[33]=t("div",{class:"header-cell text-right"},"Sold",-1))]),t("div",kt,[(i(!0),o(F,null,E(I.value,s=>(i(),o(F,{key:s.name},[t("div",{class:m(["group-row",{expandable:s.facturi.length>1,expanded:T(s.name)}]),onClick:a=>s.facturi.length>1&&ne(s.name)},[t("div",wt,[s.facturi.length>1?(i(),o("i",{key:0,class:m(["expand-icon pi pi-chevron-right",{rotated:T(s.name)}])},null,2)):u("",!0)]),t("div",Ct,[t("strong",null,n(s.name),1),s.facturi.length>1?(i(),o("span",xt," ("+n(s.facturi.length)+" facturi) ",1)):u("",!0)]),t("div",St,n(s.facturi.length===1?s.facturi[0].numar_document:"-"),1),t("div",Dt,n(s.facturi.length===1?g(s.facturi[0].data_document):"-"),1),t("div",Ft,n(s.facturi.length===1?g(s.facturi[0].data_scadenta):"-"),1),t("div",Vt,[t("span",zt,n(s.facturi.length===1?v(s.facturi[0].facturat):"-"),1)]),t("div",Rt,[t("span",$t,n(s.facturi.length===1?v(s.facturi[0][d.value==="clients"?"incasat":"achitat"]):"-"),1)]),t("div",Tt,[t("span",{class:m(["font-mono font-bold",{"sold-restant":s.hasRestant}])},n(v(s.totalSold)),3)])],10,gt),c(Ee,{name:"expand"},{default:O(()=>[s.facturi.length>1&&T(s.name)?(i(),o("div",Et,[(i(!0),o(F,null,E(s.facturi,(a,D)=>(i(),o("div",{key:`${s.name}-invoice-${D}`,class:"invoice-row"},[e[34]||(e[34]=t("div",{class:"row-cell expand-col"},null,-1)),e[35]||(e[35]=t("div",{class:"row-cell name-col sub-invoice-indicator"},[t("span",{class:"invoice-connector"}),t("span",{class:"invoice-doc-label"},"Factura")],-1)),t("div",Nt,n(a.numar_document),1),t("div",Mt,n(g(a.data_document)),1),t("div",Lt,n(g(a.data_scadenta)),1),t("div",Pt,[t("span",Bt,n(v(a.facturat)),1)]),t("div",It,[t("span",Ot,n(v(a[d.value==="clients"?"incasat":"achitat"])),1)]),t("div",At,[t("span",{class:m(["font-mono",{"sold-restant":a.status==="Restant"}])},n(v(a.sold)),3)])]))),128))])):u("",!0)]),_:2},1024)],64))),128)),I.value.length===0?(i(),o("div",Ut,[...e[36]||(e[36]=[t("i",{class:"pi pi-inbox"},null,-1),t("p",null,"Nu există facturi pentru criteriile selectate",-1)])])):u("",!0)])]))])),b.value?(i(),o("div",Gt,[d.value==="treasury"?(i(!0),o(F,{key:0},E(W.value,s=>(i(),o("div",{key:s.id,class:"invoice-card"},[t("div",jt,[t("strong",null,n(s.cont),1),t("span",qt,n(s.valuta),1)]),t("div",Xt,[t("div",Wt,[e[37]||(e[37]=t("span",{class:"field-label"},"Nume Cont",-1)),t("span",Ht,n(s.nume_cont),1)]),t("div",Kt,[e[38]||(e[38]=t("span",{class:"field-label"},"Sold",-1)),t("span",Jt,n(v(s.sold)),1)])])]))),128)):(i(!0),o(F,{key:1},E(I.value,s=>(i(),o("div",{key:s.name,class:m(["invoice-card",{"has-multiple":s.facturi.length>1}]),onClick:a=>s.facturi.length>1&&ne(s.name)},[t("div",Yt,[t("div",Zt,[t("strong",null,n(s.name),1),s.facturi.length>1?(i(),o("span",es," ("+n(s.facturi.length)+") ",1)):u("",!0)]),t("div",ts,[t("span",{class:m(["sold-value",{"sold-restant":s.hasRestant}])},n(v(s.totalSold)),3),s.facturi.length>1?(i(),o("i",{key:0,class:m(["pi",T(s.name)?"pi-chevron-up":"pi-chevron-down"])},null,2)):u("",!0)])]),s.facturi.length===1?(i(),o("div",ss,[t("div",ls,[e[39]||(e[39]=t("span",{class:"field-label"},"Nr. Document",-1)),t("span",as,n(s.facturi[0].numar_document),1)]),t("div",is,[t("div",ns,[e[40]||(e[40]=t("span",{class:"field-label"},"Data Doc.",-1)),t("span",os,n(g(s.facturi[0].data_document)),1)]),t("div",rs,[e[41]||(e[41]=t("span",{class:"field-label"},"Scadență",-1)),t("span",ds,n(g(s.facturi[0].data_scadenta)),1)])]),t("div",{class:m(["card-status",ie(s.facturi[0].status)])},n(s.facturi[0].status),3)])):u("",!0),s.facturi.length>1&&T(s.name)?(i(),o("div",us,[(i(!0),o(F,null,E(s.facturi,(a,D)=>(i(),o("div",{key:`${s.name}-${D}`,class:"sub-item"},[t("div",cs,[t("span",null,n(a.numar_document),1),t("span",{class:m(["sub-item-sold",{"sold-restant":a.status==="Restant"}])},n(v(a.sold)),3)]),t("div",vs,[t("span",null,n(g(a.data_scadenta)),1),t("span",{class:m(ie(a.status))},n(a.status),3)])]))),128))])):u("",!0)],10,Qt))),128)),(d.value==="treasury"?W.value:I.value).length===0?(i(),o("div",ps,[...e[42]||(e[42]=[t("i",{class:"pi pi-inbox"},null,-1),t("p",null,"Nu există facturi pentru criteriile selectate",-1)])])):u("",!0)])):u("",!0),t("div",ms,[c(r(Me),{rows:P.value,"onUpdate:rows":e[8]||(e[8]=s=>P.value=s),totalRecords:he.value,first:S.value,"onUpdate:first":e[9]||(e[9]=s=>S.value=s),rowsPerPageOptions:[10,25,50,100],onPage:Ve},null,8,["rows","totalRecords","first"])]),w.value.length>0?(i(),o("div",fs,[t("div",hs,[e[43]||(e[43]=t("span",{class:"total-label"},"Total Sold:",-1)),t("span",bs,n(v(oe("sold"))),1)]),d.value!=="treasury"?(i(),o("div",_s,[e[44]||(e[44]=t("span",{class:"total-label"},"Total Facturat:",-1)),t("span",ys,n(v(oe("facturat"))),1)])):u("",!0)])):u("",!0)]))])):(i(),o("div",tt,[e[19]||(e[19]=t("i",{class:"pi pi-building empty-icon"},null,-1)),e[20]||(e[20]=t("h2",{class:"empty-title"},"Selectați o companie",-1)),e[21]||(e[21]=t("p",{class:"empty-description"}," Pentru a vizualiza facturile detaliate, vă rugăm să selectați o companie din Dashboard. ",-1)),c(r(V),{label:"Mergi la Dashboard",icon:"pi pi-arrow-left",onClick:_e,class:"empty-action"})]))])],2),b.value?(i(),Q(Oe,{key:2})):u("",!0),c(Ue,{modelValue:B.value,"onUpdate:modelValue":e[12]||(e[12]=s=>B.value=s)},{default:O(()=>[t("div",ks,[e[47]||(e[47]=t("h3",{class:"filter-sheet-title"},"Filtre",-1)),t("div",gs,[e[45]||(e[45]=t("label",{class:"form-label"},"Căutare",-1)),c(r(ce),{modelValue:f.value,"onUpdate:modelValue":e[10]||(e[10]=s=>f.value=s),placeholder:"Căutare client/furnizor...",class:"w-full"},null,8,["modelValue"])]),t("div",ws,[e[46]||(e[46]=t("label",{class:"form-label"},"Perioadă",-1)),c(r(ve),{modelValue:y.value,"onUpdate:modelValue":e[11]||(e[11]=s=>y.value=s),options:X,optionLabel:"label",optionValue:"value",placeholder:"Selectați perioada",class:"w-full"},null,8,["modelValue"])]),t("div",Cs,[c(r(V),{label:"Resetează",icon:"pi pi-filter-slash",severity:"secondary",outlined:"",class:"flex-1",onClick:H}),c(r(V),{label:"Aplică",icon:"pi pi-check",class:"flex-1",onClick:Fe})])])]),_:1},8,["modelValue"])],64))}},Ps=Le(xs,[["__scopeId","data-v-a889bf55"]]);export{Ps as default}; -//# sourceMappingURL=DetailedInvoicesView.DXIThWg_.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/DetailedInvoicesView.DXIThWg_.js.map b/deploy-package-20260223-151231/frontend/assets/DetailedInvoicesView.DXIThWg_.js.map deleted file mode 100644 index 640e3f1..0000000 --- a/deploy-package-20260223-151231/frontend/assets/DetailedInvoicesView.DXIThWg_.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"DetailedInvoicesView.DXIThWg_.js","sources":["../../src/modules/reports/views/DetailedInvoicesView.vue"],"sourcesContent":["\n\n\n\n\n"],"names":["router","useRouter","route","useRoute","toast","useToast","dashboardStore","useDashboardStore","companyStore","useCompanyStore","periodStore","useAccountingPeriodStore","authStore","useAuthStore","showDrawer","ref","activeTab","invoiceType","computed","switchTab","tab","firstRow","expandedGroups","loadDetailedData","windowWidth","isMobile","handleResize","isLoading","error","searchTerm","selectedPeriod","detailedData","rowsPerPage","isFilterSheetOpen","periodOptions","hasActiveFilters","topBarActions","exportMenu","exportMenuItems","exportPDF","exportExcel","desktopExportItems","formatCurrency","value","formatDate","date","filteredData","row","val","groupedData","groups","nameField","name","paginatedGroups","paginatedData","totalRecords","getPeriodLabel","period","option","o","getStatusClass","status","toggleGroup","groupName","isGroupExpanded","calculateTotal","field","sum","goBack","handleLogout","handleServerSwitched","newServerId","_a","handleCompanyChanged","company","handlePeriodChanged","handleTopBarAction","action","event","openFilters","resetFilters","clearSearch","handleSearch","clearPeriod","applyFilters","handlePageChange","page","luna","an","_b","response","err","ws","XLSX.utils","wb","XLSX.writeFile","doc","jsPDF","columns","rows","paidField","watch","newCompany","newPeriod","oldPeriod","onMounted","onUnmounted","_createBlock","MobileTopBar","_createVNode","MobileDrawerMenu","$event","_unref","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_normalizeClass","Menu","_hoisted_3","_hoisted_4","_cache","_hoisted_5","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","InputText","_hoisted_11","Dropdown","_hoisted_12","Button","SplitButton","_hoisted_13","_hoisted_14","_hoisted_15","_toDisplayString","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","DataTable","Column","_withCtx","slotProps","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_Fragment","_renderList","group","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_Transition","_hoisted_38","factura","idx","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72","_hoisted_73","Paginator","_hoisted_74","_hoisted_75","_hoisted_76","_hoisted_77","_hoisted_78","_hoisted_6","MobileBottomNav","BottomSheet","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82"],"mappings":"knGA4gBA,MAAMA,EAASC,GAAS,EAClBC,EAAQC,GAAQ,EAChBC,EAAQC,GAAQ,EAChBC,EAAiBC,GAAiB,EAClCC,EAAeC,GAAe,EAC9BC,EAAcC,GAAwB,EACtCC,EAAYC,GAAY,EAGxBC,EAAaC,EAAI,EAAK,EAGtBC,EAAYD,EAAIb,EAAM,MAAM,MAAQ,YAAc,YAAeA,EAAM,KAAK,aAAe,SAAU,EAGrGe,EAAcC,EAAS,IAAMF,EAAU,KAAK,EAG5CG,EAAY,MAAOC,GAAQ,CAC3BA,IAAQJ,EAAU,QAEtBA,EAAU,MAAQI,EAGlBpB,EAAO,QAAQ,CACb,MAAO,CACL,GAAGE,EAAM,MACT,IAAKkB,IAAQ,YAAc,YAAc,MAC/C,CACA,CAAG,EAGDC,EAAS,MAAQ,EACjBC,EAAe,MAAM,MAAK,EAC1B,MAAMC,EAAgB,EACxB,EAGMC,GAAcT,EAAI,OAAO,UAAU,EACnCU,EAAWP,EAAS,IAAMM,GAAY,MAAQ,GAAG,EAEjDE,GAAe,IAAM,CACzBF,GAAY,MAAQ,OAAO,UAC7B,EAGMG,EAAYZ,EAAI,EAAK,EACrBa,EAAQb,EAAI,IAAI,EAEhBc,EAAad,EAAI,EAAE,EACnBe,EAAiBf,EAAI,KAAK,EAC1BgB,EAAehB,EAAI,CAAA,CAAE,EACrBM,EAAWN,EAAI,CAAC,EAChBiB,EAAcjB,EAAI,EAAE,EACpBO,EAAiBP,EAAI,IAAI,GAAK,EAC9BkB,EAAoBlB,EAAI,EAAK,EAK7BmB,EAAgB,CACpB,CAAE,MAAO,QAAS,MAAO,KAAK,EAC9B,CAAE,MAAO,SAAU,MAAO,IAAI,EAC9B,CAAE,MAAO,SAAU,MAAO,IAAI,EAC9B,CAAE,MAAO,SAAU,MAAO,IAAI,EAC9B,CAAE,MAAO,SAAU,MAAO,IAAI,EAC9B,CAAE,MAAO,UAAW,MAAO,KAAK,CAClC,EAIMC,GAAmBjB,EAAS,IACzBW,EAAW,QAAU,IAC1BC,EAAe,QAAU,KAC5B,EAGKM,GAAgBlB,EAAS,IAAM,CACnC,CACE,KAAM,eACN,MAAO,SACP,QAAS,kBACT,OAAQiB,GAAiB,KAC7B,EACE,CACE,KAAM,qBACN,MAAO,YACP,QAAS,oBACb,EACE,CACE,KAAM,iBACN,MAAO,SACP,QAAS,QACb,CACA,CAAC,EAGKE,GAAatB,EAAI,IAAI,EACrBuB,GAAkBvB,EAAI,CAC1B,CACE,MAAO,aACP,KAAM,iBACN,QAAS,IAAMwB,EAAS,CAC5B,EACE,CACE,MAAO,cACP,KAAM,mBACN,QAAS,IAAMC,GAAW,CAC9B,CACA,CAAC,EAGKC,GAAqB1B,EAAI,CAC7B,CACE,MAAO,aACP,KAAM,iBACN,QAAS,IAAMwB,EAAS,CAC5B,EACE,CACE,MAAO,cACP,KAAM,mBACN,QAAS,IAAMC,GAAW,CAC9B,CACA,CAAC,EAMKE,EAAkBC,GAClBA,GAAU,KAAoC,QAC3C,IAAI,KAAK,aAAa,QAAS,CACpC,MAAO,WACP,SAAU,MACV,sBAAuB,EACvB,sBAAuB,CAC3B,CAAG,EAAE,OAAO,KAAK,IAAIA,CAAK,CAAC,EAIrBC,EAAcD,GAAU,CAC5B,GAAI,CAACA,EAAO,MAAO,IACnB,MAAME,EAAO,IAAI,KAAKF,CAAK,EAC3B,OAAI,MAAME,EAAK,QAAO,CAAE,EAAUF,EAC3BE,EAAK,mBAAmB,QAAS,CACtC,IAAK,UACL,MAAO,UACP,KAAM,SACV,CAAG,CACH,EAGMC,EAAe5B,EAAS,IACvBW,EAAW,MACTE,EAAa,MAAM,OAAQgB,GACzB,OAAO,OAAOA,CAAG,EAAE,KAAMC,GAC9B,OAAOA,CAAG,EAAE,YAAW,EAAG,SAASnB,EAAW,MAAM,YAAW,CAAE,CACvE,CACG,EAL6BE,EAAa,KAM5C,EAEKkB,GAAc/B,EAAS,IAAM,CACjC,GAAID,EAAY,QAAU,WAAY,MAAO,CAAA,EAE7C,MAAMiC,EAAS,CAAA,EACTC,EAAYlC,EAAY,QAAU,UAAY,SAAW,WAE/D,OAAA6B,EAAa,MAAM,QAASC,GAAQ,CAClC,MAAMK,EAAOL,EAAII,CAAS,EACrBC,IAEAF,EAAOE,CAAI,IACdF,EAAOE,CAAI,EAAI,CACb,KAAMA,EACN,QAAS,CAAA,EACT,UAAW,EACX,WAAY,EACpB,GAGIF,EAAOE,CAAI,EAAE,QAAQ,KAAKL,CAAG,EAC7BG,EAAOE,CAAI,EAAE,WAAaL,EAAI,MAAQ,EAClCA,EAAI,SAAW,YACjBG,EAAOE,CAAI,EAAE,WAAa,IAE9B,CAAC,EAEM,OAAO,OAAOF,CAAM,CAC7B,CAAC,EAEKG,EAAkBnC,EAAS,IAC3BD,EAAY,QAAU,WAAmB,CAAA,EACtCgC,GAAY,KACpB,EAEKK,EAAgBpC,EAAS,IACzBD,EAAY,QAAU,WAAmB,CAAA,EACtC6B,EAAa,KACrB,EAEKS,GAAerC,EAAS,IACrBZ,EAAe,mBAAqB2C,GAAY,MAAM,MAC9D,EAKKO,GAAkBC,GAAW,CACjC,MAAMC,EAASxB,EAAc,KAAKyB,GAAKA,EAAE,QAAUF,CAAM,EACzD,OAAOC,GAAA,YAAAA,EAAQ,QAASD,CAC1B,EAEMG,GAAkBC,GAClBA,IAAW,UAAkB,iBAC1B,YAGHC,GAAeC,GAAc,CAC7BzC,EAAe,MAAM,IAAIyC,CAAS,EACpCzC,EAAe,MAAM,OAAOyC,CAAS,EAErCzC,EAAe,MAAM,IAAIyC,CAAS,CAEtC,EAEMC,EAAmBD,GAChBzC,EAAe,MAAM,IAAIyC,CAAS,EAGrCE,GAAkBC,GACfpB,EAAa,MAAM,OAAO,CAACqB,EAAKpB,IAAQoB,GAAOpB,EAAImB,CAAK,GAAK,GAAI,CAAC,EAIrEE,GAAS,IAAM,CACnBpE,EAAO,KAAK,oBAAoB,CAClC,EAGMqE,GAAe,SAAY,CAC/B,MAAMzD,EAAU,OAAM,EACtBZ,EAAO,KAAK,QAAQ,CACtB,EAGMsE,GAAuB,MAAOC,GAAgB,OAGlD,MAAM/D,EAAa,cAAa,GAC5BgE,EAAAhE,EAAa,kBAAb,MAAAgE,EAA8B,UAChC,MAAM9D,EAAY,YAAYF,EAAa,gBAAgB,QAAQ,CAEvE,EAEMiE,GAAwBC,GAAY,CAEpCA,GACFnD,EAAgB,CAEpB,EAEMoD,GAAsB,IAAM,CAElC,EAGMC,GAAqB,CAACC,EAAQC,IAAU,CACxCD,EAAO,OAAS,eAClBE,GAAW,EACFF,EAAO,OAAS,qBACzBG,EAAY,EACHH,EAAO,OAAS,kBACzBxC,GAAW,MAAM,OAAOyC,CAAK,CAEjC,EAGMC,GAAc,IAAM,CACxB9C,EAAkB,MAAQ,EAC5B,EAEMgD,GAAc,IAAM,CACxBpD,EAAW,MAAQ,GACnBqD,GAAY,CACd,EAGMC,GAAc,IAAM,CACxBrD,EAAe,MAAQ,MACvBP,EAAgB,CAClB,EAEM2D,GAAe,IAAM,CACzB7D,EAAS,MAAQ,EACjBC,EAAe,MAAM,MAAK,CAC5B,EAEM0D,EAAe,IAAM,CAEzBnD,EAAW,MAAQ,GACnBC,EAAe,MAAQ,MACvBT,EAAS,MAAQ,EACjBC,EAAe,MAAM,MAAK,EAC1BC,EAAgB,CAClB,EAEM6D,GAAe,IAAM,CACzBnD,EAAkB,MAAQ,GAC1BZ,EAAS,MAAQ,EACjBC,EAAe,MAAM,MAAK,EAC1BC,EAAgB,CAClB,EAEM8D,GAAmB,IAAM,CAC7B9D,EAAgB,CAClB,EAGMA,EAAmB,SAAY,SACnC,GAAKf,EAAa,gBAIlB,CAAAmB,EAAU,MAAQ,GAClBC,EAAM,MAAQ,KAEd,GAAI,CACF,MAAM0D,EAAO,KAAK,MAAMjE,EAAS,MAAQW,EAAY,KAAK,EAAI,EACxDuD,IAAOf,EAAA9D,EAAY,iBAAZ,YAAA8D,EAA4B,OAAQ,KAC3CgB,IAAKC,EAAA/E,EAAY,iBAAZ,YAAA+E,EAA4B,KAAM,KAEvCC,EAAW,MAAMpF,EAAe,iBACpCW,EAAY,MACZT,EAAa,gBAAgB,SAC7B8E,EACAtD,EAAY,MACZH,EAAW,MACX0D,EACAC,CACN,EAEIzD,EAAa,MAAQ2D,EAAS,KAC9BpE,EAAe,MAAM,MAAK,CAC5B,OAASqE,EAAK,CACZ,QAAQ,MAAM,gCAAiCA,CAAG,EAClD/D,EAAM,MAAQ+D,EAAI,SAAW,+BAC7BvF,EAAM,IAAI,CACR,SAAU,QACV,QAAS,SACT,OAAQ,4CACR,KAAM,GACZ,CAAK,CACH,QAAC,CACCuB,EAAU,MAAQ,EACpB,EACF,EAGMa,GAAc,IAAM,CACxB,MAAMoD,EAAKC,EAAW,cAAc/C,EAAa,KAAK,EAChDgD,EAAKD,EAAW,SAAQ,EAC9BA,EAAW,kBAAkBC,EAAIF,EAAI3E,EAAY,KAAK,EACtD8E,GAAeD,EAAI,WAAW7E,EAAY,KAAK,IAAI,IAAI,KAAI,EAAG,YAAW,EAAG,MAAM,GAAG,EAAE,CAAC,CAAC,OAAO,EAEhGb,EAAM,IAAI,CACR,SAAU,UACV,QAAS,gBACT,OAAQ,GAAG0C,EAAa,MAAM,MAAM,0BACpC,KAAM,GACV,CAAG,CACH,EAEMP,EAAY,IAAM,CACtB,MAAMyD,EAAM,IAAIC,GAEVC,EAAUjF,EAAY,QAAU,WAClC,CAAC,OAAQ,YAAa,OAAQ,SAAU,KAAK,EAC7CA,EAAY,QAAU,UACpB,CAAC,SAAU,eAAgB,YAAa,WAAY,WAAY,UAAW,MAAM,EACjF,CAAC,WAAY,eAAgB,YAAa,WAAY,WAAY,UAAW,MAAM,EAEnFkF,EAAOrD,EAAa,MAAM,IAAKC,GAAQ,CAC3C,GAAI9B,EAAY,QAAU,WACxB,MAAO,CAAC8B,EAAI,KAAMA,EAAI,UAAWL,EAAeK,EAAI,IAAI,EAAGA,EAAI,OAAQA,EAAI,GAAG,EAEhF,MAAMI,EAAYlC,EAAY,QAAU,UAAY,SAAW,WACzDmF,EAAYnF,EAAY,QAAU,UAAY,UAAY,UAChE,MAAO,CACL8B,EAAII,CAAS,EACbJ,EAAI,eACJH,EAAWG,EAAI,aAAa,EAC5BH,EAAWG,EAAI,aAAa,EAC5BL,EAAeK,EAAI,QAAQ,EAC3BL,EAAeK,EAAIqD,CAAS,CAAC,EAC7B1D,EAAeK,EAAI,IAAI,CAC7B,CACE,CAAC,EAEDiD,EAAI,UAAU,CACZ,KAAM,CAACE,CAAO,EACd,KAAMC,EACN,MAAO,OACP,OAAQ,CAAE,SAAU,CAAC,EACrB,WAAY,CAAE,UAAW,CAAC,GAAI,IAAK,GAAG,CAAC,CAC3C,CAAG,EAEDH,EAAI,KAAK,WAAW/E,EAAY,KAAK,IAAI,IAAI,KAAI,EAAG,YAAW,EAAG,MAAM,GAAG,EAAE,CAAC,CAAC,MAAM,EAErFb,EAAM,IAAI,CACR,SAAU,UACV,QAAS,gBACT,OAAQ,kBAAkB0C,EAAa,MAAM,MAAM,gBACnD,KAAM,GACV,CAAG,CACH,EAGA,OAAAuD,GACE,IAAM7F,EAAa,gBAClB8F,GAAe,CACVA,GACF/E,EAAgB,CAEpB,CACF,EAEA8E,GACE,IAAM3F,EAAY,eAClB,CAAC6F,EAAWC,IAAc,CACpBD,IAAcA,EAAU,QAASC,GAAA,YAAAA,EAAW,OAAQD,EAAU,MAAOC,GAAA,YAAAA,EAAW,MAClFjF,EAAgB,CAEpB,EACA,CAAE,KAAM,EAAI,CACd,EAGAkF,GAAU,IAAM,CACd,OAAO,iBAAiB,SAAU/E,EAAY,EAC1ClB,EAAa,iBACfe,EAAgB,CAEpB,CAAC,EAEDmF,GAAY,IAAM,CAChB,OAAO,oBAAoB,SAAUhF,EAAY,CACnD,CAAC,wBAv8BSD,EAAA,WADRkF,EAOEC,GAAA,OALA,MAAM,oBACL,YAAW,GACX,QAASxE,GAAA,MACT,2BAAYtB,EAAA,MAAU,IACtB,cAAc8D,kCAIjBiC,EAYEC,GAAA,YAXShG,EAAA,2CAAAA,EAAU,MAAAiG,GAClB,KAAMC,EAAApG,CAAA,EAAU,KAChB,kBAAiBoG,EAAAxG,CAAA,EACjB,eAAcwG,EAAAtG,CAAA,EACd,oBAAmBsG,EAAApG,CAAA,EAAU,iBAC7B,oBAAmBoG,EAAApG,CAAA,EAAU,iBAC7B,aAAYoG,EAAApG,CAAA,EACZ,SAAQyD,GACR,iBAAiBI,GACjB,gBAAgBE,GAChB,iBAAiBL,wHAIT7C,EAAA,OAAXwF,IAAAC,EAiBM,MAjBNC,GAiBM,CAhBJC,EAeM,MAfNC,GAeM,CAdJD,EAMS,SAAA,CALP,MAAKE,EAAA,CAAC,aAAY,CAAA,OACAtG,EAAA,QAAS,SAAA,CAAA,CAAA,EAC1B,uBAAOG,EAAS,SAAA,uBAEjBiG,EAAsC,OAAA,CAAhC,MAAM,WAAW,EAAC,UAAO,EAAA,QAEjCA,EAMS,SAAA,CALP,MAAKE,EAAA,CAAC,aAAY,CAAA,OACAtG,EAAA,QAAS,WAAA,CAAA,CAAA,EAC1B,uBAAOG,EAAS,WAAA,uBAEjBiG,EAAwC,OAAA,CAAlC,MAAM,WAAW,EAAC,YAAS,EAAA,sBAMvCP,EAAgEG,EAAAO,EAAA,EAAA,SAAtD,aAAJ,IAAIlF,GAAc,MAAOC,GAAA,MAAkB,MAAO,sBAExD8E,EAiZO,OAAA,CAjZD,MAAKE,EAAA,CAAC,eAAc,CAAA,gBAA4B7F,EAAA,iBAAsBA,EAAA,MAAQ,CAAA,IAClF2F,EA+YM,MA/YNI,GA+YM,CA5YQ/F,EAAA,gBAAZwF,IAAAC,EAuBM,MAvBNO,GAuBM,CAtBJC,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAA6C,KAAA,CAAzC,MAAM,YAAY,EAAC,oBAAiB,EAAA,GACxCM,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAAoF,IAAA,CAAjF,MAAM,eAAe,EAAC,0DAAuD,EAAA,GAGhFA,EAiBM,MAjBNO,GAiBM,CAhBJP,EAOS,SAAA,CANP,MAAKE,EAAA,CAAC,cAAa,CAAA,OACDtG,EAAA,QAAS,SAAA,CAAA,CAAA,EAC1B,uBAAOG,EAAS,SAAA,uBAEjBiG,EAA2B,IAAA,CAAxB,MAAM,aAAa,EAAA,KAAA,EAAA,EACtBA,EAAoB,YAAd,UAAO,EAAA,QAEfA,EAOS,SAAA,CANP,MAAKE,EAAA,CAAC,cAAa,CAAA,OACDtG,EAAA,QAAS,WAAA,CAAA,CAAA,EAC1B,uBAAOG,EAAS,WAAA,uBAEjBiG,EAA2B,IAAA,CAAxB,MAAM,aAAa,EAAA,KAAA,EAAA,EACtBA,EAAsB,YAAhB,YAAS,EAAA,aAMTJ,EAAAxG,CAAA,EAAa,iBAezByG,IAAAC,EAkWM,MAlWNU,GAkWM,CA/VQnG,EAAA,gBAAZwF,IAAAC,EAgDM,MAhDNW,GAgDM,CA/CJT,EAsBM,MAtBNU,GAsBM,CArBJV,EAQM,MARNW,GAQM,CAPJL,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAAyC,QAAA,CAAlC,MAAM,YAAY,EAAC,UAAO,EAAA,GACjCP,EAKEG,EAAAgB,EAAA,EAAA,YAJSnG,EAAA,2CAAAA,EAAU,MAAAkF,GACnB,YAAY,aACZ,MAAM,SACL,QAAO7B,6BAGZkC,EAWM,MAXNa,GAWM,CAVJP,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAA0C,QAAA,CAAnC,MAAM,YAAY,EAAC,WAAQ,EAAA,GAClCP,EAQEG,EAAAkB,EAAA,EAAA,YAPSpG,EAAA,2CAAAA,EAAc,MAAAiF,GACtB,QAAS7E,EACV,YAAY,QACZ,YAAY,QACZ,YAAY,qBACZ,MAAM,SACL,SAAQX,8BAKf6F,EAsBM,MAtBNe,GAsBM,CArBJtB,EAMEG,EAAAoB,CAAA,EAAA,CALA,KAAK,qBACL,MAAM,YACN,SAAS,YACT,SAAA,GACC,QAAOpD,IAEV6B,EAOEG,EAAAqB,EAAA,EAAA,CANA,MAAM,SACN,KAAK,iBACJ,MAAO5F,GAAA,MACP,QAAOF,EACR,SAAA,GACC,SAAUO,EAAA,MAAa,SAAM,gCAEhC+D,EAKEG,EAAAoB,CAAA,EAAA,CAJA,KAAK,gBACL,MAAM,eACL,QAASzG,EAAA,MACT,QAAOJ,4BAMHE,EAAA,OAAYU,GAAA,OAAvB8E,IAAAC,EAWM,MAXNoB,GAWM,CAVOzG,EAAA,OAAXoF,IAAAC,EAIM,MAJNqB,GAIM,eAHJnB,EAA4B,IAAA,CAAzB,MAAM,cAAc,EAAA,KAAA,EAAA,GACvBA,EAA6B,cAApBvF,EAAA,KAAU,EAAA,CAAA,EACnBuF,EAAgD,IAAA,CAA7C,MAAM,cAAe,QAAOnC,iBAEtBnD,EAAA,QAAc,OAAzBmF,IAAAC,EAIM,MAJNsB,GAIM,eAHJpB,EAA8B,IAAA,CAA3B,MAAM,gBAAgB,EAAA,KAAA,EAAA,GACzBA,EAAiD,OAAA,KAAAqB,EAAxCjF,GAAe1B,EAAA,KAAc,CAAA,EAAA,CAAA,EACtCsF,EAAgD,IAAA,CAA7C,MAAM,cAAe,QAAOjC,6BAKxBxD,EAAA,OAAXsF,IAAAC,EAGM,MAHNwB,GAGM,CAAA,GAAAhB,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAFJN,EAAmC,MAAA,CAA9B,MAAM,iBAAiB,EAAA,KAAA,EAAA,EAC5BA,EAA8B,SAA3B,0BAAuB,EAAA,OAIZxF,EAAA,OAAhBqF,IAAAC,EAIM,MAJNyB,GAIM,eAHJvB,EAAwC,IAAA,CAArC,MAAM,0BAA0B,EAAA,KAAA,EAAA,GACnCA,EAAkB,WAAZxF,EAAA,KAAK,EAAA,CAAA,EACXiF,EAAkFG,EAAAoB,CAAA,EAAA,CAA1E,MAAM,mBAAmB,KAAK,gBAAiB,QAAO7G,QAIhE0F,IAAAC,EAgRM,MAhRN0B,GAgRM,CA9QQnH,EAAA,gBAAZwF,IAAAC,EAyIM,MAzIN2B,GAyIM,CAtII5H,EAAA,QAAW,gBADnB0F,EAgBYK,EAAA8B,EAAA,EAAA,OAdT,MAAOxF,EAAA,MACP,QAAS3B,EAAA,MACV,YAAA,GACA,MAAM,6BAEN,IAAqD,CAArDkF,EAAqDG,EAAA+B,CAAA,EAAA,CAA7C,MAAM,OAAO,OAAO,OAAO,SAAA,KACnClC,EAA+DG,EAAA+B,CAAA,EAAA,CAAvD,MAAM,YAAY,OAAO,YAAY,SAAA,KAC7ClC,EAISG,EAAA+B,CAAA,EAAA,CAJD,MAAM,OAAO,OAAO,OAAO,SAAA,KACtB,KAAIC,EAC2DC,GADhD,CACxB7B,EAAwE,OAAxE8B,GAAwET,EAA7C/F,EAAeuG,EAAU,KAAK,IAAI,CAAA,EAAA,CAAA,UAGjEpC,EAAyDG,EAAA+B,CAAA,EAAA,CAAjD,MAAM,SAAS,OAAO,SAAS,SAAA,KACvClC,EAAmDG,EAAA+B,CAAA,EAAA,CAA3C,MAAM,MAAM,OAAO,MAAM,SAAA,qCAInC9B,IAAAC,EAmHM,MAnHNiC,GAmHM,CAjHJ/B,EASM,MATNgC,GASM,eARJhC,EAA0C,MAAA,CAArC,MAAM,wBAAwB,EAAA,KAAA,EAAA,GACnCA,EAA+F,MAA/FiC,GAA+FZ,EAA1DxH,EAAA,QAAW,UAAA,SAAA,UAAA,EAAA,CAAA,EAChDyG,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAA2C,MAAA,CAAtC,MAAM,aAAa,EAAC,eAAY,EAAA,GACrCM,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAA4C,MAAA,CAAvC,MAAM,aAAa,EAAC,gBAAa,EAAA,GACtCM,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAA4C,MAAA,CAAvC,MAAM,aAAa,EAAC,gBAAa,EAAA,GACtCM,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAAkD,MAAA,CAA7C,MAAM,wBAAwB,EAAC,WAAQ,EAAA,GAC5CA,EAAiG,MAAjGkC,GAAiGb,EAA1DxH,EAAA,QAAW,UAAA,UAAA,SAAA,EAAA,CAAA,EAClDyG,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAA8C,MAAA,CAAzC,MAAM,0BAAyB,OAAI,EAAA,KAI1CA,EAoGM,MApGNmC,GAoGM,QAnGJrC,EA4FWsC,EAAA,KAAAC,EA5FepG,EAAA,MAATqG,aAAgC,IAAAA,EAAM,OAErDtC,EAkDM,MAAA,CAjDJ,SAAM,YAAW,YAC6BsC,EAAM,QAAQ,OAAM,WAAwC1F,EAAgB0F,EAAM,IAAI,KAInI,QAAK3C,GAAE2C,EAAM,QAAQ,OAAM,GAAQ5F,GAAY4F,EAAM,IAAI,IAE1DtC,EAMM,MANNuC,GAMM,CAJID,EAAM,QAAQ,OAAM,OAD5BxC,EAIK,IAAA,OAFH,SAAM,kCAAiC,CAAA,QAClBlD,EAAgB0F,EAAM,IAAI,EAAA,CAAA,uBAGnDtC,EAKM,MALNwC,GAKM,CAJJxC,EAAiC,SAAA,KAAAqB,EAAtBiB,EAAM,IAAI,EAAA,CAAA,EACTA,EAAM,QAAQ,OAAM,OAAhCxC,EAEO,OAFP2C,GAA0D,KACvDpB,EAAGiB,EAAM,QAAQ,MAAM,EAAG,aAC7B,CAAA,cAEFtC,EAEM,MAFN0C,GAEMrB,EADDiB,EAAM,QAAQ,SAAM,EAASA,EAAM,WAAW,eAAc,GAAA,EAAA,CAAA,EAEjEtC,EAEM,MAFN2C,GAEMtB,EADDiB,EAAM,QAAQ,SAAM,EAAS9G,EAAW8G,EAAM,WAAW,aAAa,EAAA,GAAA,EAAA,CAAA,EAE3EtC,EAEM,MAFN4C,GAEMvB,EADDiB,EAAM,QAAQ,SAAM,EAAS9G,EAAW8G,EAAM,WAAW,aAAa,EAAA,GAAA,EAAA,CAAA,EAE3EtC,EAIM,MAJN6C,GAIM,CAHJ7C,EAEO,OAFP8C,GAEOzB,EADFiB,EAAM,QAAQ,SAAM,EAAShH,EAAegH,EAAM,WAAW,QAAQ,EAAA,GAAA,EAAA,CAAA,IAG5EtC,EAMM,MANN+C,GAMM,CALJ/C,EAIO,OAJPgD,GAIO3B,EAHFiB,EAAM,QAAQ,SAAM,EAAmChH,EAAegH,EAAM,WAAWzI,EAAA,QAAW,UAAA,UAAA,SAAA,CAAA,YAKzGmG,EAOM,MAPNiD,GAOM,CANJjD,EAKO,OAAA,CAJL,MAAKE,EAAA,CAAC,sBAAqB,CAAA,eACDoC,EAAM,WAAU,CAAA,KAEvChH,EAAegH,EAAM,SAAS,CAAA,EAAA,CAAA,YAMvC7C,EAoCayD,GAAA,CApCD,KAAK,QAAQ,EAAA,WACvB,IAkCM,CAjCEZ,EAAM,QAAQ,UAAc1F,EAAgB0F,EAAM,IAAI,GAD9DzC,IAAAC,EAkCM,MAlCNqD,GAkCM,EA9BJtD,EAAA,EAAA,EAAAC,EA6BMsC,SA5BqBE,EAAM,QAAO,CAA9Bc,EAASC,SADnBvD,EA6BM,MAAA,CA3BH,IAAG,GAAKwC,EAAM,IAAI,YAAYe,CAAG,GAClC,MAAM,8BAENrD,EAAuC,MAAA,CAAlC,MAAM,qBAAqB,EAAA,KAAA,EAAA,iBAChCA,EAGM,MAAA,CAHD,MAAM,2CAAyC,CAClDA,EAAuC,OAAA,CAAjC,MAAM,mBAAmB,CAAA,EAC/BA,EAA8C,OAAA,CAAxC,MAAM,mBAAmB,EAAC,SAAO,QAEzCA,EAAwD,MAAxDsD,GAAwDjC,EAA/B+B,EAAQ,cAAc,EAAA,CAAA,EAC/CpD,EAAmE,MAAnEuD,GAAmElC,EAA1C7F,EAAW4H,EAAQ,aAAa,CAAA,EAAA,CAAA,EACzDpD,EAAmE,MAAnEwD,GAAmEnC,EAA1C7F,EAAW4H,EAAQ,aAAa,CAAA,EAAA,CAAA,EACzDpD,EAEM,MAFNyD,GAEM,CADJzD,EAAqE,OAArE0D,GAAqErC,EAA1C/F,EAAe8H,EAAQ,QAAQ,CAAA,EAAA,CAAA,IAE5DpD,EAIM,MAJN2D,GAIM,CAHJ3D,EAEO,OAFP4D,GAEOvC,EADF/F,EAAe8H,EAAQvJ,EAAA,QAAW,UAAA,UAAA,SAAA,CAAA,CAAA,EAAA,CAAA,IAGzCmG,EAOM,MAPN6D,GAOM,CANJ7D,EAKO,OAAA,CAJL,MAAKE,EAAA,CAAC,YAAW,CAAA,eACSkD,EAAQ,SAAM,UAAA,CAAA,KAErC9H,EAAe8H,EAAQ,IAAI,CAAA,EAAA,CAAA,oDAS/BnH,EAAA,MAAgB,SAAM,GAAjC4D,IAAAC,EAGM,MAHNgE,GAGM,CAAA,GAAAxD,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAFJN,EAA2B,IAAA,CAAxB,MAAM,aAAa,EAAA,KAAA,EAAA,EACtBA,EAAoD,SAAjD,gDAA6C,EAAA,wBAO7C3F,EAAA,OAAXwF,IAAAC,EA0GM,MA1GNiE,GA0GM,CAxGYlK,EAAA,QAAW,kBACzBiG,EAmBMsC,EAAA,CAAA,IAAA,CAAA,EAAAC,EAlBUnG,EAAA,MAAPP,QADTmE,EAmBM,MAAA,CAjBH,IAAKnE,EAAI,GACV,MAAM,iBAENqE,EAGM,MAHNgE,GAGM,CAFJhE,EAA+B,SAAA,KAAAqB,EAApB1F,EAAI,IAAI,EAAA,CAAA,EACnBqE,EAAgD,OAAhDiE,GAAgD5C,EAApB1F,EAAI,MAAM,EAAA,CAAA,IAExCqE,EASM,MATNkE,GASM,CARJlE,EAGM,MAHNmE,GAGM,CAFJ7D,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAA0C,OAAA,CAApC,MAAM,aAAa,EAAC,YAAS,EAAA,GACnCA,EAAoD,OAApDoE,GAAoD/C,EAAvB1F,EAAI,SAAS,EAAA,CAAA,IAE5CqE,EAGM,MAHNqE,GAGM,CAFJ/D,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAAqC,OAAA,CAA/B,MAAM,aAAa,EAAC,OAAI,EAAA,GAC9BA,EAA0E,OAA1EsE,GAA0EjD,EAAlC/F,EAAeK,EAAI,IAAI,CAAA,EAAA,CAAA,uBAQrEmE,EAuEMsC,EAAA,CAAA,IAAA,CAAA,EAAAC,EAtEYpG,EAAA,MAATqG,QADTxC,EAuEM,MAAA,CArEH,IAAKwC,EAAM,KACZ,SAAM,eAAc,CAAA,eACMA,EAAM,QAAQ,OAAM,CAAA,CAAA,CAAA,EAC7C,QAAK3C,GAAE2C,EAAM,QAAQ,OAAM,GAAQ5F,GAAY4F,EAAM,IAAI,IAE1DtC,EAmBM,MAnBNuE,GAmBM,CAlBJvE,EAKM,MALNwE,GAKM,CAJJxE,EAAiC,SAAA,KAAAqB,EAAtBiB,EAAM,IAAI,EAAA,CAAA,EACTA,EAAM,QAAQ,OAAM,OAAhCxC,EAEO,OAFP2E,GAA0D,KACvDpD,EAAGiB,EAAM,QAAQ,MAAM,EAAG,KAC7B,CAAA,cAEFtC,EAWM,MAXN0E,GAWM,CAVJ1E,EAKO,OAAA,CAJL,MAAKE,EAAA,CAAC,aAAY,CAAA,eACQoC,EAAM,WAAU,CAAA,KAEvChH,EAAegH,EAAM,SAAS,CAAA,EAAA,CAAA,EAG3BA,EAAM,QAAQ,OAAM,OAD5BxC,EAGK,IAAA,OADF,MAAKI,EAAA,CAAA,KAAStD,EAAgB0F,EAAM,IAAI,EAAA,gBAAA,iBAAA,CAAA,yBAMpCA,EAAM,QAAQ,SAAM,GAA/BzC,IAAAC,EAkBM,MAlBN6E,GAkBM,CAjBJ3E,EAGM,MAHN4E,GAGM,CAFJtE,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAA6C,OAAA,CAAvC,MAAM,aAAa,EAAC,eAAY,EAAA,GACtCA,EAAsE,OAAtE6E,GAAsExD,EAAzCiB,EAAM,WAAW,cAAc,EAAA,CAAA,IAE9DtC,EASM,MATN8E,GASM,CARJ9E,EAGM,MAHN+E,GAGM,CAFJzE,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAA0C,OAAA,CAApC,MAAM,aAAa,EAAC,YAAS,EAAA,GACnCA,EAAiF,OAAjFgF,GAAiF3D,EAApD7F,EAAW8G,EAAM,QAAO,CAAA,EAAI,aAAa,CAAA,EAAA,CAAA,IAExEtC,EAGM,MAHNiF,GAGM,CAFJ3E,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAAyC,OAAA,CAAnC,MAAM,aAAa,EAAC,WAAQ,EAAA,GAClCA,EAAiF,OAAjFkF,GAAiF7D,EAApD7F,EAAW8G,EAAM,QAAO,CAAA,EAAI,aAAa,CAAA,EAAA,CAAA,MAG1EtC,EAEM,MAAA,CAFD,MAAKE,EAAA,CAAC,cAAsB1D,GAAe8F,EAAM,QAAO,CAAA,EAAI,MAAM,CAAA,CAAA,KAClEA,EAAM,QAAO,CAAA,EAAI,MAAM,EAAA,CAAA,cAKnBA,EAAM,QAAQ,UAAc1F,EAAgB0F,EAAM,IAAI,GAAjEzC,IAAAC,EAoBM,MApBNqF,GAoBM,EAnBJtF,EAAA,EAAA,EAAAC,EAkBMsC,SAjBqBE,EAAM,QAAO,CAA9Bc,EAASC,SADnBvD,EAkBM,MAAA,CAhBH,IAAG,GAAKwC,EAAM,IAAI,IAAIe,CAAG,GAC1B,MAAM,aAENrD,EAQM,MARNoF,GAQM,CAPJpF,EAAyC,OAAA,KAAAqB,EAAhC+B,EAAQ,cAAc,EAAA,CAAA,EAC/BpD,EAKO,OAAA,CAJL,MAAKE,EAAA,CAAC,gBAAe,CAAA,eACKkD,EAAQ,SAAM,UAAA,CAAA,KAErC9H,EAAe8H,EAAQ,IAAI,CAAA,EAAA,CAAA,IAGlCpD,EAGM,MAHNqF,GAGM,CAFJrF,EAAoD,OAAA,KAAAqB,EAA3C7F,EAAW4H,EAAQ,aAAa,CAAA,EAAA,CAAA,EACzCpD,EAAyE,OAAA,CAAlE,MAAKE,EAAE1D,GAAe4G,EAAQ,MAAM,CAAA,CAAM,EAAA/B,EAAA+B,EAAQ,MAAM,EAAA,CAAA,2CAQ7DvJ,EAAA,QAAW,WAAkBqC,EAAA,MAAgBD,EAAA,OAAiB,SAAM,GAAhF4D,IAAAC,EAGM,MAHNwF,GAGM,CAAA,GAAAhF,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAA,CAFJN,EAA2B,IAAA,CAAxB,MAAM,aAAa,EAAA,KAAA,EAAA,EACtBA,EAAoD,SAAjD,gDAA6C,EAAA,4BAKpDA,EAQM,MARNuF,GAQM,CAPJ9F,EAMEG,EAAA4F,EAAA,EAAA,CALQ,KAAM5K,EAAA,qCAAAA,EAAW,MAAA+E,GACxB,aAAcxD,GAAA,MACP,MAAOlC,EAAA,sCAAAA,EAAQ,MAAA0F,GACtB,mBAAoB,CAAA,GAAA,GAAA,GAAA,GAAA,EACpB,OAAM1B,8CAKAvC,EAAA,MAAa,OAAM,GAA9BmE,IAAAC,EASM,MATN2F,GASM,CARJzF,EAGM,MAHN0F,GAGM,CAFJpF,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAA4C,OAAA,CAAtC,MAAM,aAAa,EAAC,cAAW,EAAA,GACrCA,EAA6E,OAA7E2F,GAA6EtE,EAAhD/F,EAAeuB,GAAc,MAAA,CAAA,CAAA,EAAA,CAAA,IAEjDhD,EAAA,QAAW,YAAtBgG,IAAAC,EAGM,MAHN8F,GAGM,CAFJtF,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAAgD,OAAA,CAA1C,MAAM,aAAa,EAAC,kBAAe,EAAA,GACzCA,EAAiF,OAAjF6F,GAAiFxE,EAApD/F,EAAeuB,GAAc,UAAA,CAAA,CAAA,EAAA,CAAA,iCA7WlEgD,IAAAC,EAYM,MAZNgG,GAYM,eAXJ9F,EAAyC,IAAA,CAAtC,MAAM,2BAA2B,EAAA,KAAA,EAAA,GACpCM,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAAiD,KAAA,CAA7C,MAAM,aAAa,EAAC,uBAAoB,EAAA,GAC5CM,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAEI,IAAA,CAFD,MAAM,mBAAmB,EAAC,4FAE7B,EAAA,GACAP,EAKEG,EAAAoB,CAAA,EAAA,CAJA,MAAM,qBACN,KAAK,mBACJ,QAAOhE,GACR,MAAM,0BA4WS3C,EAAA,WAAvBkF,EAAmCwG,GAAA,CAAA,IAAA,CAAA,CAAA,YAInCtG,EA0CcuG,GAAA,YA1CQnL,EAAA,6CAAAA,EAAiB,MAAA8E,eACrC,IAwCM,CAxCNK,EAwCM,MAxCNiG,GAwCM,CAvCJ3F,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAA0C,KAAA,CAAtC,MAAM,oBAAoB,EAAC,SAAM,EAAA,GAErCA,EAOM,MAPNkG,GAOM,CANJ5F,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAAyC,QAAA,CAAlC,MAAM,YAAY,EAAC,UAAO,EAAA,GACjCP,EAIEG,EAAAgB,EAAA,EAAA,YAHSnG,EAAA,6CAAAA,EAAU,MAAAkF,GACnB,YAAY,6BACZ,MAAM,mCAIVK,EAUM,MAVNmG,GAUM,CATJ7F,EAAA,EAAA,IAAAA,EAAA,EAAA,EAAAN,EAA0C,QAAA,CAAnC,MAAM,YAAY,EAAC,WAAQ,EAAA,GAClCP,EAOEG,EAAAkB,EAAA,EAAA,YANSpG,EAAA,6CAAAA,EAAc,MAAAiF,GACtB,QAAS7E,EACV,YAAY,QACZ,YAAY,QACZ,YAAY,qBACZ,MAAM,mCAIVkF,EAeM,MAfNoG,GAeM,CAdJ3G,EAOEG,EAAAoB,CAAA,EAAA,CANA,MAAM,YACN,KAAK,qBACL,SAAS,YACT,SAAA,GACA,MAAM,SACL,QAAOpD,IAEV6B,EAKEG,EAAAoB,CAAA,EAAA,CAJA,MAAM,SACN,KAAK,cACL,MAAM,SACL,QAAOhD"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/DetailedInvoicesView.DnFh7AG8.css b/deploy-package-20260223-151231/frontend/assets/DetailedInvoicesView.DnFh7AG8.css deleted file mode 100644 index 7fca030..0000000 --- a/deploy-package-20260223-151231/frontend/assets/DetailedInvoicesView.DnFh7AG8.css +++ /dev/null @@ -1 +0,0 @@ -.main-content.mobile-layout[data-v-a889bf55]{padding-top:56px;padding-bottom:56px}.main-content.mobile-layout.has-tabs[data-v-a889bf55]{padding-top:104px}.mobile-tabs-container[data-v-a889bf55]{position:fixed;top:56px;left:0;right:0;z-index:var(--z-sticky);background:var(--surface-card);border-bottom:1px solid var(--surface-border)}.mobile-tabs[data-v-a889bf55]{display:flex;width:100%}.mobile-tab[data-v-a889bf55]{flex:1;display:flex;align-items:center;justify-content:center;padding:var(--space-md);min-height:48px;background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--transition-fast);color:var(--text-color-secondary);font-size:var(--text-sm);font-weight:var(--font-medium)}.mobile-tab[data-v-a889bf55]:active{background:var(--surface-hover)}.mobile-tab.active[data-v-a889bf55]{color:var(--color-primary);border-bottom-color:var(--color-primary);font-weight:var(--font-semibold)}.tab-label[data-v-a889bf55]{text-transform:uppercase;letter-spacing:.5px}.desktop-tabs[data-v-a889bf55]{display:flex;gap:var(--space-sm);margin-top:var(--space-sm)}.desktop-tab[data-v-a889bf55]{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-lg);background:var(--surface-hover);border:1px solid var(--surface-border);border-radius:var(--radius-md);cursor:pointer;transition:all var(--transition-fast);color:var(--text-color-secondary);font-size:var(--text-sm);font-weight:var(--font-medium)}.desktop-tab[data-v-a889bf55]:hover{background:var(--surface-card);border-color:var(--color-primary);color:var(--color-primary)}.desktop-tab.active[data-v-a889bf55]{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-text-inverse)}.desktop-tab i[data-v-a889bf55]{font-size:var(--text-base)}.app-container[data-v-a889bf55]{max-width:1400px;margin:0 auto;padding:var(--space-lg)}@media (max-width: 768px){.app-container[data-v-a889bf55]{padding:var(--space-md)}}.page-header[data-v-a889bf55]{margin-bottom:var(--space-sm)}.page-title[data-v-a889bf55]{font-size:var(--text-3xl);font-weight:var(--font-bold);color:var(--text-color);margin:0 0 var(--space-xs) 0}.page-subtitle[data-v-a889bf55]{font-size:var(--text-base);color:var(--text-color-secondary);margin:0}.invoices-container[data-v-a889bf55]{display:flex;flex-direction:column;gap:var(--space-lg)}.filters-card[data-v-a889bf55]{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-md);padding:var(--space-lg)}.filters-row[data-v-a889bf55]{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-md);margin-bottom:var(--space-md)}.filter-group[data-v-a889bf55]{display:flex;flex-direction:column;gap:var(--space-xs)}.form-label[data-v-a889bf55]{font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--text-color-secondary)}.filters-actions[data-v-a889bf55]{display:flex;gap:var(--space-sm);justify-content:flex-end;padding-top:var(--space-md);border-top:1px solid var(--surface-border)}.mobile-filter-summary[data-v-a889bf55]{display:flex;gap:var(--space-sm);flex-wrap:wrap;padding:var(--space-sm) 0}.filter-chip[data-v-a889bf55]{display:flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:var(--surface-hover);border-radius:var(--radius-full);font-size:var(--text-sm);color:var(--text-color)}.filter-chip.active[data-v-a889bf55]{background:var(--primary-100);color:var(--color-primary)}.filter-chip .pi-times[data-v-a889bf55]{font-size:.75rem;padding:var(--space-xs);cursor:pointer;border-radius:var(--radius-full);transition:background var(--transition-fast);min-width:24px;min-height:24px;display:flex;align-items:center;justify-content:center;margin:calc(-1 * var(--space-xs)) calc(-1 * var(--space-xs)) calc(-1 * var(--space-xs)) 0}.filter-chip .pi-times[data-v-a889bf55]:hover{background:var(--surface-hover)}.filter-chip .pi-times[data-v-a889bf55]:active{background:var(--surface-border)}.loading-state[data-v-a889bf55]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-2xl);text-align:center}.loading-spinner[data-v-a889bf55]{width:40px;height:40px;border:3px solid var(--surface-border);border-top:3px solid var(--color-primary);border-radius:50%;animation:spin-a889bf55 1s linear infinite;margin-bottom:var(--space-md)}@keyframes spin-a889bf55{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.error-state[data-v-a889bf55]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-2xl);text-align:center;gap:var(--space-md)}.error-state .pi[data-v-a889bf55]{font-size:48px;color:var(--color-error)}.empty-state[data-v-a889bf55]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:400px;text-align:center;padding:var(--space-xl);background:var(--surface-card);border-radius:var(--radius-lg);border:1px solid var(--surface-border)}.empty-icon[data-v-a889bf55]{font-size:64px;color:var(--text-color-secondary);margin-bottom:var(--space-lg);opacity:.5}.empty-title[data-v-a889bf55]{font-size:var(--text-xl);font-weight:var(--font-semibold);color:var(--text-color);margin:0 0 var(--space-sm) 0}.empty-description[data-v-a889bf55]{font-size:var(--text-base);color:var(--text-color-secondary);margin:0 0 var(--space-lg) 0;max-width:400px}.empty-action[data-v-a889bf55]{margin-top:var(--space-md)}.data-section[data-v-a889bf55]{display:flex;flex-direction:column;gap:var(--space-lg)}.table-wrapper[data-v-a889bf55]{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-md);overflow:hidden}.expandable-groups-table[data-v-a889bf55]{width:100%}.groups-table-header[data-v-a889bf55]{display:grid;grid-template-columns:40px 2fr 1fr 1fr 1fr 1fr 1fr 1fr;gap:var(--space-xs);padding:var(--space-md);background:var(--surface-hover);border-bottom:1px solid var(--surface-border);font-weight:var(--font-semibold);font-size:var(--text-sm);color:var(--text-color)}.header-cell[data-v-a889bf55]{padding:var(--space-xs) var(--space-sm)}.header-cell.expand-col[data-v-a889bf55]{padding:0}.header-cell.text-right[data-v-a889bf55]{text-align:right}.groups-table-body[data-v-a889bf55]{display:flex;flex-direction:column}.group-row[data-v-a889bf55]{display:grid;grid-template-columns:40px 2fr 1fr 1fr 1fr 1fr 1fr 1fr;gap:var(--space-xs);padding:var(--space-sm) var(--space-md);border-bottom:1px solid var(--surface-border);font-size:var(--text-sm);color:var(--text-color);transition:background var(--transition-fast)}.group-row[data-v-a889bf55]:last-child{border-bottom:none}.group-row.expandable[data-v-a889bf55]{cursor:pointer}.group-row.expandable[data-v-a889bf55]:hover{background:var(--surface-hover)}.group-row.expanded[data-v-a889bf55]{background:var(--primary-50);border-bottom-color:var(--primary-100)}.row-cell[data-v-a889bf55]{display:flex;align-items:center;padding:var(--space-xs) var(--space-sm);min-height:40px}.row-cell.expand-col[data-v-a889bf55]{justify-content:center;padding:0}.row-cell.name-col[data-v-a889bf55]{gap:var(--space-sm)}.row-cell.text-right[data-v-a889bf55]{justify-content:flex-end}.expand-icon[data-v-a889bf55]{font-size:var(--text-sm);color:var(--text-color-secondary);transition:transform var(--transition-normal)}.expand-icon.rotated[data-v-a889bf55]{transform:rotate(90deg)}.expanded-invoices[data-v-a889bf55]{background:var(--surface-ground);border-bottom:1px solid var(--surface-border);overflow:hidden}.invoice-row[data-v-a889bf55]{display:grid;grid-template-columns:40px 2fr 1fr 1fr 1fr 1fr 1fr 1fr;gap:var(--space-xs);padding:var(--space-xs) var(--space-md);font-size:var(--text-sm);color:var(--text-color);border-bottom:1px solid var(--surface-border)}.invoice-row[data-v-a889bf55]:last-child{border-bottom:none}.invoice-row[data-v-a889bf55]:hover{background:var(--surface-hover)}.sub-invoice-indicator[data-v-a889bf55]{position:relative;padding-left:var(--space-lg)!important}.invoice-connector[data-v-a889bf55]{position:absolute;left:var(--space-sm);top:50%;width:var(--space-md);height:1px;background:var(--surface-border)}.invoice-connector[data-v-a889bf55]:before{content:"";position:absolute;left:0;top:-8px;width:1px;height:16px;background:var(--surface-border)}.invoice-doc-label[data-v-a889bf55]{font-size:var(--text-xs);color:var(--text-color-secondary);font-style:italic}.expand-enter-active[data-v-a889bf55],.expand-leave-active[data-v-a889bf55]{transition:all var(--transition-normal);transform-origin:top}.expand-enter-from[data-v-a889bf55],.expand-leave-to[data-v-a889bf55]{opacity:0;max-height:0;transform:scaleY(0)}.expand-enter-to[data-v-a889bf55],.expand-leave-from[data-v-a889bf55]{opacity:1;max-height:1000px;transform:scaleY(1)}.empty-table-state[data-v-a889bf55]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-2xl);text-align:center;color:var(--text-color-secondary)}.empty-table-state .pi[data-v-a889bf55]{font-size:48px;margin-bottom:var(--space-md);opacity:.5}[data-theme=dark] .group-row.expanded[data-v-a889bf55]{background:var(--primary-900);border-bottom-color:var(--primary-800)}[data-theme=dark] .expanded-invoices[data-v-a889bf55]{background:var(--surface-100)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .group-row.expanded[data-v-a889bf55]{background:var(--primary-900);border-bottom-color:var(--primary-800)}:root:not([data-theme]) .expanded-invoices[data-v-a889bf55]{background:var(--surface-100)}}.font-mono[data-v-a889bf55]{font-family:var(--font-mono)}.font-bold[data-v-a889bf55]{font-weight:var(--font-bold)}.name-cell[data-v-a889bf55]{display:flex;align-items:center;gap:var(--space-sm)}.count-badge[data-v-a889bf55]{font-size:var(--text-xs);color:var(--text-color-secondary);font-weight:var(--font-normal)}.sold-restant[data-v-a889bf55]{color:var(--color-error)!important}.mobile-cards[data-v-a889bf55]{display:flex;flex-direction:column;gap:var(--space-md)}.invoice-card[data-v-a889bf55]{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-md);overflow:hidden}.invoice-card.has-multiple[data-v-a889bf55]{cursor:pointer}.card-header-row[data-v-a889bf55]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-md);background:var(--surface-hover);border-bottom:1px solid var(--surface-border)}.header-left[data-v-a889bf55],.header-right[data-v-a889bf55]{display:flex;align-items:center;gap:var(--space-sm)}.card-badge[data-v-a889bf55]{font-size:var(--text-xs);padding:2px var(--space-xs);background:var(--primary-100);color:var(--color-primary);border-radius:var(--radius-sm)}.card-body[data-v-a889bf55]{padding:var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm)}.card-field[data-v-a889bf55]{display:flex;justify-content:space-between;align-items:center}.card-field.highlight[data-v-a889bf55]{padding-top:var(--space-sm);border-top:1px solid var(--surface-border);margin-top:var(--space-xs)}.card-row-inline[data-v-a889bf55]{display:flex;gap:var(--space-md)}.card-row-inline .card-field[data-v-a889bf55]{flex:1;flex-direction:column;align-items:flex-start;gap:2px}.field-label[data-v-a889bf55]{font-size:var(--text-xs);color:var(--text-color-secondary)}.field-value[data-v-a889bf55]{font-size:var(--text-sm);color:var(--text-color);font-weight:var(--font-medium)}.sold-value[data-v-a889bf55]{font-family:var(--font-mono);font-weight:var(--font-bold);color:var(--text-color)}.card-status[data-v-a889bf55]{display:inline-flex;align-self:flex-start;font-size:var(--text-xs);padding:2px var(--space-sm);border-radius:var(--radius-full);font-weight:var(--font-medium)}.status-ok[data-v-a889bf55]{background:var(--green-100);color:var(--green-600)}.status-restant[data-v-a889bf55]{background:var(--red-100);color:var(--red-600)}.card-sub-items[data-v-a889bf55]{border-top:1px solid var(--surface-border);padding:var(--space-sm) var(--space-md) var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm)}.sub-item[data-v-a889bf55]{padding:var(--space-sm);background:var(--surface-hover);border-radius:var(--radius-sm)}.sub-item-header[data-v-a889bf55]{display:flex;justify-content:space-between;align-items:center;font-size:var(--text-sm);font-weight:var(--font-medium);margin-bottom:4px}.sub-item-sold[data-v-a889bf55]{font-family:var(--font-mono);font-weight:var(--font-bold)}.sub-item-dates[data-v-a889bf55]{display:flex;justify-content:space-between;font-size:var(--text-xs);color:var(--text-color-secondary)}.empty-data[data-v-a889bf55]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-2xl);text-align:center;color:var(--text-color-secondary)}.empty-data .pi[data-v-a889bf55]{font-size:48px;margin-bottom:var(--space-md);opacity:.5}.pagination-wrapper[data-v-a889bf55]{display:flex;justify-content:center}.totals-summary[data-v-a889bf55]{display:flex;gap:var(--space-lg);padding:var(--space-md);background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-md)}@media (max-width: 768px){.totals-summary[data-v-a889bf55]{flex-direction:column;gap:var(--space-sm)}}.total-item[data-v-a889bf55]{display:flex;align-items:center;gap:var(--space-sm)}.total-label[data-v-a889bf55]{font-size:var(--text-sm);color:var(--text-color-secondary)}.total-value[data-v-a889bf55]{font-size:var(--text-lg);font-weight:var(--font-bold);font-family:var(--font-mono);color:var(--color-primary)}.filter-sheet-content[data-v-a889bf55]{padding:var(--space-sm) 0}.filter-sheet-title[data-v-a889bf55]{font-size:var(--text-lg);font-weight:var(--font-semibold);color:var(--text-color);margin:0 0 var(--space-lg) 0}.filter-sheet-group[data-v-a889bf55]{margin-bottom:var(--space-md)}.filter-sheet-group .form-label[data-v-a889bf55]{display:block;margin-bottom:var(--space-xs)}.filter-sheet-actions[data-v-a889bf55]{display:flex;gap:var(--space-md);margin-top:var(--space-lg);padding-top:var(--space-md);border-top:1px solid var(--surface-border)}.flex-1[data-v-a889bf55]{flex:1}[data-theme=dark] .filter-chip[data-v-a889bf55]{background:var(--surface-100)}[data-theme=dark] .filter-chip.active[data-v-a889bf55],[data-theme=dark] .card-badge[data-v-a889bf55]{background:var(--primary-800)}[data-theme=dark] .status-ok[data-v-a889bf55]{background:var(--green-900);color:var(--green-300)}[data-theme=dark] .status-restant[data-v-a889bf55]{background:var(--red-900);color:var(--red-300)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .filter-chip[data-v-a889bf55]{background:var(--surface-100)}:root:not([data-theme]) .filter-chip.active[data-v-a889bf55]{background:var(--primary-800)}:root:not([data-theme]) .card-badge[data-v-a889bf55]{background:var(--primary-800)}:root:not([data-theme]) .status-ok[data-v-a889bf55]{background:var(--green-900);color:var(--green-300)}:root:not([data-theme]) .status-restant[data-v-a889bf55]{background:var(--red-900);color:var(--red-300)}} diff --git a/deploy-package-20260223-151231/frontend/assets/ErrorBoundary.BMn00aHR.js b/deploy-package-20260223-151231/frontend/assets/ErrorBoundary.BMn00aHR.js deleted file mode 100644 index 7d903e3..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ErrorBoundary.BMn00aHR.js +++ /dev/null @@ -1,2 +0,0 @@ -import{a as p,a0 as m,c as _,f as v,d as f,e as o,v as n,q as l,k as y,P as g}from"./vendor-core.B6UiYhU_.js";import{_ as h}from"./index.B8XI8FQW.js";const k={key:0,class:"module-error"},B={class:"error-message"},E={class:"error-actions"},b={__name:"ErrorBoundary",props:{moduleName:{type:String,required:!0}},setup(t){const c=t,i=g(),e=p(null);m((r,s,a)=>(e.value=r,console.error(`[${c.moduleName}] Error caught:`,r,a),!1));const u=()=>{e.value=null,window.location.reload()},d=()=>{e.value=null,i.push("/reports/dashboard")};return(r,s)=>{const a=y("Button");return e.value?(f(),_("div",k,[s[0]||(s[0]=o("div",{class:"error-icon"},[o("i",{class:"pi pi-exclamation-triangle",style:{"font-size":"4rem",color:"var(--color-danger)"}})],-1)),o("h3",null,n(t.moduleName)+" a întâmpinat o eroare",1),o("p",B,n(e.value.message),1),o("div",E,[l(a,{label:"Reîncearcă",icon:"pi pi-refresh",onClick:u}),l(a,{label:"Mergi la Dashboard",icon:"pi pi-home",severity:"secondary",onClick:d})])])):v(r.$slots,"default",{key:1},void 0,!0)}}},x=h(b,[["__scopeId","data-v-82fa5b65"]]);export{x as E}; -//# sourceMappingURL=ErrorBoundary.BMn00aHR.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/ErrorBoundary.BMn00aHR.js.map b/deploy-package-20260223-151231/frontend/assets/ErrorBoundary.BMn00aHR.js.map deleted file mode 100644 index 879771b..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ErrorBoundary.BMn00aHR.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ErrorBoundary.BMn00aHR.js","sources":["../../src/shared/components/ErrorBoundary.vue"],"sourcesContent":["\n\n\n\n\n"],"names":["props","__props","router","useRouter","error","ref","onErrorCaptured","err","instance","info","retry","goHome","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_toDisplayString","_hoisted_2","_hoisted_3","_createVNode","_component_Button","_renderSlot","_ctx"],"mappings":"+TAmBA,MAAMA,EAAQC,EAIRC,EAASC,EAAS,EAClBC,EAAQC,EAAI,IAAI,EAEtBC,EAAgB,CAACC,EAAKC,EAAUC,KAC9BL,EAAM,MAAQG,EACd,QAAQ,MAAM,IAAIP,EAAM,UAAU,kBAAmBO,EAAKE,CAAI,EACvD,GACR,EAED,MAAMC,EAAQ,IAAM,CAClBN,EAAM,MAAQ,KACd,OAAO,SAAS,OAAM,CACxB,EAEMO,EAAS,IAAM,CACnBP,EAAM,MAAQ,KACdF,EAAO,KAAK,oBAAoB,CAClC,2CAvCaE,EAAA,OAAXQ,IAAAC,EAUM,MAVNC,EAUM,aATJC,EAEM,MAAA,CAFD,MAAM,cAAY,CACrBA,EAA+F,IAAA,CAA5F,MAAM,6BAA6B,MAAA,CAAA,YAAA,OAAA,MAAA,qBAAA,UAExCA,EAA+C,KAAA,KAAAC,EAAxCf,EAAA,UAAU,EAAG,yBAAsB,CAAA,EAC1Cc,EAAgD,IAAhDE,EAAgDD,EAApBZ,EAAA,MAAM,OAAO,EAAA,CAAA,EACzCW,EAGM,MAHNG,EAGM,CAFJC,EAAiEC,EAAA,CAAzD,MAAM,aAAa,KAAK,gBAAiB,QAAOV,IACxDS,EAA4FC,EAAA,CAApF,MAAM,qBAAqB,KAAK,aAAa,SAAS,YAAa,QAAOT,SAGtFU,EAAeC,EAAA,OAAA,UAAA,CAAA,IAAA,CAAA,EAAA,OAAA,EAAA"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/ErrorBoundary.bmvwr0es.css b/deploy-package-20260223-151231/frontend/assets/ErrorBoundary.bmvwr0es.css deleted file mode 100644 index e932d83..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ErrorBoundary.bmvwr0es.css +++ /dev/null @@ -1 +0,0 @@ -.module-error[data-v-82fa5b65]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:60vh;padding:2rem;text-align:center}.error-icon[data-v-82fa5b65]{margin-bottom:1.5rem}.module-error h3[data-v-82fa5b65]{font-size:1.5rem;margin-bottom:.5rem;color:var(--color-text-primary, #2c3e50)}.error-message[data-v-82fa5b65]{color:var(--color-text-secondary, #6c757d);margin-bottom:2rem;max-width:500px}.error-actions[data-v-82fa5b65]{display:flex;gap:1rem;flex-wrap:wrap;justify-content:center} diff --git a/deploy-package-20260223-151231/frontend/assets/InvoicesView.DR_Q0OHE.css b/deploy-package-20260223-151231/frontend/assets/InvoicesView.DR_Q0OHE.css deleted file mode 100644 index 6c585de..0000000 --- a/deploy-package-20260223-151231/frontend/assets/InvoicesView.DR_Q0OHE.css +++ /dev/null @@ -1 +0,0 @@ -.invoices[data-v-4b2b170d]{max-width:1400px;margin:0 auto;padding:var(--space-xl)}.mobile-layout .invoices[data-v-4b2b170d]{padding-top:calc(56px + 48px + var(--space-md));padding-bottom:calc(56px + var(--space-md));padding-left:var(--space-md);padding-right:var(--space-md)}.mobile-tabs-container[data-v-4b2b170d]{position:fixed;top:56px;left:0;right:0;z-index:var(--z-sticky);background:var(--surface-card);border-bottom:1px solid var(--surface-border)}.mobile-tabs[data-v-4b2b170d]{display:flex;width:100%}.mobile-tab[data-v-4b2b170d]{flex:1;display:flex;align-items:center;justify-content:center;padding:var(--space-md);min-height:48px;background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--transition-fast);color:var(--text-color-secondary);font-size:var(--text-sm);font-weight:var(--font-medium)}.mobile-tab[data-v-4b2b170d]:active{background:var(--surface-hover)}.mobile-tab.active[data-v-4b2b170d]{color:var(--color-primary);border-bottom-color:var(--color-primary);font-weight:var(--font-semibold)}.tab-label[data-v-4b2b170d]{text-transform:uppercase;letter-spacing:.5px}.page-header[data-v-4b2b170d]{margin-bottom:var(--space-md)}.page-title[data-v-4b2b170d]{font-size:var(--text-4xl);font-weight:var(--font-bold);color:var(--text-color);margin:0;display:flex;align-items:center;gap:var(--space-sm)}.company-selection-card[data-v-4b2b170d],.filters-card[data-v-4b2b170d]{margin-bottom:var(--space-md)}.search-col[data-v-4b2b170d]{grid-column:span 2}.filters-actions[data-v-4b2b170d]{display:flex;gap:var(--space-md);justify-content:flex-end;padding-top:var(--space-md);border-top:1px solid var(--surface-border)}.table-card[data-v-4b2b170d]{margin-bottom:var(--space-md)}.no-data[data-v-4b2b170d],.loading-table[data-v-4b2b170d]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-3xl);color:var(--text-color-secondary)}.no-data i[data-v-4b2b170d],.loading-table i[data-v-4b2b170d]{font-size:var(--text-3xl);margin-bottom:var(--space-sm)}.text-right[data-v-4b2b170d]{text-align:right;width:100%;display:block}.text-center[data-v-4b2b170d]{text-align:center;width:100%;display:block}.mobile-totals-bar[data-v-4b2b170d]{background:var(--surface-card);border-bottom:1px solid var(--surface-border);padding:var(--space-sm) var(--space-md);margin-bottom:var(--space-md);border-radius:var(--radius-md)}.mobile-totals-content[data-v-4b2b170d]{display:flex;justify-content:space-between;align-items:center}.mobile-totals-bar .total-label[data-v-4b2b170d]{font-size:var(--text-sm);color:var(--text-color-secondary);font-weight:var(--font-medium)}.mobile-totals-bar .total-value[data-v-4b2b170d]{font-size:var(--text-lg);font-weight:var(--font-bold)}.mobile-totals-bar .total-value.positive[data-v-4b2b170d]{color:var(--green-600)}.mobile-totals-bar .total-value.negative[data-v-4b2b170d]{color:var(--red-600)}.mobile-card-list[data-v-4b2b170d]{display:flex;flex-direction:column;gap:var(--space-sm)}.mobile-data-card[data-v-4b2b170d]{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-md);padding:var(--space-md)}.mobile-data-card .card-header[data-v-4b2b170d]{font-weight:var(--font-semibold);color:var(--text-color);margin-bottom:var(--space-xs);font-size:var(--text-base)}.mobile-data-card .card-row[data-v-4b2b170d]{display:flex;justify-content:space-between;align-items:center;font-size:var(--text-sm);color:var(--text-color-secondary)}.mobile-data-card .card-amount[data-v-4b2b170d]{font-weight:var(--font-semibold);color:var(--text-color)}.mobile-data-card .card-amount.positive[data-v-4b2b170d]{color:var(--green-600)}.mobile-empty[data-v-4b2b170d]{text-align:center;padding:var(--space-xl);color:var(--text-color-secondary)}.mobile-empty i[data-v-4b2b170d]{font-size:var(--text-3xl);margin-bottom:var(--space-sm);display:block}.bottom-sheet-title[data-v-4b2b170d]{font-size:var(--text-lg);font-weight:var(--font-semibold);color:var(--text-color);margin:0 0 var(--space-md) 0}.bottom-sheet-filters[data-v-4b2b170d]{display:flex;flex-direction:column;gap:var(--space-md)}.bottom-sheet-actions[data-v-4b2b170d]{display:flex;gap:var(--space-sm);justify-content:flex-end;margin-top:var(--space-md);padding-top:var(--space-md);border-top:1px solid var(--surface-border)}.sidebar-header[data-v-4b2b170d]{padding:var(--space-md)}.sidebar-title[data-v-4b2b170d]{font-size:var(--text-xl);font-weight:var(--font-bold);color:var(--text-color)}.sidebar-menu[data-v-4b2b170d]{display:flex;flex-direction:column;padding:var(--space-sm)}.sidebar-item[data-v-4b2b170d]{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-md);color:var(--text-color);text-decoration:none;border-radius:var(--radius-md);font-weight:var(--font-medium);transition:background var(--transition-fast)}.sidebar-item[data-v-4b2b170d]:hover{background:var(--surface-hover)}.sidebar-item.active[data-v-4b2b170d]{background:var(--blue-50);color:var(--color-primary)}.sidebar-item i[data-v-4b2b170d]{font-size:var(--text-xl);width:24px;text-align:center}.summary-stats-inline[data-v-4b2b170d]{display:flex;justify-content:flex-end;margin-bottom:var(--space-md)}.stat-item[data-v-4b2b170d]{display:flex;align-items:center;gap:var(--space-sm)}.stat-label[data-v-4b2b170d]{font-size:var(--text-sm);color:var(--text-color-secondary)}.stat-value[data-v-4b2b170d]{font-size:var(--text-lg);font-weight:var(--font-bold)}.stat-value.plati[data-v-4b2b170d]{color:var(--red-600)}.stat-value.incasari[data-v-4b2b170d]{color:var(--green-600)}[data-theme=dark] .mobile-totals-bar .total-value.positive[data-v-4b2b170d]{color:var(--green-400)}[data-theme=dark] .mobile-totals-bar .total-value.negative[data-v-4b2b170d]{color:var(--red-400)}[data-theme=dark] .mobile-data-card .card-amount.positive[data-v-4b2b170d]{color:var(--green-400)}[data-theme=dark] .sidebar-item.active[data-v-4b2b170d]{background:var(--blue-900);color:var(--blue-400)}[data-theme=dark] .stat-value.plati[data-v-4b2b170d]{color:var(--red-400)}[data-theme=dark] .stat-value.incasari[data-v-4b2b170d]{color:var(--green-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .mobile-totals-bar .total-value.positive[data-v-4b2b170d]{color:var(--green-400)}:root:not([data-theme]) .mobile-totals-bar .total-value.negative[data-v-4b2b170d]{color:var(--red-400)}:root:not([data-theme]) .mobile-data-card .card-amount.positive[data-v-4b2b170d]{color:var(--green-400)}:root:not([data-theme]) .sidebar-item.active[data-v-4b2b170d]{background:var(--blue-900);color:var(--blue-400)}}@media (max-width: 768px){.invoices[data-v-4b2b170d]{padding:var(--space-md)}.page-title[data-v-4b2b170d]{font-size:var(--text-3xl)}.search-col[data-v-4b2b170d]{grid-column:span 1}.filters-actions[data-v-4b2b170d]{flex-direction:column}} diff --git a/deploy-package-20260223-151231/frontend/assets/InvoicesView.DcmNSM09.js b/deploy-package-20260223-151231/frontend/assets/InvoicesView.DcmNSM09.js deleted file mode 100644 index 276f8ce..0000000 --- a/deploy-package-20260223-151231/frontend/assets/InvoicesView.DcmNSM09.js +++ /dev/null @@ -1,3 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/sharedStores.Bb_IRn4Y.js","assets/index.B8XI8FQW.js","assets/vendor-core.B6UiYhU_.js","assets/vendor-primevue.BN-meDW0.js","assets/vendor-utils.CO3CyGpV.js","assets/vendor-export.BWjBvx7Z.js","assets/index.Co2Dp57K.css"])))=>i.map(i=>d[i]); -import{_ as he}from"./vendor-export.BWjBvx7Z.js";import{_ as be,u as ge}from"./index.B8XI8FQW.js";import{u as we,d as Ce,b as _e,c as Pe}from"./sharedStores.Bb_IRn4Y.js";import{e as xe,a as Fe}from"./exportUtils.BtGzMnqV.js";import{M as De}from"./MobileTopBar.BnL78WPy.js";import{M as ze}from"./MobileBottomNav.Cp8OR33w.js";import{B as Se}from"./BottomSheet.WKuCIyuZ.js";import{M as Ie}from"./MobileDrawerMenu.DJ_STPbv.js";import{a as D,M as Te,j as H,o as Ve,K as Ne,w as ie,c as _,h as M,i as h,q as r,e as t,u as k,O as n,p,y as E,k as I,v as f,P as Me,d as v,F as ke,B as Ee}from"./vendor-core.B6UiYhU_.js";import{c as Z,d as A,e as W,f as Le,g as Re}from"./vendor-utils.CO3CyGpV.js";import"./vendor-primevue.BN-meDW0.js";var Ae={lessThanXSeconds:{one:"mai puțin de o secundă",other:"mai puțin de {{count}} secunde"},xSeconds:{one:"1 secundă",other:"{{count}} secunde"},halfAMinute:"jumătate de minut",lessThanXMinutes:{one:"mai puțin de un minut",other:"mai puțin de {{count}} minute"},xMinutes:{one:"1 minut",other:"{{count}} minute"},aboutXHours:{one:"circa 1 oră",other:"circa {{count}} ore"},xHours:{one:"1 oră",other:"{{count}} ore"},xDays:{one:"1 zi",other:"{{count}} zile"},aboutXWeeks:{one:"circa o săptămână",other:"circa {{count}} săptămâni"},xWeeks:{one:"1 săptămână",other:"{{count}} săptămâni"},aboutXMonths:{one:"circa 1 lună",other:"circa {{count}} luni"},xMonths:{one:"1 lună",other:"{{count}} luni"},aboutXYears:{one:"circa 1 an",other:"circa {{count}} ani"},xYears:{one:"1 an",other:"{{count}} ani"},overXYears:{one:"peste 1 an",other:"peste {{count}} ani"},almostXYears:{one:"aproape 1 an",other:"aproape {{count}} ani"}},We=function(s,z,g){var b,l=Ae[s];return typeof l=="string"?b=l:z===1?b=l.one:b=l.other.replace("{{count}}",String(z)),g!=null&&g.addSuffix?g.comparison&&g.comparison>0?"în "+b:b+" în urmă":b},Oe={full:"EEEE, d MMMM yyyy",long:"d MMMM yyyy",medium:"d MMM yyyy",short:"dd.MM.yyyy"},$e={full:"HH:mm:ss zzzz",long:"HH:mm:ss z",medium:"HH:mm:ss",short:"HH:mm"},Ue={full:"{{date}} 'la' {{time}}",long:"{{date}} 'la' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},Be={date:Z({formats:Oe,defaultWidth:"full"}),time:Z({formats:$e,defaultWidth:"full"}),dateTime:Z({formats:Ue,defaultWidth:"full"})},je={lastWeek:"eeee 'trecută la' p",yesterday:"'ieri la' p",today:"'astăzi la' p",tomorrow:"'mâine la' p",nextWeek:"eeee 'viitoare la' p",other:"P"},He=function(s,z,g,b){return je[s]},qe={narrow:["Î","D"],abbreviated:["Î.d.C.","D.C."],wide:["Înainte de Cristos","După Cristos"]},Xe={narrow:["1","2","3","4"],abbreviated:["T1","T2","T3","T4"],wide:["primul trimestru","al doilea trimestru","al treilea trimestru","al patrulea trimestru"]},Ye={narrow:["I","F","M","A","M","I","I","A","S","O","N","D"],abbreviated:["ian","feb","mar","apr","mai","iun","iul","aug","sep","oct","noi","dec"],wide:["ianuarie","februarie","martie","aprilie","mai","iunie","iulie","august","septembrie","octombrie","noiembrie","decembrie"]},Ze={narrow:["d","l","m","m","j","v","s"],short:["du","lu","ma","mi","jo","vi","sâ"],abbreviated:["dum","lun","mar","mie","joi","vin","sâm"],wide:["duminică","luni","marți","miercuri","joi","vineri","sâmbătă"]},Qe={narrow:{am:"a",pm:"p",midnight:"mn",noon:"ami",morning:"dim",afternoon:"da",evening:"s",night:"n"},abbreviated:{am:"AM",pm:"PM",midnight:"miezul nopții",noon:"amiază",morning:"dimineață",afternoon:"după-amiază",evening:"seară",night:"noapte"},wide:{am:"a.m.",pm:"p.m.",midnight:"miezul nopții",noon:"amiază",morning:"dimineață",afternoon:"după-amiază",evening:"seară",night:"noapte"}},Ke={narrow:{am:"a",pm:"p",midnight:"mn",noon:"amiază",morning:"dimineață",afternoon:"după-amiază",evening:"seară",night:"noapte"},abbreviated:{am:"AM",pm:"PM",midnight:"miezul nopții",noon:"amiază",morning:"dimineață",afternoon:"după-amiază",evening:"seară",night:"noapte"},wide:{am:"a.m.",pm:"p.m.",midnight:"miezul nopții",noon:"amiază",morning:"dimineață",afternoon:"după-amiază",evening:"seară",night:"noapte"}},Ge=function(s,z){return String(s)},Je={ordinalNumber:Ge,era:A({values:qe,defaultWidth:"wide"}),quarter:A({values:Xe,defaultWidth:"wide",argumentCallback:function(s){return s-1}}),month:A({values:Ye,defaultWidth:"wide"}),day:A({values:Ze,defaultWidth:"wide"}),dayPeriod:A({values:Qe,defaultWidth:"wide",formattingValues:Ke,defaultFormattingWidth:"wide"})},ea=/^(\d+)?/i,aa=/\d+/i,ta={narrow:/^(Î|D)/i,abbreviated:/^(Î\.?\s?d\.?\s?C\.?|Î\.?\s?e\.?\s?n\.?|D\.?\s?C\.?|e\.?\s?n\.?)/i,wide:/^(Înainte de Cristos|Înaintea erei noastre|După Cristos|Era noastră)/i},ia={any:[/^ÎC/i,/^DC/i],wide:[/^(Înainte de Cristos|Înaintea erei noastre)/i,/^(După Cristos|Era noastră)/i]},oa={narrow:/^[1234]/i,abbreviated:/^T[1234]/i,wide:/^trimestrul [1234]/i},na={any:[/1/i,/2/i,/3/i,/4/i]},la={narrow:/^[ifmaasond]/i,abbreviated:/^(ian|feb|mar|apr|mai|iun|iul|aug|sep|oct|noi|dec)/i,wide:/^(ianuarie|februarie|martie|aprilie|mai|iunie|iulie|august|septembrie|octombrie|noiembrie|decembrie)/i},ra={narrow:[/^i/i,/^f/i,/^m/i,/^a/i,/^m/i,/^i/i,/^i/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ia/i,/^f/i,/^mar/i,/^ap/i,/^mai/i,/^iun/i,/^iul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},sa={narrow:/^[dlmjvs]/i,short:/^(d|l|ma|mi|j|v|s)/i,abbreviated:/^(dum|lun|mar|mie|jo|vi|sâ)/i,wide:/^(duminica|luni|marţi|miercuri|joi|vineri|sâmbătă)/i},ua={narrow:[/^d/i,/^l/i,/^m/i,/^m/i,/^j/i,/^v/i,/^s/i],any:[/^d/i,/^l/i,/^ma/i,/^mi/i,/^j/i,/^v/i,/^s/i]},da={narrow:/^(a|p|mn|a|(dimineaţa|după-amiaza|seara|noaptea))/i,any:/^([ap]\.?\s?m\.?|miezul nopții|amiaza|(dimineaţa|după-amiaza|seara|noaptea))/i},ca={any:{am:/^a/i,pm:/^p/i,midnight:/^mn/i,noon:/amiaza/i,morning:/dimineaţa/i,afternoon:/după-amiaza/i,evening:/seara/i,night:/noaptea/i}},ma={ordinalNumber:Le({matchPattern:ea,parsePattern:aa,valueCallback:function(s){return parseInt(s,10)}}),era:W({matchPatterns:ta,defaultMatchWidth:"wide",parsePatterns:ia,defaultParseWidth:"any"}),quarter:W({matchPatterns:oa,defaultMatchWidth:"wide",parsePatterns:na,defaultParseWidth:"any",valueCallback:function(s){return s+1}}),month:W({matchPatterns:la,defaultMatchWidth:"wide",parsePatterns:ra,defaultParseWidth:"any"}),day:W({matchPatterns:sa,defaultMatchWidth:"wide",parsePatterns:ua,defaultParseWidth:"any"}),dayPeriod:W({matchPatterns:da,defaultMatchWidth:"any",parsePatterns:ca,defaultParseWidth:"any"})},pa={code:"ro",formatDistance:We,formatLong:Be,formatRelative:He,localize:Je,match:ma,options:{weekStartsOn:1,firstWeekContainsDate:1}};const va={key:1,class:"mobile-tabs-container"},fa={class:"mobile-tabs"},ya={class:"bottom-sheet-filters"},ha={class:"form-group"},ba={class:"form-group"},ga={class:"form-group"},wa={class:"form-group"},Ca={class:"bottom-sheet-actions"},_a={class:"invoices"},Pa={key:0,class:"page-header"},xa={class:"company-selection"},Fa={key:2,class:"mobile-totals-bar"},Da={class:"mobile-totals-content"},za={class:"form"},Sa={class:"form-row"},Ia={class:"form-col"},Ta={class:"form-group"},Va={class:"form-col"},Na={class:"form-group"},Ma={class:"form-col"},ka={class:"form-group"},Ea={class:"form-col"},La={class:"form-group"},Ra={key:0,class:"filters-actions"},Aa={key:4,class:"summary-stats-inline"},Wa={class:"stat-item"},Oa={key:0,class:"mobile-card-list"},$a={class:"card-header"},Ua={class:"card-row"},Ba={key:0,class:"mobile-empty"},ja={class:"loading-table"},Ha={class:"text-right"},qa={class:"text-right"},Xa={class:"text-right"},Ya={class:"text-center"},Za={__name:"InvoicesView",setup(T){var te;const s=ge(),z=Me(),g=Te(),b=D(g.query.tab==="suppliers"?"suppliers":"clients"),l=we(),c=Ce(),P=_e(),L=Pe(),R=D(((te=l.selectedCompany)==null?void 0:te.id_firma)||null),y=D(window.innerWidth<768),S=D(!1),q=D(!1);D(null);const oe=async()=>{await L.logout(),z.push("/login")},ne=async a=>{var e;await l.loadCompanies(),(e=l.selectedCompany)!=null&&e.id_firma&&await P.loadPeriods(l.selectedCompany.id_firma)},le=H(()=>[{icon:"pi pi-filter",label:"Filtre",tooltip:"Filtre",active:ue.value},{icon:"pi pi-filter-slash",label:"Resetează",tooltip:"Resetează Filtrele"},{icon:"pi pi-refresh",label:"Actualizează",tooltip:"Actualizează"},{icon:"pi pi-download",label:"Export",tooltip:"Export Excel"}]),re=a=>{a.icon==="pi pi-filter"?S.value=!S.value:a.icon==="pi pi-filter-slash"?B():a.icon==="pi pi-refresh"?X():a.icon==="pi pi-download"&&Y()},Q=async a=>{a!==b.value&&(b.value=a,z.replace({query:{...g.query,tab:a==="suppliers"?"suppliers":void 0}}),o.value.type=a==="suppliers"?"FURNIZORI":"CLIENTI",w.value.page=1,await C())},K=()=>{y.value=window.innerWidth<768,y.value||(S.value=!1)},o=D({type:g.query.tab==="suppliers"?"FURNIZORI":"CLIENTI",paymentStatus:"neachitate",searchTerm:"",cont:""}),w=D({page:1,rows:100}),se=H(()=>{var a;return((a=P.selectedPeriod)==null?void 0:a.display_name)||""}),ue=H(()=>o.value.type!=="CLIENTI"||o.value.paymentStatus!=="neachitate"||o.value.searchTerm!==""||o.value.cont!=="");H(()=>[{label:"Resetează Filtre",icon:"pi pi-filter-slash",command:B},{label:"Export Excel",icon:"pi pi-file-excel",command:Y,disabled:!c.hasInvoices},{label:"Export PDF",icon:"pi pi-file-pdf",command:ae,disabled:!c.hasInvoices},{separator:!0},{label:"Actualizează",icon:"pi pi-refresh",command:X}]);const G=[{label:"Clienți",value:"CLIENTI"},{label:"Furnizori",value:"FURNIZORI"}],J=[{label:"Neachitate",value:"neachitate"},{label:"Toate",value:"toate"}],de=a=>a?new Intl.NumberFormat("ro-RO",{style:"currency",currency:"RON"}).format(a):"0,00 RON",O=a=>!a||a===0?"0,00":new Intl.NumberFormat("ro-RO",{minimumFractionDigits:2,maximumFractionDigits:2}).format(a),ce=a=>!a||a===0?"0":Math.abs(a)>=1e6?new Intl.NumberFormat("ro-RO",{maximumFractionDigits:1}).format(a/1e6)+"M":new Intl.NumberFormat("ro-RO",{maximumFractionDigits:0}).format(a),x=a=>{if(!a)return"";try{return Re(new Date(a),"dd/MM/yyyy",{locale:pa})}catch{return a}},me=async()=>{if(!R.value)return;const a=l.getCompanyById(R.value);a&&(l.setSelectedCompany(a),await C())},pe=a=>{a&&(R.value=a.id_firma)},ve=()=>{},$=async()=>{w.value.page=1,await C()},U=(()=>{let a;return()=>{clearTimeout(a),a=setTimeout(async()=>{w.value.page=1,await C()},500)}})(),B=async()=>{o.value={type:"CLIENTI",paymentStatus:"neachitate",searchTerm:"",cont:""},w.value.page=1,await C()},X=async()=>{await C(),s.add({severity:"success",summary:"Actualizare reușită",detail:"Facturile au fost actualizate cu succes",life:3e3})},C=async()=>{if(l.selectedCompany&&P.selectedPeriod)try{c.setFilters(o.value),c.setPagination(w.value);const{luna:a,an:e}=P.selectedPeriod,m={partner_type:o.value.type,page:w.value.page,page_size:w.value.rows,only_unpaid:o.value.paymentStatus==="neachitate",luna:a,an:e};o.value.searchTerm&&(m.partner_name=o.value.searchTerm),o.value.cont&&(m.cont=o.value.cont),await c.loadInvoices(l.selectedCompany.id_firma,m)}catch(a){console.error("Failed to load invoices:",a),s.add({severity:"error",summary:"Eroare",detail:"Nu s-au putut încărca facturile",life:5e3})}},fe=async a=>{w.value.page=a.page+1,w.value.rows=a.rows,await C()},ye=async a=>{await C()},ee=async()=>{if(!l.selectedCompany)return[];if(!P.selectedPeriod)return[];try{const{luna:a,an:e}=P.selectedPeriod,m={company:l.selectedCompany.id_firma,partner_type:o.value.type,page:1,page_size:999999,only_unpaid:o.value.paymentStatus==="neachitate",luna:a,an:e};return o.value.searchTerm&&(m.partner_name=o.value.searchTerm),o.value.cont&&(m.cont=o.value.cont),(await(await he(async()=>{const{default:V}=await import("./sharedStores.Bb_IRn4Y.js").then(N=>N.i);return{default:V}},__vite__mapDeps([0,1,2,3,4,5,6]))).default.get("/invoices/",{params:m})).data.invoices||[]}catch(a){return console.error("Failed to fetch all invoices data:",a),[]}},Y=async()=>{if(!c.hasInvoices){s.add({severity:"warn",summary:"Nu există date",detail:"Nu există facturi de exportat",life:3e3});return}s.add({severity:"info",summary:"Se pregătește exportul",detail:"Se încarcă toate datele...",life:2e3});const a=await ee();if(a.length===0){s.add({severity:"error",summary:"Eroare",detail:"Nu s-au putut prelua datele pentru export",life:3e3});return}const e=a.map(d=>({Cont:d.cont||"","Numar Doc.":d.nract,"Data Doc.":d.dataact?x(d.dataact):"","Data Scadenta":d.datascad?x(d.datascad):"",Partener:d.nume,Facturat:parseFloat(d.totctva)||0,Achitat:parseFloat(d.achitat)||0,Sold:parseFloat(d.soldfinal)||0,Valuta:d.valuta||"RON"})),m=o.value.type==="CLIENTI"?"Clienti":"Furnizori";xe(e,`facturi_${m}_${l.selectedCompany.name.replace(/\s+/g,"_")}`,`Facturi ${m}`).success?s.add({severity:"success",summary:"Export reușit",detail:`${a.length} facturi exportate cu succes`,life:3e3}):s.add({severity:"error",summary:"Eroare la export",detail:"Nu s-a putut genera fișierul Excel",life:3e3})},ae=async()=>{var N;if(!c.hasInvoices){s.add({severity:"warn",summary:"Nu există date",detail:"Nu există facturi de exportat",life:3e3});return}s.add({severity:"info",summary:"Se pregătește exportul",detail:"Se încarcă toate datele...",life:2e3});const a=await ee();if(a.length===0){s.add({severity:"error",summary:"Eroare",detail:"Nu s-au putut prelua datele pentru export",life:3e3});return}const e=a.map(u=>({cont:u.cont||"",nract:u.nract,dataact:u.dataact?x(u.dataact):"",datascad:u.datascad?x(u.datascad):"",nume:u.nume,totctva:u.totctva,achitat:u.achitat,soldfinal:u.soldfinal,valuta:u.valuta||"RON"})),m=[{field:"cont",header:"Cont",type:"text",width:.06},{field:"nract",header:"Numar Doc.",type:"text",width:.08},{field:"dataact",header:"Data Doc.",type:"text",width:.08},{field:"datascad",header:"Data Scadenta",type:"text",width:.09},{field:"nume",header:"Partener",type:"text",width:.37},{field:"totctva",header:"Facturat",type:"number",width:.09},{field:"achitat",header:"Achitat",type:"number",width:.09},{field:"soldfinal",header:"Sold",type:"number",width:.09},{field:"valuta",header:"Valuta",type:"text",width:.05}],F=o.value.type==="CLIENTI"?"Clienti":"Furnizori";let d=se.value||"";if(o.value.dateFrom||o.value.dateTo){const u=o.value.dateFrom?x(o.value.dateFrom):"început",j=o.value.dateTo?x(o.value.dateTo):"prezent";d+=d?` | Filtru dată: ${u} - ${j}`:`Filtru dată: ${u} - ${j}`}Fe(e,m,`facturi-${F.toLowerCase()}-${l.selectedCompany.name.replace(/\s+/g,"-")}`,{companyName:((N=l.selectedCompany)==null?void 0:N.name)||"",title:`Facturi ${F}`,period:d}).success?s.add({severity:"success",summary:"Export reușit",detail:`${a.length} facturi exportate cu succes`,life:3e3}):s.add({severity:"error",summary:"Eroare la export",detail:"Nu s-a putut genera fișierul PDF",life:3e3})};return Ve(async()=>{window.addEventListener("resize",K),l.hasCompanies||await l.loadCompanies()}),Ne(()=>{window.removeEventListener("resize",K)}),ie(()=>l.selectedCompany,async a=>{a&&P.selectedPeriod&&await C()}),ie(()=>P.selectedPeriod,async a=>{a&&l.selectedCompany&&await C()},{immediate:!0}),(a,e)=>{const m=I("Dropdown"),F=I("InputText"),d=I("Button"),V=I("Card"),N=I("ProgressSpinner"),u=I("Column"),j=I("DataTable");return v(),_("div",{class:k(["app-container",{"mobile-layout":y.value}])},[y.value?(v(),M(De,{key:0,title:"Facturi","show-menu":!0,actions:le.value,onMenuClick:e[0]||(e[0]=i=>q.value=!0),onActionClick:re},null,8,["actions"])):h("",!0),y.value?(v(),_("div",va,[t("div",fa,[t("button",{class:k(["mobile-tab",{active:b.value==="clients"}]),onClick:e[1]||(e[1]=i=>Q("clients"))},[...e[16]||(e[16]=[t("span",{class:"tab-label"},"Clienți",-1)])],2),t("button",{class:k(["mobile-tab",{active:b.value==="suppliers"}]),onClick:e[2]||(e[2]=i=>Q("suppliers"))},[...e[17]||(e[17]=[t("span",{class:"tab-label"},"Furnizori",-1)])],2)])])):h("",!0),r(Ie,{modelValue:q.value,"onUpdate:modelValue":e[3]||(e[3]=i=>q.value=i),user:n(L).user,"companies-store":n(l),"period-store":n(P),"available-servers":n(L).availableServers,"current-server-id":n(L).selectedServerId,onLogout:oe,onCompanyChanged:pe,onPeriodChanged:ve,"auth-store":n(L),onServerSwitched:ne},null,8,["modelValue","user","companies-store","period-store","available-servers","current-server-id","auth-store"]),r(Se,{modelValue:S.value,"onUpdate:modelValue":e[10]||(e[10]=i=>S.value=i)},{default:p(()=>[e[22]||(e[22]=t("h3",{class:"bottom-sheet-title"},"Filtre",-1)),t("div",ya,[t("div",ha,[e[18]||(e[18]=t("label",{class:"form-label"},"Tip Factură",-1)),r(m,{modelValue:o.value.type,"onUpdate:modelValue":e[4]||(e[4]=i=>o.value.type=i),options:G,"option-label":"label","option-value":"value",placeholder:"Tip factură",class:"w-full",onChange:$},null,8,["modelValue"])]),t("div",ba,[e[19]||(e[19]=t("label",{class:"form-label"},"Status Plată",-1)),r(m,{modelValue:o.value.paymentStatus,"onUpdate:modelValue":e[5]||(e[5]=i=>o.value.paymentStatus=i),options:J,"option-label":"label","option-value":"value",placeholder:"Status plată",class:"w-full",onChange:$},null,8,["modelValue"])]),t("div",ga,[e[20]||(e[20]=t("label",{class:"form-label"},"Căutare",-1)),r(F,{modelValue:o.value.searchTerm,"onUpdate:modelValue":e[6]||(e[6]=i=>o.value.searchTerm=i),placeholder:"Căutați după număr, partener...",class:"w-full",onInput:n(U)},null,8,["modelValue","onInput"])]),t("div",wa,[e[21]||(e[21]=t("label",{class:"form-label"},"Cont",-1)),r(F,{modelValue:o.value.cont,"onUpdate:modelValue":e[7]||(e[7]=i=>o.value.cont=i),placeholder:"Filtru cont (ex: 4111)",class:"w-full",onInput:n(U)},null,8,["modelValue","onInput"])]),t("div",Ca,[r(d,{icon:"pi pi-filter-slash",label:"Resetează",class:"p-button-outlined p-button-secondary",onClick:e[8]||(e[8]=i=>{B(),S.value=!1})}),r(d,{icon:"pi pi-check",label:"Aplică",onClick:e[9]||(e[9]=i=>S.value=!1)})])])]),_:1},8,["modelValue"]),t("div",_a,[y.value?h("",!0):(v(),_("div",Pa,[...e[23]||(e[23]=[t("h1",{class:"page-title"},[t("i",{class:"pi pi-file-text"}),E(" Facturi ")],-1)])])),n(l).selectedCompany?h("",!0):(v(),M(V,{key:1,class:"company-selection-card"},{content:p(()=>[t("div",xa,[e[24]||(e[24]=t("p",{class:"text-color-secondary mb-3"}," Selectați o companie pentru a vizualiza facturile: ",-1)),r(m,{modelValue:R.value,"onUpdate:modelValue":e[11]||(e[11]=i=>R.value=i),options:n(l).companyListFormatted,"option-label":"displayName","option-value":"id_firma",placeholder:"Alegeți compania",class:"w-full",onChange:me},null,8,["modelValue","options"])])]),_:1})),y.value&&n(l).selectedCompany&&n(c).hasInvoices?(v(),_("div",Fa,[t("div",Da,[e[25]||(e[25]=t("span",{class:"total-label"},"Sold Total:",-1)),t("span",{class:k(["total-value",n(c).totalSoldAll>0?"positive":"negative"])},f(ce(n(c).totalSoldAll)),3)])])):h("",!0),n(l).selectedCompany&&!y.value?(v(),M(V,{key:3,class:"filters-card"},{content:p(()=>[t("div",za,[t("div",Sa,[t("div",Ia,[t("div",Ta,[e[26]||(e[26]=t("label",{class:"form-label"},"Tip Factură",-1)),r(m,{modelValue:o.value.type,"onUpdate:modelValue":e[12]||(e[12]=i=>o.value.type=i),options:G,"option-label":"label","option-value":"value",placeholder:"Tip factură",class:"w-full",onChange:$},null,8,["modelValue"])])]),t("div",Va,[t("div",Na,[e[27]||(e[27]=t("label",{class:"form-label"},"Status Plată",-1)),r(m,{modelValue:o.value.paymentStatus,"onUpdate:modelValue":e[13]||(e[13]=i=>o.value.paymentStatus=i),options:J,"option-label":"label","option-value":"value",placeholder:"Status plată",class:"w-full",onChange:$},null,8,["modelValue"])])]),t("div",Ma,[t("div",ka,[e[28]||(e[28]=t("label",{class:"form-label"},"Căutare",-1)),r(F,{modelValue:o.value.searchTerm,"onUpdate:modelValue":e[14]||(e[14]=i=>o.value.searchTerm=i),placeholder:"Căutați după număr, partener...",class:"w-full",onInput:n(U)},null,8,["modelValue","onInput"])])]),t("div",Ea,[t("div",La,[e[29]||(e[29]=t("label",{class:"form-label"},"Cont",-1)),r(F,{modelValue:o.value.cont,"onUpdate:modelValue":e[15]||(e[15]=i=>o.value.cont=i),placeholder:"Filtru cont (ex: 4111)",class:"w-full",onInput:n(U)},null,8,["modelValue","onInput"])])])]),y.value?h("",!0):(v(),_("div",Ra,[r(d,{icon:"pi pi-filter-slash",label:"Resetează Filtre",class:"p-button-outlined p-button-secondary",onClick:B}),r(d,{icon:"pi pi-file-excel",label:"Export Excel",class:"p-button-outlined p-button-success",onClick:Y,disabled:!n(c).hasInvoices},null,8,["disabled"]),r(d,{icon:"pi pi-file-pdf",label:"Export PDF",class:"p-button-outlined p-button-danger",onClick:ae,disabled:!n(c).hasInvoices},null,8,["disabled"]),r(d,{icon:"pi pi-refresh",label:"Actualizează",loading:n(c).isLoading,onClick:X},null,8,["loading"])]))])]),_:1})):h("",!0),!y.value&&n(l).selectedCompany&&n(c).hasInvoices?(v(),_("div",Aa,[t("div",Wa,[e[30]||(e[30]=t("span",{class:"stat-label"},"Total Sold:",-1)),t("span",{class:k(["stat-value",n(c).totalSoldAll>0?"plati":"incasari"])},f(de(n(c).totalSoldAll)),3)])])):h("",!0),n(l).selectedCompany?(v(),M(V,{key:5,class:"table-card"},{content:p(()=>[y.value?(v(),_("div",Oa,[(v(!0),_(ke,null,Ee(n(c).invoiceList,i=>(v(),_("div",{key:i.nract,class:"mobile-data-card"},[t("div",$a,f(i.nume),1),t("div",Ua,[t("span",null,f(x(i.dataact))+" · "+f(i.nract),1),t("span",{class:k(["card-amount",{positive:i.soldfinal>0}])},f(O(i.soldfinal)),3)])]))),128)),n(c).invoiceList.length===0?(v(),_("div",Ba,[...e[31]||(e[31]=[t("i",{class:"pi pi-info-circle"},null,-1),t("p",null,"Nu au fost găsite facturi",-1)])])):h("",!0)])):h("",!0),y.value?h("",!0):(v(),M(j,{key:1,value:n(c).invoiceList,loading:n(c).isLoading,paginator:!0,rows:w.value.rows,"total-records":n(c).totalInvoices,lazy:!0,"striped-rows":!0,"paginator-template":"FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink CurrentPageReport RowsPerPageDropdown","rows-per-page-options":[25,50,100],"current-page-report-template":"Afișare {first} - {last} din {totalRecords} înregistrări","responsive-layout":"scroll",onPage:fe,onSort:ye},{empty:p(()=>[...e[32]||(e[32]=[t("div",{class:"no-data"},[t("i",{class:"pi pi-info-circle"}),t("p",null,"Nu au fost găsite facturi")],-1)])]),loading:p(()=>[t("div",ja,[r(N),e[33]||(e[33]=t("p",null,"Se încarcă facturile...",-1))])]),default:p(()=>[r(u,{field:"cont",header:"Cont",sortable:""},{body:p(i=>[E(f(i.data.cont||"-"),1)]),_:1}),r(u,{field:"nract",header:"Numar Doc.",sortable:""},{body:p(i=>[E(f(i.data.nract),1)]),_:1}),r(u,{field:"dataact",header:"Data Doc.",sortable:""},{body:p(i=>[E(f(x(i.data.dataact)),1)]),_:1}),r(u,{field:"datascad",header:"Data Scadenta",sortable:""},{body:p(i=>[E(f(x(i.data.datascad)),1)]),_:1}),r(u,{field:"nume",header:"Partener",sortable:""},{body:p(i=>[E(f(i.data.nume),1)]),_:1}),r(u,{field:"totctva",header:"Facturat",sortable:""},{body:p(i=>[t("div",Ha,f(O(i.data.totctva)),1)]),_:1}),r(u,{field:"achitat",header:"Achitat",sortable:""},{body:p(i=>[t("div",qa,f(O(i.data.achitat)),1)]),_:1}),r(u,{field:"soldfinal",header:"Sold",sortable:""},{body:p(i=>[t("div",Xa,f(O(i.data.soldfinal)),1)]),_:1}),r(u,{field:"valuta",header:"Valuta",sortable:"",style:{width:"8%"}},{body:p(i=>[t("div",Ya,f(i.data.valuta||"RON"),1)]),_:1})]),_:1},8,["value","loading","rows","total-records"]))]),_:1})):h("",!0)]),y.value?(v(),M(ze,{key:2})):h("",!0)],2)}}},rt=be(Za,[["__scopeId","data-v-4b2b170d"]]);export{rt as default}; -//# sourceMappingURL=InvoicesView.DcmNSM09.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/InvoicesView.DcmNSM09.js.map b/deploy-package-20260223-151231/frontend/assets/InvoicesView.DcmNSM09.js.map deleted file mode 100644 index 8a51f05..0000000 --- a/deploy-package-20260223-151231/frontend/assets/InvoicesView.DcmNSM09.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"mappings":"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","names":["formatDistanceLocale","formatDistance","token","count","options","result","tokenValue","dateFormats","timeFormats","dateTimeFormats","formatLong","buildFormatLongFn","formatRelativeLocale","formatRelative","_date","_baseDate","_options","eraValues","quarterValues","monthValues","dayValues","dayPeriodValues","formattingDayPeriodValues","ordinalNumber","dirtyNumber","localize","buildLocalizeFn","quarter","matchOrdinalNumberPattern","parseOrdinalNumberPattern","matchEraPatterns","parseEraPatterns","matchQuarterPatterns","parseQuarterPatterns","matchMonthPatterns","parseMonthPatterns","matchDayPatterns","parseDayPatterns","matchDayPeriodPatterns","parseDayPeriodPatterns","match","buildMatchPatternFn","value","buildMatchFn","index","locale","toast","useToast","router","useRouter","route","useRoute","activeTab","ref","companyStore","useCompanyStore","invoicesStore","useInvoicesStore","periodStore","useAccountingPeriodStore","authStore","useAuthStore","selectedCompanyId","_a","isMobile","showFilters","showDrawer","handleLogout","handleServerSwitched","newServerId","mobileTopBarActions","computed","hasActiveFilters","handleTopBarAction","action","clearFilters","refreshData","exportExcel","switchTab","tab","filters","pagination","loadInvoices","handleResize","accountingPeriodText","exportPDF","invoiceTypes","paymentStatusOptions","formatCurrency","amount","formatNumber","formatCompact","formatDate","dateString","format","ro","handleCompanyChange","company","handleCompanyChanged","handlePeriodChanged","handleFilterChange","handleSearchChange","timeout","luna","an","params","error","onPageChange","event","onSort","fetchAllInvoicesData","__vitePreload","__vite_default__","n","allData","exportData","row","invoiceType","exportToExcel","columns","periodText","fromDate","toDate","exportToPDF","onMounted","onUnmounted","watch","newCompany","newPeriod","_createElementBlock","_normalizeClass","_createBlock","MobileTopBar","_openBlock","_hoisted_1","_createElementVNode","_hoisted_2","_createVNode","MobileDrawerMenu","$event","_unref","BottomSheet","_cache","_hoisted_3","_hoisted_4","_component_Dropdown","_hoisted_5","_hoisted_6","_component_InputText","_hoisted_7","_hoisted_8","_component_Button","_hoisted_9","_hoisted_10","_component_Card","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_Fragment","_renderList","invoice","_hoisted_28","_toDisplayString","_hoisted_29","_hoisted_30","_component_DataTable","_hoisted_31","_component_ProgressSpinner","_component_Column","_withCtx","slotProps","_createTextVNode","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","MobileBottomNav"],"ignoreList":[0,1,2,3,4,5],"sources":["../../node_modules/date-fns/esm/locale/ro/_lib/formatDistance/index.js","../../node_modules/date-fns/esm/locale/ro/_lib/formatLong/index.js","../../node_modules/date-fns/esm/locale/ro/_lib/formatRelative/index.js","../../node_modules/date-fns/esm/locale/ro/_lib/localize/index.js","../../node_modules/date-fns/esm/locale/ro/_lib/match/index.js","../../node_modules/date-fns/esm/locale/ro/index.js","../../src/modules/reports/views/InvoicesView.vue"],"sourcesContent":["var formatDistanceLocale = {\n lessThanXSeconds: {\n one: 'mai puțin de o secundă',\n other: 'mai puțin de {{count}} secunde'\n },\n xSeconds: {\n one: '1 secundă',\n other: '{{count}} secunde'\n },\n halfAMinute: 'jumătate de minut',\n lessThanXMinutes: {\n one: 'mai puțin de un minut',\n other: 'mai puțin de {{count}} minute'\n },\n xMinutes: {\n one: '1 minut',\n other: '{{count}} minute'\n },\n aboutXHours: {\n one: 'circa 1 oră',\n other: 'circa {{count}} ore'\n },\n xHours: {\n one: '1 oră',\n other: '{{count}} ore'\n },\n xDays: {\n one: '1 zi',\n other: '{{count}} zile'\n },\n aboutXWeeks: {\n one: 'circa o săptămână',\n other: 'circa {{count}} săptămâni'\n },\n xWeeks: {\n one: '1 săptămână',\n other: '{{count}} săptămâni'\n },\n aboutXMonths: {\n one: 'circa 1 lună',\n other: 'circa {{count}} luni'\n },\n xMonths: {\n one: '1 lună',\n other: '{{count}} luni'\n },\n aboutXYears: {\n one: 'circa 1 an',\n other: 'circa {{count}} ani'\n },\n xYears: {\n one: '1 an',\n other: '{{count}} ani'\n },\n overXYears: {\n one: 'peste 1 an',\n other: 'peste {{count}} ani'\n },\n almostXYears: {\n one: 'aproape 1 an',\n other: 'aproape {{count}} ani'\n }\n};\nvar formatDistance = function formatDistance(token, count, options) {\n var result;\n var tokenValue = formatDistanceLocale[token];\n if (typeof tokenValue === 'string') {\n result = tokenValue;\n } else if (count === 1) {\n result = tokenValue.one;\n } else {\n result = tokenValue.other.replace('{{count}}', String(count));\n }\n if (options !== null && options !== void 0 && options.addSuffix) {\n if (options.comparison && options.comparison > 0) {\n return 'în ' + result;\n } else {\n return result + ' în urmă';\n }\n }\n return result;\n};\nexport default formatDistance;","import buildFormatLongFn from \"../../../_lib/buildFormatLongFn/index.js\";\nvar dateFormats = {\n full: 'EEEE, d MMMM yyyy',\n long: 'd MMMM yyyy',\n medium: 'd MMM yyyy',\n short: 'dd.MM.yyyy'\n};\nvar timeFormats = {\n full: 'HH:mm:ss zzzz',\n long: 'HH:mm:ss z',\n medium: 'HH:mm:ss',\n short: 'HH:mm'\n};\nvar dateTimeFormats = {\n full: \"{{date}} 'la' {{time}}\",\n long: \"{{date}} 'la' {{time}}\",\n medium: '{{date}}, {{time}}',\n short: '{{date}}, {{time}}'\n};\nvar formatLong = {\n date: buildFormatLongFn({\n formats: dateFormats,\n defaultWidth: 'full'\n }),\n time: buildFormatLongFn({\n formats: timeFormats,\n defaultWidth: 'full'\n }),\n dateTime: buildFormatLongFn({\n formats: dateTimeFormats,\n defaultWidth: 'full'\n })\n};\nexport default formatLong;","var formatRelativeLocale = {\n lastWeek: \"eeee 'trecută la' p\",\n yesterday: \"'ieri la' p\",\n today: \"'astăzi la' p\",\n tomorrow: \"'mâine la' p\",\n nextWeek: \"eeee 'viitoare la' p\",\n other: 'P'\n};\nvar formatRelative = function formatRelative(token, _date, _baseDate, _options) {\n return formatRelativeLocale[token];\n};\nexport default formatRelative;","import buildLocalizeFn from \"../../../_lib/buildLocalizeFn/index.js\";\nvar eraValues = {\n narrow: ['Î', 'D'],\n abbreviated: ['Î.d.C.', 'D.C.'],\n wide: ['Înainte de Cristos', 'După Cristos']\n};\nvar quarterValues = {\n narrow: ['1', '2', '3', '4'],\n abbreviated: ['T1', 'T2', 'T3', 'T4'],\n wide: ['primul trimestru', 'al doilea trimestru', 'al treilea trimestru', 'al patrulea trimestru']\n};\nvar monthValues = {\n narrow: ['I', 'F', 'M', 'A', 'M', 'I', 'I', 'A', 'S', 'O', 'N', 'D'],\n abbreviated: ['ian', 'feb', 'mar', 'apr', 'mai', 'iun', 'iul', 'aug', 'sep', 'oct', 'noi', 'dec'],\n wide: ['ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie', 'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie']\n};\nvar dayValues = {\n narrow: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n short: ['du', 'lu', 'ma', 'mi', 'jo', 'vi', 'sâ'],\n abbreviated: ['dum', 'lun', 'mar', 'mie', 'joi', 'vin', 'sâm'],\n wide: ['duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă']\n};\nvar dayPeriodValues = {\n narrow: {\n am: 'a',\n pm: 'p',\n midnight: 'mn',\n noon: 'ami',\n morning: 'dim',\n afternoon: 'da',\n evening: 's',\n night: 'n'\n },\n abbreviated: {\n am: 'AM',\n pm: 'PM',\n midnight: 'miezul nopții',\n noon: 'amiază',\n morning: 'dimineață',\n afternoon: 'după-amiază',\n evening: 'seară',\n night: 'noapte'\n },\n wide: {\n am: 'a.m.',\n pm: 'p.m.',\n midnight: 'miezul nopții',\n noon: 'amiază',\n morning: 'dimineață',\n afternoon: 'după-amiază',\n evening: 'seară',\n night: 'noapte'\n }\n};\nvar formattingDayPeriodValues = {\n narrow: {\n am: 'a',\n pm: 'p',\n midnight: 'mn',\n noon: 'amiază',\n morning: 'dimineață',\n afternoon: 'după-amiază',\n evening: 'seară',\n night: 'noapte'\n },\n abbreviated: {\n am: 'AM',\n pm: 'PM',\n midnight: 'miezul nopții',\n noon: 'amiază',\n morning: 'dimineață',\n afternoon: 'după-amiază',\n evening: 'seară',\n night: 'noapte'\n },\n wide: {\n am: 'a.m.',\n pm: 'p.m.',\n midnight: 'miezul nopții',\n noon: 'amiază',\n morning: 'dimineață',\n afternoon: 'după-amiază',\n evening: 'seară',\n night: 'noapte'\n }\n};\nvar ordinalNumber = function ordinalNumber(dirtyNumber, _options) {\n return String(dirtyNumber);\n};\nvar localize = {\n ordinalNumber: ordinalNumber,\n era: buildLocalizeFn({\n values: eraValues,\n defaultWidth: 'wide'\n }),\n quarter: buildLocalizeFn({\n values: quarterValues,\n defaultWidth: 'wide',\n argumentCallback: function argumentCallback(quarter) {\n return quarter - 1;\n }\n }),\n month: buildLocalizeFn({\n values: monthValues,\n defaultWidth: 'wide'\n }),\n day: buildLocalizeFn({\n values: dayValues,\n defaultWidth: 'wide'\n }),\n dayPeriod: buildLocalizeFn({\n values: dayPeriodValues,\n defaultWidth: 'wide',\n formattingValues: formattingDayPeriodValues,\n defaultFormattingWidth: 'wide'\n })\n};\nexport default localize;","import buildMatchFn from \"../../../_lib/buildMatchFn/index.js\";\nimport buildMatchPatternFn from \"../../../_lib/buildMatchPatternFn/index.js\";\nvar matchOrdinalNumberPattern = /^(\\d+)?/i;\nvar parseOrdinalNumberPattern = /\\d+/i;\nvar matchEraPatterns = {\n narrow: /^(Î|D)/i,\n abbreviated: /^(Î\\.?\\s?d\\.?\\s?C\\.?|Î\\.?\\s?e\\.?\\s?n\\.?|D\\.?\\s?C\\.?|e\\.?\\s?n\\.?)/i,\n wide: /^(Înainte de Cristos|Înaintea erei noastre|După Cristos|Era noastră)/i\n};\nvar parseEraPatterns = {\n any: [/^ÎC/i, /^DC/i],\n wide: [/^(Înainte de Cristos|Înaintea erei noastre)/i, /^(După Cristos|Era noastră)/i]\n};\nvar matchQuarterPatterns = {\n narrow: /^[1234]/i,\n abbreviated: /^T[1234]/i,\n wide: /^trimestrul [1234]/i\n};\nvar parseQuarterPatterns = {\n any: [/1/i, /2/i, /3/i, /4/i]\n};\nvar matchMonthPatterns = {\n narrow: /^[ifmaasond]/i,\n abbreviated: /^(ian|feb|mar|apr|mai|iun|iul|aug|sep|oct|noi|dec)/i,\n wide: /^(ianuarie|februarie|martie|aprilie|mai|iunie|iulie|august|septembrie|octombrie|noiembrie|decembrie)/i\n};\nvar parseMonthPatterns = {\n narrow: [/^i/i, /^f/i, /^m/i, /^a/i, /^m/i, /^i/i, /^i/i, /^a/i, /^s/i, /^o/i, /^n/i, /^d/i],\n any: [/^ia/i, /^f/i, /^mar/i, /^ap/i, /^mai/i, /^iun/i, /^iul/i, /^au/i, /^s/i, /^o/i, /^n/i, /^d/i]\n};\nvar matchDayPatterns = {\n narrow: /^[dlmjvs]/i,\n short: /^(d|l|ma|mi|j|v|s)/i,\n abbreviated: /^(dum|lun|mar|mie|jo|vi|sâ)/i,\n wide: /^(duminica|luni|marţi|miercuri|joi|vineri|sâmbătă)/i\n};\nvar parseDayPatterns = {\n narrow: [/^d/i, /^l/i, /^m/i, /^m/i, /^j/i, /^v/i, /^s/i],\n any: [/^d/i, /^l/i, /^ma/i, /^mi/i, /^j/i, /^v/i, /^s/i]\n};\nvar matchDayPeriodPatterns = {\n narrow: /^(a|p|mn|a|(dimineaţa|după-amiaza|seara|noaptea))/i,\n any: /^([ap]\\.?\\s?m\\.?|miezul nopții|amiaza|(dimineaţa|după-amiaza|seara|noaptea))/i\n};\nvar parseDayPeriodPatterns = {\n any: {\n am: /^a/i,\n pm: /^p/i,\n midnight: /^mn/i,\n noon: /amiaza/i,\n morning: /dimineaţa/i,\n afternoon: /după-amiaza/i,\n evening: /seara/i,\n night: /noaptea/i\n }\n};\nvar match = {\n ordinalNumber: buildMatchPatternFn({\n matchPattern: matchOrdinalNumberPattern,\n parsePattern: parseOrdinalNumberPattern,\n valueCallback: function valueCallback(value) {\n return parseInt(value, 10);\n }\n }),\n era: buildMatchFn({\n matchPatterns: matchEraPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseEraPatterns,\n defaultParseWidth: 'any'\n }),\n quarter: buildMatchFn({\n matchPatterns: matchQuarterPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseQuarterPatterns,\n defaultParseWidth: 'any',\n valueCallback: function valueCallback(index) {\n return index + 1;\n }\n }),\n month: buildMatchFn({\n matchPatterns: matchMonthPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseMonthPatterns,\n defaultParseWidth: 'any'\n }),\n day: buildMatchFn({\n matchPatterns: matchDayPatterns,\n defaultMatchWidth: 'wide',\n parsePatterns: parseDayPatterns,\n defaultParseWidth: 'any'\n }),\n dayPeriod: buildMatchFn({\n matchPatterns: matchDayPeriodPatterns,\n defaultMatchWidth: 'any',\n parsePatterns: parseDayPeriodPatterns,\n defaultParseWidth: 'any'\n })\n};\nexport default match;","import formatDistance from \"./_lib/formatDistance/index.js\";\nimport formatLong from \"./_lib/formatLong/index.js\";\nimport formatRelative from \"./_lib/formatRelative/index.js\";\nimport localize from \"./_lib/localize/index.js\";\nimport match from \"./_lib/match/index.js\";\n/**\n * @type {Locale}\n * @category Locales\n * @summary Romanian locale.\n * @language Romanian\n * @iso-639-2 ron\n * @author Sergiu Munteanu [@jsergiu]{@link https://github.com/jsergiu}\n * @author Adrian Ocneanu [@aocneanu]{@link https://github.com/aocneanu}\n * @author Mihai Ocneanu [@gandesc]{@link https://github.com/gandesc}\n */\nvar locale = {\n code: 'ro',\n formatDistance: formatDistance,\n formatLong: formatLong,\n formatRelative: formatRelative,\n localize: localize,\n match: match,\n options: {\n weekStartsOn: 1 /* Monday */,\n firstWeekContainsDate: 1\n }\n};\nexport default locale;","\n\n\n\n\n"],"file":"assets/InvoicesView.DcmNSM09.js"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/LoginWrapper.9ZZlPaIA.css b/deploy-package-20260223-151231/frontend/assets/LoginWrapper.9ZZlPaIA.css deleted file mode 100644 index c5cf0ba..0000000 --- a/deploy-package-20260223-151231/frontend/assets/LoginWrapper.9ZZlPaIA.css +++ /dev/null @@ -1 +0,0 @@ -.login-container{min-height:100vh;display:flex;align-items:center;justify-content:center;background:linear-gradient(135deg,var(--color-primary-light) 0%,var(--color-primary) 100%);padding:1rem}.login-wrapper{width:100%;max-width:400px}.login-card{box-shadow:0 25px 50px #00000026;border-radius:16px;overflow:hidden;border:1px solid rgba(255,255,255,.1);background:var(--surface-card)}.login-header{text-align:center;padding:2rem 2rem 1rem;background:var(--surface-card)}.login-title{margin:1rem 0 .5rem;color:var(--primary-color);font-size:2rem;font-weight:700}.login-subtitle{margin:0;color:var(--text-color-secondary);font-size:.95rem}.login-form{padding:0 2rem 2rem;background:var(--surface-card)}.login-button{margin-top:1rem;padding:.75rem;font-size:1.1rem;font-weight:600;background:var(--color-primary-light)!important;color:#fff!important;border:none!important;box-shadow:0 4px 6px #0000001a;transition:all .3s ease}.login-button:hover{background:var(--color-primary)!important;box-shadow:0 6px 12px #00000026;transform:translateY(-2px)}.login-button:active{transform:translateY(0);box-shadow:0 2px 4px #0000001a}.login-error-message{display:flex;align-items:center;gap:.5rem;padding:.75rem;margin-bottom:1rem;background-color:var(--red-50);color:var(--red-800);border:1px solid var(--red-200);border-radius:6px;font-size:.9rem}.login-footer{text-align:center;padding:1rem 2rem;background-color:var(--surface-ground);border-top:1px solid var(--surface-border)}.login-footer small{color:var(--text-color-secondary)}[data-theme=dark] .login-footer{background-color:var(--surface-ground)}[data-theme=dark] .login-error-message{background-color:#ef444426;color:var(--red-300);border-color:var(--red-800)}@media (max-width: 768px){.login-container{padding:.5rem}.login-wrapper{max-width:100%;padding:0 1rem}.login-card{border-radius:8px}.login-header{padding:1.5rem 1rem}.login-title{font-size:1.5rem}.login-form{padding:0 1rem 1.5rem}.login-container .p-inputtext,.login-container .p-password input{min-height:44px;font-size:16px}.login-footer{padding:1rem}}@media (max-width: 480px){.login-container{padding:.25rem}.login-card{margin:0}.login-header{padding:1rem .5rem}.login-title{font-size:1.25rem}.login-subtitle{font-size:.875rem}.login-form{padding:0 .5rem 1rem}.login-footer{padding:.75rem .5rem}}.login-card{animation:loginFadeInUp .6s ease-out}@keyframes loginFadeInUp{0%{opacity:0;transform:translateY(30px)}to{opacity:1;transform:translateY(0)}}.login-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-xl) var(--space-lg);gap:var(--space-md)}.login-loading p{color:var(--text-color-secondary);font-size:.875rem} diff --git a/deploy-package-20260223-151231/frontend/assets/LoginWrapper.D7R_IVEC.js b/deploy-package-20260223-151231/frontend/assets/LoginWrapper.D7R_IVEC.js deleted file mode 100644 index c1ca320..0000000 --- a/deploy-package-20260223-151231/frontend/assets/LoginWrapper.D7R_IVEC.js +++ /dev/null @@ -1,2 +0,0 @@ -import{P as R,M as O,a as v,j as M,w as j,o as D,K as N,k as L,c as u,d as i,e as r,q as y,p as _,v as p,E as W,i as b,u as I,O as k,h as $}from"./vendor-core.B6UiYhU_.js";import{u as Y,c as F}from"./index.B8XI8FQW.js";import{c as K,I as G}from"./vendor-primevue.BN-meDW0.js";import{b as H}from"./vendor-utils.CO3CyGpV.js";import"./vendor-export.BWjBvx7Z.js";const J={class:"login-container"},Q={class:"login-wrapper"},X={class:"login-header"},Z={class:"login-title"},ee={class:"login-subtitle"},te={key:0,class:"login-loading"},re={class:"form-group"},ae={key:0,class:"form-error"},oe={class:"form-group"},le={key:0,class:"form-error"},se={key:0,class:"form-group"},ie={key:0,class:"form-error"},ne={key:1,class:"login-error-message"},ue={class:"login-footer"},ce={class:"text-color-secondary"},de={__name:"LoginView",props:{appTitle:{type:String,required:!0},appSubtitle:{type:String,required:!0},appIcon:{type:String,required:!0},redirectPath:{type:String,default:"/"},authStore:{type:Object,required:!0}},setup(l){const t=l,E=R(),x=O(),w=Y(),n=v(""),c=v(""),s=v(null),m=v(""),f=v(""),d=v(""),h=v(!1),A=M(()=>new Date().getFullYear()),B=M(()=>!(!n.value.trim()||!f.value||!t.authStore.isSingleServerMode&&t.authStore.availableServers.length>0&&!s.value)),q=()=>{d.value="",t.authStore.clearError()},U=async()=>{const a=n.value.trim();if(!(!a||a.length<2)){t.authStore.clearError();try{(await t.authStore.checkIdentity(a)).exists?(h.value=!0,t.authStore.availableServers.length===1?s.value=t.authStore.availableServers[0].id:t.authStore.selectedServerId&&(s.value=t.authStore.selectedServerId)):(h.value=!1,s.value=null)}catch(e){console.error("Check identity error:",e)}}},P=async()=>{t.authStore.isSingleServerMode||h.value||await U()},T=()=>{c.value="",t.authStore.clearError(),h.value&&(h.value=!1,s.value=null,t.authStore.availableServers.splice(0))},z=async()=>{var a;if(!n.value.trim()){c.value="Utilizatorul este obligatoriu";return}if(!f.value){d.value="Parola este obligatorie";return}if(!t.authStore.isSingleServerMode&&t.authStore.availableServers.length>0&&!s.value){m.value="Selectați un server";return}c.value="",d.value="",m.value="";try{const e={username:n.value.trim(),password:f.value};!t.authStore.isSingleServerMode&&s.value&&(e.server_id=s.value);const C=await t.authStore.login(e);if(C.success)w.add({severity:"success",summary:"Autentificare reușită",detail:`Bine ați venit, ${((a=t.authStore.user)==null?void 0:a.full_name)||n.value}!`,life:3e3}),E.push(t.redirectPath);else{const o=C.error||"Autentificare eșuată";let S=o;o.toLowerCase().includes("password")||o.toLowerCase().includes("parola")||o.toLowerCase().includes("invalid credentials")||o.toLowerCase().includes("incorrect")?S="Parolă incorectă":o.toLowerCase().includes("inactive")||o.toLowerCase().includes("inactiv")||o.toLowerCase().includes("disabled")||o.toLowerCase().includes("blocat")?S="Cont inactiv":(o.toLowerCase().includes("not found")||o.toLowerCase().includes("user"))&&(S="Utilizator negăsit"),w.add({severity:"error",summary:"Autentificare eșuată",detail:S,life:5e3})}}catch(e){console.error("Login error:",e),w.add({severity:"error",summary:"Eroare",detail:"A apărut o eroare la autentificare",life:5e3})}},V=()=>{t.authStore.clearError(),c.value="",d.value="",m.value=""};return j(()=>t.authStore.selectedServerId,a=>{a&&!s.value&&(s.value=a)},{immediate:!0}),D(async()=>{V();const a=x.query.server;a&&!t.authStore.isSingleServerMode&&t.authStore.setPreselectedServer(a),await t.authStore.getAuthMode(),setTimeout(()=>{const e=document.getElementById("identity");e&&e.focus()},100)}),N(()=>{V()}),(a,e)=>{const C=L("InputText"),o=L("Button"),S=L("Card");return i(),u("div",J,[r("div",Q,[y(S,{class:"login-card"},{header:_(()=>[r("div",X,[r("i",{class:I(["pi",l.appIcon,"text-primary","text-6xl"])},null,2),r("h1",Z,p(l.appTitle),1),r("p",ee,p(l.appSubtitle),1)])]),content:_(()=>[l.authStore.loginStep==="loading"?(i(),u("div",te,[...e[3]||(e[3]=[r("i",{class:"pi pi-spin pi-spinner text-4xl text-primary"},null,-1),r("p",null,"Se încarcă...",-1)])])):(i(),u("form",{key:1,class:"login-form",onSubmit:W(z,["prevent"])},[r("div",re,[e[4]||(e[4]=r("label",{for:"identity",class:"form-label required"},"Utilizator",-1)),y(C,{id:"identity",modelValue:n.value,"onUpdate:modelValue":e[0]||(e[0]=g=>n.value=g),type:"text",placeholder:"Introduceți utilizatorul",class:I([{invalid:c.value},"w-full"]),autocomplete:"username",onBlur:P,onInput:T},null,8,["modelValue","class"]),c.value?(i(),u("span",ae,p(c.value),1)):b("",!0)]),r("div",oe,[e[5]||(e[5]=r("label",{for:"password",class:"form-label required"},"Parolă",-1)),y(k(K),{id:"password",modelValue:f.value,"onUpdate:modelValue":e[1]||(e[1]=g=>f.value=g),placeholder:"Introduceți parola",class:I([{invalid:d.value},"w-full"]),feedback:!1,toggleMask:"",autocomplete:"current-password",onInput:q},null,8,["modelValue","class"]),d.value?(i(),u("span",le,p(d.value),1)):b("",!0)]),l.authStore.isSingleServerMode?b("",!0):(i(),u("div",se,[e[6]||(e[6]=r("label",{for:"server",class:"form-label required"},"Server",-1)),y(k(G),{id:"server",modelValue:s.value,"onUpdate:modelValue":e[2]||(e[2]=g=>s.value=g),options:l.authStore.availableServers,optionLabel:"name",optionValue:"id",placeholder:"Selectați serverul",class:I(["w-full",{invalid:m.value}]),disabled:l.authStore.availableServers.length===0},null,8,["modelValue","options","class","disabled"]),m.value?(i(),u("span",ie,p(m.value),1)):b("",!0)])),l.authStore.error?(i(),u("div",ne,[e[7]||(e[7]=r("i",{class:"pi pi-exclamation-triangle"},null,-1)),r("span",null,p(l.authStore.error),1)])):b("",!0),y(o,{type:"submit",label:"Autentificare",class:"w-full login-button",loading:l.authStore.isLoading,disabled:!B.value,icon:"pi pi-sign-in","icon-pos":"right"},null,8,["loading","disabled"])],32))]),footer:_(()=>[r("div",ue,[r("small",ce," ROA2WEB © "+p(A.value)+" - Toate drepturile rezervate ",1)])]),_:1})])])}}},he={__name:"LoginWrapper",setup(l){const t=H.create({baseURL:"/roa2web/api",headers:{"Content-Type":"application/json"}}),x=F(t)();return(w,n)=>(i(),$(de,{"app-title":"ROA2WEB","app-subtitle":"Sistem Unificat - Rapoarte & Introduceri Date","app-icon":"pi-chart-bar","redirect-path":"/reports/dashboard","auth-store":k(x)},null,8,["auth-store"]))}};export{he as default}; -//# sourceMappingURL=LoginWrapper.D7R_IVEC.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/LoginWrapper.D7R_IVEC.js.map b/deploy-package-20260223-151231/frontend/assets/LoginWrapper.D7R_IVEC.js.map deleted file mode 100644 index 99d7128..0000000 --- a/deploy-package-20260223-151231/frontend/assets/LoginWrapper.D7R_IVEC.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"LoginWrapper.D7R_IVEC.js","sources":["../../src/shared/components/LoginView.vue","../../src/views/LoginWrapper.vue"],"sourcesContent":["\n\n\n\n\n","\n\n\n"],"names":["props","__props","router","useRouter","route","useRoute","toast","useToast","identity","ref","identityError","selectedServer","serverError","password","passwordError","isIdentityVerified","currentYear","computed","canSubmit","clearPasswordError","loadServers","trimmed","error","handleIdentityBlur","handleIdentityInput","handleLogin","credentials","result","_a","errorMessage","displayMessage","err","clearErrors","watch","newServerId","onMounted","preselectedServer","identityInput","onUnmounted","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_createVNode","_component_Card","_hoisted_3","_hoisted_4","_toDisplayString","_hoisted_5","_hoisted_6","_cache","_hoisted_7","_component_InputText","$event","_normalizeClass","_hoisted_8","_hoisted_9","_unref","Password","_hoisted_10","_hoisted_11","Dropdown","_hoisted_12","_hoisted_13","_component_Button","_hoisted_14","_hoisted_15","authApi","axios","authStore","createAuthStore","_createBlock","LoginView"],"mappings":"0/BAyHA,MAAMA,EAAQC,EAuBRC,EAASC,EAAS,EAClBC,EAAQC,EAAQ,EAChBC,EAAQC,EAAQ,EAGhBC,EAAWC,EAAI,EAAE,EACjBC,EAAgBD,EAAI,EAAE,EACtBE,EAAiBF,EAAI,IAAI,EACzBG,EAAcH,EAAI,EAAE,EACpBI,EAAWJ,EAAI,EAAE,EACjBK,EAAgBL,EAAI,EAAE,EAGtBM,EAAqBN,EAAI,EAAK,EAG9BO,EAAcC,EAAS,IAAM,IAAI,KAAI,EAAG,YAAW,CAAE,EAGrDC,EAAYD,EAAS,IAErB,GAACT,EAAS,MAAM,KAAI,GAAM,CAACK,EAAS,OAGpC,CAACb,EAAM,UAAU,oBAEfA,EAAM,UAAU,iBAAiB,OAAS,GAAK,CAACW,EAAe,MAMtE,EAIKQ,EAAqB,IAAM,CAC/BL,EAAc,MAAQ,GACtBd,EAAM,UAAU,WAAU,CAC5B,EAGMoB,EAAc,SAAY,CAC9B,MAAMC,EAAUb,EAAS,MAAM,KAAI,EACnC,GAAI,GAACa,GAAWA,EAAQ,OAAS,GAEjC,CAAArB,EAAM,UAAU,WAAU,EAE1B,GAAI,EACa,MAAMA,EAAM,UAAU,cAAcqB,CAAO,GAE/C,QACTN,EAAmB,MAAQ,GAGvBf,EAAM,UAAU,iBAAiB,SAAW,EAC9CW,EAAe,MAAQX,EAAM,UAAU,iBAAiB,CAAC,EAAE,GAClDA,EAAM,UAAU,mBACzBW,EAAe,MAAQX,EAAM,UAAU,oBAIzCe,EAAmB,MAAQ,GAC3BJ,EAAe,MAAQ,KAE3B,OAASW,EAAO,CACd,QAAQ,MAAM,wBAAyBA,CAAK,CAC9C,EACF,EAGMC,EAAqB,SAAY,CACjCvB,EAAM,UAAU,oBAChBe,EAAmB,OAEvB,MAAMK,EAAW,CACnB,EAGMI,EAAsB,IAAM,CAChCd,EAAc,MAAQ,GACtBV,EAAM,UAAU,WAAU,EAGtBe,EAAmB,QACrBA,EAAmB,MAAQ,GAC3BJ,EAAe,MAAQ,KACvBX,EAAM,UAAU,iBAAiB,OAAO,CAAC,EAE7C,EAGMyB,EAAc,SAAY,OAE9B,GAAI,CAACjB,EAAS,MAAM,OAAQ,CAC1BE,EAAc,MAAQ,gCACtB,MACF,CAGA,GAAI,CAACG,EAAS,MAAO,CACnBC,EAAc,MAAQ,0BACtB,MACF,CAGA,GAAI,CAACd,EAAM,UAAU,oBACjBA,EAAM,UAAU,iBAAiB,OAAS,GAC1C,CAACW,EAAe,MAAO,CACzBC,EAAY,MAAQ,sBACpB,MACF,CAEAF,EAAc,MAAQ,GACtBI,EAAc,MAAQ,GACtBF,EAAY,MAAQ,GAEpB,GAAI,CAEF,MAAMc,EAAc,CAClB,SAAUlB,EAAS,MAAM,KAAI,EAC7B,SAAUK,EAAS,KACzB,EAGQ,CAACb,EAAM,UAAU,oBAAsBW,EAAe,QACxDe,EAAY,UAAYf,EAAe,OAGzC,MAAMgB,EAAS,MAAM3B,EAAM,UAAU,MAAM0B,CAAW,EAEtD,GAAIC,EAAO,QACTrB,EAAM,IAAI,CACR,SAAU,UACV,QAAS,wBACT,OAAQ,qBAAmBsB,EAAA5B,EAAM,UAAU,OAAhB,YAAA4B,EAAsB,YAAapB,EAAS,KAAK,IAC5E,KAAM,GACd,CAAO,EAEDN,EAAO,KAAKF,EAAM,YAAY,MACzB,CAEL,MAAM6B,EAAeF,EAAO,OAAS,uBACrC,IAAIG,EAAiBD,EAEjBA,EAAa,cAAc,SAAS,UAAU,GAC9CA,EAAa,YAAW,EAAG,SAAS,QAAQ,GAC5CA,EAAa,YAAW,EAAG,SAAS,qBAAqB,GACzDA,EAAa,YAAW,EAAG,SAAS,WAAW,EACjDC,EAAiB,mBACRD,EAAa,YAAW,EAAG,SAAS,UAAU,GAC9CA,EAAa,YAAW,EAAG,SAAS,SAAS,GAC7CA,EAAa,YAAW,EAAG,SAAS,UAAU,GAC9CA,EAAa,YAAW,EAAG,SAAS,QAAQ,EACrDC,EAAiB,gBACRD,EAAa,YAAW,EAAG,SAAS,WAAW,GAC/CA,EAAa,YAAW,EAAG,SAAS,MAAM,KACnDC,EAAiB,sBAGnBxB,EAAM,IAAI,CACR,SAAU,QACV,QAAS,uBACT,OAAQwB,EACR,KAAM,GACd,CAAO,CACH,CACF,OAASC,EAAK,CACZ,QAAQ,MAAM,eAAgBA,CAAG,EACjCzB,EAAM,IAAI,CACR,SAAU,QACV,QAAS,SACT,OAAQ,qCACR,KAAM,GACZ,CAAK,CACH,CACF,EAGM0B,EAAc,IAAM,CACxBhC,EAAM,UAAU,WAAU,EAC1BU,EAAc,MAAQ,GACtBI,EAAc,MAAQ,GACtBF,EAAY,MAAQ,EACtB,EAGA,OAAAqB,EACE,IAAMjC,EAAM,UAAU,iBACrBkC,GAAgB,CACXA,GAAe,CAACvB,EAAe,QACjCA,EAAe,MAAQuB,EAE3B,EACA,CAAE,UAAW,EAAI,CACnB,EAGAC,EAAU,SAAY,CACpBH,EAAW,EAGX,MAAMI,EAAoBhC,EAAM,MAAM,OAClCgC,GAAqB,CAACpC,EAAM,UAAU,oBACxCA,EAAM,UAAU,qBAAqBoC,CAAiB,EAIxD,MAAMpC,EAAM,UAAU,YAAW,EAGjC,WAAW,IAAM,CACf,MAAMqC,EAAgB,SAAS,eAAe,UAAU,EACpDA,GACFA,EAAc,MAAK,CAEvB,EAAG,GAAG,CACR,CAAC,EAEDC,EAAY,IAAM,CAChBN,EAAW,CACb,CAAC,2DA5WC,OAAAO,EAAA,EAAAC,EA6GM,MA7GNC,EA6GM,CA5GJC,EA2GM,MA3GNC,EA2GM,CA1GJC,EAyGOC,EAAA,CAzGD,MAAM,YAAY,EAAA,CACX,SACT,IAIM,CAJNH,EAIM,MAJNI,EAIM,CAHJJ,EAA4D,IAAA,CAAxD,cAAczC,EAAA,QAAO,eAAA,UAAA,CAAA,WACzByC,EAA2C,KAA3CK,EAA2CC,EAAhB/C,EAAA,QAAQ,EAAA,CAAA,EACnCyC,EAA+C,IAA/CO,GAA+CD,EAAlB/C,EAAA,WAAW,EAAA,CAAA,MAIjC,UAET,IAGM,CAHKA,EAAA,UAAU,YAAS,WAA9BsC,IAAAC,EAGM,MAHNU,GAGM,CAAA,GAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFJT,EAA2D,IAAA,CAAxD,MAAM,6CAA6C,EAAA,KAAA,EAAA,EACtDA,EAAoB,SAAjB,gBAAa,EAAA,YAIlBF,EA8EO,OAAA,OA5EL,MAAM,aACL,WAAgBf,EAAW,CAAA,SAAA,CAAA,IAG5BiB,EAgBM,MAhBNU,GAgBM,aAfJV,EAAoE,QAAA,CAA7D,IAAI,WAAW,MAAM,uBAAsB,aAAU,EAAA,GAC5DE,EAUES,EAAA,CATA,GAAG,sBACM7C,EAAA,2CAAAA,EAAQ,MAAA8C,GACjB,KAAK,OACL,YAAY,2BACX,MAAKC,EAAA,CAAA,CAAA,QAAa7C,EAAA,KAAa,EAC1B,QAAQ,CAAA,EACd,aAAa,WACZ,OAAMa,EACN,QAAOC,kCAEEd,EAAA,WAAZ8B,EAEO,OAFPgB,GAEOR,EADFtC,EAAA,KAAa,EAAA,CAAA,cAKpBgC,EAgBM,MAhBNe,GAgBM,aAfJf,EAAgE,QAAA,CAAzD,IAAI,WAAW,MAAM,uBAAsB,SAAM,EAAA,GACxDE,EAUEc,EAAAC,CAAA,EAAA,CATA,GAAG,sBACM9C,EAAA,2CAAAA,EAAQ,MAAAyC,GACjB,YAAY,qBACX,MAAKC,EAAA,CAAA,CAAA,QAAazC,EAAA,KAAa,EAC1B,QAAQ,CAAA,EACb,SAAU,GACX,WAAA,GACA,aAAa,mBACZ,QAAOK,kCAEEL,EAAA,WAAZ0B,EAEO,OAFPoB,GAEOZ,EADFlC,EAAA,KAAa,EAAA,CAAA,cAKRb,EAAA,UAAU,6BAAtBsC,IAAAC,EAgBM,MAhBNqB,GAgBM,aAfJnB,EAA8D,QAAA,CAAvD,IAAI,SAAS,MAAM,uBAAsB,SAAM,EAAA,GACtDE,EAUEc,EAAAI,CAAA,EAAA,CATA,GAAG,oBACMnD,EAAA,2CAAAA,EAAc,MAAA2C,GACtB,QAASrD,EAAA,UAAU,iBACpB,YAAY,OACZ,YAAY,KACZ,YAAY,qBACZ,MAAKsD,EAAA,CAAC,SAAQ,CAAA,QACK3C,EAAA,KAAW,CAAA,CAAA,EAC7B,SAAUX,EAAA,UAAU,iBAAiB,SAAM,uDAElCW,EAAA,WAAZ4B,EAEO,OAFPuB,GAEOf,EADFpC,EAAA,KAAW,EAAA,CAAA,eAKPX,EAAA,UAAU,OAArBsC,IAAAC,EAGM,MAHNwB,GAGM,aAFJtB,EAA0C,IAAA,CAAvC,MAAM,4BAA4B,EAAA,KAAA,EAAA,GACrCA,EAAkC,OAAA,KAAAM,EAAzB/C,EAAA,UAAU,KAAK,EAAA,CAAA,cAI1B2C,EAQEqB,EAAA,CAPA,KAAK,SACL,MAAM,gBACN,MAAM,sBACL,QAAShE,EAAA,UAAU,UACnB,UAAWiB,EAAA,MACZ,KAAK,gBACL,WAAS,gDAKJ,SACT,IAIM,CAJNwB,EAIM,MAJNwB,GAIM,CAHJxB,EAEQ,QAFRyB,GAAoC,cACxBnB,EAAGhC,EAAA,KAAW,EAAG,iCAC7B,CAAA,sDCzFZ,MAAMoD,EAAUC,EAAM,OAAO,CAC3B,QAAS,eACT,QAAS,CAAE,eAAgB,kBAAA,CAAmB,CAC/C,EAIKC,EADeC,EAAgBH,CAAO,EAC1B,oBAtBhBI,EAMEC,GAAA,CALA,YAAU,UACV,eAAa,gDACb,WAAS,eACT,gBAAc,qBACb,aAAYf,EAAAY,CAAA,CAAA"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/MaturityAnalysisView.CQbAYTep.css b/deploy-package-20260223-151231/frontend/assets/MaturityAnalysisView.CQbAYTep.css deleted file mode 100644 index d8af4c4..0000000 --- a/deploy-package-20260223-151231/frontend/assets/MaturityAnalysisView.CQbAYTep.css +++ /dev/null @@ -1 +0,0 @@ -.maturity-card[data-v-116c373d]{background:transparent;padding:0}.card-controls[data-v-116c373d]{display:flex;justify-content:flex-end;padding:var(--space-md);background:var(--surface-card);border-radius:var(--radius-md);margin-bottom:var(--space-md)}@media (max-width: 768px){.card-controls[data-v-116c373d]{padding:var(--space-xs) var(--space-sm);margin-bottom:0;background:transparent;border-radius:0}}.period-selector[data-v-116c373d]{padding:var(--space-sm) var(--space-md);border:1px solid var(--surface-border);border-radius:var(--radius-sm);background:var(--surface-card);color:var(--text-color);font-size:var(--text-sm);cursor:pointer;transition:border-color var(--transition-fast)}.period-selector[data-v-116c373d]:hover{border-color:var(--color-primary)}.period-selector[data-v-116c373d]:disabled{opacity:.5;cursor:not-allowed}.maturity-content[data-v-116c373d]{background:var(--surface-card);border-radius:var(--radius-md);overflow:hidden}.loading-state[data-v-116c373d],.error-state[data-v-116c373d]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-xl, 2rem);text-align:center}@media (max-width: 768px){.loading-state[data-v-116c373d],.error-state[data-v-116c373d]{padding:var(--space-md, 1rem)}}.loading-spinner[data-v-116c373d]{width:32px;height:32px;border:3px solid var(--color-border);border-top:3px solid var(--color-primary);border-radius:50%;animation:spin-116c373d 1s linear infinite;margin-bottom:var(--space-md, 1rem)}.error-icon[data-v-116c373d]{font-size:2rem;margin-bottom:var(--space-sm, .5rem)}.retry-btn[data-v-116c373d]{margin-top:var(--space-md, 1rem);padding:.5rem 1rem;background:var(--color-primary);color:#fff;border:none;border-radius:var(--radius-sm, 4px);cursor:pointer;transition:background-color .2s ease}.retry-btn[data-v-116c373d]:hover{background:var(--color-primary-dark)}.tab-content[data-v-116c373d]{padding:var(--space-md);min-height:200px;display:flex;flex-direction:column}@media (max-width: 768px){.tab-content[data-v-116c373d]{padding:var(--space-sm);min-height:100px}}.tab-summary[data-v-116c373d]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-md);margin-top:auto;background:var(--surface-hover);border-radius:var(--radius-md)}.summary-label[data-v-116c373d]{font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--text-color-secondary)}.summary-value[data-v-116c373d]{font-size:var(--text-lg);font-weight:var(--font-bold)}.summary-value.clients-value[data-v-116c373d]{color:var(--color-primary)}.summary-value.suppliers-value[data-v-116c373d]{color:var(--color-secondary, #6b7280)}.entity-name[data-v-116c373d]{font-weight:var(--font-medium);color:var(--text-color);font-size:var(--text-sm)}.empty-icon[data-v-116c373d]{font-size:var(--text-4xl);color:var(--text-color-secondary);opacity:.5;margin-bottom:var(--space-md)}.maturity-list[data-v-116c373d]{display:flex;flex-direction:column;gap:var(--space-sm, .5rem)}.maturity-item[data-v-116c373d]{padding:var(--space-sm, .5rem);background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-sm, 4px);transition:all .2s ease}.maturity-item[data-v-116c373d]:hover{background:var(--color-bg-secondary, #f8f9fa);border-color:var(--color-primary)}.maturity-item.overdue[data-v-116c373d],.maturity-item.critical[data-v-116c373d]{border:1px solid var(--color-border)}.item-info[data-v-116c373d]{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-xs, .25rem)}.due-info[data-v-116c373d]{font-size:var(--text-xs, .75rem);color:var(--color-text-secondary)}.overdue-days[data-v-116c373d]{color:var(--color-text);font-weight:var(--font-medium, 500)}.due-date[data-v-116c373d]{color:var(--color-text-secondary)}.amount-bar[data-v-116c373d]{display:flex;align-items:center;gap:var(--space-sm, .5rem)}.bar-container[data-v-116c373d]{flex:1;height:8px;background:var(--color-bg-secondary, #f8f9fa);border-radius:4px;overflow:hidden}.bar-fill[data-v-116c373d]{height:100%;border-radius:4px;transition:width .3s ease}.clients-bar[data-v-116c373d]{background:var(--color-primary)}.suppliers-bar[data-v-116c373d]{background:var(--color-secondary, #6b7280)}.amount-value[data-v-116c373d]{font-size:var(--text-xs, .75rem);font-weight:var(--font-bold, 700);color:var(--color-text);white-space:nowrap}.empty-state[data-v-116c373d]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-xl, 2rem);text-align:center;color:var(--color-text-secondary)}.balance-indicator[data-v-116c373d]{padding:var(--space-lg, 1rem) 0;border-top:1px solid var(--color-border);background:transparent}.balance-content[data-v-116c373d]{display:flex;align-items:center;gap:var(--space-md, 1rem)}.balance-text[data-v-116c373d]{display:flex;flex-direction:column;gap:var(--space-xs, .25rem)}.balance-label[data-v-116c373d]{font-size:var(--text-sm, .875rem);color:var(--color-text-secondary)}.balance-amount[data-v-116c373d]{font-size:var(--text-lg, 1.125rem);font-weight:var(--font-bold, 700);color:var(--color-text)}.balance-amount.surplus[data-v-116c373d],.balance-amount.deficit[data-v-116c373d]{color:var(--color-text)}.recommendations[data-v-116c373d]{margin-left:auto}.recommendations details[data-v-116c373d]{cursor:pointer}.recommendations summary[data-v-116c373d]{font-size:var(--text-sm, .875rem);color:var(--color-primary);list-style:none;padding:.5rem;border-radius:var(--radius-sm, 4px);transition:background-color .2s ease}.recommendations summary[data-v-116c373d]:hover{background:#3b82f61a}.recommendations ul[data-v-116c373d]{margin:var(--space-sm, .5rem) 0 0 0;padding-left:var(--space-lg, 1rem)}.recommendations li[data-v-116c373d]{font-size:var(--text-sm, .875rem);color:var(--color-text-secondary);margin-bottom:var(--space-xs, .25rem)}.card-footer[data-v-116c373d]{display:flex;justify-content:space-between;align-items:center;padding:var(--space-md, .75rem) var(--space-lg, 1rem);border-top:1px solid var(--color-border);background:var(--color-bg)}.period-info[data-v-116c373d],.last-updated[data-v-116c373d]{display:flex;align-items:center;gap:var(--space-xs, .25rem);font-size:var(--text-xs, .75rem)}.period-label[data-v-116c373d],.update-label[data-v-116c373d]{color:var(--color-text-secondary)}.period-value[data-v-116c373d],.update-time[data-v-116c373d]{color:var(--color-text);font-weight:var(--font-medium, 500)}.refresh-btn[data-v-116c373d]{background:none;border:none;cursor:pointer;padding:.25rem;margin-left:var(--space-sm, .5rem);border-radius:var(--radius-sm, 4px);transition:background-color .2s ease}.refresh-btn[data-v-116c373d]:hover{background:var(--color-bg-secondary, #f8f9fa)}.refresh-btn[data-v-116c373d]:disabled{opacity:.5;cursor:not-allowed}.refresh-icon[data-v-116c373d]{display:inline-block;font-size:var(--text-sm, .875rem);transition:transform .3s ease}.refresh-icon.spinning[data-v-116c373d]{animation:spin-116c373d 1s linear infinite}@keyframes spin-116c373d{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@media (max-width: 768px){.card-controls[data-v-116c373d]{justify-content:center;padding:var(--space-sm)}.period-selector[data-v-116c373d]{width:100%}.tab-content[data-v-116c373d]{padding:var(--space-sm);min-height:200px}.tab-summary[data-v-116c373d]{padding:var(--space-sm);flex-direction:column;gap:var(--space-xs);text-align:center}.balance-content[data-v-116c373d]{flex-direction:column;text-align:center}.recommendations[data-v-116c373d]{margin-left:0;width:100%}.card-footer[data-v-116c373d]{flex-direction:column;gap:var(--space-sm);align-items:center}}@media (max-width: 480px){.balance-indicator[data-v-116c373d],.card-footer[data-v-116c373d]{padding:var(--space-md)}}.main-content.mobile-layout[data-v-be9da083]{margin-top:0!important;padding-top:56px;padding-bottom:56px}.main-content.mobile-layout.has-tabs[data-v-be9da083]{padding-top:104px}.app-container[data-v-be9da083]{max-width:1400px;margin:0 auto;padding:var(--space-sm) var(--space-lg)}@media (max-width: 768px){.app-container[data-v-be9da083]{padding:var(--space-xs) var(--space-md)}}.page-header[data-v-be9da083]{margin-bottom:var(--space-sm)}.header-top[data-v-be9da083]{display:flex;justify-content:space-between;align-items:flex-start;margin-bottom:var(--space-xs)}.page-title[data-v-be9da083]{font-size:var(--text-3xl);font-weight:var(--font-bold);color:var(--text-color);margin:0 0 var(--space-xs) 0}.page-subtitle[data-v-be9da083]{font-size:var(--text-base);color:var(--text-color-secondary);margin:0}.mobile-tabs-container[data-v-be9da083]{position:fixed;top:56px;left:0;right:0;z-index:var(--z-sticky, 100);background:var(--surface-card);border-bottom:1px solid var(--surface-border)}.mobile-tabs[data-v-be9da083]{display:flex;width:100%}.mobile-tab[data-v-be9da083]{flex:1;display:flex;align-items:center;justify-content:center;padding:var(--space-md);min-height:48px;background:transparent;border:none;border-bottom:2px solid transparent;cursor:pointer;transition:all var(--transition-fast);color:var(--text-color-secondary);font-size:var(--text-sm);font-weight:var(--font-medium)}.mobile-tab.active[data-v-be9da083]{color:var(--color-primary);border-bottom-color:var(--color-primary);font-weight:var(--font-semibold)}.mobile-tab[data-v-be9da083]:hover:not(.active){background:var(--surface-hover)}.tab-label[data-v-be9da083]{text-transform:uppercase;letter-spacing:.05em}.desktop-tabs[data-v-be9da083]{display:flex;gap:var(--space-sm)}.desktop-tab[data-v-be9da083]{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-lg);background:var(--surface-hover);border:1px solid var(--surface-border);border-radius:var(--radius-md);cursor:pointer;transition:all var(--transition-fast);color:var(--text-color-secondary);font-size:var(--text-sm);font-weight:var(--font-medium)}.desktop-tab[data-v-be9da083]:hover:not(.active){border-color:var(--color-primary);color:var(--color-primary)}.desktop-tab.active[data-v-be9da083]{background:var(--color-primary);border-color:var(--color-primary);color:var(--color-text-inverse, white)}.desktop-tab i[data-v-be9da083]{font-size:var(--text-base)}.maturity-content[data-v-be9da083]{display:flex;flex-direction:column;gap:var(--space-lg)}@media (max-width: 768px){.maturity-content[data-v-be9da083]{gap:var(--space-sm)}}.empty-state[data-v-be9da083]{display:flex;flex-direction:column;align-items:center;justify-content:center;min-height:400px;text-align:center;padding:var(--space-xl);background:var(--surface-card);border-radius:var(--radius-lg);border:1px solid var(--surface-border)}.empty-icon[data-v-be9da083]{font-size:64px;color:var(--text-color-secondary);margin-bottom:var(--space-lg);opacity:.5}.empty-title[data-v-be9da083]{font-size:var(--text-xl);font-weight:var(--font-semibold);color:var(--text-color);margin:0 0 var(--space-sm) 0}.empty-description[data-v-be9da083]{font-size:var(--text-base);color:var(--text-color-secondary);margin:0 0 var(--space-lg) 0;max-width:400px}.empty-action[data-v-be9da083]{margin-top:var(--space-md)}[data-theme=dark] .mobile-tabs-container[data-v-be9da083]{background:var(--surface-card);border-bottom-color:var(--surface-border)}[data-theme=dark] .mobile-tab.active[data-v-be9da083]{color:var(--blue-400);border-bottom-color:var(--blue-400)}[data-theme=dark] .desktop-tab.active[data-v-be9da083]{background:var(--blue-600);border-color:var(--blue-600)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .mobile-tabs-container[data-v-be9da083]{background:var(--surface-card);border-bottom-color:var(--surface-border)}:root:not([data-theme]) .mobile-tab.active[data-v-be9da083]{color:var(--blue-400);border-bottom-color:var(--blue-400)}:root:not([data-theme]) .desktop-tab.active[data-v-be9da083]{background:var(--blue-600);border-color:var(--blue-600)}} diff --git a/deploy-package-20260223-151231/frontend/assets/MaturityAnalysisView.TP6afSul.js b/deploy-package-20260223-151231/frontend/assets/MaturityAnalysisView.TP6afSul.js deleted file mode 100644 index 2d6b135..0000000 --- a/deploy-package-20260223-151231/frontend/assets/MaturityAnalysisView.TP6afSul.js +++ /dev/null @@ -1,2 +0,0 @@ -import{a as h,j as c,w as Y,o as W,c as o,d as s,e,i as v,t as H,_ as J,$ as Q,v as i,F as A,B as L,u as f,S as F,K as X,h as U,q as E,O as u,M as Z,P as ee}from"./vendor-core.B6UiYhU_.js";import{s as ae}from"./vendor-primevue.BN-meDW0.js";import{M as te}from"./MobileTopBar.BnL78WPy.js";import{M as se}from"./MobileBottomNav.Cp8OR33w.js";import{M as oe}from"./MobileDrawerMenu.DJ_STPbv.js";import{a as ne,u as le,c as ie,b as re}from"./sharedStores.Bb_IRn4Y.js";import{_ as K}from"./index.B8XI8FQW.js";import"./vendor-utils.CO3CyGpV.js";import"./vendor-export.BWjBvx7Z.js";const de={class:"maturity-card"},ue={class:"card-controls"},ce=["disabled"],me={key:0,class:"loading-state"},pe={key:1,class:"error-state"},ve={key:2,class:"maturity-content"},ye={key:0,class:"tab-content"},be={class:"maturity-list"},_e={class:"item-info"},he={class:"entity-name"},fe={class:"due-info"},ge={key:0,class:"overdue-days"},Ce={key:1,class:"due-date"},ke={class:"amount-bar"},we={class:"bar-container"},Se={class:"amount-value"},Me={key:0,class:"empty-state"},ze={class:"tab-summary"},Te={class:"summary-value clients-value"},De={key:1,class:"tab-content"},Ie={class:"maturity-list"},Oe={class:"item-info"},$e={class:"entity-name"},Re={class:"due-info"},xe={key:0,class:"overdue-days"},Pe={key:1,class:"due-date"},Ae={class:"amount-bar"},Ne={class:"bar-container"},Ve={class:"amount-value"},Be={key:0,class:"empty-state"},Le={class:"tab-summary"},Ee={class:"summary-value suppliers-value"},Fe={key:3,class:"balance-indicator"},Ue={class:"balance-content"},qe={class:"balance-text"},We={class:"balance-label"},Ke={key:0,class:"recommendations"},je={key:4,class:"card-footer"},Ge={class:"period-info"},Ye={class:"period-value"},He={class:"last-updated"},Je={class:"update-time"},Qe=["disabled"],Xe={__name:"MaturityAnalysisCard",props:{companyId:{type:[Number,String],required:!0},activeTab:{type:String,default:"clients",validator:w=>["clients","suppliers"].includes(w)}},emits:["periodChanged"],setup(w,{emit:D}){const S=w,m=D,k=ne(),g=h("1m"),d=h(!1),y=h(null),b=h(null),M=h({clients:[],suppliers:[],balance:0,recommendations:[]}),z=n=>n==null?"0,00 RON":new Intl.NumberFormat("ro-RO",{style:"currency",currency:"RON",minimumFractionDigits:0,maximumFractionDigits:0}).format(n),p=c(()=>M.value.clients||[]),_=c(()=>M.value.suppliers||[]),I=c(()=>M.value.recommendations||[]),R=c(()=>p.value.reduce((n,a)=>n+(a.amount||0),0)),x=c(()=>_.value.reduce((n,a)=>n+(a.amount||0),0)),T=c(()=>R.value-x.value),N=c(()=>T.value<0?"deficit":"surplus");c(()=>T.value<0?"📉":"📈");const V=c(()=>T.value<0?"Deficit estimat:":"Surplus estimat:"),B=c(()=>Math.max(...p.value.map(n=>n.amount||0),1)),r=c(()=>Math.max(..._.value.map(n=>n.amount||0),1)),t=(n,a)=>a>0?Math.min(n/a*100,100):0,P=n=>({"7d":"Toate restanțele + următoarele 7 zile","1m":"Toate restanțele + următoarea lună","3m":"Toate restanțele + următoarele 3 luni","6m":"Toate restanțele + următoarele 6 luni","12m":"Toate restanțele + următorul an",all:"Toate soldurile (fără filtru)"})[n]||n,C=n=>n?new Date(n).toLocaleString("ro-RO"):"Necunoscut",j=()=>{m("periodChanged",g.value),O()},G=()=>{O(!0)},O=async(n=!1)=>{if(!S.companyId){y.value="ID firmă necunoscut";return}d.value=!0,y.value=null;try{const a=await k.loadMaturityData(S.companyId,g.value);if(a&&a.success)M.value=a.data,b.value=new Date;else throw new Error((a==null?void 0:a.error)||"Eroare la încărcarea datelor")}catch(a){console.error("Failed to load maturity data:",a),y.value=a.message||"Eroare la încărcarea datelor. Vă rugăm încercați din nou."}finally{d.value=!1}};return Y(()=>S.companyId,n=>{n&&O()},{immediate:!1}),W(()=>{S.companyId&&O()}),(n,a)=>(s(),o("div",de,[e("div",ue,[H(e("select",{"onUpdate:modelValue":a[0]||(a[0]=l=>g.value=l),onChange:j,class:"period-selector",disabled:d.value},[...a[1]||(a[1]=[Q('',6)])],40,ce),[[J,g.value]])]),d.value?(s(),o("div",me,[...a[2]||(a[2]=[e("div",{class:"loading-spinner"},null,-1),e("p",null,"Se încarcă analiza scadențelor...",-1)])])):y.value?(s(),o("div",pe,[a[3]||(a[3]=e("div",{class:"error-icon"},"!",-1)),e("p",null,i(y.value),1),e("button",{onClick:O,class:"retry-btn"},"Încearcă din nou")])):(s(),o("div",ve,[w.activeTab==="clients"?(s(),o("div",ye,[e("div",be,[(s(!0),o(A,null,L(p.value,(l,$)=>(s(),o("div",{key:`client-${$}`,class:f(["maturity-item",{overdue:l.daysOverdue>0,critical:l.daysOverdue>30}])},[e("div",_e,[e("span",he,i(l.name),1),e("span",fe,[l.daysOverdue>0?(s(),o("span",ge," Restant "+i(l.daysOverdue)+" zile ",1)):(s(),o("span",Ce," Scadent în "+i(Math.abs(l.daysOverdue))+" zile ",1))])]),e("div",ke,[e("div",we,[e("div",{class:"bar-fill clients-bar",style:F({width:t(l.amount,B.value)+"%"})},null,4)]),e("span",Se,i(z(l.amount)),1)])],2))),128)),p.value.length===0?(s(),o("div",Me,[...a[4]||(a[4]=[e("i",{class:"pi pi-inbox empty-icon"},null,-1),e("p",null,"Nu există facturi de încasat pentru această perioadă",-1)])])):v("",!0)]),e("div",ze,[a[5]||(a[5]=e("span",{class:"summary-label"},"Total de încasat:",-1)),e("span",Te,i(z(R.value)),1)])])):w.activeTab==="suppliers"?(s(),o("div",De,[e("div",Ie,[(s(!0),o(A,null,L(_.value,(l,$)=>(s(),o("div",{key:`supplier-${$}`,class:f(["maturity-item",{overdue:l.daysOverdue>0,critical:l.daysOverdue>30}])},[e("div",Oe,[e("span",$e,i(l.name),1),e("span",Re,[l.daysOverdue>0?(s(),o("span",xe," Restant "+i(l.daysOverdue)+" zile ",1)):(s(),o("span",Pe," Scadent în "+i(Math.abs(l.daysOverdue))+" zile ",1))])]),e("div",Ae,[e("div",Ne,[e("div",{class:"bar-fill suppliers-bar",style:F({width:t(l.amount,r.value)+"%"})},null,4)]),e("span",Ve,i(z(l.amount)),1)])],2))),128)),_.value.length===0?(s(),o("div",Be,[...a[6]||(a[6]=[e("i",{class:"pi pi-inbox empty-icon"},null,-1),e("p",null,"Nu există facturi de plătit pentru această perioadă",-1)])])):v("",!0)]),e("div",Le,[a[7]||(a[7]=e("span",{class:"summary-label"},"Total de plătit:",-1)),e("span",Ee,i(z(x.value)),1)])])):v("",!0)])),!d.value&&!y.value?(s(),o("div",Fe,[e("div",Ue,[e("div",qe,[e("span",We,i(V.value),1),e("span",{class:f(["balance-amount",N.value])},i(z(Math.abs(T.value))),3)]),I.value.length>0?(s(),o("div",Ke,[e("details",null,[a[8]||(a[8]=e("summary",null,"Recomandări",-1)),e("ul",null,[(s(!0),o(A,null,L(I.value,(l,$)=>(s(),o("li",{key:$},i(l),1))),128))])])])):v("",!0)])])):v("",!0),!d.value&&!y.value?(s(),o("div",je,[e("div",Ge,[a[9]||(a[9]=e("span",{class:"period-label"},"Perioada analizată:",-1)),e("span",Ye,i(P(g.value)),1)]),e("div",He,[a[10]||(a[10]=e("span",{class:"update-label"},"Actualizat:",-1)),e("span",Je,i(C(b.value)),1),e("button",{onClick:G,class:"refresh-btn",disabled:d.value,title:"Reîmprospătează datele"},[e("i",{class:f(["pi pi-refresh refresh-icon",{spinning:d.value}])},null,2)],8,Qe)])])):v("",!0)]))}},Ze=K(Xe,[["__scopeId","data-v-116c373d"]]),ea={key:1,class:"mobile-tabs-container"},aa={class:"mobile-tabs"},ta={class:"app-container"},sa={key:0,class:"page-header"},oa={key:0,class:"desktop-tabs"},na={key:1,class:"empty-state"},la={key:2,class:"maturity-content"},q="maturity_analysis_active_tab",ia={__name:"MaturityAnalysisView",setup(w){const D=ee(),S=Z(),m=le(),k=ie(),g=re(),d=h(!1),y=h(window.innerWidth),b=c(()=>y.value<768),M=h(null),p=h(S.query.tab==="suppliers"||localStorage.getItem(q)==="suppliers"?"suppliers":"clients"),_=r=>{p.value=r,localStorage.setItem(q,r),D.replace({query:r==="suppliers"?{tab:"suppliers"}:{}})},I=()=>{y.value=window.innerWidth},R=()=>{D.push("/reports/dashboard")},x=async()=>{await k.logout(),D.push("/login")},T=async r=>{var t;await m.loadCompanies(),(t=m.selectedCompany)!=null&&t.id_firma&&await g.loadPeriods(m.selectedCompany.id_firma)},N=r=>{console.log("Company changed:",r==null?void 0:r.id_firma)},V=()=>{console.log("Period changed")},B=r=>{console.log("Maturity period changed:",r)};return W(()=>{window.addEventListener("resize",I)}),X(()=>{window.removeEventListener("resize",I)}),(r,t)=>{var P;return s(),o(A,null,[b.value?(s(),U(te,{key:0,title:"Scadențe","show-menu":!0,onMenuClick:t[0]||(t[0]=C=>d.value=!0)})):v("",!0),E(oe,{modelValue:d.value,"onUpdate:modelValue":t[1]||(t[1]=C=>d.value=C),user:u(k).user,"companies-store":u(m),"period-store":u(g),"available-servers":u(k).availableServers,"current-server-id":u(k).selectedServerId,"auth-store":u(k),onLogout:x,onCompanyChanged:N,onPeriodChanged:V,onServerSwitched:T},null,8,["modelValue","user","companies-store","period-store","available-servers","current-server-id","auth-store"]),b.value&&u(m).selectedCompany?(s(),o("div",ea,[e("div",aa,[e("button",{class:f(["mobile-tab",{active:p.value==="clients"}]),onClick:t[2]||(t[2]=C=>_("clients"))},[...t[6]||(t[6]=[e("span",{class:"tab-label"},"Clienți",-1)])],2),e("button",{class:f(["mobile-tab",{active:p.value==="suppliers"}]),onClick:t[3]||(t[3]=C=>_("suppliers"))},[...t[7]||(t[7]=[e("span",{class:"tab-label"},"Furnizori",-1)])],2)])])):v("",!0),e("main",{class:f(["main-content",{"mobile-layout":b.value,"has-tabs":b.value&&u(m).selectedCompany}])},[e("div",ta,[b.value?v("",!0):(s(),o("div",sa,[t[10]||(t[10]=e("div",{class:"header-top"},[e("div",null,[e("h1",{class:"page-title"},"Analiză Scadențe"),e("p",{class:"page-subtitle"},"Analiza scadențelor clienți și furnizori")])],-1)),u(m).selectedCompany?(s(),o("div",oa,[e("button",{class:f(["desktop-tab",{active:p.value==="clients"}]),onClick:t[4]||(t[4]=C=>_("clients"))},[...t[8]||(t[8]=[e("i",{class:"pi pi-users"},null,-1),e("span",null,"Clienți",-1)])],2),e("button",{class:f(["desktop-tab",{active:p.value==="suppliers"}]),onClick:t[5]||(t[5]=C=>_("suppliers"))},[...t[9]||(t[9]=[e("i",{class:"pi pi-building"},null,-1),e("span",null,"Furnizori",-1)])],2)])):v("",!0)])),u(m).selectedCompany?(s(),o("div",la,[E(Ze,{ref_key:"maturityCardRef",ref:M,companyId:(P=u(m).selectedCompany)==null?void 0:P.id_firma,activeTab:p.value,onPeriodChanged:B},null,8,["companyId","activeTab"])])):(s(),o("div",na,[t[11]||(t[11]=e("i",{class:"pi pi-building empty-icon"},null,-1)),t[12]||(t[12]=e("h2",{class:"empty-title"},"Selectați o companie",-1)),t[13]||(t[13]=e("p",{class:"empty-description"}," Pentru a vizualiza analiza scadențelor, vă rugăm să selectați o companie din Dashboard. ",-1)),E(u(ae),{label:"Mergi la Dashboard",icon:"pi pi-arrow-left",onClick:R,class:"empty-action"})]))])],2),b.value?(s(),U(se,{key:2})):v("",!0)],64)}}},_a=K(ia,[["__scopeId","data-v-be9da083"]]);export{_a as default}; -//# sourceMappingURL=MaturityAnalysisView.TP6afSul.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/MaturityAnalysisView.TP6afSul.js.map b/deploy-package-20260223-151231/frontend/assets/MaturityAnalysisView.TP6afSul.js.map deleted file mode 100644 index 1da8cb2..0000000 --- a/deploy-package-20260223-151231/frontend/assets/MaturityAnalysisView.TP6afSul.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MaturityAnalysisView.TP6afSul.js","sources":["../../src/modules/reports/components/dashboard/cards/MaturityAnalysisCard.vue","../../src/modules/reports/views/MaturityAnalysisView.vue"],"sourcesContent":["\n\n\n\n\n","\n\n\n\n\n"],"names":["props","__props","emit","__emit","dashboardStore","useDashboardStore","selectedPeriod","ref","isLoading","error","lastUpdated","maturityData","formatCurrency","value","clientsData","computed","suppliersData","recommendations","clientsTotal","sum","client","suppliersTotal","supplier","balance","balanceClass","balanceLabel","maxClientAmount","c","maxSupplierAmount","s","getBarWidth","amount","maxAmount","getPeriodLabel","period","formatLastUpdated","timestamp","handlePeriodChange","loadData","refreshData","forceRefresh","response","err","watch","newCompanyId","onMounted","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","$event","_hoisted_4","_cache","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_Fragment","_renderList","index","_hoisted_9","_hoisted_10","_toDisplayString","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_normalizeStyle","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_normalizeClass","_hoisted_37","rec","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","TAB_STORAGE_KEY","router","useRouter","route","useRoute","companyStore","useCompanyStore","authStore","useAuthStore","periodStore","useAccountingPeriodStore","showDrawer","windowWidth","isMobile","maturityCardRef","activeTab","switchTab","tab","handleResize","goBack","handleLogout","handleServerSwitched","newServerId","_a","handleCompanyChanged","company","handlePeriodChanged","onUnmounted","_createBlock","MobileTopBar","_createVNode","MobileDrawerMenu","_unref","_hoisted_3","MaturityAnalysisCard","Button","MobileBottomNav"],"mappings":"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"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/MobileBottomNav.BzpqP4Mz.css b/deploy-package-20260223-151231/frontend/assets/MobileBottomNav.BzpqP4Mz.css deleted file mode 100644 index ceda595..0000000 --- a/deploy-package-20260223-151231/frontend/assets/MobileBottomNav.BzpqP4Mz.css +++ /dev/null @@ -1 +0,0 @@ -.mobile-bottom-nav[data-v-d64cc71a]{position:fixed;bottom:0;left:0;right:0;height:56px;background:var(--surface-card);border-top:1px solid var(--surface-border);display:flex;align-items:stretch;justify-content:space-around;z-index:var(--z-fixed);box-shadow:0 -2px 8px #00000014}.bottom-nav-item[data-v-d64cc71a]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-xs);color:var(--text-color-secondary);text-decoration:none;font-size:var(--text-xs);font-weight:var(--font-medium);background:none;border:none;cursor:pointer;transition:color var(--transition-fast);padding:var(--space-xs);min-width:48px}.bottom-nav-item i[data-v-d64cc71a]{font-size:var(--text-xl)}.bottom-nav-item[data-v-d64cc71a]:active{background:var(--surface-hover)}.bottom-nav-item.active[data-v-d64cc71a],.bottom-nav-item.router-link-active[data-v-d64cc71a],.bottom-nav-item.active i[data-v-d64cc71a],.bottom-nav-item.router-link-active i[data-v-d64cc71a]{color:var(--color-primary)}[data-theme=dark] .mobile-bottom-nav[data-v-d64cc71a]{background:var(--surface-card);border-top-color:var(--surface-border);box-shadow:0 -2px 8px #0000004d}[data-theme=dark] .bottom-nav-item[data-v-d64cc71a]{color:var(--text-color-secondary)}[data-theme=dark] .bottom-nav-item[data-v-d64cc71a]:active{background:var(--surface-hover)}[data-theme=dark] .bottom-nav-item.active[data-v-d64cc71a],[data-theme=dark] .bottom-nav-item.router-link-active[data-v-d64cc71a]{color:var(--blue-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .mobile-bottom-nav[data-v-d64cc71a]{background:var(--surface-card);border-top-color:var(--surface-border);box-shadow:0 -2px 8px #0000004d}:root:not([data-theme]) .bottom-nav-item[data-v-d64cc71a]{color:var(--text-color-secondary)}:root:not([data-theme]) .bottom-nav-item[data-v-d64cc71a]:active{background:var(--surface-hover)}:root:not([data-theme]) .bottom-nav-item.active[data-v-d64cc71a],:root:not([data-theme]) .bottom-nav-item.router-link-active[data-v-d64cc71a]{color:var(--blue-400)}} diff --git a/deploy-package-20260223-151231/frontend/assets/MobileBottomNav.Cp8OR33w.js b/deploy-package-20260223-151231/frontend/assets/MobileBottomNav.Cp8OR33w.js deleted file mode 100644 index bf45e5f..0000000 --- a/deploy-package-20260223-151231/frontend/assets/MobileBottomNav.Cp8OR33w.js +++ /dev/null @@ -1,2 +0,0 @@ -import{_ as u}from"./index.B8XI8FQW.js";import{c as s,d as o,F as l,B as b,h as _,p as v,e as n,u as i,v as r,k as d}from"./vendor-core.B6UiYhU_.js";const m={class:"mobile-bottom-nav"},k=["onClick"],y={__name:"MobileBottomNav",props:{items:{type:Array,default:()=>[{to:"/dashboard",icon:"pi pi-home",label:"Dashboard"},{to:"/data-entry",icon:"pi pi-shopping-bag",label:"Bonuri"},{to:"/reports/invoices",icon:"pi pi-file-edit",label:"Facturi"},{to:"/settings",icon:"pi pi-cog",label:"Setări"}],validator:e=>Array.isArray(e)&&e.every(a=>typeof a.icon=="string"&&typeof a.label=="string")}},emits:["item-click"],setup(e){return(a,f)=>{const c=d("router-link");return o(),s("nav",m,[(o(!0),s(l,null,b(e.items,(t,p)=>(o(),s(l,{key:p},[t.to?(o(),_(c,{key:0,to:t.to,class:i(["bottom-nav-item",{active:t.active}])},{default:v(()=>[n("i",{class:i(t.icon)},null,2),n("span",null,r(t.label),1)]),_:2},1032,["to","class"])):(o(),s("button",{key:1,type:"button",class:i(["bottom-nav-item",{active:t.active}]),onClick:h=>a.$emit("item-click",t)},[n("i",{class:i(t.icon)},null,2),n("span",null,r(t.label),1)],10,k))],64))),128))])}}},C=u(y,[["__scopeId","data-v-d64cc71a"]]);export{C as M}; -//# sourceMappingURL=MobileBottomNav.Cp8OR33w.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/MobileBottomNav.Cp8OR33w.js.map b/deploy-package-20260223-151231/frontend/assets/MobileBottomNav.Cp8OR33w.js.map deleted file mode 100644 index 5c2c09e..0000000 --- a/deploy-package-20260223-151231/frontend/assets/MobileBottomNav.Cp8OR33w.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MobileBottomNav.Cp8OR33w.js","sources":["../../src/shared/components/mobile/MobileBottomNav.vue"],"sourcesContent":["\n\n\n\n\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_Fragment","_renderList","__props","item","index","_createBlock","_component_router_link","_normalizeClass","_createElementVNode","_toDisplayString","$event","$emit"],"mappings":"ipBACE,OAAAA,EAAA,EAAAC,EAyBM,MAzBNC,EAyBM,EAxBJF,EAAA,EAAA,EAAAC,EAuBWE,EAAA,KAAAC,EAvBuBC,EAAA,MAAK,CAArBC,EAAMC,kBAAuBA,GAAK,CAG1CD,EAAK,QADbE,EAQcC,EAAA,OANX,GAAIH,EAAK,GACV,MAAKI,EAAA,CAAC,kBAAiB,CAAA,OACHJ,EAAK,OAAM,CAAA,cAE/B,IAA0B,CAA1BK,EAA0B,IAAA,CAAtB,MAAKD,EAAEJ,EAAK,IAAI,WACpBK,EAA6B,OAAA,KAAAC,EAApBN,EAAK,KAAK,EAAA,CAAA,oCAIrBL,EASS,SAAA,OAPP,KAAK,SACL,MAAKS,EAAA,CAAC,kBAAiB,CAAA,OACHJ,EAAK,MAAM,CAAA,CAAA,EAC9B,QAAKO,GAAEC,EAAAA,MAAK,aAAeR,CAAI,IAEhCK,EAA0B,IAAA,CAAtB,MAAKD,EAAEJ,EAAK,IAAI,WACpBK,EAA6B,OAAA,KAAAC,EAApBN,EAAK,KAAK,EAAA,CAAA"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/MobileDrawerMenu.CIJr_XOZ.css b/deploy-package-20260223-151231/frontend/assets/MobileDrawerMenu.CIJr_XOZ.css deleted file mode 100644 index f58badb..0000000 --- a/deploy-package-20260223-151231/frontend/assets/MobileDrawerMenu.CIJr_XOZ.css +++ /dev/null @@ -1 +0,0 @@ -.drawer-overlay[data-v-7ea89962]{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;z-index:var(--z-modal-backdrop);display:flex;align-items:stretch;justify-content:flex-start}.drawer-menu[data-v-7ea89962]{width:280px;max-width:85vw;height:100%;min-height:60vh;background:var(--surface-card);box-shadow:var(--shadow-xl);display:flex;flex-direction:column;overflow-y:auto;overflow-x:hidden;-webkit-overflow-scrolling:touch;z-index:var(--z-modal)}.drawer-header[data-v-7ea89962]{padding:var(--space-lg) var(--space-md);border-bottom:1px solid var(--surface-border);background:var(--surface-ground)}.drawer-logo[data-v-7ea89962]{display:flex;align-items:center;gap:var(--space-sm)}.drawer-logo i[data-v-7ea89962]{font-size:var(--text-2xl);color:var(--color-primary)}.logo-text[data-v-7ea89962]{font-size:var(--text-xl);font-weight:var(--font-bold);color:var(--text-color)}.drawer-selectors[data-v-7ea89962]{padding:var(--space-md);display:flex;flex-direction:column;gap:var(--space-sm);background:var(--surface-ground)}.selector-group[data-v-7ea89962]{position:relative}.selector-label[data-v-7ea89962]{display:block;font-size:var(--text-xs);font-weight:var(--font-medium);color:var(--text-color-secondary);margin-bottom:var(--space-xs);text-transform:uppercase;letter-spacing:.05em}.selector-trigger[data-v-7ea89962]{display:flex;align-items:center;justify-content:space-between;width:100%;padding:var(--space-sm) var(--space-md);background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-md);cursor:pointer;transition:border-color var(--transition-fast),background var(--transition-fast);min-height:48px;text-align:left}.selector-trigger[data-v-7ea89962]:hover{border-color:var(--color-primary);background:var(--surface-hover)}.selector-value[data-v-7ea89962]{display:flex;flex-direction:column;min-width:0;flex:1}.selector-main[data-v-7ea89962]{font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.selector-sub[data-v-7ea89962]{font-size:var(--text-xs);color:var(--text-color-secondary);margin-top:2px}.selector-trigger .pi-chevron-down[data-v-7ea89962]{font-size:var(--text-xs);color:var(--text-color-secondary);transition:transform var(--transition-fast);flex-shrink:0}.selector-trigger .rotate-180[data-v-7ea89962]{transform:rotate(180deg)}.selector-panel[data-v-7ea89962]{position:absolute;top:100%;left:0;right:0;margin-top:var(--space-xs);background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-md);box-shadow:var(--shadow-lg);z-index:10;max-height:250px;overflow:hidden}.selector-search[data-v-7ea89962]{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm);border-bottom:1px solid var(--surface-border)}.selector-search .pi-search[data-v-7ea89962]{color:var(--text-color-secondary);font-size:var(--text-sm)}.selector-search-input[data-v-7ea89962]{flex:1;border:none;background:transparent;font-size:var(--text-sm);color:var(--text-color);outline:none}.selector-search-input[data-v-7ea89962]::placeholder{color:var(--text-color-secondary)}.selector-list[data-v-7ea89962]{max-height:200px;overflow-y:auto;-webkit-overflow-scrolling:touch}.selector-item[data-v-7ea89962]{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);cursor:pointer;transition:background var(--transition-fast);min-height:48px;border-bottom:1px solid var(--surface-border)}.selector-item[data-v-7ea89962]:last-child{border-bottom:none}.selector-item[data-v-7ea89962]:hover{background:var(--surface-hover)}.selector-item.active[data-v-7ea89962]{background:var(--blue-50);color:var(--color-primary)}.selector-item.active .pi-check[data-v-7ea89962]{color:var(--color-primary)}.selector-item-content[data-v-7ea89962]{display:flex;flex-direction:column;min-width:0;flex:1}.selector-item-name[data-v-7ea89962]{font-size:var(--text-sm);font-weight:var(--font-medium);color:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.selector-item-sub[data-v-7ea89962]{font-size:var(--text-xs);color:var(--text-color-secondary);margin-top:2px}.selector-item .pi-check[data-v-7ea89962]{font-size:var(--text-sm);flex-shrink:0}.selector-empty[data-v-7ea89962]{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-lg);color:var(--text-color-secondary);font-size:var(--text-sm)}.drawer-sections[data-v-7ea89962]{padding:var(--space-sm) 0}.drawer-section[data-v-7ea89962]{padding:var(--space-xs) 0}.section-header[data-v-7ea89962]{padding:var(--space-sm) var(--space-lg);font-size:var(--text-xs);font-weight:var(--font-semibold);color:var(--text-color-secondary);text-transform:uppercase;letter-spacing:.05em}.drawer-nav[data-v-7ea89962]{list-style:none;margin:0;padding:0}.drawer-link[data-v-7ea89962]{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-md) var(--space-lg);color:var(--text-color);text-decoration:none;font-size:var(--text-base);font-weight:var(--font-medium);min-height:48px;transition:background var(--transition-fast),color var(--transition-fast);cursor:pointer;border:none;background:none;width:100%;text-align:left}.drawer-link[data-v-7ea89962]:hover,.drawer-link[data-v-7ea89962]:active{background:var(--surface-hover)}.drawer-link.active[data-v-7ea89962]{background:var(--blue-50);color:var(--color-primary)}.drawer-link.active .drawer-icon[data-v-7ea89962]{color:var(--color-primary)}.drawer-icon[data-v-7ea89962]{font-size:var(--text-xl);width:24px;text-align:center;color:var(--text-color-secondary);flex-shrink:0}.drawer-label[data-v-7ea89962]{flex:1}.drawer-divider[data-v-7ea89962]{height:1px;background:var(--surface-border);margin:var(--space-xs) var(--space-md)}.drawer-profile[data-v-7ea89962]{padding:var(--space-sm) var(--space-md);border-top:1px solid var(--surface-border);padding-bottom:calc(var(--header-height) + var(--space-sm));display:flex;flex-direction:column;gap:var(--space-xs)}.drawer-profile--compact[data-v-7ea89962]{padding:var(--space-sm) var(--space-md);padding-bottom:calc(56px + var(--space-md));gap:var(--space-xs)}.profile-row[data-v-7ea89962]{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm);min-height:44px}.profile-user[data-v-7ea89962]{display:flex;align-items:center;gap:var(--space-sm);min-width:0;flex:1}.profile-icon[data-v-7ea89962]{font-size:var(--text-base);color:var(--color-primary);flex-shrink:0}.profile-name[data-v-7ea89962]{font-size:var(--text-sm);font-weight:var(--font-semibold);color:var(--text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.logout-btn[data-v-7ea89962]{display:flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:transparent;border:1px solid var(--color-error);border-radius:var(--radius-md);color:var(--color-error);font-size:var(--text-sm);font-weight:var(--font-medium);cursor:pointer;transition:background var(--transition-fast),color var(--transition-fast);min-height:36px;flex-shrink:0}.logout-btn[data-v-7ea89962]:hover{background:var(--red-50)}.logout-btn[data-v-7ea89962]:active{background:var(--red-100)}.logout-btn i[data-v-7ea89962]{font-size:var(--text-sm)}.theme-toggle-compact[data-v-7ea89962]{display:flex;align-items:center;gap:var(--space-sm);width:100%;padding:var(--space-xs) var(--space-sm);background:var(--surface-hover);border:none;border-radius:var(--radius-md);color:var(--text-color);font-size:var(--text-sm);cursor:pointer;transition:background var(--transition-fast);min-height:36px}.theme-toggle-compact[data-v-7ea89962]:hover{background:var(--surface-border)}.theme-toggle-compact i[data-v-7ea89962]:first-child{color:var(--color-primary);font-size:var(--text-sm)}.theme-toggle-compact span[data-v-7ea89962]{flex:1;text-align:left}.theme-toggle-compact i[data-v-7ea89962]:last-child{font-size:var(--text-xs);color:var(--text-color-secondary);opacity:.6}.drawer-enter-active[data-v-7ea89962],.drawer-leave-active[data-v-7ea89962]{transition:opacity var(--transition-normal)}.drawer-enter-active .drawer-menu[data-v-7ea89962],.drawer-leave-active .drawer-menu[data-v-7ea89962]{transition:transform var(--transition-normal)}.drawer-enter-from[data-v-7ea89962],.drawer-leave-to[data-v-7ea89962]{opacity:0}.drawer-enter-from .drawer-menu[data-v-7ea89962],.drawer-leave-to .drawer-menu[data-v-7ea89962]{transform:translate(-100%)}.drawer-enter-to[data-v-7ea89962],.drawer-leave-from[data-v-7ea89962]{opacity:1}.drawer-enter-to .drawer-menu[data-v-7ea89962],.drawer-leave-from .drawer-menu[data-v-7ea89962]{transform:translate(0)}[data-theme=dark] .drawer-overlay[data-v-7ea89962]{background:#000000b3}[data-theme=dark] .drawer-menu[data-v-7ea89962]{background:var(--surface-card);box-shadow:4px 0 24px #0006}[data-theme=dark] .drawer-header[data-v-7ea89962]{background:var(--surface-ground);border-bottom-color:var(--surface-border)}[data-theme=dark] .drawer-logo i[data-v-7ea89962]{color:var(--blue-400)}[data-theme=dark] .logo-text[data-v-7ea89962]{color:var(--text-color)}[data-theme=dark] .drawer-selectors[data-v-7ea89962]{background:var(--surface-ground)}[data-theme=dark] .selector-label[data-v-7ea89962]{color:var(--text-color-secondary)}[data-theme=dark] .selector-trigger[data-v-7ea89962]{background:var(--surface-card);border-color:var(--surface-border)}[data-theme=dark] .selector-trigger[data-v-7ea89962]:hover{background:var(--surface-hover);border-color:var(--blue-400)}[data-theme=dark] .selector-main[data-v-7ea89962]{color:var(--text-color)}[data-theme=dark] .selector-sub[data-v-7ea89962],[data-theme=dark] .selector-trigger .pi-chevron-down[data-v-7ea89962]{color:var(--text-color-secondary)}[data-theme=dark] .selector-panel[data-v-7ea89962]{background:var(--surface-card);border-color:var(--surface-border);box-shadow:0 8px 24px #0006}[data-theme=dark] .selector-search[data-v-7ea89962]{border-bottom-color:var(--surface-border)}[data-theme=dark] .selector-search .pi-search[data-v-7ea89962]{color:var(--text-color-secondary)}[data-theme=dark] .selector-search-input[data-v-7ea89962]{color:var(--text-color)}[data-theme=dark] .selector-search-input[data-v-7ea89962]::placeholder{color:var(--text-color-secondary)}[data-theme=dark] .selector-item[data-v-7ea89962]{border-bottom-color:var(--surface-border)}[data-theme=dark] .selector-item[data-v-7ea89962]:hover{background:var(--surface-hover)}[data-theme=dark] .selector-item.active[data-v-7ea89962]{background:var(--blue-900);color:var(--blue-400)}[data-theme=dark] .selector-item.active .pi-check[data-v-7ea89962]{color:var(--blue-400)}[data-theme=dark] .selector-item-name[data-v-7ea89962]{color:var(--text-color)}[data-theme=dark] .selector-item.active .selector-item-name[data-v-7ea89962]{color:var(--blue-400)}[data-theme=dark] .selector-item-sub[data-v-7ea89962],[data-theme=dark] .selector-empty[data-v-7ea89962]{color:var(--text-color-secondary)}[data-theme=dark] .drawer-link[data-v-7ea89962]{color:var(--text-color)}[data-theme=dark] .drawer-link[data-v-7ea89962]:hover{background:var(--surface-hover)}[data-theme=dark] .drawer-link.active[data-v-7ea89962]{background:var(--blue-900);color:var(--blue-400)}[data-theme=dark] .drawer-link.active .drawer-icon[data-v-7ea89962]{color:var(--blue-400)}[data-theme=dark] .drawer-icon[data-v-7ea89962]{color:var(--text-color-secondary)}[data-theme=dark] .drawer-divider[data-v-7ea89962]{background:var(--surface-border)}[data-theme=dark] .section-header[data-v-7ea89962]{color:var(--text-color-secondary)}[data-theme=dark] .drawer-profile[data-v-7ea89962]{border-top-color:var(--surface-border)}[data-theme=dark] .profile-icon[data-v-7ea89962]{color:var(--blue-400)}[data-theme=dark] .profile-name[data-v-7ea89962]{color:var(--text-color)}[data-theme=dark] .logout-btn[data-v-7ea89962]{border-color:var(--red-400);color:var(--red-400)}[data-theme=dark] .logout-btn[data-v-7ea89962]:hover{background:var(--red-900)}[data-theme=dark] .logout-btn[data-v-7ea89962]:active{background:var(--red-800)}[data-theme=dark] .theme-toggle-compact[data-v-7ea89962]{background:var(--surface-hover);color:var(--text-color)}[data-theme=dark] .theme-toggle-compact[data-v-7ea89962]:hover{background:var(--surface-border)}[data-theme=dark] .theme-toggle-compact i[data-v-7ea89962]:first-child{color:var(--blue-400)}[data-theme=dark] .theme-toggle-compact i[data-v-7ea89962]:last-child{color:var(--text-color-secondary)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .drawer-overlay[data-v-7ea89962]{background:#000000b3}:root:not([data-theme]) .drawer-menu[data-v-7ea89962]{background:var(--surface-card);box-shadow:4px 0 24px #0006}:root:not([data-theme]) .drawer-header[data-v-7ea89962]{background:var(--surface-ground);border-bottom-color:var(--surface-border)}:root:not([data-theme]) .drawer-logo i[data-v-7ea89962]{color:var(--blue-400)}:root:not([data-theme]) .logo-text[data-v-7ea89962]{color:var(--text-color)}:root:not([data-theme]) .drawer-selectors[data-v-7ea89962]{background:var(--surface-ground)}:root:not([data-theme]) .selector-label[data-v-7ea89962]{color:var(--text-color-secondary)}:root:not([data-theme]) .selector-trigger[data-v-7ea89962]{background:var(--surface-card);border-color:var(--surface-border)}:root:not([data-theme]) .selector-trigger[data-v-7ea89962]:hover{background:var(--surface-hover);border-color:var(--blue-400)}:root:not([data-theme]) .selector-main[data-v-7ea89962]{color:var(--text-color)}:root:not([data-theme]) .selector-sub[data-v-7ea89962]{color:var(--text-color-secondary)}:root:not([data-theme]) .selector-trigger .pi-chevron-down[data-v-7ea89962]{color:var(--text-color-secondary)}:root:not([data-theme]) .selector-panel[data-v-7ea89962]{background:var(--surface-card);border-color:var(--surface-border);box-shadow:0 8px 24px #0006}:root:not([data-theme]) .selector-search[data-v-7ea89962]{border-bottom-color:var(--surface-border)}:root:not([data-theme]) .selector-search .pi-search[data-v-7ea89962]{color:var(--text-color-secondary)}:root:not([data-theme]) .selector-search-input[data-v-7ea89962]{color:var(--text-color)}:root:not([data-theme]) .selector-search-input[data-v-7ea89962]::placeholder{color:var(--text-color-secondary)}:root:not([data-theme]) .selector-item[data-v-7ea89962]{border-bottom-color:var(--surface-border)}:root:not([data-theme]) .selector-item[data-v-7ea89962]:hover{background:var(--surface-hover)}:root:not([data-theme]) .selector-item.active[data-v-7ea89962]{background:var(--blue-900);color:var(--blue-400)}:root:not([data-theme]) .selector-item.active .pi-check[data-v-7ea89962]{color:var(--blue-400)}:root:not([data-theme]) .selector-item-name[data-v-7ea89962]{color:var(--text-color)}:root:not([data-theme]) .selector-item.active .selector-item-name[data-v-7ea89962]{color:var(--blue-400)}:root:not([data-theme]) .selector-item-sub[data-v-7ea89962]{color:var(--text-color-secondary)}:root:not([data-theme]) .selector-empty[data-v-7ea89962]{color:var(--text-color-secondary)}:root:not([data-theme]) .drawer-link[data-v-7ea89962]{color:var(--text-color)}:root:not([data-theme]) .drawer-link[data-v-7ea89962]:hover{background:var(--surface-hover)}:root:not([data-theme]) .drawer-link.active[data-v-7ea89962]{background:var(--blue-900);color:var(--blue-400)}:root:not([data-theme]) .drawer-link.active .drawer-icon[data-v-7ea89962]{color:var(--blue-400)}:root:not([data-theme]) .drawer-icon[data-v-7ea89962]{color:var(--text-color-secondary)}:root:not([data-theme]) .drawer-divider[data-v-7ea89962]{background:var(--surface-border)}:root:not([data-theme]) .section-header[data-v-7ea89962]{color:var(--text-color-secondary)}:root:not([data-theme]) .drawer-profile[data-v-7ea89962]{border-top-color:var(--surface-border)}:root:not([data-theme]) .profile-icon[data-v-7ea89962]{color:var(--blue-400)}:root:not([data-theme]) .profile-name[data-v-7ea89962]{color:var(--text-color)}:root:not([data-theme]) .logout-btn[data-v-7ea89962]{border-color:var(--red-400);color:var(--red-400)}:root:not([data-theme]) .logout-btn[data-v-7ea89962]:hover{background:var(--red-900)}:root:not([data-theme]) .logout-btn[data-v-7ea89962]:active{background:var(--red-800)}:root:not([data-theme]) .theme-toggle-compact[data-v-7ea89962]{background:var(--surface-hover);color:var(--text-color)}:root:not([data-theme]) .theme-toggle-compact[data-v-7ea89962]:hover{background:var(--surface-border)}:root:not([data-theme]) .theme-toggle-compact i[data-v-7ea89962]:first-child{color:var(--blue-400)}:root:not([data-theme]) .theme-toggle-compact i[data-v-7ea89962]:last-child{color:var(--text-color-secondary)}}.mobile-server-switch-modal[data-v-7ea89962] .p-dialog{border-radius:var(--radius-lg);background:var(--surface-card)}.mobile-server-switch-modal[data-v-7ea89962] .p-dialog-header{padding:var(--space-md) var(--space-lg);border-bottom:1px solid var(--surface-border)}.mobile-server-switch-modal[data-v-7ea89962] .p-dialog-content{padding:var(--space-lg)}.mobile-server-switch-modal[data-v-7ea89962] .p-dialog-footer{padding:var(--space-md) var(--space-lg);border-top:1px solid var(--surface-border);display:flex;gap:var(--space-sm);justify-content:flex-end}.server-switch-modal-content[data-v-7ea89962]{display:flex;flex-direction:column;gap:var(--space-md)}.server-switch-modal-content[data-v-7ea89962] .p-password,.server-switch-modal-content[data-v-7ea89962] .p-password input{width:100%}.switch-error[data-v-7ea89962]{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);background:var(--red-50);color:var(--red-600);border-radius:var(--radius-md);font-size:var(--text-sm)}.switch-error i[data-v-7ea89962]{font-size:1rem}[data-theme=dark] .switch-error[data-v-7ea89962]{background:#ef444426;color:var(--red-400)} diff --git a/deploy-package-20260223-151231/frontend/assets/MobileDrawerMenu.DJ_STPbv.js b/deploy-package-20260223-151231/frontend/assets/MobileDrawerMenu.DJ_STPbv.js deleted file mode 100644 index ba56081..0000000 --- a/deploy-package-20260223-151231/frontend/assets/MobileDrawerMenu.DJ_STPbv.js +++ /dev/null @@ -1,2 +0,0 @@ -import{a as v,j as _,w as pe,o as me,h as he,d as l,q as b,p as g,c as o,i as n,e,v as c,u,t as fe,L as be,F as C,B as x,k as we,E as _e,s as ye,O as E,H as Se,T as ke,n as ge,M as Ce,P as xe}from"./vendor-core.B6UiYhU_.js";import{c as Ie,s as K,d as Me}from"./vendor-primevue.BN-meDW0.js";import{_ as De}from"./index.B8XI8FQW.js";const Ae={key:0,class:"drawer-selectors"},Pe={class:"selector-group"},Ne=["aria-expanded"],Oe={class:"selector-value"},Te={class:"selector-main"},Ee={key:0,class:"selector-sub"},Le={key:0,class:"selector-panel"},Ve={class:"selector-search"},Be={class:"selector-list"},Re=["onClick"],$e={class:"selector-item-content"},Fe={class:"selector-item-name"},Ue={key:0,class:"selector-item-sub"},je={key:0,class:"pi pi-check"},ze={key:0,class:"selector-empty"},We={key:0,class:"selector-group"},qe=["aria-expanded"],Ke={class:"selector-value"},He={class:"selector-main"},Qe={key:0,class:"selector-panel"},Ze={class:"selector-list"},Ge=["onClick"],Je={class:"selector-item-name"},Xe={key:0,class:"pi pi-check"},Ye={key:0,class:"selector-empty"},es={key:1,class:"selector-group"},ss=["aria-expanded"],as={class:"selector-value"},ts={class:"selector-main"},ls={key:0,class:"selector-panel"},os={class:"selector-list"},rs=["onClick"],is={class:"selector-item-name"},ns={key:0,class:"pi pi-check"},cs={key:1,class:"drawer-divider"},us={class:"drawer-sections"},ds={class:"drawer-section"},vs={class:"drawer-nav"},ps={class:"drawer-label"},ms={class:"drawer-section"},hs={class:"drawer-nav"},fs={class:"drawer-label"},bs={class:"drawer-section"},ws={class:"drawer-nav"},_s={class:"drawer-label"},ys={class:"drawer-section"},Ss={class:"drawer-nav"},ks={class:"drawer-label"},gs={class:"drawer-profile drawer-profile--compact"},Cs={class:"profile-row"},xs={class:"profile-user"},Is={class:"profile-name"},Ms=["aria-label"],Ds={class:"server-switch-modal-content"},As={key:0,class:"switch-error"},Ps={__name:"MobileDrawerMenu",props:{modelValue:{type:Boolean,default:!1},user:{type:Object,default:()=>null},onLogout:{type:Function,default:null},companiesStore:{type:Object,default:null},periodStore:{type:Object,default:null},availableServers:{type:Array,default:()=>[]},currentServerId:{type:String,default:""},authStore:{type:Object,default:null}},emits:["update:modelValue","logout","company-changed","period-changed","server-switch","server-switched"],setup(d,{emit:H}){const r=d,I=H,B=Ce();xe();const Q=v(null),p=v(!1),y=v(""),R=v(null),m=v(!1),h=v(!1),M=v(!1),w=v(""),P=v(""),$=v(""),S=v(!1),f=v(""),Z=_(()=>{var a,s;return((s=(a=r.companiesStore)==null?void 0:a.selectedCompany)==null?void 0:s.name)||"Selectare firmă"}),F=_(()=>{var s,i;const a=(i=(s=r.companiesStore)==null?void 0:s.selectedCompany)==null?void 0:i.fiscal_code;return a?`CUI: ${a}`:""}),U=_(()=>{var i,t;const a=((i=r.companiesStore)==null?void 0:i.companies)||[];if(!((t=y.value)!=null&&t.trim()))return a;const s=y.value.toLowerCase().trim();return a.filter(k=>{var A,V;return((A=k.name)==null?void 0:A.toLowerCase().includes(s))||((V=k.fiscal_code)==null?void 0:V.toLowerCase().includes(s))})}),G=_(()=>{var a,s;return((s=(a=r.periodStore)==null?void 0:a.selectedPeriod)==null?void 0:s.display_name)||"Selectare perioadă"}),j=_(()=>{var a;return((a=r.periodStore)==null?void 0:a.periods)||[]}),J=async()=>{var a;p.value=!p.value,m.value=!1,h.value=!1,p.value&&(y.value="",await ge(),(a=R.value)==null||a.focus())},X=a=>{r.companiesStore&&(r.companiesStore.setSelectedCompany(a),I("company-changed",a)),p.value=!1,y.value=""},Y=()=>{m.value=!m.value,p.value=!1,h.value=!1},z=a=>{var i;const s=(i=r.periodStore)==null?void 0:i.selectedPeriod;return s?a.an===s.an&&a.luna===s.luna:!1},ee=a=>{r.periodStore&&(r.periodStore.setSelectedPeriod(a),I("period-changed",a)),m.value=!1},se=_(()=>{var s;const a=(s=r.availableServers)==null?void 0:s.find(i=>i.id===r.currentServerId);return(a==null?void 0:a.name)||"Selectare server"}),ae=()=>{h.value=!h.value,p.value=!1,m.value=!1},te=a=>{a.id!==r.currentServerId&&(P.value=a.id,$.value=a.name,w.value="",f.value="",S.value=!1,M.value=!0),h.value=!1},le=()=>{M.value=!1,w.value="",f.value=""},W=async()=>{var a;if(!w.value||!P.value){f.value="Introduceți parola";return}if(!((a=r.authStore)!=null&&a.switchServer)){f.value="Eroare: authStore nu este disponibil";return}S.value=!0,f.value="";try{const s=await r.authStore.switchServer(P.value,w.value);s.success?(M.value=!1,w.value="",I("server-switched",P.value),O()):f.value=s.error||"Autentificare eșuată"}catch(s){f.value=s.message||"Eroare la schimbarea serverului"}finally{S.value=!1}};pe(()=>r.modelValue,a=>{a||(p.value=!1,m.value=!1,h.value=!1,y.value="")});const oe=[{to:"/dashboard",icon:"pi pi-home",label:"Dashboard",exactMatch:!0},{to:"/data-entry",icon:"pi pi-shopping-bag",label:"Bonuri",exactMatch:!1}],re=[{to:"/reports/invoices",icon:"pi pi-file",label:"Facturi",exactMatch:!0},{to:"/reports/trial-balance",icon:"pi pi-calculator",label:"Balanță",exactMatch:!0},{to:"/reports/cash",icon:"pi pi-wallet",label:"Casă",exactMatch:!0},{to:"/reports/bank",icon:"pi pi-building",label:"Bancă",exactMatch:!0}],ie=[{to:"/reports/maturity-analysis",icon:"pi pi-clock",label:"Scadențe",exactMatch:!0},{to:"/reports/detailed-invoices",icon:"pi pi-list",label:"Facturi Detaliate",exactMatch:!0}],ne=[{to:"/settings",icon:"pi pi-cog",label:"Setări",exactMatch:!1}],ce=_(()=>{var a;return((a=r.user)==null?void 0:a.username)||"Utilizator"}),N=(a,s)=>s?B.path===a:B.path.startsWith(a),O=()=>{I("update:modelValue",!1)},T=()=>{O()},ue=async()=>{r.onLogout?await r.onLogout():I("logout"),O()},D=v("auto"),q=[{value:"auto",icon:"pi pi-desktop",label:"Auto (sistem)"},{value:"light",icon:"pi pi-sun",label:"Light"},{value:"dark",icon:"pi pi-moon",label:"Dark"}],L=_(()=>q.find(a=>a.value===D.value)||q[0]),de=a=>{a==="auto"?(document.documentElement.removeAttribute("data-theme"),localStorage.removeItem("user-theme")):(document.documentElement.setAttribute("data-theme",a),localStorage.setItem("user-theme",a))},ve=()=>{const a=["auto","light","dark"],s=a.indexOf(D.value),i=a[(s+1)%a.length];D.value=i,de(i)};return me(()=>{const a=localStorage.getItem("user-theme");a==="light"||a==="dark"?D.value=a:D.value="auto"}),(a,s)=>{const i=we("router-link");return l(),he(ke,{to:"body"},[b(ye,{name:"drawer"},{default:g(()=>[d.modelValue?(l(),o("div",{key:0,class:"drawer-overlay",onClick:_e(O,["self"])},[e("nav",{class:"drawer-menu",ref_key:"drawerRef",ref:Q},[s[19]||(s[19]=e("div",{class:"drawer-header"},[e("div",{class:"drawer-logo"},[e("i",{class:"pi pi-building"}),e("span",{class:"logo-text"},"ROA2WEB")])],-1)),d.companiesStore?(l(),o("div",Ae,[e("div",Pe,[s[5]||(s[5]=e("label",{class:"selector-label"},"Firma",-1)),e("button",{class:"selector-trigger",onClick:J,"aria-expanded":p.value},[e("div",Oe,[e("span",Te,c(Z.value),1),F.value?(l(),o("span",Ee,c(F.value),1)):n("",!0)]),e("i",{class:u(["pi pi-chevron-down",{"rotate-180":p.value}])},null,2)],8,Ne),p.value?(l(),o("div",Le,[e("div",Ve,[s[3]||(s[3]=e("i",{class:"pi pi-search"},null,-1)),fe(e("input",{ref_key:"companySearchInput",ref:R,type:"text","onUpdate:modelValue":s[0]||(s[0]=t=>y.value=t),placeholder:"Caută firmă...",class:"selector-search-input"},null,512),[[be,y.value]])]),e("div",Be,[(l(!0),o(C,null,x(U.value,t=>{var k,A;return l(),o("div",{key:t.id_firma,class:u(["selector-item",{active:t.id_firma===((k=d.companiesStore.selectedCompany)==null?void 0:k.id_firma)}]),onClick:V=>X(t)},[e("div",$e,[e("span",Fe,c(t.name),1),t.fiscal_code?(l(),o("span",Ue,"CUI: "+c(t.fiscal_code),1)):n("",!0)]),t.id_firma===((A=d.companiesStore.selectedCompany)==null?void 0:A.id_firma)?(l(),o("i",je)):n("",!0)],10,Re)}),128)),U.value.length===0?(l(),o("div",ze,[...s[4]||(s[4]=[e("i",{class:"pi pi-info-circle"},null,-1),e("span",null,"Nu s-au găsit firme",-1)])])):n("",!0)])])):n("",!0)]),d.periodStore&&d.companiesStore.selectedCompany?(l(),o("div",We,[s[7]||(s[7]=e("label",{class:"selector-label"},"Perioada",-1)),e("button",{class:"selector-trigger",onClick:Y,"aria-expanded":m.value},[e("div",Ke,[e("span",He,c(G.value),1)]),e("i",{class:u(["pi pi-chevron-down",{"rotate-180":m.value}])},null,2)],8,qe),m.value?(l(),o("div",Qe,[e("div",Ze,[(l(!0),o(C,null,x(j.value,t=>(l(),o("div",{key:`${t.an}-${t.luna}`,class:u(["selector-item",{active:z(t)}]),onClick:k=>ee(t)},[e("span",Je,c(t.display_name),1),z(t)?(l(),o("i",Xe)):n("",!0)],10,Ge))),128)),j.value.length===0?(l(),o("div",Ye,[...s[6]||(s[6]=[e("i",{class:"pi pi-info-circle"},null,-1),e("span",null,"Nu sunt perioade disponibile",-1)])])):n("",!0)])])):n("",!0)])):n("",!0),d.availableServers&&d.availableServers.length>1?(l(),o("div",es,[s[8]||(s[8]=e("label",{class:"selector-label"},"Server",-1)),e("button",{class:"selector-trigger",onClick:ae,"aria-expanded":h.value},[e("div",as,[e("span",ts,c(se.value),1)]),e("i",{class:u(["pi pi-chevron-down",{"rotate-180":h.value}])},null,2)],8,ss),h.value?(l(),o("div",ls,[e("div",os,[(l(!0),o(C,null,x(d.availableServers,t=>(l(),o("div",{key:t.id,class:u(["selector-item",{active:t.id===d.currentServerId}]),onClick:k=>te(t)},[e("span",is,c(t.name),1),t.id===d.currentServerId?(l(),o("i",ns)):n("",!0)],10,rs))),128))])])):n("",!0)])):n("",!0)])):n("",!0),d.companiesStore?(l(),o("div",cs)):n("",!0),e("div",us,[e("div",ds,[s[9]||(s[9]=e("div",{class:"section-header"},"PRINCIPALE",-1)),e("ul",vs,[(l(),o(C,null,x(oe,t=>e("li",{key:t.to},[b(i,{to:t.to,class:u(["drawer-link",{active:N(t.to,t.exactMatch)}]),onClick:T},{default:g(()=>[e("i",{class:u(["drawer-icon",t.icon])},null,2),e("span",ps,c(t.label),1)]),_:2},1032,["to","class"])])),64))])]),s[13]||(s[13]=e("div",{class:"drawer-divider"},null,-1)),e("div",ms,[s[10]||(s[10]=e("div",{class:"section-header"},"RAPOARTE",-1)),e("ul",hs,[(l(),o(C,null,x(re,t=>e("li",{key:t.to},[b(i,{to:t.to,class:u(["drawer-link",{active:N(t.to,t.exactMatch)}]),onClick:T},{default:g(()=>[e("i",{class:u(["drawer-icon",t.icon])},null,2),e("span",fs,c(t.label),1)]),_:2},1032,["to","class"])])),64))])]),s[14]||(s[14]=e("div",{class:"drawer-divider"},null,-1)),e("div",bs,[s[11]||(s[11]=e("div",{class:"section-header"},"ANALIZE",-1)),e("ul",ws,[(l(),o(C,null,x(ie,t=>e("li",{key:t.to},[b(i,{to:t.to,class:u(["drawer-link",{active:N(t.to,t.exactMatch)}]),onClick:T},{default:g(()=>[e("i",{class:u(["drawer-icon",t.icon])},null,2),e("span",_s,c(t.label),1)]),_:2},1032,["to","class"])])),64))])]),s[15]||(s[15]=e("div",{class:"drawer-divider"},null,-1)),e("div",ys,[s[12]||(s[12]=e("div",{class:"section-header"},"ADMINISTRARE",-1)),e("ul",Ss,[(l(),o(C,null,x(ne,t=>e("li",{key:t.to},[b(i,{to:t.to,class:u(["drawer-link",{active:N(t.to,t.exactMatch)}]),onClick:T},{default:g(()=>[e("i",{class:u(["drawer-icon",t.icon])},null,2),e("span",ks,c(t.label),1)]),_:2},1032,["to","class"])])),64))])])]),e("div",gs,[e("div",Cs,[e("div",xs,[s[16]||(s[16]=e("i",{class:"pi pi-user profile-icon"},null,-1)),e("span",Is,c(ce.value),1)]),e("button",{type:"button",class:"logout-btn",onClick:ue,"aria-label":"Deconectare"},[...s[17]||(s[17]=[e("i",{class:"pi pi-sign-out"},null,-1),e("span",null,"Ieșire",-1)])])]),e("button",{type:"button",class:"theme-toggle-compact",onClick:ve,"aria-label":`Schimbă tema: ${L.value.label}`},[e("i",{class:u(L.value.icon)},null,2),e("span",null,c(L.value.label),1),s[18]||(s[18]=e("i",{class:"pi pi-chevron-right"},null,-1))],8,Ms)])],512)])):n("",!0)]),_:1}),b(E(Me),{visible:M.value,"onUpdate:visible":s[2]||(s[2]=t=>M.value=t),header:`Schimbare server: ${$.value}`,modal:!0,closable:!S.value,style:{width:"90vw",maxWidth:"320px"},class:"mobile-server-switch-modal"},{footer:g(()=>[b(E(K),{label:"Anulează",severity:"secondary",disabled:S.value,onClick:le},null,8,["disabled"]),b(E(K),{label:"Confirmă",loading:S.value,disabled:!w.value,onClick:W},null,8,["loading","disabled"])]),default:g(()=>[e("div",Ds,[b(E(Ie),{modelValue:w.value,"onUpdate:modelValue":s[1]||(s[1]=t=>w.value=t),feedback:!1,toggleMask:"",inputClass:"w-full",class:"w-full",disabled:S.value,onKeyup:Se(W,["enter"]),autofocus:""},null,8,["modelValue","disabled"]),f.value?(l(),o("div",As,[s[20]||(s[20]=e("i",{class:"pi pi-exclamation-circle"},null,-1)),e("span",null,c(f.value),1)])):n("",!0)])]),_:1},8,["visible","header","closable"])])}}},Es=De(Ps,[["__scopeId","data-v-7ea89962"]]);export{Es as M}; -//# sourceMappingURL=MobileDrawerMenu.DJ_STPbv.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/MobileDrawerMenu.DJ_STPbv.js.map b/deploy-package-20260223-151231/frontend/assets/MobileDrawerMenu.DJ_STPbv.js.map deleted file mode 100644 index 01c7a10..0000000 --- a/deploy-package-20260223-151231/frontend/assets/MobileDrawerMenu.DJ_STPbv.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MobileDrawerMenu.DJ_STPbv.js","sources":["../../src/shared/components/mobile/MobileDrawerMenu.vue"],"sourcesContent":["\n\n\n\n\n"],"names":["props","__props","emit","__emit","route","useRoute","useRouter","drawerRef","ref","companyDropdownOpen","companySearchQuery","companySearchInput","periodDropdownOpen","serverDropdownOpen","showServerPasswordModal","serverSwitchPassword","targetServerId","targetServerName","isSwitchingServer","serverSwitchError","selectedCompanyName","computed","_b","_a","selectedCompanyCode","code","filteredCompanies","companies","query","company","selectedPeriodDisplay","availablePeriods","toggleCompanyDropdown","nextTick","selectCompany","togglePeriodDropdown","isPeriodSelected","period","selected","selectPeriod","currentServerName","server","s","toggleServerDropdown","selectServer","cancelServerSwitch","confirmServerSwitch","result","close","error","watch","isOpen","principaleItems","rapoarteItems","analizeItems","administrareItems","displayName","isActive","to","exactMatch","handleNavClick","handleLogout","currentTheme","themeOptions","currentThemeOption","opt","applyTheme","theme","cycleTheme","themes","currentIndex","nextTheme","onMounted","savedTheme","_createBlock","_Teleport","_createVNode","_Transition","_createElementBlock","_createElementVNode","_openBlock","_hoisted_1","_hoisted_2","_cache","_hoisted_4","_hoisted_5","_toDisplayString","_hoisted_6","_normalizeClass","_hoisted_7","_hoisted_8","$event","_hoisted_9","_Fragment","_renderList","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","item","_component_router_link","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_unref","Dialog","Button","_hoisted_54","Password","_hoisted_55"],"mappings":"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"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/MobileTopBar.BnL78WPy.js b/deploy-package-20260223-151231/frontend/assets/MobileTopBar.BnL78WPy.js deleted file mode 100644 index 3103c8a..0000000 --- a/deploy-package-20260223-151231/frontend/assets/MobileTopBar.BnL78WPy.js +++ /dev/null @@ -1,2 +0,0 @@ -import{s as l}from"./vendor-primevue.BN-meDW0.js";import{_ as m}from"./index.B8XI8FQW.js";import{c as n,d as a,e as s,h as c,i as k,O as r,v as f,F as v,B,t as y,l as h,u as d}from"./vendor-core.B6UiYhU_.js";const w={class:"top-bar-left"},C={class:"top-bar-title"},M={class:"top-bar-right"},$={__name:"MobileTopBar",props:{title:{type:String,default:""},showBack:{type:Boolean,default:!1},showMenu:{type:Boolean,default:!1},actions:{type:Array,default:()=>[]},selectionActive:{type:Boolean,default:!1}},emits:["menu-click","back-click","action-click"],setup(t){return(i,o)=>{const p=h("tooltip");return a(),n("header",{class:d(["mobile-top-bar",{"selection-active":t.selectionActive}])},[s("div",w,[t.showBack?(a(),c(r(l),{key:0,icon:"pi pi-arrow-left",text:"",rounded:"",class:"top-bar-btn",onClick:o[0]||(o[0]=e=>i.$emit("back-click")),"aria-label":"Înapoi"})):t.showMenu?(a(),c(r(l),{key:1,icon:"pi pi-bars",text:"",rounded:"",class:"top-bar-btn",onClick:o[1]||(o[1]=e=>i.$emit("menu-click")),"aria-label":"Meniu"})):k("",!0)]),s("h1",C,f(t.title),1),s("div",M,[(a(!0),n(v,null,B(t.actions,(e,u)=>y((a(),c(r(l),{key:u,icon:e.icon,text:"",rounded:"",class:d(["top-bar-btn",{active:e.active}]),onClick:b=>i.$emit("action-click",e,b),"aria-label":e.label||e.icon},null,8,["icon","class","onClick","aria-label"])),[[p,e.tooltip,void 0,{bottom:!0}]])),128))])],2)}}},A=m($,[["__scopeId","data-v-a82dc0db"]]);export{A as M}; -//# sourceMappingURL=MobileTopBar.BnL78WPy.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/MobileTopBar.BnL78WPy.js.map b/deploy-package-20260223-151231/frontend/assets/MobileTopBar.BnL78WPy.js.map deleted file mode 100644 index c81f302..0000000 --- a/deploy-package-20260223-151231/frontend/assets/MobileTopBar.BnL78WPy.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MobileTopBar.BnL78WPy.js","sources":["../../src/shared/components/mobile/MobileTopBar.vue"],"sourcesContent":["\n\n\n\n\n"],"names":["_createElementBlock","_normalizeClass","__props","_createElementVNode","_hoisted_1","_createBlock","_unref","Button","$emit","_hoisted_2","_toDisplayString","_hoisted_3","_openBlock","_Fragment","_renderList","action","index","e"],"mappings":"+lBACEA,EAyCS,SAAA,CAzCD,MAAKC,EAAA,CAAC,iBAAgB,CAAA,mBAA+BC,EAAA,gBAAe,CAAA,IAE1EC,EAmBM,MAnBNC,EAmBM,CAjBIF,EAAA,cADRG,EAQEC,EAAAC,CAAA,EAAA,OANA,KAAK,mBACL,KAAA,GACA,QAAA,GACA,MAAM,cACL,uBAAOC,EAAAA,MAAK,YAAA,GACb,aAAW,YAGAN,EAAA,cADbG,EAQEC,EAAAC,CAAA,EAAA,OANA,KAAK,aACL,KAAA,GACA,QAAA,GACA,MAAM,cACL,uBAAOC,EAAAA,MAAK,YAAA,GACb,aAAW,sBAKfL,EAA0C,KAA1CM,EAA0CC,EAAbR,EAAA,KAAK,EAAA,CAAA,EAGlCC,EAaM,MAbNQ,EAaM,EAZJC,EAAA,EAAA,EAAAZ,EAWEa,EAAA,KAAAC,EAV0BZ,EAAA,QAAO,CAAzBa,EAAQC,WADlBX,EAWEC,EAAAC,CAAA,EAAA,CATC,IAAKS,EACL,KAAMD,EAAO,KACd,KAAA,GACA,QAAA,GACA,MAAKd,EAAA,CAAC,cAAa,CAAA,OACCc,EAAO,MAAM,CAAA,CAAA,EAChC,QAAQE,GAAMT,QAAK,eAAiBO,EAAQE,CAAC,EAC7C,aAAYF,EAAO,OAASA,EAAO,2DAClBA,EAAO,eAAf,CAAA,OAAV,EAAiC"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/MobileTopBar.CPBMmZw4.css b/deploy-package-20260223-151231/frontend/assets/MobileTopBar.CPBMmZw4.css deleted file mode 100644 index b171dbd..0000000 --- a/deploy-package-20260223-151231/frontend/assets/MobileTopBar.CPBMmZw4.css +++ /dev/null @@ -1 +0,0 @@ -.mobile-top-bar[data-v-a82dc0db]{position:fixed;top:0;left:0;right:0;height:56px;background:var(--surface-card);border-bottom:1px solid var(--surface-border);display:flex;align-items:center;justify-content:space-between;padding:0 var(--space-xs);z-index:1000;box-shadow:var(--shadow-sm)}.mobile-top-bar.selection-active[data-v-a82dc0db]{background:var(--blue-50);border-bottom-color:var(--blue-200)}.top-bar-left[data-v-a82dc0db],.top-bar-right[data-v-a82dc0db]{display:flex;align-items:center;gap:var(--space-xs);min-width:48px}.top-bar-btn[data-v-a82dc0db]{width:48px;height:48px;border-radius:var(--radius-full);color:var(--text-color)}.top-bar-btn.active[data-v-a82dc0db]{color:var(--color-primary);background:var(--blue-50)}.top-bar-title[data-v-a82dc0db]{font-size:var(--text-lg);font-weight:var(--font-semibold);color:var(--text-color);margin:0;flex:1;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}[data-theme=dark] .mobile-top-bar[data-v-a82dc0db]{background:var(--surface-card);border-bottom-color:var(--surface-border)}[data-theme=dark] .mobile-top-bar.selection-active[data-v-a82dc0db]{background:var(--blue-900);border-bottom-color:var(--blue-700)}[data-theme=dark] .top-bar-btn[data-v-a82dc0db]{color:var(--text-color)}[data-theme=dark] .top-bar-btn.active[data-v-a82dc0db]{color:var(--blue-400);background:var(--blue-900)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .mobile-top-bar[data-v-a82dc0db]{background:var(--surface-card);border-bottom-color:var(--surface-border)}:root:not([data-theme]) .mobile-top-bar.selection-active[data-v-a82dc0db]{background:var(--blue-900);border-bottom-color:var(--blue-700)}:root:not([data-theme]) .top-bar-btn[data-v-a82dc0db]{color:var(--text-color)}:root:not([data-theme]) .top-bar-btn.active[data-v-a82dc0db]{color:var(--blue-400);background:var(--blue-900)}} diff --git a/deploy-package-20260223-151231/frontend/assets/OCRConfidenceIndicator.BILrhVia.js b/deploy-package-20260223-151231/frontend/assets/OCRConfidenceIndicator.BILrhVia.js deleted file mode 100644 index 47c79b9..0000000 --- a/deploy-package-20260223-151231/frontend/assets/OCRConfidenceIndicator.BILrhVia.js +++ /dev/null @@ -1,2 +0,0 @@ -import{_ as u}from"./index.B8XI8FQW.js";import{j as t,c as a,d as r,e as p,i as f,u as s,v as m}from"./vendor-core.B6UiYhU_.js";const h=["title"],_={key:0,class:"percentage"},v={__name:"OCRConfidenceIndicator",props:{confidence:{type:Number,required:!0,validator:n=>n>=0&&n<=1},showPercentage:{type:Boolean,default:!1},size:{type:String,default:"normal",validator:n=>["small","normal","large"].includes(n)}},setup(n){const e=n,o=t(()=>Math.round(e.confidence*100)+"%"),i=t(()=>{const c=[`size-${e.size}`];return e.confidence>=.85?c.push("high"):e.confidence>=.6?c.push("medium"):c.push("low"),c}),l=t(()=>e.confidence>=.85?"pi pi-check-circle":e.confidence>=.6?"pi pi-exclamation-circle":"pi pi-question-circle"),d=t(()=>{const c=Math.round(e.confidence*100);return e.confidence>=.85?`Incredere ridicata: ${c}%`:e.confidence>=.6?`Incredere medie: ${c}% - verifica valoarea`:`Incredere scazuta: ${c}% - completeaza manual`});return(c,g)=>(r(),a("span",{class:s(["confidence-indicator",i.value]),title:d.value},[p("i",{class:s(l.value)},null,2),n.showPercentage?(r(),a("span",_,m(o.value),1)):f("",!0)],10,h))}},z=u(v,[["__scopeId","data-v-836cb66e"]]);export{z as O}; -//# sourceMappingURL=OCRConfidenceIndicator.BILrhVia.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/OCRConfidenceIndicator.BILrhVia.js.map b/deploy-package-20260223-151231/frontend/assets/OCRConfidenceIndicator.BILrhVia.js.map deleted file mode 100644 index d9bc79f..0000000 --- a/deploy-package-20260223-151231/frontend/assets/OCRConfidenceIndicator.BILrhVia.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"OCRConfidenceIndicator.BILrhVia.js","sources":["../../src/modules/data-entry/components/ocr/OCRConfidenceIndicator.vue"],"sourcesContent":["\n\n\n\n\n"],"names":["props","__props","percentageText","computed","confidenceClass","classes","iconClass","tooltipText","percent","_createElementBlock","_normalizeClass","_createElementVNode","_hoisted_2","_toDisplayString"],"mappings":"iaAcA,MAAMA,EAAQC,EAiBRC,EAAiBC,EAAS,IACvB,KAAK,MAAMH,EAAM,WAAa,GAAG,EAAI,GAC7C,EAEKI,EAAkBD,EAAS,IAAM,CACrC,MAAME,EAAU,CAAC,QAAQL,EAAM,IAAI,EAAE,EAErC,OAAIA,EAAM,YAAc,IACtBK,EAAQ,KAAK,MAAM,EACVL,EAAM,YAAc,GAC7BK,EAAQ,KAAK,QAAQ,EAErBA,EAAQ,KAAK,KAAK,EAGbA,CACT,CAAC,EAEKC,EAAYH,EAAS,IACrBH,EAAM,YAAc,IACf,qBACEA,EAAM,YAAc,GACtB,2BAEA,uBAEV,EAEKO,EAAcJ,EAAS,IAAM,CACjC,MAAMK,EAAU,KAAK,MAAMR,EAAM,WAAa,GAAG,EACjD,OAAIA,EAAM,YAAc,IACf,uBAAuBQ,CAAO,IAC5BR,EAAM,YAAc,GACtB,oBAAoBQ,CAAO,wBAE3B,sBAAsBA,CAAO,wBAExC,CAAC,oBAnECC,EAOO,OAAA,CANL,MAAKC,EAAA,CAAC,uBACEN,EAAA,KAAe,CAAA,EACtB,MAAOG,EAAA,QAERI,EAA0B,IAAA,CAAtB,QAAOL,EAAA,KAAS,WACRL,EAAA,oBAAZQ,EAA0E,OAA1EG,EAA0EC,EAAxBX,EAAA,KAAc,EAAA,CAAA"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/OCRConfidenceIndicator.Cg9OzDZP.css b/deploy-package-20260223-151231/frontend/assets/OCRConfidenceIndicator.Cg9OzDZP.css deleted file mode 100644 index 0f5daa3..0000000 --- a/deploy-package-20260223-151231/frontend/assets/OCRConfidenceIndicator.Cg9OzDZP.css +++ /dev/null @@ -1 +0,0 @@ -.confidence-indicator[data-v-836cb66e]{display:inline-flex;align-items:center;gap:.25rem;padding:.15rem .5rem;border-radius:12px;font-size:.75rem;font-weight:500}.size-small[data-v-836cb66e]{font-size:.7rem;padding:.1rem .35rem}.size-small i[data-v-836cb66e]{font-size:.75rem}.size-normal i[data-v-836cb66e]{font-size:.85rem}.size-large[data-v-836cb66e]{font-size:.85rem;padding:.2rem .6rem}.size-large i[data-v-836cb66e]{font-size:1rem}.high[data-v-836cb66e]{background:#dcfce7;color:#166534}.medium[data-v-836cb66e]{background:#fef9c3;color:#854d0e}.low[data-v-836cb66e]{background:#fee2e2;color:#991b1b}.percentage[data-v-836cb66e]{font-variant-numeric:tabular-nums} diff --git a/deploy-package-20260223-151231/frontend/assets/OCRMetricsView.Bjt09CXb.js b/deploy-package-20260223-151231/frontend/assets/OCRMetricsView.Bjt09CXb.js deleted file mode 100644 index 1921579..0000000 --- a/deploy-package-20260223-151231/frontend/assets/OCRMetricsView.Bjt09CXb.js +++ /dev/null @@ -1,2 +0,0 @@ -import{I as J,s as B,G as se,H as _}from"./vendor-primevue.BN-meDW0.js";import{_ as me,u as fe,f as ge,d as te}from"./index.B8XI8FQW.js";import{C as K,a as be,L as ye,B as he,b as xe,p as ke,c as Ce,d as we}from"./vendor-charts.DHYGKspN.js";import{u as Me}from"./ocrSettingsStore.B3n_bOhs.js";import{e as Re,a as Te}from"./exportUtils.BtGzMnqV.js";import{j as g,a as F,w as Se,o as ze,W as Ee,c as o,h as D,i as m,O as n,P as Fe,e as t,q as r,p as d,F as ae,B as ie,v as i,t as Oe,u as k,n as Ve,l as $e,d as l,y as w}from"./vendor-core.B6UiYhU_.js";import{M as Be}from"./MobileTopBar.BnL78WPy.js";import{M as De}from"./MobileBottomNav.Cp8OR33w.js";import"./vendor-utils.CO3CyGpV.js";import"./vendor-export.BWjBvx7Z.js";const Ae={key:1,class:"page-header"},Ie={key:2,class:"loading-container"},Pe={key:3,class:"empty-state"},Le={key:4,class:"metrics-content"},Ue={class:"section-card"},Ne={class:"section-header"},qe={class:"section-actions"},We={class:"engine-cell"},He={class:"success-value"},Je={key:1,class:"mobile-card-list"},Ke={class:"card-header"},Ge={class:"card-stats-grid"},Ze={class:"stat-item"},Qe={class:"stat-value"},Xe={class:"stat-item"},Ye={class:"stat-value success"},je={class:"stat-item"},es={class:"stat-value"},ss={class:"stat-item"},ts={class:"stat-value"},as={key:0,class:"charts-section"},is={class:"chart-card"},ls={class:"chart-container"},ns={class:"chart-card"},os={class:"chart-container"},rs={key:1,class:"stats-overview"},cs={class:"stats-grid"},ds={class:"stat-box"},us={class:"stat-info"},ps={class:"stat-number"},vs={class:"stat-box"},_s={class:"stat-info"},ms={class:"stat-number"},fs={class:"stat-box"},gs={class:"stat-info"},bs={class:"stat-number"},ys={class:"stat-box"},hs={class:"stat-info"},xs={class:"stat-number"},ks={class:"section-card"},Cs={class:"section-header"},ws={key:0,class:"history-filters-toolbar"},Ms={class:"filters-row"},Rs={class:"filter-item"},Ts={class:"filter-item"},Ss={class:"filter-actions"},zs={key:0,class:"filter-info"},Es=["title"],Fs={key:0},Os={key:1,class:"error-text"},Vs={key:0},$s={key:1,class:"error-text"},Bs={key:2,class:"mobile-card-list"},Ds={class:"card-header"},As={key:0,class:"card-row filename-row"},Is={class:"filename-text"},Ps={class:"card-row"},Ls={class:"card-meta"},Us={class:"card-value"},Ns={key:1,class:"card-row"},qs={class:"card-meta"},Ws={class:"card-value"},Hs={key:0,class:"mobile-empty"},Js={__name:"OCRMetricsView",setup(Ks){K.register(be,ye,he,xe,ke,Ce,we);const O=Me(),y=fe(),le=Fe(),ne=g(()=>[{icon:"pi pi-refresh",label:"Actualizează",tooltip:"Actualizează metricile"}]),oe=a=>{a.icon==="pi pi-refresh"&&U()},V=F(30),re=[{label:"Ultimele 7 zile",value:7},{label:"Ultimele 30 zile",value:30},{label:"Ultimele 90 zile",value:90}],u=F(window.innerWidth<768),A=F(!1),b=F({engine:null,status:null}),N=F(null),q=F(null);let M=null,R=null;const G=g(()=>O.metricsLoading),f=g(()=>O.metrics.summary||[]),$=g(()=>O.metrics.stats),I=g(()=>O.metrics.history||[]),Z=g(()=>f.value.length>0||I.value.length>0),ce=g(()=>{const a=new Set(I.value.map(e=>e.engine_used));return[{label:"Toate motoarele",value:null},...Array.from(a).map(e=>({label:h(e),value:e}))]}),de=g(()=>[{label:"Toate",value:null},{label:"Succes",value:!0},{label:"Eroare",value:!1}]),C=g(()=>{let a=[...I.value];return b.value.engine&&(a=a.filter(e=>e.engine_used===b.value.engine)),b.value.status!==null&&(a=a.filter(e=>e.success===b.value.status)),a}),W=g(()=>b.value.engine!==null||b.value.status!==null),Q=g(()=>{if(!f.value.length)return null;const a=f.value.filter(e=>e.successful_jobs>0);return a.length?a.reduce((e,c)=>(c.avg_processing_time_ms||1/0)<(e.avg_processing_time_ms||1/0)?c:e).engine:null}),X=g(()=>{if(!f.value.length)return null;const a=f.value.filter(e=>e.successful_jobs>0);return a.length?a.reduce((e,c)=>(c.avg_confidence||0)>(e.avg_confidence||0)?c:e).engine:null}),T=a=>{const e=S(a);return e===Q.value&&e===X.value?{text:"Cel mai bun",class:"best"}:e===Q.value?{text:"Cel mai rapid",class:"fastest"}:e===X.value?{text:"Cea mai buna calitate",class:"quality"}:null},H={auto:"Auto",doctr:"docTR",paddleocr:"PaddleOCR",tesseract:"Tesseract",hybrid:"Hybrid","hybrid-quality":"Hybrid Calitate"},S=a=>a?H[a]?a:Object.keys(H).find(c=>a.startsWith(c))||a:"auto",h=a=>{const e=S(a);return H[e]||a},Y=a=>a==null?"-":`${(a*100).toFixed(1)}%`,z=a=>a==null?"-":a<1e3?`${Math.round(a)}ms`:`${(a/1e3).toFixed(2)}s`,E=a=>a==null?"-":`${(a*100).toFixed(0)}%`,P=a=>a?new Date(a).toLocaleDateString("ro-RO",{day:"2-digit",month:"2-digit",year:"numeric",hour:"2-digit",minute:"2-digit"}):"-",L={doctr:"#667eea",paddleocr:"#22c55e",tesseract:"#f59e0b",auto:"#6b7280",hybrid:"#06b6d4","hybrid-quality":"#8b5cf6"},j=async()=>{if(u.value||(await Ve(),M&&(M.destroy(),M=null),R&&(R.destroy(),R=null),!f.value.length))return;const a=f.value.map(v=>h(v.engine)),e=f.value.map(v=>(v.avg_processing_time_ms||0)/1e3),c=f.value.map(v=>(v.success_rate||0)*100),s=v=>{if(L[v])return L[v];const x=Object.keys(L).find(_e=>v.startsWith(_e));return x?L[x]:"#6b7280"},p=f.value.map(v=>s(v.engine));if(N.value){const v=N.value.getContext("2d");M=new K(v,{type:"bar",data:{labels:a,datasets:[{label:"Timp mediu (secunde)",data:e,backgroundColor:p,borderRadius:6,barThickness:50}]},options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1},tooltip:{callbacks:{label:x=>`${x.parsed.y.toFixed(2)}s`}}},scales:{x:{grid:{display:!1},ticks:{color:"#6b7280"}},y:{beginAtZero:!0,grid:{color:"rgba(0,0,0,0.05)"},ticks:{color:"#6b7280",callback:x=>`${x}s`}}}}})}if(q.value){const v=q.value.getContext("2d");R=new K(v,{type:"bar",data:{labels:a,datasets:[{label:"Rata succes (%)",data:c,backgroundColor:p,borderRadius:6,barThickness:50}]},options:{responsive:!0,maintainAspectRatio:!1,plugins:{legend:{display:!1},tooltip:{callbacks:{label:x=>`${x.parsed.y.toFixed(1)}%`}}},scales:{x:{grid:{display:!1},ticks:{color:"#6b7280"}},y:{beginAtZero:!0,max:100,grid:{color:"rgba(0,0,0,0.05)"},ticks:{color:"#6b7280",callback:x=>`${x}%`}}}}})}},U=async()=>{await O.loadAllMetrics(V.value),await j()},ue=()=>{b.value={engine:null,status:null}},ee=()=>{u.value=window.innerWidth<768,u.value||(A.value=!1,j())},pe=()=>{var c;const a=C.value.map(s=>({Data:P(s.created_at),Fisier:s.original_filename||"-","Motor Solicitat":h(s.engine_requested),"Motor Utilizat":h(s.engine_used),"Timp (ms)":s.processing_time_ms,Status:s.success?"Succes":"Eroare",Incredere:s.success?E(s.overall_confidence):"-","Campuri Extrase":s.success?s.fields_extracted||0:"-"})),e=Re(a,"metrici_ocr","Istoric OCR");(e==null?void 0:e.success)!==!1&&((c=y==null?void 0:y.add)==null||c.call(y,{severity:"success",summary:"Export reusit",detail:`${a.length} inregistrari exportate`,life:3e3}))},ve=()=>{var s;const a=[{field:"data",header:"Data",type:"text"},{field:"fisier",header:"Fisier",type:"text"},{field:"motor_utilizat",header:"Motor",type:"text"},{field:"timp",header:"Timp",type:"text"},{field:"status",header:"Status",type:"text"},{field:"incredere",header:"Incredere",type:"text"},{field:"campuri",header:"Campuri",type:"number"}],e=C.value.map(p=>({data:P(p.created_at),fisier:p.original_filename||"-",motor_utilizat:h(p.engine_used),timp:z(p.processing_time_ms),status:p.success?"Succes":"Eroare",incredere:p.success?E(p.overall_confidence):"-",campuri:p.success&&p.fields_extracted||0})),c=Te(e,a,"metrici-ocr",{title:"Metrici OCR",period:`Ultimele ${V.value} zile`});(c==null?void 0:c.success)!==!1&&((s=y==null?void 0:y.add)==null||s.call(y,{severity:"success",summary:"Export reusit",detail:`${e.length} inregistrari exportate`,life:3e3}))};return Se(V,async()=>{await U()}),ze(async()=>{window.addEventListener("resize",ee),await U()}),Ee(()=>{window.removeEventListener("resize",ee),M&&(M.destroy(),M=null),R&&(R.destroy(),R=null)}),(a,e)=>{const c=$e("tooltip");return l(),o("div",{class:k(["ocr-metrics-view",{"mobile-layout":u.value}])},[u.value?(l(),D(Be,{key:0,title:"Metrici OCR","show-back":!0,actions:ne.value,onBackClick:e[0]||(e[0]=s=>n(le).push("/settings")),onActionClick:oe},null,8,["actions"])):m("",!0),u.value?m("",!0):(l(),o("div",Ae,[...e[5]||(e[5]=[t("h1",null,"Metrici OCR",-1)])])),G.value&&!Z.value?(l(),o("div",Ie,[r(n(ge),{style:{width:"50px",height:"50px"},strokeWidth:"4"}),e[6]||(e[6]=t("p",null,"Se incarca metricile...",-1))])):Z.value?(l(),o("div",Le,[t("div",Ue,[t("div",Ne,[e[8]||(e[8]=t("h3",{class:"section-title"},"Performanta per Motor OCR",-1)),t("div",qe,[r(n(J),{modelValue:V.value,"onUpdate:modelValue":e[1]||(e[1]=s=>V.value=s),options:re,optionLabel:"label",optionValue:"value",placeholder:"Perioada",class:"days-selector dropdown-borderless"},null,8,["modelValue"]),r(n(B),{icon:"pi pi-refresh",label:u.value?"":"Actualizeaza",onClick:U,loading:G.value,severity:"secondary",size:"small"},null,8,["label","loading"])])]),u.value?(l(),o("div",Je,[(l(!0),o(ae,null,ie(f.value,s=>(l(),o("div",{key:s.engine,class:k(["mobile-data-card engine-mobile-card",{highlighted:T(s.engine)}])},[t("div",Ke,[t("span",{class:k(["engine-badge",S(s.engine)])},i(h(s.engine)),3),T(s.engine)?(l(),o("span",{key:0,class:k(["dynamic-badge",T(s.engine).class])},i(T(s.engine).text),3)):m("",!0)]),t("div",Ge,[t("div",Ze,[e[9]||(e[9]=t("span",{class:"stat-label"},"Joburi",-1)),t("span",Qe,i(s.total_jobs),1)]),t("div",Xe,[e[10]||(e[10]=t("span",{class:"stat-label"},"Succes",-1)),t("span",Ye,i(Y(s.success_rate)),1)]),t("div",je,[e[11]||(e[11]=t("span",{class:"stat-label"},"Timp",-1)),t("span",es,i(z(s.avg_processing_time_ms)),1)]),t("div",ss,[e[12]||(e[12]=t("span",{class:"stat-label"},"Incredere",-1)),t("span",ts,i(E(s.avg_confidence)),1)])])],2))),128))])):(l(),D(n(se),{key:0,value:f.value,stripedRows:"",responsiveLayout:"scroll",class:"engine-summary-table",sortField:"total_jobs",sortOrder:-1},{default:d(()=>[r(n(_),{field:"engine",header:"Motor OCR",sortable:!0},{body:d(({data:s})=>[t("div",We,[t("span",{class:k(["engine-badge",S(s.engine)])},i(h(s.engine)),3),T(s.engine)?(l(),o("span",{key:0,class:k(["dynamic-badge",T(s.engine).class])},i(T(s.engine).text),3)):m("",!0)])]),_:1}),r(n(_),{field:"total_jobs",header:"Total Joburi",sortable:!0,style:{"text-align":"right"}},{body:d(({data:s})=>[w(i(s.total_jobs),1)]),_:1}),r(n(_),{field:"success_rate",header:"Rata Succes",sortable:!0,style:{"text-align":"right"}},{body:d(({data:s})=>[t("span",He,i(Y(s.success_rate)),1)]),_:1}),r(n(_),{field:"avg_processing_time_ms",header:"Timp Mediu",sortable:!0,style:{"text-align":"right"}},{body:d(({data:s})=>[w(i(z(s.avg_processing_time_ms)),1)]),_:1}),r(n(_),{field:"avg_confidence",header:"Incredere Medie",sortable:!0,style:{"text-align":"right"}},{body:d(({data:s})=>[w(i(E(s.avg_confidence)),1)]),_:1}),r(n(_),{field:"avg_fields_extracted",header:"Campuri Medii",sortable:!0,style:{"text-align":"right"}},{body:d(({data:s})=>{var p;return[w(i(((p=s.avg_fields_extracted)==null?void 0:p.toFixed(1))||"-"),1)]}),_:1})]),_:1},8,["value"]))]),u.value?m("",!0):(l(),o("div",as,[t("div",is,[e[13]||(e[13]=t("h3",null,"Timp Procesare per Motor",-1)),t("div",ls,[t("canvas",{ref_key:"timeChartCanvas",ref:N},null,512)])]),t("div",ns,[e[14]||(e[14]=t("h3",null,"Rata Succes per Motor",-1)),t("div",os,[t("canvas",{ref_key:"successChartCanvas",ref:q},null,512)])])])),$.value?(l(),o("div",rs,[e[23]||(e[23]=t("h3",null,"Statistici Generale",-1)),t("div",cs,[t("div",ds,[e[16]||(e[16]=t("i",{class:"pi pi-file stat-icon stat-icon--primary"},null,-1)),t("div",us,[t("span",ps,i($.value.total_jobs||0),1),e[15]||(e[15]=t("span",{class:"stat-desc"},"Total joburi",-1))])]),t("div",vs,[e[18]||(e[18]=t("i",{class:"pi pi-check-circle stat-icon stat-icon--success"},null,-1)),t("div",_s,[t("span",ms,i($.value.successful_jobs||0),1),e[17]||(e[17]=t("span",{class:"stat-desc"},"Procesate cu succes",-1))])]),t("div",fs,[e[20]||(e[20]=t("i",{class:"pi pi-times-circle stat-icon stat-icon--error"},null,-1)),t("div",gs,[t("span",bs,i($.value.failed_jobs||0),1),e[19]||(e[19]=t("span",{class:"stat-desc"},"Esuate",-1))])]),t("div",ys,[e[22]||(e[22]=t("i",{class:"pi pi-clock stat-icon stat-icon--warning"},null,-1)),t("div",hs,[t("span",xs,i(z($.value.avg_processing_time_ms)),1),e[21]||(e[21]=t("span",{class:"stat-desc"},"Timp mediu total",-1))])])])])):m("",!0),t("div",ks,[t("div",Cs,[e[24]||(e[24]=t("h3",{class:"section-title"},"Istoric Joburi OCR",-1)),u.value?Oe((l(),D(n(B),{key:0,icon:"pi pi-filter",class:k([{"filter-active":W.value},"p-button-text"]),onClick:e[2]||(e[2]=s=>A.value=!A.value)},null,8,["class"])),[[c,"Filtre",void 0,{bottom:!0}]]):m("",!0)]),!u.value||A.value?(l(),o("div",ws,[t("div",Ms,[t("div",Rs,[e[25]||(e[25]=t("label",{class:"filter-label"},"Motor OCR",-1)),r(n(J),{modelValue:b.value.engine,"onUpdate:modelValue":e[3]||(e[3]=s=>b.value.engine=s),options:ce.value,optionLabel:"label",optionValue:"value",placeholder:"Toate motoarele",class:"filter-dropdown dropdown-borderless"},null,8,["modelValue","options"])]),t("div",Ts,[e[26]||(e[26]=t("label",{class:"filter-label"},"Status",-1)),r(n(J),{modelValue:b.value.status,"onUpdate:modelValue":e[4]||(e[4]=s=>b.value.status=s),options:de.value,optionLabel:"label",optionValue:"value",placeholder:"Toate",class:"filter-dropdown dropdown-borderless"},null,8,["modelValue","options"])]),t("div",Ss,[r(n(B),{icon:"pi pi-filter-slash",label:u.value?"":"Reseteaza",class:"p-button-outlined p-button-secondary",onClick:ue,disabled:!W.value,size:"small"},null,8,["label","disabled"]),r(n(B),{icon:"pi pi-file-excel",label:u.value?"":"Excel",class:"p-button-outlined p-button-success",onClick:pe,disabled:C.value.length===0,size:"small"},null,8,["label","disabled"]),r(n(B),{icon:"pi pi-file-pdf",label:u.value?"":"PDF",class:"p-button-outlined p-button-danger",onClick:ve,disabled:C.value.length===0,size:"small"},null,8,["label","disabled"])])]),W.value?(l(),o("div",zs,[e[27]||(e[27]=t("i",{class:"pi pi-info-circle"},null,-1)),t("span",null,i(C.value.length)+" din "+i(I.value.length)+" inregistrari",1)])):m("",!0)])):m("",!0),u.value?(l(),o("div",Bs,[(l(!0),o(ae,null,ie(C.value,s=>(l(),o("div",{key:s.job_id,class:"mobile-data-card history-mobile-card"},[t("div",Ds,[t("span",{class:k(["engine-badge",S(s.engine_used)])},i(h(s.engine_used)),3),r(n(te),{severity:s.success?"success":"danger",class:"status-tag"},{default:d(()=>[w(i(s.success?"Succes":"Eroare"),1)]),_:2},1032,["severity"])]),s.original_filename?(l(),o("div",As,[t("span",Is,i(s.original_filename),1)])):m("",!0),t("div",Ps,[t("span",Ls,i(P(s.created_at)),1),t("span",Us,i(z(s.processing_time_ms)),1)]),s.success?(l(),o("div",Ns,[t("span",qs,"Incredere: "+i(E(s.overall_confidence)),1),t("span",Ws,i(s.fields_extracted||0)+" campuri",1)])):m("",!0)]))),128)),C.value.length===0?(l(),o("div",Hs,[...e[28]||(e[28]=[t("i",{class:"pi pi-info-circle"},null,-1),t("p",null,"Nu exista inregistrari",-1)])])):m("",!0)])):(l(),D(n(se),{key:1,value:C.value,paginator:!0,rows:20,rowsPerPageOptions:[10,20,50],responsiveLayout:"scroll",stripedRows:"",class:"history-table",sortField:"created_at",sortOrder:-1},{default:d(()=>[r(n(_),{field:"created_at",header:"Data",sortable:!0},{body:d(({data:s})=>[w(i(P(s.created_at)),1)]),_:1}),r(n(_),{field:"original_filename",header:"Fisier",sortable:!0},{body:d(({data:s})=>[t("span",{class:"filename-text",title:s.original_filename},i(s.original_filename||"-"),9,Es)]),_:1}),r(n(_),{field:"engine_requested",header:"Motor Solicitat",sortable:!0},{body:d(({data:s})=>[t("span",{class:k(["engine-badge",S(s.engine_requested)])},i(h(s.engine_requested)),3)]),_:1}),r(n(_),{field:"engine_used",header:"Motor Utilizat",sortable:!0},{body:d(({data:s})=>[t("span",{class:k(["engine-badge",S(s.engine_used)])},i(h(s.engine_used)),3)]),_:1}),r(n(_),{field:"processing_time_ms",header:"Timp",sortable:!0,style:{"text-align":"right"}},{body:d(({data:s})=>[w(i(z(s.processing_time_ms)),1)]),_:1}),r(n(_),{field:"success",header:"Status",sortable:!0},{body:d(({data:s})=>[r(n(te),{severity:s.success?"success":"danger"},{default:d(()=>[w(i(s.success?"Succes":"Eroare"),1)]),_:2},1032,["severity"])]),_:1}),r(n(_),{field:"overall_confidence",header:"Incredere",sortable:!0,style:{"text-align":"right"}},{body:d(({data:s})=>[s.success?(l(),o("span",Fs,i(E(s.overall_confidence)),1)):(l(),o("span",Os,"-"))]),_:1}),r(n(_),{field:"fields_extracted",header:"Campuri",sortable:!0,style:{"text-align":"right"}},{body:d(({data:s})=>[s.success?(l(),o("span",Vs,i(s.fields_extracted||0),1)):(l(),o("span",$s,"-"))]),_:1})]),_:1},8,["value"]))])])):(l(),o("div",Pe,[...e[7]||(e[7]=[t("i",{class:"pi pi-chart-bar empty-state-icon"},null,-1),t("h3",null,"Nu exista date",-1),t("p",null,"Procesati imagini cu OCR pentru a vedea statisticile.",-1)])])),u.value?(l(),D(De,{key:5})):m("",!0)],2)}}},it=me(Js,[["__scopeId","data-v-3c951048"]]);export{it as default}; -//# sourceMappingURL=OCRMetricsView.Bjt09CXb.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/OCRMetricsView.Bjt09CXb.js.map b/deploy-package-20260223-151231/frontend/assets/OCRMetricsView.Bjt09CXb.js.map deleted file mode 100644 index ad3c9c3..0000000 --- a/deploy-package-20260223-151231/frontend/assets/OCRMetricsView.Bjt09CXb.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"OCRMetricsView.Bjt09CXb.js","sources":["../../src/modules/data-entry/views/OCRMetricsView.vue"],"sourcesContent":["\n\n\n\n\n\n\n\n"],"names":["Chart","CategoryScale","LinearScale","BarElement","BarController","Title","Tooltip","Legend","ocrStore","useOCRSettingsStore","toast","useToast","router","useRouter","mobileTopBarActions","computed","handleTopBarAction","action","loadAllMetrics","selectedDays","ref","daysOptions","isMobile","showFilters","historyFilters","timeChartCanvas","successChartCanvas","timeChartInstance","successChartInstance","loading","engineSummary","stats","history","hasData","engineFilterOptions","engines","h","formatEngineName","statusFilterOptions","filteredHistory","result","hasActiveFilters","fastestEngine","successful","min","e","bestQualityEngine","max","getEngineBadge","engine","baseEngine","getBaseEngine","engineNameMap","k","base","formatPercent","value","formatTime","ms","formatConfidence","formatDate","dateStr","engineColors","initCharts","nextTick","times","successRates","getEngineColor","baseKey","colors","timeCtx","context","successCtx","clearFilters","handleResize","exportExcel","exportData","job","exportToExcel","_a","exportPDF","columns","exportToPDF","watch","onMounted","onBeforeUnmount","_createElementBlock","_normalizeClass","_createBlock","MobileTopBar","_cache","$event","_unref","_openBlock","_hoisted_1","_createElementVNode","_hoisted_2","_createVNode","ProgressSpinner","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","Dropdown","Button","_hoisted_10","_Fragment","_renderList","_hoisted_11","_toDisplayString","_hoisted_12","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","DataTable","Column","_withCtx","data","_hoisted_8","_createTextVNode","_hoisted_9","_hoisted_21","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_53","_hoisted_54","Tag","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_3","MobileBottomNav"],"mappings":"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"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/OCRMetricsView.WMLZtZ2R.css b/deploy-package-20260223-151231/frontend/assets/OCRMetricsView.WMLZtZ2R.css deleted file mode 100644 index b04e2da..0000000 --- a/deploy-package-20260223-151231/frontend/assets/OCRMetricsView.WMLZtZ2R.css +++ /dev/null @@ -1 +0,0 @@ -.ocr-metrics-view[data-v-3c951048]{padding:1.5rem;max-width:1400px;margin:0 auto}.ocr-metrics-view.mobile-layout[data-v-3c951048]{padding:var(--space-sm);padding-top:56px;padding-bottom:56px}.page-header[data-v-3c951048]{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-md);flex-wrap:wrap;gap:var(--space-md)}.page-header h1[data-v-3c951048]{font-size:1.5rem;font-weight:600;color:var(--text-color);margin:0}.days-selector[data-v-3c951048]{min-width:160px}.filter-active[data-v-3c951048]{background:var(--primary-100, #e0e7ff)!important;color:var(--primary-700, #4338ca)!important}.section-header[data-v-3c951048]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;flex-wrap:wrap;gap:.75rem}.section-header .section-title[data-v-3c951048]{margin:0}.section-actions[data-v-3c951048]{display:flex;gap:.75rem;align-items:center}.section-actions .days-selector[data-v-3c951048]{min-width:150px}.history-filters-toolbar[data-v-3c951048]{background:var(--surface-ground, #f8fafc);border:1px solid var(--surface-border, #e2e8f0);border-radius:8px;padding:.75rem 1rem;margin-bottom:1rem}.filters-row[data-v-3c951048]{display:flex;align-items:flex-end;gap:1rem;flex-wrap:wrap}.filter-item[data-v-3c951048]{display:flex;flex-direction:column;gap:.25rem;min-width:150px}.filter-label[data-v-3c951048]{font-size:.75rem;font-weight:500;color:var(--text-color-secondary, #64748b);text-transform:uppercase;letter-spacing:.025em}.filter-dropdown[data-v-3c951048]{min-width:160px}.filter-actions[data-v-3c951048]{display:flex;gap:.5rem;margin-left:auto}.filter-info[data-v-3c951048]{display:flex;align-items:center;gap:.5rem;margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--surface-border, #e2e8f0);font-size:.8125rem;color:var(--text-color-secondary, #64748b)}.filter-info i[data-v-3c951048]{color:var(--primary-500, #6366f1)}@media (max-width: 768px){.section-header[data-v-3c951048]{flex-direction:column;align-items:stretch}.section-actions[data-v-3c951048]{justify-content:space-between}.section-actions .days-selector[data-v-3c951048]{flex:1;min-width:0}.filters-row[data-v-3c951048]{flex-direction:column;align-items:stretch}.filter-item[data-v-3c951048]{min-width:100%}.filter-actions[data-v-3c951048]{margin-left:0;justify-content:flex-end;margin-top:.5rem;padding-top:.5rem;border-top:1px solid var(--surface-border, #e2e8f0)}}.loading-container[data-v-3c951048],.empty-state[data-v-3c951048]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4rem 2rem;text-align:center;color:#64748b}.empty-state h3[data-v-3c951048]{margin:1rem 0 .5rem;color:#1e293b}.section-card[data-v-3c951048]{background:var(--surface-card);border-radius:12px;padding:1.25rem;box-shadow:var(--shadow-sm);border:1px solid var(--surface-border);margin-bottom:1.5rem}.section-title[data-v-3c951048]{font-size:1rem;font-weight:600;color:#1e293b;margin:0 0 1rem}.engine-cell[data-v-3c951048]{display:flex;align-items:center;gap:.5rem}.success-value[data-v-3c951048]{color:#22c55e;font-weight:500}.mobile-card-list[data-v-3c951048]{display:flex;flex-direction:column;gap:.5rem}.mobile-data-card[data-v-3c951048]{background:var(--surface-card, #ffffff);border:1px solid var(--surface-border, #e2e8f0);border-radius:8px;padding:.75rem 1rem}.mobile-data-card.highlighted[data-v-3c951048]{border-color:var(--primary-400, #818cf8);background:linear-gradient(to bottom right,#f8fafc,#eef2ff)}.mobile-data-card .card-header[data-v-3c951048]{display:flex;justify-content:space-between;align-items:center;margin-bottom:.5rem}.mobile-data-card .card-row[data-v-3c951048]{display:flex;justify-content:space-between;align-items:center;font-size:.875rem;color:var(--text-color-secondary, #64748b);margin-top:.25rem}.mobile-data-card .card-meta[data-v-3c951048]{color:var(--text-color-secondary, #64748b)}.mobile-data-card .card-value[data-v-3c951048]{font-weight:500;color:var(--text-color, #1e293b)}.card-stats-grid[data-v-3c951048]{display:grid;grid-template-columns:repeat(2,1fr);gap:.5rem;margin-top:.5rem}.card-stats-grid .stat-item[data-v-3c951048]{display:flex;flex-direction:column;gap:.125rem}.card-stats-grid .stat-label[data-v-3c951048]{font-size:.75rem;color:var(--text-color-secondary, #64748b)}.card-stats-grid .stat-value[data-v-3c951048]{font-size:.9375rem;font-weight:600;color:var(--text-color, #1e293b)}.card-stats-grid .stat-value.success[data-v-3c951048]{color:var(--green-600, #16a34a)}.history-mobile-card .status-tag[data-v-3c951048]{font-size:.75rem}.filename-text[data-v-3c951048]{max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block;color:var(--text-color, #1e293b)}.filename-row[data-v-3c951048]{justify-content:flex-start!important}.filename-row .filename-text[data-v-3c951048]{font-size:.8125rem;font-weight:500;color:var(--primary-700, #4338ca);max-width:100%}.mobile-empty[data-v-3c951048]{display:flex;flex-direction:column;align-items:center;padding:2rem;color:var(--text-color-secondary, #64748b);text-align:center}.mobile-empty i[data-v-3c951048]{font-size:2rem;margin-bottom:.5rem}.charts-section[data-v-3c951048]{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:1rem;margin-bottom:1.5rem}.chart-card[data-v-3c951048]{background:var(--surface-card);border-radius:12px;padding:1.25rem;box-shadow:var(--shadow-sm);border:1px solid var(--surface-border)}.chart-card h3[data-v-3c951048]{font-size:1rem;font-weight:600;color:#1e293b;margin:0 0 1rem}.chart-container[data-v-3c951048]{height:250px;position:relative}.stats-overview[data-v-3c951048]{background:var(--surface-card);border-radius:12px;padding:1.25rem;box-shadow:var(--shadow-sm);border:1px solid var(--surface-border);margin-bottom:1.5rem}.stats-overview h3[data-v-3c951048]{font-size:1rem;font-weight:600;color:#1e293b;margin:0 0 1rem}.stats-grid[data-v-3c951048]{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:1rem}.stat-box[data-v-3c951048]{display:flex;align-items:center;gap:.75rem;padding:.75rem;background:var(--surface-ground);border-radius:8px}.stat-box i[data-v-3c951048]{font-size:1.5rem}.stat-info[data-v-3c951048]{display:flex;flex-direction:column}.stat-number[data-v-3c951048]{font-size:1.25rem;font-weight:600;color:var(--text-color)}.stat-desc[data-v-3c951048]{font-size:.8rem;color:var(--text-color-secondary)}.engine-badge[data-v-3c951048]{display:inline-block;padding:.25rem .5rem;border-radius:4px;font-size:.75rem;font-weight:500}.engine-badge.doctr[data-v-3c951048]{background:#eef2ff;color:#667eea}.engine-badge.paddleocr[data-v-3c951048]{background:#dcfce7;color:#16a34a}.engine-badge.tesseract[data-v-3c951048]{background:#fef3c7;color:#d97706}.engine-badge.auto[data-v-3c951048]{background:#f1f5f9;color:#475569}.engine-badge.hybrid[data-v-3c951048]{background:#ecfeff;color:#0891b2}.engine-badge.hybrid-quality[data-v-3c951048]{background:#f5f3ff;color:#7c3aed}.dynamic-badge[data-v-3c951048]{font-size:.65rem;padding:.2rem .4rem;border-radius:4px;font-weight:500;white-space:nowrap}.dynamic-badge.fastest[data-v-3c951048]{background:#fef3c7;color:#d97706}.dynamic-badge.quality[data-v-3c951048]{background:#dcfce7;color:#16a34a}.dynamic-badge.best[data-v-3c951048]{background:linear-gradient(135deg,#667eea,#764ba2);color:#fff}.error-text[data-v-3c951048]{color:#94a3b8}@media (max-width: 768px){.ocr-metrics-view[data-v-3c951048]{padding:1rem}.page-header h1[data-v-3c951048]{font-size:1.25rem}.charts-section[data-v-3c951048]{display:none}.stats-grid[data-v-3c951048]{grid-template-columns:repeat(2,1fr);gap:.5rem}.stat-box[data-v-3c951048]{padding:.5rem}.stat-box i[data-v-3c951048]{font-size:1.25rem}.stat-number[data-v-3c951048]{font-size:1rem}.filters-actions[data-v-3c951048]{flex-direction:column}.form-col[data-v-3c951048]{min-width:100%}}.empty-state-icon[data-v-3c951048]{font-size:3rem;color:var(--text-color-secondary)}.stat-icon[data-v-3c951048]{font-size:1.5rem}.stat-icon--primary[data-v-3c951048]{color:var(--primary-500, #667eea)}.stat-icon--success[data-v-3c951048]{color:var(--green-500, #22c55e)}.stat-icon--error[data-v-3c951048]{color:var(--red-500, #ef4444)}.stat-icon--warning[data-v-3c951048]{color:var(--yellow-500, #f59e0b)}.dropdown-borderless.p-dropdown{border:none!important;background:transparent!important;box-shadow:none!important;min-height:38px}.dropdown-borderless.p-dropdown:hover,.dropdown-borderless.p-dropdown.p-focus{border:none!important;box-shadow:none!important}.dropdown-borderless .p-dropdown-label{padding:.5rem .75rem!important;line-height:1.4!important}.dropdown-borderless .p-dropdown-trigger{background:transparent!important;width:2rem!important} diff --git a/deploy-package-20260223-151231/frontend/assets/ReceiptCreateUnifiedView.CjUTjkEM.css b/deploy-package-20260223-151231/frontend/assets/ReceiptCreateUnifiedView.CjUTjkEM.css deleted file mode 100644 index f431c8d..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ReceiptCreateUnifiedView.CjUTjkEM.css +++ /dev/null @@ -1 +0,0 @@ -.compact-upload-zone[data-v-742b1a2d]{margin-bottom:var(--space-xs)}.upload-strip[data-v-742b1a2d]{display:flex;align-items:center;justify-content:center;min-height:28px;padding:2px var(--space-sm);border:1px dashed var(--surface-border);border-radius:var(--radius-sm);background:var(--surface-ground);cursor:pointer;transition:all var(--transition-fast)}.upload-strip[data-v-742b1a2d]:hover{border-color:var(--primary-500);background:var(--surface-hover)}.upload-strip.dragging[data-v-742b1a2d]{border-color:var(--primary-500);background:var(--primary-50)}.upload-strip.processing[data-v-742b1a2d]{cursor:default;background:var(--surface-card)}.upload-strip.has-file[data-v-742b1a2d]{border-style:solid;border-color:var(--green-300);background:var(--green-50)}.hidden-input[data-v-742b1a2d]{display:none}.strip-content[data-v-742b1a2d]{display:flex;align-items:center;gap:var(--space-xs);font-size:var(--text-sm)}.strip-content i[data-v-742b1a2d]{font-size:var(--text-sm)}.empty-state[data-v-742b1a2d]{color:var(--text-color-secondary)}.empty-state i[data-v-742b1a2d]{color:var(--primary-500)}.file-state[data-v-742b1a2d]{color:var(--text-color)}.file-name[data-v-742b1a2d]{font-weight:var(--font-medium);max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.file-size[data-v-742b1a2d]{font-size:var(--text-xs);color:var(--text-color-secondary)}.processing-state[data-v-742b1a2d]{color:var(--text-color-secondary)}.processing-text[data-v-742b1a2d]{font-weight:var(--font-medium)}.processing-subtext[data-v-742b1a2d]{font-size:var(--text-xs);color:var(--text-color-secondary)}.action-bar[data-v-742b1a2d]{display:flex;flex-wrap:nowrap;gap:var(--space-sm);margin-top:2px;justify-content:center;align-items:center}.action-bar[data-v-742b1a2d] .p-button{padding:var(--space-xs) var(--space-sm);font-size:var(--text-xs);height:28px}.action-bar[data-v-742b1a2d] .p-button .p-button-icon{font-size:var(--text-sm)}.engine-selector[data-v-742b1a2d]{min-width:100px}.engine-selector[data-v-742b1a2d] .p-dropdown{padding:0 var(--space-xs);font-size:var(--text-xs);min-height:28px;height:28px}.engine-selector[data-v-742b1a2d] .p-dropdown-label{padding:var(--space-xs)}.engine-selector[data-v-742b1a2d] .p-dropdown-trigger{width:24px}.engine-option[data-v-742b1a2d]{display:flex;flex-direction:column;gap:0;padding:2px 0}.engine-label[data-v-742b1a2d]{font-weight:var(--font-medium);font-size:var(--text-xs)}.engine-desc[data-v-742b1a2d]{font-size:var(--text-xs);color:var(--text-color-secondary)}.error-message[data-v-742b1a2d]{margin-top:var(--space-xs)}.error-message[data-v-742b1a2d] .p-message{padding:var(--space-xs) var(--space-sm);font-size:var(--text-xs)}@media (max-width: 480px){.strip-content span[data-v-742b1a2d]:not(.file-name){display:none}.strip-content .file-name[data-v-742b1a2d]{max-width:150px}.action-bar[data-v-742b1a2d]{gap:var(--space-xs)}.engine-selector[data-v-742b1a2d]{min-width:90px}}.tva-row[data-v-4ce1221c]{display:flex;align-items:center;gap:var(--space-sm);background:var(--green-100);border-radius:var(--radius-sm);padding:var(--space-sm) var(--space-md);margin:var(--space-xs) 0}.row-label[data-v-4ce1221c]{font-weight:var(--font-semibold);font-size:var(--text-xs);color:var(--text-color);flex-shrink:0;min-width:40px}.tva-fields[data-v-4ce1221c]{display:flex;flex-wrap:wrap;gap:var(--space-sm, .5rem);align-items:center;flex:1}.tva-item[data-v-4ce1221c]{display:flex;align-items:center;gap:var(--space-xs)}.tva-item.active .tva-amount[data-v-4ce1221c] .p-inputnumber-input{background:color-mix(in srgb,var(--green-500) 8%,var(--surface-ground))}.tva-percent[data-v-4ce1221c]{width:70px}.tva-percent[data-v-4ce1221c] .p-inputnumber-input{width:100%;padding:var(--space-xs) var(--space-sm);font-size:var(--text-sm);font-weight:var(--font-normal);text-align:right;height:32px;background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-sm);color:var(--text-color)}.tva-percent[data-v-4ce1221c] .p-inputnumber-input:focus{border-color:var(--primary-color);box-shadow:0 0 0 1px var(--primary-color)}.tva-amount[data-v-4ce1221c]{width:90px}.tva-amount[data-v-4ce1221c] .p-inputnumber-input{width:100%;padding:var(--space-xs) var(--space-sm);font-size:var(--text-sm);font-weight:var(--font-normal);text-align:right;height:32px;background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-sm);color:var(--text-color)}.tva-amount[data-v-4ce1221c] .p-inputnumber-input:focus{border-color:var(--primary-color);box-shadow:0 0 0 1px var(--primary-color)}.add-btn[data-v-4ce1221c],.remove-btn[data-v-4ce1221c]{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border-radius:var(--radius-sm);border:1px dashed var(--surface-border);background:var(--surface-ground);color:var(--text-color-secondary);cursor:pointer;transition:all var(--transition-fast)}.add-btn[data-v-4ce1221c]:hover{background:var(--primary-color);border-color:var(--primary-color);color:#fff;border-style:solid}.remove-btn[data-v-4ce1221c]{border-style:solid;border-color:transparent;background:transparent}.remove-btn[data-v-4ce1221c]:hover{background:var(--red-500);border-color:var(--red-500);color:#fff}.add-btn i[data-v-4ce1221c],.remove-btn i[data-v-4ce1221c]{font-size:var(--text-xs)}@media (max-width: 480px){.tva-row[data-v-4ce1221c]{flex-direction:column;align-items:stretch;gap:var(--space-xs)}.row-label[data-v-4ce1221c]{margin-bottom:var(--space-xs)}.tva-fields[data-v-4ce1221c]{width:100%}.tva-item[data-v-4ce1221c]{width:100%;justify-content:flex-start}.tva-percent[data-v-4ce1221c]{flex:0 0 70px}.tva-amount[data-v-4ce1221c]{flex:1}}[data-theme=dark] .tva-row{background:#22c55e26}[data-theme=dark] .tva-row .p-inputnumber-input{background:var(--surface-ground)!important;color:var(--text-color)!important;border-color:var(--surface-border)!important}@media (prefers-color-scheme: dark){:root:not([data-theme=light]) .tva-row{background:#22c55e26}:root:not([data-theme=light]) .tva-row .p-inputnumber-input{background:var(--surface-ground)!important;color:var(--text-color)!important;border-color:var(--surface-border)!important}}.unified-receipt-form[data-v-0875fa76]{width:100%;max-width:100%}@media (min-width: 640px){.unified-receipt-form[data-v-0875fa76]{max-width:560px;margin:0 auto}}.form-body[data-v-0875fa76]{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:6px;padding:.25rem;overflow:hidden}.form-row[data-v-0875fa76]{display:flex;flex-direction:row;align-items:center;gap:.35rem;padding:.3rem .4rem;flex-wrap:wrap;min-height:32px}.form-row+.form-row[data-v-0875fa76]{border-top:1px solid var(--surface-border)}.inline-label[data-v-0875fa76]{font-size:var(--text-xs);font-weight:var(--font-semibold);color:var(--text-color-secondary);white-space:nowrap;flex-shrink:0}.supplier-input[data-v-0875fa76]{flex:1;min-width:100px}.supplier-input[data-v-0875fa76] .p-autocomplete-input{padding:var(--space-xs) var(--space-sm);font-size:var(--text-sm);height:32px}.supplier-input[data-v-0875fa76] .p-autocomplete-dropdown{width:24px}.cui-input[data-v-0875fa76]{width:140px;flex-shrink:0}.cui-input[data-v-0875fa76] input{padding:var(--space-xs) var(--space-sm);font-size:var(--text-sm);height:32px}.source-tag[data-v-0875fa76]{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;border-radius:50%;flex-shrink:0}.source-tag i[data-v-0875fa76]{font-size:var(--text-xs)}.source-tag.ok[data-v-0875fa76]{background:var(--green-100);color:var(--green-600)}.source-tag.warn[data-v-0875fa76]{background:var(--yellow-100);color:var(--yellow-700);cursor:pointer}.source-tag.warn[data-v-0875fa76]:hover{background:var(--yellow-200)}.sync-btn[data-v-0875fa76]{width:22px!important;height:22px!important;padding:0!important}.sync-btn[data-v-0875fa76] .pi{font-size:var(--text-xs)}.ocr-hint[data-v-0875fa76]{background:var(--blue-50);padding:var(--space-xs) var(--space-sm)!important;min-height:24px!important;font-size:var(--text-xs)}.hint-label[data-v-0875fa76]{color:var(--blue-500);font-weight:500}.hint-value[data-v-0875fa76]{color:var(--blue-700)}.client-hint[data-v-0875fa76]{background:var(--cyan-50);padding:var(--space-xs) var(--space-sm)!important;min-height:24px!important;font-size:var(--text-xs)}.client-hint .hint-label[data-v-0875fa76]{color:var(--cyan-600)}.client-hint .hint-value[data-v-0875fa76]{color:var(--cyan-700)}.type-select[data-v-0875fa76]{width:auto;min-width:100px}.nr-label[data-v-0875fa76]{margin-left:auto}.type-select[data-v-0875fa76] .p-dropdown{height:32px}.type-select[data-v-0875fa76] .p-dropdown-label{padding:var(--space-xs) var(--space-sm);font-size:var(--text-sm)}.nr-input[data-v-0875fa76]{width:90px;flex-shrink:0}.nr-input[data-v-0875fa76] input{padding:var(--space-xs) var(--space-sm);font-size:var(--text-sm);height:32px;text-align:right}.date-input[data-v-0875fa76]{width:150px;flex-shrink:0}.date-input[data-v-0875fa76] .p-inputtext{padding:var(--space-xs) var(--space-sm);font-size:var(--text-sm);height:32px}.date-input[data-v-0875fa76] .p-datepicker-trigger{width:28px}.total-row[data-v-0875fa76]{display:flex;flex-wrap:nowrap;align-items:center;gap:var(--space-xs, .25rem);background:var(--green-50);border-radius:var(--radius-sm, 4px);padding:var(--space-xs, .25rem) var(--space-sm, .5rem)!important;margin:var(--space-xs, .25rem) 0;overflow-x:auto}.total-label[data-v-0875fa76]{font-weight:700;font-size:var(--text-sm, .875rem);color:var(--text-color);flex-shrink:0}.total-input[data-v-0875fa76]{width:80px;flex-shrink:0}.total-input[data-v-0875fa76] .p-inputnumber-input{width:100%;font-size:var(--text-base);font-weight:var(--font-semibold);text-align:right;padding:var(--space-xs) var(--space-sm);height:32px;background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-sm);color:var(--text-color)}.pay-separator[data-v-0875fa76]{color:var(--text-color-secondary);font-weight:300;margin:0 var(--space-xs, .25rem)}.pay-inline[data-v-0875fa76]{display:flex;flex-wrap:nowrap;gap:var(--space-sm, .5rem);align-items:center}.pay-item[data-v-0875fa76]{display:flex;align-items:center;gap:var(--space-xs, .25rem)}.pay-label[data-v-0875fa76]{font-size:var(--text-xs);font-weight:var(--font-medium);color:var(--text-color-secondary)}.pay-input[data-v-0875fa76]{width:70px}.pay-input[data-v-0875fa76] .p-inputnumber-input{width:100%;padding:var(--space-xs) var(--space-sm);font-size:var(--text-sm);font-weight:var(--font-normal);text-align:right;height:32px;background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-sm);color:var(--text-color)}.mismatch-msg[data-v-0875fa76]{display:flex;align-items:center;gap:var(--space-xs, .25rem);padding:var(--space-xs, .25rem) var(--space-sm, .5rem);background:color-mix(in srgb,var(--yellow-500) 15%,var(--surface-card));border:1px solid var(--yellow-500);border-radius:var(--radius-sm, 4px);font-size:var(--text-xs, .75rem);color:var(--yellow-700);margin:var(--space-xs, .25rem) 0}.mismatch-msg i[data-v-0875fa76]{font-size:var(--text-xs, .75rem)}.tva-row-wrapper[data-v-0875fa76]{display:flex;align-items:flex-start;gap:var(--space-xs)}.tva-row-wrapper[data-v-0875fa76]>:first-child{flex:1}.tva-confidence[data-v-0875fa76]{margin-top:var(--space-sm);flex-shrink:0}.expense-row[data-v-0875fa76]{flex-wrap:wrap;background:var(--blue-50);border-radius:var(--radius-sm);padding:var(--space-sm) var(--space-md);margin:var(--space-xs) 0}.expense-select[data-v-0875fa76]{width:auto;min-width:160px}.expense-select[data-v-0875fa76] .p-dropdown{height:32px}.expense-select[data-v-0875fa76] .p-dropdown-label{padding:var(--space-xs) var(--space-sm);font-size:var(--text-sm)}.desc-input[data-v-0875fa76]{flex:1;min-width:80px;flex-basis:100%;margin-top:var(--space-xs)}.desc-input[data-v-0875fa76] input{padding:var(--space-xs) var(--space-sm);font-size:var(--text-sm);height:32px}.attachments-row[data-v-0875fa76]{align-items:center}.chips-wrap[data-v-0875fa76]{display:flex;flex-wrap:wrap;gap:var(--space-xs);flex:1;align-items:center}.file-chip[data-v-0875fa76]{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);background:var(--surface-hover);border-radius:var(--radius-sm);font-size:var(--text-sm);cursor:pointer}.file-chip[data-v-0875fa76]:hover{background:var(--surface-200)}.file-chip.new[data-v-0875fa76]{background:var(--blue-50);border:1px dashed var(--blue-300)}.file-chip i[data-v-0875fa76]{font-size:var(--text-sm)}.chip-remove[data-v-0875fa76]{font-size:var(--text-xs)!important;color:var(--text-color-secondary);margin-left:var(--space-xs)}.chip-remove[data-v-0875fa76]:hover{color:var(--red-500)}.add-chip[data-v-0875fa76]{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;background:var(--surface-hover);border:1px dashed var(--surface-border);border-radius:var(--radius-sm);cursor:pointer;color:var(--text-color-secondary)}.add-chip[data-v-0875fa76]:hover{background:var(--primary-50);border-color:var(--primary-300);color:var(--primary-500)}.add-chip i[data-v-0875fa76]{font-size:var(--text-xs)}.hidden-input[data-v-0875fa76]{display:none}.ocr-text-row[data-v-0875fa76]{justify-content:flex-start}.ocr-meta[data-v-0875fa76]{font-size:var(--text-xs);color:var(--text-color-secondary);background:var(--surface-hover);padding:2px var(--space-xs);border-radius:var(--radius-sm)}.ocr-raw-text[data-v-0875fa76]{margin:0;padding:var(--space-sm);background:var(--surface-ground);border:1px solid var(--surface-border);border-radius:var(--radius-sm);font-size:var(--text-xs);white-space:pre-wrap;word-break:break-word;max-height:120px;overflow:auto;color:var(--text-color-secondary)}@media (max-width: 480px){.form-row[data-v-0875fa76]{flex-wrap:wrap;gap:var(--space-xs)}.supplier-input[data-v-0875fa76],.cui-input[data-v-0875fa76],.type-select[data-v-0875fa76]{width:100%;flex:1 1 100%}.type-select[data-v-0875fa76] .p-dropdown{width:100%}.nr-label[data-v-0875fa76]{margin-left:0}.nr-input[data-v-0875fa76],.date-input[data-v-0875fa76]{flex:1;width:auto}.expense-row[data-v-0875fa76]{flex-direction:column;align-items:stretch}.expense-select[data-v-0875fa76]{width:100%;min-width:unset}.expense-select[data-v-0875fa76] .p-dropdown{width:100%}.desc-input[data-v-0875fa76]{width:100%;flex-basis:100%;margin-top:0}.total-row[data-v-0875fa76]{flex-wrap:wrap}.pay-separator[data-v-0875fa76]{display:none}.pay-inline[data-v-0875fa76]{width:100%;flex-wrap:wrap;margin-top:var(--space-xs);justify-content:flex-start}.pay-item[data-v-0875fa76]{flex:1 1 auto;min-width:80px}.pay-input[data-v-0875fa76]{flex:1;width:auto;min-width:60px}}[data-theme=dark] .source-tag.ok[data-v-0875fa76]{background:#22c55e33;color:var(--green-400)}[data-theme=dark] .source-tag.warn[data-v-0875fa76]{background:#eab30833;color:var(--yellow-400)}[data-theme=dark] .ocr-hint[data-v-0875fa76]{background:#3b82f61a}[data-theme=dark] .client-hint[data-v-0875fa76]{background:#06b6d414}[data-theme=dark] .client-hint .hint-label[data-v-0875fa76]{color:var(--cyan-400)}[data-theme=dark] .client-hint .hint-value[data-v-0875fa76]{color:var(--cyan-300)}[data-theme=dark] .total-row[data-v-0875fa76]{background:#22c55e1a}[data-theme=dark] .mismatch-msg[data-v-0875fa76]{background:#eab30826;color:var(--yellow-400)}[data-theme=dark] .expense-row[data-v-0875fa76]{background:#3b82f614}[data-theme=dark] .file-chip[data-v-0875fa76]{background:var(--surface-100)}[data-theme=dark] .file-chip.new[data-v-0875fa76]{background:#3b82f61a;border-color:var(--blue-700)}[data-theme=dark] .add-chip[data-v-0875fa76]{background:var(--surface-100);border-color:var(--surface-300)}.unified-receipt-form .p-dropdown{border:none!important;background:transparent!important;box-shadow:none!important}.unified-receipt-form .p-dropdown:hover,.unified-receipt-form .p-dropdown:focus,.unified-receipt-form .p-dropdown.p-focus{border:none!important;box-shadow:none!important}.unified-receipt-form .p-dropdown .p-dropdown-trigger{width:1.25rem}[data-theme=dark] .tva-row .p-inputnumber-input,[data-theme=dark] .pay-row .p-inputnumber-input{background:#1e293b!important;color:#f1f5f9!important;border:1px solid #475569!important}[data-theme=dark] .tva-row .p-inputnumber-input:focus,[data-theme=dark] .pay-row .p-inputnumber-input:focus{border-color:#3b82f6!important;box-shadow:0 0 0 1px #3b82f6!important}[data-theme=dark] .tva-row .p-dropdown-label,[data-theme=dark] .pay-row .p-dropdown-label{color:#f1f5f9!important}[data-theme=dark] .tva-row .grid-item,[data-theme=dark] .pay-row .grid-item{background:#1e293b!important;border-color:#475569!important}[data-theme=dark] .tva-row .grid-item.active{background:#22c55e26!important;border-color:#22c55e!important}[data-theme=dark] .pay-row .grid-item.active{background:#3b82f626!important;border-color:#3b82f6!important}[data-theme=dark] .tva-row .item-code{background:#334155!important;color:#f1f5f9!important}[data-theme=dark] .tva-row .entry-chip,[data-theme=dark] .pay-row .entry-chip{background:#334155!important;color:#f1f5f9!important;border-color:#475569!important}@media (prefers-color-scheme: dark){:root:not([data-theme=light]) .tva-row .p-inputnumber-input,:root:not([data-theme=light]) .pay-row .p-inputnumber-input{background:#1e293b!important;color:#f1f5f9!important;border:1px solid #475569!important}:root:not([data-theme=light]) .tva-row .grid-item,:root:not([data-theme=light]) .pay-row .grid-item{background:#1e293b!important;border-color:#475569!important}:root:not([data-theme=light]) .tva-row .entry-chip,:root:not([data-theme=light]) .pay-row .entry-chip{background:#334155!important;color:#f1f5f9!important}:root:not([data-theme=light]) .expense-row{background:#3b82f614}:root:not([data-theme=light]) .client-hint{background:#06b6d414}:root:not([data-theme=light]) .client-hint .hint-label{color:var(--cyan-400)}:root:not([data-theme=light]) .client-hint .hint-value{color:var(--cyan-300)}}.receipt-unified-view[data-v-56572cca]{padding:1rem;max-width:800px;margin:0 auto}.view-header[data-v-56572cca]{display:flex;justify-content:space-between;align-items:center;margin-bottom:1rem;padding:.75rem 1rem;background:var(--surface-card);border-radius:8px;border:1px solid var(--surface-border)}.header-left[data-v-56572cca]{display:flex;align-items:center;gap:.75rem}.view-title[data-v-56572cca]{font-size:1.25rem;font-weight:600;color:var(--text-color);margin:0;display:flex;align-items:center;gap:.5rem}.header-right[data-v-56572cca]{display:flex;gap:.5rem}.rejection-message[data-v-56572cca]{margin-bottom:1rem}.validation-banners[data-v-56572cca]{margin-top:1rem;display:flex;flex-direction:column;gap:.5rem}.dialog-content[data-v-56572cca]{display:flex;flex-direction:column;gap:.75rem}.form-field[data-v-56572cca]{display:flex;flex-direction:column;gap:.25rem}.form-field label[data-v-56572cca]{font-size:.85rem;font-weight:500;color:var(--text-color-secondary)}@media (max-width: 640px){.receipt-unified-view[data-v-56572cca]{padding:.5rem}.view-header[data-v-56572cca]{flex-direction:column;gap:.75rem;align-items:stretch}.header-left[data-v-56572cca]{justify-content:flex-start}.header-right[data-v-56572cca]{justify-content:flex-end;flex-wrap:wrap}}[data-theme=dark] .view-header[data-v-56572cca]{background:var(--surface-card)}.receipt-unified-view.mobile-compose-layout[data-v-56572cca]{padding:56px 0 64px;max-width:100%;min-height:100vh;background:var(--surface-ground)}.receipt-unified-view.mobile-compose-layout .view-header[data-v-56572cca]{display:none}.receipt-unified-view.mobile-compose-layout .rejection-message[data-v-56572cca]{margin:var(--space-sm);margin-bottom:0}.receipt-unified-view.mobile-compose-layout .validation-banners[data-v-56572cca]{margin:var(--space-sm);margin-top:var(--space-sm)}.receipt-unified-view.mobile-compose-layout[data-v-56572cca] .unified-receipt-form{max-width:100%;margin:0}.receipt-unified-view.mobile-compose-layout[data-v-56572cca] .form-body{border-radius:0;border-left:none;border-right:none} diff --git a/deploy-package-20260223-151231/frontend/assets/ReceiptCreateUnifiedView.DfEiZDmT.js b/deploy-package-20260223-151231/frontend/assets/ReceiptCreateUnifiedView.DfEiZDmT.js deleted file mode 100644 index 496f8ff..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ReceiptCreateUnifiedView.DfEiZDmT.js +++ /dev/null @@ -1,2 +0,0 @@ -import{a as b,j as D,o as Ue,w as Pe,l as je,c as y,d as o,e as r,i as f,h as $,q as h,O as m,v as S,E as ae,u as pe,t as oe,p as te,y as le,F as ce,B as be,M as ma,K as fa,P as ya}from"./vendor-core.B6UiYhU_.js";import{_ as ge,f as ba,a as Re,j as ga,u as wa,g as ha,s as _a,d as Ca,i as Ra}from"./index.B8XI8FQW.js";import{s as N,I as ke,K as ue,E as de,J as ka,d as Oe}from"./vendor-primevue.BN-meDW0.js";import{u as Aa,a as Va}from"./sharedStores.D4bwf0TZ.js";import{u as Ta,a as Me}from"./ocrSettingsStore.B3n_bOhs.js";import{O as re}from"./OCRConfidenceIndicator.BILrhVia.js";import{M as Da}from"./MobileTopBar.BnL78WPy.js";import"./vendor-utils.CO3CyGpV.js";import"./vendor-export.BWjBvx7Z.js";const Ea={class:"compact-upload-zone"},Sa={key:0,class:"strip-content processing-state"},xa={class:"processing-text"},$a={key:0,class:"processing-subtext"},La={key:1,class:"strip-content file-state"},za={class:"file-name"},Fa={class:"file-size"},Oa={key:2,class:"strip-content empty-state"},Ma={key:0},Na={key:1},Ia={key:0,class:"action-bar"},Ba={__name:"CompactUploadZone",emits:["ocr-result","file-selected","error"],setup(a,{expose:d,emit:w}){const i=w,V=b(null),s=b(null),P=b(!1),C=b(!1),R=b(null),j=Ta(),q=b("auto"),x={auto:{label:"Auto",desc:"docTR→Paddle→Tess"},doctr:{label:"docTR",desc:"Rapid, buna acuratete"},doctr_plus:{label:"docTR Plus",desc:"2 treceri (recomandat)"},paddleocr:{label:"PaddleOCR",desc:"Cea mai buna calitate"},tesseract:{label:"Tesseract",desc:"Cel mai rapid"},hybrid:{label:"Hybrid",desc:"docTR+Tess paralel"},"hybrid-quality":{label:"Hybrid Calitate",desc:"Acuratete max"}},_=D(()=>j.availableEngines.map(u=>{var p,g;return{label:((p=x[u])==null?void 0:p.label)||u,desc:((g=x[u])==null?void 0:g.desc)||"",value:u}})),k=b(null),L=b(null),H=b(null),I=b(null),ve=D(()=>I.value==="pending"&&L.value>0?`In coada (${L.value})`:I.value==="processing"?"Se proceseaza...":"Se trimite..."),K=D(()=>I.value==="pending"&&H.value>0?`~${H.value}s`:"");Ue(async()=>{await j.loadPreference(),q.value=j.preferredEngine}),Pe(q,async(u,p)=>{if(p&&u!==p&&j.initialized)try{await j.setPreference(u)}catch(g){console.error("[CompactUploadZone] Failed to save preference:",g)}});const X=()=>{P.value=!0},me=()=>{P.value=!1},Q=u=>{var g;P.value=!1;const p=(g=u.dataTransfer)==null?void 0:g.files;(p==null?void 0:p.length)>0&&ne(p[0])},se=()=>{var u;(u=V.value)==null||u.click()},ie=u=>{var g;const p=(g=u.target)==null?void 0:g.files;(p==null?void 0:p.length)>0&&ne(p[0])},ne=async u=>{if(!["image/jpeg","image/png","application/pdf"].includes(u.type)){R.value="Tip de fisier invalid. Acceptate: JPG, PNG, PDF";return}if(u.size>10*1024*1024){R.value="Fisier prea mare. Max 10MB.";return}R.value=null;try{const g=await u.arrayBuffer(),A=new File([g],u.name,{type:u.type,lastModified:u.lastModified});s.value=A,i("file-selected",A)}catch(g){console.warn("File clone failed:",g),s.value=u,i("file-selected",u)}},c=async()=>{var u,p;if(s.value){C.value=!0,R.value=null,k.value=null,L.value=null,H.value=null,I.value="submitting";try{const g=new FormData;g.append("file",s.value);const B=(await Me.post(`/ocr/extract?engine=${q.value}`,g,{timeout:3e4})).data;k.value=B.job_id,L.value=B.queue_position,H.value=B.estimated_wait_seconds,I.value=B.status,await t(B.job_id)}catch(g){const A=((p=(u=g.response)==null?void 0:u.data)==null?void 0:p.detail)||g.message||"Eroare OCR";R.value=A,i("error",A),C.value=!1}}},t=async u=>{const B=Date.now(),W=async()=>{var J;if((Date.now()-B)/1e3>=120){C.value=!1,R.value="Timeout - procesare prea lunga",i("error",R.value);return}const Z=Date.now();try{const T=(await Me.get(`/ocr/jobs/${u}/wait`,{params:{timeout:30,_t:Date.now()},timeout:35e3,headers:{"Cache-Control":"no-cache"}})).data;if(I.value=T.status,L.value=T.queue_position,H.value=T.estimated_wait_seconds,T.status==="completed"){C.value=!1,T.result?i("ocr-result",{...T.result,_processing_time_ms:T.processing_time_ms}):(R.value="OCR completat dar fara rezultat",i("error",R.value));return}if(T.status==="failed"){C.value=!1,R.value=T.error||"Procesare OCR esuata",i("error",R.value);return}if(C.value){const v=Date.now()-Z;v<500&&await new Promise(z=>setTimeout(z,500-v)),await W()}}catch(U){if(U.code==="ECONNABORTED"||(J=U.message)!=null&&J.includes("timeout")){C.value&&await W();return}if((Date.now()-B)/1e3<120&&C.value){await new Promise(v=>setTimeout(v,500)),await W();return}C.value=!1,R.value="Eroare verificare job",i("error",R.value)}};await W()},l=u=>u<1024?u+" B":u<1024*1024?(u/1024).toFixed(1)+" KB":(u/(1024*1024)).toFixed(1)+" MB";return d({reset:()=>{s.value=null,R.value=null,k.value=null,L.value=null,H.value=null,I.value=null,C.value=!1,V.value&&(V.value.value="")},processOCR:c}),(u,p)=>{const g=je("tooltip");return o(),y("div",Ea,[r("div",{class:pe(["upload-strip",{dragging:P.value,processing:C.value,"has-file":s.value}]),onDragover:ae(X,["prevent"]),onDragleave:ae(me,["prevent"]),onDrop:ae(Q,["prevent"]),onClick:se},[r("input",{ref_key:"fileInput",ref:V,type:"file",accept:"image/*,application/pdf",class:"hidden-input",onChange:ie},null,544),C.value?(o(),y("div",Sa,[h(m(ba),{style:{width:"24px",height:"24px"},strokeWidth:"4"}),r("span",xa,S(ve.value),1),K.value?(o(),y("span",$a,S(K.value),1)):f("",!0)])):s.value?(o(),y("div",La,[p[3]||(p[3]=r("i",{class:"pi pi-check-circle",style:{color:"var(--green-500)"}},null,-1)),r("span",za,S(s.value.name),1),r("span",Fa,"("+S(l(s.value.size))+")",1)])):(o(),y("div",Oa,[p[4]||(p[4]=r("i",{class:"pi pi-camera"},null,-1)),P.value?(o(),y("span",Ma,"Elibereaza pentru a incarca")):(o(),y("span",Na,"Trage poza bonului aici sau click pentru a selecta"))]))],34),s.value&&!C.value?(o(),y("div",Ia,[oe(h(m(N),{icon:"pi pi-refresh",severity:"secondary",size:"small",onClick:ae(se,["stop"])},null,512),[[g,"Schimba fisier",void 0,{top:!0}]]),h(m(ke),{modelValue:q.value,"onUpdate:modelValue":p[0]||(p[0]=A=>q.value=A),options:_.value,optionLabel:"label",optionValue:"value",placeholder:"OCR",class:"engine-selector dropdown-borderless",onClick:p[1]||(p[1]=ae(()=>{},["stop"]))},null,8,["modelValue","options"]),h(m(N),{label:"OCR",icon:"pi pi-play",size:"small",onClick:ae(c,["stop"])})])):f("",!0),R.value?(o(),$(m(Re),{key:1,severity:"error",closable:!0,onClose:p[2]||(p[2]=A=>R.value=null),class:"error-message"},{default:te(()=>[le(S(R.value),1)]),_:1})):f("",!0)])}}},Ua=ge(Ba,[["__scopeId","data-v-742b1a2d"]]),Pa={class:"tva-row"},ja={class:"tva-fields"},qa=["onClick"],Ha={__name:"TvaCompactFields",props:{modelValue:{type:Object,required:!0},disabled:{type:Boolean,default:!1}},emits:["update:modelValue"],setup(a,{emit:d}){const w=a,i=d,V=["A","B","C","D","E"],s=b(["A"]),P=D(()=>s.value.map(x=>({code:x,...w.modelValue[x]}))),C=D(()=>s.value.length{const x=V.find(_=>!s.value.includes(_));x&&(s.value=[...s.value,x])},j=x=>{if(s.value.length>1){const _=s.value[x];s.value=s.value.filter((k,L)=>L!==x),w.modelValue[_]&&(w.modelValue[_].percent=null,w.modelValue[_].amount=0,q())}};Pe(()=>w.modelValue,x=>{if(!x)return;const _=V.filter(k=>{var L;return((L=x[k])==null?void 0:L.amount)>0});if(_.length>0){const k=[...new Set([...s.value,..._])];k.length!==s.value.length&&(s.value=k)}},{deep:!0,immediate:!0});const q=()=>{i("update:modelValue",{...w.modelValue})};return(x,_)=>(o(),y("div",Pa,[_[2]||(_[2]=r("span",{class:"row-label"},"TVA",-1)),r("div",ja,[(o(!0),y(ce,null,be(P.value,(k,L)=>{var H;return o(),y("div",{key:k.code,class:pe(["tva-item",{active:((H=a.modelValue[k.code])==null?void 0:H.amount)>0}])},[h(m(ue),{modelValue:a.modelValue[k.code].percent,"onUpdate:modelValue":I=>a.modelValue[k.code].percent=I,suffix:"%",min:0,max:100,placeholder:"21",disabled:a.disabled,class:"tva-percent",onInput:q},null,8,["modelValue","onUpdate:modelValue","disabled"]),h(m(ue),{modelValue:a.modelValue[k.code].amount,"onUpdate:modelValue":I=>a.modelValue[k.code].amount=I,minFractionDigits:2,maxFractionDigits:2,disabled:a.disabled,placeholder:"0.00",class:"tva-amount",onInput:q},null,8,["modelValue","onUpdate:modelValue","disabled"]),P.value.length>1&&!a.disabled?(o(),y("button",{key:0,type:"button",class:"remove-btn",onClick:I=>j(L)},[..._[0]||(_[0]=[r("i",{class:"pi pi-times"},null,-1)])],8,qa)):f("",!0)],2)}),128)),C.value&&!a.disabled?(o(),y("button",{key:0,type:"button",class:"add-btn",onClick:R},[..._[1]||(_[1]=[r("i",{class:"pi pi-plus"},null,-1)])])):f("",!0)])]))}},Wa=ge(Ha,[["__scopeId","data-v-4ce1221c"]]),Ga={class:"unified-receipt-form"},Za={class:"form-body"},Ja={class:"form-row"},Ka={key:1,class:"source-tag ok"},Xa={key:0,class:"form-row ocr-hint"},Qa={class:"hint-value"},Ya={key:0,class:"hint-value"},et={key:1,class:"form-row client-hint"},at={class:"hint-value"},tt={key:0,class:"hint-value"},lt={class:"form-row"},st={class:"form-row total-row"},it={class:"pay-inline"},nt={class:"pay-item"},rt={class:"pay-item"},ot={class:"pay-item"},ut={key:2,class:"mismatch-msg"},ct={class:"tva-row-wrapper"},dt={class:"form-row expense-row"},pt={key:3,class:"form-row attachments-row"},vt={class:"chips-wrap"},mt=["onClick"],ft=["onClick"],yt=["onClick"],bt={key:4,class:"form-row ocr-text-row"},gt={key:0,class:"ocr-meta"},wt={key:1,class:"ocr-meta"},ht={key:5,class:"ocr-raw-text"},_t={__name:"UnifiedReceiptForm",props:{modelValue:{type:Object,required:!0},ocrData:{type:Object,default:null},partners:{type:Array,default:()=>[]},expenseTypes:{type:Array,default:()=>[]},supplierSource:{type:String,default:null},supplierWarning:{type:Boolean,default:!1},syncingSuppliers:{type:Boolean,default:!1},existingAttachments:{type:Array,default:()=>[]},selectedFiles:{type:Array,default:()=>[]},readonly:{type:Boolean,default:!1}},emits:["update:modelValue","ocr-result","file-selected","ocr-error","partner-selected","sync-suppliers","create-supplier","add-files","remove-file","remove-attachment","download-attachment"],setup(a,{expose:d,emit:w}){const i=a,V=w,s=D({get:()=>i.modelValue,set:t=>V("update:modelValue",t)}),P=b(null),C=b(null),R=b(!1),j=b([]),q=[{value:"bon_fiscal",label:"Bon fiscal"},{value:"chitanta",label:"Chitanta"}],x=()=>{const t=s.value.partner_name;return typeof t=="string"?t:(t==null?void 0:t.name)||""},_=t=>{const l=t.query.toLowerCase();j.value=i.partners.filter(E=>E.name.toLowerCase().includes(l)||E.fiscal_code&&E.fiscal_code.toLowerCase().includes(l))},k=t=>{const l=t.value;l&&(s.value.cui=l.fiscal_code||"",l.address&&(s.value.vendor_address=l.address),V("partner-selected",l))},L=t=>V("ocr-result",t),H=t=>V("file-selected",t),I=t=>V("ocr-error",t),ve=()=>{var t;return(t=C.value)==null?void 0:t.click()},K=async t=>{var u;const l=Array.from(((u=t.target)==null?void 0:u.files)||[]);if(l.length===0)return;const E=await Promise.all(l.map(async p=>{try{const g=await p.arrayBuffer();return new File([g],p.name,{type:p.type,lastModified:p.lastModified})}catch{return p}}));V("add-files",E),C.value&&(C.value.value="")},X=(t,l=15)=>{if(!t||t.length<=l)return t;const E=t.split(".").pop();return t.substring(0,l-E.length-3)+"..."+E},me=t=>t<1e3?`${t}ms`:`${(t/1e3).toFixed(1)}s`,Q=D(()=>{var t,l,E,u;return(((t=s.value.payments)==null?void 0:t.CARD)||0)+(((l=s.value.payments)==null?void 0:l.NUMERAR)||0)+(((u=(E=s.value.payments)==null?void 0:E.ALTE)==null?void 0:u.amount)||0)}),se=D(()=>!s.value.amount||s.value.amount===0||Q.value===0?!1:Math.abs(Q.value-s.value.amount)>.02),ie=t=>parseFloat(t||0).toLocaleString("ro-RO",{minimumFractionDigits:2,maximumFractionDigits:2}),ne=D(()=>{var l;const t=(l=i.ocrData)==null?void 0:l.payment_methods;return t&&t.length>0}),c=D(()=>{var l;const t=(l=i.ocrData)==null?void 0:l.tva_entries;return t&&t.length>0});return d({resetUpload:()=>{var t;return(t=P.value)==null?void 0:t.reset()},processOCR:()=>{var t;return(t=P.value)==null?void 0:t.processOCR()}}),(t,l)=>{var u,p,g,A,B,W,Y,Z,J,U,T;const E=je("tooltip");return o(),y("div",Ga,[a.readonly?f("",!0):(o(),$(Ua,{key:0,ref_key:"uploadZone",ref:P,onOcrResult:L,onFileSelected:H,onError:I},null,512)),r("div",Za,[r("div",Ja,[l[17]||(l[17]=r("span",{class:"inline-label"},"Furnizor",-1)),h(m(ga),{modelValue:s.value.partner_name,"onUpdate:modelValue":l[0]||(l[0]=v=>s.value.partner_name=v),suggestions:j.value,optionLabel:"name",field:"name",onComplete:_,onItemSelect:k,placeholder:"Cauta...",dropdown:"",forceSelection:!1,disabled:a.readonly,class:"supplier-input"},null,8,["modelValue","suggestions","disabled"]),h(m(de),{modelValue:s.value.cui,"onUpdate:modelValue":l[1]||(l[1]=v=>s.value.cui=v),placeholder:"CUI",disabled:a.readonly,class:"cui-input"},null,8,["modelValue","disabled"]),(u=a.ocrData)!=null&&u.confidence_vendor?(o(),$(re,{key:0,confidence:a.ocrData.confidence_vendor,size:"small"},null,8,["confidence"])):f("",!0),a.supplierSource?oe((o(),y("span",Ka,[...l[15]||(l[15]=[r("i",{class:"pi pi-check"},null,-1)])])),[[E,"Gasit in "+a.supplierSource,void 0,{top:!0}]]):a.supplierWarning?oe((o(),y("span",{key:2,class:"source-tag warn",onClick:l[2]||(l[2]=v=>t.$emit("create-supplier"))},[...l[16]||(l[16]=[r("i",{class:"pi pi-plus"},null,-1)])])),[[E,"Click pentru a crea",void 0,{top:!0}]]):f("",!0),a.readonly?f("",!0):oe((o(),$(m(N),{key:3,icon:"pi pi-sync",text:"",rounded:"",size:"small",loading:a.syncingSuppliers,onClick:l[3]||(l[3]=v=>t.$emit("sync-suppliers")),class:"sync-btn"},null,8,["loading"])),[[E,"Sincronizeaza",void 0,{top:!0}]])]),(p=a.ocrData)!=null&&p.partner_name&&a.ocrData.partner_name!==x()?(o(),y("div",Xa,[l[18]||(l[18]=r("span",{class:"hint-label"},"OCR:",-1)),r("span",Qa,S(a.ocrData.partner_name),1),a.ocrData.cui?(o(),y("span",Ya,"("+S(a.ocrData.cui)+")",1)):f("",!0)])):f("",!0),(g=a.ocrData)!=null&&g.client_name||(A=a.ocrData)!=null&&A.client_cui?(o(),y("div",et,[l[19]||(l[19]=r("span",{class:"hint-label"},"Client:",-1)),r("span",at,S(a.ocrData.client_name||"—"),1),a.ocrData.client_cui?(o(),y("span",tt,"("+S(a.ocrData.client_cui)+")",1)):f("",!0),(B=a.ocrData)!=null&&B.confidence_client?(o(),$(re,{key:1,confidence:a.ocrData.confidence_client,size:"small"},null,8,["confidence"])):f("",!0)])):f("",!0),r("div",lt,[h(m(ke),{modelValue:s.value.receipt_type,"onUpdate:modelValue":l[4]||(l[4]=v=>s.value.receipt_type=v),options:q,optionLabel:"label",optionValue:"value",disabled:a.readonly,class:"type-select dropdown-borderless"},null,8,["modelValue","disabled"]),l[20]||(l[20]=r("span",{class:"inline-label nr-label"},"Nr.",-1)),h(m(de),{modelValue:s.value.receipt_number,"onUpdate:modelValue":l[5]||(l[5]=v=>s.value.receipt_number=v),placeholder:"–",disabled:a.readonly,class:"nr-input"},null,8,["modelValue","disabled"]),l[21]||(l[21]=r("span",{class:"inline-label"},"Data",-1)),h(m(ka),{modelValue:s.value.receipt_date,"onUpdate:modelValue":l[6]||(l[6]=v=>s.value.receipt_date=v),dateFormat:"dd.mm.yy",showIcon:"",disabled:a.readonly,class:"date-input"},null,8,["modelValue","disabled"]),(W=a.ocrData)!=null&&W.confidence_date?(o(),$(re,{key:0,confidence:a.ocrData.confidence_date,size:"small"},null,8,["confidence"])):f("",!0)]),r("div",st,[l[25]||(l[25]=r("span",{class:"total-label"},"TOTAL",-1)),h(m(ue),{modelValue:s.value.amount,"onUpdate:modelValue":l[7]||(l[7]=v=>s.value.amount=v),minFractionDigits:2,maxFractionDigits:2,disabled:a.readonly,placeholder:"0.00",class:"total-input"},null,8,["modelValue","disabled"]),(Y=a.ocrData)!=null&&Y.confidence_amount?(o(),$(re,{key:0,confidence:a.ocrData.confidence_amount,size:"small"},null,8,["confidence"])):f("",!0),l[26]||(l[26]=r("span",{class:"pay-separator"},"│",-1)),r("div",it,[r("div",nt,[l[22]||(l[22]=r("span",{class:"pay-label"},"Card",-1)),h(m(ue),{modelValue:s.value.payments.CARD,"onUpdate:modelValue":l[8]||(l[8]=v=>s.value.payments.CARD=v),minFractionDigits:2,maxFractionDigits:2,disabled:a.readonly,placeholder:"0.00",class:"pay-input"},null,8,["modelValue","disabled"])]),r("div",rt,[l[23]||(l[23]=r("span",{class:"pay-label"},"Cash",-1)),h(m(ue),{modelValue:s.value.payments.NUMERAR,"onUpdate:modelValue":l[9]||(l[9]=v=>s.value.payments.NUMERAR=v),minFractionDigits:2,maxFractionDigits:2,disabled:a.readonly,placeholder:"0.00",class:"pay-input"},null,8,["modelValue","disabled"])]),r("div",ot,[l[24]||(l[24]=r("span",{class:"pay-label"},"Alte",-1)),h(m(ue),{modelValue:s.value.payments.ALTE.amount,"onUpdate:modelValue":l[10]||(l[10]=v=>s.value.payments.ALTE.amount=v),minFractionDigits:2,maxFractionDigits:2,disabled:a.readonly,placeholder:"0.00",class:"pay-input"},null,8,["modelValue","disabled"])]),(Z=a.ocrData)!=null&&Z.confidence_payment&&ne.value?oe((o(),$(re,{key:0,confidence:a.ocrData.confidence_payment,size:"small"},null,8,["confidence"])),[[E,"Incredere extragere plati",void 0,{top:!0}]]):f("",!0)])]),se.value?(o(),y("div",ut,[l[27]||(l[27]=r("i",{class:"pi pi-exclamation-triangle"},null,-1)),le(" Plati ("+S(ie(Q.value))+") ≠ Total ("+S(ie(s.value.amount))+") ",1)])):f("",!0),r("div",ct,[h(Wa,{modelValue:s.value.tva,"onUpdate:modelValue":l[11]||(l[11]=v=>s.value.tva=v),disabled:a.readonly},null,8,["modelValue","disabled"]),(J=a.ocrData)!=null&&J.confidence_tva&&c.value?oe((o(),$(re,{key:0,confidence:a.ocrData.confidence_tva,size:"small",class:"tva-confidence"},null,8,["confidence"])),[[E,"Incredere extragere TVA",void 0,{top:!0}]]):f("",!0)]),r("div",dt,[h(m(ke),{modelValue:s.value.expense_type_code,"onUpdate:modelValue":l[12]||(l[12]=v=>s.value.expense_type_code=v),options:a.expenseTypes,optionLabel:"name",optionValue:"code",placeholder:"Cheltuiala...",disabled:a.readonly,class:"expense-select dropdown-borderless"},null,8,["modelValue","options","disabled"]),h(m(de),{modelValue:s.value.description,"onUpdate:modelValue":l[13]||(l[13]=v=>s.value.description=v),placeholder:"Descriere...",disabled:a.readonly,class:"desc-input"},null,8,["modelValue","disabled"])]),a.existingAttachments.length||a.selectedFiles.length||!a.readonly?(o(),y("div",pt,[l[29]||(l[29]=r("span",{class:"inline-label"},"Atasamente",-1)),r("div",vt,[(o(!0),y(ce,null,be(a.existingAttachments,v=>{var z;return o(),y("span",{key:v.id,class:"file-chip",onClick:G=>t.$emit("download-attachment",v)},[r("i",{class:pe((z=v.mime_type)!=null&&z.startsWith("image/")?"pi pi-image":"pi pi-file-pdf")},null,2),le(" "+S(X(v.filename))+" ",1),a.readonly?f("",!0):(o(),y("i",{key:0,class:"pi pi-times chip-remove",onClick:ae(G=>t.$emit("remove-attachment",v.id),["stop"])},null,8,ft))],8,mt)}),128)),(o(!0),y(ce,null,be(a.selectedFiles,(v,z)=>{var G;return o(),y("span",{key:"new-"+z,class:"file-chip new"},[r("i",{class:pe((G=v.type)!=null&&G.startsWith("image/")?"pi pi-image":"pi pi-file-pdf")},null,2),le(" "+S(X(v.name))+" ",1),r("i",{class:"pi pi-times chip-remove",onClick:ee=>t.$emit("remove-file",z)},null,8,yt)])}),128)),a.readonly?f("",!0):(o(),y("button",{key:0,class:"add-chip",onClick:ve},[...l[28]||(l[28]=[r("i",{class:"pi pi-plus"},null,-1)])]))]),r("input",{ref_key:"fileInputRef",ref:C,type:"file",accept:"image/*,application/pdf",multiple:"",class:"hidden-input",onChange:K},null,544)])):f("",!0),(U=a.ocrData)!=null&&U.raw_text?(o(),y("div",bt,[h(m(N),{label:R.value?"Ascunde":"Text OCR",icon:R.value?"pi pi-eye-slash":"pi pi-eye",size:"small",severity:"secondary",text:"",onClick:l[14]||(l[14]=v=>R.value=!R.value)},null,8,["label","icon"]),a.ocrData.ocr_engine?(o(),y("span",gt,S(a.ocrData.ocr_engine),1)):f("",!0),a.ocrData.processing_time_ms?(o(),y("span",wt,S(me(a.ocrData.processing_time_ms)),1)):f("",!0)])):f("",!0),R.value&&((T=a.ocrData)!=null&&T.raw_text)?(o(),y("pre",ht,S(a.ocrData.raw_text),1)):f("",!0)])])}}},Ct=ge(_t,[["__scopeId","data-v-0875fa76"]]),qe=()=>({A:{percent:19,amount:0},B:{percent:9,amount:0},C:{percent:5,amount:0},D:{percent:0,amount:0},E:{percent:null,amount:0}}),He=()=>({CARD:0,NUMERAR:0,ALTE:{amount:0,type:null}}),Ne=a=>{const d=qe();return!a||!Array.isArray(a)||a.forEach(w=>{var V;const i=(V=w.code)==null?void 0:V.toUpperCase();i&&d[i]&&(d[i]={percent:w.percent??d[i].percent,amount:parseFloat(w.amount)||0})}),d},Rt=a=>{if(!a)return null;const d=Object.entries(a).filter(([w,i])=>i.amount&&i.amount>0).map(([w,i])=>({code:w,percent:i.percent??0,amount:parseFloat(i.amount)||0}));return d.length>0?d:null},kt=a=>a?Object.values(a).reduce((d,w)=>d+(parseFloat(w.amount)||0),0):0,Ie=a=>{const d=He();return!a||!Array.isArray(a)||a.forEach(w=>{var s;const i=(s=w.method)==null?void 0:s.toUpperCase(),V=parseFloat(w.amount)||0;i==="CARD"?d.CARD=V:i==="NUMERAR"||i==="CASH"?d.NUMERAR=V:i&&(d.ALTE.amount+=V,i.includes("TICH")||i.includes("MASA")?d.ALTE.type="tichete_masa":i.includes("VOUCHER")?d.ALTE.type="voucher":i.includes("CREDIT")&&(d.ALTE.type="credit_magazin"))}),d},At=a=>{var w;if(!a)return null;const d=[];if(a.CARD&&a.CARD>0&&d.push({method:"CARD",amount:a.CARD}),a.NUMERAR&&a.NUMERAR>0&&d.push({method:"NUMERAR",amount:a.NUMERAR}),(w=a.ALTE)!=null&&w.amount&&a.ALTE.amount>0){let i="ALTE";a.ALTE.type==="tichete_masa"?i="TICHETE_MASA":a.ALTE.type==="voucher"?i="VOUCHER":a.ALTE.type==="credit_magazin"&&(i="CREDIT_MAGAZIN"),d.push({method:i,amount:a.ALTE.amount})}return d.length>0?d:null},Vt=()=>({receipt_type:"bon_fiscal",receipt_date:new Date,receipt_number:"",partner_name:null,cui:"",vendor_address:"",amount:null,tva:qe(),payments:He(),expense_type_code:null,description:"",ocr_raw_text:"",items_count:null,company_id:null}),Be=a=>{var d;return{receipt_type:a.receipt_type,direction:"cheltuiala",receipt_date:a.receipt_date instanceof Date?a.receipt_date.toISOString().split("T")[0]:a.receipt_date,receipt_number:a.receipt_number||null,partner_name:typeof a.partner_name=="string"?a.partner_name:((d=a.partner_name)==null?void 0:d.name)||null,cui:a.cui||null,vendor_address:a.vendor_address||null,amount:a.amount||0,tva_breakdown:Rt(a.tva),tva_total:kt(a.tva)||null,payment_methods:At(a.payments),expense_type_code:a.expense_type_code||null,description:a.description||null,ocr_raw_text:a.ocr_raw_text||null,items_count:a.items_count||null,company_id:a.company_id,payment_mode:null,cash_register_id:null,cash_register_name:null,cash_register_account:null}},Tt={key:2,class:"view-header"},Dt={class:"header-left"},Et={class:"view-title"},St={class:"header-right"},xt={key:4,class:"validation-banners"},$t={class:"dialog-content"},Lt={class:"dialog-content"},zt={class:"form-field"},Ft={class:"form-field"},Ot={class:"form-field"},Mt={__name:"ReceiptCreateUnifiedView",setup(a){const d=ma(),w=ya(),i=wa(),V=ha(),s=Aa(),P=Va(),C=b(window.innerWidth<768),R=b(!1),j=b(window.innerHeight),q=()=>{var e;if(C.value=window.innerWidth<768,C.value){const n=j.value-((e=window.visualViewport)==null?void 0:e.height)||window.innerHeight;R.value=n>150}},x=()=>{var F;if(!C.value)return;const e=((F=window.visualViewport)==null?void 0:F.height)||window.innerHeight,n=j.value-e;R.value=n>150},_=D(()=>!!d.params.id&&!d.path.endsWith("/edit")),k=D(()=>!!d.params.id&&d.path.endsWith("/edit")),L=D(()=>!d.params.id),H=D(()=>{var e;return _.value?`Bon #${((e=t.value)==null?void 0:e.id)||""}`:k.value?"Editare Bon":"Bon Fiscal Nou"}),I=D(()=>_.value?"pi pi-receipt":"pi pi-plus-circle"),ve=D(()=>{var e;return _.value?`Bon #${((e=t.value)==null?void 0:e.id)||""}`:k.value?"Editare Bon":"Bon Nou"}),K=D(()=>c.value.amount&&c.value.amount>0&&c.value.receipt_date),X=D(()=>t.value?["draft","rejected"].includes(t.value.status):!1),me=D(()=>{var e;return((e=t.value)==null?void 0:e.status)||"draft"}),Q=D(()=>!0),se=D(()=>{const e=[];return t.value&&(p.value.length>0&&e.push({label:"Vizualizează Atașamente",icon:"pi pi-images",command:()=>ua()}),e.push({label:"Partajează",icon:"pi pi-share-alt",command:()=>ca()}),e.push({separator:!0}),X.value&&e.push({label:"Șterge Bonul",icon:"pi pi-trash",class:"p-menuitem-danger",command:()=>Ce()})),e}),ie=D(()=>{var n;const e=[];if(!_.value)e.push({id:"save",icon:"pi pi-save",label:"Salvează",tooltip:"Salvează ciornă",disabled:g.value}),k.value&&((n=t.value)==null?void 0:n.status)==="draft"?e.push({id:"submit",icon:"pi pi-send",label:"Trimite",tooltip:"Trimite spre aprobare",severity:"success",disabled:!K.value||A.value}):L.value&&e.push({id:"submit",icon:"pi pi-send",label:"Trimite",tooltip:"Salvează și trimite",severity:"success",disabled:!K.value||A.value});else{switch(me.value){case"draft":e.push({id:"edit",icon:"pi pi-pencil",label:"Editează",tooltip:"Editează bonul"}),e.push({id:"submit-view",icon:"pi pi-send",label:"Trimite",tooltip:"Trimite spre aprobare",severity:"success",disabled:A.value});break;case"pending_review":Q.value&&(e.push({id:"approve",icon:"pi pi-check",label:"Validează",tooltip:"Aprobă bonul",severity:"success",disabled:B.value}),e.push({id:"reject",icon:"pi pi-times",label:"Respinge",tooltip:"Respinge bonul",severity:"danger",disabled:W.value}));break;case"approved":e.push({id:"cancel-approval",icon:"pi pi-replay",label:"Anulează",tooltip:"Anulează validarea",severity:"warning",disabled:Y.value});break;case"rejected":e.push({id:"edit",icon:"pi pi-pencil",label:"Editează",tooltip:"Editează bonul"}),e.push({id:"submit-view",icon:"pi pi-send",label:"Re-trimite",tooltip:"Trimite din nou",severity:"success",disabled:A.value});break}e.push({id:"more",icon:"pi pi-ellipsis-v",label:"Mai multe",tooltip:"Mai multe opțiuni"})}return e}),ne=e=>{var n;switch(e.id){case"save":he();break;case"submit":oa();break;case"submit-view":De();break;case"edit":xe();break;case"approve":Ee();break;case"reject":Se();break;case"cancel-approval":da();break;case"delete":Ce();break;case"more":(n=J.value)==null||n.toggle({currentTarget:document.querySelector('[aria-label="Mai multe opțiuni"]')});break}},c=b(Vt()),t=b(null),l=b(null),E=b(null),u=b([]),p=b([]),g=b(!1),A=b(!1),B=b(!1),W=b(!1),Y=b(!1),Z=b(!1),J=b(null),U=b(null),T=b({show:!1,cui:"",name:""}),v=b(!1),z=b({name:"",fiscal_code:"",address:""}),G=b(!1),ee=b(""),We=D(()=>s.partners),Ge=D(()=>s.expenseTypes),Ae=D(()=>{const e=[];return(!c.value.amount||c.value.amount<=0)&&e.push("Suma totala este obligatorie"),c.value.receipt_date||e.push("Data este obligatorie"),u.value.length===0&&p.value.length===0&&L.value&&e.push("Atasati cel putin o imagine a bonului"),e}),Ze=e=>({draft:"Ciorna",pending_review:"In Asteptare",approved:"Aprobat",rejected:"Respins"})[e]||e,Je=e=>({draft:"secondary",pending_review:"warning",approved:"success",rejected:"danger"})[e]||"info";Ue(async()=>{window.addEventListener("resize",q),window.visualViewport&&window.visualViewport.addEventListener("resize",x),j.value=window.innerHeight,await s.fetchAllNomenclatures(),s.partners.length===0&&await Ve(),k.value||_.value?await fe():c.value.company_id=P.selectedCompanyId||1}),fa(()=>{window.removeEventListener("resize",q),window.visualViewport&&window.visualViewport.removeEventListener("resize",x)});const fe=async()=>{try{if(t.value=await s.fetchReceiptById(d.params.id),c.value={receipt_type:t.value.receipt_type||"bon_fiscal",receipt_date:new Date(t.value.receipt_date),receipt_number:t.value.receipt_number||"",partner_name:t.value.partner_name||null,cui:t.value.cui||"",vendor_address:t.value.vendor_address||"",amount:parseFloat(t.value.amount)||null,tva:Ne(t.value.tva_breakdown),payments:Ie(t.value.payment_methods),expense_type_code:t.value.expense_type_code||null,description:t.value.description||"",ocr_raw_text:t.value.ocr_raw_text||"",items_count:t.value.items_count||null,company_id:t.value.company_id},p.value=t.value.attachments||[],c.value.cui){const e=await s.searchSupplier(c.value.cui);e.found&&(U.value=e.source)}}catch{i.add({severity:"error",summary:"Eroare",detail:"Nu s-a putut incarca bonul",life:5e3}),w.push("/data-entry")}},Ke=async e=>{var n,F;if(E.value=e,i.add({severity:"success",summary:"OCR Procesare",detail:"Datele au fost extrase",life:3e3}),e.receipt_type&&(c.value.receipt_type=e.receipt_type),e.receipt_date&&(c.value.receipt_date=new Date(e.receipt_date)),e.receipt_number&&(c.value.receipt_number=e.receipt_number),e.amount&&(c.value.amount=parseFloat(e.amount)),e.address&&(c.value.vendor_address=e.address),e.raw_text&&(c.value.ocr_raw_text=e.raw_text),e.items_count&&(c.value.items_count=e.items_count),((n=e.tva_entries)==null?void 0:n.length)>0&&(c.value.tva=Ne(e.tva_entries)),((F=e.payment_methods)==null?void 0:F.length)>0&&(c.value.payments=Ie(e.payment_methods)),e.cui){c.value.cui=e.cui;const O=await s.searchSupplier(e.cui);O.found&&O.supplier?(c.value.partner_name=O.supplier.name,c.value.cui=O.supplier.fiscal_code||e.cui,c.value.vendor_address=O.supplier.address||e.address||"",U.value=O.source,T.value={show:!1,cui:"",name:""},i.add({severity:"success",summary:"Furnizor gasit",detail:`${O.supplier.name} (${O.source})`,life:3e3})):(c.value.partner_name=e.partner_name||"",U.value=null,T.value={show:!0,cui:e.cui,name:e.partner_name||""})}else e.partner_name&&(c.value.partner_name=e.partner_name)},Xe=e=>{u.value.some(n=>n.name===e.name)||(u.value=[e,...u.value])},Qe=e=>{i.add({severity:"error",summary:"Eroare OCR",detail:e,life:5e3})},Ye=e=>{e&&(U.value=e.source||"local",T.value={show:!1,cui:"",name:""})},ea=e=>{u.value=[...u.value,...e]},aa=e=>{u.value=u.value.filter((n,F)=>F!==e)},ta=async e=>{try{await s.deleteAttachment(e),p.value=p.value.filter(n=>n.id!==e),i.add({severity:"success",summary:"Succes",detail:"Atasamentul a fost sters",life:2e3})}catch{i.add({severity:"error",summary:"Eroare",detail:"Nu s-a putut sterge atasamentul",life:5e3})}},la=async e=>{try{await s.downloadAttachment(e.id,e.filename)}catch{i.add({severity:"error",summary:"Eroare",detail:"Nu s-a putut descarca fisierul",life:5e3})}},Ve=async()=>{Z.value=!0;try{await s.syncSuppliers(),i.add({severity:"success",summary:"Sincronizare",detail:"Furnizorii au fost actualizati",life:2e3})}catch{i.add({severity:"error",summary:"Eroare",detail:"Sincronizare esuata",life:5e3})}finally{Z.value=!1}},sa=()=>{z.value={name:T.value.name||c.value.partner_name||"",fiscal_code:T.value.cui||c.value.cui||"",address:c.value.vendor_address||""},v.value=!0},ia=async()=>{try{await s.createLocalSupplier(z.value),i.add({severity:"success",summary:"Succes",detail:"Furnizor local creat",life:2e3}),v.value=!1,U.value="local",T.value={show:!1,cui:"",name:""},c.value.partner_name=z.value.name,c.value.cui=z.value.fiscal_code,c.value.vendor_address=z.value.address}catch{i.add({severity:"error",summary:"Eroare",detail:"Nu s-a putut crea furnizorul",life:5e3})}},we=()=>c.value.receipt_date?!c.value.amount||c.value.amount<=0?(i.add({severity:"error",summary:"Validare",detail:"Suma este obligatorie",life:3e3}),!1):!0:(i.add({severity:"error",summary:"Validare",detail:"Data este obligatorie",life:3e3}),!1),he=async()=>{if(we()){g.value=!0;try{if(T.value.show&&c.value.cui)try{await s.createLocalSupplier({name:c.value.partner_name||`Furnizor ${c.value.cui}`,fiscal_code:c.value.cui,address:c.value.vendor_address||null}),T.value={show:!1,cui:"",name:""},U.value="local"}catch(F){console.warn("Auto-create supplier failed:",F)}const e=Be(c.value);let n;k.value?n=await s.updateReceipt(d.params.id,e):n=await s.createReceipt(e);for(const F of u.value)try{await s.uploadAttachment(n.id,F)}catch{i.add({severity:"warn",summary:"Atentie",detail:`Nu s-a putut incarca: ${F.name}`,life:5e3})}i.add({severity:"success",summary:"Succes",detail:k.value?"Bonul a fost actualizat":"Bonul a fost creat",life:3e3}),w.push(`/data-entry/${n.id}`)}catch(e){i.add({severity:"error",summary:"Eroare",detail:e.message||"Nu s-a putut salva bonul",life:5e3})}finally{g.value=!1}}},Te=async()=>{if(we()){A.value=!0;try{await he();const e=await s.submitReceipt(d.params.id);e.success?(i.add({severity:"success",summary:"Succes",detail:"Bonul a fost trimis spre aprobare",life:3e3}),w.push("/data-entry")):i.add({severity:"error",summary:"Eroare",detail:e.message,life:5e3})}catch(e){i.add({severity:"error",summary:"Eroare",detail:e.message||"Nu s-a putut trimite bonul",life:5e3})}finally{A.value=!1}}},De=async()=>{A.value=!0;try{(await s.submitReceipt(d.params.id)).success&&(i.add({severity:"success",summary:"Succes",detail:"Bonul a fost trimis",life:3e3}),await fe())}catch(e){i.add({severity:"error",summary:"Eroare",detail:e.message,life:5e3})}finally{A.value=!1}},Ee=async()=>{B.value=!0;try{(await s.approveReceipt(d.params.id)).success&&(i.add({severity:"success",summary:"Succes",detail:"Bonul a fost aprobat",life:3e3}),await fe())}catch(e){i.add({severity:"error",summary:"Eroare",detail:e.message,life:5e3})}finally{B.value=!1}},Se=()=>{ee.value="",G.value=!0},na=async()=>{W.value=!0;try{(await s.rejectReceipt(d.params.id,ee.value)).success&&(i.add({severity:"success",summary:"Succes",detail:"Bonul a fost respins",life:3e3}),G.value=!1,await fe())}catch(e){i.add({severity:"error",summary:"Eroare",detail:e.message,life:5e3})}finally{W.value=!1}},_e=()=>{w.push("/data-entry")},xe=()=>{w.push(`/data-entry/${d.params.id}/edit`)},ra=e=>e?new Date(e).toLocaleString("ro-RO"):"",oa=async()=>{if(we())if(L.value){g.value=!0,A.value=!0;try{if(T.value.show&&c.value.cui)try{await s.createLocalSupplier({name:c.value.partner_name||`Furnizor ${c.value.cui}`,fiscal_code:c.value.cui,address:c.value.vendor_address||null}),T.value={show:!1,cui:"",name:""},U.value="local"}catch(O){console.warn("Auto-create supplier failed:",O)}const e=Be(c.value),n=await s.createReceipt(e);for(const O of u.value)try{await s.uploadAttachment(n.id,O)}catch(ye){console.warn(`Upload failed: ${O.name}`,ye)}const F=await s.submitReceipt(n.id);F.success?(i.add({severity:"success",summary:"Succes",detail:"Bonul a fost trimis spre aprobare",life:3e3}),w.push("/data-entry")):i.add({severity:"error",summary:"Eroare",detail:F.message,life:5e3})}catch(e){i.add({severity:"error",summary:"Eroare",detail:e.message||"Nu s-a putut trimite bonul",life:5e3})}finally{g.value=!1,A.value=!1}}else await Te()},Ce=()=>{V.require({message:"Sigur doriți să ștergeți acest bon?",header:"Confirmare Ștergere",icon:"pi pi-exclamation-triangle",acceptClass:"p-button-danger",accept:async()=>{try{await s.deleteReceipt(d.params.id),i.add({severity:"success",summary:"Succes",detail:"Bonul a fost șters",life:2e3}),w.push("/data-entry")}catch(e){i.add({severity:"error",summary:"Eroare",detail:e.message||"Nu s-a putut șterge bonul",life:5e3})}}})},ua=()=>{const e=document.querySelector(".attachments-section");e&&e.scrollIntoView({behavior:"smooth"})},ca=async()=>{if(navigator.share&&t.value)try{await navigator.share({title:`Bon #${t.value.id}`,text:`Bon fiscal - ${t.value.partner_name||"Furnizor"} - ${t.value.amount} RON`,url:window.location.href})}catch(e){e.name!=="AbortError"&&(await navigator.clipboard.writeText(window.location.href),i.add({severity:"success",summary:"Link Copiat",detail:"Link-ul a fost copiat în clipboard",life:2e3}))}else try{await navigator.clipboard.writeText(window.location.href),i.add({severity:"success",summary:"Link Copiat",detail:"Link-ul a fost copiat în clipboard",life:2e3})}catch{i.add({severity:"error",summary:"Eroare",detail:"Nu s-a putut copia link-ul",life:3e3})}},da=()=>{V.require({message:'Sigur doriți să anulați validarea acestui bon? Bonul va reveni la status "Ciornă".',header:"Confirmare Anulare Validare",icon:"pi pi-exclamation-triangle",acceptClass:"p-button-warning",acceptLabel:"Da, Anulează",rejectLabel:"Nu",accept:async()=>{await pa()}})},pa=async()=>{Y.value=!0;try{const e=await s.unapproveReceipt(d.params.id);e.success!==!1?(i.add({severity:"success",summary:"Succes",detail:"Validarea a fost anulată. Bonul a revenit la status Ciornă.",life:3e3}),await fe()):i.add({severity:"error",summary:"Eroare",detail:e.message||"Nu s-a putut anula validarea",life:5e3})}catch(e){i.add({severity:"error",summary:"Eroare",detail:e.message||"Nu s-a putut anula validarea",life:5e3})}finally{Y.value=!1}};return(e,n)=>{var F,O,ye,$e,Le,ze,Fe;return o(),y("div",{class:pe(["receipt-unified-view",{"mobile-compose-layout":C.value}])},[C.value?(o(),$(Da,{key:0,title:ve.value,"show-back":!0,actions:ie.value,onBackClick:_e,onActionClick:ne},null,8,["title","actions"])):f("",!0),C.value?(o(),$(m(_a),{key:1,ref_key:"moreMenuRef",ref:J,id:"more_menu",model:se.value,popup:!0},null,8,["model"])):f("",!0),C.value?f("",!0):(o(),y("div",Tt,[r("div",Dt,[h(m(N),{icon:"pi pi-arrow-left",severity:"secondary",text:"",rounded:"",onClick:_e}),r("h1",Et,[r("i",{class:pe(I.value)},null,2),le(" "+S(H.value),1)]),_.value&&t.value?(o(),$(m(Ca),{key:0,value:Ze(t.value.status),severity:Je(t.value.status)},null,8,["value","severity"])):f("",!0)]),r("div",St,[_.value?(o(),y(ce,{key:1},[((O=t.value)==null?void 0:O.status)==="draft"||((ye=t.value)==null?void 0:ye.status)==="rejected"?(o(),$(m(N),{key:0,icon:"pi pi-pencil",label:"Editează",onClick:xe})):f("",!0),(($e=t.value)==null?void 0:$e.status)==="draft"?(o(),$(m(N),{key:1,icon:"pi pi-send",label:"Trimite",severity:"success",onClick:De,loading:A.value},null,8,["loading"])):f("",!0),((Le=t.value)==null?void 0:Le.status)==="pending_review"?(o(),$(m(N),{key:2,icon:"pi pi-check",label:"Validează",severity:"success",onClick:Ee,loading:B.value},null,8,["loading"])):f("",!0),((ze=t.value)==null?void 0:ze.status)==="pending_review"?(o(),$(m(N),{key:3,icon:"pi pi-times",label:"Respinge",severity:"danger",onClick:Se})):f("",!0),X.value?(o(),$(m(N),{key:4,icon:"pi pi-trash",label:"Șterge",severity:"danger",onClick:Ce})):f("",!0)],64)):(o(),y(ce,{key:0},[h(m(N),{icon:"pi pi-times",label:"Anulează",severity:"secondary",onClick:_e}),h(m(N),{icon:"pi pi-save",label:"Salvează",loading:g.value,onClick:he},null,8,["loading"]),k.value&&((F=t.value)==null?void 0:F.status)==="draft"?(o(),$(m(N),{key:0,icon:"pi pi-send",label:"Trimite",severity:"success",loading:A.value,onClick:Te},null,8,["loading"])):f("",!0)],64))])])),(Fe=t.value)!=null&&Fe.rejection_reason?(o(),$(m(Re),{key:3,severity:"warn",closable:!1,class:"rejection-message"},{default:te(()=>[n[9]||(n[9]=r("strong",null,"Motiv respingere:",-1)),le(" "+S(t.value.rejection_reason)+" ",1),n[10]||(n[10]=r("br",null,null,-1)),r("small",null,"Respins de "+S(t.value.reviewed_by)+" la "+S(ra(t.value.reviewed_at)),1)]),_:1})):f("",!0),h(Ct,{ref_key:"unifiedFormRef",ref:l,modelValue:c.value,"onUpdate:modelValue":n[0]||(n[0]=M=>c.value=M),"ocr-data":E.value,partners:We.value,"expense-types":Ge.value,"supplier-source":U.value,"supplier-warning":T.value.show,"syncing-suppliers":Z.value,"existing-attachments":p.value,"selected-files":u.value,readonly:_.value,onOcrResult:Ke,onFileSelected:Xe,onOcrError:Qe,onPartnerSelected:Ye,onSyncSuppliers:Ve,onCreateSupplier:sa,onAddFiles:ea,onRemoveFile:aa,onRemoveAttachment:ta,onDownloadAttachment:la},null,8,["modelValue","ocr-data","partners","expense-types","supplier-source","supplier-warning","syncing-suppliers","existing-attachments","selected-files","readonly"]),!_.value&&Ae.value.length>0?(o(),y("div",xt,[(o(!0),y(ce,null,be(Ae.value,(M,va)=>(o(),$(m(Re),{key:va,severity:"warn",closable:!1},{default:te(()=>[le(S(M),1)]),_:2},1024))),128))])):f("",!0),h(m(Oe),{visible:G.value,"onUpdate:visible":n[3]||(n[3]=M=>G.value=M),header:"Respinge Bon",modal:!0,style:{width:"450px"}},{footer:te(()=>[h(m(N),{label:"Anuleaza",severity:"secondary",onClick:n[2]||(n[2]=M=>G.value=!1)}),h(m(N),{label:"Respinge",icon:"pi pi-times",severity:"danger",onClick:na,loading:W.value,disabled:!ee.value||ee.value.length<5},null,8,["loading","disabled"])]),default:te(()=>[r("div",$t,[n[11]||(n[11]=r("p",null,"Introduceti motivul respingerii:",-1)),h(m(Ra),{modelValue:ee.value,"onUpdate:modelValue":n[1]||(n[1]=M=>ee.value=M),rows:"3",class:"w-full",placeholder:"Motiv respingere (minim 5 caractere)..."},null,8,["modelValue"])])]),_:1},8,["visible"]),h(m(Oe),{visible:v.value,"onUpdate:visible":n[8]||(n[8]=M=>v.value=M),header:"Creaza Furnizor Local",modal:!0,style:{width:"400px"}},{footer:te(()=>[h(m(N),{label:"Anuleaza",severity:"secondary",onClick:n[7]||(n[7]=M=>v.value=!1)}),h(m(N),{label:"Creaza",icon:"pi pi-plus",onClick:ia})]),default:te(()=>[r("div",Lt,[n[15]||(n[15]=r("p",null,"Furnizorul nu a fost gasit. Creati un furnizor local?",-1)),r("div",zt,[n[12]||(n[12]=r("label",null,"Nume",-1)),h(m(de),{modelValue:z.value.name,"onUpdate:modelValue":n[4]||(n[4]=M=>z.value.name=M),class:"w-full"},null,8,["modelValue"])]),r("div",Ft,[n[13]||(n[13]=r("label",null,"CUI",-1)),h(m(de),{modelValue:z.value.fiscal_code,"onUpdate:modelValue":n[5]||(n[5]=M=>z.value.fiscal_code=M),class:"w-full",disabled:""},null,8,["modelValue"])]),r("div",Ot,[n[14]||(n[14]=r("label",null,"Adresa",-1)),h(m(de),{modelValue:z.value.address,"onUpdate:modelValue":n[6]||(n[6]=M=>z.value.address=M),class:"w-full"},null,8,["modelValue"])])])]),_:1},8,["visible"])],2)}}},Gt=ge(Mt,[["__scopeId","data-v-56572cca"]]);export{Gt as default}; -//# sourceMappingURL=ReceiptCreateUnifiedView.DfEiZDmT.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/ReceiptCreateUnifiedView.DfEiZDmT.js.map b/deploy-package-20260223-151231/frontend/assets/ReceiptCreateUnifiedView.DfEiZDmT.js.map deleted file mode 100644 index abad48f..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ReceiptCreateUnifiedView.DfEiZDmT.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReceiptCreateUnifiedView.DfEiZDmT.js","sources":["../../src/modules/data-entry/components/receipts/CompactUploadZone.vue","../../src/modules/data-entry/components/receipts/TvaCompactFields.vue","../../src/modules/data-entry/components/receipts/UnifiedReceiptForm.vue","../../src/modules/data-entry/utils/receiptConversions.js","../../src/modules/data-entry/views/receipts/ReceiptCreateUnifiedView.vue"],"sourcesContent":["\n\n\n\n\n","\n\n\n\n\n\n\n\n","\n\n\n\n\n\n\n\n","/**\n * Conversion utilities for Receipt form data\n *\n * These functions convert between the API format (dynamic arrays) and\n * the UI format (fixed fields for TVA and payments).\n */\n\n/**\n * Default fixed TVA structure for UI\n */\nexport const getDefaultTva = () => ({\n A: { percent: 19, amount: 0 },\n B: { percent: 9, amount: 0 },\n C: { percent: 5, amount: 0 },\n D: { percent: 0, amount: 0 },\n E: { percent: null, amount: 0 },\n})\n\n/**\n * Default fixed payments structure for UI\n */\nexport const getDefaultPayments = () => ({\n CARD: 0,\n NUMERAR: 0,\n ALTE: { amount: 0, type: null },\n})\n\n/**\n * Convert API tva_entries/tva_breakdown array → UI fixed fields\n *\n * @param {Array} entries - Array of {code, percent, amount}\n * @returns {Object} Fixed TVA fields {A, B, C, D, E}\n */\nexport const apiToUiTva = (entries) => {\n const ui = getDefaultTva()\n\n if (!entries || !Array.isArray(entries)) {\n return ui\n }\n\n entries.forEach(entry => {\n const code = entry.code?.toUpperCase()\n if (code && ui[code]) {\n ui[code] = {\n percent: entry.percent ?? ui[code].percent,\n amount: parseFloat(entry.amount) || 0\n }\n }\n })\n\n return ui\n}\n\n/**\n * Convert UI fixed TVA fields → API tva_breakdown array\n * Only includes entries with amount > 0\n *\n * @param {Object} tvaUi - Fixed TVA fields {A, B, C, D, E}\n * @returns {Array} Array of {code, percent, amount} or null if empty\n */\nexport const uiToApiTva = (tvaUi) => {\n if (!tvaUi) return null\n\n const entries = Object.entries(tvaUi)\n .filter(([_, v]) => v.amount && v.amount > 0)\n .map(([code, v]) => ({\n code,\n percent: v.percent ?? 0,\n amount: parseFloat(v.amount) || 0\n }))\n\n return entries.length > 0 ? entries : null\n}\n\n/**\n * Calculate total TVA from UI fixed fields\n *\n * @param {Object} tvaUi - Fixed TVA fields {A, B, C, D, E}\n * @returns {number} Total TVA amount\n */\nexport const calculateTvaTotal = (tvaUi) => {\n if (!tvaUi) return 0\n\n return Object.values(tvaUi)\n .reduce((sum, v) => sum + (parseFloat(v.amount) || 0), 0)\n}\n\n/**\n * Convert API payment_methods array → UI fixed fields\n *\n * @param {Array} methods - Array of {method, amount}\n * @returns {Object} Fixed payment fields {CARD, NUMERAR, ALTE}\n */\nexport const apiToUiPayments = (methods) => {\n const ui = getDefaultPayments()\n\n if (!methods || !Array.isArray(methods)) {\n return ui\n }\n\n methods.forEach(pm => {\n const method = pm.method?.toUpperCase()\n const amount = parseFloat(pm.amount) || 0\n\n if (method === 'CARD') {\n ui.CARD = amount\n } else if (method === 'NUMERAR' || method === 'CASH') {\n ui.NUMERAR = amount\n } else if (method) {\n // Other payment types go to ALTE\n ui.ALTE.amount += amount\n // Try to determine type from method name\n if (method.includes('TICH') || method.includes('MASA')) {\n ui.ALTE.type = 'tichete_masa'\n } else if (method.includes('VOUCHER')) {\n ui.ALTE.type = 'voucher'\n } else if (method.includes('CREDIT')) {\n ui.ALTE.type = 'credit_magazin'\n }\n }\n })\n\n return ui\n}\n\n/**\n * Convert UI fixed payment fields → API payment_methods array\n * Only includes entries with amount > 0\n *\n * @param {Object} paymentsUi - Fixed payment fields {CARD, NUMERAR, ALTE}\n * @returns {Array} Array of {method, amount} or null if empty\n */\nexport const uiToApiPayments = (paymentsUi) => {\n if (!paymentsUi) return null\n\n const methods = []\n\n if (paymentsUi.CARD && paymentsUi.CARD > 0) {\n methods.push({ method: 'CARD', amount: paymentsUi.CARD })\n }\n\n if (paymentsUi.NUMERAR && paymentsUi.NUMERAR > 0) {\n methods.push({ method: 'NUMERAR', amount: paymentsUi.NUMERAR })\n }\n\n if (paymentsUi.ALTE?.amount && paymentsUi.ALTE.amount > 0) {\n // Map type to method name\n let methodName = 'ALTE'\n if (paymentsUi.ALTE.type === 'tichete_masa') {\n methodName = 'TICHETE_MASA'\n } else if (paymentsUi.ALTE.type === 'voucher') {\n methodName = 'VOUCHER'\n } else if (paymentsUi.ALTE.type === 'credit_magazin') {\n methodName = 'CREDIT_MAGAZIN'\n }\n methods.push({ method: methodName, amount: paymentsUi.ALTE.amount })\n }\n\n return methods.length > 0 ? methods : null\n}\n\n/**\n * Calculate total payments from UI fixed fields\n *\n * @param {Object} paymentsUi - Fixed payment fields {CARD, NUMERAR, ALTE}\n * @returns {number} Total payment amount\n */\nexport const calculatePaymentsTotal = (paymentsUi) => {\n if (!paymentsUi) return 0\n\n return (\n (paymentsUi.CARD || 0) +\n (paymentsUi.NUMERAR || 0) +\n (paymentsUi.ALTE?.amount || 0)\n )\n}\n\n/**\n * Get default form state for unified receipt form\n */\nexport const getDefaultUnifiedFormState = () => ({\n receipt_type: 'bon_fiscal',\n receipt_date: new Date(),\n receipt_number: '',\n\n // Supplier (DB validated)\n partner_name: null,\n cui: '',\n vendor_address: '',\n\n // Total\n amount: null,\n\n // TVA (5 fixed fields)\n tva: getDefaultTva(),\n\n // Payments (3 fixed fields)\n payments: getDefaultPayments(),\n\n // Auxiliary\n expense_type_code: null,\n description: '',\n\n // Metadata\n ocr_raw_text: '',\n items_count: null,\n company_id: null,\n})\n\n/**\n * Convert legacy form state to unified form state\n *\n * @param {Object} legacyForm - Old form format\n * @returns {Object} Unified form format\n */\nexport const legacyToUnifiedForm = (legacyForm) => {\n return {\n receipt_type: legacyForm.receipt_type || 'bon_fiscal',\n receipt_date: legacyForm.receipt_date instanceof Date\n ? legacyForm.receipt_date\n : new Date(legacyForm.receipt_date),\n receipt_number: legacyForm.receipt_number || '',\n\n partner_name: legacyForm.partner_name || null,\n cui: legacyForm.cui || '',\n vendor_address: legacyForm.vendor_address || '',\n\n amount: parseFloat(legacyForm.amount) || null,\n\n tva: apiToUiTva(legacyForm.tva_breakdown),\n payments: apiToUiPayments(legacyForm.payment_methods),\n\n expense_type_code: legacyForm.expense_type_code || null,\n description: legacyForm.description || '',\n\n ocr_raw_text: legacyForm.ocr_raw_text || '',\n items_count: legacyForm.items_count || null,\n company_id: legacyForm.company_id || null,\n }\n}\n\n/**\n * Convert unified form state to API payload\n *\n * @param {Object} unifiedForm - Unified form format\n * @returns {Object} API payload format\n */\nexport const unifiedFormToApiPayload = (unifiedForm) => {\n return {\n receipt_type: unifiedForm.receipt_type,\n direction: 'cheltuiala', // Always expense (no more income)\n receipt_date: unifiedForm.receipt_date instanceof Date\n ? unifiedForm.receipt_date.toISOString().split('T')[0]\n : unifiedForm.receipt_date,\n receipt_number: unifiedForm.receipt_number || null,\n\n partner_name: typeof unifiedForm.partner_name === 'string'\n ? unifiedForm.partner_name\n : unifiedForm.partner_name?.name || null,\n cui: unifiedForm.cui || null,\n vendor_address: unifiedForm.vendor_address || null,\n\n amount: unifiedForm.amount || 0,\n\n tva_breakdown: uiToApiTva(unifiedForm.tva),\n tva_total: calculateTvaTotal(unifiedForm.tva) || null,\n payment_methods: uiToApiPayments(unifiedForm.payments),\n\n expense_type_code: unifiedForm.expense_type_code || null,\n description: unifiedForm.description || null,\n\n ocr_raw_text: unifiedForm.ocr_raw_text || null,\n items_count: unifiedForm.items_count || null,\n company_id: unifiedForm.company_id,\n\n // Legacy fields (removed but kept for backwards compat)\n payment_mode: null,\n cash_register_id: null,\n cash_register_name: null,\n cash_register_account: null,\n }\n}\n","\n\n\n\n\n"],"names":["emit","__emit","fileInput","ref","selectedFile","isDragging","processing","error","ocrStore","useOCRSettingsStore","selectedEngine","engineConfig","engineOptions","computed","engine","_a","_b","jobId","queuePosition","estimatedWait","jobStatus","processingMessage","processingSubtext","onMounted","watch","newEngine","oldEngine","err","onDragOver","onDragLeave","onDrop","event","files","handleFile","triggerFileInput","onFileSelected","file","arrayBuffer","clonedFile","e","processOCR","formData","job","api","pollJobStatus","message","id","startTime","poll","pollStartTime","pollDuration","resolve","formatFileSize","bytes","__expose","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_hoisted_2","_createVNode","_unref","ProgressSpinner","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_11","Button","Dropdown","$event","_createBlock","Message","props","__props","ALL_CODES","visibleCodes","visibleEntries","code","canAddMore","addEntry","nextCode","removeEntry","index","codeToRemove","_","i","emitUpdate","newVal","codesWithValues","newVisibleCodes","_cache","_Fragment","_renderList","entry","_normalizeClass","InputNumber","form","val","uploadZone","fileInputRef","showRawText","filteredPartners","receiptTypeOptions","getPartnerNameString","pn","searchPartners","query","p","onPartnerSelect","partner","onOCRResult","result","onOCRError","onFilesSelected","clonedFiles","ab","truncateFilename","name","max","ext","formatTime","ms","paymentTotal","_d","_c","showPaymentMismatch","formatAmount","amount","hasPaymentFromOCR","pm","hasTvaFromOCR","tva","CompactUploadZone","AutoComplete","InputText","OCRConfidenceIndicator","_withDirectives","$emit","_hoisted_9","_hoisted_10","_e","Calendar","_f","_hoisted_12","_g","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_h","_hoisted_17","_createTextVNode","_hoisted_18","TvaCompactFields","_i","_hoisted_19","_hoisted_20","_hoisted_21","att","_withModifiers","idx","_j","_hoisted_25","_hoisted_26","_hoisted_27","_k","_hoisted_28","getDefaultTva","getDefaultPayments","apiToUiTva","entries","ui","uiToApiTva","tvaUi","v","calculateTvaTotal","sum","apiToUiPayments","methods","method","uiToApiPayments","paymentsUi","methodName","getDefaultUnifiedFormState","unifiedFormToApiPayload","unifiedForm","route","useRoute","router","useRouter","toast","useToast","confirm","useConfirm","store","useReceiptsStore","companyStore","useCompanyStore","isMobile","keyboardVisible","initialViewportHeight","handleResize","heightDiff","handleVisualViewportResize","currentHeight","isViewMode","isEditMode","isCreateMode","modeTitle","receipt","modeIcon","mobileTitle","canSubmit","canDelete","receiptStatus","canApproveReject","moreMenuItems","items","existingAttachments","scrollToAttachments","shareReceipt","confirmDelete","mobileTopBarActions","actions","saving","submitting","approving","rejecting","cancelling","handleTopBarAction","action","saveReceipt","submitForReviewMobile","submitReceipt","goToEdit","approveReceipt","openRejectDialog","confirmCancelApproval","moreMenuRef","unifiedFormRef","ocrData","selectedFiles","syncingSuppliers","supplierSource","supplierWarning","showCreateSupplierDialog","pendingSupplierData","showRejectDialog","rejectReason","partners","expenseTypes","validationErrors","errors","getStatusLabel","status","getStatusSeverity","syncSuppliers","loadReceipt","onUnmounted","data","f","onPartnerSelected","onAddFiles","onRemoveFile","removeExistingAttachment","attachmentId","a","downloadAttachment","attachment","createLocalSupplierFromWarning","createLocalSupplier","validateForm","payload","savedReceipt","submitForReview","rejectReceipt","goBack","formatDateTime","dateStr","attachmentsSection","cancelApproval","MobileTopBar","Menu","Tag","UnifiedReceiptForm","Dialog","Textarea"],"mappings":"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"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/ReceiptCreateView.RpTqvOIL.js b/deploy-package-20260223-151231/frontend/assets/ReceiptCreateView.RpTqvOIL.js deleted file mode 100644 index bd23772..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ReceiptCreateView.RpTqvOIL.js +++ /dev/null @@ -1,2 +0,0 @@ -import{a as _,j as D,o as Ye,w as Ie,c as n,d as s,e as t,i as c,h as P,q as y,k as se,v as p,E as ze,u as ee,p as _e,O as q,y as R,F as H,B as le,M as Fa,P as Sa,t as Va,l as Da}from"./vendor-core.B6UiYhU_.js";import{_ as Ee,d as Ae,u as Ia,j as Aa,a as Ea,k as La}from"./index.B8XI8FQW.js";import{u as Pa,a as Ua}from"./sharedStores.D4bwf0TZ.js";import{u as Ma,a as Ke}from"./ocrSettingsStore.B3n_bOhs.js";import{I as Na,s as Oe,d as Qe}from"./vendor-primevue.BN-meDW0.js";import{O as Re}from"./OCRConfidenceIndicator.BILrhVia.js";import"./vendor-utils.CO3CyGpV.js";import"./vendor-export.BWjBvx7Z.js";const Ba={class:"ocr-upload-zone"},ja={key:0,class:"processing-state"},Wa={class:"processing-text"},qa={class:"processing-subtext"},Ga={key:1,class:"file-selected-state"},Za={class:"file-name"},Ja={class:"file-size"},Xa={key:2,class:"empty-state"},Ha={class:"main-text"},Ka={key:0},Qa={key:1},Ya={key:0,class:"action-buttons"},et={class:"engine-option"},at={class:"engine-label"},tt={class:"engine-desc"},lt={__name:"OCRUploadZone",emits:["ocr-result","file-selected","error"],setup(d,{expose:z,emit:K}){const o=K,h=_(null),F=_(null),I=_(!1),k=_(!1),g=_(null),Q=Ma(),u=_("auto"),de={auto:{label:"Auto",desc:"docTR→Paddle→Tess · General"},doctr:{label:"docTR",desc:"Rapid, bună acuratețe"},doctr_plus:{label:"docTR Plus",desc:"2 treceri secvențiale · (recomandat)"},paddleocr:{label:"PaddleOCR",desc:"Cea mai bună calitate"},tesseract:{label:"Tesseract",desc:"Cel mai rapid, calitate redusă"},hybrid:{label:"Hybrid",desc:"docTR+Tess paralel"},"hybrid-quality":{label:"Hybrid Calitate",desc:"Paddle→docTR→Tess · Acuratețe max"}},l=D(()=>Q.availableEngines.map(b=>{var w,$;return{label:((w=de[b])==null?void 0:w.label)||b,desc:(($=de[b])==null?void 0:$.desc)||"",value:b}}));Ye(async()=>{await Q.loadPreference(),u.value=Q.preferredEngine,console.log("[OCRUploadZone] Loaded user preference:",u.value)}),Ie(u,async(b,w)=>{if(w&&b!==w&&Q.initialized)try{await Q.setPreference(b),console.log("[OCRUploadZone] Saved user preference:",b)}catch($){console.error("[OCRUploadZone] Failed to save preference:",$)}});const T=_(null),S=_(null),r=_(null),v=_(null),V=D(()=>v.value==="pending"&&S.value>0?`In coada... Pozitia ${S.value}`:v.value==="processing"?"Se proceseaza imaginea...":"Se trimite..."),A=D(()=>v.value==="pending"&&r.value>0?`Timp estimat: ~${r.value} secunde`:v.value==="processing"?"Extragere date cu OCR":"Asteptati..."),W=()=>{I.value=!0},we=()=>{I.value=!1},ce=b=>{var $;I.value=!1;const w=($=b.dataTransfer)==null?void 0:$.files;(w==null?void 0:w.length)>0&&pe(w[0])},me=()=>{var b;(b=h.value)==null||b.click()},$e=b=>{var $;const w=($=b.target)==null?void 0:$.files;(w==null?void 0:w.length)>0&&pe(w[0])},pe=async b=>{if(!["image/jpeg","image/png","application/pdf"].includes(b.type)){g.value="Tip de fisier invalid. Sunt acceptate doar: JPG, PNG, PDF";return}if(b.size>10*1024*1024){g.value="Fisierul este prea mare. Dimensiunea maxima este 10MB.";return}g.value=null;try{const $=await b.arrayBuffer(),G=new File([$],b.name,{type:b.type,lastModified:b.lastModified});F.value=G,o("file-selected",G)}catch($){console.warn("File clone failed, using original:",$),F.value=b,o("file-selected",b)}},B=async()=>{var b,w,$,G,U,E;if(F.value){k.value=!0,g.value=null,T.value=null,S.value=null,r.value=null,v.value="submitting";try{const Z=new FormData;Z.append("file",F.value),console.log("🔍 OCR Submit:",{fileName:(b=F.value)==null?void 0:b.name,fileSize:(w=F.value)==null?void 0:w.size,fileType:($=F.value)==null?void 0:$.type,engine:u.value});const J=(await Ke.post(`/ocr/extract?engine=${u.value}`,Z,{timeout:3e4})).data;T.value=J.job_id,S.value=J.queue_position,r.value=J.estimated_wait_seconds,v.value=J.status,console.log("📋 OCR Job Created:",J),await ie(J.job_id)}catch(Z){console.error("🔴 OCR Error:",{message:Z.message,code:Z.code,response:(G=Z.response)==null?void 0:G.data});const ne=((E=(U=Z.response)==null?void 0:U.data)==null?void 0:E.detail)||Z.message||"Eroare la procesarea OCR";g.value=ne,o("error",ne),k.value=!1}}},ie=async b=>{const U=Date.now(),E=async()=>{var J;if((Date.now()-U)/1e3>=120){k.value=!1,g.value="Timeout - procesarea a durat prea mult",o("error",g.value);return}const ne=Date.now();try{const M=(await Ke.get(`/ocr/jobs/${b}/wait`,{params:{timeout:30,_t:Date.now()},timeout:35e3,headers:{"Cache-Control":"no-cache"}})).data;v.value=M.status,S.value=M.queue_position,r.value=M.estimated_wait_seconds;const oe=Date.now()-ne;if(console.log("📊 OCR Long-Poll:",{status:M.status,position:M.queue_position,pollDurationMs:oe}),M.status==="completed"){k.value=!1,M.result?(console.log("✅ OCR Complete:",M.result),o("ocr-result",{...M.result,_processing_time_ms:M.processing_time_ms})):(g.value="OCR completed but no result returned",o("error",g.value));return}if(M.status==="failed"){k.value=!1,g.value=M.error||"OCR processing failed",o("error",g.value);return}if(k.value){const Ce=Date.now()-ne;if(Ce<500){const xe=500-Ce;console.log(`⏳ Waiting ${xe}ms before next poll (preventing rapid polling)`),await new Promise(Fe=>setTimeout(Fe,xe))}await E()}}catch(fe){if(fe.code==="ECONNABORTED"||(J=fe.message)!=null&&J.includes("timeout")){console.log("⏱️ Long-poll timeout, retrying..."),k.value&&await E();return}if(console.error("🔴 Poll Error:",fe.message),(Date.now()-U)/1e3<120&&k.value){console.log("🔄 Retrying after error..."),await new Promise(oe=>setTimeout(oe,500)),await E();return}k.value=!1,g.value="Eroare la verificarea starii job-ului",o("error",g.value)}};await E()},ve=b=>b<1024?b+" B":b<1024*1024?(b/1024).toFixed(1)+" KB":(b/(1024*1024)).toFixed(1)+" MB";return z({reset:()=>{F.value=null,g.value=null,T.value=null,S.value=null,r.value=null,v.value=null,k.value=!1,h.value&&(h.value.value="")},processOCR:B}),(b,w)=>{const $=se("ProgressSpinner"),G=se("Button"),U=se("Message");return s(),n("div",Ba,[t("div",{class:ee(["upload-dropzone",{dragging:I.value,processing:k.value}]),onDragover:ze(W,["prevent"]),onDragleave:ze(we,["prevent"]),onDrop:ze(ce,["prevent"]),onClick:me},[t("input",{ref_key:"fileInput",ref:h,type:"file",accept:"image/*,application/pdf",class:"hidden-input",onChange:$e},null,544),k.value?(s(),n("div",ja,[y($,{style:{width:"50px",height:"50px"},strokeWidth:"4"}),t("p",Wa,p(V.value),1),t("p",qa,p(A.value),1)])):F.value?(s(),n("div",Ga,[w[2]||(w[2]=t("i",{class:"pi pi-check-circle",style:{"font-size":"1.75rem",color:"var(--green-500)"}},null,-1)),t("p",Za,p(F.value.name),1),t("p",Ja,p(ve(F.value.size)),1)])):(s(),n("div",Xa,[w[3]||(w[3]=t("i",{class:"pi pi-camera",style:{"font-size":"2rem",color:"var(--primary-500)"}},null,-1)),t("p",Ha,[I.value?(s(),n("span",Ka,"Elibereaza pentru a incarca")):(s(),n("span",Qa,"Trage poza bonului aici sau click pentru a selecta"))]),w[4]||(w[4]=t("p",{class:"sub-text"}," JPG, PNG, PDF (max 10MB) • OCR extrage automat datele ",-1))]))],34),F.value&&!k.value?(s(),n("div",Ya,[y(G,{label:"Schimba",icon:"pi pi-refresh",severity:"secondary",size:"small",onClick:me}),y(q(Na),{modelValue:u.value,"onUpdate:modelValue":w[0]||(w[0]=E=>u.value=E),options:l.value,optionLabel:"label",optionValue:"value",placeholder:"Motor OCR",class:"engine-selector dropdown-borderless"},{option:_e(({option:E})=>[t("div",et,[t("span",at,p(E.label),1),t("span",tt,p(E.desc),1)])]),_:1},8,["modelValue","options"]),y(G,{label:"Proceseaza OCR",icon:"pi pi-cog",size:"small",onClick:B})])):c("",!0),g.value?(s(),P(U,{key:1,severity:"error",closable:!0,onClose:w[1]||(w[1]=E=>g.value=null)},{default:_e(()=>[R(p(g.value),1)]),_:1})):c("",!0)])}}},st=Ee(lt,[["__scopeId","data-v-50521626"]]),it={class:"ocr-preview"},nt={class:"preview-header"},ot={class:"header-right"},rt={class:"overall-confidence"},ut={class:"preview-content"},dt={key:0,class:"ocr-section"},ct={class:"ocr-section-content"},mt={key:0,class:"vendor-name"},pt={key:1,class:"vendor-cui"},vt={key:2,class:"vendor-address"},ft={class:"ocr-section"},yt={class:"ocr-section-content"},gt={key:0,class:"client-name"},_t={key:1,class:"client-cui"},bt={key:2,class:"client-address"},ht={key:1,class:"no-data"},wt={key:1,class:"ocr-section"},Ct={class:"ocr-section-content"},kt={class:"document-row"},Rt={key:1,class:"doc-number"},$t={key:2,class:"doc-date"},xt={key:2,class:"ocr-section"},Tt={class:"ocr-values-table"},Ot={key:0,class:"value-row"},zt={class:"value-amount"},Ft={key:1,class:"value-row warning-row"},St={class:"value-amount calculated"},Vt={key:2,class:"validation-warning"},Dt={key:3,class:"validation-info"},It={class:"value-label"},At={class:"value-amount"},Et={class:"value-label"},Lt={class:"value-amount"},Pt={key:4,class:"value-row total-row"},Ut={class:"value-amount"},Mt={key:5,class:"items-count-inline"},Nt={key:3,class:"raw-text-section"},Bt={class:"raw-text-header"},jt={key:2,class:"ocr-time-badge"},Wt={key:0,class:"raw-text"},qt={class:"preview-actions"},Gt={__name:"OCRPreview",props:{data:{type:Object,required:!0}},emits:["apply","dismiss","collapse"],setup(d){const z=d,K=_(!1),o=D(()=>{var r;return z.data.tva_total?parseFloat(z.data.tva_total):(r=z.data.tva_entries)!=null&&r.length?z.data.tva_entries.reduce((v,V)=>v+parseFloat(V.amount||0),0):0}),h=D(()=>{var r;return(r=z.data.payment_methods)!=null&&r.length?z.data.payment_methods.reduce((v,V)=>v+parseFloat(V.amount||0),0):0}),F=D(()=>{var A;if(!((A=z.data.tva_entries)!=null&&A.length))return 0;const r=z.data.tva_entries[0],v=r.percent||19,V=parseFloat(r.amount||0);return V===0||v===0?0:V*(100+v)/v}),I=D(()=>{if(!z.data.amount||h.value===0)return!1;const r=parseFloat(z.data.amount);return Math.abs(r-h.value)>.02}),k=D(()=>{if(!z.data.amount||F.value===0)return!1;const r=parseFloat(z.data.amount);return Math.abs(r-F.value)>.5}),g=r=>parseFloat(r).toLocaleString("ro-RO",{minimumFractionDigits:2,maximumFractionDigits:2}),Q=r=>r?new Date(r).toLocaleDateString("ro-RO",{day:"2-digit",month:"2-digit",year:"numeric"}):"",u=r=>r?r==="doctr-light"?"doctr-fast":r==="doctr-medium"?"doctr":r==="doctr-adaptive"?"doctr-adaptive":r.includes("doctr")?"doctr":r==="paddle-light"?"fast":r==="paddle-adaptive"?"adaptive":r==="adaptive-full"?"full":r.includes("paddle")?"paddleocr":r.includes("tesseract")?"tesseract":"":"",de=r=>r&&(r==="doctr-light"||r.includes("doctr")||r==="paddle-light")?"pi pi-bolt":"pi pi-cog",l=r=>r?r==="doctr-light"?"docTR Fast":r==="doctr-medium"?"docTR Medium":r==="doctr-adaptive"?"docTR Adaptive":r.includes("doctr")?"docTR":r==="paddle-light"?"Fast Mode (PaddleOCR)":r==="paddle-adaptive"?"Adaptive (Paddle dual)":r==="adaptive-full"?"Full Pipeline":r.includes("paddle")?"PaddleOCR":r.includes("tesseract")?"Tesseract":r:"",T=r=>r?r.includes("fast mode")?"fast-mode":r.includes("full pipeline")?"full-pipeline":"":"",S=r=>r<1e3?`${r}ms`:`${(r/1e3).toFixed(1)}s`;return(r,v)=>{var V;return s(),n("div",it,[t("div",nt,[v[4]||(v[4]=t("div",{class:"header-left"},[t("i",{class:"pi pi-check-circle",style:{color:"var(--green-500)","font-size":"1.25rem"}}),t("span",{class:"title"},"Date extrase din imagine")],-1)),t("div",ot,[t("span",rt,[y(Re,{confidence:d.data.overall_confidence,"show-percentage":!0,size:"normal"},null,8,["confidence"])]),y(q(Oe),{icon:"pi pi-minus",text:"",rounded:"",size:"small",onClick:v[0]||(v[0]=A=>r.$emit("collapse")),class:"collapse-btn"})])]),t("div",ut,[d.data.partner_name||d.data.cui||d.data.address?(s(),n("div",dt,[v[5]||(v[5]=t("div",{class:"ocr-section-title"},"FURNIZOR",-1)),t("div",ct,[d.data.partner_name?(s(),n("div",mt,[R(p(d.data.partner_name)+" ",1),y(Re,{confidence:d.data.confidence_vendor,size:"small"},null,8,["confidence"])])):c("",!0),d.data.cui?(s(),n("div",pt,"CUI: "+p(d.data.cui),1)):c("",!0),d.data.address?(s(),n("div",vt,p(d.data.address),1)):c("",!0)])])):c("",!0),t("div",ft,[v[6]||(v[6]=t("div",{class:"ocr-section-title"},"CLIENT",-1)),t("div",yt,[d.data.client_name||d.data.client_cui||d.data.client_address?(s(),n(H,{key:0},[d.data.client_name?(s(),n("div",gt,[R(p(d.data.client_name)+" ",1),d.data.confidence_client?(s(),P(Re,{key:0,confidence:d.data.confidence_client,size:"small"},null,8,["confidence"])):c("",!0)])):c("",!0),d.data.client_cui?(s(),n("div",_t,"CUI: "+p(d.data.client_cui),1)):c("",!0),d.data.client_address?(s(),n("div",bt,p(d.data.client_address),1)):c("",!0)],64)):(s(),n("div",ht,"-"))])]),d.data.receipt_type||d.data.receipt_number||d.data.receipt_date?(s(),n("div",wt,[v[8]||(v[8]=t("div",{class:"ocr-section-title"},"DOCUMENT",-1)),t("div",Ct,[t("div",kt,[d.data.receipt_type?(s(),P(q(Ae),{key:0,value:d.data.receipt_type==="bon_fiscal"?"Bon Fiscal":"Chitanta",severity:d.data.receipt_type==="bon_fiscal"?"info":"success"},null,8,["value","severity"])):c("",!0),d.data.receipt_number?(s(),n("span",Rt," Nr: "+p(d.data.receipt_series?d.data.receipt_series+" ":"")+p(d.data.receipt_number),1)):c("",!0),d.data.receipt_date?(s(),n("span",$t,[v[7]||(v[7]=t("i",{class:"pi pi-calendar"},null,-1)),R(" "+p(Q(d.data.receipt_date))+" ",1),y(Re,{confidence:d.data.confidence_date,size:"small"},null,8,["confidence"])])):c("",!0)])])])):c("",!0),d.data.amount||((V=d.data.tva_entries)==null?void 0:V.length)>0||h.value>0?(s(),n("div",xt,[t("div",Tt,[d.data.amount?(s(),n("div",Ot,[v[9]||(v[9]=t("span",{class:"value-label"},"TOTAL",-1)),t("span",zt,[R(p(g(d.data.amount))+" LEI ",1),y(Re,{confidence:d.data.confidence_amount,size:"small",class:"confidence-inline"},null,8,["confidence"])])])):h.value>0?(s(),n("div",Ft,[v[11]||(v[11]=t("span",{class:"value-label"},[t("i",{class:"pi pi-exclamation-triangle warning-icon"}),R(" TOTAL (calculat) ")],-1)),t("span",St,[R(p(g(h.value))+" LEI ",1),v[10]||(v[10]=t("span",{class:"hint"},"(din plati)",-1))])])):c("",!0),I.value?(s(),n("div",Vt,[v[12]||(v[12]=t("i",{class:"pi pi-exclamation-triangle"},null,-1)),R(" Total ("+p(g(d.data.amount))+") ≠ Suma plati ("+p(g(h.value))+") ",1)])):c("",!0),k.value?(s(),n("div",Dt,[v[13]||(v[13]=t("i",{class:"pi pi-info-circle"},null,-1)),R(" Total din TVA: "+p(g(F.value))+" LEI ",1)])):c("",!0),(s(!0),n(H,null,le(d.data.payment_methods,(A,W)=>(s(),n("div",{class:"value-row",key:"pm-"+W},[t("span",It,p(A.method),1),t("span",At,p(g(A.amount))+" LEI",1)]))),128)),(s(!0),n(H,null,le(d.data.tva_entries,(A,W)=>(s(),n("div",{class:"value-row",key:"tva-"+W},[t("span",Et,"TVA "+p(A.code)+" ("+p(A.percent)+"%)",1),t("span",Lt,p(g(A.amount))+" LEI",1)]))),128)),o.value>0?(s(),n("div",Pt,[v[14]||(v[14]=t("span",{class:"value-label"},"Total TVA",-1)),t("span",Ut,p(g(o.value))+" LEI",1)])):c("",!0),d.data.items_count?(s(),n("div",Mt,p(d.data.items_count)+" articole ",1)):c("",!0)])])):c("",!0),d.data.raw_text?(s(),n("div",Nt,[t("div",Bt,[y(q(Oe),{label:K.value?"Ascunde text OCR":"Arata text OCR",icon:K.value?"pi pi-eye-slash":"pi pi-eye",severity:"secondary",size:"small",text:"",onClick:v[1]||(v[1]=A=>K.value=!K.value)},null,8,["label","icon"]),d.data.ocr_engine?(s(),n("span",{key:0,class:ee(["ocr-engine-badge",u(d.data.ocr_engine)])},[t("i",{class:ee(de(d.data.ocr_engine))},null,2),R(" "+p(l(d.data.ocr_engine)),1)],2)):c("",!0),d.data._ocr_message?(s(),n("span",{key:1,class:ee(["ocr-message-badge",T(d.data._ocr_message)])},p(d.data._ocr_message),3)):c("",!0),d.data.processing_time_ms?(s(),n("span",jt,[v[15]||(v[15]=t("i",{class:"pi pi-clock"},null,-1)),R(" "+p(S(d.data.processing_time_ms)),1)])):c("",!0)]),K.value?(s(),n("div",Wt,[t("pre",null,p(d.data.raw_text),1)])):c("",!0)])):c("",!0)]),t("div",qt,[y(q(Oe),{label:"Ignora",icon:"pi pi-times",severity:"secondary",onClick:v[2]||(v[2]=A=>r.$emit("dismiss"))}),y(q(Oe),{label:"Aplica datele in formular",icon:"pi pi-check",onClick:v[3]||(v[3]=A=>r.$emit("apply",d.data))})])])}}},Zt=Ee(Gt,[["__scopeId","data-v-3f33cf7b"]]),Jt={class:"receipt-create-view"},Xt={class:"roa-card"},Ht={class:"roa-card-header"},Kt={class:"roa-card-title"},Qt={key:0,class:"rejection-alert"},Yt={class:"receipt-form-layout"},el={class:"form-column-left"},al={key:0,class:"upload-section"},tl={key:1,class:"upload-section"},ll={class:"attachments-grid"},sl={key:1,class:"pdf-attachment"},il={key:2,class:"upload-section"},nl={key:3,class:"upload-section"},ol={key:0},rl={key:1},ul={key:2,class:"image-preview-grid"},dl=["src","alt"],cl={key:1,class:"image-placeholder"},ml={key:2,class:"pdf-preview"},pl={class:"attachment-actions"},vl={key:3,class:"selected-files-list"},fl={class:"file-name"},yl={class:"file-size"},gl={key:4,class:"selected-files-list"},_l={class:"file-name"},bl={class:"file-size"},hl={class:"form-column-right"},wl={class:"form-group"},Cl={class:"form-row"},kl={class:"form-field flex-2"},Rl={class:"label-with-action"},$l={key:0,class:"p-text-success supplier-selected"},xl={class:"form-field flex-1"},Tl={key:0,class:"supplier-warning-box"},Ol={class:"address-preview"},zl={key:1,class:"address-expanded"},Fl={class:"form-group"},Sl={class:"form-row document-row-inline"},Vl={class:"form-field"},Dl={class:"form-field"},Il={class:"form-field"},Al={class:"form-field"},El={class:"direction-header"},Ll={class:"form-group values-section"},Pl={class:"values-row-inline"},Ul={class:"value-item value-item-total"},Ml={class:"value-item value-item-payment"},Nl={key:0,class:"values-row-inline tva-compact"},Bl={class:"value-item tva-total-item"},jl={class:"tva-total-value"},Wl={class:"form-group form-group-last"},ql={class:"form-row"},Gl={class:"form-field flex-1"},Zl={class:"form-row optional-fields"},Jl={class:"form-field flex-2"},Xl={key:0,class:"form-field items-count-field"},Hl={key:0,class:"entries-section"},Kl={class:"entries-table-container"},Ql={class:"entries-table"},Yl={class:"debit",style:{"text-align":"right"}},es={class:"credit",style:{"text-align":"right"}},as={key:0,class:"balance-warning"},ts={key:1,class:"validation-banners"},ls={key:0,class:"validation-banner"},ss={key:1,class:"validation-banner warning"},is={class:"action-buttons-top"},ns={class:"dialog-content"},os={class:"form-field",style:{"margin-top":"1rem"}},rs={class:"form-field"},us={class:"form-field"},ds={class:"dialog-content"},cs={class:"form-field",style:{"margin-top":"1rem"}},ms={__name:"ReceiptCreateView",setup(d){const z=Fa(),K=Sa(),o=Ia(),h=Pa(),F=Ua(),I=D(()=>!!z.params.id&&!z.path.endsWith("/edit")),k=D(()=>!!z.params.id&&z.path.endsWith("/edit"));D(()=>!z.params.id);const g=D(()=>I.value),Q=D(()=>z.params.id),u=_(null),de=()=>F.selectedCompanyId||1,l=_({receipt_type:"bon_fiscal",direction:"cheltuiala",receipt_date:new Date,amount:null,partner_name:null,cui:"",ocr_raw_text:"",expense_type_code:null,payment_mode:null,cash_register_id:null,cash_register_name:null,cash_register_account:null,receipt_number:"",description:"",company_id:de(),tva_breakdown:[],tva_total:null,items_count:null,vendor_address:"",payment_methods:[]}),T=_([]),S=_([]),r=_({}),v=_(!1),V=_(!1),A=_(null),W=_(null),we=_(null),ce=_(!1),me=_(null),$e=_(null),pe=_(!1),B=_(null),ie=_({show:!1,cui:"",name:""}),ve=_(!1),Le=_(!1),b=_(!1),w=_(""),$=_(!1),G=_([]),U=_(null),E=_(!1),Z=D(()=>h.partners),ne=D(()=>h.expenseTypes);D(()=>h.cashRegisters);const J=D(()=>{var a;return(a=u.value)!=null&&a.entries?u.value.entries.filter(e=>e.entry_type==="debit").reduce((e,m)=>e+parseFloat(m.amount),0):0}),fe=D(()=>{var a;return(a=u.value)!=null&&a.entries?u.value.entries.filter(e=>e.entry_type==="credit").reduce((e,m)=>e+parseFloat(m.amount),0):0}),M=D(()=>Math.abs(J.value-fe.value)<.01),oe=D(()=>{var a;return{hasAmount:l.value.amount&&l.value.amount>0,hasDate:!!l.value.receipt_date,hasExpenseType:!!l.value.expense_type_code,hasPaymentMode:!!l.value.payment_mode,hasAttachment:T.value.length>0||S.value.length>0||!!we.value,amountMatchesPayments:!((a=l.value.payment_methods)!=null&&a.length)||Math.abs((l.value.amount||0)-l.value.payment_methods.reduce((e,m)=>e+(m.amount||0),0))<.02}}),Ce=D(()=>{const a=[];return oe.value.hasAmount||a.push("Suma"),oe.value.hasDate||a.push("Data"),oe.value.hasAttachment||a.push("Atasament"),a}),xe=_([{value:"casa",label:"Casa (numerar firma)"},{value:"banca",label:"Banca (virament/POS)"},{value:"avans_decontare",label:"Avans Decontare (decont angajat)"}]),Fe=_([{value:"bon_fiscal",label:"Bon Fiscal"},{value:"chitanta",label:"Chitanta"}]),ea=_([{value:"cheltuiala",label:"Cheltuiala (Plata)"},{value:"incasare",label:"Incasare"}]),aa=a=>{const e=a.query.toLowerCase();G.value=Z.value.filter(m=>m.name.toLowerCase().includes(e)||m.fiscal_code&&m.fiscal_code.toLowerCase().includes(e))};Ye(async()=>{await h.fetchAllNomenclatures(),h.partners.length===0&&await ta(),k.value||I.value?await ye():l.value.company_id=F.selectedCompanyId||1});const ta=async()=>{try{o.add({severity:"info",summary:"Sincronizare furnizori",detail:"Se sincronizeaza furnizorii din Oracle...",life:3e3});const a=await h.syncSuppliers();o.add({severity:"success",summary:"Sincronizare completa",detail:`${a.synced||h.partners.length} furnizori sincronizati`,life:3e3})}catch(a){console.warn("[ReceiptCreateView] Supplier sync failed:",a),o.add({severity:"warn",summary:"Sincronizare esuata",detail:"Nu s-au putut sincroniza furnizorii. Puteti continua cu furnizori locali.",life:5e3})}};Ie(()=>z.params.id,async(a,e)=>{a&&a!==e?(console.log("[ReceiptCreateView] Route changed to receipt:",a),await ye()):!a&&e&&(console.log("[ReceiptCreateView] Route changed to create mode"),u.value=null,S.value=[],T.value=[],W.value=null,l.value={receipt_type:"bon_fiscal",direction:"cheltuiala",receipt_date:new Date,amount:null,partner_name:null,cui:"",ocr_raw_text:"",expense_type_code:null,payment_mode:null,cash_register_id:null,cash_register_name:null,cash_register_account:null,receipt_number:"",description:"",company_id:de(),tva_breakdown:[],tva_total:null,items_count:null,vendor_address:"",payment_methods:[]})}),Ie(()=>F.selectedCompany,async(a,e)=>{a&&e&&a.id_firma!==e.id_firma&&(console.log("[ReceiptCreateView] Company changed, syncing suppliers in background..."),h.syncSuppliers().then(m=>{console.log("[ReceiptCreateView] Background sync complete:",m)}).catch(m=>{console.warn("[ReceiptCreateView] Background sync failed:",m)}))});const la=async()=>{E.value=!0;try{const a=await h.syncSuppliers();o.add({severity:"success",summary:"Sincronizare completa",detail:`${a.synced||0} furnizori noi din Oracle`,life:3e3})}catch(a){console.warn("[ReceiptCreateView] Manual supplier sync failed:",a),o.add({severity:"error",summary:"Sincronizare esuata",detail:a.message||"Nu s-au putut sincroniza furnizorii",life:5e3})}finally{E.value=!1}},ye=async()=>{try{u.value=await h.fetchReceiptById(Q.value);const a=(u.value.tva_breakdown||[]).map(e=>({code:e.code,percent:e.percent,amount:parseFloat(e.amount)||0}));l.value={receipt_type:u.value.receipt_type,direction:u.value.direction,receipt_date:new Date(u.value.receipt_date),amount:parseFloat(u.value.amount),partner_name:u.value.partner_name,cui:u.value.cui||"",ocr_raw_text:u.value.ocr_raw_text||"",expense_type_code:u.value.expense_type_code,payment_mode:u.value.payment_mode||null,cash_register_id:u.value.cash_register_id,cash_register_name:u.value.cash_register_name,cash_register_account:u.value.cash_register_account,receipt_number:u.value.receipt_number||"",description:u.value.description||"",company_id:u.value.company_id,tva_breakdown:a,tva_total:u.value.tva_total?parseFloat(u.value.tva_total):null,items_count:u.value.items_count||null,vendor_address:u.value.vendor_address||"",payment_methods:u.value.payment_methods||[]},S.value=u.value.attachments||[],await sa()}catch{o.add({severity:"error",summary:"Eroare",detail:"Nu s-a putut incarca bonul",life:5e3}),K.push("/data-entry")}},sa=async()=>{for(const a of S.value)try{const e=await h.fetchAttachmentBlob(a.id);e&&(r.value[a.id]=e)}catch(e){console.error(`Failed to load blob for attachment ${a.id}:`,e)}},Pe=async a=>{try{await h.downloadAttachment(a.id,a.filename),o.add({severity:"success",summary:"Succes",detail:"Fisierul a fost descarcat",life:2e3})}catch{o.add({severity:"error",summary:"Eroare",detail:"Nu s-a putut descarca fisierul",life:5e3})}},ia=a=>{we.value=a,T.value.some(e=>e.name===a.name)||(T.value=[a,...T.value])},na=a=>{console.log("[OCR Result] Received data, suggested_payment_mode:",a.suggested_payment_mode,"payment_methods:",a.payment_methods),W.value=a,o.add({severity:"success",summary:"OCR Procesare",detail:"Datele au fost extrase din imagine",life:3e3})},oa=a=>{o.add({severity:"error",summary:"Eroare OCR",detail:a,life:5e3})},ra=async a=>{var e,m;if(!me.value){me.value=a.id;try{const C=await apiService.get(`/receipts/attachments/${a.id}/download`,{responseType:"blob"}),L=new File([C.data],a.filename,{type:a.mime_type}),N=new FormData;N.append("file",L);const O=await apiService.post("/ocr/extract",N,{timeout:3e4}),Y=O.data.job_id;console.log("📋 OCR Rescan Job:",O.data);const ue=120;let j=0;for(;jsetTimeout(f,1e3));const X=(await apiService.get(`/ocr/jobs/${Y}`)).data;if(X.status==="completed"){X.result&&(W.value={...X.result,_processing_time_ms:X.processing_time_ms},ce.value=!1,o.add({severity:"success",summary:"OCR Procesare",detail:"Datele au fost re-extrase din atasament",life:3e3}));break}if(X.status==="failed"){o.add({severity:"error",summary:"Eroare OCR",detail:X.error||"Procesare OCR esuata",life:5e3});break}j++}j>=ue&&o.add({severity:"error",summary:"Eroare OCR",detail:"Timeout - procesarea a durat prea mult",life:5e3})}catch(C){const L=((m=(e=C.response)==null?void 0:e.data)==null?void 0:m.detail)||C.message||"Eroare la procesarea OCR";o.add({severity:"error",summary:"Eroare OCR",detail:L,life:5e3})}finally{me.value=null}}},ua=async a=>{var L,N,O,Y,ue,j,be,X;if(!a.amount||parseFloat(a.amount)<=0){const f=((L=a.payment_methods)==null?void 0:L.reduce((ae,ge)=>ae+parseFloat(ge.amount||0),0))||0;f>0?o.add({severity:"warn",summary:"Total nedetectat",detail:`Totalul nu a fost extras. Suma din plati: ${f.toFixed(2)} LEI`,life:6e3}):o.add({severity:"warn",summary:"Total nedetectat",detail:"Totalul nu a fost extras din OCR. Completati manual.",life:5e3})}if(a.amount&&((N=a.payment_methods)==null?void 0:N.length)>0){const f=a.payment_methods.reduce((ge,he)=>ge+parseFloat(he.amount||0),0);Math.abs(parseFloat(a.amount)-f)>.02&&o.add({severity:"warn",summary:"Diferenta detectata",detail:`Total (${parseFloat(a.amount).toFixed(2)}) ≠ Plati (${f.toFixed(2)})`,life:5e3})}a.receipt_type&&(l.value.receipt_type=a.receipt_type),a.receipt_date&&(l.value.receipt_date=new Date(a.receipt_date)),a.amount&&(l.value.amount=parseFloat(a.amount)),a.receipt_number&&(l.value.receipt_number=a.receipt_number),a.cui&&(l.value.cui=a.cui),a.raw_text&&(l.value.ocr_raw_text=a.raw_text),((O=a.tva_entries)==null?void 0:O.length)>0&&(l.value.tva_breakdown=a.tva_entries.map(f=>({code:f.code,percent:f.percent,amount:parseFloat(f.amount)}))),a.tva_total&&(l.value.tva_total=parseFloat(a.tva_total)),a.items_count&&(l.value.items_count=a.items_count),a.address&&(l.value.vendor_address=a.address),((Y=a.payment_methods)==null?void 0:Y.length)>0&&(l.value.payment_methods=a.payment_methods.map(f=>({method:f.method,amount:parseFloat(f.amount)}))),console.log("[OCR Apply] suggested_payment_mode:",a.suggested_payment_mode,"payment_methods:",a.payment_methods),a.suggested_payment_mode&&(l.value.payment_mode=a.suggested_payment_mode,Le.value=!0,console.log("[OCR Apply] Set payment_mode to:",a.suggested_payment_mode));const e=(j=(ue=F.selectedCompany)==null?void 0:ue.fiscal_code)==null?void 0:j.replace(/^RO/i,""),m=(be=a.cui)==null?void 0:be.replace(/^RO/i,""),C=(X=a.client_cui)==null?void 0:X.replace(/^RO/i,"");if(b.value=!1,w.value="",$.value=!1,m&&e&&m===e){if(l.value.direction="incasare",b.value=!0,w.value="CUI furnizor = CUI firma curenta",a.client_name||a.client_cui){if(l.value.partner_name=a.client_name||"",l.value.cui=a.client_cui||"",l.value.vendor_address=a.client_address||"",a.client_cui){const f=await h.searchSupplier(a.client_cui);f.found&&f.supplier&&(l.value.partner_name=f.supplier.name,l.value.cui=f.supplier.fiscal_code||a.client_cui,l.value.vendor_address=f.supplier.address||a.client_address||"",U.value=f.source,o.add({severity:"success",summary:"Client gasit",detail:`${f.supplier.name} (${f.source})`,life:3e3}))}o.add({severity:"info",summary:"Incasare detectata",detail:"Firma curenta este furnizorul. Partenerul este clientul.",life:4e3})}else $.value=!0,o.add({severity:"warn",summary:"Lipsesc date client",detail:"Incasare detectata dar nu exista date client pe bon. Completeaza manual.",life:5e3});o.add({severity:"success",summary:"Date aplicate",detail:"Datele OCR au fost aplicate in formular",life:3e3});return}else C&&e&&C===e?(l.value.direction="cheltuiala",b.value=!0,w.value="CUI client = CUI firma curenta"):C&&e&&C!==e&&(va(C,e)>=.8?o.add({severity:"warn",summary:"CUI client similar",detail:`CUI client (${C}) este similar cu CUI firma (${e}). Posibila eroare OCR.`,life:8e3}):C.length>=6&&o.add({severity:"info",summary:"CUI client diferit",detail:`CUI client pe bon: ${C}. CUI firma: ${e}`,life:5e3}));if(a.cui){o.add({severity:"info",summary:"Cautare furnizor",detail:`Se cauta furnizor dupa CUI: ${a.cui}`,life:2e3});const f=await h.searchSupplier(a.cui);if(f.found&&f.supplier){const ae={name:f.supplier.name,fiscal_code:f.supplier.fiscal_code,address:f.supplier.address,source:f.source};l.value.partner_name=f.supplier.name,l.value.cui=f.supplier.fiscal_code||a.cui,l.value.vendor_address=f.supplier.address||a.address||l.value.vendor_address,U.value=f.source,h.partners.some(he=>he.name===f.supplier.name)||h.partners.push(ae),o.add({severity:"success",summary:"Furnizor gasit",detail:`${f.supplier.name} (${f.source})`,life:3e3})}else ie.value={show:!0,cui:a.cui,name:a.partner_name||""},l.value.partner_name=a.partner_name||"",o.add({severity:"warn",summary:"Furnizor negasit",detail:`CUI ${a.cui} nu a fost gasit in nomenclator`,life:5e3})}else if(a.partner_name){const f=Z.value.find(ae=>ae.name.toLowerCase().includes(a.partner_name.toLowerCase()));f?(l.value.partner_name=f.name,l.value.cui=f.fiscal_code||"",l.value.vendor_address=f.address||l.value.vendor_address||"",U.value=f.source||"local"):l.value.partner_name=a.partner_name}o.add({severity:"success",summary:"Date aplicate",detail:"Datele OCR au fost aplicate in formular",life:3e3})},da=()=>{W.value=null},ca=async()=>{if(B.value)try{const a=await h.createLocalSupplier(B.value);l.value.partner_id=a.id,l.value.partner_name=a.name,o.add({severity:"success",summary:"Furnizor creat",detail:`${a.name} a fost adaugat`,life:3e3})}catch(a){o.add({severity:"error",summary:"Eroare",detail:a.message,life:5e3})}finally{pe.value=!1,B.value=null}},ma=()=>{pe.value=!1,B.value=null},pa=async()=>{if(l.value.cui)try{await h.createLocalSupplier({name:l.value.partner_name||ie.value.name||`Furnizor ${l.value.cui}`,fiscal_code:l.value.cui,address:l.value.vendor_address||null}),o.add({severity:"success",summary:"Furnizor creat",detail:`${l.value.partner_name||l.value.cui} a fost adaugat`,life:3e3}),ie.value={show:!1,cui:"",name:""},U.value="local"}catch(a){o.add({severity:"error",summary:"Eroare",detail:a.message||"Nu s-a putut crea furnizorul",life:5e3})}},va=(a,e)=>{if(!a||!e)return 0;const m=a.replace(/^R[O0]/i,"").replace(/\D/g,""),C=e.replace(/^R[O0]/i,"").replace(/\D/g,"");if(m.length===0||C.length===0)return 0;if(m===C)return 1;const L=Math.max(m.length,C.length),N=Math.min(m.length,C.length),O=N/L;let Y=0;for(let j=0;j{const e=a.value;e&&typeof e=="object"&&(l.value.partner_name=e.name,l.value.cui=e.fiscal_code||"",l.value.vendor_address=e.address||l.value.vendor_address||"",U.value=e.source||"oracle")},ya=()=>{var a;(a=$e.value)==null||a.click()},ga=a=>{var m;const e=(m=a.target)==null?void 0:m.files;(e==null?void 0:e.length)>0&&(T.value=[...T.value,...Array.from(e)]),a.target.value=""},Ue=a=>{T.value=T.value.filter((e,m)=>m!==a)},_a=async a=>{try{await h.deleteAttachment(a),S.value=S.value.filter(e=>e.id!==a),o.add({severity:"success",summary:"Succes",detail:"Atasamentul a fost sters",life:3e3})}catch(e){o.add({severity:"error",summary:"Eroare",detail:e.message,life:5e3})}},Me=a=>a<1024?a+" B":a<1024*1024?(a/1024).toFixed(1)+" KB":(a/(1024*1024)).toFixed(1)+" MB",ba=()=>{var e;return(e=l.value.tva_breakdown)!=null&&e.length?l.value.tva_breakdown.reduce((m,C)=>m+(C.amount||0),0).toLocaleString("ro-RO",{minimumFractionDigits:2,maximumFractionDigits:2}):"0.00"},Se=a=>new Intl.NumberFormat("ro-RO",{style:"currency",currency:"RON"}).format(a),ha=a=>a?new Date(a).toLocaleString("ro-RO"):"-",wa=a=>({draft:"status-draft",pending_review:"status-pending",approved:"status-approved",rejected:"status-rejected",synced:"status-synced"})[a]||"",Ca=a=>({draft:"Ciorna",pending_review:"In asteptare",approved:"Validat",rejected:"Respins",synced:"Sincronizat"})[a]||a,ka=async()=>{V.value=!0;try{const a=await h.submitReceipt(u.value.id);a.success?(o.add({severity:"success",summary:"Succes",detail:"Bonul a fost trimis spre aprobare",life:3e3}),await ye()):o.add({severity:"error",summary:"Eroare",detail:a.message,life:5e3})}catch(a){o.add({severity:"error",summary:"Eroare",detail:a.message||"Nu s-a putut trimite bonul",life:5e3})}finally{V.value=!1}},Ra=async()=>{V.value=!0;try{const a=await h.resubmitReceipt(u.value.id);a.success?(o.add({severity:"success",summary:"Succes",detail:"Bonul a fost re-trimis spre aprobare",life:3e3}),await ye()):o.add({severity:"error",summary:"Eroare",detail:a.message,life:5e3})}catch(a){o.add({severity:"error",summary:"Eroare",detail:a.message||"Nu s-a putut re-trimite bonul",life:5e3})}finally{V.value=!1}},Ve=_(!1),Te=_(!1),De=_(!1),ke=_(!1),re=_(""),$a=async()=>{Ve.value=!0;try{const a=await h.approveReceipt(u.value.id);a.success?(o.add({severity:"success",summary:"Succes",detail:"Bonul a fost validat",life:3e3}),await ye()):o.add({severity:"error",summary:"Eroare",detail:a.message,life:5e3})}catch(a){o.add({severity:"error",summary:"Eroare",detail:a.message||"Nu s-a putut valida bonul",life:5e3})}finally{Ve.value=!1}},xa=()=>{re.value="",ke.value=!0},Ta=async()=>{if(!re.value||re.value.length<5){o.add({severity:"warn",summary:"Atentie",detail:"Motivul respingerii trebuie sa aiba minim 5 caractere",life:3e3});return}Te.value=!0;try{const a=await h.rejectReceipt(u.value.id,re.value);a.success?(o.add({severity:"success",summary:"Succes",detail:"Bonul a fost respins",life:3e3}),ke.value=!1,await ye()):o.add({severity:"error",summary:"Eroare",detail:a.message,life:5e3})}catch(a){o.add({severity:"error",summary:"Eroare",detail:a.message||"Nu s-a putut respinge bonul",life:5e3})}finally{Te.value=!1}},Oa=async()=>{De.value=!0;try{const a=await h.unapproveReceipt(u.value.id);a.success?(o.add({severity:"success",summary:"Succes",detail:"Validarea a fost anulata",life:3e3}),await ye()):o.add({severity:"error",summary:"Eroare",detail:a.message,life:5e3})}catch(a){o.add({severity:"error",summary:"Eroare",detail:a.message||"Nu s-a putut anula validarea",life:5e3})}finally{De.value=!1}},Ne=()=>!k.value&&T.value.length===0&&!we.value?(o.add({severity:"warn",summary:"Validare",detail:"Trebuie sa adaugi cel putin o poza a bonului",life:3e3}),!1):l.value.receipt_date?!l.value.amount||l.value.amount<=0?(o.add({severity:"warn",summary:"Validare",detail:"Suma trebuie sa fie mai mare decat 0",life:3e3}),!1):!0:(o.add({severity:"warn",summary:"Validare",detail:"Data bonului este obligatorie",life:3e3}),!1),Be=async()=>{var a,e;if(Ne()){v.value=!0;try{if(l.value.cui&&ie.value.show)try{await h.createLocalSupplier({name:l.value.partner_name||`Furnizor ${l.value.cui}`,fiscal_code:l.value.cui,address:l.value.vendor_address||null}),o.add({severity:"info",summary:"Furnizor local creat",detail:`${l.value.partner_name||l.value.cui} adaugat automat`,life:3e3}),ie.value={show:!1,cui:"",name:""},U.value="local"}catch(O){console.warn("[saveReceipt] Failed to auto-create local supplier:",O)}const m=((a=l.value.payment_methods)==null?void 0:a.map(O=>({...O,amount:O.amount??0})))||null,C=((e=l.value.tva_breakdown)==null?void 0:e.map(O=>({...O,amount:O.amount??0})))||null,L={...l.value,receipt_date:l.value.receipt_date.toISOString().split("T")[0],payment_methods:m,tva_breakdown:C};let N;k.value?N=await h.updateReceipt(Q.value,L):N=await h.createReceipt(L);for(const O of T.value)try{await h.uploadAttachment(N.id,O)}catch{o.add({severity:"warn",summary:"Atentie",detail:`Nu s-a putut incarca: ${O.name}`,life:5e3})}o.add({severity:"success",summary:"Succes",detail:k.value?"Bonul a fost actualizat":"Bonul a fost creat",life:3e3}),K.push(`/data-entry/${N.id}`)}catch(m){o.add({severity:"error",summary:"Eroare",detail:m.message||"Nu s-a putut salva bonul",life:5e3})}finally{v.value=!1}}},za=async()=>{if(Ne()){V.value=!0;try{await Be();const a=await h.submitReceipt(Q.value);a.success?(o.add({severity:"success",summary:"Succes",detail:"Bonul a fost trimis spre aprobare",life:3e3}),K.push("/data-entry")):o.add({severity:"error",summary:"Eroare",detail:a.message,life:5e3})}catch(a){o.add({severity:"error",summary:"Eroare",detail:a.message||"Nu s-a putut trimite bonul",life:5e3})}finally{V.value=!1}}};return(a,e)=>{var j,be,X,f,ae,ge,he,je,We,qe,Ge,Ze,Je;const m=se("Button"),C=se("InputText"),L=se("Dropdown"),N=se("Calendar"),O=se("InputNumber"),Y=se("Textarea"),ue=Da("tooltip");return s(),n("div",Jt,[t("div",Xt,[t("div",Ht,[t("div",null,[t("h2",Kt,[t("i",{class:ee(I.value?"pi pi-receipt":"pi pi-plus-circle")},null,2),R(" "+p(I.value?`Bon #${(j=u.value)==null?void 0:j.id}`:k.value?"Editare Bon Fiscal":"Bon Fiscal Nou"),1)]),I.value&&u.value?(s(),n("span",{key:0,class:ee(["status-badge",wa(u.value.status)])},p(Ca(u.value.status)),3)):c("",!0)])]),(be=u.value)!=null&&be.rejection_reason?(s(),n("div",Qt,[e[26]||(e[26]=t("i",{class:"pi pi-exclamation-triangle"},null,-1)),t("div",null,[e[25]||(e[25]=t("strong",null,"Motiv respingere:",-1)),t("p",null,p(u.value.rejection_reason),1),t("small",null,"Respins de "+p(u.value.reviewed_by)+" la "+p(ha(u.value.reviewed_at)),1)])])):c("",!0),t("form",{id:"receipt-form",onSubmit:ze(Be,["prevent"])},[t("div",Yt,[t("div",el,[I.value?c("",!0):(s(),n("div",al,[t("h3",null,[e[27]||(e[27]=t("i",{class:"pi pi-camera"},null,-1)),R(" "+p(k.value?"Re-scanare OCR (optional)":"Poza Bon"),1)]),y(st,{ref_key:"ocrUploadZone",ref:A,onOcrResult:na,onFileSelected:ia,onError:oa},null,512),W.value&&ce.value?(s(),n("div",{key:0,class:"ocr-applied-banner",onClick:e[0]||(e[0]=i=>ce.value=!1)},[...e[28]||(e[28]=[t("i",{class:"pi pi-check-circle"},null,-1),t("span",null,"Date OCR aplicate",-1),t("i",{class:"pi pi-chevron-down"},null,-1)])])):c("",!0),W.value&&!ce.value?(s(),P(Zt,{key:1,data:W.value,onApply:ua,onDismiss:da,onCollapse:e[1]||(e[1]=i=>ce.value=!0)},null,8,["data"])):c("",!0)])),I.value&&S.value.length?(s(),n("div",tl,[t("h3",null,[e[29]||(e[29]=t("i",{class:"pi pi-images"},null,-1)),R(" Atasamente ("+p(S.value.length)+") ",1)]),t("div",ll,[(s(!0),n(H,null,le(S.value,i=>{var x;return s(),n("div",{key:i.id,class:"attachment-item"},[(x=i.mime_type)!=null&&x.startsWith("image/")?(s(),P(q(La),{key:0,src:r.value[i.id]||"",alt:i.filename,preview:"",class:"attachment-image"},null,8,["src","alt"])):(s(),n("div",sl,[e[30]||(e[30]=t("i",{class:"pi pi-file-pdf"},null,-1)),t("span",null,p(i.filename),1)])),y(m,{icon:"pi pi-download",severity:"secondary",rounded:"",size:"small",class:"download-btn",onClick:te=>Pe(i)},null,8,["onClick"])])}),128))])])):c("",!0),I.value&&!S.value.length?(s(),n("div",il,[...e[31]||(e[31]=[t("h3",null,[t("i",{class:"pi pi-images"}),R(" Atasamente ")],-1),t("div",{class:"empty-state"},[t("i",{class:"pi pi-image"}),t("p",null,"Niciun atasament")],-1)])])):c("",!0),k.value||T.value.length>0?(s(),n("div",nl,[k.value?(s(),n("h3",ol,[e[32]||(e[32]=t("i",{class:"pi pi-images"},null,-1)),e[33]||(e[33]=R(" Atasamente ",-1)),y(m,{icon:"pi pi-plus",label:"Adauga",severity:"secondary",size:"small",class:"add-attachment-btn",onClick:ya}),t("input",{ref_key:"editFileInput",ref:$e,type:"file",accept:"image/*,application/pdf",multiple:"",class:"hidden-file-input",onChange:ga},null,544)])):T.value.length>0?(s(),n("h3",rl,[...e[34]||(e[34]=[t("i",{class:"pi pi-paperclip"},null,-1),R(" Fisiere Selectate ",-1)])])):c("",!0),S.value.length?(s(),n("div",ul,[(s(!0),n(H,null,le(S.value,i=>{var x,te,Xe;return s(),n("div",{key:i.id,class:"image-preview-item"},[(x=i.mime_type)!=null&&x.startsWith("image/")&&r.value[i.id]?(s(),n("img",{key:0,src:r.value[i.id],alt:i.filename},null,8,dl)):(te=i.mime_type)!=null&&te.startsWith("image/")&&!r.value[i.id]?(s(),n("div",cl,[e[35]||(e[35]=t("i",{class:"pi pi-image",style:{"font-size":"2rem",color:"var(--text-color-secondary)"}},null,-1)),t("span",null,p(i.filename),1)])):(s(),n("div",ml,[e[36]||(e[36]=t("i",{class:"pi pi-file-pdf",style:{"font-size":"2rem"}},null,-1)),t("span",null,p(i.filename),1)])),t("div",pl,[(Xe=i.mime_type)!=null&&Xe.startsWith("image/")?(s(),P(m,{key:0,icon:"pi pi-sync",severity:"info",rounded:"",size:"small",loading:me.value===i.id,onClick:He=>ra(i)},null,8,["loading","onClick"])):c("",!0),y(m,{icon:"pi pi-download",severity:"secondary",rounded:"",size:"small",onClick:He=>Pe(i)},null,8,["onClick"]),y(m,{icon:"pi pi-times",severity:"danger",rounded:"",size:"small",onClick:He=>_a(i.id)},null,8,["onClick"])])])}),128))])):c("",!0),T.value.length?(s(),n("div",vl,[(s(!0),n(H,null,le(T.value,(i,x)=>(s(),n("div",{key:x,class:"selected-file-item"},[t("i",{class:ee(i.type.startsWith("image/")?"pi pi-image":"pi pi-file-pdf")},null,2),t("span",fl,p(i.name),1),t("span",yl,p(Me(i.size)),1),y(m,{icon:"pi pi-times",severity:"danger",rounded:"",size:"small",onClick:te=>Ue(x)},null,8,["onClick"])]))),128))])):c("",!0),k.value&&T.value.length?(s(),n("div",gl,[e[37]||(e[37]=t("div",{class:"pending-files-header"},"Fisiere noi de incarcat:",-1)),(s(!0),n(H,null,le(T.value,(i,x)=>(s(),n("div",{key:x,class:"selected-file-item"},[t("i",{class:ee(i.type.startsWith("image/")?"pi pi-image":"pi pi-file-pdf")},null,2),t("span",_l,p(i.name),1),t("span",bl,p(Me(i.size)),1),y(m,{icon:"pi pi-times",severity:"danger",rounded:"",size:"small",onClick:te=>Ue(x)},null,8,["onClick"])]))),128))])):c("",!0)])):c("",!0)]),t("div",hl,[t("div",wl,[t("div",Cl,[t("div",kl,[t("div",Rl,[e[38]||(e[38]=t("label",null,"Furnizor",-1)),g.value?c("",!0):Va((s(),P(m,{key:0,icon:"pi pi-sync",size:"small",text:"",rounded:"",loading:E.value,onClick:la,class:"sync-btn"},null,8,["loading"])),[[ue,"Re-sincronizeaza furnizorii din Oracle",void 0,{top:!0}]])]),y(q(Aa),{modelValue:l.value.partner_name,"onUpdate:modelValue":e[2]||(e[2]=i=>l.value.partner_name=i),suggestions:G.value,optionLabel:"name",field:"name",onComplete:aa,onItemSelect:fa,placeholder:"Cauta furnizor...",dropdown:"",forceSelection:!1,disabled:g.value},null,8,["modelValue","suggestions","disabled"]),U.value?(s(),n("small",$l,[e[39]||(e[39]=t("i",{class:"pi pi-check-circle"},null,-1)),R(" Validat ("+p(U.value)+") ",1)])):c("",!0)]),t("div",xl,[e[41]||(e[41]=t("label",null,"CUI",-1)),y(C,{modelValue:l.value.cui,"onUpdate:modelValue":e[3]||(e[3]=i=>l.value.cui=i),placeholder:"RO12345678",disabled:g.value},null,8,["modelValue","disabled"]),ie.value.show?(s(),n("div",Tl,[e[40]||(e[40]=t("small",{class:"p-text-warning"},[t("i",{class:"pi pi-exclamation-triangle"}),R(" Negasit - se va crea automat la salvare ")],-1)),g.value?c("",!0):(s(),P(m,{key:0,label:"Creaza acum",icon:"pi pi-plus",size:"small",severity:"warning",text:"",onClick:pa,class:"supplier-create-btn"}))])):c("",!0)])]),l.value.vendor_address?(s(),n("div",{key:0,class:"address-collapsed",onClick:e[4]||(e[4]=i=>ve.value=!ve.value)},[t("i",{class:ee(ve.value?"pi pi-chevron-up":"pi pi-chevron-down")},null,2),t("span",Ol,p(ve.value?"Ascunde adresa":l.value.vendor_address),1)])):c("",!0),l.value.vendor_address&&ve.value?(s(),n("div",zl,[y(C,{modelValue:l.value.vendor_address,"onUpdate:modelValue":e[5]||(e[5]=i=>l.value.vendor_address=i),placeholder:"Adresa furnizor",disabled:g.value,class:"input-small"},null,8,["modelValue","disabled"])])):c("",!0)]),t("div",Fl,[t("div",Sl,[t("div",Vl,[e[42]||(e[42]=t("label",null,"Tip",-1)),y(L,{modelValue:l.value.receipt_type,"onUpdate:modelValue":e[6]||(e[6]=i=>l.value.receipt_type=i),options:Fe.value,optionLabel:"label",optionValue:"value",placeholder:"Tip",disabled:g.value,class:"dropdown-compact dropdown-borderless"},null,8,["modelValue","options","disabled"])]),t("div",Dl,[e[43]||(e[43]=t("label",null,"Nr.",-1)),y(C,{modelValue:l.value.receipt_number,"onUpdate:modelValue":e[7]||(e[7]=i=>l.value.receipt_number=i),placeholder:"12345",style:{"max-width":"90px"},disabled:g.value},null,8,["modelValue","disabled"])]),t("div",Il,[e[44]||(e[44]=t("label",null,"Data *",-1)),y(N,{modelValue:l.value.receipt_date,"onUpdate:modelValue":e[8]||(e[8]=i=>l.value.receipt_date=i),dateFormat:"dd.mm.yy",showIcon:"",required:"",disabled:g.value},null,8,["modelValue","disabled"])]),t("div",Al,[t("div",El,[e[45]||(e[45]=t("label",null,"Operatiune",-1)),b.value?(s(),P(q(Ae),{key:0,severity:"info",value:"Auto",class:"auto-tag"})):c("",!0)]),y(L,{modelValue:l.value.direction,"onUpdate:modelValue":e[9]||(e[9]=i=>l.value.direction=i),options:ea.value,optionLabel:"label",optionValue:"value",placeholder:"Tip",disabled:g.value,onChange:e[10]||(e[10]=i=>b.value=!1),class:"dropdown-compact dropdown-borderless"},null,8,["modelValue","options","disabled"])])]),$.value?(s(),P(q(Ea),{key:0,severity:"warn",closable:!1,class:"mt-1 message-compact"},{default:_e(()=>[...e[46]||(e[46]=[t("small",null,"Incasare detectata dar lipsesc datele clientului.",-1)])]),_:1})):c("",!0)]),t("div",Ll,[t("div",Pl,[t("div",Ul,[e[47]||(e[47]=t("label",null,"TOTAL *",-1)),y(O,{modelValue:l.value.amount,"onUpdate:modelValue":e[11]||(e[11]=i=>l.value.amount=i),minFractionDigits:2,maxFractionDigits:2,required:"",disabled:g.value,class:"input-compact",pt:{root:{style:"width: 130px"}}},null,8,["modelValue","disabled"])]),(s(!0),n(H,null,le(l.value.payment_methods,(i,x)=>(s(),n("div",{class:"value-item payment-method-item",key:i.method},[t("label",null,p(i.method),1),y(O,{modelValue:l.value.payment_methods[x].amount,"onUpdate:modelValue":te=>l.value.payment_methods[x].amount=te,locale:"en-US",minFractionDigits:2,maxFractionDigits:2,disabled:g.value,inputStyle:{width:"110px"},class:"input-payment-method"},null,8,["modelValue","onUpdate:modelValue","disabled"])]))),128)),t("div",Ml,[e[48]||(e[48]=t("label",null,"Mod Plata",-1)),y(L,{modelValue:l.value.payment_mode,"onUpdate:modelValue":e[12]||(e[12]=i=>l.value.payment_mode=i),options:xe.value,optionLabel:"label",optionValue:"value",placeholder:"Selecteaza",disabled:g.value,class:"dropdown-payment dropdown-borderless"},null,8,["modelValue","options","disabled"])])]),((X=l.value.tva_breakdown)==null?void 0:X.length)>0?(s(),n("div",Nl,[(s(!0),n(H,null,le(l.value.tva_breakdown,(i,x)=>(s(),n("div",{class:"value-item tva-item",key:"tva-"+x},[t("label",null,"TVA "+p(i.code)+" "+p(i.percent)+"%",1),y(O,{modelValue:l.value.tva_breakdown[x].amount,"onUpdate:modelValue":te=>l.value.tva_breakdown[x].amount=te,minFractionDigits:2,maxFractionDigits:2,disabled:g.value,inputStyle:{width:"110px"},class:"input-tva"},null,8,["modelValue","onUpdate:modelValue","disabled"])]))),128)),t("div",Bl,[e[49]||(e[49]=t("label",null,"Total TVA",-1)),t("span",jl,p(ba()),1)])])):c("",!0)]),t("div",Wl,[t("div",ql,[t("div",Gl,[e[50]||(e[50]=t("label",null,"Tip Cheltuiala",-1)),y(L,{modelValue:l.value.expense_type_code,"onUpdate:modelValue":e[13]||(e[13]=i=>l.value.expense_type_code=i),options:ne.value,optionLabel:"name",optionValue:"code",placeholder:"Selecteaza tip cheltuiala",disabled:g.value,class:"dropdown-borderless"},null,8,["modelValue","options","disabled"])])]),t("div",Zl,[t("div",Jl,[e[51]||(e[51]=t("label",{class:"label-small"},"Descriere",-1)),y(Y,{modelValue:l.value.description,"onUpdate:modelValue":e[14]||(e[14]=i=>l.value.description=i),rows:"2",placeholder:"Descriere optionala...",disabled:g.value},null,8,["modelValue","disabled"])]),l.value.items_count?(s(),n("div",Xl,[e[52]||(e[52]=t("label",{class:"label-small label-muted"},"Nr. Art.",-1)),y(O,{modelValue:l.value.items_count,"onUpdate:modelValue":e[15]||(e[15]=i=>l.value.items_count=i),min:1,placeholder:"17",class:"items-count-input",disabled:g.value},null,8,["modelValue","disabled"])])):c("",!0)])])])]),I.value&&((ae=(f=u.value)==null?void 0:f.entries)!=null&&ae.length)?(s(),n("div",Hl,[e[57]||(e[57]=t("h3",null,[t("i",{class:"pi pi-book"}),R(" Note Contabile ")],-1)),t("div",Kl,[t("table",Ql,[e[55]||(e[55]=t("thead",null,[t("tr",null,[t("th",null,"Tip"),t("th",null,"Cont"),t("th",null,"Denumire Cont"),t("th",{style:{"text-align":"right"}},"Suma")])],-1)),t("tbody",null,[(s(!0),n(H,null,le(u.value.entries,i=>(s(),n("tr",{key:i.id},[t("td",null,[y(q(Ae),{value:i.entry_type==="debit"?"D":"C",severity:i.entry_type==="debit"?"danger":"success"},null,8,["value","severity"])]),t("td",null,p(i.account_code),1),t("td",null,p(i.account_name||"-"),1),t("td",{class:ee(i.entry_type),style:{"text-align":"right"}},p(Se(i.amount)),3)]))),128))]),t("tfoot",null,[t("tr",null,[e[53]||(e[53]=t("td",{colspan:"3",style:{"text-align":"right"}},[t("strong",null,"Total Debit:")],-1)),t("td",Yl,[t("strong",null,p(Se(J.value)),1)])]),t("tr",null,[e[54]||(e[54]=t("td",{colspan:"3",style:{"text-align":"right"}},[t("strong",null,"Total Credit:")],-1)),t("td",es,[t("strong",null,p(Se(fe.value)),1)])])])]),M.value?c("",!0):(s(),n("div",as,[...e[56]||(e[56]=[t("i",{class:"pi pi-exclamation-triangle"},null,-1),R(" Atentie: Notele contabile nu sunt echilibrate! ",-1)])]))])])):c("",!0),e[58]||(e[58]=t("div",{class:"floating-buttons-spacer"},null,-1))],32),I.value?c("",!0):(s(),n("div",ts,[Ce.value.length>0?(s(),n("div",ls,[e[60]||(e[60]=t("i",{class:"pi pi-exclamation-circle"},null,-1)),t("span",null,[e[59]||(e[59]=R("Campuri obligatorii necompletate: ",-1)),t("strong",null,p(Ce.value.join(", ")),1)])])):c("",!0),oe.value.amountMatchesPayments?c("",!0):(s(),n("div",ss,[...e[61]||(e[61]=[t("i",{class:"pi pi-exclamation-triangle"},null,-1),t("span",null,"Totalul nu corespunde cu suma metodelor de plata",-1)])]))]))]),t("div",is,[y(m,{icon:"pi pi-arrow-left",label:"Inapoi",severity:"secondary",onClick:e[16]||(e[16]=i=>a.$router.push("/data-entry"))}),I.value?(s(),n(H,{key:0},[((ge=u.value)==null?void 0:ge.status)==="draft"||((he=u.value)==null?void 0:he.status)==="rejected"?(s(),P(m,{key:0,icon:"pi pi-pencil",label:"Editeaza",onClick:e[17]||(e[17]=i=>a.$router.push(`/data-entry/${u.value.id}/edit`))})):c("",!0),((je=u.value)==null?void 0:je.status)==="draft"?(s(),P(m,{key:1,icon:"pi pi-send",label:"Trimite",severity:"success",onClick:ka,loading:V.value},null,8,["loading"])):c("",!0),((We=u.value)==null?void 0:We.status)==="rejected"?(s(),P(m,{key:2,icon:"pi pi-refresh",label:"Re-trimite",severity:"warning",onClick:Ra,loading:V.value},null,8,["loading"])):c("",!0),((qe=u.value)==null?void 0:qe.status)==="pending_review"?(s(),P(m,{key:3,icon:"pi pi-check",label:"Valideaza",severity:"success",onClick:$a,loading:Ve.value},null,8,["loading"])):c("",!0),((Ge=u.value)==null?void 0:Ge.status)==="pending_review"?(s(),P(m,{key:4,icon:"pi pi-times",label:"Respinge",severity:"danger",onClick:xa,loading:Te.value},null,8,["loading"])):c("",!0),((Ze=u.value)==null?void 0:Ze.status)==="approved"?(s(),P(m,{key:5,icon:"pi pi-undo",label:"Anuleaza Validarea",severity:"warning",onClick:Oa,loading:De.value},null,8,["loading"])):c("",!0)],64)):(s(),n(H,{key:1},[y(m,{type:"submit",icon:"pi pi-save",label:"Salveaza",loading:v.value,form:"receipt-form"},null,8,["loading"]),k.value&&((Je=u.value)==null?void 0:Je.status)==="draft"?(s(),P(m,{key:0,type:"button",icon:"pi pi-send",label:"Trimite",severity:"success",loading:V.value,onClick:za},null,8,["loading"])):c("",!0)],64))]),y(q(Qe),{visible:pe.value,"onUpdate:visible":e[21]||(e[21]=i=>pe.value=i),header:"Furnizor Negasit",modal:!0,style:{width:"450px"}},{footer:_e(()=>[y(m,{label:"Anuleaza",severity:"secondary",onClick:ma}),y(m,{label:"Creaza Furnizor",icon:"pi pi-plus",onClick:ca})]),default:_e(()=>{var i;return[t("div",ns,[t("p",null,[e[62]||(e[62]=t("i",{class:"pi pi-exclamation-triangle",style:{color:"var(--orange-500)"}},null,-1)),e[63]||(e[63]=R(" Furnizorul cu CUI ",-1)),t("strong",null,p((i=B.value)==null?void 0:i.fiscal_code),1),e[64]||(e[64]=R(" nu a fost gasit in baza de date. ",-1))]),e[68]||(e[68]=t("p",null,"Doriti sa creati un furnizor local cu datele extrase din bon?",-1)),t("div",os,[e[65]||(e[65]=t("label",null,"Nume Furnizor",-1)),y(C,{modelValue:B.value.name,"onUpdate:modelValue":e[18]||(e[18]=x=>B.value.name=x),class:"w-full"},null,8,["modelValue"])]),t("div",rs,[e[66]||(e[66]=t("label",null,"CUI",-1)),y(C,{modelValue:B.value.fiscal_code,"onUpdate:modelValue":e[19]||(e[19]=x=>B.value.fiscal_code=x),class:"w-full",disabled:""},null,8,["modelValue"])]),t("div",us,[e[67]||(e[67]=t("label",null,"Adresa",-1)),y(C,{modelValue:B.value.address,"onUpdate:modelValue":e[20]||(e[20]=x=>B.value.address=x),class:"w-full"},null,8,["modelValue"])])])]}),_:1},8,["visible"]),y(q(Qe),{visible:ke.value,"onUpdate:visible":e[24]||(e[24]=i=>ke.value=i),header:"Respinge Bon",modal:!0,style:{width:"450px"}},{footer:_e(()=>[y(m,{label:"Anuleaza",severity:"secondary",onClick:e[23]||(e[23]=i=>ke.value=!1)}),y(m,{label:"Respinge",icon:"pi pi-times",severity:"danger",onClick:Ta,loading:Te.value,disabled:!re.value||re.value.length<5},null,8,["loading","disabled"])]),default:_e(()=>[t("div",ds,[e[70]||(e[70]=t("p",null,[t("i",{class:"pi pi-exclamation-triangle",style:{color:"var(--red-500)"}}),R(" Introduceti motivul respingerii bonului: ")],-1)),t("div",cs,[e[69]||(e[69]=t("label",null,"Motiv respingere *",-1)),y(Y,{modelValue:re.value,"onUpdate:modelValue":e[22]||(e[22]=i=>re.value=i),rows:"3",class:"w-full",placeholder:"Explicati de ce bonul este respins (minim 5 caractere)..."},null,8,["modelValue"])])])]),_:1},8,["visible"])])}}},ws=Ee(ms,[["__scopeId","data-v-7782ce9c"]]);export{ws as default}; -//# sourceMappingURL=ReceiptCreateView.RpTqvOIL.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/ReceiptCreateView.RpTqvOIL.js.map b/deploy-package-20260223-151231/frontend/assets/ReceiptCreateView.RpTqvOIL.js.map deleted file mode 100644 index bd090d4..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ReceiptCreateView.RpTqvOIL.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReceiptCreateView.RpTqvOIL.js","sources":["../../src/modules/data-entry/components/ocr/OCRUploadZone.vue","../../src/modules/data-entry/components/ocr/OCRPreview.vue","../../src/modules/data-entry/views/receipts/ReceiptCreateView.vue"],"sourcesContent":["\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n\n\n\n"],"names":["emit","__emit","fileInput","ref","selectedFile","isDragging","processing","error","ocrStore","useOCRSettingsStore","selectedEngine","engineConfig","engineOptions","computed","engine","_a","_b","onMounted","watch","newEngine","oldEngine","err","jobId","queuePosition","estimatedWait","jobStatus","processingMessage","processingSubtext","onDragOver","onDragLeave","onDrop","event","files","handleFile","triggerFileInput","onFileSelected","file","arrayBuffer","clonedFile","e","processOCR","formData","_c","job","api","pollJobStatus","_d","message","_f","_e","id","startTime","poll","pollStartTime","pollDuration","waitTime","resolve","formatFileSize","bytes","__expose","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeClass","_hoisted_2","_createVNode","_component_ProgressSpinner","_hoisted_3","_toDisplayString","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_cache","_hoisted_12","_component_Button","_unref","Dropdown","$event","_withCtx","option","_hoisted_13","_hoisted_14","_hoisted_15","_createBlock","_component_Message","props","__props","showRawText","computedTvaTotal","sum","paymentSum","pm","tvaImpliedTotal","mainEntry","rate","tvaAmount","totalMismatchPayment","total","totalMismatchTva","formatAmount","amount","formatDate","dateStr","getEngineClass","getEngineIcon","getEngineLabel","getMessageClass","formatProcessingTime","ms","OCRConfidenceIndicator","Button","$emit","_hoisted_10","_hoisted_11","_Fragment","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","Tag","_hoisted_20","_hoisted_21","_createTextVNode","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","idx","_hoisted_30","_hoisted_31","entry","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","route","useRoute","router","useRouter","toast","useToast","store","useReceiptsStore","companyStore","useCompanyStore","isViewMode","isEditMode","isReadOnly","receiptId","receipt","getSelectedCompanyId","form","selectedFiles","existingAttachments","attachmentBlobUrls","saving","submitting","ocrUploadZone","ocrData","ocrFile","ocrCollapsed","ocrRescanningId","editFileInput","showCreateSupplierDialog","pendingSupplierData","supplierWarning","showAddressExpanded","paymentSetFromOCR","directionAutoDetected","directionAutoReason","missingClientWarning","filteredPartners","supplierSource","syncingSuppliers","partners","expenseTypes","totalDebit","totalCredit","isBalanced","validationState","s","p","missingRequiredFields","missing","paymentModeOptions","receiptTypeOptions","directionOptions","searchPartners","query","syncSuppliersIfNeeded","loadReceipt","result","newId","oldId","newCompany","oldCompany","resyncSuppliers","parsedTvaBreakdown","loadAttachmentBlobUrls","att","blobUrl","downloadAttachment","attachment","onOCRFileSelected","f","onOCRResult","data","onOCRError","rescanAttachmentOCR","response","submitResponse","maxAttempts","attempts","applyOCRData","companyCui","vendorCui","_g","clientCui","_h","clientResult","calculateCuiSimilarity","supplierObj","matchingPartner","dismissOCRData","createLocalSupplier","supplier","cancelCreateSupplier","createLocalSupplierFromWarning","cui1","cui2","norm1","norm2","maxLen","minLen","lengthSimilarity","matches","i","onPartnerSelect","partner","onEditFileSelect","removeSelectedFile","index","_","removeExistingAttachment","attachmentId","a","formatTvaTotal","formatDateTime","getStatusClass","status","getStatusLabel","submitReceipt","resubmitReceipt","approving","rejecting","unapproving","showRejectDialog","rejectReason","approveReceipt","openRejectDialog","rejectReceipt","unapproveReceipt","validateForm","saveReceipt","cleanedPaymentMethods","cleanedTvaBreakdown","savedReceipt","submitForReview","OCRUploadZone","OCRPreview","_renderList","Image","AutoComplete","_component_InputText","_component_Dropdown","_component_Calendar","_hoisted_42","_hoisted_43","Message","_hoisted_44","_hoisted_45","_hoisted_46","_component_InputNumber","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_hoisted_54","_hoisted_55","_component_Textarea","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_65","_hoisted_66","$router","_i","_j","_k","_l","_m","Dialog","_hoisted_67","_hoisted_68","_hoisted_69","_hoisted_70","_hoisted_71","_hoisted_72"],"mappings":"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"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/ReceiptCreateView.mPxlvevl.css b/deploy-package-20260223-151231/frontend/assets/ReceiptCreateView.mPxlvevl.css deleted file mode 100644 index 928587c..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ReceiptCreateView.mPxlvevl.css +++ /dev/null @@ -1 +0,0 @@ -.ocr-upload-zone[data-v-50521626]{margin-bottom:1rem}.upload-dropzone[data-v-50521626]{border:2px dashed var(--surface-border);border-radius:10px;padding:1rem 1.25rem;text-align:center;cursor:pointer;transition:all .3s ease;background:var(--surface-ground)}.upload-dropzone[data-v-50521626]:hover{border-color:var(--primary-500);background:var(--surface-hover)}.upload-dropzone.dragging[data-v-50521626]{border-color:var(--primary-500);background:var(--primary-50);transform:scale(1.02)}.upload-dropzone.processing[data-v-50521626]{cursor:default;background:var(--surface-card)}.hidden-input[data-v-50521626]{display:none}.empty-state[data-v-50521626]{display:flex;flex-direction:column;align-items:center;gap:.25rem}.main-text[data-v-50521626]{font-size:.9rem;color:var(--text-color-secondary);margin:.25rem 0}.sub-text[data-v-50521626]{font-size:.8rem;color:var(--text-color-secondary);margin:0}.file-selected-state[data-v-50521626]{display:flex;flex-direction:column;align-items:center;gap:.15rem}.file-name[data-v-50521626]{font-weight:600;font-size:.9rem;color:var(--text-color);margin:.25rem 0 0;word-break:break-all}.file-size[data-v-50521626]{font-size:.8rem;color:var(--text-color-secondary);margin:0}.action-buttons[data-v-50521626]{display:flex;gap:.5rem;margin-top:.75rem;justify-content:center;align-items:center;flex-wrap:wrap}.engine-selector[data-v-50521626]{min-width:180px}.engine-option[data-v-50521626]{display:flex;flex-direction:column;gap:2px;padding:4px 0}.engine-label[data-v-50521626]{font-weight:500;font-size:.875rem;color:var(--text-color)}.engine-desc[data-v-50521626]{font-size:.75rem;color:var(--text-color-secondary)}.processing-state[data-v-50521626]{display:flex;flex-direction:column;align-items:center;gap:.5rem}.processing-text[data-v-50521626]{font-size:1rem;color:var(--text-color-secondary);margin:.5rem 0 0;font-weight:500}.processing-subtext[data-v-50521626]{font-size:.85rem;color:var(--text-color-secondary);margin:0}.ocr-preview[data-v-3f33cf7b]{background:var(--green-50);border:1px solid var(--green-300);border-radius:12px;margin:1rem 0;overflow:hidden}.preview-header[data-v-3f33cf7b]{display:flex;justify-content:space-between;align-items:center;padding:.75rem 1rem;background:var(--green-100);border-bottom:1px solid var(--green-300)}.header-left[data-v-3f33cf7b]{display:flex;align-items:center;gap:.5rem}.title[data-v-3f33cf7b]{font-weight:600;color:var(--green-800)}.header-right[data-v-3f33cf7b]{display:flex;align-items:center;gap:.75rem}.overall-confidence[data-v-3f33cf7b]{display:flex;align-items:center;gap:.5rem;font-size:.85rem;color:var(--green-800)}.collapse-btn[data-v-3f33cf7b]{color:var(--green-800)!important}.preview-content[data-v-3f33cf7b]{padding:.75rem 1rem}.ocr-section[data-v-3f33cf7b]{padding:.75rem;margin-bottom:.5rem;background:#ffffff80;border-radius:8px;border:1px solid var(--green-200)}.ocr-section[data-v-3f33cf7b]:last-of-type{margin-bottom:0}.ocr-section-title[data-v-3f33cf7b]{font-size:.7rem;font-weight:700;color:var(--green-800);text-transform:uppercase;letter-spacing:.08em;margin-bottom:.5rem;padding-bottom:.35rem;border-bottom:1px dashed var(--green-300)}.ocr-section-content[data-v-3f33cf7b]{color:var(--text-color)}.vendor-name[data-v-3f33cf7b]{font-weight:600;font-size:.95rem;display:flex;align-items:center;gap:.5rem}.vendor-cui[data-v-3f33cf7b]{font-size:.85rem;color:var(--text-color-secondary);margin-top:.15rem}.vendor-address[data-v-3f33cf7b]{font-size:.8rem;color:var(--text-color-secondary);margin-top:.15rem}.client-name[data-v-3f33cf7b]{font-weight:600;font-size:.95rem;display:flex;align-items:center;gap:.5rem}.client-cui[data-v-3f33cf7b]{font-size:.85rem;color:var(--text-color-secondary);margin-top:.15rem}.client-address[data-v-3f33cf7b]{font-size:.8rem;color:var(--text-color-secondary);margin-top:.15rem}.no-data[data-v-3f33cf7b]{color:var(--text-color-secondary);font-style:italic}.document-row[data-v-3f33cf7b]{display:flex;align-items:center;gap:.75rem;flex-wrap:wrap}.doc-number[data-v-3f33cf7b]{font-weight:500;color:var(--text-color)}.doc-date[data-v-3f33cf7b]{display:flex;align-items:center;gap:.35rem;color:var(--text-color-secondary);font-size:.9rem}.doc-date .pi-calendar[data-v-3f33cf7b]{font-size:.85rem;color:var(--text-color-secondary)}.ocr-values-table[data-v-3f33cf7b]{display:flex;flex-direction:column;gap:.35rem}.value-row[data-v-3f33cf7b]{display:flex;align-items:center;font-size:.9rem;padding:.25rem 0}.value-label[data-v-3f33cf7b]{font-weight:500;color:var(--text-color)}.value-amount[data-v-3f33cf7b]{font-weight:600;margin-left:auto;color:var(--text-color);display:flex;align-items:center;gap:.5rem}.value-row.total-row[data-v-3f33cf7b]{margin-top:.35rem;padding-top:.5rem;border-top:1px dashed var(--green-300)}.items-count-inline[data-v-3f33cf7b]{font-size:.8rem;color:var(--text-color-secondary);text-align:right;padding-top:.35rem}.confidence-inline[data-v-3f33cf7b]{margin-left:.25rem}.value-row.warning-row[data-v-3f33cf7b]{background:var(--yellow-100);border-radius:6px;padding:.5rem .75rem;margin:.25rem 0}.value-row.warning-row .value-label[data-v-3f33cf7b]{display:flex;align-items:center;gap:.5rem;color:var(--yellow-800)}.warning-icon[data-v-3f33cf7b]{color:var(--yellow-500);font-size:.9rem}.value-amount.calculated[data-v-3f33cf7b]{color:var(--yellow-800)}.value-amount .hint[data-v-3f33cf7b]{font-size:.75rem;font-weight:400;color:var(--text-color-secondary)}.validation-warning[data-v-3f33cf7b]{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;margin:.25rem 0;background:var(--red-100);border-radius:6px;font-size:.8rem;color:var(--red-800)}.validation-warning i[data-v-3f33cf7b]{color:var(--red-600);font-size:.9rem}.validation-info[data-v-3f33cf7b]{display:flex;align-items:center;gap:.5rem;padding:.5rem .75rem;margin:.25rem 0;background:var(--blue-100);border-radius:6px;font-size:.8rem;color:var(--blue-700)}.validation-info i[data-v-3f33cf7b]{color:var(--blue-600);font-size:.9rem}.raw-text-section[data-v-3f33cf7b]{margin-top:1rem;padding-top:1rem;border-top:1px dashed var(--green-300)}.raw-text-header[data-v-3f33cf7b]{display:flex;align-items:center;flex-wrap:wrap;gap:.75rem}.ocr-engine-badge[data-v-3f33cf7b]{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;border-radius:4px;font-size:.75rem;font-weight:500}.ocr-engine-badge.paddleocr[data-v-3f33cf7b]{background:var(--blue-100);color:var(--blue-700)}.ocr-engine-badge.tesseract[data-v-3f33cf7b]{background:var(--yellow-100);color:var(--yellow-800)}.ocr-engine-badge.fast[data-v-3f33cf7b]{background:var(--green-100);color:var(--green-800)}.ocr-engine-badge.adaptive[data-v-3f33cf7b]{background:var(--blue-100);color:var(--blue-700)}.ocr-engine-badge.full[data-v-3f33cf7b]{background:var(--yellow-100);color:var(--yellow-800)}.ocr-engine-badge.doctr[data-v-3f33cf7b]{background:var(--purple-100);color:var(--purple-700)}.ocr-engine-badge.doctr-fast[data-v-3f33cf7b]{background:var(--teal-100);color:var(--teal-700)}.ocr-engine-badge.doctr-adaptive[data-v-3f33cf7b]{background:var(--indigo-100);color:var(--indigo-700)}.ocr-message-badge[data-v-3f33cf7b]{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;border-radius:4px;font-size:.75rem;font-weight:500;background:var(--surface-100);color:var(--text-color-secondary)}.ocr-message-badge.fast-mode[data-v-3f33cf7b]{background:var(--green-100);color:var(--green-800)}.ocr-message-badge.full-pipeline[data-v-3f33cf7b]{background:var(--yellow-100);color:var(--yellow-800)}.ocr-time-badge[data-v-3f33cf7b]{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;border-radius:4px;font-size:.75rem;font-weight:600;background:var(--indigo-100);color:var(--indigo-700)}.raw-text[data-v-3f33cf7b]{margin-top:.5rem;padding:.75rem;background:var(--surface-card);border:1px solid var(--surface-border);border-radius:8px;max-height:200px;overflow:auto}.raw-text pre[data-v-3f33cf7b]{margin:0;font-size:.75rem;white-space:pre-wrap;word-break:break-word;color:var(--text-color-secondary)}.preview-actions[data-v-3f33cf7b]{display:flex;justify-content:flex-end;gap:.75rem;padding:.75rem 1rem;background:var(--surface-ground);border-top:1px solid var(--surface-border)}@media (max-width: 640px){.preview-header[data-v-3f33cf7b]{flex-direction:column;gap:.5rem;align-items:flex-start}.preview-grid[data-v-3f33cf7b]{grid-template-columns:1fr}.preview-actions[data-v-3f33cf7b]{flex-direction:column}}.action-buttons-top[data-v-7782ce9c]{position:fixed;bottom:1.5rem;right:1.5rem;display:flex;flex-direction:row;gap:.5rem;z-index:100}.floating-buttons-spacer[data-v-7782ce9c]{height:20px}.validation-banners[data-v-7782ce9c]{display:flex;flex-direction:column;gap:.5rem;margin-top:1rem;margin-bottom:1rem}.validation-banner[data-v-7782ce9c]{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;border-radius:8px;background:var(--yellow-100);border:1px solid var(--yellow-400);color:var(--yellow-800);font-size:.875rem}.validation-banner.warning[data-v-7782ce9c]{background:var(--red-100);border-color:var(--red-400);color:var(--red-800)}.validation-banner i[data-v-7782ce9c]{font-size:1.1rem}.supplier-warning-box[data-v-7782ce9c]{display:flex;align-items:center;gap:.5rem;margin-top:.25rem}.supplier-warning-box small[data-v-7782ce9c]{display:flex;align-items:center;gap:.25rem}.supplier-create-btn[data-v-7782ce9c]{padding:.25rem .5rem!important;font-size:.75rem!important}.label-with-action[data-v-7782ce9c]{display:flex;align-items:center;gap:.25rem}.label-with-action label[data-v-7782ce9c]{margin-bottom:0}.sync-btn[data-v-7782ce9c]{width:1.5rem!important;height:1.5rem!important;padding:0!important}.sync-btn .pi[data-v-7782ce9c]{font-size:.75rem}.receipt-form-layout[data-v-7782ce9c]{display:grid;grid-template-columns:minmax(280px,1fr) minmax(380px,1.5fr);gap:1.5rem;align-items:start}.form-column-left[data-v-7782ce9c]{position:sticky;top:1rem}.form-column-right[data-v-7782ce9c]{min-width:0}.form-column-right h3[data-v-7782ce9c]{display:flex;align-items:center;gap:.5rem;margin-bottom:.75rem;margin-top:0}@media (max-width: 1024px){.receipt-form-layout[data-v-7782ce9c]{grid-template-columns:1fr}.form-column-left[data-v-7782ce9c]{position:static}}.ocr-applied-banner[data-v-7782ce9c]{display:flex;align-items:center;gap:.5rem;padding:.6rem 1rem;background:var(--green-100);border:1px solid var(--green-300);border-radius:8px;cursor:pointer;margin-top:.75rem;transition:background .2s}.ocr-applied-banner[data-v-7782ce9c]:hover{background:var(--green-200)}.ocr-applied-banner .pi-check-circle[data-v-7782ce9c]{color:var(--green-500);font-size:1.1rem}.ocr-applied-banner span[data-v-7782ce9c]{flex:1;font-weight:500;color:var(--green-800);font-size:.9rem}.ocr-applied-banner .pi-chevron-down[data-v-7782ce9c]{color:var(--green-800);font-size:.8rem}.upload-section[data-v-7782ce9c]{margin-bottom:1rem}.upload-section h3[data-v-7782ce9c]{display:flex;align-items:center;gap:.5rem;margin-bottom:.75rem;margin-top:0;font-size:1rem}.hidden-file-input[data-v-7782ce9c]{display:none}.add-attachment-btn[data-v-7782ce9c]{margin-left:auto}.pending-files-header[data-v-7782ce9c]{font-size:.85rem;color:var(--text-color-secondary);font-weight:500;margin-bottom:.5rem;padding-bottom:.35rem;border-bottom:1px dashed var(--surface-border)}.radio-group[data-v-7782ce9c]{display:flex;gap:1.5rem}.radio-item[data-v-7782ce9c]{display:flex;align-items:center;gap:.5rem}.pdf-preview[data-v-7782ce9c]{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;background:var(--surface-100);padding:1rem}.pdf-preview span[data-v-7782ce9c]{font-size:.75rem;margin-top:.5rem;text-align:center;word-break:break-word}.selected-files-list[data-v-7782ce9c]{margin-top:1rem;display:flex;flex-direction:column;gap:.5rem}.selected-file-item[data-v-7782ce9c]{display:flex;align-items:center;gap:.75rem;padding:.5rem .75rem;background:var(--surface-ground);border:1px solid var(--surface-border);border-radius:8px}.selected-file-item i[data-v-7782ce9c]{color:var(--primary-500);font-size:1.25rem}.selected-file-item .file-name[data-v-7782ce9c]{flex:1;font-weight:500;color:var(--text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.selected-file-item .file-size[data-v-7782ce9c]{font-size:.85rem;color:var(--text-color-secondary)}.extra-details-section[data-v-7782ce9c]{margin-top:1rem;padding:.75rem;background:var(--blue-50);border:1px solid var(--blue-200);border-radius:8px}.extra-details-section h3[data-v-7782ce9c]{display:flex;align-items:center;gap:.5rem;margin-bottom:.75rem;margin-top:0;color:var(--blue-600);font-size:.95rem}.tva-table[data-v-7782ce9c]{display:flex;flex-direction:column;gap:.5rem;margin-bottom:1rem}.tva-row[data-v-7782ce9c]{display:flex;align-items:center;gap:1rem}.tva-row.total[data-v-7782ce9c]{margin-top:.5rem;padding-top:.5rem;border-top:1px dashed var(--blue-600)}.tva-label[data-v-7782ce9c]{min-width:150px;font-weight:500;color:var(--text-color)}.tva-input[data-v-7782ce9c]{max-width:150px}.tva-value[data-v-7782ce9c]{font-weight:600;color:var(--blue-600)}.supplier-warning[data-v-7782ce9c]{display:flex;align-items:center;gap:.25rem;margin-top:.25rem;color:var(--yellow-500)}.supplier-selected[data-v-7782ce9c]{display:flex;align-items:center;gap:.25rem;margin-top:.25rem;color:var(--green-500);font-weight:500}.field-hint[data-v-7782ce9c]{display:block;margin-top:.25rem;font-size:.8rem;color:var(--text-color-secondary)}.payment-methods-display[data-v-7782ce9c]{display:flex;gap:.5rem;flex-wrap:wrap}.dialog-content[data-v-7782ce9c]{display:flex;flex-direction:column;gap:.75rem}.dialog-content p[data-v-7782ce9c]{margin:0;line-height:1.6}.dialog-content p[data-v-7782ce9c]:first-child{display:flex;align-items:flex-start;gap:.5rem}.dialog-content .form-field[data-v-7782ce9c]{margin-bottom:.5rem}.dialog-content .form-field label[data-v-7782ce9c]{display:block;margin-bottom:.25rem;font-weight:500;color:var(--text-color)}.form-section[data-v-7782ce9c]{padding:.6rem 0;border-bottom:1px solid var(--surface-border)}.form-section[data-v-7782ce9c]:last-of-type{border-bottom:none}.form-section-title[data-v-7782ce9c]{font-size:.7rem;font-weight:600;color:var(--text-color-secondary);text-transform:uppercase;letter-spacing:.05em;margin-bottom:.5rem}.form-section-content[data-v-7782ce9c]{display:flex;flex-direction:column;gap:.5rem}.form-row[data-v-7782ce9c]{display:flex;gap:.75rem;align-items:flex-start;flex-wrap:wrap}.form-row .form-field[data-v-7782ce9c]{margin-bottom:0}.form-field.flex-1[data-v-7782ce9c]{flex:1;min-width:150px}.form-field.flex-2[data-v-7782ce9c]{flex:2;min-width:200px}.radio-group-inline[data-v-7782ce9c]{display:flex;gap:1rem;padding:.35rem 0}.radio-group-inline .radio-item[data-v-7782ce9c]{display:flex;align-items:center;gap:.35rem}.radio-group-inline .radio-item label[data-v-7782ce9c]{font-size:.9rem;margin-bottom:0}.direction-header[data-v-7782ce9c]{display:flex;align-items:center;gap:.5rem;margin-bottom:.35rem}.direction-header .field-label[data-v-7782ce9c]{font-size:.85rem;font-weight:500;color:var(--text-color-secondary)}.auto-tag[data-v-7782ce9c]{font-size:.65rem!important;padding:.15rem .4rem!important;cursor:help}.amount-input[data-v-7782ce9c]{max-width:150px}.payment-field-wrapper[data-v-7782ce9c]{display:flex;align-items:center;gap:.75rem}.payment-field-wrapper .p-dropdown[data-v-7782ce9c]{flex:1}.ocr-indicator[data-v-7782ce9c]{display:flex;align-items:center;gap:.25rem;font-size:.75rem;color:var(--green-500);font-weight:500;white-space:nowrap}.ocr-indicator .pi-check-circle[data-v-7782ce9c]{font-size:.85rem}.tva-edit-table[data-v-7782ce9c]{display:flex;flex-direction:column;gap:.35rem}.tva-edit-row[data-v-7782ce9c]{display:flex;align-items:center;gap:.75rem}.tva-label-compact[data-v-7782ce9c]{min-width:80px;font-size:.85rem;color:var(--text-color-secondary)}.tva-input-compact[data-v-7782ce9c]{max-width:120px}.tva-edit-row.tva-total-row[data-v-7782ce9c]{margin-top:.35rem;padding-top:.35rem;border-top:1px dashed var(--surface-border)}.tva-total-value[data-v-7782ce9c]{font-weight:600;color:var(--blue-600);font-size:.9rem}.payment-methods-display[data-v-7782ce9c]{display:flex;gap:.5rem;flex-wrap:wrap;margin-top:.35rem}.form-group[data-v-7782ce9c]{padding:.75rem 0;border-bottom:1px solid var(--surface-border)}.form-group[data-v-7782ce9c]:first-child{padding-top:0}.form-group-last[data-v-7782ce9c]{border-bottom:none;padding-bottom:0}.form-group>.form-row[data-v-7782ce9c]{margin-bottom:.6rem}.form-group>.form-row[data-v-7782ce9c]:last-child{margin-bottom:0}.address-collapsed[data-v-7782ce9c]{display:flex;align-items:center;gap:.4rem;padding:.3rem .5rem;margin-top:.4rem;background:var(--surface-ground);border-radius:4px;cursor:pointer;transition:background .15s}.address-collapsed[data-v-7782ce9c]:hover{background:var(--surface-hover)}.address-collapsed i[data-v-7782ce9c]{font-size:.7rem;color:var(--text-color-secondary)}.address-preview[data-v-7782ce9c]{font-size:.75rem;color:var(--text-color-secondary);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:300px}.address-expanded[data-v-7782ce9c]{margin-top:.4rem;padding:.4rem;background:var(--surface-ground);border-radius:4px}.address-expanded .p-inputtext[data-v-7782ce9c]{font-size:.85rem;width:100%}.document-row-inline[data-v-7782ce9c]{display:flex;gap:.5rem;flex-wrap:wrap;align-items:flex-end}.document-row-inline .form-field[data-v-7782ce9c]{flex:0 0 auto}.values-section[data-v-7782ce9c]{background:var(--surface-ground);border-radius:6px;padding:.5rem .75rem}.values-row-inline[data-v-7782ce9c]{display:grid;grid-template-columns:140px 120px 200px;column-gap:2rem;align-items:start}.value-item[data-v-7782ce9c]{display:flex;flex-direction:column;gap:.2rem;max-width:100%;overflow:hidden}.value-item-total[data-v-7782ce9c]{width:140px;max-width:140px}.payment-method-item[data-v-7782ce9c]{width:120px;max-width:120px}.value-item-payment[data-v-7782ce9c]{width:200px;max-width:200px}.value-item label[data-v-7782ce9c]{font-size:.75rem;font-weight:500;color:var(--text-color-secondary);text-transform:uppercase}.input-compact[data-v-7782ce9c]{width:100%!important;max-width:130px!important}.payment-method-value[data-v-7782ce9c]{display:inline-block;font-size:.95rem;font-weight:500;color:var(--text-color);background:var(--surface-ground);border:1px solid var(--surface-border);padding:.5rem .75rem;border-radius:6px;min-width:90px;text-align:right}.tva-compact[data-v-7782ce9c]{margin-top:.5rem;padding-top:.5rem;border-top:1px dashed var(--surface-border)}.tva-item[data-v-7782ce9c]{flex:0 0 auto}.input-tva[data-v-7782ce9c]{width:110px!important}.tva-total-item[data-v-7782ce9c]{padding-left:.5rem}.tva-total-value[data-v-7782ce9c]{display:inline-block;font-size:.95rem;font-weight:500;color:var(--text-color);background:var(--surface-ground);border:1px solid var(--surface-border);padding:.5rem .75rem;border-radius:6px;min-width:90px;text-align:right}.label-small[data-v-7782ce9c]{font-size:.8rem!important;color:var(--text-color-secondary)!important}.label-muted[data-v-7782ce9c]{color:var(--text-color-secondary)!important}.input-small[data-v-7782ce9c]{font-size:.85rem}.dropdown-compact[data-v-7782ce9c]{min-width:130px}.message-compact[data-v-7782ce9c]{padding:.35rem .5rem;font-size:.8rem}.payment-methods-inline[data-v-7782ce9c]{display:flex;gap:.35rem;flex-wrap:wrap;padding-top:.25rem}.payment-tags-field[data-v-7782ce9c]{display:flex;flex-direction:column}.tva-row-inline[data-v-7782ce9c]{display:flex;gap:.75rem;flex-wrap:wrap;align-items:flex-end;padding:.5rem 0;margin-top:.5rem;background:var(--surface-ground);border-radius:4px;padding:.5rem}.tva-field[data-v-7782ce9c]{flex:0 0 auto}.tva-input-inline[data-v-7782ce9c]{max-width:100px}.tva-total-field[data-v-7782ce9c]{display:flex;flex-direction:column;padding-left:.5rem}.tva-total-inline[data-v-7782ce9c]{font-weight:500;color:var(--text-color);font-size:.95rem;padding:.5rem 0}.optional-fields[data-v-7782ce9c]{background:var(--surface-ground);padding:.5rem;border-radius:4px;margin-top:.4rem}.items-count-field[data-v-7782ce9c]{flex:0 0 auto;max-width:80px}.items-count-input[data-v-7782ce9c]{max-width:70px}.direction-header[data-v-7782ce9c]{display:flex;align-items:center;gap:.5rem;margin-bottom:.25rem}.direction-header label[data-v-7782ce9c]{margin-bottom:0}@media (max-width: 768px){.form-row[data-v-7782ce9c]{flex-direction:column;gap:.75rem}.form-field.flex-2[data-v-7782ce9c],.form-field.flex-1[data-v-7782ce9c]{width:100%;min-width:unset}.document-row-inline[data-v-7782ce9c]{display:grid!important;grid-template-columns:1fr 1fr;gap:.5rem}.document-row-inline .form-field[data-v-7782ce9c]{width:100%}.values-row-inline[data-v-7782ce9c]{display:grid!important;grid-template-columns:1fr 1fr;gap:.5rem}.values-row-inline .value-item[data-v-7782ce9c]{min-width:unset}.values-row-inline.tva-compact[data-v-7782ce9c]{grid-template-columns:1fr 1fr}.optional-fields[data-v-7782ce9c]{flex-direction:row;flex-wrap:wrap}.optional-fields .form-field.flex-2[data-v-7782ce9c]{flex:2;min-width:180px}.optional-fields .items-count-field[data-v-7782ce9c]{flex:0 0 80px;min-width:80px}.action-buttons-top[data-v-7782ce9c]{position:static;width:100%;padding:1rem;background:var(--surface-ground);border-top:1px solid var(--surface-border);margin-top:1rem;display:flex;flex-direction:row;justify-content:flex-end;gap:.5rem}.action-buttons-top .p-button[data-v-7782ce9c]{padding:.5rem .75rem;font-size:.875rem}.floating-buttons-spacer[data-v-7782ce9c]{display:none}}.status-badge[data-v-7782ce9c]{display:inline-block;padding:.25rem .75rem;border-radius:12px;font-size:.85rem;font-weight:500;margin-top:.5rem}.status-draft[data-v-7782ce9c]{background:var(--surface-100);color:var(--text-color-secondary)}.status-pending[data-v-7782ce9c]{background:var(--yellow-100);color:var(--yellow-800)}.status-approved[data-v-7782ce9c]{background:var(--green-100);color:var(--green-800)}.status-rejected[data-v-7782ce9c]{background:var(--red-100);color:var(--red-800)}.status-synced[data-v-7782ce9c]{background:var(--blue-100);color:var(--blue-700)}.rejection-alert[data-v-7782ce9c]{display:flex;gap:1rem;padding:1rem;background:var(--orange-100);border-radius:8px;margin-bottom:1rem}.rejection-alert i[data-v-7782ce9c]{font-size:1.5rem;color:var(--orange-500)}.rejection-alert p[data-v-7782ce9c]{margin:.5rem 0}.rejection-alert small[data-v-7782ce9c]{color:#666}.attachments-grid[data-v-7782ce9c]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:1rem}.attachment-item[data-v-7782ce9c]{border-radius:8px;overflow:hidden;position:relative;border:1px solid var(--surface-border);background:var(--surface-ground)}.attachment-image[data-v-7782ce9c]{width:100%;aspect-ratio:1;object-fit:cover}.pdf-attachment[data-v-7782ce9c]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem 1rem;gap:.5rem}.pdf-attachment i[data-v-7782ce9c]{font-size:2.5rem;color:var(--red-600)}.pdf-attachment span[data-v-7782ce9c]{font-size:.85rem;color:var(--text-color-secondary);text-align:center;word-break:break-word}.attachment-item .download-btn[data-v-7782ce9c]{position:absolute;bottom:.5rem;right:.5rem}.attachment-actions[data-v-7782ce9c]{position:absolute;bottom:.5rem;right:.5rem;display:flex;gap:.35rem}.image-preview-grid[data-v-7782ce9c]{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:.75rem;margin-bottom:1rem}.image-preview-item[data-v-7782ce9c]{position:relative;border-radius:8px;overflow:hidden;border:1px solid var(--surface-border);background:var(--surface-ground)}.image-preview-item img[data-v-7782ce9c]{width:100%;aspect-ratio:1;object-fit:cover;display:block}.image-placeholder[data-v-7782ce9c]{width:100%;aspect-ratio:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;background:var(--surface-hover);color:var(--text-color-secondary);font-size:.75rem;text-align:center;padding:.5rem}.image-placeholder span[data-v-7782ce9c]{word-break:break-all;max-width:100%}.empty-state[data-v-7782ce9c]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2rem;color:var(--text-color-secondary);text-align:center}.empty-state i[data-v-7782ce9c]{font-size:2.5rem;margin-bottom:.75rem}.empty-state p[data-v-7782ce9c]{margin:0}.entries-section[data-v-7782ce9c]{margin-top:1.5rem;padding:1rem;background:var(--surface-ground);border-radius:8px}.entries-section h3[data-v-7782ce9c]{display:flex;align-items:center;gap:.5rem;margin:0 0 1rem;color:var(--text-color)}.entries-table-container[data-v-7782ce9c]{overflow-x:auto}.entries-table[data-v-7782ce9c]{width:100%;border-collapse:collapse;font-size:.9rem}.entries-table th[data-v-7782ce9c],.entries-table td[data-v-7782ce9c]{padding:.75rem;text-align:left;border-bottom:1px solid var(--surface-border)}.entries-table th[data-v-7782ce9c]{background:var(--surface-hover);font-weight:600;color:var(--text-color-secondary)}.entries-table tbody tr[data-v-7782ce9c]:hover{background:var(--surface-ground)}.entries-table .debit[data-v-7782ce9c]{color:var(--red-600)}.entries-table .credit[data-v-7782ce9c]{color:var(--green-600)}.entries-table tfoot td[data-v-7782ce9c]{border-bottom:none;padding-top:1rem}.balance-warning[data-v-7782ce9c]{display:flex;align-items:center;gap:.5rem;margin-top:1rem;padding:.75rem;background:var(--orange-100);border-radius:8px;color:var(--orange-500)}.dropdown-borderless.p-dropdown{border:none!important;background:transparent!important;box-shadow:none!important;min-height:44px!important;height:44px!important;padding:0!important}.dropdown-borderless.p-dropdown:hover,.dropdown-borderless.p-dropdown.p-focus{border:none!important;box-shadow:none!important}.dropdown-borderless .p-dropdown-label{padding:.6rem .75rem!important;line-height:1.4!important}.dropdown-borderless .p-dropdown-trigger{background:transparent!important;width:2.5rem!important} diff --git a/deploy-package-20260223-151231/frontend/assets/ReceiptsListView.5aCNCyjN.css b/deploy-package-20260223-151231/frontend/assets/ReceiptsListView.5aCNCyjN.css deleted file mode 100644 index f2dd380..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ReceiptsListView.5aCNCyjN.css +++ /dev/null @@ -1 +0,0 @@ -.drag-drop-overlay[data-v-2c3712d1]{position:fixed;top:0;right:0;bottom:0;left:0;z-index:9999;background:#000000b3;display:flex;align-items:center;justify-content:center;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}.overlay-content[data-v-2c3712d1]{display:flex;flex-direction:column;align-items:center;gap:var(--space-md);padding:var(--space-xl);background:var(--surface-card);border-radius:var(--radius-lg);border:3px dashed var(--primary-500);box-shadow:var(--shadow-xl);text-align:center;max-width:400px}.overlay-icon[data-v-2c3712d1]{font-size:4rem;color:var(--primary-500);animation:pulse-2c3712d1 1.5s ease-in-out infinite}@keyframes pulse-2c3712d1{0%,to{transform:scale(1);opacity:1}50%{transform:scale(1.1);opacity:.8}}.overlay-text[data-v-2c3712d1]{font-size:var(--text-xl);font-weight:var(--font-semibold);color:var(--text-color);margin:0}.overlay-hint[data-v-2c3712d1]{font-size:var(--text-sm);color:var(--text-color-secondary);margin:0}.fade-enter-active[data-v-2c3712d1],.fade-leave-active[data-v-2c3712d1]{transition:opacity var(--transition-fast)}.fade-enter-from[data-v-2c3712d1],.fade-leave-to[data-v-2c3712d1]{opacity:0}.mobile-selection-footer[data-v-9fdcc1b8]{position:fixed;bottom:0;left:0;right:0;background:var(--surface-card);border-top:1px solid var(--surface-border);padding:var(--space-md);display:flex;justify-content:center;align-items:center;z-index:var(--z-fixed);box-shadow:0 -2px 8px #0000001a}.selection-actions[data-v-9fdcc1b8]{display:flex;gap:var(--space-sm);width:100%;max-width:400px;justify-content:center}.selection-action-btn[data-v-9fdcc1b8]{flex:1;height:48px;font-size:var(--text-base);font-weight:var(--font-semibold);min-height:48px}.selection-actions:has(.selection-action-btn:only-child) .selection-action-btn[data-v-9fdcc1b8]{max-width:none}.slide-up-enter-active[data-v-9fdcc1b8],.slide-up-leave-active[data-v-9fdcc1b8]{transition:transform var(--transition-normal),opacity var(--transition-normal)}.slide-up-enter-from[data-v-9fdcc1b8],.slide-up-leave-to[data-v-9fdcc1b8]{transform:translateY(100%);opacity:0}.slide-up-enter-to[data-v-9fdcc1b8],.slide-up-leave-from[data-v-9fdcc1b8]{transform:translateY(0);opacity:1}[data-theme=dark] .mobile-selection-footer[data-v-9fdcc1b8]{background:var(--surface-card);border-top-color:var(--surface-border);box-shadow:0 -2px 8px #0000004d}@media (prefers-color-scheme: dark){:root:not([data-theme]) .mobile-selection-footer[data-v-9fdcc1b8]{background:var(--surface-card);border-top-color:var(--surface-border);box-shadow:0 -2px 8px #0000004d}}.batch-group-header[data-v-c767ad87]{display:flex;align-items:center;padding:var(--space-sm) var(--space-md);background:var(--surface-ground);border:1px solid var(--surface-border);border-radius:var(--radius-sm);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background var(--transition-fast),border-color var(--transition-fast);margin-bottom:var(--space-xs)}.batch-group-header[data-v-c767ad87]:hover{background:var(--surface-hover)}.batch-group-header.is-expanded[data-v-c767ad87]{border-bottom-left-radius:0;border-bottom-right-radius:0;margin-bottom:0;border-bottom-color:transparent}.batch-group-header.has-active-processing[data-v-c767ad87]{border-left:3px solid var(--blue-500)}.batch-header-content[data-v-c767ad87]{display:flex;align-items:center;gap:var(--space-sm);width:100%}.chevron-icon[data-v-c767ad87]{font-size:var(--text-sm);color:var(--text-color-secondary);transition:transform var(--transition-fast);flex-shrink:0}.batch-info[data-v-c767ad87]{display:flex;align-items:center;gap:var(--space-sm);flex:1;min-width:0;flex-wrap:wrap}.batch-label[data-v-c767ad87]{font-weight:var(--font-semibold);font-size:var(--text-sm);color:var(--text-color)}.batch-separator[data-v-c767ad87]{color:var(--text-color-secondary);font-size:var(--text-xs)}.batch-date[data-v-c767ad87],.batch-count[data-v-c767ad87]{font-size:var(--text-sm);color:var(--text-color-secondary)}.batch-status-indicator[data-v-c767ad87]{display:flex;align-items:center;gap:var(--space-xs);font-size:var(--text-xs);font-weight:var(--font-medium);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm);flex-shrink:0}.batch-status-indicator.processing[data-v-c767ad87]{background:var(--blue-50);color:var(--blue-600)}.batch-status-indicator.failed[data-v-c767ad87]{background:var(--red-50);color:var(--red-600)}.batch-status-indicator.completed[data-v-c767ad87]{background:var(--green-50);color:var(--green-600)}.retry-all-btn[data-v-c767ad87]{display:inline-flex;align-items:center;gap:var(--space-xs);margin-left:var(--space-sm);padding:var(--space-xs) var(--space-sm);background:var(--surface-card);border:1px solid var(--red-300);border-radius:var(--radius-sm);color:var(--red-700);font-size:var(--text-xs);font-weight:var(--font-medium);cursor:pointer;transition:all var(--transition-fast)}.retry-all-btn[data-v-c767ad87]:hover{background:var(--red-100);border-color:var(--red-400)}.retry-all-btn[data-v-c767ad87]:active{transform:scale(.98)}.retry-loading[data-v-c767ad87]{margin-left:var(--space-sm)}.cancel-all-btn[data-v-c767ad87]{display:inline-flex;align-items:center;gap:var(--space-xs);margin-left:var(--space-sm);padding:var(--space-xs) var(--space-sm);background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-sm);color:var(--text-color-secondary);font-size:var(--text-xs);font-weight:var(--font-medium);cursor:pointer;transition:all var(--transition-fast)}.cancel-all-btn[data-v-c767ad87]:hover{background:var(--red-50);border-color:var(--red-300);color:var(--red-700)}.cancel-all-btn[data-v-c767ad87]:active{transform:scale(.98)}@media (max-width: 768px){.batch-group-header[data-v-c767ad87]{padding:var(--space-sm)}.batch-info[data-v-c767ad87]{gap:var(--space-xs)}.batch-separator[data-v-c767ad87]{display:none}.batch-date[data-v-c767ad87],.batch-count[data-v-c767ad87]{font-size:var(--text-xs)}.batch-status-indicator[data-v-c767ad87]{padding:var(--space-xs)}.batch-status-indicator span[data-v-c767ad87],.retry-all-btn .retry-btn-text[data-v-c767ad87]{display:none}.retry-all-btn[data-v-c767ad87]{padding:var(--space-xs);margin-left:var(--space-xs)}.cancel-all-btn .cancel-btn-text[data-v-c767ad87]{display:none}.cancel-all-btn[data-v-c767ad87]{padding:var(--space-xs);margin-left:var(--space-xs)}}.processing-status-cell[data-v-662c9f39]{display:flex;align-items:center}.processing-status-dash[data-v-662c9f39]{color:var(--text-color-secondary);font-size:var(--text-sm)}.processing-status[data-v-662c9f39]{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm);font-size:var(--text-xs);font-weight:var(--font-medium);white-space:nowrap;transition:opacity .3s ease,background-color .3s ease,color .3s ease}@media (prefers-reduced-motion: reduce){.processing-status[data-v-662c9f39]{transition:none}}.processing-pending[data-v-662c9f39]{background:var(--surface-hover);color:var(--text-color-secondary)}.processing-active[data-v-662c9f39]{background:var(--blue-50);color:var(--blue-600);border:1px solid var(--blue-500)}.processing-active .pi-spinner[data-v-662c9f39]{font-size:var(--text-xs)}.processing-success[data-v-662c9f39]{background:var(--green-50);color:var(--green-600)}.processing-failed[data-v-662c9f39]{background:var(--red-50);color:var(--red-600);border:1px solid var(--red-500);cursor:pointer;transition:background var(--transition-fast)}.processing-failed[data-v-662c9f39]:hover{background:var(--red-100)}.processing-failed-container[data-v-662c9f39]{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-xs)}.processing-error-message[data-v-662c9f39]{font-size:var(--text-xs);color:var(--red-600);max-width:200px;line-height:var(--leading-tight);cursor:help;word-break:break-word}.status-actions-row[data-v-46f1602b]{display:flex;align-items:center;justify-content:space-between;gap:var(--space-md);flex-wrap:wrap;margin-bottom:var(--space-sm);padding-bottom:var(--space-xs)}.status-chips[data-v-46f1602b]{display:flex;align-items:center;gap:.5rem;flex-wrap:wrap;flex:1}.status-chip[data-v-46f1602b]{display:inline-flex;align-items:center;gap:.25rem;padding:.25rem .5rem;border-radius:4px;font-size:.8rem;color:var(--text-color-secondary);cursor:pointer;transition:all .15s ease;white-space:nowrap;border:2px solid transparent}.status-chip[data-v-46f1602b]:hover{background:var(--surface-hover)}.status-chip.active[data-v-46f1602b]{background:var(--surface-200);color:var(--text-color);font-weight:600;position:relative}.status-chip.active[data-v-46f1602b]:after{content:"";position:absolute;bottom:-4px;left:0;right:0;height:3px;background:var(--text-color);border-radius:2px}.status-chip.status-draft.active[data-v-46f1602b]{background:var(--blue-100);color:var(--blue-700)}.status-chip.status-draft.active[data-v-46f1602b]:after{background:var(--blue-700)}.status-chip.status-pending.active[data-v-46f1602b]{background:var(--yellow-100);color:var(--yellow-700)}.status-chip.status-pending.active[data-v-46f1602b]:after{background:var(--yellow-600)}.status-chip.status-approved.active[data-v-46f1602b]{background:var(--green-100);color:var(--green-700)}.status-chip.status-approved.active[data-v-46f1602b]:after{background:var(--green-600)}.status-chip.status-rejected.active[data-v-46f1602b]{background:var(--red-100);color:var(--red-700)}.status-chip.status-rejected.active[data-v-46f1602b]:after{background:var(--red-600)}.filters-row[data-v-46f1602b]{display:flex;gap:var(--space-sm);align-items:center;flex-wrap:wrap;margin-bottom:var(--space-sm);padding-bottom:var(--space-sm);border-bottom:1px solid var(--surface-border)}.filter-search[data-v-46f1602b]{flex:1 1 200px;min-width:200px}.filter-date[data-v-46f1602b]{width:130px}.filter-direction[data-v-46f1602b]{width:110px}.filter-status[data-v-46f1602b]{width:140px}.filter-actions[data-v-46f1602b]{display:flex;gap:.5rem;margin-left:auto}.header-actions-bar[data-v-46f1602b]{display:flex;gap:var(--space-xs);margin-left:auto;align-items:center}.header-actions-bar .p-button[data-v-46f1602b]{min-width:auto;padding:var(--space-sm)}.header-actions-bar .filter-active[data-v-46f1602b]{background:var(--color-primary);border-color:var(--color-primary);color:var(--surface-ground)}.header-actions-bar .filter-active[data-v-46f1602b]:hover{background:var(--color-primary-dark);border-color:var(--color-primary-dark)}.compact-table .button-group[data-v-46f1602b]{display:flex;flex-wrap:nowrap;gap:.25rem}.receipt-cards[data-v-46f1602b]{display:flex;flex-direction:column;gap:.625rem}.receipt-card[data-v-46f1602b]{background:var(--surface-card);border-radius:var(--radius-md);padding:var(--space-sm) var(--space-md);box-shadow:var(--shadow-sm);cursor:pointer;border:1px solid var(--surface-border);transition:all var(--transition-fast);position:relative}.receipt-card[data-v-46f1602b]:active{background:var(--surface-ground);transform:scale(.99);box-shadow:0 1px 2px #00000014}.mobile-selection-header[data-v-46f1602b]{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);background:var(--blue-50);border-radius:var(--radius-md);margin-bottom:var(--space-sm);border:1px solid var(--blue-200)}.selection-header-left[data-v-46f1602b]{display:flex;align-items:center;gap:var(--space-sm)}.selection-header-left .exit-selection-btn[data-v-46f1602b]{color:var(--blue-700)}.selection-header-left .selection-count[data-v-46f1602b]{font-weight:var(--font-semibold);color:var(--blue-700);font-size:var(--text-sm)}.selection-header-right[data-v-46f1602b]{display:flex;align-items:center;gap:var(--space-xs)}.receipt-card.card-selected[data-v-46f1602b]{background:var(--blue-50);border-color:var(--blue-500)}.receipt-card.card-selected[data-v-46f1602b]:active{background:var(--blue-100)}.selection-checkmark[data-v-46f1602b]{position:absolute;top:var(--space-sm);right:var(--space-sm);width:24px;height:24px;background:var(--blue-500);border-radius:var(--radius-full);display:flex;align-items:center;justify-content:center;color:#fff;font-size:var(--text-xs);z-index:1}[data-theme=dark] .mobile-selection-header[data-v-46f1602b]{background:var(--blue-900);border-color:var(--blue-700)}[data-theme=dark] .selection-header-left .exit-selection-btn[data-v-46f1602b],[data-theme=dark] .selection-header-left .selection-count[data-v-46f1602b]{color:var(--blue-300)}[data-theme=dark] .receipt-card.card-selected[data-v-46f1602b]{background:var(--blue-900);border-color:var(--blue-400)}[data-theme=dark] .receipt-card.card-selected[data-v-46f1602b]:active{background:var(--blue-800)}[data-theme=dark] .selection-checkmark[data-v-46f1602b]{background:var(--blue-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .mobile-selection-header[data-v-46f1602b]{background:var(--blue-900);border-color:var(--blue-700)}:root:not([data-theme]) .selection-header-left .exit-selection-btn[data-v-46f1602b],:root:not([data-theme]) .selection-header-left .selection-count[data-v-46f1602b]{color:var(--blue-300)}:root:not([data-theme]) .receipt-card.card-selected[data-v-46f1602b]{background:var(--blue-900);border-color:var(--blue-400)}:root:not([data-theme]) .receipt-card.card-selected[data-v-46f1602b]:active{background:var(--blue-800)}:root:not([data-theme]) .selection-checkmark[data-v-46f1602b]{background:var(--blue-400)}}.card-row-1[data-v-46f1602b]{display:flex;align-items:center;gap:.5rem;margin-bottom:.25rem}.card-row-1 .partner-info[data-v-46f1602b]{flex:1;min-width:0;display:flex;flex-direction:column;gap:.125rem}.card-row-1 .partner[data-v-46f1602b]{font-weight:600;font-size:.875rem;color:var(--text-color);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.card-row-1 .cui[data-v-46f1602b]{font-size:.7rem;color:var(--text-color-secondary)}.card-row-1 .amount-block[data-v-46f1602b]{display:flex;flex-direction:column;align-items:flex-end;gap:.125rem}.card-row-1 .amount[data-v-46f1602b]{font-weight:700;font-size:.875rem;color:var(--text-color)}.card-row-1 .amount-detail[data-v-46f1602b]{font-size:.875rem;font-weight:400;color:var(--text-color-secondary)}.card-row-1 .amount-detail.tva[data-v-46f1602b]{color:var(--green-600)}.card-row-1 .amount-detail.payment[data-v-46f1602b]{color:var(--purple-600)}.card-row-2[data-v-46f1602b]{display:flex;align-items:center;gap:.375rem;font-size:.75rem;color:var(--text-color-secondary);flex-wrap:wrap}.card-row-2 .sep[data-v-46f1602b]{color:var(--surface-border)}.card-row-2 .receipt-nr[data-v-46f1602b]{font-weight:500}.card-row-2 .direction-out[data-v-46f1602b]{color:var(--red-600);font-weight:500}.card-row-2 .direction-in[data-v-46f1602b]{color:var(--green-600);font-weight:500}.card-row-3[data-v-46f1602b]{display:flex;align-items:center;gap:.375rem;font-size:.7rem;color:var(--text-color-secondary);margin-top:.25rem}.card-row-3 .sep[data-v-46f1602b]{color:var(--surface-border)}.card-row-3 .created-by[data-v-46f1602b]{font-weight:500}.card-row-3 .attachments[data-v-46f1602b]{margin-left:auto;display:flex;align-items:center;gap:.125rem;color:var(--text-color-secondary)}.status-badge-small[data-v-46f1602b]{padding:.125rem .375rem;border-radius:3px;font-size:.65rem;font-weight:600;text-transform:uppercase}.status-badge-small.status-draft[data-v-46f1602b]{background-color:var(--blue-100);color:var(--blue-600)}.status-badge-small.status-pending[data-v-46f1602b]{background-color:var(--orange-100);color:var(--orange-600)}.status-badge-small.status-approved[data-v-46f1602b]{background-color:var(--green-100);color:var(--green-600)}.status-badge-small.status-rejected[data-v-46f1602b]{background-color:var(--red-100);color:var(--red-600)}.status-badge-small.status-synced[data-v-46f1602b]{background-color:var(--teal-100);color:var(--teal-600)}.status-text-draft[data-v-46f1602b]{color:var(--blue-600)}.status-text-pending_review[data-v-46f1602b]{color:var(--orange-600)}.status-text-approved[data-v-46f1602b]{color:var(--green-600)}.status-text-rejected[data-v-46f1602b]{color:var(--red-600)}.status-text-synced[data-v-46f1602b]{color:var(--teal-600)}.mobile-pagination[data-v-46f1602b]{display:flex;justify-content:center;align-items:center;gap:1rem;padding:1rem 0 .5rem;margin-top:.5rem}.page-info[data-v-46f1602b]{font-size:.875rem;font-weight:500;color:var(--text-color-secondary);min-width:60px;text-align:center}.mobile-toolbar-container[data-v-46f1602b]{margin-bottom:1rem}.mobile-toolbar-buttons[data-v-46f1602b]{display:flex;gap:.5rem;align-items:stretch}.mobile-toolbar-buttons .p-button-outlined[data-v-46f1602b]{flex:1;min-width:0;justify-content:center}.mobile-toolbar-buttons .p-button-success[data-v-46f1602b]{flex:1.2;min-width:0;justify-content:center;font-weight:600}.filter-active[data-v-46f1602b]{border-color:var(--primary-color, #2563eb)!important;background:#2563eb0d!important;color:var(--primary-color, #2563eb)!important}.status-actions-row .p-button.p-button-success[data-v-46f1602b]{background:var(--green-600, #16a34a)!important;border-color:var(--green-600, #16a34a)!important;color:#fff!important}.status-actions-row .p-button.p-button-success[data-v-46f1602b]:hover{background:var(--green-700, #15803d)!important;border-color:var(--green-700, #15803d)!important}@media (max-width: 768px){.receipts-list-view[data-v-46f1602b]{padding:.75rem}.status-actions-row[data-v-46f1602b]{gap:.75rem;justify-content:center}.status-chips[data-v-46f1602b]{width:100%;gap:.25rem;justify-content:center}.status-actions-row .p-button[data-v-46f1602b]{flex:0 0 auto;min-width:140px}.status-chip[data-v-46f1602b]{font-size:.75rem;padding:.2rem .4rem}.filters-row[data-v-46f1602b]{display:grid;grid-template-columns:1fr 1fr;gap:.5rem;padding-bottom:.5rem}.filters-row .filter-search[data-v-46f1602b]{grid-column:1 / -1}.filters-row .filter-status[data-v-46f1602b]{grid-column:1 / -1;width:100%!important}.filter-direction[data-v-46f1602b],.filter-date[data-v-46f1602b]{width:100%!important;min-width:unset!important}.filter-actions[data-v-46f1602b]{display:none}}.reject-dialog-content[data-v-46f1602b]{display:flex;flex-direction:column;gap:.5rem}.reject-dialog-content p[data-v-46f1602b]{margin:0;color:var(--text-color-secondary)}.text-muted[data-v-46f1602b]{color:var(--text-color-secondary)}.bulk-actions-bar[data-v-46f1602b]{display:flex;align-items:center;justify-content:space-between;padding:.75rem 1rem;background:linear-gradient(135deg,var(--blue-50) 0%,var(--blue-100) 100%);border:1px solid var(--blue-200);border-radius:6px;margin-bottom:.75rem}.selection-info[data-v-46f1602b]{display:flex;align-items:center;gap:.5rem;font-weight:600;color:var(--blue-700)}.selection-info i[data-v-46f1602b]{font-size:1.1rem}.bulk-buttons[data-v-46f1602b]{display:flex;gap:.5rem}@media (max-width: 768px){.bulk-actions-bar[data-v-46f1602b]{flex-direction:column;gap:.75rem;align-items:stretch}.bulk-buttons[data-v-46f1602b]{justify-content:flex-end}}.batch-groups-container[data-v-46f1602b]{display:flex;flex-direction:column;gap:var(--space-sm)}.batch-group[data-v-46f1602b]{border-radius:var(--radius-md);overflow:hidden}.batch-group-content[data-v-46f1602b]{border:1px solid var(--surface-border);border-top:none;border-bottom-left-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md);background:var(--surface-card)}.batch-group-content .grouped-table[data-v-46f1602b]{border-radius:0}.grouped-pagination[data-v-46f1602b]{display:flex;justify-content:center;padding:var(--space-md) 0;margin-top:var(--space-sm);border-top:1px solid var(--surface-border)}@media (max-width: 768px){.batch-groups-container[data-v-46f1602b]{gap:var(--space-xs)}.batch-group-content[data-v-46f1602b]{overflow-x:auto}}.status-chip.processing-chip-in-progress[data-v-46f1602b]{background:var(--blue-100);color:var(--blue-700)}.status-chip.processing-chip-in-progress[data-v-46f1602b]:hover{background:var(--blue-200)}.status-chip.processing-chip-in-progress.active[data-v-46f1602b]{background:var(--blue-100);color:var(--blue-700);font-weight:var(--font-semibold)}.status-chip.processing-chip-in-progress.active[data-v-46f1602b]:after{background:var(--blue-700)}.status-chip.processing-chip-failed[data-v-46f1602b]{background:var(--red-100);color:var(--red-700)}.status-chip.processing-chip-failed[data-v-46f1602b]:hover{background:var(--red-200)}.status-chip.processing-chip-failed.active[data-v-46f1602b]{background:var(--red-100);color:var(--red-700);font-weight:var(--font-semibold)}.status-chip.processing-chip-failed.active[data-v-46f1602b]:after{background:var(--red-700)}.hidden-file-input[data-v-46f1602b]{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.desktop-action-buttons[data-v-46f1602b]{display:flex;gap:var(--space-sm);align-items:center}.mobile-toolbar-container[data-v-46f1602b]{display:flex;flex-direction:column;gap:var(--space-sm);margin-bottom:var(--space-md)}.mobile-toolbar-actions[data-v-46f1602b]{justify-content:flex-end}.receipt-card.card-processing[data-v-46f1602b]{opacity:.85;background:linear-gradient(135deg,var(--surface-card) 0%,var(--blue-50) 100%);border-color:var(--blue-200)}.processing-badge[data-v-46f1602b]{display:inline-flex;align-items:center;gap:.25rem;padding:.125rem .375rem;border-radius:3px;font-size:.65rem;font-weight:var(--font-semibold);white-space:nowrap}.processing-badge.processing-active[data-v-46f1602b]{background:var(--blue-100);color:var(--blue-700)}.processing-badge.processing-failed[data-v-46f1602b]{background:var(--red-100);color:var(--red-700);cursor:help}.batch-badge[data-v-46f1602b]{display:inline-flex;align-items:center;gap:.125rem;padding:.125rem .375rem;border-radius:3px;font-size:.65rem;font-weight:var(--font-medium);background:var(--surface-200);color:var(--text-color-secondary);white-space:nowrap}.batch-badge i[data-v-46f1602b]{font-size:.6rem}.retry-btn-mobile[data-v-46f1602b]{margin-left:auto;flex-shrink:0}.card-row-3[data-v-46f1602b]{flex-wrap:wrap;row-gap:.25rem}[data-theme=dark] .receipt-card.card-processing[data-v-46f1602b]{background:linear-gradient(135deg,var(--surface-card) 0%,var(--blue-900) 100%);border-color:var(--blue-700)}[data-theme=dark] .processing-badge.processing-active[data-v-46f1602b]{background:var(--blue-900);color:var(--blue-300)}[data-theme=dark] .processing-badge.processing-failed[data-v-46f1602b]{background:var(--red-900);color:var(--red-300)}[data-theme=dark] .batch-badge[data-v-46f1602b]{background:var(--surface-700);color:var(--text-color-secondary)}.job-filename[data-v-46f1602b]{display:inline-flex;align-items:center;gap:var(--space-xs);font-size:var(--text-sm);color:var(--text-color);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.job-filename i[data-v-46f1602b]{color:var(--text-color-secondary);flex-shrink:0}.job-processing-indicator[data-v-46f1602b]{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;color:var(--blue-500)}.job-processing-indicator .pi-spinner[data-v-46f1602b]{font-size:var(--text-base)}[data-theme=dark] .job-filename[data-v-46f1602b]{color:var(--text-color)}[data-theme=dark] .job-filename i[data-v-46f1602b]{color:var(--text-color-secondary)}[data-theme=dark] .job-processing-indicator[data-v-46f1602b]{color:var(--blue-400)}.receipt-card.card-job[data-v-46f1602b]{cursor:default;opacity:.9}.job-filename-mobile[data-v-46f1602b]{display:flex;align-items:center;gap:var(--space-xs);color:var(--text-color);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.job-filename-mobile i[data-v-46f1602b]{color:var(--text-color-secondary);flex-shrink:0}.job-processing-indicator-mobile[data-v-46f1602b]{display:flex;align-items:center;justify-content:center;width:32px;height:32px;color:var(--blue-500)}[data-theme=dark] .receipt-card.card-job[data-v-46f1602b]{background:linear-gradient(135deg,var(--surface-card) 0%,var(--blue-900) 100%);border-color:var(--blue-700)}[data-theme=dark] .job-filename-mobile[data-v-46f1602b]{color:var(--text-color)}[data-theme=dark] .job-processing-indicator-mobile[data-v-46f1602b]{color:var(--blue-400)}.job-failed-indicator-mobile[data-v-46f1602b]{display:flex;align-items:center;justify-content:center;width:32px;height:32px;color:var(--red-500)}.job-failed-indicator-mobile .pi-exclamation-triangle[data-v-46f1602b]{font-size:var(--text-lg)}.text-error[data-v-46f1602b]{color:var(--red-600)}.job-error-message[data-v-46f1602b]{font-size:var(--text-xs);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;cursor:help}[data-theme=dark] .job-failed-indicator-mobile[data-v-46f1602b],[data-theme=dark] .text-error[data-v-46f1602b]{color:var(--red-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .job-failed-indicator-mobile[data-v-46f1602b]{color:var(--red-400)}:root:not([data-theme]) .text-error[data-v-46f1602b]{color:var(--red-400)}}.job-failed-indicator[data-v-46f1602b]{display:inline-flex;align-items:center;justify-content:center;width:32px;height:32px;color:var(--red-500);cursor:help}.job-failed-indicator .pi-exclamation-triangle[data-v-46f1602b]{font-size:var(--text-base)}[data-theme=dark] .job-failed-indicator[data-v-46f1602b]{color:var(--red-400)}.receipt-filename[data-v-46f1602b]{display:inline-flex;align-items:center;gap:var(--space-xs);font-size:var(--text-sm);color:var(--text-color);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.receipt-filename i[data-v-46f1602b]{color:var(--text-color-secondary);flex-shrink:0}.filename-mobile[data-v-46f1602b]{display:flex;align-items:center;gap:var(--space-xs);font-size:var(--text-xs);color:var(--text-color-secondary);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;margin-top:var(--space-xs)}.filename-mobile i[data-v-46f1602b]{font-size:.65rem;flex-shrink:0}[data-theme=dark] .receipt-filename[data-v-46f1602b]{color:var(--text-color)}[data-theme=dark] .receipt-filename i[data-v-46f1602b],[data-theme=dark] .filename-mobile[data-v-46f1602b]{color:var(--text-color-secondary)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .receipt-filename[data-v-46f1602b]{color:var(--text-color)}:root:not([data-theme]) .receipt-filename i[data-v-46f1602b]{color:var(--text-color-secondary)}:root:not([data-theme]) .filename-mobile[data-v-46f1602b]{color:var(--text-color-secondary)}}.receipt-card.card-failed[data-v-46f1602b]{border-left:3px solid var(--red-500);background:linear-gradient(135deg,var(--surface-card) 0%,var(--red-50) 100%);border-color:var(--red-200)}.receipt-card.card-failed[data-v-46f1602b]:hover{background:linear-gradient(135deg,var(--surface-hover) 0%,var(--red-100) 100%)}[data-theme=dark] .receipt-card.card-failed[data-v-46f1602b]{background:linear-gradient(135deg,var(--surface-card) 0%,var(--red-900) 100%);border-color:var(--red-700)}[data-theme=dark] .receipt-card.card-failed[data-v-46f1602b]:hover{background:linear-gradient(135deg,var(--surface-hover) 0%,var(--red-800) 100%)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .receipt-card.card-failed[data-v-46f1602b]{background:linear-gradient(135deg,var(--surface-card) 0%,var(--red-900) 100%);border-color:var(--red-700)}:root:not([data-theme]) .receipt-card.card-failed[data-v-46f1602b]:hover{background:linear-gradient(135deg,var(--surface-hover) 0%,var(--red-800) 100%)}}.edit-btn-mobile[data-v-46f1602b]{flex-shrink:0}@keyframes cardHighlightGreen-46f1602b{0%{background-color:var(--green-100);border-color:var(--green-300)}to{background-color:var(--surface-card);border-color:var(--surface-border)}}@keyframes cardHighlightRed-46f1602b{0%{background-color:var(--red-100);border-color:var(--red-300)}to{background-color:var(--surface-card);border-color:var(--surface-border)}}.receipt-card.card-highlight-completed[data-v-46f1602b]{animation:cardHighlightGreen-46f1602b 2s ease-out forwards}.receipt-card.card-highlight-failed[data-v-46f1602b]{animation:cardHighlightRed-46f1602b 2s ease-out forwards}@keyframes cardHighlightGreenDark-46f1602b{0%{background-color:color-mix(in srgb,var(--green-500) 25%,var(--surface-card));border-color:var(--green-700)}to{background-color:var(--surface-card);border-color:var(--surface-border)}}@keyframes cardHighlightRedDark-46f1602b{0%{background-color:color-mix(in srgb,var(--red-500) 25%,var(--surface-card));border-color:var(--red-700)}to{background-color:var(--surface-card);border-color:var(--surface-border)}}[data-theme=dark] .receipt-card.card-highlight-completed[data-v-46f1602b]{animation-name:cardHighlightGreenDark-46f1602b}[data-theme=dark] .receipt-card.card-highlight-failed[data-v-46f1602b]{animation-name:cardHighlightRedDark-46f1602b}@media (prefers-color-scheme: dark){:root:not([data-theme]) .receipt-card.card-highlight-completed[data-v-46f1602b]{animation-name:cardHighlightGreenDark-46f1602b}:root:not([data-theme]) .receipt-card.card-highlight-failed[data-v-46f1602b]{animation-name:cardHighlightRedDark-46f1602b}}@media (prefers-reduced-motion: reduce){.receipt-card.card-highlight-completed[data-v-46f1602b],.receipt-card.card-highlight-failed[data-v-46f1602b]{animation:none}}.cancel-job-btn[data-v-46f1602b]{width:28px!important;height:28px!important;padding:0!important}.cancel-job-btn[data-v-46f1602b]:hover{background:var(--red-50)!important}[data-theme=dark] .cancel-job-btn[data-v-46f1602b]:hover{background:var(--red-900)!important}@media (prefers-color-scheme: dark){:root:not([data-theme]) .cancel-job-btn[data-v-46f1602b]:hover{background:var(--red-900)!important}}.receipts-list-view.mobile-android-layout[data-v-46f1602b]{padding-top:calc(56px + var(--space-sm));padding-bottom:calc(56px + var(--space-sm));min-height:100vh}.receipts-list-view.mobile-android-layout .roa-card[data-v-46f1602b]{border-radius:0;box-shadow:none;margin:0;padding:var(--space-sm)}.mobile-filter-chips-container[data-v-46f1602b]{position:fixed;top:56px;left:0;right:0;background:var(--surface-card);border-bottom:1px solid var(--surface-border);z-index:999;padding:var(--space-sm) 0}.mobile-filter-chips[data-v-46f1602b]{display:flex;gap:var(--space-sm);padding:0 var(--space-md);overflow-x:auto;scrollbar-width:none;-webkit-overflow-scrolling:touch}.mobile-filter-chips[data-v-46f1602b]::-webkit-scrollbar{display:none}.mobile-filter-chip[data-v-46f1602b]{display:inline-flex;align-items:center;gap:var(--space-xs);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-full);font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--text-color-secondary);background:var(--surface-100);border:1px solid var(--surface-border);cursor:pointer;white-space:nowrap;transition:all var(--transition-fast);min-height:32px}.mobile-filter-chip[data-v-46f1602b]:active{transform:scale(.95)}.mobile-filter-chip.active[data-v-46f1602b]{background:var(--color-primary);color:var(--color-text-inverse);border-color:var(--color-primary)}.mobile-filter-chip .chip-badge[data-v-46f1602b]{margin-left:var(--space-xs)}.mobile-filter-chip.chip-draft.active[data-v-46f1602b]{background:var(--blue-600);border-color:var(--blue-600)}.mobile-filter-chip.chip-pending.active[data-v-46f1602b]{background:var(--yellow-600);border-color:var(--yellow-600)}.mobile-filter-chip.chip-approved.active[data-v-46f1602b]{background:var(--green-600);border-color:var(--green-600)}.mobile-filter-chip.chip-rejected.active[data-v-46f1602b]{background:var(--red-600);border-color:var(--red-600)}.mobile-filter-chip.chip-processing[data-v-46f1602b]{background:var(--blue-100);color:var(--blue-700);border-color:var(--blue-200)}.mobile-filter-chip.chip-processing.active[data-v-46f1602b]{background:var(--blue-600);color:#fff;border-color:var(--blue-600)}.mobile-filter-chip.chip-failed[data-v-46f1602b]{background:var(--red-100);color:var(--red-700);border-color:var(--red-200)}.mobile-filter-chip.chip-failed.active[data-v-46f1602b]{background:var(--red-600);color:#fff;border-color:var(--red-600)}.mobile-filter-chip i[data-v-46f1602b]{font-size:var(--text-xs)}.mobile-sidebar[data-v-46f1602b]{width:280px!important}.sidebar-header[data-v-46f1602b]{padding:var(--space-md);border-bottom:1px solid var(--surface-border)}.sidebar-title[data-v-46f1602b]{font-size:var(--text-xl);font-weight:var(--font-bold);color:var(--color-primary)}.sidebar-menu[data-v-46f1602b]{display:flex;flex-direction:column;padding:var(--space-sm) 0}.sidebar-item[data-v-46f1602b]{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-md) var(--space-lg);color:var(--text-color);text-decoration:none;font-size:var(--text-base);font-weight:var(--font-medium);transition:background var(--transition-fast)}.sidebar-item[data-v-46f1602b]:hover,.sidebar-item[data-v-46f1602b]:active{background:var(--surface-hover)}.sidebar-item.active[data-v-46f1602b],.sidebar-item.router-link-active[data-v-46f1602b]{color:var(--color-primary);background:var(--blue-50)}.sidebar-item i[data-v-46f1602b]{font-size:var(--text-xl);width:24px;text-align:center}.receipts-list-view.mobile-android-layout .mobile-filter-chips-container+.roa-card[data-v-46f1602b],.receipts-list-view.mobile-android-layout:has(.mobile-filter-chips-container) .roa-card[data-v-46f1602b]{margin-top:48px}.receipts-list-view.mobile-android-layout .mobile-toolbar-container[data-v-46f1602b]{display:none}.receipts-list-view.mobile-android-layout .receipt-cards[data-v-46f1602b]{padding-bottom:80px}[data-theme=dark] .mobile-filter-chips-container[data-v-46f1602b]{background:var(--surface-card);border-bottom-color:var(--surface-border)}[data-theme=dark] .mobile-filter-chip[data-v-46f1602b]{background:var(--surface-700);border-color:var(--surface-border);color:var(--text-color-secondary)}[data-theme=dark] .mobile-filter-chip.active[data-v-46f1602b]{background:var(--blue-600);border-color:var(--blue-600);color:#fff}[data-theme=dark] .mobile-filter-chip.chip-processing[data-v-46f1602b]{background:var(--blue-900);color:var(--blue-300);border-color:var(--blue-700)}[data-theme=dark] .mobile-filter-chip.chip-failed[data-v-46f1602b]{background:var(--red-900);color:var(--red-300);border-color:var(--red-700)}[data-theme=dark] .sidebar-item.active[data-v-46f1602b],[data-theme=dark] .sidebar-item.router-link-active[data-v-46f1602b]{color:var(--blue-400);background:var(--blue-900)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .mobile-filter-chips-container[data-v-46f1602b]{background:var(--surface-card);border-bottom-color:var(--surface-border)}:root:not([data-theme]) .mobile-filter-chip[data-v-46f1602b]{background:var(--surface-700);border-color:var(--surface-border);color:var(--text-color-secondary)}:root:not([data-theme]) .mobile-filter-chip.active[data-v-46f1602b]{background:var(--blue-600);border-color:var(--blue-600);color:#fff}:root:not([data-theme]) .mobile-filter-chip.chip-processing[data-v-46f1602b]{background:var(--blue-900);color:var(--blue-300);border-color:var(--blue-700)}:root:not([data-theme]) .mobile-filter-chip.chip-failed[data-v-46f1602b]{background:var(--red-900);color:var(--red-300);border-color:var(--red-700)}:root:not([data-theme]) .sidebar-item.active[data-v-46f1602b],:root:not([data-theme]) .sidebar-item.router-link-active[data-v-46f1602b]{color:var(--blue-400);background:var(--blue-900)}}.receipts-list-view.mobile-android-layout[data-v-46f1602b]:has(.mobile-filter-chips-container){padding-top:calc(56px + 48px + var(--space-sm))}.bottom-sheet-title[data-v-46f1602b]{font-size:var(--text-lg);font-weight:var(--font-semibold);color:var(--text-color);margin:0 0 var(--space-md) 0}.bottom-sheet-filters[data-v-46f1602b]{display:flex;flex-direction:column;gap:var(--space-md)}.bottom-sheet-actions[data-v-46f1602b]{display:flex;gap:var(--space-sm);justify-content:flex-end;margin-top:var(--space-md);padding-top:var(--space-md);border-top:1px solid var(--surface-border)}.mobile-speed-dial{position:fixed!important;bottom:72px!important;right:var(--space-md)!important;z-index:999!important}.mobile-speed-dial .p-speeddial-button{width:56px!important;height:56px!important;border-radius:50%!important;background:var(--color-primary)!important;border:none!important;box-shadow:var(--shadow-lg)!important;transition:all var(--transition-fast)!important}.mobile-speed-dial .p-speeddial-button:hover,.mobile-speed-dial .p-speeddial-button:focus{background:var(--color-primary-dark)!important;box-shadow:var(--shadow-xl)!important}.mobile-speed-dial .p-speeddial-button:active{transform:scale(.95)!important}.mobile-speed-dial .p-speeddial-button .p-button-icon{font-size:var(--text-2xl)!important;color:var(--color-text-inverse)!important}.mobile-speed-dial .p-speeddial-action{width:48px!important;height:48px!important;background:var(--surface-card)!important;border:1px solid var(--surface-border)!important;box-shadow:var(--shadow-md)!important;transition:all var(--transition-fast)!important}.mobile-speed-dial .p-speeddial-action:hover,.mobile-speed-dial .p-speeddial-action:focus{background:var(--surface-hover)!important;transform:scale(1.1)!important}.mobile-speed-dial .p-speeddial-action .p-speeddial-action-icon{color:var(--color-primary)!important;font-size:var(--text-lg)!important}.mobile-speed-dial .p-speeddial-action:before{content:attr(aria-label);position:absolute;right:60px;white-space:nowrap;background:var(--surface-card);color:var(--text-color);padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-sm);font-size:var(--text-sm);font-weight:var(--font-medium);box-shadow:var(--shadow-sm);border:1px solid var(--surface-border);opacity:0;transform:translate(10px);transition:all var(--transition-fast);pointer-events:none}.mobile-speed-dial.p-speeddial-opened .p-speeddial-action:before{opacity:1;transform:translate(0)}.p-speeddial-mask.mobile-speed-dial-mask{position:fixed!important;top:0!important;left:0!important;width:100%!important;height:100%!important;background:#00000080!important;z-index:998!important;pointer-events:none!important}.p-speeddial-opened~.p-speeddial-mask.mobile-speed-dial-mask,.mobile-speed-dial.p-speeddial-opened~.p-speeddial-mask.mobile-speed-dial-mask{pointer-events:auto!important;animation:fadeIn .2s ease-out!important}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}[data-theme=dark] .mobile-speed-dial .p-speeddial-button{background:var(--blue-600)!important;box-shadow:0 4px 12px #0006!important}[data-theme=dark] .mobile-speed-dial .p-speeddial-button:hover,[data-theme=dark] .mobile-speed-dial .p-speeddial-button:focus{background:var(--blue-700)!important}[data-theme=dark] .mobile-speed-dial .p-speeddial-action{background:var(--surface-card)!important;border-color:var(--surface-border)!important}[data-theme=dark] .mobile-speed-dial .p-speeddial-action:hover,[data-theme=dark] .mobile-speed-dial .p-speeddial-action:focus{background:var(--surface-hover)!important}[data-theme=dark] .mobile-speed-dial .p-speeddial-action .p-speeddial-action-icon{color:var(--blue-400)!important}[data-theme=dark] .mobile-speed-dial .p-speeddial-action:before{background:var(--surface-card);color:var(--text-color);border-color:var(--surface-border)}[data-theme=dark] .p-speeddial-mask.mobile-speed-dial-mask{background:#000000b3!important}@media (prefers-color-scheme: dark){:root:not([data-theme]) .mobile-speed-dial .p-speeddial-button{background:var(--blue-600)!important;box-shadow:0 4px 12px #0006!important}:root:not([data-theme]) .mobile-speed-dial .p-speeddial-button:hover,:root:not([data-theme]) .mobile-speed-dial .p-speeddial-button:focus{background:var(--blue-700)!important}:root:not([data-theme]) .mobile-speed-dial .p-speeddial-action{background:var(--surface-card)!important;border-color:var(--surface-border)!important}:root:not([data-theme]) .mobile-speed-dial .p-speeddial-action:hover,:root:not([data-theme]) .mobile-speed-dial .p-speeddial-action:focus{background:var(--surface-hover)!important}:root:not([data-theme]) .mobile-speed-dial .p-speeddial-action .p-speeddial-action-icon{color:var(--blue-400)!important}:root:not([data-theme]) .mobile-speed-dial .p-speeddial-action:before{background:var(--surface-card);color:var(--text-color);border-color:var(--surface-border)}:root:not([data-theme]) .p-speeddial-mask.mobile-speed-dial-mask{background:#000000b3!important}}.receipt-action-menu.p-menu.p-menu-overlay{background:var(--md-sys-color-surface-container-high, var(--surface-card))!important;border:1px solid var(--md-sys-color-outline-variant, var(--surface-border))!important;border-radius:var(--radius-lg, 12px)!important;min-width:200px!important;max-width:280px!important;box-shadow:0 2px 4px -1px #0000001a,0 4px 6px -1px #0000000f,0 8px 16px -2px #0000001a!important;transform-origin:top center!important;animation:receiptMenuSlideIn .2s ease-out!important;overflow:hidden!important}@keyframes receiptMenuSlideIn{0%{opacity:0;transform:scale(.92) translateY(-4px)}to{opacity:1;transform:scale(1) translateY(0)}}.receipt-action-menu.p-menu .p-menu-list{padding:var(--space-sm, 8px) 0!important}.receipt-action-menu.p-menu .p-menuitem{padding:0!important;margin:0 var(--space-xs, 4px)!important}.receipt-action-menu.p-menu .p-menuitem-content{display:flex!important;align-items:center!important;gap:var(--space-md, 16px)!important;padding:var(--space-sm, 8px) var(--space-md, 16px)!important;min-height:48px!important;font-size:var(--text-base, 1rem)!important;color:var(--md-sys-color-on-surface, var(--text-color))!important;background:transparent!important;border-radius:var(--radius-md, 8px)!important;text-decoration:none!important;cursor:pointer!important;transition:background-color var(--transition-fast, .15s) ease,transform var(--transition-fast, .15s) ease!important;position:relative!important;overflow:hidden!important}.receipt-action-menu.p-menu .p-menuitem-content:hover{background:var(--md-sys-color-surface-variant, var(--surface-hover))!important}.receipt-action-menu.p-menu .p-menuitem-content:active{background:var(--md-sys-color-primary-container, var(--primary-100))!important;transform:scale(.98)!important}.receipt-action-menu.p-menu .p-menuitem:focus-visible .p-menuitem-content{outline:2px solid var(--md-sys-color-primary, var(--color-primary))!important;outline-offset:-2px!important}.receipt-action-menu.p-menu .p-menuitem-icon{display:flex!important;align-items:center!important;justify-content:center!important;width:24px!important;height:24px!important;font-size:1.25rem!important;color:var(--md-sys-color-on-surface-variant, var(--color-text-secondary))!important;flex-shrink:0!important;transition:color var(--transition-fast, .15s) ease!important}.receipt-action-menu.p-menu .p-menuitem-content:hover .p-menuitem-icon{color:var(--md-sys-color-primary, var(--color-primary))!important}.receipt-action-menu.p-menu .p-menuitem-text{font-weight:var(--font-medium, 500)!important;font-size:var(--text-base, 1rem)!important;line-height:1.5!important;color:var(--md-sys-color-on-surface, var(--text-color))!important}.receipt-action-menu.p-menu .p-menuitem+.p-menuitem{margin-top:2px!important}.receipt-action-menu.p-menu .p-menu-separator{margin:var(--space-sm, 8px) var(--space-md, 16px)!important;border:none!important;border-top:1px solid var(--md-sys-color-outline-variant, var(--surface-border))!important;height:0!important}.receipt-action-menu.p-menu .p-menuitem.menu-item-danger .p-menuitem-content,.receipt-action-menu.p-menu .p-menuitem.menu-item-danger .p-menuitem-icon,.receipt-action-menu.p-menu .p-menuitem.menu-item-danger .p-menuitem-text{color:var(--md-sys-color-error, var(--color-error))!important}.receipt-action-menu.p-menu .p-menuitem.menu-item-danger .p-menuitem-content:hover{background:var(--md-sys-color-error-container, var(--red-100))!important}.receipt-action-menu.p-menu .p-menuitem.menu-item-danger .p-menuitem-content:active{background:var(--md-sys-color-error-container, var(--red-200))!important}.receipt-action-menu.p-menu .p-menuitem.menu-item-success .p-menuitem-content,.receipt-action-menu.p-menu .p-menuitem.menu-item-success .p-menuitem-icon,.receipt-action-menu.p-menu .p-menuitem.menu-item-success .p-menuitem-text{color:var(--color-success, #059669)!important}.receipt-action-menu.p-menu .p-menuitem.menu-item-success .p-menuitem-content:hover{background:var(--green-100, rgba(5, 150, 105, .1))!important}.receipt-action-menu.p-menu .p-menuitem.menu-item-success .p-menuitem-content:active{background:var(--green-200, rgba(5, 150, 105, .2))!important}.receipt-action-menu.p-menu .p-menuitem.menu-item-warning .p-menuitem-content,.receipt-action-menu.p-menu .p-menuitem.menu-item-warning .p-menuitem-icon,.receipt-action-menu.p-menu .p-menuitem.menu-item-warning .p-menuitem-text{color:var(--color-warning, #d97706)!important}.receipt-action-menu.p-menu .p-menuitem.menu-item-warning .p-menuitem-content:hover{background:var(--yellow-100, rgba(217, 119, 6, .1))!important}.receipt-action-menu.p-menu .p-menuitem.menu-item-warning .p-menuitem-content:active{background:var(--yellow-200, rgba(217, 119, 6, .2))!important}[data-theme=dark] .receipt-action-menu.p-menu.p-menu-overlay{background:var(--surface-800, #1e293b)!important;border-color:var(--surface-600, #475569)!important;box-shadow:0 4px 8px -2px #0000004d,0 8px 16px -4px #00000040!important}[data-theme=dark] .receipt-action-menu.p-menu .p-menuitem-content:hover{background:var(--surface-700, #334155)!important}[data-theme=dark] .receipt-action-menu.p-menu .p-menuitem-content:active{background:var(--surface-600, #475569)!important}[data-theme=dark] .receipt-action-menu.p-menu .p-menu-separator{border-top-color:var(--surface-600, #475569)!important}[data-theme=dark] .receipt-action-menu.p-menu .p-menuitem.menu-item-danger .p-menuitem-content:hover{background:var(--red-900, rgba(220, 38, 38, .2))!important}[data-theme=dark] .receipt-action-menu.p-menu .p-menuitem.menu-item-success .p-menuitem-content:hover{background:var(--green-900, rgba(5, 150, 105, .2))!important}[data-theme=dark] .receipt-action-menu.p-menu .p-menuitem.menu-item-warning .p-menuitem-content:hover{background:var(--yellow-900, rgba(217, 119, 6, .2))!important}@media (prefers-color-scheme: dark){:root:not([data-theme]) .receipt-action-menu.p-menu.p-menu-overlay{background:var(--surface-800, #1e293b)!important;border-color:var(--surface-600, #475569)!important;box-shadow:0 4px 8px -2px #0000004d,0 8px 16px -4px #00000040!important}:root:not([data-theme]) .receipt-action-menu.p-menu .p-menuitem-content:hover{background:var(--surface-700, #334155)!important}:root:not([data-theme]) .receipt-action-menu.p-menu .p-menuitem-content:active{background:var(--surface-600, #475569)!important}:root:not([data-theme]) .receipt-action-menu.p-menu .p-menu-separator{border-top-color:var(--surface-600, #475569)!important}:root:not([data-theme]) .receipt-action-menu.p-menu .p-menuitem.menu-item-danger .p-menuitem-content:hover{background:var(--red-900, rgba(220, 38, 38, .2))!important}:root:not([data-theme]) .receipt-action-menu.p-menu .p-menuitem.menu-item-success .p-menuitem-content:hover{background:var(--green-900, rgba(5, 150, 105, .2))!important}:root:not([data-theme]) .receipt-action-menu.p-menu .p-menuitem.menu-item-warning .p-menuitem-content:hover{background:var(--yellow-900, rgba(217, 119, 6, .2))!important}} diff --git a/deploy-package-20260223-151231/frontend/assets/ReceiptsListView.DxBNp1EK.js b/deploy-package-20260223-151231/frontend/assets/ReceiptsListView.DxBNp1EK.js deleted file mode 100644 index 2500902..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ReceiptsListView.DxBNp1EK.js +++ /dev/null @@ -1,8 +0,0 @@ -import{a as $,j as R,o as Pt,K as Vt,h as G,d as s,q as u,p as T,c as o,i as f,e as l,v as g,E as ne,s as Mt,T as Gs,F as O,B as st,O as N,u as P,y as h,l as jt,t as U,P as Hs,w as Ks,a1 as Ys,k as fe,H as Xs,I as Ws}from"./vendor-core.B6UiYhU_.js";import{_ as ze,u as Nt,g as Zs,s as Qe,h as Qs,i as ea}from"./index.B8XI8FQW.js";import{u as ta,a as sa,b as aa,c as ia,d as la}from"./sharedStores.D4bwf0TZ.js";import{s as na,d as oa,I as et,N as ra,L as tt}from"./vendor-primevue.BN-meDW0.js";import{M as ca}from"./MobileDrawerMenu.DJ_STPbv.js";import{B as ua}from"./BottomSheet.WKuCIyuZ.js";import{a as da}from"./ocrSettingsStore.B3n_bOhs.js";import{M as pa}from"./MobileTopBar.BnL78WPy.js";import{M as va}from"./MobileBottomNav.Cp8OR33w.js";import{e as It,a as fa}from"./exportUtils.BtGzMnqV.js";import"./vendor-utils.CO3CyGpV.js";import"./vendor-export.BWjBvx7Z.js";const ma={class:"overlay-content"},ga={class:"overlay-text"},Tt=10,ya={__name:"DragDropOverlay",emits:["upload-started","upload-complete","upload-error"],setup(_,{expose:F,emit:d}){const D=d,c=Nt(),V=$(0),K=$(0),M=Tt*1024*1024,Y=["application/pdf","image/png","image/jpeg"],X=R(()=>V.value>0),Z=k=>{if(!k.dataTransfer)return!1;const m=k.dataTransfer.types;return m&&(m.includes("Files")||m.includes("application/x-moz-file"))},re=k=>{var m;Z(k)&&(V.value++,(m=k.dataTransfer)!=null&&m.items?K.value=k.dataTransfer.items.length:K.value=0)},b=k=>{Z(k)&&k.preventDefault()},ie=()=>{V.value=Math.max(0,V.value-1)},j=k=>{(!k.relatedTarget||k.relatedTarget.nodeName==="HTML")&&(V.value=0,K.value=0)},I=async k=>{var y;V.value=0,K.value=0;const m=(y=k.dataTransfer)==null?void 0:y.files;!m||m.length===0||await te(Array.from(m))},E=async k=>{var y;if(V.value===0)return;k.preventDefault(),V.value=0,K.value=0;const m=(y=k.dataTransfer)==null?void 0:y.files;!m||m.length===0||await te(Array.from(m))},W=async k=>{const m=[];for(const y of k)try{const w=await y.arrayBuffer(),ce=new File([w],y.name,{type:y.type,lastModified:y.lastModified});m.push(ce)}catch(w){console.warn("[DragDropOverlay] File clone failed:",w),m.push(y)}return m},te=async k=>{var ce,ue;const m=await W(k),y=[],w=[];for(const z of m){if(!Y.includes(z.type)){w.push({name:z.name,reason:`Tip invalid (${z.type||"necunoscut"})`});continue}if(z.size>M){w.push({name:z.name,reason:`Prea mare (${me(z.size)} > ${Tt}MB)`});continue}y.push(z)}if(w.length>0){const z=w.slice(0,3).map(se=>`• ${se.name}: ${se.reason}`).join(` -`),A=w.length-3,S=A>0?`${z} -...și încă ${A} fișiere`:z;c.add({severity:"warn",summary:`${w.length} fișier${w.length>1?"e":""} ignorat${w.length>1?"e":""}`,detail:S,life:5e3})}if(y.length!==0)try{D("upload-started",y.length);const z=new FormData;y.forEach(ge=>{z.append("files",ge)});const S=(await da.post("/bulk/upload",z)).data;let se=`${S.processed_files||S.total_files} fișier${(S.processed_files||S.total_files)>1?"e":""} încărcat${(S.processed_files||S.total_files)>1?"e":""}`;S.duplicate_files&&S.duplicate_files>0&&(se+=`, ${S.duplicate_files} duplicate ignorate`),c.add({severity:"success",summary:"Upload reușit",detail:se,life:4e3});const de=S.job_ids.map((ge,ye)=>{var he;return{job_id:ge,filename:((he=y[ye])==null?void 0:he.name)||`File ${ye+1}`}});D("upload-complete",{batchId:S.batch_id!=null?String(S.batch_id):null,jobIds:S.job_ids,jobs:de,totalFiles:S.total_files,processedFiles:S.processed_files,duplicates:S.duplicates})}catch(z){console.error("[DragDropOverlay] Upload failed:",z);let A="Eroare la încărcare";if((ue=(ce=z.response)==null?void 0:ce.data)!=null&&ue.detail){const S=z.response.data.detail;if(typeof S=="string")A=S;else if(S.message&&(A=S.message,S.duplicates&&S.duplicates.length>0)){const se=S.duplicates.slice(0,3).map(de=>`• ${de.filename}: ${de.message}`).join(` -`);A+=` -`+se}}c.add({severity:"error",summary:"Upload eșuat",detail:A,life:6e3}),D("upload-error",z)}},me=k=>k<1024?k+" B":k<1024*1024?(k/1024).toFixed(1)+" KB":(k/(1024*1024)).toFixed(1)+" MB";return Pt(()=>{window.addEventListener("dragenter",re),window.addEventListener("dragover",b),window.addEventListener("dragleave",ie),window.addEventListener("drop",E)}),Vt(()=>{window.removeEventListener("dragenter",re),window.removeEventListener("dragover",b),window.removeEventListener("dragleave",ie),window.removeEventListener("drop",E)}),F({handleFiles:te}),(k,m)=>(s(),G(Gs,{to:"body"},[u(Mt,{name:"fade"},{default:T(()=>[X.value?(s(),o("div",{key:0,class:"drag-drop-overlay",onDragover:m[0]||(m[0]=ne(()=>{},["prevent"])),onDragleave:ne(j,["prevent"]),onDrop:ne(I,["prevent"])},[l("div",ma,[m[1]||(m[1]=l("i",{class:"pi pi-cloud-upload overlay-icon"},null,-1)),l("p",ga," Eliberează pentru a încărca "+g(K.value)+" "+g(K.value===1?"fișier":"fișiere"),1),m[2]||(m[2]=l("p",{class:"overlay-hint"},"PDF, PNG, JPG (max 10MB per fișier)",-1))])],32)):f("",!0)]),_:1})]))}},ha=ze(ya,[["__scopeId","data-v-2c3712d1"]]),ba={key:0,class:"mobile-selection-footer"},_a={class:"selection-actions"},Sa={__name:"MobileSelectionFooter",props:{visible:{type:Boolean,default:!1},actions:{type:Array,default:()=>[],validator:_=>Array.isArray(_)&&_.every(F=>typeof F.label=="string"&&typeof F.icon=="string"&&typeof F.handler=="function")}},setup(_){const F=d=>{d.handler&&typeof d.handler=="function"&&d.handler()};return(d,D)=>(s(),G(Mt,{name:"slide-up"},{default:T(()=>[_.visible?(s(),o("footer",ba,[l("div",_a,[(s(!0),o(O,null,st(_.actions,(c,V)=>(s(),G(N(na),{key:V,label:c.label,icon:c.icon,severity:c.severity||"secondary",class:"selection-action-btn",onClick:K=>F(c)},null,8,["label","icon","severity","onClick"]))),128))])])):f("",!0)]),_:1}))}},wa=ze(Sa,[["__scopeId","data-v-9fdcc1b8"]]),ka={class:"batch-header-content"},Ca={class:"batch-info"},xa={class:"batch-label"},Ea={key:0,class:"batch-date"},Ra={key:1,class:"batch-date"},$a={class:"batch-count"},Ia={key:0,class:"batch-status-indicator processing"},Ta={key:1,class:"batch-status-indicator failed"},Aa={key:1,class:"retry-loading"},La={key:2,class:"batch-status-indicator completed"},Fa={__name:"BatchGroupHeader",props:{batchId:{type:String,default:null},processingStartedAt:{type:String,default:null},items:{type:Array,required:!0},isExpanded:{type:Boolean,default:!1},retrying:{type:Boolean,default:!1}},emits:["toggle","retry-all","cancel-all"],setup(_,{emit:F}){const d=_,D=F,c=()=>{d.batchId&&D("retry-all",d.batchId)},V=()=>{d.batchId&&D("cancel-all",{batchId:d.batchId,pendingProcessingCount:re.value,completedCount:b.value})},K=R(()=>d.batchId?`B-${d.batchId.replace(/-/g,"").substring(0,8).toUpperCase()}`:""),M=R(()=>{if(!d.processingStartedAt)return null;const I=new Date(d.processingStartedAt),E=["Ian","Feb","Mar","Apr","Mai","Iun","Iul","Aug","Sep","Oct","Nov","Dec"],W=I.getDate().toString().padStart(2,"0"),te=E[I.getMonth()],me=I.getFullYear();return`${W} ${te} ${me}`}),Y=R(()=>d.items.length),X=R(()=>d.items.filter(I=>I.processing_status==="pending"||I.processing_status==="processing").length),Z=R(()=>X.value>0),re=R(()=>X.value),b=R(()=>d.items.filter(I=>I.processing_status==="completed").length),ie=R(()=>d.items.filter(I=>I.processing_status==="failed").length),j=R(()=>d.batchId?d.items.every(I=>I.processing_status==="completed"):!1);return(I,E)=>(s(),o("div",{class:P(["batch-group-header",{"is-expanded":_.isExpanded,"has-active-processing":Z.value}]),onClick:E[0]||(E[0]=W=>I.$emit("toggle"))},[l("div",ka,[l("i",{class:P(["pi chevron-icon",_.isExpanded?"pi-chevron-down":"pi-chevron-right"])},null,2),l("div",Ca,[l("span",xa,[_.batchId?(s(),o(O,{key:0},[h(" Batch "+g(K.value),1)],64)):(s(),o(O,{key:1},[h(" Alte bonuri ")],64))]),E[1]||(E[1]=l("span",{class:"batch-separator"},"•",-1)),M.value?(s(),o("span",Ea,g(M.value),1)):(s(),o("span",Ra," Creat manual ")),E[2]||(E[2]=l("span",{class:"batch-separator"},"•",-1)),l("span",$a,g(Y.value)+" "+g(Y.value===1?"fișier":"fișiere"),1)]),Z.value?(s(),o("div",Ia,[E[4]||(E[4]=l("i",{class:"pi pi-spin pi-spinner"},null,-1)),l("span",null,g(X.value)+" în procesare",1),_.batchId?(s(),o("button",{key:0,class:"cancel-all-btn",onClick:ne(V,["stop"]),title:"Anulează toate fișierele în așteptare"},[...E[3]||(E[3]=[l("i",{class:"pi pi-times"},null,-1),l("span",{class:"cancel-btn-text"},"Anulează tot",-1)])])):f("",!0)])):ie.value>0?(s(),o("div",Ta,[E[7]||(E[7]=l("i",{class:"pi pi-exclamation-circle"},null,-1)),l("span",null,g(ie.value)+" cu erori",1),_.batchId&&!_.retrying?(s(),o("button",{key:0,class:"retry-all-btn",onClick:ne(c,["stop"]),title:"Reîncercă toate erorile"},[...E[5]||(E[5]=[l("i",{class:"pi pi-refresh"},null,-1),l("span",{class:"retry-btn-text"},"Reîncercă",-1)])])):f("",!0),_.retrying?(s(),o("span",Aa,[...E[6]||(E[6]=[l("i",{class:"pi pi-spin pi-spinner"},null,-1)])])):f("",!0)])):j.value?(s(),o("div",La,[...E[8]||(E[8]=[l("i",{class:"pi pi-check-circle"},null,-1),l("span",null,"Procesat",-1)])])):f("",!0)])],2))}},Da=ze(Fa,[["__scopeId","data-v-c767ad87"]]),za={class:"processing-status-cell"},Ba={key:0,class:"processing-status-dash"},Pa={key:1,class:"processing-status processing-pending"},Va={key:2,class:"processing-status processing-active"},Ma={key:3,class:"processing-status processing-success"},ja={key:4,class:"processing-failed-container"},Na={key:0,class:"processing-error-message"},Ua={key:5,class:"processing-status-dash"},Oa={__name:"ProcessingStatusCell",props:{status:{type:String,default:null},batchId:{type:String,default:null},processingError:{type:String,default:null}},emits:["error-click"],setup(_,{emit:F}){const d=_,D=F,c=R(()=>d.processingError||"Eroare la procesare"),V=R(()=>{if(!d.processingError)return"";const M=50;return d.processingError.length<=M?d.processingError:d.processingError.substring(0,M)+"..."}),K=()=>{D("error-click",d.processingError)};return(M,Y)=>{const X=jt("tooltip");return s(),o("div",za,[_.batchId?_.status==="pending"?(s(),o("span",Pa," În așteptare ")):_.status==="processing"?(s(),o("span",Va,[...Y[0]||(Y[0]=[l("i",{class:"pi pi-spin pi-spinner"},null,-1),h(" Se procesează... ",-1)])])):_.status==="completed"?(s(),o("span",Ma," ✓ Procesat ")):_.status==="failed"?(s(),o("div",ja,[U((s(),o("span",{class:"processing-status processing-failed",onClick:ne(K,["stop"])},[...Y[1]||(Y[1]=[h(" ✗ Eroare ",-1)])])),[[X,{value:c.value,showDelay:200},void 0,{top:!0}]]),_.processingError?U((s(),o("span",Na,[h(g(V.value),1)])),[[X,{value:_.processingError,showDelay:200},void 0,{bottom:!0}]]):f("",!0)])):(s(),o("span",Ua,"-")):(s(),o("span",Ba,"-"))])}}},Ja=ze(Oa,[["__scopeId","data-v-662c9f39"]]);let H=null,at=null,Ee=!1,$e=!1,Se=!1,Ue=null,oe=null,Re=null,it=null,De=0;const At=5,Lt=5e3,Ft=3e4;function qa(_){const F="/roa2web/api/data-entry/receipts/sse/status";return _?`${F}?batch_id=${encodeURIComponent(_)}`:F}function Ut(_=null){H&&Ot(),it=_;const F=qa(_);console.log(`[SSE] Connecting to ${F}`);try{H=new EventSource(F),Ee=!0,H.onmessage=d=>{try{const D=JSON.parse(d.data);console.log("[SSE] Received status change:",D),at&&at(D)}catch(D){console.error("[SSE] Failed to parse event data:",D,d.data)}},H.onopen=()=>{console.log("[SSE] Connection opened"),Ee=!0,$e=!0,De=0,Se&&(console.log("[SSE] SSE connection restored, stopping polling fallback"),Jt()),oe&&(clearTimeout(oe),oe=null)},H.onerror=d=>{(H==null?void 0:H.readyState)===EventSource.CLOSED?(console.log("[SSE] Connection closed"),Ee=!1,$e=!1,De++,console.log("SSE connection failed, falling back to polling"),Dt()):(H==null?void 0:H.readyState)===EventSource.CONNECTING?console.log("[SSE] Connection lost, reconnecting..."):console.error("[SSE] Connection error:",d)}}catch(d){console.error("[SSE] Failed to create EventSource:",d),console.log("SSE connection failed, falling back to polling"),Ee=!1,$e=!1,De++,Dt()}}function Ot(){H&&(H.close(),H=null,Ee=!1,$e=!1)}function Dt(){Re&&!Se&&Ga(),De{Re&&Re()},Lt))}function Jt(){Ue&&(clearInterval(Ue),Ue=null),Se=!1,console.log("[SSE] Polling fallback stopped")}function Ha(){oe||(console.log(`[SSE] Scheduling SSE retry in ${Ft/1e3}s`),oe=setTimeout(()=>{oe=null,Se&&!$e&&(console.log("[SSE] Retrying SSE connection..."),Ut(it))},Ft))}function Ka(){console.log("[SSE] Disconnecting and cleaning up"),Ot(),Jt(),oe&&(clearTimeout(oe),oe=null),it=null,De=0}function Ya(_){Re=_}function Xa(_){at=_}function Wa(){return Ee&&H!==null&&H.readyState!==EventSource.CLOSED}function Za(){return $e}function Qa(){return Se}const Ce={connect:Ut,disconnect:Ka,onStatusChange:Xa,setPollingCallback:Ya,get isConnected(){return Wa()},get isSSEActive(){return Za()},get isPollingActive(){return Qa()}},ei={class:"reject-dialog-content"},ti={key:1,class:"mobile-filter-chips-container"},si={class:"mobile-filter-chips"},ai={class:"bottom-sheet-filters"},ii={class:"form-group"},li={class:"form-group"},ni={class:"form-group"},oi={class:"form-group"},ri={class:"form-group"},ci={class:"bottom-sheet-actions"},ui={key:2,class:"page-header"},di={class:"roa-card"},pi={key:0,class:"status-actions-row"},vi={class:"status-chips"},fi={key:0,class:"desktop-action-buttons"},mi={key:1,class:"mobile-toolbar-container"},gi={class:"mobile-toolbar-buttons"},yi={class:"mobile-toolbar-buttons mobile-toolbar-actions"},hi={key:2,class:"filters-row"},bi={key:0,class:"header-actions-bar"},_i={key:3,class:"loading-container"},Si={key:4,class:"empty-state"},wi={key:5,class:"receipt-cards"},ki={key:0,class:"mobile-selection-header"},Ci={class:"selection-header-left"},xi={class:"selection-count"},Ei={class:"selection-header-right"},Ri=["onClick","onTouchstart"],$i={class:"card-row-1"},Ii={class:"partner-info"},Ti={class:"partner job-filename-mobile"},Ai={key:0,class:"cui text-error"},Li={key:1,class:"cui text-muted"},Fi={key:0,class:"job-failed-indicator-mobile"},Di={key:1,class:"job-processing-indicator-mobile"},zi={class:"card-row-2"},Bi={key:0,class:"text-error job-error-message"},Pi={key:1,class:"text-error"},Vi={key:2,class:"text-muted"},Mi={class:"card-row-3"},ji={key:0,class:"processing-badge processing-failed"},Ni={key:1,class:"processing-badge processing-active"},Ui={key:2,class:"batch-badge"},Oi={key:0,class:"selection-checkmark"},Ji={class:"card-row-1"},qi={class:"partner-info"},Gi={class:"partner"},Hi={key:0,class:"cui"},Ki={key:1,class:"filename-mobile"},Yi={class:"amount-block"},Xi={class:"amount"},Wi={key:0,class:"amount-detail tva"},Zi={key:1,class:"amount-detail payment"},Qi={class:"card-row-2"},el={key:0,class:"sep"},tl={key:1,class:"receipt-nr"},sl={class:"card-row-3"},al={key:0,class:"processing-badge processing-active"},il={key:1,class:"processing-badge processing-failed"},ll={key:2,class:"batch-badge"},nl={class:"created-by"},ol={key:3,class:"attachments"},rl={key:1,class:"mobile-pagination"},cl={class:"page-info"},ul={key:6,class:"data-table-container"},dl={key:0,class:"bulk-actions-bar"},pl={class:"selection-info"},vl={class:"bulk-buttons"},fl={class:"batch-groups-container"},ml={class:"batch-group-content"},gl={key:0,class:"job-filename"},yl={key:0,class:"receipt-filename"},hl={key:1,class:"text-muted"},bl={key:0,class:"text-muted"},_l={key:0,class:"text-muted"},Sl={key:0,class:"text-muted"},wl={key:0,class:"text-muted"},kl={key:0,class:"text-muted"},Cl={key:0,class:"text-muted"},xl={key:0,class:"text-muted"},El={key:1},Rl={key:0,class:"text-muted"},$l={key:0},Il={key:1,class:"text-muted"},Tl={key:0,class:"text-muted"},Al={key:0},Ll={key:1,class:"text-muted"},Fl={key:0,class:"text-muted"},Dl={key:0,class:"text-muted"},zl={key:0,class:"text-muted"},Bl={key:0,class:"text-muted"},Pl={class:"button-group"},Vl={key:0,class:"job-failed-indicator"},Ml={class:"job-processing-indicator"},jl={key:1,class:"grouped-pagination"},Nl=500,zt=10,xe=2e3,Bt="Fișierul se procesează",Ul=300,Ol={__name:"ReceiptsListView",setup(_){const F=Hs(),d=Nt(),D=Zs(),c=ta(),V=sa(),K=aa(),M=ia(),Y=la(),X=$(!1),Z=$(""),re=$(null),b=$([]),ie=$(!1),j=$(!1);let I=null,E={x:0,y:0};const W=$(new Set),te=$({}),me=$({}),k=$({}),m=$(new Set),y=$(new Set),w=$(new Set),ce=$(null),ue=$(null);let z=!1;const A=$(window.innerWidth<768),S=$(!1),se=()=>{A.value=window.innerWidth<768},de=$(!1),ge=$(null),ye=$(!0),he=$(null);let lt=0,Ie=null;const qt=async()=>{await Y.logout(),F.push("/login")},Gt=async t=>{var e;await V.loadCompanies(),(e=V.selectedCompany)!=null&&e.id_firma&&await K.loadPeriods(V.selectedCompany.id_firma)},Ht=R(()=>[{label:"Actualizează",icon:"pi pi-refresh",command:()=>{c.fetchReceipts(),c.fetchStats()}},{label:"Resetează filtre",icon:"pi pi-filter-slash",command:()=>Fe()},{separator:!0},{label:"Setări",icon:"pi pi-cog",command:()=>F.push("/settings")}]),Kt=t=>{var e;(e=he.value)==null||e.toggle(t)},Yt=R(()=>[{label:"Export PDF",icon:"pi pi-file-pdf",command:()=>Fs()},{label:"Export XLSX",icon:"pi pi-file-excel",command:()=>Ls()}]),Xt=[{label:"Bon Nou",icon:"pi pi-pencil",command:()=>Xe()},{label:"Bulk Upload",icon:"pi pi-upload",command:()=>Ye()}],Wt=R(()=>j.value?[{id:"select-all",icon:"pi pi-check-square",label:"Selectează tot",tooltip:"Selectează tot"}]:[{id:"filter",icon:"pi pi-filter",active:qe.value,tooltip:"Filtre"},{id:"reset",icon:"pi pi-filter-slash",tooltip:"Resetează Filtrele"},{id:"export",icon:"pi pi-download",tooltip:"Export Excel"},{id:"more",icon:"pi pi-ellipsis-v",tooltip:"Mai multe"}]),Zt=t=>{switch(t.id){case"select-all":vt();break;case"filter":S.value=!S.value;break;case"reset":Fe();break;case"export":if(he.value){const e=document.querySelector(".mobile-top-bar .top-bar-btn:nth-child(3)");e&&he.value.toggle({currentTarget:e})}break;case"more":if(ge.value){const e=document.querySelector(".mobile-top-bar .top-bar-btn:last-child");e&&ge.value.toggle({currentTarget:e})}break}},Qt=R(()=>[{label:"Șterge",icon:"pi pi-trash",severity:"danger",handler:()=>yt()},{label:"Export",icon:"pi pi-download",severity:"secondary",handler:()=>As()}]),nt=()=>{if(!A.value)return;const t=window.scrollY,e=t-lt;Ie&&clearTimeout(Ie),e>10?ye.value=!1:e<-10&&(ye.value=!0),lt=t,Ie=setTimeout(()=>{ye.value=!0},300)};Pt(async()=>{window.addEventListener("resize",se),window.addEventListener("scroll",nt,{passive:!0}),await c.fetchStats(),await c.fetchReceipts(),M.setOnJobsTransitionCallback(Ns),Ce.onStatusChange(Os),Ce.setPollingCallback(async()=>{console.log("[ReceiptsList] Polling fallback: refreshing data"),await c.fetchReceipts(),await c.fetchStats(),pe.value===0&&(console.log("[ReceiptsList] Processing complete during polling, disconnecting"),Ze(),M.clearAllStoredBatches())}),await Us(),document.addEventListener("click",pt)}),Vt(()=>{window.removeEventListener("resize",se),window.removeEventListener("scroll",nt),Ie&&clearTimeout(Ie),Ze(),M.setOnJobsTransitionCallback(null),Ce.onStatusChange(null),Ce.setPollingCallback(null),document.removeEventListener("click",pt)}),Ks(()=>V.selectedCompany,async(t,e)=>{!e||!t||t.id_firma!==e.id_firma&&(console.log("[ReceiptsList] Company changed, reloading data..."),p.value={status:null,search:"",direction:null,dateFrom:null,dateTo:null,processingStatus:null},c.clearFilters(),await c.fetchStats(),await c.fetchReceipts())});const ot=$(),rt=$(null),ct=(t,e)=>{rt.value=e,ot.value.toggle(t)},es=R(()=>{const t=rt.value;if(!t)return[];const e=[{label:"Vizualizează",icon:"pi pi-eye",command:()=>We(t.id)}];return t.status==="draft"&&(e.push({label:"Editează",icon:"pi pi-pencil",command:()=>Me(t.id)}),e.push({label:"Spre aprobare",icon:"pi pi-send",command:()=>Cs(t)}),e.push({separator:!0}),e.push({label:"Șterge",icon:"pi pi-trash",class:"menu-item-danger",command:()=>gt(t)})),t.status==="pending_review"&&(e.push({separator:!0}),e.push({label:"Validează",icon:"pi pi-check",class:"menu-item-success",command:()=>xs(t)}),e.push({label:"Respinge",icon:"pi pi-times",class:"menu-item-danger",command:()=>Rs(t)})),t.status==="approved"&&(e.push({separator:!0}),e.push({label:"Anulare Validare",icon:"pi pi-undo",class:"menu-item-warning",command:()=>Es(t)})),t.status==="rejected"&&(e.push({label:"Editează",icon:"pi pi-pencil",command:()=>Me(t.id)}),e.push({label:"Retrimite",icon:"pi pi-replay",command:()=>Is(t)}),e.push({separator:!0}),e.push({label:"Șterge",icon:"pi pi-trash",class:"menu-item-danger",command:()=>gt(t)})),e}),p=$({status:null,search:"",direction:null,dateFrom:null,dateTo:null,processingStatus:null}),ut=[{value:null,label:"Toate"},{value:"cheltuiala",label:"Plăți"},{value:"incasare",label:"Încasări"}],ts=[{value:null,label:"Toate"},{value:"draft",label:"Ciorne"},{value:"pending_review",label:"În așteptare"},{value:"approved",label:"Validate"},{value:"rejected",label:"Respinse"}],ss=R(()=>c.receipts),Oe=R(()=>c.loading),B=R(()=>c.pagination),Q=R(()=>c.stats),Je=R(()=>c.processingStats),C=t=>t._isJob===!0,Be=t=>C(t)?`job_${t.job_id}`:t.id,be=R(()=>{const t=ss.value||[],e=M.jobs||new Map,n=new Set;for(const x of t)n.add(x.id);const a=[];for(const[x,v]of e.entries())v.status==="completed"&&v.receipt_id&&n.has(v.receipt_id)||v.status!=="pending"&&v.status!=="processing"&&v.status!=="failed"||a.push({_isJob:!0,job_id:x,id:`job_${x}`,filename:v.filename,batch_id:M.batchId,processing_status:v.status,processing_error:v.error_message,processing_started_at:null,receipt_date:null,receipt_number:null,receipt_type:null,direction:null,partner_name:null,cui:null,amount:null,tva_total:null,payment_methods:null,status:null,created_by:null,created_at:null,attachments:[]});return[...a,...t]}),pe=R(()=>{var t,e;return(((t=Je.value)==null?void 0:t.pending_count)||0)+(((e=Je.value)==null?void 0:e.processing_count)||0)}),Pe=R(()=>{var t;return((t=Je.value)==null?void 0:t.failed_count)||0}),qe=R(()=>p.value.status!==null||p.value.search!==""||p.value.direction!==null||p.value.dateFrom!==null||p.value.dateTo!==null||p.value.processingStatus!==null),dt=R(()=>{const t=new Map;for(const n of be.value){const a=n.batch_id||"__manual__";t.has(a)||t.set(a,{batchId:n.batch_id,processingStartedAt:n.processing_started_at,items:[]}),t.get(a).items.push(n)}const e=Array.from(t.values());return e.sort((n,a)=>{if(!n.batchId&&a.batchId)return 1;if(n.batchId&&!a.batchId)return-1;if(!n.batchId&&!a.batchId)return 0;const x=n.processingStartedAt?new Date(n.processingStartedAt).getTime():0;return(a.processingStartedAt?new Date(a.processingStartedAt).getTime():0)-x}),e}),as=t=>t.items.some(e=>e.processing_status==="pending"||e.processing_status==="processing"),ee=t=>(C(t),t.processing_status==="pending"||t.processing_status==="processing"),is=t=>{const e=[],n=Be(t);return y.value.has(n)?e.push("row-highlight-completed"):w.value.has(n)&&e.push("row-highlight-failed"),C(t)&&m.value.has(t.job_id)&&e.push("row-cancelling"),C(t)?t.processing_status==="failed"?e.push("row-failed"):e.push("row-processing"):ee(t)?e.push("row-processing"):t.processing_status==="failed"&&e.push("row-failed"),e.join(" ")},ls=t=>{const e=Be(t),n=!C(t)&&t.processing_status==="failed";return{"card-processing":ee(t),"card-job":C(t),"card-failed":n,"card-highlight-completed":y.value.has(e),"card-highlight-failed":w.value.has(e)}},_e=t=>b.value.some(e=>e.id===t.id),Ge=(t,e)=>{e?_e(t)||(b.value=[...b.value,t]):b.value=b.value.filter(n=>n.id!==t.id)},ns=t=>t.some(e=>!ee(e)),os=t=>{const e=t.filter(n=>!ee(n));return e.length===0?!1:e.every(n=>_e(n))},rs=(t,e)=>{const n=t.filter(a=>!ee(a));if(e){const a=new Set(b.value.map(v=>v.id)),x=n.filter(v=>!a.has(v.id));b.value=[...b.value,...x]}else{const a=new Set(t.map(x=>x.id));b.value=b.value.filter(x=>!a.has(x.id))}},cs=(t,e)=>{if(C(e)||ee(e))return;const n=t.touches[0];E={x:n.clientX,y:n.clientY},I=setTimeout(()=>{j.value=!0,_e(e)||Ge(e,!0),navigator.vibrate&&navigator.vibrate(50)},Nl)},us=t=>{if(!I)return;const e=t.touches[0],n=Math.abs(e.clientX-E.x),a=Math.abs(e.clientY-E.y);(n>zt||a>zt)&&(clearTimeout(I),I=null)},ds=()=>{I&&(clearTimeout(I),I=null)},ps=(t,e)=>{if(!C(e))if(j.value){if(t.preventDefault(),t.stopPropagation(),ee(e))return;Ge(e,!_e(e))}else We(e.id)},He=()=>{j.value=!1,b.value=[]},pt=t=>{if(!j.value)return;const e=t.target,n=e.closest(".receipt-card"),a=e.closest(".mobile-selection-header"),x=e.closest(".mobile-selection-bottom-bar");!n&&!a&&!x&&He()},vt=()=>{const t=be.value.filter(a=>!C(a)&&!ee(a)),e=new Set(b.value.map(a=>a.id)),n=t.filter(a=>!e.has(a.id));b.value=[...b.value,...n]},vs=t=>{const e=t||"__manual__";W.value.has(e)?W.value.delete(e):W.value.add(e),W.value=new Set(W.value)},ft=t=>{const e=t||"__manual__";return W.value.has(e)};Ys(()=>{const t=new Set(W.value);for(const e of dt.value){const n=e.batchId||"__manual__";as(e)&&t.add(n)}t.size!==W.value.size&&(W.value=t)});const we=t=>t?new Date(t).toLocaleDateString("ro-RO"):"-",Ke=t=>{if(!t)return"-";const e=20;return t.length<=e?t:t.substring(0,e)+"..."},fs=t=>{if(!t)return"Eroare necunoscută";const e=40;return t.length<=e?t:t.substring(0,e)+"..."},Te=t=>C(t)?t.filename||null:t.attachments&&t.attachments.length>0&&t.attachments[0].filename||null,ms=t=>t?new Date(t).toLocaleDateString("ro-RO",{day:"2-digit",month:"2-digit"}):"-",Ae=t=>new Intl.NumberFormat("ro-RO",{minimumFractionDigits:2,maximumFractionDigits:2}).format(t),mt=t=>({draft:"status-draft",pending_review:"status-pending",approved:"status-approved",rejected:"status-rejected",synced:"status-synced"})[t]||"",Le=t=>({draft:"Ciornă",pending_review:"În așteptare",approved:"Validat",rejected:"Respins",synced:"Sincronizat"})[t]||t,gs=t=>t?new Date(t).toLocaleDateString("ro-RO",{day:"2-digit",month:"2-digit",hour:"2-digit",minute:"2-digit"}):"-",ke=t=>!t.payment_methods||t.payment_methods.length===0?null:t.payment_methods.map(e=>`${e.method==="CARD"?"Card":"Num"} ${Ae(e.amount)}`).join(" / "),ae=async t=>{p.value.status!==t&&(p.value.status=t,await ve())},Ve=async t=>{p.value.processingStatus===t?p.value.processingStatus=null:p.value.processingStatus=t,await ve()},ve=async()=>{b.value=[],c.setFilters({status:p.value.status,search:p.value.search,direction:p.value.direction,dateFrom:p.value.dateFrom?p.value.dateFrom.toISOString().split("T")[0]:null,dateTo:p.value.dateTo?p.value.dateTo.toISOString().split("T")[0]:null,processingStatus:p.value.processingStatus}),await c.fetchReceipts()},Fe=async()=>{b.value=[],p.value={status:null,search:"",direction:null,dateFrom:null,dateTo:null,processingStatus:null},c.clearFilters(),await c.fetchReceipts()},ys=async()=>{await Fe(),S.value=!1},hs=async()=>{await ve(),S.value=!1},Ye=()=>{ue.value&&ue.value.click()},bs=async t=>{var a,x;const e=(a=t.target)==null?void 0:a.files;if(!e||e.length===0)return;const n=Array.from(e);(x=ce.value)!=null&&x.handleFiles&&await ce.value.handleFiles(n),ue.value&&(ue.value.value="")},_s=async t=>{console.log("[ReceiptsList] Bulk upload complete:",t),t.batchId&&M.startPolling(t.batchId,t.jobs),setTimeout(async()=>{await c.fetchReceipts(),await c.fetchStats(),je(t.batchId)},500)},Ss=async t=>{b.value=[],c.setPage(t.page+1),await c.fetchReceipts()},ws=async()=>{B.value.page>1&&(c.setPage(B.value.page-1),await c.fetchReceipts())},ks=async()=>{const t=Math.ceil(B.value.total/B.value.pageSize);B.value.page{console.log("[ReceiptsList] Navigating to create..."),F.push("/data-entry/create").catch(t=>{console.error("[ReceiptsList] Navigation error:",t)})},We=t=>{F.push(`/data-entry/${t}`)},Me=t=>{F.push(`/data-entry/${t}/edit`)},gt=t=>{const e=t.store_name||"Magazin necunoscut",n=t.total?new Intl.NumberFormat("ro-RO",{style:"currency",currency:"RON"}).format(t.total):"sumă necunoscută";D.require({message:`Ești sigur că vrei să ștergi bonul de la "${e}" în valoare de ${n}?`,header:"Șterge bonul?",icon:"pi pi-trash",acceptClass:"p-button-danger",rejectClass:"p-button-text",acceptLabel:"Șterge",rejectLabel:"Anulează",accept:async()=>{try{await c.deleteReceipt(t.id),d.add({severity:"success",summary:"Succes",detail:"Bonul a fost șters",life:3e3}),await c.fetchReceipts(),await c.fetchStats()}catch(a){d.add({severity:"error",summary:"Eroare",detail:a.message||"Nu s-a putut șterge bonul",life:5e3})}}})},Cs=t=>{D.require({message:'Sigur doriți să trimiteți bonul spre aprobare? Statusul va deveni "În așteptare".',header:"Confirmare trimitere",icon:"pi pi-send",acceptClass:"p-button-success",acceptLabel:"Trimite",rejectLabel:"Anulează",accept:async()=>{try{await c.submitReceipt(t.id),d.add({severity:"success",summary:"Succes",detail:"Bonul a fost trimis spre aprobare",life:3e3}),await c.fetchReceipts(),await c.fetchStats()}catch(e){d.add({severity:"error",summary:"Eroare",detail:e.message||"Nu s-a putut trimite bonul",life:5e3})}}})},xs=t=>{D.require({message:"Sigur doriți să validați acest bon?",header:"Confirmare validare",icon:"pi pi-check",acceptClass:"p-button-success",acceptLabel:"Validează",rejectLabel:"Anulează",accept:async()=>{try{await c.approveReceipt(t.id),d.add({severity:"success",summary:"Succes",detail:"Bonul a fost validat",life:3e3}),await c.fetchReceipts(),await c.fetchStats()}catch(e){d.add({severity:"error",summary:"Eroare",detail:e.message||"Nu s-a putut valida bonul",life:5e3})}}})},Es=t=>{D.require({message:'Sigur doriți să anulați validarea acestui bon? Bonul va reveni în starea "În așteptare".',header:"Confirmare anulare validare",icon:"pi pi-undo",acceptClass:"p-button-warning",acceptLabel:"Anulează Validarea",rejectLabel:"Renunță",accept:async()=>{try{await c.unapproveReceipt(t.id),d.add({severity:"success",summary:"Succes",detail:"Validarea a fost anulată",life:3e3}),await c.fetchReceipts(),await c.fetchStats()}catch(e){d.add({severity:"error",summary:"Eroare",detail:e.message||"Nu s-a putut anula validarea",life:5e3})}}})},Rs=t=>{re.value=t,Z.value="",X.value=!0},$s=async()=>{if(!(!re.value||Z.value.length<5))try{await c.rejectReceipt(re.value.id,Z.value),d.add({severity:"success",summary:"Succes",detail:"Bonul a fost respins",life:3e3}),X.value=!1,await c.fetchReceipts(),await c.fetchStats()}catch(t){d.add({severity:"error",summary:"Eroare",detail:t.message||"Nu s-a putut respinge bonul",life:5e3})}},Is=t=>{D.require({message:"Sigur doriți să retrimiteți bonul spre aprobare?",header:"Confirmare retrimitere",icon:"pi pi-replay",acceptClass:"p-button-success",acceptLabel:"Retrimite",rejectLabel:"Anulează",accept:async()=>{try{await c.resubmitReceipt(t.id),d.add({severity:"success",summary:"Succes",detail:"Bonul a fost retrimis spre aprobare",life:3e3}),await c.fetchReceipts(),await c.fetchStats()}catch(e){d.add({severity:"error",summary:"Eroare",detail:e.message||"Nu s-a putut retrimite bonul",life:5e3})}}})},Ts=async()=>{const t=b.value.filter(a=>a.status==="pending_review");if(!t.length)return;ie.value=!0;let e=0,n=0;for(const a of t)try{await c.approveReceipt(a.id),e++}catch{n++}ie.value=!1,b.value=[],e>0&&d.add({severity:"success",summary:"Succes",detail:`${e} bonuri validate`,life:3e3}),n>0&&d.add({severity:"warn",summary:"Atenție",detail:`${n} bonuri nu au putut fi validate`,life:5e3}),await c.fetchReceipts(),await c.fetchStats()},As=()=>{const t=b.value;if(t.length===0){d.add({severity:"warn",summary:"Atenție",detail:"Nu există bonuri selectate pentru export",life:3e3});return}const e=t.map(a=>({Magazin:a.store_name||a.partner_name||"-",CUI:a.cui||"-",Data:a.receipt_date?we(a.receipt_date):"-","Nr. Bon":a.receipt_number||"-","Tip Document":a.receipt_type==="receipt"?"Bon":a.receipt_type==="invoice"?"Factură":a.receipt_type||"-",Direcție:a.direction==="expense"?"Cheltuială":a.direction==="income"?"Venit":a.direction||"-",Suma:a.amount||0,TVA:a.tva_total||0,"Metodă Plată":ke(a)||"-",Status:Le(a.status)||"-","Creat de":a.created_by||"-","Creat la":a.created_at?we(a.created_at):"-"}));It(e,`bonuri_selectate_${t.length}`,"Bonuri").success?d.add({severity:"success",summary:"Export reușit",detail:`${t.length} bonuri exportate cu succes`,life:3e3}):d.add({severity:"error",summary:"Eroare",detail:"Nu s-a putut exporta lista de bonuri",life:5e3})},Ls=()=>{const t=be.value.filter(a=>!C(a));if(t.length===0){d.add({severity:"warn",summary:"Atenție",detail:"Nu există bonuri de exportat",life:3e3});return}const e=t.map(a=>({Magazin:a.store_name||a.partner_name||"-",CUI:a.cui||"-",Data:a.receipt_date?we(a.receipt_date):"-","Nr. Bon":a.receipt_number||"-","Tip Document":a.receipt_type==="receipt"?"Bon":a.receipt_type==="invoice"?"Factură":a.receipt_type||"-",Direcție:a.direction==="expense"?"Cheltuială":a.direction==="income"?"Venit":a.direction||"-",Suma:a.amount||0,TVA:a.tva_total||0,"Metodă Plată":ke(a)||"-",Status:Le(a.status)||"-","Creat de":a.created_by||"-","Creat la":a.created_at?we(a.created_at):"-"}));It(e,`bonuri_export_${t.length}`,"Bonuri").success?d.add({severity:"success",summary:"Export reușit",detail:`${t.length} bonuri exportate cu succes`,life:3e3}):d.add({severity:"error",summary:"Eroare",detail:"Nu s-a putut exporta lista de bonuri",life:5e3})},Fs=()=>{var x;const t=be.value.filter(v=>!C(v));if(t.length===0){d.add({severity:"warn",summary:"Atenție",detail:"Nu există bonuri de exportat",life:3e3});return}const e=t.map(v=>({store_name:v.store_name||v.partner_name||"-",cui:v.cui||"-",receipt_date:v.receipt_date?we(v.receipt_date):"-",receipt_number:v.receipt_number||"-",receipt_type:v.receipt_type==="receipt"?"Bon":v.receipt_type==="invoice"?"Factură":v.receipt_type||"-",direction:v.direction==="expense"?"Cheltuială":v.direction==="income"?"Venit":v.direction||"-",amount:v.amount||0,tva_total:v.tva_total||0,status:Le(v.status)||"-"}));fa(e,[{field:"store_name",header:"Magazin",type:"text",width:.22},{field:"cui",header:"CUI",type:"text",width:.1},{field:"receipt_date",header:"Data",type:"text",width:.1},{field:"receipt_number",header:"Nr. Bon",type:"text",width:.1},{field:"receipt_type",header:"Tip",type:"text",width:.08},{field:"direction",header:"Direcție",type:"text",width:.1},{field:"amount",header:"Suma",type:"number",width:.1},{field:"tva_total",header:"TVA",type:"number",width:.1},{field:"status",header:"Status",type:"text",width:.1}],`bonuri_export_${t.length}`,{companyName:((x=V.selectedCompany)==null?void 0:x.name)||"",title:"Lista Bonuri Fiscale",period:""}).success?d.add({severity:"success",summary:"Export reușit",detail:`${t.length} bonuri exportate cu succes (PDF)`,life:3e3}):d.add({severity:"error",summary:"Eroare",detail:"Nu s-a putut exporta lista de bonuri în format PDF",life:5e3})},yt=()=>{const t=b.value.length;t!==0&&D.require({message:`Ești sigur că vrei să ștergi ${t} ${t===1?"bon":"bonuri"}?`,header:"Confirmare ștergere",icon:"pi pi-exclamation-triangle",acceptClass:"p-button-danger",acceptLabel:"Șterge",rejectLabel:"Anulează",accept:async()=>{await Ds()}})},Ds=async()=>{var n,a,x;const t=b.value.map(v=>v.id),e=t.length;if(e!==0)try{const v=await c.bulkDeleteReceipts(t),le=((n=v.deleted)==null?void 0:n.length)||0,L=((a=v.failed)==null?void 0:a.length)||0;if(le>0&&c.removeReceiptsLocally(v.deleted),c.receipts.length===0&&B.value.page>1&&(c.setPage(B.value.page-1),await c.fetchReceipts()),b.value=[],j.value=!1,await c.fetchStats(),L===0&&le>0)d.add({severity:"success",summary:"Succes",detail:`${le} ${le===1?"bon șters":"bonuri șterse"}`,life:3e3});else if(le>0&&L>0)d.add({severity:"warn",summary:"Ștergere parțială",detail:`${le} din ${e} șterse, ${L} au eșuat`,life:5e3});else if(le===0&&L>0){const Ne=((x=v.failed[0])==null?void 0:x.error)||"Eroare necunoscută";d.add({severity:"error",summary:"Eroare",detail:L===1?Ne:`${L} bonuri nu au putut fi șterse`,life:5e3})}}catch(v){d.add({severity:"error",summary:"Eroare",detail:v.message||"Eroare la ștergerea bonurilor",life:5e3})}},ht=async t=>{te.value[t.id]=!0;try{const e=await c.retryReceipt(t.id);d.add({severity:"success",summary:"Succes",detail:e.message||"Bon reîncarcat în procesare",life:3e3}),await c.fetchReceipts(),await c.fetchStats()}catch(e){d.add({severity:"error",summary:"Eroare",detail:e.message||"Fișierul original nu mai este disponibil",life:5e3})}finally{delete te.value[t.id]}},zs=async t=>{me.value[t]=!0;try{const e=await c.retryBatchFailed(t);e.success&&d.add({severity:"success",summary:"Succes",detail:e.message,life:3e3}),e.failed_count>0&&d.add({severity:"warn",summary:"Atenție",detail:`${e.failed_count} bonuri nu au putut fi reîncarcate`,life:5e3}),await c.fetchReceipts(),await c.fetchStats()}catch(e){d.add({severity:"error",summary:"Eroare",detail:e.message||"Nu s-au putut reîncărca bonurile",life:5e3})}finally{delete me.value[t]}},Bs=t=>{D.require({message:`Anulezi procesarea pentru "${t.filename}"?`,header:"Confirmare anulare",icon:"pi pi-times-circle",acceptClass:"p-button-danger",acceptLabel:"Anulează",rejectLabel:"Nu",accept:async()=>{await Vs(t.job_id,t.filename)}})},Ps=t=>new Promise(e=>setTimeout(e,t)),Vs=async(t,e)=>{k.value[t]=!0,m.value.add(t),m.value=new Set(m.value),await Ps(Ul);try{const n=await M.cancelJob(t);n.success?d.add({severity:"success",summary:"Succes",detail:`Procesarea pentru "${e}" a fost anulată`,life:3e3}):(m.value.delete(t),m.value=new Set(m.value),d.add({severity:"error",summary:"Eroare",detail:n.message||"Nu s-a putut anula procesarea",life:5e3}))}catch(n){m.value.delete(t),m.value=new Set(m.value),d.add({severity:"error",summary:"Eroare",detail:n.message||"Nu s-a putut anula procesarea",life:5e3})}finally{delete k.value[t],m.value.delete(t),m.value=new Set(m.value)}},Ms=t=>{const{batchId:e,pendingProcessingCount:n,completedCount:a}=t;let x=`Anulezi procesarea pentru ${n} ${n===1?"fișier":"fișiere"}?`;a>0&&(x+=` - -Bonurile deja procesate (${a}) vor rămâne în sistem.`),D.require({message:x,header:"Confirmare anulare batch",icon:"pi pi-times-circle",acceptClass:"p-button-danger",acceptLabel:"Anulează tot",rejectLabel:"Nu",accept:async()=>{await js(e)}})},js=async(t,e)=>{try{const n=await M.cancelBatch(t);n.success?d.add({severity:"success",summary:"Succes",detail:n.message||`${n.cancelledCount} fișiere anulate`,life:3e3}):d.add({severity:"error",summary:"Eroare",detail:n.message||"Nu s-a putut anula batch-ul",life:5e3})}catch(n){d.add({severity:"error",summary:"Eroare",detail:n.message||"Nu s-a putut anula batch-ul",life:5e3})}},Ns=async(t,e)=>{console.log("[ReceiptsList] Job transitions detected:",{completedReceiptIds:t,failedJobIds:e});for(const n of t)y.value.add(n),setTimeout(()=>{y.value.delete(n),y.value=new Set(y.value)},xe);t.length>0&&(y.value=new Set(y.value));for(const n of e){const a=`job_${n}`;w.value.add(a),setTimeout(()=>{w.value.delete(a),w.value=new Set(w.value)},xe)}if(e.length>0&&(w.value=new Set(w.value)),t.length>0){console.log("[ReceiptsList] Fetching completed receipts individually to preserve order");for(const n of t)try{const a=await c.fetchReceiptById(n);a&&(c.insertReceiptInPlace(a),console.log(`[ReceiptsList] Receipt ${n} inserted in place`))}catch(a){console.error(`[ReceiptsList] Failed to fetch receipt ${n}:`,a)}await c.fetchStats()}},Us=async()=>{const t=M.getStoredBatchIds();if(t.length===0){console.log("[ReceiptsList] No stored batch IDs found"),pe.value>0&&(console.log("[ReceiptsList] Found processing receipts in DB, connecting SSE"),je());return}console.log("[ReceiptsList] Found stored batch IDs:",t);let e=0;for(const n of t){const a=await M.restoreJobsFromBatch(n);a.hasActiveJobs&&(e+=a.jobCount)}e>0?(console.log(`[ReceiptsList] Restored ${e} active jobs from stored batches`),je(),d.add({severity:"info",summary:"Procesare în curs detectată",detail:`${e} ${e===1?"fișier":"fișiere"} în procesare`,life:4e3})):(console.log("[ReceiptsList] No active jobs found in stored batches"),pe.value>0&&(je(),d.add({severity:"info",summary:"Procesare în curs detectată",detail:"Se actualizează statusul automat...",life:4e3})))},je=(t=null)=>{if(z){console.log("[ReceiptsList] SSE already connected");return}console.log("[ReceiptsList] Connecting to SSE for real-time updates"),Ce.connect(t),z=!0},Ze=()=>{z&&(console.log("[ReceiptsList] Disconnecting from SSE"),Ce.disconnect(),z=!1)},Os=async t=>{console.log("[ReceiptsList] SSE status change received:",t);const e={};if(t.status!==void 0&&(e.status=t.status),t.processing_status!==void 0&&(e.processing_status=t.processing_status),c.updateReceiptInPlace(t.receipt_id,e))console.log(`[ReceiptsList] Receipt ${t.receipt_id} updated in place via SSE`),t.processing_status==="completed"?(y.value.add(t.receipt_id),y.value=new Set(y.value),setTimeout(()=>{y.value.delete(t.receipt_id),y.value=new Set(y.value)},xe)):t.processing_status==="failed"&&(w.value.add(t.receipt_id),w.value=new Set(w.value),setTimeout(()=>{w.value.delete(t.receipt_id),w.value=new Set(w.value)},xe));else{console.log(`[ReceiptsList] Receipt ${t.receipt_id} not found in current list`);const a=M.getStoredBatchIds();if(t.batch_id&&a.includes(t.batch_id)){console.log(`[ReceiptsList] Receipt ${t.receipt_id} belongs to active batch ${t.batch_id}, fetching individually...`);try{const v=await c.fetchReceiptById(t.receipt_id);v&&(c.insertReceiptInPlace(v),console.log(`[ReceiptsList] Receipt ${t.receipt_id} inserted into list`),t.processing_status==="completed"?(y.value.add(t.receipt_id),y.value=new Set(y.value),setTimeout(()=>{y.value.delete(t.receipt_id),y.value=new Set(y.value)},xe)):t.processing_status==="failed"&&(w.value.add(t.receipt_id),w.value=new Set(w.value),setTimeout(()=>{w.value.delete(t.receipt_id),w.value=new Set(w.value)},xe)))}catch(v){console.error(`[ReceiptsList] Failed to fetch receipt ${t.receipt_id}:`,v)}}else console.log(`[ReceiptsList] Receipt ${t.receipt_id} not in active batch, skipping list refresh`);await c.fetchStats()}await Js()},Js=async()=>{await c.fetchStats(),pe.value===0&&(console.log("[ReceiptsList] All processing complete, disconnecting SSE"),Ze(),M.clearAllStoredBatches(),d.add({severity:"success",summary:"Procesare completă",detail:"Toate bonurile au fost procesate",life:4e3}))};return(t,e)=>{var bt,_t,St,wt,kt,Ct,xt,Et,Rt,$t;const n=fe("Button"),a=fe("Badge"),x=fe("InputText"),v=fe("Calendar"),le=fe("ProgressSpinner"),L=fe("Column"),Ne=fe("Tag"),qs=fe("DataTable"),q=jt("tooltip");return s(),o("div",{class:P(["receipts-list-view",{"mobile-android-layout":A.value}])},[u(ha,{ref_key:"dragDropOverlayRef",ref:ce,onUploadComplete:_s},null,512),l("input",{ref_key:"bulkFileInputRef",ref:ue,type:"file",multiple:"",accept:".pdf,.png,.jpg,.jpeg,application/pdf,image/png,image/jpeg",class:"hidden-file-input",onChange:bs},null,544),u(N(oa),{visible:X.value,"onUpdate:visible":e[2]||(e[2]=i=>X.value=i),header:"Respingere bon",modal:!0,closable:!0,style:{width:"400px"}},{footer:T(()=>[u(n,{label:"Anulează",severity:"secondary",onClick:e[1]||(e[1]=i=>X.value=!1)}),u(n,{label:"Respinge",severity:"danger",icon:"pi pi-times",disabled:Z.value.length<5,onClick:$s},null,8,["disabled"])]),default:T(()=>[l("div",ei,[e[32]||(e[32]=l("p",null,"Motivul respingerii (minim 5 caractere):",-1)),u(N(ea),{modelValue:Z.value,"onUpdate:modelValue":e[0]||(e[0]=i=>Z.value=i),rows:"3",class:"w-full",placeholder:"Introduceți motivul respingerii..."},null,8,["modelValue"])])]),_:1},8,["visible"]),A.value?(s(),G(pa,{key:0,title:j.value?`${b.value.length} selectate`:"Bonuri","show-back":j.value,"show-menu":!j.value,"selection-active":j.value,actions:Wt.value,onBackClick:He,onMenuClick:e[3]||(e[3]=i=>de.value=!0),onActionClick:Zt},null,8,["title","show-back","show-menu","selection-active","actions"])):f("",!0),A.value&&Q.value&&!j.value?(s(),o("div",ti,[l("div",si,[l("span",{class:P(["mobile-filter-chip",{active:!p.value.status&&!p.value.processingStatus}]),onClick:e[4]||(e[4]=i=>ae(null))},[e[33]||(e[33]=h(" Toate ",-1)),u(a,{value:((bt=Q.value.total)==null?void 0:bt.count)||0,class:"chip-badge"},null,8,["value"])],2),l("span",{class:P(["mobile-filter-chip chip-draft",{active:p.value.status==="draft"}]),onClick:e[5]||(e[5]=i=>ae("draft"))},[e[34]||(e[34]=h(" Ciorne ",-1)),u(a,{value:((_t=Q.value.draft)==null?void 0:_t.count)||0,severity:"info",class:"chip-badge"},null,8,["value"])],2),l("span",{class:P(["mobile-filter-chip chip-pending",{active:p.value.status==="pending_review"}]),onClick:e[6]||(e[6]=i=>ae("pending_review"))},[e[35]||(e[35]=h(" În așteptare ",-1)),u(a,{value:((St=Q.value.pending_review)==null?void 0:St.count)||0,severity:"warning",class:"chip-badge"},null,8,["value"])],2),l("span",{class:P(["mobile-filter-chip chip-approved",{active:p.value.status==="approved"}]),onClick:e[7]||(e[7]=i=>ae("approved"))},[e[36]||(e[36]=h(" Validate ",-1)),u(a,{value:((wt=Q.value.approved)==null?void 0:wt.count)||0,severity:"success",class:"chip-badge"},null,8,["value"])],2),l("span",{class:P(["mobile-filter-chip chip-rejected",{active:p.value.status==="rejected"}]),onClick:e[8]||(e[8]=i=>ae("rejected"))},[e[37]||(e[37]=h(" Respinse ",-1)),u(a,{value:((kt=Q.value.rejected)==null?void 0:kt.count)||0,severity:"danger",class:"chip-badge"},null,8,["value"])],2),pe.value>0?(s(),o("span",{key:0,class:P(["mobile-filter-chip chip-processing",{active:p.value.processingStatus==="in_processing"}]),onClick:e[9]||(e[9]=i=>Ve("in_processing"))},[e[38]||(e[38]=l("i",{class:"pi pi-spin pi-spinner"},null,-1)),e[39]||(e[39]=h(" În procesare ",-1)),u(a,{value:pe.value,class:"chip-badge"},null,8,["value"])],2)):f("",!0),Pe.value>0?(s(),o("span",{key:1,class:P(["mobile-filter-chip chip-failed",{active:p.value.processingStatus==="failed"}]),onClick:e[10]||(e[10]=i=>Ve("failed"))},[e[40]||(e[40]=l("i",{class:"pi pi-exclamation-triangle"},null,-1)),e[41]||(e[41]=h(" Cu erori ",-1)),u(a,{value:Pe.value,class:"chip-badge"},null,8,["value"])],2)):f("",!0)])])):f("",!0),u(N(Qe),{ref_key:"moreMenuRef",ref:ge,model:Ht.value,popup:!0},null,8,["model"]),u(ca,{modelValue:de.value,"onUpdate:modelValue":e[11]||(e[11]=i=>de.value=i),user:N(Y).user,"companies-store":N(V),"period-store":N(K),"available-servers":N(Y).availableServers,"current-server-id":N(Y).selectedServerId,"auth-store":N(Y),onLogout:qt,onServerSwitched:Gt},null,8,["modelValue","user","companies-store","period-store","available-servers","current-server-id","auth-store"]),u(ua,{modelValue:S.value,"onUpdate:modelValue":e[17]||(e[17]=i=>S.value=i)},{default:T(()=>[e[47]||(e[47]=l("h3",{class:"bottom-sheet-title"},"Filtre",-1)),l("div",ai,[l("div",ii,[e[42]||(e[42]=l("label",{class:"form-label"},"Status",-1)),u(N(et),{modelValue:p.value.status,"onUpdate:modelValue":e[12]||(e[12]=i=>p.value.status=i),options:ts,optionLabel:"label",optionValue:"value",placeholder:"Toate statusurile",class:"w-full"},null,8,["modelValue"])]),l("div",li,[e[43]||(e[43]=l("label",{class:"form-label"},"Căutare",-1)),u(x,{modelValue:p.value.search,"onUpdate:modelValue":e[13]||(e[13]=i=>p.value.search=i),placeholder:"Caută furnizor, CUI, nr. bon...",class:"w-full"},null,8,["modelValue"])]),l("div",ni,[e[44]||(e[44]=l("label",{class:"form-label"},"Tip",-1)),u(N(et),{modelValue:p.value.direction,"onUpdate:modelValue":e[14]||(e[14]=i=>p.value.direction=i),options:ut,optionLabel:"label",optionValue:"value",placeholder:"Toate tipurile",class:"w-full"},null,8,["modelValue"])]),l("div",oi,[e[45]||(e[45]=l("label",{class:"form-label"},"De la data",-1)),u(v,{modelValue:p.value.dateFrom,"onUpdate:modelValue":e[15]||(e[15]=i=>p.value.dateFrom=i),dateFormat:"dd.mm.yy",placeholder:"Selectează data",showIcon:"",class:"w-full"},null,8,["modelValue"])]),l("div",ri,[e[46]||(e[46]=l("label",{class:"form-label"},"Până la data",-1)),u(v,{modelValue:p.value.dateTo,"onUpdate:modelValue":e[16]||(e[16]=i=>p.value.dateTo=i),dateFormat:"dd.mm.yy",placeholder:"Selectează data",showIcon:"",class:"w-full"},null,8,["modelValue"])]),l("div",ci,[u(n,{icon:"pi pi-filter-slash",label:"Resetează",class:"p-button-outlined p-button-secondary",onClick:ys}),u(n,{icon:"pi pi-check",label:"Aplică",onClick:hs})])])]),_:1},8,["modelValue"]),A.value?f("",!0):(s(),o("div",ui,[...e[48]||(e[48]=[l("h1",{class:"page-title"},"Lista Bonuri Fiscale",-1)])])),l("div",di,[Q.value&&!A.value?(s(),o("div",pi,[l("div",vi,[l("span",{class:P(["status-chip",{active:!p.value.status&&!p.value.processingStatus}]),onClick:e[18]||(e[18]=i=>ae(null))},[e[49]||(e[49]=h(" Toate ",-1)),u(a,{value:((Ct=Q.value.total)==null?void 0:Ct.count)||0},null,8,["value"])],2),l("span",{class:P(["status-chip status-draft",{active:p.value.status==="draft"}]),onClick:e[19]||(e[19]=i=>ae("draft"))},[e[50]||(e[50]=h(" Ciorne ",-1)),u(a,{value:((xt=Q.value.draft)==null?void 0:xt.count)||0,severity:"info"},null,8,["value"])],2),l("span",{class:P(["status-chip status-pending",{active:p.value.status==="pending_review"}]),onClick:e[20]||(e[20]=i=>ae("pending_review"))},[e[51]||(e[51]=h(" În așteptare ",-1)),u(a,{value:((Et=Q.value.pending_review)==null?void 0:Et.count)||0,severity:"warning"},null,8,["value"])],2),l("span",{class:P(["status-chip status-approved",{active:p.value.status==="approved"}]),onClick:e[21]||(e[21]=i=>ae("approved"))},[e[52]||(e[52]=h(" Validate ",-1)),u(a,{value:((Rt=Q.value.approved)==null?void 0:Rt.count)||0,severity:"success"},null,8,["value"])],2),l("span",{class:P(["status-chip status-rejected",{active:p.value.status==="rejected"}]),onClick:e[22]||(e[22]=i=>ae("rejected"))},[e[53]||(e[53]=h(" Respinse ",-1)),u(a,{value:(($t=Q.value.rejected)==null?void 0:$t.count)||0,severity:"danger"},null,8,["value"])],2),pe.value>0?(s(),o("span",{key:0,class:P(["status-chip processing-chip-in-progress",{active:p.value.processingStatus==="in_processing"}]),onClick:e[23]||(e[23]=i=>Ve("in_processing"))},[e[54]||(e[54]=l("i",{class:"pi pi-spin pi-spinner",style:{"font-size":"0.75rem"}},null,-1)),e[55]||(e[55]=h(" În procesare ",-1)),u(a,{value:pe.value},null,8,["value"])],2)):f("",!0),Pe.value>0?(s(),o("span",{key:1,class:P(["status-chip processing-chip-failed",{active:p.value.processingStatus==="failed"}]),onClick:e[24]||(e[24]=i=>Ve("failed"))},[e[56]||(e[56]=l("i",{class:"pi pi-exclamation-triangle",style:{"font-size":"0.75rem"}},null,-1)),e[57]||(e[57]=h(" Cu erori ",-1)),u(a,{value:Pe.value},null,8,["value"])],2)):f("",!0)]),A.value?f("",!0):(s(),o("div",fi,[u(n,{label:"Upload Bonuri",icon:"pi pi-cloud-upload",severity:"info",outlined:"",onClick:Ye}),u(n,{label:"Bon Nou",icon:"pi pi-plus",severity:"success",raised:"",onClick:Xe})]))])):f("",!0),A.value?(s(),o("div",mi,[l("div",gi,[u(n,{icon:"pi pi-filter",label:"Filtre",class:P({"filter-active":qe.value}),severity:"secondary",outlined:"",size:"small",onClick:e[25]||(e[25]=i=>S.value=!S.value)},null,8,["class"]),U(u(n,{icon:"pi pi-refresh",severity:"secondary",outlined:"",size:"small",loading:Oe.value,onClick:Fe},null,8,["loading"]),[[q,"Resetează filtrele",void 0,{bottom:!0}]])]),l("div",yi,[u(n,{icon:"pi pi-cloud-upload",label:"Upload",severity:"info",size:"small",outlined:"",onClick:Ye}),u(n,{label:"Bon Nou",icon:"pi pi-plus",severity:"success",size:"small",raised:"",onClick:Xe})])])):f("",!0),A.value?f("",!0):(s(),o("div",hi,[u(x,{modelValue:p.value.search,"onUpdate:modelValue":e[26]||(e[26]=i=>p.value.search=i),placeholder:"Caută furnizor, CUI, nr. bon...",class:"filter-search",onKeyup:Xs(ve,["enter"])},{prefix:T(()=>[...e[58]||(e[58]=[l("i",{class:"pi pi-search"},null,-1)])]),_:1},8,["modelValue"]),u(N(et),{modelValue:p.value.direction,"onUpdate:modelValue":e[27]||(e[27]=i=>p.value.direction=i),options:ut,optionLabel:"label",optionValue:"value",placeholder:"Tip",class:"filter-direction",onChange:ve},null,8,["modelValue"]),u(v,{modelValue:p.value.dateFrom,"onUpdate:modelValue":e[28]||(e[28]=i=>p.value.dateFrom=i),dateFormat:"dd.mm.yy",placeholder:"De la",showIcon:"",class:"filter-date",onDateSelect:ve},null,8,["modelValue"]),u(v,{modelValue:p.value.dateTo,"onUpdate:modelValue":e[29]||(e[29]=i=>p.value.dateTo=i),dateFormat:"dd.mm.yy",placeholder:"Până la",showIcon:"",class:"filter-date",onDateSelect:ve},null,8,["modelValue"]),A.value?f("",!0):(s(),o("div",bi,[U(u(n,{icon:"pi pi-filter",class:P({"filter-active":qe.value}),severity:"secondary",outlined:"",size:"small",onClick:ve},null,8,["class"]),[[q,"Filtrează",void 0,{bottom:!0}]]),U(u(n,{icon:"pi pi-filter-slash",severity:"secondary",outlined:"",size:"small",onClick:Fe},null,512),[[q,"Resetează filtrele",void 0,{bottom:!0}]]),U(u(n,{icon:"pi pi-download",severity:"secondary",outlined:"",size:"small",onClick:Kt,"aria-haspopup":"true","aria-controls":"export_menu"},null,512),[[q,"Export",void 0,{bottom:!0}]]),u(N(Qe),{ref_key:"exportMenuRef",ref:he,id:"export_menu",model:Yt.value,popup:!0},null,8,["model"])]))])),Oe.value?(s(),o("div",_i,[u(le)])):be.value.length?A.value?(s(),o("div",wi,[j.value?(s(),o("div",ki,[l("div",Ci,[u(n,{icon:"pi pi-times",text:"",rounded:"",severity:"secondary",onClick:He,class:"exit-selection-btn"}),l("span",xi,g(b.value.length)+" selectate",1)]),l("div",Ei,[u(n,{label:"Toate",icon:"pi pi-check-square",text:"",size:"small",onClick:vt})])])):f("",!0),(s(!0),o(O,null,st(be.value,i=>{var r;return s(),o("div",{key:Be(i),class:P(["receipt-card",[ls(i),{"card-selected":j.value&&_e(i)}]]),onClick:J=>ps(J,i),onTouchstart:J=>cs(J,i),onTouchmove:us,onTouchend:ds},[C(i)?(s(),o(O,{key:0},[l("div",$i,[l("div",Ii,[l("span",Ti,[e[60]||(e[60]=l("i",{class:"pi pi-file"},null,-1)),h(" "+g(i.filename),1)]),i.processing_status==="failed"?(s(),o("span",Ai," Eroare OCR ")):(s(),o("span",Li,"Se procesează..."))]),e[63]||(e[63]=l("div",{class:"amount-block"},[l("span",{class:"amount text-muted"},"-")],-1)),i.processing_status==="failed"?(s(),o("span",Fi,[...e[61]||(e[61]=[l("i",{class:"pi pi-exclamation-triangle"},null,-1)])])):(s(),o("span",Di,[...e[62]||(e[62]=[l("i",{class:"pi pi-spin pi-spinner"},null,-1)])]))]),l("div",zi,[i.processing_status==="failed"&&i.processing_error?U((s(),o("span",Bi,[h(g(fs(i.processing_error)),1)])),[[q,i.processing_error,void 0,{top:!0}]]):i.processing_status==="failed"?(s(),o("span",Pi," Procesare eșuată ")):(s(),o("span",Vi,"În procesare"))]),l("div",Mi,[i.processing_status==="failed"?U((s(),o("span",ji,[...e[64]||(e[64]=[l("i",{class:"pi pi-exclamation-triangle"},null,-1),h(" Eroare ",-1)])])),[[q,i.processing_error||"Eroare la procesare",void 0,{top:!0}]]):(s(),o("span",Ni,[e[65]||(e[65]=l("i",{class:"pi pi-spin pi-spinner"},null,-1)),h(" "+g(i.processing_status==="pending"?"În așteptare":"Procesare"),1)])),i.batch_id?(s(),o("span",Ui,[...e[66]||(e[66]=[l("i",{class:"pi pi-folder"},null,-1),h(" Lot ",-1)])])):f("",!0)])],64)):(s(),o(O,{key:1},[j.value&&_e(i)?(s(),o("div",Oi,[...e[67]||(e[67]=[l("i",{class:"pi pi-check"},null,-1)])])):f("",!0),l("div",Ji,[l("div",qi,[l("span",Gi,g(i.partner_name||"-"),1),i.cui?(s(),o("span",Hi,g(i.cui),1)):f("",!0),Te(i)?(s(),o("span",Ki,[e[68]||(e[68]=l("i",{class:"pi pi-file"},null,-1)),h(" "+g(Ke(Te(i))),1)])):f("",!0)]),l("div",Yi,[l("span",Xi,g(Ae(i.amount)),1),i.tva_total?(s(),o("span",Wi,"TVA "+g(Ae(i.tva_total)),1)):f("",!0),ke(i)?(s(),o("span",Zi,g(ke(i)),1)):f("",!0)]),u(n,{icon:"pi pi-ellipsis-v",text:"",rounded:"",size:"small",disabled:ee(i),onClick:ne(J=>ct(J,i),["stop"])},null,8,["disabled","onClick"])]),l("div",Qi,[l("span",null,g(ms(i.receipt_date)),1),i.receipt_number?(s(),o("span",el,"•")):f("",!0),i.receipt_number?(s(),o("span",tl,"Nr. "+g(i.receipt_number),1)):f("",!0),e[69]||(e[69]=l("span",{class:"sep"},"•",-1)),l("span",null,g(i.receipt_type==="bon_fiscal"?"Bon":"Chit"),1),e[70]||(e[70]=l("span",{class:"sep"},"•",-1)),l("span",{class:P(i.direction==="cheltuiala"?"direction-out":"direction-in")},g(i.direction==="cheltuiala"?"Plată":"Încasare"),3)]),l("div",sl,[l("span",{class:P(["status-badge-small",mt(i.status)])},g(Le(i.status)),3),i.processing_status==="pending"||i.processing_status==="processing"?(s(),o("span",al,[...e[71]||(e[71]=[l("i",{class:"pi pi-spin pi-spinner"},null,-1),h(" Procesare ",-1)])])):i.processing_status==="failed"?U((s(),o("span",il,[...e[72]||(e[72]=[l("i",{class:"pi pi-exclamation-triangle"},null,-1),h(" Eroare ",-1)])])),[[q,i.processing_error,void 0,{top:!0}]]):f("",!0),i.batch_id?(s(),o("span",ll,[...e[73]||(e[73]=[l("i",{class:"pi pi-folder"},null,-1),h(" Lot ",-1)])])):f("",!0),l("span",nl,g(i.created_by),1),(r=i.attachments)!=null&&r.length?(s(),o("span",ol,[e[74]||(e[74]=l("i",{class:"pi pi-paperclip"},null,-1)),h(g(i.attachments.length),1)])):f("",!0),i.processing_status==="failed"?(s(),o(O,{key:4},[U(u(n,{icon:"pi pi-pencil",severity:"secondary",text:"",rounded:"",size:"small",class:"edit-btn-mobile",onClick:ne(J=>Me(i.id),["stop"])},null,8,["onClick"]),[[q,"Editează manual",void 0,{top:!0}]]),u(n,{icon:"pi pi-refresh",severity:"warning",text:"",rounded:"",size:"small",class:"retry-btn-mobile",loading:te.value[i.id],onClick:ne(J=>ht(i),["stop"])},null,8,["loading","onClick"])],64)):f("",!0)])],64))],42,Ri)}),128)),B.value.total>B.value.pageSize?(s(),o("div",rl,[u(n,{icon:"pi pi-chevron-left",size:"small",severity:"secondary",disabled:B.value.page<=1,onClick:ws},null,8,["disabled"]),l("span",cl,g(B.value.page)+" / "+g(Math.ceil(B.value.total/B.value.pageSize)),1),u(n,{icon:"pi pi-chevron-right",size:"small",severity:"secondary",disabled:B.value.page>=Math.ceil(B.value.total/B.value.pageSize),onClick:ks},null,8,["disabled"])])):f("",!0)])):f("",!0):(s(),o("div",Si,[...e[59]||(e[59]=[l("i",{class:"pi pi-inbox"},null,-1),l("h3",null,"Niciun bon găsit",-1),l("p",null,'Creează primul bon fiscal folosind butonul "Bon Nou"',-1)])])),!A.value&&!Oe.value&&be.value.length?(s(),o("div",ul,[b.value.length>0?(s(),o("div",dl,[l("span",pl,[e[75]||(e[75]=l("i",{class:"pi pi-check-square"},null,-1)),h(" "+g(b.value.length)+" selectate ",1)]),l("div",vl,[b.value.every(i=>i.status==="pending_review")?(s(),G(n,{key:0,label:"Validează selectate",icon:"pi pi-check",severity:"success",size:"small",loading:ie.value,onClick:Ts},null,8,["loading"])):f("",!0),u(n,{label:"Șterge",icon:"pi pi-trash",severity:"danger",size:"small",onClick:yt}),u(n,{label:"Deselectează",icon:"pi pi-times",severity:"secondary",size:"small",onClick:e[30]||(e[30]=i=>b.value=[])})])])):f("",!0),l("div",fl,[(s(!0),o(O,null,st(dt.value,i=>(s(),o("div",{key:i.batchId||"__manual__",class:"batch-group"},[u(Da,{"batch-id":i.batchId,"processing-started-at":i.processingStartedAt,items:i.items,"is-expanded":ft(i.batchId),retrying:me.value[i.batchId],onToggle:r=>vs(i.batchId),onRetryAll:zs,onCancelAll:Ms},null,8,["batch-id","processing-started-at","items","is-expanded","retrying","onToggle"]),U(l("div",ml,[u(qs,{selection:b.value,"onUpdate:selection":e[31]||(e[31]=r=>b.value=r),value:i.items,responsiveLayout:"scroll",stripedRows:"",class:"compact-table grouped-table",dataKey:r=>Be(r),rowClass:is},{default:T(()=>[u(L,{headerStyle:"width: 3rem"},{header:T(()=>[u(N(tt),{modelValue:os(i.items),disabled:!ns(i.items),"onUpdate:modelValue":r=>rs(i.items,r),binary:""},null,8,["modelValue","disabled","onUpdate:modelValue"])]),body:T(({data:r})=>[ee(r)?U((s(),G(N(tt),{key:1,modelValue:!1,disabled:!0,binary:""},null,512)),[[q,Bt,void 0,{top:!0}]]):(s(),G(N(tt),{key:0,modelValue:_e(r),"onUpdate:modelValue":J=>Ge(r,J),binary:""},null,8,["modelValue","onUpdate:modelValue"]))]),_:2},1024),u(L,{field:"filename",header:"Fișier",style:{"min-width":"140px"}},{body:T(({data:r})=>[C(r)?U((s(),o("span",gl,[e[76]||(e[76]=l("i",{class:"pi pi-file"},null,-1)),h(" "+g(Ke(r.filename)),1)])),[[q,r.filename,void 0,{top:!0}]]):(s(),o(O,{key:1},[Te(r)?U((s(),o("span",yl,[e[77]||(e[77]=l("i",{class:"pi pi-file"},null,-1)),h(" "+g(Ke(Te(r))),1)])),[[q,Te(r),void 0,{top:!0}]]):(s(),o("span",hl,"-"))],64))]),_:1}),u(L,{field:"receipt_date",header:"Data",style:{width:"90px"}},{body:T(({data:r})=>[C(r)?(s(),o("span",bl,"-")):(s(),o(O,{key:1},[h(g(we(r.receipt_date)),1)],64))]),_:1}),u(L,{field:"receipt_number",header:"Nr.",style:{width:"80px"}},{body:T(({data:r})=>[C(r)?(s(),o("span",_l,"-")):(s(),o(O,{key:1},[h(g(r.receipt_number||"-"),1)],64))]),_:1}),u(L,{field:"receipt_type",header:"Doc",style:{width:"60px"}},{body:T(({data:r})=>[C(r)?(s(),o("span",Sl,"-")):(s(),G(Ne,{key:1,value:r.receipt_type==="bon_fiscal"?"Bon":"Chit",size:"small"},null,8,["value"]))]),_:1}),u(L,{field:"direction",header:"Tip",style:{width:"70px"}},{body:T(({data:r})=>[C(r)?(s(),o("span",wl,"-")):(s(),G(Ne,{key:1,value:r.direction==="cheltuiala"?"Plată":"Încas.",severity:r.direction==="cheltuiala"?"danger":"success",size:"small"},null,8,["value","severity"]))]),_:1}),u(L,{field:"partner_name",header:"Furnizor/Client",style:{"min-width":"120px"}},{body:T(({data:r})=>[C(r)?(s(),o("span",kl,"-")):(s(),o(O,{key:1},[h(g(r.partner_name||"-"),1)],64))]),_:1}),u(L,{field:"cui",header:"CUI",style:{width:"100px"}},{body:T(({data:r})=>[C(r)?(s(),o("span",Cl,"-")):(s(),o(O,{key:1},[h(g(r.cui||"-"),1)],64))]),_:1}),u(L,{field:"amount",header:"Suma",style:{width:"90px"}},{body:T(({data:r})=>[C(r)?(s(),o("span",xl,"-")):(s(),o("strong",El,g(Ae(r.amount)),1))]),_:1}),u(L,{field:"tva_total",header:"TVA",style:{width:"70px"}},{body:T(({data:r})=>[C(r)?(s(),o("span",Rl,"-")):(s(),o(O,{key:1},[r.tva_total?(s(),o("span",$l,g(Ae(r.tva_total)),1)):(s(),o("span",Il,"-"))],64))]),_:1}),u(L,{field:"payment_methods",header:"Plată",style:{width:"100px"}},{body:T(({data:r})=>[C(r)?(s(),o("span",Tl,"-")):(s(),o(O,{key:1},[ke(r)?(s(),o("span",Al,g(ke(r)),1)):(s(),o("span",Ll,"-"))],64))]),_:1}),u(L,{field:"created_by",header:"Creat de",style:{width:"100px"}},{body:T(({data:r})=>[C(r)?(s(),o("span",Fl,"-")):(s(),o(O,{key:1},[h(g(r.created_by||"-"),1)],64))]),_:1}),u(L,{field:"created_at",header:"Creat la",style:{width:"120px"}},{body:T(({data:r})=>[C(r)?(s(),o("span",Dl,"-")):(s(),o(O,{key:1},[h(g(gs(r.created_at)),1)],64))]),_:1}),u(L,{field:"status",header:"Status",style:{width:"100px"}},{body:T(({data:r})=>[C(r)?(s(),o("span",zl,"-")):(s(),o("span",{key:1,class:P(["status-badge",mt(r.status)])},g(Le(r.status)),3))]),_:1}),u(L,{field:"processing_status",header:"Procesare",style:{width:"120px"}},{body:T(({data:r})=>[u(Ja,{status:r.processing_status,"batch-id":r.batch_id,"processing-error":r.processing_error},null,8,["status","batch-id","processing-error"])]),_:1}),u(L,{field:"attachments",header:"Ataș.",style:{width:"60px"}},{body:T(({data:r})=>{var J;return[C(r)?(s(),o("span",Bl,"-")):(s(),G(a,{key:1,value:((J=r.attachments)==null?void 0:J.length)||0},null,8,["value"]))]}),_:1}),u(L,{header:"Acțiuni",style:{width:"120px"}},{body:T(({data:r})=>[l("div",Pl,[C(r)?f("",!0):(s(),G(n,{key:0,icon:"pi pi-eye",severity:"info",text:"",rounded:"",size:"small",onClick:J=>We(r.id)},null,8,["onClick"])),!C(r)&&r.processing_status==="failed"?U((s(),G(n,{key:1,icon:"pi pi-refresh",severity:"warning",text:"",rounded:"",size:"small",loading:te.value[r.id],onClick:J=>ht(r)},null,8,["loading","onClick"])),[[q,"Reîncercă procesarea",void 0,{top:!0}]]):f("",!0),!C(r)&&r.processing_status==="failed"?U((s(),G(n,{key:2,icon:"pi pi-pencil",severity:"secondary",text:"",rounded:"",size:"small",onClick:J=>Me(r.id)},null,8,["onClick"])),[[q,"Editează manual",void 0,{top:!0}]]):f("",!0),C(r)?f("",!0):U((s(),G(n,{key:3,icon:"pi pi-ellipsis-v",text:"",rounded:"",size:"small",disabled:ee(r),onClick:J=>ct(J,r)},null,8,["disabled","onClick"])),[[q,ee(r)?Bt:null,void 0,{top:!0}]]),C(r)?(s(),o(O,{key:4},[r.processing_status==="failed"?U((s(),o("span",Vl,[...e[78]||(e[78]=[l("i",{class:"pi pi-exclamation-triangle"},null,-1)])])),[[q,r.processing_error||"Eroare la procesare",void 0,{top:!0}]]):(s(),o(O,{key:1},[U(u(n,{icon:"pi pi-times",severity:"danger",text:"",rounded:"",size:"small",class:"cancel-job-btn",loading:k.value[r.job_id],onClick:J=>Bs(r)},null,8,["loading","onClick"]),[[q,"Anulează procesarea",void 0,{top:!0}]]),U((s(),o("span",Ml,[...e[79]||(e[79]=[l("i",{class:"pi pi-spin pi-spinner"},null,-1)])])),[[q,"Fișierul se procesează...",void 0,{top:!0}]])],64))],64)):f("",!0)])]),_:1})]),_:2},1032,["selection","value","dataKey"])],512),[[Ws,ft(i.batchId)]])]))),128))]),B.value.total>B.value.pageSize?(s(),o("div",jl,[u(N(ra),{rows:B.value.pageSize,totalRecords:B.value.total,first:(B.value.page-1)*B.value.pageSize,onPage:Ss,template:"FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink"},null,8,["rows","totalRecords","first"])])):f("",!0)])):f("",!0),u(N(Qe),{ref_key:"menuRef",ref:ot,model:es.value,popup:"",class:"receipt-action-menu"},null,8,["model"])]),u(wa,{visible:j.value&&b.value.length>0,actions:Qt.value},null,8,["visible","actions"]),A.value&&!j.value&&ye.value?(s(),G(N(Qs),{key:3,model:Xt,radius:80,direction:"up",type:"linear",showIcon:"pi pi-plus",hideIcon:"pi pi-times",mask:!1,class:"mobile-speed-dial",transitionDelay:40,pt:{root:{class:"mobile-speed-dial-root"},button:{class:"mobile-speed-dial-button"},menu:{class:"mobile-speed-dial-menu"},menuitem:{class:"mobile-speed-dial-item"},action:{class:"mobile-speed-dial-action"},mask:{class:"mobile-speed-dial-mask"}}})):f("",!0),A.value&&!j.value?(s(),G(va,{key:4})):f("",!0)],2)}}},sn=ze(Ol,[["__scopeId","data-v-46f1602b"]]);export{sn as default}; -//# sourceMappingURL=ReceiptsListView.DxBNp1EK.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/ReceiptsListView.DxBNp1EK.js.map b/deploy-package-20260223-151231/frontend/assets/ReceiptsListView.DxBNp1EK.js.map deleted file mode 100644 index a4563f1..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ReceiptsListView.DxBNp1EK.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReceiptsListView.DxBNp1EK.js","sources":["../../src/modules/data-entry/components/bulk/DragDropOverlay.vue","../../src/shared/components/mobile/MobileSelectionFooter.vue","../../src/modules/data-entry/components/bulk/BatchGroupHeader.vue","../../src/modules/data-entry/components/bulk/ProcessingStatusCell.vue","../../src/modules/data-entry/services/sseService.js","../../src/modules/data-entry/views/receipts/ReceiptsListView.vue"],"sourcesContent":["\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n\n\n","/**\n * SSE Client Service\n *\n * Service for connecting to Server-Sent Events endpoint and receiving\n * real-time receipt status updates. Uses native EventSource API with\n * automatic reconnection.\n *\n * US-031: Frontend - SSE Client Service\n * US-033: Graceful Degradation - Falls back to polling when SSE fails,\n * retries SSE periodically, and switches back when available.\n *\n * @example\n * import { sseService } from '@data-entry/services/sseService'\n *\n * // Subscribe to status changes\n * sseService.onStatusChange((data) => {\n * console.log('Status changed:', data.receipt_id, data.status)\n * })\n *\n * // Connect (optionally filter by batch)\n * sseService.connect()\n * sseService.connect('batch-uuid-here')\n *\n * // Disconnect when done\n * sseService.disconnect()\n */\n\n/** @type {EventSource|null} */\nlet eventSource = null\n\n/** @type {((data: StatusChangeData) => void)|null} */\nlet statusChangeCallback = null\n\n/** @type {boolean} */\nlet isConnected = false\n\n// US-033: Graceful Degradation State\n/** @type {boolean} - True when SSE is active and working */\nlet isSSEActive = false\n\n/** @type {boolean} - True when polling fallback is active */\nlet isPollingActive = false\n\n/** @type {number|null} - Polling interval ID */\nlet pollingIntervalId = null\n\n/** @type {number|null} - SSE retry timeout ID */\nlet sseRetryTimeoutId = null\n\n/** @type {(() => Promise)|null} - Polling callback for fetching data */\nlet pollingCallback = null\n\n/** @type {string|null} - Current batch ID for reconnection */\nlet currentBatchId = null\n\n/** @type {number} - Number of consecutive SSE failures */\nlet consecutiveFailures = 0\n\n/** @type {number} - Max failures before giving up SSE retries */\nconst MAX_CONSECUTIVE_FAILURES = 5\n\n// US-033: Timing constants\nconst POLLING_INTERVAL_MS = 5000 // 5 seconds between polls\nconst SSE_RETRY_INTERVAL_MS = 30000 // 30 seconds between SSE retry attempts\n\n/**\n * @typedef {Object} StatusChangeData\n * @property {number} receipt_id - Receipt ID that changed\n * @property {string} status - Workflow status (DRAFT, PENDING_REVIEW, etc.)\n * @property {string|null} processing_status - Processing status (pending, processing, completed, failed)\n * @property {string|null} batch_id - Batch ID this receipt belongs to\n * @property {string} timestamp - ISO timestamp of the event\n */\n\n/**\n * Build SSE endpoint URL with optional batch_id filter.\n *\n * @param {string|null} batchId - Optional batch ID to filter events\n * @returns {string} Full SSE endpoint URL\n */\nfunction buildUrl(batchId) {\n const baseUrl = import.meta.env.BASE_URL + 'api/data-entry/receipts/sse/status'\n if (batchId) {\n return `${baseUrl}?batch_id=${encodeURIComponent(batchId)}`\n }\n return baseUrl\n}\n\n/**\n * Connect to SSE endpoint for real-time status updates.\n *\n * If already connected, disconnects first before reconnecting.\n * EventSource handles automatic reconnection on network errors\n * (default retry is 3 seconds, as set by backend).\n *\n * US-033: Enhanced with graceful degradation - falls back to polling on failure.\n *\n * @param {string|null} [batchId=null] - Optional batch ID to filter events for\n */\nfunction connect(batchId = null) {\n // Disconnect existing connection if any\n if (eventSource) {\n closeEventSource()\n }\n\n // US-033: Store batch ID for reconnection attempts\n currentBatchId = batchId\n\n const url = buildUrl(batchId)\n console.log(`[SSE] Connecting to ${url}`)\n\n try {\n eventSource = new EventSource(url)\n isConnected = true\n\n // Handle incoming messages\n eventSource.onmessage = (event) => {\n try {\n /** @type {StatusChangeData} */\n const data = JSON.parse(event.data)\n console.log('[SSE] Received status change:', data)\n\n if (statusChangeCallback) {\n statusChangeCallback(data)\n }\n } catch (err) {\n console.error('[SSE] Failed to parse event data:', err, event.data)\n }\n }\n\n // Handle connection open\n eventSource.onopen = () => {\n console.log('[SSE] Connection opened')\n isConnected = true\n isSSEActive = true\n\n // US-033: SSE is working, reset failure count\n consecutiveFailures = 0\n\n // US-033: Stop polling if it was running - SSE is now active\n if (isPollingActive) {\n console.log('[SSE] SSE connection restored, stopping polling fallback')\n stopPolling()\n }\n\n // US-033: Clear any pending retry timeout\n if (sseRetryTimeoutId) {\n clearTimeout(sseRetryTimeoutId)\n sseRetryTimeoutId = null\n }\n }\n\n // Handle errors\n eventSource.onerror = (error) => {\n // US-033: Check if connection is permanently closed\n if (eventSource?.readyState === EventSource.CLOSED) {\n console.log('[SSE] Connection closed')\n isConnected = false\n isSSEActive = false\n\n // US-033: Increment failure count and activate fallback\n consecutiveFailures++\n console.log('SSE connection failed, falling back to polling')\n activateFallbackToPolling()\n } else if (eventSource?.readyState === EventSource.CONNECTING) {\n // EventSource is auto-reconnecting, this is normal behavior\n console.log('[SSE] Connection lost, reconnecting...')\n } else {\n console.error('[SSE] Connection error:', error)\n }\n }\n } catch (err) {\n // US-033: Handle any errors during EventSource creation\n console.error('[SSE] Failed to create EventSource:', err)\n console.log('SSE connection failed, falling back to polling')\n isConnected = false\n isSSEActive = false\n consecutiveFailures++\n activateFallbackToPolling()\n }\n}\n\n/**\n * Close the EventSource without full cleanup.\n * Used internally when reconnecting or switching states.\n */\nfunction closeEventSource() {\n if (eventSource) {\n eventSource.close()\n eventSource = null\n isConnected = false\n isSSEActive = false\n }\n}\n\n/**\n * US-033: Activate fallback to polling when SSE fails.\n * Also schedules periodic SSE retry attempts.\n */\nfunction activateFallbackToPolling() {\n // Start polling if we have a callback and aren't already polling\n if (pollingCallback && !isPollingActive) {\n startPolling()\n }\n\n // US-033: Schedule SSE retry if we haven't exceeded max failures\n if (consecutiveFailures < MAX_CONSECUTIVE_FAILURES) {\n scheduleSSERetry()\n } else {\n console.log(`[SSE] Max consecutive failures (${MAX_CONSECUTIVE_FAILURES}) reached, stopping SSE retries`)\n }\n}\n\n/**\n * US-033: Start polling as fallback mechanism.\n * Calls the polling callback at regular intervals.\n */\nfunction startPolling() {\n if (isPollingActive || !pollingCallback) {\n return\n }\n\n console.log(`[SSE] Starting polling fallback (interval: ${POLLING_INTERVAL_MS}ms)`)\n isPollingActive = true\n\n // Execute immediately, then at intervals\n pollingCallback()\n\n pollingIntervalId = setInterval(() => {\n if (pollingCallback) {\n pollingCallback()\n }\n }, POLLING_INTERVAL_MS)\n}\n\n/**\n * US-033: Stop the polling fallback.\n */\nfunction stopPolling() {\n if (pollingIntervalId) {\n clearInterval(pollingIntervalId)\n pollingIntervalId = null\n }\n isPollingActive = false\n console.log('[SSE] Polling fallback stopped')\n}\n\n/**\n * US-033: Schedule a retry attempt to reconnect to SSE.\n * If SSE connects successfully, polling will be stopped automatically.\n */\nfunction scheduleSSERetry() {\n // Don't schedule if already scheduled\n if (sseRetryTimeoutId) {\n return\n }\n\n console.log(`[SSE] Scheduling SSE retry in ${SSE_RETRY_INTERVAL_MS / 1000}s`)\n\n sseRetryTimeoutId = setTimeout(() => {\n sseRetryTimeoutId = null\n\n // Only retry if we're still in fallback mode (polling active)\n if (isPollingActive && !isSSEActive) {\n console.log('[SSE] Retrying SSE connection...')\n connect(currentBatchId)\n }\n }, SSE_RETRY_INTERVAL_MS)\n}\n\n/**\n * Disconnect from SSE endpoint.\n *\n * Closes the EventSource connection and cleans up all resources\n * including polling fallback and retry timers.\n *\n * US-033: Enhanced to clean up all graceful degradation state.\n *\n * Safe to call multiple times.\n */\nfunction disconnect() {\n console.log('[SSE] Disconnecting and cleaning up')\n\n // Close EventSource\n closeEventSource()\n\n // US-033: Stop polling if active\n stopPolling()\n\n // US-033: Clear retry timeout\n if (sseRetryTimeoutId) {\n clearTimeout(sseRetryTimeoutId)\n sseRetryTimeoutId = null\n }\n\n // US-033: Reset state\n currentBatchId = null\n consecutiveFailures = 0\n}\n\n/**\n * US-033: Set the polling callback for fallback mechanism.\n *\n * This callback will be called at regular intervals when SSE fails\n * and polling fallback is activated. Should fetch/refresh data.\n *\n * @param {(() => Promise)|null} callback - Async function to call for polling\n */\nfunction setPollingCallback(callback) {\n pollingCallback = callback\n}\n\n/**\n * Register callback for status change events.\n *\n * Only one callback can be registered at a time.\n * Call with null to unregister.\n *\n * @param {((data: StatusChangeData) => void)|null} callback - Callback function or null\n */\nfunction onStatusChange(callback) {\n statusChangeCallback = callback\n}\n\n/**\n * Check if currently connected to SSE endpoint.\n *\n * @returns {boolean} True if connected\n */\nfunction getIsConnected() {\n return isConnected && eventSource !== null && eventSource.readyState !== EventSource.CLOSED\n}\n\n/**\n * US-033: Check if SSE is actively working (not in fallback mode).\n *\n * @returns {boolean} True if SSE is active and receiving events\n */\nfunction getIsSSEActive() {\n return isSSEActive\n}\n\n/**\n * US-033: Check if polling fallback is currently active.\n *\n * @returns {boolean} True if polling fallback is running\n */\nfunction getIsPollingActive() {\n return isPollingActive\n}\n\n/**\n * SSE Service singleton\n *\n * US-033: Enhanced with graceful degradation capabilities.\n */\nexport const sseService = {\n connect,\n disconnect,\n onStatusChange,\n setPollingCallback,\n get isConnected() {\n return getIsConnected()\n },\n // US-033: Expose state for debugging/monitoring\n get isSSEActive() {\n return getIsSSEActive()\n },\n get isPollingActive() {\n return getIsPollingActive()\n },\n}\n\n// Also export individual functions for flexibility\nexport { connect, disconnect, onStatusChange, setPollingCallback }\n","\n\n\n\n\n\n\n\n\n\n\n"],"names":["MAX_FILE_SIZE_MB","emit","__emit","toast","useToast","dragCounter","ref","fileCount","MAX_FILE_SIZE_BYTES","ALLOWED_MIME_TYPES","isVisible","computed","hasFiles","event","types","onWindowDragEnter","_a","onWindowDragOver","onWindowDragLeave","onDragLeave","onDrop","files","handleFiles","onWindowDrop","cloneFilesToMemory","clonedFiles","file","arrayBuffer","clonedFile","e","validFiles","invalidFiles","formatFileSize","fileList","f","moreCount","detail","formData","data","api","message","jobs","jobId","index","error","errorMessage","_b","dupList","d","bytes","onMounted","onUnmounted","__expose","_createBlock","_Teleport","_createVNode","_Transition","_createElementBlock","_createElementVNode","_hoisted_1","_hoisted_2","_toDisplayString","_cache","handleAction","action","__props","_openBlock","_Fragment","_renderList","_unref","Button","$event","props","handleRetryAll","handleCancelAll","pendingProcessingCount","completedJobsCount","shortBatchId","formattedDate","date","months","day","month","year","itemsCount","activeProcessingCount","item","hasActiveProcessing","failedCount","allCompleted","_normalizeClass","$emit","_hoisted_3","_createTextVNode","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","truncatedError","maxLength","handleErrorClick","_withDirectives","eventSource","statusChangeCallback","isConnected","isSSEActive","isPollingActive","pollingIntervalId","sseRetryTimeoutId","pollingCallback","currentBatchId","consecutiveFailures","MAX_CONSECUTIVE_FAILURES","POLLING_INTERVAL_MS","SSE_RETRY_INTERVAL_MS","buildUrl","batchId","baseUrl","connect","closeEventSource","url","err","stopPolling","activateFallbackToPolling","startPolling","scheduleSSERetry","disconnect","setPollingCallback","callback","onStatusChange","getIsConnected","getIsSSEActive","getIsPollingActive","sseService","LONG_PRESS_DURATION","LONG_PRESS_MOVE_THRESHOLD","HIGHLIGHT_ANIMATION_DURATION_MS","processingTooltip","CANCEL_FADEOUT_DURATION_MS","router","useRouter","confirm","useConfirm","store","useReceiptsStore","companyStore","useCompanyStore","periodStore","useAccountingPeriodStore","batchProgressStore","useBatchProgressStore","authStore","useAuthStore","rejectDialogVisible","rejectReason","receiptToReject","selectedReceipts","bulkApproving","mobileSelectionMode","longPressTimer","longPressStartPos","expandedGroups","retryingReceipts","retryingBatches","cancellingJobs","cancellingJobIds","highlightCompleted","highlightFailed","dragDropOverlayRef","bulkFileInputRef","isSSEConnected","isMobile","showFilters","handleResize","showDrawer","moreMenuRef","fabVisible","exportMenuRef","lastScrollY","scrollTimeout","handleLogout","handleServerSwitched","newServerId","moreMenuItems","clearFilters","toggleExportMenu","exportMenuItems","exportAllReceiptsPDF","exportAllReceipts","speedDialItems","goToCreate","openBulkFileInput","mobileTopBarActions","hasActiveFilters","handleTopBarAction","selectAllMobile","btn","mobileSelectionActions","confirmBulkDelete","exportSelectedReceipts","handleScroll","currentScrollY","scrollDelta","handleJobsTransition","handleSSEStatusChange","inProcessingCount","disconnectSSE","checkAndResumeProcessing","handleOutsideTap","watch","newCompany","oldCompany","filters","menuRef","selectedReceipt","toggleMenu","receipt","menuItems","r","items","viewReceipt","editReceipt","confirmSubmit","confirmDelete","confirmApprove","openRejectDialog","confirmUnapprove","confirmResubmit","directionOptions","statusOptions","receipts","loading","pagination","stats","processingStats","isJobItem","getItemKey","unifiedItems","receiptsList","jobsMap","existingReceiptIds","jobItems","job","groupedReceipts","groups","groupsArray","a","b","dateA","group","isProcessing","getRowClass","classes","itemKey","getMobileCardClass","isFailedReceipt","isRowSelected","toggleRowSelection","selected","hasSelectableItems","isAllSelectableSelected","selectableItems","toggleSelectAll","currentIds","toAdd","groupIds","handleMobileCardTouchStart","touch","handleMobileCardTouchMove","deltaX","deltaY","handleMobileCardTouchEnd","handleMobileCardClick","exitMobileSelectionMode","target","isInsideCard","isInsideSelectionHeader","isInsideBottomBar","toggleGroup","groupKey","key","isGroupExpanded","watchEffect","newExpandedGroups","formatDate","dateStr","truncateFilename","filename","truncateErrorMessage","getReceiptFilename","formatDateShort","formatAmount","amount","getStatusClass","status","getStatusLabel","formatDateTime","getPaymentMethodLabel","pm","filterByStatus","onFilterChange","filterByProcessingStatus","processingStatus","clearFiltersAndClose","applyFiltersAndClose","onBulkFileInputChange","filesArray","onBulkUploadComplete","uploadResult","connectSSE","onPageChange","prevPage","nextPage","totalPages","id","storeName","executeReject","approveSelected","pendingOnly","successCount","errorCount","exportData","exportToExcel","exportToPDF","count","executeBulkDelete","ids","totalCount","result","deletedCount","firstError","_c","retryReceipt","handleRetryBatchFailed","confirmCancelJob","executeCancelJob","sleep","ms","resolve","handleCancelBatchAll","payload","completedCount","executeCancelBatch","expectedCount","completedReceiptIds","failedJobIds","receiptId","jobKey","storedBatchIds","totalRestoredJobs","storedBatchId","updates","checkAndDisconnectSSEIfDone","DragDropOverlay","Dialog","_component_Button","Textarea","MobileTopBar","_component_Badge","_d","_e","Menu","MobileDrawerMenu","BottomSheet","Dropdown","_component_InputText","_component_Calendar","_hoisted_11","_hoisted_12","_hoisted_13","_hoisted_14","_f","_g","_h","_i","_j","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","_component_ProgressSpinner","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_hoisted_36","_hoisted_37","_hoisted_38","_hoisted_39","_hoisted_40","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","_hoisted_47","_hoisted_48","_hoisted_49","_hoisted_50","_hoisted_51","_hoisted_52","_hoisted_53","_withModifiers","_hoisted_54","_hoisted_55","_hoisted_56","_hoisted_57","_hoisted_58","_hoisted_59","_hoisted_60","_hoisted_61","_hoisted_62","_hoisted_63","_hoisted_64","_hoisted_22","_hoisted_65","_hoisted_66","_hoisted_67","_hoisted_68","_hoisted_69","BatchGroupHeader","_hoisted_70","_component_DataTable","_component_Column","Checkbox","_withCtx","_hoisted_71","_hoisted_72","_hoisted_73","_hoisted_74","_hoisted_75","_hoisted_76","_component_Tag","_hoisted_77","_hoisted_78","_hoisted_79","_hoisted_80","_hoisted_81","_hoisted_82","_hoisted_83","_hoisted_84","_hoisted_85","_hoisted_86","_hoisted_87","_hoisted_88","_hoisted_89","_hoisted_90","ProcessingStatusCell","_hoisted_91","_hoisted_92","_hoisted_93","_hoisted_94","_hoisted_95","Paginator","MobileSelectionFooter","SpeedDial","MobileBottomNav"],"mappings":"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"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/ReportsLayout.Bpt7ZVGO.js b/deploy-package-20260223-151231/frontend/assets/ReportsLayout.Bpt7ZVGO.js deleted file mode 100644 index f8db070..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ReportsLayout.Bpt7ZVGO.js +++ /dev/null @@ -1,2 +0,0 @@ -import{E as r}from"./ErrorBoundary.BMn00aHR.js";import{h as e,p as t,k as a,d as p,q as m}from"./vendor-core.B6UiYhU_.js";import"./index.B8XI8FQW.js";import"./vendor-primevue.BN-meDW0.js";import"./vendor-utils.CO3CyGpV.js";import"./vendor-export.BWjBvx7Z.js";const h={__name:"ReportsLayout",setup(s){return(n,_)=>{const o=a("router-view");return p(),e(r,{"module-name":"Rapoarte"},{default:t(()=>[m(o)]),_:1})}}};export{h as default}; -//# sourceMappingURL=ReportsLayout.Bpt7ZVGO.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/ReportsLayout.Bpt7ZVGO.js.map b/deploy-package-20260223-151231/frontend/assets/ReportsLayout.Bpt7ZVGO.js.map deleted file mode 100644 index b854228..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ReportsLayout.Bpt7ZVGO.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ReportsLayout.Bpt7ZVGO.js","sources":["../../src/modules/reports/ReportsLayout.vue"],"sourcesContent":["\n\n\n"],"names":["_createBlock","ErrorBoundary","_createVNode","_component_router_view"],"mappings":"8VACEA,EAEgBC,EAAA,CAFD,cAAY,YAAU,WACnC,IAAe,CAAfC,EAAeC,CAAA"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/ServerLogsView.CpW2zGtt.js b/deploy-package-20260223-151231/frontend/assets/ServerLogsView.CpW2zGtt.js deleted file mode 100644 index b8688f3..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ServerLogsView.CpW2zGtt.js +++ /dev/null @@ -1,3 +0,0 @@ -import{a as i,j as H,w as T,o as q,K as P,c as u,h as C,i as p,q as r,O as o,P as G,e as n,y as x,H as J,t as Q,l as X,p as A,u as Y,n as Z,d as s,v as h,F as ee,B as le,S as oe}from"./vendor-core.B6UiYhU_.js";import{I as S,E as se,s as B}from"./vendor-primevue.BN-meDW0.js";import{_ as te,a as ae,b as ne,f as ie,d as M}from"./index.B8XI8FQW.js";import{b as re}from"./vendor-utils.CO3CyGpV.js";import{M as ue}from"./MobileTopBar.BnL78WPy.js";import{M as ce}from"./MobileBottomNav.Cp8OR33w.js";import"./vendor-export.BWjBvx7Z.js";const de={key:1,class:"stats-header"},pe={class:"actions"},ve={key:2,class:"mobile-controls-bar"},ge={class:"logs-title"},fe={key:1,class:"auto-refresh-indicator"},be={key:0,class:"logs-path"},me={key:0,class:"loading-container"},ye={key:1,class:"empty-logs"},ke={class:"logs-content"},he={__name:"ServerLogsView",setup(we){const z=re.create({baseURL:"/roa2web/api/system",headers:{"Content-Type":"application/json"}});z.interceptors.request.use(t=>{const e=localStorage.getItem("access_token");return e&&(t.headers.Authorization=`Bearer ${e}`),t});const N=G(),v=i([]),w=i(!1),y=i(null),d=i("backend-stderr"),_=i(""),b=i(100),c=i(!1),$=i(5),L=i(null),k=i({logs_path:null,file_exists:!0,file_size_kb:null});let V=null;const m=i(window.innerWidth<768),j=H(()=>[{icon:"pi pi-refresh",label:"Actualizează",tooltip:"Actualizează"},{icon:"pi pi-download",label:"Export",tooltip:"Export Loguri"}]),O=t=>{t.icon==="pi pi-refresh"?g():t.icon==="pi pi-download"&&W()},U=()=>{m.value=window.innerWidth<768},W=()=>{if(v.value.length===0)return;const t=v.value.join(` -`),e=new Blob([t],{type:"text/plain"}),a=URL.createObjectURL(e),l=document.createElement("a");l.href=a,l.download=`server-logs-${d.value}-${new Date().toISOString().slice(0,10)}.txt`,document.body.appendChild(l),l.click(),document.body.removeChild(l),URL.revokeObjectURL(a)},E=[{label:"Errors (stderr)",value:"backend-stderr"},{label:"Info (stdout)",value:"backend-stdout"}],I=[{label:"50 lines",value:50},{label:"100 lines",value:100},{label:"200 lines",value:200},{label:"500 lines",value:500}],g=async()=>{var t,e,a;w.value=!0,y.value=null;try{const l={file:d.value,lines:b.value};_.value&&(l.filter=_.value),console.log("[ServerLogs] Fetching logs from:",z.defaults.baseURL+"/logs",l);const f=await z.get("/logs",{params:l});console.log("[ServerLogs] Response:",f.data),v.value=f.data.lines||[],k.value={logs_path:f.data.logs_path||null,file_exists:f.data.file_exists??!0,file_size_kb:f.data.file_size_kb??null},await Z(),L.value&&(L.value.scrollTop=L.value.scrollHeight)}catch(l){console.error("[ServerLogs] Failed to load logs:",l),console.error("[ServerLogs] Error details:",(t=l.response)==null?void 0:t.data,l.message),y.value=((a=(e=l.response)==null?void 0:e.data)==null?void 0:a.detail)||l.message||"Failed to load logs - check console for details"}finally{w.value=!1}},D=t=>{const e=t.toLowerCase(),a={display:"block",padding:"3px 8px",borderRadius:"2px",fontFamily:"'Consolas', 'Monaco', 'Courier New', monospace",fontSize:"0.8125rem",lineHeight:"1.6"};return e.includes("error")||e.includes("exception")||e.includes("failed")?{...a,color:"#b91c1c",backgroundColor:"rgba(185, 28, 28, 0.1)",fontWeight:"600"}:e.includes("warning")||e.includes("warn")?{...a,color:"#b45309",backgroundColor:"rgba(180, 83, 9, 0.1)",fontWeight:"500"}:e.includes("success")||e.includes("completed")?{...a,color:"#047857",backgroundColor:"rgba(4, 120, 87, 0.1)"}:{...a,color:"#000000",backgroundColor:"rgba(0, 0, 0, 0.02)"}},F=()=>{c.value=!c.value,c.value?K():R()},K=()=>{R(),V=setInterval(()=>{g()},$.value*1e3)},R=()=>{V&&(clearInterval(V),V=null)};return T(d,()=>{g()}),T(b,()=>{g()}),q(()=>{window.addEventListener("resize",U),g()}),P(()=>{window.removeEventListener("resize",U),R()}),(t,e)=>{const a=X("tooltip");return s(),u("div",{class:Y(["server-logs-view",{"mobile-layout":m.value}])},[m.value?(s(),C(ue,{key:0,title:"Loguri Server","show-back":!0,actions:j.value,onBackClick:e[0]||(e[0]=l=>o(N).push("/settings")),onActionClick:O},null,8,["actions"])):p("",!0),m.value?p("",!0):(s(),u("div",de,[e[7]||(e[7]=n("h1",null,[n("i",{class:"pi pi-file-edit"}),x(" Server Logs ")],-1)),n("div",pe,[r(o(S),{modelValue:d.value,"onUpdate:modelValue":e[1]||(e[1]=l=>d.value=l),options:E,optionLabel:"label",optionValue:"value",placeholder:"Select log file",class:"log-file-select"},null,8,["modelValue"]),r(o(se),{modelValue:_.value,"onUpdate:modelValue":e[2]||(e[2]=l=>_.value=l),placeholder:"Filter (e.g., ocr, error)",class:"filter-input",onKeyup:J(g,["enter"])},null,8,["modelValue"]),r(o(S),{modelValue:b.value,"onUpdate:modelValue":e[3]||(e[3]=l=>b.value=l),options:I,optionLabel:"label",optionValue:"value",class:"lines-select"},null,8,["modelValue"]),r(o(B),{label:"Refresh",icon:"pi pi-refresh",onClick:g,loading:w.value},null,8,["loading"]),r(o(B),{label:"Auto",icon:c.value?"pi pi-pause":"pi pi-play",severity:c.value?"warning":"secondary",onClick:F},null,8,["icon","severity"])])])),m.value?(s(),u("div",ve,[r(o(S),{modelValue:d.value,"onUpdate:modelValue":e[4]||(e[4]=l=>d.value=l),options:E,optionLabel:"label",optionValue:"value",placeholder:"Log file",class:"mobile-log-select"},null,8,["modelValue"]),r(o(S),{modelValue:b.value,"onUpdate:modelValue":e[5]||(e[5]=l=>b.value=l),options:I,optionLabel:"label",optionValue:"value",class:"mobile-lines-select"},null,8,["modelValue"]),Q(r(o(B),{icon:c.value?"pi pi-pause":"pi pi-play",severity:c.value?"warning":"secondary",onClick:F,class:"mobile-auto-btn"},null,8,["icon","severity"]),[[a,c.value?"Stop Auto":"Start Auto",void 0,{bottom:!0}]])])):p("",!0),y.value?(s(),C(o(ae),{key:3,severity:"error",closable:!0,onClose:e[6]||(e[6]=l=>y.value=null)},{default:A(()=>[x(h(y.value),1)]),_:1})):p("",!0),r(o(ne),{class:"logs-card"},{title:A(()=>[n("div",ge,[n("span",null,h(d.value==="backend-stderr"?"Errors & Warnings":"Info Logs"),1),r(o(M),{value:`${v.value.length} lines`,severity:"info"},null,8,["value"]),k.value.file_size_kb!==null?(s(),C(o(M),{key:0,value:`${k.value.file_size_kb} KB`,severity:"secondary",class:"ml-2"},null,8,["value"])):p("",!0),c.value?(s(),u("span",fe,[e[8]||(e[8]=n("i",{class:"pi pi-spin pi-sync"},null,-1)),x(" Auto-refresh: "+h($.value)+"s ",1)])):p("",!0)]),k.value.logs_path?(s(),u("div",be,[n("small",null,[e[9]||(e[9]=n("i",{class:"pi pi-folder"},null,-1)),x(" "+h(k.value.logs_path),1)])])):p("",!0)]),content:A(()=>[w.value&&v.value.length===0?(s(),u("div",me,[r(o(ie)),e[10]||(e[10]=n("p",null,"Loading logs...",-1))])):v.value.length===0?(s(),u("div",ye,[...e[11]||(e[11]=[n("i",{class:"pi pi-inbox"},null,-1),n("p",null,"No log entries found",-1)])])):(s(),u("div",{key:2,class:"logs-container",ref_key:"logsContainer",ref:L},[n("pre",ke,[(s(!0),u(ee,null,le(v.value,(l,f)=>(s(),u("code",{key:f,style:oe(D(l))},h(l),5))),128))])],512))]),_:1}),m.value?(s(),C(ce,{key:4})):p("",!0)],2)}}},Re=te(he,[["__scopeId","data-v-4383ab53"]]);export{Re as default}; -//# sourceMappingURL=ServerLogsView.CpW2zGtt.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/ServerLogsView.CpW2zGtt.js.map b/deploy-package-20260223-151231/frontend/assets/ServerLogsView.CpW2zGtt.js.map deleted file mode 100644 index 1589b15..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ServerLogsView.CpW2zGtt.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ServerLogsView.CpW2zGtt.js","sources":["../../src/modules/reports/views/ServerLogsView.vue"],"sourcesContent":["\n\n\n\n\n"],"names":["systemApi","axios","config","token","router","useRouter","logs","ref","loading","error","selectedFile","filterText","linesCount","autoRefresh","autoRefreshInterval","logsContainer","debugInfo","refreshTimer","isMobile","mobileTopBarActions","computed","handleTopBarAction","action","loadLogs","exportLogs","handleResize","content","blob","url","link","logFiles","linesOptions","params","response","nextTick","err","_a","_c","_b","getLineStyle","line","lineLower","baseStyle","toggleAutoRefresh","startAutoRefresh","stopAutoRefresh","watch","onMounted","onUnmounted","_createElementBlock","_normalizeClass","_createBlock","MobileTopBar","_cache","$event","_unref","_openBlock","_hoisted_1","_createElementVNode","_hoisted_2","_createVNode","Dropdown","InputText","Button","_hoisted_3","Message","Card","_hoisted_4","Tag","_hoisted_5","_toDisplayString","_hoisted_6","_hoisted_7","ProgressSpinner","_hoisted_8","_hoisted_9","_Fragment","_renderList","index","_normalizeStyle","MobileBottomNav"],"mappings":"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"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/ServerLogsView.DrZyOF5Q.css b/deploy-package-20260223-151231/frontend/assets/ServerLogsView.DrZyOF5Q.css deleted file mode 100644 index cbd352c..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ServerLogsView.DrZyOF5Q.css +++ /dev/null @@ -1 +0,0 @@ -.server-logs-view[data-v-4383ab53]{padding:var(--space-lg);max-width:1400px;margin:0 auto}.stats-header[data-v-4383ab53]{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-lg);flex-wrap:wrap;gap:var(--space-md)}.stats-header h1[data-v-4383ab53]{margin:0;display:flex;align-items:center;gap:var(--space-sm);font-size:1.5rem;color:var(--color-text)}.actions[data-v-4383ab53]{display:flex;gap:var(--space-sm);flex-wrap:wrap;align-items:center}.log-file-select[data-v-4383ab53]{min-width:150px}.filter-input[data-v-4383ab53]{min-width:180px}.lines-select[data-v-4383ab53]{min-width:120px}.logs-card[data-v-4383ab53]{margin-top:var(--space-md)}.logs-title[data-v-4383ab53]{display:flex;align-items:center;gap:var(--space-md)}.logs-path[data-v-4383ab53]{margin-top:var(--space-xs);color:var(--color-text-secondary, #6b7280);font-size:.75rem}.logs-path i[data-v-4383ab53]{margin-right:var(--space-xs)}.ml-2[data-v-4383ab53]{margin-left:.5rem}.auto-refresh-indicator[data-v-4383ab53]{font-size:.875rem;color:var(--color-warning);display:flex;align-items:center;gap:var(--space-xs)}.loading-container[data-v-4383ab53],.empty-logs[data-v-4383ab53]{display:flex;flex-direction:column;align-items:center;padding:var(--space-xl);color:var(--color-text-secondary)}.empty-logs i[data-v-4383ab53]{font-size:3rem;margin-bottom:var(--space-md)}.logs-container[data-v-4383ab53]{max-height:600px;overflow-y:auto;background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-md);padding:var(--space-sm)}.logs-content[data-v-4383ab53]{margin:0;white-space:pre-wrap;word-break:break-all;background:transparent}.mobile-layout[data-v-4383ab53]{padding:56px 0}.mobile-layout .logs-card[data-v-4383ab53]{margin:var(--space-sm);margin-top:var(--space-xs)}.mobile-layout .logs-container[data-v-4383ab53]{max-height:calc(100vh - 280px)}.mobile-controls-bar[data-v-4383ab53]{display:flex;gap:var(--space-sm);padding:var(--space-sm);background:var(--surface-card);border-bottom:1px solid var(--surface-border);align-items:center}.mobile-log-select[data-v-4383ab53]{flex:1;min-width:0}.mobile-lines-select[data-v-4383ab53]{width:100px}.mobile-auto-btn[data-v-4383ab53]{flex-shrink:0}.mobile-sidebar .sidebar-header[data-v-4383ab53]{padding:var(--space-md);border-bottom:1px solid var(--surface-border)}.mobile-sidebar .sidebar-title[data-v-4383ab53]{font-size:var(--text-lg);font-weight:var(--font-bold);color:var(--color-primary)}.mobile-sidebar .sidebar-menu[data-v-4383ab53]{padding:var(--space-sm) 0}.mobile-sidebar .sidebar-item[data-v-4383ab53]{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-md) var(--space-lg);color:var(--text-color);text-decoration:none;transition:background-color var(--transition-fast)}.mobile-sidebar .sidebar-item[data-v-4383ab53]:hover,.mobile-sidebar .sidebar-item[data-v-4383ab53]:active{background:var(--surface-hover)}.mobile-sidebar .sidebar-item.active[data-v-4383ab53]{background:var(--blue-50);color:var(--color-primary)}.mobile-sidebar .sidebar-item i[data-v-4383ab53]{font-size:var(--text-xl);width:24px;text-align:center}[data-theme=dark] .mobile-controls-bar[data-v-4383ab53]{background:var(--surface-card);border-bottom-color:var(--surface-border)}[data-theme=dark] .mobile-sidebar .sidebar-item.active[data-v-4383ab53]{background:var(--blue-900);color:var(--blue-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .mobile-controls-bar[data-v-4383ab53]{background:var(--surface-card);border-bottom-color:var(--surface-border)}:root:not([data-theme]) .mobile-sidebar .sidebar-item.active[data-v-4383ab53]{background:var(--blue-900);color:var(--blue-400)}}@media (max-width: 768px){.stats-header[data-v-4383ab53]{flex-direction:column;align-items:flex-start}.actions[data-v-4383ab53]{width:100%}.log-file-select[data-v-4383ab53],.filter-input[data-v-4383ab53],.lines-select[data-v-4383ab53]{flex:1;min-width:100px}} diff --git a/deploy-package-20260223-151231/frontend/assets/SettingsHubView.DDOA_RQo.js b/deploy-package-20260223-151231/frontend/assets/SettingsHubView.DDOA_RQo.js deleted file mode 100644 index 950f973..0000000 --- a/deploy-package-20260223-151231/frontend/assets/SettingsHubView.DDOA_RQo.js +++ /dev/null @@ -1,2 +0,0 @@ -import{a as m,j as _,o as M,K as k,c as g,h,i as d,q as t,e,O as o,y as C,p as n,k as V,u as z,F as y,P as B,d as l}from"./vendor-core.B6UiYhU_.js";import{M as x}from"./MobileTopBar.BnL78WPy.js";import{M as L}from"./MobileBottomNav.Cp8OR33w.js";import{M as N}from"./MobileDrawerMenu.DJ_STPbv.js";import{c as R}from"./sharedStores.Bb_IRn4Y.js";import{_ as T}from"./index.B8XI8FQW.js";import"./vendor-primevue.BN-meDW0.js";import"./vendor-utils.CO3CyGpV.js";import"./vendor-export.BWjBvx7Z.js";const E={class:"app-container"},I={key:0,class:"page-header"},O={class:"settings-grid"},W={__name:"SettingsHubView",setup(D){const w=B(),r=R(),c=m(!1),u=m(window.innerWidth),a=_(()=>u.value<768),p=()=>{u.value=window.innerWidth},f=async()=>{await r.logout(),w.push("/login")},S=async b=>{};return M(()=>{window.addEventListener("resize",p)}),k(()=>{window.removeEventListener("resize",p)}),(b,s)=>{const i=V("router-link");return l(),g(y,null,[a.value?(l(),h(x,{key:0,title:"Setări","show-menu":!0,onMenuClick:s[0]||(s[0]=v=>c.value=!0)})):d("",!0),t(N,{modelValue:c.value,"onUpdate:modelValue":s[1]||(s[1]=v=>c.value=v),user:o(r).user,"available-servers":o(r).availableServers,"current-server-id":o(r).selectedServerId,"auth-store":o(r),onLogout:f,onServerSwitched:S},null,8,["modelValue","user","available-servers","current-server-id","auth-store"]),e("main",{class:z(["main-content",{"mobile-layout":a.value}])},[e("div",E,[a.value?d("",!0):(l(),g("div",I,[...s[2]||(s[2]=[e("h1",{class:"page-title"},[e("i",{class:"pi pi-cog"}),C(" Setări ")],-1),e("p",{class:"page-subtitle"},"Configurare și monitorizare sistem",-1)])])),e("div",O,[t(i,{to:"/data-entry/ocr-metrics",class:"settings-card"},{default:n(()=>[...s[3]||(s[3]=[e("div",{class:"card-icon ocr-icon"},[e("i",{class:"pi pi-chart-line"})],-1),e("div",{class:"card-content"},[e("h3",{class:"card-title"},"OCR Setări"),e("p",{class:"card-description"},"Metrici și configurare OCR pentru procesarea bonurilor")],-1),e("i",{class:"pi pi-chevron-right card-arrow"},null,-1)])]),_:1}),t(i,{to:"/reports/cache-stats",class:"settings-card"},{default:n(()=>[...s[4]||(s[4]=[e("div",{class:"card-icon cache-icon"},[e("i",{class:"pi pi-database"})],-1),e("div",{class:"card-content"},[e("h3",{class:"card-title"},"Cache Stats"),e("p",{class:"card-description"},"Statistici și monitorizare cache sistem")],-1),e("i",{class:"pi pi-chevron-right card-arrow"},null,-1)])]),_:1}),t(i,{to:"/reports/server-logs",class:"settings-card"},{default:n(()=>[...s[5]||(s[5]=[e("div",{class:"card-icon logs-icon"},[e("i",{class:"pi pi-file"})],-1),e("div",{class:"card-content"},[e("h3",{class:"card-title"},"Loguri Server"),e("p",{class:"card-description"},"Vizualizare și analiză loguri aplicație")],-1),e("i",{class:"pi pi-chevron-right card-arrow"},null,-1)])]),_:1}),t(i,{to:"/reports/telegram",class:"settings-card"},{default:n(()=>[...s[6]||(s[6]=[e("div",{class:"card-icon telegram-icon"},[e("i",{class:"pi pi-send"})],-1),e("div",{class:"card-content"},[e("h3",{class:"card-title"},"Telegram"),e("p",{class:"card-description"},"Conectare bot Telegram pentru notificări")],-1),e("i",{class:"pi pi-chevron-right card-arrow"},null,-1)])]),_:1})])])],2),a.value?(l(),h(L,{key:1})):d("",!0)],64)}}},G=T(W,[["__scopeId","data-v-a770764c"]]);export{G as default}; -//# sourceMappingURL=SettingsHubView.DDOA_RQo.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/SettingsHubView.DDOA_RQo.js.map b/deploy-package-20260223-151231/frontend/assets/SettingsHubView.DDOA_RQo.js.map deleted file mode 100644 index 9ab5c98..0000000 --- a/deploy-package-20260223-151231/frontend/assets/SettingsHubView.DDOA_RQo.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"SettingsHubView.DDOA_RQo.js","sources":["../../src/modules/reports/views/SettingsHubView.vue"],"sourcesContent":["\n\n\n\n\n"],"names":["router","useRouter","authStore","useAuthStore","showDrawer","ref","windowWidth","isMobile","computed","handleResize","handleLogout","handleServerSwitched","newServerId","onMounted","onUnmounted","_createBlock","MobileTopBar","_createVNode","MobileDrawerMenu","$event","_unref","_createElementVNode","_normalizeClass","_hoisted_1","_openBlock","_createElementBlock","_hoisted_2","_cache","_hoisted_3","_component_router_link","MobileBottomNav"],"mappings":"ymBAgGA,MAAMA,EAASC,EAAS,EAClBC,EAAYC,EAAY,EAGxBC,EAAaC,EAAI,EAAK,EAGtBC,EAAcD,EAAI,OAAO,UAAU,EACnCE,EAAWC,EAAS,IAAMF,EAAY,MAAQ,GAAG,EAGjDG,EAAe,IAAM,CACzBH,EAAY,MAAQ,OAAO,UAC7B,EAGMI,EAAe,SAAY,CAC/B,MAAMR,EAAU,OAAM,EACtBF,EAAO,KAAK,QAAQ,CACtB,EAGMW,EAAuB,MAAOC,GAAgB,CAGpD,EAKA,OAAAC,EAAU,IAAM,CACd,OAAO,iBAAiB,SAAUJ,CAAY,CAChD,CAAC,EAEDK,EAAY,IAAM,CAChB,OAAO,oBAAoB,SAAUL,CAAY,CACnD,CAAC,wDAjISF,EAAA,WADRQ,EAKEC,EAAA,OAHA,MAAM,SACL,YAAW,GACX,2BAAYZ,EAAA,MAAU,gBAIzBa,EAQEC,EAAA,YAPSd,EAAA,2CAAAA,EAAU,MAAAe,GAClB,KAAMC,EAAAlB,CAAA,EAAU,KAChB,oBAAmBkB,EAAAlB,CAAA,EAAU,iBAC7B,oBAAmBkB,EAAAlB,CAAA,EAAU,iBAC7B,aAAYkB,EAAAlB,CAAA,EACZ,SAAQQ,EACR,iBAAiBC,sFAGpBU,EA8DO,OAAA,CA9DD,MAAKC,EAAA,CAAC,eAAc,CAAA,gBAA4Bf,EAAA,MAAQ,CAAA,IAC5Dc,EA4DM,MA5DNE,EA4DM,CA1DQhB,EAAA,gBAAZiB,IAAAC,EAMM,MANNC,EAMM,CAAA,GAAAC,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CALJN,EAGK,KAAA,CAHD,MAAM,YAAY,EAAA,CACpBA,EAAyB,IAAA,CAAtB,MAAM,WAAW,CAAA,IAAK,UAE3B,OACAA,EAA+D,IAAA,CAA5D,MAAM,eAAe,EAAC,qCAAkC,EAAA,OAI7DA,EAgDM,MAhDNO,EAgDM,CA9CJX,EAScY,EAAA,CATD,GAAG,0BAA0B,MAAM,4BAC9C,IAEM,CAAA,GAAAF,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFNN,EAEM,MAAA,CAFD,MAAM,oBAAoB,EAAA,CAC7BA,EAAgC,IAAA,CAA7B,MAAM,kBAAkB,CAAA,OAE7BA,EAGM,MAAA,CAHD,MAAM,cAAc,EAAA,CACvBA,EAAsC,KAAA,CAAlC,MAAM,YAAY,EAAC,YAAU,EACjCA,EAAsF,IAAA,CAAnF,MAAM,kBAAkB,EAAC,wDAAsD,OAEpFA,EAA8C,IAAA,CAA3C,MAAM,gCAAgC,EAAA,KAAA,EAAA,YAI3CJ,EAScY,EAAA,CATD,GAAG,uBAAuB,MAAM,4BAC3C,IAEM,CAAA,GAAAF,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFNN,EAEM,MAAA,CAFD,MAAM,sBAAsB,EAAA,CAC/BA,EAA8B,IAAA,CAA3B,MAAM,gBAAgB,CAAA,OAE3BA,EAGM,MAAA,CAHD,MAAM,cAAc,EAAA,CACvBA,EAAuC,KAAA,CAAnC,MAAM,YAAY,EAAC,aAAW,EAClCA,EAAuE,IAAA,CAApE,MAAM,kBAAkB,EAAC,yCAAuC,OAErEA,EAA8C,IAAA,CAA3C,MAAM,gCAAgC,EAAA,KAAA,EAAA,YAI3CJ,EAScY,EAAA,CATD,GAAG,uBAAuB,MAAM,4BAC3C,IAEM,CAAA,GAAAF,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFNN,EAEM,MAAA,CAFD,MAAM,qBAAqB,EAAA,CAC9BA,EAA0B,IAAA,CAAvB,MAAM,YAAY,CAAA,OAEvBA,EAGM,MAAA,CAHD,MAAM,cAAc,EAAA,CACvBA,EAAyC,KAAA,CAArC,MAAM,YAAY,EAAC,eAAa,EACpCA,EAAuE,IAAA,CAApE,MAAM,kBAAkB,EAAC,yCAAuC,OAErEA,EAA8C,IAAA,CAA3C,MAAM,gCAAgC,EAAA,KAAA,EAAA,YAI3CJ,EAScY,EAAA,CATD,GAAG,oBAAoB,MAAM,4BACxC,IAEM,CAAA,GAAAF,EAAA,CAAA,IAAAA,EAAA,CAAA,EAAA,CAFNN,EAEM,MAAA,CAFD,MAAM,yBAAyB,EAAA,CAClCA,EAA0B,IAAA,CAAvB,MAAM,YAAY,CAAA,OAEvBA,EAGM,MAAA,CAHD,MAAM,cAAc,EAAA,CACvBA,EAAoC,KAAA,CAAhC,MAAM,YAAY,EAAC,UAAQ,EAC/BA,EAAwE,IAAA,CAArE,MAAM,kBAAkB,EAAC,0CAAwC,OAEtEA,EAA8C,IAAA,CAA3C,MAAM,gCAAgC,EAAA,KAAA,EAAA,oBAO1Bd,EAAA,WAAvBQ,EAAmCe,EAAA,CAAA,IAAA,CAAA,CAAA"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/SettingsHubView.yFhSUwTd.css b/deploy-package-20260223-151231/frontend/assets/SettingsHubView.yFhSUwTd.css deleted file mode 100644 index 3f1b804..0000000 --- a/deploy-package-20260223-151231/frontend/assets/SettingsHubView.yFhSUwTd.css +++ /dev/null @@ -1 +0,0 @@ -.main-content.mobile-layout[data-v-a770764c]{padding-top:56px;padding-bottom:56px}.page-header[data-v-a770764c]{margin-bottom:var(--space-md)}.page-title[data-v-a770764c]{display:flex;align-items:center;gap:var(--space-sm);font-size:var(--text-2xl);font-weight:var(--font-semibold);color:var(--text-color);margin:0 0 var(--space-sm) 0}.page-title i[data-v-a770764c]{color:var(--color-primary)}.page-subtitle[data-v-a770764c]{font-size:var(--text-base);color:var(--text-color-secondary);margin:0}.settings-grid[data-v-a770764c]{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--space-lg);padding:var(--space-md)}@media (max-width: 1200px){.settings-grid[data-v-a770764c]{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.settings-grid[data-v-a770764c]{grid-template-columns:repeat(2,1fr);gap:var(--space-md);padding:var(--space-sm)}}@media (max-width: 480px){.settings-grid[data-v-a770764c]{gap:var(--space-sm);padding:var(--space-xs)}}.settings-card[data-v-a770764c]{display:flex;flex-direction:column;align-items:center;text-align:center;padding:var(--space-lg);background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-lg);text-decoration:none;color:inherit;transition:all var(--transition-fast);cursor:pointer;position:relative;min-height:180px}.settings-card[data-v-a770764c]:hover{border-color:var(--color-primary);box-shadow:var(--shadow-md);transform:translateY(-2px)}.settings-card[data-v-a770764c]:active{transform:translateY(0)}.card-icon[data-v-a770764c]{width:56px;height:56px;border-radius:var(--radius-full);display:flex;align-items:center;justify-content:center;margin-bottom:var(--space-md);font-size:var(--text-2xl)}.card-icon.ocr-icon[data-v-a770764c]{background:var(--blue-50);color:var(--blue-600)}.card-icon.cache-icon[data-v-a770764c]{background:var(--green-50);color:var(--green-600)}.card-icon.logs-icon[data-v-a770764c]{background:var(--yellow-50);color:var(--yellow-600)}.card-icon.telegram-icon[data-v-a770764c]{background:var(--cyan-50);color:var(--cyan-600)}.card-content[data-v-a770764c]{flex:1;display:flex;flex-direction:column;gap:var(--space-xs)}.card-title[data-v-a770764c]{font-size:var(--text-lg);font-weight:var(--font-semibold);color:var(--text-color);margin:0}.card-description[data-v-a770764c]{font-size:var(--text-sm);color:var(--text-color-secondary);margin:0;line-height:var(--leading-normal)}.card-arrow[data-v-a770764c]{position:absolute;top:var(--space-md);right:var(--space-md);color:var(--text-color-secondary);font-size:var(--text-sm);opacity:0;transition:opacity var(--transition-fast)}.settings-card:hover .card-arrow[data-v-a770764c]{opacity:1}@media (max-width: 768px){.settings-card[data-v-a770764c]{padding:var(--space-md);min-height:150px}.card-icon[data-v-a770764c]{width:48px;height:48px;font-size:var(--text-xl);margin-bottom:var(--space-sm)}.card-title[data-v-a770764c]{font-size:var(--text-base)}.card-description[data-v-a770764c]{font-size:var(--text-xs)}.card-arrow[data-v-a770764c]{display:none}}[data-theme=dark] .card-icon.ocr-icon[data-v-a770764c]{background:var(--blue-900);color:var(--blue-400)}[data-theme=dark] .card-icon.cache-icon[data-v-a770764c]{background:var(--green-900);color:var(--green-400)}[data-theme=dark] .card-icon.logs-icon[data-v-a770764c]{background:var(--yellow-900);color:var(--yellow-400)}[data-theme=dark] .card-icon.telegram-icon[data-v-a770764c]{background:var(--cyan-900);color:var(--cyan-400)}[data-theme=dark] .settings-card[data-v-a770764c]:hover{border-color:var(--blue-500)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .card-icon.ocr-icon[data-v-a770764c]{background:var(--blue-900);color:var(--blue-400)}:root:not([data-theme]) .card-icon.cache-icon[data-v-a770764c]{background:var(--green-900);color:var(--green-400)}:root:not([data-theme]) .card-icon.logs-icon[data-v-a770764c]{background:var(--yellow-900);color:var(--yellow-400)}:root:not([data-theme]) .card-icon.telegram-icon[data-v-a770764c]{background:var(--cyan-900);color:var(--cyan-400)}:root:not([data-theme]) .settings-card[data-v-a770764c]:hover{border-color:var(--blue-500)}} diff --git a/deploy-package-20260223-151231/frontend/assets/TelegramView.C5t2itK1.css b/deploy-package-20260223-151231/frontend/assets/TelegramView.C5t2itK1.css deleted file mode 100644 index a1125c8..0000000 --- a/deploy-package-20260223-151231/frontend/assets/TelegramView.C5t2itK1.css +++ /dev/null @@ -1 +0,0 @@ -.telegram-view.mobile-layout[data-v-58afaec8]{padding-top:56px;padding-bottom:56px}.telegram-view.mobile-layout .main-content[data-v-58afaec8]{padding:var(--space-sm)}.generate-section[data-v-58afaec8]{display:flex;justify-content:center;padding-bottom:var(--space-lg);border-bottom:1px solid var(--color-border)}.code-section[data-v-58afaec8]{margin-top:var(--space-lg);display:flex;flex-direction:column;gap:var(--space-lg)}.code-display[data-v-58afaec8]{background:linear-gradient(135deg,#4361ee14,#4361ee05);border:2px solid var(--color-primary);border-radius:var(--radius-md);padding:var(--space-md);text-align:center}.code-header[data-v-58afaec8]{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-xs);font-size:var(--text-sm)}.code-label[data-v-58afaec8]{color:var(--color-text-secondary);font-weight:var(--font-semibold)}.code-timer[data-v-58afaec8]{color:var(--color-primary);font-weight:var(--font-bold);font-family:Courier New,monospace}.code-value[data-v-58afaec8]{font-size:2rem;font-weight:var(--font-bold);color:var(--color-primary);letter-spacing:.3em;font-family:Courier New,monospace}.action-buttons[data-v-58afaec8]{display:flex;gap:var(--space-sm);flex-wrap:wrap}.action-btn[data-v-58afaec8]{flex:1;min-width:160px;justify-content:center}.qr-section[data-v-58afaec8]{display:flex;justify-content:center;padding:var(--space-lg);background:var(--surface-card);border-radius:var(--radius-md);box-shadow:var(--shadow-sm)}@media (max-width: 768px){.code-value[data-v-58afaec8]{font-size:1.5rem;letter-spacing:.2em}.action-buttons[data-v-58afaec8]{flex-direction:column}.action-btn[data-v-58afaec8]{width:100%;min-width:unset}} diff --git a/deploy-package-20260223-151231/frontend/assets/TelegramView.DlM-s8w5.js b/deploy-package-20260223-151231/frontend/assets/TelegramView.DlM-s8w5.js deleted file mode 100644 index d3d6987..0000000 --- a/deploy-package-20260223-151231/frontend/assets/TelegramView.DlM-s8w5.js +++ /dev/null @@ -1,7 +0,0 @@ -import{X as Y,Y as _,a as b,Z,o as J,F as ae,j as ne,K as oe,c as L,h as x,i as D,e as R,O as H,P as ie,v as G,q as $,u as se,d as z}from"./vendor-core.B6UiYhU_.js";import{_ as le,u as ue}from"./index.B8XI8FQW.js";import{s as X}from"./vendor-primevue.BN-meDW0.js";import{b as de}from"./vendor-utils.CO3CyGpV.js";import{M as ce}from"./MobileTopBar.BnL78WPy.js";import{M as fe}from"./MobileBottomNav.Cp8OR33w.js";import"./vendor-export.BWjBvx7Z.js";/*! - * qrcode.vue v3.6.0 - * A Vue.js component to generate QRCode. Both support Vue 2 and Vue 3 - * © 2017-PRESENT @scopewu(https://github.com/scopewu) - * MIT License. - */var A=function(){return A=Object.assign||function(c){for(var u,l=1,d=arguments.length;la.MAX_VERSION)throw new RangeError("Version value out of range");if(n<-1||n>7)throw new RangeError("Mask value out of range");this.size=e*4+17;for(var i=[],s=0;s7)throw new RangeError("Invalid value");var f,C;for(f=r;;f++){var w=a.getNumDataCodewords(f,t)*8,E=v.getTotalBits(e,f);if(E<=w){C=E;break}if(f>=n)throw new RangeError("Data too long")}for(var m=0,h=[a.Ecc.MEDIUM,a.Ecc.QUARTILE,a.Ecc.HIGH];m>>3]|=U<<7-(Q&7)}),new a(f,t,k,i)},a.prototype.getModule=function(e,t){return 0<=e&&e>>9)*1335;var i=(t<<10|r)^21522;d(i>>>15==0);for(var n=0;n<=5;n++)this.setFunctionModule(8,n,l(i,n));this.setFunctionModule(8,7,l(i,6)),this.setFunctionModule(8,8,l(i,7)),this.setFunctionModule(7,8,l(i,8));for(var n=9;n<15;n++)this.setFunctionModule(14-n,8,l(i,n));for(var n=0;n<8;n++)this.setFunctionModule(this.size-1-n,8,l(i,n));for(var n=8;n<15;n++)this.setFunctionModule(8,this.size-15+n,l(i,n));this.setFunctionModule(8,this.size-8,!0)},a.prototype.drawVersion=function(){if(!(this.version<7)){for(var e=this.version,t=0;t<12;t++)e=e<<1^(e>>>11)*7973;var r=this.version<<12|e;d(r>>>18==0);for(var t=0;t<18;t++){var n=l(r,t),i=this.size-11+t%3,s=Math.floor(t/3);this.setFunctionModule(i,s,n),this.setFunctionModule(s,i,n)}}},a.prototype.drawFinderPattern=function(e,t){for(var r=-4;r<=4;r++)for(var n=-4;n<=4;n++){var i=Math.max(Math.abs(n),Math.abs(r)),s=e+n,f=t+r;0<=s&&s=f)&&M.push(P[y])})},m=0;m=1;r-=2){r==6&&(r=5);for(var n=0;n>>3],7-(t&7)),t++)}}d(t==e.length*8)},a.prototype.applyMask=function(e){if(e<0||e>7)throw new RangeError("Mask value out of range");for(var t=0;t5&&e++):(this.finderPenaltyAddHistory(n,i),r||(e+=this.finderPenaltyCountPatterns(i)*a.PENALTY_N3),r=this.modules[t][s],n=1);e+=this.finderPenaltyTerminateAndCount(r,n,i)*a.PENALTY_N3}for(var s=0;s5&&e++):(this.finderPenaltyAddHistory(f,i),r||(e+=this.finderPenaltyCountPatterns(i)*a.PENALTY_N3),r=this.modules[t][s],f=1);e+=this.finderPenaltyTerminateAndCount(r,f,i)*a.PENALTY_N3}for(var t=0;ta.MAX_VERSION)throw new RangeError("Version number out of range");var t=(16*e+128)*e+64;if(e>=2){var r=Math.floor(e/7)+2;t-=(25*r-10)*r-55,e>=7&&(t-=36)}return d(208<=t&&t<=29648),t},a.getNumDataCodewords=function(e,t){return Math.floor(a.getNumRawDataModules(e)/8)-a.ECC_CODEWORDS_PER_BLOCK[t.ordinal][e]*a.NUM_ERROR_CORRECTION_BLOCKS[t.ordinal][e]},a.reedSolomonComputeDivisor=function(e){if(e<1||e>255)throw new RangeError("Degree out of range");for(var t=[],r=0;r>>8||t>>>8)throw new RangeError("Byte out of range");for(var r=0,n=7;n>=0;n--)r=r<<1^(r>>>7)*285,r^=(t>>>n&1)*e;return d(r>>>8==0),r},a.prototype.finderPenaltyCountPatterns=function(e){var t=e[1];d(t<=this.size*3);var r=t>0&&e[2]==t&&e[3]==t*3&&e[4]==t&&e[5]==t;return(r&&e[0]>=t*4&&e[6]>=t?1:0)+(r&&e[6]>=t*4&&e[0]>=t?1:0)},a.prototype.finderPenaltyTerminateAndCount=function(e,t,r){return e&&(this.finderPenaltyAddHistory(t,r),t=0),t+=this.size,this.finderPenaltyAddHistory(t,r),this.finderPenaltyCountPatterns(r)},a.prototype.finderPenaltyAddHistory=function(e,t){t[0]==0&&(e+=this.size),t.pop(),t.unshift(e)},a.MIN_VERSION=1,a.MAX_VERSION=40,a.PENALTY_N1=3,a.PENALTY_N2=3,a.PENALTY_N3=40,a.PENALTY_N4=10,a.ECC_CODEWORDS_PER_BLOCK=[[-1,7,10,15,20,26,18,20,24,30,18,20,24,26,30,22,24,28,30,28,28,28,28,30,30,26,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,10,16,26,18,24,16,18,22,22,26,30,22,22,24,24,28,28,26,26,26,26,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28],[-1,13,22,18,26,18,24,18,22,20,24,28,26,24,20,30,24,28,28,26,30,28,30,30,30,30,28,30,30,30,30,30,30,30,30,30,30,30,30,30,30],[-1,17,28,22,16,22,28,26,26,24,28,24,28,22,24,24,30,28,28,26,28,30,24,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30]],a.NUM_ERROR_CORRECTION_BLOCKS=[[-1,1,1,1,1,1,2,2,2,2,4,4,4,4,4,6,6,6,6,7,8,8,9,9,10,12,12,12,13,14,15,16,17,18,19,19,20,21,22,24,25],[-1,1,1,1,2,2,4,4,4,5,5,5,8,9,9,10,10,11,13,14,16,17,17,18,20,21,23,25,26,28,29,31,33,35,37,38,40,43,45,47,49],[-1,1,1,2,2,4,4,6,6,8,8,8,10,12,16,12,17,16,18,21,20,23,23,25,27,29,34,34,35,38,40,43,45,48,51,53,56,59,62,65,68],[-1,1,1,2,4,4,4,5,6,8,8,11,11,16,16,18,16,19,21,25,25,25,34,30,32,35,37,40,42,45,48,51,54,57,60,63,66,70,74,77,81]],a}();o.QrCode=c;function u(a,e,t){if(e<0||e>31||a>>>e)throw new RangeError("Value out of range");for(var r=e-1;r>=0;r--)t.push(a>>>r&1)}function l(a,e){return(a>>>e&1)!=0}function d(a){if(!a)throw new Error("Assertion error")}var v=function(){function a(e,t,r){if(this.mode=e,this.numChars=t,this.bitData=r,t<0)throw new RangeError("Invalid argument");this.bitData=r.slice()}return a.makeBytes=function(e){for(var t=[],r=0,n=e;r=1<=c.y+c.h?u:u.map(function(d,v){return v=c.x+c.w?d:!1})})}var V={value:{type:String,required:!0,default:""},size:{type:Number,default:100},level:{type:String,default:q,validator:function(o){return W(o)}},background:{type:String,default:"#fff"},foreground:{type:String,default:"#000"},margin:{type:Number,required:!1,default:0},imageSettings:{type:Object,required:!1,default:function(){return{}}},gradient:{type:Boolean,required:!1,default:!1},gradientType:{type:String,required:!1,default:"linear",validator:function(o){return["linear","radial"].indexOf(o)>-1}},gradientStartColor:{type:String,required:!1,default:"#000"},gradientEndColor:{type:String,required:!1,default:"#fff"}},ve=A(A({},V),{renderAs:{type:String,required:!1,default:"canvas",validator:function(o){return["canvas","svg"].indexOf(o)>-1}}}),ge=Y({name:"QRCodeSvg",props:V,setup:function(o){var c=b(0),u=b(""),l,d=function(){var a=o.value,e=o.level,t=o.margin,r=t>>>0,n=W(e)?e:q,i=O.QrCode.encodeText(a,K[n]).getModules();if(c.value=i.length+r*2,o.imageSettings.src){var s=ee(i,o.size,r,o.imageSettings);l={x:s.x+r,y:s.y+r,width:s.w,height:s.h},s.excavation&&(i=te(i,s.excavation))}u.value=j(i,r)},v=function(){if(!o.gradient)return null;var a=o.gradientType==="linear"?{x1:"0%",y1:"0%",x2:"100%",y2:"100%"}:{cx:"50%",cy:"50%",r:"50%",fx:"50%",fy:"50%"};return _(o.gradientType==="linear"?"linearGradient":"radialGradient",A({id:"qr-gradient"},a),[_("stop",{offset:"0%",style:{stopColor:o.gradientStartColor}}),_("stop",{offset:"100%",style:{stopColor:o.gradientEndColor}})])};return d(),Z(d),function(){return _("svg",{width:o.size,height:o.size,"shape-rendering":"crispEdges",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 ".concat(c.value," ").concat(c.value)},[_("defs",{},[v()]),_("rect",{width:"100%",height:"100%",fill:o.background}),_("path",{fill:o.gradient?"url(#qr-gradient)":o.foreground,d:u.value}),o.imageSettings.src&&_("image",A({href:o.imageSettings.src},l))])}}}),me=Y({name:"QRCodeCanvas",props:V,setup:function(o,c){var u=b(null),l=b(null),d=function(){var a=o.value,e=o.level,t=o.size,r=o.margin,n=o.background,i=o.foreground,s=o.gradient,f=o.gradientType,C=o.gradientStartColor,w=o.gradientEndColor,E=r>>>0,m=W(e)?e:q,h=u.value;if(h){var g=h.getContext("2d");if(g){var p=O.QrCode.encodeText(a,K[m]).getModules(),M=p.length+E*2,N=l.value,y={x:0,y:0,width:0,height:0},P=o.imageSettings.src&&N!=null&&N.naturalWidth!==0&&N.naturalHeight!==0;if(P){var S=ee(p,o.size,E,o.imageSettings);y={x:S.x+E,y:S.y+E,width:S.w,height:S.h},S.excavation&&(p=te(p,S.excavation))}var F=window.devicePixelRatio||1,B=t/M*F;if(h.height=h.width=t*F,g.scale(B,B),g.fillStyle=n,g.fillRect(0,0,M,M),s){var I=void 0;f==="linear"?I=g.createLinearGradient(0,0,M,M):I=g.createRadialGradient(M/2,M/2,0,M/2,M/2,M/2),I.addColorStop(0,C),I.addColorStop(1,w),g.fillStyle=I}else g.fillStyle=i;he?g.fill(new Path2D(j(p,E))):p.forEach(function(k,U){k.forEach(function(Q,re){Q&&g.fillRect(re+E,U+E,1,1)})}),P&&g.drawImage(N,y.x,y.y,y.width,y.height)}}};J(d),Z(d);var v=c.attrs.style;return function(){return _(ae,[_("canvas",A(A({},c.attrs),{ref:u,style:A(A({},v),{width:"".concat(o.size,"px"),height:"".concat(o.size,"px")})})),o.imageSettings.src&&_("img",{ref:l,src:o.imageSettings.src,style:{display:"none"},onLoad:d})])}}}),Ce=Y({name:"Qrcode",render:function(){var o=this.$props,c=o.renderAs,u=o.value,l=o.size,d=o.margin,v=o.level,a=o.background,e=o.foreground,t=o.imageSettings,r=o.gradient,n=o.gradientType,i=o.gradientStartColor,s=o.gradientEndColor;return _(c==="svg"?ge:me,{value:u,size:l,margin:d,level:v,background:a,foreground:e,imageSettings:t,gradient:r,gradientType:n,gradientStartColor:i,gradientEndColor:s})},props:ve});const pe={class:"main-content"},Ee={class:"app-container"},we={key:0,class:"page-header"},Me={key:1,class:"loading-state"},Re={key:2,class:"card"},ye={class:"generate-section"},_e=["disabled"],Ne={key:0,class:"code-section"},Se={class:"code-display"},Ae={class:"code-header"},be={class:"code-timer"},Pe={class:"code-value"},Ie={class:"action-buttons"},ze=["href"],Te={key:0,class:"qr-section"},Be={__name:"TelegramView",setup(o){const c=de.create({baseURL:"/api/telegram",headers:{"Content-Type":"application/json"}});c.interceptors.request.use(m=>{const h=localStorage.getItem("access_token");return h&&(m.headers.Authorization=`Bearer ${h}`),m});const u=ue(),l=ie(),d=b(window.innerWidth<768),v=()=>{d.value=window.innerWidth<768},a=b(""),e=b(0),t=b(!1),r=b(!1);let n=null;const i="roa2web_bot",s=ne(()=>a.value?`https://t.me/${i}?start=${a.value}`:""),f=async()=>{var m,h;t.value=!0,r.value=!1;try{const g=await c.post("/auth/generate-code");a.value=g.data.linking_code,e.value=g.data.expires_in_minutes*60,u.add({severity:"success",summary:"Cod Generat",detail:"Alege o metodă de conectare",life:3e3}),C()}catch(g){console.error("Error generating code:",g),u.add({severity:"error",summary:"Eroare",detail:((h=(m=g.response)==null?void 0:m.data)==null?void 0:h.detail)||"Nu am putut genera codul",life:5e3})}finally{t.value=!1}},C=()=>{n&&clearInterval(n),n=setInterval(()=>{e.value>0?e.value--:(clearInterval(n),a.value="",u.add({severity:"warn",summary:"Cod Expirat",detail:"Generează un cod nou",life:4e3}))},1e3)},w=m=>{const h=Math.floor(m/60),g=m%60;return`${h}:${g.toString().padStart(2,"0")}`},E=async()=>{try{await navigator.clipboard.writeText(a.value),u.add({severity:"success",summary:"Copiat",detail:"Cod copiat în clipboard",life:2e3})}catch{const h=document.createElement("input");h.value=a.value,document.body.appendChild(h),h.select(),document.execCommand("copy"),document.body.removeChild(h),u.add({severity:"success",summary:"Copiat",life:2e3})}};return J(()=>{window.addEventListener("resize",v)}),oe(()=>{window.removeEventListener("resize",v),n&&clearInterval(n)}),(m,h)=>(z(),L("div",{class:se(["telegram-view",{"mobile-layout":d.value}])},[d.value?(z(),x(ce,{key:0,title:"Telegram","show-back":!0,onBackClick:h[0]||(h[0]=g=>H(l).push("/settings"))})):D("",!0),R("main",pe,[R("div",Ee,[d.value?D("",!0):(z(),L("div",we,[...h[2]||(h[2]=[R("h1",{class:"page-title"},"Telegram Bot",-1),R("p",{class:"page-subtitle"}," Conectează-ți contul pentru acces rapid din Telegram ",-1)])])),t.value?(z(),L("div",Me,[...h[3]||(h[3]=[R("div",{class:"loading-spinner"},null,-1),R("p",null,"Se generează codul...",-1)])])):(z(),L("div",Re,[R("div",ye,[R("button",{onClick:f,disabled:t.value,class:"btn btn-primary btn-lg"},G(t.value?"Se generează...":"Generează Cod"),9,_e)]),a.value?(z(),L("div",Ne,[R("div",Se,[R("div",Ae,[h[4]||(h[4]=R("span",{class:"code-label"},"Cod",-1)),R("span",be,G(w(e.value)),1)]),R("div",Pe,G(a.value),1)]),R("div",Ie,[R("a",{href:s.value,target:"_blank",rel:"noopener noreferrer",class:"btn btn-primary action-btn"}," Deschide Telegram ",8,ze),$(H(X),{label:r.value?"Ascunde QR":"Arată QR",onClick:h[1]||(h[1]=g=>r.value=!r.value),class:"action-btn",outlined:""},null,8,["label"]),$(H(X),{label:"Copiază Cod",onClick:E,class:"action-btn",outlined:""})]),r.value?(z(),L("div",Te,[$(Ce,{value:s.value,size:200,level:"H"},null,8,["value"])])):D("",!0)])):D("",!0)]))])]),d.value?(z(),x(fe,{key:1})):D("",!0)],2))}},He=le(Be,[["__scopeId","data-v-58afaec8"]]);export{He as default}; -//# sourceMappingURL=TelegramView.DlM-s8w5.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/TelegramView.DlM-s8w5.js.map b/deploy-package-20260223-151231/frontend/assets/TelegramView.DlM-s8w5.js.map deleted file mode 100644 index 32d5b85..0000000 --- a/deploy-package-20260223-151231/frontend/assets/TelegramView.DlM-s8w5.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"TelegramView.DlM-s8w5.js","sources":["../../node_modules/qrcode.vue/dist/qrcode.vue.esm.js","../../src/modules/reports/views/TelegramView.vue"],"sourcesContent":["/*!\n * qrcode.vue v3.6.0\n * A Vue.js component to generate QRCode. Both support Vue 2 and Vue 3\n * © 2017-PRESENT @scopewu(https://github.com/scopewu)\n * MIT License.\n */\nimport { defineComponent, ref, onUpdated, h, onMounted, Fragment } from 'vue';\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\r\n\r\n\r\nvar __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\n\r\ntypeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\r\n var e = new Error(message);\r\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\r\n};\n\n/*\n * QR Code generator library (TypeScript)\n *\n * Copyright (c) Project Nayuki. (MIT License)\n * https://www.nayuki.io/page/qr-code-generator-library\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy of\n * this software and associated documentation files (the \"Software\"), to deal in\n * the Software without restriction, including without limitation the rights to\n * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software is furnished to do so,\n * subject to the following conditions:\n * - The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * - The Software is provided \"as is\", without warranty of any kind, express or\n * implied, including but not limited to the warranties of merchantability,\n * fitness for a particular purpose and noninfringement. In no event shall the\n * authors or copyright holders be liable for any claim, damages or other\n * liability, whether in an action of contract, tort or otherwise, arising from,\n * out of or in connection with the Software or the use or other dealings in the\n * Software.\n */\nvar qrcodegen;\n(function (qrcodegen) {\n /*---- QR Code symbol class ----*/\n /*\n * A QR Code symbol, which is a type of two-dimension barcode.\n * Invented by Denso Wave and described in the ISO/IEC 18004 standard.\n * Instances of this class represent an immutable square grid of dark and light cells.\n * The class provides static factory functions to create a QR Code from text or binary data.\n * The class covers the QR Code Model 2 specification, supporting all versions (sizes)\n * from 1 to 40, all 4 error correction levels, and 4 character encoding modes.\n *\n * Ways to create a QR Code object:\n * - High level: Take the payload data and call QrCode.encodeText() or QrCode.encodeBinary().\n * - Mid level: Custom-make the list of segments and call QrCode.encodeSegments().\n * - Low level: Custom-make the array of data codeword bytes (including\n * segment headers and final padding, excluding error correction codewords),\n * supply the appropriate version number, and call the QrCode() constructor.\n * (Note that all ways require supplying the desired error correction level.)\n */\n var QrCode = /** @class */ (function () {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code with the given version number,\n // error correction level, data codeword bytes, and mask number.\n // This is a low-level API that most users should not use directly.\n // A mid-level API is the encodeSegments() function.\n function QrCode(\n // The version number of this QR Code, which is between 1 and 40 (inclusive).\n // This determines the size of this barcode.\n version, \n // The error correction level used in this QR Code.\n errorCorrectionLevel, dataCodewords, msk) {\n this.version = version;\n this.errorCorrectionLevel = errorCorrectionLevel;\n // The modules of this QR Code (false = light, true = dark).\n // Immutable after constructor finishes. Accessed through getModule().\n this.modules = [];\n // Indicates function modules that are not subjected to masking. Discarded when constructor finishes.\n this.isFunction = [];\n // Check scalar arguments\n if (version < QrCode.MIN_VERSION || version > QrCode.MAX_VERSION)\n throw new RangeError(\"Version value out of range\");\n if (msk < -1 || msk > 7)\n throw new RangeError(\"Mask value out of range\");\n this.size = version * 4 + 17;\n // Initialize both grids to be size*size arrays of Boolean false\n var row = [];\n for (var i = 0; i < this.size; i++)\n row.push(false);\n for (var i = 0; i < this.size; i++) {\n this.modules.push(row.slice()); // Initially all light\n this.isFunction.push(row.slice());\n }\n // Compute ECC, draw modules\n this.drawFunctionPatterns();\n var allCodewords = this.addEccAndInterleave(dataCodewords);\n this.drawCodewords(allCodewords);\n // Do masking\n if (msk == -1) { // Automatically choose best mask\n var minPenalty = 1000000000;\n for (var i = 0; i < 8; i++) {\n this.applyMask(i);\n this.drawFormatBits(i);\n var penalty = this.getPenaltyScore();\n if (penalty < minPenalty) {\n msk = i;\n minPenalty = penalty;\n }\n this.applyMask(i); // Undoes the mask due to XOR\n }\n }\n assert(0 <= msk && msk <= 7);\n this.mask = msk;\n this.applyMask(msk); // Apply the final choice of mask\n this.drawFormatBits(msk); // Overwrite old format bits\n this.isFunction = [];\n }\n /*-- Static factory functions (high level) --*/\n // Returns a QR Code representing the given Unicode text string at the given error correction level.\n // As a conservative upper bound, this function is guaranteed to succeed for strings that have 738 or fewer\n // Unicode code points (not UTF-16 code units) if the low error correction level is used. The smallest possible\n // QR Code version is automatically chosen for the output. The ECC level of the result may be higher than the\n // ecl argument if it can be done without increasing the version.\n QrCode.encodeText = function (text, ecl) {\n var segs = qrcodegen.QrSegment.makeSegments(text);\n return QrCode.encodeSegments(segs, ecl);\n };\n // Returns a QR Code representing the given binary data at the given error correction level.\n // This function always encodes using the binary segment mode, not any text mode. The maximum number of\n // bytes allowed is 2953. The smallest possible QR Code version is automatically chosen for the output.\n // The ECC level of the result may be higher than the ecl argument if it can be done without increasing the version.\n QrCode.encodeBinary = function (data, ecl) {\n var seg = qrcodegen.QrSegment.makeBytes(data);\n return QrCode.encodeSegments([seg], ecl);\n };\n /*-- Static factory functions (mid level) --*/\n // Returns a QR Code representing the given segments with the given encoding parameters.\n // The smallest possible QR Code version within the given range is automatically\n // chosen for the output. Iff boostEcl is true, then the ECC level of the result\n // may be higher than the ecl argument if it can be done without increasing the\n // version. The mask number is either between 0 to 7 (inclusive) to force that\n // mask, or -1 to automatically choose an appropriate mask (which may be slow).\n // This function allows the user to create a custom sequence of segments that switches\n // between modes (such as alphanumeric and byte) to encode text in less space.\n // This is a mid-level API; the high-level API is encodeText() and encodeBinary().\n QrCode.encodeSegments = function (segs, ecl, minVersion, maxVersion, mask, boostEcl) {\n if (minVersion === void 0) { minVersion = 1; }\n if (maxVersion === void 0) { maxVersion = 40; }\n if (mask === void 0) { mask = -1; }\n if (boostEcl === void 0) { boostEcl = true; }\n if (!(QrCode.MIN_VERSION <= minVersion && minVersion <= maxVersion && maxVersion <= QrCode.MAX_VERSION)\n || mask < -1 || mask > 7)\n throw new RangeError(\"Invalid value\");\n // Find the minimal version number to use\n var version;\n var dataUsedBits;\n for (version = minVersion;; version++) {\n var dataCapacityBits_1 = QrCode.getNumDataCodewords(version, ecl) * 8; // Number of data bits available\n var usedBits = QrSegment.getTotalBits(segs, version);\n if (usedBits <= dataCapacityBits_1) {\n dataUsedBits = usedBits;\n break; // This version number is found to be suitable\n }\n if (version >= maxVersion) // All versions in the range could not fit the given data\n throw new RangeError(\"Data too long\");\n }\n // Increase the error correction level while the data still fits in the current version number\n for (var _i = 0, _a = [QrCode.Ecc.MEDIUM, QrCode.Ecc.QUARTILE, QrCode.Ecc.HIGH]; _i < _a.length; _i++) { // From low to high\n var newEcl = _a[_i];\n if (boostEcl && dataUsedBits <= QrCode.getNumDataCodewords(version, newEcl) * 8)\n ecl = newEcl;\n }\n // Concatenate all segments to create the data bit string\n var bb = [];\n for (var _b = 0, segs_1 = segs; _b < segs_1.length; _b++) {\n var seg = segs_1[_b];\n appendBits(seg.mode.modeBits, 4, bb);\n appendBits(seg.numChars, seg.mode.numCharCountBits(version), bb);\n for (var _c = 0, _d = seg.getData(); _c < _d.length; _c++) {\n var b = _d[_c];\n bb.push(b);\n }\n }\n assert(bb.length == dataUsedBits);\n // Add terminator and pad up to a byte if applicable\n var dataCapacityBits = QrCode.getNumDataCodewords(version, ecl) * 8;\n assert(bb.length <= dataCapacityBits);\n appendBits(0, Math.min(4, dataCapacityBits - bb.length), bb);\n appendBits(0, (8 - bb.length % 8) % 8, bb);\n assert(bb.length % 8 == 0);\n // Pad with alternating bytes until data capacity is reached\n for (var padByte = 0xEC; bb.length < dataCapacityBits; padByte ^= 0xEC ^ 0x11)\n appendBits(padByte, 8, bb);\n // Pack bits into bytes in big endian\n var dataCodewords = [];\n while (dataCodewords.length * 8 < bb.length)\n dataCodewords.push(0);\n bb.forEach(function (b, i) {\n return dataCodewords[i >>> 3] |= b << (7 - (i & 7));\n });\n // Create the QR Code object\n return new QrCode(version, ecl, dataCodewords, mask);\n };\n /*-- Accessor methods --*/\n // Returns the color of the module (pixel) at the given coordinates, which is false\n // for light or true for dark. The top left corner has the coordinates (x=0, y=0).\n // If the given coordinates are out of bounds, then false (light) is returned.\n QrCode.prototype.getModule = function (x, y) {\n return 0 <= x && x < this.size && 0 <= y && y < this.size && this.modules[y][x];\n };\n QrCode.prototype.getModules = function () {\n return this.modules;\n };\n /*-- Private helper methods for constructor: Drawing function modules --*/\n // Reads this object's version field, and draws and marks all function modules.\n QrCode.prototype.drawFunctionPatterns = function () {\n // Draw horizontal and vertical timing patterns\n for (var i = 0; i < this.size; i++) {\n this.setFunctionModule(6, i, i % 2 == 0);\n this.setFunctionModule(i, 6, i % 2 == 0);\n }\n // Draw 3 finder patterns (all corners except bottom right; overwrites some timing modules)\n this.drawFinderPattern(3, 3);\n this.drawFinderPattern(this.size - 4, 3);\n this.drawFinderPattern(3, this.size - 4);\n // Draw numerous alignment patterns\n var alignPatPos = this.getAlignmentPatternPositions();\n var numAlign = alignPatPos.length;\n for (var i = 0; i < numAlign; i++) {\n for (var j = 0; j < numAlign; j++) {\n // Don't draw on the three finder corners\n if (!(i == 0 && j == 0 || i == 0 && j == numAlign - 1 || i == numAlign - 1 && j == 0))\n this.drawAlignmentPattern(alignPatPos[i], alignPatPos[j]);\n }\n }\n // Draw configuration data\n this.drawFormatBits(0); // Dummy mask value; overwritten later in the constructor\n this.drawVersion();\n };\n // Draws two copies of the format bits (with its own error correction code)\n // based on the given mask and this object's error correction level field.\n QrCode.prototype.drawFormatBits = function (mask) {\n // Calculate error correction code and pack bits\n var data = this.errorCorrectionLevel.formatBits << 3 | mask; // errCorrLvl is uint2, mask is uint3\n var rem = data;\n for (var i = 0; i < 10; i++)\n rem = (rem << 1) ^ ((rem >>> 9) * 0x537);\n var bits = (data << 10 | rem) ^ 0x5412; // uint15\n assert(bits >>> 15 == 0);\n // Draw first copy\n for (var i = 0; i <= 5; i++)\n this.setFunctionModule(8, i, getBit(bits, i));\n this.setFunctionModule(8, 7, getBit(bits, 6));\n this.setFunctionModule(8, 8, getBit(bits, 7));\n this.setFunctionModule(7, 8, getBit(bits, 8));\n for (var i = 9; i < 15; i++)\n this.setFunctionModule(14 - i, 8, getBit(bits, i));\n // Draw second copy\n for (var i = 0; i < 8; i++)\n this.setFunctionModule(this.size - 1 - i, 8, getBit(bits, i));\n for (var i = 8; i < 15; i++)\n this.setFunctionModule(8, this.size - 15 + i, getBit(bits, i));\n this.setFunctionModule(8, this.size - 8, true); // Always dark\n };\n // Draws two copies of the version bits (with its own error correction code),\n // based on this object's version field, iff 7 <= version <= 40.\n QrCode.prototype.drawVersion = function () {\n if (this.version < 7)\n return;\n // Calculate error correction code and pack bits\n var rem = this.version; // version is uint6, in the range [7, 40]\n for (var i = 0; i < 12; i++)\n rem = (rem << 1) ^ ((rem >>> 11) * 0x1F25);\n var bits = this.version << 12 | rem; // uint18\n assert(bits >>> 18 == 0);\n // Draw two copies\n for (var i = 0; i < 18; i++) {\n var color = getBit(bits, i);\n var a = this.size - 11 + i % 3;\n var b = Math.floor(i / 3);\n this.setFunctionModule(a, b, color);\n this.setFunctionModule(b, a, color);\n }\n };\n // Draws a 9*9 finder pattern including the border separator,\n // with the center module at (x, y). Modules can be out of bounds.\n QrCode.prototype.drawFinderPattern = function (x, y) {\n for (var dy = -4; dy <= 4; dy++) {\n for (var dx = -4; dx <= 4; dx++) {\n var dist = Math.max(Math.abs(dx), Math.abs(dy)); // Chebyshev/infinity norm\n var xx = x + dx;\n var yy = y + dy;\n if (0 <= xx && xx < this.size && 0 <= yy && yy < this.size)\n this.setFunctionModule(xx, yy, dist != 2 && dist != 4);\n }\n }\n };\n // Draws a 5*5 alignment pattern, with the center module\n // at (x, y). All modules must be in bounds.\n QrCode.prototype.drawAlignmentPattern = function (x, y) {\n for (var dy = -2; dy <= 2; dy++) {\n for (var dx = -2; dx <= 2; dx++)\n this.setFunctionModule(x + dx, y + dy, Math.max(Math.abs(dx), Math.abs(dy)) != 1);\n }\n };\n // Sets the color of a module and marks it as a function module.\n // Only used by the constructor. Coordinates must be in bounds.\n QrCode.prototype.setFunctionModule = function (x, y, isDark) {\n this.modules[y][x] = isDark;\n this.isFunction[y][x] = true;\n };\n /*-- Private helper methods for constructor: Codewords and masking --*/\n // Returns a new byte string representing the given data with the appropriate error correction\n // codewords appended to it, based on this object's version and error correction level.\n QrCode.prototype.addEccAndInterleave = function (data) {\n var ver = this.version;\n var ecl = this.errorCorrectionLevel;\n if (data.length != QrCode.getNumDataCodewords(ver, ecl))\n throw new RangeError(\"Invalid argument\");\n // Calculate parameter numbers\n var numBlocks = QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n var blockEccLen = QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver];\n var rawCodewords = Math.floor(QrCode.getNumRawDataModules(ver) / 8);\n var numShortBlocks = numBlocks - rawCodewords % numBlocks;\n var shortBlockLen = Math.floor(rawCodewords / numBlocks);\n // Split data into blocks and append ECC to each block\n var blocks = [];\n var rsDiv = QrCode.reedSolomonComputeDivisor(blockEccLen);\n for (var i = 0, k = 0; i < numBlocks; i++) {\n var dat = data.slice(k, k + shortBlockLen - blockEccLen + (i < numShortBlocks ? 0 : 1));\n k += dat.length;\n var ecc = QrCode.reedSolomonComputeRemainder(dat, rsDiv);\n if (i < numShortBlocks)\n dat.push(0);\n blocks.push(dat.concat(ecc));\n }\n // Interleave (not concatenate) the bytes from every block into a single sequence\n var result = [];\n var _loop_1 = function (i) {\n blocks.forEach(function (block, j) {\n // Skip the padding byte in short blocks\n if (i != shortBlockLen - blockEccLen || j >= numShortBlocks)\n result.push(block[i]);\n });\n };\n for (var i = 0; i < blocks[0].length; i++) {\n _loop_1(i);\n }\n assert(result.length == rawCodewords);\n return result;\n };\n // Draws the given sequence of 8-bit codewords (data and error correction) onto the entire\n // data area of this QR Code. Function modules need to be marked off before this is called.\n QrCode.prototype.drawCodewords = function (data) {\n if (data.length != Math.floor(QrCode.getNumRawDataModules(this.version) / 8))\n throw new RangeError(\"Invalid argument\");\n var i = 0; // Bit index into the data\n // Do the funny zigzag scan\n for (var right = this.size - 1; right >= 1; right -= 2) { // Index of right column in each column pair\n if (right == 6)\n right = 5;\n for (var vert = 0; vert < this.size; vert++) { // Vertical counter\n for (var j = 0; j < 2; j++) {\n var x = right - j; // Actual x coordinate\n var upward = ((right + 1) & 2) == 0;\n var y = upward ? this.size - 1 - vert : vert; // Actual y coordinate\n if (!this.isFunction[y][x] && i < data.length * 8) {\n this.modules[y][x] = getBit(data[i >>> 3], 7 - (i & 7));\n i++;\n }\n // If this QR Code has any remainder bits (0 to 7), they were assigned as\n // 0/false/light by the constructor and are left unchanged by this method\n }\n }\n }\n assert(i == data.length * 8);\n };\n // XORs the codeword modules in this QR Code with the given mask pattern.\n // The function modules must be marked and the codeword bits must be drawn\n // before masking. Due to the arithmetic of XOR, calling applyMask() with\n // the same mask value a second time will undo the mask. A final well-formed\n // QR Code needs exactly one (not zero, two, etc.) mask applied.\n QrCode.prototype.applyMask = function (mask) {\n if (mask < 0 || mask > 7)\n throw new RangeError(\"Mask value out of range\");\n for (var y = 0; y < this.size; y++) {\n for (var x = 0; x < this.size; x++) {\n var invert = void 0;\n switch (mask) {\n case 0:\n invert = (x + y) % 2 == 0;\n break;\n case 1:\n invert = y % 2 == 0;\n break;\n case 2:\n invert = x % 3 == 0;\n break;\n case 3:\n invert = (x + y) % 3 == 0;\n break;\n case 4:\n invert = (Math.floor(x / 3) + Math.floor(y / 2)) % 2 == 0;\n break;\n case 5:\n invert = x * y % 2 + x * y % 3 == 0;\n break;\n case 6:\n invert = (x * y % 2 + x * y % 3) % 2 == 0;\n break;\n case 7:\n invert = ((x + y) % 2 + x * y % 3) % 2 == 0;\n break;\n default: throw new Error(\"Unreachable\");\n }\n if (!this.isFunction[y][x] && invert)\n this.modules[y][x] = !this.modules[y][x];\n }\n }\n };\n // Calculates and returns the penalty score based on state of this QR Code's current modules.\n // This is used by the automatic mask choice algorithm to find the mask pattern that yields the lowest score.\n QrCode.prototype.getPenaltyScore = function () {\n var result = 0;\n // Adjacent modules in row having same color, and finder-like patterns\n for (var y = 0; y < this.size; y++) {\n var runColor = false;\n var runX = 0;\n var runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (var x = 0; x < this.size; x++) {\n if (this.modules[y][x] == runColor) {\n runX++;\n if (runX == 5)\n result += QrCode.PENALTY_N1;\n else if (runX > 5)\n result++;\n }\n else {\n this.finderPenaltyAddHistory(runX, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runX = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runX, runHistory) * QrCode.PENALTY_N3;\n }\n // Adjacent modules in column having same color, and finder-like patterns\n for (var x = 0; x < this.size; x++) {\n var runColor = false;\n var runY = 0;\n var runHistory = [0, 0, 0, 0, 0, 0, 0];\n for (var y = 0; y < this.size; y++) {\n if (this.modules[y][x] == runColor) {\n runY++;\n if (runY == 5)\n result += QrCode.PENALTY_N1;\n else if (runY > 5)\n result++;\n }\n else {\n this.finderPenaltyAddHistory(runY, runHistory);\n if (!runColor)\n result += this.finderPenaltyCountPatterns(runHistory) * QrCode.PENALTY_N3;\n runColor = this.modules[y][x];\n runY = 1;\n }\n }\n result += this.finderPenaltyTerminateAndCount(runColor, runY, runHistory) * QrCode.PENALTY_N3;\n }\n // 2*2 blocks of modules having same color\n for (var y = 0; y < this.size - 1; y++) {\n for (var x = 0; x < this.size - 1; x++) {\n var color = this.modules[y][x];\n if (color == this.modules[y][x + 1] &&\n color == this.modules[y + 1][x] &&\n color == this.modules[y + 1][x + 1])\n result += QrCode.PENALTY_N2;\n }\n }\n // Balance of dark and light modules\n var dark = 0;\n for (var _i = 0, _a = this.modules; _i < _a.length; _i++) {\n var row = _a[_i];\n dark = row.reduce(function (sum, color) { return sum + (color ? 1 : 0); }, dark);\n }\n var total = this.size * this.size; // Note that size is odd, so dark/total != 1/2\n // Compute the smallest integer k >= 0 such that (45-5k)% <= dark/total <= (55+5k)%\n var k = Math.ceil(Math.abs(dark * 20 - total * 10) / total) - 1;\n assert(0 <= k && k <= 9);\n result += k * QrCode.PENALTY_N4;\n assert(0 <= result && result <= 2568888); // Non-tight upper bound based on default values of PENALTY_N1, ..., N4\n return result;\n };\n /*-- Private helper functions --*/\n // Returns an ascending list of positions of alignment patterns for this version number.\n // Each position is in the range [0,177), and are used on both the x and y axes.\n // This could be implemented as lookup table of 40 variable-length lists of integers.\n QrCode.prototype.getAlignmentPatternPositions = function () {\n if (this.version == 1)\n return [];\n else {\n var numAlign = Math.floor(this.version / 7) + 2;\n var step = Math.floor((this.version * 8 + numAlign * 3 + 5) / (numAlign * 4 - 4)) * 2;\n var result = [6];\n for (var pos = this.size - 7; result.length < numAlign; pos -= step)\n result.splice(1, 0, pos);\n return result;\n }\n };\n // Returns the number of data bits that can be stored in a QR Code of the given version number, after\n // all function modules are excluded. This includes remainder bits, so it might not be a multiple of 8.\n // The result is in the range [208, 29648]. This could be implemented as a 40-entry lookup table.\n QrCode.getNumRawDataModules = function (ver) {\n if (ver < QrCode.MIN_VERSION || ver > QrCode.MAX_VERSION)\n throw new RangeError(\"Version number out of range\");\n var result = (16 * ver + 128) * ver + 64;\n if (ver >= 2) {\n var numAlign = Math.floor(ver / 7) + 2;\n result -= (25 * numAlign - 10) * numAlign - 55;\n if (ver >= 7)\n result -= 36;\n }\n assert(208 <= result && result <= 29648);\n return result;\n };\n // Returns the number of 8-bit data (i.e. not error correction) codewords contained in any\n // QR Code of the given version number and error correction level, with remainder bits discarded.\n // This stateless pure function could be implemented as a (40*4)-cell lookup table.\n QrCode.getNumDataCodewords = function (ver, ecl) {\n return Math.floor(QrCode.getNumRawDataModules(ver) / 8) -\n QrCode.ECC_CODEWORDS_PER_BLOCK[ecl.ordinal][ver] *\n QrCode.NUM_ERROR_CORRECTION_BLOCKS[ecl.ordinal][ver];\n };\n // Returns a Reed-Solomon ECC generator polynomial for the given degree. This could be\n // implemented as a lookup table over all possible parameter values, instead of as an algorithm.\n QrCode.reedSolomonComputeDivisor = function (degree) {\n if (degree < 1 || degree > 255)\n throw new RangeError(\"Degree out of range\");\n // Polynomial coefficients are stored from highest to lowest power, excluding the leading term which is always 1.\n // For example the polynomial x^3 + 255x^2 + 8x + 93 is stored as the uint8 array [255, 8, 93].\n var result = [];\n for (var i = 0; i < degree - 1; i++)\n result.push(0);\n result.push(1); // Start off with the monomial x^0\n // Compute the product polynomial (x - r^0) * (x - r^1) * (x - r^2) * ... * (x - r^{degree-1}),\n // and drop the highest monomial term which is always 1x^degree.\n // Note that r = 0x02, which is a generator element of this field GF(2^8/0x11D).\n var root = 1;\n for (var i = 0; i < degree; i++) {\n // Multiply the current product by (x - r^i)\n for (var j = 0; j < result.length; j++) {\n result[j] = QrCode.reedSolomonMultiply(result[j], root);\n if (j + 1 < result.length)\n result[j] ^= result[j + 1];\n }\n root = QrCode.reedSolomonMultiply(root, 0x02);\n }\n return result;\n };\n // Returns the Reed-Solomon error correction codeword for the given data and divisor polynomials.\n QrCode.reedSolomonComputeRemainder = function (data, divisor) {\n var result = divisor.map(function (_) { return 0; });\n var _loop_2 = function (b) {\n var factor = b ^ result.shift();\n result.push(0);\n divisor.forEach(function (coef, i) {\n return result[i] ^= QrCode.reedSolomonMultiply(coef, factor);\n });\n };\n for (var _i = 0, data_1 = data; _i < data_1.length; _i++) {\n var b = data_1[_i];\n _loop_2(b);\n }\n return result;\n };\n // Returns the product of the two given field elements modulo GF(2^8/0x11D). The arguments and result\n // are unsigned 8-bit integers. This could be implemented as a lookup table of 256*256 entries of uint8.\n QrCode.reedSolomonMultiply = function (x, y) {\n if (x >>> 8 != 0 || y >>> 8 != 0)\n throw new RangeError(\"Byte out of range\");\n // Russian peasant multiplication\n var z = 0;\n for (var i = 7; i >= 0; i--) {\n z = (z << 1) ^ ((z >>> 7) * 0x11D);\n z ^= ((y >>> i) & 1) * x;\n }\n assert(z >>> 8 == 0);\n return z;\n };\n // Can only be called immediately after a light run is added, and\n // returns either 0, 1, or 2. A helper function for getPenaltyScore().\n QrCode.prototype.finderPenaltyCountPatterns = function (runHistory) {\n var n = runHistory[1];\n assert(n <= this.size * 3);\n var core = n > 0 && runHistory[2] == n && runHistory[3] == n * 3 && runHistory[4] == n && runHistory[5] == n;\n return (core && runHistory[0] >= n * 4 && runHistory[6] >= n ? 1 : 0)\n + (core && runHistory[6] >= n * 4 && runHistory[0] >= n ? 1 : 0);\n };\n // Must be called at the end of a line (row or column) of modules. A helper function for getPenaltyScore().\n QrCode.prototype.finderPenaltyTerminateAndCount = function (currentRunColor, currentRunLength, runHistory) {\n if (currentRunColor) { // Terminate dark run\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n currentRunLength = 0;\n }\n currentRunLength += this.size; // Add light border to final run\n this.finderPenaltyAddHistory(currentRunLength, runHistory);\n return this.finderPenaltyCountPatterns(runHistory);\n };\n // Pushes the given value to the front and drops the last value. A helper function for getPenaltyScore().\n QrCode.prototype.finderPenaltyAddHistory = function (currentRunLength, runHistory) {\n if (runHistory[0] == 0)\n currentRunLength += this.size; // Add light border to initial run\n runHistory.pop();\n runHistory.unshift(currentRunLength);\n };\n /*-- Constants and tables --*/\n // The minimum version number supported in the QR Code Model 2 standard.\n QrCode.MIN_VERSION = 1;\n // The maximum version number supported in the QR Code Model 2 standard.\n QrCode.MAX_VERSION = 40;\n // For use in getPenaltyScore(), when evaluating which mask is best.\n QrCode.PENALTY_N1 = 3;\n QrCode.PENALTY_N2 = 3;\n QrCode.PENALTY_N3 = 40;\n QrCode.PENALTY_N4 = 10;\n QrCode.ECC_CODEWORDS_PER_BLOCK = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 7, 10, 15, 20, 26, 18, 20, 24, 30, 18, 20, 24, 26, 30, 22, 24, 28, 30, 28, 28, 28, 28, 30, 30, 26, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], // Low\n [-1, 10, 16, 26, 18, 24, 16, 18, 22, 22, 26, 30, 22, 22, 24, 24, 28, 28, 26, 26, 26, 26, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28], // Medium\n [-1, 13, 22, 18, 26, 18, 24, 18, 22, 20, 24, 28, 26, 24, 20, 30, 24, 28, 28, 26, 30, 28, 30, 30, 30, 30, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], // Quartile\n [-1, 17, 28, 22, 16, 22, 28, 26, 26, 24, 28, 24, 28, 22, 24, 24, 30, 28, 28, 26, 28, 30, 24, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30], // High\n ];\n QrCode.NUM_ERROR_CORRECTION_BLOCKS = [\n // Version: (note that index 0 is for padding, and is set to an illegal value)\n //0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40 Error correction level\n [-1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 4, 6, 6, 6, 6, 7, 8, 8, 9, 9, 10, 12, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 24, 25], // Low\n [-1, 1, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 8, 9, 9, 10, 10, 11, 13, 14, 16, 17, 17, 18, 20, 21, 23, 25, 26, 28, 29, 31, 33, 35, 37, 38, 40, 43, 45, 47, 49], // Medium\n [-1, 1, 1, 2, 2, 4, 4, 6, 6, 8, 8, 8, 10, 12, 16, 12, 17, 16, 18, 21, 20, 23, 23, 25, 27, 29, 34, 34, 35, 38, 40, 43, 45, 48, 51, 53, 56, 59, 62, 65, 68], // Quartile\n [-1, 1, 1, 2, 4, 4, 4, 5, 6, 8, 8, 11, 11, 16, 16, 18, 16, 19, 21, 25, 25, 25, 34, 30, 32, 35, 37, 40, 42, 45, 48, 51, 54, 57, 60, 63, 66, 70, 74, 77, 81], // High\n ];\n return QrCode;\n }());\n qrcodegen.QrCode = QrCode;\n // Appends the given number of low-order bits of the given value\n // to the given buffer. Requires 0 <= len <= 31 and 0 <= val < 2^len.\n function appendBits(val, len, bb) {\n if (len < 0 || len > 31 || val >>> len != 0)\n throw new RangeError(\"Value out of range\");\n for (var i = len - 1; i >= 0; i--) // Append bit by bit\n bb.push((val >>> i) & 1);\n }\n // Returns true iff the i'th bit of x is set to 1.\n function getBit(x, i) {\n return ((x >>> i) & 1) != 0;\n }\n // Throws an exception if the given condition is false.\n function assert(cond) {\n if (!cond)\n throw new Error(\"Assertion error\");\n }\n /*---- Data segment class ----*/\n /*\n * A segment of character/binary/control data in a QR Code symbol.\n * Instances of this class are immutable.\n * The mid-level way to create a segment is to take the payload data\n * and call a static factory function such as QrSegment.makeNumeric().\n * The low-level way to create a segment is to custom-make the bit buffer\n * and call the QrSegment() constructor with appropriate values.\n * This segment class imposes no length restrictions, but QR Codes have restrictions.\n * Even in the most favorable conditions, a QR Code can only hold 7089 characters of data.\n * Any segment longer than this is meaningless for the purpose of generating QR Codes.\n */\n var QrSegment = /** @class */ (function () {\n /*-- Constructor (low level) and fields --*/\n // Creates a new QR Code segment with the given attributes and data.\n // The character count (numChars) must agree with the mode and the bit buffer length,\n // but the constraint isn't checked. The given bit buffer is cloned and stored.\n function QrSegment(\n // The mode indicator of this segment.\n mode, \n // The length of this segment's unencoded data. Measured in characters for\n // numeric/alphanumeric/kanji mode, bytes for byte mode, and 0 for ECI mode.\n // Always zero or positive. Not the same as the data's bit length.\n numChars, \n // The data bits of this segment. Accessed through getData().\n bitData) {\n this.mode = mode;\n this.numChars = numChars;\n this.bitData = bitData;\n if (numChars < 0)\n throw new RangeError(\"Invalid argument\");\n this.bitData = bitData.slice(); // Make defensive copy\n }\n /*-- Static factory functions (mid level) --*/\n // Returns a segment representing the given binary data encoded in\n // byte mode. All input byte arrays are acceptable. Any text string\n // can be converted to UTF-8 bytes and encoded as a byte mode segment.\n QrSegment.makeBytes = function (data) {\n var bb = [];\n for (var _i = 0, data_2 = data; _i < data_2.length; _i++) {\n var b = data_2[_i];\n appendBits(b, 8, bb);\n }\n return new QrSegment(QrSegment.Mode.BYTE, data.length, bb);\n };\n // Returns a segment representing the given string of decimal digits encoded in numeric mode.\n QrSegment.makeNumeric = function (digits) {\n if (!QrSegment.isNumeric(digits))\n throw new RangeError(\"String contains non-numeric characters\");\n var bb = [];\n for (var i = 0; i < digits.length;) { // Consume up to 3 digits per iteration\n var n = Math.min(digits.length - i, 3);\n appendBits(parseInt(digits.substring(i, i + n), 10), n * 3 + 1, bb);\n i += n;\n }\n return new QrSegment(QrSegment.Mode.NUMERIC, digits.length, bb);\n };\n // Returns a segment representing the given text string encoded in alphanumeric mode.\n // The characters allowed are: 0 to 9, A to Z (uppercase only), space,\n // dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n QrSegment.makeAlphanumeric = function (text) {\n if (!QrSegment.isAlphanumeric(text))\n throw new RangeError(\"String contains unencodable characters in alphanumeric mode\");\n var bb = [];\n var i;\n for (i = 0; i + 2 <= text.length; i += 2) { // Process groups of 2\n var temp = QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)) * 45;\n temp += QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i + 1));\n appendBits(temp, 11, bb);\n }\n if (i < text.length) // 1 character remaining\n appendBits(QrSegment.ALPHANUMERIC_CHARSET.indexOf(text.charAt(i)), 6, bb);\n return new QrSegment(QrSegment.Mode.ALPHANUMERIC, text.length, bb);\n };\n // Returns a new mutable list of zero or more segments to represent the given Unicode text string.\n // The result may use various segment modes and switch modes to optimize the length of the bit stream.\n QrSegment.makeSegments = function (text) {\n // Select the most efficient segment encoding automatically\n if (text == \"\")\n return [];\n else if (QrSegment.isNumeric(text))\n return [QrSegment.makeNumeric(text)];\n else if (QrSegment.isAlphanumeric(text))\n return [QrSegment.makeAlphanumeric(text)];\n else\n return [QrSegment.makeBytes(QrSegment.toUtf8ByteArray(text))];\n };\n // Returns a segment representing an Extended Channel Interpretation\n // (ECI) designator with the given assignment value.\n QrSegment.makeEci = function (assignVal) {\n var bb = [];\n if (assignVal < 0)\n throw new RangeError(\"ECI assignment value out of range\");\n else if (assignVal < (1 << 7))\n appendBits(assignVal, 8, bb);\n else if (assignVal < (1 << 14)) {\n appendBits(2, 2, bb);\n appendBits(assignVal, 14, bb);\n }\n else if (assignVal < 1000000) {\n appendBits(6, 3, bb);\n appendBits(assignVal, 21, bb);\n }\n else\n throw new RangeError(\"ECI assignment value out of range\");\n return new QrSegment(QrSegment.Mode.ECI, 0, bb);\n };\n // Tests whether the given string can be encoded as a segment in numeric mode.\n // A string is encodable iff each character is in the range 0 to 9.\n QrSegment.isNumeric = function (text) {\n return QrSegment.NUMERIC_REGEX.test(text);\n };\n // Tests whether the given string can be encoded as a segment in alphanumeric mode.\n // A string is encodable iff each character is in the following set: 0 to 9, A to Z\n // (uppercase only), space, dollar, percent, asterisk, plus, hyphen, period, slash, colon.\n QrSegment.isAlphanumeric = function (text) {\n return QrSegment.ALPHANUMERIC_REGEX.test(text);\n };\n /*-- Methods --*/\n // Returns a new copy of the data bits of this segment.\n QrSegment.prototype.getData = function () {\n return this.bitData.slice(); // Make defensive copy\n };\n // (Package-private) Calculates and returns the number of bits needed to encode the given segments at\n // the given version. The result is infinity if a segment has too many characters to fit its length field.\n QrSegment.getTotalBits = function (segs, version) {\n var result = 0;\n for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {\n var seg = segs_2[_i];\n var ccbits = seg.mode.numCharCountBits(version);\n if (seg.numChars >= (1 << ccbits))\n return Infinity; // The segment's length doesn't fit the field's bit width\n result += 4 + ccbits + seg.bitData.length;\n }\n return result;\n };\n // Returns a new array of bytes representing the given string encoded in UTF-8.\n QrSegment.toUtf8ByteArray = function (str) {\n str = encodeURI(str);\n var result = [];\n for (var i = 0; i < str.length; i++) {\n if (str.charAt(i) != \"%\")\n result.push(str.charCodeAt(i));\n else {\n result.push(parseInt(str.substring(i + 1, i + 3), 16));\n i += 2;\n }\n }\n return result;\n };\n /*-- Constants --*/\n // Describes precisely all strings that are encodable in numeric mode.\n QrSegment.NUMERIC_REGEX = /^[0-9]*$/;\n // Describes precisely all strings that are encodable in alphanumeric mode.\n QrSegment.ALPHANUMERIC_REGEX = /^[A-Z0-9 $%*+.\\/:-]*$/;\n // The set of all legal characters in alphanumeric mode,\n // where each character value maps to the index in the string.\n QrSegment.ALPHANUMERIC_CHARSET = \"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:\";\n return QrSegment;\n }());\n qrcodegen.QrSegment = QrSegment;\n})(qrcodegen || (qrcodegen = {}));\n/*---- Public helper enumeration ----*/\n(function (qrcodegen) {\n (function (QrCode) {\n /*\n * The error correction level in a QR Code symbol. Immutable.\n */\n var Ecc = /** @class */ (function () {\n /*-- Constructor and fields --*/\n function Ecc(\n // In the range 0 to 3 (unsigned 2-bit integer).\n ordinal, \n // (Package-private) In the range 0 to 3 (unsigned 2-bit integer).\n formatBits) {\n this.ordinal = ordinal;\n this.formatBits = formatBits;\n }\n /*-- Constants --*/\n Ecc.LOW = new Ecc(0, 1); // The QR Code can tolerate about 7% erroneous codewords\n Ecc.MEDIUM = new Ecc(1, 0); // The QR Code can tolerate about 15% erroneous codewords\n Ecc.QUARTILE = new Ecc(2, 3); // The QR Code can tolerate about 25% erroneous codewords\n Ecc.HIGH = new Ecc(3, 2); // The QR Code can tolerate about 30% erroneous codewords\n return Ecc;\n }());\n QrCode.Ecc = Ecc;\n })(qrcodegen.QrCode || (qrcodegen.QrCode = {}));\n})(qrcodegen || (qrcodegen = {}));\n/*---- Public helper enumeration ----*/\n(function (qrcodegen) {\n (function (QrSegment) {\n /*\n * Describes how a segment's data bits are interpreted. Immutable.\n */\n var Mode = /** @class */ (function () {\n /*-- Constructor and fields --*/\n function Mode(\n // The mode indicator bits, which is a uint4 value (range 0 to 15).\n modeBits, \n // Number of character count bits for three different version ranges.\n numBitsCharCount) {\n this.modeBits = modeBits;\n this.numBitsCharCount = numBitsCharCount;\n }\n /*-- Method --*/\n // (Package-private) Returns the bit width of the character count field for a segment in\n // this mode in a QR Code at the given version number. The result is in the range [0, 16].\n Mode.prototype.numCharCountBits = function (ver) {\n return this.numBitsCharCount[Math.floor((ver + 7) / 17)];\n };\n /*-- Constants --*/\n Mode.NUMERIC = new Mode(0x1, [10, 12, 14]);\n Mode.ALPHANUMERIC = new Mode(0x2, [9, 11, 13]);\n Mode.BYTE = new Mode(0x4, [8, 16, 16]);\n Mode.KANJI = new Mode(0x8, [8, 10, 12]);\n Mode.ECI = new Mode(0x7, [0, 0, 0]);\n return Mode;\n }());\n QrSegment.Mode = Mode;\n })(qrcodegen.QrSegment || (qrcodegen.QrSegment = {}));\n})(qrcodegen || (qrcodegen = {}));\nvar QR = qrcodegen;\n\nvar defaultErrorCorrectLevel = 'L';\nvar ErrorCorrectLevelMap = {\n L: QR.QrCode.Ecc.LOW,\n M: QR.QrCode.Ecc.MEDIUM,\n Q: QR.QrCode.Ecc.QUARTILE,\n H: QR.QrCode.Ecc.HIGH,\n};\n// Thanks the `qrcode.react`\nvar SUPPORTS_PATH2D = (function () {\n try {\n new Path2D().addPath(new Path2D());\n }\n catch (e) {\n return false;\n }\n return true;\n})();\nfunction validErrorCorrectLevel(level) {\n return level in ErrorCorrectLevelMap;\n}\nfunction generatePath(modules, margin) {\n if (margin === void 0) { margin = 0; }\n var ops = [];\n modules.forEach(function (row, y) {\n var start = null;\n row.forEach(function (cell, x) {\n if (!cell && start !== null) {\n // M0 0h7v1H0z injects the space with the move and drops the comma,\n // saving a char per operation\n ops.push(\"M\".concat(start + margin, \" \").concat(y + margin, \"h\").concat(x - start, \"v1H\").concat(start + margin, \"z\"));\n start = null;\n return;\n }\n // end of row, clean up or skip\n if (x === row.length - 1) {\n if (!cell) {\n // We would have closed the op above already so this can only mean\n // 2+ light modules in a row.\n return;\n }\n if (start === null) {\n // Just a single dark module.\n ops.push(\"M\".concat(x + margin, \",\").concat(y + margin, \" h1v1H\").concat(x + margin, \"z\"));\n }\n else {\n // Otherwise finish the current line.\n ops.push(\"M\".concat(start + margin, \",\").concat(y + margin, \" h\").concat(x + 1 - start, \"v1H\").concat(start + margin, \"z\"));\n }\n return;\n }\n if (cell && start === null) {\n start = x;\n }\n });\n });\n return ops.join('');\n}\nfunction getImageSettings(cells, size, margin, imageSettings) {\n var width = imageSettings.width, height = imageSettings.height, imageX = imageSettings.x, imageY = imageSettings.y;\n var numCells = cells.length + margin * 2;\n var defaultSize = Math.floor(size * 0.1);\n var scale = numCells / size;\n var w = (width || defaultSize) * scale;\n var h = (height || defaultSize) * scale;\n var x = imageX == null ? cells.length / 2 - w / 2 : imageX * scale;\n var y = imageY == null ? cells.length / 2 - h / 2 : imageY * scale;\n var excavation = null;\n if (imageSettings.excavate) {\n var floorX = Math.floor(x);\n var floorY = Math.floor(y);\n var ceilW = Math.ceil(w + x - floorX);\n var ceilH = Math.ceil(h + y - floorY);\n excavation = { x: floorX, y: floorY, w: ceilW, h: ceilH };\n }\n return { x: x, y: y, h: h, w: w, excavation: excavation };\n}\nfunction excavateModules(modules, excavation) {\n return modules.slice().map(function (row, y) {\n if (y < excavation.y || y >= excavation.y + excavation.h) {\n return row;\n }\n return row.map(function (cell, x) {\n if (x < excavation.x || x >= excavation.x + excavation.w) {\n return cell;\n }\n return false;\n });\n });\n}\nvar QRCodeProps = {\n value: {\n type: String,\n required: true,\n default: '',\n },\n size: {\n type: Number,\n default: 100,\n },\n level: {\n type: String,\n default: defaultErrorCorrectLevel,\n validator: function (l) { return validErrorCorrectLevel(l); },\n },\n background: {\n type: String,\n default: '#fff',\n },\n foreground: {\n type: String,\n default: '#000',\n },\n margin: {\n type: Number,\n required: false,\n default: 0,\n },\n imageSettings: {\n type: Object,\n required: false,\n default: function () { return ({}); },\n },\n gradient: {\n type: Boolean,\n required: false,\n default: false,\n },\n gradientType: {\n type: String,\n required: false,\n default: 'linear',\n validator: function (t) { return ['linear', 'radial'].indexOf(t) > -1; },\n },\n gradientStartColor: {\n type: String,\n required: false,\n default: '#000',\n },\n gradientEndColor: {\n type: String,\n required: false,\n default: '#fff',\n },\n};\nvar QRCodeVueProps = __assign(__assign({}, QRCodeProps), { renderAs: {\n type: String,\n required: false,\n default: 'canvas',\n validator: function (as) { return ['canvas', 'svg'].indexOf(as) > -1; },\n } });\nvar QrcodeSvg = defineComponent({\n name: 'QRCodeSvg',\n props: QRCodeProps,\n setup: function (props) {\n var numCells = ref(0);\n var fgPath = ref('');\n var imageProps;\n var generate = function () {\n var value = props.value, _level = props.level, _margin = props.margin;\n var margin = _margin >>> 0;\n var level = validErrorCorrectLevel(_level) ? _level : defaultErrorCorrectLevel;\n var cells = QR.QrCode.encodeText(value, ErrorCorrectLevelMap[level]).getModules();\n numCells.value = cells.length + margin * 2;\n if (props.imageSettings.src) {\n var imageSettings = getImageSettings(cells, props.size, margin, props.imageSettings);\n imageProps = {\n x: imageSettings.x + margin,\n y: imageSettings.y + margin,\n width: imageSettings.w,\n height: imageSettings.h,\n };\n if (imageSettings.excavation) {\n cells = excavateModules(cells, imageSettings.excavation);\n }\n }\n // Drawing strategy: instead of a rect per module, we're going to create a\n // single path for the dark modules and layer that on top of a light rect,\n // for a total of 2 DOM nodes. We pay a bit more in string concat but that's\n // way faster than DOM ops.\n // For level 1, 441 nodes -> 2\n // For level 40, 31329 -> 2\n fgPath.value = generatePath(cells, margin);\n };\n var renderGradient = function () {\n if (!props.gradient)\n return null;\n var gradientProps = props.gradientType === 'linear'\n ? {\n x1: '0%',\n y1: '0%',\n x2: '100%',\n y2: '100%',\n }\n : {\n cx: '50%',\n cy: '50%',\n r: '50%',\n fx: '50%',\n fy: '50%',\n };\n return h(props.gradientType === 'linear' ? 'linearGradient' : 'radialGradient', __assign({ id: 'qr-gradient' }, gradientProps), [\n h('stop', {\n offset: '0%',\n style: { stopColor: props.gradientStartColor },\n }),\n h('stop', {\n offset: '100%',\n style: { stopColor: props.gradientEndColor },\n }),\n ]);\n };\n generate();\n onUpdated(generate);\n return function () { return h('svg', {\n width: props.size,\n height: props.size,\n 'shape-rendering': \"crispEdges\",\n xmlns: 'http://www.w3.org/2000/svg',\n viewBox: \"0 0 \".concat(numCells.value, \" \").concat(numCells.value),\n }, [\n h('defs', {}, [renderGradient()]),\n h('rect', {\n width: '100%',\n height: '100%',\n fill: props.background,\n }),\n h('path', {\n fill: props.gradient ? 'url(#qr-gradient)' : props.foreground,\n d: fgPath.value,\n }),\n props.imageSettings.src && h('image', __assign({ href: props.imageSettings.src }, imageProps)),\n ]); };\n },\n});\nvar QrcodeCanvas = defineComponent({\n name: 'QRCodeCanvas',\n props: QRCodeProps,\n setup: function (props, ctx) {\n var canvasEl = ref(null);\n var imageRef = ref(null);\n var generate = function () {\n var value = props.value, _level = props.level, size = props.size, _margin = props.margin, background = props.background, foreground = props.foreground, gradient = props.gradient, gradientType = props.gradientType, gradientStartColor = props.gradientStartColor, gradientEndColor = props.gradientEndColor;\n var margin = _margin >>> 0;\n var level = validErrorCorrectLevel(_level) ? _level : defaultErrorCorrectLevel;\n var canvas = canvasEl.value;\n if (!canvas) {\n return;\n }\n var ctx = canvas.getContext('2d');\n if (!ctx) {\n return;\n }\n var cells = QR.QrCode.encodeText(value, ErrorCorrectLevelMap[level]).getModules();\n var numCells = cells.length + margin * 2;\n var image = imageRef.value;\n var imageProps = { x: 0, y: 0, width: 0, height: 0 };\n var showImage = props.imageSettings.src && image != null && image.naturalWidth !== 0 && image.naturalHeight !== 0;\n if (showImage) {\n var imageSettings = getImageSettings(cells, props.size, margin, props.imageSettings);\n imageProps = {\n x: imageSettings.x + margin,\n y: imageSettings.y + margin,\n width: imageSettings.w,\n height: imageSettings.h,\n };\n if (imageSettings.excavation) {\n cells = excavateModules(cells, imageSettings.excavation);\n }\n }\n var devicePixelRatio = window.devicePixelRatio || 1;\n var scale = (size / numCells) * devicePixelRatio;\n canvas.height = canvas.width = size * devicePixelRatio;\n ctx.scale(scale, scale);\n ctx.fillStyle = background;\n ctx.fillRect(0, 0, numCells, numCells);\n if (gradient) {\n var grad = void 0;\n if (gradientType === 'linear') {\n grad = ctx.createLinearGradient(0, 0, numCells, numCells);\n }\n else {\n grad = ctx.createRadialGradient(numCells / 2, numCells / 2, 0, numCells / 2, numCells / 2, numCells / 2);\n }\n grad.addColorStop(0, gradientStartColor);\n grad.addColorStop(1, gradientEndColor);\n ctx.fillStyle = grad;\n }\n else {\n ctx.fillStyle = foreground;\n }\n if (SUPPORTS_PATH2D) {\n ctx.fill(new Path2D(generatePath(cells, margin)));\n }\n else {\n cells.forEach(function (row, rdx) {\n row.forEach(function (cell, cdx) {\n if (cell) {\n ctx.fillRect(cdx + margin, rdx + margin, 1, 1);\n }\n });\n });\n }\n if (showImage) {\n ctx.drawImage(image, imageProps.x, imageProps.y, imageProps.width, imageProps.height);\n }\n };\n onMounted(generate);\n onUpdated(generate);\n var style = ctx.attrs.style;\n return function () { return h(Fragment, [\n h('canvas', __assign(__assign({}, ctx.attrs), { ref: canvasEl, style: __assign(__assign({}, style), { width: \"\".concat(props.size, \"px\"), height: \"\".concat(props.size, \"px\") }) })),\n props.imageSettings.src && h('img', {\n ref: imageRef,\n src: props.imageSettings.src,\n style: { display: 'none' },\n onLoad: generate,\n })\n ]); };\n },\n});\nvar QrcodeVue = defineComponent({\n name: 'Qrcode',\n render: function () {\n var _a = this.$props, renderAs = _a.renderAs, value = _a.value, size = _a.size, margin = _a.margin, level = _a.level, background = _a.background, foreground = _a.foreground, imageSettings = _a.imageSettings, gradient = _a.gradient, gradientType = _a.gradientType, gradientStartColor = _a.gradientStartColor, gradientEndColor = _a.gradientEndColor;\n return h(renderAs === 'svg' ? QrcodeSvg : QrcodeCanvas, {\n value: value,\n size: size,\n margin: margin,\n level: level,\n background: background,\n foreground: foreground,\n imageSettings: imageSettings,\n gradient: gradient,\n gradientType: gradientType,\n gradientStartColor: gradientStartColor,\n gradientEndColor: gradientEndColor,\n });\n },\n props: QRCodeVueProps,\n});\n\nexport { QrcodeCanvas, QrcodeSvg, QrcodeVue as default };\n","\n\n\n\n\n"],"names":["__assign","t","s","i","n","p","qrcodegen","QrCode","version","errorCorrectionLevel","dataCodewords","msk","row","allCodewords","minPenalty","penalty","assert","text","ecl","segs","data","seg","minVersion","maxVersion","mask","boostEcl","dataUsedBits","dataCapacityBits_1","usedBits","QrSegment","_i","_a","newEcl","bb","_b","segs_1","appendBits","_c","_d","b","dataCapacityBits","padByte","x","y","alignPatPos","numAlign","j","rem","bits","getBit","color","a","dy","dx","dist","xx","yy","isDark","ver","numBlocks","blockEccLen","rawCodewords","numShortBlocks","shortBlockLen","blocks","rsDiv","k","dat","ecc","result","_loop_1","block","right","vert","upward","invert","runColor","runX","runHistory","runY","dark","sum","total","step","pos","degree","root","divisor","_","_loop_2","factor","coef","data_1","z","core","currentRunColor","currentRunLength","val","len","cond","mode","numChars","bitData","data_2","digits","temp","assignVal","segs_2","ccbits","str","Ecc","ordinal","formatBits","Mode","modeBits","numBitsCharCount","QR","defaultErrorCorrectLevel","ErrorCorrectLevelMap","SUPPORTS_PATH2D","validErrorCorrectLevel","level","generatePath","modules","margin","ops","start","cell","getImageSettings","cells","size","imageSettings","width","height","imageX","imageY","numCells","defaultSize","scale","w","h","excavation","floorX","floorY","ceilW","ceilH","excavateModules","QRCodeProps","l","QRCodeVueProps","as","QrcodeSvg","defineComponent","props","ref","fgPath","imageProps","generate","value","_level","_margin","renderGradient","gradientProps","onUpdated","QrcodeCanvas","ctx","canvasEl","imageRef","background","foreground","gradient","gradientType","gradientStartColor","gradientEndColor","canvas","image","showImage","devicePixelRatio","grad","rdx","cdx","onMounted","style","Fragment","QrcodeVue","renderAs","telegramApi","axios","config","token","toast","useToast","router","useRouter","isMobile","handleResize","linkingCode","timeRemaining","loading","showQR","countdownInterval","BOT_USERNAME","telegramDeepLink","computed","generateCode","response","startCountdown","error","formatTime","seconds","minutes","secs","copyCode","tempInput","onUnmounted","_createElementBlock","_normalizeClass","_createBlock","MobileTopBar","_cache","$event","_unref","_createElementVNode","_hoisted_1","_hoisted_2","_openBlock","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_toDisplayString","_hoisted_12","_hoisted_13","_hoisted_14","_createVNode","Button","_hoisted_15","QRCodeVue","MobileBottomNav"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/TrialBalanceView.BCMFp4XP.css b/deploy-package-20260223-151231/frontend/assets/TrialBalanceView.BCMFp4XP.css deleted file mode 100644 index 6b1a3e2..0000000 --- a/deploy-package-20260223-151231/frontend/assets/TrialBalanceView.BCMFp4XP.css +++ /dev/null @@ -1 +0,0 @@ -.trial-balance[data-v-aad21ab2]{max-width:1400px;margin:0 auto;padding:var(--space-xl)}.mobile-layout .trial-balance[data-v-aad21ab2]{padding-top:calc(56px + var(--space-md));padding-bottom:calc(56px + var(--space-md));padding-left:var(--space-md);padding-right:var(--space-md)}.company-selection-card[data-v-aad21ab2],.filters-card[data-v-aad21ab2],.table-card[data-v-aad21ab2]{margin-bottom:var(--space-md)}.search-col[data-v-aad21ab2]{grid-column:span 2}.text-right[data-v-aad21ab2]{text-align:right}.mobile-totals-bar[data-v-aad21ab2]{background:var(--surface-card);border-bottom:1px solid var(--surface-border);padding:var(--space-sm) var(--space-md);margin-bottom:var(--space-md);border-radius:var(--radius-md)}.mobile-totals-content[data-v-aad21ab2]{display:flex;justify-content:center;align-items:center}.mobile-totals-grid[data-v-aad21ab2]{display:flex;gap:var(--space-lg)}.mobile-totals-grid.two-totals[data-v-aad21ab2]{justify-content:space-around;width:100%}.mobile-totals-bar .total-item[data-v-aad21ab2]{display:flex;align-items:center;gap:var(--space-xs)}.mobile-totals-bar .total-label[data-v-aad21ab2]{font-size:var(--text-sm);color:var(--text-color-secondary);font-weight:var(--font-medium)}.mobile-totals-bar .total-value[data-v-aad21ab2]{font-size:var(--text-lg);font-weight:var(--font-bold);color:var(--text-color)}.mobile-card-list[data-v-aad21ab2]{display:flex;flex-direction:column;gap:var(--space-sm)}.mobile-data-card[data-v-aad21ab2]{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-md);padding:var(--space-md)}.mobile-data-card .card-header[data-v-aad21ab2]{font-weight:var(--font-semibold);color:var(--text-color);margin-bottom:var(--space-xs);font-size:var(--text-base)}.mobile-data-card .card-row[data-v-aad21ab2]{display:flex;justify-content:space-between;align-items:center;font-size:var(--text-sm);color:var(--text-color-secondary)}.mobile-data-card .card-amount[data-v-aad21ab2]{font-weight:var(--font-semibold);color:var(--text-color)}.mobile-empty[data-v-aad21ab2]{text-align:center;padding:var(--space-xl);color:var(--text-color-secondary)}.mobile-empty i[data-v-aad21ab2]{font-size:var(--text-3xl);margin-bottom:var(--space-sm);display:block}.bottom-sheet-title[data-v-aad21ab2]{font-size:var(--text-lg);font-weight:var(--font-semibold);color:var(--text-color);margin:0 0 var(--space-md) 0}.bottom-sheet-filters[data-v-aad21ab2]{display:flex;flex-direction:column;gap:var(--space-md)}.bottom-sheet-actions[data-v-aad21ab2]{display:flex;gap:var(--space-sm);justify-content:flex-end;margin-top:var(--space-md);padding-top:var(--space-md);border-top:1px solid var(--surface-border)}.sidebar-header[data-v-aad21ab2]{padding:var(--space-md)}.sidebar-title[data-v-aad21ab2]{font-size:var(--text-xl);font-weight:var(--font-bold);color:var(--text-color)}.sidebar-menu[data-v-aad21ab2]{display:flex;flex-direction:column;padding:var(--space-sm)}.sidebar-item[data-v-aad21ab2]{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-md);color:var(--text-color);text-decoration:none;border-radius:var(--radius-md);font-weight:var(--font-medium);transition:background var(--transition-fast)}.sidebar-item[data-v-aad21ab2]:hover{background:var(--surface-hover)}.sidebar-item.active[data-v-aad21ab2]{background:var(--blue-50);color:var(--color-primary)}.sidebar-item i[data-v-aad21ab2]{font-size:var(--text-xl);width:24px;text-align:center}[data-theme=dark] .sidebar-item.active[data-v-aad21ab2]{background:var(--blue-900);color:var(--blue-400)}@media (prefers-color-scheme: dark){:root:not([data-theme]) .sidebar-item.active[data-v-aad21ab2]{background:var(--blue-900);color:var(--blue-400)}}@media (max-width: 768px){.trial-balance[data-v-aad21ab2]{padding:var(--space-md)}.search-col[data-v-aad21ab2]{grid-column:span 1}} diff --git a/deploy-package-20260223-151231/frontend/assets/TrialBalanceView.C154KDAF.js b/deploy-package-20260223-151231/frontend/assets/TrialBalanceView.C154KDAF.js deleted file mode 100644 index 9eb02f9..0000000 --- a/deploy-package-20260223-151231/frontend/assets/TrialBalanceView.C154KDAF.js +++ /dev/null @@ -1,3 +0,0 @@ -const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/sharedStores.Bb_IRn4Y.js","assets/index.B8XI8FQW.js","assets/vendor-core.B6UiYhU_.js","assets/vendor-primevue.BN-meDW0.js","assets/vendor-utils.CO3CyGpV.js","assets/vendor-export.BWjBvx7Z.js","assets/index.Co2Dp57K.css"])))=>i.map(i=>d[i]); -import{_ as ue}from"./vendor-export.BWjBvx7Z.js";import{_ as _e,u as pe,s as me}from"./index.B8XI8FQW.js";import{u as fe,f as be,b as ve,c as ye}from"./sharedStores.Bb_IRn4Y.js";import{e as he,a as ge}from"./exportUtils.BtGzMnqV.js";import{M as Ce}from"./MobileTopBar.BnL78WPy.js";import{M as xe}from"./MobileBottomNav.Cp8OR33w.js";import{B as Fe}from"./BottomSheet.WKuCIyuZ.js";import{M as De}from"./MobileDrawerMenu.DJ_STPbv.js";import{s as Se}from"./splitbutton.esm.DvALhxoC.js";import{a as F,j as R,o as we,K as je,w as Q,c as D,h as k,i as C,q as n,e as t,O as o,p as m,y as Y,k as P,v as u,u as Pe,P as Te,d as _,F as ke,B as Ve}from"./vendor-core.B6UiYhU_.js";import"./vendor-utils.CO3CyGpV.js";import"./vendor-primevue.BN-meDW0.js";const Be={class:"bottom-sheet-filters"},Ee={class:"form-group"},Ne={class:"form-group"},Ae={class:"bottom-sheet-actions"},Le={class:"trial-balance"},Re={key:0,class:"page-header"},ze={class:"company-selection"},Ie={key:2,class:"mobile-totals-bar"},Me={class:"mobile-totals-content"},Oe={class:"mobile-totals-grid two-totals"},$e={class:"total-item"},Ue={class:"total-value"},We={class:"total-item"},Xe={class:"total-value"},Ge={class:"form"},qe={class:"form-row"},Ke={class:"form-col"},He={class:"form-group"},Je={class:"form-col search-col"},Qe={class:"form-group"},Ye={key:0,class:"form-actions"},Ze={key:4,class:"summary-stats-inline"},et={class:"stat-item"},tt={class:"stat-value"},at={class:"stat-item"},lt={class:"stat-value"},st={class:"stat-item"},ot={class:"stat-value"},it={class:"stat-item"},rt={class:"stat-value"},nt={class:"stat-item"},dt={class:"stat-value"},ct={class:"stat-item"},ut={class:"stat-value"},_t={key:0,class:"mobile-card-list"},pt={class:"card-header"},mt={class:"card-row"},ft={class:"card-amount"},bt={key:0,class:"mobile-empty"},vt={class:"loading-state"},yt={class:"text-right"},ht={class:"text-right"},gt={class:"text-right"},Ct={class:"text-right"},xt={class:"text-right"},Ft={class:"text-right"},Dt={__name:"TrialBalanceView",setup(St){var J;const b=pe(),Z=Te(),i=fe(),s=be(),S=ve(),V=ye(),B=F(((J=i.selectedCompany)==null?void 0:J.id_firma)||null),v=F(window.innerWidth<768),w=F(!1),z=F(!1);F(null);const ee=async()=>{await V.logout(),Z.push("/login")},te=async l=>{var e;await i.loadCompanies(),(e=i.selectedCompany)!=null&&e.id_firma&&await S.loadPeriods(i.selectedCompany.id_firma)},ae=R(()=>[{icon:"pi pi-filter",label:"Filtre",tooltip:"Filtre",active:ie.value},{icon:"pi pi-filter-slash",label:"Resetează",tooltip:"Resetează Filtrele"},{icon:"pi pi-download",label:"Export",tooltip:"Export"}]),$=F(null),le=F([{label:"Export PDF",icon:"pi pi-file-pdf",command:()=>A()},{label:"Export XLSX",icon:"pi pi-file-excel",command:()=>M()}]),se=F([{label:"Export PDF",icon:"pi pi-file-pdf",command:()=>A()},{label:"Export XLSX",icon:"pi pi-file-excel",command:()=>M()}]),oe=(l,e)=>{l.icon==="pi pi-filter"?w.value=!w.value:l.icon==="pi pi-filter-slash"?E():l.icon==="pi pi-download"&&$.value.toggle(e)},U=()=>{v.value=window.innerWidth<768,v.value||(w.value=!1)},f=F({cont:"",denumire:""}),I=R(()=>{var l;return((l=S.selectedPeriod)==null?void 0:l.display_name)||""}),ie=R(()=>f.value.cont!==""||f.value.denumire!=="");R(()=>[{label:"Resetează Filtre",icon:"pi pi-filter-slash",command:E},{label:"Export Excel",icon:"pi pi-file-excel",command:M,disabled:!s.hasData},{label:"Export PDF",icon:"pi pi-file-pdf",command:A,disabled:!s.hasData},{separator:!0},{label:"Actualizează",icon:"pi pi-refresh",command:K}]);const p=l=>!l||l===0?"0,00":new Intl.NumberFormat("ro-RO",{minimumFractionDigits:2,maximumFractionDigits:2}).format(l),W=l=>!l||l===0?"0":Math.abs(l)>=1e6?new Intl.NumberFormat("ro-RO",{maximumFractionDigits:1}).format(l/1e6)+"M":new Intl.NumberFormat("ro-RO",{maximumFractionDigits:0}).format(l),re=(l,e)=>!l||l.length<=e?l:l.substring(0,e)+"...",ne=async()=>{if(!B.value)return;const l=i.getCompanyById(B.value);l&&(i.setSelectedCompany(l),await N())},X=async()=>{await q()},G=(()=>{let l;return()=>{clearTimeout(l),l=setTimeout(async()=>{await q()},500)}})(),q=async()=>{i.selectedCompany&&await s.applyFilters({cont:f.value.cont,denumire:f.value.denumire},i.selectedCompany.id_firma)},E=async()=>{f.value={cont:"",denumire:""},await s.clearFilters(i.selectedCompany.id_firma)},K=async()=>{await N(),b.add({severity:"success",summary:"Actualizare reușită",detail:"Balanța de verificare a fost actualizată cu succes",life:3e3})},N=async()=>{if(i.selectedCompany)try{await s.fetchTrialBalance(i.selectedCompany.id_firma)}catch(l){console.error("Failed to load trial balance:",l),b.add({severity:"error",summary:"Eroare",detail:"Nu s-a putut încărca balanța de verificare",life:5e3})}},de=async l=>{i.selectedCompany&&await s.changePage(l.page+1,i.selectedCompany.id_firma)},ce=async l=>{var d;if(!i.selectedCompany)return;const e=((d=l.sortField)==null?void 0:d.toUpperCase())||"CONT",y=l.sortOrder===1?"asc":"desc";await s.sort(e,y,i.selectedCompany.id_firma)},H=async()=>{if(!i.selectedCompany)return[];try{const l={company:i.selectedCompany.id_firma,luna:s.filters.luna,an:s.filters.an,page:1,page_size:999999,sort_by:s.sorting.sortBy,sort_order:s.sorting.sortOrder};s.filters.cont&&(l.cont_filter=s.filters.cont),s.filters.denumire&&(l.denumire_filter=s.filters.denumire);const y=await(await ue(async()=>{const{default:d}=await import("./sharedStores.Bb_IRn4Y.js").then(L=>L.i);return{default:d}},__vite__mapDeps([0,1,2,3,4,5,6]))).default.get("/trial-balance/",{params:l});return y.data.success?y.data.data.items||[]:[]}catch(l){return console.error("Failed to fetch all trial balance data:",l),[]}},M=async()=>{if(!s.hasData){b.add({severity:"warn",summary:"Nu există date",detail:"Nu există date de exportat",life:3e3});return}b.add({severity:"info",summary:"Se pregătește exportul",detail:"Se încarcă toate datele...",life:2e3});const l=await H();if(l.length===0){b.add({severity:"error",summary:"Eroare",detail:"Nu s-au putut prelua datele pentru export",life:3e3});return}const e=l.map(d=>({Cont:d.cont,Denumire:d.denumire,"Sume Prec. D":parseFloat(d.sold_precedent_debit)||0,"Sume Prec. C":parseFloat(d.sold_precedent_credit)||0,"Rulaj Lunar D":parseFloat(d.rulaj_lunar_debit)||0,"Rulaj Lunar C":parseFloat(d.rulaj_lunar_credit)||0,"Sold Final D":parseFloat(d.sold_final_debit)||0,"Sold Final C":parseFloat(d.sold_final_credit)||0}));he(e,`balanta_verificare_${I.value.replace(/\s+/g,"_")}`,"Balanță de Verificare").success?b.add({severity:"success",summary:"Export reușit",detail:`${l.length} înregistrări exportate cu succes`,life:3e3}):b.add({severity:"error",summary:"Eroare la export",detail:"Nu s-a putut genera fișierul Excel",life:3e3})},A=async()=>{var T;if(!s.hasData){b.add({severity:"warn",summary:"Nu există date",detail:"Nu există date de exportat",life:3e3});return}b.add({severity:"info",summary:"Se pregătește exportul",detail:"Se încarcă toate datele...",life:2e3});const l=await H();if(l.length===0){b.add({severity:"error",summary:"Eroare",detail:"Nu s-au putut prelua datele pentru export",life:3e3});return}const y=(O=>{const x=[...O].sort((r,g)=>String(r.cont).localeCompare(String(g.cont))),j=[],a={},h={sold_precedent_debit:0,sold_precedent_credit:0,rulaj_lunar_debit:0,rulaj_lunar_credit:0,sold_final_debit:0,sold_final_credit:0};let c=null;return x.forEach(r=>{const g=String(r.cont).charAt(0);a[g]||(a[g]={sold_precedent_debit:0,sold_precedent_credit:0,rulaj_lunar_debit:0,rulaj_lunar_credit:0,sold_final_debit:0,sold_final_credit:0}),c!==null&&c!==g&&j.push({cont:"",denumire:`TOTAL CLASA ${c}`,sold_precedent_debit:a[c].sold_precedent_debit,sold_precedent_credit:a[c].sold_precedent_credit,rulaj_lunar_debit:a[c].rulaj_lunar_debit,rulaj_lunar_credit:a[c].rulaj_lunar_credit,sold_final_debit:a[c].sold_final_debit,sold_final_credit:a[c].sold_final_credit,_isTotal:!0}),c=g,j.push({cont:r.cont,denumire:r.denumire,sold_precedent_debit:r.sold_precedent_debit,sold_precedent_credit:r.sold_precedent_credit,rulaj_lunar_debit:r.rulaj_lunar_debit,rulaj_lunar_credit:r.rulaj_lunar_credit,sold_final_debit:r.sold_final_debit,sold_final_credit:r.sold_final_credit}),a[g].sold_precedent_debit+=parseFloat(r.sold_precedent_debit)||0,a[g].sold_precedent_credit+=parseFloat(r.sold_precedent_credit)||0,a[g].rulaj_lunar_debit+=parseFloat(r.rulaj_lunar_debit)||0,a[g].rulaj_lunar_credit+=parseFloat(r.rulaj_lunar_credit)||0,a[g].sold_final_debit+=parseFloat(r.sold_final_debit)||0,a[g].sold_final_credit+=parseFloat(r.sold_final_credit)||0,h.sold_precedent_debit+=parseFloat(r.sold_precedent_debit)||0,h.sold_precedent_credit+=parseFloat(r.sold_precedent_credit)||0,h.rulaj_lunar_debit+=parseFloat(r.rulaj_lunar_debit)||0,h.rulaj_lunar_credit+=parseFloat(r.rulaj_lunar_credit)||0,h.sold_final_debit+=parseFloat(r.sold_final_debit)||0,h.sold_final_credit+=parseFloat(r.sold_final_credit)||0}),c!==null&&j.push({cont:"",denumire:`TOTAL CLASA ${c}`,sold_precedent_debit:a[c].sold_precedent_debit,sold_precedent_credit:a[c].sold_precedent_credit,rulaj_lunar_debit:a[c].rulaj_lunar_debit,rulaj_lunar_credit:a[c].rulaj_lunar_credit,sold_final_debit:a[c].sold_final_debit,sold_final_credit:a[c].sold_final_credit,_isTotal:!0}),j.push({cont:"",denumire:"TOTAL GENERAL",sold_precedent_debit:h.sold_precedent_debit,sold_precedent_credit:h.sold_precedent_credit,rulaj_lunar_debit:h.rulaj_lunar_debit,rulaj_lunar_credit:h.rulaj_lunar_credit,sold_final_debit:h.sold_final_debit,sold_final_credit:h.sold_final_credit,_isTotal:!0,_isGrandTotal:!0}),j})(l);ge(y,[{field:"cont",header:"Cont",type:"text",width:"auto"},{field:"denumire",header:"Denumire Cont",type:"text",width:"auto"},{field:"sold_precedent_debit",header:"Sume Prec. D",type:"number",width:"auto"},{field:"sold_precedent_credit",header:"Sume Prec. C",type:"number",width:"auto"},{field:"rulaj_lunar_debit",header:"Rulaj D",type:"number",width:"auto"},{field:"rulaj_lunar_credit",header:"Rulaj C",type:"number",width:"auto"},{field:"sold_final_debit",header:"Sold Final D",type:"number",width:"auto"},{field:"sold_final_credit",header:"Sold Final C",type:"number",width:"auto"}],`balanta-verificare-${I.value.replace(/\s+/g,"-")}`,{companyName:((T=i.selectedCompany)==null?void 0:T.name)||"",title:"Balanta de Verificare",period:I.value}).success?b.add({severity:"success",summary:"Export reușit",detail:`${l.length} înregistrări exportate cu succes`,life:3e3}):b.add({severity:"error",summary:"Eroare la export",detail:"Nu s-a putut genera fișierul PDF",life:3e3})};return we(async()=>{window.addEventListener("resize",U),i.hasCompanies||await i.loadCompanies(),S.selectedPeriod&&(s.filters.luna=S.selectedPeriod.luna,s.filters.an=S.selectedPeriod.an),i.selectedCompany&&await N()}),je(()=>{window.removeEventListener("resize",U)}),Q(()=>i.selectedCompany,async l=>{l&&await N()}),Q(()=>S.selectedPeriod,async l=>{l&&i.selectedCompany&&await s.changePeriod(l.luna,l.an,i.selectedCompany.id_firma)}),(l,e)=>{const y=P("InputText"),d=P("Button"),L=P("Dropdown"),T=P("Card"),O=P("ProgressSpinner"),x=P("Column"),j=P("DataTable");return _(),D("div",{class:Pe(["app-container",{"mobile-layout":v.value}])},[v.value?(_(),k(Ce,{key:0,title:"Balanță de Verificare","show-menu":!0,actions:ae.value,onMenuClick:e[0]||(e[0]=a=>z.value=!0),onActionClick:oe},null,8,["actions"])):C("",!0),n(o(me),{ref_key:"exportMenu",ref:$,model:le.value,popup:!0},null,8,["model"]),n(De,{modelValue:z.value,"onUpdate:modelValue":e[1]||(e[1]=a=>z.value=a),user:o(V).user,"companies-store":o(i),"period-store":o(S),"available-servers":o(V).availableServers,"current-server-id":o(V).selectedServerId,"auth-store":o(V),onLogout:ee,onServerSwitched:te},null,8,["modelValue","user","companies-store","period-store","available-servers","current-server-id","auth-store"]),n(Fe,{modelValue:w.value,"onUpdate:modelValue":e[6]||(e[6]=a=>w.value=a)},{default:m(()=>[e[12]||(e[12]=t("h3",{class:"bottom-sheet-title"},"Filtre",-1)),t("div",Be,[t("div",Ee,[e[10]||(e[10]=t("label",{class:"form-label"},"Număr Cont",-1)),n(y,{modelValue:f.value.cont,"onUpdate:modelValue":e[2]||(e[2]=a=>f.value.cont=a),placeholder:"Ex: 512, 4111",class:"w-full",onInput:X},null,8,["modelValue"])]),t("div",Ne,[e[11]||(e[11]=t("label",{class:"form-label"},"Denumire Cont",-1)),n(y,{modelValue:f.value.denumire,"onUpdate:modelValue":e[3]||(e[3]=a=>f.value.denumire=a),placeholder:"Căutare după denumire...",class:"w-full",onInput:o(G)},null,8,["modelValue","onInput"])]),t("div",Ae,[n(d,{icon:"pi pi-filter-slash",label:"Resetează",class:"p-button-outlined p-button-secondary",onClick:e[4]||(e[4]=a=>{E(),w.value=!1})}),n(d,{icon:"pi pi-check",label:"Aplică",onClick:e[5]||(e[5]=a=>w.value=!1)})])])]),_:1},8,["modelValue"]),t("div",Le,[v.value?C("",!0):(_(),D("div",Re,[...e[13]||(e[13]=[t("h1",{class:"page-title"},[t("i",{class:"pi pi-calculator"}),Y(" Balanță de Verificare ")],-1)])])),o(i).selectedCompany?C("",!0):(_(),k(T,{key:1,class:"company-selection-card"},{content:m(()=>[t("div",ze,[e[14]||(e[14]=t("p",{class:"text-color-secondary mb-3"}," Selectați o companie pentru a vizualiza balanța de verificare: ",-1)),n(L,{modelValue:B.value,"onUpdate:modelValue":e[7]||(e[7]=a=>B.value=a),options:o(i).companyListFormatted,"option-label":"displayName","option-value":"id_firma",placeholder:"Alegeți compania",class:"w-full",onChange:ne},null,8,["modelValue","options"])])]),_:1})),v.value&&o(i).selectedCompany&&o(s).hasData?(_(),D("div",Ie,[t("div",Me,[t("div",Oe,[t("div",$e,[e[15]||(e[15]=t("span",{class:"total-label"},"Sold D:",-1)),t("span",Ue,u(W(o(s).totals.total_sold_final_debit)),1)]),t("div",We,[e[16]||(e[16]=t("span",{class:"total-label"},"Sold C:",-1)),t("span",Xe,u(W(o(s).totals.total_sold_final_credit)),1)])])])])):C("",!0),o(i).selectedCompany&&!v.value?(_(),k(T,{key:3,class:"filters-card"},{content:m(()=>[t("div",Ge,[t("div",qe,[t("div",Ke,[t("div",He,[e[17]||(e[17]=t("label",{class:"form-label"},"Număr Cont",-1)),n(y,{modelValue:f.value.cont,"onUpdate:modelValue":e[8]||(e[8]=a=>f.value.cont=a),placeholder:"Ex: 512, 4111",class:"w-full",onInput:X},null,8,["modelValue"])])]),t("div",Je,[t("div",Qe,[e[18]||(e[18]=t("label",{class:"form-label"},"Denumire Cont",-1)),n(y,{modelValue:f.value.denumire,"onUpdate:modelValue":e[9]||(e[9]=a=>f.value.denumire=a),placeholder:"Căutare după denumire...",class:"w-full",onInput:o(G)},null,8,["modelValue","onInput"])])])]),v.value?C("",!0):(_(),D("div",Ye,[n(d,{icon:"pi pi-filter-slash",label:"Resetează Filtre",class:"p-button-outlined p-button-secondary",onClick:E}),n(o(Se),{label:"Export",icon:"pi pi-download",model:se.value,onClick:A,class:"p-button-outlined",disabled:!o(s).hasData},null,8,["model","disabled"]),n(d,{icon:"pi pi-refresh",label:"Actualizează",loading:o(s).isLoading,onClick:K},null,8,["loading"])]))])]),_:1})):C("",!0),!v.value&&o(i).selectedCompany&&o(s).hasData?(_(),D("div",Ze,[t("div",et,[e[19]||(e[19]=t("span",{class:"stat-label"},"Sume Prec. D:",-1)),t("span",tt,u(p(o(s).totals.total_sold_precedent_debit)),1)]),t("div",at,[e[20]||(e[20]=t("span",{class:"stat-label"},"Sume Prec. C:",-1)),t("span",lt,u(p(o(s).totals.total_sold_precedent_credit)),1)]),t("div",st,[e[21]||(e[21]=t("span",{class:"stat-label"},"Rulaj D:",-1)),t("span",ot,u(p(o(s).totals.total_rulaj_lunar_debit)),1)]),t("div",it,[e[22]||(e[22]=t("span",{class:"stat-label"},"Rulaj C:",-1)),t("span",rt,u(p(o(s).totals.total_rulaj_lunar_credit)),1)]),t("div",nt,[e[23]||(e[23]=t("span",{class:"stat-label"},"Sold Final D:",-1)),t("span",dt,u(p(o(s).totals.total_sold_final_debit)),1)]),t("div",ct,[e[24]||(e[24]=t("span",{class:"stat-label"},"Sold Final C:",-1)),t("span",ut,u(p(o(s).totals.total_sold_final_credit)),1)])])):C("",!0),o(i).selectedCompany?(_(),k(T,{key:5,class:"table-card"},{content:m(()=>[v.value?(_(),D("div",_t,[(_(!0),D(ke,null,Ve(o(s).trialBalanceData.filter(a=>a.sold_final_debit>0||a.sold_final_credit>0),a=>(_(),D("div",{key:a.cont,class:"mobile-data-card"},[t("div",pt,[t("strong",null,u(a.cont),1),Y("  "+u(re(a.denumire,30)),1)]),t("div",mt,[e[25]||(e[25]=t("span",null,null,-1)),t("span",ft,u(a.sold_final_debit>0?p(a.sold_final_debit)+" D":p(a.sold_final_credit)+" C"),1)])]))),128)),o(s).trialBalanceData.filter(a=>a.sold_final_debit>0||a.sold_final_credit>0).length===0?(_(),D("div",bt,[...e[26]||(e[26]=[t("i",{class:"pi pi-info-circle"},null,-1),t("p",null,"Nu au fost găsite date",-1)])])):C("",!0)])):C("",!0),v.value?C("",!0):(_(),k(j,{key:1,value:o(s).trialBalanceData,loading:o(s).isLoading,paginator:!0,rows:o(s).pagination.pageSize,"total-records":o(s).pagination.totalItems,lazy:!0,"striped-rows":!0,"paginator-template":"FirstPageLink PrevPageLink PageLinks NextPageLink LastPageLink CurrentPageReport RowsPerPageDropdown","rows-per-page-options":[25,50,100],"current-page-report-template":"Afișare {first} - {last} din {totalRecords} înregistrări","responsive-layout":"scroll",onPage:de,onSort:ce},{empty:m(()=>[...e[27]||(e[27]=[t("div",{class:"table-empty"},[t("i",{class:"pi pi-info-circle table-empty-icon"}),t("p",{class:"table-empty-message"}," Nu au fost găsite date pentru perioada selectată ")],-1)])]),loading:m(()=>[t("div",vt,[n(O),e[28]||(e[28]=t("p",null,"Se încarcă balanța de verificare...",-1))])]),default:m(()=>[n(x,{field:"cont",header:"Cont",sortable:"",style:{width:"8%"}},{body:m(a=>[t("strong",null,u(a.data.cont),1)]),_:1}),n(x,{field:"denumire",header:"Denumire Cont",sortable:"",style:{width:"20%"}}),n(x,{field:"sold_precedent_debit",header:"Sume Prec. D",sortable:"",style:{width:"10%"}},{body:m(a=>[t("div",yt,u(p(a.data.sold_precedent_debit)),1)]),_:1}),n(x,{field:"sold_precedent_credit",header:"Sume Prec. C",sortable:"",style:{width:"10%"}},{body:m(a=>[t("div",ht,u(p(a.data.sold_precedent_credit)),1)]),_:1}),n(x,{field:"rulaj_lunar_debit",header:"Rulaj D",sortable:"",style:{width:"10%"}},{body:m(a=>[t("div",gt,u(p(a.data.rulaj_lunar_debit)),1)]),_:1}),n(x,{field:"rulaj_lunar_credit",header:"Rulaj C",sortable:"",style:{width:"10%"}},{body:m(a=>[t("div",Ct,u(p(a.data.rulaj_lunar_credit)),1)]),_:1}),n(x,{field:"sold_final_debit",header:"Sold Final D",sortable:"",style:{width:"11%"}},{body:m(a=>[t("div",xt,u(p(a.data.sold_final_debit)),1)]),_:1}),n(x,{field:"sold_final_credit",header:"Sold Final C",sortable:"",style:{width:"11%"}},{body:m(a=>[t("div",Ft,u(p(a.data.sold_final_credit)),1)]),_:1})]),_:1},8,["value","loading","rows","total-records"]))]),_:1})):C("",!0)]),v.value?(_(),k(xe,{key:1})):C("",!0)],2)}}},zt=_e(Dt,[["__scopeId","data-v-aad21ab2"]]);export{zt as default}; -//# sourceMappingURL=TrialBalanceView.C154KDAF.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/TrialBalanceView.C154KDAF.js.map b/deploy-package-20260223-151231/frontend/assets/TrialBalanceView.C154KDAF.js.map deleted file mode 100644 index e51e09e..0000000 --- a/deploy-package-20260223-151231/frontend/assets/TrialBalanceView.C154KDAF.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"mappings":"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","names":["toast","useToast","router","useRouter","companyStore","useCompanyStore","trialBalanceStore","useTrialBalanceStore","periodStore","useAccountingPeriodStore","authStore","useAuthStore","selectedCompanyId","ref","_a","isMobile","showFilters","showDrawer","handleLogout","handleServerSwitched","newServerId","mobileTopBarActions","computed","hasActiveFilters","exportMenu","exportMenuItems","exportPDF","exportExcel","desktopExportItems","handleTopBarAction","action","event","clearFilters","handleResize","localFilters","currentPeriodText","refreshData","formatCurrency","amount","formatCompact","truncate","text","maxLength","handleCompanyChange","company","loadTrialBalance","handleFilterChange","applyFilters","handleSearchChange","timeout","error","onPageChange","onSort","sortBy","sortOrder","fetchAllTrialBalanceData","params","response","__vitePreload","__vite_default__","n","allData","exportData","row","exportToExcel","data","sortedData","a","b","result","classTotals","grandTotal","currentClass","accountClass","exportToPDF","onMounted","onUnmounted","watch","newCompany","newPeriod","_createElementBlock","_normalizeClass","_createBlock","MobileTopBar","_createVNode","_unref","Menu","MobileDrawerMenu","$event","BottomSheet","_cache","_createElementVNode","_hoisted_1","_hoisted_2","_component_InputText","_hoisted_3","_hoisted_4","_component_Button","_hoisted_5","_openBlock","_hoisted_6","_component_Card","_hoisted_7","_component_Dropdown","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_12","_toDisplayString","_hoisted_13","_hoisted_14","_hoisted_15","_hoisted_16","_hoisted_17","_hoisted_18","_hoisted_19","_hoisted_20","_hoisted_21","SplitButton","_hoisted_22","_hoisted_23","_hoisted_24","_hoisted_25","_hoisted_26","_hoisted_27","_hoisted_28","_hoisted_29","_hoisted_30","_hoisted_31","_hoisted_32","_hoisted_33","_hoisted_34","_hoisted_35","_Fragment","account","_hoisted_36","_createTextVNode","_hoisted_37","_hoisted_38","_hoisted_39","_component_DataTable","_hoisted_40","_component_ProgressSpinner","_component_Column","_withCtx","slotProps","_hoisted_41","_hoisted_42","_hoisted_43","_hoisted_44","_hoisted_45","_hoisted_46","MobileBottomNav"],"ignoreList":[],"sources":["../../src/modules/reports/views/TrialBalanceView.vue"],"sourcesContent":["\n\n\n\n\n"],"file":"assets/TrialBalanceView.C154KDAF.js"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/exportUtils.BtGzMnqV.js b/deploy-package-20260223-151231/frontend/assets/exportUtils.BtGzMnqV.js deleted file mode 100644 index 8138b66..0000000 --- a/deploy-package-20260223-151231/frontend/assets/exportUtils.BtGzMnqV.js +++ /dev/null @@ -1,2 +0,0 @@ -import{u as A,w as Z,E as H,a as L}from"./vendor-export.BWjBvx7Z.js";const K=d=>d==null||d==="-"?"-":new Intl.NumberFormat("ro-RO",{style:"currency",currency:"RON",minimumFractionDigits:0,maximumFractionDigits:0}).format(d),nt=(d,g,k="Sheet1")=>{try{const e=A.json_to_sheet(d),n=A.book_new();return A.book_append_sheet(n,e,k),Z(n,`${g}_${new Date().toISOString().split("T")[0]}.xlsx`),{success:!0}}catch(e){return console.error("Excel export failed:",e),{success:!1,error:e}}},b=d=>{if(d==null||d===""||d==="-")return"-";const g=parseFloat(d);return isNaN(g)?"-":new Intl.NumberFormat("ro-RO",{minimumFractionDigits:2,maximumFractionDigits:2}).format(g)},ot=(d,g,k,e)=>{try{if(!d||d.length===0)return console.error("No data to export"),{success:!1,error:"No data available"};if(typeof H>"u")return console.error("jsPDF not properly imported"),{success:!1,error:"PDF library not available"};const n=new H("landscape","mm","a4"),T=n.internal.pageSize.getWidth(),m=n.internal.pageSize.getHeight(),f=8,i=8,z=T-f-i,B=e.initialBalances&&e.initialBalances.length>0,w=()=>{n.setFontSize(13),n.setFont(void 0,"bold");const a=e.companyName||"N/A";n.text(a,f,15),n.setFontSize(14),n.setFont(void 0,"bold");const s=n.getTextWidth(e.title||""),c=f+(z-s)/2;n.text(e.title||"",c,24),n.setFontSize(11),n.setFont(void 0,"normal");const u=e.period||"",S=n.getTextWidth(u),R=f+(z-S)/2;n.text(u,R,32);let o=32;e.subtitle2&&(o=39,n.setFontSize(10),n.setFont(void 0,"normal"),n.text(e.subtitle2,f,o))},N=g.map(a=>a.header),I=new Set,Y=new Set,W=d.map((a,s)=>(a._isTotal&&I.add(s),a._isGrandTotal&&Y.add(s),g.map(c=>{const u=a[c.field];return c.type==="currency"?K(u):c.type==="number"?b(u):u||"-"}))),r=(a,s)=>{const c=m-10;n.setFontSize(8),n.setFont(void 0,"normal"),n.text(`Generat: ${new Date().toLocaleString("ro-RO")}`,f,c);const u=`Pagina ${a} din ${s}`,S=n.getTextWidth(u);n.text(u,T-i-S,c)};if(typeof L=="function"){const a={},s=T-f-i,c={};g.forEach((t,l)=>{if(t.width&&typeof t.width=="number")c[l]=s*t.width;else if(t.width==="auto")c[l]="auto";else{const h={0:s*.07,1:s*.33,2:s*.1,3:s*.1,4:s*.1,5:s*.1,6:s*.1,7:s*.1};c[l]=h[l]||"auto"}}),g.forEach((t,l)=>{a[l]={cellWidth:c[l]},t.type==="number"||t.type==="currency"?a[l].halign="right":t.type==="text"&&(a[l].halign="left")});let u=36;if(e.subtitle2&&(u=43),B){const t=e.initialBalances.length,l=t>1,h=t*5+(l?7:0);u=(e.subtitle2?43:36)+h+5}const S=t=>{if(!B)return;const l=T-i,h=e.initialBalances.length,x=h>1,j=h*5+(x?7:0);let F=t-3-(x?7:0)-h*5;if(n.setFont(void 0,"normal"),n.setFontSize(9),e.initialBalances.forEach(P=>{const p=b(P.sold),y=n.getTextWidth(p),C=`${P.accountName} sold precedent:`;n.text(C,l-y-n.getTextWidth(" sold precedent:")-n.getTextWidth(P.accountName)-2,F),n.text(p,l-y,F),F+=5}),x){n.setDrawColor(150,150,150),n.line(l-40,F-2,l,F-2),n.setFont(void 0,"bold");const P=b(e.totalInitialBalance||0),p=n.getTextWidth(P),y="TOTAL sold precedent:",C=n.getTextWidth(y);n.text(y,l-p-3-C,F+2),n.text(P,l-p,F+2)}};let R=!0;L(n,{head:[N],body:W,startY:u,styles:{fontSize:9,cellPadding:2.5,valign:"middle",lineColor:[200,200,200],lineWidth:.1,overflow:"linebreak"},headStyles:{fillColor:[41,128,185],textColor:255,fontStyle:"bold",halign:"center",fontSize:9,cellPadding:2.5},alternateRowStyles:{fillColor:[248,248,248]},columnStyles:a,margin:{left:f,right:i,top:u,bottom:15},tableWidth:T-f-i,theme:"grid",didDrawPage:function(){w(),R&&B&&(S(u),R=!1)},didParseCell:function(t){if(t.section==="body"){const l=t.row.index,h=t.column.index,x=g[h];Y.has(l)?(t.cell.styles.fontStyle="bold",t.cell.styles.fillColor=[200,200,200],t.cell.styles.fontSize=10):I.has(l)&&(t.cell.styles.fontStyle="bold",t.cell.styles.fillColor=[235,235,235]),x&&(x.type==="number"||x.type==="currency"?t.cell.styles.halign="right":x.type==="text"&&(h===0?t.cell.styles.halign="center":t.cell.styles.halign="left"))}},willDrawCell:function(t){if(t.section==="body"&&Y.has(t.row.index)){const l=t.doc;l.setDrawColor(100,100,100),l.setLineWidth(.5),l.line(t.cell.x,t.cell.y,t.cell.x+t.cell.width,t.cell.y)}}});const o=n.internal.getNumberOfPages();for(let t=1;t<=o;t++)n.setPage(t),r(t,o)}else{w();let a=45;n.setFontSize(8),n.setFont(void 0,"bold"),N.forEach((s,c)=>{n.text(s,14+c*35,a)}),n.setFont(void 0,"normal"),n.setFontSize(7),W.forEach((s,c)=>{a+=7,s.forEach((u,S)=>{n.text(String(u),14+S*35,a)})}),r(1,1)}return n.save(`${k}_${new Date().toISOString().split("T")[0]}.pdf`),{success:!0}}catch(n){return console.error("PDF export error details:",n),{success:!1,error:n.message||"PDF generation failed"}}},lt=(d,g,k)=>{try{if(!d||d.length===0)return console.error("No data to export"),{success:!1,error:"No data available"};const e=new H("landscape","mm","a4"),n=e.internal.pageSize.getWidth(),T=e.internal.pageSize.getHeight(),m=8,f=8,i=n-m-f,z=o=>o?o.replace(/[ăâ]/gi,t=>t===t.toLowerCase()?"a":"A").replace(/[î]/gi,t=>t===t.toLowerCase()?"i":"I").replace(/[ș]/gi,t=>t===t.toLowerCase()?"s":"S").replace(/[ț]/gi,t=>t===t.toLowerCase()?"t":"T"):"",B=(o,t=100)=>o?o.length<=t?o:o.substring(0,t)+"...":"",w={},N={};d.forEach(o=>{const t=o.nume_cont_bancar||"Necunoscut";w[t]||(w[t]=[],N[t]=0),o.dataact?w[t].push(o):N[t]=parseFloat(o.sold)||0});const I=["Data act","Nr.act","Explicatia","Incasari","Plati","Sold"],Y={0:i*.1,1:i*.08,2:i*.42,3:i*.13,4:i*.13,5:i*.14},W={};Object.keys(Y).forEach(o=>{W[o]={cellWidth:Y[o]},o>=3&&(W[o].halign="right")});let r=15,a=1;const s=()=>{e.setFontSize(12),e.setFont(void 0,"bold"),e.text(z(g.companyName||""),m,12),e.setFontSize(10),e.setFont(void 0,"normal");const o=`Luna: ${g.luna||""} / ${g.an||""}`,t=e.getTextWidth(o);e.text(o,n-f-t,12),e.setFontSize(13),e.setFont(void 0,"bold");const l=e.getTextWidth(g.title||"");e.text(g.title||"",m+(i-l)/2,20)},c=(o=20)=>r+o>T-15?(e.addPage(),a++,s(),r=28,!0):!1;Object.keys(w).sort((o,t)=>o.localeCompare(t,"ro")).forEach((o,t)=>{const l=w[o],h=N[o]||0;t>0&&(e.addPage(),a++),s(),r=28,e.setFontSize(10),e.setFont(void 0,"bold");const j=`${g.isBanca?"Banca:":"Casa:"} ${z(o)}`;e.text(j,m,r);const F=`Sold precedent: ${b(h)}`,P=e.getTextWidth(F);if(e.text(F,n-f-P,r),r+=6,l.length===0){L(e,{head:[I],body:[],startY:r,styles:{fontSize:8,cellPadding:1.5,lineColor:[200,200,200],lineWidth:.1},headStyles:{fillColor:[41,128,185],textColor:255,fontStyle:"bold",halign:"center",fontSize:8},columnStyles:W,margin:{left:m,right:f},tableWidth:i,theme:"grid"}),r=e.lastAutoTable.finalY;const p=[["","","Total:",b(0),b(0),b(h)]],y=r;L(e,{body:p,startY:r,styles:{fontSize:8,cellPadding:1.5,fontStyle:"bold",lineWidth:0},columnStyles:W,margin:{left:m,right:f},tableWidth:i,theme:"plain"});const C=e.lastAutoTable.finalY;e.setDrawColor(200,200,200),e.setLineWidth(.1),e.rect(m,y,i,C-y),r=e.lastAutoTable.finalY+3}else{const p={};l.forEach(E=>{const $=E.dataact;p[$]||(p[$]=[]),p[$].push(E)});let y=0,C=0,O=h;Object.keys(p).sort().forEach((E,$)=>{const M=p[E],G=E?new Date(E).toLocaleDateString("ro-RO"):"";c(30);const V=[];let _=0,v=0;M.forEach(D=>{const q=parseFloat(D.incasari)||0,J=parseFloat(D.plati)||0;_+=q,v+=J,O=parseFloat(D.sold)||O,V.push([G,D.nract||"",B(z(D.explicatia||D.nume||""),100),b(q),b(J),b(D.sold)])}),y+=_,C+=v,L(e,{head:$===0?[I]:[],body:V,startY:r,styles:{fontSize:8,cellPadding:1.5,lineColor:[200,200,200],lineWidth:.1,overflow:"linebreak"},headStyles:{fillColor:[41,128,185],textColor:255,fontStyle:"bold",halign:"center",fontSize:8},columnStyles:W,margin:{left:m,right:f},tableWidth:i,theme:"grid",showHead:$===0?"firstPage":"never"}),r=e.lastAutoTable.finalY,c(16);const Q=[["","",`Total zi: ${G}`,b(_),b(v),"Sold"],["","","Total cumulat:",b(y),b(C),b(O)]],X=r;L(e,{body:Q,startY:r,styles:{fontSize:8,cellPadding:1.5,fontStyle:"bold",lineWidth:0},columnStyles:W,margin:{left:m,right:f},tableWidth:i,theme:"plain"});const U=e.lastAutoTable.finalY;e.setDrawColor(200,200,200),e.setLineWidth(.1),e.rect(m,X,i,U-X),r=e.lastAutoTable.finalY+3})}});const S=e.internal.getNumberOfPages(),R=`Generat: ${new Date().toLocaleString("ro-RO")}`;for(let o=1;o<=S;o++){e.setPage(o),e.setFontSize(8),e.setFont(void 0,"normal");const t=T-8;e.text(R,m,t);const l=`Pagina ${o} din ${S}`,h=e.getTextWidth(l);e.text(l,n-f-h,t)}return e.save(`${k}_${new Date().toISOString().split("T")[0]}.pdf`),{success:!0}}catch(e){return console.error("Bank Cash Register PDF export error:",e),{success:!1,error:e.message||"PDF generation failed"}}};export{ot as a,lt as b,nt as e}; -//# sourceMappingURL=exportUtils.BtGzMnqV.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/exportUtils.BtGzMnqV.js.map b/deploy-package-20260223-151231/frontend/assets/exportUtils.BtGzMnqV.js.map deleted file mode 100644 index 117afba..0000000 --- a/deploy-package-20260223-151231/frontend/assets/exportUtils.BtGzMnqV.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"exportUtils.BtGzMnqV.js","sources":["../../src/modules/reports/utils/exportUtils.js"],"sourcesContent":["import * as XLSX from \"xlsx\";\nimport { jsPDF } from \"jspdf\";\nimport autoTable from \"jspdf-autotable\";\n\n/**\n * Format currency values for export\n */\nconst formatCurrency = (value) => {\n if (value == null || value === \"-\") return \"-\";\n return new Intl.NumberFormat(\"ro-RO\", {\n style: \"currency\",\n currency: \"RON\",\n minimumFractionDigits: 0,\n maximumFractionDigits: 0,\n }).format(value);\n};\n\n/**\n * Export data to Excel\n * @param {Array} data - Array of objects to export\n * @param {String} filename - Name of the file (without extension)\n * @param {String} sheetName - Name of the Excel sheet\n */\nexport const exportToExcel = (data, filename, sheetName = \"Sheet1\") => {\n try {\n const ws = XLSX.utils.json_to_sheet(data);\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, ws, sheetName);\n XLSX.writeFile(\n wb,\n `${filename}_${new Date().toISOString().split(\"T\")[0]}.xlsx`,\n );\n return { success: true };\n } catch (error) {\n console.error(\"Excel export failed:\", error);\n return { success: false, error };\n }\n};\n\n/**\n * Format number for PDF export\n */\nconst formatNumberForPDF = (value) => {\n if (value == null || value === \"\" || value === \"-\") return \"-\";\n const num = parseFloat(value);\n if (isNaN(num)) return \"-\";\n return new Intl.NumberFormat(\"ro-RO\", {\n minimumFractionDigits: 2,\n maximumFractionDigits: 2,\n }).format(num);\n};\n\n/**\n * Export data to PDF\n * @param {Array} data - Array of objects to export\n * @param {Array} columns - Column definitions [{field: 'key', header: 'Display Name', type: 'text|number|currency', width: 30}]\n * @param {String} filename - Name of the file (without extension)\n * @param {Object} header - Header configuration {companyName: '', title: '', period: '', subtitle2: '', initialBalances: [], totalInitialBalance: 0}\n */\nexport const exportToPDF = (data, columns, filename, header) => {\n try {\n // Check if data exists\n if (!data || data.length === 0) {\n console.error(\"No data to export\");\n return { success: false, error: \"No data available\" };\n }\n\n // Check if jsPDF is properly imported\n if (typeof jsPDF === \"undefined\") {\n console.error(\"jsPDF not properly imported\");\n return { success: false, error: \"PDF library not available\" };\n }\n\n const doc = new jsPDF(\"landscape\", \"mm\", \"a4\");\n const pageWidth = doc.internal.pageSize.getWidth();\n const pageHeight = doc.internal.pageSize.getHeight();\n const marginLeft = 8;\n const marginRight = 8;\n const contentWidth = pageWidth - marginLeft - marginRight;\n\n // Check if there are initial balances to display\n const hasInitialBalances = header.initialBalances && header.initialBalances.length > 0;\n\n // Function to add header (called for each page)\n const addHeader = () => {\n // Line 1: Company name (left aligned, bold, larger font)\n doc.setFontSize(13);\n doc.setFont(undefined, \"bold\");\n const companyName = header.companyName || \"N/A\";\n doc.text(companyName, marginLeft, 15);\n\n // Line 2: Title \"Balanta de Verificare\" (centered)\n doc.setFontSize(14);\n doc.setFont(undefined, \"bold\");\n const titleWidth = doc.getTextWidth(header.title || \"\");\n const titleX = marginLeft + (contentWidth - titleWidth) / 2;\n doc.text(header.title || \"\", titleX, 24);\n\n // Line 3: Period (centered, below title)\n doc.setFontSize(11);\n doc.setFont(undefined, \"normal\");\n const periodText = header.period || \"\";\n const periodWidth = doc.getTextWidth(periodText);\n const periodX = marginLeft + (contentWidth - periodWidth) / 2;\n doc.text(periodText, periodX, 32);\n\n // Line 4: Subtitle2 - filters (left aligned, below period) - optional\n let currentY = 32;\n if (header.subtitle2) {\n currentY = 39;\n doc.setFontSize(10);\n doc.setFont(undefined, \"normal\");\n doc.text(header.subtitle2, marginLeft, currentY);\n }\n\n // Initial Balances section - rendered just before table, closer to it\n // This is handled in didDrawPage for first page only\n };\n\n // Prepare table data and track total rows\n const tableColumns = columns.map((col) => col.header);\n const totalRowIndices = new Set(); // Track which rows are totals\n\n const grandTotalRowIndices = new Set(); // Track grand total rows\n\n const tableRows = data.map((row, rowIndex) => {\n // Track total rows for special styling\n if (row._isTotal) {\n totalRowIndices.add(rowIndex);\n }\n if (row._isGrandTotal) {\n grandTotalRowIndices.add(rowIndex);\n }\n\n return columns.map((col) => {\n const value = row[col.field];\n if (col.type === \"currency\") {\n return formatCurrency(value);\n } else if (col.type === \"number\") {\n return formatNumberForPDF(value);\n }\n return value || \"-\";\n });\n });\n\n // Function to add footer (called for each page)\n const addFooter = (pageNum, totalPages) => {\n const footerY = pageHeight - 10; // 10mm from bottom\n\n // Left side: Generation date\n doc.setFontSize(8);\n doc.setFont(undefined, \"normal\");\n doc.text(\n `Generat: ${new Date().toLocaleString(\"ro-RO\")}`,\n marginLeft,\n footerY,\n );\n\n // Right side: Page numbers\n const pageText = `Pagina ${pageNum} din ${totalPages}`;\n const pageTextWidth = doc.getTextWidth(pageText);\n doc.text(pageText, pageWidth - marginRight - pageTextWidth, footerY);\n };\n\n // Check if autoTable is available\n if (typeof autoTable === \"function\") {\n // Build column styles - jspdf-autotable uses numeric keys\n const columnStyles = {};\n\n // Calculate optimal column widths\n // Total usable width: pageWidth - marginLeft - marginRight\n const totalWidth = pageWidth - marginLeft - marginRight; // ~281mm for A4 landscape\n\n // Define width allocation (proportional) - support custom widths from columns\n const widthAllocations = {};\n\n columns.forEach((col, index) => {\n // Use custom width if provided, otherwise auto\n if (col.width && typeof col.width === \"number\") {\n widthAllocations[index] = totalWidth * col.width;\n } else if (col.width === \"auto\") {\n widthAllocations[index] = \"auto\";\n } else {\n // Default width allocation for Trial Balance (8 columns)\n const defaultWidths = {\n 0: totalWidth * 0.07, // Cont: ~20mm\n 1: totalWidth * 0.33, // Denumire: ~93mm\n 2: totalWidth * 0.1, // Sume Prec D: ~28mm\n 3: totalWidth * 0.1, // Sume Prec C: ~28mm\n 4: totalWidth * 0.1, // Rulaj D: ~28mm\n 5: totalWidth * 0.1, // Rulaj C: ~28mm\n 6: totalWidth * 0.1, // Sold Final D: ~28mm\n 7: totalWidth * 0.1, // Sold Final C: ~28mm\n };\n widthAllocations[index] = defaultWidths[index] || \"auto\";\n }\n });\n\n columns.forEach((col, index) => {\n columnStyles[index] = {\n cellWidth: widthAllocations[index],\n };\n\n // Set alignment based on type\n if (col.type === \"number\" || col.type === \"currency\") {\n columnStyles[index].halign = \"right\";\n } else if (col.type === \"text\") {\n // All text columns aligned left (including Cont)\n columnStyles[index].halign = \"left\";\n }\n });\n\n // Start table lower based on header content\n let tableStartY = 36;\n if (header.subtitle2) tableStartY = 43;\n if (hasInitialBalances) {\n // Initial balances rendered close to table (just 3mm above table header)\n const balancesCount = header.initialBalances.length;\n const hasTotal = balancesCount > 1;\n const balancesHeight = (balancesCount * 5) + (hasTotal ? 7 : 0);\n // Base position after header content\n const baseY = header.subtitle2 ? 43 : 36;\n tableStartY = baseY + balancesHeight + 5; // balances + small gap before table\n }\n\n // Function to draw initial balances (called only on first page)\n const drawInitialBalances = (tableY) => {\n if (!hasInitialBalances) return;\n\n const valueRightEdge = pageWidth - marginRight;\n const balancesCount = header.initialBalances.length;\n const hasTotal = balancesCount > 1;\n const balancesHeight = (balancesCount * 5) + (hasTotal ? 7 : 0);\n\n // Start position: just above table header (3mm gap)\n let y = tableY - 3 - (hasTotal ? 7 : 0) - (balancesCount * 5);\n\n doc.setFont(undefined, \"normal\");\n doc.setFontSize(9);\n\n // Draw each balance line: \"AccountName sold precedent: VALUE\"\n header.initialBalances.forEach((item) => {\n const value = formatNumberForPDF(item.sold);\n const valueWidth = doc.getTextWidth(value);\n const label = `${item.accountName} sold precedent:`;\n\n doc.text(label, valueRightEdge - valueWidth - doc.getTextWidth(\" sold precedent:\") - doc.getTextWidth(item.accountName) - 2, y);\n doc.text(value, valueRightEdge - valueWidth, y);\n y += 5;\n });\n\n // Total only if multiple accounts\n if (hasTotal) {\n // Separator line\n doc.setDrawColor(150, 150, 150);\n doc.line(valueRightEdge - 40, y - 2, valueRightEdge, y - 2);\n\n // Total line\n doc.setFont(undefined, \"bold\");\n const totalValue = formatNumberForPDF(header.totalInitialBalance || 0);\n const totalValueWidth = doc.getTextWidth(totalValue);\n const totalLabel = \"TOTAL sold precedent:\";\n const totalLabelWidth = doc.getTextWidth(totalLabel);\n\n doc.text(totalLabel, valueRightEdge - totalValueWidth - 3 - totalLabelWidth, y + 2);\n doc.text(totalValue, valueRightEdge - totalValueWidth, y + 2);\n }\n };\n\n let isFirstPage = true;\n\n // Add table using autoTable (call as function, not method)\n autoTable(doc, {\n head: [tableColumns],\n body: tableRows,\n startY: tableStartY,\n styles: {\n fontSize: 9,\n cellPadding: 2.5,\n valign: \"middle\",\n lineColor: [200, 200, 200],\n lineWidth: 0.1,\n overflow: \"linebreak\",\n },\n headStyles: {\n fillColor: [41, 128, 185],\n textColor: 255,\n fontStyle: \"bold\",\n halign: \"center\",\n fontSize: 9,\n cellPadding: 2.5,\n },\n alternateRowStyles: {\n fillColor: [248, 248, 248],\n },\n columnStyles: columnStyles,\n margin: {\n left: marginLeft,\n right: marginRight,\n top: tableStartY,\n bottom: 15,\n },\n tableWidth: pageWidth - marginLeft - marginRight, // Use full page width\n theme: \"grid\",\n didDrawPage: function () {\n // Add header to each page\n addHeader();\n // Draw initial balances only on first page\n if (isFirstPage && hasInitialBalances) {\n drawInitialBalances(tableStartY);\n isFirstPage = false;\n }\n },\n didParseCell: function (data) {\n // Force alignment based on column type (body cells only)\n if (data.section === \"body\") {\n const rowIndex = data.row.index;\n const colIndex = data.column.index;\n const column = columns[colIndex];\n\n // Style grand total rows (bold, darker gray background)\n if (grandTotalRowIndices.has(rowIndex)) {\n data.cell.styles.fontStyle = \"bold\";\n data.cell.styles.fillColor = [200, 200, 200]; // Darker gray\n data.cell.styles.fontSize = 10;\n }\n // Style class total rows (bold, light gray background)\n else if (totalRowIndices.has(rowIndex)) {\n data.cell.styles.fontStyle = \"bold\";\n data.cell.styles.fillColor = [235, 235, 235]; // Light gray\n }\n\n if (column) {\n if (column.type === \"number\" || column.type === \"currency\") {\n data.cell.styles.halign = \"right\";\n } else if (column.type === \"text\") {\n if (colIndex === 0) {\n data.cell.styles.halign = \"center\";\n } else {\n data.cell.styles.halign = \"left\";\n }\n }\n }\n }\n },\n willDrawCell: function (data) {\n // Draw double line above grand total row\n if (data.section === \"body\" && grandTotalRowIndices.has(data.row.index)) {\n const doc = data.doc;\n doc.setDrawColor(100, 100, 100);\n doc.setLineWidth(0.5);\n doc.line(data.cell.x, data.cell.y, data.cell.x + data.cell.width, data.cell.y);\n }\n },\n });\n\n // Add footer to all pages AFTER table generation\n const totalPages = doc.internal.getNumberOfPages();\n for (let i = 1; i <= totalPages; i++) {\n doc.setPage(i);\n addFooter(i, totalPages);\n }\n } else {\n // Fallback mode (autoTable NOT available)\n // Add header on first page\n addHeader();\n\n // Fallback: manual table creation\n let yPos = 45;\n\n // Draw headers\n doc.setFontSize(8);\n doc.setFont(undefined, \"bold\");\n tableColumns.forEach((header, index) => {\n doc.text(header, 14 + index * 35, yPos);\n });\n\n // Draw rows\n doc.setFont(undefined, \"normal\");\n doc.setFontSize(7);\n tableRows.forEach((row, rowIndex) => {\n yPos += 7;\n row.forEach((cell, cellIndex) => {\n doc.text(String(cell), 14 + cellIndex * 35, yPos);\n });\n });\n\n // Add footer in fallback mode\n addFooter(1, 1);\n }\n\n // Save PDF\n doc.save(`${filename}_${new Date().toISOString().split(\"T\")[0]}.pdf`);\n return { success: true };\n } catch (error) {\n console.error(\"PDF export error details:\", error);\n return { success: false, error: error.message || \"PDF generation failed\" };\n }\n};\n\n/**\n * Export General Totals table\n */\nexport const exportGeneralTotals = (summaryData) => {\n const data = [\n {\n Tip: \"Clienți\",\n \"Total Facturat\": summaryData?.clienti_total_facturat || 0,\n \"Total Încasat\": summaryData?.clienti_total_incasat || 0,\n \"Sold Net\": summaryData?.clienti_sold_total || 0,\n \"Sold În Termen\": summaryData?.clienti_sold_in_termen || 0,\n \"Sold Restant\": summaryData?.clienti_sold_restant || 0,\n },\n {\n Tip: \"Furnizori\",\n \"Total Facturat\": summaryData?.furnizori_total_facturat || 0,\n \"Total Achitat\": summaryData?.furnizori_total_achitat || 0,\n \"Sold Net\": summaryData?.furnizori_sold_total || 0,\n \"Sold În Termen\": summaryData?.furnizori_sold_in_termen || 0,\n \"Sold Restant\": summaryData?.furnizori_sold_restant || 0,\n },\n {\n Tip: \"Trezorerie\",\n \"Total Facturat\": \"-\",\n \"Total Încasat/Achitat\": \"-\",\n \"Sold Net\": summaryData?.trezorerie_sold || 0,\n \"Sold În Termen\": \"-\",\n \"Sold Restant\": \"-\",\n },\n ];\n\n return data;\n};\n\n/**\n * Export Sold Net Breakdown table\n */\nexport const exportSoldNetBreakdown = (summaryData) => {\n const data = [\n {\n Categorie: \"Clienți - Restant\",\n TOTAL: summaryData?.clienti_sold_restant || 0,\n \"7 zile\": summaryData?.clienti_restant_7 || 0,\n \"14 zile\": summaryData?.clienti_restant_14 || 0,\n \"30 zile\": summaryData?.clienti_restant_30 || 0,\n \"60 zile\": summaryData?.clienti_restant_60 || 0,\n \"90 zile\": summaryData?.clienti_restant_90 || 0,\n \"90+ zile\": summaryData?.clienti_restant_over_90 || 0,\n },\n {\n Categorie: \"Furnizori - Restant\",\n TOTAL: summaryData?.furnizori_sold_restant || 0,\n \"7 zile\": summaryData?.furnizori_restant_7 || 0,\n \"14 zile\": summaryData?.furnizori_restant_14 || 0,\n \"30 zile\": summaryData?.furnizori_restant_30 || 0,\n \"60 zile\": summaryData?.furnizori_restant_60 || 0,\n \"90 zile\": summaryData?.furnizori_restant_90 || 0,\n \"90+ zile\": summaryData?.furnizori_restant_over_90 || 0,\n },\n ];\n\n return data;\n};\n\n/**\n * Export Bank Cash Register to PDF with grouped format\n * Matches the Romanian standard format with:\n * - Bank name + Sold precedent on same line\n * - Daily totals (Total zi)\n * - Cumulative totals (Total cumulat)\n *\n * @param {Array} data - Array of register entries\n * @param {Object} header - Header configuration\n * @param {String} filename - Output filename\n */\nexport const exportBankCashRegisterPDF = (data, header, filename) => {\n try {\n if (!data || data.length === 0) {\n console.error(\"No data to export\");\n return { success: false, error: \"No data available\" };\n }\n\n const doc = new jsPDF(\"landscape\", \"mm\", \"a4\");\n const pageWidth = doc.internal.pageSize.getWidth();\n const pageHeight = doc.internal.pageSize.getHeight();\n const marginLeft = 8;\n const marginRight = 8;\n const contentWidth = pageWidth - marginLeft - marginRight;\n\n // Remove diacritics helper\n const removeDiacritics = (text) => {\n if (!text) return \"\";\n return text\n .replace(/[ăâ]/gi, (m) => (m === m.toLowerCase() ? \"a\" : \"A\"))\n .replace(/[î]/gi, (m) => (m === m.toLowerCase() ? \"i\" : \"I\"))\n .replace(/[ș]/gi, (m) => (m === m.toLowerCase() ? \"s\" : \"S\"))\n .replace(/[ț]/gi, (m) => (m === m.toLowerCase() ? \"t\" : \"T\"));\n };\n\n // Truncate text helper (limit explicatia to 100 chars)\n const truncateText = (text, maxLength = 100) => {\n if (!text) return \"\";\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + \"...\";\n };\n\n // Group data by bank account (bancasa)\n const groupedByBank = {};\n const initialBalances = {};\n\n data.forEach((row) => {\n const bankName = row.nume_cont_bancar || \"Necunoscut\";\n if (!groupedByBank[bankName]) {\n groupedByBank[bankName] = [];\n initialBalances[bankName] = 0;\n }\n\n if (!row.dataact) {\n // Initial balance row (null date) - sold precedent\n initialBalances[bankName] = parseFloat(row.sold) || 0;\n } else {\n // Transaction row with date\n groupedByBank[bankName].push(row);\n }\n });\n\n // Table columns definition\n const tableColumns = [\n \"Data act\",\n \"Nr.act\",\n \"Explicatia\",\n \"Incasari\",\n \"Plati\",\n \"Sold\",\n ];\n\n const columnWidths = {\n 0: contentWidth * 0.10, // Data act\n 1: contentWidth * 0.08, // Nr.act\n 2: contentWidth * 0.42, // Explicatia\n 3: contentWidth * 0.13, // Incasari\n 4: contentWidth * 0.13, // Plati\n 5: contentWidth * 0.14, // Sold\n };\n\n const columnStyles = {};\n Object.keys(columnWidths).forEach((idx) => {\n columnStyles[idx] = { cellWidth: columnWidths[idx] };\n if (idx >= 3) {\n columnStyles[idx].halign = \"right\";\n }\n });\n\n let currentY = 15;\n let pageNum = 1;\n\n // Function to add page header\n const addPageHeader = () => {\n // Company name (left)\n doc.setFontSize(12);\n doc.setFont(undefined, \"bold\");\n doc.text(removeDiacritics(header.companyName || \"\"), marginLeft, 12);\n\n // Luna: MM / YYYY (right)\n doc.setFontSize(10);\n doc.setFont(undefined, \"normal\");\n const lunaText = `Luna: ${header.luna || \"\"} / ${header.an || \"\"}`;\n const lunaWidth = doc.getTextWidth(lunaText);\n doc.text(lunaText, pageWidth - marginRight - lunaWidth, 12);\n\n // Title centered\n doc.setFontSize(13);\n doc.setFont(undefined, \"bold\");\n const titleWidth = doc.getTextWidth(header.title || \"\");\n doc.text(header.title || \"\", marginLeft + (contentWidth - titleWidth) / 2, 20);\n };\n\n // Function to check if we need a new page (for tables spanning multiple pages within a bank)\n const checkNewPage = (neededHeight = 20) => {\n if (currentY + neededHeight > pageHeight - 15) {\n doc.addPage();\n pageNum++;\n addPageHeader();\n currentY = 28;\n return true;\n }\n return false;\n };\n\n // Process each bank account - each on a new page (sorted alphabetically)\n const bankNames = Object.keys(groupedByBank).sort((a, b) => a.localeCompare(b, 'ro'));\n\n bankNames.forEach((bankName, bankIndex) => {\n const bankRows = groupedByBank[bankName];\n const soldPrecedent = initialBalances[bankName] || 0;\n\n // Start each bank/casa on a new page (except first one which is already on page 1)\n if (bankIndex > 0) {\n doc.addPage();\n pageNum++;\n }\n\n // Add full page header (company, title, luna/an)\n addPageHeader();\n currentY = 28;\n\n // Bank/Casa header: \"Banca: NAME\" (left) + \"Sold precedent: VALUE\" (right)\n doc.setFontSize(10);\n doc.setFont(undefined, \"bold\");\n const bankLabel = header.isBanca ? \"Banca:\" : \"Casa:\";\n const bankHeaderText = `${bankLabel} ${removeDiacritics(bankName)}`;\n doc.text(bankHeaderText, marginLeft, currentY);\n\n const soldPrecedentText = `Sold precedent: ${formatNumberForPDF(soldPrecedent)}`;\n const soldPrecedentWidth = doc.getTextWidth(soldPrecedentText);\n doc.text(soldPrecedentText, pageWidth - marginRight - soldPrecedentWidth, currentY);\n\n currentY += 6;\n\n // Handle case when there are no transactions (only initial balance)\n if (bankRows.length === 0) {\n // Draw empty table with header only\n autoTable(doc, {\n head: [tableColumns],\n body: [],\n startY: currentY,\n styles: {\n fontSize: 8,\n cellPadding: 1.5,\n lineColor: [200, 200, 200],\n lineWidth: 0.1,\n },\n headStyles: {\n fillColor: [41, 128, 185],\n textColor: 255,\n fontStyle: \"bold\",\n halign: \"center\",\n fontSize: 8,\n },\n columnStyles: columnStyles,\n margin: { left: marginLeft, right: marginRight },\n tableWidth: contentWidth,\n theme: \"grid\",\n });\n\n currentY = doc.lastAutoTable.finalY;\n\n // Show total with sold precedent (no transactions)\n const totalRows = [\n [\n \"\",\n \"\",\n \"Total:\",\n formatNumberForPDF(0),\n formatNumberForPDF(0),\n formatNumberForPDF(soldPrecedent),\n ],\n ];\n\n const totalsStartY = currentY;\n\n autoTable(doc, {\n body: totalRows,\n startY: currentY,\n styles: {\n fontSize: 8,\n cellPadding: 1.5,\n fontStyle: \"bold\",\n lineWidth: 0,\n },\n columnStyles: columnStyles,\n margin: { left: marginLeft, right: marginRight },\n tableWidth: contentWidth,\n theme: \"plain\",\n });\n\n // Draw outer border for totals box\n const totalsEndY = doc.lastAutoTable.finalY;\n doc.setDrawColor(200, 200, 200);\n doc.setLineWidth(0.1);\n doc.rect(marginLeft, totalsStartY, contentWidth, totalsEndY - totalsStartY);\n\n currentY = doc.lastAutoTable.finalY + 3;\n } else {\n // Group bank rows by date\n const groupedByDate = {};\n bankRows.forEach((row) => {\n const dateKey = row.dataact;\n if (!groupedByDate[dateKey]) {\n groupedByDate[dateKey] = [];\n }\n groupedByDate[dateKey].push(row);\n });\n\n // Cumulative totals for the bank\n let cumulativeIncasari = 0;\n let cumulativePlati = 0;\n let lastSold = soldPrecedent;\n\n const dates = Object.keys(groupedByDate).sort();\n\n dates.forEach((dateKey, dateIndex) => {\n const dateRows = groupedByDate[dateKey];\n const dateFormatted = dateKey\n ? new Date(dateKey).toLocaleDateString(\"ro-RO\")\n : \"\";\n\n checkNewPage(30);\n\n // Prepare rows for this date\n const tableRows = [];\n let dailyIncasari = 0;\n let dailyPlati = 0;\n\n dateRows.forEach((row) => {\n const incasari = parseFloat(row.incasari) || 0;\n const plati = parseFloat(row.plati) || 0;\n\n dailyIncasari += incasari;\n dailyPlati += plati;\n lastSold = parseFloat(row.sold) || lastSold;\n\n tableRows.push([\n dateFormatted,\n row.nract || \"\",\n truncateText(removeDiacritics(row.explicatia || row.nume || \"\"), 100),\n formatNumberForPDF(incasari),\n formatNumberForPDF(plati),\n formatNumberForPDF(row.sold),\n ]);\n });\n\n cumulativeIncasari += dailyIncasari;\n cumulativePlati += dailyPlati;\n\n // Draw table for this date group\n autoTable(doc, {\n head: dateIndex === 0 ? [tableColumns] : [],\n body: tableRows,\n startY: currentY,\n styles: {\n fontSize: 8,\n cellPadding: 1.5,\n lineColor: [200, 200, 200],\n lineWidth: 0.1,\n overflow: \"linebreak\",\n },\n headStyles: {\n fillColor: [41, 128, 185],\n textColor: 255,\n fontStyle: \"bold\",\n halign: \"center\",\n fontSize: 8,\n },\n columnStyles: columnStyles,\n margin: { left: marginLeft, right: marginRight },\n tableWidth: contentWidth,\n theme: \"grid\",\n showHead: dateIndex === 0 ? \"firstPage\" : \"never\",\n });\n\n currentY = doc.lastAutoTable.finalY;\n\n // Daily total + Cumulative total rows in same box\n checkNewPage(16);\n\n const totalRows = [\n [\n \"\",\n \"\",\n `Total zi: ${dateFormatted}`,\n formatNumberForPDF(dailyIncasari),\n formatNumberForPDF(dailyPlati),\n \"Sold\",\n ],\n [\n \"\",\n \"\",\n \"Total cumulat:\",\n formatNumberForPDF(cumulativeIncasari),\n formatNumberForPDF(cumulativePlati),\n formatNumberForPDF(lastSold),\n ],\n ];\n\n const totalsStartY = currentY;\n\n autoTable(doc, {\n body: totalRows,\n startY: currentY,\n styles: {\n fontSize: 8,\n cellPadding: 1.5,\n fontStyle: \"bold\",\n lineWidth: 0,\n },\n columnStyles: columnStyles,\n margin: { left: marginLeft, right: marginRight },\n tableWidth: contentWidth,\n theme: \"plain\",\n });\n\n // Draw outer border for totals box (no internal lines)\n const totalsEndY = doc.lastAutoTable.finalY;\n doc.setDrawColor(200, 200, 200);\n doc.setLineWidth(0.1);\n doc.rect(marginLeft, totalsStartY, contentWidth, totalsEndY - totalsStartY);\n\n currentY = doc.lastAutoTable.finalY + 3;\n });\n }\n\n });\n\n // Add footer to all pages (Generat: DATE on left, Pagina X din Y on right)\n const totalPages = doc.internal.getNumberOfPages();\n const generatedText = `Generat: ${new Date().toLocaleString(\"ro-RO\")}`;\n for (let i = 1; i <= totalPages; i++) {\n doc.setPage(i);\n doc.setFontSize(8);\n doc.setFont(undefined, \"normal\");\n const footerY = pageHeight - 8;\n\n // Left: Generated date\n doc.text(generatedText, marginLeft, footerY);\n\n // Right: Page number\n const pageText = `Pagina ${i} din ${totalPages}`;\n const pageTextWidth = doc.getTextWidth(pageText);\n doc.text(pageText, pageWidth - marginRight - pageTextWidth, footerY);\n }\n\n doc.save(`${filename}_${new Date().toISOString().split(\"T\")[0]}.pdf`);\n return { success: true };\n } catch (error) {\n console.error(\"Bank Cash Register PDF export error:\", error);\n return { success: false, error: error.message || \"PDF generation failed\" };\n }\n};\n\n/**\n * Export Trend Data\n */\nexport const exportTrendData = (trendsData, period, chartType) => {\n if (!trendsData || !trendsData.labels || !trendsData.datasets) {\n return [];\n }\n\n const data = trendsData.labels.map((label, index) => {\n const row = { Perioada: label };\n\n trendsData.datasets.forEach((dataset) => {\n const value = dataset.data[index];\n row[dataset.label] = value || 0;\n });\n\n return row;\n });\n\n return data;\n};\n"],"names":["formatCurrency","value","exportToExcel","data","filename","sheetName","ws","XLSX.utils","wb","XLSX.writeFile","error","formatNumberForPDF","num","exportToPDF","columns","header","jsPDF","doc","pageWidth","pageHeight","marginLeft","marginRight","contentWidth","hasInitialBalances","addHeader","companyName","titleWidth","titleX","periodText","periodWidth","periodX","currentY","tableColumns","col","totalRowIndices","grandTotalRowIndices","tableRows","row","rowIndex","addFooter","pageNum","totalPages","footerY","pageText","pageTextWidth","autoTable","columnStyles","totalWidth","widthAllocations","index","defaultWidths","tableStartY","balancesCount","hasTotal","balancesHeight","drawInitialBalances","tableY","valueRightEdge","y","item","valueWidth","label","totalValue","totalValueWidth","totalLabel","totalLabelWidth","isFirstPage","colIndex","column","i","yPos","cell","cellIndex","exportBankCashRegisterPDF","removeDiacritics","text","m","truncateText","maxLength","groupedByBank","initialBalances","bankName","columnWidths","idx","addPageHeader","lunaText","lunaWidth","checkNewPage","neededHeight","a","b","bankIndex","bankRows","soldPrecedent","bankHeaderText","soldPrecedentText","soldPrecedentWidth","totalRows","totalsStartY","totalsEndY","groupedByDate","dateKey","cumulativeIncasari","cumulativePlati","lastSold","dateIndex","dateRows","dateFormatted","dailyIncasari","dailyPlati","incasari","plati","generatedText"],"mappings":"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"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/html2canvas.esm.CBrSDip1.js b/deploy-package-20260223-151231/frontend/assets/html2canvas.esm.CBrSDip1.js deleted file mode 100644 index c09d694..0000000 --- a/deploy-package-20260223-151231/frontend/assets/html2canvas.esm.CBrSDip1.js +++ /dev/null @@ -1,23 +0,0 @@ -/*! - * html2canvas 1.4.1 - * Copyright (c) 2022 Niklas von Hertzen - * Released under MIT License - *//*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */var mr=function(e,A){return mr=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,r){t.__proto__=r}||function(t,r){for(var B in r)Object.prototype.hasOwnProperty.call(r,B)&&(t[B]=r[B])},mr(e,A)};function tA(e,A){if(typeof A!="function"&&A!==null)throw new TypeError("Class extends value "+String(A)+" is not a constructor or null");mr(e,A);function t(){this.constructor=e}e.prototype=A===null?Object.create(A):(t.prototype=A.prototype,new t)}var Lr=function(){return Lr=Object.assign||function(A){for(var t,r=1,B=arguments.length;r0&&n[n.length-1])&&(o[0]===6||o[0]===2)){t=0;continue}if(o[0]===3&&(!n||o[1]>n[0]&&o[1]=55296&&B<=56319&&t>10)+55296,s%1024+56320)),(B+1===t||r.length>16384)&&(n+=String.fromCharCode.apply(String,r),r.length=0)}return n},nt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",on=typeof Uint8Array>"u"?[]:new Uint8Array(256);for(var le=0;le"u"?[]:new Uint8Array(256);for(var fe=0;fe>4,Q[B++]=(s&15)<<4|i>>2,Q[B++]=(i&3)<<6|a&63;return o},gn=function(e){for(var A=e.length,t=[],r=0;r>bA,Cn=1<>bA,ln=BB+un,fn=ln,Un=32,Fn=fn+Un,hn=65536>>zr,dn=1<=0){if(A<55296||A>56319&&A<=65535)return t=this.index[A>>bA],t=(t<>bA)],t=(t<>zr),t=this.index[t],t+=A>>bA&En,t=this.index[t],t=(t<"u"?[]:new Uint8Array(256);for(var Ue=0;Ueot?(B.push(!0),i-=ot):B.push(!1),["normal","auto","loose"].indexOf(A)!==-1&&[8208,8211,12316,12448].indexOf(n)!==-1)return r.push(s),t.push(xr);if(i===mn||i===Dr){if(s===0)return r.push(s),t.push(LA);var a=t[s-1];return Mn.indexOf(a)===-1?(r.push(r[s-1]),t.push(a)):(r.push(s),t.push(LA))}if(r.push(s),i===Tn)return t.push(A==="strict"?Tr:Qe);if(i===iB||i===xn)return t.push(LA);if(i===Sn)return n>=131072&&n<=196605||n>=196608&&n<=262141?t.push(Qe):t.push(LA);t.push(i)}),[r,t,B]},wr=function(e,A,t,r){var B=r[t];if(Array.isArray(e)?e.indexOf(B)!==-1:e===B)for(var n=t;n<=r.length;){n++;var s=r[n];if(s===A)return!0;if(s!==FA)break}if(B===FA)for(var n=t;n>0;){n--;var i=r[n];if(Array.isArray(e)?e.indexOf(i)!==-1:e===i)for(var a=t;a<=r.length;){a++;var s=r[a];if(s===A)return!0;if(s!==FA)break}if(i!==FA)break}return!1},lt=function(e,A){for(var t=e;t>=0;){var r=A[t];if(r===FA)t--;else return r}return 0},Vn=function(e,A,t,r,B){if(t[r]===0)return I;var n=r-1;if(Array.isArray(B)&&B[n]===!0)return I;var s=n-1,i=n+1,a=A[n],o=s>=0?A[s]:0,Q=A[i];if(a===nB&&Q===sB)return I;if(Vr.indexOf(a)!==-1)return oB;if(Vr.indexOf(Q)!==-1||QB.indexOf(Q)!==-1)return I;if(lt(n,A)===aB)return Ee;if(Rr.get(e[n])===Dr||(a===he||a===de)&&Rr.get(e[i])===Dr||a===Qt||Q===Qt||a===gt||[FA,br,$A].indexOf(a)===-1&&Q===gt||[Fe,WA,bn,SA,OA].indexOf(Q)!==-1||lt(n,A)===ZA||wr(Qr,ZA,n,A)||wr([Fe,WA],Tr,n,A)||wr(wt,wt,n,A))return I;if(a===FA)return Ee;if(a===Qr||Q===Qr)return I;if(Q===xr||a===xr)return Ee;if([br,$A,Tr].indexOf(Q)!==-1||a===Dn||o===Mr&&Gn.indexOf(a)!==-1||a===OA&&Q===Mr||Q===ct||QA.indexOf(Q)!==-1&&a===j||QA.indexOf(a)!==-1&&Q===j||a===ee&&[Qe,he,de].indexOf(Q)!==-1||[Qe,he,de].indexOf(a)!==-1&&Q===Ae||QA.indexOf(a)!==-1&&Ct.indexOf(Q)!==-1||Ct.indexOf(a)!==-1&&QA.indexOf(Q)!==-1||[ee,Ae].indexOf(a)!==-1&&(Q===j||[ZA,$A].indexOf(Q)!==-1&&A[i+1]===j)||[ZA,$A].indexOf(a)!==-1&&Q===j||a===j&&[j,OA,SA].indexOf(Q)!==-1)return I;if([j,OA,SA,Fe,WA].indexOf(Q)!==-1)for(var g=n;g>=0;){var w=A[g];if(w===j)return I;if([OA,SA].indexOf(w)!==-1)g--;else break}if([ee,Ae].indexOf(Q)!==-1)for(var g=[Fe,WA].indexOf(a)!==-1?s:n;g>=0;){var w=A[g];if(w===j)return I;if([OA,SA].indexOf(w)!==-1)g--;else break}if(Gr===a&&[Gr,Ge,Sr,Or].indexOf(Q)!==-1||[Ge,Sr].indexOf(a)!==-1&&[Ge,Re].indexOf(Q)!==-1||[Re,Or].indexOf(a)!==-1&&Q===Re||ut.indexOf(a)!==-1&&[ct,Ae].indexOf(Q)!==-1||ut.indexOf(Q)!==-1&&a===ee||QA.indexOf(a)!==-1&&QA.indexOf(Q)!==-1||a===SA&&QA.indexOf(Q)!==-1||QA.concat(j).indexOf(a)!==-1&&Q===ZA&&On.indexOf(e[i])===-1||QA.concat(j).indexOf(Q)!==-1&&a===WA)return I;if(a===gr&&Q===gr){for(var f=t[n],c=1;f>0&&(f--,A[f]===gr);)c++;if(c%2!==0)return I}return a===he&&Q===de?I:Ee},Nn=function(e,A){A||(A={lineBreak:"normal",wordBreak:"normal"});var t=Rn(e,A.lineBreak),r=t[0],B=t[1],n=t[2];(A.wordBreak==="break-all"||A.wordBreak==="break-word")&&(B=B.map(function(i){return[j,LA,iB].indexOf(i)!==-1?Qe:i}));var s=A.wordBreak==="keep-all"?n.map(function(i,a){return i&&e[a]>=19968&&e[a]<=40959}):void 0;return[r,B,s]},Xn=function(){function e(A,t,r,B){this.codePoints=A,this.required=t===oB,this.start=r,this.end=B}return e.prototype.slice=function(){return S.apply(void 0,this.codePoints.slice(this.start,this.end))},e}(),_n=function(e,A){var t=$e(e),r=Nn(t,A),B=r[0],n=r[1],s=r[2],i=t.length,a=0,o=0;return{next:function(){if(o>=i)return{done:!0,value:null};for(var Q=I;o=gB&&e<=57},Hs=function(e){return e>=55296&&e<=57343},MA=function(e){return J(e)||e>=CB&&e<=lB||e>=wB&&e<=Us},ps=function(e){return e>=wB&&e<=hs},Is=function(e){return e>=CB&&e<=Es},vs=function(e){return ps(e)||Is(e)},ys=function(e){return e>=is},ye=function(e){return e===Xe||e===kn||e===Yn},_e=function(e){return vs(e)||ys(e)||e===jn},dt=function(e){return _e(e)||J(e)||e===Z},Ks=function(e){return e>=ws&&e<=cs||e===Cs||e>=us&&e<=ls||e===fs},UA=function(e,A){return e!==ne?!1:A!==Xe},Ke=function(e,A,t){return e===Z?_e(A)||UA(A,t):_e(e)?!0:!!(e===ne&&UA(e,A))},Cr=function(e,A,t){return e===DA||e===Z?J(A)?!0:A===ge&&J(t):J(e===ge?A:e)},ms=function(e){var A=0,t=1;(e[A]===DA||e[A]===Z)&&(e[A]===Z&&(t=-1),A++);for(var r=[];J(e[A]);)r.push(e[A++]);var B=r.length?parseInt(S.apply(void 0,r),10):0;e[A]===ge&&A++;for(var n=[];J(e[A]);)n.push(e[A++]);var s=n.length,i=s?parseInt(S.apply(void 0,n),10):0;(e[A]===uB||e[A]===cB)&&A++;var a=1;(e[A]===DA||e[A]===Z)&&(e[A]===Z&&(a=-1),A++);for(var o=[];J(e[A]);)o.push(e[A++]);var Q=o.length?parseInt(S.apply(void 0,o),10):0;return t*(B+i*Math.pow(10,-s))*Math.pow(10,a*Q)},Ls={type:2},Ds={type:3},bs={type:4},xs={type:13},Ts={type:8},Ss={type:21},Os={type:9},Ms={type:10},Gs={type:11},Rs={type:12},Vs={type:14},me={type:23},Ns={type:1},Xs={type:25},_s={type:24},Js={type:26},Ps={type:27},ks={type:28},Ys={type:29},Ws={type:31},Nr={type:32},fB=function(){function e(){this._value=[]}return e.prototype.write=function(A){this._value=this._value.concat($e(A))},e.prototype.read=function(){for(var A=[],t=this.consumeToken();t!==Nr;)A.push(t),t=this.consumeToken();return A},e.prototype.consumeToken=function(){var A=this.consumeCodePoint();switch(A){case He:return this.consumeStringToken(He);case Wn:var t=this.peekCodePoint(0),r=this.peekCodePoint(1),B=this.peekCodePoint(2);if(dt(t)||UA(r,B)){var n=Ke(t,r,B)?Pn:Jn,s=this.consumeName();return{type:5,value:s,flags:n}}break;case Zn:if(this.peekCodePoint(0)===qA)return this.consumeCodePoint(),xs;break;case pe:return this.consumeStringToken(pe);case Ie:return Ls;case jA:return Ds;case cr:if(this.peekCodePoint(0)===qA)return this.consumeCodePoint(),Vs;break;case DA:if(Cr(A,this.peekCodePoint(0),this.peekCodePoint(1)))return this.reconsumeCodePoint(A),this.consumeNumericToken();break;case os:return bs;case Z:var i=A,a=this.peekCodePoint(0),o=this.peekCodePoint(1);if(Cr(i,a,o))return this.reconsumeCodePoint(A),this.consumeNumericToken();if(Ke(i,a,o))return this.reconsumeCodePoint(A),this.consumeIdentLikeToken();if(a===Z&&o===As)return this.consumeCodePoint(),this.consumeCodePoint(),_s;break;case ge:if(Cr(A,this.peekCodePoint(0),this.peekCodePoint(1)))return this.reconsumeCodePoint(A),this.consumeNumericToken();break;case Ut:if(this.peekCodePoint(0)===cr)for(this.consumeCodePoint();;){var Q=this.consumeCodePoint();if(Q===cr&&(Q=this.consumeCodePoint(),Q===Ut))return this.consumeToken();if(Q===nA)return this.consumeToken()}break;case Qs:return Js;case gs:return Ps;case $n:if(this.peekCodePoint(0)===zn&&this.peekCodePoint(1)===Z&&this.peekCodePoint(2)===Z)return this.consumeCodePoint(),this.consumeCodePoint(),Xs;break;case es:var g=this.peekCodePoint(0),w=this.peekCodePoint(1),f=this.peekCodePoint(2);if(Ke(g,w,f)){var s=this.consumeName();return{type:7,value:s}}break;case rs:return ks;case ne:if(UA(A,this.peekCodePoint(0)))return this.reconsumeCodePoint(A),this.consumeIdentLikeToken();break;case ts:return Ys;case Bs:if(this.peekCodePoint(0)===qA)return this.consumeCodePoint(),Ts;break;case ns:return Gs;case ss:return Rs;case Fs:case ds:var c=this.peekCodePoint(0),C=this.peekCodePoint(1);return c===DA&&(MA(C)||C===ve)&&(this.consumeCodePoint(),this.consumeUnicodeRangeToken()),this.reconsumeCodePoint(A),this.consumeIdentLikeToken();case Ft:if(this.peekCodePoint(0)===qA)return this.consumeCodePoint(),Os;if(this.peekCodePoint(0)===Ft)return this.consumeCodePoint(),Ss;break;case as:if(this.peekCodePoint(0)===qA)return this.consumeCodePoint(),Ms;break;case nA:return Nr}return ye(A)?(this.consumeWhiteSpace(),Ws):J(A)?(this.reconsumeCodePoint(A),this.consumeNumericToken()):_e(A)?(this.reconsumeCodePoint(A),this.consumeIdentLikeToken()):{type:6,value:S(A)}},e.prototype.consumeCodePoint=function(){var A=this._value.shift();return typeof A>"u"?-1:A},e.prototype.reconsumeCodePoint=function(A){this._value.unshift(A)},e.prototype.peekCodePoint=function(A){return A>=this._value.length?-1:this._value[A]},e.prototype.consumeUnicodeRangeToken=function(){for(var A=[],t=this.consumeCodePoint();MA(t)&&A.length<6;)A.push(t),t=this.consumeCodePoint();for(var r=!1;t===ve&&A.length<6;)A.push(t),t=this.consumeCodePoint(),r=!0;if(r){var B=parseInt(S.apply(void 0,A.map(function(a){return a===ve?gB:a})),16),n=parseInt(S.apply(void 0,A.map(function(a){return a===ve?lB:a})),16);return{type:30,start:B,end:n}}var s=parseInt(S.apply(void 0,A),16);if(this.peekCodePoint(0)===Z&&MA(this.peekCodePoint(1))){this.consumeCodePoint(),t=this.consumeCodePoint();for(var i=[];MA(t)&&i.length<6;)i.push(t),t=this.consumeCodePoint();var n=parseInt(S.apply(void 0,i),16);return{type:30,start:s,end:n}}else return{type:30,start:s,end:s}},e.prototype.consumeIdentLikeToken=function(){var A=this.consumeName();return A.toLowerCase()==="url"&&this.peekCodePoint(0)===Ie?(this.consumeCodePoint(),this.consumeUrlToken()):this.peekCodePoint(0)===Ie?(this.consumeCodePoint(),{type:19,value:A}):{type:20,value:A}},e.prototype.consumeUrlToken=function(){var A=[];if(this.consumeWhiteSpace(),this.peekCodePoint(0)===nA)return{type:22,value:""};var t=this.peekCodePoint(0);if(t===pe||t===He){var r=this.consumeStringToken(this.consumeCodePoint());return r.type===0&&(this.consumeWhiteSpace(),this.peekCodePoint(0)===nA||this.peekCodePoint(0)===jA)?(this.consumeCodePoint(),{type:22,value:r.value}):(this.consumeBadUrlRemnants(),me)}for(;;){var B=this.consumeCodePoint();if(B===nA||B===jA)return{type:22,value:S.apply(void 0,A)};if(ye(B))return this.consumeWhiteSpace(),this.peekCodePoint(0)===nA||this.peekCodePoint(0)===jA?(this.consumeCodePoint(),{type:22,value:S.apply(void 0,A)}):(this.consumeBadUrlRemnants(),me);if(B===He||B===pe||B===Ie||Ks(B))return this.consumeBadUrlRemnants(),me;if(B===ne)if(UA(B,this.peekCodePoint(0)))A.push(this.consumeEscapedCodePoint());else return this.consumeBadUrlRemnants(),me;else A.push(B)}},e.prototype.consumeWhiteSpace=function(){for(;ye(this.peekCodePoint(0));)this.consumeCodePoint()},e.prototype.consumeBadUrlRemnants=function(){for(;;){var A=this.consumeCodePoint();if(A===jA||A===nA)return;UA(A,this.peekCodePoint(0))&&this.consumeEscapedCodePoint()}},e.prototype.consumeStringSlice=function(A){for(var t=5e4,r="";A>0;){var B=Math.min(t,A);r+=S.apply(void 0,this._value.splice(0,B)),A-=B}return this._value.shift(),r},e.prototype.consumeStringToken=function(A){var t="",r=0;do{var B=this._value[r];if(B===nA||B===void 0||B===A)return t+=this.consumeStringSlice(r),{type:0,value:t};if(B===Xe)return this._value.splice(0,r),Ns;if(B===ne){var n=this._value[r+1];n!==nA&&n!==void 0&&(n===Xe?(t+=this.consumeStringSlice(r),r=-1,this._value.shift()):UA(B,n)&&(t+=this.consumeStringSlice(r),t+=S(this.consumeEscapedCodePoint()),r=-1))}r++}while(!0)},e.prototype.consumeNumber=function(){var A=[],t=ce,r=this.peekCodePoint(0);for((r===DA||r===Z)&&A.push(this.consumeCodePoint());J(this.peekCodePoint(0));)A.push(this.consumeCodePoint());r=this.peekCodePoint(0);var B=this.peekCodePoint(1);if(r===ge&&J(B))for(A.push(this.consumeCodePoint(),this.consumeCodePoint()),t=ft;J(this.peekCodePoint(0));)A.push(this.consumeCodePoint());r=this.peekCodePoint(0),B=this.peekCodePoint(1);var n=this.peekCodePoint(2);if((r===uB||r===cB)&&((B===DA||B===Z)&&J(n)||J(B)))for(A.push(this.consumeCodePoint(),this.consumeCodePoint()),t=ft;J(this.peekCodePoint(0));)A.push(this.consumeCodePoint());return[ms(A),t]},e.prototype.consumeNumericToken=function(){var A=this.consumeNumber(),t=A[0],r=A[1],B=this.peekCodePoint(0),n=this.peekCodePoint(1),s=this.peekCodePoint(2);if(Ke(B,n,s)){var i=this.consumeName();return{type:15,number:t,flags:r,unit:i}}return B===qn?(this.consumeCodePoint(),{type:16,number:t,flags:r}):{type:17,number:t,flags:r}},e.prototype.consumeEscapedCodePoint=function(){var A=this.consumeCodePoint();if(MA(A)){for(var t=S(A);MA(this.peekCodePoint(0))&&t.length<6;)t+=S(this.consumeCodePoint());ye(this.peekCodePoint(0))&&this.consumeCodePoint();var r=parseInt(t,16);return r===0||Hs(r)||r>1114111?ht:r}return A===nA?ht:A},e.prototype.consumeName=function(){for(var A="";;){var t=this.consumeCodePoint();if(dt(t))A+=S(t);else if(UA(t,this.peekCodePoint(0)))A+=S(this.consumeEscapedCodePoint());else return this.reconsumeCodePoint(t),A}},e}(),UB=function(){function e(A){this._tokens=A}return e.create=function(A){var t=new fB;return t.write(A),new e(t.read())},e.parseValue=function(A){return e.create(A).parseComponentValue()},e.parseValues=function(A){return e.create(A).parseComponentValues()},e.prototype.parseComponentValue=function(){for(var A=this.consumeToken();A.type===31;)A=this.consumeToken();if(A.type===32)throw new SyntaxError("Error parsing CSS component value, unexpected EOF");this.reconsumeToken(A);var t=this.consumeComponentValue();do A=this.consumeToken();while(A.type===31);if(A.type===32)return t;throw new SyntaxError("Error parsing CSS component value, multiple values found when expecting only one")},e.prototype.parseComponentValues=function(){for(var A=[];;){var t=this.consumeComponentValue();if(t.type===32)return A;A.push(t),A.push()}},e.prototype.consumeComponentValue=function(){var A=this.consumeToken();switch(A.type){case 11:case 28:case 2:return this.consumeSimpleBlock(A.type);case 19:return this.consumeFunction(A)}return A},e.prototype.consumeSimpleBlock=function(A){for(var t={type:A,values:[]},r=this.consumeToken();;){if(r.type===32||qs(r,A))return t;this.reconsumeToken(r),t.values.push(this.consumeComponentValue()),r=this.consumeToken()}},e.prototype.consumeFunction=function(A){for(var t={name:A.value,values:[],type:18};;){var r=this.consumeToken();if(r.type===32||r.type===3)return t;this.reconsumeToken(r),t.values.push(this.consumeComponentValue())}},e.prototype.consumeToken=function(){var A=this._tokens.shift();return typeof A>"u"?Nr:A},e.prototype.reconsumeToken=function(A){this._tokens.unshift(A)},e}(),Ce=function(e){return e.type===15},kA=function(e){return e.type===17},D=function(e){return e.type===20},Zs=function(e){return e.type===0},Xr=function(e,A){return D(e)&&e.value===A},FB=function(e){return e.type!==31},PA=function(e){return e.type!==31&&e.type!==4},sA=function(e){var A=[],t=[];return e.forEach(function(r){if(r.type===4){if(t.length===0)throw new Error("Error parsing function args, zero tokens for arg");A.push(t),t=[];return}r.type!==31&&t.push(r)}),t.length&&A.push(t),A},qs=function(e,A){return A===11&&e.type===12||A===28&&e.type===29?!0:A===2&&e.type===3},pA=function(e){return e.type===17||e.type===15},M=function(e){return e.type===16||pA(e)},hB=function(e){return e.length>1?[e[0],e[1]]:[e[0]]},X={type:17,number:0,flags:ce},$r={type:16,number:50,flags:ce},hA={type:16,number:100,flags:ce},re=function(e,A,t){var r=e[0],B=e[1];return[b(r,A),b(typeof B<"u"?B:r,t)]},b=function(e,A){if(e.type===16)return e.number/100*A;if(Ce(e))switch(e.unit){case"rem":case"em":return 16*e.number;case"px":default:return e.number}return e.number},dB="deg",EB="grad",HB="rad",pB="turn",Ar={name:"angle",parse:function(e,A){if(A.type===15)switch(A.unit){case dB:return Math.PI*A.number/180;case EB:return Math.PI/200*A.number;case HB:return A.number;case pB:return Math.PI*2*A.number}throw new Error("Unsupported angle type")}},IB=function(e){return e.type===15&&(e.unit===dB||e.unit===EB||e.unit===HB||e.unit===pB)},vB=function(e){var A=e.filter(D).map(function(t){return t.value}).join(" ");switch(A){case"to bottom right":case"to right bottom":case"left top":case"top left":return[X,X];case"to top":case"bottom":return AA(0);case"to bottom left":case"to left bottom":case"right top":case"top right":return[X,hA];case"to right":case"left":return AA(90);case"to top left":case"to left top":case"right bottom":case"bottom right":return[hA,hA];case"to bottom":case"top":return AA(180);case"to top right":case"to right top":case"left bottom":case"bottom left":return[hA,X];case"to left":case"right":return AA(270)}return 0},AA=function(e){return Math.PI*e/180},EA={name:"color",parse:function(e,A){if(A.type===18){var t=js[A.name];if(typeof t>"u")throw new Error('Attempting to parse an unsupported color function "'+A.name+'"');return t(e,A.values)}if(A.type===5){if(A.value.length===3){var r=A.value.substring(0,1),B=A.value.substring(1,2),n=A.value.substring(2,3);return dA(parseInt(r+r,16),parseInt(B+B,16),parseInt(n+n,16),1)}if(A.value.length===4){var r=A.value.substring(0,1),B=A.value.substring(1,2),n=A.value.substring(2,3),s=A.value.substring(3,4);return dA(parseInt(r+r,16),parseInt(B+B,16),parseInt(n+n,16),parseInt(s+s,16)/255)}if(A.value.length===6){var r=A.value.substring(0,2),B=A.value.substring(2,4),n=A.value.substring(4,6);return dA(parseInt(r,16),parseInt(B,16),parseInt(n,16),1)}if(A.value.length===8){var r=A.value.substring(0,2),B=A.value.substring(2,4),n=A.value.substring(4,6),s=A.value.substring(6,8);return dA(parseInt(r,16),parseInt(B,16),parseInt(n,16),parseInt(s,16)/255)}}if(A.type===20){var i=wA[A.value.toUpperCase()];if(typeof i<"u")return i}return wA.TRANSPARENT}},HA=function(e){return(255&e)===0},R=function(e){var A=255&e,t=255&e>>8,r=255&e>>16,B=255&e>>24;return A<255?"rgba("+B+","+r+","+t+","+A/255+")":"rgb("+B+","+r+","+t+")"},dA=function(e,A,t,r){return(e<<24|A<<16|t<<8|Math.round(r*255)<<0)>>>0},Et=function(e,A){if(e.type===17)return e.number;if(e.type===16){var t=A===3?1:255;return A===3?e.number/100*t:Math.round(e.number/100*t)}return 0},Ht=function(e,A){var t=A.filter(PA);if(t.length===3){var r=t.map(Et),B=r[0],n=r[1],s=r[2];return dA(B,n,s,1)}if(t.length===4){var i=t.map(Et),B=i[0],n=i[1],s=i[2],a=i[3];return dA(B,n,s,a)}return 0};function ur(e,A,t){return t<0&&(t+=1),t>=1&&(t-=1),t<1/6?(A-e)*t*6+e:t<1/2?A:t<2/3?(A-e)*6*(2/3-t)+e:e}var pt=function(e,A){var t=A.filter(PA),r=t[0],B=t[1],n=t[2],s=t[3],i=(r.type===17?AA(r.number):Ar.parse(e,r))/(Math.PI*2),a=M(B)?B.number/100:0,o=M(n)?n.number/100:0,Q=typeof s<"u"&&M(s)?b(s,1):1;if(a===0)return dA(o*255,o*255,o*255,1);var g=o<=.5?o*(a+1):o+a-o*a,w=o*2-g,f=ur(w,g,i+1/3),c=ur(w,g,i),C=ur(w,g,i-1/3);return dA(f*255,c*255,C*255,Q)},js={hsl:pt,hsla:pt,rgb:Ht,rgba:Ht},se=function(e,A){return EA.parse(e,UB.create(A).parseComponentValue())},wA={ALICEBLUE:4042850303,ANTIQUEWHITE:4209760255,AQUA:16777215,AQUAMARINE:2147472639,AZURE:4043309055,BEIGE:4126530815,BISQUE:4293182719,BLACK:255,BLANCHEDALMOND:4293643775,BLUE:65535,BLUEVIOLET:2318131967,BROWN:2771004159,BURLYWOOD:3736635391,CADETBLUE:1604231423,CHARTREUSE:2147418367,CHOCOLATE:3530104575,CORAL:4286533887,CORNFLOWERBLUE:1687547391,CORNSILK:4294499583,CRIMSON:3692313855,CYAN:16777215,DARKBLUE:35839,DARKCYAN:9145343,DARKGOLDENROD:3095837695,DARKGRAY:2846468607,DARKGREEN:6553855,DARKGREY:2846468607,DARKKHAKI:3182914559,DARKMAGENTA:2332068863,DARKOLIVEGREEN:1433087999,DARKORANGE:4287365375,DARKORCHID:2570243327,DARKRED:2332033279,DARKSALMON:3918953215,DARKSEAGREEN:2411499519,DARKSLATEBLUE:1211993087,DARKSLATEGRAY:793726975,DARKSLATEGREY:793726975,DARKTURQUOISE:13554175,DARKVIOLET:2483082239,DEEPPINK:4279538687,DEEPSKYBLUE:12582911,DIMGRAY:1768516095,DIMGREY:1768516095,DODGERBLUE:512819199,FIREBRICK:2988581631,FLORALWHITE:4294635775,FORESTGREEN:579543807,FUCHSIA:4278255615,GAINSBORO:3705462015,GHOSTWHITE:4177068031,GOLD:4292280575,GOLDENROD:3668254975,GRAY:2155905279,GREEN:8388863,GREENYELLOW:2919182335,GREY:2155905279,HONEYDEW:4043305215,HOTPINK:4285117695,INDIANRED:3445382399,INDIGO:1258324735,IVORY:4294963455,KHAKI:4041641215,LAVENDER:3873897215,LAVENDERBLUSH:4293981695,LAWNGREEN:2096890111,LEMONCHIFFON:4294626815,LIGHTBLUE:2916673279,LIGHTCORAL:4034953471,LIGHTCYAN:3774873599,LIGHTGOLDENRODYELLOW:4210742015,LIGHTGRAY:3553874943,LIGHTGREEN:2431553791,LIGHTGREY:3553874943,LIGHTPINK:4290167295,LIGHTSALMON:4288707327,LIGHTSEAGREEN:548580095,LIGHTSKYBLUE:2278488831,LIGHTSLATEGRAY:2005441023,LIGHTSLATEGREY:2005441023,LIGHTSTEELBLUE:2965692159,LIGHTYELLOW:4294959359,LIME:16711935,LIMEGREEN:852308735,LINEN:4210091775,MAGENTA:4278255615,MAROON:2147483903,MEDIUMAQUAMARINE:1724754687,MEDIUMBLUE:52735,MEDIUMORCHID:3126187007,MEDIUMPURPLE:2473647103,MEDIUMSEAGREEN:1018393087,MEDIUMSLATEBLUE:2070474495,MEDIUMSPRINGGREEN:16423679,MEDIUMTURQUOISE:1221709055,MEDIUMVIOLETRED:3340076543,MIDNIGHTBLUE:421097727,MINTCREAM:4127193855,MISTYROSE:4293190143,MOCCASIN:4293178879,NAVAJOWHITE:4292783615,NAVY:33023,OLDLACE:4260751103,OLIVE:2155872511,OLIVEDRAB:1804477439,ORANGE:4289003775,ORANGERED:4282712319,ORCHID:3664828159,PALEGOLDENROD:4008225535,PALEGREEN:2566625535,PALETURQUOISE:2951671551,PALEVIOLETRED:3681588223,PAPAYAWHIP:4293907967,PEACHPUFF:4292524543,PERU:3448061951,PINK:4290825215,PLUM:3718307327,POWDERBLUE:2967529215,PURPLE:2147516671,REBECCAPURPLE:1714657791,RED:4278190335,ROSYBROWN:3163525119,ROYALBLUE:1097458175,SADDLEBROWN:2336560127,SALMON:4202722047,SANDYBROWN:4104413439,SEAGREEN:780883967,SEASHELL:4294307583,SIENNA:2689740287,SILVER:3233857791,SKYBLUE:2278484991,SLATEBLUE:1784335871,SLATEGRAY:1887473919,SLATEGREY:1887473919,SNOW:4294638335,SPRINGGREEN:16744447,STEELBLUE:1182971135,TAN:3535047935,TEAL:8421631,THISTLE:3636451583,TOMATO:4284696575,TRANSPARENT:0,TURQUOISE:1088475391,VIOLET:4001558271,WHEAT:4125012991,WHITE:4294967295,WHITESMOKE:4126537215,YELLOW:4294902015,YELLOWGREEN:2597139199},zs={name:"background-clip",initialValue:"border-box",prefix:!1,type:1,parse:function(e,A){return A.map(function(t){if(D(t))switch(t.value){case"padding-box":return 1;case"content-box":return 2}return 0})}},$s={name:"background-color",initialValue:"transparent",prefix:!1,type:3,format:"color"},er=function(e,A){var t=EA.parse(e,A[0]),r=A[1];return r&&M(r)?{color:t,stop:r}:{color:t,stop:null}},It=function(e,A){var t=e[0],r=e[e.length-1];t.stop===null&&(t.stop=X),r.stop===null&&(r.stop=hA);for(var B=[],n=0,s=0;sn?B.push(a):B.push(n),n=a}else B.push(null)}for(var o=null,s=0;ss.optimumDistance)?{optimumCorner:i,optimumDistance:Q}:s},{optimumDistance:B?1/0:-1/0,optimumCorner:null}).optimumCorner},ra=function(e,A,t,r,B){var n=0,s=0;switch(e.size){case 0:e.shape===0?n=s=Math.min(Math.abs(A),Math.abs(A-r),Math.abs(t),Math.abs(t-B)):e.shape===1&&(n=Math.min(Math.abs(A),Math.abs(A-r)),s=Math.min(Math.abs(t),Math.abs(t-B)));break;case 2:if(e.shape===0)n=s=Math.min(rA(A,t),rA(A,t-B),rA(A-r,t),rA(A-r,t-B));else if(e.shape===1){var i=Math.min(Math.abs(t),Math.abs(t-B))/Math.min(Math.abs(A),Math.abs(A-r)),a=vt(r,B,A,t,!0),o=a[0],Q=a[1];n=rA(o-A,(Q-t)/i),s=i*n}break;case 1:e.shape===0?n=s=Math.max(Math.abs(A),Math.abs(A-r),Math.abs(t),Math.abs(t-B)):e.shape===1&&(n=Math.max(Math.abs(A),Math.abs(A-r)),s=Math.max(Math.abs(t),Math.abs(t-B)));break;case 3:if(e.shape===0)n=s=Math.max(rA(A,t),rA(A,t-B),rA(A-r,t),rA(A-r,t-B));else if(e.shape===1){var i=Math.max(Math.abs(t),Math.abs(t-B))/Math.max(Math.abs(A),Math.abs(A-r)),g=vt(r,B,A,t,!1),o=g[0],Q=g[1];n=rA(o-A,(Q-t)/i),s=i*n}break}return Array.isArray(e.size)&&(n=b(e.size[0],r),s=e.size.length===2?b(e.size[1],B):n),[n,s]},ta=function(e,A){var t=AA(180),r=[];return sA(A).forEach(function(B,n){if(n===0){var s=B[0];if(s.type===20&&s.value==="to"){t=vB(B);return}else if(IB(s)){t=Ar.parse(e,s);return}}var i=er(e,B);r.push(i)}),{angle:t,stops:r,type:1}},Le=function(e,A){var t=AA(180),r=[];return sA(A).forEach(function(B,n){if(n===0){var s=B[0];if(s.type===20&&["top","left","right","bottom"].indexOf(s.value)!==-1){t=vB(B);return}else if(IB(s)){t=(Ar.parse(e,s)+AA(270))%AA(360);return}}var i=er(e,B);r.push(i)}),{angle:t,stops:r,type:1}},Ba=function(e,A){var t=AA(180),r=[],B=1,n=0,s=3,i=[];return sA(A).forEach(function(a,o){var Q=a[0];if(o===0){if(D(Q)&&Q.value==="linear"){B=1;return}else if(D(Q)&&Q.value==="radial"){B=2;return}}if(Q.type===18){if(Q.name==="from"){var g=EA.parse(e,Q.values[0]);r.push({stop:X,color:g})}else if(Q.name==="to"){var g=EA.parse(e,Q.values[0]);r.push({stop:hA,color:g})}else if(Q.name==="color-stop"){var w=Q.values.filter(PA);if(w.length===2){var g=EA.parse(e,w[1]),f=w[0];kA(f)&&r.push({stop:{type:16,number:f.number*100,flags:f.flags},color:g})}}}}),B===1?{angle:(t+AA(180))%AA(360),stops:r,type:B}:{size:s,shape:n,stops:r,position:i,type:B}},yB="closest-side",KB="farthest-side",mB="closest-corner",LB="farthest-corner",DB="circle",bB="ellipse",xB="cover",TB="contain",na=function(e,A){var t=0,r=3,B=[],n=[];return sA(A).forEach(function(s,i){var a=!0;if(i===0){var o=!1;a=s.reduce(function(g,w){if(o)if(D(w))switch(w.value){case"center":return n.push($r),g;case"top":case"left":return n.push(X),g;case"right":case"bottom":return n.push(hA),g}else(M(w)||pA(w))&&n.push(w);else if(D(w))switch(w.value){case DB:return t=0,!1;case bB:return t=1,!1;case"at":return o=!0,!1;case yB:return r=0,!1;case xB:case KB:return r=1,!1;case TB:case mB:return r=2,!1;case LB:return r=3,!1}else if(pA(w)||M(w))return Array.isArray(r)||(r=[]),r.push(w),!1;return g},a)}if(a){var Q=er(e,s);B.push(Q)}}),{size:r,shape:t,stops:B,position:n,type:2}},De=function(e,A){var t=0,r=3,B=[],n=[];return sA(A).forEach(function(s,i){var a=!0;if(i===0?a=s.reduce(function(Q,g){if(D(g))switch(g.value){case"center":return n.push($r),!1;case"top":case"left":return n.push(X),!1;case"right":case"bottom":return n.push(hA),!1}else if(M(g)||pA(g))return n.push(g),!1;return Q},a):i===1&&(a=s.reduce(function(Q,g){if(D(g))switch(g.value){case DB:return t=0,!1;case bB:return t=1,!1;case TB:case yB:return r=0,!1;case KB:return r=1,!1;case mB:return r=2,!1;case xB:case LB:return r=3,!1}else if(pA(g)||M(g))return Array.isArray(r)||(r=[]),r.push(g),!1;return Q},a)),a){var o=er(e,s);B.push(o)}}),{size:r,shape:t,stops:B,position:n,type:2}},sa=function(e){return e.type===1},aa=function(e){return e.type===2},At={name:"image",parse:function(e,A){if(A.type===22){var t={url:A.value,type:0};return e.cache.addImage(A.value),t}if(A.type===18){var r=SB[A.name];if(typeof r>"u")throw new Error('Attempting to parse an unsupported image function "'+A.name+'"');return r(e,A.values)}throw new Error("Unsupported image type "+A.type)}};function ia(e){return!(e.type===20&&e.value==="none")&&(e.type!==18||!!SB[e.name])}var SB={"linear-gradient":ta,"-moz-linear-gradient":Le,"-ms-linear-gradient":Le,"-o-linear-gradient":Le,"-webkit-linear-gradient":Le,"radial-gradient":na,"-moz-radial-gradient":De,"-ms-radial-gradient":De,"-o-radial-gradient":De,"-webkit-radial-gradient":De,"-webkit-gradient":Ba},oa={name:"background-image",initialValue:"none",type:1,prefix:!1,parse:function(e,A){if(A.length===0)return[];var t=A[0];return t.type===20&&t.value==="none"?[]:A.filter(function(r){return PA(r)&&ia(r)}).map(function(r){return At.parse(e,r)})}},Qa={name:"background-origin",initialValue:"border-box",prefix:!1,type:1,parse:function(e,A){return A.map(function(t){if(D(t))switch(t.value){case"padding-box":return 1;case"content-box":return 2}return 0})}},ga={name:"background-position",initialValue:"0% 0%",type:1,prefix:!1,parse:function(e,A){return sA(A).map(function(t){return t.filter(M)}).map(hB)}},wa={name:"background-repeat",initialValue:"repeat",prefix:!1,type:1,parse:function(e,A){return sA(A).map(function(t){return t.filter(D).map(function(r){return r.value}).join(" ")}).map(ca)}},ca=function(e){switch(e){case"no-repeat":return 1;case"repeat-x":case"repeat no-repeat":return 2;case"repeat-y":case"no-repeat repeat":return 3;case"repeat":default:return 0}},JA;(function(e){e.AUTO="auto",e.CONTAIN="contain",e.COVER="cover"})(JA||(JA={}));var Ca={name:"background-size",initialValue:"0",prefix:!1,type:1,parse:function(e,A){return sA(A).map(function(t){return t.filter(ua)})}},ua=function(e){return D(e)||M(e)},rr=function(e){return{name:"border-"+e+"-color",initialValue:"transparent",prefix:!1,type:3,format:"color"}},la=rr("top"),fa=rr("right"),Ua=rr("bottom"),Fa=rr("left"),tr=function(e){return{name:"border-radius-"+e,initialValue:"0 0",prefix:!1,type:1,parse:function(A,t){return hB(t.filter(M))}}},ha=tr("top-left"),da=tr("top-right"),Ea=tr("bottom-right"),Ha=tr("bottom-left"),Br=function(e){return{name:"border-"+e+"-style",initialValue:"solid",prefix:!1,type:2,parse:function(A,t){switch(t){case"none":return 0;case"dashed":return 2;case"dotted":return 3;case"double":return 4}return 1}}},pa=Br("top"),Ia=Br("right"),va=Br("bottom"),ya=Br("left"),nr=function(e){return{name:"border-"+e+"-width",initialValue:"0",type:0,prefix:!1,parse:function(A,t){return Ce(t)?t.number:0}}},Ka=nr("top"),ma=nr("right"),La=nr("bottom"),Da=nr("left"),ba={name:"color",initialValue:"transparent",prefix:!1,type:3,format:"color"},xa={name:"direction",initialValue:"ltr",prefix:!1,type:2,parse:function(e,A){switch(A){case"rtl":return 1;case"ltr":default:return 0}}},Ta={name:"display",initialValue:"inline-block",prefix:!1,type:1,parse:function(e,A){return A.filter(D).reduce(function(t,r){return t|Sa(r.value)},0)}},Sa=function(e){switch(e){case"block":case"-webkit-box":return 2;case"inline":return 4;case"run-in":return 8;case"flow":return 16;case"flow-root":return 32;case"table":return 64;case"flex":case"-webkit-flex":return 128;case"grid":case"-ms-grid":return 256;case"ruby":return 512;case"subgrid":return 1024;case"list-item":return 2048;case"table-row-group":return 4096;case"table-header-group":return 8192;case"table-footer-group":return 16384;case"table-row":return 32768;case"table-cell":return 65536;case"table-column-group":return 131072;case"table-column":return 262144;case"table-caption":return 524288;case"ruby-base":return 1048576;case"ruby-text":return 2097152;case"ruby-base-container":return 4194304;case"ruby-text-container":return 8388608;case"contents":return 16777216;case"inline-block":return 33554432;case"inline-list-item":return 67108864;case"inline-table":return 134217728;case"inline-flex":return 268435456;case"inline-grid":return 536870912}return 0},Oa={name:"float",initialValue:"none",prefix:!1,type:2,parse:function(e,A){switch(A){case"left":return 1;case"right":return 2;case"inline-start":return 3;case"inline-end":return 4}return 0}},Ma={name:"letter-spacing",initialValue:"0",prefix:!1,type:0,parse:function(e,A){return A.type===20&&A.value==="normal"?0:A.type===17||A.type===15?A.number:0}},Je;(function(e){e.NORMAL="normal",e.STRICT="strict"})(Je||(Je={}));var Ga={name:"line-break",initialValue:"normal",prefix:!1,type:2,parse:function(e,A){switch(A){case"strict":return Je.STRICT;case"normal":default:return Je.NORMAL}}},Ra={name:"line-height",initialValue:"normal",prefix:!1,type:4},yt=function(e,A){return D(e)&&e.value==="normal"?1.2*A:e.type===17?A*e.number:M(e)?b(e,A):A},Va={name:"list-style-image",initialValue:"none",type:0,prefix:!1,parse:function(e,A){return A.type===20&&A.value==="none"?null:At.parse(e,A)}},Na={name:"list-style-position",initialValue:"outside",prefix:!1,type:2,parse:function(e,A){switch(A){case"inside":return 0;case"outside":default:return 1}}},_r={name:"list-style-type",initialValue:"none",prefix:!1,type:2,parse:function(e,A){switch(A){case"disc":return 0;case"circle":return 1;case"square":return 2;case"decimal":return 3;case"cjk-decimal":return 4;case"decimal-leading-zero":return 5;case"lower-roman":return 6;case"upper-roman":return 7;case"lower-greek":return 8;case"lower-alpha":return 9;case"upper-alpha":return 10;case"arabic-indic":return 11;case"armenian":return 12;case"bengali":return 13;case"cambodian":return 14;case"cjk-earthly-branch":return 15;case"cjk-heavenly-stem":return 16;case"cjk-ideographic":return 17;case"devanagari":return 18;case"ethiopic-numeric":return 19;case"georgian":return 20;case"gujarati":return 21;case"gurmukhi":return 22;case"hebrew":return 22;case"hiragana":return 23;case"hiragana-iroha":return 24;case"japanese-formal":return 25;case"japanese-informal":return 26;case"kannada":return 27;case"katakana":return 28;case"katakana-iroha":return 29;case"khmer":return 30;case"korean-hangul-formal":return 31;case"korean-hanja-formal":return 32;case"korean-hanja-informal":return 33;case"lao":return 34;case"lower-armenian":return 35;case"malayalam":return 36;case"mongolian":return 37;case"myanmar":return 38;case"oriya":return 39;case"persian":return 40;case"simp-chinese-formal":return 41;case"simp-chinese-informal":return 42;case"tamil":return 43;case"telugu":return 44;case"thai":return 45;case"tibetan":return 46;case"trad-chinese-formal":return 47;case"trad-chinese-informal":return 48;case"upper-armenian":return 49;case"disclosure-open":return 50;case"disclosure-closed":return 51;case"none":default:return-1}}},sr=function(e){return{name:"margin-"+e,initialValue:"0",prefix:!1,type:4}},Xa=sr("top"),_a=sr("right"),Ja=sr("bottom"),Pa=sr("left"),ka={name:"overflow",initialValue:"visible",prefix:!1,type:1,parse:function(e,A){return A.filter(D).map(function(t){switch(t.value){case"hidden":return 1;case"scroll":return 2;case"clip":return 3;case"auto":return 4;case"visible":default:return 0}})}},Ya={name:"overflow-wrap",initialValue:"normal",prefix:!1,type:2,parse:function(e,A){switch(A){case"break-word":return"break-word";case"normal":default:return"normal"}}},ar=function(e){return{name:"padding-"+e,initialValue:"0",prefix:!1,type:3,format:"length-percentage"}},Wa=ar("top"),Za=ar("right"),qa=ar("bottom"),ja=ar("left"),za={name:"text-align",initialValue:"left",prefix:!1,type:2,parse:function(e,A){switch(A){case"right":return 2;case"center":case"justify":return 1;case"left":default:return 0}}},$a={name:"position",initialValue:"static",prefix:!1,type:2,parse:function(e,A){switch(A){case"relative":return 1;case"absolute":return 2;case"fixed":return 3;case"sticky":return 4}return 0}},Ai={name:"text-shadow",initialValue:"none",type:1,prefix:!1,parse:function(e,A){return A.length===1&&Xr(A[0],"none")?[]:sA(A).map(function(t){for(var r={color:wA.TRANSPARENT,offsetX:X,offsetY:X,blur:X},B=0,n=0;n"u")throw new Error('Attempting to parse an unsupported transform function "'+A.name+'"');return t(A.values)}return null}},ti=function(e){var A=e.filter(function(t){return t.type===17}).map(function(t){return t.number});return A.length===6?A:null},Bi=function(e){var A=e.filter(function(a){return a.type===17}).map(function(a){return a.number}),t=A[0],r=A[1];A[2],A[3];var B=A[4],n=A[5];A[6],A[7],A[8],A[9],A[10],A[11];var s=A[12],i=A[13];return A[14],A[15],A.length===16?[t,r,B,n,s,i]:null},ni={matrix:ti,matrix3d:Bi},Kt={type:16,number:50,flags:ce},si=[Kt,Kt],ai={name:"transform-origin",initialValue:"50% 50%",prefix:!0,type:1,parse:function(e,A){var t=A.filter(M);return t.length!==2?si:[t[0],t[1]]}},ii={name:"visible",initialValue:"none",prefix:!1,type:2,parse:function(e,A){switch(A){case"hidden":return 1;case"collapse":return 2;case"visible":default:return 0}}},ae;(function(e){e.NORMAL="normal",e.BREAK_ALL="break-all",e.KEEP_ALL="keep-all"})(ae||(ae={}));var oi={name:"word-break",initialValue:"normal",prefix:!1,type:2,parse:function(e,A){switch(A){case"break-all":return ae.BREAK_ALL;case"keep-all":return ae.KEEP_ALL;case"normal":default:return ae.NORMAL}}},Qi={name:"z-index",initialValue:"auto",prefix:!1,type:0,parse:function(e,A){if(A.type===20)return{auto:!0,order:0};if(kA(A))return{auto:!1,order:A.number};throw new Error("Invalid z-index number parsed")}},OB={name:"time",parse:function(e,A){if(A.type===15)switch(A.unit.toLowerCase()){case"s":return 1e3*A.number;case"ms":return A.number}throw new Error("Unsupported time type")}},gi={name:"opacity",initialValue:"1",type:0,prefix:!1,parse:function(e,A){return kA(A)?A.number:1}},wi={name:"text-decoration-color",initialValue:"transparent",prefix:!1,type:3,format:"color"},ci={name:"text-decoration-line",initialValue:"none",prefix:!1,type:1,parse:function(e,A){return A.filter(D).map(function(t){switch(t.value){case"underline":return 1;case"overline":return 2;case"line-through":return 3;case"none":return 4}return 0}).filter(function(t){return t!==0})}},Ci={name:"font-family",initialValue:"",prefix:!1,type:1,parse:function(e,A){var t=[],r=[];return A.forEach(function(B){switch(B.type){case 20:case 0:t.push(B.value);break;case 17:t.push(B.number.toString());break;case 4:r.push(t.join(" ")),t.length=0;break}}),t.length&&r.push(t.join(" ")),r.map(function(B){return B.indexOf(" ")===-1?B:"'"+B+"'"})}},ui={name:"font-size",initialValue:"0",prefix:!1,type:3,format:"length"},li={name:"font-weight",initialValue:"normal",type:0,prefix:!1,parse:function(e,A){if(kA(A))return A.number;if(D(A))switch(A.value){case"bold":return 700;case"normal":default:return 400}return 400}},fi={name:"font-variant",initialValue:"none",type:1,prefix:!1,parse:function(e,A){return A.filter(D).map(function(t){return t.value})}},Ui={name:"font-style",initialValue:"normal",prefix:!1,type:2,parse:function(e,A){switch(A){case"oblique":return"oblique";case"italic":return"italic";case"normal":default:return"normal"}}},G=function(e,A){return(e&A)!==0},Fi={name:"content",initialValue:"none",type:1,prefix:!1,parse:function(e,A){if(A.length===0)return[];var t=A[0];return t.type===20&&t.value==="none"?[]:A}},hi={name:"counter-increment",initialValue:"none",prefix:!0,type:1,parse:function(e,A){if(A.length===0)return null;var t=A[0];if(t.type===20&&t.value==="none")return null;for(var r=[],B=A.filter(FB),n=0;n1?1:0],this.overflowWrap=U(A,Ya,t.overflowWrap),this.paddingTop=U(A,Wa,t.paddingTop),this.paddingRight=U(A,Za,t.paddingRight),this.paddingBottom=U(A,qa,t.paddingBottom),this.paddingLeft=U(A,ja,t.paddingLeft),this.paintOrder=U(A,Ii,t.paintOrder),this.position=U(A,$a,t.position),this.textAlign=U(A,za,t.textAlign),this.textDecorationColor=U(A,wi,(r=t.textDecorationColor)!==null&&r!==void 0?r:t.color),this.textDecorationLine=U(A,ci,(B=t.textDecorationLine)!==null&&B!==void 0?B:t.textDecoration),this.textShadow=U(A,Ai,t.textShadow),this.textTransform=U(A,ei,t.textTransform),this.transform=U(A,ri,t.transform),this.transformOrigin=U(A,ai,t.transformOrigin),this.visibility=U(A,ii,t.visibility),this.webkitTextStrokeColor=U(A,vi,t.webkitTextStrokeColor),this.webkitTextStrokeWidth=U(A,yi,t.webkitTextStrokeWidth),this.wordBreak=U(A,oi,t.wordBreak),this.zIndex=U(A,Qi,t.zIndex)}return e.prototype.isVisible=function(){return this.display>0&&this.opacity>0&&this.visibility===0},e.prototype.isTransparent=function(){return HA(this.backgroundColor)},e.prototype.isTransformed=function(){return this.transform!==null},e.prototype.isPositioned=function(){return this.position!==0},e.prototype.isPositionedWithZIndex=function(){return this.isPositioned()&&!this.zIndex.auto},e.prototype.isFloating=function(){return this.float!==0},e.prototype.isInlineLevel=function(){return G(this.display,4)||G(this.display,33554432)||G(this.display,268435456)||G(this.display,536870912)||G(this.display,67108864)||G(this.display,134217728)},e}(),mi=function(){function e(A,t){this.content=U(A,Fi,t.content),this.quotes=U(A,Hi,t.quotes)}return e}(),Lt=function(){function e(A,t){this.counterIncrement=U(A,hi,t.counterIncrement),this.counterReset=U(A,di,t.counterReset)}return e}(),U=function(e,A,t){var r=new fB,B=t!==null&&typeof t<"u"?t.toString():A.initialValue;r.write(B);var n=new UB(r.read());switch(A.type){case 2:var s=n.parseComponentValue();return A.parse(e,D(s)?s.value:A.initialValue);case 0:return A.parse(e,n.parseComponentValue());case 1:return A.parse(e,n.parseComponentValues());case 4:return n.parseComponentValue();case 3:switch(A.format){case"angle":return Ar.parse(e,n.parseComponentValue());case"color":return EA.parse(e,n.parseComponentValue());case"image":return At.parse(e,n.parseComponentValue());case"length":var i=n.parseComponentValue();return pA(i)?i:X;case"length-percentage":var a=n.parseComponentValue();return M(a)?a:X;case"time":return OB.parse(e,n.parseComponentValue())}break}},Li="data-html2canvas-debug",Di=function(e){var A=e.getAttribute(Li);switch(A){case"all":return 1;case"clone":return 2;case"parse":return 3;case"render":return 4;default:return 0}},Jr=function(e,A){var t=Di(e);return t===1||A===t},aA=function(){function e(A,t){if(this.context=A,this.textNodes=[],this.elements=[],this.flags=0,Jr(t,3))debugger;this.styles=new Ki(A,window.getComputedStyle(t,null)),Yr(t)&&(this.styles.animationDuration.some(function(r){return r>0})&&(t.style.animationDuration="0s"),this.styles.transform!==null&&(t.style.transform="none")),this.bounds=ze(this.context,t),Jr(t,4)&&(this.flags|=16)}return e}(),bi="AAAAAAAAAAAAEA4AGBkAAFAaAAACAAAAAAAIABAAGAAwADgACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAAQABIAEQATAAIABAACAAQAAgAEAAIABAAVABcAAgAEAAIABAACAAQAGAAaABwAHgAgACIAI4AlgAIABAAmwCjAKgAsAC2AL4AvQDFAMoA0gBPAVYBWgEIAAgACACMANoAYgFkAWwBdAF8AX0BhQGNAZUBlgGeAaMBlQGWAasBswF8AbsBwwF0AcsBYwHTAQgA2wG/AOMBdAF8AekB8QF0AfkB+wHiAHQBfAEIAAMC5gQIAAsCEgIIAAgAFgIeAggAIgIpAggAMQI5AkACygEIAAgASAJQAlgCYAIIAAgACAAKBQoFCgUTBRMFGQUrBSsFCAAIAAgACAAIAAgACAAIAAgACABdAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABoAmgCrwGvAQgAbgJ2AggAHgEIAAgACADnAXsCCAAIAAgAgwIIAAgACAAIAAgACACKAggAkQKZAggAPADJAAgAoQKkAqwCsgK6AsICCADJAggA0AIIAAgACAAIANYC3gIIAAgACAAIAAgACABAAOYCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAkASoB+QIEAAgACAA8AEMCCABCBQgACABJBVAFCAAIAAgACAAIAAgACAAIAAgACABTBVoFCAAIAFoFCABfBWUFCAAIAAgACAAIAAgAbQUIAAgACAAIAAgACABzBXsFfQWFBYoFigWKBZEFigWKBYoFmAWfBaYFrgWxBbkFCAAIAAgACAAIAAgACAAIAAgACAAIAMEFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAMgFCADQBQgACAAIAAgACAAIAAgACAAIAAgACAAIAO4CCAAIAAgAiQAIAAgACABAAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAD0AggACAD8AggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIANYFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAMDvwAIAAgAJAIIAAgACAAIAAgACAAIAAgACwMTAwgACAB9BOsEGwMjAwgAKwMyAwsFYgE3A/MEPwMIAEUDTQNRAwgAWQOsAGEDCAAIAAgACAAIAAgACABpAzQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFIQUoBSwFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABtAwgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABMAEwACAAIAAgACAAIABgACAAIAAgACAC/AAgACAAyAQgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACAAIAAwAAgACAAIAAgACAAIAAgACAAIAAAARABIAAgACAAIABQASAAIAAgAIABwAEAAjgCIABsAqAC2AL0AigDQAtwC+IJIQqVAZUBWQqVAZUBlQGVAZUBlQGrC5UBlQGVAZUBlQGVAZUBlQGVAXsKlQGVAbAK6wsrDGUMpQzlDJUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAfAKAAuZA64AtwCJALoC6ADwAAgAuACgA/oEpgO6AqsD+AAIAAgAswMIAAgACAAIAIkAuwP5AfsBwwPLAwgACAAIAAgACADRA9kDCAAIAOED6QMIAAgACAAIAAgACADuA/YDCAAIAP4DyQAIAAgABgQIAAgAXQAOBAgACAAIAAgACAAIABMECAAIAAgACAAIAAgACAD8AAQBCAAIAAgAGgQiBCoECAExBAgAEAEIAAgACAAIAAgACAAIAAgACAAIAAgACAA4BAgACABABEYECAAIAAgATAQYAQgAVAQIAAgACAAIAAgACAAIAAgACAAIAFoECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAOQEIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAB+BAcACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEABhgSMBAgACAAIAAgAlAQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAwAEAAQABAADAAMAAwADAAQABAAEAAQABAAEAAQABHATAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAdQMIAAgACAAIAAgACAAIAMkACAAIAAgAfQMIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACFA4kDCAAIAAgACAAIAOcBCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAIcDCAAIAAgACAAIAAgACAAIAAgACAAIAJEDCAAIAAgACADFAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABgBAgAZgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAbAQCBXIECAAIAHkECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAJwEQACjBKoEsgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAC6BMIECAAIAAgACAAIAAgACABmBAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAxwQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAGYECAAIAAgAzgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBd0FXwUIAOIF6gXxBYoF3gT5BQAGCAaKBYoFigWKBYoFigWKBYoFigWKBYoFigXWBIoFigWKBYoFigWKBYoFigWKBYsFEAaKBYoFigWKBYoFigWKBRQGCACKBYoFigWKBQgACAAIANEECAAIABgGigUgBggAJgYIAC4GMwaKBYoF0wQ3Bj4GigWKBYoFigWKBYoFigWKBYoFigWKBYoFigUIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWLBf///////wQABAAEAAQABAAEAAQABAAEAAQAAwAEAAQAAgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAQADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUAAAAFAAUAAAAFAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAQAAAAUABQAFAAUABQAFAAAAAAAFAAUAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAFAAUAAQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAAABwAHAAcAAAAHAAcABwAFAAEAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAcABwAFAAUAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQABAAAAAAAAAAAAAAAFAAUABQAFAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAHAAcAAAAHAAcAAAAAAAUABQAHAAUAAQAHAAEABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwABAAUABQAFAAUAAAAAAAAAAAAAAAEAAQABAAEAAQABAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABQANAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAABQAHAAUABQAFAAAAAAAAAAcABQAFAAUABQAFAAQABAAEAAQABAAEAAQABAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUAAAAFAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAUAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAcABwAFAAcABwAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUABwAHAAUABQAFAAUAAAAAAAcABwAAAAAABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAAAAAAAAAAABQAFAAAAAAAFAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAFAAUABQAFAAUAAAAFAAUABwAAAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABwAFAAUABQAFAAAAAAAHAAcAAAAAAAcABwAFAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAAAAAAAAAHAAcABwAAAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAUABQAFAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAHAAcABQAHAAcAAAAFAAcABwAAAAcABwAFAAUAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAFAAcABwAFAAUABQAAAAUAAAAHAAcABwAHAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAHAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAUAAAAFAAUAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABwAFAAUABQAFAAUABQAAAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABQAFAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAFAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAHAAUABQAFAAUABQAFAAUABwAHAAcABwAHAAcABwAHAAUABwAHAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABwAHAAcABwAFAAUABwAHAAcAAAAAAAAAAAAHAAcABQAHAAcABwAHAAcABwAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAUABQAFAAUABQAFAAUAAAAFAAAABQAAAAAABQAFAAUABQAFAAUABQAFAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAUABQAFAAUABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABwAFAAcABwAHAAcABwAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAUABQAFAAUABwAHAAUABQAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABQAFAAcABwAHAAUABwAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAcABQAFAAUABQAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAAAAAABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAUABQAHAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAFAAUABQAFAAcABwAFAAUABwAHAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAcABwAFAAUABwAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABQAAAAAABQAFAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAcABwAAAAAAAAAAAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAcABwAFAAcABwAAAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAFAAUABQAAAAUABQAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABwAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAHAAcABQAHAAUABQAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAAABwAHAAAAAAAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAFAAUABwAFAAcABwAFAAcABQAFAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAAAAAABwAHAAcABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAFAAcABwAFAAUABQAFAAUABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAUABQAFAAcABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABQAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAAAAAAFAAUABwAHAAcABwAFAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAHAAUABQAFAAUABQAFAAUABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAABQAAAAUABQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAHAAcAAAAFAAUAAAAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABQAFAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAABQAFAAUABQAFAAUABQAAAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAFAAUABQAFAAUADgAOAA4ADgAOAA4ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAMAAwADAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAAAAAAAAAAAAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAAAAAAAAAAAAsADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwACwAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAADgAOAA4AAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAAAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4AAAAOAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAAAAAAAAAAAA4AAAAOAAAAAAAAAAAADgAOAA4AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAA=",Dt="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",te=typeof Uint8Array>"u"?[]:new Uint8Array(256);for(var be=0;be>4,Q[B++]=(s&15)<<4|i>>2,Q[B++]=(i&3)<<6|a&63;return o},Ti=function(e){for(var A=e.length,t=[],r=0;r>xA,Mi=1<>xA,Ri=MB+Gi,Vi=Ri,Ni=32,Xi=Vi+Ni,_i=65536>>et,Ji=1<=0){if(A<55296||A>56319&&A<=65535)return t=this.index[A>>xA],t=(t<>xA)],t=(t<>et),t=this.index[t],t+=A>>xA&Pi,t=this.index[t],t=(t<"u"?[]:new Uint8Array(256);for(var xe=0;xe=55296&&B<=56319&&t>10)+55296,s%1024+56320)),(B+1===t||r.length>16384)&&(n+=String.fromCharCode.apply(String,r),r.length=0)}return n},Ao=Yi(bi),z="×",Hr="÷",eo=function(e){return Ao.get(e)},ro=function(e,A,t){var r=t-2,B=A[r],n=A[t-1],s=A[t];if(n===Ur&&s===Fr)return z;if(n===Ur||n===Fr||n===Tt||s===Ur||s===Fr||s===Tt)return Hr;if(n===Ot&&[Ot,hr,Mt,Gt].indexOf(s)!==-1||(n===Mt||n===hr)&&(s===hr||s===dr)||(n===Gt||n===dr)&&s===dr||s===Rt||s===St||s===ji||n===qi)return z;if(n===Rt&&s===Vt){for(;B===St;)B=A[--r];if(B===Vt)return z}if(n===Er&&s===Er){for(var i=0;B===Er;)i++,B=A[--r];if(i%2===0)return z}return Hr},to=function(e){var A=zi(e),t=A.length,r=0,B=0,n=A.map(eo);return{next:function(){if(r>=t)return{done:!0,value:null};for(var s=z;rs.x||Q.y>s.y;return s=Q,o===0?!0:g});return e.body.removeChild(A),i},ao=function(){return typeof new Image().crossOrigin<"u"},io=function(){return typeof new XMLHttpRequest().responseType=="string"},oo=function(e){var A=new Image,t=e.createElement("canvas"),r=t.getContext("2d");if(!r)return!1;A.src="data:image/svg+xml,";try{r.drawImage(A,0,0),t.toDataURL()}catch{return!1}return!0},Nt=function(e){return e[0]===0&&e[1]===255&&e[2]===0&&e[3]===255},Qo=function(e){var A=e.createElement("canvas"),t=100;A.width=t,A.height=t;var r=A.getContext("2d");if(!r)return Promise.reject(!1);r.fillStyle="rgb(0, 255, 0)",r.fillRect(0,0,t,t);var B=new Image,n=A.toDataURL();B.src=n;var s=Pr(t,t,0,0,B);return r.fillStyle="red",r.fillRect(0,0,t,t),Xt(s).then(function(i){r.drawImage(i,0,0);var a=r.getImageData(0,0,t,t).data;r.fillStyle="red",r.fillRect(0,0,t,t);var o=e.createElement("div");return o.style.backgroundImage="url("+n+")",o.style.height=t+"px",Nt(a)?Xt(Pr(t,t,0,0,o)):Promise.reject(!1)}).then(function(i){return r.drawImage(i,0,0),Nt(r.getImageData(0,0,t,t).data)}).catch(function(){return!1})},Pr=function(e,A,t,r,B){var n="http://www.w3.org/2000/svg",s=document.createElementNS(n,"svg"),i=document.createElementNS(n,"foreignObject");return s.setAttributeNS(null,"width",e.toString()),s.setAttributeNS(null,"height",A.toString()),i.setAttributeNS(null,"width","100%"),i.setAttributeNS(null,"height","100%"),i.setAttributeNS(null,"x",t.toString()),i.setAttributeNS(null,"y",r.toString()),i.setAttributeNS(null,"externalResourcesRequired","true"),s.appendChild(i),i.appendChild(B),s},Xt=function(e){return new Promise(function(A,t){var r=new Image;r.onload=function(){return A(r)},r.onerror=t,r.src="data:image/svg+xml;charset=utf-8,"+encodeURIComponent(new XMLSerializer().serializeToString(e))})},N={get SUPPORT_RANGE_BOUNDS(){var e=no(document);return Object.defineProperty(N,"SUPPORT_RANGE_BOUNDS",{value:e}),e},get SUPPORT_WORD_BREAKING(){var e=N.SUPPORT_RANGE_BOUNDS&&so(document);return Object.defineProperty(N,"SUPPORT_WORD_BREAKING",{value:e}),e},get SUPPORT_SVG_DRAWING(){var e=oo(document);return Object.defineProperty(N,"SUPPORT_SVG_DRAWING",{value:e}),e},get SUPPORT_FOREIGNOBJECT_DRAWING(){var e=typeof Array.from=="function"&&typeof window.fetch=="function"?Qo(document):Promise.resolve(!1);return Object.defineProperty(N,"SUPPORT_FOREIGNOBJECT_DRAWING",{value:e}),e},get SUPPORT_CORS_IMAGES(){var e=ao();return Object.defineProperty(N,"SUPPORT_CORS_IMAGES",{value:e}),e},get SUPPORT_RESPONSE_TYPE(){var e=io();return Object.defineProperty(N,"SUPPORT_RESPONSE_TYPE",{value:e}),e},get SUPPORT_CORS_XHR(){var e="withCredentials"in new XMLHttpRequest;return Object.defineProperty(N,"SUPPORT_CORS_XHR",{value:e}),e},get SUPPORT_NATIVE_TEXT_SEGMENTATION(){var e=!!(typeof Intl<"u"&&Intl.Segmenter);return Object.defineProperty(N,"SUPPORT_NATIVE_TEXT_SEGMENTATION",{value:e}),e}},ie=function(){function e(A,t){this.text=A,this.bounds=t}return e}(),go=function(e,A,t,r){var B=Co(A,t),n=[],s=0;return B.forEach(function(i){if(t.textDecorationLine.length||i.trim().length>0)if(N.SUPPORT_RANGE_BOUNDS){var a=_t(r,s,i.length).getClientRects();if(a.length>1){var o=rt(i),Q=0;o.forEach(function(w){n.push(new ie(w,cA.fromDOMRectList(e,_t(r,Q+s,w.length).getClientRects()))),Q+=w.length})}else n.push(new ie(i,cA.fromDOMRectList(e,a)))}else{var g=r.splitText(i.length);n.push(new ie(i,wo(e,r))),r=g}else N.SUPPORT_RANGE_BOUNDS||(r=r.splitText(i.length));s+=i.length}),n},wo=function(e,A){var t=A.ownerDocument;if(t){var r=t.createElement("html2canvaswrapper");r.appendChild(A.cloneNode(!0));var B=A.parentNode;if(B){B.replaceChild(r,A);var n=ze(e,r);return r.firstChild&&B.replaceChild(r.firstChild,r),n}}return cA.EMPTY},_t=function(e,A,t){var r=e.ownerDocument;if(!r)throw new Error("Node has no owner document");var B=r.createRange();return B.setStart(e,A),B.setEnd(e,A+t),B},rt=function(e){if(N.SUPPORT_NATIVE_TEXT_SEGMENTATION){var A=new Intl.Segmenter(void 0,{granularity:"grapheme"});return Array.from(A.segment(e)).map(function(t){return t.segment})}return Bo(e)},co=function(e,A){if(N.SUPPORT_NATIVE_TEXT_SEGMENTATION){var t=new Intl.Segmenter(void 0,{granularity:"word"});return Array.from(t.segment(e)).map(function(r){return r.segment})}return lo(e,A)},Co=function(e,A){return A.letterSpacing!==0?rt(e):co(e,A)},uo=[32,160,4961,65792,65793,4153,4241],lo=function(e,A){for(var t=_n(e,{lineBreak:A.lineBreak,wordBreak:A.overflowWrap==="break-word"?"break-word":A.wordBreak}),r=[],B,n=function(){if(B.value){var s=B.value.slice(),i=$e(s),a="";i.forEach(function(o){uo.indexOf(o)===-1?a+=S(o):(a.length&&r.push(a),r.push(S(o)),a="")}),a.length&&r.push(a)}};!(B=t.next()).done;)n();return r},fo=function(){function e(A,t,r){this.text=Uo(t.data,r.textTransform),this.textBounds=go(A,this.text,r,t)}return e}(),Uo=function(e,A){switch(A){case 1:return e.toLowerCase();case 3:return e.replace(Fo,ho);case 2:return e.toUpperCase();default:return e}},Fo=/(^|\s|:|-|\(|\))([a-z])/g,ho=function(e,A,t){return e.length>0?A+t.toUpperCase():e},GB=function(e){tA(A,e);function A(t,r){var B=e.call(this,t,r)||this;return B.src=r.currentSrc||r.src,B.intrinsicWidth=r.naturalWidth,B.intrinsicHeight=r.naturalHeight,B.context.cache.addImage(B.src),B}return A}(aA),RB=function(e){tA(A,e);function A(t,r){var B=e.call(this,t,r)||this;return B.canvas=r,B.intrinsicWidth=r.width,B.intrinsicHeight=r.height,B}return A}(aA),VB=function(e){tA(A,e);function A(t,r){var B=e.call(this,t,r)||this,n=new XMLSerializer,s=ze(t,r);return r.setAttribute("width",s.width+"px"),r.setAttribute("height",s.height+"px"),B.svg="data:image/svg+xml,"+encodeURIComponent(n.serializeToString(r)),B.intrinsicWidth=r.width.baseVal.value,B.intrinsicHeight=r.height.baseVal.value,B.context.cache.addImage(B.svg),B}return A}(aA),NB=function(e){tA(A,e);function A(t,r){var B=e.call(this,t,r)||this;return B.value=r.value,B}return A}(aA),kr=function(e){tA(A,e);function A(t,r){var B=e.call(this,t,r)||this;return B.start=r.start,B.reversed=typeof r.reversed=="boolean"&&r.reversed===!0,B}return A}(aA),Eo=[{type:15,flags:0,unit:"px",number:3}],Ho=[{type:16,flags:0,number:50}],po=function(e){return e.width>e.height?new cA(e.left+(e.width-e.height)/2,e.top,e.height,e.height):e.width0)t.textNodes.push(new fo(e,B,t.styles));else if(_A(B))if(jB(B)&&B.assignedNodes)B.assignedNodes().forEach(function(i){return Ve(e,i,t,r)});else{var s=PB(e,B);s.styles.isVisible()&&(Ko(B,s,r)?s.flags|=4:mo(s.styles)&&(s.flags|=2),yo.indexOf(B.tagName)!==-1&&(s.flags|=8),t.elements.push(s),B.slot,B.shadowRoot?Ve(e,B.shadowRoot,s,r):!Ye(B)&&!WB(B)&&!We(B)&&Ve(e,B,s,r))}},PB=function(e,A){return Wr(A)?new GB(e,A):ZB(A)?new RB(e,A):WB(A)?new VB(e,A):Lo(A)?new NB(e,A):Do(A)?new kr(e,A):bo(A)?new tt(e,A):We(A)?new XB(e,A):Ye(A)?new _B(e,A):qB(A)?new JB(e,A):new aA(e,A)},kB=function(e,A){var t=PB(e,A);return t.flags|=4,Ve(e,A,t,t),t},Ko=function(e,A,t){return A.styles.isPositionedWithZIndex()||A.styles.opacity<1||A.styles.isTransformed()||Bt(e)&&t.styles.isTransparent()},mo=function(e){return e.isPositioned()||e.isFloating()},YB=function(e){return e.nodeType===Node.TEXT_NODE},_A=function(e){return e.nodeType===Node.ELEMENT_NODE},Yr=function(e){return _A(e)&&typeof e.style<"u"&&!Ne(e)},Ne=function(e){return typeof e.className=="object"},Lo=function(e){return e.tagName==="LI"},Do=function(e){return e.tagName==="OL"},bo=function(e){return e.tagName==="INPUT"},xo=function(e){return e.tagName==="HTML"},WB=function(e){return e.tagName==="svg"},Bt=function(e){return e.tagName==="BODY"},ZB=function(e){return e.tagName==="CANVAS"},Pt=function(e){return e.tagName==="VIDEO"},Wr=function(e){return e.tagName==="IMG"},qB=function(e){return e.tagName==="IFRAME"},kt=function(e){return e.tagName==="STYLE"},To=function(e){return e.tagName==="SCRIPT"},Ye=function(e){return e.tagName==="TEXTAREA"},We=function(e){return e.tagName==="SELECT"},jB=function(e){return e.tagName==="SLOT"},Yt=function(e){return e.tagName.indexOf("-")>0},So=function(){function e(){this.counters={}}return e.prototype.getCounterValue=function(A){var t=this.counters[A];return t&&t.length?t[t.length-1]:1},e.prototype.getCounterValues=function(A){var t=this.counters[A];return t||[]},e.prototype.pop=function(A){var t=this;A.forEach(function(r){return t.counters[r].pop()})},e.prototype.parse=function(A){var t=this,r=A.counterIncrement,B=A.counterReset,n=!0;r!==null&&r.forEach(function(i){var a=t.counters[i.counter];a&&i.increment!==0&&(n=!1,a.length||a.push(1),a[Math.max(0,a.length-1)]+=i.increment)});var s=[];return n&&B.forEach(function(i){var a=t.counters[i.counter];s.push(i.counter),a||(a=t.counters[i.counter]=[]),a.push(i.reset)}),s},e}(),Wt={integers:[1e3,900,500,400,100,90,50,40,10,9,5,4,1],values:["M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"]},Zt={integers:[9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,900,800,700,600,500,400,300,200,100,90,80,70,60,50,40,30,20,10,9,8,7,6,5,4,3,2,1],values:["Ք","Փ","Ւ","Ց","Ր","Տ","Վ","Ս","Ռ","Ջ","Պ","Չ","Ո","Շ","Ն","Յ","Մ","Ճ","Ղ","Ձ","Հ","Կ","Ծ","Խ","Լ","Ի","Ժ","Թ","Ը","Է","Զ","Ե","Դ","Գ","Բ","Ա"]},Oo={integers:[1e4,9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,400,300,200,100,90,80,70,60,50,40,30,20,19,18,17,16,15,10,9,8,7,6,5,4,3,2,1],values:["י׳","ט׳","ח׳","ז׳","ו׳","ה׳","ד׳","ג׳","ב׳","א׳","ת","ש","ר","ק","צ","פ","ע","ס","נ","מ","ל","כ","יט","יח","יז","טז","טו","י","ט","ח","ז","ו","ה","ד","ג","ב","א"]},Mo={integers:[1e4,9e3,8e3,7e3,6e3,5e3,4e3,3e3,2e3,1e3,900,800,700,600,500,400,300,200,100,90,80,70,60,50,40,30,20,10,9,8,7,6,5,4,3,2,1],values:["ჵ","ჰ","ჯ","ჴ","ხ","ჭ","წ","ძ","ც","ჩ","შ","ყ","ღ","ქ","ფ","ჳ","ტ","ს","რ","ჟ","პ","ო","ჲ","ნ","მ","ლ","კ","ი","თ","ჱ","ზ","ვ","ე","დ","გ","ბ","ა"]},GA=function(e,A,t,r,B,n){return et?we(e,B,n.length>0):r.integers.reduce(function(s,i,a){for(;e>=i;)e-=i,s+=r.values[a];return s},"")+n},zB=function(e,A,t,r){var B="";do t||e--,B=r(e)+B,e/=A;while(e*A>=A);return B},T=function(e,A,t,r,B){var n=t-A+1;return(e<0?"-":"")+(zB(Math.abs(e),n,r,function(s){return S(Math.floor(s%n)+A)})+B)},mA=function(e,A,t){t===void 0&&(t=". ");var r=A.length;return zB(Math.abs(e),r,!1,function(B){return A[Math.floor(B%r)]})+t},NA=1,lA=2,fA=4,Be=8,gA=function(e,A,t,r,B,n){if(e<-9999||e>9999)return we(e,4,B.length>0);var s=Math.abs(e),i=B;if(s===0)return A[0]+i;for(var a=0;s>0&&a<=4;a++){var o=s%10;o===0&&G(n,NA)&&i!==""?i=A[o]+i:o>1||o===1&&a===0||o===1&&a===1&&G(n,lA)||o===1&&a===1&&G(n,fA)&&e>100||o===1&&a>1&&G(n,Be)?i=A[o]+(a>0?t[a-1]:"")+i:o===1&&a>0&&(i=t[a-1]+i),s=Math.floor(s/10)}return(e<0?r:"")+i},qt="十百千萬",jt="拾佰仟萬",zt="マイナス",pr="마이너스",we=function(e,A,t){var r=t?". ":"",B=t?"、":"",n=t?", ":"",s=t?" ":"";switch(A){case 0:return"•"+s;case 1:return"◦"+s;case 2:return"◾"+s;case 5:var i=T(e,48,57,!0,r);return i.length<4?"0"+i:i;case 4:return mA(e,"〇一二三四五六七八九",B);case 6:return GA(e,1,3999,Wt,3,r).toLowerCase();case 7:return GA(e,1,3999,Wt,3,r);case 8:return T(e,945,969,!1,r);case 9:return T(e,97,122,!1,r);case 10:return T(e,65,90,!1,r);case 11:return T(e,1632,1641,!0,r);case 12:case 49:return GA(e,1,9999,Zt,3,r);case 35:return GA(e,1,9999,Zt,3,r).toLowerCase();case 13:return T(e,2534,2543,!0,r);case 14:case 30:return T(e,6112,6121,!0,r);case 15:return mA(e,"子丑寅卯辰巳午未申酉戌亥",B);case 16:return mA(e,"甲乙丙丁戊己庚辛壬癸",B);case 17:case 48:return gA(e,"零一二三四五六七八九",qt,"負",B,lA|fA|Be);case 47:return gA(e,"零壹貳參肆伍陸柒捌玖",jt,"負",B,NA|lA|fA|Be);case 42:return gA(e,"零一二三四五六七八九",qt,"负",B,lA|fA|Be);case 41:return gA(e,"零壹贰叁肆伍陆柒捌玖",jt,"负",B,NA|lA|fA|Be);case 26:return gA(e,"〇一二三四五六七八九","十百千万",zt,B,0);case 25:return gA(e,"零壱弐参四伍六七八九","拾百千万",zt,B,NA|lA|fA);case 31:return gA(e,"영일이삼사오육칠팔구","십백천만",pr,n,NA|lA|fA);case 33:return gA(e,"零一二三四五六七八九","十百千萬",pr,n,0);case 32:return gA(e,"零壹貳參四五六七八九","拾百千",pr,n,NA|lA|fA);case 18:return T(e,2406,2415,!0,r);case 20:return GA(e,1,19999,Mo,3,r);case 21:return T(e,2790,2799,!0,r);case 22:return T(e,2662,2671,!0,r);case 22:return GA(e,1,10999,Oo,3,r);case 23:return mA(e,"あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん");case 24:return mA(e,"いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす");case 27:return T(e,3302,3311,!0,r);case 28:return mA(e,"アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン",B);case 29:return mA(e,"イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス",B);case 34:return T(e,3792,3801,!0,r);case 37:return T(e,6160,6169,!0,r);case 38:return T(e,4160,4169,!0,r);case 39:return T(e,2918,2927,!0,r);case 40:return T(e,1776,1785,!0,r);case 43:return T(e,3046,3055,!0,r);case 44:return T(e,3174,3183,!0,r);case 45:return T(e,3664,3673,!0,r);case 46:return T(e,3872,3881,!0,r);case 3:default:return T(e,48,57,!0,r)}},$B="data-html2canvas-ignore",$t=function(){function e(A,t,r){if(this.context=A,this.options=r,this.scrolledElements=[],this.referenceElement=t,this.counters=new So,this.quoteDepth=0,!t.ownerDocument)throw new Error("Cloned element does not have an owner document");this.documentElement=this.cloneNode(t.ownerDocument.documentElement,!1)}return e.prototype.toIFrame=function(A,t){var r=this,B=Go(A,t);if(!B.contentWindow)return Promise.reject("Unable to find iframe window");var n=A.defaultView.pageXOffset,s=A.defaultView.pageYOffset,i=B.contentWindow,a=i.document,o=No(B).then(function(){return P(r,void 0,void 0,function(){var Q,g;return _(this,function(w){switch(w.label){case 0:return this.scrolledElements.forEach(Po),i&&(i.scrollTo(t.left,t.top),/(iPad|iPhone|iPod)/g.test(navigator.userAgent)&&(i.scrollY!==t.top||i.scrollX!==t.left)&&(this.context.logger.warn("Unable to restore scroll position for cloned document"),this.context.windowBounds=this.context.windowBounds.add(i.scrollX-t.left,i.scrollY-t.top,0,0))),Q=this.options.onclone,g=this.clonedReferenceElement,typeof g>"u"?[2,Promise.reject("Error finding the "+this.referenceElement.nodeName+" in the cloned document")]:a.fonts&&a.fonts.ready?[4,a.fonts.ready]:[3,2];case 1:w.sent(),w.label=2;case 2:return/(AppleWebKit)/g.test(navigator.userAgent)?[4,Vo(a)]:[3,4];case 3:w.sent(),w.label=4;case 4:return typeof Q=="function"?[2,Promise.resolve().then(function(){return Q(a,g)}).then(function(){return B})]:[2,B]}})})});return a.open(),a.write(_o(document.doctype)+""),Jo(this.referenceElement.ownerDocument,n,s),a.replaceChild(a.adoptNode(this.documentElement),a.documentElement),a.close(),o},e.prototype.createElementClone=function(A){if(Jr(A,2))debugger;if(ZB(A))return this.createCanvasClone(A);if(Pt(A))return this.createVideoClone(A);if(kt(A))return this.createStyleClone(A);var t=A.cloneNode(!1);return Wr(t)&&(Wr(A)&&A.currentSrc&&A.currentSrc!==A.src&&(t.src=A.currentSrc,t.srcset=""),t.loading==="lazy"&&(t.loading="eager")),Yt(t)?this.createCustomElementClone(t):t},e.prototype.createCustomElementClone=function(A){var t=document.createElement("html2canvascustomelement");return Ir(A.style,t),t},e.prototype.createStyleClone=function(A){try{var t=A.sheet;if(t&&t.cssRules){var r=[].slice.call(t.cssRules,0).reduce(function(n,s){return s&&typeof s.cssText=="string"?n+s.cssText:n},""),B=A.cloneNode(!1);return B.textContent=r,B}}catch(n){if(this.context.logger.error("Unable to access cssRules property",n),n.name!=="SecurityError")throw n}return A.cloneNode(!1)},e.prototype.createCanvasClone=function(A){var t;if(this.options.inlineImages&&A.ownerDocument){var r=A.ownerDocument.createElement("img");try{return r.src=A.toDataURL(),r}catch{this.context.logger.info("Unable to inline canvas contents, canvas is tainted",A)}}var B=A.cloneNode(!1);try{B.width=A.width,B.height=A.height;var n=A.getContext("2d"),s=B.getContext("2d");if(s)if(!this.options.allowTaint&&n)s.putImageData(n.getImageData(0,0,A.width,A.height),0,0);else{var i=(t=A.getContext("webgl2"))!==null&&t!==void 0?t:A.getContext("webgl");if(i){var a=i.getContextAttributes();(a==null?void 0:a.preserveDrawingBuffer)===!1&&this.context.logger.warn("Unable to clone WebGL context as it has preserveDrawingBuffer=false",A)}s.drawImage(A,0,0)}return B}catch{this.context.logger.info("Unable to clone canvas as it is tainted",A)}return B},e.prototype.createVideoClone=function(A){var t=A.ownerDocument.createElement("canvas");t.width=A.offsetWidth,t.height=A.offsetHeight;var r=t.getContext("2d");try{return r&&(r.drawImage(A,0,0,t.width,t.height),this.options.allowTaint||r.getImageData(0,0,t.width,t.height)),t}catch{this.context.logger.info("Unable to clone video as it is tainted",A)}var B=A.ownerDocument.createElement("canvas");return B.width=A.offsetWidth,B.height=A.offsetHeight,B},e.prototype.appendChildNode=function(A,t,r){(!_A(t)||!To(t)&&!t.hasAttribute($B)&&(typeof this.options.ignoreElements!="function"||!this.options.ignoreElements(t)))&&(!this.options.copyStyles||!_A(t)||!kt(t))&&A.appendChild(this.cloneNode(t,r))},e.prototype.cloneChildNodes=function(A,t,r){for(var B=this,n=A.shadowRoot?A.shadowRoot.firstChild:A.firstChild;n;n=n.nextSibling)if(_A(n)&&jB(n)&&typeof n.assignedNodes=="function"){var s=n.assignedNodes();s.length&&s.forEach(function(i){return B.appendChildNode(t,i,r)})}else this.appendChildNode(t,n,r)},e.prototype.cloneNode=function(A,t){if(YB(A))return document.createTextNode(A.data);if(!A.ownerDocument)return A.cloneNode(!1);var r=A.ownerDocument.defaultView;if(r&&_A(A)&&(Yr(A)||Ne(A))){var B=this.createElementClone(A);B.style.transitionProperty="none";var n=r.getComputedStyle(A),s=r.getComputedStyle(A,":before"),i=r.getComputedStyle(A,":after");this.referenceElement===A&&Yr(B)&&(this.clonedReferenceElement=B),Bt(B)&&Wo(B);var a=this.counters.parse(new Lt(this.context,n)),o=this.resolvePseudoContent(A,B,s,oe.BEFORE);Yt(A)&&(t=!0),Pt(A)||this.cloneChildNodes(A,B,t),o&&B.insertBefore(o,B.firstChild);var Q=this.resolvePseudoContent(A,B,i,oe.AFTER);return Q&&B.appendChild(Q),this.counters.pop(a),(n&&(this.options.copyStyles||Ne(A))&&!qB(A)||t)&&Ir(n,B),(A.scrollTop!==0||A.scrollLeft!==0)&&this.scrolledElements.push([B,A.scrollLeft,A.scrollTop]),(Ye(A)||We(A))&&(Ye(B)||We(B))&&(B.value=A.value),B}return A.cloneNode(!1)},e.prototype.resolvePseudoContent=function(A,t,r,B){var n=this;if(r){var s=r.content,i=t.ownerDocument;if(!(!i||!s||s==="none"||s==="-moz-alt-content"||r.display==="none")){this.counters.parse(new Lt(this.context,r));var a=new mi(this.context,r),o=i.createElement("html2canvaspseudoelement");Ir(r,o),a.content.forEach(function(g){if(g.type===0)o.appendChild(i.createTextNode(g.value));else if(g.type===22){var w=i.createElement("img");w.src=g.value,w.style.opacity="1",o.appendChild(w)}else if(g.type===18){if(g.name==="attr"){var f=g.values.filter(D);f.length&&o.appendChild(i.createTextNode(A.getAttribute(f[0].value)||""))}else if(g.name==="counter"){var c=g.values.filter(PA),C=c[0],H=c[1];if(C&&D(C)){var h=n.counters.getCounterValue(C.value),F=H&&D(H)?_r.parse(n.context,H.value):3;o.appendChild(i.createTextNode(we(h,F,!1)))}}else if(g.name==="counters"){var K=g.values.filter(PA),C=K[0],p=K[1],H=K[2];if(C&&D(C)){var d=n.counters.getCounterValues(C.value),l=H&&D(H)?_r.parse(n.context,H.value):3,v=p&&p.type===0?p.value:"",y=d.map(function(k){return we(k,l,!1)}).join(v);o.appendChild(i.createTextNode(y))}}}else if(g.type===20)switch(g.value){case"open-quote":o.appendChild(i.createTextNode(mt(a.quotes,n.quoteDepth++,!0)));break;case"close-quote":o.appendChild(i.createTextNode(mt(a.quotes,--n.quoteDepth,!1)));break;default:o.appendChild(i.createTextNode(g.value))}}),o.className=Zr+" "+qr;var Q=B===oe.BEFORE?" "+Zr:" "+qr;return Ne(t)?t.className.baseValue+=Q:t.className+=Q,o}}},e.destroy=function(A){return A.parentNode?(A.parentNode.removeChild(A),!0):!1},e}(),oe;(function(e){e[e.BEFORE=0]="BEFORE",e[e.AFTER=1]="AFTER"})(oe||(oe={}));var Go=function(e,A){var t=e.createElement("iframe");return t.className="html2canvas-container",t.style.visibility="hidden",t.style.position="fixed",t.style.left="-10000px",t.style.top="0px",t.style.border="0",t.width=A.width.toString(),t.height=A.height.toString(),t.scrolling="no",t.setAttribute($B,"true"),e.body.appendChild(t),t},Ro=function(e){return new Promise(function(A){if(e.complete){A();return}if(!e.src){A();return}e.onload=A,e.onerror=A})},Vo=function(e){return Promise.all([].slice.call(e.images,0).map(Ro))},No=function(e){return new Promise(function(A,t){var r=e.contentWindow;if(!r)return t("No window assigned for iframe");var B=r.document;r.onload=e.onload=function(){r.onload=e.onload=null;var n=setInterval(function(){B.body.childNodes.length>0&&B.readyState==="complete"&&(clearInterval(n),A(e))},50)}})},Xo=["all","d","content"],Ir=function(e,A){for(var t=e.length-1;t>=0;t--){var r=e.item(t);Xo.indexOf(r)===-1&&A.style.setProperty(r,e.getPropertyValue(r))}return A},_o=function(e){var A="";return e&&(A+=""),A},Jo=function(e,A,t){e&&e.defaultView&&(A!==e.defaultView.pageXOffset||t!==e.defaultView.pageYOffset)&&e.defaultView.scrollTo(A,t)},Po=function(e){var A=e[0],t=e[1],r=e[2];A.scrollLeft=t,A.scrollTop=r},ko=":before",Yo=":after",Zr="___html2canvas___pseudoelement_before",qr="___html2canvas___pseudoelement_after",AB=`{ - content: "" !important; - display: none !important; -}`,Wo=function(e){Zo(e,"."+Zr+ko+AB+` - .`+qr+Yo+AB)},Zo=function(e,A){var t=e.ownerDocument;if(t){var r=t.createElement("style");r.textContent=A,e.appendChild(r)}},An=function(){function e(){}return e.getOrigin=function(A){var t=e._link;return t?(t.href=A,t.href=t.href,t.protocol+t.hostname+t.port):"about:blank"},e.isSameOrigin=function(A){return e.getOrigin(A)===e._origin},e.setContext=function(A){e._link=A.document.createElement("a"),e._origin=e.getOrigin(A.location.href)},e._origin="about:blank",e}(),qo=function(){function e(A,t){this.context=A,this._options=t,this._cache={}}return e.prototype.addImage=function(A){var t=Promise.resolve();return this.has(A)||(yr(A)||AQ(A))&&(this._cache[A]=this.loadImage(A)).catch(function(){}),t},e.prototype.match=function(A){return this._cache[A]},e.prototype.loadImage=function(A){return P(this,void 0,void 0,function(){var t,r,B,n,s=this;return _(this,function(i){switch(i.label){case 0:return t=An.isSameOrigin(A),r=!vr(A)&&this._options.useCORS===!0&&N.SUPPORT_CORS_IMAGES&&!t,B=!vr(A)&&!t&&!yr(A)&&typeof this._options.proxy=="string"&&N.SUPPORT_CORS_XHR&&!r,!t&&this._options.allowTaint===!1&&!vr(A)&&!yr(A)&&!B&&!r?[2]:(n=A,B?[4,this.proxy(n)]:[3,2]);case 1:n=i.sent(),i.label=2;case 2:return this.context.logger.debug("Added image "+A.substring(0,256)),[4,new Promise(function(a,o){var Q=new Image;Q.onload=function(){return a(Q)},Q.onerror=o,(eQ(n)||r)&&(Q.crossOrigin="anonymous"),Q.src=n,Q.complete===!0&&setTimeout(function(){return a(Q)},500),s._options.imageTimeout>0&&setTimeout(function(){return o("Timed out ("+s._options.imageTimeout+"ms) loading image")},s._options.imageTimeout)})];case 3:return[2,i.sent()]}})})},e.prototype.has=function(A){return typeof this._cache[A]<"u"},e.prototype.keys=function(){return Promise.resolve(Object.keys(this._cache))},e.prototype.proxy=function(A){var t=this,r=this._options.proxy;if(!r)throw new Error("No proxy defined");var B=A.substring(0,256);return new Promise(function(n,s){var i=N.SUPPORT_RESPONSE_TYPE?"blob":"text",a=new XMLHttpRequest;a.onload=function(){if(a.status===200)if(i==="text")n(a.response);else{var g=new FileReader;g.addEventListener("load",function(){return n(g.result)},!1),g.addEventListener("error",function(w){return s(w)},!1),g.readAsDataURL(a.response)}else s("Failed to proxy resource "+B+" with status code "+a.status)},a.onerror=s;var o=r.indexOf("?")>-1?"&":"?";if(a.open("GET",""+r+o+"url="+encodeURIComponent(A)+"&responseType="+i),i!=="text"&&a instanceof XMLHttpRequest&&(a.responseType=i),t._options.imageTimeout){var Q=t._options.imageTimeout;a.timeout=Q,a.ontimeout=function(){return s("Timed out ("+Q+"ms) proxying "+B)}}a.send()})},e}(),jo=/^data:image\/svg\+xml/i,zo=/^data:image\/.*;base64,/i,$o=/^data:image\/.*/i,AQ=function(e){return N.SUPPORT_SVG_DRAWING||!rQ(e)},vr=function(e){return $o.test(e)},eQ=function(e){return zo.test(e)},yr=function(e){return e.substr(0,4)==="blob"},rQ=function(e){return e.substr(-3).toLowerCase()==="svg"||jo.test(e)},u=function(){function e(A,t){this.type=0,this.x=A,this.y=t}return e.prototype.add=function(A,t){return new e(this.x+A,this.y+t)},e}(),RA=function(e,A,t){return new u(e.x+(A.x-e.x)*t,e.y+(A.y-e.y)*t)},Te=function(){function e(A,t,r,B){this.type=1,this.start=A,this.startControl=t,this.endControl=r,this.end=B}return e.prototype.subdivide=function(A,t){var r=RA(this.start,this.startControl,A),B=RA(this.startControl,this.endControl,A),n=RA(this.endControl,this.end,A),s=RA(r,B,A),i=RA(B,n,A),a=RA(s,i,A);return t?new e(this.start,r,s,a):new e(a,i,n,this.end)},e.prototype.add=function(A,t){return new e(this.start.add(A,t),this.startControl.add(A,t),this.endControl.add(A,t),this.end.add(A,t))},e.prototype.reverse=function(){return new e(this.end,this.endControl,this.startControl,this.start)},e}(),$=function(e){return e.type===1},tQ=function(){function e(A){var t=A.styles,r=A.bounds,B=re(t.borderTopLeftRadius,r.width,r.height),n=B[0],s=B[1],i=re(t.borderTopRightRadius,r.width,r.height),a=i[0],o=i[1],Q=re(t.borderBottomRightRadius,r.width,r.height),g=Q[0],w=Q[1],f=re(t.borderBottomLeftRadius,r.width,r.height),c=f[0],C=f[1],H=[];H.push((n+a)/r.width),H.push((c+g)/r.width),H.push((s+C)/r.height),H.push((o+w)/r.height);var h=Math.max.apply(Math,H);h>1&&(n/=h,s/=h,a/=h,o/=h,g/=h,w/=h,c/=h,C/=h);var F=r.width-a,K=r.height-w,p=r.width-g,d=r.height-C,l=t.borderTopWidth,v=t.borderRightWidth,y=t.borderBottomWidth,E=t.borderLeftWidth,O=b(t.paddingTop,A.bounds.width),k=b(t.paddingRight,A.bounds.width),q=b(t.paddingBottom,A.bounds.width),L=b(t.paddingLeft,A.bounds.width);this.topLeftBorderDoubleOuterBox=n>0||s>0?x(r.left+E/3,r.top+l/3,n-E/3,s-l/3,m.TOP_LEFT):new u(r.left+E/3,r.top+l/3),this.topRightBorderDoubleOuterBox=n>0||s>0?x(r.left+F,r.top+l/3,a-v/3,o-l/3,m.TOP_RIGHT):new u(r.left+r.width-v/3,r.top+l/3),this.bottomRightBorderDoubleOuterBox=g>0||w>0?x(r.left+p,r.top+K,g-v/3,w-y/3,m.BOTTOM_RIGHT):new u(r.left+r.width-v/3,r.top+r.height-y/3),this.bottomLeftBorderDoubleOuterBox=c>0||C>0?x(r.left+E/3,r.top+d,c-E/3,C-y/3,m.BOTTOM_LEFT):new u(r.left+E/3,r.top+r.height-y/3),this.topLeftBorderDoubleInnerBox=n>0||s>0?x(r.left+E*2/3,r.top+l*2/3,n-E*2/3,s-l*2/3,m.TOP_LEFT):new u(r.left+E*2/3,r.top+l*2/3),this.topRightBorderDoubleInnerBox=n>0||s>0?x(r.left+F,r.top+l*2/3,a-v*2/3,o-l*2/3,m.TOP_RIGHT):new u(r.left+r.width-v*2/3,r.top+l*2/3),this.bottomRightBorderDoubleInnerBox=g>0||w>0?x(r.left+p,r.top+K,g-v*2/3,w-y*2/3,m.BOTTOM_RIGHT):new u(r.left+r.width-v*2/3,r.top+r.height-y*2/3),this.bottomLeftBorderDoubleInnerBox=c>0||C>0?x(r.left+E*2/3,r.top+d,c-E*2/3,C-y*2/3,m.BOTTOM_LEFT):new u(r.left+E*2/3,r.top+r.height-y*2/3),this.topLeftBorderStroke=n>0||s>0?x(r.left+E/2,r.top+l/2,n-E/2,s-l/2,m.TOP_LEFT):new u(r.left+E/2,r.top+l/2),this.topRightBorderStroke=n>0||s>0?x(r.left+F,r.top+l/2,a-v/2,o-l/2,m.TOP_RIGHT):new u(r.left+r.width-v/2,r.top+l/2),this.bottomRightBorderStroke=g>0||w>0?x(r.left+p,r.top+K,g-v/2,w-y/2,m.BOTTOM_RIGHT):new u(r.left+r.width-v/2,r.top+r.height-y/2),this.bottomLeftBorderStroke=c>0||C>0?x(r.left+E/2,r.top+d,c-E/2,C-y/2,m.BOTTOM_LEFT):new u(r.left+E/2,r.top+r.height-y/2),this.topLeftBorderBox=n>0||s>0?x(r.left,r.top,n,s,m.TOP_LEFT):new u(r.left,r.top),this.topRightBorderBox=a>0||o>0?x(r.left+F,r.top,a,o,m.TOP_RIGHT):new u(r.left+r.width,r.top),this.bottomRightBorderBox=g>0||w>0?x(r.left+p,r.top+K,g,w,m.BOTTOM_RIGHT):new u(r.left+r.width,r.top+r.height),this.bottomLeftBorderBox=c>0||C>0?x(r.left,r.top+d,c,C,m.BOTTOM_LEFT):new u(r.left,r.top+r.height),this.topLeftPaddingBox=n>0||s>0?x(r.left+E,r.top+l,Math.max(0,n-E),Math.max(0,s-l),m.TOP_LEFT):new u(r.left+E,r.top+l),this.topRightPaddingBox=a>0||o>0?x(r.left+Math.min(F,r.width-v),r.top+l,F>r.width+v?0:Math.max(0,a-v),Math.max(0,o-l),m.TOP_RIGHT):new u(r.left+r.width-v,r.top+l),this.bottomRightPaddingBox=g>0||w>0?x(r.left+Math.min(p,r.width-E),r.top+Math.min(K,r.height-y),Math.max(0,g-v),Math.max(0,w-y),m.BOTTOM_RIGHT):new u(r.left+r.width-v,r.top+r.height-y),this.bottomLeftPaddingBox=c>0||C>0?x(r.left+E,r.top+Math.min(d,r.height-y),Math.max(0,c-E),Math.max(0,C-y),m.BOTTOM_LEFT):new u(r.left+E,r.top+r.height-y),this.topLeftContentBox=n>0||s>0?x(r.left+E+L,r.top+l+O,Math.max(0,n-(E+L)),Math.max(0,s-(l+O)),m.TOP_LEFT):new u(r.left+E+L,r.top+l+O),this.topRightContentBox=a>0||o>0?x(r.left+Math.min(F,r.width+E+L),r.top+l+O,F>r.width+E+L?0:a-E+L,o-(l+O),m.TOP_RIGHT):new u(r.left+r.width-(v+k),r.top+l+O),this.bottomRightContentBox=g>0||w>0?x(r.left+Math.min(p,r.width-(E+L)),r.top+Math.min(K,r.height+l+O),Math.max(0,g-(v+k)),w-(y+q),m.BOTTOM_RIGHT):new u(r.left+r.width-(v+k),r.top+r.height-(y+q)),this.bottomLeftContentBox=c>0||C>0?x(r.left+E+L,r.top+d,Math.max(0,c-(E+L)),C-(y+q),m.BOTTOM_LEFT):new u(r.left+E+L,r.top+r.height-(y+q))}return e}(),m;(function(e){e[e.TOP_LEFT=0]="TOP_LEFT",e[e.TOP_RIGHT=1]="TOP_RIGHT",e[e.BOTTOM_RIGHT=2]="BOTTOM_RIGHT",e[e.BOTTOM_LEFT=3]="BOTTOM_LEFT"})(m||(m={}));var x=function(e,A,t,r,B){var n=4*((Math.sqrt(2)-1)/3),s=t*n,i=r*n,a=e+t,o=A+r;switch(B){case m.TOP_LEFT:return new Te(new u(e,o),new u(e,o-i),new u(a-s,A),new u(a,A));case m.TOP_RIGHT:return new Te(new u(e,A),new u(e+s,A),new u(a,o-i),new u(a,o));case m.BOTTOM_RIGHT:return new Te(new u(a,A),new u(a,A+i),new u(e+s,o),new u(e,o));case m.BOTTOM_LEFT:default:return new Te(new u(a,o),new u(a-s,o),new u(e,A+i),new u(e,A))}},Ze=function(e){return[e.topLeftBorderBox,e.topRightBorderBox,e.bottomRightBorderBox,e.bottomLeftBorderBox]},BQ=function(e){return[e.topLeftContentBox,e.topRightContentBox,e.bottomRightContentBox,e.bottomLeftContentBox]},qe=function(e){return[e.topLeftPaddingBox,e.topRightPaddingBox,e.bottomRightPaddingBox,e.bottomLeftPaddingBox]},nQ=function(){function e(A,t,r){this.offsetX=A,this.offsetY=t,this.matrix=r,this.type=0,this.target=6}return e}(),Se=function(){function e(A,t){this.path=A,this.target=t,this.type=1}return e}(),sQ=function(){function e(A){this.opacity=A,this.type=2,this.target=6}return e}(),aQ=function(e){return e.type===0},en=function(e){return e.type===1},iQ=function(e){return e.type===2},eB=function(e,A){return e.length===A.length?e.some(function(t,r){return t===A[r]}):!1},oQ=function(e,A,t,r,B){return e.map(function(n,s){switch(s){case 0:return n.add(A,t);case 1:return n.add(A+r,t);case 2:return n.add(A+r,t+B);case 3:return n.add(A,t+B)}return n})},rn=function(){function e(A){this.element=A,this.inlineLevel=[],this.nonInlineLevel=[],this.negativeZIndex=[],this.zeroOrAutoZIndexOrTransformedOrOpacity=[],this.positiveZIndex=[],this.nonPositionedFloats=[],this.nonPositionedInlineLevel=[]}return e}(),tn=function(){function e(A,t){if(this.container=A,this.parent=t,this.effects=[],this.curves=new tQ(this.container),this.container.styles.opacity<1&&this.effects.push(new sQ(this.container.styles.opacity)),this.container.styles.transform!==null){var r=this.container.bounds.left+this.container.styles.transformOrigin[0].number,B=this.container.bounds.top+this.container.styles.transformOrigin[1].number,n=this.container.styles.transform;this.effects.push(new nQ(r,B,n))}if(this.container.styles.overflowX!==0){var s=Ze(this.curves),i=qe(this.curves);eB(s,i)?this.effects.push(new Se(s,6)):(this.effects.push(new Se(s,2)),this.effects.push(new Se(i,4)))}}return e.prototype.getEffects=function(A){for(var t=[2,3].indexOf(this.container.styles.position)===-1,r=this.parent,B=this.effects.slice(0);r;){var n=r.effects.filter(function(a){return!en(a)});if(t||r.container.styles.position!==0||!r.parent){if(B.unshift.apply(B,n),t=[2,3].indexOf(r.container.styles.position)===-1,r.container.styles.overflowX!==0){var s=Ze(r.curves),i=qe(r.curves);eB(s,i)||B.unshift(new Se(i,6))}}else B.unshift.apply(B,n);r=r.parent}return B.filter(function(a){return G(a.target,A)})},e}(),jr=function(e,A,t,r){e.container.elements.forEach(function(B){var n=G(B.flags,4),s=G(B.flags,2),i=new tn(B,e);G(B.styles.display,2048)&&r.push(i);var a=G(B.flags,8)?[]:r;if(n||s){var o=n||B.styles.isPositioned()?t:A,Q=new rn(i);if(B.styles.isPositioned()||B.styles.opacity<1||B.styles.isTransformed()){var g=B.styles.zIndex.order;if(g<0){var w=0;o.negativeZIndex.some(function(c,C){return g>c.element.container.styles.zIndex.order?(w=C,!1):w>0}),o.negativeZIndex.splice(w,0,Q)}else if(g>0){var f=0;o.positiveZIndex.some(function(c,C){return g>=c.element.container.styles.zIndex.order?(f=C+1,!1):f>0}),o.positiveZIndex.splice(f,0,Q)}else o.zeroOrAutoZIndexOrTransformedOrOpacity.push(Q)}else B.styles.isFloating()?o.nonPositionedFloats.push(Q):o.nonPositionedInlineLevel.push(Q);jr(i,Q,n?Q:t,a)}else B.styles.isInlineLevel()?A.inlineLevel.push(i):A.nonInlineLevel.push(i),jr(i,A,t,a);G(B.flags,8)&&Bn(B,a)})},Bn=function(e,A){for(var t=e instanceof kr?e.start:1,r=e instanceof kr?e.reversed:!1,B=0;B"u"?e[0]:t},fQ=function(e,A,t,r,B){var n=A[0],s=A[1],i=t[0],a=t[1];switch(e){case 2:return[new u(Math.round(r.left),Math.round(r.top+s)),new u(Math.round(r.left+r.width),Math.round(r.top+s)),new u(Math.round(r.left+r.width),Math.round(a+r.top+s)),new u(Math.round(r.left),Math.round(a+r.top+s))];case 3:return[new u(Math.round(r.left+n),Math.round(r.top)),new u(Math.round(r.left+n+i),Math.round(r.top)),new u(Math.round(r.left+n+i),Math.round(r.height+r.top)),new u(Math.round(r.left+n),Math.round(r.height+r.top))];case 1:return[new u(Math.round(r.left+n),Math.round(r.top+s)),new u(Math.round(r.left+n+i),Math.round(r.top+s)),new u(Math.round(r.left+n+i),Math.round(r.top+s+a)),new u(Math.round(r.left+n),Math.round(r.top+s+a))];default:return[new u(Math.round(B.left),Math.round(B.top)),new u(Math.round(B.left+B.width),Math.round(B.top)),new u(Math.round(B.left+B.width),Math.round(B.height+B.top)),new u(Math.round(B.left),Math.round(B.height+B.top))]}},UQ="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",tB="Hidden Text",FQ=function(){function e(A){this._data={},this._document=A}return e.prototype.parseMetrics=function(A,t){var r=this._document.createElement("div"),B=this._document.createElement("img"),n=this._document.createElement("span"),s=this._document.body;r.style.visibility="hidden",r.style.fontFamily=A,r.style.fontSize=t,r.style.margin="0",r.style.padding="0",r.style.whiteSpace="nowrap",s.appendChild(r),B.src=UQ,B.width=1,B.height=1,B.style.margin="0",B.style.padding="0",B.style.verticalAlign="baseline",n.style.fontFamily=A,n.style.fontSize=t,n.style.margin="0",n.style.padding="0",n.appendChild(this._document.createTextNode(tB)),r.appendChild(n),r.appendChild(B);var i=B.offsetTop-n.offsetTop+2;r.removeChild(n),r.appendChild(this._document.createTextNode(tB)),r.style.lineHeight="normal",B.style.verticalAlign="super";var a=B.offsetTop-r.offsetTop+2;return s.removeChild(r),{baseline:i,middle:a}},e.prototype.getMetrics=function(A,t){var r=A+" "+t;return typeof this._data[r]>"u"&&(this._data[r]=this.parseMetrics(A,t)),this._data[r]},e}(),sn=function(){function e(A,t){this.context=A,this.options=t}return e}(),hQ=1e4,dQ=function(e){tA(A,e);function A(t,r){var B=e.call(this,t,r)||this;return B._activeEffects=[],B.canvas=r.canvas?r.canvas:document.createElement("canvas"),B.ctx=B.canvas.getContext("2d"),r.canvas||(B.canvas.width=Math.floor(r.width*r.scale),B.canvas.height=Math.floor(r.height*r.scale),B.canvas.style.width=r.width+"px",B.canvas.style.height=r.height+"px"),B.fontMetrics=new FQ(document),B.ctx.scale(B.options.scale,B.options.scale),B.ctx.translate(-r.x,-r.y),B.ctx.textBaseline="bottom",B._activeEffects=[],B.context.logger.debug("Canvas renderer initialized ("+r.width+"x"+r.height+") with scale "+r.scale),B}return A.prototype.applyEffects=function(t){for(var r=this;this._activeEffects.length;)this.popEffect();t.forEach(function(B){return r.applyEffect(B)})},A.prototype.applyEffect=function(t){this.ctx.save(),iQ(t)&&(this.ctx.globalAlpha=t.opacity),aQ(t)&&(this.ctx.translate(t.offsetX,t.offsetY),this.ctx.transform(t.matrix[0],t.matrix[1],t.matrix[2],t.matrix[3],t.matrix[4],t.matrix[5]),this.ctx.translate(-t.offsetX,-t.offsetY)),en(t)&&(this.path(t.path),this.ctx.clip()),this._activeEffects.push(t)},A.prototype.popEffect=function(){this._activeEffects.pop(),this.ctx.restore()},A.prototype.renderStack=function(t){return P(this,void 0,void 0,function(){var r;return _(this,function(B){switch(B.label){case 0:return r=t.element.container.styles,r.isVisible()?[4,this.renderStackContent(t)]:[3,2];case 1:B.sent(),B.label=2;case 2:return[2]}})})},A.prototype.renderNode=function(t){return P(this,void 0,void 0,function(){return _(this,function(r){switch(r.label){case 0:if(G(t.container.flags,16))debugger;return t.container.styles.isVisible()?[4,this.renderNodeBackgroundAndBorders(t)]:[3,3];case 1:return r.sent(),[4,this.renderNodeContent(t)];case 2:r.sent(),r.label=3;case 3:return[2]}})})},A.prototype.renderTextWithLetterSpacing=function(t,r,B){var n=this;if(r===0)this.ctx.fillText(t.text,t.bounds.left,t.bounds.top+B);else{var s=rt(t.text);s.reduce(function(i,a){return n.ctx.fillText(a,i,t.bounds.top+B),i+n.ctx.measureText(a).width},t.bounds.left)}},A.prototype.createFontStyle=function(t){var r=t.fontVariant.filter(function(s){return s==="normal"||s==="small-caps"}).join(""),B=vQ(t.fontFamily).join(", "),n=Ce(t.fontSize)?""+t.fontSize.number+t.fontSize.unit:t.fontSize.number+"px";return[[t.fontStyle,r,t.fontWeight,n,B].join(" "),B,n]},A.prototype.renderTextNode=function(t,r){return P(this,void 0,void 0,function(){var B,n,s,i,a,o,Q,g,w=this;return _(this,function(f){return B=this.createFontStyle(r),n=B[0],s=B[1],i=B[2],this.ctx.font=n,this.ctx.direction=r.direction===1?"rtl":"ltr",this.ctx.textAlign="left",this.ctx.textBaseline="alphabetic",a=this.fontMetrics.getMetrics(s,i),o=a.baseline,Q=a.middle,g=r.paintOrder,t.textBounds.forEach(function(c){g.forEach(function(C){switch(C){case 0:w.ctx.fillStyle=R(r.color),w.renderTextWithLetterSpacing(c,r.letterSpacing,o);var H=r.textShadow;H.length&&c.text.trim().length&&(H.slice(0).reverse().forEach(function(h){w.ctx.shadowColor=R(h.color),w.ctx.shadowOffsetX=h.offsetX.number*w.options.scale,w.ctx.shadowOffsetY=h.offsetY.number*w.options.scale,w.ctx.shadowBlur=h.blur.number,w.renderTextWithLetterSpacing(c,r.letterSpacing,o)}),w.ctx.shadowColor="",w.ctx.shadowOffsetX=0,w.ctx.shadowOffsetY=0,w.ctx.shadowBlur=0),r.textDecorationLine.length&&(w.ctx.fillStyle=R(r.textDecorationColor||r.color),r.textDecorationLine.forEach(function(h){switch(h){case 1:w.ctx.fillRect(c.bounds.left,Math.round(c.bounds.top+o),c.bounds.width,1);break;case 2:w.ctx.fillRect(c.bounds.left,Math.round(c.bounds.top),c.bounds.width,1);break;case 3:w.ctx.fillRect(c.bounds.left,Math.ceil(c.bounds.top+Q),c.bounds.width,1);break}}));break;case 1:r.webkitTextStrokeWidth&&c.text.trim().length&&(w.ctx.strokeStyle=R(r.webkitTextStrokeColor),w.ctx.lineWidth=r.webkitTextStrokeWidth,w.ctx.lineJoin=window.chrome?"miter":"round",w.ctx.strokeText(c.text,c.bounds.left,c.bounds.top+o)),w.ctx.strokeStyle="",w.ctx.lineWidth=0,w.ctx.lineJoin="miter";break}})}),[2]})})},A.prototype.renderReplacedElement=function(t,r,B){if(B&&t.intrinsicWidth>0&&t.intrinsicHeight>0){var n=je(t),s=qe(r);this.path(s),this.ctx.save(),this.ctx.clip(),this.ctx.drawImage(B,0,0,t.intrinsicWidth,t.intrinsicHeight,n.left,n.top,n.width,n.height),this.ctx.restore()}},A.prototype.renderNodeContent=function(t){return P(this,void 0,void 0,function(){var r,B,n,s,i,a,F,F,o,Q,g,w,p,f,c,d,C,H,h,F,K,p,d;return _(this,function(l){switch(l.label){case 0:this.applyEffects(t.getEffects(4)),r=t.container,B=t.curves,n=r.styles,s=0,i=r.textNodes,l.label=1;case 1:return s0&&V>0&&(y=n.ctx.createPattern(d,"repeat"),n.renderRepeat(O,y,Y,W))):aa(Q)&&(E=Kr(t,r,[null,null,null]),O=E[0],k=E[1],q=E[2],L=E[3],V=E[4],CA=Q.position.length===0?[$r]:Q.position,Y=b(CA[0],L),W=b(CA[CA.length-1],V),IA=ra(Q,Y,W,L,V),BA=IA[0],uA=IA[1],BA>0&&uA>0&&(vA=n.ctx.createRadialGradient(k+Y,q+W,0,k+Y,q+W,BA),It(Q.stops,BA*2).forEach(function(YA){return vA.addColorStop(YA.stop,R(YA.color))}),n.path(O),n.ctx.fillStyle=vA,BA!==uA?(yA=t.bounds.left+.5*t.bounds.width,iA=t.bounds.top+.5*t.bounds.height,KA=uA/BA,oA=1/KA,n.ctx.save(),n.ctx.translate(yA,iA),n.ctx.transform(1,0,0,KA,0,0),n.ctx.translate(-yA,-iA),n.ctx.fillRect(k,oA*(q-iA)+iA,L,V*oA),n.ctx.restore()):n.ctx.fill())),TA.label=6;case 6:return r--,[2]}})},n=this,s=0,i=t.styles.backgroundImage.slice(0).reverse(),o.label=1;case 1:return s0?Q.style!==2?[3,5]:[4,this.renderDashedDottedBorder(Q.color,Q.width,i,t.curves,2)]:[3,11]):[3,13];case 4:return w.sent(),[3,11];case 5:return Q.style!==3?[3,7]:[4,this.renderDashedDottedBorder(Q.color,Q.width,i,t.curves,3)];case 6:return w.sent(),[3,11];case 7:return Q.style!==4?[3,9]:[4,this.renderDoubleBorder(Q.color,Q.width,i,t.curves)];case 8:return w.sent(),[3,11];case 9:return[4,this.renderSolidBorder(Q.color,i,t.curves)];case 10:w.sent(),w.label=11;case 11:i++,w.label=12;case 12:return a++,[3,3];case 13:return[2]}})})},A.prototype.renderDashedDottedBorder=function(t,r,B,n,s){return P(this,void 0,void 0,function(){var i,a,o,Q,g,w,f,c,C,H,h,F,K,p,d,l,d,l;return _(this,function(v){return this.ctx.save(),i=cQ(n,B),a=rB(n,B),s===2&&(this.path(a),this.ctx.clip()),$(a[0])?(o=a[0].start.x,Q=a[0].start.y):(o=a[0].x,Q=a[0].y),$(a[1])?(g=a[1].end.x,w=a[1].end.y):(g=a[1].x,w=a[1].y),B===0||B===2?f=Math.abs(o-g):f=Math.abs(Q-w),this.ctx.beginPath(),s===3?this.formatPath(i):this.formatPath(a.slice(0,2)),c=r<3?r*3:r*2,C=r<3?r*2:r,s===3&&(c=r,C=r),H=!0,f<=c*2?H=!1:f<=c*2+C?(h=f/(2*c+C),c*=h,C*=h):(F=Math.floor((f+C)/(c+C)),K=(f-F*c)/(F-1),p=(f-(F+1)*c)/F,C=p<=0||Math.abs(C-K)\n * Copyright (c) 2022 Niklas von Hertzen \n * Released under MIT License\n */\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nfunction __extends(d, b) {\r\n if (typeof b !== \"function\" && b !== null)\r\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nvar __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n };\r\n return __assign.apply(this, arguments);\r\n};\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nfunction __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nfunction __spreadArray(to, from, pack) {\r\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\r\n if (ar || !(i in from)) {\r\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\r\n ar[i] = from[i];\r\n }\r\n }\r\n return to.concat(ar || from);\r\n}\n\nvar Bounds = /** @class */ (function () {\n function Bounds(left, top, width, height) {\n this.left = left;\n this.top = top;\n this.width = width;\n this.height = height;\n }\n Bounds.prototype.add = function (x, y, w, h) {\n return new Bounds(this.left + x, this.top + y, this.width + w, this.height + h);\n };\n Bounds.fromClientRect = function (context, clientRect) {\n return new Bounds(clientRect.left + context.windowBounds.left, clientRect.top + context.windowBounds.top, clientRect.width, clientRect.height);\n };\n Bounds.fromDOMRectList = function (context, domRectList) {\n var domRect = Array.from(domRectList).find(function (rect) { return rect.width !== 0; });\n return domRect\n ? new Bounds(domRect.left + context.windowBounds.left, domRect.top + context.windowBounds.top, domRect.width, domRect.height)\n : Bounds.EMPTY;\n };\n Bounds.EMPTY = new Bounds(0, 0, 0, 0);\n return Bounds;\n}());\nvar parseBounds = function (context, node) {\n return Bounds.fromClientRect(context, node.getBoundingClientRect());\n};\nvar parseDocumentSize = function (document) {\n var body = document.body;\n var documentElement = document.documentElement;\n if (!body || !documentElement) {\n throw new Error(\"Unable to get document size\");\n }\n var width = Math.max(Math.max(body.scrollWidth, documentElement.scrollWidth), Math.max(body.offsetWidth, documentElement.offsetWidth), Math.max(body.clientWidth, documentElement.clientWidth));\n var height = Math.max(Math.max(body.scrollHeight, documentElement.scrollHeight), Math.max(body.offsetHeight, documentElement.offsetHeight), Math.max(body.clientHeight, documentElement.clientHeight));\n return new Bounds(0, 0, width, height);\n};\n\n/*\n * css-line-break 2.1.0 \n * Copyright (c) 2022 Niklas von Hertzen \n * Released under MIT License\n */\nvar toCodePoints$1 = function (str) {\n var codePoints = [];\n var i = 0;\n var length = str.length;\n while (i < length) {\n var value = str.charCodeAt(i++);\n if (value >= 0xd800 && value <= 0xdbff && i < length) {\n var extra = str.charCodeAt(i++);\n if ((extra & 0xfc00) === 0xdc00) {\n codePoints.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\n }\n else {\n codePoints.push(value);\n i--;\n }\n }\n else {\n codePoints.push(value);\n }\n }\n return codePoints;\n};\nvar fromCodePoint$1 = function () {\n var codePoints = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n codePoints[_i] = arguments[_i];\n }\n if (String.fromCodePoint) {\n return String.fromCodePoint.apply(String, codePoints);\n }\n var length = codePoints.length;\n if (!length) {\n return '';\n }\n var codeUnits = [];\n var index = -1;\n var result = '';\n while (++index < length) {\n var codePoint = codePoints[index];\n if (codePoint <= 0xffff) {\n codeUnits.push(codePoint);\n }\n else {\n codePoint -= 0x10000;\n codeUnits.push((codePoint >> 10) + 0xd800, (codePoint % 0x400) + 0xdc00);\n }\n if (index + 1 === length || codeUnits.length > 0x4000) {\n result += String.fromCharCode.apply(String, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n};\nvar chars$2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup$2 = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i$2 = 0; i$2 < chars$2.length; i$2++) {\n lookup$2[chars$2.charCodeAt(i$2)] = i$2;\n}\n\n/*\n * utrie 1.0.2 \n * Copyright (c) 2022 Niklas von Hertzen \n * Released under MIT License\n */\nvar chars$1$1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup$1$1 = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i$1$1 = 0; i$1$1 < chars$1$1.length; i$1$1++) {\n lookup$1$1[chars$1$1.charCodeAt(i$1$1)] = i$1$1;\n}\nvar decode$1 = function (base64) {\n var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n var buffer = typeof ArrayBuffer !== 'undefined' &&\n typeof Uint8Array !== 'undefined' &&\n typeof Uint8Array.prototype.slice !== 'undefined'\n ? new ArrayBuffer(bufferLength)\n : new Array(bufferLength);\n var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer);\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup$1$1[base64.charCodeAt(i)];\n encoded2 = lookup$1$1[base64.charCodeAt(i + 1)];\n encoded3 = lookup$1$1[base64.charCodeAt(i + 2)];\n encoded4 = lookup$1$1[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return buffer;\n};\nvar polyUint16Array$1 = function (buffer) {\n var length = buffer.length;\n var bytes = [];\n for (var i = 0; i < length; i += 2) {\n bytes.push((buffer[i + 1] << 8) | buffer[i]);\n }\n return bytes;\n};\nvar polyUint32Array$1 = function (buffer) {\n var length = buffer.length;\n var bytes = [];\n for (var i = 0; i < length; i += 4) {\n bytes.push((buffer[i + 3] << 24) | (buffer[i + 2] << 16) | (buffer[i + 1] << 8) | buffer[i]);\n }\n return bytes;\n};\n\n/** Shift size for getting the index-2 table offset. */\nvar UTRIE2_SHIFT_2$1 = 5;\n/** Shift size for getting the index-1 table offset. */\nvar UTRIE2_SHIFT_1$1 = 6 + 5;\n/**\n * Shift size for shifting left the index array values.\n * Increases possible data size with 16-bit index values at the cost\n * of compactability.\n * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY.\n */\nvar UTRIE2_INDEX_SHIFT$1 = 2;\n/**\n * Difference between the two shift sizes,\n * for getting an index-1 offset from an index-2 offset. 6=11-5\n */\nvar UTRIE2_SHIFT_1_2$1 = UTRIE2_SHIFT_1$1 - UTRIE2_SHIFT_2$1;\n/**\n * The part of the index-2 table for U+D800..U+DBFF stores values for\n * lead surrogate code _units_ not code _points_.\n * Values for lead surrogate code _points_ are indexed with this portion of the table.\n * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.)\n */\nvar UTRIE2_LSCP_INDEX_2_OFFSET$1 = 0x10000 >> UTRIE2_SHIFT_2$1;\n/** Number of entries in a data block. 32=0x20 */\nvar UTRIE2_DATA_BLOCK_LENGTH$1 = 1 << UTRIE2_SHIFT_2$1;\n/** Mask for getting the lower bits for the in-data-block offset. */\nvar UTRIE2_DATA_MASK$1 = UTRIE2_DATA_BLOCK_LENGTH$1 - 1;\nvar UTRIE2_LSCP_INDEX_2_LENGTH$1 = 0x400 >> UTRIE2_SHIFT_2$1;\n/** Count the lengths of both BMP pieces. 2080=0x820 */\nvar UTRIE2_INDEX_2_BMP_LENGTH$1 = UTRIE2_LSCP_INDEX_2_OFFSET$1 + UTRIE2_LSCP_INDEX_2_LENGTH$1;\n/**\n * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.\n * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2.\n */\nvar UTRIE2_UTF8_2B_INDEX_2_OFFSET$1 = UTRIE2_INDEX_2_BMP_LENGTH$1;\nvar UTRIE2_UTF8_2B_INDEX_2_LENGTH$1 = 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */\n/**\n * The index-1 table, only used for supplementary code points, at offset 2112=0x840.\n * Variable length, for code points up to highStart, where the last single-value range starts.\n * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1.\n * (For 0x100000 supplementary code points U+10000..U+10ffff.)\n *\n * The part of the index-2 table for supplementary code points starts\n * after this index-1 table.\n *\n * Both the index-1 table and the following part of the index-2 table\n * are omitted completely if there is only BMP data.\n */\nvar UTRIE2_INDEX_1_OFFSET$1 = UTRIE2_UTF8_2B_INDEX_2_OFFSET$1 + UTRIE2_UTF8_2B_INDEX_2_LENGTH$1;\n/**\n * Number of index-1 entries for the BMP. 32=0x20\n * This part of the index-1 table is omitted from the serialized form.\n */\nvar UTRIE2_OMITTED_BMP_INDEX_1_LENGTH$1 = 0x10000 >> UTRIE2_SHIFT_1$1;\n/** Number of entries in an index-2 block. 64=0x40 */\nvar UTRIE2_INDEX_2_BLOCK_LENGTH$1 = 1 << UTRIE2_SHIFT_1_2$1;\n/** Mask for getting the lower bits for the in-index-2-block offset. */\nvar UTRIE2_INDEX_2_MASK$1 = UTRIE2_INDEX_2_BLOCK_LENGTH$1 - 1;\nvar slice16$1 = function (view, start, end) {\n if (view.slice) {\n return view.slice(start, end);\n }\n return new Uint16Array(Array.prototype.slice.call(view, start, end));\n};\nvar slice32$1 = function (view, start, end) {\n if (view.slice) {\n return view.slice(start, end);\n }\n return new Uint32Array(Array.prototype.slice.call(view, start, end));\n};\nvar createTrieFromBase64$1 = function (base64, _byteLength) {\n var buffer = decode$1(base64);\n var view32 = Array.isArray(buffer) ? polyUint32Array$1(buffer) : new Uint32Array(buffer);\n var view16 = Array.isArray(buffer) ? polyUint16Array$1(buffer) : new Uint16Array(buffer);\n var headerLength = 24;\n var index = slice16$1(view16, headerLength / 2, view32[4] / 2);\n var data = view32[5] === 2\n ? slice16$1(view16, (headerLength + view32[4]) / 2)\n : slice32$1(view32, Math.ceil((headerLength + view32[4]) / 4));\n return new Trie$1(view32[0], view32[1], view32[2], view32[3], index, data);\n};\nvar Trie$1 = /** @class */ (function () {\n function Trie(initialValue, errorValue, highStart, highValueIndex, index, data) {\n this.initialValue = initialValue;\n this.errorValue = errorValue;\n this.highStart = highStart;\n this.highValueIndex = highValueIndex;\n this.index = index;\n this.data = data;\n }\n /**\n * Get the value for a code point as stored in the Trie.\n *\n * @param codePoint the code point\n * @return the value\n */\n Trie.prototype.get = function (codePoint) {\n var ix;\n if (codePoint >= 0) {\n if (codePoint < 0x0d800 || (codePoint > 0x0dbff && codePoint <= 0x0ffff)) {\n // Ordinary BMP code point, excluding leading surrogates.\n // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index.\n // 16 bit data is stored in the index array itself.\n ix = this.index[codePoint >> UTRIE2_SHIFT_2$1];\n ix = (ix << UTRIE2_INDEX_SHIFT$1) + (codePoint & UTRIE2_DATA_MASK$1);\n return this.data[ix];\n }\n if (codePoint <= 0xffff) {\n // Lead Surrogate Code Point. A Separate index section is stored for\n // lead surrogate code units and code points.\n // The main index has the code unit data.\n // For this function, we need the code point data.\n // Note: this expression could be refactored for slightly improved efficiency, but\n // surrogate code points will be so rare in practice that it's not worth it.\n ix = this.index[UTRIE2_LSCP_INDEX_2_OFFSET$1 + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2$1)];\n ix = (ix << UTRIE2_INDEX_SHIFT$1) + (codePoint & UTRIE2_DATA_MASK$1);\n return this.data[ix];\n }\n if (codePoint < this.highStart) {\n // Supplemental code point, use two-level lookup.\n ix = UTRIE2_INDEX_1_OFFSET$1 - UTRIE2_OMITTED_BMP_INDEX_1_LENGTH$1 + (codePoint >> UTRIE2_SHIFT_1$1);\n ix = this.index[ix];\n ix += (codePoint >> UTRIE2_SHIFT_2$1) & UTRIE2_INDEX_2_MASK$1;\n ix = this.index[ix];\n ix = (ix << UTRIE2_INDEX_SHIFT$1) + (codePoint & UTRIE2_DATA_MASK$1);\n return this.data[ix];\n }\n if (codePoint <= 0x10ffff) {\n return this.data[this.highValueIndex];\n }\n }\n // Fall through. The code point is outside of the legal range of 0..0x10ffff.\n return this.errorValue;\n };\n return Trie;\n}());\n\n/*\n * base64-arraybuffer 1.0.2 \n * Copyright (c) 2022 Niklas von Hertzen \n * Released under MIT License\n */\nvar chars$3 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup$3 = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i$3 = 0; i$3 < chars$3.length; i$3++) {\n lookup$3[chars$3.charCodeAt(i$3)] = i$3;\n}\n\nvar base64$1 = 'KwAAAAAAAAAACA4AUD0AADAgAAACAAAAAAAIABAAGABAAEgAUABYAGAAaABgAGgAYgBqAF8AZwBgAGgAcQB5AHUAfQCFAI0AlQCdAKIAqgCyALoAYABoAGAAaABgAGgAwgDKAGAAaADGAM4A0wDbAOEA6QDxAPkAAQEJAQ8BFwF1AH0AHAEkASwBNAE6AUIBQQFJAVEBWQFhAWgBcAF4ATAAgAGGAY4BlQGXAZ8BpwGvAbUBvQHFAc0B0wHbAeMB6wHxAfkBAQIJAvEBEQIZAiECKQIxAjgCQAJGAk4CVgJeAmQCbAJ0AnwCgQKJApECmQKgAqgCsAK4ArwCxAIwAMwC0wLbAjAA4wLrAvMC+AIAAwcDDwMwABcDHQMlAy0DNQN1AD0DQQNJA0kDSQNRA1EDVwNZA1kDdQB1AGEDdQBpA20DdQN1AHsDdQCBA4kDkQN1AHUAmQOhA3UAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AKYDrgN1AHUAtgO+A8YDzgPWAxcD3gPjA+sD8wN1AHUA+wMDBAkEdQANBBUEHQQlBCoEFwMyBDgEYABABBcDSARQBFgEYARoBDAAcAQzAXgEgASIBJAEdQCXBHUAnwSnBK4EtgS6BMIEyAR1AHUAdQB1AHUAdQCVANAEYABgAGAAYABgAGAAYABgANgEYADcBOQEYADsBPQE/AQEBQwFFAUcBSQFLAU0BWQEPAVEBUsFUwVbBWAAYgVgAGoFcgV6BYIFigWRBWAAmQWfBaYFYABgAGAAYABgAKoFYACxBbAFuQW6BcEFwQXHBcEFwQXPBdMF2wXjBeoF8gX6BQIGCgYSBhoGIgYqBjIGOgZgAD4GRgZMBmAAUwZaBmAAYABgAGAAYABgAGAAYABgAGAAYABgAGIGYABpBnAGYABgAGAAYABgAGAAYABgAGAAYAB4Bn8GhQZgAGAAYAB1AHcDFQSLBmAAYABgAJMGdQA9A3UAmwajBqsGqwaVALMGuwbDBjAAywbSBtIG1QbSBtIG0gbSBtIG0gbdBuMG6wbzBvsGAwcLBxMHAwcbByMHJwcsBywHMQcsB9IGOAdAB0gHTgfSBkgHVgfSBtIG0gbSBtIG0gbSBtIG0gbSBiwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdgAGAALAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdbB2MHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB2kH0gZwB64EdQB1AHUAdQB1AHUAdQB1AHUHfQdgAIUHjQd1AHUAlQedB2AAYAClB6sHYACzB7YHvgfGB3UAzgfWBzMB3gfmB1EB7gf1B/0HlQENAQUIDQh1ABUIHQglCBcDLQg1CD0IRQhNCEEDUwh1AHUAdQBbCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIcAh3CHoIMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIgggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAALAcsBywHLAcsBywHLAcsBywHLAcsB4oILAcsB44I0gaWCJ4Ipgh1AHUAqgiyCHUAdQB1AHUAdQB1AHUAdQB1AHUAtwh8AXUAvwh1AMUIyQjRCNkI4AjoCHUAdQB1AO4I9gj+CAYJDgkTCS0HGwkjCYIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiAAIAAAAFAAYABgAGIAXwBgAHEAdQBFAJUAogCyAKAAYABgAEIA4ABGANMA4QDxAMEBDwE1AFwBLAE6AQEBUQF4QkhCmEKoQrhCgAHIQsAB0MLAAcABwAHAAeDC6ABoAHDCwMMAAcABwAHAAdDDGMMAAcAB6MM4wwjDWMNow3jDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEjDqABWw6bDqABpg6gAaABoAHcDvwOPA+gAaABfA/8DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DpcPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB9cPKwkyCToJMAB1AHUAdQBCCUoJTQl1AFUJXAljCWcJawkwADAAMAAwAHMJdQB2CX4JdQCECYoJjgmWCXUAngkwAGAAYABxAHUApgn3A64JtAl1ALkJdQDACTAAMAAwADAAdQB1AHUAdQB1AHUAdQB1AHUAowYNBMUIMAAwADAAMADICcsJ0wnZCRUE4QkwAOkJ8An4CTAAMAB1AAAKvwh1AAgKDwoXCh8KdQAwACcKLgp1ADYKqAmICT4KRgowADAAdQB1AE4KMAB1AFYKdQBeCnUAZQowADAAMAAwADAAMAAwADAAMAAVBHUAbQowADAAdQC5CXUKMAAwAHwBxAijBogEMgF9CoQKiASMCpQKmgqIBKIKqgquCogEDQG2Cr4KxgrLCjAAMADTCtsKCgHjCusK8Qr5CgELMAAwADAAMAB1AIsECQsRC3UANAEZCzAAMAAwADAAMAB1ACELKQswAHUANAExCzkLdQBBC0kLMABRC1kLMAAwADAAMAAwADAAdQBhCzAAMAAwAGAAYABpC3ELdwt/CzAAMACHC4sLkwubC58Lpwt1AK4Ltgt1APsDMAAwADAAMAAwADAAMAAwAL4LwwvLC9IL1wvdCzAAMADlC+kL8Qv5C/8LSQswADAAMAAwADAAMAAwADAAMAAHDDAAMAAwADAAMAAODBYMHgx1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1ACYMMAAwADAAdQB1AHUALgx1AHUAdQB1AHUAdQA2DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AD4MdQBGDHUAdQB1AHUAdQB1AEkMdQB1AHUAdQB1AFAMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQBYDHUAdQB1AF8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUA+wMVBGcMMAAwAHwBbwx1AHcMfwyHDI8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAYABgAJcMMAAwADAAdQB1AJ8MlQClDDAAMACtDCwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB7UMLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AA0EMAC9DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAsBywHLAcsBywHLAcsBywHLQcwAMEMyAwsBywHLAcsBywHLAcsBywHLAcsBywHzAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1ANQM2QzhDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMABgAGAAYABgAGAAYABgAOkMYADxDGAA+AwADQYNYABhCWAAYAAODTAAMAAwADAAFg1gAGAAHg37AzAAMAAwADAAYABgACYNYAAsDTQNPA1gAEMNPg1LDWAAYABgAGAAYABgAGAAYABgAGAAUg1aDYsGVglhDV0NcQBnDW0NdQ15DWAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAlQCBDZUAiA2PDZcNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAnw2nDTAAMAAwADAAMAAwAHUArw23DTAAMAAwADAAMAAwADAAMAAwADAAMAB1AL8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQDHDTAAYABgAM8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA1w11ANwNMAAwAD0B5A0wADAAMAAwADAAMADsDfQN/A0EDgwOFA4wABsOMAAwADAAMAAwADAAMAAwANIG0gbSBtIG0gbSBtIG0gYjDigOwQUuDsEFMw7SBjoO0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGQg5KDlIOVg7SBtIGXg5lDm0OdQ7SBtIGfQ6EDooOjQ6UDtIGmg6hDtIG0gaoDqwO0ga0DrwO0gZgAGAAYADEDmAAYAAkBtIGzA5gANIOYADaDokO0gbSBt8O5w7SBu8O0gb1DvwO0gZgAGAAxA7SBtIG0gbSBtIGYABgAGAAYAAED2AAsAUMD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHJA8sBywHLAcsBywHLAccDywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywPLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAc0D9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHPA/SBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gYUD0QPlQCVAJUAMAAwADAAMACVAJUAlQCVAJUAlQCVAEwPMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA//8EAAQABAAEAAQABAAEAAQABAANAAMAAQABAAIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACgATABcAHgAbABoAHgAXABYAEgAeABsAGAAPABgAHABLAEsASwBLAEsASwBLAEsASwBLABgAGAAeAB4AHgATAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAGwASAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWAA0AEQAeAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAFAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJABYAGgAbABsAGwAeAB0AHQAeAE8AFwAeAA0AHgAeABoAGwBPAE8ADgBQAB0AHQAdAE8ATwAXAE8ATwBPABYAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwBWAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsABAAbABsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEAA0ADQBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABABQACsAKwArACsAKwArACsAKwAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUAAaABoAUABQAFAAUABQAEwAHgAbAFAAHgAEACsAKwAEAAQABAArAFAAUABQAFAAUABQACsAKwArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQACsAUABQACsAKwAEACsABAAEAAQABAAEACsAKwArACsABAAEACsAKwAEAAQABAArACsAKwAEACsAKwArACsAKwArACsAUABQAFAAUAArAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAAQABABQAFAAUAAEAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAArACsAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AGwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAKwArACsAKwArAAQABAAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAAQAUAArAFAAUABQAFAAUABQACsAKwArAFAAUABQACsAUABQAFAAUAArACsAKwBQAFAAKwBQACsAUABQACsAKwArAFAAUAArACsAKwBQAFAAUAArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAArACsAKwAEAAQABAArAAQABAAEAAQAKwArAFAAKwArACsAKwArACsABAArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAHgAeAB4AHgAeAB4AGwAeACsAKwArACsAKwAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAUABQAFAAKwArACsAKwArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwAOAFAAUABQAFAAUABQAFAAHgBQAAQABAAEAA4AUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAKwArAAQAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAKwArACsAKwArACsAUAArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAXABcAFwAXABcACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAXAArAFwAXABcAFwAXABcAFwAXABcAFwAKgBcAFwAKgAqACoAKgAqACoAKgAqACoAXAArACsAXABcAFwAXABcACsAXAArACoAKgAqACoAKgAqACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwBcAFwAXABcAFAADgAOAA4ADgAeAA4ADgAJAA4ADgANAAkAEwATABMAEwATAAkAHgATAB4AHgAeAAQABAAeAB4AHgAeAB4AHgBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAADQAEAB4ABAAeAAQAFgARABYAEQAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAAQABAAEAAQADQAEAAQAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAA0ADQAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeACsAHgAeAA4ADgANAA4AHgAeAB4AHgAeAAkACQArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgBcAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4AHgAeAB4AXABcAFwAXABcAFwAKgAqACoAKgBcAFwAXABcACoAKgAqAFwAKgAqACoAXABcACoAKgAqACoAKgAqACoAXABcAFwAKgAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwAKgBLAEsASwBLAEsASwBLAEsASwBLACoAKgAqACoAKgAqAFAAUABQAFAAUABQACsAUAArACsAKwArACsAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAKwBQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsABAAEAAQAHgANAB4AHgAeAB4AHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUAArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWABEAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAANAA0AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUAArAAQABAArACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAA0ADQAVAFwADQAeAA0AGwBcACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwAeAB4AEwATAA0ADQAOAB4AEwATAB4ABAAEAAQACQArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAHgArACsAKwATABMASwBLAEsASwBLAEsASwBLAEsASwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAXABcAFwAXABcACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXAArACsAKwAqACoAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsAHgAeAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKwArAAQASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACoAKgAqACoAKgAqACoAXAAqACoAKgAqACoAKgArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABABQAFAAUABQAFAAUABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgANAA0ADQANAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwAeAB4AHgAeAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArAA0ADQANAA0ADQBLAEsASwBLAEsASwBLAEsASwBLACsAKwArAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUAAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAAQAUABQAFAAUABQAFAABABQAFAABAAEAAQAUAArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQACsAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQACsAKwAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQACsAHgAeAB4AHgAeAB4AHgAOAB4AKwANAA0ADQANAA0ADQANAAkADQANAA0ACAAEAAsABAAEAA0ACQANAA0ADAAdAB0AHgAXABcAFgAXABcAFwAWABcAHQAdAB4AHgAUABQAFAANAAEAAQAEAAQABAAEAAQACQAaABoAGgAaABoAGgAaABoAHgAXABcAHQAVABUAHgAeAB4AHgAeAB4AGAAWABEAFQAVABUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ADQAeAA0ADQANAA0AHgANAA0ADQAHAB4AHgAeAB4AKwAEAAQABAAEAAQABAAEAAQABAAEAFAAUAArACsATwBQAFAAUABQAFAAHgAeAB4AFgARAE8AUABPAE8ATwBPAFAAUABQAFAAUAAeAB4AHgAWABEAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArABsAGwAbABsAGwAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGgAbABsAGwAbABoAGwAbABoAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAFAAGgAeAB0AHgBQAB4AGgAeAB4AHgAeAB4AHgAeAB4AHgBPAB4AUAAbAB4AHgBQAFAAUABQAFAAHgAeAB4AHQAdAB4AUAAeAFAAHgBQAB4AUABPAFAAUAAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgBQAFAAUABQAE8ATwBQAFAAUABQAFAATwBQAFAATwBQAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAUABQAFAATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABPAB4AHgArACsAKwArAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAdAB4AHgAeAB0AHQAeAB4AHQAeAB4AHgAdAB4AHQAbABsAHgAdAB4AHgAeAB4AHQAeAB4AHQAdAB0AHQAeAB4AHQAeAB0AHgAdAB0AHQAdAB0AHQAeAB0AHgAeAB4AHgAeAB0AHQAdAB0AHgAeAB4AHgAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB0AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAdAB0AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHQAdAB0AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHQAdAB4AHgAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AJQAlAB0AHQAlAB4AJQAlACUAIAAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAeAB0AJQAdAB0AHgAdAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAdAB0AHQAdACUAHgAlACUAJQAdACUAJQAdAB0AHQAlACUAHQAdACUAHQAdACUAJQAlAB4AHQAeAB4AHgAeAB0AHQAlAB0AHQAdAB0AHQAdACUAJQAlACUAJQAdACUAJQAgACUAHQAdACUAJQAlACUAJQAlACUAJQAeAB4AHgAlACUAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AFwAXABcAFwAXABcAHgATABMAJQAeAB4AHgAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARABYAEQAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANAA0AHgANAB4ADQANAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwAlACUAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACsAKwArACsAKwArACsAKwArACsAKwArAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBPAE8ATwBPAE8ATwBPAE8AJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeAAQAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUABQAAQAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAUABQAFAAUABQAAQABAAEACsABAAEACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAKwBQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAA0ADQANAA0ADQANAA0ADQAeACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAArACsAKwArAFAAUABQAFAAUAANAA0ADQANAA0ADQAUACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQANAA0ADQANAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAANACsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAB4AHgAeAB4AHgArACsAKwArACsAKwAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANAFAABAAEAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAEAAQABAAEAB4ABAAEAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsABAAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLAA0ADQArAB4ABABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUAAeAFAAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAAEAAQADgANAA0AEwATAB4AHgAeAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAFAAUABQAFAABAAEACsAKwAEAA0ADQAeAFAAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcAFwADQANAA0AKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQAKwAEAAQAKwArAAQABAAEAAQAUAAEAFAABAAEAA0ADQANACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABABQAA4AUAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANAFAADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAaABoAGgAaAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAJAAkACQAJAAkACQAJABYAEQArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AHgAeACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAARwBHABUARwAJACsAKwArACsAKwArACsAKwArACsAKwAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAKwArACsAKwArACsAKwArACsAKwArACsAKwBRAFEAUQBRACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAHgAEAAQADQAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAeAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQAHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAKwArAFAAKwArAFAAUAArACsAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAHgAeAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeACsAKwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4ABAAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAHgAeAA0ADQANAA0AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArAAQABAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwBQAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArABsAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAB4AHgAeAB4ABAAEAAQABAAEAAQABABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArABYAFgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAGgBQAFAAUAAaAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUAArACsAKwArACsAKwBQACsAKwArACsAUAArAFAAKwBQACsAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUAArAFAAKwBQACsAUAArAFAAUAArAFAAKwArAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAKwBQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeACUAJQAlAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAHgAlACUAJQAlACUAIAAgACAAJQAlACAAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACEAIQAhACEAIQAlACUAIAAgACUAJQAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAlACUAJQAlACAAIAAgACUAIAAgACAAJQAlACUAJQAlACUAJQAgACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAlAB4AJQAeACUAJQAlACUAJQAgACUAJQAlACUAHgAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACAAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABcAFwAXABUAFQAVAB4AHgAeAB4AJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAgACUAJQAgACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAIAAgACUAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACAAIAAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACAAIAAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAA==';\n\nvar LETTER_NUMBER_MODIFIER = 50;\n// Non-tailorable Line Breaking Classes\nvar BK = 1; // Cause a line break (after)\nvar CR$1 = 2; // Cause a line break (after), except between CR and LF\nvar LF$1 = 3; // Cause a line break (after)\nvar CM = 4; // Prohibit a line break between the character and the preceding character\nvar NL = 5; // Cause a line break (after)\nvar WJ = 7; // Prohibit line breaks before and after\nvar ZW = 8; // Provide a break opportunity\nvar GL = 9; // Prohibit line breaks before and after\nvar SP = 10; // Enable indirect line breaks\nvar ZWJ$1 = 11; // Prohibit line breaks within joiner sequences\n// Break Opportunities\nvar B2 = 12; // Provide a line break opportunity before and after the character\nvar BA = 13; // Generally provide a line break opportunity after the character\nvar BB = 14; // Generally provide a line break opportunity before the character\nvar HY = 15; // Provide a line break opportunity after the character, except in numeric context\nvar CB = 16; // Provide a line break opportunity contingent on additional information\n// Characters Prohibiting Certain Breaks\nvar CL = 17; // Prohibit line breaks before\nvar CP = 18; // Prohibit line breaks before\nvar EX = 19; // Prohibit line breaks before\nvar IN = 20; // Allow only indirect line breaks between pairs\nvar NS = 21; // Allow only indirect line breaks before\nvar OP = 22; // Prohibit line breaks after\nvar QU = 23; // Act like they are both opening and closing\n// Numeric Context\nvar IS = 24; // Prevent breaks after any and before numeric\nvar NU = 25; // Form numeric expressions for line breaking purposes\nvar PO = 26; // Do not break following a numeric expression\nvar PR = 27; // Do not break in front of a numeric expression\nvar SY = 28; // Prevent a break before; and allow a break after\n// Other Characters\nvar AI = 29; // Act like AL when the resolvedEAW is N; otherwise; act as ID\nvar AL = 30; // Are alphabetic characters or symbols that are used with alphabetic characters\nvar CJ = 31; // Treat as NS or ID for strict or normal breaking.\nvar EB = 32; // Do not break from following Emoji Modifier\nvar EM = 33; // Do not break from preceding Emoji Base\nvar H2 = 34; // Form Korean syllable blocks\nvar H3 = 35; // Form Korean syllable blocks\nvar HL = 36; // Do not break around a following hyphen; otherwise act as Alphabetic\nvar ID = 37; // Break before or after; except in some numeric context\nvar JL = 38; // Form Korean syllable blocks\nvar JV = 39; // Form Korean syllable blocks\nvar JT = 40; // Form Korean syllable blocks\nvar RI$1 = 41; // Keep pairs together. For pairs; break before and after other classes\nvar SA = 42; // Provide a line break opportunity contingent on additional, language-specific context analysis\nvar XX = 43; // Have as yet unknown line breaking behavior or unassigned code positions\nvar ea_OP = [0x2329, 0xff08];\nvar BREAK_MANDATORY = '!';\nvar BREAK_NOT_ALLOWED$1 = '×';\nvar BREAK_ALLOWED$1 = '÷';\nvar UnicodeTrie$1 = createTrieFromBase64$1(base64$1);\nvar ALPHABETICS = [AL, HL];\nvar HARD_LINE_BREAKS = [BK, CR$1, LF$1, NL];\nvar SPACE$1 = [SP, ZW];\nvar PREFIX_POSTFIX = [PR, PO];\nvar LINE_BREAKS = HARD_LINE_BREAKS.concat(SPACE$1);\nvar KOREAN_SYLLABLE_BLOCK = [JL, JV, JT, H2, H3];\nvar HYPHEN = [HY, BA];\nvar codePointsToCharacterClasses = function (codePoints, lineBreak) {\n if (lineBreak === void 0) { lineBreak = 'strict'; }\n var types = [];\n var indices = [];\n var categories = [];\n codePoints.forEach(function (codePoint, index) {\n var classType = UnicodeTrie$1.get(codePoint);\n if (classType > LETTER_NUMBER_MODIFIER) {\n categories.push(true);\n classType -= LETTER_NUMBER_MODIFIER;\n }\n else {\n categories.push(false);\n }\n if (['normal', 'auto', 'loose'].indexOf(lineBreak) !== -1) {\n // U+2010, – U+2013, 〜 U+301C, ゠ U+30A0\n if ([0x2010, 0x2013, 0x301c, 0x30a0].indexOf(codePoint) !== -1) {\n indices.push(index);\n return types.push(CB);\n }\n }\n if (classType === CM || classType === ZWJ$1) {\n // LB10 Treat any remaining combining mark or ZWJ as AL.\n if (index === 0) {\n indices.push(index);\n return types.push(AL);\n }\n // LB9 Do not break a combining character sequence; treat it as if it has the line breaking class of\n // the base character in all of the following rules. Treat ZWJ as if it were CM.\n var prev = types[index - 1];\n if (LINE_BREAKS.indexOf(prev) === -1) {\n indices.push(indices[index - 1]);\n return types.push(prev);\n }\n indices.push(index);\n return types.push(AL);\n }\n indices.push(index);\n if (classType === CJ) {\n return types.push(lineBreak === 'strict' ? NS : ID);\n }\n if (classType === SA) {\n return types.push(AL);\n }\n if (classType === AI) {\n return types.push(AL);\n }\n // For supplementary characters, a useful default is to treat characters in the range 10000..1FFFD as AL\n // and characters in the ranges 20000..2FFFD and 30000..3FFFD as ID, until the implementation can be revised\n // to take into account the actual line breaking properties for these characters.\n if (classType === XX) {\n if ((codePoint >= 0x20000 && codePoint <= 0x2fffd) || (codePoint >= 0x30000 && codePoint <= 0x3fffd)) {\n return types.push(ID);\n }\n else {\n return types.push(AL);\n }\n }\n types.push(classType);\n });\n return [indices, types, categories];\n};\nvar isAdjacentWithSpaceIgnored = function (a, b, currentIndex, classTypes) {\n var current = classTypes[currentIndex];\n if (Array.isArray(a) ? a.indexOf(current) !== -1 : a === current) {\n var i = currentIndex;\n while (i <= classTypes.length) {\n i++;\n var next = classTypes[i];\n if (next === b) {\n return true;\n }\n if (next !== SP) {\n break;\n }\n }\n }\n if (current === SP) {\n var i = currentIndex;\n while (i > 0) {\n i--;\n var prev = classTypes[i];\n if (Array.isArray(a) ? a.indexOf(prev) !== -1 : a === prev) {\n var n = currentIndex;\n while (n <= classTypes.length) {\n n++;\n var next = classTypes[n];\n if (next === b) {\n return true;\n }\n if (next !== SP) {\n break;\n }\n }\n }\n if (prev !== SP) {\n break;\n }\n }\n }\n return false;\n};\nvar previousNonSpaceClassType = function (currentIndex, classTypes) {\n var i = currentIndex;\n while (i >= 0) {\n var type = classTypes[i];\n if (type === SP) {\n i--;\n }\n else {\n return type;\n }\n }\n return 0;\n};\nvar _lineBreakAtIndex = function (codePoints, classTypes, indicies, index, forbiddenBreaks) {\n if (indicies[index] === 0) {\n return BREAK_NOT_ALLOWED$1;\n }\n var currentIndex = index - 1;\n if (Array.isArray(forbiddenBreaks) && forbiddenBreaks[currentIndex] === true) {\n return BREAK_NOT_ALLOWED$1;\n }\n var beforeIndex = currentIndex - 1;\n var afterIndex = currentIndex + 1;\n var current = classTypes[currentIndex];\n // LB4 Always break after hard line breaks.\n // LB5 Treat CR followed by LF, as well as CR, LF, and NL as hard line breaks.\n var before = beforeIndex >= 0 ? classTypes[beforeIndex] : 0;\n var next = classTypes[afterIndex];\n if (current === CR$1 && next === LF$1) {\n return BREAK_NOT_ALLOWED$1;\n }\n if (HARD_LINE_BREAKS.indexOf(current) !== -1) {\n return BREAK_MANDATORY;\n }\n // LB6 Do not break before hard line breaks.\n if (HARD_LINE_BREAKS.indexOf(next) !== -1) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB7 Do not break before spaces or zero width space.\n if (SPACE$1.indexOf(next) !== -1) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB8 Break before any character following a zero-width space, even if one or more spaces intervene.\n if (previousNonSpaceClassType(currentIndex, classTypes) === ZW) {\n return BREAK_ALLOWED$1;\n }\n // LB8a Do not break after a zero width joiner.\n if (UnicodeTrie$1.get(codePoints[currentIndex]) === ZWJ$1) {\n return BREAK_NOT_ALLOWED$1;\n }\n // zwj emojis\n if ((current === EB || current === EM) && UnicodeTrie$1.get(codePoints[afterIndex]) === ZWJ$1) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB11 Do not break before or after Word joiner and related characters.\n if (current === WJ || next === WJ) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB12 Do not break after NBSP and related characters.\n if (current === GL) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB12a Do not break before NBSP and related characters, except after spaces and hyphens.\n if ([SP, BA, HY].indexOf(current) === -1 && next === GL) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces.\n if ([CL, CP, EX, IS, SY].indexOf(next) !== -1) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB14 Do not break after ‘[’, even after spaces.\n if (previousNonSpaceClassType(currentIndex, classTypes) === OP) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB15 Do not break within ‘”[’, even with intervening spaces.\n if (isAdjacentWithSpaceIgnored(QU, OP, currentIndex, classTypes)) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB16 Do not break between closing punctuation and a nonstarter (lb=NS), even with intervening spaces.\n if (isAdjacentWithSpaceIgnored([CL, CP], NS, currentIndex, classTypes)) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB17 Do not break within ‘——’, even with intervening spaces.\n if (isAdjacentWithSpaceIgnored(B2, B2, currentIndex, classTypes)) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB18 Break after spaces.\n if (current === SP) {\n return BREAK_ALLOWED$1;\n }\n // LB19 Do not break before or after quotation marks, such as ‘ ” ’.\n if (current === QU || next === QU) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB20 Break before and after unresolved CB.\n if (next === CB || current === CB) {\n return BREAK_ALLOWED$1;\n }\n // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small kana, and other non-starters, or after acute accents.\n if ([BA, HY, NS].indexOf(next) !== -1 || current === BB) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB21a Don't break after Hebrew + Hyphen.\n if (before === HL && HYPHEN.indexOf(current) !== -1) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB21b Don’t break between Solidus and Hebrew letters.\n if (current === SY && next === HL) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB22 Do not break before ellipsis.\n if (next === IN) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB23 Do not break between digits and letters.\n if ((ALPHABETICS.indexOf(next) !== -1 && current === NU) || (ALPHABETICS.indexOf(current) !== -1 && next === NU)) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB23a Do not break between numeric prefixes and ideographs, or between ideographs and numeric postfixes.\n if ((current === PR && [ID, EB, EM].indexOf(next) !== -1) ||\n ([ID, EB, EM].indexOf(current) !== -1 && next === PO)) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB24 Do not break between numeric prefix/postfix and letters, or between letters and prefix/postfix.\n if ((ALPHABETICS.indexOf(current) !== -1 && PREFIX_POSTFIX.indexOf(next) !== -1) ||\n (PREFIX_POSTFIX.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1)) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB25 Do not break between the following pairs of classes relevant to numbers:\n if (\n // (PR | PO) × ( OP | HY )? NU\n ([PR, PO].indexOf(current) !== -1 &&\n (next === NU || ([OP, HY].indexOf(next) !== -1 && classTypes[afterIndex + 1] === NU))) ||\n // ( OP | HY ) × NU\n ([OP, HY].indexOf(current) !== -1 && next === NU) ||\n // NU ×\t(NU | SY | IS)\n (current === NU && [NU, SY, IS].indexOf(next) !== -1)) {\n return BREAK_NOT_ALLOWED$1;\n }\n // NU (NU | SY | IS)* × (NU | SY | IS | CL | CP)\n if ([NU, SY, IS, CL, CP].indexOf(next) !== -1) {\n var prevIndex = currentIndex;\n while (prevIndex >= 0) {\n var type = classTypes[prevIndex];\n if (type === NU) {\n return BREAK_NOT_ALLOWED$1;\n }\n else if ([SY, IS].indexOf(type) !== -1) {\n prevIndex--;\n }\n else {\n break;\n }\n }\n }\n // NU (NU | SY | IS)* (CL | CP)? × (PO | PR))\n if ([PR, PO].indexOf(next) !== -1) {\n var prevIndex = [CL, CP].indexOf(current) !== -1 ? beforeIndex : currentIndex;\n while (prevIndex >= 0) {\n var type = classTypes[prevIndex];\n if (type === NU) {\n return BREAK_NOT_ALLOWED$1;\n }\n else if ([SY, IS].indexOf(type) !== -1) {\n prevIndex--;\n }\n else {\n break;\n }\n }\n }\n // LB26 Do not break a Korean syllable.\n if ((JL === current && [JL, JV, H2, H3].indexOf(next) !== -1) ||\n ([JV, H2].indexOf(current) !== -1 && [JV, JT].indexOf(next) !== -1) ||\n ([JT, H3].indexOf(current) !== -1 && next === JT)) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB27 Treat a Korean Syllable Block the same as ID.\n if ((KOREAN_SYLLABLE_BLOCK.indexOf(current) !== -1 && [IN, PO].indexOf(next) !== -1) ||\n (KOREAN_SYLLABLE_BLOCK.indexOf(next) !== -1 && current === PR)) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB28 Do not break between alphabetics (“at”).\n if (ALPHABETICS.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”).\n if (current === IS && ALPHABETICS.indexOf(next) !== -1) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB30 Do not break between letters, numbers, or ordinary symbols and opening or closing parentheses.\n if ((ALPHABETICS.concat(NU).indexOf(current) !== -1 &&\n next === OP &&\n ea_OP.indexOf(codePoints[afterIndex]) === -1) ||\n (ALPHABETICS.concat(NU).indexOf(next) !== -1 && current === CP)) {\n return BREAK_NOT_ALLOWED$1;\n }\n // LB30a Break between two regional indicator symbols if and only if there are an even number of regional\n // indicators preceding the position of the break.\n if (current === RI$1 && next === RI$1) {\n var i = indicies[currentIndex];\n var count = 1;\n while (i > 0) {\n i--;\n if (classTypes[i] === RI$1) {\n count++;\n }\n else {\n break;\n }\n }\n if (count % 2 !== 0) {\n return BREAK_NOT_ALLOWED$1;\n }\n }\n // LB30b Do not break between an emoji base and an emoji modifier.\n if (current === EB && next === EM) {\n return BREAK_NOT_ALLOWED$1;\n }\n return BREAK_ALLOWED$1;\n};\nvar cssFormattedClasses = function (codePoints, options) {\n if (!options) {\n options = { lineBreak: 'normal', wordBreak: 'normal' };\n }\n var _a = codePointsToCharacterClasses(codePoints, options.lineBreak), indicies = _a[0], classTypes = _a[1], isLetterNumber = _a[2];\n if (options.wordBreak === 'break-all' || options.wordBreak === 'break-word') {\n classTypes = classTypes.map(function (type) { return ([NU, AL, SA].indexOf(type) !== -1 ? ID : type); });\n }\n var forbiddenBreakpoints = options.wordBreak === 'keep-all'\n ? isLetterNumber.map(function (letterNumber, i) {\n return letterNumber && codePoints[i] >= 0x4e00 && codePoints[i] <= 0x9fff;\n })\n : undefined;\n return [indicies, classTypes, forbiddenBreakpoints];\n};\nvar Break = /** @class */ (function () {\n function Break(codePoints, lineBreak, start, end) {\n this.codePoints = codePoints;\n this.required = lineBreak === BREAK_MANDATORY;\n this.start = start;\n this.end = end;\n }\n Break.prototype.slice = function () {\n return fromCodePoint$1.apply(void 0, this.codePoints.slice(this.start, this.end));\n };\n return Break;\n}());\nvar LineBreaker = function (str, options) {\n var codePoints = toCodePoints$1(str);\n var _a = cssFormattedClasses(codePoints, options), indicies = _a[0], classTypes = _a[1], forbiddenBreakpoints = _a[2];\n var length = codePoints.length;\n var lastEnd = 0;\n var nextIndex = 0;\n return {\n next: function () {\n if (nextIndex >= length) {\n return { done: true, value: null };\n }\n var lineBreak = BREAK_NOT_ALLOWED$1;\n while (nextIndex < length &&\n (lineBreak = _lineBreakAtIndex(codePoints, classTypes, indicies, ++nextIndex, forbiddenBreakpoints)) ===\n BREAK_NOT_ALLOWED$1) { }\n if (lineBreak !== BREAK_NOT_ALLOWED$1 || nextIndex === length) {\n var value = new Break(codePoints, lineBreak, lastEnd, nextIndex);\n lastEnd = nextIndex;\n return { value: value, done: false };\n }\n return { done: true, value: null };\n },\n };\n};\n\n// https://www.w3.org/TR/css-syntax-3\nvar FLAG_UNRESTRICTED = 1 << 0;\nvar FLAG_ID = 1 << 1;\nvar FLAG_INTEGER = 1 << 2;\nvar FLAG_NUMBER = 1 << 3;\nvar LINE_FEED = 0x000a;\nvar SOLIDUS = 0x002f;\nvar REVERSE_SOLIDUS = 0x005c;\nvar CHARACTER_TABULATION = 0x0009;\nvar SPACE = 0x0020;\nvar QUOTATION_MARK = 0x0022;\nvar EQUALS_SIGN = 0x003d;\nvar NUMBER_SIGN = 0x0023;\nvar DOLLAR_SIGN = 0x0024;\nvar PERCENTAGE_SIGN = 0x0025;\nvar APOSTROPHE = 0x0027;\nvar LEFT_PARENTHESIS = 0x0028;\nvar RIGHT_PARENTHESIS = 0x0029;\nvar LOW_LINE = 0x005f;\nvar HYPHEN_MINUS = 0x002d;\nvar EXCLAMATION_MARK = 0x0021;\nvar LESS_THAN_SIGN = 0x003c;\nvar GREATER_THAN_SIGN = 0x003e;\nvar COMMERCIAL_AT = 0x0040;\nvar LEFT_SQUARE_BRACKET = 0x005b;\nvar RIGHT_SQUARE_BRACKET = 0x005d;\nvar CIRCUMFLEX_ACCENT = 0x003d;\nvar LEFT_CURLY_BRACKET = 0x007b;\nvar QUESTION_MARK = 0x003f;\nvar RIGHT_CURLY_BRACKET = 0x007d;\nvar VERTICAL_LINE = 0x007c;\nvar TILDE = 0x007e;\nvar CONTROL = 0x0080;\nvar REPLACEMENT_CHARACTER = 0xfffd;\nvar ASTERISK = 0x002a;\nvar PLUS_SIGN = 0x002b;\nvar COMMA = 0x002c;\nvar COLON = 0x003a;\nvar SEMICOLON = 0x003b;\nvar FULL_STOP = 0x002e;\nvar NULL = 0x0000;\nvar BACKSPACE = 0x0008;\nvar LINE_TABULATION = 0x000b;\nvar SHIFT_OUT = 0x000e;\nvar INFORMATION_SEPARATOR_ONE = 0x001f;\nvar DELETE = 0x007f;\nvar EOF = -1;\nvar ZERO = 0x0030;\nvar a = 0x0061;\nvar e = 0x0065;\nvar f = 0x0066;\nvar u = 0x0075;\nvar z = 0x007a;\nvar A = 0x0041;\nvar E = 0x0045;\nvar F = 0x0046;\nvar U = 0x0055;\nvar Z = 0x005a;\nvar isDigit = function (codePoint) { return codePoint >= ZERO && codePoint <= 0x0039; };\nvar isSurrogateCodePoint = function (codePoint) { return codePoint >= 0xd800 && codePoint <= 0xdfff; };\nvar isHex = function (codePoint) {\n return isDigit(codePoint) || (codePoint >= A && codePoint <= F) || (codePoint >= a && codePoint <= f);\n};\nvar isLowerCaseLetter = function (codePoint) { return codePoint >= a && codePoint <= z; };\nvar isUpperCaseLetter = function (codePoint) { return codePoint >= A && codePoint <= Z; };\nvar isLetter = function (codePoint) { return isLowerCaseLetter(codePoint) || isUpperCaseLetter(codePoint); };\nvar isNonASCIICodePoint = function (codePoint) { return codePoint >= CONTROL; };\nvar isWhiteSpace = function (codePoint) {\n return codePoint === LINE_FEED || codePoint === CHARACTER_TABULATION || codePoint === SPACE;\n};\nvar isNameStartCodePoint = function (codePoint) {\n return isLetter(codePoint) || isNonASCIICodePoint(codePoint) || codePoint === LOW_LINE;\n};\nvar isNameCodePoint = function (codePoint) {\n return isNameStartCodePoint(codePoint) || isDigit(codePoint) || codePoint === HYPHEN_MINUS;\n};\nvar isNonPrintableCodePoint = function (codePoint) {\n return ((codePoint >= NULL && codePoint <= BACKSPACE) ||\n codePoint === LINE_TABULATION ||\n (codePoint >= SHIFT_OUT && codePoint <= INFORMATION_SEPARATOR_ONE) ||\n codePoint === DELETE);\n};\nvar isValidEscape = function (c1, c2) {\n if (c1 !== REVERSE_SOLIDUS) {\n return false;\n }\n return c2 !== LINE_FEED;\n};\nvar isIdentifierStart = function (c1, c2, c3) {\n if (c1 === HYPHEN_MINUS) {\n return isNameStartCodePoint(c2) || isValidEscape(c2, c3);\n }\n else if (isNameStartCodePoint(c1)) {\n return true;\n }\n else if (c1 === REVERSE_SOLIDUS && isValidEscape(c1, c2)) {\n return true;\n }\n return false;\n};\nvar isNumberStart = function (c1, c2, c3) {\n if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {\n if (isDigit(c2)) {\n return true;\n }\n return c2 === FULL_STOP && isDigit(c3);\n }\n if (c1 === FULL_STOP) {\n return isDigit(c2);\n }\n return isDigit(c1);\n};\nvar stringToNumber = function (codePoints) {\n var c = 0;\n var sign = 1;\n if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {\n if (codePoints[c] === HYPHEN_MINUS) {\n sign = -1;\n }\n c++;\n }\n var integers = [];\n while (isDigit(codePoints[c])) {\n integers.push(codePoints[c++]);\n }\n var int = integers.length ? parseInt(fromCodePoint$1.apply(void 0, integers), 10) : 0;\n if (codePoints[c] === FULL_STOP) {\n c++;\n }\n var fraction = [];\n while (isDigit(codePoints[c])) {\n fraction.push(codePoints[c++]);\n }\n var fracd = fraction.length;\n var frac = fracd ? parseInt(fromCodePoint$1.apply(void 0, fraction), 10) : 0;\n if (codePoints[c] === E || codePoints[c] === e) {\n c++;\n }\n var expsign = 1;\n if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) {\n if (codePoints[c] === HYPHEN_MINUS) {\n expsign = -1;\n }\n c++;\n }\n var exponent = [];\n while (isDigit(codePoints[c])) {\n exponent.push(codePoints[c++]);\n }\n var exp = exponent.length ? parseInt(fromCodePoint$1.apply(void 0, exponent), 10) : 0;\n return sign * (int + frac * Math.pow(10, -fracd)) * Math.pow(10, expsign * exp);\n};\nvar LEFT_PARENTHESIS_TOKEN = {\n type: 2 /* LEFT_PARENTHESIS_TOKEN */\n};\nvar RIGHT_PARENTHESIS_TOKEN = {\n type: 3 /* RIGHT_PARENTHESIS_TOKEN */\n};\nvar COMMA_TOKEN = { type: 4 /* COMMA_TOKEN */ };\nvar SUFFIX_MATCH_TOKEN = { type: 13 /* SUFFIX_MATCH_TOKEN */ };\nvar PREFIX_MATCH_TOKEN = { type: 8 /* PREFIX_MATCH_TOKEN */ };\nvar COLUMN_TOKEN = { type: 21 /* COLUMN_TOKEN */ };\nvar DASH_MATCH_TOKEN = { type: 9 /* DASH_MATCH_TOKEN */ };\nvar INCLUDE_MATCH_TOKEN = { type: 10 /* INCLUDE_MATCH_TOKEN */ };\nvar LEFT_CURLY_BRACKET_TOKEN = {\n type: 11 /* LEFT_CURLY_BRACKET_TOKEN */\n};\nvar RIGHT_CURLY_BRACKET_TOKEN = {\n type: 12 /* RIGHT_CURLY_BRACKET_TOKEN */\n};\nvar SUBSTRING_MATCH_TOKEN = { type: 14 /* SUBSTRING_MATCH_TOKEN */ };\nvar BAD_URL_TOKEN = { type: 23 /* BAD_URL_TOKEN */ };\nvar BAD_STRING_TOKEN = { type: 1 /* BAD_STRING_TOKEN */ };\nvar CDO_TOKEN = { type: 25 /* CDO_TOKEN */ };\nvar CDC_TOKEN = { type: 24 /* CDC_TOKEN */ };\nvar COLON_TOKEN = { type: 26 /* COLON_TOKEN */ };\nvar SEMICOLON_TOKEN = { type: 27 /* SEMICOLON_TOKEN */ };\nvar LEFT_SQUARE_BRACKET_TOKEN = {\n type: 28 /* LEFT_SQUARE_BRACKET_TOKEN */\n};\nvar RIGHT_SQUARE_BRACKET_TOKEN = {\n type: 29 /* RIGHT_SQUARE_BRACKET_TOKEN */\n};\nvar WHITESPACE_TOKEN = { type: 31 /* WHITESPACE_TOKEN */ };\nvar EOF_TOKEN = { type: 32 /* EOF_TOKEN */ };\nvar Tokenizer = /** @class */ (function () {\n function Tokenizer() {\n this._value = [];\n }\n Tokenizer.prototype.write = function (chunk) {\n this._value = this._value.concat(toCodePoints$1(chunk));\n };\n Tokenizer.prototype.read = function () {\n var tokens = [];\n var token = this.consumeToken();\n while (token !== EOF_TOKEN) {\n tokens.push(token);\n token = this.consumeToken();\n }\n return tokens;\n };\n Tokenizer.prototype.consumeToken = function () {\n var codePoint = this.consumeCodePoint();\n switch (codePoint) {\n case QUOTATION_MARK:\n return this.consumeStringToken(QUOTATION_MARK);\n case NUMBER_SIGN:\n var c1 = this.peekCodePoint(0);\n var c2 = this.peekCodePoint(1);\n var c3 = this.peekCodePoint(2);\n if (isNameCodePoint(c1) || isValidEscape(c2, c3)) {\n var flags = isIdentifierStart(c1, c2, c3) ? FLAG_ID : FLAG_UNRESTRICTED;\n var value = this.consumeName();\n return { type: 5 /* HASH_TOKEN */, value: value, flags: flags };\n }\n break;\n case DOLLAR_SIGN:\n if (this.peekCodePoint(0) === EQUALS_SIGN) {\n this.consumeCodePoint();\n return SUFFIX_MATCH_TOKEN;\n }\n break;\n case APOSTROPHE:\n return this.consumeStringToken(APOSTROPHE);\n case LEFT_PARENTHESIS:\n return LEFT_PARENTHESIS_TOKEN;\n case RIGHT_PARENTHESIS:\n return RIGHT_PARENTHESIS_TOKEN;\n case ASTERISK:\n if (this.peekCodePoint(0) === EQUALS_SIGN) {\n this.consumeCodePoint();\n return SUBSTRING_MATCH_TOKEN;\n }\n break;\n case PLUS_SIGN:\n if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeNumericToken();\n }\n break;\n case COMMA:\n return COMMA_TOKEN;\n case HYPHEN_MINUS:\n var e1 = codePoint;\n var e2 = this.peekCodePoint(0);\n var e3 = this.peekCodePoint(1);\n if (isNumberStart(e1, e2, e3)) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeNumericToken();\n }\n if (isIdentifierStart(e1, e2, e3)) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeIdentLikeToken();\n }\n if (e2 === HYPHEN_MINUS && e3 === GREATER_THAN_SIGN) {\n this.consumeCodePoint();\n this.consumeCodePoint();\n return CDC_TOKEN;\n }\n break;\n case FULL_STOP:\n if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeNumericToken();\n }\n break;\n case SOLIDUS:\n if (this.peekCodePoint(0) === ASTERISK) {\n this.consumeCodePoint();\n while (true) {\n var c = this.consumeCodePoint();\n if (c === ASTERISK) {\n c = this.consumeCodePoint();\n if (c === SOLIDUS) {\n return this.consumeToken();\n }\n }\n if (c === EOF) {\n return this.consumeToken();\n }\n }\n }\n break;\n case COLON:\n return COLON_TOKEN;\n case SEMICOLON:\n return SEMICOLON_TOKEN;\n case LESS_THAN_SIGN:\n if (this.peekCodePoint(0) === EXCLAMATION_MARK &&\n this.peekCodePoint(1) === HYPHEN_MINUS &&\n this.peekCodePoint(2) === HYPHEN_MINUS) {\n this.consumeCodePoint();\n this.consumeCodePoint();\n return CDO_TOKEN;\n }\n break;\n case COMMERCIAL_AT:\n var a1 = this.peekCodePoint(0);\n var a2 = this.peekCodePoint(1);\n var a3 = this.peekCodePoint(2);\n if (isIdentifierStart(a1, a2, a3)) {\n var value = this.consumeName();\n return { type: 7 /* AT_KEYWORD_TOKEN */, value: value };\n }\n break;\n case LEFT_SQUARE_BRACKET:\n return LEFT_SQUARE_BRACKET_TOKEN;\n case REVERSE_SOLIDUS:\n if (isValidEscape(codePoint, this.peekCodePoint(0))) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeIdentLikeToken();\n }\n break;\n case RIGHT_SQUARE_BRACKET:\n return RIGHT_SQUARE_BRACKET_TOKEN;\n case CIRCUMFLEX_ACCENT:\n if (this.peekCodePoint(0) === EQUALS_SIGN) {\n this.consumeCodePoint();\n return PREFIX_MATCH_TOKEN;\n }\n break;\n case LEFT_CURLY_BRACKET:\n return LEFT_CURLY_BRACKET_TOKEN;\n case RIGHT_CURLY_BRACKET:\n return RIGHT_CURLY_BRACKET_TOKEN;\n case u:\n case U:\n var u1 = this.peekCodePoint(0);\n var u2 = this.peekCodePoint(1);\n if (u1 === PLUS_SIGN && (isHex(u2) || u2 === QUESTION_MARK)) {\n this.consumeCodePoint();\n this.consumeUnicodeRangeToken();\n }\n this.reconsumeCodePoint(codePoint);\n return this.consumeIdentLikeToken();\n case VERTICAL_LINE:\n if (this.peekCodePoint(0) === EQUALS_SIGN) {\n this.consumeCodePoint();\n return DASH_MATCH_TOKEN;\n }\n if (this.peekCodePoint(0) === VERTICAL_LINE) {\n this.consumeCodePoint();\n return COLUMN_TOKEN;\n }\n break;\n case TILDE:\n if (this.peekCodePoint(0) === EQUALS_SIGN) {\n this.consumeCodePoint();\n return INCLUDE_MATCH_TOKEN;\n }\n break;\n case EOF:\n return EOF_TOKEN;\n }\n if (isWhiteSpace(codePoint)) {\n this.consumeWhiteSpace();\n return WHITESPACE_TOKEN;\n }\n if (isDigit(codePoint)) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeNumericToken();\n }\n if (isNameStartCodePoint(codePoint)) {\n this.reconsumeCodePoint(codePoint);\n return this.consumeIdentLikeToken();\n }\n return { type: 6 /* DELIM_TOKEN */, value: fromCodePoint$1(codePoint) };\n };\n Tokenizer.prototype.consumeCodePoint = function () {\n var value = this._value.shift();\n return typeof value === 'undefined' ? -1 : value;\n };\n Tokenizer.prototype.reconsumeCodePoint = function (codePoint) {\n this._value.unshift(codePoint);\n };\n Tokenizer.prototype.peekCodePoint = function (delta) {\n if (delta >= this._value.length) {\n return -1;\n }\n return this._value[delta];\n };\n Tokenizer.prototype.consumeUnicodeRangeToken = function () {\n var digits = [];\n var codePoint = this.consumeCodePoint();\n while (isHex(codePoint) && digits.length < 6) {\n digits.push(codePoint);\n codePoint = this.consumeCodePoint();\n }\n var questionMarks = false;\n while (codePoint === QUESTION_MARK && digits.length < 6) {\n digits.push(codePoint);\n codePoint = this.consumeCodePoint();\n questionMarks = true;\n }\n if (questionMarks) {\n var start_1 = parseInt(fromCodePoint$1.apply(void 0, digits.map(function (digit) { return (digit === QUESTION_MARK ? ZERO : digit); })), 16);\n var end = parseInt(fromCodePoint$1.apply(void 0, digits.map(function (digit) { return (digit === QUESTION_MARK ? F : digit); })), 16);\n return { type: 30 /* UNICODE_RANGE_TOKEN */, start: start_1, end: end };\n }\n var start = parseInt(fromCodePoint$1.apply(void 0, digits), 16);\n if (this.peekCodePoint(0) === HYPHEN_MINUS && isHex(this.peekCodePoint(1))) {\n this.consumeCodePoint();\n codePoint = this.consumeCodePoint();\n var endDigits = [];\n while (isHex(codePoint) && endDigits.length < 6) {\n endDigits.push(codePoint);\n codePoint = this.consumeCodePoint();\n }\n var end = parseInt(fromCodePoint$1.apply(void 0, endDigits), 16);\n return { type: 30 /* UNICODE_RANGE_TOKEN */, start: start, end: end };\n }\n else {\n return { type: 30 /* UNICODE_RANGE_TOKEN */, start: start, end: start };\n }\n };\n Tokenizer.prototype.consumeIdentLikeToken = function () {\n var value = this.consumeName();\n if (value.toLowerCase() === 'url' && this.peekCodePoint(0) === LEFT_PARENTHESIS) {\n this.consumeCodePoint();\n return this.consumeUrlToken();\n }\n else if (this.peekCodePoint(0) === LEFT_PARENTHESIS) {\n this.consumeCodePoint();\n return { type: 19 /* FUNCTION_TOKEN */, value: value };\n }\n return { type: 20 /* IDENT_TOKEN */, value: value };\n };\n Tokenizer.prototype.consumeUrlToken = function () {\n var value = [];\n this.consumeWhiteSpace();\n if (this.peekCodePoint(0) === EOF) {\n return { type: 22 /* URL_TOKEN */, value: '' };\n }\n var next = this.peekCodePoint(0);\n if (next === APOSTROPHE || next === QUOTATION_MARK) {\n var stringToken = this.consumeStringToken(this.consumeCodePoint());\n if (stringToken.type === 0 /* STRING_TOKEN */) {\n this.consumeWhiteSpace();\n if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {\n this.consumeCodePoint();\n return { type: 22 /* URL_TOKEN */, value: stringToken.value };\n }\n }\n this.consumeBadUrlRemnants();\n return BAD_URL_TOKEN;\n }\n while (true) {\n var codePoint = this.consumeCodePoint();\n if (codePoint === EOF || codePoint === RIGHT_PARENTHESIS) {\n return { type: 22 /* URL_TOKEN */, value: fromCodePoint$1.apply(void 0, value) };\n }\n else if (isWhiteSpace(codePoint)) {\n this.consumeWhiteSpace();\n if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) {\n this.consumeCodePoint();\n return { type: 22 /* URL_TOKEN */, value: fromCodePoint$1.apply(void 0, value) };\n }\n this.consumeBadUrlRemnants();\n return BAD_URL_TOKEN;\n }\n else if (codePoint === QUOTATION_MARK ||\n codePoint === APOSTROPHE ||\n codePoint === LEFT_PARENTHESIS ||\n isNonPrintableCodePoint(codePoint)) {\n this.consumeBadUrlRemnants();\n return BAD_URL_TOKEN;\n }\n else if (codePoint === REVERSE_SOLIDUS) {\n if (isValidEscape(codePoint, this.peekCodePoint(0))) {\n value.push(this.consumeEscapedCodePoint());\n }\n else {\n this.consumeBadUrlRemnants();\n return BAD_URL_TOKEN;\n }\n }\n else {\n value.push(codePoint);\n }\n }\n };\n Tokenizer.prototype.consumeWhiteSpace = function () {\n while (isWhiteSpace(this.peekCodePoint(0))) {\n this.consumeCodePoint();\n }\n };\n Tokenizer.prototype.consumeBadUrlRemnants = function () {\n while (true) {\n var codePoint = this.consumeCodePoint();\n if (codePoint === RIGHT_PARENTHESIS || codePoint === EOF) {\n return;\n }\n if (isValidEscape(codePoint, this.peekCodePoint(0))) {\n this.consumeEscapedCodePoint();\n }\n }\n };\n Tokenizer.prototype.consumeStringSlice = function (count) {\n var SLICE_STACK_SIZE = 50000;\n var value = '';\n while (count > 0) {\n var amount = Math.min(SLICE_STACK_SIZE, count);\n value += fromCodePoint$1.apply(void 0, this._value.splice(0, amount));\n count -= amount;\n }\n this._value.shift();\n return value;\n };\n Tokenizer.prototype.consumeStringToken = function (endingCodePoint) {\n var value = '';\n var i = 0;\n do {\n var codePoint = this._value[i];\n if (codePoint === EOF || codePoint === undefined || codePoint === endingCodePoint) {\n value += this.consumeStringSlice(i);\n return { type: 0 /* STRING_TOKEN */, value: value };\n }\n if (codePoint === LINE_FEED) {\n this._value.splice(0, i);\n return BAD_STRING_TOKEN;\n }\n if (codePoint === REVERSE_SOLIDUS) {\n var next = this._value[i + 1];\n if (next !== EOF && next !== undefined) {\n if (next === LINE_FEED) {\n value += this.consumeStringSlice(i);\n i = -1;\n this._value.shift();\n }\n else if (isValidEscape(codePoint, next)) {\n value += this.consumeStringSlice(i);\n value += fromCodePoint$1(this.consumeEscapedCodePoint());\n i = -1;\n }\n }\n }\n i++;\n } while (true);\n };\n Tokenizer.prototype.consumeNumber = function () {\n var repr = [];\n var type = FLAG_INTEGER;\n var c1 = this.peekCodePoint(0);\n if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) {\n repr.push(this.consumeCodePoint());\n }\n while (isDigit(this.peekCodePoint(0))) {\n repr.push(this.consumeCodePoint());\n }\n c1 = this.peekCodePoint(0);\n var c2 = this.peekCodePoint(1);\n if (c1 === FULL_STOP && isDigit(c2)) {\n repr.push(this.consumeCodePoint(), this.consumeCodePoint());\n type = FLAG_NUMBER;\n while (isDigit(this.peekCodePoint(0))) {\n repr.push(this.consumeCodePoint());\n }\n }\n c1 = this.peekCodePoint(0);\n c2 = this.peekCodePoint(1);\n var c3 = this.peekCodePoint(2);\n if ((c1 === E || c1 === e) && (((c2 === PLUS_SIGN || c2 === HYPHEN_MINUS) && isDigit(c3)) || isDigit(c2))) {\n repr.push(this.consumeCodePoint(), this.consumeCodePoint());\n type = FLAG_NUMBER;\n while (isDigit(this.peekCodePoint(0))) {\n repr.push(this.consumeCodePoint());\n }\n }\n return [stringToNumber(repr), type];\n };\n Tokenizer.prototype.consumeNumericToken = function () {\n var _a = this.consumeNumber(), number = _a[0], flags = _a[1];\n var c1 = this.peekCodePoint(0);\n var c2 = this.peekCodePoint(1);\n var c3 = this.peekCodePoint(2);\n if (isIdentifierStart(c1, c2, c3)) {\n var unit = this.consumeName();\n return { type: 15 /* DIMENSION_TOKEN */, number: number, flags: flags, unit: unit };\n }\n if (c1 === PERCENTAGE_SIGN) {\n this.consumeCodePoint();\n return { type: 16 /* PERCENTAGE_TOKEN */, number: number, flags: flags };\n }\n return { type: 17 /* NUMBER_TOKEN */, number: number, flags: flags };\n };\n Tokenizer.prototype.consumeEscapedCodePoint = function () {\n var codePoint = this.consumeCodePoint();\n if (isHex(codePoint)) {\n var hex = fromCodePoint$1(codePoint);\n while (isHex(this.peekCodePoint(0)) && hex.length < 6) {\n hex += fromCodePoint$1(this.consumeCodePoint());\n }\n if (isWhiteSpace(this.peekCodePoint(0))) {\n this.consumeCodePoint();\n }\n var hexCodePoint = parseInt(hex, 16);\n if (hexCodePoint === 0 || isSurrogateCodePoint(hexCodePoint) || hexCodePoint > 0x10ffff) {\n return REPLACEMENT_CHARACTER;\n }\n return hexCodePoint;\n }\n if (codePoint === EOF) {\n return REPLACEMENT_CHARACTER;\n }\n return codePoint;\n };\n Tokenizer.prototype.consumeName = function () {\n var result = '';\n while (true) {\n var codePoint = this.consumeCodePoint();\n if (isNameCodePoint(codePoint)) {\n result += fromCodePoint$1(codePoint);\n }\n else if (isValidEscape(codePoint, this.peekCodePoint(0))) {\n result += fromCodePoint$1(this.consumeEscapedCodePoint());\n }\n else {\n this.reconsumeCodePoint(codePoint);\n return result;\n }\n }\n };\n return Tokenizer;\n}());\n\nvar Parser = /** @class */ (function () {\n function Parser(tokens) {\n this._tokens = tokens;\n }\n Parser.create = function (value) {\n var tokenizer = new Tokenizer();\n tokenizer.write(value);\n return new Parser(tokenizer.read());\n };\n Parser.parseValue = function (value) {\n return Parser.create(value).parseComponentValue();\n };\n Parser.parseValues = function (value) {\n return Parser.create(value).parseComponentValues();\n };\n Parser.prototype.parseComponentValue = function () {\n var token = this.consumeToken();\n while (token.type === 31 /* WHITESPACE_TOKEN */) {\n token = this.consumeToken();\n }\n if (token.type === 32 /* EOF_TOKEN */) {\n throw new SyntaxError(\"Error parsing CSS component value, unexpected EOF\");\n }\n this.reconsumeToken(token);\n var value = this.consumeComponentValue();\n do {\n token = this.consumeToken();\n } while (token.type === 31 /* WHITESPACE_TOKEN */);\n if (token.type === 32 /* EOF_TOKEN */) {\n return value;\n }\n throw new SyntaxError(\"Error parsing CSS component value, multiple values found when expecting only one\");\n };\n Parser.prototype.parseComponentValues = function () {\n var values = [];\n while (true) {\n var value = this.consumeComponentValue();\n if (value.type === 32 /* EOF_TOKEN */) {\n return values;\n }\n values.push(value);\n values.push();\n }\n };\n Parser.prototype.consumeComponentValue = function () {\n var token = this.consumeToken();\n switch (token.type) {\n case 11 /* LEFT_CURLY_BRACKET_TOKEN */:\n case 28 /* LEFT_SQUARE_BRACKET_TOKEN */:\n case 2 /* LEFT_PARENTHESIS_TOKEN */:\n return this.consumeSimpleBlock(token.type);\n case 19 /* FUNCTION_TOKEN */:\n return this.consumeFunction(token);\n }\n return token;\n };\n Parser.prototype.consumeSimpleBlock = function (type) {\n var block = { type: type, values: [] };\n var token = this.consumeToken();\n while (true) {\n if (token.type === 32 /* EOF_TOKEN */ || isEndingTokenFor(token, type)) {\n return block;\n }\n this.reconsumeToken(token);\n block.values.push(this.consumeComponentValue());\n token = this.consumeToken();\n }\n };\n Parser.prototype.consumeFunction = function (functionToken) {\n var cssFunction = {\n name: functionToken.value,\n values: [],\n type: 18 /* FUNCTION */\n };\n while (true) {\n var token = this.consumeToken();\n if (token.type === 32 /* EOF_TOKEN */ || token.type === 3 /* RIGHT_PARENTHESIS_TOKEN */) {\n return cssFunction;\n }\n this.reconsumeToken(token);\n cssFunction.values.push(this.consumeComponentValue());\n }\n };\n Parser.prototype.consumeToken = function () {\n var token = this._tokens.shift();\n return typeof token === 'undefined' ? EOF_TOKEN : token;\n };\n Parser.prototype.reconsumeToken = function (token) {\n this._tokens.unshift(token);\n };\n return Parser;\n}());\nvar isDimensionToken = function (token) { return token.type === 15 /* DIMENSION_TOKEN */; };\nvar isNumberToken = function (token) { return token.type === 17 /* NUMBER_TOKEN */; };\nvar isIdentToken = function (token) { return token.type === 20 /* IDENT_TOKEN */; };\nvar isStringToken = function (token) { return token.type === 0 /* STRING_TOKEN */; };\nvar isIdentWithValue = function (token, value) {\n return isIdentToken(token) && token.value === value;\n};\nvar nonWhiteSpace = function (token) { return token.type !== 31 /* WHITESPACE_TOKEN */; };\nvar nonFunctionArgSeparator = function (token) {\n return token.type !== 31 /* WHITESPACE_TOKEN */ && token.type !== 4 /* COMMA_TOKEN */;\n};\nvar parseFunctionArgs = function (tokens) {\n var args = [];\n var arg = [];\n tokens.forEach(function (token) {\n if (token.type === 4 /* COMMA_TOKEN */) {\n if (arg.length === 0) {\n throw new Error(\"Error parsing function args, zero tokens for arg\");\n }\n args.push(arg);\n arg = [];\n return;\n }\n if (token.type !== 31 /* WHITESPACE_TOKEN */) {\n arg.push(token);\n }\n });\n if (arg.length) {\n args.push(arg);\n }\n return args;\n};\nvar isEndingTokenFor = function (token, type) {\n if (type === 11 /* LEFT_CURLY_BRACKET_TOKEN */ && token.type === 12 /* RIGHT_CURLY_BRACKET_TOKEN */) {\n return true;\n }\n if (type === 28 /* LEFT_SQUARE_BRACKET_TOKEN */ && token.type === 29 /* RIGHT_SQUARE_BRACKET_TOKEN */) {\n return true;\n }\n return type === 2 /* LEFT_PARENTHESIS_TOKEN */ && token.type === 3 /* RIGHT_PARENTHESIS_TOKEN */;\n};\n\nvar isLength = function (token) {\n return token.type === 17 /* NUMBER_TOKEN */ || token.type === 15 /* DIMENSION_TOKEN */;\n};\n\nvar isLengthPercentage = function (token) {\n return token.type === 16 /* PERCENTAGE_TOKEN */ || isLength(token);\n};\nvar parseLengthPercentageTuple = function (tokens) {\n return tokens.length > 1 ? [tokens[0], tokens[1]] : [tokens[0]];\n};\nvar ZERO_LENGTH = {\n type: 17 /* NUMBER_TOKEN */,\n number: 0,\n flags: FLAG_INTEGER\n};\nvar FIFTY_PERCENT = {\n type: 16 /* PERCENTAGE_TOKEN */,\n number: 50,\n flags: FLAG_INTEGER\n};\nvar HUNDRED_PERCENT = {\n type: 16 /* PERCENTAGE_TOKEN */,\n number: 100,\n flags: FLAG_INTEGER\n};\nvar getAbsoluteValueForTuple = function (tuple, width, height) {\n var x = tuple[0], y = tuple[1];\n return [getAbsoluteValue(x, width), getAbsoluteValue(typeof y !== 'undefined' ? y : x, height)];\n};\nvar getAbsoluteValue = function (token, parent) {\n if (token.type === 16 /* PERCENTAGE_TOKEN */) {\n return (token.number / 100) * parent;\n }\n if (isDimensionToken(token)) {\n switch (token.unit) {\n case 'rem':\n case 'em':\n return 16 * token.number; // TODO use correct font-size\n case 'px':\n default:\n return token.number;\n }\n }\n return token.number;\n};\n\nvar DEG = 'deg';\nvar GRAD = 'grad';\nvar RAD = 'rad';\nvar TURN = 'turn';\nvar angle = {\n name: 'angle',\n parse: function (_context, value) {\n if (value.type === 15 /* DIMENSION_TOKEN */) {\n switch (value.unit) {\n case DEG:\n return (Math.PI * value.number) / 180;\n case GRAD:\n return (Math.PI / 200) * value.number;\n case RAD:\n return value.number;\n case TURN:\n return Math.PI * 2 * value.number;\n }\n }\n throw new Error(\"Unsupported angle type\");\n }\n};\nvar isAngle = function (value) {\n if (value.type === 15 /* DIMENSION_TOKEN */) {\n if (value.unit === DEG || value.unit === GRAD || value.unit === RAD || value.unit === TURN) {\n return true;\n }\n }\n return false;\n};\nvar parseNamedSide = function (tokens) {\n var sideOrCorner = tokens\n .filter(isIdentToken)\n .map(function (ident) { return ident.value; })\n .join(' ');\n switch (sideOrCorner) {\n case 'to bottom right':\n case 'to right bottom':\n case 'left top':\n case 'top left':\n return [ZERO_LENGTH, ZERO_LENGTH];\n case 'to top':\n case 'bottom':\n return deg(0);\n case 'to bottom left':\n case 'to left bottom':\n case 'right top':\n case 'top right':\n return [ZERO_LENGTH, HUNDRED_PERCENT];\n case 'to right':\n case 'left':\n return deg(90);\n case 'to top left':\n case 'to left top':\n case 'right bottom':\n case 'bottom right':\n return [HUNDRED_PERCENT, HUNDRED_PERCENT];\n case 'to bottom':\n case 'top':\n return deg(180);\n case 'to top right':\n case 'to right top':\n case 'left bottom':\n case 'bottom left':\n return [HUNDRED_PERCENT, ZERO_LENGTH];\n case 'to left':\n case 'right':\n return deg(270);\n }\n return 0;\n};\nvar deg = function (deg) { return (Math.PI * deg) / 180; };\n\nvar color$1 = {\n name: 'color',\n parse: function (context, value) {\n if (value.type === 18 /* FUNCTION */) {\n var colorFunction = SUPPORTED_COLOR_FUNCTIONS[value.name];\n if (typeof colorFunction === 'undefined') {\n throw new Error(\"Attempting to parse an unsupported color function \\\"\" + value.name + \"\\\"\");\n }\n return colorFunction(context, value.values);\n }\n if (value.type === 5 /* HASH_TOKEN */) {\n if (value.value.length === 3) {\n var r = value.value.substring(0, 1);\n var g = value.value.substring(1, 2);\n var b = value.value.substring(2, 3);\n return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), 1);\n }\n if (value.value.length === 4) {\n var r = value.value.substring(0, 1);\n var g = value.value.substring(1, 2);\n var b = value.value.substring(2, 3);\n var a = value.value.substring(3, 4);\n return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), parseInt(a + a, 16) / 255);\n }\n if (value.value.length === 6) {\n var r = value.value.substring(0, 2);\n var g = value.value.substring(2, 4);\n var b = value.value.substring(4, 6);\n return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), 1);\n }\n if (value.value.length === 8) {\n var r = value.value.substring(0, 2);\n var g = value.value.substring(2, 4);\n var b = value.value.substring(4, 6);\n var a = value.value.substring(6, 8);\n return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), parseInt(a, 16) / 255);\n }\n }\n if (value.type === 20 /* IDENT_TOKEN */) {\n var namedColor = COLORS[value.value.toUpperCase()];\n if (typeof namedColor !== 'undefined') {\n return namedColor;\n }\n }\n return COLORS.TRANSPARENT;\n }\n};\nvar isTransparent = function (color) { return (0xff & color) === 0; };\nvar asString = function (color) {\n var alpha = 0xff & color;\n var blue = 0xff & (color >> 8);\n var green = 0xff & (color >> 16);\n var red = 0xff & (color >> 24);\n return alpha < 255 ? \"rgba(\" + red + \",\" + green + \",\" + blue + \",\" + alpha / 255 + \")\" : \"rgb(\" + red + \",\" + green + \",\" + blue + \")\";\n};\nvar pack = function (r, g, b, a) {\n return ((r << 24) | (g << 16) | (b << 8) | (Math.round(a * 255) << 0)) >>> 0;\n};\nvar getTokenColorValue = function (token, i) {\n if (token.type === 17 /* NUMBER_TOKEN */) {\n return token.number;\n }\n if (token.type === 16 /* PERCENTAGE_TOKEN */) {\n var max = i === 3 ? 1 : 255;\n return i === 3 ? (token.number / 100) * max : Math.round((token.number / 100) * max);\n }\n return 0;\n};\nvar rgb = function (_context, args) {\n var tokens = args.filter(nonFunctionArgSeparator);\n if (tokens.length === 3) {\n var _a = tokens.map(getTokenColorValue), r = _a[0], g = _a[1], b = _a[2];\n return pack(r, g, b, 1);\n }\n if (tokens.length === 4) {\n var _b = tokens.map(getTokenColorValue), r = _b[0], g = _b[1], b = _b[2], a = _b[3];\n return pack(r, g, b, a);\n }\n return 0;\n};\nfunction hue2rgb(t1, t2, hue) {\n if (hue < 0) {\n hue += 1;\n }\n if (hue >= 1) {\n hue -= 1;\n }\n if (hue < 1 / 6) {\n return (t2 - t1) * hue * 6 + t1;\n }\n else if (hue < 1 / 2) {\n return t2;\n }\n else if (hue < 2 / 3) {\n return (t2 - t1) * 6 * (2 / 3 - hue) + t1;\n }\n else {\n return t1;\n }\n}\nvar hsl = function (context, args) {\n var tokens = args.filter(nonFunctionArgSeparator);\n var hue = tokens[0], saturation = tokens[1], lightness = tokens[2], alpha = tokens[3];\n var h = (hue.type === 17 /* NUMBER_TOKEN */ ? deg(hue.number) : angle.parse(context, hue)) / (Math.PI * 2);\n var s = isLengthPercentage(saturation) ? saturation.number / 100 : 0;\n var l = isLengthPercentage(lightness) ? lightness.number / 100 : 0;\n var a = typeof alpha !== 'undefined' && isLengthPercentage(alpha) ? getAbsoluteValue(alpha, 1) : 1;\n if (s === 0) {\n return pack(l * 255, l * 255, l * 255, 1);\n }\n var t2 = l <= 0.5 ? l * (s + 1) : l + s - l * s;\n var t1 = l * 2 - t2;\n var r = hue2rgb(t1, t2, h + 1 / 3);\n var g = hue2rgb(t1, t2, h);\n var b = hue2rgb(t1, t2, h - 1 / 3);\n return pack(r * 255, g * 255, b * 255, a);\n};\nvar SUPPORTED_COLOR_FUNCTIONS = {\n hsl: hsl,\n hsla: hsl,\n rgb: rgb,\n rgba: rgb\n};\nvar parseColor = function (context, value) {\n return color$1.parse(context, Parser.create(value).parseComponentValue());\n};\nvar COLORS = {\n ALICEBLUE: 0xf0f8ffff,\n ANTIQUEWHITE: 0xfaebd7ff,\n AQUA: 0x00ffffff,\n AQUAMARINE: 0x7fffd4ff,\n AZURE: 0xf0ffffff,\n BEIGE: 0xf5f5dcff,\n BISQUE: 0xffe4c4ff,\n BLACK: 0x000000ff,\n BLANCHEDALMOND: 0xffebcdff,\n BLUE: 0x0000ffff,\n BLUEVIOLET: 0x8a2be2ff,\n BROWN: 0xa52a2aff,\n BURLYWOOD: 0xdeb887ff,\n CADETBLUE: 0x5f9ea0ff,\n CHARTREUSE: 0x7fff00ff,\n CHOCOLATE: 0xd2691eff,\n CORAL: 0xff7f50ff,\n CORNFLOWERBLUE: 0x6495edff,\n CORNSILK: 0xfff8dcff,\n CRIMSON: 0xdc143cff,\n CYAN: 0x00ffffff,\n DARKBLUE: 0x00008bff,\n DARKCYAN: 0x008b8bff,\n DARKGOLDENROD: 0xb886bbff,\n DARKGRAY: 0xa9a9a9ff,\n DARKGREEN: 0x006400ff,\n DARKGREY: 0xa9a9a9ff,\n DARKKHAKI: 0xbdb76bff,\n DARKMAGENTA: 0x8b008bff,\n DARKOLIVEGREEN: 0x556b2fff,\n DARKORANGE: 0xff8c00ff,\n DARKORCHID: 0x9932ccff,\n DARKRED: 0x8b0000ff,\n DARKSALMON: 0xe9967aff,\n DARKSEAGREEN: 0x8fbc8fff,\n DARKSLATEBLUE: 0x483d8bff,\n DARKSLATEGRAY: 0x2f4f4fff,\n DARKSLATEGREY: 0x2f4f4fff,\n DARKTURQUOISE: 0x00ced1ff,\n DARKVIOLET: 0x9400d3ff,\n DEEPPINK: 0xff1493ff,\n DEEPSKYBLUE: 0x00bfffff,\n DIMGRAY: 0x696969ff,\n DIMGREY: 0x696969ff,\n DODGERBLUE: 0x1e90ffff,\n FIREBRICK: 0xb22222ff,\n FLORALWHITE: 0xfffaf0ff,\n FORESTGREEN: 0x228b22ff,\n FUCHSIA: 0xff00ffff,\n GAINSBORO: 0xdcdcdcff,\n GHOSTWHITE: 0xf8f8ffff,\n GOLD: 0xffd700ff,\n GOLDENROD: 0xdaa520ff,\n GRAY: 0x808080ff,\n GREEN: 0x008000ff,\n GREENYELLOW: 0xadff2fff,\n GREY: 0x808080ff,\n HONEYDEW: 0xf0fff0ff,\n HOTPINK: 0xff69b4ff,\n INDIANRED: 0xcd5c5cff,\n INDIGO: 0x4b0082ff,\n IVORY: 0xfffff0ff,\n KHAKI: 0xf0e68cff,\n LAVENDER: 0xe6e6faff,\n LAVENDERBLUSH: 0xfff0f5ff,\n LAWNGREEN: 0x7cfc00ff,\n LEMONCHIFFON: 0xfffacdff,\n LIGHTBLUE: 0xadd8e6ff,\n LIGHTCORAL: 0xf08080ff,\n LIGHTCYAN: 0xe0ffffff,\n LIGHTGOLDENRODYELLOW: 0xfafad2ff,\n LIGHTGRAY: 0xd3d3d3ff,\n LIGHTGREEN: 0x90ee90ff,\n LIGHTGREY: 0xd3d3d3ff,\n LIGHTPINK: 0xffb6c1ff,\n LIGHTSALMON: 0xffa07aff,\n LIGHTSEAGREEN: 0x20b2aaff,\n LIGHTSKYBLUE: 0x87cefaff,\n LIGHTSLATEGRAY: 0x778899ff,\n LIGHTSLATEGREY: 0x778899ff,\n LIGHTSTEELBLUE: 0xb0c4deff,\n LIGHTYELLOW: 0xffffe0ff,\n LIME: 0x00ff00ff,\n LIMEGREEN: 0x32cd32ff,\n LINEN: 0xfaf0e6ff,\n MAGENTA: 0xff00ffff,\n MAROON: 0x800000ff,\n MEDIUMAQUAMARINE: 0x66cdaaff,\n MEDIUMBLUE: 0x0000cdff,\n MEDIUMORCHID: 0xba55d3ff,\n MEDIUMPURPLE: 0x9370dbff,\n MEDIUMSEAGREEN: 0x3cb371ff,\n MEDIUMSLATEBLUE: 0x7b68eeff,\n MEDIUMSPRINGGREEN: 0x00fa9aff,\n MEDIUMTURQUOISE: 0x48d1ccff,\n MEDIUMVIOLETRED: 0xc71585ff,\n MIDNIGHTBLUE: 0x191970ff,\n MINTCREAM: 0xf5fffaff,\n MISTYROSE: 0xffe4e1ff,\n MOCCASIN: 0xffe4b5ff,\n NAVAJOWHITE: 0xffdeadff,\n NAVY: 0x000080ff,\n OLDLACE: 0xfdf5e6ff,\n OLIVE: 0x808000ff,\n OLIVEDRAB: 0x6b8e23ff,\n ORANGE: 0xffa500ff,\n ORANGERED: 0xff4500ff,\n ORCHID: 0xda70d6ff,\n PALEGOLDENROD: 0xeee8aaff,\n PALEGREEN: 0x98fb98ff,\n PALETURQUOISE: 0xafeeeeff,\n PALEVIOLETRED: 0xdb7093ff,\n PAPAYAWHIP: 0xffefd5ff,\n PEACHPUFF: 0xffdab9ff,\n PERU: 0xcd853fff,\n PINK: 0xffc0cbff,\n PLUM: 0xdda0ddff,\n POWDERBLUE: 0xb0e0e6ff,\n PURPLE: 0x800080ff,\n REBECCAPURPLE: 0x663399ff,\n RED: 0xff0000ff,\n ROSYBROWN: 0xbc8f8fff,\n ROYALBLUE: 0x4169e1ff,\n SADDLEBROWN: 0x8b4513ff,\n SALMON: 0xfa8072ff,\n SANDYBROWN: 0xf4a460ff,\n SEAGREEN: 0x2e8b57ff,\n SEASHELL: 0xfff5eeff,\n SIENNA: 0xa0522dff,\n SILVER: 0xc0c0c0ff,\n SKYBLUE: 0x87ceebff,\n SLATEBLUE: 0x6a5acdff,\n SLATEGRAY: 0x708090ff,\n SLATEGREY: 0x708090ff,\n SNOW: 0xfffafaff,\n SPRINGGREEN: 0x00ff7fff,\n STEELBLUE: 0x4682b4ff,\n TAN: 0xd2b48cff,\n TEAL: 0x008080ff,\n THISTLE: 0xd8bfd8ff,\n TOMATO: 0xff6347ff,\n TRANSPARENT: 0x00000000,\n TURQUOISE: 0x40e0d0ff,\n VIOLET: 0xee82eeff,\n WHEAT: 0xf5deb3ff,\n WHITE: 0xffffffff,\n WHITESMOKE: 0xf5f5f5ff,\n YELLOW: 0xffff00ff,\n YELLOWGREEN: 0x9acd32ff\n};\n\nvar backgroundClip = {\n name: 'background-clip',\n initialValue: 'border-box',\n prefix: false,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n return tokens.map(function (token) {\n if (isIdentToken(token)) {\n switch (token.value) {\n case 'padding-box':\n return 1 /* PADDING_BOX */;\n case 'content-box':\n return 2 /* CONTENT_BOX */;\n }\n }\n return 0 /* BORDER_BOX */;\n });\n }\n};\n\nvar backgroundColor = {\n name: \"background-color\",\n initialValue: 'transparent',\n prefix: false,\n type: 3 /* TYPE_VALUE */,\n format: 'color'\n};\n\nvar parseColorStop = function (context, args) {\n var color = color$1.parse(context, args[0]);\n var stop = args[1];\n return stop && isLengthPercentage(stop) ? { color: color, stop: stop } : { color: color, stop: null };\n};\nvar processColorStops = function (stops, lineLength) {\n var first = stops[0];\n var last = stops[stops.length - 1];\n if (first.stop === null) {\n first.stop = ZERO_LENGTH;\n }\n if (last.stop === null) {\n last.stop = HUNDRED_PERCENT;\n }\n var processStops = [];\n var previous = 0;\n for (var i = 0; i < stops.length; i++) {\n var stop_1 = stops[i].stop;\n if (stop_1 !== null) {\n var absoluteValue = getAbsoluteValue(stop_1, lineLength);\n if (absoluteValue > previous) {\n processStops.push(absoluteValue);\n }\n else {\n processStops.push(previous);\n }\n previous = absoluteValue;\n }\n else {\n processStops.push(null);\n }\n }\n var gapBegin = null;\n for (var i = 0; i < processStops.length; i++) {\n var stop_2 = processStops[i];\n if (stop_2 === null) {\n if (gapBegin === null) {\n gapBegin = i;\n }\n }\n else if (gapBegin !== null) {\n var gapLength = i - gapBegin;\n var beforeGap = processStops[gapBegin - 1];\n var gapValue = (stop_2 - beforeGap) / (gapLength + 1);\n for (var g = 1; g <= gapLength; g++) {\n processStops[gapBegin + g - 1] = gapValue * g;\n }\n gapBegin = null;\n }\n }\n return stops.map(function (_a, i) {\n var color = _a.color;\n return { color: color, stop: Math.max(Math.min(1, processStops[i] / lineLength), 0) };\n });\n};\nvar getAngleFromCorner = function (corner, width, height) {\n var centerX = width / 2;\n var centerY = height / 2;\n var x = getAbsoluteValue(corner[0], width) - centerX;\n var y = centerY - getAbsoluteValue(corner[1], height);\n return (Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2);\n};\nvar calculateGradientDirection = function (angle, width, height) {\n var radian = typeof angle === 'number' ? angle : getAngleFromCorner(angle, width, height);\n var lineLength = Math.abs(width * Math.sin(radian)) + Math.abs(height * Math.cos(radian));\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var halfLineLength = lineLength / 2;\n var yDiff = Math.sin(radian - Math.PI / 2) * halfLineLength;\n var xDiff = Math.cos(radian - Math.PI / 2) * halfLineLength;\n return [lineLength, halfWidth - xDiff, halfWidth + xDiff, halfHeight - yDiff, halfHeight + yDiff];\n};\nvar distance = function (a, b) { return Math.sqrt(a * a + b * b); };\nvar findCorner = function (width, height, x, y, closest) {\n var corners = [\n [0, 0],\n [0, height],\n [width, 0],\n [width, height]\n ];\n return corners.reduce(function (stat, corner) {\n var cx = corner[0], cy = corner[1];\n var d = distance(x - cx, y - cy);\n if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) {\n return {\n optimumCorner: corner,\n optimumDistance: d\n };\n }\n return stat;\n }, {\n optimumDistance: closest ? Infinity : -Infinity,\n optimumCorner: null\n }).optimumCorner;\n};\nvar calculateRadius = function (gradient, x, y, width, height) {\n var rx = 0;\n var ry = 0;\n switch (gradient.size) {\n case 0 /* CLOSEST_SIDE */:\n // The ending shape is sized so that that it exactly meets the side of the gradient box closest to the gradient’s center.\n // If the shape is an ellipse, it exactly meets the closest side in each dimension.\n if (gradient.shape === 0 /* CIRCLE */) {\n rx = ry = Math.min(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));\n }\n else if (gradient.shape === 1 /* ELLIPSE */) {\n rx = Math.min(Math.abs(x), Math.abs(x - width));\n ry = Math.min(Math.abs(y), Math.abs(y - height));\n }\n break;\n case 2 /* CLOSEST_CORNER */:\n // The ending shape is sized so that that it passes through the corner of the gradient box closest to the gradient’s center.\n // If the shape is an ellipse, the ending shape is given the same aspect-ratio it would have if closest-side were specified.\n if (gradient.shape === 0 /* CIRCLE */) {\n rx = ry = Math.min(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height));\n }\n else if (gradient.shape === 1 /* ELLIPSE */) {\n // Compute the ratio ry/rx (which is to be the same as for \"closest-side\")\n var c = Math.min(Math.abs(y), Math.abs(y - height)) / Math.min(Math.abs(x), Math.abs(x - width));\n var _a = findCorner(width, height, x, y, true), cx = _a[0], cy = _a[1];\n rx = distance(cx - x, (cy - y) / c);\n ry = c * rx;\n }\n break;\n case 1 /* FARTHEST_SIDE */:\n // Same as closest-side, except the ending shape is sized based on the farthest side(s)\n if (gradient.shape === 0 /* CIRCLE */) {\n rx = ry = Math.max(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height));\n }\n else if (gradient.shape === 1 /* ELLIPSE */) {\n rx = Math.max(Math.abs(x), Math.abs(x - width));\n ry = Math.max(Math.abs(y), Math.abs(y - height));\n }\n break;\n case 3 /* FARTHEST_CORNER */:\n // Same as closest-corner, except the ending shape is sized based on the farthest corner.\n // If the shape is an ellipse, the ending shape is given the same aspect ratio it would have if farthest-side were specified.\n if (gradient.shape === 0 /* CIRCLE */) {\n rx = ry = Math.max(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height));\n }\n else if (gradient.shape === 1 /* ELLIPSE */) {\n // Compute the ratio ry/rx (which is to be the same as for \"farthest-side\")\n var c = Math.max(Math.abs(y), Math.abs(y - height)) / Math.max(Math.abs(x), Math.abs(x - width));\n var _b = findCorner(width, height, x, y, false), cx = _b[0], cy = _b[1];\n rx = distance(cx - x, (cy - y) / c);\n ry = c * rx;\n }\n break;\n }\n if (Array.isArray(gradient.size)) {\n rx = getAbsoluteValue(gradient.size[0], width);\n ry = gradient.size.length === 2 ? getAbsoluteValue(gradient.size[1], height) : rx;\n }\n return [rx, ry];\n};\n\nvar linearGradient = function (context, tokens) {\n var angle$1 = deg(180);\n var stops = [];\n parseFunctionArgs(tokens).forEach(function (arg, i) {\n if (i === 0) {\n var firstToken = arg[0];\n if (firstToken.type === 20 /* IDENT_TOKEN */ && firstToken.value === 'to') {\n angle$1 = parseNamedSide(arg);\n return;\n }\n else if (isAngle(firstToken)) {\n angle$1 = angle.parse(context, firstToken);\n return;\n }\n }\n var colorStop = parseColorStop(context, arg);\n stops.push(colorStop);\n });\n return { angle: angle$1, stops: stops, type: 1 /* LINEAR_GRADIENT */ };\n};\n\nvar prefixLinearGradient = function (context, tokens) {\n var angle$1 = deg(180);\n var stops = [];\n parseFunctionArgs(tokens).forEach(function (arg, i) {\n if (i === 0) {\n var firstToken = arg[0];\n if (firstToken.type === 20 /* IDENT_TOKEN */ &&\n ['top', 'left', 'right', 'bottom'].indexOf(firstToken.value) !== -1) {\n angle$1 = parseNamedSide(arg);\n return;\n }\n else if (isAngle(firstToken)) {\n angle$1 = (angle.parse(context, firstToken) + deg(270)) % deg(360);\n return;\n }\n }\n var colorStop = parseColorStop(context, arg);\n stops.push(colorStop);\n });\n return {\n angle: angle$1,\n stops: stops,\n type: 1 /* LINEAR_GRADIENT */\n };\n};\n\nvar webkitGradient = function (context, tokens) {\n var angle = deg(180);\n var stops = [];\n var type = 1 /* LINEAR_GRADIENT */;\n var shape = 0 /* CIRCLE */;\n var size = 3 /* FARTHEST_CORNER */;\n var position = [];\n parseFunctionArgs(tokens).forEach(function (arg, i) {\n var firstToken = arg[0];\n if (i === 0) {\n if (isIdentToken(firstToken) && firstToken.value === 'linear') {\n type = 1 /* LINEAR_GRADIENT */;\n return;\n }\n else if (isIdentToken(firstToken) && firstToken.value === 'radial') {\n type = 2 /* RADIAL_GRADIENT */;\n return;\n }\n }\n if (firstToken.type === 18 /* FUNCTION */) {\n if (firstToken.name === 'from') {\n var color = color$1.parse(context, firstToken.values[0]);\n stops.push({ stop: ZERO_LENGTH, color: color });\n }\n else if (firstToken.name === 'to') {\n var color = color$1.parse(context, firstToken.values[0]);\n stops.push({ stop: HUNDRED_PERCENT, color: color });\n }\n else if (firstToken.name === 'color-stop') {\n var values = firstToken.values.filter(nonFunctionArgSeparator);\n if (values.length === 2) {\n var color = color$1.parse(context, values[1]);\n var stop_1 = values[0];\n if (isNumberToken(stop_1)) {\n stops.push({\n stop: { type: 16 /* PERCENTAGE_TOKEN */, number: stop_1.number * 100, flags: stop_1.flags },\n color: color\n });\n }\n }\n }\n }\n });\n return type === 1 /* LINEAR_GRADIENT */\n ? {\n angle: (angle + deg(180)) % deg(360),\n stops: stops,\n type: type\n }\n : { size: size, shape: shape, stops: stops, position: position, type: type };\n};\n\nvar CLOSEST_SIDE = 'closest-side';\nvar FARTHEST_SIDE = 'farthest-side';\nvar CLOSEST_CORNER = 'closest-corner';\nvar FARTHEST_CORNER = 'farthest-corner';\nvar CIRCLE = 'circle';\nvar ELLIPSE = 'ellipse';\nvar COVER = 'cover';\nvar CONTAIN = 'contain';\nvar radialGradient = function (context, tokens) {\n var shape = 0 /* CIRCLE */;\n var size = 3 /* FARTHEST_CORNER */;\n var stops = [];\n var position = [];\n parseFunctionArgs(tokens).forEach(function (arg, i) {\n var isColorStop = true;\n if (i === 0) {\n var isAtPosition_1 = false;\n isColorStop = arg.reduce(function (acc, token) {\n if (isAtPosition_1) {\n if (isIdentToken(token)) {\n switch (token.value) {\n case 'center':\n position.push(FIFTY_PERCENT);\n return acc;\n case 'top':\n case 'left':\n position.push(ZERO_LENGTH);\n return acc;\n case 'right':\n case 'bottom':\n position.push(HUNDRED_PERCENT);\n return acc;\n }\n }\n else if (isLengthPercentage(token) || isLength(token)) {\n position.push(token);\n }\n }\n else if (isIdentToken(token)) {\n switch (token.value) {\n case CIRCLE:\n shape = 0 /* CIRCLE */;\n return false;\n case ELLIPSE:\n shape = 1 /* ELLIPSE */;\n return false;\n case 'at':\n isAtPosition_1 = true;\n return false;\n case CLOSEST_SIDE:\n size = 0 /* CLOSEST_SIDE */;\n return false;\n case COVER:\n case FARTHEST_SIDE:\n size = 1 /* FARTHEST_SIDE */;\n return false;\n case CONTAIN:\n case CLOSEST_CORNER:\n size = 2 /* CLOSEST_CORNER */;\n return false;\n case FARTHEST_CORNER:\n size = 3 /* FARTHEST_CORNER */;\n return false;\n }\n }\n else if (isLength(token) || isLengthPercentage(token)) {\n if (!Array.isArray(size)) {\n size = [];\n }\n size.push(token);\n return false;\n }\n return acc;\n }, isColorStop);\n }\n if (isColorStop) {\n var colorStop = parseColorStop(context, arg);\n stops.push(colorStop);\n }\n });\n return { size: size, shape: shape, stops: stops, position: position, type: 2 /* RADIAL_GRADIENT */ };\n};\n\nvar prefixRadialGradient = function (context, tokens) {\n var shape = 0 /* CIRCLE */;\n var size = 3 /* FARTHEST_CORNER */;\n var stops = [];\n var position = [];\n parseFunctionArgs(tokens).forEach(function (arg, i) {\n var isColorStop = true;\n if (i === 0) {\n isColorStop = arg.reduce(function (acc, token) {\n if (isIdentToken(token)) {\n switch (token.value) {\n case 'center':\n position.push(FIFTY_PERCENT);\n return false;\n case 'top':\n case 'left':\n position.push(ZERO_LENGTH);\n return false;\n case 'right':\n case 'bottom':\n position.push(HUNDRED_PERCENT);\n return false;\n }\n }\n else if (isLengthPercentage(token) || isLength(token)) {\n position.push(token);\n return false;\n }\n return acc;\n }, isColorStop);\n }\n else if (i === 1) {\n isColorStop = arg.reduce(function (acc, token) {\n if (isIdentToken(token)) {\n switch (token.value) {\n case CIRCLE:\n shape = 0 /* CIRCLE */;\n return false;\n case ELLIPSE:\n shape = 1 /* ELLIPSE */;\n return false;\n case CONTAIN:\n case CLOSEST_SIDE:\n size = 0 /* CLOSEST_SIDE */;\n return false;\n case FARTHEST_SIDE:\n size = 1 /* FARTHEST_SIDE */;\n return false;\n case CLOSEST_CORNER:\n size = 2 /* CLOSEST_CORNER */;\n return false;\n case COVER:\n case FARTHEST_CORNER:\n size = 3 /* FARTHEST_CORNER */;\n return false;\n }\n }\n else if (isLength(token) || isLengthPercentage(token)) {\n if (!Array.isArray(size)) {\n size = [];\n }\n size.push(token);\n return false;\n }\n return acc;\n }, isColorStop);\n }\n if (isColorStop) {\n var colorStop = parseColorStop(context, arg);\n stops.push(colorStop);\n }\n });\n return { size: size, shape: shape, stops: stops, position: position, type: 2 /* RADIAL_GRADIENT */ };\n};\n\nvar isLinearGradient = function (background) {\n return background.type === 1 /* LINEAR_GRADIENT */;\n};\nvar isRadialGradient = function (background) {\n return background.type === 2 /* RADIAL_GRADIENT */;\n};\nvar image = {\n name: 'image',\n parse: function (context, value) {\n if (value.type === 22 /* URL_TOKEN */) {\n var image_1 = { url: value.value, type: 0 /* URL */ };\n context.cache.addImage(value.value);\n return image_1;\n }\n if (value.type === 18 /* FUNCTION */) {\n var imageFunction = SUPPORTED_IMAGE_FUNCTIONS[value.name];\n if (typeof imageFunction === 'undefined') {\n throw new Error(\"Attempting to parse an unsupported image function \\\"\" + value.name + \"\\\"\");\n }\n return imageFunction(context, value.values);\n }\n throw new Error(\"Unsupported image type \" + value.type);\n }\n};\nfunction isSupportedImage(value) {\n return (!(value.type === 20 /* IDENT_TOKEN */ && value.value === 'none') &&\n (value.type !== 18 /* FUNCTION */ || !!SUPPORTED_IMAGE_FUNCTIONS[value.name]));\n}\nvar SUPPORTED_IMAGE_FUNCTIONS = {\n 'linear-gradient': linearGradient,\n '-moz-linear-gradient': prefixLinearGradient,\n '-ms-linear-gradient': prefixLinearGradient,\n '-o-linear-gradient': prefixLinearGradient,\n '-webkit-linear-gradient': prefixLinearGradient,\n 'radial-gradient': radialGradient,\n '-moz-radial-gradient': prefixRadialGradient,\n '-ms-radial-gradient': prefixRadialGradient,\n '-o-radial-gradient': prefixRadialGradient,\n '-webkit-radial-gradient': prefixRadialGradient,\n '-webkit-gradient': webkitGradient\n};\n\nvar backgroundImage = {\n name: 'background-image',\n initialValue: 'none',\n type: 1 /* LIST */,\n prefix: false,\n parse: function (context, tokens) {\n if (tokens.length === 0) {\n return [];\n }\n var first = tokens[0];\n if (first.type === 20 /* IDENT_TOKEN */ && first.value === 'none') {\n return [];\n }\n return tokens\n .filter(function (value) { return nonFunctionArgSeparator(value) && isSupportedImage(value); })\n .map(function (value) { return image.parse(context, value); });\n }\n};\n\nvar backgroundOrigin = {\n name: 'background-origin',\n initialValue: 'border-box',\n prefix: false,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n return tokens.map(function (token) {\n if (isIdentToken(token)) {\n switch (token.value) {\n case 'padding-box':\n return 1 /* PADDING_BOX */;\n case 'content-box':\n return 2 /* CONTENT_BOX */;\n }\n }\n return 0 /* BORDER_BOX */;\n });\n }\n};\n\nvar backgroundPosition = {\n name: 'background-position',\n initialValue: '0% 0%',\n type: 1 /* LIST */,\n prefix: false,\n parse: function (_context, tokens) {\n return parseFunctionArgs(tokens)\n .map(function (values) { return values.filter(isLengthPercentage); })\n .map(parseLengthPercentageTuple);\n }\n};\n\nvar backgroundRepeat = {\n name: 'background-repeat',\n initialValue: 'repeat',\n prefix: false,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n return parseFunctionArgs(tokens)\n .map(function (values) {\n return values\n .filter(isIdentToken)\n .map(function (token) { return token.value; })\n .join(' ');\n })\n .map(parseBackgroundRepeat);\n }\n};\nvar parseBackgroundRepeat = function (value) {\n switch (value) {\n case 'no-repeat':\n return 1 /* NO_REPEAT */;\n case 'repeat-x':\n case 'repeat no-repeat':\n return 2 /* REPEAT_X */;\n case 'repeat-y':\n case 'no-repeat repeat':\n return 3 /* REPEAT_Y */;\n case 'repeat':\n default:\n return 0 /* REPEAT */;\n }\n};\n\nvar BACKGROUND_SIZE;\n(function (BACKGROUND_SIZE) {\n BACKGROUND_SIZE[\"AUTO\"] = \"auto\";\n BACKGROUND_SIZE[\"CONTAIN\"] = \"contain\";\n BACKGROUND_SIZE[\"COVER\"] = \"cover\";\n})(BACKGROUND_SIZE || (BACKGROUND_SIZE = {}));\nvar backgroundSize = {\n name: 'background-size',\n initialValue: '0',\n prefix: false,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n return parseFunctionArgs(tokens).map(function (values) { return values.filter(isBackgroundSizeInfoToken); });\n }\n};\nvar isBackgroundSizeInfoToken = function (value) {\n return isIdentToken(value) || isLengthPercentage(value);\n};\n\nvar borderColorForSide = function (side) { return ({\n name: \"border-\" + side + \"-color\",\n initialValue: 'transparent',\n prefix: false,\n type: 3 /* TYPE_VALUE */,\n format: 'color'\n}); };\nvar borderTopColor = borderColorForSide('top');\nvar borderRightColor = borderColorForSide('right');\nvar borderBottomColor = borderColorForSide('bottom');\nvar borderLeftColor = borderColorForSide('left');\n\nvar borderRadiusForSide = function (side) { return ({\n name: \"border-radius-\" + side,\n initialValue: '0 0',\n prefix: false,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n return parseLengthPercentageTuple(tokens.filter(isLengthPercentage));\n }\n}); };\nvar borderTopLeftRadius = borderRadiusForSide('top-left');\nvar borderTopRightRadius = borderRadiusForSide('top-right');\nvar borderBottomRightRadius = borderRadiusForSide('bottom-right');\nvar borderBottomLeftRadius = borderRadiusForSide('bottom-left');\n\nvar borderStyleForSide = function (side) { return ({\n name: \"border-\" + side + \"-style\",\n initialValue: 'solid',\n prefix: false,\n type: 2 /* IDENT_VALUE */,\n parse: function (_context, style) {\n switch (style) {\n case 'none':\n return 0 /* NONE */;\n case 'dashed':\n return 2 /* DASHED */;\n case 'dotted':\n return 3 /* DOTTED */;\n case 'double':\n return 4 /* DOUBLE */;\n }\n return 1 /* SOLID */;\n }\n}); };\nvar borderTopStyle = borderStyleForSide('top');\nvar borderRightStyle = borderStyleForSide('right');\nvar borderBottomStyle = borderStyleForSide('bottom');\nvar borderLeftStyle = borderStyleForSide('left');\n\nvar borderWidthForSide = function (side) { return ({\n name: \"border-\" + side + \"-width\",\n initialValue: '0',\n type: 0 /* VALUE */,\n prefix: false,\n parse: function (_context, token) {\n if (isDimensionToken(token)) {\n return token.number;\n }\n return 0;\n }\n}); };\nvar borderTopWidth = borderWidthForSide('top');\nvar borderRightWidth = borderWidthForSide('right');\nvar borderBottomWidth = borderWidthForSide('bottom');\nvar borderLeftWidth = borderWidthForSide('left');\n\nvar color = {\n name: \"color\",\n initialValue: 'transparent',\n prefix: false,\n type: 3 /* TYPE_VALUE */,\n format: 'color'\n};\n\nvar direction = {\n name: 'direction',\n initialValue: 'ltr',\n prefix: false,\n type: 2 /* IDENT_VALUE */,\n parse: function (_context, direction) {\n switch (direction) {\n case 'rtl':\n return 1 /* RTL */;\n case 'ltr':\n default:\n return 0 /* LTR */;\n }\n }\n};\n\nvar display = {\n name: 'display',\n initialValue: 'inline-block',\n prefix: false,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n return tokens.filter(isIdentToken).reduce(function (bit, token) {\n return bit | parseDisplayValue(token.value);\n }, 0 /* NONE */);\n }\n};\nvar parseDisplayValue = function (display) {\n switch (display) {\n case 'block':\n case '-webkit-box':\n return 2 /* BLOCK */;\n case 'inline':\n return 4 /* INLINE */;\n case 'run-in':\n return 8 /* RUN_IN */;\n case 'flow':\n return 16 /* FLOW */;\n case 'flow-root':\n return 32 /* FLOW_ROOT */;\n case 'table':\n return 64 /* TABLE */;\n case 'flex':\n case '-webkit-flex':\n return 128 /* FLEX */;\n case 'grid':\n case '-ms-grid':\n return 256 /* GRID */;\n case 'ruby':\n return 512 /* RUBY */;\n case 'subgrid':\n return 1024 /* SUBGRID */;\n case 'list-item':\n return 2048 /* LIST_ITEM */;\n case 'table-row-group':\n return 4096 /* TABLE_ROW_GROUP */;\n case 'table-header-group':\n return 8192 /* TABLE_HEADER_GROUP */;\n case 'table-footer-group':\n return 16384 /* TABLE_FOOTER_GROUP */;\n case 'table-row':\n return 32768 /* TABLE_ROW */;\n case 'table-cell':\n return 65536 /* TABLE_CELL */;\n case 'table-column-group':\n return 131072 /* TABLE_COLUMN_GROUP */;\n case 'table-column':\n return 262144 /* TABLE_COLUMN */;\n case 'table-caption':\n return 524288 /* TABLE_CAPTION */;\n case 'ruby-base':\n return 1048576 /* RUBY_BASE */;\n case 'ruby-text':\n return 2097152 /* RUBY_TEXT */;\n case 'ruby-base-container':\n return 4194304 /* RUBY_BASE_CONTAINER */;\n case 'ruby-text-container':\n return 8388608 /* RUBY_TEXT_CONTAINER */;\n case 'contents':\n return 16777216 /* CONTENTS */;\n case 'inline-block':\n return 33554432 /* INLINE_BLOCK */;\n case 'inline-list-item':\n return 67108864 /* INLINE_LIST_ITEM */;\n case 'inline-table':\n return 134217728 /* INLINE_TABLE */;\n case 'inline-flex':\n return 268435456 /* INLINE_FLEX */;\n case 'inline-grid':\n return 536870912 /* INLINE_GRID */;\n }\n return 0 /* NONE */;\n};\n\nvar float = {\n name: 'float',\n initialValue: 'none',\n prefix: false,\n type: 2 /* IDENT_VALUE */,\n parse: function (_context, float) {\n switch (float) {\n case 'left':\n return 1 /* LEFT */;\n case 'right':\n return 2 /* RIGHT */;\n case 'inline-start':\n return 3 /* INLINE_START */;\n case 'inline-end':\n return 4 /* INLINE_END */;\n }\n return 0 /* NONE */;\n }\n};\n\nvar letterSpacing = {\n name: 'letter-spacing',\n initialValue: '0',\n prefix: false,\n type: 0 /* VALUE */,\n parse: function (_context, token) {\n if (token.type === 20 /* IDENT_TOKEN */ && token.value === 'normal') {\n return 0;\n }\n if (token.type === 17 /* NUMBER_TOKEN */) {\n return token.number;\n }\n if (token.type === 15 /* DIMENSION_TOKEN */) {\n return token.number;\n }\n return 0;\n }\n};\n\nvar LINE_BREAK;\n(function (LINE_BREAK) {\n LINE_BREAK[\"NORMAL\"] = \"normal\";\n LINE_BREAK[\"STRICT\"] = \"strict\";\n})(LINE_BREAK || (LINE_BREAK = {}));\nvar lineBreak = {\n name: 'line-break',\n initialValue: 'normal',\n prefix: false,\n type: 2 /* IDENT_VALUE */,\n parse: function (_context, lineBreak) {\n switch (lineBreak) {\n case 'strict':\n return LINE_BREAK.STRICT;\n case 'normal':\n default:\n return LINE_BREAK.NORMAL;\n }\n }\n};\n\nvar lineHeight = {\n name: 'line-height',\n initialValue: 'normal',\n prefix: false,\n type: 4 /* TOKEN_VALUE */\n};\nvar computeLineHeight = function (token, fontSize) {\n if (isIdentToken(token) && token.value === 'normal') {\n return 1.2 * fontSize;\n }\n else if (token.type === 17 /* NUMBER_TOKEN */) {\n return fontSize * token.number;\n }\n else if (isLengthPercentage(token)) {\n return getAbsoluteValue(token, fontSize);\n }\n return fontSize;\n};\n\nvar listStyleImage = {\n name: 'list-style-image',\n initialValue: 'none',\n type: 0 /* VALUE */,\n prefix: false,\n parse: function (context, token) {\n if (token.type === 20 /* IDENT_TOKEN */ && token.value === 'none') {\n return null;\n }\n return image.parse(context, token);\n }\n};\n\nvar listStylePosition = {\n name: 'list-style-position',\n initialValue: 'outside',\n prefix: false,\n type: 2 /* IDENT_VALUE */,\n parse: function (_context, position) {\n switch (position) {\n case 'inside':\n return 0 /* INSIDE */;\n case 'outside':\n default:\n return 1 /* OUTSIDE */;\n }\n }\n};\n\nvar listStyleType = {\n name: 'list-style-type',\n initialValue: 'none',\n prefix: false,\n type: 2 /* IDENT_VALUE */,\n parse: function (_context, type) {\n switch (type) {\n case 'disc':\n return 0 /* DISC */;\n case 'circle':\n return 1 /* CIRCLE */;\n case 'square':\n return 2 /* SQUARE */;\n case 'decimal':\n return 3 /* DECIMAL */;\n case 'cjk-decimal':\n return 4 /* CJK_DECIMAL */;\n case 'decimal-leading-zero':\n return 5 /* DECIMAL_LEADING_ZERO */;\n case 'lower-roman':\n return 6 /* LOWER_ROMAN */;\n case 'upper-roman':\n return 7 /* UPPER_ROMAN */;\n case 'lower-greek':\n return 8 /* LOWER_GREEK */;\n case 'lower-alpha':\n return 9 /* LOWER_ALPHA */;\n case 'upper-alpha':\n return 10 /* UPPER_ALPHA */;\n case 'arabic-indic':\n return 11 /* ARABIC_INDIC */;\n case 'armenian':\n return 12 /* ARMENIAN */;\n case 'bengali':\n return 13 /* BENGALI */;\n case 'cambodian':\n return 14 /* CAMBODIAN */;\n case 'cjk-earthly-branch':\n return 15 /* CJK_EARTHLY_BRANCH */;\n case 'cjk-heavenly-stem':\n return 16 /* CJK_HEAVENLY_STEM */;\n case 'cjk-ideographic':\n return 17 /* CJK_IDEOGRAPHIC */;\n case 'devanagari':\n return 18 /* DEVANAGARI */;\n case 'ethiopic-numeric':\n return 19 /* ETHIOPIC_NUMERIC */;\n case 'georgian':\n return 20 /* GEORGIAN */;\n case 'gujarati':\n return 21 /* GUJARATI */;\n case 'gurmukhi':\n return 22 /* GURMUKHI */;\n case 'hebrew':\n return 22 /* HEBREW */;\n case 'hiragana':\n return 23 /* HIRAGANA */;\n case 'hiragana-iroha':\n return 24 /* HIRAGANA_IROHA */;\n case 'japanese-formal':\n return 25 /* JAPANESE_FORMAL */;\n case 'japanese-informal':\n return 26 /* JAPANESE_INFORMAL */;\n case 'kannada':\n return 27 /* KANNADA */;\n case 'katakana':\n return 28 /* KATAKANA */;\n case 'katakana-iroha':\n return 29 /* KATAKANA_IROHA */;\n case 'khmer':\n return 30 /* KHMER */;\n case 'korean-hangul-formal':\n return 31 /* KOREAN_HANGUL_FORMAL */;\n case 'korean-hanja-formal':\n return 32 /* KOREAN_HANJA_FORMAL */;\n case 'korean-hanja-informal':\n return 33 /* KOREAN_HANJA_INFORMAL */;\n case 'lao':\n return 34 /* LAO */;\n case 'lower-armenian':\n return 35 /* LOWER_ARMENIAN */;\n case 'malayalam':\n return 36 /* MALAYALAM */;\n case 'mongolian':\n return 37 /* MONGOLIAN */;\n case 'myanmar':\n return 38 /* MYANMAR */;\n case 'oriya':\n return 39 /* ORIYA */;\n case 'persian':\n return 40 /* PERSIAN */;\n case 'simp-chinese-formal':\n return 41 /* SIMP_CHINESE_FORMAL */;\n case 'simp-chinese-informal':\n return 42 /* SIMP_CHINESE_INFORMAL */;\n case 'tamil':\n return 43 /* TAMIL */;\n case 'telugu':\n return 44 /* TELUGU */;\n case 'thai':\n return 45 /* THAI */;\n case 'tibetan':\n return 46 /* TIBETAN */;\n case 'trad-chinese-formal':\n return 47 /* TRAD_CHINESE_FORMAL */;\n case 'trad-chinese-informal':\n return 48 /* TRAD_CHINESE_INFORMAL */;\n case 'upper-armenian':\n return 49 /* UPPER_ARMENIAN */;\n case 'disclosure-open':\n return 50 /* DISCLOSURE_OPEN */;\n case 'disclosure-closed':\n return 51 /* DISCLOSURE_CLOSED */;\n case 'none':\n default:\n return -1 /* NONE */;\n }\n }\n};\n\nvar marginForSide = function (side) { return ({\n name: \"margin-\" + side,\n initialValue: '0',\n prefix: false,\n type: 4 /* TOKEN_VALUE */\n}); };\nvar marginTop = marginForSide('top');\nvar marginRight = marginForSide('right');\nvar marginBottom = marginForSide('bottom');\nvar marginLeft = marginForSide('left');\n\nvar overflow = {\n name: 'overflow',\n initialValue: 'visible',\n prefix: false,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n return tokens.filter(isIdentToken).map(function (overflow) {\n switch (overflow.value) {\n case 'hidden':\n return 1 /* HIDDEN */;\n case 'scroll':\n return 2 /* SCROLL */;\n case 'clip':\n return 3 /* CLIP */;\n case 'auto':\n return 4 /* AUTO */;\n case 'visible':\n default:\n return 0 /* VISIBLE */;\n }\n });\n }\n};\n\nvar overflowWrap = {\n name: 'overflow-wrap',\n initialValue: 'normal',\n prefix: false,\n type: 2 /* IDENT_VALUE */,\n parse: function (_context, overflow) {\n switch (overflow) {\n case 'break-word':\n return \"break-word\" /* BREAK_WORD */;\n case 'normal':\n default:\n return \"normal\" /* NORMAL */;\n }\n }\n};\n\nvar paddingForSide = function (side) { return ({\n name: \"padding-\" + side,\n initialValue: '0',\n prefix: false,\n type: 3 /* TYPE_VALUE */,\n format: 'length-percentage'\n}); };\nvar paddingTop = paddingForSide('top');\nvar paddingRight = paddingForSide('right');\nvar paddingBottom = paddingForSide('bottom');\nvar paddingLeft = paddingForSide('left');\n\nvar textAlign = {\n name: 'text-align',\n initialValue: 'left',\n prefix: false,\n type: 2 /* IDENT_VALUE */,\n parse: function (_context, textAlign) {\n switch (textAlign) {\n case 'right':\n return 2 /* RIGHT */;\n case 'center':\n case 'justify':\n return 1 /* CENTER */;\n case 'left':\n default:\n return 0 /* LEFT */;\n }\n }\n};\n\nvar position = {\n name: 'position',\n initialValue: 'static',\n prefix: false,\n type: 2 /* IDENT_VALUE */,\n parse: function (_context, position) {\n switch (position) {\n case 'relative':\n return 1 /* RELATIVE */;\n case 'absolute':\n return 2 /* ABSOLUTE */;\n case 'fixed':\n return 3 /* FIXED */;\n case 'sticky':\n return 4 /* STICKY */;\n }\n return 0 /* STATIC */;\n }\n};\n\nvar textShadow = {\n name: 'text-shadow',\n initialValue: 'none',\n type: 1 /* LIST */,\n prefix: false,\n parse: function (context, tokens) {\n if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) {\n return [];\n }\n return parseFunctionArgs(tokens).map(function (values) {\n var shadow = {\n color: COLORS.TRANSPARENT,\n offsetX: ZERO_LENGTH,\n offsetY: ZERO_LENGTH,\n blur: ZERO_LENGTH\n };\n var c = 0;\n for (var i = 0; i < values.length; i++) {\n var token = values[i];\n if (isLength(token)) {\n if (c === 0) {\n shadow.offsetX = token;\n }\n else if (c === 1) {\n shadow.offsetY = token;\n }\n else {\n shadow.blur = token;\n }\n c++;\n }\n else {\n shadow.color = color$1.parse(context, token);\n }\n }\n return shadow;\n });\n }\n};\n\nvar textTransform = {\n name: 'text-transform',\n initialValue: 'none',\n prefix: false,\n type: 2 /* IDENT_VALUE */,\n parse: function (_context, textTransform) {\n switch (textTransform) {\n case 'uppercase':\n return 2 /* UPPERCASE */;\n case 'lowercase':\n return 1 /* LOWERCASE */;\n case 'capitalize':\n return 3 /* CAPITALIZE */;\n }\n return 0 /* NONE */;\n }\n};\n\nvar transform$1 = {\n name: 'transform',\n initialValue: 'none',\n prefix: true,\n type: 0 /* VALUE */,\n parse: function (_context, token) {\n if (token.type === 20 /* IDENT_TOKEN */ && token.value === 'none') {\n return null;\n }\n if (token.type === 18 /* FUNCTION */) {\n var transformFunction = SUPPORTED_TRANSFORM_FUNCTIONS[token.name];\n if (typeof transformFunction === 'undefined') {\n throw new Error(\"Attempting to parse an unsupported transform function \\\"\" + token.name + \"\\\"\");\n }\n return transformFunction(token.values);\n }\n return null;\n }\n};\nvar matrix = function (args) {\n var values = args.filter(function (arg) { return arg.type === 17 /* NUMBER_TOKEN */; }).map(function (arg) { return arg.number; });\n return values.length === 6 ? values : null;\n};\n// doesn't support 3D transforms at the moment\nvar matrix3d = function (args) {\n var values = args.filter(function (arg) { return arg.type === 17 /* NUMBER_TOKEN */; }).map(function (arg) { return arg.number; });\n var a1 = values[0], b1 = values[1]; values[2]; values[3]; var a2 = values[4], b2 = values[5]; values[6]; values[7]; values[8]; values[9]; values[10]; values[11]; var a4 = values[12], b4 = values[13]; values[14]; values[15];\n return values.length === 16 ? [a1, b1, a2, b2, a4, b4] : null;\n};\nvar SUPPORTED_TRANSFORM_FUNCTIONS = {\n matrix: matrix,\n matrix3d: matrix3d\n};\n\nvar DEFAULT_VALUE = {\n type: 16 /* PERCENTAGE_TOKEN */,\n number: 50,\n flags: FLAG_INTEGER\n};\nvar DEFAULT = [DEFAULT_VALUE, DEFAULT_VALUE];\nvar transformOrigin = {\n name: 'transform-origin',\n initialValue: '50% 50%',\n prefix: true,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n var origins = tokens.filter(isLengthPercentage);\n if (origins.length !== 2) {\n return DEFAULT;\n }\n return [origins[0], origins[1]];\n }\n};\n\nvar visibility = {\n name: 'visible',\n initialValue: 'none',\n prefix: false,\n type: 2 /* IDENT_VALUE */,\n parse: function (_context, visibility) {\n switch (visibility) {\n case 'hidden':\n return 1 /* HIDDEN */;\n case 'collapse':\n return 2 /* COLLAPSE */;\n case 'visible':\n default:\n return 0 /* VISIBLE */;\n }\n }\n};\n\nvar WORD_BREAK;\n(function (WORD_BREAK) {\n WORD_BREAK[\"NORMAL\"] = \"normal\";\n WORD_BREAK[\"BREAK_ALL\"] = \"break-all\";\n WORD_BREAK[\"KEEP_ALL\"] = \"keep-all\";\n})(WORD_BREAK || (WORD_BREAK = {}));\nvar wordBreak = {\n name: 'word-break',\n initialValue: 'normal',\n prefix: false,\n type: 2 /* IDENT_VALUE */,\n parse: function (_context, wordBreak) {\n switch (wordBreak) {\n case 'break-all':\n return WORD_BREAK.BREAK_ALL;\n case 'keep-all':\n return WORD_BREAK.KEEP_ALL;\n case 'normal':\n default:\n return WORD_BREAK.NORMAL;\n }\n }\n};\n\nvar zIndex = {\n name: 'z-index',\n initialValue: 'auto',\n prefix: false,\n type: 0 /* VALUE */,\n parse: function (_context, token) {\n if (token.type === 20 /* IDENT_TOKEN */) {\n return { auto: true, order: 0 };\n }\n if (isNumberToken(token)) {\n return { auto: false, order: token.number };\n }\n throw new Error(\"Invalid z-index number parsed\");\n }\n};\n\nvar time = {\n name: 'time',\n parse: function (_context, value) {\n if (value.type === 15 /* DIMENSION_TOKEN */) {\n switch (value.unit.toLowerCase()) {\n case 's':\n return 1000 * value.number;\n case 'ms':\n return value.number;\n }\n }\n throw new Error(\"Unsupported time type\");\n }\n};\n\nvar opacity = {\n name: 'opacity',\n initialValue: '1',\n type: 0 /* VALUE */,\n prefix: false,\n parse: function (_context, token) {\n if (isNumberToken(token)) {\n return token.number;\n }\n return 1;\n }\n};\n\nvar textDecorationColor = {\n name: \"text-decoration-color\",\n initialValue: 'transparent',\n prefix: false,\n type: 3 /* TYPE_VALUE */,\n format: 'color'\n};\n\nvar textDecorationLine = {\n name: 'text-decoration-line',\n initialValue: 'none',\n prefix: false,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n return tokens\n .filter(isIdentToken)\n .map(function (token) {\n switch (token.value) {\n case 'underline':\n return 1 /* UNDERLINE */;\n case 'overline':\n return 2 /* OVERLINE */;\n case 'line-through':\n return 3 /* LINE_THROUGH */;\n case 'none':\n return 4 /* BLINK */;\n }\n return 0 /* NONE */;\n })\n .filter(function (line) { return line !== 0 /* NONE */; });\n }\n};\n\nvar fontFamily = {\n name: \"font-family\",\n initialValue: '',\n prefix: false,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n var accumulator = [];\n var results = [];\n tokens.forEach(function (token) {\n switch (token.type) {\n case 20 /* IDENT_TOKEN */:\n case 0 /* STRING_TOKEN */:\n accumulator.push(token.value);\n break;\n case 17 /* NUMBER_TOKEN */:\n accumulator.push(token.number.toString());\n break;\n case 4 /* COMMA_TOKEN */:\n results.push(accumulator.join(' '));\n accumulator.length = 0;\n break;\n }\n });\n if (accumulator.length) {\n results.push(accumulator.join(' '));\n }\n return results.map(function (result) { return (result.indexOf(' ') === -1 ? result : \"'\" + result + \"'\"); });\n }\n};\n\nvar fontSize = {\n name: \"font-size\",\n initialValue: '0',\n prefix: false,\n type: 3 /* TYPE_VALUE */,\n format: 'length'\n};\n\nvar fontWeight = {\n name: 'font-weight',\n initialValue: 'normal',\n type: 0 /* VALUE */,\n prefix: false,\n parse: function (_context, token) {\n if (isNumberToken(token)) {\n return token.number;\n }\n if (isIdentToken(token)) {\n switch (token.value) {\n case 'bold':\n return 700;\n case 'normal':\n default:\n return 400;\n }\n }\n return 400;\n }\n};\n\nvar fontVariant = {\n name: 'font-variant',\n initialValue: 'none',\n type: 1 /* LIST */,\n prefix: false,\n parse: function (_context, tokens) {\n return tokens.filter(isIdentToken).map(function (token) { return token.value; });\n }\n};\n\nvar fontStyle = {\n name: 'font-style',\n initialValue: 'normal',\n prefix: false,\n type: 2 /* IDENT_VALUE */,\n parse: function (_context, overflow) {\n switch (overflow) {\n case 'oblique':\n return \"oblique\" /* OBLIQUE */;\n case 'italic':\n return \"italic\" /* ITALIC */;\n case 'normal':\n default:\n return \"normal\" /* NORMAL */;\n }\n }\n};\n\nvar contains = function (bit, value) { return (bit & value) !== 0; };\n\nvar content = {\n name: 'content',\n initialValue: 'none',\n type: 1 /* LIST */,\n prefix: false,\n parse: function (_context, tokens) {\n if (tokens.length === 0) {\n return [];\n }\n var first = tokens[0];\n if (first.type === 20 /* IDENT_TOKEN */ && first.value === 'none') {\n return [];\n }\n return tokens;\n }\n};\n\nvar counterIncrement = {\n name: 'counter-increment',\n initialValue: 'none',\n prefix: true,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n if (tokens.length === 0) {\n return null;\n }\n var first = tokens[0];\n if (first.type === 20 /* IDENT_TOKEN */ && first.value === 'none') {\n return null;\n }\n var increments = [];\n var filtered = tokens.filter(nonWhiteSpace);\n for (var i = 0; i < filtered.length; i++) {\n var counter = filtered[i];\n var next = filtered[i + 1];\n if (counter.type === 20 /* IDENT_TOKEN */) {\n var increment = next && isNumberToken(next) ? next.number : 1;\n increments.push({ counter: counter.value, increment: increment });\n }\n }\n return increments;\n }\n};\n\nvar counterReset = {\n name: 'counter-reset',\n initialValue: 'none',\n prefix: true,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n if (tokens.length === 0) {\n return [];\n }\n var resets = [];\n var filtered = tokens.filter(nonWhiteSpace);\n for (var i = 0; i < filtered.length; i++) {\n var counter = filtered[i];\n var next = filtered[i + 1];\n if (isIdentToken(counter) && counter.value !== 'none') {\n var reset = next && isNumberToken(next) ? next.number : 0;\n resets.push({ counter: counter.value, reset: reset });\n }\n }\n return resets;\n }\n};\n\nvar duration = {\n name: 'duration',\n initialValue: '0s',\n prefix: false,\n type: 1 /* LIST */,\n parse: function (context, tokens) {\n return tokens.filter(isDimensionToken).map(function (token) { return time.parse(context, token); });\n }\n};\n\nvar quotes = {\n name: 'quotes',\n initialValue: 'none',\n prefix: true,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n if (tokens.length === 0) {\n return null;\n }\n var first = tokens[0];\n if (first.type === 20 /* IDENT_TOKEN */ && first.value === 'none') {\n return null;\n }\n var quotes = [];\n var filtered = tokens.filter(isStringToken);\n if (filtered.length % 2 !== 0) {\n return null;\n }\n for (var i = 0; i < filtered.length; i += 2) {\n var open_1 = filtered[i].value;\n var close_1 = filtered[i + 1].value;\n quotes.push({ open: open_1, close: close_1 });\n }\n return quotes;\n }\n};\nvar getQuote = function (quotes, depth, open) {\n if (!quotes) {\n return '';\n }\n var quote = quotes[Math.min(depth, quotes.length - 1)];\n if (!quote) {\n return '';\n }\n return open ? quote.open : quote.close;\n};\n\nvar boxShadow = {\n name: 'box-shadow',\n initialValue: 'none',\n type: 1 /* LIST */,\n prefix: false,\n parse: function (context, tokens) {\n if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) {\n return [];\n }\n return parseFunctionArgs(tokens).map(function (values) {\n var shadow = {\n color: 0x000000ff,\n offsetX: ZERO_LENGTH,\n offsetY: ZERO_LENGTH,\n blur: ZERO_LENGTH,\n spread: ZERO_LENGTH,\n inset: false\n };\n var c = 0;\n for (var i = 0; i < values.length; i++) {\n var token = values[i];\n if (isIdentWithValue(token, 'inset')) {\n shadow.inset = true;\n }\n else if (isLength(token)) {\n if (c === 0) {\n shadow.offsetX = token;\n }\n else if (c === 1) {\n shadow.offsetY = token;\n }\n else if (c === 2) {\n shadow.blur = token;\n }\n else {\n shadow.spread = token;\n }\n c++;\n }\n else {\n shadow.color = color$1.parse(context, token);\n }\n }\n return shadow;\n });\n }\n};\n\nvar paintOrder = {\n name: 'paint-order',\n initialValue: 'normal',\n prefix: false,\n type: 1 /* LIST */,\n parse: function (_context, tokens) {\n var DEFAULT_VALUE = [0 /* FILL */, 1 /* STROKE */, 2 /* MARKERS */];\n var layers = [];\n tokens.filter(isIdentToken).forEach(function (token) {\n switch (token.value) {\n case 'stroke':\n layers.push(1 /* STROKE */);\n break;\n case 'fill':\n layers.push(0 /* FILL */);\n break;\n case 'markers':\n layers.push(2 /* MARKERS */);\n break;\n }\n });\n DEFAULT_VALUE.forEach(function (value) {\n if (layers.indexOf(value) === -1) {\n layers.push(value);\n }\n });\n return layers;\n }\n};\n\nvar webkitTextStrokeColor = {\n name: \"-webkit-text-stroke-color\",\n initialValue: 'currentcolor',\n prefix: false,\n type: 3 /* TYPE_VALUE */,\n format: 'color'\n};\n\nvar webkitTextStrokeWidth = {\n name: \"-webkit-text-stroke-width\",\n initialValue: '0',\n type: 0 /* VALUE */,\n prefix: false,\n parse: function (_context, token) {\n if (isDimensionToken(token)) {\n return token.number;\n }\n return 0;\n }\n};\n\nvar CSSParsedDeclaration = /** @class */ (function () {\n function CSSParsedDeclaration(context, declaration) {\n var _a, _b;\n this.animationDuration = parse(context, duration, declaration.animationDuration);\n this.backgroundClip = parse(context, backgroundClip, declaration.backgroundClip);\n this.backgroundColor = parse(context, backgroundColor, declaration.backgroundColor);\n this.backgroundImage = parse(context, backgroundImage, declaration.backgroundImage);\n this.backgroundOrigin = parse(context, backgroundOrigin, declaration.backgroundOrigin);\n this.backgroundPosition = parse(context, backgroundPosition, declaration.backgroundPosition);\n this.backgroundRepeat = parse(context, backgroundRepeat, declaration.backgroundRepeat);\n this.backgroundSize = parse(context, backgroundSize, declaration.backgroundSize);\n this.borderTopColor = parse(context, borderTopColor, declaration.borderTopColor);\n this.borderRightColor = parse(context, borderRightColor, declaration.borderRightColor);\n this.borderBottomColor = parse(context, borderBottomColor, declaration.borderBottomColor);\n this.borderLeftColor = parse(context, borderLeftColor, declaration.borderLeftColor);\n this.borderTopLeftRadius = parse(context, borderTopLeftRadius, declaration.borderTopLeftRadius);\n this.borderTopRightRadius = parse(context, borderTopRightRadius, declaration.borderTopRightRadius);\n this.borderBottomRightRadius = parse(context, borderBottomRightRadius, declaration.borderBottomRightRadius);\n this.borderBottomLeftRadius = parse(context, borderBottomLeftRadius, declaration.borderBottomLeftRadius);\n this.borderTopStyle = parse(context, borderTopStyle, declaration.borderTopStyle);\n this.borderRightStyle = parse(context, borderRightStyle, declaration.borderRightStyle);\n this.borderBottomStyle = parse(context, borderBottomStyle, declaration.borderBottomStyle);\n this.borderLeftStyle = parse(context, borderLeftStyle, declaration.borderLeftStyle);\n this.borderTopWidth = parse(context, borderTopWidth, declaration.borderTopWidth);\n this.borderRightWidth = parse(context, borderRightWidth, declaration.borderRightWidth);\n this.borderBottomWidth = parse(context, borderBottomWidth, declaration.borderBottomWidth);\n this.borderLeftWidth = parse(context, borderLeftWidth, declaration.borderLeftWidth);\n this.boxShadow = parse(context, boxShadow, declaration.boxShadow);\n this.color = parse(context, color, declaration.color);\n this.direction = parse(context, direction, declaration.direction);\n this.display = parse(context, display, declaration.display);\n this.float = parse(context, float, declaration.cssFloat);\n this.fontFamily = parse(context, fontFamily, declaration.fontFamily);\n this.fontSize = parse(context, fontSize, declaration.fontSize);\n this.fontStyle = parse(context, fontStyle, declaration.fontStyle);\n this.fontVariant = parse(context, fontVariant, declaration.fontVariant);\n this.fontWeight = parse(context, fontWeight, declaration.fontWeight);\n this.letterSpacing = parse(context, letterSpacing, declaration.letterSpacing);\n this.lineBreak = parse(context, lineBreak, declaration.lineBreak);\n this.lineHeight = parse(context, lineHeight, declaration.lineHeight);\n this.listStyleImage = parse(context, listStyleImage, declaration.listStyleImage);\n this.listStylePosition = parse(context, listStylePosition, declaration.listStylePosition);\n this.listStyleType = parse(context, listStyleType, declaration.listStyleType);\n this.marginTop = parse(context, marginTop, declaration.marginTop);\n this.marginRight = parse(context, marginRight, declaration.marginRight);\n this.marginBottom = parse(context, marginBottom, declaration.marginBottom);\n this.marginLeft = parse(context, marginLeft, declaration.marginLeft);\n this.opacity = parse(context, opacity, declaration.opacity);\n var overflowTuple = parse(context, overflow, declaration.overflow);\n this.overflowX = overflowTuple[0];\n this.overflowY = overflowTuple[overflowTuple.length > 1 ? 1 : 0];\n this.overflowWrap = parse(context, overflowWrap, declaration.overflowWrap);\n this.paddingTop = parse(context, paddingTop, declaration.paddingTop);\n this.paddingRight = parse(context, paddingRight, declaration.paddingRight);\n this.paddingBottom = parse(context, paddingBottom, declaration.paddingBottom);\n this.paddingLeft = parse(context, paddingLeft, declaration.paddingLeft);\n this.paintOrder = parse(context, paintOrder, declaration.paintOrder);\n this.position = parse(context, position, declaration.position);\n this.textAlign = parse(context, textAlign, declaration.textAlign);\n this.textDecorationColor = parse(context, textDecorationColor, (_a = declaration.textDecorationColor) !== null && _a !== void 0 ? _a : declaration.color);\n this.textDecorationLine = parse(context, textDecorationLine, (_b = declaration.textDecorationLine) !== null && _b !== void 0 ? _b : declaration.textDecoration);\n this.textShadow = parse(context, textShadow, declaration.textShadow);\n this.textTransform = parse(context, textTransform, declaration.textTransform);\n this.transform = parse(context, transform$1, declaration.transform);\n this.transformOrigin = parse(context, transformOrigin, declaration.transformOrigin);\n this.visibility = parse(context, visibility, declaration.visibility);\n this.webkitTextStrokeColor = parse(context, webkitTextStrokeColor, declaration.webkitTextStrokeColor);\n this.webkitTextStrokeWidth = parse(context, webkitTextStrokeWidth, declaration.webkitTextStrokeWidth);\n this.wordBreak = parse(context, wordBreak, declaration.wordBreak);\n this.zIndex = parse(context, zIndex, declaration.zIndex);\n }\n CSSParsedDeclaration.prototype.isVisible = function () {\n return this.display > 0 && this.opacity > 0 && this.visibility === 0 /* VISIBLE */;\n };\n CSSParsedDeclaration.prototype.isTransparent = function () {\n return isTransparent(this.backgroundColor);\n };\n CSSParsedDeclaration.prototype.isTransformed = function () {\n return this.transform !== null;\n };\n CSSParsedDeclaration.prototype.isPositioned = function () {\n return this.position !== 0 /* STATIC */;\n };\n CSSParsedDeclaration.prototype.isPositionedWithZIndex = function () {\n return this.isPositioned() && !this.zIndex.auto;\n };\n CSSParsedDeclaration.prototype.isFloating = function () {\n return this.float !== 0 /* NONE */;\n };\n CSSParsedDeclaration.prototype.isInlineLevel = function () {\n return (contains(this.display, 4 /* INLINE */) ||\n contains(this.display, 33554432 /* INLINE_BLOCK */) ||\n contains(this.display, 268435456 /* INLINE_FLEX */) ||\n contains(this.display, 536870912 /* INLINE_GRID */) ||\n contains(this.display, 67108864 /* INLINE_LIST_ITEM */) ||\n contains(this.display, 134217728 /* INLINE_TABLE */));\n };\n return CSSParsedDeclaration;\n}());\nvar CSSParsedPseudoDeclaration = /** @class */ (function () {\n function CSSParsedPseudoDeclaration(context, declaration) {\n this.content = parse(context, content, declaration.content);\n this.quotes = parse(context, quotes, declaration.quotes);\n }\n return CSSParsedPseudoDeclaration;\n}());\nvar CSSParsedCounterDeclaration = /** @class */ (function () {\n function CSSParsedCounterDeclaration(context, declaration) {\n this.counterIncrement = parse(context, counterIncrement, declaration.counterIncrement);\n this.counterReset = parse(context, counterReset, declaration.counterReset);\n }\n return CSSParsedCounterDeclaration;\n}());\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nvar parse = function (context, descriptor, style) {\n var tokenizer = new Tokenizer();\n var value = style !== null && typeof style !== 'undefined' ? style.toString() : descriptor.initialValue;\n tokenizer.write(value);\n var parser = new Parser(tokenizer.read());\n switch (descriptor.type) {\n case 2 /* IDENT_VALUE */:\n var token = parser.parseComponentValue();\n return descriptor.parse(context, isIdentToken(token) ? token.value : descriptor.initialValue);\n case 0 /* VALUE */:\n return descriptor.parse(context, parser.parseComponentValue());\n case 1 /* LIST */:\n return descriptor.parse(context, parser.parseComponentValues());\n case 4 /* TOKEN_VALUE */:\n return parser.parseComponentValue();\n case 3 /* TYPE_VALUE */:\n switch (descriptor.format) {\n case 'angle':\n return angle.parse(context, parser.parseComponentValue());\n case 'color':\n return color$1.parse(context, parser.parseComponentValue());\n case 'image':\n return image.parse(context, parser.parseComponentValue());\n case 'length':\n var length_1 = parser.parseComponentValue();\n return isLength(length_1) ? length_1 : ZERO_LENGTH;\n case 'length-percentage':\n var value_1 = parser.parseComponentValue();\n return isLengthPercentage(value_1) ? value_1 : ZERO_LENGTH;\n case 'time':\n return time.parse(context, parser.parseComponentValue());\n }\n break;\n }\n};\n\nvar elementDebuggerAttribute = 'data-html2canvas-debug';\nvar getElementDebugType = function (element) {\n var attribute = element.getAttribute(elementDebuggerAttribute);\n switch (attribute) {\n case 'all':\n return 1 /* ALL */;\n case 'clone':\n return 2 /* CLONE */;\n case 'parse':\n return 3 /* PARSE */;\n case 'render':\n return 4 /* RENDER */;\n default:\n return 0 /* NONE */;\n }\n};\nvar isDebugging = function (element, type) {\n var elementType = getElementDebugType(element);\n return elementType === 1 /* ALL */ || type === elementType;\n};\n\nvar ElementContainer = /** @class */ (function () {\n function ElementContainer(context, element) {\n this.context = context;\n this.textNodes = [];\n this.elements = [];\n this.flags = 0;\n if (isDebugging(element, 3 /* PARSE */)) {\n debugger;\n }\n this.styles = new CSSParsedDeclaration(context, window.getComputedStyle(element, null));\n if (isHTMLElementNode(element)) {\n if (this.styles.animationDuration.some(function (duration) { return duration > 0; })) {\n element.style.animationDuration = '0s';\n }\n if (this.styles.transform !== null) {\n // getBoundingClientRect takes transforms into account\n element.style.transform = 'none';\n }\n }\n this.bounds = parseBounds(this.context, element);\n if (isDebugging(element, 4 /* RENDER */)) {\n this.flags |= 16 /* DEBUG_RENDER */;\n }\n }\n return ElementContainer;\n}());\n\n/*\n * text-segmentation 1.0.3 \n * Copyright (c) 2022 Niklas von Hertzen \n * Released under MIT License\n */\nvar base64 = 'AAAAAAAAAAAAEA4AGBkAAFAaAAACAAAAAAAIABAAGAAwADgACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAAQABIAEQATAAIABAACAAQAAgAEAAIABAAVABcAAgAEAAIABAACAAQAGAAaABwAHgAgACIAI4AlgAIABAAmwCjAKgAsAC2AL4AvQDFAMoA0gBPAVYBWgEIAAgACACMANoAYgFkAWwBdAF8AX0BhQGNAZUBlgGeAaMBlQGWAasBswF8AbsBwwF0AcsBYwHTAQgA2wG/AOMBdAF8AekB8QF0AfkB+wHiAHQBfAEIAAMC5gQIAAsCEgIIAAgAFgIeAggAIgIpAggAMQI5AkACygEIAAgASAJQAlgCYAIIAAgACAAKBQoFCgUTBRMFGQUrBSsFCAAIAAgACAAIAAgACAAIAAgACABdAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABoAmgCrwGvAQgAbgJ2AggAHgEIAAgACADnAXsCCAAIAAgAgwIIAAgACAAIAAgACACKAggAkQKZAggAPADJAAgAoQKkAqwCsgK6AsICCADJAggA0AIIAAgACAAIANYC3gIIAAgACAAIAAgACABAAOYCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAkASoB+QIEAAgACAA8AEMCCABCBQgACABJBVAFCAAIAAgACAAIAAgACAAIAAgACABTBVoFCAAIAFoFCABfBWUFCAAIAAgACAAIAAgAbQUIAAgACAAIAAgACABzBXsFfQWFBYoFigWKBZEFigWKBYoFmAWfBaYFrgWxBbkFCAAIAAgACAAIAAgACAAIAAgACAAIAMEFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAMgFCADQBQgACAAIAAgACAAIAAgACAAIAAgACAAIAO4CCAAIAAgAiQAIAAgACABAAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAD0AggACAD8AggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIANYFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAMDvwAIAAgAJAIIAAgACAAIAAgACAAIAAgACwMTAwgACAB9BOsEGwMjAwgAKwMyAwsFYgE3A/MEPwMIAEUDTQNRAwgAWQOsAGEDCAAIAAgACAAIAAgACABpAzQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFIQUoBSwFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABtAwgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABMAEwACAAIAAgACAAIABgACAAIAAgACAC/AAgACAAyAQgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACAAIAAwAAgACAAIAAgACAAIAAgACAAIAAAARABIAAgACAAIABQASAAIAAgAIABwAEAAjgCIABsAqAC2AL0AigDQAtwC+IJIQqVAZUBWQqVAZUBlQGVAZUBlQGrC5UBlQGVAZUBlQGVAZUBlQGVAXsKlQGVAbAK6wsrDGUMpQzlDJUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAfAKAAuZA64AtwCJALoC6ADwAAgAuACgA/oEpgO6AqsD+AAIAAgAswMIAAgACAAIAIkAuwP5AfsBwwPLAwgACAAIAAgACADRA9kDCAAIAOED6QMIAAgACAAIAAgACADuA/YDCAAIAP4DyQAIAAgABgQIAAgAXQAOBAgACAAIAAgACAAIABMECAAIAAgACAAIAAgACAD8AAQBCAAIAAgAGgQiBCoECAExBAgAEAEIAAgACAAIAAgACAAIAAgACAAIAAgACAA4BAgACABABEYECAAIAAgATAQYAQgAVAQIAAgACAAIAAgACAAIAAgACAAIAFoECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAOQEIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAB+BAcACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEABhgSMBAgACAAIAAgAlAQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAwAEAAQABAADAAMAAwADAAQABAAEAAQABAAEAAQABHATAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAdQMIAAgACAAIAAgACAAIAMkACAAIAAgAfQMIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACFA4kDCAAIAAgACAAIAOcBCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAIcDCAAIAAgACAAIAAgACAAIAAgACAAIAJEDCAAIAAgACADFAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABgBAgAZgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAbAQCBXIECAAIAHkECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAJwEQACjBKoEsgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAC6BMIECAAIAAgACAAIAAgACABmBAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAxwQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAGYECAAIAAgAzgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBd0FXwUIAOIF6gXxBYoF3gT5BQAGCAaKBYoFigWKBYoFigWKBYoFigWKBYoFigXWBIoFigWKBYoFigWKBYoFigWKBYsFEAaKBYoFigWKBYoFigWKBRQGCACKBYoFigWKBQgACAAIANEECAAIABgGigUgBggAJgYIAC4GMwaKBYoF0wQ3Bj4GigWKBYoFigWKBYoFigWKBYoFigWKBYoFigUIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWLBf///////wQABAAEAAQABAAEAAQABAAEAAQAAwAEAAQAAgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAQADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUAAAAFAAUAAAAFAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAQAAAAUABQAFAAUABQAFAAAAAAAFAAUAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAFAAUAAQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAAABwAHAAcAAAAHAAcABwAFAAEAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAcABwAFAAUAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQABAAAAAAAAAAAAAAAFAAUABQAFAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAHAAcAAAAHAAcAAAAAAAUABQAHAAUAAQAHAAEABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwABAAUABQAFAAUAAAAAAAAAAAAAAAEAAQABAAEAAQABAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABQANAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAABQAHAAUABQAFAAAAAAAAAAcABQAFAAUABQAFAAQABAAEAAQABAAEAAQABAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUAAAAFAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAUAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAcABwAFAAcABwAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUABwAHAAUABQAFAAUAAAAAAAcABwAAAAAABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAAAAAAAAAAABQAFAAAAAAAFAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAFAAUABQAFAAUAAAAFAAUABwAAAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABwAFAAUABQAFAAAAAAAHAAcAAAAAAAcABwAFAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAAAAAAAAAHAAcABwAAAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAUABQAFAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAHAAcABQAHAAcAAAAFAAcABwAAAAcABwAFAAUAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAFAAcABwAFAAUABQAAAAUAAAAHAAcABwAHAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAHAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAUAAAAFAAUAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABwAFAAUABQAFAAUABQAAAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABQAFAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAFAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAHAAUABQAFAAUABQAFAAUABwAHAAcABwAHAAcABwAHAAUABwAHAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABwAHAAcABwAFAAUABwAHAAcAAAAAAAAAAAAHAAcABQAHAAcABwAHAAcABwAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAUABQAFAAUABQAFAAUAAAAFAAAABQAAAAAABQAFAAUABQAFAAUABQAFAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAUABQAFAAUABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABwAFAAcABwAHAAcABwAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAUABQAFAAUABwAHAAUABQAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABQAFAAcABwAHAAUABwAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAcABQAFAAUABQAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAAAAAABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAUABQAHAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAFAAUABQAFAAcABwAFAAUABwAHAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAcABwAFAAUABwAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABQAAAAAABQAFAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAcABwAAAAAAAAAAAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAcABwAFAAcABwAAAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAFAAUABQAAAAUABQAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABwAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAHAAcABQAHAAUABQAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAAABwAHAAAAAAAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAFAAUABwAFAAcABwAFAAcABQAFAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAAAAAABwAHAAcABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAFAAcABwAFAAUABQAFAAUABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAUABQAFAAcABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABQAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAAAAAAFAAUABwAHAAcABwAFAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAHAAUABQAFAAUABQAFAAUABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAABQAAAAUABQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAHAAcAAAAFAAUAAAAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABQAFAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAABQAFAAUABQAFAAUABQAAAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAFAAUABQAFAAUADgAOAA4ADgAOAA4ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAMAAwADAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAAAAAAAAAAAAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAAAAAAAAAAAAsADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwACwAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAADgAOAA4AAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAAAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4AAAAOAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAAAAAAAAAAAA4AAAAOAAAAAAAAAAAADgAOAA4AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAA=';\n\n/*\n * utrie 1.0.2 \n * Copyright (c) 2022 Niklas von Hertzen \n * Released under MIT License\n */\nvar chars$1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup$1 = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i$1 = 0; i$1 < chars$1.length; i$1++) {\n lookup$1[chars$1.charCodeAt(i$1)] = i$1;\n}\nvar decode = function (base64) {\n var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4;\n if (base64[base64.length - 1] === '=') {\n bufferLength--;\n if (base64[base64.length - 2] === '=') {\n bufferLength--;\n }\n }\n var buffer = typeof ArrayBuffer !== 'undefined' &&\n typeof Uint8Array !== 'undefined' &&\n typeof Uint8Array.prototype.slice !== 'undefined'\n ? new ArrayBuffer(bufferLength)\n : new Array(bufferLength);\n var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer);\n for (i = 0; i < len; i += 4) {\n encoded1 = lookup$1[base64.charCodeAt(i)];\n encoded2 = lookup$1[base64.charCodeAt(i + 1)];\n encoded3 = lookup$1[base64.charCodeAt(i + 2)];\n encoded4 = lookup$1[base64.charCodeAt(i + 3)];\n bytes[p++] = (encoded1 << 2) | (encoded2 >> 4);\n bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2);\n bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63);\n }\n return buffer;\n};\nvar polyUint16Array = function (buffer) {\n var length = buffer.length;\n var bytes = [];\n for (var i = 0; i < length; i += 2) {\n bytes.push((buffer[i + 1] << 8) | buffer[i]);\n }\n return bytes;\n};\nvar polyUint32Array = function (buffer) {\n var length = buffer.length;\n var bytes = [];\n for (var i = 0; i < length; i += 4) {\n bytes.push((buffer[i + 3] << 24) | (buffer[i + 2] << 16) | (buffer[i + 1] << 8) | buffer[i]);\n }\n return bytes;\n};\n\n/** Shift size for getting the index-2 table offset. */\nvar UTRIE2_SHIFT_2 = 5;\n/** Shift size for getting the index-1 table offset. */\nvar UTRIE2_SHIFT_1 = 6 + 5;\n/**\n * Shift size for shifting left the index array values.\n * Increases possible data size with 16-bit index values at the cost\n * of compactability.\n * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY.\n */\nvar UTRIE2_INDEX_SHIFT = 2;\n/**\n * Difference between the two shift sizes,\n * for getting an index-1 offset from an index-2 offset. 6=11-5\n */\nvar UTRIE2_SHIFT_1_2 = UTRIE2_SHIFT_1 - UTRIE2_SHIFT_2;\n/**\n * The part of the index-2 table for U+D800..U+DBFF stores values for\n * lead surrogate code _units_ not code _points_.\n * Values for lead surrogate code _points_ are indexed with this portion of the table.\n * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.)\n */\nvar UTRIE2_LSCP_INDEX_2_OFFSET = 0x10000 >> UTRIE2_SHIFT_2;\n/** Number of entries in a data block. 32=0x20 */\nvar UTRIE2_DATA_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_2;\n/** Mask for getting the lower bits for the in-data-block offset. */\nvar UTRIE2_DATA_MASK = UTRIE2_DATA_BLOCK_LENGTH - 1;\nvar UTRIE2_LSCP_INDEX_2_LENGTH = 0x400 >> UTRIE2_SHIFT_2;\n/** Count the lengths of both BMP pieces. 2080=0x820 */\nvar UTRIE2_INDEX_2_BMP_LENGTH = UTRIE2_LSCP_INDEX_2_OFFSET + UTRIE2_LSCP_INDEX_2_LENGTH;\n/**\n * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820.\n * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2.\n */\nvar UTRIE2_UTF8_2B_INDEX_2_OFFSET = UTRIE2_INDEX_2_BMP_LENGTH;\nvar UTRIE2_UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */\n/**\n * The index-1 table, only used for supplementary code points, at offset 2112=0x840.\n * Variable length, for code points up to highStart, where the last single-value range starts.\n * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1.\n * (For 0x100000 supplementary code points U+10000..U+10ffff.)\n *\n * The part of the index-2 table for supplementary code points starts\n * after this index-1 table.\n *\n * Both the index-1 table and the following part of the index-2 table\n * are omitted completely if there is only BMP data.\n */\nvar UTRIE2_INDEX_1_OFFSET = UTRIE2_UTF8_2B_INDEX_2_OFFSET + UTRIE2_UTF8_2B_INDEX_2_LENGTH;\n/**\n * Number of index-1 entries for the BMP. 32=0x20\n * This part of the index-1 table is omitted from the serialized form.\n */\nvar UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> UTRIE2_SHIFT_1;\n/** Number of entries in an index-2 block. 64=0x40 */\nvar UTRIE2_INDEX_2_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_1_2;\n/** Mask for getting the lower bits for the in-index-2-block offset. */\nvar UTRIE2_INDEX_2_MASK = UTRIE2_INDEX_2_BLOCK_LENGTH - 1;\nvar slice16 = function (view, start, end) {\n if (view.slice) {\n return view.slice(start, end);\n }\n return new Uint16Array(Array.prototype.slice.call(view, start, end));\n};\nvar slice32 = function (view, start, end) {\n if (view.slice) {\n return view.slice(start, end);\n }\n return new Uint32Array(Array.prototype.slice.call(view, start, end));\n};\nvar createTrieFromBase64 = function (base64, _byteLength) {\n var buffer = decode(base64);\n var view32 = Array.isArray(buffer) ? polyUint32Array(buffer) : new Uint32Array(buffer);\n var view16 = Array.isArray(buffer) ? polyUint16Array(buffer) : new Uint16Array(buffer);\n var headerLength = 24;\n var index = slice16(view16, headerLength / 2, view32[4] / 2);\n var data = view32[5] === 2\n ? slice16(view16, (headerLength + view32[4]) / 2)\n : slice32(view32, Math.ceil((headerLength + view32[4]) / 4));\n return new Trie(view32[0], view32[1], view32[2], view32[3], index, data);\n};\nvar Trie = /** @class */ (function () {\n function Trie(initialValue, errorValue, highStart, highValueIndex, index, data) {\n this.initialValue = initialValue;\n this.errorValue = errorValue;\n this.highStart = highStart;\n this.highValueIndex = highValueIndex;\n this.index = index;\n this.data = data;\n }\n /**\n * Get the value for a code point as stored in the Trie.\n *\n * @param codePoint the code point\n * @return the value\n */\n Trie.prototype.get = function (codePoint) {\n var ix;\n if (codePoint >= 0) {\n if (codePoint < 0x0d800 || (codePoint > 0x0dbff && codePoint <= 0x0ffff)) {\n // Ordinary BMP code point, excluding leading surrogates.\n // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index.\n // 16 bit data is stored in the index array itself.\n ix = this.index[codePoint >> UTRIE2_SHIFT_2];\n ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n return this.data[ix];\n }\n if (codePoint <= 0xffff) {\n // Lead Surrogate Code Point. A Separate index section is stored for\n // lead surrogate code units and code points.\n // The main index has the code unit data.\n // For this function, we need the code point data.\n // Note: this expression could be refactored for slightly improved efficiency, but\n // surrogate code points will be so rare in practice that it's not worth it.\n ix = this.index[UTRIE2_LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2)];\n ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n return this.data[ix];\n }\n if (codePoint < this.highStart) {\n // Supplemental code point, use two-level lookup.\n ix = UTRIE2_INDEX_1_OFFSET - UTRIE2_OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> UTRIE2_SHIFT_1);\n ix = this.index[ix];\n ix += (codePoint >> UTRIE2_SHIFT_2) & UTRIE2_INDEX_2_MASK;\n ix = this.index[ix];\n ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK);\n return this.data[ix];\n }\n if (codePoint <= 0x10ffff) {\n return this.data[this.highValueIndex];\n }\n }\n // Fall through. The code point is outside of the legal range of 0..0x10ffff.\n return this.errorValue;\n };\n return Trie;\n}());\n\n/*\n * base64-arraybuffer 1.0.2 \n * Copyright (c) 2022 Niklas von Hertzen \n * Released under MIT License\n */\nvar chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n// Use a lookup table to find the index.\nvar lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256);\nfor (var i = 0; i < chars.length; i++) {\n lookup[chars.charCodeAt(i)] = i;\n}\n\nvar Prepend = 1;\nvar CR = 2;\nvar LF = 3;\nvar Control = 4;\nvar Extend = 5;\nvar SpacingMark = 7;\nvar L = 8;\nvar V = 9;\nvar T = 10;\nvar LV = 11;\nvar LVT = 12;\nvar ZWJ = 13;\nvar Extended_Pictographic = 14;\nvar RI = 15;\nvar toCodePoints = function (str) {\n var codePoints = [];\n var i = 0;\n var length = str.length;\n while (i < length) {\n var value = str.charCodeAt(i++);\n if (value >= 0xd800 && value <= 0xdbff && i < length) {\n var extra = str.charCodeAt(i++);\n if ((extra & 0xfc00) === 0xdc00) {\n codePoints.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000);\n }\n else {\n codePoints.push(value);\n i--;\n }\n }\n else {\n codePoints.push(value);\n }\n }\n return codePoints;\n};\nvar fromCodePoint = function () {\n var codePoints = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n codePoints[_i] = arguments[_i];\n }\n if (String.fromCodePoint) {\n return String.fromCodePoint.apply(String, codePoints);\n }\n var length = codePoints.length;\n if (!length) {\n return '';\n }\n var codeUnits = [];\n var index = -1;\n var result = '';\n while (++index < length) {\n var codePoint = codePoints[index];\n if (codePoint <= 0xffff) {\n codeUnits.push(codePoint);\n }\n else {\n codePoint -= 0x10000;\n codeUnits.push((codePoint >> 10) + 0xd800, (codePoint % 0x400) + 0xdc00);\n }\n if (index + 1 === length || codeUnits.length > 0x4000) {\n result += String.fromCharCode.apply(String, codeUnits);\n codeUnits.length = 0;\n }\n }\n return result;\n};\nvar UnicodeTrie = createTrieFromBase64(base64);\nvar BREAK_NOT_ALLOWED = '×';\nvar BREAK_ALLOWED = '÷';\nvar codePointToClass = function (codePoint) { return UnicodeTrie.get(codePoint); };\nvar _graphemeBreakAtIndex = function (_codePoints, classTypes, index) {\n var prevIndex = index - 2;\n var prev = classTypes[prevIndex];\n var current = classTypes[index - 1];\n var next = classTypes[index];\n // GB3 Do not break between a CR and LF\n if (current === CR && next === LF) {\n return BREAK_NOT_ALLOWED;\n }\n // GB4 Otherwise, break before and after controls.\n if (current === CR || current === LF || current === Control) {\n return BREAK_ALLOWED;\n }\n // GB5\n if (next === CR || next === LF || next === Control) {\n return BREAK_ALLOWED;\n }\n // Do not break Hangul syllable sequences.\n // GB6\n if (current === L && [L, V, LV, LVT].indexOf(next) !== -1) {\n return BREAK_NOT_ALLOWED;\n }\n // GB7\n if ((current === LV || current === V) && (next === V || next === T)) {\n return BREAK_NOT_ALLOWED;\n }\n // GB8\n if ((current === LVT || current === T) && next === T) {\n return BREAK_NOT_ALLOWED;\n }\n // GB9 Do not break before extending characters or ZWJ.\n if (next === ZWJ || next === Extend) {\n return BREAK_NOT_ALLOWED;\n }\n // Do not break before SpacingMarks, or after Prepend characters.\n // GB9a\n if (next === SpacingMark) {\n return BREAK_NOT_ALLOWED;\n }\n // GB9a\n if (current === Prepend) {\n return BREAK_NOT_ALLOWED;\n }\n // GB11 Do not break within emoji modifier sequences or emoji zwj sequences.\n if (current === ZWJ && next === Extended_Pictographic) {\n while (prev === Extend) {\n prev = classTypes[--prevIndex];\n }\n if (prev === Extended_Pictographic) {\n return BREAK_NOT_ALLOWED;\n }\n }\n // GB12 Do not break within emoji flag sequences.\n // That is, do not break between regional indicator (RI) symbols\n // if there is an odd number of RI characters before the break point.\n if (current === RI && next === RI) {\n var countRI = 0;\n while (prev === RI) {\n countRI++;\n prev = classTypes[--prevIndex];\n }\n if (countRI % 2 === 0) {\n return BREAK_NOT_ALLOWED;\n }\n }\n return BREAK_ALLOWED;\n};\nvar GraphemeBreaker = function (str) {\n var codePoints = toCodePoints(str);\n var length = codePoints.length;\n var index = 0;\n var lastEnd = 0;\n var classTypes = codePoints.map(codePointToClass);\n return {\n next: function () {\n if (index >= length) {\n return { done: true, value: null };\n }\n var graphemeBreak = BREAK_NOT_ALLOWED;\n while (index < length &&\n (graphemeBreak = _graphemeBreakAtIndex(codePoints, classTypes, ++index)) === BREAK_NOT_ALLOWED) { }\n if (graphemeBreak !== BREAK_NOT_ALLOWED || index === length) {\n var value = fromCodePoint.apply(null, codePoints.slice(lastEnd, index));\n lastEnd = index;\n return { value: value, done: false };\n }\n return { done: true, value: null };\n },\n };\n};\nvar splitGraphemes = function (str) {\n var breaker = GraphemeBreaker(str);\n var graphemes = [];\n var bk;\n while (!(bk = breaker.next()).done) {\n if (bk.value) {\n graphemes.push(bk.value.slice());\n }\n }\n return graphemes;\n};\n\nvar testRangeBounds = function (document) {\n var TEST_HEIGHT = 123;\n if (document.createRange) {\n var range = document.createRange();\n if (range.getBoundingClientRect) {\n var testElement = document.createElement('boundtest');\n testElement.style.height = TEST_HEIGHT + \"px\";\n testElement.style.display = 'block';\n document.body.appendChild(testElement);\n range.selectNode(testElement);\n var rangeBounds = range.getBoundingClientRect();\n var rangeHeight = Math.round(rangeBounds.height);\n document.body.removeChild(testElement);\n if (rangeHeight === TEST_HEIGHT) {\n return true;\n }\n }\n }\n return false;\n};\nvar testIOSLineBreak = function (document) {\n var testElement = document.createElement('boundtest');\n testElement.style.width = '50px';\n testElement.style.display = 'block';\n testElement.style.fontSize = '12px';\n testElement.style.letterSpacing = '0px';\n testElement.style.wordSpacing = '0px';\n document.body.appendChild(testElement);\n var range = document.createRange();\n testElement.innerHTML = typeof ''.repeat === 'function' ? '👨'.repeat(10) : '';\n var node = testElement.firstChild;\n var textList = toCodePoints$1(node.data).map(function (i) { return fromCodePoint$1(i); });\n var offset = 0;\n var prev = {};\n // ios 13 does not handle range getBoundingClientRect line changes correctly #2177\n var supports = textList.every(function (text, i) {\n range.setStart(node, offset);\n range.setEnd(node, offset + text.length);\n var rect = range.getBoundingClientRect();\n offset += text.length;\n var boundAhead = rect.x > prev.x || rect.y > prev.y;\n prev = rect;\n if (i === 0) {\n return true;\n }\n return boundAhead;\n });\n document.body.removeChild(testElement);\n return supports;\n};\nvar testCORS = function () { return typeof new Image().crossOrigin !== 'undefined'; };\nvar testResponseType = function () { return typeof new XMLHttpRequest().responseType === 'string'; };\nvar testSVG = function (document) {\n var img = new Image();\n var canvas = document.createElement('canvas');\n var ctx = canvas.getContext('2d');\n if (!ctx) {\n return false;\n }\n img.src = \"data:image/svg+xml,\";\n try {\n ctx.drawImage(img, 0, 0);\n canvas.toDataURL();\n }\n catch (e) {\n return false;\n }\n return true;\n};\nvar isGreenPixel = function (data) {\n return data[0] === 0 && data[1] === 255 && data[2] === 0 && data[3] === 255;\n};\nvar testForeignObject = function (document) {\n var canvas = document.createElement('canvas');\n var size = 100;\n canvas.width = size;\n canvas.height = size;\n var ctx = canvas.getContext('2d');\n if (!ctx) {\n return Promise.reject(false);\n }\n ctx.fillStyle = 'rgb(0, 255, 0)';\n ctx.fillRect(0, 0, size, size);\n var img = new Image();\n var greenImageSrc = canvas.toDataURL();\n img.src = greenImageSrc;\n var svg = createForeignObjectSVG(size, size, 0, 0, img);\n ctx.fillStyle = 'red';\n ctx.fillRect(0, 0, size, size);\n return loadSerializedSVG$1(svg)\n .then(function (img) {\n ctx.drawImage(img, 0, 0);\n var data = ctx.getImageData(0, 0, size, size).data;\n ctx.fillStyle = 'red';\n ctx.fillRect(0, 0, size, size);\n var node = document.createElement('div');\n node.style.backgroundImage = \"url(\" + greenImageSrc + \")\";\n node.style.height = size + \"px\";\n // Firefox 55 does not render inline tags\n return isGreenPixel(data)\n ? loadSerializedSVG$1(createForeignObjectSVG(size, size, 0, 0, node))\n : Promise.reject(false);\n })\n .then(function (img) {\n ctx.drawImage(img, 0, 0);\n // Edge does not render background-images\n return isGreenPixel(ctx.getImageData(0, 0, size, size).data);\n })\n .catch(function () { return false; });\n};\nvar createForeignObjectSVG = function (width, height, x, y, node) {\n var xmlns = 'http://www.w3.org/2000/svg';\n var svg = document.createElementNS(xmlns, 'svg');\n var foreignObject = document.createElementNS(xmlns, 'foreignObject');\n svg.setAttributeNS(null, 'width', width.toString());\n svg.setAttributeNS(null, 'height', height.toString());\n foreignObject.setAttributeNS(null, 'width', '100%');\n foreignObject.setAttributeNS(null, 'height', '100%');\n foreignObject.setAttributeNS(null, 'x', x.toString());\n foreignObject.setAttributeNS(null, 'y', y.toString());\n foreignObject.setAttributeNS(null, 'externalResourcesRequired', 'true');\n svg.appendChild(foreignObject);\n foreignObject.appendChild(node);\n return svg;\n};\nvar loadSerializedSVG$1 = function (svg) {\n return new Promise(function (resolve, reject) {\n var img = new Image();\n img.onload = function () { return resolve(img); };\n img.onerror = reject;\n img.src = \"data:image/svg+xml;charset=utf-8,\" + encodeURIComponent(new XMLSerializer().serializeToString(svg));\n });\n};\nvar FEATURES = {\n get SUPPORT_RANGE_BOUNDS() {\n var value = testRangeBounds(document);\n Object.defineProperty(FEATURES, 'SUPPORT_RANGE_BOUNDS', { value: value });\n return value;\n },\n get SUPPORT_WORD_BREAKING() {\n var value = FEATURES.SUPPORT_RANGE_BOUNDS && testIOSLineBreak(document);\n Object.defineProperty(FEATURES, 'SUPPORT_WORD_BREAKING', { value: value });\n return value;\n },\n get SUPPORT_SVG_DRAWING() {\n var value = testSVG(document);\n Object.defineProperty(FEATURES, 'SUPPORT_SVG_DRAWING', { value: value });\n return value;\n },\n get SUPPORT_FOREIGNOBJECT_DRAWING() {\n var value = typeof Array.from === 'function' && typeof window.fetch === 'function'\n ? testForeignObject(document)\n : Promise.resolve(false);\n Object.defineProperty(FEATURES, 'SUPPORT_FOREIGNOBJECT_DRAWING', { value: value });\n return value;\n },\n get SUPPORT_CORS_IMAGES() {\n var value = testCORS();\n Object.defineProperty(FEATURES, 'SUPPORT_CORS_IMAGES', { value: value });\n return value;\n },\n get SUPPORT_RESPONSE_TYPE() {\n var value = testResponseType();\n Object.defineProperty(FEATURES, 'SUPPORT_RESPONSE_TYPE', { value: value });\n return value;\n },\n get SUPPORT_CORS_XHR() {\n var value = 'withCredentials' in new XMLHttpRequest();\n Object.defineProperty(FEATURES, 'SUPPORT_CORS_XHR', { value: value });\n return value;\n },\n get SUPPORT_NATIVE_TEXT_SEGMENTATION() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n var value = !!(typeof Intl !== 'undefined' && Intl.Segmenter);\n Object.defineProperty(FEATURES, 'SUPPORT_NATIVE_TEXT_SEGMENTATION', { value: value });\n return value;\n }\n};\n\nvar TextBounds = /** @class */ (function () {\n function TextBounds(text, bounds) {\n this.text = text;\n this.bounds = bounds;\n }\n return TextBounds;\n}());\nvar parseTextBounds = function (context, value, styles, node) {\n var textList = breakText(value, styles);\n var textBounds = [];\n var offset = 0;\n textList.forEach(function (text) {\n if (styles.textDecorationLine.length || text.trim().length > 0) {\n if (FEATURES.SUPPORT_RANGE_BOUNDS) {\n var clientRects = createRange(node, offset, text.length).getClientRects();\n if (clientRects.length > 1) {\n var subSegments = segmentGraphemes(text);\n var subOffset_1 = 0;\n subSegments.forEach(function (subSegment) {\n textBounds.push(new TextBounds(subSegment, Bounds.fromDOMRectList(context, createRange(node, subOffset_1 + offset, subSegment.length).getClientRects())));\n subOffset_1 += subSegment.length;\n });\n }\n else {\n textBounds.push(new TextBounds(text, Bounds.fromDOMRectList(context, clientRects)));\n }\n }\n else {\n var replacementNode = node.splitText(text.length);\n textBounds.push(new TextBounds(text, getWrapperBounds(context, node)));\n node = replacementNode;\n }\n }\n else if (!FEATURES.SUPPORT_RANGE_BOUNDS) {\n node = node.splitText(text.length);\n }\n offset += text.length;\n });\n return textBounds;\n};\nvar getWrapperBounds = function (context, node) {\n var ownerDocument = node.ownerDocument;\n if (ownerDocument) {\n var wrapper = ownerDocument.createElement('html2canvaswrapper');\n wrapper.appendChild(node.cloneNode(true));\n var parentNode = node.parentNode;\n if (parentNode) {\n parentNode.replaceChild(wrapper, node);\n var bounds = parseBounds(context, wrapper);\n if (wrapper.firstChild) {\n parentNode.replaceChild(wrapper.firstChild, wrapper);\n }\n return bounds;\n }\n }\n return Bounds.EMPTY;\n};\nvar createRange = function (node, offset, length) {\n var ownerDocument = node.ownerDocument;\n if (!ownerDocument) {\n throw new Error('Node has no owner document');\n }\n var range = ownerDocument.createRange();\n range.setStart(node, offset);\n range.setEnd(node, offset + length);\n return range;\n};\nvar segmentGraphemes = function (value) {\n if (FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n var segmenter = new Intl.Segmenter(void 0, { granularity: 'grapheme' });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return Array.from(segmenter.segment(value)).map(function (segment) { return segment.segment; });\n }\n return splitGraphemes(value);\n};\nvar segmentWords = function (value, styles) {\n if (FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n var segmenter = new Intl.Segmenter(void 0, {\n granularity: 'word'\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return Array.from(segmenter.segment(value)).map(function (segment) { return segment.segment; });\n }\n return breakWords(value, styles);\n};\nvar breakText = function (value, styles) {\n return styles.letterSpacing !== 0 ? segmentGraphemes(value) : segmentWords(value, styles);\n};\n// https://drafts.csswg.org/css-text/#word-separator\nvar wordSeparators = [0x0020, 0x00a0, 0x1361, 0x10100, 0x10101, 0x1039, 0x1091];\nvar breakWords = function (str, styles) {\n var breaker = LineBreaker(str, {\n lineBreak: styles.lineBreak,\n wordBreak: styles.overflowWrap === \"break-word\" /* BREAK_WORD */ ? 'break-word' : styles.wordBreak\n });\n var words = [];\n var bk;\n var _loop_1 = function () {\n if (bk.value) {\n var value = bk.value.slice();\n var codePoints = toCodePoints$1(value);\n var word_1 = '';\n codePoints.forEach(function (codePoint) {\n if (wordSeparators.indexOf(codePoint) === -1) {\n word_1 += fromCodePoint$1(codePoint);\n }\n else {\n if (word_1.length) {\n words.push(word_1);\n }\n words.push(fromCodePoint$1(codePoint));\n word_1 = '';\n }\n });\n if (word_1.length) {\n words.push(word_1);\n }\n }\n };\n while (!(bk = breaker.next()).done) {\n _loop_1();\n }\n return words;\n};\n\nvar TextContainer = /** @class */ (function () {\n function TextContainer(context, node, styles) {\n this.text = transform(node.data, styles.textTransform);\n this.textBounds = parseTextBounds(context, this.text, styles, node);\n }\n return TextContainer;\n}());\nvar transform = function (text, transform) {\n switch (transform) {\n case 1 /* LOWERCASE */:\n return text.toLowerCase();\n case 3 /* CAPITALIZE */:\n return text.replace(CAPITALIZE, capitalize);\n case 2 /* UPPERCASE */:\n return text.toUpperCase();\n default:\n return text;\n }\n};\nvar CAPITALIZE = /(^|\\s|:|-|\\(|\\))([a-z])/g;\nvar capitalize = function (m, p1, p2) {\n if (m.length > 0) {\n return p1 + p2.toUpperCase();\n }\n return m;\n};\n\nvar ImageElementContainer = /** @class */ (function (_super) {\n __extends(ImageElementContainer, _super);\n function ImageElementContainer(context, img) {\n var _this = _super.call(this, context, img) || this;\n _this.src = img.currentSrc || img.src;\n _this.intrinsicWidth = img.naturalWidth;\n _this.intrinsicHeight = img.naturalHeight;\n _this.context.cache.addImage(_this.src);\n return _this;\n }\n return ImageElementContainer;\n}(ElementContainer));\n\nvar CanvasElementContainer = /** @class */ (function (_super) {\n __extends(CanvasElementContainer, _super);\n function CanvasElementContainer(context, canvas) {\n var _this = _super.call(this, context, canvas) || this;\n _this.canvas = canvas;\n _this.intrinsicWidth = canvas.width;\n _this.intrinsicHeight = canvas.height;\n return _this;\n }\n return CanvasElementContainer;\n}(ElementContainer));\n\nvar SVGElementContainer = /** @class */ (function (_super) {\n __extends(SVGElementContainer, _super);\n function SVGElementContainer(context, img) {\n var _this = _super.call(this, context, img) || this;\n var s = new XMLSerializer();\n var bounds = parseBounds(context, img);\n img.setAttribute('width', bounds.width + \"px\");\n img.setAttribute('height', bounds.height + \"px\");\n _this.svg = \"data:image/svg+xml,\" + encodeURIComponent(s.serializeToString(img));\n _this.intrinsicWidth = img.width.baseVal.value;\n _this.intrinsicHeight = img.height.baseVal.value;\n _this.context.cache.addImage(_this.svg);\n return _this;\n }\n return SVGElementContainer;\n}(ElementContainer));\n\nvar LIElementContainer = /** @class */ (function (_super) {\n __extends(LIElementContainer, _super);\n function LIElementContainer(context, element) {\n var _this = _super.call(this, context, element) || this;\n _this.value = element.value;\n return _this;\n }\n return LIElementContainer;\n}(ElementContainer));\n\nvar OLElementContainer = /** @class */ (function (_super) {\n __extends(OLElementContainer, _super);\n function OLElementContainer(context, element) {\n var _this = _super.call(this, context, element) || this;\n _this.start = element.start;\n _this.reversed = typeof element.reversed === 'boolean' && element.reversed === true;\n return _this;\n }\n return OLElementContainer;\n}(ElementContainer));\n\nvar CHECKBOX_BORDER_RADIUS = [\n {\n type: 15 /* DIMENSION_TOKEN */,\n flags: 0,\n unit: 'px',\n number: 3\n }\n];\nvar RADIO_BORDER_RADIUS = [\n {\n type: 16 /* PERCENTAGE_TOKEN */,\n flags: 0,\n number: 50\n }\n];\nvar reformatInputBounds = function (bounds) {\n if (bounds.width > bounds.height) {\n return new Bounds(bounds.left + (bounds.width - bounds.height) / 2, bounds.top, bounds.height, bounds.height);\n }\n else if (bounds.width < bounds.height) {\n return new Bounds(bounds.left, bounds.top + (bounds.height - bounds.width) / 2, bounds.width, bounds.width);\n }\n return bounds;\n};\nvar getInputValue = function (node) {\n var value = node.type === PASSWORD ? new Array(node.value.length + 1).join('\\u2022') : node.value;\n return value.length === 0 ? node.placeholder || '' : value;\n};\nvar CHECKBOX = 'checkbox';\nvar RADIO = 'radio';\nvar PASSWORD = 'password';\nvar INPUT_COLOR = 0x2a2a2aff;\nvar InputElementContainer = /** @class */ (function (_super) {\n __extends(InputElementContainer, _super);\n function InputElementContainer(context, input) {\n var _this = _super.call(this, context, input) || this;\n _this.type = input.type.toLowerCase();\n _this.checked = input.checked;\n _this.value = getInputValue(input);\n if (_this.type === CHECKBOX || _this.type === RADIO) {\n _this.styles.backgroundColor = 0xdededeff;\n _this.styles.borderTopColor =\n _this.styles.borderRightColor =\n _this.styles.borderBottomColor =\n _this.styles.borderLeftColor =\n 0xa5a5a5ff;\n _this.styles.borderTopWidth =\n _this.styles.borderRightWidth =\n _this.styles.borderBottomWidth =\n _this.styles.borderLeftWidth =\n 1;\n _this.styles.borderTopStyle =\n _this.styles.borderRightStyle =\n _this.styles.borderBottomStyle =\n _this.styles.borderLeftStyle =\n 1 /* SOLID */;\n _this.styles.backgroundClip = [0 /* BORDER_BOX */];\n _this.styles.backgroundOrigin = [0 /* BORDER_BOX */];\n _this.bounds = reformatInputBounds(_this.bounds);\n }\n switch (_this.type) {\n case CHECKBOX:\n _this.styles.borderTopRightRadius =\n _this.styles.borderTopLeftRadius =\n _this.styles.borderBottomRightRadius =\n _this.styles.borderBottomLeftRadius =\n CHECKBOX_BORDER_RADIUS;\n break;\n case RADIO:\n _this.styles.borderTopRightRadius =\n _this.styles.borderTopLeftRadius =\n _this.styles.borderBottomRightRadius =\n _this.styles.borderBottomLeftRadius =\n RADIO_BORDER_RADIUS;\n break;\n }\n return _this;\n }\n return InputElementContainer;\n}(ElementContainer));\n\nvar SelectElementContainer = /** @class */ (function (_super) {\n __extends(SelectElementContainer, _super);\n function SelectElementContainer(context, element) {\n var _this = _super.call(this, context, element) || this;\n var option = element.options[element.selectedIndex || 0];\n _this.value = option ? option.text || '' : '';\n return _this;\n }\n return SelectElementContainer;\n}(ElementContainer));\n\nvar TextareaElementContainer = /** @class */ (function (_super) {\n __extends(TextareaElementContainer, _super);\n function TextareaElementContainer(context, element) {\n var _this = _super.call(this, context, element) || this;\n _this.value = element.value;\n return _this;\n }\n return TextareaElementContainer;\n}(ElementContainer));\n\nvar IFrameElementContainer = /** @class */ (function (_super) {\n __extends(IFrameElementContainer, _super);\n function IFrameElementContainer(context, iframe) {\n var _this = _super.call(this, context, iframe) || this;\n _this.src = iframe.src;\n _this.width = parseInt(iframe.width, 10) || 0;\n _this.height = parseInt(iframe.height, 10) || 0;\n _this.backgroundColor = _this.styles.backgroundColor;\n try {\n if (iframe.contentWindow &&\n iframe.contentWindow.document &&\n iframe.contentWindow.document.documentElement) {\n _this.tree = parseTree(context, iframe.contentWindow.document.documentElement);\n // http://www.w3.org/TR/css3-background/#special-backgrounds\n var documentBackgroundColor = iframe.contentWindow.document.documentElement\n ? parseColor(context, getComputedStyle(iframe.contentWindow.document.documentElement).backgroundColor)\n : COLORS.TRANSPARENT;\n var bodyBackgroundColor = iframe.contentWindow.document.body\n ? parseColor(context, getComputedStyle(iframe.contentWindow.document.body).backgroundColor)\n : COLORS.TRANSPARENT;\n _this.backgroundColor = isTransparent(documentBackgroundColor)\n ? isTransparent(bodyBackgroundColor)\n ? _this.styles.backgroundColor\n : bodyBackgroundColor\n : documentBackgroundColor;\n }\n }\n catch (e) { }\n return _this;\n }\n return IFrameElementContainer;\n}(ElementContainer));\n\nvar LIST_OWNERS = ['OL', 'UL', 'MENU'];\nvar parseNodeTree = function (context, node, parent, root) {\n for (var childNode = node.firstChild, nextNode = void 0; childNode; childNode = nextNode) {\n nextNode = childNode.nextSibling;\n if (isTextNode(childNode) && childNode.data.trim().length > 0) {\n parent.textNodes.push(new TextContainer(context, childNode, parent.styles));\n }\n else if (isElementNode(childNode)) {\n if (isSlotElement(childNode) && childNode.assignedNodes) {\n childNode.assignedNodes().forEach(function (childNode) { return parseNodeTree(context, childNode, parent, root); });\n }\n else {\n var container = createContainer(context, childNode);\n if (container.styles.isVisible()) {\n if (createsRealStackingContext(childNode, container, root)) {\n container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */;\n }\n else if (createsStackingContext(container.styles)) {\n container.flags |= 2 /* CREATES_STACKING_CONTEXT */;\n }\n if (LIST_OWNERS.indexOf(childNode.tagName) !== -1) {\n container.flags |= 8 /* IS_LIST_OWNER */;\n }\n parent.elements.push(container);\n childNode.slot;\n if (childNode.shadowRoot) {\n parseNodeTree(context, childNode.shadowRoot, container, root);\n }\n else if (!isTextareaElement(childNode) &&\n !isSVGElement(childNode) &&\n !isSelectElement(childNode)) {\n parseNodeTree(context, childNode, container, root);\n }\n }\n }\n }\n }\n};\nvar createContainer = function (context, element) {\n if (isImageElement(element)) {\n return new ImageElementContainer(context, element);\n }\n if (isCanvasElement(element)) {\n return new CanvasElementContainer(context, element);\n }\n if (isSVGElement(element)) {\n return new SVGElementContainer(context, element);\n }\n if (isLIElement(element)) {\n return new LIElementContainer(context, element);\n }\n if (isOLElement(element)) {\n return new OLElementContainer(context, element);\n }\n if (isInputElement(element)) {\n return new InputElementContainer(context, element);\n }\n if (isSelectElement(element)) {\n return new SelectElementContainer(context, element);\n }\n if (isTextareaElement(element)) {\n return new TextareaElementContainer(context, element);\n }\n if (isIFrameElement(element)) {\n return new IFrameElementContainer(context, element);\n }\n return new ElementContainer(context, element);\n};\nvar parseTree = function (context, element) {\n var container = createContainer(context, element);\n container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */;\n parseNodeTree(context, element, container, container);\n return container;\n};\nvar createsRealStackingContext = function (node, container, root) {\n return (container.styles.isPositionedWithZIndex() ||\n container.styles.opacity < 1 ||\n container.styles.isTransformed() ||\n (isBodyElement(node) && root.styles.isTransparent()));\n};\nvar createsStackingContext = function (styles) { return styles.isPositioned() || styles.isFloating(); };\nvar isTextNode = function (node) { return node.nodeType === Node.TEXT_NODE; };\nvar isElementNode = function (node) { return node.nodeType === Node.ELEMENT_NODE; };\nvar isHTMLElementNode = function (node) {\n return isElementNode(node) && typeof node.style !== 'undefined' && !isSVGElementNode(node);\n};\nvar isSVGElementNode = function (element) {\n return typeof element.className === 'object';\n};\nvar isLIElement = function (node) { return node.tagName === 'LI'; };\nvar isOLElement = function (node) { return node.tagName === 'OL'; };\nvar isInputElement = function (node) { return node.tagName === 'INPUT'; };\nvar isHTMLElement = function (node) { return node.tagName === 'HTML'; };\nvar isSVGElement = function (node) { return node.tagName === 'svg'; };\nvar isBodyElement = function (node) { return node.tagName === 'BODY'; };\nvar isCanvasElement = function (node) { return node.tagName === 'CANVAS'; };\nvar isVideoElement = function (node) { return node.tagName === 'VIDEO'; };\nvar isImageElement = function (node) { return node.tagName === 'IMG'; };\nvar isIFrameElement = function (node) { return node.tagName === 'IFRAME'; };\nvar isStyleElement = function (node) { return node.tagName === 'STYLE'; };\nvar isScriptElement = function (node) { return node.tagName === 'SCRIPT'; };\nvar isTextareaElement = function (node) { return node.tagName === 'TEXTAREA'; };\nvar isSelectElement = function (node) { return node.tagName === 'SELECT'; };\nvar isSlotElement = function (node) { return node.tagName === 'SLOT'; };\n// https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name\nvar isCustomElement = function (node) { return node.tagName.indexOf('-') > 0; };\n\nvar CounterState = /** @class */ (function () {\n function CounterState() {\n this.counters = {};\n }\n CounterState.prototype.getCounterValue = function (name) {\n var counter = this.counters[name];\n if (counter && counter.length) {\n return counter[counter.length - 1];\n }\n return 1;\n };\n CounterState.prototype.getCounterValues = function (name) {\n var counter = this.counters[name];\n return counter ? counter : [];\n };\n CounterState.prototype.pop = function (counters) {\n var _this = this;\n counters.forEach(function (counter) { return _this.counters[counter].pop(); });\n };\n CounterState.prototype.parse = function (style) {\n var _this = this;\n var counterIncrement = style.counterIncrement;\n var counterReset = style.counterReset;\n var canReset = true;\n if (counterIncrement !== null) {\n counterIncrement.forEach(function (entry) {\n var counter = _this.counters[entry.counter];\n if (counter && entry.increment !== 0) {\n canReset = false;\n if (!counter.length) {\n counter.push(1);\n }\n counter[Math.max(0, counter.length - 1)] += entry.increment;\n }\n });\n }\n var counterNames = [];\n if (canReset) {\n counterReset.forEach(function (entry) {\n var counter = _this.counters[entry.counter];\n counterNames.push(entry.counter);\n if (!counter) {\n counter = _this.counters[entry.counter] = [];\n }\n counter.push(entry.reset);\n });\n }\n return counterNames;\n };\n return CounterState;\n}());\nvar ROMAN_UPPER = {\n integers: [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1],\n values: ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I']\n};\nvar ARMENIAN = {\n integers: [\n 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90, 80, 70,\n 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1\n ],\n values: [\n 'Ք',\n 'Փ',\n 'Ւ',\n 'Ց',\n 'Ր',\n 'Տ',\n 'Վ',\n 'Ս',\n 'Ռ',\n 'Ջ',\n 'Պ',\n 'Չ',\n 'Ո',\n 'Շ',\n 'Ն',\n 'Յ',\n 'Մ',\n 'Ճ',\n 'Ղ',\n 'Ձ',\n 'Հ',\n 'Կ',\n 'Ծ',\n 'Խ',\n 'Լ',\n 'Ի',\n 'Ժ',\n 'Թ',\n 'Ը',\n 'Է',\n 'Զ',\n 'Ե',\n 'Դ',\n 'Գ',\n 'Բ',\n 'Ա'\n ]\n};\nvar HEBREW = {\n integers: [\n 10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20,\n 19, 18, 17, 16, 15, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1\n ],\n values: [\n 'י׳',\n 'ט׳',\n 'ח׳',\n 'ז׳',\n 'ו׳',\n 'ה׳',\n 'ד׳',\n 'ג׳',\n 'ב׳',\n 'א׳',\n 'ת',\n 'ש',\n 'ר',\n 'ק',\n 'צ',\n 'פ',\n 'ע',\n 'ס',\n 'נ',\n 'מ',\n 'ל',\n 'כ',\n 'יט',\n 'יח',\n 'יז',\n 'טז',\n 'טו',\n 'י',\n 'ט',\n 'ח',\n 'ז',\n 'ו',\n 'ה',\n 'ד',\n 'ג',\n 'ב',\n 'א'\n ]\n};\nvar GEORGIAN = {\n integers: [\n 10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90,\n 80, 70, 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1\n ],\n values: [\n 'ჵ',\n 'ჰ',\n 'ჯ',\n 'ჴ',\n 'ხ',\n 'ჭ',\n 'წ',\n 'ძ',\n 'ც',\n 'ჩ',\n 'შ',\n 'ყ',\n 'ღ',\n 'ქ',\n 'ფ',\n 'ჳ',\n 'ტ',\n 'ს',\n 'რ',\n 'ჟ',\n 'პ',\n 'ო',\n 'ჲ',\n 'ნ',\n 'მ',\n 'ლ',\n 'კ',\n 'ი',\n 'თ',\n 'ჱ',\n 'ზ',\n 'ვ',\n 'ე',\n 'დ',\n 'გ',\n 'ბ',\n 'ა'\n ]\n};\nvar createAdditiveCounter = function (value, min, max, symbols, fallback, suffix) {\n if (value < min || value > max) {\n return createCounterText(value, fallback, suffix.length > 0);\n }\n return (symbols.integers.reduce(function (string, integer, index) {\n while (value >= integer) {\n value -= integer;\n string += symbols.values[index];\n }\n return string;\n }, '') + suffix);\n};\nvar createCounterStyleWithSymbolResolver = function (value, codePointRangeLength, isNumeric, resolver) {\n var string = '';\n do {\n if (!isNumeric) {\n value--;\n }\n string = resolver(value) + string;\n value /= codePointRangeLength;\n } while (value * codePointRangeLength >= codePointRangeLength);\n return string;\n};\nvar createCounterStyleFromRange = function (value, codePointRangeStart, codePointRangeEnd, isNumeric, suffix) {\n var codePointRangeLength = codePointRangeEnd - codePointRangeStart + 1;\n return ((value < 0 ? '-' : '') +\n (createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, isNumeric, function (codePoint) {\n return fromCodePoint$1(Math.floor(codePoint % codePointRangeLength) + codePointRangeStart);\n }) +\n suffix));\n};\nvar createCounterStyleFromSymbols = function (value, symbols, suffix) {\n if (suffix === void 0) { suffix = '. '; }\n var codePointRangeLength = symbols.length;\n return (createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, false, function (codePoint) { return symbols[Math.floor(codePoint % codePointRangeLength)]; }) + suffix);\n};\nvar CJK_ZEROS = 1 << 0;\nvar CJK_TEN_COEFFICIENTS = 1 << 1;\nvar CJK_TEN_HIGH_COEFFICIENTS = 1 << 2;\nvar CJK_HUNDRED_COEFFICIENTS = 1 << 3;\nvar createCJKCounter = function (value, numbers, multipliers, negativeSign, suffix, flags) {\n if (value < -9999 || value > 9999) {\n return createCounterText(value, 4 /* CJK_DECIMAL */, suffix.length > 0);\n }\n var tmp = Math.abs(value);\n var string = suffix;\n if (tmp === 0) {\n return numbers[0] + string;\n }\n for (var digit = 0; tmp > 0 && digit <= 4; digit++) {\n var coefficient = tmp % 10;\n if (coefficient === 0 && contains(flags, CJK_ZEROS) && string !== '') {\n string = numbers[coefficient] + string;\n }\n else if (coefficient > 1 ||\n (coefficient === 1 && digit === 0) ||\n (coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_COEFFICIENTS)) ||\n (coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_HIGH_COEFFICIENTS) && value > 100) ||\n (coefficient === 1 && digit > 1 && contains(flags, CJK_HUNDRED_COEFFICIENTS))) {\n string = numbers[coefficient] + (digit > 0 ? multipliers[digit - 1] : '') + string;\n }\n else if (coefficient === 1 && digit > 0) {\n string = multipliers[digit - 1] + string;\n }\n tmp = Math.floor(tmp / 10);\n }\n return (value < 0 ? negativeSign : '') + string;\n};\nvar CHINESE_INFORMAL_MULTIPLIERS = '十百千萬';\nvar CHINESE_FORMAL_MULTIPLIERS = '拾佰仟萬';\nvar JAPANESE_NEGATIVE = 'マイナス';\nvar KOREAN_NEGATIVE = '마이너스';\nvar createCounterText = function (value, type, appendSuffix) {\n var defaultSuffix = appendSuffix ? '. ' : '';\n var cjkSuffix = appendSuffix ? '、' : '';\n var koreanSuffix = appendSuffix ? ', ' : '';\n var spaceSuffix = appendSuffix ? ' ' : '';\n switch (type) {\n case 0 /* DISC */:\n return '•' + spaceSuffix;\n case 1 /* CIRCLE */:\n return '◦' + spaceSuffix;\n case 2 /* SQUARE */:\n return '◾' + spaceSuffix;\n case 5 /* DECIMAL_LEADING_ZERO */:\n var string = createCounterStyleFromRange(value, 48, 57, true, defaultSuffix);\n return string.length < 4 ? \"0\" + string : string;\n case 4 /* CJK_DECIMAL */:\n return createCounterStyleFromSymbols(value, '〇一二三四五六七八九', cjkSuffix);\n case 6 /* LOWER_ROMAN */:\n return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, 3 /* DECIMAL */, defaultSuffix).toLowerCase();\n case 7 /* UPPER_ROMAN */:\n return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, 3 /* DECIMAL */, defaultSuffix);\n case 8 /* LOWER_GREEK */:\n return createCounterStyleFromRange(value, 945, 969, false, defaultSuffix);\n case 9 /* LOWER_ALPHA */:\n return createCounterStyleFromRange(value, 97, 122, false, defaultSuffix);\n case 10 /* UPPER_ALPHA */:\n return createCounterStyleFromRange(value, 65, 90, false, defaultSuffix);\n case 11 /* ARABIC_INDIC */:\n return createCounterStyleFromRange(value, 1632, 1641, true, defaultSuffix);\n case 12 /* ARMENIAN */:\n case 49 /* UPPER_ARMENIAN */:\n return createAdditiveCounter(value, 1, 9999, ARMENIAN, 3 /* DECIMAL */, defaultSuffix);\n case 35 /* LOWER_ARMENIAN */:\n return createAdditiveCounter(value, 1, 9999, ARMENIAN, 3 /* DECIMAL */, defaultSuffix).toLowerCase();\n case 13 /* BENGALI */:\n return createCounterStyleFromRange(value, 2534, 2543, true, defaultSuffix);\n case 14 /* CAMBODIAN */:\n case 30 /* KHMER */:\n return createCounterStyleFromRange(value, 6112, 6121, true, defaultSuffix);\n case 15 /* CJK_EARTHLY_BRANCH */:\n return createCounterStyleFromSymbols(value, '子丑寅卯辰巳午未申酉戌亥', cjkSuffix);\n case 16 /* CJK_HEAVENLY_STEM */:\n return createCounterStyleFromSymbols(value, '甲乙丙丁戊己庚辛壬癸', cjkSuffix);\n case 17 /* CJK_IDEOGRAPHIC */:\n case 48 /* TRAD_CHINESE_INFORMAL */:\n return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);\n case 47 /* TRAD_CHINESE_FORMAL */:\n return createCJKCounter(value, '零壹貳參肆伍陸柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);\n case 42 /* SIMP_CHINESE_INFORMAL */:\n return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);\n case 41 /* SIMP_CHINESE_FORMAL */:\n return createCJKCounter(value, '零壹贰叁肆伍陆柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS);\n case 26 /* JAPANESE_INFORMAL */:\n return createCJKCounter(value, '〇一二三四五六七八九', '十百千万', JAPANESE_NEGATIVE, cjkSuffix, 0);\n case 25 /* JAPANESE_FORMAL */:\n return createCJKCounter(value, '零壱弐参四伍六七八九', '拾百千万', JAPANESE_NEGATIVE, cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS);\n case 31 /* KOREAN_HANGUL_FORMAL */:\n return createCJKCounter(value, '영일이삼사오육칠팔구', '십백천만', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS);\n case 33 /* KOREAN_HANJA_INFORMAL */:\n return createCJKCounter(value, '零一二三四五六七八九', '十百千萬', KOREAN_NEGATIVE, koreanSuffix, 0);\n case 32 /* KOREAN_HANJA_FORMAL */:\n return createCJKCounter(value, '零壹貳參四五六七八九', '拾百千', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS);\n case 18 /* DEVANAGARI */:\n return createCounterStyleFromRange(value, 0x966, 0x96f, true, defaultSuffix);\n case 20 /* GEORGIAN */:\n return createAdditiveCounter(value, 1, 19999, GEORGIAN, 3 /* DECIMAL */, defaultSuffix);\n case 21 /* GUJARATI */:\n return createCounterStyleFromRange(value, 0xae6, 0xaef, true, defaultSuffix);\n case 22 /* GURMUKHI */:\n return createCounterStyleFromRange(value, 0xa66, 0xa6f, true, defaultSuffix);\n case 22 /* HEBREW */:\n return createAdditiveCounter(value, 1, 10999, HEBREW, 3 /* DECIMAL */, defaultSuffix);\n case 23 /* HIRAGANA */:\n return createCounterStyleFromSymbols(value, 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん');\n case 24 /* HIRAGANA_IROHA */:\n return createCounterStyleFromSymbols(value, 'いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす');\n case 27 /* KANNADA */:\n return createCounterStyleFromRange(value, 0xce6, 0xcef, true, defaultSuffix);\n case 28 /* KATAKANA */:\n return createCounterStyleFromSymbols(value, 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン', cjkSuffix);\n case 29 /* KATAKANA_IROHA */:\n return createCounterStyleFromSymbols(value, 'イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス', cjkSuffix);\n case 34 /* LAO */:\n return createCounterStyleFromRange(value, 0xed0, 0xed9, true, defaultSuffix);\n case 37 /* MONGOLIAN */:\n return createCounterStyleFromRange(value, 0x1810, 0x1819, true, defaultSuffix);\n case 38 /* MYANMAR */:\n return createCounterStyleFromRange(value, 0x1040, 0x1049, true, defaultSuffix);\n case 39 /* ORIYA */:\n return createCounterStyleFromRange(value, 0xb66, 0xb6f, true, defaultSuffix);\n case 40 /* PERSIAN */:\n return createCounterStyleFromRange(value, 0x6f0, 0x6f9, true, defaultSuffix);\n case 43 /* TAMIL */:\n return createCounterStyleFromRange(value, 0xbe6, 0xbef, true, defaultSuffix);\n case 44 /* TELUGU */:\n return createCounterStyleFromRange(value, 0xc66, 0xc6f, true, defaultSuffix);\n case 45 /* THAI */:\n return createCounterStyleFromRange(value, 0xe50, 0xe59, true, defaultSuffix);\n case 46 /* TIBETAN */:\n return createCounterStyleFromRange(value, 0xf20, 0xf29, true, defaultSuffix);\n case 3 /* DECIMAL */:\n default:\n return createCounterStyleFromRange(value, 48, 57, true, defaultSuffix);\n }\n};\n\nvar IGNORE_ATTRIBUTE = 'data-html2canvas-ignore';\nvar DocumentCloner = /** @class */ (function () {\n function DocumentCloner(context, element, options) {\n this.context = context;\n this.options = options;\n this.scrolledElements = [];\n this.referenceElement = element;\n this.counters = new CounterState();\n this.quoteDepth = 0;\n if (!element.ownerDocument) {\n throw new Error('Cloned element does not have an owner document');\n }\n this.documentElement = this.cloneNode(element.ownerDocument.documentElement, false);\n }\n DocumentCloner.prototype.toIFrame = function (ownerDocument, windowSize) {\n var _this = this;\n var iframe = createIFrameContainer(ownerDocument, windowSize);\n if (!iframe.contentWindow) {\n return Promise.reject(\"Unable to find iframe window\");\n }\n var scrollX = ownerDocument.defaultView.pageXOffset;\n var scrollY = ownerDocument.defaultView.pageYOffset;\n var cloneWindow = iframe.contentWindow;\n var documentClone = cloneWindow.document;\n /* Chrome doesn't detect relative background-images assigned in inline \n","\n\n\n\n\n","\n\n\n\n\n","\n\n\n","\n\n\n","/**\n * Shared Auth Store Factory\n *\n * Creates a Pinia auth store that can be used by any ROA2WEB application.\n * Each app passes its own apiService instance configured with the correct baseURL.\n *\n * Usage:\n * import { createAuthStore } from '@shared/frontend/stores/auth';\n * import { apiService } from '../services/api';\n * export const useAuthStore = createAuthStore(apiService);\n *\n * Multi-Server Login Flow (US-010):\n * 1. Call checkEmail(email) to verify email exists and get available servers\n * 2. If multiple servers, user selects one; if single server, auto-select\n * 3. Call login({username, password, server_id}) to authenticate\n * 4. Server ID is saved to localStorage for next login pre-selection\n */\n\nimport { defineStore } from \"pinia\";\nimport { ref, computed } from \"vue\";\n\n// localStorage keys\nconst STORAGE_KEYS = {\n ACCESS_TOKEN: \"access_token\",\n REFRESH_TOKEN: \"refresh_token\",\n USER: \"user\",\n LAST_SERVER_ID: \"last_server_id\",\n AUTH_MODE: \"auth_mode\",\n};\n\n/**\n * Factory function to create an auth store with the provided API service\n * @param {Object} apiService - Axios instance configured for the app's API\n * @param {Object} options - Optional configuration\n * @param {Function} options.onLogout - Callback to reset other stores on logout (US-028)\n * @returns {Function} Pinia store definition\n */\nexport function createAuthStore(apiService, options = {}) {\n return defineStore(\"auth\", () => {\n // State - Core auth\n const accessToken = ref(localStorage.getItem(STORAGE_KEYS.ACCESS_TOKEN));\n const refreshToken = ref(localStorage.getItem(STORAGE_KEYS.REFRESH_TOKEN));\n const user = ref(JSON.parse(localStorage.getItem(STORAGE_KEYS.USER) || \"null\"));\n const isLoading = ref(false);\n const error = ref(null);\n\n // State - Auth mode detection (US-011 - Backward Compatibility)\n // \"single-server\": legacy username/password login\n // \"multi-server\": email-based login with server selection\n const authMode = ref(localStorage.getItem(STORAGE_KEYS.AUTH_MODE) || null);\n const isLoadingAuthMode = ref(false);\n\n // State - Multi-step login (US-010)\n // Login steps: 'email' -> 'server' (if multiple) -> 'password' -> 'complete'\n // In single-server mode: 'username' -> 'password' -> 'complete'\n const loginStep = ref(\"loading\"); // Start with loading until auth mode is determined\n const loginEmail = ref(\"\");\n const loginUsername = ref(\"\"); // For single-server mode (US-011)\n const availableServers = ref([]); // [{id: 'romfast', name: 'Romfast - Producție'}, ...]\n const selectedServerId = ref(localStorage.getItem(STORAGE_KEYS.LAST_SERVER_ID) || null);\n const isCheckingEmail = ref(false);\n\n // Flag pentru a preveni 401 interceptor în timpul autentificării\n // Când este true, interceptorul 401 din App.vue nu va face redirect la /login\n // Acest lucru permite modalului de server switch să gestioneze erorile de parolă\n const isAuthenticating = ref(false);\n\n // State - URL pre-selection (US-004)\n // Allows URL bookmark to pre-select a server (e.g., /login?server=romfast)\n const preselectedServerId = ref(null);\n\n // Getters\n const isAuthenticated = computed(() => !!accessToken.value);\n const currentUser = computed(() => user.value);\n\n // Getters - Auth mode (US-011)\n const isSingleServerMode = computed(() => authMode.value === \"single-server\");\n const isMultiServerMode = computed(() => authMode.value === \"multi-server\");\n\n // Getters - Multi-step login (US-010)\n const hasMultipleServers = computed(() => availableServers.value.length > 1);\n const lastServerId = computed(() => localStorage.getItem(STORAGE_KEYS.LAST_SERVER_ID));\n\n // Getter - Server name for display (US-026)\n const serverName = computed(() => {\n // If authenticated, get from JWT payload (user.server_name)\n if (user.value?.server_name) {\n return user.value.server_name;\n }\n // Fallback: search in availableServers\n const server = availableServers.value.find(s => s.id === selectedServerId.value);\n return server?.name || selectedServerId.value?.toUpperCase() || null;\n });\n\n // Actions\n\n /**\n * Get authentication mode from server (US-011 - Backward Compatibility)\n * Determines whether to use single-server (username/password) or\n * multi-server (email-based) login flow.\n *\n * @returns {Promise<{mode: string, supports_email_login: boolean}>}\n */\n const getAuthMode = async () => {\n isLoadingAuthMode.value = true;\n\n try {\n const response = await apiService.get(\"/system/auth-mode\");\n const { mode, supports_email_login } = response.data;\n\n authMode.value = mode;\n localStorage.setItem(STORAGE_KEYS.AUTH_MODE, mode);\n\n // Set initial login step based on auth mode\n if (mode === \"single-server\") {\n loginStep.value = \"username\";\n } else {\n loginStep.value = \"email\";\n }\n\n return { mode, supports_email_login };\n } catch (err) {\n console.error(\"Failed to get auth mode:\", err);\n // Default to single-server mode on error (backward compatible)\n authMode.value = \"single-server\";\n loginStep.value = \"username\";\n return { mode: \"single-server\", supports_email_login: false };\n } finally {\n isLoadingAuthMode.value = false;\n }\n };\n\n /**\n * Check if identity (email or username) exists in the system and get available servers (US-010, US-013)\n * @param {string} identity - Email address or username to check\n * @returns {Promise<{exists: boolean, servers: Array<{id: string, name: string}>, identity_type: string}>}\n */\n const checkIdentity = async (identity) => {\n isCheckingEmail.value = true;\n error.value = null;\n\n try {\n // Use new check-identity endpoint (US-013)\n const response = await apiService.post(\"/auth/check-identity\", { identity });\n const { exists, servers, identity_type } = response.data;\n\n loginEmail.value = identity; // Store identity (could be email or username)\n availableServers.value = servers;\n\n if (exists && servers.length > 0) {\n // Server selection priority (US-004):\n // 1. preselectedServerId (from URL ?server=xyz)\n // 2. lastServer (from localStorage)\n // 3. First server in list\n const lastServer = localStorage.getItem(STORAGE_KEYS.LAST_SERVER_ID);\n\n if (preselectedServerId.value && servers.some((s) => s.id === preselectedServerId.value)) {\n // URL pre-selection takes highest priority\n selectedServerId.value = preselectedServerId.value;\n } else if (lastServer && servers.some((s) => s.id === lastServer)) {\n // Fall back to last used server\n selectedServerId.value = lastServer;\n } else {\n // Default to first server\n selectedServerId.value = servers[0].id;\n }\n\n // Skip server selection step if only one server available\n if (servers.length === 1) {\n loginStep.value = \"password\";\n } else {\n loginStep.value = \"server\";\n }\n }\n\n return { exists, servers, identity_type };\n } catch (err) {\n const errorMessage = err.response?.data?.detail || \"Eroare la verificare\";\n error.value = errorMessage;\n return { exists: false, servers: [], identity_type: \"unknown\", error: errorMessage };\n } finally {\n isCheckingEmail.value = false;\n }\n };\n\n /**\n * Check if email exists in the system and get available servers (US-010)\n * DEPRECATED: Use checkIdentity for dual email/username support (US-013)\n * @param {string} email - Email address to check\n * @returns {Promise<{exists: boolean, servers: Array<{id: string, name: string}>}>}\n */\n const checkEmail = async (email) => {\n // Delegate to checkIdentity for backward compatibility\n const result = await checkIdentity(email);\n return { exists: result.exists, servers: result.servers };\n };\n\n /**\n * Login with credentials and optional server_id (US-010)\n * @param {Object} credentials - {username, password, server_id?}\n * @returns {Promise<{success: boolean, error?: string}>}\n */\n const login = async (credentials) => {\n isAuthenticating.value = true; // Previne 401 interceptor redirect\n isLoading.value = true;\n error.value = null;\n\n try {\n // Build request payload\n const payload = {\n username: credentials.username,\n password: credentials.password,\n };\n\n // Add server_id if provided (multi-server mode)\n if (credentials.server_id) {\n payload.server_id = credentials.server_id;\n }\n\n const response = await apiService.post(\"/auth/login\", payload);\n const { access_token, refresh_token, user: userData } = response.data;\n\n // IMPORTANT: Update selectedServerId BEFORE user.value to ensure\n // the companies store watch uses the correct server ID for localStorage key\n // (US-027: Multi-server company selection persistence)\n if (credentials.server_id) {\n selectedServerId.value = credentials.server_id;\n localStorage.setItem(STORAGE_KEYS.LAST_SERVER_ID, credentials.server_id);\n } else {\n // Single-server mode: clear any stale server_id from previous multi-server session\n selectedServerId.value = null;\n }\n\n accessToken.value = access_token;\n refreshToken.value = refresh_token;\n user.value = userData;\n\n localStorage.setItem(STORAGE_KEYS.ACCESS_TOKEN, access_token);\n localStorage.setItem(STORAGE_KEYS.REFRESH_TOKEN, refresh_token);\n localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(userData));\n\n apiService.defaults.headers.common[\"Authorization\"] = `Bearer ${access_token}`;\n\n // Reset login step state\n loginStep.value = \"complete\";\n\n return { success: true };\n } catch (err) {\n error.value = err.response?.data?.detail || \"Login failed\";\n return { success: false, error: error.value };\n } finally {\n isLoading.value = false;\n isAuthenticating.value = false; // Reset flag în finally pentru a garanta cleanup\n }\n };\n\n const logout = () => {\n // US-031 FIX: Save username and serverId BEFORE clearing them\n // This allows resetAllStores to properly clear localStorage keys\n const logoutContext = {\n username: user.value?.username,\n serverId: selectedServerId.value\n };\n\n accessToken.value = null;\n refreshToken.value = null;\n user.value = null;\n error.value = null;\n\n // Reset multi-step login state\n loginStep.value = \"email\";\n loginEmail.value = \"\";\n availableServers.value = [];\n // Note: Don't clear selectedServerId - keep it for next login pre-selection\n\n localStorage.removeItem(STORAGE_KEYS.ACCESS_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.REFRESH_TOKEN);\n localStorage.removeItem(STORAGE_KEYS.USER);\n // Note: Don't remove LAST_SERVER_ID - keep it for next login\n\n delete apiService.defaults.headers.common[\"Authorization\"];\n\n // US-028/US-031: Call onLogout callback with context to reset other stores\n // Context includes username and serverId saved BEFORE clearing user state\n // This allows proper cleanup of localStorage keys\n if (options.onLogout) {\n try {\n options.onLogout(logoutContext);\n } catch (err) {\n console.error(\"[Auth] Error in onLogout callback:\", err);\n }\n }\n };\n\n const refreshAccessToken = async () => {\n if (!refreshToken.value) {\n logout();\n return false;\n }\n\n try {\n const response = await apiService.post(\"/auth/refresh\", {\n refresh_token: refreshToken.value,\n });\n\n const { access_token } = response.data;\n accessToken.value = access_token;\n localStorage.setItem(STORAGE_KEYS.ACCESS_TOKEN, access_token);\n apiService.defaults.headers.common[\"Authorization\"] = `Bearer ${access_token}`;\n\n return true;\n } catch (err) {\n console.error(\"Token refresh failed:\", err);\n logout();\n return false;\n }\n };\n\n const initializeAuth = () => {\n if (accessToken.value) {\n apiService.defaults.headers.common[\"Authorization\"] = `Bearer ${accessToken.value}`;\n }\n };\n\n const clearError = () => {\n error.value = null;\n };\n\n /**\n * Reset login flow to initial state (US-010, US-011)\n * Called when user wants to change email/username\n */\n const resetLoginFlow = () => {\n // Reset step based on auth mode\n if (authMode.value === \"single-server\") {\n loginStep.value = \"username\";\n } else {\n loginStep.value = \"email\";\n }\n loginEmail.value = \"\";\n loginUsername.value = \"\";\n availableServers.value = [];\n error.value = null;\n // Keep selectedServerId from localStorage for pre-selection\n };\n\n /**\n * Go to password step (US-010)\n * Called after server selection\n */\n const goToPasswordStep = () => {\n loginStep.value = \"password\";\n };\n\n /**\n * Set selected server ID (US-010)\n * @param {string} serverId - Server ID to select\n */\n const setSelectedServer = (serverId) => {\n selectedServerId.value = serverId;\n };\n\n /**\n * Set pre-selected server ID from URL bookmark (US-004)\n * Called from LoginView when ?server=xyz query param is present.\n * The server will be validated against available servers in checkIdentity().\n * @param {string} serverId - Server ID to pre-select\n */\n const setPreselectedServer = (serverId) => {\n preselectedServerId.value = serverId;\n };\n\n /**\n * Switch to a different server without full logout (US-007)\n * Re-authenticates the current user on the new server.\n *\n * @param {string} newServerId - Server ID to switch to\n * @param {string} password - User's password for re-authentication\n * @returns {Promise<{success: boolean, error?: string}>}\n */\n const switchServer = async (newServerId, password) => {\n // Save current username BEFORE login() potentially modifies user state\n const currentUsername = user.value?.username;\n\n if (!currentUsername) {\n return { success: false, error: \"Nu există utilizator autentificat\" };\n }\n\n if (!newServerId) {\n return { success: false, error: \"Server ID lipsește\" };\n }\n\n // Re-authenticate on the new server using existing login() method\n const result = await login({\n username: currentUsername,\n password: password,\n server_id: newServerId\n });\n\n return result;\n };\n\n // Initialize on store creation\n initializeAuth();\n\n return {\n // State - Core auth\n accessToken,\n refreshToken,\n user,\n isLoading,\n error,\n\n // State - Auth mode (US-011)\n authMode,\n isLoadingAuthMode,\n\n // State - Multi-step login (US-010)\n loginStep,\n loginEmail,\n loginUsername,\n availableServers,\n selectedServerId,\n isCheckingEmail,\n isAuthenticating, // Flag pentru a preveni 401 redirect în timpul login/server-switch\n preselectedServerId, // US-004: URL bookmark pre-selection\n\n // Getters\n isAuthenticated,\n currentUser,\n isSingleServerMode,\n isMultiServerMode,\n hasMultipleServers,\n lastServerId,\n serverName,\n\n // Actions - Core auth\n login,\n logout,\n refreshAccessToken,\n initializeAuth,\n clearError,\n\n // Actions - Auth mode (US-011)\n getAuthMode,\n\n // Actions - Multi-step login (US-010, US-013)\n checkIdentity,\n checkEmail, // Deprecated, delegates to checkIdentity\n resetLoginFlow,\n goToPasswordStep,\n setSelectedServer,\n setPreselectedServer, // US-004: URL bookmark pre-selection\n\n // Actions - Server switch (US-007)\n switchServer,\n };\n });\n}\n","/**\n * Shared Companies Store Factory\n *\n * Creates a Pinia store for company selection that can be used by any ROA2WEB application.\n * Each app passes its own apiService and auth store instances.\n *\n * Usage:\n * import { createCompaniesStore } from '@shared/frontend/stores/companies';\n * import { apiService } from '../services/api';\n * import { useAuthStore } from './auth';\n * export const useCompanyStore = createCompaniesStore(apiService, useAuthStore);\n */\n\nimport { defineStore } from \"pinia\";\nimport { ref, computed, watch } from \"vue\";\n\n/**\n * Factory function to create a companies store\n * @param {Object} apiService - Axios instance configured for the app's API\n * @param {Function} useAuthStore - Reference to the auth store function\n * @returns {Function} Pinia store definition\n */\nexport function createCompaniesStore(apiService, useAuthStore) {\n return defineStore(\"companies\", () => {\n // State\n const companies = ref([]);\n const selectedCompany = ref(null);\n const isLoading = ref(false);\n const error = ref(null);\n\n // Initialize from localStorage - per user and per server (US-027)\n const initializeSelectedCompany = () => {\n const authStore = useAuthStore();\n const username = authStore.user?.username;\n const serverId = authStore.selectedServerId;\n\n if (!username) {\n console.log(\"[Companies] No username available for initialization\");\n return null;\n }\n\n // Include server_id in key for multi-server support (US-027)\n const key = serverId\n ? `selected_company_${username}_${serverId}`\n : `selected_company_${username}`;\n const saved = localStorage.getItem(key);\n if (saved) {\n try {\n const company = JSON.parse(saved);\n console.log(`[Companies] Loaded saved company for ${username}${serverId ? ` on server ${serverId}` : ''}:`, company.name);\n return company;\n } catch (e) {\n console.error(\"Failed to parse saved company\", e);\n localStorage.removeItem(key);\n }\n }\n return null;\n };\n\n // US-031 FIX: Watch for auth user changes but DON'T auto-restore company\n // The company will be restored in loadCompanies() AFTER validating\n // that the saved company exists in the server's company list.\n // This prevents restoring a company from server A when logging into server B.\n const authStore = useAuthStore();\n watch(\n () => authStore.user,\n (newUser) => {\n if (newUser && newUser.username) {\n console.log(\"[Companies] User authenticated:\", newUser.username);\n // NOTE: Company restoration moved to loadCompanies() for validation\n }\n },\n { immediate: true }\n );\n\n // Getters\n const companyList = computed(() => companies.value);\n const hasCompanies = computed(() => companies.value.length > 0);\n const selectedCompanyId = computed(() => selectedCompany.value?.id_firma || null);\n\n const companyListFormatted = computed(() => {\n return companies.value.map((company) => ({\n ...company,\n displayName: company.fiscal_code\n ? `${company.name} (${company.fiscal_code})`\n : company.name,\n }));\n });\n\n // Actions\n const loadCompanies = async () => {\n isLoading.value = true;\n error.value = null;\n\n try {\n console.log(\"[Companies] Loading companies...\");\n const response = await apiService.get(\"/companies\");\n companies.value = response.data.companies || [];\n console.log(\"[Companies] Loaded\", companies.value.length, \"companies\");\n\n // Get current server context\n const authStore = useAuthStore();\n const currentServerId = authStore.selectedServerId;\n\n // US-034 FIX: Always try to restore saved company for CURRENT server\n // This handles server switching where selectedCompany holds old server's company\n const savedCompany = initializeSelectedCompany();\n\n // Check if current selectedCompany matches current server\n const currentCompanyMatchesServer =\n selectedCompany.value &&\n selectedCompany.value._server_id === currentServerId;\n\n if (savedCompany) {\n // US-003: Validate server_id before restoring\n // Two servers can have companies with the same id_firma\n if (savedCompany._server_id && savedCompany._server_id !== currentServerId) {\n console.log(\"[Companies] Saved company server mismatch, ignoring\");\n console.log(`[Companies] Saved server: ${savedCompany._server_id}, current: ${currentServerId}`);\n // Only clear if current selection also doesn't match\n if (!currentCompanyMatchesServer) {\n selectedCompany.value = null;\n }\n } else {\n // Validate that saved company exists in the current server's list\n const exists = companies.value.find(\n (c) => c.id_firma === savedCompany.id_firma\n );\n if (exists) {\n selectedCompany.value = savedCompany;\n console.log(\"[Companies] Restored saved company:\", savedCompany.name);\n } else {\n console.warn(\"[Companies] Saved company not in current server list, ignoring:\", savedCompany.name);\n selectedCompany.value = null;\n }\n }\n } else if (!currentCompanyMatchesServer) {\n // No saved company and current selection doesn't match server - clear it\n console.log(\"[Companies] No saved company for current server, clearing selection\");\n selectedCompany.value = null;\n }\n\n // Validate if already selected company is still accessible\n if (selectedCompany.value) {\n const exists = companies.value.find(\n (c) => c.id_firma === selectedCompany.value.id_firma\n );\n if (!exists) {\n console.warn(\"[Companies] Selected company not accessible, clearing\");\n selectedCompany.value = null;\n }\n }\n\n // Auto-select first company if none selected\n if (!selectedCompany.value && companies.value.length > 0) {\n const firstCompany = companies.value[0];\n console.log(\"[Companies] Auto-selecting first company:\", firstCompany.name);\n setSelectedCompany(firstCompany);\n }\n\n return { success: true };\n } catch (err) {\n error.value = err.response?.data?.detail || \"Failed to load companies\";\n console.error(\"Failed to load companies:\", err);\n return { success: false, error: error.value };\n } finally {\n isLoading.value = false;\n }\n };\n\n const setSelectedCompany = (company) => {\n selectedCompany.value = company;\n\n const authStore = useAuthStore();\n const username = authStore.user?.username;\n const serverId = authStore.selectedServerId;\n\n if (!username) {\n console.warn(\"[Companies] Cannot save - no username\");\n return;\n }\n\n // Include server_id in key for multi-server support (US-027)\n const key = serverId\n ? `selected_company_${username}_${serverId}`\n : `selected_company_${username}`;\n if (company) {\n // US-003: Include _server_id in saved object for validation at restore\n // This prevents restoring a company from a different server with same id_firma\n const companyToSave = {\n ...company,\n _server_id: serverId\n };\n localStorage.setItem(key, JSON.stringify(companyToSave));\n console.log(`[Companies] Saved company for ${username}${serverId ? ` on server ${serverId}` : ''}:`, company.name);\n } else {\n localStorage.removeItem(key);\n }\n };\n\n const clearSelectedCompany = () => {\n selectedCompany.value = null;\n\n const authStore = useAuthStore();\n const username = authStore.user?.username;\n const serverId = authStore.selectedServerId;\n\n if (username) {\n // Include server_id in key for multi-server support (US-027)\n const key = serverId\n ? `selected_company_${username}_${serverId}`\n : `selected_company_${username}`;\n localStorage.removeItem(key);\n }\n };\n\n const getCompanyById = (id_firma) => {\n return companies.value.find(\n (company) => company.id_firma === parseInt(id_firma)\n );\n };\n\n const clearError = () => {\n error.value = null;\n };\n\n const reset = () => {\n companies.value = [];\n selectedCompany.value = null;\n isLoading.value = false;\n error.value = null;\n\n const authStore = useAuthStore();\n const username = authStore.user?.username;\n const serverId = authStore.selectedServerId;\n if (username) {\n // Include server_id in key for multi-server support (US-027)\n const key = serverId\n ? `selected_company_${username}_${serverId}`\n : `selected_company_${username}`;\n localStorage.removeItem(key);\n }\n };\n\n /**\n * US-031: Reset with explicit context (username, serverId)\n * Called from onLogout callback when authStore.user is already null.\n * This allows proper cleanup of localStorage keys.\n *\n * @param {string} username - Username saved before logout\n * @param {string} serverId - Server ID saved before logout\n */\n const resetWithContext = (username, serverId) => {\n companies.value = [];\n selectedCompany.value = null;\n isLoading.value = false;\n error.value = null;\n\n if (username) {\n // Clear the server-specific key (new format from US-027)\n if (serverId) {\n const newKey = `selected_company_${username}_${serverId}`;\n localStorage.removeItem(newKey);\n console.log(`[Companies] Cleared localStorage key: ${newKey}`);\n }\n\n // IMPORTANT: Also clear the old key (without server) for cleanup\n // This handles migration from old format and prevents stale data\n const oldKey = `selected_company_${username}`;\n localStorage.removeItem(oldKey);\n console.log(`[Companies] Cleared old localStorage key: ${oldKey}`);\n }\n };\n\n return {\n // State\n companies,\n selectedCompany,\n isLoading,\n error,\n\n // Getters\n companyList,\n companyListFormatted,\n hasCompanies,\n selectedCompanyId,\n\n // Actions\n loadCompanies,\n setSelectedCompany,\n clearSelectedCompany,\n getCompanyById,\n clearError,\n reset,\n resetWithContext, // US-031: Reset with explicit context for logout\n };\n });\n}\n","/**\n * Shared Accounting Period Store Factory\n *\n * Creates a Pinia store for accounting period selection that can be used by any ROA2WEB application.\n * Each app passes its own apiService and store references.\n *\n * Usage:\n * import { createAccountingPeriodStore } from '@shared/frontend/stores/accountingPeriod';\n * import { apiService } from '../services/api';\n * import { useAuthStore } from './auth';\n * import { useCompanyStore } from './companies';\n * export const useAccountingPeriodStore = createAccountingPeriodStore(apiService, useAuthStore, useCompanyStore);\n */\n\nimport { defineStore } from \"pinia\";\nimport { ref, computed } from \"vue\";\n\n/**\n * Factory function to create an accounting period store\n * @param {Object} apiService - Axios instance configured for the app's API\n * @param {Function} useAuthStore - Reference to the auth store function\n * @param {Function} useCompanyStore - Reference to the company store function\n * @returns {Function} Pinia store definition\n */\nexport function createAccountingPeriodStore(apiService, useAuthStore, useCompanyStore) {\n return defineStore(\"accountingPeriod\", () => {\n // State\n const periods = ref([]);\n const selectedPeriod = ref(null);\n const isLoading = ref(false);\n const error = ref(null);\n\n // Getters\n const hasPeriods = computed(() => periods.value.length > 0);\n const currentPeriod = computed(() => selectedPeriod.value);\n\n // Computed date range for current period (first/last day of month)\n const dateRange = computed(() => {\n if (!selectedPeriod.value) return { dateFrom: null, dateTo: null };\n\n const { an, luna } = selectedPeriod.value;\n const firstDay = new Date(an, luna - 1, 1);\n const lastDay = new Date(an, luna, 0);\n\n return {\n dateFrom: firstDay,\n dateTo: lastDay,\n };\n });\n\n // localStorage helpers - lazy instantiate stores only when needed\n const getStorageKey = () => {\n try {\n const authStore = useAuthStore();\n const companyStore = useCompanyStore();\n const username = authStore.user?.username;\n const serverId = authStore.selectedServerId;\n const companyId = companyStore.selectedCompany?.id_firma;\n if (!username || !companyId) return null;\n // Include serverId in key to separate periods per server\n // Backward compatible: if no serverId, use old format\n if (serverId) {\n return `selected_period_${username}_${serverId}_${companyId}`;\n }\n return `selected_period_${username}_${companyId}`;\n } catch (e) {\n // Stores not yet initialized, skip localStorage\n return null;\n }\n };\n\n const initializeSelectedPeriod = () => {\n const key = getStorageKey();\n if (!key) return null;\n\n const saved = localStorage.getItem(key);\n if (saved) {\n try {\n return JSON.parse(saved);\n } catch (e) {\n localStorage.removeItem(key);\n }\n }\n return null;\n };\n\n const persistSelectedPeriod = (period) => {\n const key = getStorageKey();\n if (key && period) {\n localStorage.setItem(key, JSON.stringify(period));\n }\n };\n\n // Actions\n const loadPeriods = async (companyId) => {\n if (!companyId) {\n console.warn('[Period] loadPeriods called without companyId');\n return { success: false };\n }\n\n isLoading.value = true;\n error.value = null;\n\n try {\n console.log('[Period] Loading periods for company:', companyId);\n const response = await apiService.get(\"/calendar/periods\", {\n params: { company: companyId },\n });\n\n periods.value = response.data.periods || [];\n console.log('[Period] Loaded', periods.value.length, 'periods');\n console.log('[Period] Backend current_period:', response.data.current_period);\n\n // Try to restore saved period or use most recent\n const saved = initializeSelectedPeriod();\n console.log('[Period] Saved period from localStorage:', saved);\n\n if (saved) {\n const exists = periods.value.find(\n (p) => p.an === saved.an && p.luna === saved.luna\n );\n if (exists) {\n console.log('[Period] Restoring saved period:', exists);\n selectedPeriod.value = exists;\n } else if (response.data.current_period) {\n console.log('[Period] Saved period not found, using current:', response.data.current_period);\n setSelectedPeriod(response.data.current_period);\n }\n } else if (response.data.current_period) {\n console.log('[Period] No saved period, auto-selecting current:', response.data.current_period);\n setSelectedPeriod(response.data.current_period);\n } else {\n console.warn('[Period] No saved period and no current_period from backend!');\n }\n\n console.log('[Period] Final selectedPeriod:', selectedPeriod.value);\n return { success: true };\n } catch (err) {\n error.value = err.response?.data?.detail || \"Failed to load periods\";\n console.error(\"[Period] Failed to load periods - Full error:\", err);\n console.error(\"[Period] Error response:\", err.response);\n console.error(\"[Period] Error message:\", err.message);\n console.error(\"[Period] Error status:\", err.response?.status);\n console.error(\"[Period] Error data:\", err.response?.data);\n return { success: false, error: error.value };\n } finally {\n isLoading.value = false;\n }\n };\n\n const setSelectedPeriod = (period) => {\n selectedPeriod.value = period;\n persistSelectedPeriod(period);\n };\n\n const resetToLatest = () => {\n if (periods.value.length > 0) {\n setSelectedPeriod(periods.value[0]);\n }\n };\n\n const reset = () => {\n periods.value = [];\n selectedPeriod.value = null;\n isLoading.value = false;\n error.value = null;\n };\n\n /**\n * Reset with explicit context - used during logout when authStore.user is already null\n * @param {string} username - Username to identify localStorage keys\n * @param {string} serverId - Server ID to identify localStorage keys (optional)\n */\n const resetWithContext = (username, serverId) => {\n // Reset state\n periods.value = [];\n selectedPeriod.value = null;\n isLoading.value = false;\n error.value = null;\n\n // Clear all localStorage keys for this user's periods\n if (username) {\n const prefix = `selected_period_${username}_`;\n Object.keys(localStorage)\n .filter((key) => key.startsWith(prefix))\n .forEach((key) => {\n console.log(\"[Period] Clearing localStorage key:\", key);\n localStorage.removeItem(key);\n });\n }\n };\n\n return {\n // State\n periods,\n selectedPeriod,\n isLoading,\n error,\n\n // Getters\n hasPeriods,\n currentPeriod,\n dateRange,\n\n // Actions\n loadPeriods,\n setSelectedPeriod,\n resetToLatest,\n reset,\n resetWithContext,\n };\n });\n}\n","export const menuSections = [\n {\n title: 'Rapoarte',\n items: [\n { to: '/reports/dashboard', icon: 'pi pi-home', label: 'Dashboard' },\n { to: '/reports/invoices', icon: 'pi pi-file', label: 'Facturi' },\n { to: '/reports/cash', icon: 'pi pi-wallet', label: 'Casă' },\n { to: '/reports/bank', icon: 'pi pi-building', label: 'Bancă' },\n { to: '/reports/trial-balance', icon: 'pi pi-calculator', label: 'Balanță de Verificare' }\n ]\n },\n {\n title: 'Analize',\n items: [\n { to: '/reports/maturity-analysis', icon: 'pi pi-clock', label: 'Scadențe' },\n { to: '/reports/detailed-invoices', icon: 'pi pi-list', label: 'Facturi Detaliate' }\n ]\n },\n {\n title: 'Introduceri Date',\n items: [\n { to: '/data-entry', icon: 'pi pi-list', label: 'Lista Bonuri' },\n { to: '/data-entry/create', icon: 'pi pi-plus', label: 'Bon Nou' }\n // US-013: Removed bulk-upload link - functionality integrated into Lista Bonuri via drag & drop\n ]\n },\n {\n title: 'Sistem',\n items: [\n { to: '/reports/telegram', icon: 'pi pi-telegram', label: 'Telegram Bot' },\n { to: '/reports/cache-stats', icon: 'pi pi-chart-bar', label: 'Statistici Cache' },\n { to: '/data-entry/ocr-metrics', icon: 'pi pi-eye', label: 'Statistici OCR' },\n { to: '/reports/server-logs', icon: 'pi pi-server', label: 'Server Logs' },\n { action: 'devtools', icon: 'pi pi-cog', label: 'DevTools', mobileOnly: true }\n ]\n }\n]\n","export const features = {\n reports: {\n enabled: import.meta.env.VITE_FEATURE_REPORTS !== 'false',\n modules: {\n dashboard: true,\n invoices: true,\n bankCash: true,\n trialBalance: true,\n telegram: true,\n cacheStats: true\n }\n },\n dataEntry: {\n enabled: import.meta.env.VITE_FEATURE_DATA_ENTRY !== 'false',\n modules: {\n receipts: true,\n ocr: true\n }\n }\n}\n\nexport function isFeatureEnabled(module, subModule = null) {\n if (!features[module]?.enabled) return false\n if (subModule && !features[module]?.modules?.[subModule]) return false\n return true\n}\n\nexport function getEnabledMenuSections(menuSections) {\n return menuSections.filter(section => {\n if (section.title === 'Rapoarte') return features.reports.enabled\n if (section.title === 'Introduceri Date') return features.dataEntry.enabled\n return true // System section always visible\n })\n}\n","/**\n * Auth Redirect Utility\n *\n * Handles 401 Unauthorized responses with protection against race conditions.\n * When multiple API calls return 401 simultaneously, only the first one\n * triggers the redirect to prevent UI flickering and double redirects.\n */\n\n// Flag to prevent multiple simultaneous redirects\nlet isRedirecting = false\n\n/**\n * Handle 401 Unauthorized error by clearing auth data and redirecting to login.\n * Uses a flag to prevent race conditions when multiple API calls fail simultaneously.\n *\n * @returns {boolean} true if redirect was initiated, false if already redirecting\n */\nexport function handleUnauthorized() {\n // Prevent multiple redirects\n if (isRedirecting) {\n console.log('[Auth] Redirect already in progress, skipping...')\n return false\n }\n\n isRedirecting = true\n console.log('[Auth] 401 Unauthorized - clearing auth data and redirecting to login')\n\n // Clear all auth-related data from localStorage\n localStorage.removeItem('access_token')\n localStorage.removeItem('refresh_token')\n localStorage.removeItem('user')\n\n // Small delay to ensure localStorage is cleared before redirect\n // This also allows any pending API calls to complete/fail gracefully\n setTimeout(() => {\n window.location.href = import.meta.env.BASE_URL + 'login'\n }, 100)\n\n return true\n}\n\n/**\n * Check if a redirect is currently in progress.\n * Useful for components that want to skip error handling during redirect.\n *\n * @returns {boolean} true if redirect is in progress\n */\nexport function isAuthRedirectInProgress() {\n return isRedirecting\n}\n\n/**\n * Reset the redirect flag.\n * Should only be used in tests or special cases.\n */\nexport function resetAuthRedirectFlag() {\n isRedirecting = false\n}\n","\n\n\n\n\n","import { createRouter, createWebHistory } from 'vue-router'\n\nconst routes = [\n {\n path: '/login',\n name: 'Login',\n component: () => import('@/views/LoginWrapper.vue'),\n meta: { requiresAuth: false, title: 'Autentificare - ROA2WEB' }\n },\n {\n path: '/reports',\n component: () => import('@/modules/reports/ReportsLayout.vue'),\n meta: { requiresAuth: true },\n children: [\n {\n path: 'dashboard',\n name: 'Dashboard',\n component: () => import('@reports/views/DashboardView.vue'),\n meta: { requiresAuth: true, title: 'Dashboard - ROA2WEB' }\n },\n {\n path: 'invoices',\n name: 'Invoices',\n component: () => import('@reports/views/InvoicesView.vue'),\n meta: { requiresAuth: true, title: 'Facturi - ROA2WEB' }\n },\n {\n // US-519: Redirect old bank-cash route to /reports/cash\n path: 'bank-cash',\n redirect: '/reports/cash'\n },\n {\n // US-519: Separate Cash page\n path: 'cash',\n name: 'Cash',\n component: () => import('@reports/views/CashView.vue'),\n meta: { requiresAuth: true, title: 'Casă - ROA2WEB' }\n },\n {\n // US-519: Separate Bank page\n path: 'bank',\n name: 'Bank',\n component: () => import('@reports/views/BankView.vue'),\n meta: { requiresAuth: true, title: 'Bancă - ROA2WEB' }\n },\n {\n path: 'trial-balance',\n name: 'TrialBalance',\n component: () => import('@reports/views/TrialBalanceView.vue'),\n meta: { requiresAuth: true, title: 'Balanță de Verificare - ROA2WEB' }\n },\n {\n path: 'telegram',\n name: 'Telegram',\n component: () => import('@reports/views/TelegramView.vue'),\n meta: { requiresAuth: true, title: 'Telegram Bot - ROA2WEB' }\n },\n {\n path: 'cache-stats',\n name: 'CacheStats',\n component: () => import('@reports/views/CacheStatsView.vue'),\n meta: { requiresAuth: true, title: 'Statistici Cache - ROA2WEB' }\n },\n {\n path: 'server-logs',\n name: 'ServerLogs',\n component: () => import('@reports/views/ServerLogsView.vue'),\n meta: { requiresAuth: true, title: 'Server Logs - ROA2WEB' }\n },\n {\n path: 'maturity-analysis',\n name: 'MaturityAnalysis',\n component: () => import('@reports/views/MaturityAnalysisView.vue'),\n meta: { requiresAuth: true, title: 'Analiză Scadențe - ROA2WEB' }\n },\n {\n // US-603: Single route for Detailed Invoices with tabs (Clienți/Furnizori)\n path: 'detailed-invoices',\n name: 'DetailedInvoices',\n component: () => import('@reports/views/DetailedInvoicesView.vue'),\n meta: { requiresAuth: true, title: 'Facturi Detaliate - ROA2WEB' }\n }\n ]\n },\n {\n path: '/data-entry',\n component: () => import('@/modules/data-entry/DataEntryLayout.vue'),\n meta: { requiresAuth: true },\n children: [\n {\n path: '',\n name: 'ReceiptsList',\n component: () => import('@data-entry/views/receipts/ReceiptsListView.vue'),\n meta: { requiresAuth: true, title: 'Lista Bonuri - ROA2WEB' }\n },\n {\n path: 'create',\n name: 'ReceiptCreate',\n component: () => import('@data-entry/views/receipts/ReceiptCreateUnifiedView.vue'),\n meta: { requiresAuth: true, title: 'Bon Nou - ROA2WEB' }\n },\n {\n path: 'create-old',\n name: 'ReceiptCreateOld',\n component: () => import('@data-entry/views/receipts/ReceiptCreateView.vue'),\n meta: { requiresAuth: true, title: 'Bon Nou (Legacy) - ROA2WEB' }\n },\n {\n path: ':id',\n name: 'ReceiptDetail',\n component: () => import('@data-entry/views/receipts/ReceiptCreateUnifiedView.vue'),\n meta: { requiresAuth: true, title: 'Detalii Bon - ROA2WEB' }\n },\n {\n path: ':id/edit',\n name: 'ReceiptEdit',\n component: () => import('@data-entry/views/receipts/ReceiptCreateUnifiedView.vue'),\n meta: { requiresAuth: true, title: 'Editare Bon - ROA2WEB' }\n },\n {\n path: 'ocr-metrics',\n name: 'OCRMetrics',\n component: () => import('@data-entry/views/OCRMetricsView.vue'),\n meta: { requiresAuth: true, title: 'Metrici OCR - ROA2WEB' }\n },\n {\n // US-013: Redirect old bulk-upload route to main list (backwards compatibility)\n path: 'bulk-upload',\n redirect: '/data-entry'\n }\n ]\n },\n {\n path: '/settings',\n name: 'SettingsHub',\n component: () => import('@/modules/reports/ReportsLayout.vue'),\n meta: { requiresAuth: true },\n children: [\n {\n path: '',\n name: 'Settings',\n component: () => import('@reports/views/SettingsHubView.vue'),\n meta: { requiresAuth: true, title: 'Setări - ROA2WEB' }\n }\n ]\n },\n {\n path: '/dashboard',\n name: 'MainDashboard',\n component: () => import('@reports/views/DashboardView.vue'),\n meta: { requiresAuth: true, title: 'Dashboard - ROA2WEB' }\n },\n {\n path: '/',\n redirect: '/dashboard'\n },\n {\n path: '/:pathMatch(.*)*',\n redirect: '/dashboard'\n }\n]\n\nconst router = createRouter({\n history: createWebHistory(import.meta.env.BASE_URL),\n routes\n})\n\n// Navigation guard for authentication\nrouter.beforeEach((to, from, next) => {\n const isAuthenticated = !!localStorage.getItem('access_token')\n\n if (to.meta.requiresAuth && !isAuthenticated) {\n next('/login')\n } else if (to.path === '/login' && isAuthenticated) {\n next('/reports/dashboard')\n } else {\n next()\n }\n})\n\n// Set page title after navigation\nrouter.afterEach((to) => {\n document.title = to.meta.title || 'ROA2WEB'\n window.scrollTo(0, 0)\n})\n\nexport default router\n","import BaseStyle from 'primevue/base/style';\n\nvar classes = {\n root: 'p-card p-component',\n header: 'p-card-header',\n body: 'p-card-body',\n caption: 'p-card-caption',\n title: 'p-card-title',\n subtitle: 'p-card-subtitle',\n content: 'p-card-content',\n footer: 'p-card-footer'\n};\nvar CardStyle = BaseStyle.extend({\n name: 'card',\n classes: classes\n});\n\nexport { CardStyle as default };\n","import BaseComponent from 'primevue/basecomponent';\nimport CardStyle from 'primevue/card/style';\nimport { openBlock, createElementBlock, mergeProps, renderSlot, createCommentVNode, createElementVNode } from 'vue';\n\nvar script$1 = {\n name: 'BaseCard',\n \"extends\": BaseComponent,\n style: CardStyle\n};\n\nvar script = {\n name: 'Card',\n \"extends\": script$1,\n inheritAttrs: false\n};\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"div\", mergeProps({\n \"class\": _ctx.cx('root')\n }, _ctx.ptmi('root')), [_ctx.$slots.header ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('header')\n }, _ctx.ptm('header')), [renderSlot(_ctx.$slots, \"header\")], 16)) : createCommentVNode(\"\", true), createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('body')\n }, _ctx.ptm('body')), [_ctx.$slots.title || _ctx.$slots.subtitle ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('caption')\n }, _ctx.ptm('caption')), [_ctx.$slots.title ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('title')\n }, _ctx.ptm('title')), [renderSlot(_ctx.$slots, \"title\")], 16)) : createCommentVNode(\"\", true), _ctx.$slots.subtitle ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 1,\n \"class\": _ctx.cx('subtitle')\n }, _ctx.ptm('subtitle')), [renderSlot(_ctx.$slots, \"subtitle\")], 16)) : createCommentVNode(\"\", true)], 16)) : createCommentVNode(\"\", true), createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('content')\n }, _ctx.ptm('content')), [renderSlot(_ctx.$slots, \"content\")], 16), _ctx.$slots.footer ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 1,\n \"class\": _ctx.cx('footer')\n }, _ctx.ptm('footer')), [renderSlot(_ctx.$slots, \"footer\")], 16)) : createCommentVNode(\"\", true)], 16)], 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\nvar classes = {\n root: function root(_ref) {\n var instance = _ref.instance,\n props = _ref.props;\n return ['p-menu p-component', {\n 'p-menu-overlay': props.popup,\n 'p-ripple-disabled': instance.$primevue.config.ripple === false\n }];\n },\n start: 'p-menu-start',\n menu: 'p-menu-list p-reset',\n submenuHeader: 'p-submenu-header',\n separator: 'p-menuitem-separator',\n end: 'p-menu-end',\n menuitem: function menuitem(_ref2) {\n var instance = _ref2.instance;\n return ['p-menuitem', {\n 'p-focus': instance.id === instance.focusedOptionId,\n 'p-disabled': instance.disabled()\n }];\n },\n content: 'p-menuitem-content',\n action: 'p-menuitem-link',\n icon: 'p-menuitem-icon',\n label: 'p-menuitem-text'\n};\nvar MenuStyle = BaseStyle.extend({\n name: 'menu',\n classes: classes\n});\n\nexport { MenuStyle as default };\n","import OverlayEventBus from 'primevue/overlayeventbus';\nimport Portal from 'primevue/portal';\nimport { ObjectUtils, UniqueComponentId, ZIndexUtils, DomHandler, ConnectedOverlayScrollHandler } from 'primevue/utils';\nimport BaseComponent from 'primevue/basecomponent';\nimport MenuStyle from 'primevue/menu/style';\nimport Ripple from 'primevue/ripple';\nimport { mergeProps, resolveDirective, openBlock, createElementBlock, createElementVNode, withDirectives, createBlock, resolveDynamicComponent, normalizeClass, createCommentVNode, toDisplayString, resolveComponent, withCtx, createVNode, Transition, renderSlot, Fragment, renderList, createTextVNode } from 'vue';\n\nvar script$2 = {\n name: 'BaseMenu',\n \"extends\": BaseComponent,\n props: {\n popup: {\n type: Boolean,\n \"default\": false\n },\n model: {\n type: Array,\n \"default\": null\n },\n appendTo: {\n type: [String, Object],\n \"default\": 'body'\n },\n autoZIndex: {\n type: Boolean,\n \"default\": true\n },\n baseZIndex: {\n type: Number,\n \"default\": 0\n },\n tabindex: {\n type: Number,\n \"default\": 0\n },\n ariaLabel: {\n type: String,\n \"default\": null\n },\n ariaLabelledby: {\n type: String,\n \"default\": null\n }\n },\n style: MenuStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script$1 = {\n name: 'Menuitem',\n hostName: 'Menu',\n \"extends\": BaseComponent,\n inheritAttrs: false,\n emits: ['item-click', 'item-mousemove'],\n props: {\n item: null,\n templates: null,\n id: null,\n focusedOptionId: null,\n index: null\n },\n methods: {\n getItemProp: function getItemProp(processedItem, name) {\n return processedItem && processedItem.item ? ObjectUtils.getItemValue(processedItem.item[name]) : undefined;\n },\n getPTOptions: function getPTOptions(key) {\n return this.ptm(key, {\n context: {\n item: this.item,\n index: this.index,\n focused: this.isItemFocused(),\n disabled: this.disabled()\n }\n });\n },\n isItemFocused: function isItemFocused() {\n return this.focusedOptionId === this.id;\n },\n onItemClick: function onItemClick(event) {\n var command = this.getItemProp(this.item, 'command');\n command && command({\n originalEvent: event,\n item: this.item.item\n });\n this.$emit('item-click', {\n originalEvent: event,\n item: this.item,\n id: this.id\n });\n },\n onItemMouseMove: function onItemMouseMove(event) {\n this.$emit('item-mousemove', {\n originalEvent: event,\n item: this.item,\n id: this.id\n });\n },\n visible: function visible() {\n return typeof this.item.visible === 'function' ? this.item.visible() : this.item.visible !== false;\n },\n disabled: function disabled() {\n return typeof this.item.disabled === 'function' ? this.item.disabled() : this.item.disabled;\n },\n label: function label() {\n return typeof this.item.label === 'function' ? this.item.label() : this.item.label;\n },\n getMenuItemProps: function getMenuItemProps(item) {\n return {\n action: mergeProps({\n \"class\": this.cx('action'),\n tabindex: '-1',\n 'aria-hidden': true\n }, this.getPTOptions('action')),\n icon: mergeProps({\n \"class\": [this.cx('icon'), item.icon]\n }, this.getPTOptions('icon')),\n label: mergeProps({\n \"class\": this.cx('label')\n }, this.getPTOptions('label'))\n };\n }\n },\n directives: {\n ripple: Ripple\n }\n};\n\nvar _hoisted_1$1 = [\"id\", \"aria-label\", \"aria-disabled\", \"data-p-focused\", \"data-p-disabled\"];\nvar _hoisted_2$1 = [\"href\", \"target\"];\nfunction render$1(_ctx, _cache, $props, $setup, $data, $options) {\n var _directive_ripple = resolveDirective(\"ripple\");\n return $options.visible() ? (openBlock(), createElementBlock(\"li\", mergeProps({\n key: 0,\n id: $props.id,\n \"class\": [_ctx.cx('menuitem'), $props.item[\"class\"]],\n role: \"menuitem\",\n style: $props.item.style,\n \"aria-label\": $options.label(),\n \"aria-disabled\": $options.disabled()\n }, $options.getPTOptions('menuitem'), {\n \"data-p-focused\": $options.isItemFocused(),\n \"data-p-disabled\": $options.disabled() || false\n }), [createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('content'),\n onClick: _cache[0] || (_cache[0] = function ($event) {\n return $options.onItemClick($event);\n }),\n onMousemove: _cache[1] || (_cache[1] = function ($event) {\n return $options.onItemMouseMove($event);\n })\n }, $options.getPTOptions('content')), [!$props.templates.item ? withDirectives((openBlock(), createElementBlock(\"a\", mergeProps({\n key: 0,\n href: $props.item.url,\n \"class\": _ctx.cx('action'),\n target: $props.item.target,\n tabindex: \"-1\",\n \"aria-hidden\": \"true\"\n }, $options.getPTOptions('action')), [$props.templates.itemicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.itemicon), {\n key: 0,\n item: $props.item,\n \"class\": normalizeClass(_ctx.cx('icon'))\n }, null, 8, [\"item\", \"class\"])) : $props.item.icon ? (openBlock(), createElementBlock(\"span\", mergeProps({\n key: 1,\n \"class\": [_ctx.cx('icon'), $props.item.icon]\n }, $options.getPTOptions('icon')), null, 16)) : createCommentVNode(\"\", true), createElementVNode(\"span\", mergeProps({\n \"class\": _ctx.cx('label')\n }, $options.getPTOptions('label')), toDisplayString($options.label()), 17)], 16, _hoisted_2$1)), [[_directive_ripple]]) : $props.templates.item ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.item), {\n key: 1,\n item: $props.item,\n label: $options.label(),\n props: $options.getMenuItemProps($props.item)\n }, null, 8, [\"item\", \"label\", \"props\"])) : createCommentVNode(\"\", true)], 16)], 16, _hoisted_1$1)) : createCommentVNode(\"\", true);\n}\n\nscript$1.render = render$1;\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nvar script = {\n name: 'Menu',\n \"extends\": script$2,\n inheritAttrs: false,\n emits: ['show', 'hide', 'focus', 'blur'],\n data: function data() {\n return {\n id: this.$attrs.id,\n overlayVisible: false,\n focused: false,\n focusedOptionIndex: -1,\n selectedOptionIndex: -1\n };\n },\n watch: {\n '$attrs.id': function $attrsId(newValue) {\n this.id = newValue || UniqueComponentId();\n }\n },\n target: null,\n outsideClickListener: null,\n scrollHandler: null,\n resizeListener: null,\n container: null,\n list: null,\n mounted: function mounted() {\n this.id = this.id || UniqueComponentId();\n if (!this.popup) {\n this.bindResizeListener();\n this.bindOutsideClickListener();\n }\n },\n beforeUnmount: function beforeUnmount() {\n this.unbindResizeListener();\n this.unbindOutsideClickListener();\n if (this.scrollHandler) {\n this.scrollHandler.destroy();\n this.scrollHandler = null;\n }\n this.target = null;\n if (this.container && this.autoZIndex) {\n ZIndexUtils.clear(this.container);\n }\n this.container = null;\n },\n methods: {\n itemClick: function itemClick(event) {\n var item = event.item;\n if (this.disabled(item)) {\n return;\n }\n if (item.command) {\n item.command(event);\n }\n if (this.overlayVisible) this.hide();\n if (!this.popup && this.focusedOptionIndex !== event.id) {\n this.focusedOptionIndex = event.id;\n }\n },\n itemMouseMove: function itemMouseMove(event) {\n if (this.focused) {\n this.focusedOptionIndex = event.id;\n }\n },\n onListFocus: function onListFocus(event) {\n this.focused = true;\n !this.popup && this.changeFocusedOptionIndex(0);\n this.$emit('focus', event);\n },\n onListBlur: function onListBlur(event) {\n this.focused = false;\n this.focusedOptionIndex = -1;\n this.$emit('blur', event);\n },\n onListKeyDown: function onListKeyDown(event) {\n switch (event.code) {\n case 'ArrowDown':\n this.onArrowDownKey(event);\n break;\n case 'ArrowUp':\n this.onArrowUpKey(event);\n break;\n case 'Home':\n this.onHomeKey(event);\n break;\n case 'End':\n this.onEndKey(event);\n break;\n case 'Enter':\n case 'NumpadEnter':\n this.onEnterKey(event);\n break;\n case 'Space':\n this.onSpaceKey(event);\n break;\n case 'Escape':\n if (this.popup) {\n DomHandler.focus(this.target);\n this.hide();\n }\n case 'Tab':\n this.overlayVisible && this.hide();\n break;\n }\n },\n onArrowDownKey: function onArrowDownKey(event) {\n var optionIndex = this.findNextOptionIndex(this.focusedOptionIndex);\n this.changeFocusedOptionIndex(optionIndex);\n event.preventDefault();\n },\n onArrowUpKey: function onArrowUpKey(event) {\n if (event.altKey && this.popup) {\n DomHandler.focus(this.target);\n this.hide();\n event.preventDefault();\n } else {\n var optionIndex = this.findPrevOptionIndex(this.focusedOptionIndex);\n this.changeFocusedOptionIndex(optionIndex);\n event.preventDefault();\n }\n },\n onHomeKey: function onHomeKey(event) {\n this.changeFocusedOptionIndex(0);\n event.preventDefault();\n },\n onEndKey: function onEndKey(event) {\n this.changeFocusedOptionIndex(DomHandler.find(this.container, 'li[data-pc-section=\"menuitem\"][data-p-disabled=\"false\"]').length - 1);\n event.preventDefault();\n },\n onEnterKey: function onEnterKey(event) {\n var element = DomHandler.findSingle(this.list, \"li[id=\\\"\".concat(\"\".concat(this.focusedOptionIndex), \"\\\"]\"));\n var anchorElement = element && DomHandler.findSingle(element, 'a[data-pc-section=\"action\"]');\n this.popup && DomHandler.focus(this.target);\n anchorElement ? anchorElement.click() : element && element.click();\n event.preventDefault();\n },\n onSpaceKey: function onSpaceKey(event) {\n this.onEnterKey(event);\n },\n findNextOptionIndex: function findNextOptionIndex(index) {\n var links = DomHandler.find(this.container, 'li[data-pc-section=\"menuitem\"][data-p-disabled=\"false\"]');\n var matchedOptionIndex = _toConsumableArray(links).findIndex(function (link) {\n return link.id === index;\n });\n return matchedOptionIndex > -1 ? matchedOptionIndex + 1 : 0;\n },\n findPrevOptionIndex: function findPrevOptionIndex(index) {\n var links = DomHandler.find(this.container, 'li[data-pc-section=\"menuitem\"][data-p-disabled=\"false\"]');\n var matchedOptionIndex = _toConsumableArray(links).findIndex(function (link) {\n return link.id === index;\n });\n return matchedOptionIndex > -1 ? matchedOptionIndex - 1 : 0;\n },\n changeFocusedOptionIndex: function changeFocusedOptionIndex(index) {\n var links = DomHandler.find(this.container, 'li[data-pc-section=\"menuitem\"][data-p-disabled=\"false\"]');\n var order = index >= links.length ? links.length - 1 : index < 0 ? 0 : index;\n order > -1 && (this.focusedOptionIndex = links[order].getAttribute('id'));\n },\n toggle: function toggle(event) {\n if (this.overlayVisible) this.hide();else this.show(event);\n },\n show: function show(event) {\n this.overlayVisible = true;\n this.target = event.currentTarget;\n },\n hide: function hide() {\n this.overlayVisible = false;\n this.target = null;\n },\n onEnter: function onEnter(el) {\n DomHandler.addStyles(el, {\n position: 'absolute',\n top: '0',\n left: '0'\n });\n this.alignOverlay();\n this.bindOutsideClickListener();\n this.bindResizeListener();\n this.bindScrollListener();\n if (this.autoZIndex) {\n ZIndexUtils.set('menu', el, this.baseZIndex + this.$primevue.config.zIndex.menu);\n }\n if (this.popup) {\n DomHandler.focus(this.list);\n }\n this.$emit('show');\n },\n onLeave: function onLeave() {\n this.unbindOutsideClickListener();\n this.unbindResizeListener();\n this.unbindScrollListener();\n this.$emit('hide');\n },\n onAfterLeave: function onAfterLeave(el) {\n if (this.autoZIndex) {\n ZIndexUtils.clear(el);\n }\n },\n alignOverlay: function alignOverlay() {\n DomHandler.absolutePosition(this.container, this.target);\n var targetWidth = DomHandler.getOuterWidth(this.target);\n if (targetWidth > DomHandler.getOuterWidth(this.container)) {\n this.container.style.minWidth = DomHandler.getOuterWidth(this.target) + 'px';\n }\n },\n bindOutsideClickListener: function bindOutsideClickListener() {\n var _this = this;\n if (!this.outsideClickListener) {\n this.outsideClickListener = function (event) {\n var isOutsideContainer = _this.container && !_this.container.contains(event.target);\n var isOutsideTarget = !(_this.target && (_this.target === event.target || _this.target.contains(event.target)));\n if (_this.overlayVisible && isOutsideContainer && isOutsideTarget) {\n _this.hide();\n } else if (!_this.popup && isOutsideContainer && isOutsideTarget) {\n _this.focusedOptionIndex = -1;\n }\n };\n document.addEventListener('click', this.outsideClickListener);\n }\n },\n unbindOutsideClickListener: function unbindOutsideClickListener() {\n if (this.outsideClickListener) {\n document.removeEventListener('click', this.outsideClickListener);\n this.outsideClickListener = null;\n }\n },\n bindScrollListener: function bindScrollListener() {\n var _this2 = this;\n if (!this.scrollHandler) {\n this.scrollHandler = new ConnectedOverlayScrollHandler(this.target, function () {\n if (_this2.overlayVisible) {\n _this2.hide();\n }\n });\n }\n this.scrollHandler.bindScrollListener();\n },\n unbindScrollListener: function unbindScrollListener() {\n if (this.scrollHandler) {\n this.scrollHandler.unbindScrollListener();\n }\n },\n bindResizeListener: function bindResizeListener() {\n var _this3 = this;\n if (!this.resizeListener) {\n this.resizeListener = function () {\n if (_this3.overlayVisible && !DomHandler.isTouchDevice()) {\n _this3.hide();\n }\n };\n window.addEventListener('resize', this.resizeListener);\n }\n },\n unbindResizeListener: function unbindResizeListener() {\n if (this.resizeListener) {\n window.removeEventListener('resize', this.resizeListener);\n this.resizeListener = null;\n }\n },\n visible: function visible(item) {\n return typeof item.visible === 'function' ? item.visible() : item.visible !== false;\n },\n disabled: function disabled(item) {\n return typeof item.disabled === 'function' ? item.disabled() : item.disabled;\n },\n label: function label(item) {\n return typeof item.label === 'function' ? item.label() : item.label;\n },\n onOverlayClick: function onOverlayClick(event) {\n OverlayEventBus.emit('overlay-click', {\n originalEvent: event,\n target: this.target\n });\n },\n containerRef: function containerRef(el) {\n this.container = el;\n },\n listRef: function listRef(el) {\n this.list = el;\n }\n },\n computed: {\n focusedOptionId: function focusedOptionId() {\n return this.focusedOptionIndex !== -1 ? this.focusedOptionIndex : null;\n }\n },\n components: {\n PVMenuitem: script$1,\n Portal: Portal\n }\n};\n\nvar _hoisted_1 = [\"id\"];\nvar _hoisted_2 = [\"id\", \"tabindex\", \"aria-activedescendant\", \"aria-label\", \"aria-labelledby\"];\nvar _hoisted_3 = [\"id\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n var _component_PVMenuitem = resolveComponent(\"PVMenuitem\");\n var _component_Portal = resolveComponent(\"Portal\");\n return openBlock(), createBlock(_component_Portal, {\n appendTo: _ctx.appendTo,\n disabled: !_ctx.popup\n }, {\n \"default\": withCtx(function () {\n return [createVNode(Transition, mergeProps({\n name: \"p-connected-overlay\",\n onEnter: $options.onEnter,\n onLeave: $options.onLeave,\n onAfterLeave: $options.onAfterLeave\n }, _ctx.ptm('transition')), {\n \"default\": withCtx(function () {\n return [(_ctx.popup ? $data.overlayVisible : true) ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n ref: $options.containerRef,\n id: $data.id,\n \"class\": _ctx.cx('root'),\n onClick: _cache[3] || (_cache[3] = function () {\n return $options.onOverlayClick && $options.onOverlayClick.apply($options, arguments);\n })\n }, _ctx.ptmi('root')), [_ctx.$slots.start ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('start')\n }, _ctx.ptm('start')), [renderSlot(_ctx.$slots, \"start\")], 16)) : createCommentVNode(\"\", true), createElementVNode(\"ul\", mergeProps({\n ref: $options.listRef,\n id: $data.id + '_list',\n \"class\": _ctx.cx('menu'),\n role: \"menu\",\n tabindex: _ctx.tabindex,\n \"aria-activedescendant\": $data.focused ? $options.focusedOptionId : undefined,\n \"aria-label\": _ctx.ariaLabel,\n \"aria-labelledby\": _ctx.ariaLabelledby,\n onFocus: _cache[0] || (_cache[0] = function () {\n return $options.onListFocus && $options.onListFocus.apply($options, arguments);\n }),\n onBlur: _cache[1] || (_cache[1] = function () {\n return $options.onListBlur && $options.onListBlur.apply($options, arguments);\n }),\n onKeydown: _cache[2] || (_cache[2] = function () {\n return $options.onListKeyDown && $options.onListKeyDown.apply($options, arguments);\n })\n }, _ctx.ptm('menu')), [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.model, function (item, i) {\n return openBlock(), createElementBlock(Fragment, {\n key: $options.label(item) + i.toString()\n }, [item.items && $options.visible(item) && !item.separator ? (openBlock(), createElementBlock(Fragment, {\n key: 0\n }, [item.items ? (openBlock(), createElementBlock(\"li\", mergeProps({\n key: 0,\n id: $data.id + '_' + i,\n \"class\": [_ctx.cx('submenuHeader'), item[\"class\"]],\n style: item.style,\n role: \"none\"\n }, _ctx.ptm('submenuHeader')), [renderSlot(_ctx.$slots, \"submenuheader\", {\n item: item\n }, function () {\n return [createTextVNode(toDisplayString($options.label(item)), 1)];\n })], 16, _hoisted_3)) : createCommentVNode(\"\", true), (openBlock(true), createElementBlock(Fragment, null, renderList(item.items, function (child, j) {\n return openBlock(), createElementBlock(Fragment, {\n key: child.label + i + '_' + j\n }, [$options.visible(child) && !child.separator ? (openBlock(), createBlock(_component_PVMenuitem, {\n key: 0,\n id: $data.id + '_' + i + '_' + j,\n item: child,\n templates: _ctx.$slots,\n focusedOptionId: $options.focusedOptionId,\n unstyled: _ctx.unstyled,\n onItemClick: $options.itemClick,\n onItemMousemove: $options.itemMouseMove,\n pt: _ctx.pt\n }, null, 8, [\"id\", \"item\", \"templates\", \"focusedOptionId\", \"unstyled\", \"onItemClick\", \"onItemMousemove\", \"pt\"])) : $options.visible(child) && child.separator ? (openBlock(), createElementBlock(\"li\", mergeProps({\n key: 'separator' + i + j,\n \"class\": [_ctx.cx('separator'), item[\"class\"]],\n style: child.style,\n role: \"separator\"\n }, _ctx.ptm('separator')), null, 16)) : createCommentVNode(\"\", true)], 64);\n }), 128))], 64)) : $options.visible(item) && item.separator ? (openBlock(), createElementBlock(\"li\", mergeProps({\n key: 'separator' + i.toString(),\n \"class\": [_ctx.cx('separator'), item[\"class\"]],\n style: item.style,\n role: \"separator\"\n }, _ctx.ptm('separator')), null, 16)) : (openBlock(), createBlock(_component_PVMenuitem, {\n key: $options.label(item) + i.toString(),\n id: $data.id + '_' + i,\n item: item,\n index: i,\n templates: _ctx.$slots,\n focusedOptionId: $options.focusedOptionId,\n unstyled: _ctx.unstyled,\n onItemClick: $options.itemClick,\n onItemMousemove: $options.itemMouseMove,\n pt: _ctx.pt\n }, null, 8, [\"id\", \"item\", \"index\", \"templates\", \"focusedOptionId\", \"unstyled\", \"onItemClick\", \"onItemMousemove\", \"pt\"]))], 64);\n }), 128))], 16, _hoisted_2), _ctx.$slots.end ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 1,\n \"class\": _ctx.cx('end')\n }, _ctx.ptm('end')), [renderSlot(_ctx.$slots, \"end\")], 16)) : createCommentVNode(\"\", true)], 16, _hoisted_1)) : createCommentVNode(\"\", true)];\n }),\n _: 3\n }, 16, [\"onEnter\", \"onLeave\", \"onAfterLeave\"])];\n }),\n _: 3\n }, 8, [\"appendTo\", \"disabled\"]);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\nvar inlineStyles = {\n submenu: function submenu(_ref) {\n var instance = _ref.instance,\n processedItem = _ref.processedItem;\n return {\n display: instance.isItemActive(processedItem) ? 'block' : 'none'\n };\n }\n};\nvar classes = {\n root: function root(_ref2) {\n var instance = _ref2.instance;\n return ['p-menubar p-component', {\n 'p-menubar-mobile': instance.queryMatches,\n 'p-menubar-mobile-active': instance.mobileActive\n }];\n },\n start: 'p-menubar-start',\n button: 'p-menubar-button',\n menu: 'p-menubar-root-list',\n menuitem: function menuitem(_ref3) {\n var instance = _ref3.instance,\n processedItem = _ref3.processedItem;\n return ['p-menuitem', {\n 'p-menuitem-active p-highlight': instance.isItemActive(processedItem),\n 'p-focus': instance.isItemFocused(processedItem),\n 'p-disabled': instance.isItemDisabled(processedItem)\n }];\n },\n content: 'p-menuitem-content',\n action: 'p-menuitem-link',\n icon: 'p-menuitem-icon',\n label: 'p-menuitem-text',\n submenuIcon: 'p-submenu-icon',\n submenu: 'p-submenu-list',\n separator: 'p-menuitem-separator',\n end: 'p-menubar-end'\n};\nvar MenubarStyle = BaseStyle.extend({\n name: 'menubar',\n classes: classes,\n inlineStyles: inlineStyles\n});\n\nexport { MenubarStyle as default };\n","import BarsIcon from 'primevue/icons/bars';\nimport { ObjectUtils, UniqueComponentId, ZIndexUtils, DomHandler } from 'primevue/utils';\nimport BaseComponent from 'primevue/basecomponent';\nimport MenubarStyle from 'primevue/menubar/style';\nimport AngleDownIcon from 'primevue/icons/angledown';\nimport AngleRightIcon from 'primevue/icons/angleright';\nimport Ripple from 'primevue/ripple';\nimport { mergeProps, resolveComponent, resolveDirective, openBlock, createElementBlock, Fragment, renderList, createElementVNode, withDirectives, createBlock, resolveDynamicComponent, normalizeClass, createCommentVNode, toDisplayString, normalizeStyle, renderSlot, createVNode, normalizeProps, guardReactiveProps } from 'vue';\n\nvar script$2 = {\n name: 'BaseMenubar',\n \"extends\": BaseComponent,\n props: {\n model: {\n type: Array,\n \"default\": null\n },\n buttonProps: {\n type: null,\n \"default\": null\n },\n breakpoint: {\n type: String,\n \"default\": '960px'\n },\n ariaLabelledby: {\n type: String,\n \"default\": null\n },\n ariaLabel: {\n type: String,\n \"default\": null\n }\n },\n style: MenubarStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script$1 = {\n name: 'MenubarSub',\n hostName: 'Menubar',\n \"extends\": BaseComponent,\n emits: ['item-mouseenter', 'item-click', 'item-mousemove'],\n props: {\n items: {\n type: Array,\n \"default\": null\n },\n root: {\n type: Boolean,\n \"default\": false\n },\n popup: {\n type: Boolean,\n \"default\": false\n },\n mobileActive: {\n type: Boolean,\n \"default\": false\n },\n templates: {\n type: Object,\n \"default\": null\n },\n level: {\n type: Number,\n \"default\": 0\n },\n menuId: {\n type: String,\n \"default\": null\n },\n focusedItemId: {\n type: String,\n \"default\": null\n },\n activeItemPath: {\n type: Object,\n \"default\": null\n }\n },\n list: null,\n methods: {\n getItemId: function getItemId(processedItem) {\n return \"\".concat(this.menuId, \"_\").concat(processedItem.key);\n },\n getItemKey: function getItemKey(processedItem) {\n return this.getItemId(processedItem);\n },\n getItemProp: function getItemProp(processedItem, name, params) {\n return processedItem && processedItem.item ? ObjectUtils.getItemValue(processedItem.item[name], params) : undefined;\n },\n getItemLabel: function getItemLabel(processedItem) {\n return this.getItemProp(processedItem, 'label');\n },\n getItemLabelId: function getItemLabelId(processedItem) {\n return \"\".concat(this.menuId, \"_\").concat(processedItem.key, \"_label\");\n },\n getPTOptions: function getPTOptions(processedItem, index, key) {\n return this.ptm(key, {\n context: {\n item: processedItem,\n index: index,\n active: this.isItemActive(processedItem),\n focused: this.isItemFocused(processedItem),\n disabled: this.isItemDisabled(processedItem),\n level: this.level\n }\n });\n },\n isItemActive: function isItemActive(processedItem) {\n return this.activeItemPath.some(function (path) {\n return path.key === processedItem.key;\n });\n },\n isItemVisible: function isItemVisible(processedItem) {\n return this.getItemProp(processedItem, 'visible') !== false;\n },\n isItemDisabled: function isItemDisabled(processedItem) {\n return this.getItemProp(processedItem, 'disabled');\n },\n isItemFocused: function isItemFocused(processedItem) {\n return this.focusedItemId === this.getItemId(processedItem);\n },\n isItemGroup: function isItemGroup(processedItem) {\n return ObjectUtils.isNotEmpty(processedItem.items);\n },\n onItemClick: function onItemClick(event, processedItem) {\n this.getItemProp(processedItem, 'command', {\n originalEvent: event,\n item: processedItem.item\n });\n this.$emit('item-click', {\n originalEvent: event,\n processedItem: processedItem,\n isFocus: true\n });\n },\n onItemMouseEnter: function onItemMouseEnter(event, processedItem) {\n this.$emit('item-mouseenter', {\n originalEvent: event,\n processedItem: processedItem\n });\n },\n onItemMouseMove: function onItemMouseMove(event, processedItem) {\n this.$emit('item-mousemove', {\n originalEvent: event,\n processedItem: processedItem\n });\n },\n getAriaSetSize: function getAriaSetSize() {\n var _this = this;\n return this.items.filter(function (processedItem) {\n return _this.isItemVisible(processedItem) && !_this.getItemProp(processedItem, 'separator');\n }).length;\n },\n getAriaPosInset: function getAriaPosInset(index) {\n var _this2 = this;\n return index - this.items.slice(0, index).filter(function (processedItem) {\n return _this2.isItemVisible(processedItem) && _this2.getItemProp(processedItem, 'separator');\n }).length + 1;\n },\n getMenuItemProps: function getMenuItemProps(processedItem, index) {\n return {\n action: mergeProps({\n \"class\": this.cx('action'),\n tabindex: -1,\n 'aria-hidden': true\n }, this.getPTOptions(processedItem, index, 'action')),\n icon: mergeProps({\n \"class\": [this.cx('icon'), this.getItemProp(processedItem, 'icon')]\n }, this.getPTOptions(processedItem, index, 'icon')),\n label: mergeProps({\n \"class\": this.cx('label')\n }, this.getPTOptions(processedItem, index, 'label')),\n submenuicon: mergeProps({\n \"class\": this.cx('submenuIcon')\n }, this.getPTOptions(processedItem, index, 'submenuIcon'))\n };\n }\n },\n components: {\n AngleRightIcon: AngleRightIcon,\n AngleDownIcon: AngleDownIcon\n },\n directives: {\n ripple: Ripple\n }\n};\n\nvar _hoisted_1$1 = [\"id\", \"aria-label\", \"aria-disabled\", \"aria-expanded\", \"aria-haspopup\", \"aria-level\", \"aria-setsize\", \"aria-posinset\", \"data-p-highlight\", \"data-p-focused\", \"data-p-disabled\"];\nvar _hoisted_2 = [\"onClick\", \"onMouseenter\", \"onMousemove\"];\nvar _hoisted_3 = [\"href\", \"target\"];\nvar _hoisted_4 = [\"id\"];\nvar _hoisted_5 = [\"id\"];\nfunction render$1(_ctx, _cache, $props, $setup, $data, $options) {\n var _component_MenubarSub = resolveComponent(\"MenubarSub\", true);\n var _directive_ripple = resolveDirective(\"ripple\");\n return openBlock(), createElementBlock(\"ul\", mergeProps({\n \"class\": $props.level === 0 ? _ctx.cx('menu') : _ctx.cx('submenu')\n }, $props.level === 0 ? _ctx.ptm('menu') : _ctx.ptm('submenu')), [(openBlock(true), createElementBlock(Fragment, null, renderList($props.items, function (processedItem, index) {\n return openBlock(), createElementBlock(Fragment, {\n key: $options.getItemKey(processedItem)\n }, [$options.isItemVisible(processedItem) && !$options.getItemProp(processedItem, 'separator') ? (openBlock(), createElementBlock(\"li\", mergeProps({\n key: 0,\n id: $options.getItemId(processedItem),\n style: $options.getItemProp(processedItem, 'style'),\n \"class\": [_ctx.cx('menuitem', {\n processedItem: processedItem\n }), $options.getItemProp(processedItem, 'class')],\n role: \"menuitem\",\n \"aria-label\": $options.getItemLabel(processedItem),\n \"aria-disabled\": $options.isItemDisabled(processedItem) || undefined,\n \"aria-expanded\": $options.isItemGroup(processedItem) ? $options.isItemActive(processedItem) : undefined,\n \"aria-haspopup\": $options.isItemGroup(processedItem) && !$options.getItemProp(processedItem, 'to') ? 'menu' : undefined,\n \"aria-level\": $props.level + 1,\n \"aria-setsize\": $options.getAriaSetSize(),\n \"aria-posinset\": $options.getAriaPosInset(index)\n }, $options.getPTOptions(processedItem, index, 'menuitem'), {\n \"data-p-highlight\": $options.isItemActive(processedItem),\n \"data-p-focused\": $options.isItemFocused(processedItem),\n \"data-p-disabled\": $options.isItemDisabled(processedItem)\n }), [createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('content'),\n onClick: function onClick($event) {\n return $options.onItemClick($event, processedItem);\n },\n onMouseenter: function onMouseenter($event) {\n return $options.onItemMouseEnter($event, processedItem);\n },\n onMousemove: function onMousemove($event) {\n return $options.onItemMouseMove($event, processedItem);\n }\n }, $options.getPTOptions(processedItem, index, 'content')), [!$props.templates.item ? withDirectives((openBlock(), createElementBlock(\"a\", mergeProps({\n key: 0,\n href: $options.getItemProp(processedItem, 'url'),\n \"class\": _ctx.cx('action'),\n target: $options.getItemProp(processedItem, 'target'),\n tabindex: \"-1\",\n \"aria-hidden\": \"true\"\n }, $options.getPTOptions(processedItem, index, 'action')), [$props.templates.itemicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.itemicon), {\n key: 0,\n item: processedItem.item,\n \"class\": normalizeClass(_ctx.cx('icon'))\n }, null, 8, [\"item\", \"class\"])) : $options.getItemProp(processedItem, 'icon') ? (openBlock(), createElementBlock(\"span\", mergeProps({\n key: 1,\n \"class\": [_ctx.cx('icon'), $options.getItemProp(processedItem, 'icon')]\n }, $options.getPTOptions(processedItem, index, 'icon')), null, 16)) : createCommentVNode(\"\", true), createElementVNode(\"span\", mergeProps({\n id: $options.getItemLabelId(processedItem),\n \"class\": _ctx.cx('label')\n }, $options.getPTOptions(processedItem, index, 'label')), toDisplayString($options.getItemLabel(processedItem)), 17, _hoisted_4), $options.getItemProp(processedItem, 'items') ? (openBlock(), createElementBlock(Fragment, {\n key: 2\n }, [$props.templates.submenuicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.submenuicon), {\n key: 0,\n root: $props.root,\n active: $options.isItemActive(processedItem),\n \"class\": normalizeClass(_ctx.cx('submenuIcon'))\n }, null, 8, [\"root\", \"active\", \"class\"])) : (openBlock(), createBlock(resolveDynamicComponent($props.root ? 'AngleDownIcon' : 'AngleRightIcon'), mergeProps({\n key: 1,\n \"class\": _ctx.cx('submenuIcon')\n }, $options.getPTOptions(processedItem, index, 'submenuIcon')), null, 16, [\"class\"]))], 64)) : createCommentVNode(\"\", true)], 16, _hoisted_3)), [[_directive_ripple]]) : (openBlock(), createBlock(resolveDynamicComponent($props.templates.item), {\n key: 1,\n item: processedItem.item,\n root: $props.root,\n hasSubmenu: $options.getItemProp(processedItem, 'items'),\n label: $options.getItemLabel(processedItem),\n props: $options.getMenuItemProps(processedItem, index)\n }, null, 8, [\"item\", \"root\", \"hasSubmenu\", \"label\", \"props\"]))], 16, _hoisted_2), $options.isItemVisible(processedItem) && $options.isItemGroup(processedItem) ? (openBlock(), createBlock(_component_MenubarSub, {\n key: 0,\n menuId: $props.menuId,\n role: \"menu\",\n style: normalizeStyle(_ctx.sx('submenu', true, {\n processedItem: processedItem\n })),\n focusedItemId: $props.focusedItemId,\n items: processedItem.items,\n mobileActive: $props.mobileActive,\n activeItemPath: $props.activeItemPath,\n templates: $props.templates,\n level: $props.level + 1,\n \"aria-labelledby\": $options.getItemLabelId(processedItem),\n pt: _ctx.pt,\n unstyled: _ctx.unstyled,\n onItemClick: _cache[0] || (_cache[0] = function ($event) {\n return _ctx.$emit('item-click', $event);\n }),\n onItemMouseenter: _cache[1] || (_cache[1] = function ($event) {\n return _ctx.$emit('item-mouseenter', $event);\n }),\n onItemMousemove: _cache[2] || (_cache[2] = function ($event) {\n return _ctx.$emit('item-mousemove', $event);\n })\n }, null, 8, [\"menuId\", \"style\", \"focusedItemId\", \"items\", \"mobileActive\", \"activeItemPath\", \"templates\", \"level\", \"aria-labelledby\", \"pt\", \"unstyled\"])) : createCommentVNode(\"\", true)], 16, _hoisted_1$1)) : createCommentVNode(\"\", true), $options.isItemVisible(processedItem) && $options.getItemProp(processedItem, 'separator') ? (openBlock(), createElementBlock(\"li\", mergeProps({\n key: 1,\n id: $options.getItemId(processedItem),\n \"class\": [_ctx.cx('separator'), $options.getItemProp(processedItem, 'class')],\n style: $options.getItemProp(processedItem, 'style'),\n role: \"separator\"\n }, _ctx.ptm('separator')), null, 16, _hoisted_5)) : createCommentVNode(\"\", true)], 64);\n }), 128))], 16);\n}\n\nscript$1.render = render$1;\n\nvar script = {\n name: 'Menubar',\n \"extends\": script$2,\n inheritAttrs: false,\n emits: ['focus', 'blur'],\n matchMediaListener: null,\n data: function data() {\n return {\n id: this.$attrs.id,\n mobileActive: false,\n focused: false,\n focusedItemInfo: {\n index: -1,\n level: 0,\n parentKey: ''\n },\n activeItemPath: [],\n dirty: false,\n query: null,\n queryMatches: false\n };\n },\n watch: {\n '$attrs.id': function $attrsId(newValue) {\n this.id = newValue || UniqueComponentId();\n },\n activeItemPath: function activeItemPath(newPath) {\n if (ObjectUtils.isNotEmpty(newPath)) {\n this.bindOutsideClickListener();\n this.bindResizeListener();\n } else {\n this.unbindOutsideClickListener();\n this.unbindResizeListener();\n }\n }\n },\n outsideClickListener: null,\n container: null,\n menubar: null,\n mounted: function mounted() {\n this.id = this.id || UniqueComponentId();\n this.bindMatchMediaListener();\n },\n beforeUnmount: function beforeUnmount() {\n this.mobileActive = false;\n this.unbindOutsideClickListener();\n this.unbindResizeListener();\n this.unbindMatchMediaListener();\n if (this.container) {\n ZIndexUtils.clear(this.container);\n }\n this.container = null;\n },\n methods: {\n getItemProp: function getItemProp(item, name) {\n return item ? ObjectUtils.getItemValue(item[name]) : undefined;\n },\n getItemLabel: function getItemLabel(item) {\n return this.getItemProp(item, 'label');\n },\n isItemDisabled: function isItemDisabled(item) {\n return this.getItemProp(item, 'disabled');\n },\n isItemVisible: function isItemVisible(item) {\n return this.getItemProp(item, 'visible') !== false;\n },\n isItemGroup: function isItemGroup(item) {\n return ObjectUtils.isNotEmpty(this.getItemProp(item, 'items'));\n },\n isItemSeparator: function isItemSeparator(item) {\n return this.getItemProp(item, 'separator');\n },\n getProccessedItemLabel: function getProccessedItemLabel(processedItem) {\n return processedItem ? this.getItemLabel(processedItem.item) : undefined;\n },\n isProccessedItemGroup: function isProccessedItemGroup(processedItem) {\n return processedItem && ObjectUtils.isNotEmpty(processedItem.items);\n },\n toggle: function toggle(event) {\n var _this = this;\n if (this.mobileActive) {\n this.mobileActive = false;\n ZIndexUtils.clear(this.menubar);\n this.hide();\n } else {\n this.mobileActive = true;\n ZIndexUtils.set('menu', this.menubar, this.$primevue.config.zIndex.menu);\n setTimeout(function () {\n _this.show();\n }, 1);\n }\n this.bindOutsideClickListener();\n event.preventDefault();\n },\n show: function show() {\n DomHandler.focus(this.menubar);\n },\n hide: function hide(event, isFocus) {\n var _this2 = this;\n if (this.mobileActive) {\n this.mobileActive = false;\n setTimeout(function () {\n DomHandler.focus(_this2.$refs.menubutton);\n }, 0);\n }\n this.activeItemPath = [];\n this.focusedItemInfo = {\n index: -1,\n level: 0,\n parentKey: ''\n };\n isFocus && DomHandler.focus(this.menubar);\n this.dirty = false;\n },\n onFocus: function onFocus(event) {\n this.focused = true;\n if (!this.popup) {\n this.focusedItemInfo = this.focusedItemInfo.index !== -1 ? this.focusedItemInfo : {\n index: this.findFirstFocusedItemIndex(),\n level: 0,\n parentKey: ''\n };\n }\n this.$emit('focus', event);\n },\n onBlur: function onBlur(event) {\n this.focused = false;\n this.focusedItemInfo = {\n index: -1,\n level: 0,\n parentKey: ''\n };\n this.searchValue = '';\n this.dirty = false;\n this.$emit('blur', event);\n },\n onKeyDown: function onKeyDown(event) {\n var metaKey = event.metaKey || event.ctrlKey;\n switch (event.code) {\n case 'ArrowDown':\n this.onArrowDownKey(event);\n break;\n case 'ArrowUp':\n this.onArrowUpKey(event);\n break;\n case 'ArrowLeft':\n this.onArrowLeftKey(event);\n break;\n case 'ArrowRight':\n this.onArrowRightKey(event);\n break;\n case 'Home':\n this.onHomeKey(event);\n break;\n case 'End':\n this.onEndKey(event);\n break;\n case 'Space':\n this.onSpaceKey(event);\n break;\n case 'Enter':\n case 'NumpadEnter':\n this.onEnterKey(event);\n break;\n case 'Escape':\n this.onEscapeKey(event);\n break;\n case 'Tab':\n this.onTabKey(event);\n break;\n case 'PageDown':\n case 'PageUp':\n case 'Backspace':\n case 'ShiftLeft':\n case 'ShiftRight':\n //NOOP\n break;\n default:\n if (!metaKey && ObjectUtils.isPrintableCharacter(event.key)) {\n this.searchItems(event, event.key);\n }\n break;\n }\n },\n onItemChange: function onItemChange(event) {\n var processedItem = event.processedItem,\n isFocus = event.isFocus;\n if (ObjectUtils.isEmpty(processedItem)) return;\n var index = processedItem.index,\n key = processedItem.key,\n level = processedItem.level,\n parentKey = processedItem.parentKey,\n items = processedItem.items;\n var grouped = ObjectUtils.isNotEmpty(items);\n var activeItemPath = this.activeItemPath.filter(function (p) {\n return p.parentKey !== parentKey && p.parentKey !== key;\n });\n grouped && activeItemPath.push(processedItem);\n this.focusedItemInfo = {\n index: index,\n level: level,\n parentKey: parentKey\n };\n this.activeItemPath = activeItemPath;\n grouped && (this.dirty = true);\n isFocus && DomHandler.focus(this.menubar);\n },\n onItemClick: function onItemClick(event) {\n var originalEvent = event.originalEvent,\n processedItem = event.processedItem;\n var grouped = this.isProccessedItemGroup(processedItem);\n var root = ObjectUtils.isEmpty(processedItem.parent);\n var selected = this.isSelected(processedItem);\n if (selected) {\n var index = processedItem.index,\n key = processedItem.key,\n level = processedItem.level,\n parentKey = processedItem.parentKey;\n this.activeItemPath = this.activeItemPath.filter(function (p) {\n return key !== p.key && key.startsWith(p.key);\n });\n this.focusedItemInfo = {\n index: index,\n level: level,\n parentKey: parentKey\n };\n this.dirty = !root;\n DomHandler.focus(this.menubar);\n } else {\n if (grouped) {\n this.onItemChange(event);\n } else {\n var rootProcessedItem = root ? processedItem : this.activeItemPath.find(function (p) {\n return p.parentKey === '';\n });\n this.hide(originalEvent);\n this.changeFocusedItemIndex(originalEvent, rootProcessedItem ? rootProcessedItem.index : -1);\n this.mobileActive = false;\n DomHandler.focus(this.menubar);\n }\n }\n },\n onItemMouseEnter: function onItemMouseEnter(event) {\n if (!this.mobileActive && this.dirty) {\n this.onItemChange(event);\n }\n },\n onItemMouseMove: function onItemMouseMove(event) {\n if (this.focused) {\n this.changeFocusedItemIndex(event, event.processedItem.index);\n }\n },\n menuButtonClick: function menuButtonClick(event) {\n this.toggle(event);\n },\n menuButtonKeydown: function menuButtonKeydown(event) {\n (event.code === 'Enter' || event.code === 'NumpadEnter' || event.code === 'Space') && this.menuButtonClick(event);\n },\n onArrowDownKey: function onArrowDownKey(event) {\n var processedItem = this.visibleItems[this.focusedItemInfo.index];\n var root = processedItem ? ObjectUtils.isEmpty(processedItem.parent) : null;\n if (root) {\n var grouped = this.isProccessedItemGroup(processedItem);\n if (grouped) {\n this.onItemChange({\n originalEvent: event,\n processedItem: processedItem\n });\n this.focusedItemInfo = {\n index: -1,\n parentKey: processedItem.key\n };\n this.onArrowRightKey(event);\n }\n } else {\n var itemIndex = this.focusedItemInfo.index !== -1 ? this.findNextItemIndex(this.focusedItemInfo.index) : this.findFirstFocusedItemIndex();\n this.changeFocusedItemIndex(event, itemIndex);\n }\n event.preventDefault();\n },\n onArrowUpKey: function onArrowUpKey(event) {\n var _this3 = this;\n var processedItem = this.visibleItems[this.focusedItemInfo.index];\n var root = ObjectUtils.isEmpty(processedItem.parent);\n if (root) {\n var grouped = this.isProccessedItemGroup(processedItem);\n if (grouped) {\n this.onItemChange({\n originalEvent: event,\n processedItem: processedItem\n });\n this.focusedItemInfo = {\n index: -1,\n parentKey: processedItem.key\n };\n var itemIndex = this.findLastItemIndex();\n this.changeFocusedItemIndex(event, itemIndex);\n }\n } else {\n var parentItem = this.activeItemPath.find(function (p) {\n return p.key === processedItem.parentKey;\n });\n if (this.focusedItemInfo.index === 0) {\n this.focusedItemInfo = {\n index: -1,\n parentKey: parentItem ? parentItem.parentKey : ''\n };\n this.searchValue = '';\n this.onArrowLeftKey(event);\n this.activeItemPath = this.activeItemPath.filter(function (p) {\n return p.parentKey !== _this3.focusedItemInfo.parentKey;\n });\n } else {\n var _itemIndex = this.focusedItemInfo.index !== -1 ? this.findPrevItemIndex(this.focusedItemInfo.index) : this.findLastFocusedItemIndex();\n this.changeFocusedItemIndex(event, _itemIndex);\n }\n }\n event.preventDefault();\n },\n onArrowLeftKey: function onArrowLeftKey(event) {\n var _this4 = this;\n var processedItem = this.visibleItems[this.focusedItemInfo.index];\n var parentItem = processedItem ? this.activeItemPath.find(function (p) {\n return p.key === processedItem.parentKey;\n }) : null;\n if (parentItem) {\n this.onItemChange({\n originalEvent: event,\n processedItem: parentItem\n });\n this.activeItemPath = this.activeItemPath.filter(function (p) {\n return p.parentKey !== _this4.focusedItemInfo.parentKey;\n });\n event.preventDefault();\n } else {\n var itemIndex = this.focusedItemInfo.index !== -1 ? this.findPrevItemIndex(this.focusedItemInfo.index) : this.findLastFocusedItemIndex();\n this.changeFocusedItemIndex(event, itemIndex);\n event.preventDefault();\n }\n },\n onArrowRightKey: function onArrowRightKey(event) {\n var processedItem = this.visibleItems[this.focusedItemInfo.index];\n var parentItem = processedItem ? this.activeItemPath.find(function (p) {\n return p.key === processedItem.parentKey;\n }) : null;\n if (parentItem) {\n var grouped = this.isProccessedItemGroup(processedItem);\n if (grouped) {\n this.onItemChange({\n originalEvent: event,\n processedItem: processedItem\n });\n this.focusedItemInfo = {\n index: -1,\n parentKey: processedItem.key\n };\n this.onArrowDownKey(event);\n }\n } else {\n var itemIndex = this.focusedItemInfo.index !== -1 ? this.findNextItemIndex(this.focusedItemInfo.index) : this.findFirstFocusedItemIndex();\n this.changeFocusedItemIndex(event, itemIndex);\n event.preventDefault();\n }\n },\n onHomeKey: function onHomeKey(event) {\n this.changeFocusedItemIndex(event, this.findFirstItemIndex());\n event.preventDefault();\n },\n onEndKey: function onEndKey(event) {\n this.changeFocusedItemIndex(event, this.findLastItemIndex());\n event.preventDefault();\n },\n onEnterKey: function onEnterKey(event) {\n if (this.focusedItemInfo.index !== -1) {\n var element = DomHandler.findSingle(this.menubar, \"li[id=\\\"\".concat(\"\".concat(this.focusedItemId), \"\\\"]\"));\n var anchorElement = element && DomHandler.findSingle(element, 'a[data-pc-section=\"action\"]');\n anchorElement ? anchorElement.click() : element && element.click();\n var processedItem = this.visibleItems[this.focusedItemInfo.index];\n var grouped = this.isProccessedItemGroup(processedItem);\n !grouped && (this.focusedItemInfo.index = this.findFirstFocusedItemIndex());\n }\n event.preventDefault();\n },\n onSpaceKey: function onSpaceKey(event) {\n this.onEnterKey(event);\n },\n onEscapeKey: function onEscapeKey(event) {\n if (this.focusedItemInfo.level !== 0) {\n var _focusedItemInfo = this.focusedItemInfo;\n this.hide(event, false);\n this.focusedItemInfo = {\n index: Number(_focusedItemInfo.parentKey.split('_')[0]),\n level: 0,\n parentKey: ''\n };\n }\n event.preventDefault();\n },\n onTabKey: function onTabKey(event) {\n if (this.focusedItemInfo.index !== -1) {\n var processedItem = this.visibleItems[this.focusedItemInfo.index];\n var grouped = this.isProccessedItemGroup(processedItem);\n !grouped && this.onItemChange({\n originalEvent: event,\n processedItem: processedItem\n });\n }\n this.hide();\n },\n bindOutsideClickListener: function bindOutsideClickListener() {\n var _this5 = this;\n if (!this.outsideClickListener) {\n this.outsideClickListener = function (event) {\n var isOutsideContainer = _this5.container && !_this5.container.contains(event.target);\n var isOutsideTarget = !(_this5.target && (_this5.target === event.target || _this5.target.contains(event.target)));\n if (isOutsideContainer && isOutsideTarget) {\n _this5.hide();\n }\n };\n document.addEventListener('click', this.outsideClickListener);\n }\n },\n unbindOutsideClickListener: function unbindOutsideClickListener() {\n if (this.outsideClickListener) {\n document.removeEventListener('click', this.outsideClickListener);\n this.outsideClickListener = null;\n }\n },\n bindResizeListener: function bindResizeListener() {\n var _this6 = this;\n if (!this.resizeListener) {\n this.resizeListener = function (event) {\n if (!DomHandler.isTouchDevice()) {\n _this6.hide(event, true);\n }\n _this6.mobileActive = false;\n };\n window.addEventListener('resize', this.resizeListener);\n }\n },\n unbindResizeListener: function unbindResizeListener() {\n if (this.resizeListener) {\n window.removeEventListener('resize', this.resizeListener);\n this.resizeListener = null;\n }\n },\n bindMatchMediaListener: function bindMatchMediaListener() {\n var _this7 = this;\n if (!this.matchMediaListener) {\n var query = matchMedia(\"(max-width: \".concat(this.breakpoint, \")\"));\n this.query = query;\n this.queryMatches = query.matches;\n this.matchMediaListener = function () {\n _this7.queryMatches = query.matches;\n _this7.mobileActive = false;\n };\n this.query.addEventListener('change', this.matchMediaListener);\n }\n },\n unbindMatchMediaListener: function unbindMatchMediaListener() {\n if (this.matchMediaListener) {\n this.query.removeEventListener('change', this.matchMediaListener);\n this.matchMediaListener = null;\n }\n },\n isItemMatched: function isItemMatched(processedItem) {\n var _this$getProccessedIt;\n return this.isValidItem(processedItem) && ((_this$getProccessedIt = this.getProccessedItemLabel(processedItem)) === null || _this$getProccessedIt === void 0 ? void 0 : _this$getProccessedIt.toLocaleLowerCase().startsWith(this.searchValue.toLocaleLowerCase()));\n },\n isValidItem: function isValidItem(processedItem) {\n return !!processedItem && !this.isItemDisabled(processedItem.item) && !this.isItemSeparator(processedItem.item) && this.isItemVisible(processedItem.item);\n },\n isValidSelectedItem: function isValidSelectedItem(processedItem) {\n return this.isValidItem(processedItem) && this.isSelected(processedItem);\n },\n isSelected: function isSelected(processedItem) {\n return this.activeItemPath.some(function (p) {\n return p.key === processedItem.key;\n });\n },\n findFirstItemIndex: function findFirstItemIndex() {\n var _this8 = this;\n return this.visibleItems.findIndex(function (processedItem) {\n return _this8.isValidItem(processedItem);\n });\n },\n findLastItemIndex: function findLastItemIndex() {\n var _this9 = this;\n return ObjectUtils.findLastIndex(this.visibleItems, function (processedItem) {\n return _this9.isValidItem(processedItem);\n });\n },\n findNextItemIndex: function findNextItemIndex(index) {\n var _this10 = this;\n var matchedItemIndex = index < this.visibleItems.length - 1 ? this.visibleItems.slice(index + 1).findIndex(function (processedItem) {\n return _this10.isValidItem(processedItem);\n }) : -1;\n return matchedItemIndex > -1 ? matchedItemIndex + index + 1 : index;\n },\n findPrevItemIndex: function findPrevItemIndex(index) {\n var _this11 = this;\n var matchedItemIndex = index > 0 ? ObjectUtils.findLastIndex(this.visibleItems.slice(0, index), function (processedItem) {\n return _this11.isValidItem(processedItem);\n }) : -1;\n return matchedItemIndex > -1 ? matchedItemIndex : index;\n },\n findSelectedItemIndex: function findSelectedItemIndex() {\n var _this12 = this;\n return this.visibleItems.findIndex(function (processedItem) {\n return _this12.isValidSelectedItem(processedItem);\n });\n },\n findFirstFocusedItemIndex: function findFirstFocusedItemIndex() {\n var selectedIndex = this.findSelectedItemIndex();\n return selectedIndex < 0 ? this.findFirstItemIndex() : selectedIndex;\n },\n findLastFocusedItemIndex: function findLastFocusedItemIndex() {\n var selectedIndex = this.findSelectedItemIndex();\n return selectedIndex < 0 ? this.findLastItemIndex() : selectedIndex;\n },\n searchItems: function searchItems(event, _char) {\n var _this13 = this;\n this.searchValue = (this.searchValue || '') + _char;\n var itemIndex = -1;\n var matched = false;\n if (this.focusedItemInfo.index !== -1) {\n itemIndex = this.visibleItems.slice(this.focusedItemInfo.index).findIndex(function (processedItem) {\n return _this13.isItemMatched(processedItem);\n });\n itemIndex = itemIndex === -1 ? this.visibleItems.slice(0, this.focusedItemInfo.index).findIndex(function (processedItem) {\n return _this13.isItemMatched(processedItem);\n }) : itemIndex + this.focusedItemInfo.index;\n } else {\n itemIndex = this.visibleItems.findIndex(function (processedItem) {\n return _this13.isItemMatched(processedItem);\n });\n }\n if (itemIndex !== -1) {\n matched = true;\n }\n if (itemIndex === -1 && this.focusedItemInfo.index === -1) {\n itemIndex = this.findFirstFocusedItemIndex();\n }\n if (itemIndex !== -1) {\n this.changeFocusedItemIndex(event, itemIndex);\n }\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n this.searchTimeout = setTimeout(function () {\n _this13.searchValue = '';\n _this13.searchTimeout = null;\n }, 500);\n return matched;\n },\n changeFocusedItemIndex: function changeFocusedItemIndex(event, index) {\n if (this.focusedItemInfo.index !== index) {\n this.focusedItemInfo.index = index;\n this.scrollInView();\n }\n },\n scrollInView: function scrollInView() {\n var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : -1;\n var id = index !== -1 ? \"\".concat(this.id, \"_\").concat(index) : this.focusedItemId;\n var element = DomHandler.findSingle(this.menubar, \"li[id=\\\"\".concat(id, \"\\\"]\"));\n if (element) {\n element.scrollIntoView && element.scrollIntoView({\n block: 'nearest',\n inline: 'start'\n });\n }\n },\n createProcessedItems: function createProcessedItems(items) {\n var _this14 = this;\n var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var parent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var parentKey = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n var processedItems = [];\n items && items.forEach(function (item, index) {\n var key = (parentKey !== '' ? parentKey + '_' : '') + index;\n var newItem = {\n item: item,\n index: index,\n level: level,\n key: key,\n parent: parent,\n parentKey: parentKey\n };\n newItem['items'] = _this14.createProcessedItems(item.items, level + 1, newItem, key);\n processedItems.push(newItem);\n });\n return processedItems;\n },\n containerRef: function containerRef(el) {\n this.container = el;\n },\n menubarRef: function menubarRef(el) {\n this.menubar = el ? el.$el : undefined;\n }\n },\n computed: {\n processedItems: function processedItems() {\n return this.createProcessedItems(this.model || []);\n },\n visibleItems: function visibleItems() {\n var _this15 = this;\n var processedItem = this.activeItemPath.find(function (p) {\n return p.key === _this15.focusedItemInfo.parentKey;\n });\n return processedItem ? processedItem.items : this.processedItems;\n },\n focusedItemId: function focusedItemId() {\n return this.focusedItemInfo.index !== -1 ? \"\".concat(this.id).concat(ObjectUtils.isNotEmpty(this.focusedItemInfo.parentKey) ? '_' + this.focusedItemInfo.parentKey : '', \"_\").concat(this.focusedItemInfo.index) : null;\n }\n },\n components: {\n MenubarSub: script$1,\n BarsIcon: BarsIcon\n }\n};\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar _hoisted_1 = [\"aria-haspopup\", \"aria-expanded\", \"aria-controls\", \"aria-label\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n var _component_BarsIcon = resolveComponent(\"BarsIcon\");\n var _component_MenubarSub = resolveComponent(\"MenubarSub\");\n return openBlock(), createElementBlock(\"div\", mergeProps({\n ref: $options.containerRef,\n \"class\": _ctx.cx('root')\n }, _ctx.ptmi('root')), [_ctx.$slots.start ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('start')\n }, _ctx.ptm('start')), [renderSlot(_ctx.$slots, \"start\")], 16)) : createCommentVNode(\"\", true), renderSlot(_ctx.$slots, \"menubutton\", {\n id: $data.id,\n \"class\": normalizeClass(_ctx.cx('button')),\n toggleCallback: function toggleCallback(event) {\n return $options.menuButtonClick(event);\n }\n }, function () {\n var _ctx$$primevue$config;\n return [_ctx.model && _ctx.model.length > 0 ? (openBlock(), createElementBlock(\"a\", mergeProps({\n key: 0,\n ref: \"menubutton\",\n role: \"button\",\n tabindex: \"0\",\n \"class\": _ctx.cx('button'),\n \"aria-haspopup\": _ctx.model.length && _ctx.model.length > 0 ? true : false,\n \"aria-expanded\": $data.mobileActive,\n \"aria-controls\": $data.id,\n \"aria-label\": (_ctx$$primevue$config = _ctx.$primevue.config.locale.aria) === null || _ctx$$primevue$config === void 0 ? void 0 : _ctx$$primevue$config.navigation,\n onClick: _cache[0] || (_cache[0] = function ($event) {\n return $options.menuButtonClick($event);\n }),\n onKeydown: _cache[1] || (_cache[1] = function ($event) {\n return $options.menuButtonKeydown($event);\n })\n }, _objectSpread(_objectSpread({}, _ctx.buttonProps), _ctx.ptm('button'))), [renderSlot(_ctx.$slots, \"menubuttonicon\", {}, function () {\n return [createVNode(_component_BarsIcon, normalizeProps(guardReactiveProps(_ctx.ptm('menubuttonicon'))), null, 16)];\n })], 16, _hoisted_1)) : createCommentVNode(\"\", true)];\n }), createVNode(_component_MenubarSub, {\n ref: $options.menubarRef,\n id: $data.id,\n role: \"menubar\",\n items: $options.processedItems,\n templates: _ctx.$slots,\n root: true,\n mobileActive: $data.mobileActive,\n tabindex: \"0\",\n \"aria-activedescendant\": $data.focused ? $options.focusedItemId : undefined,\n menuId: $data.id,\n focusedItemId: $data.focused ? $options.focusedItemId : undefined,\n activeItemPath: $data.activeItemPath,\n level: 0,\n \"aria-labelledby\": _ctx.ariaLabelledby,\n \"aria-label\": _ctx.ariaLabel,\n pt: _ctx.pt,\n unstyled: _ctx.unstyled,\n onFocus: $options.onFocus,\n onBlur: $options.onBlur,\n onKeydown: $options.onKeyDown,\n onItemClick: $options.onItemClick,\n onItemMouseenter: $options.onItemMouseEnter,\n onItemMousemove: $options.onItemMouseMove\n }, null, 8, [\"id\", \"items\", \"templates\", \"mobileActive\", \"aria-activedescendant\", \"menuId\", \"focusedItemId\", \"activeItemPath\", \"aria-labelledby\", \"aria-label\", \"pt\", \"unstyled\", \"onFocus\", \"onBlur\", \"onKeydown\", \"onItemClick\", \"onItemMouseenter\", \"onItemMousemove\"]), _ctx.$slots.end ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 1,\n \"class\": _ctx.cx('end')\n }, _ctx.ptm('end')), [renderSlot(_ctx.$slots, \"end\")], 16)) : createCommentVNode(\"\", true)], 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\nvar classes = {\n root: function root(_ref) {\n var props = _ref.props;\n return ['p-tag p-component', {\n 'p-tag-info': props.severity === 'info',\n 'p-tag-success': props.severity === 'success',\n 'p-tag-warning': props.severity === 'warning',\n 'p-tag-danger': props.severity === 'danger',\n 'p-tag-secondary': props.severity === 'secondary',\n 'p-tag-contrast': props.severity === 'contrast',\n 'p-tag-rounded': props.rounded\n }];\n },\n icon: 'p-tag-icon',\n value: 'p-tag-value'\n};\nvar TagStyle = BaseStyle.extend({\n name: 'tag',\n classes: classes\n});\n\nexport { TagStyle as default };\n","import BaseComponent from 'primevue/basecomponent';\nimport TagStyle from 'primevue/tag/style';\nimport { openBlock, createElementBlock, mergeProps, createBlock, resolveDynamicComponent, createCommentVNode, renderSlot, createElementVNode, toDisplayString } from 'vue';\n\nvar script$1 = {\n name: 'BaseTag',\n \"extends\": BaseComponent,\n props: {\n value: null,\n severity: null,\n rounded: Boolean,\n icon: String\n },\n style: TagStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script = {\n name: 'Tag',\n \"extends\": script$1,\n inheritAttrs: false\n};\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"span\", mergeProps({\n \"class\": _ctx.cx('root')\n }, _ctx.ptmi('root')), [_ctx.$slots.icon ? (openBlock(), createBlock(resolveDynamicComponent(_ctx.$slots.icon), mergeProps({\n key: 0,\n \"class\": _ctx.cx('icon')\n }, _ctx.ptm('icon')), null, 16, [\"class\"])) : _ctx.icon ? (openBlock(), createElementBlock(\"span\", mergeProps({\n key: 1,\n \"class\": [_ctx.cx('icon'), _ctx.icon]\n }, _ctx.ptm('icon')), null, 16)) : createCommentVNode(\"\", true), _ctx.value || _ctx.$slots[\"default\"] ? renderSlot(_ctx.$slots, \"default\", {\n key: 2\n }, function () {\n return [createElementVNode(\"span\", mergeProps({\n \"class\": _ctx.cx('value')\n }, _ctx.ptm('value')), toDisplayString(_ctx.value), 17)];\n }) : createCommentVNode(\"\", true)], 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\nimport { ObjectUtils } from 'primevue/utils';\n\nvar inlineStyles = {\n root: {\n position: 'relative'\n }\n};\nvar classes = {\n root: function root(_ref) {\n var instance = _ref.instance,\n props = _ref.props;\n return ['p-autocomplete p-component p-inputwrapper', {\n 'p-disabled': props.disabled,\n 'p-invalid': props.invalid,\n 'p-focus': instance.focused,\n 'p-autocomplete-dd': props.dropdown,\n 'p-autocomplete-multiple': props.multiple,\n 'p-inputwrapper-filled': props.modelValue || ObjectUtils.isNotEmpty(instance.inputValue),\n 'p-inputwrapper-focus': instance.focused,\n 'p-overlay-open': instance.overlayVisible\n }];\n },\n input: function input(_ref2) {\n var props = _ref2.props,\n instance = _ref2.instance;\n return ['p-autocomplete-input p-inputtext p-component', {\n 'p-autocomplete-dd-input': props.dropdown,\n 'p-variant-filled': props.variant ? props.variant === 'filled' : instance.$primevue.config.inputStyle === 'filled'\n }];\n },\n container: function container(_ref3) {\n var props = _ref3.props,\n instance = _ref3.instance;\n return ['p-autocomplete-multiple-container p-component p-inputtext', {\n 'p-variant-filled': props.variant ? props.variant === 'filled' : instance.$primevue.config.inputStyle === 'filled'\n }];\n },\n token: function token(_ref4) {\n var instance = _ref4.instance,\n i = _ref4.i;\n return ['p-autocomplete-token', {\n 'p-focus': instance.focusedMultipleOptionIndex === i\n }];\n },\n tokenLabel: 'p-autocomplete-token-label',\n removeTokenIcon: 'p-autocomplete-token-icon',\n inputToken: 'p-autocomplete-input-token',\n loadingIcon: 'p-autocomplete-loader',\n dropdownButton: 'p-autocomplete-dropdown',\n panel: function panel(_ref5) {\n _ref5.props;\n var instance = _ref5.instance;\n return ['p-autocomplete-panel p-component', {\n 'p-ripple-disabled': instance.$primevue.config.ripple === false\n }];\n },\n list: 'p-autocomplete-items',\n itemGroup: 'p-autocomplete-item-group',\n item: function item(_ref6) {\n var instance = _ref6.instance,\n option = _ref6.option,\n i = _ref6.i,\n getItemOptions = _ref6.getItemOptions;\n return ['p-autocomplete-item', {\n 'p-highlight': instance.isSelected(option),\n 'p-focus': instance.focusedOptionIndex === instance.getOptionIndex(i, getItemOptions),\n 'p-disabled': instance.isOptionDisabled(option)\n }];\n },\n emptyMessage: 'p-autocomplete-empty-message'\n};\nvar AutoCompleteStyle = BaseStyle.extend({\n name: 'autocomplete',\n classes: classes,\n inlineStyles: inlineStyles\n});\n\nexport { AutoCompleteStyle as default };\n","import Button from 'primevue/button';\nimport ChevronDownIcon from 'primevue/icons/chevrondown';\nimport SpinnerIcon from 'primevue/icons/spinner';\nimport TimesCircleIcon from 'primevue/icons/timescircle';\nimport OverlayEventBus from 'primevue/overlayeventbus';\nimport Portal from 'primevue/portal';\nimport Ripple from 'primevue/ripple';\nimport { UniqueComponentId, ZIndexUtils, ObjectUtils, DomHandler, ConnectedOverlayScrollHandler } from 'primevue/utils';\nimport VirtualScroller from 'primevue/virtualscroller';\nimport AutoCompleteStyle from 'primevue/autocomplete/style';\nimport BaseComponent from 'primevue/basecomponent';\nimport { resolveComponent, resolveDirective, openBlock, createElementBlock, mergeProps, createCommentVNode, Fragment, renderList, renderSlot, createElementVNode, toDisplayString, normalizeClass, createBlock, resolveDynamicComponent, withCtx, createVNode, Transition, createSlots, createTextVNode, withDirectives } from 'vue';\n\nvar script$1 = {\n name: 'BaseAutoComplete',\n \"extends\": BaseComponent,\n props: {\n modelValue: null,\n suggestions: {\n type: Array,\n \"default\": null\n },\n field: {\n // TODO: Deprecated since v3.16.0\n type: [String, Function],\n \"default\": null\n },\n optionLabel: null,\n optionDisabled: null,\n optionGroupLabel: null,\n optionGroupChildren: null,\n scrollHeight: {\n type: String,\n \"default\": '200px'\n },\n dropdown: {\n type: Boolean,\n \"default\": false\n },\n dropdownMode: {\n type: String,\n \"default\": 'blank'\n },\n autoHighlight: {\n // TODO: Deprecated since v3.16.0. Use selectOnFocus property instead.\n type: Boolean,\n \"default\": false\n },\n multiple: {\n type: Boolean,\n \"default\": false\n },\n loading: {\n type: Boolean,\n \"default\": false\n },\n variant: {\n type: String,\n \"default\": null\n },\n invalid: {\n type: Boolean,\n \"default\": false\n },\n disabled: {\n type: Boolean,\n \"default\": false\n },\n placeholder: {\n type: String,\n \"default\": null\n },\n dataKey: {\n type: String,\n \"default\": null\n },\n minLength: {\n type: Number,\n \"default\": 1\n },\n delay: {\n type: Number,\n \"default\": 300\n },\n appendTo: {\n type: [String, Object],\n \"default\": 'body'\n },\n forceSelection: {\n type: Boolean,\n \"default\": false\n },\n completeOnFocus: {\n type: Boolean,\n \"default\": false\n },\n inputId: {\n type: String,\n \"default\": null\n },\n inputStyle: {\n type: Object,\n \"default\": null\n },\n inputClass: {\n type: [String, Object],\n \"default\": null\n },\n inputProps: {\n type: null,\n \"default\": null\n },\n panelStyle: {\n type: Object,\n \"default\": null\n },\n panelClass: {\n type: [String, Object],\n \"default\": null\n },\n panelProps: {\n type: null,\n \"default\": null\n },\n dropdownIcon: {\n type: String,\n \"default\": undefined\n },\n dropdownClass: {\n type: [String, Object],\n \"default\": null\n },\n loadingIcon: {\n type: String,\n \"default\": undefined\n },\n removeTokenIcon: {\n type: String,\n \"default\": undefined\n },\n virtualScrollerOptions: {\n type: Object,\n \"default\": null\n },\n autoOptionFocus: {\n type: Boolean,\n \"default\": false\n },\n selectOnFocus: {\n type: Boolean,\n \"default\": false\n },\n focusOnHover: {\n type: Boolean,\n \"default\": true\n },\n searchLocale: {\n type: String,\n \"default\": undefined\n },\n searchMessage: {\n type: String,\n \"default\": null\n },\n selectionMessage: {\n type: String,\n \"default\": null\n },\n emptySelectionMessage: {\n type: String,\n \"default\": null\n },\n emptySearchMessage: {\n type: String,\n \"default\": null\n },\n tabindex: {\n type: Number,\n \"default\": 0\n },\n ariaLabel: {\n type: String,\n \"default\": null\n },\n ariaLabelledby: {\n type: String,\n \"default\": null\n }\n },\n style: AutoCompleteStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nfunction _typeof$1(o) { \"@babel/helpers - typeof\"; return _typeof$1 = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof$1(o); }\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nvar script = {\n name: 'AutoComplete',\n \"extends\": script$1,\n inheritAttrs: false,\n emits: ['update:modelValue', 'change', 'focus', 'blur', 'item-select', 'item-unselect', 'dropdown-click', 'clear', 'complete', 'before-show', 'before-hide', 'show', 'hide'],\n outsideClickListener: null,\n resizeListener: null,\n scrollHandler: null,\n overlay: null,\n virtualScroller: null,\n searchTimeout: null,\n dirty: false,\n data: function data() {\n return {\n id: this.$attrs.id,\n clicked: false,\n focused: false,\n focusedOptionIndex: -1,\n focusedMultipleOptionIndex: -1,\n overlayVisible: false,\n searching: false\n };\n },\n watch: {\n '$attrs.id': function $attrsId(newValue) {\n this.id = newValue || UniqueComponentId();\n },\n suggestions: function suggestions() {\n if (this.searching) {\n this.show();\n this.focusedOptionIndex = this.overlayVisible && this.autoOptionFocus ? this.findFirstFocusedOptionIndex() : -1;\n this.searching = false;\n }\n this.autoUpdateModel();\n }\n },\n mounted: function mounted() {\n this.id = this.id || UniqueComponentId();\n this.autoUpdateModel();\n },\n updated: function updated() {\n if (this.overlayVisible) {\n this.alignOverlay();\n }\n },\n beforeUnmount: function beforeUnmount() {\n this.unbindOutsideClickListener();\n this.unbindResizeListener();\n if (this.scrollHandler) {\n this.scrollHandler.destroy();\n this.scrollHandler = null;\n }\n if (this.overlay) {\n ZIndexUtils.clear(this.overlay);\n this.overlay = null;\n }\n },\n methods: {\n getOptionIndex: function getOptionIndex(index, fn) {\n return this.virtualScrollerDisabled ? index : fn && fn(index)['index'];\n },\n getOptionLabel: function getOptionLabel(option) {\n return this.field || this.optionLabel ? ObjectUtils.resolveFieldData(option, this.field || this.optionLabel) : option;\n },\n getOptionValue: function getOptionValue(option) {\n return option; // TODO: The 'optionValue' properties can be added.\n },\n getOptionRenderKey: function getOptionRenderKey(option, index) {\n return (this.dataKey ? ObjectUtils.resolveFieldData(option, this.dataKey) : this.getOptionLabel(option)) + '_' + index;\n },\n getPTOptions: function getPTOptions(option, itemOptions, index, key) {\n return this.ptm(key, {\n context: {\n selected: this.isSelected(option),\n focused: this.focusedOptionIndex === this.getOptionIndex(index, itemOptions),\n disabled: this.isOptionDisabled(option)\n }\n });\n },\n isOptionDisabled: function isOptionDisabled(option) {\n return this.optionDisabled ? ObjectUtils.resolveFieldData(option, this.optionDisabled) : false;\n },\n isOptionGroup: function isOptionGroup(option) {\n return this.optionGroupLabel && option.optionGroup && option.group;\n },\n getOptionGroupLabel: function getOptionGroupLabel(optionGroup) {\n return ObjectUtils.resolveFieldData(optionGroup, this.optionGroupLabel);\n },\n getOptionGroupChildren: function getOptionGroupChildren(optionGroup) {\n return ObjectUtils.resolveFieldData(optionGroup, this.optionGroupChildren);\n },\n getAriaPosInset: function getAriaPosInset(index) {\n var _this = this;\n return (this.optionGroupLabel ? index - this.visibleOptions.slice(0, index).filter(function (option) {\n return _this.isOptionGroup(option);\n }).length : index) + 1;\n },\n show: function show(isFocus) {\n this.$emit('before-show');\n this.dirty = true;\n this.overlayVisible = true;\n this.focusedOptionIndex = this.focusedOptionIndex !== -1 ? this.focusedOptionIndex : this.autoOptionFocus ? this.findFirstFocusedOptionIndex() : -1;\n isFocus && DomHandler.focus(this.$refs.focusInput);\n },\n hide: function hide(isFocus) {\n var _this2 = this;\n var _hide = function _hide() {\n _this2.$emit('before-hide');\n _this2.dirty = isFocus;\n _this2.overlayVisible = false;\n _this2.clicked = false;\n _this2.focusedOptionIndex = -1;\n isFocus && DomHandler.focus(_this2.$refs.focusInput);\n };\n setTimeout(function () {\n _hide();\n }, 0); // For ScreenReaders\n },\n onFocus: function onFocus(event) {\n if (this.disabled) {\n // For ScreenReaders\n return;\n }\n if (!this.dirty && this.completeOnFocus) {\n this.search(event, event.target.value, 'focus');\n }\n this.dirty = true;\n this.focused = true;\n if (this.overlayVisible) {\n this.focusedOptionIndex = this.focusedOptionIndex !== -1 ? this.focusedOptionIndex : this.overlayVisible && this.autoOptionFocus ? this.findFirstFocusedOptionIndex() : -1;\n this.scrollInView(this.focusedOptionIndex);\n }\n this.$emit('focus', event);\n },\n onBlur: function onBlur(event) {\n this.dirty = false;\n this.focused = false;\n this.focusedOptionIndex = -1;\n this.$emit('blur', event);\n },\n onKeyDown: function onKeyDown(event) {\n if (this.disabled) {\n event.preventDefault();\n return;\n }\n switch (event.code) {\n case 'ArrowDown':\n this.onArrowDownKey(event);\n break;\n case 'ArrowUp':\n this.onArrowUpKey(event);\n break;\n case 'ArrowLeft':\n this.onArrowLeftKey(event);\n break;\n case 'ArrowRight':\n this.onArrowRightKey(event);\n break;\n case 'Home':\n this.onHomeKey(event);\n break;\n case 'End':\n this.onEndKey(event);\n break;\n case 'PageDown':\n this.onPageDownKey(event);\n break;\n case 'PageUp':\n this.onPageUpKey(event);\n break;\n case 'Enter':\n case 'NumpadEnter':\n this.onEnterKey(event);\n break;\n case 'Escape':\n this.onEscapeKey(event);\n break;\n case 'Tab':\n this.onTabKey(event);\n break;\n case 'Backspace':\n this.onBackspaceKey(event);\n break;\n }\n this.clicked = false;\n },\n onInput: function onInput(event) {\n var _this3 = this;\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n var query = event.target.value;\n if (!this.multiple) {\n this.updateModel(event, query);\n }\n if (query.length === 0) {\n this.hide();\n this.$emit('clear');\n } else {\n if (query.length >= this.minLength) {\n this.focusedOptionIndex = -1;\n this.searchTimeout = setTimeout(function () {\n _this3.search(event, query, 'input');\n }, this.delay);\n } else {\n this.hide();\n }\n }\n },\n onChange: function onChange(event) {\n var _this4 = this;\n if (this.forceSelection) {\n var valid = false;\n\n // when forceSelection is on, prevent called twice onOptionSelect()\n if (this.visibleOptions && !this.multiple) {\n var matchedValue = this.visibleOptions.find(function (option) {\n return _this4.isOptionMatched(option, _this4.$refs.focusInput.value || '');\n });\n if (matchedValue !== undefined) {\n valid = true;\n !this.isSelected(matchedValue) && this.onOptionSelect(event, matchedValue);\n }\n }\n if (!valid) {\n this.$refs.focusInput.value = '';\n this.$emit('clear');\n !this.multiple && this.updateModel(event, null);\n }\n }\n },\n onMultipleContainerFocus: function onMultipleContainerFocus() {\n if (this.disabled) {\n // For ScreenReaders\n return;\n }\n this.focused = true;\n },\n onMultipleContainerBlur: function onMultipleContainerBlur() {\n this.focusedMultipleOptionIndex = -1;\n this.focused = false;\n },\n onMultipleContainerKeyDown: function onMultipleContainerKeyDown(event) {\n if (this.disabled) {\n event.preventDefault();\n return;\n }\n switch (event.code) {\n case 'ArrowLeft':\n this.onArrowLeftKeyOnMultiple(event);\n break;\n case 'ArrowRight':\n this.onArrowRightKeyOnMultiple(event);\n break;\n case 'Backspace':\n this.onBackspaceKeyOnMultiple(event);\n break;\n }\n },\n onContainerClick: function onContainerClick(event) {\n this.clicked = true;\n if (this.disabled || this.searching || this.loading || this.isInputClicked(event) || this.isDropdownClicked(event)) {\n return;\n }\n if (!this.overlay || !this.overlay.contains(event.target)) {\n DomHandler.focus(this.$refs.focusInput);\n }\n },\n onDropdownClick: function onDropdownClick(event) {\n var query = undefined;\n if (this.overlayVisible) {\n this.hide(true);\n } else {\n DomHandler.focus(this.$refs.focusInput);\n query = this.$refs.focusInput.value;\n if (this.dropdownMode === 'blank') this.search(event, '', 'dropdown');else if (this.dropdownMode === 'current') this.search(event, query, 'dropdown');\n }\n this.$emit('dropdown-click', {\n originalEvent: event,\n query: query\n });\n },\n onOptionSelect: function onOptionSelect(event, option) {\n var isHide = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : true;\n var value = this.getOptionValue(option);\n if (this.multiple) {\n this.$refs.focusInput.value = '';\n if (!this.isSelected(option)) {\n this.updateModel(event, [].concat(_toConsumableArray(this.modelValue || []), [value]));\n }\n } else {\n this.updateModel(event, value);\n }\n this.$emit('item-select', {\n originalEvent: event,\n value: option\n });\n isHide && this.hide(true);\n },\n onOptionMouseMove: function onOptionMouseMove(event, index) {\n if (this.focusOnHover) {\n this.changeFocusedOptionIndex(event, index);\n }\n },\n onOverlayClick: function onOverlayClick(event) {\n OverlayEventBus.emit('overlay-click', {\n originalEvent: event,\n target: this.$el\n });\n },\n onOverlayKeyDown: function onOverlayKeyDown(event) {\n switch (event.code) {\n case 'Escape':\n this.onEscapeKey(event);\n break;\n }\n },\n onArrowDownKey: function onArrowDownKey(event) {\n if (!this.overlayVisible) {\n return;\n }\n var optionIndex = this.focusedOptionIndex !== -1 ? this.findNextOptionIndex(this.focusedOptionIndex) : this.clicked ? this.findFirstOptionIndex() : this.findFirstFocusedOptionIndex();\n this.changeFocusedOptionIndex(event, optionIndex);\n event.preventDefault();\n },\n onArrowUpKey: function onArrowUpKey(event) {\n if (!this.overlayVisible) {\n return;\n }\n if (event.altKey) {\n if (this.focusedOptionIndex !== -1) {\n this.onOptionSelect(event, this.visibleOptions[this.focusedOptionIndex]);\n }\n this.overlayVisible && this.hide();\n event.preventDefault();\n } else {\n var optionIndex = this.focusedOptionIndex !== -1 ? this.findPrevOptionIndex(this.focusedOptionIndex) : this.clicked ? this.findLastOptionIndex() : this.findLastFocusedOptionIndex();\n this.changeFocusedOptionIndex(event, optionIndex);\n event.preventDefault();\n }\n },\n onArrowLeftKey: function onArrowLeftKey(event) {\n var target = event.currentTarget;\n this.focusedOptionIndex = -1;\n if (this.multiple) {\n if (ObjectUtils.isEmpty(target.value) && this.hasSelectedOption) {\n DomHandler.focus(this.$refs.multiContainer);\n this.focusedMultipleOptionIndex = this.modelValue.length;\n } else {\n event.stopPropagation(); // To prevent onArrowLeftKeyOnMultiple method\n }\n }\n },\n onArrowRightKey: function onArrowRightKey(event) {\n this.focusedOptionIndex = -1;\n this.multiple && event.stopPropagation(); // To prevent onArrowRightKeyOnMultiple method\n },\n onHomeKey: function onHomeKey(event) {\n var currentTarget = event.currentTarget;\n var len = currentTarget.value.length;\n currentTarget.setSelectionRange(0, event.shiftKey ? len : 0);\n this.focusedOptionIndex = -1;\n event.preventDefault();\n },\n onEndKey: function onEndKey(event) {\n var currentTarget = event.currentTarget;\n var len = currentTarget.value.length;\n currentTarget.setSelectionRange(event.shiftKey ? 0 : len, len);\n this.focusedOptionIndex = -1;\n event.preventDefault();\n },\n onPageUpKey: function onPageUpKey(event) {\n this.scrollInView(0);\n event.preventDefault();\n },\n onPageDownKey: function onPageDownKey(event) {\n this.scrollInView(this.visibleOptions.length - 1);\n event.preventDefault();\n },\n onEnterKey: function onEnterKey(event) {\n if (!this.overlayVisible) {\n this.focusedOptionIndex = -1; // reset\n this.onArrowDownKey(event);\n } else {\n if (this.focusedOptionIndex !== -1) {\n this.onOptionSelect(event, this.visibleOptions[this.focusedOptionIndex]);\n }\n this.hide();\n }\n },\n onEscapeKey: function onEscapeKey(event) {\n this.overlayVisible && this.hide(true);\n event.preventDefault();\n },\n onTabKey: function onTabKey(event) {\n if (this.focusedOptionIndex !== -1) {\n this.onOptionSelect(event, this.visibleOptions[this.focusedOptionIndex]);\n }\n this.overlayVisible && this.hide();\n },\n onBackspaceKey: function onBackspaceKey(event) {\n if (this.multiple) {\n if (ObjectUtils.isNotEmpty(this.modelValue) && !this.$refs.focusInput.value) {\n var removedValue = this.modelValue[this.modelValue.length - 1];\n var newValue = this.modelValue.slice(0, -1);\n this.$emit('update:modelValue', newValue);\n this.$emit('item-unselect', {\n originalEvent: event,\n value: removedValue\n });\n }\n event.stopPropagation(); // To prevent onBackspaceKeyOnMultiple method\n }\n },\n onArrowLeftKeyOnMultiple: function onArrowLeftKeyOnMultiple() {\n this.focusedMultipleOptionIndex = this.focusedMultipleOptionIndex < 1 ? 0 : this.focusedMultipleOptionIndex - 1;\n },\n onArrowRightKeyOnMultiple: function onArrowRightKeyOnMultiple() {\n this.focusedMultipleOptionIndex++;\n if (this.focusedMultipleOptionIndex > this.modelValue.length - 1) {\n this.focusedMultipleOptionIndex = -1;\n DomHandler.focus(this.$refs.focusInput);\n }\n },\n onBackspaceKeyOnMultiple: function onBackspaceKeyOnMultiple(event) {\n if (this.focusedMultipleOptionIndex !== -1) {\n this.removeOption(event, this.focusedMultipleOptionIndex);\n }\n },\n onOverlayEnter: function onOverlayEnter(el) {\n ZIndexUtils.set('overlay', el, this.$primevue.config.zIndex.overlay);\n DomHandler.addStyles(el, {\n position: 'absolute',\n top: '0',\n left: '0'\n });\n this.alignOverlay();\n },\n onOverlayAfterEnter: function onOverlayAfterEnter() {\n this.bindOutsideClickListener();\n this.bindScrollListener();\n this.bindResizeListener();\n this.$emit('show');\n },\n onOverlayLeave: function onOverlayLeave() {\n this.unbindOutsideClickListener();\n this.unbindScrollListener();\n this.unbindResizeListener();\n this.$emit('hide');\n this.overlay = null;\n },\n onOverlayAfterLeave: function onOverlayAfterLeave(el) {\n ZIndexUtils.clear(el);\n },\n alignOverlay: function alignOverlay() {\n var target = this.multiple ? this.$refs.multiContainer : this.$refs.focusInput;\n if (this.appendTo === 'self') {\n DomHandler.relativePosition(this.overlay, target);\n } else {\n this.overlay.style.minWidth = DomHandler.getOuterWidth(target) + 'px';\n DomHandler.absolutePosition(this.overlay, target);\n }\n },\n bindOutsideClickListener: function bindOutsideClickListener() {\n var _this5 = this;\n if (!this.outsideClickListener) {\n this.outsideClickListener = function (event) {\n if (_this5.overlayVisible && _this5.overlay && _this5.isOutsideClicked(event)) {\n _this5.hide();\n }\n };\n document.addEventListener('click', this.outsideClickListener);\n }\n },\n unbindOutsideClickListener: function unbindOutsideClickListener() {\n if (this.outsideClickListener) {\n document.removeEventListener('click', this.outsideClickListener);\n this.outsideClickListener = null;\n }\n },\n bindScrollListener: function bindScrollListener() {\n var _this6 = this;\n if (!this.scrollHandler) {\n this.scrollHandler = new ConnectedOverlayScrollHandler(this.$refs.container, function () {\n if (_this6.overlayVisible) {\n _this6.hide();\n }\n });\n }\n this.scrollHandler.bindScrollListener();\n },\n unbindScrollListener: function unbindScrollListener() {\n if (this.scrollHandler) {\n this.scrollHandler.unbindScrollListener();\n }\n },\n bindResizeListener: function bindResizeListener() {\n var _this7 = this;\n if (!this.resizeListener) {\n this.resizeListener = function () {\n if (_this7.overlayVisible && !DomHandler.isTouchDevice()) {\n _this7.hide();\n }\n };\n window.addEventListener('resize', this.resizeListener);\n }\n },\n unbindResizeListener: function unbindResizeListener() {\n if (this.resizeListener) {\n window.removeEventListener('resize', this.resizeListener);\n this.resizeListener = null;\n }\n },\n isOutsideClicked: function isOutsideClicked(event) {\n return !this.overlay.contains(event.target) && !this.isInputClicked(event) && !this.isDropdownClicked(event);\n },\n isInputClicked: function isInputClicked(event) {\n if (this.multiple) return event.target === this.$refs.multiContainer || this.$refs.multiContainer.contains(event.target);else return event.target === this.$refs.focusInput;\n },\n isDropdownClicked: function isDropdownClicked(event) {\n return this.$refs.dropdownButton ? event.target === this.$refs.dropdownButton || this.$refs.dropdownButton.$el.contains(event.target) : false;\n },\n isOptionMatched: function isOptionMatched(option, value) {\n var _this$getOptionLabel;\n return this.isValidOption(option) && ((_this$getOptionLabel = this.getOptionLabel(option)) === null || _this$getOptionLabel === void 0 ? void 0 : _this$getOptionLabel.toLocaleLowerCase(this.searchLocale)) === value.toLocaleLowerCase(this.searchLocale);\n },\n isValidOption: function isValidOption(option) {\n return ObjectUtils.isNotEmpty(option) && !(this.isOptionDisabled(option) || this.isOptionGroup(option));\n },\n isValidSelectedOption: function isValidSelectedOption(option) {\n return this.isValidOption(option) && this.isSelected(option);\n },\n isEquals: function isEquals(value1, value2) {\n return ObjectUtils.equals(value1, value2, this.equalityKey);\n },\n isSelected: function isSelected(option) {\n var _this8 = this;\n var optionValue = this.getOptionValue(option);\n return this.multiple ? (this.modelValue || []).some(function (value) {\n return _this8.isEquals(value, optionValue);\n }) : this.isEquals(this.modelValue, this.getOptionValue(option));\n },\n findFirstOptionIndex: function findFirstOptionIndex() {\n var _this9 = this;\n return this.visibleOptions.findIndex(function (option) {\n return _this9.isValidOption(option);\n });\n },\n findLastOptionIndex: function findLastOptionIndex() {\n var _this10 = this;\n return ObjectUtils.findLastIndex(this.visibleOptions, function (option) {\n return _this10.isValidOption(option);\n });\n },\n findNextOptionIndex: function findNextOptionIndex(index) {\n var _this11 = this;\n var matchedOptionIndex = index < this.visibleOptions.length - 1 ? this.visibleOptions.slice(index + 1).findIndex(function (option) {\n return _this11.isValidOption(option);\n }) : -1;\n return matchedOptionIndex > -1 ? matchedOptionIndex + index + 1 : index;\n },\n findPrevOptionIndex: function findPrevOptionIndex(index) {\n var _this12 = this;\n var matchedOptionIndex = index > 0 ? ObjectUtils.findLastIndex(this.visibleOptions.slice(0, index), function (option) {\n return _this12.isValidOption(option);\n }) : -1;\n return matchedOptionIndex > -1 ? matchedOptionIndex : index;\n },\n findSelectedOptionIndex: function findSelectedOptionIndex() {\n var _this13 = this;\n return this.hasSelectedOption ? this.visibleOptions.findIndex(function (option) {\n return _this13.isValidSelectedOption(option);\n }) : -1;\n },\n findFirstFocusedOptionIndex: function findFirstFocusedOptionIndex() {\n var selectedIndex = this.findSelectedOptionIndex();\n return selectedIndex < 0 ? this.findFirstOptionIndex() : selectedIndex;\n },\n findLastFocusedOptionIndex: function findLastFocusedOptionIndex() {\n var selectedIndex = this.findSelectedOptionIndex();\n return selectedIndex < 0 ? this.findLastOptionIndex() : selectedIndex;\n },\n search: function search(event, query, source) {\n //allow empty string but not undefined or null\n if (query === undefined || query === null) {\n return;\n }\n\n //do not search blank values on input change\n if (source === 'input' && query.trim().length === 0) {\n return;\n }\n this.searching = true;\n this.$emit('complete', {\n originalEvent: event,\n query: query\n });\n },\n removeOption: function removeOption(event, index) {\n var _this14 = this;\n var removedOption = this.modelValue[index];\n var value = this.modelValue.filter(function (_, i) {\n return i !== index;\n }).map(function (option) {\n return _this14.getOptionValue(option);\n });\n this.updateModel(event, value);\n this.$emit('item-unselect', {\n originalEvent: event,\n value: removedOption\n });\n this.dirty = true;\n DomHandler.focus(this.$refs.focusInput);\n },\n changeFocusedOptionIndex: function changeFocusedOptionIndex(event, index) {\n if (this.focusedOptionIndex !== index) {\n this.focusedOptionIndex = index;\n this.scrollInView();\n if (this.selectOnFocus || this.autoHighlight) {\n this.onOptionSelect(event, this.visibleOptions[index], false);\n }\n }\n },\n scrollInView: function scrollInView() {\n var _this15 = this;\n var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : -1;\n this.$nextTick(function () {\n var id = index !== -1 ? \"\".concat(_this15.id, \"_\").concat(index) : _this15.focusedOptionId;\n var element = DomHandler.findSingle(_this15.list, \"li[id=\\\"\".concat(id, \"\\\"]\"));\n if (element) {\n element.scrollIntoView && element.scrollIntoView({\n block: 'nearest',\n inline: 'start'\n });\n } else if (!_this15.virtualScrollerDisabled) {\n _this15.virtualScroller && _this15.virtualScroller.scrollToIndex(index !== -1 ? index : _this15.focusedOptionIndex);\n }\n });\n },\n autoUpdateModel: function autoUpdateModel() {\n if ((this.selectOnFocus || this.autoHighlight) && this.autoOptionFocus && !this.hasSelectedOption) {\n this.focusedOptionIndex = this.findFirstFocusedOptionIndex();\n this.onOptionSelect(null, this.visibleOptions[this.focusedOptionIndex], false);\n }\n },\n updateModel: function updateModel(event, value) {\n this.$emit('update:modelValue', value);\n this.$emit('change', {\n originalEvent: event,\n value: value\n });\n },\n flatOptions: function flatOptions(options) {\n var _this16 = this;\n return (options || []).reduce(function (result, option, index) {\n result.push({\n optionGroup: option,\n group: true,\n index: index\n });\n var optionGroupChildren = _this16.getOptionGroupChildren(option);\n optionGroupChildren && optionGroupChildren.forEach(function (o) {\n return result.push(o);\n });\n return result;\n }, []);\n },\n overlayRef: function overlayRef(el) {\n this.overlay = el;\n },\n listRef: function listRef(el, contentRef) {\n this.list = el;\n contentRef && contentRef(el); // For VirtualScroller\n },\n virtualScrollerRef: function virtualScrollerRef(el) {\n this.virtualScroller = el;\n }\n },\n computed: {\n visibleOptions: function visibleOptions() {\n return this.optionGroupLabel ? this.flatOptions(this.suggestions) : this.suggestions || [];\n },\n inputValue: function inputValue() {\n if (ObjectUtils.isNotEmpty(this.modelValue)) {\n if (_typeof$1(this.modelValue) === 'object') {\n var label = this.getOptionLabel(this.modelValue);\n return label != null ? label : this.modelValue;\n } else {\n return this.modelValue;\n }\n } else {\n return '';\n }\n },\n hasSelectedOption: function hasSelectedOption() {\n return ObjectUtils.isNotEmpty(this.modelValue);\n },\n equalityKey: function equalityKey() {\n return this.dataKey; // TODO: The 'optionValue' properties can be added.\n },\n searchResultMessageText: function searchResultMessageText() {\n return ObjectUtils.isNotEmpty(this.visibleOptions) && this.overlayVisible ? this.searchMessageText.replaceAll('{0}', this.visibleOptions.length) : this.emptySearchMessageText;\n },\n searchMessageText: function searchMessageText() {\n return this.searchMessage || this.$primevue.config.locale.searchMessage || '';\n },\n emptySearchMessageText: function emptySearchMessageText() {\n return this.emptySearchMessage || this.$primevue.config.locale.emptySearchMessage || '';\n },\n selectionMessageText: function selectionMessageText() {\n return this.selectionMessage || this.$primevue.config.locale.selectionMessage || '';\n },\n emptySelectionMessageText: function emptySelectionMessageText() {\n return this.emptySelectionMessage || this.$primevue.config.locale.emptySelectionMessage || '';\n },\n selectedMessageText: function selectedMessageText() {\n return this.hasSelectedOption ? this.selectionMessageText.replaceAll('{0}', this.multiple ? this.modelValue.length : '1') : this.emptySelectionMessageText;\n },\n listAriaLabel: function listAriaLabel() {\n return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.listLabel : undefined;\n },\n focusedOptionId: function focusedOptionId() {\n return this.focusedOptionIndex !== -1 ? \"\".concat(this.id, \"_\").concat(this.focusedOptionIndex) : null;\n },\n focusedMultipleOptionId: function focusedMultipleOptionId() {\n return this.focusedMultipleOptionIndex !== -1 ? \"\".concat(this.id, \"_multiple_option_\").concat(this.focusedMultipleOptionIndex) : null;\n },\n ariaSetSize: function ariaSetSize() {\n var _this17 = this;\n return this.visibleOptions.filter(function (option) {\n return !_this17.isOptionGroup(option);\n }).length;\n },\n virtualScrollerDisabled: function virtualScrollerDisabled() {\n return !this.virtualScrollerOptions;\n }\n },\n components: {\n Button: Button,\n VirtualScroller: VirtualScroller,\n Portal: Portal,\n ChevronDownIcon: ChevronDownIcon,\n SpinnerIcon: SpinnerIcon,\n TimesCircleIcon: TimesCircleIcon\n },\n directives: {\n ripple: Ripple\n }\n};\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar _hoisted_1 = [\"id\", \"value\", \"placeholder\", \"tabindex\", \"disabled\", \"aria-label\", \"aria-labelledby\", \"aria-expanded\", \"aria-controls\", \"aria-activedescendant\", \"aria-invalid\"];\nvar _hoisted_2 = [\"aria-activedescendant\"];\nvar _hoisted_3 = [\"id\", \"aria-label\", \"aria-setsize\", \"aria-posinset\"];\nvar _hoisted_4 = [\"id\", \"placeholder\", \"tabindex\", \"disabled\", \"aria-label\", \"aria-labelledby\", \"aria-expanded\", \"aria-controls\", \"aria-activedescendant\", \"aria-invalid\"];\nvar _hoisted_5 = [\"id\", \"aria-label\"];\nvar _hoisted_6 = [\"id\"];\nvar _hoisted_7 = [\"id\", \"aria-label\", \"aria-selected\", \"aria-disabled\", \"aria-setsize\", \"aria-posinset\", \"onClick\", \"onMousemove\", \"data-p-highlight\", \"data-p-focus\", \"data-p-disabled\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n var _component_SpinnerIcon = resolveComponent(\"SpinnerIcon\");\n var _component_Button = resolveComponent(\"Button\");\n var _component_VirtualScroller = resolveComponent(\"VirtualScroller\");\n var _component_Portal = resolveComponent(\"Portal\");\n var _directive_ripple = resolveDirective(\"ripple\");\n return openBlock(), createElementBlock(\"div\", mergeProps({\n ref: \"container\",\n \"class\": _ctx.cx('root'),\n style: _ctx.sx('root'),\n onClick: _cache[15] || (_cache[15] = function () {\n return $options.onContainerClick && $options.onContainerClick.apply($options, arguments);\n })\n }, _ctx.ptmi('root')), [!_ctx.multiple ? (openBlock(), createElementBlock(\"input\", mergeProps({\n key: 0,\n ref: \"focusInput\",\n id: _ctx.inputId,\n type: \"text\",\n \"class\": [_ctx.cx('input'), _ctx.inputClass],\n style: _ctx.inputStyle,\n value: $options.inputValue,\n placeholder: _ctx.placeholder,\n tabindex: !_ctx.disabled ? _ctx.tabindex : -1,\n disabled: _ctx.disabled,\n autocomplete: \"off\",\n role: \"combobox\",\n \"aria-label\": _ctx.ariaLabel,\n \"aria-labelledby\": _ctx.ariaLabelledby,\n \"aria-haspopup\": \"listbox\",\n \"aria-autocomplete\": \"list\",\n \"aria-expanded\": $data.overlayVisible,\n \"aria-controls\": $data.id + '_list',\n \"aria-activedescendant\": $data.focused ? $options.focusedOptionId : undefined,\n \"aria-invalid\": _ctx.invalid || undefined,\n onFocus: _cache[0] || (_cache[0] = function () {\n return $options.onFocus && $options.onFocus.apply($options, arguments);\n }),\n onBlur: _cache[1] || (_cache[1] = function () {\n return $options.onBlur && $options.onBlur.apply($options, arguments);\n }),\n onKeydown: _cache[2] || (_cache[2] = function () {\n return $options.onKeyDown && $options.onKeyDown.apply($options, arguments);\n }),\n onInput: _cache[3] || (_cache[3] = function () {\n return $options.onInput && $options.onInput.apply($options, arguments);\n }),\n onChange: _cache[4] || (_cache[4] = function () {\n return $options.onChange && $options.onChange.apply($options, arguments);\n })\n }, _objectSpread(_objectSpread({}, _ctx.inputProps), _ctx.ptm('input'))), null, 16, _hoisted_1)) : createCommentVNode(\"\", true), _ctx.multiple ? (openBlock(), createElementBlock(\"ul\", mergeProps({\n key: 1,\n ref: \"multiContainer\",\n \"class\": _ctx.cx('container'),\n tabindex: \"-1\",\n role: \"listbox\",\n \"aria-orientation\": \"horizontal\",\n \"aria-activedescendant\": $data.focused ? $options.focusedMultipleOptionId : undefined,\n onFocus: _cache[10] || (_cache[10] = function () {\n return $options.onMultipleContainerFocus && $options.onMultipleContainerFocus.apply($options, arguments);\n }),\n onBlur: _cache[11] || (_cache[11] = function () {\n return $options.onMultipleContainerBlur && $options.onMultipleContainerBlur.apply($options, arguments);\n }),\n onKeydown: _cache[12] || (_cache[12] = function () {\n return $options.onMultipleContainerKeyDown && $options.onMultipleContainerKeyDown.apply($options, arguments);\n })\n }, _ctx.ptm('container')), [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.modelValue, function (option, i) {\n return openBlock(), createElementBlock(\"li\", mergeProps({\n key: i,\n id: $data.id + '_multiple_option_' + i,\n \"class\": _ctx.cx('token', {\n i: i\n }),\n role: \"option\",\n \"aria-label\": $options.getOptionLabel(option),\n \"aria-selected\": true,\n \"aria-setsize\": _ctx.modelValue.length,\n \"aria-posinset\": i + 1\n }, _ctx.ptm('token')), [renderSlot(_ctx.$slots, \"chip\", mergeProps({\n value: option\n }, _ctx.ptm('tokenLabel')), function () {\n return [createElementVNode(\"span\", mergeProps({\n \"class\": _ctx.cx('tokenLabel')\n }, _ctx.ptm('tokenLabel')), toDisplayString($options.getOptionLabel(option)), 17)];\n }), renderSlot(_ctx.$slots, \"removetokenicon\", {\n \"class\": normalizeClass(_ctx.cx('removeTokenIcon')),\n index: i,\n onClick: function onClick(event) {\n return $options.removeOption(event, i);\n },\n removeCallback: function removeCallback(event) {\n return $options.removeOption(event, i);\n }\n }, function () {\n return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.removeTokenIcon ? 'span' : 'TimesCircleIcon'), mergeProps({\n \"class\": [_ctx.cx('removeTokenIcon'), _ctx.removeTokenIcon],\n onClick: function onClick($event) {\n return $options.removeOption($event, i);\n },\n \"aria-hidden\": \"true\"\n }, _ctx.ptm('removeTokenIcon')), null, 16, [\"class\", \"onClick\"]))];\n })], 16, _hoisted_3);\n }), 128)), createElementVNode(\"li\", mergeProps({\n \"class\": _ctx.cx('inputToken'),\n role: \"option\"\n }, _ctx.ptm('inputToken')), [createElementVNode(\"input\", mergeProps({\n ref: \"focusInput\",\n id: _ctx.inputId,\n type: \"text\",\n style: _ctx.inputStyle,\n \"class\": _ctx.inputClass,\n placeholder: _ctx.placeholder,\n tabindex: !_ctx.disabled ? _ctx.tabindex : -1,\n disabled: _ctx.disabled,\n autocomplete: \"off\",\n role: \"combobox\",\n \"aria-label\": _ctx.ariaLabel,\n \"aria-labelledby\": _ctx.ariaLabelledby,\n \"aria-haspopup\": \"listbox\",\n \"aria-autocomplete\": \"list\",\n \"aria-expanded\": $data.overlayVisible,\n \"aria-controls\": $data.id + '_list',\n \"aria-activedescendant\": $data.focused ? $options.focusedOptionId : undefined,\n \"aria-invalid\": _ctx.invalid || undefined,\n onFocus: _cache[5] || (_cache[5] = function () {\n return $options.onFocus && $options.onFocus.apply($options, arguments);\n }),\n onBlur: _cache[6] || (_cache[6] = function () {\n return $options.onBlur && $options.onBlur.apply($options, arguments);\n }),\n onKeydown: _cache[7] || (_cache[7] = function () {\n return $options.onKeyDown && $options.onKeyDown.apply($options, arguments);\n }),\n onInput: _cache[8] || (_cache[8] = function () {\n return $options.onInput && $options.onInput.apply($options, arguments);\n }),\n onChange: _cache[9] || (_cache[9] = function () {\n return $options.onChange && $options.onChange.apply($options, arguments);\n })\n }, _objectSpread(_objectSpread({}, _ctx.inputProps), _ctx.ptm('input'))), null, 16, _hoisted_4)], 16)], 16, _hoisted_2)) : createCommentVNode(\"\", true), $data.searching || _ctx.loading ? renderSlot(_ctx.$slots, \"loadingicon\", {\n key: 2,\n \"class\": normalizeClass(_ctx.cx('loadingIcon'))\n }, function () {\n return [_ctx.loadingIcon ? (openBlock(), createElementBlock(\"i\", mergeProps({\n key: 0,\n \"class\": ['pi-spin', _ctx.cx('loadingIcon'), _ctx.loadingIcon],\n \"aria-hidden\": \"true\"\n }, _ctx.ptm('loadingIcon')), null, 16)) : (openBlock(), createBlock(_component_SpinnerIcon, mergeProps({\n key: 1,\n \"class\": [_ctx.cx('loadingIcon'), _ctx.loadingIcon],\n spin: \"\",\n \"aria-hidden\": \"true\"\n }, _ctx.ptm('loadingIcon')), null, 16, [\"class\"]))];\n }) : createCommentVNode(\"\", true), _ctx.dropdown ? (openBlock(), createBlock(_component_Button, {\n key: 3,\n ref: \"dropdownButton\",\n type: \"button\",\n tabindex: \"-1\",\n \"class\": normalizeClass([_ctx.cx('dropdownButton'), _ctx.dropdownClass]),\n disabled: _ctx.disabled,\n \"aria-hidden\": \"true\",\n onClick: $options.onDropdownClick,\n unstyled: _ctx.unstyled,\n pt: _ctx.ptm('dropdownButton')\n }, {\n icon: withCtx(function () {\n return [renderSlot(_ctx.$slots, \"dropdownicon\", {\n \"class\": normalizeClass(_ctx.dropdownIcon)\n }, function () {\n return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.dropdownIcon ? 'span' : 'ChevronDownIcon'), mergeProps({\n \"class\": _ctx.dropdownIcon\n }, _ctx.ptm('dropdownButton')['icon'], {\n \"data-pc-section\": \"dropdownicon\"\n }), null, 16, [\"class\"]))];\n })];\n }),\n _: 3\n }, 8, [\"class\", \"disabled\", \"onClick\", \"unstyled\", \"pt\"])) : createCommentVNode(\"\", true), createElementVNode(\"span\", mergeProps({\n role: \"status\",\n \"aria-live\": \"polite\",\n \"class\": \"p-hidden-accessible\"\n }, _ctx.ptm('hiddenSearchResult'), {\n \"data-p-hidden-accessible\": true\n }), toDisplayString($options.searchResultMessageText), 17), createVNode(_component_Portal, {\n appendTo: _ctx.appendTo\n }, {\n \"default\": withCtx(function () {\n return [createVNode(Transition, mergeProps({\n name: \"p-connected-overlay\",\n onEnter: $options.onOverlayEnter,\n onAfterEnter: $options.onOverlayAfterEnter,\n onLeave: $options.onOverlayLeave,\n onAfterLeave: $options.onOverlayAfterLeave\n }, _ctx.ptm('transition')), {\n \"default\": withCtx(function () {\n return [$data.overlayVisible ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n ref: $options.overlayRef,\n \"class\": [_ctx.cx('panel'), _ctx.panelClass],\n style: _objectSpread(_objectSpread({}, _ctx.panelStyle), {}, {\n 'max-height': $options.virtualScrollerDisabled ? _ctx.scrollHeight : ''\n }),\n onClick: _cache[13] || (_cache[13] = function () {\n return $options.onOverlayClick && $options.onOverlayClick.apply($options, arguments);\n }),\n onKeydown: _cache[14] || (_cache[14] = function () {\n return $options.onOverlayKeyDown && $options.onOverlayKeyDown.apply($options, arguments);\n })\n }, _objectSpread(_objectSpread({}, _ctx.panelProps), _ctx.ptm('panel'))), [renderSlot(_ctx.$slots, \"header\", {\n value: _ctx.modelValue,\n suggestions: $options.visibleOptions\n }), createVNode(_component_VirtualScroller, mergeProps({\n ref: $options.virtualScrollerRef\n }, _ctx.virtualScrollerOptions, {\n style: {\n height: _ctx.scrollHeight\n },\n items: $options.visibleOptions,\n tabindex: -1,\n disabled: $options.virtualScrollerDisabled,\n pt: _ctx.ptm('virtualScroller')\n }), createSlots({\n content: withCtx(function (_ref) {\n var styleClass = _ref.styleClass,\n contentRef = _ref.contentRef,\n items = _ref.items,\n getItemOptions = _ref.getItemOptions,\n contentStyle = _ref.contentStyle,\n itemSize = _ref.itemSize;\n return [createElementVNode(\"ul\", mergeProps({\n ref: function ref(el) {\n return $options.listRef(el, contentRef);\n },\n id: $data.id + '_list',\n \"class\": [_ctx.cx('list'), styleClass],\n style: contentStyle,\n role: \"listbox\",\n \"aria-label\": $options.listAriaLabel\n }, _ctx.ptm('list')), [(openBlock(true), createElementBlock(Fragment, null, renderList(items, function (option, i) {\n return openBlock(), createElementBlock(Fragment, {\n key: $options.getOptionRenderKey(option, $options.getOptionIndex(i, getItemOptions))\n }, [$options.isOptionGroup(option) ? (openBlock(), createElementBlock(\"li\", mergeProps({\n key: 0,\n id: $data.id + '_' + $options.getOptionIndex(i, getItemOptions),\n style: {\n height: itemSize ? itemSize + 'px' : undefined\n },\n \"class\": _ctx.cx('itemGroup'),\n role: \"option\"\n }, _ctx.ptm('itemGroup')), [renderSlot(_ctx.$slots, \"optiongroup\", {\n option: option.optionGroup,\n item: option.optionGroup,\n index: $options.getOptionIndex(i, getItemOptions)\n }, function () {\n return [createTextVNode(toDisplayString($options.getOptionGroupLabel(option.optionGroup)), 1)];\n })], 16, _hoisted_6)) : withDirectives((openBlock(), createElementBlock(\"li\", mergeProps({\n key: 1,\n id: $data.id + '_' + $options.getOptionIndex(i, getItemOptions),\n style: {\n height: itemSize ? itemSize + 'px' : undefined\n },\n \"class\": _ctx.cx('item', {\n option: option,\n i: i,\n getItemOptions: getItemOptions\n }),\n role: \"option\",\n \"aria-label\": $options.getOptionLabel(option),\n \"aria-selected\": $options.isSelected(option),\n \"aria-disabled\": $options.isOptionDisabled(option),\n \"aria-setsize\": $options.ariaSetSize,\n \"aria-posinset\": $options.getAriaPosInset($options.getOptionIndex(i, getItemOptions)),\n onClick: function onClick($event) {\n return $options.onOptionSelect($event, option);\n },\n onMousemove: function onMousemove($event) {\n return $options.onOptionMouseMove($event, $options.getOptionIndex(i, getItemOptions));\n },\n \"data-p-highlight\": $options.isSelected(option),\n \"data-p-focus\": $data.focusedOptionIndex === $options.getOptionIndex(i, getItemOptions),\n \"data-p-disabled\": $options.isOptionDisabled(option)\n }, $options.getPTOptions(option, getItemOptions, i, 'item')), [_ctx.$slots.option ? renderSlot(_ctx.$slots, \"option\", {\n key: 0,\n option: option,\n index: $options.getOptionIndex(i, getItemOptions)\n }, function () {\n return [createTextVNode(toDisplayString($options.getOptionLabel(option)), 1)];\n }) : renderSlot(_ctx.$slots, \"item\", {\n key: 1,\n item: option,\n index: $options.getOptionIndex(i, getItemOptions)\n }, function () {\n return [createTextVNode(toDisplayString($options.getOptionLabel(option)), 1)];\n })], 16, _hoisted_7)), [[_directive_ripple]])], 64);\n }), 128)), !items || items && items.length === 0 ? (openBlock(), createElementBlock(\"li\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('emptyMessage'),\n role: \"option\"\n }, _ctx.ptm('emptyMessage')), [renderSlot(_ctx.$slots, \"empty\", {}, function () {\n return [createTextVNode(toDisplayString($options.searchResultMessageText), 1)];\n })], 16)) : createCommentVNode(\"\", true)], 16, _hoisted_5)];\n }),\n _: 2\n }, [_ctx.$slots.loader ? {\n name: \"loader\",\n fn: withCtx(function (_ref2) {\n var options = _ref2.options;\n return [renderSlot(_ctx.$slots, \"loader\", {\n options: options\n })];\n }),\n key: \"0\"\n } : undefined]), 1040, [\"style\", \"items\", \"disabled\", \"pt\"]), renderSlot(_ctx.$slots, \"footer\", {\n value: _ctx.modelValue,\n suggestions: $options.visibleOptions\n }), createElementVNode(\"span\", mergeProps({\n role: \"status\",\n \"aria-live\": \"polite\",\n \"class\": \"p-hidden-accessible\"\n }, _ctx.ptm('hiddenSelectedMessage'), {\n \"data-p-hidden-accessible\": true\n }), toDisplayString($options.selectedMessageText), 17)], 16)) : createCommentVNode(\"\", true)];\n }),\n _: 3\n }, 16, [\"onEnter\", \"onAfterEnter\", \"onLeave\", \"onAfterLeave\"])];\n }),\n _: 3\n }, 8, [\"appendTo\"])], 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\nvar classes = {\n root: 'p-progress-spinner',\n spinner: 'p-progress-spinner-svg',\n circle: 'p-progress-spinner-circle'\n};\nvar ProgressSpinnerStyle = BaseStyle.extend({\n name: 'progressspinner',\n classes: classes\n});\n\nexport { ProgressSpinnerStyle as default };\n","import BaseComponent from 'primevue/basecomponent';\nimport ProgressSpinnerStyle from 'primevue/progressspinner/style';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode } from 'vue';\n\nvar script$1 = {\n name: 'BaseProgressSpinner',\n \"extends\": BaseComponent,\n props: {\n strokeWidth: {\n type: String,\n \"default\": '2'\n },\n fill: {\n type: String,\n \"default\": 'none'\n },\n animationDuration: {\n type: String,\n \"default\": '2s'\n }\n },\n style: ProgressSpinnerStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script = {\n name: 'ProgressSpinner',\n \"extends\": script$1,\n inheritAttrs: false,\n computed: {\n svgStyle: function svgStyle() {\n return {\n 'animation-duration': this.animationDuration\n };\n }\n }\n};\n\nvar _hoisted_1 = [\"fill\", \"stroke-width\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"div\", mergeProps({\n \"class\": _ctx.cx('root'),\n role: \"progressbar\"\n }, _ctx.ptmi('root')), [(openBlock(), createElementBlock(\"svg\", mergeProps({\n \"class\": _ctx.cx('spinner'),\n viewBox: \"25 25 50 50\",\n style: $options.svgStyle\n }, _ctx.ptm('spinner')), [createElementVNode(\"circle\", mergeProps({\n \"class\": _ctx.cx('circle'),\n cx: \"50\",\n cy: \"50\",\n r: \"20\",\n fill: _ctx.fill,\n \"stroke-width\": _ctx.strokeWidth,\n strokeMiterlimit: \"10\"\n }, _ctx.ptm('circle')), null, 16, _hoisted_1)], 16))], 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\nvar classes = {\n root: function root(_ref) {\n var instance = _ref.instance,\n props = _ref.props;\n return ['p-inputtextarea p-inputtext p-component', {\n 'p-filled': instance.filled,\n 'p-inputtextarea-resizable ': props.autoResize,\n 'p-invalid': props.invalid,\n 'p-variant-filled': props.variant ? props.variant === 'filled' : instance.$primevue.config.inputStyle === 'filled'\n }];\n }\n};\nvar TextareaStyle = BaseStyle.extend({\n name: 'textarea',\n classes: classes\n});\n\nexport { TextareaStyle as default };\n","import BaseComponent from 'primevue/basecomponent';\nimport TextareaStyle from 'primevue/textarea/style';\nimport { openBlock, createElementBlock, mergeProps } from 'vue';\n\nvar script$1 = {\n name: 'BaseTextarea',\n \"extends\": BaseComponent,\n props: {\n modelValue: null,\n autoResize: Boolean,\n invalid: {\n type: Boolean,\n \"default\": false\n },\n variant: {\n type: String,\n \"default\": null\n }\n },\n style: TextareaStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script = {\n name: 'Textarea',\n \"extends\": script$1,\n inheritAttrs: false,\n emits: ['update:modelValue'],\n mounted: function mounted() {\n if (this.$el.offsetParent && this.autoResize) {\n this.resize();\n }\n },\n updated: function updated() {\n if (this.$el.offsetParent && this.autoResize) {\n this.resize();\n }\n },\n methods: {\n resize: function resize() {\n this.$el.style.height = 'auto';\n this.$el.style.height = this.$el.scrollHeight + 'px';\n if (parseFloat(this.$el.style.height) >= parseFloat(this.$el.style.maxHeight)) {\n this.$el.style.overflowY = 'scroll';\n this.$el.style.height = this.$el.style.maxHeight;\n } else {\n this.$el.style.overflow = 'hidden';\n }\n },\n onInput: function onInput(event) {\n if (this.autoResize) {\n this.resize();\n }\n this.$emit('update:modelValue', event.target.value);\n }\n },\n computed: {\n filled: function filled() {\n return this.modelValue != null && this.modelValue.toString().length > 0;\n },\n ptmParams: function ptmParams() {\n return {\n context: {\n disabled: this.$attrs.disabled || this.$attrs.disabled === ''\n }\n };\n }\n }\n};\n\nvar _hoisted_1 = [\"value\", \"aria-invalid\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"textarea\", mergeProps({\n \"class\": _ctx.cx('root'),\n value: _ctx.modelValue,\n \"aria-invalid\": _ctx.invalid || undefined,\n onInput: _cache[0] || (_cache[0] = function () {\n return $options.onInput && $options.onInput.apply($options, arguments);\n })\n }, _ctx.ptmi('root', $options.ptmParams)), null, 16, _hoisted_1);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseIcon from 'primevue/baseicon';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode } from 'vue';\n\nvar script = {\n name: 'UploadIcon',\n \"extends\": BaseIcon\n};\n\nvar _hoisted_1 = /*#__PURE__*/createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n \"clip-rule\": \"evenodd\",\n d: \"M6.58942 9.82197C6.70165 9.93405 6.85328 9.99793 7.012 10C7.17071 9.99793 7.32234 9.93405 7.43458 9.82197C7.54681 9.7099 7.61079 9.55849 7.61286 9.4V2.04798L9.79204 4.22402C9.84752 4.28011 9.91365 4.32457 9.98657 4.35479C10.0595 4.38502 10.1377 4.40039 10.2167 4.40002C10.2956 4.40039 10.3738 4.38502 10.4467 4.35479C10.5197 4.32457 10.5858 4.28011 10.6413 4.22402C10.7538 4.11152 10.817 3.95902 10.817 3.80002C10.817 3.64102 10.7538 3.48852 10.6413 3.37602L7.45127 0.190618C7.44656 0.185584 7.44176 0.180622 7.43687 0.175736C7.32419 0.063214 7.17136 0 7.012 0C6.85264 0 6.69981 0.063214 6.58712 0.175736C6.58181 0.181045 6.5766 0.186443 6.5715 0.191927L3.38282 3.37602C3.27669 3.48976 3.2189 3.6402 3.22165 3.79564C3.2244 3.95108 3.28746 4.09939 3.39755 4.20932C3.50764 4.31925 3.65616 4.38222 3.81182 4.38496C3.96749 4.3877 4.11814 4.33001 4.23204 4.22402L6.41113 2.04807V9.4C6.41321 9.55849 6.47718 9.7099 6.58942 9.82197ZM11.9952 14H2.02883C1.751 13.9887 1.47813 13.9228 1.22584 13.8061C0.973545 13.6894 0.746779 13.5241 0.558517 13.3197C0.370254 13.1154 0.22419 12.876 0.128681 12.6152C0.0331723 12.3545 -0.00990605 12.0775 0.0019109 11.8V9.40005C0.0019109 9.24092 0.065216 9.08831 0.1779 8.97579C0.290584 8.86326 0.443416 8.80005 0.602775 8.80005C0.762134 8.80005 0.914966 8.86326 1.02765 8.97579C1.14033 9.08831 1.20364 9.24092 1.20364 9.40005V11.8C1.18295 12.0376 1.25463 12.274 1.40379 12.4602C1.55296 12.6463 1.76817 12.7681 2.00479 12.8H11.9952C12.2318 12.7681 12.447 12.6463 12.5962 12.4602C12.7453 12.274 12.817 12.0376 12.7963 11.8V9.40005C12.7963 9.24092 12.8596 9.08831 12.9723 8.97579C13.085 8.86326 13.2378 8.80005 13.3972 8.80005C13.5565 8.80005 13.7094 8.86326 13.8221 8.97579C13.9347 9.08831 13.998 9.24092 13.998 9.40005V11.8C14.022 12.3563 13.8251 12.8996 13.45 13.3116C13.0749 13.7236 12.552 13.971 11.9952 14Z\",\n fill: \"currentColor\"\n}, null, -1);\nvar _hoisted_2 = [_hoisted_1];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", mergeProps({\n width: \"14\",\n height: \"14\",\n viewBox: \"0 0 14 14\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, _ctx.pti()), _hoisted_2, 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\nvar classes = {\n root: function root(_ref) {\n var props = _ref.props;\n return 'p-message p-component p-message-' + props.severity;\n },\n wrapper: 'p-message-wrapper',\n icon: 'p-message-icon',\n text: 'p-message-text',\n closeButton: 'p-message-close p-link',\n closeIcon: 'p-message-close-icon'\n};\nvar MessageStyle = BaseStyle.extend({\n name: 'message',\n classes: classes\n});\n\nexport { MessageStyle as default };\n","import CheckIcon from 'primevue/icons/check';\nimport ExclamationTriangleIcon from 'primevue/icons/exclamationtriangle';\nimport InfoCircleIcon from 'primevue/icons/infocircle';\nimport TimesIcon from 'primevue/icons/times';\nimport TimesCircleIcon from 'primevue/icons/timescircle';\nimport Ripple from 'primevue/ripple';\nimport BaseComponent from 'primevue/basecomponent';\nimport MessageStyle from 'primevue/message/style';\nimport { resolveComponent, resolveDirective, openBlock, createBlock, Transition, mergeProps, withCtx, withDirectives, createElementVNode, renderSlot, createElementBlock, resolveDynamicComponent, createCommentVNode, vShow } from 'vue';\n\nvar script$1 = {\n name: 'BaseMessage',\n \"extends\": BaseComponent,\n props: {\n severity: {\n type: String,\n \"default\": 'info'\n },\n closable: {\n type: Boolean,\n \"default\": true\n },\n sticky: {\n type: Boolean,\n \"default\": true\n },\n life: {\n type: Number,\n \"default\": 3000\n },\n icon: {\n type: String,\n \"default\": undefined\n },\n closeIcon: {\n type: String,\n \"default\": undefined\n },\n closeButtonProps: {\n type: null,\n \"default\": null\n }\n },\n style: MessageStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script = {\n name: 'Message',\n \"extends\": script$1,\n inheritAttrs: false,\n emits: ['close', 'life-end'],\n timeout: null,\n data: function data() {\n return {\n visible: true\n };\n },\n watch: {\n sticky: function sticky(newValue) {\n if (!newValue) {\n this.closeAfterDelay();\n }\n }\n },\n mounted: function mounted() {\n if (!this.sticky) {\n this.closeAfterDelay();\n }\n },\n methods: {\n close: function close(event) {\n this.visible = false;\n this.$emit('close', event);\n },\n closeAfterDelay: function closeAfterDelay() {\n var _this = this;\n setTimeout(function () {\n _this.visible = false;\n _this.$emit('life-end');\n }, this.life);\n }\n },\n computed: {\n iconComponent: function iconComponent() {\n return {\n info: InfoCircleIcon,\n success: CheckIcon,\n warn: ExclamationTriangleIcon,\n error: TimesCircleIcon\n }[this.severity];\n },\n closeAriaLabel: function closeAriaLabel() {\n return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.close : undefined;\n }\n },\n directives: {\n ripple: Ripple\n },\n components: {\n TimesIcon: TimesIcon,\n InfoCircleIcon: InfoCircleIcon,\n CheckIcon: CheckIcon,\n ExclamationTriangleIcon: ExclamationTriangleIcon,\n TimesCircleIcon: TimesCircleIcon\n }\n};\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar _hoisted_1 = [\"aria-label\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n var _component_TimesIcon = resolveComponent(\"TimesIcon\");\n var _directive_ripple = resolveDirective(\"ripple\");\n return openBlock(), createBlock(Transition, mergeProps({\n name: \"p-message\",\n appear: \"\"\n }, _ctx.ptmi('transition')), {\n \"default\": withCtx(function () {\n return [withDirectives(createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('root'),\n role: \"alert\",\n \"aria-live\": \"assertive\",\n \"aria-atomic\": \"true\"\n }, _ctx.ptm('root')), [_ctx.$slots.container ? renderSlot(_ctx.$slots, \"container\", {\n key: 0,\n onClose: $options.close,\n closeCallback: $options.close\n }) : (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 1,\n \"class\": _ctx.cx('wrapper')\n }, _ctx.ptm('wrapper')), [renderSlot(_ctx.$slots, \"messageicon\", {\n \"class\": \"p-message-icon\"\n }, function () {\n return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.icon ? 'span' : $options.iconComponent), mergeProps({\n \"class\": [_ctx.cx('icon'), _ctx.icon]\n }, _ctx.ptm('icon')), null, 16, [\"class\"]))];\n }), createElementVNode(\"div\", mergeProps({\n \"class\": [\"p-message-text\", _ctx.cx('text')]\n }, _ctx.ptm('text')), [renderSlot(_ctx.$slots, \"default\")], 16), _ctx.closable ? withDirectives((openBlock(), createElementBlock(\"button\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('closeButton'),\n \"aria-label\": $options.closeAriaLabel,\n type: \"button\",\n onClick: _cache[0] || (_cache[0] = function ($event) {\n return $options.close($event);\n })\n }, _objectSpread(_objectSpread(_objectSpread({}, _ctx.closeButtonProps), _ctx.ptm('button')), _ctx.ptm('closeButton'))), [renderSlot(_ctx.$slots, \"closeicon\", {}, function () {\n return [_ctx.closeIcon ? (openBlock(), createElementBlock(\"i\", mergeProps({\n key: 0,\n \"class\": [_ctx.cx('closeIcon'), _ctx.closeIcon]\n }, _objectSpread(_objectSpread({}, _ctx.ptm('buttonIcon')), _ctx.ptm('closeIcon'))), null, 16)) : (openBlock(), createBlock(_component_TimesIcon, mergeProps({\n key: 1,\n \"class\": [_ctx.cx('closeIcon'), _ctx.closeIcon]\n }, _objectSpread(_objectSpread({}, _ctx.ptm('buttonIcon')), _ctx.ptm('closeIcon'))), null, 16, [\"class\"]))];\n })], 16, _hoisted_1)), [[_directive_ripple]]) : createCommentVNode(\"\", true)], 16))], 16), [[vShow, $data.visible]])];\n }),\n _: 3\n }, 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\nvar classes = {\n root: function root(_ref) {\n var instance = _ref.instance;\n return ['p-progressbar p-component', {\n 'p-progressbar-determinate': instance.determinate,\n 'p-progressbar-indeterminate': instance.indeterminate\n }];\n },\n container: 'p-progressbar-indeterminate-container',\n value: 'p-progressbar-value p-progressbar-value-animate',\n label: 'p-progressbar-label'\n};\nvar ProgressBarStyle = BaseStyle.extend({\n name: 'progressbar',\n classes: classes\n});\n\nexport { ProgressBarStyle as default };\n","import BaseComponent from 'primevue/basecomponent';\nimport ProgressBarStyle from 'primevue/progressbar/style';\nimport { openBlock, createElementBlock, mergeProps, renderSlot, createTextVNode, toDisplayString, createCommentVNode, createElementVNode } from 'vue';\n\nvar script$1 = {\n name: 'BaseProgressBar',\n \"extends\": BaseComponent,\n props: {\n value: {\n type: Number,\n \"default\": null\n },\n mode: {\n type: String,\n \"default\": 'determinate'\n },\n showValue: {\n type: Boolean,\n \"default\": true\n }\n },\n style: ProgressBarStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script = {\n name: 'ProgressBar',\n \"extends\": script$1,\n inheritAttrs: false,\n computed: {\n progressStyle: function progressStyle() {\n return {\n width: this.value + '%',\n display: 'flex'\n };\n },\n indeterminate: function indeterminate() {\n return this.mode === 'indeterminate';\n },\n determinate: function determinate() {\n return this.mode === 'determinate';\n }\n }\n};\n\nvar _hoisted_1 = [\"aria-valuenow\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"div\", mergeProps({\n role: \"progressbar\",\n \"class\": _ctx.cx('root'),\n \"aria-valuemin\": \"0\",\n \"aria-valuenow\": _ctx.value,\n \"aria-valuemax\": \"100\"\n }, _ctx.ptmi('root')), [$options.determinate ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('value'),\n style: $options.progressStyle\n }, _ctx.ptm('value')), [_ctx.value != null && _ctx.value !== 0 && _ctx.showValue ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('label')\n }, _ctx.ptm('label')), [renderSlot(_ctx.$slots, \"default\", {}, function () {\n return [createTextVNode(toDisplayString(_ctx.value + '%'), 1)];\n })], 16)) : createCommentVNode(\"\", true)], 16)) : createCommentVNode(\"\", true), $options.indeterminate ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 1,\n \"class\": _ctx.cx('container')\n }, _ctx.ptm('container')), [createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('value')\n }, _ctx.ptm('value')), null, 16)], 16)) : createCommentVNode(\"\", true)], 16, _hoisted_1);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\nvar classes = {\n root: function root(_ref) {\n var props = _ref.props;\n return [\"p-fileupload p-fileupload-\".concat(props.mode, \" p-component\")];\n },\n buttonbar: 'p-fileupload-buttonbar',\n chooseButton: function chooseButton(_ref2) {\n var instance = _ref2.instance,\n props = _ref2.props;\n return ['p-button p-component p-fileupload-choose', {\n 'p-fileupload-choose-selected': props.mode === 'basic' && instance.hasFiles,\n 'p-disabled': props.disabled,\n 'p-focus': instance.focused\n }];\n },\n chooseIcon: 'p-button-icon p-button-icon-left',\n chooseButtonLabel: 'p-button-label',\n content: 'p-fileupload-content',\n empty: 'p-fileupload-empty',\n uploadIcon: 'p-button-icon p-button-icon-left',\n label: 'p-button-label',\n file: 'p-fileupload-file',\n thumbnail: 'p-fileupload-file-thumbnail',\n details: 'p-fileupload-file-details',\n fileName: 'p-fileupload-file-name',\n fileSize: 'p-fileupload-file-size',\n badge: 'p-fileupload-file-badge',\n actions: 'p-fileupload-file-actions',\n removeButton: 'p-fileupload-file-remove'\n};\nvar FileUploadStyle = BaseStyle.extend({\n name: 'fileupload',\n classes: classes\n});\n\nexport { FileUploadStyle as default };\n","import Button from 'primevue/button';\nimport PlusIcon from 'primevue/icons/plus';\nimport TimesIcon from 'primevue/icons/times';\nimport UploadIcon from 'primevue/icons/upload';\nimport Message from 'primevue/message';\nimport ProgressBar from 'primevue/progressbar';\nimport Ripple from 'primevue/ripple';\nimport { DomHandler } from 'primevue/utils';\nimport BaseComponent from 'primevue/basecomponent';\nimport FileUploadStyle from 'primevue/fileupload/style';\nimport Badge from 'primevue/badge';\nimport { resolveComponent, openBlock, createElementBlock, Fragment, renderList, mergeProps, createElementVNode, toDisplayString, createVNode, normalizeClass, withCtx, createBlock, resolveDynamicComponent, resolveDirective, renderSlot, withDirectives, withKeys, createCommentVNode, createTextVNode } from 'vue';\n\nvar script$2 = {\n name: 'BaseFileUpload',\n \"extends\": BaseComponent,\n props: {\n name: {\n type: String,\n \"default\": null\n },\n url: {\n type: String,\n \"default\": null\n },\n mode: {\n type: String,\n \"default\": 'advanced'\n },\n multiple: {\n type: Boolean,\n \"default\": false\n },\n accept: {\n type: String,\n \"default\": null\n },\n disabled: {\n type: Boolean,\n \"default\": false\n },\n auto: {\n type: Boolean,\n \"default\": false\n },\n maxFileSize: {\n type: Number,\n \"default\": null\n },\n invalidFileSizeMessage: {\n type: String,\n \"default\": '{0}: Invalid file size, file size should be smaller than {1}.'\n },\n invalidFileTypeMessage: {\n type: String,\n \"default\": '{0}: Invalid file type, allowed file types: {1}.'\n },\n fileLimit: {\n type: Number,\n \"default\": null\n },\n invalidFileLimitMessage: {\n type: String,\n \"default\": 'Maximum number of files exceeded, limit is {0} at most.'\n },\n withCredentials: {\n type: Boolean,\n \"default\": false\n },\n previewWidth: {\n type: Number,\n \"default\": 50\n },\n chooseLabel: {\n type: String,\n \"default\": null\n },\n uploadLabel: {\n type: String,\n \"default\": null\n },\n cancelLabel: {\n type: String,\n \"default\": null\n },\n customUpload: {\n type: Boolean,\n \"default\": false\n },\n showUploadButton: {\n type: Boolean,\n \"default\": true\n },\n showCancelButton: {\n type: Boolean,\n \"default\": true\n },\n chooseIcon: {\n type: String,\n \"default\": undefined\n },\n uploadIcon: {\n type: String,\n \"default\": undefined\n },\n cancelIcon: {\n type: String,\n \"default\": undefined\n },\n style: null,\n \"class\": null\n },\n style: FileUploadStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script$1 = {\n name: 'FileContent',\n hostName: 'FileUpload',\n \"extends\": BaseComponent,\n emits: ['remove'],\n props: {\n files: {\n type: Array,\n \"default\": function _default() {\n return [];\n }\n },\n badgeSeverity: {\n type: String,\n \"default\": 'warning'\n },\n badgeValue: {\n type: String,\n \"default\": null\n },\n previewWidth: {\n type: Number,\n \"default\": 50\n },\n templates: {\n type: null,\n \"default\": null\n }\n },\n methods: {\n formatSize: function formatSize(bytes) {\n var _this$$primevue$confi;\n var k = 1024;\n var dm = 3;\n var sizes = ((_this$$primevue$confi = this.$primevue.config.locale) === null || _this$$primevue$confi === void 0 ? void 0 : _this$$primevue$confi.fileSizeTypes) || ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n if (bytes === 0) {\n return \"0 \".concat(sizes[0]);\n }\n var i = Math.floor(Math.log(bytes) / Math.log(k));\n var formattedSize = parseFloat((bytes / Math.pow(k, i)).toFixed(dm));\n return \"\".concat(formattedSize, \" \").concat(sizes[i]);\n }\n },\n components: {\n FileUploadButton: Button,\n FileUploadBadge: Badge,\n TimesIcon: TimesIcon\n }\n};\n\nvar _hoisted_1$1 = [\"alt\", \"src\", \"width\"];\nfunction render$1(_ctx, _cache, $props, $setup, $data, $options) {\n var _component_FileUploadBadge = resolveComponent(\"FileUploadBadge\");\n var _component_TimesIcon = resolveComponent(\"TimesIcon\");\n var _component_FileUploadButton = resolveComponent(\"FileUploadButton\");\n return openBlock(true), createElementBlock(Fragment, null, renderList($props.files, function (file, index) {\n return openBlock(), createElementBlock(\"div\", mergeProps({\n key: file.name + file.type + file.size,\n \"class\": _ctx.cx('file')\n }, _ctx.ptm('file')), [createElementVNode(\"img\", mergeProps({\n role: \"presentation\",\n \"class\": _ctx.cx('thumbnail'),\n alt: file.name,\n src: file.objectURL,\n width: $props.previewWidth\n }, _ctx.ptm('thumbnail')), null, 16, _hoisted_1$1), createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('details')\n }, _ctx.ptm('details')), [createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('fileName')\n }, _ctx.ptm('fileName')), toDisplayString(file.name), 17), createElementVNode(\"span\", mergeProps({\n \"class\": _ctx.cx('fileSize')\n }, _ctx.ptm('fileSize')), toDisplayString($options.formatSize(file.size)), 17), createVNode(_component_FileUploadBadge, {\n value: $props.badgeValue,\n \"class\": normalizeClass(_ctx.cx('badge')),\n severity: $props.badgeSeverity,\n unstyled: _ctx.unstyled,\n pt: _ctx.ptm('badge')\n }, null, 8, [\"value\", \"class\", \"severity\", \"unstyled\", \"pt\"])], 16), createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('actions')\n }, _ctx.ptm('actions')), [createVNode(_component_FileUploadButton, {\n onClick: function onClick($event) {\n return _ctx.$emit('remove', index);\n },\n text: \"\",\n rounded: \"\",\n severity: \"danger\",\n \"class\": normalizeClass(_ctx.cx('removeButton')),\n unstyled: _ctx.unstyled,\n pt: _ctx.ptm('removeButton')\n }, {\n icon: withCtx(function (iconProps) {\n return [$props.templates.fileremoveicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.fileremoveicon), {\n key: 0,\n \"class\": normalizeClass(iconProps[\"class\"]),\n file: file,\n index: index\n }, null, 8, [\"class\", \"file\", \"index\"])) : (openBlock(), createBlock(_component_TimesIcon, mergeProps({\n key: 1,\n \"class\": iconProps[\"class\"],\n \"aria-hidden\": \"true\"\n }, _ctx.ptm('removeButton')['icon']), null, 16, [\"class\"]))];\n }),\n _: 2\n }, 1032, [\"onClick\", \"class\", \"unstyled\", \"pt\"])], 16)], 16);\n }), 128);\n}\n\nscript$1.render = render$1;\n\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it[\"return\"] != null) it[\"return\"](); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nvar script = {\n name: 'FileUpload',\n \"extends\": script$2,\n inheritAttrs: false,\n emits: ['select', 'uploader', 'before-upload', 'progress', 'upload', 'error', 'before-send', 'clear', 'remove', 'remove-uploaded-file'],\n duplicateIEEvent: false,\n data: function data() {\n return {\n uploadedFileCount: 0,\n files: [],\n messages: [],\n focused: false,\n progress: null,\n uploadedFiles: []\n };\n },\n methods: {\n onFileSelect: function onFileSelect(event) {\n if (event.type !== 'drop' && this.isIE11() && this.duplicateIEEvent) {\n this.duplicateIEEvent = false;\n return;\n }\n this.messages = [];\n this.files = this.files || [];\n var files = event.dataTransfer ? event.dataTransfer.files : event.target.files;\n var _iterator = _createForOfIteratorHelper(files),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var file = _step.value;\n if (!this.isFileSelected(file)) {\n if (this.validate(file)) {\n if (this.isImage(file)) {\n file.objectURL = window.URL.createObjectURL(file);\n }\n this.files.push(file);\n }\n }\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n this.$emit('select', {\n originalEvent: event,\n files: this.files\n });\n if (this.fileLimit) {\n this.checkFileLimit();\n }\n if (this.auto && this.hasFiles && !this.isFileLimitExceeded()) {\n this.upload();\n }\n if (event.type !== 'drop' && this.isIE11()) {\n this.clearIEInput();\n } else {\n this.clearInputElement();\n }\n },\n choose: function choose() {\n this.$refs.fileInput.click();\n },\n upload: function upload() {\n var _this = this;\n if (this.customUpload) {\n if (this.fileLimit) {\n this.uploadedFileCount += this.files.length;\n }\n this.$emit('uploader', {\n files: this.files\n });\n this.clear();\n } else {\n var xhr = new XMLHttpRequest();\n var formData = new FormData();\n this.$emit('before-upload', {\n xhr: xhr,\n formData: formData\n });\n var _iterator2 = _createForOfIteratorHelper(this.files),\n _step2;\n try {\n for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n var file = _step2.value;\n formData.append(this.name, file, file.name);\n }\n } catch (err) {\n _iterator2.e(err);\n } finally {\n _iterator2.f();\n }\n xhr.upload.addEventListener('progress', function (event) {\n if (event.lengthComputable) {\n _this.progress = Math.round(event.loaded * 100 / event.total);\n }\n _this.$emit('progress', {\n originalEvent: event,\n progress: _this.progress\n });\n });\n xhr.onreadystatechange = function () {\n if (xhr.readyState === 4) {\n var _this$uploadedFiles;\n _this.progress = 0;\n if (xhr.status >= 200 && xhr.status < 300) {\n if (_this.fileLimit) {\n _this.uploadedFileCount += _this.files.length;\n }\n _this.$emit('upload', {\n xhr: xhr,\n files: _this.files\n });\n } else {\n _this.$emit('error', {\n xhr: xhr,\n files: _this.files\n });\n }\n (_this$uploadedFiles = _this.uploadedFiles).push.apply(_this$uploadedFiles, _toConsumableArray(_this.files));\n _this.clear();\n }\n };\n xhr.open('POST', this.url, true);\n this.$emit('before-send', {\n xhr: xhr,\n formData: formData\n });\n xhr.withCredentials = this.withCredentials;\n xhr.send(formData);\n }\n },\n clear: function clear() {\n this.files = [];\n this.messages = null;\n this.$emit('clear');\n if (this.isAdvanced) {\n this.clearInputElement();\n }\n },\n onFocus: function onFocus() {\n this.focused = true;\n },\n onBlur: function onBlur() {\n this.focused = false;\n },\n isFileSelected: function isFileSelected(file) {\n if (this.files && this.files.length) {\n var _iterator3 = _createForOfIteratorHelper(this.files),\n _step3;\n try {\n for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {\n var sFile = _step3.value;\n if (sFile.name + sFile.type + sFile.size === file.name + file.type + file.size) return true;\n }\n } catch (err) {\n _iterator3.e(err);\n } finally {\n _iterator3.f();\n }\n }\n return false;\n },\n isIE11: function isIE11() {\n return !!window['MSInputMethodContext'] && !!document['documentMode'];\n },\n validate: function validate(file) {\n if (this.accept && !this.isFileTypeValid(file)) {\n this.messages.push(this.invalidFileTypeMessage.replace('{0}', file.name).replace('{1}', this.accept));\n return false;\n }\n if (this.maxFileSize && file.size > this.maxFileSize) {\n this.messages.push(this.invalidFileSizeMessage.replace('{0}', file.name).replace('{1}', this.formatSize(this.maxFileSize)));\n return false;\n }\n return true;\n },\n isFileTypeValid: function isFileTypeValid(file) {\n var acceptableTypes = this.accept.split(',').map(function (type) {\n return type.trim();\n });\n var _iterator4 = _createForOfIteratorHelper(acceptableTypes),\n _step4;\n try {\n for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {\n var type = _step4.value;\n var acceptable = this.isWildcard(type) ? this.getTypeClass(file.type) === this.getTypeClass(type) : file.type == type || this.getFileExtension(file).toLowerCase() === type.toLowerCase();\n if (acceptable) {\n return true;\n }\n }\n } catch (err) {\n _iterator4.e(err);\n } finally {\n _iterator4.f();\n }\n return false;\n },\n getTypeClass: function getTypeClass(fileType) {\n return fileType.substring(0, fileType.indexOf('/'));\n },\n isWildcard: function isWildcard(fileType) {\n return fileType.indexOf('*') !== -1;\n },\n getFileExtension: function getFileExtension(file) {\n return '.' + file.name.split('.').pop();\n },\n isImage: function isImage(file) {\n return /^image\\//.test(file.type);\n },\n onDragEnter: function onDragEnter(event) {\n if (!this.disabled) {\n event.stopPropagation();\n event.preventDefault();\n }\n },\n onDragOver: function onDragOver(event) {\n if (!this.disabled) {\n !this.isUnstyled && DomHandler.addClass(this.$refs.content, 'p-fileupload-highlight');\n this.$refs.content.setAttribute('data-p-highlight', true);\n event.stopPropagation();\n event.preventDefault();\n }\n },\n onDragLeave: function onDragLeave() {\n if (!this.disabled) {\n !this.isUnstyled && DomHandler.removeClass(this.$refs.content, 'p-fileupload-highlight');\n this.$refs.content.setAttribute('data-p-highlight', false);\n }\n },\n onDrop: function onDrop(event) {\n if (!this.disabled) {\n !this.isUnstyled && DomHandler.removeClass(this.$refs.content, 'p-fileupload-highlight');\n this.$refs.content.setAttribute('data-p-highlight', false);\n event.stopPropagation();\n event.preventDefault();\n var files = event.dataTransfer ? event.dataTransfer.files : event.target.files;\n var allowDrop = this.multiple || files && files.length === 1;\n if (allowDrop) {\n this.onFileSelect(event);\n }\n }\n },\n onBasicUploaderClick: function onBasicUploaderClick(event) {\n if (this.hasFiles) this.upload();else if (event.button === 0) this.$refs.fileInput.click();\n },\n remove: function remove(index) {\n this.clearInputElement();\n var removedFile = this.files.splice(index, 1)[0];\n this.files = _toConsumableArray(this.files);\n this.$emit('remove', {\n file: removedFile,\n files: this.files\n });\n },\n removeUploadedFile: function removeUploadedFile(index) {\n var removedFile = this.uploadedFiles.splice(index, 1)[0];\n this.uploadedFiles = _toConsumableArray(this.uploadedFiles);\n this.$emit('remove-uploaded-file', {\n file: removedFile,\n files: this.uploadedFiles\n });\n },\n clearInputElement: function clearInputElement() {\n this.$refs.fileInput.value = '';\n },\n clearIEInput: function clearIEInput() {\n if (this.$refs.fileInput) {\n this.duplicateIEEvent = true; //IE11 fix to prevent onFileChange trigger again\n this.$refs.fileInput.value = '';\n }\n },\n formatSize: function formatSize(bytes) {\n var _this$$primevue$confi;\n var k = 1024;\n var dm = 3;\n var sizes = ((_this$$primevue$confi = this.$primevue.config.locale) === null || _this$$primevue$confi === void 0 ? void 0 : _this$$primevue$confi.fileSizeTypes) || ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];\n if (bytes === 0) {\n return \"0 \".concat(sizes[0]);\n }\n var i = Math.floor(Math.log(bytes) / Math.log(k));\n var formattedSize = parseFloat((bytes / Math.pow(k, i)).toFixed(dm));\n return \"\".concat(formattedSize, \" \").concat(sizes[i]);\n },\n isFileLimitExceeded: function isFileLimitExceeded() {\n if (this.fileLimit && this.fileLimit <= this.files.length + this.uploadedFileCount && this.focused) {\n this.focused = false;\n }\n return this.fileLimit && this.fileLimit < this.files.length + this.uploadedFileCount;\n },\n checkFileLimit: function checkFileLimit() {\n if (this.isFileLimitExceeded()) {\n this.messages.push(this.invalidFileLimitMessage.replace('{0}', this.fileLimit.toString()));\n }\n },\n onMessageClose: function onMessageClose() {\n this.messages = null;\n }\n },\n computed: {\n isAdvanced: function isAdvanced() {\n return this.mode === 'advanced';\n },\n isBasic: function isBasic() {\n return this.mode === 'basic';\n },\n chooseButtonClass: function chooseButtonClass() {\n return [this.cx('chooseButton'), this[\"class\"]];\n },\n basicChooseButtonLabel: function basicChooseButtonLabel() {\n return this.auto ? this.chooseButtonLabel : this.hasFiles ? this.files.map(function (f) {\n return f.name;\n }).join(', ') : this.chooseButtonLabel;\n },\n hasFiles: function hasFiles() {\n return this.files && this.files.length > 0;\n },\n hasUploadedFiles: function hasUploadedFiles() {\n return this.uploadedFiles && this.uploadedFiles.length > 0;\n },\n chooseDisabled: function chooseDisabled() {\n return this.disabled || this.fileLimit && this.fileLimit <= this.files.length + this.uploadedFileCount;\n },\n uploadDisabled: function uploadDisabled() {\n return this.disabled || !this.hasFiles || this.fileLimit && this.fileLimit < this.files.length;\n },\n cancelDisabled: function cancelDisabled() {\n return this.disabled || !this.hasFiles;\n },\n chooseButtonLabel: function chooseButtonLabel() {\n return this.chooseLabel || this.$primevue.config.locale.choose;\n },\n uploadButtonLabel: function uploadButtonLabel() {\n return this.uploadLabel || this.$primevue.config.locale.upload;\n },\n cancelButtonLabel: function cancelButtonLabel() {\n return this.cancelLabel || this.$primevue.config.locale.cancel;\n },\n completedLabel: function completedLabel() {\n return this.$primevue.config.locale.completed;\n },\n pendingLabel: function pendingLabel() {\n return this.$primevue.config.locale.pending;\n }\n },\n components: {\n FileUploadButton: Button,\n FileUploadProgressBar: ProgressBar,\n FileUploadMessage: Message,\n FileContent: script$1,\n PlusIcon: PlusIcon,\n UploadIcon: UploadIcon,\n TimesIcon: TimesIcon\n },\n directives: {\n ripple: Ripple\n }\n};\n\nvar _hoisted_1 = [\"multiple\", \"accept\", \"disabled\"];\nvar _hoisted_2 = [\"accept\", \"disabled\", \"multiple\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n var _component_FileUploadButton = resolveComponent(\"FileUploadButton\");\n var _component_FileUploadProgressBar = resolveComponent(\"FileUploadProgressBar\");\n var _component_FileContent = resolveComponent(\"FileContent\");\n var _component_FileUploadMessage = resolveComponent(\"FileUploadMessage\");\n var _directive_ripple = resolveDirective(\"ripple\");\n return $options.isAdvanced ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('root')\n }, _ctx.ptmi('root')), [createElementVNode(\"input\", mergeProps({\n ref: \"fileInput\",\n type: \"file\",\n onChange: _cache[0] || (_cache[0] = function () {\n return $options.onFileSelect && $options.onFileSelect.apply($options, arguments);\n }),\n multiple: _ctx.multiple,\n accept: _ctx.accept,\n disabled: $options.chooseDisabled\n }, _ctx.ptm('input')), null, 16, _hoisted_1), createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('buttonbar')\n }, _ctx.ptm('buttonbar')), [renderSlot(_ctx.$slots, \"header\", {\n files: $data.files,\n uploadedFiles: $data.uploadedFiles,\n chooseCallback: $options.choose,\n uploadCallback: $options.upload,\n clearCallback: $options.clear\n }, function () {\n return [withDirectives((openBlock(), createElementBlock(\"span\", mergeProps({\n \"class\": $options.chooseButtonClass,\n style: _ctx.style,\n onClick: _cache[1] || (_cache[1] = function () {\n return $options.choose && $options.choose.apply($options, arguments);\n }),\n onKeydown: _cache[2] || (_cache[2] = withKeys(function () {\n return $options.choose && $options.choose.apply($options, arguments);\n }, [\"enter\"])),\n onFocus: _cache[3] || (_cache[3] = function () {\n return $options.onFocus && $options.onFocus.apply($options, arguments);\n }),\n onBlur: _cache[4] || (_cache[4] = function () {\n return $options.onBlur && $options.onBlur.apply($options, arguments);\n }),\n tabindex: \"0\"\n }, _ctx.ptm('chooseButton')), [renderSlot(_ctx.$slots, \"chooseicon\", {\n \"class\": normalizeClass(_ctx.cx('chooseIcon'))\n }, function () {\n return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.chooseIcon ? 'span' : 'PlusIcon'), mergeProps({\n \"class\": [_ctx.cx('chooseIcon'), _ctx.chooseIcon],\n \"aria-hidden\": \"true\"\n }, _ctx.ptm('chooseIcon')), null, 16, [\"class\"]))];\n }), createElementVNode(\"span\", mergeProps({\n \"class\": _ctx.cx('chooseButtonLabel')\n }, _ctx.ptm('chooseButtonLabel')), toDisplayString($options.chooseButtonLabel), 17)], 16)), [[_directive_ripple]]), _ctx.showUploadButton ? (openBlock(), createBlock(_component_FileUploadButton, {\n key: 0,\n label: $options.uploadButtonLabel,\n onClick: $options.upload,\n disabled: $options.uploadDisabled,\n unstyled: _ctx.unstyled,\n pt: _ctx.ptm('uploadButton')\n }, {\n icon: withCtx(function (iconProps) {\n return [renderSlot(_ctx.$slots, \"uploadicon\", {}, function () {\n return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.uploadIcon ? 'span' : 'UploadIcon'), mergeProps({\n \"class\": [iconProps[\"class\"], _ctx.uploadIcon],\n \"aria-hidden\": \"true\"\n }, _ctx.ptm('uploadButton')['icon'], {\n \"data-pc-section\": \"uploadbuttonicon\"\n }), null, 16, [\"class\"]))];\n })];\n }),\n _: 3\n }, 8, [\"label\", \"onClick\", \"disabled\", \"unstyled\", \"pt\"])) : createCommentVNode(\"\", true), _ctx.showCancelButton ? (openBlock(), createBlock(_component_FileUploadButton, {\n key: 1,\n label: $options.cancelButtonLabel,\n onClick: $options.clear,\n disabled: $options.cancelDisabled,\n unstyled: _ctx.unstyled,\n pt: _ctx.ptm('cancelButton')\n }, {\n icon: withCtx(function (iconProps) {\n return [renderSlot(_ctx.$slots, \"cancelicon\", {}, function () {\n return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.cancelIcon ? 'span' : 'TimesIcon'), mergeProps({\n \"class\": [iconProps[\"class\"], _ctx.cancelIcon],\n \"aria-hidden\": \"true\"\n }, _ctx.ptm('cancelButton')['icon'], {\n \"data-pc-section\": \"cancelbuttonicon\"\n }), null, 16, [\"class\"]))];\n })];\n }),\n _: 3\n }, 8, [\"label\", \"onClick\", \"disabled\", \"unstyled\", \"pt\"])) : createCommentVNode(\"\", true)];\n })], 16), createElementVNode(\"div\", mergeProps({\n ref: \"content\",\n \"class\": _ctx.cx('content'),\n onDragenter: _cache[5] || (_cache[5] = function () {\n return $options.onDragEnter && $options.onDragEnter.apply($options, arguments);\n }),\n onDragover: _cache[6] || (_cache[6] = function () {\n return $options.onDragOver && $options.onDragOver.apply($options, arguments);\n }),\n onDragleave: _cache[7] || (_cache[7] = function () {\n return $options.onDragLeave && $options.onDragLeave.apply($options, arguments);\n }),\n onDrop: _cache[8] || (_cache[8] = function () {\n return $options.onDrop && $options.onDrop.apply($options, arguments);\n })\n }, _ctx.ptm('content'), {\n \"data-p-highlight\": false\n }), [renderSlot(_ctx.$slots, \"content\", {\n files: $data.files,\n uploadedFiles: $data.uploadedFiles,\n removeUploadedFileCallback: $options.removeUploadedFile,\n removeFileCallback: $options.remove,\n progress: $data.progress,\n messages: $data.messages\n }, function () {\n return [$options.hasFiles ? (openBlock(), createElementBlock(Fragment, {\n key: 0\n }, [createVNode(_component_FileUploadProgressBar, {\n value: $data.progress,\n showValue: false,\n unstyled: _ctx.unstyled,\n pt: _ctx.ptm('progressbar')\n }, null, 8, [\"value\", \"unstyled\", \"pt\"]), createVNode(_component_FileContent, {\n files: $data.files,\n onRemove: $options.remove,\n badgeValue: $options.pendingLabel,\n previewWidth: _ctx.previewWidth,\n templates: _ctx.$slots,\n unstyled: _ctx.unstyled,\n pt: _ctx.pt\n }, null, 8, [\"files\", \"onRemove\", \"badgeValue\", \"previewWidth\", \"templates\", \"unstyled\", \"pt\"])], 64)) : createCommentVNode(\"\", true), (openBlock(true), createElementBlock(Fragment, null, renderList($data.messages, function (msg) {\n return openBlock(), createBlock(_component_FileUploadMessage, {\n key: msg,\n severity: \"error\",\n onClose: $options.onMessageClose,\n unstyled: _ctx.unstyled,\n pt: _ctx.ptm('message')\n }, {\n \"default\": withCtx(function () {\n return [createTextVNode(toDisplayString(msg), 1)];\n }),\n _: 2\n }, 1032, [\"onClose\", \"unstyled\", \"pt\"]);\n }), 128)), createVNode(_component_FileContent, {\n files: $data.uploadedFiles,\n onRemove: $options.removeUploadedFile,\n badgeValue: $options.completedLabel,\n badgeSeverity: \"success\",\n previewWidth: _ctx.previewWidth,\n templates: _ctx.$slots,\n unstyled: _ctx.unstyled,\n pt: _ctx.pt\n }, null, 8, [\"files\", \"onRemove\", \"badgeValue\", \"previewWidth\", \"templates\", \"unstyled\", \"pt\"])];\n }), _ctx.$slots.empty && !$options.hasFiles && !$options.hasUploadedFiles ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('empty')\n }, _ctx.ptm('empty')), [renderSlot(_ctx.$slots, \"empty\")], 16)) : createCommentVNode(\"\", true)], 16)], 16)) : $options.isBasic ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 1,\n \"class\": _ctx.cx('root')\n }, _ctx.ptmi('root')), [(openBlock(true), createElementBlock(Fragment, null, renderList($data.messages, function (msg) {\n return openBlock(), createBlock(_component_FileUploadMessage, {\n key: msg,\n severity: \"error\",\n onClose: $options.onMessageClose,\n unstyled: _ctx.unstyled,\n pt: _ctx.ptm('messages')\n }, {\n \"default\": withCtx(function () {\n return [createTextVNode(toDisplayString(msg), 1)];\n }),\n _: 2\n }, 1032, [\"onClose\", \"unstyled\", \"pt\"]);\n }), 128)), withDirectives((openBlock(), createElementBlock(\"span\", mergeProps({\n \"class\": $options.chooseButtonClass,\n style: _ctx.style,\n onMouseup: _cache[12] || (_cache[12] = function () {\n return $options.onBasicUploaderClick && $options.onBasicUploaderClick.apply($options, arguments);\n }),\n onKeydown: _cache[13] || (_cache[13] = withKeys(function () {\n return $options.choose && $options.choose.apply($options, arguments);\n }, [\"enter\"])),\n onFocus: _cache[14] || (_cache[14] = function () {\n return $options.onFocus && $options.onFocus.apply($options, arguments);\n }),\n onBlur: _cache[15] || (_cache[15] = function () {\n return $options.onBlur && $options.onBlur.apply($options, arguments);\n }),\n tabindex: \"0\"\n }, _ctx.ptm('chooseButton')), [!$options.hasFiles || _ctx.auto ? renderSlot(_ctx.$slots, \"uploadicon\", {\n key: 0,\n \"class\": normalizeClass(_ctx.cx('uploadIcon'))\n }, function () {\n return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.uploadIcon ? 'span' : 'UploadIcon'), mergeProps({\n \"class\": [_ctx.cx('uploadIcon'), _ctx.uploadIcon],\n \"aria-hidden\": \"true\"\n }, _ctx.ptm('uploadIcon')), null, 16, [\"class\"]))];\n }) : renderSlot(_ctx.$slots, \"chooseicon\", {\n key: 1,\n \"class\": normalizeClass(_ctx.cx('chooseIcon'))\n }, function () {\n return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.chooseIcon ? 'span' : 'PlusIcon'), mergeProps({\n \"class\": [_ctx.cx('chooseIcon'), _ctx.chooseIcon],\n \"aria-hidden\": \"true\"\n }, _ctx.ptm('chooseIcon')), null, 16, [\"class\"]))];\n }), createElementVNode(\"span\", mergeProps({\n \"class\": _ctx.cx('label')\n }, _ctx.ptm('label')), toDisplayString($options.basicChooseButtonLabel), 17), !$options.hasFiles ? (openBlock(), createElementBlock(\"input\", mergeProps({\n key: 2,\n ref: \"fileInput\",\n type: \"file\",\n accept: _ctx.accept,\n disabled: _ctx.disabled,\n multiple: _ctx.multiple,\n onChange: _cache[9] || (_cache[9] = function () {\n return $options.onFileSelect && $options.onFileSelect.apply($options, arguments);\n }),\n onFocus: _cache[10] || (_cache[10] = function () {\n return $options.onFocus && $options.onFocus.apply($options, arguments);\n }),\n onBlur: _cache[11] || (_cache[11] = function () {\n return $options.onBlur && $options.onBlur.apply($options, arguments);\n })\n }, _ctx.ptm('input')), null, 16, _hoisted_2)) : createCommentVNode(\"\", true)], 16)), [[_directive_ripple]])], 16)) : createCommentVNode(\"\", true);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseIcon from 'primevue/baseicon';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode } from 'vue';\n\nvar script = {\n name: 'RefreshIcon',\n \"extends\": BaseIcon\n};\n\nvar _hoisted_1 = /*#__PURE__*/createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n \"clip-rule\": \"evenodd\",\n d: \"M6.77051 5.96336C6.84324 5.99355 6.92127 6.00891 7.00002 6.00854C7.07877 6.00891 7.1568 5.99355 7.22953 5.96336C7.30226 5.93317 7.36823 5.88876 7.42357 5.83273L9.82101 3.43529C9.93325 3.32291 9.99629 3.17058 9.99629 3.01175C9.99629 2.85292 9.93325 2.70058 9.82101 2.5882L7.42357 0.190763C7.3687 0.131876 7.30253 0.0846451 7.22901 0.0518865C7.15549 0.019128 7.07612 0.00151319 6.99564 9.32772e-05C6.91517 -0.00132663 6.83523 0.0134773 6.7606 0.0436218C6.68597 0.0737664 6.61817 0.118634 6.56126 0.175548C6.50435 0.232462 6.45948 0.300257 6.42933 0.374888C6.39919 0.449519 6.38439 0.529456 6.38581 0.609933C6.38722 0.690409 6.40484 0.769775 6.4376 0.843296C6.47036 0.916817 6.51759 0.982986 6.57647 1.03786L7.95103 2.41241H6.99998C5.46337 2.41241 3.98969 3.02283 2.90314 4.10938C1.81659 5.19593 1.20618 6.66961 1.20618 8.20622C1.20618 9.74283 1.81659 11.2165 2.90314 12.3031C3.98969 13.3896 5.46337 14 6.99998 14C8.53595 13.9979 10.0084 13.3868 11.0945 12.3007C12.1806 11.2146 12.7917 9.74218 12.7938 8.20622C12.7938 8.04726 12.7306 7.89481 12.6182 7.78241C12.5058 7.67001 12.3534 7.60686 12.1944 7.60686C12.0355 7.60686 11.883 7.67001 11.7706 7.78241C11.6582 7.89481 11.5951 8.04726 11.5951 8.20622C11.5951 9.11504 11.3256 10.0035 10.8207 10.7591C10.3157 11.5148 9.59809 12.1037 8.75845 12.4515C7.9188 12.7993 6.99489 12.8903 6.10353 12.713C5.21217 12.5357 4.3934 12.0981 3.75077 11.4554C3.10813 10.8128 2.67049 9.99404 2.49319 9.10268C2.31589 8.21132 2.40688 7.2874 2.75468 6.44776C3.10247 5.60811 3.69143 4.89046 4.44709 4.38554C5.20275 3.88063 6.09116 3.61113 6.99998 3.61113H7.95098L6.57647 4.98564C6.46423 5.09802 6.40119 5.25035 6.40119 5.40918C6.40119 5.56801 6.46423 5.72035 6.57647 5.83273C6.63181 5.88876 6.69778 5.93317 6.77051 5.96336Z\",\n fill: \"currentColor\"\n}, null, -1);\nvar _hoisted_2 = [_hoisted_1];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", mergeProps({\n width: \"14\",\n height: \"14\",\n viewBox: \"0 0 14 14\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, _ctx.pti()), _hoisted_2, 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseIcon from 'primevue/baseicon';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode } from 'vue';\n\nvar script = {\n name: 'SearchMinusIcon',\n \"extends\": BaseIcon\n};\n\nvar _hoisted_1 = /*#__PURE__*/createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n \"clip-rule\": \"evenodd\",\n d: \"M6.0208 12.0411C4.83005 12.0411 3.66604 11.688 2.67596 11.0265C1.68589 10.3649 0.914216 9.42464 0.458534 8.32452C0.00285271 7.22441 -0.116374 6.01388 0.11593 4.84601C0.348235 3.67813 0.921637 2.60537 1.76363 1.76338C2.60562 0.921393 3.67838 0.34799 4.84625 0.115686C6.01412 -0.116618 7.22466 0.00260857 8.32477 0.45829C9.42488 0.913972 10.3652 1.68564 11.0267 2.67572C11.6883 3.66579 12.0414 4.8298 12.0414 6.02056C12.0395 7.41563 11.5542 8.76029 10.6783 9.8305L13.8244 12.9765C13.9367 13.089 13.9997 13.2414 13.9997 13.4003C13.9997 13.5592 13.9367 13.7116 13.8244 13.8241C13.769 13.8801 13.703 13.9245 13.6302 13.9548C13.5575 13.985 13.4794 14.0003 13.4006 14C13.3218 14.0003 13.2437 13.985 13.171 13.9548C13.0982 13.9245 13.0322 13.8801 12.9768 13.8241L9.83082 10.678C8.76059 11.5539 7.4159 12.0393 6.0208 12.0411ZM6.0208 1.20731C5.07199 1.20731 4.14449 1.48867 3.35559 2.0158C2.56669 2.54292 1.95181 3.29215 1.58872 4.16874C1.22562 5.04532 1.13062 6.00989 1.31572 6.94046C1.50083 7.87104 1.95772 8.72583 2.62863 9.39674C3.29954 10.0676 4.15433 10.5245 5.0849 10.7096C6.01548 10.8947 6.98005 10.7997 7.85663 10.4367C8.73322 10.0736 9.48244 9.45868 10.0096 8.66978C10.5367 7.88088 10.8181 6.95337 10.8181 6.00457C10.8181 4.73226 10.3126 3.51206 9.41297 2.6124C8.51331 1.71274 7.29311 1.20731 6.0208 1.20731ZM4.00591 6.60422H8.00362C8.16266 6.60422 8.31518 6.54104 8.42764 6.42859C8.5401 6.31613 8.60328 6.1636 8.60328 6.00456C8.60328 5.84553 8.5401 5.693 8.42764 5.58054C8.31518 5.46809 8.16266 5.40491 8.00362 5.40491H4.00591C3.84687 5.40491 3.69434 5.46809 3.58189 5.58054C3.46943 5.693 3.40625 5.84553 3.40625 6.00456C3.40625 6.1636 3.46943 6.31613 3.58189 6.42859C3.69434 6.54104 3.84687 6.60422 4.00591 6.60422Z\",\n fill: \"currentColor\"\n}, null, -1);\nvar _hoisted_2 = [_hoisted_1];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", mergeProps({\n width: \"14\",\n height: \"14\",\n viewBox: \"0 0 14 14\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, _ctx.pti()), _hoisted_2, 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseIcon from 'primevue/baseicon';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode } from 'vue';\n\nvar script = {\n name: 'SearchPlusIcon',\n \"extends\": BaseIcon\n};\n\nvar _hoisted_1 = /*#__PURE__*/createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n \"clip-rule\": \"evenodd\",\n d: \"M2.67596 11.0265C3.66604 11.688 4.83005 12.0411 6.0208 12.0411C6.81143 12.0411 7.59432 11.8854 8.32477 11.5828C8.86999 11.357 9.37802 11.0526 9.83311 10.6803L12.9768 13.8241C13.0322 13.8801 13.0982 13.9245 13.171 13.9548C13.2437 13.985 13.3218 14.0003 13.4006 14C13.4794 14.0003 13.5575 13.985 13.6302 13.9548C13.703 13.9245 13.769 13.8801 13.8244 13.8241C13.9367 13.7116 13.9997 13.5592 13.9997 13.4003C13.9997 13.2414 13.9367 13.089 13.8244 12.9765L10.6806 9.8328C11.0529 9.37773 11.3572 8.86972 11.5831 8.32452C11.8856 7.59408 12.0414 6.81119 12.0414 6.02056C12.0414 4.8298 11.6883 3.66579 11.0267 2.67572C10.3652 1.68564 9.42488 0.913972 8.32477 0.45829C7.22466 0.00260857 6.01412 -0.116618 4.84625 0.115686C3.67838 0.34799 2.60562 0.921393 1.76363 1.76338C0.921637 2.60537 0.348235 3.67813 0.11593 4.84601C-0.116374 6.01388 0.00285271 7.22441 0.458534 8.32452C0.914216 9.42464 1.68589 10.3649 2.67596 11.0265ZM3.35559 2.0158C4.14449 1.48867 5.07199 1.20731 6.0208 1.20731C7.29311 1.20731 8.51331 1.71274 9.41297 2.6124C10.3126 3.51206 10.8181 4.73226 10.8181 6.00457C10.8181 6.95337 10.5367 7.88088 10.0096 8.66978C9.48244 9.45868 8.73322 10.0736 7.85663 10.4367C6.98005 10.7997 6.01548 10.8947 5.0849 10.7096C4.15433 10.5245 3.29954 10.0676 2.62863 9.39674C1.95772 8.72583 1.50083 7.87104 1.31572 6.94046C1.13062 6.00989 1.22562 5.04532 1.58872 4.16874C1.95181 3.29215 2.56669 2.54292 3.35559 2.0158ZM6.00481 8.60309C5.84641 8.60102 5.69509 8.53718 5.58308 8.42517C5.47107 8.31316 5.40722 8.16183 5.40515 8.00344V6.60422H4.00591C3.84687 6.60422 3.69434 6.54104 3.58189 6.42859C3.46943 6.31613 3.40625 6.1636 3.40625 6.00456C3.40625 5.84553 3.46943 5.693 3.58189 5.58054C3.69434 5.46809 3.84687 5.40491 4.00591 5.40491H5.40515V4.00572C5.40515 3.84668 5.46833 3.69416 5.58079 3.5817C5.69324 3.46924 5.84577 3.40607 6.00481 3.40607C6.16385 3.40607 6.31637 3.46924 6.42883 3.5817C6.54129 3.69416 6.60447 3.84668 6.60447 4.00572V5.40491H8.00362C8.16266 5.40491 8.31518 5.46809 8.42764 5.58054C8.5401 5.693 8.60328 5.84553 8.60328 6.00456C8.60328 6.1636 8.5401 6.31613 8.42764 6.42859C8.31518 6.54104 8.16266 6.60422 8.00362 6.60422H6.60447V8.00344C6.60239 8.16183 6.53855 8.31316 6.42654 8.42517C6.31453 8.53718 6.1632 8.60102 6.00481 8.60309Z\",\n fill: \"currentColor\"\n}, null, -1);\nvar _hoisted_2 = [_hoisted_1];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", mergeProps({\n width: \"14\",\n height: \"14\",\n viewBox: \"0 0 14 14\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, _ctx.pti()), _hoisted_2, 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseIcon from 'primevue/baseicon';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode } from 'vue';\n\nvar script = {\n name: 'UndoIcon',\n \"extends\": BaseIcon\n};\n\nvar _hoisted_1 = /*#__PURE__*/createElementVNode(\"path\", {\n \"fill-rule\": \"evenodd\",\n \"clip-rule\": \"evenodd\",\n d: \"M6.77042 5.96336C6.84315 5.99355 6.92118 6.00891 6.99993 6.00854C7.07868 6.00891 7.15671 5.99355 7.22944 5.96336C7.30217 5.93317 7.36814 5.88876 7.42348 5.83273C7.53572 5.72035 7.59876 5.56801 7.59876 5.40918C7.59876 5.25035 7.53572 5.09802 7.42348 4.98564L6.04897 3.61113H6.99998C7.9088 3.61113 8.79722 3.88063 9.55288 4.38554C10.3085 4.89046 10.8975 5.60811 11.2453 6.44776C11.5931 7.2874 11.6841 8.21132 11.5068 9.10268C11.3295 9.99404 10.8918 10.8128 10.2492 11.4554C9.60657 12.0981 8.7878 12.5357 7.89644 12.713C7.00508 12.8903 6.08116 12.7993 5.24152 12.4515C4.40188 12.1037 3.68422 11.5148 3.17931 10.7591C2.67439 10.0035 2.4049 9.11504 2.4049 8.20622C2.4049 8.04726 2.34175 7.89481 2.22935 7.78241C2.11695 7.67001 1.9645 7.60686 1.80554 7.60686C1.64658 7.60686 1.49413 7.67001 1.38172 7.78241C1.26932 7.89481 1.20618 8.04726 1.20618 8.20622C1.20829 9.74218 1.81939 11.2146 2.90548 12.3007C3.99157 13.3868 5.46402 13.9979 6.99998 14C8.5366 14 10.0103 13.3896 11.0968 12.3031C12.1834 11.2165 12.7938 9.74283 12.7938 8.20622C12.7938 6.66961 12.1834 5.19593 11.0968 4.10938C10.0103 3.02283 8.5366 2.41241 6.99998 2.41241H6.04892L7.42348 1.03786C7.48236 0.982986 7.5296 0.916817 7.56235 0.843296C7.59511 0.769775 7.61273 0.690409 7.61415 0.609933C7.61557 0.529456 7.60076 0.449519 7.57062 0.374888C7.54047 0.300257 7.49561 0.232462 7.43869 0.175548C7.38178 0.118634 7.31398 0.0737664 7.23935 0.0436218C7.16472 0.0134773 7.08478 -0.00132663 7.00431 9.32772e-05C6.92383 0.00151319 6.84447 0.019128 6.77095 0.0518865C6.69742 0.0846451 6.63126 0.131876 6.57638 0.190763L4.17895 2.5882C4.06671 2.70058 4.00366 2.85292 4.00366 3.01175C4.00366 3.17058 4.06671 3.32291 4.17895 3.43529L6.57638 5.83273C6.63172 5.88876 6.69769 5.93317 6.77042 5.96336Z\",\n fill: \"currentColor\"\n}, null, -1);\nvar _hoisted_2 = [_hoisted_1];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"svg\", mergeProps({\n width: \"14\",\n height: \"14\",\n viewBox: \"0 0 14 14\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, _ctx.pti()), _hoisted_2, 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\nvar classes = {\n root: function root(_ref) {\n var props = _ref.props;\n return ['p-image p-component', {\n 'p-image-preview-container': props.preview\n }];\n },\n image: function image(_ref2) {\n var props = _ref2.props;\n return props.image;\n },\n button: 'p-image-preview-indicator',\n icon: 'p-image-preview-icon',\n mask: 'p-image-mask p-component-overlay p-component-overlay-enter',\n toolbar: 'p-image-toolbar',\n rotateRightButton: 'p-image-action p-link',\n rotateLeftButton: 'p-image-action p-link',\n zoomOutButton: function zoomOutButton(_ref3) {\n var instance = _ref3.instance;\n return ['p-image-action p-link', {\n 'p-disabled': instance.isZoomOutDisabled\n }];\n },\n zoomInButton: function zoomInButton(_ref4) {\n var instance = _ref4.instance;\n return ['p-image-action p-link', {\n 'p-disabled': instance.isZoomInDisabled\n }];\n },\n closeButton: 'p-image-action p-link',\n preview: 'p-image-preview'\n};\nvar ImageStyle = BaseStyle.extend({\n name: 'image',\n classes: classes\n});\n\nexport { ImageStyle as default };\n","import FocusTrap from 'primevue/focustrap';\nimport EyeIcon from 'primevue/icons/eye';\nimport RefreshIcon from 'primevue/icons/refresh';\nimport SearchMinusIcon from 'primevue/icons/searchminus';\nimport SearchPlusIcon from 'primevue/icons/searchplus';\nimport TimesIcon from 'primevue/icons/times';\nimport UndoIcon from 'primevue/icons/undo';\nimport Portal from 'primevue/portal';\nimport { ZIndexUtils, DomHandler } from 'primevue/utils';\nimport BaseComponent from 'primevue/basecomponent';\nimport ImageStyle from 'primevue/image/style';\nimport { resolveComponent, resolveDirective, openBlock, createElementBlock, mergeProps, renderSlot, createElementVNode, createBlock, resolveDynamicComponent, createCommentVNode, createVNode, withCtx, withDirectives, normalizeProps, guardReactiveProps, Transition, normalizeClass, normalizeStyle } from 'vue';\n\nvar script$1 = {\n name: 'BaseImage',\n \"extends\": BaseComponent,\n props: {\n preview: {\n type: Boolean,\n \"default\": false\n },\n \"class\": {\n type: null,\n \"default\": null\n },\n style: {\n type: null,\n \"default\": null\n },\n imageStyle: {\n type: null,\n \"default\": null\n },\n imageClass: {\n type: null,\n \"default\": null\n },\n previewButtonProps: {\n type: null,\n \"default\": null\n },\n indicatorIcon: {\n type: String,\n \"default\": undefined\n },\n zoomInDisabled: {\n type: Boolean,\n \"default\": false\n },\n zoomOutDisabled: {\n type: Boolean,\n \"default\": false\n }\n },\n style: ImageStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script = {\n name: 'Image',\n \"extends\": script$1,\n inheritAttrs: false,\n emits: ['show', 'hide', 'error'],\n mask: null,\n data: function data() {\n return {\n maskVisible: false,\n previewVisible: false,\n rotate: 0,\n scale: 1\n };\n },\n beforeUnmount: function beforeUnmount() {\n if (this.mask) {\n ZIndexUtils.clear(this.container);\n }\n },\n methods: {\n maskRef: function maskRef(el) {\n this.mask = el;\n },\n toolbarRef: function toolbarRef(el) {\n this.toolbarRef = el;\n },\n onImageClick: function onImageClick() {\n var _this = this;\n if (this.preview) {\n DomHandler.blockBodyScroll();\n this.maskVisible = true;\n setTimeout(function () {\n _this.previewVisible = true;\n }, 25);\n }\n },\n onPreviewImageClick: function onPreviewImageClick() {\n this.previewClick = true;\n },\n onMaskClick: function onMaskClick(event) {\n var isBarActionsClicked = DomHandler.isAttributeEquals(event.target, 'data-pc-section-group', 'action') || event.target.closest('[data-pc-section-group=\"action\"]');\n if (!this.previewClick && !isBarActionsClicked) {\n this.previewVisible = false;\n this.rotate = 0;\n this.scale = 1;\n }\n this.previewClick = false;\n },\n onMaskKeydown: function onMaskKeydown(event) {\n var _this2 = this;\n switch (event.code) {\n case 'Escape':\n this.hidePreview();\n setTimeout(function () {\n DomHandler.focus(_this2.$refs.previewButton);\n }, 200);\n event.preventDefault();\n break;\n }\n },\n onError: function onError() {\n this.$emit('error');\n },\n rotateRight: function rotateRight() {\n this.rotate += 90;\n this.previewClick = true;\n },\n rotateLeft: function rotateLeft() {\n this.rotate -= 90;\n this.previewClick = true;\n },\n zoomIn: function zoomIn() {\n this.scale = this.scale + 0.1;\n this.previewClick = true;\n },\n zoomOut: function zoomOut() {\n this.scale = this.scale - 0.1;\n this.previewClick = true;\n },\n onBeforeEnter: function onBeforeEnter() {\n ZIndexUtils.set('modal', this.mask, this.$primevue.config.zIndex.modal);\n },\n onEnter: function onEnter() {\n this.focus();\n this.$emit('show');\n },\n onBeforeLeave: function onBeforeLeave() {\n !this.isUnstyled && DomHandler.addClass(this.mask, 'p-component-overlay-leave');\n },\n onLeave: function onLeave() {\n DomHandler.unblockBodyScroll();\n this.$emit('hide');\n },\n onAfterLeave: function onAfterLeave(el) {\n ZIndexUtils.clear(el);\n this.maskVisible = false;\n },\n focus: function focus() {\n var focusTarget = this.mask.querySelector('[autofocus]');\n if (focusTarget) {\n focusTarget.focus();\n }\n },\n hidePreview: function hidePreview() {\n this.previewVisible = false;\n this.rotate = 0;\n this.scale = 1;\n DomHandler.unblockBodyScroll();\n }\n },\n computed: {\n containerClass: function containerClass() {\n return [this.cx('root'), this[\"class\"]];\n },\n rotateClass: function rotateClass() {\n return 'p-image-preview-rotate-' + this.rotate;\n },\n imagePreviewStyle: function imagePreviewStyle() {\n return {\n transform: 'rotate(' + this.rotate + 'deg) scale(' + this.scale + ')'\n };\n },\n isZoomInDisabled: function isZoomInDisabled() {\n return this.zoomInDisabled || this.scale >= 1.5;\n },\n isZoomOutDisabled: function isZoomOutDisabled() {\n return this.zoomOutDisabled || this.scale <= 0.5;\n },\n rightAriaLabel: function rightAriaLabel() {\n return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.rotateRight : undefined;\n },\n leftAriaLabel: function leftAriaLabel() {\n return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.rotateLeft : undefined;\n },\n zoomInAriaLabel: function zoomInAriaLabel() {\n return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.zoomIn : undefined;\n },\n zoomOutAriaLabel: function zoomOutAriaLabel() {\n return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.zoomOut : undefined;\n },\n zoomImageAriaLabel: function zoomImageAriaLabel() {\n return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.zoomImage : undefined;\n },\n closeAriaLabel: function closeAriaLabel() {\n return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.close : undefined;\n }\n },\n components: {\n Portal: Portal,\n EyeIcon: EyeIcon,\n RefreshIcon: RefreshIcon,\n UndoIcon: UndoIcon,\n SearchMinusIcon: SearchMinusIcon,\n SearchPlusIcon: SearchPlusIcon,\n TimesIcon: TimesIcon\n },\n directives: {\n focustrap: FocusTrap\n }\n};\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar _hoisted_1 = [\"aria-label\"];\nvar _hoisted_2 = [\"aria-modal\"];\nvar _hoisted_3 = [\"aria-label\"];\nvar _hoisted_4 = [\"aria-label\"];\nvar _hoisted_5 = [\"disabled\", \"aria-label\"];\nvar _hoisted_6 = [\"disabled\", \"aria-label\"];\nvar _hoisted_7 = [\"aria-label\"];\nvar _hoisted_8 = [\"src\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n var _component_RefreshIcon = resolveComponent(\"RefreshIcon\");\n var _component_UndoIcon = resolveComponent(\"UndoIcon\");\n var _component_SearchMinusIcon = resolveComponent(\"SearchMinusIcon\");\n var _component_SearchPlusIcon = resolveComponent(\"SearchPlusIcon\");\n var _component_TimesIcon = resolveComponent(\"TimesIcon\");\n var _component_Portal = resolveComponent(\"Portal\");\n var _directive_focustrap = resolveDirective(\"focustrap\");\n return openBlock(), createElementBlock(\"span\", mergeProps({\n \"class\": $options.containerClass,\n style: _ctx.style\n }, _ctx.ptmi('root')), [renderSlot(_ctx.$slots, \"image\", {\n onError: $options.onError,\n errorCallback: $options.onError\n }, function () {\n return [createElementVNode(\"img\", mergeProps({\n style: _ctx.imageStyle,\n \"class\": [_ctx.cx('image'), _ctx.imageClass],\n onError: _cache[0] || (_cache[0] = function () {\n return $options.onError && $options.onError.apply($options, arguments);\n })\n }, _objectSpread(_objectSpread({}, _ctx.$attrs), _ctx.ptm('image'))), null, 16)];\n }), _ctx.preview ? (openBlock(), createElementBlock(\"button\", mergeProps({\n key: 0,\n ref: \"previewButton\",\n \"aria-label\": $options.zoomImageAriaLabel,\n type: \"button\",\n \"class\": _ctx.cx('button'),\n onClick: _cache[1] || (_cache[1] = function () {\n return $options.onImageClick && $options.onImageClick.apply($options, arguments);\n })\n }, _objectSpread(_objectSpread({}, _ctx.previewButtonProps), _ctx.ptm('button'))), [renderSlot(_ctx.$slots, \"indicatoricon\", {}, function () {\n return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.indicatorIcon ? 'i' : 'EyeIcon'), mergeProps({\n \"class\": _ctx.cx('icon')\n }, _ctx.ptm('icon')), null, 16, [\"class\"]))];\n })], 16, _hoisted_1)) : createCommentVNode(\"\", true), createVNode(_component_Portal, null, {\n \"default\": withCtx(function () {\n return [$data.maskVisible ? withDirectives((openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n ref: $options.maskRef,\n role: \"dialog\",\n \"class\": _ctx.cx('mask'),\n \"aria-modal\": $data.maskVisible,\n onClick: _cache[8] || (_cache[8] = function () {\n return $options.onMaskClick && $options.onMaskClick.apply($options, arguments);\n }),\n onKeydown: _cache[9] || (_cache[9] = function () {\n return $options.onMaskKeydown && $options.onMaskKeydown.apply($options, arguments);\n })\n }, _ctx.ptm('mask')), [createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('toolbar')\n }, _ctx.ptm('toolbar')), [createElementVNode(\"button\", mergeProps({\n \"class\": _ctx.cx('rotateRightButton'),\n onClick: _cache[2] || (_cache[2] = function () {\n return $options.rotateRight && $options.rotateRight.apply($options, arguments);\n }),\n type: \"button\",\n \"aria-label\": $options.rightAriaLabel\n }, _ctx.ptm('rotateRightButton'), {\n \"data-pc-group-section\": \"action\"\n }), [renderSlot(_ctx.$slots, \"refresh\", {}, function () {\n return [createVNode(_component_RefreshIcon, normalizeProps(guardReactiveProps(_ctx.ptm('rotateRightIcon'))), null, 16)];\n })], 16, _hoisted_3), createElementVNode(\"button\", mergeProps({\n \"class\": _ctx.cx('rotateLeftButton'),\n onClick: _cache[3] || (_cache[3] = function () {\n return $options.rotateLeft && $options.rotateLeft.apply($options, arguments);\n }),\n type: \"button\",\n \"aria-label\": $options.leftAriaLabel\n }, _ctx.ptm('rotateLeftButton'), {\n \"data-pc-group-section\": \"action\"\n }), [renderSlot(_ctx.$slots, \"undo\", {}, function () {\n return [createVNode(_component_UndoIcon, normalizeProps(guardReactiveProps(_ctx.ptm('rotateLeftIcon'))), null, 16)];\n })], 16, _hoisted_4), createElementVNode(\"button\", mergeProps({\n \"class\": _ctx.cx('zoomOutButton'),\n onClick: _cache[4] || (_cache[4] = function () {\n return $options.zoomOut && $options.zoomOut.apply($options, arguments);\n }),\n type: \"button\",\n disabled: $options.isZoomOutDisabled,\n \"aria-label\": $options.zoomOutAriaLabel\n }, _ctx.ptm('zoomOutButton'), {\n \"data-pc-group-section\": \"action\"\n }), [renderSlot(_ctx.$slots, \"zoomout\", {}, function () {\n return [createVNode(_component_SearchMinusIcon, normalizeProps(guardReactiveProps(_ctx.ptm('zoomOutIcon'))), null, 16)];\n })], 16, _hoisted_5), createElementVNode(\"button\", mergeProps({\n \"class\": _ctx.cx('zoomInButton'),\n onClick: _cache[5] || (_cache[5] = function () {\n return $options.zoomIn && $options.zoomIn.apply($options, arguments);\n }),\n type: \"button\",\n disabled: $options.isZoomInDisabled,\n \"aria-label\": $options.zoomInAriaLabel\n }, _ctx.ptm('zoomInButton'), {\n \"data-pc-group-section\": \"action\"\n }), [renderSlot(_ctx.$slots, \"zoomin\", {}, function () {\n return [createVNode(_component_SearchPlusIcon, normalizeProps(guardReactiveProps(_ctx.ptm('zoomInIcon'))), null, 16)];\n })], 16, _hoisted_6), createElementVNode(\"button\", mergeProps({\n \"class\": _ctx.cx('closeButton'),\n type: \"button\",\n onClick: _cache[6] || (_cache[6] = function () {\n return $options.hidePreview && $options.hidePreview.apply($options, arguments);\n }),\n \"aria-label\": $options.closeAriaLabel,\n autofocus: \"\"\n }, _ctx.ptm('closeButton'), {\n \"data-pc-group-section\": \"action\"\n }), [renderSlot(_ctx.$slots, \"close\", {}, function () {\n return [createVNode(_component_TimesIcon, normalizeProps(guardReactiveProps(_ctx.ptm('closeIcon'))), null, 16)];\n })], 16, _hoisted_7)], 16), createVNode(Transition, mergeProps({\n name: \"p-image-preview\",\n onBeforeEnter: $options.onBeforeEnter,\n onEnter: $options.onEnter,\n onLeave: $options.onLeave,\n onBeforeLeave: $options.onBeforeLeave,\n onAfterLeave: $options.onAfterLeave\n }, _ctx.ptm('transition')), {\n \"default\": withCtx(function () {\n return [$data.previewVisible ? (openBlock(), createElementBlock(\"div\", normalizeProps(mergeProps({\n key: 0\n }, _ctx.ptm('previewContainer'))), [renderSlot(_ctx.$slots, \"preview\", {\n \"class\": normalizeClass(_ctx.cx('preview')),\n style: normalizeStyle($options.imagePreviewStyle),\n onClick: $options.onPreviewImageClick,\n previewCallback: $options.onPreviewImageClick\n }, function () {\n return [createElementVNode(\"img\", mergeProps({\n src: _ctx.$attrs.src,\n \"class\": _ctx.cx('preview'),\n style: $options.imagePreviewStyle,\n onClick: _cache[7] || (_cache[7] = function () {\n return $options.onPreviewImageClick && $options.onPreviewImageClick.apply($options, arguments);\n })\n }, _ctx.ptm('preview')), null, 16, _hoisted_8)];\n })], 16)) : createCommentVNode(\"\", true)];\n }),\n _: 3\n }, 16, [\"onBeforeEnter\", \"onEnter\", \"onLeave\", \"onBeforeLeave\", \"onAfterLeave\"])], 16, _hoisted_2)), [[_directive_focustrap]]) : createCommentVNode(\"\", true)];\n }),\n _: 3\n })], 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\nvar classes = {\n root: function root(_ref) {\n var props = _ref.props;\n return ['p-tabview p-component', {\n 'p-tabview-scrollable': props.scrollable\n }];\n },\n navContainer: 'p-tabview-nav-container',\n previousButton: 'p-tabview-nav-prev p-tabview-nav-btn p-link',\n navContent: 'p-tabview-nav-content',\n nav: 'p-tabview-nav',\n tab: {\n header: function header(_ref2) {\n var instance = _ref2.instance,\n tab = _ref2.tab,\n index = _ref2.index;\n return ['p-tabview-header', instance.getTabProp(tab, 'headerClass'), {\n 'p-highlight': instance.d_activeIndex === index,\n 'p-disabled': instance.getTabProp(tab, 'disabled')\n }];\n },\n headerAction: 'p-tabview-nav-link p-tabview-header-action',\n headerTitle: 'p-tabview-title',\n content: function content(_ref3) {\n var instance = _ref3.instance,\n tab = _ref3.tab;\n return ['p-tabview-panel', instance.getTabProp(tab, 'contentClass')];\n }\n },\n inkbar: 'p-tabview-ink-bar',\n nextButton: 'p-tabview-nav-next p-tabview-nav-btn p-link',\n panelContainer: 'p-tabview-panels'\n};\nvar TabViewStyle = BaseStyle.extend({\n name: 'tabview',\n classes: classes\n});\n\nexport { TabViewStyle as default };\n","import ChevronLeftIcon from 'primevue/icons/chevronleft';\nimport ChevronRightIcon from 'primevue/icons/chevronright';\nimport Ripple from 'primevue/ripple';\nimport { UniqueComponentId, DomHandler } from 'primevue/utils';\nimport { mergeProps, resolveDirective, openBlock, createElementBlock, createElementVNode, withDirectives, renderSlot, createBlock, resolveDynamicComponent, createCommentVNode, Fragment, renderList, toDisplayString, vShow } from 'vue';\nimport BaseComponent from 'primevue/basecomponent';\nimport TabViewStyle from 'primevue/tabview/style';\n\nvar script$1 = {\n name: 'BaseTabView',\n \"extends\": BaseComponent,\n props: {\n activeIndex: {\n type: Number,\n \"default\": 0\n },\n lazy: {\n type: Boolean,\n \"default\": false\n },\n scrollable: {\n type: Boolean,\n \"default\": false\n },\n tabindex: {\n type: Number,\n \"default\": 0\n },\n selectOnFocus: {\n type: Boolean,\n \"default\": false\n },\n previousButtonProps: {\n type: null,\n \"default\": null\n },\n nextButtonProps: {\n type: null,\n \"default\": null\n },\n prevIcon: {\n type: String,\n \"default\": undefined\n },\n nextIcon: {\n type: String,\n \"default\": undefined\n }\n },\n style: TabViewStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script = {\n name: 'TabView',\n \"extends\": script$1,\n inheritAttrs: false,\n emits: ['update:activeIndex', 'tab-change', 'tab-click'],\n data: function data() {\n return {\n id: this.$attrs.id,\n d_activeIndex: this.activeIndex,\n isPrevButtonDisabled: true,\n isNextButtonDisabled: false\n };\n },\n watch: {\n '$attrs.id': function $attrsId(newValue) {\n this.id = newValue || UniqueComponentId();\n },\n activeIndex: function activeIndex(newValue) {\n this.d_activeIndex = newValue;\n this.scrollInView({\n index: newValue\n });\n }\n },\n mounted: function mounted() {\n this.id = this.id || UniqueComponentId();\n this.updateInkBar();\n this.scrollable && this.updateButtonState();\n },\n updated: function updated() {\n this.updateInkBar();\n this.scrollable && this.updateButtonState();\n },\n methods: {\n isTabPanel: function isTabPanel(child) {\n return child.type.name === 'TabPanel';\n },\n isTabActive: function isTabActive(index) {\n return this.d_activeIndex === index;\n },\n getTabProp: function getTabProp(tab, name) {\n return tab.props ? tab.props[name] : undefined;\n },\n getKey: function getKey(tab, index) {\n return this.getTabProp(tab, 'header') || index;\n },\n getTabHeaderActionId: function getTabHeaderActionId(index) {\n return \"\".concat(this.id, \"_\").concat(index, \"_header_action\");\n },\n getTabContentId: function getTabContentId(index) {\n return \"\".concat(this.id, \"_\").concat(index, \"_content\");\n },\n getTabPT: function getTabPT(tab, key, index) {\n var count = this.tabs.length;\n var tabMetaData = {\n props: tab.props,\n parent: {\n instance: this,\n props: this.$props,\n state: this.$data\n },\n context: {\n index: index,\n count: count,\n first: index === 0,\n last: index === count - 1,\n active: this.isTabActive(index)\n }\n };\n return mergeProps(this.ptm(\"tab.\".concat(key), {\n tab: tabMetaData\n }), this.ptm(\"tabpanel.\".concat(key), {\n tabpanel: tabMetaData\n }), this.ptm(\"tabpanel.\".concat(key), tabMetaData), this.ptmo(this.getTabProp(tab, 'pt'), key, tabMetaData));\n },\n onScroll: function onScroll(event) {\n this.scrollable && this.updateButtonState();\n event.preventDefault();\n },\n onPrevButtonClick: function onPrevButtonClick() {\n var content = this.$refs.content;\n var width = DomHandler.getWidth(content);\n var pos = content.scrollLeft - width;\n content.scrollLeft = pos <= 0 ? 0 : pos;\n },\n onNextButtonClick: function onNextButtonClick() {\n var content = this.$refs.content;\n var width = DomHandler.getWidth(content) - this.getVisibleButtonWidths();\n var pos = content.scrollLeft + width;\n var lastPos = content.scrollWidth - width;\n content.scrollLeft = pos >= lastPos ? lastPos : pos;\n },\n onTabClick: function onTabClick(event, tab, index) {\n this.changeActiveIndex(event, tab, index);\n this.$emit('tab-click', {\n originalEvent: event,\n index: index\n });\n },\n onTabKeyDown: function onTabKeyDown(event, tab, index) {\n switch (event.code) {\n case 'ArrowLeft':\n this.onTabArrowLeftKey(event);\n break;\n case 'ArrowRight':\n this.onTabArrowRightKey(event);\n break;\n case 'Home':\n this.onTabHomeKey(event);\n break;\n case 'End':\n this.onTabEndKey(event);\n break;\n case 'PageDown':\n this.onPageDownKey(event);\n break;\n case 'PageUp':\n this.onPageUpKey(event);\n break;\n case 'Enter':\n case 'NumpadEnter':\n case 'Space':\n this.onTabEnterKey(event, tab, index);\n break;\n }\n },\n onTabArrowRightKey: function onTabArrowRightKey(event) {\n var nextHeaderAction = this.findNextHeaderAction(event.target.parentElement);\n nextHeaderAction ? this.changeFocusedTab(event, nextHeaderAction) : this.onTabHomeKey(event);\n event.preventDefault();\n },\n onTabArrowLeftKey: function onTabArrowLeftKey(event) {\n var prevHeaderAction = this.findPrevHeaderAction(event.target.parentElement);\n prevHeaderAction ? this.changeFocusedTab(event, prevHeaderAction) : this.onTabEndKey(event);\n event.preventDefault();\n },\n onTabHomeKey: function onTabHomeKey(event) {\n var firstHeaderAction = this.findFirstHeaderAction();\n this.changeFocusedTab(event, firstHeaderAction);\n event.preventDefault();\n },\n onTabEndKey: function onTabEndKey(event) {\n var lastHeaderAction = this.findLastHeaderAction();\n this.changeFocusedTab(event, lastHeaderAction);\n event.preventDefault();\n },\n onPageDownKey: function onPageDownKey(event) {\n this.scrollInView({\n index: this.$refs.nav.children.length - 2\n });\n event.preventDefault();\n },\n onPageUpKey: function onPageUpKey(event) {\n this.scrollInView({\n index: 0\n });\n event.preventDefault();\n },\n onTabEnterKey: function onTabEnterKey(event, tab, index) {\n this.changeActiveIndex(event, tab, index);\n event.preventDefault();\n },\n findNextHeaderAction: function findNextHeaderAction(tabElement) {\n var selfCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var headerElement = selfCheck ? tabElement : tabElement.nextElementSibling;\n return headerElement ? DomHandler.getAttribute(headerElement, 'data-p-disabled') || DomHandler.getAttribute(headerElement, 'data-pc-section') === 'inkbar' ? this.findNextHeaderAction(headerElement) : DomHandler.findSingle(headerElement, '[data-pc-section=\"headeraction\"]') : null;\n },\n findPrevHeaderAction: function findPrevHeaderAction(tabElement) {\n var selfCheck = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var headerElement = selfCheck ? tabElement : tabElement.previousElementSibling;\n return headerElement ? DomHandler.getAttribute(headerElement, 'data-p-disabled') || DomHandler.getAttribute(headerElement, 'data-pc-section') === 'inkbar' ? this.findPrevHeaderAction(headerElement) : DomHandler.findSingle(headerElement, '[data-pc-section=\"headeraction\"]') : null;\n },\n findFirstHeaderAction: function findFirstHeaderAction() {\n return this.findNextHeaderAction(this.$refs.nav.firstElementChild, true);\n },\n findLastHeaderAction: function findLastHeaderAction() {\n return this.findPrevHeaderAction(this.$refs.nav.lastElementChild, true);\n },\n changeActiveIndex: function changeActiveIndex(event, tab, index) {\n if (!this.getTabProp(tab, 'disabled') && this.d_activeIndex !== index) {\n this.d_activeIndex = index;\n this.$emit('update:activeIndex', index);\n this.$emit('tab-change', {\n originalEvent: event,\n index: index\n });\n this.scrollInView({\n index: index\n });\n }\n },\n changeFocusedTab: function changeFocusedTab(event, element) {\n if (element) {\n DomHandler.focus(element);\n this.scrollInView({\n element: element\n });\n if (this.selectOnFocus) {\n var index = parseInt(element.parentElement.dataset.pcIndex, 10);\n var tab = this.tabs[index];\n this.changeActiveIndex(event, tab, index);\n }\n }\n },\n scrollInView: function scrollInView(_ref) {\n var element = _ref.element,\n _ref$index = _ref.index,\n index = _ref$index === void 0 ? -1 : _ref$index;\n var currentElement = element || this.$refs.nav.children[index];\n if (currentElement) {\n currentElement.scrollIntoView && currentElement.scrollIntoView({\n block: 'nearest'\n });\n }\n },\n updateInkBar: function updateInkBar() {\n var tabHeader = this.$refs.nav.children[this.d_activeIndex];\n this.$refs.inkbar.style.width = DomHandler.getWidth(tabHeader) + 'px';\n this.$refs.inkbar.style.left = DomHandler.getOffset(tabHeader).left - DomHandler.getOffset(this.$refs.nav).left + 'px';\n },\n updateButtonState: function updateButtonState() {\n var content = this.$refs.content;\n var scrollLeft = content.scrollLeft,\n scrollWidth = content.scrollWidth;\n var width = DomHandler.getWidth(content);\n this.isPrevButtonDisabled = scrollLeft === 0;\n this.isNextButtonDisabled = parseInt(scrollLeft) === scrollWidth - width;\n },\n getVisibleButtonWidths: function getVisibleButtonWidths() {\n var _this$$refs = this.$refs,\n prevBtn = _this$$refs.prevBtn,\n nextBtn = _this$$refs.nextBtn;\n return [prevBtn, nextBtn].reduce(function (acc, el) {\n return el ? acc + DomHandler.getWidth(el) : acc;\n }, 0);\n }\n },\n computed: {\n tabs: function tabs() {\n var _this = this;\n return this.$slots[\"default\"]().reduce(function (tabs, child) {\n if (_this.isTabPanel(child)) {\n tabs.push(child);\n } else if (child.children && child.children instanceof Array) {\n child.children.forEach(function (nestedChild) {\n if (_this.isTabPanel(nestedChild)) {\n tabs.push(nestedChild);\n }\n });\n }\n return tabs;\n }, []);\n },\n prevButtonAriaLabel: function prevButtonAriaLabel() {\n return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.previous : undefined;\n },\n nextButtonAriaLabel: function nextButtonAriaLabel() {\n return this.$primevue.config.locale.aria ? this.$primevue.config.locale.aria.next : undefined;\n }\n },\n directives: {\n ripple: Ripple\n },\n components: {\n ChevronLeftIcon: ChevronLeftIcon,\n ChevronRightIcon: ChevronRightIcon\n }\n};\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nvar _hoisted_1 = [\"tabindex\", \"aria-label\"];\nvar _hoisted_2 = [\"data-p-highlight\", \"data-p-disabled\", \"data-pc-index\", \"data-p-active\"];\nvar _hoisted_3 = [\"id\", \"tabindex\", \"aria-disabled\", \"aria-selected\", \"aria-controls\", \"onClick\", \"onKeydown\"];\nvar _hoisted_4 = [\"tabindex\", \"aria-label\"];\nvar _hoisted_5 = [\"id\", \"aria-labelledby\", \"data-pc-index\", \"data-p-active\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n var _directive_ripple = resolveDirective(\"ripple\");\n return openBlock(), createElementBlock(\"div\", mergeProps({\n \"class\": _ctx.cx('root'),\n role: \"tablist\"\n }, _ctx.ptmi('root')), [createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('navContainer')\n }, _ctx.ptm('navContainer')), [_ctx.scrollable && !$data.isPrevButtonDisabled ? withDirectives((openBlock(), createElementBlock(\"button\", mergeProps({\n key: 0,\n ref: \"prevBtn\",\n type: \"button\",\n \"class\": _ctx.cx('previousButton'),\n tabindex: _ctx.tabindex,\n \"aria-label\": $options.prevButtonAriaLabel,\n onClick: _cache[0] || (_cache[0] = function () {\n return $options.onPrevButtonClick && $options.onPrevButtonClick.apply($options, arguments);\n })\n }, _objectSpread(_objectSpread({}, _ctx.previousButtonProps), _ctx.ptm('previousButton')), {\n \"data-pc-group-section\": \"navbutton\"\n }), [renderSlot(_ctx.$slots, \"previousicon\", {}, function () {\n return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.prevIcon ? 'span' : 'ChevronLeftIcon'), mergeProps({\n \"aria-hidden\": \"true\",\n \"class\": _ctx.prevIcon\n }, _ctx.ptm('previousIcon')), null, 16, [\"class\"]))];\n })], 16, _hoisted_1)), [[_directive_ripple]]) : createCommentVNode(\"\", true), createElementVNode(\"div\", mergeProps({\n ref: \"content\",\n \"class\": _ctx.cx('navContent'),\n onScroll: _cache[1] || (_cache[1] = function () {\n return $options.onScroll && $options.onScroll.apply($options, arguments);\n })\n }, _ctx.ptm('navContent')), [createElementVNode(\"ul\", mergeProps({\n ref: \"nav\",\n \"class\": _ctx.cx('nav')\n }, _ctx.ptm('nav')), [(openBlock(true), createElementBlock(Fragment, null, renderList($options.tabs, function (tab, index) {\n return openBlock(), createElementBlock(\"li\", mergeProps({\n key: $options.getKey(tab, index),\n style: $options.getTabProp(tab, 'headerStyle'),\n \"class\": _ctx.cx('tab.header', {\n tab: tab,\n index: index\n }),\n role: \"presentation\"\n }, _objectSpread(_objectSpread(_objectSpread({}, $options.getTabProp(tab, 'headerProps')), $options.getTabPT(tab, 'root', index)), $options.getTabPT(tab, 'header', index)), {\n \"data-pc-name\": \"tabpanel\",\n \"data-p-highlight\": $data.d_activeIndex === index,\n \"data-p-disabled\": $options.getTabProp(tab, 'disabled'),\n \"data-pc-index\": index,\n \"data-p-active\": $data.d_activeIndex === index\n }), [withDirectives((openBlock(), createElementBlock(\"a\", mergeProps({\n id: $options.getTabHeaderActionId(index),\n \"class\": _ctx.cx('tab.headerAction'),\n tabindex: $options.getTabProp(tab, 'disabled') || !$options.isTabActive(index) ? -1 : _ctx.tabindex,\n role: \"tab\",\n \"aria-disabled\": $options.getTabProp(tab, 'disabled'),\n \"aria-selected\": $options.isTabActive(index),\n \"aria-controls\": $options.getTabContentId(index),\n onClick: function onClick($event) {\n return $options.onTabClick($event, tab, index);\n },\n onKeydown: function onKeydown($event) {\n return $options.onTabKeyDown($event, tab, index);\n }\n }, _objectSpread(_objectSpread({}, $options.getTabProp(tab, 'headerActionProps')), $options.getTabPT(tab, 'headerAction', index))), [tab.props && tab.props.header ? (openBlock(), createElementBlock(\"span\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('tab.headerTitle')\n }, $options.getTabPT(tab, 'headerTitle', index)), toDisplayString(tab.props.header), 17)) : createCommentVNode(\"\", true), tab.children && tab.children.header ? (openBlock(), createBlock(resolveDynamicComponent(tab.children.header), {\n key: 1\n })) : createCommentVNode(\"\", true)], 16, _hoisted_3)), [[_directive_ripple]])], 16, _hoisted_2);\n }), 128)), createElementVNode(\"li\", mergeProps({\n ref: \"inkbar\",\n \"class\": _ctx.cx('inkbar'),\n role: \"presentation\",\n \"aria-hidden\": \"true\"\n }, _ctx.ptm('inkbar')), null, 16)], 16)], 16), _ctx.scrollable && !$data.isNextButtonDisabled ? withDirectives((openBlock(), createElementBlock(\"button\", mergeProps({\n key: 1,\n ref: \"nextBtn\",\n type: \"button\",\n \"class\": _ctx.cx('nextButton'),\n tabindex: _ctx.tabindex,\n \"aria-label\": $options.nextButtonAriaLabel,\n onClick: _cache[2] || (_cache[2] = function () {\n return $options.onNextButtonClick && $options.onNextButtonClick.apply($options, arguments);\n })\n }, _objectSpread(_objectSpread({}, _ctx.nextButtonProps), _ctx.ptm('nextButton')), {\n \"data-pc-group-section\": \"navbutton\"\n }), [renderSlot(_ctx.$slots, \"nexticon\", {}, function () {\n return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.nextIcon ? 'span' : 'ChevronRightIcon'), mergeProps({\n \"aria-hidden\": \"true\",\n \"class\": _ctx.nextIcon\n }, _ctx.ptm('nextIcon')), null, 16, [\"class\"]))];\n })], 16, _hoisted_4)), [[_directive_ripple]]) : createCommentVNode(\"\", true)], 16), createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('panelContainer')\n }, _ctx.ptm('panelContainer')), [(openBlock(true), createElementBlock(Fragment, null, renderList($options.tabs, function (tab, index) {\n return openBlock(), createElementBlock(Fragment, {\n key: $options.getKey(tab, index)\n }, [(_ctx.lazy ? $options.isTabActive(index) : true) ? withDirectives((openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n id: $options.getTabContentId(index),\n style: $options.getTabProp(tab, 'contentStyle'),\n \"class\": _ctx.cx('tab.content', {\n tab: tab\n }),\n role: \"tabpanel\",\n \"aria-labelledby\": $options.getTabHeaderActionId(index)\n }, _objectSpread(_objectSpread(_objectSpread({}, $options.getTabProp(tab, 'contentProps')), $options.getTabPT(tab, 'root', index)), $options.getTabPT(tab, 'content', index)), {\n \"data-pc-name\": \"tabpanel\",\n \"data-pc-index\": index,\n \"data-p-active\": $data.d_activeIndex === index\n }), [(openBlock(), createBlock(resolveDynamicComponent(tab)))], 16, _hoisted_5)), [[vShow, _ctx.lazy ? true : $options.isTabActive(index)]]) : createCommentVNode(\"\", true)], 64);\n }), 128))], 16)], 16);\n}\n\nscript.render = render;\n\nexport { script as default };\n","var TabPanelStyle = {};\n\nexport { TabPanelStyle as default };\n","import BaseComponent from 'primevue/basecomponent';\nimport TabPanelStyle from 'primevue/tabpanel/style';\nimport { renderSlot } from 'vue';\n\nvar script$1 = {\n name: 'BaseTabPanel',\n \"extends\": BaseComponent,\n props: {\n header: null,\n headerStyle: null,\n headerClass: null,\n headerProps: null,\n headerActionProps: null,\n contentStyle: null,\n contentClass: null,\n contentProps: null,\n disabled: Boolean\n },\n style: TabPanelStyle\n};\n\nvar script = {\n name: 'TabPanel',\n \"extends\": script$1\n};\n\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return renderSlot(_ctx.$slots, \"default\");\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\nvar classes = {\n root: 'p-toolbar p-component',\n start: 'p-toolbar-group-start p-toolbar-group-left',\n center: 'p-toolbar-group-center',\n end: 'p-toolbar-group-end p-toolbar-group-right'\n};\nvar ToolbarStyle = BaseStyle.extend({\n name: 'toolbar',\n classes: classes\n});\n\nexport { ToolbarStyle as default };\n","import BaseComponent from 'primevue/basecomponent';\nimport ToolbarStyle from 'primevue/toolbar/style';\nimport { openBlock, createElementBlock, mergeProps, createElementVNode, renderSlot } from 'vue';\n\nvar script$1 = {\n name: 'BaseToolbar',\n \"extends\": BaseComponent,\n props: {\n ariaLabelledby: {\n type: String,\n \"default\": null\n }\n },\n style: ToolbarStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script = {\n name: 'Toolbar',\n \"extends\": script$1,\n inheritAttrs: false\n};\n\nvar _hoisted_1 = [\"aria-labelledby\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"div\", mergeProps({\n \"class\": _ctx.cx('root'),\n role: \"toolbar\",\n \"aria-labelledby\": _ctx.ariaLabelledby\n }, _ctx.ptmi('root')), [createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('start')\n }, _ctx.ptm('start')), [renderSlot(_ctx.$slots, \"start\")], 16), createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('center')\n }, _ctx.ptm('center')), [renderSlot(_ctx.$slots, \"center\")], 16), createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('end')\n }, _ctx.ptm('end')), [renderSlot(_ctx.$slots, \"end\")], 16)], 16, _hoisted_1);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\n/* Position */\nvar inlineStyles = {\n root: function root(_ref) {\n var props = _ref.props;\n return {\n justifyContent: props.layout === 'horizontal' ? props.align === 'center' || props.align === null ? 'center' : props.align === 'left' ? 'flex-start' : props.align === 'right' ? 'flex-end' : null : null,\n alignItems: props.layout === 'vertical' ? props.align === 'center' || props.align === null ? 'center' : props.align === 'top' ? 'flex-start' : props.align === 'bottom' ? 'flex-end' : null : null\n };\n }\n};\nvar classes = {\n root: function root(_ref2) {\n var props = _ref2.props;\n return ['p-divider p-component', 'p-divider-' + props.layout, 'p-divider-' + props.type, {\n 'p-divider-left': props.layout === 'horizontal' && (!props.align || props.align === 'left')\n }, {\n 'p-divider-center': props.layout === 'horizontal' && props.align === 'center'\n }, {\n 'p-divider-right': props.layout === 'horizontal' && props.align === 'right'\n }, {\n 'p-divider-top': props.layout === 'vertical' && props.align === 'top'\n }, {\n 'p-divider-center': props.layout === 'vertical' && (!props.align || props.align === 'center')\n }, {\n 'p-divider-bottom': props.layout === 'vertical' && props.align === 'bottom'\n }];\n },\n content: 'p-divider-content'\n};\nvar DividerStyle = BaseStyle.extend({\n name: 'divider',\n classes: classes,\n inlineStyles: inlineStyles\n});\n\nexport { DividerStyle as default };\n","import BaseComponent from 'primevue/basecomponent';\nimport DividerStyle from 'primevue/divider/style';\nimport { openBlock, createElementBlock, mergeProps, renderSlot, createCommentVNode } from 'vue';\n\nvar script$1 = {\n name: 'BaseDivider',\n \"extends\": BaseComponent,\n props: {\n align: {\n type: String,\n \"default\": null\n },\n layout: {\n type: String,\n \"default\": 'horizontal'\n },\n type: {\n type: String,\n \"default\": 'solid'\n }\n },\n style: DividerStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script = {\n name: 'Divider',\n \"extends\": script$1,\n inheritAttrs: false\n};\n\nvar _hoisted_1 = [\"aria-orientation\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n return openBlock(), createElementBlock(\"div\", mergeProps({\n \"class\": _ctx.cx('root'),\n style: _ctx.sx('root'),\n role: \"separator\",\n \"aria-orientation\": _ctx.layout\n }, _ctx.ptmi('root')), [_ctx.$slots[\"default\"] ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('content')\n }, _ctx.ptm('content')), [renderSlot(_ctx.$slots, \"default\")], 16)) : createCommentVNode(\"\", true)], 16, _hoisted_1);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\n\n/* Direction */\nvar inlineStyles = {\n root: function root(_ref) {\n var props = _ref.props;\n return {\n alignItems: (props.direction === 'up' || props.direction === 'down') && 'center',\n justifyContent: (props.direction === 'left' || props.direction === 'right') && 'center',\n flexDirection: props.direction === 'up' ? 'column-reverse' : props.direction === 'down' ? 'column' : props.direction === 'left' ? 'row-reverse' : props.direction === 'right' ? 'row' : null\n };\n },\n menu: function menu(_ref2) {\n var props = _ref2.props;\n return {\n flexDirection: props.direction === 'up' ? 'column-reverse' : props.direction === 'down' ? 'column' : props.direction === 'left' ? 'row-reverse' : props.direction === 'right' ? 'row' : null\n };\n }\n};\nvar classes = {\n root: function root(_ref3) {\n var instance = _ref3.instance,\n props = _ref3.props;\n return [\"p-speeddial p-component p-speeddial-\".concat(props.type), _defineProperty(_defineProperty(_defineProperty({}, \"p-speeddial-direction-\".concat(props.direction), props.type !== 'circle'), 'p-speeddial-opened', instance.d_visible), 'p-disabled', props.disabled)];\n },\n button: function button(_ref5) {\n var props = _ref5.props;\n return ['p-speeddial-button p-button-rounded', {\n 'p-speeddial-rotate': props.rotateAnimation && !props.hideIcon\n }];\n },\n menu: 'p-speeddial-list',\n menuitem: function menuitem(_ref6) {\n var instance = _ref6.instance,\n id = _ref6.id;\n return ['p-speeddial-item', {\n 'p-focus': instance.isItemActive(id)\n }];\n },\n action: function action(_ref7) {\n var item = _ref7.item;\n return ['p-speeddial-action', {\n 'p-disabled': item.disabled\n }];\n },\n actionIcon: 'p-speeddial-action-icon',\n mask: function mask(_ref8) {\n var instance = _ref8.instance;\n return ['p-speeddial-mask', {\n 'p-speeddial-mask-visible': instance.d_visible\n }];\n }\n};\nvar SpeedDialStyle = BaseStyle.extend({\n name: 'speeddial',\n classes: classes,\n inlineStyles: inlineStyles\n});\n\nexport { SpeedDialStyle as default };\n","import Button from 'primevue/button';\nimport PlusIcon from 'primevue/icons/plus';\nimport Ripple from 'primevue/ripple';\nimport Tooltip from 'primevue/tooltip';\nimport { UniqueComponentId, DomHandler } from 'primevue/utils';\nimport BaseComponent from 'primevue/basecomponent';\nimport SpeedDialStyle from 'primevue/speeddial/style';\nimport { resolveComponent, resolveDirective, openBlock, createElementBlock, Fragment, createElementVNode, mergeProps, renderSlot, createVNode, normalizeClass, withCtx, createBlock, resolveDynamicComponent, renderList, withDirectives, createCommentVNode } from 'vue';\n\nvar script$1 = {\n name: 'BaseSpeedDial',\n \"extends\": BaseComponent,\n props: {\n model: null,\n visible: {\n type: Boolean,\n \"default\": false\n },\n direction: {\n type: String,\n \"default\": 'up'\n },\n transitionDelay: {\n type: Number,\n \"default\": 30\n },\n type: {\n type: String,\n \"default\": 'linear'\n },\n radius: {\n type: Number,\n \"default\": 0\n },\n mask: {\n type: Boolean,\n \"default\": false\n },\n disabled: {\n type: Boolean,\n \"default\": false\n },\n hideOnClickOutside: {\n type: Boolean,\n \"default\": true\n },\n buttonClass: null,\n maskStyle: null,\n maskClass: null,\n showIcon: {\n type: String,\n \"default\": undefined\n },\n hideIcon: {\n type: String,\n \"default\": undefined\n },\n rotateAnimation: {\n type: Boolean,\n \"default\": true\n },\n tooltipOptions: null,\n style: null,\n \"class\": null,\n ariaLabelledby: {\n type: String,\n \"default\": null\n },\n ariaLabel: {\n type: String,\n \"default\": null\n }\n },\n style: SpeedDialStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }\nfunction _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }\nfunction _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\nfunction _toPropertyKey(t) { var i = _toPrimitive(t, \"string\"); return \"symbol\" == _typeof(i) ? i : String(i); }\nfunction _toPrimitive(t, r) { if (\"object\" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || \"default\"); if (\"object\" != _typeof(i)) return i; throw new TypeError(\"@@toPrimitive must return a primitive value.\"); } return (\"string\" === r ? String : Number)(t); }\nfunction _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }\nfunction _nonIterableSpread() { throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _iterableToArray(iter) { if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter); }\nfunction _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nvar script = {\n name: 'SpeedDial',\n \"extends\": script$1,\n inheritAttrs: false,\n emits: ['click', 'show', 'hide', 'focus', 'blur'],\n documentClickListener: null,\n container: null,\n list: null,\n data: function data() {\n return {\n id: this.$attrs.id,\n d_visible: this.visible,\n isItemClicked: false,\n focused: false,\n focusedOptionIndex: -1\n };\n },\n watch: {\n '$attrs.id': function $attrsId(newValue) {\n this.id = newValue || UniqueComponentId();\n },\n visible: function visible(newValue) {\n this.d_visible = newValue;\n }\n },\n mounted: function mounted() {\n this.id = this.id || UniqueComponentId();\n if (this.type !== 'linear') {\n var button = DomHandler.findSingle(this.container, '[data-pc-name=\"button\"]');\n var firstItem = DomHandler.findSingle(this.list, '[data-pc-section=\"menuitem\"]');\n if (button && firstItem) {\n var wDiff = Math.abs(button.offsetWidth - firstItem.offsetWidth);\n var hDiff = Math.abs(button.offsetHeight - firstItem.offsetHeight);\n this.list.style.setProperty('--item-diff-x', \"\".concat(wDiff / 2, \"px\"));\n this.list.style.setProperty('--item-diff-y', \"\".concat(hDiff / 2, \"px\"));\n }\n }\n if (this.hideOnClickOutside) {\n this.bindDocumentClickListener();\n }\n },\n beforeUnmount: function beforeUnmount() {\n this.unbindDocumentClickListener();\n },\n methods: {\n getPTOptions: function getPTOptions(id, key) {\n return this.ptm(key, {\n context: {\n active: this.isItemActive(id),\n hidden: !this.d_visible\n }\n });\n },\n onFocus: function onFocus(event) {\n this.focused = true;\n this.$emit('focus', event);\n },\n onBlur: function onBlur(event) {\n this.focused = false;\n this.focusedOptionIndex = -1;\n this.$emit('blur', event);\n },\n onItemClick: function onItemClick(e, item) {\n if (item.command) {\n item.command({\n originalEvent: e,\n item: item\n });\n }\n this.hide();\n this.isItemClicked = true;\n e.preventDefault();\n },\n onClick: function onClick(event) {\n this.d_visible ? this.hide() : this.show();\n this.isItemClicked = true;\n this.$emit('click', event);\n },\n show: function show() {\n this.d_visible = true;\n this.$emit('show');\n },\n hide: function hide() {\n this.d_visible = false;\n this.$emit('hide');\n },\n calculateTransitionDelay: function calculateTransitionDelay(index) {\n var length = this.model.length;\n var visible = this.d_visible;\n return (visible ? index : length - index - 1) * this.transitionDelay;\n },\n onTogglerKeydown: function onTogglerKeydown(event) {\n switch (event.code) {\n case 'ArrowDown':\n case 'ArrowLeft':\n this.onTogglerArrowDown(event);\n break;\n case 'ArrowUp':\n case 'ArrowRight':\n this.onTogglerArrowUp(event);\n break;\n case 'Escape':\n this.onEscapeKey();\n break;\n }\n },\n onKeyDown: function onKeyDown(event) {\n switch (event.code) {\n case 'ArrowDown':\n this.onArrowDown(event);\n break;\n case 'ArrowUp':\n this.onArrowUp(event);\n break;\n case 'ArrowLeft':\n this.onArrowLeft(event);\n break;\n case 'ArrowRight':\n this.onArrowRight(event);\n break;\n case 'Enter':\n case 'NumpadEnter':\n case 'Space':\n this.onEnterKey(event);\n break;\n case 'Escape':\n this.onEscapeKey(event);\n break;\n case 'Home':\n this.onHomeKey(event);\n break;\n case 'End':\n this.onEndKey(event);\n break;\n }\n },\n onTogglerArrowUp: function onTogglerArrowUp(event) {\n this.focused = true;\n DomHandler.focus(this.list);\n this.show();\n this.navigatePrevItem(event);\n event.preventDefault();\n },\n onTogglerArrowDown: function onTogglerArrowDown(event) {\n this.focused = true;\n DomHandler.focus(this.list);\n this.show();\n this.navigateNextItem(event);\n event.preventDefault();\n },\n onEnterKey: function onEnterKey(event) {\n var _this = this;\n var items = DomHandler.find(this.container, '[data-pc-section=\"menuitem\"]');\n var itemIndex = _toConsumableArray(items).findIndex(function (item) {\n return item.id === _this.focusedOptionIndex;\n });\n this.onItemClick(event, this.model[itemIndex]);\n this.onBlur(event);\n var buttonEl = DomHandler.findSingle(this.container, 'button');\n buttonEl && DomHandler.focus(buttonEl);\n },\n onEscapeKey: function onEscapeKey() {\n this.hide();\n var buttonEl = DomHandler.findSingle(this.container, 'button');\n buttonEl && DomHandler.focus(buttonEl);\n },\n onArrowUp: function onArrowUp(event) {\n if (this.direction === 'up') {\n this.navigateNextItem(event);\n } else if (this.direction === 'down') {\n this.navigatePrevItem(event);\n } else {\n this.navigateNextItem(event);\n }\n },\n onArrowDown: function onArrowDown(event) {\n if (this.direction === 'up') {\n this.navigatePrevItem(event);\n } else if (this.direction === 'down') {\n this.navigateNextItem(event);\n } else {\n this.navigatePrevItem(event);\n }\n },\n onArrowLeft: function onArrowLeft(event) {\n var leftValidDirections = ['left', 'up-right', 'down-left'];\n var rightValidDirections = ['right', 'up-left', 'down-right'];\n if (leftValidDirections.includes(this.direction)) {\n this.navigateNextItem(event);\n } else if (rightValidDirections.includes(this.direction)) {\n this.navigatePrevItem(event);\n } else {\n this.navigatePrevItem(event);\n }\n },\n onArrowRight: function onArrowRight(event) {\n var leftValidDirections = ['left', 'up-right', 'down-left'];\n var rightValidDirections = ['right', 'up-left', 'down-right'];\n if (leftValidDirections.includes(this.direction)) {\n this.navigatePrevItem(event);\n } else if (rightValidDirections.includes(this.direction)) {\n this.navigateNextItem(event);\n } else {\n this.navigateNextItem(event);\n }\n },\n onEndKey: function onEndKey(event) {\n event.preventDefault();\n this.focusedOptionIndex = -1;\n this.navigatePrevItem(event);\n },\n onHomeKey: function onHomeKey(event) {\n event.preventDefault();\n this.focusedOptionIndex = -1;\n this.navigateNextItem(event);\n },\n navigateNextItem: function navigateNextItem(event) {\n var optionIndex = this.findNextOptionIndex(this.focusedOptionIndex);\n this.changeFocusedOptionIndex(optionIndex);\n event.preventDefault();\n },\n navigatePrevItem: function navigatePrevItem(event) {\n var optionIndex = this.findPrevOptionIndex(this.focusedOptionIndex);\n this.changeFocusedOptionIndex(optionIndex);\n event.preventDefault();\n },\n changeFocusedOptionIndex: function changeFocusedOptionIndex(index) {\n var items = DomHandler.find(this.container, '[data-pc-section=\"menuitem\"]');\n var filteredItems = _toConsumableArray(items).filter(function (item) {\n return !DomHandler.hasClass(DomHandler.findSingle(item, 'a'), 'p-disabled');\n });\n if (filteredItems[index]) {\n this.focusedOptionIndex = filteredItems[index].getAttribute('id');\n }\n },\n findPrevOptionIndex: function findPrevOptionIndex(index) {\n var items = DomHandler.find(this.container, '[data-pc-section=\"menuitem\"]');\n var filteredItems = _toConsumableArray(items).filter(function (item) {\n return !DomHandler.hasClass(DomHandler.findSingle(item, 'a'), 'p-disabled');\n });\n var newIndex = index === -1 ? filteredItems[filteredItems.length - 1].id : index;\n var matchedOptionIndex = filteredItems.findIndex(function (link) {\n return link.getAttribute('id') === newIndex;\n });\n matchedOptionIndex = index === -1 ? filteredItems.length - 1 : matchedOptionIndex - 1;\n return matchedOptionIndex;\n },\n findNextOptionIndex: function findNextOptionIndex(index) {\n var items = DomHandler.find(this.container, '[data-pc-section=\"menuitem\"]');\n var filteredItems = _toConsumableArray(items).filter(function (item) {\n return !DomHandler.hasClass(DomHandler.findSingle(item, 'a'), 'p-disabled');\n });\n var newIndex = index === -1 ? filteredItems[0].id : index;\n var matchedOptionIndex = filteredItems.findIndex(function (link) {\n return link.getAttribute('id') === newIndex;\n });\n matchedOptionIndex = index === -1 ? 0 : matchedOptionIndex + 1;\n return matchedOptionIndex;\n },\n calculatePointStyle: function calculatePointStyle(index) {\n var type = this.type;\n if (type !== 'linear') {\n var length = this.model.length;\n var radius = this.radius || length * 20;\n if (type === 'circle') {\n var step = 2 * Math.PI / length;\n return {\n left: \"calc(\".concat(radius * Math.cos(step * index), \"px + var(--item-diff-x, 0px))\"),\n top: \"calc(\".concat(radius * Math.sin(step * index), \"px + var(--item-diff-y, 0px))\")\n };\n } else if (type === 'semi-circle') {\n var direction = this.direction;\n var _step = Math.PI / (length - 1);\n var x = \"calc(\".concat(radius * Math.cos(_step * index), \"px + var(--item-diff-x, 0px))\");\n var y = \"calc(\".concat(radius * Math.sin(_step * index), \"px + var(--item-diff-y, 0px))\");\n if (direction === 'up') {\n return {\n left: x,\n bottom: y\n };\n } else if (direction === 'down') {\n return {\n left: x,\n top: y\n };\n } else if (direction === 'left') {\n return {\n right: y,\n top: x\n };\n } else if (direction === 'right') {\n return {\n left: y,\n top: x\n };\n }\n } else if (type === 'quarter-circle') {\n var _direction = this.direction;\n var _step2 = Math.PI / (2 * (length - 1));\n var _x = \"calc(\".concat(radius * Math.cos(_step2 * index), \"px + var(--item-diff-x, 0px))\");\n var _y = \"calc(\".concat(radius * Math.sin(_step2 * index), \"px + var(--item-diff-y, 0px))\");\n if (_direction === 'up-left') {\n return {\n right: _x,\n bottom: _y\n };\n } else if (_direction === 'up-right') {\n return {\n left: _x,\n bottom: _y\n };\n } else if (_direction === 'down-left') {\n return {\n right: _y,\n top: _x\n };\n } else if (_direction === 'down-right') {\n return {\n left: _y,\n top: _x\n };\n }\n }\n }\n return {};\n },\n getItemStyle: function getItemStyle(index) {\n var transitionDelay = this.calculateTransitionDelay(index);\n var pointStyle = this.calculatePointStyle(index);\n return _objectSpread({\n transitionDelay: \"\".concat(transitionDelay, \"ms\")\n }, pointStyle);\n },\n bindDocumentClickListener: function bindDocumentClickListener() {\n var _this2 = this;\n if (!this.documentClickListener) {\n this.documentClickListener = function (event) {\n if (_this2.d_visible && _this2.isOutsideClicked(event)) {\n _this2.hide();\n }\n _this2.isItemClicked = false;\n };\n document.addEventListener('click', this.documentClickListener);\n }\n },\n unbindDocumentClickListener: function unbindDocumentClickListener() {\n if (this.documentClickListener) {\n document.removeEventListener('click', this.documentClickListener);\n this.documentClickListener = null;\n }\n },\n isOutsideClicked: function isOutsideClicked(event) {\n return this.container && !(this.container.isSameNode(event.target) || this.container.contains(event.target) || this.isItemClicked);\n },\n isItemVisible: function isItemVisible(item) {\n return typeof item.visible === 'function' ? item.visible() : item.visible !== false;\n },\n isItemActive: function isItemActive(id) {\n return id === this.focusedOptionId;\n },\n containerRef: function containerRef(el) {\n this.container = el;\n },\n listRef: function listRef(el) {\n this.list = el;\n }\n },\n computed: {\n containerClass: function containerClass() {\n return [this.cx('root'), this[\"class\"]];\n },\n focusedOptionId: function focusedOptionId() {\n return this.focusedOptionIndex !== -1 ? this.focusedOptionIndex : null;\n }\n },\n components: {\n SDButton: Button,\n PlusIcon: PlusIcon\n },\n directives: {\n ripple: Ripple,\n tooltip: Tooltip\n }\n};\n\nvar _hoisted_1 = [\"id\", \"aria-activedescendant\"];\nvar _hoisted_2 = [\"id\", \"aria-controls\"];\nvar _hoisted_3 = [\"href\", \"target\", \"onClick\", \"aria-label\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n var _component_SDButton = resolveComponent(\"SDButton\");\n var _directive_ripple = resolveDirective(\"ripple\");\n var _directive_tooltip = resolveDirective(\"tooltip\");\n return openBlock(), createElementBlock(Fragment, null, [createElementVNode(\"div\", mergeProps({\n ref: $options.containerRef,\n \"class\": $options.containerClass,\n style: [_ctx.style, _ctx.sx('root')]\n }, _ctx.ptmi('root')), [renderSlot(_ctx.$slots, \"button\", {\n onClick: $options.onClick,\n toggleCallback: $options.onClick\n }, function () {\n return [createVNode(_component_SDButton, {\n type: \"button\",\n \"class\": normalizeClass([_ctx.cx('button'), _ctx.buttonClass]),\n onClick: _cache[0] || (_cache[0] = function ($event) {\n return $options.onClick($event);\n }),\n disabled: _ctx.disabled,\n onKeydown: $options.onTogglerKeydown,\n \"aria-expanded\": $data.d_visible,\n \"aria-haspopup\": true,\n \"aria-controls\": $data.id + '_list',\n \"aria-label\": _ctx.ariaLabel,\n \"aria-labelledby\": _ctx.ariaLabelledby,\n pt: _ctx.ptm('button'),\n unstyled: _ctx.unstyled\n }, {\n icon: withCtx(function () {\n return [renderSlot(_ctx.$slots, \"icon\", {\n visible: $data.d_visible\n }, function () {\n return [$data.d_visible && !!_ctx.hideIcon ? (openBlock(), createBlock(resolveDynamicComponent(_ctx.hideIcon ? 'span' : 'PlusIcon'), mergeProps({\n key: 0,\n \"class\": [_ctx.hideIcon, _ctx.cx('buttonIcon')]\n }, _ctx.ptm('button')['icon'], {\n \"data-pc-section\": \"icon\"\n }), null, 16, [\"class\"])) : (openBlock(), createBlock(resolveDynamicComponent(_ctx.showIcon ? 'span' : 'PlusIcon'), mergeProps({\n key: 1,\n \"class\": $data.d_visible && !!_ctx.hideIcon ? _ctx.hideIcon : _ctx.showIcon\n }, _ctx.ptm('button')['icon'], {\n \"data-pc-section\": \"icon\"\n }), null, 16, [\"class\"]))];\n })];\n }),\n _: 3\n }, 8, [\"class\", \"disabled\", \"onKeydown\", \"aria-expanded\", \"aria-controls\", \"aria-label\", \"aria-labelledby\", \"pt\", \"unstyled\"])];\n }), createElementVNode(\"ul\", mergeProps({\n ref: $options.listRef,\n id: $data.id + '_list',\n \"class\": _ctx.cx('menu'),\n style: _ctx.sx('menu'),\n role: \"menu\",\n \"aria-activedescendant\": $data.focused ? $options.focusedOptionId : undefined,\n tabindex: \"-1\",\n onFocus: _cache[1] || (_cache[1] = function () {\n return $options.onFocus && $options.onFocus.apply($options, arguments);\n }),\n onBlur: _cache[2] || (_cache[2] = function () {\n return $options.onBlur && $options.onBlur.apply($options, arguments);\n }),\n onKeydown: _cache[3] || (_cache[3] = function () {\n return $options.onKeyDown && $options.onKeyDown.apply($options, arguments);\n })\n }, _ctx.ptm('menu')), [(openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.model, function (item, index) {\n return openBlock(), createElementBlock(Fragment, {\n key: index\n }, [$options.isItemVisible(item) ? (openBlock(), createElementBlock(\"li\", mergeProps({\n key: 0,\n id: \"\".concat($data.id, \"_\").concat(index),\n \"aria-controls\": \"\".concat($data.id, \"_item\"),\n \"class\": _ctx.cx('menuitem', {\n id: \"\".concat($data.id, \"_\").concat(index)\n }),\n style: $options.getItemStyle(index),\n role: \"menuitem\"\n }, $options.getPTOptions(\"\".concat($data.id, \"_\").concat(index), 'menuitem')), [!_ctx.$slots.item ? withDirectives((openBlock(), createElementBlock(\"a\", mergeProps({\n key: 0,\n tabindex: -1,\n href: item.url || '#',\n role: \"menuitem\",\n \"class\": _ctx.cx('action', {\n item: item\n }),\n target: item.target,\n onClick: function onClick($event) {\n return $options.onItemClick($event, item);\n },\n \"aria-label\": item.label\n }, $options.getPTOptions(\"\".concat($data.id, \"_\").concat(index), 'action')), [item.icon ? (openBlock(), createElementBlock(\"span\", mergeProps({\n key: 0,\n \"class\": [_ctx.cx('actionIcon'), item.icon]\n }, $options.getPTOptions(\"\".concat($data.id, \"_\").concat(index), 'actionIcon')), null, 16)) : createCommentVNode(\"\", true)], 16, _hoisted_3)), [[_directive_ripple], [_directive_tooltip, {\n value: item.label,\n disabled: !_ctx.tooltipOptions\n }, _ctx.tooltipOptions]]) : (openBlock(), createBlock(resolveDynamicComponent(_ctx.$slots.item), {\n key: 1,\n item: item,\n onClick: function onClick(event) {\n return $options.onItemClick(event, item);\n }\n }, null, 8, [\"item\", \"onClick\"]))], 16, _hoisted_2)) : createCommentVNode(\"\", true)], 64);\n }), 128))], 16, _hoisted_1)], 16), _ctx.mask ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n \"class\": [_ctx.cx('mask'), _ctx.maskClass],\n style: _ctx.maskStyle\n }, _ctx.ptm('mask')), null, 16)) : createCommentVNode(\"\", true)], 64);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import { createApp } from 'vue'\nimport { createPinia } from 'pinia'\nimport PrimeVue from 'primevue/config'\nimport ToastService from 'primevue/toastservice'\nimport ConfirmationService from 'primevue/confirmationservice'\nimport Tooltip from 'primevue/tooltip'\n\nimport App from './App.vue'\nimport router from './router'\n\n// PrimeVue Components\nimport Button from 'primevue/button'\nimport InputText from 'primevue/inputtext'\nimport Password from 'primevue/password'\nimport DataTable from 'primevue/datatable'\nimport Column from 'primevue/column'\nimport Card from 'primevue/card'\nimport Toast from 'primevue/toast'\nimport ConfirmDialog from 'primevue/confirmdialog'\nimport Menu from 'primevue/menu'\nimport Menubar from 'primevue/menubar'\nimport Badge from 'primevue/badge'\nimport Tag from 'primevue/tag'\nimport Dropdown from 'primevue/dropdown'\nimport AutoComplete from 'primevue/autocomplete'\nimport Calendar from 'primevue/calendar'\nimport ProgressSpinner from 'primevue/progressspinner'\nimport Dialog from 'primevue/dialog'\nimport InputNumber from 'primevue/inputnumber'\nimport Textarea from 'primevue/textarea'\nimport FileUpload from 'primevue/fileupload'\nimport Image from 'primevue/image'\nimport TabView from 'primevue/tabview'\nimport TabPanel from 'primevue/tabpanel'\nimport Checkbox from 'primevue/checkbox'\nimport RadioButton from 'primevue/radiobutton'\nimport Toolbar from 'primevue/toolbar'\nimport Divider from 'primevue/divider'\nimport Message from 'primevue/message'\nimport SpeedDial from 'primevue/speeddial'\n\n// PrimeVue CSS (saga-blue theme)\nimport 'primevue/resources/themes/saga-blue/theme.css'\nimport 'primevue/resources/primevue.min.css'\nimport 'primeicons/primeicons.css'\n\n// Data-Entry specific CSS (original styling)\nimport './assets/css/data-entry.css'\n\nconst app = createApp(App)\n\n// Pinia store\napp.use(createPinia())\n\n// Router\napp.use(router)\n\n// PrimeVue with saga-blue theme\napp.use(PrimeVue, { ripple: true })\napp.use(ToastService)\napp.use(ConfirmationService)\n\n// Register PrimeVue directives\napp.directive('tooltip', Tooltip)\n\n// Register PrimeVue components globally\napp.component('Button', Button)\napp.component('InputText', InputText)\napp.component('Password', Password)\napp.component('DataTable', DataTable)\napp.component('Column', Column)\napp.component('Card', Card)\napp.component('Toast', Toast)\napp.component('ConfirmDialog', ConfirmDialog)\napp.component('Menu', Menu)\napp.component('Menubar', Menubar)\napp.component('Badge', Badge)\napp.component('Tag', Tag)\napp.component('Dropdown', Dropdown)\napp.component('AutoComplete', AutoComplete)\napp.component('Calendar', Calendar)\napp.component('ProgressSpinner', ProgressSpinner)\napp.component('Dialog', Dialog)\napp.component('InputNumber', InputNumber)\napp.component('Textarea', Textarea)\napp.component('FileUpload', FileUpload)\napp.component('Image', Image)\napp.component('TabView', TabView)\napp.component('TabPanel', TabPanel)\napp.component('Checkbox', Checkbox)\napp.component('RadioButton', RadioButton)\napp.component('Toolbar', Toolbar)\napp.component('Divider', Divider)\napp.component('Message', Message)\napp.component('SpeedDial', SpeedDial)\n\napp.mount('#app')\n"],"file":"assets/index.B8XI8FQW.js"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/index.Co2Dp57K.css b/deploy-package-20260223-151231/frontend/assets/index.Co2Dp57K.css deleted file mode 100644 index 2b8b8f7..0000000 --- a/deploy-package-20260223-151231/frontend/assets/index.Co2Dp57K.css +++ /dev/null @@ -1 +0,0 @@ -.company-selector[data-v-b9c10aad]{position:relative;max-width:450px}.company-dropdown[data-v-b9c10aad]{position:relative}.company-trigger[data-v-b9c10aad]{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm, 8px);padding:var(--space-sm, 8px) var(--space-md, 12px);background:var(--color-bg, #fff);border:1px solid var(--color-border, #e5e7eb);border-radius:var(--radius-md, 6px);cursor:pointer;transition:all .15s ease;width:100%;text-align:left;min-width:300px;height:52px;box-sizing:border-box}.company-trigger[data-v-b9c10aad]:hover{border-color:var(--color-primary, #2563eb);background:var(--color-bg-secondary, #f9fafb)}.company-info[data-v-b9c10aad]{flex:1;min-width:0}.company-name[data-v-b9c10aad]{display:block;font-size:var(--text-sm, 14px);font-weight:500;color:var(--color-text, #111827);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.company-code[data-v-b9c10aad]{display:block;font-size:var(--text-xs, 12px);color:var(--color-text-secondary, #6b7280);margin-top:2px}.pi-chevron-down[data-v-b9c10aad]{transition:transform .15s ease;color:var(--color-text-secondary, #6b7280);font-size:var(--text-xs, 12px)}.rotate-180[data-v-b9c10aad]{transform:rotate(180deg)}.company-dropdown-panel[data-v-b9c10aad]{position:absolute;top:calc(100% + 4px);left:0;right:0;background:var(--color-bg, #fff);border:1px solid var(--color-border, #e5e7eb);border-radius:var(--radius-md, 6px);box-shadow:0 10px 15px -3px #0000001a;z-index:1000;max-height:300px;overflow:hidden;opacity:0;transform:translateY(-10px);transition:all .15s ease}.panel-open[data-v-b9c10aad]{opacity:1;transform:translateY(0)}.dropdown-search[data-v-b9c10aad]{padding:var(--space-sm, 8px);border-bottom:1px solid var(--color-border, #e5e7eb)}.search-wrapper[data-v-b9c10aad]{position:relative}.search-icon[data-v-b9c10aad]{position:absolute;left:var(--space-sm, 8px);top:50%;transform:translateY(-50%);color:var(--color-text-secondary, #6b7280);font-size:var(--text-sm, 14px);pointer-events:none}.search-input[data-v-b9c10aad]{width:100%;padding:var(--space-sm, 8px) var(--space-sm, 8px) var(--space-sm, 8px) var(--space-xl, 32px);border:1px solid var(--color-border, #e5e7eb);border-radius:var(--radius-sm, 4px);font-size:var(--text-sm, 14px);background:var(--color-bg, #fff);color:var(--color-text, #111827);transition:border-color .15s ease}.search-input[data-v-b9c10aad]:focus{outline:none;border-color:var(--color-primary, #2563eb)}.company-list[data-v-b9c10aad]{max-height:200px;overflow-y:auto}.company-item[data-v-b9c10aad]{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md, 12px);cursor:pointer;transition:background-color .15s ease;border-bottom:1px solid var(--color-border-light, #f3f4f6)}.company-item[data-v-b9c10aad]:last-child{border-bottom:none}.company-item[data-v-b9c10aad]:hover{background:var(--color-bg-secondary, #f9fafb)}.company-item.active[data-v-b9c10aad]{background:var(--color-primary, #2563eb);color:#fff}.company-item.keyboard-highlighted[data-v-b9c10aad]{background:var(--color-bg-secondary, #f9fafb);outline:2px solid var(--color-primary, #2563eb);outline-offset:-2px}.company-item.active.keyboard-highlighted[data-v-b9c10aad]{outline:2px solid rgba(255,255,255,.5)}.company-details[data-v-b9c10aad]{flex:1;min-width:0}.company-main-name[data-v-b9c10aad]{font-size:var(--text-sm, 14px);font-weight:500;color:inherit;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-bottom:2px}.company-sub-info[data-v-b9c10aad]{display:flex;align-items:center;gap:var(--space-xs, 4px);font-size:var(--text-xs, 12px);opacity:.8}.company-selected-icon[data-v-b9c10aad]{color:inherit;font-size:var(--text-sm, 14px)}.no-results[data-v-b9c10aad]{display:flex;align-items:center;justify-content:center;gap:var(--space-sm, 8px);padding:var(--space-xl, 24px);color:var(--color-text-secondary, #6b7280);font-size:var(--text-sm, 14px)}@media (max-width: 768px){.company-selector[data-v-b9c10aad]{max-width:200px;width:auto}.company-trigger[data-v-b9c10aad]{min-width:auto;max-width:200px;padding:var(--space-xs, 4px) var(--space-sm, 8px)}.company-info[data-v-b9c10aad]{max-width:140px}.company-name[data-v-b9c10aad]{font-size:var(--text-xs, 12px);max-width:140px}.company-code[data-v-b9c10aad]{font-size:10px}.company-dropdown-panel[data-v-b9c10aad]{position:fixed;left:8px;right:8px;top:60px;width:auto;max-height:70vh}}.company-selector--header .company-trigger[data-v-b9c10aad]{background:transparent;border-color:var(--color-border, rgba(0, 0, 0, .2))}.company-selector--header .company-trigger[data-v-b9c10aad]:hover{background:var(--color-bg-secondary, rgba(0, 0, 0, .05));border-color:var(--color-primary, #2563eb)}.company-selector--header .company-name[data-v-b9c10aad]{color:var(--color-text, #111827)}.company-selector--header .company-code[data-v-b9c10aad],.company-selector--header .pi-chevron-down[data-v-b9c10aad]{color:var(--color-text-secondary, #6b7280)}.header-container--gradient .company-selector--header .company-trigger[data-v-b9c10aad]{border-color:#ffffff4d}.header-container--gradient .company-selector--header .company-trigger[data-v-b9c10aad]:hover{background:#ffffff1a;border-color:#ffffff80}.header-container--gradient .company-selector--header .company-name[data-v-b9c10aad]{color:#fff}.header-container--gradient .company-selector--header .company-code[data-v-b9c10aad],.header-container--gradient .company-selector--header .pi-chevron-down[data-v-b9c10aad]{color:#fffc}.period-selector[data-v-95eccbad]{position:relative;max-width:220px}.period-dropdown[data-v-95eccbad]{position:relative}.period-trigger[data-v-95eccbad]{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm, 8px);padding:var(--space-sm, 8px) var(--space-md, 12px);background:var(--color-bg, #fff);border:1px solid var(--color-border, #e5e7eb);border-radius:var(--radius-md, 6px);cursor:pointer;transition:all .15s ease;width:100%;text-align:left;min-width:200px}.period-trigger[data-v-95eccbad]:hover:not(:disabled){border-color:var(--color-primary, #2563eb);background:var(--color-bg-secondary, #f9fafb)}.period-trigger[data-v-95eccbad]:disabled{opacity:.6;cursor:not-allowed}.period-info[data-v-95eccbad]{flex:1;min-width:0;display:flex;flex-direction:column}.period-label[data-v-95eccbad]{font-size:var(--text-xs, 12px);color:var(--color-text-secondary, #6b7280)}.period-name[data-v-95eccbad]{font-size:var(--text-sm, 14px);font-weight:500;color:var(--color-text, #111827);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pi-chevron-down[data-v-95eccbad]{transition:transform .15s ease;color:var(--color-text-secondary, #6b7280);font-size:var(--text-xs, 12px)}.rotate-180[data-v-95eccbad]{transform:rotate(180deg)}.period-dropdown-panel[data-v-95eccbad]{position:absolute;top:calc(100% + 4px);left:0;right:0;background:var(--color-bg, #fff);border:1px solid var(--color-border, #e5e7eb);border-radius:var(--radius-md, 6px);box-shadow:0 10px 15px -3px #0000001a;z-index:1000;max-height:300px;overflow:hidden;opacity:0;transform:translateY(-10px);transition:all .15s ease}.panel-open[data-v-95eccbad]{opacity:1;transform:translateY(0)}.period-list[data-v-95eccbad]{max-height:280px;overflow-y:auto}.period-item[data-v-95eccbad]{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm, 8px) var(--space-md, 12px);cursor:pointer;transition:background-color .15s ease;border-bottom:1px solid var(--color-border-light, #f3f4f6)}.period-item[data-v-95eccbad]:last-child{border-bottom:none}.period-item[data-v-95eccbad]:hover{background:var(--color-bg-secondary, #f9fafb)}.period-item.active[data-v-95eccbad]{background:var(--color-primary, #2563eb);color:#fff}.period-item.keyboard-highlighted[data-v-95eccbad]{background:var(--color-bg-secondary, #f9fafb);outline:2px solid var(--color-primary, #2563eb);outline-offset:-2px}.period-item.active.keyboard-highlighted[data-v-95eccbad]{outline:2px solid rgba(255,255,255,.5)}.period-details[data-v-95eccbad]{flex:1;font-size:var(--text-sm, 14px)}.period-selected-icon[data-v-95eccbad]{color:inherit;font-size:var(--text-sm, 14px)}.no-results[data-v-95eccbad]{display:flex;align-items:center;justify-content:center;gap:var(--space-sm, 8px);padding:var(--space-xl, 24px);color:var(--color-text-secondary, #6b7280);font-size:var(--text-sm, 14px)}@media (max-width: 768px){.period-selector[data-v-95eccbad]{max-width:140px;width:auto}.period-trigger[data-v-95eccbad]{min-width:auto;padding:var(--space-xs, 4px) var(--space-sm, 8px)}.period-info[data-v-95eccbad]{flex-direction:row;align-items:center;gap:var(--space-xs, 4px)}.period-label[data-v-95eccbad]{display:none}.period-name[data-v-95eccbad]{font-size:var(--text-xs, 12px)}.period-dropdown-panel[data-v-95eccbad]{position:fixed;left:8px;right:8px;top:60px;width:auto;max-height:70vh}}.period-selector--header .period-trigger[data-v-95eccbad]{background:transparent;border-color:var(--color-border, rgba(0, 0, 0, .2))}.period-selector--header .period-trigger[data-v-95eccbad]:hover:not(:disabled){background:var(--color-bg-secondary, rgba(0, 0, 0, .05));border-color:var(--color-primary, #2563eb)}.period-selector--header .period-trigger[data-v-95eccbad]:disabled{border-color:var(--color-border, rgba(0, 0, 0, .1))}.period-selector--header .period-label[data-v-95eccbad]{color:var(--color-text-secondary, #6b7280)}.period-selector--header .period-name[data-v-95eccbad]{color:var(--color-text, #111827)}.period-selector--header .pi-chevron-down[data-v-95eccbad]{color:var(--color-text-secondary, #6b7280)}.header-container--gradient .period-selector--header .period-trigger[data-v-95eccbad]{border-color:#ffffff4d}.header-container--gradient .period-selector--header .period-trigger[data-v-95eccbad]:hover:not(:disabled){background:#ffffff1a;border-color:#ffffff80}.header-container--gradient .period-selector--header .period-trigger[data-v-95eccbad]:disabled{border-color:#ffffff26}.header-container--gradient .period-selector--header .period-label[data-v-95eccbad]{color:#ffffffb3}.header-container--gradient .period-selector--header .period-name[data-v-95eccbad]{color:#fff}.header-container--gradient .period-selector--header .pi-chevron-down[data-v-95eccbad]{color:#fffc}.server-selector[data-v-3bdbbc81],.server-dropdown[data-v-3bdbbc81]{position:relative}.server-trigger[data-v-3bdbbc81]{display:flex;align-items:center;justify-content:space-between;gap:var(--space-sm, 8px);padding:var(--space-sm, 8px) var(--space-md, 12px);background:transparent;border:1px solid var(--color-border, rgba(0, 0, 0, .2));border-radius:var(--radius-md, 6px);cursor:pointer;transition:all .15s ease;min-width:120px;height:52px;box-sizing:border-box}.server-trigger[data-v-3bdbbc81]:hover{background:var(--color-bg-secondary, rgba(0, 0, 0, .05));border-color:var(--color-primary, #2563eb)}.server-info[data-v-3bdbbc81]{display:flex;align-items:center;gap:var(--space-sm, 8px);flex:1;min-width:0}.server-icon[data-v-3bdbbc81]{font-size:var(--text-sm, 14px);color:var(--primary-600, #2563eb);flex-shrink:0}.server-name[data-v-3bdbbc81]{font-size:var(--text-sm, 14px);font-weight:var(--font-medium, 500);color:var(--color-text, #111827);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.chevron-icon[data-v-3bdbbc81]{font-size:.65rem;color:var(--text-color-secondary, #6b7280);transition:transform .2s ease;flex-shrink:0}.chevron-icon.rotate-180[data-v-3bdbbc81]{transform:rotate(180deg)}.server-dropdown-panel[data-v-3bdbbc81]{position:absolute;top:calc(100% + 4px);left:0;min-width:100%;background:var(--surface-card, #fff);border:1px solid var(--surface-border, #e2e8f0);border-radius:var(--radius-md, 6px);box-shadow:0 4px 12px #00000026;z-index:1000;overflow:hidden}.server-list[data-v-3bdbbc81]{max-height:200px;overflow-y:auto}.server-item[data-v-3bdbbc81]{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm, 8px) var(--space-md, 12px);cursor:pointer;transition:background .15s ease}.server-item[data-v-3bdbbc81]:hover{background:var(--surface-hover, #f1f5f9)}.server-item.active[data-v-3bdbbc81]{background:var(--primary-50, #eff6ff)}.server-item-info[data-v-3bdbbc81]{display:flex;align-items:center;gap:var(--space-sm, 8px)}.server-item-info .pi-server[data-v-3bdbbc81]{font-size:.875rem;color:var(--text-color-secondary, #6b7280)}.server-item-name[data-v-3bdbbc81]{font-size:.875rem;color:var(--text-color, #111827)}.server-selected-icon[data-v-3bdbbc81]{color:var(--primary-600, #2563eb);font-size:.75rem}.server-selector--header .server-trigger[data-v-3bdbbc81]{background:transparent;border-color:var(--color-border, rgba(0, 0, 0, .2))}.server-selector--header .server-trigger[data-v-3bdbbc81]:hover{background:var(--color-bg-secondary, rgba(0, 0, 0, .05));border-color:var(--color-primary, #2563eb)}[data-theme=dark] .server-icon[data-v-3bdbbc81]{color:var(--primary-400, #60a5fa)}[data-theme=dark] .server-name[data-v-3bdbbc81]{color:var(--text-color, #f9fafb)}[data-theme=dark] .server-dropdown-panel[data-v-3bdbbc81]{background:var(--surface-card, #1e293b);border-color:var(--surface-border, #475569)}[data-theme=dark] .server-item[data-v-3bdbbc81]:hover{background:var(--surface-hover, #334155)}[data-theme=dark] .server-item.active[data-v-3bdbbc81]{background:#3b82f633}[data-theme=dark] .server-item-name[data-v-3bdbbc81]{color:var(--text-color, #f9fafb)}[data-theme=dark] .server-item-info .pi-server[data-v-3bdbbc81]{color:var(--text-color-secondary, #94a3b8)}.header-container--gradient .server-selector--header .server-trigger[data-v-3bdbbc81]{border-color:#ffffff4d}.header-container--gradient .server-selector--header .server-trigger[data-v-3bdbbc81]:hover{background:#ffffff1a;border-color:#ffffff80}.header-container--gradient .server-selector--header .server-icon[data-v-3bdbbc81],.header-container--gradient .server-selector--header .server-name[data-v-3bdbbc81]{color:#fff}.header-container--gradient .server-selector--header .chevron-icon[data-v-3bdbbc81]{color:#fffc}.header-container{position:sticky;top:0;z-index:var(--z-header, 100);background:var(--color-bg, #fff);border-bottom:1px solid var(--color-border, #e5e7eb);height:var(--header-height, 60px);padding:0 var(--space-lg, 24px)}.header-container--gradient{background:linear-gradient(135deg,#667eea,#764ba2);border-bottom:none}.header-container--gradient .header-brand{color:#fff}.header-container--gradient .hamburger-line{background-color:#fff}.header-nav{display:flex;align-items:center;justify-content:space-between;width:100%;height:100%;max-width:1600px;margin:0 auto}.header-left{display:flex;align-items:center;gap:var(--space-md, 16px)}.header-brand{display:flex;align-items:center;gap:var(--space-sm, 8px);font-size:var(--text-lg, 18px);font-weight:var(--font-semibold, 600);color:var(--color-primary, #2563eb);text-decoration:none;white-space:nowrap}.header-brand:hover{opacity:.9}.header-actions{display:flex;align-items:center;gap:var(--space-md, 16px)}.hamburger-btn{display:flex;flex-direction:column;justify-content:space-around;width:32px;height:32px;background:transparent;border:none;cursor:pointer;padding:4px;z-index:10;transition:all .3s ease}.hamburger-btn:hover{opacity:.7}.hamburger-line{width:100%;height:3px;background-color:var(--color-primary, #2563eb);border-radius:2px;transition:all .3s ease;transform-origin:center}.hamburger-btn.active .hamburger-line:nth-child(1){transform:translateY(9px) rotate(45deg)}.hamburger-btn.active .hamburger-line:nth-child(3){transform:translateY(-9px) rotate(-45deg)}.header-user{display:flex;align-items:center;gap:var(--space-sm, 8px);padding:var(--space-sm, 8px);border-radius:var(--radius-md, 6px);cursor:pointer;transition:background-color .15s ease;color:var(--color-text, #111827)}.header-user:hover{background-color:var(--color-bg-secondary, #f9fafb)}.header-container--gradient .header-user{color:#fff}.header-container--gradient .header-user:hover{background-color:#ffffff1a}.server-badge{display:flex;align-items:center;gap:var(--space-xs, 4px);padding:var(--space-xs, 4px) var(--space-sm, 8px);background:var(--primary-100, #dbeafe);color:var(--primary-700, #1d4ed8);border-radius:var(--radius-sm, 4px);font-size:.75rem;font-weight:var(--font-semibold, 600)}.server-badge i{font-size:.75rem}[data-theme=dark] .server-badge{background:var(--primary-900, #1e3a8a);color:var(--primary-200, #bfdbfe)}.header-container--gradient .server-badge{background:#fff3;color:#fff}.theme-toggle-btn{display:flex;align-items:center;justify-content:center;width:36px;height:36px;background:transparent;border:1px solid var(--surface-border, #e2e8f0);border-radius:var(--radius-md, 6px);cursor:pointer;color:var(--text-color, #111827);transition:all .15s ease}.theme-toggle-btn:hover{background:var(--surface-hover, #f1f5f9);border-color:var(--primary-500, #3b82f6);color:var(--primary-500, #3b82f6)}.theme-toggle-btn i{font-size:1rem}.header-container--gradient .theme-toggle-btn{color:#fff;border-color:#ffffff4d}.header-container--gradient .theme-toggle-btn:hover{background:#ffffff1a;border-color:#fff}@media (max-width: 768px){.header-container{display:none!important}.header-left,.header-actions{gap:var(--space-sm, 8px)}.header-brand{font-size:var(--text-base, 16px)}.desktop-only{display:none}}@media (max-width: 480px){.header-brand span{display:none}.header-brand i{font-size:1.5rem}}.server-switch-modal .server-switch-modal-content{display:flex;flex-direction:column;gap:var(--space-md, 16px)}.server-switch-modal .form-field{display:flex;flex-direction:column;gap:var(--space-xs, 4px)}.server-switch-modal .switch-error{display:flex;align-items:center;gap:var(--space-sm, 8px);padding:var(--space-sm, 8px) var(--space-md, 12px);background:var(--red-50, #fef2f2);border:1px solid var(--red-200, #fecaca);border-radius:var(--radius-sm, 4px);color:var(--red-700, #b91c1c);font-size:.875rem}.server-switch-modal .switch-error i{color:var(--red-500, #ef4444)}[data-theme=dark] .server-switch-modal .switch-error{background:var(--red-900, #7f1d1d);border-color:var(--red-700, #b91c1c);color:var(--red-200, #fecaca)}[data-theme=dark] .server-switch-modal .switch-error i{color:var(--red-400, #f87171)}.server-switch-modal .p-dialog{border-radius:var(--radius-lg)!important;box-shadow:var(--shadow-lg)!important;background:var(--surface-card)!important;border:1px solid var(--surface-border)!important;min-width:320px!important}.server-switch-modal .p-dialog-header{background:var(--surface-card)!important;border-bottom:1px solid var(--surface-border)!important;padding:var(--space-md) var(--space-lg)!important}.server-switch-modal .p-dialog-content{background:var(--surface-card)!important;padding:var(--space-lg)!important}.server-switch-modal .p-dialog-footer{background:var(--surface-card)!important;border-top:1px solid var(--surface-border)!important;padding:var(--space-md) var(--space-lg)!important}[data-theme=dark] .server-switch-modal .p-dialog{box-shadow:0 10px 25px #0006!important;background:var(--surface-card)!important}[data-theme=dark] .server-switch-modal .p-dialog-header{background:var(--surface-card)!important;color:var(--text-color)!important}[data-theme=dark] .server-switch-modal .p-dialog-header .p-dialog-title{color:var(--text-color)!important}[data-theme=dark] .server-switch-modal .p-dialog-content,[data-theme=dark] .server-switch-modal .p-dialog-footer{background:var(--surface-card)!important}[data-theme=dark] .server-switch-modal .p-password .p-inputtext{background:var(--surface-overlay, #374151)!important;color:var(--text-color, #f9fafb)!important;border-color:var(--surface-border, #4b5563)!important}[data-theme=dark] .server-switch-modal .p-password .p-inputtext::placeholder{color:var(--text-color-secondary, #9ca3af)!important}[data-theme=dark] .server-switch-modal .p-password .p-inputtext:focus{border-color:var(--primary-400, #60a5fa)!important}[data-theme=dark] .server-switch-modal .p-password-toggle-icon{color:var(--text-color-secondary, #9ca3af)!important}@media (prefers-color-scheme: dark){:root:not([data-theme]) .server-switch-modal .p-password .p-inputtext{background:var(--surface-overlay, #374151)!important;color:var(--text-color, #f9fafb)!important;border-color:var(--surface-border, #4b5563)!important}:root:not([data-theme]) .server-switch-modal .p-password .p-inputtext::placeholder{color:var(--text-color-secondary, #9ca3af)!important}:root:not([data-theme]) .server-switch-modal .p-password-toggle-icon{color:var(--text-color-secondary, #9ca3af)!important}}.slide-menu{position:fixed;top:var(--header-height, 60px);left:0;width:var(--sidebar-width, 280px);height:calc(100vh - var(--header-height, 60px));background:var(--color-bg, #fff);border-right:1px solid var(--color-border, #e5e7eb);box-shadow:var(--shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, .1));transform:translate(-100%);transition:transform .3s ease;z-index:var(--z-modal, 1000);overflow-y:auto;display:flex;flex-direction:column}.slide-menu-overlay{position:fixed;top:var(--header-height, 60px);left:0;right:0;bottom:0;background:#00000080;opacity:0;visibility:hidden;transition:all .3s ease;z-index:var(--z-modal-backdrop, 999)}.menu-section{padding:var(--space-lg, 24px);border-bottom:1px solid var(--color-border, #e5e7eb)}.menu-section.menu-profile{margin-top:auto;border-top:1px solid var(--color-border, #e5e7eb);border-bottom:none}.menu-title{font-size:var(--text-sm, 14px);font-weight:var(--font-semibold, 600);color:var(--color-text-secondary, #6b7280);text-transform:uppercase;letter-spacing:.05em;margin-bottom:var(--space-md, 12px)}.menu-list{list-style:none;margin:0;padding:0}.menu-item{margin-bottom:var(--space-xs, 4px)}.menu-link{display:flex;align-items:center;gap:var(--space-sm, 8px);padding:var(--space-sm, 8px) var(--space-md, 12px);color:var(--color-text, #111827);text-decoration:none;border-radius:var(--radius-md, 6px);transition:all .15s ease;font-size:var(--text-sm, 14px)}.menu-link:hover,.menu-link.active{background-color:var(--color-bg-secondary, #f9fafb);color:var(--color-primary, #2563eb)}.menu-icon{width:18px;height:18px;flex-shrink:0;font-size:16px}.profile-info{display:flex;align-items:center;gap:var(--space-sm, 8px);padding:var(--space-sm, 8px) var(--space-md, 12px);margin-bottom:var(--space-sm, 8px);font-weight:var(--font-medium, 500);color:var(--color-text, #111827)}.profile-info i{font-size:1.25rem;color:var(--color-primary, #2563eb)}.menu-badge{margin-left:auto;background:var(--color-danger, #ef4444);color:#fff;font-size:var(--text-xs, 12px);font-weight:var(--font-semibold, 600);padding:2px 6px;border-radius:var(--radius-full, 9999px);min-width:20px;text-align:center}@media (max-width: 768px){.slide-menu,.slide-menu-overlay{display:none!important}.menu-section{padding:var(--space-md, 12px)}}@media (max-width: 480px){.slide-menu{width:100vw;max-width:320px}}:root{--space-xs: .25rem;--space-sm: .5rem;--space-md: 1rem;--space-lg: 1.5rem;--space-xl: 2rem;--space-2xl: 3rem;--space-3xl: 4rem;--text-xs: .75rem;--text-sm: .875rem;--text-base: 1rem;--text-lg: 1.125rem;--text-xl: 1.25rem;--text-2xl: 1.5rem;--text-3xl: 2rem;--text-4xl: 2.5rem;--font-light: 300;--font-normal: 400;--font-medium: 500;--font-semibold: 600;--font-bold: 700;--leading-tight: 1.2;--leading-normal: 1.5;--leading-loose: 1.75;--color-primary: #2563eb;--color-primary-dark: #1d4ed8;--color-primary-light: #3b82f6;--color-secondary: #64748b;--color-secondary-dark: #475569;--color-secondary-light: #94a3b8;--color-success: #059669;--color-warning: #d97706;--color-error: #dc2626;--color-info: #0891b2;--color-text: #111827;--color-text-secondary: #6b7280;--color-text-muted: #9ca3af;--color-text-inverse: #ffffff;--color-bg: #ffffff;--color-bg-secondary: #f9fafb;--color-bg-muted: #f3f4f6;--color-bg-dark: #111827;--color-border: #e5e7eb;--color-border-light: #f3f4f6;--color-border-dark: #d1d5db;--surface-0: #ffffff;--surface-50: #f8fafc;--surface-100: #f1f5f9;--surface-200: #e2e8f0;--surface-300: #cbd5e1;--surface-400: #94a3b8;--surface-500: #64748b;--surface-600: #475569;--surface-700: #334155;--surface-800: #1e293b;--surface-900: #0f172a;--surface-950: #020617;--surface-card: #ffffff;--surface-ground: #f8fafc;--surface-section: #ffffff;--surface-hover: #f1f5f9;--surface-border: #e2e8f0;--surface-overlay: #ffffff;--primary-50: #eff6ff;--primary-100: #dbeafe;--primary-200: #bfdbfe;--primary-300: #93c5fd;--primary-400: #60a5fa;--primary-500: #3b82f6;--primary-600: #2563eb;--primary-700: #1d4ed8;--primary-800: #1e40af;--primary-900: #1e3a8a;--green-50: #f0fdf4;--green-100: #dcfce7;--green-200: #bbf7d0;--green-300: #86efac;--green-400: #4ade80;--green-500: #22c55e;--green-600: #16a34a;--green-700: #15803d;--green-800: #166534;--green-900: #14532d;--yellow-50: #fefce8;--yellow-100: #fef9c3;--yellow-200: #fef08a;--yellow-300: #fde047;--yellow-400: #facc15;--yellow-500: #eab308;--yellow-600: #ca8a04;--yellow-700: #a16207;--yellow-800: #854d0e;--yellow-900: #713f12;--blue-50: #eff6ff;--blue-100: #dbeafe;--blue-200: #bfdbfe;--blue-300: #93c5fd;--blue-400: #60a5fa;--blue-500: #3b82f6;--blue-600: #2563eb;--blue-700: #1d4ed8;--blue-800: #1e40af;--blue-900: #1e3a8a;--gray-50: #f9fafb;--gray-100: #f3f4f6;--gray-200: #e5e7eb;--gray-300: #d1d5db;--gray-400: #9ca3af;--gray-500: #6b7280;--gray-600: #4b5563;--gray-700: #374151;--gray-800: #1f2937;--gray-900: #111827;--red-50: #fef2f2;--red-100: #fee2e2;--red-200: #fecaca;--red-300: #fca5a5;--red-400: #f87171;--red-500: #ef4444;--red-600: #dc2626;--red-700: #b91c1c;--red-800: #991b1b;--red-900: #7f1d1d;--red-950: #450a0a;--primary-color: var(--color-primary);--primary-color-dark: var(--color-primary-dark);--primary-color-light: var(--color-primary-light);--text-color: var(--color-text);--text-color-secondary: var(--color-text-secondary);--shadow-sm: 0 1px 2px 0 rgb(0 0 0 / .05);--shadow-md: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--shadow-xl: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--radius-sm: .25rem;--radius-md: .5rem;--radius-lg: .75rem;--radius-xl: 1rem;--radius-full: 9999px;--header-height: 56px;--sidebar-width: 240px;--card-radius: var(--radius-md);--container-max-width: 1400px;--transition-fast: .15s ease;--transition-normal: .25s ease;--transition-slow: .35s ease;--color-success-bg: rgba(5, 150, 105, .1);--color-warning-bg: rgba(217, 119, 6, .1);--color-error-bg: rgba(220, 38, 38, .1);--color-info-bg: rgba(8, 145, 178, .1);--color-primary-rgb: 37, 99, 235;--color-success-rgb: 5, 150, 105;--color-warning-rgb: 217, 119, 6;--color-error-rgb: 220, 38, 38;--font-mono: "SF Mono", Consolas, "Liberation Mono", Menlo, Courier, monospace;--z-dropdown: 1200;--z-sticky: 1020;--z-fixed: 1030;--z-modal-backdrop: 1040;--z-modal: 1050;--z-popover: 1060;--z-tooltip: 1070;--breakpoint-mobile: 480px;--breakpoint-tablet: 768px;--breakpoint-desktop: 1024px;--breakpoint-wide: 1400px}[data-theme=dark]{--color-text: #f9fafb;--color-text-secondary: #d1d5db;--color-text-muted: #9ca3af;--text-color: #f9fafb;--text-color-secondary: #d1d5db;--color-bg: #111827;--color-bg-secondary: #1f2937;--color-bg-muted: #374151;--color-border: #374151;--color-border-light: #4b5563;--color-border-dark: #6b7280;--surface-0: #0f172a;--surface-50: #1e293b;--surface-100: #334155;--surface-200: #475569;--surface-300: #64748b;--surface-400: #94a3b8;--surface-500: #cbd5e1;--surface-600: #e2e8f0;--surface-700: #f1f5f9;--surface-800: #f8fafc;--surface-900: #ffffff;--surface-950: #ffffff;--surface-card: #1e293b;--surface-ground: #0f172a;--surface-section: #1e293b;--surface-hover: #334155;--surface-border: #475569;--surface-overlay: #1e293b;--gray-50: #111827;--gray-100: #1f2937;--gray-200: #374151;--gray-300: #4b5563;--gray-400: #6b7280;--gray-500: #9ca3af;--gray-600: #d1d5db;--gray-700: #e5e7eb;--gray-800: #f3f4f6;--gray-900: #f9fafb;--green-50: #052e16;--green-100: #14532d;--green-800: #86efac;--green-900: #bbf7d0;--yellow-50: #422006;--yellow-100: #713f12;--yellow-800: #fde047;--yellow-900: #fef08a;--red-50: #450a0a;--red-100: #7f1d1d;--red-800: #fca5a5;--red-900: #fecaca;--blue-50: #1e3a8a;--blue-100: #1e40af;--blue-800: #93c5fd;--blue-900: #bfdbfe}@media (prefers-color-scheme: dark){:root:not([data-theme]){--color-text: #f9fafb;--color-text-secondary: #d1d5db;--color-text-muted: #9ca3af;--text-color: #f9fafb;--text-color-secondary: #d1d5db;--color-bg: #111827;--color-bg-secondary: #1f2937;--color-bg-muted: #374151;--color-border: #374151;--color-border-light: #4b5563;--color-border-dark: #6b7280;--surface-0: #0f172a;--surface-50: #1e293b;--surface-100: #334155;--surface-200: #475569;--surface-300: #64748b;--surface-400: #94a3b8;--surface-500: #cbd5e1;--surface-600: #e2e8f0;--surface-700: #f1f5f9;--surface-800: #f8fafc;--surface-900: #ffffff;--surface-950: #ffffff;--surface-card: #1e293b;--surface-ground: #0f172a;--surface-section: #1e293b;--surface-hover: #334155;--surface-border: #475569;--surface-overlay: #1e293b;--gray-50: #111827;--gray-100: #1f2937;--gray-200: #374151;--gray-300: #4b5563;--gray-400: #6b7280;--gray-500: #9ca3af;--gray-600: #d1d5db;--gray-700: #e5e7eb;--gray-800: #f3f4f6;--gray-900: #f9fafb;--green-50: #052e16;--green-100: #14532d;--green-800: #86efac;--green-900: #bbf7d0;--yellow-50: #422006;--yellow-100: #713f12;--yellow-800: #fde047;--yellow-900: #fef08a;--red-50: #450a0a;--red-100: #7f1d1d;--red-800: #fca5a5;--red-900: #fecaca;--blue-50: #1e3a8a;--blue-100: #1e40af;--blue-800: #93c5fd;--blue-900: #bfdbfe}}:root{--card-padding: var(--space-lg);--card-padding-sm: var(--space-md);--card-padding-lg: var(--space-xl);--card-gap: var(--space-md);--card-min-height: 280px;--value-size: 1.5rem;--value-size-lg: 2rem;--label-size: .875rem;--sublabel-size: .8125rem;--hover-lift: -2px;--active-lift: 0px;--focus-ring: 0 0 0 3px rgba(var(--color-primary-rgb, 59, 130, 246), .1);--duration-instant: .1s;--duration-fast: .15s;--duration-normal: .25s;--duration-slow: .35s;--duration-slower: .5s;--spinner-size: 40px;--spinner-size-sm: 24px;--spinner-size-lg: 56px;--spinner-border: 4px;--metric-gap: 1rem;--sparkline-height: 80px;--sparkline-height-lg: 150px}:root{--md-sys-color-primary: var(--color-primary);--md-sys-color-on-primary: var(--color-text-inverse);--md-sys-color-primary-container: var(--primary-100);--md-sys-color-on-primary-container: var(--primary-900);--md-sys-color-secondary: var(--color-secondary);--md-sys-color-on-secondary: var(--color-text-inverse);--md-sys-color-secondary-container: var(--gray-100);--md-sys-color-on-secondary-container: var(--gray-900);--md-sys-color-surface: var(--surface-card);--md-sys-color-on-surface: var(--color-text);--md-sys-color-surface-variant: var(--surface-50);--md-sys-color-on-surface-variant: var(--color-text-secondary);--md-sys-color-background: var(--surface-ground);--md-sys-color-on-background: var(--color-text);--md-sys-color-outline: var(--surface-border);--md-sys-color-outline-variant: var(--color-border-light);--md-sys-color-error: var(--color-error);--md-sys-color-on-error: var(--color-text-inverse);--md-sys-color-error-container: var(--red-100);--md-sys-color-on-error-container: var(--red-900);--md-sys-color-surface-dim: var(--surface-100);--md-sys-color-surface-bright: var(--surface-0);--md-sys-color-surface-container-lowest: var(--surface-0);--md-sys-color-surface-container-low: var(--surface-50);--md-sys-color-surface-container: var(--surface-100);--md-sys-color-surface-container-high: var(--surface-200);--md-sys-color-surface-container-highest: var(--surface-300);--md-sys-color-inverse-surface: var(--surface-800);--md-sys-color-inverse-on-surface: var(--surface-50);--md-sys-color-inverse-primary: var(--primary-300);--md-sys-color-scrim: rgba(0, 0, 0, .32)}[data-theme=dark]{--md-sys-color-primary: var(--primary-300);--md-sys-color-on-primary: var(--primary-900);--md-sys-color-primary-container: var(--primary-700);--md-sys-color-on-primary-container: var(--primary-100);--md-sys-color-secondary: var(--gray-300);--md-sys-color-on-secondary: var(--gray-900);--md-sys-color-secondary-container: var(--gray-700);--md-sys-color-on-secondary-container: var(--gray-100);--md-sys-color-surface: var(--surface-card);--md-sys-color-on-surface: var(--color-text);--md-sys-color-surface-variant: var(--surface-200);--md-sys-color-on-surface-variant: var(--color-text-secondary);--md-sys-color-background: var(--surface-ground);--md-sys-color-on-background: var(--color-text);--md-sys-color-outline: var(--surface-border);--md-sys-color-outline-variant: var(--surface-300);--md-sys-color-error: var(--red-300);--md-sys-color-on-error: var(--red-900);--md-sys-color-error-container: var(--red-800);--md-sys-color-on-error-container: var(--red-100);--md-sys-color-surface-dim: var(--surface-0);--md-sys-color-surface-bright: var(--surface-200);--md-sys-color-surface-container-lowest: var(--surface-0);--md-sys-color-surface-container-low: var(--surface-50);--md-sys-color-surface-container: var(--surface-100);--md-sys-color-surface-container-high: var(--surface-200);--md-sys-color-surface-container-highest: var(--surface-300);--md-sys-color-inverse-surface: var(--surface-800);--md-sys-color-inverse-on-surface: var(--surface-100);--md-sys-color-inverse-primary: var(--primary-600);--md-sys-color-scrim: rgba(0, 0, 0, .64)}@media (prefers-color-scheme: dark){:root:not([data-theme]){--md-sys-color-primary: var(--primary-300);--md-sys-color-on-primary: var(--primary-900);--md-sys-color-primary-container: var(--primary-700);--md-sys-color-on-primary-container: var(--primary-100);--md-sys-color-secondary: var(--gray-300);--md-sys-color-on-secondary: var(--gray-900);--md-sys-color-secondary-container: var(--gray-700);--md-sys-color-on-secondary-container: var(--gray-100);--md-sys-color-surface: var(--surface-card);--md-sys-color-on-surface: var(--color-text);--md-sys-color-surface-variant: var(--surface-200);--md-sys-color-on-surface-variant: var(--color-text-secondary);--md-sys-color-background: var(--surface-ground);--md-sys-color-on-background: var(--color-text);--md-sys-color-outline: var(--surface-border);--md-sys-color-outline-variant: var(--surface-300);--md-sys-color-error: var(--red-300);--md-sys-color-on-error: var(--red-900);--md-sys-color-error-container: var(--red-800);--md-sys-color-on-error-container: var(--red-100);--md-sys-color-surface-dim: var(--surface-0);--md-sys-color-surface-bright: var(--surface-200);--md-sys-color-surface-container-lowest: var(--surface-0);--md-sys-color-surface-container-low: var(--surface-50);--md-sys-color-surface-container: var(--surface-100);--md-sys-color-surface-container-high: var(--surface-200);--md-sys-color-surface-container-highest: var(--surface-300);--md-sys-color-inverse-surface: var(--surface-800);--md-sys-color-inverse-on-surface: var(--surface-100);--md-sys-color-inverse-primary: var(--primary-600);--md-sys-color-scrim: rgba(0, 0, 0, .64)}}*,*:before,*:after{box-sizing:border-box}*{margin:0;padding:0}ul[role=list],ol[role=list]{list-style:none}html{scroll-behavior:smooth;-webkit-text-size-adjust:100%;-moz-text-size-adjust:100%;text-size-adjust:100%}body{min-height:100vh;line-height:var(--leading-normal);font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;font-size:var(--text-base);color:var(--color-text);background-color:var(--color-bg);text-rendering:optimizeSpeed;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-weight:var(--font-semibold);line-height:var(--leading-tight)}p{line-height:var(--leading-normal)}a:not([class]){text-decoration-skip-ink:auto;color:var(--color-primary)}img,picture,svg{max-width:100%;height:auto;display:block}input,button,textarea,select{font:inherit;color:inherit}button{border:none;background:none;cursor:pointer}textarea:not([rows]){min-height:10em}fieldset{border:none;padding:0;margin:0}legend{padding:0}:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}@media (prefers-reduced-motion: reduce){*,*:before,*:after{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important;scroll-behavior:auto!important}}@media screen and (max-width: 480px){input,textarea,select{font-size:16px}}.text-4xl,.h1{font-size:var(--text-4xl);font-weight:var(--font-bold);line-height:var(--leading-tight);letter-spacing:-.025em}.text-3xl,.h2{font-size:var(--text-3xl);font-weight:var(--font-semibold);line-height:var(--leading-tight);letter-spacing:-.025em}.text-2xl,.h3{font-size:var(--text-2xl);font-weight:var(--font-semibold);line-height:var(--leading-tight)}.text-xl,.h4{font-size:var(--text-xl);font-weight:var(--font-semibold);line-height:var(--leading-tight)}.text-lg,.h5{font-size:var(--text-lg);font-weight:var(--font-medium);line-height:var(--leading-normal)}.text-base,.h6{font-size:var(--text-base);font-weight:var(--font-medium);line-height:var(--leading-normal)}.text-sm{font-size:var(--text-sm);line-height:var(--leading-normal)}.text-xs{font-size:var(--text-xs);line-height:var(--leading-normal)}.text-inverse{color:var(--color-text-inverse)}.tracking-normal{letter-spacing:0}.page-title{color:var(--color-primary);font-size:var(--text-3xl);font-weight:var(--font-semibold);line-height:var(--leading-tight);margin-bottom:var(--space-md)}.page-subtitle{color:var(--color-text-secondary);font-size:var(--text-lg);font-weight:var(--font-normal);line-height:var(--leading-normal);margin-bottom:var(--space-lg)}.section-title{color:var(--color-text);font-size:var(--text-xl);font-weight:var(--font-medium);line-height:var(--leading-tight);margin-bottom:var(--space-sm)}.kpi-value{font-size:var(--text-2xl);font-weight:var(--font-bold);line-height:var(--leading-tight);color:var(--color-text)}.kpi-large{font-size:var(--text-4xl);font-weight:var(--font-bold);line-height:var(--leading-tight)}.kpi-label{font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.05em}@media (max-width: 480px){.text-4xl,.h1{font-size:var(--text-3xl)}.text-3xl,.h2{font-size:var(--text-2xl)}.text-2xl,.h3{font-size:var(--text-xl)}.page-title{font-size:var(--text-2xl)}.kpi-large{font-size:var(--text-3xl)}}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-5{grid-template-columns:repeat(5,minmax(0,1fr))}.grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}.grid-cols-12{grid-template-columns:repeat(12,minmax(0,1fr))}.col-span-1{grid-column:span 1 / span 1}.col-span-2{grid-column:span 2 / span 2}.col-span-3{grid-column:span 3 / span 3}.col-span-4{grid-column:span 4 / span 4}.col-span-6{grid-column:span 6 / span 6}.col-span-12{grid-column:span 12 / span 12}.col-span-full{grid-column:1 / -1}.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-lg)}.dashboard-v2-grid{display:grid;grid-template-columns:repeat(4,1fr);grid-template-rows:repeat(3,1fr);gap:var(--space-md)}.dashboard-v3-layout{display:grid;grid-template-columns:1fr 300px;gap:var(--space-xl)}.dashboard-v4-actions{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-lg)}@media (max-width: 1024px){.stats-grid{grid-template-columns:repeat(2,1fr)}.dashboard-v2-grid{grid-template-columns:repeat(3,1fr)}.dashboard-v3-layout{grid-template-columns:1fr}.dashboard-v4-actions{grid-template-columns:repeat(2,1fr)}}@media (max-width: 768px){.stats-grid{grid-template-columns:1fr}.dashboard-v2-grid{grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(6,1fr)}.dashboard-v4-actions{grid-template-columns:1fr}}@media (max-width: 480px){.dashboard-v2-grid{grid-template-columns:1fr;grid-template-rows:repeat(12,auto)}}.grid-auto-fit{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:var(--space-lg)}.grid-auto-fill{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:var(--space-md)}.app-container{max-width:var(--container-max-width);margin:0 auto;padding:var(--space-lg);min-height:calc(100vh - var(--header-height))}.page-container{width:100%;max-width:var(--container-max-width);margin:0 auto;padding:0 var(--space-lg)}.section-container{margin-bottom:var(--space-xl)}.content-container{background:var(--color-bg);border-radius:var(--card-radius);box-shadow:var(--shadow-sm);overflow:hidden}.header-container{width:100%;height:var(--header-height);background:var(--color-bg);border-bottom:1px solid var(--color-border);position:fixed;top:0;left:0;right:0;z-index:var(--z-fixed);display:flex;align-items:center;padding:0 var(--space-lg)}.main-content{margin-top:var(--header-height);padding:var(--space-xs)}.main-content.mobile-layout{margin-top:0}.dashboard-container{display:flex;flex-direction:column;gap:var(--space-xl);padding:var(--space-lg)}.card-container{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--card-radius);padding:var(--space-lg);box-shadow:var(--shadow-sm);transition:box-shadow var(--transition-fast)}.card-container:hover{box-shadow:var(--shadow-md)}.card-compact{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--card-radius);padding:var(--space-md);box-shadow:var(--shadow-sm)}.card-mini{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-sm);padding:var(--space-sm);box-shadow:var(--shadow-sm)}.stats-container{display:flex;flex-direction:column;align-items:center;text-align:center;padding:var(--space-lg)}.stats-container-horizontal{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md)}.table-container{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--card-radius);overflow:hidden}.form-container{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--card-radius);padding:var(--space-xl)}.toolbar-container{display:flex;align-items:center;justify-content:space-between;padding:var(--space-md) var(--space-lg);background:var(--color-bg-secondary);border-bottom:1px solid var(--color-border)}.action-bar{display:flex;align-items:center;gap:var(--space-md);padding:var(--space-md);background:var(--color-bg-secondary);border-radius:var(--card-radius);margin-bottom:var(--space-lg)}@media (max-width: 768px){.app-container,.page-container{padding:var(--space-md)}.main-content{padding:var(--space-xs)}.header-container{display:none!important}.dashboard-container{gap:var(--space-lg);padding:var(--space-md)}.card-container{padding:var(--space-md)}.toolbar-container{flex-direction:column;align-items:stretch;gap:var(--space-sm);padding:var(--space-md)}.action-bar{flex-direction:column;align-items:stretch}}@media (max-width: 480px){.app-container,.page-container,.dashboard-container{padding:var(--space-sm)}.main-content{padding:var(--space-xs)}.header-container{display:none!important}.card-container{padding:var(--space-sm)}.stats-container-horizontal{flex-direction:column;gap:var(--space-sm);text-align:center}}.container-fluid{width:100%}.container-full-height{min-height:100vh}.container-centered{display:flex;align-items:center;justify-content:center;min-height:50vh}.header-nav{display:flex;align-items:center;justify-content:space-between;width:100%;height:100%}.header-brand{display:flex;align-items:center;gap:var(--space-sm);font-size:var(--text-lg);font-weight:var(--font-semibold);color:var(--color-primary);text-decoration:none}.header-actions{display:flex;align-items:center;gap:var(--space-md)}.header-user{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm);border-radius:var(--radius-md);cursor:pointer;transition:background-color var(--transition-fast)}.header-user:hover{background-color:var(--color-bg-secondary)}.hamburger-btn{display:flex;flex-direction:column;justify-content:space-between;width:24px;height:18px;background:none;border:none;cursor:pointer;padding:0}.hamburger-line{width:100%;height:2px;background-color:var(--color-text);border-radius:1px;transition:all var(--transition-fast)}.hamburger-btn.active .hamburger-line:nth-child(1){transform:rotate(45deg) translate(5px,5px)}.hamburger-btn.active .hamburger-line:nth-child(2){opacity:0}.hamburger-btn.active .hamburger-line:nth-child(3){transform:rotate(-45deg) translate(5px,-5px)}.slide-menu{position:fixed;top:var(--header-height);left:0;width:var(--sidebar-width);height:calc(100vh - var(--header-height));background:var(--color-bg);border-right:1px solid var(--color-border);box-shadow:var(--shadow-lg);transform:translate(-100%);transition:transform var(--transition-normal);z-index:var(--z-modal);overflow-y:auto;display:flex;flex-direction:column}.slide-menu.open{transform:translate(0)}.slide-menu-overlay{position:fixed;top:var(--header-height);left:0;right:0;bottom:0;background:#00000080;opacity:0;visibility:hidden;transition:all var(--transition-normal);z-index:var(--z-modal-backdrop)}.slide-menu-overlay.open{opacity:1;visibility:visible}.menu-section{padding:var(--space-lg);border-bottom:1px solid var(--color-border)}.menu-section:last-child{border-bottom:none}.menu-title{font-size:var(--text-sm);font-weight:var(--font-semibold);color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.05em;margin-bottom:var(--space-md)}.menu-list{list-style:none}.menu-item{margin-bottom:var(--space-xs)}.menu-link{display:flex;align-items:center;gap:var(--space-sm);padding:var(--space-sm) var(--space-md);color:var(--color-text);text-decoration:none;border-radius:var(--radius-md);transition:all var(--transition-fast)}.menu-link:hover,.menu-link.active{background-color:var(--color-bg-secondary);color:var(--color-primary)}.menu-icon{width:18px;height:18px;flex-shrink:0}.dashboard-switcher{display:flex;flex-direction:column;gap:var(--space-sm)}.dashboard-option{display:flex;align-items:center;justify-content:space-between;padding:var(--space-sm) var(--space-md);background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:var(--radius-md);cursor:pointer;transition:all var(--transition-fast)}.dashboard-option:hover,.dashboard-option.active{background:var(--color-primary);color:var(--color-text-inverse);border-color:var(--color-primary)}.dashboard-label{font-weight:var(--font-medium)}.dashboard-description{font-size:var(--text-xs);opacity:.8}.breadcrumb{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-lg);font-size:var(--text-sm)}.breadcrumb-item{color:var(--color-text-secondary)}.breadcrumb-item:last-child{color:var(--color-text);font-weight:var(--font-medium)}.breadcrumb-separator{color:var(--color-text-muted)}.quick-actions{display:flex;align-items:center;gap:var(--space-sm)}.quick-action-btn{display:flex;align-items:center;gap:var(--space-xs);padding:var(--space-sm) var(--space-md);background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:var(--radius-md);color:var(--color-text);text-decoration:none;font-size:var(--text-sm);transition:all var(--transition-fast)}.quick-action-btn:hover{background:var(--color-primary);color:var(--color-text-inverse);border-color:var(--color-primary)}@media (max-width: 768px){.header-actions{gap:var(--space-sm)}.quick-actions{display:none}.slide-menu{width:280px}.menu-section{padding:var(--space-md)}.quick-action-btn{justify-content:center;padding:var(--space-md)}}@media (max-width: 480px){.header-brand{font-size:var(--text-base)}.slide-menu{width:100vw;max-width:320px}}.card{background:var(--surface-card)!important;border:1px solid var(--surface-border);border-radius:var(--card-radius);box-shadow:var(--shadow-sm);transition:all var(--transition-fast);overflow:hidden}.card:hover{box-shadow:var(--shadow-md);border-color:var(--color-border-dark)}.card-header{padding:var(--space-lg);border-bottom:1px solid var(--surface-border);background:var(--surface-hover)}.card-body{padding:var(--space-lg)}.card-footer{padding:var(--space-lg);border-top:1px solid var(--surface-border);background:var(--surface-hover)}.card-compact,.card-compact .card-header,.card-compact .card-body,.card-compact .card-footer{padding:var(--space-md)}.card-minimal{border:none;box-shadow:none;background:transparent}.card-elevated{box-shadow:var(--shadow-lg)}.card-elevated:hover{box-shadow:var(--shadow-xl);transform:translateY(-2px)}.stats-card{background:var(--surface-card)!important;border:1px solid var(--surface-border);border-radius:var(--card-radius);padding:var(--space-lg);text-align:center;transition:all var(--transition-fast)}.stats-card:hover{border-color:var(--color-primary);box-shadow:var(--shadow-md)}.stats-card-mini{padding:var(--space-md);text-align:left}.stats-card-large{padding:var(--space-xl)}.stats-value{display:block;font-size:var(--text-2xl);font-weight:var(--font-bold);color:var(--color-text);line-height:var(--leading-tight);margin-bottom:var(--space-xs)}.stats-value-large{font-size:var(--text-4xl);margin-bottom:var(--space-sm)}.stats-label{display:block;font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.05em}.stats-change{display:inline-flex;align-items:center;gap:var(--space-xs);font-size:var(--text-sm);font-weight:var(--font-medium);margin-top:var(--space-xs)}.stats-change.positive{color:var(--color-success)}.stats-change.negative{color:var(--color-error)}.kpi-card{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--card-radius);padding:var(--space-lg);display:flex;align-items:center;gap:var(--space-md);transition:all var(--transition-fast)}.kpi-card:hover{box-shadow:var(--shadow-md);border-color:var(--color-primary)}.kpi-icon{width:48px;height:48px;border-radius:var(--radius-lg);display:flex;align-items:center;justify-content:center;background:var(--color-primary);color:var(--color-text-inverse);flex-shrink:0}.kpi-content{flex:1;min-width:0}.kpi-value{font-size:var(--text-xl);font-weight:var(--font-bold);color:var(--color-text);line-height:var(--leading-tight)}.kpi-label{font-size:var(--text-sm);color:var(--color-text-secondary);font-weight:var(--font-medium);margin-top:var(--space-xs)}.action-card{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--card-radius);padding:var(--space-lg);cursor:pointer;transition:all var(--transition-fast);text-align:center}.action-card:hover{background:var(--color-primary);color:var(--color-text-inverse);border-color:var(--color-primary);transform:translateY(-2px);box-shadow:var(--shadow-lg)}.action-icon{width:32px;height:32px;margin:0 auto var(--space-md);opacity:.8}.action-title{font-size:var(--text-lg);font-weight:var(--font-semibold);margin-bottom:var(--space-sm)}.action-description{font-size:var(--text-sm);opacity:.8}.status-card{background:var(--surface-card);border-left:4px solid var(--surface-border);border-radius:var(--card-radius);padding:var(--space-md);box-shadow:var(--shadow-sm)}.status-card.success{border-left-color:var(--color-success);background:var(--green-50)}.status-card.warning{border-left-color:var(--color-warning);background:var(--yellow-50)}.status-card.error{border-left-color:var(--color-error);background:var(--red-50)}.status-card.info{border-left-color:var(--color-info);background:var(--blue-50)}.company-banner{background:linear-gradient(135deg,var(--color-primary) 0%,var(--color-primary-dark) 100%);color:var(--color-text-inverse);border:none;padding:var(--space-md);margin-bottom:var(--space-lg)}.company-name{font-size:var(--text-lg);font-weight:var(--font-semibold);margin-bottom:var(--space-xs)}.company-info{font-size:var(--text-sm);opacity:.9}.mini-card{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--radius-sm);padding:var(--space-sm);text-align:center;transition:all var(--transition-fast);position:relative;overflow:hidden}.mini-card:hover{box-shadow:var(--shadow-md);border-color:var(--color-primary)}.mini-card-icon{width:16px;height:16px;margin-bottom:var(--space-xs);opacity:.7}.mini-card-value{font-size:var(--text-lg);font-weight:var(--font-bold);line-height:var(--leading-tight)}.mini-card-label{font-size:var(--text-xs);color:var(--color-text-secondary);margin-top:var(--space-xs)}.mini-card.heat-low{background:var(--green-50);border-color:var(--color-success)}.mini-card.heat-medium{background:var(--yellow-50);border-color:var(--color-warning)}.mini-card.heat-high{background:var(--red-50);border-color:var(--color-error)}@media (max-width: 768px){.card-header,.card-body,.card-footer,.stats-card,.kpi-card,.action-card{padding:var(--space-md)}.kpi-card{flex-direction:column;text-align:center}.stats-value{font-size:var(--text-xl)}.stats-value-large{font-size:var(--text-3xl)}.company-banner{padding:var(--space-sm)}}@media (max-width: 480px){.card-header,.card-body,.card-footer,.stats-card,.kpi-card,.action-card{padding:var(--space-sm)}.mini-card{padding:var(--space-xs)}.mini-card-value{font-size:var(--text-base)}}.metric-card{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--card-radius);padding:var(--card-padding, 1.5rem);transition:all var(--transition-fast);min-height:var(--card-min-height, 200px);display:flex;flex-direction:column;gap:var(--card-gap, 1rem)}.metric-card:hover{box-shadow:var(--shadow-md);transform:translateY(var(--hover-lift, -2px));border-color:var(--color-primary)}.metric-header{display:flex;align-items:center;gap:var(--space-md);margin-bottom:var(--space-sm)}.metric-icon{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md);font-size:var(--text-xl)}.metric-value{font-size:var(--value-size, 2rem);font-weight:var(--font-bold);line-height:var(--leading-tight);font-family:var(--font-mono, monospace);color:var(--color-text)}.metric-value-lg{font-size:var(--value-size-lg, 2.5rem)}.metric-label{font-size:var(--label-size, .875rem);font-weight:var(--font-medium);color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.05em;margin-bottom:var(--space-xs)}@media (max-width: 768px){.metric-card{min-height:calc(var(--card-min-height, 200px) - 40px);padding:var(--card-padding-sm, 1rem)}.metric-value{font-size:1.25rem}}.btn{display:inline-flex;align-items:center;justify-content:center;gap:var(--space-xs);padding:var(--space-sm) var(--space-md);font-size:var(--text-sm);font-weight:var(--font-medium);line-height:var(--leading-normal);border:1px solid transparent;border-radius:var(--radius-md);cursor:pointer;text-decoration:none;transition:all var(--transition-fast);-webkit-user-select:none;user-select:none;white-space:nowrap}.btn:disabled{opacity:.6;cursor:not-allowed;transform:none!important}.btn-xs{padding:var(--space-xs) var(--space-sm);font-size:var(--text-xs);gap:2px}.btn-sm{padding:var(--space-xs) var(--space-sm);font-size:var(--text-sm)}.btn-md{padding:var(--space-sm) var(--space-md);font-size:var(--text-sm)}.btn-lg{padding:var(--space-md) var(--space-lg);font-size:var(--text-base)}.btn-xl{padding:var(--space-lg) var(--space-xl);font-size:var(--text-lg)}.btn-primary{background:var(--color-primary);color:var(--color-text-inverse);border-color:var(--color-primary)}.btn-secondary{background:var(--color-bg);color:var(--color-text);border-color:var(--color-border)}.btn-secondary:hover{background:var(--color-bg-secondary);border-color:var(--color-border-dark)}.btn-outline{background:transparent;color:var(--color-primary);border-color:var(--color-primary)}.btn-outline:hover{background:var(--color-primary);color:var(--color-text-inverse)}.btn-ghost{background:transparent;color:var(--color-text);border-color:transparent}.btn-ghost:hover{background:var(--color-bg-secondary);border-color:var(--color-border)}.btn-success{background:var(--color-success);color:var(--color-text-inverse);border-color:var(--color-success)}.btn-success:hover{background:var(--green-700);border-color:var(--green-700)}.btn-warning{background:var(--color-warning);color:var(--color-text-inverse);border-color:var(--color-warning)}.btn-warning:hover{background:var(--yellow-700);border-color:var(--yellow-700)}.btn-error{background:var(--color-error);color:var(--color-text-inverse);border-color:var(--color-error)}.btn-error:hover{background:var(--red-700);border-color:var(--red-700)}.btn-rounded{border-radius:var(--radius-full)}.btn-square{border-radius:0}.btn-circle{border-radius:var(--radius-full);width:40px;height:40px;padding:0}.btn-circle.btn-sm{width:32px;height:32px}.btn-circle.btn-lg{width:48px;height:48px}.btn-icon{display:inline-flex;align-items:center;justify-content:center;width:40px;height:40px;padding:0;border-radius:var(--radius-md)}.btn-icon-sm{width:32px;height:32px}.btn-icon-lg{width:48px;height:48px}.btn-group{display:inline-flex;align-items:center}.btn-group .btn{border-radius:0;border-right-width:0}.btn-group .btn:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.btn-group .btn:last-child{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md);border-right-width:1px}.btn-group .btn:hover{z-index:1;border-right-width:1px}.action-btn{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:var(--space-md);padding:var(--space-xl);background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--card-radius);cursor:pointer;transition:all var(--transition-fast);text-decoration:none;color:var(--color-text);min-height:120px}.action-btn:hover{background:var(--color-primary);color:var(--color-text-inverse);border-color:var(--color-primary);transform:translateY(-2px);box-shadow:var(--shadow-lg)}.action-btn-icon{width:32px;height:32px;opacity:.8}.action-btn:hover .action-btn-icon{opacity:1}.action-btn-label{font-size:var(--text-sm);font-weight:var(--font-semibold);text-align:center}.btn-toggle{background:var(--color-bg-secondary);color:var(--color-text-secondary);border-color:var(--color-border)}.btn-toggle.active,.btn-toggle:hover{background:var(--color-primary);color:var(--color-text-inverse);border-color:var(--color-primary)}.btn-pill{border-radius:var(--radius-full);padding:var(--space-xs) var(--space-md);font-size:var(--text-xs);font-weight:var(--font-medium)}.btn-loading{opacity:.7;cursor:not-allowed}.btn-loading:before{content:"";display:inline-block;width:16px;height:16px;margin-right:var(--space-xs);border:2px solid currentColor;border-right-color:transparent;border-radius:var(--radius-full);animation:btn-spin .8s linear infinite}@keyframes btn-spin{to{transform:rotate(360deg)}}@media (max-width: 768px){.btn{padding:var(--space-md) var(--space-lg);font-size:var(--text-base);min-height:44px}.btn-sm{padding:var(--space-sm) var(--space-md);font-size:var(--text-sm);min-height:36px}.btn-group{flex-direction:column;width:100%}.btn-group .btn{border-radius:0;border-right-width:1px;border-bottom-width:0;width:100%}.btn-group .btn:first-child{border-radius:var(--radius-md) var(--radius-md) 0 0}.btn-group .btn:last-child{border-radius:0 0 var(--radius-md) var(--radius-md);border-bottom-width:1px}.action-btn{padding:var(--space-lg);min-height:100px}}@media (max-width: 480px){.action-btn{min-height:80px;padding:var(--space-md)}.action-btn-icon{width:24px;height:24px}.action-btn-label{font-size:var(--text-xs)}}.btn:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}.button-group{display:inline-flex;align-items:center;gap:.25rem}.button-group .btn{border-radius:var(--radius-md)}@media (max-width: 640px){.btn-text{display:none}.button-group{width:100%}.button-group .btn{flex:1;justify-content:center}}@media (max-width: 480px){.button-group{flex-direction:column;width:100%}.button-group .btn{width:100%}.btn-text{display:inline}}.btn-primary{background:var(--color-primary);color:#fff;border-color:var(--color-primary)}.btn-primary:hover{background:var(--color-primary-dark);border-color:var(--color-primary-dark);transform:translateY(-1px);box-shadow:var(--shadow-md)}.btn-primary:active{transform:translateY(0)}.btn-full-width{width:100%;justify-content:center}.btn-auto-width{width:auto}.table{width:100%;border-collapse:collapse;font-size:var(--text-sm);color:var(--color-text);background:var(--color-bg);border-radius:var(--card-radius);overflow:hidden;box-shadow:var(--shadow-sm)}.table th{background:var(--color-bg-muted);padding:var(--space-sm) var(--space-md);text-align:left;border-bottom:2px solid var(--color-border);font-weight:var(--font-semibold);color:var(--color-text);font-size:var(--text-sm);position:sticky;top:0;z-index:1}.table td{padding:var(--space-sm) var(--space-md);border-bottom:1px solid var(--color-border-light);vertical-align:middle}.table tbody tr:hover{background:var(--color-bg-secondary)}.table tbody tr:last-child td{border-bottom:none}.table-striped tbody tr:nth-child(2n){background:var(--color-bg-secondary)}.table-striped tbody tr:nth-child(2n):hover{background:var(--color-bg-muted)}.table-bordered,.table-bordered th,.table-bordered td{border:1px solid var(--color-border)}.table-borderless th,.table-borderless td{border:none}.table-sm th,.table-sm td{padding:var(--space-xs) var(--space-sm)}.table-lg th,.table-lg td{padding:var(--space-md) var(--space-lg)}.table-responsive{overflow-x:auto;-webkit-overflow-scrolling:touch}.table-responsive .table{min-width:600px}.table th.sortable{cursor:pointer;-webkit-user-select:none;user-select:none;position:relative;padding-right:var(--space-xl)}.table th.sortable:hover{background:var(--color-border)}.table th.sortable:after{content:"↕";position:absolute;right:var(--space-sm);top:50%;transform:translateY(-50%);opacity:.5;font-size:var(--text-xs)}.table th.sortable.sorted-asc:after{content:"↑";opacity:1;color:var(--color-primary)}.table th.sortable.sorted-desc:after{content:"↓";opacity:1;color:var(--color-primary)}.table .cell-success,.table .text-success{color:var(--color-success);font-weight:var(--font-medium)}.table .cell-warning,.table .text-warning{color:var(--color-warning);font-weight:var(--font-medium)}.table .cell-error,.table .text-error{color:var(--color-error);font-weight:var(--font-medium)}.table .cell-info,.table .text-info{color:var(--color-info);font-weight:var(--font-medium)}.table .cell-muted,.table .text-muted{color:var(--color-text-muted)}.table .row-selected{background:#2563eb1a;border-color:var(--color-primary)}.table .row-active{background:#10b9811a}.table .row-warning{background:#f59e0b1a}.table .row-error{background:#ef44441a}.table .cell-editable{cursor:pointer;position:relative}.table .cell-editable:hover{background:#2563eb0d}.table .cell-input{width:100%;padding:var(--space-xs);border:1px solid var(--color-primary);border-radius:var(--radius-sm);font-size:inherit;font-family:inherit;color:inherit;background:var(--color-bg)}.table .cell-input:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 2px #2563eb33}.table .table-actions{display:flex;gap:var(--space-xs);justify-content:flex-end}.table .table-action-btn{padding:var(--space-xs);border:1px solid var(--color-border);background:var(--color-bg);border-radius:var(--radius-sm);cursor:pointer;transition:all var(--transition-fast);color:var(--color-text-secondary);font-size:var(--text-sm)}.table .table-action-btn:hover{background:var(--color-primary);color:var(--color-text-inverse);border-color:var(--color-primary)}.table-pagination{display:flex;justify-content:space-between;align-items:center;padding:var(--space-md);background:var(--color-bg-secondary);border-top:1px solid var(--color-border)}.pagination-info{font-size:var(--text-sm);color:var(--color-text-secondary)}.pagination-controls{display:flex;align-items:center;gap:var(--space-sm)}.pagination-btn{padding:var(--space-xs) var(--space-sm);border:1px solid var(--color-border);background:var(--color-bg);color:var(--color-text);cursor:pointer;border-radius:var(--radius-sm);font-size:var(--text-sm);transition:all var(--transition-fast)}.pagination-btn:hover:not(:disabled){background:var(--color-primary);color:var(--color-text-inverse);border-color:var(--color-primary)}.pagination-btn:disabled{opacity:.5;cursor:not-allowed}.pagination-current{padding:var(--space-xs) var(--space-sm);font-size:var(--text-sm);color:var(--color-text);background:var(--color-primary);color:var(--color-text-inverse);border-radius:var(--radius-sm)}.table-filters{display:flex;justify-content:space-between;align-items:center;padding:var(--space-md);background:var(--color-bg-secondary);border-bottom:1px solid var(--color-border);gap:var(--space-md);flex-wrap:wrap}.table-search{flex:1;min-width:200px}.table-filter-group{display:flex;align-items:center;gap:var(--space-sm)}.table-filter-label{font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--color-text-secondary);white-space:nowrap}.table-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:var(--space-md);padding:var(--space-md);background:var(--color-bg-muted);border-bottom:1px solid var(--color-border)}.table-stat{text-align:center}.table-stat-value{font-size:var(--text-xl);font-weight:var(--font-bold);color:var(--color-text);display:block;margin-bottom:var(--space-xs)}.table-stat-label{font-size:var(--text-xs);color:var(--color-text-secondary);font-weight:var(--font-medium);text-transform:uppercase;letter-spacing:.05em}.table-empty{text-align:center;padding:var(--space-3xl) var(--space-xl);color:var(--color-text-secondary)}.table-empty-icon{font-size:var(--text-4xl);margin-bottom:var(--space-lg);opacity:.5}.table-empty-message{font-size:var(--text-lg);margin-bottom:var(--space-sm)}.table-empty-description{font-size:var(--text-sm);opacity:.8}.trends-container{padding:var(--space-xl);min-height:400px;display:flex;align-items:center;justify-content:center}.trend-placeholder{text-align:center;padding:var(--space-xl);background:var(--color-bg-secondary);border-radius:var(--radius-lg);color:var(--color-text-secondary);border:2px dashed var(--color-border);max-width:500px}.placeholder-icon{font-size:48px;color:var(--color-primary);margin-bottom:var(--space-lg);opacity:.7}.trend-placeholder h3{font-size:var(--text-xl);font-weight:var(--font-semibold);color:var(--color-text);margin:0 0 var(--space-md) 0}.trend-placeholder p{font-size:var(--text-base);margin:0 0 var(--space-md) 0;line-height:1.6}.trend-placeholder ul{text-align:left;display:inline-block;margin:0;padding-left:var(--space-lg)}.trend-placeholder li{margin-bottom:var(--space-xs);line-height:1.5;color:var(--color-text-secondary)}.chart-container{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-lg);padding:var(--space-lg);margin:var(--space-md) 0;min-height:300px;display:flex;align-items:center;justify-content:center}.loading-state{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:var(--space-3xl);color:var(--color-text-secondary);text-align:center;min-height:200px}.loading-spinner{width:40px;height:40px;border:4px solid var(--color-border);border-top-color:var(--color-primary);border-radius:50%;animation:spin 1s linear infinite;margin-bottom:var(--space-lg)}.table-container{overflow:auto;max-height:500px;border-radius:var(--radius-md);border:1px solid var(--color-border-light)}.table-container::-webkit-scrollbar{width:8px;height:8px}.table-container::-webkit-scrollbar-track{background:var(--color-bg-secondary)}.table-container::-webkit-scrollbar-thumb{background:var(--color-border);border-radius:var(--radius-full)}.table-container::-webkit-scrollbar-thumb:hover{background:var(--color-border-dark)}@media (max-width: 768px){.table-mobile-stack{display:block}.table-mobile-stack thead{display:none}.table-mobile-stack tbody,.table-mobile-stack tr,.table-mobile-stack td{display:block;width:100%}.table-mobile-stack tr{border:1px solid var(--color-border);border-radius:var(--card-radius);padding:var(--space-md);margin-bottom:var(--space-md);background:var(--color-bg);box-shadow:var(--shadow-sm)}.table-mobile-stack td{border:none;position:relative;padding:var(--space-sm) 0;text-align:left}.table-mobile-stack td:before{content:attr(data-label) ": ";font-weight:var(--font-semibold);color:var(--color-text-secondary);display:inline-block;width:40%;margin-right:var(--space-sm)}.table-filters{flex-direction:column;align-items:stretch}.table-filter-group{justify-content:space-between}.table-pagination{flex-direction:column;gap:var(--space-md);text-align:center}.table-stats{grid-template-columns:repeat(2,1fr)}}@media (max-width: 480px){.table-stats{grid-template-columns:1fr}.table-mobile-stack td:before{width:100%;display:block;margin-bottom:var(--space-xs);margin-right:0}.dashboard-table{font-size:var(--text-xs)}.dashboard-table th,.dashboard-table td{padding:var(--space-sm) var(--space-md)}.name-cell{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.trends-container{padding:var(--space-lg)}.placeholder-icon{font-size:36px}.trend-placeholder h3{font-size:var(--text-lg)}}.dashboard-table{width:100%;border-collapse:collapse;font-size:var(--text-sm);color:var(--color-text);background:var(--color-bg);border-radius:var(--card-radius);overflow:hidden;box-shadow:var(--shadow-sm);border:1px solid var(--color-border-light)}.dashboard-table th{background:var(--color-bg-muted);padding:var(--space-md) var(--space-lg);text-align:left;border-bottom:2px solid var(--color-border);font-weight:var(--font-semibold);color:var(--color-text);font-size:var(--text-sm);position:sticky;top:0;z-index:10;text-transform:uppercase;letter-spacing:.025em;font-size:var(--text-xs)}.dashboard-table th.text-right{text-align:right}.dashboard-table td{padding:var(--space-sm) var(--space-lg);border-bottom:1px solid var(--color-border-light);vertical-align:middle;transition:background-color var(--transition-fast)}.dashboard-table td.text-right{text-align:right}.dashboard-table tbody tr:hover{background:var(--color-bg-secondary)}.dashboard-table tbody tr:last-child td{border-bottom:none}.dashboard-table .category-cell{font-weight:var(--font-medium);color:var(--color-text)}.dashboard-table .name-cell{font-weight:var(--font-medium);color:var(--color-text);max-width:250px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dashboard-table .amount-cell{font-family:var(--font-mono);font-weight:var(--font-medium);text-align:right;white-space:nowrap}.dashboard-table .status-cell{text-align:center}.status-badge{display:inline-block;padding:var(--space-xs) var(--space-sm);border-radius:var(--radius-full);font-size:var(--text-xs);font-weight:var(--font-medium);text-transform:uppercase;letter-spacing:.05em;border:1px solid transparent}.status-badge.activ{background:var(--color-success-bg);color:var(--color-success);border-color:var(--color-success)}.status-badge.restant{background:var(--color-warning-bg);color:var(--color-warning);border-color:var(--color-warning)}.status-badge.inactiv{background:var(--color-error-bg);color:var(--color-error);border-color:var(--color-error)}.positive{color:var(--color-success)!important;font-weight:var(--font-semibold)}.negative{color:var(--color-error)!important;font-weight:var(--font-semibold)}.neutral{color:var(--color-text)!important}.grand-total-row{background:var(--color-bg-muted);font-weight:var(--font-semibold);border-top:2px solid var(--color-border);border-bottom:2px solid var(--color-border)}.grand-total-row td{padding:var(--space-md) var(--space-lg);color:var(--color-text);font-size:var(--text-sm)}.grand-total-row:hover{background:var(--color-bg-muted)!important}.dashboard-section{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--card-radius);overflow:hidden;box-shadow:var(--shadow-sm);margin-bottom:var(--space-xl)}.section-header{display:flex;justify-content:space-between;align-items:center;padding:var(--space-lg) var(--space-xl);background:var(--color-bg-secondary);border-bottom:1px solid var(--color-border);flex-wrap:wrap;gap:var(--space-md)}.section-title{font-size:var(--text-xl);font-weight:var(--font-semibold);color:var(--color-text);margin:0;display:flex;align-items:center;gap:var(--space-sm)}.control-group{display:flex;align-items:center;gap:var(--space-sm)}.control-group label{font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--color-text-secondary);white-space:nowrap}.detail-select,.detail-input,.trend-select{padding:var(--space-xs) var(--space-sm);border:1px solid var(--color-border);border-radius:var(--radius-sm);font-size:var(--text-sm);min-width:120px;background:var(--color-bg);color:var(--color-text);transition:border-color var(--transition-fast),box-shadow var(--transition-fast)}.detail-select:focus,.detail-input:focus,.trend-select:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 2px rgba(var(--color-primary-rgb),.2)}.table-pagination{display:flex;justify-content:space-between;align-items:center;padding:var(--space-md) var(--space-xl);background:var(--color-bg-secondary);border-top:1px solid var(--color-border);flex-wrap:wrap;gap:var(--space-md)}.pagination-info{font-size:var(--text-sm);color:var(--color-text-secondary);font-weight:var(--font-medium)}.pagination-controls{display:flex;align-items:center;gap:var(--space-md)}.page-info{font-size:var(--text-sm);color:var(--color-text);font-weight:var(--font-medium);padding:var(--space-xs) var(--space-sm);background:var(--color-bg-muted);border-radius:var(--radius-sm);border:1px solid var(--color-border)}@media print{.table{font-size:12px}.table-filters,.table-pagination,.table-actions{display:none}.table th,.table td{padding:4px 8px}.dashboard-table{font-size:10px;box-shadow:none;border:1px solid #000!important}.dashboard-table th{background:#f5f5f5!important;color:#000!important;border:1px solid #000!important;padding:4px 6px}.dashboard-table td{border:1px solid #000!important;padding:4px 6px;background:#fff!important;color:#000!important}.grand-total-row td{background:#f0f0f0!important;font-weight:700;border:2px solid #000!important}.section-header{display:none}.dashboard-section{page-break-inside:avoid;margin-bottom:20px;box-shadow:none}}.form{display:flex;flex-direction:column;gap:var(--space-lg)}.form-group{display:flex;flex-direction:column;gap:var(--space-sm)}.form-row{display:flex;gap:var(--space-md);align-items:end}.form-col{flex:1}.form-label{display:block;font-size:var(--text-sm);font-weight:var(--font-medium);color:var(--color-text);margin-bottom:var(--space-xs)}.form-label.required:after{content:" *";color:var(--color-error)}.form-input,.form-select,.form-textarea{width:100%;padding:var(--space-sm) var(--space-md);border:1px solid var(--color-border);border-radius:var(--radius-md);font-size:var(--text-base);font-family:inherit;color:var(--color-text);background:var(--color-bg);transition:all var(--transition-fast);min-height:44px}.form-input:focus,.form-select:focus,.form-textarea:focus{outline:none;border-color:var(--color-primary);box-shadow:0 0 0 3px #2563eb1a}.form-input:disabled,.form-select:disabled,.form-textarea:disabled{background:var(--color-bg-muted);color:var(--color-text-muted);cursor:not-allowed;opacity:.6}.form-input-sm{padding:var(--space-xs) var(--space-sm);font-size:var(--text-sm);min-height:36px}.form-input-lg{padding:var(--space-md) var(--space-lg);font-size:var(--text-lg);min-height:52px}.form-textarea{resize:vertical;min-height:100px;line-height:var(--leading-normal)}.form-textarea-sm{min-height:80px}.form-textarea-lg{min-height:120px}.form-select{cursor:pointer;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3E%3Cpath stroke='%236b7280' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3E%3C/svg%3E");background-position:right var(--space-sm) center;background-repeat:no-repeat;background-size:16px 16px;padding-right:var(--space-xl);-webkit-appearance:none;-moz-appearance:none;appearance:none}.input-group{display:flex;align-items:stretch;width:100%}.input-group .form-input{border-radius:0;border-right:none}.input-group .form-input:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md)}.input-group .form-input:last-child{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md);border-right:1px solid var(--color-border)}.input-group-addon{display:flex;align-items:center;padding:var(--space-sm) var(--space-md);background:var(--color-bg-secondary);border:1px solid var(--color-border);color:var(--color-text-secondary);font-size:var(--text-sm);white-space:nowrap}.input-group-addon:first-child{border-top-left-radius:var(--radius-md);border-bottom-left-radius:var(--radius-md);border-right:none}.input-group-addon:last-child{border-top-right-radius:var(--radius-md);border-bottom-right-radius:var(--radius-md);border-left:none}.form-floating{position:relative}.form-floating .form-input,.form-floating .form-textarea{padding-top:var(--space-lg);padding-bottom:var(--space-xs)}.form-floating .form-label{position:absolute;top:0;left:var(--space-md);padding:var(--space-sm) var(--space-xs);background:var(--color-bg);color:var(--color-text-muted);font-size:var(--text-sm);transition:all var(--transition-fast);pointer-events:none;transform-origin:left center;z-index:1}.form-floating .form-input:focus+.form-label,.form-floating .form-input:not(:placeholder-shown)+.form-label,.form-floating .form-textarea:focus+.form-label,.form-floating .form-textarea:not(:placeholder-shown)+.form-label{transform:translateY(-50%) scale(.85);color:var(--color-primary)}.form-input.valid,.form-select.valid,.form-textarea.valid{border-color:var(--color-success);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%2316a34a' viewBox='0 0 16 16'%3E%3Cpath d='M12.736 3.97a.733.733 0 0 1 1.047 0c.286.289.29.756.01 1.05L7.88 12.01a.733.733 0 0 1-1.065.02L3.217 8.384a.757.757 0 0 1 0-1.06.733.733 0 0 1 1.047 0l3.052 3.093 5.4-6.425a.247.247 0 0 1 .02-.022Z'/%3E%3C/svg%3E");background-position:right var(--space-sm) center;background-repeat:no-repeat;background-size:16px 16px}.form-input.invalid,.form-select.invalid,.form-textarea.invalid{border-color:var(--color-error);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23dc2626' viewBox='0 0 16 16'%3E%3Cpath d='M4.646 4.646a.5.5 0 0 1 .708 0L8 7.293l2.646-2.647a.5.5 0 0 1 .708.708L8.707 8l2.647 2.646a.5.5 0 0 1-.708.708L8 8.707l-2.646 2.647a.5.5 0 0 1-.708-.708L7.293 8 4.646 5.354a.5.5 0 0 1 0-.708z'/%3E%3C/svg%3E");background-position:right var(--space-sm) center;background-repeat:no-repeat;background-size:16px 16px}.form-select.valid,.form-select.invalid{padding-right:calc(var(--space-xl) + var(--space-lg))}.form-help{font-size:var(--text-sm);color:var(--color-text-secondary);margin-top:var(--space-xs)}.form-error{font-size:var(--text-sm);color:var(--color-error);margin-top:var(--space-xs);display:flex;align-items:center;gap:var(--space-xs)}.form-success{font-size:var(--text-sm);color:var(--color-success);margin-top:var(--space-xs);display:flex;align-items:center;gap:var(--space-xs)}.form-check{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-sm)}.form-check-input{width:18px;height:18px;border:1px solid var(--color-border);background:var(--color-bg);cursor:pointer;transition:all var(--transition-fast)}.form-check-input[type=checkbox]{border-radius:var(--radius-sm)}.form-check-input[type=radio]{border-radius:50%}.form-check-input:checked{background:var(--color-primary);border-color:var(--color-primary);background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ffffff' viewBox='0 0 16 16'%3E%3Cpath d='M12.736 3.97a.733.733 0 0 1 1.047 0c.286.289.29.756.01 1.05L7.88 12.01a.733.733 0 0 1-1.065.02L3.217 8.384a.757.757 0 0 1 0-1.06.733.733 0 0 1 1.047 0l3.052 3.093 5.4-6.425a.247.247 0 0 1 .02-.022Z'/%3E%3C/svg%3E");background-position:center;background-repeat:no-repeat;background-size:12px 12px}.form-check-input[type=radio]:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23ffffff' viewBox='0 0 16 16'%3E%3Ccircle cx='8' cy='8' r='4'/%3E%3C/svg%3E");background-size:8px 8px}.form-check-input:focus{outline:none;box-shadow:0 0 0 3px #2563eb1a}.form-check-label{font-size:var(--text-sm);color:var(--color-text);cursor:pointer;-webkit-user-select:none;user-select:none}.form-actions{display:flex;gap:var(--space-md);justify-content:flex-end;margin-top:var(--space-xl);padding-top:var(--space-lg);border-top:1px solid var(--color-border)}.form-actions-center{justify-content:center}.form-actions-start{justify-content:flex-start}.form-actions-between{justify-content:space-between}.search-form{display:flex;gap:var(--space-sm);align-items:end;margin-bottom:var(--space-lg)}.search-input{position:relative;flex:1}.search-input .form-input{padding-right:var(--space-3xl)}.search-icon{position:absolute;right:var(--space-md);top:50%;transform:translateY(-50%);color:var(--color-text-muted);font-size:var(--text-lg);pointer-events:none}.form-inline{display:flex;gap:var(--space-md);align-items:end;flex-wrap:wrap}.form-inline .form-group{flex:1;min-width:150px}.file-upload{position:relative;display:inline-block;cursor:pointer;width:100%}.file-upload-input{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer}.file-upload-label{display:flex;align-items:center;justify-content:center;gap:var(--space-sm);padding:var(--space-lg);border:2px dashed var(--color-border);border-radius:var(--radius-md);background:var(--color-bg-secondary);color:var(--color-text-secondary);cursor:pointer;transition:all var(--transition-fast);min-height:120px;text-align:center}.file-upload:hover .file-upload-label,.file-upload-label.drag-over{border-color:var(--color-primary);background:#2563eb0d;color:var(--color-primary)}@media (max-width: 768px){.form-row{flex-direction:column;gap:var(--space-md)}.form-inline{flex-direction:column;align-items:stretch}.form-inline .form-group{min-width:auto}.form-actions{flex-direction:column}.form-actions-between{justify-content:center;flex-direction:column-reverse}.search-form{flex-direction:column}.form-input,.form-select,.form-textarea{min-height:44px;font-size:16px}.form-check-input{width:20px;height:20px;min-height:20px}}@media print{.form-actions{display:none}.form-input,.form-select,.form-textarea{border:none;border-bottom:1px solid #000;border-radius:0;background:transparent;padding:var(--space-xs) 0}.form-label{font-weight:700}}.stats-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:var(--space-lg);margin-bottom:var(--space-xl)}.stats-card{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--card-radius);padding:var(--space-lg);box-shadow:var(--shadow-sm);transition:all var(--transition-fast);position:relative;overflow:hidden}.stats-card:hover{box-shadow:var(--shadow-md);border-color:var(--color-border-dark);transform:translateY(-2px)}.stats-card-header{display:flex;align-items:center;gap:var(--space-sm);margin-bottom:var(--space-md);padding-bottom:var(--space-sm);border-bottom:1px solid var(--color-border-light)}.stats-card-header i{font-size:var(--text-xl);width:32px;height:32px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md);background:var(--color-bg-secondary)}.stats-card-header h3{font-size:var(--text-lg);font-weight:var(--font-semibold);color:var(--color-text);margin:0}.stats-details{display:flex;flex-direction:column;gap:var(--space-sm)}.stat-row{display:flex;justify-content:space-between;align-items:center;font-size:var(--text-sm);padding:var(--space-xs) 0;min-height:24px}.stat-row span:first-child{color:var(--color-text-secondary);font-weight:var(--font-medium)}.stat-row span:last-child{color:var(--color-text);font-weight:var(--font-medium);text-align:right}.stat-highlight{background:var(--color-bg-secondary);padding:var(--space-sm);border-radius:var(--radius-sm);font-weight:var(--font-semibold);margin:var(--space-sm) 0;border-left:3px solid var(--color-primary)}.stat-warning{color:var(--color-error);font-weight:var(--font-semibold)}.stat-warning span:first-child{color:var(--color-error)}.stat-success{color:var(--color-success);font-weight:var(--font-semibold)}.stat-success span:first-child{color:var(--color-success)}.treasury-content{display:flex;flex-direction:column;gap:var(--space-md)}.treasury-section{display:flex;flex-direction:column;gap:var(--space-xs)}.treasury-section-title{font-size:var(--text-sm);font-weight:var(--font-semibold);color:var(--color-text);text-transform:uppercase;letter-spacing:.05em;margin-bottom:var(--space-xs);padding-bottom:var(--space-xs);border-bottom:1px solid var(--color-border)}.account-item{display:flex;justify-content:space-between;align-items:center;font-size:var(--text-xs);padding:var(--space-xs) 0}.account-name{color:var(--color-text-secondary);font-weight:var(--font-medium);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.account-balance{color:var(--color-text);font-weight:var(--font-semibold);flex-shrink:0;margin-left:var(--space-sm)}.treasury-totals{margin-top:var(--space-sm);padding-top:var(--space-sm);border-top:1px solid var(--color-border);background:var(--color-bg-muted);margin-left:calc(-1 * var(--space-lg));margin-right:calc(-1 * var(--space-lg));margin-bottom:calc(-1 * var(--space-lg));padding-left:var(--space-lg);padding-right:var(--space-lg);padding-bottom:var(--space-lg)}.total-item{display:flex;justify-content:space-between;align-items:center;font-size:var(--text-sm);padding:var(--space-xs) 0;color:var(--color-text);font-weight:var(--font-semibold)}.kpi-large-card{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--card-radius);padding:var(--space-xl);text-align:center;box-shadow:var(--shadow-sm);transition:all var(--transition-fast)}.kpi-large-card:hover{box-shadow:var(--shadow-lg);transform:translateY(-4px)}.kpi-large-value{font-size:var(--text-4xl);font-weight:var(--font-bold);color:var(--color-text);line-height:var(--leading-tight);margin-bottom:var(--space-sm)}.kpi-large-label{font-size:var(--text-base);font-weight:var(--font-medium);color:var(--color-text-secondary);text-transform:uppercase;letter-spacing:.05em}.kpi-large-change{display:flex;align-items:center;justify-content:center;gap:var(--space-xs);font-size:var(--text-sm);font-weight:var(--font-medium);margin-top:var(--space-md)}.kpi-large-change.positive{color:var(--color-success)}.kpi-large-change.negative{color:var(--color-error)}.mini-stats-grid{display:grid;grid-template-columns:repeat(4,1fr);grid-template-rows:repeat(3,1fr);gap:var(--space-md)}.mini-stat-card{background:var(--color-bg);border:1px solid var(--color-border);border-radius:var(--radius-sm);padding:var(--space-sm);text-align:center;transition:all var(--transition-fast);position:relative;overflow:hidden}.mini-stat-card:hover{box-shadow:var(--shadow-md);border-color:var(--color-primary);transform:scale(1.02)}.mini-stat-icon{width:16px;height:16px;margin-bottom:var(--space-xs);opacity:.7}.mini-stat-value{font-size:var(--text-base);font-weight:var(--font-bold);line-height:var(--leading-tight);color:var(--color-text);margin-bottom:var(--space-xs)}.mini-stat-label{font-size:var(--text-xs);color:var(--color-text-secondary);line-height:var(--leading-tight)}.mini-stat-card.heat-low{background:var(--green-50);border-color:var(--color-success)}.mini-stat-card.heat-low .mini-stat-value{color:var(--color-success)}.mini-stat-card.heat-medium{background:var(--yellow-50);border-color:var(--color-warning)}.mini-stat-card.heat-medium .mini-stat-value{color:var(--color-warning)}.mini-stat-card.heat-high{background:var(--red-50);border-color:var(--color-error)}.mini-stat-card.heat-high .mini-stat-value{color:var(--color-error)}.quick-actions-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:var(--space-md)}.stats-loading{display:flex;align-items:center;justify-content:center;padding:var(--space-xl);color:var(--color-text-secondary)}.stats-loading-spinner{width:24px;height:24px;border:2px solid var(--color-border);border-top-color:var(--color-primary);border-radius:50%;animation:spin 1s linear infinite;margin-bottom:var(--space-sm)}.stats-card.clients{border-left-color:var(--blue-500)}.stats-card.clients .stats-card-header i{color:var(--blue-500);background:var(--blue-50)}.stats-card.suppliers{border-left-color:var(--yellow-500)}.stats-card.suppliers .stats-card-header i{color:var(--yellow-600);background:var(--yellow-50)}.stats-card.treasury{border-left-color:var(--green-500)}.stats-card.treasury .stats-card-header i{color:var(--green-500);background:var(--green-50)}@media (max-width: 1024px){.stats-grid{grid-template-columns:repeat(2,1fr)}.mini-stats-grid{grid-template-columns:repeat(3,1fr)}}@media (max-width: 768px){.stats-grid{grid-template-columns:1fr;gap:var(--space-md)}.stats-card{padding:var(--space-md)}.treasury-totals{margin-left:calc(-1 * var(--space-md));margin-right:calc(-1 * var(--space-md));margin-bottom:calc(-1 * var(--space-md));padding-left:var(--space-md);padding-right:var(--space-md);padding-bottom:var(--space-md)}.mini-stats-grid{grid-template-columns:repeat(2,1fr);grid-template-rows:repeat(6,1fr)}.kpi-large-value{font-size:var(--text-3xl)}.quick-actions-grid{grid-template-columns:1fr}}@media (max-width: 480px){.mini-stats-grid{grid-template-columns:1fr;grid-template-rows:repeat(12,auto)}.mini-stat-card{padding:var(--space-xs)}.mini-stat-value{font-size:var(--text-sm)}.stats-card-header{flex-direction:column;text-align:center;gap:var(--space-xs)}.stat-row{flex-direction:column;align-items:flex-start;gap:var(--space-xs)}.stat-row span:last-child{text-align:left}}.summary-stats-inline{display:flex;gap:var(--space-xl);justify-content:flex-end;margin-bottom:var(--space-sm);padding:var(--space-sm) var(--space-md);background-color:var(--color-bg-secondary);border-radius:var(--radius-md);border:1px solid var(--color-border)}.summary-stats-inline .stat-item{display:flex;align-items:center;gap:var(--space-sm)}.summary-stats-inline .stat-label{font-size:var(--text-sm);color:var(--color-text-secondary)}.summary-stats-inline .stat-value{font-size:var(--text-sm);font-weight:var(--font-semibold);font-variant-numeric:tabular-nums}.summary-stats-inline .stat-value.positive,.summary-stats-inline .stat-value.incasari{color:var(--color-success)}.summary-stats-inline .stat-value.negative,.summary-stats-inline .stat-value.plati{color:var(--color-error)}@media (max-width: 768px){.summary-stats-inline{flex-direction:column;gap:var(--space-sm);align-items:flex-end}}@media print{.stats-card{break-inside:avoid;box-shadow:none;border:1px solid #ccc}.stats-grid{grid-template-columns:repeat(2,1fr);gap:1rem}.summary-stats-inline{border:1px solid #ccc;background:#f5f5f5}}.loading-spinner{width:var(--spinner-size, 40px);height:var(--spinner-size, 40px);border:4px solid var(--color-border);border-top-color:var(--color-primary);border-radius:var(--radius-full);animation:spin 1s linear infinite}.loading-spinner-sm{--spinner-size: 24px;border-width:3px}.loading-spinner-lg{--spinner-size: 56px;border-width:5px}.trend{display:inline-flex;align-items:center;gap:var(--space-xs);font-size:var(--text-sm);font-weight:var(--font-medium)}.trend-up{color:var(--color-success)}.trend-down{color:var(--color-error)}.trend-neutral{color:var(--color-text-secondary)}.trend-icon{font-size:.75rem}.collapsible-header{display:flex;justify-content:space-between;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none;padding:var(--space-sm);border-radius:var(--radius-sm);transition:background-color var(--transition-fast)}.collapsible-header:hover{background:var(--color-bg-secondary)}.collapse-icon{font-size:.625rem;color:var(--color-text-secondary);transition:transform var(--transition-fast);display:inline-block;width:1rem}.collapse-icon.expanded{transform:rotate(90deg)}.card-hover{transition:all var(--transition-fast)}.card-hover:hover{box-shadow:var(--shadow-md);transform:translateY(var(--hover-lift, -2px));border-color:var(--color-primary)}.sparkline-container{width:100%;background:var(--color-bg-secondary);border:1px solid var(--color-border);border-radius:var(--radius-sm);padding:var(--space-sm)}.sparkline-chart{width:100%;height:var(--sparkline-height, 80px);position:relative}.sparkline-chart-lg{--sparkline-height: 150px}.sparkline-canvas{width:100%!important;height:100%!important;display:block}.page-header{margin-bottom:var(--space-md);text-align:center}.page-title{margin:0 0 var(--space-sm) 0;font-size:var(--text-3xl);font-weight:var(--font-bold);color:var(--color-text);display:flex;align-items:center;justify-content:center;gap:var(--space-md)}.page-subtitle{margin:0;font-size:var(--text-base);color:var(--color-text-secondary)}.section-header{display:flex;justify-content:space-between;align-items:center;padding:var(--space-lg);background:var(--color-bg-secondary);border-bottom:1px solid var(--color-border);flex-wrap:wrap;gap:var(--space-md)}.section-title{font-size:var(--text-xl);font-weight:var(--font-semibold);color:var(--color-text);margin:0}.section-controls{display:flex;align-items:center;gap:var(--space-md);flex-wrap:wrap}.metrics-row{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--space-lg);margin-bottom:var(--space-xl)}@media (max-width: 1024px){.metrics-row{grid-template-columns:1fr}}.breakdown-section{padding-top:var(--space-lg);border-top:1px solid var(--color-border);margin-top:var(--space-lg)}.breakdown-item{display:flex;justify-content:space-between;align-items:center;padding:var(--space-sm) 0}.breakdown-label{font-size:var(--text-sm);color:var(--color-text-secondary);font-weight:var(--font-medium)}.breakdown-value{font-size:var(--text-base);color:var(--color-text);font-weight:var(--font-semibold);font-family:var(--font-mono, monospace)}.breakdown-subitems{padding-left:var(--space-lg);margin-top:var(--space-sm)}.breakdown-subitem{display:flex;justify-content:space-between;padding:var(--space-xs) 0}.breakdown-sublabel{color:var(--color-text-secondary);font-size:var(--text-sm)}.breakdown-subvalue{font-weight:var(--font-medium);font-family:var(--font-mono, monospace);font-size:var(--text-sm)}.metric-sparkline{margin:var(--space-md) 0}.sparkline-container{width:100%;height:60px;position:relative}.sparkline-canvas{width:100%;height:100%}.sparkline-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:var(--space-xs)}.sparkline-title{font-size:var(--text-xs);color:var(--color-text-secondary);text-transform:uppercase;font-weight:var(--font-medium)}.sparkline-value{font-size:var(--text-sm);font-weight:var(--font-semibold);font-family:var(--font-mono, monospace)}.breakdown-header{display:flex;justify-content:space-between;align-items:center;cursor:pointer;-webkit-user-select:none;user-select:none;padding:var(--space-sm);border-radius:var(--radius-sm);transition:background-color var(--transition-fast);margin-bottom:var(--space-xs)}.breakdown-header:hover{background:var(--color-bg-secondary)}.breakdown-header-left{display:flex;align-items:center;gap:var(--space-sm)}.breakdown-toggle{color:var(--color-text-secondary);font-size:.625rem;transition:transform var(--transition-fast)}.breakdown-toggle.expanded{transform:rotate(90deg)}.breakdown-divider{height:1px;background:var(--color-border);margin:var(--space-md) 0}@keyframes slideDown{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.slide-down{animation:slideDown var(--duration-fast) ease-out}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.fade-in{animation:fadeIn var(--duration-normal) ease-in}@keyframes slideInRight{0%{opacity:0;transform:translate(20px)}to{opacity:1;transform:translate(0)}}.slide-in-right{animation:slideInRight var(--duration-normal) ease-out}@keyframes pulse{0%,to{opacity:1}50%{opacity:.5}}.pulse{animation:pulse var(--duration-slower) ease-in-out infinite}.m-0{margin:0}.m-1{margin:var(--space-xs)}.m-2{margin:var(--space-sm)}.m-3{margin:.75rem}.m-4{margin:var(--space-md)}.m-5{margin:1.25rem}.m-6{margin:var(--space-lg)}.m-8{margin:var(--space-xl)}.m-10{margin:2.5rem}.m-12{margin:var(--space-3xl)}.m-auto{margin:auto}.mt-0{margin-top:0}.mt-1{margin-top:var(--space-xs)}.mt-2{margin-top:var(--space-sm)}.mt-3{margin-top:.75rem}.mt-4{margin-top:var(--space-md)}.mt-5{margin-top:1.25rem}.mt-6{margin-top:var(--space-lg)}.mt-8{margin-top:var(--space-xl)}.mt-10{margin-top:2.5rem}.mt-12{margin-top:var(--space-3xl)}.mt-auto{margin-top:auto}.mr-0{margin-right:0}.mr-1{margin-right:var(--space-xs)}.mr-2{margin-right:var(--space-sm)}.mr-3{margin-right:.75rem}.mr-4{margin-right:var(--space-md)}.mr-5{margin-right:1.25rem}.mr-6{margin-right:var(--space-lg)}.mr-8{margin-right:var(--space-xl)}.mr-10{margin-right:2.5rem}.mr-12{margin-right:var(--space-3xl)}.mr-auto{margin-right:auto}.mb-0{margin-bottom:0}.mb-1{margin-bottom:var(--space-xs)}.mb-2{margin-bottom:var(--space-sm)}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:var(--space-md)}.mb-5{margin-bottom:1.25rem}.mb-6{margin-bottom:var(--space-lg)}.mb-8{margin-bottom:var(--space-xl)}.mb-10{margin-bottom:2.5rem}.mb-12{margin-bottom:var(--space-3xl)}.mb-auto{margin-bottom:auto}.ml-0{margin-left:0}.ml-1{margin-left:var(--space-xs)}.ml-2{margin-left:var(--space-sm)}.ml-3{margin-left:.75rem}.ml-4{margin-left:var(--space-md)}.ml-5{margin-left:1.25rem}.ml-6{margin-left:var(--space-lg)}.ml-8{margin-left:var(--space-xl)}.ml-10{margin-left:2.5rem}.ml-12{margin-left:var(--space-3xl)}.ml-auto{margin-left:auto}.mx-0{margin-left:0;margin-right:0}.mx-1{margin-left:var(--space-xs);margin-right:var(--space-xs)}.mx-2{margin-left:var(--space-sm);margin-right:var(--space-sm)}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-4{margin-left:var(--space-md);margin-right:var(--space-md)}.mx-5{margin-left:1.25rem;margin-right:1.25rem}.mx-6{margin-left:var(--space-lg);margin-right:var(--space-lg)}.mx-8{margin-left:var(--space-xl);margin-right:var(--space-xl)}.mx-auto{margin-left:auto;margin-right:auto}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:var(--space-xs);margin-bottom:var(--space-xs)}.my-2{margin-top:var(--space-sm);margin-bottom:var(--space-sm)}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:var(--space-md);margin-bottom:var(--space-md)}.my-5{margin-top:1.25rem;margin-bottom:1.25rem}.my-6{margin-top:var(--space-lg);margin-bottom:var(--space-lg)}.my-8{margin-top:var(--space-xl);margin-bottom:var(--space-xl)}.my-auto{margin-top:auto;margin-bottom:auto}.p-0{padding:0}.p-1{padding:var(--space-xs)}.p-2{padding:var(--space-sm)}.p-3{padding:.75rem}.p-4{padding:var(--space-md)}.p-5{padding:1.25rem}.p-6{padding:var(--space-lg)}.p-8{padding:var(--space-xl)}.p-10{padding:2.5rem}.p-12{padding:var(--space-3xl)}.pt-0{padding-top:0}.pt-1{padding-top:var(--space-xs)}.pt-2{padding-top:var(--space-sm)}.pt-3{padding-top:.75rem}.pt-4{padding-top:var(--space-md)}.pt-5{padding-top:1.25rem}.pt-6{padding-top:var(--space-lg)}.pt-8{padding-top:var(--space-xl)}.pt-10{padding-top:2.5rem}.pt-12{padding-top:var(--space-3xl)}.pr-0{padding-right:0}.pr-1{padding-right:var(--space-xs)}.pr-2{padding-right:var(--space-sm)}.pr-3{padding-right:.75rem}.pr-4{padding-right:var(--space-md)}.pr-5{padding-right:1.25rem}.pr-6{padding-right:var(--space-lg)}.pr-8{padding-right:var(--space-xl)}.pr-10{padding-right:2.5rem}.pr-12{padding-right:var(--space-3xl)}.pb-0{padding-bottom:0}.pb-1{padding-bottom:var(--space-xs)}.pb-2{padding-bottom:var(--space-sm)}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:var(--space-md)}.pb-5{padding-bottom:1.25rem}.pb-6{padding-bottom:var(--space-lg)}.pb-8{padding-bottom:var(--space-xl)}.pb-10{padding-bottom:2.5rem}.pb-12{padding-bottom:var(--space-3xl)}.pl-0{padding-left:0}.pl-1{padding-left:var(--space-xs)}.pl-2{padding-left:var(--space-sm)}.pl-3{padding-left:.75rem}.pl-4{padding-left:var(--space-md)}.pl-5{padding-left:1.25rem}.pl-6{padding-left:var(--space-lg)}.pl-8{padding-left:var(--space-xl)}.pl-10{padding-left:2.5rem}.pl-12{padding-left:var(--space-3xl)}.px-0{padding-left:0;padding-right:0}.px-1{padding-left:var(--space-xs);padding-right:var(--space-xs)}.px-2{padding-left:var(--space-sm);padding-right:var(--space-sm)}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:var(--space-md);padding-right:var(--space-md)}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:var(--space-lg);padding-right:var(--space-lg)}.px-8{padding-left:var(--space-xl);padding-right:var(--space-xl)}.py-0{padding-top:0;padding-bottom:0}.py-1{padding-top:var(--space-xs);padding-bottom:var(--space-xs)}.py-2{padding-top:var(--space-sm);padding-bottom:var(--space-sm)}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:var(--space-md);padding-bottom:var(--space-md)}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.py-6{padding-top:var(--space-lg);padding-bottom:var(--space-lg)}.py-8{padding-top:var(--space-xl);padding-bottom:var(--space-xl)}.space-x-1>*+*{margin-left:var(--space-xs)}.space-x-2>*+*{margin-left:var(--space-sm)}.space-x-3>*+*{margin-left:.75rem}.space-x-4>*+*{margin-left:var(--space-md)}.space-x-6>*+*{margin-left:var(--space-lg)}.space-x-8>*+*{margin-left:var(--space-xl)}.space-y-1>*+*{margin-top:var(--space-xs)}.space-y-2>*+*{margin-top:var(--space-sm)}.space-y-3>*+*{margin-top:.75rem}.space-y-4>*+*{margin-top:var(--space-md)}.space-y-6>*+*{margin-top:var(--space-lg)}.space-y-8>*+*{margin-top:var(--space-xl)}@media (max-width: 768px){.m-4{margin:var(--space-sm)}.p-4{padding:var(--space-sm)}.mt-4{margin-top:var(--space-sm)}.mb-4{margin-bottom:var(--space-sm)}.pt-4{padding-top:var(--space-sm)}.pb-4{padding-bottom:var(--space-sm)}.px-4{padding-left:var(--space-sm);padding-right:var(--space-sm)}.py-4{padding-top:var(--space-sm);padding-bottom:var(--space-sm)}}@media (max-width: 480px){.m-6{margin:var(--space-md)}.p-6{padding:var(--space-md)}.mt-6{margin-top:var(--space-md)}.mb-6{margin-bottom:var(--space-md)}.pt-6{padding-top:var(--space-md)}.pb-6{padding-bottom:var(--space-md)}.px-6{padding-left:var(--space-md);padding-right:var(--space-md)}.py-6{padding-top:var(--space-md);padding-bottom:var(--space-md)}}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.grid{display:grid}.inline-grid{display:inline-grid}.table{display:table}.table-cell{display:table-cell}.table-row{display:table-row}.hidden{display:none}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.relative{position:relative}.absolute{position:absolute}.fixed{position:fixed}.sticky{position:sticky}.top-0{top:0}.top-1{top:var(--space-xs)}.top-2{top:var(--space-sm)}.top-4{top:var(--space-md)}.top-auto{top:auto}.right-0{right:0}.right-1{right:var(--space-xs)}.right-2{right:var(--space-sm)}.right-4{right:var(--space-md)}.right-auto{right:auto}.bottom-0{bottom:0}.bottom-1{bottom:var(--space-xs)}.bottom-2{bottom:var(--space-sm)}.bottom-4{bottom:var(--space-md)}.bottom-auto{bottom:auto}.left-0{left:0}.left-1{left:var(--space-xs)}.left-2{left:var(--space-sm)}.left-4{left:var(--space-md)}.left-auto{left:auto}.inset-0{top:0;right:0;bottom:0;left:0}.z-0{z-index:0}.z-10{z-index:10}.z-20{z-index:20}.z-30{z-index:30}.z-40{z-index:40}.z-50{z-index:50}.z-auto{z-index:auto}.z-dropdown{z-index:var(--z-dropdown)}.z-sticky{z-index:var(--z-sticky)}.z-fixed{z-index:var(--z-fixed)}.z-modal{z-index:var(--z-modal)}.float-left{float:left}.float-right{float:right}.float-none{float:none}.clearfix:after{content:"";display:table;clear:both}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-visible{overflow:visible}.overflow-scroll{overflow:scroll}.overflow-x-auto{overflow-x:auto}.overflow-x-hidden{overflow-x:hidden}.overflow-x-visible{overflow-x:visible}.overflow-x-scroll{overflow-x:scroll}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.overflow-y-visible{overflow-y:visible}.overflow-y-scroll{overflow-y:scroll}.object-contain{object-fit:contain}.object-cover{object-fit:cover}.object-fill{object-fit:fill}.object-none{object-fit:none}.object-scale-down{object-fit:scale-down}.object-bottom{object-position:bottom}.object-center{object-position:center}.object-left{object-position:left}.object-right{object-position:right}.object-top{object-position:top}.w-auto{width:auto}.w-full{width:100%}.w-screen{width:100vw}.w-min{width:min-content}.w-max{width:max-content}.w-fit{width:fit-content}.w-0{width:0}.w-1{width:var(--space-xs)}.w-2{width:var(--space-sm)}.w-4{width:var(--space-md)}.w-6{width:var(--space-lg)}.w-8{width:var(--space-xl)}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.max-w-none{max-width:none}.max-w-full{max-width:100%}.max-w-screen{max-width:100vw}.max-w-xs{max-width:20rem}.max-w-sm{max-width:24rem}.max-w-md{max-width:28rem}.max-w-lg{max-width:32rem}.max-w-xl{max-width:36rem}.max-w-2xl{max-width:42rem}.max-w-3xl{max-width:48rem}.max-w-4xl{max-width:56rem}.max-w-5xl{max-width:64rem}.max-w-6xl{max-width:72rem}.max-w-7xl{max-width:80rem}.min-w-0{min-width:0}.min-w-full{min-width:100%}.min-w-min{min-width:min-content}.min-w-max{min-width:max-content}.min-w-fit{min-width:fit-content}.h-auto{height:auto}.h-full{height:100%}.h-screen{height:100vh}.h-min{height:min-content}.h-max{height:max-content}.h-fit{height:fit-content}.h-0{height:0}.h-1{height:var(--space-xs)}.h-2{height:var(--space-sm)}.h-4{height:var(--space-md)}.h-6{height:var(--space-lg)}.h-8{height:var(--space-xl)}.h-10{height:2.5rem}.h-12{height:var(--space-3xl)}.h-16{height:4rem}.h-20{height:5rem}.h-24{height:6rem}.h-32{height:8rem}.h-40{height:10rem}.h-48{height:12rem}.h-56{height:14rem}.h-64{height:16rem}.max-h-full{max-height:100%}.max-h-screen{max-height:100vh}.max-h-none{max-height:none}.min-h-0{min-height:0}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.aspect-auto{aspect-ratio:auto}.aspect-square{aspect-ratio:1 / 1}.aspect-video{aspect-ratio:16 / 9}.box-border{box-sizing:border-box}.box-content{box-sizing:content-box}.cursor-auto{cursor:auto}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-wait{cursor:wait}.cursor-text{cursor:text}.cursor-move{cursor:move}.cursor-help{cursor:help}.cursor-not-allowed{cursor:not-allowed}.select-none{-webkit-user-select:none;user-select:none}.select-text{-webkit-user-select:text;user-select:text}.select-all{-webkit-user-select:all;user-select:all}.select-auto{-webkit-user-select:auto;user-select:auto}.pointer-events-none{pointer-events:none}.pointer-events-auto{pointer-events:auto}.resize-none{resize:none}.resize{resize:both}.resize-y{resize:vertical}.resize-x{resize:horizontal}@media (max-width: 480px){.mobile-hidden{display:none!important}.mobile-block{display:block!important}.mobile-flex{display:flex!important}.mobile-grid{display:grid!important}}@media (min-width: 481px){.mobile-only{display:none!important}}@media (max-width: 768px){.tablet-hidden{display:none!important}.tablet-block{display:block!important}.tablet-flex{display:flex!important}.tablet-grid{display:grid!important}}@media (min-width: 769px){.tablet-only{display:none!important}}@media (min-width: 1024px){.desktop-only{display:block!important}}@media (max-width: 1023px){.desktop-hidden{display:none!important}}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-justify{text-align:justify}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.normal-case{text-transform:none}.font-thin{font-weight:100}.font-extralight{font-weight:200}.font-light{font-weight:var(--font-light)}.font-normal{font-weight:var(--font-normal)}.font-medium{font-weight:var(--font-medium)}.font-semibold{font-weight:var(--font-semibold)}.font-bold{font-weight:var(--font-bold)}.font-extrabold{font-weight:800}.font-black{font-weight:900}.text-xs{font-size:var(--text-xs)}.text-sm{font-size:var(--text-sm)}.text-base{font-size:var(--text-base)}.text-lg{font-size:var(--text-lg)}.text-xl{font-size:var(--text-xl)}.text-2xl{font-size:var(--text-2xl)}.text-3xl{font-size:var(--text-3xl)}.text-4xl{font-size:var(--text-4xl)}.leading-none{line-height:1}.leading-tight{line-height:var(--leading-tight)}.leading-snug{line-height:1.375}.leading-normal{line-height:var(--leading-normal)}.leading-relaxed{line-height:1.625}.leading-loose{line-height:var(--leading-loose)}.tracking-tighter{letter-spacing:-.05em}.tracking-tight{letter-spacing:-.025em}.tracking-normal{letter-spacing:0em}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.tracking-widest{letter-spacing:.1em}.text-inherit{color:inherit}.text-current{color:currentColor}.text-transparent{color:transparent}.text-secondary{color:var(--color-secondary)}.underline{text-decoration:underline}.line-through{text-decoration:line-through}.no-underline{text-decoration:none}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-ellipsis{text-overflow:ellipsis}.text-clip{text-overflow:clip}.whitespace-normal{white-space:normal}.whitespace-nowrap{white-space:nowrap}.whitespace-pre{white-space:pre}.whitespace-pre-line{white-space:pre-line}.whitespace-pre-wrap{white-space:pre-wrap}.break-normal{overflow-wrap:normal;word-break:normal}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.font-serif{font-family:Georgia,Cambria,Times New Roman,Times,serif}.font-mono{font-family:var(--font-mono)}@media (max-width: 480px){.mobile-text-xs{font-size:var(--text-xs)}.mobile-text-sm{font-size:var(--text-sm)}.mobile-text-base{font-size:var(--text-base)}.mobile-text-center{text-align:center}.mobile-text-left{text-align:left}}@media (max-width: 768px){.tablet-text-xs{font-size:var(--text-xs)}.tablet-text-sm{font-size:var(--text-sm)}.tablet-text-center{text-align:center}.tablet-text-left{text-align:left}}@media (min-width: 1024px){.desktop-text-lg{font-size:var(--text-lg)}.desktop-text-xl{font-size:var(--text-xl)}}.flex{display:flex}.inline-flex{display:inline-flex}.flex-row{flex-direction:row}.flex-row-reverse{flex-direction:row-reverse}.flex-col{flex-direction:column}.flex-col-reverse{flex-direction:column-reverse}.flex-wrap{flex-wrap:wrap}.flex-nowrap{flex-wrap:nowrap}.flex-wrap-reverse{flex-wrap:wrap-reverse}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-initial{flex:0 1 auto}.flex-none{flex:none}.flex-grow-0{flex-grow:0}.flex-grow{flex-grow:1}.flex-shrink-0{flex-shrink:0}.flex-shrink{flex-shrink:1}.justify-start{justify-content:flex-start}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.justify-around{justify-content:space-around}.justify-evenly{justify-content:space-evenly}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.items-baseline{align-items:baseline}.items-stretch{align-items:stretch}.content-start{align-content:flex-start}.content-end{align-content:flex-end}.content-center{align-content:center}.content-between{align-content:space-between}.content-around{align-content:space-around}.content-evenly{align-content:space-evenly}.self-auto{align-self:auto}.self-start{align-self:flex-start}.self-end{align-self:flex-end}.self-center{align-self:center}.self-stretch{align-self:stretch}.self-baseline{align-self:baseline}.gap-0{gap:0}.gap-1{gap:var(--space-xs)}.gap-2{gap:var(--space-sm)}.gap-3{gap:.75rem}.gap-4{gap:var(--space-md)}.gap-5{gap:1.25rem}.gap-6{gap:var(--space-lg)}.gap-8{gap:var(--space-xl)}.gap-x-0{column-gap:0}.gap-x-1{column-gap:var(--space-xs)}.gap-x-2{column-gap:var(--space-sm)}.gap-x-3{column-gap:.75rem}.gap-x-4{column-gap:var(--space-md)}.gap-x-6{column-gap:var(--space-lg)}.gap-x-8{column-gap:var(--space-xl)}.gap-y-0{row-gap:0}.gap-y-1{row-gap:var(--space-xs)}.gap-y-2{row-gap:var(--space-sm)}.gap-y-3{row-gap:.75rem}.gap-y-4{row-gap:var(--space-md)}.gap-y-6{row-gap:var(--space-lg)}.gap-y-8{row-gap:var(--space-xl)}.order-1{order:1}.order-2{order:2}.order-3{order:3}.order-4{order:4}.order-5{order:5}.order-6{order:6}.order-7{order:7}.order-8{order:8}.order-9{order:9}.order-10{order:10}.order-11{order:11}.order-12{order:12}.order-first{order:-9999}.order-last{order:9999}.order-none{order:0}@media (max-width: 480px){.mobile-flex{display:flex}.mobile-flex-col{flex-direction:column}.mobile-flex-wrap{flex-wrap:wrap}.mobile-items-center{align-items:center}.mobile-items-start{align-items:flex-start}.mobile-items-stretch{align-items:stretch}.mobile-justify-center{justify-content:center}.mobile-justify-between{justify-content:space-between}}@media (max-width: 768px){.tablet-flex{display:flex}.tablet-flex-col{flex-direction:column}.tablet-flex-wrap{flex-wrap:wrap}.tablet-items-center{align-items:center}.tablet-items-start{align-items:flex-start}.tablet-items-stretch{align-items:stretch}.tablet-justify-center{justify-content:center}.tablet-justify-between{justify-content:space-between}}@media (min-width: 1024px){.desktop-flex{display:flex}.desktop-flex-row{flex-direction:row}.desktop-flex-nowrap{flex-wrap:nowrap}.desktop-items-center{align-items:center}.desktop-justify-start{justify-content:flex-start}}.bg-primary{background-color:var(--color-primary);color:var(--color-text-inverse)}.bg-success{background-color:var(--color-success);color:var(--color-text-inverse)}.bg-warning{background-color:var(--color-warning);color:var(--color-text-inverse)}.bg-error{background-color:var(--color-error);color:var(--color-text-inverse)}.bg-info{background-color:var(--color-info);color:var(--color-text-inverse)}.bg-primary-light{background-color:#2563eb1a;color:var(--color-primary)}.bg-success-light{background-color:#0596691a;color:var(--color-success)}.bg-warning-light{background-color:#d977061a;color:var(--color-warning)}.bg-error-light{background-color:#dc26261a;color:var(--color-error)}.bg-info-light{background-color:#0891b21a;color:var(--color-info)}.text-primary{color:var(--color-primary)}.text-success{color:var(--color-success)}.text-warning{color:var(--color-warning)}.text-error{color:var(--color-error)}.text-info{color:var(--color-info)}.text-muted{color:var(--color-text-muted)}.text-secondary{color:var(--color-text-secondary)}.icon-bg{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border-radius:var(--radius-md)}.icon-bg-sm{width:32px;height:32px}.icon-bg-lg{width:48px;height:48px}.p-inputtext,.p-password input,.p-dropdown,.p-calendar input,.p-autocomplete input{border:2px solid var(--color-border)!important;border-radius:var(--radius-md)!important;padding:var(--space-sm) var(--space-md)!important;font-size:var(--text-base)!important;font-family:inherit!important;color:var(--color-text)!important;background:var(--color-bg)!important;transition:all var(--transition-fast)!important;min-height:44px!important;height:44px!important;box-sizing:border-box!important}.p-password{width:100%}.p-password .p-inputtext{width:100%!important;height:44px!important;min-height:44px!important;padding:var(--space-sm) var(--space-md)!important;padding-right:2.5rem!important}.p-dropdown{display:flex!important;align-items:center!important;padding:0!important;overflow:hidden!important;background:var(--surface-card, var(--color-bg, #fff))!important}[data-theme=dark] .p-dropdown{background:var(--surface-card, #1e293b)!important}.p-dropdown .p-dropdown-label{flex:1!important;padding:var(--space-sm) var(--space-md)!important;background:inherit!important;border:none!important;box-shadow:none!important;color:var(--color-text)!important;border-radius:0!important;margin:0!important}.p-dropdown .p-dropdown-label.p-placeholder{color:var(--text-color-secondary)!important}.p-dropdown .p-dropdown-trigger{width:2.5rem!important;background:inherit!important;border:none!important;border-left:none!important;box-shadow:none!important;padding:0!important;margin:0!important;color:var(--text-color-secondary)!important;border-radius:0!important}.p-dropdown .p-dropdown-trigger .p-dropdown-trigger-icon{color:var(--text-color-secondary)!important}.p-dropdown .p-dropdown-label,.p-dropdown .p-dropdown-trigger,.p-dropdown .p-dropdown-clear-icon{background-color:transparent!important;background:transparent!important;border:0!important;outline:0!important;box-shadow:none!important;border-radius:0!important}.p-dropdown:before,.p-dropdown:after,.p-dropdown .p-dropdown-label:before,.p-dropdown .p-dropdown-label:after,.p-dropdown .p-dropdown-trigger:before,.p-dropdown .p-dropdown-trigger:after{display:none!important;content:none!important}.p-dropdown>*{margin:0!important;border-radius:0!important}.p-inputtext:focus,.p-password input:focus,.p-dropdown:focus,.p-calendar input:focus,.p-autocomplete input:focus{outline:none!important;border-color:var(--color-primary)!important;box-shadow:var(--focus-ring)!important}.p-inputtext:hover:not(:disabled),.p-password input:hover:not(:disabled),.p-dropdown:hover:not(:disabled){border-color:var(--color-border-dark, #d1d5db)!important}.p-inputtext:disabled,.p-password input:disabled,.p-dropdown:disabled{background:var(--color-bg-muted, #f3f4f6)!important;color:var(--color-text-muted, #9ca3af)!important;opacity:.6!important;cursor:not-allowed!important}.p-invalid.p-component,.p-inputtext.p-invalid,.p-password.p-invalid input{border-color:var(--color-error, #ef4444)!important}.p-button{padding:var(--space-sm) var(--space-md)!important;font-size:var(--text-sm)!important;font-weight:var(--font-medium)!important;border-radius:var(--radius-md)!important;transition:all var(--transition-fast)!important}.p-button:hover{transform:translateY(-1px)!important;box-shadow:var(--shadow-md)!important}.p-datatable .p-datatable-thead>tr>th{background:var(--color-bg-muted, #f9fafb)!important;color:var(--color-text)!important;font-weight:var(--font-semibold)!important;border-bottom:2px solid var(--color-border)!important;padding:var(--space-md) var(--space-lg)!important}.p-datatable .p-datatable-tbody>tr{transition:background-color var(--transition-fast)!important}.p-datatable .p-datatable-tbody>tr:nth-child(odd){background-color:var(--surface-card)!important}.p-datatable .p-datatable-tbody>tr:nth-child(2n){background-color:var(--surface-ground)!important}.p-datatable .p-datatable-tbody>tr:hover{background-color:var(--surface-hover)!important;cursor:pointer}.p-datatable-sm .p-datatable-thead>tr>th{padding:.5rem .75rem!important;font-weight:600!important;white-space:nowrap!important}.p-datatable-sm .p-datatable-tbody>tr>td{padding:.4rem .75rem!important}.p-datatable-sm{font-size:.875rem!important}.p-card{background:var(--surface-card)!important;box-shadow:var(--shadow-sm)!important;border:1px solid var(--color-border)!important;border-radius:var(--card-radius, 8px)!important}.p-card .p-card-header{background:var(--color-bg-secondary)!important;border-bottom:1px solid var(--color-border)!important;padding:var(--space-lg)!important}.p-card .p-card-body{padding:var(--space-lg)!important;background:var(--surface-card)!important}.p-card .p-card-content{background:var(--surface-card)!important}@media (max-width: 768px){.p-inputtext,.p-password input,.p-dropdown,.p-calendar input{font-size:16px!important}}.compact-table .p-datatable-tbody>tr>td{padding:.5rem;font-size:.875rem}.compact-table .p-datatable-thead>tr>th{padding:.5rem;font-size:.8rem}.compact-table .p-paginator{padding:.5rem}.compact-table .p-datatable-wrapper{overflow-x:auto}.value-item-total .p-inputnumber{width:100%!important;max-width:130px!important}.value-item-total .p-inputnumber-input{width:100%!important}.payment-method-item .p-inputnumber{width:100%!important;max-width:110px!important}.payment-method-item .p-inputnumber-input{width:100%!important}.dropdown-payment{width:100%!important;max-width:190px!important}.dropdown-payment .p-dropdown{width:100%!important}.input-tva,.input-tva .p-inputnumber-input{width:110px!important}@media (max-width: 768px){.form-field .p-dropdown,.form-field .p-autocomplete,.form-field .p-calendar{width:100%!important}}@media (max-width: 768px){.preview-actions .p-button{width:100%}}.engine-selector .p-dropdown-label{padding:.5rem .75rem!important;font-size:.875rem;color:var(--text-color-secondary)}.engine-selector .p-dropdown-trigger{width:2rem!important}.table-card .p-datatable .p-datatable-tbody>tr{transition:background-color .2s ease}.table-card .p-datatable .p-datatable-tbody>tr:nth-child(odd){background-color:var(--surface-card, #ffffff)}.table-card .p-datatable .p-datatable-tbody>tr:nth-child(2n){background-color:var(--surface-ground, #f8f9fa)}.table-card .p-datatable .p-datatable-tbody>tr:hover{background-color:var(--surface-hover, #e3f2fd)!important;cursor:pointer}.p-datatable .p-datatable-tbody>tr.row-processing{opacity:.7;border-left:3px solid var(--blue-500);background-color:var(--blue-50)!important;transition:opacity var(--transition-fast, .15s ease),background-color var(--transition-fast, .15s ease)}[data-theme=dark] .p-datatable .p-datatable-tbody>tr.row-processing{background-color:color-mix(in srgb,var(--blue-500) 15%,var(--surface-card))!important}@media (prefers-color-scheme: dark){:root:not([data-theme]) .p-datatable .p-datatable-tbody>tr.row-processing{background-color:color-mix(in srgb,var(--blue-500) 15%,var(--surface-card))!important}}.p-datatable .p-datatable-tbody>tr.row-processing:hover{opacity:.8}.p-datatable .p-datatable-tbody>tr.row-processing .p-button:disabled{cursor:not-allowed}.p-datatable .p-datatable-tbody>tr.row-failed{opacity:.85;border-left:3px solid var(--red-500);background-color:var(--red-50)!important;transition:opacity var(--transition-fast, .15s ease),background-color var(--transition-fast, .15s ease)}[data-theme=dark] .p-datatable .p-datatable-tbody>tr.row-failed{background-color:color-mix(in srgb,var(--red-500) 15%,var(--surface-card))!important}@media (prefers-color-scheme: dark){:root:not([data-theme]) .p-datatable .p-datatable-tbody>tr.row-failed{background-color:color-mix(in srgb,var(--red-500) 15%,var(--surface-card))!important}}.p-datatable .p-datatable-tbody>tr.row-failed:hover{opacity:.9}@keyframes highlightGreen{0%{background-color:var(--green-100)}to{background-color:transparent}}@keyframes highlightRed{0%{background-color:var(--red-100)}to{background-color:transparent}}.p-datatable .p-datatable-tbody>tr.row-highlight-completed{animation:highlightGreen 2s ease-out forwards}.p-datatable .p-datatable-tbody>tr.row-highlight-failed{animation:highlightRed 2s ease-out forwards}[data-theme=dark] .p-datatable .p-datatable-tbody>tr.row-highlight-completed{animation-name:highlightGreenDark}[data-theme=dark] .p-datatable .p-datatable-tbody>tr.row-highlight-failed{animation-name:highlightRedDark}@keyframes highlightGreenDark{0%{background-color:color-mix(in srgb,var(--green-500) 25%,var(--surface-card))}to{background-color:transparent}}@keyframes highlightRedDark{0%{background-color:color-mix(in srgb,var(--red-500) 25%,var(--surface-card))}to{background-color:transparent}}@media (prefers-color-scheme: dark){:root:not([data-theme]) .p-datatable .p-datatable-tbody>tr.row-highlight-completed{animation-name:highlightGreenDark}:root:not([data-theme]) .p-datatable .p-datatable-tbody>tr.row-highlight-failed{animation-name:highlightRedDark}}@media (prefers-reduced-motion: reduce){.p-datatable .p-datatable-tbody>tr.row-highlight-completed,.p-datatable .p-datatable-tbody>tr.row-highlight-failed{animation:none}}@keyframes rowFadeOut{0%{opacity:1;transform:translate(0)}to{opacity:0;transform:translate(-10px)}}.p-datatable .p-datatable-tbody>tr.row-cancelling{animation:rowFadeOut .3s ease-out forwards;pointer-events:none}@media (prefers-reduced-motion: reduce){@keyframes rowFadeOut{0%{opacity:1}to{opacity:0}}}.p-confirm-dialog{border-radius:var(--radius-lg)!important;box-shadow:var(--shadow-xl)!important;background:var(--surface-card)!important;border:none!important;min-width:320px!important;max-width:400px!important}.p-confirm-dialog .p-dialog-header{padding:var(--space-lg) var(--space-lg) var(--space-sm) var(--space-lg)!important;background:var(--surface-card)!important;border-bottom:none!important;border-radius:var(--radius-lg) var(--radius-lg) 0 0!important}.p-confirm-dialog .p-dialog-title{font-size:var(--text-xl)!important;font-weight:var(--font-semibold)!important;color:var(--text-color)!important;line-height:var(--leading-tight)!important}.p-confirm-dialog .p-dialog-header-icons{display:flex}.p-confirm-dialog .p-dialog-content{padding:var(--space-sm) var(--space-lg) var(--space-lg) var(--space-lg)!important;background:var(--surface-card)!important;color:var(--text-color-secondary)!important;font-size:var(--text-base)!important;line-height:var(--leading-normal)!important}.p-confirm-dialog .p-confirm-dialog-icon{font-size:1.5rem!important;margin-right:var(--space-md)!important;color:var(--color-error)!important}.p-confirm-dialog .p-confirm-dialog-message{margin-left:0!important;color:var(--text-color-secondary)!important}.p-confirm-dialog .p-dialog-footer{padding:var(--space-sm) var(--space-lg) var(--space-lg) var(--space-lg)!important;background:var(--surface-card)!important;border-top:none!important;border-radius:0 0 var(--radius-lg) var(--radius-lg)!important;display:flex!important;justify-content:flex-end!important;gap:var(--space-sm)!important}.p-confirm-dialog .p-dialog-footer .p-button{min-width:80px!important;padding:var(--space-sm) var(--space-md)!important;font-weight:var(--font-medium)!important;border-radius:var(--radius-md)!important}.p-confirm-dialog .p-dialog-footer .p-button.p-button-text,.p-confirm-dialog .p-dialog-footer .p-button:not(.p-button-danger):not(.p-button-success){background:transparent!important;color:var(--color-primary)!important;border:none!important}.p-confirm-dialog .p-dialog-footer .p-button.p-button-text:hover,.p-confirm-dialog .p-dialog-footer .p-button:not(.p-button-danger):not(.p-button-success):hover{background:var(--primary-50, rgba(37, 99, 235, .08))!important}.p-confirm-dialog .p-dialog-footer .p-button.p-button-danger{background:var(--color-error)!important;color:var(--color-text-inverse)!important;border:none!important}.p-confirm-dialog .p-dialog-footer .p-button.p-button-danger:hover{background:var(--red-700, #b91c1c)!important;box-shadow:var(--shadow-md)!important}[data-theme=dark] .p-confirm-dialog{background:var(--surface-card)!important;box-shadow:0 8px 32px #0006!important}[data-theme=dark] .p-confirm-dialog .p-dialog-header,[data-theme=dark] .p-confirm-dialog .p-dialog-content,[data-theme=dark] .p-confirm-dialog .p-dialog-footer{background:var(--surface-card)!important}[data-theme=dark] .p-confirm-dialog .p-dialog-footer .p-button.p-button-text:hover,[data-theme=dark] .p-confirm-dialog .p-dialog-footer .p-button:not(.p-button-danger):not(.p-button-success):hover{background:#60a5fa26!important}@media (prefers-color-scheme: dark){:root:not([data-theme]) .p-confirm-dialog{background:var(--surface-card)!important;box-shadow:0 8px 32px #0006!important}:root:not([data-theme]) .p-confirm-dialog .p-dialog-header,:root:not([data-theme]) .p-confirm-dialog .p-dialog-content,:root:not([data-theme]) .p-confirm-dialog .p-dialog-footer{background:var(--surface-card)!important}:root:not([data-theme]) .p-confirm-dialog .p-dialog-footer .p-button.p-button-text:hover,:root:not([data-theme]) .p-confirm-dialog .p-dialog-footer .p-button:not(.p-button-danger):not(.p-button-success):hover{background:#60a5fa26!important}}@media (max-width: 768px){.p-confirm-dialog{min-width:unset!important;max-width:90vw!important;width:90vw!important;margin:var(--space-md)!important}.p-confirm-dialog .p-dialog-footer{flex-direction:row!important;gap:var(--space-sm)!important}.p-confirm-dialog .p-dialog-footer .p-button{flex:1!important}}.mobile-server-switch-modal .p-dialog{border-radius:var(--radius-lg)!important;background:var(--surface-card)!important}.mobile-server-switch-modal .p-dialog-header{padding:var(--space-md) var(--space-lg)!important;border-bottom:1px solid var(--surface-border)!important;background:var(--surface-card)!important}.mobile-server-switch-modal .p-dialog-content{padding:var(--space-lg)!important;background:var(--surface-card)!important}.mobile-server-switch-modal .p-dialog-footer{padding:var(--space-md) var(--space-lg)!important;border-top:1px solid var(--surface-border)!important;background:var(--surface-card)!important;display:flex!important;gap:var(--space-sm)!important;justify-content:flex-end!important}[data-theme=dark] .mobile-server-switch-modal .p-dialog{background:var(--surface-card)!important;box-shadow:0 10px 25px #00000080!important}[data-theme=dark] .mobile-server-switch-modal .p-dialog-header{background:var(--surface-card)!important;border-bottom-color:var(--surface-border)!important}[data-theme=dark] .mobile-server-switch-modal .p-dialog-header .p-dialog-title{color:var(--text-color)!important}[data-theme=dark] .mobile-server-switch-modal .p-dialog-content{background:var(--surface-card)!important}[data-theme=dark] .mobile-server-switch-modal .p-dialog-footer{background:var(--surface-card)!important;border-top-color:var(--surface-border)!important}[data-theme=dark] .mobile-server-switch-modal .p-password .p-inputtext,[data-theme=dark] .mobile-server-switch-modal .p-password input,[data-theme=dark] .mobile-server-switch-modal .p-password .p-password-input{background:var(--surface-overlay, #374151)!important;color:#fff!important;border-color:var(--surface-border, #4b5563)!important;-webkit-text-fill-color:#ffffff!important}[data-theme=dark] .mobile-server-switch-modal .p-password .p-inputtext::placeholder,[data-theme=dark] .mobile-server-switch-modal .p-password input::placeholder{color:var(--text-color-secondary, #9ca3af)!important;-webkit-text-fill-color:var(--text-color-secondary, #9ca3af)!important}[data-theme=dark] .mobile-server-switch-modal .p-password .p-inputtext:focus,[data-theme=dark] .mobile-server-switch-modal .p-password input:focus{border-color:var(--primary-400, #60a5fa)!important}[data-theme=dark] .mobile-server-switch-modal .p-password-toggle-icon,[data-theme=dark] .mobile-server-switch-modal .p-password .p-icon{color:var(--text-color-secondary, #9ca3af)!important}@media (prefers-color-scheme: dark){:root:not([data-theme]) .mobile-server-switch-modal .p-dialog{background:var(--surface-card)!important;box-shadow:0 10px 25px #00000080!important}:root:not([data-theme]) .mobile-server-switch-modal .p-dialog-header{background:var(--surface-card)!important;border-bottom-color:var(--surface-border)!important}:root:not([data-theme]) .mobile-server-switch-modal .p-dialog-header .p-dialog-title{color:var(--text-color)!important}:root:not([data-theme]) .mobile-server-switch-modal .p-dialog-content{background:var(--surface-card)!important}:root:not([data-theme]) .mobile-server-switch-modal .p-dialog-footer{background:var(--surface-card)!important;border-top-color:var(--surface-border)!important}:root:not([data-theme]) .mobile-server-switch-modal .p-password .p-inputtext,:root:not([data-theme]) .mobile-server-switch-modal .p-password input,:root:not([data-theme]) .mobile-server-switch-modal .p-password .p-password-input{background:var(--surface-overlay, #374151)!important;color:#fff!important;border-color:var(--surface-border, #4b5563)!important;-webkit-text-fill-color:#ffffff!important}:root:not([data-theme]) .mobile-server-switch-modal .p-password .p-inputtext::placeholder,:root:not([data-theme]) .mobile-server-switch-modal .p-password input::placeholder{color:var(--text-color-secondary, #9ca3af)!important;-webkit-text-fill-color:var(--text-color-secondary, #9ca3af)!important}:root:not([data-theme]) .mobile-server-switch-modal .p-password-toggle-icon,:root:not([data-theme]) .mobile-server-switch-modal .p-password .p-icon{color:var(--text-color-secondary, #9ca3af)!important}}@media (max-width: 768px){.p-menubar{padding:.5rem 1rem}.p-menubar .p-menubar-root-list{flex-direction:column;width:100%;position:absolute;top:100%;left:0;background:var(--surface-overlay);border:1px solid var(--surface-border);border-radius:var(--border-radius);box-shadow:var(--overlay-shadow);z-index:1000}.p-menubar .p-menubar-root-list .p-menuitem{width:100%}.p-menubar .p-menubar-root-list .p-menuitem-link{padding:1rem;border-bottom:1px solid var(--surface-border);width:100%;justify-content:flex-start}.p-menubar .p-menubar-button{display:flex!important}.p-menubar .p-menubar-root-list{display:none}.p-menubar.p-menubar-mobile-active .p-menubar-root-list{display:flex}}@media (max-width: 768px){.page-header{margin-bottom:var(--space-md, 1rem);text-align:center}.page-title{font-size:1.5rem;display:flex;justify-content:center;align-items:center;gap:.5rem}}@media (max-width: 768px){.p-datatable .p-datatable-wrapper{overflow-x:auto}.p-datatable .p-datatable-thead>tr>th{min-width:120px;padding:.5rem;font-size:.875rem}.p-datatable .p-datatable-tbody>tr>td{padding:.5rem;font-size:.875rem;border-bottom:1px solid var(--surface-border)}.p-datatable.mobile-stack .p-datatable-thead{display:none}.p-datatable.mobile-stack .p-datatable-tbody,.p-datatable.mobile-stack .p-datatable-tbody tr,.p-datatable.mobile-stack .p-datatable-tbody td{display:block;width:100%}.p-datatable.mobile-stack .p-datatable-tbody tr{border:1px solid var(--surface-border);border-radius:var(--border-radius);padding:1rem;margin-bottom:1rem;background:var(--surface-card)}.p-datatable.mobile-stack .p-datatable-tbody td{border:none;position:relative;padding:.5rem 0}.p-datatable.mobile-stack .p-datatable-tbody td:before{content:attr(data-label) ": ";font-weight:600;color:var(--text-color-secondary);display:inline-block;width:40%;margin-right:1rem}}@media (max-width: 768px){.p-card .p-card-body{padding:1rem}.p-card .p-card-header{padding:1rem 1rem .5rem}.p-card .p-card-footer{padding:.5rem 1rem 1rem}.p-card .p-card-title{font-size:1.25rem;margin-bottom:.5rem}.p-card .p-card-subtitle{font-size:.875rem;margin-bottom:1rem}}@media (max-width: 768px){.p-button{min-height:44px;padding:.75rem 1rem;font-size:.875rem}.p-button.p-button-sm{min-height:36px;padding:.5rem .75rem;font-size:.8125rem}.p-button.p-button-lg{min-height:52px;padding:1rem 1.5rem;font-size:1rem}.mobile-full-width .p-button{width:100%;margin-bottom:.5rem}}@media (max-width: 768px){.p-inputtext,.p-password input,.p-dropdown,.p-calendar input{min-height:44px;font-size:16px;padding:.75rem}.p-float-label>label{top:50%;transform:translateY(-50%);font-size:1rem}.p-float-label>.p-invalid+label{color:var(--red-500)}.mobile-form-stack .p-field{margin-bottom:1.5rem}.mobile-form-stack .p-field:last-child{margin-bottom:0}}@media (max-width: 768px){.p-dialog{width:95vw!important;max-width:none!important;margin:0!important;max-height:90vh}.p-dialog .p-dialog-header{padding:1rem;border-bottom:1px solid var(--surface-border)}.p-dialog .p-dialog-content{padding:1rem;max-height:calc(90vh - 120px);overflow-y:auto}.p-dialog .p-dialog-footer{padding:1rem;border-top:1px solid var(--surface-border);justify-content:stretch}.p-dialog .p-dialog-footer .p-button{flex:1;margin:0 .25rem}}@media (max-width: 768px){.p-toast{width:calc(100vw - 2rem)!important;left:1rem!important;right:1rem!important}.p-toast .p-toast-message{margin-bottom:.5rem}}.p-toast{z-index:1100!important}.p-toast[data-position=top-right]{top:80px!important}@media (max-width: 768px){.p-dropdown-panel{max-height:60vh;width:100%!important}.p-dropdown-item{padding:1rem;font-size:1rem}}@media (max-width: 768px){.p-datepicker{width:100%!important;max-width:none!important}.p-datepicker table td{padding:.5rem}.p-datepicker table td>span{width:2.5rem;height:2.5rem;line-height:2.5rem}}@media (max-width: 640px){.mobile-hide{display:none!important}.mobile-show{display:block!important}.mobile-flex{display:flex!important}.mobile-grid{display:grid!important}.mobile-full-width{width:100%!important}.mobile-text-center{text-align:center!important}.mobile-text-left{text-align:left!important}.mobile-p-2{padding:.5rem!important}.mobile-p-4{padding:1rem!important}.mobile-m-2{margin:.5rem!important}.mobile-m-4{margin:1rem!important}.mobile-stack{flex-direction:column!important}.mobile-stack>*{width:100%!important;margin-bottom:.5rem}.mobile-stack>*:last-child{margin-bottom:0}}@media (min-width: 641px) and (max-width: 1024px){.tablet-hide{display:none!important}.tablet-show{display:block!important}.tablet-flex{display:flex!important}.tablet-grid{display:grid!important}.tablet-full-width{width:100%!important}.tablet-half-width{width:50%!important}.tablet-text-center{text-align:center!important}.tablet-text-left{text-align:left!important}.tablet-p-3{padding:.75rem!important}.tablet-m-3{margin:.75rem!important}}@media (hover: none) and (pointer: coarse){.p-button,.p-inputtext,.p-dropdown,.p-calendar input{min-height:44px}.p-button:hover{transform:none;box-shadow:none}.p-button:active{transform:scale(.98);transition:transform .1s ease}.p-datatable .p-datatable-tbody>tr:active{background-color:var(--surface-hover)}}@media (max-width: 768px){.p-button:focus,.p-inputtext:focus,.p-dropdown:focus,.p-calendar input:focus{outline:2px solid var(--primary-color);outline-offset:2px}@media (prefers-contrast: high){.p-button,.p-inputtext,.p-dropdown,.p-calendar input{border-width:2px}}@media (prefers-reduced-motion: reduce){*{animation-duration:.01ms!important;animation-iteration-count:1!important;transition-duration:.01ms!important}}}.mobile-nav-toggle{display:none;background:none;border:none;padding:.5rem;cursor:pointer;color:var(--text-color);font-size:1.5rem}@media (max-width: 768px){.mobile-nav-toggle{display:block}}.mobile-card-stack{display:flex;flex-direction:column;gap:1rem}@media (min-width: 769px){.mobile-card-stack{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:1.5rem}}.mobile-stat-card{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--border-radius);padding:1rem;display:flex;align-items:center;gap:1rem}.mobile-stat-card .stat-icon{font-size:2rem;color:var(--primary-color);flex-shrink:0}.mobile-stat-card .stat-content{flex:1}.mobile-stat-card .stat-value{font-size:1.5rem;font-weight:700;margin:0;color:var(--text-color)}.mobile-stat-card .stat-label{font-size:.875rem;color:var(--text-color-secondary);margin:.25rem 0 0}.mobile-list-view .list-item{background:var(--surface-card);border:1px solid var(--surface-border);border-radius:var(--border-radius);padding:1rem;margin-bottom:.5rem;display:flex;justify-content:space-between;align-items:flex-start}.mobile-list-view .list-item-content{flex:1}.mobile-list-view .list-item-title{font-weight:600;color:var(--text-color);margin-bottom:.25rem}.mobile-list-view .list-item-subtitle{font-size:.875rem;color:var(--text-color-secondary);margin-bottom:.5rem}.mobile-list-view .list-item-actions{flex-shrink:0;margin-left:1rem}.swipe-item{position:relative;overflow:hidden}.swipe-actions{position:absolute;top:0;right:-100px;height:100%;width:100px;background:var(--red-500);display:flex;align-items:center;justify-content:center;color:#fff;transition:right .3s ease}.swipe-item.swiped .swipe-actions{right:0}@media (max-width: 768px){.table-container{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 -1rem;padding:0 1rem}.summary-table,.breakdown-table,.dashboard-table,.detailed-table,.p-datatable table{min-width:600px!important;font-size:14px!important}.summary-table td,.summary-table th,.breakdown-table td,.breakdown-table th,.dashboard-table td,.dashboard-table th,.detailed-table td,.detailed-table th{padding:.5rem;font-size:14px!important;white-space:nowrap;min-width:80px}.amount-cell{font-size:14px!important;font-family:monospace;white-space:nowrap}.p-datatable .p-datatable-thead>tr>th,.p-datatable .p-datatable-tbody>tr>td{font-size:14px!important;padding:.5rem!important}.section-controls{flex-direction:column;width:100%;gap:.5rem}.section-controls>*{width:100%}.button-group{display:flex;gap:.5rem;width:100%}.button-group .btn{flex:1}.table-container:after{content:"← Scroll orizontal pentru mai multe coloane →";display:block;text-align:center;color:var(--color-text-secondary, #6b7280);font-size:12px;margin-top:.5rem;font-style:italic}.table-container.scrolled-full:after{display:none}.table-wrapper,.data-table-wrapper{overflow-x:auto;-webkit-overflow-scrolling:touch}}@media (min-width: 641px) and (max-width: 1024px){.summary-table,.breakdown-table,.detailed-table{font-size:14px!important}.summary-table td,.summary-table th,.breakdown-table td,.breakdown-table th{font-size:14px!important;padding:.6rem}}@media (max-width: 480px){.breakdown-table th:nth-child(6),.breakdown-table td:nth-child(6),.breakdown-table th:nth-child(7),.breakdown-table td:nth-child(7){display:none}.summary-table,.breakdown-table,.detailed-table{font-size:13px!important;min-width:500px!important}.summary-table td,.summary-table th,.breakdown-table td,.breakdown-table th{font-size:13px!important;padding:.4rem;min-width:70px}.section-controls{flex-direction:column!important;gap:.5rem}.section-controls>*{width:100%!important}.search-input,.data-type-select{width:100%!important;font-size:16px!important;min-height:44px}}.mobile-toolbar{display:flex;align-items:center;gap:var(--space-sm, .5rem);padding:var(--space-sm, .5rem) var(--space-md, 1rem);background:var(--surface-card, #ffffff);border:1px solid var(--surface-border, #e2e8f0);border-radius:var(--border-radius, 6px);margin-bottom:var(--space-md, 1rem);min-height:50px;box-shadow:0 1px 3px #0000000d}.mobile-toolbar .filter-active{color:var(--primary-color, #2563eb)!important;background:#2563eb1a!important}.mobile-toolbar .filter-active:hover{background:#2563eb33!important}.mobile-toolbar .p-button-outlined{padding:.5rem .75rem;font-size:.875rem}.mobile-toolbar .mobile-total{margin-left:auto;display:flex;align-items:center;gap:var(--space-xs, .25rem);font-size:var(--text-sm, .875rem);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:50%}.mobile-toolbar .total-label{color:var(--text-color-secondary, #64748b);font-weight:500}.mobile-toolbar .total-value{font-weight:var(--font-semibold, 600);color:var(--text-color, #1e293b);font-variant-numeric:tabular-nums}.mobile-toolbar .total-value.incasari{color:var(--green-600, #16a34a)}.mobile-toolbar .total-value.plati{color:var(--red-600, #dc2626)}@media (min-width: 769px){.mobile-toolbar{display:none!important}}@media (max-width: 400px){.mobile-toolbar{padding:var(--space-xs, .25rem) var(--space-sm, .5rem);gap:var(--space-xs, .25rem)}.mobile-toolbar .mobile-total{font-size:var(--text-xs, .75rem)}.mobile-toolbar .p-button-outlined{padding:.375rem .5rem;font-size:.8125rem}.mobile-toolbar .p-button-outlined .p-button-label{display:none}.mobile-toolbar .p-button-outlined .p-button-icon{margin-right:0}}@media (max-width: 768px){.filters-card{margin-bottom:var(--space-sm, .5rem)}.filters-card .p-card-body{padding:var(--space-sm, .5rem)}.filters-card .form-row{gap:var(--space-sm, .5rem)}.filters-card .form-group{margin-bottom:var(--space-xs, .25rem)}.filters-card .form-label{font-size:var(--text-sm, .875rem);margin-bottom:var(--space-xs, .25rem)}}.mobile-card-list{display:flex;flex-direction:column;gap:.5rem}.mobile-data-card{background:var(--surface-card, #ffffff);border:1px solid var(--surface-border, #e2e8f0);border-radius:8px;padding:.75rem 1rem}.mobile-data-card .card-header{font-weight:600;font-size:.9375rem;color:var(--text-color, #1e293b);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.mobile-data-card .card-row{display:flex;justify-content:space-between;align-items:center;font-size:.875rem;color:var(--text-color-secondary, #64748b);margin-top:.25rem}.mobile-data-card .card-meta{font-size:.8125rem}.mobile-data-card .card-amount{font-weight:600;font-variant-numeric:tabular-nums;font-size:.9375rem}.mobile-data-card .card-amount.positive{color:var(--green-600, #16a34a)}.mobile-data-card .card-amount.negative{color:var(--red-600, #dc2626)}.mobile-empty{display:flex;flex-direction:column;align-items:center;padding:2rem;color:var(--text-color-secondary)}.mobile-empty i{font-size:2rem;margin-bottom:.5rem}.mobile-totals-grid{display:grid;grid-template-columns:1fr 1fr;gap:.375rem 1rem;padding:.5rem .75rem;background:var(--surface-ground, #f8fafc);border-radius:6px;font-size:.875rem;width:100%}.mobile-totals-grid.single-total{grid-template-columns:1fr;justify-items:center}.mobile-totals-grid.two-totals{grid-template-columns:1fr 1fr}.mobile-totals-grid .total-item{display:flex;justify-content:space-between;align-items:center;gap:.5rem}.mobile-totals-grid .total-label{color:var(--text-color-secondary, #64748b);font-size:.8125rem;white-space:nowrap}.mobile-totals-grid .total-value{font-weight:600;font-variant-numeric:tabular-nums;font-size:.9375rem}.mobile-totals-grid .total-value.incasari,.mobile-totals-grid .total-value.positive{color:var(--green-600, #16a34a)}.mobile-totals-grid .total-value.plati,.mobile-totals-grid .total-value.negative{color:var(--red-600, #dc2626)}.mobile-totals-stack{display:flex;flex-direction:column;gap:.125rem;font-size:.75rem;margin-left:auto}.mobile-totals-stack .total-row{display:flex;gap:.5rem}.mobile-totals-stack .total-label{color:var(--text-color-secondary, #64748b)}.mobile-totals-stack .total-value{font-weight:600;font-variant-numeric:tabular-nums}.mobile-toolbar-container{display:flex;flex-direction:column;gap:var(--space-sm, .5rem);padding:var(--space-sm, .5rem) var(--space-md, 1rem);background:var(--surface-card, #ffffff);border:1px solid var(--surface-border, #e2e8f0);border-radius:var(--border-radius, 6px);margin-bottom:var(--space-md, 1rem);box-shadow:0 1px 3px #0000000d}.mobile-toolbar-buttons{display:flex;justify-content:space-around;align-items:center;gap:var(--space-xs, .25rem)}.mobile-toolbar-buttons .p-button{padding:var(--space-sm, .5rem);min-width:44px;min-height:44px;justify-content:center}.mobile-toolbar-buttons .p-button .p-button-label{display:none!important}.mobile-toolbar-buttons .p-button .p-button-icon{margin-right:0!important;font-size:1.125rem}.mobile-toolbar-buttons .filter-active{color:var(--primary-color, #2563eb)!important;background:#2563eb1a!important;border-color:var(--primary-color, #2563eb)!important}.mobile-toolbar-buttons .filter-active:hover{background:#2563eb33!important}.mobile-toolbar-totals{display:flex;justify-content:center;align-items:center;padding-top:var(--space-xs, .25rem);border-top:1px solid var(--surface-border, #e2e8f0)}.mobile-toolbar-totals .mobile-totals-grid,.mobile-toolbar-totals .mobile-totals-stack,.mobile-toolbar-totals .mobile-total{margin-left:0;width:auto}@media (min-width: 769px){.mobile-toolbar-container{display:none!important}}@media (max-width: 400px){.mobile-toolbar-container{padding:var(--space-xs, .25rem) var(--space-sm, .5rem);gap:var(--space-xs, .25rem)}.mobile-toolbar-buttons .p-button{padding:var(--space-xs, .25rem);min-width:40px;min-height:40px}.mobile-toolbar-buttons .p-button .p-button-icon{font-size:1rem}}.menu-profile{margin-top:auto;border-top:1px solid var(--color-border, #e2e8f0);padding-top:var(--space-md, 1rem)}.menu-profile .profile-info{display:flex;align-items:center;gap:var(--space-sm, .5rem);padding:var(--space-sm, .5rem) var(--space-md, 1rem);font-weight:600;color:var(--color-text, #1e293b);font-size:var(--text-sm, .875rem)}.menu-profile .profile-info .pi-user{font-size:1.25rem;color:var(--color-primary, #2563eb)}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;line-height:var(--leading-normal);color:var(--color-text);background-color:var(--color-bg)}body{margin:0;padding:0;min-height:100vh;overflow-x:hidden}#app{min-height:100vh;display:flex;flex-direction:column}.router-link-active,.router-link-exact-active{text-decoration:none}@media (prefers-reduced-motion: no-preference){html{scroll-behavior:smooth}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.loading{opacity:.6;pointer-events:none}.loading:after{content:"";position:absolute;top:50%;left:50%;width:20px;height:20px;margin:-10px 0 0 -10px;border:2px solid var(--color-border);border-top-color:var(--color-primary);border-radius:50%;animation:spin 1s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.error{color:var(--color-error);border-color:var(--color-error)}.success{color:var(--color-success);border-color:var(--color-success)}.warning{color:var(--color-warning);border-color:var(--color-warning)}@media print{.no-print{display:none!important}.print-only{display:block!important}*{background:#fff!important;color:#000!important;box-shadow:none!important}.card,.stats-card,.kpi-card{border:1px solid #ccc!important;break-inside:avoid;margin-bottom:1rem}}:root{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol;--font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";--surface-a:#ffffff;--surface-b:#f8f9fa;--surface-c:#e9ecef;--surface-d:#dee2e6;--surface-e:#ffffff;--surface-f:#ffffff;--text-color:#495057;--text-color-secondary:#6c757d;--primary-color:#2196F3;--primary-color-text:#ffffff;--surface-0: #ffffff;--surface-50: #FAFAFA;--surface-100: #F5F5F5;--surface-200: #EEEEEE;--surface-300: #E0E0E0;--surface-400: #BDBDBD;--surface-500: #9E9E9E;--surface-600: #757575;--surface-700: #616161;--surface-800: #424242;--surface-900: #212121;--gray-50: #FAFAFA;--gray-100: #F5F5F5;--gray-200: #EEEEEE;--gray-300: #E0E0E0;--gray-400: #BDBDBD;--gray-500: #9E9E9E;--gray-600: #757575;--gray-700: #616161;--gray-800: #424242;--gray-900: #212121;--content-padding:1rem;--inline-spacing:.5rem;--border-radius:3px;--surface-ground:#f8f9fa;--surface-section:#ffffff;--surface-card:#ffffff;--surface-overlay:#ffffff;--surface-border:#dee2e6;--surface-hover: #e9ecef;--focus-ring: 0 0 0 .2rem #a6d5fa;--maskbg: rgba(0, 0, 0, .4);--highlight-bg: #E3F2FD;--highlight-text-color: #495057;color-scheme:light}:root{--blue-50:#f4fafe;--blue-100:#cae6fc;--blue-200:#a0d2fa;--blue-300:#75bef8;--blue-400:#4baaf5;--blue-500:#2196f3;--blue-600:#1c80cf;--blue-700:#1769aa;--blue-800:#125386;--blue-900:#0d3c61;--green-50:#f6fbf6;--green-100:#d4ecd5;--green-200:#b2ddb4;--green-300:#90cd93;--green-400:#6ebe71;--green-500:#4caf50;--green-600:#419544;--green-700:#357b38;--green-800:#2a602c;--green-900:#1e4620;--yellow-50:#fffcf5;--yellow-100:#fef0cd;--yellow-200:#fde4a5;--yellow-300:#fdd87d;--yellow-400:#fccc55;--yellow-500:#fbc02d;--yellow-600:#d5a326;--yellow-700:#b08620;--yellow-800:#8a6a19;--yellow-900:#644d12;--cyan-50:#f2fcfd;--cyan-100:#c2eff5;--cyan-200:#91e2ed;--cyan-300:#61d5e4;--cyan-400:#30c9dc;--cyan-500:#00bcd4;--cyan-600:#00a0b4;--cyan-700:#008494;--cyan-800:#006775;--cyan-900:#004b55;--pink-50:#fef4f7;--pink-100:#fac9da;--pink-200:#f69ebc;--pink-300:#f1749e;--pink-400:#ed4981;--pink-500:#e91e63;--pink-600:#c61a54;--pink-700:#a31545;--pink-800:#801136;--pink-900:#5d0c28;--indigo-50:#f5f6fb;--indigo-100:#d1d5ed;--indigo-200:#acb4df;--indigo-300:#8893d1;--indigo-400:#6372c3;--indigo-500:#3f51b5;--indigo-600:#36459a;--indigo-700:#2c397f;--indigo-800:#232d64;--indigo-900:#192048;--teal-50:#f2faf9;--teal-100:#c2e6e2;--teal-200:#91d2cc;--teal-300:#61beb5;--teal-400:#30aa9f;--teal-500:#009688;--teal-600:#008074;--teal-700:#00695f;--teal-800:#00534b;--teal-900:#003c36;--orange-50:#fff8f2;--orange-100:#fde0c2;--orange-200:#fbc791;--orange-300:#f9ae61;--orange-400:#f79530;--orange-500:#f57c00;--orange-600:#d06900;--orange-700:#ac5700;--orange-800:#874400;--orange-900:#623200;--bluegray-50:#f7f9f9;--bluegray-100:#d9e0e3;--bluegray-200:#bbc7cd;--bluegray-300:#9caeb7;--bluegray-400:#7e96a1;--bluegray-500:#607d8b;--bluegray-600:#526a76;--bluegray-700:#435861;--bluegray-800:#35454c;--bluegray-900:#263238;--purple-50:#faf4fb;--purple-100:#e7cbec;--purple-200:#d4a2dd;--purple-300:#c279ce;--purple-400:#af50bf;--purple-500:#9c27b0;--purple-600:#852196;--purple-700:#6d1b7b;--purple-800:#561561;--purple-900:#3e1046;--red-50:#fff5f5;--red-100:#ffd1ce;--red-200:#ffada7;--red-300:#ff8980;--red-400:#ff6459;--red-500:#ff4032;--red-600:#d9362b;--red-700:#b32d23;--red-800:#8c231c;--red-900:#661a14;--primary-50:#f4fafe;--primary-100:#cae6fc;--primary-200:#a0d2fa;--primary-300:#75bef8;--primary-400:#4baaf5;--primary-500:#2196f3;--primary-600:#1c80cf;--primary-700:#1769aa;--primary-800:#125386;--primary-900:#0d3c61}.p-editor-container .p-editor-toolbar{background:#f8f9fa;border-top-right-radius:3px;border-top-left-radius:3px}.p-editor-container .p-editor-toolbar.ql-snow{border:1px solid #dee2e6}.p-editor-container .p-editor-toolbar.ql-snow .ql-stroke{stroke:#6c757d}.p-editor-container .p-editor-toolbar.ql-snow .ql-fill{fill:#6c757d}.p-editor-container .p-editor-toolbar.ql-snow .ql-picker .ql-picker-label{border:0 none;color:#6c757d}.p-editor-container .p-editor-toolbar.ql-snow .ql-picker .ql-picker-label:hover{color:#495057}.p-editor-container .p-editor-toolbar.ql-snow .ql-picker .ql-picker-label:hover .ql-stroke{stroke:#495057}.p-editor-container .p-editor-toolbar.ql-snow .ql-picker .ql-picker-label:hover .ql-fill{fill:#495057}.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label{color:#495057}.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-stroke{stroke:#495057}.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-label .ql-fill{fill:#495057}.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options{background:#fff;border:0 none;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;border-radius:3px;padding:.5rem 0}.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options .ql-picker-item{color:#495057}.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded .ql-picker-options .ql-picker-item:hover{color:#495057;background:#e9ecef}.p-editor-container .p-editor-toolbar.ql-snow .ql-picker.ql-expanded:not(.ql-icon-picker) .ql-picker-item{padding:.5rem 1rem}.p-editor-container .p-editor-content{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.p-editor-container .p-editor-content.ql-snow{border:1px solid #dee2e6}.p-editor-container .p-editor-content .ql-editor{background:#fff;color:#495057;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.p-editor-container .ql-snow.ql-toolbar button:hover,.p-editor-container .ql-snow.ql-toolbar button:focus{color:#495057}.p-editor-container .ql-snow.ql-toolbar button:hover .ql-stroke,.p-editor-container .ql-snow.ql-toolbar button:focus .ql-stroke{stroke:#495057}.p-editor-container .ql-snow.ql-toolbar button:hover .ql-fill,.p-editor-container .ql-snow.ql-toolbar button:focus .ql-fill{fill:#495057}.p-editor-container .ql-snow.ql-toolbar button.ql-active,.p-editor-container .ql-snow.ql-toolbar .ql-picker-label.ql-active,.p-editor-container .ql-snow.ql-toolbar .ql-picker-item.ql-selected{color:#2196f3}.p-editor-container .ql-snow.ql-toolbar button.ql-active .ql-stroke,.p-editor-container .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-stroke,.p-editor-container .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-stroke{stroke:#2196f3}.p-editor-container .ql-snow.ql-toolbar button.ql-active .ql-fill,.p-editor-container .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-fill,.p-editor-container .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-fill{fill:#2196f3}.p-editor-container .ql-snow.ql-toolbar button.ql-active .ql-picker-label,.p-editor-container .ql-snow.ql-toolbar .ql-picker-label.ql-active .ql-picker-label,.p-editor-container .ql-snow.ql-toolbar .ql-picker-item.ql-selected .ql-picker-label{color:#2196f3}@layer primevue{.p-component,.p-component *{box-sizing:border-box}.p-hidden-space{visibility:hidden}.p-reset{margin:0;padding:0;border:0;outline:0;text-decoration:none;font-size:100%;list-style:none}.p-disabled,.p-disabled *{cursor:default;pointer-events:none;-webkit-user-select:none;user-select:none}.p-component-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.p-unselectable-text{-webkit-user-select:none;user-select:none}.p-sr-only{border:0;clip:rect(1px,1px,1px,1px);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal}.p-link{text-align:left;background-color:transparent;margin:0;padding:0;border:none;cursor:pointer;-webkit-user-select:none;user-select:none}.p-link:disabled{cursor:default}.p-connected-overlay{opacity:0;transform:scaleY(.8);transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1)}.p-connected-overlay-visible{opacity:1;transform:scaleY(1)}.p-connected-overlay-hidden{opacity:0;transform:scaleY(1);transition:opacity .1s linear}.p-connected-overlay-enter-from{opacity:0;transform:scaleY(.8)}.p-connected-overlay-leave-to{opacity:0}.p-connected-overlay-enter-active{transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1)}.p-connected-overlay-leave-active{transition:opacity .1s linear}.p-toggleable-content-enter-from,.p-toggleable-content-leave-to{max-height:0}.p-toggleable-content-enter-to,.p-toggleable-content-leave-from{max-height:1000px}.p-toggleable-content-leave-active{overflow:hidden;transition:max-height .45s cubic-bezier(0,1,0,1)}.p-toggleable-content-enter-active{overflow:hidden;transition:max-height 1s ease-in-out}*{box-sizing:border-box}.p-component{font-family:var(--font-family);font-feature-settings:var(--font-feature-settings, normal);font-size:1rem;font-weight:400}.p-component-overlay{background-color:#0006;transition-duration:.2s}.p-disabled,.p-component:disabled{opacity:.6}.p-error{color:#f44336}.p-text-secondary{color:#6c757d}.pi{font-size:1rem}.p-icon{width:1rem;height:1rem}.p-link{font-family:var(--font-family);font-feature-settings:var(--font-feature-settings, normal);font-size:1rem;border-radius:3px;outline-color:transparent}.p-link:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-component-overlay-enter{animation:p-component-overlay-enter-animation .15s forwards}.p-component-overlay-leave{animation:p-component-overlay-leave-animation .15s forwards}@keyframes p-component-overlay-enter-animation{0%{background-color:transparent}to{background-color:var(--maskbg)}}@keyframes p-component-overlay-leave-animation{0%{background-color:var(--maskbg)}to{background-color:transparent}}.p-autocomplete{display:inline-flex}.p-autocomplete-loader{position:absolute;top:50%;margin-top:-.5rem}.p-autocomplete-dd .p-autocomplete-input{flex:1 1 auto;width:1%}.p-autocomplete-dd .p-autocomplete-input,.p-autocomplete-dd .p-autocomplete-multiple-container{border-top-right-radius:0;border-bottom-right-radius:0}.p-autocomplete-dd .p-autocomplete-dropdown{border-top-left-radius:0;border-bottom-left-radius:0}.p-autocomplete .p-autocomplete-panel{min-width:100%}.p-autocomplete-panel{position:absolute;overflow:auto;top:0;left:0}.p-autocomplete-items{margin:0;padding:0;list-style-type:none}.p-autocomplete-item{cursor:pointer;white-space:nowrap;position:relative;overflow:hidden}.p-autocomplete-multiple-container{margin:0;padding:0;list-style-type:none;cursor:text;overflow:hidden;display:flex;align-items:center;flex-wrap:wrap}.p-autocomplete-token{cursor:default;display:inline-flex;align-items:center;flex:0 0 auto}.p-autocomplete-token-icon{cursor:pointer}.p-autocomplete-input-token{flex:1 1 auto;display:inline-flex}.p-autocomplete-input-token input{border:0 none;outline:0 none;background-color:transparent;margin:0;padding:0;box-shadow:none;border-radius:0;width:100%}.p-fluid .p-autocomplete{display:flex}.p-fluid .p-autocomplete-dd .p-autocomplete-input{width:1%}.p-autocomplete .p-autocomplete-loader{right:.5rem}.p-autocomplete.p-autocomplete-dd .p-autocomplete-loader{right:2.857rem}.p-autocomplete:not(.p-disabled):hover .p-autocomplete-multiple-container{border-color:#2196f3}.p-autocomplete:not(.p-disabled).p-focus .p-autocomplete-multiple-container{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-autocomplete .p-autocomplete-multiple-container{padding:.25rem .5rem;gap:.5rem;outline-color:transparent}.p-autocomplete .p-autocomplete-multiple-container .p-autocomplete-input-token{padding:.25rem 0}.p-autocomplete .p-autocomplete-multiple-container .p-autocomplete-input-token input{font-family:var(--font-family);font-feature-settings:var(--font-feature-settings, normal);font-size:1rem;color:#495057;padding:0;margin:0}.p-autocomplete .p-autocomplete-multiple-container .p-autocomplete-token{padding:.25rem .5rem;background:#dee2e6;color:#495057;border-radius:16px}.p-autocomplete .p-autocomplete-multiple-container .p-autocomplete-token .p-autocomplete-token-icon{margin-left:.5rem}.p-autocomplete .p-autocomplete-multiple-container .p-autocomplete-token.p-focus{background:#ced4da;color:#495057}.p-autocomplete.p-invalid.p-component>.p-inputtext{border-color:#f44336}.p-autocomplete-panel{background:#fff;color:#495057;border:0 none;border-radius:3px;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.p-autocomplete-panel .p-autocomplete-items{padding:.5rem 0}.p-autocomplete-panel .p-autocomplete-items .p-autocomplete-item{margin:0;padding:.5rem 1rem;border:0 none;color:#495057;background:transparent;transition:box-shadow .2s;border-radius:0}.p-autocomplete-panel .p-autocomplete-items .p-autocomplete-item:first-child{margin-top:0}.p-autocomplete-panel .p-autocomplete-items .p-autocomplete-item:last-child{margin-bottom:0}.p-autocomplete-panel .p-autocomplete-items .p-autocomplete-item.p-highlight{color:#495057;background:#e3f2fd}.p-autocomplete-panel .p-autocomplete-items .p-autocomplete-item.p-highlight.p-focus{background:#2196f33d}.p-autocomplete-panel .p-autocomplete-items .p-autocomplete-item:not(.p-highlight):not(.p-disabled).p-focus{color:#495057;background:#e9ecef}.p-autocomplete-panel .p-autocomplete-items .p-autocomplete-item-group{margin:0;padding:.75rem 1rem;color:#495057;background:#fff;font-weight:600}.p-calendar{display:inline-flex;max-width:100%}.p-calendar .p-inputtext{flex:1 1 auto;width:1%}.p-calendar-w-btn .p-inputtext{border-top-right-radius:0;border-bottom-right-radius:0}.p-calendar-w-btn .p-datepicker-trigger{border-top-left-radius:0;border-bottom-left-radius:0}.p-calendar .p-datepicker-trigger-icon{cursor:pointer}.p-fluid .p-calendar{display:flex}.p-fluid .p-calendar .p-inputtext{width:1%}.p-calendar .p-datepicker{min-width:100%}.p-datepicker{width:auto}.p-datepicker-inline{display:inline-block;overflow-x:auto}.p-datepicker-header{display:flex;align-items:center;justify-content:space-between}.p-datepicker-header .p-datepicker-title{margin:0 auto}.p-datepicker-prev,.p-datepicker-next{cursor:pointer;display:inline-flex;justify-content:center;align-items:center;overflow:hidden;position:relative}.p-datepicker-multiple-month .p-datepicker-group-container{display:flex}.p-datepicker-multiple-month .p-datepicker-group-container .p-datepicker-group{flex:1 1 auto}.p-datepicker table{width:100%;border-collapse:collapse}.p-datepicker td>span{display:flex;justify-content:center;align-items:center;cursor:pointer;margin:0 auto;overflow:hidden;position:relative}.p-monthpicker-month{width:33.3%;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;overflow:hidden;position:relative}.p-yearpicker-year{width:50%;display:inline-flex;align-items:center;justify-content:center;cursor:pointer;overflow:hidden;position:relative}.p-datepicker-buttonbar{display:flex;justify-content:space-between;align-items:center}.p-timepicker{display:flex;justify-content:center;align-items:center}.p-timepicker button{display:flex;align-items:center;justify-content:center;cursor:pointer;overflow:hidden;position:relative}.p-timepicker>div{display:flex;align-items:center;flex-direction:column}.p-datepicker-touch-ui,.p-calendar .p-datepicker-touch-ui{min-width:80vw}.p-calendar.p-invalid.p-component>.p-inputtext{border-color:#f44336}.p-calendar:not(.p-calendar-disabled).p-focus>.p-inputtext{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-datepicker{padding:.5rem;background:#fff;color:#495057;border:1px solid #ced4da;border-radius:3px}.p-datepicker:not(.p-datepicker-inline){background:#fff;border:0 none;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.p-datepicker:not(.p-datepicker-inline) .p-datepicker-header{background:#fff}.p-datepicker .p-datepicker-header{padding:.5rem;color:#495057;background:#fff;font-weight:600;margin:0;border-bottom:1px solid #dee2e6;border-top-right-radius:3px;border-top-left-radius:3px}.p-datepicker .p-datepicker-header .p-datepicker-prev,.p-datepicker .p-datepicker-header .p-datepicker-next{width:2rem;height:2rem;color:#6c757d;border:0 none;background:transparent;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-datepicker .p-datepicker-header .p-datepicker-prev:enabled:hover,.p-datepicker .p-datepicker-header .p-datepicker-next:enabled:hover{color:#495057;border-color:transparent;background:#e9ecef}.p-datepicker .p-datepicker-header .p-datepicker-prev:focus-visible,.p-datepicker .p-datepicker-header .p-datepicker-next:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-datepicker .p-datepicker-header .p-datepicker-title{line-height:2rem}.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year,.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{color:#495057;transition:background-color .2s,color .2s,box-shadow .2s;font-weight:600;padding:.5rem}.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-year:enabled:hover,.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month:enabled:hover{color:#2196f3}.p-datepicker .p-datepicker-header .p-datepicker-title .p-datepicker-month{margin-right:.5rem}.p-datepicker table{font-size:1rem;margin:.5rem 0}.p-datepicker table th{padding:.5rem}.p-datepicker table th>span{width:2.5rem;height:2.5rem}.p-datepicker table td{padding:.5rem}.p-datepicker table td>span{width:2.5rem;height:2.5rem;border-radius:50%;transition:box-shadow .2s;border:1px solid transparent;outline-color:transparent}.p-datepicker table td>span.p-highlight{color:#495057;background:#e3f2fd}.p-datepicker table td>span:focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-datepicker table td.p-datepicker-today>span{background:#ced4da;color:#495057;border-color:transparent}.p-datepicker table td.p-datepicker-today>span.p-highlight{color:#495057;background:#e3f2fd}.p-datepicker .p-datepicker-buttonbar{padding:1rem 0;border-top:1px solid #dee2e6}.p-datepicker .p-datepicker-buttonbar .p-button{width:auto}.p-datepicker .p-timepicker{border-top:1px solid #dee2e6;padding:.5rem}.p-datepicker .p-timepicker button{width:2rem;height:2rem;color:#6c757d;border:0 none;background:transparent;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-datepicker .p-timepicker button:enabled:hover{color:#495057;border-color:transparent;background:#e9ecef}.p-datepicker .p-timepicker button:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-datepicker .p-timepicker button:last-child{margin-top:.2em}.p-datepicker .p-timepicker span{font-size:1.25rem}.p-datepicker .p-timepicker>div{padding:0 .5rem}.p-datepicker.p-datepicker-timeonly .p-timepicker{border-top:0 none}.p-datepicker .p-monthpicker{margin:.5rem 0}.p-datepicker .p-monthpicker .p-monthpicker-month{padding:.5rem;transition:box-shadow .2s;border-radius:3px}.p-datepicker .p-monthpicker .p-monthpicker-month.p-highlight{color:#495057;background:#e3f2fd}.p-datepicker .p-yearpicker{margin:.5rem 0}.p-datepicker .p-yearpicker .p-yearpicker-year{padding:.5rem;transition:box-shadow .2s;border-radius:3px}.p-datepicker .p-yearpicker .p-yearpicker-year.p-highlight{color:#495057;background:#e3f2fd}.p-datepicker.p-datepicker-multiple-month .p-datepicker-group{border-left:1px solid #dee2e6;padding-right:.5rem;padding-left:.5rem;padding-top:0;padding-bottom:0}.p-datepicker.p-datepicker-multiple-month .p-datepicker-group:first-child{padding-left:0;border-left:0 none}.p-datepicker.p-datepicker-multiple-month .p-datepicker-group:last-child{padding-right:0}.p-datepicker.p-datepicker-mobile table th,.p-datepicker.p-datepicker-mobile table td{padding:0}.p-datepicker:not(.p-disabled) table td span:not(.p-highlight):not(.p-disabled){outline-color:transparent}.p-datepicker:not(.p-disabled) table td span:not(.p-highlight):not(.p-disabled):hover{background:#e9ecef}.p-datepicker:not(.p-disabled) table td span:not(.p-highlight):not(.p-disabled):focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-datepicker:not(.p-disabled) .p-monthpicker .p-monthpicker-month:not(.p-disabled){outline-color:transparent}.p-datepicker:not(.p-disabled) .p-monthpicker .p-monthpicker-month:not(.p-disabled):not(.p-highlight):hover{background:#e9ecef}.p-datepicker:not(.p-disabled) .p-monthpicker .p-monthpicker-month:not(.p-disabled):focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-datepicker:not(.p-disabled) .p-yearpicker .p-yearpicker-year:not(.p-disabled){outline-color:transparent}.p-datepicker:not(.p-disabled) .p-yearpicker .p-yearpicker-year:not(.p-disabled):not(.p-highlight):hover{background:#e9ecef}.p-datepicker:not(.p-disabled) .p-yearpicker .p-yearpicker-year:not(.p-disabled):focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-cascadeselect{display:inline-flex;cursor:pointer;-webkit-user-select:none;user-select:none}.p-cascadeselect-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}.p-cascadeselect-label{display:block;white-space:nowrap;overflow:hidden;flex:1 1 auto;width:1%;text-overflow:ellipsis;cursor:pointer}.p-cascadeselect-label-empty{overflow:hidden;visibility:hidden}.p-cascadeselect .p-cascadeselect-panel{min-width:100%}.p-cascadeselect-item{cursor:pointer;font-weight:400;white-space:nowrap}.p-cascadeselect-item-content{display:flex;align-items:center;overflow:hidden;position:relative}.p-cascadeselect-group-icon{margin-left:auto}.p-cascadeselect-items{margin:0;padding:0;list-style-type:none;min-width:100%}.p-fluid .p-cascadeselect{display:flex}.p-fluid .p-cascadeselect .p-cascadeselect-label{width:1%}.p-cascadeselect-sublist{position:absolute;min-width:100%;z-index:1;display:none}.p-cascadeselect-item-active{overflow:visible}.p-cascadeselect-item-active>.p-cascadeselect-sublist{display:block;left:100%;top:0}.p-cascadeselect-enter-from,.p-cascadeselect-leave-active{opacity:0}.p-cascadeselect-enter-active{transition:opacity .15s}.p-cascadeselect{background:#fff;border:1px solid #ced4da;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;border-radius:3px;outline-color:transparent}.p-cascadeselect:not(.p-disabled):hover{border-color:#2196f3}.p-cascadeselect:not(.p-disabled).p-focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-cascadeselect.p-variant-filled{background-color:#f8f9fa}.p-cascadeselect.p-variant-filled:enabled:hover{background-color:#f8f9fa}.p-cascadeselect.p-variant-filled:enabled:focus{background-color:#fff}.p-cascadeselect .p-cascadeselect-label{background:transparent;border:0 none;padding:.5rem}.p-cascadeselect .p-cascadeselect-label.p-placeholder{color:#6c757d}.p-cascadeselect .p-cascadeselect-label:enabled:focus{outline:0 none;box-shadow:none}.p-cascadeselect .p-cascadeselect-trigger{background:transparent;color:#6c757d;width:2.357rem;border-top-right-radius:3px;border-bottom-right-radius:3px}.p-cascadeselect.p-invalid.p-component{border-color:#f44336}.p-cascadeselect-panel{background:#fff;color:#495057;border:0 none;border-radius:3px;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.p-cascadeselect-panel .p-cascadeselect-items{padding:.5rem 0}.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item{margin:0;border:0 none;color:#495057;background:transparent;transition:box-shadow .2s;border-radius:0}.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item:first-child{margin-top:0}.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item:last-child{margin-bottom:0}.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item.p-highlight{color:#495057;background:#e3f2fd}.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item.p-highlight.p-focus{background:#2196f33d}.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item:not(.p-highlight):not(.p-disabled).p-focus{color:#495057;background:#e9ecef}.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item .p-cascadeselect-item-content{padding:.5rem 1rem}.p-cascadeselect-panel .p-cascadeselect-items .p-cascadeselect-item .p-cascadeselect-group-icon{font-size:.875rem}.p-checkbox{position:relative;display:inline-flex;-webkit-user-select:none;user-select:none;vertical-align:bottom}.p-checkbox-input{cursor:pointer}.p-checkbox-box{display:flex;justify-content:center;align-items:center}.p-checkbox{width:20px;height:20px}.p-checkbox .p-checkbox-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;top:0;left:0;width:100%;height:100%;padding:0;margin:0;opacity:0;z-index:1;outline:0 none;border:2px solid #ced4da;border-radius:3px}.p-checkbox .p-checkbox-box{border:2px solid #ced4da;background:#fff;width:20px;height:20px;color:#495057;border-radius:3px;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;outline-color:transparent}.p-checkbox .p-checkbox-box .p-checkbox-icon{transition-duration:.2s;color:#fff;font-size:14px}.p-checkbox .p-checkbox-box .p-checkbox-icon.p-icon{width:14px;height:14px}.p-checkbox.p-highlight .p-checkbox-box{border-color:#2196f3;background:#2196f3}.p-checkbox:not(.p-disabled):has(.p-checkbox-input:hover) .p-checkbox-box{border-color:#2196f3}.p-checkbox:not(.p-disabled):has(.p-checkbox-input:hover).p-highlight .p-checkbox-box{border-color:#0b7ad1;background:#0b7ad1;color:#fff}.p-checkbox:not(.p-disabled):has(.p-checkbox-input:focus-visible) .p-checkbox-box{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-checkbox.p-invalid>.p-checkbox-box{border-color:#f44336}.p-checkbox.p-variant-filled .p-checkbox-box{background-color:#f8f9fa}.p-checkbox.p-variant-filled.p-highlight .p-checkbox-box{background:#2196f3}.p-checkbox.p-variant-filled:not(.p-disabled):has(.p-checkbox-input:hover) .p-checkbox-box{background-color:#f8f9fa}.p-checkbox.p-variant-filled:not(.p-disabled):has(.p-checkbox-input:hover).p-highlight .p-checkbox-box{background:#0b7ad1}.p-input-filled .p-checkbox .p-checkbox-box{background-color:#f8f9fa}.p-input-filled .p-checkbox.p-highlight .p-checkbox-box{background:#2196f3}.p-input-filled .p-checkbox:not(.p-disabled):has(.p-checkbox-input:hover) .p-checkbox-box{background-color:#f8f9fa}.p-input-filled .p-checkbox:not(.p-disabled):has(.p-checkbox-input:hover).p-highlight .p-checkbox-box{background:#0b7ad1}.p-chips{display:inline-flex}.p-chips-multiple-container{margin:0;padding:0;list-style-type:none;cursor:text;overflow:hidden;display:flex;align-items:center;flex-wrap:wrap}.p-chips-token{cursor:default;display:inline-flex;align-items:center;flex:0 0 auto}.p-chips-input-token{flex:1 1 auto;display:inline-flex}.p-chips-token-icon{cursor:pointer}.p-chips-input-token input{border:0 none;outline:0 none;background-color:transparent;margin:0;padding:0;box-shadow:none;border-radius:0;width:100%}.p-fluid .p-chips{display:flex}.p-chips:not(.p-disabled):hover .p-chips-multiple-container{border-color:#2196f3}.p-chips:not(.p-disabled).p-focus .p-chips-multiple-container{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-chips .p-chips-multiple-container{padding:.25rem .5rem;outline-color:transparent}.p-chips .p-chips-multiple-container .p-chips-token{padding:.25rem .5rem;margin-right:.5rem;background:#dee2e6;color:#495057;border-radius:16px}.p-chips .p-chips-multiple-container .p-chips-token.p-focus{background:#ced4da;color:#495057}.p-chips .p-chips-multiple-container .p-chips-token .p-chips-token-icon{margin-left:.5rem}.p-chips .p-chips-multiple-container .p-chips-input-token{padding:.25rem 0}.p-chips .p-chips-multiple-container .p-chips-input-token input{font-family:var(--font-family);font-feature-settings:var(--font-feature-settings, normal);font-size:1rem;color:#495057;padding:0;margin:0}.p-chips.p-invalid.p-component>.p-inputtext{border-color:#f44336}.p-colorpicker-panel .p-colorpicker-color{background:linear-gradient(to top,#000,#0000),linear-gradient(to right,#fff,#fff0)}.p-colorpicker-panel .p-colorpicker-hue{background:linear-gradient(0deg,red 0,#ff0 17%,#0f0 33%,#0ff,#00f 67%,#f0f 83%,red)}.p-colorpicker-preview{width:2rem;height:2rem}.p-colorpicker-panel{background:#323232;border:1px solid #191919}.p-colorpicker-panel .p-colorpicker-color-handle,.p-colorpicker-panel .p-colorpicker-hue-handle{border-color:#fff}.p-colorpicker-overlay-panel{box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.p-dropdown{display:inline-flex;cursor:pointer;position:relative;-webkit-user-select:none;user-select:none}.p-dropdown-clear-icon{position:absolute;top:50%;margin-top:-.5rem}.p-dropdown-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}.p-dropdown-label{display:block;white-space:nowrap;overflow:hidden;flex:1 1 auto;width:1%;text-overflow:ellipsis;cursor:pointer}.p-dropdown-label-empty{overflow:hidden;opacity:0}input.p-dropdown-label{cursor:default}.p-dropdown .p-dropdown-panel{min-width:100%}.p-dropdown-panel{position:absolute;top:0;left:0}.p-dropdown-items-wrapper{overflow:auto}.p-dropdown-item{cursor:pointer;font-weight:400;white-space:nowrap;position:relative;overflow:hidden;display:flex;align-items:center}.p-dropdown-item-group{cursor:auto}.p-dropdown-items{margin:0;padding:0;list-style-type:none}.p-dropdown-filter{width:100%}.p-dropdown-filter-container{position:relative}.p-dropdown-filter-icon{position:absolute;top:50%;margin-top:-.5rem}.p-fluid .p-dropdown{display:flex}.p-fluid .p-dropdown .p-dropdown-label{width:1%}.p-dropdown{background:#fff;border:1px solid #ced4da;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;border-radius:3px;outline-color:transparent}.p-dropdown:not(.p-disabled):hover{border-color:#2196f3}.p-dropdown:not(.p-disabled).p-focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-dropdown.p-variant-filled{background:#f8f9fa}.p-dropdown.p-variant-filled:not(.p-disabled):hover{background-color:#f8f9fa}.p-dropdown.p-variant-filled:not(.p-disabled).p-focus{background-color:#fff}.p-dropdown.p-variant-filled:not(.p-disabled).p-focus .p-inputtext{background-color:transparent}.p-dropdown.p-dropdown-clearable .p-dropdown-label{padding-right:1.5rem}.p-dropdown .p-dropdown-label{background:transparent;border:0 none}.p-dropdown .p-dropdown-label.p-placeholder{color:#6c757d}.p-dropdown .p-dropdown-label:focus,.p-dropdown .p-dropdown-label:enabled:focus{outline:0 none;box-shadow:none}.p-dropdown .p-dropdown-trigger{background:transparent;color:#6c757d;width:2.357rem;border-top-right-radius:3px;border-bottom-right-radius:3px}.p-dropdown .p-dropdown-clear-icon{color:#6c757d;right:2.357rem}.p-dropdown.p-invalid.p-component{border-color:#f44336}.p-dropdown-panel{background:#fff;color:#495057;border:0 none;border-radius:3px;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.p-dropdown-panel .p-dropdown-header{padding:.5rem 1rem;border-bottom:0 none;color:#495057;background:#f8f9fa;margin:0;border-top-right-radius:3px;border-top-left-radius:3px}.p-dropdown-panel .p-dropdown-header .p-dropdown-filter{padding-right:1.5rem;margin-right:-1.5rem}.p-dropdown-panel .p-dropdown-header .p-dropdown-filter-icon{right:.5rem;color:#6c757d}.p-dropdown-panel .p-dropdown-items{padding:.5rem 0}.p-dropdown-panel .p-dropdown-items .p-dropdown-item{margin:0;padding:.5rem 1rem;border:0 none;color:#495057;background:transparent;transition:box-shadow .2s;border-radius:0}.p-dropdown-panel .p-dropdown-items .p-dropdown-item:first-child{margin-top:0}.p-dropdown-panel .p-dropdown-items .p-dropdown-item:last-child{margin-bottom:0}.p-dropdown-panel .p-dropdown-items .p-dropdown-item.p-highlight{color:#495057;background:#e3f2fd}.p-dropdown-panel .p-dropdown-items .p-dropdown-item.p-highlight.p-focus{background:#2196f33d}.p-dropdown-panel .p-dropdown-items .p-dropdown-item:not(.p-highlight):not(.p-disabled).p-focus{color:#495057;background:#e9ecef}.p-dropdown-panel .p-dropdown-items .p-dropdown-item .p-dropdown-check-icon{position:relative;margin-left:-.5rem;margin-right:.5rem}.p-dropdown-panel .p-dropdown-items .p-dropdown-item-group{margin:0;padding:.75rem 1rem;color:#495057;background:#fff;font-weight:600}.p-dropdown-panel .p-dropdown-items .p-dropdown-empty-message{padding:.5rem 1rem;color:#495057;background:transparent}.p-float-label{display:block;position:relative}.p-float-label label{position:absolute;pointer-events:none;top:50%;margin-top:-.5rem;transition-property:all;transition-timing-function:ease;line-height:1}.p-float-label:has(textarea) label{top:1rem}.p-float-label:has(input:focus) label,.p-float-label:has(input.p-filled) label,.p-float-label:has(input:-webkit-autofill) label,.p-float-label:has(textarea:focus) label,.p-float-label:has(textarea.p-filled) label,.p-float-label:has(.p-inputwrapper-focus) label,.p-float-label:has(.p-inputwrapper-filled) label{top:-.75rem;font-size:12px}.p-float-label .p-placeholder,.p-float-label input::placeholder,.p-float-label .p-inputtext::placeholder{opacity:0;transition-property:all;transition-timing-function:ease}.p-float-label .p-focus .p-placeholder,.p-float-label input:focus::placeholder,.p-float-label .p-inputtext:focus::placeholder{opacity:1;transition-property:all;transition-timing-function:ease}.p-icon-field{position:relative}.p-icon-field>.p-input-icon{position:absolute;top:50%;margin-top:-.5rem}.p-inputotp{display:flex;align-items:center;gap:.5rem}.p-inputotp-input{text-align:center;width:2rem}.p-inputgroup{display:flex;align-items:stretch;width:100%}.p-inputgroup-addon{display:flex;align-items:center;justify-content:center}.p-inputgroup .p-float-label{display:flex;align-items:stretch;width:100%}.p-inputgroup .p-inputtext,.p-fluid .p-inputgroup .p-inputtext,.p-inputgroup .p-inputwrapper,.p-fluid .p-inputgroup .p-input{flex:1 1 auto;width:1%}.p-inputgroup-addon{background:#e9ecef;color:#6c757d;border-top:1px solid #ced4da;border-left:1px solid #ced4da;border-bottom:1px solid #ced4da;padding:.5rem;min-width:2.357rem}.p-inputgroup-addon:last-child{border-right:1px solid #ced4da}.p-inputgroup>.p-component,.p-inputgroup>.p-inputwrapper>.p-inputtext,.p-inputgroup>.p-float-label>.p-component{border-radius:0;margin:0}.p-inputgroup>.p-component+.p-inputgroup-addon,.p-inputgroup>.p-inputwrapper>.p-inputtext+.p-inputgroup-addon,.p-inputgroup>.p-float-label>.p-component+.p-inputgroup-addon{border-left:0 none}.p-inputgroup>.p-component:focus,.p-inputgroup>.p-inputwrapper>.p-inputtext:focus,.p-inputgroup>.p-float-label>.p-component:focus{z-index:1}.p-inputgroup>.p-component:focus~label,.p-inputgroup>.p-inputwrapper>.p-inputtext:focus~label,.p-inputgroup>.p-float-label>.p-component:focus~label{z-index:1}.p-inputgroup-addon:first-child,.p-inputgroup button:first-child,.p-inputgroup input:first-child,.p-inputgroup>.p-inputwrapper:first-child,.p-inputgroup>.p-inputwrapper:first-child>.p-inputtext{border-top-left-radius:3px;border-bottom-left-radius:3px}.p-inputgroup .p-float-label:first-child input{border-top-left-radius:3px;border-bottom-left-radius:3px}.p-inputgroup-addon:last-child,.p-inputgroup button:last-child,.p-inputgroup input:last-child,.p-inputgroup>.p-inputwrapper:last-child,.p-inputgroup>.p-inputwrapper:last-child>.p-inputtext{border-top-right-radius:3px;border-bottom-right-radius:3px}.p-inputgroup .p-float-label:last-child input{border-top-right-radius:3px;border-bottom-right-radius:3px}.p-fluid .p-inputgroup .p-button{width:auto}.p-fluid .p-inputgroup .p-button.p-button-icon-only{width:2.357rem}.p-fluid .p-icon-field-left,.p-fluid .p-icon-field-right{width:100%}.p-icon-field-left>.p-input-icon:first-of-type{left:.5rem;color:#6c757d}.p-icon-field-right>.p-input-icon:last-of-type{right:.5rem;color:#6c757d}.p-inputnumber{display:inline-flex}.p-inputnumber-button{display:flex;align-items:center;justify-content:center;flex:0 0 auto}.p-inputnumber-buttons-stacked .p-button.p-inputnumber-button .p-button-label,.p-inputnumber-buttons-horizontal .p-button.p-inputnumber-button .p-button-label{display:none}.p-inputnumber-buttons-stacked .p-button.p-inputnumber-button-up{border-top-left-radius:0;border-bottom-left-radius:0;border-bottom-right-radius:0;padding:0}.p-inputnumber-buttons-stacked .p-inputnumber-input{border-top-right-radius:0;border-bottom-right-radius:0}.p-inputnumber-buttons-stacked .p-button.p-inputnumber-button-down{border-top-left-radius:0;border-top-right-radius:0;border-bottom-left-radius:0;padding:0}.p-inputnumber-buttons-stacked .p-inputnumber-button-group{display:flex;flex-direction:column}.p-inputnumber-buttons-stacked .p-inputnumber-button-group .p-button.p-inputnumber-button{flex:1 1 auto}.p-inputnumber-buttons-horizontal .p-button.p-inputnumber-button-up{order:3;border-top-left-radius:0;border-bottom-left-radius:0}.p-inputnumber-buttons-horizontal .p-inputnumber-input{order:2;border-radius:0}.p-inputnumber-buttons-horizontal .p-button.p-inputnumber-button-down{order:1;border-top-right-radius:0;border-bottom-right-radius:0}.p-inputnumber-buttons-vertical{flex-direction:column}.p-inputnumber-buttons-vertical .p-button.p-inputnumber-button-up{order:1;border-bottom-left-radius:0;border-bottom-right-radius:0;width:100%}.p-inputnumber-buttons-vertical .p-inputnumber-input{order:2;border-radius:0;text-align:center}.p-inputnumber-buttons-vertical .p-button.p-inputnumber-button-down{order:3;border-top-left-radius:0;border-top-right-radius:0;width:100%}.p-inputnumber-input{flex:1 1 auto}.p-fluid .p-inputnumber{width:100%}.p-fluid .p-inputnumber .p-inputnumber-input{width:1%}.p-fluid .p-inputnumber-buttons-vertical .p-inputnumber-input{width:100%}.p-inputnumber.p-invalid.p-component>.p-inputtext{border-color:#f44336}.p-inputnumber.p-variant-filled>.p-inputnumber-input{background-color:#f8f9fa}.p-inputnumber.p-variant-filled>.p-inputnumber-input:enabled:hover{background-color:#f8f9fa}.p-inputnumber.p-variant-filled>.p-inputnumber-input:enabled:focus{background-color:#fff}.p-inputswitch{display:inline-block}.p-inputswitch-input{cursor:pointer}.p-inputswitch-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;border:1px solid transparent}.p-inputswitch-slider:before{position:absolute;content:"";top:50%}.p-inputswitch{width:3rem;height:1.75rem}.p-inputswitch .p-inputswitch-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;top:0;left:0;width:100%;height:100%;padding:0;margin:0;opacity:0;z-index:1;outline:0 none;border-radius:30px}.p-inputswitch .p-inputswitch-slider{background:#ced4da;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;border-radius:30px;outline-color:transparent}.p-inputswitch .p-inputswitch-slider:before{background:#fff;width:1.25rem;height:1.25rem;left:.25rem;margin-top:-.625rem;border-radius:50%;transition-duration:.2s}.p-inputswitch.p-highlight .p-inputswitch-slider{background:#2196f3}.p-inputswitch.p-highlight .p-inputswitch-slider:before{background:#fff;transform:translate(1.25rem)}.p-inputswitch:not(.p-disabled):has(.p-inputswitch-input:hover) .p-inputswitch-slider{background:#b6bfc8}.p-inputswitch:not(.p-disabled):has(.p-inputswitch-input:hover).p-highlight .p-inputswitch-slider{background:#0d89ec}.p-inputswitch:not(.p-disabled):has(.p-inputswitch-input:focus-visible) .p-inputswitch-slider{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-inputswitch.p-invalid>.p-inputswitch-slider{border-color:#f44336}.p-fluid .p-inputtext{width:100%}.p-inputtext{font-family:var(--font-family);font-feature-settings:var(--font-feature-settings, normal);font-size:1rem;color:#495057;background:#fff;padding:.5rem;border:1px solid #ced4da;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-radius:3px;outline-color:transparent}.p-inputtext:enabled:hover{border-color:#2196f3}.p-inputtext:enabled:focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-inputtext.p-invalid.p-component{border-color:#f44336}.p-inputtext.p-variant-filled{background-color:#f8f9fa}.p-inputtext.p-variant-filled:enabled:hover{background-color:#f8f9fa}.p-inputtext.p-variant-filled:enabled:focus{background-color:#fff}.p-inputtext.p-inputtext-sm{font-size:.875rem;padding:.4375rem}.p-inputtext.p-inputtext-lg{font-size:1.25rem;padding:.625rem}.p-float-label>label{left:.5rem;color:#6c757d;transition-duration:.2s}.p-float-label>.p-invalid+label{color:#f44336}.p-icon-field-left>.p-inputtext{padding-left:2rem}.p-icon-field-left.p-float-label>label{left:2rem}.p-icon-field-right>.p-inputtext{padding-right:2rem}::-webkit-input-placeholder{color:#6c757d}:-moz-placeholder{color:#6c757d}::-moz-placeholder{color:#6c757d}:-ms-input-placeholder{color:#6c757d}.p-input-filled .p-inputtext{background-color:#f8f9fa}.p-input-filled .p-inputtext:enabled:hover{background-color:#f8f9fa}.p-input-filled .p-inputtext:enabled:focus{background-color:#fff}.p-inputtext-sm .p-inputtext{font-size:.875rem;padding:.4375rem}.p-inputtext-lg .p-inputtext{font-size:1.25rem;padding:.625rem}.p-knob-range{fill:none;transition:stroke .1s ease-in}.p-knob-value{animation-name:dash-frame;animation-fill-mode:forwards;fill:none}.p-knob-text{font-size:1.3rem;text-align:center}@keyframes dash-frame{to{stroke-dashoffset:0}}.p-listbox-list-wrapper{overflow:auto}.p-listbox-list{list-style-type:none;margin:0;padding:0}.p-listbox-item{cursor:pointer;position:relative;overflow:hidden}.p-listbox-item-group{cursor:auto}.p-listbox-filter-container{position:relative}.p-listbox-filter-icon{position:absolute;top:50%;margin-top:-.5rem}.p-listbox-filter{width:100%}.p-listbox{background:#fff;color:#495057;border:1px solid #ced4da;border-radius:3px;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;outline-color:transparent}.p-listbox .p-listbox-header{padding:.5rem 1rem;border-bottom:0 none;color:#495057;background:#f8f9fa;margin:0;border-top-right-radius:3px;border-top-left-radius:3px}.p-listbox .p-listbox-header .p-listbox-filter{padding-right:1.5rem}.p-listbox .p-listbox-header .p-listbox-filter-icon{right:.5rem;color:#6c757d}.p-listbox .p-listbox-list{padding:.5rem 0;outline:0 none}.p-listbox .p-listbox-list .p-listbox-item{margin:0;padding:.5rem 1rem;border:0 none;color:#495057;transition:box-shadow .2s;border-radius:0}.p-listbox .p-listbox-list .p-listbox-item:first-child{margin-top:0}.p-listbox .p-listbox-list .p-listbox-item:last-child{margin-bottom:0}.p-listbox .p-listbox-list .p-listbox-item.p-highlight{color:#495057;background:#e3f2fd}.p-listbox .p-listbox-list .p-listbox-item-group{margin:0;padding:.75rem 1rem;color:#495057;background:#fff;font-weight:600}.p-listbox .p-listbox-list .p-listbox-empty-message{padding:.5rem 1rem;color:#495057;background:transparent}.p-listbox:not(.p-disabled) .p-listbox-item.p-highlight.p-focus{background:#2196f33d}.p-listbox:not(.p-disabled) .p-listbox-item:not(.p-highlight):not(.p-disabled).p-focus{color:#495057;background:#e9ecef}.p-listbox:not(.p-disabled) .p-listbox-item:not(.p-highlight):not(.p-disabled):hover{color:#495057;background:#e9ecef}.p-listbox:not(.p-disabled) .p-listbox-item:not(.p-highlight):not(.p-disabled):hover.p-focus{color:#495057;background:#e9ecef}.p-listbox.p-focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-listbox.p-invalid{border-color:#f44336}.p-multiselect{display:inline-flex;cursor:pointer;-webkit-user-select:none;user-select:none}.p-multiselect-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}.p-multiselect-label-container{overflow:hidden;flex:1 1 auto;cursor:pointer}.p-multiselect-label{display:block;white-space:nowrap;cursor:pointer;overflow:hidden;text-overflow:ellipsis}.p-multiselect-label-empty{overflow:hidden;visibility:hidden}.p-multiselect-token{cursor:default;display:inline-flex;align-items:center;flex:0 0 auto}.p-multiselect-token-icon{cursor:pointer}.p-multiselect .p-multiselect-panel{min-width:100%}.p-multiselect-items-wrapper{overflow:auto}.p-multiselect-items{margin:0;padding:0;list-style-type:none}.p-multiselect-item{cursor:pointer;display:flex;align-items:center;font-weight:400;white-space:nowrap;position:relative;overflow:hidden}.p-multiselect-item-group{cursor:auto}.p-multiselect-header{display:flex;align-items:center;justify-content:space-between}.p-multiselect-filter-container{position:relative;flex:1 1 auto}.p-multiselect-filter-icon{position:absolute;top:50%;margin-top:-.5rem}.p-multiselect-filter-container .p-inputtext{width:100%}.p-multiselect-close{display:flex;align-items:center;justify-content:center;flex-shrink:0;overflow:hidden;position:relative;margin-left:auto}.p-fluid .p-multiselect{display:flex}.p-multiselect{background:#fff;border:1px solid #ced4da;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;border-radius:3px;outline-color:transparent}.p-multiselect:not(.p-disabled):hover{border-color:#2196f3}.p-multiselect:not(.p-disabled).p-focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-multiselect.p-variant-filled{background:#f8f9fa}.p-multiselect.p-variant-filled:not(.p-disabled):hover{background-color:#f8f9fa}.p-multiselect.p-variant-filled:not(.p-disabled).p-focus{background-color:#fff}.p-multiselect .p-multiselect-label{padding:.5rem;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}.p-multiselect .p-multiselect-label.p-placeholder{color:#6c757d}.p-multiselect.p-multiselect-chip .p-multiselect-token{padding:.25rem .5rem;margin-right:.5rem;background:#dee2e6;color:#495057;border-radius:16px}.p-multiselect.p-multiselect-chip .p-multiselect-token .p-multiselect-token-icon{margin-left:.5rem}.p-multiselect .p-multiselect-trigger{background:transparent;color:#6c757d;width:2.357rem;border-top-right-radius:3px;border-bottom-right-radius:3px}.p-multiselect.p-invalid.p-component{border-color:#f44336}.p-inputwrapper-filled.p-multiselect.p-multiselect-chip .p-multiselect-label{padding:.25rem .5rem}.p-multiselect-panel{background:#fff;color:#495057;border:0 none;border-radius:3px;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.p-multiselect-panel .p-multiselect-header{padding:.5rem 1rem;border-bottom:0 none;color:#495057;background:#f8f9fa;margin:0;border-top-right-radius:3px;border-top-left-radius:3px}.p-multiselect-panel .p-multiselect-header .p-multiselect-filter-container .p-inputtext{padding-right:1.5rem}.p-multiselect-panel .p-multiselect-header .p-multiselect-filter-container .p-multiselect-filter-icon{right:.5rem;color:#6c757d}.p-multiselect-panel .p-multiselect-header .p-checkbox{margin-right:.5rem}.p-multiselect-panel .p-multiselect-header .p-multiselect-close{margin-left:.5rem;width:2rem;height:2rem;color:#6c757d;border:0 none;background:transparent;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-multiselect-panel .p-multiselect-header .p-multiselect-close:enabled:hover{color:#495057;border-color:transparent;background:#e9ecef}.p-multiselect-panel .p-multiselect-header .p-multiselect-close:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-multiselect-panel .p-multiselect-items{padding:.5rem 0}.p-multiselect-panel .p-multiselect-items .p-multiselect-item{margin:0;padding:.5rem 1rem;border:0 none;color:#495057;background:transparent;transition:box-shadow .2s;border-radius:0}.p-multiselect-panel .p-multiselect-items .p-multiselect-item:first-child{margin-top:0}.p-multiselect-panel .p-multiselect-items .p-multiselect-item:last-child{margin-bottom:0}.p-multiselect-panel .p-multiselect-items .p-multiselect-item.p-highlight{color:#495057;background:#e3f2fd}.p-multiselect-panel .p-multiselect-items .p-multiselect-item.p-highlight.p-focus{background:#2196f33d}.p-multiselect-panel .p-multiselect-items .p-multiselect-item:not(.p-highlight):not(.p-disabled).p-focus{color:#495057;background:#e9ecef}.p-multiselect-panel .p-multiselect-items .p-multiselect-item .p-checkbox{margin-right:.5rem}.p-multiselect-panel .p-multiselect-items .p-multiselect-item-group{margin:0;padding:.75rem 1rem;color:#495057;background:#fff;font-weight:600}.p-multiselect-panel .p-multiselect-items .p-multiselect-empty-message{padding:.5rem 1rem;color:#495057;background:transparent}.p-password{display:inline-flex}.p-password .p-password-panel{min-width:100%}.p-password-meter{height:10px}.p-password-strength{height:100%;width:0;transition:width 1s ease-in-out}.p-fluid .p-password{display:flex}.p-password-input::-ms-reveal,.p-password-input::-ms-clear{display:none}.p-password.p-invalid.p-component>.p-inputtext{border-color:#f44336}.p-password-panel{padding:1rem;background:#fff;color:#495057;border:0 none;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;border-radius:3px}.p-password-panel .p-password-meter{margin-bottom:.5rem;background:#dee2e6}.p-password-panel .p-password-meter .p-password-strength.weak{background:#d32f2f}.p-password-panel .p-password-meter .p-password-strength.medium{background:#fbc02d}.p-password-panel .p-password-meter .p-password-strength.strong{background:#689f38}.p-radiobutton{position:relative;display:inline-flex;-webkit-user-select:none;user-select:none;vertical-align:bottom}.p-radiobutton-input{cursor:pointer}.p-radiobutton-box{display:flex;justify-content:center;align-items:center}.p-radiobutton-icon{-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:translateZ(0) scale(.1);border-radius:50%;visibility:hidden}.p-radiobutton.p-highlight .p-radiobutton-icon{transform:translateZ(0) scale(1);visibility:visible}.p-radiobutton{width:20px;height:20px}.p-radiobutton .p-radiobutton-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;top:0;left:0;width:100%;height:100%;padding:0;margin:0;opacity:0;z-index:1;outline:0 none;border:2px solid #ced4da;border-radius:50%}.p-radiobutton .p-radiobutton-box{border:2px solid #ced4da;background:#fff;width:20px;height:20px;color:#495057;border-radius:50%;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;outline-color:transparent}.p-radiobutton .p-radiobutton-box .p-radiobutton-icon{width:12px;height:12px;transition-duration:.2s;background-color:#fff}.p-radiobutton.p-highlight .p-radiobutton-box{border-color:#2196f3;background:#2196f3}.p-radiobutton:not(.p-disabled):has(.p-radiobutton-input:hover) .p-radiobutton-box{border-color:#2196f3}.p-radiobutton:not(.p-disabled):has(.p-radiobutton-input:hover).p-highlight .p-radiobutton-box{border-color:#0b7ad1;background:#0b7ad1}.p-radiobutton:not(.p-disabled):has(.p-radiobutton-input:hover).p-highlight .p-radiobutton-box .p-radiobutton-icon{background-color:#fff}.p-radiobutton:not(.p-disabled):has(.p-radiobutton-input:focus-visible) .p-radiobutton-box{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-radiobutton.p-invalid>.p-radiobutton-box{border-color:#f44336}.p-radiobutton.p-variant-filled .p-radiobutton-box{background-color:#f8f9fa}.p-radiobutton.p-variant-filled.p-highlight .p-radiobutton-box{background:#2196f3}.p-radiobutton.p-variant-filled:not(.p-disabled):has(.p-radiobutton-input:hover) .p-radiobutton-box{background-color:#f8f9fa}.p-radiobutton.p-variant-filled:not(.p-disabled):has(.p-radiobutton-input:hover).p-highlight .p-radiobutton-box{background:#0b7ad1}.p-input-filled .p-radiobutton .p-radiobutton-box{background-color:#f8f9fa}.p-input-filled .p-radiobutton.p-highlight .p-radiobutton-box{background:#2196f3}.p-input-filled .p-radiobutton:not(.p-disabled):has(.p-radiobutton-input:hover) .p-radiobutton-box{background-color:#f8f9fa}.p-input-filled .p-radiobutton:not(.p-disabled):has(.p-radiobutton-input:hover).p-highlight .p-radiobutton-box{background:#0b7ad1}.p-rating{position:relative;display:flex;align-items:center}.p-rating-item{display:inline-flex;align-items:center;cursor:pointer}.p-rating.p-readonly .p-rating-item{cursor:default}.p-rating{gap:.5rem}.p-rating .p-rating-item{outline-color:transparent;border-radius:50%}.p-rating .p-rating-item .p-rating-icon{color:#495057;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;font-size:1.143rem}.p-rating .p-rating-item .p-rating-icon.p-icon{width:1.143rem;height:1.143rem}.p-rating .p-rating-item .p-rating-icon.p-rating-cancel{color:#e74c3c}.p-rating .p-rating-item.p-focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-rating .p-rating-item.p-rating-item-active .p-rating-icon{color:#2196f3}.p-rating:not(.p-disabled):not(.p-readonly) .p-rating-item:hover .p-rating-icon{color:#2196f3}.p-rating:not(.p-disabled):not(.p-readonly) .p-rating-item:hover .p-rating-icon.p-rating-cancel{color:#c0392b}.p-selectbutton .p-button{background:#fff;border:1px solid #ced4da;color:#495057;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}.p-selectbutton .p-button .p-button-icon-left,.p-selectbutton .p-button .p-button-icon-right{color:#6c757d}.p-selectbutton .p-button:not(.p-disabled):not(.p-highlight):hover{background:#e9ecef;border-color:#ced4da;color:#495057}.p-selectbutton .p-button:not(.p-disabled):not(.p-highlight):hover .p-button-icon-left,.p-selectbutton .p-button:not(.p-disabled):not(.p-highlight):hover .p-button-icon-right{color:#6c757d}.p-selectbutton .p-button.p-highlight{background:#2196f3;border-color:#2196f3;color:#fff}.p-selectbutton .p-button.p-highlight .p-button-icon-left,.p-selectbutton .p-button.p-highlight .p-button-icon-right{color:#fff}.p-selectbutton .p-button.p-highlight:hover{background:#0d89ec;border-color:#0d89ec;color:#fff}.p-selectbutton .p-button.p-highlight:hover .p-button-icon-left,.p-selectbutton .p-button.p-highlight:hover .p-button-icon-right{color:#fff}.p-selectbutton.p-invalid>.p-button{border-color:#f44336}.p-slider{position:relative}.p-slider .p-slider-handle{cursor:grab;touch-action:none;display:block}.p-slider-range{display:block}.p-slider-horizontal .p-slider-range{top:0;left:0;height:100%}.p-slider-horizontal .p-slider-handle{top:50%}.p-slider-vertical{height:100px}.p-slider-vertical .p-slider-handle{left:50%}.p-slider-vertical .p-slider-range{bottom:0;left:0;width:100%}.p-slider{background:#dee2e6;border:0 none;border-radius:3px}.p-slider.p-slider-horizontal{height:.286rem}.p-slider.p-slider-horizontal .p-slider-handle{margin-top:-.5715rem;margin-left:-.5715rem}.p-slider.p-slider-vertical{width:.286rem}.p-slider.p-slider-vertical .p-slider-handle{margin-left:-.5715rem;margin-bottom:-.5715rem}.p-slider .p-slider-handle{height:1.143rem;width:1.143rem;background:#fff;border:2px solid #2196F3;border-radius:50%;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;outline-color:transparent}.p-slider .p-slider-handle:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-slider .p-slider-range{background:#2196f3;border-radius:3px}.p-slider:not(.p-disabled) .p-slider-handle:hover{background:#2196f3;border-color:#2196f3}.p-inputtextarea-resizable{overflow:hidden;resize:none}.p-fluid .p-inputtextarea{width:100%}.p-treeselect{display:inline-flex;cursor:pointer;-webkit-user-select:none;user-select:none}.p-treeselect-trigger{display:flex;align-items:center;justify-content:center;flex-shrink:0}.p-treeselect-label-container{overflow:hidden;flex:1 1 auto;cursor:pointer}.p-treeselect-label{display:block;white-space:nowrap;cursor:pointer;overflow:hidden;text-overflow:ellipsis}.p-treeselect-label-empty{overflow:hidden;visibility:hidden}.p-treeselect-token{cursor:default;display:inline-flex;align-items:center;flex:0 0 auto}.p-treeselect .p-treeselect-panel{min-width:100%}.p-treeselect-items-wrapper{overflow:auto}.p-fluid .p-treeselect{display:flex}.p-treeselect{background:#fff;border:1px solid #ced4da;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;border-radius:3px;outline-color:transparent}.p-treeselect:not(.p-disabled):hover{border-color:#2196f3}.p-treeselect:not(.p-disabled).p-focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-treeselect.p-variant-filled{background:#f8f9fa}.p-treeselect.p-variant-filled:not(.p-disabled):hover{background-color:#f8f9fa}.p-treeselect.p-variant-filled:not(.p-disabled).p-focus{background-color:#fff}.p-treeselect .p-treeselect-label{padding:.5rem;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s}.p-treeselect .p-treeselect-label.p-placeholder{color:#6c757d}.p-treeselect.p-treeselect-chip .p-treeselect-token{padding:.25rem .5rem;margin-right:.5rem;background:#dee2e6;color:#495057;border-radius:16px}.p-treeselect .p-treeselect-trigger{background:transparent;color:#6c757d;width:2.357rem;border-top-right-radius:3px;border-bottom-right-radius:3px}.p-treeselect.p-invalid.p-component{border-color:#f44336}.p-inputwrapper-filled.p-treeselect.p-treeselect-chip .p-treeselect-label{padding:.25rem .5rem}.p-treeselect-panel{background:#fff;color:#495057;border:0 none;border-radius:3px;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.p-treeselect-panel .p-treeselect-items-wrapper .p-tree{border:0 none}.p-treeselect-panel .p-treeselect-items-wrapper .p-treeselect-empty-message{padding:.5rem 1rem;color:#495057;background:transparent}.p-input-filled .p-treeselect{background:#f8f9fa}.p-input-filled .p-treeselect:not(.p-disabled):hover{background-color:#f8f9fa}.p-input-filled .p-treeselect:not(.p-disabled).p-focus{background-color:#fff}.p-togglebutton{position:relative;display:inline-flex;-webkit-user-select:none;user-select:none;vertical-align:bottom}.p-togglebutton-input{cursor:pointer}.p-togglebutton .p-button{flex:1 1 auto}.p-togglebutton .p-togglebutton-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;position:absolute;top:0;left:0;width:100%;height:100%;padding:0;margin:0;opacity:0;z-index:1;outline:0 none;border:1px solid #ced4da;border-radius:3px}.p-togglebutton .p-button{background:#fff;border:1px solid #ced4da;color:#495057;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;outline-color:transparent}.p-togglebutton .p-button .p-button-icon-left,.p-togglebutton .p-button .p-button-icon-right{color:#6c757d}.p-togglebutton.p-highlight .p-button{background:#2196f3;border-color:#2196f3;color:#fff}.p-togglebutton.p-highlight .p-button .p-button-icon-left,.p-togglebutton.p-highlight .p-button .p-button-icon-right{color:#fff}.p-togglebutton:not(.p-disabled):has(.p-togglebutton-input:hover):not(.p-highlight) .p-button{background:#e9ecef;border-color:#ced4da;color:#495057}.p-togglebutton:not(.p-disabled):has(.p-togglebutton-input:hover):not(.p-highlight) .p-button .p-button-icon-left,.p-togglebutton:not(.p-disabled):has(.p-togglebutton-input:hover):not(.p-highlight) .p-button .p-button-icon-right{color:#6c757d}.p-togglebutton:not(.p-disabled):has(.p-togglebutton-input:hover).p-highlight .p-button{background:#0d89ec;border-color:#0d89ec;color:#fff}.p-togglebutton:not(.p-disabled):has(.p-togglebutton-input:hover).p-highlight .p-button .p-button-icon-left,.p-togglebutton:not(.p-disabled):has(.p-togglebutton-input:hover).p-highlight .p-button .p-button-icon-right{color:#fff}.p-togglebutton:not(.p-disabled):has(.p-togglebutton-input:focus-visible) .p-button{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-togglebutton.p-invalid>.p-button{border-color:#f44336}.p-button{display:inline-flex;cursor:pointer;-webkit-user-select:none;user-select:none;align-items:center;vertical-align:bottom;text-align:center;overflow:hidden;position:relative}.p-button-label{flex:1 1 auto}.p-button-icon-right{order:1}.p-button:disabled{cursor:default}.p-button-icon-only{justify-content:center}.p-button-icon-only .p-button-label{visibility:hidden;width:0;flex:0 0 auto}.p-button-vertical{flex-direction:column}.p-button-icon-bottom{order:2}.p-button-group .p-button{margin:0}.p-button-group .p-button:not(:last-child),.p-button-group .p-button:not(:last-child):hover{border-right:0 none}.p-button-group .p-button:not(:first-of-type):not(:last-of-type){border-radius:0}.p-button-group .p-button:first-of-type:not(:only-of-type){border-top-right-radius:0;border-bottom-right-radius:0}.p-button-group .p-button:last-of-type:not(:only-of-type){border-top-left-radius:0;border-bottom-left-radius:0}.p-button-group .p-button:focus{position:relative;z-index:1}.p-button{color:#fff;background:#2196f3;border:1px solid #2196F3;padding:.5rem 1rem;font-size:1rem;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;border-radius:3px;outline-color:transparent}.p-button:not(:disabled):hover{background:#0d89ec;color:#fff;border-color:#0d89ec}.p-button:not(:disabled):active{background:#0b7ad1;color:#fff;border-color:#0b7ad1}.p-button.p-button-outlined{background-color:transparent;color:#2196f3;border:1px solid}.p-button.p-button-outlined:not(:disabled):hover{background:#2196f30a;color:#2196f3;border:1px solid}.p-button.p-button-outlined:not(:disabled):active{background:#2196f329;color:#2196f3;border:1px solid}.p-button.p-button-outlined.p-button-plain{color:#6c757d;border-color:#6c757d}.p-button.p-button-outlined.p-button-plain:not(:disabled):hover{background:#e9ecef;color:#6c757d}.p-button.p-button-outlined.p-button-plain:not(:disabled):active{background:#dee2e6;color:#6c757d}.p-button.p-button-text{background-color:transparent;color:#2196f3;border-color:transparent}.p-button.p-button-text:not(:disabled):hover{background:#2196f30a;color:#2196f3;border-color:transparent}.p-button.p-button-text:not(:disabled):active{background:#2196f329;color:#2196f3;border-color:transparent}.p-button.p-button-text.p-button-plain{color:#6c757d}.p-button.p-button-text.p-button-plain:not(:disabled):hover{background:#e9ecef;color:#6c757d}.p-button.p-button-text.p-button-plain:not(:disabled):active{background:#dee2e6;color:#6c757d}.p-button:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-button .p-button-label{transition-duration:.2s}.p-button .p-button-icon-left{margin-right:.5rem}.p-button .p-button-icon-right{margin-left:.5rem}.p-button .p-button-icon-bottom{margin-top:.5rem}.p-button .p-button-icon-top{margin-bottom:.5rem}.p-button .p-badge{margin-left:.5rem;min-width:1rem;height:1rem;line-height:1rem;color:#2196f3;background-color:#fff}.p-button.p-button-raised{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.p-button.p-button-rounded{border-radius:2rem}.p-button.p-button-icon-only{width:2.357rem;padding:.5rem 0}.p-button.p-button-icon-only .p-button-icon-left,.p-button.p-button-icon-only .p-button-icon-right{margin:0}.p-button.p-button-icon-only.p-button-rounded{border-radius:50%;height:2.357rem}.p-button.p-button-sm{font-size:.875rem;padding:.4375rem .875rem}.p-button.p-button-sm .p-button-icon{font-size:.875rem}.p-button.p-button-lg{font-size:1.25rem;padding:.625rem 1.25rem}.p-button.p-button-lg .p-button-icon{font-size:1.25rem}.p-button.p-button-loading-label-only .p-button-label{margin-left:.5rem}.p-button.p-button-loading-label-only .p-button-loading-icon{margin-right:0}.p-fluid .p-button{width:100%}.p-fluid .p-button-icon-only{width:2.357rem}.p-fluid .p-button-group{display:flex}.p-fluid .p-button-group .p-button{flex:1}.p-button.p-button-secondary,.p-button-group.p-button-secondary>.p-button,.p-splitbutton.p-button-secondary>.p-button{color:#fff;background:#607d8b;border:1px solid #607D8B}.p-button.p-button-secondary:not(:disabled):hover,.p-button-group.p-button-secondary>.p-button:not(:disabled):hover,.p-splitbutton.p-button-secondary>.p-button:not(:disabled):hover{background:#56717d;color:#fff;border-color:#56717d}.p-button.p-button-secondary:not(:disabled):focus,.p-button-group.p-button-secondary>.p-button:not(:disabled):focus,.p-splitbutton.p-button-secondary>.p-button:not(:disabled):focus{box-shadow:0 0 0 .2rem #beccd2}.p-button.p-button-secondary:not(:disabled):active,.p-button-group.p-button-secondary>.p-button:not(:disabled):active,.p-splitbutton.p-button-secondary>.p-button:not(:disabled):active{background:#4d646f;color:#fff;border-color:#4d646f}.p-button.p-button-secondary.p-button-outlined,.p-button-group.p-button-secondary>.p-button.p-button-outlined,.p-splitbutton.p-button-secondary>.p-button.p-button-outlined{background-color:transparent;color:#607d8b;border:1px solid}.p-button.p-button-secondary.p-button-outlined:not(:disabled):hover,.p-button-group.p-button-secondary>.p-button.p-button-outlined:not(:disabled):hover,.p-splitbutton.p-button-secondary>.p-button.p-button-outlined:not(:disabled):hover{background:#607d8b0a;color:#607d8b;border:1px solid}.p-button.p-button-secondary.p-button-outlined:not(:disabled):active,.p-button-group.p-button-secondary>.p-button.p-button-outlined:not(:disabled):active,.p-splitbutton.p-button-secondary>.p-button.p-button-outlined:not(:disabled):active{background:#607d8b29;color:#607d8b;border:1px solid}.p-button.p-button-secondary.p-button-text,.p-button-group.p-button-secondary>.p-button.p-button-text,.p-splitbutton.p-button-secondary>.p-button.p-button-text{background-color:transparent;color:#607d8b;border-color:transparent}.p-button.p-button-secondary.p-button-text:not(:disabled):hover,.p-button-group.p-button-secondary>.p-button.p-button-text:not(:disabled):hover,.p-splitbutton.p-button-secondary>.p-button.p-button-text:not(:disabled):hover{background:#607d8b0a;border-color:transparent;color:#607d8b}.p-button.p-button-secondary.p-button-text:not(:disabled):active,.p-button-group.p-button-secondary>.p-button.p-button-text:not(:disabled):active,.p-splitbutton.p-button-secondary>.p-button.p-button-text:not(:disabled):active{background:#607d8b29;border-color:transparent;color:#607d8b}.p-button.p-button-info,.p-button-group.p-button-info>.p-button,.p-splitbutton.p-button-info>.p-button{color:#fff;background:#0288d1;border:1px solid #0288D1}.p-button.p-button-info:not(:disabled):hover,.p-button-group.p-button-info>.p-button:not(:disabled):hover,.p-splitbutton.p-button-info>.p-button:not(:disabled):hover{background:#027abc;color:#fff;border-color:#027abc}.p-button.p-button-info:not(:disabled):focus,.p-button-group.p-button-info>.p-button:not(:disabled):focus,.p-splitbutton.p-button-info>.p-button:not(:disabled):focus{box-shadow:0 0 0 .2rem #89d4fe}.p-button.p-button-info:not(:disabled):active,.p-button-group.p-button-info>.p-button:not(:disabled):active,.p-splitbutton.p-button-info>.p-button:not(:disabled):active{background:#026da7;color:#fff;border-color:#026da7}.p-button.p-button-info.p-button-outlined,.p-button-group.p-button-info>.p-button.p-button-outlined,.p-splitbutton.p-button-info>.p-button.p-button-outlined{background-color:transparent;color:#0288d1;border:1px solid}.p-button.p-button-info.p-button-outlined:not(:disabled):hover,.p-button-group.p-button-info>.p-button.p-button-outlined:not(:disabled):hover,.p-splitbutton.p-button-info>.p-button.p-button-outlined:not(:disabled):hover{background:#0288d10a;color:#0288d1;border:1px solid}.p-button.p-button-info.p-button-outlined:not(:disabled):active,.p-button-group.p-button-info>.p-button.p-button-outlined:not(:disabled):active,.p-splitbutton.p-button-info>.p-button.p-button-outlined:not(:disabled):active{background:#0288d129;color:#0288d1;border:1px solid}.p-button.p-button-info.p-button-text,.p-button-group.p-button-info>.p-button.p-button-text,.p-splitbutton.p-button-info>.p-button.p-button-text{background-color:transparent;color:#0288d1;border-color:transparent}.p-button.p-button-info.p-button-text:not(:disabled):hover,.p-button-group.p-button-info>.p-button.p-button-text:not(:disabled):hover,.p-splitbutton.p-button-info>.p-button.p-button-text:not(:disabled):hover{background:#0288d10a;border-color:transparent;color:#0288d1}.p-button.p-button-info.p-button-text:not(:disabled):active,.p-button-group.p-button-info>.p-button.p-button-text:not(:disabled):active,.p-splitbutton.p-button-info>.p-button.p-button-text:not(:disabled):active{background:#0288d129;border-color:transparent;color:#0288d1}.p-button.p-button-success,.p-button-group.p-button-success>.p-button,.p-splitbutton.p-button-success>.p-button{color:#fff;background:#689f38;border:1px solid #689F38}.p-button.p-button-success:not(:disabled):hover,.p-button-group.p-button-success>.p-button:not(:disabled):hover,.p-splitbutton.p-button-success>.p-button:not(:disabled):hover{background:#5e8f32;color:#fff;border-color:#5e8f32}.p-button.p-button-success:not(:disabled):focus,.p-button-group.p-button-success>.p-button:not(:disabled):focus,.p-splitbutton.p-button-success>.p-button:not(:disabled):focus{box-shadow:0 0 0 .2rem #c2e0a8}.p-button.p-button-success:not(:disabled):active,.p-button-group.p-button-success>.p-button:not(:disabled):active,.p-splitbutton.p-button-success>.p-button:not(:disabled):active{background:#537f2d;color:#fff;border-color:#537f2d}.p-button.p-button-success.p-button-outlined,.p-button-group.p-button-success>.p-button.p-button-outlined,.p-splitbutton.p-button-success>.p-button.p-button-outlined{background-color:transparent;color:#689f38;border:1px solid}.p-button.p-button-success.p-button-outlined:not(:disabled):hover,.p-button-group.p-button-success>.p-button.p-button-outlined:not(:disabled):hover,.p-splitbutton.p-button-success>.p-button.p-button-outlined:not(:disabled):hover{background:#689f380a;color:#689f38;border:1px solid}.p-button.p-button-success.p-button-outlined:not(:disabled):active,.p-button-group.p-button-success>.p-button.p-button-outlined:not(:disabled):active,.p-splitbutton.p-button-success>.p-button.p-button-outlined:not(:disabled):active{background:#689f3829;color:#689f38;border:1px solid}.p-button.p-button-success.p-button-text,.p-button-group.p-button-success>.p-button.p-button-text,.p-splitbutton.p-button-success>.p-button.p-button-text{background-color:transparent;color:#689f38;border-color:transparent}.p-button.p-button-success.p-button-text:not(:disabled):hover,.p-button-group.p-button-success>.p-button.p-button-text:not(:disabled):hover,.p-splitbutton.p-button-success>.p-button.p-button-text:not(:disabled):hover{background:#689f380a;border-color:transparent;color:#689f38}.p-button.p-button-success.p-button-text:not(:disabled):active,.p-button-group.p-button-success>.p-button.p-button-text:not(:disabled):active,.p-splitbutton.p-button-success>.p-button.p-button-text:not(:disabled):active{background:#689f3829;border-color:transparent;color:#689f38}.p-button.p-button-warning,.p-button-group.p-button-warning>.p-button,.p-splitbutton.p-button-warning>.p-button{color:#212529;background:#fbc02d;border:1px solid #FBC02D}.p-button.p-button-warning:not(:disabled):hover,.p-button-group.p-button-warning>.p-button:not(:disabled):hover,.p-splitbutton.p-button-warning>.p-button:not(:disabled):hover{background:#fab710;color:#212529;border-color:#fab710}.p-button.p-button-warning:not(:disabled):focus,.p-button-group.p-button-warning>.p-button:not(:disabled):focus,.p-splitbutton.p-button-warning>.p-button:not(:disabled):focus{box-shadow:0 0 0 .2rem #fde6ab}.p-button.p-button-warning:not(:disabled):active,.p-button-group.p-button-warning>.p-button:not(:disabled):active,.p-splitbutton.p-button-warning>.p-button:not(:disabled):active{background:#e8a704;color:#212529;border-color:#e8a704}.p-button.p-button-warning.p-button-outlined,.p-button-group.p-button-warning>.p-button.p-button-outlined,.p-splitbutton.p-button-warning>.p-button.p-button-outlined{background-color:transparent;color:#fbc02d;border:1px solid}.p-button.p-button-warning.p-button-outlined:not(:disabled):hover,.p-button-group.p-button-warning>.p-button.p-button-outlined:not(:disabled):hover,.p-splitbutton.p-button-warning>.p-button.p-button-outlined:not(:disabled):hover{background:#fbc02d0a;color:#fbc02d;border:1px solid}.p-button.p-button-warning.p-button-outlined:not(:disabled):active,.p-button-group.p-button-warning>.p-button.p-button-outlined:not(:disabled):active,.p-splitbutton.p-button-warning>.p-button.p-button-outlined:not(:disabled):active{background:#fbc02d29;color:#fbc02d;border:1px solid}.p-button.p-button-warning.p-button-text,.p-button-group.p-button-warning>.p-button.p-button-text,.p-splitbutton.p-button-warning>.p-button.p-button-text{background-color:transparent;color:#fbc02d;border-color:transparent}.p-button.p-button-warning.p-button-text:not(:disabled):hover,.p-button-group.p-button-warning>.p-button.p-button-text:not(:disabled):hover,.p-splitbutton.p-button-warning>.p-button.p-button-text:not(:disabled):hover{background:#fbc02d0a;border-color:transparent;color:#fbc02d}.p-button.p-button-warning.p-button-text:not(:disabled):active,.p-button-group.p-button-warning>.p-button.p-button-text:not(:disabled):active,.p-splitbutton.p-button-warning>.p-button.p-button-text:not(:disabled):active{background:#fbc02d29;border-color:transparent;color:#fbc02d}.p-button.p-button-help,.p-button-group.p-button-help>.p-button,.p-splitbutton.p-button-help>.p-button{color:#fff;background:#9c27b0;border:1px solid #9C27B0}.p-button.p-button-help:not(:disabled):hover,.p-button-group.p-button-help>.p-button:not(:disabled):hover,.p-splitbutton.p-button-help>.p-button:not(:disabled):hover{background:#8c239e;color:#fff;border-color:#8c239e}.p-button.p-button-help:not(:disabled):focus,.p-button-group.p-button-help>.p-button:not(:disabled):focus,.p-splitbutton.p-button-help>.p-button:not(:disabled):focus{box-shadow:0 0 0 .2rem #df9eea}.p-button.p-button-help:not(:disabled):active,.p-button-group.p-button-help>.p-button:not(:disabled):active,.p-splitbutton.p-button-help>.p-button:not(:disabled):active{background:#7d1f8d;color:#fff;border-color:#7d1f8d}.p-button.p-button-help.p-button-outlined,.p-button-group.p-button-help>.p-button.p-button-outlined,.p-splitbutton.p-button-help>.p-button.p-button-outlined{background-color:transparent;color:#9c27b0;border:1px solid}.p-button.p-button-help.p-button-outlined:not(:disabled):hover,.p-button-group.p-button-help>.p-button.p-button-outlined:not(:disabled):hover,.p-splitbutton.p-button-help>.p-button.p-button-outlined:not(:disabled):hover{background:#9c27b00a;color:#9c27b0;border:1px solid}.p-button.p-button-help.p-button-outlined:not(:disabled):active,.p-button-group.p-button-help>.p-button.p-button-outlined:not(:disabled):active,.p-splitbutton.p-button-help>.p-button.p-button-outlined:not(:disabled):active{background:#9c27b029;color:#9c27b0;border:1px solid}.p-button.p-button-help.p-button-text,.p-button-group.p-button-help>.p-button.p-button-text,.p-splitbutton.p-button-help>.p-button.p-button-text{background-color:transparent;color:#9c27b0;border-color:transparent}.p-button.p-button-help.p-button-text:not(:disabled):hover,.p-button-group.p-button-help>.p-button.p-button-text:not(:disabled):hover,.p-splitbutton.p-button-help>.p-button.p-button-text:not(:disabled):hover{background:#9c27b00a;border-color:transparent;color:#9c27b0}.p-button.p-button-help.p-button-text:not(:disabled):active,.p-button-group.p-button-help>.p-button.p-button-text:not(:disabled):active,.p-splitbutton.p-button-help>.p-button.p-button-text:not(:disabled):active{background:#9c27b029;border-color:transparent;color:#9c27b0}.p-button.p-button-danger,.p-button-group.p-button-danger>.p-button,.p-splitbutton.p-button-danger>.p-button{color:#fff;background:#d32f2f;border:1px solid #D32F2F}.p-button.p-button-danger:not(:disabled):hover,.p-button-group.p-button-danger>.p-button:not(:disabled):hover,.p-splitbutton.p-button-danger>.p-button:not(:disabled):hover{background:#c02929;color:#fff;border-color:#c02929}.p-button.p-button-danger:not(:disabled):focus,.p-button-group.p-button-danger>.p-button:not(:disabled):focus,.p-splitbutton.p-button-danger>.p-button:not(:disabled):focus{box-shadow:0 0 0 .2rem #edacac}.p-button.p-button-danger:not(:disabled):active,.p-button-group.p-button-danger>.p-button:not(:disabled):active,.p-splitbutton.p-button-danger>.p-button:not(:disabled):active{background:#aa2424;color:#fff;border-color:#aa2424}.p-button.p-button-danger.p-button-outlined,.p-button-group.p-button-danger>.p-button.p-button-outlined,.p-splitbutton.p-button-danger>.p-button.p-button-outlined{background-color:transparent;color:#d32f2f;border:1px solid}.p-button.p-button-danger.p-button-outlined:not(:disabled):hover,.p-button-group.p-button-danger>.p-button.p-button-outlined:not(:disabled):hover,.p-splitbutton.p-button-danger>.p-button.p-button-outlined:not(:disabled):hover{background:#d32f2f0a;color:#d32f2f;border:1px solid}.p-button.p-button-danger.p-button-outlined:not(:disabled):active,.p-button-group.p-button-danger>.p-button.p-button-outlined:not(:disabled):active,.p-splitbutton.p-button-danger>.p-button.p-button-outlined:not(:disabled):active{background:#d32f2f29;color:#d32f2f;border:1px solid}.p-button.p-button-danger.p-button-text,.p-button-group.p-button-danger>.p-button.p-button-text,.p-splitbutton.p-button-danger>.p-button.p-button-text{background-color:transparent;color:#d32f2f;border-color:transparent}.p-button.p-button-danger.p-button-text:not(:disabled):hover,.p-button-group.p-button-danger>.p-button.p-button-text:not(:disabled):hover,.p-splitbutton.p-button-danger>.p-button.p-button-text:not(:disabled):hover{background:#d32f2f0a;border-color:transparent;color:#d32f2f}.p-button.p-button-danger.p-button-text:not(:disabled):active,.p-button-group.p-button-danger>.p-button.p-button-text:not(:disabled):active,.p-splitbutton.p-button-danger>.p-button.p-button-text:not(:disabled):active{background:#d32f2f29;border-color:transparent;color:#d32f2f}.p-button.p-button-link{color:#0b7ad1;background:transparent;border:transparent}.p-button.p-button-link:not(:disabled):hover{background:transparent;color:#0b7ad1;border-color:transparent}.p-button.p-button-link:not(:disabled):hover .p-button-label{text-decoration:underline}.p-button.p-button-link:not(:disabled):focus{background:transparent;box-shadow:0 0 0 .2rem #a6d5fa;border-color:transparent}.p-button.p-button-link:not(:disabled):active{background:transparent;color:#0b7ad1;border-color:transparent}.p-speeddial{position:absolute;display:flex}.p-speeddial-button{z-index:1}.p-speeddial-list{margin:0;padding:0;list-style:none;display:flex;align-items:center;justify-content:center;transition:top 0s linear .2s;pointer-events:none;z-index:2}.p-speeddial-item{transform:scale(0);opacity:0;transition:transform .2s cubic-bezier(.4,0,.2,1) 0ms,opacity .8s;will-change:transform}.p-speeddial-action{display:flex;align-items:center;justify-content:center;border-radius:50%;position:relative;overflow:hidden}.p-speeddial-circle .p-speeddial-item,.p-speeddial-semi-circle .p-speeddial-item,.p-speeddial-quarter-circle .p-speeddial-item{position:absolute}.p-speeddial-rotate{transition:transform .25s cubic-bezier(.4,0,.2,1) 0ms;will-change:transform}.p-speeddial-mask{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;transition:opacity .25s cubic-bezier(.25,.8,.25,1)}.p-speeddial-mask-visible{pointer-events:none;opacity:1;transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.p-speeddial-opened .p-speeddial-list{pointer-events:auto}.p-speeddial-opened .p-speeddial-item{transform:scale(1);opacity:1}.p-speeddial-opened .p-speeddial-rotate{transform:rotate(45deg)}.p-speeddial-button.p-button.p-button-icon-only{width:4rem;height:4rem}.p-speeddial-button.p-button.p-button-icon-only .p-button-icon{font-size:1.3rem}.p-speeddial-button.p-button.p-button-icon-only .p-icon{width:1.3rem;height:1.3rem}.p-speeddial-list{outline:0 none}.p-speeddial-item.p-focus>.p-speeddial-action{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-speeddial-action{width:3rem;height:3rem;background:#495057;color:#fff;outline-color:transparent;transition:background-color .2s,color .2s,box-shadow .2s}.p-speeddial-action:hover{background:#343a40;color:#fff}.p-speeddial-direction-up .p-speeddial-item{margin:.25rem 0}.p-speeddial-direction-up .p-speeddial-item:first-child{margin-bottom:.5rem}.p-speeddial-direction-down .p-speeddial-item{margin:.25rem 0}.p-speeddial-direction-down .p-speeddial-item:first-child{margin-top:.5rem}.p-speeddial-direction-left .p-speeddial-item{margin:0 .25rem}.p-speeddial-direction-left .p-speeddial-item:first-child{margin-right:.5rem}.p-speeddial-direction-right .p-speeddial-item{margin:0 .25rem}.p-speeddial-direction-right .p-speeddial-item:first-child{margin-left:.5rem}.p-speeddial-circle .p-speeddial-item,.p-speeddial-semi-circle .p-speeddial-item,.p-speeddial-quarter-circle .p-speeddial-item{margin:0}.p-speeddial-circle .p-speeddial-item:first-child,.p-speeddial-circle .p-speeddial-item:last-child,.p-speeddial-semi-circle .p-speeddial-item:first-child,.p-speeddial-semi-circle .p-speeddial-item:last-child,.p-speeddial-quarter-circle .p-speeddial-item:first-child,.p-speeddial-quarter-circle .p-speeddial-item:last-child{margin:0}.p-speeddial-mask{background-color:#0006;border-radius:3px}.p-splitbutton{display:inline-flex;position:relative}.p-splitbutton .p-splitbutton-defaultbutton,.p-splitbutton.p-button-rounded>.p-splitbutton-defaultbutton.p-button,.p-splitbutton.p-button-outlined>.p-splitbutton-defaultbutton.p-button,.p-splitbutton.p-button-outlined>.p-splitbutton-defaultbutton.p-button-outlined.p-button:hover{flex:1 1 auto;border-top-right-radius:0;border-bottom-right-radius:0;border-right:0 none}.p-splitbutton-menubutton,.p-splitbutton.p-button-rounded>.p-splitbutton-menubutton.p-button,.p-splitbutton.p-button-outlined>.p-splitbutton-menubutton.p-button{display:flex;align-items:center;justify-content:center;border-top-left-radius:0;border-bottom-left-radius:0}.p-splitbutton .p-menu{min-width:100%}.p-fluid .p-splitbutton{display:flex}.p-splitbutton{border-radius:3px}.p-splitbutton.p-button-rounded{border-radius:2rem}.p-splitbutton.p-button-rounded>.p-button{border-radius:2rem}.p-splitbutton.p-button-raised{box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f}.p-carousel{display:flex;flex-direction:column}.p-carousel-content{display:flex;flex-direction:column;overflow:auto}.p-carousel-prev,.p-carousel-next{align-self:center;flex-grow:0;flex-shrink:0;display:flex;justify-content:center;align-items:center;overflow:hidden;position:relative}.p-carousel-container{display:flex;flex-direction:row}.p-carousel-items-content{overflow:hidden;width:100%}.p-carousel-items-container{display:flex;flex-direction:row}.p-carousel-indicators{display:flex;flex-direction:row;justify-content:center;flex-wrap:wrap}.p-carousel-indicator>button{display:flex;align-items:center;justify-content:center}.p-carousel-vertical .p-carousel-container{flex-direction:column}.p-carousel-vertical .p-carousel-items-container{flex-direction:column;height:100%}.p-items-hidden .p-carousel-item{visibility:hidden}.p-items-hidden .p-carousel-item.p-carousel-item-active{visibility:visible}.p-carousel .p-carousel-content .p-carousel-prev,.p-carousel .p-carousel-content .p-carousel-next{width:2rem;height:2rem;color:#6c757d;border:0 none;background:transparent;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent;margin:.5rem}.p-carousel .p-carousel-content .p-carousel-prev:enabled:hover,.p-carousel .p-carousel-content .p-carousel-next:enabled:hover{color:#495057;border-color:transparent;background:#e9ecef}.p-carousel .p-carousel-content .p-carousel-prev:focus-visible,.p-carousel .p-carousel-content .p-carousel-next:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-carousel .p-carousel-indicators{padding:1rem}.p-carousel .p-carousel-indicators .p-carousel-indicator{margin-right:.5rem;margin-bottom:.5rem}.p-carousel .p-carousel-indicators .p-carousel-indicator button{background-color:#e9ecef;width:2rem;height:.5rem;transition:background-color .2s,color .2s,box-shadow .2s;border-radius:0}.p-carousel .p-carousel-indicators .p-carousel-indicator button:hover{background:#dee2e6}.p-carousel .p-carousel-indicators .p-carousel-indicator.p-highlight button{background:#e3f2fd;color:#495057}.p-datatable{position:relative}.p-datatable-table{border-spacing:0px;width:100%}.p-datatable .p-sortable-column{cursor:pointer;-webkit-user-select:none;user-select:none}.p-datatable .p-sortable-column .p-column-title,.p-datatable .p-sortable-column .p-sortable-column-icon,.p-datatable .p-sortable-column .p-sortable-column-badge{vertical-align:middle}.p-datatable .p-sortable-column .p-sortable-column-badge{display:inline-flex;align-items:center;justify-content:center}.p-datatable-hoverable-rows .p-selectable-row{cursor:pointer}.p-datatable-scrollable>.p-datatable-wrapper{position:relative}.p-datatable-scrollable-table>.p-datatable-thead{top:0;z-index:1}.p-datatable-scrollable-table>.p-datatable-frozen-tbody{position:sticky;z-index:1}.p-datatable-scrollable-table>.p-datatable-tfoot{bottom:0;z-index:1}.p-datatable-scrollable .p-frozen-column{position:sticky;background:inherit}.p-datatable-scrollable th.p-frozen-column{z-index:1}.p-datatable-flex-scrollable{display:flex;flex-direction:column;height:100%}.p-datatable-flex-scrollable>.p-datatable-wrapper{display:flex;flex-direction:column;flex:1;height:100%}.p-datatable-scrollable-table>.p-datatable-tbody>.p-rowgroup-header{position:sticky;z-index:1}.p-datatable-resizable-table>.p-datatable-thead>tr>th,.p-datatable-resizable-table>.p-datatable-tfoot>tr>td,.p-datatable-resizable-table>.p-datatable-tbody>tr>td{overflow:hidden;white-space:nowrap}.p-datatable-resizable-table>.p-datatable-thead>tr>th.p-resizable-column:not(.p-frozen-column){background-clip:padding-box;position:relative}.p-datatable-resizable-table-fit>.p-datatable-thead>tr>th.p-resizable-column:last-child .p-column-resizer{display:none}.p-datatable .p-column-resizer{display:block;position:absolute;top:0;right:0;margin:0;width:.5rem;height:100%;padding:0;cursor:col-resize;border:1px solid transparent}.p-datatable .p-column-header-content{display:flex;align-items:center}.p-datatable .p-column-resizer-helper{width:1px;position:absolute;z-index:10;display:none}.p-datatable .p-row-editor-init,.p-datatable .p-row-editor-save,.p-datatable .p-row-editor-cancel,.p-datatable .p-row-toggler{display:inline-flex;align-items:center;justify-content:center;overflow:hidden;position:relative}.p-datatable-reorder-indicator-up,.p-datatable-reorder-indicator-down{position:absolute;display:none}.p-reorderable-column,.p-datatable-reorderablerow-handle{cursor:move}.p-datatable .p-datatable-loading-overlay{position:absolute;display:flex;align-items:center;justify-content:center;z-index:2}.p-column-filter-row{display:flex;align-items:center;width:100%}.p-column-filter-menu{display:inline-flex;margin-left:auto}.p-column-filter-row .p-column-filter-element{flex:1 1 auto;width:1%}.p-column-filter-menu-button,.p-column-filter-clear-button{display:inline-flex;justify-content:center;align-items:center;cursor:pointer;text-decoration:none;overflow:hidden;position:relative}.p-column-filter-row-items{margin:0;padding:0;list-style:none}.p-column-filter-row-item{cursor:pointer}.p-column-filter-add-button,.p-column-filter-remove-button{justify-content:center}.p-column-filter-add-button .p-button-label,.p-column-filter-remove-button .p-button-label{flex-grow:0}.p-column-filter-buttonbar{display:flex;align-items:center;justify-content:space-between}.p-column-filter-buttonbar .p-button:not(.p-button-icon-only){width:auto}.p-datatable .p-datatable-tbody>tr>td>.p-column-title{display:none}.p-datatable-virtualscroller-spacer{display:flex}.p-datatable .p-virtualscroller .p-virtualscroller-loading{transform:none!important;min-height:0;position:sticky;top:0;left:0}.p-datatable .p-paginator-top,.p-datatable .p-paginator-bottom{border-width:0 0 1px 0;border-radius:0}.p-datatable .p-datatable-header{background:#f8f9fa;color:#495057;border:1px solid #e9ecef;border-width:1px 0 1px 0;padding:1rem;font-weight:600}.p-datatable .p-datatable-footer{background:#f8f9fa;color:#495057;border:1px solid #e9ecef;border-width:0 0 1px 0;padding:1rem;font-weight:600}.p-datatable .p-datatable-thead>tr>th{text-align:left;padding:1rem;border:1px solid #e9ecef;border-width:0 0 1px 0;font-weight:600;color:#495057;background:#f8f9fa;transition:box-shadow .2s}.p-datatable .p-datatable-tfoot>tr>td{text-align:left;padding:1rem;border:1px solid #e9ecef;border-width:0 0 1px 0;font-weight:600;color:#495057;background:#f8f9fa}.p-datatable .p-sortable-column .p-sortable-column-icon{color:#6c757d;margin-left:.5rem}.p-datatable .p-sortable-column .p-sortable-column-badge{border-radius:50%;height:1.143rem;min-width:1.143rem;line-height:1.143rem;color:#495057;background:#e3f2fd;margin-left:.5rem}.p-datatable .p-sortable-column:not(.p-highlight):hover{background:#e9ecef;color:#495057}.p-datatable .p-sortable-column:not(.p-highlight):hover .p-sortable-column-icon{color:#6c757d}.p-datatable .p-sortable-column.p-highlight{background:#f8f9fa;color:#2196f3}.p-datatable .p-sortable-column.p-highlight .p-sortable-column-icon{color:#2196f3}.p-datatable .p-sortable-column.p-highlight:hover{background:#e9ecef;color:#2196f3}.p-datatable .p-sortable-column.p-highlight:hover .p-sortable-column-icon{color:#2196f3}.p-datatable .p-sortable-column:focus-visible{box-shadow:inset 0 0 0 .15rem #a6d5fa;outline:0 none}.p-datatable .p-datatable-tbody>tr{background:#fff;color:#495057;transition:box-shadow .2s}.p-datatable .p-datatable-tbody>tr>td{text-align:left;border:1px solid #e9ecef;border-width:0 0 1px 0;padding:1rem}.p-datatable .p-datatable-tbody>tr>td .p-row-toggler,.p-datatable .p-datatable-tbody>tr>td .p-row-editor-init,.p-datatable .p-datatable-tbody>tr>td .p-row-editor-save,.p-datatable .p-datatable-tbody>tr>td .p-row-editor-cancel{width:2rem;height:2rem;color:#6c757d;border:0 none;background:transparent;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-datatable .p-datatable-tbody>tr>td .p-row-toggler:enabled:hover,.p-datatable .p-datatable-tbody>tr>td .p-row-editor-init:enabled:hover,.p-datatable .p-datatable-tbody>tr>td .p-row-editor-save:enabled:hover,.p-datatable .p-datatable-tbody>tr>td .p-row-editor-cancel:enabled:hover{color:#495057;border-color:transparent;background:#e9ecef}.p-datatable .p-datatable-tbody>tr>td .p-row-toggler:focus-visible,.p-datatable .p-datatable-tbody>tr>td .p-row-editor-init:focus-visible,.p-datatable .p-datatable-tbody>tr>td .p-row-editor-save:focus-visible,.p-datatable .p-datatable-tbody>tr>td .p-row-editor-cancel:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-datatable .p-datatable-tbody>tr>td .p-row-editor-save{margin-right:.5rem}.p-datatable .p-datatable-tbody>tr>td>.p-column-title{font-weight:600}.p-datatable .p-datatable-tbody>tr:focus-visible{outline:.15rem solid #a6d5fa;outline-offset:-.15rem}.p-datatable .p-datatable-tbody>tr.p-highlight{background:#e3f2fd;color:#495057}.p-datatable .p-datatable-tbody>tr.p-highlight-contextmenu{outline:.15rem solid #a6d5fa;outline-offset:-.15rem}.p-datatable .p-datatable-tbody>tr.p-datatable-dragpoint-top>td{box-shadow:inset 0 2px #e3f2fd}.p-datatable .p-datatable-tbody>tr.p-datatable-dragpoint-bottom>td{box-shadow:inset 0 -2px #e3f2fd}.p-datatable.p-datatable-hoverable-rows .p-datatable-tbody>tr:not(.p-highlight):hover{background:#e9ecef;color:#495057}.p-datatable .p-column-resizer-helper{background:#2196f3}.p-datatable.p-datatable-scrollable>.p-datatable-wrapper>.p-datatable-table>.p-datatable-thead,.p-datatable.p-datatable-scrollable>.p-datatable-wrapper>.p-datatable-table>.p-datatable-tfoot,.p-datatable.p-datatable-scrollable>.p-datatable-wrapper>.p-virtualscroller>.p-datatable-table>.p-datatable-thead,.p-datatable.p-datatable-scrollable>.p-datatable-wrapper>.p-virtualscroller>.p-datatable-table>.p-datatable-tfoot{background-color:#f8f9fa}.p-datatable .p-datatable-loading-icon{font-size:2rem}.p-datatable .p-datatable-loading-icon.p-icon{width:2rem;height:2rem}.p-datatable.p-datatable-gridlines .p-datatable-header{border-width:1px 1px 0 1px}.p-datatable.p-datatable-gridlines .p-datatable-footer{border-width:0 1px 1px 1px}.p-datatable.p-datatable-gridlines .p-paginator-top{border-width:0 1px 0 1px}.p-datatable.p-datatable-gridlines .p-paginator-bottom{border-width:0 1px 1px 1px}.p-datatable.p-datatable-gridlines .p-datatable-thead>tr>th{border-width:1px 0 1px 1px}.p-datatable.p-datatable-gridlines .p-datatable-thead>tr>th:last-child{border-width:1px}.p-datatable.p-datatable-gridlines .p-datatable-tbody>tr>td{border-width:1px 0 0 1px}.p-datatable.p-datatable-gridlines .p-datatable-tbody>tr>td:last-child{border-width:1px 1px 0 1px}.p-datatable.p-datatable-gridlines .p-datatable-tbody>tr:last-child>td{border-width:1px 0 1px 1px}.p-datatable.p-datatable-gridlines .p-datatable-tbody>tr:last-child>td:last-child{border-width:1px}.p-datatable.p-datatable-gridlines .p-datatable-tfoot>tr>td{border-width:1px 0 1px 1px}.p-datatable.p-datatable-gridlines .p-datatable-tfoot>tr>td:last-child{border-width:1px 1px 1px 1px}.p-datatable.p-datatable-gridlines .p-datatable-thead+.p-datatable-tfoot>tr>td{border-width:0 0 1px 1px}.p-datatable.p-datatable-gridlines .p-datatable-thead+.p-datatable-tfoot>tr>td:last-child{border-width:0 1px 1px 1px}.p-datatable.p-datatable-gridlines:has(.p-datatable-thead):has(.p-datatable-tbody) .p-datatable-tbody>tr>td{border-width:0 0 1px 1px}.p-datatable.p-datatable-gridlines:has(.p-datatable-thead):has(.p-datatable-tbody) .p-datatable-tbody>tr>td:last-child{border-width:0 1px 1px 1px}.p-datatable.p-datatable-gridlines:has(.p-datatable-tbody):has(.p-datatable-tfoot) .p-datatable-tbody>tr:last-child>td{border-width:0 0 0 1px}.p-datatable.p-datatable-gridlines:has(.p-datatable-tbody):has(.p-datatable-tfoot) .p-datatable-tbody>tr:last-child>td:last-child{border-width:0 1px 0 1px}.p-datatable.p-datatable-striped .p-datatable-tbody>tr.p-row-odd{background:#fcfcfc}.p-datatable.p-datatable-striped .p-datatable-tbody>tr.p-row-odd.p-highlight{background:#e3f2fd;color:#495057}.p-datatable.p-datatable-striped .p-datatable-tbody>tr.p-row-odd.p-highlight .p-row-toggler{color:#495057}.p-datatable.p-datatable-striped .p-datatable-tbody>tr.p-row-odd.p-highlight .p-row-toggler:hover{color:#495057}.p-datatable.p-datatable-sm .p-datatable-header{padding:.5rem}.p-datatable.p-datatable-sm .p-datatable-thead>tr>th{padding:.5rem}.p-datatable.p-datatable-sm .p-datatable-tbody>tr>td{padding:.5rem}.p-datatable.p-datatable-sm .p-datatable-tfoot>tr>td{padding:.5rem}.p-datatable.p-datatable-sm .p-datatable-footer{padding:.5rem}.p-datatable.p-datatable-lg .p-datatable-header{padding:1.25rem}.p-datatable.p-datatable-lg .p-datatable-thead>tr>th{padding:1.25rem}.p-datatable.p-datatable-lg .p-datatable-tbody>tr>td{padding:1.25rem}.p-datatable.p-datatable-lg .p-datatable-tfoot>tr>td{padding:1.25rem}.p-datatable.p-datatable-lg .p-datatable-footer{padding:1.25rem}.p-dataview .p-paginator-top,.p-dataview .p-paginator-bottom{border-width:0 0 1px 0;border-radius:0}.p-dataview .p-dataview-header{background:#f8f9fa;color:#495057;border:1px solid #e9ecef;border-width:1px 0 1px 0;padding:1rem;font-weight:600}.p-dataview .p-dataview-content{background:#fff;color:#495057;border:0 none;padding:0}.p-dataview .p-dataview-footer{background:#f8f9fa;color:#495057;border:1px solid #e9ecef;border-width:0 0 1px 0;padding:1rem;font-weight:600;border-bottom-left-radius:3px;border-bottom-right-radius:3px}.p-column-filter-row .p-column-filter-menu-button,.p-column-filter-row .p-column-filter-clear-button{margin-left:.5rem}.p-column-filter-menu-button{width:2rem;height:2rem;color:#6c757d;border:0 none;background:transparent;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-column-filter-menu-button:hover{color:#495057;border-color:transparent;background:#e9ecef}.p-column-filter-menu-button.p-column-filter-menu-button-open,.p-column-filter-menu-button.p-column-filter-menu-button-open:hover{background:#e9ecef;color:#495057}.p-column-filter-menu-button.p-column-filter-menu-button-active,.p-column-filter-menu-button.p-column-filter-menu-button-active:hover{background:#e3f2fd;color:#495057}.p-column-filter-menu-button:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-column-filter-clear-button{width:2rem;height:2rem;color:#6c757d;border:0 none;background:transparent;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-column-filter-clear-button:hover{color:#495057;border-color:transparent;background:#e9ecef}.p-column-filter-clear-button:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-column-filter-overlay{background:#fff;color:#495057;border:0 none;border-radius:3px;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;min-width:12.5rem}.p-column-filter-overlay .p-column-filter-row-items{padding:.5rem 0}.p-column-filter-overlay .p-column-filter-row-items .p-column-filter-row-item{margin:0;padding:.5rem 1rem;border:0 none;color:#495057;background:transparent;transition:box-shadow .2s;border-radius:0}.p-column-filter-overlay .p-column-filter-row-items .p-column-filter-row-item:first-child{margin-top:0}.p-column-filter-overlay .p-column-filter-row-items .p-column-filter-row-item:last-child{margin-bottom:0}.p-column-filter-overlay .p-column-filter-row-items .p-column-filter-row-item.p-highlight{color:#495057;background:#e3f2fd}.p-column-filter-overlay .p-column-filter-row-items .p-column-filter-row-item:not(.p-highlight):not(.p-disabled):hover{color:#495057;background:#e9ecef}.p-column-filter-overlay .p-column-filter-row-items .p-column-filter-row-item:focus-visible{outline:0 none;outline-offset:0;box-shadow:inset 0 0 0 .15rem #a6d5fa}.p-column-filter-overlay .p-column-filter-row-items .p-column-filter-separator{border-top:1px solid #dee2e6;margin:.25rem 0}.p-column-filter-overlay-menu .p-column-filter-operator{padding:.5rem 1rem;border-bottom:0 none;color:#495057;background:#f8f9fa;margin:0;border-top-right-radius:3px;border-top-left-radius:3px}.p-column-filter-overlay-menu .p-column-filter-constraint{padding:1rem;border-bottom:1px solid #dee2e6}.p-column-filter-overlay-menu .p-column-filter-constraint .p-column-filter-matchmode-dropdown{margin-bottom:.5rem}.p-column-filter-overlay-menu .p-column-filter-constraint .p-column-filter-remove-button{margin-top:.5rem}.p-column-filter-overlay-menu .p-column-filter-constraint:last-child{border-bottom:0 none}.p-column-filter-overlay-menu .p-column-filter-add-rule{padding:.5rem 1rem}.p-column-filter-overlay-menu .p-column-filter-buttonbar{padding:1rem}.p-orderlist{display:flex}.p-orderlist-controls{display:flex;flex-direction:column;justify-content:center}.p-orderlist-list-container{flex:1 1 auto}.p-orderlist-list{list-style-type:none;margin:0;padding:0;overflow:auto;min-height:12rem;max-height:24rem}.p-orderlist-item{cursor:pointer;overflow:hidden;position:relative}.p-orderlist.p-state-disabled .p-orderlist-item,.p-orderlist.p-state-disabled .p-button{cursor:default}.p-orderlist.p-state-disabled .p-orderlist-list{overflow:hidden}.p-orderlist .p-orderlist-controls{padding:1rem}.p-orderlist .p-orderlist-controls .p-button{margin-bottom:.5rem}.p-orderlist .p-orderlist-list-container{background:#fff;border:1px solid #dee2e6;border-radius:3px;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;outline-color:transparent}.p-orderlist .p-orderlist-list-container.p-focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-orderlist .p-orderlist-header{color:#495057;padding:1rem;font-weight:600}.p-orderlist .p-orderlist-list{color:#495057;padding:.5rem 0;outline:0 none}.p-orderlist .p-orderlist-list:not(:first-child){border-top:1px solid #dee2e6}.p-orderlist .p-orderlist-list .p-orderlist-item{padding:.5rem 1rem;margin:0;border:0 none;color:#495057;background:transparent;transition:transform .2s,box-shadow .2s}.p-orderlist .p-orderlist-list .p-orderlist-item:first-child{margin-top:0}.p-orderlist .p-orderlist-list .p-orderlist-item:last-child{margin-bottom:0}.p-orderlist .p-orderlist-list .p-orderlist-item:not(.p-highlight):hover{background:#e9ecef;color:#495057}.p-orderlist .p-orderlist-list .p-orderlist-item:not(.p-highlight):hover.p-focus{color:#495057;background:#e9ecef}.p-orderlist .p-orderlist-list .p-orderlist-item.p-focus{color:#495057;background:#e9ecef}.p-orderlist .p-orderlist-list .p-orderlist-item.p-highlight{color:#495057;background:#e3f2fd}.p-orderlist .p-orderlist-list .p-orderlist-item.p-highlight.p-focus{background:#2196f33d}.p-orderlist.p-orderlist-striped .p-orderlist-list .p-orderlist-item:nth-child(2n){background:#e9ecef}.p-orderlist.p-orderlist-striped .p-orderlist-list .p-orderlist-item:nth-child(2n):hover{background:#e9ecef}.p-organizationchart-table{border-spacing:0;border-collapse:separate;margin:0 auto}.p-organizationchart-table>tbody>tr>td{text-align:center;vertical-align:top;padding:0 .75rem}.p-organizationchart-node-content{display:inline-block;position:relative}.p-organizationchart-node-content .p-node-toggler{position:absolute;bottom:-.75rem;margin-left:-.75rem;z-index:2;left:50%;-webkit-user-select:none;user-select:none;cursor:pointer;width:1.5rem;height:1.5rem;text-decoration:none}.p-organizationchart-node-content .p-node-toggler .p-node-toggler-icon{position:relative;top:.25rem}.p-organizationchart-line-down{margin:0 auto;height:20px;width:1px}.p-organizationchart-line-right,.p-organizationchart-line-left{border-radius:0}.p-organizationchart-selectable-node{cursor:pointer}.p-organizationchart .p-organizationchart-node-content.p-organizationchart-selectable-node:not(.p-highlight):hover{background:#e9ecef;color:#495057}.p-organizationchart .p-organizationchart-node-content.p-highlight{background:#e3f2fd;color:#495057}.p-organizationchart .p-organizationchart-node-content.p-highlight .p-node-toggler i{color:#6cbbf5}.p-organizationchart .p-organizationchart-line-down{background:#dee2e6}.p-organizationchart .p-organizationchart-line-left{border-right:1px solid #dee2e6;border-color:#dee2e6}.p-organizationchart .p-organizationchart-line-top{border-top:1px solid #dee2e6;border-color:#dee2e6}.p-organizationchart .p-organizationchart-node-content{border:1px solid #dee2e6;background:#fff;color:#495057;padding:1rem}.p-organizationchart .p-organizationchart-node-content .p-node-toggler{background:inherit;color:inherit;border-radius:50%;outline-color:transparent}.p-organizationchart .p-organizationchart-node-content .p-node-toggler:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-paginator-default{display:flex}.p-paginator{display:flex;align-items:center;justify-content:center;flex-wrap:wrap}.p-paginator-left-content{margin-right:auto}.p-paginator-right-content{margin-left:auto}.p-paginator-page,.p-paginator-next,.p-paginator-last,.p-paginator-first,.p-paginator-prev,.p-paginator-current{cursor:pointer;display:inline-flex;align-items:center;justify-content:center;line-height:1;-webkit-user-select:none;user-select:none;overflow:hidden;position:relative}.p-paginator-element:focus{z-index:1;position:relative}.p-paginator{background:#fff;color:#6c757d;border:solid #e9ecef;border-width:0;padding:.5rem 1rem;border-radius:3px}.p-paginator .p-paginator-first,.p-paginator .p-paginator-prev,.p-paginator .p-paginator-next,.p-paginator .p-paginator-last{background-color:transparent;border:0 none;color:#6c757d;min-width:2.357rem;height:2.357rem;margin:.143rem;transition:box-shadow .2s;border-radius:3px}.p-paginator .p-paginator-first:not(.p-disabled):not(.p-highlight):hover,.p-paginator .p-paginator-prev:not(.p-disabled):not(.p-highlight):hover,.p-paginator .p-paginator-next:not(.p-disabled):not(.p-highlight):hover,.p-paginator .p-paginator-last:not(.p-disabled):not(.p-highlight):hover{background:#e9ecef;border-color:transparent;color:#495057}.p-paginator .p-paginator-first{border-top-left-radius:3px;border-bottom-left-radius:3px}.p-paginator .p-paginator-last{border-top-right-radius:3px;border-bottom-right-radius:3px}.p-paginator .p-dropdown{margin-left:.5rem;margin-right:.5rem;height:2.357rem}.p-paginator .p-dropdown .p-dropdown-label{padding-right:0}.p-paginator .p-paginator-page-input{margin-left:.5rem;margin-right:.5rem}.p-paginator .p-paginator-page-input .p-inputtext{max-width:2.357rem}.p-paginator .p-paginator-current{background-color:transparent;border:0 none;color:#6c757d;min-width:2.357rem;height:2.357rem;margin:.143rem;padding:0 .5rem}.p-paginator .p-paginator-pages .p-paginator-page{background-color:transparent;border:0 none;color:#6c757d;min-width:2.357rem;height:2.357rem;margin:.143rem;transition:box-shadow .2s;border-radius:3px}.p-paginator .p-paginator-pages .p-paginator-page.p-highlight{background:#e3f2fd;border-color:#e3f2fd;color:#495057}.p-paginator .p-paginator-pages .p-paginator-page:not(.p-highlight):hover{background:#e9ecef;border-color:transparent;color:#495057}.p-picklist{display:flex}.p-picklist-buttons{display:flex;flex-direction:column;justify-content:center}.p-picklist-list-wrapper{flex:1 1 50%}.p-picklist-list{list-style-type:none;margin:0;padding:0;overflow:auto;min-height:12rem;max-height:24rem}.p-picklist-item{cursor:pointer;overflow:hidden;position:relative}.p-picklist-item.p-picklist-flip-enter-active.p-picklist-flip-enter-to,.p-picklist-item.p-picklist-flip-leave-active.p-picklist-flip-leave-to{transition:none}.p-picklist .p-picklist-buttons{padding:1rem}.p-picklist .p-picklist-buttons .p-button{margin-bottom:.5rem}.p-picklist .p-picklist-list-wrapper{background:#fff;border:1px solid #dee2e6;border-radius:3px;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;outline-color:transparent}.p-picklist .p-picklist-list-wrapper.p-focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa;border-color:#2196f3}.p-picklist .p-picklist-header{color:#495057;padding:1rem;font-weight:600}.p-picklist .p-picklist-list{color:#495057;padding:.5rem 0;outline:0 none}.p-picklist .p-picklist-list:not(:first-child){border-top:1px solid #dee2e6}.p-picklist .p-picklist-list .p-picklist-item{padding:.5rem 1rem;margin:0;border:0 none;color:#495057;background:transparent;transition:transform .2s,box-shadow .2s}.p-picklist .p-picklist-list .p-picklist-item:first-child{margin-top:0}.p-picklist .p-picklist-list .p-picklist-item:last-child{margin-bottom:0}.p-picklist .p-picklist-list .p-picklist-item:not(.p-highlight):hover{background:#e9ecef;color:#495057}.p-picklist .p-picklist-list .p-picklist-item:not(.p-highlight):hover.p-focus{color:#495057;background:#e9ecef}.p-picklist .p-picklist-list .p-picklist-item.p-focus{color:#495057;background:#e9ecef}.p-picklist .p-picklist-list .p-picklist-item.p-highlight{color:#495057;background:#e3f2fd}.p-picklist .p-picklist-list .p-picklist-item.p-highlight.p-focus{background:#2196f33d}.p-picklist.p-picklist-striped .p-picklist-list .p-picklist-item:nth-child(2n){background:#e9ecef}.p-picklist.p-picklist-striped .p-picklist-list .p-picklist-item:nth-child(2n):hover{background:#e9ecef}.p-timeline{display:flex;flex-grow:1;flex-direction:column}.p-timeline-left .p-timeline-event-opposite{text-align:right}.p-timeline-left .p-timeline-event-content{text-align:left}.p-timeline-right .p-timeline-event{flex-direction:row-reverse}.p-timeline-right .p-timeline-event-opposite{text-align:left}.p-timeline-right .p-timeline-event-content{text-align:right}.p-timeline-vertical.p-timeline-alternate .p-timeline-event:nth-child(2n){flex-direction:row-reverse}.p-timeline-vertical.p-timeline-alternate .p-timeline-event:nth-child(odd) .p-timeline-event-opposite{text-align:right}.p-timeline-vertical.p-timeline-alternate .p-timeline-event:nth-child(odd) .p-timeline-event-content{text-align:left}.p-timeline-vertical.p-timeline-alternate .p-timeline-event:nth-child(2n) .p-timeline-event-opposite{text-align:left}.p-timeline-vertical.p-timeline-alternate .p-timeline-event:nth-child(2n) .p-timeline-event-content{text-align:right}.p-timeline-event{display:flex;position:relative;min-height:70px}.p-timeline-event:last-child{min-height:0}.p-timeline-event-opposite,.p-timeline-event-content{flex:1;padding:0 1rem}.p-timeline-event-separator{flex:0;display:flex;align-items:center;flex-direction:column}.p-timeline-event-marker{display:flex;align-self:baseline}.p-timeline-event-connector{flex-grow:1}.p-timeline-horizontal{flex-direction:row}.p-timeline-horizontal .p-timeline-event{flex-direction:column;flex:1}.p-timeline-horizontal .p-timeline-event:last-child{flex:0}.p-timeline-horizontal .p-timeline-event-separator{flex-direction:row}.p-timeline-horizontal .p-timeline-event-connector{width:100%}.p-timeline-bottom .p-timeline-event{flex-direction:column-reverse}.p-timeline-horizontal.p-timeline-alternate .p-timeline-event:nth-child(2n){flex-direction:column-reverse}.p-timeline .p-timeline-event-marker{border:2px solid #2196F3;border-radius:50%;width:1rem;height:1rem;background-color:#fff}.p-timeline .p-timeline-event-connector{background-color:#dee2e6}.p-timeline.p-timeline-vertical .p-timeline-event-opposite,.p-timeline.p-timeline-vertical .p-timeline-event-content{padding:0 1rem}.p-timeline.p-timeline-vertical .p-timeline-event-connector{width:2px}.p-timeline.p-timeline-horizontal .p-timeline-event-opposite,.p-timeline.p-timeline-horizontal .p-timeline-event-content{padding:1rem 0}.p-timeline.p-timeline-horizontal .p-timeline-event-connector{height:2px}.p-tree-container{margin:0;padding:0;list-style-type:none;overflow:auto}.p-treenode-children{margin:0;padding:0;list-style-type:none}.p-tree-wrapper{overflow:auto}.p-treenode-selectable{cursor:pointer;-webkit-user-select:none;user-select:none}.p-tree-toggler{cursor:pointer;-webkit-user-select:none;user-select:none;display:inline-flex;align-items:center;justify-content:center;overflow:hidden;position:relative;flex-shrink:0}.p-treenode-leaf>.p-treenode-content .p-tree-toggler{visibility:hidden}.p-treenode-content{display:flex;align-items:center}.p-tree-filter{width:100%}.p-tree-filter-container{position:relative;display:block;width:100%}.p-tree-filter-icon{position:absolute;top:50%;margin-top:-.5rem}.p-tree-loading{position:relative;min-height:4rem}.p-tree .p-tree-loading-overlay{position:absolute;z-index:1;display:flex;align-items:center;justify-content:center}.p-tree-flex-scrollable{display:flex;flex:1;height:100%;flex-direction:column}.p-tree-flex-scrollable .p-tree-wrapper{flex:1}.p-tree{border:1px solid #dee2e6;background:#fff;color:#495057;padding:1rem;border-radius:3px}.p-tree .p-tree-container .p-treenode{padding:.143rem;outline:0 none}.p-tree .p-tree-container .p-treenode:focus>.p-treenode-content{outline:0 none;outline-offset:0;box-shadow:inset 0 0 0 .15rem #a6d5fa}.p-tree .p-tree-container .p-treenode .p-treenode-content{border-radius:3px;transition:box-shadow .2s;padding:0}.p-tree .p-tree-container .p-treenode .p-treenode-content .p-tree-toggler{margin-right:.5rem;width:2rem;height:2rem;color:#6c757d;border:0 none;background:transparent;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-tree .p-tree-container .p-treenode .p-treenode-content .p-tree-toggler:enabled:hover{color:#495057;border-color:transparent;background:#e9ecef}.p-tree .p-tree-container .p-treenode .p-treenode-content .p-tree-toggler:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-tree .p-tree-container .p-treenode .p-treenode-content .p-treenode-icon{margin-right:.5rem;color:#6c757d}.p-tree .p-tree-container .p-treenode .p-treenode-content .p-checkbox{margin-right:.5rem}.p-tree .p-tree-container .p-treenode .p-treenode-content .p-checkbox.p-indeterminate .p-checkbox-icon{color:#495057}.p-tree .p-tree-container .p-treenode .p-treenode-content.p-highlight{background:#e3f2fd;color:#495057}.p-tree .p-tree-container .p-treenode .p-treenode-content.p-highlight .p-tree-toggler,.p-tree .p-tree-container .p-treenode .p-treenode-content.p-highlight .p-treenode-icon,.p-tree .p-tree-container .p-treenode .p-treenode-content.p-highlight .p-tree-toggler:hover,.p-tree .p-tree-container .p-treenode .p-treenode-content.p-highlight .p-treenode-icon:hover{color:#495057}.p-tree .p-tree-container .p-treenode .p-treenode-content.p-treenode-selectable:not(.p-highlight):hover{background:#e9ecef;color:#495057}.p-tree .p-tree-filter-container{margin-bottom:.5rem}.p-tree .p-tree-filter-container .p-tree-filter{width:100%;padding-right:1.5rem}.p-tree .p-tree-filter-container .p-tree-filter-icon{right:.5rem;color:#6c757d}.p-tree .p-treenode-children{padding:0 0 0 1rem}.p-tree .p-tree-loading-icon{font-size:2rem}.p-tree .p-tree-loading-icon.p-icon{width:2rem;height:2rem}.p-treetable{position:relative}.p-treetable table{border-collapse:collapse;width:100%;table-layout:fixed}.p-treetable .p-sortable-column{cursor:pointer;-webkit-user-select:none;user-select:none}.p-treetable-responsive-scroll>.p-treetable-wrapper{overflow-x:auto}.p-treetable-responsive-scroll>.p-treetable-wrapper>table,.p-treetable-auto-layout>.p-treetable-wrapper>table{table-layout:auto}.p-treetable-hoverable-rows .p-treetable-tbody>tr{cursor:pointer}.p-treetable-toggler{cursor:pointer;-webkit-user-select:none;user-select:none;display:inline-flex;align-items:center;justify-content:center;vertical-align:middle;overflow:hidden;position:relative}.p-treetable-toggler+.p-checkbox{vertical-align:middle}.p-treetable-toggler+.p-checkbox+span{vertical-align:middle}.p-treetable-resizable>.p-treetable-wrapper{overflow-x:auto}.p-treetable-resizable .p-treetable-thead>tr>th,.p-treetable-resizable .p-treetable-tfoot>tr>td,.p-treetable-resizable .p-treetable-tbody>tr>td{overflow:hidden}.p-treetable-resizable .p-resizable-column:not(.p-frozen-column){background-clip:padding-box;position:relative}.p-treetable-resizable-fit .p-resizable-column:last-child .p-column-resizer{display:none}.p-treetable .p-column-resizer{display:block;position:absolute;top:0;right:0;margin:0;width:.5rem;height:100%;padding:0;cursor:col-resize;border:1px solid transparent}.p-treetable .p-column-resizer-helper{width:1px;position:absolute;z-index:10;display:none}.p-treetable .p-treetable-loading-overlay{position:absolute;display:flex;align-items:center;justify-content:center;z-index:2}.p-treetable-scrollable .p-treetable-wrapper{position:relative;overflow:auto}.p-treetable-scrollable .p-treetable-table,.p-treetable-scrollable .p-treetable-thead,.p-treetable-scrollable .p-treetable-tbody,.p-treetable-scrollable .p-treetable-tfoot{display:block}.p-treetable-scrollable .p-treetable-thead>tr,.p-treetable-scrollable .p-treetable-tbody>tr,.p-treetable-scrollable .p-treetable-tfoot>tr{display:flex;flex-wrap:nowrap;width:100%}.p-treetable-scrollable .p-treetable-thead>tr>th,.p-treetable-scrollable .p-treetable-tbody>tr>td,.p-treetable-scrollable .p-treetable-tfoot>tr>td{display:flex;flex:1 1 0;align-items:center}.p-treetable-scrollable .p-treetable-thead{position:sticky;top:0;z-index:1}.p-treetable-scrollable .p-treetable-tfoot{position:sticky;bottom:0;z-index:1}.p-treetable-scrollable .p-frozen-column{position:sticky;background:inherit}.p-treetable-scrollable th.p-frozen-column{z-index:1}.p-treetable-scrollable-both .p-treetable-thead>tr>th,.p-treetable-scrollable-both .p-treetable-tbody>tr>td,.p-treetable-scrollable-both .p-treetable-tfoot>tr>td,.p-treetable-scrollable-horizontal .p-treetable-thead>tr>th .p-treetable-scrollable-horizontal .p-treetable-tbody>tr>td,.p-treetable-scrollable-horizontal .p-treetable-tfoot>tr>td{flex:0 0 auto}.p-treetable-flex-scrollable{display:flex;flex-direction:column;height:100%}.p-treetable-flex-scrollable .p-treetable-wrapper{display:flex;flex-direction:column;flex:1;height:100%}.p-treetable .p-paginator-top,.p-treetable .p-paginator-bottom{border-width:0 0 1px 0;border-radius:0}.p-treetable .p-treetable-header{background:#f8f9fa;color:#495057;border:1px solid #e9ecef;border-width:1px 0 1px 0;padding:1rem;font-weight:600}.p-treetable .p-treetable-footer{background:#f8f9fa;color:#495057;border:1px solid #e9ecef;border-width:0 0 1px 0;padding:1rem;font-weight:600}.p-treetable .p-treetable-thead>tr>th{text-align:left;padding:1rem;border:1px solid #e9ecef;border-width:0 0 1px 0;font-weight:600;color:#495057;background:#f8f9fa;transition:box-shadow .2s}.p-treetable .p-treetable-tfoot>tr>td{text-align:left;padding:1rem;border:1px solid #e9ecef;border-width:0 0 1px 0;font-weight:600;color:#495057;background:#f8f9fa}.p-treetable .p-sortable-column{outline-color:#a6d5fa}.p-treetable .p-sortable-column .p-sortable-column-icon{color:#6c757d;margin-left:.5rem}.p-treetable .p-sortable-column .p-sortable-column-badge{border-radius:50%;height:1.143rem;min-width:1.143rem;line-height:1.143rem;color:#495057;background:#e3f2fd;margin-left:.5rem}.p-treetable .p-sortable-column:not(.p-highlight):hover{background:#e9ecef;color:#495057}.p-treetable .p-sortable-column:not(.p-highlight):hover .p-sortable-column-icon{color:#6c757d}.p-treetable .p-sortable-column.p-highlight{background:#f8f9fa;color:#2196f3}.p-treetable .p-sortable-column.p-highlight .p-sortable-column-icon{color:#2196f3}.p-treetable .p-treetable-tbody>tr{background:#fff;color:#495057;transition:box-shadow .2s}.p-treetable .p-treetable-tbody>tr>td{text-align:left;border:1px solid #e9ecef;border-width:0 0 1px 0;padding:1rem}.p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler{width:2rem;height:2rem;color:#6c757d;border:0 none;background:transparent;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent;margin-right:.5rem}.p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler:enabled:hover{color:#495057;border-color:transparent;background:#e9ecef}.p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler+.p-checkbox{margin-right:.5rem}.p-treetable .p-treetable-tbody>tr>td .p-treetable-toggler+.p-checkbox.p-indeterminate .p-checkbox-icon{color:#495057}.p-treetable .p-treetable-tbody>tr:focus-visible{outline:.15rem solid #a6d5fa;outline-offset:-.15rem}.p-treetable .p-treetable-tbody>tr.p-highlight{background:#e3f2fd;color:#495057}.p-treetable .p-treetable-tbody>tr.p-highlight .p-treetable-toggler{color:#495057}.p-treetable .p-treetable-tbody>tr.p-highlight .p-treetable-toggler:hover{color:#495057}.p-treetable.p-treetable-hoverable-rows .p-treetable-tbody>tr:not(.p-highlight):hover{background:#e9ecef;color:#495057}.p-treetable.p-treetable-hoverable-rows .p-treetable-tbody>tr:not(.p-highlight):hover .p-treetable-toggler{color:#495057}.p-treetable .p-column-resizer-helper{background:#2196f3}.p-treetable .p-treetable-scrollable-header,.p-treetable .p-treetable-scrollable-footer{background:#f8f9fa}.p-treetable .p-treetable-loading-icon{font-size:2rem}.p-treetable .p-treetable-loading-icon.p-icon{width:2rem;height:2rem}.p-treetable.p-treetable-gridlines .p-datatable-header{border-width:1px 1px 0 1px}.p-treetable.p-treetable-gridlines .p-treetable-footer{border-width:0 1px 1px 1px}.p-treetable.p-treetable-gridlines .p-treetable-top{border-width:0 1px 0 1px}.p-treetable.p-treetable-gridlines .p-treetable-bottom{border-width:0 1px 1px 1px}.p-treetable.p-treetable-gridlines .p-treetable-thead>tr>th{border-width:1px}.p-treetable.p-treetable-gridlines .p-treetable-tbody>tr>td{border-width:1px}.p-treetable.p-treetable-gridlines .p-treetable-tfoot>tr>td{border-width:1px}.p-treetable.p-treetable-sm .p-treetable-header{padding:.875rem}.p-treetable.p-treetable-sm .p-treetable-thead>tr>th{padding:.5rem}.p-treetable.p-treetable-sm .p-treetable-tbody>tr>td{padding:.5rem}.p-treetable.p-treetable-sm .p-treetable-tfoot>tr>td{padding:.5rem}.p-treetable.p-treetable-sm .p-treetable-footer{padding:.5rem}.p-treetable.p-treetable-lg .p-treetable-header{padding:1.25rem}.p-treetable.p-treetable-lg .p-treetable-thead>tr>th{padding:1.25rem}.p-treetable.p-treetable-lg .p-treetable-tbody>tr>td{padding:1.25rem}.p-treetable.p-treetable-lg .p-treetable-tfoot>tr>td{padding:1.25rem}.p-treetable.p-treetable-lg .p-treetable-footer{padding:1.25rem}.p-accordion-header-action{cursor:pointer;display:flex;align-items:center;-webkit-user-select:none;user-select:none;position:relative;text-decoration:none}.p-accordion-header-action:focus{z-index:1}.p-accordion-header-text{line-height:1}.p-accordion .p-accordion-header .p-accordion-header-link{padding:1rem;border:1px solid #dee2e6;color:#495057;background:#f8f9fa;font-weight:600;border-radius:3px;transition:box-shadow .2s;outline-color:transparent}.p-accordion .p-accordion-header .p-accordion-header-link .p-accordion-toggle-icon{margin-right:.5rem}.p-accordion .p-accordion-header:not(.p-disabled) .p-accordion-header-link:focus-visible{outline:0 none;outline-offset:0;box-shadow:inset 0 0 0 .2rem #a6d5fa}.p-accordion .p-accordion-header:not(.p-highlight):not(.p-disabled):hover .p-accordion-header-link{background:#e9ecef;border-color:#dee2e6;color:#495057}.p-accordion .p-accordion-header:not(.p-disabled).p-highlight .p-accordion-header-link{background:#f8f9fa;border-color:#dee2e6;color:#495057;border-bottom-right-radius:0;border-bottom-left-radius:0}.p-accordion .p-accordion-header:not(.p-disabled).p-highlight:hover .p-accordion-header-link{border-color:#dee2e6;background:#e9ecef;color:#495057}.p-accordion .p-accordion-content{padding:1rem;border:1px solid #dee2e6;background:#fff;color:#495057;border-top:0;border-radius:0 0 3px 3px}.p-accordion .p-accordion-tab{margin-bottom:0}.p-accordion .p-accordion-tab .p-accordion-header .p-accordion-header-link{border-radius:0}.p-accordion .p-accordion-tab .p-accordion-content{border-bottom-right-radius:0;border-bottom-left-radius:0}.p-accordion .p-accordion-tab:not(:first-child) .p-accordion-header .p-accordion-header-link{border-top:0 none}.p-accordion .p-accordion-tab:not(:first-child) .p-accordion-header:not(.p-highlight):not(.p-disabled):hover .p-accordion-header-link,.p-accordion .p-accordion-tab:not(:first-child) .p-accordion-header:not(.p-disabled).p-highlight:hover .p-accordion-header-link{border-top:0 none}.p-accordion .p-accordion-tab:first-child .p-accordion-header .p-accordion-header-link{border-top-right-radius:3px;border-top-left-radius:3px}.p-accordion .p-accordion-tab:last-child .p-accordion-header:not(.p-highlight) .p-accordion-header-link{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.p-accordion .p-accordion-tab:last-child .p-accordion-content{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.p-card{background:#fff;color:#495057;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f;border-radius:3px}.p-card .p-card-body{padding:1rem}.p-card .p-card-title{font-size:1.5rem;font-weight:700;margin-bottom:.5rem}.p-card .p-card-subtitle{font-weight:400;margin-bottom:.5rem;color:#6c757d}.p-card .p-card-content{padding:1rem 0}.p-card .p-card-footer{padding:1rem 0 0}.p-fieldset-legend>a,.p-fieldset-legend>span{display:flex;align-items:center;justify-content:center}.p-fieldset-toggleable .p-fieldset-legend a{cursor:pointer;-webkit-user-select:none;user-select:none;overflow:hidden;position:relative;text-decoration:none}.p-fieldset-legend-text{line-height:1}.p-fieldset{border:1px solid #dee2e6;background:#fff;color:#495057;border-radius:3px}.p-fieldset .p-fieldset-legend{padding:1rem;border:1px solid #dee2e6;color:#495057;background:#f8f9fa;font-weight:600;border-radius:3px}.p-fieldset.p-fieldset-toggleable .p-fieldset-legend{padding:0;transition:background-color .2s,color .2s,box-shadow .2s}.p-fieldset.p-fieldset-toggleable .p-fieldset-legend a{padding:1rem;color:#495057;border-radius:3px;transition:box-shadow .2s;outline-color:transparent}.p-fieldset.p-fieldset-toggleable .p-fieldset-legend a .p-fieldset-toggler{margin-right:.5rem}.p-fieldset.p-fieldset-toggleable .p-fieldset-legend a:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-fieldset.p-fieldset-toggleable .p-fieldset-legend a:hover{color:#495057}.p-fieldset.p-fieldset-toggleable .p-fieldset-legend:hover{background:#e9ecef;border-color:#dee2e6;color:#495057}.p-fieldset .p-fieldset-content{padding:1rem}.p-divider-horizontal{display:flex;width:100%;position:relative;align-items:center}.p-divider-horizontal:before{position:absolute;display:block;top:50%;left:0;width:100%;content:""}.p-divider-content{z-index:1}.p-divider-vertical{min-height:100%;margin:0 1rem;display:flex;position:relative;justify-content:center}.p-divider-vertical:before{position:absolute;display:block;top:0;left:50%;height:100%;content:""}.p-divider.p-divider-solid.p-divider-horizontal:before{border-top-style:solid}.p-divider.p-divider-solid.p-divider-vertical:before{border-left-style:solid}.p-divider.p-divider-dashed.p-divider-horizontal:before{border-top-style:dashed}.p-divider.p-divider-dashed.p-divider-vertical:before{border-left-style:dashed}.p-divider.p-divider-dotted.p-divider-horizontal:before{border-top-style:dotted}.p-divider.p-divider-dotted.p-divider-vertical:before{border-left-style:dotted}.p-divider .p-divider-content{background-color:#fff}.p-divider.p-divider-horizontal{margin:1rem 0;padding:0 1rem}.p-divider.p-divider-horizontal:before{border-top:1px solid #dee2e6}.p-divider.p-divider-horizontal .p-divider-content{padding:0 .5rem}.p-divider.p-divider-vertical{margin:0 1rem;padding:1rem 0}.p-divider.p-divider-vertical:before{border-left:1px solid #dee2e6}.p-divider.p-divider-vertical .p-divider-content{padding:.5rem 0}.p-panel-header{display:flex;justify-content:space-between;align-items:center}.p-panel-title{line-height:1}.p-panel-header-icon{display:inline-flex;justify-content:center;align-items:center;cursor:pointer;text-decoration:none;overflow:hidden;position:relative}.p-panel .p-panel-header{border:1px solid #dee2e6;padding:1rem;background:#f8f9fa;color:#495057;border-top-right-radius:3px;border-top-left-radius:3px}.p-panel .p-panel-header .p-panel-title{font-weight:600}.p-panel .p-panel-header .p-panel-header-icon{width:2rem;height:2rem;color:#6c757d;border:0 none;background:transparent;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-panel .p-panel-header .p-panel-header-icon:enabled:hover{color:#495057;border-color:transparent;background:#e9ecef}.p-panel .p-panel-header .p-panel-header-icon:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-panel.p-panel-toggleable .p-panel-header{padding:.5rem 1rem}.p-panel .p-panel-content{padding:1rem;border:1px solid #dee2e6;background:#fff;color:#495057;border-top:0 none}.p-panel .p-panel-content:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.p-panel .p-panel-footer{padding:.5rem 1rem;border:1px solid #dee2e6;background:#fff;color:#495057;border-bottom-right-radius:3px;border-bottom-left-radius:3px;border-top:0 none}.p-scrollpanel-wrapper{overflow:hidden;width:100%;height:100%;position:relative;z-index:1;float:left}.p-scrollpanel-content{height:calc(100% + 18px);width:calc(100% + 18px);padding:0 18px 18px 0;position:relative;overflow:auto;box-sizing:border-box;scrollbar-width:none}.p-scrollpanel-content::-webkit-scrollbar{display:none}.p-scrollpanel-bar{position:relative;background:#c1c1c1;border-radius:3px;z-index:2;cursor:pointer;opacity:0;transition:opacity .25s linear}.p-scrollpanel-bar-y{width:9px;top:0}.p-scrollpanel-bar-x{height:9px;bottom:0}.p-scrollpanel-hidden{visibility:hidden}.p-scrollpanel:hover .p-scrollpanel-bar,.p-scrollpanel:active .p-scrollpanel-bar{opacity:1}.p-scrollpanel-grabbed{-webkit-user-select:none;user-select:none}.p-scrollpanel .p-scrollpanel-bar{background:#f8f9fa;border:0 none;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;outline-color:transparent}.p-scrollpanel .p-scrollpanel-bar:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-splitter{display:flex;flex-wrap:nowrap}.p-splitter-vertical{flex-direction:column}.p-splitter-gutter{flex-grow:0;flex-shrink:0;display:flex;align-items:center;justify-content:center;cursor:col-resize}.p-splitter-horizontal.p-splitter-resizing{cursor:col-resize;-webkit-user-select:none;user-select:none}.p-splitter-horizontal>.p-splitter-gutter>.p-splitter-gutter-handle{height:24px;width:100%}.p-splitter-horizontal>.p-splitter-gutter{cursor:col-resize}.p-splitter-vertical.p-splitter-resizing{cursor:row-resize;-webkit-user-select:none;user-select:none}.p-splitter-vertical>.p-splitter-gutter{cursor:row-resize}.p-splitter-vertical>.p-splitter-gutter>.p-splitter-gutter-handle{width:24px;height:100%}.p-splitter-panel{flex-grow:1;overflow:hidden}.p-splitter-panel-nested{display:flex}.p-splitter-panel .p-splitter{flex-grow:1;border:0 none}.p-splitter{border:1px solid #dee2e6;background:#fff;border-radius:3px;color:#495057}.p-splitter .p-splitter-gutter{transition:background-color .2s,color .2s,box-shadow .2s;background:#f8f9fa}.p-splitter .p-splitter-gutter .p-splitter-gutter-handle{background:#dee2e6;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;outline-color:transparent}.p-splitter .p-splitter-gutter .p-splitter-gutter-handle:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-splitter .p-splitter-gutter-resizing{background:#dee2e6}.p-stepper .p-stepper-nav{position:relative;display:flex;justify-content:space-between;align-items:center;margin:0;padding:0;list-style-type:none;overflow-x:auto}.p-stepper-vertical .p-stepper-nav{flex-direction:column}.p-stepper-header{position:relative;display:flex;flex:1 1 auto;align-items:center}.p-stepper-header:last-of-type{flex:initial}.p-stepper-header .p-stepper-action{border:0 none;display:inline-flex;align-items:center;text-decoration:none;cursor:pointer}.p-stepper-header .p-stepper-action:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-stepper.p-stepper-readonly .p-stepper-header{cursor:auto}.p-stepper-header.p-highlight .p-stepper-action{cursor:default}.p-stepper-title{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.p-stepper-number{position:relative;display:flex;align-items:center;justify-content:center}.p-stepper-separator{flex:1 1 0}.p-stepper .p-stepper-nav{display:flex;justify-content:space-between;margin:0;padding:0;list-style-type:none}.p-stepper .p-stepper-header{padding:.5rem}.p-stepper .p-stepper-header .p-stepper-action{transition:box-shadow .2s;border-radius:3px;background:#fff;outline-color:transparent}.p-stepper .p-stepper-header .p-stepper-action .p-stepper-number{color:#495057;border:1px solid #e9ecef;border-width:2px;background:#fff;min-width:2rem;height:2rem;line-height:2rem;font-size:1.143rem;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s}.p-stepper .p-stepper-header .p-stepper-action .p-stepper-title{margin-left:.5rem;color:#6c757d;font-weight:600;transition:background-color .2s,color .2s,box-shadow .2s}.p-stepper .p-stepper-header .p-stepper-action:not(.p-disabled):focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-stepper .p-stepper-header.p-highlight .p-stepper-number{background:#e3f2fd;color:#495057}.p-stepper .p-stepper-header.p-highlight .p-stepper-title{color:#495057}.p-stepper .p-stepper-header:not(.p-disabled):focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-stepper .p-stepper-header:has(~.p-highlight) .p-stepper-separator{background-color:#2196f3}.p-stepper .p-stepper-panels{background:#fff;padding:1rem;color:#495057}.p-stepper .p-stepper-separator{background-color:#dee2e6;width:100%;height:2px;margin-inline-start:1rem;transition:box-shadow .2s}.p-stepper.p-stepper-vertical{display:flex;flex-direction:column}.p-stepper.p-stepper-vertical .p-stepper-toggleable-content{display:flex;flex:1 1 auto;background:#fff;color:#495057}.p-stepper.p-stepper-vertical .p-stepper-panel{display:flex;flex-direction:column;flex:initial}.p-stepper.p-stepper-vertical .p-stepper-panel.p-stepper-panel-active{flex:1 1 auto}.p-stepper.p-stepper-vertical .p-stepper-panel .p-stepper-header{flex:initial}.p-stepper.p-stepper-vertical .p-stepper-panel .p-stepper-content{width:100%;padding-left:1rem}.p-stepper.p-stepper-vertical .p-stepper-panel .p-stepper-separator{flex:0 0 auto;width:2px;height:auto;margin-inline-start:calc(1.75rem + 2px)}.p-stepper.p-stepper-vertical .p-stepper-panel:has(~.p-stepper-panel-active) .p-stepper-separator{background-color:#2196f3}.p-stepper.p-stepper-vertical .p-stepper-panel:last-of-type .p-stepper-content{padding-left:3rem}.p-tabview-nav-container{position:relative}.p-tabview-scrollable .p-tabview-nav-container{overflow:hidden}.p-tabview-nav-content{overflow-x:auto;overflow-y:hidden;scroll-behavior:smooth;scrollbar-width:none;overscroll-behavior:contain auto}.p-tabview-nav{display:flex;margin:0;padding:0;list-style-type:none;flex:1 1 auto}.p-tabview-header-action{cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;align-items:center;position:relative;text-decoration:none;overflow:hidden}.p-tabview-ink-bar{display:none;z-index:1}.p-tabview-header-action:focus{z-index:1}.p-tabview-title{line-height:1;white-space:nowrap}.p-tabview-nav-btn{position:absolute;top:0;z-index:2;height:100%;display:flex;align-items:center;justify-content:center}.p-tabview-nav-prev{left:0}.p-tabview-nav-next{right:0}.p-tabview-nav-content::-webkit-scrollbar{display:none}.p-tabview .p-tabview-nav{background:#fff;border:1px solid #dee2e6;border-width:0 0 2px 0}.p-tabview .p-tabview-nav li{margin-right:0}.p-tabview .p-tabview-nav li .p-tabview-nav-link{border:solid #dee2e6;border-width:0 0 2px 0;border-color:transparent transparent #dee2e6 transparent;background:#fff;color:#6c757d;padding:1rem;font-weight:600;border-top-right-radius:3px;border-top-left-radius:3px;transition:box-shadow .2s;margin:0 0 -2px;outline-color:transparent}.p-tabview .p-tabview-nav li .p-tabview-nav-link:not(.p-disabled):focus-visible{outline:0 none;outline-offset:0;box-shadow:inset 0 0 0 .2rem #a6d5fa}.p-tabview .p-tabview-nav li:not(.p-highlight):not(.p-disabled):hover .p-tabview-nav-link{background:#fff;border-color:#6c757d;color:#6c757d}.p-tabview .p-tabview-nav li.p-highlight .p-tabview-nav-link{background:#fff;border-color:#2196f3;color:#2196f3}.p-tabview .p-tabview-nav-btn.p-link{background:#fff;color:#2196f3;width:2.357rem;box-shadow:0 3px 1px -2px #0003,0 2px 2px #00000024,0 1px 5px #0000001f;border-radius:0;outline-color:transparent}.p-tabview .p-tabview-nav-btn.p-link:focus-visible{outline:0 none;outline-offset:0;box-shadow:inset 0 0 0 .2rem #a6d5fa}.p-tabview .p-tabview-panels{background:#fff;padding:1rem;border:0 none;color:#495057;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.p-toolbar{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap}.p-toolbar-group-start,.p-toolbar-group-center,.p-toolbar-group-end,.p-toolbar-group-left,.p-toolbar-group-right{display:flex;align-items:center}.p-toolbar{background:#f8f9fa;border:1px solid #dee2e6;padding:1rem;border-radius:3px;gap:.5rem}.p-toolbar .p-toolbar-separator{margin:0 .5rem}.p-confirm-popup{position:absolute;margin-top:10px;top:0;left:0}.p-confirm-popup-flipped{margin-top:-10px;margin-bottom:10px}.p-confirm-popup-enter-from{opacity:0;transform:scaleY(.8)}.p-confirm-popup-leave-to{opacity:0}.p-confirm-popup-enter-active{transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1)}.p-confirm-popup-leave-active{transition:opacity .1s linear}.p-confirm-popup:after,.p-confirm-popup:before{bottom:100%;left:calc(var(--overlayArrowLeft, 0) + 1.25rem);content:" ";height:0;width:0;position:absolute;pointer-events:none}.p-confirm-popup:after{border-width:8px;margin-left:-8px}.p-confirm-popup:before{border-width:10px;margin-left:-10px}.p-confirm-popup-flipped:after,.p-confirm-popup-flipped:before{bottom:auto;top:100%}.p-confirm-popup.p-confirm-popup-flipped:after{border-bottom-color:transparent}.p-confirm-popup.p-confirm-popup-flipped:before{border-bottom-color:transparent}.p-confirm-popup .p-confirm-popup-content{display:flex;align-items:center}.p-confirm-popup{background:#fff;color:#495057;border:0 none;border-radius:3px;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.p-confirm-popup .p-confirm-popup-content{padding:1rem}.p-confirm-popup .p-confirm-popup-footer{text-align:right;padding:0 1rem 1rem}.p-confirm-popup .p-confirm-popup-footer button{margin:0 .5rem 0 0;width:auto}.p-confirm-popup .p-confirm-popup-footer button:last-child{margin:0}.p-confirm-popup:after{border-style:solid;border-color:#fff0;border-bottom-color:#fff}.p-confirm-popup:before{border-style:solid;border-color:#fff0;border-bottom-color:#f2f2f2}.p-confirm-popup.p-confirm-popup-flipped:after{border-top-color:#fff}.p-confirm-popup.p-confirm-popup-flipped:before{border-top-color:#fff}.p-confirm-popup .p-confirm-popup-icon{font-size:1.5rem}.p-confirm-popup .p-confirm-popup-icon.p-icon{width:1.5rem;height:1.5rem}.p-confirm-popup .p-confirm-popup-message{margin-left:1rem}.p-dialog-mask.p-component-overlay{pointer-events:auto}.p-dialog{max-height:90%;transform:scale(1)}.p-dialog-content{overflow-y:auto}.p-dialog-header{display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.p-dialog-footer{flex-shrink:0}.p-dialog .p-dialog-header-icons{display:flex;align-items:center}.p-dialog .p-dialog-header-icon{display:flex;align-items:center;justify-content:center;overflow:hidden;position:relative}.p-fluid .p-dialog-footer .p-button{width:auto}.p-dialog-enter-active{transition:all .15s cubic-bezier(0,0,.2,1)}.p-dialog-leave-active{transition:all .15s cubic-bezier(.4,0,.2,1)}.p-dialog-enter-from,.p-dialog-leave-to{opacity:0;transform:scale(.7)}.p-dialog-top .p-dialog,.p-dialog-bottom .p-dialog,.p-dialog-left .p-dialog,.p-dialog-right .p-dialog,.p-dialog-topleft .p-dialog,.p-dialog-topright .p-dialog,.p-dialog-bottomleft .p-dialog,.p-dialog-bottomright .p-dialog{margin:.75rem;transform:translateZ(0)}.p-dialog-top .p-dialog-enter-active,.p-dialog-top .p-dialog-leave-active,.p-dialog-bottom .p-dialog-enter-active,.p-dialog-bottom .p-dialog-leave-active,.p-dialog-left .p-dialog-enter-active,.p-dialog-left .p-dialog-leave-active,.p-dialog-right .p-dialog-enter-active,.p-dialog-right .p-dialog-leave-active,.p-dialog-topleft .p-dialog-enter-active,.p-dialog-topleft .p-dialog-leave-active,.p-dialog-topright .p-dialog-enter-active,.p-dialog-topright .p-dialog-leave-active,.p-dialog-bottomleft .p-dialog-enter-active,.p-dialog-bottomleft .p-dialog-leave-active,.p-dialog-bottomright .p-dialog-enter-active,.p-dialog-bottomright .p-dialog-leave-active{transition:all .3s ease-out}.p-dialog-top .p-dialog-enter-from,.p-dialog-top .p-dialog-leave-to{transform:translate3d(0,-100%,0)}.p-dialog-bottom .p-dialog-enter-from,.p-dialog-bottom .p-dialog-leave-to{transform:translate3d(0,100%,0)}.p-dialog-left .p-dialog-enter-from,.p-dialog-left .p-dialog-leave-to,.p-dialog-topleft .p-dialog-enter-from,.p-dialog-topleft .p-dialog-leave-to,.p-dialog-bottomleft .p-dialog-enter-from,.p-dialog-bottomleft .p-dialog-leave-to{transform:translate3d(-100%,0,0)}.p-dialog-right .p-dialog-enter-from,.p-dialog-right .p-dialog-leave-to,.p-dialog-topright .p-dialog-enter-from,.p-dialog-topright .p-dialog-leave-to,.p-dialog-bottomright .p-dialog-enter-from,.p-dialog-bottomright .p-dialog-leave-to{transform:translate3d(100%,0,0)}.p-dialog-maximized{width:100vw!important;height:100vh!important;top:0!important;left:0!important;max-height:100%;height:100%}.p-dialog-maximized .p-dialog-content{flex-grow:1}.p-confirm-dialog .p-dialog-content{display:flex;align-items:center}.p-dialog{border-radius:3px;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f;border:0 none}.p-dialog .p-dialog-header{border-bottom:0 none;background:#fff;color:#495057;padding:1.5rem;border-top-right-radius:3px;border-top-left-radius:3px}.p-dialog .p-dialog-header .p-dialog-title{font-weight:600;font-size:1.25rem}.p-dialog .p-dialog-header .p-dialog-header-icon{width:2rem;height:2rem;color:#6c757d;border:0 none;background:transparent;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent;margin-right:.5rem}.p-dialog .p-dialog-header .p-dialog-header-icon:enabled:hover{color:#495057;border-color:transparent;background:#e9ecef}.p-dialog .p-dialog-header .p-dialog-header-icon:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-dialog .p-dialog-header .p-dialog-header-icon:last-child{margin-right:0}.p-dialog .p-dialog-content{background:#fff;color:#495057;padding:0 1.5rem 2rem}.p-dialog .p-dialog-content:last-of-type{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.p-dialog .p-dialog-footer{border-top:0 none;background:#fff;color:#495057;padding:0 1.5rem 1.5rem;display:flex;justify-content:flex-end;gap:.5rem;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.p-dialog.p-confirm-dialog .p-confirm-dialog-icon{font-size:2rem}.p-dialog.p-confirm-dialog .p-confirm-dialog-message:not(:first-child){margin-left:1rem}.p-overlaypanel{margin-top:10px}.p-overlaypanel-flipped{margin-top:-10px;margin-bottom:10px}.p-overlaypanel-close{display:flex;justify-content:center;align-items:center;overflow:hidden;position:relative}.p-overlaypanel-enter-from{opacity:0;transform:scaleY(.8)}.p-overlaypanel-leave-to{opacity:0}.p-overlaypanel-enter-active{transition:transform .12s cubic-bezier(0,0,.2,1),opacity .12s cubic-bezier(0,0,.2,1)}.p-overlaypanel-leave-active{transition:opacity .1s linear}.p-overlaypanel:after,.p-overlaypanel:before{bottom:100%;left:calc(var(--overlayArrowLeft, 0) + 1.25rem);content:" ";height:0;width:0;position:absolute;pointer-events:none}.p-overlaypanel:after{border-width:8px;margin-left:-8px}.p-overlaypanel:before{border-width:10px;margin-left:-10px}.p-overlaypanel-flipped:after,.p-overlaypanel-flipped:before{bottom:auto;top:100%}.p-overlaypanel.p-overlaypanel-flipped:after{border-bottom-color:transparent}.p-overlaypanel.p-overlaypanel-flipped:before{border-bottom-color:transparent}.p-overlaypanel{background:#fff;color:#495057;border:0 none;border-radius:3px;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.p-overlaypanel .p-overlaypanel-content{padding:1rem}.p-overlaypanel .p-overlaypanel-close{background:#2196f3;color:#fff;width:2rem;height:2rem;transition:background-color .2s,color .2s,box-shadow .2s;border-radius:50%;position:absolute;top:-1rem;right:-1rem}.p-overlaypanel .p-overlaypanel-close:enabled:hover{background:#0d89ec;color:#fff}.p-overlaypanel:after{border-style:solid;border-color:#fff0;border-bottom-color:#fff}.p-overlaypanel:before{border-style:solid;border-color:#fff0;border-bottom-color:#f2f2f2}.p-overlaypanel.p-overlaypanel-flipped:after{border-top-color:#fff}.p-overlaypanel.p-overlaypanel-flipped:before{border-top-color:#fff}.p-sidebar-mask{display:none;pointer-events:none;background-color:transparent;transition-property:background-color}.p-sidebar-mask.p-component-overlay{pointer-events:auto}.p-sidebar-visible{display:flex}.p-sidebar{display:flex;flex-direction:column;pointer-events:auto;transform:translateZ(0);position:relative;transition:transform .3s}.p-sidebar-content{overflow-y:auto;flex-grow:1}.p-sidebar-header{display:flex;align-items:center;justify-content:space-between;flex-shrink:0}.p-sidebar-icon{display:flex;align-items:center;justify-content:center;overflow:hidden;position:relative}.p-sidebar-full .p-sidebar{transition:none;transform:none;width:100vw!important;height:100vh!important;max-height:100%;top:0!important;left:0!important}.p-sidebar-left .p-sidebar-enter-from,.p-sidebar-left .p-sidebar-leave-to{transform:translate(-100%)}.p-sidebar-right .p-sidebar-enter-from,.p-sidebar-right .p-sidebar-leave-to{transform:translate(100%)}.p-sidebar-top .p-sidebar-enter-from,.p-sidebar-top .p-sidebar-leave-to{transform:translateY(-100%)}.p-sidebar-bottom .p-sidebar-enter-from,.p-sidebar-bottom .p-sidebar-leave-to{transform:translateY(100%)}.p-sidebar-full .p-sidebar-enter-from,.p-sidebar-full .p-sidebar-leave-to{opacity:0}.p-sidebar-full .p-sidebar-enter-active,.p-sidebar-full .p-sidebar-leave-active{transition:opacity .4s cubic-bezier(.25,.8,.25,1)}.p-sidebar-left .p-sidebar,.p-sidebar-right .p-sidebar{width:20rem;height:100%}.p-sidebar-top .p-sidebar,.p-sidebar-bottom .p-sidebar{height:10rem;width:100%}.p-sidebar-left .p-sidebar-sm,.p-sidebar-right .p-sidebar-sm{width:20rem}.p-sidebar-left .p-sidebar-md,.p-sidebar-right .p-sidebar-md{width:40rem}.p-sidebar-left .p-sidebar-lg,.p-sidebar-right .p-sidebar-lg{width:60rem}.p-sidebar-top .p-sidebar-sm,.p-sidebar-bottom .p-sidebar-sm{height:10rem}.p-sidebar-top .p-sidebar-md,.p-sidebar-bottom .p-sidebar-md{height:20rem}.p-sidebar-top .p-sidebar-lg,.p-sidebar-bottom .p-sidebar-lg{height:30rem}.p-sidebar-left .p-sidebar-content,.p-sidebar-right .p-sidebar-content,.p-sidebar-top .p-sidebar-content,.p-sidebar-bottom .p-sidebar-content{width:100%;height:100%}@media screen and (max-width: 64em){.p-sidebar-left .p-sidebar-lg,.p-sidebar-left .p-sidebar-md,.p-sidebar-right .p-sidebar-lg,.p-sidebar-right .p-sidebar-md{width:20rem}}.p-sidebar{background:#fff;color:#495057;border:0 none;box-shadow:0 11px 15px -7px #0003,0 24px 38px 3px #00000024,0 9px 46px 8px #0000001f}.p-sidebar .p-sidebar-header{padding:1rem}.p-sidebar .p-sidebar-header .p-sidebar-header-content{font-weight:600;font-size:1.25rem}.p-sidebar .p-sidebar-header .p-sidebar-close,.p-sidebar .p-sidebar-header .p-sidebar-icon{width:2rem;height:2rem;color:#6c757d;border:0 none;background:transparent;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-sidebar .p-sidebar-header .p-sidebar-close:enabled:hover,.p-sidebar .p-sidebar-header .p-sidebar-icon:enabled:hover{color:#495057;border-color:transparent;background:#e9ecef}.p-sidebar .p-sidebar-header .p-sidebar-close:focus-visible,.p-sidebar .p-sidebar-header .p-sidebar-icon:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-sidebar .p-sidebar-header+.p-sidebar-content{padding-top:0}.p-sidebar .p-sidebar-content{padding:1rem}.p-tooltip{position:absolute;display:none;padding:.25em .5rem;max-width:12.5rem}.p-tooltip.p-tooltip-right,.p-tooltip.p-tooltip-left{padding:0 .25rem}.p-tooltip.p-tooltip-top,.p-tooltip.p-tooltip-bottom{padding:.25em 0}.p-tooltip .p-tooltip-text{white-space:pre-line;word-break:break-word}.p-tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;scale:2}.p-tooltip-right .p-tooltip-arrow{margin-top:-.25rem;border-width:.25em .25em .25em 0}.p-tooltip-left .p-tooltip-arrow{margin-top:-.25rem;border-width:.25em 0 .25em .25rem}.p-tooltip.p-tooltip-top{padding:.25em 0}.p-tooltip-top .p-tooltip-arrow{margin-left:-.25rem;border-width:.25em .25em 0}.p-tooltip-bottom .p-tooltip-arrow{margin-left:-.25rem;border-width:0 .25em .25rem}.p-tooltip .p-tooltip-text{background:#495057;color:#fff;padding:.5rem;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;border-radius:3px}.p-tooltip.p-tooltip-right .p-tooltip-arrow{border-right-color:#495057}.p-tooltip.p-tooltip-left .p-tooltip-arrow{border-left-color:#495057}.p-tooltip.p-tooltip-top .p-tooltip-arrow{border-top-color:#495057}.p-tooltip.p-tooltip-bottom .p-tooltip-arrow{border-bottom-color:#495057}.p-fileupload-content{position:relative}.p-fileupload-content .p-progressbar{width:100%;position:absolute;top:0;left:0}.p-button.p-fileupload-choose{position:relative;overflow:hidden}.p-fileupload-buttonbar{display:flex;flex-wrap:wrap}.p-fileupload>input[type=file],.p-fileupload-basic input[type=file]{display:none}.p-fluid .p-fileupload .p-button{width:auto}.p-fileupload-file{display:flex;flex-wrap:wrap;align-items:center}.p-fileupload-file-thumbnail{flex-shrink:0}.p-fileupload-file-actions{margin-left:auto}.p-fileupload .p-fileupload-buttonbar{background:#f8f9fa;padding:1rem;border:1px solid #dee2e6;color:#495057;border-bottom:0 none;border-top-right-radius:3px;border-top-left-radius:3px;gap:.5rem}.p-fileupload .p-fileupload-buttonbar .p-button.p-fileupload-choose.p-focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-fileupload .p-fileupload-content{background:#fff;padding:2rem 1rem;border:1px solid #dee2e6;color:#495057;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.p-fileupload .p-fileupload-content.p-fileupload-highlight{border:1px dashed #2196F3;background-color:#e3f2fd}.p-fileupload .p-fileupload-file{padding:1rem;border:1px solid #dee2e6;border-radius:3px;gap:.5rem;margin-bottom:.5rem}.p-fileupload .p-fileupload-file:last-child{margin-bottom:0}.p-fileupload .p-fileupload-file-name{margin-bottom:.5rem}.p-fileupload .p-fileupload-file-size{margin-right:.5rem}.p-fileupload .p-progressbar{height:.25rem}.p-fileupload .p-fileupload-row>div{padding:1rem}.p-fileupload.p-fileupload-advanced .p-message{margin-top:0}.p-fileupload-choose:not(.p-disabled):hover{background:#0d89ec;color:#fff;border-color:#0d89ec}.p-fileupload-choose:not(.p-disabled):active{background:#0b7ad1;color:#fff;border-color:#0b7ad1}.p-breadcrumb{overflow-x:auto}.p-breadcrumb .p-breadcrumb-list{margin:0;padding:0;list-style-type:none;display:flex;align-items:center;flex-wrap:nowrap}.p-breadcrumb .p-menuitem-text{line-height:1}.p-breadcrumb .p-menuitem-link{text-decoration:none;display:flex;align-items:center}.p-breadcrumb .p-menuitem-separator{display:flex;align-items:center}.p-breadcrumb::-webkit-scrollbar{display:none}.p-breadcrumb{background:#fff;border:1px solid #dee2e6;border-radius:3px;padding:1rem}.p-breadcrumb .p-breadcrumb-list li .p-menuitem-link{transition:box-shadow .2s;border-radius:3px;outline-color:transparent}.p-breadcrumb .p-breadcrumb-list li .p-menuitem-link:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-breadcrumb .p-breadcrumb-list li .p-menuitem-link .p-menuitem-text{color:#495057}.p-breadcrumb .p-breadcrumb-list li .p-menuitem-link .p-menuitem-icon{color:#6c757d}.p-breadcrumb .p-breadcrumb-list li.p-menuitem-separator{margin:0 .5rem;color:#495057}.p-breadcrumb .p-breadcrumb-list li:last-child .p-menuitem-text{color:#495057}.p-breadcrumb .p-breadcrumb-list li:last-child .p-menuitem-icon{color:#6c757d}.p-contextmenu ul{margin:0;padding:0;list-style:none}.p-contextmenu .p-submenu-list{position:absolute;min-width:100%;z-index:1}.p-contextmenu .p-menuitem-link{cursor:pointer;display:flex;align-items:center;text-decoration:none;overflow:hidden;position:relative}.p-contextmenu .p-menuitem-text{line-height:1}.p-contextmenu .p-menuitem{position:relative}.p-contextmenu .p-menuitem-link .p-submenu-icon{margin-left:auto}.p-contextmenu-enter-from,.p-contextmenu-leave-active{opacity:0}.p-contextmenu-enter-active{transition:opacity .25s}.p-contextmenu{padding:.25rem 0;background:#fff;color:#495057;border:0 none;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;border-radius:3px;min-width:12.5rem}.p-contextmenu .p-contextmenu-root-list{outline:0 none}.p-contextmenu .p-submenu-list{padding:.25rem 0;background:#fff;border:0 none;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;border-radius:3px}.p-contextmenu .p-menuitem{margin:0}.p-contextmenu .p-menuitem:first-child{margin-top:0}.p-contextmenu .p-menuitem:last-child{margin-bottom:0}.p-contextmenu .p-menuitem>.p-menuitem-content{color:#495057;transition:box-shadow .2s;border-radius:0}.p-contextmenu .p-menuitem>.p-menuitem-content .p-menuitem-link{color:#495057;padding:.75rem 1rem;-webkit-user-select:none;user-select:none}.p-contextmenu .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-contextmenu .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-icon{color:#6c757d;margin-right:.5rem}.p-contextmenu .p-menuitem>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-contextmenu .p-menuitem.p-highlight>.p-menuitem-content{color:#495057;background:#e9ecef}.p-contextmenu .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-contextmenu .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-menuitem-icon,.p-contextmenu .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-contextmenu .p-menuitem.p-highlight.p-focus>.p-menuitem-content{background:#e9ecef}.p-contextmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content{color:#495057;background:#e9ecef}.p-contextmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-contextmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-menuitem-icon,.p-contextmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#495057}.p-contextmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-contextmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-contextmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-contextmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-contextmenu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-contextmenu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-contextmenu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-contextmenu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-contextmenu .p-menuitem-separator{border-top:1px solid #dee2e6;margin:.25rem 0}.p-contextmenu .p-submenu-icon{font-size:.875rem}.p-contextmenu .p-submenu-icon.p-icon{width:.875rem;height:.875rem}.p-dock{position:absolute;z-index:1;display:flex;justify-content:center;align-items:center;pointer-events:none}.p-dock-list-container{display:flex;pointer-events:auto}.p-dock-list{margin:0;padding:0;list-style:none;display:flex;align-items:center;justify-content:center}.p-dock-item{transition:all .2s cubic-bezier(.4,0,.2,1);will-change:transform}.p-dock-link{display:flex;flex-direction:column;align-items:center;justify-content:center;position:relative;overflow:hidden;cursor:default}.p-dock-item-second-prev,.p-dock-item-second-next{transform:scale(1.2)}.p-dock-item-prev,.p-dock-item-next{transform:scale(1.4)}.p-dock-item-current{transform:scale(1.6);z-index:1}.p-dock-top{left:0;top:0;width:100%}.p-dock-top .p-dock-item{transform-origin:center top}.p-dock-bottom{left:0;bottom:0;width:100%}.p-dock-bottom .p-dock-item{transform-origin:center bottom}.p-dock-right{right:0;top:0;height:100%}.p-dock-right .p-dock-item{transform-origin:center right}.p-dock-right .p-dock-list{flex-direction:column}.p-dock-left{left:0;top:0;height:100%}.p-dock-left .p-dock-item{transform-origin:center left}.p-dock-left .p-dock-list{flex-direction:column}.p-dock .p-dock-list-container{background:#ffffff1a;border:1px solid rgba(255,255,255,.2);padding:.5rem;border-radius:.5rem}.p-dock .p-dock-list-container .p-dock-list{outline:0 none}.p-dock .p-dock-item{padding:.5rem;border-radius:3px}.p-dock .p-dock-item.p-focus{outline:0 none;outline-offset:0;box-shadow:inset 0 0 0 .15rem #a6d5fa}.p-dock .p-dock-link{width:4rem;height:4rem}.p-dock.p-dock-top .p-dock-item-second-prev,.p-dock.p-dock-top .p-dock-item-second-next,.p-dock.p-dock-bottom .p-dock-item-second-prev,.p-dock.p-dock-bottom .p-dock-item-second-next{margin:0 .9rem}.p-dock.p-dock-top .p-dock-item-prev,.p-dock.p-dock-top .p-dock-item-next,.p-dock.p-dock-bottom .p-dock-item-prev,.p-dock.p-dock-bottom .p-dock-item-next{margin:0 1.3rem}.p-dock.p-dock-top .p-dock-item-current,.p-dock.p-dock-bottom .p-dock-item-current{margin:0 1.5rem}.p-dock.p-dock-left .p-dock-item-second-prev,.p-dock.p-dock-left .p-dock-item-second-next,.p-dock.p-dock-right .p-dock-item-second-prev,.p-dock.p-dock-right .p-dock-item-second-next{margin:.9rem 0}.p-dock.p-dock-left .p-dock-item-prev,.p-dock.p-dock-left .p-dock-item-next,.p-dock.p-dock-right .p-dock-item-prev,.p-dock.p-dock-right .p-dock-item-next{margin:1.3rem 0}.p-dock.p-dock-left .p-dock-item-current,.p-dock.p-dock-right .p-dock-item-current{margin:1.5rem 0}.p-dock.p-dock-mobile.p-dock-top .p-dock-list-container,.p-dock.p-dock-mobile.p-dock-bottom .p-dock-list-container{overflow-x:auto;width:100%}.p-dock.p-dock-mobile.p-dock-top .p-dock-list-container .p-dock-list,.p-dock.p-dock-mobile.p-dock-bottom .p-dock-list-container .p-dock-list{margin:0 auto}.p-dock.p-dock-mobile.p-dock-left .p-dock-list-container,.p-dock.p-dock-mobile.p-dock-right .p-dock-list-container{overflow-y:auto;height:100%}.p-dock.p-dock-mobile.p-dock-left .p-dock-list-container .p-dock-list,.p-dock.p-dock-mobile.p-dock-right .p-dock-list-container .p-dock-list{margin:auto 0}.p-dock.p-dock-mobile .p-dock-list .p-dock-item{transform:none;margin:0}.p-megamenu{display:flex;position:relative}.p-megamenu-root-list{margin:0;padding:0;list-style:none}.p-megamenu .p-menuitem-link{cursor:pointer;display:flex;align-items:center;text-decoration:none;overflow:hidden;position:relative}.p-megamenu .p-menuitem-text{line-height:1}.p-megamenu-panel{display:none;width:auto;z-index:1;left:0;min-width:100%}.p-megamenu-panel:not(.p-megamenu-mobile){position:absolute}.p-megamenu-root-list>.p-menuitem-active>.p-megamenu-panel{display:block}.p-megamenu-submenu{margin:0;padding:0;list-style:none}.p-megamenu-button{display:none;cursor:pointer;align-items:center;justify-content:center;text-decoration:none}.p-megamenu-horizontal{align-items:center}.p-megamenu-horizontal .p-megamenu-root-list{display:flex;align-items:center;flex-wrap:wrap}.p-megamenu-horizontal .p-megamenu-end{margin-left:auto;align-self:center}.p-megamenu-vertical{flex-direction:column}.p-megamenu-vertical:not(.p-megamenu-mobile){display:inline-flex}.p-megamenu-vertical .p-megamenu-root-list{flex-direction:column}.p-megamenu-vertical:not(.p-megamenu-mobile) .p-megamenu-root-list>.p-menuitem-active>.p-megamenu-panel{left:100%;top:0}.p-megamenu-vertical .p-megamenu-root-list>.p-menuitem>.p-menuitem-content>.p-menuitem-link>.p-submenu-icon{margin-left:auto}.p-megamenu-grid{display:flex}.p-megamenu-col-2,.p-megamenu-col-3,.p-megamenu-col-4,.p-megamenu-col-6,.p-megamenu-col-12{flex:0 0 auto;padding:.5rem}.p-megamenu-col-2{width:16.6667%}.p-megamenu-col-3{width:25%}.p-megamenu-col-4{width:33.3333%}.p-megamenu-col-6{width:50%}.p-megamenu-col-12{width:100%}.p-megamenu.p-megamenu-mobile .p-megamenu-button{display:flex}.p-megamenu.p-megamenu-mobile .p-megamenu-root-list{position:absolute;display:none;width:100%}.p-megamenu.p-megamenu-mobile .p-submenu-list{width:100%;position:static;box-shadow:none;border:0 none}.p-megamenu.p-megamenu-mobile .p-megamenu-root-list .p-menuitem{width:100%;position:static}.p-megamenu.p-megamenu-mobile-active .p-megamenu-root-list{display:flex;flex-direction:column;top:100%;left:0;z-index:1}.p-megamenu.p-megamenu-mobile .p-megamenu-grid{flex-wrap:wrap;overflow:auto;max-height:90%}.p-megamenu{padding:.5rem;background:#f8f9fa;color:#495057;border:1px solid #dee2e6;border-radius:3px}.p-megamenu .p-megamenu-root-list{outline:0 none}.p-megamenu .p-menuitem{margin:0}.p-megamenu .p-menuitem:first-child{margin-top:0}.p-megamenu .p-menuitem:last-child{margin-bottom:0}.p-megamenu .p-menuitem>.p-menuitem-content{color:#495057;transition:box-shadow .2s;border-radius:0}.p-megamenu .p-menuitem>.p-menuitem-content .p-menuitem-link{color:#495057;padding:.75rem 1rem;-webkit-user-select:none;user-select:none}.p-megamenu .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-megamenu .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-icon{color:#6c757d;margin-right:.5rem}.p-megamenu .p-menuitem>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-megamenu .p-menuitem.p-highlight>.p-menuitem-content{color:#495057;background:#e9ecef}.p-megamenu .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-megamenu .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-menuitem-icon,.p-megamenu .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-megamenu .p-menuitem.p-highlight.p-focus>.p-menuitem-content{background:#e9ecef}.p-megamenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content{color:#495057;background:#e9ecef}.p-megamenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-megamenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-menuitem-icon,.p-megamenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#495057}.p-megamenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-megamenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-megamenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-megamenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-megamenu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-megamenu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-megamenu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-megamenu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-megamenu .p-megamenu-panel{background:#fff;color:#495057;border:0 none;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;border-radius:3px}.p-megamenu .p-submenu-header{margin:0;padding:.75rem 1rem;color:#495057;background:#fff;font-weight:600;border-top-right-radius:3px;border-top-left-radius:3px}.p-megamenu .p-submenu-list{padding:.25rem 0;min-width:12.5rem}.p-megamenu .p-submenu-list .p-menuitem-separator{border-top:1px solid #dee2e6;margin:.25rem 0}.p-megamenu.p-megamenu-vertical{min-width:12.5rem;padding:.25rem 0}.p-megamenu.p-megamenu-horizontal .p-megamenu-root-list>.p-menuitem>.p-menuitem-content{color:#495057;transition:box-shadow .2s;border-radius:3px}.p-megamenu.p-megamenu-horizontal .p-megamenu-root-list>.p-menuitem>.p-menuitem-content .p-menuitem-link{padding:.75rem 1rem;-webkit-user-select:none;user-select:none}.p-megamenu.p-megamenu-horizontal .p-megamenu-root-list>.p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-megamenu.p-megamenu-horizontal .p-megamenu-root-list>.p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-icon{color:#6c757d;margin-right:.5rem}.p-megamenu.p-megamenu-horizontal .p-megamenu-root-list>.p-menuitem>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d;margin-left:.5rem}.p-megamenu.p-megamenu-horizontal .p-megamenu-root-list>.p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-megamenu.p-megamenu-horizontal .p-megamenu-root-list>.p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-megamenu.p-megamenu-horizontal .p-megamenu-root-list>.p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-megamenu.p-megamenu-horizontal .p-megamenu-root-list>.p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-megamenu.p-megamenu-mobile.p-megamenu-vertical{width:100%;padding:.5rem}.p-megamenu.p-megamenu-mobile .p-megamenu-button{width:2rem;height:2rem;color:#6c757d;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-megamenu.p-megamenu-mobile .p-megamenu-button:hover{color:#6c757d;background:#e9ecef}.p-megamenu.p-megamenu-mobile .p-megamenu-button:focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-megamenu.p-megamenu-mobile .p-megamenu-root-list{padding:.25rem 0;background:#fff;border:0 none;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.p-megamenu.p-megamenu-mobile .p-megamenu-root-list .p-menuitem-separator{border-top:1px solid #dee2e6;margin:.25rem 0}.p-megamenu.p-megamenu-mobile .p-megamenu-root-list .p-submenu-icon{font-size:.875rem}.p-megamenu.p-megamenu-mobile .p-megamenu-root-list .p-menuitem .p-menuitem-content .p-menuitem-link .p-submenu-icon{margin-left:auto;transition:transform .2s}.p-megamenu.p-megamenu-mobile .p-megamenu-root-list .p-menuitem.p-menuitem-active>.p-menuitem-content>.p-menuitem-link>.p-submenu-icon{transform:rotate(-180deg)}.p-megamenu.p-megamenu-mobile .p-megamenu-root-list .p-submenu-list .p-submenu-icon{transition:transform .2s;transform:rotate(90deg)}.p-megamenu.p-megamenu-mobile .p-megamenu-root-list .p-submenu-list .p-menuitem-active>.p-menuitem-content>.p-menuitem-link>.p-submenu-icon{transform:rotate(-90deg)}.p-megamenu.p-megamenu-mobile .p-megamenu-root-list .p-submenu-list .p-menuitem .p-menuitem-content .p-menuitem-link{padding-left:2.25rem}.p-menu ul{margin:0;padding:0;list-style:none}.p-menu .p-menuitem-link{cursor:pointer;display:flex;align-items:center;text-decoration:none;overflow:hidden;position:relative}.p-menu .p-menuitem-text{line-height:1}.p-menu{padding:.25rem 0;background:#fff;color:#495057;border:1px solid #dee2e6;border-radius:3px;min-width:12.5rem}.p-menu .p-menuitem{margin:0}.p-menu .p-menuitem:first-child{margin-top:0}.p-menu .p-menuitem:last-child{margin-bottom:0}.p-menu .p-menuitem>.p-menuitem-content{color:#495057;transition:box-shadow .2s;border-radius:0}.p-menu .p-menuitem>.p-menuitem-content .p-menuitem-link{color:#495057;padding:.75rem 1rem;-webkit-user-select:none;user-select:none}.p-menu .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-menu .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-icon{color:#6c757d;margin-right:.5rem}.p-menu .p-menuitem>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-menu .p-menuitem.p-highlight>.p-menuitem-content{color:#495057;background:#e9ecef}.p-menu .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-menu .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-menuitem-icon,.p-menu .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-menu .p-menuitem.p-highlight.p-focus>.p-menuitem-content{background:#e9ecef}.p-menu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content{color:#495057;background:#e9ecef}.p-menu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-menu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-menuitem-icon,.p-menu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#495057}.p-menu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-menu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-menu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-menu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-menu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-menu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-menu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-menu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-menu.p-menu-overlay{background:#fff;border:0 none;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.p-menu .p-submenu-header{margin:0;padding:.75rem 1rem;color:#495057;background:#fff;font-weight:600;border-top-right-radius:0;border-top-left-radius:0}.p-menu .p-menuitem-separator{border-top:1px solid #dee2e6;margin:.25rem 0}.p-menubar{display:flex;align-items:center}.p-menubar ul{margin:0;padding:0;list-style:none}.p-menubar .p-menuitem-link{cursor:pointer;display:flex;align-items:center;text-decoration:none;overflow:hidden;position:relative}.p-menubar .p-menuitem-text{line-height:1}.p-menubar .p-menuitem{position:relative}.p-menubar-root-list{display:flex;align-items:center;flex-wrap:wrap}.p-menubar-root-list>li ul{display:none;z-index:1}.p-menubar-root-list>.p-menuitem-active>.p-submenu-list{display:block}.p-menubar .p-submenu-list{display:none;position:absolute;z-index:1}.p-menubar .p-submenu-list>.p-menuitem-active>.p-submenu-list{display:block;left:100%;top:0}.p-menubar .p-submenu-list .p-menuitem .p-menuitem-content .p-menuitem-link .p-submenu-icon{margin-left:auto}.p-menubar .p-menubar-end{margin-left:auto;align-self:center}.p-menubar-button{display:none;cursor:pointer;align-items:center;justify-content:center;text-decoration:none}.p-menubar.p-menubar-mobile{position:relative}.p-menubar.p-menubar-mobile .p-menubar-button{display:flex}.p-menubar.p-menubar-mobile .p-menubar-root-list{position:absolute;display:none;width:100%}.p-menubar.p-menubar-mobile .p-submenu-list{width:100%;position:static;box-shadow:none;border:0 none}.p-menubar.p-menubar-mobile .p-menubar-root-list .p-menuitem{width:100%;position:static}.p-menubar.p-menubar-mobile-active .p-menubar-root-list{display:flex;flex-direction:column;top:100%;left:0;z-index:1}.p-menubar{padding:.5rem;background:#f8f9fa;color:#495057;border:1px solid #dee2e6;border-radius:3px}.p-menubar .p-menubar-root-list{outline:0 none}.p-menubar .p-menubar-root-list>.p-menuitem>.p-menuitem-content{color:#495057;transition:box-shadow .2s;border-radius:3px}.p-menubar .p-menubar-root-list>.p-menuitem>.p-menuitem-content .p-menuitem-link{padding:.75rem 1rem;-webkit-user-select:none;user-select:none}.p-menubar .p-menubar-root-list>.p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-menubar .p-menubar-root-list>.p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-icon{color:#6c757d;margin-right:.5rem}.p-menubar .p-menubar-root-list>.p-menuitem>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d;margin-left:.5rem}.p-menubar .p-menubar-root-list>.p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-menubar .p-menubar-root-list>.p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-menubar .p-menubar-root-list>.p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-menubar .p-menubar-root-list>.p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-menubar .p-menuitem{margin:0}.p-menubar .p-menuitem:first-child{margin-top:0}.p-menubar .p-menuitem:last-child{margin-bottom:0}.p-menubar .p-menuitem>.p-menuitem-content{color:#495057;transition:box-shadow .2s;border-radius:0}.p-menubar .p-menuitem>.p-menuitem-content .p-menuitem-link{color:#495057;padding:.75rem 1rem;-webkit-user-select:none;user-select:none}.p-menubar .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-menubar .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-icon{color:#6c757d;margin-right:.5rem}.p-menubar .p-menuitem>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-menubar .p-menuitem.p-highlight>.p-menuitem-content{color:#495057;background:#e9ecef}.p-menubar .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-menubar .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-menuitem-icon,.p-menubar .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-menubar .p-menuitem.p-highlight.p-focus>.p-menuitem-content{background:#e9ecef}.p-menubar .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content{color:#495057;background:#e9ecef}.p-menubar .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-menubar .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-menuitem-icon,.p-menubar .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#495057}.p-menubar .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-menubar .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-menubar .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-menubar .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-menubar .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-menubar .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-menubar .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-menubar .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-menubar .p-submenu-list{padding:.25rem 0;background:#fff;border:0 none;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;min-width:12.5rem;border-radius:3px}.p-menubar .p-submenu-list .p-menuitem-separator{border-top:1px solid #dee2e6;margin:.25rem 0}.p-menubar .p-submenu-list .p-submenu-icon{font-size:.875rem}.p-menubar.p-menubar-mobile .p-menubar-button{width:2rem;height:2rem;color:#6c757d;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-menubar.p-menubar-mobile .p-menubar-button:hover{color:#6c757d;background:#e9ecef}.p-menubar.p-menubar-mobile .p-menubar-button:focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-menubar.p-menubar-mobile .p-menubar-root-list{padding:.25rem 0;background:#fff;border:0 none;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.p-menubar.p-menubar-mobile .p-menubar-root-list .p-menuitem-separator{border-top:1px solid #dee2e6;margin:.25rem 0}.p-menubar.p-menubar-mobile .p-menubar-root-list .p-submenu-icon{font-size:.875rem}.p-menubar.p-menubar-mobile .p-menubar-root-list .p-menuitem .p-menuitem-content .p-menuitem-link .p-submenu-icon{margin-left:auto;transition:transform .2s}.p-menubar.p-menubar-mobile .p-menubar-root-list .p-menuitem.p-menuitem-active>.p-menuitem-content>.p-menuitem-link>.p-submenu-icon{transform:rotate(-180deg)}.p-menubar.p-menubar-mobile .p-menubar-root-list .p-submenu-list .p-submenu-icon{transition:transform .2s;transform:rotate(90deg)}.p-menubar.p-menubar-mobile .p-menubar-root-list .p-submenu-list .p-menuitem-active>.p-menuitem-content>.p-menuitem-link>.p-submenu-icon{transform:rotate(-90deg)}.p-menubar.p-menubar-mobile .p-menubar-root-list .p-submenu-list .p-menuitem .p-menuitem-content .p-menuitem-link{padding-left:2.25rem}.p-menubar.p-menubar-mobile .p-menubar-root-list .p-submenu-list .p-menuitem .p-submenu-list .p-menuitem .p-menuitem-content .p-menuitem-link{padding-left:3.75rem}.p-menubar.p-menubar-mobile .p-menubar-root-list .p-submenu-list .p-menuitem .p-submenu-list .p-menuitem .p-submenu-list .p-menuitem .p-menuitem-content .p-menuitem-link{padding-left:5.25rem}.p-menubar.p-menubar-mobile .p-menubar-root-list .p-submenu-list .p-menuitem .p-submenu-list .p-menuitem .p-submenu-list .p-menuitem .p-submenu-list .p-menuitem .p-menuitem-content .p-menuitem-link{padding-left:6.75rem}.p-menubar.p-menubar-mobile .p-menubar-root-list .p-submenu-list .p-menuitem .p-submenu-list .p-menuitem .p-submenu-list .p-menuitem .p-submenu-list .p-menuitem .p-submenu-list .p-menuitem .p-menuitem-content .p-menuitem-link{padding-left:8.25rem}.p-panelmenu .p-panelmenu-header-action{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;position:relative;text-decoration:none}.p-panelmenu .p-panelmenu-header-action:focus{z-index:1}.p-panelmenu .p-submenu-list{margin:0;padding:0;list-style:none}.p-panelmenu .p-menuitem-link{display:flex;align-items:center;-webkit-user-select:none;user-select:none;cursor:pointer;text-decoration:none;position:relative;overflow:hidden}.p-panelmenu .p-menuitem-text{line-height:1}.p-panelmenu .p-panelmenu-header{outline:0 none}.p-panelmenu .p-panelmenu-header .p-panelmenu-header-content{border:1px solid #dee2e6;color:#495057;background:#f8f9fa;border-radius:3px;transition:box-shadow .2s;outline-color:transparent}.p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-panelmenu-header-action{color:#495057;padding:1rem;font-weight:600}.p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-panelmenu-header-action .p-submenu-icon,.p-panelmenu .p-panelmenu-header .p-panelmenu-header-content .p-panelmenu-header-action .p-menuitem-icon{margin-right:.5rem}.p-panelmenu .p-panelmenu-header:not(.p-disabled):focus-visible .p-panelmenu-header-content{outline:0 none;outline-offset:0;box-shadow:inset 0 0 0 .2rem #a6d5fa}.p-panelmenu .p-panelmenu-header:not(.p-highlight):not(.p-disabled):hover .p-panelmenu-header-content{background:#e9ecef;border-color:#dee2e6;color:#495057}.p-panelmenu .p-panelmenu-header:not(.p-disabled).p-highlight .p-panelmenu-header-content{background:#f8f9fa;border-color:#dee2e6;color:#495057;border-bottom-right-radius:0;border-bottom-left-radius:0;margin-bottom:0}.p-panelmenu .p-panelmenu-header:not(.p-disabled).p-highlight:hover .p-panelmenu-header-content{border-color:#dee2e6;background:#e9ecef;color:#495057}.p-panelmenu .p-panelmenu-content{padding:.25rem 0;border:1px solid #dee2e6;background:#fff;color:#495057;border-top:0;border-radius:0 0 3px 3px}.p-panelmenu .p-panelmenu-content .p-panelmenu-root-list{outline:0 none}.p-panelmenu .p-panelmenu-content .p-menuitem{margin:0}.p-panelmenu .p-panelmenu-content .p-menuitem:first-child{margin-top:0}.p-panelmenu .p-panelmenu-content .p-menuitem:last-child{margin-bottom:0}.p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content{color:#495057;transition:box-shadow .2s;border-radius:0}.p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link{color:#495057;padding:.75rem 1rem;-webkit-user-select:none;user-select:none}.p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-icon{color:#6c757d;margin-right:.5rem}.p-panelmenu .p-panelmenu-content .p-menuitem>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-panelmenu .p-panelmenu-content .p-menuitem.p-highlight>.p-menuitem-content{color:#495057;background:#e9ecef}.p-panelmenu .p-panelmenu-content .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-panelmenu .p-panelmenu-content .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-menuitem-icon,.p-panelmenu .p-panelmenu-content .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-panelmenu .p-panelmenu-content .p-menuitem.p-highlight.p-focus>.p-menuitem-content{background:#e9ecef}.p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content{color:#495057;background:#e9ecef}.p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-menuitem-icon,.p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#495057}.p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-panelmenu .p-panelmenu-content .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-panelmenu .p-panelmenu-content .p-menuitem .p-menuitem-content .p-menuitem-link .p-submenu-icon{margin-right:.5rem}.p-panelmenu .p-panelmenu-content .p-menuitem-separator{border-top:1px solid #dee2e6;margin:.25rem 0}.p-panelmenu .p-panelmenu-content .p-submenu-list:not(.p-panelmenu-root-list){padding:0 0 0 1rem}.p-panelmenu .p-panelmenu-panel{margin-bottom:0}.p-panelmenu .p-panelmenu-panel .p-panelmenu-header .p-panelmenu-header-content,.p-panelmenu .p-panelmenu-panel .p-panelmenu-content{border-radius:0}.p-panelmenu .p-panelmenu-panel:not(:first-child) .p-panelmenu-header .p-panelmenu-header-content{border-top:0 none}.p-panelmenu .p-panelmenu-panel:not(:first-child) .p-panelmenu-header:not(.p-highlight):not(.p-disabled):hover .p-panelmenu-header-content,.p-panelmenu .p-panelmenu-panel:not(:first-child) .p-panelmenu-header:not(.p-disabled).p-highlight:hover .p-panelmenu-header-content{border-top:0 none}.p-panelmenu .p-panelmenu-panel:first-child .p-panelmenu-header .p-panelmenu-header-content{border-top-right-radius:3px;border-top-left-radius:3px}.p-panelmenu .p-panelmenu-panel:last-child .p-panelmenu-header:not(.p-highlight) .p-panelmenu-header-content{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.p-panelmenu .p-panelmenu-panel:last-child .p-panelmenu-content{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.p-steps{position:relative}.p-steps .p-steps-list{padding:0;margin:0;list-style-type:none;display:flex}.p-steps-item{position:relative;display:flex;justify-content:center;flex:1 1 auto;overflow:hidden}.p-steps-item .p-menuitem-link{display:inline-flex;flex-direction:column;align-items:center;overflow:hidden;text-decoration:none;cursor:pointer}.p-steps.p-steps-readonly .p-steps-item{cursor:auto}.p-steps-item.p-steps-current .p-menuitem-link{cursor:default}.p-steps-title{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}.p-steps-number{display:flex;align-items:center;justify-content:center}.p-steps-title{display:block}.p-steps .p-steps-item .p-menuitem-link{background:transparent;transition:box-shadow .2s;border-radius:3px;background:#fff;outline-color:transparent}.p-steps .p-steps-item .p-menuitem-link .p-steps-number{color:#495057;border:1px solid #e9ecef;background:#fff;min-width:2rem;height:2rem;line-height:2rem;font-size:1.143rem;z-index:1;border-radius:50%}.p-steps .p-steps-item .p-menuitem-link .p-steps-title{margin-top:.5rem;color:#6c757d}.p-steps .p-steps-item .p-menuitem-link:not(.p-disabled):focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-steps .p-steps-item.p-highlight .p-steps-number{background:#e3f2fd;color:#495057}.p-steps .p-steps-item.p-highlight .p-steps-title{font-weight:600;color:#495057}.p-steps .p-steps-item:before{content:" ";border-top:1px solid #dee2e6;width:100%;top:50%;left:0;display:block;position:absolute;margin-top:-1rem}.p-tabmenu{overflow-x:auto}.p-tabmenu-nav{display:flex;margin:0;padding:0;list-style-type:none;flex-wrap:nowrap}.p-tabmenu-nav a{cursor:pointer;-webkit-user-select:none;user-select:none;display:flex;align-items:center;position:relative;text-decoration:none;overflow:hidden}.p-tabmenu-nav a:focus{z-index:1}.p-tabmenu-nav .p-menuitem-text{line-height:1}.p-tabmenu-ink-bar{display:none;z-index:1}.p-tabmenu::-webkit-scrollbar{display:none}.p-tabmenu .p-tabmenu-nav{background:#fff;border:1px solid #dee2e6;border-width:0 0 2px 0}.p-tabmenu .p-tabmenu-nav .p-tabmenuitem{margin-right:0}.p-tabmenu .p-tabmenu-nav .p-tabmenuitem .p-menuitem-link{border:solid #dee2e6;border-width:0 0 2px 0;border-color:transparent transparent #dee2e6 transparent;background:#fff;color:#6c757d;padding:1rem;font-weight:600;border-top-right-radius:3px;border-top-left-radius:3px;transition:box-shadow .2s;margin:0 0 -2px;outline-color:transparent}.p-tabmenu .p-tabmenu-nav .p-tabmenuitem .p-menuitem-link .p-menuitem-icon{margin-right:.5rem}.p-tabmenu .p-tabmenu-nav .p-tabmenuitem .p-menuitem-link:not(.p-disabled):focus-visible{outline:0 none;outline-offset:0;box-shadow:inset 0 0 0 .2rem #a6d5fa}.p-tabmenu .p-tabmenu-nav .p-tabmenuitem:not(.p-highlight):not(.p-disabled):hover .p-menuitem-link{background:#fff;border-color:#6c757d;color:#6c757d}.p-tabmenu .p-tabmenu-nav .p-tabmenuitem.p-highlight .p-menuitem-link{background:#fff;border-color:#2196f3;color:#2196f3}.p-tieredmenu ul{margin:0;padding:0;list-style:none}.p-tieredmenu .p-submenu-list{position:absolute;min-width:100%;z-index:1;display:none}.p-tieredmenu .p-menuitem-link{cursor:pointer;display:flex;align-items:center;text-decoration:none;overflow:hidden;position:relative}.p-tieredmenu .p-menuitem-text{line-height:1}.p-tieredmenu .p-menuitem{position:relative}.p-tieredmenu .p-menuitem-link .p-submenu-icon{margin-left:auto}.p-tieredmenu .p-menuitem-active>.p-submenu-list{display:block;left:100%;top:0}.p-tieredmenu-enter-from,.p-tieredmenu-leave-active{opacity:0}.p-tieredmenu-enter-active{transition:opacity .25s}.p-tieredmenu{padding:.25rem 0;background:#fff;color:#495057;border:1px solid #dee2e6;border-radius:3px;min-width:12.5rem}.p-tieredmenu.p-tieredmenu-overlay{background:#fff;border:0 none;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f}.p-tieredmenu .p-tieredmenu-root-list{outline:0 none}.p-tieredmenu .p-submenu-list{padding:.25rem 0;background:#fff;border:0 none;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;border-radius:3px}.p-tieredmenu .p-menuitem{margin:0}.p-tieredmenu .p-menuitem:first-child{margin-top:0}.p-tieredmenu .p-menuitem:last-child{margin-bottom:0}.p-tieredmenu .p-menuitem>.p-menuitem-content{color:#495057;transition:box-shadow .2s;border-radius:0}.p-tieredmenu .p-menuitem>.p-menuitem-content .p-menuitem-link{color:#495057;padding:.75rem 1rem;-webkit-user-select:none;user-select:none}.p-tieredmenu .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-tieredmenu .p-menuitem>.p-menuitem-content .p-menuitem-link .p-menuitem-icon{color:#6c757d;margin-right:.5rem}.p-tieredmenu .p-menuitem>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-tieredmenu .p-menuitem.p-highlight>.p-menuitem-content{color:#495057;background:#e9ecef}.p-tieredmenu .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-tieredmenu .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-menuitem-icon,.p-tieredmenu .p-menuitem.p-highlight>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-tieredmenu .p-menuitem.p-highlight.p-focus>.p-menuitem-content{background:#e9ecef}.p-tieredmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content{color:#495057;background:#e9ecef}.p-tieredmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-menuitem-text{color:#495057}.p-tieredmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-menuitem-icon,.p-tieredmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content .p-menuitem-link .p-submenu-icon{color:#495057}.p-tieredmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-tieredmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-tieredmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-tieredmenu .p-menuitem:not(.p-highlight):not(.p-disabled).p-focus>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-tieredmenu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover{color:#495057;background:#e9ecef}.p-tieredmenu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-text{color:#495057}.p-tieredmenu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-menuitem-icon,.p-tieredmenu .p-menuitem:not(.p-highlight):not(.p-disabled)>.p-menuitem-content:hover .p-menuitem-link .p-submenu-icon{color:#6c757d}.p-tieredmenu .p-menuitem-separator{border-top:1px solid #dee2e6;margin:.25rem 0}.p-tieredmenu .p-submenu-icon{font-size:.875rem}.p-tieredmenu .p-submenu-icon.p-icon{width:.875rem;height:.875rem}.p-inline-message{display:inline-flex;align-items:center;justify-content:center;vertical-align:top}.p-inline-message-icon{flex-shrink:0}.p-inline-message-icon-only .p-inline-message-text{visibility:hidden;width:0}.p-fluid .p-inline-message{display:flex}.p-inline-message{padding:.5rem;margin:0;border-radius:3px}.p-inline-message.p-inline-message-info{background:#b3e5fc;border:solid #0891cf;border-width:0px;color:#044868}.p-inline-message.p-inline-message-info .p-inline-message-icon{color:#044868}.p-inline-message.p-inline-message-success{background:#c8e6c9;border:solid #439446;border-width:0px;color:#224a23}.p-inline-message.p-inline-message-success .p-inline-message-icon{color:#224a23}.p-inline-message.p-inline-message-warn{background:#ffecb3;border:solid #d9a300;border-width:0px;color:#6d5100}.p-inline-message.p-inline-message-warn .p-inline-message-icon{color:#6d5100}.p-inline-message.p-inline-message-error{background:#ffcdd2;border:solid #e60017;border-width:0px;color:#73000c}.p-inline-message.p-inline-message-error .p-inline-message-icon{color:#73000c}.p-inline-message .p-inline-message-icon{font-size:1rem;margin-right:.5rem}.p-inline-message .p-inline-message-text{font-size:1rem}.p-inline-message.p-inline-message-icon-only .p-inline-message-icon{margin-right:0}.p-message-wrapper{display:flex;align-items:center}.p-message-icon{flex-shrink:0}.p-message-close{display:flex;align-items:center;justify-content:center;flex-shrink:0}.p-message-close.p-link{margin-left:auto;overflow:hidden;position:relative}.p-message-enter-from{opacity:0}.p-message-enter-active{transition:opacity .3s}.p-message.p-message-leave-from{max-height:1000px}.p-message.p-message-leave-to{max-height:0;opacity:0;margin:0}.p-message-leave-active{overflow:hidden;transition:max-height .3s cubic-bezier(0,1,0,1),opacity .3s,margin .15s}.p-message-leave-active .p-message-close{display:none}.p-message{margin:1rem 0;border-radius:3px}.p-message .p-message-wrapper{padding:1rem 1.5rem}.p-message .p-message-close{width:2rem;height:2rem;border-radius:50%;background:transparent;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-message .p-message-close:hover{background:#ffffff80}.p-message .p-message-close:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-message.p-message-info{background:#b3e5fc;border:solid #0891cf;border-width:0 0 0 6px;color:#044868}.p-message.p-message-info .p-message-icon,.p-message.p-message-info .p-message-close{color:#044868}.p-message.p-message-success{background:#c8e6c9;border:solid #439446;border-width:0 0 0 6px;color:#224a23}.p-message.p-message-success .p-message-icon,.p-message.p-message-success .p-message-close{color:#224a23}.p-message.p-message-warn{background:#ffecb3;border:solid #d9a300;border-width:0 0 0 6px;color:#6d5100}.p-message.p-message-warn .p-message-icon,.p-message.p-message-warn .p-message-close{color:#6d5100}.p-message.p-message-error{background:#ffcdd2;border:solid #e60017;border-width:0 0 0 6px;color:#73000c}.p-message.p-message-error .p-message-icon,.p-message.p-message-error .p-message-close{color:#73000c}.p-message .p-message-text{font-size:1rem;font-weight:500}.p-message .p-message-icon{font-size:1.5rem;margin-right:.5rem}.p-message .p-icon:not(.p-message-close-icon){width:1.5rem;height:1.5rem}.p-toast{width:25rem;white-space:pre-line;word-break:break-word}.p-toast-message-icon{flex-shrink:0}.p-toast-message-content{display:flex;align-items:flex-start}.p-toast-message-text{flex:1 1 auto}.p-toast-top-center,.p-toast-bottom-center{transform:translate(-50%)}.p-toast-center{min-width:20vw;transform:translate(-50%,-50%)}.p-toast-icon-close{display:flex;align-items:center;justify-content:center;overflow:hidden;position:relative}.p-toast-icon-close.p-link{cursor:pointer}.p-toast-message-enter-from{opacity:0;-webkit-transform:translateY(50%);-ms-transform:translateY(50%);transform:translateY(50%)}.p-toast-message-leave-from{max-height:1000px}.p-toast .p-toast-message.p-toast-message-leave-to{max-height:0;opacity:0;margin-bottom:0;overflow:hidden}.p-toast-message-enter-active{-webkit-transition:transform .3s,opacity .3s;transition:transform .3s,opacity .3s}.p-toast-message-leave-active{-webkit-transition:max-height .45s cubic-bezier(0,1,0,1),opacity .3s,margin-bottom .3s;transition:max-height .45s cubic-bezier(0,1,0,1),opacity .3s,margin-bottom .3s}.p-toast{opacity:.9}.p-toast .p-toast-message{margin:0 0 1rem;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;border-radius:3px}.p-toast .p-toast-message .p-toast-message-content{padding:1rem;border-width:0 0 0 6px}.p-toast .p-toast-message .p-toast-message-content .p-toast-message-text{margin:0 0 0 1rem}.p-toast .p-toast-message .p-toast-message-content .p-toast-message-icon{font-size:2rem}.p-toast .p-toast-message .p-toast-message-content .p-toast-message-icon.p-icon{width:2rem;height:2rem}.p-toast .p-toast-message .p-toast-message-content .p-toast-summary{font-weight:700}.p-toast .p-toast-message .p-toast-message-content .p-toast-detail{margin:.5rem 0 0}.p-toast .p-toast-message .p-toast-icon-close{width:2rem;height:2rem;border-radius:50%;background:transparent;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-toast .p-toast-message .p-toast-icon-close:hover{background:#ffffff80}.p-toast .p-toast-message .p-toast-icon-close:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-toast .p-toast-message.p-toast-message-info{background:#b3e5fc;border:solid #0891cf;border-width:0 0 0 6px;color:#044868}.p-toast .p-toast-message.p-toast-message-info .p-toast-message-icon,.p-toast .p-toast-message.p-toast-message-info .p-toast-icon-close{color:#044868}.p-toast .p-toast-message.p-toast-message-success{background:#c8e6c9;border:solid #439446;border-width:0 0 0 6px;color:#224a23}.p-toast .p-toast-message.p-toast-message-success .p-toast-message-icon,.p-toast .p-toast-message.p-toast-message-success .p-toast-icon-close{color:#224a23}.p-toast .p-toast-message.p-toast-message-warn{background:#ffecb3;border:solid #d9a300;border-width:0 0 0 6px;color:#6d5100}.p-toast .p-toast-message.p-toast-message-warn .p-toast-message-icon,.p-toast .p-toast-message.p-toast-message-warn .p-toast-icon-close{color:#6d5100}.p-toast .p-toast-message.p-toast-message-error{background:#ffcdd2;border:solid #e60017;border-width:0 0 0 6px;color:#73000c}.p-toast .p-toast-message.p-toast-message-error .p-toast-message-icon,.p-toast .p-toast-message.p-toast-message-error .p-toast-icon-close{color:#73000c}.p-galleria-content{display:flex;flex-direction:column}.p-galleria-item-wrapper{display:flex;flex-direction:column;position:relative}.p-galleria-item-container{position:relative;display:flex;height:100%}.p-galleria-item-nav{position:absolute;top:50%;margin-top:-.5rem;display:inline-flex;justify-content:center;align-items:center;overflow:hidden}.p-galleria-item-prev{left:0;border-top-left-radius:0;border-bottom-left-radius:0}.p-galleria-item-next{right:0;border-top-right-radius:0;border-bottom-right-radius:0}.p-galleria-item{display:flex;justify-content:center;align-items:center;height:100%;width:100%}.p-galleria-item-nav-onhover .p-galleria-item-nav{pointer-events:none;opacity:0;transition:opacity .2s ease-in-out}.p-galleria-item-nav-onhover .p-galleria-item-wrapper:hover .p-galleria-item-nav{pointer-events:all;opacity:1}.p-galleria-item-nav-onhover .p-galleria-item-wrapper:hover .p-galleria-item-nav.p-disabled{pointer-events:none}.p-galleria-caption{position:absolute;bottom:0;left:0;width:100%}.p-galleria-thumbnail-wrapper{display:flex;flex-direction:column;overflow:auto;flex-shrink:0}.p-galleria-thumbnail-prev,.p-galleria-thumbnail-next{align-self:center;flex:0 0 auto;display:flex;justify-content:center;align-items:center;overflow:hidden;position:relative}.p-galleria-thumbnail-prev span,.p-galleria-thumbnail-next span{display:flex;justify-content:center;align-items:center}.p-galleria-thumbnail-container{display:flex;flex-direction:row}.p-galleria-thumbnail-items-container{overflow:hidden;width:100%}.p-galleria-thumbnail-items{display:flex}.p-galleria-thumbnail-item{overflow:auto;display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:.5}.p-galleria-thumbnail-item:hover{opacity:1;transition:opacity .3s}.p-galleria-thumbnail-item-current{opacity:1}.p-galleria-thumbnails-left .p-galleria-content,.p-galleria-thumbnails-right .p-galleria-content,.p-galleria-thumbnails-left .p-galleria-item-wrapper,.p-galleria-thumbnails-right .p-galleria-item-wrapper{flex-direction:row}.p-galleria-thumbnails-left .p-galleria-item-wrapper,.p-galleria-thumbnails-top .p-galleria-item-wrapper{order:2}.p-galleria-thumbnails-left .p-galleria-thumbnail-wrapper,.p-galleria-thumbnails-top .p-galleria-thumbnail-wrapper{order:1}.p-galleria-thumbnails-left .p-galleria-thumbnail-container,.p-galleria-thumbnails-right .p-galleria-thumbnail-container{flex-direction:column;flex-grow:1}.p-galleria-thumbnails-left .p-galleria-thumbnail-items,.p-galleria-thumbnails-right .p-galleria-thumbnail-items{flex-direction:column;height:100%}.p-galleria-indicators{display:flex;align-items:center;justify-content:center}.p-galleria-indicator>button{display:inline-flex;align-items:center}.p-galleria-indicators-left .p-galleria-item-wrapper,.p-galleria-indicators-right .p-galleria-item-wrapper{flex-direction:row;align-items:center}.p-galleria-indicators-left .p-galleria-item-container,.p-galleria-indicators-top .p-galleria-item-container{order:2}.p-galleria-indicators-left .p-galleria-indicators,.p-galleria-indicators-top .p-galleria-indicators{order:1}.p-galleria-indicators-left .p-galleria-indicators,.p-galleria-indicators-right .p-galleria-indicators{flex-direction:column}.p-galleria-indicator-onitem .p-galleria-indicators{position:absolute;display:flex;z-index:1}.p-galleria-indicator-onitem.p-galleria-indicators-top .p-galleria-indicators{top:0;left:0;width:100%;align-items:flex-start}.p-galleria-indicator-onitem.p-galleria-indicators-right .p-galleria-indicators{right:0;top:0;height:100%;align-items:flex-end}.p-galleria-indicator-onitem.p-galleria-indicators-bottom .p-galleria-indicators{bottom:0;left:0;width:100%;align-items:flex-end}.p-galleria-indicator-onitem.p-galleria-indicators-left .p-galleria-indicators{left:0;top:0;height:100%;align-items:flex-start}.p-galleria-mask{position:fixed;top:0;left:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center}.p-galleria-close{position:absolute;top:0;right:0;display:flex;justify-content:center;align-items:center;overflow:hidden}.p-galleria-mask .p-galleria-item-nav{position:fixed;top:50%;margin-top:-.5rem}.p-galleria-enter-active{transition:all .15s cubic-bezier(0,0,.2,1)}.p-galleria-leave-active{transition:all .15s cubic-bezier(.4,0,.2,1)}.p-galleria-enter-from,.p-galleria-leave-to{opacity:0;transform:scale(.7)}.p-galleria-enter-active .p-galleria-item-nav{opacity:0}.p-items-hidden .p-galleria-thumbnail-item{visibility:hidden}.p-items-hidden .p-galleria-thumbnail-item.p-galleria-thumbnail-item-active{visibility:visible}.p-galleria .p-galleria-close{margin:.5rem;background:transparent;color:#f8f9fa;width:4rem;height:4rem;transition:background-color .2s,color .2s,box-shadow .2s;border-radius:50%}.p-galleria .p-galleria-close .p-galleria-close-icon{font-size:2rem}.p-galleria .p-galleria-close .p-icon{width:2rem;height:2rem}.p-galleria .p-galleria-close:hover{background:#ffffff1a;color:#f8f9fa}.p-galleria .p-galleria-item-nav{background:transparent;color:#f8f9fa;width:4rem;height:4rem;transition:background-color .2s,color .2s,box-shadow .2s;border-radius:3px;margin:0 .5rem}.p-galleria .p-galleria-item-nav .p-galleria-item-prev-icon,.p-galleria .p-galleria-item-nav .p-galleria-item-next-icon{font-size:2rem}.p-galleria .p-galleria-item-nav .p-icon{width:2rem;height:2rem}.p-galleria .p-galleria-item-nav:not(.p-disabled):hover{background:#ffffff1a;color:#f8f9fa}.p-galleria .p-galleria-caption{background:#00000080;color:#f8f9fa;padding:1rem}.p-galleria .p-galleria-indicators{padding:1rem}.p-galleria .p-galleria-indicators .p-galleria-indicator button{background-color:#e9ecef;width:1rem;height:1rem;transition:background-color .2s,color .2s,box-shadow .2s;border-radius:50%}.p-galleria .p-galleria-indicators .p-galleria-indicator button:hover{background:#dee2e6}.p-galleria .p-galleria-indicators .p-galleria-indicator.p-highlight button{background:#e3f2fd;color:#495057}.p-galleria.p-galleria-indicators-bottom .p-galleria-indicator,.p-galleria.p-galleria-indicators-top .p-galleria-indicator{margin-right:.5rem}.p-galleria.p-galleria-indicators-left .p-galleria-indicator,.p-galleria.p-galleria-indicators-right .p-galleria-indicator{margin-bottom:.5rem}.p-galleria.p-galleria-indicator-onitem .p-galleria-indicators{background:#00000080}.p-galleria.p-galleria-indicator-onitem .p-galleria-indicators .p-galleria-indicator button{background:#fff6}.p-galleria.p-galleria-indicator-onitem .p-galleria-indicators .p-galleria-indicator button:hover{background:#fff9}.p-galleria.p-galleria-indicator-onitem .p-galleria-indicators .p-galleria-indicator.p-highlight button{background:#e3f2fd;color:#495057}.p-galleria .p-galleria-thumbnail-container{background:#000000e6;padding:1rem .25rem}.p-galleria .p-galleria-thumbnail-container .p-galleria-thumbnail-prev,.p-galleria .p-galleria-thumbnail-container .p-galleria-thumbnail-next{margin:.5rem;background-color:transparent;color:#f8f9fa;width:2rem;height:2rem;transition:background-color .2s,color .2s,box-shadow .2s;border-radius:50%}.p-galleria .p-galleria-thumbnail-container .p-galleria-thumbnail-prev:hover,.p-galleria .p-galleria-thumbnail-container .p-galleria-thumbnail-next:hover{background:#ffffff1a;color:#f8f9fa}.p-galleria .p-galleria-thumbnail-container .p-galleria-thumbnail-item-content{outline-color:transparent}.p-galleria .p-galleria-thumbnail-container .p-galleria-thumbnail-item-content:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-galleria-mask{--maskbg: rgba(0, 0, 0, .9)}.p-image-mask{display:flex;align-items:center;justify-content:center}.p-image-preview-container{position:relative;display:inline-block;line-height:0}.p-image-preview-indicator{position:absolute;left:0;top:0;width:100%;height:100%;display:flex;align-items:center;justify-content:center;opacity:0;transition:opacity .3s;border:none;padding:0}.p-image-preview-container:hover>.p-image-preview-indicator{opacity:1;cursor:pointer}.p-image-preview-container>img{cursor:pointer}.p-image-toolbar{position:absolute;top:0;right:0;display:flex;z-index:1}.p-image-action.p-link{display:flex;justify-content:center;align-items:center}.p-image-action.p-disabled{pointer-events:auto}.p-image-preview{transition:transform .15s;max-width:100vw;max-height:100vh}.p-image-preview-enter-active{transition:all .15s cubic-bezier(0,0,.2,1)}.p-image-preview-leave-active{transition:all .15s cubic-bezier(.4,0,.2,1)}.p-image-preview-enter-from,.p-image-preview-leave-to{opacity:0;transform:scale(.7)}.p-image-mask{--maskbg: rgba(0, 0, 0, .9)}.p-image-preview-indicator{background-color:transparent;color:#f8f9fa;transition:background-color .2s,color .2s,box-shadow .2s}.p-image-preview-indicator .p-icon{width:1.5rem;height:1.5rem}.p-image-preview-container:hover>.p-image-preview-indicator{background-color:#00000080}.p-image-toolbar{padding:1rem}.p-image-action.p-link{color:#f8f9fa;background-color:transparent;width:3rem;height:3rem;border-radius:50%;transition:background-color .2s,color .2s,box-shadow .2s;margin-right:.5rem}.p-image-action.p-link:last-child{margin-right:0}.p-image-action.p-link:hover{color:#f8f9fa;background-color:#ffffff1a}.p-image-action.p-link i{font-size:1.5rem}.p-image-action.p-link .p-icon{width:1.5rem;height:1.5rem}.p-avatar{display:inline-flex;align-items:center;justify-content:center;width:2rem;height:2rem;font-size:1rem}.p-avatar.p-avatar-image{background-color:transparent}.p-avatar.p-avatar-circle,.p-avatar-circle img{border-radius:50%}.p-avatar .p-avatar-icon{font-size:1rem}.p-avatar img{width:100%;height:100%}.p-avatar-group .p-avatar+.p-avatar{margin-left:-1rem}.p-avatar-group{display:flex;align-items:center}.p-avatar{background-color:#dee2e6;border-radius:3px}.p-avatar.p-avatar-lg{width:3rem;height:3rem;font-size:1.5rem}.p-avatar.p-avatar-lg .p-avatar-icon{font-size:1.5rem}.p-avatar.p-avatar-xl{width:4rem;height:4rem;font-size:2rem}.p-avatar.p-avatar-xl .p-avatar-icon{font-size:2rem}.p-avatar-group .p-avatar{border:2px solid #ffffff}.p-badge{display:inline-block;border-radius:10px;text-align:center;padding:0 .5rem}.p-overlay-badge{position:relative}.p-overlay-badge .p-badge{position:absolute;top:0;right:0;transform:translate(50%,-50%);transform-origin:100% 0;margin:0}.p-badge.p-badge-dot{width:.5rem;min-width:.5rem;height:.5rem;border-radius:50%;padding:0}.p-badge-no-gutter{padding:0;border-radius:50%}.p-badge{background:#2196f3;color:#fff;font-size:.75rem;font-weight:700;min-width:1.5rem;height:1.5rem;line-height:1.5rem}.p-badge.p-badge-secondary{background-color:#607d8b;color:#fff}.p-badge.p-badge-success{background-color:#689f38;color:#fff}.p-badge.p-badge-info{background-color:#0288d1;color:#fff}.p-badge.p-badge-warning{background-color:#fbc02d;color:#212529}.p-badge.p-badge-danger{background-color:#d32f2f;color:#fff}.p-badge.p-badge-lg{font-size:1.125rem;min-width:2.25rem;height:2.25rem;line-height:2.25rem}.p-badge.p-badge-xl{font-size:1.5rem;min-width:3rem;height:3rem;line-height:3rem}.p-blockui-container{position:relative}.p-blockui.p-component-overlay{position:absolute}.p-blockui-document.p-component-overlay{position:fixed}.p-blockui{border-radius:3px}.p-chip{display:inline-flex;align-items:center}.p-chip-text,.p-chip-icon.pi{line-height:1.5}.p-chip-remove-icon{line-height:1.5;cursor:pointer}.p-chip img{border-radius:50%}.p-chip{background-color:#dee2e6;color:#495057;border-radius:16px;padding:0 .5rem}.p-chip .p-chip-text{line-height:1.5;margin-top:.25rem;margin-bottom:.25rem}.p-chip .p-chip-icon{margin-right:.5rem}.p-chip img{width:2rem;height:2rem;margin-left:-.5rem;margin-right:.5rem}.p-chip .p-chip-remove-icon{margin-left:.5rem;border-radius:3px;transition:background-color .2s,color .2s,box-shadow .2s;outline-color:transparent}.p-chip .p-chip-remove-icon:focus-visible{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-chip .p-chip-remove-icon:focus{outline:0 none}.p-inplace .p-inplace-display{display:inline;cursor:pointer}.p-inplace .p-inplace-content{display:inline}.p-fluid .p-inplace.p-inplace-closable .p-inplace-content{display:flex}.p-fluid .p-inplace.p-inplace-closable .p-inplace-content>.p-inputtext{flex:1 1 auto;width:1%}.p-inplace .p-inplace-display{padding:.5rem;border-radius:3px;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;outline-color:transparent}.p-inplace .p-inplace-display:not(.p-disabled):hover{background:#e9ecef;color:#495057}.p-inplace .p-inplace-display:focus{outline:0 none;outline-offset:0;box-shadow:0 0 0 .2rem #a6d5fa}.p-metergroup,.p-metergroup-meters{display:flex}.p-metergroup-vertical .p-metergroup-meters{flex-direction:column}.p-metergroup-labels{display:flex;flex-wrap:wrap;margin:0;padding:0;list-style-type:none}.p-metergroup-vertical .p-metergroup-labels{align-items:start}.p-metergroup-labels-vertical{flex-direction:column}.p-metergroup-label{display:inline-flex;align-items:center}.p-metergroup-label-marker{display:inline-flex}.p-metergroup{gap:1rem}.p-metergroup .p-metergroup-meters{background:#dee2e6;border-radius:3px}.p-metergroup .p-metergroup-meter{border:0 none;background:#2196f3}.p-metergroup .p-metergroup-labels .p-metergroup-label{gap:.5rem}.p-metergroup .p-metergroup-labels .p-metergroup-label-marker{background:#2196f3;width:.5rem;height:.5rem;border-radius:100%}.p-metergroup .p-metergroup-labels .p-metergroup-label-icon{width:1rem;height:1rem}.p-metergroup .p-metergroup-labels.p-metergroup-labels-vertical{gap:.5rem}.p-metergroup .p-metergroup-labels.p-metergroup-labels-horizontal{gap:1rem}.p-metergroup.p-metergroup-horizontal{flex-direction:column}.p-metergroup.p-metergroup-horizontal .p-metergroup-meters{height:.5rem}.p-metergroup.p-metergroup-horizontal .p-metergroup-meter:first-of-type{border-top-left-radius:3px;border-bottom-left-radius:3px}.p-metergroup.p-metergroup-horizontal .p-metergroup-meter:last-of-type{border-top-right-radius:3px;border-bottom-right-radius:3px}.p-metergroup.p-metergroup-vertical{flex-direction:row}.p-metergroup.p-metergroup-vertical .p-metergroup-meters{width:.5rem;height:100%}.p-metergroup.p-metergroup-vertical .p-metergroup-meter:first-of-type{border-top-left-radius:3px;border-top-right-radius:3px}.p-metergroup.p-metergroup-vertical .p-metergroup-meter:last-of-type{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.p-progressbar{position:relative;overflow:hidden}.p-progressbar-determinate .p-progressbar-value{height:100%;width:0%;position:absolute;display:none;border:0 none;display:flex;align-items:center;justify-content:center;overflow:hidden}.p-progressbar-determinate .p-progressbar-label{display:inline-flex}.p-progressbar-determinate .p-progressbar-value-animate{transition:width 1s ease-in-out}.p-progressbar-indeterminate .p-progressbar-value:before{content:"";position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right;-webkit-animation:p-progressbar-indeterminate-anim 2.1s cubic-bezier(.65,.815,.735,.395) infinite;animation:p-progressbar-indeterminate-anim 2.1s cubic-bezier(.65,.815,.735,.395) infinite}.p-progressbar-indeterminate .p-progressbar-value:after{content:"";position:absolute;background-color:inherit;top:0;left:0;bottom:0;will-change:left,right;-webkit-animation:p-progressbar-indeterminate-anim-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;animation:p-progressbar-indeterminate-anim-short 2.1s cubic-bezier(.165,.84,.44,1) infinite;-webkit-animation-delay:1.15s;animation-delay:1.15s}@-webkit-keyframes p-progressbar-indeterminate-anim{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@keyframes p-progressbar-indeterminate-anim{0%{left:-35%;right:100%}60%{left:100%;right:-90%}to{left:100%;right:-90%}}@-webkit-keyframes p-progressbar-indeterminate-anim-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}@keyframes p-progressbar-indeterminate-anim-short{0%{left:-200%;right:100%}60%{left:107%;right:-8%}to{left:107%;right:-8%}}.p-progressbar{border:0 none;height:1.5rem;background:#dee2e6;border-radius:3px}.p-progressbar .p-progressbar-value{border:0 none;margin:0;background:#2196f3}.p-progressbar .p-progressbar-label{color:#fff;line-height:1.5rem}.p-progress-spinner{position:relative;margin:0 auto;width:100px;height:100px;display:inline-block}.p-progress-spinner:before{content:"";display:block;padding-top:100%}.p-progress-spinner-svg{height:100%;transform-origin:center center;width:100%;position:absolute;top:0;bottom:0;left:0;right:0;margin:auto}.p-progress-spinner-svg{animation:p-progress-spinner-rotate 2s linear infinite}.p-progress-spinner-circle{stroke-dasharray:89,200;stroke-dashoffset:0;stroke:#73000c;animation:p-progress-spinner-dash 1.5s ease-in-out infinite,p-progress-spinner-color 6s ease-in-out infinite;stroke-linecap:round}@keyframes p-progress-spinner-rotate{to{transform:rotate(360deg)}}@keyframes p-progress-spinner-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:89,200;stroke-dashoffset:-35px}to{stroke-dasharray:89,200;stroke-dashoffset:-124px}}@keyframes p-progress-spinner-color{to,0%{stroke:#73000c}40%{stroke:#044868}66%{stroke:#224a23}80%,90%{stroke:#6d5100}}.p-ripple{overflow:hidden;position:relative}.p-ink{display:block;position:absolute;background:#ffffff80;border-radius:100%;transform:scale(0);pointer-events:none}.p-ink-active{animation:ripple .4s linear}.p-ripple-disabled .p-ink{display:none}@keyframes ripple{to{opacity:0;transform:scale(2.5)}}.p-scrolltop{position:fixed;bottom:20px;right:20px;display:flex;align-items:center;justify-content:center}.p-scrolltop-sticky{position:sticky}.p-scrolltop-sticky.p-link{margin-left:auto}.p-scrolltop-enter-from{opacity:0}.p-scrolltop-enter-active{transition:opacity .15s}.p-scrolltop.p-scrolltop-leave-to{opacity:0}.p-scrolltop-leave-active{transition:opacity .15s}.p-scrolltop{width:3rem;height:3rem;border-radius:50%;box-shadow:0 2px 4px -1px #0003,0 4px 5px #00000024,0 1px 10px #0000001f;transition:background-color .2s,color .2s,box-shadow .2s}.p-scrolltop.p-link{background:#000000b3}.p-scrolltop.p-link:hover{background:#000c}.p-scrolltop .p-scrolltop-icon{font-size:1.5rem;color:#f8f9fa}.p-scrolltop .p-scrolltop-icon.p-icon{width:1.5rem;height:1.5rem}.p-skeleton{overflow:hidden}.p-skeleton:after{content:"";animation:p-skeleton-animation 1.2s infinite;height:100%;left:0;position:absolute;right:0;top:0;transform:translate(-100%);z-index:1}.p-skeleton.p-skeleton-circle{border-radius:50%}.p-skeleton-none:after{animation:none}@keyframes p-skeleton-animation{0%{transform:translate(-100%)}to{transform:translate(100%)}}.p-skeleton{background-color:#e9ecef;border-radius:3px}.p-skeleton:after{background:linear-gradient(90deg,#fff0,#fff6,#fff0)}.p-tag{display:inline-flex;align-items:center;justify-content:center}.p-tag-icon,.p-tag-value,.p-tag-icon.pi{line-height:1.5}.p-tag.p-tag-rounded{border-radius:10rem}.p-tag{background:#2196f3;color:#fff;font-size:.75rem;font-weight:700;padding:.25rem .4rem;border-radius:3px}.p-tag.p-tag-success{background-color:#689f38;color:#fff}.p-tag.p-tag-info{background-color:#0288d1;color:#fff}.p-tag.p-tag-warning{background-color:#fbc02d;color:#212529}.p-tag.p-tag-danger{background-color:#d32f2f;color:#fff}.p-tag .p-tag-icon{font-size:.75rem}.p-tag .p-tag-icon:not(:last-child){margin-right:.25rem}.p-tag .p-tag-icon.p-icon{width:.75rem;height:.75rem}.p-terminal{height:18rem;overflow:auto}.p-terminal-prompt-container{display:flex;align-items:center}.p-terminal-input{flex:1 1 auto;border:0 none;background-color:transparent;color:inherit;padding:0;outline:0 none}.p-terminal-input::-ms-clear{display:none}.p-terminal{background:#fff;color:#495057;border:1px solid #dee2e6;padding:1rem}.p-terminal .p-terminal-input{font-family:var(--font-family);font-feature-settings:var(--font-feature-settings, normal);font-size:1rem}}@layer primevue{.p-carousel .p-carousel-indicators .p-carousel-indicator.p-highlight button,.p-galleria .p-galleria-indicators .p-galleria-indicator.p-highlight button{background-color:#2196f3}.p-datatable .p-datatable-tbody>tr.p-datatable-dragpoint-top>td{box-shadow:inset 0 2px #2196f3}.p-datatable .p-datatable-tbody>tr.p-datatable-dragpoint-bottom>td{box-shadow:inset 0 -2px #2196f3}}@font-face{font-family:primeicons;font-display:block;src:url(/roa2web/assets/primeicons.Dk_eWBPK.eot);src:url(/roa2web/assets/primeicons.Dk_eWBPK.eot?#iefix) format("embedded-opentype"),url(/roa2web/assets/primeicons.DsZ1W7-Z.woff2) format("woff2"),url(/roa2web/assets/primeicons.CCFeZR6K.woff) format("woff"),url(/roa2web/assets/primeicons.NDVQFXzF.ttf) format("truetype"),url(/roa2web/assets/primeicons.BubJZjaf.svg?#primeicons) format("svg");font-weight:400;font-style:normal}.pi{font-family:primeicons;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.pi:before{--webkit-backface-visibility:hidden;backface-visibility:hidden}.pi-fw{width:1.28571429em;text-align:center}.pi-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.pi-eraser:before{content:""}.pi-stopwatch:before{content:""}.pi-verified:before{content:""}.pi-delete-left:before{content:""}.pi-hourglass:before{content:""}.pi-truck:before{content:""}.pi-wrench:before{content:""}.pi-microphone:before{content:""}.pi-megaphone:before{content:""}.pi-arrow-right-arrow-left:before{content:""}.pi-bitcoin:before{content:""}.pi-file-edit:before{content:""}.pi-language:before{content:""}.pi-file-export:before{content:""}.pi-file-import:before{content:""}.pi-file-word:before{content:""}.pi-gift:before{content:""}.pi-cart-plus:before{content:""}.pi-thumbs-down-fill:before{content:""}.pi-thumbs-up-fill:before{content:""}.pi-arrows-alt:before{content:""}.pi-calculator:before{content:""}.pi-sort-alt-slash:before{content:""}.pi-arrows-h:before{content:""}.pi-arrows-v:before{content:""}.pi-pound:before{content:""}.pi-prime:before{content:""}.pi-chart-pie:before{content:""}.pi-reddit:before{content:""}.pi-code:before{content:""}.pi-sync:before{content:""}.pi-shopping-bag:before{content:""}.pi-server:before{content:""}.pi-database:before{content:""}.pi-hashtag:before{content:""}.pi-bookmark-fill:before{content:""}.pi-filter-fill:before{content:""}.pi-heart-fill:before{content:""}.pi-flag-fill:before{content:""}.pi-circle:before{content:""}.pi-circle-fill:before{content:""}.pi-bolt:before{content:""}.pi-history:before{content:""}.pi-box:before{content:""}.pi-at:before{content:""}.pi-arrow-up-right:before{content:""}.pi-arrow-up-left:before{content:""}.pi-arrow-down-left:before{content:""}.pi-arrow-down-right:before{content:""}.pi-telegram:before{content:""}.pi-stop-circle:before{content:""}.pi-stop:before{content:""}.pi-whatsapp:before{content:""}.pi-building:before{content:""}.pi-qrcode:before{content:""}.pi-car:before{content:""}.pi-instagram:before{content:""}.pi-linkedin:before{content:""}.pi-send:before{content:""}.pi-slack:before{content:""}.pi-sun:before{content:""}.pi-moon:before{content:""}.pi-vimeo:before{content:""}.pi-youtube:before{content:""}.pi-flag:before{content:""}.pi-wallet:before{content:""}.pi-map:before{content:""}.pi-link:before{content:""}.pi-credit-card:before{content:""}.pi-discord:before{content:""}.pi-percentage:before{content:""}.pi-euro:before{content:""}.pi-book:before{content:""}.pi-shield:before{content:""}.pi-paypal:before{content:""}.pi-amazon:before{content:""}.pi-phone:before{content:""}.pi-filter-slash:before{content:""}.pi-facebook:before{content:""}.pi-github:before{content:""}.pi-twitter:before{content:""}.pi-step-backward-alt:before{content:""}.pi-step-forward-alt:before{content:""}.pi-forward:before{content:""}.pi-backward:before{content:""}.pi-fast-backward:before{content:""}.pi-fast-forward:before{content:""}.pi-pause:before{content:""}.pi-play:before{content:""}.pi-compass:before{content:""}.pi-id-card:before{content:""}.pi-ticket:before{content:""}.pi-file-o:before{content:""}.pi-reply:before{content:""}.pi-directions-alt:before{content:""}.pi-directions:before{content:""}.pi-thumbs-up:before{content:""}.pi-thumbs-down:before{content:""}.pi-sort-numeric-down-alt:before{content:""}.pi-sort-numeric-up-alt:before{content:""}.pi-sort-alpha-down-alt:before{content:""}.pi-sort-alpha-up-alt:before{content:""}.pi-sort-numeric-down:before{content:""}.pi-sort-numeric-up:before{content:""}.pi-sort-alpha-down:before{content:""}.pi-sort-alpha-up:before{content:""}.pi-sort-alt:before{content:""}.pi-sort-amount-up:before{content:""}.pi-sort-amount-down:before{content:""}.pi-sort-amount-down-alt:before{content:""}.pi-sort-amount-up-alt:before{content:""}.pi-palette:before{content:""}.pi-undo:before{content:""}.pi-desktop:before{content:""}.pi-sliders-v:before{content:""}.pi-sliders-h:before{content:""}.pi-search-plus:before{content:""}.pi-search-minus:before{content:""}.pi-file-excel:before{content:""}.pi-file-pdf:before{content:""}.pi-check-square:before{content:""}.pi-chart-line:before{content:""}.pi-user-edit:before{content:""}.pi-exclamation-circle:before{content:""}.pi-android:before{content:""}.pi-google:before{content:""}.pi-apple:before{content:""}.pi-microsoft:before{content:""}.pi-heart:before{content:""}.pi-mobile:before{content:""}.pi-tablet:before{content:""}.pi-key:before{content:""}.pi-shopping-cart:before{content:""}.pi-comments:before{content:""}.pi-comment:before{content:""}.pi-briefcase:before{content:""}.pi-bell:before{content:""}.pi-paperclip:before{content:""}.pi-share-alt:before{content:""}.pi-envelope:before{content:""}.pi-volume-down:before{content:""}.pi-volume-up:before{content:""}.pi-volume-off:before{content:""}.pi-eject:before{content:""}.pi-money-bill:before{content:""}.pi-images:before{content:""}.pi-image:before{content:""}.pi-sign-in:before{content:""}.pi-sign-out:before{content:""}.pi-wifi:before{content:""}.pi-sitemap:before{content:""}.pi-chart-bar:before{content:""}.pi-camera:before{content:""}.pi-dollar:before{content:""}.pi-lock-open:before{content:""}.pi-table:before{content:""}.pi-map-marker:before{content:""}.pi-list:before{content:""}.pi-eye-slash:before{content:""}.pi-eye:before{content:""}.pi-folder-open:before{content:""}.pi-folder:before{content:""}.pi-video:before{content:""}.pi-inbox:before{content:""}.pi-lock:before{content:""}.pi-unlock:before{content:""}.pi-tags:before{content:""}.pi-tag:before{content:""}.pi-power-off:before{content:""}.pi-save:before{content:""}.pi-question-circle:before{content:""}.pi-question:before{content:""}.pi-copy:before{content:""}.pi-file:before{content:""}.pi-clone:before{content:""}.pi-calendar-times:before{content:""}.pi-calendar-minus:before{content:""}.pi-calendar-plus:before{content:""}.pi-ellipsis-v:before{content:""}.pi-ellipsis-h:before{content:""}.pi-bookmark:before{content:""}.pi-globe:before{content:""}.pi-replay:before{content:""}.pi-filter:before{content:""}.pi-print:before{content:""}.pi-align-right:before{content:""}.pi-align-left:before{content:""}.pi-align-center:before{content:""}.pi-align-justify:before{content:""}.pi-cog:before{content:""}.pi-cloud-download:before{content:""}.pi-cloud-upload:before{content:""}.pi-cloud:before{content:""}.pi-pencil:before{content:""}.pi-users:before{content:""}.pi-clock:before{content:""}.pi-user-minus:before{content:""}.pi-user-plus:before{content:""}.pi-trash:before{content:""}.pi-external-link:before{content:""}.pi-window-maximize:before{content:""}.pi-window-minimize:before{content:""}.pi-refresh:before{content:""}.pi-user:before{content:""}.pi-exclamation-triangle:before{content:""}.pi-calendar:before{content:""}.pi-chevron-circle-left:before{content:""}.pi-chevron-circle-down:before{content:""}.pi-chevron-circle-right:before{content:""}.pi-chevron-circle-up:before{content:""}.pi-angle-double-down:before{content:""}.pi-angle-double-left:before{content:""}.pi-angle-double-right:before{content:""}.pi-angle-double-up:before{content:""}.pi-angle-down:before{content:""}.pi-angle-left:before{content:""}.pi-angle-right:before{content:""}.pi-angle-up:before{content:""}.pi-upload:before{content:""}.pi-download:before{content:""}.pi-ban:before{content:""}.pi-star-fill:before{content:""}.pi-star:before{content:""}.pi-chevron-left:before{content:""}.pi-chevron-right:before{content:""}.pi-chevron-down:before{content:""}.pi-chevron-up:before{content:""}.pi-caret-left:before{content:""}.pi-caret-right:before{content:""}.pi-caret-down:before{content:""}.pi-caret-up:before{content:""}.pi-search:before{content:""}.pi-check:before{content:""}.pi-check-circle:before{content:""}.pi-times:before{content:""}.pi-times-circle:before{content:""}.pi-plus:before{content:""}.pi-plus-circle:before{content:""}.pi-minus:before{content:""}.pi-minus-circle:before{content:""}.pi-circle-on:before{content:""}.pi-circle-off:before{content:""}.pi-sort-down:before{content:""}.pi-sort-up:before{content:""}.pi-sort:before{content:""}.pi-step-backward:before{content:""}.pi-step-forward:before{content:""}.pi-th-large:before{content:""}.pi-arrow-down:before{content:""}.pi-arrow-left:before{content:""}.pi-arrow-right:before{content:""}.pi-arrow-up:before{content:""}.pi-bars:before{content:""}.pi-arrow-circle-down:before{content:""}.pi-arrow-circle-left:before{content:""}.pi-arrow-circle-right:before{content:""}.pi-arrow-circle-up:before{content:""}.pi-info:before{content:""}.pi-info-circle:before{content:""}.pi-home:before{content:""}.pi-spinner:before{content:""}:root{--header-height: 60px;--sidebar-width: 280px;--z-header: 100;--z-modal: 1000;--z-modal-backdrop: 999}[data-theme=dark]{--surface-card: #1e293b;--surface-ground: #0f172a;--surface-border: #475569;--surface-hover: #334155;--text-color: #f9fafb;--text-color-secondary: #94a3b8}*{box-sizing:border-box}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.roa-card{background:var(--surface-card)!important;border-radius:12px;box-shadow:0 2px 8px #00000014;padding:1.5rem;margin-bottom:1.5rem;border:1px solid var(--surface-border)}.roa-card-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:1.5rem;padding-bottom:1rem;border-bottom:1px solid var(--surface-border)}.roa-card-title{font-size:1.25rem;font-weight:600;color:var(--text-color);margin:0;display:flex;align-items:center;gap:.5rem}.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:1.5rem}.form-field{display:flex;flex-direction:column;gap:.5rem}.form-field label{font-weight:500;color:var(--text-color-secondary);font-size:.9rem}.form-field .p-inputtext,.form-field .p-dropdown,.form-field .p-calendar,.form-field .p-inputnumber{width:100%}.form-field-full{grid-column:1 / -1}.status-badge{padding:.25rem .75rem;border-radius:20px;font-size:.8rem;font-weight:600;text-transform:uppercase}.status-draft{background-color:var(--blue-50);color:var(--blue-600)}.status-pending{background-color:var(--yellow-50);color:var(--yellow-700)}.status-approved{background-color:var(--green-50);color:var(--green-600)}.status-rejected{background-color:var(--red-50);color:var(--red-600)}.status-synced{background-color:var(--green-50);color:var(--green-700)}.data-table-container{overflow-x:auto}.p-datatable .p-datatable-header{background:transparent;border:none;padding:0 0 1rem}.p-datatable .p-datatable-thead>tr>th{background:var(--surface-hover);color:var(--text-color);font-weight:600}.button-group{display:flex;gap:.5rem;flex-wrap:wrap}.upload-area{border:2px dashed var(--surface-border);border-radius:12px;padding:2rem;text-align:center;cursor:pointer;transition:all .3s}.upload-area:hover{border-color:var(--primary-500);background-color:var(--surface-hover)}.upload-area.has-files{border-style:solid;border-color:var(--primary-500)}.image-preview-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:1rem;margin-top:1rem}.image-preview-item{position:relative;border-radius:8px;overflow:hidden;aspect-ratio:1}.image-preview-item img{width:100%;height:100%;object-fit:cover}.image-preview-item .remove-btn{position:absolute;top:.5rem;right:.5rem}.entries-table{width:100%;border-collapse:collapse;margin-top:1rem}.entries-table th,.entries-table td{padding:.75rem;text-align:left;border-bottom:1px solid var(--surface-border)}.entries-table th{background:var(--surface-hover);font-weight:600;color:var(--text-color)}.entries-table .debit{color:var(--red-600)}.entries-table .credit{color:var(--green-600)}.stats-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:1rem;margin-bottom:1.5rem}.stat-card{background:var(--surface-card);border-radius:12px;padding:1.25rem;box-shadow:0 2px 8px #00000014;text-align:center}.stat-card .stat-value{font-size:2rem;font-weight:700;color:var(--text-color)}.stat-card .stat-label{color:var(--text-color-secondary);font-size:.9rem;margin-top:.25rem}.loading-container{display:flex;justify-content:center;align-items:center;min-height:200px}.empty-state{text-align:center;padding:3rem;color:var(--text-color-secondary)}.empty-state i{font-size:4rem;color:var(--surface-border);margin-bottom:1rem}.empty-state h3{margin-bottom:.5rem}@media (max-width: 768px){.form-grid{grid-template-columns:1fr}.stats-grid{grid-template-columns:repeat(2,1fr)}.button-group{flex-direction:column}.button-group .p-button{width:100%}} diff --git a/deploy-package-20260223-151231/frontend/assets/index.es.DA9NjhHN.js b/deploy-package-20260223-151231/frontend/assets/index.es.DA9NjhHN.js deleted file mode 100644 index fdbe1b9..0000000 --- a/deploy-package-20260223-151231/frontend/assets/index.es.DA9NjhHN.js +++ /dev/null @@ -1,19 +0,0 @@ -import{h as bi}from"./vendor-utils.CO3CyGpV.js";var Qe=typeof globalThis<"u"?globalThis:typeof window<"u"?window:typeof global<"u"?global:typeof self<"u"?self:{};function No(a){return a&&a.__esModule&&Object.prototype.hasOwnProperty.call(a,"default")?a.default:a}var ht=function(a){return a&&a.Math===Math&&a},_=ht(typeof globalThis=="object"&&globalThis)||ht(typeof window=="object"&&window)||ht(typeof self=="object"&&self)||ht(typeof Qe=="object"&&Qe)||ht(typeof Qe=="object"&&Qe)||function(){return this}()||Function("return this")(),Et={},D=function(a){try{return!!a()}catch{return!0}},El=D,he=!El(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!==7}),$l=D,br=!$l(function(){var a=(function(){}).bind();return typeof a!="function"||a.hasOwnProperty("prototype")}),wl=br,Ft=Function.prototype.call,Y=wl?Ft.bind(Ft):function(){return Ft.apply(Ft,arguments)},Io={},Mo={}.propertyIsEnumerable,_o=Object.getOwnPropertyDescriptor,Cl=_o&&!Mo.call({1:2},1);Io.f=Cl?function(e){var t=_o(this,e);return!!t&&t.enumerable}:Mo;var xi=function(a,e){return{enumerable:!(a&1),configurable:!(a&2),writable:!(a&4),value:e}},Vo=br,Do=Function.prototype,za=Do.call,Al=Vo&&Do.bind.bind(za,za),L=Vo?Al:function(a){return function(){return za.apply(a,arguments)}},Lo=L,Pl=Lo({}.toString),Rl=Lo("".slice),je=function(a){return Rl(Pl(a),8,-1)},Nl=L,Il=D,Ml=je,Zr=Object,_l=Nl("".split),ko=Il(function(){return!Zr("z").propertyIsEnumerable(0)})?function(a){return Ml(a)==="String"?_l(a,""):Zr(a)}:Zr,xr=function(a){return a==null},Vl=xr,Dl=TypeError,ve=function(a){if(Vl(a))throw new Dl("Can't call method on "+a);return a},Ll=ko,kl=ve,$t=function(a){return Ll(kl(a))},Jr=typeof document=="object"&&document.all,B=typeof Jr>"u"&&Jr!==void 0?function(a){return typeof a=="function"||a===Jr}:function(a){return typeof a=="function"},Bl=B,ae=function(a){return typeof a=="object"?a!==null:Bl(a)},ea=_,jl=B,Fl=function(a){return jl(a)?a:void 0},Fe=function(a,e){return arguments.length<2?Fl(ea[a]):ea[a]&&ea[a][e]},Ul=L,Tr=Ul({}.isPrototypeOf),Gl=_,cn=Gl.navigator,gn=cn&&cn.userAgent,wt=gn?String(gn):"",Bo=_,ta=wt,dn=Bo.process,pn=Bo.Deno,yn=dn&&dn.versions||pn&&pn.version,mn=yn&&yn.v8,le,cr;mn&&(le=mn.split("."),cr=le[0]>0&&le[0]<4?1:+(le[0]+le[1]));!cr&&ta&&(le=ta.match(/Edge\/(\d+)/),(!le||le[1]>=74)&&(le=ta.match(/Chrome\/(\d+)/),le&&(cr=+le[1])));var Ti=cr,bn=Ti,zl=D,Hl=_,Yl=Hl.String,jo=!!Object.getOwnPropertySymbols&&!zl(function(){var a=Symbol("symbol detection");return!Yl(a)||!(Object(a)instanceof Symbol)||!Symbol.sham&&bn&&bn<41}),Xl=jo,Fo=Xl&&!Symbol.sham&&typeof Symbol.iterator=="symbol",Wl=Fe,ql=B,Ql=Tr,Kl=Fo,Zl=Object,Uo=Kl?function(a){return typeof a=="symbol"}:function(a){var e=Wl("Symbol");return ql(e)&&Ql(e.prototype,Zl(a))},Jl=String,Or=function(a){try{return Jl(a)}catch{return"Object"}},eh=B,th=Or,rh=TypeError,Te=function(a){if(eh(a))return a;throw new rh(th(a)+" is not a function")},ah=Te,ih=xr,st=function(a,e){var t=a[e];return ih(t)?void 0:ah(t)},ra=Y,aa=B,ia=ae,nh=TypeError,sh=function(a,e){var t,r;if(e==="string"&&aa(t=a.toString)&&!ia(r=ra(t,a))||aa(t=a.valueOf)&&!ia(r=ra(t,a))||e!=="string"&&aa(t=a.toString)&&!ia(r=ra(t,a)))return r;throw new nh("Can't convert object to primitive value")},Go={exports:{}},xn=_,oh=Object.defineProperty,Oi=function(a,e){try{oh(xn,a,{value:e,configurable:!0,writable:!0})}catch{xn[a]=e}return e},uh=_,lh=Oi,Tn="__core-js_shared__",On=Go.exports=uh[Tn]||lh(Tn,{});(On.versions||(On.versions=[])).push({version:"3.47.0",mode:"global",copyright:"© 2014-2025 Denis Pushkarev (zloirock.ru), 2025 CoreJS Company (core-js.io)",license:"https://github.com/zloirock/core-js/blob/v3.47.0/LICENSE",source:"https://github.com/zloirock/core-js"});var Si=Go.exports,Sn=Si,Ei=function(a,e){return Sn[a]||(Sn[a]=e||{})},hh=ve,vh=Object,Sr=function(a){return vh(hh(a))},fh=L,ch=Sr,gh=fh({}.hasOwnProperty),fe=Object.hasOwn||function(e,t){return gh(ch(e),t)},dh=L,ph=0,yh=Math.random(),mh=dh(1.1.toString),zo=function(a){return"Symbol("+(a===void 0?"":a)+")_"+mh(++ph+yh,36)},bh=_,xh=Ei,En=fe,Th=zo,Oh=jo,Sh=Fo,Ke=bh.Symbol,na=xh("wks"),Eh=Sh?Ke.for||Ke:Ke&&Ke.withoutSetter||Th,z=function(a){return En(na,a)||(na[a]=Oh&&En(Ke,a)?Ke[a]:Eh("Symbol."+a)),na[a]},$h=Y,$n=ae,wn=Uo,wh=st,Ch=sh,Ah=z,Ph=TypeError,Rh=Ah("toPrimitive"),Nh=function(a,e){if(!$n(a)||wn(a))return a;var t=wh(a,Rh),r;if(t){if(e===void 0&&(e="default"),r=$h(t,a,e),!$n(r)||wn(r))return r;throw new Ph("Can't convert object to primitive value")}return e===void 0&&(e="number"),Ch(a,e)},Ih=Nh,Mh=Uo,Ho=function(a){var e=Ih(a,"string");return Mh(e)?e:e+""},_h=_,Cn=ae,Ha=_h.document,Vh=Cn(Ha)&&Cn(Ha.createElement),Er=function(a){return Vh?Ha.createElement(a):{}},Dh=he,Lh=D,kh=Er,Yo=!Dh&&!Lh(function(){return Object.defineProperty(kh("div"),"a",{get:function(){return 7}}).a!==7}),Bh=he,jh=Y,Fh=Io,Uh=xi,Gh=$t,zh=Ho,Hh=fe,Yh=Yo,An=Object.getOwnPropertyDescriptor;Et.f=Bh?An:function(e,t){if(e=Gh(e),t=zh(t),Yh)try{return An(e,t)}catch{}if(Hh(e,t))return Uh(!jh(Fh.f,e,t),e[t])};var Oe={},Xh=he,Wh=D,Xo=Xh&&Wh(function(){return Object.defineProperty(function(){},"prototype",{value:42,writable:!1}).prototype!==42}),qh=ae,Qh=String,Kh=TypeError,J=function(a){if(qh(a))return a;throw new Kh(Qh(a)+" is not an object")},Zh=he,Jh=Yo,ev=Xo,Ut=J,Pn=Ho,tv=TypeError,sa=Object.defineProperty,rv=Object.getOwnPropertyDescriptor,oa="enumerable",ua="configurable",la="writable";Oe.f=Zh?ev?function(e,t,r){if(Ut(e),t=Pn(t),Ut(r),typeof e=="function"&&t==="prototype"&&"value"in r&&la in r&&!r[la]){var i=rv(e,t);i&&i[la]&&(e[t]=r.value,r={configurable:ua in r?r[ua]:i[ua],enumerable:oa in r?r[oa]:i[oa],writable:!1})}return sa(e,t,r)}:sa:function(e,t,r){if(Ut(e),t=Pn(t),Ut(r),Jh)try{return sa(e,t,r)}catch{}if("get"in r||"set"in r)throw new tv("Accessors not supported");return"value"in r&&(e[t]=r.value),e};var av=he,iv=Oe,nv=xi,Ct=av?function(a,e,t){return iv.f(a,e,nv(1,t))}:function(a,e,t){return a[e]=t,a},Wo={exports:{}},Ya=he,sv=fe,qo=Function.prototype,ov=Ya&&Object.getOwnPropertyDescriptor,Qo=sv(qo,"name"),uv=Qo&&(function(){}).name==="something",lv=Qo&&(!Ya||Ya&&ov(qo,"name").configurable),$r={PROPER:uv,CONFIGURABLE:lv},hv=L,vv=B,Xa=Si,fv=hv(Function.toString);vv(Xa.inspectSource)||(Xa.inspectSource=function(a){return fv(a)});var $i=Xa.inspectSource,cv=_,gv=B,Rn=cv.WeakMap,dv=gv(Rn)&&/native code/.test(String(Rn)),pv=Ei,yv=zo,Nn=pv("keys"),wi=function(a){return Nn[a]||(Nn[a]=yv(a))},Ci={},mv=dv,Ko=_,bv=ae,xv=Ct,ha=fe,va=Si,Tv=wi,Ov=Ci,In="Object already initialized",Wa=Ko.TypeError,Sv=Ko.WeakMap,gr,Tt,dr,Ev=function(a){return dr(a)?Tt(a):gr(a,{})},$v=function(a){return function(e){var t;if(!bv(e)||(t=Tt(e)).type!==a)throw new Wa("Incompatible receiver, "+a+" required");return t}};if(mv||va.state){var de=va.state||(va.state=new Sv);de.get=de.get,de.has=de.has,de.set=de.set,gr=function(a,e){if(de.has(a))throw new Wa(In);return e.facade=a,de.set(a,e),e},Tt=function(a){return de.get(a)||{}},dr=function(a){return de.has(a)}}else{var Ye=Tv("state");Ov[Ye]=!0,gr=function(a,e){if(ha(a,Ye))throw new Wa(In);return e.facade=a,xv(a,Ye,e),e},Tt=function(a){return ha(a,Ye)?a[Ye]:{}},dr=function(a){return ha(a,Ye)}}var wr={set:gr,get:Tt,has:dr,enforce:Ev,getterFor:$v},Ai=L,wv=D,Cv=B,Gt=fe,qa=he,Av=$r.CONFIGURABLE,Pv=$i,Zo=wr,Rv=Zo.enforce,Nv=Zo.get,Mn=String,or=Object.defineProperty,Iv=Ai("".slice),Mv=Ai("".replace),_v=Ai([].join),Vv=qa&&!wv(function(){return or(function(){},"length",{value:8}).length!==8}),Dv=String(String).split("String"),Lv=Wo.exports=function(a,e,t){Iv(Mn(e),0,7)==="Symbol("&&(e="["+Mv(Mn(e),/^Symbol\(([^)]*)\).*$/,"$1")+"]"),t&&t.getter&&(e="get "+e),t&&t.setter&&(e="set "+e),(!Gt(a,"name")||Av&&a.name!==e)&&(qa?or(a,"name",{value:e,configurable:!0}):a.name=e),Vv&&t&&Gt(t,"arity")&&a.length!==t.arity&&or(a,"length",{value:t.arity});try{t&&Gt(t,"constructor")&&t.constructor?qa&&or(a,"prototype",{writable:!1}):a.prototype&&(a.prototype=void 0)}catch{}var r=Rv(a);return Gt(r,"source")||(r.source=_v(Dv,typeof e=="string"?e:"")),a};Function.prototype.toString=Lv(function(){return Cv(this)&&Nv(this).source||Pv(this)},"toString");var Jo=Wo.exports,kv=B,Bv=Oe,jv=Jo,Fv=Oi,Ue=function(a,e,t,r){r||(r={});var i=r.enumerable,n=r.name!==void 0?r.name:e;if(kv(t)&&jv(t,n,r),r.global)i?a[e]=t:Fv(e,t);else{try{r.unsafe?a[e]&&(i=!0):delete a[e]}catch{}i?a[e]=t:Bv.f(a,e,{value:t,enumerable:!1,configurable:!r.nonConfigurable,writable:!r.nonWritable})}return a},eu={},Uv=Math.ceil,Gv=Math.floor,zv=Math.trunc||function(e){var t=+e;return(t>0?Gv:Uv)(t)},Hv=zv,Cr=function(a){var e=+a;return e!==e||e===0?0:Hv(e)},Yv=Cr,Xv=Math.max,Wv=Math.min,qv=function(a,e){var t=Yv(a);return t<0?Xv(t+e,0):Wv(t,e)},Qv=Cr,Kv=Math.min,ot=function(a){var e=Qv(a);return e>0?Kv(e,9007199254740991):0},Zv=ot,Pi=function(a){return Zv(a.length)},Jv=$t,ef=qv,tf=Pi,rf=function(a){return function(e,t,r){var i=Jv(e),n=tf(i);if(n===0)return!a&&-1;var o=ef(r,n),s;if(a&&t!==t){for(;n>o;)if(s=i[o++],s!==s)return!0}else for(;n>o;o++)if((a||o in i)&&i[o]===t)return a||o||0;return!a&&-1}},tu={indexOf:rf(!1)},af=L,fa=fe,nf=$t,sf=tu.indexOf,of=Ci,_n=af([].push),ru=function(a,e){var t=nf(a),r=0,i=[],n;for(n in t)!fa(of,n)&&fa(t,n)&&_n(i,n);for(;e.length>r;)fa(t,n=e[r++])&&(~sf(i,n)||_n(i,n));return i},Ri=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],uf=ru,lf=Ri,hf=lf.concat("length","prototype");eu.f=Object.getOwnPropertyNames||function(e){return uf(e,hf)};var au={};au.f=Object.getOwnPropertySymbols;var vf=Fe,ff=L,cf=eu,gf=au,df=J,pf=ff([].concat),yf=vf("Reflect","ownKeys")||function(e){var t=cf.f(df(e)),r=gf.f;return r?pf(t,r(e)):t},Vn=fe,mf=yf,bf=Et,xf=Oe,Tf=function(a,e,t){for(var r=mf(e),i=xf.f,n=bf.f,o=0;of;f++)if(v=y(a[f]),v&&cs(ds,v))return v;return new hr(!1)}l=Od(a,h)}for(g=n?a.next:l.next;!(d=yd(g,l)).done;){try{v=y(d.value)}catch(x){gs(l,"throw",x)}if(typeof v=="object"&&v&&cs(ds,v))return v}return new hr(!1)},$d=z,Lu=$d("iterator"),ku=!1;try{var wd=0,ps={next:function(){return{done:!!wd++}},return:function(){ku=!0}};ps[Lu]=function(){return this},Array.from(ps,function(){throw 2})}catch{}var Cd=function(a,e){try{if(!e&&!ku)return!1}catch{return!1}var t=!1;try{var r={};r[Lu]=function(){return{next:function(){return{done:t=!0}}}},a(r)}catch{}return t},Ad=Nr,Pd=Cd,Rd=Pt.CONSTRUCTOR,Bu=Rd||!Pd(function(a){Ad.all(a).then(void 0,function(){})}),Nd=ee,Id=Y,Md=Te,_d=ut,Vd=Vi,Dd=Du,Ld=Bu;Nd({target:"Promise",stat:!0,forced:Ld},{all:function(e){var t=this,r=_d.f(t),i=r.resolve,n=r.reject,o=Vd(function(){var s=Md(t.resolve),u=[],l=0,h=1;Dd(e,function(f){var c=l++,v=!1;h++,Id(s,t,f).then(function(g){v||(v=!0,u[c]=g,--h||i(u))},n)}),--h||i(u)});return o.error&&n(o.value),r.promise}});var kd=ee,Bd=Pt.CONSTRUCTOR,ri=Nr,jd=Fe,Fd=B,Ud=Ue,ys=ri&&ri.prototype;kd({target:"Promise",proto:!0,forced:Bd,real:!0},{catch:function(a){return this.then(void 0,a)}});if(Fd(ri)){var ms=jd("Promise").prototype.catch;ys.catch!==ms&&Ud(ys,"catch",ms,{unsafe:!0})}var Gd=ee,zd=Y,Hd=Te,Yd=ut,Xd=Vi,Wd=Du,qd=Bu;Gd({target:"Promise",stat:!0,forced:qd},{race:function(e){var t=this,r=Yd.f(t),i=r.reject,n=Xd(function(){var o=Hd(t.resolve);Wd(e,function(s){zd(o,t,s).then(r.resolve,i)})});return n.error&&i(n.value),r.promise}});var Qd=ee,Kd=ut,Zd=Pt.CONSTRUCTOR;Qd({target:"Promise",stat:!0,forced:Zd},{reject:function(e){var t=Kd.f(this),r=t.reject;return r(e),t.promise}});var Jd=J,ep=ae,tp=ut,rp=function(a,e){if(Jd(a),ep(e)&&e.constructor===a)return e;var t=tp.f(a),r=t.resolve;return r(e),t.promise},ap=ee,ip=Fe,np=Pt.CONSTRUCTOR,sp=rp;ip("Promise");ap({target:"Promise",stat:!0,forced:np},{resolve:function(e){return sp(this,e)}});function bs(a,e,t,r,i,n,o){try{var s=a[n](o),u=s.value}catch(l){return void t(l)}s.done?e(u):Promise.resolve(u).then(r,i)}function xe(a){return function(){var e=this,t=arguments;return new Promise(function(r,i){var n=a.apply(e,t);function o(u){bs(n,r,i,o,s,"next",u)}function s(u){bs(n,r,i,o,s,"throw",u)}o(void 0)})}}var op=Ni,up=String,pe=function(a){if(op(a)==="Symbol")throw new TypeError("Cannot convert a Symbol value to a string");return up(a)},lp=J,ju=function(){var a=lp(this),e="";return a.hasIndices&&(e+="d"),a.global&&(e+="g"),a.ignoreCase&&(e+="i"),a.multiline&&(e+="m"),a.dotAll&&(e+="s"),a.unicode&&(e+="u"),a.unicodeSets&&(e+="v"),a.sticky&&(e+="y"),e},ji=D,hp=_,Fi=hp.RegExp,Ui=ji(function(){var a=Fi("a","y");return a.lastIndex=2,a.exec("abcd")!==null});Ui||ji(function(){return!Fi("a","y").sticky});var vp=Ui||ji(function(){var a=Fi("^r","gy");return a.lastIndex=2,a.exec("str")!==null}),Fu={BROKEN_CARET:vp,UNSUPPORTED_Y:Ui},Uu={},fp=ru,cp=Ri,gp=Object.keys||function(e){return fp(e,cp)},dp=he,pp=Xo,yp=Oe,mp=J,bp=$t,xp=gp;Uu.f=dp&&!pp?Object.defineProperties:function(e,t){mp(e);for(var r=bp(t),i=xp(t),n=i.length,o=0,s;n>o;)yp.f(e,s=i[o++],r[s]);return e};var Tp=J,Op=Uu,xs=Ri,Sp=Ci,Ep=du,$p=Er,wp=wi,Ts=">",Os="<",ai="prototype",ii="script",Gu=wp("IE_PROTO"),Ea=function(){},zu=function(a){return Os+ii+Ts+a+Os+"/"+ii+Ts},Ss=function(a){a.write(zu("")),a.close();var e=a.parentWindow.Object;return a=null,e},Cp=function(){var a=$p("iframe"),e="java"+ii+":",t;return a.style.display="none",Ep.appendChild(a),a.src=String(e),t=a.contentWindow.document,t.open(),t.write(zu("document.F=Object")),t.close(),t.F},Zt,vr=function(){try{Zt=new ActiveXObject("htmlfile")}catch{}vr=typeof document<"u"?document.domain&&Zt?Ss(Zt):Cp():Ss(Zt);for(var a=xs.length;a--;)delete vr[ai][xs[a]];return vr()};Sp[Gu]=!0;var Gi=Object.create||function(e,t){var r;return e!==null?(Ea[ai]=Tp(e),r=new Ea,Ea[ai]=null,r[Gu]=e):r=vr(),t===void 0?r:Op.f(r,t)},Ap=D,Pp=_,Rp=Pp.RegExp,Np=Ap(function(){var a=Rp(".","s");return!(a.dotAll&&a.test(` -`)&&a.flags==="s")}),Ip=D,Mp=_,_p=Mp.RegExp,Vp=Ip(function(){var a=_p("(?b)","g");return a.exec("b").groups.a!=="b"||"b".replace(a,"$c")!=="bc"}),Je=Y,Mr=L,Dp=pe,Lp=ju,kp=Fu,Bp=Ei,jp=Gi,Fp=wr.get,Up=Np,Gp=Vp,zp=Bp("native-string-replace",String.prototype.replace),mr=RegExp.prototype.exec,ni=mr,Hp=Mr("".charAt),Yp=Mr("".indexOf),Xp=Mr("".replace),$a=Mr("".slice),si=function(){var a=/a/,e=/b*/g;return Je(mr,a,"a"),Je(mr,e,"a"),a.lastIndex!==0||e.lastIndex!==0}(),Hu=kp.BROKEN_CARET,oi=/()??/.exec("")[1]!==void 0,Wp=si||oi||Hu||Up||Gp;Wp&&(ni=function(e){var t=this,r=Fp(t),i=Dp(e),n=r.raw,o,s,u,l,h,f,c;if(n)return n.lastIndex=t.lastIndex,o=Je(ni,n,i),t.lastIndex=n.lastIndex,o;var v=r.groups,g=Hu&&t.sticky,d=Je(Lp,t),p=t.source,y=0,x=i;if(g&&(d=Xp(d,"y",""),Yp(d,"g")===-1&&(d+="g"),x=$a(i,t.lastIndex),t.lastIndex>0&&(!t.multiline||t.multiline&&Hp(i,t.lastIndex-1)!==` -`)&&(p="(?: "+p+")",x=" "+x,y++),s=new RegExp("^(?:"+p+")",d)),oi&&(s=new RegExp("^"+p+"$(?!\\s)",d)),si&&(u=t.lastIndex),l=Je(mr,g?s:t,x),g?l?(l.input=$a(l.input,y),l[0]=$a(l[0],y),l.index=t.lastIndex,t.lastIndex+=l[0].length):t.lastIndex=0:si&&l&&(t.lastIndex=t.global?l.index+l[0].length:u),oi&&l&&l.length>1&&Je(zp,l[0],s,function(){for(h=1;h=n?a?"":void 0:(o=As(r,i),o<55296||o>56319||i+1===n||(s=As(r,i+1))<56320||s>57343?a?ry(r,i):o:a?ay(r,i,i+2):(o-55296<<10)+(s-56320)+65536)}},ny={charAt:iy(!0)},sy=ny.charAt,Xi=function(a,e,t){return e+(t?sy(a,e).length:1)},oy=_,uy=D,Ps=oy.RegExp,ly=!uy(function(){var a=!0;try{Ps(".","d")}catch{a=!1}var e={},t="",r=a?"dgimsy":"gimsy",i=function(u,l){Object.defineProperty(e,u,{get:function(){return t+=l,!0}})},n={dotAll:"s",global:"g",ignoreCase:"i",multiline:"m",sticky:"y"};a&&(n.hasIndices="d");for(var o in n)i(o,n[o]);var s=Object.getOwnPropertyDescriptor(Ps.prototype,"flags").get.call(e);return s!==r||t!==r}),hy={correct:ly},vy=Y,fy=fe,cy=Tr,Rs=hy,gy=ju,dy=RegExp.prototype,Wi=Rs.correct?function(a){return a.flags}:function(a){return!Rs.correct&&cy(dy,a)&&!fy(a,"flags")?vy(gy,a):a.flags},Ns=Y,py=J,yy=B,my=je,by=zi,xy=TypeError,qi=function(a,e){var t=a.exec;if(yy(t)){var r=Ns(t,a,e);return r!==null&&py(r),r}if(my(a)==="RegExp")return Ns(by,a,e);throw new xy("RegExp#exec called on incompatible receiver")},Ty=Y,Oy=L,Sy=Hi,Ey=J,$y=ae,wy=ot,Jt=pe,Cy=ve,Ay=st,Py=Xi,Ry=Wi,Is=qi,Ms=Oy("".indexOf);Sy("match",function(a,e,t){return[function(i){var n=Cy(this),o=$y(i)?Ay(i,a):void 0;return o?Ty(o,i,n):new RegExp(i)[a](Jt(n))},function(r){var i=Ey(this),n=Jt(r),o=t(e,i,n);if(o.done)return o.value;var s=Jt(Ry(i));if(Ms(s,"g")===-1)return Is(i,n);var u=Ms(s,"u")!==-1;i.lastIndex=0;for(var l=[],h=0,f;(f=Is(i,n))!==null;){var c=Jt(f[0]);l[h]=c,c===""&&(i.lastIndex=Py(n,wy(i.lastIndex),u)),h++}return h===0?null:l}]});var Qi=L,Ny=Sr,Iy=Math.floor,Ca=Qi("".charAt),My=Qi("".replace),Aa=Qi("".slice),_y=/\$([$&'`]|\d{1,2}|<[^>]*>)/g,Vy=/\$([$&'`]|\d{1,2})/g,Dy=function(a,e,t,r,i,n){var o=t+a.length,s=r.length,u=Vy;return i!==void 0&&(i=Ny(i),u=_y),My(n,u,function(l,h){var f;switch(Ca(h,0)){case"$":return"$";case"&":return a;case"`":return Aa(e,0,t);case"'":return Aa(e,o);case"<":f=i[Aa(h,1,-1)];break;default:var c=+h;if(c===0)return l;if(c>s){var v=Iy(c/10);return v===0?l:v<=s?r[v-1]===void 0?Ca(h,1):r[v-1]+Ca(h,1):l}f=r[c-1]}return f===void 0?"":f})},Ly=gu,_s=Y,_r=L,ky=Hi,By=D,jy=J,Fy=B,Uy=ae,Gy=Cr,zy=ot,Me=pe,Hy=ve,Yy=Xi,Xy=st,Wy=Dy,qy=Wi,Qy=qi,Ky=z,ui=Ky("replace"),Zy=Math.max,Jy=Math.min,em=_r([].concat),Pa=_r([].push),er=_r("".indexOf),Vs=_r("".slice),tm=function(a){return a===void 0?a:String(a)},rm=function(){return"a".replace(/./,"$0")==="$0"}(),Ds=function(){return/./[ui]?/./[ui]("a","$0")==="":!1}(),am=!By(function(){var a=/./;return a.exec=function(){var e=[];return e.groups={a:"7"},e},"".replace(a,"$")!=="7"});ky("replace",function(a,e,t){var r=Ds?"$":"$0";return[function(n,o){var s=Hy(this),u=Uy(n)?Xy(n,ui):void 0;return u?_s(u,n,s,o):_s(e,Me(s),n,o)},function(i,n){var o=jy(this),s=Me(i);if(typeof n=="string"&&er(n,r)===-1&&er(n,"$<")===-1){var u=t(e,o,s,n);if(u.done)return u.value}var l=Fy(n);l||(n=Me(n));var h=Me(qy(o)),f=er(h,"g")!==-1,c;f&&(c=er(h,"u")!==-1,o.lastIndex=0);for(var v=[],g;g=Qy(o,s),!(g===null||(Pa(v,g),!f));){var d=Me(g[0]);d===""&&(o.lastIndex=Yy(s,zy(o.lastIndex),c))}for(var p="",y=0,x=0;x=y&&(p+=Vs(s,y,T)+E,y=T+b.length)}return p+Vs(s,y)}]},!am||!rm||Ds);var im=ae,nm=je,sm=z,om=sm("match"),um=function(a){var e;return im(a)&&((e=a[om])!==void 0?!!e:nm(a)==="RegExp")},lm=um,hm=TypeError,Ki=function(a){if(lm(a))throw new hm("The method doesn't accept regular expressions");return a},vm=z,fm=vm("match"),Zi=function(a){var e=/./;try{"/./"[a](e)}catch{try{return e[fm]=!1,"/./"[a](e)}catch{}}return!1},cm=ee,gm=Rr,dm=Et.f,pm=ot,Ls=pe,ym=Ki,mm=ve,bm=Zi,xm=gm("".slice),Tm=Math.min,Xu=bm("startsWith"),Om=!Xu&&!!function(){var a=dm(String.prototype,"startsWith");return a&&!a.writable}();cm({target:"String",proto:!0,forced:!Om&&!Xu},{startsWith:function(e){var t=Ls(mm(this));ym(e);var r=pm(Tm(arguments.length>1?arguments[1]:void 0,t.length)),i=Ls(e);return xm(t,r,r+i.length)===i}});var Sm=z,Em=Gi,$m=Oe.f,li=Sm("unscopables"),hi=Array.prototype;hi[li]===void 0&&$m(hi,li,{configurable:!0,value:Em(null)});var wm=function(a){hi[li][a]=!0},Cm=D,Am=!Cm(function(){function a(){}return a.prototype.constructor=null,Object.getPrototypeOf(new a)!==a.prototype}),Pm=fe,Rm=B,Nm=Sr,Im=wi,Mm=Am,ks=Im("IE_PROTO"),vi=Object,_m=vi.prototype,Wu=Mm?vi.getPrototypeOf:function(a){var e=Nm(a);if(Pm(e,ks))return e[ks];var t=e.constructor;return Rm(t)&&e instanceof t?t.prototype:e instanceof vi?_m:null},Vm=D,Dm=B,Lm=ae,Bs=Wu,km=Ue,Bm=z,fi=Bm("iterator"),qu=!1,ke,Ra,Na;[].keys&&(Na=[].keys(),"next"in Na?(Ra=Bs(Bs(Na)),Ra!==Object.prototype&&(ke=Ra)):qu=!0);var jm=!Lm(ke)||Vm(function(){var a={};return ke[fi].call(a)!==a});jm&&(ke={});Dm(ke[fi])||km(ke,fi,function(){return this});var Qu={IteratorPrototype:ke,BUGGY_SAFARI_ITERATORS:qu},Fm=Qu.IteratorPrototype,Um=Gi,Gm=xi,zm=Pr,Hm=Rt,Ym=function(){return this},Xm=function(a,e,t,r){var i=e+" Iterator";return a.prototype=Um(Fm,{next:Gm(+!r,t)}),zm(a,i,!1),Hm[i]=Ym,a},Wm=ee,qm=Y,Ku=$r,Qm=B,Km=Xm,js=Wu,Fs=su,Zm=Pr,Jm=Ct,Ia=Ue,e0=z,t0=Rt,Zu=Qu,r0=Ku.PROPER,a0=Ku.CONFIGURABLE,Us=Zu.IteratorPrototype,tr=Zu.BUGGY_SAFARI_ITERATORS,ct=e0("iterator"),Gs="keys",gt="values",zs="entries",i0=function(){return this},n0=function(a,e,t,r,i,n,o){Km(t,e,r);var s=function(y){if(y===i&&c)return c;if(!tr&&y&&y in h)return h[y];switch(y){case Gs:return function(){return new t(this,y)};case gt:return function(){return new t(this,y)};case zs:return function(){return new t(this,y)}}return function(){return new t(this)}},u=e+" Iterator",l=!1,h=a.prototype,f=h[ct]||h["@@iterator"]||i&&h[i],c=!tr&&f||s(i),v=e==="Array"&&h.entries||f,g,d,p;if(v&&(g=js(v.call(new a)),g!==Object.prototype&&g.next&&(js(g)!==Us&&(Fs?Fs(g,Us):Qm(g[ct])||Ia(g,ct,i0)),Zm(g,u,!0))),r0&&i===gt&&f&&f.name!==gt&&(a0?Jm(h,"name",gt):(l=!0,c=function(){return qm(f,this)})),i)if(d={values:s(gt),keys:n?c:s(Gs),entries:s(zs)},o)for(p in d)(tr||l||!(p in h))&&Ia(h,p,d[p]);else Wm({target:e,proto:!0,forced:tr||l},d);return h[ct]!==c&&Ia(h,ct,c,{name:i}),t0[e]=c,d},s0=function(a,e){return{value:a,done:e}},o0=$t,Ji=wm,Hs=Rt,Ju=wr,u0=Oe.f,l0=n0,rr=s0,h0=he,el="Array Iterator",v0=Ju.set,f0=Ju.getterFor(el),c0=l0(Array,"Array",function(a,e){v0(this,{type:el,target:o0(a),index:0,kind:e})},function(){var a=f0(this),e=a.target,t=a.index++;if(!e||t>=e.length)return a.target=null,rr(void 0,!0);switch(a.kind){case"keys":return rr(t,!1);case"values":return rr(e[t],!1)}return rr([t,e[t]],!1)},"values"),Ys=Hs.Arguments=Hs.Array;Ji("keys");Ji("values");Ji("entries");if(h0&&Ys.name!=="values")try{u0(Ys,"name",{value:"values"})}catch{}var g0={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0},d0=Er,Ma=d0("span").classList,Xs=Ma&&Ma.constructor&&Ma.constructor.prototype,p0=Xs===Object.prototype?void 0:Xs,Ws=_,tl=g0,y0=p0,pt=c0,qs=Ct,m0=Pr,b0=z,_a=b0("iterator"),Va=pt.values,rl=function(a,e){if(a){if(a[_a]!==Va)try{qs(a,_a,Va)}catch{a[_a]=Va}if(m0(a,e,!0),tl[e]){for(var t in pt)if(a[t]!==pt[t])try{qs(a,t,pt[t])}catch{a[t]=pt[t]}}}};for(var Da in tl)rl(Ws[Da]&&Ws[Da].prototype,Da);rl(y0,"DOMTokenList");var x0=Te,T0=Sr,O0=ko,S0=Pi,Qs=TypeError,Ks="Reduce of empty array with no initial value",E0=function(a){return function(e,t,r,i){var n=T0(e),o=O0(n),s=S0(n);if(x0(t),s===0&&r<2)throw new Qs(Ks);var u=a?s-1:0,l=a?-1:1;if(r<2)for(;;){if(u in o){i=o[u],u+=l;break}if(u+=l,a?u<0:s<=u)throw new Qs(Ks)}for(;a?u>=0:s>u;u+=l)u in o&&(i=t(i,o[u],u,n));return i}},$0={left:E0(!1)},w0=D,al=function(a,e){var t=[][a];return!!t&&w0(function(){t.call(null,e||function(){return 1},1)})},C0=ee,A0=$0.left,P0=al,Zs=Ti,R0=Ar,N0=!R0&&Zs>79&&Zs<83,I0=N0||!P0("reduce");C0({target:"Array",proto:!0,forced:I0},{reduce:function(e){var t=arguments.length;return A0(this,e,t,t>1?arguments[1]:void 0)}});var M0=ee,_0=Rr,V0=Et.f,D0=ot,Js=pe,L0=Ki,k0=ve,B0=Zi,j0=_0("".slice),F0=Math.min,il=B0("endsWith"),U0=!il&&!!function(){var a=V0(String.prototype,"endsWith");return a&&!a.writable}();M0({target:"String",proto:!0,forced:!U0&&!il},{endsWith:function(e){var t=Js(k0(this));L0(e);var r=arguments.length>1?arguments[1]:void 0,i=t.length,n=r===void 0?i:F0(D0(r),i),o=Js(e);return j0(t,n-o.length,n)===o}});var La=Y,nl=L,G0=Hi,z0=J,H0=ae,Y0=ve,X0=fu,W0=Xi,q0=ot,eo=pe,Q0=st,to=qi,K0=Fu,Z0=D,We=K0.UNSUPPORTED_Y,J0=4294967295,eb=Math.min,ka=nl([].push),Ba=nl("".slice),tb=!Z0(function(){var a=/(?:)/,e=a.exec;a.exec=function(){return e.apply(this,arguments)};var t="ab".split(a);return t.length!==2||t[0]!=="a"||t[1]!=="b"}),ro="abbc".split(/(b)*/)[1]==="c"||"test".split(/(?:)/,-1).length!==4||"ab".split(/(?:ab)*/).length!==2||".".split(/(.?)(.?)/).length!==4||".".split(/()()/).length>1||"".split(/.?/).length;G0("split",function(a,e,t){var r="0".split(void 0,0).length?function(i,n){return i===void 0&&n===0?[]:La(e,this,i,n)}:e;return[function(n,o){var s=Y0(this),u=H0(n)?Q0(n,a):void 0;return u?La(u,n,s,o):La(r,eo(s),n,o)},function(i,n){var o=z0(this),s=eo(i);if(!ro){var u=t(r,o,s,n,r!==e);if(u.done)return u.value}var l=X0(o,RegExp),h=o.unicode,f=(o.ignoreCase?"i":"")+(o.multiline?"m":"")+(o.unicode?"u":"")+(We?"g":"y"),c=new l(We?"^(?:"+o.source+")":o,f),v=n===void 0?J0:n>>>0;if(v===0)return[];if(s.length===0)return to(c,s)===null?[s]:[];for(var g=0,d=0,p=[];d"u"?Qe:window,ar=["moz","webkit"],tt="AnimationFrame",nt=be["request"+tt],St=be["cancel"+tt]||be["cancelRequest"+tt];for(var dt=0;!nt&&dt3&&(this.alpha=s[3]),this.ok=!0}}this.r=this.r<0||isNaN(this.r)?0:this.r>255?255:this.r,this.g=this.g<0||isNaN(this.g)?0:this.g>255?255:this.g,this.b=this.b<0||isNaN(this.b)?0:this.b>255?255:this.b,this.alpha=this.alpha<0?0:this.alpha>1||isNaN(this.alpha)?1:this.alpha,this.toRGB=function(){return"rgb("+this.r+", "+this.g+", "+this.b+")"},this.toRGBA=function(){return"rgba("+this.r+", "+this.g+", "+this.b+", "+this.alpha+")"},this.toHex=function(){var u=this.r.toString(16),l=this.g.toString(16),h=this.b.toString(16);return u.length==1&&(u="0"+u),l.length==1&&(l="0"+l),h.length==1&&(h="0"+h),"#"+u+l+h},this.getHelpXML=function(){for(var u=new Array,l=0;l "+d.toRGB()+" -> "+d.toHex());g.appendChild(p),g.appendChild(y),v.appendChild(g)}catch{}return v}};const gi=No(bb);var xb=ee,Tb=Rr,Ob=tu.indexOf,Sb=al,di=Tb([].indexOf),ol=!!di&&1/di([1],1,-0)<0,Eb=ol||!Sb("indexOf");xb({target:"Array",proto:!0,forced:Eb},{indexOf:function(e){var t=arguments.length>1?arguments[1]:void 0;return ol?di(this,e,t)||0:Ob(this,e,t)}});var $b=ee,wb=L,Cb=Ki,Ab=ve,oo=pe,Pb=Zi,Rb=wb("".indexOf);$b({target:"String",proto:!0,forced:!Pb("includes")},{includes:function(e){return!!~Rb(oo(Ab(this)),oo(Cb(e)),arguments.length>1?arguments[1]:void 0)}});var Nb=je,Ib=Array.isArray||function(e){return Nb(e)==="Array"},Mb=ee,_b=L,Vb=Ib,Db=_b([].reverse),uo=[1,2];Mb({target:"Array",proto:!0,forced:String(uo)===String(uo.reverse())},{reverse:function(){return Vb(this)&&(this.length=this.length),Db(this)}});/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH -REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, -INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM -LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR -OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THIS SOFTWARE. -***************************************************************************** */var ul=function(a,e){return(ul=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,r){t.__proto__=r}||function(t,r){for(var i in r)Object.prototype.hasOwnProperty.call(r,i)&&(t[i]=r[i])})(a,e)};function ll(a,e){if(typeof e!="function"&&e!==null)throw new TypeError("Class extends value "+String(e)+" is not a constructor or null");function t(){this.constructor=a}ul(a,e),a.prototype=e===null?Object.create(e):(t.prototype=e.prototype,new t)}function Lb(a){var e="";Array.isArray(a)||(a=[a]);for(var t=0;ta.phi1&&(a.phi2-=2*Ee),a.sweepFlag===1&&a.phi2r)return[];if(r===0)return[[a*t/(a*a+e*e),e*t/(a*a+e*e)]];var i=Math.sqrt(r);return[[(a*t+e*i)/(a*a+e*e),(e*t-a*i)/(a*a+e*e)],[(a*t-e*i)/(a*a+e*e),(e*t+a*i)/(a*a+e*e)]]}var U,ye=Math.PI/180;function ho(a,e,t){return(1-t)*a+t*e}function vo(a,e,t,r){return a+Math.cos(r/180*Ee)*e+Math.sin(r/180*Ee)*t}function fo(a,e,t,r){var i=1e-6,n=e-a,o=t-e,s=3*n+3*(r-t)-6*o,u=6*(o-n),l=3*n;return Math.abs(s)O&&(v.sweepFlag=+!v.sweepFlag),v})}function o(){return function(s){var u={};for(var l in s)u[l]=s[l];return u}}a.ROUND=function(s){function u(l){return Math.round(l*s)/s}return s===void 0&&(s=1e13),ue(s),function(l){return l.x1!==void 0&&(l.x1=u(l.x1)),l.y1!==void 0&&(l.y1=u(l.y1)),l.x2!==void 0&&(l.x2=u(l.x2)),l.y2!==void 0&&(l.y2=u(l.y2)),l.x!==void 0&&(l.x=u(l.x)),l.y!==void 0&&(l.y=u(l.y)),l.rX!==void 0&&(l.rX=u(l.rX)),l.rY!==void 0&&(l.rY=u(l.rY)),l}},a.TO_ABS=e,a.TO_REL=function(){return i(function(s,u,l){return s.relative||(s.x1!==void 0&&(s.x1-=u),s.y1!==void 0&&(s.y1-=l),s.x2!==void 0&&(s.x2-=u),s.y2!==void 0&&(s.y2-=l),s.x!==void 0&&(s.x-=u),s.y!==void 0&&(s.y-=l),s.relative=!0),s})},a.NORMALIZE_HVZ=function(s,u,l){return s===void 0&&(s=!0),u===void 0&&(u=!0),l===void 0&&(l=!0),i(function(h,f,c,v,g){if(isNaN(v)&&!(h.type&m.MOVE_TO))throw new Error("path must start with moveto");return u&&h.type&m.HORIZ_LINE_TO&&(h.type=m.LINE_TO,h.y=h.relative?0:c),l&&h.type&m.VERT_LINE_TO&&(h.type=m.LINE_TO,h.x=h.relative?0:f),s&&h.type&m.CLOSE_PATH&&(h.type=m.LINE_TO,h.x=h.relative?v-f:v,h.y=h.relative?g-c:g),h.type&m.ARC&&(h.rX===0||h.rY===0)&&(h.type=m.LINE_TO,delete h.rX,delete h.rY,delete h.xRot,delete h.lArcFlag,delete h.sweepFlag),h})},a.NORMALIZE_ST=t,a.QT_TO_C=r,a.INFO=i,a.SANITIZE=function(s){s===void 0&&(s=0),ue(s);var u=NaN,l=NaN,h=NaN,f=NaN;return i(function(c,v,g,d,p){var y=Math.abs,x=!1,b=0,T=0;if(c.type&m.SMOOTH_CURVE_TO&&(b=isNaN(u)?0:v-u,T=isNaN(l)?0:g-l),c.type&(m.CURVE_TO|m.SMOOTH_CURVE_TO)?(u=c.relative?v+c.x2:c.x2,l=c.relative?g+c.y2:c.y2):(u=NaN,l=NaN),c.type&m.SMOOTH_QUAD_TO?(h=isNaN(h)?v:2*v-h,f=isNaN(f)?g:2*g-f):c.type&m.QUAD_TO?(h=c.relative?v+c.x1:c.x1,f=c.relative?g+c.y1:c.y2):(h=NaN,f=NaN),c.type&m.LINE_COMMANDS||c.type&m.ARC&&(c.rX===0||c.rY===0||!c.lArcFlag)||c.type&m.CURVE_TO||c.type&m.SMOOTH_CURVE_TO||c.type&m.QUAD_TO||c.type&m.SMOOTH_QUAD_TO){var $=c.x===void 0?0:c.relative?c.x:c.x-v,E=c.y===void 0?0:c.relative?c.y:c.y-g;b=isNaN(h)?c.x1===void 0?b:c.relative?c.x:c.x1-v:h-v,T=isNaN(f)?c.y1===void 0?T:c.relative?c.y:c.y1-g:f-g;var O=c.x2===void 0?0:c.relative?c.x:c.x2-v,C=c.y2===void 0?0:c.relative?c.y:c.y2-g;y($)<=s&&y(E)<=s&&y(b)<=s&&y(T)<=s&&y(O)<=s&&y(C)<=s&&(x=!0)}return c.type&m.CLOSE_PATH&&y(v-d)<=s&&y(g-p)<=s&&(x=!0),x?[]:c})},a.MATRIX=n,a.ROTATE=function(s,u,l){u===void 0&&(u=0),l===void 0&&(l=0),ue(s,u,l);var h=Math.sin(s),f=Math.cos(s);return n(f,h,-h,f,u-u*f+l*h,l-u*h-l*f)},a.TRANSLATE=function(s,u){return u===void 0&&(u=0),ue(s,u),n(1,0,0,1,s,u)},a.SCALE=function(s,u){return u===void 0&&(u=s),ue(s,u),n(s,0,0,u,0,0)},a.SKEW_X=function(s){return ue(s),n(1,0,Math.atan(s),1,0,0)},a.SKEW_Y=function(s){return ue(s),n(1,Math.atan(s),0,1,0,0)},a.X_AXIS_SYMMETRY=function(s){return s===void 0&&(s=0),ue(s),n(-1,0,0,1,s,0)},a.Y_AXIS_SYMMETRY=function(s){return s===void 0&&(s=0),ue(s),n(1,0,0,-1,0,s)},a.A_TO_C=function(){return i(function(s,u,l){return m.ARC===s.type?function(h,f,c){var v,g,d,p;h.cX||Ua(h,f,c);for(var y=Math.min(h.phi1,h.phi2),x=Math.max(h.phi1,h.phi2)-y,b=Math.ceil(x/90),T=new Array(b),$=f,E=c,O=0;Of.maxX&&(f.maxX=M),Mf.maxY&&(f.maxY=M),MN&&p(co(v,d.x1,d.x2,d.x,N));for(var T=0,$=fo(g,d.y1,d.y2,d.y);T<$.length;T++)0<(N=$[T])&&1>N&&y(co(g,d.y1,d.y2,d.y,N))}if(d.type&m.ARC){p(d.x),y(d.y),Ua(d,v,g);for(var E=d.xRot/180*Math.PI,O=Math.cos(E)*d.rX,C=Math.sin(E)*d.rX,P=-Math.sin(E)*d.rY,V=Math.cos(E)*d.rY,j=d.phi1d.phi2?[d.phi2+360,d.phi1+360]:[d.phi2,d.phi1],R=j[0],X=j[1],W=function(M){var K=M[0],se=M[1],ge=180*Math.atan2(se,K)/Math.PI;return geR&&NR&&Nh)throw new SyntaxError('Expected positive number, got "'+h+'" at index "'+o+'"')}else if((this.curArgs.length===3||this.curArgs.length===4)&&this.curNumber!=="0"&&this.curNumber!=="1")throw new SyntaxError('Expected a flag, got "'+this.curNumber+'" at index "'+o+'"')}this.curArgs.push(h),this.curArgs.length===jb[this.curCommandType]&&(m.HORIZ_LINE_TO===this.curCommandType?n({type:m.HORIZ_LINE_TO,relative:this.curCommandRelative,x:h}):m.VERT_LINE_TO===this.curCommandType?n({type:m.VERT_LINE_TO,relative:this.curCommandRelative,y:h}):this.curCommandType===m.MOVE_TO||this.curCommandType===m.LINE_TO||this.curCommandType===m.SMOOTH_QUAD_TO?(n({type:this.curCommandType,relative:this.curCommandRelative,x:this.curArgs[0],y:this.curArgs[1]}),m.MOVE_TO===this.curCommandType&&(this.curCommandType=m.LINE_TO)):this.curCommandType===m.CURVE_TO?n({type:m.CURVE_TO,relative:this.curCommandRelative,x1:this.curArgs[0],y1:this.curArgs[1],x2:this.curArgs[2],y2:this.curArgs[3],x:this.curArgs[4],y:this.curArgs[5]}):this.curCommandType===m.SMOOTH_CURVE_TO?n({type:m.SMOOTH_CURVE_TO,relative:this.curCommandRelative,x2:this.curArgs[0],y2:this.curArgs[1],x:this.curArgs[2],y:this.curArgs[3]}):this.curCommandType===m.QUAD_TO?n({type:m.QUAD_TO,relative:this.curCommandRelative,x1:this.curArgs[0],y1:this.curArgs[1],x:this.curArgs[2],y:this.curArgs[3]}):this.curCommandType===m.ARC&&n({type:m.ARC,relative:this.curCommandRelative,rX:this.curArgs[0],rY:this.curArgs[1],xRot:this.curArgs[2],lArcFlag:this.curArgs[3],sweepFlag:this.curArgs[4],x:this.curArgs[5],y:this.curArgs[6]})),this.curNumber="",this.curNumberHasExpDigits=!1,this.curNumberHasExp=!1,this.curNumberHasDecimal=!1,this.canParseCommandOrComma=!0}if(!kb(s))if(s===","&&this.canParseCommandOrComma)this.canParseCommandOrComma=!1;else if(s!=="+"&&s!=="-"&&s!==".")if(l)this.curNumber=s,this.curNumberHasDecimal=!1;else{if(this.curArgs.length!==0)throw new SyntaxError("Unterminated command at index "+o+".");if(!this.canParseCommandOrComma)throw new SyntaxError('Unexpected character "'+s+'" at index '+o+". Command cannot follow comma");if(this.canParseCommandOrComma=!1,s!=="z"&&s!=="Z")if(s==="h"||s==="H")this.curCommandType=m.HORIZ_LINE_TO,this.curCommandRelative=s==="h";else if(s==="v"||s==="V")this.curCommandType=m.VERT_LINE_TO,this.curCommandRelative=s==="v";else if(s==="m"||s==="M")this.curCommandType=m.MOVE_TO,this.curCommandRelative=s==="m";else if(s==="l"||s==="L")this.curCommandType=m.LINE_TO,this.curCommandRelative=s==="l";else if(s==="c"||s==="C")this.curCommandType=m.CURVE_TO,this.curCommandRelative=s==="c";else if(s==="s"||s==="S")this.curCommandType=m.SMOOTH_CURVE_TO,this.curCommandRelative=s==="s";else if(s==="q"||s==="Q")this.curCommandType=m.QUAD_TO,this.curCommandRelative=s==="q";else if(s==="t"||s==="T")this.curCommandType=m.SMOOTH_QUAD_TO,this.curCommandRelative=s==="t";else{if(s!=="a"&&s!=="A")throw new SyntaxError('Unexpected character "'+s+'" at index '+o+".");this.curCommandType=m.ARC,this.curCommandRelative=s==="a"}else r.push({type:m.CLOSE_PATH}),this.canParseCommandOrComma=!0,this.curCommandType=-1}else this.curNumber=s,this.curNumberHasDecimal=s==="."}else this.curNumber+=s,this.curNumberHasDecimal=!0;else this.curNumber+=s;else this.curNumber+=s,this.curNumberHasExp=!0;else this.curNumber+=s,this.curNumberHasExpDigits=this.curNumberHasExp}return r},e.prototype.transform=function(t){return Object.create(this,{parse:{value:function(r,i){i===void 0&&(i=[]);for(var n=0,o=Object.getPrototypeOf(this).parse.call(this,r);n>>$;if(o[b+3]=Fr,Fr!==0){var Ur=255/Fr;o[b]=(M*T>>>$)*Ur,o[b+1]=(K*T>>>$)*Ur,o[b+2]=(se*T>>>$)*Ur}else o[b]=o[b+1]=o[b+2]=0;M-=q,K-=H,se-=Q,ge-=N,q-=p.r,H-=p.g,Q-=p.b,N-=p.a;var Ae=jr+n+1;Ae=x+(Ae>>$,te>0?(te=255/te,o[re]=(Vt*T>>>$)*te,o[re+1]=(Dt*T>>>$)*te,o[re+2]=(Lt*T>>>$)*te):o[re]=o[re+1]=o[re+2]=0,Vt-=Gr,Dt-=zr,Lt-=Hr,kt-=Yr,Gr-=p.r,zr-=p.g,Hr-=p.b,Yr-=p.a,re=He+((re=Kr+h)0&&arguments[0]!==void 0?arguments[0]:{},e={window:null,ignoreAnimation:!0,ignoreMouse:!0,DOMParser:a,createCanvas(t,r){return new OffscreenCanvas(t,r)},createImage(t){return xe(function*(){var r=yield fetch(t),i=yield r.blob(),n=yield createImageBitmap(i);return n})()}};return(typeof DOMParser<"u"||typeof a>"u")&&Reflect.deleteProperty(e,"DOMParser"),e}function t1(a){var{DOMParser:e,canvas:t,fetch:r}=a;return{window:null,ignoreAnimation:!0,ignoreMouse:!0,DOMParser:e,fetch:r,createCanvas:t.createCanvas,createImage:t.loadImage}}var c2=Object.freeze({__proto__:null,offscreen:e1,node:t1});function lt(a){return a.replace(/(?!\u3000)\s+/gm," ")}function r1(a){return a.replace(/^[\n \t]+/,"")}function a1(a){return a.replace(/[\n \t]+$/,"")}function ne(a){var e=(a||"").match(/-?(\d+(?:\.\d*(?:[eE][+-]?\d+)?)?|\.\d+)(?=\D|$)/gm)||[];return e.map(parseFloat)}var i1=/^[A-Z-]+$/;function n1(a){return i1.test(a)?a.toLowerCase():a}function cl(a){var e=/url\(('([^']+)'|"([^"]+)"|([^'")]+))\)/.exec(a)||[];return e[2]||e[3]||e[4]}function s1(a){if(!a.startsWith("rgb"))return a;var e=3,t=a.replace(/\d+(\.\d+)?/g,(r,i)=>e--&&i?String(Math.round(parseFloat(r))):r);return t}var o1=/(\[[^\]]+\])/g,u1=/(#[^\s+>~.[:]+)/g,l1=/(\.[^\s+>~.[:]+)/g,h1=/(::[^\s+>~.[:]+|:first-line|:first-letter|:before|:after)/gi,v1=/(:[\w-]+\([^)]*\))/gi,f1=/(:[^\s+>~.[:]+)/g,c1=/([^\s+>~.[:]+)/g;function Ve(a,e){var t=e.exec(a);return t?[a.replace(e," "),t.length]:[a,0]}function g1(a){var e=[0,0,0],t=a.replace(/:not\(([^)]*)\)/g," $1 ").replace(/{[\s\S]*/gm," "),r=0;return[t,r]=Ve(t,o1),e[1]+=r,[t,r]=Ve(t,u1),e[0]+=r,[t,r]=Ve(t,l1),e[1]+=r,[t,r]=Ve(t,h1),e[2]+=r,[t,r]=Ve(t,v1),e[1]+=r,[t,r]=Ve(t,f1),e[1]+=r,t=t.replace(/[*\s+>~]/g," ").replace(/[#.]/g," "),[t,r]=Ve(t,c1),e[2]+=r,e.join("")}var rt=1e-8;function mo(a){return Math.sqrt(Math.pow(a[0],2)+Math.pow(a[1],2))}function yi(a,e){return(a[0]*e[0]+a[1]*e[1])/(mo(a)*mo(e))}function bo(a,e){return(a[0]*e[1]0&&arguments[0]!==void 0?arguments[0]:" ",{document:t,name:r}=this;return lt(this.getString()).trim().split(e).map(i=>new S(t,r,i))}hasValue(e){var{value:t}=this;return t!==null&&t!==""&&(e||t!==0)&&typeof t<"u"}isString(e){var{value:t}=this,r=typeof t=="string";return!r||!e?r:e.test(t)}isUrlDefinition(){return this.isString(/^url\(/)}isPixels(){if(!this.hasValue())return!1;var e=this.getString();switch(!0){case e.endsWith("px"):case/^[0-9]+$/.test(e):return!0;default:return!1}}setValue(e){return this.value=e,this}getValue(e){return typeof e>"u"||this.hasValue()?this.value:e}getNumber(e){if(!this.hasValue())return typeof e>"u"?0:parseFloat(e);var{value:t}=this,r=parseFloat(t);return this.isString(/%$/)&&(r/=100),r}getString(e){return typeof e>"u"||this.hasValue()?typeof this.value>"u"?"":String(this.value):String(e)}getColor(e){var t=this.getString(e);return this.isNormalizedColor||(this.isNormalizedColor=!0,t=s1(t),this.value=t),t}getDpi(){return 96}getRem(){return this.document.rootEmSize}getEm(){return this.document.emSize}getUnits(){return this.getString().replace(/[0-9.-]/g,"")}getPixels(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(!this.hasValue())return 0;var[r,i]=typeof e=="boolean"?[void 0,e]:[e],{viewPort:n}=this.document.screen;switch(!0){case this.isString(/vmin$/):return this.getNumber()/100*Math.min(n.computeSize("x"),n.computeSize("y"));case this.isString(/vmax$/):return this.getNumber()/100*Math.max(n.computeSize("x"),n.computeSize("y"));case this.isString(/vw$/):return this.getNumber()/100*n.computeSize("x");case this.isString(/vh$/):return this.getNumber()/100*n.computeSize("y");case this.isString(/rem$/):return this.getNumber()*this.getRem();case this.isString(/em$/):return this.getNumber()*this.getEm();case this.isString(/ex$/):return this.getNumber()*this.getEm()/2;case this.isString(/px$/):return this.getNumber();case this.isString(/pt$/):return this.getNumber()*this.getDpi()*(1/72);case this.isString(/pc$/):return this.getNumber()*15;case this.isString(/cm$/):return this.getNumber()*this.getDpi()/2.54;case this.isString(/mm$/):return this.getNumber()*this.getDpi()/25.4;case this.isString(/in$/):return this.getNumber()*this.getDpi();case(this.isString(/%$/)&&i):return this.getNumber()*this.getEm();case this.isString(/%$/):return this.getNumber()*n.computeSize(r);default:{var o=this.getNumber();return t&&o<1?o*n.computeSize(r):o}}}getMilliseconds(){return this.hasValue()?this.isString(/ms$/)?this.getNumber():this.getNumber()*1e3:0}getRadians(){if(!this.hasValue())return 0;switch(!0){case this.isString(/deg$/):return this.getNumber()*(Math.PI/180);case this.isString(/grad$/):return this.getNumber()*(Math.PI/200);case this.isString(/rad$/):return this.getNumber();default:return this.getNumber()*(Math.PI/180)}}getDefinition(){var e=this.getString(),t=/#([^)'"]+)/.exec(e);return t&&(t=t[1]),t||(t=e),this.document.definitions[t]}getFillStyleDefinition(e,t){var r=this.getDefinition();if(!r)return null;if(typeof r.createGradient=="function")return r.createGradient(this.document.ctx,e,t);if(typeof r.createPattern=="function"){if(r.getHrefAttribute().hasValue()){var i=r.getAttribute("patternTransform");r=r.getHrefAttribute().getDefinition(),i.hasValue()&&r.getAttribute("patternTransform",!0).setValue(i.value)}return r.createPattern(this.document.ctx,e,t)}return null}getTextBaseline(){return this.hasValue()?S.textBaselineMapping[this.getString()]:null}addOpacity(e){for(var t=this.getColor(),r=t.length,i=0,n=0;n1&&arguments[1]!==void 0?arguments[1]:0,[r=t,i=t]=ne(e);return new k(r,i)}static parseScale(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:1,[r=t,i=r]=ne(e);return new k(r,i)}static parsePath(e){for(var t=ne(e),r=t.length,i=[],n=0;n0}runEvents(){if(this.working){var{screen:e,events:t,eventElements:r}=this,{style:i}=e.ctx.canvas;i&&(i.cursor=""),t.forEach((n,o)=>{for(var{run:s}=n,u=r[o];u;)s(u),u=u.parent}),this.events=[],this.eventElements=[]}}checkPath(e,t){if(!(!this.working||!t)){var{events:r,eventElements:i}=this;r.forEach((n,o)=>{var{x:s,y:u}=n;!i[o]&&t.isPointInPath&&t.isPointInPath(s,u)&&(i[o]=e)})}}checkBoundingBox(e,t){if(!(!this.working||!t)){var{events:r,eventElements:i}=this;r.forEach((n,o)=>{var{x:s,y:u}=n;!i[o]&&t.isPointInBox(s,u)&&(i[o]=e)})}}mapXY(e,t){for(var{window:r,ctx:i}=this.screen,n=new k(e,t),o=i.canvas;o;)n.x-=o.offsetLeft,n.y-=o.offsetTop,o=o.offsetParent;return r.scrollX&&(n.x+=r.scrollX),r.scrollY&&(n.y+=r.scrollY),n}onClick(e){var{x:t,y:r}=this.mapXY(e.clientX,e.clientY);this.events.push({type:"onclick",x:t,y:r,run(i){i.onClick&&i.onClick()}})}onMouseMove(e){var{x:t,y:r}=this.mapXY(e.clientX,e.clientY);this.events.push({type:"onmousemove",x:t,y:r,run(i){i.onMouseMove&&i.onMouseMove()}})}}var gl=typeof window<"u"?window:null,dl=typeof fetch<"u"?fetch.bind(void 0):null;class Dr{constructor(e){var{fetch:t=dl,window:r=gl}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.ctx=e,this.FRAMERATE=30,this.MAX_VIRTUAL_PIXELS=3e4,this.CLIENT_WIDTH=800,this.CLIENT_HEIGHT=600,this.viewPort=new d1,this.mouse=new p1(this),this.animations=[],this.waits=[],this.frameDuration=0,this.isReadyLock=!1,this.isFirstRender=!0,this.intervalId=null,this.window=r,this.fetch=t}wait(e){this.waits.push(e)}ready(){return this.readyPromise?this.readyPromise:Promise.resolve()}isReady(){if(this.isReadyLock)return!0;var e=this.waits.every(t=>t());return e&&(this.waits=[],this.resolveReady&&this.resolveReady()),this.isReadyLock=e,e}setDefaults(e){e.strokeStyle="rgba(0,0,0,0)",e.lineCap="butt",e.lineJoin="miter",e.miterLimit=4}setViewBox(e){var{document:t,ctx:r,aspectRatio:i,width:n,desiredWidth:o,height:s,desiredHeight:u,minX:l=0,minY:h=0,refX:f,refY:c,clip:v=!1,clipX:g=0,clipY:d=0}=e,p=lt(i).replace(/^defer\s/,""),[y,x]=p.split(" "),b=y||"xMidYMid",T=x||"meet",$=n/o,E=s/u,O=Math.min($,E),C=Math.max($,E),P=o,V=u;T==="meet"&&(P*=O,V*=O),T==="slice"&&(P*=C,V*=C);var j=new S(t,"refX",f),R=new S(t,"refY",c),X=j.hasValue()&&R.hasValue();if(X&&r.translate(-O*j.getPixels("x"),-O*R.getPixels("y")),v){var W=O*g,G=O*d;r.beginPath(),r.moveTo(W,G),r.lineTo(n,G),r.lineTo(n,s),r.lineTo(W,s),r.closePath(),r.clip()}if(!X){var q=T==="meet"&&O===E,H=T==="slice"&&C===E,Q=T==="meet"&&O===$,N=T==="slice"&&C===$;b.startsWith("xMid")&&(q||H)&&r.translate(n/2-P/2,0),b.endsWith("YMid")&&(Q||N)&&r.translate(0,s/2-V/2),b.startsWith("xMax")&&(q||H)&&r.translate(n-P,0),b.endsWith("YMax")&&(Q||N)&&r.translate(0,s-V)}switch(!0){case b==="none":r.scale($,E);break;case T==="meet":r.scale(O,O);break;case T==="slice":r.scale(C,C);break}r.translate(-l,-h)}start(e){var{enableRedraw:t=!1,ignoreMouse:r=!1,ignoreAnimation:i=!1,ignoreDimensions:n=!1,ignoreClear:o=!1,forceRedraw:s,scaleWidth:u,scaleHeight:l,offsetX:h,offsetY:f}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},{FRAMERATE:c,mouse:v}=this,g=1e3/c;if(this.frameDuration=g,this.readyPromise=new Promise(b=>{this.resolveReady=b}),this.isReady()&&this.render(e,n,o,u,l,h,f),!!t){var d=Date.now(),p=d,y=0,x=()=>{d=Date.now(),y=d-p,y>=g&&(p=d-y%g,this.shouldUpdate(i,s)&&(this.render(e,n,o,u,l,h,f),v.runEvents())),this.intervalId=Fa(x)};r||v.start(),this.intervalId=Fa(x)}}stop(){this.intervalId&&(Fa.cancel(this.intervalId),this.intervalId=null),this.mouse.stop()}shouldUpdate(e,t){if(!e){var{frameDuration:r}=this,i=this.animations.reduce((n,o)=>o.update(r)||n,!1);if(i)return!0}return!!(typeof t=="function"&&t()||!this.isReadyLock&&this.isReady()||this.mouse.hasEvents())}render(e,t,r,i,n,o,s){var{CLIENT_WIDTH:u,CLIENT_HEIGHT:l,viewPort:h,ctx:f,isFirstRender:c}=this,v=f.canvas;h.clear(),v.width&&v.height?h.setCurrent(v.width,v.height):h.setCurrent(u,l);var g=e.getStyle("width"),d=e.getStyle("height");!t&&(c||typeof i!="number"&&typeof n!="number")&&(g.hasValue()&&(v.width=g.getPixels("x"),v.style&&(v.style.width="".concat(v.width,"px"))),d.hasValue()&&(v.height=d.getPixels("y"),v.style&&(v.style.height="".concat(v.height,"px"))));var p=v.clientWidth||v.width,y=v.clientHeight||v.height;if(t&&g.hasValue()&&d.hasValue()&&(p=g.getPixels("x"),y=d.getPixels("y")),h.setCurrent(p,y),typeof o=="number"&&e.getAttribute("x",!0).setValue(o),typeof s=="number"&&e.getAttribute("y",!0).setValue(s),typeof i=="number"||typeof n=="number"){var x=ne(e.getAttribute("viewBox").getString()),b=0,T=0;if(typeof i=="number"){var $=e.getStyle("width");$.hasValue()?b=$.getPixels("x")/i:isNaN(x[2])||(b=x[2]/i)}if(typeof n=="number"){var E=e.getStyle("height");E.hasValue()?T=E.getPixels("y")/n:isNaN(x[3])||(T=x[3]/n)}b||(b=T),T||(T=b),e.getAttribute("width",!0).setValue(i),e.getAttribute("height",!0).setValue(n);var O=e.getStyle("transform",!0,!0);O.setValue("".concat(O.getString()," scale(").concat(1/b,", ").concat(1/T,")"))}r||f.clearRect(0,0,p,y),e.render(f),c&&(this.isFirstRender=!1)}}Dr.defaultWindow=gl;Dr.defaultFetch=dl;var{defaultFetch:y1}=Dr,m1=typeof DOMParser<"u"?DOMParser:null;class Ga{constructor(){var{fetch:e=y1,DOMParser:t=m1}=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};this.fetch=e,this.DOMParser=t}parse(e){var t=this;return xe(function*(){return e.startsWith("<")?t.parseFromString(e):t.load(e)})()}parseFromString(e){var t=new this.DOMParser;try{return this.checkDocument(t.parseFromString(e,"image/svg+xml"))}catch{return this.checkDocument(t.parseFromString(e,"text/xml"))}}checkDocument(e){var t=e.getElementsByTagName("parsererror")[0];if(t)throw new Error(t.textContent);return e}load(e){var t=this;return xe(function*(){var r=yield t.fetch(e),i=yield r.text();return t.parseFromString(i)})()}}class b1{constructor(e,t){this.type="translate",this.point=null,this.point=k.parse(t)}apply(e){var{x:t,y:r}=this.point;e.translate(t||0,r||0)}unapply(e){var{x:t,y:r}=this.point;e.translate(-1*t||0,-1*r||0)}applyToPoint(e){var{x:t,y:r}=this.point;e.applyTransform([1,0,0,1,t||0,r||0])}}class x1{constructor(e,t,r){this.type="rotate",this.angle=null,this.originX=null,this.originY=null,this.cx=0,this.cy=0;var i=ne(t);this.angle=new S(e,"angle",i[0]),this.originX=r[0],this.originY=r[1],this.cx=i[1]||0,this.cy=i[2]||0}apply(e){var{cx:t,cy:r,originX:i,originY:n,angle:o}=this,s=t+i.getPixels("x"),u=r+n.getPixels("y");e.translate(s,u),e.rotate(o.getRadians()),e.translate(-s,-u)}unapply(e){var{cx:t,cy:r,originX:i,originY:n,angle:o}=this,s=t+i.getPixels("x"),u=r+n.getPixels("y");e.translate(s,u),e.rotate(-1*o.getRadians()),e.translate(-s,-u)}applyToPoint(e){var{cx:t,cy:r,angle:i}=this,n=i.getRadians();e.applyTransform([1,0,0,1,t||0,r||0]),e.applyTransform([Math.cos(n),Math.sin(n),-Math.sin(n),Math.cos(n),0,0]),e.applyTransform([1,0,0,1,-t||0,-r||0])}}class T1{constructor(e,t,r){this.type="scale",this.scale=null,this.originX=null,this.originY=null;var i=k.parseScale(t);(i.x===0||i.y===0)&&(i.x=rt,i.y=rt),this.scale=i,this.originX=r[0],this.originY=r[1]}apply(e){var{scale:{x:t,y:r},originX:i,originY:n}=this,o=i.getPixels("x"),s=n.getPixels("y");e.translate(o,s),e.scale(t,r||t),e.translate(-o,-s)}unapply(e){var{scale:{x:t,y:r},originX:i,originY:n}=this,o=i.getPixels("x"),s=n.getPixels("y");e.translate(o,s),e.scale(1/t,1/r||t),e.translate(-o,-s)}applyToPoint(e){var{x:t,y:r}=this.scale;e.applyTransform([t||0,0,0,r||0,0,0])}}class pl{constructor(e,t,r){this.type="matrix",this.matrix=[],this.originX=null,this.originY=null,this.matrix=ne(t),this.originX=r[0],this.originY=r[1]}apply(e){var{originX:t,originY:r,matrix:i}=this,n=t.getPixels("x"),o=r.getPixels("y");e.translate(n,o),e.transform(i[0],i[1],i[2],i[3],i[4],i[5]),e.translate(-n,-o)}unapply(e){var{originX:t,originY:r,matrix:i}=this,n=i[0],o=i[2],s=i[4],u=i[1],l=i[3],h=i[5],f=0,c=0,v=1,g=1/(n*(l*v-h*c)-o*(u*v-h*f)+s*(u*c-l*f)),d=t.getPixels("x"),p=r.getPixels("y");e.translate(d,p),e.transform(g*(l*v-h*c),g*(h*f-u*v),g*(s*c-o*v),g*(n*v-s*f),g*(o*h-s*l),g*(s*u-n*h)),e.translate(-d,-p)}applyToPoint(e){e.applyTransform(this.matrix)}}class yl extends pl{constructor(e,t,r){super(e,t,r),this.type="skew",this.angle=null,this.angle=new S(e,"angle",t)}}class O1 extends yl{constructor(e,t,r){super(e,t,r),this.type="skewX",this.matrix=[1,0,Math.tan(this.angle.getRadians()),1,0,0]}}class S1 extends yl{constructor(e,t,r){super(e,t,r),this.type="skewY",this.matrix=[1,Math.tan(this.angle.getRadians()),0,1,0,0]}}function E1(a){return lt(a).trim().replace(/\)([a-zA-Z])/g,") $1").replace(/\)(\s?,\s?)/g,") ").split(/\s(?=[a-z])/)}function $1(a){var[e,t]=a.split("(");return[e.trim(),t.trim().replace(")","")]}class Be{constructor(e,t,r){this.document=e,this.transforms=[];var i=E1(t);i.forEach(n=>{if(n!=="none"){var[o,s]=$1(n),u=Be.transformTypes[o];typeof u<"u"&&this.transforms.push(new u(this.document,s,r))}})}static fromElement(e,t){var r=t.getStyle("transform",!1,!0),[i,n=i]=t.getStyle("transform-origin",!1,!0).split(),o=[i,n];return r.hasValue()?new Be(e,r.getString(),o):null}apply(e){for(var{transforms:t}=this,r=t.length,i=0;i=0;i--)t[i].unapply(e)}applyToPoint(e){for(var{transforms:t}=this,r=t.length,i=0;i2&&arguments[2]!==void 0?arguments[2]:!1;if(this.document=e,this.node=t,this.captureTextNodes=r,this.attributes=Object.create(null),this.styles=Object.create(null),this.stylesSpecificity=Object.create(null),this.animationFrozen=!1,this.animationFrozenValue="",this.parent=null,this.children=[],!(!t||t.nodeType!==1)){if(Array.from(t.attributes).forEach(s=>{var u=n1(s.nodeName);this.attributes[u]=new S(e,u,s.value)}),this.addStylesFromStyleDefinition(),this.getAttribute("style").hasValue()){var i=this.getAttribute("style").getString().split(";").map(s=>s.trim());i.forEach(s=>{if(s){var[u,l]=s.split(":").map(h=>h.trim());this.styles[u]=new S(e,u,l)}})}var{definitions:n}=e,o=this.getAttribute("id");o.hasValue()&&(n[o.getString()]||(n[o.getString()]=this)),Array.from(t.childNodes).forEach(s=>{if(s.nodeType===1)this.addChild(s);else if(r&&(s.nodeType===3||s.nodeType===4)){var u=e.createTextNode(s);u.getText().length>0&&this.addChild(u)}})}}getAttribute(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,r=this.attributes[e];if(!r&&t){var i=new S(this.document,e,"");return this.attributes[e]=i,i}return r||S.empty(this.document)}getHrefAttribute(){for(var e in this.attributes)if(e==="href"||e.endsWith(":href"))return this.attributes[e];return S.empty(this.document)}getStyle(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1,r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=this.styles[e];if(i)return i;var n=this.getAttribute(e);if(n!=null&&n.hasValue())return this.styles[e]=n,n;if(!r){var{parent:o}=this;if(o){var s=o.getStyle(e);if(s!=null&&s.hasValue())return s}}if(t){var u=new S(this.document,e,"");return this.styles[e]=u,u}return i||S.empty(this.document)}render(e){if(!(this.getStyle("display").getString()==="none"||this.getStyle("visibility").getString()==="hidden")){if(e.save(),this.getStyle("mask").hasValue()){var t=this.getStyle("mask").getDefinition();t&&(this.applyEffects(e),t.apply(e,this))}else if(this.getStyle("filter").getValue("none")!=="none"){var r=this.getStyle("filter").getDefinition();r&&(this.applyEffects(e),r.apply(e,this))}else this.setContext(e),this.renderChildren(e),this.clearContext(e);e.restore()}}setContext(e){}applyEffects(e){var t=Be.fromElement(this.document,this);t&&t.apply(e);var r=this.getStyle("clip-path",!1,!0);if(r.hasValue()){var i=r.getDefinition();i&&i.apply(e)}}clearContext(e){}renderChildren(e){this.children.forEach(t=>{t.render(e)})}addChild(e){var t=e instanceof I?e:this.document.createElement(e);t.parent=this,I.ignoreChildTypes.includes(t.type)||this.children.push(t)}matchesSelector(e){var t,{node:r}=this;if(typeof r.matches=="function")return r.matches(e);var i=(t=r.getAttribute)===null||t===void 0?void 0:t.call(r,"class");return!i||i===""?!1:i.split(" ").some(n=>".".concat(n)===e)}addStylesFromStyleDefinition(){var{styles:e,stylesSpecificity:t}=this.document;for(var r in e)if(!r.startsWith("@")&&this.matchesSelector(r)){var i=e[r],n=t[r];if(i)for(var o in i){var s=this.stylesSpecificity[o];typeof s>"u"&&(s="000"),n>=s&&(this.styles[o]=i[o],this.stylesSpecificity[o]=n)}}}removeStyles(e,t){var r=t.reduce((i,n)=>{var o=e.getStyle(n);if(!o.hasValue())return i;var s=o.getString();return o.setValue(""),[...i,[n,s]]},[]);return r}restoreStyles(e,t){t.forEach(r=>{var[i,n]=r;e.getStyle(i,!0).setValue(n)})}isFirstChild(){var e;return((e=this.parent)===null||e===void 0?void 0:e.children.indexOf(this))===0}}I.ignoreChildTypes=["title"];class w1 extends I{constructor(e,t,r){super(e,t,r)}}function C1(a){var e=a.trim();return/^('|")/.test(e)?e:'"'.concat(e,'"')}function A1(a){return typeof process>"u"?a:a.trim().split(",").map(C1).join(",")}function P1(a){if(!a)return"";var e=a.trim().toLowerCase();switch(e){case"normal":case"italic":case"oblique":case"inherit":case"initial":case"unset":return e;default:return/^oblique\s+(-|)\d+deg$/.test(e)?e:""}}function R1(a){if(!a)return"";var e=a.trim().toLowerCase();switch(e){case"normal":case"bold":case"lighter":case"bolder":case"inherit":case"initial":case"unset":return e;default:return/^[\d.]+$/.test(e)?e:""}}class Z{constructor(e,t,r,i,n,o){var s=o?typeof o=="string"?Z.parse(o):o:{};this.fontFamily=n||s.fontFamily,this.fontSize=i||s.fontSize,this.fontStyle=e||s.fontStyle,this.fontWeight=r||s.fontWeight,this.fontVariant=t||s.fontVariant}static parse(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"",t=arguments.length>1?arguments[1]:void 0,r="",i="",n="",o="",s="",u=lt(e).trim().split(" "),l={fontSize:!1,fontStyle:!1,fontWeight:!1,fontVariant:!1};return u.forEach(h=>{switch(!0){case(!l.fontStyle&&Z.styles.includes(h)):h!=="inherit"&&(r=h),l.fontStyle=!0;break;case(!l.fontVariant&&Z.variants.includes(h)):h!=="inherit"&&(i=h),l.fontStyle=!0,l.fontVariant=!0;break;case(!l.fontWeight&&Z.weights.includes(h)):h!=="inherit"&&(n=h),l.fontStyle=!0,l.fontVariant=!0,l.fontWeight=!0;break;case!l.fontSize:h!=="inherit"&&([o]=h.split("/")),l.fontStyle=!0,l.fontVariant=!0,l.fontWeight=!0,l.fontSize=!0;break;default:h!=="inherit"&&(s+=h)}}),new Z(r,i,n,o,s,t)}toString(){return[P1(this.fontStyle),this.fontVariant,R1(this.fontWeight),this.fontSize,A1(this.fontFamily)].join(" ").trim()}}Z.styles="normal|italic|oblique|inherit";Z.variants="normal|small-caps|inherit";Z.weights="normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit";class ce{constructor(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:Number.NaN,t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:Number.NaN,r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:Number.NaN,i=arguments.length>3&&arguments[3]!==void 0?arguments[3]:Number.NaN;this.x1=e,this.y1=t,this.x2=r,this.y2=i,this.addPoint(e,t),this.addPoint(r,i)}get x(){return this.x1}get y(){return this.y1}get width(){return this.x2-this.x1}get height(){return this.y2-this.y1}addPoint(e,t){typeof e<"u"&&((isNaN(this.x1)||isNaN(this.x2))&&(this.x1=e,this.x2=e),ethis.x2&&(this.x2=e)),typeof t<"u"&&((isNaN(this.y1)||isNaN(this.y2))&&(this.y1=t,this.y2=t),tthis.y2&&(this.y2=t))}addX(e){this.addPoint(e,null)}addY(e){this.addPoint(null,e)}addBoundingBox(e){if(e){var{x1:t,y1:r,x2:i,y2:n}=e;this.addPoint(t,r),this.addPoint(i,n)}}sumCubic(e,t,r,i,n){return Math.pow(1-e,3)*t+3*Math.pow(1-e,2)*e*r+3*(1-e)*Math.pow(e,2)*i+Math.pow(e,3)*n}bezierCurveAdd(e,t,r,i,n){var o=6*t-12*r+6*i,s=-3*t+9*r-9*i+3*n,u=3*r-3*t;if(s===0){if(o===0)return;var l=-u/o;0=t.length-1}next(){var e=this.commands[++this.i];return this.previousCommand=this.command,this.command=e,e}getPoint(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:"x",t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:"y",r=new k(this.command[e],this.command[t]);return this.makeAbsolute(r)}getAsControlPoint(e,t){var r=this.getPoint(e,t);return this.control=r,r}getAsCurrentPoint(e,t){var r=this.getPoint(e,t);return this.current=r,r}getReflectedControlPoint(){var e=this.previousCommand.type;if(e!==m.CURVE_TO&&e!==m.SMOOTH_CURVE_TO&&e!==m.QUAD_TO&&e!==m.SMOOTH_QUAD_TO)return this.current;var{current:{x:t,y:r},control:{x:i,y:n}}=this,o=new k(2*t-i,2*r-n);return o}makeAbsolute(e){if(this.command.relative){var{x:t,y:r}=this.current;e.x+=t,e.y+=r}return e}addMarker(e,t,r){var{points:i,angles:n}=this;r&&n.length>0&&!n[n.length-1]&&(n[n.length-1]=i[i.length-1].angleTo(r)),this.addMarkerAngle(e,t?t.angleTo(e):null)}addMarkerAngle(e,t){this.points.push(e),this.angles.push(t)}getMarkerPoints(){return this.points}getMarkerAngles(){for(var{angles:e}=this,t=e.length,r=0;r1&&arguments[1]!==void 0?arguments[1]:!1;if(!t){var r=this.getStyle("fill"),i=this.getStyle("fill-opacity"),n=this.getStyle("stroke"),o=this.getStyle("stroke-opacity");if(r.isUrlDefinition()){var s=r.getFillStyleDefinition(this,i);s&&(e.fillStyle=s)}else if(r.hasValue()){r.getString()==="currentColor"&&r.setValue(this.getStyle("color").getColor());var u=r.getColor();u!=="inherit"&&(e.fillStyle=u==="none"?"rgba(0,0,0,0)":u)}if(i.hasValue()){var l=new S(this.document,"fill",e.fillStyle).addOpacity(i).getColor();e.fillStyle=l}if(n.isUrlDefinition()){var h=n.getFillStyleDefinition(this,o);h&&(e.strokeStyle=h)}else if(n.hasValue()){n.getString()==="currentColor"&&n.setValue(this.getStyle("color").getColor());var f=n.getString();f!=="inherit"&&(e.strokeStyle=f==="none"?"rgba(0,0,0,0)":f)}if(o.hasValue()){var c=new S(this.document,"stroke",e.strokeStyle).addOpacity(o).getString();e.strokeStyle=c}var v=this.getStyle("stroke-width");if(v.hasValue()){var g=v.getPixels();e.lineWidth=g||rt}var d=this.getStyle("stroke-linecap"),p=this.getStyle("stroke-linejoin"),y=this.getStyle("stroke-miterlimit"),x=this.getStyle("stroke-dasharray"),b=this.getStyle("stroke-dashoffset");if(d.hasValue()&&(e.lineCap=d.getString()),p.hasValue()&&(e.lineJoin=p.getString()),y.hasValue()&&(e.miterLimit=y.getNumber()),x.hasValue()&&x.getString()!=="none"){var T=ne(x.getString());typeof e.setLineDash<"u"?e.setLineDash(T):typeof e.webkitLineDash<"u"?e.webkitLineDash=T:typeof e.mozDash<"u"&&!(T.length===1&&T[0]===0)&&(e.mozDash=T);var $=b.getPixels();typeof e.lineDashOffset<"u"?e.lineDashOffset=$:typeof e.webkitLineDashOffset<"u"?e.webkitLineDashOffset=$:typeof e.mozDashOffset<"u"&&(e.mozDashOffset=$)}}if(this.modifiedEmSizeStack=!1,typeof e.font<"u"){var E=this.getStyle("font"),O=this.getStyle("font-style"),C=this.getStyle("font-variant"),P=this.getStyle("font-weight"),V=this.getStyle("font-size"),j=this.getStyle("font-family"),R=new Z(O.getString(),C.getString(),P.getString(),V.hasValue()?"".concat(V.getPixels(!0),"px"):"",j.getString(),Z.parse(E.getString(),e.font));O.setValue(R.fontStyle),C.setValue(R.fontVariant),P.setValue(R.fontWeight),V.setValue(R.fontSize),j.setValue(R.fontFamily),e.font=R.toString(),V.isPixels()&&(this.document.emSize=V.getPixels(),this.modifiedEmSizeStack=!0)}t||(this.applyEffects(e),e.globalAlpha=this.calculateOpacity())}clearContext(e){super.clearContext(e),this.modifiedEmSizeStack&&this.document.popEmSize()}}class A extends Ge{constructor(e,t,r){super(e,t,r),this.type="path",this.pathParser=null,this.pathParser=new w(this.getAttribute("d").getString())}path(e){var{pathParser:t}=this,r=new ce;for(t.reset(),e&&e.beginPath();!t.isEnd();)switch(t.next().type){case w.MOVE_TO:this.pathM(e,r);break;case w.LINE_TO:this.pathL(e,r);break;case w.HORIZ_LINE_TO:this.pathH(e,r);break;case w.VERT_LINE_TO:this.pathV(e,r);break;case w.CURVE_TO:this.pathC(e,r);break;case w.SMOOTH_CURVE_TO:this.pathS(e,r);break;case w.QUAD_TO:this.pathQ(e,r);break;case w.SMOOTH_QUAD_TO:this.pathT(e,r);break;case w.ARC:this.pathA(e,r);break;case w.CLOSE_PATH:this.pathZ(e,r);break}return r}getBoundingBox(e){return this.path()}getMarkers(){var{pathParser:e}=this,t=e.getMarkerPoints(),r=e.getMarkerAngles(),i=t.map((n,o)=>[n,r[o]]);return i}renderChildren(e){this.path(e),this.document.screen.mouse.checkPath(this,e);var t=this.getStyle("fill-rule");e.fillStyle!==""&&(t.getString("inherit")!=="inherit"?e.fill(t.getString()):e.fill()),e.strokeStyle!==""&&(this.getAttribute("vector-effect").getString()==="non-scaling-stroke"?(e.save(),e.setTransform(1,0,0,1,0,0),e.stroke(),e.restore()):e.stroke());var r=this.getMarkers();if(r){var i=r.length-1,n=this.getStyle("marker-start"),o=this.getStyle("marker-mid"),s=this.getStyle("marker-end");if(n.isUrlDefinition()){var u=n.getDefinition(),[l,h]=r[0];u.render(e,l,h)}if(o.isUrlDefinition())for(var f=o.getDefinition(),c=1;c1&&(i*=Math.sqrt(c),n*=Math.sqrt(c));var v=(s===u?-1:1)*Math.sqrt((Math.pow(i,2)*Math.pow(n,2)-Math.pow(i,2)*Math.pow(f.y,2)-Math.pow(n,2)*Math.pow(f.x,2))/(Math.pow(i,2)*Math.pow(f.y,2)+Math.pow(n,2)*Math.pow(f.x,2)));isNaN(v)&&(v=0);var g=new k(v*i*f.y/n,v*-n*f.x/i),d=new k((t.x+h.x)/2+Math.cos(l)*g.x-Math.sin(l)*g.y,(t.y+h.y)/2+Math.sin(l)*g.x+Math.cos(l)*g.y),p=bo([1,0],[(f.x-g.x)/i,(f.y-g.y)/n]),y=[(f.x-g.x)/i,(f.y-g.y)/n],x=[(-f.x-g.x)/i,(-f.y-g.y)/n],b=bo(y,x);return yi(y,x)<=-1&&(b=Math.PI),yi(y,x)>=1&&(b=0),{currentPoint:h,rX:i,rY:n,sweepFlag:u,xAxisRotation:l,centp:d,a1:p,ad:b}}pathA(e,t){var{pathParser:r}=this,{currentPoint:i,rX:n,rY:o,sweepFlag:s,xAxisRotation:u,centp:l,a1:h,ad:f}=A.pathA(r),c=1-s?1:-1,v=h+c*(f/2),g=new k(l.x+n*Math.cos(v),l.y+o*Math.sin(v));if(r.addMarkerAngle(g,v-c*Math.PI/2),r.addMarkerAngle(i,v-c*Math.PI),t.addPoint(i.x,i.y),e&&!isNaN(h)&&!isNaN(f)){var d=n>o?n:o,p=n>o?1:n/o,y=n>o?o/n:1;e.translate(l.x,l.y),e.rotate(u),e.scale(p,y),e.arc(0,0,d,h,h+f,!!(1-s)),e.scale(1/p,1/y),e.rotate(-u),e.translate(-l.x,-l.y)}}static pathZ(e){e.current=e.start}pathZ(e,t){A.pathZ(this.pathParser),e&&t.x1!==t.x2&&t.y1!==t.y2&&e.closePath()}}class ml extends A{constructor(e,t,r){super(e,t,r),this.type="glyph",this.horizAdvX=this.getAttribute("horiz-adv-x").getNumber(),this.unicode=this.getAttribute("unicode").getString(),this.arabicForm=this.getAttribute("arabic-form").getString()}}class Ce extends Ge{constructor(e,t,r){super(e,t,new.target===Ce?!0:r),this.type="text",this.x=0,this.y=0,this.measureCache=-1}setContext(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;super.setContext(e,t);var r=this.getStyle("dominant-baseline").getTextBaseline()||this.getStyle("alignment-baseline").getTextBaseline();r&&(e.textBaseline=r)}initializeCoordinates(){this.x=0,this.y=0,this.leafTexts=[],this.textChunkStart=0,this.minX=Number.POSITIVE_INFINITY,this.maxX=Number.NEGATIVE_INFINITY}getBoundingBox(e){if(this.type!=="text")return this.getTElementBoundingBox(e);this.initializeCoordinates(),this.adjustChildCoordinatesRecursive(e);var t=null;return this.children.forEach((r,i)=>{var n=this.getChildBoundingBox(e,this,this,i);t?t.addBoundingBox(n):t=n}),t}getFontSize(){var{document:e,parent:t}=this,r=Z.parse(e.ctx.font).fontSize,i=t.getStyle("font-size").getNumber(r);return i}getTElementBoundingBox(e){var t=this.getFontSize();return new ce(this.x,this.y-t,this.x+this.measureText(e),this.y)}getGlyph(e,t,r){var i=t[r],n=null;if(e.isArabic){var o=t.length,s=t[r-1],u=t[r+1],l="isolated";if((r===0||s===" ")&&r0&&s!==" "&&r0&&s!==" "&&(r===o-1||u===" ")&&(l="initial"),typeof e.glyphs[i]<"u"){var h=e.glyphs[i];n=h instanceof ml?h:h[l]}}else n=e.glyphs[i];return n||(n=e.missingGlyph),n}getText(){return""}getTextFromNode(e){var t=e||this.node,r=Array.from(t.parentNode.childNodes),i=r.indexOf(t),n=r.length-1,o=lt(t.textContent||"");return i===0&&(o=r1(o)),i===n&&(o=a1(o)),o}renderChildren(e){if(this.type!=="text"){this.renderTElementChildren(e);return}this.initializeCoordinates(),this.adjustChildCoordinatesRecursive(e),this.children.forEach((r,i)=>{this.renderChild(e,this,this,i)});var{mouse:t}=this.document.screen;t.isWorking()&&t.checkBoundingBox(this,this.getBoundingBox(e))}renderTElementChildren(e){var{document:t,parent:r}=this,i=this.getText(),n=r.getStyle("font-family").getDefinition();if(n){for(var{unitsPerEm:o}=n.fontFace,s=Z.parse(t.ctx.font),u=r.getStyle("font-size").getNumber(s.fontSize),l=r.getStyle("font-style").getString(s.fontStyle),h=u/o,f=n.isRTL?i.split("").reverse().join(""):i,c=ne(r.getAttribute("dx").getString()),v=f.length,g=0;g=this.leafTexts.length)){var e=this.leafTexts[this.textChunkStart],t=e.getStyle("text-anchor").getString("start"),r=!1,i=0;t==="start"&&!r||t==="end"&&r?i=e.x-this.minX:t==="end"&&!r||t==="start"&&r?i=e.x-this.maxX:i=e.x-(this.minX+this.maxX)/2;for(var n=this.textChunkStart;n{this.adjustChildCoordinatesRecursiveCore(e,this,this,r)}),this.applyAnchoring()}adjustChildCoordinatesRecursiveCore(e,t,r,i){var n=r.children[i];n.children.length>0?n.children.forEach((o,s)=>{t.adjustChildCoordinatesRecursiveCore(e,t,n,s)}):this.adjustChildCoordinates(e,t,r,i)}adjustChildCoordinates(e,t,r,i){var n=r.children[i];if(typeof n.measureText!="function")return n;e.save(),n.setContext(e,!0);var o=n.getAttribute("x"),s=n.getAttribute("y"),u=n.getAttribute("dx"),l=n.getAttribute("dy"),h=n.getStyle("font-family").getDefinition(),f=!!h&&h.isRTL;i===0&&(o.hasValue()||o.setValue(n.getInheritedAttribute("x")),s.hasValue()||s.setValue(n.getInheritedAttribute("y")),u.hasValue()||u.setValue(n.getInheritedAttribute("dx")),l.hasValue()||l.setValue(n.getInheritedAttribute("dy")));var c=n.measureText(e);return f&&(t.x-=c),o.hasValue()?(t.applyAnchoring(),n.x=o.getPixels("x"),u.hasValue()&&(n.x+=u.getPixels("x"))):(u.hasValue()&&(t.x+=u.getPixels("x")),n.x=t.x),t.x=n.x,f||(t.x+=c),s.hasValue()?(n.y=s.getPixels("y"),l.hasValue()&&(n.y+=l.getPixels("y"))):(l.hasValue()&&(t.y+=l.getPixels("y")),n.y=t.y),t.y=n.y,t.leafTexts.push(n),t.minX=Math.min(t.minX,n.x,n.x+c),t.maxX=Math.max(t.maxX,n.x,n.x+c),n.clearContext(e),e.restore(),n}getChildBoundingBox(e,t,r,i){var n=r.children[i];if(typeof n.getBoundingBox!="function")return null;var o=n.getBoundingBox(e);return o?(n.children.forEach((s,u)=>{var l=t.getChildBoundingBox(e,t,n,u);o.addBoundingBox(l)}),o):null}renderChild(e,t,r,i){var n=r.children[i];n.render(e),n.children.forEach((o,s)=>{t.renderChild(e,t,n,s)})}measureText(e){var{measureCache:t}=this;if(~t)return t;var r=this.getText(),i=this.measureTargetText(e,r);return this.measureCache=i,i}measureTargetText(e,t){if(!t.length)return 0;var{parent:r}=this,i=r.getStyle("font-family").getDefinition();if(i){for(var n=this.getFontSize(),o=i.isRTL?t.split("").reverse().join(""):t,s=ne(r.getAttribute("dx").getString()),u=o.length,l=0,h=0;h0?"":this.getTextFromNode()}getText(){return this.text}}class N1 extends Lr{constructor(){super(...arguments),this.type="textNode"}}class Nt extends Ge{constructor(){super(...arguments),this.type="svg",this.root=!1}setContext(e){var t,{document:r}=this,{screen:i,window:n}=r,o=e.canvas;if(i.setDefaults(e),o.style&&typeof e.font<"u"&&n&&typeof n.getComputedStyle<"u"){e.font=n.getComputedStyle(o).getPropertyValue("font");var s=new S(r,"fontSize",Z.parse(e.font).fontSize);s.hasValue()&&(r.rootEmSize=s.getPixels("y"),r.emSize=r.rootEmSize)}this.getAttribute("x").hasValue()||this.getAttribute("x",!0).setValue(0),this.getAttribute("y").hasValue()||this.getAttribute("y",!0).setValue(0);var{width:u,height:l}=i.viewPort;this.getStyle("width").hasValue()||this.getStyle("width",!0).setValue("100%"),this.getStyle("height").hasValue()||this.getStyle("height",!0).setValue("100%"),this.getStyle("color").hasValue()||this.getStyle("color",!0).setValue("black");var h=this.getAttribute("refX"),f=this.getAttribute("refY"),c=this.getAttribute("viewBox"),v=c.hasValue()?ne(c.getString()):null,g=!this.root&&this.getStyle("overflow").getValue("hidden")!=="visible",d=0,p=0,y=0,x=0;v&&(d=v[0],p=v[1]),this.root||(u=this.getStyle("width").getPixels("x"),l=this.getStyle("height").getPixels("y"),this.type==="marker"&&(y=d,x=p,d=0,p=0)),i.viewPort.setCurrent(u,l),this.node&&(!this.parent||((t=this.node.parentNode)===null||t===void 0?void 0:t.nodeName)==="foreignObject")&&this.getStyle("transform",!1,!0).hasValue()&&!this.getStyle("transform-origin",!1,!0).hasValue()&&this.getStyle("transform-origin",!0,!0).setValue("50% 50%"),super.setContext(e),e.translate(this.getAttribute("x").getPixels("x"),this.getAttribute("y").getPixels("y")),v&&(u=v[2],l=v[3]),r.setViewBox({ctx:e,aspectRatio:this.getAttribute("preserveAspectRatio").getString(),width:i.viewPort.width,desiredWidth:u,height:i.viewPort.height,desiredHeight:l,minX:d,minY:p,refX:h.getValue(),refY:f.getValue(),clip:g,clipX:y,clipY:x}),v&&(i.viewPort.removeCurrent(),i.viewPort.setCurrent(u,l))}clearContext(e){super.clearContext(e),this.document.screen.viewPort.removeCurrent()}resize(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:e,r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1,i=this.getAttribute("width",!0),n=this.getAttribute("height",!0),o=this.getAttribute("viewBox"),s=this.getAttribute("style"),u=i.getNumber(0),l=n.getNumber(0);if(r)if(typeof r=="string")this.getAttribute("preserveAspectRatio",!0).setValue(r);else{var h=this.getAttribute("preserveAspectRatio");h.hasValue()&&h.setValue(h.getString().replace(/^\s*(\S.*\S)\s*$/,"$1"))}if(i.setValue(e),n.setValue(t),o.hasValue()||o.setValue("0 0 ".concat(u||e," ").concat(l||t)),s.hasValue()){var f=this.getStyle("width"),c=this.getStyle("height");f.hasValue()&&f.setValue("".concat(e,"px")),c.hasValue()&&c.setValue("".concat(t,"px"))}}}class bl extends A{constructor(){super(...arguments),this.type="rect"}path(e){var t=this.getAttribute("x").getPixels("x"),r=this.getAttribute("y").getPixels("y"),i=this.getStyle("width",!1,!0).getPixels("x"),n=this.getStyle("height",!1,!0).getPixels("y"),o=this.getAttribute("rx"),s=this.getAttribute("ry"),u=o.getPixels("x"),l=s.getPixels("y");if(o.hasValue()&&!s.hasValue()&&(l=u),s.hasValue()&&!o.hasValue()&&(u=l),u=Math.min(u,i/2),l=Math.min(l,n/2),e){var h=4*((Math.sqrt(2)-1)/3);e.beginPath(),n>0&&i>0&&(e.moveTo(t+u,r),e.lineTo(t+i-u,r),e.bezierCurveTo(t+i-u+h*u,r,t+i,r+l-h*l,t+i,r+l),e.lineTo(t+i,r+n-l),e.bezierCurveTo(t+i,r+n-l+h*l,t+i-u+h*u,r+n,t+i-u,r+n),e.lineTo(t+u,r+n),e.bezierCurveTo(t+u-h*u,r+n,t,r+n-l+h*l,t,r+n-l),e.lineTo(t,r+l),e.bezierCurveTo(t,r+l-h*l,t+u-h*u,r,t+u,r),e.closePath())}return new ce(t,r,t+i,r+n)}getMarkers(){return null}}class I1 extends A{constructor(){super(...arguments),this.type="circle"}path(e){var t=this.getAttribute("cx").getPixels("x"),r=this.getAttribute("cy").getPixels("y"),i=this.getAttribute("r").getPixels();return e&&i>0&&(e.beginPath(),e.arc(t,r,i,0,Math.PI*2,!1),e.closePath()),new ce(t-i,r-i,t+i,r+i)}getMarkers(){return null}}class M1 extends A{constructor(){super(...arguments),this.type="ellipse"}path(e){var t=4*((Math.sqrt(2)-1)/3),r=this.getAttribute("rx").getPixels("x"),i=this.getAttribute("ry").getPixels("y"),n=this.getAttribute("cx").getPixels("x"),o=this.getAttribute("cy").getPixels("y");return e&&r>0&&i>0&&(e.beginPath(),e.moveTo(n+r,o),e.bezierCurveTo(n+r,o+t*i,n+t*r,o+i,n,o+i),e.bezierCurveTo(n-t*r,o+i,n-r,o+t*i,n-r,o),e.bezierCurveTo(n-r,o-t*i,n-t*r,o-i,n,o-i),e.bezierCurveTo(n+t*r,o-i,n+r,o-t*i,n+r,o),e.closePath()),new ce(n-r,o-i,n+r,o+i)}getMarkers(){return null}}class _1 extends A{constructor(){super(...arguments),this.type="line"}getPoints(){return[new k(this.getAttribute("x1").getPixels("x"),this.getAttribute("y1").getPixels("y")),new k(this.getAttribute("x2").getPixels("x"),this.getAttribute("y2").getPixels("y"))]}path(e){var[{x:t,y:r},{x:i,y:n}]=this.getPoints();return e&&(e.beginPath(),e.moveTo(t,r),e.lineTo(i,n)),new ce(t,r,i,n)}getMarkers(){var[e,t]=this.getPoints(),r=e.angleTo(t);return[[e,r],[t,r]]}}class xl extends A{constructor(e,t,r){super(e,t,r),this.type="polyline",this.points=[],this.points=k.parsePath(this.getAttribute("points").getString())}path(e){var{points:t}=this,[{x:r,y:i}]=t,n=new ce(r,i);return e&&(e.beginPath(),e.moveTo(r,i)),t.forEach(o=>{var{x:s,y:u}=o;n.addPoint(s,u),e&&e.lineTo(s,u)}),n}getMarkers(){var{points:e}=this,t=e.length-1,r=[];return e.forEach((i,n)=>{n!==t&&r.push([i,i.angleTo(e[n+1])])}),r.length>0&&r.push([e[e.length-1],r[r.length-1][1]]),r}}class V1 extends xl{constructor(){super(...arguments),this.type="polygon"}path(e){var t=super.path(e),[{x:r,y:i}]=this.points;return e&&(e.lineTo(r,i),e.closePath()),t}}class D1 extends I{constructor(){super(...arguments),this.type="pattern"}createPattern(e,t,r){var i=this.getStyle("width").getPixels("x",!0),n=this.getStyle("height").getPixels("y",!0),o=new Nt(this.document,null);o.attributes.viewBox=new S(this.document,"viewBox",this.getAttribute("viewBox").getValue()),o.attributes.width=new S(this.document,"width","".concat(i,"px")),o.attributes.height=new S(this.document,"height","".concat(n,"px")),o.attributes.transform=new S(this.document,"transform",this.getAttribute("patternTransform").getValue()),o.children=this.children;var s=this.document.createCanvas(i,n),u=s.getContext("2d"),l=this.getAttribute("x"),h=this.getAttribute("y");l.hasValue()&&h.hasValue()&&u.translate(l.getPixels("x",!0),h.getPixels("y",!0)),r.hasValue()?this.styles["fill-opacity"]=r:Reflect.deleteProperty(this.styles,"fill-opacity");for(var f=-1;f<=1;f++)for(var c=-1;c<=1;c++)u.save(),o.attributes.x=new S(this.document,"x",f*s.width),o.attributes.y=new S(this.document,"y",c*s.height),o.render(u),u.restore();var v=e.createPattern(s,"repeat");return v}}class L1 extends I{constructor(){super(...arguments),this.type="marker"}render(e,t,r){if(t){var{x:i,y:n}=t,o=this.getAttribute("orient").getString("auto"),s=this.getAttribute("markerUnits").getString("strokeWidth");e.translate(i,n),o==="auto"&&e.rotate(r),s==="strokeWidth"&&e.scale(e.lineWidth,e.lineWidth),e.save();var u=new Nt(this.document,null);u.type=this.type,u.attributes.viewBox=new S(this.document,"viewBox",this.getAttribute("viewBox").getValue()),u.attributes.refX=new S(this.document,"refX",this.getAttribute("refX").getValue()),u.attributes.refY=new S(this.document,"refY",this.getAttribute("refY").getValue()),u.attributes.width=new S(this.document,"width",this.getAttribute("markerWidth").getValue()),u.attributes.height=new S(this.document,"height",this.getAttribute("markerHeight").getValue()),u.attributes.overflow=new S(this.document,"overflow",this.getAttribute("overflow").getValue()),u.attributes.fill=new S(this.document,"fill",this.getAttribute("fill").getColor("black")),u.attributes.stroke=new S(this.document,"stroke",this.getAttribute("stroke").getValue("none")),u.children=this.children,u.render(e),e.restore(),s==="strokeWidth"&&e.scale(1/e.lineWidth,1/e.lineWidth),o==="auto"&&e.rotate(-r),e.translate(-i,-n)}}}class k1 extends I{constructor(){super(...arguments),this.type="defs"}render(){}}class tn extends Ge{constructor(){super(...arguments),this.type="g"}getBoundingBox(e){var t=new ce;return this.children.forEach(r=>{t.addBoundingBox(r.getBoundingBox(e))}),t}}class Tl extends I{constructor(e,t,r){super(e,t,r),this.attributesToInherit=["gradientUnits"],this.stops=[];var{stops:i,children:n}=this;n.forEach(o=>{o.type==="stop"&&i.push(o)})}getGradientUnits(){return this.getAttribute("gradientUnits").getString("objectBoundingBox")}createGradient(e,t,r){var i=this;this.getHrefAttribute().hasValue()&&(i=this.getHrefAttribute().getDefinition(),this.inheritStopContainer(i));var{stops:n}=i,o=this.getGradient(e,t);if(!o)return this.addParentOpacity(r,n[n.length-1].color);if(n.forEach(p=>{o.addColorStop(p.offset,this.addParentOpacity(r,p.color))}),this.getAttribute("gradientTransform").hasValue()){var{document:s}=this,{MAX_VIRTUAL_PIXELS:u,viewPort:l}=s.screen,[h]=l.viewPorts,f=new bl(s,null);f.attributes.x=new S(s,"x",-u/3),f.attributes.y=new S(s,"y",-u/3),f.attributes.width=new S(s,"width",u),f.attributes.height=new S(s,"height",u);var c=new tn(s,null);c.attributes.transform=new S(s,"transform",this.getAttribute("gradientTransform").getValue()),c.children=[f];var v=new Nt(s,null);v.attributes.x=new S(s,"x",0),v.attributes.y=new S(s,"y",0),v.attributes.width=new S(s,"width",h.width),v.attributes.height=new S(s,"height",h.height),v.children=[c];var g=s.createCanvas(h.width,h.height),d=g.getContext("2d");return d.fillStyle=o,v.render(d),d.createPattern(g,"no-repeat")}return o}inheritStopContainer(e){this.attributesToInherit.forEach(t=>{!this.getAttribute(t).hasValue()&&e.getAttribute(t).hasValue()&&this.getAttribute(t,!0).setValue(e.getAttribute(t).getValue())})}addParentOpacity(e,t){if(e.hasValue()){var r=new S(this.document,"color",t);return r.addOpacity(e).getColor()}return t}}class B1 extends Tl{constructor(e,t,r){super(e,t,r),this.type="linearGradient",this.attributesToInherit.push("x1","y1","x2","y2")}getGradient(e,t){var r=this.getGradientUnits()==="objectBoundingBox",i=r?t.getBoundingBox(e):null;if(r&&!i)return null;!this.getAttribute("x1").hasValue()&&!this.getAttribute("y1").hasValue()&&!this.getAttribute("x2").hasValue()&&!this.getAttribute("y2").hasValue()&&(this.getAttribute("x1",!0).setValue(0),this.getAttribute("y1",!0).setValue(0),this.getAttribute("x2",!0).setValue(1),this.getAttribute("y2",!0).setValue(0));var n=r?i.x+i.width*this.getAttribute("x1").getNumber():this.getAttribute("x1").getPixels("x"),o=r?i.y+i.height*this.getAttribute("y1").getNumber():this.getAttribute("y1").getPixels("y"),s=r?i.x+i.width*this.getAttribute("x2").getNumber():this.getAttribute("x2").getPixels("x"),u=r?i.y+i.height*this.getAttribute("y2").getNumber():this.getAttribute("y2").getPixels("y");return n===s&&o===u?null:e.createLinearGradient(n,o,s,u)}}class j1 extends Tl{constructor(e,t,r){super(e,t,r),this.type="radialGradient",this.attributesToInherit.push("cx","cy","r","fx","fy","fr")}getGradient(e,t){var r=this.getGradientUnits()==="objectBoundingBox",i=t.getBoundingBox(e);if(r&&!i)return null;this.getAttribute("cx").hasValue()||this.getAttribute("cx",!0).setValue("50%"),this.getAttribute("cy").hasValue()||this.getAttribute("cy",!0).setValue("50%"),this.getAttribute("r").hasValue()||this.getAttribute("r",!0).setValue("50%");var n=r?i.x+i.width*this.getAttribute("cx").getNumber():this.getAttribute("cx").getPixels("x"),o=r?i.y+i.height*this.getAttribute("cy").getNumber():this.getAttribute("cy").getPixels("y"),s=n,u=o;this.getAttribute("fx").hasValue()&&(s=r?i.x+i.width*this.getAttribute("fx").getNumber():this.getAttribute("fx").getPixels("x")),this.getAttribute("fy").hasValue()&&(u=r?i.y+i.height*this.getAttribute("fy").getNumber():this.getAttribute("fy").getPixels("y"));var l=r?(i.width+i.height)/2*this.getAttribute("r").getNumber():this.getAttribute("r").getPixels(),h=this.getAttribute("fr").getPixels();return e.createRadialGradient(s,u,h,n,o,l)}}class F1 extends I{constructor(e,t,r){super(e,t,r),this.type="stop";var i=Math.max(0,Math.min(1,this.getAttribute("offset").getNumber())),n=this.getStyle("stop-opacity"),o=this.getStyle("stop-color",!0);o.getString()===""&&o.setValue("#000"),n.hasValue()&&(o=o.addOpacity(n)),this.offset=i,this.color=o.getColor()}}class rn extends I{constructor(e,t,r){super(e,t,r),this.type="animate",this.duration=0,this.initialValue=null,this.initialUnits="",this.removed=!1,this.frozen=!1,e.screen.animations.push(this),this.begin=this.getAttribute("begin").getMilliseconds(),this.maxDuration=this.begin+this.getAttribute("dur").getMilliseconds(),this.from=this.getAttribute("from"),this.to=this.getAttribute("to"),this.values=new S(e,"values",null);var i=this.getAttribute("values");i.hasValue()&&this.values.setValue(i.getString().split(";"))}getProperty(){var e=this.getAttribute("attributeType").getString(),t=this.getAttribute("attributeName").getString();return e==="CSS"?this.parent.getStyle(t,!0):this.parent.getAttribute(t,!0)}calcValue(){var{initialUnits:e}=this,{progress:t,from:r,to:i}=this.getProgress(),n=r.getNumber()+(i.getNumber()-r.getNumber())*t;return e==="%"&&(n*=100),"".concat(n).concat(e)}update(e){var{parent:t}=this,r=this.getProperty();if(this.initialValue||(this.initialValue=r.getString(),this.initialUnits=r.getUnits()),this.duration>this.maxDuration){var i=this.getAttribute("fill").getString("remove");if(this.getAttribute("repeatCount").getString()==="indefinite"||this.getAttribute("repeatDur").getString()==="indefinite")this.duration=0;else if(i==="freeze"&&!this.frozen)this.frozen=!0,t.animationFrozen=!0,t.animationFrozenValue=r.getString();else if(i==="remove"&&!this.removed)return this.removed=!0,r.setValue(t.animationFrozen?t.animationFrozenValue:this.initialValue),!0;return!1}this.duration+=e;var n=!1;if(this.begin{var l=n[u];return s+(l-s)*e}).join(" ");return o}}class z1 extends I{constructor(e,t,r){super(e,t,r),this.type="font",this.glyphs=Object.create(null),this.horizAdvX=this.getAttribute("horiz-adv-x").getNumber();var{definitions:i}=e,{children:n}=this;for(var o of n)switch(o.type){case"font-face":{this.fontFace=o;var s=o.getStyle("font-family");s.hasValue()&&(i[s.getString()]=this);break}case"missing-glyph":this.missingGlyph=o;break;case"glyph":{var u=o;u.arabicForm?(this.isRTL=!0,this.isArabic=!0,typeof this.glyphs[u.unicode]>"u"&&(this.glyphs[u.unicode]=Object.create(null)),this.glyphs[u.unicode][u.arabicForm]=u):this.glyphs[u.unicode]=u;break}}}render(){}}class H1 extends I{constructor(e,t,r){super(e,t,r),this.type="font-face",this.ascent=this.getAttribute("ascent").getNumber(),this.descent=this.getAttribute("descent").getNumber(),this.unitsPerEm=this.getAttribute("units-per-em").getNumber()}}class Y1 extends A{constructor(){super(...arguments),this.type="missing-glyph",this.horizAdvX=0}}class X1 extends Ce{constructor(){super(...arguments),this.type="tref"}getText(){var e=this.getHrefAttribute().getDefinition();if(e){var t=e.children[0];if(t)return t.getText()}return""}}class W1 extends Ce{constructor(e,t,r){super(e,t,r),this.type="a";var{childNodes:i}=t,n=i[0],o=i.length>0&&Array.from(i).every(s=>s.nodeType===3);this.hasText=o,this.text=o?this.getTextFromNode(n):""}getText(){return this.text}renderChildren(e){if(this.hasText){super.renderChildren(e);var{document:t,x:r,y:i}=this,{mouse:n}=t.screen,o=new S(t,"fontSize",Z.parse(t.ctx.font).fontSize);n.isWorking()&&n.checkBoundingBox(this,new ce(r,i-o.getPixels("y"),r+this.measureText(e),i))}else if(this.children.length>0){var s=new tn(this.document,null);s.children=this.children,s.parent=this,s.render(e)}}onClick(){var{window:e}=this.document;e&&e.open(this.getHrefAttribute().getString())}onMouseMove(){var e=this.document.ctx;e.canvas.style.cursor="pointer"}}function Co(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(a,i).enumerable})),t.push.apply(t,r)}return t}function ir(a){for(var e=1;e{var{type:i,points:n}=r;switch(i){case w.LINE_TO:e&&e.lineTo(n[0],n[1]);break;case w.MOVE_TO:e&&e.moveTo(n[0],n[1]);break;case w.CURVE_TO:e&&e.bezierCurveTo(n[0],n[1],n[2],n[3],n[4],n[5]);break;case w.QUAD_TO:e&&e.quadraticCurveTo(n[0],n[1],n[2],n[3]);break;case w.ARC:{var[o,s,u,l,h,f,c,v]=n,g=u>l?u:l,d=u>l?1:u/l,p=u>l?l/u:1;e&&(e.translate(o,s),e.rotate(c),e.scale(d,p),e.arc(0,0,g,h,h+f,!!(1-v)),e.scale(1/d,1/p),e.rotate(-c),e.translate(-o,-s));break}case w.CLOSE_PATH:e&&e.closePath();break}})}renderChildren(e){this.setTextData(e),e.save();var t=this.parent.getStyle("text-decoration").getString(),r=this.getFontSize(),{glyphInfo:i}=this,n=e.fillStyle;t==="underline"&&e.beginPath(),i.forEach((o,s)=>{var{p0:u,p1:l,rotation:h,text:f}=o;e.save(),e.translate(u.x,u.y),e.rotate(h),e.fillStyle&&e.fillText(f,0,0),e.strokeStyle&&e.strokeText(f,0,0),e.restore(),t==="underline"&&(s===0&&e.moveTo(u.x,u.y+r/8),e.lineTo(l.x,l.y+r/5))}),t==="underline"&&(e.lineWidth=r/20,e.strokeStyle=n,e.stroke(),e.closePath()),e.restore()}getLetterSpacingAt(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:0;return this.letterSpacingCache[e]||0}findSegmentToFitChar(e,t,r,i,n,o,s,u,l){var h=o,f=this.measureText(e,u);u===" "&&t==="justify"&&r-1&&(h+=this.getLetterSpacingAt(l));var c=this.textHeight/20,v=this.getEquidistantPointOnPath(h,c,0),g=this.getEquidistantPointOnPath(h+f,c,0),d={p0:v,p1:g},p=v&&g?Math.atan2(g.y-v.y,g.x-v.x):0;if(s){var y=Math.cos(Math.PI/2+p)*s,x=Math.cos(-p)*s;d.p0=ir(ir({},v),{},{x:v.x+y,y:v.y+x}),d.p1=ir(ir({},g),{},{x:g.x+y,y:g.y+x})}return h+=f,{offset:h,segment:d,rotation:p}}measureText(e,t){var{measuresCache:r}=this,i=t||this.getText();if(r.has(i))return r.get(i);var n=this.measureTargetText(e,i);return r.set(i,n),n}setTextData(e){if(!this.glyphInfo){var t=this.getText(),r=t.split(""),i=t.split(" ").length-1,n=this.parent.getAttribute("dx").split().map(T=>T.getPixels("x")),o=this.parent.getAttribute("dy").getPixels("y"),s=this.parent.getStyle("text-anchor").getString("start"),u=this.getStyle("letter-spacing"),l=this.parent.getStyle("letter-spacing"),h=0;!u.hasValue()||u.getValue()==="inherit"?h=l.getPixels():u.hasValue()&&u.getValue()!=="initial"&&u.getValue()!=="unset"&&(h=u.getPixels());var f=[],c=t.length;this.letterSpacingCache=f;for(var v=0;vE===0?0:T+$||0,0),d=this.measureText(e),p=Math.max(d+g,0);this.textWidth=d,this.textHeight=this.getFontSize(),this.glyphInfo=[];var y=this.getPathLength(),x=this.getStyle("startOffset").getNumber(0)*y,b=0;(s==="middle"||s==="center")&&(b=-p/2),(s==="end"||s==="right")&&(b=-p),b+=x,r.forEach((T,$)=>{var{offset:E,segment:O,rotation:C}=this.findSegmentToFitChar(e,s,p,y,i,b,o,T,$);b=E,!(!O.p0||!O.p1)&&this.glyphInfo.push({text:r[$],p0:O.p0,p1:O.p1,rotation:C})})}}parsePathData(e){if(this.pathLength=-1,!e)return[];var t=[],{pathParser:r}=e;for(r.reset();!r.isEnd();){var{current:i}=r,n=i?i.x:0,o=i?i.y:0,s=r.next(),u=s.type,l=[];switch(s.type){case w.MOVE_TO:this.pathM(r,l);break;case w.LINE_TO:u=this.pathL(r,l);break;case w.HORIZ_LINE_TO:u=this.pathH(r,l);break;case w.VERT_LINE_TO:u=this.pathV(r,l);break;case w.CURVE_TO:this.pathC(r,l);break;case w.SMOOTH_CURVE_TO:u=this.pathS(r,l);break;case w.QUAD_TO:this.pathQ(r,l);break;case w.SMOOTH_QUAD_TO:u=this.pathT(r,l);break;case w.ARC:l=this.pathA(r);break;case w.CLOSE_PATH:A.pathZ(r);break}s.type!==w.CLOSE_PATH?t.push({type:u,points:l,start:{x:n,y:o},pathLength:this.calcLength(n,o,u,l)}):t.push({type:w.CLOSE_PATH,points:[],pathLength:0})}return t}pathM(e,t){var{x:r,y:i}=A.pathM(e).point;t.push(r,i)}pathL(e,t){var{x:r,y:i}=A.pathL(e).point;return t.push(r,i),w.LINE_TO}pathH(e,t){var{x:r,y:i}=A.pathH(e).point;return t.push(r,i),w.LINE_TO}pathV(e,t){var{x:r,y:i}=A.pathV(e).point;return t.push(r,i),w.LINE_TO}pathC(e,t){var{point:r,controlPoint:i,currentPoint:n}=A.pathC(e);t.push(r.x,r.y,i.x,i.y,n.x,n.y)}pathS(e,t){var{point:r,controlPoint:i,currentPoint:n}=A.pathS(e);return t.push(r.x,r.y,i.x,i.y,n.x,n.y),w.CURVE_TO}pathQ(e,t){var{controlPoint:r,currentPoint:i}=A.pathQ(e);t.push(r.x,r.y,i.x,i.y)}pathT(e,t){var{controlPoint:r,currentPoint:i}=A.pathT(e);return t.push(r.x,r.y,i.x,i.y),w.QUAD_TO}pathA(e){var{rX:t,rY:r,sweepFlag:i,xAxisRotation:n,centp:o,a1:s,ad:u}=A.pathA(e);return i===0&&u>0&&(u-=2*Math.PI),i===1&&u<0&&(u+=2*Math.PI),[o.x,o.y,t,r,s,u,n,i]}calcLength(e,t,r,i){var n=0,o=null,s=null,u=0;switch(r){case w.LINE_TO:return this.getLineLength(e,t,i[0],i[1]);case w.CURVE_TO:for(n=0,o=this.getPointOnCubicBezier(0,e,t,i[0],i[1],i[2],i[3],i[4],i[5]),u=.01;u<=1;u+=.01)s=this.getPointOnCubicBezier(u,e,t,i[0],i[1],i[2],i[3],i[4],i[5]),n+=this.getLineLength(o.x,o.y,s.x,s.y),o=s;return n;case w.QUAD_TO:for(n=0,o=this.getPointOnQuadraticBezier(0,e,t,i[0],i[1],i[2],i[3]),u=.01;u<=1;u+=.01)s=this.getPointOnQuadraticBezier(u,e,t,i[0],i[1],i[2],i[3]),n+=this.getLineLength(o.x,o.y,s.x,s.y),o=s;return n;case w.ARC:{n=0;var l=i[4],h=i[5],f=i[4]+h,c=Math.PI/180;if(Math.abs(l-f)f;u-=c)s=this.getPointOnEllipticalArc(i[0],i[1],i[2],i[3],u,0),n+=this.getLineLength(o.x,o.y,s.x,s.y),o=s;else for(u=l+c;u5&&arguments[5]!==void 0?arguments[5]:t,s=arguments.length>6&&arguments[6]!==void 0?arguments[6]:r,u=(n-r)/(i-t+rt),l=Math.sqrt(e*e/(1+u*u));it)return null;var{dataArray:n}=this;for(var o of n){if(o&&(o.pathLength<5e-5||r+o.pathLength+5e-5=0&&u>f)break;i=this.getPointOnEllipticalArc(o.points[0],o.points[1],o.points[2],o.points[3],u,o.points[6]);break}case w.CURVE_TO:u=s/o.pathLength,u>1&&(u=1),i=this.getPointOnCubicBezier(u,o.start.x,o.start.y,o.points[0],o.points[1],o.points[2],o.points[3],o.points[4],o.points[5]);break;case w.QUAD_TO:u=s/o.pathLength,u>1&&(u=1),i=this.getPointOnQuadraticBezier(u,o.start.x,o.start.y,o.points[0],o.points[1],o.points[2],o.points[3]);break}if(i)return i;break}return null}getLineLength(e,t,r,i){return Math.sqrt((r-e)*(r-e)+(i-t)*(i-t))}getPathLength(){return this.pathLength===-1&&(this.pathLength=this.dataArray.reduce((e,t)=>t.pathLength>0?e+t.pathLength:e,0)),this.pathLength}getPointOnCubicBezier(e,t,r,i,n,o,s,u,l){var h=u*xo(e)+o*To(e)+i*Oo(e)+t*So(e),f=l*xo(e)+s*To(e)+n*Oo(e)+r*So(e);return{x:h,y:f}}getPointOnQuadraticBezier(e,t,r,i,n,o,s){var u=o*Eo(e)+i*$o(e)+t*wo(e),l=s*Eo(e)+n*$o(e)+r*wo(e);return{x:u,y:l}}getPointOnEllipticalArc(e,t,r,i,n,o){var s=Math.cos(o),u=Math.sin(o),l={x:r*Math.cos(n),y:i*Math.sin(n)};return{x:e+(l.x*s-l.y*u),y:t+(l.x*u+l.y*s)}}buildEquidistantCache(e,t){var r=this.getPathLength(),i=t||.25,n=e||r/100;if(!this.equidistantCache||this.equidistantCache.step!==n||this.equidistantCache.precision!==i){this.equidistantCache={step:n,precision:i,points:[]};for(var o=0,s=0;s<=r;s+=i){var u=this.getPointOnPath(s),l=this.getPointOnPath(s+i);!u||!l||(o+=this.getLineLength(u.x,u.y,l.x,l.y),o>=n&&(this.equidistantCache.points.push({x:u.x,y:u.y,distance:s}),o-=n))}}}getEquidistantPointOnPath(e,t,r){if(this.buildEquidistantCache(t,r),e<0||e-this.getPathLength()>5e-5)return null;var i=Math.round(e/this.getPathLength()*(this.equidistantCache.points.length-1));return this.equidistantCache.points[i]||null}}var Q1=/^\s*data:(([^/,;]+\/[^/,;]+)(?:;([^,;=]+=[^,;=]+))?)?(?:;(base64))?,(.*)$/i;class K1 extends Ge{constructor(e,t,r){super(e,t,r),this.type="image",this.loaded=!1;var i=this.getHrefAttribute().getString();if(i){var n=i.endsWith(".svg")||/^\s*data:image\/svg\+xml/i.test(i);e.images.push(this),n?this.loadSvg(i):this.loadImage(i),this.isSvg=n}}loadImage(e){var t=this;return xe(function*(){try{var r=yield t.document.createImage(e);t.image=r}catch(i){console.error('Error while loading image "'.concat(e,'":'),i)}t.loaded=!0})()}loadSvg(e){var t=this;return xe(function*(){var r=Q1.exec(e);if(r){var i=r[5];r[4]==="base64"?t.image=atob(i):t.image=decodeURIComponent(i)}else try{var n=yield t.document.fetch(e),o=yield n.text();t.image=o}catch(s){console.error('Error while loading image "'.concat(e,'":'),s)}t.loaded=!0})()}renderChildren(e){var{document:t,image:r,loaded:i}=this,n=this.getAttribute("x").getPixels("x"),o=this.getAttribute("y").getPixels("y"),s=this.getStyle("width").getPixels("x"),u=this.getStyle("height").getPixels("y");if(!(!i||!r||!s||!u)){if(e.save(),e.translate(n,o),this.isSvg){var l=t.canvg.forkString(e,this.image,{ignoreMouse:!0,ignoreAnimation:!0,ignoreDimensions:!0,ignoreClear:!0,offsetX:0,offsetY:0,scaleWidth:s,scaleHeight:u});l.document.documentElement.parent=this,l.render()}else{var h=this.image;t.setViewBox({ctx:e,aspectRatio:this.getAttribute("preserveAspectRatio").getString(),width:s,desiredWidth:h.width,height:u,desiredHeight:h.height}),this.loaded&&(typeof h.complete>"u"||h.complete)&&e.drawImage(h,0,0)}e.restore()}}getBoundingBox(){var e=this.getAttribute("x").getPixels("x"),t=this.getAttribute("y").getPixels("y"),r=this.getStyle("width").getPixels("x"),i=this.getStyle("height").getPixels("y");return new ce(e,t,e+r,t+i)}}class Z1 extends Ge{constructor(){super(...arguments),this.type="symbol"}render(e){}}class J1{constructor(e){this.document=e,this.loaded=!1,e.fonts.push(this)}load(e,t){var r=this;return xe(function*(){try{var{document:i}=r,n=yield i.canvg.parser.load(t),o=n.getElementsByTagName("font");Array.from(o).forEach(s=>{var u=i.createElement(s);i.definitions[e]=u})}catch(s){console.error('Error while loading font "'.concat(t,'":'),s)}r.loaded=!0})()}}class Ol extends I{constructor(e,t,r){super(e,t,r),this.type="style";var i=lt(Array.from(t.childNodes).map(o=>o.textContent).join("").replace(/(\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)|(^[\s]*\/\/.*)/gm,"").replace(/@import.*;/g,"")),n=i.split("}");n.forEach(o=>{var s=o.trim();if(s){var u=s.split("{"),l=u[0].split(","),h=u[1].split(";");l.forEach(f=>{var c=f.trim();if(c){var v=e.styles[c]||{};if(h.forEach(p=>{var y=p.indexOf(":"),x=p.substr(0,y).trim(),b=p.substr(y+1,p.length-y).trim();x&&b&&(v[x]=new S(e,x,b))}),e.styles[c]=v,e.stylesSpecificity[c]=g1(c),c==="@font-face"){var g=v["font-family"].getString().replace(/"|'/g,""),d=v.src.getString().split(",");d.forEach(p=>{if(p.indexOf('format("svg")')>0){var y=cl(p);y&&new J1(e).load(g,y)}})}}})}})}}Ol.parseExternalUrl=cl;class e2 extends Ge{constructor(){super(...arguments),this.type="use"}setContext(e){super.setContext(e);var t=this.getAttribute("x"),r=this.getAttribute("y");t.hasValue()&&e.translate(t.getPixels("x"),0),r.hasValue()&&e.translate(0,r.getPixels("y"))}path(e){var{element:t}=this;t&&t.path(e)}renderChildren(e){var{document:t,element:r}=this;if(r){var i=r;if(r.type==="symbol"&&(i=new Nt(t,null),i.attributes.viewBox=new S(t,"viewBox",r.getAttribute("viewBox").getString()),i.attributes.preserveAspectRatio=new S(t,"preserveAspectRatio",r.getAttribute("preserveAspectRatio").getString()),i.attributes.overflow=new S(t,"overflow",r.getAttribute("overflow").getString()),i.children=r.children,r.styles.opacity=new S(t,"opacity",this.calculateOpacity())),i.type==="svg"){var n=this.getStyle("width",!1,!0),o=this.getStyle("height",!1,!0);n.hasValue()&&(i.attributes.width=new S(t,"width",n.getString())),o.hasValue()&&(i.attributes.height=new S(t,"height",o.getString()))}var s=i.parent;i.parent=this,i.render(e),i.parent=s}}getBoundingBox(e){var{element:t}=this;return t?t.getBoundingBox(e):null}elementTransform(){var{document:e,element:t}=this;return Be.fromElement(e,t)}get element(){return this.cachedElement||(this.cachedElement=this.getHrefAttribute().getDefinition()),this.cachedElement}}function nr(a,e,t,r,i,n){return a[t*r*4+e*4+n]}function sr(a,e,t,r,i,n,o){a[t*r*4+e*4+n]=o}function F(a,e,t){var r=a[e];return r*t}function me(a,e,t,r){return e+Math.cos(a)*t+Math.sin(a)*r}class Sl extends I{constructor(e,t,r){super(e,t,r),this.type="feColorMatrix";var i=ne(this.getAttribute("values").getString());switch(this.getAttribute("type").getString("matrix")){case"saturate":{var n=i[0];i=[.213+.787*n,.715-.715*n,.072-.072*n,0,0,.213-.213*n,.715+.285*n,.072-.072*n,0,0,.213-.213*n,.715-.715*n,.072+.928*n,0,0,0,0,0,1,0,0,0,0,0,1];break}case"hueRotate":{var o=i[0]*Math.PI/180;i=[me(o,.213,.787,-.213),me(o,.715,-.715,-.715),me(o,.072,-.072,.928),0,0,me(o,.213,-.213,.143),me(o,.715,.285,.14),me(o,.072,-.072,-.283),0,0,me(o,.213,-.213,-.787),me(o,.715,-.715,.715),me(o,.072,.928,.072),0,0,0,0,0,1,0,0,0,0,0,1];break}case"luminanceToAlpha":i=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,.2125,.7154,.0721,0,0,0,0,0,0,1];break}this.matrix=i,this.includeOpacity=this.getAttribute("includeOpacity").hasValue()}apply(e,t,r,i,n){for(var{includeOpacity:o,matrix:s}=this,u=e.getImageData(0,0,i,n),l=0;l{u.addBoundingBox(g.getBoundingBox(e))}),i=Math.floor(u.x1),n=Math.floor(u.y1),o=Math.floor(u.width),s=Math.floor(u.height)}var l=this.removeStyles(t,kr.ignoreStyles),h=r.createCanvas(i+o,n+s),f=h.getContext("2d");r.screen.setDefaults(f),this.renderChildren(f),new Sl(r,{nodeType:1,childNodes:[],attributes:[{nodeName:"type",value:"luminanceToAlpha"},{nodeName:"includeOpacity",value:"true"}]}).apply(f,0,0,i+o,n+s);var c=r.createCanvas(i+o,n+s),v=c.getContext("2d");r.screen.setDefaults(v),t.render(v),v.globalCompositeOperation="destination-in",v.fillStyle=f.createPattern(h,"no-repeat"),v.fillRect(0,0,i+o,n+s),e.fillStyle=v.createPattern(c,"no-repeat"),e.fillRect(0,0,i+o,n+s),this.restoreStyles(t,l)}render(e){}}kr.ignoreStyles=["mask","transform","clip-path"];var Ao=()=>{};class t2 extends I{constructor(){super(...arguments),this.type="clipPath"}apply(e){var{document:t}=this,r=Reflect.getPrototypeOf(e),{beginPath:i,closePath:n}=e;r&&(r.beginPath=Ao,r.closePath=Ao),Reflect.apply(i,e,[]),this.children.forEach(o=>{if(!(typeof o.path>"u")){var s=typeof o.elementTransform<"u"?o.elementTransform():null;s||(s=Be.fromElement(t,o)),s&&s.apply(e),o.path(e),r&&(r.closePath=n),s&&s.unapply(e)}}),Reflect.apply(n,e,[]),e.clip(),r&&(r.beginPath=i,r.closePath=n)}render(e){}}class Br extends I{constructor(){super(...arguments),this.type="filter"}apply(e,t){var{document:r,children:i}=this,n=t.getBoundingBox(e);if(n){var o=0,s=0;i.forEach(y=>{var x=y.extraFilterDistance||0;o=Math.max(o,x),s=Math.max(s,x)});var u=Math.floor(n.width),l=Math.floor(n.height),h=u+2*o,f=l+2*s;if(!(h<1||f<1)){var c=Math.floor(n.x),v=Math.floor(n.y),g=this.removeStyles(t,Br.ignoreStyles),d=r.createCanvas(h,f),p=d.getContext("2d");r.screen.setDefaults(p),p.translate(-c+o,-v+s),t.render(p),i.forEach(y=>{typeof y.apply=="function"&&y.apply(p,0,0,h,f)}),e.drawImage(d,0,0,h,f,c-o,v-s,h,f),this.restoreStyles(t,g)}}}render(e){}}Br.ignoreStyles=["filter","transform","clip-path"];class r2 extends I{constructor(e,t,r){super(e,t,r),this.type="feDropShadow",this.addStylesFromStyleDefinition()}apply(e,t,r,i,n){}}class a2 extends I{constructor(){super(...arguments),this.type="feMorphology"}apply(e,t,r,i,n){}}class i2 extends I{constructor(){super(...arguments),this.type="feComposite"}apply(e,t,r,i,n){}}class n2 extends I{constructor(e,t,r){super(e,t,r),this.type="feGaussianBlur",this.blurRadius=Math.floor(this.getAttribute("stdDeviation").getNumber()),this.extraFilterDistance=this.blurRadius}apply(e,t,r,i,n){var{document:o,blurRadius:s}=this,u=o.window?o.window.document.body:null,l=e.canvas;l.id=o.getUniqueId(),u&&(l.style.display="none",u.appendChild(l)),Zb(l,t,r,i,n,s),u&&u.removeChild(l)}}class s2 extends I{constructor(){super(...arguments),this.type="title"}}class o2 extends I{constructor(){super(...arguments),this.type="desc"}}var u2={svg:Nt,rect:bl,circle:I1,ellipse:M1,line:_1,polyline:xl,polygon:V1,path:A,pattern:D1,marker:L1,defs:k1,linearGradient:B1,radialGradient:j1,stop:F1,animate:rn,animateColor:U1,animateTransform:G1,font:z1,"font-face":H1,"missing-glyph":Y1,glyph:ml,text:Ce,tspan:Lr,tref:X1,a:W1,textPath:q1,image:K1,g:tn,symbol:Z1,style:Ol,use:e2,mask:kr,clipPath:t2,filter:Br,feDropShadow:r2,feMorphology:a2,feComposite:i2,feColorMatrix:Sl,feGaussianBlur:n2,title:s2,desc:o2};function Po(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(a,i).enumerable})),t.push.apply(t,r)}return t}function l2(a){for(var e=1;e1&&arguments[1]!==void 0?arguments[1]:!1,t=document.createElement("img");return e&&(t.crossOrigin="Anonymous"),new Promise((r,i)=>{t.onload=()=>{r(t)},t.onerror=(n,o,s,u,l)=>{i(l)},t.src=a})}),mi.apply(this,arguments)}class $e{constructor(e){var{rootEmSize:t=12,emSize:r=12,createCanvas:i=$e.createCanvas,createImage:n=$e.createImage,anonymousCrossOrigin:o}=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};this.canvg=e,this.definitions=Object.create(null),this.styles=Object.create(null),this.stylesSpecificity=Object.create(null),this.images=[],this.fonts=[],this.emSizeStack=[],this.uniqueId=0,this.screen=e.screen,this.rootEmSize=t,this.emSize=r,this.createCanvas=i,this.createImage=this.bindCreateImage(n,o),this.screen.wait(this.isImagesLoaded.bind(this)),this.screen.wait(this.isFontsLoaded.bind(this))}bindCreateImage(e,t){return typeof t=="boolean"?(r,i)=>e(r,typeof i=="boolean"?i:t):e}get window(){return this.screen.window}get fetch(){return this.screen.fetch}get ctx(){return this.screen.ctx}get emSize(){var{emSizeStack:e}=this;return e[e.length-1]}set emSize(e){var{emSizeStack:t}=this;t.push(e)}popEmSize(){var{emSizeStack:e}=this;e.pop()}getUniqueId(){return"canvg".concat(++this.uniqueId)}isImagesLoaded(){return this.images.every(e=>e.loaded)}isFontsLoaded(){return this.fonts.every(e=>e.loaded)}createDocumentElement(e){var t=this.createElement(e.documentElement);return t.root=!0,t.addStylesFromStyleDefinition(),this.documentElement=t,t}createElement(e){var t=e.nodeName.replace(/^[^:]+:/,""),r=$e.elementTypes[t];return typeof r<"u"?new r(this,e):new w1(this,e)}createTextNode(e){return new N1(this,e)}setViewBox(e){this.screen.setViewBox(l2({document:this},e))}}$e.createCanvas=h2;$e.createImage=v2;$e.elementTypes=u2;function Ro(a,e){var t=Object.keys(a);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(a);e&&(r=r.filter(function(i){return Object.getOwnPropertyDescriptor(a,i).enumerable})),t.push.apply(t,r)}return t}function De(a){for(var e=1;e2&&arguments[2]!==void 0?arguments[2]:{};this.parser=new Ga(r),this.screen=new Dr(e,r),this.options=r;var i=new $e(this,r),n=i.createDocumentElement(t);this.document=i,this.documentElement=n}static from(e,t){var r=arguments;return xe(function*(){var i=r.length>2&&r[2]!==void 0?r[2]:{},n=new Ga(i),o=yield n.parse(t);return new mt(e,o,i)})()}static fromString(e,t){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},i=new Ga(r),n=i.parseFromString(t);return new mt(e,n,r)}fork(e,t){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return mt.from(e,t,De(De({},this.options),r))}forkString(e,t){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};return mt.fromString(e,t,De(De({},this.options),r))}ready(){return this.screen.ready()}isReady(){return this.screen.isReady()}render(){var e=arguments,t=this;return xe(function*(){var r=e.length>0&&e[0]!==void 0?e[0]:{};t.start(De({enableRedraw:!0,ignoreAnimation:!0,ignoreMouse:!0},r)),yield t.ready(),t.stop()})()}start(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},{documentElement:t,screen:r,options:i}=this;r.start(t,De(De({enableRedraw:!0},i),e))}stop(){this.screen.stop()}resize(e){var t=arguments.length>1&&arguments[1]!==void 0?arguments[1]:e,r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:!1;this.documentElement.resize(e,t,r)}}export{W1 as AElement,U1 as AnimateColorElement,rn as AnimateElement,G1 as AnimateTransformElement,ce as BoundingBox,xo as CB1,To as CB2,Oo as CB3,So as CB4,mt as Canvg,I1 as CircleElement,t2 as ClipPathElement,k1 as DefsElement,o2 as DescElement,$e as Document,I as Element,M1 as EllipseElement,Sl as FeColorMatrixElement,i2 as FeCompositeElement,r2 as FeDropShadowElement,n2 as FeGaussianBlurElement,a2 as FeMorphologyElement,Br as FilterElement,Z as Font,z1 as FontElement,H1 as FontFaceElement,tn as GElement,ml as GlyphElement,Tl as GradientElement,K1 as ImageElement,_1 as LineElement,B1 as LinearGradientElement,L1 as MarkerElement,kr as MaskElement,pl as Matrix,Y1 as MissingGlyphElement,p1 as Mouse,rt as PSEUDO_ZERO,Ga as Parser,A as PathElement,w as PathParser,D1 as PatternElement,k as Point,V1 as PolygonElement,xl as PolylineElement,S as Property,Eo as QB1,$o as QB2,wo as QB3,j1 as RadialGradientElement,bl as RectElement,Ge as RenderedElement,x1 as Rotate,Nt as SVGElement,J1 as SVGFontLoader,T1 as Scale,Dr as Screen,yl as Skew,O1 as SkewX,S1 as SkewY,F1 as StopElement,Ol as StyleElement,Z1 as SymbolElement,X1 as TRefElement,Lr as TSpanElement,Ce as TextElement,q1 as TextPathElement,s2 as TitleElement,Be as Transform,b1 as Translate,w1 as UnknownElement,e2 as UseElement,d1 as ViewPort,lt as compressSpaces,mt as default,g1 as getSelectorSpecificity,n1 as normalizeAttributeName,s1 as normalizeColor,cl as parseExternalUrl,c2 as presets,ne as toNumbers,r1 as trimLeft,a1 as trimRight,mo as vectorMagnitude,bo as vectorsAngle,yi as vectorsRatio}; -//# sourceMappingURL=index.es.DA9NjhHN.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/index.es.DA9NjhHN.js.map b/deploy-package-20260223-151231/frontend/assets/index.es.DA9NjhHN.js.map deleted file mode 100644 index bf68e32..0000000 --- a/deploy-package-20260223-151231/frontend/assets/index.es.DA9NjhHN.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index.es.DA9NjhHN.js","sources":["../../node_modules/core-js/internals/global-this.js","../../node_modules/core-js/internals/fails.js","../../node_modules/core-js/internals/descriptors.js","../../node_modules/core-js/internals/function-bind-native.js","../../node_modules/core-js/internals/function-call.js","../../node_modules/core-js/internals/object-property-is-enumerable.js","../../node_modules/core-js/internals/create-property-descriptor.js","../../node_modules/core-js/internals/function-uncurry-this.js","../../node_modules/core-js/internals/classof-raw.js","../../node_modules/core-js/internals/indexed-object.js","../../node_modules/core-js/internals/is-null-or-undefined.js","../../node_modules/core-js/internals/require-object-coercible.js","../../node_modules/core-js/internals/to-indexed-object.js","../../node_modules/core-js/internals/is-callable.js","../../node_modules/core-js/internals/is-object.js","../../node_modules/core-js/internals/get-built-in.js","../../node_modules/core-js/internals/object-is-prototype-of.js","../../node_modules/core-js/internals/environment-user-agent.js","../../node_modules/core-js/internals/environment-v8-version.js","../../node_modules/core-js/internals/symbol-constructor-detection.js","../../node_modules/core-js/internals/use-symbol-as-uid.js","../../node_modules/core-js/internals/is-symbol.js","../../node_modules/core-js/internals/try-to-string.js","../../node_modules/core-js/internals/a-callable.js","../../node_modules/core-js/internals/get-method.js","../../node_modules/core-js/internals/ordinary-to-primitive.js","../../node_modules/core-js/internals/define-global-property.js","../../node_modules/core-js/internals/shared-store.js","../../node_modules/core-js/internals/shared.js","../../node_modules/core-js/internals/to-object.js","../../node_modules/core-js/internals/has-own-property.js","../../node_modules/core-js/internals/uid.js","../../node_modules/core-js/internals/well-known-symbol.js","../../node_modules/core-js/internals/to-primitive.js","../../node_modules/core-js/internals/to-property-key.js","../../node_modules/core-js/internals/document-create-element.js","../../node_modules/core-js/internals/ie8-dom-define.js","../../node_modules/core-js/internals/object-get-own-property-descriptor.js","../../node_modules/core-js/internals/v8-prototype-define-bug.js","../../node_modules/core-js/internals/an-object.js","../../node_modules/core-js/internals/object-define-property.js","../../node_modules/core-js/internals/create-non-enumerable-property.js","../../node_modules/core-js/internals/function-name.js","../../node_modules/core-js/internals/inspect-source.js","../../node_modules/core-js/internals/weak-map-basic-detection.js","../../node_modules/core-js/internals/shared-key.js","../../node_modules/core-js/internals/hidden-keys.js","../../node_modules/core-js/internals/internal-state.js","../../node_modules/core-js/internals/make-built-in.js","../../node_modules/core-js/internals/define-built-in.js","../../node_modules/core-js/internals/math-trunc.js","../../node_modules/core-js/internals/to-integer-or-infinity.js","../../node_modules/core-js/internals/to-absolute-index.js","../../node_modules/core-js/internals/to-length.js","../../node_modules/core-js/internals/length-of-array-like.js","../../node_modules/core-js/internals/array-includes.js","../../node_modules/core-js/internals/object-keys-internal.js","../../node_modules/core-js/internals/enum-bug-keys.js","../../node_modules/core-js/internals/object-get-own-property-names.js","../../node_modules/core-js/internals/object-get-own-property-symbols.js","../../node_modules/core-js/internals/own-keys.js","../../node_modules/core-js/internals/copy-constructor-properties.js","../../node_modules/core-js/internals/is-forced.js","../../node_modules/core-js/internals/export.js","../../node_modules/core-js/internals/environment.js","../../node_modules/core-js/internals/environment-is-node.js","../../node_modules/core-js/internals/path.js","../../node_modules/core-js/internals/function-uncurry-this-accessor.js","../../node_modules/core-js/internals/is-possible-prototype.js","../../node_modules/core-js/internals/a-possible-prototype.js","../../node_modules/core-js/internals/object-set-prototype-of.js","../../node_modules/core-js/internals/set-to-string-tag.js","../../node_modules/core-js/internals/define-built-in-accessor.js","../../node_modules/core-js/internals/set-species.js","../../node_modules/core-js/internals/an-instance.js","../../node_modules/core-js/internals/to-string-tag-support.js","../../node_modules/core-js/internals/classof.js","../../node_modules/core-js/internals/is-constructor.js","../../node_modules/core-js/internals/a-constructor.js","../../node_modules/core-js/internals/species-constructor.js","../../node_modules/core-js/internals/function-apply.js","../../node_modules/core-js/internals/function-uncurry-this-clause.js","../../node_modules/core-js/internals/function-bind-context.js","../../node_modules/core-js/internals/html.js","../../node_modules/core-js/internals/array-slice.js","../../node_modules/core-js/internals/validate-arguments-length.js","../../node_modules/core-js/internals/environment-is-ios.js","../../node_modules/core-js/internals/task.js","../../node_modules/core-js/internals/safe-get-built-in.js","../../node_modules/core-js/internals/queue.js","../../node_modules/core-js/internals/environment-is-ios-pebble.js","../../node_modules/core-js/internals/environment-is-webos-webkit.js","../../node_modules/core-js/internals/microtask.js","../../node_modules/core-js/internals/host-report-errors.js","../../node_modules/core-js/internals/perform.js","../../node_modules/core-js/internals/promise-native-constructor.js","../../node_modules/core-js/internals/promise-constructor-detection.js","../../node_modules/core-js/internals/new-promise-capability.js","../../node_modules/core-js/modules/es.promise.constructor.js","../../node_modules/core-js/internals/iterators.js","../../node_modules/core-js/internals/is-array-iterator-method.js","../../node_modules/core-js/internals/get-iterator-method.js","../../node_modules/core-js/internals/get-iterator.js","../../node_modules/core-js/internals/iterator-close.js","../../node_modules/core-js/internals/iterate.js","../../node_modules/core-js/internals/check-correctness-of-iteration.js","../../node_modules/core-js/internals/promise-statics-incorrect-iteration.js","../../node_modules/core-js/modules/es.promise.all.js","../../node_modules/core-js/modules/es.promise.catch.js","../../node_modules/core-js/modules/es.promise.race.js","../../node_modules/core-js/modules/es.promise.reject.js","../../node_modules/core-js/internals/promise-resolve.js","../../node_modules/core-js/modules/es.promise.resolve.js","../../node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js","../../node_modules/core-js/internals/to-string.js","../../node_modules/core-js/internals/regexp-flags.js","../../node_modules/core-js/internals/regexp-sticky-helpers.js","../../node_modules/core-js/internals/object-keys.js","../../node_modules/core-js/internals/object-define-properties.js","../../node_modules/core-js/internals/object-create.js","../../node_modules/core-js/internals/regexp-unsupported-dot-all.js","../../node_modules/core-js/internals/regexp-unsupported-ncg.js","../../node_modules/core-js/internals/regexp-exec.js","../../node_modules/core-js/modules/es.regexp.exec.js","../../node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","../../node_modules/core-js/internals/string-multibyte.js","../../node_modules/core-js/internals/advance-string-index.js","../../node_modules/core-js/internals/regexp-flags-detection.js","../../node_modules/core-js/internals/regexp-get-flags.js","../../node_modules/core-js/internals/regexp-exec-abstract.js","../../node_modules/core-js/modules/es.string.match.js","../../node_modules/core-js/internals/get-substitution.js","../../node_modules/core-js/modules/es.string.replace.js","../../node_modules/core-js/internals/is-regexp.js","../../node_modules/core-js/internals/not-a-regexp.js","../../node_modules/core-js/internals/correct-is-regexp-logic.js","../../node_modules/core-js/modules/es.string.starts-with.js","../../node_modules/core-js/internals/add-to-unscopables.js","../../node_modules/core-js/internals/correct-prototype-getter.js","../../node_modules/core-js/internals/object-get-prototype-of.js","../../node_modules/core-js/internals/iterators-core.js","../../node_modules/core-js/internals/iterator-create-constructor.js","../../node_modules/core-js/internals/iterator-define.js","../../node_modules/core-js/internals/create-iter-result-object.js","../../node_modules/core-js/modules/es.array.iterator.js","../../node_modules/core-js/internals/dom-iterables.js","../../node_modules/core-js/internals/dom-token-list-prototype.js","../../node_modules/core-js/modules/web.dom-collections.iterator.js","../../node_modules/core-js/internals/array-reduce.js","../../node_modules/core-js/internals/array-method-is-strict.js","../../node_modules/core-js/modules/es.array.reduce.js","../../node_modules/core-js/modules/es.string.ends-with.js","../../node_modules/core-js/modules/es.string.split.js","../../node_modules/performance-now/lib/performance-now.js","../../node_modules/raf/index.js","../../node_modules/core-js/internals/whitespaces.js","../../node_modules/core-js/internals/string-trim.js","../../node_modules/core-js/internals/string-trim-forced.js","../../node_modules/core-js/modules/es.string.trim.js","../../node_modules/rgbcolor/index.js","../../node_modules/core-js/modules/es.array.index-of.js","../../node_modules/core-js/modules/es.string.includes.js","../../node_modules/core-js/internals/is-array.js","../../node_modules/core-js/modules/es.array.reverse.js","../../node_modules/svg-pathdata/lib/SVGPathData.module.js","../../node_modules/core-js/modules/es.regexp.to-string.js","../../node_modules/stackblur-canvas/dist/stackblur-es.js","../../node_modules/canvg/lib/index.es.js"],"sourcesContent":["'use strict';\nvar check = function (it) {\n return it && it.Math === Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n check(typeof this == 'object' && this) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || Function('return this')();\n","'use strict';\nmodule.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] !== 7;\n});\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-function-prototype-bind -- safe\n var test = (function () { /* empty */ }).bind();\n // eslint-disable-next-line no-prototype-builtins -- safe\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar call = Function.prototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","'use strict';\nmodule.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\n// eslint-disable-next-line es/no-function-prototype-bind -- safe\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) === 'String' ? split(it, '') : $Object(it);\n} : $Object;\n","'use strict';\n// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n","'use strict';\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw new $TypeError(\"Can't call method on \" + it);\n return it;\n};\n","'use strict';\n// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","'use strict';\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\nvar documentAll = typeof document == 'object' && document.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nmodule.exports = typeof documentAll == 'undefined' && documentAll !== undefined ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\n\nmodule.exports = function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(globalThis[namespace]) : globalThis[namespace] && globalThis[namespace][method];\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nvar navigator = globalThis.navigator;\nvar userAgent = navigator && navigator.userAgent;\n\nmodule.exports = userAgent ? String(userAgent) : '';\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\n\nvar process = globalThis.process;\nvar Deno = globalThis.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/environment-v8-version');\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\nvar $String = globalThis.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol('symbol detection');\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n // of course, fail.\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","'use strict';\n/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL &&\n !Symbol.sham &&\n typeof Symbol.iterator == 'symbol';\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n","'use strict';\nvar $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw new $TypeError(tryToString(argument) + ' is not a function');\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw new $TypeError(\"Can't convert object to primitive value\");\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(globalThis, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n globalThis[key] = value;\n } return value;\n};\n","'use strict';\nvar IS_PURE = require('../internals/is-pure');\nvar globalThis = require('../internals/global-this');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = module.exports = globalThis[SHARED] || defineGlobalProperty(SHARED, {});\n\n(store.versions || (store.versions = [])).push({\n version: '3.47.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2014-2025 Denis Pushkarev (zloirock.ru), 2025 CoreJS Company (core-js.io)',\n license: 'https://github.com/zloirock/core-js/blob/v3.47.0/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n","'use strict';\nvar store = require('../internals/shared-store');\n\nmodule.exports = function (key, value) {\n return store[key] || (store[key] = value || {});\n};\n","'use strict';\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.1.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Symbol = globalThis.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n ? Symbol[name]\n : createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw new $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\n\nvar document = globalThis.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a !== 7;\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype !== 42;\n});\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw new $TypeError($String(argument) + ' is not an object');\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw new $TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = globalThis.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n","'use strict';\nvar shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\nvar globalThis = require('../internals/global-this');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = globalThis.TypeError;\nvar WeakMap = globalThis.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw new TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n /* eslint-disable no-self-assign -- prototype methods protection */\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n /* eslint-enable no-self-assign -- prototype methods protection */\n set = function (it, metadata) {\n if (store.has(it)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw new TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\).*$/, '$1') + ']';\n }\n if (options && options.getter) name = 'get ' + name;\n if (options && options.setter) name = 'set ' + name;\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n else value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n } else if (value.prototype) value.prototype = undefined;\n } catch (error) { /* empty */ }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n","'use strict';\nvar isCallable = require('../internals/is-callable');\nvar definePropertyModule = require('../internals/object-define-property');\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nmodule.exports = function (O, key, value, options) {\n if (!options) options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value)) makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple) O[key] = value;\n else defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe) delete O[key];\n else if (O[key]) simple = true;\n } catch (error) { /* empty */ }\n if (simple) O[key] = value;\n else definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n } return O;\n};\n","'use strict';\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n","'use strict';\nvar trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","'use strict';\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n var len = toIntegerOrInfinity(argument);\n return len > 0 ? min(len, 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","'use strict';\nvar toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n if (length === 0) return !IS_INCLUDES && -1;\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el !== el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value !== value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n","'use strict';\n// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","'use strict';\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value === POLYFILL ? true\n : value === NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.dontCallGetSet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = globalThis;\n } else if (STATIC) {\n target = globalThis[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = globalThis[TARGET] && globalThis[TARGET].prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n","'use strict';\n/* global Bun, Deno -- detection */\nvar globalThis = require('../internals/global-this');\nvar userAgent = require('../internals/environment-user-agent');\nvar classof = require('../internals/classof-raw');\n\nvar userAgentStartsWith = function (string) {\n return userAgent.slice(0, string.length) === string;\n};\n\nmodule.exports = (function () {\n if (userAgentStartsWith('Bun/')) return 'BUN';\n if (userAgentStartsWith('Cloudflare-Workers')) return 'CLOUDFLARE';\n if (userAgentStartsWith('Deno/')) return 'DENO';\n if (userAgentStartsWith('Node.js/')) return 'NODE';\n if (globalThis.Bun && typeof Bun.version == 'string') return 'BUN';\n if (globalThis.Deno && typeof Deno.version == 'object') return 'DENO';\n if (classof(globalThis.process) === 'process') return 'NODE';\n if (globalThis.window && globalThis.document) return 'BROWSER';\n return 'REST';\n})();\n","'use strict';\nvar ENVIRONMENT = require('../internals/environment');\n\nmodule.exports = ENVIRONMENT === 'NODE';\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nmodule.exports = globalThis;\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\n\nmodule.exports = function (object, key, method) {\n try {\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n return uncurryThis(aCallable(Object.getOwnPropertyDescriptor(object, key)[method]));\n } catch (error) { /* empty */ }\n};\n","'use strict';\nvar isObject = require('../internals/is-object');\n\nmodule.exports = function (argument) {\n return isObject(argument) || argument === null;\n};\n","'use strict';\nvar isPossiblePrototype = require('../internals/is-possible-prototype');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument) {\n if (isPossiblePrototype(argument)) return argument;\n throw new $TypeError(\"Can't set \" + $String(argument) + ' as a prototype');\n};\n","'use strict';\n/* eslint-disable no-proto -- safe */\nvar uncurryThisAccessor = require('../internals/function-uncurry-this-accessor');\nvar isObject = require('../internals/is-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n// eslint-disable-next-line es/no-object-setprototypeof -- safe\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = uncurryThisAccessor(Object.prototype, '__proto__', 'set');\n setter(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n requireObjectCoercible(O);\n aPossiblePrototype(proto);\n if (!isObject(O)) return O;\n if (CORRECT_SETTER) setter(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","'use strict';\nvar defineProperty = require('../internals/object-define-property').f;\nvar hasOwn = require('../internals/has-own-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (target, TAG, STATIC) {\n if (target && !STATIC) target = target.prototype;\n if (target && !hasOwn(target, TO_STRING_TAG)) {\n defineProperty(target, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","'use strict';\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineProperty = require('../internals/object-define-property');\n\nmodule.exports = function (target, name, descriptor) {\n if (descriptor.get) makeBuiltIn(descriptor.get, name, { getter: true });\n if (descriptor.set) makeBuiltIn(descriptor.set, name, { setter: true });\n return defineProperty.f(target, name, descriptor);\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineBuiltInAccessor(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","'use strict';\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it, Prototype) {\n if (isPrototypeOf(Prototype, it)) return it;\n throw new $TypeError('Incorrect invocation');\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n// eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) === 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) === 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof');\nvar getBuiltIn = require('../internals/get-built-in');\nvar inspectSource = require('../internals/inspect-source');\n\nvar noop = function () { /* empty */ };\nvar construct = getBuiltIn('Reflect', 'construct');\nvar constructorRegExp = /^\\s*(?:class|function)\\b/;\nvar exec = uncurryThis(constructorRegExp.exec);\nvar INCORRECT_TO_STRING = !constructorRegExp.test(noop);\n\nvar isConstructorModern = function isConstructor(argument) {\n if (!isCallable(argument)) return false;\n try {\n construct(noop, [], argument);\n return true;\n } catch (error) {\n return false;\n }\n};\n\nvar isConstructorLegacy = function isConstructor(argument) {\n if (!isCallable(argument)) return false;\n switch (classof(argument)) {\n case 'AsyncFunction':\n case 'GeneratorFunction':\n case 'AsyncGeneratorFunction': return false;\n }\n try {\n // we can't check .prototype since constructors produced by .bind haven't it\n // `Function#toString` throws on some built-it function in some legacy engines\n // (for example, `DOMQuad` and similar in FF41-)\n return INCORRECT_TO_STRING || !!exec(constructorRegExp, inspectSource(argument));\n } catch (error) {\n return true;\n }\n};\n\nisConstructorLegacy.sham = true;\n\n// `IsConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-isconstructor\nmodule.exports = !construct || fails(function () {\n var called;\n return isConstructorModern(isConstructorModern.call)\n || !isConstructorModern(Object)\n || !isConstructorModern(function () { called = true; })\n || called;\n}) ? isConstructorLegacy : isConstructorModern;\n","'use strict';\nvar isConstructor = require('../internals/is-constructor');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsConstructor(argument) is true`\nmodule.exports = function (argument) {\n if (isConstructor(argument)) return argument;\n throw new $TypeError(tryToString(argument) + ' is not a constructor');\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar aConstructor = require('../internals/a-constructor');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.es/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || isNullOrUndefined(S = anObject(C)[SPECIES]) ? defaultConstructor : aConstructor(S);\n};\n","'use strict';\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar apply = FunctionPrototype.apply;\nvar call = FunctionPrototype.call;\n\n// eslint-disable-next-line es/no-function-prototype-bind, es/no-reflect -- safe\nmodule.exports = typeof Reflect == 'object' && Reflect.apply || (NATIVE_BIND ? call.bind(apply) : function () {\n return call.apply(apply, arguments);\n});\n","'use strict';\nvar classofRaw = require('../internals/classof-raw');\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = function (fn) {\n // Nashorn bug:\n // https://github.com/zloirock/core-js/issues/1128\n // https://github.com/zloirock/core-js/issues/1130\n if (classofRaw(fn) === 'Function') return uncurryThis(fn);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar aCallable = require('../internals/a-callable');\nvar NATIVE_BIND = require('../internals/function-bind-native');\n\nvar bind = uncurryThis(uncurryThis.bind);\n\n// optional / simple context binding\nmodule.exports = function (fn, that) {\n aCallable(fn);\n return that === undefined ? fn : NATIVE_BIND ? bind(fn, that) : function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis([].slice);\n","'use strict';\nvar $TypeError = TypeError;\n\nmodule.exports = function (passed, required) {\n if (passed < required) throw new $TypeError('Not enough arguments');\n return passed;\n};\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\n// eslint-disable-next-line redos/no-vulnerable -- safe\nmodule.exports = /(?:ipad|iphone|ipod).*applewebkit/i.test(userAgent);\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar apply = require('../internals/function-apply');\nvar bind = require('../internals/function-bind-context');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar fails = require('../internals/fails');\nvar html = require('../internals/html');\nvar arraySlice = require('../internals/array-slice');\nvar createElement = require('../internals/document-create-element');\nvar validateArgumentsLength = require('../internals/validate-arguments-length');\nvar IS_IOS = require('../internals/environment-is-ios');\nvar IS_NODE = require('../internals/environment-is-node');\n\nvar set = globalThis.setImmediate;\nvar clear = globalThis.clearImmediate;\nvar process = globalThis.process;\nvar Dispatch = globalThis.Dispatch;\nvar Function = globalThis.Function;\nvar MessageChannel = globalThis.MessageChannel;\nvar String = globalThis.String;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar $location, defer, channel, port;\n\nfails(function () {\n // Deno throws a ReferenceError on `location` access without `--location` flag\n $location = globalThis.location;\n});\n\nvar run = function (id) {\n if (hasOwn(queue, id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar eventListener = function (event) {\n run(event.data);\n};\n\nvar globalPostMessageDefer = function (id) {\n // old engines have not location.origin\n globalThis.postMessage(String(id), $location.protocol + '//' + $location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = function setImmediate(handler) {\n validateArgumentsLength(arguments.length, 1);\n var fn = isCallable(handler) ? handler : Function(handler);\n var args = arraySlice(arguments, 1);\n queue[++counter] = function () {\n apply(fn, undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (IS_NODE) {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = eventListener;\n defer = bind(port.postMessage, port);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (\n globalThis.addEventListener &&\n isCallable(globalThis.postMessage) &&\n !globalThis.importScripts &&\n $location && $location.protocol !== 'file:' &&\n !fails(globalPostMessageDefer)\n ) {\n defer = globalPostMessageDefer;\n globalThis.addEventListener('message', eventListener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar DESCRIPTORS = require('../internals/descriptors');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Avoid NodeJS experimental warning\nmodule.exports = function (name) {\n if (!DESCRIPTORS) return globalThis[name];\n var descriptor = getOwnPropertyDescriptor(globalThis, name);\n return descriptor && descriptor.value;\n};\n","'use strict';\nvar Queue = function () {\n this.head = null;\n this.tail = null;\n};\n\nQueue.prototype = {\n add: function (item) {\n var entry = { item: item, next: null };\n var tail = this.tail;\n if (tail) tail.next = entry;\n else this.head = entry;\n this.tail = entry;\n },\n get: function () {\n var entry = this.head;\n if (entry) {\n var next = this.head = entry.next;\n if (next === null) this.tail = null;\n return entry.item;\n }\n }\n};\n\nmodule.exports = Queue;\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nmodule.exports = /ipad|iphone|ipod/i.test(userAgent) && typeof Pebble != 'undefined';\n","'use strict';\nvar userAgent = require('../internals/environment-user-agent');\n\nmodule.exports = /web0s(?!.*chrome)/i.test(userAgent);\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar safeGetBuiltIn = require('../internals/safe-get-built-in');\nvar bind = require('../internals/function-bind-context');\nvar macrotask = require('../internals/task').set;\nvar Queue = require('../internals/queue');\nvar IS_IOS = require('../internals/environment-is-ios');\nvar IS_IOS_PEBBLE = require('../internals/environment-is-ios-pebble');\nvar IS_WEBOS_WEBKIT = require('../internals/environment-is-webos-webkit');\nvar IS_NODE = require('../internals/environment-is-node');\n\nvar MutationObserver = globalThis.MutationObserver || globalThis.WebKitMutationObserver;\nvar document = globalThis.document;\nvar process = globalThis.process;\nvar Promise = globalThis.Promise;\nvar microtask = safeGetBuiltIn('queueMicrotask');\nvar notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!microtask) {\n var queue = new Queue();\n\n var flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (fn = queue.get()) try {\n fn();\n } catch (error) {\n if (queue.head) notify();\n throw error;\n }\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n // also except WebOS Webkit https://github.com/zloirock/core-js/issues/898\n if (!IS_IOS && !IS_NODE && !IS_WEBOS_WEBKIT && MutationObserver && document) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (!IS_IOS_PEBBLE && Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise.resolve(undefined);\n // workaround of WebKit ~ iOS Safari 10.1 bug\n promise.constructor = Promise;\n then = bind(promise.then, promise);\n notify = function () {\n then(flush);\n };\n // Node.js without promises\n } else if (IS_NODE) {\n notify = function () {\n process.nextTick(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessage\n // - onreadystatechange\n // - setTimeout\n } else {\n // `webpack` dev server bug on IE global methods - use bind(fn, global)\n macrotask = bind(macrotask, globalThis);\n notify = function () {\n macrotask(flush);\n };\n }\n\n microtask = function (fn) {\n if (!queue.head) notify();\n queue.add(fn);\n };\n}\n\nmodule.exports = microtask;\n","'use strict';\nmodule.exports = function (a, b) {\n try {\n // eslint-disable-next-line no-console -- safe\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n } catch (error) { /* empty */ }\n};\n","'use strict';\nmodule.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\n\nmodule.exports = globalThis.Promise;\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar isCallable = require('../internals/is-callable');\nvar isForced = require('../internals/is-forced');\nvar inspectSource = require('../internals/inspect-source');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar ENVIRONMENT = require('../internals/environment');\nvar IS_PURE = require('../internals/is-pure');\nvar V8_VERSION = require('../internals/environment-v8-version');\n\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\nvar SPECIES = wellKnownSymbol('species');\nvar SUBCLASSING = false;\nvar NATIVE_PROMISE_REJECTION_EVENT = isCallable(globalThis.PromiseRejectionEvent);\n\nvar FORCED_PROMISE_CONSTRUCTOR = isForced('Promise', function () {\n var PROMISE_CONSTRUCTOR_SOURCE = inspectSource(NativePromiseConstructor);\n var GLOBAL_CORE_JS_PROMISE = PROMISE_CONSTRUCTOR_SOURCE !== String(NativePromiseConstructor);\n // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // We can't detect it synchronously, so just check versions\n if (!GLOBAL_CORE_JS_PROMISE && V8_VERSION === 66) return true;\n // We need Promise#{ catch, finally } in the pure version for preventing prototype pollution\n if (IS_PURE && !(NativePromisePrototype['catch'] && NativePromisePrototype['finally'])) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (!V8_VERSION || V8_VERSION < 51 || !/native code/.test(PROMISE_CONSTRUCTOR_SOURCE)) {\n // Detect correctness of subclassing with @@species support\n var promise = new NativePromiseConstructor(function (resolve) { resolve(1); });\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n SUBCLASSING = promise.then(function () { /* empty */ }) instanceof FakePromise;\n if (!SUBCLASSING) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n } return !GLOBAL_CORE_JS_PROMISE && (ENVIRONMENT === 'BROWSER' || ENVIRONMENT === 'DENO') && !NATIVE_PROMISE_REJECTION_EVENT;\n});\n\nmodule.exports = {\n CONSTRUCTOR: FORCED_PROMISE_CONSTRUCTOR,\n REJECTION_EVENT: NATIVE_PROMISE_REJECTION_EVENT,\n SUBCLASSING: SUBCLASSING\n};\n","'use strict';\nvar aCallable = require('../internals/a-callable');\n\nvar $TypeError = TypeError;\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw new $TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aCallable(resolve);\n this.reject = aCallable(reject);\n};\n\n// `NewPromiseCapability` abstract operation\n// https://tc39.es/ecma262/#sec-newpromisecapability\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar IS_NODE = require('../internals/environment-is-node');\nvar globalThis = require('../internals/global-this');\nvar path = require('../internals/path');\nvar call = require('../internals/function-call');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar aCallable = require('../internals/a-callable');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar perform = require('../internals/perform');\nvar Queue = require('../internals/queue');\nvar InternalStateModule = require('../internals/internal-state');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar PromiseConstructorDetection = require('../internals/promise-constructor-detection');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\n\nvar PROMISE = 'Promise';\nvar FORCED_PROMISE_CONSTRUCTOR = PromiseConstructorDetection.CONSTRUCTOR;\nvar NATIVE_PROMISE_REJECTION_EVENT = PromiseConstructorDetection.REJECTION_EVENT;\nvar NATIVE_PROMISE_SUBCLASSING = PromiseConstructorDetection.SUBCLASSING;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar setInternalState = InternalStateModule.set;\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\nvar PromiseConstructor = NativePromiseConstructor;\nvar PromisePrototype = NativePromisePrototype;\nvar TypeError = globalThis.TypeError;\nvar document = globalThis.document;\nvar process = globalThis.process;\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\n\nvar DISPATCH_EVENT = !!(document && document.createEvent && globalThis.dispatchEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\n\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && isCallable(then = it.then) ? then : false;\n};\n\nvar callReaction = function (reaction, state) {\n var value = state.value;\n var ok = state.state === FULFILLED;\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(new TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n call(then, result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n};\n\nvar notify = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n microtask(function () {\n var reactions = state.reactions;\n var reaction;\n while (reaction = reactions.get()) {\n callReaction(reaction, state);\n }\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n globalThis.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_PROMISE_REJECTION_EVENT && (handler = globalThis['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n call(task, globalThis, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n call(task, globalThis, function () {\n var promise = state.facade;\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw new TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n call(then, value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED_PROMISE_CONSTRUCTOR) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromisePrototype);\n aCallable(executor);\n call(Internal, this);\n var state = getInternalPromiseState(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n\n PromisePrototype = PromiseConstructor.prototype;\n\n // eslint-disable-next-line no-unused-vars -- required for `.length`\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: new Queue(),\n rejection: false,\n state: PENDING,\n value: null\n });\n };\n\n // `Promise.prototype.then` method\n // https://tc39.es/ecma262/#sec-promise.prototype.then\n Internal.prototype = defineBuiltIn(PromisePrototype, 'then', function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n state.parent = true;\n reaction.ok = isCallable(onFulfilled) ? onFulfilled : true;\n reaction.fail = isCallable(onRejected) && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n if (state.state === PENDING) state.reactions.add(reaction);\n else microtask(function () {\n callReaction(reaction, state);\n });\n return reaction.promise;\n });\n\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalPromiseState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && isCallable(NativePromiseConstructor) && NativePromisePrototype !== Object.prototype) {\n nativeThen = NativePromisePrototype.then;\n\n if (!NATIVE_PROMISE_SUBCLASSING) {\n // make `Promise#then` return a polyfilled `Promise` for native promise-based APIs\n defineBuiltIn(NativePromisePrototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n call(nativeThen, that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n }\n\n // make `.constructor === Promise` work for native promise-based APIs\n try {\n delete NativePromisePrototype.constructor;\n } catch (error) { /* empty */ }\n\n // make `instanceof Promise` work for native promise-based APIs\n if (setPrototypeOf) {\n setPrototypeOf(NativePromisePrototype, PromisePrototype);\n }\n }\n}\n\n// `Promise` constructor\n// https://tc39.es/ecma262/#sec-promise-executor\n$({ global: true, constructor: true, wrap: true, forced: FORCED_PROMISE_CONSTRUCTOR }, {\n Promise: PromiseConstructor\n});\n\nPromiseWrapper = path.Promise;\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n","'use strict';\nmodule.exports = {};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","'use strict';\nvar classof = require('../internals/classof');\nvar getMethod = require('../internals/get-method');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (!isNullOrUndefined(it)) return getMethod(it, ITERATOR)\n || getMethod(it, '@@iterator')\n || Iterators[classof(it)];\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (argument, usingIterator) {\n var iteratorMethod = arguments.length < 2 ? getIteratorMethod(argument) : usingIterator;\n if (aCallable(iteratorMethod)) return anObject(call(iteratorMethod, argument));\n throw new $TypeError(tryToString(argument) + ' is not iterable');\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar getMethod = require('../internals/get-method');\n\nmodule.exports = function (iterator, kind, value) {\n var innerResult, innerError;\n anObject(iterator);\n try {\n innerResult = getMethod(iterator, 'return');\n if (!innerResult) {\n if (kind === 'throw') throw value;\n return value;\n }\n innerResult = call(innerResult, iterator);\n } catch (error) {\n innerError = true;\n innerResult = error;\n }\n if (kind === 'throw') throw value;\n if (innerError) throw innerResult;\n anObject(innerResult);\n return value;\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar tryToString = require('../internals/try-to-string');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar $TypeError = TypeError;\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar ResultPrototype = Result.prototype;\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_RECORD = !!(options && options.IS_RECORD);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator, 'normal');\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_RECORD) {\n iterator = iterable.iterator;\n } else if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (!iterFn) throw new $TypeError(tryToString(iterable) + ' is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = lengthOfArrayLike(iterable); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n }\n iterator = getIterator(iterable, iterFn);\n }\n\n next = IS_RECORD ? iterable.next : iterator.next;\n while (!(step = call(next, iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator, 'throw', error);\n }\n if (typeof result == 'object' && result && isPrototypeOf(ResultPrototype, result)) return result;\n } return new Result(false);\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n // eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line es/no-array-from, no-throw-literal -- required for testing\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n try {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n } catch (error) { return false; } // workaround of old WebKit + `eval` bug\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n // eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","'use strict';\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\n\nmodule.exports = FORCED_PROMISE_CONSTRUCTOR || !checkCorrectnessOfIteration(function (iterable) {\n NativePromiseConstructor.all(iterable).then(undefined, function () { /* empty */ });\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\n// `Promise.all` method\n// https://tc39.es/ecma262/#sec-promise.all\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aCallable(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n remaining++;\n call($promiseResolve, C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar defineBuiltIn = require('../internals/define-built-in');\n\nvar NativePromisePrototype = NativePromiseConstructor && NativePromiseConstructor.prototype;\n\n// `Promise.prototype.catch` method\n// https://tc39.es/ecma262/#sec-promise.prototype.catch\n$({ target: 'Promise', proto: true, forced: FORCED_PROMISE_CONSTRUCTOR, real: true }, {\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n});\n\n// makes sure that native promise-based APIs `Promise#catch` properly works with patched `Promise#then`\nif (!IS_PURE && isCallable(NativePromiseConstructor)) {\n var method = getBuiltIn('Promise').prototype['catch'];\n if (NativePromisePrototype['catch'] !== method) {\n defineBuiltIn(NativePromisePrototype, 'catch', method, { unsafe: true });\n }\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar aCallable = require('../internals/a-callable');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\nvar PROMISE_STATICS_INCORRECT_ITERATION = require('../internals/promise-statics-incorrect-iteration');\n\n// `Promise.race` method\n// https://tc39.es/ecma262/#sec-promise.race\n$({ target: 'Promise', stat: true, forced: PROMISE_STATICS_INCORRECT_ITERATION }, {\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aCallable(C.resolve);\n iterate(iterable, function (promise) {\n call($promiseResolve, C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\n\n// `Promise.reject` method\n// https://tc39.es/ecma262/#sec-promise.reject\n$({ target: 'Promise', stat: true, forced: FORCED_PROMISE_CONSTRUCTOR }, {\n reject: function reject(r) {\n var capability = newPromiseCapabilityModule.f(this);\n var capabilityReject = capability.reject;\n capabilityReject(r);\n return capability.promise;\n }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar NativePromiseConstructor = require('../internals/promise-native-constructor');\nvar FORCED_PROMISE_CONSTRUCTOR = require('../internals/promise-constructor-detection').CONSTRUCTOR;\nvar promiseResolve = require('../internals/promise-resolve');\n\nvar PromiseConstructorWrapper = getBuiltIn('Promise');\nvar CHECK_WRAPPER = IS_PURE && !FORCED_PROMISE_CONSTRUCTOR;\n\n// `Promise.resolve` method\n// https://tc39.es/ecma262/#sec-promise.resolve\n$({ target: 'Promise', stat: true, forced: IS_PURE || FORCED_PROMISE_CONSTRUCTOR }, {\n resolve: function resolve(x) {\n return promiseResolve(CHECK_WRAPPER && this === PromiseConstructorWrapper ? NativePromiseConstructor : this, x);\n }\n});\n","function asyncGeneratorStep(n, t, e, r, o, a, c) {\n try {\n var i = n[a](c),\n u = i.value;\n } catch (n) {\n return void e(n);\n }\n i.done ? t(u) : Promise.resolve(u).then(r, o);\n}\nfunction _asyncToGenerator(n) {\n return function () {\n var t = this,\n e = arguments;\n return new Promise(function (r, o) {\n var a = n.apply(t, e);\n function _next(n) {\n asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n);\n }\n function _throw(n) {\n asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n);\n }\n _next(void 0);\n });\n };\n}\nexport { _asyncToGenerator as default };","'use strict';\nvar classof = require('../internals/classof');\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw new TypeError('Cannot convert a Symbol value to a string');\n return $String(argument);\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.hasIndices) result += 'd';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.unicodeSets) result += 'v';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\n// babel-minify and Closure Compiler transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\nvar $RegExp = globalThis.RegExp;\n\nvar UNSUPPORTED_Y = fails(function () {\n var re = $RegExp('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') !== null;\n});\n\n// UC Browser bug\n// https://github.com/zloirock/core-js/issues/1008\nvar MISSED_STICKY = UNSUPPORTED_Y || fails(function () {\n return !$RegExp('a', 'y').sticky;\n});\n\nvar BROKEN_CARET = UNSUPPORTED_Y || fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = $RegExp('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') !== null;\n});\n\nmodule.exports = {\n BROKEN_CARET: BROKEN_CARET,\n MISSED_STICKY: MISSED_STICKY,\n UNSUPPORTED_Y: UNSUPPORTED_Y\n};\n","'use strict';\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.es/ecma262/#sec-object.keys\n// eslint-disable-next-line es/no-object-keys -- safe\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.es/ecma262/#sec-object.defineproperties\n// eslint-disable-next-line es/no-object-defineproperties -- safe\nexports.f = DESCRIPTORS && !V8_PROTOTYPE_DEFINE_BUG ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var props = toIndexedObject(Properties);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], props[key]);\n return O;\n};\n","'use strict';\n/* global ActiveXObject -- old IE, WSH */\nvar anObject = require('../internals/an-object');\nvar definePropertiesModule = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n // eslint-disable-next-line no-useless-assignment -- avoid memory leak\n activeXDocument = null;\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n activeXDocument = new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = typeof document != 'undefined'\n ? document.domain && activeXDocument\n ? NullProtoObjectViaActiveX(activeXDocument) // old IE\n : NullProtoObjectViaIFrame()\n : NullProtoObjectViaActiveX(activeXDocument); // WSH\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.es/ecma262/#sec-object.create\n// eslint-disable-next-line es/no-object-create -- safe\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : definePropertiesModule.f(result, Properties);\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\n// babel-minify and Closure Compiler transpiles RegExp('.', 's') -> /./s and it causes SyntaxError\nvar $RegExp = globalThis.RegExp;\n\nmodule.exports = fails(function () {\n var re = $RegExp('.', 's');\n return !(re.dotAll && re.test('\\n') && re.flags === 's');\n});\n","'use strict';\nvar fails = require('../internals/fails');\nvar globalThis = require('../internals/global-this');\n\n// babel-minify and Closure Compiler transpiles RegExp('(?b)', 'g') -> /(?b)/g and it causes SyntaxError\nvar $RegExp = globalThis.RegExp;\n\nmodule.exports = fails(function () {\n var re = $RegExp('(?b)', 'g');\n return re.exec('b').groups.a !== 'b' ||\n 'b'.replace(re, '$c') !== 'bc';\n});\n","'use strict';\n/* eslint-disable regexp/no-empty-capturing-group, regexp/no-empty-group, regexp/no-lazy-ends -- testing */\n/* eslint-disable regexp/no-useless-quantifier -- testing */\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar regexpFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar shared = require('../internals/shared');\nvar create = require('../internals/object-create');\nvar getInternalState = require('../internals/internal-state').get;\nvar UNSUPPORTED_DOT_ALL = require('../internals/regexp-unsupported-dot-all');\nvar UNSUPPORTED_NCG = require('../internals/regexp-unsupported-ncg');\n\nvar nativeReplace = shared('native-string-replace', String.prototype.replace);\nvar nativeExec = RegExp.prototype.exec;\nvar patchedExec = nativeExec;\nvar charAt = uncurryThis(''.charAt);\nvar indexOf = uncurryThis(''.indexOf);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n call(nativeExec, re1, 'a');\n call(nativeExec, re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y || UNSUPPORTED_DOT_ALL || UNSUPPORTED_NCG;\n\nif (PATCH) {\n patchedExec = function exec(string) {\n var re = this;\n var state = getInternalState(re);\n var str = toString(string);\n var raw = state.raw;\n var result, reCopy, lastIndex, match, i, object, group;\n\n if (raw) {\n raw.lastIndex = re.lastIndex;\n result = call(patchedExec, raw, str);\n re.lastIndex = raw.lastIndex;\n return result;\n }\n\n var groups = state.groups;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = call(regexpFlags, re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = replace(flags, 'y', '');\n if (indexOf(flags, 'g') === -1) {\n flags += 'g';\n }\n\n strCopy = stringSlice(str, re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && charAt(str, re.lastIndex - 1) !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = call(nativeExec, sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = stringSlice(match.input, charsAdded);\n match[0] = stringSlice(match[0], charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn't work for /(.?)?/\n call(nativeReplace, match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n if (match && groups) {\n match.groups = object = create(null);\n for (i = 0; i < groups.length; i++) {\n group = groups[i];\n object[group[0]] = match[group[1]];\n }\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n// `RegExp.prototype.exec` method\n// https://tc39.es/ecma262/#sec-regexp.prototype.exec\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar call = require('../internals/function-call');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\nvar RegExpPrototype = RegExp.prototype;\n\nmodule.exports = function (KEY, exec, FORCED, SHAM) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegExp methods\n var O = {};\n // eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) !== 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n var constructor = {};\n // eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\n constructor[SPECIES] = function () { return re; };\n re = { constructor: constructor, flags: '' };\n // eslint-disable-next-line unicorn/no-immediate-mutation -- ES3 syntax limitation\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () {\n execCalled = true;\n return null;\n };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n FORCED\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n var $exec = regexp.exec;\n if ($exec === regexpExec || $exec === RegExpPrototype.exec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: call(nativeRegExpMethod, regexp, str, arg2) };\n }\n return { done: true, value: call(nativeMethod, str, regexp, arg2) };\n }\n return { done: false };\n });\n\n defineBuiltIn(String.prototype, KEY, methods[0]);\n defineBuiltIn(RegExpPrototype, SYMBOL, methods[1]);\n }\n\n if (SHAM) createNonEnumerableProperty(RegExpPrototype[SYMBOL], 'sham', true);\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar charAt = uncurryThis(''.charAt);\nvar charCodeAt = uncurryThis(''.charCodeAt);\nvar stringSlice = uncurryThis(''.slice);\n\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = toString(requireObjectCoercible($this));\n var position = toIntegerOrInfinity(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = charCodeAt(S, position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING\n ? charAt(S, position)\n : first\n : CONVERT_TO_STRING\n ? stringSlice(S, position, position + 2)\n : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.es/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.es/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar fails = require('../internals/fails');\n\n// babel-minify and Closure Compiler transpiles RegExp('.', 'd') -> /./d and it causes SyntaxError\nvar RegExp = globalThis.RegExp;\n\nvar FLAGS_GETTER_IS_CORRECT = !fails(function () {\n var INDICES_SUPPORT = true;\n try {\n RegExp('.', 'd');\n } catch (error) {\n INDICES_SUPPORT = false;\n }\n\n var O = {};\n // modern V8 bug\n var calls = '';\n var expected = INDICES_SUPPORT ? 'dgimsy' : 'gimsy';\n\n var addGetter = function (key, chr) {\n // eslint-disable-next-line es/no-object-defineproperty -- safe\n Object.defineProperty(O, key, { get: function () {\n calls += chr;\n return true;\n } });\n };\n\n var pairs = {\n dotAll: 's',\n global: 'g',\n ignoreCase: 'i',\n multiline: 'm',\n sticky: 'y'\n };\n\n if (INDICES_SUPPORT) pairs.hasIndices = 'd';\n\n for (var key in pairs) addGetter(key, pairs[key]);\n\n // eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\n var result = Object.getOwnPropertyDescriptor(RegExp.prototype, 'flags').get.call(O);\n\n return result !== expected || calls !== expected;\n});\n\nmodule.exports = { correct: FLAGS_GETTER_IS_CORRECT };\n","'use strict';\nvar call = require('../internals/function-call');\nvar hasOwn = require('../internals/has-own-property');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar regExpFlagsDetection = require('../internals/regexp-flags-detection');\nvar regExpFlagsGetterImplementation = require('../internals/regexp-flags');\n\nvar RegExpPrototype = RegExp.prototype;\n\nmodule.exports = regExpFlagsDetection.correct ? function (it) {\n return it.flags;\n} : function (it) {\n return (!regExpFlagsDetection.correct && isPrototypeOf(RegExpPrototype, it) && !hasOwn(it, 'flags'))\n ? call(regExpFlagsGetterImplementation, it)\n : it.flags;\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar classof = require('../internals/classof-raw');\nvar regexpExec = require('../internals/regexp-exec');\n\nvar $TypeError = TypeError;\n\n// `RegExpExec` abstract operation\n// https://tc39.es/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (isCallable(exec)) {\n var result = call(exec, R, S);\n if (result !== null) anObject(result);\n return result;\n }\n if (classof(R) === 'RegExp') return call(regexpExec, R, S);\n throw new $TypeError('RegExp#exec called on incompatible receiver');\n};\n","'use strict';\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar getMethod = require('../internals/get-method');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\nvar stringIndexOf = uncurryThis(''.indexOf);\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.es/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = isObject(regexp) ? getMethod(regexp, MATCH) : undefined;\n return matcher ? call(matcher, regexp, O) : new RegExp(regexp)[MATCH](toString(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@match\n function (string) {\n var rx = anObject(this);\n var S = toString(string);\n var res = maybeCallNative(nativeMatch, rx, S);\n\n if (res.done) return res.value;\n\n var flags = toString(getRegExpFlags(rx));\n\n if (stringIndexOf(flags, 'g') === -1) return regExpExec(rx, S);\n\n var fullUnicode = stringIndexOf(flags, 'u') !== -1;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = toString(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar floor = Math.floor;\nvar charAt = uncurryThis(''.charAt);\nvar replace = uncurryThis(''.replace);\nvar stringSlice = uncurryThis(''.slice);\n// eslint-disable-next-line redos/no-vulnerable -- safe\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d{1,2}|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d{1,2})/g;\n\n// `GetSubstitution` abstract operation\n// https://tc39.es/ecma262/#sec-getsubstitution\nmodule.exports = function (matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return replace(replacement, symbols, function (match, ch) {\n var capture;\n switch (charAt(ch, 0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return stringSlice(str, 0, position);\n case \"'\": return stringSlice(str, tailPos);\n case '<':\n capture = namedCaptures[stringSlice(ch, 1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? charAt(ch, 1) : captures[f - 1] + charAt(ch, 1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n};\n","'use strict';\nvar apply = require('../internals/function-apply');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar fails = require('../internals/fails');\nvar anObject = require('../internals/an-object');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar getMethod = require('../internals/get-method');\nvar getSubstitution = require('../internals/get-substitution');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar REPLACE = wellKnownSymbol('replace');\nvar max = Math.max;\nvar min = Math.min;\nvar concat = uncurryThis([].concat);\nvar push = uncurryThis([].push);\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar stringSlice = uncurryThis(''.slice);\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n // eslint-disable-next-line regexp/prefer-escape-replacement-dollar-char -- required for testing\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n // eslint-disable-next-line regexp/no-useless-dollar-replacements -- false positive\n return ''.replace(re, '$') !== '7';\n});\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', function (_, nativeReplace, maybeCallNative) {\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.es/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = isObject(searchValue) ? getMethod(searchValue, REPLACE) : undefined;\n return replacer\n ? call(replacer, searchValue, O, replaceValue)\n : call(nativeReplace, toString(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@replace\n function (string, replaceValue) {\n var rx = anObject(this);\n var S = toString(string);\n\n if (\n typeof replaceValue == 'string' &&\n stringIndexOf(replaceValue, UNSAFE_SUBSTITUTE) === -1 &&\n stringIndexOf(replaceValue, '$<') === -1\n ) {\n var res = maybeCallNative(nativeReplace, rx, S, replaceValue);\n if (res.done) return res.value;\n }\n\n var functionalReplace = isCallable(replaceValue);\n if (!functionalReplace) replaceValue = toString(replaceValue);\n\n var flags = toString(getRegExpFlags(rx));\n var global = stringIndexOf(flags, 'g') !== -1;\n var fullUnicode;\n if (global) {\n fullUnicode = stringIndexOf(flags, 'u') !== -1;\n rx.lastIndex = 0;\n }\n\n var results = [];\n var result;\n while (true) {\n result = regExpExec(rx, S);\n if (result === null) break;\n\n push(results, result);\n if (!global) break;\n\n var matchStr = toString(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = toString(result[0]);\n var position = max(min(toIntegerOrInfinity(result.index), S.length), 0);\n var captures = [];\n var replacement;\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) push(captures, maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = concat([matched], captures, position, S);\n if (namedCaptures !== undefined) push(replacerArgs, namedCaptures);\n replacement = toString(apply(replaceValue, undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += stringSlice(S, nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n\n return accumulatedResult + stringSlice(S, nextSourcePosition);\n }\n ];\n}, !REPLACE_SUPPORTS_NAMED_GROUPS || !REPLACE_KEEPS_$0 || REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE);\n","'use strict';\nvar isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.es/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) === 'RegExp');\n};\n","'use strict';\nvar isRegExp = require('../internals/is-regexp');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (it) {\n if (isRegExp(it)) {\n throw new $TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (error1) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (error2) { /* empty */ }\n } return false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\nvar IS_PURE = require('../internals/is-pure');\n\nvar stringSlice = uncurryThis(''.slice);\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.es/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = toString(requireObjectCoercible(this));\n notARegExp(searchString);\n var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = toString(searchString);\n return stringSlice(that, index, index + search.length) === search;\n }\n});\n","'use strict';\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] === undefined) {\n defineProperty(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n // eslint-disable-next-line es/no-object-getprototypeof -- required for testing\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","'use strict';\nvar hasOwn = require('../internals/has-own-property');\nvar isCallable = require('../internals/is-callable');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar $Object = Object;\nvar ObjectPrototype = $Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.es/ecma262/#sec-object.getprototypeof\n// eslint-disable-next-line es/no-object-getprototypeof -- safe\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? $Object.getPrototypeOf : function (O) {\n var object = toObject(O);\n if (hasOwn(object, IE_PROTO)) return object[IE_PROTO];\n var constructor = object.constructor;\n if (isCallable(constructor) && object instanceof constructor) {\n return constructor.prototype;\n } return object instanceof $Object ? ObjectPrototype : null;\n};\n","'use strict';\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\n// `%IteratorPrototype%` object\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n/* eslint-disable es/no-array-prototype-keys -- safe */\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nvar NEW_ITERATOR_PROTOTYPE = !isObject(IteratorPrototype) || fails(function () {\n var test = {};\n // FF44- legacy iterators case\n return IteratorPrototype[ITERATOR].call(test) !== test;\n});\n\nif (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};\nelse if (IS_PURE) IteratorPrototype = create(IteratorPrototype);\n\n// `%IteratorPrototype%[@@iterator]()` method\n// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator\nif (!isCallable(IteratorPrototype[ITERATOR])) {\n defineBuiltIn(IteratorPrototype, ITERATOR, function () {\n return this;\n });\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next, ENUMERABLE_NEXT) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(+!ENUMERABLE_NEXT, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar IS_PURE = require('../internals/is-pure');\nvar FunctionName = require('../internals/function-name');\nvar isCallable = require('../internals/is-callable');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar PROPER_FUNCTION_NAME = FunctionName.PROPER;\nvar CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE;\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND && KIND in IterablePrototype) return IterablePrototype[KIND];\n\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n }\n\n return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME === 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) {\n defineBuiltIn(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array.prototype.{ values, @@iterator }.name in V8 / FF\n if (PROPER_FUNCTION_NAME && DEFAULT === VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) {\n createNonEnumerableProperty(IterablePrototype, 'name', VALUES);\n } else {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return call(nativeIterator, this); };\n }\n }\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n defineBuiltIn(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n defineBuiltIn(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT });\n }\n Iterators[NAME] = defaultIterator;\n\n return methods;\n};\n","'use strict';\n// `CreateIterResultObject` abstract operation\n// https://tc39.es/ecma262/#sec-createiterresultobject\nmodule.exports = function (value, done) {\n return { value: value, done: done };\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineProperty = require('../internals/object-define-property').f;\nvar defineIterator = require('../internals/iterator-define');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.es/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.es/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.es/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.es/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.es/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.es/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = null;\n return createIterResultObject(undefined, true);\n }\n switch (state.kind) {\n case 'keys': return createIterResultObject(index, false);\n case 'values': return createIterResultObject(target[index], false);\n } return createIterResultObject([index, target[index]], false);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.es/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.es/ecma262/#sec-createmappedargumentsobject\nvar values = Iterators.Arguments = Iterators.Array;\n\n// https://tc39.es/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n// V8 ~ Chrome 45- bug\nif (!IS_PURE && DESCRIPTORS && values.name !== 'values') try {\n defineProperty(values, 'name', { value: 'values' });\n} catch (error) { /* empty */ }\n","'use strict';\n// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","'use strict';\n// in old WebKit versions, `element.classList` is not an instance of global `DOMTokenList`\nvar documentCreateElement = require('../internals/document-create-element');\n\nvar classList = documentCreateElement('span').classList;\nvar DOMTokenListPrototype = classList && classList.constructor && classList.constructor.prototype;\n\nmodule.exports = DOMTokenListPrototype === Object.prototype ? undefined : DOMTokenListPrototype;\n","'use strict';\nvar globalThis = require('../internals/global-this');\nvar DOMIterables = require('../internals/dom-iterables');\nvar DOMTokenListPrototype = require('../internals/dom-token-list-prototype');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nvar handlePrototype = function (CollectionPrototype, COLLECTION_NAME) {\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n setToStringTag(CollectionPrototype, COLLECTION_NAME, true);\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n};\n\nfor (var COLLECTION_NAME in DOMIterables) {\n handlePrototype(globalThis[COLLECTION_NAME] && globalThis[COLLECTION_NAME].prototype, COLLECTION_NAME);\n}\n\nhandlePrototype(DOMTokenListPrototype, 'DOMTokenList');\n","'use strict';\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\nvar $TypeError = TypeError;\n\nvar REDUCE_EMPTY = 'Reduce of empty array with no initial value';\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = lengthOfArrayLike(O);\n aCallable(callbackfn);\n if (length === 0 && argumentsLength < 2) throw new $TypeError(REDUCE_EMPTY);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw new $TypeError(REDUCE_EMPTY);\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call -- required for testing\n method.call(null, argument || function () { return 1; }, 1);\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar CHROME_VERSION = require('../internals/environment-v8-version');\nvar IS_NODE = require('../internals/environment-is-node');\n\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\nvar FORCED = CHROME_BUG || !arrayMethodIsStrict('reduce');\n\n// `Array.prototype.reduce` method\n// https://tc39.es/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: FORCED }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n var length = arguments.length;\n return $reduce(this, callbackfn, length, length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\nvar IS_PURE = require('../internals/is-pure');\n\nvar slice = uncurryThis(''.slice);\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('endsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor(String.prototype, 'endsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.endsWith` method\n// https://tc39.es/ecma262/#sec-string.prototype.endswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = toString(requireObjectCoercible(this));\n notARegExp(searchString);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = that.length;\n var end = endPosition === undefined ? len : min(toLength(endPosition), len);\n var search = toString(searchString);\n return slice(that, end - search.length, end) === search;\n }\n});\n","'use strict';\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar getMethod = require('../internals/get-method');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar fails = require('../internals/fails');\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\nvar MAX_UINT32 = 0xFFFFFFFF;\nvar min = Math.min;\nvar push = uncurryThis([].push);\nvar stringSlice = uncurryThis(''.slice);\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n // eslint-disable-next-line regexp/no-empty-group -- required for testing\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nvar BUGGY = 'abbc'.split(/(b)*/)[1] === 'c' ||\n // eslint-disable-next-line regexp/no-empty-group -- required for testing\n 'test'.split(/(?:)/, -1).length !== 4 ||\n 'ab'.split(/(?:ab)*/).length !== 2 ||\n '.'.split(/(.?)(.?)/).length !== 4 ||\n // eslint-disable-next-line regexp/no-empty-capturing-group, regexp/no-empty-group -- required for testing\n '.'.split(/()()/).length > 1 ||\n ''.split(/.?/).length;\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit = '0'.split(undefined, 0).length ? function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : call(nativeSplit, this, separator, limit);\n } : nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.es/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = isObject(separator) ? getMethod(separator, SPLIT) : undefined;\n return splitter\n ? call(splitter, separator, O, limit)\n : call(internalSplit, toString(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.es/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (string, limit) {\n var rx = anObject(this);\n var S = toString(string);\n\n if (!BUGGY) {\n var res = maybeCallNative(internalSplit, rx, S, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n }\n\n var C = speciesConstructor(rx, RegExp);\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (UNSUPPORTED_Y ? 'g' : 'y');\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(UNSUPPORTED_Y ? '^(?:' + rx.source + ')' : rx, flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return regExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = UNSUPPORTED_Y ? 0 : q;\n var z = regExpExec(splitter, UNSUPPORTED_Y ? stringSlice(S, q) : S);\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (UNSUPPORTED_Y ? q : 0)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n push(A, stringSlice(S, p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n push(A, z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n push(A, stringSlice(S, p));\n return A;\n }\n ];\n}, BUGGY || !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC, UNSUPPORTED_Y);\n","// Generated by CoffeeScript 1.12.2\n(function() {\n var getNanoSeconds, hrtime, loadTime, moduleLoadTime, nodeLoadTime, upTime;\n\n if ((typeof performance !== \"undefined\" && performance !== null) && performance.now) {\n module.exports = function() {\n return performance.now();\n };\n } else if ((typeof process !== \"undefined\" && process !== null) && process.hrtime) {\n module.exports = function() {\n return (getNanoSeconds() - nodeLoadTime) / 1e6;\n };\n hrtime = process.hrtime;\n getNanoSeconds = function() {\n var hr;\n hr = hrtime();\n return hr[0] * 1e9 + hr[1];\n };\n moduleLoadTime = getNanoSeconds();\n upTime = process.uptime() * 1e9;\n nodeLoadTime = moduleLoadTime - upTime;\n } else if (Date.now) {\n module.exports = function() {\n return Date.now() - loadTime;\n };\n loadTime = Date.now();\n } else {\n module.exports = function() {\n return new Date().getTime() - loadTime;\n };\n loadTime = new Date().getTime();\n }\n\n}).call(this);\n\n//# sourceMappingURL=performance-now.js.map\n","var now = require('performance-now')\n , root = typeof window === 'undefined' ? global : window\n , vendors = ['moz', 'webkit']\n , suffix = 'AnimationFrame'\n , raf = root['request' + suffix]\n , caf = root['cancel' + suffix] || root['cancelRequest' + suffix]\n\nfor(var i = 0; !raf && i < vendors.length; i++) {\n raf = root[vendors[i] + 'Request' + suffix]\n caf = root[vendors[i] + 'Cancel' + suffix]\n || root[vendors[i] + 'CancelRequest' + suffix]\n}\n\n// Some versions of FF have rAF but not cAF\nif(!raf || !caf) {\n var last = 0\n , id = 0\n , queue = []\n , frameDuration = 1000 / 60\n\n raf = function(callback) {\n if(queue.length === 0) {\n var _now = now()\n , next = Math.max(0, frameDuration - (_now - last))\n last = next + _now\n setTimeout(function() {\n var cp = queue.slice(0)\n // Clear queue here to prevent\n // callbacks from appending listeners\n // to the current frame's queue\n queue.length = 0\n for(var i = 0; i < cp.length; i++) {\n if(!cp[i].cancelled) {\n try{\n cp[i].callback(last)\n } catch(e) {\n setTimeout(function() { throw e }, 0)\n }\n }\n }\n }, Math.round(next))\n }\n queue.push({\n handle: ++id,\n callback: callback,\n cancelled: false\n })\n return id\n }\n\n caf = function(handle) {\n for(var i = 0; i < queue.length; i++) {\n if(queue[i].handle === handle) {\n queue[i].cancelled = true\n }\n }\n }\n}\n\nmodule.exports = function(fn) {\n // Wrap in a new function to prevent\n // `cancel` potentially being assigned\n // to the native rAF function\n return raf.call(root, fn)\n}\nmodule.exports.cancel = function() {\n caf.apply(root, arguments)\n}\nmodule.exports.polyfill = function(object) {\n if (!object) {\n object = root;\n }\n object.requestAnimationFrame = raf\n object.cancelAnimationFrame = caf\n}\n","'use strict';\n// a string of all valid unicode whitespaces\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002' +\n '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar whitespaces = require('../internals/whitespaces');\n\nvar replace = uncurryThis(''.replace);\nvar ltrim = RegExp('^[' + whitespaces + ']+');\nvar rtrim = RegExp('(^|[^' + whitespaces + '])[' + whitespaces + ']+$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = toString(requireObjectCoercible($this));\n if (TYPE & 1) string = replace(string, ltrim, '');\n if (TYPE & 2) string = replace(string, rtrim, '$1');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.es/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","'use strict';\nvar PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;\nvar fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]()\n || non[METHOD_NAME]() !== non\n || (PROPER_FUNCTION_NAME && whitespaces[METHOD_NAME].name !== METHOD_NAME);\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.es/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n","/*\n\tBased on rgbcolor.js by Stoyan Stefanov \n\thttp://www.phpied.com/rgb-color-parser-in-javascript/\n*/\n\nmodule.exports = function(color_string) {\n this.ok = false;\n this.alpha = 1.0;\n\n // strip any leading #\n if (color_string.charAt(0) == '#') { // remove # if any\n color_string = color_string.substr(1,6);\n }\n\n color_string = color_string.replace(/ /g,'');\n color_string = color_string.toLowerCase();\n\n // before getting into regexps, try simple matches\n // and overwrite the input\n var simple_colors = {\n aliceblue: 'f0f8ff',\n antiquewhite: 'faebd7',\n aqua: '00ffff',\n aquamarine: '7fffd4',\n azure: 'f0ffff',\n beige: 'f5f5dc',\n bisque: 'ffe4c4',\n black: '000000',\n blanchedalmond: 'ffebcd',\n blue: '0000ff',\n blueviolet: '8a2be2',\n brown: 'a52a2a',\n burlywood: 'deb887',\n cadetblue: '5f9ea0',\n chartreuse: '7fff00',\n chocolate: 'd2691e',\n coral: 'ff7f50',\n cornflowerblue: '6495ed',\n cornsilk: 'fff8dc',\n crimson: 'dc143c',\n cyan: '00ffff',\n darkblue: '00008b',\n darkcyan: '008b8b',\n darkgoldenrod: 'b8860b',\n darkgray: 'a9a9a9',\n darkgreen: '006400',\n darkkhaki: 'bdb76b',\n darkmagenta: '8b008b',\n darkolivegreen: '556b2f',\n darkorange: 'ff8c00',\n darkorchid: '9932cc',\n darkred: '8b0000',\n darksalmon: 'e9967a',\n darkseagreen: '8fbc8f',\n darkslateblue: '483d8b',\n darkslategray: '2f4f4f',\n darkturquoise: '00ced1',\n darkviolet: '9400d3',\n deeppink: 'ff1493',\n deepskyblue: '00bfff',\n dimgray: '696969',\n dodgerblue: '1e90ff',\n feldspar: 'd19275',\n firebrick: 'b22222',\n floralwhite: 'fffaf0',\n forestgreen: '228b22',\n fuchsia: 'ff00ff',\n gainsboro: 'dcdcdc',\n ghostwhite: 'f8f8ff',\n gold: 'ffd700',\n goldenrod: 'daa520',\n gray: '808080',\n green: '008000',\n greenyellow: 'adff2f',\n honeydew: 'f0fff0',\n hotpink: 'ff69b4',\n indianred : 'cd5c5c',\n indigo : '4b0082',\n ivory: 'fffff0',\n khaki: 'f0e68c',\n lavender: 'e6e6fa',\n lavenderblush: 'fff0f5',\n lawngreen: '7cfc00',\n lemonchiffon: 'fffacd',\n lightblue: 'add8e6',\n lightcoral: 'f08080',\n lightcyan: 'e0ffff',\n lightgoldenrodyellow: 'fafad2',\n lightgrey: 'd3d3d3',\n lightgreen: '90ee90',\n lightpink: 'ffb6c1',\n lightsalmon: 'ffa07a',\n lightseagreen: '20b2aa',\n lightskyblue: '87cefa',\n lightslateblue: '8470ff',\n lightslategray: '778899',\n lightsteelblue: 'b0c4de',\n lightyellow: 'ffffe0',\n lime: '00ff00',\n limegreen: '32cd32',\n linen: 'faf0e6',\n magenta: 'ff00ff',\n maroon: '800000',\n mediumaquamarine: '66cdaa',\n mediumblue: '0000cd',\n mediumorchid: 'ba55d3',\n mediumpurple: '9370d8',\n mediumseagreen: '3cb371',\n mediumslateblue: '7b68ee',\n mediumspringgreen: '00fa9a',\n mediumturquoise: '48d1cc',\n mediumvioletred: 'c71585',\n midnightblue: '191970',\n mintcream: 'f5fffa',\n mistyrose: 'ffe4e1',\n moccasin: 'ffe4b5',\n navajowhite: 'ffdead',\n navy: '000080',\n oldlace: 'fdf5e6',\n olive: '808000',\n olivedrab: '6b8e23',\n orange: 'ffa500',\n orangered: 'ff4500',\n orchid: 'da70d6',\n palegoldenrod: 'eee8aa',\n palegreen: '98fb98',\n paleturquoise: 'afeeee',\n palevioletred: 'd87093',\n papayawhip: 'ffefd5',\n peachpuff: 'ffdab9',\n peru: 'cd853f',\n pink: 'ffc0cb',\n plum: 'dda0dd',\n powderblue: 'b0e0e6',\n purple: '800080',\n rebeccapurple: '663399',\n red: 'ff0000',\n rosybrown: 'bc8f8f',\n royalblue: '4169e1',\n saddlebrown: '8b4513',\n salmon: 'fa8072',\n sandybrown: 'f4a460',\n seagreen: '2e8b57',\n seashell: 'fff5ee',\n sienna: 'a0522d',\n silver: 'c0c0c0',\n skyblue: '87ceeb',\n slateblue: '6a5acd',\n slategray: '708090',\n snow: 'fffafa',\n springgreen: '00ff7f',\n steelblue: '4682b4',\n tan: 'd2b48c',\n teal: '008080',\n thistle: 'd8bfd8',\n tomato: 'ff6347',\n turquoise: '40e0d0',\n violet: 'ee82ee',\n violetred: 'd02090',\n wheat: 'f5deb3',\n white: 'ffffff',\n whitesmoke: 'f5f5f5',\n yellow: 'ffff00',\n yellowgreen: '9acd32'\n };\n color_string = simple_colors[color_string] || color_string;\n // emd of simple type-in colors\n\n // array of color definition objects\n var color_defs = [\n {\n re: /^rgba\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3}),\\s*((?:\\d?\\.)?\\d)\\)$/,\n example: ['rgba(123, 234, 45, 0.8)', 'rgba(255,234,245,1.0)'],\n process: function (bits){\n return [\n parseInt(bits[1]),\n parseInt(bits[2]),\n parseInt(bits[3]),\n parseFloat(bits[4])\n ];\n }\n },\n {\n re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\n example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'],\n process: function (bits){\n return [\n parseInt(bits[1]),\n parseInt(bits[2]),\n parseInt(bits[3])\n ];\n }\n },\n {\n re: /^([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n example: ['#00ff00', '336699'],\n process: function (bits){\n return [\n parseInt(bits[1], 16),\n parseInt(bits[2], 16),\n parseInt(bits[3], 16)\n ];\n }\n },\n {\n re: /^([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n example: ['#fb0', 'f0f'],\n process: function (bits){\n return [\n parseInt(bits[1] + bits[1], 16),\n parseInt(bits[2] + bits[2], 16),\n parseInt(bits[3] + bits[3], 16)\n ];\n }\n }\n ];\n\n // search through the definitions to find a match\n for (var i = 0; i < color_defs.length; i++) {\n var re = color_defs[i].re;\n var processor = color_defs[i].process;\n var bits = re.exec(color_string);\n if (bits) {\n var channels = processor(bits);\n this.r = channels[0];\n this.g = channels[1];\n this.b = channels[2];\n if (channels.length > 3) {\n this.alpha = channels[3];\n }\n this.ok = true;\n }\n\n }\n\n // validate/cleanup values\n this.r = (this.r < 0 || isNaN(this.r)) ? 0 : ((this.r > 255) ? 255 : this.r);\n this.g = (this.g < 0 || isNaN(this.g)) ? 0 : ((this.g > 255) ? 255 : this.g);\n this.b = (this.b < 0 || isNaN(this.b)) ? 0 : ((this.b > 255) ? 255 : this.b);\n this.alpha = (this.alpha < 0) ? 0 : ((this.alpha > 1.0 || isNaN(this.alpha)) ? 1.0 : this.alpha);\n\n // some getters\n this.toRGB = function () {\n return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')';\n }\n this.toRGBA = function () {\n return 'rgba(' + this.r + ', ' + this.g + ', ' + this.b + ', ' + this.alpha + ')';\n }\n this.toHex = function () {\n var r = this.r.toString(16);\n var g = this.g.toString(16);\n var b = this.b.toString(16);\n if (r.length == 1) r = '0' + r;\n if (g.length == 1) g = '0' + g;\n if (b.length == 1) b = '0' + b;\n return '#' + r + g + b;\n }\n\n // help\n this.getHelpXML = function () {\n\n var examples = new Array();\n // add regexps\n for (var i = 0; i < color_defs.length; i++) {\n var example = color_defs[i].example;\n for (var j = 0; j < example.length; j++) {\n examples[examples.length] = example[j];\n }\n }\n // add type-in colors\n for (var sc in simple_colors) {\n examples[examples.length] = sc;\n }\n\n var xml = document.createElement('ul');\n xml.setAttribute('id', 'rgbcolor-examples');\n for (var i = 0; i < examples.length; i++) {\n try {\n var list_item = document.createElement('li');\n var list_color = new RGBColor(examples[i]);\n var example_div = document.createElement('div');\n example_div.style.cssText =\n 'margin: 3px; '\n + 'border: 1px solid black; '\n + 'background:' + list_color.toHex() + '; '\n + 'color:' + list_color.toHex()\n ;\n example_div.appendChild(document.createTextNode('test'));\n var list_item_value = document.createTextNode(\n ' ' + examples[i] + ' -> ' + list_color.toRGB() + ' -> ' + list_color.toHex()\n );\n list_item.appendChild(example_div);\n list_item.appendChild(list_item_value);\n xml.appendChild(list_item);\n\n } catch(e){}\n }\n return xml;\n\n }\n\n}\n","'use strict';\n/* eslint-disable es/no-array-prototype-indexof -- required for testing */\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar $indexOf = require('../internals/array-includes').indexOf;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar nativeIndexOf = uncurryThis([].indexOf);\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / nativeIndexOf([1], 1, -0) < 0;\nvar FORCED = NEGATIVE_ZERO || !arrayMethodIsStrict('indexOf');\n\n// `Array.prototype.indexOf` method\n// https://tc39.es/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: FORCED }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n var fromIndex = arguments.length > 1 ? arguments[1] : undefined;\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf(this, searchElement, fromIndex) || 0\n : $indexOf(this, searchElement, fromIndex);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\n\nvar stringIndexOf = uncurryThis(''.indexOf);\n\n// `String.prototype.includes` method\n// https://tc39.es/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~stringIndexOf(\n toString(requireObjectCoercible(this)),\n toString(notARegExp(searchString)),\n arguments.length > 1 ? arguments[1] : undefined\n );\n }\n});\n","'use strict';\nvar classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.es/ecma262/#sec-isarray\n// eslint-disable-next-line es/no-array-isarray -- safe\nmodule.exports = Array.isArray || function isArray(argument) {\n return classof(argument) === 'Array';\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar isArray = require('../internals/is-array');\n\nvar nativeReverse = uncurryThis([].reverse);\nvar test = [1, 2];\n\n// `Array.prototype.reverse` method\n// https://tc39.es/ecma262/#sec-array.prototype.reverse\n// fix for Safari 12.0 bug\n// https://bugs.webkit.org/show_bug.cgi?id=188794\n$({ target: 'Array', proto: true, forced: String(test) === String(test.reverse()) }, {\n reverse: function reverse() {\n // eslint-disable-next-line no-self-assign -- dirty hack\n if (isArray(this)) this.length = this.length;\n return nativeReverse(this);\n }\n});\n","/*! *****************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\nvar t=function(r,e){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,r){t.__proto__=r}||function(t,r){for(var e in r)Object.prototype.hasOwnProperty.call(r,e)&&(t[e]=r[e])})(r,e)};function r(r,e){if(\"function\"!=typeof e&&null!==e)throw new TypeError(\"Class extends value \"+String(e)+\" is not a constructor or null\");function i(){this.constructor=r}t(r,e),r.prototype=null===e?Object.create(e):(i.prototype=e.prototype,new i)}function e(t){var r=\"\";Array.isArray(t)||(t=[t]);for(var e=0;et.phi1&&(t.phi2-=2*n),1===t.sweepFlag&&t.phi2i)return[];if(0===i)return[[t*e/(t*t+r*r),r*e/(t*t+r*r)]];var n=Math.sqrt(i);return[[(t*e+r*n)/(t*t+r*r),(r*e-t*n)/(t*t+r*r)],[(t*e-r*n)/(t*t+r*r),(r*e+t*n)/(t*t+r*r)]]}var u,h=Math.PI/180;function c(t,r,e){return(1-e)*t+e*r}function y(t,r,e,i){return t+Math.cos(i/180*n)*r+Math.sin(i/180*n)*e}function p(t,r,e,i){var a=1e-6,n=r-t,o=e-r,s=3*n+3*(i-e)-6*o,u=6*(o-n),h=3*n;return Math.abs(s)T&&(a.sweepFlag=+!a.sweepFlag),a}))}function l(){return function(t){var r={};for(var e in t)r[e]=t[e];return r}}t.ROUND=function(t){function r(r){return Math.round(r*t)/t}return void 0===t&&(t=1e13),a(t),function(t){return void 0!==t.x1&&(t.x1=r(t.x1)),void 0!==t.y1&&(t.y1=r(t.y1)),void 0!==t.x2&&(t.x2=r(t.x2)),void 0!==t.y2&&(t.y2=r(t.y2)),void 0!==t.x&&(t.x=r(t.x)),void 0!==t.y&&(t.y=r(t.y)),void 0!==t.rX&&(t.rX=r(t.rX)),void 0!==t.rY&&(t.rY=r(t.rY)),t}},t.TO_ABS=r,t.TO_REL=function(){return u((function(t,r,e){return t.relative||(void 0!==t.x1&&(t.x1-=r),void 0!==t.y1&&(t.y1-=e),void 0!==t.x2&&(t.x2-=r),void 0!==t.y2&&(t.y2-=e),void 0!==t.x&&(t.x-=r),void 0!==t.y&&(t.y-=e),t.relative=!0),t}))},t.NORMALIZE_HVZ=function(t,r,e){return void 0===t&&(t=!0),void 0===r&&(r=!0),void 0===e&&(e=!0),u((function(i,a,n,o,s){if(isNaN(o)&&!(i.type&_.MOVE_TO))throw new Error(\"path must start with moveto\");return r&&i.type&_.HORIZ_LINE_TO&&(i.type=_.LINE_TO,i.y=i.relative?0:n),e&&i.type&_.VERT_LINE_TO&&(i.type=_.LINE_TO,i.x=i.relative?0:a),t&&i.type&_.CLOSE_PATH&&(i.type=_.LINE_TO,i.x=i.relative?o-a:o,i.y=i.relative?s-n:s),i.type&_.ARC&&(0===i.rX||0===i.rY)&&(i.type=_.LINE_TO,delete i.rX,delete i.rY,delete i.xRot,delete i.lArcFlag,delete i.sweepFlag),i}))},t.NORMALIZE_ST=e,t.QT_TO_C=n,t.INFO=u,t.SANITIZE=function(t){void 0===t&&(t=0),a(t);var r=NaN,e=NaN,i=NaN,n=NaN;return u((function(a,o,s,u,h){var c=Math.abs,y=!1,p=0,m=0;if(a.type&_.SMOOTH_CURVE_TO&&(p=isNaN(r)?0:o-r,m=isNaN(e)?0:s-e),a.type&(_.CURVE_TO|_.SMOOTH_CURVE_TO)?(r=a.relative?o+a.x2:a.x2,e=a.relative?s+a.y2:a.y2):(r=NaN,e=NaN),a.type&_.SMOOTH_QUAD_TO?(i=isNaN(i)?o:2*o-i,n=isNaN(n)?s:2*s-n):a.type&_.QUAD_TO?(i=a.relative?o+a.x1:a.x1,n=a.relative?s+a.y1:a.y2):(i=NaN,n=NaN),a.type&_.LINE_COMMANDS||a.type&_.ARC&&(0===a.rX||0===a.rY||!a.lArcFlag)||a.type&_.CURVE_TO||a.type&_.SMOOTH_CURVE_TO||a.type&_.QUAD_TO||a.type&_.SMOOTH_QUAD_TO){var O=void 0===a.x?0:a.relative?a.x:a.x-o,l=void 0===a.y?0:a.relative?a.y:a.y-s;p=isNaN(i)?void 0===a.x1?p:a.relative?a.x:a.x1-o:i-o,m=isNaN(n)?void 0===a.y1?m:a.relative?a.y:a.y1-s:n-s;var T=void 0===a.x2?0:a.relative?a.x:a.x2-o,v=void 0===a.y2?0:a.relative?a.y:a.y2-s;c(O)<=t&&c(l)<=t&&c(p)<=t&&c(m)<=t&&c(T)<=t&&c(v)<=t&&(y=!0)}return a.type&_.CLOSE_PATH&&c(o-u)<=t&&c(s-h)<=t&&(y=!0),y?[]:a}))},t.MATRIX=O,t.ROTATE=function(t,r,e){void 0===r&&(r=0),void 0===e&&(e=0),a(t,r,e);var i=Math.sin(t),n=Math.cos(t);return O(n,i,-i,n,r-r*n+e*i,e-r*i-e*n)},t.TRANSLATE=function(t,r){return void 0===r&&(r=0),a(t,r),O(1,0,0,1,t,r)},t.SCALE=function(t,r){return void 0===r&&(r=t),a(t,r),O(t,0,0,r,0,0)},t.SKEW_X=function(t){return a(t),O(1,0,Math.atan(t),1,0,0)},t.SKEW_Y=function(t){return a(t),O(1,Math.atan(t),0,1,0,0)},t.X_AXIS_SYMMETRY=function(t){return void 0===t&&(t=0),a(t),O(-1,0,0,1,t,0)},t.Y_AXIS_SYMMETRY=function(t){return void 0===t&&(t=0),a(t),O(1,0,0,-1,0,t)},t.A_TO_C=function(){return u((function(t,r,e){return _.ARC===t.type?function(t,r,e){var a,n,s,u;t.cX||o(t,r,e);for(var y=Math.min(t.phi1,t.phi2),p=Math.max(t.phi1,t.phi2)-y,m=Math.ceil(p/90),O=new Array(m),l=r,T=e,v=0;vc.maxX&&(c.maxX=t),tc.maxY&&(c.maxY=t),tw&&O(m(e,u.x1,u.x2,u.x,w))}for(var f=0,N=p(n,u.y1,u.y2,u.y);fw&&l(m(n,u.y1,u.y2,u.y,w))}}if(u.type&_.ARC){O(u.x),l(u.y),o(u,e,n);for(var x=u.xRot/180*Math.PI,d=Math.cos(x)*u.rX,E=Math.sin(x)*u.rX,A=-Math.sin(x)*u.rY,C=Math.cos(x)*u.rY,M=u.phi1u.phi2?[u.phi2+360,u.phi1+360]:[u.phi2,u.phi1],R=M[0],g=M[1],I=function(t){var r=t[0],e=t[1],i=180*Math.atan2(e,r)/Math.PI;return iR&&wR&&wu)throw new SyntaxError('Expected positive number, got \"'+u+'\" at index \"'+a+'\"')}else if((3===this.curArgs.length||4===this.curArgs.length)&&\"0\"!==this.curNumber&&\"1\"!==this.curNumber)throw new SyntaxError('Expected a flag, got \"'+this.curNumber+'\" at index \"'+a+'\"');this.curArgs.push(u),this.curArgs.length===N[this.curCommandType]&&(_.HORIZ_LINE_TO===this.curCommandType?i({type:_.HORIZ_LINE_TO,relative:this.curCommandRelative,x:u}):_.VERT_LINE_TO===this.curCommandType?i({type:_.VERT_LINE_TO,relative:this.curCommandRelative,y:u}):this.curCommandType===_.MOVE_TO||this.curCommandType===_.LINE_TO||this.curCommandType===_.SMOOTH_QUAD_TO?(i({type:this.curCommandType,relative:this.curCommandRelative,x:this.curArgs[0],y:this.curArgs[1]}),_.MOVE_TO===this.curCommandType&&(this.curCommandType=_.LINE_TO)):this.curCommandType===_.CURVE_TO?i({type:_.CURVE_TO,relative:this.curCommandRelative,x1:this.curArgs[0],y1:this.curArgs[1],x2:this.curArgs[2],y2:this.curArgs[3],x:this.curArgs[4],y:this.curArgs[5]}):this.curCommandType===_.SMOOTH_CURVE_TO?i({type:_.SMOOTH_CURVE_TO,relative:this.curCommandRelative,x2:this.curArgs[0],y2:this.curArgs[1],x:this.curArgs[2],y:this.curArgs[3]}):this.curCommandType===_.QUAD_TO?i({type:_.QUAD_TO,relative:this.curCommandRelative,x1:this.curArgs[0],y1:this.curArgs[1],x:this.curArgs[2],y:this.curArgs[3]}):this.curCommandType===_.ARC&&i({type:_.ARC,relative:this.curCommandRelative,rX:this.curArgs[0],rY:this.curArgs[1],xRot:this.curArgs[2],lArcFlag:this.curArgs[3],sweepFlag:this.curArgs[4],x:this.curArgs[5],y:this.curArgs[6]})),this.curNumber=\"\",this.curNumberHasExpDigits=!1,this.curNumberHasExp=!1,this.curNumberHasDecimal=!1,this.canParseCommandOrComma=!0}if(!T(n))if(\",\"===n&&this.canParseCommandOrComma)this.canParseCommandOrComma=!1;else if(\"+\"!==n&&\"-\"!==n&&\".\"!==n)if(s)this.curNumber=n,this.curNumberHasDecimal=!1;else{if(0!==this.curArgs.length)throw new SyntaxError(\"Unterminated command at index \"+a+\".\");if(!this.canParseCommandOrComma)throw new SyntaxError('Unexpected character \"'+n+'\" at index '+a+\". Command cannot follow comma\");if(this.canParseCommandOrComma=!1,\"z\"!==n&&\"Z\"!==n)if(\"h\"===n||\"H\"===n)this.curCommandType=_.HORIZ_LINE_TO,this.curCommandRelative=\"h\"===n;else if(\"v\"===n||\"V\"===n)this.curCommandType=_.VERT_LINE_TO,this.curCommandRelative=\"v\"===n;else if(\"m\"===n||\"M\"===n)this.curCommandType=_.MOVE_TO,this.curCommandRelative=\"m\"===n;else if(\"l\"===n||\"L\"===n)this.curCommandType=_.LINE_TO,this.curCommandRelative=\"l\"===n;else if(\"c\"===n||\"C\"===n)this.curCommandType=_.CURVE_TO,this.curCommandRelative=\"c\"===n;else if(\"s\"===n||\"S\"===n)this.curCommandType=_.SMOOTH_CURVE_TO,this.curCommandRelative=\"s\"===n;else if(\"q\"===n||\"Q\"===n)this.curCommandType=_.QUAD_TO,this.curCommandRelative=\"q\"===n;else if(\"t\"===n||\"T\"===n)this.curCommandType=_.SMOOTH_QUAD_TO,this.curCommandRelative=\"t\"===n;else{if(\"a\"!==n&&\"A\"!==n)throw new SyntaxError('Unexpected character \"'+n+'\" at index '+a+\".\");this.curCommandType=_.ARC,this.curCommandRelative=\"a\"===n}else r.push({type:_.CLOSE_PATH}),this.canParseCommandOrComma=!0,this.curCommandType=-1}else this.curNumber=n,this.curNumberHasDecimal=\".\"===n}else this.curNumber+=n,this.curNumberHasDecimal=!0;else this.curNumber+=n;else this.curNumber+=n,this.curNumberHasExp=!0;else this.curNumber+=n,this.curNumberHasExpDigits=this.curNumberHasExp}return r},e.prototype.transform=function(t){return Object.create(this,{parse:{value:function(r,e){void 0===e&&(e=[]);for(var i=0,a=Object.getPrototypeOf(this).parse.call(this,r);i>> shgSum;\n pixels[yi + 3] = paInitial;\n\n if (paInitial !== 0) {\n var _a2 = 255 / paInitial;\n\n pixels[yi] = (rSum * mulSum >>> shgSum) * _a2;\n pixels[yi + 1] = (gSum * mulSum >>> shgSum) * _a2;\n pixels[yi + 2] = (bSum * mulSum >>> shgSum) * _a2;\n } else {\n pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0;\n }\n\n rSum -= rOutSum;\n gSum -= gOutSum;\n bSum -= bOutSum;\n aSum -= aOutSum;\n rOutSum -= stackIn.r;\n gOutSum -= stackIn.g;\n bOutSum -= stackIn.b;\n aOutSum -= stackIn.a;\n\n var _p = x + radius + 1;\n\n _p = yw + (_p < widthMinus1 ? _p : widthMinus1) << 2;\n rInSum += stackIn.r = pixels[_p];\n gInSum += stackIn.g = pixels[_p + 1];\n bInSum += stackIn.b = pixels[_p + 2];\n aInSum += stackIn.a = pixels[_p + 3];\n rSum += rInSum;\n gSum += gInSum;\n bSum += bInSum;\n aSum += aInSum;\n stackIn = stackIn.next;\n var _stackOut = stackOut,\n _r = _stackOut.r,\n _g = _stackOut.g,\n _b = _stackOut.b,\n _a = _stackOut.a;\n rOutSum += _r;\n gOutSum += _g;\n bOutSum += _b;\n aOutSum += _a;\n rInSum -= _r;\n gInSum -= _g;\n bInSum -= _b;\n aInSum -= _a;\n stackOut = stackOut.next;\n yi += 4;\n }\n\n yw += width;\n }\n\n for (var _x = 0; _x < width; _x++) {\n yi = _x << 2;\n\n var _pr = pixels[yi],\n _pg = pixels[yi + 1],\n _pb = pixels[yi + 2],\n _pa = pixels[yi + 3],\n _rOutSum = radiusPlus1 * _pr,\n _gOutSum = radiusPlus1 * _pg,\n _bOutSum = radiusPlus1 * _pb,\n _aOutSum = radiusPlus1 * _pa,\n _rSum = sumFactor * _pr,\n _gSum = sumFactor * _pg,\n _bSum = sumFactor * _pb,\n _aSum = sumFactor * _pa;\n\n stack = stackStart;\n\n for (var _i3 = 0; _i3 < radiusPlus1; _i3++) {\n stack.r = _pr;\n stack.g = _pg;\n stack.b = _pb;\n stack.a = _pa;\n stack = stack.next;\n }\n\n var yp = width;\n var _gInSum = 0,\n _bInSum = 0,\n _aInSum = 0,\n _rInSum = 0;\n\n for (var _i4 = 1; _i4 <= radius; _i4++) {\n yi = yp + _x << 2;\n\n var _rbs = radiusPlus1 - _i4;\n\n _rSum += (stack.r = _pr = pixels[yi]) * _rbs;\n _gSum += (stack.g = _pg = pixels[yi + 1]) * _rbs;\n _bSum += (stack.b = _pb = pixels[yi + 2]) * _rbs;\n _aSum += (stack.a = _pa = pixels[yi + 3]) * _rbs;\n _rInSum += _pr;\n _gInSum += _pg;\n _bInSum += _pb;\n _aInSum += _pa;\n stack = stack.next;\n\n if (_i4 < heightMinus1) {\n yp += width;\n }\n }\n\n yi = _x;\n stackIn = stackStart;\n stackOut = stackEnd;\n\n for (var _y = 0; _y < height; _y++) {\n var _p2 = yi << 2;\n\n pixels[_p2 + 3] = _pa = _aSum * mulSum >>> shgSum;\n\n if (_pa > 0) {\n _pa = 255 / _pa;\n pixels[_p2] = (_rSum * mulSum >>> shgSum) * _pa;\n pixels[_p2 + 1] = (_gSum * mulSum >>> shgSum) * _pa;\n pixels[_p2 + 2] = (_bSum * mulSum >>> shgSum) * _pa;\n } else {\n pixels[_p2] = pixels[_p2 + 1] = pixels[_p2 + 2] = 0;\n }\n\n _rSum -= _rOutSum;\n _gSum -= _gOutSum;\n _bSum -= _bOutSum;\n _aSum -= _aOutSum;\n _rOutSum -= stackIn.r;\n _gOutSum -= stackIn.g;\n _bOutSum -= stackIn.b;\n _aOutSum -= stackIn.a;\n _p2 = _x + ((_p2 = _y + radiusPlus1) < heightMinus1 ? _p2 : heightMinus1) * width << 2;\n _rSum += _rInSum += stackIn.r = pixels[_p2];\n _gSum += _gInSum += stackIn.g = pixels[_p2 + 1];\n _bSum += _bInSum += stackIn.b = pixels[_p2 + 2];\n _aSum += _aInSum += stackIn.a = pixels[_p2 + 3];\n stackIn = stackIn.next;\n _rOutSum += _pr = stackOut.r;\n _gOutSum += _pg = stackOut.g;\n _bOutSum += _pb = stackOut.b;\n _aOutSum += _pa = stackOut.a;\n _rInSum -= _pr;\n _gInSum -= _pg;\n _bInSum -= _pb;\n _aInSum -= _pa;\n stackOut = stackOut.next;\n yi += width;\n }\n }\n\n return imageData;\n}\n/**\n * @param {HTMLCanvasElement} canvas\n * @param {Integer} topX\n * @param {Integer} topY\n * @param {Integer} width\n * @param {Integer} height\n * @param {Float} radius\n * @returns {undefined}\n */\n\n\nfunction processCanvasRGB(canvas, topX, topY, width, height, radius) {\n if (isNaN(radius) || radius < 1) {\n return;\n }\n\n radius |= 0;\n var imageData = getImageDataFromCanvas(canvas, topX, topY, width, height);\n imageData = processImageDataRGB(imageData, topX, topY, width, height, radius);\n canvas.getContext('2d').putImageData(imageData, topX, topY);\n}\n/**\n * @param {ImageData} imageData\n * @param {Integer} topX\n * @param {Integer} topY\n * @param {Integer} width\n * @param {Integer} height\n * @param {Float} radius\n * @returns {ImageData}\n */\n\n\nfunction processImageDataRGB(imageData, topX, topY, width, height, radius) {\n var pixels = imageData.data;\n var div = 2 * radius + 1; // const w4 = width << 2;\n\n var widthMinus1 = width - 1;\n var heightMinus1 = height - 1;\n var radiusPlus1 = radius + 1;\n var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2;\n var stackStart = new BlurStack();\n var stack = stackStart;\n var stackEnd;\n\n for (var i = 1; i < div; i++) {\n stack = stack.next = new BlurStack();\n\n if (i === radiusPlus1) {\n stackEnd = stack;\n }\n }\n\n stack.next = stackStart;\n var stackIn = null;\n var stackOut = null;\n var mulSum = mulTable[radius];\n var shgSum = shgTable[radius];\n var p, rbs;\n var yw = 0,\n yi = 0;\n\n for (var y = 0; y < height; y++) {\n var pr = pixels[yi],\n pg = pixels[yi + 1],\n pb = pixels[yi + 2],\n rOutSum = radiusPlus1 * pr,\n gOutSum = radiusPlus1 * pg,\n bOutSum = radiusPlus1 * pb,\n rSum = sumFactor * pr,\n gSum = sumFactor * pg,\n bSum = sumFactor * pb;\n stack = stackStart;\n\n for (var _i5 = 0; _i5 < radiusPlus1; _i5++) {\n stack.r = pr;\n stack.g = pg;\n stack.b = pb;\n stack = stack.next;\n }\n\n var rInSum = 0,\n gInSum = 0,\n bInSum = 0;\n\n for (var _i6 = 1; _i6 < radiusPlus1; _i6++) {\n p = yi + ((widthMinus1 < _i6 ? widthMinus1 : _i6) << 2);\n rSum += (stack.r = pr = pixels[p]) * (rbs = radiusPlus1 - _i6);\n gSum += (stack.g = pg = pixels[p + 1]) * rbs;\n bSum += (stack.b = pb = pixels[p + 2]) * rbs;\n rInSum += pr;\n gInSum += pg;\n bInSum += pb;\n stack = stack.next;\n }\n\n stackIn = stackStart;\n stackOut = stackEnd;\n\n for (var x = 0; x < width; x++) {\n pixels[yi] = rSum * mulSum >>> shgSum;\n pixels[yi + 1] = gSum * mulSum >>> shgSum;\n pixels[yi + 2] = bSum * mulSum >>> shgSum;\n rSum -= rOutSum;\n gSum -= gOutSum;\n bSum -= bOutSum;\n rOutSum -= stackIn.r;\n gOutSum -= stackIn.g;\n bOutSum -= stackIn.b;\n p = yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1) << 2;\n rInSum += stackIn.r = pixels[p];\n gInSum += stackIn.g = pixels[p + 1];\n bInSum += stackIn.b = pixels[p + 2];\n rSum += rInSum;\n gSum += gInSum;\n bSum += bInSum;\n stackIn = stackIn.next;\n rOutSum += pr = stackOut.r;\n gOutSum += pg = stackOut.g;\n bOutSum += pb = stackOut.b;\n rInSum -= pr;\n gInSum -= pg;\n bInSum -= pb;\n stackOut = stackOut.next;\n yi += 4;\n }\n\n yw += width;\n }\n\n for (var _x2 = 0; _x2 < width; _x2++) {\n yi = _x2 << 2;\n\n var _pr2 = pixels[yi],\n _pg2 = pixels[yi + 1],\n _pb2 = pixels[yi + 2],\n _rOutSum2 = radiusPlus1 * _pr2,\n _gOutSum2 = radiusPlus1 * _pg2,\n _bOutSum2 = radiusPlus1 * _pb2,\n _rSum2 = sumFactor * _pr2,\n _gSum2 = sumFactor * _pg2,\n _bSum2 = sumFactor * _pb2;\n\n stack = stackStart;\n\n for (var _i7 = 0; _i7 < radiusPlus1; _i7++) {\n stack.r = _pr2;\n stack.g = _pg2;\n stack.b = _pb2;\n stack = stack.next;\n }\n\n var _rInSum2 = 0,\n _gInSum2 = 0,\n _bInSum2 = 0;\n\n for (var _i8 = 1, yp = width; _i8 <= radius; _i8++) {\n yi = yp + _x2 << 2;\n _rSum2 += (stack.r = _pr2 = pixels[yi]) * (rbs = radiusPlus1 - _i8);\n _gSum2 += (stack.g = _pg2 = pixels[yi + 1]) * rbs;\n _bSum2 += (stack.b = _pb2 = pixels[yi + 2]) * rbs;\n _rInSum2 += _pr2;\n _gInSum2 += _pg2;\n _bInSum2 += _pb2;\n stack = stack.next;\n\n if (_i8 < heightMinus1) {\n yp += width;\n }\n }\n\n yi = _x2;\n stackIn = stackStart;\n stackOut = stackEnd;\n\n for (var _y2 = 0; _y2 < height; _y2++) {\n p = yi << 2;\n pixels[p] = _rSum2 * mulSum >>> shgSum;\n pixels[p + 1] = _gSum2 * mulSum >>> shgSum;\n pixels[p + 2] = _bSum2 * mulSum >>> shgSum;\n _rSum2 -= _rOutSum2;\n _gSum2 -= _gOutSum2;\n _bSum2 -= _bOutSum2;\n _rOutSum2 -= stackIn.r;\n _gOutSum2 -= stackIn.g;\n _bOutSum2 -= stackIn.b;\n p = _x2 + ((p = _y2 + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width << 2;\n _rSum2 += _rInSum2 += stackIn.r = pixels[p];\n _gSum2 += _gInSum2 += stackIn.g = pixels[p + 1];\n _bSum2 += _bInSum2 += stackIn.b = pixels[p + 2];\n stackIn = stackIn.next;\n _rOutSum2 += _pr2 = stackOut.r;\n _gOutSum2 += _pg2 = stackOut.g;\n _bOutSum2 += _pb2 = stackOut.b;\n _rInSum2 -= _pr2;\n _gInSum2 -= _pg2;\n _bInSum2 -= _pb2;\n stackOut = stackOut.next;\n yi += width;\n }\n }\n\n return imageData;\n}\n/**\n *\n */\n\n\nvar BlurStack =\n/**\n * Set properties.\n */\nfunction BlurStack() {\n _classCallCheck(this, BlurStack);\n\n this.r = 0;\n this.g = 0;\n this.b = 0;\n this.a = 0;\n this.next = null;\n};\n\nexport { BlurStack, processCanvasRGB as canvasRGB, processCanvasRGBA as canvasRGBA, processImage as image, processImageDataRGB as imageDataRGB, processImageDataRGBA as imageDataRGBA };\n","import 'core-js/modules/es.promise.js';\nimport _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator';\nimport 'core-js/modules/es.string.match.js';\nimport 'core-js/modules/es.string.replace.js';\nimport 'core-js/modules/es.string.starts-with.js';\nimport 'core-js/modules/es.array.iterator.js';\nimport 'core-js/modules/web.dom-collections.iterator.js';\nimport _defineProperty from '@babel/runtime/helpers/defineProperty';\nimport 'core-js/modules/es.array.reduce.js';\nimport 'core-js/modules/es.string.ends-with.js';\nimport 'core-js/modules/es.string.split.js';\nimport requestAnimationFrame from 'raf';\nimport 'core-js/modules/es.string.trim.js';\nimport RGBColor from 'rgbcolor';\nimport 'core-js/modules/es.array.index-of.js';\nimport 'core-js/modules/es.string.includes.js';\nimport 'core-js/modules/es.array.reverse.js';\nimport { SVGPathData } from 'svg-pathdata';\nimport 'core-js/modules/es.regexp.to-string.js';\nimport { canvasRGBA } from 'stackblur-canvas';\n\n/**\r\n * Options preset for `OffscreenCanvas`.\r\n * @param config - Preset requirements.\r\n * @param config.DOMParser - XML/HTML parser from string into DOM Document.\r\n * @returns Preset object.\r\n */\nfunction offscreen() {\n var {\n DOMParser: DOMParserFallback\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var preset = {\n window: null,\n ignoreAnimation: true,\n ignoreMouse: true,\n DOMParser: DOMParserFallback,\n\n createCanvas(width, height) {\n return new OffscreenCanvas(width, height);\n },\n\n createImage(url) {\n return _asyncToGenerator(function* () {\n var response = yield fetch(url);\n var blob = yield response.blob();\n var img = yield createImageBitmap(blob);\n return img;\n })();\n }\n\n };\n\n if (typeof DOMParser !== 'undefined' || typeof DOMParserFallback === 'undefined') {\n Reflect.deleteProperty(preset, 'DOMParser');\n }\n\n return preset;\n}\n\n/**\r\n * Options preset for `node-canvas`.\r\n * @param config - Preset requirements.\r\n * @param config.DOMParser - XML/HTML parser from string into DOM Document.\r\n * @param config.canvas - `node-canvas` exports.\r\n * @param config.fetch - WHATWG-compatible `fetch` function.\r\n * @returns Preset object.\r\n */\nfunction node(_ref) {\n var {\n DOMParser,\n canvas,\n fetch\n } = _ref;\n return {\n window: null,\n ignoreAnimation: true,\n ignoreMouse: true,\n DOMParser,\n fetch,\n createCanvas: canvas.createCanvas,\n createImage: canvas.loadImage\n };\n}\n\nvar index = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\toffscreen: offscreen,\n\tnode: node\n});\n\n/**\r\n * HTML-safe compress white-spaces.\r\n * @param str - String to compress.\r\n * @returns String.\r\n */\nfunction compressSpaces(str) {\n return str.replace(/(?!\\u3000)\\s+/gm, ' ');\n}\n/**\r\n * HTML-safe left trim.\r\n * @param str - String to trim.\r\n * @returns String.\r\n */\n\nfunction trimLeft(str) {\n return str.replace(/^[\\n \\t]+/, '');\n}\n/**\r\n * HTML-safe right trim.\r\n * @param str - String to trim.\r\n * @returns String.\r\n */\n\nfunction trimRight(str) {\n return str.replace(/[\\n \\t]+$/, '');\n}\n/**\r\n * String to numbers array.\r\n * @param str - Numbers string.\r\n * @returns Numbers array.\r\n */\n\nfunction toNumbers(str) {\n var matches = (str || '').match(/-?(\\d+(?:\\.\\d*(?:[eE][+-]?\\d+)?)?|\\.\\d+)(?=\\D|$)/gm) || [];\n return matches.map(parseFloat);\n} // Microsoft Edge fix\n\nvar allUppercase = /^[A-Z-]+$/;\n/**\r\n * Normalize attribute name.\r\n * @param name - Attribute name.\r\n * @returns Normalized attribute name.\r\n */\n\nfunction normalizeAttributeName(name) {\n if (allUppercase.test(name)) {\n return name.toLowerCase();\n }\n\n return name;\n}\n/**\r\n * Parse external URL.\r\n * @param url - CSS url string.\r\n * @returns Parsed URL.\r\n */\n\nfunction parseExternalUrl(url) {\n // single quotes [2]\n // v double quotes [3]\n // v v no quotes [4]\n // v v v\n var urlMatch = /url\\(('([^']+)'|\"([^\"]+)\"|([^'\")]+))\\)/.exec(url) || [];\n return urlMatch[2] || urlMatch[3] || urlMatch[4];\n}\n/**\r\n * Transform floats to integers in rgb colors.\r\n * @param color - Color to normalize.\r\n * @returns Normalized color.\r\n */\n\nfunction normalizeColor(color) {\n if (!color.startsWith('rgb')) {\n return color;\n }\n\n var rgbParts = 3;\n var normalizedColor = color.replace(/\\d+(\\.\\d+)?/g, (num, isFloat) => rgbParts-- && isFloat ? String(Math.round(parseFloat(num))) : num);\n return normalizedColor;\n}\n\n// slightly modified version of https://github.com/keeganstreet/specificity/blob/master/specificity.js\nvar attributeRegex = /(\\[[^\\]]+\\])/g;\nvar idRegex = /(#[^\\s+>~.[:]+)/g;\nvar classRegex = /(\\.[^\\s+>~.[:]+)/g;\nvar pseudoElementRegex = /(::[^\\s+>~.[:]+|:first-line|:first-letter|:before|:after)/gi;\nvar pseudoClassWithBracketsRegex = /(:[\\w-]+\\([^)]*\\))/gi;\nvar pseudoClassRegex = /(:[^\\s+>~.[:]+)/g;\nvar elementRegex = /([^\\s+>~.[:]+)/g;\n\nfunction findSelectorMatch(selector, regex) {\n var matches = regex.exec(selector);\n\n if (!matches) {\n return [selector, 0];\n }\n\n return [selector.replace(regex, ' '), matches.length];\n}\n/**\r\n * Measure selector specificity.\r\n * @param selector - Selector to measure.\r\n * @returns Specificity.\r\n */\n\n\nfunction getSelectorSpecificity(selector) {\n var specificity = [0, 0, 0];\n var currentSelector = selector.replace(/:not\\(([^)]*)\\)/g, ' $1 ').replace(/{[\\s\\S]*/gm, ' ');\n var delta = 0;\n [currentSelector, delta] = findSelectorMatch(currentSelector, attributeRegex);\n specificity[1] += delta;\n [currentSelector, delta] = findSelectorMatch(currentSelector, idRegex);\n specificity[0] += delta;\n [currentSelector, delta] = findSelectorMatch(currentSelector, classRegex);\n specificity[1] += delta;\n [currentSelector, delta] = findSelectorMatch(currentSelector, pseudoElementRegex);\n specificity[2] += delta;\n [currentSelector, delta] = findSelectorMatch(currentSelector, pseudoClassWithBracketsRegex);\n specificity[1] += delta;\n [currentSelector, delta] = findSelectorMatch(currentSelector, pseudoClassRegex);\n specificity[1] += delta;\n currentSelector = currentSelector.replace(/[*\\s+>~]/g, ' ').replace(/[#.]/g, ' ');\n [currentSelector, delta] = findSelectorMatch(currentSelector, elementRegex); // lgtm [js/useless-assignment-to-local]\n\n specificity[2] += delta;\n return specificity.join('');\n}\n\nvar PSEUDO_ZERO = .00000001;\n/**\r\n * Vector magnitude.\r\n * @param v\r\n * @returns Number result.\r\n */\n\nfunction vectorMagnitude(v) {\n return Math.sqrt(Math.pow(v[0], 2) + Math.pow(v[1], 2));\n}\n/**\r\n * Ratio between two vectors.\r\n * @param u\r\n * @param v\r\n * @returns Number result.\r\n */\n\nfunction vectorsRatio(u, v) {\n return (u[0] * v[0] + u[1] * v[1]) / (vectorMagnitude(u) * vectorMagnitude(v));\n}\n/**\r\n * Angle between two vectors.\r\n * @param u\r\n * @param v\r\n * @returns Number result.\r\n */\n\nfunction vectorsAngle(u, v) {\n return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(vectorsRatio(u, v));\n}\nfunction CB1(t) {\n return t * t * t;\n}\nfunction CB2(t) {\n return 3 * t * t * (1 - t);\n}\nfunction CB3(t) {\n return 3 * t * (1 - t) * (1 - t);\n}\nfunction CB4(t) {\n return (1 - t) * (1 - t) * (1 - t);\n}\nfunction QB1(t) {\n return t * t;\n}\nfunction QB2(t) {\n return 2 * t * (1 - t);\n}\nfunction QB3(t) {\n return (1 - t) * (1 - t);\n}\n\nclass Property {\n constructor(document, name, value) {\n this.document = document;\n this.name = name;\n this.value = value;\n this.isNormalizedColor = false;\n }\n\n static empty(document) {\n return new Property(document, 'EMPTY', '');\n }\n\n split() {\n var separator = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ' ';\n var {\n document,\n name\n } = this;\n return compressSpaces(this.getString()).trim().split(separator).map(value => new Property(document, name, value));\n }\n\n hasValue(zeroIsValue) {\n var {\n value\n } = this;\n return value !== null && value !== '' && (zeroIsValue || value !== 0) && typeof value !== 'undefined';\n }\n\n isString(regexp) {\n var {\n value\n } = this;\n var result = typeof value === 'string';\n\n if (!result || !regexp) {\n return result;\n }\n\n return regexp.test(value);\n }\n\n isUrlDefinition() {\n return this.isString(/^url\\(/);\n }\n\n isPixels() {\n if (!this.hasValue()) {\n return false;\n }\n\n var asString = this.getString();\n\n switch (true) {\n case asString.endsWith('px'):\n case /^[0-9]+$/.test(asString):\n return true;\n\n default:\n return false;\n }\n }\n\n setValue(value) {\n this.value = value;\n return this;\n }\n\n getValue(def) {\n if (typeof def === 'undefined' || this.hasValue()) {\n return this.value;\n }\n\n return def;\n }\n\n getNumber(def) {\n if (!this.hasValue()) {\n if (typeof def === 'undefined') {\n return 0;\n }\n\n return parseFloat(def);\n }\n\n var {\n value\n } = this;\n var n = parseFloat(value);\n\n if (this.isString(/%$/)) {\n n /= 100.0;\n }\n\n return n;\n }\n\n getString(def) {\n if (typeof def === 'undefined' || this.hasValue()) {\n return typeof this.value === 'undefined' ? '' : String(this.value);\n }\n\n return String(def);\n }\n\n getColor(def) {\n var color = this.getString(def);\n\n if (this.isNormalizedColor) {\n return color;\n }\n\n this.isNormalizedColor = true;\n color = normalizeColor(color);\n this.value = color;\n return color;\n }\n\n getDpi() {\n return 96.0; // TODO: compute?\n }\n\n getRem() {\n return this.document.rootEmSize;\n }\n\n getEm() {\n return this.document.emSize;\n }\n\n getUnits() {\n return this.getString().replace(/[0-9.-]/g, '');\n }\n\n getPixels(axisOrIsFontSize) {\n var processPercent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!this.hasValue()) {\n return 0;\n }\n\n var [axis, isFontSize] = typeof axisOrIsFontSize === 'boolean' ? [undefined, axisOrIsFontSize] : [axisOrIsFontSize];\n var {\n viewPort\n } = this.document.screen;\n\n switch (true) {\n case this.isString(/vmin$/):\n return this.getNumber() / 100.0 * Math.min(viewPort.computeSize('x'), viewPort.computeSize('y'));\n\n case this.isString(/vmax$/):\n return this.getNumber() / 100.0 * Math.max(viewPort.computeSize('x'), viewPort.computeSize('y'));\n\n case this.isString(/vw$/):\n return this.getNumber() / 100.0 * viewPort.computeSize('x');\n\n case this.isString(/vh$/):\n return this.getNumber() / 100.0 * viewPort.computeSize('y');\n\n case this.isString(/rem$/):\n return this.getNumber() * this.getRem();\n\n case this.isString(/em$/):\n return this.getNumber() * this.getEm();\n\n case this.isString(/ex$/):\n return this.getNumber() * this.getEm() / 2.0;\n\n case this.isString(/px$/):\n return this.getNumber();\n\n case this.isString(/pt$/):\n return this.getNumber() * this.getDpi() * (1.0 / 72.0);\n\n case this.isString(/pc$/):\n return this.getNumber() * 15;\n\n case this.isString(/cm$/):\n return this.getNumber() * this.getDpi() / 2.54;\n\n case this.isString(/mm$/):\n return this.getNumber() * this.getDpi() / 25.4;\n\n case this.isString(/in$/):\n return this.getNumber() * this.getDpi();\n\n case this.isString(/%$/) && isFontSize:\n return this.getNumber() * this.getEm();\n\n case this.isString(/%$/):\n return this.getNumber() * viewPort.computeSize(axis);\n\n default:\n {\n var n = this.getNumber();\n\n if (processPercent && n < 1.0) {\n return n * viewPort.computeSize(axis);\n }\n\n return n;\n }\n }\n }\n\n getMilliseconds() {\n if (!this.hasValue()) {\n return 0;\n }\n\n if (this.isString(/ms$/)) {\n return this.getNumber();\n }\n\n return this.getNumber() * 1000;\n }\n\n getRadians() {\n if (!this.hasValue()) {\n return 0;\n }\n\n switch (true) {\n case this.isString(/deg$/):\n return this.getNumber() * (Math.PI / 180.0);\n\n case this.isString(/grad$/):\n return this.getNumber() * (Math.PI / 200.0);\n\n case this.isString(/rad$/):\n return this.getNumber();\n\n default:\n return this.getNumber() * (Math.PI / 180.0);\n }\n }\n\n getDefinition() {\n var asString = this.getString();\n var name = /#([^)'\"]+)/.exec(asString);\n\n if (name) {\n name = name[1];\n }\n\n if (!name) {\n name = asString;\n }\n\n return this.document.definitions[name];\n }\n\n getFillStyleDefinition(element, opacity) {\n var def = this.getDefinition();\n\n if (!def) {\n return null;\n } // gradient\n\n\n if (typeof def.createGradient === 'function') {\n return def.createGradient(this.document.ctx, element, opacity);\n } // pattern\n\n\n if (typeof def.createPattern === 'function') {\n if (def.getHrefAttribute().hasValue()) {\n var patternTransform = def.getAttribute('patternTransform');\n def = def.getHrefAttribute().getDefinition();\n\n if (patternTransform.hasValue()) {\n def.getAttribute('patternTransform', true).setValue(patternTransform.value);\n }\n }\n\n return def.createPattern(this.document.ctx, element, opacity);\n }\n\n return null;\n }\n\n getTextBaseline() {\n if (!this.hasValue()) {\n return null;\n }\n\n return Property.textBaselineMapping[this.getString()];\n }\n\n addOpacity(opacity) {\n var value = this.getColor();\n var len = value.length;\n var commas = 0; // Simulate old RGBColor version, which can't parse rgba.\n\n for (var i = 0; i < len; i++) {\n if (value[i] === ',') {\n commas++;\n }\n\n if (commas === 3) {\n break;\n }\n }\n\n if (opacity.hasValue() && this.isString() && commas !== 3) {\n var color = new RGBColor(value);\n\n if (color.ok) {\n color.alpha = opacity.getNumber();\n value = color.toRGBA();\n }\n }\n\n return new Property(this.document, this.name, value);\n }\n\n}\nProperty.textBaselineMapping = {\n 'baseline': 'alphabetic',\n 'before-edge': 'top',\n 'text-before-edge': 'top',\n 'middle': 'middle',\n 'central': 'middle',\n 'after-edge': 'bottom',\n 'text-after-edge': 'bottom',\n 'ideographic': 'ideographic',\n 'alphabetic': 'alphabetic',\n 'hanging': 'hanging',\n 'mathematical': 'alphabetic'\n};\n\nclass ViewPort {\n constructor() {\n this.viewPorts = [];\n }\n\n clear() {\n this.viewPorts = [];\n }\n\n setCurrent(width, height) {\n this.viewPorts.push({\n width,\n height\n });\n }\n\n removeCurrent() {\n this.viewPorts.pop();\n }\n\n getCurrent() {\n var {\n viewPorts\n } = this;\n return viewPorts[viewPorts.length - 1];\n }\n\n get width() {\n return this.getCurrent().width;\n }\n\n get height() {\n return this.getCurrent().height;\n }\n\n computeSize(d) {\n if (typeof d === 'number') {\n return d;\n }\n\n if (d === 'x') {\n return this.width;\n }\n\n if (d === 'y') {\n return this.height;\n }\n\n return Math.sqrt(Math.pow(this.width, 2) + Math.pow(this.height, 2)) / Math.sqrt(2);\n }\n\n}\n\nclass Point {\n constructor(x, y) {\n this.x = x;\n this.y = y;\n }\n\n static parse(point) {\n var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var [x = defaultValue, y = defaultValue] = toNumbers(point);\n return new Point(x, y);\n }\n\n static parseScale(scale) {\n var defaultValue = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n var [x = defaultValue, y = x] = toNumbers(scale);\n return new Point(x, y);\n }\n\n static parsePath(path) {\n var points = toNumbers(path);\n var len = points.length;\n var pathPoints = [];\n\n for (var i = 0; i < len; i += 2) {\n pathPoints.push(new Point(points[i], points[i + 1]));\n }\n\n return pathPoints;\n }\n\n angleTo(point) {\n return Math.atan2(point.y - this.y, point.x - this.x);\n }\n\n applyTransform(transform) {\n var {\n x,\n y\n } = this;\n var xp = x * transform[0] + y * transform[2] + transform[4];\n var yp = x * transform[1] + y * transform[3] + transform[5];\n this.x = xp;\n this.y = yp;\n }\n\n}\n\nclass Mouse {\n constructor(screen) {\n this.screen = screen;\n this.working = false;\n this.events = [];\n this.eventElements = []; // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\n this.onClick = this.onClick.bind(this); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n\n this.onMouseMove = this.onMouseMove.bind(this);\n }\n\n isWorking() {\n return this.working;\n }\n\n start() {\n if (this.working) {\n return;\n }\n\n var {\n screen,\n onClick,\n onMouseMove\n } = this;\n var canvas = screen.ctx.canvas;\n canvas.onclick = onClick;\n canvas.onmousemove = onMouseMove;\n this.working = true;\n }\n\n stop() {\n if (!this.working) {\n return;\n }\n\n var canvas = this.screen.ctx.canvas;\n this.working = false;\n canvas.onclick = null;\n canvas.onmousemove = null;\n }\n\n hasEvents() {\n return this.working && this.events.length > 0;\n }\n\n runEvents() {\n if (!this.working) {\n return;\n }\n\n var {\n screen: document,\n events,\n eventElements\n } = this;\n var {\n style\n } = document.ctx.canvas;\n\n if (style) {\n style.cursor = '';\n }\n\n events.forEach((_ref, i) => {\n var {\n run\n } = _ref;\n var element = eventElements[i];\n\n while (element) {\n run(element);\n element = element.parent;\n }\n }); // done running, clear\n\n this.events = [];\n this.eventElements = [];\n }\n\n checkPath(element, ctx) {\n if (!this.working || !ctx) {\n return;\n }\n\n var {\n events,\n eventElements\n } = this;\n events.forEach((_ref2, i) => {\n var {\n x,\n y\n } = _ref2;\n\n if (!eventElements[i] && ctx.isPointInPath && ctx.isPointInPath(x, y)) {\n eventElements[i] = element;\n }\n });\n }\n\n checkBoundingBox(element, boundingBox) {\n if (!this.working || !boundingBox) {\n return;\n }\n\n var {\n events,\n eventElements\n } = this;\n events.forEach((_ref3, i) => {\n var {\n x,\n y\n } = _ref3;\n\n if (!eventElements[i] && boundingBox.isPointInBox(x, y)) {\n eventElements[i] = element;\n }\n });\n }\n\n mapXY(x, y) {\n var {\n window,\n ctx\n } = this.screen;\n var point = new Point(x, y);\n var element = ctx.canvas;\n\n while (element) {\n point.x -= element.offsetLeft;\n point.y -= element.offsetTop;\n element = element.offsetParent;\n }\n\n if (window.scrollX) {\n point.x += window.scrollX;\n }\n\n if (window.scrollY) {\n point.y += window.scrollY;\n }\n\n return point;\n }\n\n onClick(event) {\n var {\n x,\n y\n } = this.mapXY(event.clientX, event.clientY);\n this.events.push({\n type: 'onclick',\n x,\n y,\n\n run(eventTarget) {\n if (eventTarget.onClick) {\n eventTarget.onClick();\n }\n }\n\n });\n }\n\n onMouseMove(event) {\n var {\n x,\n y\n } = this.mapXY(event.clientX, event.clientY);\n this.events.push({\n type: 'onmousemove',\n x,\n y,\n\n run(eventTarget) {\n if (eventTarget.onMouseMove) {\n eventTarget.onMouseMove();\n }\n }\n\n });\n }\n\n}\n\nvar defaultWindow = typeof window !== 'undefined' ? window : null;\nvar defaultFetch$1 = typeof fetch !== 'undefined' ? fetch.bind(undefined) // `fetch` depends on context: `someObject.fetch(...)` will throw error.\n: null;\nclass Screen {\n constructor(ctx) {\n var {\n fetch = defaultFetch$1,\n window = defaultWindow\n } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.ctx = ctx;\n this.FRAMERATE = 30;\n this.MAX_VIRTUAL_PIXELS = 30000;\n this.CLIENT_WIDTH = 800;\n this.CLIENT_HEIGHT = 600;\n this.viewPort = new ViewPort();\n this.mouse = new Mouse(this);\n this.animations = [];\n this.waits = [];\n this.frameDuration = 0;\n this.isReadyLock = false;\n this.isFirstRender = true;\n this.intervalId = null;\n this.window = window;\n this.fetch = fetch;\n }\n\n wait(checker) {\n this.waits.push(checker);\n }\n\n ready() {\n // eslint-disable-next-line @typescript-eslint/no-misused-promises\n if (!this.readyPromise) {\n return Promise.resolve();\n }\n\n return this.readyPromise;\n }\n\n isReady() {\n if (this.isReadyLock) {\n return true;\n }\n\n var isReadyLock = this.waits.every(_ => _());\n\n if (isReadyLock) {\n this.waits = [];\n\n if (this.resolveReady) {\n this.resolveReady();\n }\n }\n\n this.isReadyLock = isReadyLock;\n return isReadyLock;\n }\n\n setDefaults(ctx) {\n // initial values and defaults\n ctx.strokeStyle = 'rgba(0,0,0,0)';\n ctx.lineCap = 'butt';\n ctx.lineJoin = 'miter';\n ctx.miterLimit = 4;\n }\n\n setViewBox(_ref) {\n var {\n document,\n ctx,\n aspectRatio,\n width,\n desiredWidth,\n height,\n desiredHeight,\n minX = 0,\n minY = 0,\n refX,\n refY,\n clip = false,\n clipX = 0,\n clipY = 0\n } = _ref;\n // aspect ratio - http://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute\n var cleanAspectRatio = compressSpaces(aspectRatio).replace(/^defer\\s/, ''); // ignore defer\n\n var [aspectRatioAlign, aspectRatioMeetOrSlice] = cleanAspectRatio.split(' ');\n var align = aspectRatioAlign || 'xMidYMid';\n var meetOrSlice = aspectRatioMeetOrSlice || 'meet'; // calculate scale\n\n var scaleX = width / desiredWidth;\n var scaleY = height / desiredHeight;\n var scaleMin = Math.min(scaleX, scaleY);\n var scaleMax = Math.max(scaleX, scaleY);\n var finalDesiredWidth = desiredWidth;\n var finalDesiredHeight = desiredHeight;\n\n if (meetOrSlice === 'meet') {\n finalDesiredWidth *= scaleMin;\n finalDesiredHeight *= scaleMin;\n }\n\n if (meetOrSlice === 'slice') {\n finalDesiredWidth *= scaleMax;\n finalDesiredHeight *= scaleMax;\n }\n\n var refXProp = new Property(document, 'refX', refX);\n var refYProp = new Property(document, 'refY', refY);\n var hasRefs = refXProp.hasValue() && refYProp.hasValue();\n\n if (hasRefs) {\n ctx.translate(-scaleMin * refXProp.getPixels('x'), -scaleMin * refYProp.getPixels('y'));\n }\n\n if (clip) {\n var scaledClipX = scaleMin * clipX;\n var scaledClipY = scaleMin * clipY;\n ctx.beginPath();\n ctx.moveTo(scaledClipX, scaledClipY);\n ctx.lineTo(width, scaledClipY);\n ctx.lineTo(width, height);\n ctx.lineTo(scaledClipX, height);\n ctx.closePath();\n ctx.clip();\n }\n\n if (!hasRefs) {\n var isMeetMinY = meetOrSlice === 'meet' && scaleMin === scaleY;\n var isSliceMaxY = meetOrSlice === 'slice' && scaleMax === scaleY;\n var isMeetMinX = meetOrSlice === 'meet' && scaleMin === scaleX;\n var isSliceMaxX = meetOrSlice === 'slice' && scaleMax === scaleX;\n\n if (align.startsWith('xMid') && (isMeetMinY || isSliceMaxY)) {\n ctx.translate(width / 2.0 - finalDesiredWidth / 2.0, 0);\n }\n\n if (align.endsWith('YMid') && (isMeetMinX || isSliceMaxX)) {\n ctx.translate(0, height / 2.0 - finalDesiredHeight / 2.0);\n }\n\n if (align.startsWith('xMax') && (isMeetMinY || isSliceMaxY)) {\n ctx.translate(width - finalDesiredWidth, 0);\n }\n\n if (align.endsWith('YMax') && (isMeetMinX || isSliceMaxX)) {\n ctx.translate(0, height - finalDesiredHeight);\n }\n } // scale\n\n\n switch (true) {\n case align === 'none':\n ctx.scale(scaleX, scaleY);\n break;\n\n case meetOrSlice === 'meet':\n ctx.scale(scaleMin, scaleMin);\n break;\n\n case meetOrSlice === 'slice':\n ctx.scale(scaleMax, scaleMax);\n break;\n } // translate\n\n\n ctx.translate(-minX, -minY);\n }\n\n start(element) {\n var {\n enableRedraw = false,\n ignoreMouse = false,\n ignoreAnimation = false,\n ignoreDimensions = false,\n ignoreClear = false,\n forceRedraw,\n scaleWidth,\n scaleHeight,\n offsetX,\n offsetY\n } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var {\n FRAMERATE,\n mouse\n } = this;\n var frameDuration = 1000 / FRAMERATE;\n this.frameDuration = frameDuration;\n this.readyPromise = new Promise(resolve => {\n this.resolveReady = resolve;\n });\n\n if (this.isReady()) {\n this.render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY);\n }\n\n if (!enableRedraw) {\n return;\n }\n\n var now = Date.now();\n var then = now;\n var delta = 0;\n\n var tick = () => {\n now = Date.now();\n delta = now - then;\n\n if (delta >= frameDuration) {\n then = now - delta % frameDuration;\n\n if (this.shouldUpdate(ignoreAnimation, forceRedraw)) {\n this.render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY);\n mouse.runEvents();\n }\n }\n\n this.intervalId = requestAnimationFrame(tick);\n };\n\n if (!ignoreMouse) {\n mouse.start();\n }\n\n this.intervalId = requestAnimationFrame(tick);\n }\n\n stop() {\n if (this.intervalId) {\n requestAnimationFrame.cancel(this.intervalId);\n this.intervalId = null;\n }\n\n this.mouse.stop();\n }\n\n shouldUpdate(ignoreAnimation, forceRedraw) {\n // need update from animations?\n if (!ignoreAnimation) {\n var {\n frameDuration\n } = this;\n var shouldUpdate = this.animations.reduce((shouldUpdate, animation) => animation.update(frameDuration) || shouldUpdate, false);\n\n if (shouldUpdate) {\n return true;\n }\n } // need update from redraw?\n\n\n if (typeof forceRedraw === 'function' && forceRedraw()) {\n return true;\n }\n\n if (!this.isReadyLock && this.isReady()) {\n return true;\n } // need update from mouse events?\n\n\n if (this.mouse.hasEvents()) {\n return true;\n }\n\n return false;\n }\n\n render(element, ignoreDimensions, ignoreClear, scaleWidth, scaleHeight, offsetX, offsetY) {\n var {\n CLIENT_WIDTH,\n CLIENT_HEIGHT,\n viewPort,\n ctx,\n isFirstRender\n } = this;\n var canvas = ctx.canvas;\n viewPort.clear();\n\n if (canvas.width && canvas.height) {\n viewPort.setCurrent(canvas.width, canvas.height);\n } else {\n viewPort.setCurrent(CLIENT_WIDTH, CLIENT_HEIGHT);\n }\n\n var widthStyle = element.getStyle('width');\n var heightStyle = element.getStyle('height');\n\n if (!ignoreDimensions && (isFirstRender || typeof scaleWidth !== 'number' && typeof scaleHeight !== 'number')) {\n // set canvas size\n if (widthStyle.hasValue()) {\n canvas.width = widthStyle.getPixels('x');\n\n if (canvas.style) {\n canvas.style.width = \"\".concat(canvas.width, \"px\");\n }\n }\n\n if (heightStyle.hasValue()) {\n canvas.height = heightStyle.getPixels('y');\n\n if (canvas.style) {\n canvas.style.height = \"\".concat(canvas.height, \"px\");\n }\n }\n }\n\n var cWidth = canvas.clientWidth || canvas.width;\n var cHeight = canvas.clientHeight || canvas.height;\n\n if (ignoreDimensions && widthStyle.hasValue() && heightStyle.hasValue()) {\n cWidth = widthStyle.getPixels('x');\n cHeight = heightStyle.getPixels('y');\n }\n\n viewPort.setCurrent(cWidth, cHeight);\n\n if (typeof offsetX === 'number') {\n element.getAttribute('x', true).setValue(offsetX);\n }\n\n if (typeof offsetY === 'number') {\n element.getAttribute('y', true).setValue(offsetY);\n }\n\n if (typeof scaleWidth === 'number' || typeof scaleHeight === 'number') {\n var viewBox = toNumbers(element.getAttribute('viewBox').getString());\n var xRatio = 0;\n var yRatio = 0;\n\n if (typeof scaleWidth === 'number') {\n var _widthStyle = element.getStyle('width');\n\n if (_widthStyle.hasValue()) {\n xRatio = _widthStyle.getPixels('x') / scaleWidth;\n } else if (!isNaN(viewBox[2])) {\n xRatio = viewBox[2] / scaleWidth;\n }\n }\n\n if (typeof scaleHeight === 'number') {\n var _heightStyle = element.getStyle('height');\n\n if (_heightStyle.hasValue()) {\n yRatio = _heightStyle.getPixels('y') / scaleHeight;\n } else if (!isNaN(viewBox[3])) {\n yRatio = viewBox[3] / scaleHeight;\n }\n }\n\n if (!xRatio) {\n xRatio = yRatio;\n }\n\n if (!yRatio) {\n yRatio = xRatio;\n }\n\n element.getAttribute('width', true).setValue(scaleWidth);\n element.getAttribute('height', true).setValue(scaleHeight);\n var transformStyle = element.getStyle('transform', true, true);\n transformStyle.setValue(\"\".concat(transformStyle.getString(), \" scale(\").concat(1.0 / xRatio, \", \").concat(1.0 / yRatio, \")\"));\n } // clear and render\n\n\n if (!ignoreClear) {\n ctx.clearRect(0, 0, cWidth, cHeight);\n }\n\n element.render(ctx);\n\n if (isFirstRender) {\n this.isFirstRender = false;\n }\n }\n\n}\nScreen.defaultWindow = defaultWindow;\nScreen.defaultFetch = defaultFetch$1;\n\nvar {\n defaultFetch\n} = Screen;\nvar DefaultDOMParser = typeof DOMParser !== 'undefined' ? DOMParser : null;\nclass Parser {\n constructor() {\n var {\n fetch = defaultFetch,\n DOMParser = DefaultDOMParser\n } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.fetch = fetch;\n this.DOMParser = DOMParser;\n }\n\n parse(resource) {\n var _this = this;\n\n return _asyncToGenerator(function* () {\n if (resource.startsWith('<')) {\n return _this.parseFromString(resource);\n }\n\n return _this.load(resource);\n })();\n }\n\n parseFromString(xml) {\n var parser = new this.DOMParser();\n\n try {\n return this.checkDocument(parser.parseFromString(xml, 'image/svg+xml'));\n } catch (err) {\n return this.checkDocument(parser.parseFromString(xml, 'text/xml'));\n }\n }\n\n checkDocument(document) {\n var parserError = document.getElementsByTagName('parsererror')[0];\n\n if (parserError) {\n throw new Error(parserError.textContent);\n }\n\n return document;\n }\n\n load(url) {\n var _this2 = this;\n\n return _asyncToGenerator(function* () {\n var response = yield _this2.fetch(url);\n var xml = yield response.text();\n return _this2.parseFromString(xml);\n })();\n }\n\n}\n\nclass Translate {\n constructor(_, point) {\n this.type = 'translate';\n this.point = null;\n this.point = Point.parse(point);\n }\n\n apply(ctx) {\n var {\n x,\n y\n } = this.point;\n ctx.translate(x || 0.0, y || 0.0);\n }\n\n unapply(ctx) {\n var {\n x,\n y\n } = this.point;\n ctx.translate(-1.0 * x || 0.0, -1.0 * y || 0.0);\n }\n\n applyToPoint(point) {\n var {\n x,\n y\n } = this.point;\n point.applyTransform([1, 0, 0, 1, x || 0.0, y || 0.0]);\n }\n\n}\n\nclass Rotate {\n constructor(document, rotate, transformOrigin) {\n this.type = 'rotate';\n this.angle = null;\n this.originX = null;\n this.originY = null;\n this.cx = 0;\n this.cy = 0;\n var numbers = toNumbers(rotate);\n this.angle = new Property(document, 'angle', numbers[0]);\n this.originX = transformOrigin[0];\n this.originY = transformOrigin[1];\n this.cx = numbers[1] || 0;\n this.cy = numbers[2] || 0;\n }\n\n apply(ctx) {\n var {\n cx,\n cy,\n originX,\n originY,\n angle\n } = this;\n var tx = cx + originX.getPixels('x');\n var ty = cy + originY.getPixels('y');\n ctx.translate(tx, ty);\n ctx.rotate(angle.getRadians());\n ctx.translate(-tx, -ty);\n }\n\n unapply(ctx) {\n var {\n cx,\n cy,\n originX,\n originY,\n angle\n } = this;\n var tx = cx + originX.getPixels('x');\n var ty = cy + originY.getPixels('y');\n ctx.translate(tx, ty);\n ctx.rotate(-1.0 * angle.getRadians());\n ctx.translate(-tx, -ty);\n }\n\n applyToPoint(point) {\n var {\n cx,\n cy,\n angle\n } = this;\n var rad = angle.getRadians();\n point.applyTransform([1, 0, 0, 1, cx || 0.0, cy || 0.0 // this.p.y\n ]);\n point.applyTransform([Math.cos(rad), Math.sin(rad), -Math.sin(rad), Math.cos(rad), 0, 0]);\n point.applyTransform([1, 0, 0, 1, -cx || 0.0, -cy || 0.0 // -this.p.y\n ]);\n }\n\n}\n\nclass Scale {\n constructor(_, scale, transformOrigin) {\n this.type = 'scale';\n this.scale = null;\n this.originX = null;\n this.originY = null;\n var scaleSize = Point.parseScale(scale); // Workaround for node-canvas\n\n if (scaleSize.x === 0 || scaleSize.y === 0) {\n scaleSize.x = PSEUDO_ZERO;\n scaleSize.y = PSEUDO_ZERO;\n }\n\n this.scale = scaleSize;\n this.originX = transformOrigin[0];\n this.originY = transformOrigin[1];\n }\n\n apply(ctx) {\n var {\n scale: {\n x,\n y\n },\n originX,\n originY\n } = this;\n var tx = originX.getPixels('x');\n var ty = originY.getPixels('y');\n ctx.translate(tx, ty);\n ctx.scale(x, y || x);\n ctx.translate(-tx, -ty);\n }\n\n unapply(ctx) {\n var {\n scale: {\n x,\n y\n },\n originX,\n originY\n } = this;\n var tx = originX.getPixels('x');\n var ty = originY.getPixels('y');\n ctx.translate(tx, ty);\n ctx.scale(1.0 / x, 1.0 / y || x);\n ctx.translate(-tx, -ty);\n }\n\n applyToPoint(point) {\n var {\n x,\n y\n } = this.scale;\n point.applyTransform([x || 0.0, 0, 0, y || 0.0, 0, 0]);\n }\n\n}\n\nclass Matrix {\n constructor(_, matrix, transformOrigin) {\n this.type = 'matrix';\n this.matrix = [];\n this.originX = null;\n this.originY = null;\n this.matrix = toNumbers(matrix);\n this.originX = transformOrigin[0];\n this.originY = transformOrigin[1];\n }\n\n apply(ctx) {\n var {\n originX,\n originY,\n matrix\n } = this;\n var tx = originX.getPixels('x');\n var ty = originY.getPixels('y');\n ctx.translate(tx, ty);\n ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]);\n ctx.translate(-tx, -ty);\n }\n\n unapply(ctx) {\n var {\n originX,\n originY,\n matrix\n } = this;\n var a = matrix[0];\n var b = matrix[2];\n var c = matrix[4];\n var d = matrix[1];\n var e = matrix[3];\n var f = matrix[5];\n var g = 0.0;\n var h = 0.0;\n var i = 1.0;\n var det = 1 / (a * (e * i - f * h) - b * (d * i - f * g) + c * (d * h - e * g));\n var tx = originX.getPixels('x');\n var ty = originY.getPixels('y');\n ctx.translate(tx, ty);\n ctx.transform(det * (e * i - f * h), det * (f * g - d * i), det * (c * h - b * i), det * (a * i - c * g), det * (b * f - c * e), det * (c * d - a * f));\n ctx.translate(-tx, -ty);\n }\n\n applyToPoint(point) {\n point.applyTransform(this.matrix);\n }\n\n}\n\nclass Skew extends Matrix {\n constructor(document, skew, transformOrigin) {\n super(document, skew, transformOrigin);\n this.type = 'skew';\n this.angle = null;\n this.angle = new Property(document, 'angle', skew);\n }\n\n}\n\nclass SkewX extends Skew {\n constructor(document, skew, transformOrigin) {\n super(document, skew, transformOrigin);\n this.type = 'skewX';\n this.matrix = [1, 0, Math.tan(this.angle.getRadians()), 1, 0, 0];\n }\n\n}\n\nclass SkewY extends Skew {\n constructor(document, skew, transformOrigin) {\n super(document, skew, transformOrigin);\n this.type = 'skewY';\n this.matrix = [1, Math.tan(this.angle.getRadians()), 0, 1, 0, 0];\n }\n\n}\n\nfunction parseTransforms(transform) {\n return compressSpaces(transform).trim().replace(/\\)([a-zA-Z])/g, ') $1').replace(/\\)(\\s?,\\s?)/g, ') ').split(/\\s(?=[a-z])/);\n}\n\nfunction parseTransform(transform) {\n var [type, value] = transform.split('(');\n return [type.trim(), value.trim().replace(')', '')];\n}\n\nclass Transform {\n constructor(document, transform, transformOrigin) {\n this.document = document;\n this.transforms = [];\n var data = parseTransforms(transform);\n data.forEach(transform => {\n if (transform === 'none') {\n return;\n }\n\n var [type, value] = parseTransform(transform);\n var TransformType = Transform.transformTypes[type];\n\n if (typeof TransformType !== 'undefined') {\n this.transforms.push(new TransformType(this.document, value, transformOrigin));\n }\n });\n }\n\n static fromElement(document, element) {\n var transformStyle = element.getStyle('transform', false, true);\n var [transformOriginXProperty, transformOriginYProperty = transformOriginXProperty] = element.getStyle('transform-origin', false, true).split();\n var transformOrigin = [transformOriginXProperty, transformOriginYProperty];\n\n if (transformStyle.hasValue()) {\n return new Transform(document, transformStyle.getString(), transformOrigin);\n }\n\n return null;\n }\n\n apply(ctx) {\n var {\n transforms\n } = this;\n var len = transforms.length;\n\n for (var i = 0; i < len; i++) {\n transforms[i].apply(ctx);\n }\n }\n\n unapply(ctx) {\n var {\n transforms\n } = this;\n var len = transforms.length;\n\n for (var i = len - 1; i >= 0; i--) {\n transforms[i].unapply(ctx);\n }\n } // TODO: applyToPoint unused ... remove?\n\n\n applyToPoint(point) {\n var {\n transforms\n } = this;\n var len = transforms.length;\n\n for (var i = 0; i < len; i++) {\n transforms[i].applyToPoint(point);\n }\n }\n\n}\nTransform.transformTypes = {\n translate: Translate,\n rotate: Rotate,\n scale: Scale,\n matrix: Matrix,\n skewX: SkewX,\n skewY: SkewY\n};\n\nclass Element {\n constructor(document, node) {\n var captureTextNodes = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n this.document = document;\n this.node = node;\n this.captureTextNodes = captureTextNodes;\n this.attributes = Object.create(null);\n this.styles = Object.create(null);\n this.stylesSpecificity = Object.create(null);\n this.animationFrozen = false;\n this.animationFrozenValue = '';\n this.parent = null;\n this.children = [];\n\n if (!node || node.nodeType !== 1) {\n // ELEMENT_NODE\n return;\n } // add attributes\n\n\n Array.from(node.attributes).forEach(attribute => {\n var nodeName = normalizeAttributeName(attribute.nodeName);\n this.attributes[nodeName] = new Property(document, nodeName, attribute.value);\n });\n this.addStylesFromStyleDefinition(); // add inline styles\n\n if (this.getAttribute('style').hasValue()) {\n var styles = this.getAttribute('style').getString().split(';').map(_ => _.trim());\n styles.forEach(style => {\n if (!style) {\n return;\n }\n\n var [name, value] = style.split(':').map(_ => _.trim());\n this.styles[name] = new Property(document, name, value);\n });\n }\n\n var {\n definitions\n } = document;\n var id = this.getAttribute('id'); // add id\n\n if (id.hasValue()) {\n if (!definitions[id.getString()]) {\n definitions[id.getString()] = this;\n }\n }\n\n Array.from(node.childNodes).forEach(childNode => {\n if (childNode.nodeType === 1) {\n this.addChild(childNode); // ELEMENT_NODE\n } else if (captureTextNodes && (childNode.nodeType === 3 || childNode.nodeType === 4)) {\n var textNode = document.createTextNode(childNode);\n\n if (textNode.getText().length > 0) {\n this.addChild(textNode); // TEXT_NODE\n }\n }\n });\n }\n\n getAttribute(name) {\n var createIfNotExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var attr = this.attributes[name];\n\n if (!attr && createIfNotExists) {\n var _attr = new Property(this.document, name, '');\n\n this.attributes[name] = _attr;\n return _attr;\n }\n\n return attr || Property.empty(this.document);\n }\n\n getHrefAttribute() {\n for (var key in this.attributes) {\n if (key === 'href' || key.endsWith(':href')) {\n return this.attributes[key];\n }\n }\n\n return Property.empty(this.document);\n }\n\n getStyle(name) {\n var createIfNotExists = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var skipAncestors = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var style = this.styles[name];\n\n if (style) {\n return style;\n }\n\n var attr = this.getAttribute(name);\n\n if (attr !== null && attr !== void 0 && attr.hasValue()) {\n this.styles[name] = attr; // move up to me to cache\n\n return attr;\n }\n\n if (!skipAncestors) {\n var {\n parent\n } = this;\n\n if (parent) {\n var parentStyle = parent.getStyle(name);\n\n if (parentStyle !== null && parentStyle !== void 0 && parentStyle.hasValue()) {\n return parentStyle;\n }\n }\n }\n\n if (createIfNotExists) {\n var _style = new Property(this.document, name, '');\n\n this.styles[name] = _style;\n return _style;\n }\n\n return style || Property.empty(this.document);\n }\n\n render(ctx) {\n // don't render display=none\n // don't render visibility=hidden\n if (this.getStyle('display').getString() === 'none' || this.getStyle('visibility').getString() === 'hidden') {\n return;\n }\n\n ctx.save();\n\n if (this.getStyle('mask').hasValue()) {\n // mask\n var mask = this.getStyle('mask').getDefinition();\n\n if (mask) {\n this.applyEffects(ctx);\n mask.apply(ctx, this);\n }\n } else if (this.getStyle('filter').getValue('none') !== 'none') {\n // filter\n var filter = this.getStyle('filter').getDefinition();\n\n if (filter) {\n this.applyEffects(ctx);\n filter.apply(ctx, this);\n }\n } else {\n this.setContext(ctx);\n this.renderChildren(ctx);\n this.clearContext(ctx);\n }\n\n ctx.restore();\n }\n\n setContext(_) {// NO RENDER\n }\n\n applyEffects(ctx) {\n // transform\n var transform = Transform.fromElement(this.document, this);\n\n if (transform) {\n transform.apply(ctx);\n } // clip\n\n\n var clipPathStyleProp = this.getStyle('clip-path', false, true);\n\n if (clipPathStyleProp.hasValue()) {\n var clip = clipPathStyleProp.getDefinition();\n\n if (clip) {\n clip.apply(ctx);\n }\n }\n }\n\n clearContext(_) {// NO RENDER\n }\n\n renderChildren(ctx) {\n this.children.forEach(child => {\n child.render(ctx);\n });\n }\n\n addChild(childNode) {\n var child = childNode instanceof Element ? childNode : this.document.createElement(childNode);\n child.parent = this;\n\n if (!Element.ignoreChildTypes.includes(child.type)) {\n this.children.push(child);\n }\n }\n\n matchesSelector(selector) {\n var _node$getAttribute;\n\n var {\n node\n } = this;\n\n if (typeof node.matches === 'function') {\n return node.matches(selector);\n }\n\n var styleClasses = (_node$getAttribute = node.getAttribute) === null || _node$getAttribute === void 0 ? void 0 : _node$getAttribute.call(node, 'class');\n\n if (!styleClasses || styleClasses === '') {\n return false;\n }\n\n return styleClasses.split(' ').some(styleClass => \".\".concat(styleClass) === selector);\n }\n\n addStylesFromStyleDefinition() {\n var {\n styles,\n stylesSpecificity\n } = this.document;\n\n for (var selector in styles) {\n if (!selector.startsWith('@') && this.matchesSelector(selector)) {\n var style = styles[selector];\n var specificity = stylesSpecificity[selector];\n\n if (style) {\n for (var name in style) {\n var existingSpecificity = this.stylesSpecificity[name];\n\n if (typeof existingSpecificity === 'undefined') {\n existingSpecificity = '000';\n }\n\n if (specificity >= existingSpecificity) {\n this.styles[name] = style[name];\n this.stylesSpecificity[name] = specificity;\n }\n }\n }\n }\n }\n }\n\n removeStyles(element, ignoreStyles) {\n var toRestore = ignoreStyles.reduce((toRestore, name) => {\n var styleProp = element.getStyle(name);\n\n if (!styleProp.hasValue()) {\n return toRestore;\n }\n\n var value = styleProp.getString();\n styleProp.setValue('');\n return [...toRestore, [name, value]];\n }, []);\n return toRestore;\n }\n\n restoreStyles(element, styles) {\n styles.forEach(_ref => {\n var [name, value] = _ref;\n element.getStyle(name, true).setValue(value);\n });\n }\n\n isFirstChild() {\n var _this$parent;\n\n return ((_this$parent = this.parent) === null || _this$parent === void 0 ? void 0 : _this$parent.children.indexOf(this)) === 0;\n }\n\n}\nElement.ignoreChildTypes = ['title'];\n\nclass UnknownElement extends Element {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n }\n\n}\n\nfunction wrapFontFamily(fontFamily) {\n var trimmed = fontFamily.trim();\n return /^('|\")/.test(trimmed) ? trimmed : \"\\\"\".concat(trimmed, \"\\\"\");\n}\n\nfunction prepareFontFamily(fontFamily) {\n return typeof process === 'undefined' ? fontFamily : fontFamily.trim().split(',').map(wrapFontFamily).join(',');\n}\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/CSS/font-style\r\n * @param fontStyle\r\n * @returns CSS font style.\r\n */\n\n\nfunction prepareFontStyle(fontStyle) {\n if (!fontStyle) {\n return '';\n }\n\n var targetFontStyle = fontStyle.trim().toLowerCase();\n\n switch (targetFontStyle) {\n case 'normal':\n case 'italic':\n case 'oblique':\n case 'inherit':\n case 'initial':\n case 'unset':\n return targetFontStyle;\n\n default:\n if (/^oblique\\s+(-|)\\d+deg$/.test(targetFontStyle)) {\n return targetFontStyle;\n }\n\n return '';\n }\n}\n/**\r\n * https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight\r\n * @param fontWeight\r\n * @returns CSS font weight.\r\n */\n\n\nfunction prepareFontWeight(fontWeight) {\n if (!fontWeight) {\n return '';\n }\n\n var targetFontWeight = fontWeight.trim().toLowerCase();\n\n switch (targetFontWeight) {\n case 'normal':\n case 'bold':\n case 'lighter':\n case 'bolder':\n case 'inherit':\n case 'initial':\n case 'unset':\n return targetFontWeight;\n\n default:\n if (/^[\\d.]+$/.test(targetFontWeight)) {\n return targetFontWeight;\n }\n\n return '';\n }\n}\n\nclass Font {\n constructor(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) {\n var inheritFont = inherit ? typeof inherit === 'string' ? Font.parse(inherit) : inherit : {};\n this.fontFamily = fontFamily || inheritFont.fontFamily;\n this.fontSize = fontSize || inheritFont.fontSize;\n this.fontStyle = fontStyle || inheritFont.fontStyle;\n this.fontWeight = fontWeight || inheritFont.fontWeight;\n this.fontVariant = fontVariant || inheritFont.fontVariant;\n }\n\n static parse() {\n var font = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var inherit = arguments.length > 1 ? arguments[1] : undefined;\n var fontStyle = '';\n var fontVariant = '';\n var fontWeight = '';\n var fontSize = '';\n var fontFamily = '';\n var parts = compressSpaces(font).trim().split(' ');\n var set = {\n fontSize: false,\n fontStyle: false,\n fontWeight: false,\n fontVariant: false\n };\n parts.forEach(part => {\n switch (true) {\n case !set.fontStyle && Font.styles.includes(part):\n if (part !== 'inherit') {\n fontStyle = part;\n }\n\n set.fontStyle = true;\n break;\n\n case !set.fontVariant && Font.variants.includes(part):\n if (part !== 'inherit') {\n fontVariant = part;\n }\n\n set.fontStyle = true;\n set.fontVariant = true;\n break;\n\n case !set.fontWeight && Font.weights.includes(part):\n if (part !== 'inherit') {\n fontWeight = part;\n }\n\n set.fontStyle = true;\n set.fontVariant = true;\n set.fontWeight = true;\n break;\n\n case !set.fontSize:\n if (part !== 'inherit') {\n [fontSize] = part.split('/');\n }\n\n set.fontStyle = true;\n set.fontVariant = true;\n set.fontWeight = true;\n set.fontSize = true;\n break;\n\n default:\n if (part !== 'inherit') {\n fontFamily += part;\n }\n\n }\n });\n return new Font(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit);\n }\n\n toString() {\n return [prepareFontStyle(this.fontStyle), this.fontVariant, prepareFontWeight(this.fontWeight), this.fontSize, // Wrap fontFamily only on nodejs and only for canvas.ctx\n prepareFontFamily(this.fontFamily)].join(' ').trim();\n }\n\n}\nFont.styles = 'normal|italic|oblique|inherit';\nFont.variants = 'normal|small-caps|inherit';\nFont.weights = 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit';\n\nclass BoundingBox {\n constructor() {\n var x1 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : Number.NaN;\n var y1 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : Number.NaN;\n var x2 = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : Number.NaN;\n var y2 = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : Number.NaN;\n this.x1 = x1;\n this.y1 = y1;\n this.x2 = x2;\n this.y2 = y2;\n this.addPoint(x1, y1);\n this.addPoint(x2, y2);\n }\n\n get x() {\n return this.x1;\n }\n\n get y() {\n return this.y1;\n }\n\n get width() {\n return this.x2 - this.x1;\n }\n\n get height() {\n return this.y2 - this.y1;\n }\n\n addPoint(x, y) {\n if (typeof x !== 'undefined') {\n if (isNaN(this.x1) || isNaN(this.x2)) {\n this.x1 = x;\n this.x2 = x;\n }\n\n if (x < this.x1) {\n this.x1 = x;\n }\n\n if (x > this.x2) {\n this.x2 = x;\n }\n }\n\n if (typeof y !== 'undefined') {\n if (isNaN(this.y1) || isNaN(this.y2)) {\n this.y1 = y;\n this.y2 = y;\n }\n\n if (y < this.y1) {\n this.y1 = y;\n }\n\n if (y > this.y2) {\n this.y2 = y;\n }\n }\n }\n\n addX(x) {\n this.addPoint(x, null);\n }\n\n addY(y) {\n this.addPoint(null, y);\n }\n\n addBoundingBox(boundingBox) {\n if (!boundingBox) {\n return;\n }\n\n var {\n x1,\n y1,\n x2,\n y2\n } = boundingBox;\n this.addPoint(x1, y1);\n this.addPoint(x2, y2);\n }\n\n sumCubic(t, p0, p1, p2, p3) {\n return Math.pow(1 - t, 3) * p0 + 3 * Math.pow(1 - t, 2) * t * p1 + 3 * (1 - t) * Math.pow(t, 2) * p2 + Math.pow(t, 3) * p3;\n }\n\n bezierCurveAdd(forX, p0, p1, p2, p3) {\n var b = 6 * p0 - 12 * p1 + 6 * p2;\n var a = -3 * p0 + 9 * p1 - 9 * p2 + 3 * p3;\n var c = 3 * p1 - 3 * p0;\n\n if (a === 0) {\n if (b === 0) {\n return;\n }\n\n var t = -c / b;\n\n if (0 < t && t < 1) {\n if (forX) {\n this.addX(this.sumCubic(t, p0, p1, p2, p3));\n } else {\n this.addY(this.sumCubic(t, p0, p1, p2, p3));\n }\n }\n\n return;\n }\n\n var b2ac = Math.pow(b, 2) - 4 * c * a;\n\n if (b2ac < 0) {\n return;\n }\n\n var t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n\n if (0 < t1 && t1 < 1) {\n if (forX) {\n this.addX(this.sumCubic(t1, p0, p1, p2, p3));\n } else {\n this.addY(this.sumCubic(t1, p0, p1, p2, p3));\n }\n }\n\n var t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n\n if (0 < t2 && t2 < 1) {\n if (forX) {\n this.addX(this.sumCubic(t2, p0, p1, p2, p3));\n } else {\n this.addY(this.sumCubic(t2, p0, p1, p2, p3));\n }\n }\n } // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html\n\n\n addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) {\n this.addPoint(p0x, p0y);\n this.addPoint(p3x, p3y);\n this.bezierCurveAdd(true, p0x, p1x, p2x, p3x);\n this.bezierCurveAdd(false, p0y, p1y, p2y, p3y);\n }\n\n addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) {\n var cp1x = p0x + 2 / 3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0)\n\n var cp1y = p0y + 2 / 3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0)\n\n var cp2x = cp1x + 1 / 3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0)\n\n var cp2y = cp1y + 1 / 3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0)\n\n this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y);\n }\n\n isPointInBox(x, y) {\n var {\n x1,\n y1,\n x2,\n y2\n } = this;\n return x1 <= x && x <= x2 && y1 <= y && y <= y2;\n }\n\n}\n\nclass PathParser extends SVGPathData {\n constructor(path) {\n super(path // Fix spaces after signs.\n .replace(/([+\\-.])\\s+/gm, '$1') // Remove invalid part.\n .replace(/[^MmZzLlHhVvCcSsQqTtAae\\d\\s.,+-].*/g, ''));\n this.control = null;\n this.start = null;\n this.current = null;\n this.command = null;\n this.commands = this.commands;\n this.i = -1;\n this.previousCommand = null;\n this.points = [];\n this.angles = [];\n }\n\n reset() {\n this.i = -1;\n this.command = null;\n this.previousCommand = null;\n this.start = new Point(0, 0);\n this.control = new Point(0, 0);\n this.current = new Point(0, 0);\n this.points = [];\n this.angles = [];\n }\n\n isEnd() {\n var {\n i,\n commands\n } = this;\n return i >= commands.length - 1;\n }\n\n next() {\n var command = this.commands[++this.i];\n this.previousCommand = this.command;\n this.command = command;\n return command;\n }\n\n getPoint() {\n var xProp = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'x';\n var yProp = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'y';\n var point = new Point(this.command[xProp], this.command[yProp]);\n return this.makeAbsolute(point);\n }\n\n getAsControlPoint(xProp, yProp) {\n var point = this.getPoint(xProp, yProp);\n this.control = point;\n return point;\n }\n\n getAsCurrentPoint(xProp, yProp) {\n var point = this.getPoint(xProp, yProp);\n this.current = point;\n return point;\n }\n\n getReflectedControlPoint() {\n var previousCommand = this.previousCommand.type;\n\n if (previousCommand !== SVGPathData.CURVE_TO && previousCommand !== SVGPathData.SMOOTH_CURVE_TO && previousCommand !== SVGPathData.QUAD_TO && previousCommand !== SVGPathData.SMOOTH_QUAD_TO) {\n return this.current;\n } // reflect point\n\n\n var {\n current: {\n x: cx,\n y: cy\n },\n control: {\n x: ox,\n y: oy\n }\n } = this;\n var point = new Point(2 * cx - ox, 2 * cy - oy);\n return point;\n }\n\n makeAbsolute(point) {\n if (this.command.relative) {\n var {\n x,\n y\n } = this.current;\n point.x += x;\n point.y += y;\n }\n\n return point;\n }\n\n addMarker(point, from, priorTo) {\n var {\n points,\n angles\n } = this; // if the last angle isn't filled in because we didn't have this point yet ...\n\n if (priorTo && angles.length > 0 && !angles[angles.length - 1]) {\n angles[angles.length - 1] = points[points.length - 1].angleTo(priorTo);\n }\n\n this.addMarkerAngle(point, from ? from.angleTo(point) : null);\n }\n\n addMarkerAngle(point, angle) {\n this.points.push(point);\n this.angles.push(angle);\n }\n\n getMarkerPoints() {\n return this.points;\n }\n\n getMarkerAngles() {\n var {\n angles\n } = this;\n var len = angles.length;\n\n for (var i = 0; i < len; i++) {\n if (!angles[i]) {\n for (var j = i + 1; j < len; j++) {\n if (angles[j]) {\n angles[i] = angles[j];\n break;\n }\n }\n }\n }\n\n return angles;\n }\n\n}\n\nclass RenderedElement extends Element {\n constructor() {\n super(...arguments);\n this.modifiedEmSizeStack = false;\n }\n\n calculateOpacity() {\n var opacity = 1.0; // eslint-disable-next-line @typescript-eslint/no-this-alias, consistent-this\n\n var element = this;\n\n while (element) {\n var opacityStyle = element.getStyle('opacity', false, true); // no ancestors on style call\n\n if (opacityStyle.hasValue(true)) {\n opacity *= opacityStyle.getNumber();\n }\n\n element = element.parent;\n }\n\n return opacity;\n }\n\n setContext(ctx) {\n var fromMeasure = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!fromMeasure) {\n // causes stack overflow when measuring text with gradients\n // fill\n var fillStyleProp = this.getStyle('fill');\n var fillOpacityStyleProp = this.getStyle('fill-opacity');\n var strokeStyleProp = this.getStyle('stroke');\n var strokeOpacityProp = this.getStyle('stroke-opacity');\n\n if (fillStyleProp.isUrlDefinition()) {\n var fillStyle = fillStyleProp.getFillStyleDefinition(this, fillOpacityStyleProp);\n\n if (fillStyle) {\n ctx.fillStyle = fillStyle;\n }\n } else if (fillStyleProp.hasValue()) {\n if (fillStyleProp.getString() === 'currentColor') {\n fillStyleProp.setValue(this.getStyle('color').getColor());\n }\n\n var _fillStyle = fillStyleProp.getColor();\n\n if (_fillStyle !== 'inherit') {\n ctx.fillStyle = _fillStyle === 'none' ? 'rgba(0,0,0,0)' : _fillStyle;\n }\n }\n\n if (fillOpacityStyleProp.hasValue()) {\n var _fillStyle2 = new Property(this.document, 'fill', ctx.fillStyle).addOpacity(fillOpacityStyleProp).getColor();\n\n ctx.fillStyle = _fillStyle2;\n } // stroke\n\n\n if (strokeStyleProp.isUrlDefinition()) {\n var strokeStyle = strokeStyleProp.getFillStyleDefinition(this, strokeOpacityProp);\n\n if (strokeStyle) {\n ctx.strokeStyle = strokeStyle;\n }\n } else if (strokeStyleProp.hasValue()) {\n if (strokeStyleProp.getString() === 'currentColor') {\n strokeStyleProp.setValue(this.getStyle('color').getColor());\n }\n\n var _strokeStyle = strokeStyleProp.getString();\n\n if (_strokeStyle !== 'inherit') {\n ctx.strokeStyle = _strokeStyle === 'none' ? 'rgba(0,0,0,0)' : _strokeStyle;\n }\n }\n\n if (strokeOpacityProp.hasValue()) {\n var _strokeStyle2 = new Property(this.document, 'stroke', ctx.strokeStyle).addOpacity(strokeOpacityProp).getString();\n\n ctx.strokeStyle = _strokeStyle2;\n }\n\n var strokeWidthStyleProp = this.getStyle('stroke-width');\n\n if (strokeWidthStyleProp.hasValue()) {\n var newLineWidth = strokeWidthStyleProp.getPixels();\n ctx.lineWidth = !newLineWidth ? PSEUDO_ZERO // browsers don't respect 0 (or node-canvas? :-)\n : newLineWidth;\n }\n\n var strokeLinecapStyleProp = this.getStyle('stroke-linecap');\n var strokeLinejoinStyleProp = this.getStyle('stroke-linejoin');\n var strokeMiterlimitProp = this.getStyle('stroke-miterlimit'); // NEED TEST\n // const pointOrderStyleProp = this.getStyle('paint-order');\n\n var strokeDasharrayStyleProp = this.getStyle('stroke-dasharray');\n var strokeDashoffsetProp = this.getStyle('stroke-dashoffset');\n\n if (strokeLinecapStyleProp.hasValue()) {\n ctx.lineCap = strokeLinecapStyleProp.getString();\n }\n\n if (strokeLinejoinStyleProp.hasValue()) {\n ctx.lineJoin = strokeLinejoinStyleProp.getString();\n }\n\n if (strokeMiterlimitProp.hasValue()) {\n ctx.miterLimit = strokeMiterlimitProp.getNumber();\n } // NEED TEST\n // if (pointOrderStyleProp.hasValue()) {\n // \t// ?\n // \tctx.paintOrder = pointOrderStyleProp.getValue();\n // }\n\n\n if (strokeDasharrayStyleProp.hasValue() && strokeDasharrayStyleProp.getString() !== 'none') {\n var gaps = toNumbers(strokeDasharrayStyleProp.getString());\n\n if (typeof ctx.setLineDash !== 'undefined') {\n ctx.setLineDash(gaps);\n } else // @ts-expect-error Handle browser prefix.\n if (typeof ctx.webkitLineDash !== 'undefined') {\n // @ts-expect-error Handle browser prefix.\n ctx.webkitLineDash = gaps;\n } else // @ts-expect-error Handle browser prefix.\n if (typeof ctx.mozDash !== 'undefined' && !(gaps.length === 1 && gaps[0] === 0)) {\n // @ts-expect-error Handle browser prefix.\n ctx.mozDash = gaps;\n }\n\n var offset = strokeDashoffsetProp.getPixels();\n\n if (typeof ctx.lineDashOffset !== 'undefined') {\n ctx.lineDashOffset = offset;\n } else // @ts-expect-error Handle browser prefix.\n if (typeof ctx.webkitLineDashOffset !== 'undefined') {\n // @ts-expect-error Handle browser prefix.\n ctx.webkitLineDashOffset = offset;\n } else // @ts-expect-error Handle browser prefix.\n if (typeof ctx.mozDashOffset !== 'undefined') {\n // @ts-expect-error Handle browser prefix.\n ctx.mozDashOffset = offset;\n }\n }\n } // font\n\n\n this.modifiedEmSizeStack = false;\n\n if (typeof ctx.font !== 'undefined') {\n var fontStyleProp = this.getStyle('font');\n var fontStyleStyleProp = this.getStyle('font-style');\n var fontVariantStyleProp = this.getStyle('font-variant');\n var fontWeightStyleProp = this.getStyle('font-weight');\n var fontSizeStyleProp = this.getStyle('font-size');\n var fontFamilyStyleProp = this.getStyle('font-family');\n var font = new Font(fontStyleStyleProp.getString(), fontVariantStyleProp.getString(), fontWeightStyleProp.getString(), fontSizeStyleProp.hasValue() ? \"\".concat(fontSizeStyleProp.getPixels(true), \"px\") : '', fontFamilyStyleProp.getString(), Font.parse(fontStyleProp.getString(), ctx.font));\n fontStyleStyleProp.setValue(font.fontStyle);\n fontVariantStyleProp.setValue(font.fontVariant);\n fontWeightStyleProp.setValue(font.fontWeight);\n fontSizeStyleProp.setValue(font.fontSize);\n fontFamilyStyleProp.setValue(font.fontFamily);\n ctx.font = font.toString();\n\n if (fontSizeStyleProp.isPixels()) {\n this.document.emSize = fontSizeStyleProp.getPixels();\n this.modifiedEmSizeStack = true;\n }\n }\n\n if (!fromMeasure) {\n // effects\n this.applyEffects(ctx); // opacity\n\n ctx.globalAlpha = this.calculateOpacity();\n }\n }\n\n clearContext(ctx) {\n super.clearContext(ctx);\n\n if (this.modifiedEmSizeStack) {\n this.document.popEmSize();\n }\n }\n\n}\n\nclass PathElement extends RenderedElement {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'path';\n this.pathParser = null;\n this.pathParser = new PathParser(this.getAttribute('d').getString());\n }\n\n path(ctx) {\n var {\n pathParser\n } = this;\n var boundingBox = new BoundingBox();\n pathParser.reset();\n\n if (ctx) {\n ctx.beginPath();\n }\n\n while (!pathParser.isEnd()) {\n switch (pathParser.next().type) {\n case PathParser.MOVE_TO:\n this.pathM(ctx, boundingBox);\n break;\n\n case PathParser.LINE_TO:\n this.pathL(ctx, boundingBox);\n break;\n\n case PathParser.HORIZ_LINE_TO:\n this.pathH(ctx, boundingBox);\n break;\n\n case PathParser.VERT_LINE_TO:\n this.pathV(ctx, boundingBox);\n break;\n\n case PathParser.CURVE_TO:\n this.pathC(ctx, boundingBox);\n break;\n\n case PathParser.SMOOTH_CURVE_TO:\n this.pathS(ctx, boundingBox);\n break;\n\n case PathParser.QUAD_TO:\n this.pathQ(ctx, boundingBox);\n break;\n\n case PathParser.SMOOTH_QUAD_TO:\n this.pathT(ctx, boundingBox);\n break;\n\n case PathParser.ARC:\n this.pathA(ctx, boundingBox);\n break;\n\n case PathParser.CLOSE_PATH:\n this.pathZ(ctx, boundingBox);\n break;\n }\n }\n\n return boundingBox;\n }\n\n getBoundingBox(_) {\n return this.path();\n }\n\n getMarkers() {\n var {\n pathParser\n } = this;\n var points = pathParser.getMarkerPoints();\n var angles = pathParser.getMarkerAngles();\n var markers = points.map((point, i) => [point, angles[i]]);\n return markers;\n }\n\n renderChildren(ctx) {\n this.path(ctx);\n this.document.screen.mouse.checkPath(this, ctx);\n var fillRuleStyleProp = this.getStyle('fill-rule');\n\n if (ctx.fillStyle !== '') {\n if (fillRuleStyleProp.getString('inherit') !== 'inherit') {\n ctx.fill(fillRuleStyleProp.getString());\n } else {\n ctx.fill();\n }\n }\n\n if (ctx.strokeStyle !== '') {\n if (this.getAttribute('vector-effect').getString() === 'non-scaling-stroke') {\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.stroke();\n ctx.restore();\n } else {\n ctx.stroke();\n }\n }\n\n var markers = this.getMarkers();\n\n if (markers) {\n var markersLastIndex = markers.length - 1;\n var markerStartStyleProp = this.getStyle('marker-start');\n var markerMidStyleProp = this.getStyle('marker-mid');\n var markerEndStyleProp = this.getStyle('marker-end');\n\n if (markerStartStyleProp.isUrlDefinition()) {\n var marker = markerStartStyleProp.getDefinition();\n var [point, angle] = markers[0];\n marker.render(ctx, point, angle);\n }\n\n if (markerMidStyleProp.isUrlDefinition()) {\n var _marker = markerMidStyleProp.getDefinition();\n\n for (var i = 1; i < markersLastIndex; i++) {\n var [_point, _angle] = markers[i];\n\n _marker.render(ctx, _point, _angle);\n }\n }\n\n if (markerEndStyleProp.isUrlDefinition()) {\n var _marker2 = markerEndStyleProp.getDefinition();\n\n var [_point2, _angle2] = markers[markersLastIndex];\n\n _marker2.render(ctx, _point2, _angle2);\n }\n }\n }\n\n static pathM(pathParser) {\n var point = pathParser.getAsCurrentPoint();\n pathParser.start = pathParser.current;\n return {\n point\n };\n }\n\n pathM(ctx, boundingBox) {\n var {\n pathParser\n } = this;\n var {\n point\n } = PathElement.pathM(pathParser);\n var {\n x,\n y\n } = point;\n pathParser.addMarker(point);\n boundingBox.addPoint(x, y);\n\n if (ctx) {\n ctx.moveTo(x, y);\n }\n }\n\n static pathL(pathParser) {\n var {\n current\n } = pathParser;\n var point = pathParser.getAsCurrentPoint();\n return {\n current,\n point\n };\n }\n\n pathL(ctx, boundingBox) {\n var {\n pathParser\n } = this;\n var {\n current,\n point\n } = PathElement.pathL(pathParser);\n var {\n x,\n y\n } = point;\n pathParser.addMarker(point, current);\n boundingBox.addPoint(x, y);\n\n if (ctx) {\n ctx.lineTo(x, y);\n }\n }\n\n static pathH(pathParser) {\n var {\n current,\n command\n } = pathParser;\n var point = new Point((command.relative ? current.x : 0) + command.x, current.y);\n pathParser.current = point;\n return {\n current,\n point\n };\n }\n\n pathH(ctx, boundingBox) {\n var {\n pathParser\n } = this;\n var {\n current,\n point\n } = PathElement.pathH(pathParser);\n var {\n x,\n y\n } = point;\n pathParser.addMarker(point, current);\n boundingBox.addPoint(x, y);\n\n if (ctx) {\n ctx.lineTo(x, y);\n }\n }\n\n static pathV(pathParser) {\n var {\n current,\n command\n } = pathParser;\n var point = new Point(current.x, (command.relative ? current.y : 0) + command.y);\n pathParser.current = point;\n return {\n current,\n point\n };\n }\n\n pathV(ctx, boundingBox) {\n var {\n pathParser\n } = this;\n var {\n current,\n point\n } = PathElement.pathV(pathParser);\n var {\n x,\n y\n } = point;\n pathParser.addMarker(point, current);\n boundingBox.addPoint(x, y);\n\n if (ctx) {\n ctx.lineTo(x, y);\n }\n }\n\n static pathC(pathParser) {\n var {\n current\n } = pathParser;\n var point = pathParser.getPoint('x1', 'y1');\n var controlPoint = pathParser.getAsControlPoint('x2', 'y2');\n var currentPoint = pathParser.getAsCurrentPoint();\n return {\n current,\n point,\n controlPoint,\n currentPoint\n };\n }\n\n pathC(ctx, boundingBox) {\n var {\n pathParser\n } = this;\n var {\n current,\n point,\n controlPoint,\n currentPoint\n } = PathElement.pathC(pathParser);\n pathParser.addMarker(currentPoint, controlPoint, point);\n boundingBox.addBezierCurve(current.x, current.y, point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n\n if (ctx) {\n ctx.bezierCurveTo(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n }\n }\n\n static pathS(pathParser) {\n var {\n current\n } = pathParser;\n var point = pathParser.getReflectedControlPoint();\n var controlPoint = pathParser.getAsControlPoint('x2', 'y2');\n var currentPoint = pathParser.getAsCurrentPoint();\n return {\n current,\n point,\n controlPoint,\n currentPoint\n };\n }\n\n pathS(ctx, boundingBox) {\n var {\n pathParser\n } = this;\n var {\n current,\n point,\n controlPoint,\n currentPoint\n } = PathElement.pathS(pathParser);\n pathParser.addMarker(currentPoint, controlPoint, point);\n boundingBox.addBezierCurve(current.x, current.y, point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n\n if (ctx) {\n ctx.bezierCurveTo(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n }\n }\n\n static pathQ(pathParser) {\n var {\n current\n } = pathParser;\n var controlPoint = pathParser.getAsControlPoint('x1', 'y1');\n var currentPoint = pathParser.getAsCurrentPoint();\n return {\n current,\n controlPoint,\n currentPoint\n };\n }\n\n pathQ(ctx, boundingBox) {\n var {\n pathParser\n } = this;\n var {\n current,\n controlPoint,\n currentPoint\n } = PathElement.pathQ(pathParser);\n pathParser.addMarker(currentPoint, controlPoint, controlPoint);\n boundingBox.addQuadraticCurve(current.x, current.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n\n if (ctx) {\n ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n }\n }\n\n static pathT(pathParser) {\n var {\n current\n } = pathParser;\n var controlPoint = pathParser.getReflectedControlPoint();\n pathParser.control = controlPoint;\n var currentPoint = pathParser.getAsCurrentPoint();\n return {\n current,\n controlPoint,\n currentPoint\n };\n }\n\n pathT(ctx, boundingBox) {\n var {\n pathParser\n } = this;\n var {\n current,\n controlPoint,\n currentPoint\n } = PathElement.pathT(pathParser);\n pathParser.addMarker(currentPoint, controlPoint, controlPoint);\n boundingBox.addQuadraticCurve(current.x, current.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n\n if (ctx) {\n ctx.quadraticCurveTo(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n }\n }\n\n static pathA(pathParser) {\n var {\n current,\n command\n } = pathParser;\n var {\n rX,\n rY,\n xRot,\n lArcFlag,\n sweepFlag\n } = command;\n var xAxisRotation = xRot * (Math.PI / 180.0);\n var currentPoint = pathParser.getAsCurrentPoint(); // Conversion from endpoint to center parameterization\n // http://www.w3.org/TR/SVG11/implnote.html#ArcImplementationNotes\n // x1', y1'\n\n var currp = new Point(Math.cos(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.sin(xAxisRotation) * (current.y - currentPoint.y) / 2.0, -Math.sin(xAxisRotation) * (current.x - currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * (current.y - currentPoint.y) / 2.0); // adjust radii\n\n var l = Math.pow(currp.x, 2) / Math.pow(rX, 2) + Math.pow(currp.y, 2) / Math.pow(rY, 2);\n\n if (l > 1) {\n rX *= Math.sqrt(l);\n rY *= Math.sqrt(l);\n } // cx', cy'\n\n\n var s = (lArcFlag === sweepFlag ? -1 : 1) * Math.sqrt((Math.pow(rX, 2) * Math.pow(rY, 2) - Math.pow(rX, 2) * Math.pow(currp.y, 2) - Math.pow(rY, 2) * Math.pow(currp.x, 2)) / (Math.pow(rX, 2) * Math.pow(currp.y, 2) + Math.pow(rY, 2) * Math.pow(currp.x, 2)));\n\n if (isNaN(s)) {\n s = 0;\n }\n\n var cpp = new Point(s * rX * currp.y / rY, s * -rY * currp.x / rX); // cx, cy\n\n var centp = new Point((current.x + currentPoint.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, (current.y + currentPoint.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y); // initial angle\n\n var a1 = vectorsAngle([1, 0], [(currp.x - cpp.x) / rX, (currp.y - cpp.y) / rY]); // θ1\n // angle delta\n\n var u = [(currp.x - cpp.x) / rX, (currp.y - cpp.y) / rY];\n var v = [(-currp.x - cpp.x) / rX, (-currp.y - cpp.y) / rY];\n var ad = vectorsAngle(u, v); // Δθ\n\n if (vectorsRatio(u, v) <= -1) {\n ad = Math.PI;\n }\n\n if (vectorsRatio(u, v) >= 1) {\n ad = 0;\n }\n\n return {\n currentPoint,\n rX,\n rY,\n sweepFlag,\n xAxisRotation,\n centp,\n a1,\n ad\n };\n }\n\n pathA(ctx, boundingBox) {\n var {\n pathParser\n } = this;\n var {\n currentPoint,\n rX,\n rY,\n sweepFlag,\n xAxisRotation,\n centp,\n a1,\n ad\n } = PathElement.pathA(pathParser); // for markers\n\n var dir = 1 - sweepFlag ? 1.0 : -1.0;\n var ah = a1 + dir * (ad / 2.0);\n var halfWay = new Point(centp.x + rX * Math.cos(ah), centp.y + rY * Math.sin(ah));\n pathParser.addMarkerAngle(halfWay, ah - dir * Math.PI / 2);\n pathParser.addMarkerAngle(currentPoint, ah - dir * Math.PI);\n boundingBox.addPoint(currentPoint.x, currentPoint.y); // TODO: this is too naive, make it better\n\n if (ctx && !isNaN(a1) && !isNaN(ad)) {\n var r = rX > rY ? rX : rY;\n var sx = rX > rY ? 1 : rX / rY;\n var sy = rX > rY ? rY / rX : 1;\n ctx.translate(centp.x, centp.y);\n ctx.rotate(xAxisRotation);\n ctx.scale(sx, sy);\n ctx.arc(0, 0, r, a1, a1 + ad, Boolean(1 - sweepFlag));\n ctx.scale(1 / sx, 1 / sy);\n ctx.rotate(-xAxisRotation);\n ctx.translate(-centp.x, -centp.y);\n }\n }\n\n static pathZ(pathParser) {\n pathParser.current = pathParser.start;\n }\n\n pathZ(ctx, boundingBox) {\n PathElement.pathZ(this.pathParser);\n\n if (ctx) {\n // only close path if it is not a straight line\n if (boundingBox.x1 !== boundingBox.x2 && boundingBox.y1 !== boundingBox.y2) {\n ctx.closePath();\n }\n }\n }\n\n}\n\nclass GlyphElement extends PathElement {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'glyph';\n this.horizAdvX = this.getAttribute('horiz-adv-x').getNumber();\n this.unicode = this.getAttribute('unicode').getString();\n this.arabicForm = this.getAttribute('arabic-form').getString();\n }\n\n}\n\nclass TextElement extends RenderedElement {\n constructor(document, node, captureTextNodes) {\n super(document, node, new.target === TextElement ? true : captureTextNodes);\n this.type = 'text';\n this.x = 0;\n this.y = 0;\n this.measureCache = -1;\n }\n\n setContext(ctx) {\n var fromMeasure = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n super.setContext(ctx, fromMeasure);\n var textBaseline = this.getStyle('dominant-baseline').getTextBaseline() || this.getStyle('alignment-baseline').getTextBaseline();\n\n if (textBaseline) {\n ctx.textBaseline = textBaseline;\n }\n }\n\n initializeCoordinates() {\n this.x = 0;\n this.y = 0;\n this.leafTexts = [];\n this.textChunkStart = 0;\n this.minX = Number.POSITIVE_INFINITY;\n this.maxX = Number.NEGATIVE_INFINITY;\n }\n\n getBoundingBox(ctx) {\n if (this.type !== 'text') {\n return this.getTElementBoundingBox(ctx);\n } // first, calculate child positions\n\n\n this.initializeCoordinates();\n this.adjustChildCoordinatesRecursive(ctx);\n var boundingBox = null; // then calculate bounding box\n\n this.children.forEach((_, i) => {\n var childBoundingBox = this.getChildBoundingBox(ctx, this, this, i);\n\n if (!boundingBox) {\n boundingBox = childBoundingBox;\n } else {\n boundingBox.addBoundingBox(childBoundingBox);\n }\n });\n return boundingBox;\n }\n\n getFontSize() {\n var {\n document,\n parent\n } = this;\n var inheritFontSize = Font.parse(document.ctx.font).fontSize;\n var fontSize = parent.getStyle('font-size').getNumber(inheritFontSize);\n return fontSize;\n }\n\n getTElementBoundingBox(ctx) {\n var fontSize = this.getFontSize();\n return new BoundingBox(this.x, this.y - fontSize, this.x + this.measureText(ctx), this.y);\n }\n\n getGlyph(font, text, i) {\n var char = text[i];\n var glyph = null;\n\n if (font.isArabic) {\n var len = text.length;\n var prevChar = text[i - 1];\n var nextChar = text[i + 1];\n var arabicForm = 'isolated';\n\n if ((i === 0 || prevChar === ' ') && i < len - 1 && nextChar !== ' ') {\n arabicForm = 'terminal';\n }\n\n if (i > 0 && prevChar !== ' ' && i < len - 1 && nextChar !== ' ') {\n arabicForm = 'medial';\n }\n\n if (i > 0 && prevChar !== ' ' && (i === len - 1 || nextChar === ' ')) {\n arabicForm = 'initial';\n }\n\n if (typeof font.glyphs[char] !== 'undefined') {\n // NEED TEST\n var maybeGlyph = font.glyphs[char];\n glyph = maybeGlyph instanceof GlyphElement ? maybeGlyph : maybeGlyph[arabicForm];\n }\n } else {\n glyph = font.glyphs[char];\n }\n\n if (!glyph) {\n glyph = font.missingGlyph;\n }\n\n return glyph;\n }\n\n getText() {\n return '';\n }\n\n getTextFromNode(node) {\n var textNode = node || this.node;\n var childNodes = Array.from(textNode.parentNode.childNodes);\n var index = childNodes.indexOf(textNode);\n var lastIndex = childNodes.length - 1;\n var text = compressSpaces( // textNode.value\n // || textNode.text\n textNode.textContent || '');\n\n if (index === 0) {\n text = trimLeft(text);\n }\n\n if (index === lastIndex) {\n text = trimRight(text);\n }\n\n return text;\n }\n\n renderChildren(ctx) {\n if (this.type !== 'text') {\n this.renderTElementChildren(ctx);\n return;\n } // first, calculate child positions\n\n\n this.initializeCoordinates();\n this.adjustChildCoordinatesRecursive(ctx); // then render\n\n this.children.forEach((_, i) => {\n this.renderChild(ctx, this, this, i);\n });\n var {\n mouse\n } = this.document.screen; // Do not calc bounding box if mouse is not working.\n\n if (mouse.isWorking()) {\n mouse.checkBoundingBox(this, this.getBoundingBox(ctx));\n }\n }\n\n renderTElementChildren(ctx) {\n var {\n document,\n parent\n } = this;\n var renderText = this.getText();\n var customFont = parent.getStyle('font-family').getDefinition();\n\n if (customFont) {\n var {\n unitsPerEm\n } = customFont.fontFace;\n var ctxFont = Font.parse(document.ctx.font);\n var fontSize = parent.getStyle('font-size').getNumber(ctxFont.fontSize);\n var fontStyle = parent.getStyle('font-style').getString(ctxFont.fontStyle);\n var scale = fontSize / unitsPerEm;\n var text = customFont.isRTL ? renderText.split('').reverse().join('') : renderText;\n var dx = toNumbers(parent.getAttribute('dx').getString());\n var len = text.length;\n\n for (var i = 0; i < len; i++) {\n var glyph = this.getGlyph(customFont, text, i);\n ctx.translate(this.x, this.y);\n ctx.scale(scale, -scale);\n var lw = ctx.lineWidth;\n ctx.lineWidth = ctx.lineWidth * unitsPerEm / fontSize;\n\n if (fontStyle === 'italic') {\n ctx.transform(1, 0, .4, 1, 0, 0);\n }\n\n glyph.render(ctx);\n\n if (fontStyle === 'italic') {\n ctx.transform(1, 0, -.4, 1, 0, 0);\n }\n\n ctx.lineWidth = lw;\n ctx.scale(1 / scale, -1 / scale);\n ctx.translate(-this.x, -this.y);\n this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / unitsPerEm;\n\n if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) {\n this.x += dx[i];\n }\n }\n\n return;\n }\n\n var {\n x,\n y\n } = this; // NEED TEST\n // if (ctx.paintOrder === 'stroke') {\n // \tif (ctx.strokeStyle) {\n // \t\tctx.strokeText(renderText, x, y);\n // \t}\n // \tif (ctx.fillStyle) {\n // \t\tctx.fillText(renderText, x, y);\n // \t}\n // } else {\n\n if (ctx.fillStyle) {\n ctx.fillText(renderText, x, y);\n }\n\n if (ctx.strokeStyle) {\n ctx.strokeText(renderText, x, y);\n } // }\n\n }\n\n applyAnchoring() {\n if (this.textChunkStart >= this.leafTexts.length) {\n return;\n } // This is basically the \"Apply anchoring\" part of https://www.w3.org/TR/SVG2/text.html#TextLayoutAlgorithm.\n // The difference is that we apply the anchoring as soon as a chunk is finished. This saves some extra looping.\n // Vertical text is not supported.\n\n\n var firstElement = this.leafTexts[this.textChunkStart];\n var textAnchor = firstElement.getStyle('text-anchor').getString('start');\n var isRTL = false; // we treat RTL like LTR\n\n var shift = 0;\n\n if (textAnchor === 'start' && !isRTL || textAnchor === 'end' && isRTL) {\n shift = firstElement.x - this.minX;\n } else if (textAnchor === 'end' && !isRTL || textAnchor === 'start' && isRTL) {\n shift = firstElement.x - this.maxX;\n } else {\n shift = firstElement.x - (this.minX + this.maxX) / 2;\n }\n\n for (var i = this.textChunkStart; i < this.leafTexts.length; i++) {\n this.leafTexts[i].x += shift;\n } // start new chunk\n\n\n this.minX = Number.POSITIVE_INFINITY;\n this.maxX = Number.NEGATIVE_INFINITY;\n this.textChunkStart = this.leafTexts.length;\n }\n\n adjustChildCoordinatesRecursive(ctx) {\n this.children.forEach((_, i) => {\n this.adjustChildCoordinatesRecursiveCore(ctx, this, this, i);\n });\n this.applyAnchoring();\n }\n\n adjustChildCoordinatesRecursiveCore(ctx, textParent, parent, i) {\n var child = parent.children[i];\n\n if (child.children.length > 0) {\n child.children.forEach((_, i) => {\n textParent.adjustChildCoordinatesRecursiveCore(ctx, textParent, child, i);\n });\n } else {\n // only leafs are relevant\n this.adjustChildCoordinates(ctx, textParent, parent, i);\n }\n }\n\n adjustChildCoordinates(ctx, textParent, parent, i) {\n var child = parent.children[i];\n\n if (typeof child.measureText !== 'function') {\n return child;\n }\n\n ctx.save();\n child.setContext(ctx, true);\n var xAttr = child.getAttribute('x');\n var yAttr = child.getAttribute('y');\n var dxAttr = child.getAttribute('dx');\n var dyAttr = child.getAttribute('dy');\n var customFont = child.getStyle('font-family').getDefinition();\n var isRTL = Boolean(customFont) && customFont.isRTL;\n\n if (i === 0) {\n // First children inherit attributes from parent(s). Positional attributes\n // are only inherited from a parent to it's first child.\n if (!xAttr.hasValue()) {\n xAttr.setValue(child.getInheritedAttribute('x'));\n }\n\n if (!yAttr.hasValue()) {\n yAttr.setValue(child.getInheritedAttribute('y'));\n }\n\n if (!dxAttr.hasValue()) {\n dxAttr.setValue(child.getInheritedAttribute('dx'));\n }\n\n if (!dyAttr.hasValue()) {\n dyAttr.setValue(child.getInheritedAttribute('dy'));\n }\n }\n\n var width = child.measureText(ctx);\n\n if (isRTL) {\n textParent.x -= width;\n }\n\n if (xAttr.hasValue()) {\n // an \"x\" attribute marks the start of a new chunk\n textParent.applyAnchoring();\n child.x = xAttr.getPixels('x');\n\n if (dxAttr.hasValue()) {\n child.x += dxAttr.getPixels('x');\n }\n } else {\n if (dxAttr.hasValue()) {\n textParent.x += dxAttr.getPixels('x');\n }\n\n child.x = textParent.x;\n }\n\n textParent.x = child.x;\n\n if (!isRTL) {\n textParent.x += width;\n }\n\n if (yAttr.hasValue()) {\n child.y = yAttr.getPixels('y');\n\n if (dyAttr.hasValue()) {\n child.y += dyAttr.getPixels('y');\n }\n } else {\n if (dyAttr.hasValue()) {\n textParent.y += dyAttr.getPixels('y');\n }\n\n child.y = textParent.y;\n }\n\n textParent.y = child.y; // update the current chunk and it's bounds\n\n textParent.leafTexts.push(child);\n textParent.minX = Math.min(textParent.minX, child.x, child.x + width);\n textParent.maxX = Math.max(textParent.maxX, child.x, child.x + width);\n child.clearContext(ctx);\n ctx.restore();\n return child;\n }\n\n getChildBoundingBox(ctx, textParent, parent, i) {\n var child = parent.children[i]; // not a text node?\n\n if (typeof child.getBoundingBox !== 'function') {\n return null;\n }\n\n var boundingBox = child.getBoundingBox(ctx);\n\n if (!boundingBox) {\n return null;\n }\n\n child.children.forEach((_, i) => {\n var childBoundingBox = textParent.getChildBoundingBox(ctx, textParent, child, i);\n boundingBox.addBoundingBox(childBoundingBox);\n });\n return boundingBox;\n }\n\n renderChild(ctx, textParent, parent, i) {\n var child = parent.children[i];\n child.render(ctx);\n child.children.forEach((_, i) => {\n textParent.renderChild(ctx, textParent, child, i);\n });\n }\n\n measureText(ctx) {\n var {\n measureCache\n } = this;\n\n if (~measureCache) {\n return measureCache;\n }\n\n var renderText = this.getText();\n var measure = this.measureTargetText(ctx, renderText);\n this.measureCache = measure;\n return measure;\n }\n\n measureTargetText(ctx, targetText) {\n if (!targetText.length) {\n return 0;\n }\n\n var {\n parent\n } = this;\n var customFont = parent.getStyle('font-family').getDefinition();\n\n if (customFont) {\n var fontSize = this.getFontSize();\n var text = customFont.isRTL ? targetText.split('').reverse().join('') : targetText;\n var dx = toNumbers(parent.getAttribute('dx').getString());\n var len = text.length;\n var _measure = 0;\n\n for (var i = 0; i < len; i++) {\n var glyph = this.getGlyph(customFont, text, i);\n _measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm;\n\n if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) {\n _measure += dx[i];\n }\n }\n\n return _measure;\n }\n\n if (!ctx.measureText) {\n return targetText.length * 10;\n }\n\n ctx.save();\n this.setContext(ctx, true);\n var {\n width: measure\n } = ctx.measureText(targetText);\n this.clearContext(ctx);\n ctx.restore();\n return measure;\n }\n /**\r\n * Inherits positional attributes from {@link TextElement} parent(s). Attributes\r\n * are only inherited from a parent to its first child.\r\n * @param name - The attribute name.\r\n * @returns The attribute value or null.\r\n */\n\n\n getInheritedAttribute(name) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias,consistent-this\n var current = this;\n\n while (current instanceof TextElement && current.isFirstChild()) {\n var parentAttr = current.parent.getAttribute(name);\n\n if (parentAttr.hasValue(true)) {\n return parentAttr.getValue('0');\n }\n\n current = current.parent;\n }\n\n return null;\n }\n\n}\n\nclass TSpanElement extends TextElement {\n constructor(document, node, captureTextNodes) {\n super(document, node, new.target === TSpanElement ? true : captureTextNodes);\n this.type = 'tspan'; // if this node has children, then they own the text\n\n this.text = this.children.length > 0 ? '' : this.getTextFromNode();\n }\n\n getText() {\n return this.text;\n }\n\n}\n\nclass TextNode extends TSpanElement {\n constructor() {\n super(...arguments);\n this.type = 'textNode';\n }\n\n}\n\nclass SVGElement extends RenderedElement {\n constructor() {\n super(...arguments);\n this.type = 'svg';\n this.root = false;\n }\n\n setContext(ctx) {\n var _this$node$parentNode;\n\n var {\n document\n } = this;\n var {\n screen,\n window\n } = document;\n var canvas = ctx.canvas;\n screen.setDefaults(ctx);\n\n if (canvas.style && typeof ctx.font !== 'undefined' && window && typeof window.getComputedStyle !== 'undefined') {\n ctx.font = window.getComputedStyle(canvas).getPropertyValue('font');\n var fontSizeProp = new Property(document, 'fontSize', Font.parse(ctx.font).fontSize);\n\n if (fontSizeProp.hasValue()) {\n document.rootEmSize = fontSizeProp.getPixels('y');\n document.emSize = document.rootEmSize;\n }\n } // create new view port\n\n\n if (!this.getAttribute('x').hasValue()) {\n this.getAttribute('x', true).setValue(0);\n }\n\n if (!this.getAttribute('y').hasValue()) {\n this.getAttribute('y', true).setValue(0);\n }\n\n var {\n width,\n height\n } = screen.viewPort;\n\n if (!this.getStyle('width').hasValue()) {\n this.getStyle('width', true).setValue('100%');\n }\n\n if (!this.getStyle('height').hasValue()) {\n this.getStyle('height', true).setValue('100%');\n }\n\n if (!this.getStyle('color').hasValue()) {\n this.getStyle('color', true).setValue('black');\n }\n\n var refXAttr = this.getAttribute('refX');\n var refYAttr = this.getAttribute('refY');\n var viewBoxAttr = this.getAttribute('viewBox');\n var viewBox = viewBoxAttr.hasValue() ? toNumbers(viewBoxAttr.getString()) : null;\n var clip = !this.root && this.getStyle('overflow').getValue('hidden') !== 'visible';\n var minX = 0;\n var minY = 0;\n var clipX = 0;\n var clipY = 0;\n\n if (viewBox) {\n minX = viewBox[0];\n minY = viewBox[1];\n }\n\n if (!this.root) {\n width = this.getStyle('width').getPixels('x');\n height = this.getStyle('height').getPixels('y');\n\n if (this.type === 'marker') {\n clipX = minX;\n clipY = minY;\n minX = 0;\n minY = 0;\n }\n }\n\n screen.viewPort.setCurrent(width, height); // Default value of transform-origin is center only for root SVG elements\n // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/transform-origin\n\n if (this.node // is not temporary SVGElement\n && (!this.parent || ((_this$node$parentNode = this.node.parentNode) === null || _this$node$parentNode === void 0 ? void 0 : _this$node$parentNode.nodeName) === 'foreignObject') && this.getStyle('transform', false, true).hasValue() && !this.getStyle('transform-origin', false, true).hasValue()) {\n this.getStyle('transform-origin', true, true).setValue('50% 50%');\n }\n\n super.setContext(ctx);\n ctx.translate(this.getAttribute('x').getPixels('x'), this.getAttribute('y').getPixels('y'));\n\n if (viewBox) {\n width = viewBox[2];\n height = viewBox[3];\n }\n\n document.setViewBox({\n ctx,\n aspectRatio: this.getAttribute('preserveAspectRatio').getString(),\n width: screen.viewPort.width,\n desiredWidth: width,\n height: screen.viewPort.height,\n desiredHeight: height,\n minX,\n minY,\n refX: refXAttr.getValue(),\n refY: refYAttr.getValue(),\n clip,\n clipX,\n clipY\n });\n\n if (viewBox) {\n screen.viewPort.removeCurrent();\n screen.viewPort.setCurrent(width, height);\n }\n }\n\n clearContext(ctx) {\n super.clearContext(ctx);\n this.document.screen.viewPort.removeCurrent();\n }\n /**\r\n * Resize SVG to fit in given size.\r\n * @param width\r\n * @param height\r\n * @param preserveAspectRatio\r\n */\n\n\n resize(width) {\n var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : width;\n var preserveAspectRatio = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var widthAttr = this.getAttribute('width', true);\n var heightAttr = this.getAttribute('height', true);\n var viewBoxAttr = this.getAttribute('viewBox');\n var styleAttr = this.getAttribute('style');\n var originWidth = widthAttr.getNumber(0);\n var originHeight = heightAttr.getNumber(0);\n\n if (preserveAspectRatio) {\n if (typeof preserveAspectRatio === 'string') {\n this.getAttribute('preserveAspectRatio', true).setValue(preserveAspectRatio);\n } else {\n var preserveAspectRatioAttr = this.getAttribute('preserveAspectRatio');\n\n if (preserveAspectRatioAttr.hasValue()) {\n preserveAspectRatioAttr.setValue(preserveAspectRatioAttr.getString().replace(/^\\s*(\\S.*\\S)\\s*$/, '$1'));\n }\n }\n }\n\n widthAttr.setValue(width);\n heightAttr.setValue(height);\n\n if (!viewBoxAttr.hasValue()) {\n viewBoxAttr.setValue(\"0 0 \".concat(originWidth || width, \" \").concat(originHeight || height));\n }\n\n if (styleAttr.hasValue()) {\n var widthStyle = this.getStyle('width');\n var heightStyle = this.getStyle('height');\n\n if (widthStyle.hasValue()) {\n widthStyle.setValue(\"\".concat(width, \"px\"));\n }\n\n if (heightStyle.hasValue()) {\n heightStyle.setValue(\"\".concat(height, \"px\"));\n }\n }\n }\n\n}\n\nclass RectElement extends PathElement {\n constructor() {\n super(...arguments);\n this.type = 'rect';\n }\n\n path(ctx) {\n var x = this.getAttribute('x').getPixels('x');\n var y = this.getAttribute('y').getPixels('y');\n var width = this.getStyle('width', false, true).getPixels('x');\n var height = this.getStyle('height', false, true).getPixels('y');\n var rxAttr = this.getAttribute('rx');\n var ryAttr = this.getAttribute('ry');\n var rx = rxAttr.getPixels('x');\n var ry = ryAttr.getPixels('y');\n\n if (rxAttr.hasValue() && !ryAttr.hasValue()) {\n ry = rx;\n }\n\n if (ryAttr.hasValue() && !rxAttr.hasValue()) {\n rx = ry;\n }\n\n rx = Math.min(rx, width / 2.0);\n ry = Math.min(ry, height / 2.0);\n\n if (ctx) {\n var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\n ctx.beginPath(); // always start the path so we don't fill prior paths\n\n if (height > 0 && width > 0) {\n ctx.moveTo(x + rx, y);\n ctx.lineTo(x + width - rx, y);\n ctx.bezierCurveTo(x + width - rx + KAPPA * rx, y, x + width, y + ry - KAPPA * ry, x + width, y + ry);\n ctx.lineTo(x + width, y + height - ry);\n ctx.bezierCurveTo(x + width, y + height - ry + KAPPA * ry, x + width - rx + KAPPA * rx, y + height, x + width - rx, y + height);\n ctx.lineTo(x + rx, y + height);\n ctx.bezierCurveTo(x + rx - KAPPA * rx, y + height, x, y + height - ry + KAPPA * ry, x, y + height - ry);\n ctx.lineTo(x, y + ry);\n ctx.bezierCurveTo(x, y + ry - KAPPA * ry, x + rx - KAPPA * rx, y, x + rx, y);\n ctx.closePath();\n }\n }\n\n return new BoundingBox(x, y, x + width, y + height);\n }\n\n getMarkers() {\n return null;\n }\n\n}\n\nclass CircleElement extends PathElement {\n constructor() {\n super(...arguments);\n this.type = 'circle';\n }\n\n path(ctx) {\n var cx = this.getAttribute('cx').getPixels('x');\n var cy = this.getAttribute('cy').getPixels('y');\n var r = this.getAttribute('r').getPixels();\n\n if (ctx && r > 0) {\n ctx.beginPath();\n ctx.arc(cx, cy, r, 0, Math.PI * 2, false);\n ctx.closePath();\n }\n\n return new BoundingBox(cx - r, cy - r, cx + r, cy + r);\n }\n\n getMarkers() {\n return null;\n }\n\n}\n\nclass EllipseElement extends PathElement {\n constructor() {\n super(...arguments);\n this.type = 'ellipse';\n }\n\n path(ctx) {\n var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3);\n var rx = this.getAttribute('rx').getPixels('x');\n var ry = this.getAttribute('ry').getPixels('y');\n var cx = this.getAttribute('cx').getPixels('x');\n var cy = this.getAttribute('cy').getPixels('y');\n\n if (ctx && rx > 0 && ry > 0) {\n ctx.beginPath();\n ctx.moveTo(cx + rx, cy);\n ctx.bezierCurveTo(cx + rx, cy + KAPPA * ry, cx + KAPPA * rx, cy + ry, cx, cy + ry);\n ctx.bezierCurveTo(cx - KAPPA * rx, cy + ry, cx - rx, cy + KAPPA * ry, cx - rx, cy);\n ctx.bezierCurveTo(cx - rx, cy - KAPPA * ry, cx - KAPPA * rx, cy - ry, cx, cy - ry);\n ctx.bezierCurveTo(cx + KAPPA * rx, cy - ry, cx + rx, cy - KAPPA * ry, cx + rx, cy);\n ctx.closePath();\n }\n\n return new BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry);\n }\n\n getMarkers() {\n return null;\n }\n\n}\n\nclass LineElement extends PathElement {\n constructor() {\n super(...arguments);\n this.type = 'line';\n }\n\n getPoints() {\n return [new Point(this.getAttribute('x1').getPixels('x'), this.getAttribute('y1').getPixels('y')), new Point(this.getAttribute('x2').getPixels('x'), this.getAttribute('y2').getPixels('y'))];\n }\n\n path(ctx) {\n var [{\n x: x0,\n y: y0\n }, {\n x: x1,\n y: y1\n }] = this.getPoints();\n\n if (ctx) {\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n ctx.lineTo(x1, y1);\n }\n\n return new BoundingBox(x0, y0, x1, y1);\n }\n\n getMarkers() {\n var [p0, p1] = this.getPoints();\n var a = p0.angleTo(p1);\n return [[p0, a], [p1, a]];\n }\n\n}\n\nclass PolylineElement extends PathElement {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'polyline';\n this.points = [];\n this.points = Point.parsePath(this.getAttribute('points').getString());\n }\n\n path(ctx) {\n var {\n points\n } = this;\n var [{\n x: x0,\n y: y0\n }] = points;\n var boundingBox = new BoundingBox(x0, y0);\n\n if (ctx) {\n ctx.beginPath();\n ctx.moveTo(x0, y0);\n }\n\n points.forEach(_ref => {\n var {\n x,\n y\n } = _ref;\n boundingBox.addPoint(x, y);\n\n if (ctx) {\n ctx.lineTo(x, y);\n }\n });\n return boundingBox;\n }\n\n getMarkers() {\n var {\n points\n } = this;\n var lastIndex = points.length - 1;\n var markers = [];\n points.forEach((point, i) => {\n if (i === lastIndex) {\n return;\n }\n\n markers.push([point, point.angleTo(points[i + 1])]);\n });\n\n if (markers.length > 0) {\n markers.push([points[points.length - 1], markers[markers.length - 1][1]]);\n }\n\n return markers;\n }\n\n}\n\nclass PolygonElement extends PolylineElement {\n constructor() {\n super(...arguments);\n this.type = 'polygon';\n }\n\n path(ctx) {\n var boundingBox = super.path(ctx);\n var [{\n x,\n y\n }] = this.points;\n\n if (ctx) {\n ctx.lineTo(x, y);\n ctx.closePath();\n }\n\n return boundingBox;\n }\n\n}\n\nclass PatternElement extends Element {\n constructor() {\n super(...arguments);\n this.type = 'pattern';\n }\n\n createPattern(ctx, _, parentOpacityProp) {\n var width = this.getStyle('width').getPixels('x', true);\n var height = this.getStyle('height').getPixels('y', true); // render me using a temporary svg element\n\n var patternSvg = new SVGElement(this.document, null);\n patternSvg.attributes.viewBox = new Property(this.document, 'viewBox', this.getAttribute('viewBox').getValue());\n patternSvg.attributes.width = new Property(this.document, 'width', \"\".concat(width, \"px\"));\n patternSvg.attributes.height = new Property(this.document, 'height', \"\".concat(height, \"px\"));\n patternSvg.attributes.transform = new Property(this.document, 'transform', this.getAttribute('patternTransform').getValue());\n patternSvg.children = this.children;\n var patternCanvas = this.document.createCanvas(width, height);\n var patternCtx = patternCanvas.getContext('2d');\n var xAttr = this.getAttribute('x');\n var yAttr = this.getAttribute('y');\n\n if (xAttr.hasValue() && yAttr.hasValue()) {\n patternCtx.translate(xAttr.getPixels('x', true), yAttr.getPixels('y', true));\n }\n\n if (parentOpacityProp.hasValue()) {\n this.styles['fill-opacity'] = parentOpacityProp;\n } else {\n Reflect.deleteProperty(this.styles, 'fill-opacity');\n } // render 3x3 grid so when we transform there's no white space on edges\n\n\n for (var x = -1; x <= 1; x++) {\n for (var y = -1; y <= 1; y++) {\n patternCtx.save();\n patternSvg.attributes.x = new Property(this.document, 'x', x * patternCanvas.width);\n patternSvg.attributes.y = new Property(this.document, 'y', y * patternCanvas.height);\n patternSvg.render(patternCtx);\n patternCtx.restore();\n }\n }\n\n var pattern = ctx.createPattern(patternCanvas, 'repeat');\n return pattern;\n }\n\n}\n\nclass MarkerElement extends Element {\n constructor() {\n super(...arguments);\n this.type = 'marker';\n }\n\n render(ctx, point, angle) {\n if (!point) {\n return;\n }\n\n var {\n x,\n y\n } = point;\n var orient = this.getAttribute('orient').getString('auto');\n var markerUnits = this.getAttribute('markerUnits').getString('strokeWidth');\n ctx.translate(x, y);\n\n if (orient === 'auto') {\n ctx.rotate(angle);\n }\n\n if (markerUnits === 'strokeWidth') {\n ctx.scale(ctx.lineWidth, ctx.lineWidth);\n }\n\n ctx.save(); // render me using a temporary svg element\n\n var markerSvg = new SVGElement(this.document, null);\n markerSvg.type = this.type;\n markerSvg.attributes.viewBox = new Property(this.document, 'viewBox', this.getAttribute('viewBox').getValue());\n markerSvg.attributes.refX = new Property(this.document, 'refX', this.getAttribute('refX').getValue());\n markerSvg.attributes.refY = new Property(this.document, 'refY', this.getAttribute('refY').getValue());\n markerSvg.attributes.width = new Property(this.document, 'width', this.getAttribute('markerWidth').getValue());\n markerSvg.attributes.height = new Property(this.document, 'height', this.getAttribute('markerHeight').getValue());\n markerSvg.attributes.overflow = new Property(this.document, 'overflow', this.getAttribute('overflow').getValue());\n markerSvg.attributes.fill = new Property(this.document, 'fill', this.getAttribute('fill').getColor('black'));\n markerSvg.attributes.stroke = new Property(this.document, 'stroke', this.getAttribute('stroke').getValue('none'));\n markerSvg.children = this.children;\n markerSvg.render(ctx);\n ctx.restore();\n\n if (markerUnits === 'strokeWidth') {\n ctx.scale(1 / ctx.lineWidth, 1 / ctx.lineWidth);\n }\n\n if (orient === 'auto') {\n ctx.rotate(-angle);\n }\n\n ctx.translate(-x, -y);\n }\n\n}\n\nclass DefsElement extends Element {\n constructor() {\n super(...arguments);\n this.type = 'defs';\n }\n\n render() {// NOOP\n }\n\n}\n\nclass GElement extends RenderedElement {\n constructor() {\n super(...arguments);\n this.type = 'g';\n }\n\n getBoundingBox(ctx) {\n var boundingBox = new BoundingBox();\n this.children.forEach(child => {\n boundingBox.addBoundingBox(child.getBoundingBox(ctx));\n });\n return boundingBox;\n }\n\n}\n\nclass GradientElement extends Element {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.attributesToInherit = ['gradientUnits'];\n this.stops = [];\n var {\n stops,\n children\n } = this;\n children.forEach(child => {\n if (child.type === 'stop') {\n stops.push(child);\n }\n });\n }\n\n getGradientUnits() {\n return this.getAttribute('gradientUnits').getString('objectBoundingBox');\n }\n\n createGradient(ctx, element, parentOpacityProp) {\n // eslint-disable-next-line @typescript-eslint/no-this-alias, consistent-this\n var stopsContainer = this;\n\n if (this.getHrefAttribute().hasValue()) {\n stopsContainer = this.getHrefAttribute().getDefinition();\n this.inheritStopContainer(stopsContainer);\n }\n\n var {\n stops\n } = stopsContainer;\n var gradient = this.getGradient(ctx, element);\n\n if (!gradient) {\n return this.addParentOpacity(parentOpacityProp, stops[stops.length - 1].color);\n }\n\n stops.forEach(stop => {\n gradient.addColorStop(stop.offset, this.addParentOpacity(parentOpacityProp, stop.color));\n });\n\n if (this.getAttribute('gradientTransform').hasValue()) {\n // render as transformed pattern on temporary canvas\n var {\n document\n } = this;\n var {\n MAX_VIRTUAL_PIXELS,\n viewPort\n } = document.screen;\n var [rootView] = viewPort.viewPorts;\n var rect = new RectElement(document, null);\n rect.attributes.x = new Property(document, 'x', -MAX_VIRTUAL_PIXELS / 3.0);\n rect.attributes.y = new Property(document, 'y', -MAX_VIRTUAL_PIXELS / 3.0);\n rect.attributes.width = new Property(document, 'width', MAX_VIRTUAL_PIXELS);\n rect.attributes.height = new Property(document, 'height', MAX_VIRTUAL_PIXELS);\n var group = new GElement(document, null);\n group.attributes.transform = new Property(document, 'transform', this.getAttribute('gradientTransform').getValue());\n group.children = [rect];\n var patternSvg = new SVGElement(document, null);\n patternSvg.attributes.x = new Property(document, 'x', 0);\n patternSvg.attributes.y = new Property(document, 'y', 0);\n patternSvg.attributes.width = new Property(document, 'width', rootView.width);\n patternSvg.attributes.height = new Property(document, 'height', rootView.height);\n patternSvg.children = [group];\n var patternCanvas = document.createCanvas(rootView.width, rootView.height);\n var patternCtx = patternCanvas.getContext('2d');\n patternCtx.fillStyle = gradient;\n patternSvg.render(patternCtx);\n return patternCtx.createPattern(patternCanvas, 'no-repeat');\n }\n\n return gradient;\n }\n\n inheritStopContainer(stopsContainer) {\n this.attributesToInherit.forEach(attributeToInherit => {\n if (!this.getAttribute(attributeToInherit).hasValue() && stopsContainer.getAttribute(attributeToInherit).hasValue()) {\n this.getAttribute(attributeToInherit, true).setValue(stopsContainer.getAttribute(attributeToInherit).getValue());\n }\n });\n }\n\n addParentOpacity(parentOpacityProp, color) {\n if (parentOpacityProp.hasValue()) {\n var colorProp = new Property(this.document, 'color', color);\n return colorProp.addOpacity(parentOpacityProp).getColor();\n }\n\n return color;\n }\n\n}\n\nclass LinearGradientElement extends GradientElement {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'linearGradient';\n this.attributesToInherit.push('x1', 'y1', 'x2', 'y2');\n }\n\n getGradient(ctx, element) {\n var isBoundingBoxUnits = this.getGradientUnits() === 'objectBoundingBox';\n var boundingBox = isBoundingBoxUnits ? element.getBoundingBox(ctx) : null;\n\n if (isBoundingBoxUnits && !boundingBox) {\n return null;\n }\n\n if (!this.getAttribute('x1').hasValue() && !this.getAttribute('y1').hasValue() && !this.getAttribute('x2').hasValue() && !this.getAttribute('y2').hasValue()) {\n this.getAttribute('x1', true).setValue(0);\n this.getAttribute('y1', true).setValue(0);\n this.getAttribute('x2', true).setValue(1);\n this.getAttribute('y2', true).setValue(0);\n }\n\n var x1 = isBoundingBoxUnits ? boundingBox.x + boundingBox.width * this.getAttribute('x1').getNumber() : this.getAttribute('x1').getPixels('x');\n var y1 = isBoundingBoxUnits ? boundingBox.y + boundingBox.height * this.getAttribute('y1').getNumber() : this.getAttribute('y1').getPixels('y');\n var x2 = isBoundingBoxUnits ? boundingBox.x + boundingBox.width * this.getAttribute('x2').getNumber() : this.getAttribute('x2').getPixels('x');\n var y2 = isBoundingBoxUnits ? boundingBox.y + boundingBox.height * this.getAttribute('y2').getNumber() : this.getAttribute('y2').getPixels('y');\n\n if (x1 === x2 && y1 === y2) {\n return null;\n }\n\n return ctx.createLinearGradient(x1, y1, x2, y2);\n }\n\n}\n\nclass RadialGradientElement extends GradientElement {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'radialGradient';\n this.attributesToInherit.push('cx', 'cy', 'r', 'fx', 'fy', 'fr');\n }\n\n getGradient(ctx, element) {\n var isBoundingBoxUnits = this.getGradientUnits() === 'objectBoundingBox';\n var boundingBox = element.getBoundingBox(ctx);\n\n if (isBoundingBoxUnits && !boundingBox) {\n return null;\n }\n\n if (!this.getAttribute('cx').hasValue()) {\n this.getAttribute('cx', true).setValue('50%');\n }\n\n if (!this.getAttribute('cy').hasValue()) {\n this.getAttribute('cy', true).setValue('50%');\n }\n\n if (!this.getAttribute('r').hasValue()) {\n this.getAttribute('r', true).setValue('50%');\n }\n\n var cx = isBoundingBoxUnits ? boundingBox.x + boundingBox.width * this.getAttribute('cx').getNumber() : this.getAttribute('cx').getPixels('x');\n var cy = isBoundingBoxUnits ? boundingBox.y + boundingBox.height * this.getAttribute('cy').getNumber() : this.getAttribute('cy').getPixels('y');\n var fx = cx;\n var fy = cy;\n\n if (this.getAttribute('fx').hasValue()) {\n fx = isBoundingBoxUnits ? boundingBox.x + boundingBox.width * this.getAttribute('fx').getNumber() : this.getAttribute('fx').getPixels('x');\n }\n\n if (this.getAttribute('fy').hasValue()) {\n fy = isBoundingBoxUnits ? boundingBox.y + boundingBox.height * this.getAttribute('fy').getNumber() : this.getAttribute('fy').getPixels('y');\n }\n\n var r = isBoundingBoxUnits ? (boundingBox.width + boundingBox.height) / 2.0 * this.getAttribute('r').getNumber() : this.getAttribute('r').getPixels();\n var fr = this.getAttribute('fr').getPixels();\n return ctx.createRadialGradient(fx, fy, fr, cx, cy, r);\n }\n\n}\n\nclass StopElement extends Element {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'stop';\n var offset = Math.max(0, Math.min(1, this.getAttribute('offset').getNumber()));\n var stopOpacity = this.getStyle('stop-opacity');\n var stopColor = this.getStyle('stop-color', true);\n\n if (stopColor.getString() === '') {\n stopColor.setValue('#000');\n }\n\n if (stopOpacity.hasValue()) {\n stopColor = stopColor.addOpacity(stopOpacity);\n }\n\n this.offset = offset;\n this.color = stopColor.getColor();\n }\n\n}\n\nclass AnimateElement extends Element {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'animate';\n this.duration = 0;\n this.initialValue = null;\n this.initialUnits = '';\n this.removed = false;\n this.frozen = false;\n document.screen.animations.push(this);\n this.begin = this.getAttribute('begin').getMilliseconds();\n this.maxDuration = this.begin + this.getAttribute('dur').getMilliseconds();\n this.from = this.getAttribute('from');\n this.to = this.getAttribute('to');\n this.values = new Property(document, 'values', null);\n var valuesAttr = this.getAttribute('values');\n\n if (valuesAttr.hasValue()) {\n this.values.setValue(valuesAttr.getString().split(';'));\n }\n }\n\n getProperty() {\n var attributeType = this.getAttribute('attributeType').getString();\n var attributeName = this.getAttribute('attributeName').getString();\n\n if (attributeType === 'CSS') {\n return this.parent.getStyle(attributeName, true);\n }\n\n return this.parent.getAttribute(attributeName, true);\n }\n\n calcValue() {\n var {\n initialUnits\n } = this;\n var {\n progress,\n from,\n to\n } = this.getProgress(); // tween value linearly\n\n var newValue = from.getNumber() + (to.getNumber() - from.getNumber()) * progress;\n\n if (initialUnits === '%') {\n newValue *= 100.0; // numValue() returns 0-1 whereas properties are 0-100\n }\n\n return \"\".concat(newValue).concat(initialUnits);\n }\n\n update(delta) {\n var {\n parent\n } = this;\n var prop = this.getProperty(); // set initial value\n\n if (!this.initialValue) {\n this.initialValue = prop.getString();\n this.initialUnits = prop.getUnits();\n } // if we're past the end time\n\n\n if (this.duration > this.maxDuration) {\n var fill = this.getAttribute('fill').getString('remove'); // loop for indefinitely repeating animations\n\n if (this.getAttribute('repeatCount').getString() === 'indefinite' || this.getAttribute('repeatDur').getString() === 'indefinite') {\n this.duration = 0;\n } else if (fill === 'freeze' && !this.frozen) {\n this.frozen = true;\n parent.animationFrozen = true;\n parent.animationFrozenValue = prop.getString();\n } else if (fill === 'remove' && !this.removed) {\n this.removed = true;\n prop.setValue(parent.animationFrozen ? parent.animationFrozenValue : this.initialValue);\n return true;\n }\n\n return false;\n }\n\n this.duration += delta; // if we're past the begin time\n\n var updated = false;\n\n if (this.begin < this.duration) {\n var newValue = this.calcValue(); // tween\n\n var typeAttr = this.getAttribute('type');\n\n if (typeAttr.hasValue()) {\n // for transform, etc.\n var type = typeAttr.getString();\n newValue = \"\".concat(type, \"(\").concat(newValue, \")\");\n }\n\n prop.setValue(newValue);\n updated = true;\n }\n\n return updated;\n }\n\n getProgress() {\n var {\n document,\n values\n } = this;\n var result = {\n progress: (this.duration - this.begin) / (this.maxDuration - this.begin)\n };\n\n if (values.hasValue()) {\n var p = result.progress * (values.getValue().length - 1);\n var lb = Math.floor(p);\n var ub = Math.ceil(p);\n result.from = new Property(document, 'from', parseFloat(values.getValue()[lb]));\n result.to = new Property(document, 'to', parseFloat(values.getValue()[ub]));\n result.progress = (p - lb) / (ub - lb);\n } else {\n result.from = this.from;\n result.to = this.to;\n }\n\n return result;\n }\n\n}\n\nclass AnimateColorElement extends AnimateElement {\n constructor() {\n super(...arguments);\n this.type = 'animateColor';\n }\n\n calcValue() {\n var {\n progress,\n from,\n to\n } = this.getProgress();\n var colorFrom = new RGBColor(from.getColor());\n var colorTo = new RGBColor(to.getColor());\n\n if (colorFrom.ok && colorTo.ok) {\n // tween color linearly\n var r = colorFrom.r + (colorTo.r - colorFrom.r) * progress;\n var g = colorFrom.g + (colorTo.g - colorFrom.g) * progress;\n var b = colorFrom.b + (colorTo.b - colorFrom.b) * progress; // ? alpha\n\n return \"rgb(\".concat(Math.floor(r), \", \").concat(Math.floor(g), \", \").concat(Math.floor(b), \")\");\n }\n\n return this.getAttribute('from').getColor();\n }\n\n}\n\nclass AnimateTransformElement extends AnimateElement {\n constructor() {\n super(...arguments);\n this.type = 'animateTransform';\n }\n\n calcValue() {\n var {\n progress,\n from,\n to\n } = this.getProgress(); // tween value linearly\n\n var transformFrom = toNumbers(from.getString());\n var transformTo = toNumbers(to.getString());\n var newValue = transformFrom.map((from, i) => {\n var to = transformTo[i];\n return from + (to - from) * progress;\n }).join(' ');\n return newValue;\n }\n\n}\n\nclass FontElement extends Element {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'font';\n this.glyphs = Object.create(null);\n this.horizAdvX = this.getAttribute('horiz-adv-x').getNumber();\n var {\n definitions\n } = document;\n var {\n children\n } = this;\n\n for (var child of children) {\n switch (child.type) {\n case 'font-face':\n {\n this.fontFace = child;\n var fontFamilyStyle = child.getStyle('font-family');\n\n if (fontFamilyStyle.hasValue()) {\n definitions[fontFamilyStyle.getString()] = this;\n }\n\n break;\n }\n\n case 'missing-glyph':\n this.missingGlyph = child;\n break;\n\n case 'glyph':\n {\n var glyph = child;\n\n if (glyph.arabicForm) {\n this.isRTL = true;\n this.isArabic = true;\n\n if (typeof this.glyphs[glyph.unicode] === 'undefined') {\n this.glyphs[glyph.unicode] = Object.create(null);\n }\n\n this.glyphs[glyph.unicode][glyph.arabicForm] = glyph;\n } else {\n this.glyphs[glyph.unicode] = glyph;\n }\n\n break;\n }\n }\n }\n }\n\n render() {// NO RENDER\n }\n\n}\n\nclass FontFaceElement extends Element {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'font-face';\n this.ascent = this.getAttribute('ascent').getNumber();\n this.descent = this.getAttribute('descent').getNumber();\n this.unitsPerEm = this.getAttribute('units-per-em').getNumber();\n }\n\n}\n\nclass MissingGlyphElement extends PathElement {\n constructor() {\n super(...arguments);\n this.type = 'missing-glyph';\n this.horizAdvX = 0;\n }\n\n}\n\nclass TRefElement extends TextElement {\n constructor() {\n super(...arguments);\n this.type = 'tref';\n }\n\n getText() {\n var element = this.getHrefAttribute().getDefinition();\n\n if (element) {\n var firstChild = element.children[0];\n\n if (firstChild) {\n return firstChild.getText();\n }\n }\n\n return '';\n }\n\n}\n\nclass AElement extends TextElement {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'a';\n var {\n childNodes\n } = node;\n var firstChild = childNodes[0];\n var hasText = childNodes.length > 0 && Array.from(childNodes).every(node => node.nodeType === 3);\n this.hasText = hasText;\n this.text = hasText ? this.getTextFromNode(firstChild) : '';\n }\n\n getText() {\n return this.text;\n }\n\n renderChildren(ctx) {\n if (this.hasText) {\n // render as text element\n super.renderChildren(ctx);\n var {\n document,\n x,\n y\n } = this;\n var {\n mouse\n } = document.screen;\n var fontSize = new Property(document, 'fontSize', Font.parse(document.ctx.font).fontSize); // Do not calc bounding box if mouse is not working.\n\n if (mouse.isWorking()) {\n mouse.checkBoundingBox(this, new BoundingBox(x, y - fontSize.getPixels('y'), x + this.measureText(ctx), y));\n }\n } else if (this.children.length > 0) {\n // render as temporary group\n var g = new GElement(this.document, null);\n g.children = this.children;\n g.parent = this;\n g.render(ctx);\n }\n }\n\n onClick() {\n var {\n window\n } = this.document;\n\n if (window) {\n window.open(this.getHrefAttribute().getString());\n }\n }\n\n onMouseMove() {\n var ctx = this.document.ctx;\n ctx.canvas.style.cursor = 'pointer';\n }\n\n}\n\nfunction ownKeys$2(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$2(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$2(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\nclass TextPathElement extends TextElement {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'textPath';\n this.textWidth = 0;\n this.textHeight = 0;\n this.pathLength = -1;\n this.glyphInfo = null;\n this.letterSpacingCache = [];\n this.measuresCache = new Map([['', 0]]);\n var pathElement = this.getHrefAttribute().getDefinition();\n this.text = this.getTextFromNode();\n this.dataArray = this.parsePathData(pathElement);\n }\n\n getText() {\n return this.text;\n }\n\n path(ctx) {\n var {\n dataArray\n } = this;\n\n if (ctx) {\n ctx.beginPath();\n }\n\n dataArray.forEach(_ref => {\n var {\n type,\n points\n } = _ref;\n\n switch (type) {\n case PathParser.LINE_TO:\n if (ctx) {\n ctx.lineTo(points[0], points[1]);\n }\n\n break;\n\n case PathParser.MOVE_TO:\n if (ctx) {\n ctx.moveTo(points[0], points[1]);\n }\n\n break;\n\n case PathParser.CURVE_TO:\n if (ctx) {\n ctx.bezierCurveTo(points[0], points[1], points[2], points[3], points[4], points[5]);\n }\n\n break;\n\n case PathParser.QUAD_TO:\n if (ctx) {\n ctx.quadraticCurveTo(points[0], points[1], points[2], points[3]);\n }\n\n break;\n\n case PathParser.ARC:\n {\n var [cx, cy, rx, ry, theta, dTheta, psi, fs] = points;\n var r = rx > ry ? rx : ry;\n var scaleX = rx > ry ? 1 : rx / ry;\n var scaleY = rx > ry ? ry / rx : 1;\n\n if (ctx) {\n ctx.translate(cx, cy);\n ctx.rotate(psi);\n ctx.scale(scaleX, scaleY);\n ctx.arc(0, 0, r, theta, theta + dTheta, Boolean(1 - fs));\n ctx.scale(1 / scaleX, 1 / scaleY);\n ctx.rotate(-psi);\n ctx.translate(-cx, -cy);\n }\n\n break;\n }\n\n case PathParser.CLOSE_PATH:\n if (ctx) {\n ctx.closePath();\n }\n\n break;\n }\n });\n }\n\n renderChildren(ctx) {\n this.setTextData(ctx);\n ctx.save();\n var textDecoration = this.parent.getStyle('text-decoration').getString();\n var fontSize = this.getFontSize();\n var {\n glyphInfo\n } = this;\n var fill = ctx.fillStyle;\n\n if (textDecoration === 'underline') {\n ctx.beginPath();\n }\n\n glyphInfo.forEach((glyph, i) => {\n var {\n p0,\n p1,\n rotation,\n text: partialText\n } = glyph;\n ctx.save();\n ctx.translate(p0.x, p0.y);\n ctx.rotate(rotation);\n\n if (ctx.fillStyle) {\n ctx.fillText(partialText, 0, 0);\n }\n\n if (ctx.strokeStyle) {\n ctx.strokeText(partialText, 0, 0);\n }\n\n ctx.restore();\n\n if (textDecoration === 'underline') {\n if (i === 0) {\n ctx.moveTo(p0.x, p0.y + fontSize / 8);\n }\n\n ctx.lineTo(p1.x, p1.y + fontSize / 5);\n } // // To assist with debugging visually, uncomment following\n //\n // ctx.beginPath();\n // if (i % 2)\n // \tctx.strokeStyle = 'red';\n // else\n // \tctx.strokeStyle = 'green';\n // ctx.moveTo(p0.x, p0.y);\n // ctx.lineTo(p1.x, p1.y);\n // ctx.stroke();\n // ctx.closePath();\n\n });\n\n if (textDecoration === 'underline') {\n ctx.lineWidth = fontSize / 20;\n ctx.strokeStyle = fill;\n ctx.stroke();\n ctx.closePath();\n }\n\n ctx.restore();\n }\n\n getLetterSpacingAt() {\n var idx = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n return this.letterSpacingCache[idx] || 0;\n }\n\n findSegmentToFitChar(ctx, anchor, textFullWidth, fullPathWidth, spacesNumber, inputOffset, dy, c, charI) {\n var offset = inputOffset;\n var glyphWidth = this.measureText(ctx, c);\n\n if (c === ' ' && anchor === 'justify' && textFullWidth < fullPathWidth) {\n glyphWidth += (fullPathWidth - textFullWidth) / spacesNumber;\n }\n\n if (charI > -1) {\n offset += this.getLetterSpacingAt(charI);\n }\n\n var splineStep = this.textHeight / 20;\n var p0 = this.getEquidistantPointOnPath(offset, splineStep, 0);\n var p1 = this.getEquidistantPointOnPath(offset + glyphWidth, splineStep, 0);\n var segment = {\n p0,\n p1\n };\n var rotation = p0 && p1 ? Math.atan2(p1.y - p0.y, p1.x - p0.x) : 0;\n\n if (dy) {\n var dyX = Math.cos(Math.PI / 2 + rotation) * dy;\n var dyY = Math.cos(-rotation) * dy;\n segment.p0 = _objectSpread$2(_objectSpread$2({}, p0), {}, {\n x: p0.x + dyX,\n y: p0.y + dyY\n });\n segment.p1 = _objectSpread$2(_objectSpread$2({}, p1), {}, {\n x: p1.x + dyX,\n y: p1.y + dyY\n });\n }\n\n offset += glyphWidth;\n return {\n offset,\n segment,\n rotation\n };\n }\n\n measureText(ctx, text) {\n var {\n measuresCache\n } = this;\n var targetText = text || this.getText();\n\n if (measuresCache.has(targetText)) {\n return measuresCache.get(targetText);\n }\n\n var measure = this.measureTargetText(ctx, targetText);\n measuresCache.set(targetText, measure);\n return measure;\n } // This method supposes what all custom fonts already loaded.\n // If some font will be loaded after this method call, will not be rendered correctly.\n // You need to call this method manually to update glyphs cache.\n\n\n setTextData(ctx) {\n if (this.glyphInfo) {\n return;\n }\n\n var renderText = this.getText();\n var chars = renderText.split('');\n var spacesNumber = renderText.split(' ').length - 1;\n var dx = this.parent.getAttribute('dx').split().map(_ => _.getPixels('x'));\n var dy = this.parent.getAttribute('dy').getPixels('y');\n var anchor = this.parent.getStyle('text-anchor').getString('start');\n var thisSpacing = this.getStyle('letter-spacing');\n var parentSpacing = this.parent.getStyle('letter-spacing');\n var letterSpacing = 0;\n\n if (!thisSpacing.hasValue() || thisSpacing.getValue() === 'inherit') {\n letterSpacing = parentSpacing.getPixels();\n } else if (thisSpacing.hasValue()) {\n if (thisSpacing.getValue() !== 'initial' && thisSpacing.getValue() !== 'unset') {\n letterSpacing = thisSpacing.getPixels();\n }\n } // fill letter-spacing cache\n\n\n var letterSpacingCache = [];\n var textLen = renderText.length;\n this.letterSpacingCache = letterSpacingCache;\n\n for (var i = 0; i < textLen; i++) {\n letterSpacingCache.push(typeof dx[i] !== 'undefined' ? dx[i] : letterSpacing);\n }\n\n var dxSum = letterSpacingCache.reduce((acc, cur, i) => i === 0 ? 0 : acc + cur || 0, 0);\n var textWidth = this.measureText(ctx);\n var textFullWidth = Math.max(textWidth + dxSum, 0);\n this.textWidth = textWidth;\n this.textHeight = this.getFontSize();\n this.glyphInfo = [];\n var fullPathWidth = this.getPathLength();\n var startOffset = this.getStyle('startOffset').getNumber(0) * fullPathWidth;\n var offset = 0;\n\n if (anchor === 'middle' || anchor === 'center') {\n offset = -textFullWidth / 2;\n }\n\n if (anchor === 'end' || anchor === 'right') {\n offset = -textFullWidth;\n }\n\n offset += startOffset;\n chars.forEach((char, i) => {\n // Find such segment what distance between p0 and p1 is approx. width of glyph\n var {\n offset: nextOffset,\n segment,\n rotation\n } = this.findSegmentToFitChar(ctx, anchor, textFullWidth, fullPathWidth, spacesNumber, offset, dy, char, i);\n offset = nextOffset;\n\n if (!segment.p0 || !segment.p1) {\n return;\n } // const width = this.getLineLength(\n // \tsegment.p0.x,\n // \tsegment.p0.y,\n // \tsegment.p1.x,\n // \tsegment.p1.y\n // );\n // Note: Since glyphs are rendered one at a time, any kerning pair data built into the font will not be used.\n // Can foresee having a rough pair table built in that the developer can override as needed.\n // Or use \"dx\" attribute of the node as a naive replacement\n // const kern = 0;\n // placeholder for future implementation\n // const midpoint = this.getPointOnLine(\n // \tkern + width / 2.0,\n // \tsegment.p0.x, segment.p0.y, segment.p1.x, segment.p1.y\n // );\n\n\n this.glyphInfo.push({\n // transposeX: midpoint.x,\n // transposeY: midpoint.y,\n text: chars[i],\n p0: segment.p0,\n p1: segment.p1,\n rotation\n });\n });\n }\n\n parsePathData(path) {\n this.pathLength = -1; // reset path length\n\n if (!path) {\n return [];\n }\n\n var pathCommands = [];\n var {\n pathParser\n } = path;\n pathParser.reset(); // convert l, H, h, V, and v to L\n\n while (!pathParser.isEnd()) {\n var {\n current\n } = pathParser;\n var startX = current ? current.x : 0;\n var startY = current ? current.y : 0;\n var command = pathParser.next();\n var nextCommandType = command.type;\n var points = [];\n\n switch (command.type) {\n case PathParser.MOVE_TO:\n this.pathM(pathParser, points);\n break;\n\n case PathParser.LINE_TO:\n nextCommandType = this.pathL(pathParser, points);\n break;\n\n case PathParser.HORIZ_LINE_TO:\n nextCommandType = this.pathH(pathParser, points);\n break;\n\n case PathParser.VERT_LINE_TO:\n nextCommandType = this.pathV(pathParser, points);\n break;\n\n case PathParser.CURVE_TO:\n this.pathC(pathParser, points);\n break;\n\n case PathParser.SMOOTH_CURVE_TO:\n nextCommandType = this.pathS(pathParser, points);\n break;\n\n case PathParser.QUAD_TO:\n this.pathQ(pathParser, points);\n break;\n\n case PathParser.SMOOTH_QUAD_TO:\n nextCommandType = this.pathT(pathParser, points);\n break;\n\n case PathParser.ARC:\n points = this.pathA(pathParser);\n break;\n\n case PathParser.CLOSE_PATH:\n PathElement.pathZ(pathParser);\n break;\n }\n\n if (command.type !== PathParser.CLOSE_PATH) {\n pathCommands.push({\n type: nextCommandType,\n points,\n start: {\n x: startX,\n y: startY\n },\n pathLength: this.calcLength(startX, startY, nextCommandType, points)\n });\n } else {\n pathCommands.push({\n type: PathParser.CLOSE_PATH,\n points: [],\n pathLength: 0\n });\n }\n }\n\n return pathCommands;\n }\n\n pathM(pathParser, points) {\n var {\n x,\n y\n } = PathElement.pathM(pathParser).point;\n points.push(x, y);\n }\n\n pathL(pathParser, points) {\n var {\n x,\n y\n } = PathElement.pathL(pathParser).point;\n points.push(x, y);\n return PathParser.LINE_TO;\n }\n\n pathH(pathParser, points) {\n var {\n x,\n y\n } = PathElement.pathH(pathParser).point;\n points.push(x, y);\n return PathParser.LINE_TO;\n }\n\n pathV(pathParser, points) {\n var {\n x,\n y\n } = PathElement.pathV(pathParser).point;\n points.push(x, y);\n return PathParser.LINE_TO;\n }\n\n pathC(pathParser, points) {\n var {\n point,\n controlPoint,\n currentPoint\n } = PathElement.pathC(pathParser);\n points.push(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n }\n\n pathS(pathParser, points) {\n var {\n point,\n controlPoint,\n currentPoint\n } = PathElement.pathS(pathParser);\n points.push(point.x, point.y, controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n return PathParser.CURVE_TO;\n }\n\n pathQ(pathParser, points) {\n var {\n controlPoint,\n currentPoint\n } = PathElement.pathQ(pathParser);\n points.push(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n }\n\n pathT(pathParser, points) {\n var {\n controlPoint,\n currentPoint\n } = PathElement.pathT(pathParser);\n points.push(controlPoint.x, controlPoint.y, currentPoint.x, currentPoint.y);\n return PathParser.QUAD_TO;\n }\n\n pathA(pathParser) {\n var {\n rX,\n rY,\n sweepFlag,\n xAxisRotation,\n centp,\n a1,\n ad\n } = PathElement.pathA(pathParser);\n\n if (sweepFlag === 0 && ad > 0) {\n ad -= 2 * Math.PI;\n }\n\n if (sweepFlag === 1 && ad < 0) {\n ad += 2 * Math.PI;\n }\n\n return [centp.x, centp.y, rX, rY, a1, ad, xAxisRotation, sweepFlag];\n }\n\n calcLength(x, y, commandType, points) {\n var len = 0;\n var p1 = null;\n var p2 = null;\n var t = 0;\n\n switch (commandType) {\n case PathParser.LINE_TO:\n return this.getLineLength(x, y, points[0], points[1]);\n\n case PathParser.CURVE_TO:\n // Approximates by breaking curve into 100 line segments\n len = 0.0;\n p1 = this.getPointOnCubicBezier(0, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);\n\n for (t = 0.01; t <= 1; t += 0.01) {\n p2 = this.getPointOnCubicBezier(t, x, y, points[0], points[1], points[2], points[3], points[4], points[5]);\n len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n p1 = p2;\n }\n\n return len;\n\n case PathParser.QUAD_TO:\n // Approximates by breaking curve into 100 line segments\n len = 0.0;\n p1 = this.getPointOnQuadraticBezier(0, x, y, points[0], points[1], points[2], points[3]);\n\n for (t = 0.01; t <= 1; t += 0.01) {\n p2 = this.getPointOnQuadraticBezier(t, x, y, points[0], points[1], points[2], points[3]);\n len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n p1 = p2;\n }\n\n return len;\n\n case PathParser.ARC:\n {\n // Approximates by breaking curve into line segments\n len = 0.0;\n var start = points[4]; // 4 = theta\n\n var dTheta = points[5]; // 5 = dTheta\n\n var end = points[4] + dTheta;\n var inc = Math.PI / 180.0; // 1 degree resolution\n\n if (Math.abs(start - end) < inc) {\n inc = Math.abs(start - end);\n } // Note: for purpose of calculating arc length, not going to worry about rotating X-axis by angle psi\n\n\n p1 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], start, 0);\n\n if (dTheta < 0) {\n // clockwise\n for (t = start - inc; t > end; t -= inc) {\n p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);\n len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n p1 = p2;\n }\n } else {\n // counter-clockwise\n for (t = start + inc; t < end; t += inc) {\n p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], t, 0);\n len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n p1 = p2;\n }\n }\n\n p2 = this.getPointOnEllipticalArc(points[0], points[1], points[2], points[3], end, 0);\n len += this.getLineLength(p1.x, p1.y, p2.x, p2.y);\n return len;\n }\n }\n\n return 0;\n }\n\n getPointOnLine(dist, p1x, p1y, p2x, p2y) {\n var fromX = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : p1x;\n var fromY = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : p1y;\n var m = (p2y - p1y) / (p2x - p1x + PSEUDO_ZERO);\n var run = Math.sqrt(dist * dist / (1 + m * m));\n\n if (p2x < p1x) {\n run *= -1;\n }\n\n var rise = m * run;\n var pt = null;\n\n if (p2x === p1x) {\n // vertical line\n pt = {\n x: fromX,\n y: fromY + rise\n };\n } else if ((fromY - p1y) / (fromX - p1x + PSEUDO_ZERO) === m) {\n pt = {\n x: fromX + run,\n y: fromY + rise\n };\n } else {\n var ix = 0;\n var iy = 0;\n var len = this.getLineLength(p1x, p1y, p2x, p2y);\n\n if (len < PSEUDO_ZERO) {\n return null;\n }\n\n var u = (fromX - p1x) * (p2x - p1x) + (fromY - p1y) * (p2y - p1y);\n u /= len * len;\n ix = p1x + u * (p2x - p1x);\n iy = p1y + u * (p2y - p1y);\n var pRise = this.getLineLength(fromX, fromY, ix, iy);\n var pRun = Math.sqrt(dist * dist - pRise * pRise);\n run = Math.sqrt(pRun * pRun / (1 + m * m));\n\n if (p2x < p1x) {\n run *= -1;\n }\n\n rise = m * run;\n pt = {\n x: ix + run,\n y: iy + rise\n };\n }\n\n return pt;\n }\n\n getPointOnPath(distance) {\n var fullLen = this.getPathLength();\n var cumulativePathLength = 0;\n var p = null;\n\n if (distance < -0.00005 || distance - 0.00005 > fullLen) {\n return null;\n }\n\n var {\n dataArray\n } = this;\n\n for (var command of dataArray) {\n if (command && (command.pathLength < 0.00005 || cumulativePathLength + command.pathLength + 0.00005 < distance)) {\n cumulativePathLength += command.pathLength;\n continue;\n }\n\n var delta = distance - cumulativePathLength;\n var currentT = 0;\n\n switch (command.type) {\n case PathParser.LINE_TO:\n p = this.getPointOnLine(delta, command.start.x, command.start.y, command.points[0], command.points[1], command.start.x, command.start.y);\n break;\n\n case PathParser.ARC:\n {\n var start = command.points[4]; // 4 = theta\n\n var dTheta = command.points[5]; // 5 = dTheta\n\n var end = command.points[4] + dTheta;\n currentT = start + delta / command.pathLength * dTheta;\n\n if (dTheta < 0 && currentT < end || dTheta >= 0 && currentT > end) {\n break;\n }\n\n p = this.getPointOnEllipticalArc(command.points[0], command.points[1], command.points[2], command.points[3], currentT, command.points[6]);\n break;\n }\n\n case PathParser.CURVE_TO:\n currentT = delta / command.pathLength;\n\n if (currentT > 1) {\n currentT = 1;\n }\n\n p = this.getPointOnCubicBezier(currentT, command.start.x, command.start.y, command.points[0], command.points[1], command.points[2], command.points[3], command.points[4], command.points[5]);\n break;\n\n case PathParser.QUAD_TO:\n currentT = delta / command.pathLength;\n\n if (currentT > 1) {\n currentT = 1;\n }\n\n p = this.getPointOnQuadraticBezier(currentT, command.start.x, command.start.y, command.points[0], command.points[1], command.points[2], command.points[3]);\n break;\n }\n\n if (p) {\n return p;\n }\n\n break;\n }\n\n return null;\n }\n\n getLineLength(x1, y1, x2, y2) {\n return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));\n }\n\n getPathLength() {\n if (this.pathLength === -1) {\n this.pathLength = this.dataArray.reduce((length, command) => command.pathLength > 0 ? length + command.pathLength : length, 0);\n }\n\n return this.pathLength;\n }\n\n getPointOnCubicBezier(pct, p1x, p1y, p2x, p2y, p3x, p3y, p4x, p4y) {\n var x = p4x * CB1(pct) + p3x * CB2(pct) + p2x * CB3(pct) + p1x * CB4(pct);\n var y = p4y * CB1(pct) + p3y * CB2(pct) + p2y * CB3(pct) + p1y * CB4(pct);\n return {\n x,\n y\n };\n }\n\n getPointOnQuadraticBezier(pct, p1x, p1y, p2x, p2y, p3x, p3y) {\n var x = p3x * QB1(pct) + p2x * QB2(pct) + p1x * QB3(pct);\n var y = p3y * QB1(pct) + p2y * QB2(pct) + p1y * QB3(pct);\n return {\n x,\n y\n };\n }\n\n getPointOnEllipticalArc(cx, cy, rx, ry, theta, psi) {\n var cosPsi = Math.cos(psi);\n var sinPsi = Math.sin(psi);\n var pt = {\n x: rx * Math.cos(theta),\n y: ry * Math.sin(theta)\n };\n return {\n x: cx + (pt.x * cosPsi - pt.y * sinPsi),\n y: cy + (pt.x * sinPsi + pt.y * cosPsi)\n };\n } // TODO need some optimisations. possibly build cache only for curved segments?\n\n\n buildEquidistantCache(inputStep, inputPrecision) {\n var fullLen = this.getPathLength();\n var precision = inputPrecision || 0.25; // accuracy vs performance\n\n var step = inputStep || fullLen / 100;\n\n if (!this.equidistantCache || this.equidistantCache.step !== step || this.equidistantCache.precision !== precision) {\n // Prepare cache\n this.equidistantCache = {\n step,\n precision,\n points: []\n }; // Calculate points\n\n var s = 0;\n\n for (var l = 0; l <= fullLen; l += precision) {\n var p0 = this.getPointOnPath(l);\n var p1 = this.getPointOnPath(l + precision);\n\n if (!p0 || !p1) {\n continue;\n }\n\n s += this.getLineLength(p0.x, p0.y, p1.x, p1.y);\n\n if (s >= step) {\n this.equidistantCache.points.push({\n x: p0.x,\n y: p0.y,\n distance: l\n });\n s -= step;\n }\n }\n }\n }\n\n getEquidistantPointOnPath(targetDistance, step, precision) {\n this.buildEquidistantCache(step, precision);\n\n if (targetDistance < 0 || targetDistance - this.getPathLength() > 0.00005) {\n return null;\n }\n\n var idx = Math.round(targetDistance / this.getPathLength() * (this.equidistantCache.points.length - 1));\n return this.equidistantCache.points[idx] || null;\n }\n\n}\n\nvar dataUriRegex = /^\\s*data:(([^/,;]+\\/[^/,;]+)(?:;([^,;=]+=[^,;=]+))?)?(?:;(base64))?,(.*)$/i;\nclass ImageElement extends RenderedElement {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'image';\n this.loaded = false;\n var href = this.getHrefAttribute().getString();\n\n if (!href) {\n return;\n }\n\n var isSvg = href.endsWith('.svg') || /^\\s*data:image\\/svg\\+xml/i.test(href);\n document.images.push(this);\n\n if (!isSvg) {\n void this.loadImage(href);\n } else {\n void this.loadSvg(href);\n }\n\n this.isSvg = isSvg;\n }\n\n loadImage(href) {\n var _this = this;\n\n return _asyncToGenerator(function* () {\n try {\n var image = yield _this.document.createImage(href);\n _this.image = image;\n } catch (err) {\n console.error(\"Error while loading image \\\"\".concat(href, \"\\\":\"), err);\n }\n\n _this.loaded = true;\n })();\n }\n\n loadSvg(href) {\n var _this2 = this;\n\n return _asyncToGenerator(function* () {\n var match = dataUriRegex.exec(href);\n\n if (match) {\n var data = match[5];\n\n if (match[4] === 'base64') {\n _this2.image = atob(data);\n } else {\n _this2.image = decodeURIComponent(data);\n }\n } else {\n try {\n var response = yield _this2.document.fetch(href);\n var svg = yield response.text();\n _this2.image = svg;\n } catch (err) {\n console.error(\"Error while loading image \\\"\".concat(href, \"\\\":\"), err);\n }\n }\n\n _this2.loaded = true;\n })();\n }\n\n renderChildren(ctx) {\n var {\n document,\n image,\n loaded\n } = this;\n var x = this.getAttribute('x').getPixels('x');\n var y = this.getAttribute('y').getPixels('y');\n var width = this.getStyle('width').getPixels('x');\n var height = this.getStyle('height').getPixels('y');\n\n if (!loaded || !image || !width || !height) {\n return;\n }\n\n ctx.save();\n ctx.translate(x, y);\n\n if (this.isSvg) {\n var subDocument = document.canvg.forkString(ctx, this.image, {\n ignoreMouse: true,\n ignoreAnimation: true,\n ignoreDimensions: true,\n ignoreClear: true,\n offsetX: 0,\n offsetY: 0,\n scaleWidth: width,\n scaleHeight: height\n });\n subDocument.document.documentElement.parent = this;\n void subDocument.render();\n } else {\n var _image = this.image;\n document.setViewBox({\n ctx,\n aspectRatio: this.getAttribute('preserveAspectRatio').getString(),\n width,\n desiredWidth: _image.width,\n height,\n desiredHeight: _image.height\n });\n\n if (this.loaded) {\n if (typeof _image.complete === 'undefined' || _image.complete) {\n ctx.drawImage(_image, 0, 0);\n }\n }\n }\n\n ctx.restore();\n }\n\n getBoundingBox() {\n var x = this.getAttribute('x').getPixels('x');\n var y = this.getAttribute('y').getPixels('y');\n var width = this.getStyle('width').getPixels('x');\n var height = this.getStyle('height').getPixels('y');\n return new BoundingBox(x, y, x + width, y + height);\n }\n\n}\n\nclass SymbolElement extends RenderedElement {\n constructor() {\n super(...arguments);\n this.type = 'symbol';\n }\n\n render(_) {// NO RENDER\n }\n\n}\n\nclass SVGFontLoader {\n constructor(document) {\n this.document = document;\n this.loaded = false;\n document.fonts.push(this);\n }\n\n load(fontFamily, url) {\n var _this = this;\n\n return _asyncToGenerator(function* () {\n try {\n var {\n document\n } = _this;\n var svgDocument = yield document.canvg.parser.load(url);\n var fonts = svgDocument.getElementsByTagName('font');\n Array.from(fonts).forEach(fontNode => {\n var font = document.createElement(fontNode);\n document.definitions[fontFamily] = font;\n });\n } catch (err) {\n console.error(\"Error while loading font \\\"\".concat(url, \"\\\":\"), err);\n }\n\n _this.loaded = true;\n })();\n }\n\n}\n\nclass StyleElement extends Element {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'style';\n var css = compressSpaces(Array.from(node.childNodes) // NEED TEST\n .map(_ => _.textContent).join('').replace(/(\\/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+\\/)|(^[\\s]*\\/\\/.*)/gm, '') // remove comments\n .replace(/@import.*;/g, '') // remove imports\n );\n var cssDefs = css.split('}');\n cssDefs.forEach(_ => {\n var def = _.trim();\n\n if (!def) {\n return;\n }\n\n var cssParts = def.split('{');\n var cssClasses = cssParts[0].split(',');\n var cssProps = cssParts[1].split(';');\n cssClasses.forEach(_ => {\n var cssClass = _.trim();\n\n if (!cssClass) {\n return;\n }\n\n var props = document.styles[cssClass] || {};\n cssProps.forEach(cssProp => {\n var prop = cssProp.indexOf(':');\n var name = cssProp.substr(0, prop).trim();\n var value = cssProp.substr(prop + 1, cssProp.length - prop).trim();\n\n if (name && value) {\n props[name] = new Property(document, name, value);\n }\n });\n document.styles[cssClass] = props;\n document.stylesSpecificity[cssClass] = getSelectorSpecificity(cssClass);\n\n if (cssClass === '@font-face') {\n // && !nodeEnv\n var fontFamily = props['font-family'].getString().replace(/\"|'/g, '');\n var srcs = props.src.getString().split(',');\n srcs.forEach(src => {\n if (src.indexOf('format(\"svg\")') > 0) {\n var url = parseExternalUrl(src);\n\n if (url) {\n void new SVGFontLoader(document).load(fontFamily, url);\n }\n }\n });\n }\n });\n });\n }\n\n}\nStyleElement.parseExternalUrl = parseExternalUrl;\n\nclass UseElement extends RenderedElement {\n constructor() {\n super(...arguments);\n this.type = 'use';\n }\n\n setContext(ctx) {\n super.setContext(ctx);\n var xAttr = this.getAttribute('x');\n var yAttr = this.getAttribute('y');\n\n if (xAttr.hasValue()) {\n ctx.translate(xAttr.getPixels('x'), 0);\n }\n\n if (yAttr.hasValue()) {\n ctx.translate(0, yAttr.getPixels('y'));\n }\n }\n\n path(ctx) {\n var {\n element\n } = this;\n\n if (element) {\n element.path(ctx);\n }\n }\n\n renderChildren(ctx) {\n var {\n document,\n element\n } = this;\n\n if (element) {\n var tempSvg = element;\n\n if (element.type === 'symbol') {\n // render me using a temporary svg element in symbol cases (http://www.w3.org/TR/SVG/struct.html#UseElement)\n tempSvg = new SVGElement(document, null);\n tempSvg.attributes.viewBox = new Property(document, 'viewBox', element.getAttribute('viewBox').getString());\n tempSvg.attributes.preserveAspectRatio = new Property(document, 'preserveAspectRatio', element.getAttribute('preserveAspectRatio').getString());\n tempSvg.attributes.overflow = new Property(document, 'overflow', element.getAttribute('overflow').getString());\n tempSvg.children = element.children; // element is still the parent of the children\n\n element.styles.opacity = new Property(document, 'opacity', this.calculateOpacity());\n }\n\n if (tempSvg.type === 'svg') {\n var widthStyle = this.getStyle('width', false, true);\n var heightStyle = this.getStyle('height', false, true); // if symbol or svg, inherit width/height from me\n\n if (widthStyle.hasValue()) {\n tempSvg.attributes.width = new Property(document, 'width', widthStyle.getString());\n }\n\n if (heightStyle.hasValue()) {\n tempSvg.attributes.height = new Property(document, 'height', heightStyle.getString());\n }\n }\n\n var oldParent = tempSvg.parent;\n tempSvg.parent = this;\n tempSvg.render(ctx);\n tempSvg.parent = oldParent;\n }\n }\n\n getBoundingBox(ctx) {\n var {\n element\n } = this;\n\n if (element) {\n return element.getBoundingBox(ctx);\n }\n\n return null;\n }\n\n elementTransform() {\n var {\n document,\n element\n } = this;\n return Transform.fromElement(document, element);\n }\n\n get element() {\n if (!this.cachedElement) {\n this.cachedElement = this.getHrefAttribute().getDefinition();\n }\n\n return this.cachedElement;\n }\n\n}\n\nfunction imGet(img, x, y, width, _height, rgba) {\n return img[y * width * 4 + x * 4 + rgba];\n}\n\nfunction imSet(img, x, y, width, _height, rgba, val) {\n img[y * width * 4 + x * 4 + rgba] = val;\n}\n\nfunction m(matrix, i, v) {\n var mi = matrix[i];\n return mi * v;\n}\n\nfunction c(a, m1, m2, m3) {\n return m1 + Math.cos(a) * m2 + Math.sin(a) * m3;\n}\n\nclass FeColorMatrixElement extends Element {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'feColorMatrix';\n var matrix = toNumbers(this.getAttribute('values').getString());\n\n switch (this.getAttribute('type').getString('matrix')) {\n // http://www.w3.org/TR/SVG/filters.html#feColorMatrixElement\n case 'saturate':\n {\n var s = matrix[0];\n /* eslint-disable array-element-newline */\n\n matrix = [0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1];\n /* eslint-enable array-element-newline */\n\n break;\n }\n\n case 'hueRotate':\n {\n var a = matrix[0] * Math.PI / 180.0;\n /* eslint-disable array-element-newline */\n\n matrix = [c(a, 0.213, 0.787, -0.213), c(a, 0.715, -0.715, -0.715), c(a, 0.072, -0.072, 0.928), 0, 0, c(a, 0.213, -0.213, 0.143), c(a, 0.715, 0.285, 0.140), c(a, 0.072, -0.072, -0.283), 0, 0, c(a, 0.213, -0.213, -0.787), c(a, 0.715, -0.715, 0.715), c(a, 0.072, 0.928, 0.072), 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1];\n /* eslint-enable array-element-newline */\n\n break;\n }\n\n case 'luminanceToAlpha':\n /* eslint-disable array-element-newline */\n matrix = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2125, 0.7154, 0.0721, 0, 0, 0, 0, 0, 0, 1];\n /* eslint-enable array-element-newline */\n\n break;\n }\n\n this.matrix = matrix;\n this.includeOpacity = this.getAttribute('includeOpacity').hasValue();\n }\n\n apply(ctx, _x, _y, width, height) {\n // assuming x==0 && y==0 for now\n var {\n includeOpacity,\n matrix\n } = this;\n var srcData = ctx.getImageData(0, 0, width, height);\n\n for (var y = 0; y < height; y++) {\n for (var x = 0; x < width; x++) {\n var r = imGet(srcData.data, x, y, width, height, 0);\n var g = imGet(srcData.data, x, y, width, height, 1);\n var b = imGet(srcData.data, x, y, width, height, 2);\n var a = imGet(srcData.data, x, y, width, height, 3);\n var nr = m(matrix, 0, r) + m(matrix, 1, g) + m(matrix, 2, b) + m(matrix, 3, a) + m(matrix, 4, 1);\n var ng = m(matrix, 5, r) + m(matrix, 6, g) + m(matrix, 7, b) + m(matrix, 8, a) + m(matrix, 9, 1);\n var nb = m(matrix, 10, r) + m(matrix, 11, g) + m(matrix, 12, b) + m(matrix, 13, a) + m(matrix, 14, 1);\n var na = m(matrix, 15, r) + m(matrix, 16, g) + m(matrix, 17, b) + m(matrix, 18, a) + m(matrix, 19, 1);\n\n if (includeOpacity) {\n nr = 0;\n ng = 0;\n nb = 0;\n na *= a / 255;\n }\n\n imSet(srcData.data, x, y, width, height, 0, nr);\n imSet(srcData.data, x, y, width, height, 1, ng);\n imSet(srcData.data, x, y, width, height, 2, nb);\n imSet(srcData.data, x, y, width, height, 3, na);\n }\n }\n\n ctx.clearRect(0, 0, width, height);\n ctx.putImageData(srcData, 0, 0);\n }\n\n}\n\nclass MaskElement extends Element {\n constructor() {\n super(...arguments);\n this.type = 'mask';\n }\n\n apply(ctx, element) {\n var {\n document\n } = this; // render as temp svg\n\n var x = this.getAttribute('x').getPixels('x');\n var y = this.getAttribute('y').getPixels('y');\n var width = this.getStyle('width').getPixels('x');\n var height = this.getStyle('height').getPixels('y');\n\n if (!width && !height) {\n var boundingBox = new BoundingBox();\n this.children.forEach(child => {\n boundingBox.addBoundingBox(child.getBoundingBox(ctx));\n });\n x = Math.floor(boundingBox.x1);\n y = Math.floor(boundingBox.y1);\n width = Math.floor(boundingBox.width);\n height = Math.floor(boundingBox.height);\n }\n\n var ignoredStyles = this.removeStyles(element, MaskElement.ignoreStyles);\n var maskCanvas = document.createCanvas(x + width, y + height);\n var maskCtx = maskCanvas.getContext('2d');\n document.screen.setDefaults(maskCtx);\n this.renderChildren(maskCtx); // convert mask to alpha with a fake node\n // TODO: refactor out apply from feColorMatrix\n\n new FeColorMatrixElement(document, {\n nodeType: 1,\n childNodes: [],\n attributes: [{\n nodeName: 'type',\n value: 'luminanceToAlpha'\n }, {\n nodeName: 'includeOpacity',\n value: 'true'\n }]\n }).apply(maskCtx, 0, 0, x + width, y + height);\n var tmpCanvas = document.createCanvas(x + width, y + height);\n var tmpCtx = tmpCanvas.getContext('2d');\n document.screen.setDefaults(tmpCtx);\n element.render(tmpCtx);\n tmpCtx.globalCompositeOperation = 'destination-in';\n tmpCtx.fillStyle = maskCtx.createPattern(maskCanvas, 'no-repeat');\n tmpCtx.fillRect(0, 0, x + width, y + height);\n ctx.fillStyle = tmpCtx.createPattern(tmpCanvas, 'no-repeat');\n ctx.fillRect(0, 0, x + width, y + height); // reassign mask\n\n this.restoreStyles(element, ignoredStyles);\n }\n\n render(_) {// NO RENDER\n }\n\n}\nMaskElement.ignoreStyles = ['mask', 'transform', 'clip-path'];\n\nvar noop = () => {// NOOP\n};\n\nclass ClipPathElement extends Element {\n constructor() {\n super(...arguments);\n this.type = 'clipPath';\n }\n\n apply(ctx) {\n var {\n document\n } = this;\n var contextProto = Reflect.getPrototypeOf(ctx);\n var {\n beginPath,\n closePath\n } = ctx;\n\n if (contextProto) {\n contextProto.beginPath = noop;\n contextProto.closePath = noop;\n }\n\n Reflect.apply(beginPath, ctx, []);\n this.children.forEach(child => {\n if (typeof child.path === 'undefined') {\n return;\n }\n\n var transform = typeof child.elementTransform !== 'undefined' ? child.elementTransform() : null; // handle \n\n if (!transform) {\n transform = Transform.fromElement(document, child);\n }\n\n if (transform) {\n transform.apply(ctx);\n }\n\n child.path(ctx);\n\n if (contextProto) {\n contextProto.closePath = closePath;\n }\n\n if (transform) {\n transform.unapply(ctx);\n }\n });\n Reflect.apply(closePath, ctx, []);\n ctx.clip();\n\n if (contextProto) {\n contextProto.beginPath = beginPath;\n contextProto.closePath = closePath;\n }\n }\n\n render(_) {// NO RENDER\n }\n\n}\n\nclass FilterElement extends Element {\n constructor() {\n super(...arguments);\n this.type = 'filter';\n }\n\n apply(ctx, element) {\n // render as temp svg\n var {\n document,\n children\n } = this;\n var boundingBox = element.getBoundingBox(ctx);\n\n if (!boundingBox) {\n return;\n }\n\n var px = 0;\n var py = 0;\n children.forEach(child => {\n var efd = child.extraFilterDistance || 0;\n px = Math.max(px, efd);\n py = Math.max(py, efd);\n });\n var width = Math.floor(boundingBox.width);\n var height = Math.floor(boundingBox.height);\n var tmpCanvasWidth = width + 2 * px;\n var tmpCanvasHeight = height + 2 * py;\n\n if (tmpCanvasWidth < 1 || tmpCanvasHeight < 1) {\n return;\n }\n\n var x = Math.floor(boundingBox.x);\n var y = Math.floor(boundingBox.y);\n var ignoredStyles = this.removeStyles(element, FilterElement.ignoreStyles);\n var tmpCanvas = document.createCanvas(tmpCanvasWidth, tmpCanvasHeight);\n var tmpCtx = tmpCanvas.getContext('2d');\n document.screen.setDefaults(tmpCtx);\n tmpCtx.translate(-x + px, -y + py);\n element.render(tmpCtx); // apply filters\n\n children.forEach(child => {\n if (typeof child.apply === 'function') {\n child.apply(tmpCtx, 0, 0, tmpCanvasWidth, tmpCanvasHeight);\n }\n }); // render on me\n\n ctx.drawImage(tmpCanvas, 0, 0, tmpCanvasWidth, tmpCanvasHeight, x - px, y - py, tmpCanvasWidth, tmpCanvasHeight);\n this.restoreStyles(element, ignoredStyles);\n }\n\n render(_) {// NO RENDER\n }\n\n}\nFilterElement.ignoreStyles = ['filter', 'transform', 'clip-path'];\n\nclass FeDropShadowElement extends Element {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'feDropShadow';\n this.addStylesFromStyleDefinition();\n }\n\n apply(_, _x, _y, _width, _height) {// TODO: implement\n }\n\n}\n\nclass FeMorphologyElement extends Element {\n constructor() {\n super(...arguments);\n this.type = 'feMorphology';\n }\n\n apply(_, _x, _y, _width, _height) {// TODO: implement\n }\n\n}\n\nclass FeCompositeElement extends Element {\n constructor() {\n super(...arguments);\n this.type = 'feComposite';\n }\n\n apply(_, _x, _y, _width, _height) {// TODO: implement\n }\n\n}\n\nclass FeGaussianBlurElement extends Element {\n constructor(document, node, captureTextNodes) {\n super(document, node, captureTextNodes);\n this.type = 'feGaussianBlur';\n this.blurRadius = Math.floor(this.getAttribute('stdDeviation').getNumber());\n this.extraFilterDistance = this.blurRadius;\n }\n\n apply(ctx, x, y, width, height) {\n var {\n document,\n blurRadius\n } = this;\n var body = document.window ? document.window.document.body : null;\n var canvas = ctx.canvas; // StackBlur requires canvas be on document\n\n canvas.id = document.getUniqueId();\n\n if (body) {\n canvas.style.display = 'none';\n body.appendChild(canvas);\n }\n\n canvasRGBA(canvas, x, y, width, height, blurRadius);\n\n if (body) {\n body.removeChild(canvas);\n }\n }\n\n}\n\nclass TitleElement extends Element {\n constructor() {\n super(...arguments);\n this.type = 'title';\n }\n\n}\n\nclass DescElement extends Element {\n constructor() {\n super(...arguments);\n this.type = 'desc';\n }\n\n}\n\nvar elements = {\n 'svg': SVGElement,\n 'rect': RectElement,\n 'circle': CircleElement,\n 'ellipse': EllipseElement,\n 'line': LineElement,\n 'polyline': PolylineElement,\n 'polygon': PolygonElement,\n 'path': PathElement,\n 'pattern': PatternElement,\n 'marker': MarkerElement,\n 'defs': DefsElement,\n 'linearGradient': LinearGradientElement,\n 'radialGradient': RadialGradientElement,\n 'stop': StopElement,\n 'animate': AnimateElement,\n 'animateColor': AnimateColorElement,\n 'animateTransform': AnimateTransformElement,\n 'font': FontElement,\n 'font-face': FontFaceElement,\n 'missing-glyph': MissingGlyphElement,\n 'glyph': GlyphElement,\n 'text': TextElement,\n 'tspan': TSpanElement,\n 'tref': TRefElement,\n 'a': AElement,\n 'textPath': TextPathElement,\n 'image': ImageElement,\n 'g': GElement,\n 'symbol': SymbolElement,\n 'style': StyleElement,\n 'use': UseElement,\n 'mask': MaskElement,\n 'clipPath': ClipPathElement,\n 'filter': FilterElement,\n 'feDropShadow': FeDropShadowElement,\n 'feMorphology': FeMorphologyElement,\n 'feComposite': FeCompositeElement,\n 'feColorMatrix': FeColorMatrixElement,\n 'feGaussianBlur': FeGaussianBlurElement,\n 'title': TitleElement,\n 'desc': DescElement\n};\n\nfunction ownKeys$1(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread$1(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys$1(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys$1(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction createCanvas(width, height) {\n var canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n\nfunction createImage(_x) {\n return _createImage.apply(this, arguments);\n}\n\nfunction _createImage() {\n _createImage = _asyncToGenerator(function* (src) {\n var anonymousCrossOrigin = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var image = document.createElement('img');\n\n if (anonymousCrossOrigin) {\n image.crossOrigin = 'Anonymous';\n }\n\n return new Promise((resolve, reject) => {\n image.onload = () => {\n resolve(image);\n };\n\n image.onerror = (_event, _source, _lineno, _colno, error) => {\n reject(error);\n };\n\n image.src = src;\n });\n });\n return _createImage.apply(this, arguments);\n}\n\nclass Document {\n constructor(canvg) {\n var {\n rootEmSize = 12,\n emSize = 12,\n createCanvas = Document.createCanvas,\n createImage = Document.createImage,\n anonymousCrossOrigin\n } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n this.canvg = canvg;\n this.definitions = Object.create(null);\n this.styles = Object.create(null);\n this.stylesSpecificity = Object.create(null);\n this.images = [];\n this.fonts = [];\n this.emSizeStack = [];\n this.uniqueId = 0;\n this.screen = canvg.screen;\n this.rootEmSize = rootEmSize;\n this.emSize = emSize;\n this.createCanvas = createCanvas;\n this.createImage = this.bindCreateImage(createImage, anonymousCrossOrigin);\n this.screen.wait(this.isImagesLoaded.bind(this));\n this.screen.wait(this.isFontsLoaded.bind(this));\n }\n\n bindCreateImage(createImage, anonymousCrossOrigin) {\n if (typeof anonymousCrossOrigin === 'boolean') {\n return (source, forceAnonymousCrossOrigin) => createImage(source, typeof forceAnonymousCrossOrigin === 'boolean' ? forceAnonymousCrossOrigin : anonymousCrossOrigin);\n }\n\n return createImage;\n }\n\n get window() {\n return this.screen.window;\n }\n\n get fetch() {\n return this.screen.fetch;\n }\n\n get ctx() {\n return this.screen.ctx;\n }\n\n get emSize() {\n var {\n emSizeStack\n } = this;\n return emSizeStack[emSizeStack.length - 1];\n }\n\n set emSize(value) {\n var {\n emSizeStack\n } = this;\n emSizeStack.push(value);\n }\n\n popEmSize() {\n var {\n emSizeStack\n } = this;\n emSizeStack.pop();\n }\n\n getUniqueId() {\n return \"canvg\".concat(++this.uniqueId);\n }\n\n isImagesLoaded() {\n return this.images.every(_ => _.loaded);\n }\n\n isFontsLoaded() {\n return this.fonts.every(_ => _.loaded);\n }\n\n createDocumentElement(document) {\n var documentElement = this.createElement(document.documentElement);\n documentElement.root = true;\n documentElement.addStylesFromStyleDefinition();\n this.documentElement = documentElement;\n return documentElement;\n }\n\n createElement(node) {\n var elementType = node.nodeName.replace(/^[^:]+:/, '');\n var ElementType = Document.elementTypes[elementType];\n\n if (typeof ElementType !== 'undefined') {\n return new ElementType(this, node);\n }\n\n return new UnknownElement(this, node);\n }\n\n createTextNode(node) {\n return new TextNode(this, node);\n }\n\n setViewBox(config) {\n this.screen.setViewBox(_objectSpread$1({\n document: this\n }, config));\n }\n\n}\nDocument.createCanvas = createCanvas;\nDocument.createImage = createImage;\nDocument.elementTypes = elements;\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n/**\r\n * SVG renderer on canvas.\r\n */\n\nclass Canvg {\n /**\r\n * Main constructor.\r\n * @param ctx - Rendering context.\r\n * @param svg - SVG Document.\r\n * @param options - Rendering options.\r\n */\n constructor(ctx, svg) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n this.parser = new Parser(options);\n this.screen = new Screen(ctx, options);\n this.options = options;\n var document = new Document(this, options);\n var documentElement = document.createDocumentElement(svg);\n this.document = document;\n this.documentElement = documentElement;\n }\n /**\r\n * Create Canvg instance from SVG source string or URL.\r\n * @param ctx - Rendering context.\r\n * @param svg - SVG source string or URL.\r\n * @param options - Rendering options.\r\n * @returns Canvg instance.\r\n */\n\n\n static from(ctx, svg) {\n var _arguments = arguments;\n return _asyncToGenerator(function* () {\n var options = _arguments.length > 2 && _arguments[2] !== undefined ? _arguments[2] : {};\n var parser = new Parser(options);\n var svgDocument = yield parser.parse(svg);\n return new Canvg(ctx, svgDocument, options);\n })();\n }\n /**\r\n * Create Canvg instance from SVG source string.\r\n * @param ctx - Rendering context.\r\n * @param svg - SVG source string.\r\n * @param options - Rendering options.\r\n * @returns Canvg instance.\r\n */\n\n\n static fromString(ctx, svg) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var parser = new Parser(options);\n var svgDocument = parser.parseFromString(svg);\n return new Canvg(ctx, svgDocument, options);\n }\n /**\r\n * Create new Canvg instance with inherited options.\r\n * @param ctx - Rendering context.\r\n * @param svg - SVG source string or URL.\r\n * @param options - Rendering options.\r\n * @returns Canvg instance.\r\n */\n\n\n fork(ctx, svg) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n return Canvg.from(ctx, svg, _objectSpread(_objectSpread({}, this.options), options));\n }\n /**\r\n * Create new Canvg instance with inherited options.\r\n * @param ctx - Rendering context.\r\n * @param svg - SVG source string.\r\n * @param options - Rendering options.\r\n * @returns Canvg instance.\r\n */\n\n\n forkString(ctx, svg) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n return Canvg.fromString(ctx, svg, _objectSpread(_objectSpread({}, this.options), options));\n }\n /**\r\n * Document is ready promise.\r\n * @returns Ready promise.\r\n */\n\n\n ready() {\n return this.screen.ready();\n }\n /**\r\n * Document is ready value.\r\n * @returns Is ready or not.\r\n */\n\n\n isReady() {\n return this.screen.isReady();\n }\n /**\r\n * Render only first frame, ignoring animations and mouse.\r\n * @param options - Rendering options.\r\n */\n\n\n render() {\n var _arguments2 = arguments,\n _this = this;\n\n return _asyncToGenerator(function* () {\n var options = _arguments2.length > 0 && _arguments2[0] !== undefined ? _arguments2[0] : {};\n\n _this.start(_objectSpread({\n enableRedraw: true,\n ignoreAnimation: true,\n ignoreMouse: true\n }, options));\n\n yield _this.ready();\n\n _this.stop();\n })();\n }\n /**\r\n * Start rendering.\r\n * @param options - Render options.\r\n */\n\n\n start() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var {\n documentElement,\n screen,\n options: baseOptions\n } = this;\n screen.start(documentElement, _objectSpread(_objectSpread({\n enableRedraw: true\n }, baseOptions), options));\n }\n /**\r\n * Stop rendering.\r\n */\n\n\n stop() {\n this.screen.stop();\n }\n /**\r\n * Resize SVG to fit in given size.\r\n * @param width\r\n * @param height\r\n * @param preserveAspectRatio\r\n */\n\n\n resize(width) {\n var height = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : width;\n var preserveAspectRatio = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n this.documentElement.resize(width, height, preserveAspectRatio);\n }\n\n}\n\nexport { AElement, AnimateColorElement, AnimateElement, AnimateTransformElement, BoundingBox, CB1, CB2, CB3, CB4, Canvg, CircleElement, ClipPathElement, DefsElement, DescElement, Document, Element, EllipseElement, FeColorMatrixElement, FeCompositeElement, FeDropShadowElement, FeGaussianBlurElement, FeMorphologyElement, FilterElement, Font, FontElement, FontFaceElement, GElement, GlyphElement, GradientElement, ImageElement, LineElement, LinearGradientElement, MarkerElement, MaskElement, Matrix, MissingGlyphElement, Mouse, PSEUDO_ZERO, Parser, PathElement, PathParser, PatternElement, Point, PolygonElement, PolylineElement, Property, QB1, QB2, QB3, RadialGradientElement, RectElement, RenderedElement, Rotate, SVGElement, SVGFontLoader, Scale, Screen, Skew, SkewX, SkewY, StopElement, StyleElement, SymbolElement, TRefElement, TSpanElement, TextElement, TextPathElement, TitleElement, Transform, Translate, UnknownElement, UseElement, ViewPort, compressSpaces, Canvg as default, getSelectorSpecificity, normalizeAttributeName, normalizeColor, parseExternalUrl, index as presets, toNumbers, trimLeft, trimRight, vectorMagnitude, vectorsAngle, vectorsRatio };\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZXMuanMiLCJzb3VyY2VzIjpbXSwic291cmNlc0NvbnRlbnQiOltdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsifQ==\n"],"names":["check","it","globalThis_1","global","this","fails","exec","require$$0","descriptors","functionBindNative","test","NATIVE_BIND","call","functionCall","$propertyIsEnumerable","getOwnPropertyDescriptor","NASHORN_BUG","objectPropertyIsEnumerable","V","descriptor","createPropertyDescriptor","bitmap","value","FunctionPrototype","uncurryThisWithBind","functionUncurryThis","fn","uncurryThis","toString","stringSlice","classofRaw","require$$1","classof","require$$2","$Object","split","indexedObject","isNullOrUndefined","$TypeError","requireObjectCoercible","IndexedObject","toIndexedObject","documentAll","isCallable","argument","isObject","globalThis","aFunction","getBuiltIn","namespace","method","objectIsPrototypeOf","navigator","userAgent","environmentUserAgent","process","Deno","versions","v8","match","version","environmentV8Version","V8_VERSION","$String","symbolConstructorDetection","symbol","NATIVE_SYMBOL","useSymbolAsUid","isPrototypeOf","USE_SYMBOL_AS_UID","require$$3","isSymbol","$Symbol","tryToString","aCallable","getMethod","P","func","ordinaryToPrimitive","input","pref","val","defineProperty","defineGlobalProperty","key","SHARED","store","sharedStoreModule","shared","toObject","hasOwnProperty","hasOwnProperty_1","id","postfix","uid","hasOwn","require$$4","require$$5","Symbol","WellKnownSymbolsStore","createWellKnownSymbol","wellKnownSymbol","name","TO_PRIMITIVE","toPrimitive","exoticToPrim","result","toPropertyKey","document","EXISTS","documentCreateElement","DESCRIPTORS","createElement","ie8DomDefine","propertyIsEnumerableModule","require$$6","IE8_DOM_DEFINE","require$$7","$getOwnPropertyDescriptor","objectGetOwnPropertyDescriptor","O","v8PrototypeDefineBug","anObject","V8_PROTOTYPE_DEFINE_BUG","$defineProperty","ENUMERABLE","CONFIGURABLE","WRITABLE","objectDefineProperty","Attributes","current","definePropertyModule","createNonEnumerableProperty","object","getDescriptor","PROPER","functionName","functionToString","inspectSource","WeakMap","weakMapBasicDetection","keys","sharedKey","hiddenKeys","NATIVE_WEAK_MAP","OBJECT_ALREADY_INITIALIZED","TypeError","set","get","has","enforce","getterFor","TYPE","state","metadata","STATE","internalState","CONFIGURABLE_FUNCTION_NAME","InternalStateModule","enforceInternalState","getInternalState","replace","join","CONFIGURABLE_LENGTH","TEMPLATE","makeBuiltIn","makeBuiltInModule","options","defineBuiltIn","simple","ceil","floor","mathTrunc","x","n","trunc","toIntegerOrInfinity","number","max","min","toAbsoluteIndex","index","length","integer","toLength","len","lengthOfArrayLike","obj","createMethod","IS_INCLUDES","$this","el","fromIndex","arrayIncludes","indexOf","push","objectKeysInternal","names","i","enumBugKeys","internalObjectKeys","objectGetOwnPropertyNames","objectGetOwnPropertySymbols","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","concat","ownKeys","getOwnPropertySymbols","getOwnPropertyDescriptorModule","copyConstructorProperties","target","source","exceptions","replacement","isForced","feature","detection","data","normalize","POLYFILL","NATIVE","string","isForced_1","_export","TARGET","GLOBAL","STATIC","FORCED","targetProperty","sourceProperty","userAgentStartsWith","environment","ENVIRONMENT","environmentIsNode","path","functionUncurryThisAccessor","isPossiblePrototype","aPossiblePrototype","uncurryThisAccessor","objectSetPrototypeOf","CORRECT_SETTER","setter","proto","TO_STRING_TAG","setToStringTag","TAG","defineBuiltInAccessor","SPECIES","setSpecies","CONSTRUCTOR_NAME","Constructor","anInstance","Prototype","toStringTagSupport","TO_STRING_TAG_SUPPORT","CORRECT_ARGUMENTS","tryGet","tag","noop","construct","constructorRegExp","INCORRECT_TO_STRING","isConstructorModern","isConstructorLegacy","isConstructor","called","aConstructor","speciesConstructor","defaultConstructor","C","S","apply","functionApply","functionUncurryThisClause","bind","functionBindContext","that","html","arraySlice","validateArgumentsLength","passed","required","environmentIsIos","require$$8","require$$9","IS_IOS","require$$10","IS_NODE","require$$11","clear","Dispatch","Function","MessageChannel","String","counter","queue","ONREADYSTATECHANGE","$location","defer","channel","port","run","runner","eventListener","event","globalPostMessageDefer","handler","args","task","safeGetBuiltIn","Queue","item","entry","tail","next","environmentIsIosPebble","environmentIsWebosWebkit","macrotask","IS_IOS_PEBBLE","IS_WEBOS_WEBKIT","MutationObserver","Promise","microtask","notify","toggle","node","promise","then","flush","parent","error","microtask_1","hostReportErrors","b","perform","promiseNativeConstructor","NativePromiseConstructor","SUBCLASSING","NATIVE_PROMISE_REJECTION_EVENT","FORCED_PROMISE_CONSTRUCTOR","PROMISE_CONSTRUCTOR_SOURCE","GLOBAL_CORE_JS_PROMISE","resolve","FakePromise","constructor","promiseConstructorDetection","PromiseCapability","reject","$$resolve","$$reject","newPromiseCapability","$","setPrototypeOf","require$$12","require$$13","require$$14","require$$15","require$$16","require$$17","require$$18","require$$19","require$$20","require$$21","PromiseConstructorDetection","require$$22","newPromiseCapabilityModule","require$$23","PROMISE","NATIVE_PROMISE_SUBCLASSING","getInternalPromiseState","setInternalState","NativePromisePrototype","PromiseConstructor","PromisePrototype","newGenericPromiseCapability","DISPATCH_EVENT","UNHANDLED_REJECTION","REJECTION_HANDLED","PENDING","FULFILLED","REJECTED","HANDLED","UNHANDLED","Internal","OwnPromiseCapability","PromiseWrapper","nativeThen","isThenable","callReaction","reaction","ok","domain","exited","onHandleUnhandled","isReject","reactions","onUnhandled","dispatchEvent","reason","IS_UNHANDLED","isUnhandled","unwrap","internalReject","internalResolve","wrapper","executor","onFulfilled","onRejected","iterators","Iterators","ITERATOR","ArrayPrototype","isArrayIteratorMethod","getIteratorMethod","getIterator","usingIterator","iteratorMethod","iteratorClose","iterator","kind","innerResult","innerError","Result","stopped","ResultPrototype","iterate","iterable","unboundFunction","AS_ENTRIES","IS_RECORD","IS_ITERATOR","INTERRUPTED","iterFn","step","stop","condition","callFn","SAFE_CLOSING","iteratorWithReturn","checkCorrectnessOfIteration","SKIP_CLOSING","ITERATION_SUPPORT","promiseStaticsIncorrectIteration","PROMISE_STATICS_INCORRECT_ITERATION","capability","$promiseResolve","values","remaining","alreadyCalled","r","capabilityReject","promiseResolve","promiseCapability","asyncGeneratorStep","t","e","o","a","c","_asyncToGenerator","_next","_throw","regexpFlags","$RegExp","UNSUPPORTED_Y","re","BROKEN_CARET","regexpStickyHelpers","objectKeys","objectDefineProperties","Properties","props","definePropertiesModule","GT","LT","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","content","NullProtoObjectViaActiveX","activeXDocument","temp","NullProtoObjectViaIFrame","iframe","JS","iframeDocument","NullProtoObject","objectCreate","regexpUnsupportedDotAll","regexpUnsupportedNcg","stickyHelpers","create","UNSUPPORTED_DOT_ALL","UNSUPPORTED_NCG","nativeReplace","nativeExec","patchedExec","charAt","UPDATES_LAST_INDEX_WRONG","re1","re2","NPCG_INCLUDED","PATCH","str","raw","reCopy","lastIndex","group","groups","sticky","flags","charsAdded","strCopy","regexpExec","RegExpPrototype","fixRegexpWellKnownSymbolLogic","KEY","SHAM","SYMBOL","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","methods","nativeMethod","regexp","arg2","forceStringMethod","$exec","charCodeAt","CONVERT_TO_STRING","pos","position","size","first","second","stringMultibyte","advanceStringIndex","unicode","RegExp","FLAGS_GETTER_IS_CORRECT","INDICES_SUPPORT","calls","expected","addGetter","chr","pairs","regexpFlagsDetection","regExpFlagsDetection","regExpFlagsGetterImplementation","regexpGetFlags","regexpExecAbstract","R","fixRegExpWellKnownSymbolLogic","getRegExpFlags","regExpExec","stringIndexOf","MATCH","nativeMatch","maybeCallNative","matcher","rx","res","fullUnicode","A","matchStr","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","getSubstitution","matched","captures","namedCaptures","tailPos","m","symbols","ch","capture","f","REPLACE","maybeToString","REPLACE_KEEPS_$0","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","REPLACE_SUPPORTS_NAMED_GROUPS","_","UNSAFE_SUBSTITUTE","searchValue","replaceValue","replacer","functionalReplace","results","accumulatedResult","nextSourcePosition","j","replacerArgs","isRegexp","isRegExp","notARegexp","correctIsRegexpLogic","METHOD_NAME","notARegExp","correctIsRegExpLogic","CORRECT_IS_REGEXP_LOGIC","MDN_POLYFILL_BUG","searchString","search","UNSCOPABLES","addToUnscopables","correctPrototypeGetter","F","CORRECT_PROTOTYPE_GETTER","ObjectPrototype","objectGetPrototypeOf","getPrototypeOf","BUGGY_SAFARI_ITERATORS","IteratorPrototype","PrototypeOfArrayIteratorPrototype","arrayIterator","NEW_ITERATOR_PROTOTYPE","iteratorsCore","returnThis","iteratorCreateConstructor","IteratorConstructor","NAME","ENUMERABLE_NEXT","FunctionName","createIteratorConstructor","IteratorsCore","PROPER_FUNCTION_NAME","KEYS","VALUES","ENTRIES","iteratorDefine","Iterable","DEFAULT","IS_SET","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","CurrentIteratorPrototype","createIterResultObject","done","defineIterator","ARRAY_ITERATOR","es_array_iterator","iterated","domIterables","classList","DOMTokenListPrototype","domTokenListPrototype","DOMIterables","ArrayIteratorMethods","ArrayValues","handlePrototype","CollectionPrototype","COLLECTION_NAME","REDUCE_EMPTY","IS_RIGHT","callbackfn","argumentsLength","memo","self","arrayReduce","arrayMethodIsStrict","$reduce","CHROME_VERSION","CHROME_BUG","slice","endPosition","end","MAX_UINT32","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","BUGGY","SPLIT","nativeSplit","internalSplit","separator","limit","splitter","unicodeMatching","lim","p","q","z","getNanoSeconds","hrtime","loadTime","moduleLoadTime","nodeLoadTime","upTime","performanceNowModule","hr","now","root","vendors","suffix","raf","caf","last","frameDuration","callback","_now","cp","handle","rafModule","whitespaces","ltrim","rtrim","stringTrim","non","stringTrimForced","$trim","forcedStringTrimMethod","rgbcolor","color_string","simple_colors","color_defs","bits","processor","channels","g","examples","example","sc","xml","list_item","list_color","example_div","list_item_value","$indexOf","nativeIndexOf","NEGATIVE_ZERO","searchElement","isArray","nativeReverse","s","u","h","y","l","T","v","N","d","E","M","I","L","H","w","U","$toString","TO_STRING","nativeToString","NOT_GENERIC","INCORRECT_NAME","pattern","_typeof","_classCallCheck","instance","mulTable","shgTable","getImageDataFromCanvas","canvas","topX","topY","width","height","context","processCanvasRGBA","radius","imageData","processImageDataRGBA","pixels","div","widthMinus1","heightMinus1","radiusPlus1","sumFactor","stackStart","BlurStack","stack","stackEnd","stackIn","stackOut","yw","yi","mulSum","shgSum","pr","pg","pb","pa","_i","rInSum","gInSum","bInSum","aInSum","rOutSum","gOutSum","bOutSum","aOutSum","rSum","gSum","bSum","aSum","_i2","rbs","paInitial","_a2","_p","_stackOut","_r","_g","_b","_a","_x","_pr","_pg","_pb","_pa","_rOutSum","_gOutSum","_bOutSum","_aOutSum","_rSum","_gSum","_bSum","_aSum","_i3","yp","_gInSum","_bInSum","_aInSum","_rInSum","_i4","_rbs","_y","_p2","offscreen","DOMParserFallback","preset","url","response","blob","img","_ref","DOMParser","fetch","compressSpaces","trimLeft","trimRight","toNumbers","matches","allUppercase","normalizeAttributeName","parseExternalUrl","urlMatch","normalizeColor","color","rgbParts","normalizedColor","num","isFloat","attributeRegex","idRegex","classRegex","pseudoElementRegex","pseudoClassWithBracketsRegex","pseudoClassRegex","elementRegex","findSelectorMatch","selector","regex","getSelectorSpecificity","specificity","currentSelector","delta","PSEUDO_ZERO","vectorMagnitude","vectorsRatio","vectorsAngle","CB1","CB2","CB3","CB4","QB1","QB2","QB3","Property","zeroIsValue","asString","def","axisOrIsFontSize","processPercent","axis","isFontSize","viewPort","element","opacity","patternTransform","commas","RGBColor","ViewPort","viewPorts","Point","point","defaultValue","scale","points","pathPoints","transform","xp","Mouse","screen","onClick","onMouseMove","events","eventElements","style","ctx","_ref2","boundingBox","_ref3","window","eventTarget","defaultWindow","defaultFetch$1","Screen","checker","isReadyLock","aspectRatio","desiredWidth","desiredHeight","minX","minY","refX","refY","clip","clipX","clipY","cleanAspectRatio","aspectRatioAlign","aspectRatioMeetOrSlice","align","meetOrSlice","scaleX","scaleY","scaleMin","scaleMax","finalDesiredWidth","finalDesiredHeight","refXProp","refYProp","hasRefs","scaledClipX","scaledClipY","isMeetMinY","isSliceMaxY","isMeetMinX","isSliceMaxX","enableRedraw","ignoreMouse","ignoreAnimation","ignoreDimensions","ignoreClear","forceRedraw","scaleWidth","scaleHeight","offsetX","offsetY","FRAMERATE","mouse","tick","requestAnimationFrame","shouldUpdate","animation","CLIENT_WIDTH","CLIENT_HEIGHT","isFirstRender","widthStyle","heightStyle","cWidth","cHeight","viewBox","xRatio","yRatio","_widthStyle","_heightStyle","transformStyle","defaultFetch","DefaultDOMParser","Parser","resource","_this","parser","parserError","_this2","Translate","Rotate","rotate","transformOrigin","numbers","cx","cy","originX","originY","angle","tx","ty","rad","Scale","scaleSize","Matrix","matrix","det","Skew","skew","SkewX","SkewY","parseTransforms","parseTransform","type","Transform","TransformType","transformOriginXProperty","transformOriginYProperty","transforms","Element","captureTextNodes","attribute","nodeName","styles","definitions","childNode","textNode","createIfNotExists","attr","_attr","skipAncestors","parentStyle","_style","mask","filter","clipPathStyleProp","child","_node$getAttribute","styleClasses","styleClass","stylesSpecificity","existingSpecificity","ignoreStyles","toRestore","styleProp","_this$parent","UnknownElement","wrapFontFamily","fontFamily","trimmed","prepareFontFamily","prepareFontStyle","fontStyle","targetFontStyle","prepareFontWeight","fontWeight","targetFontWeight","Font","fontVariant","fontSize","inherit","inheritFont","font","parts","part","BoundingBox","x1","y1","x2","y2","p0","p1","p2","p3","forX","b2ac","t1","t2","p0x","p0y","p1x","p1y","p2x","p2y","p3x","p3y","cp1x","cp1y","cp2x","cp2y","PathParser","SVGPathData","commands","command","xProp","yProp","previousCommand","ox","oy","from","priorTo","angles","RenderedElement","opacityStyle","fromMeasure","fillStyleProp","fillOpacityStyleProp","strokeStyleProp","strokeOpacityProp","fillStyle","_fillStyle","_fillStyle2","strokeStyle","_strokeStyle","_strokeStyle2","strokeWidthStyleProp","newLineWidth","strokeLinecapStyleProp","strokeLinejoinStyleProp","strokeMiterlimitProp","strokeDasharrayStyleProp","strokeDashoffsetProp","gaps","offset","fontStyleProp","fontStyleStyleProp","fontVariantStyleProp","fontWeightStyleProp","fontSizeStyleProp","fontFamilyStyleProp","PathElement","pathParser","markers","fillRuleStyleProp","markersLastIndex","markerStartStyleProp","markerMidStyleProp","markerEndStyleProp","marker","_marker","_point","_angle","_marker2","_point2","_angle2","controlPoint","currentPoint","rX","rY","xRot","lArcFlag","sweepFlag","xAxisRotation","currp","cpp","centp","a1","ad","dir","ah","halfWay","sx","sy","GlyphElement","TextElement","textBaseline","childBoundingBox","inheritFontSize","text","char","glyph","prevChar","nextChar","arabicForm","maybeGlyph","childNodes","renderText","customFont","unitsPerEm","ctxFont","dx","lw","firstElement","textAnchor","isRTL","shift","textParent","xAttr","yAttr","dxAttr","dyAttr","measureCache","measure","targetText","_measure","parentAttr","TSpanElement","TextNode","SVGElement","_this$node$parentNode","fontSizeProp","refXAttr","refYAttr","viewBoxAttr","preserveAspectRatio","widthAttr","heightAttr","styleAttr","originWidth","originHeight","preserveAspectRatioAttr","RectElement","rxAttr","ryAttr","ry","KAPPA","CircleElement","EllipseElement","LineElement","x0","y0","PolylineElement","PolygonElement","PatternElement","parentOpacityProp","patternSvg","patternCanvas","patternCtx","MarkerElement","orient","markerUnits","markerSvg","DefsElement","GElement","GradientElement","stops","children","stopsContainer","gradient","MAX_VIRTUAL_PIXELS","rootView","rect","attributeToInherit","colorProp","LinearGradientElement","isBoundingBoxUnits","RadialGradientElement","fx","fy","fr","StopElement","stopOpacity","stopColor","AnimateElement","valuesAttr","attributeType","attributeName","initialUnits","progress","to","newValue","prop","fill","updated","typeAttr","lb","ub","AnimateColorElement","colorFrom","colorTo","AnimateTransformElement","transformFrom","transformTo","FontElement","fontFamilyStyle","FontFaceElement","MissingGlyphElement","TRefElement","firstChild","AElement","hasText","ownKeys$2","enumerableOnly","sym","_objectSpread$2","_defineProperty","TextPathElement","pathElement","dataArray","theta","dTheta","psi","fs","textDecoration","glyphInfo","rotation","partialText","idx","anchor","textFullWidth","fullPathWidth","spacesNumber","inputOffset","dy","charI","glyphWidth","splineStep","segment","dyX","dyY","measuresCache","chars","thisSpacing","parentSpacing","letterSpacing","letterSpacingCache","textLen","dxSum","acc","cur","textWidth","startOffset","nextOffset","pathCommands","startX","startY","nextCommandType","commandType","start","inc","dist","fromX","fromY","rise","pt","ix","iy","pRise","pRun","distance","fullLen","cumulativePathLength","currentT","pct","p4x","p4y","cosPsi","sinPsi","inputStep","inputPrecision","precision","targetDistance","dataUriRegex","ImageElement","href","isSvg","image","err","svg","loaded","subDocument","_image","SymbolElement","SVGFontLoader","svgDocument","fonts","fontNode","StyleElement","css","cssDefs","cssParts","cssClasses","cssProps","cssClass","cssProp","srcs","src","UseElement","tempSvg","oldParent","imGet","_height","rgba","imSet","mi","m1","m2","m3","FeColorMatrixElement","includeOpacity","srcData","nr","ng","nb","na","MaskElement","ignoredStyles","maskCanvas","maskCtx","tmpCanvas","tmpCtx","ClipPathElement","contextProto","beginPath","closePath","FilterElement","px","py","efd","tmpCanvasWidth","tmpCanvasHeight","FeDropShadowElement","_width","FeMorphologyElement","FeCompositeElement","FeGaussianBlurElement","blurRadius","body","canvasRGBA","TitleElement","DescElement","elements","ownKeys$1","_objectSpread$1","createCanvas","createImage","_createImage","anonymousCrossOrigin","_event","_source","_lineno","_colno","Document","canvg","rootEmSize","emSize","forceAnonymousCrossOrigin","emSizeStack","documentElement","elementType","ElementType","config","_objectSpread","Canvg","_arguments","_arguments2","baseOptions"],"mappings":"uQACA,IAAIA,GAAQ,SAAUC,EAAI,CACxB,OAAOA,GAAMA,EAAG,OAAS,MAAQA,CACnC,EAGAC,EAEEF,GAAM,OAAO,YAAc,UAAY,UAAU,GACjDA,GAAM,OAAO,QAAU,UAAY,MAAM,GAEzCA,GAAM,OAAO,MAAQ,UAAY,IAAI,GACrCA,GAAM,OAAOG,IAAU,UAAYA,EAAM,GACzCH,GAAM,OAAOI,IAAQ,UAAYA,EAAI,GAEpC,UAAY,CAAE,OAAO,IAAK,EAAE,GAAO,SAAS,aAAa,EAAC,QCd7DC,EAAiB,SAAUC,EAAM,CAC/B,GAAI,CACF,MAAO,CAAC,CAACA,EAAI,CACjB,MAAkB,CACd,MAAO,EACX,CACA,ECNID,GAAQE,EAGZC,GAAiB,CAACH,GAAM,UAAY,CAElC,OAAO,OAAO,eAAe,GAAI,EAAG,CAAE,IAAK,UAAY,CAAE,MAAO,EAAE,CAAE,CAAE,EAAE,CAAC,IAAM,CACjF,CAAC,ECNGA,GAAQE,EAEZE,GAAiB,CAACJ,GAAM,UAAY,CAElC,IAAIK,GAAQ,UAAY,CAAA,GAAiB,KAAI,EAE7C,OAAO,OAAOA,GAAQ,YAAcA,EAAK,eAAe,WAAW,CACrE,CAAC,ECPGC,GAAcJ,GAEdK,GAAO,SAAS,UAAU,KAE9BC,EAAiBF,GAAcC,GAAK,KAAKA,EAAI,EAAI,UAAY,CAC3D,OAAOA,GAAK,MAAMA,GAAM,SAAS,CACnC,QCNIE,GAAwB,CAAA,EAAG,qBAE3BC,GAA2B,OAAO,yBAGlCC,GAAcD,IAA4B,CAACD,GAAsB,KAAK,CAAE,EAAG,CAAC,EAAI,CAAC,EAIrFG,GAAA,EAAYD,GAAc,SAA8BE,EAAG,CACzD,IAAIC,EAAaJ,GAAyB,KAAMG,CAAC,EACjD,MAAO,CAAC,CAACC,GAAcA,EAAW,UACpC,EAAIL,GCZJ,IAAAM,GAAiB,SAAUC,EAAQC,EAAO,CACxC,MAAO,CACL,WAAY,EAAED,EAAS,GACvB,aAAc,EAAEA,EAAS,GACzB,SAAU,EAAEA,EAAS,GACrB,MAAOC,CACX,CACA,ECPIX,GAAcJ,GAEdgB,GAAoB,SAAS,UAC7BX,GAAOW,GAAkB,KAEzBC,GAAsBb,IAAeY,GAAkB,KAAK,KAAKX,GAAMA,EAAI,EAE/Ea,EAAiBd,GAAca,GAAsB,SAAUE,EAAI,CACjE,OAAO,UAAY,CACjB,OAAOd,GAAK,MAAMc,EAAI,SAAS,CACnC,CACA,ECXIC,GAAcpB,EAEdqB,GAAWD,GAAY,CAAA,EAAG,QAAQ,EAClCE,GAAcF,GAAY,GAAG,KAAK,EAEtCG,GAAiB,SAAU7B,EAAI,CAC7B,OAAO4B,GAAYD,GAAS3B,CAAE,EAAG,EAAG,EAAE,CACxC,ECPI0B,GAAcpB,EACdF,GAAQ0B,EACRC,GAAUC,GAEVC,GAAU,OACVC,GAAQR,GAAY,GAAG,KAAK,EAGhCS,GAAiB/B,GAAM,UAAY,CAGjC,MAAO,CAAC6B,GAAQ,GAAG,EAAE,qBAAqB,CAAC,CAC7C,CAAC,EAAI,SAAUjC,EAAI,CACjB,OAAO+B,GAAQ/B,CAAE,IAAM,SAAWkC,GAAMlC,EAAI,EAAE,EAAIiC,GAAQjC,CAAE,CAC9D,EAAIiC,GCZJG,GAAiB,SAAUpC,EAAI,CAC7B,OAAOA,GAAO,IAChB,ECJIoC,GAAoB9B,GAEpB+B,GAAa,UAIjBC,GAAiB,SAAUtC,EAAI,CAC7B,GAAIoC,GAAkBpC,CAAE,EAAG,MAAM,IAAIqC,GAAW,wBAA0BrC,CAAE,EAC5E,OAAOA,CACT,ECRIuC,GAAgBjC,GAChBgC,GAAyBR,GAE7BU,GAAiB,SAAUxC,EAAI,CAC7B,OAAOuC,GAAcD,GAAuBtC,CAAE,CAAC,CACjD,ECLIyC,GAAc,OAAO,UAAY,UAAY,SAAS,IAK1DC,EAAiB,OAAOD,GAAe,KAAeA,KAAgB,OAAY,SAAUE,EAAU,CACpG,OAAO,OAAOA,GAAY,YAAcA,IAAaF,EACvD,EAAI,SAAUE,EAAU,CACtB,OAAO,OAAOA,GAAY,UAC5B,ECVID,GAAapC,EAEjBsC,GAAiB,SAAU5C,EAAI,CAC7B,OAAO,OAAOA,GAAM,SAAWA,IAAO,KAAO0C,GAAW1C,CAAE,CAC5D,ECJI6C,GAAavC,EACboC,GAAaZ,EAEbgB,GAAY,SAAUH,EAAU,CAClC,OAAOD,GAAWC,CAAQ,EAAIA,EAAW,MAC3C,EAEAI,GAAiB,SAAUC,EAAWC,EAAQ,CAC5C,OAAO,UAAU,OAAS,EAAIH,GAAUD,GAAWG,CAAS,CAAC,EAAIH,GAAWG,CAAS,GAAKH,GAAWG,CAAS,EAAEC,CAAM,CACxH,ECTIvB,GAAcpB,EAElB4C,GAAiBxB,GAAY,CAAA,EAAG,aAAa,ECFzCmB,GAAavC,EAEb6C,GAAYN,GAAW,UACvBO,GAAYD,IAAaA,GAAU,UAEvCE,GAAiBD,GAAY,OAAOA,EAAS,EAAI,GCL7CP,GAAavC,EACb8C,GAAYtB,GAEZwB,GAAUT,GAAW,QACrBU,GAAOV,GAAW,KAClBW,GAAWF,IAAWA,GAAQ,UAAYC,IAAQA,GAAK,QACvDE,GAAKD,IAAYA,GAAS,GAC1BE,GAAOC,GAEPF,KACFC,GAAQD,GAAG,MAAM,GAAG,EAGpBE,GAAUD,GAAM,CAAC,EAAI,GAAKA,GAAM,CAAC,EAAI,EAAI,EAAI,EAAEA,GAAM,CAAC,EAAIA,GAAM,CAAC,IAK/D,CAACC,IAAWP,KACdM,GAAQN,GAAU,MAAM,aAAa,GACjC,CAACM,IAASA,GAAM,CAAC,GAAK,MACxBA,GAAQN,GAAU,MAAM,eAAe,EACnCM,KAAOC,GAAU,CAACD,GAAM,CAAC,KAIjC,IAAAE,GAAiBD,GCzBbE,GAAavD,GACbF,GAAQ0B,EACRe,GAAab,EAEb8B,GAAUjB,GAAW,OAGzBkB,GAAiB,CAAC,CAAC,OAAO,uBAAyB,CAAC3D,GAAM,UAAY,CACpE,IAAI4D,EAAS,OAAO,kBAAkB,EAKtC,MAAO,CAACF,GAAQE,CAAM,GAAK,EAAE,OAAOA,CAAM,YAAa,SAErD,CAAC,OAAO,MAAQH,IAAcA,GAAa,EAC/C,CAAC,EChBGI,GAAgB3D,GAEpB4D,GAAiBD,IACf,CAAC,OAAO,MACR,OAAO,OAAO,UAAY,SCLxBlB,GAAazC,GACboC,GAAaZ,EACbqC,GAAgBnC,GAChBoC,GAAoBC,GAEpBpC,GAAU,OAEdqC,GAAiBF,GAAoB,SAAUpE,EAAI,CACjD,OAAO,OAAOA,GAAM,QACtB,EAAI,SAAUA,EAAI,CAChB,IAAIuE,EAAUxB,GAAW,QAAQ,EACjC,OAAOL,GAAW6B,CAAO,GAAKJ,GAAcI,EAAQ,UAAWtC,GAAQjC,CAAE,CAAC,CAC5E,ECZI8D,GAAU,OAEdU,GAAiB,SAAU7B,EAAU,CACnC,GAAI,CACF,OAAOmB,GAAQnB,CAAQ,CAC3B,MAAkB,CACd,MAAO,QACX,CACA,ECRID,GAAapC,EACbkE,GAAc1C,GAEdO,GAAa,UAGjBoC,GAAiB,SAAU9B,EAAU,CACnC,GAAID,GAAWC,CAAQ,EAAG,OAAOA,EACjC,MAAM,IAAIN,GAAWmC,GAAY7B,CAAQ,EAAI,oBAAoB,CACnE,ECTI8B,GAAYnE,GACZ8B,GAAoBN,GAIxB4C,GAAiB,SAAUzD,EAAG0D,EAAG,CAC/B,IAAIC,EAAO3D,EAAE0D,CAAC,EACd,OAAOvC,GAAkBwC,CAAI,EAAI,OAAYH,GAAUG,CAAI,CAC7D,ECRIjE,GAAOL,EACPoC,GAAaZ,EACbc,GAAWZ,GAEXK,GAAa,UAIjBwC,GAAiB,SAAUC,EAAOC,EAAM,CACtC,IAAItD,EAAIuD,EAGR,GAFID,IAAS,UAAYrC,GAAWjB,EAAKqD,EAAM,QAAQ,GAAK,CAAClC,GAASoC,EAAMrE,GAAKc,EAAIqD,CAAK,CAAC,GACvFpC,GAAWjB,EAAKqD,EAAM,OAAO,GAAK,CAAClC,GAASoC,EAAMrE,GAAKc,EAAIqD,CAAK,CAAC,GACjEC,IAAS,UAAYrC,GAAWjB,EAAKqD,EAAM,QAAQ,GAAK,CAAClC,GAASoC,EAAMrE,GAAKc,EAAIqD,CAAK,CAAC,EAAG,OAAOE,EACrG,MAAM,IAAI3C,GAAW,yCAAyC,CAChE,kBCdIQ,GAAavC,EAGb2E,GAAiB,OAAO,eAE5BC,GAAiB,SAAUC,EAAK9D,EAAO,CACrC,GAAI,CACF4D,GAAepC,GAAYsC,EAAK,CAAE,MAAO9D,EAAO,aAAc,GAAM,SAAU,GAAM,CACxF,MAAkB,CACdwB,GAAWsC,CAAG,EAAI9D,CACtB,CAAI,OAAOA,CACX,ECVIwB,GAAaf,EACboD,GAAuBlD,GAEvBoD,GAAS,qBACTC,GAAQC,GAAA,QAAiBzC,GAAWuC,EAAM,GAAKF,GAAqBE,GAAQ,EAAE,GAEjFC,GAAM,WAAaA,GAAM,SAAW,CAAA,IAAK,KAAK,CAC7C,QAAS,SACT,KAAyB,SACzB,UAAW,8EACX,QAAS,2DACT,OAAQ,qCACV,CAAC,oBCbGA,GAAQ/E,GAEZiF,GAAiB,SAAUJ,EAAK9D,EAAO,CACrC,OAAOgE,GAAMF,CAAG,IAAME,GAAMF,CAAG,EAAI9D,GAAS,GAC9C,ECJIiB,GAAyBhC,GAEzB2B,GAAU,OAIduD,GAAiB,SAAU7C,EAAU,CACnC,OAAOV,GAAQK,GAAuBK,CAAQ,CAAC,CACjD,ECRIjB,GAAcpB,EACdkF,GAAW1D,GAEX2D,GAAiB/D,GAAY,CAAA,EAAG,cAAc,EAKlDgE,GAAiB,OAAO,QAAU,SAAgB1F,EAAImF,EAAK,CACzD,OAAOM,GAAeD,GAASxF,CAAE,EAAGmF,CAAG,CACzC,ECVIzD,GAAcpB,EAEdqF,GAAK,EACLC,GAAU,KAAK,OAAM,EACrBjE,GAAWD,GAAY,IAAI,QAAQ,EAEvCmE,GAAiB,SAAUV,EAAK,CAC9B,MAAO,WAAaA,IAAQ,OAAY,GAAKA,GAAO,KAAOxD,GAAS,EAAEgE,GAAKC,GAAS,EAAE,CACxF,ECRI/C,GAAavC,EACbiF,GAASzD,GACTgE,GAAS9D,GACT6D,GAAMxB,GACNJ,GAAgB8B,GAChB3B,GAAoB4B,GAEpBC,GAASpD,GAAW,OACpBqD,GAAwBX,GAAO,KAAK,EACpCY,GAAwB/B,GAAoB6B,GAAO,KAAUA,GAASA,IAAUA,GAAO,eAAiBJ,GAE5GO,EAAiB,SAAUC,EAAM,CAC/B,OAAKP,GAAOI,GAAuBG,CAAI,IACrCH,GAAsBG,CAAI,EAAIpC,IAAiB6B,GAAOG,GAAQI,CAAI,EAC9DJ,GAAOI,CAAI,EACXF,GAAsB,UAAYE,CAAI,GACnCH,GAAsBG,CAAI,CACrC,ECjBI1F,GAAOL,EACPsC,GAAWd,GACXwC,GAAWtC,GACX0C,GAAYL,GACZQ,GAAsBkB,GACtBK,GAAkBJ,EAElB3D,GAAa,UACbiE,GAAeF,GAAgB,aAAa,EAIhDG,GAAiB,SAAUzB,EAAOC,EAAM,CACtC,GAAI,CAACnC,GAASkC,CAAK,GAAKR,GAASQ,CAAK,EAAG,OAAOA,EAChD,IAAI0B,EAAe9B,GAAUI,EAAOwB,EAAY,EAC5CG,EACJ,GAAID,EAAc,CAGhB,GAFIzB,IAAS,SAAWA,EAAO,WAC/B0B,EAAS9F,GAAK6F,EAAc1B,EAAOC,CAAI,EACnC,CAACnC,GAAS6D,CAAM,GAAKnC,GAASmC,CAAM,EAAG,OAAOA,EAClD,MAAM,IAAIpE,GAAW,yCAAyC,CAClE,CACE,OAAI0C,IAAS,SAAWA,EAAO,UACxBF,GAAoBC,EAAOC,CAAI,CACxC,ECxBIwB,GAAcjG,GACdgE,GAAWxC,GAIf4E,GAAiB,SAAU/D,EAAU,CACnC,IAAIwC,EAAMoB,GAAY5D,EAAU,QAAQ,EACxC,OAAO2B,GAASa,CAAG,EAAIA,EAAMA,EAAM,EACrC,ECRItC,GAAavC,EACbsC,GAAWd,GAEX6E,GAAW9D,GAAW,SAEtB+D,GAAShE,GAAS+D,EAAQ,GAAK/D,GAAS+D,GAAS,aAAa,EAElEE,GAAiB,SAAU7G,EAAI,CAC7B,OAAO4G,GAASD,GAAS,cAAc3G,CAAE,EAAI,CAAA,CAC/C,ECTI8G,GAAcxG,GACdF,GAAQ0B,EACRiF,GAAgB/E,GAGpBgF,GAAiB,CAACF,IAAe,CAAC1G,GAAM,UAAY,CAElD,OAAO,OAAO,eAAe2G,GAAc,KAAK,EAAG,IAAK,CACtD,IAAK,UAAY,CAAE,MAAO,EAAE,CAChC,CAAG,EAAE,IAAM,CACX,CAAC,ECVGD,GAAcxG,GACdK,GAAOmB,EACPmF,GAA6BjF,GAC7Bb,GAA2BkD,GAC3B7B,GAAkBuD,GAClBW,GAAgBV,GAChBF,GAASoB,GACTC,GAAiBC,GAGjBC,GAA4B,OAAO,yBAIvCC,GAAA,EAAYR,GAAcO,GAA4B,SAAkCE,EAAG5C,EAAG,CAG5F,GAFA4C,EAAI/E,GAAgB+E,CAAC,EACrB5C,EAAI+B,GAAc/B,CAAC,EACfwC,GAAgB,GAAI,CACtB,OAAOE,GAA0BE,EAAG5C,CAAC,CACzC,MAAkB,CAAA,CAChB,GAAImB,GAAOyB,EAAG5C,CAAC,EAAG,OAAOxD,GAAyB,CAACR,GAAKsG,GAA2B,EAAGM,EAAG5C,CAAC,EAAG4C,EAAE5C,CAAC,CAAC,CACnG,YCrBImC,GAAcxG,GACdF,GAAQ0B,EAIZ0F,GAAiBV,IAAe1G,GAAM,UAAY,CAEhD,OAAO,OAAO,eAAe,UAAY,CAAA,EAAiB,YAAa,CACrE,MAAO,GACP,SAAU,EACd,CAAG,EAAE,YAAc,EACnB,CAAC,ECXGwC,GAAWtC,GAEXwD,GAAU,OACVzB,GAAa,UAGjBoF,EAAiB,SAAU9E,EAAU,CACnC,GAAIC,GAASD,CAAQ,EAAG,OAAOA,EAC/B,MAAM,IAAIN,GAAWyB,GAAQnB,CAAQ,EAAI,mBAAmB,CAC9D,ECTImE,GAAcxG,GACd6G,GAAiBrF,GACjB4F,GAA0B1F,GAC1ByF,GAAWpD,EACXqC,GAAgBX,GAEhB1D,GAAa,UAEbsF,GAAkB,OAAO,eAEzBN,GAA4B,OAAO,yBACnCO,GAAa,aACbC,GAAe,eACfC,GAAW,WAIfC,GAAA,EAAYjB,GAAcY,GAA0B,SAAwBH,EAAG5C,EAAGqD,EAAY,CAI5F,GAHAP,GAASF,CAAC,EACV5C,EAAI+B,GAAc/B,CAAC,EACnB8C,GAASO,CAAU,EACf,OAAOT,GAAM,YAAc5C,IAAM,aAAe,UAAWqD,GAAcF,MAAYE,GAAc,CAACA,EAAWF,EAAQ,EAAG,CAC5H,IAAIG,EAAUZ,GAA0BE,EAAG5C,CAAC,EACxCsD,GAAWA,EAAQH,EAAQ,IAC7BP,EAAE5C,CAAC,EAAIqD,EAAW,MAClBA,EAAa,CACX,aAAcH,MAAgBG,EAAaA,EAAWH,EAAY,EAAII,EAAQJ,EAAY,EAC1F,WAAYD,MAAcI,EAAaA,EAAWJ,EAAU,EAAIK,EAAQL,EAAU,EAClF,SAAU,EAClB,EAEA,CAAI,OAAOD,GAAgBJ,EAAG5C,EAAGqD,CAAU,CAC3C,EAAIL,GAAkB,SAAwBJ,EAAG5C,EAAGqD,EAAY,CAI9D,GAHAP,GAASF,CAAC,EACV5C,EAAI+B,GAAc/B,CAAC,EACnB8C,GAASO,CAAU,EACfb,GAAgB,GAAI,CACtB,OAAOQ,GAAgBJ,EAAG5C,EAAGqD,CAAU,CAC3C,MAAkB,CAAA,CAChB,GAAI,QAASA,GAAc,QAASA,EAAY,MAAM,IAAI3F,GAAW,yBAAyB,EAC9F,MAAI,UAAW2F,IAAYT,EAAE5C,CAAC,EAAIqD,EAAW,OACtCT,CACT,EC1CA,IAAIT,GAAcxG,GACd4H,GAAuBpG,GACvBX,GAA2Ba,GAE/BmG,GAAiBrB,GAAc,SAAUsB,EAAQjD,EAAK9D,EAAO,CAC3D,OAAO6G,GAAqB,EAAEE,EAAQjD,EAAKhE,GAAyB,EAAGE,CAAK,CAAC,CAC/E,EAAI,SAAU+G,EAAQjD,EAAK9D,EAAO,CAChC,OAAA+G,EAAOjD,CAAG,EAAI9D,EACP+G,CACT,kBCTItB,GAAcxG,GACdwF,GAAShE,GAETR,GAAoB,SAAS,UAE7B+G,GAAgBvB,IAAe,OAAO,yBAEtCF,GAASd,GAAOxE,GAAmB,MAAM,EAEzCgH,GAAS1B,KAAW,UAAqB,CAAA,GAAiB,OAAS,YACnEiB,GAAejB,KAAW,CAACE,IAAgBA,IAAeuB,GAAc/G,GAAmB,MAAM,EAAE,cAEvGiH,GAAiB,CAEf,OAAQD,GACR,aAAcT,EAChB,EChBInG,GAAcpB,EACdoC,GAAaZ,EACbuD,GAAQrD,GAERwG,GAAmB9G,GAAY,SAAS,QAAQ,EAG/CgB,GAAW2C,GAAM,aAAa,IACjCA,GAAM,cAAgB,SAAUrF,EAAI,CAClC,OAAOwI,GAAiBxI,CAAE,CAC9B,OAGAyI,GAAiBpD,GAAM,cCbnBxC,GAAavC,EACboC,GAAaZ,EAEb4G,GAAU7F,GAAW,QAEzB8F,GAAiBjG,GAAWgG,EAAO,GAAK,cAAc,KAAK,OAAOA,EAAO,CAAC,ECLtEnD,GAASjF,GACTuF,GAAM/D,GAEN8G,GAAOrD,GAAO,MAAM,EAExBsD,GAAiB,SAAU1D,EAAK,CAC9B,OAAOyD,GAAKzD,CAAG,IAAMyD,GAAKzD,CAAG,EAAIU,GAAIV,CAAG,EAC1C,ECPA2D,GAAiB,CAAA,ECAbC,GAAkBzI,GAClBuC,GAAaf,EACbc,GAAWZ,GACXmG,GAA8B9D,GAC9ByB,GAASC,GACTR,GAASS,GACT6C,GAAY3B,GACZ4B,GAAa1B,GAEb4B,GAA6B,6BAC7BC,GAAYpG,GAAW,UACvB6F,GAAU7F,GAAW,QACrBqG,GAAKC,GAAKC,GAEVC,GAAU,SAAUrJ,EAAI,CAC1B,OAAOoJ,GAAIpJ,CAAE,EAAImJ,GAAInJ,CAAE,EAAIkJ,GAAIlJ,EAAI,EAAE,CACvC,EAEIsJ,GAAY,SAAUC,EAAM,CAC9B,OAAO,SAAUvJ,EAAI,CACnB,IAAIwJ,EACJ,GAAI,CAAC5G,GAAS5C,CAAE,IAAMwJ,EAAQL,GAAInJ,CAAE,GAAG,OAASuJ,EAC9C,MAAM,IAAIN,GAAU,0BAA4BM,EAAO,WAAW,EAClE,OAAOC,CACb,CACA,EAEA,GAAIT,IAAmBxD,GAAO,MAAO,CACnC,IAAIF,GAAQE,GAAO,QAAUA,GAAO,MAAQ,IAAImD,IAEhDrD,GAAM,IAAMA,GAAM,IAClBA,GAAM,IAAMA,GAAM,IAClBA,GAAM,IAAMA,GAAM,IAElB6D,GAAM,SAAUlJ,EAAIyJ,EAAU,CAC5B,GAAIpE,GAAM,IAAIrF,CAAE,EAAG,MAAM,IAAIiJ,GAAUD,EAA0B,EACjE,OAAAS,EAAS,OAASzJ,EAClBqF,GAAM,IAAIrF,EAAIyJ,CAAQ,EACfA,CACX,EACEN,GAAM,SAAUnJ,EAAI,CAClB,OAAOqF,GAAM,IAAIrF,CAAE,GAAK,CAAA,CAC5B,EACEoJ,GAAM,SAAUpJ,EAAI,CAClB,OAAOqF,GAAM,IAAIrF,CAAE,CACvB,CACA,KAAO,CACL,IAAI0J,GAAQb,GAAU,OAAO,EAC7BC,GAAWY,EAAK,EAAI,GACpBR,GAAM,SAAUlJ,EAAIyJ,EAAU,CAC5B,GAAI3D,GAAO9F,EAAI0J,EAAK,EAAG,MAAM,IAAIT,GAAUD,EAA0B,EACrE,OAAAS,EAAS,OAASzJ,EAClBmI,GAA4BnI,EAAI0J,GAAOD,CAAQ,EACxCA,CACX,EACEN,GAAM,SAAUnJ,EAAI,CAClB,OAAO8F,GAAO9F,EAAI0J,EAAK,EAAI1J,EAAG0J,EAAK,EAAI,CAAA,CAC3C,EACEN,GAAM,SAAUpJ,EAAI,CAClB,OAAO8F,GAAO9F,EAAI0J,EAAK,CAC3B,CACA,CAEA,IAAAC,GAAiB,CACf,IAAKT,GACL,IAAKC,GACL,IAAKC,GACL,QAASC,GACT,UAAWC,EACb,ECrEI5H,GAAcpB,EACdF,GAAQ0B,EACRY,GAAaV,EACb8D,GAASzB,GACTyC,GAAcf,GACd6D,GAA6B5D,GAAsC,aACnEyC,GAAgBvB,GAChB2C,GAAsBzC,GAEtB0C,GAAuBD,GAAoB,QAC3CE,GAAmBF,GAAoB,IACvC/F,GAAU,OAEVmB,GAAiB,OAAO,eACxBrD,GAAcF,GAAY,GAAG,KAAK,EAClCsI,GAAUtI,GAAY,GAAG,OAAO,EAChCuI,GAAOvI,GAAY,CAAA,EAAG,IAAI,EAE1BwI,GAAsBpD,IAAe,CAAC1G,GAAM,UAAY,CAC1D,OAAO6E,GAAe,UAAY,CAAA,EAAiB,SAAU,CAAE,MAAO,CAAC,CAAE,EAAE,SAAW,CACxF,CAAC,EAEGkF,GAAW,OAAO,MAAM,EAAE,MAAM,QAAQ,EAExCC,GAAcC,GAAA,QAAiB,SAAUhJ,EAAOgF,EAAMiE,EAAS,CAC7D1I,GAAYkC,GAAQuC,CAAI,EAAG,EAAG,CAAC,IAAM,YACvCA,EAAO,IAAM2D,GAAQlG,GAAQuC,CAAI,EAAG,wBAAyB,IAAI,EAAI,KAEnEiE,GAAWA,EAAQ,SAAQjE,EAAO,OAASA,GAC3CiE,GAAWA,EAAQ,SAAQjE,EAAO,OAASA,IAC3C,CAACP,GAAOzE,EAAO,MAAM,GAAMuI,IAA8BvI,EAAM,OAASgF,KACtES,GAAa7B,GAAe5D,EAAO,OAAQ,CAAE,MAAOgF,EAAM,aAAc,GAAM,EAC7EhF,EAAM,KAAOgF,GAEhB6D,IAAuBI,GAAWxE,GAAOwE,EAAS,OAAO,GAAKjJ,EAAM,SAAWiJ,EAAQ,OACzFrF,GAAe5D,EAAO,SAAU,CAAE,MAAOiJ,EAAQ,MAAO,EAE1D,GAAI,CACEA,GAAWxE,GAAOwE,EAAS,aAAa,GAAKA,EAAQ,YACnDxD,IAAa7B,GAAe5D,EAAO,YAAa,CAAE,SAAU,GAAO,EAE9DA,EAAM,YAAWA,EAAM,UAAY,OAClD,MAAkB,CAAA,CAChB,IAAImI,EAAQM,GAAqBzI,CAAK,EACtC,OAAKyE,GAAO0D,EAAO,QAAQ,IACzBA,EAAM,OAASS,GAAKE,GAAU,OAAO9D,GAAQ,SAAWA,EAAO,EAAE,GAC1DhF,CACX,EAIA,SAAS,UAAU,SAAW+I,GAAY,UAAoB,CAC5D,OAAO1H,GAAW,IAAI,GAAKqH,GAAiB,IAAI,EAAE,QAAUtB,GAAc,IAAI,CAChF,EAAG,UAAU,oBCrDT/F,GAAapC,EACb4H,GAAuBpG,GACvBsI,GAAcpI,GACdkD,GAAuBb,GAE3BkG,GAAiB,SAAUhD,EAAGpC,EAAK9D,EAAOiJ,EAAS,CAC5CA,IAASA,EAAU,CAAA,GACxB,IAAIE,EAASF,EAAQ,WACjBjE,EAAOiE,EAAQ,OAAS,OAAYA,EAAQ,KAAOnF,EAEvD,GADIzC,GAAWrB,CAAK,GAAG+I,GAAY/I,EAAOgF,EAAMiE,CAAO,EACnDA,EAAQ,OACNE,EAAQjD,EAAEpC,CAAG,EAAI9D,EAChB6D,GAAqBC,EAAK9D,CAAK,MAC/B,CACL,GAAI,CACGiJ,EAAQ,OACJ/C,EAAEpC,CAAG,IAAGqF,EAAS,IADL,OAAOjD,EAAEpC,CAAG,CAEvC,MAAoB,CAAA,CACZqF,EAAQjD,EAAEpC,CAAG,EAAI9D,EAChB6G,GAAqB,EAAEX,EAAGpC,EAAK,CAClC,MAAO9D,EACP,WAAY,GACZ,aAAc,CAACiJ,EAAQ,gBACvB,SAAU,CAACA,EAAQ,WACzB,CAAK,CACL,CAAI,OAAO/C,CACX,QC1BIkD,GAAO,KAAK,KACZC,GAAQ,KAAK,MAKjBC,GAAiB,KAAK,OAAS,SAAeC,EAAG,CAC/C,IAAIC,EAAI,CAACD,EACT,OAAQC,EAAI,EAAIH,GAAQD,IAAMI,CAAC,CACjC,ECTIC,GAAQxK,GAIZyK,GAAiB,SAAUpI,EAAU,CACnC,IAAIqI,EAAS,CAACrI,EAEd,OAAOqI,IAAWA,GAAUA,IAAW,EAAI,EAAIF,GAAME,CAAM,CAC7D,ECRID,GAAsBzK,GAEtB2K,GAAM,KAAK,IACXC,GAAM,KAAK,IAKfC,GAAiB,SAAUC,EAAOC,EAAQ,CACxC,IAAIC,EAAUP,GAAoBK,CAAK,EACvC,OAAOE,EAAU,EAAIL,GAAIK,EAAUD,EAAQ,CAAC,EAAIH,GAAII,EAASD,CAAM,CACrE,ECXIN,GAAsBzK,GAEtB4K,GAAM,KAAK,IAIfK,GAAiB,SAAU5I,EAAU,CACnC,IAAI6I,EAAMT,GAAoBpI,CAAQ,EACtC,OAAO6I,EAAM,EAAIN,GAAIM,EAAK,gBAAgB,EAAI,CAChD,ECTID,GAAWjL,GAIfmL,GAAiB,SAAUC,EAAK,CAC9B,OAAOH,GAASG,EAAI,MAAM,CAC5B,ECNIlJ,GAAkBlC,GAClB6K,GAAkBrJ,GAClB2J,GAAoBzJ,GAGpB2J,GAAe,SAAUC,EAAa,CACxC,OAAO,SAAUC,EAAOC,EAAIC,EAAW,CACrC,IAAIxE,EAAI/E,GAAgBqJ,CAAK,EACzBR,EAASI,GAAkBlE,CAAC,EAChC,GAAI8D,IAAW,EAAG,MAAO,CAACO,GAAe,GACzC,IAAIR,EAAQD,GAAgBY,EAAWV,CAAM,EACzChK,EAGJ,GAAIuK,GAAeE,IAAOA,GAAI,KAAOT,EAASD,GAG5C,GAFA/J,EAAQkG,EAAE6D,GAAO,EAEb/J,IAAUA,EAAO,MAAO,OAEvB,MAAMgK,EAASD,EAAOA,IAC3B,IAAKQ,GAAeR,KAAS7D,IAAMA,EAAE6D,CAAK,IAAMU,EAAI,OAAOF,GAAeR,GAAS,EACnF,MAAO,CAACQ,GAAe,EAC7B,CACA,EAEAI,GAAiB,CAMf,QAASL,GAAa,EAAK,CAC7B,EChCIjK,GAAcpB,EACdwF,GAAShE,GACTU,GAAkBR,GAClBiK,GAAU5H,GAAuC,QACjDyE,GAAa/C,GAEbmG,GAAOxK,GAAY,CAAA,EAAG,IAAI,EAE9ByK,GAAiB,SAAU/D,EAAQgE,EAAO,CACxC,IAAI7E,EAAI/E,GAAgB4F,CAAM,EAC1BiE,EAAI,EACJ5F,EAAS,CAAA,EACTtB,EACJ,IAAKA,KAAOoC,EAAG,CAACzB,GAAOgD,GAAY3D,CAAG,GAAKW,GAAOyB,EAAGpC,CAAG,GAAK+G,GAAKzF,EAAQtB,CAAG,EAE7E,KAAOiH,EAAM,OAASC,GAAOvG,GAAOyB,EAAGpC,EAAMiH,EAAMC,GAAG,CAAC,IACrD,CAACJ,GAAQxF,EAAQtB,CAAG,GAAK+G,GAAKzF,EAAQtB,CAAG,GAE3C,OAAOsB,CACT,EClBA6F,GAAiB,CACf,cACA,iBACA,gBACA,uBACA,iBACA,WACA,SACF,ECTIC,GAAqBjM,GACrBgM,GAAcxK,GAEdgH,GAAawD,GAAY,OAAO,SAAU,WAAW,EAKzDE,GAAA,EAAY,OAAO,qBAAuB,SAA6BjF,EAAG,CACxE,OAAOgF,GAAmBhF,EAAGuB,EAAU,CACzC,YCTA2D,GAAA,EAAY,OAAO,sBCDnB,IAAI1J,GAAazC,GACboB,GAAcI,EACd4K,GAA4B1K,GAC5B2K,GAA8BtI,GAC9BoD,GAAW1B,EAEX6G,GAASlL,GAAY,CAAA,EAAG,MAAM,EAGlCmL,GAAiB9J,GAAW,UAAW,SAAS,GAAK,SAAiB/C,EAAI,CACxE,IAAI4I,EAAO8D,GAA0B,EAAEjF,GAASzH,CAAE,CAAC,EAC/C8M,EAAwBH,GAA4B,EACxD,OAAOG,EAAwBF,GAAOhE,EAAMkE,EAAsB9M,CAAE,CAAC,EAAI4I,CAC3E,ECbI9C,GAASxF,GACTuM,GAAU/K,GACViL,GAAiC/K,GACjCkG,GAAuB7D,GAE3B2I,GAAiB,SAAUC,EAAQC,EAAQC,EAAY,CAIrD,QAHIvE,EAAOiE,GAAQK,CAAM,EACrBjI,EAAiBiD,GAAqB,EACtCpH,EAA2BiM,GAA+B,EACrDV,EAAI,EAAGA,EAAIzD,EAAK,OAAQyD,IAAK,CACpC,IAAIlH,EAAMyD,EAAKyD,CAAC,EACZ,CAACvG,GAAOmH,EAAQ9H,CAAG,GAAK,EAAEgI,GAAcrH,GAAOqH,EAAYhI,CAAG,IAChEF,EAAegI,EAAQ9H,EAAKrE,EAAyBoM,EAAQ/H,CAAG,CAAC,CAEvE,CACA,ECfI/E,GAAQE,EACRoC,GAAaZ,EAEbsL,GAAc,kBAEdC,GAAW,SAAUC,EAASC,EAAW,CAC3C,IAAIlM,EAAQmM,GAAKC,GAAUH,CAAO,CAAC,EACnC,OAAOjM,IAAUqM,GAAW,GACxBrM,IAAUsM,GAAS,GACnBjL,GAAW6K,CAAS,EAAInN,GAAMmN,CAAS,EACvC,CAAC,CAACA,CACR,EAEIE,GAAYJ,GAAS,UAAY,SAAUO,EAAQ,CACrD,OAAO,OAAOA,CAAM,EAAE,QAAQR,GAAa,GAAG,EAAE,YAAW,CAC7D,EAEII,GAAOH,GAAS,KAAO,CAAA,EACvBM,GAASN,GAAS,OAAS,IAC3BK,GAAWL,GAAS,SAAW,IAEnCQ,GAAiBR,GCrBbxK,GAAavC,EACbQ,GAA2BgB,GAA2D,EACtFqG,GAA8BnG,GAC9BuI,GAAgBlG,GAChBa,GAAuBa,GACvBiH,GAA4BhH,GAC5BqH,GAAWnG,GAiBf4G,GAAiB,SAAUxD,EAAS4C,EAAQ,CAC1C,IAAIa,EAASzD,EAAQ,OACjB0D,EAAS1D,EAAQ,OACjB2D,EAAS3D,EAAQ,KACjB4D,EAAQjB,EAAQ9H,EAAKgJ,EAAgBC,EAAgBlN,EAQzD,GAPI8M,EACFf,EAASpK,GACAoL,EACThB,EAASpK,GAAWkL,CAAM,GAAK7I,GAAqB6I,EAAQ,CAAA,CAAE,EAE9Dd,EAASpK,GAAWkL,CAAM,GAAKlL,GAAWkL,CAAM,EAAE,UAEhDd,EAAQ,IAAK9H,KAAO+H,EAAQ,CAQ9B,GAPAkB,EAAiBlB,EAAO/H,CAAG,EACvBmF,EAAQ,gBACVpJ,EAAaJ,GAAyBmM,EAAQ9H,CAAG,EACjDgJ,EAAiBjN,GAAcA,EAAW,OACrCiN,EAAiBlB,EAAO9H,CAAG,EAClC+I,EAASb,GAASW,EAAS7I,EAAM4I,GAAUE,EAAS,IAAM,KAAO9I,EAAKmF,EAAQ,MAAM,EAEhF,CAAC4D,GAAUC,IAAmB,OAAW,CAC3C,GAAI,OAAOC,GAAkB,OAAOD,EAAgB,SACpDnB,GAA0BoB,EAAgBD,CAAc,CAC9D,EAEQ7D,EAAQ,MAAS6D,GAAkBA,EAAe,OACpDhG,GAA4BiG,EAAgB,OAAQ,EAAI,EAE1D7D,GAAc0C,EAAQ9H,EAAKiJ,EAAgB9D,CAAO,CACtD,CACA,ECpDIzH,GAAavC,EACb8C,GAAYtB,GACZC,GAAUC,GAEVqM,GAAsB,SAAUT,EAAQ,CAC1C,OAAOxK,GAAU,MAAM,EAAGwK,EAAO,MAAM,IAAMA,CAC/C,EAEAU,GAAkB,UAAY,CAC5B,OAAID,GAAoB,MAAM,EAAU,MACpCA,GAAoB,oBAAoB,EAAU,aAClDA,GAAoB,OAAO,EAAU,OACrCA,GAAoB,UAAU,EAAU,OACxCxL,GAAW,KAAO,OAAO,IAAI,SAAW,SAAiB,MACzDA,GAAW,MAAQ,OAAO,KAAK,SAAW,SAAiB,OAC3Dd,GAAQc,GAAW,OAAO,IAAM,UAAkB,OAClDA,GAAW,QAAUA,GAAW,SAAiB,UAC9C,MACT,EAAC,ECnBG0L,GAAcjO,GAElBkO,GAAiBD,KAAgB,OCF7B1L,GAAavC,EAEjBmO,GAAiB5L,GCFbnB,GAAcpB,EACdmE,GAAY3C,GAEhB4M,GAAiB,SAAUtG,EAAQjD,EAAKlC,EAAQ,CAC9C,GAAI,CAEF,OAAOvB,GAAY+C,GAAU,OAAO,yBAAyB2D,EAAQjD,CAAG,EAAElC,CAAM,CAAC,CAAC,CACtF,MAAkB,CAAA,CAClB,ECRIL,GAAWtC,GAEfqO,GAAiB,SAAUhM,EAAU,CACnC,OAAOC,GAASD,CAAQ,GAAKA,IAAa,IAC5C,ECJIgM,GAAsBrO,GAEtBwD,GAAU,OACVzB,GAAa,UAEjBuM,GAAiB,SAAUjM,EAAU,CACnC,GAAIgM,GAAoBhM,CAAQ,EAAG,OAAOA,EAC1C,MAAM,IAAIN,GAAW,aAAeyB,GAAQnB,CAAQ,EAAI,iBAAiB,CAC3E,ECPIkM,GAAsBvO,GACtBsC,GAAWd,GACXQ,GAAyBN,GACzB4M,GAAqBvK,GAMzByK,GAAiB,OAAO,iBAAmB,aAAe,CAAA,EAAK,UAAY,CACzE,IAAIC,EAAiB,GACjBtO,EAAO,CAAA,EACPuO,EACJ,GAAI,CACFA,EAASH,GAAoB,OAAO,UAAW,YAAa,KAAK,EACjEG,EAAOvO,EAAM,EAAE,EACfsO,EAAiBtO,aAAgB,KACrC,MAAkB,CAAA,CAChB,OAAO,SAAwB8G,EAAG0H,EAAO,CAGvC,OAFA3M,GAAuBiF,CAAC,EACxBqH,GAAmBK,CAAK,EACnBrM,GAAS2E,CAAC,IACXwH,EAAgBC,EAAOzH,EAAG0H,CAAK,EAC9B1H,EAAE,UAAY0H,GACZ1H,CACX,CACA,EAAC,EAAK,QC3BFtC,GAAiB3E,GAA+C,EAChEwF,GAAShE,GACTsE,GAAkBpE,EAElBkN,GAAgB9I,GAAgB,aAAa,EAEjD+I,GAAiB,SAAUlC,EAAQmC,EAAKnB,EAAQ,CAC1ChB,GAAU,CAACgB,IAAQhB,EAASA,EAAO,WACnCA,GAAU,CAACnH,GAAOmH,EAAQiC,EAAa,GACzCjK,GAAegI,EAAQiC,GAAe,CAAE,aAAc,GAAM,MAAOE,EAAK,CAE5E,ECXIhF,GAAc9J,GACd2E,GAAiBnD,GAErBuN,GAAiB,SAAUpC,EAAQ5G,EAAMnF,EAAY,CACnD,OAAIA,EAAW,KAAKkJ,GAAYlJ,EAAW,IAAKmF,EAAM,CAAE,OAAQ,GAAM,EAClEnF,EAAW,KAAKkJ,GAAYlJ,EAAW,IAAKmF,EAAM,CAAE,OAAQ,GAAM,EAC/DpB,GAAe,EAAEgI,EAAQ5G,EAAMnF,CAAU,CAClD,ECPI6B,GAAazC,GACb+O,GAAwBvN,GACxBsE,GAAkBpE,EAClB8E,GAAczC,GAEdiL,GAAUlJ,GAAgB,SAAS,EAEvCmJ,GAAiB,SAAUC,EAAkB,CAC3C,IAAIC,EAAc1M,GAAWyM,CAAgB,EAEzC1I,IAAe2I,GAAe,CAACA,EAAYH,EAAO,GACpDD,GAAsBI,EAAaH,GAAS,CAC1C,aAAc,GACd,IAAK,UAAY,CAAE,OAAO,IAAK,CACrC,CAAK,CAEL,EChBInL,GAAgB7D,GAEhB+B,GAAa,UAEjBqN,GAAiB,SAAU1P,EAAI2P,EAAW,CACxC,GAAIxL,GAAcwL,EAAW3P,CAAE,EAAG,OAAOA,EACzC,MAAM,IAAIqC,GAAW,sBAAsB,CAC7C,ECPI+D,GAAkB9F,EAElB4O,GAAgB9I,GAAgB,aAAa,EAC7C3F,GAAO,CAAA,EAEXA,GAAKyO,EAAa,EAAI,IAEtB,IAAAU,GAAiB,OAAOnP,EAAI,IAAM,aCP9BoP,GAAwBvP,GACxBoC,GAAaZ,EACbD,GAAaG,GACboE,GAAkB/B,EAElB6K,GAAgB9I,GAAgB,aAAa,EAC7CnE,GAAU,OAGV6N,GAAoBjO,GAAW,UAAY,CAAE,OAAO,SAAU,EAAE,CAAE,IAAM,YAGxEkO,GAAS,SAAU/P,EAAImF,EAAK,CAC9B,GAAI,CACF,OAAOnF,EAAGmF,CAAG,CACjB,MAAkB,CAAA,CAClB,EAGApD,GAAiB8N,GAAwBhO,GAAa,SAAU7B,EAAI,CAClE,IAAIuH,EAAGyI,EAAKvJ,EACZ,OAAOzG,IAAO,OAAY,YAAcA,IAAO,KAAO,OAElD,OAAQgQ,EAAMD,GAAOxI,EAAItF,GAAQjC,CAAE,EAAGkP,EAAa,IAAM,SAAWc,EAEpEF,GAAoBjO,GAAW0F,CAAC,GAE/Bd,EAAS5E,GAAW0F,CAAC,KAAO,UAAY7E,GAAW6E,EAAE,MAAM,EAAI,YAAcd,CACpF,EC5BI/E,GAAcpB,EACdF,GAAQ0B,EACRY,GAAaV,EACbD,GAAUsC,GACVtB,GAAagD,GACb0C,GAAgBzC,GAEhBiK,GAAO,UAAY,CAAA,EACnBC,GAAYnN,GAAW,UAAW,WAAW,EAC7CoN,GAAoB,2BACpB9P,GAAOqB,GAAYyO,GAAkB,IAAI,EACzCC,GAAsB,CAACD,GAAkB,KAAKF,EAAI,EAElDI,GAAsB,SAAuB1N,EAAU,CACzD,GAAI,CAACD,GAAWC,CAAQ,EAAG,MAAO,GAClC,GAAI,CACF,OAAAuN,GAAUD,GAAM,CAAA,EAAItN,CAAQ,EACrB,EACX,MAAkB,CACd,MAAO,EACX,CACA,EAEI2N,GAAsB,SAAuB3N,EAAU,CACzD,GAAI,CAACD,GAAWC,CAAQ,EAAG,MAAO,GAClC,OAAQZ,GAAQY,CAAQ,EAAC,CACvB,IAAK,gBACL,IAAK,oBACL,IAAK,yBAA0B,MAAO,EAC1C,CACE,GAAI,CAIF,OAAOyN,IAAuB,CAAC,CAAC/P,GAAK8P,GAAmB1H,GAAc9F,CAAQ,CAAC,CACnF,MAAkB,CACd,MAAO,EACX,CACA,EAEA2N,GAAoB,KAAO,GAI3B,IAAAC,GAAiB,CAACL,IAAa9P,GAAM,UAAY,CAC/C,IAAIoQ,EACJ,OAAOH,GAAoBA,GAAoB,IAAI,GAC9C,CAACA,GAAoB,MAAM,GAC3B,CAACA,GAAoB,UAAY,CAAEG,EAAS,EAAK,CAAE,GACnDA,CACP,CAAC,EAAIF,GAAsBD,GClDvBE,GAAgBjQ,GAChBkE,GAAc1C,GAEdO,GAAa,UAGjBoO,GAAiB,SAAU9N,EAAU,CACnC,GAAI4N,GAAc5N,CAAQ,EAAG,OAAOA,EACpC,MAAM,IAAIN,GAAWmC,GAAY7B,CAAQ,EAAI,uBAAuB,CACtE,ECTI8E,GAAWnH,EACXmQ,GAAe3O,GACfM,GAAoBJ,GACpBoE,GAAkB/B,EAElBiL,GAAUlJ,GAAgB,SAAS,EAIvCsK,GAAiB,SAAUnJ,EAAGoJ,EAAoB,CAChD,IAAIC,EAAInJ,GAASF,CAAC,EAAE,YAChBsJ,EACJ,OAAOD,IAAM,QAAaxO,GAAkByO,EAAIpJ,GAASmJ,CAAC,EAAEtB,EAAO,CAAC,EAAIqB,EAAqBF,GAAaI,CAAC,CAC7G,ECbInQ,GAAcJ,GAEdgB,GAAoB,SAAS,UAC7BwP,GAAQxP,GAAkB,MAC1BX,GAAOW,GAAkB,KAG7ByP,GAAiB,OAAO,SAAW,UAAY,QAAQ,QAAUrQ,GAAcC,GAAK,KAAKmQ,EAAK,EAAI,UAAY,CAC5G,OAAOnQ,GAAK,MAAMmQ,GAAO,SAAS,CACpC,GCTIjP,GAAavB,GACboB,GAAcI,EAElBkP,GAAiB,SAAUvP,EAAI,CAI7B,GAAII,GAAWJ,CAAE,IAAM,WAAY,OAAOC,GAAYD,CAAE,CAC1D,ECRIC,GAAcpB,GACdmE,GAAY3C,GACZpB,GAAcsB,GAEdiP,GAAOvP,GAAYA,GAAY,IAAI,EAGvCwP,GAAiB,SAAUzP,EAAI0P,EAAM,CACnC1M,OAAAA,GAAUhD,CAAE,EACL0P,IAAS,OAAY1P,EAAKf,GAAcuQ,GAAKxP,EAAI0P,CAAI,EAAI,UAAyB,CACvF,OAAO1P,EAAG,MAAM0P,EAAM,SAAS,CACnC,CACA,ECZIpO,GAAazC,GAEjB8Q,GAAiBrO,GAAW,WAAY,iBAAiB,ECFrDrB,GAAcpB,EAElB+Q,GAAiB3P,GAAY,CAAA,EAAG,KAAK,ECFjCW,GAAa,UAEjBiP,GAAiB,SAAUC,EAAQC,EAAU,CAC3C,GAAID,EAASC,EAAU,MAAM,IAAInP,GAAW,sBAAsB,EAClE,OAAOkP,CACT,ECLInO,GAAY9C,GAGhBmR,GAAiB,qCAAqC,KAAKrO,EAAS,ECHhEP,GAAavC,EACbwQ,GAAQhP,GACRmP,GAAOjP,GACPU,GAAa2B,EACbyB,GAASC,GACT3F,GAAQ4F,EACRoL,GAAOlK,GACPmK,GAAajK,GACbL,GAAgB2K,GAChBJ,GAA0BK,GAC1BC,GAASC,GACTC,GAAUC,GAEV7I,GAAMrG,GAAW,aACjBmP,GAAQnP,GAAW,eACnBS,GAAUT,GAAW,QACrBoP,GAAWpP,GAAW,SACtBqP,GAAWrP,GAAW,SACtBsP,GAAiBtP,GAAW,eAC5BuP,GAASvP,GAAW,OACpBwP,GAAU,EACVC,GAAQ,CAAA,EACRC,GAAqB,qBACrBC,GAAWC,GAAOC,GAASC,GAE/BvS,GAAM,UAAY,CAEhBoS,GAAY3P,GAAW,QACzB,CAAC,EAED,IAAI+P,GAAM,SAAUjN,EAAI,CACtB,GAAIG,GAAOwM,GAAO3M,CAAE,EAAG,CACrB,IAAIlE,EAAK6Q,GAAM3M,CAAE,EACjB,OAAO2M,GAAM3M,CAAE,EACflE,EAAE,CACN,CACA,EAEIoR,GAAS,SAAUlN,EAAI,CACzB,OAAO,UAAY,CACjBiN,GAAIjN,CAAE,CACV,CACA,EAEImN,GAAgB,SAAUC,EAAO,CACnCH,GAAIG,EAAM,IAAI,CAChB,EAEIC,GAAyB,SAAUrN,EAAI,CAEzC9C,GAAW,YAAYuP,GAAOzM,CAAE,EAAG6M,GAAU,SAAW,KAAOA,GAAU,IAAI,CAC/E,GAGI,CAACtJ,IAAO,CAAC8I,MACX9I,GAAM,SAAsB+J,EAAS,CACnC3B,GAAwB,UAAU,OAAQ,CAAC,EAC3C,IAAI7P,EAAKiB,GAAWuQ,CAAO,EAAIA,EAAUf,GAASe,CAAO,EACrDC,EAAO7B,GAAW,UAAW,CAAC,EAClCiB,OAAAA,GAAM,EAAED,EAAO,EAAI,UAAY,CAC7BvB,GAAMrP,EAAI,OAAWyR,CAAI,CAC/B,EACIT,GAAMJ,EAAO,EACNA,EACX,EACEL,GAAQ,SAAwBrM,EAAI,CAClC,OAAO2M,GAAM3M,CAAE,CACnB,EAEMmM,GACFW,GAAQ,SAAU9M,EAAI,CACpBrC,GAAQ,SAASuP,GAAOlN,CAAE,CAAC,CACjC,EAEasM,IAAYA,GAAS,IAC9BQ,GAAQ,SAAU9M,EAAI,CACpBsM,GAAS,IAAIY,GAAOlN,CAAE,CAAC,CAC7B,EAGawM,IAAkB,CAACP,IAC5Bc,GAAU,IAAIP,GACdQ,GAAOD,GAAQ,MACfA,GAAQ,MAAM,UAAYI,GAC1BL,GAAQxB,GAAK0B,GAAK,YAAaA,EAAI,GAInC9P,GAAW,kBACXH,GAAWG,GAAW,WAAW,GACjC,CAACA,GAAW,eACZ2P,IAAaA,GAAU,WAAa,SACpC,CAACpS,GAAM4S,EAAsB,GAE7BP,GAAQO,GACRnQ,GAAW,iBAAiB,UAAWiQ,GAAe,EAAK,GAElDP,MAAsBxL,GAAc,QAAQ,EACrD0L,GAAQ,SAAU9M,EAAI,CACpByL,GAAK,YAAYrK,GAAc,QAAQ,CAAC,EAAEwL,EAAkB,EAAI,UAAY,CAC1EnB,GAAK,YAAY,IAAI,EACrBwB,GAAIjN,CAAE,CACd,CACA,EAGI8M,GAAQ,SAAU9M,EAAI,CACpB,WAAWkN,GAAOlN,CAAE,EAAG,CAAC,CAC9B,GAIA,IAAAwN,GAAiB,CACf,IAAKjK,EAEP,ECnHIrG,GAAavC,EACbwG,GAAchF,GAGdhB,GAA2B,OAAO,yBAGtCsS,GAAiB,SAAU/M,EAAM,CAC/B,GAAI,CAACS,GAAa,OAAOjE,GAAWwD,CAAI,EACxC,IAAInF,EAAaJ,GAAyB+B,GAAYwD,CAAI,EAC1D,OAAOnF,GAAcA,EAAW,KAClC,ECXImS,GAAQ,UAAY,CACtB,KAAK,KAAO,KACZ,KAAK,KAAO,IACd,EAEAA,GAAM,UAAY,CAChB,IAAK,SAAUC,EAAM,CACnB,IAAIC,EAAQ,CAAE,KAAMD,EAAM,KAAM,IAAI,EAChCE,EAAO,KAAK,KACZA,EAAMA,EAAK,KAAOD,EACjB,KAAK,KAAOA,EACjB,KAAK,KAAOA,CAChB,EACE,IAAK,UAAY,CACf,IAAIA,EAAQ,KAAK,KACjB,GAAIA,EAAO,CACT,IAAIE,EAAO,KAAK,KAAOF,EAAM,KAC7B,OAAIE,IAAS,OAAM,KAAK,KAAO,MACxBF,EAAM,IACnB,CACA,CACA,EAEA,IAAAjB,GAAiBe,GCvBbjQ,GAAY9C,GAEhBoT,GAAiB,oBAAoB,KAAKtQ,EAAS,GAAK,OAAO,OAAU,ICFrEA,GAAY9C,GAEhBqT,GAAiB,qBAAqB,KAAKvQ,EAAS,ECFhDP,GAAavC,EACb8S,GAAiBtR,GACjBmP,GAAOjP,GACP4R,GAAYvP,GAA6B,IACzCgP,GAAQtN,GACR6L,GAAS5L,GACT6N,GAAgB3M,GAChB4M,GAAkB1M,GAClB0K,GAAUJ,GAEVqC,GAAmBlR,GAAW,kBAAoBA,GAAW,uBAC7D8D,GAAW9D,GAAW,SACtBS,GAAUT,GAAW,QACrBmR,GAAUnR,GAAW,QACrBoR,GAAYb,GAAe,gBAAgB,EAC3Cc,GAAQC,GAAQC,GAAMC,GAASC,GAGnC,GAAI,CAACL,GAAW,CACd,IAAI3B,GAAQ,IAAIe,GAEZkB,GAAQ,UAAY,CACtB,IAAIC,EAAQ/S,EAEZ,IADIqQ,KAAY0C,EAASlR,GAAQ,SAASkR,EAAO,KAAI,EAC9C/S,EAAK6Q,GAAM,IAAG,GAAI,GAAI,CAC3B7Q,EAAE,CACR,OAAagT,EAAO,CACd,MAAInC,GAAM,MAAM4B,GAAM,EAChBO,CACZ,CACQD,GAAQA,EAAO,MAAK,CAC5B,EAIM,CAAC5C,IAAU,CAACE,IAAW,CAACgC,IAAmBC,IAAoBpN,IACjEwN,GAAS,GACTC,GAAOzN,GAAS,eAAe,EAAE,EACjC,IAAIoN,GAAiBQ,EAAK,EAAE,QAAQH,GAAM,CAAE,cAAe,GAAM,EACjEF,GAAS,UAAY,CACnBE,GAAK,KAAOD,GAAS,CAACA,EAC5B,GAEa,CAACN,IAAiBG,IAAWA,GAAQ,SAE9CK,GAAUL,GAAQ,QAAQ,MAAS,EAEnCK,GAAQ,YAAcL,GACtBM,GAAOrD,GAAKoD,GAAQ,KAAMA,EAAO,EACjCH,GAAS,UAAY,CACnBI,GAAKC,EAAK,CAChB,GAEazC,GACToC,GAAS,UAAY,CACnB5Q,GAAQ,SAASiR,EAAK,CAC5B,GASIX,GAAY3C,GAAK2C,GAAW/Q,EAAU,EACtCqR,GAAS,UAAY,CACnBN,GAAUW,EAAK,CACrB,GAGEN,GAAY,SAAUxS,EAAI,CACnB6Q,GAAM,MAAM4B,GAAM,EACvB5B,GAAM,IAAI7Q,CAAE,CAChB,CACA,CAEA,IAAAiT,GAAiBT,GC7EjBU,GAAiB,SAAU,EAAGC,EAAG,CAC/B,GAAI,CAEF,UAAU,SAAW,EAAI,QAAQ,MAAM,CAAC,EAAI,QAAQ,MAAM,EAAGA,CAAC,CAClE,MAAkB,CAAA,CAClB,ECLAC,GAAiB,SAAUxU,EAAM,CAC/B,GAAI,CACF,MAAO,CAAE,MAAO,GAAO,MAAOA,EAAI,CAAE,CACxC,OAAWoU,EAAO,CACd,MAAO,CAAE,MAAO,GAAM,MAAOA,CAAK,CACtC,CACA,ECNI5R,GAAavC,EAEjBwU,GAAiBjS,GAAW,QCFxBA,GAAavC,EACbyU,GAA2BjT,GAC3BY,GAAaV,EACbqL,GAAWhJ,GACXoE,GAAgB1C,GAChBK,GAAkBJ,EAClBuI,GAAcrH,GAEdrD,GAAa6N,GAEYqD,IAA4BA,GAAyB,UAClF,IAAIzF,GAAUlJ,GAAgB,SAAS,EACnC4O,GAAc,GACdC,GAAiCvS,GAAWG,GAAW,qBAAqB,EAE5EqS,GAA6B7H,GAAS,UAAW,UAAY,CAC/D,IAAI8H,EAA6B1M,GAAcsM,EAAwB,EACnEK,EAAyBD,IAA+B,OAAOJ,EAAwB,EAI3F,GAAI,CAACK,GAA0BvR,KAAe,GAAI,MAAO,GAMzD,GAAI,CAACA,IAAcA,GAAa,IAAM,CAAC,cAAc,KAAKsR,CAA0B,EAAG,CAErF,IAAId,EAAU,IAAIU,GAAyB,SAAUM,EAAS,CAAEA,EAAQ,CAAC,CAAE,CAAE,EACzEC,EAAc,SAAUjV,EAAM,CAChCA,EAAK,UAAY,CAAA,EAAiB,UAAY,CAAA,CAAe,CACnE,EACQkV,EAAclB,EAAQ,YAAc,CAAA,EAGxC,GAFAkB,EAAYjG,EAAO,EAAIgG,EACvBN,GAAcX,EAAQ,KAAK,UAAY,CAAA,CAAe,YAAaiB,EAC/D,CAACN,GAAa,MAAO,EAE7B,CAAI,MAAO,CAACI,IAA2B7G,KAAgB,WAAaA,KAAgB,SAAW,CAAC0G,EAChG,CAAC,EAEDO,GAAiB,CACf,YAAaN,GACb,gBAAiBD,GACjB,YAAaD,EACf,QC7CIvQ,GAAYnE,GAEZ+B,GAAa,UAEboT,GAAoB,SAAU7E,EAAG,CACnC,IAAIyE,EAASK,EACb,KAAK,QAAU,IAAI9E,EAAE,SAAU+E,EAAWC,EAAU,CAClD,GAAIP,IAAY,QAAaK,IAAW,OAAW,MAAM,IAAIrT,GAAW,yBAAyB,EACjGgT,EAAUM,EACVD,EAASE,CACb,CAAG,EACD,KAAK,QAAUnR,GAAU4Q,CAAO,EAChC,KAAK,OAAS5Q,GAAUiR,CAAM,CAChC,EAIAG,GAAA,EAAmB,SAAUjF,EAAG,CAC9B,OAAO,IAAI6E,GAAkB7E,CAAC,CAChC,ECnBA,IAAIkF,GAAIxV,GAEJwR,GAAU9P,GACVa,GAAawB,EACboK,GAAO1I,GACPpF,GAAOqF,EACPuE,GAAgBrD,GAChB6O,GAAiB3O,GACjB+H,GAAiBuC,GACjBnC,GAAaoC,GACblN,GAAYoN,GACZnP,GAAaqP,EACbnP,GAAWoT,GACXtG,GAAauG,GACbvF,GAAqBwF,GACrB/C,GAAOgD,GAA6B,IACpClC,GAAYmC,GACZzB,GAAmB0B,GACnBxB,GAAUyB,GACVjD,GAAQkD,GACR1M,GAAsB2M,GACtBzB,GAA2B0B,GAC3BC,GAA8BC,GAC9BC,GAA6BC,GAE7BC,GAAU,UACV5B,GAA6BwB,GAA4B,YACzDzB,GAAiCyB,GAA4B,gBAC7DK,GAA6BL,GAA4B,YACzDM,GAA0BnN,GAAoB,UAAUiN,EAAO,EAC/DG,GAAmBpN,GAAoB,IACvCqN,GAAyBnC,IAA4BA,GAAyB,UAC9EoC,GAAqBpC,GACrBqC,GAAmBF,GACnBjO,GAAYpG,GAAW,UACvB8D,GAAW9D,GAAW,SACtBS,GAAUT,GAAW,QACrBgT,GAAuBe,GAA2B,EAClDS,GAA8BxB,GAE9ByB,GAAiB,CAAC,EAAE3Q,IAAYA,GAAS,aAAe9D,GAAW,eACnE0U,GAAsB,qBACtBC,GAAoB,mBACpBC,GAAU,EACVC,GAAY,EACZC,GAAW,EACXC,GAAU,EACVC,GAAY,EAEZC,GAAUC,GAAsBC,GAAgBC,GAGhDC,GAAa,SAAUlY,EAAI,CAC7B,IAAIsU,EACJ,OAAO1R,GAAS5C,CAAE,GAAK0C,GAAW4R,EAAOtU,EAAG,IAAI,EAAIsU,EAAO,EAC7D,EAEI6D,GAAe,SAAUC,EAAU5O,EAAO,CAC5C,IAAInI,EAAQmI,EAAM,MACd6O,EAAK7O,EAAM,QAAUkO,GACrBzE,EAAUoF,EAAKD,EAAS,GAAKA,EAAS,KACtC/C,EAAU+C,EAAS,QACnB1C,EAAS0C,EAAS,OAClBE,EAASF,EAAS,OAClB3R,EAAQ6N,EAAMiE,EAClB,GAAI,CACEtF,GACGoF,IACC7O,EAAM,YAAcqO,IAAWW,GAAkBhP,CAAK,EAC1DA,EAAM,UAAYoO,IAEhB3E,IAAY,GAAMxM,EAASpF,GAEzBiX,GAAQA,EAAO,MAAK,EACxB7R,EAASwM,EAAQ5R,CAAK,EAClBiX,IACFA,EAAO,KAAI,EACXC,EAAS,KAGT9R,IAAW2R,EAAS,QACtB1C,EAAO,IAAIzM,GAAU,qBAAqB,CAAC,GAClCqL,EAAO4D,GAAWzR,CAAM,GACjC9F,GAAK2T,EAAM7N,EAAQ4O,EAASK,CAAM,EAC7BL,EAAQ5O,CAAM,GAChBiP,EAAOrU,CAAK,CACvB,OAAWoT,EAAO,CACV6D,GAAU,CAACC,GAAQD,EAAO,KAAI,EAClC5C,EAAOjB,CAAK,CAChB,CACA,EAEIP,GAAS,SAAU1K,EAAOiP,EAAU,CAClCjP,EAAM,WACVA,EAAM,SAAW,GACjByK,GAAU,UAAY,CAGpB,QAFIyE,EAAYlP,EAAM,UAClB4O,EACGA,EAAWM,EAAU,OAC1BP,GAAaC,EAAU5O,CAAK,EAE9BA,EAAM,SAAW,GACbiP,GAAY,CAACjP,EAAM,WAAWmP,GAAYnP,CAAK,CACvD,CAAG,EACH,EAEIoP,GAAgB,SAAUvS,EAAMgO,EAASwE,EAAQ,CACnD,IAAI9F,EAAOE,EACPqE,IACFvE,EAAQpM,GAAS,YAAY,OAAO,EACpCoM,EAAM,QAAUsB,EAChBtB,EAAM,OAAS8F,EACf9F,EAAM,UAAU1M,EAAM,GAAO,EAAI,EACjCxD,GAAW,cAAckQ,CAAK,GACzBA,EAAQ,CAAE,QAASsB,EAAS,OAAQwE,CAAM,EAC7C,CAAC5D,KAAmChC,EAAUpQ,GAAW,KAAOwD,CAAI,GAAI4M,EAAQF,CAAK,EAChF1M,IAASkR,IAAqB5C,GAAiB,8BAA+BkE,CAAM,CAC/F,EAEIF,GAAc,SAAUnP,EAAO,CACjC7I,GAAKwS,GAAMtQ,GAAY,UAAY,CACjC,IAAIwR,EAAU7K,EAAM,OAChBnI,EAAQmI,EAAM,MACdsP,EAAeC,GAAYvP,CAAK,EAChC/C,EACJ,GAAIqS,IACFrS,EAASoO,GAAQ,UAAY,CACvB/C,GACFxO,GAAQ,KAAK,qBAAsBjC,EAAOgT,CAAO,EAC5CuE,GAAcrB,GAAqBlD,EAAShT,CAAK,CAChE,CAAO,EAEDmI,EAAM,UAAYsI,IAAWiH,GAAYvP,CAAK,EAAIqO,GAAYD,GAC1DnR,EAAO,OAAO,MAAMA,EAAO,KAErC,CAAG,CACH,EAEIsS,GAAc,SAAUvP,EAAO,CACjC,OAAOA,EAAM,YAAcoO,IAAW,CAACpO,EAAM,MAC/C,EAEIgP,GAAoB,SAAUhP,EAAO,CACvC7I,GAAKwS,GAAMtQ,GAAY,UAAY,CACjC,IAAIwR,EAAU7K,EAAM,OAChBsI,GACFxO,GAAQ,KAAK,mBAAoB+Q,CAAO,EACnCuE,GAAcpB,GAAmBnD,EAAS7K,EAAM,KAAK,CAChE,CAAG,CACH,EAEIyH,GAAO,SAAUxP,EAAI+H,EAAOwP,EAAQ,CACtC,OAAO,SAAU3X,EAAO,CACtBI,EAAG+H,EAAOnI,EAAO2X,CAAM,CAC3B,CACA,EAEIC,GAAiB,SAAUzP,EAAOnI,EAAO2X,EAAQ,CAC/CxP,EAAM,OACVA,EAAM,KAAO,GACTwP,IAAQxP,EAAQwP,GACpBxP,EAAM,MAAQnI,EACdmI,EAAM,MAAQmO,GACdzD,GAAO1K,EAAO,EAAI,EACpB,EAEI0P,GAAkB,SAAU1P,EAAOnI,EAAO2X,EAAQ,CACpD,GAAI,CAAAxP,EAAM,KACV,CAAAA,EAAM,KAAO,GACTwP,IAAQxP,EAAQwP,GACpB,GAAI,CACF,GAAIxP,EAAM,SAAWnI,EAAO,MAAM,IAAI4H,GAAU,kCAAkC,EAClF,IAAIqL,EAAO4D,GAAW7W,CAAK,EACvBiT,EACFL,GAAU,UAAY,CACpB,IAAIkF,EAAU,CAAE,KAAM,EAAK,EAC3B,GAAI,CACFxY,GAAK2T,EAAMjT,EACT4P,GAAKiI,GAAiBC,EAAS3P,CAAK,EACpCyH,GAAKgI,GAAgBE,EAAS3P,CAAK,CAC/C,CACA,OAAiBiL,EAAO,CACdwE,GAAeE,EAAS1E,EAAOjL,CAAK,CAC9C,CACA,CAAO,GAEDA,EAAM,MAAQnI,EACdmI,EAAM,MAAQkO,GACdxD,GAAO1K,EAAO,EAAK,EAEzB,OAAWiL,EAAO,CACdwE,GAAe,CAAE,KAAM,EAAK,EAAIxE,EAAOjL,CAAK,CAChD,EACA,EAGA,GAAI0L,KAEFiC,GAAqB,SAAiBiC,EAAU,CAC9C1J,GAAW,KAAM0H,EAAgB,EACjC3S,GAAU2U,CAAQ,EAClBzY,GAAKmX,GAAU,IAAI,EACnB,IAAItO,EAAQwN,GAAwB,IAAI,EACxC,GAAI,CACFoC,EAASnI,GAAKiI,GAAiB1P,CAAK,EAAGyH,GAAKgI,GAAgBzP,CAAK,CAAC,CACxE,OAAaiL,EAAO,CACdwE,GAAezP,EAAOiL,CAAK,CACjC,CACA,EAEE2C,GAAmBD,GAAmB,UAGtCW,GAAW,SAAiBsB,EAAU,CACpCnC,GAAiB,KAAM,CACrB,KAAMH,GACN,KAAM,GACN,SAAU,GACV,OAAQ,GACR,UAAW,IAAIzD,GACf,UAAW,GACX,MAAOoE,GACP,MAAO,IACb,CAAK,CACL,EAIEK,GAAS,UAAYvN,GAAc6M,GAAkB,OAAQ,SAAciC,EAAaC,EAAY,CAClG,IAAI9P,EAAQwN,GAAwB,IAAI,EACpCoB,EAAWvC,GAAqBnF,GAAmB,KAAMyG,EAAkB,CAAC,EAChF,OAAA3N,EAAM,OAAS,GACf4O,EAAS,GAAK1V,GAAW2W,CAAW,EAAIA,EAAc,GACtDjB,EAAS,KAAO1V,GAAW4W,CAAU,GAAKA,EAC1ClB,EAAS,OAAStG,GAAUxO,GAAQ,OAAS,OACzCkG,EAAM,QAAUiO,GAASjO,EAAM,UAAU,IAAI4O,CAAQ,EACpDnE,GAAU,UAAY,CACzBkE,GAAaC,EAAU5O,CAAK,CAClC,CAAK,EACM4O,EAAS,OACpB,CAAG,EAEDL,GAAuB,UAAY,CACjC,IAAI1D,EAAU,IAAIyD,GACdtO,EAAQwN,GAAwB3C,CAAO,EAC3C,KAAK,QAAUA,EACf,KAAK,QAAUpD,GAAKiI,GAAiB1P,CAAK,EAC1C,KAAK,OAASyH,GAAKgI,GAAgBzP,CAAK,CAC5C,EAEEoN,GAA2B,EAAIf,GAAuB,SAAUjF,EAAG,CACjE,OAAOA,IAAMuG,IAAsBvG,IAAMoH,GACrC,IAAID,GAAqBnH,CAAC,EAC1ByG,GAA4BzG,CAAC,CACrC,EAEkBlO,GAAWqS,EAAwB,GAAKmC,KAA2B,OAAO,WAAW,CACnGe,GAAaf,GAAuB,KAE/BH,IAEHxM,GAAc2M,GAAwB,OAAQ,SAAcmC,EAAaC,EAAY,CACnF,IAAInI,EAAO,KACX,OAAO,IAAIgG,GAAmB,SAAU9B,EAASK,EAAQ,CACvD/U,GAAKsX,GAAY9G,EAAMkE,EAASK,CAAM,CAChD,CAAS,EAAE,KAAK2D,EAAaC,CAAU,CAEvC,EAAS,CAAE,OAAQ,GAAM,EAIrB,GAAI,CACF,OAAOpC,GAAuB,WACpC,MAAoB,CAAA,CAGZnB,IACFA,GAAemB,GAAwBE,EAAgB,CAE7D,CAKAtB,GAAE,CAAE,OAAQ,GAAM,YAAa,GAAM,KAAM,GAAM,OAAQZ,IAA8B,CACrF,QAASiC,EACX,CAAC,EAEDa,GAAiBvJ,GAAK,QAEtBU,GAAegI,GAAoBL,GAAS,EAAW,EACvDvH,GAAWuH,EAAO,ECnSlB,IAAAyC,GAAiB,CAAA,ECAbnT,GAAkB9F,EAClBkZ,GAAY1X,GAEZ2X,GAAWrT,GAAgB,UAAU,EACrCsT,GAAiB,MAAM,UAG3BC,GAAiB,SAAU3Z,EAAI,CAC7B,OAAOA,IAAO,SAAcwZ,GAAU,QAAUxZ,GAAM0Z,GAAeD,EAAQ,IAAMzZ,EACrF,ECTI+B,GAAUzB,GACVoE,GAAY5C,GACZM,GAAoBJ,GACpBwX,GAAYnV,GACZ+B,GAAkBL,EAElB0T,GAAWrT,GAAgB,UAAU,EAEzCwT,GAAiB,SAAU5Z,EAAI,CAC7B,GAAI,CAACoC,GAAkBpC,CAAE,EAAG,OAAO0E,GAAU1E,EAAIyZ,EAAQ,GACpD/U,GAAU1E,EAAI,YAAY,GAC1BwZ,GAAUzX,GAAQ/B,CAAE,CAAC,CAC5B,ECZIW,GAAOL,EACPmE,GAAY3C,GACZ2F,GAAWzF,EACXwC,GAAcH,GACduV,GAAoB7T,GAEpB1D,GAAa,UAEjBwX,GAAiB,SAAUlX,EAAUmX,EAAe,CAClD,IAAIC,EAAiB,UAAU,OAAS,EAAIH,GAAkBjX,CAAQ,EAAImX,EAC1E,GAAIrV,GAAUsV,CAAc,EAAG,OAAOtS,GAAS9G,GAAKoZ,EAAgBpX,CAAQ,CAAC,EAC7E,MAAM,IAAIN,GAAWmC,GAAY7B,CAAQ,EAAI,kBAAkB,CACjE,ECZIhC,GAAOL,EACPmH,GAAW3F,EACX4C,GAAY1C,GAEhBgY,GAAiB,SAAUC,EAAUC,EAAM7Y,EAAO,CAChD,IAAI8Y,EAAaC,EACjB3S,GAASwS,CAAQ,EACjB,GAAI,CAEF,GADAE,EAAczV,GAAUuV,EAAU,QAAQ,EACtC,CAACE,EAAa,CAChB,GAAID,IAAS,QAAS,MAAM7Y,EAC5B,OAAOA,CACb,CACI8Y,EAAcxZ,GAAKwZ,EAAaF,CAAQ,CAC5C,OAAWxF,EAAO,CACd2F,EAAa,GACbD,EAAc1F,CAClB,CACE,GAAIyF,IAAS,QAAS,MAAM7Y,EAC5B,GAAI+Y,EAAY,MAAMD,EACtB1S,OAAAA,GAAS0S,CAAW,EACb9Y,CACT,ECtBI4P,GAAO3Q,GACPK,GAAOmB,EACP2F,GAAWzF,EACXwC,GAAcH,GACdsV,GAAwB5T,GACxB0F,GAAoBzF,GACpB7B,GAAgB+C,GAChB2S,GAAczS,GACdwS,GAAoBlI,GACpBsI,GAAgBrI,GAEhBtP,GAAa,UAEbgY,GAAS,SAAUC,EAAS7T,EAAQ,CACtC,KAAK,QAAU6T,EACf,KAAK,OAAS7T,CAChB,EAEI8T,GAAkBF,GAAO,UAE7BG,GAAiB,SAAUC,EAAUC,EAAiBpQ,EAAS,CAC7D,IAAI6G,EAAO7G,GAAWA,EAAQ,KAC1BqQ,EAAa,CAAC,EAAErQ,GAAWA,EAAQ,YACnCsQ,EAAY,CAAC,EAAEtQ,GAAWA,EAAQ,WAClCuQ,EAAc,CAAC,EAAEvQ,GAAWA,EAAQ,aACpCwQ,EAAc,CAAC,EAAExQ,GAAWA,EAAQ,aACpC7I,EAAKwP,GAAKyJ,EAAiBvJ,CAAI,EAC/B8I,EAAUc,EAAQ3P,EAAOC,EAAQ5E,EAAQgN,EAAMuH,EAE/CC,EAAO,SAAUC,EAAW,CAC9B,OAAIjB,GAAUD,GAAcC,EAAU,QAAQ,EACvC,IAAII,GAAO,GAAMa,CAAS,CACrC,EAEMC,EAAS,SAAU9Z,EAAO,CAC5B,OAAIsZ,GACFlT,GAASpG,CAAK,EACPyZ,EAAcrZ,EAAGJ,EAAM,CAAC,EAAGA,EAAM,CAAC,EAAG4Z,CAAI,EAAIxZ,EAAGJ,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,GAClEyZ,EAAcrZ,EAAGJ,EAAO4Z,CAAI,EAAIxZ,EAAGJ,CAAK,CACrD,EAEE,GAAIuZ,EACFX,EAAWQ,EAAS,iBACXI,EACTZ,EAAWQ,MACN,CAEL,GADAM,EAASnB,GAAkBa,CAAQ,EAC/B,CAACM,EAAQ,MAAM,IAAI1Y,GAAWmC,GAAYiW,CAAQ,EAAI,kBAAkB,EAE5E,GAAId,GAAsBoB,CAAM,EAAG,CACjC,IAAK3P,EAAQ,EAAGC,EAASI,GAAkBgP,CAAQ,EAAGpP,EAASD,EAAOA,IAEpE,GADA3E,EAAS0U,EAAOV,EAASrP,CAAK,CAAC,EAC3B3E,GAAUtC,GAAcoW,GAAiB9T,CAAM,EAAG,OAAOA,EAC7D,OAAO,IAAI4T,GAAO,EAAK,CAC/B,CACIJ,EAAWJ,GAAYY,EAAUM,CAAM,CAC3C,CAGE,IADAtH,EAAOmH,EAAYH,EAAS,KAAOR,EAAS,KACrC,EAAEe,EAAOra,GAAK8S,EAAMwG,CAAQ,GAAG,MAAM,CAC1C,GAAI,CACFxT,EAAS0U,EAAOH,EAAK,KAAK,CAChC,OAAavG,EAAO,CACduF,GAAcC,EAAU,QAASxF,CAAK,CAC5C,CACI,GAAI,OAAOhO,GAAU,UAAYA,GAAUtC,GAAcoW,GAAiB9T,CAAM,EAAG,OAAOA,CAC9F,CAAI,OAAO,IAAI4T,GAAO,EAAK,CAC3B,ECnEIjU,GAAkB9F,EAElBmZ,GAAWrT,GAAgB,UAAU,EACrCgV,GAAe,GAEnB,GAAI,CACF,IAAI5K,GAAS,EACT6K,GAAqB,CACvB,KAAM,UAAY,CAChB,MAAO,CAAE,KAAM,CAAC,CAAC7K,IAAQ,CAC/B,EACI,OAAU,UAAY,CACpB4K,GAAe,EACrB,CACA,EAEEC,GAAmB5B,EAAQ,EAAI,UAAY,CACzC,OAAO,IACX,EAEE,MAAM,KAAK4B,GAAoB,UAAY,CAAE,KAAM,EAAE,CAAE,CACzD,MAAgB,CAAA,CAEhB,IAAAC,GAAiB,SAAUjb,EAAMkb,EAAc,CAC7C,GAAI,CACF,GAAI,CAACA,GAAgB,CAACH,GAAc,MAAO,EAC/C,MAAkB,CAAE,MAAO,EAAM,CAC/B,IAAII,EAAoB,GACxB,GAAI,CACF,IAAIpT,EAAS,CAAA,EAEbA,EAAOqR,EAAQ,EAAI,UAAY,CAC7B,MAAO,CACL,KAAM,UAAY,CAChB,MAAO,CAAE,KAAM+B,EAAoB,EAAI,CACjD,CACA,CACA,EACInb,EAAK+H,CAAM,CACf,MAAkB,CAAA,CAChB,OAAOoT,CACT,ECzCIzG,GAA2BzU,GAC3Bgb,GAA8BxZ,GAC9BoT,GAA6BlT,GAAsD,YAEvFyZ,GAAiBvG,IAA8B,CAACoG,GAA4B,SAAUb,EAAU,CAC9F1F,GAAyB,IAAI0F,CAAQ,EAAE,KAAK,OAAW,UAAY,CAAA,CAAe,CACpF,CAAC,ECNG3E,GAAIxV,GACJK,GAAOmB,EACP2C,GAAYzC,GACZ4U,GAA6BvS,GAC7BwQ,GAAU9O,GACVyU,GAAUxU,GACV0V,GAAsCxU,GAI1C4O,GAAE,CAAE,OAAQ,UAAW,KAAM,GAAM,OAAQ4F,IAAuC,CAChF,IAAK,SAAajB,EAAU,CAC1B,IAAI7J,EAAI,KACJ+K,EAAa/E,GAA2B,EAAEhG,CAAC,EAC3CyE,EAAUsG,EAAW,QACrBjG,EAASiG,EAAW,OACpBlV,EAASoO,GAAQ,UAAY,CAC/B,IAAI+G,EAAkBnX,GAAUmM,EAAE,OAAO,EACrCiL,EAAS,CAAA,EACTxJ,EAAU,EACVyJ,EAAY,EAChBtB,GAAQC,EAAU,SAAUpG,EAAS,CACnC,IAAIjJ,EAAQiH,IACR0J,EAAgB,GACpBD,IACAnb,GAAKib,EAAiBhL,EAAGyD,CAAO,EAAE,KAAK,SAAUhT,EAAO,CAClD0a,IACJA,EAAgB,GAChBF,EAAOzQ,CAAK,EAAI/J,EAChB,EAAEya,GAAazG,EAAQwG,CAAM,EACvC,EAAWnG,CAAM,CACjB,CAAO,EACD,EAAEoG,GAAazG,EAAQwG,CAAM,CACnC,CAAK,EACD,OAAIpV,EAAO,OAAOiP,EAAOjP,EAAO,KAAK,EAC9BkV,EAAW,OACtB,CACA,CAAC,ECrCD,IAAI7F,GAAIxV,GAEJ4U,GAA6BlT,GAAsD,YACnF+S,GAA2B1Q,GAC3BtB,GAAagD,GACbrD,GAAasD,EACbuE,GAAgBrD,GAEhBgQ,GAAyBnC,IAA4BA,GAAyB,UAIlFe,GAAE,CAAE,OAAQ,UAAW,MAAO,GAAM,OAAQZ,GAA4B,KAAM,IAAQ,CACpF,MAAS,SAAUoE,EAAY,CAC7B,OAAO,KAAK,KAAK,OAAWA,CAAU,CAC1C,CACA,CAAC,EAGD,GAAgB5W,GAAWqS,EAAwB,EAAG,CACpD,IAAI9R,GAASF,GAAW,SAAS,EAAE,UAAU,MACzCmU,GAAuB,QAAajU,IACtCsH,GAAc2M,GAAwB,QAASjU,GAAQ,CAAE,OAAQ,GAAM,CAE3E,CCxBA,IAAI6S,GAAIxV,GACJK,GAAOmB,EACP2C,GAAYzC,GACZ4U,GAA6BvS,GAC7BwQ,GAAU9O,GACVyU,GAAUxU,GACV0V,GAAsCxU,GAI1C4O,GAAE,CAAE,OAAQ,UAAW,KAAM,GAAM,OAAQ4F,IAAuC,CAChF,KAAM,SAAcjB,EAAU,CAC5B,IAAI7J,EAAI,KACJ+K,EAAa/E,GAA2B,EAAEhG,CAAC,EAC3C8E,EAASiG,EAAW,OACpBlV,EAASoO,GAAQ,UAAY,CAC/B,IAAI+G,EAAkBnX,GAAUmM,EAAE,OAAO,EACzC4J,GAAQC,EAAU,SAAUpG,EAAS,CACnC1T,GAAKib,EAAiBhL,EAAGyD,CAAO,EAAE,KAAKsH,EAAW,QAASjG,CAAM,CACzE,CAAO,CACP,CAAK,EACD,OAAIjP,EAAO,OAAOiP,EAAOjP,EAAO,KAAK,EAC9BkV,EAAW,OACtB,CACA,CAAC,ECxBD,IAAI7F,GAAIxV,GACJsW,GAA6B9U,GAC7BoT,GAA6BlT,GAAsD,YAIvF8T,GAAE,CAAE,OAAQ,UAAW,KAAM,GAAM,OAAQZ,IAA8B,CACvE,OAAQ,SAAgB8G,EAAG,CACzB,IAAIL,EAAa/E,GAA2B,EAAE,IAAI,EAC9CqF,EAAmBN,EAAW,OAClC,OAAAM,EAAiBD,CAAC,EACXL,EAAW,OACtB,CACA,CAAC,ECbD,IAAIlU,GAAWnH,EACXsC,GAAWd,GACX+T,GAAuB7T,GAE3Bka,GAAiB,SAAUtL,EAAGhG,EAAG,CAE/B,GADAnD,GAASmJ,CAAC,EACNhO,GAASgI,CAAC,GAAKA,EAAE,cAAgBgG,EAAG,OAAOhG,EAC/C,IAAIuR,EAAoBtG,GAAqB,EAAEjF,CAAC,EAC5CyE,EAAU8G,EAAkB,QAChC,OAAA9G,EAAQzK,CAAC,EACFuR,EAAkB,OAC3B,ECXIrG,GAAIxV,GACJyC,GAAajB,GAGboT,GAA6BnP,GAAsD,YACnFmW,GAAiBlW,GAEWjD,GAAW,SAAS,EAKpD+S,GAAE,CAAE,OAAQ,UAAW,KAAM,GAAM,OAAmBZ,IAA8B,CAClF,QAAS,SAAiBtK,EAAG,CAC3B,OAAOsR,GAAgG,KAAMtR,CAAC,CAClH,CACA,CAAC,ECjBD,SAASwR,GAAmBvR,EAAGwR,EAAGC,EAAG,EAAGC,EAAGC,EAAGC,EAAG,CAC/C,GAAI,CACF,IAAIpQ,EAAIxB,EAAE2R,CAAC,EAAEC,CAAC,EACZ,EAAIpQ,EAAE,KACV,OAASxB,EAAG,CACV,OAAO,KAAKyR,EAAEzR,CAAC,CACjB,CACAwB,EAAE,KAAOgQ,EAAE,CAAC,EAAI,QAAQ,QAAQ,CAAC,EAAE,KAAK,EAAGE,CAAC,CAC9C,CACA,SAASG,GAAkB7R,EAAG,CAC5B,OAAO,UAAY,CACjB,IAAIwR,EAAI,KACNC,EAAI,UACN,OAAO,IAAI,QAAQ,SAAU,EAAGC,EAAG,CACjC,IAAIC,EAAI3R,EAAE,MAAMwR,EAAGC,CAAC,EACpB,SAASK,EAAM9R,EAAG,CAChBuR,GAAmBI,EAAG,EAAGD,EAAGI,EAAOC,EAAQ,OAAQ/R,CAAC,CACtD,CACA,SAAS+R,EAAO/R,EAAG,CACjBuR,GAAmBI,EAAG,EAAGD,EAAGI,EAAOC,EAAQ,QAAS/R,CAAC,CACvD,CACA8R,EAAM,MAAM,CACd,CAAC,CACH,CACF,CCvBA,IAAI5a,GAAUzB,GAEVwD,GAAU,OAEdnC,GAAiB,SAAUgB,EAAU,CACnC,GAAIZ,GAAQY,CAAQ,IAAM,SAAU,MAAM,IAAI,UAAU,2CAA2C,EACnG,OAAOmB,GAAQnB,CAAQ,CACzB,ECPI8E,GAAWnH,EAIfuc,GAAiB,UAAY,CAC3B,IAAI1L,EAAO1J,GAAS,IAAI,EACpBhB,EAAS,GACb,OAAI0K,EAAK,aAAY1K,GAAU,KAC3B0K,EAAK,SAAQ1K,GAAU,KACvB0K,EAAK,aAAY1K,GAAU,KAC3B0K,EAAK,YAAW1K,GAAU,KAC1B0K,EAAK,SAAQ1K,GAAU,KACvB0K,EAAK,UAAS1K,GAAU,KACxB0K,EAAK,cAAa1K,GAAU,KAC5B0K,EAAK,SAAQ1K,GAAU,KACpBA,CACT,EChBIrG,GAAQE,EACRuC,GAAaf,EAGbgb,GAAUja,GAAW,OAErBka,GAAgB3c,GAAM,UAAY,CACpC,IAAI4c,EAAKF,GAAQ,IAAK,GAAG,EACzB,OAAAE,EAAG,UAAY,EACRA,EAAG,KAAK,MAAM,IAAM,IAC7B,CAAC,EAImBD,IAAiB3c,GAAM,UAAY,CACrD,MAAO,CAAC0c,GAAQ,IAAK,GAAG,EAAE,MAC5B,CAAC,EAED,IAAIG,GAAeF,IAAiB3c,GAAM,UAAY,CAEpD,IAAI4c,EAAKF,GAAQ,KAAM,IAAI,EAC3B,OAAAE,EAAG,UAAY,EACRA,EAAG,KAAK,KAAK,IAAM,IAC5B,CAAC,EAEDE,GAAiB,CACf,aAAcD,GAEd,cAAeF,EACjB,QC7BIxQ,GAAqBjM,GACrBgM,GAAcxK,GAKlBqb,GAAiB,OAAO,MAAQ,SAAc5V,EAAG,CAC/C,OAAOgF,GAAmBhF,EAAG+E,EAAW,CAC1C,ECRIxF,GAAcxG,GACdoH,GAA0B5F,GAC1BoG,GAAuBlG,GACvByF,GAAWpD,EACX7B,GAAkBuD,GAClBoX,GAAanX,GAKjBoX,GAAA,EAAYtW,IAAe,CAACY,GAA0B,OAAO,iBAAmB,SAA0BH,EAAG8V,EAAY,CACvH5V,GAASF,CAAC,EAMV,QALI+V,EAAQ9a,GAAgB6a,CAAU,EAClCzU,EAAOuU,GAAWE,CAAU,EAC5BhS,EAASzC,EAAK,OACdwC,EAAQ,EACRjG,EACGkG,EAASD,GAAOlD,GAAqB,EAAEX,EAAGpC,EAAMyD,EAAKwC,GAAO,EAAGkS,EAAMnY,CAAG,CAAC,EAChF,OAAOoC,CACT,EClBA,IAAIE,GAAWnH,EACXid,GAAyBzb,GACzBwK,GAActK,GACd8G,GAAazE,GACb+M,GAAOrL,GACPc,GAAwBb,GACxB6C,GAAY3B,GAEZsW,GAAK,IACLC,GAAK,IACLC,GAAY,YACZC,GAAS,SACTC,GAAW/U,GAAU,UAAU,EAE/BgV,GAAmB,UAAY,CAAA,EAE/BC,GAAY,SAAUC,EAAS,CACjC,OAAON,GAAKE,GAASH,GAAKO,EAAUN,GAAK,IAAME,GAASH,EAC1D,EAGIQ,GAA4B,SAAUC,EAAiB,CACzDA,EAAgB,MAAMH,GAAU,EAAE,CAAC,EACnCG,EAAgB,MAAK,EACrB,IAAIC,EAAOD,EAAgB,aAAa,OAExC,OAAAA,EAAkB,KACXC,CACT,EAGIC,GAA2B,UAAY,CAEzC,IAAIC,EAASvX,GAAsB,QAAQ,EACvCwX,EAAK,OAASV,GAAS,IACvBW,EACJ,OAAAF,EAAO,MAAM,QAAU,OACvBhN,GAAK,YAAYgN,CAAM,EAEvBA,EAAO,IAAM,OAAOC,CAAE,EACtBC,EAAiBF,EAAO,cAAc,SACtCE,EAAe,KAAI,EACnBA,EAAe,MAAMR,GAAU,mBAAmB,CAAC,EACnDQ,EAAe,MAAK,EACbA,EAAe,CACxB,EAOIL,GACAM,GAAkB,UAAY,CAChC,GAAI,CACFN,GAAkB,IAAI,cAAc,UAAU,CAClD,MAAkB,CAAA,CAChBM,GAAkB,OAAO,SAAY,IACjC,SAAS,QAAUN,GACjBD,GAA0BC,EAAe,EACzCE,GAAwB,EAC1BH,GAA0BC,EAAe,EAE7C,QADI5S,EAASiB,GAAY,OAClBjB,KAAU,OAAOkT,GAAgBb,EAAS,EAAEpR,GAAYjB,CAAM,CAAC,EACtE,OAAOkT,GAAe,CACxB,EAEAzV,GAAW8U,EAAQ,EAAI,OAKvBY,GAAiB,OAAO,QAAU,SAAgBjX,EAAG8V,EAAY,CAC/D,IAAI5W,EACJ,OAAIc,IAAM,MACRsW,GAAiBH,EAAS,EAAIjW,GAASF,CAAC,EACxCd,EAAS,IAAIoX,GACbA,GAAiBH,EAAS,EAAI,KAE9BjX,EAAOmX,EAAQ,EAAIrW,GACdd,EAAS8X,GAAe,EACxBlB,IAAe,OAAY5W,EAAS8W,GAAuB,EAAE9W,EAAQ4W,CAAU,CACxF,ECnFIjd,GAAQE,EACRuC,GAAaf,EAGbgb,GAAUja,GAAW,OAEzB4b,GAAiBre,GAAM,UAAY,CACjC,IAAI4c,EAAKF,GAAQ,IAAK,GAAG,EACzB,MAAO,EAAEE,EAAG,QAAUA,EAAG,KAAK;AAAA,CAAI,GAAKA,EAAG,QAAU,IACtD,CAAC,ECTG5c,GAAQE,EACRuC,GAAaf,EAGbgb,GAAUja,GAAW,OAEzB6b,GAAiBte,GAAM,UAAY,CACjC,IAAI4c,EAAKF,GAAQ,UAAW,GAAG,EAC/B,OAAOE,EAAG,KAAK,GAAG,EAAE,OAAO,IAAM,KAC/B,IAAI,QAAQA,EAAI,OAAO,IAAM,IACjC,CAAC,ECRGrc,GAAOL,EACPoB,GAAcI,EACdH,GAAWK,GACX6a,GAAcxY,GACdsa,GAAgB5Y,GAChBR,GAASS,GACT4Y,GAAS1X,GACT6C,GAAmB3C,GAAuC,IAC1DyX,GAAsBnN,GACtBoN,GAAkBnN,GAElBoN,GAAgBxZ,GAAO,wBAAyB,OAAO,UAAU,OAAO,EACxEyZ,GAAa,OAAO,UAAU,KAC9BC,GAAcD,GACdE,GAASxd,GAAY,GAAG,MAAM,EAC9BuK,GAAUvK,GAAY,GAAG,OAAO,EAChCsI,GAAUtI,GAAY,GAAG,OAAO,EAChCE,GAAcF,GAAY,GAAG,KAAK,EAElCyd,GAA4B,UAAY,CAC1C,IAAIC,EAAM,IACNC,EAAM,MACV1e,OAAAA,GAAKqe,GAAYI,EAAK,GAAG,EACzBze,GAAKqe,GAAYK,EAAK,GAAG,EAClBD,EAAI,YAAc,GAAKC,EAAI,YAAc,CAClD,EAAC,EAEGtC,GAAgB4B,GAAc,aAG9BW,GAAgB,OAAO,KAAK,EAAE,EAAE,CAAC,IAAM,OAEvCC,GAAQJ,IAA4BG,IAAiBvC,IAAiB8B,IAAuBC,GAE7FS,KACFN,GAAc,SAAcrR,EAAQ,CAClC,IAAIoP,EAAK,KACLxT,EAAQO,GAAiBiT,CAAE,EAC3BwC,EAAM7d,GAASiM,CAAM,EACrB6R,EAAMjW,EAAM,IACZ/C,EAAQiZ,EAAQC,EAAWjc,EAAO2I,EAAGjE,EAAQwX,EAEjD,GAAIH,EACF,OAAAA,EAAI,UAAYzC,EAAG,UACnBvW,EAAS9F,GAAKse,GAAaQ,EAAKD,CAAG,EACnCxC,EAAG,UAAYyC,EAAI,UACZhZ,EAGT,IAAIoZ,EAASrW,EAAM,OACfsW,EAAS/C,IAAiBC,EAAG,OAC7B+C,EAAQpf,GAAKkc,GAAaG,CAAE,EAC5B9P,EAAS8P,EAAG,OACZgD,EAAa,EACbC,EAAUT,EA+Cd,GA7CIM,IACFC,EAAQ/V,GAAQ+V,EAAO,IAAK,EAAE,EAC1B9T,GAAQ8T,EAAO,GAAG,IAAM,KAC1BA,GAAS,KAGXE,EAAUre,GAAY4d,EAAKxC,EAAG,SAAS,EAEnCA,EAAG,UAAY,IAAM,CAACA,EAAG,WAAaA,EAAG,WAAakC,GAAOM,EAAKxC,EAAG,UAAY,CAAC,IAAM;AAAA,KAC1F9P,EAAS,OAASA,EAAS,IAC3B+S,EAAU,IAAMA,EAChBD,KAIFN,EAAS,IAAI,OAAO,OAASxS,EAAS,IAAK6S,CAAK,GAG9CT,KACFI,EAAS,IAAI,OAAO,IAAMxS,EAAS,WAAY6S,CAAK,GAElDZ,KAA0BQ,EAAY3C,EAAG,WAE7CtZ,EAAQ/C,GAAKqe,GAAYc,EAASJ,EAAS1C,EAAIiD,CAAO,EAElDH,EACEpc,GACFA,EAAM,MAAQ9B,GAAY8B,EAAM,MAAOsc,CAAU,EACjDtc,EAAM,CAAC,EAAI9B,GAAY8B,EAAM,CAAC,EAAGsc,CAAU,EAC3Ctc,EAAM,MAAQsZ,EAAG,UACjBA,EAAG,WAAatZ,EAAM,CAAC,EAAE,QACpBsZ,EAAG,UAAY,EACbmC,IAA4Bzb,IACrCsZ,EAAG,UAAYA,EAAG,OAAStZ,EAAM,MAAQA,EAAM,CAAC,EAAE,OAASic,GAEzDL,IAAiB5b,GAASA,EAAM,OAAS,GAG3C/C,GAAKoe,GAAerb,EAAM,CAAC,EAAGgc,EAAQ,UAAY,CAChD,IAAKrT,EAAI,EAAGA,EAAI,UAAU,OAAS,EAAGA,IAChC,UAAUA,CAAC,IAAM,SAAW3I,EAAM2I,CAAC,EAAI,OAErD,CAAO,EAGC3I,GAASmc,EAEX,IADAnc,EAAM,OAAS0E,EAASwW,GAAO,IAAI,EAC9BvS,EAAI,EAAGA,EAAIwT,EAAO,OAAQxT,IAC7BuT,EAAQC,EAAOxT,CAAC,EAChBjE,EAAOwX,EAAM,CAAC,CAAC,EAAIlc,EAAMkc,EAAM,CAAC,CAAC,EAIrC,OAAOlc,CACX,GAGA,IAAAwc,GAAiBjB,GCnHbnJ,GAAIxV,GACJD,GAAOyB,GAIXgU,GAAE,CAAE,OAAQ,SAAU,MAAO,GAAM,OAAQ,IAAI,OAASzV,IAAQ,CAC9D,KAAMA,EACR,CAAC,ECLD,IAAIM,GAAOmB,EACPyI,GAAgBvI,GAChBke,GAAa7b,GACbjE,GAAQ2F,EACRK,GAAkBJ,EAClBmC,GAA8BjB,GAE9BoI,GAAUlJ,GAAgB,SAAS,EACnC+Z,GAAkB,OAAO,UAE7BC,GAAiB,SAAUC,EAAKhgB,EAAM6N,EAAQoS,EAAM,CAClD,IAAIC,EAASna,GAAgBia,CAAG,EAE5BG,EAAsB,CAACpgB,GAAM,UAAY,CAE3C,IAAImH,EAAI,CAAA,EAER,OAAAA,EAAEgZ,CAAM,EAAI,UAAY,CAAE,MAAO,EAAE,EAC5B,GAAGF,CAAG,EAAE9Y,CAAC,IAAM,CAC1B,CAAG,EAEGkZ,EAAoBD,GAAuB,CAACpgB,GAAM,UAAY,CAEhE,IAAIsgB,EAAa,GACb1D,EAAK,IAET,GAAIqD,IAAQ,QAAS,CAMnB,IAAI9K,EAAc,CAAA,EAElBA,EAAYjG,EAAO,EAAI,UAAY,CAAE,OAAO0N,CAAG,EAC/CA,EAAK,CAAE,YAAazH,EAAa,MAAO,EAAE,EAE1CyH,EAAGuD,CAAM,EAAI,IAAIA,CAAM,CAC7B,CAEI,OAAAvD,EAAG,KAAO,UAAY,CACpB,OAAA0D,EAAa,GACN,IACb,EAEI1D,EAAGuD,CAAM,EAAE,EAAE,EACN,CAACG,CACZ,CAAG,EAED,GACE,CAACF,GACD,CAACC,GACDvS,EACA,CACA,IAAIyS,EAAqB,IAAIJ,CAAM,EAC/BK,EAAUvgB,EAAKkgB,EAAQ,GAAGF,CAAG,EAAG,SAAUQ,EAAcC,EAAQtB,EAAKuB,EAAMC,EAAmB,CAChG,IAAIC,EAAQH,EAAO,KACnB,OAAIG,IAAUf,IAAce,IAAUd,GAAgB,KAChDK,GAAuB,CAACQ,EAInB,CAAE,KAAM,GAAM,MAAOrgB,GAAKggB,EAAoBG,EAAQtB,EAAKuB,CAAI,CAAC,EAElE,CAAE,KAAM,GAAM,MAAOpgB,GAAKkgB,EAAcrB,EAAKsB,EAAQC,CAAI,CAAC,EAE5D,CAAE,KAAM,EAAK,CAC1B,CAAK,EAEDxW,GAAc,OAAO,UAAW8V,EAAKO,EAAQ,CAAC,CAAC,EAC/CrW,GAAc4V,GAAiBI,EAAQK,EAAQ,CAAC,CAAC,CACrD,CAEMN,GAAMnY,GAA4BgY,GAAgBI,CAAM,EAAG,OAAQ,EAAI,CAC7E,EC5EI7e,GAAcpB,EACdyK,GAAsBjJ,GACtBH,GAAWK,GACXM,GAAyB+B,GAEzB6a,GAASxd,GAAY,GAAG,MAAM,EAC9Bwf,GAAaxf,GAAY,GAAG,UAAU,EACtCE,GAAcF,GAAY,GAAG,KAAK,EAElCiK,GAAe,SAAUwV,EAAmB,CAC9C,OAAO,SAAUtV,EAAOuV,EAAK,CAC3B,IAAIvQ,EAAIlP,GAASW,GAAuBuJ,CAAK,CAAC,EAC1CwV,EAAWtW,GAAoBqW,CAAG,EAClCE,EAAOzQ,EAAE,OACT0Q,EAAOC,EACX,OAAIH,EAAW,GAAKA,GAAYC,EAAaH,EAAoB,GAAK,QACtEI,EAAQL,GAAWrQ,EAAGwQ,CAAQ,EACvBE,EAAQ,OAAUA,EAAQ,OAAUF,EAAW,IAAMC,IACtDE,EAASN,GAAWrQ,EAAGwQ,EAAW,CAAC,GAAK,OAAUG,EAAS,MAC3DL,EACEjC,GAAOrO,EAAGwQ,CAAQ,EAClBE,EACFJ,EACEvf,GAAYiP,EAAGwQ,EAAUA,EAAW,CAAC,GACpCE,EAAQ,OAAU,KAAOC,EAAS,OAAU,MACzD,CACA,EAEAC,GAAiB,CAMf,OAAQ9V,GAAa,EAAI,CAC3B,ECnCIuT,GAAS5e,GAAyC,OAItDohB,GAAiB,SAAU7Q,EAAGzF,EAAOuW,EAAS,CAC5C,OAAOvW,GAASuW,EAAUzC,GAAOrO,EAAGzF,CAAK,EAAE,OAAS,EACtD,ECNIvI,GAAavC,EACbF,GAAQ0B,EAGR8f,GAAS/e,GAAW,OAEpBgf,GAA0B,CAACzhB,GAAM,UAAY,CAC/C,IAAI0hB,EAAkB,GACtB,GAAI,CACFF,GAAO,IAAK,GAAG,CACnB,MAAkB,CACdE,EAAkB,EACtB,CAEE,IAAIva,EAAI,CAAA,EAEJwa,EAAQ,GACRC,EAAWF,EAAkB,SAAW,QAExCG,EAAY,SAAU9c,EAAK+c,EAAK,CAElC,OAAO,eAAe3a,EAAGpC,EAAK,CAAE,IAAK,UAAY,CAC/C,OAAA4c,GAASG,EACF,EACb,EAAO,CACP,EAEMC,EAAQ,CACV,OAAQ,IACR,OAAQ,IACR,WAAY,IACZ,UAAW,IACX,OAAQ,GACZ,EAEML,IAAiBK,EAAM,WAAa,KAExC,QAAShd,KAAOgd,EAAOF,EAAU9c,EAAKgd,EAAMhd,CAAG,CAAC,EAGhD,IAAIsB,EAAS,OAAO,yBAAyBmb,GAAO,UAAW,OAAO,EAAE,IAAI,KAAKra,CAAC,EAElF,OAAOd,IAAWub,GAAYD,IAAUC,CAC1C,CAAC,EAEDI,GAAiB,CAAE,QAASP,EAAuB,EC7C/ClhB,GAAOL,EACPwF,GAAShE,GACTqC,GAAgBnC,GAChBqgB,GAAuBhe,GACvBie,GAAkCvc,GAElCoa,GAAkB,OAAO,UAE7BoC,GAAiBF,GAAqB,QAAU,SAAUriB,EAAI,CAC5D,OAAOA,EAAG,KACZ,EAAI,SAAUA,EAAI,CAChB,MAAQ,CAACqiB,GAAqB,SAAWle,GAAcgc,GAAiBngB,CAAE,GAAK,CAAC8F,GAAO9F,EAAI,OAAO,EAC9FW,GAAK2hB,GAAiCtiB,CAAE,EACxCA,EAAG,KACT,ECdIW,GAAOL,EACPmH,GAAW3F,EACXY,GAAaV,EACbD,GAAUsC,GACV6b,GAAana,GAEb1D,GAAa,UAIjBmgB,GAAiB,SAAUC,EAAG5R,EAAG,CAC/B,IAAIxQ,EAAOoiB,EAAE,KACb,GAAI/f,GAAWrC,CAAI,EAAG,CACpB,IAAIoG,EAAS9F,GAAKN,EAAMoiB,EAAG5R,CAAC,EAC5B,OAAIpK,IAAW,MAAMgB,GAAShB,CAAM,EAC7BA,CACX,CACE,GAAI1E,GAAQ0gB,CAAC,IAAM,SAAU,OAAO9hB,GAAKuf,GAAYuC,EAAG5R,CAAC,EACzD,MAAM,IAAIxO,GAAW,6CAA6C,CACpE,ECnBI1B,GAAOL,EACPoB,GAAcI,EACd4gB,GAAgC1gB,GAChCyF,GAAWpD,EACXzB,GAAWmD,GACXwF,GAAWvF,GACXrE,GAAWuF,GACX5E,GAAyB8E,GACzB1C,GAAYgN,GACZgQ,GAAqB/P,GACrBgR,GAAiB9Q,GACjB+Q,GAAa7Q,GAEb8Q,GAAgBnhB,GAAY,GAAG,OAAO,EAG1CghB,GAA8B,QAAS,SAAUI,EAAOC,EAAaC,EAAiB,CACpF,MAAO,CAGL,SAAelC,EAAQ,CACrB,IAAIvZ,EAAIjF,GAAuB,IAAI,EAC/B2gB,EAAUrgB,GAASke,CAAM,EAAIpc,GAAUoc,EAAQgC,CAAK,EAAI,OAC5D,OAAOG,EAAUtiB,GAAKsiB,EAASnC,EAAQvZ,CAAC,EAAI,IAAI,OAAOuZ,CAAM,EAAEgC,CAAK,EAAEnhB,GAAS4F,CAAC,CAAC,CACvF,EAGI,SAAUqG,EAAQ,CAChB,IAAIsV,EAAKzb,GAAS,IAAI,EAClBoJ,EAAIlP,GAASiM,CAAM,EACnBuV,EAAMH,EAAgBD,EAAaG,EAAIrS,CAAC,EAE5C,GAAIsS,EAAI,KAAM,OAAOA,EAAI,MAEzB,IAAIpD,EAAQpe,GAASghB,GAAeO,CAAE,CAAC,EAEvC,GAAIL,GAAc9C,EAAO,GAAG,IAAM,GAAI,OAAO6C,GAAWM,EAAIrS,CAAC,EAE7D,IAAIuS,EAAcP,GAAc9C,EAAO,GAAG,IAAM,GAChDmD,EAAG,UAAY,EAIf,QAHIG,EAAI,CAAA,EACJxY,EAAI,EACJpE,GACIA,EAASmc,GAAWM,EAAIrS,CAAC,KAAO,MAAM,CAC5C,IAAIyS,EAAW3hB,GAAS8E,EAAO,CAAC,CAAC,EACjC4c,EAAExY,CAAC,EAAIyY,EACHA,IAAa,KAAIJ,EAAG,UAAYxB,GAAmB7Q,EAAGtF,GAAS2X,EAAG,SAAS,EAAGE,CAAW,GAC7FvY,GACR,CACM,OAAOA,IAAM,EAAI,KAAOwY,CAC9B,CACA,CACA,CAAC,ECpDD,IAAI3hB,GAAcpB,EACdkF,GAAW1D,GAEX4I,GAAQ,KAAK,MACbwU,GAASxd,GAAY,GAAG,MAAM,EAC9BsI,GAAUtI,GAAY,GAAG,OAAO,EAChCE,GAAcF,GAAY,GAAG,KAAK,EAElC6hB,GAAuB,8BACvBC,GAAgC,sBAIpCC,GAAiB,SAAUC,EAASlE,EAAK6B,EAAUsC,EAAUC,EAAexW,EAAa,CACvF,IAAIyW,EAAUxC,EAAWqC,EAAQ,OAC7BI,EAAIH,EAAS,OACbI,EAAUP,GACd,OAAII,IAAkB,SACpBA,EAAgBpe,GAASoe,CAAa,EACtCG,EAAUR,IAELvZ,GAAQoD,EAAa2W,EAAS,SAAUrgB,EAAOsgB,EAAI,CACxD,IAAIC,EACJ,OAAQ/E,GAAO8E,EAAI,CAAC,EAAC,CACnB,IAAK,IAAK,MAAO,IACjB,IAAK,IAAK,OAAON,EACjB,IAAK,IAAK,OAAO9hB,GAAY4d,EAAK,EAAG6B,CAAQ,EAC7C,IAAK,IAAK,OAAOzf,GAAY4d,EAAKqE,CAAO,EACzC,IAAK,IACHI,EAAUL,EAAchiB,GAAYoiB,EAAI,EAAG,EAAE,CAAC,EAC9C,MACF,QACE,IAAInZ,EAAI,CAACmZ,EACT,GAAInZ,IAAM,EAAG,OAAOnH,EACpB,GAAImH,EAAIiZ,EAAG,CACT,IAAII,EAAIxZ,GAAMG,EAAI,EAAE,EACpB,OAAIqZ,IAAM,EAAUxgB,EAChBwgB,GAAKJ,EAAUH,EAASO,EAAI,CAAC,IAAM,OAAYhF,GAAO8E,EAAI,CAAC,EAAIL,EAASO,EAAI,CAAC,EAAIhF,GAAO8E,EAAI,CAAC,EAC1FtgB,CACjB,CACQugB,EAAUN,EAAS9Y,EAAI,CAAC,CAChC,CACI,OAAOoZ,IAAY,OAAY,GAAKA,CACxC,CAAG,CACH,EC5CInT,GAAQxQ,GACRK,GAAOmB,EACPJ,GAAcM,EACd0gB,GAAgCre,GAChCjE,GAAQ2F,EACR0B,GAAWzB,EACXtD,GAAawE,EACbtE,GAAWwE,GACX2D,GAAsB2G,GACtBnG,GAAWoG,GACXhQ,GAAWkQ,GACXvP,GAAyByP,GACzB2P,GAAqB1L,GACrBtR,GAAYuR,GACZwN,GAAkBvN,GAClByM,GAAiBxM,GACjByM,GAAaxM,GACbhQ,GAAkBiQ,EAElB8N,GAAU/d,GAAgB,SAAS,EACnC6E,GAAM,KAAK,IACXC,GAAM,KAAK,IACX0B,GAASlL,GAAY,CAAA,EAAG,MAAM,EAC9BwK,GAAOxK,GAAY,CAAA,EAAG,IAAI,EAC1BmhB,GAAgBnhB,GAAY,GAAG,OAAO,EACtCE,GAAcF,GAAY,GAAG,KAAK,EAElC0iB,GAAgB,SAAUpkB,EAAI,CAChC,OAAOA,IAAO,OAAYA,EAAK,OAAOA,CAAE,CAC1C,EAIIqkB,GAAoB,UAAY,CAElC,MAAO,IAAI,QAAQ,IAAK,IAAI,IAAM,IACpC,EAAC,EAGGC,GAAgD,UAAY,CAC9D,MAAI,IAAIH,EAAO,EACN,IAAIA,EAAO,EAAE,IAAK,IAAI,IAAM,GAE9B,EACT,EAAC,EAEGI,GAAgC,CAACnkB,GAAM,UAAY,CACrD,IAAI4c,EAAK,IACT,OAAAA,EAAG,KAAO,UAAY,CACpB,IAAIvW,EAAS,CAAA,EACb,OAAAA,EAAO,OAAS,CAAE,EAAG,GAAG,EACjBA,CACX,EAES,GAAG,QAAQuW,EAAI,MAAM,IAAM,GACpC,CAAC,EAGD0F,GAA8B,UAAW,SAAU8B,EAAGzF,EAAeiE,EAAiB,CACpF,IAAIyB,EAAoBH,GAA+C,IAAM,KAE7E,MAAO,CAGL,SAAiBI,EAAaC,EAAc,CAC1C,IAAIpd,EAAIjF,GAAuB,IAAI,EAC/BsiB,EAAWhiB,GAAS8hB,CAAW,EAAIhgB,GAAUggB,EAAaP,EAAO,EAAI,OACzE,OAAOS,EACHjkB,GAAKikB,EAAUF,EAAand,EAAGod,CAAY,EAC3ChkB,GAAKoe,EAAepd,GAAS4F,CAAC,EAAGmd,EAAaC,CAAY,CACpE,EAGI,SAAU/W,EAAQ+W,EAAc,CAC9B,IAAIzB,EAAKzb,GAAS,IAAI,EAClBoJ,EAAIlP,GAASiM,CAAM,EAEvB,GACE,OAAO+W,GAAgB,UACvB9B,GAAc8B,EAAcF,CAAiB,IAAM,IACnD5B,GAAc8B,EAAc,IAAI,IAAM,GACtC,CACA,IAAIxB,EAAMH,EAAgBjE,EAAemE,EAAIrS,EAAG8T,CAAY,EAC5D,GAAIxB,EAAI,KAAM,OAAOA,EAAI,KACjC,CAEM,IAAI0B,EAAoBniB,GAAWiiB,CAAY,EAC1CE,IAAmBF,EAAehjB,GAASgjB,CAAY,GAE5D,IAAI5E,EAAQpe,GAASghB,GAAeO,CAAE,CAAC,EACnChjB,EAAS2iB,GAAc9C,EAAO,GAAG,IAAM,GACvCqD,EACAljB,IACFkjB,EAAcP,GAAc9C,EAAO,GAAG,IAAM,GAC5CmD,EAAG,UAAY,GAKjB,QAFI4B,EAAU,CAAA,EACVre,EAEFA,EAASmc,GAAWM,EAAIrS,CAAC,EACrB,EAAApK,IAAW,OAEfyF,GAAK4Y,EAASre,CAAM,EAChB,CAACvG,KALM,CAOX,IAAIojB,EAAW3hB,GAAS8E,EAAO,CAAC,CAAC,EAC7B6c,IAAa,KAAIJ,EAAG,UAAYxB,GAAmB7Q,EAAGtF,GAAS2X,EAAG,SAAS,EAAGE,CAAW,EACrG,CAIM,QAFI2B,EAAoB,GACpBC,EAAqB,EAChB3Y,EAAI,EAAGA,EAAIyY,EAAQ,OAAQzY,IAAK,CACvC5F,EAASqe,EAAQzY,CAAC,EAWlB,QATIqX,EAAU/hB,GAAS8E,EAAO,CAAC,CAAC,EAC5B4a,EAAWpW,GAAIC,GAAIH,GAAoBtE,EAAO,KAAK,EAAGoK,EAAE,MAAM,EAAG,CAAC,EAClE8S,EAAW,CAAA,EACXvW,EAMK6X,EAAI,EAAGA,EAAIxe,EAAO,OAAQwe,IAAK/Y,GAAKyX,EAAUS,GAAc3d,EAAOwe,CAAC,CAAC,CAAC,EAC/E,IAAIrB,EAAgBnd,EAAO,OAC3B,GAAIoe,EAAmB,CACrB,IAAIK,EAAetY,GAAO,CAAC8W,CAAO,EAAGC,EAAUtC,EAAUxQ,CAAC,EACtD+S,IAAkB,QAAW1X,GAAKgZ,EAActB,CAAa,EACjExW,EAAczL,GAASmP,GAAM6T,EAAc,OAAWO,CAAY,CAAC,CAC7E,MACU9X,EAAcqW,GAAgBC,EAAS7S,EAAGwQ,EAAUsC,EAAUC,EAAee,CAAY,EAEvFtD,GAAY2D,IACdD,GAAqBnjB,GAAYiP,EAAGmU,EAAoB3D,CAAQ,EAAIjU,EACpE4X,EAAqB3D,EAAWqC,EAAQ,OAElD,CAEM,OAAOqB,EAAoBnjB,GAAYiP,EAAGmU,CAAkB,CAClE,CACA,CACA,EAAG,CAACT,IAAiC,CAACF,IAAoBC,EAA4C,EC9ItG,IAAI1hB,GAAWtC,GACXyB,GAAUD,GACVsE,GAAkBpE,EAElB8gB,GAAQ1c,GAAgB,OAAO,EAInC+e,GAAiB,SAAUnlB,EAAI,CAC7B,IAAIolB,EACJ,OAAOxiB,GAAS5C,CAAE,KAAOolB,EAAWplB,EAAG8iB,EAAK,KAAO,OAAY,CAAC,CAACsC,EAAWrjB,GAAQ/B,CAAE,IAAM,SAC9F,ECXIolB,GAAW9kB,GAEX+B,GAAa,UAEjBgjB,GAAiB,SAAUrlB,EAAI,CAC7B,GAAIolB,GAASplB,CAAE,EACb,MAAM,IAAIqC,GAAW,+CAA+C,EACpE,OAAOrC,CACX,ECRIoG,GAAkB9F,EAElBwiB,GAAQ1c,GAAgB,OAAO,EAEnCkf,GAAiB,SAAUC,EAAa,CACtC,IAAIzE,EAAS,IACb,GAAI,CACF,MAAMyE,CAAW,EAAEzE,CAAM,CAC7B,MAAmB,CACf,GAAI,CACF,OAAAA,EAAOgC,EAAK,EAAI,GACT,MAAMyC,CAAW,EAAEzE,CAAM,CACtC,MAAqB,CAAA,CACrB,CAAI,MAAO,EACX,ECdIhL,GAAIxV,GACJoB,GAAcI,GACdhB,GAA2BkB,GAA2D,EACtFuJ,GAAWlH,GACX1C,GAAWoE,GACXyf,GAAaxf,GACb1D,GAAyB4E,GACzBue,GAAuBre,GAGvBxF,GAAcF,GAAY,GAAG,KAAK,EAClCwJ,GAAM,KAAK,IAEXwa,GAA0BD,GAAqB,YAAY,EAE3DE,GAA+B,CAACD,IAA2B,CAAC,CAAC,UAAY,CAC3E,IAAIxkB,EAAaJ,GAAyB,OAAO,UAAW,YAAY,EACxE,OAAOI,GAAc,CAACA,EAAW,QACnC,EAAC,EAID4U,GAAE,CAAE,OAAQ,SAAU,MAAO,GAAM,OAAQ,CAAC6P,IAAoB,CAACD,IAA2B,CAC1F,WAAY,SAAoBE,EAAmC,CACjE,IAAIzU,EAAOxP,GAASW,GAAuB,IAAI,CAAC,EAChDkjB,GAAWI,CAAY,EACvB,IAAIxa,EAAQG,GAASL,GAAI,UAAU,OAAS,EAAI,UAAU,CAAC,EAAI,OAAWiG,EAAK,MAAM,CAAC,EAClF0U,EAASlkB,GAASikB,CAAY,EAClC,OAAOhkB,GAAYuP,EAAM/F,EAAOA,EAAQya,EAAO,MAAM,IAAMA,CAC/D,CACA,CAAC,EC9BD,IAAIzf,GAAkB9F,EAClBse,GAAS9c,GACTmD,GAAiBjD,GAA+C,EAEhE8jB,GAAc1f,GAAgB,aAAa,EAC3CsT,GAAiB,MAAM,UAIvBA,GAAeoM,EAAW,IAAM,QAClC7gB,GAAeyU,GAAgBoM,GAAa,CAC1C,aAAc,GACd,MAAOlH,GAAO,IAAI,CACtB,CAAG,MAIHmH,GAAiB,SAAU5gB,EAAK,CAC9BuU,GAAeoM,EAAW,EAAE3gB,CAAG,EAAI,EACrC,ECnBI/E,GAAQE,EAEZ0lB,GAAiB,CAAC5lB,GAAM,UAAY,CAClC,SAAS6lB,GAAI,CAAA,CACb,OAAAA,EAAE,UAAU,YAAc,KAEnB,OAAO,eAAe,IAAIA,CAAG,IAAMA,EAAE,SAC9C,CAAC,ECPGngB,GAASxF,GACToC,GAAaZ,EACb0D,GAAWxD,GACX6G,GAAYxE,GACZ6hB,GAA2BngB,GAE3B6X,GAAW/U,GAAU,UAAU,EAC/B5G,GAAU,OACVkkB,GAAkBlkB,GAAQ,UAK9BmkB,GAAiBF,GAA2BjkB,GAAQ,eAAiB,SAAUsF,EAAG,CAChF,IAAIa,EAAS5C,GAAS+B,CAAC,EACvB,GAAIzB,GAAOsC,EAAQwV,EAAQ,EAAG,OAAOxV,EAAOwV,EAAQ,EACpD,IAAIrI,EAAcnN,EAAO,YACzB,OAAI1F,GAAW6S,CAAW,GAAKnN,aAAkBmN,EACxCA,EAAY,UACZnN,aAAkBnG,GAAUkkB,GAAkB,IACzD,ECpBI/lB,GAAQE,EACRoC,GAAaZ,EACbc,GAAWZ,GAEXqkB,GAAiBtgB,GACjBwE,GAAgBvE,GAChBI,GAAkBc,EAGlBuS,GAAWrT,GAAgB,UAAU,EACrCkgB,GAAyB,GAIzBC,GAAmBC,GAAmCC,GAGtD,CAAA,EAAG,OACLA,GAAgB,CAAA,EAAG,KAAI,EAEjB,SAAUA,IAEdD,GAAoCH,GAAeA,GAAeI,EAAa,CAAC,EAC5ED,KAAsC,OAAO,YAAWD,GAAoBC,KAHlDF,GAAyB,IAO3D,IAAII,GAAyB,CAAC9jB,GAAS2jB,EAAiB,GAAKnmB,GAAM,UAAY,CAC7E,IAAIK,EAAO,CAAA,EAEX,OAAO8lB,GAAkB9M,EAAQ,EAAE,KAAKhZ,CAAI,IAAMA,CACpD,CAAC,EAEGimB,KAAwBH,GAAoB,CAAA,GAK3C7jB,GAAW6jB,GAAkB9M,EAAQ,CAAC,GACzClP,GAAcgc,GAAmB9M,GAAU,UAAY,CACrD,OAAO,IACX,CAAG,EAGH,IAAAkN,GAAiB,CACf,kBAAmBJ,GACnB,uBAAwBD,EAC1B,EC/CIC,GAAoBjmB,GAAuC,kBAC3Dse,GAAS9c,GACTX,GAA2Ba,GAC3BmN,GAAiB9K,GACjBmV,GAAYzT,GAEZ6gB,GAAa,UAAY,CAAE,OAAO,MAEtCC,GAAiB,SAAUC,EAAqBC,EAAMtT,EAAMuT,EAAiB,CAC3E,IAAI9X,EAAgB6X,EAAO,YAC3B,OAAAD,EAAoB,UAAYlI,GAAO2H,GAAmB,CAAE,KAAMplB,GAAyB,CAAC,CAAC6lB,EAAiBvT,CAAI,EAAG,EACrHtE,GAAe2X,EAAqB5X,EAAe,EAAW,EAC9DsK,GAAUtK,CAAa,EAAI0X,GACpBE,CACT,ECdIhR,GAAIxV,GACJK,GAAOmB,EAEPmlB,GAAe5iB,GACf3B,GAAaqD,EACbmhB,GAA4BlhB,GAC5BqgB,GAAiBnf,GACjB6O,GAAiB3O,GACjB+H,GAAiBuC,GACjBvJ,GAA8BwJ,GAC9BpH,GAAgBsH,GAChBzL,GAAkB2L,EAClByH,GAAYxD,GACZmR,GAAgBlR,GAEhBmR,GAAuBH,GAAa,OACpCrd,GAA6Bqd,GAAa,aAC1CV,GAAoBY,GAAc,kBAClCb,GAAyBa,GAAc,uBACvC1N,GAAWrT,GAAgB,UAAU,EACrCihB,GAAO,OACPC,GAAS,SACTC,GAAU,UAEVX,GAAa,UAAY,CAAE,OAAO,MAEtCY,GAAiB,SAAUC,EAAUV,EAAMD,EAAqBrT,EAAMiU,EAASC,EAAQzZ,EAAQ,CAC7FgZ,GAA0BJ,EAAqBC,EAAMtT,CAAI,EAEzD,IAAImU,EAAqB,SAAUC,EAAM,CACvC,GAAIA,IAASH,GAAWI,EAAiB,OAAOA,EAChD,GAAI,CAACxB,IAA0BuB,GAAQA,KAAQE,EAAmB,OAAOA,EAAkBF,CAAI,EAE/F,OAAQA,EAAI,CACV,KAAKR,GAAM,OAAO,UAAgB,CAAE,OAAO,IAAIP,EAAoB,KAAMe,CAAI,GAC7E,KAAKP,GAAQ,OAAO,UAAkB,CAAE,OAAO,IAAIR,EAAoB,KAAMe,CAAI,GACjF,KAAKN,GAAS,OAAO,UAAmB,CAAE,OAAO,IAAIT,EAAoB,KAAMe,CAAI,EACzF,CAEI,OAAO,UAAY,CAAE,OAAO,IAAIf,EAAoB,IAAI,CAAE,CAC9D,EAEM5X,EAAgB6X,EAAO,YACvBiB,EAAwB,GACxBD,EAAoBN,EAAS,UAC7BQ,EAAiBF,EAAkBtO,EAAQ,GAC1CsO,EAAkB,YAAY,GAC9BL,GAAWK,EAAkBL,CAAO,EACrCI,EAAkB,CAACxB,IAA0B2B,GAAkBL,EAAmBF,CAAO,EACzFQ,EAAoBnB,IAAS,SAAUgB,EAAkB,SAAWE,EACpEE,EAA0BvH,EAASP,EA8BvC,GA3BI6H,IACFC,EAA2B9B,GAAe6B,EAAkB,KAAK,IAAIT,CAAU,CAAC,EAC5EU,IAA6B,OAAO,WAAaA,EAAyB,OAC5D9B,GAAe8B,CAAwB,IAAM5B,KACvDxQ,GACFA,GAAeoS,EAA0B5B,EAAiB,EAChD7jB,GAAWylB,EAAyB1O,EAAQ,CAAC,GACvDlP,GAAc4d,EAA0B1O,GAAUmN,EAAU,GAIhEzX,GAAegZ,EAA0BjZ,EAAe,EAAU,IAMlEkY,IAAwBM,IAAYJ,IAAUW,GAAkBA,EAAe,OAASX,KAC1E1d,GACdzB,GAA4B4f,EAAmB,OAAQT,EAAM,GAE7DU,EAAwB,GACxBF,EAAkB,UAAkB,CAAE,OAAOnnB,GAAKsnB,EAAgB,IAAI,KAKtEP,EAMF,GALA9G,EAAU,CACR,OAAQgH,EAAmBN,EAAM,EACjC,KAAMK,EAASG,EAAkBF,EAAmBP,EAAI,EACxD,QAASO,EAAmBL,EAAO,CACzC,EACQrZ,EAAQ,IAAKmS,KAAOO,GAClB0F,IAA0B0B,GAAyB,EAAE3H,KAAO0H,KAC9Dxd,GAAcwd,EAAmB1H,EAAKO,EAAQP,CAAG,CAAC,OAE/CvK,GAAE,CAAE,OAAQiR,EAAM,MAAO,GAAM,OAAQT,IAA0B0B,CAAqB,EAAIpH,CAAO,EAI1G,OAA4BmH,EAAkBtO,EAAQ,IAAMqO,GAC1Dvd,GAAcwd,EAAmBtO,GAAUqO,EAAiB,CAAE,KAAMJ,EAAS,EAE/ElO,GAAUuN,CAAI,EAAIe,EAEXlH,CACT,EClGAwH,GAAiB,SAAU/mB,EAAOgnB,EAAM,CACtC,MAAO,CAAE,MAAOhnB,EAAO,KAAMgnB,CAAI,CACnC,ECJI7lB,GAAkBlC,GAClBylB,GAAmBjkB,GACnB0X,GAAYxX,GACZ6H,GAAsBxF,GACtBY,GAAiBc,GAA+C,EAChEuiB,GAAiBtiB,GACjBoiB,GAAyBlhB,GAEzBJ,GAAc4K,GAEd6W,GAAiB,iBACjBtR,GAAmBpN,GAAoB,IACvCE,GAAmBF,GAAoB,UAAU0e,EAAc,EAYnEC,GAAiBF,GAAe,MAAO,QAAS,SAAUG,EAAUvO,EAAM,CACxEjD,GAAiB,KAAM,CACrB,KAAMsR,GACN,OAAQ/lB,GAAgBimB,CAAQ,EAChC,MAAO,EACP,KAAMvO,CACV,CAAG,CAGH,EAAG,UAAY,CACb,IAAI1Q,EAAQO,GAAiB,IAAI,EAC7BkD,EAASzD,EAAM,OACf4B,EAAQ5B,EAAM,QAClB,GAAI,CAACyD,GAAU7B,GAAS6B,EAAO,OAC7B,OAAAzD,EAAM,OAAS,KACR4e,GAAuB,OAAW,EAAI,EAE/C,OAAQ5e,EAAM,KAAI,CAChB,IAAK,OAAQ,OAAO4e,GAAuBhd,EAAO,EAAK,EACvD,IAAK,SAAU,OAAOgd,GAAuBnb,EAAO7B,CAAK,EAAG,EAAK,CACrE,CAAI,OAAOgd,GAAuB,CAAChd,EAAO6B,EAAO7B,CAAK,CAAC,EAAG,EAAK,CAC/D,EAAG,QAAQ,EAKPyQ,GAASrC,GAAU,UAAYA,GAAU,MAG7CuM,GAAiB,MAAM,EACvBA,GAAiB,QAAQ,EACzBA,GAAiB,SAAS,EAG1B,GAAgBjf,IAAe+U,GAAO,OAAS,SAAU,GAAI,CAC3D5W,GAAe4W,GAAQ,OAAQ,CAAE,MAAO,QAAQ,CAAE,CACpD,MAAgB,CAAA,CC1DhB,IAAA6M,GAAiB,CACf,YAAa,EACb,oBAAqB,EACrB,aAAc,EACd,eAAgB,EAChB,YAAa,EACb,cAAe,EACf,aAAc,EACd,qBAAsB,EACtB,SAAU,EACV,kBAAmB,EACnB,eAAgB,EAChB,gBAAiB,EACjB,kBAAmB,EACnB,UAAW,EACX,cAAe,EACf,aAAc,EACd,SAAU,EACV,iBAAkB,EAClB,OAAQ,EACR,YAAa,EACb,cAAe,EACf,cAAe,EACf,eAAgB,EAChB,aAAc,EACd,cAAe,EACf,iBAAkB,EAClB,iBAAkB,EAClB,eAAgB,EAChB,iBAAkB,EAClB,cAAe,EACf,UAAW,CACb,ECjCI7hB,GAAwBvG,GAExBqoB,GAAY9hB,GAAsB,MAAM,EAAE,UAC1C+hB,GAAwBD,IAAaA,GAAU,aAAeA,GAAU,YAAY,UAExFE,GAAiBD,KAA0B,OAAO,UAAY,OAAYA,GCNtE/lB,GAAavC,EACbwoB,GAAehnB,GACf8mB,GAAwB5mB,GACxB+mB,GAAuB1kB,GACvB8D,GAA8BpC,GAC9BoJ,GAAiBnJ,GACjBI,GAAkBc,EAElBuS,GAAWrT,GAAgB,UAAU,EACrC4iB,GAAcD,GAAqB,OAEnCE,GAAkB,SAAUC,EAAqBC,EAAiB,CACpE,GAAID,EAAqB,CAEvB,GAAIA,EAAoBzP,EAAQ,IAAMuP,GAAa,GAAI,CACrD7gB,GAA4B+gB,EAAqBzP,GAAUuP,EAAW,CAC5E,MAAoB,CACdE,EAAoBzP,EAAQ,EAAIuP,EACtC,CAEI,GADA7Z,GAAe+Z,EAAqBC,EAAiB,EAAI,EACrDL,GAAaK,CAAe,GAAG,QAAS5D,KAAewD,GAEzD,GAAIG,EAAoB3D,CAAW,IAAMwD,GAAqBxD,CAAW,EAAG,GAAI,CAC9Epd,GAA4B+gB,EAAqB3D,EAAawD,GAAqBxD,CAAW,CAAC,CACvG,MAAsB,CACd2D,EAAoB3D,CAAW,EAAIwD,GAAqBxD,CAAW,CAC3E,EAEA,CACA,EAEA,QAAS4D,MAAmBL,GAC1BG,GAAgBpmB,GAAWsmB,EAAe,GAAKtmB,GAAWsmB,EAAe,EAAE,UAAWA,EAAe,EAGvGF,GAAgBL,GAAuB,cAAc,ECnCrD,IAAInkB,GAAYnE,GACZkF,GAAW1D,GACXS,GAAgBP,GAChByJ,GAAoBpH,GAEpBhC,GAAa,UAEb+mB,GAAe,8CAGfzd,GAAe,SAAU0d,EAAU,CACrC,OAAO,SAAUlY,EAAMmY,EAAYC,EAAiBC,EAAM,CACxD,IAAIjiB,EAAI/B,GAAS2L,CAAI,EACjBsY,EAAOlnB,GAAcgF,CAAC,EACtB8D,EAASI,GAAkBlE,CAAC,EAEhC,GADA9C,GAAU6kB,CAAU,EAChBje,IAAW,GAAKke,EAAkB,EAAG,MAAM,IAAIlnB,GAAW+mB,EAAY,EAC1E,IAAIhe,EAAQie,EAAWhe,EAAS,EAAI,EAChCgB,EAAIgd,EAAW,GAAK,EACxB,GAAIE,EAAkB,EAAG,OAAa,CACpC,GAAIne,KAASqe,EAAM,CACjBD,EAAOC,EAAKre,CAAK,EACjBA,GAASiB,EACT,KACR,CAEM,GADAjB,GAASiB,EACLgd,EAAWje,EAAQ,EAAIC,GAAUD,EACnC,MAAM,IAAI/I,GAAW+mB,EAAY,CAEzC,CACI,KAAMC,EAAWje,GAAS,EAAIC,EAASD,EAAOA,GAASiB,EAAOjB,KAASqe,IACrED,EAAOF,EAAWE,EAAMC,EAAKre,CAAK,EAAGA,EAAO7D,CAAC,GAE/C,OAAOiiB,CACX,CACA,EAEAE,GAAiB,CAGf,KAAM/d,GAAa,EAAK,CAI1B,EC5CIvL,GAAQE,EAEZqpB,GAAiB,SAAUpE,EAAa5iB,EAAU,CAChD,IAAIM,EAAS,CAAA,EAAGsiB,CAAW,EAC3B,MAAO,CAAC,CAACtiB,GAAU7C,GAAM,UAAY,CAEnC6C,EAAO,KAAK,KAAMN,GAAY,UAAY,CAAE,MAAO,IAAM,CAAC,CAC9D,CAAG,CACH,ECRImT,GAAIxV,GACJspB,GAAU9nB,GAAqC,KAC/C6nB,GAAsB3nB,GACtB6nB,GAAiBxlB,GACjByN,GAAU/L,GAIV+jB,GAAa,CAAChY,IAAW+X,GAAiB,IAAMA,GAAiB,GACjE3b,GAAS4b,IAAc,CAACH,GAAoB,QAAQ,EAIxD7T,GAAE,CAAE,OAAQ,QAAS,MAAO,GAAM,OAAQ5H,IAAU,CAClD,OAAQ,SAAgBob,EAAiC,CACvD,IAAIje,EAAS,UAAU,OACvB,OAAOue,GAAQ,KAAMN,EAAYje,EAAQA,EAAS,EAAI,UAAU,CAAC,EAAI,MAAS,CAClF,CACA,CAAC,EClBD,IAAIyK,GAAIxV,GACJoB,GAAcI,GACdhB,GAA2BkB,GAA2D,EACtFuJ,GAAWlH,GACX1C,GAAWoE,GACXyf,GAAaxf,GACb1D,GAAyB4E,GACzBue,GAAuBre,GAGvB2iB,GAAQroB,GAAY,GAAG,KAAK,EAC5BwJ,GAAM,KAAK,IAEXwa,GAA0BD,GAAqB,UAAU,EAEzDE,GAA+B,CAACD,IAA2B,CAAC,CAAC,UAAY,CAC3E,IAAIxkB,EAAaJ,GAAyB,OAAO,UAAW,UAAU,EACtE,OAAOI,GAAc,CAACA,EAAW,QACnC,EAAC,EAID4U,GAAE,CAAE,OAAQ,SAAU,MAAO,GAAM,OAAQ,CAAC6P,IAAoB,CAACD,IAA2B,CAC1F,SAAU,SAAkBE,EAA4C,CACtE,IAAIzU,EAAOxP,GAASW,GAAuB,IAAI,CAAC,EAChDkjB,GAAWI,CAAY,EACvB,IAAIoE,EAAc,UAAU,OAAS,EAAI,UAAU,CAAC,EAAI,OACpDxe,EAAM2F,EAAK,OACX8Y,EAAMD,IAAgB,OAAYxe,EAAMN,GAAIK,GAASye,CAAW,EAAGxe,CAAG,EACtEqa,EAASlkB,GAASikB,CAAY,EAClC,OAAOmE,GAAM5Y,EAAM8Y,EAAMpE,EAAO,OAAQoE,CAAG,IAAMpE,CACrD,CACA,CAAC,EChCD,IAAIllB,GAAOL,EACPoB,GAAcI,EACd4gB,GAAgC1gB,GAChCyF,GAAWpD,EACXzB,GAAWmD,GACXzD,GAAyB0D,GACzB0K,GAAqBxJ,GACrBwa,GAAqBta,GACrBmE,GAAWmG,GACX/P,GAAWgQ,GACXjN,GAAYmN,GACZ+Q,GAAa7Q,GACb4M,GAAgB3I,GAChB5V,GAAQ6V,EAER8G,GAAgB4B,GAAc,cAC9BuL,GAAa,WACbhf,GAAM,KAAK,IACXgB,GAAOxK,GAAY,CAAA,EAAG,IAAI,EAC1BE,GAAcF,GAAY,GAAG,KAAK,EAIlCyoB,GAAoC,CAAC/pB,GAAM,UAAY,CAEzD,IAAI4c,EAAK,OACLoN,EAAepN,EAAG,KACtBA,EAAG,KAAO,UAAY,CAAE,OAAOoN,EAAa,MAAM,KAAM,SAAS,GACjE,IAAI3jB,EAAS,KAAK,MAAMuW,CAAE,EAC1B,OAAOvW,EAAO,SAAW,GAAKA,EAAO,CAAC,IAAM,KAAOA,EAAO,CAAC,IAAM,GACnE,CAAC,EAEG4jB,GAAQ,OAAO,MAAM,MAAM,EAAE,CAAC,IAAM,KAEtC,OAAO,MAAM,OAAQ,EAAE,EAAE,SAAW,GACpC,KAAK,MAAM,SAAS,EAAE,SAAW,GACjC,IAAI,MAAM,UAAU,EAAE,SAAW,GAEjC,IAAI,MAAM,MAAM,EAAE,OAAS,GAC3B,GAAG,MAAM,IAAI,EAAE,OAGjB3H,GAA8B,QAAS,SAAU4H,EAAOC,EAAavH,EAAiB,CACpF,IAAIwH,EAAgB,IAAI,MAAM,OAAW,CAAC,EAAE,OAAS,SAAUC,EAAWC,EAAO,CAC/E,OAAOD,IAAc,QAAaC,IAAU,EAAI,CAAA,EAAK/pB,GAAK4pB,EAAa,KAAME,EAAWC,CAAK,CACjG,EAAMH,EAEJ,MAAO,CAGL,SAAeE,EAAWC,EAAO,CAC/B,IAAInjB,EAAIjF,GAAuB,IAAI,EAC/BqoB,EAAW/nB,GAAS6nB,CAAS,EAAI/lB,GAAU+lB,EAAWH,CAAK,EAAI,OACnE,OAAOK,EACHhqB,GAAKgqB,EAAUF,EAAWljB,EAAGmjB,CAAK,EAClC/pB,GAAK6pB,EAAe7oB,GAAS4F,CAAC,EAAGkjB,EAAWC,CAAK,CAC3D,EAMI,SAAU9c,EAAQ8c,EAAO,CACvB,IAAIxH,EAAKzb,GAAS,IAAI,EAClBoJ,EAAIlP,GAASiM,CAAM,EAEvB,GAAI,CAACyc,GAAO,CACV,IAAIlH,EAAMH,EAAgBwH,EAAetH,EAAIrS,EAAG6Z,EAAOF,IAAkBD,CAAW,EACpF,GAAIpH,EAAI,KAAM,OAAOA,EAAI,KACjC,CAEM,IAAIvS,EAAIF,GAAmBwS,EAAI,MAAM,EACjC0H,EAAkB1H,EAAG,QACrBnD,GAASmD,EAAG,WAAa,IAAM,KACtBA,EAAG,UAAY,IAAM,KACrBA,EAAG,QAAU,IAAM,KACnBnG,GAAgB,IAAM,KAG/B4N,EAAW,IAAI/Z,EAAEmM,GAAgB,OAASmG,EAAG,OAAS,IAAMA,EAAInD,CAAK,EACrE8K,EAAMH,IAAU,OAAYR,GAAaQ,IAAU,EACvD,GAAIG,IAAQ,EAAG,MAAO,CAAA,EACtB,GAAIha,EAAE,SAAW,EAAG,OAAO+R,GAAW+H,EAAU9Z,CAAC,IAAM,KAAO,CAACA,CAAC,EAAI,CAAA,EAIpE,QAHIia,EAAI,EACJC,EAAI,EACJ1H,EAAI,CAAA,EACD0H,EAAIla,EAAE,QAAQ,CACnB8Z,EAAS,UAAY5N,GAAgB,EAAIgO,EACzC,IAAIC,EAAIpI,GAAW+H,EAAU5N,GAAgBnb,GAAYiP,EAAGka,CAAC,EAAIla,CAAC,EAC9DyL,EACJ,GACE0O,IAAM,OACL1O,EAAIpR,GAAIK,GAASof,EAAS,WAAa5N,GAAgBgO,EAAI,EAAE,EAAGla,EAAE,MAAM,KAAOia,EAEhFC,EAAIrJ,GAAmB7Q,EAAGka,EAAGH,CAAe,MACvC,CAEL,GADA1e,GAAKmX,EAAGzhB,GAAYiP,EAAGia,EAAGC,CAAC,CAAC,EACxB1H,EAAE,SAAWwH,EAAK,OAAOxH,EAC7B,QAAShX,EAAI,EAAGA,GAAK2e,EAAE,OAAS,EAAG3e,IAEjC,GADAH,GAAKmX,EAAG2H,EAAE3e,CAAC,CAAC,EACRgX,EAAE,SAAWwH,EAAK,OAAOxH,EAE/B0H,EAAID,EAAIxO,CAClB,CACA,CACM,OAAApQ,GAAKmX,EAAGzhB,GAAYiP,EAAGia,CAAC,CAAC,EAClBzH,CACb,CACA,CACA,EAAGgH,IAAS,CAACF,GAAmCpN,EAAa,uCC7G5D,UAAW,CACV,IAAIkO,EAAgBC,EAAQC,EAAUC,EAAgBC,EAAcC,EAE/D,OAAO,YAAgB,KAAe,cAAgB,MAAS,YAAY,IAC9EC,GAAA,QAAiB,UAAW,CAC1B,OAAO,YAAY,IAAG,CAC5B,EACc,OAAO,QAAY,KAAe,UAAY,MAAS,QAAQ,QACzEA,GAAA,QAAiB,UAAW,CAC1B,OAAQN,IAAmBI,GAAgB,GACjD,EACIH,EAAS,QAAQ,OACjBD,EAAiB,UAAW,CAC1B,IAAIO,EACJ,OAAAA,EAAKN,EAAM,EACJM,EAAG,CAAC,EAAI,IAAMA,EAAG,CAAC,CAC/B,EACIJ,EAAiBH,EAAc,EAC/BK,EAAS,QAAQ,OAAM,EAAK,IAC5BD,EAAeD,EAAiBE,GACvB,KAAK,KACdC,GAAA,QAAiB,UAAW,CAC1B,OAAO,KAAK,IAAG,EAAKJ,CAC1B,EACIA,EAAW,KAAK,IAAG,IAEnBI,GAAA,QAAiB,UAAW,CAC1B,OAAO,IAAI,KAAI,EAAG,QAAO,EAAKJ,CACpC,EACIA,EAAW,IAAI,KAAI,EAAG,QAAO,EAGjC,GAAG,KAAKhrB,EAAI,oBCjCRsrB,GAAMnrB,GACNorB,GAAO,OAAO,OAAW,IAAcxrB,GAAS,OAChDyrB,GAAU,CAAC,MAAO,QAAQ,EAC1BC,GAAS,iBACTC,GAAMH,GAAK,UAAYE,EAAM,EAC7BE,GAAMJ,GAAK,SAAWE,EAAM,GAAKF,GAAK,gBAAkBE,EAAM,EAElE,QAAQvf,GAAI,EAAG,CAACwf,IAAOxf,GAAIsf,GAAQ,OAAQtf,KACzCwf,GAAMH,GAAKC,GAAQtf,EAAC,EAAI,UAAYuf,EAAM,EAC1CE,GAAMJ,GAAKC,GAAQtf,EAAC,EAAI,SAAWuf,EAAM,GAClCF,GAAKC,GAAQtf,EAAC,EAAI,gBAAkBuf,EAAM,EAInD,GAAG,CAACC,IAAO,CAACC,GAAK,CACf,IAAIC,GAAO,EACPpmB,GAAK,EACL2M,GAAQ,CAAA,EACR0Z,GAAgB,IAAO,GAE3BH,GAAM,SAASI,EAAU,CACvB,GAAG3Z,GAAM,SAAW,EAAG,CACrB,IAAI4Z,EAAOT,GAAG,EACVhY,EAAO,KAAK,IAAI,EAAGuY,IAAiBE,EAAOH,GAAK,EACpDA,GAAOtY,EAAOyY,EACd,WAAW,UAAW,CACpB,IAAIC,EAAK7Z,GAAM,MAAM,CAAC,EAItBA,GAAM,OAAS,EACf,QAAQ,EAAI,EAAG,EAAI6Z,EAAG,OAAQ,IAC5B,GAAG,CAACA,EAAG,CAAC,EAAE,UACR,GAAG,CACDA,EAAG,CAAC,EAAE,SAASJ,EAAI,CACjC,OAAoBzP,EAAG,CACT,WAAW,UAAW,CAAE,MAAMA,CAAC,EAAI,CAAC,CAClD,CAGA,EAAS,KAAK,MAAM7I,CAAI,CAAC,CACzB,CACI,OAAAnB,GAAM,KAAK,CACT,OAAQ,EAAE3M,GACV,SAAUsmB,EACV,UAAW,EACjB,CAAK,EACMtmB,EACX,EAEEmmB,GAAM,SAASM,EAAQ,CACrB,QAAQ/f,EAAI,EAAGA,EAAIiG,GAAM,OAAQjG,IAC5BiG,GAAMjG,CAAC,EAAE,SAAW+f,IACrB9Z,GAAMjG,CAAC,EAAE,UAAY,GAG7B,CACA,CAEAggB,GAAA,QAAiB,SAAS5qB,EAAI,CAI5B,OAAOoqB,GAAI,KAAKH,GAAMjqB,CAAE,CAC1B,EACA4qB,GAAA,QAAA,OAAwB,UAAW,CACjCP,GAAI,MAAMJ,GAAM,SAAS,CAC3B,EACAW,GAAA,QAAA,SAA0B,SAASjkB,EAAQ,CACpCA,IACHA,EAASsjB,IAEXtjB,EAAO,sBAAwByjB,GAC/BzjB,EAAO,qBAAuB0jB,EAChC,oCCxEA,IAAAQ,GAAiB;AAAA,2CCDb5qB,GAAcpB,EACdgC,GAAyBR,GACzBH,GAAWK,GACXsqB,GAAcjoB,GAEd2F,GAAUtI,GAAY,GAAG,OAAO,EAChC6qB,GAAQ,OAAO,KAAOD,GAAc,IAAI,EACxCE,GAAQ,OAAO,QAAUF,GAAc,MAAQA,GAAc,KAAK,EAGlE3gB,GAAe,SAAUpC,EAAM,CACjC,OAAO,SAAUsC,EAAO,CACtB,IAAI+B,EAASjM,GAASW,GAAuBuJ,CAAK,CAAC,EACnD,OAAItC,EAAO,IAAGqE,EAAS5D,GAAQ4D,EAAQ2e,GAAO,EAAE,GAC5ChjB,EAAO,IAAGqE,EAAS5D,GAAQ4D,EAAQ4e,GAAO,IAAI,GAC3C5e,CACX,CACA,EAEA6e,GAAiB,CASf,KAAM9gB,GAAa,CAAC,CACtB,EC7BIyb,GAAuB9mB,GAAsC,OAC7DF,GAAQ0B,EACRwqB,GAActqB,GAEd0qB,GAAM,MAIVC,GAAiB,SAAUpH,EAAa,CACtC,OAAOnlB,GAAM,UAAY,CACvB,MAAO,CAAC,CAACksB,GAAY/G,CAAW,EAAC,GAC5BmH,GAAInH,CAAW,MAAQmH,IACtBtF,IAAwBkF,GAAY/G,CAAW,EAAE,OAASA,CACpE,CAAG,CACH,ECdIzP,GAAIxV,GACJssB,GAAQ9qB,GAAoC,KAC5C+qB,GAAyB7qB,GAI7B8T,GAAE,CAAE,OAAQ,SAAU,MAAO,GAAM,OAAQ+W,GAAuB,MAAM,GAAK,CAC3E,KAAM,UAAgB,CACpB,OAAOD,GAAM,IAAI,CACrB,CACA,CAAC,MCNDE,GAAiB,SAASC,EAAc,CACpC,KAAK,GAAK,GACV,KAAK,MAAQ,EAGTA,EAAa,OAAO,CAAC,GAAK,MAC1BA,EAAeA,EAAa,OAAO,EAAE,CAAC,GAG1CA,EAAeA,EAAa,QAAQ,KAAK,EAAE,EAC3CA,EAAeA,EAAa,YAAW,EAIvC,IAAIC,EAAgB,CAChB,UAAW,SACX,aAAc,SACd,KAAM,SACN,WAAY,SACZ,MAAO,SACP,MAAO,SACP,OAAQ,SACR,MAAO,SACP,eAAgB,SAChB,KAAM,SACN,WAAY,SACZ,MAAO,SACP,UAAW,SACX,UAAW,SACX,WAAY,SACZ,UAAW,SACX,MAAO,SACP,eAAgB,SAChB,SAAU,SACV,QAAS,SACT,KAAM,SACN,SAAU,SACV,SAAU,SACV,cAAe,SACf,SAAU,SACV,UAAW,SACX,UAAW,SACX,YAAa,SACb,eAAgB,SAChB,WAAY,SACZ,WAAY,SACZ,QAAS,SACT,WAAY,SACZ,aAAc,SACd,cAAe,SACf,cAAe,SACf,cAAe,SACf,WAAY,SACZ,SAAU,SACV,YAAa,SACb,QAAS,SACT,WAAY,SACZ,SAAU,SACV,UAAW,SACX,YAAa,SACb,YAAa,SACb,QAAS,SACT,UAAW,SACX,WAAY,SACZ,KAAM,SACN,UAAW,SACX,KAAM,SACN,MAAO,SACP,YAAa,SACb,SAAU,SACV,QAAS,SACT,UAAY,SACZ,OAAS,SACT,MAAO,SACP,MAAO,SACP,SAAU,SACV,cAAe,SACf,UAAW,SACX,aAAc,SACd,UAAW,SACX,WAAY,SACZ,UAAW,SACX,qBAAsB,SACtB,UAAW,SACX,WAAY,SACZ,UAAW,SACX,YAAa,SACb,cAAe,SACf,aAAc,SACd,eAAgB,SAChB,eAAgB,SAChB,eAAgB,SAChB,YAAa,SACb,KAAM,SACN,UAAW,SACX,MAAO,SACP,QAAS,SACT,OAAQ,SACR,iBAAkB,SAClB,WAAY,SACZ,aAAc,SACd,aAAc,SACd,eAAgB,SAChB,gBAAiB,SACjB,kBAAmB,SACnB,gBAAiB,SACjB,gBAAiB,SACjB,aAAc,SACd,UAAW,SACX,UAAW,SACX,SAAU,SACV,YAAa,SACb,KAAM,SACN,QAAS,SACT,MAAO,SACP,UAAW,SACX,OAAQ,SACR,UAAW,SACX,OAAQ,SACR,cAAe,SACf,UAAW,SACX,cAAe,SACf,cAAe,SACf,WAAY,SACZ,UAAW,SACX,KAAM,SACN,KAAM,SACN,KAAM,SACN,WAAY,SACZ,OAAQ,SACR,cAAe,SACf,IAAK,SACL,UAAW,SACX,UAAW,SACX,YAAa,SACb,OAAQ,SACR,WAAY,SACZ,SAAU,SACV,SAAU,SACV,OAAQ,SACR,OAAQ,SACR,QAAS,SACT,UAAW,SACX,UAAW,SACX,KAAM,SACN,YAAa,SACb,UAAW,SACX,IAAK,SACL,KAAM,SACN,QAAS,SACT,OAAQ,SACR,UAAW,SACX,OAAQ,SACR,UAAW,SACX,MAAO,SACP,MAAO,SACP,WAAY,SACZ,OAAQ,SACR,YAAa,QACrB,EACID,EAAeC,EAAcD,CAAY,GAAKA,EAqD9C,QAjDIE,EAAa,CACb,CACI,GAAI,kEACJ,QAAS,CAAC,0BAA2B,uBAAuB,EAC5D,QAAS,SAAUC,EAAK,CACpB,MAAO,CACH,SAASA,EAAK,CAAC,CAAC,EAChB,SAASA,EAAK,CAAC,CAAC,EAChB,SAASA,EAAK,CAAC,CAAC,EAChB,WAAWA,EAAK,CAAC,CAAC,CACtC,CACA,CACA,EACQ,CACI,GAAI,+CACJ,QAAS,CAAC,oBAAqB,kBAAkB,EACjD,QAAS,SAAUA,EAAK,CACpB,MAAO,CACH,SAASA,EAAK,CAAC,CAAC,EAChB,SAASA,EAAK,CAAC,CAAC,EAChB,SAASA,EAAK,CAAC,CAAC,CACpC,CACA,CACA,EACQ,CACI,GAAI,qDACJ,QAAS,CAAC,UAAW,QAAQ,EAC7B,QAAS,SAAUA,EAAK,CACpB,MAAO,CACH,SAASA,EAAK,CAAC,EAAG,EAAE,EACpB,SAASA,EAAK,CAAC,EAAG,EAAE,EACpB,SAASA,EAAK,CAAC,EAAG,EAAE,CACxC,CACA,CACA,EACQ,CACI,GAAI,qDACJ,QAAS,CAAC,OAAQ,KAAK,EACvB,QAAS,SAAUA,EAAK,CACpB,MAAO,CACH,SAASA,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAG,EAAE,EAC9B,SAASA,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAG,EAAE,EAC9B,SAASA,EAAK,CAAC,EAAIA,EAAK,CAAC,EAAG,EAAE,CAClD,CACA,CACA,CACA,EAGa7gB,EAAI,EAAGA,EAAI4gB,EAAW,OAAQ5gB,IAAK,CACxC,IAAI2Q,EAAKiQ,EAAW5gB,CAAC,EAAE,GACnB8gB,EAAYF,EAAW5gB,CAAC,EAAE,QAC1B6gB,EAAOlQ,EAAG,KAAK+P,CAAY,EAC/B,GAAIG,EAAM,CACN,IAAIE,EAAWD,EAAUD,CAAI,EAC7B,KAAK,EAAIE,EAAS,CAAC,EACnB,KAAK,EAAIA,EAAS,CAAC,EACnB,KAAK,EAAIA,EAAS,CAAC,EACfA,EAAS,OAAS,IAClB,KAAK,MAAQA,EAAS,CAAC,GAE3B,KAAK,GAAK,EACtB,CAEA,CAGI,KAAK,EAAK,KAAK,EAAI,GAAK,MAAM,KAAK,CAAC,EAAK,EAAM,KAAK,EAAI,IAAO,IAAM,KAAK,EAC1E,KAAK,EAAK,KAAK,EAAI,GAAK,MAAM,KAAK,CAAC,EAAK,EAAM,KAAK,EAAI,IAAO,IAAM,KAAK,EAC1E,KAAK,EAAK,KAAK,EAAI,GAAK,MAAM,KAAK,CAAC,EAAK,EAAM,KAAK,EAAI,IAAO,IAAM,KAAK,EAC1E,KAAK,MAAS,KAAK,MAAQ,EAAK,EAAM,KAAK,MAAQ,GAAO,MAAM,KAAK,KAAK,EAAK,EAAM,KAAK,MAG1F,KAAK,MAAQ,UAAY,CACrB,MAAO,OAAS,KAAK,EAAI,KAAO,KAAK,EAAI,KAAO,KAAK,EAAI,GACjE,EACI,KAAK,OAAS,UAAY,CACtB,MAAO,QAAU,KAAK,EAAI,KAAO,KAAK,EAAI,KAAO,KAAK,EAAI,KAAO,KAAK,MAAQ,GACtF,EACI,KAAK,MAAQ,UAAY,CACrB,IAAIpR,EAAI,KAAK,EAAE,SAAS,EAAE,EACtBqR,EAAI,KAAK,EAAE,SAAS,EAAE,EACtBzY,EAAI,KAAK,EAAE,SAAS,EAAE,EAC1B,OAAIoH,EAAE,QAAU,IAAGA,EAAI,IAAMA,GACzBqR,EAAE,QAAU,IAAGA,EAAI,IAAMA,GACzBzY,EAAE,QAAU,IAAGA,EAAI,IAAMA,GACtB,IAAMoH,EAAIqR,EAAIzY,CAC7B,EAGI,KAAK,WAAa,UAAY,CAI1B,QAFI0Y,EAAW,IAAI,MAEVjhB,EAAI,EAAGA,EAAI4gB,EAAW,OAAQ5gB,IAEnC,QADIkhB,EAAUN,EAAW5gB,CAAC,EAAE,QACnB4Y,EAAI,EAAGA,EAAIsI,EAAQ,OAAQtI,IAChCqI,EAASA,EAAS,MAAM,EAAIC,EAAQtI,CAAC,EAI7C,QAASuI,KAAMR,EACXM,EAASA,EAAS,MAAM,EAAIE,EAGhC,IAAIC,EAAM,SAAS,cAAc,IAAI,EACrCA,EAAI,aAAa,KAAM,mBAAmB,EAC1C,QAASphB,EAAI,EAAGA,EAAIihB,EAAS,OAAQjhB,IACjC,GAAI,CACA,IAAIqhB,EAAY,SAAS,cAAc,IAAI,EACvCC,EAAa,IAAI,SAASL,EAASjhB,CAAC,CAAC,EACrCuhB,EAAc,SAAS,cAAc,KAAK,EAC9CA,EAAY,MAAM,QACV,oDAEkBD,EAAW,QAAU,WAC1BA,EAAW,MAAK,EAErCC,EAAY,YAAY,SAAS,eAAe,MAAM,CAAC,EACvD,IAAIC,EAAkB,SAAS,eAC3B,IAAMP,EAASjhB,CAAC,EAAI,OAASshB,EAAW,MAAK,EAAK,OAASA,EAAW,MAAK,CAC/F,EACgBD,EAAU,YAAYE,CAAW,EACjCF,EAAU,YAAYG,CAAe,EACrCJ,EAAI,YAAYC,CAAS,CAEzC,MAAsB,CAAA,CAEd,OAAOD,CAEf,CAEA,kBC3SA,IAAI3X,GAAIxV,GACJoB,GAAcI,GACdgsB,GAAW9rB,GAAuC,QAClD2nB,GAAsBtlB,GAEtB0pB,GAAgBrsB,GAAY,CAAA,EAAG,OAAO,EAEtCssB,GAAgB,CAAC,CAACD,IAAiB,EAAIA,GAAc,CAAC,CAAC,EAAG,EAAG,EAAE,EAAI,EACnE7f,GAAS8f,IAAiB,CAACrE,GAAoB,SAAS,EAI5D7T,GAAE,CAAE,OAAQ,QAAS,MAAO,GAAM,OAAQ5H,IAAU,CAClD,QAAS,SAAiB+f,EAAqC,CAC7D,IAAIliB,EAAY,UAAU,OAAS,EAAI,UAAU,CAAC,EAAI,OACtD,OAAOiiB,GAEHD,GAAc,KAAME,EAAeliB,CAAS,GAAK,EACjD+hB,GAAS,KAAMG,EAAeliB,CAAS,CAC/C,CACA,CAAC,ECrBD,IAAI+J,GAAIxV,GACJoB,GAAcI,EACd0jB,GAAaxjB,GACbM,GAAyB+B,GACzB1C,GAAWoE,GACX0f,GAAuBzf,GAEvB6c,GAAgBnhB,GAAY,GAAG,OAAO,EAI1CoU,GAAE,CAAE,OAAQ,SAAU,MAAO,GAAM,OAAQ,CAAC2P,GAAqB,UAAU,GAAK,CAC9E,SAAU,SAAkBG,EAAmC,CAC7D,MAAO,CAAC,CAAC,CAAC/C,GACRlhB,GAASW,GAAuB,IAAI,CAAC,EACrCX,GAAS6jB,GAAWI,CAAY,CAAC,EACjC,UAAU,OAAS,EAAI,UAAU,CAAC,EAAI,MAC5C,CACA,CACA,CAAC,ECnBD,IAAI7jB,GAAUzB,GAKd4tB,GAAiB,MAAM,SAAW,SAAiBvrB,EAAU,CAC3D,OAAOZ,GAAQY,CAAQ,IAAM,OAC/B,ECPImT,GAAIxV,GACJoB,GAAcI,EACdosB,GAAUlsB,GAEVmsB,GAAgBzsB,GAAY,CAAA,EAAG,OAAO,EACtCjB,GAAO,CAAC,EAAG,CAAC,EAMhBqV,GAAE,CAAE,OAAQ,QAAS,MAAO,GAAM,OAAQ,OAAOrV,EAAI,IAAM,OAAOA,GAAK,QAAO,CAAE,CAAC,EAAI,CACnF,QAAS,UAAmB,CAE1B,OAAIytB,GAAQ,IAAI,IAAG,KAAK,OAAS,KAAK,QAC/BC,GAAc,IAAI,CAC7B,CACA,CAAC,EClBD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gFAcA,IAAI9R,GAAE,SAASL,EAAE,EAAE,CAAC,OAAOK,GAAE,OAAO,gBAAgB,CAAC,UAAU,CAAA,CAAE,YAAY,OAAO,SAAS,EAAE,EAAE,CAAC,EAAE,UAAU,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC,QAAQC,KAAK,EAAE,OAAO,UAAU,eAAe,KAAK,EAAEA,CAAC,IAAI,EAAEA,CAAC,EAAE,EAAEA,CAAC,EAAE,GAAGN,EAAE,CAAC,CAAC,EAAE,SAASA,GAAEA,EAAE,EAAE,CAAC,GAAe,OAAO,GAAnB,YAA6B,IAAP,KAAS,MAAM,IAAI,UAAU,uBAAuB,OAAO,CAAC,EAAE,+BAA+B,EAAE,SAAS3P,GAAG,CAAC,KAAK,YAAY2P,CAAC,CAACK,GAAEL,EAAE,CAAC,EAAEA,EAAE,UAAiB,IAAP,KAAS,OAAO,OAAO,CAAC,GAAG3P,EAAE,UAAU,EAAE,UAAU,IAAIA,EAAE,CAAC,SAASiQ,GAAED,EAAE,CAAC,IAAIL,EAAE,GAAG,MAAM,QAAQK,CAAC,IAAIA,EAAE,CAACA,CAAC,GAAG,QAAQC,EAAE,EAAEA,EAAED,EAAE,OAAOC,IAAI,CAAC,IAAIjQ,EAAEgQ,EAAEC,CAAC,EAAE,GAAGjQ,EAAE,OAAOmY,EAAE,WAAWxI,GAAG,YAAY3P,EAAE,OAAOmY,EAAE,cAAcxI,IAAI3P,EAAE,SAAS,IAAI,KAAKA,EAAE,UAAUA,EAAE,OAAOmY,EAAE,aAAaxI,IAAI3P,EAAE,SAAS,IAAI,KAAKA,EAAE,UAAUA,EAAE,OAAOmY,EAAE,QAAQxI,IAAI3P,EAAE,SAAS,IAAI,KAAKA,EAAE,EAAE,IAAIA,EAAE,UAAUA,EAAE,OAAOmY,EAAE,QAAQxI,IAAI3P,EAAE,SAAS,IAAI,KAAKA,EAAE,EAAE,IAAIA,EAAE,UAAUA,EAAE,OAAOmY,EAAE,SAASxI,IAAI3P,EAAE,SAAS,IAAI,KAAKA,EAAE,GAAG,IAAIA,EAAE,GAAG,IAAIA,EAAE,GAAG,IAAIA,EAAE,GAAG,IAAIA,EAAE,EAAE,IAAIA,EAAE,UAAUA,EAAE,OAAOmY,EAAE,gBAAgBxI,IAAI3P,EAAE,SAAS,IAAI,KAAKA,EAAE,GAAG,IAAIA,EAAE,GAAG,IAAIA,EAAE,EAAE,IAAIA,EAAE,UAAUA,EAAE,OAAOmY,EAAE,QAAQxI,IAAI3P,EAAE,SAAS,IAAI,KAAKA,EAAE,GAAG,IAAIA,EAAE,GAAG,IAAIA,EAAE,EAAE,IAAIA,EAAE,UAAUA,EAAE,OAAOmY,EAAE,eAAexI,IAAI3P,EAAE,SAAS,IAAI,KAAKA,EAAE,EAAE,IAAIA,EAAE,MAAM,CAAC,GAAGA,EAAE,OAAOmY,EAAE,IAAI,MAAM,IAAI,MAAM,4BAA4BnY,EAAE,KAAK,cAAciQ,EAAE,GAAG,EAAEN,IAAI3P,EAAE,SAAS,IAAI,KAAKA,EAAE,GAAG,IAAIA,EAAE,GAAG,IAAIA,EAAE,KAAK,KAAK,CAACA,EAAE,SAAS,KAAK,CAACA,EAAE,UAAU,IAAIA,EAAE,EAAE,IAAIA,EAAE,CAAC,CAAC,CAAC,OAAO2P,CAAC,CAAC,SAAS3P,GAAEgQ,EAAEL,EAAE,CAAC,IAAIM,EAAED,EAAE,CAAC,EAAEhQ,EAAEgQ,EAAE,CAAC,EAAE,MAAM,CAACC,EAAE,KAAK,IAAIN,CAAC,EAAE3P,EAAE,KAAK,IAAI2P,CAAC,EAAEM,EAAE,KAAK,IAAIN,CAAC,EAAE3P,EAAE,KAAK,IAAI2P,CAAC,CAAC,CAAC,CAAC,SAASQ,IAAG,CAAC,QAAQH,EAAE,CAAA,EAAGL,EAAE,EAAEA,EAAE,UAAU,OAAOA,IAAIK,EAAEL,CAAC,EAAE,UAAUA,CAAC,EAAE,QAAQM,EAAE,EAAEA,EAAED,EAAE,OAAOC,IAAI,GAAa,OAAOD,EAAEC,CAAC,GAApB,SAAsB,MAAM,IAAI,MAAM,2BAA2BA,EAAE,sBAAsB,OAAOD,EAAEC,CAAC,EAAE,cAAcD,EAAEC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,IAAIzR,GAAE,KAAK,GAAG,SAAS0R,GAAEF,EAAEL,EAAEM,EAAE,CAACD,EAAE,SAAaA,EAAE,WAAN,EAAe,EAAE,EAAEA,EAAE,UAAcA,EAAE,YAAN,EAAgB,EAAE,EAAE,IAAIG,EAAEH,EAAE,GAAGE,EAAEF,EAAE,GAAG+R,EAAE/R,EAAE,EAAEgS,EAAEhS,EAAE,EAAEG,EAAE,KAAK,IAAIH,EAAE,EAAE,EAAEE,EAAE,KAAK,IAAIF,EAAE,EAAE,EAAE,IAAIiS,EAAEjiB,GAAE,EAAE2P,EAAEoS,GAAG,GAAG9R,EAAE+R,GAAG,CAAC,EAAE,CAAChS,EAAE,KAAK,IAAIxR,EAAC,EAAE4R,EAAE6R,EAAE,CAAC,EAAEC,EAAED,EAAE,CAAC,EAAExD,EAAE,KAAK,IAAIrO,EAAE,CAAC,EAAE,KAAK,IAAID,EAAE,CAAC,EAAE,KAAK,IAAI+R,EAAE,CAAC,EAAE,KAAK,IAAIhS,EAAE,CAAC,EAAE,EAAEuO,IAAItO,GAAG,KAAK,KAAKsO,CAAC,EAAEvO,GAAG,KAAK,KAAKuO,CAAC,GAAGzO,EAAE,GAAGG,EAAEH,EAAE,GAAGE,EAAE,IAAIuH,EAAE,KAAK,IAAItH,EAAE,CAAC,EAAE,KAAK,IAAI+R,EAAE,CAAC,EAAE,KAAK,IAAIhS,EAAE,CAAC,EAAE,KAAK,IAAIE,EAAE,CAAC,EAAElV,GAAG8U,EAAE,WAAWA,EAAE,UAAU,EAAE,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,KAAK,IAAIG,EAAE,CAAC,EAAE,KAAK,IAAID,EAAE,CAAC,EAAEuH,GAAGA,CAAC,CAAC,EAAE0K,EAAEhS,EAAE+R,EAAEhS,EAAEhV,EAAEknB,EAAE,CAAClS,EAAEE,EAAED,EAAEjV,EAAEmnB,EAAEriB,GAAE,CAACmiB,EAAEC,CAAC,EAAEpS,EAAE,KAAK,IAAIxR,EAAC,EAAEwR,EAAE,GAAGqS,EAAE,CAAC,GAAG1S,EAAEoS,GAAG,EAAE/R,EAAE,GAAGqS,EAAE,CAAC,GAAGpS,EAAE+R,GAAG,EAAEhS,EAAE,KAAK,KAAK,OAAOkS,EAAEE,GAAGlS,GAAGE,EAAE+R,GAAGhS,CAAC,EAAEH,EAAE,KAAK,KAAK,OAAO,CAACkS,EAAEE,GAAGlS,GAAG,CAACE,EAAE+R,GAAGhS,CAAC,EAAMH,EAAE,YAAN,GAAiBA,EAAE,KAAKA,EAAE,OAAOA,EAAE,MAAM,EAAExR,IAAOwR,EAAE,YAAN,GAAiBA,EAAE,KAAKA,EAAE,OAAOA,EAAE,MAAM,EAAExR,IAAGwR,EAAE,MAAM,IAAIxR,GAAEwR,EAAE,MAAM,IAAIxR,EAAC,CAAC,SAASujB,GAAE/R,EAAEL,EAAEM,EAAE,CAACE,GAAEH,EAAEL,EAAEM,CAAC,EAAE,IAAIjQ,EAAEgQ,EAAEA,EAAEL,EAAEA,EAAEM,EAAEA,EAAE,GAAG,EAAEjQ,EAAE,MAAM,CAAA,EAAG,GAAOA,IAAJ,EAAM,MAAM,CAAC,CAACgQ,EAAEC,GAAGD,EAAEA,EAAEL,EAAEA,GAAGA,EAAEM,GAAGD,EAAEA,EAAEL,EAAEA,EAAE,CAAC,EAAE,IAAInR,EAAE,KAAK,KAAKwB,CAAC,EAAE,MAAM,CAAC,EAAEgQ,EAAEC,EAAEN,EAAEnR,IAAIwR,EAAEA,EAAEL,EAAEA,IAAIA,EAAEM,EAAED,EAAExR,IAAIwR,EAAEA,EAAEL,EAAEA,EAAE,EAAE,EAAEK,EAAEC,EAAEN,EAAEnR,IAAIwR,EAAEA,EAAEL,EAAEA,IAAIA,EAAEM,EAAED,EAAExR,IAAIwR,EAAEA,EAAEL,EAAEA,EAAE,CAAC,CAAC,CAAC,IAAIqS,EAAEC,GAAE,KAAK,GAAG,IAAI,SAAS7R,GAAEJ,EAAEL,EAAEM,EAAE,CAAC,OAAO,EAAEA,GAAGD,EAAEC,EAAEN,CAAC,CAAC,SAASuS,GAAElS,EAAEL,EAAEM,EAAEjQ,EAAE,CAAC,OAAOgQ,EAAE,KAAK,IAAIhQ,EAAE,IAAIxB,EAAC,EAAEmR,EAAE,KAAK,IAAI3P,EAAE,IAAIxB,EAAC,EAAEyR,CAAC,CAAC,SAASwO,GAAEzO,EAAEL,EAAEM,EAAEjQ,EAAE,CAAC,IAAImQ,EAAE,KAAK,EAAER,EAAEK,EAAE,EAAEC,EAAEN,EAAE,EAAE,EAAE,EAAE,GAAG3P,EAAEiQ,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAGgS,EAAE,EAAE,EAAE,OAAO,KAAK,IAAI,CAAC,EAAE9R,EAAE,CAAC,CAAC8R,EAAE,CAAC,EAAE,SAASjS,EAAEL,EAAEM,EAAE,CAAsB,IAAIjQ,EAAEgQ,EAAEA,EAAE,EAAEL,EAAE,GAAG3P,EAAE,CAACiQ,EAAE,MAAM,CAAA,EAAG,GAAGjQ,GAAGiQ,EAAE,MAAM,CAAC,CAACD,EAAE,CAAC,EAAE,IAAIG,EAAE,KAAK,KAAKnQ,CAAC,EAAE,MAAM,CAAC,CAACgQ,EAAE,EAAEG,EAAE,CAACH,EAAE,EAAEG,CAAC,CAAC,EAAE,EAAE,EAAE8R,EAAE,EAAE9R,CAAC,CAAC,CAAC,SAASsH,GAAEzH,EAAEL,EAAEM,EAAEjQ,EAAEmQ,EAAE,CAAC,IAAI,EAAE,EAAEA,EAAE,OAAOH,GAAG,EAAE,EAAE,GAAGL,GAAG,EAAE,EAAE,EAAEQ,GAAGF,GAAG,EAAE,EAAEE,EAAEA,GAAGnQ,GAAGmQ,EAAEA,EAAEA,EAAE,EAAE,SAASH,EAAE,CAAC,SAASL,GAAG,CAAC,OAAOqS,EAAG,SAAShS,EAAEL,EAAEM,EAAE,CAAC,OAAOD,EAAE,WAAoBA,EAAE,KAAX,SAAgBA,EAAE,IAAIL,GAAYK,EAAE,KAAX,SAAgBA,EAAE,IAAIC,GAAYD,EAAE,KAAX,SAAgBA,EAAE,IAAIL,GAAYK,EAAE,KAAX,SAAgBA,EAAE,IAAIC,GAAYD,EAAE,IAAX,SAAeA,EAAE,GAAGL,GAAYK,EAAE,IAAX,SAAeA,EAAE,GAAGC,GAAGD,EAAE,SAAS,IAAIA,CAAC,CAAC,CAAE,CAAC,SAASC,GAAG,CAAC,IAAID,EAAE,IAAIL,EAAE,IAAIM,EAAE,IAAIjQ,EAAE,IAAI,OAAOgiB,EAAG,SAAS7R,EAAE3R,EAAE0R,EAAE,CAAC,OAAOC,EAAE,KAAKgI,EAAE,kBAAkBhI,EAAE,KAAKgI,EAAE,SAASnI,EAAE,MAAMA,CAAC,EAAExR,EAAEwR,EAAEL,EAAE,MAAMA,CAAC,EAAEO,EAAEP,EAAEQ,EAAE,GAAGA,EAAE,SAAS3R,EAAEwR,EAAE,EAAExR,EAAEwR,EAAEG,EAAE,GAAGA,EAAE,SAASD,EAAEP,EAAE,EAAEO,EAAEP,GAAGQ,EAAE,KAAKgI,EAAE,UAAUnI,EAAEG,EAAE,SAAS3R,EAAE2R,EAAE,GAAGA,EAAE,GAAGR,EAAEQ,EAAE,SAASD,EAAEC,EAAE,GAAGA,EAAE,KAAKH,EAAE,IAAIL,EAAE,KAAKQ,EAAE,KAAKgI,EAAE,iBAAiBhI,EAAE,KAAKgI,EAAE,QAAQlI,EAAE,MAAMA,CAAC,EAAEzR,EAAEyR,EAAEjQ,EAAE,MAAMA,CAAC,EAAEkQ,EAAElQ,EAAEmQ,EAAE,GAAGA,EAAE,SAAS3R,EAAEyR,EAAE,EAAEzR,EAAEyR,EAAEE,EAAE,GAAGA,EAAE,SAASD,EAAElQ,EAAE,EAAEkQ,EAAElQ,GAAGmQ,EAAE,KAAKgI,EAAE,SAASlI,EAAEE,EAAE,SAAS3R,EAAE2R,EAAE,GAAGA,EAAE,GAAGnQ,EAAEmQ,EAAE,SAASD,EAAEC,EAAE,GAAGA,EAAE,KAAKF,EAAE,IAAIjQ,EAAE,KAAKmQ,CAAC,CAAC,CAAE,CAAC,SAAS3R,GAAG,CAAC,IAAIwR,EAAE,IAAIL,EAAE,IAAI,OAAOqS,EAAG,SAAS/R,EAAEjQ,EAAEmQ,EAAE,CAAC,GAAGF,EAAE,KAAKkI,EAAE,iBAAiBlI,EAAE,KAAKkI,EAAE,QAAQnI,EAAE,MAAMA,CAAC,EAAEhQ,EAAEgQ,EAAEL,EAAE,MAAMA,CAAC,EAAEQ,EAAER,EAAEM,EAAE,GAAGA,EAAE,SAASjQ,EAAEgQ,EAAE,EAAEhQ,EAAEgQ,EAAEC,EAAE,GAAGA,EAAE,SAASE,EAAER,EAAE,EAAEQ,EAAER,GAAGM,EAAE,KAAKkI,EAAE,QAAQ,CAACnI,EAAEC,EAAE,SAASjQ,EAAEiQ,EAAE,GAAGA,EAAE,GAAGN,EAAEM,EAAE,SAASE,EAAEF,EAAE,GAAGA,EAAE,GAAG,IAAIzR,EAAEyR,EAAE,GAAGC,EAAED,EAAE,GAAGA,EAAE,KAAKkI,EAAE,SAASlI,EAAE,KAAKA,EAAE,SAAS,EAAEjQ,GAAG,EAAExB,GAAG,EAAEyR,EAAE,KAAKA,EAAE,SAAS,EAAEE,GAAG,EAAED,GAAG,EAAED,EAAE,IAAIA,EAAE,EAAE,EAAEzR,GAAG,EAAEyR,EAAE,IAAIA,EAAE,EAAE,EAAEC,GAAG,CAAC,MAAMF,EAAE,IAAIL,EAAE,IAAI,OAAOM,CAAC,CAAC,CAAE,CAAC,SAAS+R,EAAEhS,EAAE,CAAC,IAAIL,EAAE,EAAEM,EAAE,EAAEjQ,EAAE,IAAImQ,EAAE,IAAI,OAAO,SAAS3R,EAAE,CAAC,GAAG,MAAMwB,CAAC,GAAG,EAAExB,EAAE,KAAK2Z,EAAE,SAAS,MAAM,IAAI,MAAM,6BAA6B,EAAE,IAAIjI,EAAEF,EAAExR,EAAEmR,EAAEM,EAAEjQ,EAAEmQ,CAAC,EAAE,OAAO3R,EAAE,KAAK2Z,EAAE,aAAaxI,EAAE3P,EAAEiQ,EAAEE,GAAY3R,EAAE,IAAX,SAAemR,EAAEnR,EAAE,SAASmR,EAAEnR,EAAE,EAAEA,EAAE,GAAYA,EAAE,IAAX,SAAeyR,EAAEzR,EAAE,SAASyR,EAAEzR,EAAE,EAAEA,EAAE,GAAGA,EAAE,KAAK2Z,EAAE,UAAUnY,EAAE2P,EAAEQ,EAAEF,GAAGC,CAAC,CAAC,CAAC,SAAShV,EAAE8U,EAAEL,EAAEM,EAAEjQ,EAAExB,EAAE0R,EAAE,CAAC,OAAOC,GAAEH,EAAEL,EAAEM,EAAEjQ,EAAExB,EAAE0R,CAAC,EAAE8R,EAAG,SAAS7R,EAAE4R,EAAEC,EAAEC,EAAE,CAAC,IAAI7R,EAAED,EAAE,GAAG+R,EAAE/R,EAAE,GAAGsO,EAAEtO,EAAE,UAAU,CAAC,MAAM8R,CAAC,EAAExK,EAAWtH,EAAE,IAAX,OAAaA,EAAE,EAAEsO,EAAE,EAAEsD,EAAE7mB,EAAWiV,EAAE,IAAX,OAAaA,EAAE,EAAEsO,EAAE,EAAEuD,EAAE,SAASG,EAAEnS,GAAE,CAAC,OAAOA,GAAEA,EAAC,CAACG,EAAE,KAAKgI,EAAE,eAAmBxI,IAAJ,IAAQQ,EAAE,KAAKgI,EAAE,QAAQhI,EAAE,EAAEA,EAAE,SAAS,EAAE6R,GAAG7R,EAAE,KAAKgI,EAAE,cAAkBlI,IAAJ,IAAQE,EAAE,KAAKgI,EAAE,QAAQhI,EAAE,EAAEA,EAAE,SAAS,EAAE4R,GAAY5R,EAAE,IAAX,SAAeA,EAAE,EAAEA,EAAE,EAAEH,EAAE9U,EAAE+U,GAAGwO,EAAE,EAAEjgB,IAAa2R,EAAE,IAAX,SAAeA,EAAE,EAAEsH,EAAE9H,EAAEQ,EAAE,EAAEnQ,GAAGye,EAAE,EAAEvO,IAAaC,EAAE,KAAX,SAAgBA,EAAE,GAAGA,EAAE,GAAGH,EAAEG,EAAE,GAAGF,GAAGwO,EAAE,EAAEjgB,IAAa2R,EAAE,KAAX,SAAgBA,EAAE,GAAGC,EAAET,EAAEQ,EAAE,GAAGnQ,GAAGye,EAAE,EAAEvO,IAAaC,EAAE,KAAX,SAAgBA,EAAE,GAAGA,EAAE,GAAGH,EAAEG,EAAE,GAAGF,GAAGwO,EAAE,EAAEjgB,IAAa2R,EAAE,KAAX,SAAgBA,EAAE,GAAG+R,EAAEvS,EAAEQ,EAAE,GAAGnQ,GAAGye,EAAE,EAAEvO,IAAI,IAAIkS,EAAEpS,EAAEhQ,EAAE2P,EAAEM,EAAE,GAAYE,EAAE,OAAX,SAAsBH,IAAJ,GAAWL,IAAJ,GAAWM,IAAJ,GAAWjQ,IAAJ,GAAO,GAAOoiB,IAAJ,EAAM,OAAOjS,EAAE,GAAG,OAAOA,EAAE,GAAG,OAAOA,EAAE,KAAK,OAAOA,EAAE,SAAS,OAAOA,EAAE,UAAUA,EAAE,KAAKgI,EAAE,YAAY,CAAC,IAAIkK,EAAElS,EAAE,KAAK,KAAK,GAAG,IAAI0H,EAAE,KAAK,IAAIwK,CAAC,EAAEC,EAAE,KAAK,IAAID,CAAC,EAAE9jB,EAAE,EAAE4jB,EAAEhS,EAAE,EAAE,EAAEoS,EAAE,EAAEJ,EAAEhS,EAAE,EAAE,EAAEqS,EAAEL,EAAEG,CAAC,EAAE/jB,EAAE4jB,EAAEtK,CAAC,EAAE0K,EAAEvL,EAAE,EAAEa,EAAEyK,GAAG/jB,EAAEgkB,GAAGhe,EAAE4d,EAAEtK,CAAC,EAAEtZ,EAAE4jB,EAAEG,CAAC,EAAEC,EAAEE,EAAED,EAAExiB,EAAEA,EAAEgX,EAAErH,EAAE3P,EAAEuE,EAAEoL,EAAEA,EAAEyG,EAAEY,GAAGhH,EAAEhQ,EAAE2P,EAAEM,GAAG,GAAGuS,EAAEvS,EAAEjQ,EAAEuE,EAAEyL,EAAEL,GAAGqR,EAAEwB,EAAEvS,EAAEA,EAAE+G,EAAEhH,EAAEC,EAAE1L,EAAEyL,EAAEA,EAAE0S,GAAG,KAAK,MAAMtM,EAAEqM,EAAEzB,CAAC,EAAE,KAAK,IAAI,KAAK,GAAG,EAAExc,EAAE,KAAK,IAAIke,CAAC,EAAEC,EAAE,KAAK,IAAID,CAAC,EAAEvS,EAAE,GAAG,KAAK,IAAIiS,CAAC,EAAE,KAAK,KAAKK,EAAEN,EAAEQ,CAAC,EAAEvM,EAAE5R,EAAEme,EAAE3B,EAAEmB,EAAE3d,CAAC,CAAC,EAAE2L,EAAE,GAAG,KAAK,IAAIiS,CAAC,EAAE,KAAK,KAAKK,EAAEN,EAAE3d,CAAC,EAAE4R,EAAE5R,EAAEme,EAAE3B,EAAEmB,EAAEQ,CAAC,CAAC,EAAExS,EAAE,KAAK,IAAIuS,EAAE,KAAK,EAAE,CAAC,OAAgBvS,EAAE,YAAX,QAAsB,EAAEiS,IAAIjS,EAAE,UAAU,CAAC,CAACA,EAAE,WAAWA,CAAC,CAAC,CAAE,CAAC,SAASgS,GAAG,CAAC,OAAO,SAASnS,EAAE,CAAC,IAAIL,EAAE,CAAA,EAAG,QAAQM,KAAKD,EAAEL,EAAEM,CAAC,EAAED,EAAEC,CAAC,EAAE,OAAON,CAAC,CAAC,CAACK,EAAE,MAAM,SAASA,EAAE,CAAC,SAASL,EAAEA,EAAE,CAAC,OAAO,KAAK,MAAMA,EAAEK,CAAC,EAAEA,CAAC,CAAC,OAAgBA,IAAT,SAAaA,EAAE,MAAMG,GAAEH,CAAC,EAAE,SAASA,EAAE,CAAC,OAAgBA,EAAE,KAAX,SAAgBA,EAAE,GAAGL,EAAEK,EAAE,EAAE,GAAYA,EAAE,KAAX,SAAgBA,EAAE,GAAGL,EAAEK,EAAE,EAAE,GAAYA,EAAE,KAAX,SAAgBA,EAAE,GAAGL,EAAEK,EAAE,EAAE,GAAYA,EAAE,KAAX,SAAgBA,EAAE,GAAGL,EAAEK,EAAE,EAAE,GAAYA,EAAE,IAAX,SAAeA,EAAE,EAAEL,EAAEK,EAAE,CAAC,GAAYA,EAAE,IAAX,SAAeA,EAAE,EAAEL,EAAEK,EAAE,CAAC,GAAYA,EAAE,KAAX,SAAgBA,EAAE,GAAGL,EAAEK,EAAE,EAAE,GAAYA,EAAE,KAAX,SAAgBA,EAAE,GAAGL,EAAEK,EAAE,EAAE,GAAGA,CAAC,CAAC,EAAEA,EAAE,OAAOL,EAAEK,EAAE,OAAO,UAAU,CAAC,OAAOgS,EAAG,SAAShS,EAAEL,EAAEM,EAAE,CAAC,OAAOD,EAAE,WAAoBA,EAAE,KAAX,SAAgBA,EAAE,IAAIL,GAAYK,EAAE,KAAX,SAAgBA,EAAE,IAAIC,GAAYD,EAAE,KAAX,SAAgBA,EAAE,IAAIL,GAAYK,EAAE,KAAX,SAAgBA,EAAE,IAAIC,GAAYD,EAAE,IAAX,SAAeA,EAAE,GAAGL,GAAYK,EAAE,IAAX,SAAeA,EAAE,GAAGC,GAAGD,EAAE,SAAS,IAAIA,CAAC,CAAC,CAAE,EAAEA,EAAE,cAAc,SAASA,EAAEL,EAAEM,EAAE,CAAC,OAAgBD,IAAT,SAAaA,EAAE,IAAaL,IAAT,SAAaA,EAAE,IAAaM,IAAT,SAAaA,EAAE,IAAI+R,EAAG,SAAShiB,EAAEmQ,EAAE3R,EAAE0R,EAAE6R,EAAE,CAAC,GAAG,MAAM7R,CAAC,GAAG,EAAElQ,EAAE,KAAKmY,EAAE,SAAS,MAAM,IAAI,MAAM,6BAA6B,EAAE,OAAOxI,GAAG3P,EAAE,KAAKmY,EAAE,gBAAgBnY,EAAE,KAAKmY,EAAE,QAAQnY,EAAE,EAAEA,EAAE,SAAS,EAAExB,GAAGyR,GAAGjQ,EAAE,KAAKmY,EAAE,eAAenY,EAAE,KAAKmY,EAAE,QAAQnY,EAAE,EAAEA,EAAE,SAAS,EAAEmQ,GAAGH,GAAGhQ,EAAE,KAAKmY,EAAE,aAAanY,EAAE,KAAKmY,EAAE,QAAQnY,EAAE,EAAEA,EAAE,SAASkQ,EAAEC,EAAED,EAAElQ,EAAE,EAAEA,EAAE,SAAS+hB,EAAEvjB,EAAEujB,GAAG/hB,EAAE,KAAKmY,EAAE,MAAUnY,EAAE,KAAN,GAAcA,EAAE,KAAN,KAAYA,EAAE,KAAKmY,EAAE,QAAQ,OAAOnY,EAAE,GAAG,OAAOA,EAAE,GAAG,OAAOA,EAAE,KAAK,OAAOA,EAAE,SAAS,OAAOA,EAAE,WAAWA,CAAC,CAAC,CAAE,EAAEgQ,EAAE,aAAaC,EAAED,EAAE,QAAQxR,EAAEwR,EAAE,KAAKgS,EAAEhS,EAAE,SAAS,SAASA,EAAE,CAAUA,IAAT,SAAaA,EAAE,GAAGG,GAAEH,CAAC,EAAE,IAAIL,EAAE,IAAIM,EAAE,IAAIjQ,EAAE,IAAIxB,EAAE,IAAI,OAAOwjB,EAAG,SAAS7R,EAAED,EAAE6R,EAAEC,EAAEC,EAAE,CAAC,IAAI7R,EAAE,KAAK,IAAI8R,EAAE,GAAGzD,EAAE,EAAEhH,EAAE,EAAE,GAAGtH,EAAE,KAAKgI,EAAE,kBAAkBsG,EAAE,MAAM9O,CAAC,EAAE,EAAEO,EAAEP,EAAE8H,EAAE,MAAMxH,CAAC,EAAE,EAAE8R,EAAE9R,GAAGE,EAAE,MAAMgI,EAAE,SAASA,EAAE,kBAAkBxI,EAAEQ,EAAE,SAASD,EAAEC,EAAE,GAAGA,EAAE,GAAGF,EAAEE,EAAE,SAAS4R,EAAE5R,EAAE,GAAGA,EAAE,KAAKR,EAAE,IAAIM,EAAE,KAAKE,EAAE,KAAKgI,EAAE,gBAAgBnY,EAAE,MAAMA,CAAC,EAAEkQ,EAAE,EAAEA,EAAElQ,EAAExB,EAAE,MAAMA,CAAC,EAAEujB,EAAE,EAAEA,EAAEvjB,GAAG2R,EAAE,KAAKgI,EAAE,SAASnY,EAAEmQ,EAAE,SAASD,EAAEC,EAAE,GAAGA,EAAE,GAAG3R,EAAE2R,EAAE,SAAS4R,EAAE5R,EAAE,GAAGA,EAAE,KAAKnQ,EAAE,IAAIxB,EAAE,KAAK2R,EAAE,KAAKgI,EAAE,eAAehI,EAAE,KAAKgI,EAAE,MAAUhI,EAAE,KAAN,GAAcA,EAAE,KAAN,GAAU,CAACA,EAAE,WAAWA,EAAE,KAAKgI,EAAE,UAAUhI,EAAE,KAAKgI,EAAE,iBAAiBhI,EAAE,KAAKgI,EAAE,SAAShI,EAAE,KAAKgI,EAAE,eAAe,CAAC,IAAIjd,EAAWiV,EAAE,IAAX,OAAa,EAAEA,EAAE,SAASA,EAAE,EAAEA,EAAE,EAAED,EAAEiS,EAAWhS,EAAE,IAAX,OAAa,EAAEA,EAAE,SAASA,EAAE,EAAEA,EAAE,EAAE4R,EAAEtD,EAAE,MAAMze,CAAC,EAAWmQ,EAAE,KAAX,OAAcsO,EAAEtO,EAAE,SAASA,EAAE,EAAEA,EAAE,GAAGD,EAAElQ,EAAEkQ,EAAEuH,EAAE,MAAMjZ,CAAC,EAAW2R,EAAE,KAAX,OAAcsH,EAAEtH,EAAE,SAASA,EAAE,EAAEA,EAAE,GAAG4R,EAAEvjB,EAAEujB,EAAE,IAAIK,EAAWjS,EAAE,KAAX,OAAc,EAAEA,EAAE,SAASA,EAAE,EAAEA,EAAE,GAAGD,EAAEmS,EAAWlS,EAAE,KAAX,OAAc,EAAEA,EAAE,SAASA,EAAE,EAAEA,EAAE,GAAG4R,EAAE3R,EAAElV,CAAC,GAAG8U,GAAGI,EAAE+R,CAAC,GAAGnS,GAAGI,EAAEqO,CAAC,GAAGzO,GAAGI,EAAEqH,CAAC,GAAGzH,GAAGI,EAAEgS,CAAC,GAAGpS,GAAGI,EAAEiS,CAAC,GAAGrS,IAAIkS,EAAE,GAAG,CAAC,OAAO/R,EAAE,KAAKgI,EAAE,YAAY/H,EAAEF,EAAE8R,CAAC,GAAGhS,GAAGI,EAAE2R,EAAEE,CAAC,GAAGjS,IAAIkS,EAAE,IAAIA,EAAE,CAAA,EAAG/R,CAAC,EAAG,EAAEH,EAAE,OAAO9U,EAAE8U,EAAE,OAAO,SAASA,EAAEL,EAAEM,EAAE,CAAUN,IAAT,SAAaA,EAAE,GAAYM,IAAT,SAAaA,EAAE,GAAGE,GAAEH,EAAEL,EAAEM,CAAC,EAAE,IAAIjQ,EAAE,KAAK,IAAIgQ,CAAC,EAAExR,EAAE,KAAK,IAAIwR,CAAC,EAAE,OAAO9U,EAAEsD,EAAEwB,EAAE,CAACA,EAAExB,EAAEmR,EAAEA,EAAEnR,EAAEyR,EAAEjQ,EAAEiQ,EAAEN,EAAE3P,EAAEiQ,EAAEzR,CAAC,CAAC,EAAEwR,EAAE,UAAU,SAASA,EAAEL,EAAE,CAAC,OAAgBA,IAAT,SAAaA,EAAE,GAAGQ,GAAEH,EAAEL,CAAC,EAAEzU,EAAE,EAAE,EAAE,EAAE,EAAE8U,EAAEL,CAAC,CAAC,EAAEK,EAAE,MAAM,SAASA,EAAEL,EAAE,CAAC,OAAgBA,IAAT,SAAaA,EAAEK,GAAGG,GAAEH,EAAEL,CAAC,EAAEzU,EAAE8U,EAAE,EAAE,EAAEL,EAAE,EAAE,CAAC,CAAC,EAAEK,EAAE,OAAO,SAASA,EAAE,CAAC,OAAOG,GAAEH,CAAC,EAAE9U,EAAE,EAAE,EAAE,KAAK,KAAK8U,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAEA,EAAE,OAAO,SAASA,EAAE,CAAC,OAAOG,GAAEH,CAAC,EAAE9U,EAAE,EAAE,KAAK,KAAK8U,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAEA,EAAE,gBAAgB,SAASA,EAAE,CAAC,OAAgBA,IAAT,SAAaA,EAAE,GAAGG,GAAEH,CAAC,EAAE9U,EAAE,GAAG,EAAE,EAAE,EAAE8U,EAAE,CAAC,CAAC,EAAEA,EAAE,gBAAgB,SAASA,EAAE,CAAC,OAAgBA,IAAT,SAAaA,EAAE,GAAGG,GAAEH,CAAC,EAAE9U,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE8U,CAAC,CAAC,EAAEA,EAAE,OAAO,UAAU,CAAC,OAAOgS,EAAG,SAAShS,EAAEL,EAAEM,EAAE,CAAC,OAAOkI,EAAE,MAAMnI,EAAE,KAAK,SAASA,EAAEL,EAAEM,EAAE,CAAC,IAAIE,EAAE3R,EAAEujB,EAAEC,EAAEhS,EAAE,IAAIE,GAAEF,EAAEL,EAAEM,CAAC,EAAE,QAAQ,EAAE,KAAK,IAAID,EAAE,KAAKA,EAAE,IAAI,EAAEyO,EAAE,KAAK,IAAIzO,EAAE,KAAKA,EAAE,IAAI,EAAE,EAAEyH,EAAE,KAAK,KAAKgH,EAAE,EAAE,EAAEvjB,EAAE,IAAI,MAAMuc,CAAC,EAAE0K,EAAExS,EAAEyS,EAAEnS,EAAEoS,EAAE,EAAEA,EAAE5K,EAAE4K,IAAI,CAAC,IAAIxK,EAAEzH,GAAEJ,EAAE,KAAKA,EAAE,KAAKqS,EAAE5K,CAAC,EAAE6K,EAAElS,GAAEJ,EAAE,KAAKA,EAAE,MAAMqS,EAAE,GAAG5K,CAAC,EAAElZ,EAAE+jB,EAAEzK,EAAE0K,EAAE,EAAE,EAAE,KAAK,IAAIhkB,EAAE0jB,GAAE,CAAC,EAAEO,EAAE,CAAC,KAAK,IAAI3K,EAAEoK,EAAC,EAAEM,EAAE,KAAK,IAAI1K,EAAEoK,EAAC,EAAE,KAAK,IAAIpK,EAAEoK,EAAC,EAAEM,EAAE,KAAK,IAAI1K,EAAEoK,EAAC,CAAC,EAAEjL,EAAEwL,EAAE,CAAC,EAAEje,EAAEie,EAAE,CAAC,EAAEC,EAAE,CAAC,KAAK,IAAIH,EAAEL,EAAC,EAAE,KAAK,IAAIK,EAAEL,EAAC,CAAC,EAAE7L,EAAEqM,EAAE,CAAC,EAAEzB,EAAEyB,EAAE,CAAC,EAAEC,EAAE,CAACtM,EAAEmM,EAAE,KAAK,IAAID,EAAEL,EAAC,EAAEjB,EAAEuB,EAAE,KAAK,IAAID,EAAEL,EAAC,CAAC,EAAEzd,EAAEke,EAAE,CAAC,EAAEC,EAAED,EAAE,CAAC,EAAExnB,EAAEmnB,CAAC,EAAE,CAAC,SAASrS,EAAE,SAAS,KAAKmI,EAAE,QAAQ,EAAE,IAAIyK,EAAE,SAASjT,GAAEM,GAAE,CAAC,IAAIE,GAAEnQ,GAAE,CAAC2P,GAAEK,EAAE,GAAGC,GAAED,EAAE,EAAE,EAAEA,EAAE,IAAI,EAAExR,GAAE2R,GAAE,CAAC,EAAED,GAAEC,GAAE,CAAC,EAAE,MAAM,CAACH,EAAE,GAAGxR,GAAEwR,EAAE,GAAGE,EAAC,CAAC,EAAEC,EAAEyS,EAAE5L,EAAEzS,CAAC,EAAErJ,EAAEmnB,CAAC,EAAE,GAAGlS,EAAE,CAAC,EAAEjV,EAAEmnB,CAAC,EAAE,GAAGlS,EAAE,CAAC,EAAE3R,EAAEokB,EAAEpe,EAAEme,CAAC,EAAEznB,EAAEmnB,CAAC,EAAE,GAAG7jB,EAAE,CAAC,EAAEtD,EAAEmnB,CAAC,EAAE,GAAG7jB,EAAE,CAAC,EAAEujB,EAAEa,EAAExM,EAAE4K,CAAC,EAAE9lB,EAAEmnB,CAAC,EAAE,EAAEN,EAAE,CAAC,EAAE7mB,EAAEmnB,CAAC,EAAE,EAAEN,EAAE,CAAC,EAAE/R,EAAE,WAAW9U,EAAEmnB,CAAC,EAAE,IAAIF,EAAEjnB,EAAEmnB,CAAC,EAAE,IAAID,EAAElnB,EAAEmnB,CAAC,EAAE,IAAIF,EAAEjnB,EAAEmnB,CAAC,EAAE,IAAID,EAAElnB,EAAEmnB,CAAC,EAAE,GAAGF,EAAEjnB,EAAEmnB,CAAC,EAAE,GAAGD,GAAGD,GAAGH,EAAE,CAAC9mB,EAAEmnB,CAAC,EAAE,EAAEnnB,EAAEmnB,CAAC,EAAE,CAAC,GAAG,CAAC,EAAED,EAAEJ,EAAE,CAAC,CAAC,CAAC,OAAO9mB,CAAC,EAAE8U,EAAEA,EAAE,SAAS,EAAEL,EAAEK,EAAE,SAAS,EAAEC,CAAC,EAAED,CAAC,CAAC,CAAE,EAAEA,EAAE,cAAc,UAAU,CAAC,OAAOgS,EAAG,SAAShS,EAAEL,EAAEM,EAAE,CAAC,OAAOD,EAAE,WAAWL,EAAE,EAAEM,EAAE,GAAGkI,EAAE,MAAMnI,EAAE,MAAME,GAAEF,EAAEL,EAAEM,CAAC,EAAED,CAAC,CAAC,CAAE,EAAEA,EAAE,MAAMmS,EAAEnS,EAAE,iBAAiB,UAAU,CAAC,IAAIA,EAAE,SAASA,EAAE,CAAC,IAAIL,EAAE,CAAA,EAAG,QAAQM,KAAKD,EAAEL,EAAEM,CAAC,EAAED,EAAEC,CAAC,EAAE,OAAON,CAAC,EAAE3P,EAAE2P,EAAC,EAAGQ,EAAE3R,EAAC,EAAG,EAAEyR,EAAC,EAAGG,EAAE4R,EAAG,SAASrS,EAAEM,EAAEzR,EAAE,CAAC,IAAIwjB,EAAE,EAAE7R,EAAEnQ,EAAEgQ,EAAEL,CAAC,CAAC,CAAC,CAAC,EAAE,SAASzU,EAAE8U,EAAE,CAACA,EAAEI,EAAE,OAAOA,EAAE,KAAKJ,GAAGA,EAAEI,EAAE,OAAOA,EAAE,KAAKJ,EAAE,CAAC,SAASmS,EAAEnS,EAAE,CAACA,EAAEI,EAAE,OAAOA,EAAE,KAAKJ,GAAGA,EAAEI,EAAE,OAAOA,EAAE,KAAKJ,EAAE,CAAC,GAAGgS,EAAE,KAAK7J,EAAE,mBAAmBjd,EAAE+U,CAAC,EAAEkS,EAAE3jB,CAAC,GAAGwjB,EAAE,KAAK7J,EAAE,eAAejd,EAAE8mB,EAAE,CAAC,EAAEA,EAAE,KAAK7J,EAAE,cAAcgK,EAAEH,EAAE,CAAC,EAAEA,EAAE,KAAK7J,EAAE,UAAUjd,EAAE8mB,EAAE,CAAC,EAAEG,EAAEH,EAAE,CAAC,GAAGA,EAAE,KAAK7J,EAAE,SAAS,CAACjd,EAAE8mB,EAAE,CAAC,EAAEG,EAAEH,EAAE,CAAC,EAAE,QAAQI,EAAE,EAAEC,EAAE5D,GAAExO,EAAE+R,EAAE,GAAGA,EAAE,GAAGA,EAAE,CAAC,EAAEI,EAAEC,EAAE,OAAOD,IAAK,GAAGS,EAAER,EAAED,CAAC,IAAI,EAAES,GAAG3nB,EAAEuc,GAAExH,EAAE+R,EAAE,GAAGA,EAAE,GAAGA,EAAE,EAAEa,CAAC,CAAC,EAAE,QAAQhL,EAAE,EAAEyK,EAAE7D,GAAEjgB,EAAEwjB,EAAE,GAAGA,EAAE,GAAGA,EAAE,CAAC,EAAEnK,EAAEyK,EAAE,OAAOzK,IAAK,GAAGgL,EAAEP,EAAEzK,CAAC,IAAI,EAAEgL,GAAGV,EAAE1K,GAAEjZ,EAAEwjB,EAAE,GAAGA,EAAE,GAAGA,EAAE,EAAEa,CAAC,CAAC,CAAE,CAAC,GAAGb,EAAE,KAAK7J,EAAE,IAAI,CAACjd,EAAE8mB,EAAE,CAAC,EAAEG,EAAEH,EAAE,CAAC,EAAE9R,GAAE8R,EAAE/R,EAAEzR,CAAC,EAAE,QAAQD,EAAEyjB,EAAE,KAAK,IAAI,KAAK,GAAGO,EAAE,KAAK,IAAIhkB,CAAC,EAAEyjB,EAAE,GAAGQ,EAAE,KAAK,IAAIjkB,CAAC,EAAEyjB,EAAE,GAAGhL,EAAE,CAAC,KAAK,IAAIzY,CAAC,EAAEyjB,EAAE,GAAGzd,EAAE,KAAK,IAAIhG,CAAC,EAAEyjB,EAAE,GAAGS,EAAET,EAAE,KAAKA,EAAE,KAAK,CAACA,EAAE,KAAKA,EAAE,IAAI,EAAE,KAAKA,EAAE,KAAK,CAACA,EAAE,KAAK,IAAIA,EAAE,KAAK,GAAG,EAAE,CAACA,EAAE,KAAKA,EAAE,IAAI,EAAE,EAAES,EAAE,CAAC,EAAEzB,EAAEyB,EAAE,CAAC,EAAEC,EAAE,SAAS1S,EAAE,CAAC,IAAIL,EAAEK,EAAE,CAAC,EAAEC,GAAED,EAAE,CAAC,EAAEhQ,GAAE,IAAI,KAAK,MAAMiQ,GAAEN,CAAC,EAAE,KAAK,GAAG,OAAO3P,GAAE,EAAEA,GAAE,IAAIA,EAAC,EAAEwE,EAAE,EAAEme,EAAEZ,GAAE/K,EAAE,CAACuL,EAAE,CAAC,EAAE,IAAIG,CAAC,EAAEle,EAAEme,EAAE,OAAOne,KAAMqe,EAAEF,EAAEne,CAAC,GAAG,GAAGqe,EAAE7B,GAAG9lB,EAAEgnB,GAAEF,EAAE,GAAGO,EAAEvL,EAAE6L,CAAC,CAAC,EAAE,QAAQ,EAAE,EAAEC,EAAEf,GAAExd,EAAE,CAACie,EAAE,CAAC,EAAE,IAAIE,CAAC,EAAE,EAAEI,EAAE,OAAO,IAAI,CAAC,IAAID,GAAGA,EAAEC,EAAE,CAAC,GAAG,GAAGD,EAAE7B,GAAGmB,EAAED,GAAEF,EAAE,GAAGQ,EAAEje,EAAEse,CAAC,CAAC,CAAC,CAAC,CAAC,OAAOlT,CAAC,CAAC,EAAG,OAAOS,EAAE,KAAK,IAAIA,EAAE,KAAK,KAAKA,EAAE,KAAK,IAAIA,EAAE,KAAK,KAAKA,CAAC,CAAC,GAAE4R,IAAIA,EAAE,CAAA,EAAG,EAAE,IAAI9mB,GAAEinB,GAAE,UAAU,CAAC,SAASnS,GAAG,CAAC,CAAC,OAAOA,EAAE,UAAU,MAAM,SAASA,EAAE,CAAC,OAAO,KAAK,UAAUgS,EAAE,MAAMhS,CAAC,CAAC,CAAC,EAAEA,EAAE,UAAU,MAAM,UAAU,CAAC,OAAO,KAAK,UAAUgS,EAAE,OAAM,CAAE,CAAC,EAAEhS,EAAE,UAAU,MAAM,UAAU,CAAC,OAAO,KAAK,UAAUgS,EAAE,OAAM,CAAE,CAAC,EAAEhS,EAAE,UAAU,aAAa,SAASA,EAAEL,EAAEM,EAAE,CAAC,OAAO,KAAK,UAAU+R,EAAE,cAAchS,EAAEL,EAAEM,CAAC,CAAC,CAAC,EAAED,EAAE,UAAU,YAAY,UAAU,CAAC,OAAO,KAAK,UAAUgS,EAAE,aAAY,CAAE,CAAC,EAAEhS,EAAE,UAAU,MAAM,UAAU,CAAC,OAAO,KAAK,UAAUgS,EAAE,QAAO,CAAE,CAAC,EAAEhS,EAAE,UAAU,KAAK,UAAU,CAAC,OAAO,KAAK,UAAUgS,EAAE,OAAM,CAAE,CAAC,EAAEhS,EAAE,UAAU,SAAS,SAASA,EAAE,CAAC,OAAO,KAAK,UAAUgS,EAAE,SAAShS,CAAC,CAAC,CAAC,EAAEA,EAAE,UAAU,UAAU,SAASA,EAAEL,EAAE,CAAC,OAAO,KAAK,UAAUqS,EAAE,UAAUhS,EAAEL,CAAC,CAAC,CAAC,EAAEK,EAAE,UAAU,MAAM,SAASA,EAAEL,EAAE,CAAC,OAAO,KAAK,UAAUqS,EAAE,MAAMhS,EAAEL,CAAC,CAAC,CAAC,EAAEK,EAAE,UAAU,OAAO,SAASA,EAAEL,EAAEM,EAAE,CAAC,OAAO,KAAK,UAAU+R,EAAE,OAAOhS,EAAEL,EAAEM,CAAC,CAAC,CAAC,EAAED,EAAE,UAAU,OAAO,SAASA,EAAEL,EAAEM,EAAE,EAAEE,EAAE3R,EAAE,CAAC,OAAO,KAAK,UAAUwjB,EAAE,OAAOhS,EAAEL,EAAEM,EAAE,EAAEE,EAAE3R,CAAC,CAAC,CAAC,EAAEwR,EAAE,UAAU,MAAM,SAASA,EAAE,CAAC,OAAO,KAAK,UAAUgS,EAAE,OAAOhS,CAAC,CAAC,CAAC,EAAEA,EAAE,UAAU,MAAM,SAASA,EAAE,CAAC,OAAO,KAAK,UAAUgS,EAAE,OAAOhS,CAAC,CAAC,CAAC,EAAEA,EAAE,UAAU,UAAU,SAASA,EAAE,CAAC,OAAO,KAAK,UAAUgS,EAAE,gBAAgBhS,CAAC,CAAC,CAAC,EAAEA,EAAE,UAAU,UAAU,SAASA,EAAE,CAAC,OAAO,KAAK,UAAUgS,EAAE,gBAAgBhS,CAAC,CAAC,CAAC,EAAEA,EAAE,UAAU,aAAa,UAAU,CAAC,OAAO,KAAK,UAAUgS,EAAE,eAAe,CAAC,EAAEhS,CAAC,EAAC,EAAGoS,GAAE,SAASpS,EAAE,CAAC,OAAYA,IAAN,KAAgBA,IAAP,KAAiBA,IAAP,MAAiBA,IAAP;AAAA,CAAQ,EAAEqS,GAAE,SAASrS,EAAE,CAAC,MAAM,KAAmBA,EAAE,WAAW,CAAC,GAAGA,EAAE,WAAW,CAAC,GAAG,EAAiB,EAAE6H,GAAE,SAAS7H,EAAE,CAAC,SAAS,GAAG,CAAC,IAAIL,EAAEK,EAAE,KAAK,IAAI,GAAG,KAAK,OAAOL,EAAE,UAAU,GAAGA,EAAE,eAAe,GAAGA,EAAE,mBAAmB,GAAGA,EAAE,uBAAuB,GAAGA,EAAE,gBAAgB,GAAGA,EAAE,sBAAsB,GAAGA,EAAE,oBAAoB,GAAGA,EAAE,QAAQ,CAAA,EAAGA,CAAC,CAAC,OAAOA,GAAE,EAAEK,CAAC,EAAE,EAAE,UAAU,OAAO,SAAS,EAAE,CAAC,GAAY,IAAT,SAAa,EAAE,CAAA,GAAI,KAAK,MAAM,IAAI,CAAC,EAAM,KAAK,QAAQ,SAAjB,GAAyB,CAAC,KAAK,uBAAuB,MAAM,IAAI,YAAY,uCAAuC,EAAE,OAAO,CAAC,EAAE,EAAE,UAAU,MAAM,SAAS,EAAE,EAAE,CAAC,IAAIC,EAAE,KAAc,IAAT,SAAa,EAAE,CAAA,GAAI,QAAQjQ,EAAE,SAASgQ,EAAE,CAAC,EAAE,KAAKA,CAAC,EAAEC,EAAE,QAAQ,OAAO,EAAEA,EAAE,uBAAuB,EAAE,EAAEE,EAAE,EAAEA,EAAE,EAAE,OAAOA,IAAI,CAAC,IAAI3R,EAAE,EAAE2R,CAAC,EAAED,EAAE,EAAE,KAAK,iBAAiBiI,EAAE,KAAS,KAAK,QAAQ,SAAjB,GAA6B,KAAK,QAAQ,SAAjB,GAA6B,KAAK,UAAU,SAAnB,GAAiC,KAAK,YAAX,KAA4B,KAAK,YAAX,KAAsB4J,EAAEM,GAAE7jB,CAAC,IAAU,KAAK,YAAX,KAA4BA,IAAN,KAAS0R,GAAG,GAAG,CAACmS,GAAE7jB,CAAC,GAAGujB,EAAE,GAASvjB,IAAN,KAAeA,IAAN,IAAQ,GAASA,IAAN,KAAeA,IAAN,KAAS,CAAC,KAAK,iBAAiB,KAAK,sBAAsB,GAASA,IAAN,KAAS,KAAK,iBAAiB,KAAK,qBAAqB0R,EAAE,CAAC,GAAG,KAAK,WAAgB,KAAK,iBAAV,GAAyB,CAAC,IAAI8R,EAAE,OAAO,KAAK,SAAS,EAAE,GAAG,MAAMA,CAAC,EAAE,MAAM,IAAI,YAAY,4BAA4B7R,CAAC,EAAE,GAAG,KAAK,iBAAiBgI,EAAE,KAAI,GAAO,KAAK,QAAQ,SAAjB,GAA6B,KAAK,QAAQ,SAAjB,GAAyB,GAAG,EAAE6J,EAAE,MAAM,IAAI,YAAY,kCAAkCA,EAAE,eAAe7R,EAAE,GAAG,WAAe,KAAK,QAAQ,SAAjB,GAA6B,KAAK,QAAQ,SAAjB,IAAgC,KAAK,YAAX,KAA4B,KAAK,YAAX,IAAqB,MAAM,IAAI,YAAY,yBAAyB,KAAK,UAAU,eAAeA,EAAE,GAAG,EAAE,KAAK,QAAQ,KAAK6R,CAAC,EAAE,KAAK,QAAQ,SAASM,GAAE,KAAK,cAAc,IAAInK,EAAE,gBAAgB,KAAK,eAAenY,EAAE,CAAC,KAAKmY,EAAE,cAAc,SAAS,KAAK,mBAAmB,EAAE6J,CAAC,CAAC,EAAE7J,EAAE,eAAe,KAAK,eAAenY,EAAE,CAAC,KAAKmY,EAAE,aAAa,SAAS,KAAK,mBAAmB,EAAE6J,CAAC,CAAC,EAAE,KAAK,iBAAiB7J,EAAE,SAAS,KAAK,iBAAiBA,EAAE,SAAS,KAAK,iBAAiBA,EAAE,gBAAgBnY,EAAE,CAAC,KAAK,KAAK,eAAe,SAAS,KAAK,mBAAmB,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAEmY,EAAE,UAAU,KAAK,iBAAiB,KAAK,eAAeA,EAAE,UAAU,KAAK,iBAAiBA,EAAE,SAASnY,EAAE,CAAC,KAAKmY,EAAE,SAAS,SAAS,KAAK,mBAAmB,GAAG,KAAK,QAAQ,CAAC,EAAE,GAAG,KAAK,QAAQ,CAAC,EAAE,GAAG,KAAK,QAAQ,CAAC,EAAE,GAAG,KAAK,QAAQ,CAAC,EAAE,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,iBAAiBA,EAAE,gBAAgBnY,EAAE,CAAC,KAAKmY,EAAE,gBAAgB,SAAS,KAAK,mBAAmB,GAAG,KAAK,QAAQ,CAAC,EAAE,GAAG,KAAK,QAAQ,CAAC,EAAE,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,iBAAiBA,EAAE,QAAQnY,EAAE,CAAC,KAAKmY,EAAE,QAAQ,SAAS,KAAK,mBAAmB,GAAG,KAAK,QAAQ,CAAC,EAAE,GAAG,KAAK,QAAQ,CAAC,EAAE,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,iBAAiBA,EAAE,KAAKnY,EAAE,CAAC,KAAKmY,EAAE,IAAI,SAAS,KAAK,mBAAmB,GAAG,KAAK,QAAQ,CAAC,EAAE,GAAG,KAAK,QAAQ,CAAC,EAAE,KAAK,KAAK,QAAQ,CAAC,EAAE,SAAS,KAAK,QAAQ,CAAC,EAAE,UAAU,KAAK,QAAQ,CAAC,EAAE,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,KAAK,UAAU,GAAG,KAAK,sBAAsB,GAAG,KAAK,gBAAgB,GAAG,KAAK,oBAAoB,GAAG,KAAK,uBAAuB,EAAE,CAAC,GAAG,CAACiK,GAAE5jB,CAAC,EAAE,GAASA,IAAN,KAAS,KAAK,uBAAuB,KAAK,uBAAuB,WAAiBA,IAAN,KAAeA,IAAN,KAAeA,IAAN,IAAQ,GAAGujB,EAAE,KAAK,UAAUvjB,EAAE,KAAK,oBAAoB,OAAO,CAAC,GAAO,KAAK,QAAQ,SAAjB,EAAwB,MAAM,IAAI,YAAY,iCAAiC2R,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,uBAAuB,MAAM,IAAI,YAAY,yBAAyB3R,EAAE,cAAc2R,EAAE,+BAA+B,EAAE,GAAG,KAAK,uBAAuB,GAAS3R,IAAN,KAAeA,IAAN,IAAQ,GAASA,IAAN,KAAeA,IAAN,IAAQ,KAAK,eAAe2Z,EAAE,cAAc,KAAK,mBAAyB3Z,IAAN,YAAsBA,IAAN,KAAeA,IAAN,IAAQ,KAAK,eAAe2Z,EAAE,aAAa,KAAK,mBAAyB3Z,IAAN,YAAsBA,IAAN,KAAeA,IAAN,IAAQ,KAAK,eAAe2Z,EAAE,QAAQ,KAAK,mBAAyB3Z,IAAN,YAAsBA,IAAN,KAAeA,IAAN,IAAQ,KAAK,eAAe2Z,EAAE,QAAQ,KAAK,mBAAyB3Z,IAAN,YAAsBA,IAAN,KAAeA,IAAN,IAAQ,KAAK,eAAe2Z,EAAE,SAAS,KAAK,mBAAyB3Z,IAAN,YAAsBA,IAAN,KAAeA,IAAN,IAAQ,KAAK,eAAe2Z,EAAE,gBAAgB,KAAK,mBAAyB3Z,IAAN,YAAsBA,IAAN,KAAeA,IAAN,IAAQ,KAAK,eAAe2Z,EAAE,QAAQ,KAAK,mBAAyB3Z,IAAN,YAAsBA,IAAN,KAAeA,IAAN,IAAQ,KAAK,eAAe2Z,EAAE,eAAe,KAAK,mBAAyB3Z,IAAN,QAAY,CAAC,GAASA,IAAN,KAAeA,IAAN,IAAQ,MAAM,IAAI,YAAY,yBAAyBA,EAAE,cAAc2R,EAAE,GAAG,EAAE,KAAK,eAAegI,EAAE,IAAI,KAAK,mBAAyB3Z,IAAN,GAAO,MAAM,EAAE,KAAK,CAAC,KAAK2Z,EAAE,UAAU,CAAC,EAAE,KAAK,uBAAuB,GAAG,KAAK,eAAe,EAAE,MAAM,KAAK,UAAU3Z,EAAE,KAAK,oBAA0BA,IAAN,GAAO,MAAM,KAAK,WAAWA,EAAE,KAAK,oBAAoB,QAAQ,KAAK,WAAWA,OAAO,KAAK,WAAWA,EAAE,KAAK,gBAAgB,QAAQ,KAAK,WAAWA,EAAE,KAAK,sBAAsB,KAAK,eAAe,CAAC,OAAO,CAAC,EAAE,EAAE,UAAU,UAAU,SAAS,EAAE,CAAC,OAAO,OAAO,OAAO,KAAK,CAAC,MAAM,CAAC,MAAM,SAAS,EAAEyR,EAAE,CAAUA,IAAT,SAAaA,EAAE,CAAA,GAAI,QAAQjQ,EAAE,EAAEmQ,EAAE,OAAO,eAAe,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC,EAAEnQ,EAAEmQ,EAAE,OAAOnQ,IAAI,CAAC,IAAIxB,EAAE2R,EAAEnQ,CAAC,EAAEkQ,EAAE,EAAE1R,CAAC,EAAE,MAAM,QAAQ0R,CAAC,EAAED,EAAE,KAAK,MAAMA,EAAEC,CAAC,EAAED,EAAE,KAAKC,CAAC,CAAC,CAAC,OAAOD,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAEkS,EAAC,EAAEhK,EAAE,SAASnI,EAAE,CAAC,SAAShQ,EAAE2P,EAAE,CAAC,IAAIM,EAAED,EAAE,KAAK,IAAI,GAAG,KAAK,OAAOC,EAAE,SAAmB,OAAON,GAAjB,SAAmB3P,EAAE,MAAM2P,CAAC,EAAEA,EAAEM,CAAC,CAAC,OAAON,GAAE3P,EAAEgQ,CAAC,EAAEhQ,EAAE,UAAU,OAAO,UAAU,CAAC,OAAOA,EAAE,OAAO,KAAK,QAAQ,CAAC,EAAEA,EAAE,UAAU,UAAU,UAAU,CAAC,IAAI,EAAEgiB,EAAE,iBAAgB,EAAG,OAAO,KAAK,UAAU,CAAC,EAAE,CAAC,EAAEhiB,EAAE,UAAU,UAAU,SAAS,EAAE,CAAC,QAAQ,EAAE,CAAA,EAAGiQ,EAAE,EAAEjQ,EAAE,KAAK,SAASiQ,EAAEjQ,EAAE,OAAOiQ,IAAI,CAAC,IAAIE,EAAE,EAAEnQ,EAAEiQ,CAAC,CAAC,EAAE,MAAM,QAAQE,CAAC,EAAE,EAAE,KAAK,MAAM,EAAEA,CAAC,EAAE,EAAE,KAAKA,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE,IAAI,EAAEnQ,EAAE,OAAO,SAAS,EAAE,CAAC,OAAOiQ,GAAE,CAAC,CAAC,EAAEjQ,EAAE,MAAM,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI6X,GAAE5H,EAAE,CAAA,EAAG,OAAO,EAAE,MAAM,EAAEA,CAAC,EAAE,EAAE,OAAOA,CAAC,EAAEA,CAAC,EAAEjQ,EAAE,WAAW,EAAEA,EAAE,QAAQ,EAAEA,EAAE,cAAc,EAAEA,EAAE,aAAa,EAAEA,EAAE,QAAQ,GAAGA,EAAE,SAAS,GAAGA,EAAE,gBAAgB,GAAGA,EAAE,QAAQ,IAAIA,EAAE,eAAe,IAAIA,EAAE,IAAI,IAAIA,EAAE,cAAcA,EAAE,QAAQA,EAAE,cAAcA,EAAE,aAAaA,EAAE,iBAAiBA,EAAE,cAAcA,EAAE,aAAaA,EAAE,QAAQA,EAAE,SAASA,EAAE,gBAAgBA,EAAE,QAAQA,EAAE,eAAeA,EAAE,IAAIA,CAAC,EAAEmiB,EAAC,EAAEG,KAAIpnB,GAAE,CAAA,GAAIid,EAAE,OAAO,EAAE,EAAEjd,GAAEid,EAAE,OAAO,EAAE,EAAEjd,GAAEid,EAAE,aAAa,EAAE,EAAEjd,GAAEid,EAAE,YAAY,EAAE,EAAEjd,GAAEid,EAAE,UAAU,EAAE,EAAEjd,GAAEid,EAAE,OAAO,EAAE,EAAEjd,GAAEid,EAAE,cAAc,EAAE,EAAEjd,GAAEid,EAAE,QAAQ,EAAE,EAAEjd,GAAEid,EAAE,eAAe,EAAE,EAAEjd,GAAEid,EAAE,GAAG,EAAE,EAAEjd,ICblrjB6f,GAAuB9mB,GAAsC,OAC7DiK,GAAgBzI,GAChB2F,GAAWzF,EACXotB,GAAY/qB,GACZjE,GAAQ2F,EACR4c,GAAiB3c,GAEjBqpB,GAAY,WACZlP,GAAkB,OAAO,UACzBmP,GAAiBnP,GAAgBkP,EAAS,EAE1CE,GAAcnvB,GAAM,UAAY,CAAE,OAAOkvB,GAAe,KAAK,CAAE,OAAQ,IAAK,MAAO,GAAG,CAAE,IAAM,MAAO,CAAE,EAEvGE,GAAiBpI,IAAwBkI,GAAe,OAASD,IAIjEE,IAAeC,KACjBjlB,GAAc4V,GAAiBkP,GAAW,UAAoB,CAC5D,IAAI5M,EAAIhb,GAAS,IAAI,EACjBgoB,EAAUL,GAAU3M,EAAE,MAAM,EAC5B1C,EAAQqP,GAAUzM,GAAeF,CAAC,CAAC,EACvC,MAAO,IAAMgN,EAAU,IAAM1P,CACjC,EAAK,CAAE,OAAQ,GAAM,ECxBrB,SAAS2P,GAAQhkB,EAAK,CACpB,0BAEA,OAAI,OAAO,QAAW,YAAc,OAAO,OAAO,UAAa,SAC7DgkB,GAAU,SAAUhkB,EAAK,CACvB,OAAO,OAAOA,CAChB,EAEAgkB,GAAU,SAAUhkB,EAAK,CACvB,OAAOA,GAAO,OAAO,QAAW,YAAcA,EAAI,cAAgB,QAAUA,IAAQ,OAAO,UAAY,SAAW,OAAOA,CAC3H,EAGKgkB,GAAQhkB,CAAG,CACpB,CAEA,SAASikB,GAAgBC,EAAUngB,EAAa,CAC9C,GAAI,EAAEmgB,aAAoBngB,GACxB,MAAM,IAAI,UAAU,mCAAmC,CAE3D,CA8CA,IAAIogB,GAAW,CAAC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAG,EACrwCC,GAAW,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,G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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167]} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/ocrSettingsStore.B3n_bOhs.js b/deploy-package-20260223-151231/frontend/assets/ocrSettingsStore.B3n_bOhs.js deleted file mode 100644 index 9af4def..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ocrSettingsStore.B3n_bOhs.js +++ /dev/null @@ -1,2 +0,0 @@ -import{N as R,a as d,j as h}from"./vendor-core.B6UiYhU_.js";import{b as O}from"./vendor-utils.CO3CyGpV.js";import{n as I,o as w}from"./index.B8XI8FQW.js";const A="/roa2web/api/data-entry",m=O.create({baseURL:A,headers:{"Content-Type":"application/json"}});m.interceptors.request.use(e=>{var l;if(I()){const i=new AbortController;return i.abort(),e.signal=i.signal,e}const n=localStorage.getItem("access_token");n&&(e.headers.Authorization=`Bearer ${n}`);const o=JSON.parse(localStorage.getItem("user")||"{}"),r=o.username,c=localStorage.getItem("last_server_id");let a=null;if(r){const i=c?`selected_company_${r}_${c}`:`selected_company_${r}`,p=localStorage.getItem(i);if(p)try{const u=JSON.parse(p);a=u.id_firma,console.log(`[API] Using company from ${i}:`,u.name||u.id_firma)}catch(u){console.error("Failed to parse saved company:",u)}}return a||(a=(l=o.companies)==null?void 0:l[0]),a&&(e.headers["X-Selected-Company"]=a),e.data instanceof FormData&&delete e.headers["Content-Type"],e});m.interceptors.response.use(e=>(console.log("✅ API Response:",e.config.url,e.status),e),e=>{var n,o,r;return e.code!=="ERR_CANCELED"&&console.error("❌ API Error:",{url:(n=e.config)==null?void 0:n.url,method:(o=e.config)==null?void 0:o.method,code:e.code,message:e.message}),((r=e.response)==null?void 0:r.status)===401&&w(),Promise.reject(e)});const E=R("ocrSettings",()=>{const e=d("doctr_plus"),n=d(["tesseract","doctr","doctr_plus","paddleocr"]),o=d(!1),r=d(null),c=d(!1),a=d({summary:[],stats:null,history:[],historyTotal:0}),l=d(!1),i=h(()=>o.value),p=h(()=>!!r.value);async function u(){if(!c.value){o.value=!0,r.value=null;try{const t=await m.get("/settings/ocr-preference");e.value=t.data.preferred_engine,n.value=t.data.available_engines,c.value=!0,console.log("[OCRSettings] Loaded preference:",e.value)}catch(t){console.error("[OCRSettings] Failed to load preference:",t),r.value=t.message,e.value="doctr_plus"}finally{o.value=!1}}}async function S(t){o.value=!0,r.value=null;try{const s=await m.post("/settings/ocr-preference",{preferred_engine:t});e.value=s.data.preferred_engine,console.log("[OCRSettings] Saved preference:",e.value)}catch(s){throw console.error("[OCRSettings] Failed to save preference:",s),r.value=s.message,s}finally{o.value=!1}}async function f(t=30){l.value=!0;try{const s=await m.get("/metrics/ocr/summary",{params:{days:t}});a.value.summary=s.data,console.log("[OCRSettings] Loaded metrics summary:",a.value.summary.length,"engines")}catch(s){console.error("[OCRSettings] Failed to load metrics summary:",s)}finally{l.value=!1}}async function y(t=30){try{const s=await m.get("/metrics/ocr/stats",{params:{days:t}});a.value.stats=s.data,console.log("[OCRSettings] Loaded metrics stats:",a.value.stats)}catch(s){console.error("[OCRSettings] Failed to load metrics stats:",s)}}async function v(t=50,s=0){try{const g=await m.get("/metrics/ocr/history",{params:{limit:t,offset:s}});a.value.history=g.data.items,a.value.historyTotal=g.data.total,console.log("[OCRSettings] Loaded metrics history:",a.value.history.length,"items")}catch(g){console.error("[OCRSettings] Failed to load metrics history:",g)}}async function _(t=30){l.value=!0;try{await Promise.all([f(t),y(t),v(20)])}finally{l.value=!1}}function C(){e.value="doctr_plus",n.value=["tesseract","doctr","doctr_plus","paddleocr"],o.value=!1,r.value=null,c.value=!1,a.value={summary:[],stats:null,history:[],historyTotal:0}}return{preferredEngine:e,availableEngines:n,loading:o,error:r,initialized:c,metrics:a,metricsLoading:l,isLoading:i,hasError:p,loadPreference:u,setPreference:S,loadMetricsSummary:f,loadMetricsStats:y,loadMetricsHistory:v,loadAllMetrics:_,$reset:C}});export{m as a,E as u}; -//# sourceMappingURL=ocrSettingsStore.B3n_bOhs.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/ocrSettingsStore.B3n_bOhs.js.map b/deploy-package-20260223-151231/frontend/assets/ocrSettingsStore.B3n_bOhs.js.map deleted file mode 100644 index 349b4f4..0000000 --- a/deploy-package-20260223-151231/frontend/assets/ocrSettingsStore.B3n_bOhs.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ocrSettingsStore.B3n_bOhs.js","sources":["../../src/modules/data-entry/services/api.js","../../src/modules/data-entry/stores/ocrSettingsStore.js"],"sourcesContent":["import axios from 'axios'\nimport { handleUnauthorized, isAuthRedirectInProgress } from '@/shared/utils/authRedirect'\n\n// Use relative path - works with both Vite dev proxy and IIS production proxy\nconst baseURL = import.meta.env.BASE_URL + 'api/data-entry'\n\nconst api = axios.create({\n baseURL,\n headers: { 'Content-Type': 'application/json' }\n})\n\n// Request interceptor for auth token and company header\napi.interceptors.request.use((config) => {\n // Skip requests if we're already redirecting to login\n if (isAuthRedirectInProgress()) {\n const controller = new AbortController()\n controller.abort()\n config.signal = controller.signal\n return config\n }\n\n const token = localStorage.getItem('access_token')\n if (token) {\n config.headers.Authorization = `Bearer ${token}`\n }\n\n // Add selected company header if available\n const user = JSON.parse(localStorage.getItem('user') || '{}')\n const username = user.username\n const serverId = localStorage.getItem('last_server_id') // US-031: Get current server ID\n\n // Try to get selected company from saved company object first\n let selectedCompanyId = null\n if (username) {\n // US-031 FIX: Use server-specific key format to avoid cross-server company leakage\n const key = serverId\n ? `selected_company_${username}_${serverId}`\n : `selected_company_${username}`\n\n const savedCompany = localStorage.getItem(key)\n if (savedCompany) {\n try {\n const company = JSON.parse(savedCompany)\n selectedCompanyId = company.id_firma\n console.log(`[API] Using company from ${key}:`, company.name || company.id_firma)\n } catch (e) {\n console.error('Failed to parse saved company:', e)\n }\n }\n }\n\n // Fallback to first company in user.companies if no saved company\n if (!selectedCompanyId) {\n selectedCompanyId = user.companies?.[0]\n }\n\n if (selectedCompanyId) {\n config.headers['X-Selected-Company'] = selectedCompanyId\n }\n\n // For FormData uploads, remove Content-Type header to let browser set it with boundary\n if (config.data instanceof FormData) {\n delete config.headers['Content-Type']\n }\n\n return config\n})\n\n// Response interceptor for error handling\napi.interceptors.response.use(\n (response) => {\n console.log('✅ API Response:', response.config.url, response.status)\n return response\n },\n (error) => {\n // Skip logging for aborted requests (happens during auth redirect)\n if (error.code !== 'ERR_CANCELED') {\n console.error('❌ API Error:', {\n url: error.config?.url,\n method: error.config?.method,\n code: error.code,\n message: error.message\n })\n }\n if (error.response?.status === 401) {\n // Use shared handler to prevent race conditions\n handleUnauthorized()\n }\n return Promise.reject(error)\n }\n)\n\nexport default api\n","/**\n * OCR Settings Store\n *\n * Manages user's OCR engine preference and metrics.\n * - Auto-loads user's preferred engine on mount\n * - Saves preference to backend on change\n * - Provides OCR metrics for dashboard\n */\n\nimport { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport api from '@data-entry/services/api'\n\nexport const useOCRSettingsStore = defineStore('ocrSettings', () => {\n // State\n const preferredEngine = ref('doctr_plus')\n // Available engines\n // NOTE: This default list is overwritten by loadPreference() from backend\n // Backend filters engines based on OCR_ENABLE_PADDLEOCR and OCR_ENABLE_TESSERACT\n const availableEngines = ref([\n 'tesseract',\n 'doctr',\n 'doctr_plus', // Recommended: 2-tier sequential with early exit\n 'paddleocr',\n ])\n const loading = ref(false)\n const error = ref(null)\n const initialized = ref(false)\n\n // Metrics state\n const metrics = ref({\n summary: [],\n stats: null,\n history: [],\n historyTotal: 0,\n })\n const metricsLoading = ref(false)\n\n // Computed\n const isLoading = computed(() => loading.value)\n const hasError = computed(() => !!error.value)\n\n // Actions\n async function loadPreference() {\n if (initialized.value) return\n\n loading.value = true\n error.value = null\n\n try {\n const response = await api.get('/settings/ocr-preference')\n preferredEngine.value = response.data.preferred_engine\n availableEngines.value = response.data.available_engines\n initialized.value = true\n console.log('[OCRSettings] Loaded preference:', preferredEngine.value)\n } catch (err) {\n console.error('[OCRSettings] Failed to load preference:', err)\n error.value = err.message\n // Use defaults on error\n preferredEngine.value = 'doctr_plus'\n } finally {\n loading.value = false\n }\n }\n\n async function setPreference(engine) {\n loading.value = true\n error.value = null\n\n try {\n const response = await api.post('/settings/ocr-preference', {\n preferred_engine: engine\n })\n preferredEngine.value = response.data.preferred_engine\n console.log('[OCRSettings] Saved preference:', preferredEngine.value)\n } catch (err) {\n console.error('[OCRSettings] Failed to save preference:', err)\n error.value = err.message\n throw err\n } finally {\n loading.value = false\n }\n }\n\n async function loadMetricsSummary(days = 30) {\n metricsLoading.value = true\n\n try {\n const response = await api.get('/metrics/ocr/summary', { params: { days } })\n metrics.value.summary = response.data\n console.log('[OCRSettings] Loaded metrics summary:', metrics.value.summary.length, 'engines')\n } catch (err) {\n console.error('[OCRSettings] Failed to load metrics summary:', err)\n } finally {\n metricsLoading.value = false\n }\n }\n\n async function loadMetricsStats(days = 30) {\n try {\n const response = await api.get('/metrics/ocr/stats', { params: { days } })\n metrics.value.stats = response.data\n console.log('[OCRSettings] Loaded metrics stats:', metrics.value.stats)\n } catch (err) {\n console.error('[OCRSettings] Failed to load metrics stats:', err)\n }\n }\n\n async function loadMetricsHistory(limit = 50, offset = 0) {\n try {\n const response = await api.get('/metrics/ocr/history', { params: { limit, offset } })\n metrics.value.history = response.data.items\n metrics.value.historyTotal = response.data.total\n console.log('[OCRSettings] Loaded metrics history:', metrics.value.history.length, 'items')\n } catch (err) {\n console.error('[OCRSettings] Failed to load metrics history:', err)\n }\n }\n\n async function loadAllMetrics(days = 30) {\n metricsLoading.value = true\n try {\n await Promise.all([\n loadMetricsSummary(days),\n loadMetricsStats(days),\n loadMetricsHistory(20),\n ])\n } finally {\n metricsLoading.value = false\n }\n }\n\n // Reset state\n function $reset() {\n preferredEngine.value = 'doctr_plus'\n availableEngines.value = [\n 'tesseract', 'doctr', 'doctr_plus', 'paddleocr',\n ]\n loading.value = false\n error.value = null\n initialized.value = false\n metrics.value = {\n summary: [],\n stats: null,\n history: [],\n historyTotal: 0,\n }\n }\n\n return {\n // State\n preferredEngine,\n availableEngines,\n loading,\n error,\n initialized,\n metrics,\n metricsLoading,\n\n // Computed\n isLoading,\n hasError,\n\n // Actions\n loadPreference,\n setPreference,\n loadMetricsSummary,\n loadMetricsStats,\n loadMetricsHistory,\n loadAllMetrics,\n $reset,\n }\n})\n"],"names":["baseURL","api","axios","config","isAuthRedirectInProgress","controller","token","user","username","serverId","selectedCompanyId","key","savedCompany","company","e","_a","response","error","_b","_c","handleUnauthorized","useOCRSettingsStore","defineStore","preferredEngine","ref","availableEngines","loading","initialized","metrics","metricsLoading","isLoading","computed","hasError","loadPreference","err","setPreference","engine","loadMetricsSummary","days","loadMetricsStats","loadMetricsHistory","limit","offset","loadAllMetrics","$reset"],"mappings":"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"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/primeicons.BubJZjaf.svg b/deploy-package-20260223-151231/frontend/assets/primeicons.BubJZjaf.svg deleted file mode 100644 index eea3f4a..0000000 --- a/deploy-package-20260223-151231/frontend/assets/primeicons.BubJZjaf.svg +++ /dev/null @@ -1,292 +0,0 @@ - - - - - - -{ - "fontFamily": "primeicons", - "majorVersion": 1, - "minorVersion": 0, - "copyright": "PrimeTek Informatics", - "designer": "", - "description": "Icon Library for Prime UI Libraries\nFont generated by IcoMoon.", - "fontURL": "https://github.com/primefaces/primeicons", - "license": "MIT", - "licenseURL": "https://opensource.org/licenses/MIT", - "version": "Version 1.0", - "fontId": "primeicons", - "psName": "primeicons", - "subFamily": "Regular", - "fullName": "primeicons" -} - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/primeicons.CCFeZR6K.woff b/deploy-package-20260223-151231/frontend/assets/primeicons.CCFeZR6K.woff deleted file mode 100644 index 8dfdf0e..0000000 Binary files a/deploy-package-20260223-151231/frontend/assets/primeicons.CCFeZR6K.woff and /dev/null differ diff --git a/deploy-package-20260223-151231/frontend/assets/primeicons.Dk_eWBPK.eot b/deploy-package-20260223-151231/frontend/assets/primeicons.Dk_eWBPK.eot deleted file mode 100644 index 9de56ff..0000000 Binary files a/deploy-package-20260223-151231/frontend/assets/primeicons.Dk_eWBPK.eot and /dev/null differ diff --git a/deploy-package-20260223-151231/frontend/assets/primeicons.DsZ1W7-Z.woff2 b/deploy-package-20260223-151231/frontend/assets/primeicons.DsZ1W7-Z.woff2 deleted file mode 100644 index 093ccee..0000000 Binary files a/deploy-package-20260223-151231/frontend/assets/primeicons.DsZ1W7-Z.woff2 and /dev/null differ diff --git a/deploy-package-20260223-151231/frontend/assets/primeicons.NDVQFXzF.ttf b/deploy-package-20260223-151231/frontend/assets/primeicons.NDVQFXzF.ttf deleted file mode 100644 index 4fd92dc..0000000 Binary files a/deploy-package-20260223-151231/frontend/assets/primeicons.NDVQFXzF.ttf and /dev/null differ diff --git a/deploy-package-20260223-151231/frontend/assets/purify.es.B9ZVCkUG.js b/deploy-package-20260223-151231/frontend/assets/purify.es.B9ZVCkUG.js deleted file mode 100644 index b4d8323..0000000 --- a/deploy-package-20260223-151231/frontend/assets/purify.es.B9ZVCkUG.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! @license DOMPurify 3.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.1/LICENSE */const{entries:_t,setPrototypeOf:ct,isFrozen:Yt,getPrototypeOf:Xt,getOwnPropertyDescriptor:jt}=Object;let{freeze:S,seal:L,create:ve}=Object,{apply:ke,construct:Ue}=typeof Reflect<"u"&&Reflect;S||(S=function(o){return o});L||(L=function(o){return o});ke||(ke=function(o,l){for(var a=arguments.length,c=new Array(a>2?a-2:0),O=2;O1?l-1:0),c=1;c1?l-1:0),c=1;c2&&arguments[2]!==void 0?arguments[2]:ue;ct&&ct(s,null);let a=o.length;for(;a--;){let c=o[a];if(typeof c=="string"){const O=l(c);O!==c&&(Yt(o)||(o[a]=O),c=O)}s[c]=!0}return s}function Jt(s){for(let o=0;o/gm),on=L(/\$\{[\w\W]*/gm),an=L(/^data-[\-\w.\u00B7-\uFFFF]+$/),rn=L(/^aria-[\-\w]+$/),gt=L(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),sn=L(/^(?:\w+script|data):/i),ln=L(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),At=L(/^html$/i),cn=L(/^[a-z][.\w]*(-[.\w]+)+$/i);var dt=Object.freeze({__proto__:null,ARIA_ATTR:rn,ATTR_WHITESPACE:ln,CUSTOM_ELEMENT:cn,DATA_ATTR:an,DOCTYPE_NAME:At,ERB_EXPR:nn,IS_ALLOWED_URI:gt,IS_SCRIPT_OR_DATA:sn,MUSTACHE_EXPR:tn,TMPLIT_EXPR:on});const Q={element:1,text:3,progressingInstruction:7,comment:8,document:9},fn=function(){return typeof window>"u"?null:window},un=function(o,l){if(typeof o!="object"||typeof o.createPolicy!="function")return null;let a=null;const c="data-tt-policy-suffix";l&&l.hasAttribute(c)&&(a=l.getAttribute(c));const O="dompurify"+(a?"#"+a:"");try{return o.createPolicy(O,{createHTML(v){return v},createScriptURL(v){return v}})}catch{return console.warn("TrustedTypes policy "+O+" could not be created."),null}},Et=function(){return{afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}};function ht(){let s=arguments.length>0&&arguments[0]!==void 0?arguments[0]:fn();const o=i=>ht(i);if(o.version="3.3.1",o.removed=[],!s||!s.document||s.document.nodeType!==Q.document||!s.Element)return o.isSupported=!1,o;let{document:l}=s;const a=l,c=a.currentScript,{DocumentFragment:O,HTMLTemplateElement:v,Node:me,Element:Fe,NodeFilter:B,NamedNodeMap:St=s.NamedNodeMap||s.MozNamedAttrMap,HTMLFormElement:Rt,DOMParser:Ot,trustedTypes:ee}=s,Y=Fe.prototype,Dt=J(Y,"cloneNode"),Lt=J(Y,"remove"),yt=J(Y,"nextSibling"),bt=J(Y,"childNodes"),te=J(Y,"parentNode");if(typeof v=="function"){const i=l.createElement("template");i.content&&i.content.ownerDocument&&(l=i.content.ownerDocument)}let g,X="";const{implementation:pe,createNodeIterator:Nt,createDocumentFragment:It,getElementsByTagName:Ct}=l,{importNode:Mt}=a;let A=Et();o.isSupported=typeof _t=="function"&&typeof te=="function"&&pe&&pe.createHTMLDocument!==void 0;const{MUSTACHE_EXPR:Te,ERB_EXPR:de,TMPLIT_EXPR:Ee,DATA_ATTR:wt,ARIA_ATTR:xt,IS_SCRIPT_OR_DATA:Pt,ATTR_WHITESPACE:He,CUSTOM_ELEMENT:vt}=dt;let{IS_ALLOWED_URI:ze}=dt,T=null;const Ge=r({},[...ut,...Me,...we,...xe,...mt]);let d=null;const We=r({},[...pt,...Pe,...Tt,...fe]);let u=Object.seal(ve(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),j=null,_e=null;const k=Object.seal(ve(null,{tagCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeCheck:{writable:!0,configurable:!1,enumerable:!0,value:null}}));let Be=!0,ge=!0,Ye=!1,Xe=!0,U=!1,ne=!0,x=!1,Ae=!1,he=!1,F=!1,oe=!1,ie=!1,je=!0,Ve=!1;const kt="user-content-";let Se=!0,V=!1,H={},b=null;const Re=r({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let $e=null;const qe=r({},["audio","video","img","source","image","track"]);let Oe=null;const Ke=r({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),ae="http://www.w3.org/1998/Math/MathML",re="http://www.w3.org/2000/svg",C="http://www.w3.org/1999/xhtml";let z=C,De=!1,Le=null;const Ut=r({},[ae,re,C],Ie);let se=r({},["mi","mo","mn","ms","mtext"]),le=r({},["annotation-xml"]);const Ft=r({},["title","style","font","a","script"]);let $=null;const Ht=["application/xhtml+xml","text/html"],zt="text/html";let p=null,G=null;const Gt=l.createElement("form"),Ze=function(e){return e instanceof RegExp||e instanceof Function},ye=function(){let e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};if(!(G&&G===e)){if((!e||typeof e!="object")&&(e={}),e=I(e),$=Ht.indexOf(e.PARSER_MEDIA_TYPE)===-1?zt:e.PARSER_MEDIA_TYPE,p=$==="application/xhtml+xml"?Ie:ue,T=y(e,"ALLOWED_TAGS")?r({},e.ALLOWED_TAGS,p):Ge,d=y(e,"ALLOWED_ATTR")?r({},e.ALLOWED_ATTR,p):We,Le=y(e,"ALLOWED_NAMESPACES")?r({},e.ALLOWED_NAMESPACES,Ie):Ut,Oe=y(e,"ADD_URI_SAFE_ATTR")?r(I(Ke),e.ADD_URI_SAFE_ATTR,p):Ke,$e=y(e,"ADD_DATA_URI_TAGS")?r(I(qe),e.ADD_DATA_URI_TAGS,p):qe,b=y(e,"FORBID_CONTENTS")?r({},e.FORBID_CONTENTS,p):Re,j=y(e,"FORBID_TAGS")?r({},e.FORBID_TAGS,p):I({}),_e=y(e,"FORBID_ATTR")?r({},e.FORBID_ATTR,p):I({}),H=y(e,"USE_PROFILES")?e.USE_PROFILES:!1,Be=e.ALLOW_ARIA_ATTR!==!1,ge=e.ALLOW_DATA_ATTR!==!1,Ye=e.ALLOW_UNKNOWN_PROTOCOLS||!1,Xe=e.ALLOW_SELF_CLOSE_IN_ATTR!==!1,U=e.SAFE_FOR_TEMPLATES||!1,ne=e.SAFE_FOR_XML!==!1,x=e.WHOLE_DOCUMENT||!1,F=e.RETURN_DOM||!1,oe=e.RETURN_DOM_FRAGMENT||!1,ie=e.RETURN_TRUSTED_TYPE||!1,he=e.FORCE_BODY||!1,je=e.SANITIZE_DOM!==!1,Ve=e.SANITIZE_NAMED_PROPS||!1,Se=e.KEEP_CONTENT!==!1,V=e.IN_PLACE||!1,ze=e.ALLOWED_URI_REGEXP||gt,z=e.NAMESPACE||C,se=e.MATHML_TEXT_INTEGRATION_POINTS||se,le=e.HTML_INTEGRATION_POINTS||le,u=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&Ze(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(u.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&Ze(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(u.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements=="boolean"&&(u.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),U&&(ge=!1),oe&&(F=!0),H&&(T=r({},mt),d=[],H.html===!0&&(r(T,ut),r(d,pt)),H.svg===!0&&(r(T,Me),r(d,Pe),r(d,fe)),H.svgFilters===!0&&(r(T,we),r(d,Pe),r(d,fe)),H.mathMl===!0&&(r(T,xe),r(d,Tt),r(d,fe))),e.ADD_TAGS&&(typeof e.ADD_TAGS=="function"?k.tagCheck=e.ADD_TAGS:(T===Ge&&(T=I(T)),r(T,e.ADD_TAGS,p))),e.ADD_ATTR&&(typeof e.ADD_ATTR=="function"?k.attributeCheck=e.ADD_ATTR:(d===We&&(d=I(d)),r(d,e.ADD_ATTR,p))),e.ADD_URI_SAFE_ATTR&&r(Oe,e.ADD_URI_SAFE_ATTR,p),e.FORBID_CONTENTS&&(b===Re&&(b=I(b)),r(b,e.FORBID_CONTENTS,p)),e.ADD_FORBID_CONTENTS&&(b===Re&&(b=I(b)),r(b,e.ADD_FORBID_CONTENTS,p)),Se&&(T["#text"]=!0),x&&r(T,["html","head","body"]),T.table&&(r(T,["tbody"]),delete j.tbody),e.TRUSTED_TYPES_POLICY){if(typeof e.TRUSTED_TYPES_POLICY.createHTML!="function")throw Z('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if(typeof e.TRUSTED_TYPES_POLICY.createScriptURL!="function")throw Z('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');g=e.TRUSTED_TYPES_POLICY,X=g.createHTML("")}else g===void 0&&(g=un(ee,c)),g!==null&&typeof X=="string"&&(X=g.createHTML(""));S&&S(e),G=e}},Je=r({},[...Me,...we,...Qt]),Qe=r({},[...xe,...en]),Wt=function(e){let t=te(e);(!t||!t.tagName)&&(t={namespaceURI:z,tagName:"template"});const n=ue(e.tagName),f=ue(t.tagName);return Le[e.namespaceURI]?e.namespaceURI===re?t.namespaceURI===C?n==="svg":t.namespaceURI===ae?n==="svg"&&(f==="annotation-xml"||se[f]):!!Je[n]:e.namespaceURI===ae?t.namespaceURI===C?n==="math":t.namespaceURI===re?n==="math"&&le[f]:!!Qe[n]:e.namespaceURI===C?t.namespaceURI===re&&!le[f]||t.namespaceURI===ae&&!se[f]?!1:!Qe[n]&&(Ft[n]||!Je[n]):!!($==="application/xhtml+xml"&&Le[e.namespaceURI]):!1},N=function(e){q(o.removed,{element:e});try{te(e).removeChild(e)}catch{Lt(e)}},P=function(e,t){try{q(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch{q(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),e==="is")if(F||oe)try{N(t)}catch{}else try{t.setAttribute(e,"")}catch{}},et=function(e){let t=null,n=null;if(he)e=""+e;else{const m=Ce(e,/^[\r\n\t ]+/);n=m&&m[0]}$==="application/xhtml+xml"&&z===C&&(e=''+e+"");const f=g?g.createHTML(e):e;if(z===C)try{t=new Ot().parseFromString(f,$)}catch{}if(!t||!t.documentElement){t=pe.createDocument(z,"template",null);try{t.documentElement.innerHTML=De?X:f}catch{}}const _=t.body||t.documentElement;return e&&n&&_.insertBefore(l.createTextNode(n),_.childNodes[0]||null),z===C?Ct.call(t,x?"html":"body")[0]:x?t.documentElement:_},tt=function(e){return Nt.call(e.ownerDocument||e,e,B.SHOW_ELEMENT|B.SHOW_COMMENT|B.SHOW_TEXT|B.SHOW_PROCESSING_INSTRUCTION|B.SHOW_CDATA_SECTION,null)},be=function(e){return e instanceof Rt&&(typeof e.nodeName!="string"||typeof e.textContent!="string"||typeof e.removeChild!="function"||!(e.attributes instanceof St)||typeof e.removeAttribute!="function"||typeof e.setAttribute!="function"||typeof e.namespaceURI!="string"||typeof e.insertBefore!="function"||typeof e.hasChildNodes!="function")},nt=function(e){return typeof me=="function"&&e instanceof me};function M(i,e,t){ce(i,n=>{n.call(o,e,t,G)})}const ot=function(e){let t=null;if(M(A.beforeSanitizeElements,e,null),be(e))return N(e),!0;const n=p(e.nodeName);if(M(A.uponSanitizeElement,e,{tagName:n,allowedTags:T}),ne&&e.hasChildNodes()&&!nt(e.firstElementChild)&&h(/<[/\w!]/g,e.innerHTML)&&h(/<[/\w!]/g,e.textContent)||e.nodeType===Q.progressingInstruction||ne&&e.nodeType===Q.comment&&h(/<[/\w]/g,e.data))return N(e),!0;if(!(k.tagCheck instanceof Function&&k.tagCheck(n))&&(!T[n]||j[n])){if(!j[n]&&at(n)&&(u.tagNameCheck instanceof RegExp&&h(u.tagNameCheck,n)||u.tagNameCheck instanceof Function&&u.tagNameCheck(n)))return!1;if(Se&&!b[n]){const f=te(e)||e.parentNode,_=bt(e)||e.childNodes;if(_&&f){const m=_.length;for(let D=m-1;D>=0;--D){const w=Dt(_[D],!0);w.__removalCount=(e.__removalCount||0)+1,f.insertBefore(w,yt(e))}}}return N(e),!0}return e instanceof Fe&&!Wt(e)||(n==="noscript"||n==="noembed"||n==="noframes")&&h(/<\/no(script|embed|frames)/i,e.innerHTML)?(N(e),!0):(U&&e.nodeType===Q.text&&(t=e.textContent,ce([Te,de,Ee],f=>{t=K(t,f," ")}),e.textContent!==t&&(q(o.removed,{element:e.cloneNode()}),e.textContent=t)),M(A.afterSanitizeElements,e,null),!1)},it=function(e,t,n){if(je&&(t==="id"||t==="name")&&(n in l||n in Gt))return!1;if(!(ge&&!_e[t]&&h(wt,t))){if(!(Be&&h(xt,t))){if(!(k.attributeCheck instanceof Function&&k.attributeCheck(t,e))){if(!d[t]||_e[t]){if(!(at(e)&&(u.tagNameCheck instanceof RegExp&&h(u.tagNameCheck,e)||u.tagNameCheck instanceof Function&&u.tagNameCheck(e))&&(u.attributeNameCheck instanceof RegExp&&h(u.attributeNameCheck,t)||u.attributeNameCheck instanceof Function&&u.attributeNameCheck(t,e))||t==="is"&&u.allowCustomizedBuiltInElements&&(u.tagNameCheck instanceof RegExp&&h(u.tagNameCheck,n)||u.tagNameCheck instanceof Function&&u.tagNameCheck(n))))return!1}else if(!Oe[t]){if(!h(ze,K(n,He,""))){if(!((t==="src"||t==="xlink:href"||t==="href")&&e!=="script"&&qt(n,"data:")===0&&$e[e])){if(!(Ye&&!h(Pt,K(n,He,"")))){if(n)return!1}}}}}}}return!0},at=function(e){return e!=="annotation-xml"&&Ce(e,vt)},rt=function(e){M(A.beforeSanitizeAttributes,e,null);const{attributes:t}=e;if(!t||be(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:d,forceKeepAttr:void 0};let f=t.length;for(;f--;){const _=t[f],{name:m,namespaceURI:D,value:w}=_,W=p(m),Ne=w;let E=m==="value"?Ne:Kt(Ne);if(n.attrName=W,n.attrValue=E,n.keepAttr=!0,n.forceKeepAttr=void 0,M(A.uponSanitizeAttribute,e,n),E=n.attrValue,Ve&&(W==="id"||W==="name")&&(P(m,e),E=kt+E),ne&&h(/((--!?|])>)|<\/(style|title|textarea)/i,E)){P(m,e);continue}if(W==="attributename"&&Ce(E,"href")){P(m,e);continue}if(n.forceKeepAttr)continue;if(!n.keepAttr){P(m,e);continue}if(!Xe&&h(/\/>/i,E)){P(m,e);continue}U&&ce([Te,de,Ee],lt=>{E=K(E,lt," ")});const st=p(e.nodeName);if(!it(st,W,E)){P(m,e);continue}if(g&&typeof ee=="object"&&typeof ee.getAttributeType=="function"&&!D)switch(ee.getAttributeType(st,W)){case"TrustedHTML":{E=g.createHTML(E);break}case"TrustedScriptURL":{E=g.createScriptURL(E);break}}if(E!==Ne)try{D?e.setAttributeNS(D,m,E):e.setAttribute(m,E),be(e)?N(e):ft(o.removed)}catch{P(m,e)}}M(A.afterSanitizeAttributes,e,null)},Bt=function i(e){let t=null;const n=tt(e);for(M(A.beforeSanitizeShadowDOM,e,null);t=n.nextNode();)M(A.uponSanitizeShadowNode,t,null),ot(t),rt(t),t.content instanceof O&&i(t.content);M(A.afterSanitizeShadowDOM,e,null)};return o.sanitize=function(i){let e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},t=null,n=null,f=null,_=null;if(De=!i,De&&(i=""),typeof i!="string"&&!nt(i))if(typeof i.toString=="function"){if(i=i.toString(),typeof i!="string")throw Z("dirty is not a string, aborting")}else throw Z("toString is not a function");if(!o.isSupported)return i;if(Ae||ye(e),o.removed=[],typeof i=="string"&&(V=!1),V){if(i.nodeName){const w=p(i.nodeName);if(!T[w]||j[w])throw Z("root node is forbidden and cannot be sanitized in-place")}}else if(i instanceof me)t=et(""),n=t.ownerDocument.importNode(i,!0),n.nodeType===Q.element&&n.nodeName==="BODY"||n.nodeName==="HTML"?t=n:t.appendChild(n);else{if(!F&&!U&&!x&&i.indexOf("<")===-1)return g&&ie?g.createHTML(i):i;if(t=et(i),!t)return F?null:ie?X:""}t&&he&&N(t.firstChild);const m=tt(V?i:t);for(;f=m.nextNode();)ot(f),rt(f),f.content instanceof O&&Bt(f.content);if(V)return i;if(F){if(oe)for(_=It.call(t.ownerDocument);t.firstChild;)_.appendChild(t.firstChild);else _=t;return(d.shadowroot||d.shadowrootmode)&&(_=Mt.call(a,_,!0)),_}let D=x?t.outerHTML:t.innerHTML;return x&&T["!doctype"]&&t.ownerDocument&&t.ownerDocument.doctype&&t.ownerDocument.doctype.name&&h(At,t.ownerDocument.doctype.name)&&(D=" -`+D),U&&ce([Te,de,Ee],w=>{D=K(D,w," ")}),g&&ie?g.createHTML(D):D},o.setConfig=function(){let i=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{};ye(i),Ae=!0},o.clearConfig=function(){G=null,Ae=!1},o.isValidAttribute=function(i,e,t){G||ye({});const n=p(i),f=p(e);return it(n,f,t)},o.addHook=function(i,e){typeof e=="function"&&q(A[i],e)},o.removeHook=function(i,e){if(e!==void 0){const t=Vt(A[i],e);return t===-1?void 0:$t(A[i],t,1)[0]}return ft(A[i])},o.removeHooks=function(i){A[i]=[]},o.removeAllHooks=function(){A=Et()},o}var mn=ht();export{mn as default}; -//# sourceMappingURL=purify.es.B9ZVCkUG.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/purify.es.B9ZVCkUG.js.map b/deploy-package-20260223-151231/frontend/assets/purify.es.B9ZVCkUG.js.map deleted file mode 100644 index 014b81a..0000000 --- a/deploy-package-20260223-151231/frontend/assets/purify.es.B9ZVCkUG.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"purify.es.B9ZVCkUG.js","sources":["../../node_modules/dompurify/dist/purify.es.mjs"],"sourcesContent":["/*! @license DOMPurify 3.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.3.1/LICENSE */\n\nconst {\n entries,\n setPrototypeOf,\n isFrozen,\n getPrototypeOf,\n getOwnPropertyDescriptor\n} = Object;\nlet {\n freeze,\n seal,\n create\n} = Object; // eslint-disable-line import/no-mutable-exports\nlet {\n apply,\n construct\n} = typeof Reflect !== 'undefined' && Reflect;\nif (!freeze) {\n freeze = function freeze(x) {\n return x;\n };\n}\nif (!seal) {\n seal = function seal(x) {\n return x;\n };\n}\nif (!apply) {\n apply = function apply(func, thisArg) {\n for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {\n args[_key - 2] = arguments[_key];\n }\n return func.apply(thisArg, args);\n };\n}\nif (!construct) {\n construct = function construct(Func) {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n return new Func(...args);\n };\n}\nconst arrayForEach = unapply(Array.prototype.forEach);\nconst arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);\nconst arrayPop = unapply(Array.prototype.pop);\nconst arrayPush = unapply(Array.prototype.push);\nconst arraySplice = unapply(Array.prototype.splice);\nconst stringToLowerCase = unapply(String.prototype.toLowerCase);\nconst stringToString = unapply(String.prototype.toString);\nconst stringMatch = unapply(String.prototype.match);\nconst stringReplace = unapply(String.prototype.replace);\nconst stringIndexOf = unapply(String.prototype.indexOf);\nconst stringTrim = unapply(String.prototype.trim);\nconst objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);\nconst regExpTest = unapply(RegExp.prototype.test);\nconst typeErrorCreate = unconstruct(TypeError);\n/**\n * Creates a new function that calls the given function with a specified thisArg and arguments.\n *\n * @param func - The function to be wrapped and called.\n * @returns A new function that calls the given function with a specified thisArg and arguments.\n */\nfunction unapply(func) {\n return function (thisArg) {\n if (thisArg instanceof RegExp) {\n thisArg.lastIndex = 0;\n }\n for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {\n args[_key3 - 1] = arguments[_key3];\n }\n return apply(func, thisArg, args);\n };\n}\n/**\n * Creates a new function that constructs an instance of the given constructor function with the provided arguments.\n *\n * @param func - The constructor function to be wrapped and called.\n * @returns A new function that constructs an instance of the given constructor function with the provided arguments.\n */\nfunction unconstruct(Func) {\n return function () {\n for (var _len4 = arguments.length, args = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) {\n args[_key4] = arguments[_key4];\n }\n return construct(Func, args);\n };\n}\n/**\n * Add properties to a lookup table\n *\n * @param set - The set to which elements will be added.\n * @param array - The array containing elements to be added to the set.\n * @param transformCaseFunc - An optional function to transform the case of each element before adding to the set.\n * @returns The modified set with added elements.\n */\nfunction addToSet(set, array) {\n let transformCaseFunc = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : stringToLowerCase;\n if (setPrototypeOf) {\n // Make 'in' and truthy checks like Boolean(set.constructor)\n // independent of any properties defined on Object.prototype.\n // Prevent prototype setters from intercepting set as a this value.\n setPrototypeOf(set, null);\n }\n let l = array.length;\n while (l--) {\n let element = array[l];\n if (typeof element === 'string') {\n const lcElement = transformCaseFunc(element);\n if (lcElement !== element) {\n // Config presets (e.g. tags.js, attrs.js) are immutable.\n if (!isFrozen(array)) {\n array[l] = lcElement;\n }\n element = lcElement;\n }\n }\n set[element] = true;\n }\n return set;\n}\n/**\n * Clean up an array to harden against CSPP\n *\n * @param array - The array to be cleaned.\n * @returns The cleaned version of the array\n */\nfunction cleanArray(array) {\n for (let index = 0; index < array.length; index++) {\n const isPropertyExist = objectHasOwnProperty(array, index);\n if (!isPropertyExist) {\n array[index] = null;\n }\n }\n return array;\n}\n/**\n * Shallow clone an object\n *\n * @param object - The object to be cloned.\n * @returns A new object that copies the original.\n */\nfunction clone(object) {\n const newObject = create(null);\n for (const [property, value] of entries(object)) {\n const isPropertyExist = objectHasOwnProperty(object, property);\n if (isPropertyExist) {\n if (Array.isArray(value)) {\n newObject[property] = cleanArray(value);\n } else if (value && typeof value === 'object' && value.constructor === Object) {\n newObject[property] = clone(value);\n } else {\n newObject[property] = value;\n }\n }\n }\n return newObject;\n}\n/**\n * This method automatically checks if the prop is function or getter and behaves accordingly.\n *\n * @param object - The object to look up the getter function in its prototype chain.\n * @param prop - The property name for which to find the getter function.\n * @returns The getter function found in the prototype chain or a fallback function.\n */\nfunction lookupGetter(object, prop) {\n while (object !== null) {\n const desc = getOwnPropertyDescriptor(object, prop);\n if (desc) {\n if (desc.get) {\n return unapply(desc.get);\n }\n if (typeof desc.value === 'function') {\n return unapply(desc.value);\n }\n }\n object = getPrototypeOf(object);\n }\n function fallbackValue() {\n return null;\n }\n return fallbackValue;\n}\n\nconst html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'search', 'section', 'select', 'shadow', 'slot', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);\nconst svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);\nconst svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);\n// List of SVG elements that are disallowed by default.\n// We still need to know them so that we can do namespace\n// checks properly in case one wants to add them to\n// allow-list.\nconst svgDisallowed = freeze(['animate', 'color-profile', 'cursor', 'discard', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'foreignobject', 'hatch', 'hatchpath', 'mesh', 'meshgradient', 'meshpatch', 'meshrow', 'missing-glyph', 'script', 'set', 'solidcolor', 'unknown', 'use']);\nconst mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover', 'mprescripts']);\n// Similarly to SVG, we want to know all MathML elements,\n// even those that we disallow by default.\nconst mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);\nconst text = freeze(['#text']);\n\nconst html = freeze(['accept', 'action', 'align', 'alt', 'autocapitalize', 'autocomplete', 'autopictureinpicture', 'autoplay', 'background', 'bgcolor', 'border', 'capture', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'controlslist', 'coords', 'crossorigin', 'datetime', 'decoding', 'default', 'dir', 'disabled', 'disablepictureinpicture', 'disableremoteplayback', 'download', 'draggable', 'enctype', 'enterkeyhint', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', 'inputmode', 'integrity', 'ismap', 'kind', 'label', 'lang', 'list', 'loading', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'muted', 'name', 'nonce', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);\nconst svg = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'amplitude', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clippathunits', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'exponent', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'intercept', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'mask-type', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'slope', 'specularconstant', 'specularexponent', 'spreadmethod', 'startoffset', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'systemlanguage', 'tabindex', 'tablevalues', 'targetx', 'targety', 'transform', 'transform-origin', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);\nconst mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);\nconst xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);\n\n// eslint-disable-next-line unicorn/better-regex\nconst MUSTACHE_EXPR = seal(/\\{\\{[\\w\\W]*|[\\w\\W]*\\}\\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode\nconst ERB_EXPR = seal(/<%[\\w\\W]*|[\\w\\W]*%>/gm);\nconst TMPLIT_EXPR = seal(/\\$\\{[\\w\\W]*/gm); // eslint-disable-line unicorn/better-regex\nconst DATA_ATTR = seal(/^data-[\\-\\w.\\u00B7-\\uFFFF]+$/); // eslint-disable-line no-useless-escape\nconst ARIA_ATTR = seal(/^aria-[\\-\\w]+$/); // eslint-disable-line no-useless-escape\nconst IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i // eslint-disable-line no-useless-escape\n);\nconst IS_SCRIPT_OR_DATA = seal(/^(?:\\w+script|data):/i);\nconst ATTR_WHITESPACE = seal(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g // eslint-disable-line no-control-regex\n);\nconst DOCTYPE_NAME = seal(/^html$/i);\nconst CUSTOM_ELEMENT = seal(/^[a-z][.\\w]*(-[.\\w]+)+$/i);\n\nvar EXPRESSIONS = /*#__PURE__*/Object.freeze({\n __proto__: null,\n ARIA_ATTR: ARIA_ATTR,\n ATTR_WHITESPACE: ATTR_WHITESPACE,\n CUSTOM_ELEMENT: CUSTOM_ELEMENT,\n DATA_ATTR: DATA_ATTR,\n DOCTYPE_NAME: DOCTYPE_NAME,\n ERB_EXPR: ERB_EXPR,\n IS_ALLOWED_URI: IS_ALLOWED_URI,\n IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,\n MUSTACHE_EXPR: MUSTACHE_EXPR,\n TMPLIT_EXPR: TMPLIT_EXPR\n});\n\n/* eslint-disable @typescript-eslint/indent */\n// https://developer.mozilla.org/en-US/docs/Web/API/Node/nodeType\nconst NODE_TYPE = {\n element: 1,\n attribute: 2,\n text: 3,\n cdataSection: 4,\n entityReference: 5,\n // Deprecated\n entityNode: 6,\n // Deprecated\n progressingInstruction: 7,\n comment: 8,\n document: 9,\n documentType: 10,\n documentFragment: 11,\n notation: 12 // Deprecated\n};\nconst getGlobal = function getGlobal() {\n return typeof window === 'undefined' ? null : window;\n};\n/**\n * Creates a no-op policy for internal use only.\n * Don't export this function outside this module!\n * @param trustedTypes The policy factory.\n * @param purifyHostElement The Script element used to load DOMPurify (to determine policy name suffix).\n * @return The policy created (or null, if Trusted Types\n * are not supported or creating the policy failed).\n */\nconst _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, purifyHostElement) {\n if (typeof trustedTypes !== 'object' || typeof trustedTypes.createPolicy !== 'function') {\n return null;\n }\n // Allow the callers to control the unique policy name\n // by adding a data-tt-policy-suffix to the script element with the DOMPurify.\n // Policy creation with duplicate names throws in Trusted Types.\n let suffix = null;\n const ATTR_NAME = 'data-tt-policy-suffix';\n if (purifyHostElement && purifyHostElement.hasAttribute(ATTR_NAME)) {\n suffix = purifyHostElement.getAttribute(ATTR_NAME);\n }\n const policyName = 'dompurify' + (suffix ? '#' + suffix : '');\n try {\n return trustedTypes.createPolicy(policyName, {\n createHTML(html) {\n return html;\n },\n createScriptURL(scriptUrl) {\n return scriptUrl;\n }\n });\n } catch (_) {\n // Policy creation failed (most likely another DOMPurify script has\n // already run). Skip creating the policy, as this will only cause errors\n // if TT are enforced.\n console.warn('TrustedTypes policy ' + policyName + ' could not be created.');\n return null;\n }\n};\nconst _createHooksMap = function _createHooksMap() {\n return {\n afterSanitizeAttributes: [],\n afterSanitizeElements: [],\n afterSanitizeShadowDOM: [],\n beforeSanitizeAttributes: [],\n beforeSanitizeElements: [],\n beforeSanitizeShadowDOM: [],\n uponSanitizeAttribute: [],\n uponSanitizeElement: [],\n uponSanitizeShadowNode: []\n };\n};\nfunction createDOMPurify() {\n let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();\n const DOMPurify = root => createDOMPurify(root);\n DOMPurify.version = '3.3.1';\n DOMPurify.removed = [];\n if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {\n // Not running in a browser, provide a factory function\n // so that you can pass your own Window\n DOMPurify.isSupported = false;\n return DOMPurify;\n }\n let {\n document\n } = window;\n const originalDocument = document;\n const currentScript = originalDocument.currentScript;\n const {\n DocumentFragment,\n HTMLTemplateElement,\n Node,\n Element,\n NodeFilter,\n NamedNodeMap = window.NamedNodeMap || window.MozNamedAttrMap,\n HTMLFormElement,\n DOMParser,\n trustedTypes\n } = window;\n const ElementPrototype = Element.prototype;\n const cloneNode = lookupGetter(ElementPrototype, 'cloneNode');\n const remove = lookupGetter(ElementPrototype, 'remove');\n const getNextSibling = lookupGetter(ElementPrototype, 'nextSibling');\n const getChildNodes = lookupGetter(ElementPrototype, 'childNodes');\n const getParentNode = lookupGetter(ElementPrototype, 'parentNode');\n // As per issue #47, the web-components registry is inherited by a\n // new document created via createHTMLDocument. As per the spec\n // (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)\n // a new empty registry is used when creating a template contents owner\n // document, so we use that as our parent document to ensure nothing\n // is inherited.\n if (typeof HTMLTemplateElement === 'function') {\n const template = document.createElement('template');\n if (template.content && template.content.ownerDocument) {\n document = template.content.ownerDocument;\n }\n }\n let trustedTypesPolicy;\n let emptyHTML = '';\n const {\n implementation,\n createNodeIterator,\n createDocumentFragment,\n getElementsByTagName\n } = document;\n const {\n importNode\n } = originalDocument;\n let hooks = _createHooksMap();\n /**\n * Expose whether this browser supports running the full DOMPurify.\n */\n DOMPurify.isSupported = typeof entries === 'function' && typeof getParentNode === 'function' && implementation && implementation.createHTMLDocument !== undefined;\n const {\n MUSTACHE_EXPR,\n ERB_EXPR,\n TMPLIT_EXPR,\n DATA_ATTR,\n ARIA_ATTR,\n IS_SCRIPT_OR_DATA,\n ATTR_WHITESPACE,\n CUSTOM_ELEMENT\n } = EXPRESSIONS;\n let {\n IS_ALLOWED_URI: IS_ALLOWED_URI$1\n } = EXPRESSIONS;\n /**\n * We consider the elements and attributes below to be safe. Ideally\n * don't add any new ones but feel free to remove unwanted ones.\n */\n /* allowed element names */\n let ALLOWED_TAGS = null;\n const DEFAULT_ALLOWED_TAGS = addToSet({}, [...html$1, ...svg$1, ...svgFilters, ...mathMl$1, ...text]);\n /* Allowed attribute names */\n let ALLOWED_ATTR = null;\n const DEFAULT_ALLOWED_ATTR = addToSet({}, [...html, ...svg, ...mathMl, ...xml]);\n /*\n * Configure how DOMPurify should handle custom elements and their attributes as well as customized built-in elements.\n * @property {RegExp|Function|null} tagNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any custom elements)\n * @property {RegExp|Function|null} attributeNameCheck one of [null, regexPattern, predicate]. Default: `null` (disallow any attributes not on the allow list)\n * @property {boolean} allowCustomizedBuiltInElements allow custom elements derived from built-ins if they pass CUSTOM_ELEMENT_HANDLING.tagNameCheck. Default: `false`.\n */\n let CUSTOM_ELEMENT_HANDLING = Object.seal(create(null, {\n tagNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeNameCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n allowCustomizedBuiltInElements: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: false\n }\n }));\n /* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */\n let FORBID_TAGS = null;\n /* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */\n let FORBID_ATTR = null;\n /* Config object to store ADD_TAGS/ADD_ATTR functions (when used as functions) */\n const EXTRA_ELEMENT_HANDLING = Object.seal(create(null, {\n tagCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n },\n attributeCheck: {\n writable: true,\n configurable: false,\n enumerable: true,\n value: null\n }\n }));\n /* Decide if ARIA attributes are okay */\n let ALLOW_ARIA_ATTR = true;\n /* Decide if custom data attributes are okay */\n let ALLOW_DATA_ATTR = true;\n /* Decide if unknown protocols are okay */\n let ALLOW_UNKNOWN_PROTOCOLS = false;\n /* Decide if self-closing tags in attributes are allowed.\n * Usually removed due to a mXSS issue in jQuery 3.0 */\n let ALLOW_SELF_CLOSE_IN_ATTR = true;\n /* Output should be safe for common template engines.\n * This means, DOMPurify removes data attributes, mustaches and ERB\n */\n let SAFE_FOR_TEMPLATES = false;\n /* Output should be safe even for XML used within HTML and alike.\n * This means, DOMPurify removes comments when containing risky content.\n */\n let SAFE_FOR_XML = true;\n /* Decide if document with ... should be returned */\n let WHOLE_DOCUMENT = false;\n /* Track whether config is already set on this instance of DOMPurify. */\n let SET_CONFIG = false;\n /* Decide if all elements (e.g. style, script) must be children of\n * document.body. By default, browsers might move them to document.head */\n let FORCE_BODY = false;\n /* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported).\n * If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead\n */\n let RETURN_DOM = false;\n /* Decide if a DOM `DocumentFragment` should be returned, instead of a html\n * string (or a TrustedHTML object if Trusted Types are supported) */\n let RETURN_DOM_FRAGMENT = false;\n /* Try to return a Trusted Type object instead of a string, return a string in\n * case Trusted Types are not supported */\n let RETURN_TRUSTED_TYPE = false;\n /* Output should be free from DOM clobbering attacks?\n * This sanitizes markups named with colliding, clobberable built-in DOM APIs.\n */\n let SANITIZE_DOM = true;\n /* Achieve full DOM Clobbering protection by isolating the namespace of named\n * properties and JS variables, mitigating attacks that abuse the HTML/DOM spec rules.\n *\n * HTML/DOM spec rules that enable DOM Clobbering:\n * - Named Access on Window (§7.3.3)\n * - DOM Tree Accessors (§3.1.5)\n * - Form Element Parent-Child Relations (§4.10.3)\n * - Iframe srcdoc / Nested WindowProxies (§4.8.5)\n * - HTMLCollection (§4.2.10.2)\n *\n * Namespace isolation is implemented by prefixing `id` and `name` attributes\n * with a constant string, i.e., `user-content-`\n */\n let SANITIZE_NAMED_PROPS = false;\n const SANITIZE_NAMED_PROPS_PREFIX = 'user-content-';\n /* Keep element content when removing element? */\n let KEEP_CONTENT = true;\n /* If a `Node` is passed to sanitize(), then performs sanitization in-place instead\n * of importing it into a new Document and returning a sanitized copy */\n let IN_PLACE = false;\n /* Allow usage of profiles like html, svg and mathMl */\n let USE_PROFILES = {};\n /* Tags to ignore content of when KEEP_CONTENT is true */\n let FORBID_CONTENTS = null;\n const DEFAULT_FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'noscript', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);\n /* Tags that are safe for data: URIs */\n let DATA_URI_TAGS = null;\n const DEFAULT_DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image', 'track']);\n /* Attributes safe for values like \"javascript:\" */\n let URI_SAFE_ATTRIBUTES = null;\n const DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'role', 'summary', 'title', 'value', 'style', 'xmlns']);\n const MATHML_NAMESPACE = 'http://www.w3.org/1998/Math/MathML';\n const SVG_NAMESPACE = 'http://www.w3.org/2000/svg';\n const HTML_NAMESPACE = 'http://www.w3.org/1999/xhtml';\n /* Document namespace */\n let NAMESPACE = HTML_NAMESPACE;\n let IS_EMPTY_INPUT = false;\n /* Allowed XHTML+XML namespaces */\n let ALLOWED_NAMESPACES = null;\n const DEFAULT_ALLOWED_NAMESPACES = addToSet({}, [MATHML_NAMESPACE, SVG_NAMESPACE, HTML_NAMESPACE], stringToString);\n let MATHML_TEXT_INTEGRATION_POINTS = addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']);\n let HTML_INTEGRATION_POINTS = addToSet({}, ['annotation-xml']);\n // Certain elements are allowed in both SVG and HTML\n // namespace. We need to specify them explicitly\n // so that they don't get erroneously deleted from\n // HTML namespace.\n const COMMON_SVG_AND_HTML_ELEMENTS = addToSet({}, ['title', 'style', 'font', 'a', 'script']);\n /* Parsing of strict XHTML documents */\n let PARSER_MEDIA_TYPE = null;\n const SUPPORTED_PARSER_MEDIA_TYPES = ['application/xhtml+xml', 'text/html'];\n const DEFAULT_PARSER_MEDIA_TYPE = 'text/html';\n let transformCaseFunc = null;\n /* Keep a reference to config to pass to hooks */\n let CONFIG = null;\n /* Ideally, do not touch anything below this line */\n /* ______________________________________________ */\n const formElement = document.createElement('form');\n const isRegexOrFunction = function isRegexOrFunction(testValue) {\n return testValue instanceof RegExp || testValue instanceof Function;\n };\n /**\n * _parseConfig\n *\n * @param cfg optional config literal\n */\n // eslint-disable-next-line complexity\n const _parseConfig = function _parseConfig() {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n if (CONFIG && CONFIG === cfg) {\n return;\n }\n /* Shield configuration object from tampering */\n if (!cfg || typeof cfg !== 'object') {\n cfg = {};\n }\n /* Shield configuration object from prototype pollution */\n cfg = clone(cfg);\n PARSER_MEDIA_TYPE =\n // eslint-disable-next-line unicorn/prefer-includes\n SUPPORTED_PARSER_MEDIA_TYPES.indexOf(cfg.PARSER_MEDIA_TYPE) === -1 ? DEFAULT_PARSER_MEDIA_TYPE : cfg.PARSER_MEDIA_TYPE;\n // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.\n transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;\n /* Set configuration parameters */\n ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;\n ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;\n ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;\n URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;\n DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;\n FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;\n FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : clone({});\n FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : clone({});\n USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;\n ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true\n ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true\n ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false\n ALLOW_SELF_CLOSE_IN_ATTR = cfg.ALLOW_SELF_CLOSE_IN_ATTR !== false; // Default true\n SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false\n SAFE_FOR_XML = cfg.SAFE_FOR_XML !== false; // Default true\n WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false\n RETURN_DOM = cfg.RETURN_DOM || false; // Default false\n RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false\n RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false\n FORCE_BODY = cfg.FORCE_BODY || false; // Default false\n SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true\n SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false\n KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true\n IN_PLACE = cfg.IN_PLACE || false; // Default false\n IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;\n NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;\n MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;\n HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;\n CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || {};\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {\n CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;\n }\n if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {\n CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;\n }\n if (SAFE_FOR_TEMPLATES) {\n ALLOW_DATA_ATTR = false;\n }\n if (RETURN_DOM_FRAGMENT) {\n RETURN_DOM = true;\n }\n /* Parse profile info */\n if (USE_PROFILES) {\n ALLOWED_TAGS = addToSet({}, text);\n ALLOWED_ATTR = [];\n if (USE_PROFILES.html === true) {\n addToSet(ALLOWED_TAGS, html$1);\n addToSet(ALLOWED_ATTR, html);\n }\n if (USE_PROFILES.svg === true) {\n addToSet(ALLOWED_TAGS, svg$1);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.svgFilters === true) {\n addToSet(ALLOWED_TAGS, svgFilters);\n addToSet(ALLOWED_ATTR, svg);\n addToSet(ALLOWED_ATTR, xml);\n }\n if (USE_PROFILES.mathMl === true) {\n addToSet(ALLOWED_TAGS, mathMl$1);\n addToSet(ALLOWED_ATTR, mathMl);\n addToSet(ALLOWED_ATTR, xml);\n }\n }\n /* Merge configuration parameters */\n if (cfg.ADD_TAGS) {\n if (typeof cfg.ADD_TAGS === 'function') {\n EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;\n } else {\n if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {\n ALLOWED_TAGS = clone(ALLOWED_TAGS);\n }\n addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);\n }\n }\n if (cfg.ADD_ATTR) {\n if (typeof cfg.ADD_ATTR === 'function') {\n EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;\n } else {\n if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {\n ALLOWED_ATTR = clone(ALLOWED_ATTR);\n }\n addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);\n }\n }\n if (cfg.ADD_URI_SAFE_ATTR) {\n addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);\n }\n if (cfg.FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);\n }\n if (cfg.ADD_FORBID_CONTENTS) {\n if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {\n FORBID_CONTENTS = clone(FORBID_CONTENTS);\n }\n addToSet(FORBID_CONTENTS, cfg.ADD_FORBID_CONTENTS, transformCaseFunc);\n }\n /* Add #text in case KEEP_CONTENT is set to true */\n if (KEEP_CONTENT) {\n ALLOWED_TAGS['#text'] = true;\n }\n /* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */\n if (WHOLE_DOCUMENT) {\n addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);\n }\n /* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */\n if (ALLOWED_TAGS.table) {\n addToSet(ALLOWED_TAGS, ['tbody']);\n delete FORBID_TAGS.tbody;\n }\n if (cfg.TRUSTED_TYPES_POLICY) {\n if (typeof cfg.TRUSTED_TYPES_POLICY.createHTML !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createHTML\" hook.');\n }\n if (typeof cfg.TRUSTED_TYPES_POLICY.createScriptURL !== 'function') {\n throw typeErrorCreate('TRUSTED_TYPES_POLICY configuration option must provide a \"createScriptURL\" hook.');\n }\n // Overwrite existing TrustedTypes policy.\n trustedTypesPolicy = cfg.TRUSTED_TYPES_POLICY;\n // Sign local variables required by `sanitize`.\n emptyHTML = trustedTypesPolicy.createHTML('');\n } else {\n // Uninitialized policy, attempt to initialize the internal dompurify policy.\n if (trustedTypesPolicy === undefined) {\n trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, currentScript);\n }\n // If creating the internal policy succeeded sign internal variables.\n if (trustedTypesPolicy !== null && typeof emptyHTML === 'string') {\n emptyHTML = trustedTypesPolicy.createHTML('');\n }\n }\n // Prevent further manipulation of configuration.\n // Not available in IE8, Safari 5, etc.\n if (freeze) {\n freeze(cfg);\n }\n CONFIG = cfg;\n };\n /* Keep track of all possible SVG and MathML tags\n * so that we can perform the namespace checks\n * correctly. */\n const ALL_SVG_TAGS = addToSet({}, [...svg$1, ...svgFilters, ...svgDisallowed]);\n const ALL_MATHML_TAGS = addToSet({}, [...mathMl$1, ...mathMlDisallowed]);\n /**\n * @param element a DOM element whose namespace is being checked\n * @returns Return false if the element has a\n * namespace that a spec-compliant parser would never\n * return. Return true otherwise.\n */\n const _checkValidNamespace = function _checkValidNamespace(element) {\n let parent = getParentNode(element);\n // In JSDOM, if we're inside shadow DOM, then parentNode\n // can be null. We just simulate parent in this case.\n if (!parent || !parent.tagName) {\n parent = {\n namespaceURI: NAMESPACE,\n tagName: 'template'\n };\n }\n const tagName = stringToLowerCase(element.tagName);\n const parentTagName = stringToLowerCase(parent.tagName);\n if (!ALLOWED_NAMESPACES[element.namespaceURI]) {\n return false;\n }\n if (element.namespaceURI === SVG_NAMESPACE) {\n // The only way to switch from HTML namespace to SVG\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'svg';\n }\n // The only way to switch from MathML to SVG is via`\n // svg if parent is either or MathML\n // text integration points.\n if (parent.namespaceURI === MATHML_NAMESPACE) {\n return tagName === 'svg' && (parentTagName === 'annotation-xml' || MATHML_TEXT_INTEGRATION_POINTS[parentTagName]);\n }\n // We only allow elements that are defined in SVG\n // spec. All others are disallowed in SVG namespace.\n return Boolean(ALL_SVG_TAGS[tagName]);\n }\n if (element.namespaceURI === MATHML_NAMESPACE) {\n // The only way to switch from HTML namespace to MathML\n // is via . If it happens via any other tag, then\n // it should be killed.\n if (parent.namespaceURI === HTML_NAMESPACE) {\n return tagName === 'math';\n }\n // The only way to switch from SVG to MathML is via\n // and HTML integration points\n if (parent.namespaceURI === SVG_NAMESPACE) {\n return tagName === 'math' && HTML_INTEGRATION_POINTS[parentTagName];\n }\n // We only allow elements that are defined in MathML\n // spec. All others are disallowed in MathML namespace.\n return Boolean(ALL_MATHML_TAGS[tagName]);\n }\n if (element.namespaceURI === HTML_NAMESPACE) {\n // The only way to switch from SVG to HTML is via\n // HTML integration points, and from MathML to HTML\n // is via MathML text integration points\n if (parent.namespaceURI === SVG_NAMESPACE && !HTML_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n if (parent.namespaceURI === MATHML_NAMESPACE && !MATHML_TEXT_INTEGRATION_POINTS[parentTagName]) {\n return false;\n }\n // We disallow tags that are specific for MathML\n // or SVG and should never appear in HTML namespace\n return !ALL_MATHML_TAGS[tagName] && (COMMON_SVG_AND_HTML_ELEMENTS[tagName] || !ALL_SVG_TAGS[tagName]);\n }\n // For XHTML and XML documents that support custom namespaces\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && ALLOWED_NAMESPACES[element.namespaceURI]) {\n return true;\n }\n // The code should never reach this place (this means\n // that the element somehow got namespace that is not\n // HTML, SVG, MathML or allowed via ALLOWED_NAMESPACES).\n // Return false just in case.\n return false;\n };\n /**\n * _forceRemove\n *\n * @param node a DOM node\n */\n const _forceRemove = function _forceRemove(node) {\n arrayPush(DOMPurify.removed, {\n element: node\n });\n try {\n // eslint-disable-next-line unicorn/prefer-dom-node-remove\n getParentNode(node).removeChild(node);\n } catch (_) {\n remove(node);\n }\n };\n /**\n * _removeAttribute\n *\n * @param name an Attribute name\n * @param element a DOM node\n */\n const _removeAttribute = function _removeAttribute(name, element) {\n try {\n arrayPush(DOMPurify.removed, {\n attribute: element.getAttributeNode(name),\n from: element\n });\n } catch (_) {\n arrayPush(DOMPurify.removed, {\n attribute: null,\n from: element\n });\n }\n element.removeAttribute(name);\n // We void attribute values for unremovable \"is\" attributes\n if (name === 'is') {\n if (RETURN_DOM || RETURN_DOM_FRAGMENT) {\n try {\n _forceRemove(element);\n } catch (_) {}\n } else {\n try {\n element.setAttribute(name, '');\n } catch (_) {}\n }\n }\n };\n /**\n * _initDocument\n *\n * @param dirty - a string of dirty markup\n * @return a DOM, filled with the dirty markup\n */\n const _initDocument = function _initDocument(dirty) {\n /* Create a HTML document */\n let doc = null;\n let leadingWhitespace = null;\n if (FORCE_BODY) {\n dirty = '' + dirty;\n } else {\n /* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */\n const matches = stringMatch(dirty, /^[\\r\\n\\t ]+/);\n leadingWhitespace = matches && matches[0];\n }\n if (PARSER_MEDIA_TYPE === 'application/xhtml+xml' && NAMESPACE === HTML_NAMESPACE) {\n // Root of XHTML doc must contain xmlns declaration (see https://www.w3.org/TR/xhtml1/normative.html#strict)\n dirty = '' + dirty + '';\n }\n const dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;\n /*\n * Use the DOMParser API by default, fallback later if needs be\n * DOMParser not work for svg when has multiple root element.\n */\n if (NAMESPACE === HTML_NAMESPACE) {\n try {\n doc = new DOMParser().parseFromString(dirtyPayload, PARSER_MEDIA_TYPE);\n } catch (_) {}\n }\n /* Use createHTMLDocument in case DOMParser is not available */\n if (!doc || !doc.documentElement) {\n doc = implementation.createDocument(NAMESPACE, 'template', null);\n try {\n doc.documentElement.innerHTML = IS_EMPTY_INPUT ? emptyHTML : dirtyPayload;\n } catch (_) {\n // Syntax error if dirtyPayload is invalid xml\n }\n }\n const body = doc.body || doc.documentElement;\n if (dirty && leadingWhitespace) {\n body.insertBefore(document.createTextNode(leadingWhitespace), body.childNodes[0] || null);\n }\n /* Work on whole document or just its body */\n if (NAMESPACE === HTML_NAMESPACE) {\n return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];\n }\n return WHOLE_DOCUMENT ? doc.documentElement : body;\n };\n /**\n * Creates a NodeIterator object that you can use to traverse filtered lists of nodes or elements in a document.\n *\n * @param root The root element or node to start traversing on.\n * @return The created NodeIterator\n */\n const _createNodeIterator = function _createNodeIterator(root) {\n return createNodeIterator.call(root.ownerDocument || root, root,\n // eslint-disable-next-line no-bitwise\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT | NodeFilter.SHOW_PROCESSING_INSTRUCTION | NodeFilter.SHOW_CDATA_SECTION, null);\n };\n /**\n * _isClobbered\n *\n * @param element element to check for clobbering attacks\n * @return true if clobbered, false if safe\n */\n const _isClobbered = function _isClobbered(element) {\n return element instanceof HTMLFormElement && (typeof element.nodeName !== 'string' || typeof element.textContent !== 'string' || typeof element.removeChild !== 'function' || !(element.attributes instanceof NamedNodeMap) || typeof element.removeAttribute !== 'function' || typeof element.setAttribute !== 'function' || typeof element.namespaceURI !== 'string' || typeof element.insertBefore !== 'function' || typeof element.hasChildNodes !== 'function');\n };\n /**\n * Checks whether the given object is a DOM node.\n *\n * @param value object to check whether it's a DOM node\n * @return true is object is a DOM node\n */\n const _isNode = function _isNode(value) {\n return typeof Node === 'function' && value instanceof Node;\n };\n function _executeHooks(hooks, currentNode, data) {\n arrayForEach(hooks, hook => {\n hook.call(DOMPurify, currentNode, data, CONFIG);\n });\n }\n /**\n * _sanitizeElements\n *\n * @protect nodeName\n * @protect textContent\n * @protect removeChild\n * @param currentNode to check for permission to exist\n * @return true if node was killed, false if left alive\n */\n const _sanitizeElements = function _sanitizeElements(currentNode) {\n let content = null;\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeElements, currentNode, null);\n /* Check if element is clobbered or can clobber */\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Now let's check the element's type and name */\n const tagName = transformCaseFunc(currentNode.nodeName);\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeElement, currentNode, {\n tagName,\n allowedTags: ALLOWED_TAGS\n });\n /* Detect mXSS attempts abusing namespace confusion */\n if (SAFE_FOR_XML && currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\\w!]/g, currentNode.innerHTML) && regExpTest(/<[/\\w!]/g, currentNode.textContent)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove any occurrence of processing instructions */\n if (currentNode.nodeType === NODE_TYPE.progressingInstruction) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove any kind of possibly harmful comments */\n if (SAFE_FOR_XML && currentNode.nodeType === NODE_TYPE.comment && regExpTest(/<[/\\w]/g, currentNode.data)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Remove element if anything forbids its presence */\n if (!(EXTRA_ELEMENT_HANDLING.tagCheck instanceof Function && EXTRA_ELEMENT_HANDLING.tagCheck(tagName)) && (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName])) {\n /* Check if we have a custom element to handle */\n if (!FORBID_TAGS[tagName] && _isBasicCustomElement(tagName)) {\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, tagName)) {\n return false;\n }\n if (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(tagName)) {\n return false;\n }\n }\n /* Keep content except for bad-listed elements */\n if (KEEP_CONTENT && !FORBID_CONTENTS[tagName]) {\n const parentNode = getParentNode(currentNode) || currentNode.parentNode;\n const childNodes = getChildNodes(currentNode) || currentNode.childNodes;\n if (childNodes && parentNode) {\n const childCount = childNodes.length;\n for (let i = childCount - 1; i >= 0; --i) {\n const childClone = cloneNode(childNodes[i], true);\n childClone.__removalCount = (currentNode.__removalCount || 0) + 1;\n parentNode.insertBefore(childClone, getNextSibling(currentNode));\n }\n }\n }\n _forceRemove(currentNode);\n return true;\n }\n /* Check whether element has a valid namespace */\n if (currentNode instanceof Element && !_checkValidNamespace(currentNode)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Make sure that older browsers don't get fallback-tag mXSS */\n if ((tagName === 'noscript' || tagName === 'noembed' || tagName === 'noframes') && regExpTest(/<\\/no(script|embed|frames)/i, currentNode.innerHTML)) {\n _forceRemove(currentNode);\n return true;\n }\n /* Sanitize element content to be template-safe */\n if (SAFE_FOR_TEMPLATES && currentNode.nodeType === NODE_TYPE.text) {\n /* Get the element's text content */\n content = currentNode.textContent;\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n content = stringReplace(content, expr, ' ');\n });\n if (currentNode.textContent !== content) {\n arrayPush(DOMPurify.removed, {\n element: currentNode.cloneNode()\n });\n currentNode.textContent = content;\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeElements, currentNode, null);\n return false;\n };\n /**\n * _isValidAttribute\n *\n * @param lcTag Lowercase tag name of containing element.\n * @param lcName Lowercase attribute name.\n * @param value Attribute value.\n * @return Returns true if `value` is valid, otherwise false.\n */\n // eslint-disable-next-line complexity\n const _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {\n /* Make sure attribute cannot clobber */\n if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {\n return false;\n }\n /* Allow valid data-* attributes: At least one character after \"-\"\n (https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)\n XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)\n We don't need to check the value; it's always URI safe. */\n if (ALLOW_DATA_ATTR && !FORBID_ATTR[lcName] && regExpTest(DATA_ATTR, lcName)) ; else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR, lcName)) ; else if (EXTRA_ELEMENT_HANDLING.attributeCheck instanceof Function && EXTRA_ELEMENT_HANDLING.attributeCheck(lcName, lcTag)) ; else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {\n if (\n // First condition does a very basic check if a) it's basically a valid custom element tagname AND\n // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck\n _isBasicCustomElement(lcTag) && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, lcTag) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(lcTag)) && (CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.attributeNameCheck, lcName) || CUSTOM_ELEMENT_HANDLING.attributeNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.attributeNameCheck(lcName, lcTag)) ||\n // Alternative, second condition checks if it's an `is`-attribute, AND\n // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck\n lcName === 'is' && CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements && (CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof RegExp && regExpTest(CUSTOM_ELEMENT_HANDLING.tagNameCheck, value) || CUSTOM_ELEMENT_HANDLING.tagNameCheck instanceof Function && CUSTOM_ELEMENT_HANDLING.tagNameCheck(value))) ; else {\n return false;\n }\n /* Check value is safe. First, is attr inert? If so, is safe */\n } else if (URI_SAFE_ATTRIBUTES[lcName]) ; else if (regExpTest(IS_ALLOWED_URI$1, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) ; else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA, stringReplace(value, ATTR_WHITESPACE, ''))) ; else if (value) {\n return false;\n } else ;\n return true;\n };\n /**\n * _isBasicCustomElement\n * checks if at least one dash is included in tagName, and it's not the first char\n * for more sophisticated checking see https://github.com/sindresorhus/validate-element-name\n *\n * @param tagName name of the tag of the node to sanitize\n * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.\n */\n const _isBasicCustomElement = function _isBasicCustomElement(tagName) {\n return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);\n };\n /**\n * _sanitizeAttributes\n *\n * @protect attributes\n * @protect nodeName\n * @protect removeAttribute\n * @protect setAttribute\n *\n * @param currentNode to sanitize\n */\n const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);\n const {\n attributes\n } = currentNode;\n /* Check if we have attributes; if not we might have a text node */\n if (!attributes || _isClobbered(currentNode)) {\n return;\n }\n const hookEvent = {\n attrName: '',\n attrValue: '',\n keepAttr: true,\n allowedAttributes: ALLOWED_ATTR,\n forceKeepAttr: undefined\n };\n let l = attributes.length;\n /* Go backwards over all attributes; safely remove bad ones */\n while (l--) {\n const attr = attributes[l];\n const {\n name,\n namespaceURI,\n value: attrValue\n } = attr;\n const lcName = transformCaseFunc(name);\n const initValue = attrValue;\n let value = name === 'value' ? initValue : stringTrim(initValue);\n /* Execute a hook if present */\n hookEvent.attrName = lcName;\n hookEvent.attrValue = value;\n hookEvent.keepAttr = true;\n hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set\n _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);\n value = hookEvent.attrValue;\n /* Full DOM Clobbering protection via namespace isolation,\n * Prefix id and name attributes with `user-content-`\n */\n if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {\n // Remove the attribute with this value\n _removeAttribute(name, currentNode);\n // Prefix the value and later re-create the attribute with the sanitized value\n value = SANITIZE_NAMED_PROPS_PREFIX + value;\n }\n /* Work around a security issue with comments inside attributes */\n if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\\/(style|title|textarea)/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Make sure we cannot easily use animated hrefs, even if animations are allowed */\n if (lcName === 'attributename' && stringMatch(value, 'href')) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Did the hooks approve of the attribute? */\n if (hookEvent.forceKeepAttr) {\n continue;\n }\n /* Did the hooks approve of the attribute? */\n if (!hookEvent.keepAttr) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Work around a security issue in jQuery 3.0 */\n if (!ALLOW_SELF_CLOSE_IN_ATTR && regExpTest(/\\/>/i, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Sanitize attribute content to be template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n value = stringReplace(value, expr, ' ');\n });\n }\n /* Is `value` valid for this attribute? */\n const lcTag = transformCaseFunc(currentNode.nodeName);\n if (!_isValidAttribute(lcTag, lcName, value)) {\n _removeAttribute(name, currentNode);\n continue;\n }\n /* Handle attributes that require Trusted Types */\n if (trustedTypesPolicy && typeof trustedTypes === 'object' && typeof trustedTypes.getAttributeType === 'function') {\n if (namespaceURI) ; else {\n switch (trustedTypes.getAttributeType(lcTag, lcName)) {\n case 'TrustedHTML':\n {\n value = trustedTypesPolicy.createHTML(value);\n break;\n }\n case 'TrustedScriptURL':\n {\n value = trustedTypesPolicy.createScriptURL(value);\n break;\n }\n }\n }\n }\n /* Handle invalid data-* attribute set by try-catching it */\n if (value !== initValue) {\n try {\n if (namespaceURI) {\n currentNode.setAttributeNS(namespaceURI, name, value);\n } else {\n /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. \"x-schema\". */\n currentNode.setAttribute(name, value);\n }\n if (_isClobbered(currentNode)) {\n _forceRemove(currentNode);\n } else {\n arrayPop(DOMPurify.removed);\n }\n } catch (_) {\n _removeAttribute(name, currentNode);\n }\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);\n };\n /**\n * _sanitizeShadowDOM\n *\n * @param fragment to iterate over recursively\n */\n const _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {\n let shadowNode = null;\n const shadowIterator = _createNodeIterator(fragment);\n /* Execute a hook if present */\n _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);\n while (shadowNode = shadowIterator.nextNode()) {\n /* Execute a hook if present */\n _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);\n /* Sanitize tags and elements */\n _sanitizeElements(shadowNode);\n /* Check attributes next */\n _sanitizeAttributes(shadowNode);\n /* Deep shadow DOM detected */\n if (shadowNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(shadowNode.content);\n }\n }\n /* Execute a hook if present */\n _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);\n };\n // eslint-disable-next-line complexity\n DOMPurify.sanitize = function (dirty) {\n let cfg = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n let body = null;\n let importedNode = null;\n let currentNode = null;\n let returnNode = null;\n /* Make sure we have a string to sanitize.\n DO NOT return early, as this will return the wrong type if\n the user has requested a DOM object rather than a string */\n IS_EMPTY_INPUT = !dirty;\n if (IS_EMPTY_INPUT) {\n dirty = '';\n }\n /* Stringify, in case dirty is an object */\n if (typeof dirty !== 'string' && !_isNode(dirty)) {\n if (typeof dirty.toString === 'function') {\n dirty = dirty.toString();\n if (typeof dirty !== 'string') {\n throw typeErrorCreate('dirty is not a string, aborting');\n }\n } else {\n throw typeErrorCreate('toString is not a function');\n }\n }\n /* Return dirty HTML if DOMPurify cannot run */\n if (!DOMPurify.isSupported) {\n return dirty;\n }\n /* Assign config vars */\n if (!SET_CONFIG) {\n _parseConfig(cfg);\n }\n /* Clean up removed elements */\n DOMPurify.removed = [];\n /* Check if dirty is correctly typed for IN_PLACE */\n if (typeof dirty === 'string') {\n IN_PLACE = false;\n }\n if (IN_PLACE) {\n /* Do some early pre-sanitization to avoid unsafe root nodes */\n if (dirty.nodeName) {\n const tagName = transformCaseFunc(dirty.nodeName);\n if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {\n throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');\n }\n }\n } else if (dirty instanceof Node) {\n /* If dirty is a DOM element, append to an empty document to avoid\n elements being stripped by the parser */\n body = _initDocument('');\n importedNode = body.ownerDocument.importNode(dirty, true);\n if (importedNode.nodeType === NODE_TYPE.element && importedNode.nodeName === 'BODY') {\n /* Node is already a body, use as is */\n body = importedNode;\n } else if (importedNode.nodeName === 'HTML') {\n body = importedNode;\n } else {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n body.appendChild(importedNode);\n }\n } else {\n /* Exit directly if we have nothing to do */\n if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT &&\n // eslint-disable-next-line unicorn/prefer-includes\n dirty.indexOf('<') === -1) {\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(dirty) : dirty;\n }\n /* Initialize the document to work on */\n body = _initDocument(dirty);\n /* Check we have a DOM node from the data */\n if (!body) {\n return RETURN_DOM ? null : RETURN_TRUSTED_TYPE ? emptyHTML : '';\n }\n }\n /* Remove first element node (ours) if FORCE_BODY is set */\n if (body && FORCE_BODY) {\n _forceRemove(body.firstChild);\n }\n /* Get node iterator */\n const nodeIterator = _createNodeIterator(IN_PLACE ? dirty : body);\n /* Now start iterating over the created document */\n while (currentNode = nodeIterator.nextNode()) {\n /* Sanitize tags and elements */\n _sanitizeElements(currentNode);\n /* Check attributes next */\n _sanitizeAttributes(currentNode);\n /* Shadow DOM detected, sanitize it */\n if (currentNode.content instanceof DocumentFragment) {\n _sanitizeShadowDOM(currentNode.content);\n }\n }\n /* If we sanitized `dirty` in-place, return it. */\n if (IN_PLACE) {\n return dirty;\n }\n /* Return sanitized string or DOM */\n if (RETURN_DOM) {\n if (RETURN_DOM_FRAGMENT) {\n returnNode = createDocumentFragment.call(body.ownerDocument);\n while (body.firstChild) {\n // eslint-disable-next-line unicorn/prefer-dom-node-append\n returnNode.appendChild(body.firstChild);\n }\n } else {\n returnNode = body;\n }\n if (ALLOWED_ATTR.shadowroot || ALLOWED_ATTR.shadowrootmode) {\n /*\n AdoptNode() is not used because internal state is not reset\n (e.g. the past names map of a HTMLFormElement), this is safe\n in theory but we would rather not risk another attack vector.\n The state that is cloned by importNode() is explicitly defined\n by the specs.\n */\n returnNode = importNode.call(originalDocument, returnNode, true);\n }\n return returnNode;\n }\n let serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;\n /* Serialize doctype if allowed */\n if (WHOLE_DOCUMENT && ALLOWED_TAGS['!doctype'] && body.ownerDocument && body.ownerDocument.doctype && body.ownerDocument.doctype.name && regExpTest(DOCTYPE_NAME, body.ownerDocument.doctype.name)) {\n serializedHTML = '\\n' + serializedHTML;\n }\n /* Sanitize final string template-safe */\n if (SAFE_FOR_TEMPLATES) {\n arrayForEach([MUSTACHE_EXPR, ERB_EXPR, TMPLIT_EXPR], expr => {\n serializedHTML = stringReplace(serializedHTML, expr, ' ');\n });\n }\n return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;\n };\n DOMPurify.setConfig = function () {\n let cfg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n _parseConfig(cfg);\n SET_CONFIG = true;\n };\n DOMPurify.clearConfig = function () {\n CONFIG = null;\n SET_CONFIG = false;\n };\n DOMPurify.isValidAttribute = function (tag, attr, value) {\n /* Initialize shared config vars if necessary. */\n if (!CONFIG) {\n _parseConfig({});\n }\n const lcTag = transformCaseFunc(tag);\n const lcName = transformCaseFunc(attr);\n return _isValidAttribute(lcTag, lcName, value);\n };\n DOMPurify.addHook = function (entryPoint, hookFunction) {\n if (typeof hookFunction !== 'function') {\n return;\n }\n arrayPush(hooks[entryPoint], hookFunction);\n };\n DOMPurify.removeHook = function (entryPoint, hookFunction) {\n if (hookFunction !== undefined) {\n const index = arrayLastIndexOf(hooks[entryPoint], hookFunction);\n return index === -1 ? undefined : arraySplice(hooks[entryPoint], index, 1)[0];\n }\n return arrayPop(hooks[entryPoint]);\n };\n DOMPurify.removeHooks = function (entryPoint) {\n hooks[entryPoint] = [];\n };\n DOMPurify.removeAllHooks = function () {\n hooks = _createHooksMap();\n };\n return DOMPurify;\n}\nvar purify = createDOMPurify();\n\nexport { purify as default };\n//# sourceMappingURL=purify.es.mjs.map\n"],"names":["entries","setPrototypeOf","isFrozen","getPrototypeOf","getOwnPropertyDescriptor","freeze","seal","create","apply","construct","x","func","thisArg","_len","args","_key","Func","_len2","_key2","arrayForEach","unapply","arrayLastIndexOf","arrayPop","arrayPush","arraySplice","stringToLowerCase","stringToString","stringMatch","stringReplace","stringIndexOf","stringTrim","objectHasOwnProperty","regExpTest","typeErrorCreate","unconstruct","_len3","_key3","_len4","_key4","addToSet","set","array","transformCaseFunc","l","element","lcElement","cleanArray","index","clone","object","newObject","property","value","lookupGetter","prop","desc","fallbackValue","html$1","svg$1","svgFilters","svgDisallowed","mathMl$1","mathMlDisallowed","text","html","svg","mathMl","xml","MUSTACHE_EXPR","ERB_EXPR","TMPLIT_EXPR","DATA_ATTR","ARIA_ATTR","IS_ALLOWED_URI","IS_SCRIPT_OR_DATA","ATTR_WHITESPACE","DOCTYPE_NAME","CUSTOM_ELEMENT","EXPRESSIONS","NODE_TYPE","getGlobal","_createTrustedTypesPolicy","trustedTypes","purifyHostElement","suffix","ATTR_NAME","policyName","scriptUrl","_createHooksMap","createDOMPurify","window","DOMPurify","root","document","originalDocument","currentScript","DocumentFragment","HTMLTemplateElement","Node","Element","NodeFilter","NamedNodeMap","HTMLFormElement","DOMParser","ElementPrototype","cloneNode","remove","getNextSibling","getChildNodes","getParentNode","template","trustedTypesPolicy","emptyHTML","implementation","createNodeIterator","createDocumentFragment","getElementsByTagName","importNode","hooks","IS_ALLOWED_URI$1","ALLOWED_TAGS","DEFAULT_ALLOWED_TAGS","ALLOWED_ATTR","DEFAULT_ALLOWED_ATTR","CUSTOM_ELEMENT_HANDLING","FORBID_TAGS","FORBID_ATTR","EXTRA_ELEMENT_HANDLING","ALLOW_ARIA_ATTR","ALLOW_DATA_ATTR","ALLOW_UNKNOWN_PROTOCOLS","ALLOW_SELF_CLOSE_IN_ATTR","SAFE_FOR_TEMPLATES","SAFE_FOR_XML","WHOLE_DOCUMENT","SET_CONFIG","FORCE_BODY","RETURN_DOM","RETURN_DOM_FRAGMENT","RETURN_TRUSTED_TYPE","SANITIZE_DOM","SANITIZE_NAMED_PROPS","SANITIZE_NAMED_PROPS_PREFIX","KEEP_CONTENT","IN_PLACE","USE_PROFILES","FORBID_CONTENTS","DEFAULT_FORBID_CONTENTS","DATA_URI_TAGS","DEFAULT_DATA_URI_TAGS","URI_SAFE_ATTRIBUTES","DEFAULT_URI_SAFE_ATTRIBUTES","MATHML_NAMESPACE","SVG_NAMESPACE","HTML_NAMESPACE","NAMESPACE","IS_EMPTY_INPUT","ALLOWED_NAMESPACES","DEFAULT_ALLOWED_NAMESPACES","MATHML_TEXT_INTEGRATION_POINTS","HTML_INTEGRATION_POINTS","COMMON_SVG_AND_HTML_ELEMENTS","PARSER_MEDIA_TYPE","SUPPORTED_PARSER_MEDIA_TYPES","DEFAULT_PARSER_MEDIA_TYPE","CONFIG","formElement","isRegexOrFunction","testValue","_parseConfig","cfg","ALL_SVG_TAGS","ALL_MATHML_TAGS","_checkValidNamespace","parent","tagName","parentTagName","_forceRemove","node","_removeAttribute","name","_initDocument","dirty","doc","leadingWhitespace","matches","dirtyPayload","body","_createNodeIterator","_isClobbered","_isNode","_executeHooks","currentNode","data","hook","_sanitizeElements","content","_isBasicCustomElement","parentNode","childNodes","childCount","i","childClone","expr","_isValidAttribute","lcTag","lcName","_sanitizeAttributes","attributes","hookEvent","attr","namespaceURI","attrValue","initValue","_sanitizeShadowDOM","fragment","shadowNode","shadowIterator","importedNode","returnNode","nodeIterator","serializedHTML","tag","entryPoint","hookFunction","purify"],"mappings":"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","x_google_ignoreList":[0]} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/sharedStores.Bb_IRn4Y.js b/deploy-package-20260223-151231/frontend/assets/sharedStores.Bb_IRn4Y.js deleted file mode 100644 index d2af9c1..0000000 --- a/deploy-package-20260223-151231/frontend/assets/sharedStores.Bb_IRn4Y.js +++ /dev/null @@ -1,2 +0,0 @@ -import{n as X,o as Z,l as J,m as Q,c as V}from"./index.B8XI8FQW.js";import{b as k}from"./vendor-utils.CO3CyGpV.js";import{N as K,a as u,j as z}from"./vendor-core.B6UiYhU_.js";const w=k.create({baseURL:"/roa2web/api/reports",headers:{"Content-Type":"application/json"}});w.interceptors.request.use(o=>{if(X()){const r=new AbortController;return r.abort(),o.signal=r.signal,o}const n=localStorage.getItem("access_token");return n&&(o.headers.Authorization=`Bearer ${n}`),o});w.interceptors.response.use(o=>o,o=>{var n;return((n=o.response)==null?void 0:n.status)===401&&Z(),Promise.reject(o)});const G=async(o,n={})=>(await w.get(o,{...n,headers:{...n.headers,"X-Include-Cache-Metadata":"true"}})).data,de=Object.freeze(Object.defineProperty({__proto__:null,default:w,getWithCacheInfo:G},Symbol.toStringTag,{value:"Module"})),ee=K("dashboard",()=>{const o=u(null),n=u(null),r=u(!1),a=u(null),d=u({}),t=u({}),_=u({}),A=u(null),g=u({loading:!1,error:null,data:null,cacheInfo:{hit:!1,time:0,source:null}}),S=u(0),h=new Map,b=async(e,s=null,i=null)=>{var l,p;r.value=!0,a.value=null;try{const f={company:e};s!==null&&(f.luna=s),i!==null&&(f.an=i);const P=await w.get("/dashboard/summary",{params:f});return o.value=P.data,{success:!0}}catch(f){return a.value=((p=(l=f.response)==null?void 0:l.data)==null?void 0:p.detail)||"Failed to load dashboard",console.error("Failed to load dashboard:",f),{success:!1,error:a.value}}finally{r.value=!1}},N=async(e,s="12m",i="line",l=null,p=null)=>{var f,P,$,M,m;r.value=!0,a.value=null;try{console.log(`Loading trend data for company ${e}, period: ${s}, luna: ${l}, an: ${p}`);const c={company:e,period:s};l!==null&&(c.luna=l),p!==null&&(c.an=p);const O=await w.get("/dashboard/trends",{params:c});if(!O.data)throw new Error("Empty response from trends API");console.log("Raw trends response:",O.data);const H=O.data,W=T(H);if(!W)throw new Error("Failed to transform trends data - invalid format");return n.value=W,console.log("Transformed trends data:",W),{success:!0,data:W}}catch(c){const O=((P=(f=c.response)==null?void 0:f.data)==null?void 0:P.detail)||c.message||"Failed to load trend data";return a.value=O,console.error("Failed to load trend data:",c),console.error("Error details:",{status:($=c.response)==null?void 0:$.status,statusText:(M=c.response)==null?void 0:M.statusText,data:(m=c.response)==null?void 0:m.data}),n.value=null,{success:!1,error:a.value}}finally{r.value=!1}},T=e=>{if(!e||!e.periods||!Array.isArray(e.periods)||e.periods.length===0)return console.warn("Invalid trends data received:",e),null;const s=["trezorerie_sold","clienti_sold","furnizori_sold","clienti_incasat","furnizori_achitat"];for(const p of s)if(!e[p]||!Array.isArray(e[p]))return console.warn(`Missing ${p} data`),null;return{labels:[...e.periods].map(p=>{const[f,P]=p.split("-");return new Date(f,P-1).toLocaleDateString("ro-RO",{month:"2-digit",year:"numeric"})}),raw:{periods:e.periods,clienti_facturat:e.clienti_facturat||[],clienti_incasat:e.clienti_incasat||[],clienti_sold:e.clienti_sold||[],furnizori_facturat:e.furnizori_facturat||[],furnizori_achitat:e.furnizori_achitat||[],furnizori_sold:e.furnizori_sold||[],trezorerie_sold:e.trezorerie_sold||[],previous_periods:e.previous_periods||[],clienti_facturat_prev:e.clienti_facturat_prev||[],clienti_incasat_prev:e.clienti_incasat_prev||[],clienti_sold_prev:e.clienti_sold_prev||[],furnizori_facturat_prev:e.furnizori_facturat_prev||[],furnizori_achitat_prev:e.furnizori_achitat_prev||[],furnizori_sold_prev:e.furnizori_sold_prev||[],trezorerie_sold_prev:e.trezorerie_sold_prev||[]},datasets:[{label:"Trezorerie - Sold Net",data:[...e.trezorerie_sold].map(p=>Number(p)||0),borderColor:"rgb(59, 130, 246)",backgroundColor:"rgba(59, 130, 246, 0.1)",tension:.4,fill:!1,pointBackgroundColor:"rgb(59, 130, 246)",pointBorderColor:"#ffffff",pointBorderWidth:2,pointRadius:4,pointHoverRadius:6}]}},R=async(e,s,i=1,l=25,p="",f=null,P=null)=>{var $,M;r.value=!0,a.value=null;try{const m={company:s,data_type:e,page:i,page_size:l,search:p};f!==null&&(m.luna=f),P!==null&&(m.an=P);const c=await w.get("/dashboard/detailed-data",{params:m});return S.value=c.data.total||0,{success:!0,data:c.data.data||[],total:c.data.total||0,page:c.data.page||1}}catch(m){a.value=((M=($=m.response)==null?void 0:$.data)==null?void 0:M.detail)||"Failed to load detailed data",console.error("Failed to load detailed data:",m);const c=D(e);return S.value=c.length,{success:!1,error:a.value,data:c,total:c.length,page:1}}finally{r.value=!1}},D=e=>{switch(e){case"clients":return[{id:1,client:"SC ALPHA SRL",facturat:15e3,incasat:12e3,sold:3e3,status:"Activ"},{id:2,client:"SC BETA SRL",facturat:8500,incasat:8500,sold:0,status:"Activ"},{id:3,client:"SC GAMMA SRL",facturat:22e3,incasat:15e3,sold:7e3,status:"Activ"},{id:4,client:"SC DELTA SRL",facturat:5500,incasat:2e3,sold:3500,status:"Întârziere"},{id:5,client:"SC EPSILON SRL",facturat:18e3,incasat:18e3,sold:0,status:"Activ"}];case"suppliers":return[{id:1,furnizor:"SC SUPPLIER A SRL",facturat:12e3,achitat:1e4,sold:2e3,status:"Activ"},{id:2,furnizor:"SC SUPPLIER B SRL",facturat:7500,achitat:7500,sold:0,status:"Activ"},{id:3,furnizor:"SC SUPPLIER C SRL",facturat:19e3,achitat:12e3,sold:7e3,status:"Pendente"},{id:4,furnizor:"SC SUPPLIER D SRL",facturat:4200,achitat:4200,sold:0,status:"Activ"},{id:5,furnizor:"SC SUPPLIER E SRL",facturat:16800,achitat:8e3,sold:8800,status:"Pendente"}];case"treasury":return[{id:1,cont:"5121",nume_cont:"Cont curent BCR",sold:45e3,valuta:"RON",tip:"Bancă"},{id:2,cont:"5311",nume_cont:"Casa RON",sold:2500,valuta:"RON",tip:"Numerar"},{id:3,cont:"5124",nume_cont:"Cont curent BRD EUR",sold:8500,valuta:"EUR",tip:"Bancă"},{id:4,cont:"5125",nume_cont:"Cont economii ING",sold:125e3,valuta:"RON",tip:"Economii"},{id:5,cont:"5312",nume_cont:"Casa valută",sold:500,valuta:"EUR",tip:"Numerar"}];default:return[]}},U=async(e,s="7d")=>{const i=`performance-${e}-${s}`;if(h.has(i))return d.value[s]=h.get(i),{success:!0,data:h.get(i)};try{const l=await w.get("/dashboard/performance",{params:{company:e,period:s}});return d.value[s]=l.data,h.set(i,l.data),{success:!0,data:l.data}}catch(l){return console.error("Failed to load performance data:",l),{success:!1,error:l.message}}},j=async(e,s="7d")=>{const i=`cashflow-${e}-${s}`;if(h.has(i))return t.value[s]=h.get(i),{success:!0,data:h.get(i)};try{const l=await w.get("/dashboard/cashflow",{params:{company:e,period:s}});return t.value[s]=l.data,h.set(i,l.data),{success:!0,data:l.data}}catch(l){return console.error("Failed to load cashflow data:",l),{success:!1,error:l.message}}},y=async(e,s="7d",i=null,l=null)=>{const p=`maturity-${e}-${s}-${i}-${l}`;if(h.has(p))return _.value[s]=h.get(p),{success:!0,data:h.get(p)};try{const f={company:e,period:s};i!==null&&(f.luna=i),l!==null&&(f.an=l);const P=await w.get("/dashboard/maturity",{params:f});return _.value[s]=P.data,h.set(p,P.data),{success:!0,data:P.data}}catch(f){return console.error("Failed to load maturity data:",f),{success:!1,error:f.message}}},C=async e=>{try{const s=await w.get("/dashboard/current-period",{params:{company:e}});return A.value=s.data,{success:!0,data:s.data}}catch(s){console.error("Failed to load current period:",s);const i=new Date,l={year:i.getFullYear(),month:i.getMonth()+1,period:`${i.getFullYear()}-${String(i.getMonth()+1).padStart(2,"0")}`};return A.value=l,{success:!1,error:s.message,data:l}}},L=async(e,s=null,i=null)=>{var l,p,f,P,$,M;g.value.loading=!0,g.value.error=null;try{const m={company:e};s!==null&&(m.luna=s),i!==null&&(m.an=i);const c=await G("/dashboard/financial-indicators",{params:m});return g.value.data=c,g.value.loading=!1,g.value.cacheInfo={hit:c.cache_hit||!1,time:c.response_time_ms||0,source:c.cache_source||null},{success:!0,data:c}}catch(m){console.error("Failed to load financial indicators:",m);let c="Nu s-au putut încărca indicatorii financiari.";return((l=m.response)==null?void 0:l.status)===403?c="Nu aveți acces la datele acestei firme.":((p=m.response)==null?void 0:p.status)===400?c=((P=(f=m.response)==null?void 0:f.data)==null?void 0:P.detail)||"Parametri invalizi pentru cerere.":(M=($=m.response)==null?void 0:$.data)!=null&&M.detail&&(c=m.response.data.detail),g.value.error=c,g.value.loading=!1,g.value.data=null,g.value.cacheInfo={hit:!1,time:0,source:null},{success:!1,error:c}}},E=z(()=>{var e;return((e=g.value.data)==null?void 0:e.lichiditate)||null}),v=z(()=>{var e;return((e=g.value.data)==null?void 0:e.eficienta)||null}),F=z(()=>{var e;return((e=g.value.data)==null?void 0:e.risc)||null}),Y=z(()=>{var e;return((e=g.value.data)==null?void 0:e.cash_flow)||null}),x=z(()=>{var e;return((e=g.value.data)==null?void 0:e.dinamica)||null}),I=z(()=>{var e;return((e=g.value.data)==null?void 0:e.altman_zscore)||null}),B=()=>{h.clear()};return{summary:o,trends:n,isLoading:r,error:a,loadDashboardSummary:b,loadTrendData:N,loadDetailedData:R,reset:()=>{o.value=null,n.value=null,r.value=!1,a.value=null,d.value={},t.value={},_.value={},A.value=null,g.value={loading:!1,error:null,data:null,cacheInfo:{hit:!1,time:0,source:null}},B()},performanceData:d,cashflowData:t,maturityData:_,currentPeriod:A,loadPerformanceData:U,loadCashFlowData:j,loadMaturityData:y,loadCurrentPeriod:C,clearCache:B,detailedDataTotal:S,financialIndicators:g,loadFinancialIndicators:L,lichiditate:E,eficienta:v,risc:F,cashFlow:Y,dinamica:x,altmanZScore:I}}),ae=K("invoices",()=>{const o=u([]),n=u(!1),r=u(null),a=u({an:null,luna:null}),d=u(0),t=u({company:null,type:"CLIENTI",dateFrom:null,dateTo:null,searchTerm:""}),_=u({page:1,rows:50,totalRecords:0}),A=z(()=>o.value),g=z(()=>o.value.length>0),S=z(()=>_.value.totalRecords),h=z(()=>o.value.filter(v=>v.css_class==="invoice-paid")),b=z(()=>o.value.filter(v=>v.css_class==="invoice-overdue")),N=z(()=>h.value.reduce((v,F)=>v+(F.suma||0),0)),T=z(()=>b.value.reduce((v,F)=>v+(F.suma||0),0)),R=async(v,F={})=>{var Y,x;if(!v)return r.value="Company code is required",{success:!1,error:r.value};n.value=!0,r.value=null;try{const I={partner_type:t.value.type,page:_.value.page,page_size:_.value.rows,...F};if(t.value.dateFrom)if(t.value.dateFrom instanceof Date){const q=t.value.dateFrom.getFullYear(),e=String(t.value.dateFrom.getMonth()+1).padStart(2,"0"),s=String(t.value.dateFrom.getDate()).padStart(2,"0");I.date_from=`${q}-${e}-${s}`}else I.date_from=t.value.dateFrom;if(t.value.dateTo)if(t.value.dateTo instanceof Date){const q=t.value.dateTo.getFullYear(),e=String(t.value.dateTo.getMonth()+1).padStart(2,"0"),s=String(t.value.dateTo.getDate()).padStart(2,"0");I.date_to=`${q}-${e}-${s}`}else I.date_to=t.value.dateTo;t.value.searchTerm&&(I.search=t.value.searchTerm);const B=await w.get("/invoices/",{params:{company:v,...I}});return o.value=B.data.invoices||[],_.value.totalRecords=B.data.total_count||0,d.value=B.data.total_sold_all||0,B.data.accounting_period&&(a.value=B.data.accounting_period),{success:!0}}catch(I){return r.value=((x=(Y=I.response)==null?void 0:Y.data)==null?void 0:x.detail)||"Failed to load invoices",console.error("Failed to load invoices:",I),{success:!1,error:r.value}}finally{n.value=!1}},D=v=>{t.value={...t.value,...v}},U=v=>{_.value={..._.value,...v}},j=v=>{t.value.type=v},y=()=>{t.value={company:null,type:"CLIENTI",dateFrom:null,dateTo:null,searchTerm:""}};return{invoices:o,isLoading:n,error:r,accountingPeriod:a,totalSoldAll:d,filters:t,pagination:_,invoiceList:A,hasInvoices:g,totalInvoices:S,paidInvoices:h,overdueInvoices:b,totalAmountPaid:N,totalAmountOverdue:T,loadInvoices:R,setFilters:D,setPagination:U,setInvoiceType:j,clearFilters:y,clearError:()=>{r.value=null},reset:()=>{o.value=[],n.value=!1,r.value=null,a.value={an:null,luna:null},d.value=0,y(),_.value={page:1,rows:50,totalRecords:0}},getInvoiceById:v=>o.value.find(F=>F.id===v)}}),te=K("treasury",()=>{const o=u([]),n=u(!1),r=u(null),a=u({page:0,rows:50,totalRecords:0}),d=u({total_incasari:0,total_plati:0,sold_precedent_all:0,total_incasari_all:0,total_plati_all:0,sold_final_all:0}),t=u({an:null,luna:null});return{registers:o,isLoading:n,error:r,pagination:a,totals:d,accountingPeriod:t,loadBankCashRegister:async(S,h={})=>{var b,N;n.value=!0,r.value=null;try{const T={company:S,page:a.value.page+1,page_size:a.value.rows,...h},R=await w.get("/treasury/bank-cash-register",{params:T});return o.value=R.data.registers||[],a.value.totalRecords=R.data.total_count||0,d.value={total_incasari:R.data.total_incasari,total_plati:R.data.total_plati,sold_precedent_all:R.data.sold_precedent_all||0,total_incasari_all:R.data.total_incasari_all||0,total_plati_all:R.data.total_plati_all||0,sold_final_all:R.data.sold_final_all||0},R.data.accounting_period&&(t.value=R.data.accounting_period),{success:!0}}catch(T){return r.value=((N=(b=T.response)==null?void 0:b.data)==null?void 0:N.detail)||"Failed to load register",console.error("Failed to load register:",T),{success:!1,error:r.value}}finally{n.value=!1}},setPagination:S=>{a.value={...a.value,...S}},reset:()=>{o.value=[],n.value=!1,r.value=null,t.value={an:null,luna:null},a.value={page:0,rows:50,totalRecords:0}}}}),re=K("trialBalance",()=>{const o=u([]),n=u(!1),r=u(null),a=u({total_sold_precedent_debit:0,total_sold_precedent_credit:0,total_rulaj_lunar_debit:0,total_rulaj_lunar_credit:0,total_sold_final_debit:0,total_sold_final_credit:0}),d=u({luna:new Date().getMonth()+1,an:new Date().getFullYear(),cont:"",denumire:""}),t=u({currentPage:1,pageSize:50,totalItems:0,totalPages:0}),_=u({sortBy:"CONT",sortOrder:"asc"}),A=z(()=>o.value.length>0),g=z(()=>({luna:d.value.luna,an:d.value.an})),S=async y=>{var C,L;if(!y)return r.value="Company code is required",{success:!1,error:r.value};n.value=!0,r.value=null;try{const E={company:y,luna:d.value.luna,an:d.value.an,page:t.value.currentPage,page_size:t.value.pageSize,sort_by:_.value.sortBy,sort_order:_.value.sortOrder};d.value.cont&&(E.cont_filter=d.value.cont),d.value.denumire&&(E.denumire_filter=d.value.denumire);const v=await w.get("/trial-balance/",{params:E});if(v.data.success){o.value=v.data.data.items||[];const F=v.data.data.pagination;return t.value={currentPage:F.current_page,pageSize:F.page_size,totalItems:F.total_items,totalPages:F.total_pages},v.data.data.totals&&(a.value=v.data.data.totals),{success:!0}}else throw new Error("Invalid response format")}catch(E){return r.value=((L=(C=E.response)==null?void 0:C.data)==null?void 0:L.detail)||"Failed to load trial balance data",console.error("Failed to load trial balance:",E),{success:!1,error:r.value}}finally{n.value=!1}};return{trialBalanceData:o,isLoading:n,error:r,totals:a,filters:d,pagination:t,sorting:_,hasData:A,currentPeriod:g,fetchTrialBalance:S,applyFilters:async(y,C)=>{d.value={...d.value,...y},t.value.currentPage=1,await S(C)},clearFilters:async y=>{d.value={luna:new Date().getMonth()+1,an:new Date().getFullYear(),cont:"",denumire:""},t.value.currentPage=1,await S(y)},changePage:async(y,C)=>{t.value.currentPage=y,await S(C)},changePageSize:async(y,C)=>{t.value.pageSize=y,t.value.currentPage=1,await S(C)},sort:async(y,C,L)=>{_.value={sortBy:y,sortOrder:C},t.value.currentPage=1,await S(L)},changePeriod:async(y,C,L)=>{d.value.luna=y,d.value.an=C,t.value.currentPage=1,await S(L)},clearError:()=>{r.value=null},reset:()=>{o.value=[],n.value=!1,r.value=null,a.value={total_sold_precedent_debit:0,total_sold_precedent_credit:0,total_rulaj_lunar_debit:0,total_rulaj_lunar_credit:0,total_sold_final_debit:0,total_sold_final_credit:0},d.value={luna:new Date().getMonth()+1,an:new Date().getFullYear(),cont:"",denumire:""},t.value={currentPage:1,pageSize:50,totalItems:0,totalPages:0},_.value={sortBy:"CONT",sortOrder:"asc"}}}}),se=(o={})=>{const{username:n,serverId:r}=o;console.log("[Reports] Resetting all stores on logout...",{username:n,serverId:r});try{const a=ee();a.reset&&a.reset()}catch(a){console.warn("[Reports] Could not reset dashboard store:",a.message)}try{const a=ae();a.reset&&a.reset()}catch(a){console.warn("[Reports] Could not reset invoices store:",a.message)}try{const a=te();a.reset&&a.reset()}catch(a){console.warn("[Reports] Could not reset treasury store:",a.message)}try{const a=re();a.reset&&a.reset()}catch(a){console.warn("[Reports] Could not reset trial balance store:",a.message)}try{const a=le();a.resetWithContext&&n?a.resetWithContext(n,r):a.reset&&a.reset()}catch(a){console.warn("[Reports] Could not reset company store:",a.message)}try{const a=ne();a.reset&&a.reset()}catch(a){console.warn("[Reports] Could not reset period store:",a.message)}console.log("[Reports] All stores reset complete")},oe=V(w,{onLogout:se}),le=J(w,oe),ne=Q(w);export{ee as a,ne as b,oe as c,ae as d,te as e,re as f,G as g,w as h,de as i,le as u}; -//# sourceMappingURL=sharedStores.Bb_IRn4Y.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/sharedStores.Bb_IRn4Y.js.map b/deploy-package-20260223-151231/frontend/assets/sharedStores.Bb_IRn4Y.js.map deleted file mode 100644 index ff37835..0000000 --- a/deploy-package-20260223-151231/frontend/assets/sharedStores.Bb_IRn4Y.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sharedStores.Bb_IRn4Y.js","sources":["../../src/modules/reports/services/api.js","../../src/modules/reports/stores/dashboard.js","../../src/modules/reports/stores/invoices.js","../../src/modules/reports/stores/treasury.js","../../src/modules/reports/stores/trialBalance.js","../../src/modules/reports/stores/sharedStores.js"],"sourcesContent":["import axios from 'axios'\nimport { handleUnauthorized, isAuthRedirectInProgress } from '@/shared/utils/authRedirect'\n\nconst api = axios.create({\n baseURL: import.meta.env.BASE_URL + 'api/reports',\n headers: { 'Content-Type': 'application/json' }\n})\n\n// Request interceptor for auth token\napi.interceptors.request.use((config) => {\n // Skip requests if we're already redirecting to login\n if (isAuthRedirectInProgress()) {\n const controller = new AbortController()\n controller.abort()\n config.signal = controller.signal\n return config\n }\n\n const token = localStorage.getItem('access_token')\n if (token) {\n config.headers.Authorization = `Bearer ${token}`\n }\n return config\n})\n\n// Response interceptor for error handling\napi.interceptors.response.use(\n (response) => response,\n (error) => {\n if (error.response?.status === 401) {\n // Use shared handler to prevent race conditions\n handleUnauthorized()\n }\n return Promise.reject(error)\n }\n)\n\n/**\n * Helper for GET requests that include cache metadata\n * Returns response data with cache_hit, response_time_ms, cache_source fields\n *\n * @param {string} url - API endpoint path\n * @param {object} options - Axios request config (params, etc.)\n * @returns {Promise} Response data with cache metadata\n */\nexport const getWithCacheInfo = async (url, options = {}) => {\n const response = await api.get(url, {\n ...options,\n headers: {\n ...options.headers,\n 'X-Include-Cache-Metadata': 'true',\n },\n })\n return response.data\n}\n\nexport default api\n","import { defineStore } from \"pinia\";\nimport { ref, computed } from \"vue\";\nimport api, { getWithCacheInfo } from \"@reports/services/api\";\n\nexport const useDashboardStore = defineStore(\"dashboard\", () => {\n // State existent\n const summary = ref(null);\n const trends = ref(null);\n const isLoading = ref(false);\n const error = ref(null);\n\n // State nou pentru carduri\n const performanceData = ref({});\n const cashflowData = ref({});\n const maturityData = ref({});\n const currentPeriod = ref(null);\n\n // State pentru financial indicators (US-013)\n const financialIndicators = ref({\n loading: false,\n error: null,\n data: null,\n cacheInfo: { hit: false, time: 0, source: null },\n });\n\n // State pentru detailed data pagination\n const detailedDataTotal = ref(0);\n\n // Cache pentru date\n const dataCache = new Map();\n\n const loadDashboardSummary = async (companyId, luna = null, an = null) => {\n isLoading.value = true;\n error.value = null;\n\n try {\n const params = { company: companyId };\n if (luna !== null) params.luna = luna;\n if (an !== null) params.an = an;\n\n const response = await api.get(\"/dashboard/summary\", { params });\n summary.value = response.data;\n return { success: true };\n } catch (err) {\n error.value = err.response?.data?.detail || \"Failed to load dashboard\";\n console.error(\"Failed to load dashboard:\", err);\n return { success: false, error: error.value };\n } finally {\n isLoading.value = false;\n }\n };\n\n const loadTrendData = async (\n companyId,\n period = \"12m\",\n chartType = \"line\",\n luna = null,\n an = null,\n ) => {\n isLoading.value = true;\n error.value = null;\n\n try {\n console.log(\n `Loading trend data for company ${companyId}, period: ${period}, luna: ${luna}, an: ${an}`,\n );\n\n const params = {\n company: companyId,\n period: period,\n };\n if (luna !== null) params.luna = luna;\n if (an !== null) params.an = an;\n\n const response = await api.get(\"/dashboard/trends\", { params });\n\n // Validate response structure\n if (!response.data) {\n throw new Error(\"Empty response from trends API\");\n }\n\n console.log(\"Raw trends response:\", response.data);\n\n // Transform backend response to Chart.js format\n const backendData = response.data;\n const transformedData = transformTrendsData(backendData);\n\n if (!transformedData) {\n throw new Error(\"Failed to transform trends data - invalid format\");\n }\n\n trends.value = transformedData;\n console.log(\"Transformed trends data:\", transformedData);\n\n return { success: true, data: transformedData };\n } catch (err) {\n const errorMessage =\n err.response?.data?.detail ||\n err.message ||\n \"Failed to load trend data\";\n error.value = errorMessage;\n console.error(\"Failed to load trend data:\", err);\n console.error(\"Error details:\", {\n status: err.response?.status,\n statusText: err.response?.statusText,\n data: err.response?.data,\n });\n\n // Clear trends data and return error - no more mock data\n trends.value = null;\n return { success: false, error: error.value };\n } finally {\n isLoading.value = false;\n }\n };\n\n // Transform backend trends data to Chart.js format AND preserve raw data\n const transformTrendsData = (backendData) => {\n if (\n !backendData ||\n !backendData.periods ||\n !Array.isArray(backendData.periods) ||\n backendData.periods.length === 0\n ) {\n console.warn(\"Invalid trends data received:\", backendData);\n return null;\n }\n\n // Validate that we have all required data\n const requiredFields = [\n \"trezorerie_sold\",\n \"clienti_sold\",\n \"furnizori_sold\",\n \"clienti_incasat\",\n \"furnizori_achitat\",\n ];\n for (const field of requiredFields) {\n if (!backendData[field] || !Array.isArray(backendData[field])) {\n console.warn(`Missing ${field} data`);\n return null;\n }\n }\n\n // Data is already in ASC order from backend\n const periods = [...backendData.periods];\n\n // Format labels for monthly data (YYYY-MM -> MM/YYYY)\n const formattedPeriods = periods.map((period) => {\n const [year, month] = period.split(\"-\");\n const date = new Date(year, month - 1);\n return date.toLocaleDateString(\"ro-RO\", {\n month: \"2-digit\",\n year: \"numeric\",\n });\n });\n\n // Preserve all raw data from backend for card calculations\n return {\n labels: formattedPeriods,\n raw: {\n // Current period data\n periods: backendData.periods,\n clienti_facturat: backendData.clienti_facturat || [],\n clienti_incasat: backendData.clienti_incasat || [],\n clienti_sold: backendData.clienti_sold || [],\n furnizori_facturat: backendData.furnizori_facturat || [],\n furnizori_achitat: backendData.furnizori_achitat || [],\n furnizori_sold: backendData.furnizori_sold || [],\n trezorerie_sold: backendData.trezorerie_sold || [],\n\n // Previous period data (year-over-year comparison)\n previous_periods: backendData.previous_periods || [],\n clienti_facturat_prev: backendData.clienti_facturat_prev || [],\n clienti_incasat_prev: backendData.clienti_incasat_prev || [],\n clienti_sold_prev: backendData.clienti_sold_prev || [],\n furnizori_facturat_prev: backendData.furnizori_facturat_prev || [],\n furnizori_achitat_prev: backendData.furnizori_achitat_prev || [],\n furnizori_sold_prev: backendData.furnizori_sold_prev || [],\n trezorerie_sold_prev: backendData.trezorerie_sold_prev || [],\n },\n datasets: [\n {\n label: \"Trezorerie - Sold Net\",\n data: [...backendData.trezorerie_sold].map((val) => Number(val) || 0),\n borderColor: \"rgb(59, 130, 246)\",\n backgroundColor: \"rgba(59, 130, 246, 0.1)\",\n tension: 0.4,\n fill: false,\n pointBackgroundColor: \"rgb(59, 130, 246)\",\n pointBorderColor: \"#ffffff\",\n pointBorderWidth: 2,\n pointRadius: 4,\n pointHoverRadius: 6,\n },\n ],\n };\n };\n\n const loadDetailedData = async (\n dataType,\n companyId,\n page = 1,\n pageSize = 25,\n search = \"\",\n luna = null,\n an = null,\n ) => {\n isLoading.value = true;\n error.value = null;\n\n try {\n const params = {\n company: companyId,\n data_type: dataType,\n page: page,\n page_size: pageSize,\n search: search,\n };\n if (luna !== null) params.luna = luna;\n if (an !== null) params.an = an;\n\n const response = await api.get(\"/dashboard/detailed-data\", { params });\n\n // Store total for pagination\n detailedDataTotal.value = response.data.total || 0;\n\n return {\n success: true,\n data: response.data.data || [], // Backend returns 'data' not 'items'\n total: response.data.total || 0,\n page: response.data.page || 1,\n };\n } catch (err) {\n error.value =\n err.response?.data?.detail || \"Failed to load detailed data\";\n console.error(\"Failed to load detailed data:\", err);\n\n // Return mock data structure for testing\n const mockData = generateMockDetailedData(dataType);\n detailedDataTotal.value = mockData.length;\n return {\n success: false,\n error: error.value,\n data: mockData,\n total: mockData.length,\n page: 1,\n };\n } finally {\n isLoading.value = false;\n }\n };\n\n // Generate mock data for testing until backend endpoint is implemented\n const generateMockDetailedData = (dataType) => {\n switch (dataType) {\n case \"clients\":\n return [\n {\n id: 1,\n client: \"SC ALPHA SRL\",\n facturat: 15000,\n incasat: 12000,\n sold: 3000,\n status: \"Activ\",\n },\n {\n id: 2,\n client: \"SC BETA SRL\",\n facturat: 8500,\n incasat: 8500,\n sold: 0,\n status: \"Activ\",\n },\n {\n id: 3,\n client: \"SC GAMMA SRL\",\n facturat: 22000,\n incasat: 15000,\n sold: 7000,\n status: \"Activ\",\n },\n {\n id: 4,\n client: \"SC DELTA SRL\",\n facturat: 5500,\n incasat: 2000,\n sold: 3500,\n status: \"Întârziere\",\n },\n {\n id: 5,\n client: \"SC EPSILON SRL\",\n facturat: 18000,\n incasat: 18000,\n sold: 0,\n status: \"Activ\",\n },\n ];\n case \"suppliers\":\n return [\n {\n id: 1,\n furnizor: \"SC SUPPLIER A SRL\",\n facturat: 12000,\n achitat: 10000,\n sold: 2000,\n status: \"Activ\",\n },\n {\n id: 2,\n furnizor: \"SC SUPPLIER B SRL\",\n facturat: 7500,\n achitat: 7500,\n sold: 0,\n status: \"Activ\",\n },\n {\n id: 3,\n furnizor: \"SC SUPPLIER C SRL\",\n facturat: 19000,\n achitat: 12000,\n sold: 7000,\n status: \"Pendente\",\n },\n {\n id: 4,\n furnizor: \"SC SUPPLIER D SRL\",\n facturat: 4200,\n achitat: 4200,\n sold: 0,\n status: \"Activ\",\n },\n {\n id: 5,\n furnizor: \"SC SUPPLIER E SRL\",\n facturat: 16800,\n achitat: 8000,\n sold: 8800,\n status: \"Pendente\",\n },\n ];\n case \"treasury\":\n return [\n {\n id: 1,\n cont: \"5121\",\n nume_cont: \"Cont curent BCR\",\n sold: 45000,\n valuta: \"RON\",\n tip: \"Bancă\",\n },\n {\n id: 2,\n cont: \"5311\",\n nume_cont: \"Casa RON\",\n sold: 2500,\n valuta: \"RON\",\n tip: \"Numerar\",\n },\n {\n id: 3,\n cont: \"5124\",\n nume_cont: \"Cont curent BRD EUR\",\n sold: 8500,\n valuta: \"EUR\",\n tip: \"Bancă\",\n },\n {\n id: 4,\n cont: \"5125\",\n nume_cont: \"Cont economii ING\",\n sold: 125000,\n valuta: \"RON\",\n tip: \"Economii\",\n },\n {\n id: 5,\n cont: \"5312\",\n nume_cont: \"Casa valută\",\n sold: 500,\n valuta: \"EUR\",\n tip: \"Numerar\",\n },\n ];\n default:\n return [];\n }\n };\n\n // Funcții noi pentru carduri\n const loadPerformanceData = async (companyId, period = \"7d\") => {\n const cacheKey = `performance-${companyId}-${period}`;\n\n // Check cache\n if (dataCache.has(cacheKey)) {\n performanceData.value[period] = dataCache.get(cacheKey);\n return { success: true, data: dataCache.get(cacheKey) };\n }\n\n try {\n const response = await api.get(\"/dashboard/performance\", {\n params: { company: companyId, period },\n });\n\n performanceData.value[period] = response.data;\n dataCache.set(cacheKey, response.data);\n\n return { success: true, data: response.data };\n } catch (err) {\n console.error(\"Failed to load performance data:\", err);\n return { success: false, error: err.message };\n }\n };\n\n const loadCashFlowData = async (companyId, period = \"7d\") => {\n const cacheKey = `cashflow-${companyId}-${period}`;\n\n if (dataCache.has(cacheKey)) {\n cashflowData.value[period] = dataCache.get(cacheKey);\n return { success: true, data: dataCache.get(cacheKey) };\n }\n\n try {\n const response = await api.get(\"/dashboard/cashflow\", {\n params: { company: companyId, period },\n });\n\n cashflowData.value[period] = response.data;\n dataCache.set(cacheKey, response.data);\n\n return { success: true, data: response.data };\n } catch (err) {\n console.error(\"Failed to load cashflow data:\", err);\n return { success: false, error: err.message };\n }\n };\n\n const loadMaturityData = async (companyId, period = \"7d\", luna = null, an = null) => {\n const cacheKey = `maturity-${companyId}-${period}-${luna}-${an}`;\n\n if (dataCache.has(cacheKey)) {\n maturityData.value[period] = dataCache.get(cacheKey);\n return { success: true, data: dataCache.get(cacheKey) };\n }\n\n try {\n const params = { company: companyId, period };\n if (luna !== null) params.luna = luna;\n if (an !== null) params.an = an;\n\n const response = await api.get(\"/dashboard/maturity\", { params });\n\n maturityData.value[period] = response.data;\n dataCache.set(cacheKey, response.data);\n\n return { success: true, data: response.data };\n } catch (err) {\n console.error(\"Failed to load maturity data:\", err);\n return { success: false, error: err.message };\n }\n };\n\n const loadCurrentPeriod = async (companyId) => {\n try {\n const response = await api.get(\"/dashboard/current-period\", {\n params: { company: companyId },\n });\n\n currentPeriod.value = response.data;\n return { success: true, data: response.data };\n } catch (err) {\n console.error(\"Failed to load current period:\", err);\n // Fallback to current date if API fails\n const now = new Date();\n const fallbackPeriod = {\n year: now.getFullYear(),\n month: now.getMonth() + 1,\n period: `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, \"0\")}`,\n };\n currentPeriod.value = fallbackPeriod;\n return { success: false, error: err.message, data: fallbackPeriod };\n }\n };\n\n /**\n * Load financial indicators from API (US-013)\n * GET /api/reports/dashboard/financial-indicators\n *\n * @param {number} companyId - Company ID (required)\n * @param {number|null} luna - Accounting month (1-12, optional)\n * @param {number|null} an - Accounting year (optional)\n * @returns {Promise<{success: boolean, data?: object, error?: string}>}\n */\n const loadFinancialIndicators = async (companyId, luna = null, an = null) => {\n financialIndicators.value.loading = true;\n financialIndicators.value.error = null;\n\n try {\n const params = { company: companyId };\n if (luna !== null) params.luna = luna;\n if (an !== null) params.an = an;\n\n const data = await getWithCacheInfo(\"/dashboard/financial-indicators\", {\n params,\n });\n\n financialIndicators.value.data = data;\n financialIndicators.value.loading = false;\n\n // Extract cache metadata\n financialIndicators.value.cacheInfo = {\n hit: data.cache_hit || false,\n time: data.response_time_ms || 0,\n source: data.cache_source || null,\n };\n\n return { success: true, data: data };\n } catch (err) {\n console.error(\"Failed to load financial indicators:\", err);\n\n // User-friendly error message\n let errorMessage = \"Nu s-au putut încărca indicatorii financiari.\";\n if (err.response?.status === 403) {\n errorMessage = \"Nu aveți acces la datele acestei firme.\";\n } else if (err.response?.status === 400) {\n errorMessage =\n err.response?.data?.detail || \"Parametri invalizi pentru cerere.\";\n } else if (err.response?.data?.detail) {\n errorMessage = err.response.data.detail;\n }\n\n financialIndicators.value.error = errorMessage;\n financialIndicators.value.loading = false;\n financialIndicators.value.data = null;\n financialIndicators.value.cacheInfo = { hit: false, time: 0, source: null };\n\n return { success: false, error: errorMessage };\n }\n };\n\n // Computed getters for financial indicators (US-013)\n const lichiditate = computed(() => financialIndicators.value.data?.lichiditate || null);\n const eficienta = computed(() => financialIndicators.value.data?.eficienta || null);\n const risc = computed(() => financialIndicators.value.data?.risc || null);\n const cashFlow = computed(() => financialIndicators.value.data?.cash_flow || null);\n const dinamica = computed(() => financialIndicators.value.data?.dinamica || null);\n const altmanZScore = computed(() => financialIndicators.value.data?.altman_zscore || null);\n\n // Clear cache\n const clearCache = () => {\n dataCache.clear();\n };\n\n const reset = () => {\n summary.value = null;\n trends.value = null;\n isLoading.value = false;\n error.value = null;\n // Clear new data as well\n performanceData.value = {};\n cashflowData.value = {};\n maturityData.value = {};\n currentPeriod.value = null;\n // Reset financial indicators (US-013)\n financialIndicators.value = {\n loading: false,\n error: null,\n data: null,\n cacheInfo: { hit: false, time: 0, source: null },\n };\n clearCache();\n };\n\n return {\n // Existing\n summary,\n trends,\n isLoading,\n error,\n loadDashboardSummary,\n loadTrendData,\n loadDetailedData,\n reset,\n\n // New\n performanceData,\n cashflowData,\n maturityData,\n currentPeriod,\n loadPerformanceData,\n loadCashFlowData,\n loadMaturityData,\n loadCurrentPeriod,\n clearCache,\n\n // Detailed data pagination\n detailedDataTotal,\n\n // Financial indicators (US-013)\n financialIndicators,\n loadFinancialIndicators,\n // Computed getters for financial indicators\n lichiditate,\n eficienta,\n risc,\n cashFlow,\n dinamica,\n altmanZScore,\n };\n});\n","import { defineStore } from \"pinia\";\nimport { ref, computed } from \"vue\";\nimport api from \"@reports/services/api\";\n\nexport const useInvoicesStore = defineStore(\"invoices\", () => {\n // State\n const invoices = ref([]);\n const isLoading = ref(false);\n const error = ref(null);\n const accountingPeriod = ref({ an: null, luna: null });\n // Total sold din TOATE facturile filtrate (nu doar pagina curentă)\n const totalSoldAll = ref(0);\n const filters = ref({\n company: null,\n type: \"CLIENTI\", // CLIENTI or FURNIZORI\n dateFrom: null,\n dateTo: null,\n searchTerm: \"\",\n });\n const pagination = ref({\n page: 1,\n rows: 50,\n totalRecords: 0,\n });\n\n // Getters\n const invoiceList = computed(() => invoices.value);\n const hasInvoices = computed(() => invoices.value.length > 0);\n const totalInvoices = computed(() => pagination.value.totalRecords);\n\n const paidInvoices = computed(() =>\n invoices.value.filter((invoice) => invoice.css_class === \"invoice-paid\"),\n );\n\n const overdueInvoices = computed(() =>\n invoices.value.filter((invoice) => invoice.css_class === \"invoice-overdue\"),\n );\n\n const totalAmountPaid = computed(() =>\n paidInvoices.value.reduce((sum, invoice) => sum + (invoice.suma || 0), 0),\n );\n\n const totalAmountOverdue = computed(() =>\n overdueInvoices.value.reduce(\n (sum, invoice) => sum + (invoice.suma || 0),\n 0,\n ),\n );\n\n // Actions\n const loadInvoices = async (companyCode, options = {}) => {\n if (!companyCode) {\n error.value = \"Company code is required\";\n return { success: false, error: error.value };\n }\n\n isLoading.value = true;\n error.value = null;\n\n try {\n const params = {\n partner_type: filters.value.type,\n page: pagination.value.page,\n page_size: pagination.value.rows,\n ...options,\n };\n\n if (filters.value.dateFrom) {\n // Convert Date object to YYYY-MM-DD string format (LOCAL date, not UTC)\n if (filters.value.dateFrom instanceof Date) {\n const year = filters.value.dateFrom.getFullYear();\n const month = String(filters.value.dateFrom.getMonth() + 1).padStart(\n 2,\n \"0\",\n );\n const day = String(filters.value.dateFrom.getDate()).padStart(2, \"0\");\n params.date_from = `${year}-${month}-${day}`;\n } else {\n params.date_from = filters.value.dateFrom;\n }\n }\n if (filters.value.dateTo) {\n // Convert Date object to YYYY-MM-DD string format (LOCAL date, not UTC)\n if (filters.value.dateTo instanceof Date) {\n const year = filters.value.dateTo.getFullYear();\n const month = String(filters.value.dateTo.getMonth() + 1).padStart(\n 2,\n \"0\",\n );\n const day = String(filters.value.dateTo.getDate()).padStart(2, \"0\");\n params.date_to = `${year}-${month}-${day}`;\n } else {\n params.date_to = filters.value.dateTo;\n }\n }\n if (filters.value.searchTerm) {\n params.search = filters.value.searchTerm;\n }\n\n // Fixed: Use company as query parameter instead of path parameter\n const response = await api.get(`/invoices/`, {\n params: {\n company: companyCode,\n ...params,\n },\n });\n\n invoices.value = response.data.invoices || [];\n pagination.value.totalRecords = response.data.total_count || 0;\n\n // Store total sold from ALL filtered invoices (not just current page)\n totalSoldAll.value = response.data.total_sold_all || 0;\n\n // Store accounting period if available\n if (response.data.accounting_period) {\n accountingPeriod.value = response.data.accounting_period;\n }\n\n return { success: true };\n } catch (err) {\n error.value = err.response?.data?.detail || \"Failed to load invoices\";\n console.error(\"Failed to load invoices:\", err);\n return { success: false, error: error.value };\n } finally {\n isLoading.value = false;\n }\n };\n\n const setFilters = (newFilters) => {\n filters.value = { ...filters.value, ...newFilters };\n };\n\n const setPagination = (newPagination) => {\n pagination.value = { ...pagination.value, ...newPagination };\n };\n\n const setInvoiceType = (type) => {\n filters.value.type = type;\n };\n\n const clearFilters = () => {\n filters.value = {\n company: null,\n type: \"CLIENTI\",\n dateFrom: null,\n dateTo: null,\n searchTerm: \"\",\n };\n };\n\n const clearError = () => {\n error.value = null;\n };\n\n const reset = () => {\n invoices.value = [];\n isLoading.value = false;\n error.value = null;\n accountingPeriod.value = { an: null, luna: null };\n totalSoldAll.value = 0;\n clearFilters();\n pagination.value = {\n page: 1,\n rows: 50,\n totalRecords: 0,\n };\n };\n\n const getInvoiceById = (id) => {\n return invoices.value.find((invoice) => invoice.id === id);\n };\n\n return {\n // State\n invoices,\n isLoading,\n error,\n accountingPeriod,\n totalSoldAll,\n filters,\n pagination,\n\n // Getters\n invoiceList,\n hasInvoices,\n totalInvoices,\n paidInvoices,\n overdueInvoices,\n totalAmountPaid,\n totalAmountOverdue,\n\n // Actions\n loadInvoices,\n setFilters,\n setPagination,\n setInvoiceType,\n clearFilters,\n clearError,\n reset,\n getInvoiceById,\n };\n});\n","import { defineStore } from \"pinia\";\nimport { ref } from \"vue\";\nimport api from \"@reports/services/api\";\n\nexport const useTreasuryStore = defineStore(\"treasury\", () => {\n const registers = ref([]);\n const isLoading = ref(false);\n const error = ref(null);\n const pagination = ref({\n page: 0,\n rows: 50,\n totalRecords: 0,\n });\n const totals = ref({\n total_incasari: 0,\n total_plati: 0,\n // Totaluri din TOATE înregistrările filtrate (nu doar pagina curentă)\n sold_precedent_all: 0,\n total_incasari_all: 0,\n total_plati_all: 0,\n sold_final_all: 0,\n });\n const accountingPeriod = ref({ an: null, luna: null });\n\n const loadBankCashRegister = async (companyId, filters = {}) => {\n isLoading.value = true;\n error.value = null;\n\n try {\n const params = {\n company: companyId,\n page: pagination.value.page + 1,\n page_size: pagination.value.rows,\n ...filters,\n };\n\n const response = await api.get(\"/treasury/bank-cash-register\", {\n params,\n });\n\n registers.value = response.data.registers || [];\n pagination.value.totalRecords = response.data.total_count || 0;\n totals.value = {\n total_incasari: response.data.total_incasari,\n total_plati: response.data.total_plati,\n // Totaluri din TOATE înregistrările filtrate (nu doar pagina curentă)\n sold_precedent_all: response.data.sold_precedent_all || 0,\n total_incasari_all: response.data.total_incasari_all || 0,\n total_plati_all: response.data.total_plati_all || 0,\n sold_final_all: response.data.sold_final_all || 0,\n };\n\n // Store accounting period if available\n if (response.data.accounting_period) {\n accountingPeriod.value = response.data.accounting_period;\n }\n\n return { success: true };\n } catch (err) {\n error.value = err.response?.data?.detail || \"Failed to load register\";\n console.error(\"Failed to load register:\", err);\n return { success: false, error: error.value };\n } finally {\n isLoading.value = false;\n }\n };\n\n const setPagination = (newPagination) => {\n pagination.value = { ...pagination.value, ...newPagination };\n };\n\n const reset = () => {\n registers.value = [];\n isLoading.value = false;\n error.value = null;\n accountingPeriod.value = { an: null, luna: null };\n pagination.value = {\n page: 0,\n rows: 50,\n totalRecords: 0,\n };\n };\n\n return {\n registers,\n isLoading,\n error,\n pagination,\n totals,\n accountingPeriod,\n loadBankCashRegister,\n setPagination,\n reset,\n };\n});\n","/**\n * Pinia Store for Trial Balance (Balanță de Verificare)\n */\nimport { defineStore } from \"pinia\";\nimport { ref, computed } from \"vue\";\nimport api from \"@reports/services/api\";\n\nexport const useTrialBalanceStore = defineStore(\"trialBalance\", () => {\n // State\n const trialBalanceData = ref([]);\n const isLoading = ref(false);\n const error = ref(null);\n\n // Totaluri din TOATE înregistrările filtrate (nu doar pagina curentă)\n const totals = ref({\n total_sold_precedent_debit: 0,\n total_sold_precedent_credit: 0,\n total_rulaj_lunar_debit: 0,\n total_rulaj_lunar_credit: 0,\n total_sold_final_debit: 0,\n total_sold_final_credit: 0,\n });\n\n const filters = ref({\n luna: new Date().getMonth() + 1, // Current month (1-12)\n an: new Date().getFullYear(), // Current year\n cont: \"\",\n denumire: \"\",\n });\n\n const pagination = ref({\n currentPage: 1,\n pageSize: 50,\n totalItems: 0,\n totalPages: 0,\n });\n\n const sorting = ref({\n sortBy: \"CONT\",\n sortOrder: \"asc\",\n });\n\n // Getters\n const hasData = computed(() => trialBalanceData.value.length > 0);\n\n const currentPeriod = computed(() => {\n return {\n luna: filters.value.luna,\n an: filters.value.an,\n };\n });\n\n // Actions\n const fetchTrialBalance = async (companyCode) => {\n if (!companyCode) {\n error.value = \"Company code is required\";\n return { success: false, error: error.value };\n }\n\n isLoading.value = true;\n error.value = null;\n\n try {\n const params = {\n company: companyCode,\n luna: filters.value.luna,\n an: filters.value.an,\n page: pagination.value.currentPage,\n page_size: pagination.value.pageSize,\n sort_by: sorting.value.sortBy,\n sort_order: sorting.value.sortOrder,\n };\n\n // Add optional filters\n if (filters.value.cont) {\n params.cont_filter = filters.value.cont;\n }\n if (filters.value.denumire) {\n params.denumire_filter = filters.value.denumire;\n }\n\n const response = await api.get(\"/trial-balance/\", { params });\n\n if (response.data.success) {\n trialBalanceData.value = response.data.data.items || [];\n\n // Update pagination\n const paginationData = response.data.data.pagination;\n pagination.value = {\n currentPage: paginationData.current_page,\n pageSize: paginationData.page_size,\n totalItems: paginationData.total_items,\n totalPages: paginationData.total_pages,\n };\n\n // Store totals from ALL filtered records (not just current page)\n if (response.data.data.totals) {\n totals.value = response.data.data.totals;\n }\n\n return { success: true };\n } else {\n throw new Error(\"Invalid response format\");\n }\n } catch (err) {\n error.value =\n err.response?.data?.detail || \"Failed to load trial balance data\";\n console.error(\"Failed to load trial balance:\", err);\n return { success: false, error: error.value };\n } finally {\n isLoading.value = false;\n }\n };\n\n const applyFilters = async (newFilters, companyCode) => {\n filters.value = { ...filters.value, ...newFilters };\n pagination.value.currentPage = 1; // Reset to first page when filtering\n await fetchTrialBalance(companyCode);\n };\n\n const clearFilters = async (companyCode) => {\n filters.value = {\n luna: new Date().getMonth() + 1,\n an: new Date().getFullYear(),\n cont: \"\",\n denumire: \"\",\n };\n pagination.value.currentPage = 1;\n await fetchTrialBalance(companyCode);\n };\n\n const changePage = async (page, companyCode) => {\n pagination.value.currentPage = page;\n await fetchTrialBalance(companyCode);\n };\n\n const changePageSize = async (pageSize, companyCode) => {\n pagination.value.pageSize = pageSize;\n pagination.value.currentPage = 1; // Reset to first page\n await fetchTrialBalance(companyCode);\n };\n\n const sort = async (sortBy, sortOrder, companyCode) => {\n sorting.value = { sortBy, sortOrder };\n pagination.value.currentPage = 1; // Reset to first page when sorting\n await fetchTrialBalance(companyCode);\n };\n\n const changePeriod = async (luna, an, companyCode) => {\n filters.value.luna = luna;\n filters.value.an = an;\n pagination.value.currentPage = 1;\n await fetchTrialBalance(companyCode);\n };\n\n const clearError = () => {\n error.value = null;\n };\n\n const reset = () => {\n trialBalanceData.value = [];\n isLoading.value = false;\n error.value = null;\n totals.value = {\n total_sold_precedent_debit: 0,\n total_sold_precedent_credit: 0,\n total_rulaj_lunar_debit: 0,\n total_rulaj_lunar_credit: 0,\n total_sold_final_debit: 0,\n total_sold_final_credit: 0,\n };\n filters.value = {\n luna: new Date().getMonth() + 1,\n an: new Date().getFullYear(),\n cont: \"\",\n denumire: \"\",\n };\n pagination.value = {\n currentPage: 1,\n pageSize: 50,\n totalItems: 0,\n totalPages: 0,\n };\n sorting.value = {\n sortBy: \"CONT\",\n sortOrder: \"asc\",\n };\n };\n\n return {\n // State\n trialBalanceData,\n isLoading,\n error,\n totals,\n filters,\n pagination,\n sorting,\n\n // Getters\n hasData,\n currentPeriod,\n\n // Actions\n fetchTrialBalance,\n applyFilters,\n clearFilters,\n changePage,\n changePageSize,\n sort,\n changePeriod,\n clearError,\n reset,\n };\n});\n","/**\n * Reports Module - Shared Store Instances\n *\n * This file instantiates the shared stores (auth, companies, accountingPeriod)\n * with the Reports module's API service.\n */\n\nimport { createAuthStore } from '@shared/stores/auth'\nimport { createCompaniesStore } from '@shared/stores/companies'\nimport { createAccountingPeriodStore } from '@shared/stores/accountingPeriod'\nimport api from '@reports/services/api'\n\n// Import module-specific stores that need to be reset on logout\nimport { useDashboardStore } from './dashboard'\nimport { useInvoicesStore } from './invoices'\nimport { useTreasuryStore } from './treasury'\nimport { useTrialBalanceStore } from './trialBalance'\n\n/**\n * US-028/US-031: Reset all module stores on logout\n * Prevents stale data from previous company after re-login\n *\n * @param {Object} context - Context saved before logout (US-031)\n * @param {string} context.username - Username from before logout\n * @param {string} context.serverId - Server ID from before logout\n */\nconst resetAllStores = (context = {}) => {\n const { username, serverId } = context\n console.log('[Reports] Resetting all stores on logout...', { username, serverId })\n\n // Reset module-specific stores\n try {\n const dashboardStore = useDashboardStore()\n if (dashboardStore.reset) dashboardStore.reset()\n } catch (e) {\n console.warn('[Reports] Could not reset dashboard store:', e.message)\n }\n\n try {\n const invoicesStore = useInvoicesStore()\n if (invoicesStore.reset) invoicesStore.reset()\n } catch (e) {\n console.warn('[Reports] Could not reset invoices store:', e.message)\n }\n\n try {\n const treasuryStore = useTreasuryStore()\n if (treasuryStore.reset) treasuryStore.reset()\n } catch (e) {\n console.warn('[Reports] Could not reset treasury store:', e.message)\n }\n\n try {\n const trialBalanceStore = useTrialBalanceStore()\n if (trialBalanceStore.reset) trialBalanceStore.reset()\n } catch (e) {\n console.warn('[Reports] Could not reset trial balance store:', e.message)\n }\n\n // Reset shared stores (companies and periods)\n // Note: These are reset AFTER module stores since they may depend on auth\n // US-031: Use resetWithContext with explicit username/serverId\n try {\n const companyStore = useCompanyStore()\n if (companyStore.resetWithContext && username) {\n // Use the new method that accepts explicit parameters\n companyStore.resetWithContext(username, serverId)\n } else if (companyStore.reset) {\n // Fallback to regular reset (won't clear localStorage properly)\n companyStore.reset()\n }\n } catch (e) {\n console.warn('[Reports] Could not reset company store:', e.message)\n }\n\n try {\n const periodStore = useAccountingPeriodStore()\n if (periodStore.reset) periodStore.reset()\n } catch (e) {\n console.warn('[Reports] Could not reset period store:', e.message)\n }\n\n console.log('[Reports] All stores reset complete')\n}\n\n// Create auth store with onLogout callback (US-028)\nexport const useAuthStore = createAuthStore(api, {\n onLogout: resetAllStores\n})\n\n// Create companies store (needs auth store reference)\nexport const useCompanyStore = createCompaniesStore(api, useAuthStore)\n\n// Create accounting period store\nexport const useAccountingPeriodStore = createAccountingPeriodStore(api)\n"],"names":["api","axios","config","isAuthRedirectInProgress","controller","token","response","error","_a","handleUnauthorized","getWithCacheInfo","url","options","useDashboardStore","defineStore","summary","ref","trends","isLoading","performanceData","cashflowData","maturityData","currentPeriod","financialIndicators","detailedDataTotal","dataCache","loadDashboardSummary","companyId","luna","an","params","err","_b","loadTrendData","period","chartType","backendData","transformedData","transformTrendsData","errorMessage","_c","_d","_e","requiredFields","field","year","month","val","loadDetailedData","dataType","page","pageSize","search","mockData","generateMockDetailedData","loadPerformanceData","cacheKey","loadCashFlowData","loadMaturityData","loadCurrentPeriod","now","fallbackPeriod","loadFinancialIndicators","data","_f","lichiditate","computed","eficienta","risc","cashFlow","dinamica","altmanZScore","clearCache","useInvoicesStore","invoices","accountingPeriod","totalSoldAll","filters","pagination","invoiceList","hasInvoices","totalInvoices","paidInvoices","invoice","overdueInvoices","totalAmountPaid","sum","totalAmountOverdue","loadInvoices","companyCode","day","setFilters","newFilters","setPagination","newPagination","setInvoiceType","type","clearFilters","id","useTreasuryStore","registers","totals","useTrialBalanceStore","trialBalanceData","sorting","hasData","fetchTrialBalance","paginationData","sortBy","sortOrder","resetAllStores","context","username","serverId","dashboardStore","e","invoicesStore","treasuryStore","trialBalanceStore","companyStore","useCompanyStore","periodStore","useAccountingPeriodStore","useAuthStore","createAuthStore","createCompaniesStore","createAccountingPeriodStore"],"mappings":"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"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/sharedStores.D4bwf0TZ.js b/deploy-package-20260223-151231/frontend/assets/sharedStores.D4bwf0TZ.js deleted file mode 100644 index 6e0d6ed..0000000 --- a/deploy-package-20260223-151231/frontend/assets/sharedStores.D4bwf0TZ.js +++ /dev/null @@ -1,2 +0,0 @@ -import{l as Y,m as q,c as Q}from"./index.B8XI8FQW.js";import{a as g,u as X}from"./ocrSettingsStore.B3n_bOhs.js";import{N as x,a as v,j as b}from"./vendor-core.B6UiYhU_.js";const i={get:(e,t)=>g.get(`/receipts${e}`,t),post:(e,t,r)=>g.post(`/receipts${e}`,t,r),put:(e,t,r)=>g.put(`/receipts${e}`,t,r),delete:(e,t)=>g.delete(`/receipts${e}`,t)},Z=x("receipts",{state:()=>({receipts:[],currentReceipt:null,pendingReceipts:[],stats:null,processingStats:{pending_count:0,processing_count:0,completed_count:0,failed_count:0},loading:!1,error:null,pagination:{page:1,pageSize:20,total:0,pages:1},filters:{status:null,search:"",direction:null,dateFrom:null,dateTo:null,processingStatus:null},partners:[],accounts:[],cashRegisters:[],expenseTypes:[]}),getters:{hasReceipts:e=>e.receipts.length>0,hasPendingReceipts:e=>e.pendingReceipts.length>0,pendingCount:e=>e.pendingReceipts.length},actions:{async fetchReceipts(){var e,t;this.loading=!0,this.error=null;try{const r={page:this.pagination.page,page_size:this.pagination.pageSize};this.filters.status&&(r.status=this.filters.status),this.filters.search&&(r.search=this.filters.search),this.filters.direction&&(r.direction=this.filters.direction),this.filters.dateFrom&&(r.date_from=this.filters.dateFrom),this.filters.dateTo&&(r.date_to=this.filters.dateTo),this.filters.processingStatus&&(this.filters.processingStatus==="in_processing"?r.processing_status="pending,processing":r.processing_status=this.filters.processingStatus);const s=await i.get("/",{params:r});this.receipts=s.data.items,this.pagination.total=s.data.total,this.pagination.pages=s.data.pages,s.data.processing_stats&&(this.processingStats=s.data.processing_stats)}catch(r){throw this.error=((t=(e=r.response)==null?void 0:e.data)==null?void 0:t.detail)||"Failed to fetch receipts",r}finally{this.loading=!1}},async fetchReceiptById(e){var t,r;this.loading=!0,this.error=null;try{const s=await i.get(`/${e}`);return this.currentReceipt=s.data,s.data}catch(s){throw this.error=((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Failed to fetch receipt",s}finally{this.loading=!1}},async createReceipt(e){var t,r;this.loading=!0,this.error=null;try{return(await i.post("/",e)).data}catch(s){throw this.error=((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Failed to create receipt",s}finally{this.loading=!1}},async updateReceipt(e,t){var r,s;this.loading=!0,this.error=null;try{return(await i.put(`/${e}`,t)).data}catch(o){throw this.error=((s=(r=o.response)==null?void 0:r.data)==null?void 0:s.detail)||"Failed to update receipt",o}finally{this.loading=!1}},async deleteReceipt(e){var t,r;this.loading=!0,this.error=null;try{await i.delete(`/${e}`)}catch(s){throw this.error=((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Failed to delete receipt",s}finally{this.loading=!1}},async submitReceipt(e){var t,r;this.loading=!0,this.error=null;try{return(await i.post(`/${e}/submit`)).data}catch(s){throw this.error=((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Failed to submit receipt",s}finally{this.loading=!1}},async approveReceipt(e){var t,r;this.loading=!0,this.error=null;try{return(await i.post(`/${e}/approve`)).data}catch(s){throw this.error=((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Failed to approve receipt",s}finally{this.loading=!1}},async rejectReceipt(e,t){var r,s;this.loading=!0,this.error=null;try{return(await i.post(`/${e}/reject`,{reason:t})).data}catch(o){throw this.error=((s=(r=o.response)==null?void 0:r.data)==null?void 0:s.detail)||"Failed to reject receipt",o}finally{this.loading=!1}},async resubmitReceipt(e){var t,r;this.loading=!0,this.error=null;try{return(await i.post(`/${e}/resubmit`)).data}catch(s){throw this.error=((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Failed to resubmit receipt",s}finally{this.loading=!1}},async unapproveReceipt(e){var t,r;this.loading=!0,this.error=null;try{return(await i.post(`/${e}/unapprove`)).data}catch(s){throw this.error=((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Failed to unapprove receipt",s}finally{this.loading=!1}},async fetchPendingReceipts(){var e,t;this.loading=!0,this.error=null;try{const r=await i.get("/pending");return this.pendingReceipts=r.data,r.data}catch(r){throw this.error=((t=(e=r.response)==null?void 0:e.data)==null?void 0:t.detail)||"Failed to fetch pending receipts",r}finally{this.loading=!1}},async uploadAttachment(e,t){var s,o;const r=new FormData;r.append("file",t);try{return(await i.post(`/${e}/attachments`,r,{headers:{"Content-Type":"multipart/form-data"}})).data}catch(m){throw new Error(((o=(s=m.response)==null?void 0:s.data)==null?void 0:o.detail)||"Failed to upload attachment")}},async deleteAttachment(e){var t,r;try{await i.delete(`/attachments/${e}`)}catch(s){throw new Error(((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Failed to delete attachment")}},getAttachmentUrl(e){return`/api/data-entry/receipts/attachments/${e}/download`},async fetchAttachmentBlob(e){try{const t=await g.get(`/receipts/attachments/${e}/download`,{responseType:"blob"});return URL.createObjectURL(t.data)}catch(t){return console.error("Failed to fetch attachment:",t),null}},async downloadAttachment(e,t){var r,s;try{const o=await g.get(`/receipts/attachments/${e}/download`,{responseType:"blob"}),m=URL.createObjectURL(o.data),y=document.createElement("a");return y.href=m,y.download=t||"attachment",document.body.appendChild(y),y.click(),document.body.removeChild(y),URL.revokeObjectURL(m),!0}catch(o){throw console.error("Failed to download attachment:",o),new Error(((s=(r=o.response)==null?void 0:r.data)==null?void 0:s.detail)||"Failed to download attachment")}},async fetchEntries(e){var t,r;try{return(await i.get(`/${e}/entries`)).data}catch(s){throw new Error(((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Failed to fetch entries")}},async updateEntries(e,t){var r,s;try{return(await i.put(`/${e}/entries`,{entries:t})).data}catch(o){throw new Error(((s=(r=o.response)==null?void 0:r.data)==null?void 0:s.detail)||"Failed to update entries")}},async regenerateEntries(e){var t,r;try{return(await i.post(`/${e}/entries/regenerate`)).data}catch(s){throw new Error(((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Failed to regenerate entries")}},async fetchPartners(e=""){try{const t=await i.get("/nomenclature/partners",{params:{search:e}});return this.partners=t.data,t.data}catch(t){return console.error("Failed to fetch partners:",t),[]}},async fetchAccounts(e=""){try{const t=await i.get("/nomenclature/accounts",{params:{prefix:e}});return this.accounts=t.data,t.data}catch(t){return console.error("Failed to fetch accounts:",t),[]}},async fetchCashRegisters(){try{const e=await i.get("/nomenclature/cash-registers");return this.cashRegisters=e.data,e.data}catch(e){return console.error("Failed to fetch cash registers:",e),[]}},async fetchExpenseTypes(){try{const e=await i.get("/nomenclature/expense-types");return this.expenseTypes=e.data,e.data}catch(e){return console.error("Failed to fetch expense types:",e),[]}},async fetchAllNomenclatures(){await Promise.all([this.fetchPartners(),this.fetchCashRegisters(),this.fetchExpenseTypes()])},async searchSupplier(e){try{return(await g.get("/nomenclature/suppliers/search",{params:{fiscal_code:e}})).data}catch(t){return console.error("Supplier search failed:",t),{found:!1,source:"error"}}},async createLocalSupplier(e){var t,r;try{const s=await g.post("/nomenclature/suppliers/local",e);return this.partners.push({id:s.data.id,name:s.data.name,fiscal_code:s.data.fiscal_code,address:s.data.address,source:"local"}),s.data}catch(s){throw new Error(((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Failed to create supplier")}},async syncSuppliers(){try{const e=await g.post("/nomenclature/sync/suppliers");return console.log("[receiptsStore] Synced suppliers:",e.data),await this.fetchPartners(),e.data}catch(e){throw console.error("[receiptsStore] Supplier sync failed:",e),e}},async fetchStats(){try{const e=await i.get("/stats");return this.stats=e.data,e.data}catch(e){return console.error("Failed to fetch stats:",e),null}},async retryReceipt(e){var t,r;try{return(await g.post(`/bulk/retry/${e}`)).data}catch(s){const o=((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Eroare la reîncărcare";throw new Error(o)}},async retryBatchFailed(e){var t,r;try{return(await g.post(`/bulk/retry-batch/${e}`)).data}catch(s){const o=((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Eroare la reîncărcarea batch-ului";throw new Error(o)}},async bulkDeleteReceipts(e){var t,r;try{return(await i.delete("/bulk",{data:{ids:e}})).data}catch(s){const o=((r=(t=s.response)==null?void 0:t.data)==null?void 0:r.detail)||"Eroare la ștergerea bonurilor";throw new Error(o)}},removeReceiptsLocally(e){const t=new Set(e);this.receipts=this.receipts.filter(r=>!t.has(r.id))},updateReceiptInPlace(e,t){const r=this.receipts.findIndex(s=>s.id===e);return r!==-1?(Object.assign(this.receipts[r],t),!0):!1},insertReceiptInPlace(e){const t=this.receipts.findIndex(r=>r.id===e.id);return t!==-1?(Object.assign(this.receipts[t],e),!0):(this.receipts.unshift(e),!0)},setFilters(e){this.filters={...this.filters,...e},this.pagination.page=1},clearFilters(){this.filters={status:null,search:"",direction:null,dateFrom:null,dateTo:null,processingStatus:null},this.pagination.page=1},setPage(e){this.pagination.page=e},clearCurrentReceipt(){this.currentReceipt=null}}}),F="roa2web_active_batch_ids";function C(){try{const e=localStorage.getItem(F);if(!e)return[];const t=JSON.parse(e);return Array.isArray(t)?t:[]}catch(e){return console.warn("[BatchProgress] Failed to read localStorage:",e),[]}}function E(e){try{e.length===0?localStorage.removeItem(F):localStorage.setItem(F,JSON.stringify(e))}catch(t){console.warn("[BatchProgress] Failed to save to localStorage:",t)}}function ee(e){const t=C();t.includes(e)||(t.push(e),E(t))}function w(e){const r=C().filter(s=>s!==e);E(r)}const te=x("batchProgress",()=>{const e=v(null),t=v(new Map),r=v(!1),s=v(null);let o=null,m=null;const y=b(()=>{let a=0;for(const n of t.value.values())n.status==="pending"&&a++;return a}),P=b(()=>{let a=0;for(const n of t.value.values())n.status==="processing"&&a++;return a}),A=b(()=>{let a=0;for(const n of t.value.values())n.status==="completed"&&a++;return a}),B=b(()=>{let a=0;for(const n of t.value.values())n.status==="failed"&&a++;return a}),_=b(()=>t.value.size),D=b(()=>{if(_.value===0)return 0;const a=A.value+B.value;return Math.round(a/_.value*100)}),L=b(()=>_.value===0?!1:y.value===0&&P.value===0),j=v(0),O=b(()=>Array.from(t.value.values()));async function M(a,n=null){if($(),e.value=a,t.value=new Map,s.value=null,r.value=!0,j.value=0,n&&Array.isArray(n))for(const p of n)t.value.set(p.job_id,{job_id:p.job_id,filename:p.filename,status:"pending",receipt_id:null,error_message:null,confidence:null});ee(a),o=new AbortController,await k()}function $(){r.value=!1,o&&(o.abort(),o=null)}async function k(){var a,n;for(;r.value&&e.value!==null;)try{const d=(await g.get(`/bulk/batches/${e.value}/status`,{params:{wait:30},signal:o==null?void 0:o.signal,timeout:35e3})).data,f=t.value,h=[],l=[],c=new Map;for(const u of d.jobs){const R=f.get(u.job_id),T=R==null?void 0:R.status;T&&T!==u.status&&(u.status==="completed"&&u.receipt_id?(h.push(u.receipt_id),console.log(`[BatchProgress] Job ${u.job_id} completed -> receipt ${u.receipt_id}`)):u.status==="failed"&&(l.push(u.job_id),console.log(`[BatchProgress] Job ${u.job_id} failed: ${u.error_message}`))),c.set(u.job_id,{job_id:u.job_id,filename:u.filename,status:u.status,receipt_id:u.receipt_id||null,error_message:u.error_message||null,confidence:u.confidence||null})}if(t.value=c,m&&(h.length>0||l.length>0)&&m(h,l),j.value=d.total_amount||0,s.value=null,d.completed_count+d.failed_count>=d.total_files){console.log("[BatchProgress] All jobs finished, stopping polling"),r.value=!1,e.value&&d.failed_count===0?(console.log("[BatchProgress] No failed jobs, removing batch from storage"),w(e.value)):d.failed_count>0&&console.log(`[BatchProgress] Batch has ${d.failed_count} failed jobs, keeping in storage for retry`);break}}catch(p){if(p.name==="AbortError"||p.code==="ERR_CANCELED"){console.log("[BatchProgress] Polling aborted");break}console.error("[BatchProgress] Polling error:",p),s.value=((n=(a=p.response)==null?void 0:a.data)==null?void 0:n.detail)||p.message||"Failed to fetch batch status",await G(2e3)}}function N(){$(),e.value=null,t.value=new Map,s.value=null,j.value=0}function U(){return C()}function z(a){w(a)}function J(){if(t.value.size===0)return!0;for(const a of t.value.values())if(a.status==="failed")return!1;return!0}function I(){J()&&e.value&&(console.log("[BatchProgress] No failed jobs remain, clearing batch from storage"),w(e.value))}function W(){E([])}function G(a){return new Promise(n=>setTimeout(n,a))}async function H(a){var n;try{console.log(`[BatchProgress] Restoring jobs from batch ${a}`);const d=(await g.get(`/bulk/batches/${a}/status`,{params:{wait:0},timeout:1e4})).data;if(!d.jobs||d.jobs.length===0)return console.log(`[BatchProgress] Batch ${a} has no jobs, removing from storage`),w(a),{hasActiveJobs:!1,jobCount:0,hasFailedJobs:!1};const f=d.jobs.filter(c=>c.status==="pending"||c.status==="processing"||c.status==="failed"),h=d.jobs.filter(c=>c.status==="pending"||c.status==="processing"),l=d.jobs.filter(c=>c.status==="failed");if(f.length===0)return console.log(`[BatchProgress] Batch ${a} has no jobs to restore (all completed), removing from storage`),w(a),{hasActiveJobs:!1,jobCount:0,hasFailedJobs:!1};e.value=a;for(const c of f)t.value.set(c.job_id,{job_id:c.job_id,filename:c.filename,status:c.status,receipt_id:c.receipt_id||null,error_message:c.error_message||null,confidence:c.confidence||null});return console.log(`[BatchProgress] Restored ${f.length} jobs from batch ${a} (${h.length} active, ${l.length} failed)`),h.length>0&&!r.value&&(r.value=!0,o=new AbortController,k()),{hasActiveJobs:h.length>0,jobCount:f.length,hasFailedJobs:l.length>0}}catch(p){return console.error(`[BatchProgress] Error restoring batch ${a}:`,p),((n=p.response)==null?void 0:n.status)===404&&(console.log(`[BatchProgress] Batch ${a} not found, removing from storage`),w(a)),{hasActiveJobs:!1,jobCount:0,hasFailedJobs:!1}}}async function K(a){var n,p,d,f;try{const l=(await g.post(`/bulk/cancel/${a}`)).data;return l.success?(t.value.delete(a),console.log(`[BatchProgress] Job ${a} cancelled successfully`),{success:!0,message:l.message||"Job anulat cu succes"}):{success:!1,message:l.message||"Eroare la anularea job-ului"}}catch(h){return console.error("[BatchProgress] Error cancelling job:",h),{success:!1,message:((p=(n=h.response)==null?void 0:n.data)==null?void 0:p.detail)||((f=(d=h.response)==null?void 0:d.data)==null?void 0:f.message)||h.message||"Eroare la anularea job-ului"}}}async function V(a){var n,p,d,f;try{const l=(await g.post(`/bulk/cancel-batch/${a}`)).data;if(l.success){const c=[];for(const[S,u]of t.value.entries())(u.status==="pending"||u.status==="processing")&&c.push(S);for(const S of c)t.value.delete(S);return console.log(`[BatchProgress] Batch ${a} cancelled: ${l.cancelled_count} cancelled, ${l.skipped_count} skipped`),{success:!0,message:l.message||`${l.cancelled_count} job-uri anulate`,cancelledCount:l.cancelled_count,skippedCount:l.skipped_count}}return{success:!1,message:l.message||"Eroare la anularea batch-ului",cancelledCount:0,skippedCount:0}}catch(h){return console.error("[BatchProgress] Error cancelling batch:",h),{success:!1,message:((p=(n=h.response)==null?void 0:n.data)==null?void 0:p.detail)||((f=(d=h.response)==null?void 0:d.data)==null?void 0:f.message)||h.message||"Eroare la anularea batch-ului",cancelledCount:0,skippedCount:0}}}return{batchId:e,jobs:t,isPolling:r,error:s,pendingCount:y,processingCount:P,completedCount:A,failedCount:B,totalCount:_,progress:D,isComplete:L,totalAmount:j,jobsArray:O,startPolling:M,stopPolling:$,reset:N,getStoredBatchIds:U,clearStoredBatch:z,clearAllStoredBatches:W,shouldClearBatch:J,clearBatchIfNoFailedJobs:I,restoreJobsFromBatch:H,cancelJob:K,cancelBatch:V,setOnJobsTransitionCallback:a=>{m=a}}}),se=(e={})=>{const{username:t,serverId:r}=e;console.log("[DataEntry] Resetting all stores on logout...",{username:t,serverId:r});try{const s=Z();s.$reset&&s.$reset()}catch(s){console.warn("[DataEntry] Could not reset receipts store:",s.message)}try{const s=te();s.reset&&s.reset()}catch(s){console.warn("[DataEntry] Could not reset batch progress store:",s.message)}try{const s=X();s.$reset&&s.$reset()}catch(s){console.warn("[DataEntry] Could not reset OCR settings store:",s.message)}try{const s=ae();s.resetWithContext&&t?s.resetWithContext(t,r):s.reset&&s.reset()}catch(s){console.warn("[DataEntry] Could not reset company store:",s.message)}try{const s=oe();s.reset&&s.reset()}catch(s){console.warn("[DataEntry] Could not reset period store:",s.message)}console.log("[DataEntry] All stores reset complete")},re=Q(g,{onLogout:se}),ae=Y(g,re),oe=q(g);export{ae as a,oe as b,te as c,re as d,Z as u}; -//# sourceMappingURL=sharedStores.D4bwf0TZ.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/sharedStores.D4bwf0TZ.js.map b/deploy-package-20260223-151231/frontend/assets/sharedStores.D4bwf0TZ.js.map deleted file mode 100644 index 5565ba0..0000000 --- a/deploy-package-20260223-151231/frontend/assets/sharedStores.D4bwf0TZ.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"sharedStores.D4bwf0TZ.js","sources":["../../src/modules/data-entry/stores/receiptsStore.js","../../src/modules/data-entry/stores/batchProgressStore.js","../../src/modules/data-entry/stores/sharedStores.js"],"sourcesContent":["import { defineStore } from 'pinia'\nimport apiClient from '@data-entry/services/api'\n\n// Create receipts-specific API wrapper\nconst api = {\n get: (url, config) => apiClient.get(`/receipts${url}`, config),\n post: (url, data, config) => apiClient.post(`/receipts${url}`, data, config),\n put: (url, data, config) => apiClient.put(`/receipts${url}`, data, config),\n delete: (url, config) => apiClient.delete(`/receipts${url}`, config),\n}\n\nexport const useReceiptsStore = defineStore('receipts', {\n state: () => ({\n receipts: [],\n currentReceipt: null,\n pendingReceipts: [],\n stats: null,\n // Processing stats for bulk upload filtering (US-005)\n processingStats: {\n pending_count: 0,\n processing_count: 0,\n completed_count: 0,\n failed_count: 0,\n },\n loading: false,\n error: null,\n pagination: {\n page: 1,\n pageSize: 20,\n total: 0,\n pages: 1,\n },\n filters: {\n status: null,\n search: '',\n direction: null,\n dateFrom: null,\n dateTo: null,\n processingStatus: null, // US-005: Filter by processing_status\n },\n // Nomenclatures\n partners: [],\n accounts: [],\n cashRegisters: [],\n expenseTypes: [],\n }),\n\n getters: {\n hasReceipts: (state) => state.receipts.length > 0,\n hasPendingReceipts: (state) => state.pendingReceipts.length > 0,\n pendingCount: (state) => state.pendingReceipts.length,\n },\n\n actions: {\n // ============ Receipts CRUD ============\n\n async fetchReceipts() {\n this.loading = true\n this.error = null\n try {\n const params = {\n page: this.pagination.page,\n page_size: this.pagination.pageSize,\n }\n\n if (this.filters.status) {\n params.status = this.filters.status\n }\n if (this.filters.search) {\n params.search = this.filters.search\n }\n if (this.filters.direction) {\n params.direction = this.filters.direction\n }\n if (this.filters.dateFrom) {\n params.date_from = this.filters.dateFrom\n }\n if (this.filters.dateTo) {\n params.date_to = this.filters.dateTo\n }\n // US-005: Add processing_status filter\n // Map frontend filter values to backend values\n if (this.filters.processingStatus) {\n if (this.filters.processingStatus === 'in_processing') {\n // \"În procesare\" = pending + processing\n params.processing_status = 'pending,processing'\n } else {\n params.processing_status = this.filters.processingStatus\n }\n }\n\n const response = await api.get('/', { params })\n this.receipts = response.data.items\n this.pagination.total = response.data.total\n this.pagination.pages = response.data.pages\n // US-005: Capture processing_stats from API response\n if (response.data.processing_stats) {\n this.processingStats = response.data.processing_stats\n }\n } catch (error) {\n this.error = error.response?.data?.detail || 'Failed to fetch receipts'\n throw error\n } finally {\n this.loading = false\n }\n },\n\n async fetchReceiptById(id) {\n this.loading = true\n this.error = null\n try {\n const response = await api.get(`/${id}`)\n this.currentReceipt = response.data\n return response.data\n } catch (error) {\n this.error = error.response?.data?.detail || 'Failed to fetch receipt'\n throw error\n } finally {\n this.loading = false\n }\n },\n\n async createReceipt(data) {\n this.loading = true\n this.error = null\n try {\n const response = await api.post('/', data)\n return response.data\n } catch (error) {\n this.error = error.response?.data?.detail || 'Failed to create receipt'\n throw error\n } finally {\n this.loading = false\n }\n },\n\n async updateReceipt(id, data) {\n this.loading = true\n this.error = null\n try {\n const response = await api.put(`/${id}`, data)\n return response.data\n } catch (error) {\n this.error = error.response?.data?.detail || 'Failed to update receipt'\n throw error\n } finally {\n this.loading = false\n }\n },\n\n async deleteReceipt(id) {\n this.loading = true\n this.error = null\n try {\n await api.delete(`/${id}`)\n } catch (error) {\n this.error = error.response?.data?.detail || 'Failed to delete receipt'\n throw error\n } finally {\n this.loading = false\n }\n },\n\n // ============ Workflow Actions ============\n\n async submitReceipt(id) {\n this.loading = true\n this.error = null\n try {\n const response = await api.post(`/${id}/submit`)\n return response.data\n } catch (error) {\n this.error = error.response?.data?.detail || 'Failed to submit receipt'\n throw error\n } finally {\n this.loading = false\n }\n },\n\n async approveReceipt(id) {\n this.loading = true\n this.error = null\n try {\n const response = await api.post(`/${id}/approve`)\n return response.data\n } catch (error) {\n this.error = error.response?.data?.detail || 'Failed to approve receipt'\n throw error\n } finally {\n this.loading = false\n }\n },\n\n async rejectReceipt(id, reason) {\n this.loading = true\n this.error = null\n try {\n const response = await api.post(`/${id}/reject`, { reason })\n return response.data\n } catch (error) {\n this.error = error.response?.data?.detail || 'Failed to reject receipt'\n throw error\n } finally {\n this.loading = false\n }\n },\n\n async resubmitReceipt(id) {\n this.loading = true\n this.error = null\n try {\n const response = await api.post(`/${id}/resubmit`)\n return response.data\n } catch (error) {\n this.error = error.response?.data?.detail || 'Failed to resubmit receipt'\n throw error\n } finally {\n this.loading = false\n }\n },\n\n async unapproveReceipt(id) {\n this.loading = true\n this.error = null\n try {\n const response = await api.post(`/${id}/unapprove`)\n return response.data\n } catch (error) {\n this.error = error.response?.data?.detail || 'Failed to unapprove receipt'\n throw error\n } finally {\n this.loading = false\n }\n },\n\n // ============ Pending Receipts ============\n\n async fetchPendingReceipts() {\n this.loading = true\n this.error = null\n try {\n const response = await api.get('/pending')\n this.pendingReceipts = response.data\n return response.data\n } catch (error) {\n this.error = error.response?.data?.detail || 'Failed to fetch pending receipts'\n throw error\n } finally {\n this.loading = false\n }\n },\n\n // ============ Attachments ============\n\n async uploadAttachment(receiptId, file) {\n const formData = new FormData()\n formData.append('file', file)\n\n try {\n const response = await api.post(`/${receiptId}/attachments`, formData, {\n headers: { 'Content-Type': 'multipart/form-data' },\n })\n return response.data\n } catch (error) {\n throw new Error(error.response?.data?.detail || 'Failed to upload attachment')\n }\n },\n\n async deleteAttachment(attachmentId) {\n try {\n await api.delete(`/attachments/${attachmentId}`)\n } catch (error) {\n throw new Error(error.response?.data?.detail || 'Failed to delete attachment')\n }\n },\n\n getAttachmentUrl(attachmentId) {\n return `/api/data-entry/receipts/attachments/${attachmentId}/download`\n },\n\n async fetchAttachmentBlob(attachmentId) {\n try {\n // Use apiClient directly - attachments endpoints are at /api/receipts/attachments, not /api/receipts/receipts/attachments\n const response = await apiClient.get(`/receipts/attachments/${attachmentId}/download`, {\n responseType: 'blob',\n })\n return URL.createObjectURL(response.data)\n } catch (error) {\n console.error('Failed to fetch attachment:', error)\n return null\n }\n },\n\n async downloadAttachment(attachmentId, filename) {\n try {\n // Use apiClient directly - attachments endpoints are at /api/receipts/attachments, not /api/receipts/receipts/attachments\n const response = await apiClient.get(`/receipts/attachments/${attachmentId}/download`, {\n responseType: 'blob',\n })\n // Create download link\n const url = URL.createObjectURL(response.data)\n const link = document.createElement('a')\n link.href = url\n link.download = filename || 'attachment'\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n URL.revokeObjectURL(url)\n return true\n } catch (error) {\n console.error('Failed to download attachment:', error)\n throw new Error(error.response?.data?.detail || 'Failed to download attachment')\n }\n },\n\n // ============ Accounting Entries ============\n\n async fetchEntries(receiptId) {\n try {\n const response = await api.get(`/${receiptId}/entries`)\n return response.data\n } catch (error) {\n throw new Error(error.response?.data?.detail || 'Failed to fetch entries')\n }\n },\n\n async updateEntries(receiptId, entries) {\n try {\n const response = await api.put(`/${receiptId}/entries`, { entries })\n return response.data\n } catch (error) {\n throw new Error(error.response?.data?.detail || 'Failed to update entries')\n }\n },\n\n async regenerateEntries(receiptId) {\n try {\n const response = await api.post(`/${receiptId}/entries/regenerate`)\n return response.data\n } catch (error) {\n throw new Error(error.response?.data?.detail || 'Failed to regenerate entries')\n }\n },\n\n // ============ Nomenclatures ============\n\n async fetchPartners(search = '') {\n try {\n const response = await api.get('/nomenclature/partners', {\n params: { search },\n })\n this.partners = response.data\n return response.data\n } catch (error) {\n console.error('Failed to fetch partners:', error)\n return []\n }\n },\n\n async fetchAccounts(prefix = '') {\n try {\n const response = await api.get('/nomenclature/accounts', {\n params: { prefix },\n })\n this.accounts = response.data\n return response.data\n } catch (error) {\n console.error('Failed to fetch accounts:', error)\n return []\n }\n },\n\n async fetchCashRegisters() {\n try {\n const response = await api.get('/nomenclature/cash-registers')\n this.cashRegisters = response.data\n return response.data\n } catch (error) {\n console.error('Failed to fetch cash registers:', error)\n return []\n }\n },\n\n async fetchExpenseTypes() {\n try {\n const response = await api.get('/nomenclature/expense-types')\n this.expenseTypes = response.data\n return response.data\n } catch (error) {\n console.error('Failed to fetch expense types:', error)\n return []\n }\n },\n\n async fetchAllNomenclatures() {\n await Promise.all([\n this.fetchPartners(),\n this.fetchCashRegisters(),\n this.fetchExpenseTypes(),\n ])\n },\n\n async searchSupplier(fiscalCode) {\n try {\n // Use apiClient directly (not wrapped) - nomenclature endpoints are at /api/nomenclature, not /api/receipts\n const response = await apiClient.get('/nomenclature/suppliers/search', {\n params: { fiscal_code: fiscalCode },\n })\n return response.data\n } catch (error) {\n console.error('Supplier search failed:', error)\n return { found: false, source: 'error' }\n }\n },\n\n async createLocalSupplier(data) {\n try {\n // Use apiClient directly (not wrapped) - nomenclature endpoints are at /api/nomenclature, not /api/receipts\n const response = await apiClient.post('/nomenclature/suppliers/local', data)\n // Add to local partners list\n this.partners.push({\n id: response.data.id,\n name: response.data.name,\n fiscal_code: response.data.fiscal_code,\n address: response.data.address,\n source: 'local',\n })\n return response.data\n } catch (error) {\n throw new Error(error.response?.data?.detail || 'Failed to create supplier')\n }\n },\n\n async syncSuppliers() {\n try {\n // Use apiClient directly - nomenclature endpoints at /api/nomenclature\n const response = await apiClient.post('/nomenclature/sync/suppliers')\n console.log('[receiptsStore] Synced suppliers:', response.data)\n // Refresh partners list after sync\n await this.fetchPartners()\n return response.data\n } catch (error) {\n console.error('[receiptsStore] Supplier sync failed:', error)\n throw error\n }\n },\n\n // ============ Stats ============\n\n async fetchStats() {\n try {\n const response = await api.get('/stats')\n this.stats = response.data\n return response.data\n } catch (error) {\n console.error('Failed to fetch stats:', error)\n return null\n }\n },\n\n // ============ Retry Actions (US-006) ============\n\n /**\n * Retry processing for a single failed receipt.\n * Calls POST /bulk/retry/{receipt_id} to requeue the OCR job.\n *\n * @param {number} receiptId - Receipt ID to retry\n * @returns {Promise<{success: boolean, job_id: string, message: string}>}\n */\n async retryReceipt(receiptId) {\n try {\n // Use apiClient directly - bulk endpoints are at /api/data-entry/bulk, not /api/data-entry/receipts\n const response = await apiClient.post(`/bulk/retry/${receiptId}`)\n return response.data\n } catch (error) {\n const detail = error.response?.data?.detail || 'Eroare la reîncărcare'\n throw new Error(detail)\n }\n },\n\n /**\n * Retry all failed receipts in a batch.\n * Calls POST /bulk/retry-batch/{batch_id} to requeue all failed OCR jobs.\n *\n * @param {string} batchId - Batch ID (UUID string)\n * @returns {Promise<{success: boolean, retried_count: number, failed_count: number, message: string}>}\n */\n async retryBatchFailed(batchId) {\n try {\n // Use apiClient directly - bulk endpoints are at /api/data-entry/bulk, not /api/data-entry/receipts\n const response = await apiClient.post(`/bulk/retry-batch/${batchId}`)\n return response.data\n } catch (error) {\n const detail = error.response?.data?.detail || 'Eroare la reîncărcarea batch-ului'\n throw new Error(detail)\n }\n },\n\n // ============ Bulk Delete (US-027) ============\n\n /**\n * Bulk delete receipts by IDs.\n * Calls DELETE /receipts/bulk and returns partial success response.\n *\n * @param {number[]} ids - Array of receipt IDs to delete\n * @returns {Promise<{deleted: number[], failed: Array<{id: number, error: string}>}>}\n */\n async bulkDeleteReceipts(ids) {\n try {\n const response = await api.delete('/bulk', { data: { ids } })\n return response.data\n } catch (error) {\n const detail = error.response?.data?.detail || 'Eroare la ștergerea bonurilor'\n throw new Error(detail)\n }\n },\n\n /**\n * Remove receipts from local array by IDs (US-027).\n * Updates array in place without re-fetching from server.\n *\n * @param {number[]} ids - Array of receipt IDs to remove\n */\n removeReceiptsLocally(ids) {\n const idsSet = new Set(ids)\n this.receipts = this.receipts.filter(r => !idsSet.has(r.id))\n },\n\n /**\n * Update a single receipt in place without replacing the array (US-029).\n * Uses Object.assign() to preserve Vue reactivity and only re-render\n * the affected row, not the entire list.\n *\n * @param {number} receiptId - Receipt ID to update\n * @param {Object} updates - Object with properties to update\n * @returns {boolean} true if receipt was found and updated, false otherwise\n */\n updateReceiptInPlace(receiptId, updates) {\n const idx = this.receipts.findIndex(r => r.id === receiptId)\n if (idx !== -1) {\n Object.assign(this.receipts[idx], updates)\n return true\n }\n return false\n },\n\n /**\n * Insert a receipt in place at the correct position (US-034, US-043).\n *\n * US-043: Always prepend to maintain upload order. When jobs complete,\n * they transition from jobItems (prepended in unifiedItems) to receiptsList.\n * Prepending to receiptsList ensures the receipt appears where the job was -\n * right after the remaining pending jobs.\n *\n * This maintains visual position stability:\n * - Jobs are shown first (from batchProgressStore.jobs)\n * - As jobs complete, their receipts prepend to this.receipts\n * - Combined: [remaining_jobs] + [newly_completed_receipts] + [older_receipts]\n *\n * @param {Object} receipt - The full receipt object to insert\n * @returns {boolean} true if receipt was inserted\n */\n insertReceiptInPlace(receipt) {\n // Check if receipt already exists\n const existingIdx = this.receipts.findIndex(r => r.id === receipt.id)\n if (existingIdx !== -1) {\n // Already exists, update it instead (US-029: in-place update, no reordering)\n Object.assign(this.receipts[existingIdx], receipt)\n return true\n }\n\n // US-043: Always prepend new receipts to maintain upload order.\n // This preserves the position of completed jobs (which are prepended in unifiedItems).\n this.receipts.unshift(receipt)\n return true\n },\n\n // ============ Filters & Pagination ============\n\n setFilters(filters) {\n this.filters = { ...this.filters, ...filters }\n this.pagination.page = 1\n },\n\n clearFilters() {\n this.filters = {\n status: null,\n search: '',\n direction: null,\n dateFrom: null,\n dateTo: null,\n processingStatus: null, // US-005\n }\n this.pagination.page = 1\n },\n\n setPage(page) {\n this.pagination.page = page\n },\n\n clearCurrentReceipt() {\n this.currentReceipt = null\n },\n },\n})\n","/**\n * Batch Progress Store\n *\n * Pinia store for tracking bulk upload batch progress via long-polling.\n * Uses AbortController for clean cancellation on component unmount.\n *\n * US-009: Added localStorage persistence for active batch IDs to support\n * auto-resume polling after page refresh or navigation away.\n */\n\nimport { defineStore } from 'pinia'\nimport { ref, computed } from 'vue'\nimport api from '@data-entry/services/api'\n\n/**\n * @typedef {Object} JobStatus\n * @property {string} job_id - OCR job UUID\n * @property {string} filename - Original filename\n * @property {string} status - Job status: 'pending' | 'processing' | 'completed' | 'failed'\n * @property {number|null} receipt_id - Created receipt ID (if completed)\n * @property {string|null} error_message - Error message (if failed)\n */\n\n// US-009: localStorage key for persisting active batch IDs\nconst ACTIVE_BATCHES_STORAGE_KEY = 'roa2web_active_batch_ids'\n\n/**\n * Get active batch IDs from localStorage\n * @returns {string[]} Array of batch ID strings\n */\nfunction getStoredActiveBatches() {\n try {\n const stored = localStorage.getItem(ACTIVE_BATCHES_STORAGE_KEY)\n if (!stored) return []\n const parsed = JSON.parse(stored)\n return Array.isArray(parsed) ? parsed : []\n } catch (e) {\n console.warn('[BatchProgress] Failed to read localStorage:', e)\n return []\n }\n}\n\n/**\n * Save active batch IDs to localStorage\n * @param {string[]} batchIds - Array of batch ID strings\n */\nfunction saveActiveBatches(batchIds) {\n try {\n if (batchIds.length === 0) {\n localStorage.removeItem(ACTIVE_BATCHES_STORAGE_KEY)\n } else {\n localStorage.setItem(ACTIVE_BATCHES_STORAGE_KEY, JSON.stringify(batchIds))\n }\n } catch (e) {\n console.warn('[BatchProgress] Failed to save to localStorage:', e)\n }\n}\n\n/**\n * Add a batch ID to localStorage\n * @param {string} batchId - Batch ID to add\n */\nfunction addActiveBatch(batchId) {\n const batches = getStoredActiveBatches()\n if (!batches.includes(batchId)) {\n batches.push(batchId)\n saveActiveBatches(batches)\n }\n}\n\n/**\n * Remove a batch ID from localStorage\n * @param {string} batchId - Batch ID to remove\n */\nfunction removeActiveBatch(batchId) {\n const batches = getStoredActiveBatches()\n const filtered = batches.filter(id => id !== batchId)\n saveActiveBatches(filtered)\n}\n\nexport const useBatchProgressStore = defineStore('batchProgress', () => {\n // ============ State ============\n\n /** @type {import('vue').Ref} Current batch ID being tracked */\n const batchId = ref(null)\n\n /** @type {import('vue').Ref>} Map of job_id -> JobStatus */\n const jobs = ref(new Map())\n\n /** @type {import('vue').Ref} Whether polling is active */\n const isPolling = ref(false)\n\n /** @type {import('vue').Ref} Last error message */\n const error = ref(null)\n\n /** @type {AbortController|null} Controller for canceling ongoing requests */\n let abortController = null\n\n /**\n * US-018: Callback function for when jobs complete or fail.\n * Set this to receive notifications when job status transitions happen.\n * @type {((completedReceiptIds: number[], failedJobIds: string[]) => void)|null}\n */\n let onJobsTransitionCallback = null\n\n // ============ Computed ============\n\n /** Number of jobs in 'pending' status */\n const pendingCount = computed(() => {\n let count = 0\n for (const job of jobs.value.values()) {\n if (job.status === 'pending') count++\n }\n return count\n })\n\n /** Number of jobs in 'processing' status */\n const processingCount = computed(() => {\n let count = 0\n for (const job of jobs.value.values()) {\n if (job.status === 'processing') count++\n }\n return count\n })\n\n /** Number of jobs in 'completed' status */\n const completedCount = computed(() => {\n let count = 0\n for (const job of jobs.value.values()) {\n if (job.status === 'completed') count++\n }\n return count\n })\n\n /** Number of jobs in 'failed' status */\n const failedCount = computed(() => {\n let count = 0\n for (const job of jobs.value.values()) {\n if (job.status === 'failed') count++\n }\n return count\n })\n\n /** Total number of jobs */\n const totalCount = computed(() => jobs.value.size)\n\n /** Progress percentage (0-100) */\n const progress = computed(() => {\n if (totalCount.value === 0) return 0\n const finished = completedCount.value + failedCount.value\n return Math.round((finished / totalCount.value) * 100)\n })\n\n /** Whether all jobs are finished (completed or failed) */\n const isComplete = computed(() => {\n if (totalCount.value === 0) return false\n return pendingCount.value === 0 && processingCount.value === 0\n })\n\n /** Total amount from all completed receipts (from backend response) */\n const totalAmount = ref(0)\n\n /** Jobs as array for iteration */\n const jobsArray = computed(() => Array.from(jobs.value.values()))\n\n // ============ Actions ============\n\n /**\n * Start long-polling for batch status updates.\n * Uses 30-second wait parameter for efficient long-polling.\n *\n * @param {string} id - Batch ID to track\n * @param {Array<{job_id: string, filename: string}>} [initialJobs] - Optional initial jobs to populate immediately\n */\n async function startPolling(id, initialJobs = null) {\n // Stop any existing polling\n stopPolling()\n\n // Reset state\n batchId.value = id\n jobs.value = new Map()\n error.value = null\n isPolling.value = true\n totalAmount.value = 0\n\n // US-017: Pre-populate jobs immediately if initial jobs provided\n // This ensures jobs appear instantly in the table before polling fetches real status\n if (initialJobs && Array.isArray(initialJobs)) {\n for (const job of initialJobs) {\n jobs.value.set(job.job_id, {\n job_id: job.job_id,\n filename: job.filename,\n status: 'pending', // Initial status is always pending\n receipt_id: null,\n error_message: null,\n confidence: null\n })\n }\n }\n\n // US-009: Persist batch ID to localStorage for resume after refresh\n addActiveBatch(id)\n\n // Create new abort controller for this polling session\n abortController = new AbortController()\n\n // Start polling loop\n await pollLoop()\n }\n\n /**\n * Stop polling and cancel any pending requests.\n */\n function stopPolling() {\n isPolling.value = false\n\n // Cancel any pending request\n if (abortController) {\n abortController.abort()\n abortController = null\n }\n }\n\n /**\n * Internal polling loop - fetches status until complete or stopped.\n */\n async function pollLoop() {\n while (isPolling.value && batchId.value !== null) {\n try {\n // Fetch batch status with 30-second wait (long-polling)\n const response = await api.get(`/bulk/batches/${batchId.value}/status`, {\n params: { wait: 30 },\n signal: abortController?.signal,\n // Extend timeout for long-polling\n timeout: 35000\n })\n\n const data = response.data\n\n // US-018: Track status transitions for callback notification\n const previousJobs = jobs.value\n const newlyCompletedReceiptIds = []\n const newlyFailedJobIds = []\n\n // Update jobs map\n const newJobs = new Map()\n for (const job of data.jobs) {\n const previousJob = previousJobs.get(job.job_id)\n const previousStatus = previousJob?.status\n\n // Check for transitions to completed/failed\n if (previousStatus && previousStatus !== job.status) {\n if (job.status === 'completed' && job.receipt_id) {\n newlyCompletedReceiptIds.push(job.receipt_id)\n console.log(`[BatchProgress] Job ${job.job_id} completed -> receipt ${job.receipt_id}`)\n } else if (job.status === 'failed') {\n newlyFailedJobIds.push(job.job_id)\n console.log(`[BatchProgress] Job ${job.job_id} failed: ${job.error_message}`)\n }\n }\n\n newJobs.set(job.job_id, {\n job_id: job.job_id,\n filename: job.filename,\n status: job.status,\n receipt_id: job.receipt_id || null,\n error_message: job.error_message || null,\n confidence: job.confidence || null\n })\n }\n jobs.value = newJobs\n\n // US-018: Notify listener of status transitions\n if (onJobsTransitionCallback && (newlyCompletedReceiptIds.length > 0 || newlyFailedJobIds.length > 0)) {\n onJobsTransitionCallback(newlyCompletedReceiptIds, newlyFailedJobIds)\n }\n\n // Update total amount from backend\n totalAmount.value = data.total_amount || 0\n\n // Clear any previous error\n error.value = null\n\n // Check if all jobs are finished\n const finished = data.completed_count + data.failed_count\n if (finished >= data.total_files) {\n console.log('[BatchProgress] All jobs finished, stopping polling')\n isPolling.value = false\n\n // US-405: Only remove batch from localStorage if there are NO failed jobs\n // Failed jobs need to persist so they're visible after refresh\n if (batchId.value && data.failed_count === 0) {\n console.log('[BatchProgress] No failed jobs, removing batch from storage')\n removeActiveBatch(batchId.value)\n } else if (data.failed_count > 0) {\n console.log(`[BatchProgress] Batch has ${data.failed_count} failed jobs, keeping in storage for retry`)\n }\n\n break\n }\n\n } catch (err) {\n // Ignore abort errors (expected when stopPolling is called)\n if (err.name === 'AbortError' || err.code === 'ERR_CANCELED') {\n console.log('[BatchProgress] Polling aborted')\n break\n }\n\n // Handle other errors\n console.error('[BatchProgress] Polling error:', err)\n error.value = err.response?.data?.detail || err.message || 'Failed to fetch batch status'\n\n // Wait before retrying on error\n await sleep(2000)\n }\n }\n }\n\n /**\n * Reset store to initial state.\n */\n function reset() {\n stopPolling()\n batchId.value = null\n jobs.value = new Map()\n error.value = null\n totalAmount.value = 0\n }\n\n // ============ US-009: Auto-Resume Functions ============\n\n /**\n * Get list of active batch IDs stored in localStorage.\n * Used by views to check if there are batches to resume after refresh.\n *\n * @returns {string[]} Array of stored batch IDs\n */\n function getStoredBatchIds() {\n return getStoredActiveBatches()\n }\n\n /**\n * Clear a specific batch ID from localStorage.\n * Called when a batch is determined to be complete (all items processed).\n *\n * US-405: Can also be called when all failed jobs have been resolved\n * (e.g., after successful retry or deletion of failed receipts).\n *\n * @param {string} batchIdToRemove - Batch ID to remove from storage\n */\n function clearStoredBatch(batchIdToRemove) {\n removeActiveBatch(batchIdToRemove)\n }\n\n /**\n * US-405: Check if a batch should be cleared from storage.\n * Returns true if the batch has no remaining failed jobs that need attention.\n *\n * Call this after retry or delete operations to clean up batches\n * that no longer have failed jobs.\n */\n function shouldClearBatch() {\n // If no jobs remain, batch can be cleared\n if (jobs.value.size === 0) return true\n\n // If any jobs are still failed, keep the batch\n for (const job of jobs.value.values()) {\n if (job.status === 'failed') return false\n }\n\n // No failed jobs remain\n return true\n }\n\n /**\n * US-405: Clear batch from storage if no failed jobs remain.\n * Call this after retry/delete operations to clean up localStorage.\n */\n function clearBatchIfNoFailedJobs() {\n if (shouldClearBatch() && batchId.value) {\n console.log('[BatchProgress] No failed jobs remain, clearing batch from storage')\n removeActiveBatch(batchId.value)\n }\n }\n\n /**\n * Clear all stored batch IDs from localStorage.\n * Used during cleanup or when all batches are confirmed complete.\n */\n function clearAllStoredBatches() {\n saveActiveBatches([])\n }\n\n /**\n * Helper: Sleep for given milliseconds.\n * @param {number} ms - Milliseconds to sleep\n */\n function sleep(ms) {\n return new Promise(resolve => setTimeout(resolve, ms))\n }\n\n // ============ US-023: Restore Jobs from Batch ============\n\n /**\n * Restore jobs from a stored batch by fetching current status from API.\n * Restores pending, processing, AND failed jobs to the store.\n *\n * US-023: Called on page refresh/return to restore visibility of active jobs.\n * US-405: Now includes failed jobs so users can see OCR errors after refresh.\n *\n * @param {string} storedBatchId - The batch ID to restore from\n * @returns {Promise<{hasActiveJobs: boolean, jobCount: number, hasFailedJobs: boolean}>} Result of restoration\n */\n async function restoreJobsFromBatch(storedBatchId) {\n try {\n console.log(`[BatchProgress] Restoring jobs from batch ${storedBatchId}`)\n\n // Fetch current batch status from API (no wait, just get current state)\n const response = await api.get(`/bulk/batches/${storedBatchId}/status`, {\n params: { wait: 0 },\n timeout: 10000\n })\n\n const data = response.data\n\n if (!data.jobs || data.jobs.length === 0) {\n console.log(`[BatchProgress] Batch ${storedBatchId} has no jobs, removing from storage`)\n removeActiveBatch(storedBatchId)\n return { hasActiveJobs: false, jobCount: 0, hasFailedJobs: false }\n }\n\n // US-405: Include failed jobs in restoration (not just pending/processing)\n // Failed jobs need to remain visible so users can see and resolve errors\n const jobsToRestore = data.jobs.filter(\n job => job.status === 'pending' || job.status === 'processing' || job.status === 'failed'\n )\n\n // Count active jobs (pending/processing) for polling decision\n const activeJobs = data.jobs.filter(\n job => job.status === 'pending' || job.status === 'processing'\n )\n\n // Count failed jobs for return value\n const failedJobs = data.jobs.filter(job => job.status === 'failed')\n\n if (jobsToRestore.length === 0) {\n // All jobs are completed - safe to remove batch from storage\n console.log(`[BatchProgress] Batch ${storedBatchId} has no jobs to restore (all completed), removing from storage`)\n removeActiveBatch(storedBatchId)\n return { hasActiveJobs: false, jobCount: 0, hasFailedJobs: false }\n }\n\n // Set batch ID and add jobs to store\n batchId.value = storedBatchId\n\n // Add jobs to the Map (merge with existing if any)\n for (const job of jobsToRestore) {\n jobs.value.set(job.job_id, {\n job_id: job.job_id,\n filename: job.filename,\n status: job.status,\n receipt_id: job.receipt_id || null,\n error_message: job.error_message || null,\n confidence: job.confidence || null\n })\n }\n\n console.log(`[BatchProgress] Restored ${jobsToRestore.length} jobs from batch ${storedBatchId} (${activeJobs.length} active, ${failedJobs.length} failed)`)\n\n // Only start polling if there are active jobs (pending/processing)\n // Failed-only batches don't need polling - they're waiting for user action\n if (activeJobs.length > 0 && !isPolling.value) {\n isPolling.value = true\n abortController = new AbortController()\n // Start polling loop in background\n pollLoop()\n }\n\n return {\n hasActiveJobs: activeJobs.length > 0,\n jobCount: jobsToRestore.length,\n hasFailedJobs: failedJobs.length > 0\n }\n } catch (err) {\n console.error(`[BatchProgress] Error restoring batch ${storedBatchId}:`, err)\n\n // If batch not found (404), remove it from storage\n if (err.response?.status === 404) {\n console.log(`[BatchProgress] Batch ${storedBatchId} not found, removing from storage`)\n removeActiveBatch(storedBatchId)\n }\n\n return { hasActiveJobs: false, jobCount: 0, hasFailedJobs: false }\n }\n }\n\n // ============ US-016: Cancel Actions ============\n\n /**\n * Cancel a specific job by job ID.\n * After successful cancellation, the job is removed from the jobs Map.\n *\n * @param {string} jobId - The job ID to cancel\n * @returns {Promise<{success: boolean, message: string}>} Result of the operation\n */\n async function cancelJob(jobId) {\n try {\n const response = await api.post(`/bulk/cancel/${jobId}`)\n const data = response.data\n\n if (data.success) {\n // Remove the cancelled job from the Map\n jobs.value.delete(jobId)\n\n console.log(`[BatchProgress] Job ${jobId} cancelled successfully`)\n return {\n success: true,\n message: data.message || 'Job anulat cu succes'\n }\n }\n\n return {\n success: false,\n message: data.message || 'Eroare la anularea job-ului'\n }\n } catch (err) {\n console.error('[BatchProgress] Error cancelling job:', err)\n\n // Extract error message from response or use generic message\n const errorMessage = err.response?.data?.detail ||\n err.response?.data?.message ||\n err.message ||\n 'Eroare la anularea job-ului'\n\n return {\n success: false,\n message: errorMessage\n }\n }\n }\n\n /**\n * Cancel all pending/processing jobs in a batch.\n * After successful cancellation, cancelled jobs are removed from the jobs Map.\n * Completed/failed jobs remain in the Map for visibility.\n *\n * @param {number|string} batchIdToCancel - The batch ID to cancel\n * @returns {Promise<{success: boolean, message: string, cancelledCount: number, skippedCount: number}>}\n */\n async function cancelBatch(batchIdToCancel) {\n try {\n const response = await api.post(`/bulk/cancel-batch/${batchIdToCancel}`)\n const data = response.data\n\n if (data.success) {\n // Remove all cancelled jobs from the Map\n // Jobs with 'pending' or 'processing' status were cancelled\n const jobsToRemove = []\n for (const [jobId, job] of jobs.value.entries()) {\n if (job.status === 'pending' || job.status === 'processing') {\n jobsToRemove.push(jobId)\n }\n }\n\n // Remove the jobs\n for (const jobId of jobsToRemove) {\n jobs.value.delete(jobId)\n }\n\n console.log(`[BatchProgress] Batch ${batchIdToCancel} cancelled: ${data.cancelled_count} cancelled, ${data.skipped_count} skipped`)\n\n return {\n success: true,\n message: data.message || `${data.cancelled_count} job-uri anulate`,\n cancelledCount: data.cancelled_count,\n skippedCount: data.skipped_count\n }\n }\n\n return {\n success: false,\n message: data.message || 'Eroare la anularea batch-ului',\n cancelledCount: 0,\n skippedCount: 0\n }\n } catch (err) {\n console.error('[BatchProgress] Error cancelling batch:', err)\n\n // Extract error message from response or use generic message\n const errorMessage = err.response?.data?.detail ||\n err.response?.data?.message ||\n err.message ||\n 'Eroare la anularea batch-ului'\n\n return {\n success: false,\n message: errorMessage,\n cancelledCount: 0,\n skippedCount: 0\n }\n }\n }\n\n // ============ Return Public API ============\n\n return {\n // State\n batchId,\n jobs,\n isPolling,\n error,\n\n // Computed\n pendingCount,\n processingCount,\n completedCount,\n failedCount,\n totalCount,\n progress,\n isComplete,\n totalAmount,\n jobsArray,\n\n // Actions\n startPolling,\n stopPolling,\n reset,\n\n // US-009: Auto-Resume Functions\n getStoredBatchIds,\n clearStoredBatch,\n clearAllStoredBatches,\n\n // US-405: Failed Jobs Cleanup\n shouldClearBatch,\n clearBatchIfNoFailedJobs,\n\n // US-023: Restore Jobs from Batch\n restoreJobsFromBatch,\n\n // US-016: Cancel Actions\n cancelJob,\n cancelBatch,\n\n // US-018: Transition Callback\n setOnJobsTransitionCallback: (callback) => {\n onJobsTransitionCallback = callback\n }\n }\n})\n","/**\n * Data Entry Module - Shared Store Instances\n *\n * This file instantiates the shared stores (auth, companies, accountingPeriod)\n * with the Data Entry module's API service.\n */\n\nimport { createAuthStore } from '@shared/stores/auth'\nimport { createCompaniesStore } from '@shared/stores/companies'\nimport { createAccountingPeriodStore } from '@shared/stores/accountingPeriod'\nimport api from '@data-entry/services/api'\n\n// Import module-specific stores that need to be reset on logout\nimport { useReceiptsStore } from './receiptsStore'\nimport { useBatchProgressStore } from './batchProgressStore'\nimport { useOCRSettingsStore } from './ocrSettingsStore'\n\n/**\n * US-028/US-031: Reset all module stores on logout\n * Prevents stale data from previous company after re-login\n *\n * @param {Object} context - Context saved before logout (US-031)\n * @param {string} context.username - Username from before logout\n * @param {string} context.serverId - Server ID from before logout\n */\nconst resetAllStores = (context = {}) => {\n const { username, serverId } = context\n console.log('[DataEntry] Resetting all stores on logout...', { username, serverId })\n\n // Reset module-specific stores\n try {\n const receiptsStore = useReceiptsStore()\n // receiptsStore uses options API style, reset with $reset()\n if (receiptsStore.$reset) {\n receiptsStore.$reset()\n }\n } catch (e) {\n console.warn('[DataEntry] Could not reset receipts store:', e.message)\n }\n\n try {\n const batchStore = useBatchProgressStore()\n if (batchStore.reset) batchStore.reset()\n } catch (e) {\n console.warn('[DataEntry] Could not reset batch progress store:', e.message)\n }\n\n try {\n const ocrStore = useOCRSettingsStore()\n if (ocrStore.$reset) ocrStore.$reset()\n } catch (e) {\n console.warn('[DataEntry] Could not reset OCR settings store:', e.message)\n }\n\n // Reset shared stores (companies and periods)\n // Note: These are reset AFTER module stores since they may depend on auth\n // US-031: Use resetWithContext with explicit username/serverId\n try {\n const companyStore = useCompanyStore()\n if (companyStore.resetWithContext && username) {\n // Use the new method that accepts explicit parameters\n companyStore.resetWithContext(username, serverId)\n } else if (companyStore.reset) {\n // Fallback to regular reset (won't clear localStorage properly)\n companyStore.reset()\n }\n } catch (e) {\n console.warn('[DataEntry] Could not reset company store:', e.message)\n }\n\n try {\n const periodStore = useAccountingPeriodStore()\n if (periodStore.reset) periodStore.reset()\n } catch (e) {\n console.warn('[DataEntry] Could not reset period store:', e.message)\n }\n\n console.log('[DataEntry] All stores reset complete')\n}\n\n// Create auth store with onLogout callback (US-028)\nexport const useAuthStore = createAuthStore(api, {\n onLogout: resetAllStores\n})\n\n// Create companies store (needs auth store reference)\nexport const useCompanyStore = createCompaniesStore(api, useAuthStore)\n\n// Create accounting period store\nexport const useAccountingPeriodStore = createAccountingPeriodStore(api)\n"],"names":["api","url","config","apiClient","data","useReceiptsStore","defineStore","state","params","response","error","_b","_a","id","reason","receiptId","file","formData","attachmentId","filename","link","entries","search","prefix","fiscalCode","detail","batchId","ids","idsSet","updates","idx","r","receipt","existingIdx","filters","page","ACTIVE_BATCHES_STORAGE_KEY","getStoredActiveBatches","stored","parsed","saveActiveBatches","batchIds","e","addActiveBatch","batches","removeActiveBatch","filtered","useBatchProgressStore","ref","jobs","isPolling","abortController","onJobsTransitionCallback","pendingCount","computed","count","job","processingCount","completedCount","failedCount","totalCount","progress","finished","isComplete","totalAmount","jobsArray","startPolling","initialJobs","stopPolling","pollLoop","previousJobs","newlyCompletedReceiptIds","newlyFailedJobIds","newJobs","previousJob","previousStatus","err","sleep","reset","getStoredBatchIds","clearStoredBatch","batchIdToRemove","shouldClearBatch","clearBatchIfNoFailedJobs","clearAllStoredBatches","ms","resolve","restoreJobsFromBatch","storedBatchId","jobsToRestore","activeJobs","failedJobs","cancelJob","jobId","_d","_c","cancelBatch","batchIdToCancel","jobsToRemove","callback","resetAllStores","context","username","serverId","receiptsStore","batchStore","ocrStore","useOCRSettingsStore","companyStore","useCompanyStore","periodStore","useAccountingPeriodStore","useAuthStore","createAuthStore","createCompaniesStore","createAccountingPeriodStore"],"mappings":"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"} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/splitbutton.esm.DvALhxoC.js b/deploy-package-20260223-151231/frontend/assets/splitbutton.esm.DvALhxoC.js deleted file mode 100644 index 8e976ee..0000000 --- a/deploy-package-20260223-151231/frontend/assets/splitbutton.esm.DvALhxoC.js +++ /dev/null @@ -1,2 +0,0 @@ -import{B as M,h as F,R as O,l as z,g as A,O as h,D as m,b as R,Z as x,i as N,U as w,o as Z,s as G}from"./vendor-primevue.BN-meDW0.js";import{m as l,k as P,l as H,h as y,d,p as g,c as p,i as v,F as C,B as U,e as E,t as W,x as S,u as K,v as j,S as q,s as T,q as L,f as k,C as D}from"./vendor-core.B6UiYhU_.js";var J={submenu:function(e){var i=e.instance,s=e.processedItem;return{display:i.isItemActive(s)?"block":"none"}}},Q={root:function(e){var i=e.instance,s=e.props;return["p-tieredmenu p-component",{"p-tieredmenu-overlay":s.popup,"p-ripple-disabled":i.$primevue.config.ripple===!1}]},start:"p-tieredmenu-start",menu:"p-tieredmenu-root-list",menuitem:function(e){var i=e.instance,s=e.processedItem;return["p-menuitem",{"p-menuitem-active p-highlight":i.isItemActive(s),"p-focus":i.isItemFocused(s),"p-disabled":i.isItemDisabled(s)}]},content:"p-menuitem-content",action:"p-menuitem-link",icon:"p-menuitem-icon",text:"p-menuitem-text",submenuIcon:"p-submenu-icon",submenu:"p-submenu-list",separator:"p-menuitem-separator",end:"p-tieredmenu-end"},X=M.extend({name:"tieredmenu",classes:Q,inlineStyles:J}),Y={name:"BaseTieredMenu",extends:A,props:{popup:{type:Boolean,default:!1},model:{type:Array,default:null},appendTo:{type:[String,Object],default:"body"},autoZIndex:{type:Boolean,default:!0},baseZIndex:{type:Number,default:0},disabled:{type:Boolean,default:!1},tabindex:{type:Number,default:0},ariaLabelledby:{type:String,default:null},ariaLabel:{type:String,default:null}},style:X,provide:function(){return{$parentInstance:this}}},B={name:"TieredMenuSub",hostName:"TieredMenu",extends:A,emits:["item-click","item-mouseenter","item-mousemove"],container:null,props:{menuId:{type:String,default:null},focusedItemId:{type:String,default:null},items:{type:Array,default:null},visible:{type:Boolean,default:!1},level:{type:Number,default:0},templates:{type:Object,default:null},activeItemPath:{type:Object,default:null},tabindex:{type:Number,default:0}},methods:{getItemId:function(e){return"".concat(this.menuId,"_").concat(e.key)},getItemKey:function(e){return this.getItemId(e)},getItemProp:function(e,i,s){return e&&e.item?h.getItemValue(e.item[i],s):void 0},getItemLabel:function(e){return this.getItemProp(e,"label")},getItemLabelId:function(e){return"".concat(this.menuId,"_").concat(e.key,"_label")},getPTOptions:function(e,i,s){return this.ptm(s,{context:{item:e,index:i,active:this.isItemActive(e),focused:this.isItemFocused(e),disabled:this.isItemDisabled(e)}})},isItemActive:function(e){return this.activeItemPath.some(function(i){return i.key===e.key})},isItemVisible:function(e){return this.getItemProp(e,"visible")!==!1},isItemDisabled:function(e){return this.getItemProp(e,"disabled")},isItemFocused:function(e){return this.focusedItemId===this.getItemId(e)},isItemGroup:function(e){return h.isNotEmpty(e.items)},onEnter:function(){m.nestedPosition(this.container,this.level)},onItemClick:function(e,i){this.getItemProp(i,"command",{originalEvent:e,item:i.item}),this.$emit("item-click",{originalEvent:e,processedItem:i,isFocus:!0})},onItemMouseEnter:function(e,i){this.$emit("item-mouseenter",{originalEvent:e,processedItem:i})},onItemMouseMove:function(e,i){this.$emit("item-mousemove",{originalEvent:e,processedItem:i})},getAriaSetSize:function(){var e=this;return this.items.filter(function(i){return e.isItemVisible(i)&&!e.getItemProp(i,"separator")}).length},getAriaPosInset:function(e){var i=this;return e-this.items.slice(0,e).filter(function(s){return i.isItemVisible(s)&&i.getItemProp(s,"separator")}).length+1},getMenuItemProps:function(e,i){return{action:l({class:this.cx("action"),tabindex:-1,"aria-hidden":!0},this.getPTOptions(e,i,"action")),icon:l({class:[this.cx("icon"),this.getItemProp(e,"icon")]},this.getPTOptions(e,i,"icon")),label:l({class:this.cx("label")},this.getPTOptions(e,i,"label")),submenuicon:l({class:this.cx("submenuIcon")},this.getPTOptions(e,i,"submenuIcon"))}},containerRef:function(e){this.container=e}},components:{AngleRightIcon:z},directives:{ripple:O}},_=["tabindex"],$=["id","aria-label","aria-disabled","aria-expanded","aria-haspopup","aria-level","aria-setsize","aria-posinset","data-p-highlight","data-p-focused","data-p-disabled"],ee=["onClick","onMouseenter","onMousemove"],te=["href","target"],ie=["id"],ne=["id"];function se(t,e,i,s,r,n){var o=P("AngleRightIcon"),I=P("TieredMenuSub",!0),u=H("ripple");return d(),y(T,l({name:"p-tieredmenu",onEnter:n.onEnter},t.ptm("menu.transition")),{default:g(function(){return[i.level===0||i.visible?(d(),p("ul",l({key:0,ref:n.containerRef,class:i.level===0?t.cx("menu"):t.cx("submenu"),tabindex:i.tabindex},i.level===0?t.ptm("menu"):t.ptm("submenu")),[(d(!0),p(C,null,U(i.items,function(a,c){return d(),p(C,{key:n.getItemKey(a)},[n.isItemVisible(a)&&!n.getItemProp(a,"separator")?(d(),p("li",l({key:0,id:n.getItemId(a),style:n.getItemProp(a,"style"),class:[t.cx("menuitem",{processedItem:a}),n.getItemProp(a,"class")],role:"menuitem","aria-label":n.getItemLabel(a),"aria-disabled":n.isItemDisabled(a)||void 0,"aria-expanded":n.isItemGroup(a)?n.isItemActive(a):void 0,"aria-haspopup":n.isItemGroup(a)&&!n.getItemProp(a,"to")?"menu":void 0,"aria-level":i.level+1,"aria-setsize":n.getAriaSetSize(),"aria-posinset":n.getAriaPosInset(c)},n.getPTOptions(a,c,"menuitem"),{"data-p-highlight":n.isItemActive(a),"data-p-focused":n.isItemFocused(a),"data-p-disabled":n.isItemDisabled(a)}),[E("div",l({class:t.cx("content"),onClick:function(b){return n.onItemClick(b,a)},onMouseenter:function(b){return n.onItemMouseEnter(b,a)},onMousemove:function(b){return n.onItemMouseMove(b,a)}},n.getPTOptions(a,c,"content")),[i.templates.item?(d(),y(S(i.templates.item),{key:1,item:a.item,hasSubmenu:n.getItemProp(a,"items"),label:n.getItemLabel(a),props:n.getMenuItemProps(a,c)},null,8,["item","hasSubmenu","label","props"])):W((d(),p("a",l({key:0,href:n.getItemProp(a,"url"),class:t.cx("action"),target:n.getItemProp(a,"target"),tabindex:"-1","aria-hidden":"true"},n.getPTOptions(a,c,"action")),[i.templates.itemicon?(d(),y(S(i.templates.itemicon),{key:0,item:a.item,class:K(t.cx("icon"))},null,8,["item","class"])):n.getItemProp(a,"icon")?(d(),p("span",l({key:1,class:[t.cx("icon"),n.getItemProp(a,"icon")]},n.getPTOptions(a,c,"icon")),null,16)):v("",!0),E("span",l({id:n.getItemLabelId(a),class:t.cx("label")},n.getPTOptions(a,c,"label")),j(n.getItemLabel(a)),17,ie),n.getItemProp(a,"items")?(d(),p(C,{key:2},[i.templates.submenuicon?(d(),y(S(i.templates.submenuicon),l({key:0,class:t.cx("submenuIcon"),active:n.isItemActive(a)},n.getPTOptions(a,c,"submenuIcon")),null,16,["class","active"])):(d(),y(o,l({key:1,class:t.cx("submenuIcon")},n.getPTOptions(a,c,"submenuIcon")),null,16,["class"]))],64)):v("",!0)],16,te)),[[u]])],16,ee),n.isItemVisible(a)&&n.isItemGroup(a)?(d(),y(I,{key:0,id:n.getItemId(a)+"_list",style:q(t.sx("submenu",!0,{processedItem:a})),"aria-labelledby":n.getItemLabelId(a),role:"menu",menuId:i.menuId,focusedItemId:i.focusedItemId,items:a.items,templates:i.templates,activeItemPath:i.activeItemPath,level:i.level+1,visible:n.isItemActive(a)&&n.isItemGroup(a),pt:t.pt,unstyled:t.unstyled,onItemClick:e[0]||(e[0]=function(f){return t.$emit("item-click",f)}),onItemMouseenter:e[1]||(e[1]=function(f){return t.$emit("item-mouseenter",f)}),onItemMousemove:e[2]||(e[2]=function(f){return t.$emit("item-mousemove",f)})},null,8,["id","style","aria-labelledby","menuId","focusedItemId","items","templates","activeItemPath","level","visible","pt","unstyled"])):v("",!0)],16,$)):v("",!0),n.isItemVisible(a)&&n.getItemProp(a,"separator")?(d(),p("li",l({key:1,id:n.getItemId(a),style:n.getItemProp(a,"style"),class:[t.cx("separator"),n.getItemProp(a,"class")],role:"separator"},t.ptm("separator")),null,16,ne)):v("",!0)],64)}),128))],16,_)):v("",!0)]}),_:1},16,["onEnter"])}B.render=se;var V={name:"TieredMenu",extends:Y,inheritAttrs:!1,emits:["focus","blur","before-show","before-hide","hide","show"],outsideClickListener:null,scrollHandler:null,resizeListener:null,target:null,container:null,menubar:null,searchTimeout:null,searchValue:null,data:function(){return{id:this.$attrs.id,focused:!1,focusedItemInfo:{index:-1,level:0,parentKey:""},activeItemPath:[],visible:!this.popup,submenuVisible:!1,dirty:!1}},watch:{"$attrs.id":function(e){this.id=e||w()},activeItemPath:function(e){this.popup||(h.isNotEmpty(e)?(this.bindOutsideClickListener(),this.bindResizeListener()):(this.unbindOutsideClickListener(),this.unbindResizeListener()))}},mounted:function(){this.id=this.id||w()},beforeUnmount:function(){this.unbindOutsideClickListener(),this.unbindResizeListener(),this.scrollHandler&&(this.scrollHandler.destroy(),this.scrollHandler=null),this.container&&this.autoZIndex&&x.clear(this.container),this.target=null,this.container=null},methods:{getItemProp:function(e,i){return e?h.getItemValue(e[i]):void 0},getItemLabel:function(e){return this.getItemProp(e,"label")},isItemDisabled:function(e){return this.getItemProp(e,"disabled")},isItemVisible:function(e){return this.getItemProp(e,"visible")!==!1},isItemGroup:function(e){return h.isNotEmpty(this.getItemProp(e,"items"))},isItemSeparator:function(e){return this.getItemProp(e,"separator")},getProccessedItemLabel:function(e){return e?this.getItemLabel(e.item):void 0},isProccessedItemGroup:function(e){return e&&h.isNotEmpty(e.items)},toggle:function(e){this.visible?this.hide(e,!0):this.show(e)},show:function(e,i){this.popup&&(this.$emit("before-show"),this.visible=!0,this.target=this.target||e.currentTarget,this.relatedTarget=e.relatedTarget||null),i&&m.focus(this.menubar)},hide:function(e,i){this.popup&&(this.$emit("before-hide"),this.visible=!1),this.activeItemPath=[],this.focusedItemInfo={index:-1,level:0,parentKey:""},i&&m.focus(this.relatedTarget||this.target||this.menubar),this.dirty=!1},onFocus:function(e){this.focused=!0,this.popup||(this.focusedItemInfo=this.focusedItemInfo.index!==-1?this.focusedItemInfo:{index:this.findFirstFocusedItemIndex(),level:0,parentKey:""}),this.$emit("focus",e)},onBlur:function(e){this.focused=!1,this.focusedItemInfo={index:-1,level:0,parentKey:""},this.searchValue="",this.dirty=!1,this.$emit("blur",e)},onKeyDown:function(e){if(this.disabled){e.preventDefault();return}var i=e.metaKey||e.ctrlKey;switch(e.code){case"ArrowDown":this.onArrowDownKey(e);break;case"ArrowUp":this.onArrowUpKey(e);break;case"ArrowLeft":this.onArrowLeftKey(e);break;case"ArrowRight":this.onArrowRightKey(e);break;case"Home":this.onHomeKey(e);break;case"End":this.onEndKey(e);break;case"Space":this.onSpaceKey(e);break;case"Enter":case"NumpadEnter":this.onEnterKey(e);break;case"Escape":this.onEscapeKey(e);break;case"Tab":this.onTabKey(e);break;case"PageDown":case"PageUp":case"Backspace":case"ShiftLeft":case"ShiftRight":break;default:!i&&h.isPrintableCharacter(e.key)&&this.searchItems(e,e.key);break}},onItemChange:function(e){var i=e.processedItem,s=e.isFocus;if(!h.isEmpty(i)){var r=i.index,n=i.key,o=i.level,I=i.parentKey,u=i.items,a=h.isNotEmpty(u),c=this.activeItemPath.filter(function(f){return f.parentKey!==I&&f.parentKey!==n});a&&(c.push(i),this.submenuVisible=!0),this.focusedItemInfo={index:r,level:o,parentKey:I},this.activeItemPath=c,a&&(this.dirty=!0),s&&m.focus(this.menubar)}},onOverlayClick:function(e){N.emit("overlay-click",{originalEvent:e,target:this.target})},onItemClick:function(e){var i=e.originalEvent,s=e.processedItem,r=this.isProccessedItemGroup(s),n=h.isEmpty(s.parent),o=this.isSelected(s);if(o){var I=s.index,u=s.key,a=s.level,c=s.parentKey;this.activeItemPath=this.activeItemPath.filter(function(b){return u!==b.key&&u.startsWith(b.key)}),this.focusedItemInfo={index:I,level:a,parentKey:c},this.dirty=!n,m.focus(this.menubar)}else if(r)this.onItemChange(e);else{var f=n?s:this.activeItemPath.find(function(b){return b.parentKey===""});this.hide(i),this.changeFocusedItemIndex(i,f?f.index:-1),m.focus(this.menubar)}},onItemMouseEnter:function(e){this.dirty&&this.onItemChange(e)},onItemMouseMove:function(e){this.focused&&this.changeFocusedItemIndex(e,e.processedItem.index)},onArrowDownKey:function(e){var i=this.focusedItemInfo.index!==-1?this.findNextItemIndex(this.focusedItemInfo.index):this.findFirstFocusedItemIndex();this.changeFocusedItemIndex(e,i),e.preventDefault()},onArrowUpKey:function(e){if(e.altKey){if(this.focusedItemInfo.index!==-1){var i=this.visibleItems[this.focusedItemInfo.index],s=this.isProccessedItemGroup(i);!s&&this.onItemChange({originalEvent:e,processedItem:i})}this.popup&&this.hide(e,!0),e.preventDefault()}else{var r=this.focusedItemInfo.index!==-1?this.findPrevItemIndex(this.focusedItemInfo.index):this.findLastFocusedItemIndex();this.changeFocusedItemIndex(e,r),e.preventDefault()}},onArrowLeftKey:function(e){var i=this,s=this.visibleItems[this.focusedItemInfo.index],r=this.activeItemPath.find(function(o){return o.key===s.parentKey}),n=h.isEmpty(s.parent);n||(this.focusedItemInfo={index:-1,parentKey:r?r.parentKey:""},this.searchValue="",this.onArrowDownKey(e)),this.activeItemPath=this.activeItemPath.filter(function(o){return o.parentKey!==i.focusedItemInfo.parentKey}),e.preventDefault()},onArrowRightKey:function(e){var i=this.visibleItems[this.focusedItemInfo.index],s=this.isProccessedItemGroup(i);s&&(this.onItemChange({originalEvent:e,processedItem:i}),this.focusedItemInfo={index:-1,parentKey:i.key},this.searchValue="",this.onArrowDownKey(e)),e.preventDefault()},onHomeKey:function(e){this.changeFocusedItemIndex(e,this.findFirstItemIndex()),e.preventDefault()},onEndKey:function(e){this.changeFocusedItemIndex(e,this.findLastItemIndex()),e.preventDefault()},onEnterKey:function(e){if(this.focusedItemInfo.index!==-1){var i=m.findSingle(this.menubar,'li[id="'.concat("".concat(this.focusedItemId),'"]')),s=i&&m.findSingle(i,'[data-pc-section="action"]');if(s?s.click():i&&i.click(),!this.popup){var r=this.visibleItems[this.focusedItemInfo.index],n=this.isProccessedItemGroup(r);!n&&(this.focusedItemInfo.index=this.findFirstFocusedItemIndex())}}e.preventDefault()},onSpaceKey:function(e){this.onEnterKey(e)},onEscapeKey:function(e){if(this.popup||this.focusedItemInfo.level!==0){var i=this.focusedItemInfo;this.hide(e,!1),this.focusedItemInfo={index:Number(i.parentKey.split("_")[0]),level:0,parentKey:""},this.popup&&m.focus(this.target)}e.preventDefault()},onTabKey:function(e){if(this.focusedItemInfo.index!==-1){var i=this.visibleItems[this.focusedItemInfo.index],s=this.isProccessedItemGroup(i);!s&&this.onItemChange({originalEvent:e,processedItem:i})}this.hide()},onEnter:function(e){this.autoZIndex&&x.set("menu",e,this.baseZIndex+this.$primevue.config.zIndex.menu),m.addStyles(e,{position:"absolute",top:"0",left:"0"}),this.alignOverlay(),m.focus(this.menubar),this.scrollInView()},onAfterEnter:function(){this.bindOutsideClickListener(),this.bindScrollListener(),this.bindResizeListener(),this.$emit("show")},onLeave:function(){this.unbindOutsideClickListener(),this.unbindScrollListener(),this.unbindResizeListener(),this.$emit("hide"),this.container=null,this.dirty=!1},onAfterLeave:function(e){this.autoZIndex&&x.clear(e)},alignOverlay:function(){m.absolutePosition(this.container,this.target);var e=m.getOuterWidth(this.target);e>m.getOuterWidth(this.container)&&(this.container.style.minWidth=m.getOuterWidth(this.target)+"px")},bindOutsideClickListener:function(){var e=this;this.outsideClickListener||(this.outsideClickListener=function(i){var s=e.container&&!e.container.contains(i.target),r=e.popup?!(e.target&&(e.target===i.target||e.target.contains(i.target))):!0;s&&r&&e.hide()},document.addEventListener("click",this.outsideClickListener))},unbindOutsideClickListener:function(){this.outsideClickListener&&(document.removeEventListener("click",this.outsideClickListener),this.outsideClickListener=null)},bindScrollListener:function(){var e=this;this.scrollHandler||(this.scrollHandler=new R(this.target,function(i){e.hide(i,!0)})),this.scrollHandler.bindScrollListener()},unbindScrollListener:function(){this.scrollHandler&&this.scrollHandler.unbindScrollListener()},bindResizeListener:function(){var e=this;this.resizeListener||(this.resizeListener=function(i){m.isTouchDevice()||e.hide(i,!0)},window.addEventListener("resize",this.resizeListener))},unbindResizeListener:function(){this.resizeListener&&(window.removeEventListener("resize",this.resizeListener),this.resizeListener=null)},isItemMatched:function(e){var i;return this.isValidItem(e)&&((i=this.getProccessedItemLabel(e))===null||i===void 0?void 0:i.toLocaleLowerCase().startsWith(this.searchValue.toLocaleLowerCase()))},isValidItem:function(e){return!!e&&!this.isItemDisabled(e.item)&&!this.isItemSeparator(e.item)&&this.isItemVisible(e.item)},isValidSelectedItem:function(e){return this.isValidItem(e)&&this.isSelected(e)},isSelected:function(e){return this.activeItemPath.some(function(i){return i.key===e.key})},findFirstItemIndex:function(){var e=this;return this.visibleItems.findIndex(function(i){return e.isValidItem(i)})},findLastItemIndex:function(){var e=this;return h.findLastIndex(this.visibleItems,function(i){return e.isValidItem(i)})},findNextItemIndex:function(e){var i=this,s=e-1?s+e+1:e},findPrevItemIndex:function(e){var i=this,s=e>0?h.findLastIndex(this.visibleItems.slice(0,e),function(r){return i.isValidItem(r)}):-1;return s>-1?s:e},findSelectedItemIndex:function(){var e=this;return this.visibleItems.findIndex(function(i){return e.isValidSelectedItem(i)})},findFirstFocusedItemIndex:function(){var e=this.findSelectedItemIndex();return e<0?this.findFirstItemIndex():e},findLastFocusedItemIndex:function(){var e=this.findSelectedItemIndex();return e<0?this.findLastItemIndex():e},searchItems:function(e,i){var s=this;this.searchValue=(this.searchValue||"")+i;var r=-1,n=!1;return this.focusedItemInfo.index!==-1?(r=this.visibleItems.slice(this.focusedItemInfo.index).findIndex(function(o){return s.isItemMatched(o)}),r=r===-1?this.visibleItems.slice(0,this.focusedItemInfo.index).findIndex(function(o){return s.isItemMatched(o)}):r+this.focusedItemInfo.index):r=this.visibleItems.findIndex(function(o){return s.isItemMatched(o)}),r!==-1&&(n=!0),r===-1&&this.focusedItemInfo.index===-1&&(r=this.findFirstFocusedItemIndex()),r!==-1&&this.changeFocusedItemIndex(e,r),this.searchTimeout&&clearTimeout(this.searchTimeout),this.searchTimeout=setTimeout(function(){s.searchValue="",s.searchTimeout=null},500),n},changeFocusedItemIndex:function(e,i){this.focusedItemInfo.index!==i&&(this.focusedItemInfo.index=i,this.scrollInView())},scrollInView:function(){var e=arguments.length>0&&arguments[0]!==void 0?arguments[0]:-1,i=e!==-1?"".concat(this.id,"_").concat(e):this.focusedItemId,s=m.findSingle(this.menubar,'li[id="'.concat(i,'"]'));s&&s.scrollIntoView&&s.scrollIntoView({block:"nearest",inline:"start"})},createProcessedItems:function(e){var i=this,s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:0,r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=arguments.length>3&&arguments[3]!==void 0?arguments[3]:"",o=[];return e&&e.forEach(function(I,u){var a=(n!==""?n+"_":"")+u,c={item:I,index:u,level:s,key:a,parent:r,parentKey:n};c.items=i.createProcessedItems(I.items,s+1,c,a),o.push(c)}),o},containerRef:function(e){this.container=e},menubarRef:function(e){this.menubar=e?e.$el:void 0}},computed:{processedItems:function(){return this.createProcessedItems(this.model||[])},visibleItems:function(){var e=this,i=this.activeItemPath.find(function(s){return s.key===e.focusedItemInfo.parentKey});return i?i.items:this.processedItems},focusedItemId:function(){return this.focusedItemInfo.index!==-1?"".concat(this.id).concat(h.isNotEmpty(this.focusedItemInfo.parentKey)?"_"+this.focusedItemInfo.parentKey:"","_").concat(this.focusedItemInfo.index):null}},components:{TieredMenuSub:B,Portal:F}},ae=["id"];function re(t,e,i,s,r,n){var o=P("TieredMenuSub"),I=P("Portal");return d(),y(I,{appendTo:t.appendTo,disabled:!t.popup},{default:g(function(){return[L(T,l({name:"p-connected-overlay",onEnter:n.onEnter,onAfterEnter:n.onAfterEnter,onLeave:n.onLeave,onAfterLeave:n.onAfterLeave},t.ptm("transition")),{default:g(function(){return[r.visible?(d(),p("div",l({key:0,ref:n.containerRef,id:r.id,class:t.cx("root"),onClick:e[0]||(e[0]=function(){return n.onOverlayClick&&n.onOverlayClick.apply(n,arguments)})},t.ptmi("root")),[t.$slots.start?(d(),p("div",l({key:0,class:t.cx("start")},t.ptm("start")),[k(t.$slots,"start")],16)):v("",!0),L(o,{ref:n.menubarRef,id:r.id+"_list",tabindex:t.disabled?-1:t.tabindex,role:"menubar","aria-label":t.ariaLabel,"aria-labelledby":t.ariaLabelledby,"aria-disabled":t.disabled||void 0,"aria-orientation":"vertical","aria-activedescendant":r.focused?n.focusedItemId:void 0,menuId:r.id,focusedItemId:r.focused?n.focusedItemId:void 0,items:n.processedItems,templates:t.$slots,activeItemPath:r.activeItemPath,level:0,visible:r.submenuVisible,pt:t.pt,unstyled:t.unstyled,onFocus:n.onFocus,onBlur:n.onBlur,onKeydown:n.onKeyDown,onItemClick:n.onItemClick,onItemMouseenter:n.onItemMouseEnter,onItemMousemove:n.onItemMouseMove},null,8,["id","tabindex","aria-label","aria-labelledby","aria-disabled","aria-activedescendant","menuId","focusedItemId","items","templates","activeItemPath","visible","pt","unstyled","onFocus","onBlur","onKeydown","onItemClick","onItemMouseenter","onItemMousemove"]),t.$slots.end?(d(),p("div",l({key:1,class:t.cx("end")},t.ptm("end")),[k(t.$slots,"end")],16)):v("",!0)],16,ae)):v("",!0)]}),_:3},16,["onEnter","onAfterEnter","onLeave","onAfterLeave"])]}),_:3},8,["appendTo","disabled"])}V.render=re;var oe={root:function(e){var i=e.props;return["p-splitbutton p-component",{"p-button-raised":i.raised,"p-button-rounded":i.rounded,"p-button-text":i.text,"p-button-outlined":i.outlined,"p-button-sm":i.size==="small","p-button-lg":i.size==="large"}]},button:"p-splitbutton-defaultbutton",menuButton:"p-splitbutton-menubutton"},ue=M.extend({name:"splitbutton",classes:oe}),le={name:"BaseSplitButton",extends:A,props:{label:{type:String,default:null},icon:{type:String,default:null},model:{type:Array,default:null},autoZIndex:{type:Boolean,default:!0},baseZIndex:{type:Number,default:0},appendTo:{type:[String,Object],default:"body"},disabled:{type:Boolean,default:!1},class:{type:null,default:null},style:{type:null,default:null},buttonProps:{type:null,default:null},menuButtonProps:{type:null,default:null},menuButtonIcon:{type:String,default:void 0},severity:{type:String,default:null},raised:{type:Boolean,default:!1},rounded:{type:Boolean,default:!1},text:{type:Boolean,default:!1},outlined:{type:Boolean,default:!1},size:{type:String,default:null},plain:{type:Boolean,default:!1}},style:ue,provide:function(){return{$parentInstance:this}}},de={name:"SplitButton",extends:le,inheritAttrs:!1,emits:["click"],data:function(){return{id:this.$attrs.id,isExpanded:!1}},watch:{"$attrs.id":function(e){this.id=e||w()}},mounted:function(){var e=this;this.id=this.id||w(),this.$watch("$refs.menu.visible",function(i){e.isExpanded=i})},methods:{onDropdownButtonClick:function(e){e&&e.preventDefault(),this.$refs.menu.toggle({currentTarget:this.$el,relatedTarget:this.$refs.button.$el}),this.isExpanded=this.$refs.menu.visible},onDropdownKeydown:function(e){(e.code==="ArrowDown"||e.code==="ArrowUp")&&(this.onDropdownButtonClick(),e.preventDefault())},onDefaultButtonClick:function(e){this.isExpanded&&this.$refs.menu.hide(e),this.$emit("click",e)}},computed:{containerClass:function(){return[this.cx("root"),this.class]}},components:{PVSButton:G,PVSMenu:V,ChevronDownIcon:Z}},ce=["data-p-severity"];function me(t,e,i,s,r,n){var o=P("PVSButton"),I=P("PVSMenu");return d(),p("div",l({class:n.containerClass,style:t.style},t.ptmi("root"),{"data-p-severity":t.severity}),[L(o,l({type:"button",class:t.cx("button"),label:t.label,icon:t.icon,disabled:t.disabled,severity:t.severity,text:t.text,outlined:t.outlined,size:t.size,"aria-label":t.label,onClick:n.onDefaultButtonClick},t.buttonProps,{pt:t.ptm("button"),unstyled:t.unstyled}),D({default:g(function(){return[k(t.$slots,"default")]}),_:2},[t.$slots.icon?{name:"icon",fn:g(function(u){return[k(t.$slots,"icon",{class:K(u.class)},function(){return[E("span",l({class:[t.icon,u.class]},t.ptm("button").icon,{"data-pc-section":"buttonicon"}),null,16)]})]}),key:"0"}:void 0]),1040,["class","label","icon","disabled","severity","text","outlined","size","aria-label","onClick","pt","unstyled"]),L(o,l({ref:"button",type:"button",class:t.cx("menuButton"),disabled:t.disabled,"aria-haspopup":"true","aria-expanded":r.isExpanded,"aria-controls":r.id+"_overlay",onClick:n.onDropdownButtonClick,onKeydown:n.onDropdownKeydown,severity:t.severity,text:t.text,outlined:t.outlined,size:t.size},t.menuButtonProps,{pt:t.ptm("menuButton"),unstyled:t.unstyled}),{icon:g(function(u){return[k(t.$slots,"menubuttonicon",{class:K(u.class)},function(){return[(d(),y(S(t.menuButtonIcon?"span":"ChevronDownIcon"),l({class:[t.menuButtonIcon,u.class]},t.ptm("menuButton").icon,{"data-pc-section":"menubuttonicon"}),null,16,["class"]))]})]}),_:3},16,["class","disabled","aria-expanded","aria-controls","onClick","onKeydown","severity","text","outlined","size","pt","unstyled"]),L(I,{ref:"menu",id:r.id+"_overlay",model:t.model,popup:!0,autoZIndex:t.autoZIndex,baseZIndex:t.baseZIndex,appendTo:t.appendTo,unstyled:t.unstyled,pt:t.ptm("menu")},D({_:2},[t.$slots.menuitemicon?{name:"itemicon",fn:g(function(u){return[k(t.$slots,"menuitemicon",{item:u.item,class:K(u.class)})]}),key:"0"}:void 0,t.$slots.item?{name:"item",fn:g(function(u){return[k(t.$slots,"item",{item:u.item,hasSubmenu:u.hasSubmenu,label:u.label,props:u.props})]}),key:"1"}:void 0]),1032,["id","model","autoZIndex","baseZIndex","appendTo","unstyled","pt"])],16,ce)}de.render=me;export{de as s}; -//# sourceMappingURL=splitbutton.esm.DvALhxoC.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/splitbutton.esm.DvALhxoC.js.map b/deploy-package-20260223-151231/frontend/assets/splitbutton.esm.DvALhxoC.js.map deleted file mode 100644 index 99f760b..0000000 --- a/deploy-package-20260223-151231/frontend/assets/splitbutton.esm.DvALhxoC.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"splitbutton.esm.DvALhxoC.js","sources":["../../node_modules/primevue/tieredmenu/style/tieredmenustyle.esm.js","../../node_modules/primevue/tieredmenu/tieredmenu.esm.js","../../node_modules/primevue/splitbutton/style/splitbuttonstyle.esm.js","../../node_modules/primevue/splitbutton/splitbutton.esm.js"],"sourcesContent":["import BaseStyle from 'primevue/base/style';\n\nvar inlineStyles = {\n submenu: function submenu(_ref) {\n var instance = _ref.instance,\n processedItem = _ref.processedItem;\n return {\n display: instance.isItemActive(processedItem) ? 'block' : 'none'\n };\n }\n};\nvar classes = {\n root: function root(_ref2) {\n var instance = _ref2.instance,\n props = _ref2.props;\n return ['p-tieredmenu p-component', {\n 'p-tieredmenu-overlay': props.popup,\n 'p-ripple-disabled': instance.$primevue.config.ripple === false\n }];\n },\n start: 'p-tieredmenu-start',\n menu: 'p-tieredmenu-root-list',\n menuitem: function menuitem(_ref3) {\n var instance = _ref3.instance,\n processedItem = _ref3.processedItem;\n return ['p-menuitem', {\n 'p-menuitem-active p-highlight': instance.isItemActive(processedItem),\n 'p-focus': instance.isItemFocused(processedItem),\n 'p-disabled': instance.isItemDisabled(processedItem)\n }];\n },\n content: 'p-menuitem-content',\n action: 'p-menuitem-link',\n icon: 'p-menuitem-icon',\n text: 'p-menuitem-text',\n submenuIcon: 'p-submenu-icon',\n submenu: 'p-submenu-list',\n separator: 'p-menuitem-separator',\n end: 'p-tieredmenu-end'\n};\nvar TieredMenuStyle = BaseStyle.extend({\n name: 'tieredmenu',\n classes: classes,\n inlineStyles: inlineStyles\n});\n\nexport { TieredMenuStyle as default };\n","import OverlayEventBus from 'primevue/overlayeventbus';\nimport Portal from 'primevue/portal';\nimport { ObjectUtils, DomHandler, UniqueComponentId, ZIndexUtils, ConnectedOverlayScrollHandler } from 'primevue/utils';\nimport BaseComponent from 'primevue/basecomponent';\nimport TieredMenuStyle from 'primevue/tieredmenu/style';\nimport AngleRightIcon from 'primevue/icons/angleright';\nimport Ripple from 'primevue/ripple';\nimport { mergeProps, resolveComponent, resolveDirective, openBlock, createBlock, Transition, withCtx, createElementBlock, Fragment, renderList, createElementVNode, withDirectives, resolveDynamicComponent, normalizeClass, createCommentVNode, toDisplayString, normalizeStyle, createVNode, renderSlot } from 'vue';\n\nvar script$2 = {\n name: 'BaseTieredMenu',\n \"extends\": BaseComponent,\n props: {\n popup: {\n type: Boolean,\n \"default\": false\n },\n model: {\n type: Array,\n \"default\": null\n },\n appendTo: {\n type: [String, Object],\n \"default\": 'body'\n },\n autoZIndex: {\n type: Boolean,\n \"default\": true\n },\n baseZIndex: {\n type: Number,\n \"default\": 0\n },\n disabled: {\n type: Boolean,\n \"default\": false\n },\n tabindex: {\n type: Number,\n \"default\": 0\n },\n ariaLabelledby: {\n type: String,\n \"default\": null\n },\n ariaLabel: {\n type: String,\n \"default\": null\n }\n },\n style: TieredMenuStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script$1 = {\n name: 'TieredMenuSub',\n hostName: 'TieredMenu',\n \"extends\": BaseComponent,\n emits: ['item-click', 'item-mouseenter', 'item-mousemove'],\n container: null,\n props: {\n menuId: {\n type: String,\n \"default\": null\n },\n focusedItemId: {\n type: String,\n \"default\": null\n },\n items: {\n type: Array,\n \"default\": null\n },\n visible: {\n type: Boolean,\n \"default\": false\n },\n level: {\n type: Number,\n \"default\": 0\n },\n templates: {\n type: Object,\n \"default\": null\n },\n activeItemPath: {\n type: Object,\n \"default\": null\n },\n tabindex: {\n type: Number,\n \"default\": 0\n }\n },\n methods: {\n getItemId: function getItemId(processedItem) {\n return \"\".concat(this.menuId, \"_\").concat(processedItem.key);\n },\n getItemKey: function getItemKey(processedItem) {\n return this.getItemId(processedItem);\n },\n getItemProp: function getItemProp(processedItem, name, params) {\n return processedItem && processedItem.item ? ObjectUtils.getItemValue(processedItem.item[name], params) : undefined;\n },\n getItemLabel: function getItemLabel(processedItem) {\n return this.getItemProp(processedItem, 'label');\n },\n getItemLabelId: function getItemLabelId(processedItem) {\n return \"\".concat(this.menuId, \"_\").concat(processedItem.key, \"_label\");\n },\n getPTOptions: function getPTOptions(processedItem, index, key) {\n return this.ptm(key, {\n context: {\n item: processedItem,\n index: index,\n active: this.isItemActive(processedItem),\n focused: this.isItemFocused(processedItem),\n disabled: this.isItemDisabled(processedItem)\n }\n });\n },\n isItemActive: function isItemActive(processedItem) {\n return this.activeItemPath.some(function (path) {\n return path.key === processedItem.key;\n });\n },\n isItemVisible: function isItemVisible(processedItem) {\n return this.getItemProp(processedItem, 'visible') !== false;\n },\n isItemDisabled: function isItemDisabled(processedItem) {\n return this.getItemProp(processedItem, 'disabled');\n },\n isItemFocused: function isItemFocused(processedItem) {\n return this.focusedItemId === this.getItemId(processedItem);\n },\n isItemGroup: function isItemGroup(processedItem) {\n return ObjectUtils.isNotEmpty(processedItem.items);\n },\n onEnter: function onEnter() {\n DomHandler.nestedPosition(this.container, this.level);\n },\n onItemClick: function onItemClick(event, processedItem) {\n this.getItemProp(processedItem, 'command', {\n originalEvent: event,\n item: processedItem.item\n });\n this.$emit('item-click', {\n originalEvent: event,\n processedItem: processedItem,\n isFocus: true\n });\n },\n onItemMouseEnter: function onItemMouseEnter(event, processedItem) {\n this.$emit('item-mouseenter', {\n originalEvent: event,\n processedItem: processedItem\n });\n },\n onItemMouseMove: function onItemMouseMove(event, processedItem) {\n this.$emit('item-mousemove', {\n originalEvent: event,\n processedItem: processedItem\n });\n },\n getAriaSetSize: function getAriaSetSize() {\n var _this = this;\n return this.items.filter(function (processedItem) {\n return _this.isItemVisible(processedItem) && !_this.getItemProp(processedItem, 'separator');\n }).length;\n },\n getAriaPosInset: function getAriaPosInset(index) {\n var _this2 = this;\n return index - this.items.slice(0, index).filter(function (processedItem) {\n return _this2.isItemVisible(processedItem) && _this2.getItemProp(processedItem, 'separator');\n }).length + 1;\n },\n getMenuItemProps: function getMenuItemProps(processedItem, index) {\n return {\n action: mergeProps({\n \"class\": this.cx('action'),\n tabindex: -1,\n 'aria-hidden': true\n }, this.getPTOptions(processedItem, index, 'action')),\n icon: mergeProps({\n \"class\": [this.cx('icon'), this.getItemProp(processedItem, 'icon')]\n }, this.getPTOptions(processedItem, index, 'icon')),\n label: mergeProps({\n \"class\": this.cx('label')\n }, this.getPTOptions(processedItem, index, 'label')),\n submenuicon: mergeProps({\n \"class\": this.cx('submenuIcon')\n }, this.getPTOptions(processedItem, index, 'submenuIcon'))\n };\n },\n containerRef: function containerRef(el) {\n this.container = el;\n }\n },\n components: {\n AngleRightIcon: AngleRightIcon\n },\n directives: {\n ripple: Ripple\n }\n};\n\nvar _hoisted_1$1 = [\"tabindex\"];\nvar _hoisted_2 = [\"id\", \"aria-label\", \"aria-disabled\", \"aria-expanded\", \"aria-haspopup\", \"aria-level\", \"aria-setsize\", \"aria-posinset\", \"data-p-highlight\", \"data-p-focused\", \"data-p-disabled\"];\nvar _hoisted_3 = [\"onClick\", \"onMouseenter\", \"onMousemove\"];\nvar _hoisted_4 = [\"href\", \"target\"];\nvar _hoisted_5 = [\"id\"];\nvar _hoisted_6 = [\"id\"];\nfunction render$1(_ctx, _cache, $props, $setup, $data, $options) {\n var _component_AngleRightIcon = resolveComponent(\"AngleRightIcon\");\n var _component_TieredMenuSub = resolveComponent(\"TieredMenuSub\", true);\n var _directive_ripple = resolveDirective(\"ripple\");\n return openBlock(), createBlock(Transition, mergeProps({\n name: \"p-tieredmenu\",\n onEnter: $options.onEnter\n }, _ctx.ptm('menu.transition')), {\n \"default\": withCtx(function () {\n return [($props.level === 0 ? true : $props.visible) ? (openBlock(), createElementBlock(\"ul\", mergeProps({\n key: 0,\n ref: $options.containerRef,\n \"class\": $props.level === 0 ? _ctx.cx('menu') : _ctx.cx('submenu'),\n tabindex: $props.tabindex\n }, $props.level === 0 ? _ctx.ptm('menu') : _ctx.ptm('submenu')), [(openBlock(true), createElementBlock(Fragment, null, renderList($props.items, function (processedItem, index) {\n return openBlock(), createElementBlock(Fragment, {\n key: $options.getItemKey(processedItem)\n }, [$options.isItemVisible(processedItem) && !$options.getItemProp(processedItem, 'separator') ? (openBlock(), createElementBlock(\"li\", mergeProps({\n key: 0,\n id: $options.getItemId(processedItem),\n style: $options.getItemProp(processedItem, 'style'),\n \"class\": [_ctx.cx('menuitem', {\n processedItem: processedItem\n }), $options.getItemProp(processedItem, 'class')],\n role: \"menuitem\",\n \"aria-label\": $options.getItemLabel(processedItem),\n \"aria-disabled\": $options.isItemDisabled(processedItem) || undefined,\n \"aria-expanded\": $options.isItemGroup(processedItem) ? $options.isItemActive(processedItem) : undefined,\n \"aria-haspopup\": $options.isItemGroup(processedItem) && !$options.getItemProp(processedItem, 'to') ? 'menu' : undefined,\n \"aria-level\": $props.level + 1,\n \"aria-setsize\": $options.getAriaSetSize(),\n \"aria-posinset\": $options.getAriaPosInset(index)\n }, $options.getPTOptions(processedItem, index, 'menuitem'), {\n \"data-p-highlight\": $options.isItemActive(processedItem),\n \"data-p-focused\": $options.isItemFocused(processedItem),\n \"data-p-disabled\": $options.isItemDisabled(processedItem)\n }), [createElementVNode(\"div\", mergeProps({\n \"class\": _ctx.cx('content'),\n onClick: function onClick($event) {\n return $options.onItemClick($event, processedItem);\n },\n onMouseenter: function onMouseenter($event) {\n return $options.onItemMouseEnter($event, processedItem);\n },\n onMousemove: function onMousemove($event) {\n return $options.onItemMouseMove($event, processedItem);\n }\n }, $options.getPTOptions(processedItem, index, 'content')), [!$props.templates.item ? withDirectives((openBlock(), createElementBlock(\"a\", mergeProps({\n key: 0,\n href: $options.getItemProp(processedItem, 'url'),\n \"class\": _ctx.cx('action'),\n target: $options.getItemProp(processedItem, 'target'),\n tabindex: \"-1\",\n \"aria-hidden\": \"true\"\n }, $options.getPTOptions(processedItem, index, 'action')), [$props.templates.itemicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.itemicon), {\n key: 0,\n item: processedItem.item,\n \"class\": normalizeClass(_ctx.cx('icon'))\n }, null, 8, [\"item\", \"class\"])) : $options.getItemProp(processedItem, 'icon') ? (openBlock(), createElementBlock(\"span\", mergeProps({\n key: 1,\n \"class\": [_ctx.cx('icon'), $options.getItemProp(processedItem, 'icon')]\n }, $options.getPTOptions(processedItem, index, 'icon')), null, 16)) : createCommentVNode(\"\", true), createElementVNode(\"span\", mergeProps({\n id: $options.getItemLabelId(processedItem),\n \"class\": _ctx.cx('label')\n }, $options.getPTOptions(processedItem, index, 'label')), toDisplayString($options.getItemLabel(processedItem)), 17, _hoisted_5), $options.getItemProp(processedItem, 'items') ? (openBlock(), createElementBlock(Fragment, {\n key: 2\n }, [$props.templates.submenuicon ? (openBlock(), createBlock(resolveDynamicComponent($props.templates.submenuicon), mergeProps({\n key: 0,\n \"class\": _ctx.cx('submenuIcon'),\n active: $options.isItemActive(processedItem)\n }, $options.getPTOptions(processedItem, index, 'submenuIcon')), null, 16, [\"class\", \"active\"])) : (openBlock(), createBlock(_component_AngleRightIcon, mergeProps({\n key: 1,\n \"class\": _ctx.cx('submenuIcon')\n }, $options.getPTOptions(processedItem, index, 'submenuIcon')), null, 16, [\"class\"]))], 64)) : createCommentVNode(\"\", true)], 16, _hoisted_4)), [[_directive_ripple]]) : (openBlock(), createBlock(resolveDynamicComponent($props.templates.item), {\n key: 1,\n item: processedItem.item,\n hasSubmenu: $options.getItemProp(processedItem, 'items'),\n label: $options.getItemLabel(processedItem),\n props: $options.getMenuItemProps(processedItem, index)\n }, null, 8, [\"item\", \"hasSubmenu\", \"label\", \"props\"]))], 16, _hoisted_3), $options.isItemVisible(processedItem) && $options.isItemGroup(processedItem) ? (openBlock(), createBlock(_component_TieredMenuSub, {\n key: 0,\n id: $options.getItemId(processedItem) + '_list',\n style: normalizeStyle(_ctx.sx('submenu', true, {\n processedItem: processedItem\n })),\n \"aria-labelledby\": $options.getItemLabelId(processedItem),\n role: \"menu\",\n menuId: $props.menuId,\n focusedItemId: $props.focusedItemId,\n items: processedItem.items,\n templates: $props.templates,\n activeItemPath: $props.activeItemPath,\n level: $props.level + 1,\n visible: $options.isItemActive(processedItem) && $options.isItemGroup(processedItem),\n pt: _ctx.pt,\n unstyled: _ctx.unstyled,\n onItemClick: _cache[0] || (_cache[0] = function ($event) {\n return _ctx.$emit('item-click', $event);\n }),\n onItemMouseenter: _cache[1] || (_cache[1] = function ($event) {\n return _ctx.$emit('item-mouseenter', $event);\n }),\n onItemMousemove: _cache[2] || (_cache[2] = function ($event) {\n return _ctx.$emit('item-mousemove', $event);\n })\n }, null, 8, [\"id\", \"style\", \"aria-labelledby\", \"menuId\", \"focusedItemId\", \"items\", \"templates\", \"activeItemPath\", \"level\", \"visible\", \"pt\", \"unstyled\"])) : createCommentVNode(\"\", true)], 16, _hoisted_2)) : createCommentVNode(\"\", true), $options.isItemVisible(processedItem) && $options.getItemProp(processedItem, 'separator') ? (openBlock(), createElementBlock(\"li\", mergeProps({\n key: 1,\n id: $options.getItemId(processedItem),\n style: $options.getItemProp(processedItem, 'style'),\n \"class\": [_ctx.cx('separator'), $options.getItemProp(processedItem, 'class')],\n role: \"separator\"\n }, _ctx.ptm('separator')), null, 16, _hoisted_6)) : createCommentVNode(\"\", true)], 64);\n }), 128))], 16, _hoisted_1$1)) : createCommentVNode(\"\", true)];\n }),\n _: 1\n }, 16, [\"onEnter\"]);\n}\n\nscript$1.render = render$1;\n\nvar script = {\n name: 'TieredMenu',\n \"extends\": script$2,\n inheritAttrs: false,\n emits: ['focus', 'blur', 'before-show', 'before-hide', 'hide', 'show'],\n outsideClickListener: null,\n scrollHandler: null,\n resizeListener: null,\n target: null,\n container: null,\n menubar: null,\n searchTimeout: null,\n searchValue: null,\n data: function data() {\n return {\n id: this.$attrs.id,\n focused: false,\n focusedItemInfo: {\n index: -1,\n level: 0,\n parentKey: ''\n },\n activeItemPath: [],\n visible: !this.popup,\n submenuVisible: false,\n dirty: false\n };\n },\n watch: {\n '$attrs.id': function $attrsId(newValue) {\n this.id = newValue || UniqueComponentId();\n },\n activeItemPath: function activeItemPath(newPath) {\n if (!this.popup) {\n if (ObjectUtils.isNotEmpty(newPath)) {\n this.bindOutsideClickListener();\n this.bindResizeListener();\n } else {\n this.unbindOutsideClickListener();\n this.unbindResizeListener();\n }\n }\n }\n },\n mounted: function mounted() {\n this.id = this.id || UniqueComponentId();\n },\n beforeUnmount: function beforeUnmount() {\n this.unbindOutsideClickListener();\n this.unbindResizeListener();\n if (this.scrollHandler) {\n this.scrollHandler.destroy();\n this.scrollHandler = null;\n }\n if (this.container && this.autoZIndex) {\n ZIndexUtils.clear(this.container);\n }\n this.target = null;\n this.container = null;\n },\n methods: {\n getItemProp: function getItemProp(item, name) {\n return item ? ObjectUtils.getItemValue(item[name]) : undefined;\n },\n getItemLabel: function getItemLabel(item) {\n return this.getItemProp(item, 'label');\n },\n isItemDisabled: function isItemDisabled(item) {\n return this.getItemProp(item, 'disabled');\n },\n isItemVisible: function isItemVisible(item) {\n return this.getItemProp(item, 'visible') !== false;\n },\n isItemGroup: function isItemGroup(item) {\n return ObjectUtils.isNotEmpty(this.getItemProp(item, 'items'));\n },\n isItemSeparator: function isItemSeparator(item) {\n return this.getItemProp(item, 'separator');\n },\n getProccessedItemLabel: function getProccessedItemLabel(processedItem) {\n return processedItem ? this.getItemLabel(processedItem.item) : undefined;\n },\n isProccessedItemGroup: function isProccessedItemGroup(processedItem) {\n return processedItem && ObjectUtils.isNotEmpty(processedItem.items);\n },\n toggle: function toggle(event) {\n this.visible ? this.hide(event, true) : this.show(event);\n },\n show: function show(event, isFocus) {\n if (this.popup) {\n this.$emit('before-show');\n this.visible = true;\n this.target = this.target || event.currentTarget;\n this.relatedTarget = event.relatedTarget || null;\n }\n isFocus && DomHandler.focus(this.menubar);\n },\n hide: function hide(event, isFocus) {\n if (this.popup) {\n this.$emit('before-hide');\n this.visible = false;\n }\n this.activeItemPath = [];\n this.focusedItemInfo = {\n index: -1,\n level: 0,\n parentKey: ''\n };\n isFocus && DomHandler.focus(this.relatedTarget || this.target || this.menubar);\n this.dirty = false;\n },\n onFocus: function onFocus(event) {\n this.focused = true;\n if (!this.popup) {\n this.focusedItemInfo = this.focusedItemInfo.index !== -1 ? this.focusedItemInfo : {\n index: this.findFirstFocusedItemIndex(),\n level: 0,\n parentKey: ''\n };\n }\n this.$emit('focus', event);\n },\n onBlur: function onBlur(event) {\n this.focused = false;\n this.focusedItemInfo = {\n index: -1,\n level: 0,\n parentKey: ''\n };\n this.searchValue = '';\n this.dirty = false;\n this.$emit('blur', event);\n },\n onKeyDown: function onKeyDown(event) {\n if (this.disabled) {\n event.preventDefault();\n return;\n }\n var metaKey = event.metaKey || event.ctrlKey;\n switch (event.code) {\n case 'ArrowDown':\n this.onArrowDownKey(event);\n break;\n case 'ArrowUp':\n this.onArrowUpKey(event);\n break;\n case 'ArrowLeft':\n this.onArrowLeftKey(event);\n break;\n case 'ArrowRight':\n this.onArrowRightKey(event);\n break;\n case 'Home':\n this.onHomeKey(event);\n break;\n case 'End':\n this.onEndKey(event);\n break;\n case 'Space':\n this.onSpaceKey(event);\n break;\n case 'Enter':\n case 'NumpadEnter':\n this.onEnterKey(event);\n break;\n case 'Escape':\n this.onEscapeKey(event);\n break;\n case 'Tab':\n this.onTabKey(event);\n break;\n case 'PageDown':\n case 'PageUp':\n case 'Backspace':\n case 'ShiftLeft':\n case 'ShiftRight':\n //NOOP\n break;\n default:\n if (!metaKey && ObjectUtils.isPrintableCharacter(event.key)) {\n this.searchItems(event, event.key);\n }\n break;\n }\n },\n onItemChange: function onItemChange(event) {\n var processedItem = event.processedItem,\n isFocus = event.isFocus;\n if (ObjectUtils.isEmpty(processedItem)) return;\n var index = processedItem.index,\n key = processedItem.key,\n level = processedItem.level,\n parentKey = processedItem.parentKey,\n items = processedItem.items;\n var grouped = ObjectUtils.isNotEmpty(items);\n var activeItemPath = this.activeItemPath.filter(function (p) {\n return p.parentKey !== parentKey && p.parentKey !== key;\n });\n if (grouped) {\n activeItemPath.push(processedItem);\n this.submenuVisible = true;\n }\n this.focusedItemInfo = {\n index: index,\n level: level,\n parentKey: parentKey\n };\n this.activeItemPath = activeItemPath;\n grouped && (this.dirty = true);\n isFocus && DomHandler.focus(this.menubar);\n },\n onOverlayClick: function onOverlayClick(event) {\n OverlayEventBus.emit('overlay-click', {\n originalEvent: event,\n target: this.target\n });\n },\n onItemClick: function onItemClick(event) {\n var originalEvent = event.originalEvent,\n processedItem = event.processedItem;\n var grouped = this.isProccessedItemGroup(processedItem);\n var root = ObjectUtils.isEmpty(processedItem.parent);\n var selected = this.isSelected(processedItem);\n if (selected) {\n var index = processedItem.index,\n key = processedItem.key,\n level = processedItem.level,\n parentKey = processedItem.parentKey;\n this.activeItemPath = this.activeItemPath.filter(function (p) {\n return key !== p.key && key.startsWith(p.key);\n });\n this.focusedItemInfo = {\n index: index,\n level: level,\n parentKey: parentKey\n };\n this.dirty = !root;\n DomHandler.focus(this.menubar);\n } else {\n if (grouped) {\n this.onItemChange(event);\n } else {\n var rootProcessedItem = root ? processedItem : this.activeItemPath.find(function (p) {\n return p.parentKey === '';\n });\n this.hide(originalEvent);\n this.changeFocusedItemIndex(originalEvent, rootProcessedItem ? rootProcessedItem.index : -1);\n DomHandler.focus(this.menubar);\n }\n }\n },\n onItemMouseEnter: function onItemMouseEnter(event) {\n if (this.dirty) {\n this.onItemChange(event);\n }\n },\n onItemMouseMove: function onItemMouseMove(event) {\n if (this.focused) {\n this.changeFocusedItemIndex(event, event.processedItem.index);\n }\n },\n onArrowDownKey: function onArrowDownKey(event) {\n var itemIndex = this.focusedItemInfo.index !== -1 ? this.findNextItemIndex(this.focusedItemInfo.index) : this.findFirstFocusedItemIndex();\n this.changeFocusedItemIndex(event, itemIndex);\n event.preventDefault();\n },\n onArrowUpKey: function onArrowUpKey(event) {\n if (event.altKey) {\n if (this.focusedItemInfo.index !== -1) {\n var processedItem = this.visibleItems[this.focusedItemInfo.index];\n var grouped = this.isProccessedItemGroup(processedItem);\n !grouped && this.onItemChange({\n originalEvent: event,\n processedItem: processedItem\n });\n }\n this.popup && this.hide(event, true);\n event.preventDefault();\n } else {\n var itemIndex = this.focusedItemInfo.index !== -1 ? this.findPrevItemIndex(this.focusedItemInfo.index) : this.findLastFocusedItemIndex();\n this.changeFocusedItemIndex(event, itemIndex);\n event.preventDefault();\n }\n },\n onArrowLeftKey: function onArrowLeftKey(event) {\n var _this = this;\n var processedItem = this.visibleItems[this.focusedItemInfo.index];\n var parentItem = this.activeItemPath.find(function (p) {\n return p.key === processedItem.parentKey;\n });\n var root = ObjectUtils.isEmpty(processedItem.parent);\n if (!root) {\n this.focusedItemInfo = {\n index: -1,\n parentKey: parentItem ? parentItem.parentKey : ''\n };\n this.searchValue = '';\n this.onArrowDownKey(event);\n }\n this.activeItemPath = this.activeItemPath.filter(function (p) {\n return p.parentKey !== _this.focusedItemInfo.parentKey;\n });\n event.preventDefault();\n },\n onArrowRightKey: function onArrowRightKey(event) {\n var processedItem = this.visibleItems[this.focusedItemInfo.index];\n var grouped = this.isProccessedItemGroup(processedItem);\n if (grouped) {\n this.onItemChange({\n originalEvent: event,\n processedItem: processedItem\n });\n this.focusedItemInfo = {\n index: -1,\n parentKey: processedItem.key\n };\n this.searchValue = '';\n this.onArrowDownKey(event);\n }\n event.preventDefault();\n },\n onHomeKey: function onHomeKey(event) {\n this.changeFocusedItemIndex(event, this.findFirstItemIndex());\n event.preventDefault();\n },\n onEndKey: function onEndKey(event) {\n this.changeFocusedItemIndex(event, this.findLastItemIndex());\n event.preventDefault();\n },\n onEnterKey: function onEnterKey(event) {\n if (this.focusedItemInfo.index !== -1) {\n var element = DomHandler.findSingle(this.menubar, \"li[id=\\\"\".concat(\"\".concat(this.focusedItemId), \"\\\"]\"));\n var anchorElement = element && DomHandler.findSingle(element, '[data-pc-section=\"action\"]');\n anchorElement ? anchorElement.click() : element && element.click();\n if (!this.popup) {\n var processedItem = this.visibleItems[this.focusedItemInfo.index];\n var grouped = this.isProccessedItemGroup(processedItem);\n !grouped && (this.focusedItemInfo.index = this.findFirstFocusedItemIndex());\n }\n }\n event.preventDefault();\n },\n onSpaceKey: function onSpaceKey(event) {\n this.onEnterKey(event);\n },\n onEscapeKey: function onEscapeKey(event) {\n if (this.popup || this.focusedItemInfo.level !== 0) {\n var _focusedItemInfo = this.focusedItemInfo;\n this.hide(event, false);\n this.focusedItemInfo = {\n index: Number(_focusedItemInfo.parentKey.split('_')[0]),\n level: 0,\n parentKey: ''\n };\n this.popup && DomHandler.focus(this.target);\n }\n event.preventDefault();\n },\n onTabKey: function onTabKey(event) {\n if (this.focusedItemInfo.index !== -1) {\n var processedItem = this.visibleItems[this.focusedItemInfo.index];\n var grouped = this.isProccessedItemGroup(processedItem);\n !grouped && this.onItemChange({\n originalEvent: event,\n processedItem: processedItem\n });\n }\n this.hide();\n },\n onEnter: function onEnter(el) {\n if (this.autoZIndex) {\n ZIndexUtils.set('menu', el, this.baseZIndex + this.$primevue.config.zIndex.menu);\n }\n DomHandler.addStyles(el, {\n position: 'absolute',\n top: '0',\n left: '0'\n });\n this.alignOverlay();\n DomHandler.focus(this.menubar);\n this.scrollInView();\n },\n onAfterEnter: function onAfterEnter() {\n this.bindOutsideClickListener();\n this.bindScrollListener();\n this.bindResizeListener();\n this.$emit('show');\n },\n onLeave: function onLeave() {\n this.unbindOutsideClickListener();\n this.unbindScrollListener();\n this.unbindResizeListener();\n this.$emit('hide');\n this.container = null;\n this.dirty = false;\n },\n onAfterLeave: function onAfterLeave(el) {\n if (this.autoZIndex) {\n ZIndexUtils.clear(el);\n }\n },\n alignOverlay: function alignOverlay() {\n DomHandler.absolutePosition(this.container, this.target);\n var targetWidth = DomHandler.getOuterWidth(this.target);\n if (targetWidth > DomHandler.getOuterWidth(this.container)) {\n this.container.style.minWidth = DomHandler.getOuterWidth(this.target) + 'px';\n }\n },\n bindOutsideClickListener: function bindOutsideClickListener() {\n var _this2 = this;\n if (!this.outsideClickListener) {\n this.outsideClickListener = function (event) {\n var isOutsideContainer = _this2.container && !_this2.container.contains(event.target);\n var isOutsideTarget = _this2.popup ? !(_this2.target && (_this2.target === event.target || _this2.target.contains(event.target))) : true;\n if (isOutsideContainer && isOutsideTarget) {\n _this2.hide();\n }\n };\n document.addEventListener('click', this.outsideClickListener);\n }\n },\n unbindOutsideClickListener: function unbindOutsideClickListener() {\n if (this.outsideClickListener) {\n document.removeEventListener('click', this.outsideClickListener);\n this.outsideClickListener = null;\n }\n },\n bindScrollListener: function bindScrollListener() {\n var _this3 = this;\n if (!this.scrollHandler) {\n this.scrollHandler = new ConnectedOverlayScrollHandler(this.target, function (event) {\n _this3.hide(event, true);\n });\n }\n this.scrollHandler.bindScrollListener();\n },\n unbindScrollListener: function unbindScrollListener() {\n if (this.scrollHandler) {\n this.scrollHandler.unbindScrollListener();\n }\n },\n bindResizeListener: function bindResizeListener() {\n var _this4 = this;\n if (!this.resizeListener) {\n this.resizeListener = function (event) {\n if (!DomHandler.isTouchDevice()) {\n _this4.hide(event, true);\n }\n };\n window.addEventListener('resize', this.resizeListener);\n }\n },\n unbindResizeListener: function unbindResizeListener() {\n if (this.resizeListener) {\n window.removeEventListener('resize', this.resizeListener);\n this.resizeListener = null;\n }\n },\n isItemMatched: function isItemMatched(processedItem) {\n var _this$getProccessedIt;\n return this.isValidItem(processedItem) && ((_this$getProccessedIt = this.getProccessedItemLabel(processedItem)) === null || _this$getProccessedIt === void 0 ? void 0 : _this$getProccessedIt.toLocaleLowerCase().startsWith(this.searchValue.toLocaleLowerCase()));\n },\n isValidItem: function isValidItem(processedItem) {\n return !!processedItem && !this.isItemDisabled(processedItem.item) && !this.isItemSeparator(processedItem.item) && this.isItemVisible(processedItem.item);\n },\n isValidSelectedItem: function isValidSelectedItem(processedItem) {\n return this.isValidItem(processedItem) && this.isSelected(processedItem);\n },\n isSelected: function isSelected(processedItem) {\n return this.activeItemPath.some(function (p) {\n return p.key === processedItem.key;\n });\n },\n findFirstItemIndex: function findFirstItemIndex() {\n var _this5 = this;\n return this.visibleItems.findIndex(function (processedItem) {\n return _this5.isValidItem(processedItem);\n });\n },\n findLastItemIndex: function findLastItemIndex() {\n var _this6 = this;\n return ObjectUtils.findLastIndex(this.visibleItems, function (processedItem) {\n return _this6.isValidItem(processedItem);\n });\n },\n findNextItemIndex: function findNextItemIndex(index) {\n var _this7 = this;\n var matchedItemIndex = index < this.visibleItems.length - 1 ? this.visibleItems.slice(index + 1).findIndex(function (processedItem) {\n return _this7.isValidItem(processedItem);\n }) : -1;\n return matchedItemIndex > -1 ? matchedItemIndex + index + 1 : index;\n },\n findPrevItemIndex: function findPrevItemIndex(index) {\n var _this8 = this;\n var matchedItemIndex = index > 0 ? ObjectUtils.findLastIndex(this.visibleItems.slice(0, index), function (processedItem) {\n return _this8.isValidItem(processedItem);\n }) : -1;\n return matchedItemIndex > -1 ? matchedItemIndex : index;\n },\n findSelectedItemIndex: function findSelectedItemIndex() {\n var _this9 = this;\n return this.visibleItems.findIndex(function (processedItem) {\n return _this9.isValidSelectedItem(processedItem);\n });\n },\n findFirstFocusedItemIndex: function findFirstFocusedItemIndex() {\n var selectedIndex = this.findSelectedItemIndex();\n return selectedIndex < 0 ? this.findFirstItemIndex() : selectedIndex;\n },\n findLastFocusedItemIndex: function findLastFocusedItemIndex() {\n var selectedIndex = this.findSelectedItemIndex();\n return selectedIndex < 0 ? this.findLastItemIndex() : selectedIndex;\n },\n searchItems: function searchItems(event, _char) {\n var _this10 = this;\n this.searchValue = (this.searchValue || '') + _char;\n var itemIndex = -1;\n var matched = false;\n if (this.focusedItemInfo.index !== -1) {\n itemIndex = this.visibleItems.slice(this.focusedItemInfo.index).findIndex(function (processedItem) {\n return _this10.isItemMatched(processedItem);\n });\n itemIndex = itemIndex === -1 ? this.visibleItems.slice(0, this.focusedItemInfo.index).findIndex(function (processedItem) {\n return _this10.isItemMatched(processedItem);\n }) : itemIndex + this.focusedItemInfo.index;\n } else {\n itemIndex = this.visibleItems.findIndex(function (processedItem) {\n return _this10.isItemMatched(processedItem);\n });\n }\n if (itemIndex !== -1) {\n matched = true;\n }\n if (itemIndex === -1 && this.focusedItemInfo.index === -1) {\n itemIndex = this.findFirstFocusedItemIndex();\n }\n if (itemIndex !== -1) {\n this.changeFocusedItemIndex(event, itemIndex);\n }\n if (this.searchTimeout) {\n clearTimeout(this.searchTimeout);\n }\n this.searchTimeout = setTimeout(function () {\n _this10.searchValue = '';\n _this10.searchTimeout = null;\n }, 500);\n return matched;\n },\n changeFocusedItemIndex: function changeFocusedItemIndex(event, index) {\n if (this.focusedItemInfo.index !== index) {\n this.focusedItemInfo.index = index;\n this.scrollInView();\n }\n },\n scrollInView: function scrollInView() {\n var index = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : -1;\n var id = index !== -1 ? \"\".concat(this.id, \"_\").concat(index) : this.focusedItemId;\n var element = DomHandler.findSingle(this.menubar, \"li[id=\\\"\".concat(id, \"\\\"]\"));\n if (element) {\n element.scrollIntoView && element.scrollIntoView({\n block: 'nearest',\n inline: 'start'\n });\n }\n },\n createProcessedItems: function createProcessedItems(items) {\n var _this11 = this;\n var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var parent = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n var parentKey = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '';\n var processedItems = [];\n items && items.forEach(function (item, index) {\n var key = (parentKey !== '' ? parentKey + '_' : '') + index;\n var newItem = {\n item: item,\n index: index,\n level: level,\n key: key,\n parent: parent,\n parentKey: parentKey\n };\n newItem['items'] = _this11.createProcessedItems(item.items, level + 1, newItem, key);\n processedItems.push(newItem);\n });\n return processedItems;\n },\n containerRef: function containerRef(el) {\n this.container = el;\n },\n menubarRef: function menubarRef(el) {\n this.menubar = el ? el.$el : undefined;\n }\n },\n computed: {\n processedItems: function processedItems() {\n return this.createProcessedItems(this.model || []);\n },\n visibleItems: function visibleItems() {\n var _this12 = this;\n var processedItem = this.activeItemPath.find(function (p) {\n return p.key === _this12.focusedItemInfo.parentKey;\n });\n return processedItem ? processedItem.items : this.processedItems;\n },\n focusedItemId: function focusedItemId() {\n return this.focusedItemInfo.index !== -1 ? \"\".concat(this.id).concat(ObjectUtils.isNotEmpty(this.focusedItemInfo.parentKey) ? '_' + this.focusedItemInfo.parentKey : '', \"_\").concat(this.focusedItemInfo.index) : null;\n }\n },\n components: {\n TieredMenuSub: script$1,\n Portal: Portal\n }\n};\n\nvar _hoisted_1 = [\"id\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n var _component_TieredMenuSub = resolveComponent(\"TieredMenuSub\");\n var _component_Portal = resolveComponent(\"Portal\");\n return openBlock(), createBlock(_component_Portal, {\n appendTo: _ctx.appendTo,\n disabled: !_ctx.popup\n }, {\n \"default\": withCtx(function () {\n return [createVNode(Transition, mergeProps({\n name: \"p-connected-overlay\",\n onEnter: $options.onEnter,\n onAfterEnter: $options.onAfterEnter,\n onLeave: $options.onLeave,\n onAfterLeave: $options.onAfterLeave\n }, _ctx.ptm('transition')), {\n \"default\": withCtx(function () {\n return [$data.visible ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n ref: $options.containerRef,\n id: $data.id,\n \"class\": _ctx.cx('root'),\n onClick: _cache[0] || (_cache[0] = function () {\n return $options.onOverlayClick && $options.onOverlayClick.apply($options, arguments);\n })\n }, _ctx.ptmi('root')), [_ctx.$slots.start ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 0,\n \"class\": _ctx.cx('start')\n }, _ctx.ptm('start')), [renderSlot(_ctx.$slots, \"start\")], 16)) : createCommentVNode(\"\", true), createVNode(_component_TieredMenuSub, {\n ref: $options.menubarRef,\n id: $data.id + '_list',\n tabindex: !_ctx.disabled ? _ctx.tabindex : -1,\n role: \"menubar\",\n \"aria-label\": _ctx.ariaLabel,\n \"aria-labelledby\": _ctx.ariaLabelledby,\n \"aria-disabled\": _ctx.disabled || undefined,\n \"aria-orientation\": \"vertical\",\n \"aria-activedescendant\": $data.focused ? $options.focusedItemId : undefined,\n menuId: $data.id,\n focusedItemId: $data.focused ? $options.focusedItemId : undefined,\n items: $options.processedItems,\n templates: _ctx.$slots,\n activeItemPath: $data.activeItemPath,\n level: 0,\n visible: $data.submenuVisible,\n pt: _ctx.pt,\n unstyled: _ctx.unstyled,\n onFocus: $options.onFocus,\n onBlur: $options.onBlur,\n onKeydown: $options.onKeyDown,\n onItemClick: $options.onItemClick,\n onItemMouseenter: $options.onItemMouseEnter,\n onItemMousemove: $options.onItemMouseMove\n }, null, 8, [\"id\", \"tabindex\", \"aria-label\", \"aria-labelledby\", \"aria-disabled\", \"aria-activedescendant\", \"menuId\", \"focusedItemId\", \"items\", \"templates\", \"activeItemPath\", \"visible\", \"pt\", \"unstyled\", \"onFocus\", \"onBlur\", \"onKeydown\", \"onItemClick\", \"onItemMouseenter\", \"onItemMousemove\"]), _ctx.$slots.end ? (openBlock(), createElementBlock(\"div\", mergeProps({\n key: 1,\n \"class\": _ctx.cx('end')\n }, _ctx.ptm('end')), [renderSlot(_ctx.$slots, \"end\")], 16)) : createCommentVNode(\"\", true)], 16, _hoisted_1)) : createCommentVNode(\"\", true)];\n }),\n _: 3\n }, 16, [\"onEnter\", \"onAfterEnter\", \"onLeave\", \"onAfterLeave\"])];\n }),\n _: 3\n }, 8, [\"appendTo\", \"disabled\"]);\n}\n\nscript.render = render;\n\nexport { script as default };\n","import BaseStyle from 'primevue/base/style';\n\nvar classes = {\n root: function root(_ref) {\n var props = _ref.props;\n return ['p-splitbutton p-component', {\n 'p-button-raised': props.raised,\n 'p-button-rounded': props.rounded,\n 'p-button-text': props.text,\n 'p-button-outlined': props.outlined,\n 'p-button-sm': props.size === 'small',\n 'p-button-lg': props.size === 'large'\n }];\n },\n button: 'p-splitbutton-defaultbutton',\n menuButton: 'p-splitbutton-menubutton'\n};\nvar SplitButtonStyle = BaseStyle.extend({\n name: 'splitbutton',\n classes: classes\n});\n\nexport { SplitButtonStyle as default };\n","import Button from 'primevue/button';\nimport ChevronDownIcon from 'primevue/icons/chevrondown';\nimport TieredMenu from 'primevue/tieredmenu';\nimport { UniqueComponentId } from 'primevue/utils';\nimport BaseComponent from 'primevue/basecomponent';\nimport SplitButtonStyle from 'primevue/splitbutton/style';\nimport { resolveComponent, openBlock, createElementBlock, mergeProps, createVNode, createSlots, withCtx, renderSlot, normalizeClass, createElementVNode, createBlock, resolveDynamicComponent } from 'vue';\n\nvar script$1 = {\n name: 'BaseSplitButton',\n \"extends\": BaseComponent,\n props: {\n label: {\n type: String,\n \"default\": null\n },\n icon: {\n type: String,\n \"default\": null\n },\n model: {\n type: Array,\n \"default\": null\n },\n autoZIndex: {\n type: Boolean,\n \"default\": true\n },\n baseZIndex: {\n type: Number,\n \"default\": 0\n },\n appendTo: {\n type: [String, Object],\n \"default\": 'body'\n },\n disabled: {\n type: Boolean,\n \"default\": false\n },\n \"class\": {\n type: null,\n \"default\": null\n },\n style: {\n type: null,\n \"default\": null\n },\n buttonProps: {\n type: null,\n \"default\": null\n },\n menuButtonProps: {\n type: null,\n \"default\": null\n },\n menuButtonIcon: {\n type: String,\n \"default\": undefined\n },\n severity: {\n type: String,\n \"default\": null\n },\n raised: {\n type: Boolean,\n \"default\": false\n },\n rounded: {\n type: Boolean,\n \"default\": false\n },\n text: {\n type: Boolean,\n \"default\": false\n },\n outlined: {\n type: Boolean,\n \"default\": false\n },\n size: {\n type: String,\n \"default\": null\n },\n plain: {\n type: Boolean,\n \"default\": false\n }\n },\n style: SplitButtonStyle,\n provide: function provide() {\n return {\n $parentInstance: this\n };\n }\n};\n\nvar script = {\n name: 'SplitButton',\n \"extends\": script$1,\n inheritAttrs: false,\n emits: ['click'],\n data: function data() {\n return {\n id: this.$attrs.id,\n isExpanded: false\n };\n },\n watch: {\n '$attrs.id': function $attrsId(newValue) {\n this.id = newValue || UniqueComponentId();\n }\n },\n mounted: function mounted() {\n var _this = this;\n this.id = this.id || UniqueComponentId();\n this.$watch('$refs.menu.visible', function (newValue) {\n _this.isExpanded = newValue;\n });\n },\n methods: {\n onDropdownButtonClick: function onDropdownButtonClick(event) {\n if (event) {\n event.preventDefault();\n }\n this.$refs.menu.toggle({\n currentTarget: this.$el,\n relatedTarget: this.$refs.button.$el\n });\n this.isExpanded = this.$refs.menu.visible;\n },\n onDropdownKeydown: function onDropdownKeydown(event) {\n if (event.code === 'ArrowDown' || event.code === 'ArrowUp') {\n this.onDropdownButtonClick();\n event.preventDefault();\n }\n },\n onDefaultButtonClick: function onDefaultButtonClick(event) {\n if (this.isExpanded) {\n this.$refs.menu.hide(event);\n }\n this.$emit('click', event);\n }\n },\n computed: {\n containerClass: function containerClass() {\n return [this.cx('root'), this[\"class\"]];\n }\n },\n components: {\n PVSButton: Button,\n PVSMenu: TieredMenu,\n ChevronDownIcon: ChevronDownIcon\n }\n};\n\nvar _hoisted_1 = [\"data-p-severity\"];\nfunction render(_ctx, _cache, $props, $setup, $data, $options) {\n var _component_PVSButton = resolveComponent(\"PVSButton\");\n var _component_PVSMenu = resolveComponent(\"PVSMenu\");\n return openBlock(), createElementBlock(\"div\", mergeProps({\n \"class\": $options.containerClass,\n style: _ctx.style\n }, _ctx.ptmi('root'), {\n \"data-p-severity\": _ctx.severity\n }), [createVNode(_component_PVSButton, mergeProps({\n type: \"button\",\n \"class\": _ctx.cx('button'),\n label: _ctx.label,\n icon: _ctx.icon,\n disabled: _ctx.disabled,\n severity: _ctx.severity,\n text: _ctx.text,\n outlined: _ctx.outlined,\n size: _ctx.size,\n \"aria-label\": _ctx.label,\n onClick: $options.onDefaultButtonClick\n }, _ctx.buttonProps, {\n pt: _ctx.ptm('button'),\n unstyled: _ctx.unstyled\n }), createSlots({\n \"default\": withCtx(function () {\n return [renderSlot(_ctx.$slots, \"default\")];\n }),\n _: 2\n }, [_ctx.$slots.icon ? {\n name: \"icon\",\n fn: withCtx(function (slotProps) {\n return [renderSlot(_ctx.$slots, \"icon\", {\n \"class\": normalizeClass(slotProps[\"class\"])\n }, function () {\n return [createElementVNode(\"span\", mergeProps({\n \"class\": [_ctx.icon, slotProps[\"class\"]]\n }, _ctx.ptm('button')['icon'], {\n \"data-pc-section\": \"buttonicon\"\n }), null, 16)];\n })];\n }),\n key: \"0\"\n } : undefined]), 1040, [\"class\", \"label\", \"icon\", \"disabled\", \"severity\", \"text\", \"outlined\", \"size\", \"aria-label\", \"onClick\", \"pt\", \"unstyled\"]), createVNode(_component_PVSButton, mergeProps({\n ref: \"button\",\n type: \"button\",\n \"class\": _ctx.cx('menuButton'),\n disabled: _ctx.disabled,\n \"aria-haspopup\": \"true\",\n \"aria-expanded\": $data.isExpanded,\n \"aria-controls\": $data.id + '_overlay',\n onClick: $options.onDropdownButtonClick,\n onKeydown: $options.onDropdownKeydown,\n severity: _ctx.severity,\n text: _ctx.text,\n outlined: _ctx.outlined,\n size: _ctx.size\n }, _ctx.menuButtonProps, {\n pt: _ctx.ptm('menuButton'),\n unstyled: _ctx.unstyled\n }), {\n icon: withCtx(function (slotProps) {\n return [renderSlot(_ctx.$slots, \"menubuttonicon\", {\n \"class\": normalizeClass(slotProps[\"class\"])\n }, function () {\n return [(openBlock(), createBlock(resolveDynamicComponent(_ctx.menuButtonIcon ? 'span' : 'ChevronDownIcon'), mergeProps({\n \"class\": [_ctx.menuButtonIcon, slotProps[\"class\"]]\n }, _ctx.ptm('menuButton')['icon'], {\n \"data-pc-section\": \"menubuttonicon\"\n }), null, 16, [\"class\"]))];\n })];\n }),\n _: 3\n }, 16, [\"class\", \"disabled\", \"aria-expanded\", \"aria-controls\", \"onClick\", \"onKeydown\", \"severity\", \"text\", \"outlined\", \"size\", \"pt\", \"unstyled\"]), createVNode(_component_PVSMenu, {\n ref: \"menu\",\n id: $data.id + '_overlay',\n model: _ctx.model,\n popup: true,\n autoZIndex: _ctx.autoZIndex,\n baseZIndex: _ctx.baseZIndex,\n appendTo: _ctx.appendTo,\n unstyled: _ctx.unstyled,\n pt: _ctx.ptm('menu')\n }, createSlots({\n _: 2\n }, [_ctx.$slots.menuitemicon ? {\n name: \"itemicon\",\n fn: withCtx(function (slotProps) {\n return [renderSlot(_ctx.$slots, \"menuitemicon\", {\n item: slotProps.item,\n \"class\": normalizeClass(slotProps[\"class\"])\n })];\n }),\n key: \"0\"\n } : undefined, _ctx.$slots.item ? {\n name: \"item\",\n fn: withCtx(function (slotProps) {\n return [renderSlot(_ctx.$slots, \"item\", {\n item: slotProps.item,\n hasSubmenu: slotProps.hasSubmenu,\n label: slotProps.label,\n props: slotProps.props\n })];\n }),\n key: \"1\"\n } : undefined]), 1032, [\"id\", \"model\", \"autoZIndex\", \"baseZIndex\", \"appendTo\", \"unstyled\", \"pt\"])], 16, _hoisted_1);\n}\n\nscript.render = render;\n\nexport { script as default };\n"],"names":["inlineStyles","_ref","instance","processedItem","classes","_ref2","props","_ref3","TieredMenuStyle","BaseStyle","script$2","BaseComponent","script$1","name","params","ObjectUtils","index","key","path","DomHandler","event","_this","_this2","mergeProps","el","AngleRightIcon","Ripple","_hoisted_1$1","_hoisted_2","_hoisted_3","_hoisted_4","_hoisted_5","_hoisted_6","render$1","_ctx","_cache","$props","$setup","$data","$options","_component_AngleRightIcon","resolveComponent","_component_TieredMenuSub","_directive_ripple","resolveDirective","openBlock","createBlock","Transition","withCtx","createElementBlock","Fragment","renderList","createElementVNode","$event","resolveDynamicComponent","withDirectives","normalizeClass","createCommentVNode","toDisplayString","normalizeStyle","script","newValue","UniqueComponentId","newPath","ZIndexUtils","item","isFocus","metaKey","level","parentKey","items","grouped","activeItemPath","p","OverlayEventBus","originalEvent","root","selected","rootProcessedItem","itemIndex","parentItem","element","anchorElement","_focusedItemInfo","targetWidth","isOutsideContainer","isOutsideTarget","_this3","ConnectedOverlayScrollHandler","_this4","_this$getProccessedIt","_this5","_this6","_this7","matchedItemIndex","_this8","_this9","selectedIndex","_char","_this10","matched","id","_this11","parent","processedItems","newItem","_this12","Portal","_hoisted_1","render","_component_Portal","createVNode","renderSlot","SplitButtonStyle","Button","TieredMenu","ChevronDownIcon","_component_PVSButton","_component_PVSMenu","createSlots","slotProps"],"mappings":"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","x_google_ignoreList":[0,1,2,3]} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/vendor-charts.DHYGKspN.js b/deploy-package-20260223-151231/frontend/assets/vendor-charts.DHYGKspN.js deleted file mode 100644 index f1f768c..0000000 --- a/deploy-package-20260223-151231/frontend/assets/vendor-charts.DHYGKspN.js +++ /dev/null @@ -1,19 +0,0 @@ -var yo=Object.defineProperty;var vo=(i,t,e)=>t in i?yo(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var M=(i,t,e)=>vo(i,typeof t!="symbol"?t+"":t,e);/*! - * @kurkle/color v0.3.4 - * https://github.com/kurkle/color#readme - * (c) 2024 Jukka Kurkela - * Released under the MIT License - */function ve(i){return i+.5|0}const bt=(i,t,e)=>Math.max(Math.min(i,e),t);function ie(i){return bt(ve(i*2.55),0,255)}function Mt(i){return bt(ve(i*255),0,255)}function ft(i){return bt(ve(i/2.55)/100,0,1)}function Qi(i){return bt(ve(i*100),0,100)}const it={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15,a:10,b:11,c:12,d:13,e:14,f:15},vi=[..."0123456789ABCDEF"],Mo=i=>vi[i&15],ko=i=>vi[(i&240)>>4]+vi[i&15],Se=i=>(i&240)>>4===(i&15),So=i=>Se(i.r)&&Se(i.g)&&Se(i.b)&&Se(i.a);function wo(i){var t=i.length,e;return i[0]==="#"&&(t===4||t===5?e={r:255&it[i[1]]*17,g:255&it[i[2]]*17,b:255&it[i[3]]*17,a:t===5?it[i[4]]*17:255}:(t===7||t===9)&&(e={r:it[i[1]]<<4|it[i[2]],g:it[i[3]]<<4|it[i[4]],b:it[i[5]]<<4|it[i[6]],a:t===9?it[i[7]]<<4|it[i[8]]:255})),e}const Po=(i,t)=>i<255?t(i):"";function Do(i){var t=So(i)?Mo:ko;return i?"#"+t(i.r)+t(i.g)+t(i.b)+Po(i.a,t):void 0}const Oo=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Mn(i,t,e){const s=t*Math.min(e,1-e),n=(o,a=(o+i/30)%12)=>e-s*Math.max(Math.min(a-3,9-a,1),-1);return[n(0),n(8),n(4)]}function Ao(i,t,e){const s=(n,o=(n+i/60)%6)=>e-e*t*Math.max(Math.min(o,4-o,1),0);return[s(5),s(3),s(1)]}function Co(i,t,e){const s=Mn(i,1,.5);let n;for(t+e>1&&(n=1/(t+e),t*=n,e*=n),n=0;n<3;n++)s[n]*=1-t-e,s[n]+=t;return s}function To(i,t,e,s,n){return i===n?(t-e)/s+(t.5?h/(2-o-a):h/(o+a),l=To(e,s,n,h,o),l=l*60+.5),[l|0,c||0,r]}function Bi(i,t,e,s){return(Array.isArray(t)?i(t[0],t[1],t[2]):i(t,e,s)).map(Mt)}function Vi(i,t,e){return Bi(Mn,i,t,e)}function Lo(i,t,e){return Bi(Co,i,t,e)}function Ro(i,t,e){return Bi(Ao,i,t,e)}function kn(i){return(i%360+360)%360}function Eo(i){const t=Oo.exec(i);let e=255,s;if(!t)return;t[5]!==s&&(e=t[6]?ie(+t[5]):Mt(+t[5]));const n=kn(+t[2]),o=+t[3]/100,a=+t[4]/100;return t[1]==="hwb"?s=Lo(n,o,a):t[1]==="hsv"?s=Ro(n,o,a):s=Vi(n,o,a),{r:s[0],g:s[1],b:s[2],a:e}}function Io(i,t){var e=zi(i);e[0]=kn(e[0]+t),e=Vi(e),i.r=e[0],i.g=e[1],i.b=e[2]}function Fo(i){if(!i)return;const t=zi(i),e=t[0],s=Qi(t[1]),n=Qi(t[2]);return i.a<255?`hsla(${e}, ${s}%, ${n}%, ${ft(i.a)})`:`hsl(${e}, ${s}%, ${n}%)`}const ts={x:"dark",Z:"light",Y:"re",X:"blu",W:"gr",V:"medium",U:"slate",A:"ee",T:"ol",S:"or",B:"ra",C:"lateg",D:"ights",R:"in",Q:"turquois",E:"hi",P:"ro",O:"al",N:"le",M:"de",L:"yello",F:"en",K:"ch",G:"arks",H:"ea",I:"ightg",J:"wh"},es={OiceXe:"f0f8ff",antiquewEte:"faebd7",aqua:"ffff",aquamarRe:"7fffd4",azuY:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"0",blanKedOmond:"ffebcd",Xe:"ff",XeviTet:"8a2be2",bPwn:"a52a2a",burlywood:"deb887",caMtXe:"5f9ea0",KartYuse:"7fff00",KocTate:"d2691e",cSO:"ff7f50",cSnflowerXe:"6495ed",cSnsilk:"fff8dc",crimson:"dc143c",cyan:"ffff",xXe:"8b",xcyan:"8b8b",xgTMnPd:"b8860b",xWay:"a9a9a9",xgYF:"6400",xgYy:"a9a9a9",xkhaki:"bdb76b",xmagFta:"8b008b",xTivegYF:"556b2f",xSange:"ff8c00",xScEd:"9932cc",xYd:"8b0000",xsOmon:"e9967a",xsHgYF:"8fbc8f",xUXe:"483d8b",xUWay:"2f4f4f",xUgYy:"2f4f4f",xQe:"ced1",xviTet:"9400d3",dAppRk:"ff1493",dApskyXe:"bfff",dimWay:"696969",dimgYy:"696969",dodgerXe:"1e90ff",fiYbrick:"b22222",flSOwEte:"fffaf0",foYstWAn:"228b22",fuKsia:"ff00ff",gaRsbSo:"dcdcdc",ghostwEte:"f8f8ff",gTd:"ffd700",gTMnPd:"daa520",Way:"808080",gYF:"8000",gYFLw:"adff2f",gYy:"808080",honeyMw:"f0fff0",hotpRk:"ff69b4",RdianYd:"cd5c5c",Rdigo:"4b0082",ivSy:"fffff0",khaki:"f0e68c",lavFMr:"e6e6fa",lavFMrXsh:"fff0f5",lawngYF:"7cfc00",NmoncEffon:"fffacd",ZXe:"add8e6",ZcSO:"f08080",Zcyan:"e0ffff",ZgTMnPdLw:"fafad2",ZWay:"d3d3d3",ZgYF:"90ee90",ZgYy:"d3d3d3",ZpRk:"ffb6c1",ZsOmon:"ffa07a",ZsHgYF:"20b2aa",ZskyXe:"87cefa",ZUWay:"778899",ZUgYy:"778899",ZstAlXe:"b0c4de",ZLw:"ffffe0",lime:"ff00",limegYF:"32cd32",lRF:"faf0e6",magFta:"ff00ff",maPon:"800000",VaquamarRe:"66cdaa",VXe:"cd",VScEd:"ba55d3",VpurpN:"9370db",VsHgYF:"3cb371",VUXe:"7b68ee",VsprRggYF:"fa9a",VQe:"48d1cc",VviTetYd:"c71585",midnightXe:"191970",mRtcYam:"f5fffa",mistyPse:"ffe4e1",moccasR:"ffe4b5",navajowEte:"ffdead",navy:"80",Tdlace:"fdf5e6",Tive:"808000",TivedBb:"6b8e23",Sange:"ffa500",SangeYd:"ff4500",ScEd:"da70d6",pOegTMnPd:"eee8aa",pOegYF:"98fb98",pOeQe:"afeeee",pOeviTetYd:"db7093",papayawEp:"ffefd5",pHKpuff:"ffdab9",peru:"cd853f",pRk:"ffc0cb",plum:"dda0dd",powMrXe:"b0e0e6",purpN:"800080",YbeccapurpN:"663399",Yd:"ff0000",Psybrown:"bc8f8f",PyOXe:"4169e1",saddNbPwn:"8b4513",sOmon:"fa8072",sandybPwn:"f4a460",sHgYF:"2e8b57",sHshell:"fff5ee",siFna:"a0522d",silver:"c0c0c0",skyXe:"87ceeb",UXe:"6a5acd",UWay:"708090",UgYy:"708090",snow:"fffafa",sprRggYF:"ff7f",stAlXe:"4682b4",tan:"d2b48c",teO:"8080",tEstN:"d8bfd8",tomato:"ff6347",Qe:"40e0d0",viTet:"ee82ee",JHt:"f5deb3",wEte:"ffffff",wEtesmoke:"f5f5f5",Lw:"ffff00",LwgYF:"9acd32"};function zo(){const i={},t=Object.keys(es),e=Object.keys(ts);let s,n,o,a,r;for(s=0;s>16&255,o>>8&255,o&255]}return i}let we;function Bo(i){we||(we=zo(),we.transparent=[0,0,0,0]);const t=we[i.toLowerCase()];return t&&{r:t[0],g:t[1],b:t[2],a:t.length===4?t[3]:255}}const Vo=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;function Wo(i){const t=Vo.exec(i);let e=255,s,n,o;if(t){if(t[7]!==s){const a=+t[7];e=t[8]?ie(a):bt(a*255,0,255)}return s=+t[1],n=+t[3],o=+t[5],s=255&(t[2]?ie(s):bt(s,0,255)),n=255&(t[4]?ie(n):bt(n,0,255)),o=255&(t[6]?ie(o):bt(o,0,255)),{r:s,g:n,b:o,a:e}}}function No(i){return i&&(i.a<255?`rgba(${i.r}, ${i.g}, ${i.b}, ${ft(i.a)})`:`rgb(${i.r}, ${i.g}, ${i.b})`)}const ri=i=>i<=.0031308?i*12.92:Math.pow(i,1/2.4)*1.055-.055,jt=i=>i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4);function Ho(i,t,e){const s=jt(ft(i.r)),n=jt(ft(i.g)),o=jt(ft(i.b));return{r:Mt(ri(s+e*(jt(ft(t.r))-s))),g:Mt(ri(n+e*(jt(ft(t.g))-n))),b:Mt(ri(o+e*(jt(ft(t.b))-o))),a:i.a+e*(t.a-i.a)}}function Pe(i,t,e){if(i){let s=zi(i);s[t]=Math.max(0,Math.min(s[t]+s[t]*e,t===0?360:1)),s=Vi(s),i.r=s[0],i.g=s[1],i.b=s[2]}}function Sn(i,t){return i&&Object.assign(t||{},i)}function is(i){var t={r:0,g:0,b:0,a:255};return Array.isArray(i)?i.length>=3&&(t={r:i[0],g:i[1],b:i[2],a:255},i.length>3&&(t.a=Mt(i[3]))):(t=Sn(i,{r:0,g:0,b:0,a:1}),t.a=Mt(t.a)),t}function jo(i){return i.charAt(0)==="r"?Wo(i):Eo(i)}class fe{constructor(t){if(t instanceof fe)return t;const e=typeof t;let s;e==="object"?s=is(t):e==="string"&&(s=wo(t)||Bo(t)||jo(t)),this._rgb=s,this._valid=!!s}get valid(){return this._valid}get rgb(){var t=Sn(this._rgb);return t&&(t.a=ft(t.a)),t}set rgb(t){this._rgb=is(t)}rgbString(){return this._valid?No(this._rgb):void 0}hexString(){return this._valid?Do(this._rgb):void 0}hslString(){return this._valid?Fo(this._rgb):void 0}mix(t,e){if(t){const s=this.rgb,n=t.rgb;let o;const a=e===o?.5:e,r=2*a-1,l=s.a-n.a,c=((r*l===-1?r:(r+l)/(1+r*l))+1)/2;o=1-c,s.r=255&c*s.r+o*n.r+.5,s.g=255&c*s.g+o*n.g+.5,s.b=255&c*s.b+o*n.b+.5,s.a=a*s.a+(1-a)*n.a,this.rgb=s}return this}interpolate(t,e){return t&&(this._rgb=Ho(this._rgb,t._rgb,e)),this}clone(){return new fe(this.rgb)}alpha(t){return this._rgb.a=Mt(t),this}clearer(t){const e=this._rgb;return e.a*=1-t,this}greyscale(){const t=this._rgb,e=ve(t.r*.3+t.g*.59+t.b*.11);return t.r=t.g=t.b=e,this}opaquer(t){const e=this._rgb;return e.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Pe(this._rgb,2,t),this}darken(t){return Pe(this._rgb,2,-t),this}saturate(t){return Pe(this._rgb,1,t),this}desaturate(t){return Pe(this._rgb,1,-t),this}rotate(t){return Io(this._rgb,t),this}}/*! - * Chart.js v4.5.1 - * https://www.chartjs.org - * (c) 2025 Chart.js Contributors - * Released under the MIT License - */function ht(){}const $o=(()=>{let i=0;return()=>i++})();function C(i){return i==null}function V(i){if(Array.isArray&&Array.isArray(i))return!0;const t=Object.prototype.toString.call(i);return t.slice(0,7)==="[object"&&t.slice(-6)==="Array]"}function T(i){return i!==null&&Object.prototype.toString.call(i)==="[object Object]"}function N(i){return(typeof i=="number"||i instanceof Number)&&isFinite(+i)}function et(i,t){return N(i)?i:t}function D(i,t){return typeof i>"u"?t:i}const Yo=(i,t)=>typeof i=="string"&&i.endsWith("%")?parseFloat(i)/100:+i/t,wn=(i,t)=>typeof i=="string"&&i.endsWith("%")?parseFloat(i)/100*t:+i;function F(i,t,e){if(i&&typeof i.call=="function")return i.apply(e,t)}function E(i,t,e,s){let n,o,a;if(V(i))for(o=i.length,n=0;ni,x:i=>i.x,y:i=>i.y};function Ko(i){const t=i.split("."),e=[];let s="";for(const n of t)s+=n,s.endsWith("\\")?s=s.slice(0,-1)+".":(e.push(s),s="");return e}function qo(i){const t=Ko(i);return e=>{for(const s of t){if(s==="")break;e=e&&e[s]}return e}}function kt(i,t){return(ss[t]||(ss[t]=qo(t)))(i)}function Wi(i){return i.charAt(0).toUpperCase()+i.slice(1)}const pe=i=>typeof i<"u",St=i=>typeof i=="function",ns=(i,t)=>{if(i.size!==t.size)return!1;for(const e of i)if(!t.has(e))return!1;return!0};function Go(i){return i.type==="mouseup"||i.type==="click"||i.type==="contextmenu"}const R=Math.PI,z=2*R,Zo=z+R,Ke=Number.POSITIVE_INFINITY,Jo=R/180,j=R/2,Ot=R/4,os=R*2/3,xt=Math.log10,ct=Math.sign;function ce(i,t,e){return Math.abs(i-t)n-o).pop(),t}function ta(i){return typeof i=="symbol"||typeof i=="object"&&i!==null&&!(Symbol.toPrimitive in i||"toString"in i||"valueOf"in i)}function Xt(i){return!ta(i)&&!isNaN(parseFloat(i))&&isFinite(i)}function ea(i,t){const e=Math.round(i);return e-t<=i&&e+t>=i}function Dn(i,t,e){let s,n,o;for(s=0,n=i.length;sl&&c=Math.min(t,e)-s&&i<=Math.max(t,e)+s}function Hi(i,t,e){e=e||(a=>i[a]1;)o=n+s>>1,e(o)?n=o:s=o;return{lo:n,hi:s}}const pt=(i,t,e,s)=>Hi(i,e,s?n=>{const o=i[n][t];return oi[n][t]Hi(i,e,s=>i[s][t]>=e);function oa(i,t,e){let s=0,n=i.length;for(;ss&&i[n-1]>e;)n--;return s>0||n{const s="_onData"+Wi(e),n=i[e];Object.defineProperty(i,e,{configurable:!0,enumerable:!1,value(...o){const a=n.apply(this,o);return i._chartjs.listeners.forEach(r=>{typeof r[s]=="function"&&r[s](...o)}),a}})})}function ls(i,t){const e=i._chartjs;if(!e)return;const s=e.listeners,n=s.indexOf(t);n!==-1&&s.splice(n,1),!(s.length>0)&&(An.forEach(o=>{delete i[o]}),delete i._chartjs)}function Cn(i){const t=new Set(i);return t.size===i.length?i:Array.from(t)}const Tn=function(){return typeof window>"u"?function(i){return i()}:window.requestAnimationFrame}();function Ln(i,t){let e=[],s=!1;return function(...n){e=n,s||(s=!0,Tn.call(window,()=>{s=!1,i.apply(t,e)}))}}function ra(i,t){let e;return function(...s){return t?(clearTimeout(e),e=setTimeout(i,t,s)):i.apply(this,s),t}}const ji=i=>i==="start"?"left":i==="end"?"right":"center",K=(i,t,e)=>i==="start"?t:i==="end"?e:(t+e)/2,la=(i,t,e,s)=>i===(s?"left":"right")?e:i==="center"?(t+e)/2:t;function Rn(i,t,e){const s=t.length;let n=0,o=s;if(i._sorted){const{iScale:a,vScale:r,_parsed:l}=i,c=i.dataset&&i.dataset.options?i.dataset.options.spanGaps:null,h=a.axis,{min:d,max:u,minDefined:f,maxDefined:g}=a.getUserBounds();if(f){if(n=Math.min(pt(l,h,d).lo,e?s:pt(t,h,a.getPixelForValue(d)).lo),c){const p=l.slice(0,n+1).reverse().findIndex(m=>!C(m[r.axis]));n-=Math.max(0,p)}n=Y(n,0,s-1)}if(g){let p=Math.max(pt(l,a.axis,u,!0).hi+1,e?0:pt(t,h,a.getPixelForValue(u),!0).hi+1);if(c){const m=l.slice(p-1).findIndex(b=>!C(b[r.axis]));p+=Math.max(0,m)}o=Y(p,n,s)-n}else o=s-n}return{start:n,count:o}}function En(i){const{xScale:t,yScale:e,_scaleRanges:s}=i,n={xmin:t.min,xmax:t.max,ymin:e.min,ymax:e.max};if(!s)return i._scaleRanges=n,!0;const o=s.xmin!==t.min||s.xmax!==t.max||s.ymin!==e.min||s.ymax!==e.max;return Object.assign(s,n),o}const De=i=>i===0||i===1,cs=(i,t,e)=>-(Math.pow(2,10*(i-=1))*Math.sin((i-t)*z/e)),hs=(i,t,e)=>Math.pow(2,-10*i)*Math.sin((i-t)*z/e)+1,he={linear:i=>i,easeInQuad:i=>i*i,easeOutQuad:i=>-i*(i-2),easeInOutQuad:i=>(i/=.5)<1?.5*i*i:-.5*(--i*(i-2)-1),easeInCubic:i=>i*i*i,easeOutCubic:i=>(i-=1)*i*i+1,easeInOutCubic:i=>(i/=.5)<1?.5*i*i*i:.5*((i-=2)*i*i+2),easeInQuart:i=>i*i*i*i,easeOutQuart:i=>-((i-=1)*i*i*i-1),easeInOutQuart:i=>(i/=.5)<1?.5*i*i*i*i:-.5*((i-=2)*i*i*i-2),easeInQuint:i=>i*i*i*i*i,easeOutQuint:i=>(i-=1)*i*i*i*i+1,easeInOutQuint:i=>(i/=.5)<1?.5*i*i*i*i*i:.5*((i-=2)*i*i*i*i+2),easeInSine:i=>-Math.cos(i*j)+1,easeOutSine:i=>Math.sin(i*j),easeInOutSine:i=>-.5*(Math.cos(R*i)-1),easeInExpo:i=>i===0?0:Math.pow(2,10*(i-1)),easeOutExpo:i=>i===1?1:-Math.pow(2,-10*i)+1,easeInOutExpo:i=>De(i)?i:i<.5?.5*Math.pow(2,10*(i*2-1)):.5*(-Math.pow(2,-10*(i*2-1))+2),easeInCirc:i=>i>=1?i:-(Math.sqrt(1-i*i)-1),easeOutCirc:i=>Math.sqrt(1-(i-=1)*i),easeInOutCirc:i=>(i/=.5)<1?-.5*(Math.sqrt(1-i*i)-1):.5*(Math.sqrt(1-(i-=2)*i)+1),easeInElastic:i=>De(i)?i:cs(i,.075,.3),easeOutElastic:i=>De(i)?i:hs(i,.075,.3),easeInOutElastic(i){return De(i)?i:i<.5?.5*cs(i*2,.1125,.45):.5+.5*hs(i*2-1,.1125,.45)},easeInBack(i){return i*i*((1.70158+1)*i-1.70158)},easeOutBack(i){return(i-=1)*i*((1.70158+1)*i+1.70158)+1},easeInOutBack(i){let t=1.70158;return(i/=.5)<1?.5*(i*i*(((t*=1.525)+1)*i-t)):.5*((i-=2)*i*(((t*=1.525)+1)*i+t)+2)},easeInBounce:i=>1-he.easeOutBounce(1-i),easeOutBounce(i){return i<1/2.75?7.5625*i*i:i<2/2.75?7.5625*(i-=1.5/2.75)*i+.75:i<2.5/2.75?7.5625*(i-=2.25/2.75)*i+.9375:7.5625*(i-=2.625/2.75)*i+.984375},easeInOutBounce:i=>i<.5?he.easeInBounce(i*2)*.5:he.easeOutBounce(i*2-1)*.5+.5};function $i(i){if(i&&typeof i=="object"){const t=i.toString();return t==="[object CanvasPattern]"||t==="[object CanvasGradient]"}return!1}function ds(i){return $i(i)?i:new fe(i)}function li(i){return $i(i)?i:new fe(i).saturate(.5).darken(.1).hexString()}const ca=["x","y","borderWidth","radius","tension"],ha=["color","borderColor","backgroundColor"];function da(i){i.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),i.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>t!=="onProgress"&&t!=="onComplete"&&t!=="fn"}),i.set("animations",{colors:{type:"color",properties:ha},numbers:{type:"number",properties:ca}}),i.describe("animations",{_fallback:"animation"}),i.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>t|0}}}})}function ua(i){i.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})}const us=new Map;function fa(i,t){t=t||{};const e=i+JSON.stringify(t);let s=us.get(e);return s||(s=new Intl.NumberFormat(i,t),us.set(e,s)),s}function Me(i,t,e){return fa(t,e).format(i)}const In={values(i){return V(i)?i:""+i},numeric(i,t,e){if(i===0)return"0";const s=this.chart.options.locale;let n,o=i;if(e.length>1){const c=Math.max(Math.abs(e[0].value),Math.abs(e[e.length-1].value));(c<1e-4||c>1e15)&&(n="scientific"),o=ga(i,e)}const a=xt(Math.abs(o)),r=isNaN(a)?1:Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),Me(i,s,l)},logarithmic(i,t,e){if(i===0)return"0";const s=e[t].significand||i/Math.pow(10,Math.floor(xt(i)));return[1,2,3,5,10,15].includes(s)||t>.8*e.length?In.numeric.call(this,i,t,e):""}};function ga(i,t){let e=t.length>3?t[2].value-t[1].value:t[1].value-t[0].value;return Math.abs(e)>=1&&i!==Math.floor(i)&&(e=i-Math.floor(i)),e}var ti={formatters:In};function pa(i){i.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",clip:!0,grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:ti.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),i.route("scale.ticks","color","","color"),i.route("scale.grid","color","","borderColor"),i.route("scale.border","color","","borderColor"),i.route("scale.title","color","","color"),i.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&t!=="callback"&&t!=="parser",_indexable:t=>t!=="borderDash"&&t!=="tickBorderDash"&&t!=="dash"}),i.describe("scales",{_fallback:"scale"}),i.describe("scale.ticks",{_scriptable:t=>t!=="backdropPadding"&&t!=="callback",_indexable:t=>t!=="backdropPadding"})}const Bt=Object.create(null),ki=Object.create(null);function de(i,t){if(!t)return i;const e=t.split(".");for(let s=0,n=e.length;ss.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(s,n)=>li(n.backgroundColor),this.hoverBorderColor=(s,n)=>li(n.borderColor),this.hoverColor=(s,n)=>li(n.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return ci(this,t,e)}get(t){return de(this,t)}describe(t,e){return ci(ki,t,e)}override(t,e){return ci(Bt,t,e)}route(t,e,s,n){const o=de(this,t),a=de(this,s),r="_"+e;Object.defineProperties(o,{[r]:{value:o[e],writable:!0},[e]:{enumerable:!0,get(){const l=this[r],c=a[n];return T(l)?Object.assign({},c,l):D(l,c)},set(l){this[r]=l}}})}apply(t){t.forEach(e=>e(this))}}var W=new ma({_scriptable:i=>!i.startsWith("on"),_indexable:i=>i!=="events",hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[da,ua,pa]);function ba(i){return!i||C(i.size)||C(i.family)?null:(i.style?i.style+" ":"")+(i.weight?i.weight+" ":"")+i.size+"px "+i.family}function qe(i,t,e,s,n){let o=t[n];return o||(o=t[n]=i.measureText(n).width,e.push(n)),o>s&&(s=o),s}function xa(i,t,e,s){s=s||{};let n=s.data=s.data||{},o=s.garbageCollect=s.garbageCollect||[];s.font!==t&&(n=s.data={},o=s.garbageCollect=[],s.font=t),i.save(),i.font=t;let a=0;const r=e.length;let l,c,h,d,u;for(l=0;le.length){for(l=0;l0&&i.stroke()}}function mt(i,t,e){return e=e||.5,!t||i&&i.x>t.left-e&&i.xt.top-e&&i.y0&&o.strokeColor!=="";let l,c;for(i.save(),i.font=n.string,va(i,o),l=0;l+i||0;function Yi(i,t){const e={},s=T(t),n=s?Object.keys(t):t,o=T(i)?s?a=>D(i[a],i[t[a]]):a=>i[a]:()=>i;for(const a of n)e[a]=Da(o(a));return e}function zn(i){return Yi(i,{top:"y",right:"x",bottom:"y",left:"x"})}function Ft(i){return Yi(i,["topLeft","topRight","bottomLeft","bottomRight"])}function Z(i){const t=zn(i);return t.width=t.left+t.right,t.height=t.top+t.bottom,t}function $(i,t){i=i||{},t=t||W.font;let e=D(i.size,t.size);typeof e=="string"&&(e=parseInt(e,10));let s=D(i.style,t.style);s&&!(""+s).match(wa)&&(console.warn('Invalid font style specified: "'+s+'"'),s=void 0);const n={family:D(i.family,t.family),lineHeight:Pa(D(i.lineHeight,t.lineHeight),e),size:e,style:s,weight:D(i.weight,t.weight),string:""};return n.string=ba(n),n}function se(i,t,e,s){let n,o,a;for(n=0,o=i.length;ne&&r===0?0:r+l;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function wt(i,t){return Object.assign(Object.create(i),t)}function Xi(i,t=[""],e,s,n=()=>i[0]){const o=e||i;typeof s>"u"&&(s=Nn("_fallback",i));const a={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:i,_rootScopes:o,_fallback:s,_getTarget:n,override:r=>Xi([r,...i],t,o,s)};return new Proxy(a,{deleteProperty(r,l){return delete r[l],delete r._keys,delete i[0][l],!0},get(r,l){return Vn(r,l,()=>Fa(l,t,i,r))},getOwnPropertyDescriptor(r,l){return Reflect.getOwnPropertyDescriptor(r._scopes[0],l)},getPrototypeOf(){return Reflect.getPrototypeOf(i[0])},has(r,l){return ps(r).includes(l)},ownKeys(r){return ps(r)},set(r,l,c){const h=r._storage||(r._storage=n());return r[l]=h[l]=c,delete r._keys,!0}})}function Ut(i,t,e,s){const n={_cacheable:!1,_proxy:i,_context:t,_subProxy:e,_stack:new Set,_descriptors:Bn(i,s),setContext:o=>Ut(i,o,e,s),override:o=>Ut(i.override(o),t,e,s)};return new Proxy(n,{deleteProperty(o,a){return delete o[a],delete i[a],!0},get(o,a,r){return Vn(o,a,()=>Ca(o,a,r))},getOwnPropertyDescriptor(o,a){return o._descriptors.allKeys?Reflect.has(i,a)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(i,a)},getPrototypeOf(){return Reflect.getPrototypeOf(i)},has(o,a){return Reflect.has(i,a)},ownKeys(){return Reflect.ownKeys(i)},set(o,a,r){return i[a]=r,delete o[a],!0}})}function Bn(i,t={scriptable:!0,indexable:!0}){const{_scriptable:e=t.scriptable,_indexable:s=t.indexable,_allKeys:n=t.allKeys}=i;return{allKeys:n,scriptable:e,indexable:s,isScriptable:St(e)?e:()=>e,isIndexable:St(s)?s:()=>s}}const Aa=(i,t)=>i?i+Wi(t):t,Ui=(i,t)=>T(t)&&i!=="adapters"&&(Object.getPrototypeOf(t)===null||t.constructor===Object);function Vn(i,t,e){if(Object.prototype.hasOwnProperty.call(i,t)||t==="constructor")return i[t];const s=e();return i[t]=s,s}function Ca(i,t,e){const{_proxy:s,_context:n,_subProxy:o,_descriptors:a}=i;let r=s[t];return St(r)&&a.isScriptable(t)&&(r=Ta(t,r,i,e)),V(r)&&r.length&&(r=La(t,r,i,a.isIndexable)),Ui(t,r)&&(r=Ut(r,n,o&&o[t],a)),r}function Ta(i,t,e,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=e;if(r.has(i))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+i);r.add(i);let l=t(o,a||s);return r.delete(i),Ui(i,l)&&(l=Ki(n._scopes,n,i,l)),l}function La(i,t,e,s){const{_proxy:n,_context:o,_subProxy:a,_descriptors:r}=e;if(typeof o.index<"u"&&s(i))return t[o.index%t.length];if(T(t[0])){const l=t,c=n._scopes.filter(h=>h!==l);t=[];for(const h of l){const d=Ki(c,n,i,h);t.push(Ut(d,o,a&&a[i],r))}}return t}function Wn(i,t,e){return St(i)?i(t,e):i}const Ra=(i,t)=>i===!0?t:typeof i=="string"?kt(t,i):void 0;function Ea(i,t,e,s,n){for(const o of t){const a=Ra(e,o);if(a){i.add(a);const r=Wn(a._fallback,e,n);if(typeof r<"u"&&r!==e&&r!==s)return r}else if(a===!1&&typeof s<"u"&&e!==s)return null}return!1}function Ki(i,t,e,s){const n=t._rootScopes,o=Wn(t._fallback,e,s),a=[...i,...n],r=new Set;r.add(s);let l=gs(r,a,e,o||e,s);return l===null||typeof o<"u"&&o!==e&&(l=gs(r,a,o,l,s),l===null)?!1:Xi(Array.from(r),[""],n,o,()=>Ia(t,e,s))}function gs(i,t,e,s,n){for(;e;)e=Ea(i,t,e,s,n);return e}function Ia(i,t,e){const s=i._getTarget();t in s||(s[t]={});const n=s[t];return V(n)&&T(e)?e:n||{}}function Fa(i,t,e,s){let n;for(const o of t)if(n=Nn(Aa(o,i),e),typeof n<"u")return Ui(i,n)?Ki(e,s,i,n):n}function Nn(i,t){for(const e of t){if(!e)continue;const s=e[i];if(typeof s<"u")return s}}function ps(i){let t=i._keys;return t||(t=i._keys=za(i._scopes)),t}function za(i){const t=new Set;for(const e of i)for(const s of Object.keys(e).filter(n=>!n.startsWith("_")))t.add(s);return Array.from(t)}function Hn(i,t,e,s){const{iScale:n}=i,{key:o="r"}=this._parsing,a=new Array(s);let r,l,c,h;for(r=0,l=s;rti==="x"?"y":"x";function Va(i,t,e,s){const n=i.skip?t:i,o=t,a=e.skip?t:e,r=Mi(o,n),l=Mi(a,o);let c=r/(r+l),h=l/(r+l);c=isNaN(c)?0:c,h=isNaN(h)?0:h;const d=s*c,u=s*h;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function Wa(i,t,e){const s=i.length;let n,o,a,r,l,c=Kt(i,0);for(let h=0;h!c.skip)),t.cubicInterpolationMode==="monotone")Ha(i,n);else{let c=s?i[i.length-1]:i[0];for(o=0,a=i.length;oi.ownerDocument.defaultView.getComputedStyle(i,null);function Ya(i,t){return si(i).getPropertyValue(t)}const Xa=["top","right","bottom","left"];function zt(i,t,e){const s={};e=e?"-"+e:"";for(let n=0;n<4;n++){const o=Xa[n];s[o]=parseFloat(i[t+"-"+o+e])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}const Ua=(i,t,e)=>(i>0||t>0)&&(!e||!e.shadowRoot);function Ka(i,t){const e=i.touches,s=e&&e.length?e[0]:i,{offsetX:n,offsetY:o}=s;let a=!1,r,l;if(Ua(n,o,i.target))r=n,l=o;else{const c=t.getBoundingClientRect();r=s.clientX-c.left,l=s.clientY-c.top,a=!0}return{x:r,y:l,box:a}}function Lt(i,t){if("native"in i)return i;const{canvas:e,currentDevicePixelRatio:s}=t,n=si(e),o=n.boxSizing==="border-box",a=zt(n,"padding"),r=zt(n,"border","width"),{x:l,y:c,box:h}=Ka(i,e),d=a.left+(h&&r.left),u=a.top+(h&&r.top);let{width:f,height:g}=t;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*e.width/s),y:Math.round((c-u)/g*e.height/s)}}function qa(i,t,e){let s,n;if(t===void 0||e===void 0){const o=i&&Gi(i);if(!o)t=i.clientWidth,e=i.clientHeight;else{const a=o.getBoundingClientRect(),r=si(o),l=zt(r,"border","width"),c=zt(r,"padding");t=a.width-c.width-l.width,e=a.height-c.height-l.height,s=Ge(r.maxWidth,o,"clientWidth"),n=Ge(r.maxHeight,o,"clientHeight")}}return{width:t,height:e,maxWidth:s||Ke,maxHeight:n||Ke}}const _t=i=>Math.round(i*10)/10;function Ga(i,t,e,s){const n=si(i),o=zt(n,"margin"),a=Ge(n.maxWidth,i,"clientWidth")||Ke,r=Ge(n.maxHeight,i,"clientHeight")||Ke,l=qa(i,t,e);let{width:c,height:h}=l;if(n.boxSizing==="content-box"){const u=zt(n,"border","width"),f=zt(n,"padding");c-=f.width+u.width,h-=f.height+u.height}return c=Math.max(0,c-o.width),h=Math.max(0,s?c/s:h-o.height),c=_t(Math.min(c,a,l.maxWidth)),h=_t(Math.min(h,r,l.maxHeight)),c&&!h&&(h=_t(c/2)),(t!==void 0||e!==void 0)&&s&&l.height&&h>l.height&&(h=l.height,c=_t(Math.floor(h*s))),{width:c,height:h}}function ms(i,t,e){const s=t||1,n=_t(i.height*s),o=_t(i.width*s);i.height=_t(i.height),i.width=_t(i.width);const a=i.canvas;return a.style&&(e||!a.style.height&&!a.style.width)&&(a.style.height=`${i.height}px`,a.style.width=`${i.width}px`),i.currentDevicePixelRatio!==s||a.height!==n||a.width!==o?(i.currentDevicePixelRatio=s,a.height=n,a.width=o,i.ctx.setTransform(s,0,0,s,0,0),!0):!1}const Za=function(){let i=!1;try{const t={get passive(){return i=!0,!1}};qi()&&(window.addEventListener("test",null,t),window.removeEventListener("test",null,t))}catch{}return i}();function bs(i,t){const e=Ya(i,t),s=e&&e.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function Rt(i,t,e,s){return{x:i.x+e*(t.x-i.x),y:i.y+e*(t.y-i.y)}}function Ja(i,t,e,s){return{x:i.x+e*(t.x-i.x),y:s==="middle"?e<.5?i.y:t.y:s==="after"?e<1?i.y:t.y:e>0?t.y:i.y}}function Qa(i,t,e,s){const n={x:i.cp2x,y:i.cp2y},o={x:t.cp1x,y:t.cp1y},a=Rt(i,n,e),r=Rt(n,o,e),l=Rt(o,t,e),c=Rt(a,r,e),h=Rt(r,l,e);return Rt(c,h,e)}const tr=function(i,t){return{x(e){return i+i+t-e},setWidth(e){t=e},textAlign(e){return e==="center"?e:e==="right"?"left":"right"},xPlus(e,s){return e-s},leftForLtr(e,s){return e-s}}},er=function(){return{x(i){return i},setWidth(i){},textAlign(i){return i},xPlus(i,t){return i+t},leftForLtr(i,t){return i}}};function Yt(i,t,e){return i?tr(t,e):er()}function $n(i,t){let e,s;(t==="ltr"||t==="rtl")&&(e=i.canvas.style,s=[e.getPropertyValue("direction"),e.getPropertyPriority("direction")],e.setProperty("direction",t,"important"),i.prevTextDirection=s)}function Yn(i,t){t!==void 0&&(delete i.prevTextDirection,i.canvas.style.setProperty("direction",t[0],t[1]))}function Xn(i){return i==="angle"?{between:me,compare:ia,normalize:q}:{between:gt,compare:(t,e)=>t-e,normalize:t=>t}}function xs({start:i,end:t,count:e,loop:s,style:n}){return{start:i%e,end:t%e,loop:s&&(t-i+1)%e===0,style:n}}function ir(i,t,e){const{property:s,start:n,end:o}=e,{between:a,normalize:r}=Xn(s),l=t.length;let{start:c,end:h,loop:d}=i,u,f;if(d){for(c+=l,h+=l,u=0,f=l;ul(n,v,b)&&r(n,v)!==0,_=()=>r(o,b)===0||l(o,v,b),k=()=>p||y(),S=()=>!p||_();for(let w=h,P=h;w<=d;++w)x=t[w%a],!x.skip&&(b=c(x[s]),b!==v&&(p=l(b,n,o),m===null&&k()&&(m=r(b,n)===0?w:P),m!==null&&S()&&(g.push(xs({start:m,end:w,loop:u,count:a,style:f})),m=null),P=w,v=b));return m!==null&&g.push(xs({start:m,end:d,loop:u,count:a,style:f})),g}function Kn(i,t){const e=[],s=i.segments;for(let n=0;nn&&i[o%t].skip;)o--;return o%=t,{start:n,end:o}}function nr(i,t,e,s){const n=i.length,o=[];let a=t,r=i[t],l;for(l=t+1;l<=e;++l){const c=i[l%n];c.skip||c.stop?r.skip||(s=!1,o.push({start:t%n,end:(l-1)%n,loop:s}),t=a=c.stop?l:null):(a=l,r.skip&&(t=l)),r=c}return a!==null&&o.push({start:t%n,end:a%n,loop:s}),o}function or(i,t){const e=i.points,s=i.options.spanGaps,n=e.length;if(!n)return[];const o=!!i._loop,{start:a,end:r}=sr(e,n,o,s);if(s===!0)return _s(i,[{start:a,end:r,loop:o}],e,t);const l=rr({chart:t,initial:e.initial,numSteps:a,currentStep:Math.min(s-e.start,a)}))}_refresh(){this._request||(this._running=!0,this._request=Tn.call(window,()=>{this._update(),this._request=null,this._running&&this._refresh()}))}_update(t=Date.now()){let e=0;this._charts.forEach((s,n)=>{if(!s.running||!s.items.length)return;const o=s.items;let a=o.length-1,r=!1,l;for(;a>=0;--a)l=o[a],l._active?(l._total>s.duration&&(s.duration=l._total),l.tick(t),r=!0):(o[a]=o[o.length-1],o.pop());r&&(n.draw(),this._notify(n,s,t,"progress")),o.length||(s.running=!1,this._notify(n,s,t,"complete"),s.initial=!1),e+=o.length}),this._lastDate=t,e===0&&(this._running=!1)}_getAnims(t){const e=this._charts;let s=e.get(t);return s||(s={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,s)),s}listen(t,e,s){this._getAnims(t).listeners[e].push(s)}add(t,e){!e||!e.length||this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((s,n)=>Math.max(s,n._duration),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!(!e||!e.running||!e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const s=e.items;let n=s.length-1;for(;n>=0;--n)s[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var dt=new cr;const vs="transparent",hr={boolean(i,t,e){return e>.5?t:i},color(i,t,e){const s=ds(i||vs),n=s.valid&&ds(t||vs);return n&&n.valid?n.mix(s,e).hexString():t},number(i,t,e){return i+(t-i)*e}};class dr{constructor(t,e,s,n){const o=e[s];n=se([t.to,n,o,t.from]);const a=se([t.from,o,n]);this._active=!0,this._fn=t.fn||hr[t.type||typeof a],this._easing=he[t.easing]||he.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=s,this._from=a,this._to=n,this._promises=void 0}active(){return this._active}update(t,e,s){if(this._active){this._notify(!1);const n=this._target[this._prop],o=s-this._start,a=this._duration-o;this._start=s,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=o,this._loop=!!t.loop,this._to=se([t.to,e,n,t.from]),this._from=se([t.from,n,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,s=this._duration,n=this._prop,o=this._from,a=this._loop,r=this._to;let l;if(this._active=o!==r&&(a||e1?2-l:l,l=this._easing(Math.min(1,Math.max(0,l))),this._target[n]=this._fn(o,r,l)}wait(){const t=this._promises||(this._promises=[]);return new Promise((e,s)=>{t.push({res:e,rej:s})})}_notify(t){const e=t?"res":"rej",s=this._promises||[];for(let n=0;n{const o=t[n];if(!T(o))return;const a={};for(const r of e)a[r]=o[r];(V(o.properties)&&o.properties||[n]).forEach(r=>{(r===n||!s.has(r))&&s.set(r,a)})})}_animateOptions(t,e){const s=e.options,n=fr(t,s);if(!n)return[];const o=this._createAnimations(n,s);return s.$shared&&ur(t.options.$animations,s).then(()=>{t.options=s},()=>{}),o}_createAnimations(t,e){const s=this._properties,n=[],o=t.$animations||(t.$animations={}),a=Object.keys(e),r=Date.now();let l;for(l=a.length-1;l>=0;--l){const c=a[l];if(c.charAt(0)==="$")continue;if(c==="options"){n.push(...this._animateOptions(t,e));continue}const h=e[c];let d=o[c];const u=s.get(c);if(d)if(u&&d.active()){d.update(u,h,r);continue}else d.cancel();if(!u||!u.duration){t[c]=h;continue}o[c]=d=new dr(u,t,c,h),n.push(d)}return n}update(t,e){if(this._properties.size===0){Object.assign(t,e);return}const s=this._createAnimations(t,e);if(s.length)return dt.add(this._chart,s),!0}}function ur(i,t){const e=[],s=Object.keys(t);for(let n=0;n0||!e&&o<0)return n.index}return null}function ws(i,t){const{chart:e,_cachedMeta:s}=i,n=e._stacks||(e._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,c=a.axis,h=br(o,a,s),d=t.length;let u;for(let f=0;fe[s].axis===t).shift()}function yr(i,t){return wt(i,{active:!1,dataset:void 0,datasetIndex:t,index:t,mode:"default",type:"dataset"})}function vr(i,t,e){return wt(i,{active:!1,dataIndex:t,parsed:void 0,raw:void 0,element:e,index:t,mode:"default",type:"data"})}function Zt(i,t){const e=i.controller.index,s=i.vScale&&i.vScale.axis;if(s){t=t||i._parsed;for(const n of t){const o=n._stacks;if(!o||o[s]===void 0||o[s][e]===void 0)return;delete o[s][e],o[s]._visualValues!==void 0&&o[s]._visualValues[e]!==void 0&&delete o[s]._visualValues[e]}}}const ui=i=>i==="reset"||i==="none",Ps=(i,t)=>t?i:Object.assign({},i),Mr=(i,t,e)=>i&&!t.hidden&&t._stacked&&{keys:Zn(e,!0),values:null};class ot{constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=hi(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&console.warn("Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options")}updateIndex(t){this.index!==t&&Zt(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,s=this.getDataset(),n=(d,u,f,g)=>d==="x"?u:d==="r"?g:f,o=e.xAxisID=D(s.xAxisID,di(t,"x")),a=e.yAxisID=D(s.yAxisID,di(t,"y")),r=e.rAxisID=D(s.rAxisID,di(t,"r")),l=e.indexAxis,c=e.iAxisID=n(l,o,a,r),h=e.vAxisID=n(l,a,o,r);e.xScale=this.getScaleForId(o),e.yScale=this.getScaleForId(a),e.rScale=this.getScaleForId(r),e.iScale=this.getScaleForId(c),e.vScale=this.getScaleForId(h)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&ls(this._data,this),t._stacked&&Zt(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),s=this._data;if(T(e)){const n=this._cachedMeta;this._data=mr(e,n)}else if(s!==e){if(s){ls(s,this);const n=this._cachedMeta;Zt(n),n._parsed=[]}e&&Object.isExtensible(e)&&aa(e,this),this._syncList=[],this._data=e}}addElements(){const t=this._cachedMeta;this._dataCheck(),this.datasetElementType&&(t.dataset=new this.datasetElementType)}buildOrUpdateElements(t){const e=this._cachedMeta,s=this.getDataset();let n=!1;this._dataCheck();const o=e._stacked;e._stacked=hi(e.vScale,e),e.stack!==s.stack&&(n=!0,Zt(e),e.stack=s.stack),this._resyncElements(t),(n||o!==e._stacked)&&(ws(this,e._parsed),e._stacked=hi(e.vScale,e))}configure(){const t=this.chart.config,e=t.datasetScopeKeys(this._type),s=t.getOptionScopes(this.getDataset(),e,!0);this.options=t.createResolver(s,this.getContext()),this._parsing=this.options.parsing,this._cachedDataOpts={}}parse(t,e){const{_cachedMeta:s,_data:n}=this,{iScale:o,_stacked:a}=s,r=o.axis;let l=t===0&&e===n.length?!0:s._sorted,c=t>0&&s._parsed[t-1],h,d,u;if(this._parsing===!1)s._parsed=n,s._sorted=!0,u=n;else{V(n[t])?u=this.parseArrayData(s,n,t,e):T(n[t])?u=this.parseObjectData(s,n,t,e):u=this.parsePrimitiveData(s,n,t,e);const f=()=>d[r]===null||c&&d[r]p||d=0;--u)if(!g()){this.updateRangeFromParsed(c,t,f,l);break}}return c}getAllParsedValues(t){const e=this._cachedMeta._parsed,s=[];let n,o,a;for(n=0,o=e.length;n=0&&tthis.getContext(s,n,e),p=c.resolveNamedOptions(u,f,g,d);return p.$shared&&(p.$shared=l,o[a]=Object.freeze(Ps(p,l))),p}_resolveAnimations(t,e,s){const n=this.chart,o=this._cachedDataOpts,a=`animation-${e}`,r=o[a];if(r)return r;let l;if(n.options.animation!==!1){const h=this.chart.config,d=h.datasetAnimationScopeKeys(this._type,e),u=h.getOptionScopes(this.getDataset(),d);l=h.createResolver(u,this.getContext(t,s,e))}const c=new Gn(n,l&&l.animations);return l&&l._cacheable&&(o[a]=Object.freeze(c)),c}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||ui(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const s=this.resolveDataElementOptions(t,e),n=this._sharedOptions,o=this.getSharedOptions(s),a=this.includeOptions(e,o)||o!==n;return this.updateSharedOptions(o,e,s),{sharedOptions:o,includeOptions:a}}updateElement(t,e,s,n){ui(n)?Object.assign(t,s):this._resolveAnimations(e,n).update(t,s)}updateSharedOptions(t,e,s){t&&!ui(e)&&this._resolveAnimations(void 0,e).update(t,s)}_setStyle(t,e,s,n){t.active=n;const o=this.getStyle(e,n);this._resolveAnimations(e,s,n).update(t,{options:!n&&this.getSharedOptions(o)||o})}removeHoverStyle(t,e,s){this._setStyle(t,s,"active",!1)}setHoverStyle(t,e,s){this._setStyle(t,s,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,s=this._cachedMeta.data;for(const[r,l,c]of this._syncList)this[r](l,c);this._syncList=[];const n=s.length,o=e.length,a=Math.min(o,n);a&&this.parse(0,a),o>n?this._insertElements(n,o-n,t):o{for(c.length+=e,r=c.length-1;r>=a;r--)c[r]=c[r-e]};for(l(o),r=t;rn-o))}return i._cache.$bar}function Sr(i){const t=i.iScale,e=kr(t,i.type);let s=t._length,n,o,a,r;const l=()=>{a===32767||a===-32768||(pe(r)&&(s=Math.min(s,Math.abs(a-r)||s)),r=a)};for(n=0,o=e.length;n0?n[i-1]:null,r=iMath.abs(r)&&(l=r,c=a),t[e.axis]=c,t._custom={barStart:l,barEnd:c,start:n,end:o,min:a,max:r}}function Jn(i,t,e,s){return V(i)?Dr(i,t,e,s):t[e.axis]=e.parse(i,s),t}function Ds(i,t,e,s){const n=i.iScale,o=i.vScale,a=n.getLabels(),r=n===o,l=[];let c,h,d,u;for(c=e,h=e+s;c=e?1:-1)}function Ar(i){let t,e,s,n,o;return i.horizontal?(t=i.base>i.x,e="left",s="right"):(t=i.baseh.controller.options.grouped),o=s.options.stacked,a=[],r=this._cachedMeta.controller.getParsed(e),l=r&&r[s.axis],c=h=>{const d=h._parsed.find(f=>f[s.axis]===l),u=d&&d[h.vScale.axis];if(C(u)||isNaN(u))return!0};for(const h of n)if(!(e!==void 0&&c(h))&&((o===!1||a.indexOf(h.stack)===-1||o===void 0&&h.stack===void 0)&&a.push(h.stack),h.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getAxisCount(){return this._getAxis().length}getFirstScaleIdForIndexAxis(){const t=this.chart.scales,e=this.chart.options.indexAxis;return Object.keys(t).filter(s=>t[s].axis===e).shift()}_getAxis(){const t={},e=this.getFirstScaleIdForIndexAxis();for(const s of this.chart.data.datasets)t[D(this.chart.options.indexAxis==="x"?s.xAxisID:s.yAxisID,e)]=!0;return Object.keys(t)}_getStackIndex(t,e,s){const n=this._getStacks(t,s),o=e!==void 0?n.indexOf(e):-1;return o===-1?n.length-1:o}_getRuler(){const t=this.options,e=this._cachedMeta,s=e.iScale,n=[];let o,a;for(o=0,a=e.data.length;o=0;--s)e=Math.max(e,t[s].size(this.resolveDataElementOptions(s))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart.data.labels||[],{xScale:n,yScale:o}=e,a=this.getParsed(t),r=n.getLabelForValue(a.x),l=o.getLabelForValue(a.y),c=a._custom;return{label:s[t]||"",value:"("+r+", "+l+(c?", "+c:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,s,n){const o=n==="reset",{iScale:a,vScale:r}=this._cachedMeta,{sharedOptions:l,includeOptions:c}=this._getSharedOptions(e,n),h=a.axis,d=r.axis;for(let u=e;ume(v,r,l,!0)?1:Math.max(y,y*e,_,_*e),g=(v,y,_)=>me(v,r,l,!0)?-1:Math.min(y,y*e,_,_*e),p=f(0,c,d),m=f(j,h,u),b=g(R,c,d),x=g(R+j,h,u);s=(p-b)/2,n=(m-x)/2,o=-(p+b)/2,a=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}class It extends ot{constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const s=this.getDataset().data,n=this._cachedMeta;if(this._parsing===!1)n._parsed=s;else{let o=l=>+s[l];if(T(s[t])){const{key:l="value"}=this._parsing;o=c=>+kt(s[c],l)}let a,r;for(a=t,r=t+e;a0&&!isNaN(t)?z*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,n=s.data.labels||[],o=Me(e._parsed[t],s.options.locale);return{label:n[t]||"",value:o}}getMaxBorderWidth(t){let e=0;const s=this.chart;let n,o,a,r,l;if(!t){for(n=0,o=s.data.datasets.length;nt!=="spacing",_indexable:t=>t!=="spacing"&&!t.startsWith("borderDash")&&!t.startsWith("hoverBorderDash")}),M(It,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data,{labels:{pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=t.legend.options;return e.labels.length&&e.datasets.length?e.labels.map((l,c)=>{const d=t.getDatasetMeta(0).controller.getStyle(c);return{text:l,fillStyle:d.backgroundColor,fontColor:o,hidden:!t.getDataVisibility(c),lineDash:d.borderDash,lineDashOffset:d.borderDashOffset,lineJoin:d.borderJoinStyle,lineWidth:d.borderWidth,strokeStyle:d.borderColor,textAlign:n,pointStyle:s,borderRadius:a&&(r||d.borderRadius),index:c}}):[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}}});class Ve extends ot{initialize(){this.enableOptionSharing=!0,this.supportsDecimation=!0,super.initialize()}update(t){const e=this._cachedMeta,{dataset:s,data:n=[],_dataset:o}=e,a=this.chart._animationsDisabled;let{start:r,count:l}=Rn(e,n,a);this._drawStart=r,this._drawCount=l,En(e)&&(r=0,l=n.length),s._chart=this.chart,s._datasetIndex=this.index,s._decimated=!!o._decimated,s.points=n;const c=this.resolveDatasetElementOptions(t);this.options.showLine||(c.borderWidth=0),c.segment=this.options.segment,this.updateElement(s,void 0,{animated:!a,options:c},t),this.updateElements(n,r,l,t)}updateElements(t,e,s,n){const o=n==="reset",{iScale:a,vScale:r,_stacked:l,_dataset:c}=this._cachedMeta,{sharedOptions:h,includeOptions:d}=this._getSharedOptions(e,n),u=a.axis,f=r.axis,{spanGaps:g,segment:p}=this.options,m=Xt(g)?g:Number.POSITIVE_INFINITY,b=this.chart._animationsDisabled||o||n==="none",x=e+s,v=t.length;let y=e>0&&this.getParsed(e-1);for(let _=0;_=x){S.skip=!0;continue}const w=this.getParsed(_),P=C(w[f]),O=S[u]=a.getPixelForValue(w[u],_),A=S[f]=o||P?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,w,l):w[f],_);S.skip=isNaN(O)||isNaN(A)||P,S.stop=_>0&&Math.abs(w[u]-y[u])>m,p&&(S.parsed=w,S.raw=c.data[_]),d&&(S.options=h||this.resolveDataElementOptions(_,k.active?"active":n)),b||this.updateElement(k,_,S,n),y=w}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,s=e.options&&e.options.borderWidth||0,n=t.data||[];if(!n.length)return s;const o=n[0].size(this.resolveDataElementOptions(0)),a=n[n.length-1].size(this.resolveDataElementOptions(n.length-1));return Math.max(s,o,a)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}}M(Ve,"id","line"),M(Ve,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),M(Ve,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});class ue extends ot{constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,s=this.chart,n=s.data.labels||[],o=Me(e._parsed[t].r,s.options.locale);return{label:n[t]||"",value:o}}parseObjectData(t,e,s,n){return Hn.bind(this)(t,e,s,n)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach((s,n)=>{const o=this.getParsed(n).r;!isNaN(o)&&this.chart.getDataVisibility(n)&&(oe.max&&(e.max=o))}),e}_updateRadius(){const t=this.chart,e=t.chartArea,s=t.options,n=Math.min(e.right-e.left,e.bottom-e.top),o=Math.max(n/2,0),a=Math.max(s.cutoutPercentage?o/100*s.cutoutPercentage:1,0),r=(o-a)/t.getVisibleDatasetCount();this.outerRadius=o-r*this.index,this.innerRadius=this.outerRadius-r}updateElements(t,e,s,n){const o=n==="reset",a=this.chart,l=a.options.animation,c=this._cachedMeta.rScale,h=c.xCenter,d=c.yCenter,u=c.getIndexAngle(0)-.5*R;let f=u,g;const p=360/this.countVisibleElements();for(g=0;g{!isNaN(this.getParsed(n).r)&&this.chart.getDataVisibility(n)&&e++}),e}_computeAngle(t,e,s){return this.chart.getDataVisibility(t)?nt(this.resolveDataElementOptions(t,e).angle||s):0}}M(ue,"id","polarArea"),M(ue,"defaults",{dataElementType:"arc",animation:{animateRotate:!0,animateScale:!0},animations:{numbers:{type:"number",properties:["x","y","startAngle","endAngle","innerRadius","outerRadius"]}},indexAxis:"r",startAngle:0}),M(ue,"overrides",{aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:s,color:n}}=t.legend.options;return e.labels.map((o,a)=>{const l=t.getDatasetMeta(0).controller.getStyle(a);return{text:o,fillStyle:l.backgroundColor,strokeStyle:l.borderColor,fontColor:n,lineWidth:l.borderWidth,pointStyle:s,hidden:!t.getDataVisibility(a),index:a}})}return[]}},onClick(t,e,s){s.chart.toggleDataVisibility(e.index),s.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}});class wi extends It{}M(wi,"id","pie"),M(wi,"defaults",{cutout:0,rotation:0,circumference:360,radius:"100%"});class We extends ot{getLabelAndValue(t){const e=this._cachedMeta.vScale,s=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(s[e.axis])}}parseObjectData(t,e,s,n){return Hn.bind(this)(t,e,s,n)}update(t){const e=this._cachedMeta,s=e.dataset,n=e.data||[],o=e.iScale.getLabels();if(s.points=n,t!=="resize"){const a=this.resolveDatasetElementOptions(t);this.options.showLine||(a.borderWidth=0);const r={_loop:!0,_fullLoop:o.length===n.length,options:a};this.updateElement(s,void 0,r,t)}this.updateElements(n,0,n.length,t)}updateElements(t,e,s,n){const o=this._cachedMeta.rScale,a=n==="reset";for(let r=e;r0&&this.getParsed(e-1);for(let y=e;y0&&Math.abs(k[f]-v[f])>b,m&&(S.parsed=k,S.raw=c.data[y]),u&&(S.options=d||this.resolveDataElementOptions(y,_.active?"active":n)),x||this.updateElement(_,y,S,n),v=k}this.updateSharedOptions(d,n,h)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let r=0;for(let l=e.length-1;l>=0;--l)r=Math.max(r,e[l].size(this.resolveDataElementOptions(l))/2);return r>0&&r}const s=t.dataset,n=s.options&&s.options.borderWidth||0;if(!e.length)return n;const o=e[0].size(this.resolveDataElementOptions(0)),a=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(n,o,a)/2}}M(Ne,"id","scatter"),M(Ne,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),M(Ne,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});var Er=Object.freeze({__proto__:null,BarController:ze,BubbleController:Be,DoughnutController:It,LineController:Ve,PieController:wi,PolarAreaController:ue,RadarController:We,ScatterController:Ne});function Ct(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class Zi{constructor(t){M(this,"options");this.options=t||{}}static override(t){Object.assign(Zi.prototype,t)}init(){}formats(){return Ct()}parse(){return Ct()}format(){return Ct()}add(){return Ct()}diff(){return Ct()}startOf(){return Ct()}endOf(){return Ct()}}var Ir={_date:Zi};function Fr(i,t,e,s){const{controller:n,data:o,_sorted:a}=i,r=n._cachedMeta.iScale,l=i.dataset&&i.dataset.options?i.dataset.options.spanGaps:null;if(r&&t===r.axis&&t!=="r"&&a&&o.length){const c=r._reversePixels?na:pt;if(s){if(n._sharedOptions){const h=o[0],d=typeof h.getRange=="function"&&h.getRange(t);if(d){const u=c(o,t,e-d),f=c(o,t,e+d);return{lo:u.lo,hi:f.hi}}}}else{const h=c(o,t,e);if(l){const{vScale:d}=n._cachedMeta,{_parsed:u}=i,f=u.slice(0,h.lo+1).reverse().findIndex(p=>!C(p[d.axis]));h.lo-=Math.max(0,f);const g=u.slice(h.hi).findIndex(p=>!C(p[d.axis]));h.hi+=Math.max(0,g)}return h}}return{lo:0,hi:o.length-1}}function ni(i,t,e,s,n){const o=i.getSortedVisibleDatasetMetas(),a=e[t];for(let r=0,l=o.length;r{l[a]&&l[a](t[e],n)&&(o.push({element:l,datasetIndex:c,index:h}),r=r||l.inRange(t.x,t.y,n))}),s&&!r?[]:o}var Wr={modes:{index(i,t,e,s){const n=Lt(t,i),o=e.axis||"x",a=e.includeInvisible||!1,r=e.intersect?gi(i,n,o,s,a):pi(i,n,o,!1,s,a),l=[];return r.length?(i.getSortedVisibleDatasetMetas().forEach(c=>{const h=r[0].index,d=c.data[h];d&&!d.skip&&l.push({element:d,datasetIndex:c.index,index:h})}),l):[]},dataset(i,t,e,s){const n=Lt(t,i),o=e.axis||"xy",a=e.includeInvisible||!1;let r=e.intersect?gi(i,n,o,s,a):pi(i,n,o,!1,s,a);if(r.length>0){const l=r[0].datasetIndex,c=i.getDatasetMeta(l).data;r=[];for(let h=0;he.pos===t)}function Ts(i,t){return i.filter(e=>Qn.indexOf(e.pos)===-1&&e.box.axis===t)}function Qt(i,t){return i.sort((e,s)=>{const n=t?s:e,o=t?e:s;return n.weight===o.weight?n.index-o.index:n.weight-o.weight})}function Nr(i){const t=[];let e,s,n,o,a,r;for(e=0,s=(i||[]).length;ec.box.fullSize),!0),s=Qt(Jt(t,"left"),!0),n=Qt(Jt(t,"right")),o=Qt(Jt(t,"top"),!0),a=Qt(Jt(t,"bottom")),r=Ts(t,"x"),l=Ts(t,"y");return{fullSize:e,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Jt(t,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}function Ls(i,t,e,s){return Math.max(i[e],t[e])+Math.max(i[s],t[s])}function to(i,t){i.top=Math.max(i.top,t.top),i.left=Math.max(i.left,t.left),i.bottom=Math.max(i.bottom,t.bottom),i.right=Math.max(i.right,t.right)}function Yr(i,t,e,s){const{pos:n,box:o}=e,a=i.maxPadding;if(!T(n)){e.size&&(i[n]-=e.size);const d=s[e.stack]||{size:0,count:1};d.size=Math.max(d.size,e.horizontal?o.height:o.width),e.size=d.size/d.count,i[n]+=e.size}o.getPadding&&to(a,o.getPadding());const r=Math.max(0,t.outerWidth-Ls(a,i,"left","right")),l=Math.max(0,t.outerHeight-Ls(a,i,"top","bottom")),c=r!==i.w,h=l!==i.h;return i.w=r,i.h=l,e.horizontal?{same:c,other:h}:{same:h,other:c}}function Xr(i){const t=i.maxPadding;function e(s){const n=Math.max(t[s]-i[s],0);return i[s]+=n,n}i.y+=e("top"),i.x+=e("left"),e("right"),e("bottom")}function Ur(i,t){const e=t.maxPadding;function s(n){const o={left:0,top:0,right:0,bottom:0};return n.forEach(a=>{o[a]=Math.max(t[a],e[a])}),o}return s(i?["left","right"]:["top","bottom"])}function ne(i,t,e,s){const n=[];let o,a,r,l,c,h;for(o=0,a=i.length,c=0;o{typeof p.beforeLayout=="function"&&p.beforeLayout()});const h=l.reduce((p,m)=>m.box.options&&m.box.options.display===!1?p:p+1,0)||1,d=Object.freeze({outerWidth:t,outerHeight:e,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/h,hBoxMaxHeight:a/2}),u=Object.assign({},n);to(u,Z(s));const f=Object.assign({maxPadding:u,w:o,h:a,x:n.left,y:n.top},n),g=jr(l.concat(c),d);ne(r.fullSize,f,d,g),ne(l,f,d,g),ne(c,f,d,g)&&ne(l,f,d,g),Xr(f),Rs(r.leftAndTop,f,d,g),f.x+=f.w,f.y+=f.h,Rs(r.rightAndBottom,f,d,g),i.chartArea={left:f.left,top:f.top,right:f.left+f.w,bottom:f.top+f.h,height:f.h,width:f.w},E(r.chartArea,p=>{const m=p.box;Object.assign(m,i.chartArea),m.update(f.w,f.h,{left:0,top:0,right:0,bottom:0})})}};class eo{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,s){}removeEventListener(t,e,s){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,s,n){return e=Math.max(0,e||t.width),s=s||t.height,{width:e,height:Math.max(0,n?Math.floor(e/n):s)}}isAttached(t){return!0}updateConfig(t){}}class Kr extends eo{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const He="$chartjs",qr={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},Es=i=>i===null||i==="";function Gr(i,t){const e=i.style,s=i.getAttribute("height"),n=i.getAttribute("width");if(i[He]={initial:{height:s,width:n,style:{display:e.display,height:e.height,width:e.width}}},e.display=e.display||"block",e.boxSizing=e.boxSizing||"border-box",Es(n)){const o=bs(i,"width");o!==void 0&&(i.width=o)}if(Es(s))if(i.style.height==="")i.height=i.width/(t||2);else{const o=bs(i,"height");o!==void 0&&(i.height=o)}return i}const io=Za?{passive:!0}:!1;function Zr(i,t,e){i&&i.addEventListener(t,e,io)}function Jr(i,t,e){i&&i.canvas&&i.canvas.removeEventListener(t,e,io)}function Qr(i,t){const e=qr[i.type]||i.type,{x:s,y:n}=Lt(i,t);return{type:e,chart:t,native:i,x:s!==void 0?s:null,y:n!==void 0?n:null}}function Ze(i,t){for(const e of i)if(e===t||e.contains(t))return!0}function tl(i,t,e){const s=i.canvas,n=new MutationObserver(o=>{let a=!1;for(const r of o)a=a||Ze(r.addedNodes,s),a=a&&!Ze(r.removedNodes,s);a&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}function el(i,t,e){const s=i.canvas,n=new MutationObserver(o=>{let a=!1;for(const r of o)a=a||Ze(r.removedNodes,s),a=a&&!Ze(r.addedNodes,s);a&&e()});return n.observe(document,{childList:!0,subtree:!0}),n}const xe=new Map;let Is=0;function so(){const i=window.devicePixelRatio;i!==Is&&(Is=i,xe.forEach((t,e)=>{e.currentDevicePixelRatio!==i&&t()}))}function il(i,t){xe.size||window.addEventListener("resize",so),xe.set(i,t)}function sl(i){xe.delete(i),xe.size||window.removeEventListener("resize",so)}function nl(i,t,e){const s=i.canvas,n=s&&Gi(s);if(!n)return;const o=Ln((r,l)=>{const c=n.clientWidth;e(r,l),c{const l=r[0],c=l.contentRect.width,h=l.contentRect.height;c===0&&h===0||o(c,h)});return a.observe(n),il(i,o),a}function mi(i,t,e){e&&e.disconnect(),t==="resize"&&sl(i)}function ol(i,t,e){const s=i.canvas,n=Ln(o=>{i.ctx!==null&&e(Qr(o,i))},i);return Zr(s,t,n),n}class al extends eo{acquireContext(t,e){const s=t&&t.getContext&&t.getContext("2d");return s&&s.canvas===t?(Gr(t,e),s):null}releaseContext(t){const e=t.canvas;if(!e[He])return!1;const s=e[He].initial;["height","width"].forEach(o=>{const a=s[o];C(a)?e.removeAttribute(o):e.setAttribute(o,a)});const n=s.style||{};return Object.keys(n).forEach(o=>{e.style[o]=n[o]}),e.width=e.width,delete e[He],!0}addEventListener(t,e,s){this.removeEventListener(t,e);const n=t.$proxies||(t.$proxies={}),a={attach:tl,detach:el,resize:nl}[e]||ol;n[e]=a(t,e,s)}removeEventListener(t,e){const s=t.$proxies||(t.$proxies={}),n=s[e];if(!n)return;({attach:mi,detach:mi,resize:mi}[e]||Jr)(t,e,n),s[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,s,n){return Ga(t,e,s,n)}isAttached(t){const e=t&&Gi(t);return!!(e&&e.isConnected)}}function rl(i){return!qi()||typeof OffscreenCanvas<"u"&&i instanceof OffscreenCanvas?Kr:al}class at{constructor(){M(this,"x");M(this,"y");M(this,"active",!1);M(this,"options");M(this,"$animations")}tooltipPosition(t){const{x:e,y:s}=this.getProps(["x","y"],t);return{x:e,y:s}}hasValue(){return Xt(this.x)&&Xt(this.y)}getProps(t,e){const s=this.$animations;if(!e||!s)return this;const n={};return t.forEach(o=>{n[o]=s[o]&&s[o].active()?s[o]._to:this[o]}),n}}M(at,"defaults",{}),M(at,"defaultRoutes");function ll(i,t){const e=i.options.ticks,s=cl(i),n=Math.min(e.maxTicksLimit||s,s),o=e.major.enabled?dl(t):[],a=o.length,r=o[0],l=o[a-1],c=[];if(a>n)return ul(t,c,o,a/n),c;const h=hl(o,t,n);if(a>0){let d,u;const f=a>1?Math.round((l-r)/(a-1)):null;for(Te(t,c,h,C(f)?0:r-f,r),d=0,u=a-1;dn)return l}return Math.max(n,1)}function dl(i){const t=[];let e,s;for(e=0,s=i.length;ei==="left"?"right":i==="right"?"left":i,Fs=(i,t,e)=>t==="top"||t==="left"?i[t]+e:i[t]-e,zs=(i,t)=>Math.min(t||i,i);function Bs(i,t){const e=[],s=i.length/t,n=i.length;let o=0;for(;oa+r)))return l}function ml(i,t){E(i,e=>{const s=e.gc,n=s.length/2;let o;if(n>t){for(o=0;os?s:e,s=n&&e>s?e:s,{min:et(e,et(s,e)),max:et(s,et(e,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){F(this.options.beforeUpdate,[this])}update(t,e,s){const{beginAtZero:n,grace:o,ticks:a}=this.options,r=a.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=s=Object.assign({left:0,right:0,top:0,bottom:0},s),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+s.left+s.right:this.height+s.top+s.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=Oa(this,o,n),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const l=r=o||s<=1||!this.isHorizontal()){this.labelRotation=n;return}const h=this._getLabelSizes(),d=h.widest.width,u=h.highest.height,f=Y(this.chart.width-d,0,this.maxWidth);r=t.offset?this.maxWidth/s:f/(s-1),d+6>r&&(r=f/(s-(t.offset?.5:1)),l=this.maxHeight-te(t.grid)-e.padding-Vs(t.title,this.chart.options.font),c=Math.sqrt(d*d+u*u),a=Ni(Math.min(Math.asin(Y((h.highest.height+6)/r,-1,1)),Math.asin(Y(l/c,-1,1))-Math.asin(Y(u/c,-1,1)))),a=Math.max(n,Math.min(o,a))),this.labelRotation=a}afterCalculateLabelRotation(){F(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){F(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:s,title:n,grid:o}}=this,a=this._isVisible(),r=this.isHorizontal();if(a){const l=Vs(n,e.options.font);if(r?(t.width=this.maxWidth,t.height=te(o)+l):(t.height=this.maxHeight,t.width=te(o)+l),s.display&&this.ticks.length){const{first:c,last:h,widest:d,highest:u}=this._getLabelSizes(),f=s.padding*2,g=nt(this.labelRotation),p=Math.cos(g),m=Math.sin(g);if(r){const b=s.mirror?0:m*d.width+p*u.height;t.height=Math.min(this.maxHeight,t.height+b+f)}else{const b=s.mirror?0:p*d.width+m*u.height;t.width=Math.min(this.maxWidth,t.width+b+f)}this._calculatePadding(c,h,m,p)}}this._handleMargins(),r?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}_calculatePadding(t,e,s,n){const{ticks:{align:o,padding:a},position:r}=this.options,l=this.labelRotation!==0,c=r!=="top"&&this.axis==="x";if(this.isHorizontal()){const h=this.getPixelForTick(0)-this.left,d=this.right-this.getPixelForTick(this.ticks.length-1);let u=0,f=0;l?c?(u=n*t.width,f=s*e.height):(u=s*t.height,f=n*e.width):o==="start"?f=e.width:o==="end"?u=t.width:o!=="inner"&&(u=t.width/2,f=e.width/2),this.paddingLeft=Math.max((u-h+a)*this.width/(this.width-h),0),this.paddingRight=Math.max((f-d+a)*this.width/(this.width-d),0)}else{let h=e.height/2,d=t.height/2;o==="start"?(h=0,d=t.height):o==="end"&&(h=e.height,d=0),this.paddingTop=h+a,this.paddingBottom=d+a}}_handleMargins(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}afterFit(){F(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return e==="top"||e==="bottom"||t==="x"}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){this.beforeTickToLabelConversion(),this.generateTickLabels(t);let e,s;for(e=0,s=t.length;e({width:a[P]||0,height:r[P]||0});return{first:w(0),last:w(e-1),widest:w(k),highest:w(S),widths:a,heights:r}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return sa(this._alignToPixels?At(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&tr*n?r/s:l/n:l*n0}_computeGridLineItems(t){const e=this.axis,s=this.chart,n=this.options,{grid:o,position:a,border:r}=n,l=o.offset,c=this.isHorizontal(),d=this.ticks.length+(l?1:0),u=te(o),f=[],g=r.setContext(this.getContext()),p=g.display?g.width:0,m=p/2,b=function(B){return At(s,B,p)};let x,v,y,_,k,S,w,P,O,A,L,X;if(a==="top")x=b(this.bottom),S=this.bottom-u,P=x-m,A=b(t.top)+m,X=t.bottom;else if(a==="bottom")x=b(this.top),A=t.top,X=b(t.bottom)-m,S=x+m,P=this.top+u;else if(a==="left")x=b(this.right),k=this.right-u,w=x-m,O=b(t.left)+m,L=t.right;else if(a==="right")x=b(this.left),O=t.left,L=b(t.right)-m,k=x+m,w=this.left+u;else if(e==="x"){if(a==="center")x=b((t.top+t.bottom)/2+.5);else if(T(a)){const B=Object.keys(a)[0],H=a[B];x=b(this.chart.scales[B].getPixelForValue(H))}A=t.top,X=t.bottom,S=x+m,P=S+u}else if(e==="y"){if(a==="center")x=b((t.left+t.right)/2);else if(T(a)){const B=Object.keys(a)[0],H=a[B];x=b(this.chart.scales[B].getPixelForValue(H))}k=x-m,w=k-u,O=t.left,L=t.right}const tt=D(n.ticks.maxTicksLimit,d),I=Math.max(1,Math.ceil(d/tt));for(v=0;v0&&(Dt-=Pt/2);break}ke={left:Dt,top:Gt,width:Pt+Ht.width,height:qt+Ht.height,color:I.backdropColor}}m.push({label:y,font:P,textOffset:L,options:{rotation:p,color:H,strokeColor:st,strokeWidth:U,textAlign:Nt,textBaseline:X,translation:[_,k],backdrop:ke}})}return m}_getXAxisLabelAlignment(){const{position:t,ticks:e}=this.options;if(-nt(this.labelRotation))return t==="top"?"left":"right";let n="center";return e.align==="start"?n="left":e.align==="end"?n="right":e.align==="inner"&&(n="inner"),n}_getYAxisLabelAlignment(t){const{position:e,ticks:{crossAlign:s,mirror:n,padding:o}}=this.options,a=this._getLabelSizes(),r=t+o,l=a.widest.width;let c,h;return e==="left"?n?(h=this.right+o,s==="near"?c="left":s==="center"?(c="center",h+=l/2):(c="right",h+=l)):(h=this.right-r,s==="near"?c="right":s==="center"?(c="center",h-=l/2):(c="left",h=this.left)):e==="right"?n?(h=this.left+o,s==="near"?c="right":s==="center"?(c="center",h-=l/2):(c="left",h-=l)):(h=this.left+r,s==="near"?c="left":s==="center"?(c="center",h+=l/2):(c="right",h=this.right)):c="right",{textAlign:c,x:h}}_computeLabelArea(){if(this.options.ticks.mirror)return;const t=this.chart,e=this.options.position;if(e==="left"||e==="right")return{top:0,left:this.left,bottom:t.height,right:this.right};if(e==="top"||e==="bottom")return{top:this.top,left:0,bottom:this.bottom,right:t.width}}drawBackground(){const{ctx:t,options:{backgroundColor:e},left:s,top:n,width:o,height:a}=this;e&&(t.save(),t.fillStyle=e,t.fillRect(s,n,o,a),t.restore())}getLineWidthForValue(t){const e=this.options.grid;if(!this._isVisible()||!e.display)return 0;const n=this.ticks.findIndex(o=>o.value===t);return n>=0?e.setContext(this.getContext(n)).lineWidth:0}drawGrid(t){const e=this.options.grid,s=this.ctx,n=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let o,a;const r=(l,c,h)=>{!h.width||!h.color||(s.save(),s.lineWidth=h.width,s.strokeStyle=h.color,s.setLineDash(h.borderDash||[]),s.lineDashOffset=h.borderDashOffset,s.beginPath(),s.moveTo(l.x,l.y),s.lineTo(c.x,c.y),s.stroke(),s.restore())};if(e.display)for(o=0,a=n.length;o{this.draw(o)}}]:[{z:s,draw:o=>{this.drawBackground(),this.drawGrid(o),this.drawTitle()}},{z:n,draw:()=>{this.drawBorder()}},{z:e,draw:o=>{this.drawLabels(o)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),s=this.axis+"AxisID",n=[];let o,a;for(o=0,a=e.length;o{const s=e.split("."),n=s.pop(),o=[i].concat(s).join("."),a=t[e].split("."),r=a.pop(),l=a.join(".");W.route(o,n,l,r)})}function kl(i){return"id"in i&&"defaults"in i}class Sl{constructor(){this.controllers=new Le(ot,"datasets",!0),this.elements=new Le(at,"elements"),this.plugins=new Le(Object,"plugins"),this.scales=new Le(Wt,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,s){[...e].forEach(n=>{const o=s||this._getRegistryForType(n);s||o.isForType(n)||o===this.plugins&&n.id?this._exec(t,o,n):E(n,a=>{const r=s||this._getRegistryForType(a);this._exec(t,r,a)})})}_exec(t,e,s){const n=Wi(t);F(s["before"+n],[],s),e[t](s),F(s["after"+n],[],s)}_getRegistryForType(t){for(let e=0;eo.filter(r=>!a.some(l=>r.plugin.id===l.plugin.id));this._notify(n(e,s),t,"stop"),this._notify(n(s,e),t,"start")}}function Pl(i){const t={},e=[],s=Object.keys(lt.plugins.items);for(let o=0;o1&&Ws(i[0].toLowerCase());if(s)return s}throw new Error(`Cannot determine type of '${i}' axis. Please provide 'axis' or 'position' option.`)}function Ns(i,t,e){if(e[t+"AxisID"]===i)return{axis:t}}function Rl(i,t){if(t.data&&t.data.datasets){const e=t.data.datasets.filter(s=>s.xAxisID===i||s.yAxisID===i);if(e.length)return Ns(i,"x",e[0])||Ns(i,"y",e[0])}return{}}function El(i,t){const e=Bt[i.type]||{scales:{}},s=t.scales||{},n=Pi(i.type,t),o=Object.create(null);return Object.keys(s).forEach(a=>{const r=s[a];if(!T(r))return console.error(`Invalid scale configuration for scale: ${a}`);if(r._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${a}`);const l=Di(a,r,Rl(a,i),W.scales[r.type]),c=Tl(l,n),h=e.scales||{};o[a]=le(Object.create(null),[{axis:l},r,h[l],h[c]])}),i.data.datasets.forEach(a=>{const r=a.type||i.type,l=a.indexAxis||Pi(r,t),h=(Bt[r]||{}).scales||{};Object.keys(h).forEach(d=>{const u=Cl(d,l),f=a[u+"AxisID"]||u;o[f]=o[f]||Object.create(null),le(o[f],[{axis:u},s[f],h[d]])})}),Object.keys(o).forEach(a=>{const r=o[a];le(r,[W.scales[r.type],W.scale])}),o}function no(i){const t=i.options||(i.options={});t.plugins=D(t.plugins,{}),t.scales=El(i,t)}function oo(i){return i=i||{},i.datasets=i.datasets||[],i.labels=i.labels||[],i}function Il(i){return i=i||{},i.data=oo(i.data),no(i),i}const Hs=new Map,ao=new Set;function Re(i,t){let e=Hs.get(i);return e||(e=t(),Hs.set(i,e),ao.add(e)),e}const ee=(i,t,e)=>{const s=kt(t,e);s!==void 0&&i.add(s)};class Fl{constructor(t){this._config=Il(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=oo(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),no(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return Re(t,()=>[[`datasets.${t}`,""]])}datasetAnimationScopeKeys(t,e){return Re(`${t}.transition.${e}`,()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]])}datasetElementScopeKeys(t,e){return Re(`${t}-${e}`,()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]])}pluginScopeKeys(t){const e=t.id,s=this.type;return Re(`${s}-plugin-${e}`,()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]])}_cachedScopes(t,e){const s=this._scopeCache;let n=s.get(t);return(!n||e)&&(n=new Map,s.set(t,n)),n}getOptionScopes(t,e,s){const{options:n,type:o}=this,a=this._cachedScopes(t,s),r=a.get(e);if(r)return r;const l=new Set;e.forEach(h=>{t&&(l.add(t),h.forEach(d=>ee(l,t,d))),h.forEach(d=>ee(l,n,d)),h.forEach(d=>ee(l,Bt[o]||{},d)),h.forEach(d=>ee(l,W,d)),h.forEach(d=>ee(l,ki,d))});const c=Array.from(l);return c.length===0&&c.push(Object.create(null)),ao.has(e)&&a.set(e,c),c}chartOptionScopes(){const{options:t,type:e}=this;return[t,Bt[e]||{},W.datasets[e]||{},{type:e},W,ki]}resolveNamedOptions(t,e,s,n=[""]){const o={$shared:!0},{resolver:a,subPrefixes:r}=js(this._resolverCache,t,n);let l=a;if(Bl(a,e)){o.$shared=!1,s=St(s)?s():s;const c=this.createResolver(t,s,r);l=Ut(a,s,c)}for(const c of e)o[c]=l[c];return o}createResolver(t,e,s=[""],n){const{resolver:o}=js(this._resolverCache,t,s);return T(e)?Ut(o,e,void 0,n):o}}function js(i,t,e){let s=i.get(t);s||(s=new Map,i.set(t,s));const n=e.join();let o=s.get(n);return o||(o={resolver:Xi(t,e),subPrefixes:e.filter(r=>!r.toLowerCase().includes("hover"))},s.set(n,o)),o}const zl=i=>T(i)&&Object.getOwnPropertyNames(i).some(t=>St(i[t]));function Bl(i,t){const{isScriptable:e,isIndexable:s}=Bn(i);for(const n of t){const o=e(n),a=s(n),r=(a||o)&&i[n];if(o&&(St(r)||zl(r))||a&&V(r))return!0}return!1}var Vl="4.5.1";const Wl=["top","bottom","left","right","chartArea"];function $s(i,t){return i==="top"||i==="bottom"||Wl.indexOf(i)===-1&&t==="x"}function Ys(i,t){return function(e,s){return e[i]===s[i]?e[t]-s[t]:e[i]-s[i]}}function Xs(i){const t=i.chart,e=t.options.animation;t.notifyPlugins("afterRender"),F(e&&e.onComplete,[i],t)}function Nl(i){const t=i.chart,e=t.options.animation;F(e&&e.onProgress,[i],t)}function ro(i){return qi()&&typeof i=="string"?i=document.getElementById(i):i&&i.length&&(i=i[0]),i&&i.canvas&&(i=i.canvas),i}const je={},Us=i=>{const t=ro(i);return Object.values(je).filter(e=>e.canvas===t).pop()};function Hl(i,t,e){const s=Object.keys(i);for(const n of s){const o=+n;if(o>=t){const a=i[n];delete i[n],(e>0||o>t)&&(i[o+e]=a)}}}function jl(i,t,e,s){return!e||i.type==="mouseout"?null:s?t:i}class Et{static register(...t){lt.add(...t),Ks()}static unregister(...t){lt.remove(...t),Ks()}constructor(t,e){const s=this.config=new Fl(e),n=ro(t),o=Us(n);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||rl(n)),this.platform.updateConfig(s);const r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,c=l&&l.height,h=l&&l.width;if(this.id=$o(),this.ctx=r,this.canvas=l,this.width=h,this.height=c,this._options=a,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new wl,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=ra(d=>this.update(d),a.resizeDelay||0),this._dataChanges=[],je[this.id]=this,!r||!l){console.error("Failed to create chart: can't acquire context from the given item");return}dt.listen(this,"complete",Xs),dt.listen(this,"progress",Nl),this._initialize(),this.attached&&this.update()}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:s,height:n,_aspectRatio:o}=this;return C(t)?e&&o?o:n?s/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return lt}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():ms(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return fs(this.canvas,this.ctx),this}stop(){return dt.stop(this),this}resize(t,e){dt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const s=this.options,n=this.canvas,o=s.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(n,t,e,o),r=s.devicePixelRatio||this.platform.getDevicePixelRatio(),l=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,ms(this,r,!0)&&(this.notifyPlugins("resize",{size:a}),F(s.onResize,[this,a],this),this.attached&&this._doResize(l)&&this.render())}ensureScalesHaveIDs(){const e=this.options.scales||{};E(e,(s,n)=>{s.id=n})}buildOrUpdateScales(){const t=this.options,e=t.scales,s=this.scales,n=Object.keys(s).reduce((a,r)=>(a[r]=!1,a),{});let o=[];e&&(o=o.concat(Object.keys(e).map(a=>{const r=e[a],l=Di(a,r),c=l==="r",h=l==="x";return{options:r,dposition:c?"chartArea":h?"bottom":"left",dtype:c?"radialLinear":h?"category":"linear"}}))),E(o,a=>{const r=a.options,l=r.id,c=Di(l,r),h=D(r.type,a.dtype);(r.position===void 0||$s(r.position,c)!==$s(a.dposition))&&(r.position=a.dposition),n[l]=!0;let d=null;if(l in s&&s[l].type===h)d=s[l];else{const u=lt.getScale(h);d=new u({id:l,type:h,ctx:this.ctx,chart:this}),s[d.id]=d}d.init(r,t)}),E(n,(a,r)=>{a||delete s[r]}),E(s,a=>{G.configure(this,a,a.options),G.addBox(this,a)})}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,s=t.length;if(t.sort((n,o)=>n.index-o.index),s>e){for(let n=e;ne.length&&delete this._stacks,t.forEach((s,n)=>{e.filter(o=>o===s._dataset).length===0&&this._destroyDatasetMeta(n)})}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let s,n;for(this._removeUnreferencedMetasets(),s=0,n=e.length;s{this.getDatasetMeta(e).controller.reset()},this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const s=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),n=this._animationsDisabled=!s.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0})===!1)return;const o=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let a=0;for(let c=0,h=this.data.datasets.length;c{c.reset()}),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(Ys("z","_idx"));const{_active:r,_lastEvent:l}=this;l?this._eventHandler(l,!0):r.length&&this._updateHoverStyles(r,r,!0),this.render()}_updateScales(){E(this.scales,t=>{G.removeBox(this,t)}),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),s=new Set(t.events);(!ns(e,s)||!!this._responsiveListeners!==t.responsive)&&(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:s,start:n,count:o}of e){const a=s==="_removeElements"?-o:o;Hl(t,n,a)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,s=o=>new Set(t.filter(a=>a[0]===o).map((a,r)=>r+","+a.splice(1).join(","))),n=s(0);for(let o=1;oo.split(",")).map(o=>({method:o[1],start:+o[2],count:+o[3]}))}_updateLayout(t){if(this.notifyPlugins("beforeLayout",{cancelable:!0})===!1)return;G.update(this,this.width,this.height,t);const e=this.chartArea,s=e.width<=0||e.height<=0;this._layers=[],E(this.boxes,n=>{s&&n.position==="chartArea"||(n.configure&&n.configure(),this._layers.push(...n._layers()))},this),this._layers.forEach((n,o)=>{n._idx=o}),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})!==!1){for(let e=0,s=this.data.datasets.length;e=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,s={meta:t,index:t.index,cancelable:!0},n=qn(this,t);this.notifyPlugins("beforeDatasetDraw",s)!==!1&&(n&&ei(e,n),t.controller.draw(),n&&ii(e),s.cancelable=!1,this.notifyPlugins("afterDatasetDraw",s))}isPointInArea(t){return mt(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,s,n){const o=Wr.modes[e];return typeof o=="function"?o(this,t,s,n):[]}getDatasetMeta(t){const e=this.data.datasets[t],s=this._metasets;let n=s.filter(o=>o&&o._dataset===e).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},s.push(n)),n}getContext(){return this.$context||(this.$context=wt(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const s=this.getDatasetMeta(t);return typeof s.hidden=="boolean"?!s.hidden:!e.hidden}setDatasetVisibility(t,e){const s=this.getDatasetMeta(t);s.hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,s){const n=s?"show":"hide",o=this.getDatasetMeta(t),a=o.controller._resolveAnimations(void 0,n);pe(e)?(o.data[e].hidden=!s,this.update()):(this.setDatasetVisibility(t,s),a.update(o,{visible:s}),this.update(r=>r.datasetIndex===t?n:void 0))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),dt.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,o,a),t[o]=a},n=(o,a,r)=>{o.offsetX=a,o.offsetY=r,this._eventHandler(o)};E(this.options.events,o=>s(o,n))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,s=(l,c)=>{e.addEventListener(this,l,c),t[l]=c},n=(l,c)=>{t[l]&&(e.removeEventListener(this,l,c),delete t[l])},o=(l,c)=>{this.canvas&&this.resize(l,c)};let a;const r=()=>{n("attach",r),this.attached=!0,this.resize(),s("resize",o),s("detach",a)};a=()=>{this.attached=!1,n("resize",o),this._stop(),this._resize(0,0),s("attach",r)},e.isAttached(this.canvas)?r():a()}unbindEvents(){E(this._listeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._listeners={},E(this._responsiveListeners,(t,e)=>{this.platform.removeEventListener(this,e,t)}),this._responsiveListeners=void 0}updateHoverStyle(t,e,s){const n=s?"set":"remove";let o,a,r,l;for(e==="dataset"&&(o=this.getDatasetMeta(t[0].datasetIndex),o.controller["_"+n+"DatasetHoverStyle"]()),r=0,l=t.length;r{const r=this.getDatasetMeta(o);if(!r)throw new Error("No dataset found at index "+o);return{datasetIndex:o,element:r.data[a],index:a}});!Xe(s,e)&&(this._active=s,this._lastEvent=null,this._updateHoverStyles(s,e))}notifyPlugins(t,e,s){return this._plugins.notify(this,t,e,s)}isPluginEnabled(t){return this._plugins._cache.filter(e=>e.plugin.id===t).length===1}_updateHoverStyles(t,e,s){const n=this.options.hover,o=(l,c)=>l.filter(h=>!c.some(d=>h.datasetIndex===d.datasetIndex&&h.index===d.index)),a=o(e,t),r=s?t:o(t,e);a.length&&this.updateHoverStyle(a,n.mode,!1),r.length&&n.mode&&this.updateHoverStyle(r,n.mode,!0)}_eventHandler(t,e){const s={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},n=a=>(a.options.events||this.options.events).includes(t.native.type);if(this.notifyPlugins("beforeEvent",s,n)===!1)return;const o=this._handleEvent(t,e,s.inChartArea);return s.cancelable=!1,this.notifyPlugins("afterEvent",s,n),(o||s.changed)&&this.render(),this}_handleEvent(t,e,s){const{_active:n=[],options:o}=this,a=e,r=this._getActiveElements(t,n,s,a),l=Go(t),c=jl(t,this._lastEvent,s,l);s&&(this._lastEvent=null,F(o.onHover,[t,r,this],this),l&&F(o.onClick,[t,r,this],this));const h=!Xe(r,n);return(h||e)&&(this._active=r,this._updateHoverStyles(r,n,e)),this._lastEvent=c,h}_getActiveElements(t,e,s,n){if(t.type==="mouseout")return[];if(!s)return e;const o=this.options.hover;return this.getElementsAtEventForMode(t,o.mode,o,n)}}M(Et,"defaults",W),M(Et,"instances",je),M(Et,"overrides",Bt),M(Et,"registry",lt),M(Et,"version",Vl),M(Et,"getChart",Us);function Ks(){return E(Et.instances,i=>i._plugins.invalidate())}function $l(i,t,e){const{startAngle:s,x:n,y:o,outerRadius:a,innerRadius:r,options:l}=t,{borderWidth:c,borderJoinStyle:h}=l,d=Math.min(c/a,q(s-e));if(i.beginPath(),i.arc(n,o,a-c/2,s+d/2,e-d/2),r>0){const u=Math.min(c/r,q(s-e));i.arc(n,o,r+c/2,e-u/2,s+u/2,!0)}else{const u=Math.min(c/2,a*q(s-e));if(h==="round")i.arc(n,o,u,e-R/2,s+R/2,!0);else if(h==="bevel"){const f=2*u*u,g=-f*Math.cos(e+R/2)+n,p=-f*Math.sin(e+R/2)+o,m=f*Math.cos(s+R/2)+n,b=f*Math.sin(s+R/2)+o;i.lineTo(g,p),i.lineTo(m,b)}}i.closePath(),i.moveTo(0,0),i.rect(0,0,i.canvas.width,i.canvas.height),i.clip("evenodd")}function Yl(i,t,e){const{startAngle:s,pixelMargin:n,x:o,y:a,outerRadius:r,innerRadius:l}=t;let c=n/r;i.beginPath(),i.arc(o,a,r,s-c,e+c),l>n?(c=n/l,i.arc(o,a,l,e+c,s-c,!0)):i.arc(o,a,n,e+j,s-j),i.closePath(),i.clip()}function Xl(i){return Yi(i,["outerStart","outerEnd","innerStart","innerEnd"])}function Ul(i,t,e,s){const n=Xl(i.options.borderRadius),o=(e-t)/2,a=Math.min(o,s*t/2),r=l=>{const c=(e-Math.min(o,l))*s/2;return Y(l,0,Math.min(o,c))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:Y(n.innerStart,0,a),innerEnd:Y(n.innerEnd,0,a)}}function $t(i,t,e,s){return{x:e+i*Math.cos(t),y:s+i*Math.sin(t)}}function Je(i,t,e,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:c,innerRadius:h}=t,d=Math.max(t.outerRadius+s+e-c,0),u=h>0?h+s+e+c:0;let f=0;const g=n-l;if(s){const I=h>0?h-s:0,B=d>0?d-s:0,H=(I+B)/2,st=H!==0?g*H/(H+s):g;f=(g-st)/2}const p=Math.max(.001,g*d-e/R)/d,m=(g-p)/2,b=l+m+f,x=n-m-f,{outerStart:v,outerEnd:y,innerStart:_,innerEnd:k}=Ul(t,u,d,x-b),S=d-v,w=d-y,P=b+v/S,O=x-y/w,A=u+_,L=u+k,X=b+_/A,tt=x-k/L;if(i.beginPath(),o){const I=(P+O)/2;if(i.arc(a,r,d,P,I),i.arc(a,r,d,I,O),y>0){const U=$t(w,O,a,r);i.arc(U.x,U.y,y,O,x+j)}const B=$t(L,x,a,r);if(i.lineTo(B.x,B.y),k>0){const U=$t(L,tt,a,r);i.arc(U.x,U.y,k,x+j,tt+Math.PI)}const H=(x-k/u+(b+_/u))/2;if(i.arc(a,r,u,x-k/u,H,!0),i.arc(a,r,u,H,b+_/u,!0),_>0){const U=$t(A,X,a,r);i.arc(U.x,U.y,_,X+Math.PI,b-j)}const st=$t(S,b,a,r);if(i.lineTo(st.x,st.y),v>0){const U=$t(S,P,a,r);i.arc(U.x,U.y,v,b-j,P)}}else{i.moveTo(a,r);const I=Math.cos(P)*d+a,B=Math.sin(P)*d+r;i.lineTo(I,B);const H=Math.cos(O)*d+a,st=Math.sin(O)*d+r;i.lineTo(H,st)}i.closePath()}function Kl(i,t,e,s,n){const{fullCircles:o,startAngle:a,circumference:r}=t;let l=t.endAngle;if(o){Je(i,t,e,s,l,n);for(let c=0;c=R&&f===0&&h!=="miter"&&$l(i,t,p),o||(Je(i,t,e,s,p,n),i.stroke())}class oe extends at{constructor(e){super();M(this,"circumference");M(this,"endAngle");M(this,"fullCircles");M(this,"innerRadius");M(this,"outerRadius");M(this,"pixelMargin");M(this,"startAngle");this.options=void 0,this.circumference=void 0,this.startAngle=void 0,this.endAngle=void 0,this.innerRadius=void 0,this.outerRadius=void 0,this.pixelMargin=0,this.fullCircles=0,e&&Object.assign(this,e)}inRange(e,s,n){const o=this.getProps(["x","y"],n),{angle:a,distance:r}=On(o,{x:e,y:s}),{startAngle:l,endAngle:c,innerRadius:h,outerRadius:d,circumference:u}=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],n),f=(this.options.spacing+this.options.borderWidth)/2,g=D(u,c-l),p=me(a,l,c)&&l!==c,m=g>=z||p,b=gt(r,h+f,d+f);return m&&b}getCenterPoint(e){const{x:s,y:n,startAngle:o,endAngle:a,innerRadius:r,outerRadius:l}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],e),{offset:c,spacing:h}=this.options,d=(o+a)/2,u=(r+l+h+c)/2;return{x:s+Math.cos(d)*u,y:n+Math.sin(d)*u}}tooltipPosition(e){return this.getCenterPoint(e)}draw(e){const{options:s,circumference:n}=this,o=(s.offset||0)/4,a=(s.spacing||0)/2,r=s.circular;if(this.pixelMargin=s.borderAlign==="inner"?.33:0,this.fullCircles=n>z?Math.floor(n/z):0,n===0||this.innerRadius<0||this.outerRadius<0)return;e.save();const l=(this.startAngle+this.endAngle)/2;e.translate(Math.cos(l)*o,Math.sin(l)*o);const c=1-Math.sin(Math.min(R,n||0)),h=o*c;e.fillStyle=s.backgroundColor,e.strokeStyle=s.borderColor,Kl(e,this,h,a,r),ql(e,this,h,a,r),e.restore()}}M(oe,"id","arc"),M(oe,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0,selfJoin:!1}),M(oe,"defaultRoutes",{backgroundColor:"backgroundColor"}),M(oe,"descriptors",{_scriptable:!0,_indexable:e=>e!=="borderDash"});function lo(i,t,e=t){i.lineCap=D(e.borderCapStyle,t.borderCapStyle),i.setLineDash(D(e.borderDash,t.borderDash)),i.lineDashOffset=D(e.borderDashOffset,t.borderDashOffset),i.lineJoin=D(e.borderJoinStyle,t.borderJoinStyle),i.lineWidth=D(e.borderWidth,t.borderWidth),i.strokeStyle=D(e.borderColor,t.borderColor)}function Gl(i,t,e){i.lineTo(e.x,e.y)}function Zl(i){return i.stepped?_a:i.tension||i.cubicInterpolationMode==="monotone"?ya:Gl}function co(i,t,e={}){const s=i.length,{start:n=0,end:o=s-1}=e,{start:a,end:r}=t,l=Math.max(n,a),c=Math.min(o,r),h=nr&&o>r;return{count:s,start:l,loop:t.loop,ilen:c(a+(c?r-y:y))%o,v=()=>{p!==m&&(i.lineTo(h,m),i.lineTo(h,p),i.lineTo(h,b))};for(l&&(f=n[x(0)],i.moveTo(f.x,f.y)),u=0;u<=r;++u){if(f=n[x(u)],f.skip)continue;const y=f.x,_=f.y,k=y|0;k===g?(_m&&(m=_),h=(d*h+y)/++d):(v(),i.lineTo(y,_),g=k,d=0,p=m=_),b=_}v()}function Oi(i){const t=i.options,e=t.borderDash&&t.borderDash.length;return!i._decimated&&!i._loop&&!t.tension&&t.cubicInterpolationMode!=="monotone"&&!t.stepped&&!e?Ql:Jl}function tc(i){return i.stepped?Ja:i.tension||i.cubicInterpolationMode==="monotone"?Qa:Rt}function ec(i,t,e,s){let n=t._path;n||(n=t._path=new Path2D,t.path(n,e,s)&&n.closePath()),lo(i,t.options),i.stroke(n)}function ic(i,t,e,s){const{segments:n,options:o}=t,a=Oi(t);for(const r of n)lo(i,o,r.style),i.beginPath(),a(i,t,r,{start:e,end:e+s-1})&&i.closePath(),i.stroke()}const sc=typeof Path2D=="function";function nc(i,t,e,s){sc&&!t.options.segment?ec(i,t,e,s):ic(i,t,e,s)}class yt extends at{constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const s=this.options;if((s.tension||s.cubicInterpolationMode==="monotone")&&!s.stepped&&!this._pointsUpdated){const n=s.spanGaps?this._loop:this._fullLoop;$a(this._points,s,t,n,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=or(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,s=t.length;return s&&e[t[s-1].end]}interpolate(t,e){const s=this.options,n=t[e],o=this.points,a=Kn(this,{property:e,start:n,end:n});if(!a.length)return;const r=[],l=tc(s);let c,h;for(c=0,h=a.length;ct!=="borderDash"&&t!=="fill"});function qs(i,t,e,s){const n=i.options,{[e]:o}=i.getProps([e],s);return Math.abs(t-o)i.replace("rgb(","rgba(").replace(")",", 0.5)"));function uo(i){return Ai[i%Ai.length]}function fo(i){return Gs[i%Gs.length]}function dc(i,t){return i.borderColor=uo(t),i.backgroundColor=fo(t),++t}function uc(i,t){return i.backgroundColor=i.data.map(()=>uo(t++)),t}function fc(i,t){return i.backgroundColor=i.data.map(()=>fo(t++)),t}function gc(i){let t=0;return(e,s)=>{const n=i.getDatasetMeta(s).controller;n instanceof It?t=uc(e,t):n instanceof ue?t=fc(e,t):n&&(t=dc(e,t))}}function Zs(i){let t;for(t in i)if(i[t].borderColor||i[t].backgroundColor)return!0;return!1}function pc(i){return i&&(i.borderColor||i.backgroundColor)}function mc(){return W.borderColor!=="rgba(0,0,0,0.1)"||W.backgroundColor!=="rgba(0,0,0,0.1)"}var bc={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(i,t,e){if(!e.enabled)return;const{data:{datasets:s},options:n}=i.config,{elements:o}=n,a=Zs(s)||pc(n)||o&&Zs(o)||mc();if(!e.forceOverride&&a)return;const r=gc(i);s.forEach(r)}};function xc(i,t,e,s,n){const o=n.samples||s;if(o>=e)return i.slice(t,t+e);const a=[],r=(e-2)/(o-2);let l=0;const c=t+e-1;let h=t,d,u,f,g,p;for(a[l++]=i[h],d=0;df&&(f=g,u=i[x],p=x);a[l++]=u,h=p}return a[l++]=i[c],a}function _c(i,t,e,s){let n=0,o=0,a,r,l,c,h,d,u,f,g,p;const m=[],b=t+e-1,x=i[t].x,y=i[b].x-x;for(a=t;ap&&(p=c,u=a),n=(o*n+r.x)/++o;else{const k=a-1;if(!C(d)&&!C(u)){const S=Math.min(d,u),w=Math.max(d,u);S!==f&&S!==k&&m.push({...i[S],x:n}),w!==f&&w!==k&&m.push({...i[w],x:n})}a>0&&k!==f&&m.push(i[k]),m.push(r),h=_,o=0,g=p=c,d=u=f=a}}return m}function go(i){if(i._decimated){const t=i._data;delete i._decimated,delete i._data,Object.defineProperty(i,"data",{configurable:!0,enumerable:!0,writable:!0,value:t})}}function Js(i){i.data.datasets.forEach(t=>{go(t)})}function yc(i,t){const e=t.length;let s=0,n;const{iScale:o}=i,{min:a,max:r,minDefined:l,maxDefined:c}=o.getUserBounds();return l&&(s=Y(pt(t,o.axis,a).lo,0,e-1)),c?n=Y(pt(t,o.axis,r).hi+1,s,e)-s:n=e-s,{start:s,count:n}}var vc={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(i,t,e)=>{if(!e.enabled){Js(i);return}const s=i.width;i.data.datasets.forEach((n,o)=>{const{_data:a,indexAxis:r}=n,l=i.getDatasetMeta(o),c=a||n.data;if(se([r,i.options.indexAxis])==="y"||!l.controller.supportsDecimation)return;const h=i.scales[l.xAxisID];if(h.type!=="linear"&&h.type!=="time"||i.options.parsing)return;let{start:d,count:u}=yc(l,c);const f=e.threshold||4*s;if(u<=f){go(n);return}C(a)&&(n._data=c,delete n.data,Object.defineProperty(n,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(p){this._data=p}}));let g;switch(e.algorithm){case"lttb":g=xc(c,d,u,s,e);break;case"min-max":g=_c(c,d,u,s);break;default:throw new Error(`Unsupported decimation algorithm '${e.algorithm}'`)}n._decimated=g})},destroy(i){Js(i)}};function Mc(i,t,e){const s=i.segments,n=i.points,o=t.points,a=[];for(const r of s){let{start:l,end:c}=r;c=oi(l,c,n);const h=Ci(e,n[l],n[c],r.loop);if(!t.segments){a.push({source:r,target:h,start:n[l],end:n[c]});continue}const d=Kn(t,h);for(const u of d){const f=Ci(e,o[u.start],o[u.end],u.loop),g=Un(r,n,f);for(const p of g)a.push({source:p,target:u,start:{[e]:Qs(h,f,"start",Math.max)},end:{[e]:Qs(h,f,"end",Math.min)}})}}return a}function Ci(i,t,e,s){if(s)return;let n=t[i],o=e[i];return i==="angle"&&(n=q(n),o=q(o)),{property:i,start:n,end:o}}function kc(i,t){const{x:e=null,y:s=null}=i||{},n=t.points,o=[];return t.segments.forEach(({start:a,end:r})=>{r=oi(a,r,n);const l=n[a],c=n[r];s!==null?(o.push({x:l.x,y:s}),o.push({x:c.x,y:s})):e!==null&&(o.push({x:e,y:l.y}),o.push({x:e,y:c.y}))}),o}function oi(i,t,e){for(;t>i;t--){const s=e[t];if(!isNaN(s.x)&&!isNaN(s.y))break}return t}function Qs(i,t,e,s){return i&&t?s(i[e],t[e]):i?i[e]:t?t[e]:0}function po(i,t){let e=[],s=!1;return V(i)?(s=!0,e=i):e=kc(i,t),e.length?new yt({points:e,options:{tension:0},_loop:s,_fullLoop:s}):null}function tn(i){return i&&i.fill!==!1}function Sc(i,t,e){let n=i[t].fill;const o=[t];let a;if(!e)return n;for(;n!==!1&&o.indexOf(n)===-1;){if(!N(n))return n;if(a=i[n],!a)return!1;if(a.visible)return n;o.push(n),n=a.fill}return!1}function wc(i,t,e){const s=Ac(i);if(T(s))return isNaN(s.value)?!1:s;let n=parseFloat(s);return N(n)&&Math.floor(n)===n?Pc(s[0],t,n,e):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}function Pc(i,t,e,s){return(i==="-"||i==="+")&&(e=t+e),e===t||e<0||e>=s?!1:e}function Dc(i,t){let e=null;return i==="start"?e=t.bottom:i==="end"?e=t.top:T(i)?e=t.getPixelForValue(i.value):t.getBasePixel&&(e=t.getBasePixel()),e}function Oc(i,t,e){let s;return i==="start"?s=e:i==="end"?s=t.options.reverse?t.min:t.max:T(i)?s=i.value:s=t.getBaseValue(),s}function Ac(i){const t=i.options,e=t.fill;let s=D(e&&e.target,e);return s===void 0&&(s=!!t.backgroundColor),s===!1||s===null?!1:s===!0?"origin":s}function Cc(i){const{scale:t,index:e,line:s}=i,n=[],o=s.segments,a=s.points,r=Tc(t,e);r.push(po({x:null,y:t.bottom},s));for(let l=0;l=0;--a){const r=n[a].$filler;r&&(r.line.updateControlPoints(o,r.axis),s&&r.fill&&_i(i.ctx,r,o))}},beforeDatasetsDraw(i,t,e){if(e.drawTime!=="beforeDatasetsDraw")return;const s=i.getSortedVisibleDatasetMetas();for(let n=s.length-1;n>=0;--n){const o=s[n].$filler;tn(o)&&_i(i.ctx,o,i.chartArea)}},beforeDatasetDraw(i,t,e){const s=t.meta.$filler;!tn(s)||e.drawTime!=="beforeDatasetDraw"||_i(i.ctx,s,i.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const on=(i,t)=>{let{boxHeight:e=t,boxWidth:s=t}=i;return i.usePointStyle&&(e=Math.min(e,t),s=i.pointStyleWidth||Math.min(s,t)),{boxWidth:s,boxHeight:e,itemHeight:Math.max(t,e)}},Hc=(i,t)=>i!==null&&t!==null&&i.datasetIndex===t.datasetIndex&&i.index===t.index;class an extends at{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,s){this.maxWidth=t,this.maxHeight=e,this._margins=s,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}buildLabels(){const t=this.options.labels||{};let e=F(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter(s=>t.filter(s,this.chart.data))),t.sort&&(e=e.sort((s,n)=>t.sort(s,n,this.chart.data))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display){this.width=this.height=0;return}const s=t.labels,n=$(s.font),o=n.size,a=this._computeTitleHeight(),{boxWidth:r,itemHeight:l}=on(s,o);let c,h;e.font=n.string,this.isHorizontal()?(c=this.maxWidth,h=this._fitRows(a,o,r,l)+10):(h=this.maxHeight,c=this._fitCols(a,n,r,l)+10),this.width=Math.min(c,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,s,n){const{ctx:o,maxWidth:a,options:{labels:{padding:r}}}=this,l=this.legendHitBoxes=[],c=this.lineWidths=[0],h=n+r;let d=t;o.textAlign="left",o.textBaseline="middle";let u=-1,f=-h;return this.legendItems.forEach((g,p)=>{const m=s+e/2+o.measureText(g.text).width;(p===0||c[c.length-1]+m+2*r>a)&&(d+=h,c[c.length-(p>0?0:1)]=0,f+=h,u++),l[p]={left:0,top:f,row:u,width:m,height:n},c[c.length-1]+=m+r}),d}_fitCols(t,e,s,n){const{ctx:o,maxHeight:a,options:{labels:{padding:r}}}=this,l=this.legendHitBoxes=[],c=this.columnSizes=[],h=a-t;let d=r,u=0,f=0,g=0,p=0;return this.legendItems.forEach((m,b)=>{const{itemWidth:x,itemHeight:v}=jc(s,e,o,m,n);b>0&&f+v+2*r>h&&(d+=u+r,c.push({width:u,height:f}),g+=u+r,p++,u=f=0),l[b]={left:g,top:f,col:p,width:x,height:v},u=Math.max(u,x),f+=v+r}),d+=u,c.push({width:u,height:f}),d}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:s,labels:{padding:n},rtl:o}}=this,a=Yt(o,this.left,this.width);if(this.isHorizontal()){let r=0,l=K(s,this.left+n,this.right-this.lineWidths[r]);for(const c of e)r!==c.row&&(r=c.row,l=K(s,this.left+n,this.right-this.lineWidths[r])),c.top+=this.top+t+n,c.left=a.leftForLtr(a.x(l),c.width),l+=c.width+n}else{let r=0,l=K(s,this.top+t+n,this.bottom-this.columnSizes[r].height);for(const c of e)c.col!==r&&(r=c.col,l=K(s,this.top+t+n,this.bottom-this.columnSizes[r].height)),c.top=l,c.left+=this.left+n,c.left=a.leftForLtr(a.x(c.left),c.width),l+=c.height+n}}isHorizontal(){return this.options.position==="top"||this.options.position==="bottom"}draw(){if(this.options.display){const t=this.ctx;ei(t,this),this._draw(),ii(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:s,ctx:n}=this,{align:o,labels:a}=t,r=W.color,l=Yt(t.rtl,this.left,this.width),c=$(a.font),{padding:h}=a,d=c.size,u=d/2;let f;this.drawTitle(),n.textAlign=l.textAlign("left"),n.textBaseline="middle",n.lineWidth=.5,n.font=c.string;const{boxWidth:g,boxHeight:p,itemHeight:m}=on(a,d),b=function(k,S,w){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;n.save();const P=D(w.lineWidth,1);if(n.fillStyle=D(w.fillStyle,r),n.lineCap=D(w.lineCap,"butt"),n.lineDashOffset=D(w.lineDashOffset,0),n.lineJoin=D(w.lineJoin,"miter"),n.lineWidth=P,n.strokeStyle=D(w.strokeStyle,r),n.setLineDash(D(w.lineDash,[])),a.usePointStyle){const O={radius:p*Math.SQRT2/2,pointStyle:w.pointStyle,rotation:w.rotation,borderWidth:P},A=l.xPlus(k,g/2),L=S+u;Fn(n,O,A,L,a.pointStyleWidth&&g)}else{const O=S+Math.max((d-p)/2,0),A=l.leftForLtr(k,g),L=Ft(w.borderRadius);n.beginPath(),Object.values(L).some(X=>X!==0)?be(n,{x:A,y:O,w:g,h:p,radius:L}):n.rect(A,O,g,p),n.fill(),P!==0&&n.stroke()}n.restore()},x=function(k,S,w){Vt(n,w.text,k,S+m/2,c,{strikethrough:w.hidden,textAlign:l.textAlign(w.textAlign)})},v=this.isHorizontal(),y=this._computeTitleHeight();v?f={x:K(o,this.left+h,this.right-s[0]),y:this.top+h+y,line:0}:f={x:this.left+h,y:K(o,this.top+y+h,this.bottom-e[0].height),line:0},$n(this.ctx,t.textDirection);const _=m+h;this.legendItems.forEach((k,S)=>{n.strokeStyle=k.fontColor,n.fillStyle=k.fontColor;const w=n.measureText(k.text).width,P=l.textAlign(k.textAlign||(k.textAlign=a.textAlign)),O=g+u+w;let A=f.x,L=f.y;l.setWidth(this.width),v?S>0&&A+O+h>this.right&&(L=f.y+=_,f.line++,A=f.x=K(o,this.left+h,this.right-s[f.line])):S>0&&L+_>this.bottom&&(A=f.x=A+e[f.line].width+h,f.line++,L=f.y=K(o,this.top+y+h,this.bottom-e[f.line].height));const X=l.x(A);if(b(X,L,k),A=la(P,A+g+u,v?A+O:this.right,t.rtl),x(l.x(A),L,k),v)f.x+=O+h;else if(typeof k.text!="string"){const tt=c.lineHeight;f.y+=bo(k,tt)+h}else f.y+=_}),Yn(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,s=$(e.font),n=Z(e.padding);if(!e.display)return;const o=Yt(t.rtl,this.left,this.width),a=this.ctx,r=e.position,l=s.size/2,c=n.top+l;let h,d=this.left,u=this.width;if(this.isHorizontal())u=Math.max(...this.lineWidths),h=this.top+c,d=K(t.align,d,this.right-u);else{const g=this.columnSizes.reduce((p,m)=>Math.max(p,m.height),0);h=c+K(t.align,this.top,this.bottom-g-t.labels.padding-this._computeTitleHeight())}const f=K(r,d,d+u);a.textAlign=o.textAlign(ji(r)),a.textBaseline="middle",a.strokeStyle=e.color,a.fillStyle=e.color,a.font=s.string,Vt(a,e.text,f,h,s)}_computeTitleHeight(){const t=this.options.title,e=$(t.font),s=Z(t.padding);return t.display?e.lineHeight+s.height:0}_getLegendItemAt(t,e){let s,n,o;if(gt(t,this.left,this.right)&>(e,this.top,this.bottom)){for(o=this.legendHitBoxes,s=0;so.length>a.length?o:a)),t+e.size/2+s.measureText(n).width}function Yc(i,t,e){let s=i;return typeof t.text!="string"&&(s=bo(t,e)),s}function bo(i,t){const e=i.text?i.text.length:0;return t*e}function Xc(i,t){return!!((i==="mousemove"||i==="mouseout")&&(t.onHover||t.onLeave)||t.onClick&&(i==="click"||i==="mouseup"))}var Uc={id:"legend",_element:an,start(i,t,e){const s=i.legend=new an({ctx:i.ctx,options:e,chart:i});G.configure(i,s,e),G.addBox(i,s)},stop(i){G.removeBox(i,i.legend),delete i.legend},beforeUpdate(i,t,e){const s=i.legend;G.configure(i,s,e),s.options=e},afterUpdate(i){const t=i.legend;t.buildLabels(),t.adjustHitBoxes()},afterEvent(i,t){t.replay||i.legend.handleEvent(t.event)},defaults:{display:!0,position:"top",align:"center",fullSize:!0,reverse:!1,weight:1e3,onClick(i,t,e){const s=t.datasetIndex,n=e.chart;n.isDatasetVisible(s)?(n.hide(s),t.hidden=!0):(n.show(s),t.hidden=!1)},onHover:null,onLeave:null,labels:{color:i=>i.chart.options.color,boxWidth:40,padding:10,generateLabels(i){const t=i.data.datasets,{labels:{usePointStyle:e,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=i.legend.options;return i._getSortedDatasetMetas().map(l=>{const c=l.controller.getStyle(e?0:void 0),h=Z(c.borderWidth);return{text:t[l.index].label,fillStyle:c.backgroundColor,fontColor:o,hidden:!l.visible,lineCap:c.borderCapStyle,lineDash:c.borderDash,lineDashOffset:c.borderDashOffset,lineJoin:c.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:c.borderColor,pointStyle:s||c.pointStyle,rotation:c.rotation,textAlign:n||c.textAlign,borderRadius:a&&(r||c.borderRadius),datasetIndex:l.index}},this)}},title:{color:i=>i.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:i=>!i.startsWith("on"),labels:{_scriptable:i=>!["generateLabels","filter","sort"].includes(i)}}};class Ji extends at{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const s=this.options;if(this.left=0,this.top=0,!s.display){this.width=this.height=this.right=this.bottom=0;return}this.width=this.right=t,this.height=this.bottom=e;const n=V(s.text)?s.text.length:1;this._padding=Z(s.padding);const o=n*$(s.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const t=this.options.position;return t==="top"||t==="bottom"}_drawArgs(t){const{top:e,left:s,bottom:n,right:o,options:a}=this,r=a.align;let l=0,c,h,d;return this.isHorizontal()?(h=K(r,s,o),d=e+t,c=o-s):(a.position==="left"?(h=s+t,d=K(r,n,e),l=R*-.5):(h=o-t,d=K(r,e,n),l=R*.5),c=n-e),{titleX:h,titleY:d,maxWidth:c,rotation:l}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const s=$(e.font),o=s.lineHeight/2+this._padding.top,{titleX:a,titleY:r,maxWidth:l,rotation:c}=this._drawArgs(o);Vt(t,e.text,0,0,s,{color:e.color,maxWidth:l,rotation:c,textAlign:ji(e.align),textBaseline:"middle",translation:[a,r]})}}function Kc(i,t){const e=new Ji({ctx:i.ctx,options:t,chart:i});G.configure(i,e,t),G.addBox(i,e),i.titleBlock=e}var qc={id:"title",_element:Ji,start(i,t,e){Kc(i,e)},stop(i){const t=i.titleBlock;G.removeBox(i,t),delete i.titleBlock},beforeUpdate(i,t,e){const s=i.titleBlock;G.configure(i,s,e),s.options=e},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const Ee=new WeakMap;var Gc={id:"subtitle",start(i,t,e){const s=new Ji({ctx:i.ctx,options:e,chart:i});G.configure(i,s,e),G.addBox(i,s),Ee.set(i,s)},stop(i){G.removeBox(i,Ee.get(i)),Ee.delete(i)},beforeUpdate(i,t,e){const s=Ee.get(i);G.configure(i,s,e),s.options=e},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const ae={average(i){if(!i.length)return!1;let t,e,s=new Set,n=0,o=0;for(t=0,e=i.length;tr+l)/s.size,y:n/o}},nearest(i,t){if(!i.length)return!1;let e=t.x,s=t.y,n=Number.POSITIVE_INFINITY,o,a,r;for(o=0,a=i.length;o-1?i.split(` -`):i}function Zc(i,t){const{element:e,datasetIndex:s,index:n}=t,o=i.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:i,label:a,parsed:o.getParsed(n),raw:i.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:e}}function rn(i,t){const e=i.chart.ctx,{body:s,footer:n,title:o}=i,{boxWidth:a,boxHeight:r}=t,l=$(t.bodyFont),c=$(t.titleFont),h=$(t.footerFont),d=o.length,u=n.length,f=s.length,g=Z(t.padding);let p=g.height,m=0,b=s.reduce((y,_)=>y+_.before.length+_.lines.length+_.after.length,0);if(b+=i.beforeBody.length+i.afterBody.length,d&&(p+=d*c.lineHeight+(d-1)*t.titleSpacing+t.titleMarginBottom),b){const y=t.displayColors?Math.max(r,l.lineHeight):l.lineHeight;p+=f*y+(b-f)*l.lineHeight+(b-1)*t.bodySpacing}u&&(p+=t.footerMarginTop+u*h.lineHeight+(u-1)*t.footerSpacing);let x=0;const v=function(y){m=Math.max(m,e.measureText(y).width+x)};return e.save(),e.font=c.string,E(i.title,v),e.font=l.string,E(i.beforeBody.concat(i.afterBody),v),x=t.displayColors?a+2+t.boxPadding:0,E(s,y=>{E(y.before,v),E(y.lines,v),E(y.after,v)}),x=0,e.font=h.string,E(i.footer,v),e.restore(),m+=g.width,{width:m,height:p}}function Jc(i,t){const{y:e,height:s}=t;return ei.height-s/2?"bottom":"center"}function Qc(i,t,e,s){const{x:n,width:o}=s,a=e.caretSize+e.caretPadding;if(i==="left"&&n+o+a>t.width||i==="right"&&n-o-a<0)return!0}function th(i,t,e,s){const{x:n,width:o}=e,{width:a,chartArea:{left:r,right:l}}=i;let c="center";return s==="center"?c=n<=(r+l)/2?"left":"right":n<=o/2?c="left":n>=a-o/2&&(c="right"),Qc(c,i,t,e)&&(c="center"),c}function ln(i,t,e){const s=e.yAlign||t.yAlign||Jc(i,e);return{xAlign:e.xAlign||t.xAlign||th(i,t,e,s),yAlign:s}}function eh(i,t){let{x:e,width:s}=i;return t==="right"?e-=s:t==="center"&&(e-=s/2),e}function ih(i,t,e){let{y:s,height:n}=i;return t==="top"?s+=e:t==="bottom"?s-=n+e:s-=n/2,s}function cn(i,t,e,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=i,{xAlign:r,yAlign:l}=e,c=n+o,{topLeft:h,topRight:d,bottomLeft:u,bottomRight:f}=Ft(a);let g=eh(t,r);const p=ih(t,l,c);return l==="center"?r==="left"?g+=c:r==="right"&&(g-=c):r==="left"?g-=Math.max(h,u)+n:r==="right"&&(g+=Math.max(d,f)+n),{x:Y(g,0,s.width-t.width),y:Y(p,0,s.height-t.height)}}function Ie(i,t,e){const s=Z(e.padding);return t==="center"?i.x+i.width/2:t==="right"?i.x+i.width-s.right:i.x+s.left}function hn(i){return rt([],ut(i))}function sh(i,t,e){return wt(i,{tooltip:t,tooltipItems:e,type:"tooltip"})}function dn(i,t){const e=t&&t.dataset&&t.dataset.tooltip&&t.dataset.tooltip.callbacks;return e?i.override(e):i}const xo={beforeTitle:ht,title(i){if(i.length>0){const t=i[0],e=t.chart.data.labels,s=e?e.length:0;if(this&&this.options&&this.options.mode==="dataset")return t.dataset.label||"";if(t.label)return t.label;if(s>0&&t.dataIndex"u"?xo[t].call(e,s):n}class Ti extends at{constructor(t){super(),this.opacity=0,this._active=[],this._eventPosition=void 0,this._size=void 0,this._cachedAnimations=void 0,this._tooltipItems=[],this.$animations=void 0,this.$context=void 0,this.chart=t.chart,this.options=t.options,this.dataPoints=void 0,this.title=void 0,this.beforeBody=void 0,this.body=void 0,this.afterBody=void 0,this.footer=void 0,this.xAlign=void 0,this.yAlign=void 0,this.x=void 0,this.y=void 0,this.height=void 0,this.width=void 0,this.caretX=void 0,this.caretY=void 0,this.labelColors=void 0,this.labelPointStyles=void 0,this.labelTextColors=void 0}initialize(t){this.options=t,this._cachedAnimations=void 0,this.$context=void 0}_resolveAnimations(){const t=this._cachedAnimations;if(t)return t;const e=this.chart,s=this.options.setContext(this.getContext()),n=s.enabled&&e.options.animation&&s.animations,o=new Gn(this.chart,n);return n._cacheable&&(this._cachedAnimations=Object.freeze(o)),o}getContext(){return this.$context||(this.$context=sh(this.chart.getContext(),this,this._tooltipItems))}getTitle(t,e){const{callbacks:s}=e,n=J(s,"beforeTitle",this,t),o=J(s,"title",this,t),a=J(s,"afterTitle",this,t);let r=[];return r=rt(r,ut(n)),r=rt(r,ut(o)),r=rt(r,ut(a)),r}getBeforeBody(t,e){return hn(J(e.callbacks,"beforeBody",this,t))}getBody(t,e){const{callbacks:s}=e,n=[];return E(t,o=>{const a={before:[],lines:[],after:[]},r=dn(s,o);rt(a.before,ut(J(r,"beforeLabel",this,o))),rt(a.lines,J(r,"label",this,o)),rt(a.after,ut(J(r,"afterLabel",this,o))),n.push(a)}),n}getAfterBody(t,e){return hn(J(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:s}=e,n=J(s,"beforeFooter",this,t),o=J(s,"footer",this,t),a=J(s,"afterFooter",this,t);let r=[];return r=rt(r,ut(n)),r=rt(r,ut(o)),r=rt(r,ut(a)),r}_createItems(t){const e=this._active,s=this.chart.data,n=[],o=[],a=[];let r=[],l,c;for(l=0,c=e.length;lt.filter(h,d,u,s))),t.itemSort&&(r=r.sort((h,d)=>t.itemSort(h,d,s))),E(r,h=>{const d=dn(t.callbacks,h);n.push(J(d,"labelColor",this,h)),o.push(J(d,"labelPointStyle",this,h)),a.push(J(d,"labelTextColor",this,h))}),this.labelColors=n,this.labelPointStyles=o,this.labelTextColors=a,this.dataPoints=r,r}update(t,e){const s=this.options.setContext(this.getContext()),n=this._active;let o,a=[];if(!n.length)this.opacity!==0&&(o={opacity:0});else{const r=ae[s.position].call(this,n,this._eventPosition);a=this._createItems(s),this.title=this.getTitle(a,s),this.beforeBody=this.getBeforeBody(a,s),this.body=this.getBody(a,s),this.afterBody=this.getAfterBody(a,s),this.footer=this.getFooter(a,s);const l=this._size=rn(this,s),c=Object.assign({},r,l),h=ln(this.chart,s,c),d=cn(s,c,h,this.chart);this.xAlign=h.xAlign,this.yAlign=h.yAlign,o={opacity:1,x:d.x,y:d.y,width:l.width,height:l.height,caretX:r.x,caretY:r.y}}this._tooltipItems=a,this.$context=void 0,o&&this._resolveAnimations().update(this,o),t&&s.external&&s.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,s,n){const o=this.getCaretPosition(t,s,n);e.lineTo(o.x1,o.y1),e.lineTo(o.x2,o.y2),e.lineTo(o.x3,o.y3)}getCaretPosition(t,e,s){const{xAlign:n,yAlign:o}=this,{caretSize:a,cornerRadius:r}=s,{topLeft:l,topRight:c,bottomLeft:h,bottomRight:d}=Ft(r),{x:u,y:f}=t,{width:g,height:p}=e;let m,b,x,v,y,_;return o==="center"?(y=f+p/2,n==="left"?(m=u,b=m-a,v=y+a,_=y-a):(m=u+g,b=m+a,v=y-a,_=y+a),x=m):(n==="left"?b=u+Math.max(l,h)+a:n==="right"?b=u+g-Math.max(c,d)-a:b=this.caretX,o==="top"?(v=f,y=v-a,m=b-a,x=b+a):(v=f+p,y=v+a,m=b+a,x=b-a),_=v),{x1:m,x2:b,x3:x,y1:v,y2:y,y3:_}}drawTitle(t,e,s){const n=this.title,o=n.length;let a,r,l;if(o){const c=Yt(s.rtl,this.x,this.width);for(t.x=Ie(this,s.titleAlign,s),e.textAlign=c.textAlign(s.titleAlign),e.textBaseline="middle",a=$(s.titleFont),r=s.titleSpacing,e.fillStyle=s.titleColor,e.font=a.string,l=0;lx!==0)?(t.beginPath(),t.fillStyle=o.multiKeyBackground,be(t,{x:p,y:g,w:c,h:l,radius:b}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),be(t,{x:m,y:g+1,w:c-2,h:l-2,radius:b}),t.fill()):(t.fillStyle=o.multiKeyBackground,t.fillRect(p,g,c,l),t.strokeRect(p,g,c,l),t.fillStyle=a.backgroundColor,t.fillRect(m,g+1,c-2,l-2))}t.fillStyle=this.labelTextColors[s]}drawBody(t,e,s){const{body:n}=this,{bodySpacing:o,bodyAlign:a,displayColors:r,boxHeight:l,boxWidth:c,boxPadding:h}=s,d=$(s.bodyFont);let u=d.lineHeight,f=0;const g=Yt(s.rtl,this.x,this.width),p=function(w){e.fillText(w,g.x(t.x+f),t.y+u/2),t.y+=u+o},m=g.textAlign(a);let b,x,v,y,_,k,S;for(e.textAlign=a,e.textBaseline="middle",e.font=d.string,t.x=Ie(this,m,s),e.fillStyle=s.bodyColor,E(this.beforeBody,p),f=r&&m!=="right"?a==="center"?c/2+h:c+2+h:0,y=0,k=n.length;y0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,s=this.$animations,n=s&&s.x,o=s&&s.y;if(n||o){const a=ae[t.position].call(this,this._active,this._eventPosition);if(!a)return;const r=this._size=rn(this,t),l=Object.assign({},a,this._size),c=ln(e,t,l),h=cn(t,l,c,e);(n._to!==h.x||o._to!==h.y)&&(this.xAlign=c.xAlign,this.yAlign=c.yAlign,this.width=r.width,this.height=r.height,this.caretX=a.x,this.caretY=a.y,this._resolveAnimations().update(this,h))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let s=this.opacity;if(!s)return;this._updateAnimationTarget(e);const n={width:this.width,height:this.height},o={x:this.x,y:this.y};s=Math.abs(s)<.001?0:s;const a=Z(e.padding),r=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&r&&(t.save(),t.globalAlpha=s,this.drawBackground(o,t,n,e),$n(t,e.textDirection),o.y+=a.top,this.drawTitle(o,t,e),this.drawBody(o,t,e),this.drawFooter(o,t,e),Yn(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const s=this._active,n=t.map(({datasetIndex:r,index:l})=>{const c=this.chart.getDatasetMeta(r);if(!c)throw new Error("Cannot find a dataset at index "+r);return{datasetIndex:r,element:c.data[l],index:l}}),o=!Xe(s,n),a=this._positionChanged(n,e);(o||a)&&(this._active=n,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,s=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const n=this.options,o=this._active||[],a=this._getActiveElements(t,o,e,s),r=this._positionChanged(a,t),l=e||!Xe(a,o)||r;return l&&(this._active=a,(n.enabled||n.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),l}_getActiveElements(t,e,s,n){const o=this.options;if(t.type==="mouseout")return[];if(!n)return e.filter(r=>this.chart.data.datasets[r.datasetIndex]&&this.chart.getDatasetMeta(r.datasetIndex).controller.getParsed(r.index)!==void 0);const a=this.chart.getElementsAtEventForMode(t,o.mode,o,s);return o.reverse&&a.reverse(),a}_positionChanged(t,e){const{caretX:s,caretY:n,options:o}=this,a=ae[o.position].call(this,t,e);return a!==!1&&(s!==a.x||n!==a.y)}}M(Ti,"positioners",ae);var nh={id:"tooltip",_element:Ti,positioners:ae,afterInit(i,t,e){e&&(i.tooltip=new Ti({chart:i,options:e}))},beforeUpdate(i,t,e){i.tooltip&&i.tooltip.initialize(e)},reset(i,t,e){i.tooltip&&i.tooltip.initialize(e)},afterDraw(i){const t=i.tooltip;if(t&&t._willRender()){const e={tooltip:t};if(i.notifyPlugins("beforeTooltipDraw",{...e,cancelable:!0})===!1)return;t.draw(i.ctx),i.notifyPlugins("afterTooltipDraw",e)}},afterEvent(i,t){if(i.tooltip){const e=t.replay;i.tooltip.handleEvent(t.event,e,t.inChartArea)&&(t.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:(i,t)=>t.bodyFont.size,boxWidth:(i,t)=>t.bodyFont.size,multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:xo},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:i=>i!=="filter"&&i!=="itemSort"&&i!=="external",_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]},oh=Object.freeze({__proto__:null,Colors:bc,Decimation:vc,Filler:Nc,Legend:Uc,SubTitle:Gc,Title:qc,Tooltip:nh});const ah=(i,t,e,s)=>(typeof t=="string"?(e=i.push(t)-1,s.unshift({index:e,label:t})):isNaN(t)&&(e=null),e);function rh(i,t,e,s){const n=i.indexOf(t);if(n===-1)return ah(i,t,e,s);const o=i.lastIndexOf(t);return n!==o?e:n}const lh=(i,t)=>i===null?null:Y(Math.round(i),0,t);function un(i){const t=this.getLabels();return i>=0&&ie.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}}M(Li,"id","category"),M(Li,"defaults",{ticks:{callback:un}});function ch(i,t){const e=[],{bounds:n,step:o,min:a,max:r,precision:l,count:c,maxTicks:h,maxDigits:d,includeBounds:u}=i,f=o||1,g=h-1,{min:p,max:m}=t,b=!C(a),x=!C(r),v=!C(c),y=(m-p)/(d+1);let _=as((m-p)/g/f)*f,k,S,w,P;if(_<1e-14&&!b&&!x)return[{value:p},{value:m}];P=Math.ceil(m/_)-Math.floor(p/_),P>g&&(_=as(P*_/g/f)*f),C(l)||(k=Math.pow(10,l),_=Math.ceil(_*k)/k),n==="ticks"?(S=Math.floor(p/_)*_,w=Math.ceil(m/_)*_):(S=p,w=m),b&&x&&o&&ea((r-a)/o,_/1e3)?(P=Math.round(Math.min((r-a)/_,h)),_=(r-a)/P,S=a,w=r):v?(S=b?a:S,w=x?r:w,P=c-1,_=(w-S)/P):(P=(w-S)/_,ce(P,Math.round(P),_/1e3)?P=Math.round(P):P=Math.ceil(P));const O=Math.max(rs(_),rs(S));k=Math.pow(10,C(l)?O:l),S=Math.round(S*k)/k,w=Math.round(w*k)/k;let A=0;for(b&&(u&&S!==a?(e.push({value:a}),Sr)break;e.push({value:L})}return x&&u&&w!==r?e.length&&ce(e[e.length-1].value,r,fn(r,y,i))?e[e.length-1].value=r:e.push({value:r}):(!x||w===r)&&e.push({value:w}),e}function fn(i,t,{horizontal:e,minRotation:s}){const n=nt(s),o=(e?Math.sin(n):Math.cos(n))||.001,a=.75*t*(""+i).length;return Math.min(t/o,a)}class Qe extends Wt{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._endValue=void 0,this._valueRange=0}parse(t,e){return C(t)||(typeof t=="number"||t instanceof Number)&&!isFinite(+t)?null:+t}handleTickRangeOptions(){const{beginAtZero:t}=this.options,{minDefined:e,maxDefined:s}=this.getUserBounds();let{min:n,max:o}=this;const a=l=>n=e?n:l,r=l=>o=s?o:l;if(t){const l=ct(n),c=ct(o);l<0&&c<0?r(0):l>0&&c>0&&a(0)}if(n===o){let l=o===0?1:Math.abs(o*.05);r(o+l),t||a(n-l)}this.min=n,this.max=o}getTickLimit(){const t=this.options.ticks;let{maxTicksLimit:e,stepSize:s}=t,n;return s?(n=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,n>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${n} ticks. Limiting to 1000.`),n=1e3)):(n=this.computeTickLimit(),e=e||11),e&&(n=Math.min(e,n)),n}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let s=this.getTickLimit();s=Math.max(2,s);const n={maxTicks:s,bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:e.includeBounds!==!1},o=this._range||this,a=ch(n,o);return t.bounds==="ticks"&&Dn(a,this,"value"),t.reverse?(a.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),a}configure(){const t=this.ticks;let e=this.min,s=this.max;if(super.configure(),this.options.offset&&t.length){const n=(s-e)/Math.max(t.length-1,1)/2;e-=n,s+=n}this._startValue=e,this._endValue=s,this._valueRange=s-e}getLabelForValue(t){return Me(t,this.chart.options.locale,this.options.ticks.format)}}class Ri extends Qe{determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=N(t)?t:0,this.max=N(e)?e:1,this.handleTickRangeOptions()}computeTickLimit(){const t=this.isHorizontal(),e=t?this.width:this.height,s=nt(this.options.ticks.minRotation),n=(t?Math.sin(s):Math.cos(s))||.001,o=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,o.lineHeight/n))}getPixelForValue(t){return t===null?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getValueForPixel(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}M(Ri,"id","linear"),M(Ri,"defaults",{ticks:{callback:ti.formatters.numeric}});const _e=i=>Math.floor(xt(i)),Tt=(i,t)=>Math.pow(10,_e(i)+t);function gn(i){return i/Math.pow(10,_e(i))===1}function pn(i,t,e){const s=Math.pow(10,e),n=Math.floor(i/s);return Math.ceil(t/s)-n}function hh(i,t){const e=t-i;let s=_e(e);for(;pn(i,t,s)>10;)s++;for(;pn(i,t,s)<10;)s--;return Math.min(s,_e(i))}function dh(i,{min:t,max:e}){t=et(i.min,t);const s=[],n=_e(t);let o=hh(t,e),a=o<0?Math.pow(10,Math.abs(o)):1;const r=Math.pow(10,o),l=n>o?Math.pow(10,n):0,c=Math.round((t-l)*a)/a,h=Math.floor((t-l)/r/10)*r*10;let d=Math.floor((c-h)/Math.pow(10,o)),u=et(i.min,Math.round((l+h+d*Math.pow(10,o))*a)/a);for(;u=10?d=d<15?15:20:d++,d>=20&&(o++,d=2,a=o>=0?1:a),u=Math.round((l+h+d*Math.pow(10,o))*a)/a;const f=et(i.max,u);return s.push({value:f,major:gn(f),significand:d}),s}class Ei extends Wt{constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const s=Qe.prototype.parse.apply(this,[t,e]);if(s===0){this._zero=!0;return}return N(s)&&s>0?s:null}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=N(t)?Math.max(0,t):null,this.max=N(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!N(this._userMin)&&(this.min=t===Tt(this.min,0)?Tt(this.min,-1):Tt(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let s=this.min,n=this.max;const o=r=>s=t?s:r,a=r=>n=e?n:r;s===n&&(s<=0?(o(1),a(10)):(o(Tt(s,-1)),a(Tt(n,1)))),s<=0&&o(Tt(n,-1)),n<=0&&a(Tt(s,1)),this.min=s,this.max=n}buildTicks(){const t=this.options,e={min:this._userMin,max:this._userMax},s=dh(e,this);return t.bounds==="ticks"&&Dn(s,this,"value"),t.reverse?(s.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),s}getLabelForValue(t){return t===void 0?"0":Me(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=xt(t),this._valueRange=xt(this.max)-xt(t)}getPixelForValue(t){return(t===void 0||t===0)&&(t=this.min),t===null||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(xt(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}M(Ei,"id","logarithmic"),M(Ei,"defaults",{ticks:{callback:ti.formatters.logarithmic,major:{enabled:!0}}});function Ii(i){const t=i.ticks;if(t.display&&i.display){const e=Z(t.backdropPadding);return D(t.font&&t.font.size,W.font.size)+e.height}return 0}function uh(i,t,e){return e=V(e)?e:[e],{w:xa(i,t.string,e),h:e.length*t.lineHeight}}function mn(i,t,e,s,n){return i===s||i===n?{start:t-e/2,end:t+e/2}:in?{start:t-e,end:t}:{start:t,end:t+e}}function fh(i){const t={l:i.left+i._padding.left,r:i.right-i._padding.right,t:i.top+i._padding.top,b:i.bottom-i._padding.bottom},e=Object.assign({},t),s=[],n=[],o=i._pointLabels.length,a=i.options.pointLabels,r=a.centerPointLabels?R/o:0;for(let l=0;lt.r&&(r=(s.end-t.r)/o,i.r=Math.max(i.r,t.r+r)),n.startt.b&&(l=(n.end-t.b)/a,i.b=Math.max(i.b,t.b+l))}function ph(i,t,e){const s=i.drawingArea,{extra:n,additionalAngle:o,padding:a,size:r}=e,l=i.getPointPosition(t,s+n+a,o),c=Math.round(Ni(q(l.angle+j))),h=yh(l.y,r.h,c),d=xh(c),u=_h(l.x,r.w,d);return{visible:!0,x:l.x,y:h,textAlign:d,left:u,top:h,right:u+r.w,bottom:h+r.h}}function mh(i,t){if(!t)return!0;const{left:e,top:s,right:n,bottom:o}=i;return!(mt({x:e,y:s},t)||mt({x:e,y:o},t)||mt({x:n,y:s},t)||mt({x:n,y:o},t))}function bh(i,t,e){const s=[],n=i._pointLabels.length,o=i.options,{centerPointLabels:a,display:r}=o.pointLabels,l={extra:Ii(o)/2,additionalAngle:a?R/n:0};let c;for(let h=0;h270||e<90)&&(i-=t),i}function vh(i,t,e){const{left:s,top:n,right:o,bottom:a}=e,{backdropColor:r}=t;if(!C(r)){const l=Ft(t.borderRadius),c=Z(t.backdropPadding);i.fillStyle=r;const h=s-c.left,d=n-c.top,u=o-s+c.width,f=a-n+c.height;Object.values(l).some(g=>g!==0)?(i.beginPath(),be(i,{x:h,y:d,w:u,h:f,radius:l}),i.fill()):i.fillRect(h,d,u,f)}}function Mh(i,t){const{ctx:e,options:{pointLabels:s}}=i;for(let n=t-1;n>=0;n--){const o=i._pointLabelItems[n];if(!o.visible)continue;const a=s.setContext(i.getPointLabelContext(n));vh(e,a,o);const r=$(a.font),{x:l,y:c,textAlign:h}=o;Vt(e,i._pointLabels[n],l,c+r.lineHeight/2,r,{color:a.color,textAlign:h,textBaseline:"middle"})}}function _o(i,t,e,s){const{ctx:n}=i;if(e)n.arc(i.xCenter,i.yCenter,t,0,z);else{let o=i.getPointPosition(0,t);n.moveTo(o.x,o.y);for(let a=1;a{const n=F(this.options.pointLabels.callback,[e,s],this);return n||n===0?n:""}).filter((e,s)=>this.chart.getDataVisibility(s))}fit(){const t=this.options;t.display&&t.pointLabels.display?fh(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,s,n){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((s-n)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,s,n))}getIndexAngle(t){const e=z/(this._pointLabels.length||1),s=this.options.startAngle||0;return q(t*e+nt(s))}getDistanceFromCenterForValue(t){if(C(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(C(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t{if(d!==0||d===0&&this.min<0){l=this.getDistanceFromCenterForValue(h.value);const u=this.getContext(d),f=n.setContext(u),g=o.setContext(u);kh(this,f,l,a,g)}}),s.display){for(t.save(),r=a-1;r>=0;r--){const h=s.setContext(this.getPointLabelContext(r)),{color:d,lineWidth:u}=h;!u||!d||(t.lineWidth=u,t.strokeStyle=d,t.setLineDash(h.borderDash),t.lineDashOffset=h.borderDashOffset,l=this.getDistanceFromCenterForValue(e.reverse?this.min:this.max),c=this.getPointPosition(r,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(c.x,c.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,s=e.ticks;if(!s.display)return;const n=this.getIndexAngle(0);let o,a;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(n),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach((r,l)=>{if(l===0&&this.min>=0&&!e.reverse)return;const c=s.setContext(this.getContext(l)),h=$(c.font);if(o=this.getDistanceFromCenterForValue(this.ticks[l].value),c.showLabelBackdrop){t.font=h.string,a=t.measureText(r.label).width,t.fillStyle=c.backdropColor;const d=Z(c.backdropPadding);t.fillRect(-a/2-d.left,-o-h.size/2-d.top,a+d.width,h.size+d.height)}Vt(t,r.label,0,-o,h,{color:c.color,strokeColor:c.textStrokeColor,strokeWidth:c.textStrokeWidth})}),t.restore()}drawTitle(){}}M(re,"id","radialLinear"),M(re,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:ti.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback(t){return t},padding:5,centerPointLabels:!1}}),M(re,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),M(re,"descriptors",{angleLines:{_fallback:"grid"}});const ai={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Q=Object.keys(ai);function bn(i,t){return i-t}function xn(i,t){if(C(t))return null;const e=i._adapter,{parser:s,round:n,isoWeekday:o}=i._parseOpts;let a=t;return typeof s=="function"&&(a=s(a)),N(a)||(a=typeof s=="string"?e.parse(a,s):e.parse(a)),a===null?null:(n&&(a=n==="week"&&(Xt(o)||o===!0)?e.startOf(a,"isoWeek",o):e.startOf(a,n)),+a)}function _n(i,t,e,s){const n=Q.length;for(let o=Q.indexOf(i);o=Q.indexOf(e);o--){const a=Q[o];if(ai[a].common&&i._adapter.diff(n,s,a)>=t-1)return a}return Q[e?Q.indexOf(e):0]}function Ph(i){for(let t=Q.indexOf(i)+1,e=Q.length;t=t?e[s]:e[n];i[o]=!0}}function Dh(i,t,e,s){const n=i._adapter,o=+n.startOf(t[0].value,s),a=t[t.length-1].value;let r,l;for(r=o;r<=a;r=+n.add(r,1,s))l=e[r],l>=0&&(t[l].major=!0);return t}function vn(i,t,e){const s=[],n={},o=t.length;let a,r;for(a=0;a+t.value))}initOffsets(t=[]){let e=0,s=0,n,o;this.options.offset&&t.length&&(n=this.getDecimalForValue(t[0]),t.length===1?e=1-n:e=(this.getDecimalForValue(t[1])-n)/2,o=this.getDecimalForValue(t[t.length-1]),t.length===1?s=o:s=(o-this.getDecimalForValue(t[t.length-2]))/2);const a=t.length<3?.5:.25;e=Y(e,0,a),s=Y(s,0,a),this._offsets={start:e,end:s,factor:1/(e+1+s)}}_generate(){const t=this._adapter,e=this.min,s=this.max,n=this.options,o=n.time,a=o.unit||_n(o.minUnit,e,s,this._getLabelCapacity(e)),r=D(n.ticks.stepSize,1),l=a==="week"?o.isoWeekday:!1,c=Xt(l)||l===!0,h={};let d=e,u,f;if(c&&(d=+t.startOf(d,"isoWeek",l)),d=+t.startOf(d,c?"day":a),t.diff(s,e,a)>1e5*r)throw new Error(e+" and "+s+" are too far apart with stepSize of "+r+" "+a);const g=n.ticks.source==="data"&&this.getDataTimestamps();for(u=d,f=0;u+p)}getLabelForValue(t){const e=this._adapter,s=this.options.time;return s.tooltipFormat?e.format(t,s.tooltipFormat):e.format(t,s.displayFormats.datetime)}format(t,e){const n=this.options.time.displayFormats,o=this._unit,a=e||n[o];return this._adapter.format(t,a)}_tickFormatFunction(t,e,s,n){const o=this.options,a=o.ticks.callback;if(a)return F(a,[t,e,s],this);const r=o.time.displayFormats,l=this._unit,c=this._majorUnit,h=l&&r[l],d=c&&r[c],u=s[e],f=c&&d&&u&&u.major;return this._adapter.format(t,n||(f?d:h))}generateTickLabels(t){let e,s,n;for(e=0,s=t.length;e0?r:1}getDataTimestamps(){let t=this._cache.data||[],e,s;if(t.length)return t;const n=this.getMatchingVisibleMetas();if(this._normalized&&n.length)return this._cache.data=n[0].controller.getAllParsedValues(this);for(e=0,s=n.length;e=i[s].pos&&t<=i[n].pos&&({lo:s,hi:n}=pt(i,"pos",t)),{pos:o,time:r}=i[s],{pos:a,time:l}=i[n]):(t>=i[s].time&&t<=i[n].time&&({lo:s,hi:n}=pt(i,"time",t)),{time:o,pos:r}=i[s],{time:a,pos:l}=i[n]);const c=a-o;return c?r+(l-r)*(t-o)/c:r}class Fi extends ye{constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Fe(e,this.min),this._tableRange=Fe(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:s}=this,n=[],o=[];let a,r,l,c,h;for(a=0,r=t.length;a=e&&c<=s&&n.push(c);if(n.length<2)return[{time:e,pos:0},{time:s,pos:1}];for(a=0,r=n.length;an-o)}_getTimestampsForTable(){let t=this._cache.all||[];if(t.length)return t;const e=this.getDataTimestamps(),s=this.getLabelTimestamps();return e.length&&s.length?t=this.normalize(e.concat(s)):t=e.length?e:s,t=this._cache.all=t,t}getDecimalForValue(t){return(Fe(this._table,t)-this._minPos)/this._tableRange}getValueForPixel(t){const e=this._offsets,s=this.getDecimalForPixel(t)/e.factor-e.end;return Fe(this._table,s*this._tableRange+this._minPos,!0)}}M(Fi,"id","timeseries"),M(Fi,"defaults",ye.defaults);var Oh=Object.freeze({__proto__:null,CategoryScale:Li,LinearScale:Ri,LogarithmicScale:Ei,RadialLinearScale:re,TimeScale:ye,TimeSeriesScale:Fi});const Ch=[Er,hc,oh,Oh];export{Ye as B,Et as C,Ri as L,Li as a,ze as b,nh as c,Uc as d,qc as p,Ch as r}; -//# sourceMappingURL=vendor-charts.DHYGKspN.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/vendor-charts.DHYGKspN.js.map b/deploy-package-20260223-151231/frontend/assets/vendor-charts.DHYGKspN.js.map deleted file mode 100644 index 6169321..0000000 --- a/deploy-package-20260223-151231/frontend/assets/vendor-charts.DHYGKspN.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"vendor-charts.DHYGKspN.js","sources":["../../node_modules/@kurkle/color/dist/color.esm.js","../../node_modules/chart.js/dist/chunks/helpers.dataset.js","../../node_modules/chart.js/dist/chart.js"],"sourcesContent":["/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/*!\n * Chart.js v4.5.1\n * https://www.chartjs.org\n * (c) 2025 Chart.js Contributors\n * Released under the MIT License\n */\nimport { Color } from '@kurkle/color';\n\n/**\n * @namespace Chart.helpers\n */ /**\n * An empty function that can be used, for example, for optional callback.\n */ function noop() {\n/* noop */ }\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */ const uid = (()=>{\n let id = 0;\n return ()=>id++;\n})();\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isNullOrUndef(value) {\n return value === null || value === undefined;\n}\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */ function isArray(value) {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isObject(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */ function isNumberFinite(value) {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */ function finiteOrDefault(value, defaultValue) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */ function valueOrDefault(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 : +value / dimension;\nconst toDimension = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 * dimension : +value;\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */ function callback(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n let i, len, keys;\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for(i = len - 1; i >= 0; i--){\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for(i = 0; i < len; i++){\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */ function _elementsEqual(a0, a1) {\n let i, ilen, v0, v1;\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n for(i = 0, ilen = a0.length; i < ilen; ++i){\n v0 = a0[i];\n v1 = a1[i];\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n return true;\n}\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */ function clone(source) {\n if (isArray(source)) {\n return source.map(clone);\n }\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n for(; k < klen; ++k){\n target[keys[k]] = clone(source[keys[k]]);\n }\n return target;\n }\n return source;\n}\nfunction isValidKey(key) {\n return [\n '__proto__',\n 'prototype',\n 'constructor'\n ].indexOf(key) === -1;\n}\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */ function _merger(key, target, source, options) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\nfunction merge(target, source, options) {\n const sources = isArray(source) ? source : [\n source\n ];\n const ilen = sources.length;\n if (!isObject(target)) {\n return target;\n }\n options = options || {};\n const merger = options.merger || _merger;\n let current;\n for(let i = 0; i < ilen; ++i){\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n const keys = Object.keys(current);\n for(let k = 0, klen = keys.length; k < klen; ++k){\n merger(keys[k], target, current, options);\n }\n }\n return target;\n}\nfunction mergeIf(target, source) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {\n merger: _mergerIf\n });\n}\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */ function _mergerIf(key, target, source) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n/**\n * @private\n */ function _deprecated(scope, value, previous, current) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous + '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': (v)=>v,\n // default resolvers\n x: (o)=>o.x,\n y: (o)=>o.y\n};\n/**\n * @private\n */ function _splitKey(key) {\n const parts = key.split('.');\n const keys = [];\n let tmp = '';\n for (const part of parts){\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\nfunction _getKeyResolver(key) {\n const keys = _splitKey(key);\n return (obj)=>{\n for (const k of keys){\n if (k === '') {\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\nfunction resolveObjectKey(obj, key) {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n/**\n * @private\n */ function _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value)=>typeof value !== 'undefined';\nconst isFunction = (value)=>typeof value === 'function';\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nconst setsEqual = (a, b)=>{\n if (a.size !== b.size) {\n return false;\n }\n for (const item of a){\n if (!b.has(item)) {\n return false;\n }\n }\n return true;\n};\n/**\n * @param e - The event\n * @private\n */ function _isClickEvent(e) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */ const PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction almostEquals(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n}\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */ function niceNum(range) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */ function _factorize(value) {\n const result = [];\n const sqrt = Math.sqrt(value);\n let i;\n for(i = 1; i < sqrt; i++){\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) {\n result.push(sqrt);\n }\n result.sort((a, b)=>a - b).pop();\n return result;\n}\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */ function isNonPrimitive(n) {\n return typeof n === 'symbol' || typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n);\n}\nfunction isNumber(n) {\n return !isNonPrimitive(n) && !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostWhole(x, epsilon) {\n const rounded = Math.round(x);\n return rounded - epsilon <= x && rounded + epsilon >= x;\n}\n/**\n * @private\n */ function _setMinAndMaxByKey(array, target, property) {\n let i, ilen, value;\n for(i = 0, ilen = array.length; i < ilen; i++){\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\nfunction toRadians(degrees) {\n return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n return radians * (180 / PI);\n}\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */ function _decimalPlaces(x) {\n if (!isNumberFinite(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while(Math.round(x * e) / e !== x){\n e *= 10;\n p++;\n }\n return p;\n}\n// Gets the angle from vertical upright to the point about a centre.\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n if (angle < -0.5 * PI) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */ function _angleDiff(a, b) {\n return (a - b + PITAU) % TAU - PI;\n}\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */ function _normalizeAngle(a) {\n return (a % TAU + TAU) % TAU;\n}\n/**\n * @private\n */ function _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle;\n}\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */ function _limitValue(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\n/**\n * @param {number} value\n * @private\n */ function _int16Range(value) {\n return _limitValue(value, -32768, 32767);\n}\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */ function _isBetween(value, start, end, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n\nfunction _lookup(table, value, cmp) {\n cmp = cmp || ((index)=>table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid;\n while(hi - lo > 1){\n mid = lo + hi >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return {\n lo,\n hi\n };\n}\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */ const _lookupByKey = (table, key, value, last)=>_lookup(table, value, last ? (index)=>{\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n } : (index)=>table[index][key] < value);\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */ const _rlookupByKey = (table, key, value)=>_lookup(table, value, (index)=>table[index][key] >= value);\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */ function _filterBetween(values, min, max) {\n let start = 0;\n let end = values.length;\n while(start < end && values[start] < min){\n start++;\n }\n while(end > start && values[end - 1] > max){\n end--;\n }\n return start > 0 || end < values.length ? values.slice(start, end) : values;\n}\nconst arrayEvents = [\n 'push',\n 'pop',\n 'shift',\n 'splice',\n 'unshift'\n];\nfunction listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [\n listener\n ]\n }\n });\n arrayEvents.forEach((key)=>{\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value (...args) {\n const res = base.apply(this, args);\n array._chartjs.listeners.forEach((object)=>{\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n return res;\n }\n });\n });\n}\nfunction unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n if (listeners.length > 0) {\n return;\n }\n arrayEvents.forEach((key)=>{\n delete array[key];\n });\n delete array._chartjs;\n}\n/**\n * @param items\n */ function _arrayUnique(items) {\n const set = new Set(items);\n if (set.size === items.length) {\n return items;\n }\n return Array.from(set);\n}\n\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n/**\n* Request animation polyfill\n*/ const requestAnimFrame = function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}();\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */ function throttled(fn, thisArg) {\n let argsToUse = [];\n let ticking = false;\n return function(...args) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, ()=>{\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n/**\n * Debounces calling `fn` for `delay` ms\n */ function debounce(fn, delay) {\n let timeout;\n return function(...args) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */ const _toLeftRightCenter = (align)=>align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */ const _alignStartEnd = (align, start, end)=>align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */ const _textX = (align, left, right, rtl)=>{\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n/**\n * Return start and count of visible points.\n * @private\n */ function _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n const pointCount = points.length;\n let start = 0;\n let count = pointCount;\n if (meta._sorted) {\n const { iScale , vScale , _parsed } = meta;\n const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n const axis = iScale.axis;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = Math.min(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n if (spanGaps) {\n const distanceToDefinedLo = _parsed.slice(0, start + 1).reverse().findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n start -= Math.max(0, distanceToDefinedLo);\n }\n start = _limitValue(start, 0, pointCount - 1);\n }\n if (maxDefined) {\n let end = Math.max(// @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1, // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n if (spanGaps) {\n const distanceToDefinedHi = _parsed.slice(end - 1).findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n end += Math.max(0, distanceToDefinedHi);\n }\n count = _limitValue(end, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n return {\n start,\n count\n };\n}\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */ function _scaleRangesChanged(meta) {\n const { xScale , yScale , _scaleRanges } = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min || _scaleRanges.xmax !== xScale.max || _scaleRanges.ymin !== yScale.min || _scaleRanges.ymax !== yScale.max;\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n\nconst atEdge = (t)=>t === 0 || t === 1;\nconst elasticIn = (t, s, p)=>-(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p)=>Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */ const effects = {\n linear: (t)=>t,\n easeInQuad: (t)=>t * t,\n easeOutQuad: (t)=>-t * (t - 2),\n easeInOutQuad: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1),\n easeInCubic: (t)=>t * t * t,\n easeOutCubic: (t)=>(t -= 1) * t * t + 1,\n easeInOutCubic: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2),\n easeInQuart: (t)=>t * t * t * t,\n easeOutQuart: (t)=>-((t -= 1) * t * t * t - 1),\n easeInOutQuart: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2),\n easeInQuint: (t)=>t * t * t * t * t,\n easeOutQuint: (t)=>(t -= 1) * t * t * t * t + 1,\n easeInOutQuint: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2),\n easeInSine: (t)=>-Math.cos(t * HALF_PI) + 1,\n easeOutSine: (t)=>Math.sin(t * HALF_PI),\n easeInOutSine: (t)=>-0.5 * (Math.cos(PI * t) - 1),\n easeInExpo: (t)=>t === 0 ? 0 : Math.pow(2, 10 * (t - 1)),\n easeOutExpo: (t)=>t === 1 ? 1 : -Math.pow(2, -10 * t) + 1,\n easeInOutExpo: (t)=>atEdge(t) ? t : t < 0.5 ? 0.5 * Math.pow(2, 10 * (t * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n easeInCirc: (t)=>t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1),\n easeOutCirc: (t)=>Math.sqrt(1 - (t -= 1) * t),\n easeInOutCirc: (t)=>(t /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n easeInElastic: (t)=>atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n easeOutElastic: (t)=>atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n easeInOutElastic (t) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t : t < 0.5 ? 0.5 * elasticIn(t * 2, s, p) : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n easeInBack (t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n easeOutBack (t) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n easeInOutBack (t) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);\n },\n easeInBounce: (t)=>1 - effects.easeOutBounce(1 - t),\n easeOutBounce (t) {\n const m = 7.5625;\n const d = 2.75;\n if (t < 1 / d) {\n return m * t * t;\n }\n if (t < 2 / d) {\n return m * (t -= 1.5 / d) * t + 0.75;\n }\n if (t < 2.5 / d) {\n return m * (t -= 2.25 / d) * t + 0.9375;\n }\n return m * (t -= 2.625 / d) * t + 0.984375;\n },\n easeInOutBounce: (t)=>t < 0.5 ? effects.easeInBounce(t * 2) * 0.5 : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5\n};\n\nfunction isPatternOrGradient(value) {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n return false;\n}\nfunction color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\nfunction getHoverColor(value) {\n return isPatternOrGradient(value) ? value : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst numbers = [\n 'x',\n 'y',\n 'borderWidth',\n 'radius',\n 'tension'\n];\nconst colors = [\n 'color',\n 'borderColor',\n 'backgroundColor'\n];\nfunction applyAnimationsDefaults(defaults) {\n defaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined\n });\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name)=>name !== 'onProgress' && name !== 'onComplete' && name !== 'fn'\n });\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n }\n });\n defaults.describe('animations', {\n _fallback: 'animation'\n });\n defaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0\n }\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: (v)=>v | 0\n }\n }\n }\n });\n}\n\nfunction applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\nfunction formatNumber(num, locale, options) {\n return getNumberFormat(locale, options).format(num);\n}\n\nconst formatters = {\n values (value) {\n return isArray(value) ? value : '' + value;\n },\n numeric (tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue;\n if (ticks.length > 1) {\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n delta = calculateDelta(tickValue, ticks);\n }\n const logDelta = log10(Math.abs(delta));\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n const options = {\n notation,\n minimumFractionDigits: numDecimal,\n maximumFractionDigits: numDecimal\n };\n Object.assign(options, this.options.ticks.format);\n return formatNumber(tickValue, locale, options);\n },\n logarithmic (tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue)));\n if ([\n 1,\n 2,\n 3,\n 5,\n 10,\n 15\n ].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n};\nfunction calculateDelta(tickValue, ticks) {\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n var Ticks = {\n formatters\n};\n\nfunction applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n bounds: 'ticks',\n clip: true,\n grace: 0,\n grid: {\n display: true,\n lineWidth: 1,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options)=>options.lineWidth,\n tickColor: (_ctx, options)=>options.color,\n offset: false\n },\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n title: {\n display: false,\n text: '',\n padding: {\n top: 4,\n bottom: 4\n }\n },\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2\n }\n });\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n defaults.describe('scale', {\n _fallback: false,\n _scriptable: (name)=>!name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name)=>name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash'\n });\n defaults.describe('scales', {\n _fallback: 'scale'\n });\n defaults.describe('scale.ticks', {\n _scriptable: (name)=>name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name)=>name !== 'backdropPadding'\n });\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\n function getScope$1(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for(let i = 0, n = keys.length; i < n; ++i){\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope$1(root, scope), values);\n }\n return merge(getScope$1(root, ''), scope);\n}\n class Defaults {\n constructor(_descriptors, _appliers){\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context)=>context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options)=>getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options)=>getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options)=>getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true,\n includeInvisible: false\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.drawActiveElementsOnTop = true;\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n set(scope, values) {\n return set(this, scope, values);\n }\n get(scope) {\n return getScope$1(this, scope);\n }\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n override(scope, values) {\n return set(overrides, scope, values);\n }\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope$1(this, scope);\n const targetScopeObject = getScope$1(this, targetScope);\n const privateName = '_' + name;\n Object.defineProperties(scopeObject, {\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n [name]: {\n enumerable: true,\n get () {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set (value) {\n this[privateName] = value;\n }\n }\n });\n }\n apply(appliers) {\n appliers.forEach((apply)=>apply(this));\n }\n}\nvar defaults = /* #__PURE__ */ new Defaults({\n _scriptable: (name)=>!name.startsWith('on'),\n _indexable: (name)=>name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false\n }\n}, [\n applyAnimationsDefaults,\n applyLayoutsDefaults,\n applyScaleDefaults\n]);\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */ function toFontString(font) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n return (font.style ? font.style + ' ' : '') + (font.weight ? font.weight + ' ' : '') + font.size + 'px ' + font.family;\n}\n/**\n * @private\n */ function _measureText(ctx, data, gc, longest, string) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\n/**\n * @private\n */ // eslint-disable-next-line complexity\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n ctx.save();\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i, j, jlen, thing, nestedThing;\n for(i = 0; i < ilen; i++){\n thing = arrayOfThings[i];\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for(j = 0, jlen = thing.length; j < jlen; j++){\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n ctx.restore();\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for(i = 0; i < gcLen; i++){\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */ function _alignPixel(chart, pixel, width) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n/**\n * Clears the entire canvas.\n */ function clearCanvas(canvas, ctx) {\n if (!ctx && !canvas) {\n return;\n }\n ctx = ctx || canvas.getContext('2d');\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n// eslint-disable-next-line complexity\nfunction drawPointLegend(ctx, options, x, y, w) {\n let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n ctx.beginPath();\n switch(style){\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */ case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */ case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */ function _isPointInArea(point, area, margin) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin;\n}\nfunction clipArea(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\nfunction unclipArea(ctx) {\n ctx.restore();\n}\n/**\n * @private\n */ function _steppedLineTo(ctx, previous, target, flip, mode) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\n/**\n * @private\n */ function _bezierCurveTo(ctx, previous, target, flip) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(flip ? previous.cp1x : previous.cp2x, flip ? previous.cp1y : previous.cp2y, flip ? target.cp2x : target.cp1x, flip ? target.cp2y : target.cp1y, target.x, target.y);\n}\nfunction setRenderOpts(ctx, opts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */ const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\nfunction drawBackdrop(ctx, opts) {\n const oldColor = ctx.fillStyle;\n ctx.fillStyle = opts.color;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n/**\n * Render text onto the canvas\n */ function renderText(ctx, text, x, y, font, opts = {}) {\n const lines = isArray(text) ? text : [\n text\n ];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i, line;\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n for(i = 0; i < lines.length; ++i){\n line = lines[i];\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n y += Number(font.lineHeight);\n }\n ctx.restore();\n}\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */ function addRoundedRectPath(ctx, rect) {\n const { x , y , w , h , radius } = rect;\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n/**\n * @alias Chart.helpers.options\n * @namespace\n */ /**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */ function toLineHeight(value, size) {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n value = +matches[2];\n switch(matches[3]){\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n }\n return size * value;\n}\nconst numberOrZero = (v)=>+v || 0;\nfunction _readValueToProps(value, props) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value) ? objProps ? (prop)=>valueOrDefault(value[prop], value[props[prop]]) : (prop)=>value[prop] : ()=>value;\n for (const prop of keys){\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */ function toTRBL(value) {\n return _readValueToProps(value, {\n top: 'y',\n right: 'x',\n bottom: 'y',\n left: 'x'\n });\n}\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */ function toTRBLCorners(value) {\n return _readValueToProps(value, [\n 'topLeft',\n 'topRight',\n 'bottomLeft',\n 'bottomRight'\n ]);\n}\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */ function toPadding(value) {\n const obj = toTRBL(value);\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n return obj;\n}\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */ function toFont(options, fallback) {\n options = options || {};\n fallback = fallback || defaults.font;\n let size = valueOrDefault(options.size, fallback.size);\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = undefined;\n }\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n font.string = toFontString(font);\n return font;\n}\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */ function resolve(inputs, context, index, info) {\n let cacheable = true;\n let i, ilen, value;\n for(i = 0, ilen = inputs.length; i < ilen; ++i){\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */ function _addGrace(minmax, grace, beginAtZero) {\n const { min , max } = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value, add)=>beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\nfunction createContext(parentContext, context) {\n return Object.assign(Object.create(parentContext), context);\n}\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */ function _createResolver(scopes, prefixes = [\n ''\n], rootScopes, fallback, getTarget = ()=>scopes[0]) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope)=>_createResolver([\n scope,\n ...scopes\n ], prefixes, finalRootScopes, fallback)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop) {\n return _cached(target, prop, ()=>_resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys (target) {\n return getKeysFromAllScopes(target);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n });\n}\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */ function _attachContext(proxy, context, subProxy, descriptorDefaults) {\n const cache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx)=>_attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope)=>_attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */ deleteProperty (target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n /**\n * A trap for getting property values.\n */ get (target, prop, receiver) {\n return _cached(target, prop, ()=>_resolveWithContext(target, prop, receiver));\n },\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */ getOwnPropertyDescriptor (target, prop) {\n return target._descriptors.allKeys ? Reflect.has(proxy, prop) ? {\n enumerable: true,\n configurable: true\n } : undefined : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n /**\n * A trap for Object.getPrototypeOf.\n */ getPrototypeOf () {\n return Reflect.getPrototypeOf(proxy);\n },\n /**\n * A trap for the in operator.\n */ has (target, prop) {\n return Reflect.has(proxy, prop);\n },\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */ ownKeys () {\n return Reflect.ownKeys(proxy);\n },\n /**\n * A trap for setting property values.\n */ set (target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n });\n}\n/**\n * @private\n */ function _descriptors(proxy, defaults = {\n scriptable: true,\n indexable: true\n}) {\n const { _scriptable =defaults.scriptable , _indexable =defaults.indexable , _allKeys =defaults.allKeys } = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : ()=>_scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : ()=>_indexable\n };\n}\nconst readKey = (prefix, name)=>prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value)=>isObject(value) && prop !== 'adapters' && (Object.getPrototypeOf(value) === null || value.constructor === Object);\nfunction _cached(target, prop, resolve) {\n if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n return target[prop];\n }\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n let value = _proxy[prop]; // resolve from proxy\n // resolve with context\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\nfunction _resolveScriptable(prop, getValue, target, receiver) {\n const { _proxy , _context , _subProxy , _stack } = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n const { _proxy , _context , _subProxy , _descriptors: descriptors } = target;\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\n const arr = value;\n const scopes = _proxy._scopes.filter((s)=>s !== arr);\n value = [];\n for (const item of arr){\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent)=>key === true ? parent : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback, value) {\n for (const parent of parentScopes){\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [\n ...parentScopes,\n ...rootScopes\n ];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [\n ''\n ], rootScopes, fallback, ()=>subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback, item) {\n while(key){\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n let value;\n for (const prefix of prefixes){\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value;\n }\n }\n}\nfunction _resolve(key, scopes) {\n for (const scope of scopes){\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\nfunction getKeysFromAllScopes(target) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n const set = new Set();\n for (const scope of scopes){\n for (const key of Object.keys(scope).filter((k)=>!k.startsWith('_'))){\n set.add(key);\n }\n }\n return Array.from(set);\n}\nfunction _parseObjectDataRadialScale(meta, data, start, count) {\n const { iScale } = meta;\n const { key ='r' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i)=>i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis)=>indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n // This function must also respect \"skipped\" points\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\n/**\n * Adjust tangents to ensure monotonic properties\n */ function monotoneAdjust(points, deltaK, mK) {\n const pointsLen = points.length;\n let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen - 1; ++i){\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(let i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */ function splineCurveMonotone(points, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK = Array(pointsLen).fill(0);\n const mK = Array(pointsLen);\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for(i = 0; i < pointsLen; ++i){\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i] : !pointAfter ? deltaK[i - 1] : sign(deltaK[i - 1]) !== sign(deltaK[i]) ? 0 : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n monotoneAdjust(points, deltaK, mK);\n monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for(i = 0, ilen = points.length; i < ilen; ++i){\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\n/**\n * @private\n */ function _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n let i, ilen, point, controlPoints;\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt)=>!pt.skip);\n }\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for(i = 0, ilen = points.length; i < ilen; ++i){\n point = points[i];\n controlPoints = splineCurve(prev, point, points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen], options.tension);\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n\n/**\n * @private\n */ function _isDomSupported() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n/**\n * @private\n */ function _getParentNode(domNode) {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = parent.host;\n }\n return parent;\n}\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */ function parseMaxStyle(styleValue, node, parentProperty) {\n let valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n return valueInPixels;\n}\nconst getComputedStyle = (element)=>element.ownerDocument.defaultView.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = [\n 'top',\n 'right',\n 'bottom',\n 'left'\n];\nfunction getPositionedStyle(styles, style, suffix) {\n const result = {};\n suffix = suffix ? '-' + suffix : '';\n for(let i = 0; i < 4; i++){\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\nconst useOffsetPos = (x, y, target)=>(x > 0 || y > 0) && (!target || !target.shadowRoot);\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */ function getCanvasPosition(e, canvas) {\n const touches = e.touches;\n const source = touches && touches.length ? touches[0] : e;\n const { offsetX , offsetY } = source;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {\n x,\n y,\n box\n };\n}\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */ function getRelativePosition(event, chart) {\n if ('native' in event) {\n return event;\n }\n const { canvas , currentDevicePixelRatio } = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const { x , y , box } = getCanvasPosition(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n let { width , height } = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\nfunction getContainerSize(canvas, width, height) {\n let maxWidth, maxHeight;\n if (width === undefined || height === undefined) {\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect(); // this is the border box of the container\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\nconst round1 = (v)=>Math.round(v * 10) / 10;\n// eslint-disable-next-line complexity\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let { width , height } = containerSize;\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n return {\n width,\n height\n };\n}\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */ function retinaScale(chart, forceRatio, forceStyle) {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = round1(chart.height * pixelRatio);\n const deviceWidth = round1(chart.width * pixelRatio);\n chart.height = round1(chart.height);\n chart.width = round1(chart.width);\n const canvas = chart.canvas;\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\n if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) {\n chart.currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */ const supportsEventListenerOptions = function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive () {\n passiveSupported = true;\n return false;\n }\n };\n if (_isDomSupported()) {\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n }\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}();\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */ function readUsedSize(element, property) {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n\n/**\n * @private\n */ function _pointInLine(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n/**\n * @private\n */ function _steppedInterpolation(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y : mode === 'after' ? t < 1 ? p1.y : p2.y : t > 0 ? p2.y : p1.y\n };\n}\n/**\n * @private\n */ function _bezierInterpolation(p1, p2, t, mode) {\n const cp1 = {\n x: p1.cp2x,\n y: p1.cp2y\n };\n const cp2 = {\n x: p2.cp1x,\n y: p2.cp1y\n };\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n return {\n x (x) {\n return rectX + rectX + width - x;\n },\n setWidth (w) {\n width = w;\n },\n textAlign (align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus (x, value) {\n return x - value;\n },\n leftForLtr (x, itemWidth) {\n return x - itemWidth;\n }\n };\n};\nconst getLeftToRightAdapter = function() {\n return {\n x (x) {\n return x;\n },\n setWidth (w) {},\n textAlign (align) {\n return align;\n },\n xPlus (x, value) {\n return x + value;\n },\n leftForLtr (x, _itemWidth) {\n return x;\n }\n };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n let style, original;\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction')\n ];\n style.setProperty('direction', direction, 'important');\n ctx.prevTextDirection = original;\n }\n}\nfunction restoreTextDirection(ctx, original) {\n if (original !== undefined) {\n delete ctx.prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle\n };\n }\n return {\n between: _isBetween,\n compare: (a, b)=>a - b,\n normalize: (x)=>x\n };\n}\nfunction normalizeSegment({ start , end , count , loop , style }) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\nfunction getSegment(segment, points, bounds) {\n const { property , start: startBound , end: endBound } = bounds;\n const { between , normalize } = propertyFn(property);\n const count = points.length;\n let { start , end , loop } = segment;\n let i, ilen;\n if (loop) {\n start += count;\n end += count;\n for(i = 0, ilen = count; i < ilen; ++i){\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n if (end < start) {\n end += count;\n }\n return {\n start,\n end,\n loop,\n style: segment.style\n };\n}\n function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [\n segment\n ];\n }\n const { property , start: startBound , end: endBound } = bounds;\n const count = points.length;\n const { compare , between , normalize } = propertyFn(property);\n const { start , end , loop , style } = getSegment(segment, points, bounds);\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n const startIsBefore = ()=>between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = ()=>compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = ()=>inside || startIsBefore();\n const shouldStop = ()=>!inside || endIsBefore();\n for(let i = start, prev = start; i <= end; ++i){\n point = points[i % count];\n if (point.skip) {\n continue;\n }\n value = normalize(point[property]);\n if (value === prevValue) {\n continue;\n }\n inside = between(value, startBound, endBound);\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({\n start: subStart,\n end: i,\n loop,\n count,\n style\n }));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n if (subStart !== null) {\n result.push(normalizeSegment({\n start: subStart,\n end,\n loop,\n count,\n style\n }));\n }\n return result;\n}\n function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n for(let i = 0; i < segments.length; i++){\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\n function findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n if (loop && !spanGaps) {\n while(start < count && !points[start].skip){\n start++;\n }\n }\n while(start < count && points[start].skip){\n start++;\n }\n start %= count;\n if (loop) {\n end += start;\n }\n while(end > start && points[end % count].skip){\n end--;\n }\n end %= count;\n return {\n start,\n end\n };\n}\n function solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n for(end = start + 1; end <= max; ++end){\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({\n start: start % count,\n end: (end - 1) % count,\n loop\n });\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n if (last !== null) {\n result.push({\n start: start % count,\n end: last % count,\n loop\n });\n }\n return result;\n}\n function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n if (!count) {\n return [];\n }\n const loop = !!line._loop;\n const { start , end } = findStartAndEnd(points, count, loop, spanGaps);\n if (spanGaps === true) {\n return splitByStyles(line, [\n {\n start,\n end,\n loop\n }\n ], points, segmentOptions);\n }\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n function splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\n function doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const { _datasetIndex: datasetIndex , options: { spanGaps } } = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n s += count;\n while(points[s % count].skip){\n s -= dir;\n }\n while(points[e % count].skip){\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({\n start: s % count,\n end: e % count,\n loop: l,\n style: st\n });\n prevStyle = st;\n start = e % count;\n }\n }\n for (const segment of segments){\n start = spanGaps ? start : segment.start;\n let prev = points[start % count];\n let style;\n for(i = start + 1; i <= segment.end; i++){\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n return result;\n}\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n\nfunction getSizeForArea(scale, chartArea, field) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\nfunction getDatasetArea(meta, chartArea) {\n const { xScale , yScale } = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\nfunction getDatasetClipArea(chart, meta) {\n const clip = meta._clip;\n if (clip.disabled) {\n return false;\n }\n const area = getDatasetArea(meta, chart.chartArea);\n return {\n left: clip.left === false ? 0 : area.left - (clip.left === true ? 0 : clip.left),\n right: clip.right === false ? chart.width : area.right + (clip.right === true ? 0 : clip.right),\n top: clip.top === false ? 0 : area.top - (clip.top === true ? 0 : clip.top),\n bottom: clip.bottom === false ? chart.height : area.bottom + (clip.bottom === true ? 0 : clip.bottom)\n };\n}\n\nexport { unclipArea as $, _rlookupByKey as A, _lookupByKey as B, _isPointInArea as C, getAngleFromPoint as D, toPadding as E, each as F, getMaximumSize as G, HALF_PI as H, _getParentNode as I, readUsedSize as J, supportsEventListenerOptions as K, throttled as L, _isDomSupported as M, _factorize as N, finiteOrDefault as O, PI as P, callback as Q, _addGrace as R, _limitValue as S, TAU as T, toDegrees as U, _measureText as V, _int16Range as W, _alignPixel as X, clipArea as Y, renderText as Z, _arrayUnique as _, resolve as a, getStyle as a$, toFont as a0, _toLeftRightCenter as a1, _alignStartEnd as a2, overrides as a3, merge as a4, _capitalize as a5, descriptors as a6, isFunction as a7, _attachContext as a8, _createResolver as a9, getRtlAdapter as aA, overrideTextDirection as aB, _textX as aC, restoreTextDirection as aD, drawPointLegend as aE, distanceBetweenPoints as aF, noop as aG, _setMinAndMaxByKey as aH, niceNum as aI, almostWhole as aJ, almostEquals as aK, _decimalPlaces as aL, Ticks as aM, log10 as aN, _longestText as aO, _filterBetween as aP, _lookup as aQ, isPatternOrGradient as aR, getHoverColor as aS, clone as aT, _merger as aU, _mergerIf as aV, _deprecated as aW, _splitKey as aX, toFontString as aY, splineCurve as aZ, splineCurveMonotone as a_, _descriptors as aa, mergeIf as ab, uid as ac, debounce as ad, retinaScale as ae, clearCanvas as af, setsEqual as ag, getDatasetClipArea as ah, _elementsEqual as ai, _isClickEvent as aj, _isBetween as ak, _normalizeAngle as al, _readValueToProps as am, _updateBezierControlPoints as an, _computeSegments as ao, _boundSegments as ap, _steppedInterpolation as aq, _bezierInterpolation as ar, _pointInLine as as, _steppedLineTo as at, _bezierCurveTo as au, drawPoint as av, addRoundedRectPath as aw, toTRBL as ax, toTRBLCorners as ay, _boundSegment as az, isArray as b, fontString as b0, toLineHeight as b1, PITAU as b2, INFINITY as b3, RAD_PER_DEG as b4, QUARTER_PI as b5, TWO_THIRDS_PI as b6, _angleDiff as b7, color as c, defaults as d, effects as e, resolveObjectKey as f, isNumberFinite as g, defined as h, isObject as i, createContext as j, isNullOrUndef as k, listenArrayEvents as l, toPercentage as m, toDimension as n, formatNumber as o, _angleBetween as p, _getStartAndCountOfVisiblePoints as q, requestAnimFrame as r, sign as s, toRadians as t, unlistenArrayEvents as u, valueOrDefault as v, _scaleRangesChanged as w, isNumber as x, _parseObjectDataRadialScale as y, getRelativePosition as z };\n//# sourceMappingURL=helpers.dataset.js.map\n","/*!\n * Chart.js v4.5.1\n * https://www.chartjs.org\n * (c) 2025 Chart.js Contributors\n * Released under the MIT License\n */\nimport { r as requestAnimFrame, a as resolve, e as effects, c as color, i as isObject, d as defaults, b as isArray, v as valueOrDefault, u as unlistenArrayEvents, l as listenArrayEvents, f as resolveObjectKey, g as isNumberFinite, h as defined, s as sign, j as createContext, k as isNullOrUndef, _ as _arrayUnique, t as toRadians, m as toPercentage, n as toDimension, T as TAU, o as formatNumber, p as _angleBetween, H as HALF_PI, P as PI, q as _getStartAndCountOfVisiblePoints, w as _scaleRangesChanged, x as isNumber, y as _parseObjectDataRadialScale, z as getRelativePosition, A as _rlookupByKey, B as _lookupByKey, C as _isPointInArea, D as getAngleFromPoint, E as toPadding, F as each, G as getMaximumSize, I as _getParentNode, J as readUsedSize, K as supportsEventListenerOptions, L as throttled, M as _isDomSupported, N as _factorize, O as finiteOrDefault, Q as callback, R as _addGrace, S as _limitValue, U as toDegrees, V as _measureText, W as _int16Range, X as _alignPixel, Y as clipArea, Z as renderText, $ as unclipArea, a0 as toFont, a1 as _toLeftRightCenter, a2 as _alignStartEnd, a3 as overrides, a4 as merge, a5 as _capitalize, a6 as descriptors, a7 as isFunction, a8 as _attachContext, a9 as _createResolver, aa as _descriptors, ab as mergeIf, ac as uid, ad as debounce, ae as retinaScale, af as clearCanvas, ag as setsEqual, ah as getDatasetClipArea, ai as _elementsEqual, aj as _isClickEvent, ak as _isBetween, al as _normalizeAngle, am as _readValueToProps, an as _updateBezierControlPoints, ao as _computeSegments, ap as _boundSegments, aq as _steppedInterpolation, ar as _bezierInterpolation, as as _pointInLine, at as _steppedLineTo, au as _bezierCurveTo, av as drawPoint, aw as addRoundedRectPath, ax as toTRBL, ay as toTRBLCorners, az as _boundSegment, aA as getRtlAdapter, aB as overrideTextDirection, aC as _textX, aD as restoreTextDirection, aE as drawPointLegend, aF as distanceBetweenPoints, aG as noop, aH as _setMinAndMaxByKey, aI as niceNum, aJ as almostWhole, aK as almostEquals, aL as _decimalPlaces, aM as Ticks, aN as log10, aO as _longestText, aP as _filterBetween, aQ as _lookup } from './chunks/helpers.dataset.js';\nimport '@kurkle/color';\n\nclass Animator {\n constructor(){\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n callbacks.forEach((fn)=>fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n this._request = requestAnimFrame.call(window, ()=>{\n this._update();\n this._request = null;\n if (this._running) {\n this._refresh();\n }\n });\n }\n _update(date = Date.now()) {\n let remaining = 0;\n this._charts.forEach((anims, chart)=>{\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n for(; i >= 0; --i){\n item = items[i];\n if (item._active) {\n if (item._total > anims.duration) {\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n remaining += items.length;\n });\n this._lastDate = date;\n if (remaining === 0) {\n this._running = false;\n }\n }\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur)=>Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n for(; i >= 0; --i){\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\nvar animator = /* #__PURE__ */ new Animator();\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean (from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n color (from, to, factor) {\n const c0 = color(from || transparent);\n const c1 = c0.valid && color(to || transparent);\n return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to;\n },\n number (from, to, factor) {\n return from + (to - from) * factor;\n }\n};\nclass Animation {\n constructor(cfg, target, prop, to){\n const currentValue = target[prop];\n to = resolve([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n const from = resolve([\n cfg.from,\n currentValue,\n to\n ]);\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n active() {\n return this._active;\n }\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([\n cfg.to,\n to,\n currentValue,\n cfg.from\n ]);\n this._from = resolve([\n cfg.from,\n currentValue,\n to\n ]);\n }\n }\n cancel() {\n if (this._active) {\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n this._active = from !== to && (loop || elapsed < duration);\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n factor = elapsed / duration % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n this._target[prop] = this._fn(from, to, factor);\n }\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej)=>{\n promises.push({\n res,\n rej\n });\n });\n }\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for(let i = 0; i < promises.length; i++){\n promises[i][method]();\n }\n }\n}\n\nclass Animations {\n constructor(chart, config){\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n Object.getOwnPropertyNames(config).forEach((key)=>{\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions){\n resolved[option] = cfg[option];\n }\n (isArray(cfg.properties) && cfg.properties || [\n key\n ]).forEach((prop)=>{\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n awaitAll(target.options.$animations, newOptions).then(()=>{\n target.options = newOptions;\n }, ()=>{\n });\n }\n return animations;\n }\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n for(i = props.length - 1; i >= 0; --i){\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n if (animation) {\n if (cfg && animation.active()) {\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n target[prop] = value;\n continue;\n }\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n update(target, values) {\n if (this._properties.size === 0) {\n Object.assign(target, values);\n return;\n }\n const animations = this._createAnimations(target, values);\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for(let i = 0; i < keys.length; i++){\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n target.options = options = Object.assign({}, options, {\n $shared: false,\n $animations: {}\n });\n }\n return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\nfunction toClip(value) {\n let t, r, b, l;\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n keys.push(metasets[i].index);\n }\n return keys;\n}\nfunction applyStack(stack, value, dsIndex, options = {}) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n if (value === null) {\n return;\n }\n let found = false;\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n found = true;\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isNumberFinite(otherValue) && (singleMode || value === 0 || sign(value) === sign(otherValue))) {\n value += otherValue;\n }\n }\n if (!found && !options.all) {\n return 0;\n }\n return value;\n}\nfunction convertObjectDataToArray(data, meta) {\n const { iScale , vScale } = meta;\n const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for(i = 0, ilen = keys.length; i < ilen; ++i){\n key = keys[i];\n adata[i] = {\n [iAxisKey]: key,\n [vAxisKey]: data[key]\n };\n }\n return adata;\n}\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || stacked === undefined && meta.stack !== undefined;\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n const { min , max , minDefined , maxDefined } = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()){\n const value = stack[meta.index];\n if (positive && value > 0 || !positive && value < 0) {\n return meta.index;\n }\n }\n return null;\n}\nfunction updateStacks(controller, parsed) {\n const { chart , _cachedMeta: meta } = controller;\n const stacks = chart._stacks || (chart._stacks = {});\n const { iScale , vScale , index: datasetIndex } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n for(let i = 0; i < ilen; ++i){\n const item = parsed[i];\n const { [iAxis]: index , [vAxis]: value } = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter((key)=>scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n return createContext(parent, {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n });\n}\nfunction createDataContext(parent, index, element) {\n return createContext(parent, {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\nfunction clearStacks(meta, items) {\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n items = items || meta._parsed;\n for (const parsed of items){\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\nconst isDirectUpdateMode = (mode)=>mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared)=>shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart)=>canStack && !meta.hidden && meta._stacked && {\n keys: getSortedDatasetIndices(chart, true),\n values: null\n };\nclass DatasetController {\n static defaults = {};\n static datasetElementType = null;\n static dataElementType = null;\n constructor(chart, datasetIndex){\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n this.initialize();\n }\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n const chooseId = (axis, x, y, r)=>axis === 'x' ? x : axis === 'r' ? r : y;\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale ? meta.vScale : meta.iScale;\n }\n reset() {\n this._update('reset');\n }\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n if (isObject(data)) {\n const meta = this._cachedMeta;\n this._data = convertObjectDataToArray(data, meta);\n } else if (_data !== data) {\n if (_data) {\n unlistenArrayEvents(_data, this);\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n addElements() {\n const meta = this._cachedMeta;\n this._dataCheck();\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n this._dataCheck();\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n this._resyncElements(resetNewElements);\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n meta._stacked = isStacked(meta.vScale, meta);\n }\n }\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n parse(start, count) {\n const { _cachedMeta: meta , _data: data } = this;\n const { iScale , _stacked } = meta;\n const iAxis = iScale.axis;\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\n const isNotInOrderComparedToPrev = ()=>cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis];\n for(i = 0; i < count; ++i){\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n parsePrimitiveData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const { xScale , yScale } = meta;\n const { xAxisKey ='x' , yAxisKey ='y' } = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for(i = 0, ilen = count; i < ilen; ++i){\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]._visualValues\n };\n return applyStack(stack, value, meta.index, {\n mode\n });\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n const { min: otherMin , max: otherMax } = getUserBounds(otherScale);\n let i, parsed;\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n for(i = 0; i < ilen; ++i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n break;\n }\n }\n if (sorted) {\n for(i = ilen - 1; i >= 0; --i){\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n for(i = 0, ilen = parsed.length; i < ilen; ++i){\n value = parsed[i][scale.axis];\n if (isNumberFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n getMaxOverflow() {\n return false;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n update(mode) {}\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || elements.length - start;\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n for(i = start; i < start + count; ++i){\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n for(i = 0; i < active.length; ++i){\n active[i].draw(ctx, area);\n }\n }\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode);\n }\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context || (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [\n `${elementType}Hover`,\n 'hover',\n elementType,\n ''\n ] : [\n elementType,\n ''\n ];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n const context = ()=>this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n if (values.$shared) {\n values.$shared = sharing;\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n return values;\n }\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions;\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {\n sharedOptions,\n includeOptions\n };\n }\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n options: !active && this.getSharedOptions(options) || options\n });\n }\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n for (const [method, arg1, arg2] of this._syncList){\n this[method](arg1, arg2);\n }\n this._syncList = [];\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n if (count) {\n this.parse(0, count);\n }\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n const move = (arr)=>{\n arr.length += count;\n for(i = arr.length - 1; i >= end; i--){\n arr[i] = arr[i - count];\n }\n };\n move(data);\n for(i = start; i < end; ++i){\n data[i] = new this.dataElementType();\n }\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n this.chart._dataChanges.push([\n this.index,\n ...args\n ]);\n }\n _onDataPush() {\n const count = arguments.length;\n this._sync([\n '_insertElements',\n this.getDataset().data.length - count,\n count\n ]);\n }\n _onDataPop() {\n this._sync([\n '_removeElements',\n this._cachedMeta.data.length - 1,\n 1\n ]);\n }\n _onDataShift() {\n this._sync([\n '_removeElements',\n 0,\n 1\n ]);\n }\n _onDataSplice(start, count) {\n if (count) {\n this._sync([\n '_removeElements',\n start,\n count\n ]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync([\n '_insertElements',\n start,\n newCount\n ]);\n }\n }\n _onDataUnshift() {\n this._sync([\n '_insertElements',\n 0,\n arguments.length\n ]);\n }\n}\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n for(let i = 0, ilen = visibleMetas.length; i < ilen; i++){\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b)=>a - b));\n }\n return scale._cache.$bar;\n}\n function computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = ()=>{\n if (curr === 32767 || curr === -32768) {\n return;\n }\n if (defined(prev)) {\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n for(i = 0, ilen = values.length; i < ilen; ++i){\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n prev = undefined;\n for(i = 0, ilen = scale.ticks.length; i < ilen; ++i){\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n return min;\n}\n function computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n size = thickness * stackCount;\n ratio = 1;\n }\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - size / 2\n };\n}\n function computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n if (prev === null) {\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n if (next === null) {\n next = curr + curr - prev;\n }\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n item[vScale.axis] = barEnd;\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n for(i = start, ilen = start + count; i < ilen; ++i){\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {\n start,\n end,\n reverse,\n top,\n bottom\n };\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n if (edge === true) {\n properties.borderSkipped = {\n top: true,\n right: true,\n bottom: true,\n left: true\n };\n return;\n }\n const { start , end , reverse , top , bottom } = borderProps(properties);\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\nfunction setInflateAmount(properties, { inflateAmount }, ratio) {\n properties.inflateAmount = inflateAmount === 'auto' ? ratio === 1 ? 0.33 : 0 : inflateAmount;\n}\nclass BarController extends DatasetController {\n static id = 'bar';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'base',\n 'width',\n 'height'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true\n }\n }\n };\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseObjectData(meta, data, start, count) {\n const { iScale , vScale } = meta;\n const { xAxisKey ='x' , yAxisKey ='y' } = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for(i = start, ilen = start + count; i < ilen; ++i){\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n getMaxOverflow() {\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const { iScale , vScale } = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom) ? '[' + custom.start + ', ' + custom.end + ']' : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const { index , _cachedMeta: { vScale } } = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n for(let i = start; i < start + count; i++){\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {\n base,\n head: base\n } : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom,\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n _getStacks(last, dataIndex) {\n const { iScale } = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta)=>meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n const iScaleValue = currentParsed && currentParsed[iScale.axis];\n const skipNull = (meta)=>{\n const parsed = meta._parsed.find((item)=>item[iScale.axis] === iScaleValue);\n const val = parsed && parsed[meta.vScale.axis];\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n for (const meta of metasets){\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === undefined && meta.stack === undefined) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n if (!stacks.length) {\n stacks.push(undefined);\n }\n return stacks;\n }\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n _getAxisCount() {\n return this._getAxis().length;\n }\n getFirstScaleIdForIndexAxis() {\n const scales = this.chart.scales;\n const indexScaleId = this.chart.options.indexAxis;\n return Object.keys(scales).filter((key)=>scales[key].axis === indexScaleId).shift();\n }\n _getAxis() {\n const axis = {};\n const firstScaleAxisId = this.getFirstScaleIdForIndexAxis();\n for (const dataset of this.chart.data.datasets){\n axis[valueOrDefault(this.chart.options.indexAxis === 'x' ? dataset.xAxisID : dataset.yAxisID, firstScaleAxisId)] = true;\n }\n return Object.keys(axis);\n }\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = name !== undefined ? stacks.indexOf(name) : -1;\n return index === -1 ? stacks.length - 1 : index;\n }\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n for(i = 0, ilen = meta.data.length; i < ilen; ++i){\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n _calculateBarValuePixels(index) {\n const { _cachedMeta: { vScale , _stacked , index: datasetIndex } , options: { base: baseValue , minBarLength } } = this;\n const actualBase = baseValue || 0;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n if (length !== value) {\n start = length - value;\n length = value;\n }\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n head = base;\n }\n size = head - base;\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n if (_stacked && !floating) {\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n const axisCount = this._getAxisCount();\n if (ruler.grouped) {\n const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options, stackCount * axisCount) : computeFitCategoryTraits(index, ruler, options, stackCount * axisCount);\n const axisID = this.chart.options.indexAxis === 'x' ? this.getDataset().xAxisID : this.getDataset().yAxisID;\n const axisNumber = this._getAxis().indexOf(valueOrDefault(axisID, this.getFirstScaleIdForIndexAxis()));\n const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined) + axisNumber;\n center = range.start + range.chunk * stackIndex + range.chunk / 2;\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n for(; i < ilen; ++i){\n if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n rects[i].draw(this._ctx);\n }\n }\n }\n}\n\nclass BubbleController extends DatasetController {\n static id = 'bubble';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'borderWidth',\n 'radius'\n ]\n }\n }\n };\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for(let i = 0; i < parsed.length; i++){\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n update(mode) {\n const points = this._cachedMeta.data;\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const parsed = !reset && this.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n if (reset) {\n properties.options.radius = 0;\n }\n }\n this.updateElement(point, i, properties, mode);\n }\n }\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n if (values.$shared) {\n values = Object.assign({}, values, {\n $shared: false\n });\n }\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n return values;\n }\n}\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {\n ratioX,\n ratioY,\n offsetX,\n offsetY\n };\n}\nclass DoughnutController extends DatasetController {\n static id = 'doughnut';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'circumference',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'startAngle',\n 'x',\n 'y',\n 'offset',\n 'borderWidth',\n 'spacing'\n ]\n }\n },\n cutout: '50%',\n rotation: 0,\n circumference: 360,\n radius: '100%',\n spacing: 0,\n indexAxis: 'r'\n };\n static descriptors = {\n _scriptable: (name)=>name !== 'spacing',\n _indexable: (name)=>name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash')\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n const { labels: { pointStyle , textAlign , color , useBorderRadius , borderRadius } } = chart.legend.options;\n if (data.labels.length && data.datasets.length) {\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !chart.getDataVisibility(i),\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: style.borderWidth,\n strokeStyle: style.borderColor,\n textAlign: textAlign,\n pointStyle: pointStyle,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n linkScales() {}\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i)=>+data[i];\n if (isObject(data[start])) {\n const { key ='value' } = this._parsing;\n getter = (i)=>+resolveObjectKey(data[i], key);\n }\n let i, ilen;\n for(i = start, ilen = start + count; i < ilen; ++i){\n meta._parsed[i] = getter(i);\n }\n }\n }\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n for(let i = 0; i < this.chart.data.datasets.length; ++i){\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n return {\n rotation: min,\n circumference: max - min\n };\n }\n update(mode) {\n const chart = this.chart;\n const { chartArea } = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n const { circumference , rotation } = this._getRotationExtents();\n const { ratioX , ratioY , offsetX , offsetY } = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n meta.total = this.calculateTotal();\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._getCircumference();\n if (reset && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n for(i = 0; i < start; ++i){\n startAngle += this._circumference(i, reset);\n }\n for(i = start; i < start + count; ++i){\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n this.updateElement(arc, i, properties, mode);\n }\n }\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n for(i = 0; i < metaData.length; i++){\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n return total;\n }\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n return {\n label: labels[index] || '',\n value\n };\n }\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n if (!arcs) {\n for(i = 0, ilen = chart.data.datasets.length; i < ilen; ++i){\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n break;\n }\n }\n }\n if (!arcs) {\n return 0;\n }\n for(i = 0, ilen = arcs.length; i < ilen; ++i){\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n getMaxOffset(arcs) {\n let max = 0;\n for(let i = 0, ilen = arcs.length; i < ilen; ++i){\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n for(let i = 0; i < datasetIndex; ++i){\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n return ringWeightOffset;\n }\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n\nclass LineController extends DatasetController {\n static id = 'line';\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n showLine: true,\n spanGaps: false\n };\n static overrides = {\n scales: {\n _index_: {\n type: 'category'\n },\n _value_: {\n type: 'linear'\n }\n }\n };\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { dataset: line , data: points = [] , _dataset } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n this.updateElements(points, start, count, mode);\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const { sharedOptions , includeOptions } = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = 0; i < pointsCount; ++i){\n const point = points[i];\n const properties = directUpdate ? point : {};\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n const parsed = this.getParsed(i);\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n\nclass PolarAreaController extends DatasetController {\n static id = 'polarArea';\n static defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ]\n }\n },\n indexAxis: 'r',\n startAngle: 0\n };\n static overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels (chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const { labels: { pointStyle , color } } = chart.legend.options;\n return data.labels.map((label, i)=>{\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick (e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n },\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n };\n constructor(chart, datasetIndex){\n super(chart, datasetIndex);\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n return {\n label: labels[index] || '',\n value\n };\n }\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const arcs = this._cachedMeta.data;\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {\n min: Number.POSITIVE_INFINITY,\n max: Number.NEGATIVE_INFINITY\n };\n meta.data.forEach((element, index)=>{\n const parsed = this.getParsed(index).r;\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n return range;\n }\n _updateRadius() {\n const chart = this.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? outerRadius / 100 * opts.cutoutPercentage : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n this.outerRadius = outerRadius - radiusLength * this.index;\n this.innerRadius = this.outerRadius - radiusLength;\n }\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n const defaultAngle = 360 / this.countVisibleElements();\n for(i = 0; i < start; ++i){\n angle += this._computeAngle(i, mode, defaultAngle);\n }\n for(i = start; i < start + count; i++){\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n this.updateElement(arc, i, properties, mode);\n }\n }\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n meta.data.forEach((element, index)=>{\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n return count;\n }\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index) ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle) : 0;\n }\n}\n\nclass PieController extends DoughnutController {\n static id = 'pie';\n static defaults = {\n cutout: 0,\n rotation: 0,\n circumference: 360,\n radius: '100%'\n };\n}\n\nclass RadarController extends DatasetController {\n static id = 'radar';\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n }\n };\n static overrides = {\n aspectRatio: 1,\n scales: {\n r: {\n type: 'radialLinear'\n }\n }\n };\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n line.points = points;\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n this.updateElement(line, undefined, properties, mode);\n }\n this.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n for(let i = start; i < start + count; i++){\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n\nclass ScatterController extends DatasetController {\n static id = 'scatter';\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n static overrides = {\n interaction: {\n mode: 'point'\n },\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const { xScale , yScale } = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n update(mode) {\n const meta = this._cachedMeta;\n const { data: points = [] } = meta;\n const animationsDisabled = this.chart._animationsDisabled;\n let { start , count } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n this._drawStart = start;\n this._drawCount = count;\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n if (this.options.showLine) {\n if (!this.datasetElementType) {\n this.addElements();\n }\n const { dataset: line , _dataset } = meta;\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n delete meta.dataset;\n this.datasetElementType = false;\n }\n this.updateElements(points, start, count, mode);\n }\n addElements() {\n const { showLine } = this.options;\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n super.addElements();\n }\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const { iScale , vScale , _stacked , _dataset } = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const { spanGaps , segment } = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n for(let i = start; i < start + count; ++i){\n const point = points[i];\n const parsed = this.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n if (!this.options.showLine) {\n let max = 0;\n for(let i = data.length - 1; i >= 0; --i){\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPieController: PieController,\nPolarAreaController: PolarAreaController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\n/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */ function abstract() {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */ class DateAdapterBase {\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */ static override(members) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n options;\n constructor(options){\n this.options = options || {};\n }\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n formats() {\n return abstract();\n }\n parse() {\n return abstract();\n }\n format() {\n return abstract();\n }\n add() {\n return abstract();\n }\n diff() {\n return abstract();\n }\n startOf() {\n return abstract();\n }\n endOf() {\n return abstract();\n }\n}\nvar adapters = {\n _date: DateAdapterBase\n};\n\nfunction binarySearch(metaset, axis, value, intersect) {\n const { controller , data , _sorted } = metaset;\n const iScale = controller._cachedMeta.iScale;\n const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n const result = lookupMethod(data, axis, value);\n if (spanGaps) {\n const { vScale } = controller._cachedMeta;\n const { _parsed } = metaset;\n const distanceToDefinedLo = _parsed.slice(0, result.lo + 1).reverse().findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n result.lo -= Math.max(0, distanceToDefinedLo);\n const distanceToDefinedHi = _parsed.slice(result.hi).findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n result.hi += Math.max(0, distanceToDefinedHi);\n }\n return result;\n } else if (controller._sharedOptions) {\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {\n lo: start.lo,\n hi: end.hi\n };\n }\n }\n }\n return {\n lo: 0,\n hi: data.length - 1\n };\n}\n function evaluateInteractionItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for(let i = 0, ilen = metasets.length; i < ilen; ++i){\n const { index , data } = metasets[i];\n const { lo , hi } = binarySearch(metasets[i], axis, value, intersect);\n for(let j = lo; j <= hi; ++j){\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\n function getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\n function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n };\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n function getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n function evaluationFunc(element, datasetIndex, index) {\n const { startAngle , endAngle } = element.getProps([\n 'startAngle',\n 'endAngle'\n ], useFinalPosition);\n const { angle } = getAngleFromPoint(element, {\n x: position.x,\n y: position.y\n });\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [\n {\n element,\n datasetIndex,\n index\n }\n ];\n minDistance = distance;\n } else if (distance === minDistance) {\n items.push({\n element,\n datasetIndex,\n index\n });\n }\n }\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n return axis === 'r' && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n function getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index)=>{\n if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({\n element,\n datasetIndex,\n index\n });\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n var Interaction = {\n evaluateInteractionItems,\n modes: {\n index (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n if (!items.length) {\n return [];\n }\n chart.getSortedVisibleDatasetMetas().forEach((meta)=>{\n const index = items[0].index;\n const element = meta.data[index];\n if (element && !element.skip) {\n elements.push({\n element,\n datasetIndex: meta.index,\n index\n });\n }\n });\n return elements;\n },\n dataset (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for(let i = 0; i < data.length; ++i){\n items.push({\n element: data[i],\n datasetIndex,\n index: i\n });\n }\n }\n return items;\n },\n point (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n nearest (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n x (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n y (chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n\nconst STATIC_POSITIONS = [\n 'left',\n 'top',\n 'right',\n 'bottom'\n];\nfunction filterByPosition(array, position) {\n return array.filter((v)=>v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter((v)=>STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b)=>{\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight;\n });\n}\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n for(i = 0, ilen = (boxes || []).length; i < ilen; ++i){\n box = boxes[i];\n ({ position: pos , options: { stack , stackWeight =1 } } = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && pos + stack,\n stackWeight\n });\n }\n return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts){\n const { stack , pos , stackWeight } = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {\n count: 0,\n placed: 0,\n weight: 0,\n size: 0\n });\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\n function setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const { vBoxMaxWidth , hBoxMaxHeight } = params;\n let i, ilen, layout;\n for(i = 0, ilen = layouts.length; i < ilen; ++i){\n layout = layouts[i];\n const { fullSize } = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter((wrap)=>wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n const { pos , box } = layout;\n const maxPadding = chartArea.maxPadding;\n if (!isObject(pos)) {\n if (layout.size) {\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {\n size: 0,\n count: 1\n };\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n return layout.horizontal ? {\n same: widthChanged,\n other: heightChanged\n } : {\n same: heightChanged,\n other: widthChanged\n };\n}\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n function marginForPositions(positions) {\n const margin = {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n };\n positions.forEach((pos)=>{\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n return horizontal ? marginForPositions([\n 'left',\n 'right'\n ]) : marginForPositions([\n 'top',\n 'bottom'\n ]);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n for(i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i){\n layout = boxes[i];\n box = layout.box;\n box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea));\n const { same , other } = updateDims(chartArea, params, layout, stacks);\n refit |= same && refitBoxes.length;\n changed = changed || other;\n if (!box.fullSize) {\n refitBoxes.push(layout);\n }\n }\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let { x , y } = chartArea;\n for (const layout of boxes){\n const box = layout.box;\n const stack = stacks[layout.stack] || {\n count: 1,\n placed: 0,\n weight: 1\n };\n const weight = layout.stackWeight / stack.weight || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n chartArea.x = x;\n chartArea.y = y;\n}\nvar layouts = {\n addBox (chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n item._layers = item._layers || function() {\n return [\n {\n z: 0,\n draw (chartArea) {\n item.draw(chartArea);\n }\n }\n ];\n };\n chart.boxes.push(item);\n },\n removeBox (chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n configure (chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n update (chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n each(chart.boxes, (box)=>{\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap)=>wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n handleMaxPadding(chartArea);\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w\n };\n each(boxes.chartArea, (layout)=>{\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n });\n });\n }\n};\n\nclass BasePlatform {\n acquireContext(canvas, aspectRatio) {}\n releaseContext(context) {\n return false;\n }\n addEventListener(chart, type, listener) {}\n removeEventListener(chart, type, listener) {}\n getDevicePixelRatio() {\n return 1;\n }\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n isAttached(canvas) {\n return true;\n }\n updateConfig(config) {\n }\n}\n\nclass BasicPlatform extends BasePlatform {\n acquireContext(item) {\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n\nconst EXPANDO_KEY = '$chartjs';\n const EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\nconst isNullOrEmpty = (value)=>value === null || value === '';\n function initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n style.display = style.display || 'block';\n style.boxSizing = style.boxSizing || 'border-box';\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {\n passive: true\n} : false;\nfunction addListener(node, type, listener) {\n if (node) {\n node.addEventListener(type, listener, eventListenerOptions);\n }\n}\nfunction removeListener(chart, type, listener) {\n if (chart && chart.canvas) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n }\n}\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const { x , y } = getRelativePosition(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null\n };\n}\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList){\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver((entries)=>{\n let trigger = false;\n for (const entry of entries){\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {\n childList: true,\n subtree: true\n });\n return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart)=>{\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height)=>{\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n listener();\n }\n }, window);\n const observer = new ResizeObserver((entries)=>{\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event)=>{\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n addListener(canvas, type, proxy);\n return proxy;\n}\n class DomPlatform extends BasePlatform {\n acquireContext(canvas, aspectRatio) {\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n if (context && context.canvas === canvas) {\n initCanvas(canvas, aspectRatio);\n return context;\n }\n return null;\n }\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n const initial = canvas[EXPANDO_KEY].initial;\n [\n 'height',\n 'width'\n ].forEach((prop)=>{\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n const style = initial.style || {};\n Object.keys(style).forEach((key)=>{\n canvas.style[key] = style[key];\n });\n canvas.width = canvas.width;\n delete canvas[EXPANDO_KEY];\n return true;\n }\n addEventListener(chart, type, listener) {\n this.removeEventListener(chart, type);\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n if (!proxy) {\n return;\n }\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n isAttached(canvas) {\n const container = canvas && _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n\nfunction _detectPlatform(canvas) {\n if (!_isDomSupported() || typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nclass Element {\n static defaults = {};\n static defaultRoutes = undefined;\n x;\n y;\n active = false;\n options;\n $animations;\n tooltipPosition(useFinalPosition) {\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n getProps(props, final) {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this;\n }\n const ret = {};\n props.forEach((prop)=>{\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop];\n });\n return ret;\n }\n}\n\nfunction autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for(i = 0, ilen = numMajorIndices - 1; i < ilen; i++){\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\n function calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n const factors = _factorize(evenMajorSpacing);\n for(let i = 0, ilen = factors.length - 1; i < ilen; i++){\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\n function getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\n function skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n spacing = Math.ceil(spacing);\n for(i = 0; i < ticks.length; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\n function skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n next = start;\n while(next < 0){\n count++;\n next = Math.round(start + count * spacing);\n }\n for(i = Math.max(start, 0); i < end; i++){\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\n function getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n if (len < 2) {\n return false;\n }\n for(diff = arr[0], i = 1; i < len; ++i){\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n\nconst reverseAlign = (align)=>align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset)=>edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit)=>Math.min(maxTicksLimit || ticksLength, ticksLength);\n function sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n for(; i < len; i += increment){\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n function getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6;\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n function garbageCollect(caches, length) {\n each(caches, (cache)=>{\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for(i = 0; i < gcLen; ++i){\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\n function getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n function getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n return lines * font.lineHeight + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\nfunction titleAlign(align, position, reverse) {\n let ret = _toLeftRightCenter(align);\n if (reverse && position !== 'right' || !reverse && position === 'right') {\n ret = reverseAlign(ret);\n }\n return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n const { top , left , bottom , right , chart } = scale;\n const { chartArea , scales } = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n}\nclass Scale extends Element {\n constructor(cfg){\n super();\n this.id = cfg.id;\n this.type = cfg.type;\n this.options = undefined;\n this.ctx = cfg.ctx;\n this.chart = cfg.chart;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n this.maxWidth = undefined;\n this.maxHeight = undefined;\n this.paddingTop = undefined;\n this.paddingBottom = undefined;\n this.paddingLeft = undefined;\n this.paddingRight = undefined;\n this.axis = undefined;\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n this.ticks = [];\n this._gridLineItems = null;\n this._labelItems = null;\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n this._startPixel = undefined;\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n init(options) {\n this.options = options.setContext(this.getContext());\n this.axis = options.axis;\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n parse(raw, index) {\n return raw;\n }\n getUserBounds() {\n let { _userMin , _userMax , _suggestedMin , _suggestedMax } = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isNumberFinite(_userMin),\n maxDefined: isNumberFinite(_userMax)\n };\n }\n getMinMax(canStack) {\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n let range;\n if (minDefined && maxDefined) {\n return {\n min,\n max\n };\n }\n const metas = this.getMatchingVisibleMetas();\n for(let i = 0, ilen = metas.length; i < ilen; ++i){\n range = metas[i].controller.getMinMax(this, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n getTicks() {\n return this.ticks;\n }\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n beforeUpdate() {\n callback(this.options.beforeUpdate, [\n this\n ]);\n }\n update(maxWidth, maxHeight, margins) {\n const { beginAtZero , grace , ticks: tickOpts } = this.options;\n const sampleSize = tickOpts.sampleSize;\n this.beforeUpdate();\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom;\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n this.beforeBuildTicks();\n this.ticks = this.buildTicks() || [];\n this.afterBuildTicks();\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n this.configure();\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation();\n this.afterCalculateLabelRotation();\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n if (samplingEnabled) {\n this._convertTicksToLabels(this.ticks);\n }\n this.beforeFit();\n this.fit();\n this.afterFit();\n this.afterUpdate();\n }\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n afterUpdate() {\n callback(this.options.afterUpdate, [\n this\n ]);\n }\n beforeSetDimensions() {\n callback(this.options.beforeSetDimensions, [\n this\n ]);\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = 0;\n this.bottom = this.height;\n }\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n callback(this.options.afterSetDimensions, [\n this\n ]);\n }\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n callback(this.options[name], [\n this\n ]);\n }\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n beforeTickToLabelConversion() {\n callback(this.options.beforeTickToLabelConversion, [\n this\n ]);\n }\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n tick = ticks[i];\n tick.label = callback(tickOpts.callback, [\n tick.value,\n i,\n ticks\n ], this);\n }\n }\n afterTickToLabelConversion() {\n callback(this.options.afterTickToLabelConversion, [\n this\n ]);\n }\n beforeCalculateLabelRotation() {\n callback(this.options.beforeCalculateLabelRotation, [\n this\n ]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n callback(this.options.afterCalculateLabelRotation, [\n this\n ]);\n }\n afterAutoSkip() {}\n beforeFit() {\n callback(this.options.beforeFit, [\n this\n ]);\n }\n fit() {\n const minSize = {\n width: 0,\n height: 0\n };\n const { chart , options: { ticks: tickOpts , title: titleOpts , grid: gridOpts } } = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight;\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n if (tickOpts.display && this.ticks.length) {\n const { first , last , widest , highest } = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n if (isHorizontal) {\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n this._handleMargins();\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n _calculatePadding(first, last, sin, cos) {\n const { ticks: { align , padding } , position } = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n afterFit() {\n callback(this.options.afterFit, [\n this\n ]);\n }\n isHorizontal() {\n const { axis , position } = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n isFullSize() {\n return this.options.fullSize;\n }\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n this.generateTickLabels(ticks);\n let i, ilen;\n for(i = 0, ilen = ticks.length; i < ilen; i++){\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n this.afterTickToLabelConversion();\n }\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n return labelSizes;\n }\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const { ctx , _longestTextCache: caches } = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n for(i = 0; i < length; i += increment){\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {\n data: {},\n gc: []\n };\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n for(j = 0, jlen = label.length; j < jlen; ++j){\n nestedLabel = label[j];\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n const valueAt = (idx)=>({\n width: widths[idx] || 0,\n height: heights[idx] || 0\n });\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights\n };\n }\n getLabelForValue(value) {\n return value;\n }\n getPixelForValue(value, index) {\n return NaN;\n }\n getValueForPixel(pixel) {}\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n getBaseValue() {\n const { min , max } = this;\n return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;\n }\n getContext(index) {\n const ticks = this.ticks || [];\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this));\n }\n _tickSize() {\n const optionTicks = this.options.ticks;\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n const labelSizes = this._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n return this.isHorizontal() ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin;\n }\n _isVisible() {\n const display = this.options.display;\n if (display !== 'auto') {\n return !!display;\n }\n return this.getMatchingVisibleMetas().length > 0;\n }\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const { grid , position , border } = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for(i = 0; i < ticksLength; i += step){\n const context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n lineValue = getPixelForGridLine(this, i, offset);\n if (lineValue === undefined) {\n continue;\n }\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset\n });\n }\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n return items;\n }\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const { position , ticks: optionTicks } = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const { align , crossAlign , padding , mirror } = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = (chartArea.left + chartArea.right) / 2 - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n const labelSizes = this._getLabelSizes();\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n label = tick.label;\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n let tickTextAlign = textAlign;\n if (isHorizontal) {\n x = pixel;\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += lineHeight / 2 * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n let backdrop;\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n switch(textBaseline){\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n }\n switch(textAlign){\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n case 'inner':\n if (i === ilen - 1) {\n left -= width;\n } else if (i > 0) {\n left -= width / 2;\n }\n break;\n }\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n color: optsAtIndex.backdropColor\n };\n }\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [\n x,\n y\n ],\n backdrop\n }\n });\n }\n return items;\n }\n _getXAxisLabelAlignment() {\n const { position , ticks } = this.options;\n const rotation = -toRadians(this.labelRotation);\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n let align = 'center';\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n return align;\n }\n _getYAxisLabelAlignment(tl) {\n const { position , ticks: { crossAlign , mirror , padding } } = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n let textAlign;\n let x;\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = this.right - tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= widest / 2;\n } else {\n textAlign = 'left';\n x = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= widest / 2;\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = this.left + tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n return {\n textAlign,\n x\n };\n }\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n const chart = this.chart;\n const position = this.options.position;\n if (position === 'left' || position === 'right') {\n return {\n top: 0,\n left: this.left,\n bottom: chart.height,\n right: this.right\n };\n }\n if (position === 'top' || position === 'bottom') {\n return {\n top: this.top,\n left: 0,\n bottom: this.bottom,\n right: chart.width\n };\n }\n }\n drawBackground() {\n const { ctx , options: { backgroundColor } , left , top , width , height } = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex((t)=>t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n const drawLine = (p1, p2, style)=>{\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n if (grid.display) {\n for(i = 0, ilen = items.length; i < ilen; ++i){\n const item = items[i];\n if (grid.drawOnChartArea) {\n drawLine({\n x: item.x1,\n y: item.y1\n }, {\n x: item.x2,\n y: item.y2\n }, item);\n }\n if (grid.drawTicks) {\n drawLine({\n x: item.tx1,\n y: item.ty1\n }, {\n x: item.tx2,\n y: item.ty2\n }, {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n });\n }\n }\n }\n }\n drawBorder() {\n const { chart , ctx , options: { border , grid } } = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.restore();\n }\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n if (!optionTicks.display) {\n return;\n }\n const ctx = this.ctx;\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n const items = this.getLabelItems(chartArea);\n for (const item of items){\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n if (area) {\n unclipArea(ctx);\n }\n }\n drawTitle() {\n const { ctx , options: { position , title , reverse } } = this;\n if (!title.display) {\n return;\n }\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n const { titleX , titleY , maxWidth , rotation } = titleArgs(this, offset, position, align);\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n return [\n {\n z: tz,\n draw: (chartArea)=>{\n this.draw(chartArea);\n }\n }\n ];\n }\n return [\n {\n z: gz,\n draw: (chartArea)=>{\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n },\n {\n z: bz,\n draw: ()=>{\n this.drawBorder();\n }\n },\n {\n z: tz,\n draw: (chartArea)=>{\n this.drawLabels(chartArea);\n }\n }\n ];\n }\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n\nclass TypedRegistry {\n constructor(type, scope, override){\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n if (isIChartComponent(proto)) {\n parentScope = this.register(proto);\n }\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n if (id in items) {\n return scope;\n }\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n return scope;\n }\n get(id) {\n return this.items[id];\n }\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n if (id in items) {\n delete items[id];\n }\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\nfunction registerDefaults(item, scope, parentScope) {\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n defaults.set(scope, itemDefaults);\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach((property)=>{\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [\n scope\n ].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n constructor(){\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n this._typedRegistries = [\n this.controllers,\n this.scales,\n this.elements\n ];\n }\n add(...args) {\n this._each('register', args);\n }\n remove(...args) {\n this._each('unregister', args);\n }\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n _each(method, args, typedRegistry) {\n [\n ...args\n ].forEach((arg)=>{\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || reg === this.plugins && arg.id) {\n this._exec(method, reg, arg);\n } else {\n each(arg, (item)=>{\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n callback(component['before' + camelMethod], [], component);\n registry[method](component);\n callback(component['after' + camelMethod], [], component);\n }\n _getRegistryForType(type) {\n for(let i = 0; i < this._typedRegistries.length; i++){\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n return this.plugins;\n }\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n}\nvar registry = /* #__PURE__ */ new Registry();\n\nclass PluginService {\n constructor(){\n this._init = undefined;\n }\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n if (this._init === undefined) {\n return;\n }\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n this._init = undefined;\n }\n return result;\n }\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors){\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [\n chart,\n args,\n descriptor.options\n ];\n if (callback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n return true;\n }\n invalidate() {\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n const descriptors = this._cache = this._createDescriptors(chart);\n this._notifyStateChanges(chart);\n return descriptors;\n }\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\n function allPlugins(config) {\n const localIds = {};\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for(let i = 0; i < keys.length; i++){\n plugins.push(registry.getPlugin(keys[i]));\n }\n const local = config.plugins || [];\n for(let i = 0; i < local.length; i++){\n const plugin = local[i];\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n return {\n plugins,\n localIds\n };\n}\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\nfunction createDescriptors(chart, { plugins , localIds }, options, all) {\n const result = [];\n const context = chart.getContext();\n for (const plugin of plugins){\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, {\n plugin,\n local: localIds[id]\n }, opts, context)\n });\n }\n return result;\n}\nfunction pluginOpts(config, { plugin , local }, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [\n ''\n ], {\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n\nfunction getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\nfunction determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions){\n const axis = opts.axis || axisFromPosition(opts.position) || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {\n axis\n };\n }\n}\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d)=>d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {\n scales: {}\n };\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const scales = Object.create(null);\n Object.keys(configScales).forEach((id)=>{\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [\n {\n axis\n },\n scaleConf,\n defaultScaleOptions[axis],\n defaultScaleOptions[defaultId]\n ]);\n });\n config.data.datasets.forEach((dataset)=>{\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach((defaultID)=>{\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [\n {\n axis\n },\n configScales[id],\n defaultScaleOptions[defaultID]\n ]);\n });\n });\n Object.keys(scales).forEach((key)=>{\n const scale = scales[key];\n mergeIf(scale, [\n defaults.scales[scale.type],\n defaults.scale\n ]);\n });\n return scales;\n}\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n initOptions(config);\n return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\nconst addIfFound = (set, obj, key)=>{\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\nclass Config {\n constructor(config){\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n get platform() {\n return this._config.platform;\n }\n get type() {\n return this._config.type;\n }\n set type(type) {\n this._config.type = type;\n }\n get data() {\n return this._config.data;\n }\n set data(data) {\n this._config.data = initData(data);\n }\n get options() {\n return this._config.options;\n }\n set options(options) {\n this._config.options = options;\n }\n get plugins() {\n return this._config.plugins;\n }\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType, ()=>[\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`, ()=>[\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`\n ],\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`, ()=>[\n [\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]\n ]);\n }\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`, ()=>[\n [\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || []\n ]\n ]);\n }\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n getOptionScopes(mainScope, keyLists, resetCache) {\n const { options , type } = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n const scopes = new Set();\n keyLists.forEach((keys)=>{\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach((key)=>addIfFound(scopes, mainScope, key));\n }\n keys.forEach((key)=>addIfFound(scopes, options, key));\n keys.forEach((key)=>addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach((key)=>addIfFound(scopes, defaults, key));\n keys.forEach((key)=>addIfFound(scopes, descriptors, key));\n });\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n chartOptionScopes() {\n const { options , type } = this;\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {},\n {\n type\n },\n defaults,\n descriptors\n ];\n }\n resolveNamedOptions(scopes, names, context, prefixes = [\n ''\n ]) {\n const result = {\n $shared: true\n };\n const { resolver , subPrefixes } = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n for (const prop of names){\n result[prop] = options[prop];\n }\n return result;\n }\n createResolver(scopes, context, prefixes = [\n ''\n ], descriptorDefaults) {\n const { resolver } = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context) ? _attachContext(resolver, context, undefined, descriptorDefaults) : resolver;\n }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter((p)=>!p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\nconst hasFunction = (value)=>isObject(value) && Object.getOwnPropertyNames(value).some((key)=>isFunction(value[key]));\nfunction needContext(proxy, names) {\n const { isScriptable , isIndexable } = _descriptors(proxy);\n for (const prop of names){\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if (scriptable && (isFunction(value) || hasFunction(value)) || indexable && isArray(value)) {\n return true;\n }\n }\n return false;\n}\n\nvar version = \"4.5.1\";\n\nconst KNOWN_POSITIONS = [\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'chartArea'\n];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x';\n}\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1];\n };\n}\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n chart.notifyPlugins('afterRender');\n callback(animationOptions && animationOptions.onComplete, [\n context\n ], chart);\n}\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callback(animationOptions && animationOptions.onProgress, [\n context\n ], chart);\n}\n function getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n item = item[0];\n }\n if (item && item.canvas) {\n item = item.canvas;\n }\n return item;\n}\nconst instances = {};\nconst getChart = (key)=>{\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c)=>c.canvas === canvas).pop();\n};\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys){\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n function determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\nclass Chart {\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n constructor(item, userConfig){\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error('Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' + ' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.');\n }\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce((mode)=>this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n instances[this.id] = this;\n if (!context || !canvas) {\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n get aspectRatio() {\n const { options: { aspectRatio , maintainAspectRatio } , width , height , _aspectRatio } = this;\n if (!isNullOrUndef(aspectRatio)) {\n return aspectRatio;\n }\n if (maintainAspectRatio && _aspectRatio) {\n return _aspectRatio;\n }\n return height ? width / height : null;\n }\n get data() {\n return this.config.data;\n }\n set data(data) {\n this.config.data = data;\n }\n get options() {\n return this._options;\n }\n set options(options) {\n this.config.options = options;\n }\n get registry() {\n return registry;\n }\n _initialize() {\n this.notifyPlugins('beforeInit');\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n this.bindEvents();\n this.notifyPlugins('afterInit');\n return this;\n }\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n stop() {\n animator.stop(this);\n return this;\n }\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {\n width,\n height\n };\n }\n }\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n this.notifyPlugins('resize', {\n size: newSize\n });\n callback(options.onResize, [\n this,\n newSize\n ], this);\n if (this.attached) {\n if (this._doResize(mode)) {\n this.render();\n }\n }\n }\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n each(scalesOptions, (axisOptions, axisID)=>{\n axisOptions.id = axisID;\n });\n }\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id)=>{\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n if (scaleOpts) {\n items = items.concat(Object.keys(scaleOpts).map((id)=>{\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n }));\n }\n each(items, (item)=>{\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n scale.init(scaleOptions, options);\n });\n each(updated, (hasUpdated, id)=>{\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n each(scales, (scale)=>{\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n metasets.sort((a, b)=>a.index - b.index);\n if (numMeta > numData) {\n for(let i = numData; i < numMeta; ++i){\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n _removeUnreferencedMetasets() {\n const { _metasets: metasets , data: { datasets } } = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index)=>{\n if (datasets.filter((x)=>x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n this._removeUnreferencedMetasets();\n for(i = 0, ilen = datasets.length; i < ilen; i++){\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const { datasetElementType , dataElementType } = defaults.datasets[type];\n Object.assign(ControllerClass, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n this._updateMetasets();\n return newControllers;\n }\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex)=>{\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n update(mode) {\n const config = this.config;\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n this._plugins.invalidate();\n if (this.notifyPlugins('beforeUpdate', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n const newControllers = this.buildOrUpdateControllers();\n this.notifyPlugins('beforeElementsUpdate');\n let minPadding = 0;\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; i++){\n const { controller } = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n if (!animsDisabled) {\n each(newControllers, (controller)=>{\n controller.reset();\n });\n }\n this._updateDatasets(mode);\n this.notifyPlugins('afterUpdate', {\n mode\n });\n this._layers.sort(compare2Level('z', '_idx'));\n const { _active , _lastEvent } = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n this.render();\n }\n _updateScales() {\n each(this.scales, (scale)=>{\n layouts.removeBox(this, scale);\n });\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n this.unbindEvents();\n this.bindEvents();\n }\n }\n _updateHiddenIndices() {\n const { _hiddenIndices } = this;\n const changes = this._getUniformDataChanges() || [];\n for (const { method , start , count } of changes){\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx)=>new Set(_dataChanges.filter((c)=>c[0] === idx).map((c, i)=>i + ',' + c.splice(1).join(',')));\n const changeSet = makeSet(0);\n for(let i = 1; i < datasetCount; i++){\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet).map((c)=>c.split(',')).map((a)=>({\n method: a[1],\n start: +a[2],\n count: +a[3]\n }));\n }\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {\n cancelable: true\n }) === false) {\n return;\n }\n layouts.update(this, this.width, this.height, minPadding);\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n this._layers = [];\n each(this.boxes, (box)=>{\n if (noArea && box.position === 'chartArea') {\n return;\n }\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n this._layers.forEach((item, index)=>{\n item._idx = index;\n });\n this.notifyPlugins('afterLayout');\n }\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {\n mode,\n cancelable: true\n }) === false) {\n return;\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this.getDatasetMeta(i).controller.configure();\n }\n for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._updateDataset(i, isFunction(mode) ? mode({\n datasetIndex: i\n }) : mode);\n }\n this.notifyPlugins('afterDatasetsUpdate', {\n mode\n });\n }\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {\n meta,\n index,\n mode,\n cancelable: true\n };\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n meta.controller._update(mode);\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n render() {\n if (this.notifyPlugins('beforeRender', {\n cancelable: true\n }) === false) {\n return;\n }\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({\n chart: this\n });\n }\n }\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const { width , height } = this._resizeBeforeDraw;\n this._resizeBeforeDraw = null;\n this._resize(width, height);\n }\n this.clear();\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n if (this.notifyPlugins('beforeDraw', {\n cancelable: true\n }) === false) {\n return;\n }\n const layers = this._layers;\n for(i = 0; i < layers.length && layers[i].z <= 0; ++i){\n layers[i].draw(this.chartArea);\n }\n this._drawDatasets();\n for(; i < layers.length; ++i){\n layers[i].draw(this.chartArea);\n }\n this.notifyPlugins('afterDraw');\n }\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n for(i = 0, ilen = metasets.length; i < ilen; ++i){\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n return result;\n }\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {\n cancelable: true\n }) === false) {\n return;\n }\n const metasets = this.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n this._drawDataset(metasets[i]);\n }\n this.notifyPlugins('afterDatasetsDraw');\n }\n _drawDataset(meta) {\n const ctx = this.ctx;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n const clip = getDatasetClipArea(this, meta);\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n if (clip) {\n clipArea(ctx, clip);\n }\n meta.controller.draw();\n if (clip) {\n unclipArea(ctx);\n }\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n return [];\n }\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter((x)=>x && x._dataset === dataset).pop();\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n return meta;\n }\n getContext() {\n return this.$context || (this.$context = createContext(null, {\n chart: this,\n type: 'chart'\n }));\n }\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n const meta = this.getDatasetMeta(datasetIndex);\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n anims.update(meta, {\n visible\n });\n this.update((ctx)=>ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n for(i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n this._destroyDatasetMeta(i);\n }\n }\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const { canvas , ctx } = this;\n this._stop();\n this.config.clearCache();\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n delete instances[this.id];\n this.notifyPlugins('afterDestroy');\n }\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const listener = (e, x, y)=>{\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n each(this.options.events, (type)=>_add(type, listener));\n }\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n const _add = (type, listener)=>{\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener)=>{\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n const listener = (width, height)=>{\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n let detached;\n const attached = ()=>{\n _remove('attach', attached);\n this.attached = true;\n this.resize();\n _add('resize', listener);\n _add('detach', detached);\n };\n detached = ()=>{\n this.attached = false;\n _remove('resize', listener);\n this._stop();\n this._resize(0, 0);\n _add('attach', attached);\n };\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n unbindEvents() {\n each(this._listeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n each(this._responsiveListeners, (listener, type)=>{\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n if (changed) {\n this._active = active;\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter((p)=>p.plugin.id === pluginId).length === 1;\n }\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.options.hover;\n const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin)=>(plugin.options.events || this.options.events).includes(e.native.type);\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n const changed = this._handleEvent(e, replay, args.inChartArea);\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n if (changed || args.changed) {\n this.render();\n }\n return this;\n }\n _handleEvent(e, replay, inChartArea) {\n const { _active: lastActive = [] , options } = this;\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n if (inChartArea) {\n this._lastEvent = null;\n callback(options.onHover, [\n e,\n active,\n this\n ], this);\n if (isClick) {\n callback(options.onClick, [\n e,\n active,\n this\n ], this);\n }\n }\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n this._lastEvent = lastEvent;\n return changed;\n }\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive;\n }\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart)=>chart._plugins.invalidate());\n}\n\nfunction clipSelf(ctx, element, endAngle) {\n const { startAngle , x , y , outerRadius , innerRadius , options } = element;\n const { borderWidth , borderJoinStyle } = options;\n const outerAngleClip = Math.min(borderWidth / outerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.beginPath();\n ctx.arc(x, y, outerRadius - borderWidth / 2, startAngle + outerAngleClip / 2, endAngle - outerAngleClip / 2);\n if (innerRadius > 0) {\n const innerAngleClip = Math.min(borderWidth / innerRadius, _normalizeAngle(startAngle - endAngle));\n ctx.arc(x, y, innerRadius + borderWidth / 2, endAngle - innerAngleClip / 2, startAngle + innerAngleClip / 2, true);\n } else {\n const clipWidth = Math.min(borderWidth / 2, outerRadius * _normalizeAngle(startAngle - endAngle));\n if (borderJoinStyle === 'round') {\n ctx.arc(x, y, clipWidth, endAngle - PI / 2, startAngle + PI / 2, true);\n } else if (borderJoinStyle === 'bevel') {\n const r = 2 * clipWidth * clipWidth;\n const endX = -r * Math.cos(endAngle + PI / 2) + x;\n const endY = -r * Math.sin(endAngle + PI / 2) + y;\n const startX = r * Math.cos(startAngle + PI / 2) + x;\n const startY = r * Math.sin(startAngle + PI / 2) + y;\n ctx.lineTo(endX, endY);\n ctx.lineTo(startX, startY);\n }\n }\n ctx.closePath();\n ctx.moveTo(0, 0);\n ctx.rect(0, 0, ctx.canvas.width, ctx.canvas.height);\n ctx.clip('evenodd');\n}\nfunction clipArc(ctx, element, endAngle) {\n const { startAngle , pixelMargin , x , y , outerRadius , innerRadius } = element;\n let angleMargin = pixelMargin / outerRadius;\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, [\n 'outerStart',\n 'outerEnd',\n 'innerStart',\n 'innerEnd'\n ]);\n}\n/**\n * Parse border radius from the provided options\n */ function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\n const computeOuterLimit = (val)=>{\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit)\n };\n}\n/**\n * Convert (r, 𝜃) to (x, y)\n */ function rThetaToXY(r, theta, x, y) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta)\n };\n}\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */ function pathArc(ctx, element, offset, spacing, end, circular) {\n const { x , y , startAngle: start , pixelMargin , innerRadius: innerR } = element;\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n let spacingOffset = 0;\n const alpha = end - start;\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the spacing\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? alpha * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const { outerStart , outerEnd , innerStart , innerEnd } = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n ctx.beginPath();\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n // The corner segment from point 2 to point 3\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n // The corner segment from point 4 to point 5\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2;\n ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true);\n // The corner segment from point 6 to point 7\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n // The corner segment from point 8 to point 1\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n } else {\n ctx.moveTo(x, y);\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference } = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\nfunction drawBorder(ctx, element, offset, spacing, circular) {\n const { fullCircles , startAngle , circumference , options } = element;\n const { borderWidth , borderJoinStyle , borderDash , borderDashOffset , borderRadius } = options;\n const inner = options.borderAlign === 'inner';\n if (!borderWidth) {\n return;\n }\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for(let i = 0; i < fullCircles; ++i){\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n if (options.selfJoin && endAngle - startAngle >= PI && borderRadius === 0 && borderJoinStyle !== 'miter') {\n clipSelf(ctx, element, endAngle);\n }\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\nclass ArcElement extends Element {\n static id = 'arc';\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n selfJoin: false\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== 'borderDash'\n };\n circumference;\n endAngle;\n fullCircles;\n innerRadius;\n outerRadius;\n pixelMargin;\n startAngle;\n constructor(cfg){\n super();\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(chartX, chartY, useFinalPosition) {\n const point = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n const { angle , distance } = getAngleFromPoint(point, {\n x: chartX,\n y: chartY\n });\n const { startAngle , endAngle , innerRadius , outerRadius , circumference } = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n const betweenAngles = _circumference >= TAU || nonZeroBetween;\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n return betweenAngles && withinRadius;\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , startAngle , endAngle , innerRadius , outerRadius } = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\n ], useFinalPosition);\n const { offset , spacing } = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n tooltipPosition(useFinalPosition) {\n return this.getCenterPoint(useFinalPosition);\n }\n draw(ctx) {\n const { options , circumference } = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = options.borderAlign === 'inner' ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n ctx.save();\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n ctx.restore();\n }\n}\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n function getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const { start: paramsStart = 0 , end: paramsEnd = count - 1 } = params;\n const { start: segmentStart , end: segmentEnd } = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n function pathSegment(ctx, line, segment, params) {\n const { points , options } = line;\n const { count , start , loop , ilen } = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n let { move =true , reverse } = params || {};\n let i, point, prev;\n for(i = 0; i <= ilen; ++i){\n point = points[(start + (reverse ? ilen - i : i)) % count];\n if (point.skip) {\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n prev = point;\n }\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n return !!loop;\n}\n function fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const { count , start , ilen } = pathVars(points, segment, params);\n const { move =true , reverse } = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n const pointIndex = (index)=>(start + (reverse ? ilen - index : index)) % count;\n const drawX = ()=>{\n if (minY !== maxY) {\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n ctx.lineTo(avgX, lastY);\n }\n };\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n for(i = 0; i <= ilen; ++i){\n point = points[pointIndex(i)];\n if (point.skip) {\n continue;\n }\n const x = point.x;\n const y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n ctx.lineTo(x, y);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n lastY = y;\n }\n drawX();\n}\n function _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\n function _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n const { segments , options } = line;\n const segmentMethod = _getSegmentMethod(line);\n for (const segment of segments){\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {\n start,\n end: start + count - 1\n })) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\nclass LineElement extends Element {\n static id = 'line';\n static defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n static descriptors = {\n _scriptable: true,\n _indexable: (name)=>name !== 'borderDash' && name !== 'fill'\n };\n constructor(cfg){\n super();\n this.animated = true;\n this.options = undefined;\n this._chart = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n get points() {\n return this._points;\n }\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {\n property,\n start: value,\n end: value\n });\n if (!segments.length) {\n return;\n }\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for(i = 0, ilen = segments.length; i < ilen; ++i){\n const { start , end } = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n start = start || 0;\n count = count || this.points.length - start;\n for (const segment of segments){\n loop &= segmentMethod(ctx, this, segment, {\n start,\n end: start + count - 1\n });\n }\n return !!loop;\n }\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n if (points.length && options.borderWidth) {\n ctx.save();\n draw(ctx, this, start, count);\n ctx.restore();\n }\n if (this.animated) {\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n const options = el.options;\n const { [axis]: value } = el.getProps([\n axis\n ], useFinalPosition);\n return Math.abs(pos - value) < options.radius + options.hitRadius;\n}\nclass PointElement extends Element {\n static id = 'point';\n parsed;\n skip;\n stop;\n /**\n * @type {any}\n */ static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n /**\n * @type {any}\n */ static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n const options = this.options;\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2) < Math.pow(options.hitRadius + options.radius, 2);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange$1(this, mouseX, 'x', useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange$1(this, mouseY, 'y', useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y } = this.getProps([\n 'x',\n 'y'\n ], useFinalPosition);\n return {\n x,\n y\n };\n }\n size(options) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n draw(ctx, area) {\n const options = this.options;\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n\nfunction getBarBounds(bar, useFinalPosition) {\n const { x , y , base , width , height } = bar.getProps([\n 'x',\n 'y',\n 'base',\n 'width',\n 'height'\n ], useFinalPosition);\n let left, right, top, bottom, half;\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n return {\n left,\n top,\n right,\n bottom\n };\n}\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n const { enableBorderRadius } = bar.getProps([\n 'enableBorderRadius'\n ]);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n const enableBorder = enableBorderRadius || isObject(value);\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r))\n }\n }\n };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n return bounds && (skipX || _isBetween(x, bounds.left, bounds.right)) && (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n function addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\nclass BarElement extends Element {\n static id = 'bar';\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n constructor(cfg){\n super();\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n draw(ctx) {\n const { inflateAmount , options: { borderColor , backgroundColor } } = this;\n const { inner , outer } = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n ctx.save();\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = borderColor;\n ctx.fill('evenodd');\n }\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const { x , y , base , horizontal } = this.getProps([\n 'x',\n 'y',\n 'base',\n 'horizontal'\n ], useFinalPosition);\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nBarElement: BarElement,\nLineElement: LineElement,\nPointElement: PointElement\n});\n\nconst BORDER_COLORS = [\n 'rgb(54, 162, 235)',\n 'rgb(255, 99, 132)',\n 'rgb(255, 159, 64)',\n 'rgb(255, 205, 86)',\n 'rgb(75, 192, 192)',\n 'rgb(153, 102, 255)',\n 'rgb(201, 203, 207)' // grey\n];\n// Border colors with 50% transparency\nconst BACKGROUND_COLORS = /* #__PURE__ */ BORDER_COLORS.map((color)=>color.replace('rgb(', 'rgba(').replace(')', ', 0.5)'));\nfunction getBorderColor(i) {\n return BORDER_COLORS[i % BORDER_COLORS.length];\n}\nfunction getBackgroundColor(i) {\n return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length];\n}\nfunction colorizeDefaultDataset(dataset, i) {\n dataset.borderColor = getBorderColor(i);\n dataset.backgroundColor = getBackgroundColor(i);\n return ++i;\n}\nfunction colorizeDoughnutDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBorderColor(i++));\n return i;\n}\nfunction colorizePolarAreaDataset(dataset, i) {\n dataset.backgroundColor = dataset.data.map(()=>getBackgroundColor(i++));\n return i;\n}\nfunction getColorizer(chart) {\n let i = 0;\n return (dataset, datasetIndex)=>{\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n if (controller instanceof DoughnutController) {\n i = colorizeDoughnutDataset(dataset, i);\n } else if (controller instanceof PolarAreaController) {\n i = colorizePolarAreaDataset(dataset, i);\n } else if (controller) {\n i = colorizeDefaultDataset(dataset, i);\n }\n };\n}\nfunction containsColorsDefinitions(descriptors) {\n let k;\n for(k in descriptors){\n if (descriptors[k].borderColor || descriptors[k].backgroundColor) {\n return true;\n }\n }\n return false;\n}\nfunction containsColorsDefinition(descriptor) {\n return descriptor && (descriptor.borderColor || descriptor.backgroundColor);\n}\nfunction containsDefaultColorsDefenitions() {\n return defaults.borderColor !== 'rgba(0,0,0,0.1)' || defaults.backgroundColor !== 'rgba(0,0,0,0.1)';\n}\nvar plugin_colors = {\n id: 'colors',\n defaults: {\n enabled: true,\n forceOverride: false\n },\n beforeLayout (chart, _args, options) {\n if (!options.enabled) {\n return;\n }\n const { data: { datasets } , options: chartOptions } = chart.config;\n const { elements } = chartOptions;\n const containsColorDefenition = containsColorsDefinitions(datasets) || containsColorsDefinition(chartOptions) || elements && containsColorsDefinitions(elements) || containsDefaultColorsDefenitions();\n if (!options.forceOverride && containsColorDefenition) {\n return;\n }\n const colorizer = getColorizer(chart);\n datasets.forEach(colorizer);\n }\n};\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n const samples = options.samples || availableWidth;\n if (samples >= count) {\n return data.slice(start, start + count);\n }\n const decimated = [];\n const bucketWidth = (count - 2) / (samples - 2);\n let sampledIndex = 0;\n const endIndex = start + count - 1;\n let a = start;\n let i, maxAreaPoint, maxArea, area, nextA;\n decimated[sampledIndex++] = data[a];\n for(i = 0; i < samples - 2; i++){\n let avgX = 0;\n let avgY = 0;\n let j;\n const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n for(j = avgRangeStart; j < avgRangeEnd; j++){\n avgX += data[j].x;\n avgY += data[j].y;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n const { x: pointAx , y: pointAy } = data[a];\n maxArea = area = -1;\n for(j = rangeOffs; j < rangeTo; j++){\n area = 0.5 * Math.abs((pointAx - avgX) * (data[j].y - pointAy) - (pointAx - data[j].x) * (avgY - pointAy));\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n decimated[sampledIndex++] = maxAreaPoint;\n a = nextA;\n }\n decimated[sampledIndex++] = data[endIndex];\n return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n let avgX = 0;\n let countX = 0;\n let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n const decimated = [];\n const endIndex = start + count - 1;\n const xMin = data[start].x;\n const xMax = data[endIndex].x;\n const dx = xMax - xMin;\n for(i = start; i < start + count; ++i){\n point = data[i];\n x = (point.x - xMin) / dx * availableWidth;\n y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n minIndex = i;\n } else if (y > maxY) {\n maxY = y;\n maxIndex = i;\n }\n avgX = (countX * avgX + point.x) / ++countX;\n } else {\n const lastIndex = i - 1;\n if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n const intermediateIndex1 = Math.min(minIndex, maxIndex);\n const intermediateIndex2 = Math.max(minIndex, maxIndex);\n if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex1],\n x: avgX\n });\n }\n if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex2],\n x: avgX\n });\n }\n }\n if (i > 0 && lastIndex !== startIndex) {\n decimated.push(data[lastIndex]);\n }\n decimated.push(point);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n minIndex = maxIndex = startIndex = i;\n }\n }\n return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n if (dataset._decimated) {\n const data = dataset._data;\n delete dataset._decimated;\n delete dataset._data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n writable: true,\n value: data\n });\n }\n}\nfunction cleanDecimatedData(chart) {\n chart.data.datasets.forEach((dataset)=>{\n cleanDecimatedDataset(dataset);\n });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n const pointCount = points.length;\n let start = 0;\n let count;\n const { iScale } = meta;\n const { min , max , minDefined , maxDefined } = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n return {\n start,\n count\n };\n}\nvar plugin_decimation = {\n id: 'decimation',\n defaults: {\n algorithm: 'min-max',\n enabled: false\n },\n beforeElementsUpdate: (chart, args, options)=>{\n if (!options.enabled) {\n cleanDecimatedData(chart);\n return;\n }\n const availableWidth = chart.width;\n chart.data.datasets.forEach((dataset, datasetIndex)=>{\n const { _data , indexAxis } = dataset;\n const meta = chart.getDatasetMeta(datasetIndex);\n const data = _data || dataset.data;\n if (resolve([\n indexAxis,\n chart.options.indexAxis\n ]) === 'y') {\n return;\n }\n if (!meta.controller.supportsDecimation) {\n return;\n }\n const xAxis = chart.scales[meta.xAxisID];\n if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n return;\n }\n if (chart.options.parsing) {\n return;\n }\n let { start , count } = getStartAndCountOfVisiblePointsSimplified(meta, data);\n const threshold = options.threshold || 4 * availableWidth;\n if (count <= threshold) {\n cleanDecimatedDataset(dataset);\n return;\n }\n if (isNullOrUndef(_data)) {\n dataset._data = data;\n delete dataset.data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this._decimated;\n },\n set: function(d) {\n this._data = d;\n }\n });\n }\n let decimated;\n switch(options.algorithm){\n case 'lttb':\n decimated = lttbDecimation(data, start, count, availableWidth, options);\n break;\n case 'min-max':\n decimated = minMaxDecimation(data, start, count, availableWidth);\n break;\n default:\n throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n }\n dataset._decimated = decimated;\n });\n },\n destroy (chart) {\n cleanDecimatedData(chart);\n }\n};\n\nfunction _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n for (const segment of segments){\n let { start , end } = segment;\n end = _findSegmentEnd(start, end, points);\n const bounds = _getBounds(property, points[start], points[end], segment.loop);\n if (!target.segments) {\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n const targetSegments = _boundSegments(target, bounds);\n for (const tgt of targetSegments){\n const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n for (const fillSource of fillSources){\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\nfunction _getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {\n property,\n start,\n end\n };\n}\nfunction _pointsFromSegments(boundary, line) {\n const { x =null , y =null } = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({ start , end })=>{\n end = _findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({\n x: first.x,\n y\n });\n points.push({\n x: last.x,\n y\n });\n } else if (x !== null) {\n points.push({\n x,\n y: first.y\n });\n points.push({\n x,\n y: last.y\n });\n }\n });\n return points;\n}\nfunction _findSegmentEnd(start, end, points) {\n for(; end > start; end--){\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\n\nfunction _createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n if (isArray(boundary)) {\n _loop = true;\n points = boundary;\n } else {\n points = _pointsFromSegments(boundary, line);\n }\n return points.length ? new LineElement({\n points,\n options: {\n tension: 0\n },\n _loop,\n _fullLoop: _loop\n }) : null;\n}\nfunction _shouldApplyFill(source) {\n return source && source.fill !== false;\n}\n\nfunction _resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [\n index\n ];\n let target;\n if (!propagate) {\n return fill;\n }\n while(fill !== false && visited.indexOf(fill) === -1){\n if (!isNumberFinite(fill)) {\n return fill;\n }\n target = sources[fill];\n if (!target) {\n return false;\n }\n if (target.visible) {\n return fill;\n }\n visited.push(fill);\n fill = target.fill;\n }\n return false;\n}\n function _decodeFill(line, index, count) {\n const fill = parseFillOption(line);\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n let target = parseFloat(fill);\n if (isNumberFinite(target) && Math.floor(target) === target) {\n return decodeTargetIndex(fill[0], index, target, count);\n }\n return [\n 'origin',\n 'start',\n 'end',\n 'stack',\n 'shape'\n ].indexOf(fill) >= 0 && fill;\n}\nfunction decodeTargetIndex(firstCh, index, target, count) {\n if (firstCh === '-' || firstCh === '+') {\n target = index + target;\n }\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n return target;\n}\n function _getTargetPixel(fill, scale) {\n let pixel = null;\n if (fill === 'start') {\n pixel = scale.bottom;\n } else if (fill === 'end') {\n pixel = scale.top;\n } else if (isObject(fill)) {\n pixel = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n pixel = scale.getBasePixel();\n }\n return pixel;\n}\n function _getTargetValue(fill, scale, startValue) {\n let value;\n if (fill === 'start') {\n value = startValue;\n } else if (fill === 'end') {\n value = scale.options.reverse ? scale.min : scale.max;\n } else if (isObject(fill)) {\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n return value;\n}\n function parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n if (fill === false || fill === null) {\n return false;\n }\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\n\nfunction _buildStackLine(source) {\n const { scale , index , line } = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(scale, index);\n linesBelow.push(_createBoundaryLine({\n x: null,\n y: scale.bottom\n }, line));\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n for(let j = segment.start; j <= segment.end; j++){\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({\n points,\n options: {}\n });\n}\n function getLinesBelow(scale, index) {\n const below = [];\n const metas = scale.getMatchingVisibleMetas('line');\n for(let i = 0; i < metas.length; i++){\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (!meta.hidden) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\n function addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for(let j = 0; j < linesBelow.length; j++){\n const line = linesBelow[j];\n const { first , last , point } = findPoint(line, sourcePoint, 'x');\n if (!point || first && last) {\n continue;\n }\n if (first) {\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n break;\n }\n }\n }\n points.push(...postponed);\n}\n function findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for(let i = 0; i < segments.length; i++){\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (_isBetween(pointValue, firstValue, lastValue)) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {\n first,\n last,\n point\n };\n}\n\nclass simpleArc {\n constructor(opts){\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n pathSegment(ctx, bounds, opts) {\n const { x , y , radius } = this;\n bounds = bounds || {\n start: 0,\n end: TAU\n };\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n interpolate(point) {\n const { x , y , radius } = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\n\nfunction _getTarget(source) {\n const { chart , fill , line } = source;\n if (isNumberFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n if (fill === 'stack') {\n return _buildStackLine(source);\n }\n if (fill === 'shape') {\n return true;\n }\n const boundary = computeBoundary(source);\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n return _createBoundaryLine(boundary, line);\n}\n function getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\nfunction computeLinearBoundary(source) {\n const { scale ={} , fill } = source;\n const pixel = _getTargetPixel(fill, scale);\n if (isNumberFinite(pixel)) {\n const horizontal = scale.isHorizontal();\n return {\n x: horizontal ? pixel : null,\n y: horizontal ? null : pixel\n };\n }\n return null;\n}\nfunction computeCircularBoundary(source) {\n const { scale , fill } = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const start = options.reverse ? scale.max : scale.min;\n const value = _getTargetValue(fill, scale, start);\n const target = [];\n if (options.grid.circular) {\n const center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n for(let i = 0; i < length; ++i){\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\n\nfunction _drawfill(ctx, source, area) {\n const target = _getTarget(source);\n const { chart , index , line , scale , axis } = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const { above =color , below =color } = fillOption || {};\n const meta = chart.getDatasetMeta(index);\n const clip = getDatasetClipArea(chart, meta);\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {\n line,\n target,\n above,\n below,\n area,\n scale,\n axis,\n clip\n });\n unclipArea(ctx);\n }\n}\nfunction doFill(ctx, cfg) {\n const { line , target , above , below , area , scale , clip } = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n ctx.save();\n let fillColor = below;\n if (below !== above) {\n if (property === 'x') {\n clipVertical(ctx, target, area.top);\n fill(ctx, {\n line,\n target,\n color: above,\n scale,\n property,\n clip\n });\n ctx.restore();\n ctx.save();\n clipVertical(ctx, target, area.bottom);\n } else if (property === 'y') {\n clipHorizontal(ctx, target, area.left);\n fill(ctx, {\n line,\n target,\n color: below,\n scale,\n property,\n clip\n });\n ctx.restore();\n ctx.save();\n clipHorizontal(ctx, target, area.right);\n fillColor = above;\n }\n }\n fill(ctx, {\n line,\n target,\n color: fillColor,\n scale,\n property,\n clip\n });\n ctx.restore();\n}\nfunction clipVertical(ctx, target, clipY) {\n const { segments , points } = target;\n let first = true;\n let lineLoop = false;\n ctx.beginPath();\n for (const segment of segments){\n const { start , end } = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(firstPoint.x, clipY);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {\n move: lineLoop\n });\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(lastPoint.x, clipY);\n }\n }\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\nfunction clipHorizontal(ctx, target, clipX) {\n const { segments , points } = target;\n let first = true;\n let lineLoop = false;\n ctx.beginPath();\n for (const segment of segments){\n const { start , end } = segment;\n const firstPoint = points[start];\n const lastPoint = points[_findSegmentEnd(start, end, points)];\n if (first) {\n ctx.moveTo(firstPoint.x, firstPoint.y);\n first = false;\n } else {\n ctx.lineTo(clipX, firstPoint.y);\n ctx.lineTo(firstPoint.x, firstPoint.y);\n }\n lineLoop = !!target.pathSegment(ctx, segment, {\n move: lineLoop\n });\n if (lineLoop) {\n ctx.closePath();\n } else {\n ctx.lineTo(clipX, lastPoint.y);\n }\n }\n ctx.lineTo(clipX, target.first().y);\n ctx.closePath();\n ctx.clip();\n}\nfunction fill(ctx, cfg) {\n const { line , target , property , color , scale , clip } = cfg;\n const segments = _segments(line, target, property);\n for (const { source: src , target: tgt , start , end } of segments){\n const { style: { backgroundColor =color } = {} } = src;\n const notShape = target !== true;\n ctx.save();\n ctx.fillStyle = backgroundColor;\n clipBounds(ctx, scale, clip, notShape && _getBounds(property, start, end));\n ctx.beginPath();\n const lineLoop = !!line.pathSegment(ctx, src);\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n const targetLoop = !!target.pathSegment(ctx, tgt, {\n move: lineLoop,\n reverse: true\n });\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n ctx.restore();\n }\n}\nfunction clipBounds(ctx, scale, clip, bounds) {\n const chartArea = scale.chart.chartArea;\n const { property , start , end } = bounds || {};\n if (property === 'x' || property === 'y') {\n let left, top, right, bottom;\n if (property === 'x') {\n left = start;\n top = chartArea.top;\n right = end;\n bottom = chartArea.bottom;\n } else {\n left = chartArea.left;\n top = start;\n right = chartArea.right;\n bottom = end;\n }\n ctx.beginPath();\n if (clip) {\n left = Math.max(left, clip.left);\n right = Math.min(right, clip.right);\n top = Math.max(top, clip.top);\n bottom = Math.min(bottom, clip.bottom);\n }\n ctx.rect(left, top, right - left, bottom - top);\n ctx.clip();\n }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\n\nvar index = {\n id: 'filler',\n afterDatasetsUpdate (chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n for(i = 0; i < count; ++i){\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: _decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line\n };\n }\n meta.$filler = source;\n sources.push(source);\n }\n for(i = 0; i < count; ++i){\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\n },\n beforeDraw (chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n beforeDatasetsDraw (chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n const metasets = chart.getSortedVisibleDatasetMetas();\n for(let i = metasets.length - 1; i >= 0; --i){\n const source = metasets[i].$filler;\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n beforeDatasetDraw (chart, args, options) {\n const source = args.meta.$filler;\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n\nconst getBoxSize = (labelOpts, fontSize)=>{\n let { boxHeight =fontSize , boxWidth =fontSize } = labelOpts;\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\nconst itemsEqual = (a, b)=>a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n constructor(config){\n super();\n this._added = false;\n this.legendHitBoxes = [];\n this._hoveredItem = null;\n this.doughnutMode = false;\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = callback(labelOpts.generateLabels, [\n this.chart\n ], this) || [];\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item)=>labelOpts.filter(item, this.chart.data));\n }\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b)=>labelOpts.sort(a, b, this.chart.data));\n }\n if (this.options.reverse) {\n legendItems.reverse();\n }\n this.legendItems = legendItems;\n }\n fit() {\n const { options , ctx } = this;\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const { boxWidth , itemHeight } = getBoxSize(labelOpts, fontSize);\n let width, height;\n ctx.font = labelFont.string;\n if (this.isHorizontal()) {\n width = this.maxWidth;\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight;\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const { ctx , maxWidth , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const lineWidths = this.lineWidths = [\n 0\n ];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i)=>{\n const itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n hitboxes[i] = {\n left: 0,\n top,\n row,\n width: itemWidth,\n height: itemHeight\n };\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n return totalHeight;\n }\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const { ctx , maxHeight , options: { labels: { padding } } } = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n let left = 0;\n let col = 0;\n this.legendItems.forEach((legendItem, i)=>{\n const { itemWidth , itemHeight } = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n hitboxes[i] = {\n left,\n top: currentColHeight,\n col,\n width: itemWidth,\n height: itemHeight\n };\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n totalWidth += currentColWidth;\n columnSizes.push({\n width: currentColWidth,\n height: currentColHeight\n });\n return totalWidth;\n }\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const { legendHitBoxes: hitboxes , options: { align , labels: { padding } , rtl } } = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes){\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes){\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n this._draw();\n unclipArea(ctx);\n }\n }\n _draw() {\n const { options: opts , columnSizes , lineWidths , ctx } = this;\n const { align , labels: labelOpts } = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const { padding } = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n this.drawTitle();\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n const { boxWidth , boxHeight , itemHeight } = getBoxSize(labelOpts, fontSize);\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n ctx.save();\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n if (labelOpts.usePointStyle) {\n const drawOptions = {\n radius: boxHeight * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n ctx.beginPath();\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n ctx.restore();\n };\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n overrideTextDirection(this.ctx, opts.textDirection);\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i)=>{\n ctx.strokeStyle = legendItem.fontColor;\n ctx.fillStyle = legendItem.fontColor;\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n rtlHelper.setWidth(this.width);\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n const realX = rtlHelper.x(x);\n drawLegendBox(realX, y, legendItem);\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n fillText(rtlHelper.x(x), y, legendItem);\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n if (!titleOpts.display) {\n return;\n }\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n let left = this.left;\n let maxWidth = this.width;\n if (this.isHorizontal()) {\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n const maxHeight = this.columnSizes.reduce((acc, size)=>Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n const x = _alignStartEnd(position, left, left + maxWidth);\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n if (_isBetween(x, this.left, this.right) && _isBetween(y, this.top, this.bottom)) {\n lh = this.legendHitBoxes;\n for(i = 0; i < lh.length; ++i){\n hitBox = lh[i];\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width) && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n return this.legendItems[i];\n }\n }\n }\n return null;\n }\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n callback(opts.onLeave, [\n e,\n previous,\n this\n ], this);\n }\n this._hoveredItem = hoveredItem;\n if (hoveredItem && !sameItem) {\n callback(opts.onHover, [\n e,\n hoveredItem,\n this\n ], this);\n }\n } else if (hoveredItem) {\n callback(opts.onClick, [\n e,\n hoveredItem,\n this\n ], this);\n }\n }\n}\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {\n itemWidth,\n itemHeight\n };\n}\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b)=>a.length > b.length ? a : b);\n }\n return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width;\n}\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\nvar plugin_legend = {\n id: 'legend',\n _element: Legend,\n start (chart, _args, options) {\n const legend = chart.legend = new Legend({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n stop (chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n beforeUpdate (chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n afterUpdate (chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n afterEvent (chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n onClick (e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n onHover: null,\n onLeave: null,\n labels: {\n color: (ctx)=>ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n generateLabels (chart) {\n const datasets = chart.data.datasets;\n const { labels: { usePointStyle , pointStyle , textAlign , color , useBorderRadius , borderRadius } } = chart.legend.options;\n return chart._getSortedDatasetMetas().map((meta)=>{\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n title: {\n color: (ctx)=>ctx.chart.options.color,\n display: false,\n position: 'center',\n text: ''\n }\n },\n descriptors: {\n _scriptable: (name)=>!name.startsWith('on'),\n labels: {\n _scriptable: (name)=>![\n 'generateLabels',\n 'filter',\n 'sort'\n ].includes(name)\n }\n }\n};\n\nclass Title extends Element {\n constructor(config){\n super();\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this._padding = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight) {\n const opts = this.options;\n this.left = 0;\n this.top = 0;\n if (!opts.display) {\n this.width = this.height = this.right = this.bottom = 0;\n return;\n }\n this.width = this.right = maxWidth;\n this.height = this.bottom = maxHeight;\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n this._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n if (this.isHorizontal()) {\n this.height = textSize;\n } else {\n this.width = textSize;\n }\n }\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\n _drawArgs(offset) {\n const { top , left , bottom , right , options } = this;\n const align = options.align;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n if (this.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n if (options.position === 'left') {\n titleX = left + offset;\n titleY = _alignStartEnd(align, bottom, top);\n rotation = PI * -0.5;\n } else {\n titleX = right - offset;\n titleY = _alignStartEnd(align, top, bottom);\n rotation = PI * 0.5;\n }\n maxWidth = bottom - top;\n }\n return {\n titleX,\n titleY,\n maxWidth,\n rotation\n };\n }\n draw() {\n const ctx = this.ctx;\n const opts = this.options;\n if (!opts.display) {\n return;\n }\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + this._padding.top;\n const { titleX , titleY , maxWidth , rotation } = this._drawArgs(offset);\n renderText(ctx, opts.text, 0, 0, fontOpts, {\n color: opts.color,\n maxWidth,\n rotation,\n textAlign: _toLeftRightCenter(opts.align),\n textBaseline: 'middle',\n translation: [\n titleX,\n titleY\n ]\n });\n }\n}\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\nvar plugin_title = {\n id: 'title',\n _element: Title,\n start (chart, _args, options) {\n createTitle(chart, options);\n },\n stop (chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n beforeUpdate (chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'bold'\n },\n fullSize: true,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n id: 'subtitle',\n start (chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n stop (chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n beforeUpdate (chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal'\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false\n }\n};\n\nconst positioners = {\n average (items) {\n if (!items.length) {\n return false;\n }\n let i, len;\n let xSet = new Set();\n let y = 0;\n let count = 0;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n xSet.add(pos.x);\n y += pos.y;\n ++count;\n }\n }\n if (count === 0 || xSet.size === 0) {\n return false;\n }\n const xAverage = [\n ...xSet\n ].reduce((a, b)=>a + b) / xSet.size;\n return {\n x: xAverage,\n y: y / count\n };\n },\n nearest (items, eventPosition) {\n if (!items.length) {\n return false;\n }\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n for(i = 0, len = items.length; i < len; ++i){\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n return {\n x,\n y\n };\n }\n};\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n return base;\n}\n function splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\n function createTooltipItem(chart, item) {\n const { element , datasetIndex , index } = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const { label , value } = controller.getLabelAndValue(index);\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\n function getTooltipSize(tooltip, options) {\n const ctx = tooltip.chart.ctx;\n const { body , footer , title } = tooltip;\n const { boxWidth , boxHeight } = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n let combinedBodyLength = body.reduce((count, bodyItem)=>count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing;\n }\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n ctx.save();\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0;\n each(body, (bodyItem)=>{\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n widthPadding = 0;\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n ctx.restore();\n width += padding.width;\n return {\n width,\n height\n };\n}\nfunction determineYAlign(chart, size) {\n const { y , height } = size;\n if (y < height / 2) {\n return 'top';\n } else if (y > chart.height - height / 2) {\n return 'bottom';\n }\n return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const { x , width } = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n const { x , width } = size;\n const { width: chartWidth , chartArea: { left , right } } = chart;\n let xAlign = 'center';\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n return xAlign;\n}\n function determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\nfunction alignX(size, xAlign) {\n let { x , width } = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= width / 2;\n }\n return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n let { y , height } = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= height / 2;\n }\n return y;\n}\n function getBackgroundPoint(options, size, alignment, chart) {\n const { caretSize , caretPadding , cornerRadius } = options;\n const { xAlign , yAlign } = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(cornerRadius);\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n return align === 'center' ? tooltip.x + tooltip.width / 2 : align === 'right' ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left;\n}\n function getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\nconst defaultCallbacks = {\n beforeTitle: noop,\n title (tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n return '';\n },\n afterTitle: noop,\n beforeBody: noop,\n beforeLabel: noop,\n label (tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n let label = tooltipItem.dataset.label || '';\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0\n };\n },\n labelTextColor () {\n return this.options.bodyColor;\n },\n labelPointStyle (tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation\n };\n },\n afterLabel: noop,\n afterBody: noop,\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n function invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n return result;\n}\nclass Tooltip extends Element {\n static positioners = positioners;\n constructor(config){\n super();\n this.opacity = 0;\n this._active = [];\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.chart = config.chart;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n if (cached) {\n return cached;\n }\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n return animations;\n }\n getContext() {\n return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n getTitle(context, options) {\n const { callbacks } = options;\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n return lines;\n }\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems));\n }\n getBody(tooltipItems, options) {\n const { callbacks } = options;\n const bodyItems = [];\n each(tooltipItems, (context)=>{\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n bodyItems.push(bodyItem);\n });\n return bodyItems;\n }\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems));\n }\n getFooter(tooltipItems, options) {\n const { callbacks } = options;\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n return lines;\n }\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n for(i = 0, len = active.length; i < len; ++i){\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array)=>options.filter(element, index, array, data));\n }\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b)=>options.itemSort(a, b, data));\n }\n each(tooltipItems, (context)=>{\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n if (changed && options.external) {\n options.external.call(this, {\n chart: this.chart,\n tooltip: this,\n replay\n });\n }\n }\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n getCaretPosition(tooltipPoint, size, options) {\n const { xAlign , yAlign } = this;\n const { caretSize , cornerRadius } = options;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(cornerRadius);\n const { x: ptX , y: ptY } = tooltipPoint;\n const { width , height } = size;\n let x1, x2, x3, y1, y2, y3;\n if (yAlign === 'center') {\n y2 = ptY + height / 2;\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {\n x1,\n x2,\n x3,\n y1,\n y2,\n y3\n };\n }\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.titleAlign, options);\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing;\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing;\n }\n }\n }\n }\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const { boxHeight , boxWidth } = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2,\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : labelColor.borderWidth || 1;\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius\n });\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n ctx.fillStyle = this.labelTextColors[i];\n }\n drawBody(pt, ctx, options) {\n const { body } = this;\n const { bodySpacing , bodyAlign , displayColors , boxHeight , boxWidth , boxPadding } = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right' ? bodyAlign === 'center' ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0;\n for(i = 0, ilen = body.length; i < ilen; ++i){\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n lines = bodyItem.lines;\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n for(j = 0, jlen = lines.length; j < jlen; ++j){\n fillLineOfText(lines[j]);\n bodyLineHeight = bodyFont.lineHeight;\n }\n each(bodyItem.after, fillLineOfText);\n }\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing;\n }\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n footerFont = toFont(options.footerFont);\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n for(i = 0; i < length; ++i){\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n drawBackground(pt, ctx, tooltipSize, options) {\n const { xAlign , yAlign } = this;\n const { x , y } = pt;\n const { width , height } = tooltipSize;\n const { topLeft , topRight , bottomLeft , bottomRight } = toTRBLCorners(options.cornerRadius);\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n _willRender() {\n return !!this.opacity;\n }\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n if (!opacity) {\n return;\n }\n this._updateAnimationTarget(options);\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n const padding = toPadding(options.padding);\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n this.drawBackground(pt, ctx, tooltipSize, options);\n overrideTextDirection(ctx, options.textDirection);\n pt.y += padding.top;\n this.drawTitle(pt, ctx, options);\n this.drawBody(pt, ctx, options);\n this.drawFooter(pt, ctx, options);\n restoreTextDirection(ctx, options.textDirection);\n ctx.restore();\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({ datasetIndex , index })=>{\n const meta = this.chart.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n const positionChanged = this._positionChanged(active, e);\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n if (changed) {\n this._active = active;\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n this.update(true, replay);\n }\n }\n return changed;\n }\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n if (e.type === 'mouseout') {\n return [];\n }\n if (!inChartArea) {\n return lastActive.filter((i)=>this.chart.data.datasets[i.datasetIndex] && this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined);\n }\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n if (options.reverse) {\n active.reverse();\n }\n return active;\n }\n _positionChanged(active, e) {\n const { caretX , caretY , options } = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\nvar plugin_tooltip = {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n afterInit (chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({\n chart,\n options\n });\n }\n },\n beforeUpdate (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n reset (chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n afterDraw (chart) {\n const tooltip = chart.tooltip;\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n if (chart.notifyPlugins('beforeTooltipDraw', {\n ...args,\n cancelable: true\n }) === false) {\n return;\n }\n tooltip.draw(chart.ctx);\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n afterEvent (chart, args) {\n if (chart.tooltip) {\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n args.changed = true;\n }\n }\n },\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold'\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {},\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold'\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts)=>opts.bodyFont.size,\n boxWidth: (ctx, opts)=>opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n boxPadding: 0,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart'\n },\n animations: {\n numbers: {\n type: 'number',\n properties: [\n 'x',\n 'y',\n 'width',\n 'height',\n 'caretX',\n 'caretY'\n ]\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: defaultCallbacks\n },\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n descriptors: {\n _scriptable: (name)=>name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n additionalOptionScopes: [\n 'interaction'\n ]\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nColors: plugin_colors,\nDecimation: plugin_decimation,\nFiller: index,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index, addedLabels)=>{\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({\n index,\n label: raw\n });\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\nconst validIndex = (index, max)=>index === null ? null : _limitValue(Math.round(index), 0, max);\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\nclass CategoryScale extends Scale {\n static id = 'category';\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n constructor(cfg){\n super(cfg);\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const { index , label } of added){\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n determineDataLimits() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this.getMinMax(true);\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1);\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n for(let value = min; value <= max; value++){\n ticks.push({\n value\n });\n }\n return ticks;\n }\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n configure() {\n super.configure();\n if (!this.isHorizontal()) {\n this._reversePixels = !this._reversePixels;\n }\n }\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n getBasePixel() {\n return this.bottom;\n }\n}\n\nfunction generateTicks$1(generationOptions, dataRange) {\n const ticks = [];\n const MIN_SPACING = 1e-14;\n const { bounds , step , min , max , precision , count , maxTicks , maxDigits , includeBounds } = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const { min: rmin , max: rmax } = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [\n {\n value: rmin\n },\n {\n value: rmax\n }\n ];\n }\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n if (!isNullOrUndef(precision)) {\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n numSpaces = (niceMax - niceMin) / spacing;\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n const decimalPlaces = Math.max(_decimalPlaces(spacing), _decimalPlaces(niceMin));\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({\n value: min\n });\n if (niceMin < min) {\n j++;\n }\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n for(; j < numSpaces; ++j){\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({\n value: tickValue\n });\n }\n if (maxDefined && includeBounds && niceMax !== max) {\n if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({\n value: max\n });\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({\n value: niceMax\n });\n }\n return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, { horizontal , minRotation }) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._endValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n return +raw;\n }\n handleTickRangeOptions() {\n const { beginAtZero } = this.options;\n const { minDefined , maxDefined } = this.getUserBounds();\n let { min , max } = this;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n setMax(max + offset);\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n getTickLimit() {\n const tickOpts = this.options.ticks;\n let { maxTicksLimit , stepSize } = tickOpts;\n let maxTicks;\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n return maxTicks;\n }\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n super.configure();\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n\nclass LinearScale extends LinearScaleBase {\n static id = 'linear';\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = isNumberFinite(min) ? min : 0;\n this.max = isNumberFinite(max) ? max : 1;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n\nconst log10Floor = (v)=>Math.floor(log10(v));\nconst changeExponent = (v, m)=>Math.pow(10, log10Floor(v) + m);\nfunction isMajor(tickVal) {\n const remain = tickVal / Math.pow(10, log10Floor(tickVal));\n return remain === 1;\n}\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while(steps(min, max, rangeExp) > 10){\n rangeExp++;\n }\n while(steps(min, max, rangeExp) < 10){\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n function generateTicks(generationOptions, { min , max }) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while(value < max){\n ticks.push({\n value,\n major: isMajor(value),\n significand\n });\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({\n value: lastTick,\n major: isMajor(lastTick),\n significand\n });\n return ticks;\n}\nclass LogarithmicScale extends Scale {\n static id = 'logarithmic';\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n constructor(cfg){\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [\n raw,\n index\n ]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isNumberFinite(value) && value > 0 ? value : null;\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(true);\n this.min = isNumberFinite(min) ? Math.max(0, min) : null;\n this.max = isNumberFinite(max) ? Math.max(0, max) : null;\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n if (this._zero && this.min !== this._suggestedMin && !isNumberFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n this.handleTickRangeOptions();\n }\n handleTickRangeOptions() {\n const { minDefined , maxDefined } = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n const setMin = (v)=>min = minDefined ? min : v;\n const setMax = (v)=>max = maxDefined ? max : v;\n if (min === max) {\n if (min <= 0) {\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n setMax(changeExponent(min, +1));\n }\n this.min = min;\n this.max = max;\n }\n buildTicks() {\n const opts = this.options;\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n return ticks;\n }\n getLabelForValue(value) {\n return value === undefined ? '0' : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n configure() {\n const start = this.min;\n super.configure();\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min ? 0 : (log10(value) - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [\n label\n ];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - size / 2,\n end: pos + size / 2\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n return {\n start: pos,\n end: pos + size\n };\n}\n function fitWithPointLabels(scale) {\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n for(let i = 0; i < valueCount; i++){\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(toDegrees(angleRadians));\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b);\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const { extra , additionalAngle , padding , size } = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n visible: true,\n x: pointLabelPosition.x,\n y,\n textAlign,\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const { left , top , right , bottom } = item;\n const apexesInArea = _isPointInArea({\n x: left,\n y: top\n }, area) || _isPointInArea({\n x: left,\n y: bottom\n }, area) || _isPointInArea({\n x: right,\n y: top\n }, area) || _isPointInArea({\n x: right,\n y: bottom\n }, area);\n return !apexesInArea;\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const { centerPointLabels , display } = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n for(let i = 0; i < valueCount; i++){\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= w / 2;\n }\n return x;\n}\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= h / 2;\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\nfunction drawPointLabelBox(ctx, opts, item) {\n const { left , top , right , bottom } = item;\n const { backdropColor } = opts;\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n if (Object.values(borderRadius).some((v)=>v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\nfunction drawPointLabels(scale, labelCount) {\n const { ctx , options: { pointLabels } } = scale;\n for(let i = labelCount - 1; i >= 0; i--){\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const { x , y , textAlign } = item;\n renderText(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n });\n }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const { ctx } = scale;\n if (circular) {\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n for(let i = 1; i < labelCount; i++){\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n const { color , lineWidth } = gridLineOpts;\n if (!circular && !labelCount || !color || !lineWidth || radius < 0) {\n return;\n }\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash || []);\n ctx.lineDashOffset = borderOpts.dashOffset;\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\nclass RadialLinearScale extends LinearScaleBase {\n static id = 'radialLinear';\n static defaults = {\n display: true,\n animate: true,\n position: 'chartArea',\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n grid: {\n circular: false\n },\n startAngle: 0,\n ticks: {\n showLabelBackdrop: true,\n callback: Ticks.formatters.numeric\n },\n pointLabels: {\n backdropColor: undefined,\n backdropPadding: 2,\n display: true,\n font: {\n size: 10\n },\n callback (label) {\n return label;\n },\n padding: 5,\n centerPointLabels: false\n }\n };\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n constructor(cfg){\n super(cfg);\n this.xCenter = undefined;\n this.yCenter = undefined;\n this.drawingArea = undefined;\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n setDimensions() {\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n determineDataLimits() {\n const { min , max } = this.getMinMax(false);\n this.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n this.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n this.handleTickRangeOptions();\n }\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n this._pointLabels = this.getLabels().map((value, index)=>{\n const label = callback(this.options.pointLabels.callback, [\n value,\n index\n ], this);\n return label || label === 0 ? label : '';\n }).filter((v, i)=>this.chart.getDataVisibility(i));\n }\n fit() {\n const opts = this.options;\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n getPointLabelPosition(index) {\n const { left , top , right , bottom } = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom\n };\n }\n drawBackground() {\n const { backgroundColor , grid: { circular } } = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const { angleLines , grid , border } = opts;\n const labelCount = this._pointLabels.length;\n let i, offset, position;\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n if (grid.display) {\n this.ticks.forEach((tick, index)=>{\n if (index !== 0 || index === 0 && this.min < 0) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n if (angleLines.display) {\n ctx.save();\n for(i = labelCount - 1; i >= 0; i--){\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const { color , lineWidth } = optsAtIndex;\n if (!lineWidth || !color) {\n continue;\n }\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n ctx.restore();\n }\n }\n drawBorder() {}\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n if (!tickOpts.display) {\n return;\n }\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n this.ticks.forEach((tick, index)=>{\n if (index === 0 && this.min >= 0 && !opts.reverse) {\n return;\n }\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height);\n }\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth\n });\n });\n ctx.restore();\n }\n drawTitle() {}\n}\n\nconst INTERVALS = {\n millisecond: {\n common: true,\n size: 1,\n steps: 1000\n },\n second: {\n common: true,\n size: 1000,\n steps: 60\n },\n minute: {\n common: true,\n size: 60000,\n steps: 60\n },\n hour: {\n common: true,\n size: 3600000,\n steps: 24\n },\n day: {\n common: true,\n size: 86400000,\n steps: 30\n },\n week: {\n common: false,\n size: 604800000,\n steps: 4\n },\n month: {\n common: true,\n size: 2.628e9,\n steps: 12\n },\n quarter: {\n common: false,\n size: 7.884e9,\n steps: 4\n },\n year: {\n common: true,\n size: 3.154e10\n }\n};\n const UNITS = /* #__PURE__ */ Object.keys(INTERVALS);\n function sorter(a, b) {\n return a - b;\n}\n function parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n const adapter = scale._adapter;\n const { parser , round , isoWeekday } = scale._parseOpts;\n let value = input;\n if (typeof parser === 'function') {\n value = parser(value);\n }\n if (!isNumberFinite(value)) {\n value = typeof parser === 'string' ? adapter.parse(value, parser) : adapter.parse(value);\n }\n if (value === null) {\n return null;\n }\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, 'isoWeek', isoWeekday) : adapter.startOf(value, round);\n }\n return +value;\n}\n function determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n for(let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i){\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n return UNITS[ilen - 1];\n}\n function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for(let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--){\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n function determineMajorUnit(unit) {\n for(let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i){\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\n function addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const { lo , hi } = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\n function setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n for(major = first; major <= last; major = +adapter.add(major, 1, majorUnit)){\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\n function ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n const map = {};\n const ilen = values.length;\n let i, value;\n for(i = 0; i < ilen; ++i){\n value = values[i];\n map[value] = i;\n ticks.push({\n value,\n major: false\n });\n }\n return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n static id = 'time';\n static defaults = {\n bounds: 'data',\n adapters: {},\n time: {\n parser: false,\n unit: false,\n round: false,\n isoWeekday: false,\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n source: 'auto',\n callback: false,\n major: {\n enabled: false\n }\n }\n };\n constructor(props){\n super(props);\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n this._unit = 'day';\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n adapter.init(opts);\n mergeIf(time.displayFormats, adapter.formats());\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n super.init(scaleOpts);\n this._normalized = opts.normalized;\n }\n parse(raw, index) {\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n let { min , max , minDefined , maxDefined } = this.getUserBounds();\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n if (!minDefined || !maxDefined) {\n _applyBounds(this._getLabelBounds());\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {\n min,\n max\n };\n }\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n const min = this.min;\n const max = this.max;\n const ticks = _filterBetween(timestamps, min, max);\n this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n if (options.reverse) {\n ticks.reverse();\n }\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n afterAutoSkip() {\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map((tick)=>+tick.value));\n }\n }\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n this._offsets = {\n start,\n end,\n factor: 1 / (start + 1 + end)\n };\n }\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for(time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++){\n addTick(ticks, time, timestamps);\n }\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n return Object.keys(ticks).sort(sorter).map((x)=>+x);\n }\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n if (formatter) {\n return callback(formatter, [\n time,\n index,\n ticks\n ], this);\n }\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n generateTickLabels(ticks) {\n let i, ilen, tick;\n for(i = 0, ilen = ticks.length; i < ilen; ++i){\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n return {\n w: tickLabelWidth * cosRotation + tickFontSize * sinRotation,\n h: tickLabelWidth * sinRotation + tickFontSize * cosRotation\n };\n }\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [\n exampleTime\n ], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const metas = this.getMatchingVisibleMetas();\n if (this._normalized && metas.length) {\n return this._cache.data = metas[0].controller.getAllParsedValues(this);\n }\n for(i = 0, ilen = metas.length; i < ilen; ++i){\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n return this._cache.data = this.normalize(timestamps);\n }\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const labels = this.getLabels();\n for(i = 0, ilen = labels.length; i < ilen; ++i){\n timestamps.push(parse(this, labels[i]));\n }\n return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps);\n }\n normalize(values) {\n return _arrayUnique(values.sort(sorter));\n }\n}\n\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({ lo , hi } = _lookupByKey(table, 'pos', val));\n }\n ({ pos: prevSource , time: prevTarget } = table[lo]);\n ({ pos: nextSource , time: nextTarget } = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({ lo , hi } = _lookupByKey(table, 'time', val));\n }\n ({ time: prevSource , pos: prevTarget } = table[lo]);\n ({ time: nextSource , pos: nextTarget } = table[hi]);\n }\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n static id = 'timeseries';\n static defaults = TimeScale.defaults;\n constructor(props){\n super(props);\n this._table = [];\n this._minPos = undefined;\n this._tableRange = undefined;\n }\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n buildLookupTable(timestamps) {\n const { min , max } = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n for(i = 0, ilen = timestamps.length; i < ilen; ++i){\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n if (items.length < 2) {\n return [\n {\n time: min,\n pos: 0\n },\n {\n time: max,\n pos: 1\n }\n ];\n }\n for(i = 0, ilen = items.length; i < ilen; ++i){\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({\n time: curr,\n pos: i / (ilen - 1)\n });\n }\n }\n return table;\n }\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b)=>a - b);\n }\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n if (timestamps.length) {\n return timestamps;\n }\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n return timestamps;\n }\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n controllers,\n elements,\n plugins,\n scales\n];\n\nexport { Animation, Animations, ArcElement, BarController, BarElement, BasePlatform, BasicPlatform, BubbleController, CategoryScale, Chart, plugin_colors as Colors, DatasetController, plugin_decimation as Decimation, DomPlatform, DoughnutController, Element, index as Filler, Interaction, plugin_legend as Legend, LineController, LineElement, LinearScale, LogarithmicScale, PieController, PointElement, PolarAreaController, RadarController, RadialLinearScale, Scale, ScatterController, plugin_subtitle as SubTitle, Ticks, TimeScale, TimeSeriesScale, plugin_title as Title, plugin_tooltip as Tooltip, adapters as _adapters, _detectPlatform, animator, controllers, defaults, elements, layouts, plugins, registerables, registry, scales };\n//# sourceMappingURL=chart.js.map\n"],"names":["round","v","lim","l","h","p2b","n2b","b2n","n2p","map$1","hex","h1","b","h2","eq","isShort","hexParse","str","len","ret","alpha","a","f","hexString","HUE_RE","hsl2rgbn","s","n","k","hsv2rgbn","hwb2rgbn","w","rgb","i","hueValue","r","g","d","max","rgb2hsl","min","calln","c","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","m","p1","p2","rotate","deg","hslString","map","names$1","unpack","unpacked","keys","tkeys","j","ok","nk","names","nameParse","RGB_RE","rgbParse","rgbString","to","from","interpolate","rgb1","rgb2","t","modHSL","ratio","tmp","clone","proto","fromObject","input","functionParse","Color","type","obj","color","weight","c1","c2","w2","p","w1","val","noop","uid","id","isNullOrUndef","value","isArray","isObject","isNumberFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","toDimension","callback","fn","args","thisArg","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","source","target","klen","isValidKey","key","_merger","options","tval","sval","merge","sources","merger","current","mergeIf","_mergerIf","keyResolvers","o","_splitKey","parts","part","_getKeyResolver","resolveObjectKey","_capitalize","defined","isFunction","setsEqual","item","_isClickEvent","e","PI","TAU","PITAU","INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","x","y","epsilon","niceNum","range","roundedRange","niceRange","fraction","_factorize","result","sqrt","isNonPrimitive","isNumber","almostWhole","rounded","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","start","end","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","_isBetween","_lookup","table","cmp","index","hi","lo","mid","_lookupByKey","last","ti","_rlookupByKey","_filterBetween","values","arrayEvents","listenArrayEvents","listener","method","base","res","object","unlistenArrayEvents","stub","listeners","_arrayUnique","items","set","requestAnimFrame","throttled","argsToUse","ticking","debounce","delay","timeout","_toLeftRightCenter","align","_alignStartEnd","_textX","left","right","rtl","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","count","iScale","vScale","_parsed","spanGaps","axis","minDefined","maxDefined","distanceToDefinedLo","point","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","changed","atEdge","elasticIn","elasticOut","effects","isPatternOrGradient","getHoverColor","numbers","colors","applyAnimationsDefaults","defaults","name","applyLayoutsDefaults","intlCache","getNumberFormat","locale","cacheKey","formatter","formatNumber","num","formatters","tickValue","ticks","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","remain","Ticks","applyScaleDefaults","_ctx","overrides","descriptors","getScope$1","node","root","scope","Defaults","_descriptors","_appliers","context","ctx","targetScope","targetName","scopeObject","targetScopeObject","privateName","local","appliers","apply","toFontString","font","_measureText","data","gc","longest","string","textWidth","_longestText","arrayOfThings","cache","jlen","thing","nestedThing","gcLen","_alignPixel","chart","pixel","width","devicePixelRatio","halfWidth","clearCanvas","canvas","drawPoint","drawPointLegend","xOffset","yOffset","size","cornerRadius","xOffsetW","yOffsetW","style","rotation","radius","rad","_isPointInArea","area","margin","clipArea","unclipArea","_steppedLineTo","previous","flip","mode","midpoint","_bezierCurveTo","setRenderOpts","opts","decorateText","line","metrics","top","bottom","yDecoration","drawBackdrop","oldColor","renderText","text","lines","stroke","addRoundedRectPath","rect","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","numberOrZero","_readValueToProps","props","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","resolve","inputs","info","_addGrace","minmax","grace","beginAtZero","change","keepZero","add","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","_cached","_resolveWithPrefixes","getKeysFromAllScopes","storage","_attachContext","proxy","subProxy","descriptorDefaults","receiver","_resolveWithContext","_scriptable","_indexable","_allKeys","readKey","prefix","needsSubResolver","_proxy","_context","_subProxy","_resolveScriptable","_resolveArray","getValue","_stack","createSubResolver","isIndexable","arr","resolver","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","parsed","EPSILON","getPoint","getValueAxis","indexAxis","splineCurve","firstPoint","middlePoint","afterPoint","next","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","iPixel","vPixel","splineCurveMonotone","slopeDelta","capControlPoint","pt","capBezierPoints","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","loop","controlPoints","prev","_isDomSupported","_getParentNode","domNode","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","element","getStyle","el","positions","getPositionedStyle","styles","suffix","pos","useOffsetPos","getCanvasPosition","touches","offsetX","offsetY","box","getRelativePosition","event","currentDevicePixelRatio","borderBox","paddings","borders","height","getContainerSize","maxWidth","maxHeight","container","containerStyle","containerBorder","containerPadding","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","containerSize","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","supportsEventListenerOptions","passiveSupported","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRightToLeftAdapter","rectX","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","restoreTextDirection","propertyFn","normalizeSegment","getSegment","segment","bounds","startBound","endBound","between","normalize","_boundSegment","compare","inside","subStart","prevValue","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","segments","sub","findStartAndEnd","solidSegments","cur","_computeSegments","segmentOptions","splitByStyles","completeLoop","doSplitByStyles","chartContext","baseStyle","readStyle","datasetIndex","prevStyle","addStyle","st","dir","styleChanged","replacer","getSizeForArea","scale","chartArea","field","getDatasetArea","getDatasetClipArea","clip","Animator","anims","date","callbacks","numSteps","remaining","draw","charts","cb","acc","animator","transparent","interpolators","factor","c0","Animation","cfg","currentValue","elapsed","duration","promises","rej","resolved","Animations","config","animationOptions","animatedProps","option","newOptions","resolveTargetOptions","animations","awaitAll","running","animation","properties","anim","scaleClip","allowedOverflow","defaultClip","toClip","getSortedDatasetIndices","filterVisible","metasets","applyStack","stack","dsIndex","singleMode","otherValue","found","convertObjectDataToArray","iAxisKey","vAxisKey","adata","isStacked","stacked","getStackKey","indexScale","valueScale","getUserBounds","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","updateStacks","controller","iAxis","vAxis","itemStacks","visualValues","getFirstScaleId","scales","createDatasetContext","createDataContext","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","createStack","canStack","DatasetController","dataset","chooseId","xid","yid","rid","iid","vid","scaleID","_data","resetNewElements","stackChanged","oldStacked","scopeKeys","_stacked","sorted","isNotInOrderComparedToPrev","labels","singleScale","xAxisKey","yAxisKey","parsedValue","otherScale","otherMin","otherMax","_skip","elements","active","drawActiveElementsOnTop","elementType","sharing","transition","sharedOptions","firstOpts","previouslySharedOptions","includeOptions","arg1","arg2","numMeta","numData","move","removed","newCount","__publicField","getAllScaleValues","visibleMetas","computeMinSampleSize","curr","updateMinAndPrev","computeFitCategoryTraits","ruler","stackCount","thickness","computeFlexCategoryTraits","pixels","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","borderProps","setBorderSkipped","edge","parseEdge","swap","startEnd","orig","v2","setInflateAmount","inflateAmount","BarController","bars","reset","horizontal","vpixels","ipixels","dataIndex","currentParsed","iScaleValue","skipNull","indexScaleId","firstScaleAxisId","barThickness","baseValue","minBarLength","floating","length","head","startPixel","endPixel","halfGrid","maxBarThickness","center","axisCount","axisID","axisNumber","stackIndex","rects","BubbleController","getRatioAndOffset","circumference","cutout","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","DoughnutController","getter","arcs","spacing","maxSize","chartWeight","maxRadius","outerRadius","innerRadius","radiusLength","animationOpts","centerX","centerY","animateScale","arc","metaData","total","ringWeightOffset","pointStyle","textAlign","useBorderRadius","borderRadius","label","legendItem","legend","LineController","_dataset","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","border","lastPoint","PolarAreaController","minSize","datasetStartAngle","defaultAngle","PieController","RadarController","pointPosition","ScatterController","showLine","controllers","abstract","DateAdapterBase","members","adapters","binarySearch","metaset","intersect","_sorted","lookupMethod","evaluateInteractionItems","position","handler","getDistanceMetricForAxis","useX","useY","deltaX","deltaY","getIntersectItems","useFinalPosition","includeInvisible","getNearestRadialItems","evaluationFunc","getNearestCartesianItems","distanceMetric","minDistance","inRange","distance","getNearestItems","getAxisItems","rangeMethod","intersectsItem","Interaction","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","buildLayoutBoxes","centerHorizontal","centerVertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","newWidth","newHeight","widthChanged","heightChanged","handleMaxPadding","updatePos","getMargins","marginForPositions","fitBoxes","refitBoxes","refit","same","other","setBoxDims","placeBoxes","userPadding","layoutItem","minPadding","padding","availableWidth","availableHeight","verticalBoxes","horizontalBoxes","visibleVerticalBoxCount","BasePlatform","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","isNullOrEmpty","initCanvas","renderHeight","renderWidth","displayWidth","displayHeight","eventListenerOptions","addListener","removeListener","fromNativeEvent","nodeListContains","nodeList","createAttachObserver","observer","entries","trigger","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","resize","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","releaseObserver","createProxyAndListen","DomPlatform","initial","proxies","_detectPlatform","Element","final","autoSkip","tickOpts","determinedMaxTicks","determineMaxTicks","ticksLimit","majorIndices","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","skip","offset","tickLength","maxScale","maxChart","evenMajorSpacing","getEvenSpacing","factors","majorStart","majorEnd","diff","reverseAlign","offsetFromEdge","getTicksLimit","ticksLength","maxTicksLimit","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","garbageCollect","caches","getTickMarkLength","getTitleHeight","createScaleContext","createTickContext","tick","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","raw","_userMin","_userMax","_suggestedMin","_suggestedMax","metas","sampleSize","samplingEnabled","reversePixels","numTicks","minRotation","maxRotation","labelRotation","tickWidth","maxLabelDiagonal","labelSizes","maxLabelWidth","maxLabelHeight","titleOpts","gridOpts","display","isHorizontal","titleHeight","widest","highest","tickPadding","angleRadians","cos","sin","labelHeight","labelWidth","isRotated","labelsBelowTicks","offsetLeft","offsetRight","paddingLeft","paddingRight","paddingTop","paddingBottom","widths","heights","widestLabelSize","highestLabelSize","tickFont","fontString","lineHeight","nestedLabel","valueAt","idx","decimal","optionTicks","rot","grid","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","optsAtIndexBorder","lineWidth","lineColor","borderDash","borderDashOffset","tickColor","tickBorderDash","tickBorderDashOffset","crossAlign","mirror","tickAndPadding","hTickAndPadding","lineCount","textOffset","textBaseline","halfCount","strokeColor","strokeWidth","tickTextAlign","backdrop","labelPadding","backgroundColor","drawLine","lastLineWidth","renderTextOptions","title","tz","gz","bz","fontSize","TypedRegistry","override","parentScope","isIChartComponent","registerDefaults","itemDefaults","routeDefaults","routes","propertyParts","sourceName","sourceScope","Registry","typedRegistry","arg","reg","itemReg","registry","component","camelMethod","PluginService","hook","filter","descriptor","plugin","all","plugins","allPlugins","createDescriptors","previousDescriptors","localIds","getOpts","pluginOpts","getIndexAxis","datasetDefaults","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","idMatchesAxis","axisFromPosition","determineAxis","scaleOptions","getAxisFromDataset","retrieveAxisFromDatasets","boundDs","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","datasetType","mainScope","resetCache","_scopeCache","keyLists","subPrefixes","getResolver","needContext","subResolver","resolverCache","hasFunction","isScriptable","scriptable","indexable","version","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onAnimationProgress","getCanvas","instances","getChart","moveNumericKeys","intKey","determineLastEvent","lastEvent","inChartArea","isClick","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","maintainAspectRatio","_aspectRatio","newSize","newRatio","scalesOptions","axisOptions","scaleOpts","updated","isRadial","scaleType","scaleClass","hasUpdated","datasets","newControllers","ControllerClass","datasetElementType","dataElementType","animsDisabled","_active","_lastEvent","existingEvents","newEvents","_hiddenIndices","changes","_dataChanges","datasetCount","makeSet","changeSet","noArea","layers","visible","platform","_add","_remove","detached","attached","enabled","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","eventFilter","clipSelf","borderWidth","borderJoinStyle","outerAngleClip","innerAngleClip","clipWidth","clipArc","pixelMargin","angleMargin","toRadiusCorners","parseBorderRadius$1","angleDelta","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","rThetaToXY","theta","pathArc","circular","innerR","spacingOffset","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStart","outerEnd","innerStart","innerEnd","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","drawArc","fullCircles","drawBorder","inner","ArcElement","chartX","chartY","rAdjust","_circumference","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","fix","radiusOffset","setStyle","lineTo","getLineMethod","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","avgX","countX","prevX","lastY","pointIndex","drawX","truncX","_getSegmentMethod","_getInterpolationMethod","strokePathWithCache","path","strokePathDirect","segmentMethod","usePath2D","LineElement","_interpolate","interpolated","inRange$1","PointElement","mouseX","mouseY","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","enableBorderRadius","maxR","enableBorder","boundingRects","skipX","skipY","hasRadius","addNormalRectPath","inflateRect","amount","refRect","BarElement","borderColor","outer","addRectPath","BORDER_COLORS","BACKGROUND_COLORS","getBorderColor","getBackgroundColor","colorizeDefaultDataset","colorizeDoughnutDataset","colorizePolarAreaDataset","getColorizer","containsColorsDefinitions","containsColorsDefinition","containsDefaultColorsDefenitions","plugin_colors","_args","chartOptions","containsColorDefenition","colorizer","lttbDecimation","samples","decimated","bucketWidth","sampledIndex","endIndex","maxAreaPoint","maxArea","nextA","avgY","avgRangeStart","avgRangeEnd","avgRangeLength","rangeOffs","rangeTo","pointAx","pointAy","minMaxDecimation","minIndex","maxIndex","startIndex","xMin","dx","lastIndex","intermediateIndex1","intermediateIndex2","cleanDecimatedDataset","cleanDecimatedData","getStartAndCountOfVisiblePointsSimplified","plugin_decimation","xAxis","threshold","_segments","tpoints","_findSegmentEnd","_getBounds","targetSegments","tgt","subBounds","fillSources","fillSource","_getEdge","_pointsFromSegments","boundary","linePoints","_createBoundaryLine","_loop","_shouldApplyFill","_resolveTarget","propagate","fill","visited","_decodeFill","parseFillOption","decodeTargetIndex","firstCh","_getTargetPixel","_getTargetValue","fillOption","_buildStackLine","sourcePoints","linesBelow","getLinesBelow","addPointsBelow","below","sourcePoint","postponed","findPoint","pointValue","firstValue","lastValue","simpleArc","_getTarget","getLineByIndex","computeBoundary","computeCircularBoundary","computeLinearBoundary","_drawfill","lineOpts","above","doFill","fillColor","clipVertical","clipHorizontal","clipY","lineLoop","clipX","src","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","getBoxSize","labelOpts","boxHeight","boxWidth","itemsEqual","Legend","legendItems","labelFont","itemHeight","hitboxes","lineWidths","totalHeight","row","_itemHeight","columnSizes","heightLimit","totalWidth","currentColWidth","currentColHeight","col","calculateItemSize","rtlHelper","hitbox","defaultColor","halfFontSize","cursor","drawLegendBox","drawOptions","yBoxTop","xBoxLeft","fillText","realX","fontLineHeight","calculateLegendItemHeight","titleFont","titlePadding","topPaddingPlusHalfFontSize","hitBox","lh","isListened","hoveredItem","sameItem","calculateItemWidth","calculateItemHeight","legendItemText","plugin_legend","ci","usePointStyle","Title","textSize","fontOpts","createTitle","plugin_title","titleBlock","plugin_subtitle","positioners","xSet","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","bodyLineHeight","widthPadding","maxLineWidth","determineYAlign","doesNotFitWithAlign","xAlign","caret","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","caretSize","caretPadding","topLeft","topRight","bottomLeft","bottomRight","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","defaultCallbacks","labelCount","tooltipItem","invokeCallbackWithFallback","Tooltip","beforeTitle","afterTitle","bodyItems","scoped","beforeFooter","afterFooter","labelColors","labelPointStyles","labelTextColors","positionAndSize","backgroundPoint","tooltipPoint","caretPosition","ptX","ptY","x3","y3","titleSpacing","labelColor","labelPointStyle","colorX","rtlColorX","yOffSet","colorY","outerX","innerX","bodySpacing","bodyAlign","displayColors","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","tooltipSize","animX","animY","opacity","hasTooltipContent","positionChanged","caretX","caretY","plugin_tooltip","addIfString","addedLabels","findOrAddLabel","_getLabelForValue","CategoryScale","added","generateTicks$1","generationOptions","dataRange","precision","maxTicks","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","LinearScaleBase","setMin","setMax","minSign","maxSign","stepSize","numericGeneratorOptions","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","startExp","generateTicks","minExp","exp","significand","lastTick","LogarithmicScale","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","limits","valueCount","pointLabelOpts","additionalAngle","plFont","hLimits","vLimits","updateLimits","buildPointLabelItems","createPointLabelItem","itemOpts","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","isNotOverlapped","centerPointLabels","drawPointLabelBox","backdropColor","backdropLeft","backdropTop","backdropWidth","backdropHeight","drawPointLabels","pointLabels","pathRadiusLine","drawRadiusLine","gridLineOpts","createPointLabelContext","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","scaledDistance","pointLabel","distanceFromCenter","angleLines","INTERVALS","UNITS","sorter","parse","adapter","parser","isoWeekday","determineUnitForAutoTicks","minUnit","capacity","interval","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","timestamp","setMajorTicks","majorUnit","major","ticksFromTimestamps","TimeScale","_applyBounds","timeOpts","minor","weekday","hasWeekday","format","formats","fmt","minorFormat","majorFormat","offsets","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","displayFormats","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","registerables"],"mappings":"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","x_google_ignoreList":[0,1,2]} \ No newline at end of file diff --git a/deploy-package-20260223-151231/frontend/assets/vendor-core.B6UiYhU_.js b/deploy-package-20260223-151231/frontend/assets/vendor-core.B6UiYhU_.js deleted file mode 100644 index 6dec4ae..0000000 --- a/deploy-package-20260223-151231/frontend/assets/vendor-core.B6UiYhU_.js +++ /dev/null @@ -1,30 +0,0 @@ -/** -* @vue/shared v3.5.26 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function Xs(e){const t=Object.create(null);for(const n of e.split(","))t[n]=1;return n=>n in t}const oe={},jt=[],Ye=()=>{},Oi=()=>!1,Jn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Zs=e=>e.startsWith("onUpdate:"),pe=Object.assign,er=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},yl=Object.prototype.hasOwnProperty,ne=(e,t)=>yl.call(e,t),B=Array.isArray,Ut=e=>bn(e)==="[object Map]",zn=e=>bn(e)==="[object Set]",Ar=e=>bn(e)==="[object Date]",W=e=>typeof e=="function",fe=e=>typeof e=="string",Be=e=>typeof e=="symbol",re=e=>e!==null&&typeof e=="object",Pi=e=>(re(e)||W(e))&&W(e.then)&&W(e.catch),Ii=Object.prototype.toString,bn=e=>Ii.call(e),vl=e=>bn(e).slice(8,-1),Ni=e=>bn(e)==="[object Object]",Qn=e=>fe(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,tn=Xs(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),Yn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},bl=/-\w/g,Ve=Yn(e=>e.replace(bl,t=>t.slice(1).toUpperCase())),El=/\B([A-Z])/g,Et=Yn(e=>e.replace(El,"-$1").toLowerCase()),Xn=Yn(e=>e.charAt(0).toUpperCase()+e.slice(1)),On=Yn(e=>e?`on${Xn(e)}`:""),vt=(e,t)=>!Object.is(e,t),Pn=(e,...t)=>{for(let n=0;n{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:s,value:n})},Zn=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Sl=e=>{const t=fe(e)?Number(e):NaN;return isNaN(t)?e:t};let xr;const es=()=>xr||(xr=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function ts(e){if(B(e)){const t={};for(let n=0;n{if(n){const s=n.split(Al);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function ns(e){let t="";if(fe(e))t=e;else if(B(e))for(let n=0;nss(n,t))}const Li=e=>!!(e&&e.__v_isRef===!0),Il=e=>fe(e)?e:e==null?"":B(e)||re(e)&&(e.toString===Ii||!W(e.toString))?Li(e)?Il(e.value):JSON.stringify(e,Fi,2):String(e),Fi=(e,t)=>Li(t)?Fi(e,t.value):Ut(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r],i)=>(n[_s(s,i)+" =>"]=r,n),{})}:zn(t)?{[`Set(${t.size})`]:[...t.values()].map(n=>_s(n))}:Be(t)?_s(t):re(t)&&!B(t)&&!Ni(t)?String(t):t,_s=(e,t="")=>{var n;return Be(e)?`Symbol(${(n=e.description)!=null?n:t})`:e};/** -* @vue/reactivity v3.5.26 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let me;class Vi{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=me,!t&&me&&(this.index=(me.scopes||(me.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,n;if(this.scopes)for(t=0,n=this.scopes.length;t0&&--this._on===0&&(me=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let n,s;for(n=0,s=this.effects.length;n0)return;if(sn){let t=sn;for(sn=void 0;t;){const n=t.next;t.next=void 0,t.flags&=-9,t=n}}let e;for(;nn;){let t=nn;for(nn=void 0;t;){const n=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(s){e||(e=s)}t=n}}if(e)throw e}function Ki(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function Gi(e){let t,n=e.depsTail,s=n;for(;s;){const r=s.prevDep;s.version===-1?(s===n&&(n=r),sr(s),Ml(s)):t=s,s.dep.activeLink=s.prevActiveLink,s.prevActiveLink=void 0,s=r}e.deps=t,e.depsTail=n}function Ns(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(Wi(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function Wi(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===hn)||(e.globalVersion=hn,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Ns(e))))return;e.flags|=2;const t=e.dep,n=ce,s=He;ce=e,He=!0;try{Ki(e);const r=e.fn(e._value);(t.version===0||vt(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{ce=n,He=s,Gi(e),e.flags&=-3}}function sr(e,t=!1){const{dep:n,prevSub:s,nextSub:r}=e;if(s&&(s.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=s,e.nextSub=void 0),n.subs===e&&(n.subs=s,!s&&n.computed)){n.computed.flags&=-5;for(let i=n.computed.deps;i;i=i.nextDep)sr(i,!0)}!t&&!--n.sc&&n.map&&n.map.delete(n.key)}function Ml(e){const{prevDep:t,nextDep:n}=e;t&&(t.nextDep=n,e.prevDep=void 0),n&&(n.prevDep=t,e.nextDep=void 0)}let He=!0;const $i=[];function ot(){$i.push(He),He=!1}function lt(){const e=$i.pop();He=e===void 0?!0:e}function Rr(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const n=ce;ce=void 0;try{t()}finally{ce=n}}}let hn=0;class Dl{constructor(t,n){this.sub=t,this.dep=n,this.version=n.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class rr{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!ce||!He||ce===this.computed)return;let n=this.activeLink;if(n===void 0||n.sub!==ce)n=this.activeLink=new Dl(ce,this),ce.deps?(n.prevDep=ce.depsTail,ce.depsTail.nextDep=n,ce.depsTail=n):ce.deps=ce.depsTail=n,qi(n);else if(n.version===-1&&(n.version=this.version,n.nextDep)){const s=n.nextDep;s.prevDep=n.prevDep,n.prevDep&&(n.prevDep.nextDep=s),n.prevDep=ce.depsTail,n.nextDep=void 0,ce.depsTail.nextDep=n,ce.depsTail=n,ce.deps===n&&(ce.deps=s)}return n}trigger(t){this.version++,hn++,this.notify(t)}notify(t){tr();try{for(let n=this.subs;n;n=n.prevSub)n.sub.notify()&&n.sub.dep.notify()}finally{nr()}}}function qi(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let s=t.deps;s;s=s.nextDep)qi(s)}const n=e.dep.subs;n!==e&&(e.prevSub=n,n&&(n.nextSub=e)),e.dep.subs=e}}const Fn=new WeakMap,Pt=Symbol(""),Ms=Symbol(""),dn=Symbol("");function _e(e,t,n){if(He&&ce){let s=Fn.get(e);s||Fn.set(e,s=new Map);let r=s.get(n);r||(s.set(n,r=new rr),r.map=s,r.key=n),r.track()}}function st(e,t,n,s,r,i){const o=Fn.get(e);if(!o){hn++;return}const l=c=>{c&&c.trigger()};if(tr(),t==="clear")o.forEach(l);else{const c=B(e),u=c&&Qn(n);if(c&&n==="length"){const f=Number(s);o.forEach((h,p)=>{(p==="length"||p===dn||!Be(p)&&p>=f)&&l(h)})}else switch((n!==void 0||o.has(void 0))&&l(o.get(n)),u&&l(o.get(dn)),t){case"add":c?u&&l(o.get("length")):(l(o.get(Pt)),Ut(e)&&l(o.get(Ms)));break;case"delete":c||(l(o.get(Pt)),Ut(e)&&l(o.get(Ms)));break;case"set":Ut(e)&&l(o.get(Pt));break}}nr()}function Ll(e,t){const n=Fn.get(e);return n&&n.get(t)}function Ft(e){const t=Z(e);return t===e?t:(_e(t,"iterate",dn),Ne(e)?t:t.map(je))}function rs(e){return _e(e=Z(e),"iterate",dn),e}function gt(e,t){return ct(e)?it(e)?Wt(je(t)):Wt(t):je(t)}const Fl={__proto__:null,[Symbol.iterator](){return vs(this,Symbol.iterator,e=>gt(this,e))},concat(...e){return Ft(this).concat(...e.map(t=>B(t)?Ft(t):t))},entries(){return vs(this,"entries",e=>(e[1]=gt(this,e[1]),e))},every(e,t){return Ze(this,"every",e,t,void 0,arguments)},filter(e,t){return Ze(this,"filter",e,t,n=>n.map(s=>gt(this,s)),arguments)},find(e,t){return Ze(this,"find",e,t,n=>gt(this,n),arguments)},findIndex(e,t){return Ze(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ze(this,"findLast",e,t,n=>gt(this,n),arguments)},findLastIndex(e,t){return Ze(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ze(this,"forEach",e,t,void 0,arguments)},includes(...e){return bs(this,"includes",e)},indexOf(...e){return bs(this,"indexOf",e)},join(e){return Ft(this).join(e)},lastIndexOf(...e){return bs(this,"lastIndexOf",e)},map(e,t){return Ze(this,"map",e,t,void 0,arguments)},pop(){return Qt(this,"pop")},push(...e){return Qt(this,"push",e)},reduce(e,...t){return wr(this,"reduce",e,t)},reduceRight(e,...t){return wr(this,"reduceRight",e,t)},shift(){return Qt(this,"shift")},some(e,t){return Ze(this,"some",e,t,void 0,arguments)},splice(...e){return Qt(this,"splice",e)},toReversed(){return Ft(this).toReversed()},toSorted(e){return Ft(this).toSorted(e)},toSpliced(...e){return Ft(this).toSpliced(...e)},unshift(...e){return Qt(this,"unshift",e)},values(){return vs(this,"values",e=>gt(this,e))}};function vs(e,t,n){const s=rs(e),r=s[t]();return s!==e&&!Ne(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.done||(i.value=n(i.value)),i}),r}const Vl=Array.prototype;function Ze(e,t,n,s,r,i){const o=rs(e),l=o!==e&&!Ne(e),c=o[t];if(c!==Vl[t]){const h=c.apply(e,i);return l?je(h):h}let u=n;o!==e&&(l?u=function(h,p){return n.call(this,gt(e,h),p,e)}:n.length>2&&(u=function(h,p){return n.call(this,h,p,e)}));const f=c.call(o,u,s);return l&&r?r(f):f}function wr(e,t,n,s){const r=rs(e);let i=n;return r!==e&&(Ne(e)?n.length>3&&(i=function(o,l,c){return n.call(this,o,l,c,e)}):i=function(o,l,c){return n.call(this,o,gt(e,l),c,e)}),r[t](i,...s)}function bs(e,t,n){const s=Z(e);_e(s,"iterate",dn);const r=s[t](...n);return(r===-1||r===!1)&&is(n[0])?(n[0]=Z(n[0]),s[t](...n)):r}function Qt(e,t,n=[]){ot(),tr();const s=Z(e)[t].apply(e,n);return nr(),lt(),s}const Hl=Xs("__proto__,__v_isRef,__isVue"),Ji=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Be));function Bl(e){Be(e)||(e=String(e));const t=Z(this);return _e(t,"has",e),t.hasOwnProperty(e)}class zi{constructor(t=!1,n=!1){this._isReadonly=t,this._isShallow=n}get(t,n,s){if(n==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(n==="__v_isReactive")return!r;if(n==="__v_isReadonly")return r;if(n==="__v_isShallow")return i;if(n==="__v_raw")return s===(r?i?zl:Zi:i?Xi:Yi).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(s)?t:void 0;const o=B(t);if(!r){let c;if(o&&(c=Fl[n]))return c;if(n==="hasOwnProperty")return Bl}const l=Reflect.get(t,n,ae(t)?t:s);if((Be(n)?Ji.has(n):Hl(n))||(r||_e(t,"get",n),i))return l;if(ae(l)){const c=o&&Qn(n)?l:l.value;return r&&re(c)?Ls(c):c}return re(l)?r?Ls(l):En(l):l}}class Qi extends zi{constructor(t=!1){super(!1,t)}set(t,n,s,r){let i=t[n];const o=B(t)&&Qn(n);if(!this._isShallow){const u=ct(i);if(!Ne(s)&&!ct(s)&&(i=Z(i),s=Z(s)),!o&&ae(i)&&!ae(s))return u||(i.value=s),!0}const l=o?Number(n)e,An=e=>Reflect.getPrototypeOf(e);function Gl(e,t,n){return function(...s){const r=this.__v_raw,i=Z(r),o=Ut(i),l=e==="entries"||e===Symbol.iterator&&o,c=e==="keys"&&o,u=r[e](...s),f=n?Ds:t?Wt:je;return!t&&_e(i,"iterate",c?Ms:Pt),{next(){const{value:h,done:p}=u.next();return p?{value:h,done:p}:{value:l?[f(h[0]),f(h[1])]:f(h),done:p}},[Symbol.iterator](){return this}}}}function xn(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function Wl(e,t){const n={get(r){const i=this.__v_raw,o=Z(i),l=Z(r);e||(vt(r,l)&&_e(o,"get",r),_e(o,"get",l));const{has:c}=An(o),u=t?Ds:e?Wt:je;if(c.call(o,r))return u(i.get(r));if(c.call(o,l))return u(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&_e(Z(r),"iterate",Pt),r.size},has(r){const i=this.__v_raw,o=Z(i),l=Z(r);return e||(vt(r,l)&&_e(o,"has",r),_e(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,c=Z(l),u=t?Ds:e?Wt:je;return!e&&_e(c,"iterate",Pt),l.forEach((f,h)=>r.call(i,u(f),u(h),o))}};return pe(n,e?{add:xn("add"),set:xn("set"),delete:xn("delete"),clear:xn("clear")}:{add(r){!t&&!Ne(r)&&!ct(r)&&(r=Z(r));const i=Z(this);return An(i).has.call(i,r)||(i.add(r),st(i,"add",r,r)),this},set(r,i){!t&&!Ne(i)&&!ct(i)&&(i=Z(i));const o=Z(this),{has:l,get:c}=An(o);let u=l.call(o,r);u||(r=Z(r),u=l.call(o,r));const f=c.call(o,r);return o.set(r,i),u?vt(i,f)&&st(o,"set",r,i):st(o,"add",r,i),this},delete(r){const i=Z(this),{has:o,get:l}=An(i);let c=o.call(i,r);c||(r=Z(r),c=o.call(i,r)),l&&l.call(i,r);const u=i.delete(r);return c&&st(i,"delete",r,void 0),u},clear(){const r=Z(this),i=r.size!==0,o=r.clear();return i&&st(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{n[r]=Gl(r,e,t)}),n}function ir(e,t){const n=Wl(e,t);return(s,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?s:Reflect.get(ne(n,r)&&r in s?n:s,r,i)}const $l={get:ir(!1,!1)},ql={get:ir(!1,!0)},Jl={get:ir(!0,!1)};const Yi=new WeakMap,Xi=new WeakMap,Zi=new WeakMap,zl=new WeakMap;function Ql(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Yl(e){return e.__v_skip||!Object.isExtensible(e)?0:Ql(vl(e))}function En(e){return ct(e)?e:or(e,!1,Ul,$l,Yi)}function eo(e){return or(e,!1,Kl,ql,Xi)}function Ls(e){return or(e,!0,kl,Jl,Zi)}function or(e,t,n,s,r){if(!re(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=Yl(e);if(i===0)return e;const o=r.get(e);if(o)return o;const l=new Proxy(e,i===2?s:n);return r.set(e,l),l}function it(e){return ct(e)?it(e.__v_raw):!!(e&&e.__v_isReactive)}function ct(e){return!!(e&&e.__v_isReadonly)}function Ne(e){return!!(e&&e.__v_isShallow)}function is(e){return e?!!e.__v_raw:!1}function Z(e){const t=e&&e.__v_raw;return t?Z(t):e}function lr(e){return!ne(e,"__v_skip")&&Object.isExtensible(e)&&Mi(e,"__v_skip",!0),e}const je=e=>re(e)?En(e):e,Wt=e=>re(e)?Ls(e):e;function ae(e){return e?e.__v_isRef===!0:!1}function cr(e){return to(e,!1)}function Xl(e){return to(e,!0)}function to(e,t){return ae(e)?e:new Zl(e,t)}class Zl{constructor(t,n){this.dep=new rr,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=n?t:Z(t),this._value=n?t:je(t),this.__v_isShallow=n}get value(){return this.dep.track(),this._value}set value(t){const n=this._rawValue,s=this.__v_isShallow||Ne(t)||ct(t);t=s?t:Z(t),vt(t,n)&&(this._rawValue=t,this._value=s?t:je(t),this.dep.trigger())}}function It(e){return ae(e)?e.value:e}const ec={get:(e,t,n)=>t==="__v_raw"?e:It(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return ae(r)&&!ae(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function no(e){return it(e)?e:new Proxy(e,ec)}function tc(e){const t=B(e)?new Array(e.length):{};for(const n in e)t[n]=sc(e,n);return t}class nc{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0,this._value=void 0,this._raw=Z(t);let r=!0,i=t;if(!B(t)||!Qn(String(n)))do r=!is(i)||Ne(i);while(r&&(i=i.__v_raw));this._shallow=r}get value(){let t=this._object[this._key];return this._shallow&&(t=It(t)),this._value=t===void 0?this._defaultValue:t}set value(t){if(this._shallow&&ae(this._raw[this._key])){const n=this._object[this._key];if(ae(n)){n.value=t;return}}this._object[this._key]=t}get dep(){return Ll(this._raw,this._key)}}function sc(e,t,n){return new nc(e,t,n)}class rc{constructor(t,n,s){this.fn=t,this.setter=n,this._value=void 0,this.dep=new rr(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=hn-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!n,this.isSSR=s}notify(){if(this.flags|=16,!(this.flags&8)&&ce!==this)return ki(this,!0),!0}get value(){const t=this.dep.track();return Wi(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function ic(e,t,n=!1){let s,r;return W(e)?s=e:(s=e.get,r=e.set),new rc(s,r,n)}const Rn={},Vn=new WeakMap;let Rt;function oc(e,t=!1,n=Rt){if(n){let s=Vn.get(n);s||Vn.set(n,s=[]),s.push(e)}}function lc(e,t,n=oe){const{immediate:s,deep:r,once:i,scheduler:o,augmentJob:l,call:c}=n,u=M=>r?M:Ne(M)||r===!1||r===0?rt(M,1):rt(M);let f,h,p,m,S=!1,C=!1;if(ae(e)?(h=()=>e.value,S=Ne(e)):it(e)?(h=()=>u(e),S=!0):B(e)?(C=!0,S=e.some(M=>it(M)||Ne(M)),h=()=>e.map(M=>{if(ae(M))return M.value;if(it(M))return u(M);if(W(M))return c?c(M,2):M()})):W(e)?t?h=c?()=>c(e,2):e:h=()=>{if(p){ot();try{p()}finally{lt()}}const M=Rt;Rt=f;try{return c?c(e,3,[m]):e(m)}finally{Rt=M}}:h=Ye,t&&r){const M=h,j=r===!0?1/0:r;h=()=>rt(M(),j)}const L=Bi(),N=()=>{f.stop(),L&&L.active&&er(L.effects,f)};if(i&&t){const M=t;t=(...j)=>{M(...j),N()}}let P=C?new Array(e.length).fill(Rn):Rn;const F=M=>{if(!(!(f.flags&1)||!f.dirty&&!M))if(t){const j=f.run();if(r||S||(C?j.some((J,q)=>vt(J,P[q])):vt(j,P))){p&&p();const J=Rt;Rt=f;try{const q=[j,P===Rn?void 0:C&&P[0]===Rn?[]:P,m];P=j,c?c(t,3,q):t(...q)}finally{Rt=J}}}else f.run()};return l&&l(F),f=new ji(h),f.scheduler=o?()=>o(F,!1):F,m=M=>oc(M,!1,f),p=f.onStop=()=>{const M=Vn.get(f);if(M){if(c)c(M,4);else for(const j of M)j();Vn.delete(f)}},t?s?F(!0):P=f.run():o?o(F.bind(null,!0),!0):f.run(),N.pause=f.pause.bind(f),N.resume=f.resume.bind(f),N.stop=N,N}function rt(e,t=1/0,n){if(t<=0||!re(e)||e.__v_skip||(n=n||new Map,(n.get(e)||0)>=t))return e;if(n.set(e,t),t--,ae(e))rt(e.value,t,n);else if(B(e))for(let s=0;s{rt(s,t,n)});else if(Ni(e)){for(const s in e)rt(e[s],t,n);for(const s of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,s)&&rt(e[s],t,n)}return e}/** -* @vue/runtime-core v3.5.26 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/function Sn(e,t,n,s){try{return s?e(...s):e()}catch(r){os(r,t,n)}}function Ue(e,t,n,s){if(W(e)){const r=Sn(e,t,n,s);return r&&Pi(r)&&r.catch(i=>{os(i,t,n)}),r}if(B(e)){const r=[];for(let i=0;i>>1,r=xe[s],i=pn(r);i=pn(n)?xe.push(e):xe.splice(fc(t),0,e),e.flags|=1,ro()}}function ro(){Hn||(Hn=so.then(oo))}function uc(e){B(e)?kt.push(...e):mt&&e.id===-1?mt.splice(Ht+1,0,e):e.flags&1||(kt.push(e),e.flags|=1),ro()}function Tr(e,t,n=ze+1){for(;npn(n)-pn(s));if(kt.length=0,mt){mt.push(...t);return}for(mt=t,Ht=0;Hte.id==null?e.flags&2?-1:1/0:e.id;function oo(e){try{for(ze=0;ze{s._d&&kn(-1);const i=Bn(t);let o;try{o=e(...r)}finally{Bn(i),s._d&&kn(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function la(e,t){if(ge===null)return e;const n=ds(ge),s=e.dirs||(e.dirs=[]);for(let r=0;r1)return n&&W(t)?t.call(s&&s.proxy):t}}function hc(){return!!(hs()||Nt)}const dc=Symbol.for("v-scx"),pc=()=>Fe(dc);function ca(e,t){return ur(e,null,t)}function rn(e,t,n){return ur(e,t,n)}function ur(e,t,n=oe){const{immediate:s,deep:r,flush:i,once:o}=n,l=pe({},n),c=t&&s||!t&&i!=="post";let u;if(yn){if(i==="sync"){const m=pc();u=m.__watcherHandles||(m.__watcherHandles=[])}else if(!c){const m=()=>{};return m.stop=Ye,m.resume=Ye,m.pause=Ye,m}}const f=ve;l.call=(m,S,C)=>Ue(m,f,S,C);let h=!1;i==="post"?l.scheduler=m=>{Ce(m,f&&f.suspense)}:i!=="sync"&&(h=!0,l.scheduler=(m,S)=>{S?m():fr(m)}),l.augmentJob=m=>{t&&(m.flags|=4),h&&(m.flags|=2,f&&(m.id=f.uid,m.i=f))};const p=lc(e,t,l);return yn&&(u?u.push(p):c&&p()),p}function gc(e,t,n){const s=this.proxy,r=fe(e)?e.includes(".")?co(s,e):()=>s[e]:e.bind(s,s);let i;W(t)?i=t:(i=t.handler,n=t);const o=Cn(this),l=ur(r,i.bind(s),n);return o(),l}function co(e,t){const n=t.split(".");return()=>{let s=e;for(let r=0;re.__isTeleport,on=e=>e&&(e.disabled||e.disabled===""),Or=e=>e&&(e.defer||e.defer===""),Pr=e=>typeof SVGElement<"u"&&e instanceof SVGElement,Ir=e=>typeof MathMLElement=="function"&&e instanceof MathMLElement,Fs=(e,t)=>{const n=e&&e.to;return fe(n)?t?t(n):null:n},ao={name:"Teleport",__isTeleport:!0,process(e,t,n,s,r,i,o,l,c,u){const{mc:f,pc:h,pbc:p,o:{insert:m,querySelector:S,createText:C,createComment:L}}=u,N=on(t.props);let{shapeFlag:P,children:F,dynamicChildren:M}=t;if(e==null){const j=t.el=C(""),J=t.anchor=C("");m(j,n,s),m(J,n,s);const q=(A,k)=>{P&16&&f(F,A,k,r,i,o,l,c)},U=()=>{const A=t.target=Fs(t.props,S),k=ho(A,t,C,m);A&&(o!=="svg"&&Pr(A)?o="svg":o!=="mathml"&&Ir(A)&&(o="mathml"),r&&r.isCE&&(r.ce._teleportTargets||(r.ce._teleportTargets=new Set)).add(A),N||(q(A,k),Nn(t,!1)))};N&&(q(n,J),Nn(t,!0)),Or(t.props)?(t.el.__isMounted=!1,Ce(()=>{U(),delete t.el.__isMounted},i)):U()}else{if(Or(t.props)&&e.el.__isMounted===!1){Ce(()=>{ao.process(e,t,n,s,r,i,o,l,c,u)},i);return}t.el=e.el,t.targetStart=e.targetStart;const j=t.anchor=e.anchor,J=t.target=e.target,q=t.targetAnchor=e.targetAnchor,U=on(e.props),A=U?n:J,k=U?j:q;if(o==="svg"||Pr(J)?o="svg":(o==="mathml"||Ir(J))&&(o="mathml"),M?(p(e.dynamicChildren,M,A,r,i,o,l),mr(e,t,!0)):c||h(e,t,A,k,r,i,o,l,!1),N)U?t.props&&e.props&&t.props.to!==e.props.to&&(t.props.to=e.props.to):wn(t,n,j,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const z=t.target=Fs(t.props,S);z&&wn(t,z,null,u,0)}else U&&wn(t,J,q,u,1);Nn(t,N)}},remove(e,t,n,{um:s,o:{remove:r}},i){const{shapeFlag:o,children:l,anchor:c,targetStart:u,targetAnchor:f,target:h,props:p}=e;if(h&&(r(u),r(f)),i&&r(c),o&16){const m=i||!on(p);for(let S=0;S{e.isMounted=!0}),Ao(()=>{e.isUnmounting=!0}),e}const De=[Function,Array],go={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:De,onEnter:De,onAfterEnter:De,onEnterCancelled:De,onBeforeLeave:De,onLeave:De,onAfterLeave:De,onLeaveCancelled:De,onBeforeAppear:De,onAppear:De,onAfterAppear:De,onAppearCancelled:De},mo=e=>{const t=e.subTree;return t.component?mo(t.component):t},_c={name:"BaseTransition",props:go,setup(e,{slots:t}){const n=hs(),s=po();return()=>{const r=t.default&&ar(t.default(),!0);if(!r||!r.length)return;const i=_o(r),o=Z(e),{mode:l}=o;if(s.isLeaving)return Es(i);const c=Nr(i);if(!c)return Es(i);let u=gn(c,o,s,n,h=>u=h);c.type!==ye&&Mt(c,u);let f=n.subTree&&Nr(n.subTree);if(f&&f.type!==ye&&!wt(f,c)&&mo(n).type!==ye){let h=gn(f,o,s,n);if(Mt(f,h),l==="out-in"&&c.type!==ye)return s.isLeaving=!0,h.afterLeave=()=>{s.isLeaving=!1,n.job.flags&8||n.update(),delete h.afterLeave,f=void 0},Es(i);l==="in-out"&&c.type!==ye?h.delayLeave=(p,m,S)=>{const C=yo(s,f);C[String(f.key)]=f,p[nt]=()=>{m(),p[nt]=void 0,delete u.delayedLeave,f=void 0},u.delayedLeave=()=>{S(),delete u.delayedLeave,f=void 0}}:f=void 0}else f&&(f=void 0);return i}}};function _o(e){let t=e[0];if(e.length>1){for(const n of e)if(n.type!==ye){t=n;break}}return t}const yc=_c;function yo(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function gn(e,t,n,s,r){const{appear:i,mode:o,persisted:l=!1,onBeforeEnter:c,onEnter:u,onAfterEnter:f,onEnterCancelled:h,onBeforeLeave:p,onLeave:m,onAfterLeave:S,onLeaveCancelled:C,onBeforeAppear:L,onAppear:N,onAfterAppear:P,onAppearCancelled:F}=t,M=String(e.key),j=yo(n,e),J=(A,k)=>{A&&Ue(A,s,9,k)},q=(A,k)=>{const z=k[1];J(A,k),B(A)?A.every(O=>O.length<=1)&&z():A.length<=1&&z()},U={mode:o,persisted:l,beforeEnter(A){let k=c;if(!n.isMounted)if(i)k=L||c;else return;A[nt]&&A[nt](!0);const z=j[M];z&&wt(e,z)&&z.el[nt]&&z.el[nt](),J(k,[A])},enter(A){let k=u,z=f,O=h;if(!n.isMounted)if(i)k=N||u,z=P||f,O=F||h;else return;let Q=!1;const he=A[Tn]=Ee=>{Q||(Q=!0,Ee?J(O,[A]):J(z,[A]),U.delayedLeave&&U.delayedLeave(),A[Tn]=void 0)};k?q(k,[A,he]):he()},leave(A,k){const z=String(e.key);if(A[Tn]&&A[Tn](!0),n.isUnmounting)return k();J(p,[A]);let O=!1;const Q=A[nt]=he=>{O||(O=!0,k(),he?J(C,[A]):J(S,[A]),A[nt]=void 0,j[z]===e&&delete j[z])};j[z]=e,m?q(m,[A,Q]):Q()},clone(A){const k=gn(A,t,n,s,r);return r&&r(k),k}};return U}function Es(e){if(cs(e))return e=bt(e),e.children=null,e}function Nr(e){if(!cs(e))return uo(e.type)&&e.children?_o(e.children):e;if(e.component)return e.component.subTree;const{shapeFlag:t,children:n}=e;if(n){if(t&16)return n[0];if(t&32&&W(n.default))return n.default()}}function Mt(e,t){e.shapeFlag&6&&e.component?(e.transition=t,Mt(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ar(e,t=!1,n){let s=[],r=0;for(let i=0;i1)for(let i=0;iln(S,t&&(B(t)?t[C]:t),n,s,r));return}if(Kt(s)&&!r){s.shapeFlag&512&&s.type.__asyncResolved&&s.component.subTree.component&&ln(e,t,n,s.component.subTree);return}const i=s.shapeFlag&4?ds(s.component):s.el,o=r?null:i,{i:l,r:c}=e,u=t&&t.r,f=l.refs===oe?l.refs={}:l.refs,h=l.setupState,p=Z(h),m=h===oe?Oi:S=>ne(p,S);if(u!=null&&u!==c){if(Mr(t),fe(u))f[u]=null,m(u)&&(h[u]=null);else if(ae(u)){u.value=null;const S=t;S.k&&(f[S.k]=null)}}if(W(c))Sn(c,l,12,[o,f]);else{const S=fe(c),C=ae(c);if(S||C){const L=()=>{if(e.f){const N=S?m(c)?h[c]:f[c]:c.value;if(r)B(N)&&er(N,i);else if(B(N))N.includes(i)||N.push(i);else if(S)f[c]=[i],m(c)&&(h[c]=f[c]);else{const P=[i];c.value=P,e.k&&(f[e.k]=P)}}else S?(f[c]=o,m(c)&&(h[c]=o)):C&&(c.value=o,e.k&&(f[e.k]=o))};if(o){const N=()=>{L(),jn.delete(e)};N.id=-1,jn.set(e,N),Ce(N,n)}else Mr(e),L()}}}function Mr(e){const t=jn.get(e);t&&(t.flags|=8,jn.delete(e))}es().requestIdleCallback;es().cancelIdleCallback;const Kt=e=>!!e.type.__asyncLoader,cs=e=>e.type.__isKeepAlive;function vc(e,t){Eo(e,"a",t)}function bc(e,t){Eo(e,"da",t)}function Eo(e,t,n=ve){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(fs(t,s,n),n){let r=n.parent;for(;r&&r.parent;)cs(r.parent.vnode)&&Ec(s,t,n,r),r=r.parent}}function Ec(e,t,n,s){const r=fs(t,e,s,!0);xo(()=>{er(s[t],r)},n)}function fs(e,t,n=ve,s=!1){if(n){const r=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{ot();const l=Cn(n),c=Ue(t,n,e,o);return l(),lt(),c});return s?r.unshift(i):r.push(i),i}}const ft=e=>(t,n=ve)=>{(!yn||e==="sp")&&fs(e,(...s)=>t(...s),n)},Sc=ft("bm"),So=ft("m"),Cc=ft("bu"),Co=ft("u"),Ao=ft("bum"),xo=ft("um"),Ac=ft("sp"),xc=ft("rtg"),Rc=ft("rtc");function wc(e,t=ve){fs("ec",e,t)}const hr="components",Tc="directives";function ua(e,t){return dr(hr,e,!0,t)||e}const Ro=Symbol.for("v-ndc");function aa(e){return fe(e)?dr(hr,e,!1)||e:e||Ro}function ha(e){return dr(Tc,e)}function dr(e,t,n=!0,s=!1){const r=ge||ve;if(r){const i=r.type;if(e===hr){const l=pf(i,!1);if(l&&(l===t||l===Ve(t)||l===Xn(Ve(t))))return i}const o=Dr(r[e]||i[e],t)||Dr(r.appContext[e],t);return!o&&s?i:o}}function Dr(e,t){return e&&(e[t]||e[Ve(t)]||e[Xn(Ve(t))])}function da(e,t,n,s){let r;const i=n,o=B(e);if(o||fe(e)){const l=o&&it(e);let c=!1,u=!1;l&&(c=!Ne(e),u=ct(e),e=rs(e)),r=new Array(e.length);for(let f=0,h=e.length;ft(l,c,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let c=0,u=l.length;c{const i=s.fn(...r);return i&&(i.key=s.key),i}:s.fn)}return e}function ga(e,t,n={},s,r){if(ge.ce||ge.parent&&Kt(ge.parent)&&ge.parent.ce){const u=Object.keys(n).length>0;return t!=="default"&&(n.name=t),Us(),ks(Re,null,[be("slot",n,s&&s())],u?-2:64)}let i=e[t];i&&i._c&&(i._d=!1),Us();const o=i&&wo(i(n)),l=n.key||o&&o.key,c=ks(Re,{key:(l&&!Be(l)?l:`_${t}`)+(!o&&s?"_fb":"")},o||(s?s():[]),o&&e._===1?64:-2);return!r&&c.scopeId&&(c.slotScopeIds=[c.scopeId+"-s"]),i&&i._c&&(i._d=!0),c}function wo(e){return e.some(t=>_n(t)?!(t.type===ye||t.type===Re&&!wo(t.children)):!0)?e:null}function ma(e,t){const n={};for(const s in e)n[On(s)]=e[s];return n}const Vs=e=>e?$o(e)?ds(e):Vs(e.parent):null,cn=pe(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Vs(e.parent),$root:e=>Vs(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Oo(e),$forceUpdate:e=>e.f||(e.f=()=>{fr(e.update)}),$nextTick:e=>e.n||(e.n=ls.bind(e.proxy)),$watch:e=>gc.bind(e)}),Ss=(e,t)=>e!==oe&&!e.__isScriptSetup&&ne(e,t),Oc={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:n,setupState:s,data:r,props:i,accessCache:o,type:l,appContext:c}=e;if(t[0]!=="$"){const p=o[t];if(p!==void 0)switch(p){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return i[t]}else{if(Ss(s,t))return o[t]=1,s[t];if(r!==oe&&ne(r,t))return o[t]=2,r[t];if(ne(i,t))return o[t]=3,i[t];if(n!==oe&&ne(n,t))return o[t]=4,n[t];Hs&&(o[t]=0)}}const u=cn[t];let f,h;if(u)return t==="$attrs"&&_e(e.attrs,"get",""),u(e);if((f=l.__cssModules)&&(f=f[t]))return f;if(n!==oe&&ne(n,t))return o[t]=4,n[t];if(h=c.config.globalProperties,ne(h,t))return h[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:i}=e;return Ss(r,t)?(r[t]=n,!0):s!==oe&&ne(s,t)?(s[t]=n,!0):ne(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,props:i,type:o}},l){let c;return!!(n[l]||e!==oe&&l[0]!=="$"&&ne(e,l)||Ss(t,l)||ne(i,l)||ne(s,l)||ne(cn,l)||ne(r.config.globalProperties,l)||(c=o.__cssModules)&&c[l])},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ne(n,"value")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Lr(e){return B(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}let Hs=!0;function Pc(e){const t=Oo(e),n=e.proxy,s=e.ctx;Hs=!1,t.beforeCreate&&Fr(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:c,inject:u,created:f,beforeMount:h,mounted:p,beforeUpdate:m,updated:S,activated:C,deactivated:L,beforeDestroy:N,beforeUnmount:P,destroyed:F,unmounted:M,render:j,renderTracked:J,renderTriggered:q,errorCaptured:U,serverPrefetch:A,expose:k,inheritAttrs:z,components:O,directives:Q,filters:he}=t;if(u&&Ic(u,s,null),o)for(const $ in o){const ee=o[$];W(ee)&&(s[$]=ee.bind(n))}if(r){const $=r.call(n,n);re($)&&(e.data=En($))}if(Hs=!0,i)for(const $ in i){const ee=i[$],Xe=W(ee)?ee.bind(n,n):W(ee.get)?ee.get.bind(n,n):Ye,ut=!W(ee)&&W(ee.set)?ee.set.bind(n):Ye,Ke=Le({get:Xe,set:ut});Object.defineProperty(s,$,{enumerable:!0,configurable:!0,get:()=>Ke.value,set:we=>Ke.value=we})}if(l)for(const $ in l)To(l[$],s,n,$);if(c){const $=W(c)?c.call(n):c;Reflect.ownKeys($).forEach(ee=>{In(ee,$[ee])})}f&&Fr(f,e,"c");function ie($,ee){B(ee)?ee.forEach(Xe=>$(Xe.bind(n))):ee&&$(ee.bind(n))}if(ie(Sc,h),ie(So,p),ie(Cc,m),ie(Co,S),ie(vc,C),ie(bc,L),ie(wc,U),ie(Rc,J),ie(xc,q),ie(Ao,P),ie(xo,M),ie(Ac,A),B(k))if(k.length){const $=e.exposed||(e.exposed={});k.forEach(ee=>{Object.defineProperty($,ee,{get:()=>n[ee],set:Xe=>n[ee]=Xe,enumerable:!0})})}else e.exposed||(e.exposed={});j&&e.render===Ye&&(e.render=j),z!=null&&(e.inheritAttrs=z),O&&(e.components=O),Q&&(e.directives=Q),A&&bo(e)}function Ic(e,t,n=Ye){B(e)&&(e=Bs(e));for(const s in e){const r=e[s];let i;re(r)?"default"in r?i=Fe(r.from||s,r.default,!0):i=Fe(r.from||s):i=Fe(r),ae(i)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[s]=i}}function Fr(e,t,n){Ue(B(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function To(e,t,n,s){let r=s.includes(".")?co(n,s):()=>n[s];if(fe(e)){const i=t[e];W(i)&&rn(r,i)}else if(W(e))rn(r,e.bind(n));else if(re(e))if(B(e))e.forEach(i=>To(i,t,n,s));else{const i=W(e.handler)?e.handler.bind(n):t[e.handler];W(i)&&rn(r,i,e)}}function Oo(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let c;return l?c=l:!r.length&&!n&&!s?c=t:(c={},r.length&&r.forEach(u=>Un(c,u,o,!0)),Un(c,t,o)),re(t)&&i.set(t,c),c}function Un(e,t,n,s=!1){const{mixins:r,extends:i}=t;i&&Un(e,i,n,!0),r&&r.forEach(o=>Un(e,o,n,!0));for(const o in t)if(!(s&&o==="expose")){const l=Nc[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const Nc={data:Vr,props:Hr,emits:Hr,methods:en,computed:en,beforeCreate:Se,created:Se,beforeMount:Se,mounted:Se,beforeUpdate:Se,updated:Se,beforeDestroy:Se,beforeUnmount:Se,destroyed:Se,unmounted:Se,activated:Se,deactivated:Se,errorCaptured:Se,serverPrefetch:Se,components:en,directives:en,watch:Dc,provide:Vr,inject:Mc};function Vr(e,t){return t?e?function(){return pe(W(e)?e.call(this,this):e,W(t)?t.call(this,this):t)}:t:e}function Mc(e,t){return en(Bs(e),Bs(t))}function Bs(e){if(B(e)){const t={};for(let n=0;nt==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Ve(t)}Modifiers`]||e[`${Et(t)}Modifiers`];function Hc(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||oe;let r=n;const i=t.startsWith("update:"),o=i&&Vc(s,t.slice(7));o&&(o.trim&&(r=n.map(f=>fe(f)?f.trim():f)),o.number&&(r=n.map(Zn)));let l,c=s[l=On(t)]||s[l=On(Ve(t))];!c&&i&&(c=s[l=On(Et(t))]),c&&Ue(c,e,6,r);const u=s[l+"Once"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Ue(u,e,6,r)}}const Bc=new WeakMap;function Io(e,t,n=!1){const s=n?Bc:t.emitsCache,r=s.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!W(e)){const c=u=>{const f=Io(u,t,!0);f&&(l=!0,pe(o,f))};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}return!i&&!l?(re(e)&&s.set(e,null),null):(B(i)?i.forEach(c=>o[c]=null):pe(o,i),re(e)&&s.set(e,o),o)}function us(e,t){return!e||!Jn(t)?!1:(t=t.slice(2).replace(/Once$/,""),ne(e,t[0].toLowerCase()+t.slice(1))||ne(e,Et(t))||ne(e,t))}function Br(e){const{type:t,vnode:n,proxy:s,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:c,render:u,renderCache:f,props:h,data:p,setupState:m,ctx:S,inheritAttrs:C}=e,L=Bn(e);let N,P;try{if(n.shapeFlag&4){const M=r||s,j=M;N=Qe(u.call(j,M,f,h,m,p,S)),P=l}else{const M=t;N=Qe(M.length>1?M(h,{attrs:l,slots:o,emit:c}):M(h,null)),P=t.props?l:jc(l)}}catch(M){fn.length=0,os(M,e,1),N=be(ye)}let F=N;if(P&&C!==!1){const M=Object.keys(P),{shapeFlag:j}=F;M.length&&j&7&&(i&&M.some(Zs)&&(P=Uc(P,i)),F=bt(F,P,!1,!0))}return n.dirs&&(F=bt(F,null,!1,!0),F.dirs=F.dirs?F.dirs.concat(n.dirs):n.dirs),n.transition&&Mt(F,n.transition),N=F,Bn(L),N}const jc=e=>{let t;for(const n in e)(n==="class"||n==="style"||Jn(n))&&((t||(t={}))[n]=e[n]);return t},Uc=(e,t)=>{const n={};for(const s in e)(!Zs(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function kc(e,t,n){const{props:s,children:r,component:i}=e,{props:o,children:l,patchFlag:c}=t,u=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&c>=0){if(c&1024)return!0;if(c&16)return s?jr(s,o,u):!!o;if(c&8){const f=t.dynamicProps;for(let h=0;hObject.create(No),Do=e=>Object.getPrototypeOf(e)===No;function Gc(e,t,n,s=!1){const r={},i=Mo();e.propsDefaults=Object.create(null),Lo(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:eo(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function Wc(e,t,n,s){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=Z(r),[c]=e.propsOptions;let u=!1;if((s||o>0)&&!(o&16)){if(o&8){const f=e.vnode.dynamicProps;for(let h=0;h{c=!0;const[p,m]=Fo(h,t,!0);pe(o,p),m&&l.push(...m)};!n&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!i&&!c)return re(e)&&s.set(e,jt),jt;if(B(i))for(let f=0;fe==="_"||e==="_ctx"||e==="$stable",gr=e=>B(e)?e.map(Qe):[Qe(e)],qc=(e,t,n)=>{if(t._n)return t;const s=ac((...r)=>gr(t(...r)),n);return s._c=!1,s},Vo=(e,t,n)=>{const s=e._ctx;for(const r in e){if(pr(r))continue;const i=e[r];if(W(i))t[r]=qc(r,i,s);else if(i!=null){const o=gr(i);t[r]=()=>o}}},Ho=(e,t)=>{const n=gr(t);e.slots.default=()=>n},Bo=(e,t,n)=>{for(const s in t)(n||!pr(s))&&(e[s]=t[s])},Jc=(e,t,n)=>{const s=e.slots=Mo();if(e.vnode.shapeFlag&32){const r=t._;r?(Bo(s,t,n),n&&Mi(s,"_",r,!0)):Vo(t,s)}else t&&Ho(e,t)},zc=(e,t,n)=>{const{vnode:s,slots:r}=e;let i=!0,o=oe;if(s.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:Bo(r,t,n):(i=!t.$stable,Vo(t,r)),o=t}else t&&(Ho(e,t),o={default:1});if(i)for(const l in r)!pr(l)&&o[l]==null&&delete r[l]},Ce=ef;function Qc(e){return Yc(e)}function Yc(e,t){const n=es();n.__VUE__=!0;const{insert:s,remove:r,patchProp:i,createElement:o,createText:l,createComment:c,setText:u,setElementText:f,parentNode:h,nextSibling:p,setScopeId:m=Ye,insertStaticContent:S}=e,C=(a,d,g,_=null,b=null,y=null,w=void 0,R=null,x=!!d.dynamicChildren)=>{if(a===d)return;a&&!wt(a,d)&&(_=v(a),we(a,b,y,!0),a=null),d.patchFlag===-2&&(x=!1,d.dynamicChildren=null);const{type:E,ref:K,shapeFlag:I}=d;switch(E){case as:L(a,d,g,_);break;case ye:N(a,d,g,_);break;case Mn:a==null&&P(d,g,_,w);break;case Re:O(a,d,g,_,b,y,w,R,x);break;default:I&1?j(a,d,g,_,b,y,w,R,x):I&6?Q(a,d,g,_,b,y,w,R,x):(I&64||I&128)&&E.process(a,d,g,_,b,y,w,R,x,V)}K!=null&&b?ln(K,a&&a.ref,y,d||a,!d):K==null&&a&&a.ref!=null&&ln(a.ref,null,y,a,!0)},L=(a,d,g,_)=>{if(a==null)s(d.el=l(d.children),g,_);else{const b=d.el=a.el;d.children!==a.children&&u(b,d.children)}},N=(a,d,g,_)=>{a==null?s(d.el=c(d.children||""),g,_):d.el=a.el},P=(a,d,g,_)=>{[a.el,a.anchor]=S(a.children,d,g,_,a.el,a.anchor)},F=({el:a,anchor:d},g,_)=>{let b;for(;a&&a!==d;)b=p(a),s(a,g,_),a=b;s(d,g,_)},M=({el:a,anchor:d})=>{let g;for(;a&&a!==d;)g=p(a),r(a),a=g;r(d)},j=(a,d,g,_,b,y,w,R,x)=>{if(d.type==="svg"?w="svg":d.type==="math"&&(w="mathml"),a==null)J(d,g,_,b,y,w,R,x);else{const E=a.el&&a.el._isVueCE?a.el:null;try{E&&E._beginPatch(),A(a,d,b,y,w,R,x)}finally{E&&E._endPatch()}}},J=(a,d,g,_,b,y,w,R)=>{let x,E;const{props:K,shapeFlag:I,transition:H,dirs:G}=a;if(x=a.el=o(a.type,y,K&&K.is,K),I&8?f(x,a.children):I&16&&U(a.children,x,null,_,b,Cs(a,y),w,R),G&&Ct(a,null,_,"created"),q(x,a,a.scopeId,w,_),K){for(const le in K)le!=="value"&&!tn(le)&&i(x,le,null,K[le],y,_);"value"in K&&i(x,"value",null,K.value,y),(E=K.onVnodeBeforeMount)&&qe(E,_,a)}G&&Ct(a,null,_,"beforeMount");const X=Xc(b,H);X&&H.beforeEnter(x),s(x,d,g),((E=K&&K.onVnodeMounted)||X||G)&&Ce(()=>{E&&qe(E,_,a),X&&H.enter(x),G&&Ct(a,null,_,"mounted")},b)},q=(a,d,g,_,b)=>{if(g&&m(a,g),_)for(let y=0;y<_.length;y++)m(a,_[y]);if(b){let y=b.subTree;if(d===y||ko(y.type)&&(y.ssContent===d||y.ssFallback===d)){const w=b.vnode;q(a,w,w.scopeId,w.slotScopeIds,b.parent)}}},U=(a,d,g,_,b,y,w,R,x=0)=>{for(let E=x;E{const R=d.el=a.el;let{patchFlag:x,dynamicChildren:E,dirs:K}=d;x|=a.patchFlag&16;const I=a.props||oe,H=d.props||oe;let G;if(g&&At(g,!1),(G=H.onVnodeBeforeUpdate)&&qe(G,g,d,a),K&&Ct(d,a,g,"beforeUpdate"),g&&At(g,!0),(I.innerHTML&&H.innerHTML==null||I.textContent&&H.textContent==null)&&f(R,""),E?k(a.dynamicChildren,E,R,g,_,Cs(d,b),y):w||ee(a,d,R,null,g,_,Cs(d,b),y,!1),x>0){if(x&16)z(R,I,H,g,b);else if(x&2&&I.class!==H.class&&i(R,"class",null,H.class,b),x&4&&i(R,"style",I.style,H.style,b),x&8){const X=d.dynamicProps;for(let le=0;le{G&&qe(G,g,d,a),K&&Ct(d,a,g,"updated")},_)},k=(a,d,g,_,b,y,w)=>{for(let R=0;R{if(d!==g){if(d!==oe)for(const y in d)!tn(y)&&!(y in g)&&i(a,y,d[y],null,b,_);for(const y in g){if(tn(y))continue;const w=g[y],R=d[y];w!==R&&y!=="value"&&i(a,y,R,w,b,_)}"value"in g&&i(a,"value",d.value,g.value,b)}},O=(a,d,g,_,b,y,w,R,x)=>{const E=d.el=a?a.el:l(""),K=d.anchor=a?a.anchor:l("");let{patchFlag:I,dynamicChildren:H,slotScopeIds:G}=d;G&&(R=R?R.concat(G):G),a==null?(s(E,g,_),s(K,g,_),U(d.children||[],g,K,b,y,w,R,x)):I>0&&I&64&&H&&a.dynamicChildren&&a.dynamicChildren.length===H.length?(k(a.dynamicChildren,H,g,b,y,w,R),(d.key!=null||b&&d===b.subTree)&&mr(a,d,!0)):ee(a,d,g,K,b,y,w,R,x)},Q=(a,d,g,_,b,y,w,R,x)=>{d.slotScopeIds=R,a==null?d.shapeFlag&512?b.ctx.activate(d,g,_,w,x):he(d,g,_,b,y,w,x):Ee(a,d,x)},he=(a,d,g,_,b,y,w)=>{const R=a.component=ff(a,_,b);if(cs(a)&&(R.ctx.renderer=V),uf(R,!1,w),R.asyncDep){if(b&&b.registerDep(R,ie,w),!a.el){const x=R.subTree=be(ye);N(null,x,d,g),a.placeholder=x.el}}else ie(R,a,d,g,b,y,w)},Ee=(a,d,g)=>{const _=d.component=a.component;if(kc(a,d,g))if(_.asyncDep&&!_.asyncResolved){$(_,d,g);return}else _.next=d,_.update();else d.el=a.el,_.vnode=d},ie=(a,d,g,_,b,y,w)=>{const R=()=>{if(a.isMounted){let{next:I,bu:H,u:G,parent:X,vnode:le}=a;{const We=jo(a);if(We){I&&(I.el=le.el,$(a,I,w)),We.asyncDep.then(()=>{a.isUnmounted||R()});return}}let se=I,Te;At(a,!1),I?(I.el=le.el,$(a,I,w)):I=le,H&&Pn(H),(Te=I.props&&I.props.onVnodeBeforeUpdate)&&qe(Te,X,I,le),At(a,!0);const Oe=Br(a),Ge=a.subTree;a.subTree=Oe,C(Ge,Oe,h(Ge.el),v(Ge),a,b,y),I.el=Oe.el,se===null&&Kc(a,Oe.el),G&&Ce(G,b),(Te=I.props&&I.props.onVnodeUpdated)&&Ce(()=>qe(Te,X,I,le),b)}else{let I;const{el:H,props:G}=d,{bm:X,m:le,parent:se,root:Te,type:Oe}=a,Ge=Kt(d);At(a,!1),X&&Pn(X),!Ge&&(I=G&&G.onVnodeBeforeMount)&&qe(I,se,d),At(a,!0);{Te.ce&&Te.ce._def.shadowRoot!==!1&&Te.ce._injectChildStyle(Oe);const We=a.subTree=Br(a);C(null,We,g,_,a,b,y),d.el=We.el}if(le&&Ce(le,b),!Ge&&(I=G&&G.onVnodeMounted)){const We=d;Ce(()=>qe(I,se,We),b)}(d.shapeFlag&256||se&&Kt(se.vnode)&&se.vnode.shapeFlag&256)&&a.a&&Ce(a.a,b),a.isMounted=!0,d=g=_=null}};a.scope.on();const x=a.effect=new ji(R);a.scope.off();const E=a.update=x.run.bind(x),K=a.job=x.runIfDirty.bind(x);K.i=a,K.id=a.uid,x.scheduler=()=>fr(K),At(a,!0),E()},$=(a,d,g)=>{d.component=a;const _=a.vnode.props;a.vnode=d,a.next=null,Wc(a,d.props,_,g),zc(a,d.children,g),ot(),Tr(a),lt()},ee=(a,d,g,_,b,y,w,R,x=!1)=>{const E=a&&a.children,K=a?a.shapeFlag:0,I=d.children,{patchFlag:H,shapeFlag:G}=d;if(H>0){if(H&128){ut(E,I,g,_,b,y,w,R,x);return}else if(H&256){Xe(E,I,g,_,b,y,w,R,x);return}}G&8?(K&16&&Me(E,b,y),I!==E&&f(g,I)):K&16?G&16?ut(E,I,g,_,b,y,w,R,x):Me(E,b,y,!0):(K&8&&f(g,""),G&16&&U(I,g,_,b,y,w,R,x))},Xe=(a,d,g,_,b,y,w,R,x)=>{a=a||jt,d=d||jt;const E=a.length,K=d.length,I=Math.min(E,K);let H;for(H=0;HK?Me(a,b,y,!0,!1,I):U(d,g,_,b,y,w,R,x,I)},ut=(a,d,g,_,b,y,w,R,x)=>{let E=0;const K=d.length;let I=a.length-1,H=K-1;for(;E<=I&&E<=H;){const G=a[E],X=d[E]=x?_t(d[E]):Qe(d[E]);if(wt(G,X))C(G,X,g,null,b,y,w,R,x);else break;E++}for(;E<=I&&E<=H;){const G=a[I],X=d[H]=x?_t(d[H]):Qe(d[H]);if(wt(G,X))C(G,X,g,null,b,y,w,R,x);else break;I--,H--}if(E>I){if(E<=H){const G=H+1,X=GH)for(;E<=I;)we(a[E],b,y,!0),E++;else{const G=E,X=E,le=new Map;for(E=X;E<=H;E++){const Pe=d[E]=x?_t(d[E]):Qe(d[E]);Pe.key!=null&&le.set(Pe.key,E)}let se,Te=0;const Oe=H-X+1;let Ge=!1,We=0;const zt=new Array(Oe);for(E=0;E=Oe){we(Pe,b,y,!0);continue}let $e;if(Pe.key!=null)$e=le.get(Pe.key);else for(se=X;se<=H;se++)if(zt[se-X]===0&&wt(Pe,d[se])){$e=se;break}$e===void 0?we(Pe,b,y,!0):(zt[$e-X]=E+1,$e>=We?We=$e:Ge=!0,C(Pe,d[$e],g,null,b,y,w,R,x),Te++)}const Er=Ge?Zc(zt):jt;for(se=Er.length-1,E=Oe-1;E>=0;E--){const Pe=X+E,$e=d[Pe],Sr=d[Pe+1],Cr=Pe+1{const{el:y,type:w,transition:R,children:x,shapeFlag:E}=a;if(E&6){Ke(a.component.subTree,d,g,_);return}if(E&128){a.suspense.move(d,g,_);return}if(E&64){w.move(a,d,g,V);return}if(w===Re){s(y,d,g);for(let I=0;IR.enter(y),b);else{const{leave:I,delayLeave:H,afterLeave:G}=R,X=()=>{a.ctx.isUnmounted?r(y):s(y,d,g)},le=()=>{y._isLeaving&&y[nt](!0),I(y,()=>{X(),G&&G()})};H?H(y,X,le):le()}else s(y,d,g)},we=(a,d,g,_=!1,b=!1)=>{const{type:y,props:w,ref:R,children:x,dynamicChildren:E,shapeFlag:K,patchFlag:I,dirs:H,cacheIndex:G}=a;if(I===-2&&(b=!1),R!=null&&(ot(),ln(R,null,g,a,!0),lt()),G!=null&&(d.renderCache[G]=void 0),K&256){d.ctx.deactivate(a);return}const X=K&1&&H,le=!Kt(a);let se;if(le&&(se=w&&w.onVnodeBeforeUnmount)&&qe(se,d,a),K&6)St(a.component,g,_);else{if(K&128){a.suspense.unmount(g,_);return}X&&Ct(a,null,d,"beforeUnmount"),K&64?a.type.remove(a,d,g,V,_):E&&!E.hasOnce&&(y!==Re||I>0&&I&64)?Me(E,d,g,!1,!0):(y===Re&&I&384||!b&&K&16)&&Me(x,d,g),_&&Dt(a)}(le&&(se=w&&w.onVnodeUnmounted)||X)&&Ce(()=>{se&&qe(se,d,a),X&&Ct(a,null,d,"unmounted")},g)},Dt=a=>{const{type:d,el:g,anchor:_,transition:b}=a;if(d===Re){Lt(g,_);return}if(d===Mn){M(a);return}const y=()=>{r(g),b&&!b.persisted&&b.afterLeave&&b.afterLeave()};if(a.shapeFlag&1&&b&&!b.persisted){const{leave:w,delayLeave:R}=b,x=()=>w(g,y);R?R(a.el,y,x):x()}else y()},Lt=(a,d)=>{let g;for(;a!==d;)g=p(a),r(a),a=g;r(d)},St=(a,d,g)=>{const{bum:_,scope:b,job:y,subTree:w,um:R,m:x,a:E}=a;kr(x),kr(E),_&&Pn(_),b.stop(),y&&(y.flags|=8,we(w,a,d,g)),R&&Ce(R,d),Ce(()=>{a.isUnmounted=!0},d)},Me=(a,d,g,_=!1,b=!1,y=0)=>{for(let w=y;w{if(a.shapeFlag&6)return v(a.component.subTree);if(a.shapeFlag&128)return a.suspense.next();const d=p(a.anchor||a.el),g=d&&d[fo];return g?p(g):d};let D=!1;const T=(a,d,g)=>{let _;a==null?d._vnode&&(we(d._vnode,null,null,!0),_=d._vnode.component):C(d._vnode||null,a,d,null,null,null,g),d._vnode=a,D||(D=!0,Tr(_),io(),D=!1)},V={p:C,um:we,m:Ke,r:Dt,mt:he,mc:U,pc:ee,pbc:k,n:v,o:e};return{render:T,hydrate:void 0,createApp:Fc(T)}}function Cs({type:e,props:t},n){return n==="svg"&&e==="foreignObject"||n==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:n}function At({effect:e,job:t},n){n?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Xc(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function mr(e,t,n=!1){const s=e.children,r=t.children;if(B(s)&&B(r))for(let i=0;i>1,e[n[l]]0&&(t[s]=n[i-1]),n[i]=s)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}function jo(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:jo(t)}function kr(e){if(e)for(let t=0;te.__isSuspense;function ef(e,t){t&&t.pendingBranch?B(e)?t.effects.push(...e):t.effects.push(e):uc(e)}const Re=Symbol.for("v-fgt"),as=Symbol.for("v-txt"),ye=Symbol.for("v-cmt"),Mn=Symbol.for("v-stc"),fn=[];let Ie=null;function Us(e=!1){fn.push(Ie=e?null:[])}function tf(){fn.pop(),Ie=fn[fn.length-1]||null}let mn=1;function kn(e,t=!1){mn+=e,e<0&&Ie&&t&&(Ie.hasOnce=!0)}function Ko(e){return e.dynamicChildren=mn>0?Ie||jt:null,tf(),mn>0&&Ie&&Ie.push(e),e}function _a(e,t,n,s,r,i){return Ko(Wo(e,t,n,s,r,i,!0))}function ks(e,t,n,s,r){return Ko(be(e,t,n,s,r,!0))}function _n(e){return e?e.__v_isVNode===!0:!1}function wt(e,t){return e.type===t.type&&e.key===t.key}const Go=({key:e})=>e??null,Dn=({ref:e,ref_key:t,ref_for:n})=>(typeof e=="number"&&(e=""+e),e!=null?fe(e)||ae(e)||W(e)?{i:ge,r:e,k:t,f:!!n}:e:null);function Wo(e,t=null,n=null,s=0,r=null,i=e===Re?0:1,o=!1,l=!1){const c={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Go(t),ref:t&&Dn(t),scopeId:lo,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:ge};return l?(_r(c,n),i&128&&e.normalize(c)):n&&(c.shapeFlag|=fe(n)?8:16),mn>0&&!o&&Ie&&(c.patchFlag>0||i&6)&&c.patchFlag!==32&&Ie.push(c),c}const be=nf;function nf(e,t=null,n=null,s=0,r=null,i=!1){if((!e||e===Ro)&&(e=ye),_n(e)){const l=bt(e,t,!0);return n&&_r(l,n),mn>0&&!i&&Ie&&(l.shapeFlag&6?Ie[Ie.indexOf(e)]=l:Ie.push(l)),l.patchFlag=-2,l}if(gf(e)&&(e=e.__vccOpts),t){t=sf(t);let{class:l,style:c}=t;l&&!fe(l)&&(t.class=ns(l)),re(c)&&(is(c)&&!B(c)&&(c=pe({},c)),t.style=ts(c))}const o=fe(e)?1:ko(e)?128:uo(e)?64:re(e)?4:W(e)?2:0;return Wo(e,t,n,s,r,o,i,!0)}function sf(e){return e?is(e)||Do(e)?pe({},e):e:null}function bt(e,t,n=!1,s=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:c}=e,u=t?of(r||{},t):r,f={__v_isVNode:!0,__v_skip:!0,type:e.type,props:u,key:u&&Go(u),ref:t&&t.ref?n&&i?B(i)?i.concat(Dn(t)):[i,Dn(t)]:Dn(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Re?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:c,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&bt(e.ssContent),ssFallback:e.ssFallback&&bt(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return c&&s&&Mt(f,c.clone(f)),f}function rf(e=" ",t=0){return be(as,null,e,t)}function ya(e,t){const n=be(Mn,null,e);return n.staticCount=t,n}function va(e="",t=!1){return t?(Us(),ks(ye,null,e)):be(ye,null,e)}function Qe(e){return e==null||typeof e=="boolean"?be(ye):B(e)?be(Re,null,e.slice()):_n(e)?_t(e):be(as,null,String(e))}function _t(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:bt(e)}function _r(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(B(t))n=16;else if(typeof t=="object")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),_r(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!Do(t)?t._ctx=ge:r===3&&ge&&(ge.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else W(t)?(t={default:t,_ctx:ge},n=32):(t=String(t),s&64?(n=16,t=[rf(t)]):n=8);e.children=t,e.shapeFlag|=n}function of(...e){const t={};for(let n=0;nve||ge;let Kn,Ks;{const e=es(),t=(n,s)=>{let r;return(r=e[n])||(r=e[n]=[]),r.push(s),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Kn=t("__VUE_INSTANCE_SETTERS__",n=>ve=n),Ks=t("__VUE_SSR_SETTERS__",n=>yn=n)}const Cn=e=>{const t=ve;return Kn(e),e.scope.on(),()=>{e.scope.off(),Kn(t)}},Kr=()=>{ve&&ve.scope.off(),Kn(null)};function $o(e){return e.vnode.shapeFlag&4}let yn=!1;function uf(e,t=!1,n=!1){t&&Ks(t);const{props:s,children:r}=e.vnode,i=$o(e);Gc(e,s,i,t),Jc(e,r,n||t);const o=i?af(e,t):void 0;return t&&Ks(!1),o}function af(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,Oc);const{setup:s}=n;if(s){ot();const r=e.setupContext=s.length>1?df(e):null,i=Cn(e),o=Sn(s,e,0,[e.props,r]),l=Pi(o);if(lt(),i(),(l||e.sp)&&!Kt(e)&&bo(e),l){if(o.then(Kr,Kr),t)return o.then(c=>{Gr(e,c)}).catch(c=>{os(c,e,0)});e.asyncDep=o}else Gr(e,o)}else qo(e)}function Gr(e,t,n){W(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:re(t)&&(e.setupState=no(t)),qo(e)}function qo(e,t,n){const s=e.type;e.render||(e.render=s.render||Ye);{const r=Cn(e);ot();try{Pc(e)}finally{lt(),r()}}}const hf={get(e,t){return _e(e,"get",""),e[t]}};function df(e){const t=n=>{e.exposed=n||{}};return{attrs:new Proxy(e.attrs,hf),slots:e.slots,emit:e.emit,expose:t}}function ds(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(no(lr(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in cn)return cn[n](e)},has(t,n){return n in t||n in cn}})):e.proxy}function pf(e,t=!0){return W(e)?e.displayName||e.name:e.name||t&&e.__name}function gf(e){return W(e)&&"__vccOpts"in e}const Le=(e,t)=>ic(e,t,yn);function yr(e,t,n){try{kn(-1);const s=arguments.length;return s===2?re(t)&&!B(t)?_n(t)?be(e,null,[t]):be(e,t):be(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&_n(n)&&(n=[n]),be(e,t,n))}finally{kn(1)}}const mf="3.5.26";/** -* @vue/runtime-dom v3.5.26 -* (c) 2018-present Yuxi (Evan) You and Vue contributors -* @license MIT -**/let Gs;const Wr=typeof window<"u"&&window.trustedTypes;if(Wr)try{Gs=Wr.createPolicy("vue",{createHTML:e=>e})}catch{}const Jo=Gs?e=>Gs.createHTML(e):e=>e,_f="http://www.w3.org/2000/svg",yf="http://www.w3.org/1998/Math/MathML",tt=typeof document<"u"?document:null,$r=tt&&tt.createElement("template"),vf={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t==="svg"?tt.createElementNS(_f,e):t==="mathml"?tt.createElementNS(yf,e):n?tt.createElement(e,{is:n}):tt.createElement(e);return e==="select"&&s&&s.multiple!=null&&r.setAttribute("multiple",s.multiple),r},createText:e=>tt.createTextNode(e),createComment:e=>tt.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>tt.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,n,s,r,i){const o=n?n.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===i||!(r=r.nextSibling)););else{$r.innerHTML=Jo(s==="svg"?`${e}`:s==="mathml"?`${e}`:e);const l=$r.content;if(s==="svg"||s==="mathml"){const c=l.firstChild;for(;c.firstChild;)l.appendChild(c.firstChild);l.removeChild(c)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}},at="transition",Yt="animation",$t=Symbol("_vtc"),zo={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},Qo=pe({},go,zo),bf=e=>(e.displayName="Transition",e.props=Qo,e),ba=bf((e,{slots:t})=>yr(yc,Yo(e),t)),xt=(e,t=[])=>{B(e)?e.forEach(n=>n(...t)):e&&e(...t)},qr=e=>e?B(e)?e.some(t=>t.length>1):e.length>1:!1;function Yo(e){const t={};for(const O in e)O in zo||(t[O]=e[O]);if(e.css===!1)return t;const{name:n="v",type:s,duration:r,enterFromClass:i=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:l=`${n}-enter-to`,appearFromClass:c=i,appearActiveClass:u=o,appearToClass:f=l,leaveFromClass:h=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:m=`${n}-leave-to`}=e,S=Ef(r),C=S&&S[0],L=S&&S[1],{onBeforeEnter:N,onEnter:P,onEnterCancelled:F,onLeave:M,onLeaveCancelled:j,onBeforeAppear:J=N,onAppear:q=P,onAppearCancelled:U=F}=t,A=(O,Q,he,Ee)=>{O._enterCancelled=Ee,dt(O,Q?f:l),dt(O,Q?u:o),he&&he()},k=(O,Q)=>{O._isLeaving=!1,dt(O,h),dt(O,m),dt(O,p),Q&&Q()},z=O=>(Q,he)=>{const Ee=O?q:P,ie=()=>A(Q,O,he);xt(Ee,[Q,ie]),Jr(()=>{dt(Q,O?c:i),Je(Q,O?f:l),qr(Ee)||zr(Q,s,C,ie)})};return pe(t,{onBeforeEnter(O){xt(N,[O]),Je(O,i),Je(O,o)},onBeforeAppear(O){xt(J,[O]),Je(O,c),Je(O,u)},onEnter:z(!1),onAppear:z(!0),onLeave(O,Q){O._isLeaving=!0;const he=()=>k(O,Q);Je(O,h),O._enterCancelled?(Je(O,p),Ws(O)):(Ws(O),Je(O,p)),Jr(()=>{O._isLeaving&&(dt(O,h),Je(O,m),qr(M)||zr(O,s,L,he))}),xt(M,[O,he])},onEnterCancelled(O){A(O,!1,void 0,!0),xt(F,[O])},onAppearCancelled(O){A(O,!0,void 0,!0),xt(U,[O])},onLeaveCancelled(O){k(O),xt(j,[O])}})}function Ef(e){if(e==null)return null;if(re(e))return[As(e.enter),As(e.leave)];{const t=As(e);return[t,t]}}function As(e){return Sl(e)}function Je(e,t){t.split(/\s+/).forEach(n=>n&&e.classList.add(n)),(e[$t]||(e[$t]=new Set)).add(t)}function dt(e,t){t.split(/\s+/).forEach(s=>s&&e.classList.remove(s));const n=e[$t];n&&(n.delete(t),n.size||(e[$t]=void 0))}function Jr(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let Sf=0;function zr(e,t,n,s){const r=e._endId=++Sf,i=()=>{r===e._endId&&s()};if(n!=null)return setTimeout(i,n);const{type:o,timeout:l,propCount:c}=Xo(e,t);if(!o)return s();const u=o+"end";let f=0;const h=()=>{e.removeEventListener(u,p),i()},p=m=>{m.target===e&&++f>=c&&h()};setTimeout(()=>{f(n[S]||"").split(", "),r=s(`${at}Delay`),i=s(`${at}Duration`),o=Qr(r,i),l=s(`${Yt}Delay`),c=s(`${Yt}Duration`),u=Qr(l,c);let f=null,h=0,p=0;t===at?o>0&&(f=at,h=o,p=i.length):t===Yt?u>0&&(f=Yt,h=u,p=c.length):(h=Math.max(o,u),f=h>0?o>u?at:Yt:null,p=f?f===at?i.length:c.length:0);const m=f===at&&/\b(?:transform|all)(?:,|$)/.test(s(`${at}Property`).toString());return{type:f,timeout:h,propCount:p,hasTransform:m}}function Qr(e,t){for(;e.lengthYr(n)+Yr(e[s])))}function Yr(e){return e==="auto"?0:Number(e.slice(0,-1).replace(",","."))*1e3}function Ws(e){return(e?e.ownerDocument:document).body.offsetHeight}function Cf(e,t,n){const s=e[$t];s&&(t=(t?[t,...s]:[...s]).join(" ")),t==null?e.removeAttribute("class"):n?e.setAttribute("class",t):e.className=t}const Gn=Symbol("_vod"),Zo=Symbol("_vsh"),Ea={name:"show",beforeMount(e,{value:t},{transition:n}){e[Gn]=e.style.display==="none"?"":e.style.display,n&&t?n.beforeEnter(e):Xt(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),Xt(e,!0),s.enter(e)):s.leave(e,()=>{Xt(e,!1)}):Xt(e,t))},beforeUnmount(e,{value:t}){Xt(e,t)}};function Xt(e,t){e.style.display=t?e[Gn]:"none",e[Zo]=!t}const Af=Symbol(""),xf=/(?:^|;)\s*display\s*:/;function Rf(e,t,n){const s=e.style,r=fe(n);let i=!1;if(n&&!r){if(t)if(fe(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();n[l]==null&&Ln(s,l,"")}else for(const o in t)n[o]==null&&Ln(s,o,"");for(const o in n)o==="display"&&(i=!0),Ln(s,o,n[o])}else if(r){if(t!==n){const o=s[Af];o&&(n+=";"+o),s.cssText=n,i=xf.test(n)}}else t&&e.removeAttribute("style");Gn in e&&(e[Gn]=i?s.display:"",e[Zo]&&(s.display="none"))}const Xr=/\s*!important$/;function Ln(e,t,n){if(B(n))n.forEach(s=>Ln(e,t,s));else if(n==null&&(n=""),t.startsWith("--"))e.setProperty(t,n);else{const s=wf(e,t);Xr.test(n)?e.setProperty(Et(s),n.replace(Xr,""),"important"):e[s]=n}}const Zr=["Webkit","Moz","ms"],xs={};function wf(e,t){const n=xs[t];if(n)return n;let s=Ve(t);if(s!=="filter"&&s in e)return xs[t]=s;s=Xn(s);for(let r=0;rRs||(If.then(()=>Rs=0),Rs=Date.now());function Mf(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;Ue(Df(s,n.value),t,5,[s])};return n.value=e,n.attached=Nf(),n}function Df(e,t){if(B(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const ii=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,Lf=(e,t,n,s,r,i)=>{const o=r==="svg";t==="class"?Cf(e,s,o):t==="style"?Rf(e,n,s):Jn(t)?Zs(t)||Of(e,t,n,s,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):Ff(e,t,s,o))?(ni(e,t,s),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&ti(e,t,s,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!fe(s))?ni(e,Ve(t),s,i,t):(t==="true-value"?e._trueValue=s:t==="false-value"&&(e._falseValue=s),ti(e,t,s,o))};function Ff(e,t,n,s){if(s)return!!(t==="innerHTML"||t==="textContent"||t in e&&ii(t)&&W(n));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return ii(t)&&fe(n)?!1:t in e}const el=new WeakMap,tl=new WeakMap,Wn=Symbol("_moveCb"),oi=Symbol("_enterCb"),Vf=e=>(delete e.props.mode,e),Hf=Vf({name:"TransitionGroup",props:pe({},Qo,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=hs(),s=po();let r,i;return Co(()=>{if(!r.length)return;const o=e.moveClass||`${e.name||"v"}-move`;if(!kf(r[0].el,n.vnode.el,o)){r=[];return}r.forEach(Bf),r.forEach(jf);const l=r.filter(Uf);Ws(n.vnode.el),l.forEach(c=>{const u=c.el,f=u.style;Je(u,o),f.transform=f.webkitTransform=f.transitionDuration="";const h=u[Wn]=p=>{p&&p.target!==u||(!p||p.propertyName.endsWith("transform"))&&(u.removeEventListener("transitionend",h),u[Wn]=null,dt(u,o))};u.addEventListener("transitionend",h)}),r=[]}),()=>{const o=Z(e),l=Yo(o);let c=o.tag||Re;if(r=[],i)for(let u=0;u{l.split(/\s+/).forEach(c=>c&&s.classList.remove(c))}),n.split(/\s+/).forEach(l=>l&&s.classList.add(l)),s.style.display="none";const i=t.nodeType===1?t:t.parentNode;i.appendChild(s);const{hasTransform:o}=Xo(s);return i.removeChild(s),o}const $n=e=>{const t=e.props["onUpdate:modelValue"]||!1;return B(t)?n=>Pn(t,n):t};function Kf(e){e.target.composing=!0}function li(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const Gt=Symbol("_assign");function ci(e,t,n){return t&&(e=e.trim()),n&&(e=Zn(e)),e}const Ca={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e[Gt]=$n(r);const i=s||r.props&&r.props.type==="number";Tt(e,t?"change":"input",o=>{o.target.composing||e[Gt](ci(e.value,n,i))}),(n||i)&&Tt(e,"change",()=>{e.value=ci(e.value,n,i)}),t||(Tt(e,"compositionstart",Kf),Tt(e,"compositionend",li),Tt(e,"change",li))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:n,modifiers:{lazy:s,trim:r,number:i}},o){if(e[Gt]=$n(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?Zn(e.value):e.value,c=t??"";l!==c&&(document.activeElement===e&&e.type!=="range"&&(s&&t===n||r&&e.value.trim()===c)||(e.value=c))}},Aa={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const r=zn(t);Tt(e,"change",()=>{const i=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>n?Zn(qn(o)):qn(o));e[Gt](e.multiple?r?new Set(i):i:i[0]),e._assigning=!0,ls(()=>{e._assigning=!1})}),e[Gt]=$n(s)},mounted(e,{value:t}){fi(e,t)},beforeUpdate(e,t,n){e[Gt]=$n(n)},updated(e,{value:t}){e._assigning||fi(e,t)}};function fi(e,t){const n=e.multiple,s=B(t);if(!(n&&!s&&!zn(t))){for(let r=0,i=e.options.length;rString(u)===String(l)):o.selected=Pl(t,l)>-1}else o.selected=t.has(l);else if(ss(qn(o),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function qn(e){return"_value"in e?e._value:e.value}const Gf=["ctrl","shift","alt","meta"],Wf={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>"button"in e&&e.button!==0,middle:e=>"button"in e&&e.button!==1,right:e=>"button"in e&&e.button!==2,exact:(e,t)=>Gf.some(n=>e[`${n}Key`]&&!t.includes(n))},xa=(e,t)=>{const n=e._withMods||(e._withMods={}),s=t.join(".");return n[s]||(n[s]=(r,...i)=>{for(let o=0;o{const n=e._withKeys||(e._withKeys={}),s=t.join(".");return n[s]||(n[s]=r=>{if(!("key"in r))return;const i=Et(r.key);if(t.some(o=>o===i||$f[o]===i))return e(r)})},qf=pe({patchProp:Lf},vf);let ui;function Jf(){return ui||(ui=Qc(qf))}const wa=(...e)=>{const t=Jf().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=Qf(s);if(!r)return;const i=t._component;!W(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=n(r,!1,zf(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t};function zf(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Qf(e){return fe(e)?document.querySelector(e):e}/*! - * pinia v2.3.1 - * (c) 2025 Eduardo San Martin Morote - * @license MIT - */let nl;const ps=e=>nl=e,sl=Symbol();function $s(e){return e&&typeof e=="object"&&Object.prototype.toString.call(e)==="[object Object]"&&typeof e.toJSON!="function"}var un;(function(e){e.direct="direct",e.patchObject="patch object",e.patchFunction="patch function"})(un||(un={}));function Ta(){const e=Hi(!0),t=e.run(()=>cr({}));let n=[],s=[];const r=lr({install(i){ps(r),r._a=i,i.provide(sl,r),i.config.globalProperties.$pinia=r,s.forEach(o=>n.push(o)),s=[]},use(i){return this._a?n.push(i):s.push(i),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return r}const rl=()=>{};function ai(e,t,n,s=rl){e.push(t);const r=()=>{const i=e.indexOf(t);i>-1&&(e.splice(i,1),s())};return!n&&Bi()&&Nl(r),r}function Vt(e,...t){e.slice().forEach(n=>{n(...t)})}const Yf=e=>e(),hi=Symbol(),ws=Symbol();function qs(e,t){e instanceof Map&&t instanceof Map?t.forEach((n,s)=>e.set(s,n)):e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const s=t[n],r=e[n];$s(r)&&$s(s)&&e.hasOwnProperty(n)&&!ae(s)&&!it(s)?e[n]=qs(r,s):e[n]=s}return e}const Xf=Symbol();function Zf(e){return!$s(e)||!e.hasOwnProperty(Xf)}const{assign:pt}=Object;function eu(e){return!!(ae(e)&&e.effect)}function tu(e,t,n,s){const{state:r,actions:i,getters:o}=t,l=n.state.value[e];let c;function u(){l||(n.state.value[e]=r?r():{});const f=tc(n.state.value[e]);return pt(f,i,Object.keys(o||{}).reduce((h,p)=>(h[p]=lr(Le(()=>{ps(n);const m=n._s.get(e);return o[p].call(m,m)})),h),{}))}return c=il(e,u,t,n,s,!0),c}function il(e,t,n={},s,r,i){let o;const l=pt({actions:{}},n),c={deep:!0};let u,f,h=[],p=[],m;const S=s.state.value[e];!i&&!S&&(s.state.value[e]={}),cr({});let C;function L(U){let A;u=f=!1,typeof U=="function"?(U(s.state.value[e]),A={type:un.patchFunction,storeId:e,events:m}):(qs(s.state.value[e],U),A={type:un.patchObject,payload:U,storeId:e,events:m});const k=C=Symbol();ls().then(()=>{C===k&&(u=!0)}),f=!0,Vt(h,A,s.state.value[e])}const N=i?function(){const{state:A}=n,k=A?A():{};this.$patch(z=>{pt(z,k)})}:rl;function P(){o.stop(),h=[],p=[],s._s.delete(e)}const F=(U,A="")=>{if(hi in U)return U[ws]=A,U;const k=function(){ps(s);const z=Array.from(arguments),O=[],Q=[];function he($){O.push($)}function Ee($){Q.push($)}Vt(p,{args:z,name:k[ws],store:j,after:he,onError:Ee});let ie;try{ie=U.apply(this&&this.$id===e?this:j,z)}catch($){throw Vt(Q,$),$}return ie instanceof Promise?ie.then($=>(Vt(O,$),$)).catch($=>(Vt(Q,$),Promise.reject($))):(Vt(O,ie),ie)};return k[hi]=!0,k[ws]=A,k},M={_p:s,$id:e,$onAction:ai.bind(null,p),$patch:L,$reset:N,$subscribe(U,A={}){const k=ai(h,U,A.detached,()=>z()),z=o.run(()=>rn(()=>s.state.value[e],O=>{(A.flush==="sync"?f:u)&&U({storeId:e,type:un.direct,events:m},O)},pt({},c,A)));return k},$dispose:P},j=En(M);s._s.set(e,j);const q=(s._a&&s._a.runWithContext||Yf)(()=>s._e.run(()=>(o=Hi()).run(()=>t({action:F}))));for(const U in q){const A=q[U];if(ae(A)&&!eu(A)||it(A))i||(S&&Zf(A)&&(ae(A)?A.value=S[U]:qs(A,S[U])),s.state.value[e][U]=A);else if(typeof A=="function"){const k=F(A,U);q[U]=k,l.actions[U]=A}}return pt(j,q),pt(Z(j),q),Object.defineProperty(j,"$state",{get:()=>s.state.value[e],set:U=>{L(A=>{pt(A,U)})}}),s._p.forEach(U=>{pt(j,o.run(()=>U({store:j,app:s._a,pinia:s,options:l})))}),S&&i&&n.hydrate&&n.hydrate(j.$state,S),u=!0,f=!0,j}/*! #__NO_SIDE_EFFECTS__ */function Oa(e,t,n){let s,r;const i=typeof t=="function";typeof e=="string"?(s=e,r=i?n:t):(r=e,s=e.id);function o(l,c){const u=hc();return l=l||(u?Fe(sl,null):null),l&&ps(l),l=nl,l._s.has(s)||(i?il(s,t,r,l):tu(s,r,l)),l._s.get(s)}return o.$id=s,o}/*! - * vue-router v4.6.4 - * (c) 2025 Eduardo San Martin Morote - * @license MIT - */const Bt=typeof document<"u";function ol(e){return typeof e=="object"||"displayName"in e||"props"in e||"__vccOpts"in e}function nu(e){return e.__esModule||e[Symbol.toStringTag]==="Module"||e.default&&ol(e.default)}const te=Object.assign;function Ts(e,t){const n={};for(const s in t){const r=t[s];n[s]=ke(r)?r.map(e):e(r)}return n}const an=()=>{},ke=Array.isArray;function di(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}const ll=/#/g,su=/&/g,ru=/\//g,iu=/=/g,ou=/\?/g,cl=/\+/g,lu=/%5B/g,cu=/%5D/g,fl=/%5E/g,fu=/%60/g,ul=/%7B/g,uu=/%7C/g,al=/%7D/g,au=/%20/g;function vr(e){return e==null?"":encodeURI(""+e).replace(uu,"|").replace(lu,"[").replace(cu,"]")}function hu(e){return vr(e).replace(ul,"{").replace(al,"}").replace(fl,"^")}function Js(e){return vr(e).replace(cl,"%2B").replace(au,"+").replace(ll,"%23").replace(su,"%26").replace(fu,"`").replace(ul,"{").replace(al,"}").replace(fl,"^")}function du(e){return Js(e).replace(iu,"%3D")}function pu(e){return vr(e).replace(ll,"%23").replace(ou,"%3F")}function gu(e){return pu(e).replace(ru,"%2F")}function vn(e){if(e==null)return null;try{return decodeURIComponent(""+e)}catch{}return""+e}const mu=/\/$/,_u=e=>e.replace(mu,"");function Os(e,t,n="/"){let s,r={},i="",o="";const l=t.indexOf("#");let c=t.indexOf("?");return c=l>=0&&c>l?-1:c,c>=0&&(s=t.slice(0,c),i=t.slice(c,l>0?l:t.length),r=e(i.slice(1))),l>=0&&(s=s||t.slice(0,l),o=t.slice(l,t.length)),s=Eu(s??t,n),{fullPath:s+i+o,path:s,query:r,hash:vn(o)}}function yu(e,t){const n=t.query?e(t.query):"";return t.path+(n&&"?")+n+(t.hash||"")}function pi(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||"/"}function vu(e,t,n){const s=t.matched.length-1,r=n.matched.length-1;return s>-1&&s===r&&qt(t.matched[s],n.matched[r])&&hl(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function qt(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function hl(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n in e)if(!bu(e[n],t[n]))return!1;return!0}function bu(e,t){return ke(e)?gi(e,t):ke(t)?gi(t,e):(e==null?void 0:e.valueOf())===(t==null?void 0:t.valueOf())}function gi(e,t){return ke(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function Eu(e,t){if(e.startsWith("/"))return e;if(!e)return t;const n=t.split("/"),s=e.split("/"),r=s[s.length-1];(r===".."||r===".")&&s.push("");let i=n.length-1,o,l;for(o=0;o1&&i--;else break;return n.slice(0,i).join("/")+"/"+s.slice(o).join("/")}const ht={path:"/",name:void 0,params:{},query:{},hash:"",fullPath:"/",matched:[],meta:{},redirectedFrom:void 0};let zs=function(e){return e.pop="pop",e.push="push",e}({}),Ps=function(e){return e.back="back",e.forward="forward",e.unknown="",e}({});function Su(e){if(!e)if(Bt){const t=document.querySelector("base");e=t&&t.getAttribute("href")||"/",e=e.replace(/^\w+:\/\/[^\/]+/,"")}else e="/";return e[0]!=="/"&&e[0]!=="#"&&(e="/"+e),_u(e)}const Cu=/^[^#]+#/;function Au(e,t){return e.replace(Cu,"#")+t}function xu(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const gs=()=>({left:window.scrollX,top:window.scrollY});function Ru(e){let t;if("el"in e){const n=e.el,s=typeof n=="string"&&n.startsWith("#"),r=typeof n=="string"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!r)return;t=xu(r,e)}else t=e;"scrollBehavior"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.scrollX,t.top!=null?t.top:window.scrollY)}function mi(e,t){return(history.state?history.state.position-t:-1)+e}const Qs=new Map;function wu(e,t){Qs.set(e,t)}function Tu(e){const t=Qs.get(e);return Qs.delete(e),t}function Ou(e){return typeof e=="string"||e&&typeof e=="object"}function dl(e){return typeof e=="string"||typeof e=="symbol"}let ue=function(e){return e[e.MATCHER_NOT_FOUND=1]="MATCHER_NOT_FOUND",e[e.NAVIGATION_GUARD_REDIRECT=2]="NAVIGATION_GUARD_REDIRECT",e[e.NAVIGATION_ABORTED=4]="NAVIGATION_ABORTED",e[e.NAVIGATION_CANCELLED=8]="NAVIGATION_CANCELLED",e[e.NAVIGATION_DUPLICATED=16]="NAVIGATION_DUPLICATED",e}({});const pl=Symbol("");ue.MATCHER_NOT_FOUND+"",ue.NAVIGATION_GUARD_REDIRECT+"",ue.NAVIGATION_ABORTED+"",ue.NAVIGATION_CANCELLED+"",ue.NAVIGATION_DUPLICATED+"";function Jt(e,t){return te(new Error,{type:e,[pl]:!0},t)}function et(e,t){return e instanceof Error&&pl in e&&(t==null||!!(e.type&t))}const Pu=["params","query","hash"];function Iu(e){if(typeof e=="string")return e;if(e.path!=null)return e.path;const t={};for(const n of Pu)n in e&&(t[n]=e[n]);return JSON.stringify(t,null,2)}function Nu(e){const t={};if(e===""||e==="?")return t;const n=(e[0]==="?"?e.slice(1):e).split("&");for(let s=0;sr&&Js(r)):[s&&Js(s)]).forEach(r=>{r!==void 0&&(t+=(t.length?"&":"")+n,r!=null&&(t+="="+r))})}return t}function Mu(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=ke(s)?s.map(r=>r==null?null:""+r):s==null?s:""+s)}return t}const Du=Symbol(""),yi=Symbol(""),ms=Symbol(""),br=Symbol(""),Ys=Symbol("");function Zt(){let e=[];function t(s){return e.push(s),()=>{const r=e.indexOf(s);r>-1&&e.splice(r,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function yt(e,t,n,s,r,i=o=>o()){const o=s&&(s.enterCallbacks[r]=s.enterCallbacks[r]||[]);return()=>new Promise((l,c)=>{const u=p=>{p===!1?c(Jt(ue.NAVIGATION_ABORTED,{from:n,to:t})):p instanceof Error?c(p):Ou(p)?c(Jt(ue.NAVIGATION_GUARD_REDIRECT,{from:t,to:p})):(o&&s.enterCallbacks[r]===o&&typeof p=="function"&&o.push(p),l())},f=i(()=>e.call(s&&s.instances[r],t,n,u));let h=Promise.resolve(f);e.length<3&&(h=h.then(u)),h.catch(p=>c(p))})}function Is(e,t,n,s,r=i=>i()){const i=[];for(const o of e)for(const l in o.components){let c=o.components[l];if(!(t!=="beforeRouteEnter"&&!o.instances[l]))if(ol(c)){const u=(c.__vccOpts||c)[t];u&&i.push(yt(u,n,s,o,l,r))}else{let u=c();i.push(()=>u.then(f=>{if(!f)throw new Error(`Couldn't resolve component "${l}" at "${o.path}"`);const h=nu(f)?f.default:f;o.mods[l]=f,o.components[l]=h;const p=(h.__vccOpts||h)[t];return p&&yt(p,n,s,o,l,r)()}))}}return i}function Lu(e,t){const n=[],s=[],r=[],i=Math.max(t.matched.length,e.matched.length);for(let o=0;oqt(u,l))?s.push(l):n.push(l));const c=e.matched[o];c&&(t.matched.find(u=>qt(u,c))||r.push(c))}return[n,s,r]}/*! - * vue-router v4.6.4 - * (c) 2025 Eduardo San Martin Morote - * @license MIT - */let Fu=()=>location.protocol+"//"+location.host;function gl(e,t){const{pathname:n,search:s,hash:r}=t,i=e.indexOf("#");if(i>-1){let o=r.includes(e.slice(i))?e.slice(i).length:1,l=r.slice(o);return l[0]!=="/"&&(l="/"+l),pi(l,"")}return pi(n,e)+s+r}function Vu(e,t,n,s){let r=[],i=[],o=null;const l=({state:p})=>{const m=gl(e,location),S=n.value,C=t.value;let L=0;if(p){if(n.value=m,t.value=p,o&&o===S){o=null;return}L=C?p.position-C.position:0}else s(m);r.forEach(N=>{N(n.value,S,{delta:L,type:zs.pop,direction:L?L>0?Ps.forward:Ps.back:Ps.unknown})})};function c(){o=n.value}function u(p){r.push(p);const m=()=>{const S=r.indexOf(p);S>-1&&r.splice(S,1)};return i.push(m),m}function f(){if(document.visibilityState==="hidden"){const{history:p}=window;if(!p.state)return;p.replaceState(te({},p.state,{scroll:gs()}),"")}}function h(){for(const p of i)p();i=[],window.removeEventListener("popstate",l),window.removeEventListener("pagehide",f),document.removeEventListener("visibilitychange",f)}return window.addEventListener("popstate",l),window.addEventListener("pagehide",f),document.addEventListener("visibilitychange",f),{pauseListeners:c,listen:u,destroy:h}}function vi(e,t,n,s=!1,r=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:r?gs():null}}function Hu(e){const{history:t,location:n}=window,s={value:gl(e,n)},r={value:t.state};r.value||i(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function i(c,u,f){const h=e.indexOf("#"),p=h>-1?(n.host&&document.querySelector("base")?e:e.slice(h))+c:Fu()+e+c;try{t[f?"replaceState":"pushState"](u,"",p),r.value=u}catch(m){console.error(m),n[f?"replace":"assign"](p)}}function o(c,u){i(c,te({},t.state,vi(r.value.back,c,r.value.forward,!0),u,{position:r.value.position}),!0),s.value=c}function l(c,u){const f=te({},r.value,t.state,{forward:c,scroll:gs()});i(f.current,f,!0),i(c,te({},vi(s.value,c,null),{position:f.position+1},u),!1),s.value=c}return{location:s,state:r,push:l,replace:o}}function Pa(e){e=Su(e);const t=Hu(e),n=Vu(e,t.state,t.location,t.replace);function s(i,o=!0){o||n.pauseListeners(),history.go(i)}const r=te({location:"",base:e,go:s,createHref:Au.bind(null,e)},t,n);return Object.defineProperty(r,"location",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,"state",{enumerable:!0,get:()=>t.state.value}),r}let Ot=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.Group=2]="Group",e}({});var de=function(e){return e[e.Static=0]="Static",e[e.Param=1]="Param",e[e.ParamRegExp=2]="ParamRegExp",e[e.ParamRegExpEnd=3]="ParamRegExpEnd",e[e.EscapeNext=4]="EscapeNext",e}(de||{});const Bu={type:Ot.Static,value:""},ju=/[a-zA-Z0-9_]/;function Uu(e){if(!e)return[[]];if(e==="/")return[[Bu]];if(!e.startsWith("/"))throw new Error(`Invalid path "${e}"`);function t(m){throw new Error(`ERR (${n})/"${u}": ${m}`)}let n=de.Static,s=n;const r=[];let i;function o(){i&&r.push(i),i=[]}let l=0,c,u="",f="";function h(){u&&(n===de.Static?i.push({type:Ot.Static,value:u}):n===de.Param||n===de.ParamRegExp||n===de.ParamRegExpEnd?(i.length>1&&(c==="*"||c==="+")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),i.push({type:Ot.Param,value:u,regexp:f,repeatable:c==="*"||c==="+",optional:c==="*"||c==="?"})):t("Invalid state to consume buffer"),u="")}function p(){u+=c}for(;lt.length?t.length===1&&t[0]===Ae.Static+Ae.Segment?1:-1:0}function ml(e,t){let n=0;const s=e.score,r=t.score;for(;n0&&t[t.length-1]<0}const $u={strict:!1,end:!0,sensitive:!1};function qu(e,t,n){const s=Gu(Uu(e.path),n),r=te(s,{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function Ju(e,t){const n=[],s=new Map;t=di($u,t);function r(h){return s.get(h)}function i(h,p,m){const S=!m,C=Ci(h);C.aliasOf=m&&m.record;const L=di(t,h),N=[C];if("alias"in h){const M=typeof h.alias=="string"?[h.alias]:h.alias;for(const j of M)N.push(Ci(te({},C,{components:m?m.record.components:C.components,path:j,aliasOf:m?m.record:C})))}let P,F;for(const M of N){const{path:j}=M;if(p&&j[0]!=="/"){const J=p.record.path,q=J[J.length-1]==="/"?"":"/";M.path=p.record.path+(j&&q+j)}if(P=qu(M,p,L),m?m.alias.push(P):(F=F||P,F!==P&&F.alias.push(P),S&&h.name&&!Ai(P)&&o(h.name)),_l(P)&&c(P),C.children){const J=C.children;for(let q=0;q{o(F)}:an}function o(h){if(dl(h)){const p=s.get(h);p&&(s.delete(h),n.splice(n.indexOf(p),1),p.children.forEach(o),p.alias.forEach(o))}else{const p=n.indexOf(h);p>-1&&(n.splice(p,1),h.record.name&&s.delete(h.record.name),h.children.forEach(o),h.alias.forEach(o))}}function l(){return n}function c(h){const p=Yu(h,n);n.splice(p,0,h),h.record.name&&!Ai(h)&&s.set(h.record.name,h)}function u(h,p){let m,S={},C,L;if("name"in h&&h.name){if(m=s.get(h.name),!m)throw Jt(ue.MATCHER_NOT_FOUND,{location:h});L=m.record.name,S=te(Si(p.params,m.keys.filter(F=>!F.optional).concat(m.parent?m.parent.keys.filter(F=>F.optional):[]).map(F=>F.name)),h.params&&Si(h.params,m.keys.map(F=>F.name))),C=m.stringify(S)}else if(h.path!=null)C=h.path,m=n.find(F=>F.re.test(C)),m&&(S=m.parse(C),L=m.record.name);else{if(m=p.name?s.get(p.name):n.find(F=>F.re.test(p.path)),!m)throw Jt(ue.MATCHER_NOT_FOUND,{location:h,currentLocation:p});L=m.record.name,S=te({},p.params,h.params),C=m.stringify(S)}const N=[];let P=m;for(;P;)N.unshift(P.record),P=P.parent;return{name:L,path:C,params:S,matched:N,meta:Qu(N)}}e.forEach(h=>i(h));function f(){n.length=0,s.clear()}return{addRoute:i,resolve:u,removeRoute:o,clearRoutes:f,getRoutes:l,getRecordMatcher:r}}function Si(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function Ci(e){const t={path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:e.aliasOf,beforeEnter:e.beforeEnter,props:zu(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:"components"in e?e.components||null:e.component&&{default:e.component}};return Object.defineProperty(t,"mods",{value:{}}),t}function zu(e){const t={},n=e.props||!1;if("component"in e)t.default=n;else for(const s in e.components)t[s]=typeof n=="object"?n[s]:n;return t}function Ai(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function Qu(e){return e.reduce((t,n)=>te(t,n.meta),{})}function Yu(e,t){let n=0,s=t.length;for(;n!==s;){const i=n+s>>1;ml(e,t[i])<0?s=i:n=i+1}const r=Xu(e);return r&&(s=t.lastIndexOf(r,s-1)),s}function Xu(e){let t=e;for(;t=t.parent;)if(_l(t)&&ml(e,t)===0)return t}function _l({record:e}){return!!(e.name||e.components&&Object.keys(e.components).length||e.redirect)}function xi(e){const t=Fe(ms),n=Fe(br),s=Le(()=>{const c=It(e.to);return t.resolve(c)}),r=Le(()=>{const{matched:c}=s.value,{length:u}=c,f=c[u-1],h=n.matched;if(!f||!h.length)return-1;const p=h.findIndex(qt.bind(null,f));if(p>-1)return p;const m=Ri(c[u-2]);return u>1&&Ri(f)===m&&h[h.length-1].path!==m?h.findIndex(qt.bind(null,c[u-2])):p}),i=Le(()=>r.value>-1&&sa(n.params,s.value.params)),o=Le(()=>r.value>-1&&r.value===n.matched.length-1&&hl(n.params,s.value.params));function l(c={}){if(na(c)){const u=t[It(e.replace)?"replace":"push"](It(e.to)).catch(an);return e.viewTransition&&typeof document<"u"&&"startViewTransition"in document&&document.startViewTransition(()=>u),u}return Promise.resolve()}return{route:s,href:Le(()=>s.value.href),isActive:i,isExactActive:o,navigate:l}}function Zu(e){return e.length===1?e[0]:e}const ea=vo({name:"RouterLink",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:"page"},viewTransition:Boolean},useLink:xi,setup(e,{slots:t}){const n=En(xi(e)),{options:s}=Fe(ms),r=Le(()=>({[wi(e.activeClass,s.linkActiveClass,"router-link-active")]:n.isActive,[wi(e.exactActiveClass,s.linkExactActiveClass,"router-link-exact-active")]:n.isExactActive}));return()=>{const i=t.default&&Zu(t.default(n));return e.custom?i:yr("a",{"aria-current":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},i)}}}),ta=ea;function na(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute("target");if(/\b_blank\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function sa(e,t){for(const n in t){const s=t[n],r=e[n];if(typeof s=="string"){if(s!==r)return!1}else if(!ke(r)||r.length!==s.length||s.some((i,o)=>i.valueOf()!==r[o].valueOf()))return!1}return!0}function Ri(e){return e?e.aliasOf?e.aliasOf.path:e.path:""}const wi=(e,t,n)=>e??t??n,ra=vo({name:"RouterView",inheritAttrs:!1,props:{name:{type:String,default:"default"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=Fe(Ys),r=Le(()=>e.route||s.value),i=Fe(yi,0),o=Le(()=>{let u=It(i);const{matched:f}=r.value;let h;for(;(h=f[u])&&!h.components;)u++;return u}),l=Le(()=>r.value.matched[o.value]);In(yi,Le(()=>o.value+1)),In(Du,l),In(Ys,r);const c=cr();return rn(()=>[c.value,l.value,e.name],([u,f,h],[p,m,S])=>{f&&(f.instances[h]=u,m&&m!==f&&u&&u===p&&(f.leaveGuards.size||(f.leaveGuards=m.leaveGuards),f.updateGuards.size||(f.updateGuards=m.updateGuards))),u&&f&&(!m||!qt(f,m)||!p)&&(f.enterCallbacks[h]||[]).forEach(C=>C(u))},{flush:"post"}),()=>{const u=r.value,f=e.name,h=l.value,p=h&&h.components[f];if(!p)return Ti(n.default,{Component:p,route:u});const m=h.props[f],S=m?m===!0?u.params:typeof m=="function"?m(u):m:null,L=yr(p,te({},S,t,{onVnodeUnmounted:N=>{N.component.isUnmounted&&(h.instances[f]=null)},ref:c}));return Ti(n.default,{Component:L,route:u})||L}}});function Ti(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const ia=ra;function Ia(e){const t=Ju(e.routes,e),n=e.parseQuery||Nu,s=e.stringifyQuery||_i,r=e.history,i=Zt(),o=Zt(),l=Zt(),c=Xl(ht);let u=ht;Bt&&e.scrollBehavior&&"scrollRestoration"in history&&(history.scrollRestoration="manual");const f=Ts.bind(null,v=>""+v),h=Ts.bind(null,gu),p=Ts.bind(null,vn);function m(v,D){let T,V;return dl(v)?(T=t.getRecordMatcher(v),V=D):V=v,t.addRoute(V,T)}function S(v){const D=t.getRecordMatcher(v);D&&t.removeRoute(D)}function C(){return t.getRoutes().map(v=>v.record)}function L(v){return!!t.getRecordMatcher(v)}function N(v,D){if(D=te({},D||c.value),typeof v=="string"){const g=Os(n,v,D.path),_=t.resolve({path:g.path},D),b=r.createHref(g.fullPath);return te(g,_,{params:p(_.params),hash:vn(g.hash),redirectedFrom:void 0,href:b})}let T;if(v.path!=null)T=te({},v,{path:Os(n,v.path,D.path).path});else{const g=te({},v.params);for(const _ in g)g[_]==null&&delete g[_];T=te({},v,{params:h(g)}),D.params=h(D.params)}const V=t.resolve(T,D),Y=v.hash||"";V.params=f(p(V.params));const a=yu(s,te({},v,{hash:hu(Y),path:V.path})),d=r.createHref(a);return te({fullPath:a,hash:Y,query:s===_i?Mu(v.query):v.query||{}},V,{redirectedFrom:void 0,href:d})}function P(v){return typeof v=="string"?Os(n,v,c.value.path):te({},v)}function F(v,D){if(u!==v)return Jt(ue.NAVIGATION_CANCELLED,{from:D,to:v})}function M(v){return q(v)}function j(v){return M(te(P(v),{replace:!0}))}function J(v,D){const T=v.matched[v.matched.length-1];if(T&&T.redirect){const{redirect:V}=T;let Y=typeof V=="function"?V(v,D):V;return typeof Y=="string"&&(Y=Y.includes("?")||Y.includes("#")?Y=P(Y):{path:Y},Y.params={}),te({query:v.query,hash:v.hash,params:Y.path!=null?{}:v.params},Y)}}function q(v,D){const T=u=N(v),V=c.value,Y=v.state,a=v.force,d=v.replace===!0,g=J(T,V);if(g)return q(te(P(g),{state:typeof g=="object"?te({},Y,g.state):Y,force:a,replace:d}),D||T);const _=T;_.redirectedFrom=D;let b;return!a&&vu(s,V,T)&&(b=Jt(ue.NAVIGATION_DUPLICATED,{to:_,from:V}),Ke(V,V,!0,!1)),(b?Promise.resolve(b):k(_,V)).catch(y=>et(y)?et(y,ue.NAVIGATION_GUARD_REDIRECT)?y:ut(y):ee(y,_,V)).then(y=>{if(y){if(et(y,ue.NAVIGATION_GUARD_REDIRECT))return q(te({replace:d},P(y.to),{state:typeof y.to=="object"?te({},Y,y.to.state):Y,force:a}),D||_)}else y=O(_,V,!0,d,Y);return z(_,V,y),y})}function U(v,D){const T=F(v,D);return T?Promise.reject(T):Promise.resolve()}function A(v){const D=Lt.values().next().value;return D&&typeof D.runWithContext=="function"?D.runWithContext(v):v()}function k(v,D){let T;const[V,Y,a]=Lu(v,D);T=Is(V.reverse(),"beforeRouteLeave",v,D);for(const g of V)g.leaveGuards.forEach(_=>{T.push(yt(_,v,D))});const d=U.bind(null,v,D);return T.push(d),Me(T).then(()=>{T=[];for(const g of i.list())T.push(yt(g,v,D));return T.push(d),Me(T)}).then(()=>{T=Is(Y,"beforeRouteUpdate",v,D);for(const g of Y)g.updateGuards.forEach(_=>{T.push(yt(_,v,D))});return T.push(d),Me(T)}).then(()=>{T=[];for(const g of a)if(g.beforeEnter)if(ke(g.beforeEnter))for(const _ of g.beforeEnter)T.push(yt(_,v,D));else T.push(yt(g.beforeEnter,v,D));return T.push(d),Me(T)}).then(()=>(v.matched.forEach(g=>g.enterCallbacks={}),T=Is(a,"beforeRouteEnter",v,D,A),T.push(d),Me(T))).then(()=>{T=[];for(const g of o.list())T.push(yt(g,v,D));return T.push(d),Me(T)}).catch(g=>et(g,ue.NAVIGATION_CANCELLED)?g:Promise.reject(g))}function z(v,D,T){l.list().forEach(V=>A(()=>V(v,D,T)))}function O(v,D,T,V,Y){const a=F(v,D);if(a)return a;const d=D===ht,g=Bt?history.state:{};T&&(V||d?r.replace(v.fullPath,te({scroll:d&&g&&g.scroll},Y)):r.push(v.fullPath,Y)),c.value=v,Ke(v,D,T,d),ut()}let Q;function he(){Q||(Q=r.listen((v,D,T)=>{if(!St.listening)return;const V=N(v),Y=J(V,St.currentRoute.value);if(Y){q(te(Y,{replace:!0,force:!0}),V).catch(an);return}u=V;const a=c.value;Bt&&wu(mi(a.fullPath,T.delta),gs()),k(V,a).catch(d=>et(d,ue.NAVIGATION_ABORTED|ue.NAVIGATION_CANCELLED)?d:et(d,ue.NAVIGATION_GUARD_REDIRECT)?(q(te(P(d.to),{force:!0}),V).then(g=>{et(g,ue.NAVIGATION_ABORTED|ue.NAVIGATION_DUPLICATED)&&!T.delta&&T.type===zs.pop&&r.go(-1,!1)}).catch(an),Promise.reject()):(T.delta&&r.go(-T.delta,!1),ee(d,V,a))).then(d=>{d=d||O(V,a,!1),d&&(T.delta&&!et(d,ue.NAVIGATION_CANCELLED)?r.go(-T.delta,!1):T.type===zs.pop&&et(d,ue.NAVIGATION_ABORTED|ue.NAVIGATION_DUPLICATED)&&r.go(-1,!1)),z(V,a,d)}).catch(an)}))}let Ee=Zt(),ie=Zt(),$;function ee(v,D,T){ut(v);const V=ie.list();return V.length?V.forEach(Y=>Y(v,D,T)):console.error(v),Promise.reject(v)}function Xe(){return $&&c.value!==ht?Promise.resolve():new Promise((v,D)=>{Ee.add([v,D])})}function ut(v){return $||($=!v,he(),Ee.list().forEach(([D,T])=>v?T(v):D()),Ee.reset()),v}function Ke(v,D,T,V){const{scrollBehavior:Y}=e;if(!Bt||!Y)return Promise.resolve();const a=!T&&Tu(mi(v.fullPath,0))||(V||!T)&&history.state&&history.state.scroll||null;return ls().then(()=>Y(v,D,a)).then(d=>d&&Ru(d)).catch(d=>ee(d,v,D))}const we=v=>r.go(v);let Dt;const Lt=new Set,St={currentRoute:c,listening:!0,addRoute:m,removeRoute:S,clearRoutes:t.clearRoutes,hasRoute:L,getRoutes:C,resolve:N,options:e,push:M,replace:j,go:we,back:()=>we(-1),forward:()=>we(1),beforeEach:i.add,beforeResolve:o.add,afterEach:l.add,onError:ie.add,isReady:Xe,install(v){v.component("RouterLink",ta),v.component("RouterView",ia),v.config.globalProperties.$router=St,Object.defineProperty(v.config.globalProperties,"$route",{enumerable:!0,get:()=>It(c)}),Bt&&!Dt&&c.value===ht&&(Dt=!0,M(r.location).catch(V=>{}));const D={};for(const V in ht)Object.defineProperty(D,V,{get:()=>c.value[V],enumerable:!0});v.provide(ms,St),v.provide(br,eo(D)),v.provide(Ys,c);const T=v.unmount;Lt.add(v),v.unmount=function(){Lt.delete(v),Lt.size<1&&(u=ht,Q&&Q(),Q=null,c.value=ht,Dt=!1,$=!1),T()}}};function Me(v){return v.reduce((D,T)=>D.then(()=>A(T)),Promise.resolve())}return St}function Na(){return Fe(ms)}function Ma(e){return Fe(br)}export{ya as $,Sa as A,da as B,pa as C,ma as D,xa as E,Re as F,sf as G,Ra as H,Ea as I,Fe as J,xo as K,Ca as L,Ma as M,Oa as N,It as O,Na as P,Ia as Q,Pa as R,ts as S,fa as T,wa as U,Ta as V,Ao as W,vo as X,yr as Y,Co as Z,Aa as _,cr as a,wc as a0,ca as a1,Ls as b,_a as c,Us as d,Wo as e,ga as f,hs as g,ks as h,va as i,Le as j,ua as k,ha as l,of as m,ls as n,So as o,ac as p,be as q,En as r,ba as s,la as t,ns as u,Il as v,rn as w,aa as x,rf as y,oa as z}; -//# sourceMappingURL=vendor-core.B6UiYhU_.js.map diff --git a/deploy-package-20260223-151231/frontend/assets/vendor-core.B6UiYhU_.js.map b/deploy-package-20260223-151231/frontend/assets/vendor-core.B6UiYhU_.js.map deleted file mode 100644 index 4f2fabf..0000000 --- a/deploy-package-20260223-151231/frontend/assets/vendor-core.B6UiYhU_.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"vendor-core.B6UiYhU_.js","sources":["../../node_modules/@vue/shared/dist/shared.esm-bundler.js","../../node_modules/@vue/reactivity/dist/reactivity.esm-bundler.js","../../node_modules/@vue/runtime-core/dist/runtime-core.esm-bundler.js","../../node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js","../../node_modules/pinia/dist/pinia.mjs","../../node_modules/vue-router/dist/devtools-EWN81iOl.mjs","../../node_modules/vue-router/dist/vue-router.mjs"],"sourcesContent":["/**\n* @vue/shared v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\n// @__NO_SIDE_EFFECTS__\nfunction makeMap(str) {\n const map = /* @__PURE__ */ Object.create(null);\n for (const key of str.split(\",\")) map[key] = 1;\n return (val) => val in map;\n}\n\nconst EMPTY_OBJ = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze({}) : {};\nconst EMPTY_ARR = !!(process.env.NODE_ENV !== \"production\") ? Object.freeze([]) : [];\nconst NOOP = () => {\n};\nconst NO = () => false;\nconst isOn = (key) => key.charCodeAt(0) === 111 && key.charCodeAt(1) === 110 && // uppercase letter\n(key.charCodeAt(2) > 122 || key.charCodeAt(2) < 97);\nconst isModelListener = (key) => key.startsWith(\"onUpdate:\");\nconst extend = Object.assign;\nconst remove = (arr, el) => {\n const i = arr.indexOf(el);\n if (i > -1) {\n arr.splice(i, 1);\n }\n};\nconst hasOwnProperty = Object.prototype.hasOwnProperty;\nconst hasOwn = (val, key) => hasOwnProperty.call(val, key);\nconst isArray = Array.isArray;\nconst isMap = (val) => toTypeString(val) === \"[object Map]\";\nconst isSet = (val) => toTypeString(val) === \"[object Set]\";\nconst isDate = (val) => toTypeString(val) === \"[object Date]\";\nconst isRegExp = (val) => toTypeString(val) === \"[object RegExp]\";\nconst isFunction = (val) => typeof val === \"function\";\nconst isString = (val) => typeof val === \"string\";\nconst isSymbol = (val) => typeof val === \"symbol\";\nconst isObject = (val) => val !== null && typeof val === \"object\";\nconst isPromise = (val) => {\n return (isObject(val) || isFunction(val)) && isFunction(val.then) && isFunction(val.catch);\n};\nconst objectToString = Object.prototype.toString;\nconst toTypeString = (value) => objectToString.call(value);\nconst toRawType = (value) => {\n return toTypeString(value).slice(8, -1);\n};\nconst isPlainObject = (val) => toTypeString(val) === \"[object Object]\";\nconst isIntegerKey = (key) => isString(key) && key !== \"NaN\" && key[0] !== \"-\" && \"\" + parseInt(key, 10) === key;\nconst isReservedProp = /* @__PURE__ */ makeMap(\n // the leading comma is intentional so empty string \"\" is also included\n \",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"\n);\nconst isBuiltInDirective = /* @__PURE__ */ makeMap(\n \"bind,cloak,else-if,else,for,html,if,model,on,once,pre,show,slot,text,memo\"\n);\nconst cacheStringFunction = (fn) => {\n const cache = /* @__PURE__ */ Object.create(null);\n return ((str) => {\n const hit = cache[str];\n return hit || (cache[str] = fn(str));\n });\n};\nconst camelizeRE = /-\\w/g;\nconst camelize = cacheStringFunction(\n (str) => {\n return str.replace(camelizeRE, (c) => c.slice(1).toUpperCase());\n }\n);\nconst hyphenateRE = /\\B([A-Z])/g;\nconst hyphenate = cacheStringFunction(\n (str) => str.replace(hyphenateRE, \"-$1\").toLowerCase()\n);\nconst capitalize = cacheStringFunction((str) => {\n return str.charAt(0).toUpperCase() + str.slice(1);\n});\nconst toHandlerKey = cacheStringFunction(\n (str) => {\n const s = str ? `on${capitalize(str)}` : ``;\n return s;\n }\n);\nconst hasChanged = (value, oldValue) => !Object.is(value, oldValue);\nconst invokeArrayFns = (fns, ...arg) => {\n for (let i = 0; i < fns.length; i++) {\n fns[i](...arg);\n }\n};\nconst def = (obj, key, value, writable = false) => {\n Object.defineProperty(obj, key, {\n configurable: true,\n enumerable: false,\n writable,\n value\n });\n};\nconst looseToNumber = (val) => {\n const n = parseFloat(val);\n return isNaN(n) ? val : n;\n};\nconst toNumber = (val) => {\n const n = isString(val) ? Number(val) : NaN;\n return isNaN(n) ? val : n;\n};\nlet _globalThis;\nconst getGlobalThis = () => {\n return _globalThis || (_globalThis = typeof globalThis !== \"undefined\" ? globalThis : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : typeof global !== \"undefined\" ? global : {});\n};\nconst identRE = /^[_$a-zA-Z\\xA0-\\uFFFF][_$a-zA-Z0-9\\xA0-\\uFFFF]*$/;\nfunction genPropsAccessExp(name) {\n return identRE.test(name) ? `__props.${name}` : `__props[${JSON.stringify(name)}]`;\n}\nfunction genCacheKey(source, options) {\n return source + JSON.stringify(\n options,\n (_, val) => typeof val === \"function\" ? val.toString() : val\n );\n}\n\nconst PatchFlags = {\n \"TEXT\": 1,\n \"1\": \"TEXT\",\n \"CLASS\": 2,\n \"2\": \"CLASS\",\n \"STYLE\": 4,\n \"4\": \"STYLE\",\n \"PROPS\": 8,\n \"8\": \"PROPS\",\n \"FULL_PROPS\": 16,\n \"16\": \"FULL_PROPS\",\n \"NEED_HYDRATION\": 32,\n \"32\": \"NEED_HYDRATION\",\n \"STABLE_FRAGMENT\": 64,\n \"64\": \"STABLE_FRAGMENT\",\n \"KEYED_FRAGMENT\": 128,\n \"128\": \"KEYED_FRAGMENT\",\n \"UNKEYED_FRAGMENT\": 256,\n \"256\": \"UNKEYED_FRAGMENT\",\n \"NEED_PATCH\": 512,\n \"512\": \"NEED_PATCH\",\n \"DYNAMIC_SLOTS\": 1024,\n \"1024\": \"DYNAMIC_SLOTS\",\n \"DEV_ROOT_FRAGMENT\": 2048,\n \"2048\": \"DEV_ROOT_FRAGMENT\",\n \"CACHED\": -1,\n \"-1\": \"CACHED\",\n \"BAIL\": -2,\n \"-2\": \"BAIL\"\n};\nconst PatchFlagNames = {\n [1]: `TEXT`,\n [2]: `CLASS`,\n [4]: `STYLE`,\n [8]: `PROPS`,\n [16]: `FULL_PROPS`,\n [32]: `NEED_HYDRATION`,\n [64]: `STABLE_FRAGMENT`,\n [128]: `KEYED_FRAGMENT`,\n [256]: `UNKEYED_FRAGMENT`,\n [512]: `NEED_PATCH`,\n [1024]: `DYNAMIC_SLOTS`,\n [2048]: `DEV_ROOT_FRAGMENT`,\n [-1]: `CACHED`,\n [-2]: `BAIL`\n};\n\nconst ShapeFlags = {\n \"ELEMENT\": 1,\n \"1\": \"ELEMENT\",\n \"FUNCTIONAL_COMPONENT\": 2,\n \"2\": \"FUNCTIONAL_COMPONENT\",\n \"STATEFUL_COMPONENT\": 4,\n \"4\": \"STATEFUL_COMPONENT\",\n \"TEXT_CHILDREN\": 8,\n \"8\": \"TEXT_CHILDREN\",\n \"ARRAY_CHILDREN\": 16,\n \"16\": \"ARRAY_CHILDREN\",\n \"SLOTS_CHILDREN\": 32,\n \"32\": \"SLOTS_CHILDREN\",\n \"TELEPORT\": 64,\n \"64\": \"TELEPORT\",\n \"SUSPENSE\": 128,\n \"128\": \"SUSPENSE\",\n \"COMPONENT_SHOULD_KEEP_ALIVE\": 256,\n \"256\": \"COMPONENT_SHOULD_KEEP_ALIVE\",\n \"COMPONENT_KEPT_ALIVE\": 512,\n \"512\": \"COMPONENT_KEPT_ALIVE\",\n \"COMPONENT\": 6,\n \"6\": \"COMPONENT\"\n};\n\nconst SlotFlags = {\n \"STABLE\": 1,\n \"1\": \"STABLE\",\n \"DYNAMIC\": 2,\n \"2\": \"DYNAMIC\",\n \"FORWARDED\": 3,\n \"3\": \"FORWARDED\"\n};\nconst slotFlagsText = {\n [1]: \"STABLE\",\n [2]: \"DYNAMIC\",\n [3]: \"FORWARDED\"\n};\n\nconst GLOBALS_ALLOWED = \"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt,console,Error,Symbol\";\nconst isGloballyAllowed = /* @__PURE__ */ makeMap(GLOBALS_ALLOWED);\nconst isGloballyWhitelisted = isGloballyAllowed;\n\nconst range = 2;\nfunction generateCodeFrame(source, start = 0, end = source.length) {\n start = Math.max(0, Math.min(start, source.length));\n end = Math.max(0, Math.min(end, source.length));\n if (start > end) return \"\";\n let lines = source.split(/(\\r?\\n)/);\n const newlineSequences = lines.filter((_, idx) => idx % 2 === 1);\n lines = lines.filter((_, idx) => idx % 2 === 0);\n let count = 0;\n const res = [];\n for (let i = 0; i < lines.length; i++) {\n count += lines[i].length + (newlineSequences[i] && newlineSequences[i].length || 0);\n if (count >= start) {\n for (let j = i - range; j <= i + range || end > count; j++) {\n if (j < 0 || j >= lines.length) continue;\n const line = j + 1;\n res.push(\n `${line}${\" \".repeat(Math.max(3 - String(line).length, 0))}| ${lines[j]}`\n );\n const lineLength = lines[j].length;\n const newLineSeqLength = newlineSequences[j] && newlineSequences[j].length || 0;\n if (j === i) {\n const pad = start - (count - (lineLength + newLineSeqLength));\n const length = Math.max(\n 1,\n end > count ? lineLength - pad : end - start\n );\n res.push(` | ` + \" \".repeat(pad) + \"^\".repeat(length));\n } else if (j > i) {\n if (end > count) {\n const length = Math.max(Math.min(end - count, lineLength), 1);\n res.push(` | ` + \"^\".repeat(length));\n }\n count += lineLength + newLineSeqLength;\n }\n }\n break;\n }\n }\n return res.join(\"\\n\");\n}\n\nfunction normalizeStyle(value) {\n if (isArray(value)) {\n const res = {};\n for (let i = 0; i < value.length; i++) {\n const item = value[i];\n const normalized = isString(item) ? parseStringStyle(item) : normalizeStyle(item);\n if (normalized) {\n for (const key in normalized) {\n res[key] = normalized[key];\n }\n }\n }\n return res;\n } else if (isString(value) || isObject(value)) {\n return value;\n }\n}\nconst listDelimiterRE = /;(?![^(]*\\))/g;\nconst propertyDelimiterRE = /:([^]+)/;\nconst styleCommentRE = /\\/\\*[^]*?\\*\\//g;\nfunction parseStringStyle(cssText) {\n const ret = {};\n cssText.replace(styleCommentRE, \"\").split(listDelimiterRE).forEach((item) => {\n if (item) {\n const tmp = item.split(propertyDelimiterRE);\n tmp.length > 1 && (ret[tmp[0].trim()] = tmp[1].trim());\n }\n });\n return ret;\n}\nfunction stringifyStyle(styles) {\n if (!styles) return \"\";\n if (isString(styles)) return styles;\n let ret = \"\";\n for (const key in styles) {\n const value = styles[key];\n if (isString(value) || typeof value === \"number\") {\n const normalizedKey = key.startsWith(`--`) ? key : hyphenate(key);\n ret += `${normalizedKey}:${value};`;\n }\n }\n return ret;\n}\nfunction normalizeClass(value) {\n let res = \"\";\n if (isString(value)) {\n res = value;\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n const normalized = normalizeClass(value[i]);\n if (normalized) {\n res += normalized + \" \";\n }\n }\n } else if (isObject(value)) {\n for (const name in value) {\n if (value[name]) {\n res += name + \" \";\n }\n }\n }\n return res.trim();\n}\nfunction normalizeProps(props) {\n if (!props) return null;\n let { class: klass, style } = props;\n if (klass && !isString(klass)) {\n props.class = normalizeClass(klass);\n }\n if (style) {\n props.style = normalizeStyle(style);\n }\n return props;\n}\n\nconst HTML_TAGS = \"html,body,base,head,link,meta,style,title,address,article,aside,footer,header,hgroup,h1,h2,h3,h4,h5,h6,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,summary,template,blockquote,iframe,tfoot\";\nconst SVG_TAGS = \"svg,animate,animateMotion,animateTransform,circle,clipPath,color-profile,defs,desc,discard,ellipse,feBlend,feColorMatrix,feComponentTransfer,feComposite,feConvolveMatrix,feDiffuseLighting,feDisplacementMap,feDistantLight,feDropShadow,feFlood,feFuncA,feFuncB,feFuncG,feFuncR,feGaussianBlur,feImage,feMerge,feMergeNode,feMorphology,feOffset,fePointLight,feSpecularLighting,feSpotLight,feTile,feTurbulence,filter,foreignObject,g,hatch,hatchpath,image,line,linearGradient,marker,mask,mesh,meshgradient,meshpatch,meshrow,metadata,mpath,path,pattern,polygon,polyline,radialGradient,rect,set,solidcolor,stop,switch,symbol,text,textPath,title,tspan,unknown,use,view\";\nconst MATH_TAGS = \"annotation,annotation-xml,maction,maligngroup,malignmark,math,menclose,merror,mfenced,mfrac,mfraction,mglyph,mi,mlabeledtr,mlongdiv,mmultiscripts,mn,mo,mover,mpadded,mphantom,mprescripts,mroot,mrow,ms,mscarries,mscarry,msgroup,msline,mspace,msqrt,msrow,mstack,mstyle,msub,msubsup,msup,mtable,mtd,mtext,mtr,munder,munderover,none,semantics\";\nconst VOID_TAGS = \"area,base,br,col,embed,hr,img,input,link,meta,param,source,track,wbr\";\nconst isHTMLTag = /* @__PURE__ */ makeMap(HTML_TAGS);\nconst isSVGTag = /* @__PURE__ */ makeMap(SVG_TAGS);\nconst isMathMLTag = /* @__PURE__ */ makeMap(MATH_TAGS);\nconst isVoidTag = /* @__PURE__ */ makeMap(VOID_TAGS);\n\nconst specialBooleanAttrs = `itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly`;\nconst isSpecialBooleanAttr = /* @__PURE__ */ makeMap(specialBooleanAttrs);\nconst isBooleanAttr = /* @__PURE__ */ makeMap(\n specialBooleanAttrs + `,async,autofocus,autoplay,controls,default,defer,disabled,hidden,inert,loop,open,required,reversed,scoped,seamless,checked,muted,multiple,selected`\n);\nfunction includeBooleanAttr(value) {\n return !!value || value === \"\";\n}\nconst unsafeAttrCharRE = /[>/=\"'\\u0009\\u000a\\u000c\\u0020]/;\nconst attrValidationCache = {};\nfunction isSSRSafeAttrName(name) {\n if (attrValidationCache.hasOwnProperty(name)) {\n return attrValidationCache[name];\n }\n const isUnsafe = unsafeAttrCharRE.test(name);\n if (isUnsafe) {\n console.error(`unsafe attribute name: ${name}`);\n }\n return attrValidationCache[name] = !isUnsafe;\n}\nconst propsToAttrMap = {\n acceptCharset: \"accept-charset\",\n className: \"class\",\n htmlFor: \"for\",\n httpEquiv: \"http-equiv\"\n};\nconst isKnownHtmlAttr = /* @__PURE__ */ makeMap(\n `accept,accept-charset,accesskey,action,align,allow,alt,async,autocapitalize,autocomplete,autofocus,autoplay,background,bgcolor,border,buffered,capture,challenge,charset,checked,cite,class,code,codebase,color,cols,colspan,content,contenteditable,contextmenu,controls,coords,crossorigin,csp,data,datetime,decoding,default,defer,dir,dirname,disabled,download,draggable,dropzone,enctype,enterkeyhint,for,form,formaction,formenctype,formmethod,formnovalidate,formtarget,headers,height,hidden,high,href,hreflang,http-equiv,icon,id,importance,inert,integrity,ismap,itemprop,keytype,kind,label,lang,language,loading,list,loop,low,manifest,max,maxlength,minlength,media,min,multiple,muted,name,novalidate,open,optimum,pattern,ping,placeholder,poster,preload,radiogroup,readonly,referrerpolicy,rel,required,reversed,rows,rowspan,sandbox,scope,scoped,selected,shape,size,sizes,slot,span,spellcheck,src,srcdoc,srclang,srcset,start,step,style,summary,tabindex,target,title,translate,type,usemap,value,width,wrap`\n);\nconst isKnownSvgAttr = /* @__PURE__ */ makeMap(\n `xmlns,accent-height,accumulate,additive,alignment-baseline,alphabetic,amplitude,arabic-form,ascent,attributeName,attributeType,azimuth,baseFrequency,baseline-shift,baseProfile,bbox,begin,bias,by,calcMode,cap-height,class,clip,clipPathUnits,clip-path,clip-rule,color,color-interpolation,color-interpolation-filters,color-profile,color-rendering,contentScriptType,contentStyleType,crossorigin,cursor,cx,cy,d,decelerate,descent,diffuseConstant,direction,display,divisor,dominant-baseline,dur,dx,dy,edgeMode,elevation,enable-background,end,exponent,fill,fill-opacity,fill-rule,filter,filterRes,filterUnits,flood-color,flood-opacity,font-family,font-size,font-size-adjust,font-stretch,font-style,font-variant,font-weight,format,from,fr,fx,fy,g1,g2,glyph-name,glyph-orientation-horizontal,glyph-orientation-vertical,glyphRef,gradientTransform,gradientUnits,hanging,height,href,hreflang,horiz-adv-x,horiz-origin-x,id,ideographic,image-rendering,in,in2,intercept,k,k1,k2,k3,k4,kernelMatrix,kernelUnitLength,kerning,keyPoints,keySplines,keyTimes,lang,lengthAdjust,letter-spacing,lighting-color,limitingConeAngle,local,marker-end,marker-mid,marker-start,markerHeight,markerUnits,markerWidth,mask,maskContentUnits,maskUnits,mathematical,max,media,method,min,mode,name,numOctaves,offset,opacity,operator,order,orient,orientation,origin,overflow,overline-position,overline-thickness,panose-1,paint-order,path,pathLength,patternContentUnits,patternTransform,patternUnits,ping,pointer-events,points,pointsAtX,pointsAtY,pointsAtZ,preserveAlpha,preserveAspectRatio,primitiveUnits,r,radius,referrerPolicy,refX,refY,rel,rendering-intent,repeatCount,repeatDur,requiredExtensions,requiredFeatures,restart,result,rotate,rx,ry,scale,seed,shape-rendering,slope,spacing,specularConstant,specularExponent,speed,spreadMethod,startOffset,stdDeviation,stemh,stemv,stitchTiles,stop-color,stop-opacity,strikethrough-position,strikethrough-thickness,string,stroke,stroke-dasharray,stroke-dashoffset,stroke-linecap,stroke-linejoin,stroke-miterlimit,stroke-opacity,stroke-width,style,surfaceScale,systemLanguage,tabindex,tableValues,target,targetX,targetY,text-anchor,text-decoration,text-rendering,textLength,to,transform,transform-origin,type,u1,u2,underline-position,underline-thickness,unicode,unicode-bidi,unicode-range,units-per-em,v-alphabetic,v-hanging,v-ideographic,v-mathematical,values,vector-effect,version,vert-adv-y,vert-origin-x,vert-origin-y,viewBox,viewTarget,visibility,width,widths,word-spacing,writing-mode,x,x-height,x1,x2,xChannelSelector,xlink:actuate,xlink:arcrole,xlink:href,xlink:role,xlink:show,xlink:title,xlink:type,xmlns:xlink,xml:base,xml:lang,xml:space,y,y1,y2,yChannelSelector,z,zoomAndPan`\n);\nconst isKnownMathMLAttr = /* @__PURE__ */ makeMap(\n `accent,accentunder,actiontype,align,alignmentscope,altimg,altimg-height,altimg-valign,altimg-width,alttext,bevelled,close,columnsalign,columnlines,columnspan,denomalign,depth,dir,display,displaystyle,encoding,equalcolumns,equalrows,fence,fontstyle,fontweight,form,frame,framespacing,groupalign,height,href,id,indentalign,indentalignfirst,indentalignlast,indentshift,indentshiftfirst,indentshiftlast,indextype,justify,largetop,largeop,lquote,lspace,mathbackground,mathcolor,mathsize,mathvariant,maxsize,minlabelspacing,mode,other,overflow,position,rowalign,rowlines,rowspan,rquote,rspace,scriptlevel,scriptminsize,scriptsizemultiplier,selection,separator,separators,shift,side,src,stackalign,stretchy,subscriptshift,superscriptshift,symmetric,voffset,width,widths,xlink:href,xlink:show,xlink:type,xmlns`\n);\nfunction isRenderableAttrValue(value) {\n if (value == null) {\n return false;\n }\n const type = typeof value;\n return type === \"string\" || type === \"number\" || type === \"boolean\";\n}\n\nconst escapeRE = /[\"'&<>]/;\nfunction escapeHtml(string) {\n const str = \"\" + string;\n const match = escapeRE.exec(str);\n if (!match) {\n return str;\n }\n let html = \"\";\n let escaped;\n let index;\n let lastIndex = 0;\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34:\n escaped = \""\";\n break;\n case 38:\n escaped = \"&\";\n break;\n case 39:\n escaped = \"'\";\n break;\n case 60:\n escaped = \"<\";\n break;\n case 62:\n escaped = \">\";\n break;\n default:\n continue;\n }\n if (lastIndex !== index) {\n html += str.slice(lastIndex, index);\n }\n lastIndex = index + 1;\n html += escaped;\n }\n return lastIndex !== index ? html + str.slice(lastIndex, index) : html;\n}\nconst commentStripRE = /^-?>||--!>|?@[\\\\\\]^`{|}~]/g;\nfunction getEscapedCssVarName(key, doubleEscape) {\n return key.replace(\n cssVarNameEscapeSymbolsRE,\n (s) => doubleEscape ? s === '\"' ? '\\\\\\\\\\\\\"' : `\\\\\\\\${s}` : `\\\\${s}`\n );\n}\n\nfunction looseCompareArrays(a, b) {\n if (a.length !== b.length) return false;\n let equal = true;\n for (let i = 0; equal && i < a.length; i++) {\n equal = looseEqual(a[i], b[i]);\n }\n return equal;\n}\nfunction looseEqual(a, b) {\n if (a === b) return true;\n let aValidType = isDate(a);\n let bValidType = isDate(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? a.getTime() === b.getTime() : false;\n }\n aValidType = isSymbol(a);\n bValidType = isSymbol(b);\n if (aValidType || bValidType) {\n return a === b;\n }\n aValidType = isArray(a);\n bValidType = isArray(b);\n if (aValidType || bValidType) {\n return aValidType && bValidType ? looseCompareArrays(a, b) : false;\n }\n aValidType = isObject(a);\n bValidType = isObject(b);\n if (aValidType || bValidType) {\n if (!aValidType || !bValidType) {\n return false;\n }\n const aKeysCount = Object.keys(a).length;\n const bKeysCount = Object.keys(b).length;\n if (aKeysCount !== bKeysCount) {\n return false;\n }\n for (const key in a) {\n const aHasKey = a.hasOwnProperty(key);\n const bHasKey = b.hasOwnProperty(key);\n if (aHasKey && !bHasKey || !aHasKey && bHasKey || !looseEqual(a[key], b[key])) {\n return false;\n }\n }\n }\n return String(a) === String(b);\n}\nfunction looseIndexOf(arr, val) {\n return arr.findIndex((item) => looseEqual(item, val));\n}\n\nconst isRef = (val) => {\n return !!(val && val[\"__v_isRef\"] === true);\n};\nconst toDisplayString = (val) => {\n return isString(val) ? val : val == null ? \"\" : isArray(val) || isObject(val) && (val.toString === objectToString || !isFunction(val.toString)) ? isRef(val) ? toDisplayString(val.value) : JSON.stringify(val, replacer, 2) : String(val);\n};\nconst replacer = (_key, val) => {\n if (isRef(val)) {\n return replacer(_key, val.value);\n } else if (isMap(val)) {\n return {\n [`Map(${val.size})`]: [...val.entries()].reduce(\n (entries, [key, val2], i) => {\n entries[stringifySymbol(key, i) + \" =>\"] = val2;\n return entries;\n },\n {}\n )\n };\n } else if (isSet(val)) {\n return {\n [`Set(${val.size})`]: [...val.values()].map((v) => stringifySymbol(v))\n };\n } else if (isSymbol(val)) {\n return stringifySymbol(val);\n } else if (isObject(val) && !isArray(val) && !isPlainObject(val)) {\n return String(val);\n }\n return val;\n};\nconst stringifySymbol = (v, i = \"\") => {\n var _a;\n return (\n // Symbol.description in es2019+ so we need to cast here to pass\n // the lib: es2016 check\n isSymbol(v) ? `Symbol(${(_a = v.description) != null ? _a : i})` : v\n );\n};\n\nfunction normalizeCssVarValue(value) {\n if (value == null) {\n return \"initial\";\n }\n if (typeof value === \"string\") {\n return value === \"\" ? \" \" : value;\n }\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n console.warn(\n \"[Vue warn] Invalid value used for CSS binding. Expected a string or a finite number but received:\",\n value\n );\n }\n }\n return String(value);\n}\n\nexport { EMPTY_ARR, EMPTY_OBJ, NO, NOOP, PatchFlagNames, PatchFlags, ShapeFlags, SlotFlags, camelize, capitalize, cssVarNameEscapeSymbolsRE, def, escapeHtml, escapeHtmlComment, extend, genCacheKey, genPropsAccessExp, generateCodeFrame, getEscapedCssVarName, getGlobalThis, hasChanged, hasOwn, hyphenate, includeBooleanAttr, invokeArrayFns, isArray, isBooleanAttr, isBuiltInDirective, isDate, isFunction, isGloballyAllowed, isGloballyWhitelisted, isHTMLTag, isIntegerKey, isKnownHtmlAttr, isKnownMathMLAttr, isKnownSvgAttr, isMap, isMathMLTag, isModelListener, isObject, isOn, isPlainObject, isPromise, isRegExp, isRenderableAttrValue, isReservedProp, isSSRSafeAttrName, isSVGTag, isSet, isSpecialBooleanAttr, isString, isSymbol, isVoidTag, looseEqual, looseIndexOf, looseToNumber, makeMap, normalizeClass, normalizeCssVarValue, normalizeProps, normalizeStyle, objectToString, parseStringStyle, propsToAttrMap, remove, slotFlagsText, stringifyStyle, toDisplayString, toHandlerKey, toNumber, toRawType, toTypeString };\n","/**\n* @vue/reactivity v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { extend, hasChanged, isArray, isIntegerKey, isSymbol, isMap, hasOwn, makeMap, isObject, capitalize, toRawType, def, isFunction, EMPTY_OBJ, isSet, isPlainObject, remove, NOOP } from '@vue/shared';\n\nfunction warn(msg, ...args) {\n console.warn(`[Vue warn] ${msg}`, ...args);\n}\n\nlet activeEffectScope;\nclass EffectScope {\n constructor(detached = false) {\n this.detached = detached;\n /**\n * @internal\n */\n this._active = true;\n /**\n * @internal track `on` calls, allow `on` call multiple times\n */\n this._on = 0;\n /**\n * @internal\n */\n this.effects = [];\n /**\n * @internal\n */\n this.cleanups = [];\n this._isPaused = false;\n this.parent = activeEffectScope;\n if (!detached && activeEffectScope) {\n this.index = (activeEffectScope.scopes || (activeEffectScope.scopes = [])).push(\n this\n ) - 1;\n }\n }\n get active() {\n return this._active;\n }\n pause() {\n if (this._active) {\n this._isPaused = true;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].pause();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].pause();\n }\n }\n }\n /**\n * Resumes the effect scope, including all child scopes and effects.\n */\n resume() {\n if (this._active) {\n if (this._isPaused) {\n this._isPaused = false;\n let i, l;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].resume();\n }\n }\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].resume();\n }\n }\n }\n }\n run(fn) {\n if (this._active) {\n const currentEffectScope = activeEffectScope;\n try {\n activeEffectScope = this;\n return fn();\n } finally {\n activeEffectScope = currentEffectScope;\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(`cannot run an inactive effect scope.`);\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n on() {\n if (++this._on === 1) {\n this.prevScope = activeEffectScope;\n activeEffectScope = this;\n }\n }\n /**\n * This should only be called on non-detached scopes\n * @internal\n */\n off() {\n if (this._on > 0 && --this._on === 0) {\n activeEffectScope = this.prevScope;\n this.prevScope = void 0;\n }\n }\n stop(fromParent) {\n if (this._active) {\n this._active = false;\n let i, l;\n for (i = 0, l = this.effects.length; i < l; i++) {\n this.effects[i].stop();\n }\n this.effects.length = 0;\n for (i = 0, l = this.cleanups.length; i < l; i++) {\n this.cleanups[i]();\n }\n this.cleanups.length = 0;\n if (this.scopes) {\n for (i = 0, l = this.scopes.length; i < l; i++) {\n this.scopes[i].stop(true);\n }\n this.scopes.length = 0;\n }\n if (!this.detached && this.parent && !fromParent) {\n const last = this.parent.scopes.pop();\n if (last && last !== this) {\n this.parent.scopes[this.index] = last;\n last.index = this.index;\n }\n }\n this.parent = void 0;\n }\n }\n}\nfunction effectScope(detached) {\n return new EffectScope(detached);\n}\nfunction getCurrentScope() {\n return activeEffectScope;\n}\nfunction onScopeDispose(fn, failSilently = false) {\n if (activeEffectScope) {\n activeEffectScope.cleanups.push(fn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onScopeDispose() is called when there is no active effect scope to be associated with.`\n );\n }\n}\n\nlet activeSub;\nconst EffectFlags = {\n \"ACTIVE\": 1,\n \"1\": \"ACTIVE\",\n \"RUNNING\": 2,\n \"2\": \"RUNNING\",\n \"TRACKING\": 4,\n \"4\": \"TRACKING\",\n \"NOTIFIED\": 8,\n \"8\": \"NOTIFIED\",\n \"DIRTY\": 16,\n \"16\": \"DIRTY\",\n \"ALLOW_RECURSE\": 32,\n \"32\": \"ALLOW_RECURSE\",\n \"PAUSED\": 64,\n \"64\": \"PAUSED\",\n \"EVALUATED\": 128,\n \"128\": \"EVALUATED\"\n};\nconst pausedQueueEffects = /* @__PURE__ */ new WeakSet();\nclass ReactiveEffect {\n constructor(fn) {\n this.fn = fn;\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 1 | 4;\n /**\n * @internal\n */\n this.next = void 0;\n /**\n * @internal\n */\n this.cleanup = void 0;\n this.scheduler = void 0;\n if (activeEffectScope && activeEffectScope.active) {\n activeEffectScope.effects.push(this);\n }\n }\n pause() {\n this.flags |= 64;\n }\n resume() {\n if (this.flags & 64) {\n this.flags &= -65;\n if (pausedQueueEffects.has(this)) {\n pausedQueueEffects.delete(this);\n this.trigger();\n }\n }\n }\n /**\n * @internal\n */\n notify() {\n if (this.flags & 2 && !(this.flags & 32)) {\n return;\n }\n if (!(this.flags & 8)) {\n batch(this);\n }\n }\n run() {\n if (!(this.flags & 1)) {\n return this.fn();\n }\n this.flags |= 2;\n cleanupEffect(this);\n prepareDeps(this);\n const prevEffect = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = this;\n shouldTrack = true;\n try {\n return this.fn();\n } finally {\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub !== this) {\n warn(\n \"Active effect was not restored correctly - this is likely a Vue internal bug.\"\n );\n }\n cleanupDeps(this);\n activeSub = prevEffect;\n shouldTrack = prevShouldTrack;\n this.flags &= -3;\n }\n }\n stop() {\n if (this.flags & 1) {\n for (let link = this.deps; link; link = link.nextDep) {\n removeSub(link);\n }\n this.deps = this.depsTail = void 0;\n cleanupEffect(this);\n this.onStop && this.onStop();\n this.flags &= -2;\n }\n }\n trigger() {\n if (this.flags & 64) {\n pausedQueueEffects.add(this);\n } else if (this.scheduler) {\n this.scheduler();\n } else {\n this.runIfDirty();\n }\n }\n /**\n * @internal\n */\n runIfDirty() {\n if (isDirty(this)) {\n this.run();\n }\n }\n get dirty() {\n return isDirty(this);\n }\n}\nlet batchDepth = 0;\nlet batchedSub;\nlet batchedComputed;\nfunction batch(sub, isComputed = false) {\n sub.flags |= 8;\n if (isComputed) {\n sub.next = batchedComputed;\n batchedComputed = sub;\n return;\n }\n sub.next = batchedSub;\n batchedSub = sub;\n}\nfunction startBatch() {\n batchDepth++;\n}\nfunction endBatch() {\n if (--batchDepth > 0) {\n return;\n }\n if (batchedComputed) {\n let e = batchedComputed;\n batchedComputed = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n e = next;\n }\n }\n let error;\n while (batchedSub) {\n let e = batchedSub;\n batchedSub = void 0;\n while (e) {\n const next = e.next;\n e.next = void 0;\n e.flags &= -9;\n if (e.flags & 1) {\n try {\n ;\n e.trigger();\n } catch (err) {\n if (!error) error = err;\n }\n }\n e = next;\n }\n }\n if (error) throw error;\n}\nfunction prepareDeps(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n link.version = -1;\n link.prevActiveLink = link.dep.activeLink;\n link.dep.activeLink = link;\n }\n}\nfunction cleanupDeps(sub) {\n let head;\n let tail = sub.depsTail;\n let link = tail;\n while (link) {\n const prev = link.prevDep;\n if (link.version === -1) {\n if (link === tail) tail = prev;\n removeSub(link);\n removeDep(link);\n } else {\n head = link;\n }\n link.dep.activeLink = link.prevActiveLink;\n link.prevActiveLink = void 0;\n link = prev;\n }\n sub.deps = head;\n sub.depsTail = tail;\n}\nfunction isDirty(sub) {\n for (let link = sub.deps; link; link = link.nextDep) {\n if (link.dep.version !== link.version || link.dep.computed && (refreshComputed(link.dep.computed) || link.dep.version !== link.version)) {\n return true;\n }\n }\n if (sub._dirty) {\n return true;\n }\n return false;\n}\nfunction refreshComputed(computed) {\n if (computed.flags & 4 && !(computed.flags & 16)) {\n return;\n }\n computed.flags &= -17;\n if (computed.globalVersion === globalVersion) {\n return;\n }\n computed.globalVersion = globalVersion;\n if (!computed.isSSR && computed.flags & 128 && (!computed.deps && !computed._dirty || !isDirty(computed))) {\n return;\n }\n computed.flags |= 2;\n const dep = computed.dep;\n const prevSub = activeSub;\n const prevShouldTrack = shouldTrack;\n activeSub = computed;\n shouldTrack = true;\n try {\n prepareDeps(computed);\n const value = computed.fn(computed._value);\n if (dep.version === 0 || hasChanged(value, computed._value)) {\n computed.flags |= 128;\n computed._value = value;\n dep.version++;\n }\n } catch (err) {\n dep.version++;\n throw err;\n } finally {\n activeSub = prevSub;\n shouldTrack = prevShouldTrack;\n cleanupDeps(computed);\n computed.flags &= -3;\n }\n}\nfunction removeSub(link, soft = false) {\n const { dep, prevSub, nextSub } = link;\n if (prevSub) {\n prevSub.nextSub = nextSub;\n link.prevSub = void 0;\n }\n if (nextSub) {\n nextSub.prevSub = prevSub;\n link.nextSub = void 0;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && dep.subsHead === link) {\n dep.subsHead = nextSub;\n }\n if (dep.subs === link) {\n dep.subs = prevSub;\n if (!prevSub && dep.computed) {\n dep.computed.flags &= -5;\n for (let l = dep.computed.deps; l; l = l.nextDep) {\n removeSub(l, true);\n }\n }\n }\n if (!soft && !--dep.sc && dep.map) {\n dep.map.delete(dep.key);\n }\n}\nfunction removeDep(link) {\n const { prevDep, nextDep } = link;\n if (prevDep) {\n prevDep.nextDep = nextDep;\n link.prevDep = void 0;\n }\n if (nextDep) {\n nextDep.prevDep = prevDep;\n link.nextDep = void 0;\n }\n}\nfunction effect(fn, options) {\n if (fn.effect instanceof ReactiveEffect) {\n fn = fn.effect.fn;\n }\n const e = new ReactiveEffect(fn);\n if (options) {\n extend(e, options);\n }\n try {\n e.run();\n } catch (err) {\n e.stop();\n throw err;\n }\n const runner = e.run.bind(e);\n runner.effect = e;\n return runner;\n}\nfunction stop(runner) {\n runner.effect.stop();\n}\nlet shouldTrack = true;\nconst trackStack = [];\nfunction pauseTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = false;\n}\nfunction enableTracking() {\n trackStack.push(shouldTrack);\n shouldTrack = true;\n}\nfunction resetTracking() {\n const last = trackStack.pop();\n shouldTrack = last === void 0 ? true : last;\n}\nfunction onEffectCleanup(fn, failSilently = false) {\n if (activeSub instanceof ReactiveEffect) {\n activeSub.cleanup = fn;\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onEffectCleanup() was called when there was no active effect to associate with.`\n );\n }\n}\nfunction cleanupEffect(e) {\n const { cleanup } = e;\n e.cleanup = void 0;\n if (cleanup) {\n const prevSub = activeSub;\n activeSub = void 0;\n try {\n cleanup();\n } finally {\n activeSub = prevSub;\n }\n }\n}\n\nlet globalVersion = 0;\nclass Link {\n constructor(sub, dep) {\n this.sub = sub;\n this.dep = dep;\n this.version = dep.version;\n this.nextDep = this.prevDep = this.nextSub = this.prevSub = this.prevActiveLink = void 0;\n }\n}\nclass Dep {\n // TODO isolatedDeclarations \"__v_skip\"\n constructor(computed) {\n this.computed = computed;\n this.version = 0;\n /**\n * Link between this dep and the current active effect\n */\n this.activeLink = void 0;\n /**\n * Doubly linked list representing the subscribing effects (tail)\n */\n this.subs = void 0;\n /**\n * For object property deps cleanup\n */\n this.map = void 0;\n this.key = void 0;\n /**\n * Subscriber counter\n */\n this.sc = 0;\n /**\n * @internal\n */\n this.__v_skip = true;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.subsHead = void 0;\n }\n }\n track(debugInfo) {\n if (!activeSub || !shouldTrack || activeSub === this.computed) {\n return;\n }\n let link = this.activeLink;\n if (link === void 0 || link.sub !== activeSub) {\n link = this.activeLink = new Link(activeSub, this);\n if (!activeSub.deps) {\n activeSub.deps = activeSub.depsTail = link;\n } else {\n link.prevDep = activeSub.depsTail;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n }\n addSub(link);\n } else if (link.version === -1) {\n link.version = this.version;\n if (link.nextDep) {\n const next = link.nextDep;\n next.prevDep = link.prevDep;\n if (link.prevDep) {\n link.prevDep.nextDep = next;\n }\n link.prevDep = activeSub.depsTail;\n link.nextDep = void 0;\n activeSub.depsTail.nextDep = link;\n activeSub.depsTail = link;\n if (activeSub.deps === link) {\n activeSub.deps = next;\n }\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") && activeSub.onTrack) {\n activeSub.onTrack(\n extend(\n {\n effect: activeSub\n },\n debugInfo\n )\n );\n }\n return link;\n }\n trigger(debugInfo) {\n this.version++;\n globalVersion++;\n this.notify(debugInfo);\n }\n notify(debugInfo) {\n startBatch();\n try {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n for (let head = this.subsHead; head; head = head.nextSub) {\n if (head.sub.onTrigger && !(head.sub.flags & 8)) {\n head.sub.onTrigger(\n extend(\n {\n effect: head.sub\n },\n debugInfo\n )\n );\n }\n }\n }\n for (let link = this.subs; link; link = link.prevSub) {\n if (link.sub.notify()) {\n ;\n link.sub.dep.notify();\n }\n }\n } finally {\n endBatch();\n }\n }\n}\nfunction addSub(link) {\n link.dep.sc++;\n if (link.sub.flags & 4) {\n const computed = link.dep.computed;\n if (computed && !link.dep.subs) {\n computed.flags |= 4 | 16;\n for (let l = computed.deps; l; l = l.nextDep) {\n addSub(l);\n }\n }\n const currentTail = link.dep.subs;\n if (currentTail !== link) {\n link.prevSub = currentTail;\n if (currentTail) currentTail.nextSub = link;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && link.dep.subsHead === void 0) {\n link.dep.subsHead = link;\n }\n link.dep.subs = link;\n }\n}\nconst targetMap = /* @__PURE__ */ new WeakMap();\nconst ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Object iterate\" : \"\"\n);\nconst MAP_KEY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Map keys iterate\" : \"\"\n);\nconst ARRAY_ITERATE_KEY = /* @__PURE__ */ Symbol(\n !!(process.env.NODE_ENV !== \"production\") ? \"Array iterate\" : \"\"\n);\nfunction track(target, type, key) {\n if (shouldTrack && activeSub) {\n let depsMap = targetMap.get(target);\n if (!depsMap) {\n targetMap.set(target, depsMap = /* @__PURE__ */ new Map());\n }\n let dep = depsMap.get(key);\n if (!dep) {\n depsMap.set(key, dep = new Dep());\n dep.map = depsMap;\n dep.key = key;\n }\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.track({\n target,\n type,\n key\n });\n } else {\n dep.track();\n }\n }\n}\nfunction trigger(target, type, key, newValue, oldValue, oldTarget) {\n const depsMap = targetMap.get(target);\n if (!depsMap) {\n globalVersion++;\n return;\n }\n const run = (dep) => {\n if (dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n dep.trigger({\n target,\n type,\n key,\n newValue,\n oldValue,\n oldTarget\n });\n } else {\n dep.trigger();\n }\n }\n };\n startBatch();\n if (type === \"clear\") {\n depsMap.forEach(run);\n } else {\n const targetIsArray = isArray(target);\n const isArrayIndex = targetIsArray && isIntegerKey(key);\n if (targetIsArray && key === \"length\") {\n const newLength = Number(newValue);\n depsMap.forEach((dep, key2) => {\n if (key2 === \"length\" || key2 === ARRAY_ITERATE_KEY || !isSymbol(key2) && key2 >= newLength) {\n run(dep);\n }\n });\n } else {\n if (key !== void 0 || depsMap.has(void 0)) {\n run(depsMap.get(key));\n }\n if (isArrayIndex) {\n run(depsMap.get(ARRAY_ITERATE_KEY));\n }\n switch (type) {\n case \"add\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n } else if (isArrayIndex) {\n run(depsMap.get(\"length\"));\n }\n break;\n case \"delete\":\n if (!targetIsArray) {\n run(depsMap.get(ITERATE_KEY));\n if (isMap(target)) {\n run(depsMap.get(MAP_KEY_ITERATE_KEY));\n }\n }\n break;\n case \"set\":\n if (isMap(target)) {\n run(depsMap.get(ITERATE_KEY));\n }\n break;\n }\n }\n }\n endBatch();\n}\nfunction getDepFromReactive(object, key) {\n const depMap = targetMap.get(object);\n return depMap && depMap.get(key);\n}\n\nfunction reactiveReadArray(array) {\n const raw = toRaw(array);\n if (raw === array) return raw;\n track(raw, \"iterate\", ARRAY_ITERATE_KEY);\n return isShallow(array) ? raw : raw.map(toReactive);\n}\nfunction shallowReadArray(arr) {\n track(arr = toRaw(arr), \"iterate\", ARRAY_ITERATE_KEY);\n return arr;\n}\nfunction toWrapped(target, item) {\n if (isReadonly(target)) {\n return isReactive(target) ? toReadonly(toReactive(item)) : toReadonly(item);\n }\n return toReactive(item);\n}\nconst arrayInstrumentations = {\n __proto__: null,\n [Symbol.iterator]() {\n return iterator(this, Symbol.iterator, (item) => toWrapped(this, item));\n },\n concat(...args) {\n return reactiveReadArray(this).concat(\n ...args.map((x) => isArray(x) ? reactiveReadArray(x) : x)\n );\n },\n entries() {\n return iterator(this, \"entries\", (value) => {\n value[1] = toWrapped(this, value[1]);\n return value;\n });\n },\n every(fn, thisArg) {\n return apply(this, \"every\", fn, thisArg, void 0, arguments);\n },\n filter(fn, thisArg) {\n return apply(\n this,\n \"filter\",\n fn,\n thisArg,\n (v) => v.map((item) => toWrapped(this, item)),\n arguments\n );\n },\n find(fn, thisArg) {\n return apply(\n this,\n \"find\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findIndex(fn, thisArg) {\n return apply(this, \"findIndex\", fn, thisArg, void 0, arguments);\n },\n findLast(fn, thisArg) {\n return apply(\n this,\n \"findLast\",\n fn,\n thisArg,\n (item) => toWrapped(this, item),\n arguments\n );\n },\n findLastIndex(fn, thisArg) {\n return apply(this, \"findLastIndex\", fn, thisArg, void 0, arguments);\n },\n // flat, flatMap could benefit from ARRAY_ITERATE but are not straight-forward to implement\n forEach(fn, thisArg) {\n return apply(this, \"forEach\", fn, thisArg, void 0, arguments);\n },\n includes(...args) {\n return searchProxy(this, \"includes\", args);\n },\n indexOf(...args) {\n return searchProxy(this, \"indexOf\", args);\n },\n join(separator) {\n return reactiveReadArray(this).join(separator);\n },\n // keys() iterator only reads `length`, no optimization required\n lastIndexOf(...args) {\n return searchProxy(this, \"lastIndexOf\", args);\n },\n map(fn, thisArg) {\n return apply(this, \"map\", fn, thisArg, void 0, arguments);\n },\n pop() {\n return noTracking(this, \"pop\");\n },\n push(...args) {\n return noTracking(this, \"push\", args);\n },\n reduce(fn, ...args) {\n return reduce(this, \"reduce\", fn, args);\n },\n reduceRight(fn, ...args) {\n return reduce(this, \"reduceRight\", fn, args);\n },\n shift() {\n return noTracking(this, \"shift\");\n },\n // slice could use ARRAY_ITERATE but also seems to beg for range tracking\n some(fn, thisArg) {\n return apply(this, \"some\", fn, thisArg, void 0, arguments);\n },\n splice(...args) {\n return noTracking(this, \"splice\", args);\n },\n toReversed() {\n return reactiveReadArray(this).toReversed();\n },\n toSorted(comparer) {\n return reactiveReadArray(this).toSorted(comparer);\n },\n toSpliced(...args) {\n return reactiveReadArray(this).toSpliced(...args);\n },\n unshift(...args) {\n return noTracking(this, \"unshift\", args);\n },\n values() {\n return iterator(this, \"values\", (item) => toWrapped(this, item));\n }\n};\nfunction iterator(self, method, wrapValue) {\n const arr = shallowReadArray(self);\n const iter = arr[method]();\n if (arr !== self && !isShallow(self)) {\n iter._next = iter.next;\n iter.next = () => {\n const result = iter._next();\n if (!result.done) {\n result.value = wrapValue(result.value);\n }\n return result;\n };\n }\n return iter;\n}\nconst arrayProto = Array.prototype;\nfunction apply(self, method, fn, thisArg, wrappedRetFn, args) {\n const arr = shallowReadArray(self);\n const needsWrap = arr !== self && !isShallow(self);\n const methodFn = arr[method];\n if (methodFn !== arrayProto[method]) {\n const result2 = methodFn.apply(self, args);\n return needsWrap ? toReactive(result2) : result2;\n }\n let wrappedFn = fn;\n if (arr !== self) {\n if (needsWrap) {\n wrappedFn = function(item, index) {\n return fn.call(this, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 2) {\n wrappedFn = function(item, index) {\n return fn.call(this, item, index, self);\n };\n }\n }\n const result = methodFn.call(arr, wrappedFn, thisArg);\n return needsWrap && wrappedRetFn ? wrappedRetFn(result) : result;\n}\nfunction reduce(self, method, fn, args) {\n const arr = shallowReadArray(self);\n let wrappedFn = fn;\n if (arr !== self) {\n if (!isShallow(self)) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, toWrapped(self, item), index, self);\n };\n } else if (fn.length > 3) {\n wrappedFn = function(acc, item, index) {\n return fn.call(this, acc, item, index, self);\n };\n }\n }\n return arr[method](wrappedFn, ...args);\n}\nfunction searchProxy(self, method, args) {\n const arr = toRaw(self);\n track(arr, \"iterate\", ARRAY_ITERATE_KEY);\n const res = arr[method](...args);\n if ((res === -1 || res === false) && isProxy(args[0])) {\n args[0] = toRaw(args[0]);\n return arr[method](...args);\n }\n return res;\n}\nfunction noTracking(self, method, args = []) {\n pauseTracking();\n startBatch();\n const res = toRaw(self)[method].apply(self, args);\n endBatch();\n resetTracking();\n return res;\n}\n\nconst isNonTrackableKeys = /* @__PURE__ */ makeMap(`__proto__,__v_isRef,__isVue`);\nconst builtInSymbols = new Set(\n /* @__PURE__ */ Object.getOwnPropertyNames(Symbol).filter((key) => key !== \"arguments\" && key !== \"caller\").map((key) => Symbol[key]).filter(isSymbol)\n);\nfunction hasOwnProperty(key) {\n if (!isSymbol(key)) key = String(key);\n const obj = toRaw(this);\n track(obj, \"has\", key);\n return obj.hasOwnProperty(key);\n}\nclass BaseReactiveHandler {\n constructor(_isReadonly = false, _isShallow = false) {\n this._isReadonly = _isReadonly;\n this._isShallow = _isShallow;\n }\n get(target, key, receiver) {\n if (key === \"__v_skip\") return target[\"__v_skip\"];\n const isReadonly2 = this._isReadonly, isShallow2 = this._isShallow;\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_isShallow\") {\n return isShallow2;\n } else if (key === \"__v_raw\") {\n if (receiver === (isReadonly2 ? isShallow2 ? shallowReadonlyMap : readonlyMap : isShallow2 ? shallowReactiveMap : reactiveMap).get(target) || // receiver is not the reactive proxy, but has the same prototype\n // this means the receiver is a user proxy of the reactive proxy\n Object.getPrototypeOf(target) === Object.getPrototypeOf(receiver)) {\n return target;\n }\n return;\n }\n const targetIsArray = isArray(target);\n if (!isReadonly2) {\n let fn;\n if (targetIsArray && (fn = arrayInstrumentations[key])) {\n return fn;\n }\n if (key === \"hasOwnProperty\") {\n return hasOwnProperty;\n }\n }\n const res = Reflect.get(\n target,\n key,\n // if this is a proxy wrapping a ref, return methods using the raw ref\n // as receiver so that we don't have to call `toRaw` on the ref in all\n // its class methods\n isRef(target) ? target : receiver\n );\n if (isSymbol(key) ? builtInSymbols.has(key) : isNonTrackableKeys(key)) {\n return res;\n }\n if (!isReadonly2) {\n track(target, \"get\", key);\n }\n if (isShallow2) {\n return res;\n }\n if (isRef(res)) {\n const value = targetIsArray && isIntegerKey(key) ? res : res.value;\n return isReadonly2 && isObject(value) ? readonly(value) : value;\n }\n if (isObject(res)) {\n return isReadonly2 ? readonly(res) : reactive(res);\n }\n return res;\n }\n}\nclass MutableReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(false, isShallow2);\n }\n set(target, key, value, receiver) {\n let oldValue = target[key];\n const isArrayWithIntegerKey = isArray(target) && isIntegerKey(key);\n if (!this._isShallow) {\n const isOldValueReadonly = isReadonly(oldValue);\n if (!isShallow(value) && !isReadonly(value)) {\n oldValue = toRaw(oldValue);\n value = toRaw(value);\n }\n if (!isArrayWithIntegerKey && isRef(oldValue) && !isRef(value)) {\n if (isOldValueReadonly) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target[key]\n );\n }\n return true;\n } else {\n oldValue.value = value;\n return true;\n }\n }\n }\n const hadKey = isArrayWithIntegerKey ? Number(key) < target.length : hasOwn(target, key);\n const result = Reflect.set(\n target,\n key,\n value,\n isRef(target) ? target : receiver\n );\n if (target === toRaw(receiver)) {\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n }\n return result;\n }\n deleteProperty(target, key) {\n const hadKey = hasOwn(target, key);\n const oldValue = target[key];\n const result = Reflect.deleteProperty(target, key);\n if (result && hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n }\n has(target, key) {\n const result = Reflect.has(target, key);\n if (!isSymbol(key) || !builtInSymbols.has(key)) {\n track(target, \"has\", key);\n }\n return result;\n }\n ownKeys(target) {\n track(\n target,\n \"iterate\",\n isArray(target) ? \"length\" : ITERATE_KEY\n );\n return Reflect.ownKeys(target);\n }\n}\nclass ReadonlyReactiveHandler extends BaseReactiveHandler {\n constructor(isShallow2 = false) {\n super(true, isShallow2);\n }\n set(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Set operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n deleteProperty(target, key) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `Delete operation on key \"${String(key)}\" failed: target is readonly.`,\n target\n );\n }\n return true;\n }\n}\nconst mutableHandlers = /* @__PURE__ */ new MutableReactiveHandler();\nconst readonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler();\nconst shallowReactiveHandlers = /* @__PURE__ */ new MutableReactiveHandler(true);\nconst shallowReadonlyHandlers = /* @__PURE__ */ new ReadonlyReactiveHandler(true);\n\nconst toShallow = (value) => value;\nconst getProto = (v) => Reflect.getPrototypeOf(v);\nfunction createIterableMethod(method, isReadonly2, isShallow2) {\n return function(...args) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const targetIsMap = isMap(rawTarget);\n const isPair = method === \"entries\" || method === Symbol.iterator && targetIsMap;\n const isKeyOnly = method === \"keys\" && targetIsMap;\n const innerIterator = target[method](...args);\n const wrap = isShallow2 ? toShallow : isReadonly2 ? toReadonly : toReactive;\n !isReadonly2 && track(\n rawTarget,\n \"iterate\",\n isKeyOnly ? MAP_KEY_ITERATE_KEY : ITERATE_KEY\n );\n return {\n // iterator protocol\n next() {\n const { value, done } = innerIterator.next();\n return done ? { value, done } : {\n value: isPair ? [wrap(value[0]), wrap(value[1])] : wrap(value),\n done\n };\n },\n // iterable protocol\n [Symbol.iterator]() {\n return this;\n }\n };\n };\n}\nfunction createReadonlyMethod(type) {\n return function(...args) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const key = args[0] ? `on key \"${args[0]}\" ` : ``;\n warn(\n `${capitalize(type)} operation ${key}failed: target is readonly.`,\n toRaw(this)\n );\n }\n return type === \"delete\" ? false : type === \"clear\" ? void 0 : this;\n };\n}\nfunction createInstrumentations(readonly, shallow) {\n const instrumentations = {\n get(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"get\", key);\n }\n track(rawTarget, \"get\", rawKey);\n }\n const { has } = getProto(rawTarget);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n if (has.call(rawTarget, key)) {\n return wrap(target.get(key));\n } else if (has.call(rawTarget, rawKey)) {\n return wrap(target.get(rawKey));\n } else if (target !== rawTarget) {\n target.get(key);\n }\n },\n get size() {\n const target = this[\"__v_raw\"];\n !readonly && track(toRaw(target), \"iterate\", ITERATE_KEY);\n return target.size;\n },\n has(key) {\n const target = this[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const rawKey = toRaw(key);\n if (!readonly) {\n if (hasChanged(key, rawKey)) {\n track(rawTarget, \"has\", key);\n }\n track(rawTarget, \"has\", rawKey);\n }\n return key === rawKey ? target.has(key) : target.has(key) || target.has(rawKey);\n },\n forEach(callback, thisArg) {\n const observed = this;\n const target = observed[\"__v_raw\"];\n const rawTarget = toRaw(target);\n const wrap = shallow ? toShallow : readonly ? toReadonly : toReactive;\n !readonly && track(rawTarget, \"iterate\", ITERATE_KEY);\n return target.forEach((value, key) => {\n return callback.call(thisArg, wrap(value), wrap(key), observed);\n });\n }\n };\n extend(\n instrumentations,\n readonly ? {\n add: createReadonlyMethod(\"add\"),\n set: createReadonlyMethod(\"set\"),\n delete: createReadonlyMethod(\"delete\"),\n clear: createReadonlyMethod(\"clear\")\n } : {\n add(value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const proto = getProto(target);\n const hadKey = proto.has.call(target, value);\n if (!hadKey) {\n target.add(value);\n trigger(target, \"add\", value, value);\n }\n return this;\n },\n set(key, value) {\n if (!shallow && !isShallow(value) && !isReadonly(value)) {\n value = toRaw(value);\n }\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get.call(target, key);\n target.set(key, value);\n if (!hadKey) {\n trigger(target, \"add\", key, value);\n } else if (hasChanged(value, oldValue)) {\n trigger(target, \"set\", key, value, oldValue);\n }\n return this;\n },\n delete(key) {\n const target = toRaw(this);\n const { has, get } = getProto(target);\n let hadKey = has.call(target, key);\n if (!hadKey) {\n key = toRaw(key);\n hadKey = has.call(target, key);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n checkIdentityKeys(target, has, key);\n }\n const oldValue = get ? get.call(target, key) : void 0;\n const result = target.delete(key);\n if (hadKey) {\n trigger(target, \"delete\", key, void 0, oldValue);\n }\n return result;\n },\n clear() {\n const target = toRaw(this);\n const hadItems = target.size !== 0;\n const oldTarget = !!(process.env.NODE_ENV !== \"production\") ? isMap(target) ? new Map(target) : new Set(target) : void 0;\n const result = target.clear();\n if (hadItems) {\n trigger(\n target,\n \"clear\",\n void 0,\n void 0,\n oldTarget\n );\n }\n return result;\n }\n }\n );\n const iteratorMethods = [\n \"keys\",\n \"values\",\n \"entries\",\n Symbol.iterator\n ];\n iteratorMethods.forEach((method) => {\n instrumentations[method] = createIterableMethod(method, readonly, shallow);\n });\n return instrumentations;\n}\nfunction createInstrumentationGetter(isReadonly2, shallow) {\n const instrumentations = createInstrumentations(isReadonly2, shallow);\n return (target, key, receiver) => {\n if (key === \"__v_isReactive\") {\n return !isReadonly2;\n } else if (key === \"__v_isReadonly\") {\n return isReadonly2;\n } else if (key === \"__v_raw\") {\n return target;\n }\n return Reflect.get(\n hasOwn(instrumentations, key) && key in target ? instrumentations : target,\n key,\n receiver\n );\n };\n}\nconst mutableCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, false)\n};\nconst shallowCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(false, true)\n};\nconst readonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, false)\n};\nconst shallowReadonlyCollectionHandlers = {\n get: /* @__PURE__ */ createInstrumentationGetter(true, true)\n};\nfunction checkIdentityKeys(target, has, key) {\n const rawKey = toRaw(key);\n if (rawKey !== key && has.call(target, rawKey)) {\n const type = toRawType(target);\n warn(\n `Reactive ${type} contains both the raw and reactive versions of the same object${type === `Map` ? ` as keys` : ``}, which can lead to inconsistencies. Avoid differentiating between the raw and reactive versions of an object and only use the reactive version if possible.`\n );\n }\n}\n\nconst reactiveMap = /* @__PURE__ */ new WeakMap();\nconst shallowReactiveMap = /* @__PURE__ */ new WeakMap();\nconst readonlyMap = /* @__PURE__ */ new WeakMap();\nconst shallowReadonlyMap = /* @__PURE__ */ new WeakMap();\nfunction targetTypeMap(rawType) {\n switch (rawType) {\n case \"Object\":\n case \"Array\":\n return 1 /* COMMON */;\n case \"Map\":\n case \"Set\":\n case \"WeakMap\":\n case \"WeakSet\":\n return 2 /* COLLECTION */;\n default:\n return 0 /* INVALID */;\n }\n}\nfunction getTargetType(value) {\n return value[\"__v_skip\"] || !Object.isExtensible(value) ? 0 /* INVALID */ : targetTypeMap(toRawType(value));\n}\nfunction reactive(target) {\n if (isReadonly(target)) {\n return target;\n }\n return createReactiveObject(\n target,\n false,\n mutableHandlers,\n mutableCollectionHandlers,\n reactiveMap\n );\n}\nfunction shallowReactive(target) {\n return createReactiveObject(\n target,\n false,\n shallowReactiveHandlers,\n shallowCollectionHandlers,\n shallowReactiveMap\n );\n}\nfunction readonly(target) {\n return createReactiveObject(\n target,\n true,\n readonlyHandlers,\n readonlyCollectionHandlers,\n readonlyMap\n );\n}\nfunction shallowReadonly(target) {\n return createReactiveObject(\n target,\n true,\n shallowReadonlyHandlers,\n shallowReadonlyCollectionHandlers,\n shallowReadonlyMap\n );\n}\nfunction createReactiveObject(target, isReadonly2, baseHandlers, collectionHandlers, proxyMap) {\n if (!isObject(target)) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\n `value cannot be made ${isReadonly2 ? \"readonly\" : \"reactive\"}: ${String(\n target\n )}`\n );\n }\n return target;\n }\n if (target[\"__v_raw\"] && !(isReadonly2 && target[\"__v_isReactive\"])) {\n return target;\n }\n const targetType = getTargetType(target);\n if (targetType === 0 /* INVALID */) {\n return target;\n }\n const existingProxy = proxyMap.get(target);\n if (existingProxy) {\n return existingProxy;\n }\n const proxy = new Proxy(\n target,\n targetType === 2 /* COLLECTION */ ? collectionHandlers : baseHandlers\n );\n proxyMap.set(target, proxy);\n return proxy;\n}\nfunction isReactive(value) {\n if (isReadonly(value)) {\n return isReactive(value[\"__v_raw\"]);\n }\n return !!(value && value[\"__v_isReactive\"]);\n}\nfunction isReadonly(value) {\n return !!(value && value[\"__v_isReadonly\"]);\n}\nfunction isShallow(value) {\n return !!(value && value[\"__v_isShallow\"]);\n}\nfunction isProxy(value) {\n return value ? !!value[\"__v_raw\"] : false;\n}\nfunction toRaw(observed) {\n const raw = observed && observed[\"__v_raw\"];\n return raw ? toRaw(raw) : observed;\n}\nfunction markRaw(value) {\n if (!hasOwn(value, \"__v_skip\") && Object.isExtensible(value)) {\n def(value, \"__v_skip\", true);\n }\n return value;\n}\nconst toReactive = (value) => isObject(value) ? reactive(value) : value;\nconst toReadonly = (value) => isObject(value) ? readonly(value) : value;\n\nfunction isRef(r) {\n return r ? r[\"__v_isRef\"] === true : false;\n}\nfunction ref(value) {\n return createRef(value, false);\n}\nfunction shallowRef(value) {\n return createRef(value, true);\n}\nfunction createRef(rawValue, shallow) {\n if (isRef(rawValue)) {\n return rawValue;\n }\n return new RefImpl(rawValue, shallow);\n}\nclass RefImpl {\n constructor(value, isShallow2) {\n this.dep = new Dep();\n this[\"__v_isRef\"] = true;\n this[\"__v_isShallow\"] = false;\n this._rawValue = isShallow2 ? value : toRaw(value);\n this._value = isShallow2 ? value : toReactive(value);\n this[\"__v_isShallow\"] = isShallow2;\n }\n get value() {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n });\n } else {\n this.dep.track();\n }\n return this._value;\n }\n set value(newValue) {\n const oldValue = this._rawValue;\n const useDirectValue = this[\"__v_isShallow\"] || isShallow(newValue) || isReadonly(newValue);\n newValue = useDirectValue ? newValue : toRaw(newValue);\n if (hasChanged(newValue, oldValue)) {\n this._rawValue = newValue;\n this._value = useDirectValue ? newValue : toReactive(newValue);\n if (!!(process.env.NODE_ENV !== \"production\")) {\n this.dep.trigger({\n target: this,\n type: \"set\",\n key: \"value\",\n newValue,\n oldValue\n });\n } else {\n this.dep.trigger();\n }\n }\n }\n}\nfunction triggerRef(ref2) {\n if (ref2.dep) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n ref2.dep.trigger({\n target: ref2,\n type: \"set\",\n key: \"value\",\n newValue: ref2._value\n });\n } else {\n ref2.dep.trigger();\n }\n }\n}\nfunction unref(ref2) {\n return isRef(ref2) ? ref2.value : ref2;\n}\nfunction toValue(source) {\n return isFunction(source) ? source() : unref(source);\n}\nconst shallowUnwrapHandlers = {\n get: (target, key, receiver) => key === \"__v_raw\" ? target : unref(Reflect.get(target, key, receiver)),\n set: (target, key, value, receiver) => {\n const oldValue = target[key];\n if (isRef(oldValue) && !isRef(value)) {\n oldValue.value = value;\n return true;\n } else {\n return Reflect.set(target, key, value, receiver);\n }\n }\n};\nfunction proxyRefs(objectWithRefs) {\n return isReactive(objectWithRefs) ? objectWithRefs : new Proxy(objectWithRefs, shallowUnwrapHandlers);\n}\nclass CustomRefImpl {\n constructor(factory) {\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n const dep = this.dep = new Dep();\n const { get, set } = factory(dep.track.bind(dep), dep.trigger.bind(dep));\n this._get = get;\n this._set = set;\n }\n get value() {\n return this._value = this._get();\n }\n set value(newVal) {\n this._set(newVal);\n }\n}\nfunction customRef(factory) {\n return new CustomRefImpl(factory);\n}\nfunction toRefs(object) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isProxy(object)) {\n warn(`toRefs() expects a reactive object but received a plain one.`);\n }\n const ret = isArray(object) ? new Array(object.length) : {};\n for (const key in object) {\n ret[key] = propertyToRef(object, key);\n }\n return ret;\n}\nclass ObjectRefImpl {\n constructor(_object, _key, _defaultValue) {\n this._object = _object;\n this._key = _key;\n this._defaultValue = _defaultValue;\n this[\"__v_isRef\"] = true;\n this._value = void 0;\n this._raw = toRaw(_object);\n let shallow = true;\n let obj = _object;\n if (!isArray(_object) || !isIntegerKey(String(_key))) {\n do {\n shallow = !isProxy(obj) || isShallow(obj);\n } while (shallow && (obj = obj[\"__v_raw\"]));\n }\n this._shallow = shallow;\n }\n get value() {\n let val = this._object[this._key];\n if (this._shallow) {\n val = unref(val);\n }\n return this._value = val === void 0 ? this._defaultValue : val;\n }\n set value(newVal) {\n if (this._shallow && isRef(this._raw[this._key])) {\n const nestedRef = this._object[this._key];\n if (isRef(nestedRef)) {\n nestedRef.value = newVal;\n return;\n }\n }\n this._object[this._key] = newVal;\n }\n get dep() {\n return getDepFromReactive(this._raw, this._key);\n }\n}\nclass GetterRefImpl {\n constructor(_getter) {\n this._getter = _getter;\n this[\"__v_isRef\"] = true;\n this[\"__v_isReadonly\"] = true;\n this._value = void 0;\n }\n get value() {\n return this._value = this._getter();\n }\n}\nfunction toRef(source, key, defaultValue) {\n if (isRef(source)) {\n return source;\n } else if (isFunction(source)) {\n return new GetterRefImpl(source);\n } else if (isObject(source) && arguments.length > 1) {\n return propertyToRef(source, key, defaultValue);\n } else {\n return ref(source);\n }\n}\nfunction propertyToRef(source, key, defaultValue) {\n return new ObjectRefImpl(source, key, defaultValue);\n}\n\nclass ComputedRefImpl {\n constructor(fn, setter, isSSR) {\n this.fn = fn;\n this.setter = setter;\n /**\n * @internal\n */\n this._value = void 0;\n /**\n * @internal\n */\n this.dep = new Dep(this);\n /**\n * @internal\n */\n this.__v_isRef = true;\n // TODO isolatedDeclarations \"__v_isReadonly\"\n // A computed is also a subscriber that tracks other deps\n /**\n * @internal\n */\n this.deps = void 0;\n /**\n * @internal\n */\n this.depsTail = void 0;\n /**\n * @internal\n */\n this.flags = 16;\n /**\n * @internal\n */\n this.globalVersion = globalVersion - 1;\n /**\n * @internal\n */\n this.next = void 0;\n // for backwards compat\n this.effect = this;\n this[\"__v_isReadonly\"] = !setter;\n this.isSSR = isSSR;\n }\n /**\n * @internal\n */\n notify() {\n this.flags |= 16;\n if (!(this.flags & 8) && // avoid infinite self recursion\n activeSub !== this) {\n batch(this, true);\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\")) ;\n }\n get value() {\n const link = !!(process.env.NODE_ENV !== \"production\") ? this.dep.track({\n target: this,\n type: \"get\",\n key: \"value\"\n }) : this.dep.track();\n refreshComputed(this);\n if (link) {\n link.version = this.dep.version;\n }\n return this._value;\n }\n set value(newValue) {\n if (this.setter) {\n this.setter(newValue);\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn(\"Write operation failed: computed value is readonly\");\n }\n }\n}\nfunction computed(getterOrOptions, debugOptions, isSSR = false) {\n let getter;\n let setter;\n if (isFunction(getterOrOptions)) {\n getter = getterOrOptions;\n } else {\n getter = getterOrOptions.get;\n setter = getterOrOptions.set;\n }\n const cRef = new ComputedRefImpl(getter, setter, isSSR);\n if (!!(process.env.NODE_ENV !== \"production\") && debugOptions && !isSSR) {\n cRef.onTrack = debugOptions.onTrack;\n cRef.onTrigger = debugOptions.onTrigger;\n }\n return cRef;\n}\n\nconst TrackOpTypes = {\n \"GET\": \"get\",\n \"HAS\": \"has\",\n \"ITERATE\": \"iterate\"\n};\nconst TriggerOpTypes = {\n \"SET\": \"set\",\n \"ADD\": \"add\",\n \"DELETE\": \"delete\",\n \"CLEAR\": \"clear\"\n};\nconst ReactiveFlags = {\n \"SKIP\": \"__v_skip\",\n \"IS_REACTIVE\": \"__v_isReactive\",\n \"IS_READONLY\": \"__v_isReadonly\",\n \"IS_SHALLOW\": \"__v_isShallow\",\n \"RAW\": \"__v_raw\",\n \"IS_REF\": \"__v_isRef\"\n};\n\nconst WatchErrorCodes = {\n \"WATCH_GETTER\": 2,\n \"2\": \"WATCH_GETTER\",\n \"WATCH_CALLBACK\": 3,\n \"3\": \"WATCH_CALLBACK\",\n \"WATCH_CLEANUP\": 4,\n \"4\": \"WATCH_CLEANUP\"\n};\nconst INITIAL_WATCHER_VALUE = {};\nconst cleanupMap = /* @__PURE__ */ new WeakMap();\nlet activeWatcher = void 0;\nfunction getCurrentWatcher() {\n return activeWatcher;\n}\nfunction onWatcherCleanup(cleanupFn, failSilently = false, owner = activeWatcher) {\n if (owner) {\n let cleanups = cleanupMap.get(owner);\n if (!cleanups) cleanupMap.set(owner, cleanups = []);\n cleanups.push(cleanupFn);\n } else if (!!(process.env.NODE_ENV !== \"production\") && !failSilently) {\n warn(\n `onWatcherCleanup() was called when there was no active watcher to associate with.`\n );\n }\n}\nfunction watch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, once, scheduler, augmentJob, call } = options;\n const warnInvalidSource = (s) => {\n (options.onWarn || warn)(\n `Invalid watch source: `,\n s,\n `A watch source can only be a getter/effect function, a ref, a reactive object, or an array of these types.`\n );\n };\n const reactiveGetter = (source2) => {\n if (deep) return source2;\n if (isShallow(source2) || deep === false || deep === 0)\n return traverse(source2, 1);\n return traverse(source2);\n };\n let effect;\n let getter;\n let cleanup;\n let boundCleanup;\n let forceTrigger = false;\n let isMultiSource = false;\n if (isRef(source)) {\n getter = () => source.value;\n forceTrigger = isShallow(source);\n } else if (isReactive(source)) {\n getter = () => reactiveGetter(source);\n forceTrigger = true;\n } else if (isArray(source)) {\n isMultiSource = true;\n forceTrigger = source.some((s) => isReactive(s) || isShallow(s));\n getter = () => source.map((s) => {\n if (isRef(s)) {\n return s.value;\n } else if (isReactive(s)) {\n return reactiveGetter(s);\n } else if (isFunction(s)) {\n return call ? call(s, 2) : s();\n } else {\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(s);\n }\n });\n } else if (isFunction(source)) {\n if (cb) {\n getter = call ? () => call(source, 2) : source;\n } else {\n getter = () => {\n if (cleanup) {\n pauseTracking();\n try {\n cleanup();\n } finally {\n resetTracking();\n }\n }\n const currentEffect = activeWatcher;\n activeWatcher = effect;\n try {\n return call ? call(source, 3, [boundCleanup]) : source(boundCleanup);\n } finally {\n activeWatcher = currentEffect;\n }\n };\n }\n } else {\n getter = NOOP;\n !!(process.env.NODE_ENV !== \"production\") && warnInvalidSource(source);\n }\n if (cb && deep) {\n const baseGetter = getter;\n const depth = deep === true ? Infinity : deep;\n getter = () => traverse(baseGetter(), depth);\n }\n const scope = getCurrentScope();\n const watchHandle = () => {\n effect.stop();\n if (scope && scope.active) {\n remove(scope.effects, effect);\n }\n };\n if (once && cb) {\n const _cb = cb;\n cb = (...args) => {\n _cb(...args);\n watchHandle();\n };\n }\n let oldValue = isMultiSource ? new Array(source.length).fill(INITIAL_WATCHER_VALUE) : INITIAL_WATCHER_VALUE;\n const job = (immediateFirstRun) => {\n if (!(effect.flags & 1) || !effect.dirty && !immediateFirstRun) {\n return;\n }\n if (cb) {\n const newValue = effect.run();\n if (deep || forceTrigger || (isMultiSource ? newValue.some((v, i) => hasChanged(v, oldValue[i])) : hasChanged(newValue, oldValue))) {\n if (cleanup) {\n cleanup();\n }\n const currentWatcher = activeWatcher;\n activeWatcher = effect;\n try {\n const args = [\n newValue,\n // pass undefined as the old value when it's changed for the first time\n oldValue === INITIAL_WATCHER_VALUE ? void 0 : isMultiSource && oldValue[0] === INITIAL_WATCHER_VALUE ? [] : oldValue,\n boundCleanup\n ];\n oldValue = newValue;\n call ? call(cb, 3, args) : (\n // @ts-expect-error\n cb(...args)\n );\n } finally {\n activeWatcher = currentWatcher;\n }\n }\n } else {\n effect.run();\n }\n };\n if (augmentJob) {\n augmentJob(job);\n }\n effect = new ReactiveEffect(getter);\n effect.scheduler = scheduler ? () => scheduler(job, false) : job;\n boundCleanup = (fn) => onWatcherCleanup(fn, false, effect);\n cleanup = effect.onStop = () => {\n const cleanups = cleanupMap.get(effect);\n if (cleanups) {\n if (call) {\n call(cleanups, 4);\n } else {\n for (const cleanup2 of cleanups) cleanup2();\n }\n cleanupMap.delete(effect);\n }\n };\n if (!!(process.env.NODE_ENV !== \"production\")) {\n effect.onTrack = options.onTrack;\n effect.onTrigger = options.onTrigger;\n }\n if (cb) {\n if (immediate) {\n job(true);\n } else {\n oldValue = effect.run();\n }\n } else if (scheduler) {\n scheduler(job.bind(null, true), true);\n } else {\n effect.run();\n }\n watchHandle.pause = effect.pause.bind(effect);\n watchHandle.resume = effect.resume.bind(effect);\n watchHandle.stop = watchHandle;\n return watchHandle;\n}\nfunction traverse(value, depth = Infinity, seen) {\n if (depth <= 0 || !isObject(value) || value[\"__v_skip\"]) {\n return value;\n }\n seen = seen || /* @__PURE__ */ new Map();\n if ((seen.get(value) || 0) >= depth) {\n return value;\n }\n seen.set(value, depth);\n depth--;\n if (isRef(value)) {\n traverse(value.value, depth, seen);\n } else if (isArray(value)) {\n for (let i = 0; i < value.length; i++) {\n traverse(value[i], depth, seen);\n }\n } else if (isSet(value) || isMap(value)) {\n value.forEach((v) => {\n traverse(v, depth, seen);\n });\n } else if (isPlainObject(value)) {\n for (const key in value) {\n traverse(value[key], depth, seen);\n }\n for (const key of Object.getOwnPropertySymbols(value)) {\n if (Object.prototype.propertyIsEnumerable.call(value, key)) {\n traverse(value[key], depth, seen);\n }\n }\n }\n return value;\n}\n\nexport { ARRAY_ITERATE_KEY, EffectFlags, EffectScope, ITERATE_KEY, MAP_KEY_ITERATE_KEY, ReactiveEffect, ReactiveFlags, TrackOpTypes, TriggerOpTypes, WatchErrorCodes, computed, customRef, effect, effectScope, enableTracking, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onEffectCleanup, onScopeDispose, onWatcherCleanup, pauseTracking, proxyRefs, reactive, reactiveReadArray, readonly, ref, resetTracking, shallowReactive, shallowReadArray, shallowReadonly, shallowRef, stop, toRaw, toReactive, toReadonly, toRef, toRefs, toValue, track, traverse, trigger, triggerRef, unref, watch };\n","/**\n* @vue/runtime-core v3.5.26\n* (c) 2018-present Yuxi (Evan) You and Vue contributors\n* @license MIT\n**/\nimport { pauseTracking, resetTracking, isRef, toRaw, traverse, watch as watch$1, shallowRef, readonly, isReactive, ref, isShallow, isReadonly, shallowReadArray, toReadonly, toReactive, shallowReadonly, track, reactive, customRef, shallowReactive, trigger, ReactiveEffect, isProxy, proxyRefs, markRaw, EffectScope, computed as computed$1 } from '@vue/reactivity';\nexport { EffectScope, ReactiveEffect, TrackOpTypes, TriggerOpTypes, customRef, effect, effectScope, getCurrentScope, getCurrentWatcher, isProxy, isReactive, isReadonly, isRef, isShallow, markRaw, onScopeDispose, onWatcherCleanup, proxyRefs, reactive, readonly, ref, shallowReactive, shallowReadonly, shallowRef, stop, toRaw, toRef, toRefs, toValue, triggerRef, unref } from '@vue/reactivity';\nimport { isString, isFunction, EMPTY_OBJ, isPromise, isArray, NOOP, getGlobalThis, extend, isBuiltInDirective, NO, hasOwn, remove, def, isOn, isReservedProp, normalizeClass, stringifyStyle, normalizeStyle, isKnownSvgAttr, isBooleanAttr, isKnownHtmlAttr, includeBooleanAttr, isRenderableAttrValue, normalizeCssVarValue, getEscapedCssVarName, isObject, isRegExp, invokeArrayFns, toHandlerKey, camelize, capitalize, isSymbol, isGloballyAllowed, hyphenate, hasChanged, looseToNumber, isModelListener, EMPTY_ARR, makeMap, toRawType, toNumber } from '@vue/shared';\nexport { camelize, capitalize, normalizeClass, normalizeProps, normalizeStyle, toDisplayString, toHandlerKey } from '@vue/shared';\n\nconst stack = [];\nfunction pushWarningContext(vnode) {\n stack.push(vnode);\n}\nfunction popWarningContext() {\n stack.pop();\n}\nlet isWarning = false;\nfunction warn$1(msg, ...args) {\n if (isWarning) return;\n isWarning = true;\n pauseTracking();\n const instance = stack.length ? stack[stack.length - 1].component : null;\n const appWarnHandler = instance && instance.appContext.config.warnHandler;\n const trace = getComponentTrace();\n if (appWarnHandler) {\n callWithErrorHandling(\n appWarnHandler,\n instance,\n 11,\n [\n // eslint-disable-next-line no-restricted-syntax\n msg + args.map((a) => {\n var _a, _b;\n return (_b = (_a = a.toString) == null ? void 0 : _a.call(a)) != null ? _b : JSON.stringify(a);\n }).join(\"\"),\n instance && instance.proxy,\n trace.map(\n ({ vnode }) => `at <${formatComponentName(instance, vnode.type)}>`\n ).join(\"\\n\"),\n trace\n ]\n );\n } else {\n const warnArgs = [`[Vue warn]: ${msg}`, ...args];\n if (trace.length && // avoid spamming console during tests\n true) {\n warnArgs.push(`\n`, ...formatTrace(trace));\n }\n console.warn(...warnArgs);\n }\n resetTracking();\n isWarning = false;\n}\nfunction getComponentTrace() {\n let currentVNode = stack[stack.length - 1];\n if (!currentVNode) {\n return [];\n }\n const normalizedStack = [];\n while (currentVNode) {\n const last = normalizedStack[0];\n if (last && last.vnode === currentVNode) {\n last.recurseCount++;\n } else {\n normalizedStack.push({\n vnode: currentVNode,\n recurseCount: 0\n });\n }\n const parentInstance = currentVNode.component && currentVNode.component.parent;\n currentVNode = parentInstance && parentInstance.vnode;\n }\n return normalizedStack;\n}\nfunction formatTrace(trace) {\n const logs = [];\n trace.forEach((entry, i) => {\n logs.push(...i === 0 ? [] : [`\n`], ...formatTraceEntry(entry));\n });\n return logs;\n}\nfunction formatTraceEntry({ vnode, recurseCount }) {\n const postfix = recurseCount > 0 ? `... (${recurseCount} recursive calls)` : ``;\n const isRoot = vnode.component ? vnode.component.parent == null : false;\n const open = ` at <${formatComponentName(\n vnode.component,\n vnode.type,\n isRoot\n )}`;\n const close = `>` + postfix;\n return vnode.props ? [open, ...formatProps(vnode.props), close] : [open + close];\n}\nfunction formatProps(props) {\n const res = [];\n const keys = Object.keys(props);\n keys.slice(0, 3).forEach((key) => {\n res.push(...formatProp(key, props[key]));\n });\n if (keys.length > 3) {\n res.push(` ...`);\n }\n return res;\n}\nfunction formatProp(key, value, raw) {\n if (isString(value)) {\n value = JSON.stringify(value);\n return raw ? value : [`${key}=${value}`];\n } else if (typeof value === \"number\" || typeof value === \"boolean\" || value == null) {\n return raw ? value : [`${key}=${value}`];\n } else if (isRef(value)) {\n value = formatProp(key, toRaw(value.value), true);\n return raw ? value : [`${key}=Ref<`, value, `>`];\n } else if (isFunction(value)) {\n return [`${key}=fn${value.name ? `<${value.name}>` : ``}`];\n } else {\n value = toRaw(value);\n return raw ? value : [`${key}=`, value];\n }\n}\nfunction assertNumber(val, type) {\n if (!!!(process.env.NODE_ENV !== \"production\")) return;\n if (val === void 0) {\n return;\n } else if (typeof val !== \"number\") {\n warn$1(`${type} is not a valid number - got ${JSON.stringify(val)}.`);\n } else if (isNaN(val)) {\n warn$1(`${type} is NaN - the duration expression might be incorrect.`);\n }\n}\n\nconst ErrorCodes = {\n \"SETUP_FUNCTION\": 0,\n \"0\": \"SETUP_FUNCTION\",\n \"RENDER_FUNCTION\": 1,\n \"1\": \"RENDER_FUNCTION\",\n \"NATIVE_EVENT_HANDLER\": 5,\n \"5\": \"NATIVE_EVENT_HANDLER\",\n \"COMPONENT_EVENT_HANDLER\": 6,\n \"6\": \"COMPONENT_EVENT_HANDLER\",\n \"VNODE_HOOK\": 7,\n \"7\": \"VNODE_HOOK\",\n \"DIRECTIVE_HOOK\": 8,\n \"8\": \"DIRECTIVE_HOOK\",\n \"TRANSITION_HOOK\": 9,\n \"9\": \"TRANSITION_HOOK\",\n \"APP_ERROR_HANDLER\": 10,\n \"10\": \"APP_ERROR_HANDLER\",\n \"APP_WARN_HANDLER\": 11,\n \"11\": \"APP_WARN_HANDLER\",\n \"FUNCTION_REF\": 12,\n \"12\": \"FUNCTION_REF\",\n \"ASYNC_COMPONENT_LOADER\": 13,\n \"13\": \"ASYNC_COMPONENT_LOADER\",\n \"SCHEDULER\": 14,\n \"14\": \"SCHEDULER\",\n \"COMPONENT_UPDATE\": 15,\n \"15\": \"COMPONENT_UPDATE\",\n \"APP_UNMOUNT_CLEANUP\": 16,\n \"16\": \"APP_UNMOUNT_CLEANUP\"\n};\nconst ErrorTypeStrings$1 = {\n [\"sp\"]: \"serverPrefetch hook\",\n [\"bc\"]: \"beforeCreate hook\",\n [\"c\"]: \"created hook\",\n [\"bm\"]: \"beforeMount hook\",\n [\"m\"]: \"mounted hook\",\n [\"bu\"]: \"beforeUpdate hook\",\n [\"u\"]: \"updated\",\n [\"bum\"]: \"beforeUnmount hook\",\n [\"um\"]: \"unmounted hook\",\n [\"a\"]: \"activated hook\",\n [\"da\"]: \"deactivated hook\",\n [\"ec\"]: \"errorCaptured hook\",\n [\"rtc\"]: \"renderTracked hook\",\n [\"rtg\"]: \"renderTriggered hook\",\n [0]: \"setup function\",\n [1]: \"render function\",\n [2]: \"watcher getter\",\n [3]: \"watcher callback\",\n [4]: \"watcher cleanup function\",\n [5]: \"native event handler\",\n [6]: \"component event handler\",\n [7]: \"vnode hook\",\n [8]: \"directive hook\",\n [9]: \"transition hook\",\n [10]: \"app errorHandler\",\n [11]: \"app warnHandler\",\n [12]: \"ref function\",\n [13]: \"async component loader\",\n [14]: \"scheduler flush\",\n [15]: \"component update\",\n [16]: \"app unmount cleanup function\"\n};\nfunction callWithErrorHandling(fn, instance, type, args) {\n try {\n return args ? fn(...args) : fn();\n } catch (err) {\n handleError(err, instance, type);\n }\n}\nfunction callWithAsyncErrorHandling(fn, instance, type, args) {\n if (isFunction(fn)) {\n const res = callWithErrorHandling(fn, instance, type, args);\n if (res && isPromise(res)) {\n res.catch((err) => {\n handleError(err, instance, type);\n });\n }\n return res;\n }\n if (isArray(fn)) {\n const values = [];\n for (let i = 0; i < fn.length; i++) {\n values.push(callWithAsyncErrorHandling(fn[i], instance, type, args));\n }\n return values;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Invalid value type passed to callWithAsyncErrorHandling(): ${typeof fn}`\n );\n }\n}\nfunction handleError(err, instance, type, throwInDev = true) {\n const contextVNode = instance ? instance.vnode : null;\n const { errorHandler, throwUnhandledErrorInProduction } = instance && instance.appContext.config || EMPTY_OBJ;\n if (instance) {\n let cur = instance.parent;\n const exposedInstance = instance.proxy;\n const errorInfo = !!(process.env.NODE_ENV !== \"production\") ? ErrorTypeStrings$1[type] : `https://vuejs.org/error-reference/#runtime-${type}`;\n while (cur) {\n const errorCapturedHooks = cur.ec;\n if (errorCapturedHooks) {\n for (let i = 0; i < errorCapturedHooks.length; i++) {\n if (errorCapturedHooks[i](err, exposedInstance, errorInfo) === false) {\n return;\n }\n }\n }\n cur = cur.parent;\n }\n if (errorHandler) {\n pauseTracking();\n callWithErrorHandling(errorHandler, null, 10, [\n err,\n exposedInstance,\n errorInfo\n ]);\n resetTracking();\n return;\n }\n }\n logError(err, type, contextVNode, throwInDev, throwUnhandledErrorInProduction);\n}\nfunction logError(err, type, contextVNode, throwInDev = true, throwInProd = false) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n const info = ErrorTypeStrings$1[type];\n if (contextVNode) {\n pushWarningContext(contextVNode);\n }\n warn$1(`Unhandled error${info ? ` during execution of ${info}` : ``}`);\n if (contextVNode) {\n popWarningContext();\n }\n if (throwInDev) {\n throw err;\n } else {\n console.error(err);\n }\n } else if (throwInProd) {\n throw err;\n } else {\n console.error(err);\n }\n}\n\nconst queue = [];\nlet flushIndex = -1;\nconst pendingPostFlushCbs = [];\nlet activePostFlushCbs = null;\nlet postFlushIndex = 0;\nconst resolvedPromise = /* @__PURE__ */ Promise.resolve();\nlet currentFlushPromise = null;\nconst RECURSION_LIMIT = 100;\nfunction nextTick(fn) {\n const p = currentFlushPromise || resolvedPromise;\n return fn ? p.then(this ? fn.bind(this) : fn) : p;\n}\nfunction findInsertionIndex(id) {\n let start = flushIndex + 1;\n let end = queue.length;\n while (start < end) {\n const middle = start + end >>> 1;\n const middleJob = queue[middle];\n const middleJobId = getId(middleJob);\n if (middleJobId < id || middleJobId === id && middleJob.flags & 2) {\n start = middle + 1;\n } else {\n end = middle;\n }\n }\n return start;\n}\nfunction queueJob(job) {\n if (!(job.flags & 1)) {\n const jobId = getId(job);\n const lastJob = queue[queue.length - 1];\n if (!lastJob || // fast path when the job id is larger than the tail\n !(job.flags & 2) && jobId >= getId(lastJob)) {\n queue.push(job);\n } else {\n queue.splice(findInsertionIndex(jobId), 0, job);\n }\n job.flags |= 1;\n queueFlush();\n }\n}\nfunction queueFlush() {\n if (!currentFlushPromise) {\n currentFlushPromise = resolvedPromise.then(flushJobs);\n }\n}\nfunction queuePostFlushCb(cb) {\n if (!isArray(cb)) {\n if (activePostFlushCbs && cb.id === -1) {\n activePostFlushCbs.splice(postFlushIndex + 1, 0, cb);\n } else if (!(cb.flags & 1)) {\n pendingPostFlushCbs.push(cb);\n cb.flags |= 1;\n }\n } else {\n pendingPostFlushCbs.push(...cb);\n }\n queueFlush();\n}\nfunction flushPreFlushCbs(instance, seen, i = flushIndex + 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (; i < queue.length; i++) {\n const cb = queue[i];\n if (cb && cb.flags & 2) {\n if (instance && cb.id !== instance.uid) {\n continue;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n queue.splice(i, 1);\n i--;\n if (cb.flags & 4) {\n cb.flags &= -2;\n }\n cb();\n if (!(cb.flags & 4)) {\n cb.flags &= -2;\n }\n }\n }\n}\nfunction flushPostFlushCbs(seen) {\n if (pendingPostFlushCbs.length) {\n const deduped = [...new Set(pendingPostFlushCbs)].sort(\n (a, b) => getId(a) - getId(b)\n );\n pendingPostFlushCbs.length = 0;\n if (activePostFlushCbs) {\n activePostFlushCbs.push(...deduped);\n return;\n }\n activePostFlushCbs = deduped;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n for (postFlushIndex = 0; postFlushIndex < activePostFlushCbs.length; postFlushIndex++) {\n const cb = activePostFlushCbs[postFlushIndex];\n if (!!(process.env.NODE_ENV !== \"production\") && checkRecursiveUpdates(seen, cb)) {\n continue;\n }\n if (cb.flags & 4) {\n cb.flags &= -2;\n }\n if (!(cb.flags & 8)) cb();\n cb.flags &= -2;\n }\n activePostFlushCbs = null;\n postFlushIndex = 0;\n }\n}\nconst getId = (job) => job.id == null ? job.flags & 2 ? -1 : Infinity : job.id;\nfunction flushJobs(seen) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n seen = seen || /* @__PURE__ */ new Map();\n }\n const check = !!(process.env.NODE_ENV !== \"production\") ? (job) => checkRecursiveUpdates(seen, job) : NOOP;\n try {\n for (flushIndex = 0; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job && !(job.flags & 8)) {\n if (!!(process.env.NODE_ENV !== \"production\") && check(job)) {\n continue;\n }\n if (job.flags & 4) {\n job.flags &= ~1;\n }\n callWithErrorHandling(\n job,\n job.i,\n job.i ? 15 : 14\n );\n if (!(job.flags & 4)) {\n job.flags &= ~1;\n }\n }\n }\n } finally {\n for (; flushIndex < queue.length; flushIndex++) {\n const job = queue[flushIndex];\n if (job) {\n job.flags &= -2;\n }\n }\n flushIndex = -1;\n queue.length = 0;\n flushPostFlushCbs(seen);\n currentFlushPromise = null;\n if (queue.length || pendingPostFlushCbs.length) {\n flushJobs(seen);\n }\n }\n}\nfunction checkRecursiveUpdates(seen, fn) {\n const count = seen.get(fn) || 0;\n if (count > RECURSION_LIMIT) {\n const instance = fn.i;\n const componentName = instance && getComponentName(instance.type);\n handleError(\n `Maximum recursive updates exceeded${componentName ? ` in component <${componentName}>` : ``}. This means you have a reactive effect that is mutating its own dependencies and thus recursively triggering itself. Possible sources include component template, render function, updated hook or watcher source function.`,\n null,\n 10\n );\n return true;\n }\n seen.set(fn, count + 1);\n return false;\n}\n\nlet isHmrUpdating = false;\nconst hmrDirtyComponents = /* @__PURE__ */ new Map();\nif (!!(process.env.NODE_ENV !== \"production\")) {\n getGlobalThis().__VUE_HMR_RUNTIME__ = {\n createRecord: tryWrap(createRecord),\n rerender: tryWrap(rerender),\n reload: tryWrap(reload)\n };\n}\nconst map = /* @__PURE__ */ new Map();\nfunction registerHMR(instance) {\n const id = instance.type.__hmrId;\n let record = map.get(id);\n if (!record) {\n createRecord(id, instance.type);\n record = map.get(id);\n }\n record.instances.add(instance);\n}\nfunction unregisterHMR(instance) {\n map.get(instance.type.__hmrId).instances.delete(instance);\n}\nfunction createRecord(id, initialDef) {\n if (map.has(id)) {\n return false;\n }\n map.set(id, {\n initialDef: normalizeClassComponent(initialDef),\n instances: /* @__PURE__ */ new Set()\n });\n return true;\n}\nfunction normalizeClassComponent(component) {\n return isClassComponent(component) ? component.__vccOpts : component;\n}\nfunction rerender(id, newRender) {\n const record = map.get(id);\n if (!record) {\n return;\n }\n record.initialDef.render = newRender;\n [...record.instances].forEach((instance) => {\n if (newRender) {\n instance.render = newRender;\n normalizeClassComponent(instance.type).render = newRender;\n }\n instance.renderCache = [];\n isHmrUpdating = true;\n if (!(instance.job.flags & 8)) {\n instance.update();\n }\n isHmrUpdating = false;\n });\n}\nfunction reload(id, newComp) {\n const record = map.get(id);\n if (!record) return;\n newComp = normalizeClassComponent(newComp);\n updateComponentDef(record.initialDef, newComp);\n const instances = [...record.instances];\n for (let i = 0; i < instances.length; i++) {\n const instance = instances[i];\n const oldComp = normalizeClassComponent(instance.type);\n let dirtyInstances = hmrDirtyComponents.get(oldComp);\n if (!dirtyInstances) {\n if (oldComp !== record.initialDef) {\n updateComponentDef(oldComp, newComp);\n }\n hmrDirtyComponents.set(oldComp, dirtyInstances = /* @__PURE__ */ new Set());\n }\n dirtyInstances.add(instance);\n instance.appContext.propsCache.delete(instance.type);\n instance.appContext.emitsCache.delete(instance.type);\n instance.appContext.optionsCache.delete(instance.type);\n if (instance.ceReload) {\n dirtyInstances.add(instance);\n instance.ceReload(newComp.styles);\n dirtyInstances.delete(instance);\n } else if (instance.parent) {\n queueJob(() => {\n if (!(instance.job.flags & 8)) {\n isHmrUpdating = true;\n instance.parent.update();\n isHmrUpdating = false;\n dirtyInstances.delete(instance);\n }\n });\n } else if (instance.appContext.reload) {\n instance.appContext.reload();\n } else if (typeof window !== \"undefined\") {\n window.location.reload();\n } else {\n console.warn(\n \"[HMR] Root or manually mounted instance modified. Full reload required.\"\n );\n }\n if (instance.root.ce && instance !== instance.root) {\n instance.root.ce._removeChildStyle(oldComp);\n }\n }\n queuePostFlushCb(() => {\n hmrDirtyComponents.clear();\n });\n}\nfunction updateComponentDef(oldComp, newComp) {\n extend(oldComp, newComp);\n for (const key in oldComp) {\n if (key !== \"__file\" && !(key in newComp)) {\n delete oldComp[key];\n }\n }\n}\nfunction tryWrap(fn) {\n return (id, arg) => {\n try {\n return fn(id, arg);\n } catch (e) {\n console.error(e);\n console.warn(\n `[HMR] Something went wrong during Vue component hot-reload. Full reload required.`\n );\n }\n };\n}\n\nlet devtools$1;\nlet buffer = [];\nlet devtoolsNotInstalled = false;\nfunction emit$1(event, ...args) {\n if (devtools$1) {\n devtools$1.emit(event, ...args);\n } else if (!devtoolsNotInstalled) {\n buffer.push({ event, args });\n }\n}\nfunction setDevtoolsHook$1(hook, target) {\n var _a, _b;\n devtools$1 = hook;\n if (devtools$1) {\n devtools$1.enabled = true;\n buffer.forEach(({ event, args }) => devtools$1.emit(event, ...args));\n buffer = [];\n } else if (\n // handle late devtools injection - only do this if we are in an actual\n // browser environment to avoid the timer handle stalling test runner exit\n // (#4815)\n typeof window !== \"undefined\" && // some envs mock window but not fully\n window.HTMLElement && // also exclude jsdom\n // eslint-disable-next-line no-restricted-syntax\n !((_b = (_a = window.navigator) == null ? void 0 : _a.userAgent) == null ? void 0 : _b.includes(\"jsdom\"))\n ) {\n const replay = target.__VUE_DEVTOOLS_HOOK_REPLAY__ = target.__VUE_DEVTOOLS_HOOK_REPLAY__ || [];\n replay.push((newHook) => {\n setDevtoolsHook$1(newHook, target);\n });\n setTimeout(() => {\n if (!devtools$1) {\n target.__VUE_DEVTOOLS_HOOK_REPLAY__ = null;\n devtoolsNotInstalled = true;\n buffer = [];\n }\n }, 3e3);\n } else {\n devtoolsNotInstalled = true;\n buffer = [];\n }\n}\nfunction devtoolsInitApp(app, version) {\n emit$1(\"app:init\" /* APP_INIT */, app, version, {\n Fragment,\n Text,\n Comment,\n Static\n });\n}\nfunction devtoolsUnmountApp(app) {\n emit$1(\"app:unmount\" /* APP_UNMOUNT */, app);\n}\nconst devtoolsComponentAdded = /* @__PURE__ */ createDevtoolsComponentHook(\"component:added\" /* COMPONENT_ADDED */);\nconst devtoolsComponentUpdated = /* @__PURE__ */ createDevtoolsComponentHook(\"component:updated\" /* COMPONENT_UPDATED */);\nconst _devtoolsComponentRemoved = /* @__PURE__ */ createDevtoolsComponentHook(\n \"component:removed\" /* COMPONENT_REMOVED */\n);\nconst devtoolsComponentRemoved = (component) => {\n if (devtools$1 && typeof devtools$1.cleanupBuffer === \"function\" && // remove the component if it wasn't buffered\n !devtools$1.cleanupBuffer(component)) {\n _devtoolsComponentRemoved(component);\n }\n};\n// @__NO_SIDE_EFFECTS__\nfunction createDevtoolsComponentHook(hook) {\n return (component) => {\n emit$1(\n hook,\n component.appContext.app,\n component.uid,\n component.parent ? component.parent.uid : void 0,\n component\n );\n };\n}\nconst devtoolsPerfStart = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:start\" /* PERFORMANCE_START */);\nconst devtoolsPerfEnd = /* @__PURE__ */ createDevtoolsPerformanceHook(\"perf:end\" /* PERFORMANCE_END */);\nfunction createDevtoolsPerformanceHook(hook) {\n return (component, type, time) => {\n emit$1(hook, component.appContext.app, component.uid, component, type, time);\n };\n}\nfunction devtoolsComponentEmit(component, event, params) {\n emit$1(\n \"component:emit\" /* COMPONENT_EMIT */,\n component.appContext.app,\n component,\n event,\n params\n );\n}\n\nlet currentRenderingInstance = null;\nlet currentScopeId = null;\nfunction setCurrentRenderingInstance(instance) {\n const prev = currentRenderingInstance;\n currentRenderingInstance = instance;\n currentScopeId = instance && instance.type.__scopeId || null;\n return prev;\n}\nfunction pushScopeId(id) {\n currentScopeId = id;\n}\nfunction popScopeId() {\n currentScopeId = null;\n}\nconst withScopeId = (_id) => withCtx;\nfunction withCtx(fn, ctx = currentRenderingInstance, isNonScopedSlot) {\n if (!ctx) return fn;\n if (fn._n) {\n return fn;\n }\n const renderFnWithContext = (...args) => {\n if (renderFnWithContext._d) {\n setBlockTracking(-1);\n }\n const prevInstance = setCurrentRenderingInstance(ctx);\n let res;\n try {\n res = fn(...args);\n } finally {\n setCurrentRenderingInstance(prevInstance);\n if (renderFnWithContext._d) {\n setBlockTracking(1);\n }\n }\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentUpdated(ctx);\n }\n return res;\n };\n renderFnWithContext._n = true;\n renderFnWithContext._c = true;\n renderFnWithContext._d = true;\n return renderFnWithContext;\n}\n\nfunction validateDirectiveName(name) {\n if (isBuiltInDirective(name)) {\n warn$1(\"Do not use built-in directive ids as custom directive id: \" + name);\n }\n}\nfunction withDirectives(vnode, directives) {\n if (currentRenderingInstance === null) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(`withDirectives can only be used inside render functions.`);\n return vnode;\n }\n const instance = getComponentPublicInstance(currentRenderingInstance);\n const bindings = vnode.dirs || (vnode.dirs = []);\n for (let i = 0; i < directives.length; i++) {\n let [dir, value, arg, modifiers = EMPTY_OBJ] = directives[i];\n if (dir) {\n if (isFunction(dir)) {\n dir = {\n mounted: dir,\n updated: dir\n };\n }\n if (dir.deep) {\n traverse(value);\n }\n bindings.push({\n dir,\n instance,\n value,\n oldValue: void 0,\n arg,\n modifiers\n });\n }\n }\n return vnode;\n}\nfunction invokeDirectiveHook(vnode, prevVNode, instance, name) {\n const bindings = vnode.dirs;\n const oldBindings = prevVNode && prevVNode.dirs;\n for (let i = 0; i < bindings.length; i++) {\n const binding = bindings[i];\n if (oldBindings) {\n binding.oldValue = oldBindings[i].value;\n }\n let hook = binding.dir[name];\n if (hook) {\n pauseTracking();\n callWithAsyncErrorHandling(hook, instance, 8, [\n vnode.el,\n binding,\n vnode,\n prevVNode\n ]);\n resetTracking();\n }\n }\n}\n\nfunction provide(key, value) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (!currentInstance || currentInstance.isMounted) {\n warn$1(`provide() can only be used inside setup().`);\n }\n }\n if (currentInstance) {\n let provides = currentInstance.provides;\n const parentProvides = currentInstance.parent && currentInstance.parent.provides;\n if (parentProvides === provides) {\n provides = currentInstance.provides = Object.create(parentProvides);\n }\n provides[key] = value;\n }\n}\nfunction inject(key, defaultValue, treatDefaultAsFactory = false) {\n const instance = getCurrentInstance();\n if (instance || currentApp) {\n let provides = currentApp ? currentApp._context.provides : instance ? instance.parent == null || instance.ce ? instance.vnode.appContext && instance.vnode.appContext.provides : instance.parent.provides : void 0;\n if (provides && key in provides) {\n return provides[key];\n } else if (arguments.length > 1) {\n return treatDefaultAsFactory && isFunction(defaultValue) ? defaultValue.call(instance && instance.proxy) : defaultValue;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`injection \"${String(key)}\" not found.`);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`inject() can only be used inside setup() or functional components.`);\n }\n}\nfunction hasInjectionContext() {\n return !!(getCurrentInstance() || currentApp);\n}\n\nconst ssrContextKey = /* @__PURE__ */ Symbol.for(\"v-scx\");\nconst useSSRContext = () => {\n {\n const ctx = inject(ssrContextKey);\n if (!ctx) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.`\n );\n }\n return ctx;\n }\n};\n\nfunction watchEffect(effect, options) {\n return doWatch(effect, null, options);\n}\nfunction watchPostEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"post\" }) : { flush: \"post\" }\n );\n}\nfunction watchSyncEffect(effect, options) {\n return doWatch(\n effect,\n null,\n !!(process.env.NODE_ENV !== \"production\") ? extend({}, options, { flush: \"sync\" }) : { flush: \"sync\" }\n );\n}\nfunction watch(source, cb, options) {\n if (!!(process.env.NODE_ENV !== \"production\") && !isFunction(cb)) {\n warn$1(\n `\\`watch(fn, options?)\\` signature has been moved to a separate API. Use \\`watchEffect(fn, options?)\\` instead. \\`watch\\` now only supports \\`watch(source, cb, options?) signature.`\n );\n }\n return doWatch(source, cb, options);\n}\nfunction doWatch(source, cb, options = EMPTY_OBJ) {\n const { immediate, deep, flush, once } = options;\n if (!!(process.env.NODE_ENV !== \"production\") && !cb) {\n if (immediate !== void 0) {\n warn$1(\n `watch() \"immediate\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (deep !== void 0) {\n warn$1(\n `watch() \"deep\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n if (once !== void 0) {\n warn$1(\n `watch() \"once\" option is only respected when using the watch(source, callback, options?) signature.`\n );\n }\n }\n const baseWatchOptions = extend({}, options);\n if (!!(process.env.NODE_ENV !== \"production\")) baseWatchOptions.onWarn = warn$1;\n const runsImmediately = cb && immediate || !cb && flush !== \"post\";\n let ssrCleanup;\n if (isInSSRComponentSetup) {\n if (flush === \"sync\") {\n const ctx = useSSRContext();\n ssrCleanup = ctx.__watcherHandles || (ctx.__watcherHandles = []);\n } else if (!runsImmediately) {\n const watchStopHandle = () => {\n };\n watchStopHandle.stop = NOOP;\n watchStopHandle.resume = NOOP;\n watchStopHandle.pause = NOOP;\n return watchStopHandle;\n }\n }\n const instance = currentInstance;\n baseWatchOptions.call = (fn, type, args) => callWithAsyncErrorHandling(fn, instance, type, args);\n let isPre = false;\n if (flush === \"post\") {\n baseWatchOptions.scheduler = (job) => {\n queuePostRenderEffect(job, instance && instance.suspense);\n };\n } else if (flush !== \"sync\") {\n isPre = true;\n baseWatchOptions.scheduler = (job, isFirstRun) => {\n if (isFirstRun) {\n job();\n } else {\n queueJob(job);\n }\n };\n }\n baseWatchOptions.augmentJob = (job) => {\n if (cb) {\n job.flags |= 4;\n }\n if (isPre) {\n job.flags |= 2;\n if (instance) {\n job.id = instance.uid;\n job.i = instance;\n }\n }\n };\n const watchHandle = watch$1(source, cb, baseWatchOptions);\n if (isInSSRComponentSetup) {\n if (ssrCleanup) {\n ssrCleanup.push(watchHandle);\n } else if (runsImmediately) {\n watchHandle();\n }\n }\n return watchHandle;\n}\nfunction instanceWatch(source, value, options) {\n const publicThis = this.proxy;\n const getter = isString(source) ? source.includes(\".\") ? createPathGetter(publicThis, source) : () => publicThis[source] : source.bind(publicThis, publicThis);\n let cb;\n if (isFunction(value)) {\n cb = value;\n } else {\n cb = value.handler;\n options = value;\n }\n const reset = setCurrentInstance(this);\n const res = doWatch(getter, cb.bind(publicThis), options);\n reset();\n return res;\n}\nfunction createPathGetter(ctx, path) {\n const segments = path.split(\".\");\n return () => {\n let cur = ctx;\n for (let i = 0; i < segments.length && cur; i++) {\n cur = cur[segments[i]];\n }\n return cur;\n };\n}\n\nconst TeleportEndKey = /* @__PURE__ */ Symbol(\"_vte\");\nconst isTeleport = (type) => type.__isTeleport;\nconst isTeleportDisabled = (props) => props && (props.disabled || props.disabled === \"\");\nconst isTeleportDeferred = (props) => props && (props.defer || props.defer === \"\");\nconst isTargetSVG = (target) => typeof SVGElement !== \"undefined\" && target instanceof SVGElement;\nconst isTargetMathML = (target) => typeof MathMLElement === \"function\" && target instanceof MathMLElement;\nconst resolveTarget = (props, select) => {\n const targetSelector = props && props.to;\n if (isString(targetSelector)) {\n if (!select) {\n !!(process.env.NODE_ENV !== \"production\") && warn$1(\n `Current renderer does not support string target for Teleports. (missing querySelector renderer option)`\n );\n return null;\n } else {\n const target = select(targetSelector);\n if (!!(process.env.NODE_ENV !== \"production\") && !target && !isTeleportDisabled(props)) {\n warn$1(\n `Failed to locate Teleport target with selector \"${targetSelector}\". Note the target element must exist before the component is mounted - i.e. the target cannot be rendered by the component itself, and ideally should be outside of the entire Vue component tree.`\n );\n }\n return target;\n }\n } else {\n if (!!(process.env.NODE_ENV !== \"production\") && !targetSelector && !isTeleportDisabled(props)) {\n warn$1(`Invalid Teleport target: ${targetSelector}`);\n }\n return targetSelector;\n }\n};\nconst TeleportImpl = {\n name: \"Teleport\",\n __isTeleport: true,\n process(n1, n2, container, anchor, parentComponent, parentSuspense, namespace, slotScopeIds, optimized, internals) {\n const {\n mc: mountChildren,\n pc: patchChildren,\n pbc: patchBlockChildren,\n o: { insert, querySelector, createText, createComment }\n } = internals;\n const disabled = isTeleportDisabled(n2.props);\n let { shapeFlag, children, dynamicChildren } = n2;\n if (!!(process.env.NODE_ENV !== \"production\") && isHmrUpdating) {\n optimized = false;\n dynamicChildren = null;\n }\n if (n1 == null) {\n const placeholder = n2.el = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport start\") : createText(\"\");\n const mainAnchor = n2.anchor = !!(process.env.NODE_ENV !== \"production\") ? createComment(\"teleport end\") : createText(\"\");\n insert(placeholder, container, anchor);\n insert(mainAnchor, container, anchor);\n const mount = (container2, anchor2) => {\n if (shapeFlag & 16) {\n mountChildren(\n children,\n container2,\n anchor2,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized\n );\n }\n };\n const mountToTarget = () => {\n const target = n2.target = resolveTarget(n2.props, querySelector);\n const targetAnchor = prepareAnchor(target, n2, createText, insert);\n if (target) {\n if (namespace !== \"svg\" && isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace !== \"mathml\" && isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (parentComponent && parentComponent.isCE) {\n (parentComponent.ce._teleportTargets || (parentComponent.ce._teleportTargets = /* @__PURE__ */ new Set())).add(target);\n }\n if (!disabled) {\n mount(target, targetAnchor);\n updateCssVars(n2, false);\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && !disabled) {\n warn$1(\n \"Invalid Teleport target on mount:\",\n target,\n `(${typeof target})`\n );\n }\n };\n if (disabled) {\n mount(container, mainAnchor);\n updateCssVars(n2, true);\n }\n if (isTeleportDeferred(n2.props)) {\n n2.el.__isMounted = false;\n queuePostRenderEffect(() => {\n mountToTarget();\n delete n2.el.__isMounted;\n }, parentSuspense);\n } else {\n mountToTarget();\n }\n } else {\n if (isTeleportDeferred(n2.props) && n1.el.__isMounted === false) {\n queuePostRenderEffect(() => {\n TeleportImpl.process(\n n1,\n n2,\n container,\n anchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n optimized,\n internals\n );\n }, parentSuspense);\n return;\n }\n n2.el = n1.el;\n n2.targetStart = n1.targetStart;\n const mainAnchor = n2.anchor = n1.anchor;\n const target = n2.target = n1.target;\n const targetAnchor = n2.targetAnchor = n1.targetAnchor;\n const wasDisabled = isTeleportDisabled(n1.props);\n const currentContainer = wasDisabled ? container : target;\n const currentAnchor = wasDisabled ? mainAnchor : targetAnchor;\n if (namespace === \"svg\" || isTargetSVG(target)) {\n namespace = \"svg\";\n } else if (namespace === \"mathml\" || isTargetMathML(target)) {\n namespace = \"mathml\";\n }\n if (dynamicChildren) {\n patchBlockChildren(\n n1.dynamicChildren,\n dynamicChildren,\n currentContainer,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds\n );\n traverseStaticChildren(n1, n2, !!!(process.env.NODE_ENV !== \"production\"));\n } else if (!optimized) {\n patchChildren(\n n1,\n n2,\n currentContainer,\n currentAnchor,\n parentComponent,\n parentSuspense,\n namespace,\n slotScopeIds,\n false\n );\n }\n if (disabled) {\n if (!wasDisabled) {\n moveTeleport(\n n2,\n container,\n mainAnchor,\n internals,\n 1\n );\n } else {\n if (n2.props && n1.props && n2.props.to !== n1.props.to) {\n n2.props.to = n1.props.to;\n }\n }\n } else {\n if ((n2.props && n2.props.to) !== (n1.props && n1.props.to)) {\n const nextTarget = n2.target = resolveTarget(\n n2.props,\n querySelector\n );\n if (nextTarget) {\n moveTeleport(\n n2,\n nextTarget,\n null,\n internals,\n 0\n );\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n \"Invalid Teleport target on update:\",\n target,\n `(${typeof target})`\n );\n }\n } else if (wasDisabled) {\n moveTeleport(\n n2,\n target,\n targetAnchor,\n internals,\n 1\n );\n }\n }\n updateCssVars(n2, disabled);\n }\n },\n remove(vnode, parentComponent, parentSuspense, { um: unmount, o: { remove: hostRemove } }, doRemove) {\n const {\n shapeFlag,\n children,\n anchor,\n targetStart,\n targetAnchor,\n target,\n props\n } = vnode;\n if (target) {\n hostRemove(targetStart);\n hostRemove(targetAnchor);\n }\n doRemove && hostRemove(anchor);\n if (shapeFlag & 16) {\n const shouldRemove = doRemove || !isTeleportDisabled(props);\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n unmount(\n child,\n parentComponent,\n parentSuspense,\n shouldRemove,\n !!child.dynamicChildren\n );\n }\n }\n },\n move: moveTeleport,\n hydrate: hydrateTeleport\n};\nfunction moveTeleport(vnode, container, parentAnchor, { o: { insert }, m: move }, moveType = 2) {\n if (moveType === 0) {\n insert(vnode.targetAnchor, container, parentAnchor);\n }\n const { el, anchor, shapeFlag, children, props } = vnode;\n const isReorder = moveType === 2;\n if (isReorder) {\n insert(el, container, parentAnchor);\n }\n if (!isReorder || isTeleportDisabled(props)) {\n if (shapeFlag & 16) {\n for (let i = 0; i < children.length; i++) {\n move(\n children[i],\n container,\n parentAnchor,\n 2\n );\n }\n }\n }\n if (isReorder) {\n insert(anchor, container, parentAnchor);\n }\n}\nfunction hydrateTeleport(node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized, {\n o: { nextSibling, parentNode, querySelector, insert, createText }\n}, hydrateChildren) {\n function hydrateDisabledTeleport(node2, vnode2, targetStart, targetAnchor) {\n vnode2.anchor = hydrateChildren(\n nextSibling(node2),\n vnode2,\n parentNode(node2),\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n vnode2.targetStart = targetStart;\n vnode2.targetAnchor = targetAnchor;\n }\n const target = vnode.target = resolveTarget(\n vnode.props,\n querySelector\n );\n const disabled = isTeleportDisabled(vnode.props);\n if (target) {\n const targetNode = target._lpa || target.firstChild;\n if (vnode.shapeFlag & 16) {\n if (disabled) {\n hydrateDisabledTeleport(\n node,\n vnode,\n targetNode,\n targetNode && nextSibling(targetNode)\n );\n } else {\n vnode.anchor = nextSibling(node);\n let targetAnchor = targetNode;\n while (targetAnchor) {\n if (targetAnchor && targetAnchor.nodeType === 8) {\n if (targetAnchor.data === \"teleport start anchor\") {\n vnode.targetStart = targetAnchor;\n } else if (targetAnchor.data === \"teleport anchor\") {\n vnode.targetAnchor = targetAnchor;\n target._lpa = vnode.targetAnchor && nextSibling(vnode.targetAnchor);\n break;\n }\n }\n targetAnchor = nextSibling(targetAnchor);\n }\n if (!vnode.targetAnchor) {\n prepareAnchor(target, vnode, createText, insert);\n }\n hydrateChildren(\n targetNode && nextSibling(targetNode),\n vnode,\n target,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n }\n updateCssVars(vnode, disabled);\n } else if (disabled) {\n if (vnode.shapeFlag & 16) {\n hydrateDisabledTeleport(node, vnode, node, nextSibling(node));\n }\n }\n return vnode.anchor && nextSibling(vnode.anchor);\n}\nconst Teleport = TeleportImpl;\nfunction updateCssVars(vnode, isDisabled) {\n const ctx = vnode.ctx;\n if (ctx && ctx.ut) {\n let node, anchor;\n if (isDisabled) {\n node = vnode.el;\n anchor = vnode.anchor;\n } else {\n node = vnode.targetStart;\n anchor = vnode.targetAnchor;\n }\n while (node && node !== anchor) {\n if (node.nodeType === 1) node.setAttribute(\"data-v-owner\", ctx.uid);\n node = node.nextSibling;\n }\n ctx.ut();\n }\n}\nfunction prepareAnchor(target, vnode, createText, insert) {\n const targetStart = vnode.targetStart = createText(\"\");\n const targetAnchor = vnode.targetAnchor = createText(\"\");\n targetStart[TeleportEndKey] = targetAnchor;\n if (target) {\n insert(targetStart, target);\n insert(targetAnchor, target);\n }\n return targetAnchor;\n}\n\nconst leaveCbKey = /* @__PURE__ */ Symbol(\"_leaveCb\");\nconst enterCbKey = /* @__PURE__ */ Symbol(\"_enterCb\");\nfunction useTransitionState() {\n const state = {\n isMounted: false,\n isLeaving: false,\n isUnmounting: false,\n leavingVNodes: /* @__PURE__ */ new Map()\n };\n onMounted(() => {\n state.isMounted = true;\n });\n onBeforeUnmount(() => {\n state.isUnmounting = true;\n });\n return state;\n}\nconst TransitionHookValidator = [Function, Array];\nconst BaseTransitionPropsValidators = {\n mode: String,\n appear: Boolean,\n persisted: Boolean,\n // enter\n onBeforeEnter: TransitionHookValidator,\n onEnter: TransitionHookValidator,\n onAfterEnter: TransitionHookValidator,\n onEnterCancelled: TransitionHookValidator,\n // leave\n onBeforeLeave: TransitionHookValidator,\n onLeave: TransitionHookValidator,\n onAfterLeave: TransitionHookValidator,\n onLeaveCancelled: TransitionHookValidator,\n // appear\n onBeforeAppear: TransitionHookValidator,\n onAppear: TransitionHookValidator,\n onAfterAppear: TransitionHookValidator,\n onAppearCancelled: TransitionHookValidator\n};\nconst recursiveGetSubtree = (instance) => {\n const subTree = instance.subTree;\n return subTree.component ? recursiveGetSubtree(subTree.component) : subTree;\n};\nconst BaseTransitionImpl = {\n name: `BaseTransition`,\n props: BaseTransitionPropsValidators,\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const state = useTransitionState();\n return () => {\n const children = slots.default && getTransitionRawChildren(slots.default(), true);\n if (!children || !children.length) {\n return;\n }\n const child = findNonCommentChild(children);\n const rawProps = toRaw(props);\n const { mode } = rawProps;\n if (!!(process.env.NODE_ENV !== \"production\") && mode && mode !== \"in-out\" && mode !== \"out-in\" && mode !== \"default\") {\n warn$1(`invalid mode: ${mode}`);\n }\n if (state.isLeaving) {\n return emptyPlaceholder(child);\n }\n const innerChild = getInnerChild$1(child);\n if (!innerChild) {\n return emptyPlaceholder(child);\n }\n let enterHooks = resolveTransitionHooks(\n innerChild,\n rawProps,\n state,\n instance,\n // #11061, ensure enterHooks is fresh after clone\n (hooks) => enterHooks = hooks\n );\n if (innerChild.type !== Comment) {\n setTransitionHooks(innerChild, enterHooks);\n }\n let oldInnerChild = instance.subTree && getInnerChild$1(instance.subTree);\n if (oldInnerChild && oldInnerChild.type !== Comment && !isSameVNodeType(oldInnerChild, innerChild) && recursiveGetSubtree(instance).type !== Comment) {\n let leavingHooks = resolveTransitionHooks(\n oldInnerChild,\n rawProps,\n state,\n instance\n );\n setTransitionHooks(oldInnerChild, leavingHooks);\n if (mode === \"out-in\" && innerChild.type !== Comment) {\n state.isLeaving = true;\n leavingHooks.afterLeave = () => {\n state.isLeaving = false;\n if (!(instance.job.flags & 8)) {\n instance.update();\n }\n delete leavingHooks.afterLeave;\n oldInnerChild = void 0;\n };\n return emptyPlaceholder(child);\n } else if (mode === \"in-out\" && innerChild.type !== Comment) {\n leavingHooks.delayLeave = (el, earlyRemove, delayedLeave) => {\n const leavingVNodesCache = getLeavingNodesForType(\n state,\n oldInnerChild\n );\n leavingVNodesCache[String(oldInnerChild.key)] = oldInnerChild;\n el[leaveCbKey] = () => {\n earlyRemove();\n el[leaveCbKey] = void 0;\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n enterHooks.delayedLeave = () => {\n delayedLeave();\n delete enterHooks.delayedLeave;\n oldInnerChild = void 0;\n };\n };\n } else {\n oldInnerChild = void 0;\n }\n } else if (oldInnerChild) {\n oldInnerChild = void 0;\n }\n return child;\n };\n }\n};\nfunction findNonCommentChild(children) {\n let child = children[0];\n if (children.length > 1) {\n let hasFound = false;\n for (const c of children) {\n if (c.type !== Comment) {\n if (!!(process.env.NODE_ENV !== \"production\") && hasFound) {\n warn$1(\n \" can only be used on a single element or component. Use for lists.\"\n );\n break;\n }\n child = c;\n hasFound = true;\n if (!!!(process.env.NODE_ENV !== \"production\")) break;\n }\n }\n }\n return child;\n}\nconst BaseTransition = BaseTransitionImpl;\nfunction getLeavingNodesForType(state, vnode) {\n const { leavingVNodes } = state;\n let leavingVNodesCache = leavingVNodes.get(vnode.type);\n if (!leavingVNodesCache) {\n leavingVNodesCache = /* @__PURE__ */ Object.create(null);\n leavingVNodes.set(vnode.type, leavingVNodesCache);\n }\n return leavingVNodesCache;\n}\nfunction resolveTransitionHooks(vnode, props, state, instance, postClone) {\n const {\n appear,\n mode,\n persisted = false,\n onBeforeEnter,\n onEnter,\n onAfterEnter,\n onEnterCancelled,\n onBeforeLeave,\n onLeave,\n onAfterLeave,\n onLeaveCancelled,\n onBeforeAppear,\n onAppear,\n onAfterAppear,\n onAppearCancelled\n } = props;\n const key = String(vnode.key);\n const leavingVNodesCache = getLeavingNodesForType(state, vnode);\n const callHook = (hook, args) => {\n hook && callWithAsyncErrorHandling(\n hook,\n instance,\n 9,\n args\n );\n };\n const callAsyncHook = (hook, args) => {\n const done = args[1];\n callHook(hook, args);\n if (isArray(hook)) {\n if (hook.every((hook2) => hook2.length <= 1)) done();\n } else if (hook.length <= 1) {\n done();\n }\n };\n const hooks = {\n mode,\n persisted,\n beforeEnter(el) {\n let hook = onBeforeEnter;\n if (!state.isMounted) {\n if (appear) {\n hook = onBeforeAppear || onBeforeEnter;\n } else {\n return;\n }\n }\n if (el[leaveCbKey]) {\n el[leaveCbKey](\n true\n /* cancelled */\n );\n }\n const leavingVNode = leavingVNodesCache[key];\n if (leavingVNode && isSameVNodeType(vnode, leavingVNode) && leavingVNode.el[leaveCbKey]) {\n leavingVNode.el[leaveCbKey]();\n }\n callHook(hook, [el]);\n },\n enter(el) {\n let hook = onEnter;\n let afterHook = onAfterEnter;\n let cancelHook = onEnterCancelled;\n if (!state.isMounted) {\n if (appear) {\n hook = onAppear || onEnter;\n afterHook = onAfterAppear || onAfterEnter;\n cancelHook = onAppearCancelled || onEnterCancelled;\n } else {\n return;\n }\n }\n let called = false;\n const done = el[enterCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n if (cancelled) {\n callHook(cancelHook, [el]);\n } else {\n callHook(afterHook, [el]);\n }\n if (hooks.delayedLeave) {\n hooks.delayedLeave();\n }\n el[enterCbKey] = void 0;\n };\n if (hook) {\n callAsyncHook(hook, [el, done]);\n } else {\n done();\n }\n },\n leave(el, remove) {\n const key2 = String(vnode.key);\n if (el[enterCbKey]) {\n el[enterCbKey](\n true\n /* cancelled */\n );\n }\n if (state.isUnmounting) {\n return remove();\n }\n callHook(onBeforeLeave, [el]);\n let called = false;\n const done = el[leaveCbKey] = (cancelled) => {\n if (called) return;\n called = true;\n remove();\n if (cancelled) {\n callHook(onLeaveCancelled, [el]);\n } else {\n callHook(onAfterLeave, [el]);\n }\n el[leaveCbKey] = void 0;\n if (leavingVNodesCache[key2] === vnode) {\n delete leavingVNodesCache[key2];\n }\n };\n leavingVNodesCache[key2] = vnode;\n if (onLeave) {\n callAsyncHook(onLeave, [el, done]);\n } else {\n done();\n }\n },\n clone(vnode2) {\n const hooks2 = resolveTransitionHooks(\n vnode2,\n props,\n state,\n instance,\n postClone\n );\n if (postClone) postClone(hooks2);\n return hooks2;\n }\n };\n return hooks;\n}\nfunction emptyPlaceholder(vnode) {\n if (isKeepAlive(vnode)) {\n vnode = cloneVNode(vnode);\n vnode.children = null;\n return vnode;\n }\n}\nfunction getInnerChild$1(vnode) {\n if (!isKeepAlive(vnode)) {\n if (isTeleport(vnode.type) && vnode.children) {\n return findNonCommentChild(vnode.children);\n }\n return vnode;\n }\n if (vnode.component) {\n return vnode.component.subTree;\n }\n const { shapeFlag, children } = vnode;\n if (children) {\n if (shapeFlag & 16) {\n return children[0];\n }\n if (shapeFlag & 32 && isFunction(children.default)) {\n return children.default();\n }\n }\n}\nfunction setTransitionHooks(vnode, hooks) {\n if (vnode.shapeFlag & 6 && vnode.component) {\n vnode.transition = hooks;\n setTransitionHooks(vnode.component.subTree, hooks);\n } else if (vnode.shapeFlag & 128) {\n vnode.ssContent.transition = hooks.clone(vnode.ssContent);\n vnode.ssFallback.transition = hooks.clone(vnode.ssFallback);\n } else {\n vnode.transition = hooks;\n }\n}\nfunction getTransitionRawChildren(children, keepComment = false, parentKey) {\n let ret = [];\n let keyedFragmentCount = 0;\n for (let i = 0; i < children.length; i++) {\n let child = children[i];\n const key = parentKey == null ? child.key : String(parentKey) + String(child.key != null ? child.key : i);\n if (child.type === Fragment) {\n if (child.patchFlag & 128) keyedFragmentCount++;\n ret = ret.concat(\n getTransitionRawChildren(child.children, keepComment, key)\n );\n } else if (keepComment || child.type !== Comment) {\n ret.push(key != null ? cloneVNode(child, { key }) : child);\n }\n }\n if (keyedFragmentCount > 1) {\n for (let i = 0; i < ret.length; i++) {\n ret[i].patchFlag = -2;\n }\n }\n return ret;\n}\n\n// @__NO_SIDE_EFFECTS__\nfunction defineComponent(options, extraOptions) {\n return isFunction(options) ? (\n // #8236: extend call and options.name access are considered side-effects\n // by Rollup, so we have to wrap it in a pure-annotated IIFE.\n /* @__PURE__ */ (() => extend({ name: options.name }, extraOptions, { setup: options }))()\n ) : options;\n}\n\nfunction useId() {\n const i = getCurrentInstance();\n if (i) {\n return (i.appContext.config.idPrefix || \"v\") + \"-\" + i.ids[0] + i.ids[1]++;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useId() is called when there is no active component instance to be associated with.`\n );\n }\n return \"\";\n}\nfunction markAsyncBoundary(instance) {\n instance.ids = [instance.ids[0] + instance.ids[2]++ + \"-\", 0, 0];\n}\n\nconst knownTemplateRefs = /* @__PURE__ */ new WeakSet();\nfunction useTemplateRef(key) {\n const i = getCurrentInstance();\n const r = shallowRef(null);\n if (i) {\n const refs = i.refs === EMPTY_OBJ ? i.refs = {} : i.refs;\n let desc;\n if (!!(process.env.NODE_ENV !== \"production\") && (desc = Object.getOwnPropertyDescriptor(refs, key)) && !desc.configurable) {\n warn$1(`useTemplateRef('${key}') already exists.`);\n } else {\n Object.defineProperty(refs, key, {\n enumerable: true,\n get: () => r.value,\n set: (val) => r.value = val\n });\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `useTemplateRef() is called when there is no active component instance to be associated with.`\n );\n }\n const ret = !!(process.env.NODE_ENV !== \"production\") ? readonly(r) : r;\n if (!!(process.env.NODE_ENV !== \"production\")) {\n knownTemplateRefs.add(ret);\n }\n return ret;\n}\n\nconst pendingSetRefMap = /* @__PURE__ */ new WeakMap();\nfunction setRef(rawRef, oldRawRef, parentSuspense, vnode, isUnmount = false) {\n if (isArray(rawRef)) {\n rawRef.forEach(\n (r, i) => setRef(\n r,\n oldRawRef && (isArray(oldRawRef) ? oldRawRef[i] : oldRawRef),\n parentSuspense,\n vnode,\n isUnmount\n )\n );\n return;\n }\n if (isAsyncWrapper(vnode) && !isUnmount) {\n if (vnode.shapeFlag & 512 && vnode.type.__asyncResolved && vnode.component.subTree.component) {\n setRef(rawRef, oldRawRef, parentSuspense, vnode.component.subTree);\n }\n return;\n }\n const refValue = vnode.shapeFlag & 4 ? getComponentPublicInstance(vnode.component) : vnode.el;\n const value = isUnmount ? null : refValue;\n const { i: owner, r: ref } = rawRef;\n if (!!(process.env.NODE_ENV !== \"production\") && !owner) {\n warn$1(\n `Missing ref owner context. ref cannot be used on hoisted vnodes. A vnode with ref must be created inside the render function.`\n );\n return;\n }\n const oldRef = oldRawRef && oldRawRef.r;\n const refs = owner.refs === EMPTY_OBJ ? owner.refs = {} : owner.refs;\n const setupState = owner.setupState;\n const rawSetupState = toRaw(setupState);\n const canSetSetupRef = setupState === EMPTY_OBJ ? NO : (key) => {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n if (hasOwn(rawSetupState, key) && !isRef(rawSetupState[key])) {\n warn$1(\n `Template ref \"${key}\" used on a non-ref value. It will not work in the production build.`\n );\n }\n if (knownTemplateRefs.has(rawSetupState[key])) {\n return false;\n }\n }\n return hasOwn(rawSetupState, key);\n };\n const canSetRef = (ref2) => {\n return !!!(process.env.NODE_ENV !== \"production\") || !knownTemplateRefs.has(ref2);\n };\n if (oldRef != null && oldRef !== ref) {\n invalidatePendingSetRef(oldRawRef);\n if (isString(oldRef)) {\n refs[oldRef] = null;\n if (canSetSetupRef(oldRef)) {\n setupState[oldRef] = null;\n }\n } else if (isRef(oldRef)) {\n if (canSetRef(oldRef)) {\n oldRef.value = null;\n }\n const oldRawRefAtom = oldRawRef;\n if (oldRawRefAtom.k) refs[oldRawRefAtom.k] = null;\n }\n }\n if (isFunction(ref)) {\n callWithErrorHandling(ref, owner, 12, [value, refs]);\n } else {\n const _isString = isString(ref);\n const _isRef = isRef(ref);\n if (_isString || _isRef) {\n const doSet = () => {\n if (rawRef.f) {\n const existing = _isString ? canSetSetupRef(ref) ? setupState[ref] : refs[ref] : canSetRef(ref) || !rawRef.k ? ref.value : refs[rawRef.k];\n if (isUnmount) {\n isArray(existing) && remove(existing, refValue);\n } else {\n if (!isArray(existing)) {\n if (_isString) {\n refs[ref] = [refValue];\n if (canSetSetupRef(ref)) {\n setupState[ref] = refs[ref];\n }\n } else {\n const newVal = [refValue];\n if (canSetRef(ref)) {\n ref.value = newVal;\n }\n if (rawRef.k) refs[rawRef.k] = newVal;\n }\n } else if (!existing.includes(refValue)) {\n existing.push(refValue);\n }\n }\n } else if (_isString) {\n refs[ref] = value;\n if (canSetSetupRef(ref)) {\n setupState[ref] = value;\n }\n } else if (_isRef) {\n if (canSetRef(ref)) {\n ref.value = value;\n }\n if (rawRef.k) refs[rawRef.k] = value;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n };\n if (value) {\n const job = () => {\n doSet();\n pendingSetRefMap.delete(rawRef);\n };\n job.id = -1;\n pendingSetRefMap.set(rawRef, job);\n queuePostRenderEffect(job, parentSuspense);\n } else {\n invalidatePendingSetRef(rawRef);\n doSet();\n }\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\"Invalid template ref type:\", ref, `(${typeof ref})`);\n }\n }\n}\nfunction invalidatePendingSetRef(rawRef) {\n const pendingSetRef = pendingSetRefMap.get(rawRef);\n if (pendingSetRef) {\n pendingSetRef.flags |= 8;\n pendingSetRefMap.delete(rawRef);\n }\n}\n\nlet hasLoggedMismatchError = false;\nconst logMismatchError = () => {\n if (hasLoggedMismatchError) {\n return;\n }\n console.error(\"Hydration completed but contains mismatches.\");\n hasLoggedMismatchError = true;\n};\nconst isSVGContainer = (container) => container.namespaceURI.includes(\"svg\") && container.tagName !== \"foreignObject\";\nconst isMathMLContainer = (container) => container.namespaceURI.includes(\"MathML\");\nconst getContainerType = (container) => {\n if (container.nodeType !== 1) return void 0;\n if (isSVGContainer(container)) return \"svg\";\n if (isMathMLContainer(container)) return \"mathml\";\n return void 0;\n};\nconst isComment = (node) => node.nodeType === 8;\nfunction createHydrationFunctions(rendererInternals) {\n const {\n mt: mountComponent,\n p: patch,\n o: {\n patchProp,\n createText,\n nextSibling,\n parentNode,\n remove,\n insert,\n createComment\n }\n } = rendererInternals;\n const hydrate = (vnode, container) => {\n if (!container.hasChildNodes()) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Attempting to hydrate existing markup but container is empty. Performing full mount instead.`\n );\n patch(null, vnode, container);\n flushPostFlushCbs();\n container._vnode = vnode;\n return;\n }\n hydrateNode(container.firstChild, vnode, null, null, null);\n flushPostFlushCbs();\n container._vnode = vnode;\n };\n const hydrateNode = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized = false) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const isFragmentStart = isComment(node) && node.data === \"[\";\n const onMismatch = () => handleMismatch(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n isFragmentStart\n );\n const { type, ref, shapeFlag, patchFlag } = vnode;\n let domType = node.nodeType;\n vnode.el = node;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n def(node, \"__vnode\", vnode, true);\n def(node, \"__vueParentComponent\", parentComponent, true);\n }\n if (patchFlag === -2) {\n optimized = false;\n vnode.dynamicChildren = null;\n }\n let nextNode = null;\n switch (type) {\n case Text:\n if (domType !== 3) {\n if (vnode.children === \"\") {\n insert(vnode.el = createText(\"\"), parentNode(node), node);\n nextNode = node;\n } else {\n nextNode = onMismatch();\n }\n } else {\n if (node.data !== vnode.children) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text mismatch in`,\n node.parentNode,\n `\n - rendered on server: ${JSON.stringify(\n node.data\n )}\n - expected on client: ${JSON.stringify(vnode.children)}`\n );\n logMismatchError();\n node.data = vnode.children;\n }\n nextNode = nextSibling(node);\n }\n break;\n case Comment:\n if (isTemplateNode(node)) {\n nextNode = nextSibling(node);\n replaceNode(\n vnode.el = node.content.firstChild,\n node,\n parentComponent\n );\n } else if (domType !== 8 || isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = nextSibling(node);\n }\n break;\n case Static:\n if (isFragmentStart) {\n node = nextSibling(node);\n domType = node.nodeType;\n }\n if (domType === 1 || domType === 3) {\n nextNode = node;\n const needToAdoptContent = !vnode.children.length;\n for (let i = 0; i < vnode.staticCount; i++) {\n if (needToAdoptContent)\n vnode.children += nextNode.nodeType === 1 ? nextNode.outerHTML : nextNode.data;\n if (i === vnode.staticCount - 1) {\n vnode.anchor = nextNode;\n }\n nextNode = nextSibling(nextNode);\n }\n return isFragmentStart ? nextSibling(nextNode) : nextNode;\n } else {\n onMismatch();\n }\n break;\n case Fragment:\n if (!isFragmentStart) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateFragment(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n break;\n default:\n if (shapeFlag & 1) {\n if ((domType !== 1 || vnode.type.toLowerCase() !== node.tagName.toLowerCase()) && !isTemplateNode(node)) {\n nextNode = onMismatch();\n } else {\n nextNode = hydrateElement(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n }\n } else if (shapeFlag & 6) {\n vnode.slotScopeIds = slotScopeIds;\n const container = parentNode(node);\n if (isFragmentStart) {\n nextNode = locateClosingAnchor(node);\n } else if (isComment(node) && node.data === \"teleport start\") {\n nextNode = locateClosingAnchor(node, node.data, \"teleport end\");\n } else {\n nextNode = nextSibling(node);\n }\n mountComponent(\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n optimized\n );\n if (isAsyncWrapper(vnode) && !vnode.type.__asyncResolved) {\n let subTree;\n if (isFragmentStart) {\n subTree = createVNode(Fragment);\n subTree.anchor = nextNode ? nextNode.previousSibling : container.lastChild;\n } else {\n subTree = node.nodeType === 3 ? createTextVNode(\"\") : createVNode(\"div\");\n }\n subTree.el = node;\n vnode.component.subTree = subTree;\n }\n } else if (shapeFlag & 64) {\n if (domType !== 8) {\n nextNode = onMismatch();\n } else {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateChildren\n );\n }\n } else if (shapeFlag & 128) {\n nextNode = vnode.type.hydrate(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n getContainerType(parentNode(node)),\n slotScopeIds,\n optimized,\n rendererInternals,\n hydrateNode\n );\n } else if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) {\n warn$1(\"Invalid HostVNode type:\", type, `(${typeof type})`);\n }\n }\n if (ref != null) {\n setRef(ref, null, parentSuspense, vnode);\n }\n return nextNode;\n };\n const hydrateElement = (el, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!vnode.dynamicChildren;\n const { type, props, patchFlag, shapeFlag, dirs, transition } = vnode;\n const forcePatch = type === \"input\" || type === \"option\";\n if (!!(process.env.NODE_ENV !== \"production\") || forcePatch || patchFlag !== -1) {\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"created\");\n }\n let needCallTransitionHooks = false;\n if (isTemplateNode(el)) {\n needCallTransitionHooks = needTransition(\n null,\n // no need check parentSuspense in hydration\n transition\n ) && parentComponent && parentComponent.vnode.props && parentComponent.vnode.props.appear;\n const content = el.content.firstChild;\n if (needCallTransitionHooks) {\n const cls = content.getAttribute(\"class\");\n if (cls) content.$cls = cls;\n transition.beforeEnter(content);\n }\n replaceNode(content, el, parentComponent);\n vnode.el = el = content;\n }\n if (shapeFlag & 16 && // skip if element has innerHTML / textContent\n !(props && (props.innerHTML || props.textContent))) {\n let next = hydrateChildren(\n el.firstChild,\n vnode,\n el,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n let hasWarned = false;\n while (next) {\n if (!isMismatchAllowed(el, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n el,\n `\nServer rendered element contains more child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n const cur = next;\n next = next.nextSibling;\n remove(cur);\n }\n } else if (shapeFlag & 8) {\n let clientText = vnode.children;\n if (clientText[0] === \"\\n\" && (el.tagName === \"PRE\" || el.tagName === \"TEXTAREA\")) {\n clientText = clientText.slice(1);\n }\n const { textContent } = el;\n if (textContent !== clientText && // innerHTML normalize \\r\\n or \\r into a single \\n in the DOM\n textContent !== clientText.replace(/\\r\\n|\\r/g, \"\\n\")) {\n if (!isMismatchAllowed(el, 0 /* TEXT */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration text content mismatch on`,\n el,\n `\n - rendered on server: ${textContent}\n - expected on client: ${clientText}`\n );\n logMismatchError();\n }\n el.textContent = vnode.children;\n }\n }\n if (props) {\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__ || forcePatch || !optimized || patchFlag & (16 | 32)) {\n const isCustomElement = el.tagName.includes(\"-\");\n for (const key in props) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && // #11189 skip if this node has directives that have created hooks\n // as it could have mutated the DOM in any possible way\n !(dirs && dirs.some((d) => d.dir.created)) && propHasMismatch(el, key, props[key], vnode, parentComponent)) {\n logMismatchError();\n }\n if (forcePatch && (key.endsWith(\"value\") || key === \"indeterminate\") || isOn(key) && !isReservedProp(key) || // force hydrate v-bind with .prop modifiers\n key[0] === \".\" || isCustomElement) {\n patchProp(el, key, null, props[key], void 0, parentComponent);\n }\n }\n } else if (props.onClick) {\n patchProp(\n el,\n \"onClick\",\n null,\n props.onClick,\n void 0,\n parentComponent\n );\n } else if (patchFlag & 4 && isReactive(props.style)) {\n for (const key in props.style) props.style[key];\n }\n }\n let vnodeHooks;\n if (vnodeHooks = props && props.onVnodeBeforeMount) {\n invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n }\n if (dirs) {\n invokeDirectiveHook(vnode, null, parentComponent, \"beforeMount\");\n }\n if ((vnodeHooks = props && props.onVnodeMounted) || dirs || needCallTransitionHooks) {\n queueEffectWithSuspense(() => {\n vnodeHooks && invokeVNodeHook(vnodeHooks, parentComponent, vnode);\n needCallTransitionHooks && transition.enter(el);\n dirs && invokeDirectiveHook(vnode, null, parentComponent, \"mounted\");\n }, parentSuspense);\n }\n }\n return el.nextSibling;\n };\n const hydrateChildren = (node, parentVNode, container, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n optimized = optimized || !!parentVNode.dynamicChildren;\n const children = parentVNode.children;\n const l = children.length;\n let hasWarned = false;\n for (let i = 0; i < l; i++) {\n const vnode = optimized ? children[i] : children[i] = normalizeVNode(children[i]);\n const isText = vnode.type === Text;\n if (node) {\n if (isText && !optimized) {\n if (i + 1 < l && normalizeVNode(children[i + 1]).type === Text) {\n insert(\n createText(\n node.data.slice(vnode.children.length)\n ),\n container,\n nextSibling(node)\n );\n node.data = vnode.children;\n }\n }\n node = hydrateNode(\n node,\n vnode,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n } else if (isText && !vnode.children) {\n insert(vnode.el = createText(\"\"), container);\n } else {\n if (!isMismatchAllowed(container, 1 /* CHILDREN */)) {\n if ((!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && !hasWarned) {\n warn$1(\n `Hydration children mismatch on`,\n container,\n `\nServer rendered element contains fewer child nodes than client vdom.`\n );\n hasWarned = true;\n }\n logMismatchError();\n }\n patch(\n null,\n vnode,\n container,\n null,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n }\n }\n return node;\n };\n const hydrateFragment = (node, vnode, parentComponent, parentSuspense, slotScopeIds, optimized) => {\n const { slotScopeIds: fragmentSlotScopeIds } = vnode;\n if (fragmentSlotScopeIds) {\n slotScopeIds = slotScopeIds ? slotScopeIds.concat(fragmentSlotScopeIds) : fragmentSlotScopeIds;\n }\n const container = parentNode(node);\n const next = hydrateChildren(\n nextSibling(node),\n vnode,\n container,\n parentComponent,\n parentSuspense,\n slotScopeIds,\n optimized\n );\n if (next && isComment(next) && next.data === \"]\") {\n return nextSibling(vnode.anchor = next);\n } else {\n logMismatchError();\n insert(vnode.anchor = createComment(`]`), container, next);\n return next;\n }\n };\n const handleMismatch = (node, vnode, parentComponent, parentSuspense, slotScopeIds, isFragment) => {\n if (!isMismatchAllowed(node.parentElement, 1 /* CHILDREN */)) {\n (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_HYDRATION_MISMATCH_DETAILS__) && warn$1(\n `Hydration node mismatch:\n- rendered on server:`,\n node,\n node.nodeType === 3 ? `(text)` : isComment(node) && node.data === \"[\" ? `(start of fragment)` : ``,\n `\n- expected on client:`,\n vnode.type\n );\n logMismatchError();\n }\n vnode.el = null;\n if (isFragment) {\n const end = locateClosingAnchor(node);\n while (true) {\n const next2 = nextSibling(node);\n if (next2 && next2 !== end) {\n remove(next2);\n } else {\n break;\n }\n }\n }\n const next = nextSibling(node);\n const container = parentNode(node);\n remove(node);\n patch(\n null,\n vnode,\n container,\n next,\n parentComponent,\n parentSuspense,\n getContainerType(container),\n slotScopeIds\n );\n if (parentComponent) {\n parentComponent.vnode.el = vnode.el;\n updateHOCHostEl(parentComponent, vnode.el);\n }\n return next;\n };\n const locateClosingAnchor = (node, open = \"[\", close = \"]\") => {\n let match = 0;\n while (node) {\n node = nextSibling(node);\n if (node && isComment(node)) {\n if (node.data === open) match++;\n if (node.data === close) {\n if (match === 0) {\n return nextSibling(node);\n } else {\n match--;\n }\n }\n }\n }\n return node;\n };\n const replaceNode = (newNode, oldNode, parentComponent) => {\n const parentNode2 = oldNode.parentNode;\n if (parentNode2) {\n parentNode2.replaceChild(newNode, oldNode);\n }\n let parent = parentComponent;\n while (parent) {\n if (parent.vnode.el === oldNode) {\n parent.vnode.el = parent.subTree.el = newNode;\n }\n parent = parent.parent;\n }\n };\n const isTemplateNode = (node) => {\n return node.nodeType === 1 && node.tagName === \"TEMPLATE\";\n };\n return [hydrate, hydrateNode];\n}\nfunction propHasMismatch(el, key, clientValue, vnode, instance) {\n let mismatchType;\n let mismatchKey;\n let actual;\n let expected;\n if (key === \"class\") {\n if (el.$cls) {\n actual = el.$cls;\n delete el.$cls;\n } else {\n actual = el.getAttribute(\"class\");\n }\n expected = normalizeClass(clientValue);\n if (!isSetEqual(toClassSet(actual || \"\"), toClassSet(expected))) {\n mismatchType = 2 /* CLASS */;\n mismatchKey = `class`;\n }\n } else if (key === \"style\") {\n actual = el.getAttribute(\"style\") || \"\";\n expected = isString(clientValue) ? clientValue : stringifyStyle(normalizeStyle(clientValue));\n const actualMap = toStyleMap(actual);\n const expectedMap = toStyleMap(expected);\n if (vnode.dirs) {\n for (const { dir, value } of vnode.dirs) {\n if (dir.name === \"show\" && !value) {\n expectedMap.set(\"display\", \"none\");\n }\n }\n }\n if (instance) {\n resolveCssVars(instance, vnode, expectedMap);\n }\n if (!isMapEqual(actualMap, expectedMap)) {\n mismatchType = 3 /* STYLE */;\n mismatchKey = \"style\";\n }\n } else if (el instanceof SVGElement && isKnownSvgAttr(key) || el instanceof HTMLElement && (isBooleanAttr(key) || isKnownHtmlAttr(key))) {\n if (isBooleanAttr(key)) {\n actual = el.hasAttribute(key);\n expected = includeBooleanAttr(clientValue);\n } else if (clientValue == null) {\n actual = el.hasAttribute(key);\n expected = false;\n } else {\n if (el.hasAttribute(key)) {\n actual = el.getAttribute(key);\n } else if (key === \"value\" && el.tagName === \"TEXTAREA\") {\n actual = el.value;\n } else {\n actual = false;\n }\n expected = isRenderableAttrValue(clientValue) ? String(clientValue) : false;\n }\n if (actual !== expected) {\n mismatchType = 4 /* ATTRIBUTE */;\n mismatchKey = key;\n }\n }\n if (mismatchType != null && !isMismatchAllowed(el, mismatchType)) {\n const format = (v) => v === false ? `(not rendered)` : `${mismatchKey}=\"${v}\"`;\n const preSegment = `Hydration ${MismatchTypeString[mismatchType]} mismatch on`;\n const postSegment = `\n - rendered on server: ${format(actual)}\n - expected on client: ${format(expected)}\n Note: this mismatch is check-only. The DOM will not be rectified in production due to performance overhead.\n You should fix the source of the mismatch.`;\n {\n warn$1(preSegment, el, postSegment);\n }\n return true;\n }\n return false;\n}\nfunction toClassSet(str) {\n return new Set(str.trim().split(/\\s+/));\n}\nfunction isSetEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const s of a) {\n if (!b.has(s)) {\n return false;\n }\n }\n return true;\n}\nfunction toStyleMap(str) {\n const styleMap = /* @__PURE__ */ new Map();\n for (const item of str.split(\";\")) {\n let [key, value] = item.split(\":\");\n key = key.trim();\n value = value && value.trim();\n if (key && value) {\n styleMap.set(key, value);\n }\n }\n return styleMap;\n}\nfunction isMapEqual(a, b) {\n if (a.size !== b.size) {\n return false;\n }\n for (const [key, value] of a) {\n if (value !== b.get(key)) {\n return false;\n }\n }\n return true;\n}\nfunction resolveCssVars(instance, vnode, expectedMap) {\n const root = instance.subTree;\n if (instance.getCssVars && (vnode === root || root && root.type === Fragment && root.children.includes(vnode))) {\n const cssVars = instance.getCssVars();\n for (const key in cssVars) {\n const value = normalizeCssVarValue(cssVars[key]);\n expectedMap.set(`--${getEscapedCssVarName(key, false)}`, value);\n }\n }\n if (vnode === root && instance.parent) {\n resolveCssVars(instance.parent, instance.vnode, expectedMap);\n }\n}\nconst allowMismatchAttr = \"data-allow-mismatch\";\nconst MismatchTypeString = {\n [0 /* TEXT */]: \"text\",\n [1 /* CHILDREN */]: \"children\",\n [2 /* CLASS */]: \"class\",\n [3 /* STYLE */]: \"style\",\n [4 /* ATTRIBUTE */]: \"attribute\"\n};\nfunction isMismatchAllowed(el, allowedType) {\n if (allowedType === 0 /* TEXT */ || allowedType === 1 /* CHILDREN */) {\n while (el && !el.hasAttribute(allowMismatchAttr)) {\n el = el.parentElement;\n }\n }\n const allowedAttr = el && el.getAttribute(allowMismatchAttr);\n if (allowedAttr == null) {\n return false;\n } else if (allowedAttr === \"\") {\n return true;\n } else {\n const list = allowedAttr.split(\",\");\n if (allowedType === 0 /* TEXT */ && list.includes(\"children\")) {\n return true;\n }\n return list.includes(MismatchTypeString[allowedType]);\n }\n}\n\nconst requestIdleCallback = getGlobalThis().requestIdleCallback || ((cb) => setTimeout(cb, 1));\nconst cancelIdleCallback = getGlobalThis().cancelIdleCallback || ((id) => clearTimeout(id));\nconst hydrateOnIdle = (timeout = 1e4) => (hydrate) => {\n const id = requestIdleCallback(hydrate, { timeout });\n return () => cancelIdleCallback(id);\n};\nfunction elementIsVisibleInViewport(el) {\n const { top, left, bottom, right } = el.getBoundingClientRect();\n const { innerHeight, innerWidth } = window;\n return (top > 0 && top < innerHeight || bottom > 0 && bottom < innerHeight) && (left > 0 && left < innerWidth || right > 0 && right < innerWidth);\n}\nconst hydrateOnVisible = (opts) => (hydrate, forEach) => {\n const ob = new IntersectionObserver((entries) => {\n for (const e of entries) {\n if (!e.isIntersecting) continue;\n ob.disconnect();\n hydrate();\n break;\n }\n }, opts);\n forEach((el) => {\n if (!(el instanceof Element)) return;\n if (elementIsVisibleInViewport(el)) {\n hydrate();\n ob.disconnect();\n return false;\n }\n ob.observe(el);\n });\n return () => ob.disconnect();\n};\nconst hydrateOnMediaQuery = (query) => (hydrate) => {\n if (query) {\n const mql = matchMedia(query);\n if (mql.matches) {\n hydrate();\n } else {\n mql.addEventListener(\"change\", hydrate, { once: true });\n return () => mql.removeEventListener(\"change\", hydrate);\n }\n }\n};\nconst hydrateOnInteraction = (interactions = []) => (hydrate, forEach) => {\n if (isString(interactions)) interactions = [interactions];\n let hasHydrated = false;\n const doHydrate = (e) => {\n if (!hasHydrated) {\n hasHydrated = true;\n teardown();\n hydrate();\n e.target.dispatchEvent(new e.constructor(e.type, e));\n }\n };\n const teardown = () => {\n forEach((el) => {\n for (const i of interactions) {\n el.removeEventListener(i, doHydrate);\n }\n });\n };\n forEach((el) => {\n for (const i of interactions) {\n el.addEventListener(i, doHydrate, { once: true });\n }\n });\n return teardown;\n};\nfunction forEachElement(node, cb) {\n if (isComment(node) && node.data === \"[\") {\n let depth = 1;\n let next = node.nextSibling;\n while (next) {\n if (next.nodeType === 1) {\n const result = cb(next);\n if (result === false) {\n break;\n }\n } else if (isComment(next)) {\n if (next.data === \"]\") {\n if (--depth === 0) break;\n } else if (next.data === \"[\") {\n depth++;\n }\n }\n next = next.nextSibling;\n }\n } else {\n cb(node);\n }\n}\n\nconst isAsyncWrapper = (i) => !!i.type.__asyncLoader;\n// @__NO_SIDE_EFFECTS__\nfunction defineAsyncComponent(source) {\n if (isFunction(source)) {\n source = { loader: source };\n }\n const {\n loader,\n loadingComponent,\n errorComponent,\n delay = 200,\n hydrate: hydrateStrategy,\n timeout,\n // undefined = never times out\n suspensible = true,\n onError: userOnError\n } = source;\n let pendingRequest = null;\n let resolvedComp;\n let retries = 0;\n const retry = () => {\n retries++;\n pendingRequest = null;\n return load();\n };\n const load = () => {\n let thisRequest;\n return pendingRequest || (thisRequest = pendingRequest = loader().catch((err) => {\n err = err instanceof Error ? err : new Error(String(err));\n if (userOnError) {\n return new Promise((resolve, reject) => {\n const userRetry = () => resolve(retry());\n const userFail = () => reject(err);\n userOnError(err, userRetry, userFail, retries + 1);\n });\n } else {\n throw err;\n }\n }).then((comp) => {\n if (thisRequest !== pendingRequest && pendingRequest) {\n return pendingRequest;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && !comp) {\n warn$1(\n `Async component loader resolved to undefined. If you are using retry(), make sure to return its return value.`\n );\n }\n if (comp && (comp.__esModule || comp[Symbol.toStringTag] === \"Module\")) {\n comp = comp.default;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && comp && !isObject(comp) && !isFunction(comp)) {\n throw new Error(`Invalid async component load result: ${comp}`);\n }\n resolvedComp = comp;\n return comp;\n }));\n };\n return defineComponent({\n name: \"AsyncComponentWrapper\",\n __asyncLoader: load,\n __asyncHydrate(el, instance, hydrate) {\n let patched = false;\n (instance.bu || (instance.bu = [])).push(() => patched = true);\n const performHydrate = () => {\n if (patched) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `Skipping lazy hydration for component '${getComponentName(resolvedComp) || resolvedComp.__file}': it was updated before lazy hydration performed.`\n );\n }\n return;\n }\n hydrate();\n };\n const doHydrate = hydrateStrategy ? () => {\n const teardown = hydrateStrategy(\n performHydrate,\n (cb) => forEachElement(el, cb)\n );\n if (teardown) {\n (instance.bum || (instance.bum = [])).push(teardown);\n }\n } : performHydrate;\n if (resolvedComp) {\n doHydrate();\n } else {\n load().then(() => !instance.isUnmounted && doHydrate());\n }\n },\n get __asyncResolved() {\n return resolvedComp;\n },\n setup() {\n const instance = currentInstance;\n markAsyncBoundary(instance);\n if (resolvedComp) {\n return () => createInnerComp(resolvedComp, instance);\n }\n const onError = (err) => {\n pendingRequest = null;\n handleError(\n err,\n instance,\n 13,\n !errorComponent\n );\n };\n if (suspensible && instance.suspense || isInSSRComponentSetup) {\n return load().then((comp) => {\n return () => createInnerComp(comp, instance);\n }).catch((err) => {\n onError(err);\n return () => errorComponent ? createVNode(errorComponent, {\n error: err\n }) : null;\n });\n }\n const loaded = ref(false);\n const error = ref();\n const delayed = ref(!!delay);\n if (delay) {\n setTimeout(() => {\n delayed.value = false;\n }, delay);\n }\n if (timeout != null) {\n setTimeout(() => {\n if (!loaded.value && !error.value) {\n const err = new Error(\n `Async component timed out after ${timeout}ms.`\n );\n onError(err);\n error.value = err;\n }\n }, timeout);\n }\n load().then(() => {\n loaded.value = true;\n if (instance.parent && isKeepAlive(instance.parent.vnode)) {\n instance.parent.update();\n }\n }).catch((err) => {\n onError(err);\n error.value = err;\n });\n return () => {\n if (loaded.value && resolvedComp) {\n return createInnerComp(resolvedComp, instance);\n } else if (error.value && errorComponent) {\n return createVNode(errorComponent, {\n error: error.value\n });\n } else if (loadingComponent && !delayed.value) {\n return createInnerComp(\n loadingComponent,\n instance\n );\n }\n };\n }\n });\n}\nfunction createInnerComp(comp, parent) {\n const { ref: ref2, props, children, ce } = parent.vnode;\n const vnode = createVNode(comp, props, children);\n vnode.ref = ref2;\n vnode.ce = ce;\n delete parent.vnode.ce;\n return vnode;\n}\n\nconst isKeepAlive = (vnode) => vnode.type.__isKeepAlive;\nconst KeepAliveImpl = {\n name: `KeepAlive`,\n // Marker for special handling inside the renderer. We are not using a ===\n // check directly on KeepAlive in the renderer, because importing it directly\n // would prevent it from being tree-shaken.\n __isKeepAlive: true,\n props: {\n include: [String, RegExp, Array],\n exclude: [String, RegExp, Array],\n max: [String, Number]\n },\n setup(props, { slots }) {\n const instance = getCurrentInstance();\n const sharedContext = instance.ctx;\n if (!sharedContext.renderer) {\n return () => {\n const children = slots.default && slots.default();\n return children && children.length === 1 ? children[0] : children;\n };\n }\n const cache = /* @__PURE__ */ new Map();\n const keys = /* @__PURE__ */ new Set();\n let current = null;\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n instance.__v_cache = cache;\n }\n const parentSuspense = instance.suspense;\n const {\n renderer: {\n p: patch,\n m: move,\n um: _unmount,\n o: { createElement }\n }\n } = sharedContext;\n const storageContainer = createElement(\"div\");\n sharedContext.activate = (vnode, container, anchor, namespace, optimized) => {\n const instance2 = vnode.component;\n move(vnode, container, anchor, 0, parentSuspense);\n patch(\n instance2.vnode,\n vnode,\n container,\n anchor,\n instance2,\n parentSuspense,\n namespace,\n vnode.slotScopeIds,\n optimized\n );\n queuePostRenderEffect(() => {\n instance2.isDeactivated = false;\n if (instance2.a) {\n invokeArrayFns(instance2.a);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeMounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n };\n sharedContext.deactivate = (vnode) => {\n const instance2 = vnode.component;\n invalidateMount(instance2.m);\n invalidateMount(instance2.a);\n move(vnode, storageContainer, null, 1, parentSuspense);\n queuePostRenderEffect(() => {\n if (instance2.da) {\n invokeArrayFns(instance2.da);\n }\n const vnodeHook = vnode.props && vnode.props.onVnodeUnmounted;\n if (vnodeHook) {\n invokeVNodeHook(vnodeHook, instance2.parent, vnode);\n }\n instance2.isDeactivated = true;\n }, parentSuspense);\n if (!!(process.env.NODE_ENV !== \"production\") || __VUE_PROD_DEVTOOLS__) {\n devtoolsComponentAdded(instance2);\n }\n if (!!(process.env.NODE_ENV !== \"production\") && true) {\n instance2.__keepAliveStorageContainer = storageContainer;\n }\n };\n function unmount(vnode) {\n resetShapeFlag(vnode);\n _unmount(vnode, instance, parentSuspense, true);\n }\n function pruneCache(filter) {\n cache.forEach((vnode, key) => {\n const name = getComponentName(\n isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : vnode.type\n );\n if (name && !filter(name)) {\n pruneCacheEntry(key);\n }\n });\n }\n function pruneCacheEntry(key) {\n const cached = cache.get(key);\n if (cached && (!current || !isSameVNodeType(cached, current))) {\n unmount(cached);\n } else if (current) {\n resetShapeFlag(current);\n }\n cache.delete(key);\n keys.delete(key);\n }\n watch(\n () => [props.include, props.exclude],\n ([include, exclude]) => {\n include && pruneCache((name) => matches(include, name));\n exclude && pruneCache((name) => !matches(exclude, name));\n },\n // prune post-render after `current` has been updated\n { flush: \"post\", deep: true }\n );\n let pendingCacheKey = null;\n const cacheSubtree = () => {\n if (pendingCacheKey != null) {\n if (isSuspense(instance.subTree.type)) {\n queuePostRenderEffect(() => {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }, instance.subTree.suspense);\n } else {\n cache.set(pendingCacheKey, getInnerChild(instance.subTree));\n }\n }\n };\n onMounted(cacheSubtree);\n onUpdated(cacheSubtree);\n onBeforeUnmount(() => {\n cache.forEach((cached) => {\n const { subTree, suspense } = instance;\n const vnode = getInnerChild(subTree);\n if (cached.type === vnode.type && cached.key === vnode.key) {\n resetShapeFlag(vnode);\n const da = vnode.component.da;\n da && queuePostRenderEffect(da, suspense);\n return;\n }\n unmount(cached);\n });\n });\n return () => {\n pendingCacheKey = null;\n if (!slots.default) {\n return current = null;\n }\n const children = slots.default();\n const rawVNode = children[0];\n if (children.length > 1) {\n if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(`KeepAlive should contain exactly one component child.`);\n }\n current = null;\n return children;\n } else if (!isVNode(rawVNode) || !(rawVNode.shapeFlag & 4) && !(rawVNode.shapeFlag & 128)) {\n current = null;\n return rawVNode;\n }\n let vnode = getInnerChild(rawVNode);\n if (vnode.type === Comment) {\n current = null;\n return vnode;\n }\n const comp = vnode.type;\n const name = getComponentName(\n isAsyncWrapper(vnode) ? vnode.type.__asyncResolved || {} : comp\n );\n const { include, exclude, max } = props;\n if (include && (!name || !matches(include, name)) || exclude && name && matches(exclude, name)) {\n vnode.shapeFlag &= -257;\n current = vnode;\n return rawVNode;\n }\n const key = vnode.key == null ? comp : vnode.key;\n const cachedVNode = cache.get(key);\n if (vnode.el) {\n vnode = cloneVNode(vnode);\n if (rawVNode.shapeFlag & 128) {\n rawVNode.ssContent = vnode;\n }\n }\n pendingCacheKey = key;\n if (cachedVNode) {\n vnode.el = cachedVNode.el;\n vnode.component = cachedVNode.component;\n if (vnode.transition) {\n setTransitionHooks(vnode, vnode.transition);\n }\n vnode.shapeFlag |= 512;\n keys.delete(key);\n keys.add(key);\n } else {\n keys.add(key);\n if (max && keys.size > parseInt(max, 10)) {\n pruneCacheEntry(keys.values().next().value);\n }\n }\n vnode.shapeFlag |= 256;\n current = vnode;\n return isSuspense(rawVNode.type) ? rawVNode : vnode;\n };\n }\n};\nconst KeepAlive = KeepAliveImpl;\nfunction matches(pattern, name) {\n if (isArray(pattern)) {\n return pattern.some((p) => matches(p, name));\n } else if (isString(pattern)) {\n return pattern.split(\",\").includes(name);\n } else if (isRegExp(pattern)) {\n pattern.lastIndex = 0;\n return pattern.test(name);\n }\n return false;\n}\nfunction onActivated(hook, target) {\n registerKeepAliveHook(hook, \"a\", target);\n}\nfunction onDeactivated(hook, target) {\n registerKeepAliveHook(hook, \"da\", target);\n}\nfunction registerKeepAliveHook(hook, type, target = currentInstance) {\n const wrappedHook = hook.__wdc || (hook.__wdc = () => {\n let current = target;\n while (current) {\n if (current.isDeactivated) {\n return;\n }\n current = current.parent;\n }\n return hook();\n });\n injectHook(type, wrappedHook, target);\n if (target) {\n let current = target.parent;\n while (current && current.parent) {\n if (isKeepAlive(current.parent.vnode)) {\n injectToKeepAliveRoot(wrappedHook, type, target, current);\n }\n current = current.parent;\n }\n }\n}\nfunction injectToKeepAliveRoot(hook, type, target, keepAliveRoot) {\n const injected = injectHook(\n type,\n hook,\n keepAliveRoot,\n true\n /* prepend */\n );\n onUnmounted(() => {\n remove(keepAliveRoot[type], injected);\n }, target);\n}\nfunction resetShapeFlag(vnode) {\n vnode.shapeFlag &= -257;\n vnode.shapeFlag &= -513;\n}\nfunction getInnerChild(vnode) {\n return vnode.shapeFlag & 128 ? vnode.ssContent : vnode;\n}\n\nfunction injectHook(type, hook, target = currentInstance, prepend = false) {\n if (target) {\n const hooks = target[type] || (target[type] = []);\n const wrappedHook = hook.__weh || (hook.__weh = (...args) => {\n pauseTracking();\n const reset = setCurrentInstance(target);\n const res = callWithAsyncErrorHandling(hook, target, type, args);\n reset();\n resetTracking();\n return res;\n });\n if (prepend) {\n hooks.unshift(wrappedHook);\n } else {\n hooks.push(wrappedHook);\n }\n return wrappedHook;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n const apiName = toHandlerKey(ErrorTypeStrings$1[type].replace(/ hook$/, \"\"));\n warn$1(\n `${apiName} is called when there is no active component instance to be associated with. Lifecycle injection APIs can only be used during execution of setup().` + (` If you are using async setup(), make sure to register lifecycle hooks before the first await statement.` )\n );\n }\n}\nconst createHook = (lifecycle) => (hook, target = currentInstance) => {\n if (!isInSSRComponentSetup || lifecycle === \"sp\") {\n injectHook(lifecycle, (...args) => hook(...args), target);\n }\n};\nconst onBeforeMount = createHook(\"bm\");\nconst onMounted = createHook(\"m\");\nconst onBeforeUpdate = createHook(\n \"bu\"\n);\nconst onUpdated = createHook(\"u\");\nconst onBeforeUnmount = createHook(\n \"bum\"\n);\nconst onUnmounted = createHook(\"um\");\nconst onServerPrefetch = createHook(\n \"sp\"\n);\nconst onRenderTriggered = createHook(\"rtg\");\nconst onRenderTracked = createHook(\"rtc\");\nfunction onErrorCaptured(hook, target = currentInstance) {\n injectHook(\"ec\", hook, target);\n}\n\nconst COMPONENTS = \"components\";\nconst DIRECTIVES = \"directives\";\nfunction resolveComponent(name, maybeSelfReference) {\n return resolveAsset(COMPONENTS, name, true, maybeSelfReference) || name;\n}\nconst NULL_DYNAMIC_COMPONENT = /* @__PURE__ */ Symbol.for(\"v-ndc\");\nfunction resolveDynamicComponent(component) {\n if (isString(component)) {\n return resolveAsset(COMPONENTS, component, false) || component;\n } else {\n return component || NULL_DYNAMIC_COMPONENT;\n }\n}\nfunction resolveDirective(name) {\n return resolveAsset(DIRECTIVES, name);\n}\nfunction resolveAsset(type, name, warnMissing = true, maybeSelfReference = false) {\n const instance = currentRenderingInstance || currentInstance;\n if (instance) {\n const Component = instance.type;\n if (type === COMPONENTS) {\n const selfName = getComponentName(\n Component,\n false\n );\n if (selfName && (selfName === name || selfName === camelize(name) || selfName === capitalize(camelize(name)))) {\n return Component;\n }\n }\n const res = (\n // local registration\n // check instance[type] first which is resolved for options API\n resolve(instance[type] || Component[type], name) || // global registration\n resolve(instance.appContext[type], name)\n );\n if (!res && maybeSelfReference) {\n return Component;\n }\n if (!!(process.env.NODE_ENV !== \"production\") && warnMissing && !res) {\n const extra = type === COMPONENTS ? `\nIf this is a native custom element, make sure to exclude it from component resolution via compilerOptions.isCustomElement.` : ``;\n warn$1(`Failed to resolve ${type.slice(0, -1)}: ${name}${extra}`);\n }\n return res;\n } else if (!!(process.env.NODE_ENV !== \"production\")) {\n warn$1(\n `resolve${capitalize(type.slice(0, -1))} can only be used in render() or setup().`\n );\n }\n}\nfunction resolve(registry, name) {\n return registry && (registry[name] || registry[camelize(name)] || registry[capitalize(camelize(name))]);\n}\n\nfunction renderList(source, renderItem, cache, index) {\n let ret;\n const cached = cache && cache[index];\n const sourceIsArray = isArray(source);\n if (sourceIsArray || isString(source)) {\n const sourceIsReactiveArray = sourceIsArray && isReactive(source);\n let needsWrap = false;\n let isReadonlySource = false;\n if (sourceIsReactiveArray) {\n needsWrap = !isShallow(source);\n isReadonlySource = isReadonly(source);\n source = shallowReadArray(source);\n }\n ret = new Array(source.length);\n for (let i = 0, l = source.length; i < l; i++) {\n ret[i] = renderItem(\n needsWrap ? isReadonlySource ? toReadonly(toReactive(source[i])) : toReactive(source[i]) : source[i],\n i,\n void 0,\n cached && cached[i]\n );\n }\n } else if (typeof source === \"number\") {\n if (!!(process.env.NODE_ENV !== \"production\") && !Number.isInteger(source)) {\n warn$1(`The v-for range expect an integer value but got ${source}.`);\n }\n ret = new Array(source);\n for (let i = 0; i < source; i++) {\n ret[i] = renderItem(i + 1, i, void 0, cached && cached[i]);\n }\n } else if (isObject(source)) {\n if (source[Symbol.iterator]) {\n ret = Array.from(\n source,\n (item, i) => renderItem(item, i, void 0, cached && cached[i])\n );\n } else {\n const keys = Object.keys(source);\n ret = new Array(keys.length);\n for (let i = 0, l = keys.length; i < l; i++) {\n const key = keys[i];\n ret[i] = renderItem(source[key], key, i, cached && cached[i]);\n }\n }\n } else {\n ret = [];\n }\n if (cache) {\n cache[index] = ret;\n }\n return ret;\n}\n\nfunction createSlots(slots, dynamicSlots) {\n for (let i = 0; i < dynamicSlots.length; i++) {\n const slot = dynamicSlots[i];\n if (isArray(slot)) {\n for (let j = 0; j < slot.length; j++) {\n slots[slot[j].name] = slot[j].fn;\n }\n } else if (slot) {\n slots[slot.name] = slot.key ? (...args) => {\n const res = slot.fn(...args);\n if (res) res.key = slot.key;\n return res;\n } : slot.fn;\n }\n }\n return slots;\n}\n\nfunction renderSlot(slots, name, props = {}, fallback, noSlotted) {\n if (currentRenderingInstance.ce || currentRenderingInstance.parent && isAsyncWrapper(currentRenderingInstance.parent) && currentRenderingInstance.parent.ce) {\n const hasProps = Object.keys(props).length > 0;\n if (name !== \"default\") props.name = name;\n return openBlock(), createBlock(\n Fragment,\n null,\n [createVNode(\"slot\", props, fallback && fallback())],\n hasProps ? -2 : 64\n );\n }\n let slot = slots[name];\n if (!!(process.env.NODE_ENV !== \"production\") && slot && slot.length > 1) {\n warn$1(\n `SSR-optimized slot function detected in a non-SSR-optimized render function. You need to mark this component with $dynamic-slots in the parent template.`\n );\n slot = () => [];\n }\n if (slot && slot._c) {\n slot._d = false;\n }\n openBlock();\n const validSlotContent = slot && ensureValidVNode(slot(props));\n const slotKey = props.key || // slot content array of a dynamic conditional slot may have a branch\n // key attached in the `createSlots` helper, respect that\n validSlotContent && validSlotContent.key;\n const rendered = createBlock(\n Fragment,\n {\n key: (slotKey && !isSymbol(slotKey) ? slotKey : `_${name}`) + // #7256 force differentiate fallback content from actual content\n (!validSlotContent && fallback ? \"_fb\" : \"\")\n },\n validSlotContent || (fallback ? fallback() : []),\n validSlotContent && slots._ === 1 ? 64 : -2\n );\n if (!noSlotted && rendered.scopeId) {\n rendered.slotScopeIds = [rendered.scopeId + \"-s\"];\n }\n if (slot && slot._c) {\n slot._d = true;\n }\n return rendered;\n}\nfunction ensureValidVNode(vnodes) {\n return vnodes.some((child) => {\n if (!isVNode(child)) return true;\n if (child.type === Comment) return false;\n if (child.type === Fragment && !ensureValidVNode(child.children))\n return false;\n return true;\n }) ? vnodes : null;\n}\n\nfunction toHandlers(obj, preserveCaseIfNecessary) {\n const ret = {};\n if (!!(process.env.NODE_ENV !== \"production\") && !isObject(obj)) {\n warn$1(`v-on with no argument expects an object value.`);\n return ret;\n }\n for (const key in obj) {\n ret[preserveCaseIfNecessary && /[A-Z]/.test(key) ? `on:${key}` : toHandlerKey(key)] = obj[key];\n }\n return ret;\n}\n\nconst getPublicInstance = (i) => {\n if (!i) return null;\n if (isStatefulComponent(i)) return getComponentPublicInstance(i);\n return getPublicInstance(i.parent);\n};\nconst publicPropertiesMap = (\n // Move PURE marker to new line to workaround compiler discarding it\n // due to type annotation\n /* @__PURE__ */ extend(/* @__PURE__ */ Object.create(null), {\n $: (i) => i,\n $el: (i) => i.vnode.el,\n $data: (i) => i.data,\n $props: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.props) : i.props,\n $attrs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.attrs) : i.attrs,\n $slots: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.slots) : i.slots,\n $refs: (i) => !!(process.env.NODE_ENV !== \"production\") ? shallowReadonly(i.refs) : i.refs,\n $parent: (i) => getPublicInstance(i.parent),\n $root: (i) => getPublicInstance(i.root),\n $host: (i) => i.ce,\n $emit: (i) => i.emit,\n $options: (i) => __VUE_OPTIONS_API__ ? resolveMergedOptions(i) : i.type,\n $forceUpdate: (i) => i.f || (i.f = () => {\n queueJob(i.update);\n }),\n $nextTick: (i) => i.n || (i.n = nextTick.bind(i.proxy)),\n $watch: (i) => __VUE_OPTIONS_API__ ? instanceWatch.bind(i) : NOOP\n })\n);\nconst isReservedPrefix = (key) => key === \"_\" || key === \"$\";\nconst hasSetupBinding = (state, key) => state !== EMPTY_OBJ && !state.__isScriptSetup && hasOwn(state, key);\nconst PublicInstanceProxyHandlers = {\n get({ _: instance }, key) {\n if (key === \"__v_skip\") {\n return true;\n }\n const { ctx, setupState, data, props, accessCache, type, appContext } = instance;\n if (!!(process.env.NODE_ENV !== \"production\") && key === \"__isVue\") {\n return true;\n }\n if (key[0] !== \"$\") {\n const n = accessCache[key];\n if (n !== void 0) {\n switch (n) {\n case 1 /* SETUP */:\n return setupState[key];\n case 2 /* DATA */:\n return data[key];\n case 4 /* CONTEXT */:\n return ctx[key];\n case 3 /* PROPS */:\n return props[key];\n }\n } else if (hasSetupBinding(setupState, key)) {\n accessCache[key] = 1 /* SETUP */;\n return setupState[key];\n } else if (__VUE_OPTIONS_API__ && data !== EMPTY_OBJ && hasOwn(data, key)) {\n accessCache[key] = 2 /* DATA */;\n return data[key];\n } else if (hasOwn(props, key)) {\n accessCache[key] = 3 /* PROPS */;\n return props[key];\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (!__VUE_OPTIONS_API__ || shouldCacheAccess) {\n accessCache[key] = 0 /* OTHER */;\n }\n }\n const publicGetter = publicPropertiesMap[key];\n let cssModule, globalProperties;\n if (publicGetter) {\n if (key === \"$attrs\") {\n track(instance.attrs, \"get\", \"\");\n !!(process.env.NODE_ENV !== \"production\") && markAttrsAccessed();\n } else if (!!(process.env.NODE_ENV !== \"production\") && key === \"$slots\") {\n track(instance, \"get\", key);\n }\n return publicGetter(instance);\n } else if (\n // css module (injected by vue-loader)\n (cssModule = type.__cssModules) && (cssModule = cssModule[key])\n ) {\n return cssModule;\n } else if (ctx !== EMPTY_OBJ && hasOwn(ctx, key)) {\n accessCache[key] = 4 /* CONTEXT */;\n return ctx[key];\n } else if (\n // global properties\n globalProperties = appContext.config.globalProperties, hasOwn(globalProperties, key)\n ) {\n {\n return globalProperties[key];\n }\n } else if (!!(process.env.NODE_ENV !== \"production\") && currentRenderingInstance && (!isString(key) || // #1091 avoid internal isRef/isVNode checks on component instance leading\n // to infinite warning loop\n key.indexOf(\"__v\") !== 0)) {\n if (data !== EMPTY_OBJ && isReservedPrefix(key[0]) && hasOwn(data, key)) {\n warn$1(\n `Property ${JSON.stringify(\n key\n )} must be accessed via $data because it starts with a reserved character (\"$\" or \"_\") and is not proxied on the render context.`\n );\n } else if (instance === currentRenderingInstance) {\n warn$1(\n `Property ${JSON.stringify(key)} was accessed during render but is not defined on instance.`\n );\n }\n }\n },\n set({ _: instance }, key, value) {\n const { data, setupState, ctx } = instance;\n if (hasSetupBinding(setupState, key)) {\n setupState[key] = value;\n return true;\n } else if (!!(process.env.NODE_ENV !== \"production\") && setupState.__isScriptSetup && hasOwn(setupState, key)) {\n warn$1(`Cannot mutate - - - - - - - - - - -
- - - - - - diff --git a/deploy-package-20260223-151231/frontend/manifest.json b/deploy-package-20260223-151231/frontend/manifest.json deleted file mode 100644 index 20716e4..0000000 --- a/deploy-package-20260223-151231/frontend/manifest.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "name": "ROA2WEB", - "short_name": "ROA2WEB", - "description": "Aplicatie ERP - Rapoarte si Introduceri Date", - "start_url": "/roa2web/", - "scope": "/roa2web/", - "id": "/roa2web/", - "display": "standalone", - "background_color": "#ffffff", - "theme_color": "#2563eb", - "orientation": "portrait-primary", - "icons": [ - { - "src": "/roa2web/icon-192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "any" - }, - { - "src": "/roa2web/icon-512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "any" - }, - { - "src": "/roa2web/icon-192.png", - "sizes": "192x192", - "type": "image/png", - "purpose": "maskable" - }, - { - "src": "/roa2web/icon-512.png", - "sizes": "512x512", - "type": "image/png", - "purpose": "maskable" - } - ] -} diff --git a/deploy-package-20260223-151231/frontend/sw.js b/deploy-package-20260223-151231/frontend/sw.js deleted file mode 100644 index c8a1a2e..0000000 --- a/deploy-package-20260223-151231/frontend/sw.js +++ /dev/null @@ -1,89 +0,0 @@ -// Service Worker for ROA2WEB PWA -// Network-first strategy to always show fresh content - -const CACHE_VERSION = 'v2'; -const CACHE_NAME = `roa2web-${CACHE_VERSION}`; - -// Install event - skip waiting to activate immediately -self.addEventListener('install', (event) => { - console.log('[SW] Installing service worker...'); - self.skipWaiting(); -}); - -// Activate event - clear old caches and claim clients -self.addEventListener('activate', (event) => { - console.log('[SW] Service worker activated'); - event.waitUntil( - Promise.all([ - // Clear all old caches - caches.keys().then(cacheNames => { - return Promise.all( - cacheNames.map(cacheName => { - if (cacheName !== CACHE_NAME) { - console.log('[SW] Deleting old cache:', cacheName); - return caches.delete(cacheName); - } - }) - ); - }), - // Take control of all clients immediately - clients.claim() - ]).then(() => { - // Notify all clients that a new SW version is active - return clients.matchAll({ includeUncontrolled: true }).then(allClients => { - allClients.forEach(client => { - client.postMessage({ type: 'SW_UPDATED' }); - }); - }); - }) - ); -}); - -// Message handler - allows pages to trigger SW actions -self.addEventListener('message', (event) => { - if (event.data && event.data.type === 'SKIP_WAITING') { - self.skipWaiting(); - } -}); - -// Fetch event - ALWAYS network first, no caching for HTML/JS/CSS -self.addEventListener('fetch', (event) => { - const url = new URL(event.request.url); - - // Skip non-GET requests - if (event.request.method !== 'GET') { - return; - } - - // API calls - always network, no cache - if (url.pathname.includes('/api/')) { - event.respondWith(fetch(event.request)); - return; - } - - // index.html - bypass HTTP cache entirely to always get fresh app shell - if ( - url.pathname.endsWith('index.html') || - url.pathname === '/roa2web/' || - url.pathname === '/roa2web' - ) { - event.respondWith( - fetch(event.request, { cache: 'no-cache' }) - .catch(() => caches.match(event.request)) - ); - return; - } - - // HTML, JS, CSS - always fetch fresh from network - // This ensures PWA always loads latest version - event.respondWith( - fetch(event.request) - .then(response => { - return response; - }) - .catch(() => { - // Only fallback to cache if network fails - return caches.match(event.request); - }) - ); -}); diff --git a/deploy-package-20260223-151231/frontend/web.config b/deploy-package-20260223-151231/frontend/web.config deleted file mode 100644 index e397841..0000000 --- a/deploy-package-20260223-151231/frontend/web.config +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/deploy-package-20260223-151231/scripts/Check-And-Deploy.ps1 b/deploy-package-20260223-151231/scripts/Check-And-Deploy.ps1 deleted file mode 100644 index 5fdb5e3..0000000 --- a/deploy-package-20260223-151231/scripts/Check-And-Deploy.ps1 +++ /dev/null @@ -1,547 +0,0 @@ -<# -.SYNOPSIS - ROA2WEB - Auto-Deploy Monitor (Server-Side) - Ultrathin Monolith - -.DESCRIPTION - Server-side script that monitors C:\Temp\ for new deployment packages - and automatically deploys them using ROA2WEB-Console.ps1. - - Designed for ULTRATHIN MONOLITH architecture: - - Single unified backend service (ROA2WEB-Backend) - - All modules deployed together (Reports, Data Entry, Telegram) - - Automatic detection and deployment - - Can run: - - Via Scheduled Task (automated, silent) - - Interactive mode (manual execution with menu) - - Non-interactive mode (command-line automation) - -.PARAMETER Interactive - Run in interactive mode with menu - -.PARAMETER WatchPath - Path to monitor for deployment packages (default: C:\Temp) - -.PARAMETER StateFile - Path to state file tracking last deployment (default: C:\Temp\ROA2WEB-Scripts\last-deploy.json) - -.PARAMETER ConsoleScriptPath - Path to ROA2WEB-Console.ps1 script - -.PARAMETER LogPath - Path to log file directory (default: C:\Temp\ROA2WEB-Scripts\Logs) - -.PARAMETER CheckOnly - Check for updates without deploying - -.EXAMPLE - .\Check-And-Deploy.ps1 - Check for new packages and deploy automatically (silent) - -.EXAMPLE - .\Check-And-Deploy.ps1 -Interactive - Show interactive menu with deployment options - -.EXAMPLE - .\Check-And-Deploy.ps1 -CheckOnly - Check for new packages without deploying - -.NOTES - Author: ROA2WEB Team - Version: 1.0 (Auto-Deploy Monitor) - Requires: Administrator privileges, PowerShell 5.1+ - - Designed to run via Scheduled Task for automated deployments. -#> - -[CmdletBinding()] -param( - [switch]$Interactive, - [string]$WatchPath = "C:\Temp", - [string]$StateFile = "C:\Temp\ROA2WEB-Scripts\last-deploy.json", - [string]$ConsoleScriptPath = "", - [string]$LogPath = "C:\Temp\ROA2WEB-Scripts\Logs", - [switch]$CheckOnly -) - -$ErrorActionPreference = "Stop" - -# ============================================================================= -# CONFIGURATION -# ============================================================================= - -$script:Config = @{ - WatchPath = $WatchPath - StateFile = $StateFile - LogPath = $LogPath - ConsoleScriptPath = if ($ConsoleScriptPath) { - $ConsoleScriptPath - } else { - # Auto-detect ROA2WEB-Console.ps1 - $possiblePaths = @( - "C:\inetpub\wwwroot\roa2web\scripts\ROA2WEB-Console.ps1", - (Join-Path $PSScriptRoot "ROA2WEB-Console.ps1") - ) - $found = $possiblePaths | Where-Object { Test-Path $_ } | Select-Object -First 1 - if ($found) { $found } else { "" } - } -} - -# ============================================================================= -# HELPER FUNCTIONS -# ============================================================================= - -function Write-Log { - param( - [string]$Message, - [ValidateSet("INFO", "SUCCESS", "WARNING", "ERROR")] - [string]$Level = "INFO" - ) - - $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" - $logMessage = "[$timestamp] [$Level] $Message" - - # Ensure log directory exists - if (-not (Test-Path $script:Config.LogPath)) { - New-Item -ItemType Directory -Path $script:Config.LogPath -Force | Out-Null - } - - $logFile = Join-Path $script:Config.LogPath "check-and-deploy.log" - Add-Content -Path $logFile -Value $logMessage - - # Also write to console if interactive - if ($Interactive) { - $color = switch ($Level) { - "SUCCESS" { "Green" } - "WARNING" { "Yellow" } - "ERROR" { "Red" } - default { "White" } - } - Write-Host $logMessage -ForegroundColor $color - } -} - -function Write-Step { - param([string]$Message) - Write-Host "`n[*] $Message" -ForegroundColor Cyan - Write-Log -Message $Message -Level "INFO" -} - -function Write-Success { - param([string]$Message) - Write-Host " [OK] $Message" -ForegroundColor Green - Write-Log -Message $Message -Level "SUCCESS" -} - -function Write-Error { - param([string]$Message) - Write-Host " [ERROR] $Message" -ForegroundColor Red - Write-Log -Message $Message -Level "ERROR" -} - -function Write-Warning { - param([string]$Message) - Write-Host " [WARN] $Message" -ForegroundColor Yellow - Write-Log -Message $Message -Level "WARNING" -} - -function Wait-ForKeyPress { - Write-Host "`nPress any key to continue..." -ForegroundColor Gray - $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") -} - -# ============================================================================= -# STATE MANAGEMENT -# ============================================================================= - -function Get-DeploymentState { - if (Test-Path $script:Config.StateFile) { - try { - return Get-Content -Path $script:Config.StateFile -Raw | ConvertFrom-Json - } catch { - Write-Warning "Failed to load state file, starting fresh" - return $null - } - } - return $null -} - -function Save-DeploymentState { - param( - [Parameter(Mandatory)] - [hashtable]$DeploymentInfo - ) - - try { - # Load existing state - $state = Get-DeploymentState - - $newEntry = @{ - packageName = $DeploymentInfo.PackageName - component = $DeploymentInfo.Component - timestamp = (Get-Date).ToUniversalTime().ToString("o") - status = $DeploymentInfo.Status - services = $DeploymentInfo.Services - } - - if ($state) { - # Add current deployment to history - if (-not $state.history) { - $state.history = @() - } - if ($state.lastDeployment) { - $state.history = @($state.lastDeployment) + $state.history - } - - # Keep only last 10 entries in history - if ($state.history.Count -gt 10) { - $state.history = $state.history | Select-Object -First 10 - } - - $state.lastDeployment = $newEntry - } else { - $state = @{ - lastDeployment = $newEntry - history = @() - } - } - - # Ensure directory exists - $stateDir = Split-Path $script:Config.StateFile -Parent - if (-not (Test-Path $stateDir)) { - New-Item -ItemType Directory -Path $stateDir -Force | Out-Null - } - - # Save state - $state | ConvertTo-Json -Depth 10 | Set-Content -Path $script:Config.StateFile - Write-Success "Deployment state saved" - } catch { - Write-Error "Failed to save deployment state: $_" - } -} - -# ============================================================================= -# PACKAGE DETECTION -# ============================================================================= - -function Get-LatestDeploymentPackage { - Write-Step "Scanning for deployment packages..." - - if (-not (Test-Path $script:Config.WatchPath)) { - Write-Warning "Watch path does not exist: $($script:Config.WatchPath)" - return $null - } - - # Find all deploy-* folders - $packages = Get-ChildItem -Path $script:Config.WatchPath -Directory | - Where-Object { $_.Name -match "^deploy-\d{8}-\d{6}$" } | - Sort-Object LastWriteTime -Descending - - if ($packages.Count -eq 0) { - Write-Warning "No deployment packages found" - return $null - } - - $latest = $packages | Select-Object -First 1 - Write-Success "Found $($packages.Count) package(s), latest: $($latest.Name)" - - return $latest -} - -function Test-IsNewPackage { - param([Parameter(Mandatory)]$Package) - - $state = Get-DeploymentState - - if (-not $state -or -not $state.lastDeployment) { - Write-Success "No previous deployment found - this is a new package" - return $true - } - - $lastDeployed = $state.lastDeployment.packageName - - if ($Package.Name -ne $lastDeployed) { - Write-Success "New package detected (last deployed: $lastDeployed)" - return $true - } - - Write-Log -Message "Package already deployed: $($Package.Name)" -Level "INFO" - return $false -} - -# ============================================================================= -# DEPLOYMENT EXECUTION -# ============================================================================= - -function Invoke-Deployment { - param([Parameter(Mandatory)]$Package) - - Write-Host "`n" + ("=" * 70) -ForegroundColor Cyan - Write-Host " STARTING DEPLOYMENT" -ForegroundColor Cyan - Write-Host ("=" * 70) -ForegroundColor Cyan - Write-Host "`nPackage: $($Package.Name)" -ForegroundColor Yellow - Write-Host "Path: $($Package.FullName)" -ForegroundColor Gray - - # Find ROA2WEB-Console.ps1 in package - $consoleScript = Join-Path $Package.FullName "scripts\ROA2WEB-Console.ps1" - - if (-not (Test-Path $consoleScript)) { - Write-Error "ROA2WEB-Console.ps1 not found in package: $consoleScript" - return $false - } - - try { - Write-Step "Executing deployment via ROA2WEB-Console.ps1..." - - # Execute deployment (deploy all components) - Push-Location (Split-Path $consoleScript -Parent) - - & $consoleScript -NonInteractive -Action DeployAll -PackagePath $Package.FullName - - # Capture exit code IMMEDIATELY (before any other command that might reset it) - $exitCode = $LASTEXITCODE - - # Run OCR dependency check with auto-install - Write-Log -Message "Checking and installing OCR dependencies..." -Level "INFO" - & $consoleScript -NonInteractive -Action InstallOCR 2>&1 | ForEach-Object { Write-Log -Message $_ -Level "INFO" } - - Pop-Location - - # Check if exit code indicates success (0 = success) - $deploySuccess = ($exitCode -eq 0) - - if ($deploySuccess) { - Write-Success "Deployment completed successfully (exit code: $exitCode)" - - # Save deployment state - Save-DeploymentState -DeploymentInfo @{ - PackageName = $Package.Name - Component = "All" - Status = "Success" - Services = @{ - backend = "Running (Ultrathin Monolith - All modules)" - } - } - - Write-Host "`n" + ("=" * 70) -ForegroundColor Green - Write-Host " DEPLOYMENT SUCCESSFUL" -ForegroundColor Green - Write-Host ("=" * 70) -ForegroundColor Green - - return $true - } else { - Write-Error "Deployment failed (exit code: $exitCode)" - - # Save failure state - Save-DeploymentState -DeploymentInfo @{ - PackageName = $Package.Name - Component = "All" - Status = "Failed" - Services = @{} - } - - Write-Host "`n" + ("=" * 70) -ForegroundColor Red - Write-Host " DEPLOYMENT FAILED" -ForegroundColor Red - Write-Host ("=" * 70) -ForegroundColor Red - - return $false - } - } catch { - Write-Error "Deployment exception: $_" - Write-Log -Message $_.ScriptStackTrace -Level "ERROR" - - # Save failure state - Save-DeploymentState -DeploymentInfo @{ - PackageName = $Package.Name - Component = "All" - Status = "Failed" - Services = @{} - } - - return $false - } -} - -# ============================================================================= -# INTERACTIVE MENU -# ============================================================================= - -function Show-MainMenu { - Clear-Host - Write-Host "`n" + ("=" * 70) -ForegroundColor Cyan - Write-Host " ROA2WEB - Auto-Deploy Monitor (Interactive)" -ForegroundColor Cyan - Write-Host ("=" * 70) -ForegroundColor Cyan - Write-Host "" - Write-Host " [1] Check for Updates (No Deploy)" -ForegroundColor White - Write-Host " (Scan for new packages without deploying)" -ForegroundColor Gray - Write-Host "" - Write-Host " [2] Check and Deploy Now" -ForegroundColor White - Write-Host " (Find latest package and deploy if new)" -ForegroundColor Gray - Write-Host "" - Write-Host " [3] View Deployment History" -ForegroundColor White - Write-Host " (Show previous deployments)" -ForegroundColor Gray - Write-Host "" - Write-Host " [4] View Current Configuration" -ForegroundColor White - Write-Host " (Display monitor settings)" -ForegroundColor Gray - Write-Host "" - Write-Host " [Q] Quit" -ForegroundColor Red - Write-Host "" - Write-Host ("=" * 70) -ForegroundColor Cyan - - do { - Write-Host "`nYour choice: " -ForegroundColor Yellow -NoNewline - $choice = Read-Host - - switch ($choice.ToUpper()) { - "1" { return "CheckOnly" } - "2" { return "CheckAndDeploy" } - "3" { return "History" } - "4" { return "ViewConfig" } - "Q" { return "Quit" } - default { - Write-Host "Invalid choice. Please select 1-4 or Q." -ForegroundColor Red - } - } - } while ($true) -} - -function Show-DeploymentHistory { - Write-Host "`n" + ("=" * 70) -ForegroundColor Cyan - Write-Host " Deployment History" -ForegroundColor Cyan - Write-Host ("=" * 70) -ForegroundColor Cyan - - $state = Get-DeploymentState - - if (-not $state) { - Write-Host "`nNo deployment history found" -ForegroundColor Yellow - return - } - - if ($state.lastDeployment) { - Write-Host "`nLast Deployment:" -ForegroundColor Yellow - Write-Host " Package: $($state.lastDeployment.packageName)" -ForegroundColor Gray - Write-Host " Component: $($state.lastDeployment.component)" -ForegroundColor Gray - Write-Host " Timestamp: $($state.lastDeployment.timestamp)" -ForegroundColor Gray - Write-Host " Status: $($state.lastDeployment.status)" -ForegroundColor $(if ($state.lastDeployment.status -eq "Success") { "Green" } else { "Red" }) - } - - if ($state.history -and $state.history.Count -gt 0) { - Write-Host "`nPrevious Deployments:" -ForegroundColor Yellow - $i = 1 - foreach ($entry in $state.history) { - Write-Host " [$i] $($entry.packageName) - $($entry.timestamp) - $($entry.status)" -ForegroundColor Gray - $i++ - } - } - - Write-Host ("=" * 70) -ForegroundColor Cyan -} - -function Show-Configuration { - Write-Host "`n" + ("=" * 70) -ForegroundColor Cyan - Write-Host " Current Configuration" -ForegroundColor Cyan - Write-Host ("=" * 70) -ForegroundColor Cyan - Write-Host "" - Write-Host " Watch Path: $($script:Config.WatchPath)" -ForegroundColor Gray - Write-Host " State File: $($script:Config.StateFile)" -ForegroundColor Gray - Write-Host " Log Path: $($script:Config.LogPath)" -ForegroundColor Gray - Write-Host " Console Script: $($script:Config.ConsoleScriptPath)" -ForegroundColor Gray - Write-Host "" - Write-Host ("=" * 70) -ForegroundColor Cyan -} - -# ============================================================================= -# MAIN CHECK & DEPLOY LOGIC -# ============================================================================= - -function Invoke-CheckAndDeploy { - param([switch]$CheckOnly) - - Write-Log -Message "=== Check and Deploy Started ===" -Level "INFO" - - # Get latest package - $latestPackage = Get-LatestDeploymentPackage - - if (-not $latestPackage) { - Write-Log -Message "No deployment packages found" -Level "INFO" - return $false - } - - # Check if it's a new package - $isNew = Test-IsNewPackage -Package $latestPackage - - if (-not $isNew) { - Write-Log -Message "No new packages to deploy" -Level "INFO" - return $false - } - - if ($CheckOnly) { - Write-Success "New package available: $($latestPackage.Name)" - Write-Host "`nRun without -CheckOnly to deploy" -ForegroundColor Yellow - return $false - } - - # Deploy the package - $deploySuccess = Invoke-Deployment -Package $latestPackage - - Write-Log -Message "=== Check and Deploy Completed (Success: $deploySuccess) ===" -Level "INFO" - - return $deploySuccess -} - -# ============================================================================= -# MAIN EXECUTION FLOW -# ============================================================================= - -function Main { - # Check if running as Administrator - $currentUser = [Security.Principal.WindowsIdentity]::GetCurrent() - $principal = New-Object Security.Principal.WindowsPrincipal($currentUser) - $isAdmin = $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) - - if (-not $isAdmin) { - Write-Host "`n[ERROR] This script requires Administrator privileges" -ForegroundColor Red - Write-Host "Please run PowerShell as Administrator and try again.`n" -ForegroundColor Yellow - exit 1 - } - - # Interactive mode - if ($Interactive) { - do { - $mainChoice = Show-MainMenu - - switch ($mainChoice) { - "CheckOnly" { - Invoke-CheckAndDeploy -CheckOnly - Wait-ForKeyPress - } - - "CheckAndDeploy" { - Invoke-CheckAndDeploy - Wait-ForKeyPress - } - - "History" { - Show-DeploymentHistory - Wait-ForKeyPress - } - - "ViewConfig" { - Show-Configuration - Wait-ForKeyPress - } - - "Quit" { - Write-Host "`nGoodbye!`n" -ForegroundColor Cyan - return - } - } - } while ($true) - } - # Non-interactive mode (for Scheduled Task) - else { - Invoke-CheckAndDeploy -CheckOnly:$CheckOnly | Out-Null - } -} - -# Run main -Main diff --git a/deploy-package-20260223-151231/scripts/Install-ROA2WEB.ps1 b/deploy-package-20260223-151231/scripts/Install-ROA2WEB.ps1 deleted file mode 100644 index 0af621d..0000000 --- a/deploy-package-20260223-151231/scripts/Install-ROA2WEB.ps1 +++ /dev/null @@ -1,656 +0,0 @@ -<# -.SYNOPSIS - ROA2WEB - Initial Installation Script for Windows Server + IIS - -.DESCRIPTION - This script performs complete installation of ROA2WEB on Windows Server: - - Checks prerequisites (Admin rights, IIS) - - Installs Python 3.11+ if needed - - Installs NSSM (service manager) - - Installs IIS URL Rewrite and ARR modules - - Creates directory structure - - Installs Python dependencies - - Creates Windows Service for backend - - Configures IIS website - - Starts all services - -.PARAMETER InstallPath - Installation path (default: C:\inetpub\wwwroot\roa2web) - -.PARAMETER PythonVersion - Python version to install (default: 3.11.9) - -.PARAMETER ServicePort - Backend service port (default: 8000) - -.PARAMETER SkipPython - Skip Python installation (use existing Python) - -.PARAMETER SkipIIS - Skip IIS configuration - -.EXAMPLE - .\Install-ROA2WEB.ps1 - Standard installation with defaults - -.EXAMPLE - .\Install-ROA2WEB.ps1 -InstallPath "D:\Apps\roa2web" -ServicePort 8001 - Custom installation path and port - -.NOTES - Author: ROA2WEB Team - Requires: PowerShell 5.1+, Administrator privileges -#> - -[CmdletBinding()] -param( - [string]$InstallPath = "C:\inetpub\wwwroot\roa2web", - [string]$PythonVersion = "3.11.9", - [int]$ServicePort = 8000, - [string]$IISSiteName = "Default Web Site", - [string]$IISAppName = "roa2web", - [switch]$CreateNewSite, - [switch]$SkipPython, - [switch]$SkipIIS -) - -# Strict error handling -$ErrorActionPreference = "Stop" -$ProgressPreference = "SilentlyContinue" - -# ============================================================================= -# CONFIGURATION -# ============================================================================= - -$script:Config = @{ - AppName = "ROA2WEB" - ServiceName = "ROA2WEB-Backend" - ServiceDisplayName = "ROA2WEB Unified Backend Service" - ServiceDescription = "Unified FastAPI backend for ROA2WEB ERP - includes Reports, Data Entry, and Telegram modules (Ultrathin Monolith)" - InstallPath = $InstallPath - BackendPath = Join-Path $InstallPath "backend" - FrontendPath = Join-Path $InstallPath "frontend" - LogsPath = Join-Path $InstallPath "logs" - TempPath = Join-Path $InstallPath "temp" - # IMPORTANT: venv is OUTSIDE InstallPath to survive deployments! - VenvPath = "C:\inetpub\wwwroot\roa2web-venv" - PythonVersion = $PythonVersion - ServicePort = $ServicePort - IISSiteName = $IISSiteName - IISAppName = $IISAppName - IISAppPoolName = "ROA2WEB-AppPool" - CreateNewSite = $CreateNewSite -} - -# ============================================================================= -# HELPER FUNCTIONS -# ============================================================================= - -function Write-Step { - param([string]$Message) - Write-Host "`n[*] $Message" -ForegroundColor Cyan -} - -function Write-Success { - param([string]$Message) - Write-Host " [OK] $Message" -ForegroundColor Green -} - -function Write-Error { - param([string]$Message) - Write-Host " [ERROR] $Message" -ForegroundColor Red -} - -function Write-Warning { - param([string]$Message) - Write-Host " [WARN] $Message" -ForegroundColor Yellow -} - -function Test-Administrator { - $identity = [Security.Principal.WindowsIdentity]::GetCurrent() - $principal = [Security.Principal.WindowsPrincipal]$identity - return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) -} - -function Test-CommandExists { - param([string]$Command) - try { - if (Get-Command $Command -ErrorAction Stop) { - return $true - } - } catch { - return $false - } -} - -function Install-Chocolatey { - Write-Step "Installing Chocolatey package manager..." - - if (Test-CommandExists "choco") { - Write-Success "Chocolatey already installed" - return - } - - try { - Set-ExecutionPolicy Bypass -Scope Process -Force - [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 - Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) - - # Refresh environment - $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") - - Write-Success "Chocolatey installed successfully" - } catch { - throw "Failed to install Chocolatey: $_" - } -} - -function Install-Python { - Write-Step "Checking Python installation..." - - if ($SkipPython) { - Write-Warning "Skipping Python installation (as requested)" - return - } - - # Check if Python is already installed - try { - $pythonCmd = Get-Command python -ErrorAction Stop - $pythonVersionOutput = & python --version 2>&1 - if ($pythonVersionOutput -match "Python (\d+\.\d+\.\d+)") { - $installedVersion = $matches[1] - Write-Success "Python $installedVersion already installed at $($pythonCmd.Source)" - return - } - } catch { - Write-Warning "Python not found, will install..." - } - - # Install Python via Chocolatey - Write-Step "Installing Python $PythonVersion..." - try { - choco install python --version=$PythonVersion -y --force - - # Refresh environment - $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path","User") - - Write-Success "Python $PythonVersion installed successfully" - } catch { - throw "Failed to install Python: $_" - } -} - -function Install-NSSM { - Write-Step "Installing NSSM (service manager)..." - - if (Test-Path "C:\nssm\nssm.exe") { - Write-Success "NSSM already installed" - return - } - - try { - choco install nssm -y - Write-Success "NSSM installed successfully" - } catch { - throw "Failed to install NSSM: $_" - } -} - -function Install-IISModules { - if ($SkipIIS) { - Write-Warning "Skipping IIS configuration (as requested)" - return - } - - Write-Step "Checking IIS installation..." - - # Detect OS type (Server vs Desktop) - $osInfo = Get-CimInstance -ClassName Win32_OperatingSystem - $isServer = $osInfo.ProductType -eq 3 # 1=Workstation, 2=Domain Controller, 3=Server - - # Check if IIS is installed (different cmdlets for Server vs Desktop) - $iisInstalled = $false - - if ($isServer) { - # Windows Server - use Get-WindowsFeature - $iisFeature = Get-WindowsFeature -Name Web-Server -ErrorAction SilentlyContinue - $iisInstalled = $iisFeature -and $iisFeature.InstallState -eq "Installed" - - if (-not $iisInstalled) { - Write-Error "IIS is not installed. Please install IIS first:" - Write-Host " Install-WindowsFeature -Name Web-Server -IncludeManagementTools" -ForegroundColor Yellow - throw "IIS not installed" - } - } else { - # Windows Desktop (10/11) - use Get-WindowsOptionalFeature - $iisFeature = Get-WindowsOptionalFeature -Online -FeatureName IIS-WebServer -ErrorAction SilentlyContinue - $iisInstalled = $iisFeature -and $iisFeature.State -eq "Enabled" - - if (-not $iisInstalled) { - Write-Error "IIS is not installed. Please install IIS first:" - Write-Host " Enable-WindowsOptionalFeature -Online -FeatureName IIS-WebServer -All" -ForegroundColor Yellow - Write-Host " Or use: Control Panel -> Programs -> Turn Windows features on/off -> Internet Information Services" -ForegroundColor Yellow - throw "IIS not installed" - } - } - - Write-Success "IIS is installed ($($osInfo.Caption))" - - # Install URL Rewrite Module - Write-Step "Installing IIS URL Rewrite Module..." - $urlRewriteInstalled = Get-WebConfiguration -Filter "/system.webServer/rewrite" -PSPath "IIS:\" -ErrorAction SilentlyContinue - - if (-not $urlRewriteInstalled) { - Write-Warning "URL Rewrite not found, installing..." - try { - $urlRewriteUrl = "https://download.microsoft.com/download/1/2/8/128E2E22-C1B9-44A4-BE2A-5859ED1D4592/rewrite_amd64_en-US.msi" - $urlRewritePath = "$env:TEMP\rewrite_amd64.msi" - - Invoke-WebRequest -Uri $urlRewriteUrl -OutFile $urlRewritePath - Start-Process msiexec.exe -ArgumentList "/i", $urlRewritePath, "/quiet", "/norestart" -Wait - Remove-Item $urlRewritePath -Force - - Write-Success "URL Rewrite Module installed" - } catch { - Write-Error "Failed to install URL Rewrite: $_" - Write-Warning "You can download it manually from: https://www.iis.net/downloads/microsoft/url-rewrite" - } - } else { - Write-Success "URL Rewrite Module already installed" - } - - # Install Application Request Routing (ARR) - Write-Step "Checking Application Request Routing (ARR)..." - try { - choco install iis-arr -y - Write-Success "ARR installed successfully" - } catch { - Write-Warning "Could not install ARR via Chocolatey. Download manually from: https://www.iis.net/downloads/microsoft/application-request-routing" - } -} - -function New-DirectoryStructure { - Write-Step "Creating directory structure..." - - $directories = @( - $Config.InstallPath, - $Config.BackendPath, - $Config.FrontendPath, - $Config.LogsPath, - $Config.TempPath, - (Join-Path $Config.BackendPath "logs"), - (Join-Path $Config.BackendPath "temp") - ) - - foreach ($dir in $directories) { - if (-not (Test-Path $dir)) { - New-Item -ItemType Directory -Path $dir -Force | Out-Null - Write-Success "Created: $dir" - } else { - Write-Success "Already exists: $dir" - } - } - - # Set permissions (IIS user needs read access) - try { - $acl = Get-Acl $Config.InstallPath - $accessRule = New-Object System.Security.AccessControl.FileSystemAccessRule("IIS_IUSRS", "ReadAndExecute", "ContainerInherit,ObjectInherit", "None", "Allow") - $acl.SetAccessRule($accessRule) - Set-Acl -Path $Config.InstallPath -AclObject $acl - Write-Success "Permissions set for IIS_IUSRS" - } catch { - Write-Warning "Could not set permissions: $_" - } -} - -function Install-PythonDependencies { - Write-Step "Setting up Python virtual environment..." - - $requirementsPath = Join-Path $Config.BackendPath "requirements.txt" - $venvPath = $Config.VenvPath - $venvPython = Join-Path $venvPath "Scripts\python.exe" - $venvPip = Join-Path $venvPath "Scripts\pip.exe" - - # Create venv if it doesn't exist - if (-not (Test-Path $venvPython)) { - Write-Step "Creating virtual environment at $venvPath..." - try { - & python -m venv $venvPath - Write-Success "Virtual environment created" - } catch { - throw "Failed to create virtual environment: $_" - } - } else { - Write-Success "Virtual environment already exists" - } - - # Upgrade pip in venv - Write-Step "Upgrading pip in virtual environment..." - try { - & $venvPython -m pip install --upgrade pip - Write-Success "Pip upgraded" - } catch { - Write-Warning "Could not upgrade pip: $_" - } - - # Install dependencies - if (-not (Test-Path $requirementsPath)) { - Write-Warning "requirements.txt not found at $requirementsPath" - Write-Warning "Please copy backend files first, then run this script again" - return - } - - Write-Step "Installing Python dependencies in virtual environment..." - try { - & $venvPip install -r $requirementsPath - Write-Success "Python dependencies installed successfully in venv" - } catch { - throw "Failed to install Python dependencies: $_" - } -} - -function New-WindowsService { - Write-Step "Creating Windows Service for backend..." - - # Check if service already exists using nssm (more reliable than Get-Service) - # Temporarily disable error action to check service status - $oldErrorAction = $ErrorActionPreference - $ErrorActionPreference = "SilentlyContinue" - - $nssmOutput = & nssm status $Config.ServiceName 2>&1 - $serviceExists = $LASTEXITCODE -eq 0 - - $ErrorActionPreference = $oldErrorAction - - if ($serviceExists) { - Write-Warning "Service already exists, stopping and removing..." - - # Check service status - $status = & nssm status $Config.ServiceName 2>&1 - - # Only try to stop if service is running - if ($status -match "SERVICE_RUNNING") { - Write-Step "Stopping running service..." - & nssm stop $Config.ServiceName 2>&1 | Out-Null - Start-Sleep -Seconds 2 - } else { - Write-Step "Service is not running (status: $status)" - } - - # Force remove service - & nssm remove $Config.ServiceName confirm 2>&1 | Out-Null - Start-Sleep -Seconds 2 - Write-Success "Existing service removed" - } - - # Verify venv exists (wrapper script needs it) - $venvPython = Join-Path $Config.VenvPath "Scripts\python.exe" - - if (-not (Test-Path $venvPython)) { - throw "Virtual environment Python not found at $venvPython. Run Install-PythonDependencies first." - } - - # NSSM service creation using wrapper script - # The wrapper script (start-backend-service.ps1) handles: - # 1. Starting SSH tunnels before backend - # 2. Waiting for tunnel ports to be accessible - # 3. Starting uvicorn - try { - $wrapperScript = Join-Path $PSScriptRoot "start-backend-service.ps1" - - # Install service using PowerShell wrapper - # NOTE: Using wrapper to ensure SSH tunnels start before uvicorn - & nssm install $Config.ServiceName "powershell.exe" "-ExecutionPolicy" "Bypass" "-File" "`"$wrapperScript`"" - - # Set service configuration - & nssm set $Config.ServiceName DisplayName $Config.ServiceDisplayName - & nssm set $Config.ServiceName Description $Config.ServiceDescription - & nssm set $Config.ServiceName Start SERVICE_AUTO_START - & nssm set $Config.ServiceName AppDirectory $Config.BackendPath - - # Set environment variables (PYTHONPATH for shared modules) - # Point to the installation root AND backend/ so both shared/ and app/ modules can be imported - $pythonPathRoot = $Config.InstallPath - $pythonPathBackend = $Config.BackendPath - & nssm set $Config.ServiceName AppEnvironmentExtra "PYTHONPATH=$pythonPathRoot;$pythonPathBackend" - - # Set logging - $stdoutLog = Join-Path $Config.LogsPath "backend-stdout.log" - $stderrLog = Join-Path $Config.LogsPath "backend-stderr.log" - & nssm set $Config.ServiceName AppStdout $stdoutLog - & nssm set $Config.ServiceName AppStderr $stderrLog - & nssm set $Config.ServiceName AppStdoutCreationDisposition 4 - & nssm set $Config.ServiceName AppStderrCreationDisposition 4 - - # Set restart policy - & nssm set $Config.ServiceName AppExit Default Restart - & nssm set $Config.ServiceName AppRestartDelay 5000 - - Write-Success "Windows Service created successfully (using wrapper script)" - Write-Success " Wrapper: $wrapperScript" - } catch { - throw "Failed to create Windows Service: $_" - } -} - -function Initialize-IISWebsite { - if ($SkipIIS) { - Write-Warning "Skipping IIS website configuration (as requested)" - return - } - - Write-Step "Configuring IIS application..." - - Import-Module WebAdministration -ErrorAction Stop - - # Remove existing app pool if present - if (Test-Path "IIS:\AppPools\$($Config.IISAppPoolName)") { - Write-Warning "Removing existing app pool..." - Remove-WebAppPool -Name $Config.IISAppPoolName -ErrorAction SilentlyContinue - } - - # Create Application Pool - Write-Step "Creating IIS Application Pool..." - New-WebAppPool -Name $Config.IISAppPoolName -Force | Out-Null - Set-ItemProperty -Path "IIS:\AppPools\$($Config.IISAppPoolName)" -Name "managedRuntimeVersion" -Value "" - Write-Success "Application Pool created: $($Config.IISAppPoolName)" - - if ($CreateNewSite) { - # Create new website (old behavior) - Write-Step "Creating new IIS Website..." - - # Stop default website if running - try { - Stop-Website -Name "Default Web Site" -ErrorAction SilentlyContinue - Write-Success "Stopped Default Web Site" - } catch { - Write-Warning "Could not stop Default Web Site: $_" - } - - # Remove existing site if present - if (Get-Website -Name $Config.IISSiteName -ErrorAction SilentlyContinue) { - Write-Warning "Removing existing website..." - Remove-Website -Name $Config.IISSiteName -ErrorAction SilentlyContinue - } - - New-Website -Name $Config.IISSiteName ` - -PhysicalPath $Config.FrontendPath ` - -ApplicationPool $Config.IISAppPoolName ` - -Port 80 ` - -Force | Out-Null - - Write-Success "Website created: $($Config.IISSiteName)" - - # Start website - Start-Website -Name $Config.IISSiteName - Write-Success "Website started: $($Config.IISSiteName)" - } else { - # Create application under existing site (default behavior) - Write-Step "Creating IIS Application under '$($Config.IISSiteName)'..." - - # Verify parent site exists - $parentSite = Get-Website -Name $Config.IISSiteName -ErrorAction SilentlyContinue - if (-not $parentSite) { - throw "Parent website '$($Config.IISSiteName)' does not exist. Use -CreateNewSite to create a new site." - } - - # Remove existing application if present - $existingApp = Get-WebApplication -Name $Config.IISAppName -Site $Config.IISSiteName -ErrorAction SilentlyContinue - if ($existingApp) { - Write-Warning "Removing existing application..." - Remove-WebApplication -Name $Config.IISAppName -Site $Config.IISSiteName -ErrorAction SilentlyContinue - } - - # Create application - New-WebApplication -Name $Config.IISAppName ` - -Site $Config.IISSiteName ` - -PhysicalPath $Config.FrontendPath ` - -ApplicationPool $Config.IISAppPoolName ` - -Force | Out-Null - - Write-Success "Application created: /$($Config.IISAppName) under $($Config.IISSiteName)" - } - - # Copy web.config to frontend path - $webConfigSource = Join-Path $PSScriptRoot "..\config\web.config" - $webConfigDest = Join-Path $Config.FrontendPath "web.config" - - if (Test-Path $webConfigSource) { - Copy-Item -Path $webConfigSource -Destination $webConfigDest -Force - Write-Success "web.config copied to frontend path" - } else { - Write-Warning "web.config not found at $webConfigSource" - } -} - -function Start-Services { - Write-Step "Starting services..." - - # Start backend service - try { - Start-Service -Name $Config.ServiceName - Start-Sleep -Seconds 3 - - $service = Get-Service -Name $Config.ServiceName - if ($service.Status -eq "Running") { - Write-Success "Backend service started successfully" - } else { - Write-Error "Backend service failed to start (Status: $($service.Status))" - } - } catch { - Write-Error "Failed to start backend service: $_" - } - - # Test backend health - Write-Step "Testing backend health..." - Start-Sleep -Seconds 5 - - try { - $response = Invoke-WebRequest -Uri "http://localhost:$($Config.ServicePort)/health" -UseBasicParsing -TimeoutSec 10 - if ($response.StatusCode -eq 200) { - Write-Success "Backend health check passed" - } - } catch { - Write-Warning "Backend health check failed (may need time to start): $_" - } -} - -function Show-Summary { - Write-Host "`n" + ("=" * 80) -ForegroundColor Cyan - Write-Host " ROA2WEB INSTALLATION COMPLETED" -ForegroundColor Green - Write-Host ("=" * 80) -ForegroundColor Cyan - - Write-Host "`nInstallation Details:" -ForegroundColor Yellow - Write-Host " Install Path: $($Config.InstallPath)" - Write-Host " Backend Path: $($Config.BackendPath)" - Write-Host " Virtual Env: $($Config.VenvPath)" - Write-Host " Frontend Path: $($Config.FrontendPath)" - Write-Host " Service Name: $($Config.ServiceName)" - Write-Host " Service Port: $($Config.ServicePort)" - Write-Host " IIS Site: $($Config.IISSiteName)" - - Write-Host "`nAccess Points:" -ForegroundColor Yellow - if ($Config.CreateNewSite) { - Write-Host " Web Application: http://localhost" - } else { - Write-Host " Web Application: http://localhost/$($Config.IISAppName)" - } - Write-Host " API Backend: http://localhost:$($Config.ServicePort)" - Write-Host " API Docs: http://localhost:$($Config.ServicePort)/docs" - Write-Host " Health Check: http://localhost:$($Config.ServicePort)/health" - - Write-Host "`nNext Steps:" -ForegroundColor Yellow - Write-Host " 1. Copy backend files to: $($Config.BackendPath)" - Write-Host " 2. Copy frontend files to: $($Config.FrontendPath)" - Write-Host " 3. Configure .env file at: $($Config.BackendPath)\.env" - Write-Host "" - Write-Host " IMPORTANT - Module Control Flags in .env:" -ForegroundColor Cyan - Write-Host " MODULE_REPORTS_ENABLED=true # Enable/disable Reports module" - Write-Host " MODULE_DATA_ENTRY_ENABLED=true # Enable/disable Data Entry module" - Write-Host " MODULE_TELEGRAM_ENABLED=true # Enable/disable Telegram bot module" - Write-Host "" - Write-Host " 4. Start service: Start-Service $($Config.ServiceName)" - - Write-Host "`nManagement Commands:" -ForegroundColor Yellow - Write-Host " Start Service: Start-Service $($Config.ServiceName)" - Write-Host " Stop Service: Stop-Service $($Config.ServiceName)" - Write-Host " Restart Service: Restart-Service $($Config.ServiceName)" - Write-Host " View Logs: Get-Content $($Config.LogsPath)\backend-stdout.log -Tail 50" - Write-Host " Check Status: Get-Service $($Config.ServiceName)" - - Write-Host "`nArchitecture:" -ForegroundColor Yellow - Write-Host " ULTRATHIN MONOLITH - Single Windows service with multiple modules" - Write-Host " All modules share Oracle pool, auth, and cache" - Write-Host " Telegram bot runs as background task (not separate service)" - - Write-Host "`n" + ("=" * 80) -ForegroundColor Cyan -} - -# ============================================================================= -# MAIN INSTALLATION FLOW -# ============================================================================= - -function Main { - Write-Host @" - - ==================================================================== - ROA2WEB - Windows Server Installation Script - Modern ERP Reports Application with FastAPI + Vue.js + IIS - ==================================================================== - -"@ -ForegroundColor Cyan - - # Check prerequisites - Write-Step "Checking prerequisites..." - - if (-not (Test-Administrator)) { - Write-Error "This script must be run as Administrator" - Write-Host " Right-click PowerShell and select 'Run as Administrator'" -ForegroundColor Yellow - exit 1 - } - Write-Success "Running as Administrator" - - try { - # Installation steps - Install-Chocolatey - Install-Python - Install-NSSM - Install-IISModules - New-DirectoryStructure - Install-PythonDependencies - New-WindowsService - Initialize-IISWebsite - Start-Services - Show-Summary - - Write-Host "`nInstallation completed successfully!" -ForegroundColor Green - - } catch { - Write-Host "`n[FATAL ERROR] Installation failed: $_" -ForegroundColor Red - Write-Host $_.ScriptStackTrace -ForegroundColor Red - exit 1 - } -} - -# Run main installation -Main diff --git a/deploy-package-20260223-151231/scripts/ROA2WEB-Console.ps1 b/deploy-package-20260223-151231/scripts/ROA2WEB-Console.ps1 deleted file mode 100644 index d14c39a..0000000 --- a/deploy-package-20260223-151231/scripts/ROA2WEB-Console.ps1 +++ /dev/null @@ -1,1491 +0,0 @@ -<# -.SYNOPSIS - ROA2WEB Unified Console - Ultrathin Monolith Management - -.DESCRIPTION - Unified deployment and management console for ROA2WEB Ultrathin Monolith. - Single Windows service with multiple modules (Reports, Data Entry, Telegram). - - Features: - - Deploy backend/frontend updates - - Manage unified service (start/stop/restart) - - View logs and service status - - Backup before deployment - - Module control via .env flags - -.PARAMETER NonInteractive - Run in non-interactive mode with specific action - -.PARAMETER Action - Action to perform: - - DeployBackend: Deploy backend files only - - DeployFrontend: Deploy frontend files only - - DeployAll: Deploy both backend and frontend - - StartService: Start ROA2WEB-Backend service - - StopService: Stop ROA2WEB-Backend service - - RestartService: Restart ROA2WEB-Backend service - - Status: Show service status and health - - ViewLogs: Display recent log entries - -.PARAMETER PackagePath - Path to deployment package (for Deploy actions) - -.EXAMPLE - .\ROA2WEB-Console.ps1 - Launch interactive menu - -.EXAMPLE - .\ROA2WEB-Console.ps1 -NonInteractive -Action DeployAll -PackagePath "C:\Temp\deploy-20250129-120000" - Deploy full package non-interactively - -.EXAMPLE - .\ROA2WEB-Console.ps1 -NonInteractive -Action RestartService - Restart the unified backend service - -.NOTES - Author: ROA2WEB Team - Version: 2.0 (Ultrathin Monolith) - Requires: Administrator privileges, PowerShell 5.1+ -#> - -[CmdletBinding()] -param( - [switch]$NonInteractive, - - [ValidateSet("DeployBackend", "DeployFrontend", "DeployAll", - "StartService", "StopService", "RestartService", - "Status", "ViewLogs", "CheckOCR", "InstallOCR")] - [string]$Action = "", - - [string]$PackagePath = "" -) - -$ErrorActionPreference = "Stop" - -# Require Administrator -if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { - Write-Host "[ERROR] This script requires Administrator privileges" -ForegroundColor Red - Write-Host "Please run PowerShell as Administrator and try again." -ForegroundColor Yellow - exit 1 -} - -# ============================================================================= -# CONFIGURATION -# ============================================================================= - -$script:Config = @{ - # Service Configuration - ServiceName = "ROA2WEB-Backend" - ServiceDisplayName = "ROA2WEB Unified Backend Service" - ServicePort = 8000 - HealthUrl = "http://localhost:8000/health" - HealthTimeout = 10 - - # Installation Paths - InstallRoot = "C:\inetpub\wwwroot\roa2web" - BackendPath = "C:\inetpub\wwwroot\roa2web\backend" - # IMPORTANT: venv is OUTSIDE roa2web to survive deployments! - VenvPath = "C:\inetpub\wwwroot\roa2web-venv" - FrontendPath = "C:\inetpub\wwwroot\roa2web\frontend" - SharedPath = "C:\inetpub\wwwroot\roa2web\shared" - ConfigPath = "C:\inetpub\wwwroot\roa2web\config" - DataPath = "C:\inetpub\wwwroot\roa2web\data" - - # Logs - LogsPath = "C:\inetpub\wwwroot\roa2web\logs" - BackendStdoutLog = "C:\inetpub\wwwroot\roa2web\logs\backend-stdout.log" - BackendStderrLog = "C:\inetpub\wwwroot\roa2web\logs\backend-stderr.log" - - # Backups - BackupPath = "C:\inetpub\wwwroot\roa2web\backups" - MaxBackups = 5 - - # IIS Configuration - IISSiteName = "Default Web Site" - IISAppName = "roa2web" -} - -# ============================================================================= -# HELPER FUNCTIONS -# ============================================================================= - -function Write-Step { - param([string]$Message) - Write-Host "`n[*] $Message" -ForegroundColor Cyan -} - -function Write-Success { - param([string]$Message) - Write-Host " [OK] $Message" -ForegroundColor Green -} - -function Write-Error { - param([string]$Message) - Write-Host " [ERROR] $Message" -ForegroundColor Red -} - -function Write-Warning { - param([string]$Message) - Write-Host " [WARN] $Message" -ForegroundColor Yellow -} - -function Write-Info { - param([string]$Message) - Write-Host " [*] $Message" -ForegroundColor Gray -} - -function Get-PythonPaths { - <# - .SYNOPSIS - Returns Python and pip paths, preferring venv if available - #> - $venvPython = Join-Path $Config.VenvPath "Scripts\python.exe" - $venvPip = Join-Path $Config.VenvPath "Scripts\pip.exe" - - if (Test-Path $venvPython) { - return @{ - Python = $venvPython - Pip = $venvPip - IsVenv = $true - } - } else { - # Fallback to global Python - $globalPython = (Get-Command python -ErrorAction SilentlyContinue).Source - $globalPip = (Get-Command pip -ErrorAction SilentlyContinue).Source - return @{ - Python = $globalPython - Pip = $globalPip - IsVenv = $false - } - } -} - -function Initialize-Venv { - <# - .SYNOPSIS - Creates virtual environment at external location if it doesn't exist. - External location (C:\inetpub\wwwroot\roa2web-venv) survives deployments. - #> - $venvPath = $Config.VenvPath - $venvPython = Join-Path $venvPath "Scripts\python.exe" - $venvPip = Join-Path $venvPath "Scripts\pip.exe" - - # If venv exists and is valid (pip works), we're good - if (Test-Path $venvPython) { - # Verify pip is functional (not broken by move) - try { - $pipTest = & $venvPip --version 2>&1 - if ($LASTEXITCODE -eq 0) { - Write-Success "Virtual environment already exists at $venvPath" - return $true - } else { - Write-Warning "Venv exists but pip is broken, recreating..." - Remove-Item -Path $venvPath -Recurse -Force -ErrorAction SilentlyContinue - } - } catch { - Write-Warning "Venv exists but pip test failed, recreating..." - Remove-Item -Path $venvPath -Recurse -Force -ErrorAction SilentlyContinue - } - } - - Write-Step "Creating virtual environment at external location..." - Write-Info "Path: $venvPath (survives deployments)" - try { - $globalPython = (Get-Command python -ErrorAction Stop).Source - & $globalPython -m venv $venvPath - if (Test-Path $venvPython) { - Write-Success "Virtual environment created" - - # Upgrade pip - Write-Step "Upgrading pip in venv..." - & $venvPython -m pip install --upgrade pip 2>&1 | Out-Null - Write-Success "Pip upgraded" - - return $true - } else { - Write-Error "Failed to create virtual environment" - return $false - } - } catch { - Write-Error "Failed to create venv: $_" - return $false - } -} - -function Update-ServiceToUseVenv { - <# - .SYNOPSIS - Updates NSSM service to use wrapper script for SSH tunnel auto-start - - .DESCRIPTION - Configures the service to use start-backend-service.ps1 wrapper which: - 1. Starts SSH tunnels before backend - 2. Waits for tunnel ports to be accessible - 3. Starts uvicorn with correct settings - - This ensures SSH tunnels are always running when the backend starts. - #> - $venvPython = Join-Path $Config.VenvPath "Scripts\python.exe" - - if (-not (Test-Path $venvPython)) { - Write-Warning "Venv Python not found: $venvPython" - return $false - } - - # Check if nssm is available - $nssmPath = Get-Command nssm -ErrorAction SilentlyContinue - if (-not $nssmPath) { - Write-Warning "NSSM not found in PATH" - return $false - } - - # Find wrapper script - $wrapperScript = Join-Path $Config.InstallRoot "scripts\start-backend-service.ps1" - if (-not (Test-Path $wrapperScript)) { - # Fallback: try deployment location - $wrapperScript = Join-Path $PSScriptRoot "start-backend-service.ps1" - } - - $useWrapper = Test-Path $wrapperScript - - try { - # Get current application - $currentApp = & nssm get $Config.ServiceName Application 2>&1 - - if ($useWrapper) { - # Check if already using wrapper - if ($currentApp -like "*powershell*") { - $currentArgs = & nssm get $Config.ServiceName AppParameters 2>&1 - if ($currentArgs -like "*start-backend-service.ps1*") { - Write-Success "Service already configured to use wrapper script" - return $true - } - } - - Write-Step "Updating service to use wrapper script (SSH tunnel auto-start)..." - - # Stop service first - Stop-ROAService | Out-Null - - # Update service to use PowerShell wrapper - & nssm set $Config.ServiceName Application "powershell.exe" - & nssm set $Config.ServiceName AppParameters "-ExecutionPolicy Bypass -File `"$wrapperScript`"" - - Write-Success "Service updated to use wrapper: $wrapperScript" - Write-Info "SSH tunnels will auto-start when service starts" - } else { - # Fallback: use venv Python directly (old behavior) - if ($currentApp -eq $venvPython) { - Write-Success "Service already configured to use venv Python" - return $true - } - - Write-Step "Updating service to use venv Python (no wrapper available)..." - - # Stop service first - Stop-ROAService | Out-Null - - # Update service application - & nssm set $Config.ServiceName Application $venvPython - & nssm set $Config.ServiceName AppParameters "-m uvicorn main:app --host 127.0.0.1 --port $($Config.ServicePort) --workers 1" - - Write-Success "Service updated to use: $venvPython" - Write-Warning "Wrapper script not found - SSH tunnels must be started manually" - } - - return $true - } catch { - Write-Error "Failed to update service: $_" - return $false - } -} - -function Wait-ForKeyPress { - Write-Host "`nPress any key to continue..." -ForegroundColor Gray - $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") -} - -# ============================================================================= -# SERVICE MANAGEMENT -# ============================================================================= - -function Get-ServiceSafe { - param([string]$ServiceName) - try { - return Get-Service -Name $ServiceName -ErrorAction SilentlyContinue - } catch { - return $null - } -} - -function Test-ServiceInstalled { - $service = Get-ServiceSafe -ServiceName $Config.ServiceName - return ($null -ne $service) -} - -function Start-ROAService { - Write-Step "Starting $($Config.ServiceDisplayName)..." - - $service = Get-ServiceSafe -ServiceName $Config.ServiceName - - if (-not $service) { - Write-Error "Service not found: $($Config.ServiceName)" - Write-Info "Run Install-ROA2WEB.ps1 first to install the service" - return $false - } - - if ($service.Status -eq 'Running') { - Write-Success "Service is already running" - return $true - } - - try { - Start-Service -Name $Config.ServiceName - Start-Sleep -Seconds 3 - - # Wait for service to start (max 30 seconds) - $maxWait = 30 - $waited = 0 - while ($waited -lt $maxWait) { - $service = Get-Service -Name $Config.ServiceName - if ($service.Status -eq 'Running') { - Write-Success "Service started successfully" - - # Wait a bit more for backend to initialize - Write-Info "Waiting for backend initialization..." - Start-Sleep -Seconds 5 - - # Test health endpoint - Test-ServiceHealth | Out-Null - return $true - } - Start-Sleep -Seconds 2 - $waited += 2 - } - - Write-Warning "Service started but status unclear" - return $false - } catch { - Write-Error "Failed to start service: $_" - return $false - } -} - -function Stop-ROAService { - Write-Step "Stopping $($Config.ServiceDisplayName)..." - - $service = Get-ServiceSafe -ServiceName $Config.ServiceName - - if (-not $service) { - Write-Warning "Service not found: $($Config.ServiceName)" - return $true - } - - if ($service.Status -eq 'Stopped') { - Write-Success "Service is already stopped" - return $true - } - - try { - Stop-Service -Name $Config.ServiceName -Force - - # Wait for service to stop (max 30 seconds) - $maxWait = 30 - $waited = 0 - while ($waited -lt $maxWait) { - $service = Get-Service -Name $Config.ServiceName - if ($service.Status -eq 'Stopped') { - Write-Success "Service stopped successfully" - return $true - } - Start-Sleep -Seconds 2 - $waited += 2 - } - - Write-Warning "Service stop timeout - may still be running" - return $false - } catch { - Write-Error "Failed to stop service: $_" - return $false - } -} - -function Restart-ROAService { - Write-Step "Restarting $($Config.ServiceDisplayName)..." - - if (Stop-ROAService) { - Start-Sleep -Seconds 2 - return Start-ROAService - } - return $false -} - -function Test-ServiceHealth { - Write-Step "Checking service health..." - - $service = Get-ServiceSafe -ServiceName $Config.ServiceName - - if (-not $service) { - Write-Warning "Service not installed" - return $false - } - - Write-Info "Service Status: $($service.Status)" - - if ($service.Status -ne 'Running') { - Write-Warning "Service is not running" - return $false - } - - # Test health endpoint - try { - Write-Info "Testing health endpoint: $($Config.HealthUrl)" - $response = Invoke-WebRequest -Uri $Config.HealthUrl -TimeoutSec $Config.HealthTimeout -UseBasicParsing - - if ($response.StatusCode -eq 200) { - Write-Success "Health check PASSED (HTTP 200)" - - # Parse response for module status - try { - $health = $response.Content | ConvertFrom-Json - Write-Info "Modules Status:" - if ($health.modules) { - foreach ($module in $health.modules.PSObject.Properties) { - $status = if ($module.Value) { "[ON] Enabled" } else { "[OFF] Disabled" } - Write-Info " - $($module.Name): $status" - } - } - } catch { - # If can't parse JSON, just show raw response - Write-Info "Response: $($response.Content)" - } - - return $true - } else { - Write-Warning "Health check returned HTTP $($response.StatusCode)" - return $false - } - } catch { - Write-Warning "Health check FAILED: $_" - Write-Info "This may indicate the backend is still initializing or there's a configuration issue" - return $false - } -} - -# ============================================================================= -# OCR DEPENDENCY CHECK -# ============================================================================= - -function Test-OCRDependencies { - param( - [switch]$AutoInstall, - [switch]$Silent - ) - - if (-not $Silent) { - Write-Host "`n" + ("=" * 70) -ForegroundColor Cyan - Write-Host " OCR Dependencies Check$(if ($AutoInstall) { ' (Auto-Install Enabled)' })" -ForegroundColor Cyan - Write-Host ("=" * 70) -ForegroundColor Cyan - } - - $allOk = $true - - # Get Python paths (prefer venv) - $pyPaths = Get-PythonPaths - - # Check Python/venv - if (-not $Silent) { Write-Step "Checking Python installation..." } - - if ($pyPaths.IsVenv) { - if (-not $Silent) { - $venvPythonVersion = & $pyPaths.Python --version 2>&1 - Write-Success "Virtual environment: $($Config.VenvPath)" - Write-Success "Python (venv): $venvPythonVersion" - } - # Ensure service uses venv Python - if ($AutoInstall) { - # Install requirements.txt if exists - $requirementsFile = Join-Path $Config.BackendPath "requirements.txt" - if (Test-Path $requirementsFile) { - if (-not $Silent) { Write-Step "Installing base requirements in venv..." } - try { - & $pyPaths.Pip install -r $requirementsFile 2>&1 | Out-Null - if (-not $Silent) { Write-Success "Base requirements installed" } - } catch { - if (-not $Silent) { Write-Warning "Failed to install requirements: $_" } - } - } - - if (-not $Silent) { Write-Step "Ensuring service uses venv Python..." } - $serviceUpdated = Update-ServiceToUseVenv - if ($serviceUpdated -and -not $Silent) { - Write-Success "Service configured to use venv" - } - } - } else { - # No venv - create one if AutoInstall - if ($AutoInstall) { - if (-not $Silent) { Write-Warning "Virtual environment not found - creating..." } - $venvCreated = Initialize-Venv - if ($venvCreated) { - # Refresh paths - $pyPaths = Get-PythonPaths - - # Update service to use venv Python - if (-not $Silent) { Write-Step "Updating service to use virtual environment..." } - Update-ServiceToUseVenv | Out-Null - } else { - if (-not $Silent) { Write-Error "Could not create virtual environment" } - return $false - } - } else { - # Check global Python - if ($pyPaths.Python) { - $pythonVersion = cmd /c "python --version 2>&1" - if (-not $Silent) { - Write-Warning "Using global Python (venv recommended)" - Write-Success "Python: $pythonVersion" - } - } else { - if (-not $Silent) { Write-Error "Python not found" } - return $false - } - } - } - - # Determine pip executable to use - $pipExe = if ($pyPaths.Pip -and (Test-Path $pyPaths.Pip)) { "`"$($pyPaths.Pip)`"" } else { "pip" } - if (-not $Silent -and $pyPaths.IsVenv) { Write-Info "Using pip from venv: $pipExe" } - - # Check and optionally install Python packages - if (-not $Silent) { Write-Step "Checking Python OCR packages..." } - - $packages = @( - @{ Name = "torch"; Package = "torch"; Required = $true; Description = "PyTorch (for docTR)" }, - @{ Name = "torchvision"; Package = "torchvision"; Required = $true; Description = "TorchVision (for docTR)" }, - @{ Name = "python-doctr"; Package = "python-doctr"; Required = $true; Description = "docTR OCR engine" }, - @{ Name = "pytesseract"; Package = "pytesseract"; Required = $true; Description = "Tesseract Python wrapper" }, - @{ Name = "paddleocr"; Package = "paddleocr"; Required = $true; Description = "PaddleOCR engine" } - ) - - foreach ($pkg in $packages) { - # Use venv pip to check packages - $pipOutput = cmd /c "$pipExe show $($pkg.Package) 2>&1" - $isInstalled = $pipOutput -match "Version:" - - if ($isInstalled) { - $versionLine = $pipOutput | Where-Object { $_ -match "^Version:" } - $version = if ($versionLine) { ($versionLine -split ":")[1].Trim() } else { "unknown" } - if (-not $Silent) { Write-Success "$($pkg.Package): $version" } - } else { - if ($pkg.Required) { - if ($AutoInstall) { - if (-not $Silent) { Write-Warning "$($pkg.Package): NOT INSTALLED - Installing..." } - try { - # Use venv pip to install - $installCmd = "$pipExe install `"$($pkg.Name)`"" - if (-not $Silent) { Write-Info " Running: $installCmd" } - $installResult = Invoke-Expression "cmd /c $installCmd 2>&1" - # Verify installation - $verifyOutput = cmd /c "$pipExe show $($pkg.Package) 2>&1" - if ($verifyOutput -match "Version:") { - if (-not $Silent) { Write-Success "$($pkg.Package): Installed successfully" } - } else { - if (-not $Silent) { - Write-Error "$($pkg.Package): Installation FAILED" - # Show last few lines of pip output for debugging - $errorLines = ($installResult | Select-Object -Last 5) -join "`n" - if ($errorLines) { - Write-Host " Pip output:" -ForegroundColor Gray - Write-Host " $errorLines" -ForegroundColor Gray - } - Write-Info " Try manually: $pipExe install `"$($pkg.Name)`"" - } - $allOk = $false - } - } catch { - if (-not $Silent) { Write-Error "$($pkg.Package): Installation error - $_" } - $allOk = $false - } - } else { - if (-not $Silent) { - Write-Error "$($pkg.Package): NOT INSTALLED - $($pkg.Description)" - Write-Info " Install with: pip install $($pkg.Name)" - } - $allOk = $false - } - } else { - if (-not $Silent) { Write-Warning "$($pkg.Package): Not installed (optional)" } - } - } - } - - # Check external tools - if (-not $Silent) { Write-Step "Checking external OCR tools..." } - - # Check for Chocolatey (used for auto-install) - $chocoAvailable = $null -ne (Get-Command choco -ErrorAction SilentlyContinue) - - # Install Chocolatey if needed and AutoInstall is enabled - if ($AutoInstall -and -not $chocoAvailable) { - if (-not $Silent) { Write-Warning "Chocolatey: NOT FOUND - Installing..." } - try { - Set-ExecutionPolicy Bypass -Scope Process -Force - [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072 - Invoke-Expression ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) - # Refresh environment - $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User") - $chocoAvailable = $null -ne (Get-Command choco -ErrorAction SilentlyContinue) - if ($chocoAvailable) { - if (-not $Silent) { Write-Success "Chocolatey: Installed successfully" } - } else { - if (-not $Silent) { Write-Warning "Chocolatey: Installed but not in PATH - restart PowerShell" } - } - } catch { - if (-not $Silent) { Write-Error "Chocolatey: Installation failed - $_" } - } - } - - # Tesseract - $tesseractPath = Get-Command tesseract -ErrorAction SilentlyContinue - if ($tesseractPath) { - $tessVersion = cmd /c "tesseract --version 2>&1" | Select-Object -First 1 - if (-not $Silent) { - Write-Success "Tesseract: $tessVersion" - Write-Info " Path: $($tesseractPath.Source)" - } - } else { - if ($AutoInstall) { - if ($chocoAvailable) { - if (-not $Silent) { Write-Warning "Tesseract: NOT FOUND - Installing via Chocolatey..." } - try { - $result = cmd /c "choco install tesseract -y 2>&1" - # Refresh PATH - $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User") - $tesseractPath = Get-Command tesseract -ErrorAction SilentlyContinue - if ($tesseractPath) { - if (-not $Silent) { Write-Success "Tesseract: Installed successfully" } - } else { - if (-not $Silent) { Write-Error "Tesseract: Installation completed but not in PATH - restart PowerShell" } - $allOk = $false - } - } catch { - if (-not $Silent) { Write-Error "Tesseract: Chocolatey install failed - $_" } - $allOk = $false - } - } else { - if (-not $Silent) { - Write-Error "Tesseract: NOT FOUND - Chocolatey not available for auto-install" - Write-Info " Install Chocolatey first: https://chocolatey.org/install" - Write-Info " Then run: choco install tesseract -y" - } - $allOk = $false - } - } else { - if (-not $Silent) { - Write-Error "Tesseract: NOT FOUND in PATH" - Write-Info " Install with: choco install tesseract -y" - Write-Info " Or download from: https://github.com/UB-Mannheim/tesseract/wiki" - } - $allOk = $false - } - } - - # Poppler (for PDF support) - $popplerPath = Get-Command pdftoppm -ErrorAction SilentlyContinue - if ($popplerPath) { - if (-not $Silent) { - Write-Success "Poppler: Found (pdftoppm)" - Write-Info " Path: $($popplerPath.Source)" - } - } else { - if ($AutoInstall -and $chocoAvailable) { - if (-not $Silent) { Write-Warning "Poppler: NOT FOUND - Installing via Chocolatey..." } - try { - $result = cmd /c "choco install poppler -y 2>&1" - # Refresh PATH - $env:Path = [System.Environment]::GetEnvironmentVariable("Path", "Machine") + ";" + [System.Environment]::GetEnvironmentVariable("Path", "User") - $popplerPath = Get-Command pdftoppm -ErrorAction SilentlyContinue - if ($popplerPath) { - if (-not $Silent) { Write-Success "Poppler: Installed successfully" } - } else { - if (-not $Silent) { Write-Warning "Poppler: Installation completed but not in PATH - restart PowerShell" } - } - } catch { - if (-not $Silent) { Write-Warning "Poppler: Chocolatey install failed - $_" } - } - } else { - if (-not $Silent) { - Write-Warning "Poppler: NOT FOUND in PATH (required for PDF OCR)" - Write-Info " Install with: choco install poppler -y" - } - } - } - - # Check .env OCR settings - if (-not $Silent) { - Write-Step "Checking OCR configuration in .env..." - $envPath = Join-Path $Config.BackendPath ".env" - if (Test-Path $envPath) { - $envContent = Get-Content $envPath -Raw - - $ocrSettings = @( - "OCR_ENABLE_PADDLEOCR", - "OCR_ENABLE_TESSERACT", - "OCR_DEFAULT_ENGINE", - "OCR_WORKERS" - ) - - foreach ($setting in $ocrSettings) { - if ($envContent -match "$setting\s*=\s*(.+)") { - Write-Info " $setting = $($Matches[1].Trim())" - } else { - Write-Warning " ${setting}: NOT CONFIGURED" - } - } - } else { - Write-Warning ".env file not found at: $envPath" - } - - Write-Host "`n" + ("=" * 70) -ForegroundColor Cyan - if ($allOk) { - Write-Host " Result: All required OCR dependencies are installed" -ForegroundColor Green - } else { - Write-Host " Result: Some required dependencies are MISSING" -ForegroundColor Red - Write-Host " Run with -AutoInstall to install missing packages" -ForegroundColor Yellow - } - Write-Host ("=" * 70) -ForegroundColor Cyan - } - - return $allOk -} - -# ============================================================================= -# BACKUP FUNCTIONS -# ============================================================================= - -function New-Backup { - param([string]$Component) - - Write-Step "Creating backup before deployment..." - - if (-not (Test-Path $Config.BackupPath)) { - New-Item -ItemType Directory -Path $Config.BackupPath -Force | Out-Null - } - - $timestamp = Get-Date -Format "yyyyMMdd-HHmmss" - $backupName = "backup-${Component}-${timestamp}" - $backupDest = Join-Path $Config.BackupPath $backupName - - try { - New-Item -ItemType Directory -Path $backupDest -Force | Out-Null - - if ($Component -eq "Backend" -or $Component -eq "All") { - if (Test-Path $Config.BackendPath) { - Write-Info "Backing up backend..." - Copy-Item -Path $Config.BackendPath -Destination (Join-Path $backupDest "backend") -Recurse -Force - } - if (Test-Path $Config.SharedPath) { - Write-Info "Backing up shared modules..." - Copy-Item -Path $Config.SharedPath -Destination (Join-Path $backupDest "shared") -Recurse -Force - } - } - - if ($Component -eq "Frontend" -or $Component -eq "All") { - if (Test-Path $Config.FrontendPath) { - Write-Info "Backing up frontend..." - Copy-Item -Path $Config.FrontendPath -Destination (Join-Path $backupDest "frontend") -Recurse -Force - } - } - - Write-Success "Backup created: $backupName" - - # Clean old backups (keep last N) - $allBackups = Get-ChildItem -Path $Config.BackupPath -Directory | Sort-Object CreationTime -Descending - if ($allBackups.Count -gt $Config.MaxBackups) { - $toDelete = $allBackups | Select-Object -Skip $Config.MaxBackups - foreach ($old in $toDelete) { - Write-Info "Removing old backup: $($old.Name)" - Remove-Item -Path $old.FullName -Recurse -Force - } - } - - return $true - } catch { - Write-Error "Backup failed: $_" - return $false - } -} - -# ============================================================================= -# DEPLOYMENT FUNCTIONS -# ============================================================================= - -function Deploy-Scripts { - <# - .SYNOPSIS - Deploys PowerShell scripts to installation directory - - .DESCRIPTION - Copies deployment scripts from package to install root's scripts folder. - This includes the wrapper script needed for SSH tunnel auto-start. - #> - param([string]$SourcePath) - - Write-Step "Deploying scripts..." - - $sourceScripts = Join-Path $SourcePath "scripts" - $destScripts = Join-Path $Config.InstallRoot "scripts" - - # Scripts to deploy (essential for operation) - $requiredScripts = @( - "ssh-tunnel.ps1", - "start-backend-service.ps1", - "ROA2WEB-Console.ps1" - ) - - try { - # Create scripts directory if needed - if (-not (Test-Path $destScripts)) { - New-Item -ItemType Directory -Path $destScripts -Force | Out-Null - Write-Info "Created scripts directory: $destScripts" - } - - $deployedCount = 0 - - # Copy scripts from package - if (Test-Path $sourceScripts) { - foreach ($script in $requiredScripts) { - $srcFile = Join-Path $sourceScripts $script - $destFile = Join-Path $destScripts $script - - if (Test-Path $srcFile) { - Copy-Item -Path $srcFile -Destination $destFile -Force - Write-Info "Deployed: $script" - $deployedCount++ - } - } - } - - # Also copy from current script location (fallback) - foreach ($script in $requiredScripts) { - $srcFile = Join-Path $PSScriptRoot $script - $destFile = Join-Path $destScripts $script - - if ((Test-Path $srcFile) -and (-not (Test-Path $destFile))) { - Copy-Item -Path $srcFile -Destination $destFile -Force - Write-Info "Deployed (from PSScriptRoot): $script" - $deployedCount++ - } - } - - if ($deployedCount -gt 0) { - Write-Success "Scripts deployed ($deployedCount files)" - } else { - Write-Warning "No scripts to deploy" - } - - # Verify essential wrapper script - $wrapperPath = Join-Path $destScripts "start-backend-service.ps1" - if (Test-Path $wrapperPath) { - Write-Success "Service wrapper script ready: $wrapperPath" - } else { - Write-Warning "Service wrapper script not found - SSH tunnel auto-start may not work" - } - - return $true - } catch { - Write-Error "Scripts deployment failed: $_" - return $false - } -} - -function Deploy-Backend { - param([string]$SourcePath) - - Write-Step "Deploying backend..." - - $sourceBe = Join-Path $SourcePath "backend" - $sourceShared = Join-Path $SourcePath "shared" - - if (-not (Test-Path $sourceBe)) { - Write-Error "Backend not found in package: $sourceBe" - return $false - } - - try { - # Stop service - if (-not (Stop-ROAService)) { - Write-Warning "Failed to stop service, continuing anyway..." - } - - # Backup - if (-not (New-Backup -Component "Backend")) { - Write-Warning "Backup failed, but continuing with deployment" - } - - # Deploy backend - Write-Info "Copying backend files..." - if (Test-Path $Config.BackendPath) { - # Preserve .env file - $envFile = Join-Path $Config.BackendPath ".env" - $envBackup = $null - if (Test-Path $envFile) { - $envBackup = Get-Content $envFile -Raw - Write-Info "Preserving .env file" - } - - # Preserve data directory (contains SQLite databases with production data!) - $dataDir = Join-Path $Config.BackendPath "data" - $dataTempPath = Join-Path $env:TEMP "roa2web-data-backup-$(Get-Date -Format 'yyyyMMddHHmmss')" - $dataBackup = $null - if (Test-Path $dataDir) { - Write-Info "Preserving data directory: receipts.db, telegram.db, cache, uploads" - Write-Info " - receipts/: Data Entry SQLite database (receipts, approvals)" - Write-Info " - telegram/: Telegram bot auth/session database" - Write-Info " - cache/: Reports L2 cache database" - Copy-Item -Path $dataDir -Destination $dataTempPath -Recurse -Force - $dataBackup = $dataTempPath - } - - # Delete old venv inside backend if it exists (it has hardcoded paths and can't be moved) - $oldVenvPath = Join-Path $Config.BackendPath "venv" - if (Test-Path $oldVenvPath) { - Write-Info "Removing old venv from backend directory (will use external venv)" - Remove-Item -Path $oldVenvPath -Recurse -Force -ErrorAction SilentlyContinue - } - - Remove-Item -Path $Config.BackendPath -Recurse -Force - Copy-Item -Path $sourceBe -Destination $Config.BackendPath -Recurse -Force - - # Restore .env - if ($envBackup) { - Set-Content -Path $envFile -Value $envBackup -Force - Write-Success ".env file restored" - } - - # Restore data directory - if ($dataBackup -and (Test-Path $dataBackup)) { - # Remove the empty data dir from package and restore the preserved one - $newDataDir = Join-Path $Config.BackendPath "data" - if (Test-Path $newDataDir) { - Remove-Item -Path $newDataDir -Recurse -Force - } - Copy-Item -Path $dataBackup -Destination $newDataDir -Recurse -Force - Remove-Item -Path $dataBackup -Recurse -Force -ErrorAction SilentlyContinue - Write-Success "Data directory restored (SQLite databases preserved)" - } - } else { - Copy-Item -Path $sourceBe -Destination $Config.BackendPath -Recurse -Force - } - Write-Success "Backend files deployed" - - # Deploy shared modules if present - if (Test-Path $sourceShared) { - Write-Info "Copying shared modules..." - if (Test-Path $Config.SharedPath) { - Remove-Item -Path $Config.SharedPath -Recurse -Force - } - Copy-Item -Path $sourceShared -Destination $Config.SharedPath -Recurse -Force - Write-Success "Shared modules deployed" - } - - # Setup virtual environment - Write-Step "Setting up Python virtual environment..." - $venvCreated = Initialize-Venv - if (-not $venvCreated) { - Write-Warning "Could not create/verify virtual environment" - } - - # Install requirements.txt - $requirementsFile = Join-Path $Config.BackendPath "requirements.txt" - if (Test-Path $requirementsFile) { - $pyPaths = Get-PythonPaths - if ($pyPaths.IsVenv) { - Write-Step "Installing Python dependencies in venv..." - $pipExe = $pyPaths.Pip - - # Verify pip is functional before installing - $pipVersion = & $pipExe --version 2>&1 - if ($LASTEXITCODE -ne 0) { - Write-Error "Pip is not functional: $pipVersion" - Write-Info "Try: Remove-Item -Recurse $($Config.VenvPath); then redeploy" - } else { - Write-Info "Using pip: $pipVersion" - - # Install requirements (ignore warnings, check exit code only) - $oldErrorAction = $ErrorActionPreference - $ErrorActionPreference = "Continue" - $pipOutput = & $pipExe install -r $requirementsFile 2>&1 - $pipExitCode = $LASTEXITCODE - $ErrorActionPreference = $oldErrorAction - - # Log warnings but don't fail on them - $pipOutput | ForEach-Object { - if ($_ -match "WARNING:") { - Write-Warning $_ - } - } - - if ($pipExitCode -eq 0) { - # Verify uvicorn installed (critical dependency) - $uvicornCheck = & $pipExe show uvicorn 2>&1 - if ($LASTEXITCODE -eq 0) { - Write-Success "Python dependencies installed" - } else { - Write-Error "Dependencies install failed - uvicorn not found" - Write-Info "Manual fix: $pipExe install -r $requirementsFile" - } - } else { - Write-Error "Pip install failed with exit code $pipExitCode" - Write-Info "Manual fix: $pipExe install -r $requirementsFile" - } - } - } else { - Write-Warning "No venv found - skipping requirements.txt installation" - } - } - - # Update service to use venv Python - $pyPaths = Get-PythonPaths - if ($pyPaths.IsVenv) { - Update-ServiceToUseVenv | Out-Null - } - - # Start service - Start-Sleep -Seconds 2 - if (Start-ROAService) { - Write-Success "Backend deployment completed successfully" - - # Check and auto-install OCR dependencies after deployment - Write-Step "Checking and installing OCR dependencies..." - $ocrOk = Test-OCRDependencies -AutoInstall - if (-not $ocrOk) { - Write-Warning "Some OCR dependencies could not be installed automatically" - Write-Info "Manual installation may be required for external tools (Tesseract, Poppler)" - } - - return $true - } else { - Write-Warning "Backend deployed but service start failed" - Write-Info "Check logs: $($Config.BackendStderrLog)" - return $false - } - } catch { - Write-Error "Backend deployment failed: $_" - return $false - } -} - -function Deploy-Frontend { - param([string]$SourcePath) - - Write-Step "Deploying frontend..." - - $sourceFe = Join-Path $SourcePath "frontend" - - if (-not (Test-Path $sourceFe)) { - Write-Error "Frontend not found in package: $sourceFe" - return $false - } - - try { - # Backup - if (-not (New-Backup -Component "Frontend")) { - Write-Warning "Backup failed, but continuing with deployment" - } - - # Deploy frontend - Write-Info "Copying frontend files to IIS..." - if (Test-Path $Config.FrontendPath) { - Remove-Item -Path $Config.FrontendPath -Recurse -Force - } - Copy-Item -Path $sourceFe -Destination $Config.FrontendPath -Recurse -Force - Write-Success "Frontend files deployed" - - # Verify web.config was deployed (should be in frontend/ from dist/) - $deployedWebConfig = Join-Path $Config.FrontendPath "web.config" - if (Test-Path $deployedWebConfig) { - Write-Success "web.config deployed successfully" - # Verify it has correct configuration for /roa2web/ path - $configContent = Get-Content $deployedWebConfig -Raw - if ($configContent -match 'url="[^"]*roa2web/api') { - Write-Success "web.config contains correct /roa2web/api proxy rules" - } else { - Write-Warning "web.config may not have correct /roa2web/api proxy configuration" - } - } else { - Write-Warning "web.config not found in deployed frontend: $deployedWebConfig" - Write-Warning "IIS reverse proxy will not work without web.config" - Write-Warning "Ensure 'public/web.config' exists in source and rebuild frontend" - } - - Write-Success "Frontend deployment completed successfully" - return $true - } catch { - Write-Error "Frontend deployment failed: $_" - return $false - } -} - -function Deploy-All { - param([string]$SourcePath) - - Write-Step "Deploying complete package (Backend + Frontend)..." - - Write-Host "`n" + ("=" * 70) -ForegroundColor Cyan - Write-Host " FULL DEPLOYMENT" -ForegroundColor Cyan - Write-Host ("=" * 70) -ForegroundColor Cyan - - # Backup everything - if (-not (New-Backup -Component "All")) { - Write-Warning "Backup failed, but continuing with deployment" - } - - # Deploy scripts first (needed for service wrapper) - $scriptsOk = Deploy-Scripts -SourcePath $SourcePath - - # Deploy backend (includes service restart) - $backendOk = Deploy-Backend -SourcePath $SourcePath - - # Deploy frontend - $frontendOk = Deploy-Frontend -SourcePath $SourcePath - - Write-Host "`n" + ("=" * 70) -ForegroundColor Cyan - Write-Host " DEPLOYMENT SUMMARY" -ForegroundColor Cyan - Write-Host ("=" * 70) -ForegroundColor Cyan - Write-Host " Scripts: " -NoNewline - if ($scriptsOk) { - Write-Host "[OK] Success" -ForegroundColor Green - } else { - Write-Host "[X] Failed" -ForegroundColor Red - } - Write-Host " Backend: " -NoNewline - if ($backendOk) { - Write-Host "[OK] Success" -ForegroundColor Green - } else { - Write-Host "[X] Failed" -ForegroundColor Red - } - Write-Host " Frontend: " -NoNewline - if ($frontendOk) { - Write-Host "[OK] Success" -ForegroundColor Green - } else { - Write-Host "[X] Failed" -ForegroundColor Red - } - Write-Host ("=" * 70) -ForegroundColor Cyan - - return ($scriptsOk -and $backendOk -and $frontendOk) -} - -# ============================================================================= -# LOG VIEWING -# ============================================================================= - -function Show-Logs { - Write-Host "`n" + ("=" * 70) -ForegroundColor Cyan - Write-Host " Service Logs" -ForegroundColor Cyan - Write-Host ("=" * 70) -ForegroundColor Cyan - - # Backend stdout - if (Test-Path $Config.BackendStdoutLog) { - Write-Host "`n--- Backend STDOUT (last 30 lines) ---" -ForegroundColor Yellow - Get-Content $Config.BackendStdoutLog -Tail 30 | ForEach-Object { - Write-Host $_ -ForegroundColor Gray - } - } else { - Write-Warning "Backend stdout log not found: $($Config.BackendStdoutLog)" - } - - # Backend stderr - if (Test-Path $Config.BackendStderrLog) { - Write-Host "`n--- Backend STDERR (last 20 lines) ---" -ForegroundColor Yellow - Get-Content $Config.BackendStderrLog -Tail 20 | ForEach-Object { - Write-Host $_ -ForegroundColor Red - } - } else { - Write-Info "Backend stderr log not found (this is OK if no errors)" - } - - Write-Host "`n" + ("=" * 70) -ForegroundColor Cyan -} - -# ============================================================================= -# STATUS DISPLAY -# ============================================================================= - -function Show-Status { - Write-Host "`n" + ("=" * 70) -ForegroundColor Cyan - Write-Host " ROA2WEB Ultrathin Monolith - System Status" -ForegroundColor Cyan - Write-Host ("=" * 70) -ForegroundColor Cyan - - # Service Status - $service = Get-ServiceSafe -ServiceName $Config.ServiceName - Write-Host "`n Service: $($Config.ServiceDisplayName)" -ForegroundColor Yellow - if ($service) { - Write-Host " Status: " -NoNewline - if ($service.Status -eq 'Running') { - Write-Host "$($service.Status)" -ForegroundColor Green - } else { - Write-Host "$($service.Status)" -ForegroundColor Red - } - Write-Host " Name: $($Config.ServiceName)" -ForegroundColor Gray - Write-Host " Port: $($Config.ServicePort)" -ForegroundColor Gray - } else { - Write-Host " Status: " -NoNewline - Write-Host "Not Installed" -ForegroundColor Red - Write-Host " Run Install-ROA2WEB.ps1 to install the service" -ForegroundColor Gray - } - - # Health Check - if ($service -and $service.Status -eq 'Running') { - Write-Host "" - Test-ServiceHealth | Out-Null - } - - # Paths - Write-Host "`n Installation Paths:" -ForegroundColor Yellow - Write-Host " Root: $($Config.InstallRoot)" -ForegroundColor Gray - Write-Host " Backend: $($Config.BackendPath)" -ForegroundColor Gray - Write-Host " Frontend: $($Config.FrontendPath)" -ForegroundColor Gray - Write-Host " Shared: $($Config.SharedPath)" -ForegroundColor Gray - Write-Host " Logs: $($Config.LogsPath)" -ForegroundColor Gray - - # Module Configuration - $envFile = Join-Path $Config.BackendPath ".env" - if (Test-Path $envFile) { - Write-Host "`n Module Configuration (.env):" -ForegroundColor Yellow - $envContent = Get-Content $envFile - $modules = $envContent | Where-Object { $_ -match "^MODULE_.*_ENABLED=" } - foreach ($line in $modules) { - if ($line -match "MODULE_(.+)_ENABLED=(.+)") { - $moduleName = $matches[1] - $enabled = $matches[2] -eq "true" - Write-Host " $moduleName`: " -NoNewline -ForegroundColor Gray - if ($enabled) { - Write-Host "Enabled" -ForegroundColor Green - } else { - Write-Host "Disabled" -ForegroundColor Red - } - } - } - } - - # Endpoints - Write-Host "`n API Endpoints:" -ForegroundColor Yellow - Write-Host " Health: http://localhost:$($Config.ServicePort)/health" -ForegroundColor Gray - Write-Host " Docs: http://localhost:$($Config.ServicePort)/docs" -ForegroundColor Gray - Write-Host " Frontend: http://localhost/ (via IIS)" -ForegroundColor Gray - - Write-Host "`n" + ("=" * 70) -ForegroundColor Cyan -} - -# ============================================================================= -# INTERACTIVE MENU -# ============================================================================= - -function Show-MainMenu { - Clear-Host - Write-Host "`n" + ("=" * 70) -ForegroundColor Cyan - Write-Host " ROA2WEB Unified Console - Ultrathin Monolith" -ForegroundColor Cyan - Write-Host ("=" * 70) -ForegroundColor Cyan - - $service = Get-ServiceSafe -ServiceName $Config.ServiceName - if ($service) { - Write-Host "`n Service Status: " -NoNewline - if ($service.Status -eq 'Running') { - Write-Host "RUNNING" -ForegroundColor Green - } else { - Write-Host "$($service.Status)" -ForegroundColor Yellow - } - } else { - Write-Host "`n Service Status: " -NoNewline - Write-Host "NOT INSTALLED" -ForegroundColor Red - } - - Write-Host "`n Main Menu:" -ForegroundColor Yellow - Write-Host "" - Write-Host " === Deployment ===" -ForegroundColor Cyan - Write-Host " [1] Deploy Backend" -ForegroundColor White - Write-Host " [2] Deploy Frontend" -ForegroundColor White - Write-Host " [3] Deploy All (Backend + Frontend)" -ForegroundColor White - Write-Host "" - Write-Host " === Service Management ===" -ForegroundColor Cyan - Write-Host " [4] Start Service" -ForegroundColor White - Write-Host " [5] Stop Service" -ForegroundColor White - Write-Host " [6] Restart Service" -ForegroundColor White - Write-Host "" - Write-Host " === Monitoring ===" -ForegroundColor Cyan - Write-Host " [7] View Status" -ForegroundColor White - Write-Host " [8] View Logs" -ForegroundColor White - Write-Host " [9] Check/Install OCR Dependencies" -ForegroundColor White - Write-Host "" - Write-Host " [Q] Quit" -ForegroundColor Red - Write-Host "" - Write-Host ("=" * 70) -ForegroundColor Cyan - - do { - Write-Host "`nYour choice: " -ForegroundColor Yellow -NoNewline - $choice = Read-Host - - switch ($choice.ToUpper()) { - "1" { - Write-Host "`nEnter deployment package path: " -NoNewline - $pkgPath = Read-Host - if (Test-Path $pkgPath) { - Deploy-Backend -SourcePath $pkgPath | Out-Null - } else { - Write-Error "Package path not found: $pkgPath" - } - Wait-ForKeyPress - return "Continue" - } - "2" { - Write-Host "`nEnter deployment package path: " -NoNewline - $pkgPath = Read-Host - if (Test-Path $pkgPath) { - Deploy-Frontend -SourcePath $pkgPath | Out-Null - } else { - Write-Error "Package path not found: $pkgPath" - } - Wait-ForKeyPress - return "Continue" - } - "3" { - Write-Host "`nEnter deployment package path: " -NoNewline - $pkgPath = Read-Host - if (Test-Path $pkgPath) { - Deploy-All -SourcePath $pkgPath | Out-Null - } else { - Write-Error "Package path not found: $pkgPath" - } - Wait-ForKeyPress - return "Continue" - } - "4" { - Start-ROAService | Out-Null - Wait-ForKeyPress - return "Continue" - } - "5" { - Stop-ROAService | Out-Null - Wait-ForKeyPress - return "Continue" - } - "6" { - Restart-ROAService | Out-Null - Wait-ForKeyPress - return "Continue" - } - "7" { - Show-Status - Wait-ForKeyPress - return "Continue" - } - "8" { - Show-Logs - Wait-ForKeyPress - return "Continue" - } - "9" { - $ocrOk = Test-OCRDependencies - if (-not $ocrOk) { - Write-Host "" - Write-Host " Install missing dependencies? (Y/N): " -ForegroundColor Yellow -NoNewline - $installChoice = Read-Host - if ($installChoice -eq "Y" -or $installChoice -eq "y") { - Write-Host "" - Test-OCRDependencies -AutoInstall | Out-Null - } - } - Wait-ForKeyPress - return "Continue" - } - "Q" { return "Quit" } - default { - Write-Host "Invalid choice. Please select 1-9 or Q." -ForegroundColor Red - } - } - } while ($true) -} - -# ============================================================================= -# MAIN EXECUTION -# ============================================================================= - -function Main { - # Check if service installed - if (-not (Test-ServiceInstalled) -and -not $NonInteractive) { - Write-Warning "ROA2WEB service not found" - Write-Info "Run Install-ROA2WEB.ps1 first to install the service" - Write-Host "" - Wait-ForKeyPress - } - - # Non-interactive mode - if ($NonInteractive -and $Action) { - switch ($Action) { - "DeployBackend" { - if (-not $PackagePath) { - Write-Error "PackagePath parameter required for DeployBackend" - exit 1 - } - $success = Deploy-Backend -SourcePath $PackagePath - exit $(if ($success) { 0 } else { 1 }) - } - "DeployFrontend" { - if (-not $PackagePath) { - Write-Error "PackagePath parameter required for DeployFrontend" - exit 1 - } - $success = Deploy-Frontend -SourcePath $PackagePath - exit $(if ($success) { 0 } else { 1 }) - } - "DeployAll" { - if (-not $PackagePath) { - Write-Error "PackagePath parameter required for DeployAll" - exit 1 - } - $success = Deploy-All -SourcePath $PackagePath - exit $(if ($success) { 0 } else { 1 }) - } - "StartService" { - $success = Start-ROAService - exit $(if ($success) { 0 } else { 1 }) - } - "StopService" { - $success = Stop-ROAService - exit $(if ($success) { 0 } else { 1 }) - } - "RestartService" { - $success = Restart-ROAService - exit $(if ($success) { 0 } else { 1 }) - } - "Status" { - Show-Status - exit 0 - } - "ViewLogs" { - Show-Logs - exit 0 - } - "CheckOCR" { - $success = Test-OCRDependencies - exit $(if ($success) { 0 } else { 1 }) - } - "InstallOCR" { - $success = Test-OCRDependencies -AutoInstall - exit $(if ($success) { 0 } else { 1 }) - } - } - } - - # Interactive mode - do { - $result = Show-MainMenu - } while ($result -eq "Continue") - - Write-Host "`nGoodbye!`n" -ForegroundColor Cyan -} - -# Run main -Main diff --git a/deploy-package-20260223-151231/scripts/ssh-tunnel.ps1 b/deploy-package-20260223-151231/scripts/ssh-tunnel.ps1 deleted file mode 100644 index fa63726..0000000 --- a/deploy-package-20260223-151231/scripts/ssh-tunnel.ps1 +++ /dev/null @@ -1,509 +0,0 @@ -<# -.SYNOPSIS - ROA2WEB SSH Tunnel Manager for Windows (equivalent to ssh-tunnel.sh) - -.DESCRIPTION - Manages SSH tunnels to Oracle servers on Windows. - Reads configuration from backend/ssh-tunnels.json - SSH keys should be in backend/secrets/{id}.ssh_key - - Requirements: - - Windows 10/11 with OpenSSH Client (installed by default) - - SSH private keys in backend/secrets/ - -.PARAMETER Action - start - Start all configured SSH tunnels - stop - Stop all SSH tunnels - status - Show status of all tunnels - restart - Restart all tunnels - help - Show this help - -.EXAMPLE - .\ssh-tunnel.ps1 start - Start all configured tunnels - -.EXAMPLE - .\ssh-tunnel.ps1 status - Check tunnel status - -.NOTES - Author: ROA2WEB Team - Version: 1.0 -#> - -param( - [Parameter(Position=0)] - [ValidateSet("start", "stop", "status", "restart", "help", "")] - [string]$Action = "help" -) - -$ErrorActionPreference = "Stop" - -# ============================================================================= -# CONFIGURATION -# ============================================================================= - -# Detect paths - script can run from deployment/windows/scripts or project root -$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path - -# Try to find backend relative to script location -$PossiblePaths = @( - (Join-Path $ScriptDir "..\..\..\backend"), # From deployment/windows/scripts - (Join-Path $ScriptDir "backend"), # From project root - "C:\inetpub\wwwroot\roa2web\backend" # Production path -) - -$BackendPath = $null -foreach ($path in $PossiblePaths) { - $resolved = [System.IO.Path]::GetFullPath($path) - if (Test-Path $resolved) { - $BackendPath = $resolved - break - } -} - -if (-not $BackendPath) { - Write-Host "[ERROR] Cannot find backend directory" -ForegroundColor Red - Write-Host "Tried: $($PossiblePaths -join ', ')" -ForegroundColor Yellow - exit 1 -} - -$Config = @{ - BackendPath = $BackendPath - TunnelsFile = Join-Path $BackendPath "ssh-tunnels.json" - SecretsPath = Join-Path $BackendPath "secrets" - PidDir = Join-Path $env:TEMP "roa_tunnels" -} - -# Create PID directory -if (-not (Test-Path $Config.PidDir)) { - New-Item -ItemType Directory -Path $Config.PidDir -Force | Out-Null -} - -# ============================================================================= -# HELPER FUNCTIONS -# ============================================================================= - -function Write-ColorLine { - param([string]$Text, [string]$Color = "White") - Write-Host $Text -ForegroundColor $Color -} - -function Get-PidFile { - param([string]$ServerId) - return Join-Path $Config.PidDir "tunnel_$ServerId.pid" -} - -function Test-TunnelRunning { - param([string]$ServerId) - - $pidFile = Get-PidFile $ServerId - if (Test-Path $pidFile) { - $tunnelPid = Get-Content $pidFile -ErrorAction SilentlyContinue - if ($tunnelPid) { - $process = Get-Process -Id $tunnelPid -ErrorAction SilentlyContinue - if ($process -and $process.ProcessName -eq "ssh") { - return $true - } - } - # Clean up stale PID file - Remove-Item $pidFile -Force -ErrorAction SilentlyContinue - } - return $false -} - -function Test-PortOpen { - param([int]$Port) - - try { - $tcpClient = New-Object System.Net.Sockets.TcpClient - $tcpClient.Connect("127.0.0.1", $Port) - $tcpClient.Close() - return $true - } catch { - return $false - } -} - -function Read-TunnelConfig { - if (-not (Test-Path $Config.TunnelsFile)) { - Write-ColorLine "[WARNING] ssh-tunnels.json not found at: $($Config.TunnelsFile)" "Yellow" - return @() - } - - try { - $json = Get-Content $Config.TunnelsFile -Raw | ConvertFrom-Json - return $json - } catch { - Write-ColorLine "[ERROR] Failed to parse ssh-tunnels.json: $_" "Red" - return @() - } -} - -# ============================================================================= -# TUNNEL MANAGEMENT -# ============================================================================= - -function Start-SingleTunnel { - param([PSCustomObject]$Tunnel) - - $id = $Tunnel.id - $name = $Tunnel.name - $localPort = $Tunnel.local_port - $sshHost = $Tunnel.ssh_host - $sshPort = if ($Tunnel.ssh_port) { $Tunnel.ssh_port } else { 22 } - $sshUser = if ($Tunnel.ssh_user) { $Tunnel.ssh_user } else { "root" } - $oracleHost = if ($Tunnel.oracle_host) { $Tunnel.oracle_host } else { "127.0.0.1" } - $oraclePort = if ($Tunnel.oracle_port) { $Tunnel.oracle_port } else { 1521 } - - Write-ColorLine "[$id] $name" "Cyan" - Write-Host " Tunnel: localhost:$localPort -> ${oracleHost}:$oraclePort" - Write-Host " Via: ${sshUser}@${sshHost}:$sshPort" - - # Skip if no SSH host configured - if (-not $sshHost) { - Write-ColorLine " [SKIP] No ssh_host configured (direct connection)" "Yellow" - return $true - } - - # Check if already running - if (Test-TunnelRunning $id) { - $pidFile = Get-PidFile $id - $tunnelPid = Get-Content $pidFile - Write-ColorLine " [RUNNING] Already running (PID: $tunnelPid)" "Yellow" - return $true - } - - # Find SSH key - $sshKeyPath = $null - $possibleKeys = @( - (Join-Path $Config.SecretsPath "$id.ssh_key"), - (Join-Path $Config.SecretsPath "${id}_rsa"), - (Join-Path $Config.SecretsPath "id_rsa") - ) - - # Also check if key path is specified in config - if ($Tunnel.ssh_key) { - $configKey = $Tunnel.ssh_key - if (-not [System.IO.Path]::IsPathRooted($configKey)) { - $configKey = Join-Path $Config.BackendPath $configKey - } - $possibleKeys = @($configKey) + $possibleKeys - } - - foreach ($keyPath in $possibleKeys) { - if (Test-Path $keyPath) { - $sshKeyPath = $keyPath - break - } - } - - # Check for password file - $sshPassPath = Join-Path $Config.SecretsPath "$id.ssh_pass" - $hasPassword = Test-Path $sshPassPath - $sshPassword = $null - if ($hasPassword) { - $sshPassword = (Get-Content $sshPassPath -Raw).Trim() - } - - if (-not $sshKeyPath -and -not $hasPassword) { - Write-ColorLine " [ERROR] No SSH key or password found" "Red" - Write-ColorLine " Expected: $($Config.SecretsPath)\$id.ssh_key" "Yellow" - Write-ColorLine " or: $($Config.SecretsPath)\$id.ssh_pass" "Yellow" - return $false - } - - # Build SSH command based on auth method - # Note: Windows ssh.exe doesn't support -f (background), so we use Start-Process - $sshArgs = @( - "-N", # No remote command - "-L", "${localPort}:${oracleHost}:${oraclePort}", # Port forwarding - "-p", $sshPort, # SSH port - "-o", "StrictHostKeyChecking=no", # Skip host key check - "-o", "ServerAliveInterval=60", # Keep-alive - "-o", "ServerAliveCountMax=3", # Retry count - "-o", "ExitOnForwardFailure=yes" # Fail if port forward fails - ) - - if ($sshKeyPath) { - $sshArgs += @("-i", "`"$sshKeyPath`"") - Write-ColorLine " Using SSH key authentication" "Gray" - } - - $sshArgs += @("${sshUser}@${sshHost}") - - try { - $process = $null - - if ($hasPassword -and -not $sshKeyPath) { - # Password authentication - use plink if available, otherwise show instructions - $plinkPath = Get-Command plink.exe -ErrorAction SilentlyContinue - - if ($plinkPath) { - # Use plink for password auth - Write-ColorLine " Using password authentication (plink)" "Gray" - $plinkArgs = @( - "-ssh", - "-batch", # Non-interactive mode (skip "Press Return" prompt) - "-N", - "-L", "${localPort}:${oracleHost}:${oraclePort}", - "-P", $sshPort, - "-pw", $sshPassword - ) - # Add hostkey if specified (required for non-interactive/batch mode) - if ($Tunnel.ssh_hostkey) { - $plinkArgs += @("-hostkey", $Tunnel.ssh_hostkey) - } - $plinkArgs += "${sshUser}@${sshHost}" - - $process = Start-Process -FilePath "plink.exe" ` - -ArgumentList $plinkArgs ` - -WindowStyle Hidden ` - -PassThru - } else { - # Try with sshpass if available (e.g., via Git Bash or WSL) - $sshpassPath = Get-Command sshpass -ErrorAction SilentlyContinue - - if ($sshpassPath) { - Write-ColorLine " Using password authentication (sshpass)" "Gray" - $process = Start-Process -FilePath "sshpass" ` - -ArgumentList @("-p", $sshPassword, "ssh") + $sshArgs ` - -WindowStyle Hidden ` - -PassThru - } else { - Write-ColorLine " [ERROR] Password auth requires plink.exe (PuTTY) or sshpass" "Red" - Write-ColorLine " Install PuTTY: choco install putty" "Yellow" - Write-ColorLine " Or create SSH key: ssh-keygen -t rsa -f secrets\$id.ssh_key" "Yellow" - Write-ColorLine " Then copy public key to server: ssh-copy-id -p $sshPort ${sshUser}@${sshHost}" "Yellow" - return $false - } - } - } else { - # SSH key authentication - $process = Start-Process -FilePath "ssh.exe" ` - -ArgumentList $sshArgs ` - -WindowStyle Hidden ` - -PassThru - } - - # Wait a moment for connection - Start-Sleep -Seconds 2 - - # Check if process is still running - $process.Refresh() - if ($process.HasExited) { - Write-ColorLine " [ERROR] SSH tunnel exited immediately (code: $($process.ExitCode))" "Red" - return $false - } - - # Save PID - $pidFile = Get-PidFile $id - $process.Id | Out-File -FilePath $pidFile -NoNewline - - Write-ColorLine " [OK] Started (PID: $($process.Id))" "Green" - - # Test port connectivity - if (Test-PortOpen $localPort) { - Write-ColorLine " [OK] Port $localPort accessible" "Green" - } else { - Write-ColorLine " [WARN] Port $localPort not responding yet" "Yellow" - } - - return $true - } catch { - Write-ColorLine " [ERROR] Failed to start tunnel: $_" "Red" - return $false - } -} - -function Stop-SingleTunnel { - param([PSCustomObject]$Tunnel) - - $id = $Tunnel.id - $name = $Tunnel.name - - Write-ColorLine "[$id] $name" "Cyan" - - $pidFile = Get-PidFile $id - if (Test-Path $pidFile) { - $tunnelPid = Get-Content $pidFile -ErrorAction SilentlyContinue - if ($tunnelPid) { - $process = Get-Process -Id $tunnelPid -ErrorAction SilentlyContinue - if ($process) { - Stop-Process -Id $tunnelPid -Force -ErrorAction SilentlyContinue - Write-ColorLine " [OK] Stopped (was PID: $tunnelPid)" "Green" - } else { - Write-ColorLine " [WARN] Was not running" "Yellow" - } - } - Remove-Item $pidFile -Force -ErrorAction SilentlyContinue - } else { - Write-ColorLine " [WARN] Was not running" "Yellow" - } -} - -function Get-SingleTunnelStatus { - param([PSCustomObject]$Tunnel) - - $id = $Tunnel.id - $name = $Tunnel.name - $localPort = $Tunnel.local_port - $sshHost = $Tunnel.ssh_host - - # Skip tunnels without SSH host (direct connection) - if (-not $sshHost) { - Write-Host " " -NoNewline - Write-ColorLine "[$id] $name" "Cyan" - Write-ColorLine " Direct connection (no tunnel needed)" "Gray" - return - } - - if (Test-TunnelRunning $id) { - $pidFile = Get-PidFile $id - $tunnelPid = Get-Content $pidFile - - Write-Host " " -NoNewline - Write-Host "[OK]" -ForegroundColor Green -NoNewline - Write-ColorLine " [$id] $name" "Cyan" - Write-Host " localhost:$localPort (PID: $tunnelPid)" - - if (Test-PortOpen $localPort) { - Write-ColorLine " Port accessible" "Green" - } else { - Write-ColorLine " Port not responding" "Yellow" - } - } else { - Write-Host " " -NoNewline - Write-Host "[--]" -ForegroundColor Red -NoNewline - Write-ColorLine " [$id] $name" "Cyan" - Write-Host " localhost:$localPort (stopped)" - } -} - -# ============================================================================= -# MAIN COMMANDS -# ============================================================================= - -function Show-Header { - Write-Host "" - Write-ColorLine "============================================" "Blue" - Write-ColorLine " ROA2WEB SSH Tunnel Manager (Windows)" "Blue" - Write-ColorLine "============================================" "Blue" - Write-Host "" -} - -function Invoke-Start { - Show-Header - - $tunnels = Read-TunnelConfig - if ($tunnels.Count -eq 0) { - Write-ColorLine "[WARNING] No tunnels configured" "Yellow" - return - } - - Write-ColorLine "Starting $($tunnels.Count) tunnel(s)..." "Blue" - Write-Host "" - - $failed = 0 - foreach ($tunnel in $tunnels) { - if (-not (Start-SingleTunnel $tunnel)) { - $failed++ - } - Write-Host "" - } - - if ($failed -gt 0) { - Write-ColorLine "[WARNING] $failed tunnel(s) failed to start" "Yellow" - } else { - Write-ColorLine "[OK] All tunnels started successfully" "Green" - } -} - -function Invoke-Stop { - Show-Header - - $tunnels = Read-TunnelConfig - - Write-ColorLine "Stopping tunnels..." "Blue" - Write-Host "" - - foreach ($tunnel in $tunnels) { - Stop-SingleTunnel $tunnel - } - - Write-Host "" - Write-ColorLine "[OK] All tunnels stopped" "Green" -} - -function Invoke-Status { - Show-Header - - $tunnels = Read-TunnelConfig - - Write-ColorLine "Tunnel Status:" "Blue" - Write-Host "--------------------------------------------" - - foreach ($tunnel in $tunnels) { - Get-SingleTunnelStatus $tunnel - Write-Host "" - } -} - -function Invoke-Restart { - Invoke-Stop - Start-Sleep -Seconds 2 - Invoke-Start -} - -function Show-Help { - Show-Header - - Write-Host "Usage: .\ssh-tunnel.ps1 " - Write-Host "" - Write-ColorLine "Actions:" "Blue" - Write-Host " start - Start all configured SSH tunnels" - Write-Host " stop - Stop all SSH tunnels" - Write-Host " status - Show status of all tunnels" - Write-Host " restart - Restart all tunnels" - Write-Host " help - Show this help" - Write-Host "" - Write-ColorLine "Configuration:" "Blue" - Write-Host " Tunnels file: $($Config.TunnelsFile)" - Write-Host " Secrets dir: $($Config.SecretsPath)" - Write-Host "" - Write-ColorLine "SSH Key Setup:" "Blue" - Write-Host " 1. Copy your SSH private key to: backend\secrets\{server_id}.ssh_key" - Write-Host " 2. Ensure the key has correct permissions (readable only by you)" - Write-Host "" - Write-ColorLine "Example ssh-tunnels.json:" "Blue" - Write-Host ' [{"id": "vending", "name": "Vending Master", "local_port": 1521,' - Write-Host ' "ssh_host": "79.119.86.134", "ssh_port": 22122, "ssh_user": "romfast",' - Write-Host ' "oracle_host": "127.0.0.1", "oracle_port": 1521}]' - Write-Host "" -} - -# ============================================================================= -# MAIN -# ============================================================================= - -# Check OpenSSH availability -$sshPath = Get-Command ssh.exe -ErrorAction SilentlyContinue -if (-not $sshPath) { - Write-ColorLine "[ERROR] OpenSSH not found!" "Red" - Write-Host "" - Write-Host "OpenSSH Client is required. Install it via:" - Write-Host " Settings -> Apps -> Optional Features -> Add a feature -> OpenSSH Client" - Write-Host "" - Write-Host "Or via PowerShell (Admin):" - Write-Host " Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0" - exit 1 -} - -switch ($Action) { - "start" { Invoke-Start } - "stop" { Invoke-Stop } - "status" { Invoke-Status } - "restart" { Invoke-Restart } - "help" { Show-Help } - default { Show-Help } -} diff --git a/deploy-package-20260223-151231/scripts/start-backend-service.ps1 b/deploy-package-20260223-151231/scripts/start-backend-service.ps1 deleted file mode 100644 index 10028b9..0000000 --- a/deploy-package-20260223-151231/scripts/start-backend-service.ps1 +++ /dev/null @@ -1,225 +0,0 @@ -<# -.SYNOPSIS - ROA2WEB Backend Service Wrapper for NSSM - -.DESCRIPTION - This script is called by NSSM (Windows Service Manager) to start the backend. - It ensures SSH tunnels are running before starting uvicorn. - - Flow: - 1. Start SSH tunnels via ssh-tunnel.ps1 - 2. Wait for tunnel ports to be accessible (timeout 30s) - 3. Start uvicorn (blocking - NSSM monitors this process) - - This wrapper ensures the database connection is available before - the FastAPI application tries to initialize the Oracle pool. - -.NOTES - Author: ROA2WEB Team - Version: 1.0 - - NSSM Configuration: - - Application: powershell.exe - - Arguments: -ExecutionPolicy Bypass -File "C:\path\to\start-backend-service.ps1" - - AppDirectory: C:\inetpub\wwwroot\roa2web\backend -#> - -$ErrorActionPreference = "Stop" - -# ============================================================================= -# CONFIGURATION -# ============================================================================= - -$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path - -# Detect paths (can run from scripts dir or project root) -$PossibleRoots = @( - (Join-Path $ScriptDir "..\..\.."), # From deployment/windows/scripts - $ScriptDir, # From project root - "C:\inetpub\wwwroot\roa2web" # Production path -) - -$ProjectRoot = $null -foreach ($path in $PossibleRoots) { - $resolved = [System.IO.Path]::GetFullPath($path) - if (Test-Path (Join-Path $resolved "backend\main.py")) { - $ProjectRoot = $resolved - break - } -} - -if (-not $ProjectRoot) { - Write-Host "[ERROR] Cannot find project root (looking for backend/main.py)" -ForegroundColor Red - exit 1 -} - -$BackendDir = Join-Path $ProjectRoot "backend" -# SSH tunnel script - check production location first, then development -$TunnelsScript = Join-Path $ProjectRoot "scripts\ssh-tunnel.ps1" -if (-not (Test-Path $TunnelsScript)) { - $TunnelsScript = Join-Path $ProjectRoot "deployment\windows\scripts\ssh-tunnel.ps1" -} -$TunnelsConfig = Join-Path $BackendDir "ssh-tunnels.json" -$VenvPath = "C:\inetpub\wwwroot\roa2web-venv" -$VenvPython = Join-Path $VenvPath "Scripts\python.exe" -$LogDir = Join-Path $ProjectRoot "logs" - -# Fallback to local venv if production venv doesn't exist -if (-not (Test-Path $VenvPython)) { - $VenvPath = Join-Path $BackendDir "venv" - $VenvPython = Join-Path $VenvPath "Scripts\python.exe" -} - -# ============================================================================= -# HELPER FUNCTIONS -# ============================================================================= - -function Write-Log { - param([string]$Message, [string]$Level = "INFO") - $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss" - Write-Host "[$timestamp] [$Level] $Message" -} - -function Test-PortOpen { - param([int]$Port, [int]$Timeout = 3) - try { - $tcpClient = New-Object System.Net.Sockets.TcpClient - $result = $tcpClient.BeginConnect("127.0.0.1", $Port, $null, $null) - $success = $result.AsyncWaitHandle.WaitOne($Timeout * 1000) - if ($success) { - $tcpClient.EndConnect($result) - $tcpClient.Close() - return $true - } - return $false - } catch { - return $false - } -} - -function Get-TunnelPorts { - # Read ports from ssh-tunnels.json - if (-not (Test-Path $TunnelsConfig)) { - Write-Log "No ssh-tunnels.json found, assuming no tunnels needed" "WARN" - return @() - } - - try { - $tunnels = Get-Content $TunnelsConfig -Raw | ConvertFrom-Json - $ports = @() - foreach ($tunnel in $tunnels) { - # Only include tunnels that have ssh_host configured - if ($tunnel.ssh_host) { - $ports += [int]$tunnel.local_port - } - } - return $ports - } catch { - Write-Log "Failed to parse ssh-tunnels.json: $_" "ERROR" - return @() - } -} - -# ============================================================================= -# MAIN STARTUP SEQUENCE -# ============================================================================= - -Write-Log "==========================================" -Write-Log "ROA2WEB Backend Service Wrapper Starting" -Write-Log "==========================================" -Write-Log "Project Root: $ProjectRoot" -Write-Log "Backend Dir: $BackendDir" -Write-Log "Venv Python: $VenvPython" - -# Ensure log directory exists -if (-not (Test-Path $LogDir)) { - New-Item -ItemType Directory -Path $LogDir -Force | Out-Null -} - -# ------------------------------------------------------------------------- -# Step 1: Start SSH Tunnels -# ------------------------------------------------------------------------- -Write-Log "Step 1: Starting SSH Tunnels..." - -if (Test-Path $TunnelsScript) { - try { - & $TunnelsScript start - Write-Log "SSH tunnel script executed" - } catch { - Write-Log "SSH tunnel script failed: $_" "ERROR" - # Continue anyway - tunnels might already be running - } -} else { - Write-Log "SSH tunnel script not found at $TunnelsScript" "WARN" -} - -# ------------------------------------------------------------------------- -# Step 2: Wait for Tunnel Ports -# ------------------------------------------------------------------------- -$tunnelPorts = Get-TunnelPorts - -if ($tunnelPorts.Count -gt 0) { - Write-Log "Step 2: Waiting for tunnel ports: $($tunnelPorts -join ', ')..." - - $timeout = 30 - $waited = 0 - $allReady = $false - - while ($waited -lt $timeout) { - $allReady = $true - foreach ($port in $tunnelPorts) { - if (-not (Test-PortOpen $port)) { - $allReady = $false - break - } - } - - if ($allReady) { - Write-Log "All tunnel ports are accessible" - break - } - - Start-Sleep -Seconds 1 - $waited++ - - if ($waited % 5 -eq 0) { - Write-Log "Still waiting for tunnel ports... ($waited/${timeout}s)" - } - } - - if (-not $allReady) { - Write-Log "Tunnel ports not ready after ${timeout}s - continuing anyway" "WARN" - } -} else { - Write-Log "Step 2: No tunnel ports configured, skipping wait" -} - -# ------------------------------------------------------------------------- -# Step 3: Start uvicorn (blocking) -# ------------------------------------------------------------------------- -Write-Log "Step 3: Starting uvicorn..." -Write-Log "Working Directory: $BackendDir" -Write-Log "Python: $VenvPython" - -# Verify Python exists -if (-not (Test-Path $VenvPython)) { - Write-Log "Python not found at $VenvPython" "ERROR" - exit 1 -} - -# Set working directory -Set-Location $BackendDir - -# Set PYTHONPATH for shared modules -$env:PYTHONPATH = "$ProjectRoot;$BackendDir" - -# Start uvicorn (this blocks - NSSM monitors this process) -# NOTE: --workers 1 is required because Telegram bot uses polling (single instance only) -Write-Log "Executing: $VenvPython -m uvicorn main:app --host 127.0.0.1 --port 8000 --workers 1" - -& $VenvPython -m uvicorn main:app --host 127.0.0.1 --port 8000 --workers 1 - -# If we get here, uvicorn has exited -$exitCode = $LASTEXITCODE -Write-Log "uvicorn exited with code: $exitCode" "WARN" -exit $exitCode diff --git a/deploy-package-20260223-151231/shared/__init__.py b/deploy-package-20260223-151231/shared/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/shared/auth/README.md b/deploy-package-20260223-151231/shared/auth/README.md deleted file mode 100644 index 293b0f2..0000000 --- a/deploy-package-20260223-151231/shared/auth/README.md +++ /dev/null @@ -1,649 +0,0 @@ -# 🔐 ROA2WEB Shared Authentication System - -Sistem de autentificare JWT partajat între toate aplicațiile din ecosistemul ROA2WEB, integrat cu Oracle Database și optimizat pentru aplicații FastAPI. - -## 📋 Table of Contents - -- [Features](#features) -- [Architecture](#architecture) -- [Quick Start](#quick-start) -- [Components](#components) -- [Integration Guide](#integration-guide) -- [Security Features](#security-features) -- [API Reference](#api-reference) -- [Testing](#testing) -- [Deployment](#deployment) -- [Troubleshooting](#troubleshooting) - -## ✨ Features - -### Core Features -- **JWT Authentication**: Secure token-based authentication cu access și refresh tokens -- **Oracle Database Integration**: Folosește `pack_drepturi.verificautilizator` pentru autentificare -- **Multi-Company Support**: Acces controlat la multiple firme/schemas Oracle -- **Permission System**: Sistem granular de permisiuni (read, write, admin, reports) -- **FastAPI Integration**: Dependencies și middleware native pentru FastAPI -- **Rate Limiting**: Protecție împotriva brute force attacks -- **Caching**: Cache inteligent pentru performanță optimă - -### Security Features -- **Token Expiration**: Configurabil pentru access și refresh tokens -- **SQL Injection Protection**: Parametri legați în toate query-urile -- **Rate Limiting**: Configurabil per IP și endpoint -- **CORS Protection**: Configurare flexibilă pentru origins -- **Header Security**: Security headers automate -- **Token Blacklisting**: Suport pentru invalidarea token-urilor (în dezvoltare) - -## 🏗️ Architecture - -``` -ROA2WEB Authentication Flow: -┌─────────────┐ ┌──────────────┐ ┌─────────────┐ ┌──────────────┐ -│ Client │───▶│ FastAPI │───▶│ JWT │───▶│ Oracle │ -│ (Frontend) │ │ Application │ │ Handler │ │ Database │ -└─────────────┘ └──────────────┘ └─────────────┘ └──────────────┘ - │ │ │ - ▼ ▼ ▼ - ┌──────────────┐ ┌─────────────┐ ┌──────────────┐ - │ Auth Service │ │ Middleware │ │ User Cache │ - └──────────────┘ └─────────────┘ └──────────────┘ -``` - -### Components Overview - -``` -shared/auth/ -├── jwt_handler.py # JWT token creation și validation -├── auth_service.py # Oracle database integration -├── models.py # Pydantic models pentru data validation -├── middleware.py # FastAPI middleware pentru auto-authentication -├── dependencies.py # FastAPI dependencies pentru protected routes -├── routes.py # Pre-built authentication routes -├── test_auth.py # Comprehensive test suite -├── demo_app.py # Demo application cu examples -└── README.md # Această documentație -``` - -## 🚀 Quick Start - -### 1. Environment Setup - -```bash -# Copy și configurează environment variables -cp .env.example .env - -# Edit .env cu configurările tale -JWT_SECRET_KEY=your-super-secret-jwt-key-change-in-production -ORACLE_USER=your_oracle_username -ORACLE_PASSWORD=your_oracle_password -ORACLE_DSN=your_oracle_connection_string -``` - -### 2. Basic Integration - -```python -from fastapi import FastAPI, Depends -from roa2web.shared.auth import ( - AuthenticationMiddleware, create_auth_router, - get_current_user, CurrentUser -) -from roa2web.shared.database import oracle_pool - -app = FastAPI(title="My ROA2WEB App") - -# Add authentication middleware -app.add_middleware( - AuthenticationMiddleware, - excluded_paths=["/", "/docs", "/health", "/auth/login"] -) - -# Include authentication routes -auth_router = create_auth_router() -app.include_router(auth_router) - -@app.on_event("startup") -async def startup(): - await oracle_pool.initialize() - -@app.get("/protected") -async def protected_endpoint( - current_user: CurrentUser = Depends(get_current_user) -): - return {"message": f"Hello {current_user.username}!"} -``` - -### 3. Test Authentication - -```bash -# Start demo application -cd roa2web/shared/auth -python demo_app.py - -# Open browser -open http://localhost:8000/docs - -# Login prin Swagger UI cu credențialele Oracle -``` - -## 🧩 Components - -### JWT Handler (`jwt_handler.py`) - -Gestionează crearea, validarea și refresh-ul token-urilor JWT. - -```python -from roa2web.shared.auth import jwt_handler - -# Create access token -token = jwt_handler.create_access_token( - username="admin", - companies=["COMP1", "COMP2"], - permissions=["read", "write", "reports"] -) - -# Verify token -token_data = jwt_handler.verify_token(token) -if token_data: - print(f"Valid token for user: {token_data.username}") -``` - -### Auth Service (`auth_service.py`) - -Integrează cu Oracle Database pentru autentificare și management utilizatori. - -```python -from roa2web.shared.auth import auth_service - -# Authenticate user -success, token_response, error = await auth_service.authenticate_and_create_tokens( - "username", "password" -) - -if success: - print(f"Access token: {token_response.access_token}") -else: - print(f"Authentication failed: {error}") -``` - -### FastAPI Dependencies (`dependencies.py`) - -Oferă dependencies pentru protejarea endpoint-urilor. - -```python -from fastapi import Depends -from roa2web.shared.auth import ( - get_current_user, require_company_access, - require_permissions, PermissionType -) - -@app.get("/admin-only") -async def admin_endpoint( - user: CurrentUser = Depends(require_permissions([PermissionType.ADMIN])) -): - return {"message": "Admin access granted"} - -@app.get("/company/{company_code}/data") -async def company_data( - company_code: str, - user: CurrentUser = Depends(require_company_access(company_code)) -): - return {"company": company_code, "data": "..."} -``` - -### Authentication Routes (`routes.py`) - -Pre-built routes pentru operații de autentificare. - -```python -from roa2web.shared.auth import create_auth_router - -# Basic auth router -auth_router = create_auth_router() -app.include_router(auth_router) - -# Auth router cu admin routes -auth_router_admin = create_auth_router(include_admin_routes=True) -app.include_router(auth_router_admin) -``` - -Available routes: -- `POST /auth/login` - User authentication -- `POST /auth/refresh` - Token refresh -- `POST /auth/logout` - User logout -- `GET /auth/me` - Current user info -- `GET /auth/companies` - User companies -- `GET /auth/status` - Authentication status - -## 🔧 Integration Guide - -### Full FastAPI Application - -```python -from fastapi import FastAPI, Depends, HTTPException -from fastapi.middleware.cors import CORSMiddleware -from contextlib import asynccontextmanager - -from roa2web.shared.auth import ( - AuthenticationMiddleware, create_auth_router, - get_current_user, require_company_access, - CurrentUser, PermissionType -) -from roa2web.shared.database import oracle_pool - -@asynccontextmanager -async def lifespan(app: FastAPI): - # Startup - await oracle_pool.initialize() - yield - # Shutdown - await oracle_pool.close_pool() - -app = FastAPI( - title="ROA2WEB Application", - lifespan=lifespan -) - -# CORS -app.add_middleware( - CORSMiddleware, - allow_origins=["http://localhost:3000"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - -# Authentication -app.add_middleware( - AuthenticationMiddleware, - excluded_paths=["/", "/docs", "/health"], - rate_limit_paths=["/auth/login"] -) - -# Routes -auth_router = create_auth_router() -app.include_router(auth_router) - -# Protected endpoints -@app.get("/") -async def public_endpoint(): - return {"message": "Public endpoint"} - -@app.get("/me") -async def my_info(current_user: CurrentUser = Depends(get_current_user)): - return current_user - -@app.get("/company/{company_code}/invoices") -async def get_invoices( - company_code: str, - current_user: CurrentUser = Depends(require_company_access(company_code)) -): - # Business logic here - return {"company": company_code, "invoices": []} -``` - -### Custom Permissions - -```python -from roa2web.shared.auth import require_permissions, PermissionType - -# Define custom permissions -class CustomPermissionType(str, Enum): - INVOICE_READ = "invoice_read" - INVOICE_WRITE = "invoice_write" - REPORT_EXPORT = "report_export" - -# Use in endpoints -@app.get("/invoices") -async def get_invoices( - user: CurrentUser = Depends(require_permissions([CustomPermissionType.INVOICE_READ])) -): - return {"invoices": []} -``` - -### Company-Specific Endpoints - -```python -from fastapi import Header -from roa2web.shared.auth import get_current_company_from_header - -@app.get("/current-company-data") -async def get_current_company_data( - company_code: str = Depends(get_current_company_from_header), - current_user: CurrentUser = Depends(get_current_user) -): - # company_code is automatically extracted from X-Company-Code header - # and validated against user's accessible companies - return {"company": company_code, "data": "..."} -``` - -## 🔒 Security Features - -### JWT Configuration - -```python -# Environment variables -JWT_SECRET_KEY=your-super-secret-jwt-key-change-in-production -JWT_ALGORITHM=HS256 -ACCESS_TOKEN_EXPIRE_MINUTES=30 -REFRESH_TOKEN_EXPIRE_DAYS=7 -``` - -### Rate Limiting - -```python -from roa2web.shared.auth import RateLimiter, AuthenticationMiddleware - -# Custom rate limiter -custom_rate_limiter = RateLimiter( - max_requests=10, # 10 requests - time_window=60 # per minute -) - -app.add_middleware( - AuthenticationMiddleware, - rate_limit_paths=["/auth/login", "/auth/register"], - rate_limiter=custom_rate_limiter -) -``` - -### Security Headers - -Middleware-ul adaugă automat header-e de securitate: - -``` -X-Content-Type-Options: nosniff -X-Frame-Options: DENY -X-XSS-Protection: 1; mode=block -``` - -## 📚 API Reference - -### JWT Handler Methods - -```python -class JWTHandler: - def create_access_token(username, companies, user_id=None, permissions=None) -> str - def create_refresh_token(username, user_id=None) -> str - def verify_token(token) -> Optional[TokenData] - def refresh_access_token(refresh_token, companies, permissions=None) -> Optional[str] - def create_token_response(username, companies, ...) -> TokenResponse -``` - -### Auth Service Methods - -```python -class UserAuthService: - async def verify_user_credentials(username, password) -> bool - async def get_user_companies(username) -> List[str] - async def get_user_permissions(username, company) -> List[str] - async def authenticate_and_create_tokens(username, password) -> Tuple[bool, TokenResponse, str] - async def validate_user_company_access(username, company) -> bool -``` - -### FastAPI Dependencies - -```python -# User dependencies -get_current_user() -> CurrentUser -get_optional_user() -> Optional[CurrentUser] - -# Permission dependencies -require_permissions(permissions: List[PermissionType]) -require_company_access(company_code: str) -require_company_and_permissions(company_code: str, permissions: List[PermissionType]) - -# Utility dependencies -get_current_company_from_header() -> str -``` - -## 🧪 Testing - -### Running Tests - -```bash -# Install test dependencies -pip install pytest pytest-asyncio httpx - -# Run all tests -cd roa2web/shared/auth -python -m pytest test_auth.py -v - -# Run specific test categories -python -m pytest test_auth.py::TestJWTHandler -v -python -m pytest test_auth.py::TestUserAuthService -v -python -m pytest test_auth.py::TestSecurityFeatures -v - -# Run with coverage -python -m pytest test_auth.py --cov=. --cov-report=html -``` - -### Test Categories - -- **Unit Tests**: JWT operations, auth service methods -- **Integration Tests**: Database integration, full auth flow -- **Security Tests**: Token tampering, SQL injection, rate limiting -- **Performance Tests**: Token creation/verification speed - -### Demo Application - -```bash -# Start demo app for manual testing -cd roa2web/shared/auth -python demo_app.py - -# Available demo endpoints: -# http://localhost:8000/ - Home page cu documentație -# http://localhost:8000/docs - Swagger UI pentru testare -# http://localhost:8000/demo/* - Various demo endpoints -``` - -## 🚀 Deployment - -### Production Configuration - -```bash -# Strong JWT secret key -JWT_SECRET_KEY=$(python -c "import secrets; print(secrets.token_urlsafe(32))") - -# Shorter token expiration -ACCESS_TOKEN_EXPIRE_MINUTES=15 -REFRESH_TOKEN_EXPIRE_DAYS=1 - -# Strict rate limiting -RATE_LIMIT_MAX_REQUESTS=3 -RATE_LIMIT_TIME_WINDOW=300 - -# Secure headers -SECURE_SSL_REDIRECT=true -SESSION_COOKIE_SECURE=true -``` - -### Docker Integration - -```dockerfile -# În Dockerfile-ul aplicației -FROM python:3.11-slim - -WORKDIR /app -COPY requirements.txt . -RUN pip install -r requirements.txt - -COPY . . - -# Environment pentru container -ENV JWT_SECRET_KEY=${JWT_SECRET_KEY} -ENV ORACLE_USER=${ORACLE_USER} -ENV ORACLE_PASSWORD=${ORACLE_PASSWORD} -ENV ORACLE_DSN=${ORACLE_DSN} - -CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"] -``` - -### Health Checks - -```python -@app.get("/health") -async def health_check(): - # Test database connection - try: - async with oracle_pool.get_connection() as conn: - with conn.cursor() as cursor: - cursor.execute("SELECT 1 FROM DUAL") - db_status = "healthy" - except Exception as e: - db_status = f"error: {str(e)}" - - return { - "status": "healthy" if db_status == "healthy" else "degraded", - "database": db_status, - "jwt": "functional", - "timestamp": datetime.now().isoformat() - } -``` - -## 🔧 Troubleshooting - -### Common Issues - -#### 1. "Invalid token" errors - -```python -# Check JWT secret key consistency -print(f"JWT Secret: {os.getenv('JWT_SECRET_KEY')}") - -# Verify token creation and validation -token = jwt_handler.create_access_token("test", ["COMP1"]) -token_data = jwt_handler.verify_token(token) -print(f"Token valid: {token_data is not None}") -``` - -#### 2. Database connection errors - -```python -# Test Oracle connection -try: - async with oracle_pool.get_connection() as conn: - with conn.cursor() as cursor: - cursor.execute("SELECT 1 FROM DUAL") - result = cursor.fetchone() - print("Database connection: OK") -except Exception as e: - print(f"Database error: {e}") -``` - -#### 3. Rate limiting issues - -```python -# Check rate limiter stats -from roa2web.shared.auth import default_rate_limiter - -client_ip = "192.168.1.1" -allowed = default_rate_limiter.is_allowed(client_ip) -reset_time = default_rate_limiter.get_reset_time(client_ip) -print(f"IP {client_ip} allowed: {allowed}, resets at: {reset_time}") -``` - -#### 4. Permission denied errors - -```python -# Check user companies and permissions -companies = await auth_service.get_user_companies("username") -permissions = await auth_service.get_user_permissions("username", "COMP1") -print(f"User companies: {companies}") -print(f"User permissions: {permissions}") -``` - -### Debug Mode - -```python -import logging - -# Enable debug logging -logging.basicConfig(level=logging.DEBUG) - -# Specific loggers -logging.getLogger("roa2web.shared.auth").setLevel(logging.DEBUG) -``` - -### Environment Validation - -```python -from roa2web.shared.utils.config import shared_config - -# Validate configuration -print(f"Oracle User: {shared_config.oracle_user}") -print(f"JWT Secret set: {'***' if shared_config.jwt_secret_key else 'NOT SET'}") -print(f"Token expiry: {shared_config.access_token_expire_minutes} minutes") -``` - -## 📈 Performance Optimization - -### Caching - -```python -# Cache configuration -AUTH_CACHE_TTL_MINUTES=15 # User data cache TTL - -# Monitor cache performance -stats = auth_service.get_cache_stats() -print(f"Cache hit ratio: {stats['cache_hit_ratio']:.2%}") -``` - -### Connection Pooling - -```python -# Oracle pool configuration -DB_MIN_CONNECTIONS=2 -DB_MAX_CONNECTIONS=10 -DB_CONNECTION_INCREMENT=1 -``` - -### Token Optimization - -```python -# Optimize token size by limiting payload -token = jwt_handler.create_access_token( - username="user", - companies=["COMP1"], # Limit companies in token - permissions=["read"] # Essential permissions only -) -``` - -## 🤝 Contributing - -Pentru contribuții la sistemul de autentificare: - -1. **Fork repository-ul** și creează o ramură pentru feature -2. **Implementează schimbările** cu tests comprehensive -3. **Rulează toate testele** pentru a verifica compatibilitatea -4. **Actualizează documentația** dacă este necesar -5. **Creează Pull Request** cu descriere detaliată - -### Development Setup - -```bash -# Clone repository -git clone [repository-url] -cd roa-flask - -# Setup environment -python -m venv venv -source venv/bin/activate # Linux/Mac -# or -venv\Scripts\activate # Windows - -pip install -r requirements.txt - -# Run tests -cd roa2web/shared/auth -python -m pytest test_auth.py -v -``` - -## 📜 License - -Acest sistem de autentificare face parte din proiectul ROA2WEB și este disponibil sub aceleași condiții de licențiere ca și proiectul principal. - ---- - -**ROA2WEB Authentication System v1.0.0** -*Secure, scalable, Oracle-integrated authentication pentru aplicații moderne* \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/auth/__init__.py b/deploy-package-20260223-151231/shared/auth/__init__.py deleted file mode 100644 index 05979fd..0000000 --- a/deploy-package-20260223-151231/shared/auth/__init__.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -ROA2WEB Shared Authentication Module - -This module provides JWT-based authentication functionality that can be shared -across all ROA2WEB microservices. - -Components: -- jwt_handler: JWT token creation, validation, and refresh -- auth_service: Oracle database authentication integration -- middleware: FastAPI middleware for token validation -- dependencies: FastAPI dependencies for protected routes -- models: Pydantic models for authentication data -- routes: Template authentication routes for FastAPI apps -""" - -from .jwt_handler import jwt_handler, JWTHandler, TokenData, TokenResponse - -__all__ = [ - 'jwt_handler', - 'JWTHandler', - 'TokenData', - 'TokenResponse' -] \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/auth/auth_service.py b/deploy-package-20260223-151231/shared/auth/auth_service.py deleted file mode 100644 index 559773a..0000000 --- a/deploy-package-20260223-151231/shared/auth/auth_service.py +++ /dev/null @@ -1,476 +0,0 @@ -""" -Authentication Service - Oracle Database Integration pentru ROA2WEB - -Acest modul integrează sistemul de autentificare JWT cu baza de date Oracle, -reutilizând funcționalitatea existentă din aplicația Flask originală. - -Funcționalități: -- Verificare utilizatori prin pack_drepturi.verificautilizator -- Obținere lista firmelor din vdef_util_grup -- Gestionarea sesiunilor și permisiunilor utilizatorilor -- Caching pentru performanță optimă -""" - -import logging -import hashlib -from typing import Optional, List, Dict, Any, Tuple -from datetime import datetime, timedelta -import asyncio -from contextlib import asynccontextmanager - -# Import shared database pool -# IMPORTANT: Use shared.database.oracle_pool to ensure singleton consistency -# DO NOT use relative imports like 'database.oracle_pool' -from shared.database.oracle_pool import oracle_pool -from .jwt_handler import jwt_handler -from .models import TokenResponse, CurrentUser - -logger = logging.getLogger(__name__) - - -class AuthenticationError(Exception): - """Excepție pentru erorile de autentificare""" - pass - - -class UserAuthService: - """ - Serviciu pentru autentificarea utilizatorilor folosind Oracle Database - - Acest serviciu integrează: - - Verificarea credențialelor prin pack_drepturi.verificautilizator - - Obținerea listei de firme prin vdef_util_grup - - Generarea token-urilor JWT - - Cache pentru performanță - """ - - def __init__(self): - """Inițializează serviciul de autentificare""" - self._user_cache: Dict[str, Dict[str, Any]] = {} - self._cache_ttl = timedelta(minutes=15) # Cache 15 minute - - def _get_cache_key(self, username: str) -> str: - """Generează cheia de cache pentru utilizator""" - return f"auth_user_{username.lower()}" - - def _is_cache_valid(self, cache_entry: Dict[str, Any]) -> bool: - """Verifică dacă entry-ul din cache este încă valid""" - if not cache_entry or 'timestamp' not in cache_entry: - return False - - cache_time = cache_entry['timestamp'] - return datetime.now() - cache_time < self._cache_ttl - - def _get_cached_user_data(self, username: str) -> Optional[Dict[str, Any]]: - """Obține datele utilizatorului din cache dacă sunt valide""" - cache_key = self._get_cache_key(username) - cache_entry = self._user_cache.get(cache_key) - - if self._is_cache_valid(cache_entry): - logger.debug(f"Cache hit for user {username}") - return cache_entry['data'] - - return None - - def _cache_user_data(self, username: str, data: Dict[str, Any]) -> None: - """Salvează datele utilizatorului în cache""" - cache_key = self._get_cache_key(username) - self._user_cache[cache_key] = { - 'data': data, - 'timestamp': datetime.now() - } - logger.debug(f"Cached data for user {username}") - - async def get_username_by_email( - self, - email: str, - server_id: Optional[str] = None - ) -> Optional[str]: - """ - Obține username-ul Oracle corespunzător unui email. - - Necesar pentru login cu email - convertește email-ul în username-ul - real din tabelul UTILIZATORI pentru autentificare cu pack_drepturi. - - Args: - email: Email-ul utilizatorului - server_id: ID-ul serverului Oracle (pentru multi-server mode) - - Returns: - Username-ul Oracle sau None dacă email-ul nu există - """ - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - cursor.execute(""" - SELECT UTILIZATOR - FROM CONTAFIN_ORACLE.UTILIZATORI - WHERE LOWER(EMAIL) = :email - AND INACTIV = 0 - AND STERS = 0 - """, {'email': email.lower().strip()}) - - row = cursor.fetchone() - if row: - username = row[0] - logger.info(f"Resolved email '{email}' to username '{username}' on server '{server_id}'") - return username - else: - logger.warning(f"No username found for email '{email}' on server '{server_id}'") - return None - - except Exception as e: - logger.error(f"Database error resolving email '{email}' to username: {str(e)}") - return None - - async def verify_user_credentials( - self, - username: str, - password: str, - server_id: Optional[str] = None - ) -> bool: - """ - Verifică credențialele utilizatorului folosind pack_drepturi.verificautilizator - - Args: - username: Numele utilizatorului - password: Parola utilizatorului - server_id: ID-ul serverului Oracle (opțional, pentru multi-server mode) - - Returns: - True dacă credențialele sunt corecte, False altfel - - Raises: - AuthenticationError: Dacă apar erori în procesul de verificare - """ - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - # Apelarea procedurii pack_drepturi.verificautilizator - # Această procedură returnează ID-ul utilizatorului cu checksum pentru succes, -1 pentru eșec - cursor.execute(""" - SELECT pack_drepturi.verificautilizator(:username, :password) - FROM DUAL - """, { - 'username': username.upper(), - 'password': password - }) - - result = cursor.fetchone() - verification_result = result[0] if result else -1 - - # DEBUG: Log the exact result from Oracle - logger.info(f"[DEBUG] verificautilizator('{username.upper()}', '***') on server '{server_id}' = {verification_result}") - - # Interpretarea rezultatului conform logicii VFP: - # -1 = invalid credentials - # > 0 = valid user ID with checksum - # < -1000000 = admin/super user - is_valid = verification_result != -1 - - if is_valid: - # Extrage ID-ul real al utilizatorului conform logicii VFP - if verification_result < -1000000: - # Admin/Super user - user_id = verification_result + 1000000 - logger.info(f"Admin/Super user {username} authenticated successfully (ID: {user_id})") - else: - # User normal - extrage ID-ul din checksum - user_id = int(verification_result / 100) - logger.info(f"User {username} authenticated successfully (ID: {user_id}, verification: {verification_result})") - else: - logger.warning(f"Authentication failed for user {username}") - - return is_valid - - except Exception as e: - logger.error(f"Database error during authentication for user {username}: {str(e)}") - raise AuthenticationError(f"Database authentication error: {str(e)}") - - async def get_user_companies( - self, - username: str, - server_id: Optional[str] = None - ) -> List[str]: - """ - Obține lista firmelor la care utilizatorul are acces din V_NOM_FIRME - folosind ID-ul utilizatorului din UTILIZATORI - - Args: - username: Numele utilizatorului - server_id: ID-ul serverului Oracle (opțional, pentru multi-server mode) - - Returns: - Lista codurilor firmelor la care utilizatorul are acces - - Raises: - AuthenticationError: Dacă apar erori în procesul de obținere - """ - # Verifică cache-ul mai întâi (include server_id în cheie pentru multi-server) - cache_key_suffix = f"_{server_id}" if server_id else "" - cached_data = self._get_cached_user_data(f"{username}{cache_key_suffix}") - if cached_data and 'companies' in cached_data: - return cached_data['companies'] - - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - try: - # Debug: să vedem ce utilizatori există în tabela UTILIZATORI - cursor.execute(""" - SELECT ID_UTIL, UTILIZATOR - FROM UTILIZATORI - WHERE UPPER(UTILIZATOR) LIKE '%MARIUS%' - ORDER BY UTILIZATOR - """) - - debug_users = cursor.fetchall() - logger.info(f"DEBUG: Users with MARIUS in name: {debug_users}") - - # Primul pas: obținem ID-ul utilizatorului din UTILIZATORI - cursor.execute(""" - SELECT ID_UTIL, UTILIZATOR - FROM UTILIZATORI - WHERE UPPER(UTILIZATOR) = :username - """, {'username': username.upper()}) - - user_row = cursor.fetchone() - if not user_row: - logger.warning(f"User {username} not found in UTILIZATORI table") - # Să încercăm să găsim utilizatori similari - cursor.execute(""" - SELECT ID_UTIL, UTILIZATOR - FROM UTILIZATORI - WHERE UPPER(UTILIZATOR) LIKE :username_pattern - ORDER BY UTILIZATOR - """, {'username_pattern': f'%{username.upper()}%'}) - similar_users = cursor.fetchall() - logger.info(f"Similar users found: {similar_users}") - return [] - - user_id = user_row[0] - actual_name = user_row[1] - logger.info(f"Found user {username} with ID: {user_id}, actual name: {actual_name}") - - # Al doilea pas: obținem firmele folosind query-ul corect (cu ID_FIRMA) - cursor.execute(""" - SELECT A.ID_FIRMA, A.FIRMA - FROM V_NOM_FIRME A - WHERE A.ID_FIRMA IN ( - SELECT ID_FIRMA - FROM VDEF_UTIL_FIRME - WHERE ID_PROGRAM = 2 - AND ID_UTIL = :user_id - ) - ORDER BY A.FIRMA - """, {'user_id': user_id}) - - companies_rows = cursor.fetchall() - companies = [str(row[0]) for row in companies_rows if row[0]] - - if not companies: - logger.warning(f"No companies found for user {username} (ID: {user_id})") - return [] - - logger.info(f"User {username} has access to {len(companies)} companies: {companies}") - - except Exception as e: - logger.error(f"Could not query companies for user {username}: {e}") - # În caz de eroare, returnăm listă goală în loc de TEST_COMPANY - return [] - - # Cache rezultatul (include server_id pentru multi-server) - cache_key = f"{username}{cache_key_suffix}" - self._cache_user_data(cache_key, {'companies': companies}) - - return companies - - except Exception as e: - logger.error(f"Database error getting companies for user {username}: {str(e)}") - raise AuthenticationError(f"Error retrieving user companies: {str(e)}") - - async def get_user_permissions( - self, - username: str, - company: str, - server_id: Optional[str] = None - ) -> List[str]: - """ - Obține permisiunile utilizatorului pentru o anumită firmă - - Args: - username: Numele utilizatorului - company: Codul firmei - server_id: ID-ul serverului Oracle (pentru multi-server mode) - - Returns: - Lista permisiunilor pentru firma specificată - """ - # Implementare de bază - poate fi extinsă în viitor - companies = await self.get_user_companies(username, server_id) - - # Dacă nu există companii sau compania nu este în listă, returnează permisiuni minime - if not companies or company not in companies: - return ["read"] if not companies else [] - - # Pentru moment, toți utilizatorii autentificați au permisiuni de citire - # Acest sistem poate fi extins cu permisiuni granulare în viitor - return ["read", "reports"] - - async def authenticate_and_create_tokens( - self, - username: str, - password: str, - server_id: Optional[str] = None - ) -> Tuple[bool, Optional[TokenResponse], Optional[str]]: - """ - Autentifică utilizatorul și creează token-urile JWT - - Suportă atât username clasic cât și email pentru login. - Dacă input-ul conține '@', se tratează ca email și se convertește - în username-ul Oracle corespunzător. - - Args: - username: Numele utilizatorului sau email-ul - password: Parola utilizatorului - server_id: ID-ul serverului Oracle (opțional, pentru multi-server mode) - - Returns: - Tuple cu (success, token_response, error_message) - """ - try: - # Detectăm dacă input-ul este email sau username clasic - actual_username = username - if '@' in username: - # Este email - convertim în username Oracle - resolved_username = await self.get_username_by_email(username, server_id) - if not resolved_username: - logger.warning(f"Could not resolve email '{username}' to username on server '{server_id}'") - return False, None, "Invalid username or password" - actual_username = resolved_username - logger.info(f"Login with email '{username}' resolved to username '{actual_username}'") - - # Verifică credențialele pe serverul specificat - is_valid = await self.verify_user_credentials(actual_username, password, server_id) - - if not is_valid: - return False, None, "Invalid username or password" - - # Obține firmele utilizatorului de pe serverul specificat - companies = await self.get_user_companies(actual_username, server_id) - - # Nu blocăm login-ul dacă utilizatorul nu are firme - îl lăsăm să vadă mesajul în frontend - if not companies: - logger.info(f"User {actual_username} has no companies assigned - allowing login but with empty companies list") - - # Obține permisiunile (pentru prima firmă ca default sau lista goală) - permissions = await self.get_user_permissions(actual_username, companies[0] if companies else "", server_id) - - # Creează token-urile folosind jwt_handler - # Include server_id în JWT pentru ca request-urile ulterioare să știe pe care server să execute query-uri - jwt_tokens = jwt_handler.create_token_response( - username=actual_username, - companies=companies, - user_id=None, # Poate fi adăugat în viitor dacă avem user_id în DB - permissions=permissions, - server_id=server_id - ) - - # Creează obiectul CurrentUser - current_user = CurrentUser( - username=actual_username, - user_id=None, - companies=companies, - permissions=permissions - ) - - # Creează TokenResponse-ul complet cu user info - token_response = TokenResponse( - access_token=jwt_tokens.access_token, - refresh_token=jwt_tokens.refresh_token, - token_type=jwt_tokens.token_type, - expires_in=jwt_tokens.expires_in, - user=current_user - ) - - logger.info(f"Successfully created tokens for user {actual_username} on server {server_id or 'default'}") - return True, token_response, None - - except AuthenticationError as e: - logger.error(f"Authentication error for user {username}: {str(e)}") - return False, None, str(e) - except Exception as e: - logger.error(f"Unexpected error during authentication for user {username}: {str(e)}") - return False, None, "Internal authentication error" - - async def validate_user_company_access(self, username: str, company: str) -> bool: - """ - Validează dacă utilizatorul are acces la o anumită firmă - - Args: - username: Numele utilizatorului - company: Codul firmei de verificat - - Returns: - True dacă utilizatorul are acces, False altfel - """ - try: - companies = await self.get_user_companies(username) - has_access = company in companies - - if not has_access: - logger.warning(f"User {username} attempted to access unauthorized company {company}") - - return has_access - - except Exception as e: - logger.error(f"Error validating company access for user {username}: {str(e)}") - return False - - async def refresh_user_data(self, username: str) -> bool: - """ - Reîmprospătează datele utilizatorului din cache - - Args: - username: Numele utilizatorului - - Returns: - True dacă refresh-ul a fost cu succes - """ - try: - # Șterge din cache - cache_key = self._get_cache_key(username) - if cache_key in self._user_cache: - del self._user_cache[cache_key] - - # Reîncarcă datele - await self.get_user_companies(username) - logger.info(f"Refreshed user data for {username}") - return True - - except Exception as e: - logger.error(f"Error refreshing user data for {username}: {str(e)}") - return False - - def clear_cache(self) -> None: - """Șterge tot cache-ul utilizatorilor""" - self._user_cache.clear() - logger.info("User cache cleared") - - def get_cache_stats(self) -> Dict[str, Any]: - """Returnează statistici despre cache""" - total_entries = len(self._user_cache) - valid_entries = sum( - 1 for entry in self._user_cache.values() - if self._is_cache_valid(entry) - ) - - return { - 'total_entries': total_entries, - 'valid_entries': valid_entries, - 'cache_hit_ratio': valid_entries / total_entries if total_entries > 0 else 0 - } - - -# Instance globală pentru folosire în toate aplicațiile -auth_service = UserAuthService() \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/auth/demo_app.py b/deploy-package-20260223-151231/shared/auth/demo_app.py deleted file mode 100644 index 829ba1b..0000000 --- a/deploy-package-20260223-151231/shared/auth/demo_app.py +++ /dev/null @@ -1,540 +0,0 @@ -""" -FastAPI Demo App demonstrând sistemul de autentificare ROA2WEB - -Această aplicație demonstrează integrarea completă a sistemului de autentificare: -- Login și logout cu Oracle database -- Protected routes cu JWT authentication -- Company-specific access control -- Permission-based authorization -- Rate limiting și security features - -Funcționează ca: -1. Exemplu de integrare pentru dezvoltatori -2. Tool de testare pentru sistemul de autentificare -3. Demonstrație pentru managementul proiectului - -Pentru a rula demo-ul: -1. Configurează variabilele de mediu în .env -2. Asigură-te că Oracle database este accesibil -3. Rulează: python demo_app.py -4. Acesează http://localhost:8000/docs pentru Swagger UI -""" - -import asyncio -import logging -import sys -import os -from datetime import datetime -from typing import List, Optional - -import uvicorn -from fastapi import FastAPI, Depends, HTTPException, Request, status -from fastapi.middleware.cors import CORSMiddleware -from fastapi.responses import HTMLResponse, JSONResponse -from contextlib import asynccontextmanager - -# Adaugă calea pentru modulele shared -sys.path.append(os.path.join(os.path.dirname(__file__), '..')) - -# Import modulele de autentificare -from .jwt_handler import jwt_handler -from .auth_service import auth_service -from .models import CurrentUser, LoginRequest, PermissionType -from .routes import create_auth_router -from .middleware import AuthenticationMiddleware, default_rate_limiter -from .dependencies import ( - get_current_user, get_optional_user, require_company_access, - require_permissions, get_current_company_from_header -) - -# Import componente shared -from database.oracle_pool import oracle_pool -from utils.config import shared_config - -# Configurare logging -logging.basicConfig( - level=logging.INFO, - format='%(asctime)s - %(name)s - %(levelname)s - %(message)s' -) -logger = logging.getLogger(__name__) - - -@asynccontextmanager -async def lifespan(app: FastAPI): - """ - Lifecycle events pentru demo app - """ - # Startup - logger.info("🚀 Starting ROA2WEB Authentication Demo") - - try: - # Inițializează Oracle pool - await oracle_pool.initialize( - user=shared_config.oracle_user, - password=shared_config.oracle_password, - dsn=shared_config.oracle_dsn, - min_connections=2, - max_connections=5 - ) - logger.info("✅ Oracle connection pool initialized") - - # Test database connection - async with oracle_pool.get_connection() as conn: - with conn.cursor() as cursor: - cursor.execute("SELECT 'Database connected successfully' FROM DUAL") - result = cursor.fetchone() - logger.info(f"✅ Database test: {result[0]}") - - except Exception as e: - logger.error(f"❌ Startup error: {str(e)}") - logger.warning("Demo will continue but database features may not work") - - yield - - # Shutdown - logger.info("🛑 Shutting down ROA2WEB Authentication Demo") - try: - await oracle_pool.close_pool() - logger.info("✅ Oracle connection pool closed") - except Exception as e: - logger.error(f"❌ Shutdown error: {str(e)}") - - -# Crearea aplicației FastAPI -app = FastAPI( - title="ROA2WEB Authentication Demo", - description=""" - Demonstrație completă a sistemului de autentificare ROA2WEB - - Această aplicație demonstrează: - - JWT Authentication cu Oracle Database - - Protected routes și company access control - - Permission-based authorization - - Rate limiting și security features - - Integration patterns pentru aplicații ROA2WEB - """, - version="1.0.0", - docs_url="/docs", - redoc_url="/redoc", - lifespan=lifespan -) - -# CORS pentru development -app.add_middleware( - CORSMiddleware, - allow_origins=["http://localhost:3000", "http://localhost:5173", "http://localhost:8080"], - allow_credentials=True, - allow_methods=["*"], - allow_headers=["*"], -) - -# Authentication middleware -app.add_middleware( - AuthenticationMiddleware, - excluded_paths=["/", "/docs", "/redoc", "/openapi.json", "/health", "/demo", "/auth/login"], - rate_limit_paths=["/auth/login"], - rate_limiter=default_rate_limiter -) - -# Include authentication router -auth_router = create_auth_router(include_admin_routes=True) -app.include_router(auth_router) - - -# ============================================================================= -# DEMO ENDPOINTS -# ============================================================================= - -@app.get("/", response_class=HTMLResponse) -async def demo_home(): - """ - Pagina principală cu informații despre demo - """ - html_content = """ - - - - ROA2WEB Authentication Demo - - - -
-

🔐 ROA2WEB Authentication Demo

- -
- Status: Demo aplicație ROA2WEB Authentication System
- Versiune: 1.0.0
- Timp: """ + datetime.now().strftime("%Y-%m-%d %H:%M:%S") + """ -
- -

📋 Endpoints Disponibile

- -
-
GET
- /docs - Swagger UI pentru testarea API-ului -
- -
-
GET
- /health - Health check pentru aplicație și database -
- -
-
POST
- /auth/login - Autentificare utilizator cu username/password -
- -
-
GET
- /auth/me - Informații utilizator curent (protejat) -
- -
-
GET
- /demo/protected - Endpoint protejat simplu -
- -
-
GET
- /demo/company/{company_code} - Endpoint cu verificare acces firmă -
- -
-
GET
- /demo/admin - Endpoint cu verificare admin permissions -
- -

🧪 Cum să testezi

- -
    -
  1. Accesează /docs pentru Swagger UI
  2. -
  3. Folosește POST /auth/login cu credențiale valide
  4. -
  5. Copiază access_token din răspuns
  6. -
  7. Click pe "Authorize" în Swagger UI și introdu: Bearer YOUR_TOKEN
  8. -
  9. Testează endpoint-urile protejate
  10. -
- -

🔧 Configurare

-

Pentru a funcționa complet, demo-ul necesită:

-
    -
  • Variabile de mediu configurate în .env
  • -
  • Conexiune la Oracle Database
  • -
  • Utilizatori valizi în sistemul Oracle
  • -
- -
- 💡 Tip: Pentru dezvoltare rapidă, vezi demo_app.py - pentru exemple de integrare a autentificării în aplicațiile tale FastAPI. -
-
- - - """ - return HTMLResponse(content=html_content) - - -@app.get("/health") -async def health_check(): - """ - Health check complet pentru demo - """ - health_status = { - "service": "ROA2WEB Authentication Demo", - "status": "healthy", - "timestamp": datetime.now().isoformat(), - "version": "1.0.0" - } - - # Test database connection - try: - async with oracle_pool.get_connection() as conn: - with conn.cursor() as cursor: - cursor.execute("SELECT 1 FROM DUAL") - cursor.fetchone() - health_status["database"] = "connected" - except Exception as e: - health_status["database"] = f"error: {str(e)}" - health_status["status"] = "degraded" - - # Test JWT handler - try: - test_token = jwt_handler.create_access_token("healthcheck", ["TEST"]) - token_data = jwt_handler.verify_token(test_token) - if token_data and token_data.username == "healthcheck": - health_status["jwt"] = "functional" - else: - health_status["jwt"] = "error: token verification failed" - health_status["status"] = "degraded" - except Exception as e: - health_status["jwt"] = f"error: {str(e)}" - health_status["status"] = "degraded" - - # Authentication service status - try: - cache_stats = auth_service.get_cache_stats() - health_status["auth_cache"] = { - "total_entries": cache_stats["total_entries"], - "cache_hit_ratio": cache_stats["cache_hit_ratio"] - } - except Exception as e: - health_status["auth_cache"] = f"error: {str(e)}" - - status_code = 200 if health_status["status"] == "healthy" else 503 - return JSONResponse(content=health_status, status_code=status_code) - - -@app.get("/demo/public") -async def demo_public_endpoint(): - """ - Endpoint public - nu necesită autentificare - """ - return { - "message": "Acesta este un endpoint public", - "authenticated": False, - "timestamp": datetime.now().isoformat(), - "info": "Acest endpoint poate fi accesat fără autentificare" - } - - -@app.get("/demo/optional-auth") -async def demo_optional_auth( - current_user: Optional[CurrentUser] = Depends(get_optional_user) -): - """ - Endpoint cu autentificare opțională - """ - if current_user: - return { - "message": f"Salut, {current_user.username}!", - "authenticated": True, - "user": current_user.username, - "companies": current_user.companies, - "timestamp": datetime.now().isoformat() - } - else: - return { - "message": "Acesta este un endpoint cu autentificare opțională", - "authenticated": False, - "timestamp": datetime.now().isoformat(), - "info": "Poți accesa și fără autentificare, dar cu token obții mai multe informații" - } - - -@app.get("/demo/protected") -async def demo_protected_endpoint( - current_user: CurrentUser = Depends(get_current_user) -): - """ - Endpoint protejat - necesită autentificare - """ - return { - "message": f"Bună ziua, {current_user.username}!", - "authenticated": True, - "user_info": { - "username": current_user.username, - "companies": current_user.companies, - "permissions": current_user.permissions, - "companies_count": len(current_user.companies) - }, - "timestamp": datetime.now().isoformat(), - "info": "Acest endpoint necesită JWT token valid pentru acces" - } - - -@app.get("/demo/company/{company_code}") -async def demo_company_specific_endpoint( - company_code: str, - current_user: CurrentUser = Depends(require_company_access("")) # Will be overridden -): - """ - Endpoint cu verificare acces la firmă specifică - - Demonstrează cum să verifici dacă utilizatorul are acces la o anumită firmă - """ - # Verificare manuală pentru demonstrație (în practică folosești dependency) - if company_code not in current_user.companies: - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, - detail=f"Nu aveți acces la firma {company_code}" - ) - - return { - "message": f"Acces permis la firma {company_code}", - "company_code": company_code, - "user": current_user.username, - "user_companies": current_user.companies, - "timestamp": datetime.now().isoformat(), - "info": "Utilizatorul are acces la această firmă" - } - - -@app.get("/demo/admin") -async def demo_admin_endpoint( - current_user: CurrentUser = Depends(require_permissions([PermissionType.ADMIN])) -): - """ - Endpoint cu verificare permisiuni admin - """ - return { - "message": f"Bună ziua, admin {current_user.username}!", - "admin_info": { - "username": current_user.username, - "permissions": current_user.permissions, - "companies": current_user.companies, - "admin_since": datetime.now().isoformat() - }, - "system_stats": { - "total_companies": len(current_user.companies), - "demo_version": "1.0.0", - "auth_system": "ROA2WEB JWT" - }, - "timestamp": datetime.now().isoformat(), - "info": "Acest endpoint necesită permisiuni de administrator" - } - - -@app.get("/demo/reports") -async def demo_reports_endpoint( - request: Request, - current_user: CurrentUser = Depends(require_permissions([PermissionType.REPORTS])) -): - """ - Endpoint pentru rapoarte - demonstrează integrarea cu header-ul Company - """ - # Obține company din header (X-Company-Code) sau folosește prima disponibilă - company_code = request.headers.get("X-Company-Code") - if not company_code: - company_code = current_user.companies[0] if current_user.companies else None - - if not company_code: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="Nu s-a specificat codul firmei (X-Company-Code header)" - ) - - if company_code not in current_user.companies: - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, - detail=f"Nu aveți acces la rapoartele firmei {company_code}" - ) - - # Simulează generarea unui raport - mock_report_data = { - "company_code": company_code, - "report_type": "demo_report", - "generated_by": current_user.username, - "generated_at": datetime.now().isoformat(), - "data": { - "total_invoices": 150, - "total_amount": 125000.50, - "paid_invoices": 120, - "outstanding_amount": 25000.00 - } - } - - return { - "message": f"Raport generat pentru firma {company_code}", - "report": mock_report_data, - "user_info": { - "username": current_user.username, - "permissions": current_user.permissions - }, - "info": "Acesta este un exemplu de endpoint pentru rapoarte cu verificare company access" - } - - -@app.get("/demo/rate-limited") -async def demo_rate_limited_endpoint(): - """ - Endpoint cu rate limiting pentru demonstrație - """ - return { - "message": "Acest endpoint are rate limiting aplicat", - "timestamp": datetime.now().isoformat(), - "info": "Încercați să faceți mai multe request-uri rapid pentru a vedea rate limiting-ul" - } - - -# ============================================================================= -# DEMO UTILITIES -# ============================================================================= - -@app.get("/demo/token-info") -async def demo_token_info( - request: Request, - current_user: CurrentUser = Depends(get_current_user) -): - """ - Endpoint pentru afișarea informațiilor despre token-ul curent - """ - # Extrage token-ul din header - auth_header = request.headers.get("Authorization", "") - if auth_header.startswith("Bearer "): - token = auth_header[7:] - - # Decodează token-ul pentru informații (fără verificare pentru demo) - payload = jwt_handler.decode_token_payload(token) - - return { - "message": "Informații despre token-ul curent", - "token_info": { - "user": current_user.username, - "companies": current_user.companies, - "permissions": current_user.permissions, - "token_type": payload.get("type") if payload else "unknown", - "issued_at": payload.get("iat") if payload else None, - "expires_at": payload.get("exp") if payload else None - }, - "timestamp": datetime.now().isoformat() - } - else: - return { - "error": "Nu s-a găsit token în header-ul Authorization" - } - - -# ============================================================================= -# MAIN EXECUTION -# ============================================================================= - -def main(): - """ - Funcția principală pentru rularea demo-ului - """ - print("🚀 Starting ROA2WEB Authentication Demo") - print("📋 Available endpoints:") - print(" • http://localhost:8000/ - Demo home page") - print(" • http://localhost:8000/docs - Swagger UI") - print(" • http://localhost:8000/health - Health check") - print(" • http://localhost:8000/demo/* - Demo endpoints") - print("") - print("💡 Pentru testare completă:") - print(" 1. Configurează .env cu credențialele Oracle") - print(" 2. Asigură-te că database-ul este accesibil") - print(" 3. Folosește /docs pentru testarea interactivă") - print("") - - uvicorn.run( - "demo_app:app", - host="0.0.0.0", - port=8000, - reload=True, - log_level="info" - ) - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/auth/dependencies.py b/deploy-package-20260223-151231/shared/auth/dependencies.py deleted file mode 100644 index bfbec15..0000000 --- a/deploy-package-20260223-151231/shared/auth/dependencies.py +++ /dev/null @@ -1,402 +0,0 @@ -""" -FastAPI Authentication Dependencies pentru ROA2WEB - -Acest modul oferă dependency functions pentru FastAPI care pot fi folosite -pentru a proteja endpoint-urile și a obține informații despre utilizatorul curent. - -Dependencies disponibile: -- get_current_user: Obține utilizatorul curent (obligatoriu) -- get_optional_user: Obține utilizatorul curent (opțional) -- require_company_access: Verifică accesul la o firmă specifică -- require_permissions: Verifică permisiunile necesare -- get_current_company: Obține firma curentă din context -""" - -import logging -from typing import Optional, List, Callable, Any -from functools import wraps - -from fastapi import Depends, HTTPException, status, Request -from fastapi.security import HTTPAuthorizationCredentials - -from .middleware import security_required, security_optional -from .jwt_handler import jwt_handler, TokenData -from .auth_service import auth_service -from .models import CurrentUser, PermissionType, AuthError - -logger = logging.getLogger(__name__) - - -class AuthenticationRequired(Exception): - """Excepție pentru când autentificarea este obligatorie""" - pass - - -class InsufficientPermissions(Exception): - """Excepție pentru permisiuni insuficiente""" - pass - - -class CompanyAccessDenied(Exception): - """Excepție pentru acces refuzat la firmă""" - pass - - -async def get_current_user_from_token( - credentials: HTTPAuthorizationCredentials = Depends(security_required) -) -> CurrentUser: - """ - Extrage și validează utilizatorul curent din token JWT - - Args: - credentials: Credențialele HTTP de autentificare din header - - Returns: - Utilizatorul curent autentificat - - Raises: - HTTPException: Dacă token-ul este invalid sau utilizatorul nu există - """ - if not credentials: - logger.warning("No credentials provided for protected endpoint") - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="Authentication required", - headers={"WWW-Authenticate": "Bearer"}, - ) - - # Validează token-ul - token_data = jwt_handler.verify_token(credentials.credentials) - - if not token_data: - logger.warning("Invalid token provided") - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="Invalid authentication token", - headers={"WWW-Authenticate": "Bearer"}, - ) - - if token_data.token_type != "access": - logger.warning(f"Invalid token type: {token_data.token_type}") - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="Invalid token type", - headers={"WWW-Authenticate": "Bearer"}, - ) - - # Creează obiectul CurrentUser - current_user = CurrentUser( - username=token_data.username, - user_id=token_data.user_id, - companies=token_data.companies, - permissions=token_data.permissions - ) - - logger.debug(f"Successfully authenticated user: {current_user.username}") - return current_user - - -async def get_current_user_from_request(request: Request) -> CurrentUser: - """ - Obține utilizatorul curent din request state (setat de middleware) - - Args: - request: Request-ul HTTP curent - - Returns: - Utilizatorul curent autentificat - - Raises: - HTTPException: Dacă utilizatorul nu este autentificat - """ - if not hasattr(request.state, 'is_authenticated') or not request.state.is_authenticated: - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="Authentication required", - headers={"WWW-Authenticate": "Bearer"}, - ) - - if not hasattr(request.state, 'user') or not request.state.user: - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="User not found in request", - headers={"WWW-Authenticate": "Bearer"}, - ) - - return request.state.user - - -async def get_optional_user_from_request(request: Request) -> Optional[CurrentUser]: - """ - Obține utilizatorul curent din request (opțional) - - Args: - request: Request-ul HTTP curent - - Returns: - Utilizatorul curent sau None dacă nu este autentificat - """ - if (hasattr(request.state, 'is_authenticated') and - request.state.is_authenticated and - hasattr(request.state, 'user')): - return request.state.user - - return None - - -async def get_optional_user_from_token( - credentials: Optional[HTTPAuthorizationCredentials] = Depends(security_optional) -) -> Optional[CurrentUser]: - """ - Extrage utilizatorul curent din token (opțional) - - Args: - credentials: Credențialele HTTP Bearer (opționale) - - Returns: - Utilizatorul curent sau None - """ - if not credentials: - return None - - try: - return await get_current_user_from_token(credentials) - except HTTPException: - return None - - -def require_company_access(company_code: str): - """ - Dependency factory care verifică accesul la o firmă specifică - - Args: - company_code: Codul firmei la care se verifică accesul - - Returns: - Dependency function pentru FastAPI - """ - async def check_company_access( - current_user: CurrentUser = Depends(get_current_user_from_request) - ) -> CurrentUser: - """ - Verifică dacă utilizatorul curent are acces la firma specificată - - Args: - current_user: Utilizatorul curent autentificat - - Returns: - Utilizatorul curent dacă are acces - - Raises: - HTTPException: Dacă nu are acces la firmă - """ - if company_code not in current_user.companies: - logger.warning( - f"User {current_user.username} attempted to access " - f"unauthorized company {company_code}" - ) - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, - detail=f"Access denied to company {company_code}" - ) - - # Verifică și în baza de date pentru siguranță - has_access = await auth_service.validate_user_company_access( - current_user.username, company_code - ) - - if not has_access: - logger.error( - f"Database access check failed for user {current_user.username} " - f"and company {company_code}" - ) - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, - detail=f"Database access denied to company {company_code}" - ) - - logger.debug(f"User {current_user.username} granted access to company {company_code}") - return current_user - - return check_company_access - - -def require_permissions(required_permissions: List[PermissionType]): - """ - Dependency factory care verifică permisiunile necesare - - Args: - required_permissions: Lista permisiunilor necesare - - Returns: - Dependency function pentru FastAPI - """ - async def check_permissions( - current_user: CurrentUser = Depends(get_current_user_from_request) - ) -> CurrentUser: - """ - Verifică dacă utilizatorul are permisiunile necesare - - Args: - current_user: Utilizatorul curent autentificat - - Returns: - Utilizatorul curent dacă are permisiunile - - Raises: - HTTPException: Dacă nu are permisiunile necesare - """ - user_permissions = set(current_user.permissions) - missing_permissions = [ - perm for perm in required_permissions - if perm not in user_permissions - ] - - if missing_permissions: - logger.warning( - f"User {current_user.username} missing permissions: {missing_permissions}" - ) - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, - detail=f"Missing required permissions: {missing_permissions}" - ) - - logger.debug(f"User {current_user.username} has required permissions") - return current_user - - return check_permissions - - -def require_company_and_permissions( - company_code: str, - required_permissions: List[PermissionType] -): - """ - Dependency factory care verifică atât accesul la firmă cât și permisiunile - - Args: - company_code: Codul firmei - required_permissions: Lista permisiunilor necesare - - Returns: - Dependency function pentru FastAPI - """ - async def check_company_and_permissions( - current_user: CurrentUser = Depends(get_current_user_from_request) - ) -> CurrentUser: - """ - Verifică accesul la firmă și permisiunile - - Args: - current_user: Utilizatorul curent - - Returns: - Utilizatorul curent dacă are acces și permisiuni - """ - # Verifică accesul la firmă - company_checker = require_company_access(company_code) - await company_checker(current_user) - - # Verifică permisiunile - permissions_checker = require_permissions(required_permissions) - await permissions_checker(current_user) - - return current_user - - return check_company_and_permissions - - -async def get_current_company_from_header( - request: Request, - current_user: CurrentUser = Depends(get_current_user_from_request) -) -> str: - """ - Obține codul firmei curente din header-ul X-Company-Code - - Args: - request: Request-ul HTTP - current_user: Utilizatorul curent - - Returns: - Codul firmei curente - - Raises: - HTTPException: Dacă header-ul lipsește sau utilizatorul nu are acces - """ - company_code = request.headers.get("X-Company-Code") - - if not company_code: - # Folosește prima firmă ca default dacă nu este specificată - if current_user.companies: - company_code = current_user.companies[0] - logger.debug(f"Using default company {company_code} for user {current_user.username}") - else: - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail="Company code required (X-Company-Code header or user default)" - ) - - # Verifică accesul - if company_code not in current_user.companies: - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, - detail=f"Access denied to company {company_code}" - ) - - return company_code - - -# Aliasuri pentru folosire mai ușoară -get_current_user = get_current_user_from_request -get_optional_user = get_optional_user_from_request - -# Dependency-uri predefinite pentru permisiuni comune -require_read_permission = require_permissions([PermissionType.READ]) -require_write_permission = require_permissions([PermissionType.WRITE]) -require_admin_permission = require_permissions([PermissionType.ADMIN]) -require_reports_permission = require_permissions([PermissionType.REPORTS]) - -# Decorator pentru validarea companiei în funcții -def validate_company_access(company_param: str = "company"): - """ - Decorator pentru validarea automată a accesului la firmă - - Args: - company_param: Numele parametrului care conține codul firmei - - Returns: - Decorator function - """ - def decorator(func: Callable) -> Callable: - @wraps(func) - async def wrapper(*args, **kwargs): - # Caută utilizatorul curent în argumentele funcției - current_user = None - for arg in args: - if isinstance(arg, CurrentUser): - current_user = arg - break - - if not current_user: - # Caută în kwargs - current_user = kwargs.get('current_user') - - if not current_user: - raise ValueError("CurrentUser not found in function arguments") - - # Obține codul firmei - company_code = kwargs.get(company_param) - if not company_code: - raise ValueError(f"Company parameter '{company_param}' not found") - - # Validează accesul - if company_code not in current_user.companies: - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, - detail=f"Access denied to company {company_code}" - ) - - return await func(*args, **kwargs) - - return wrapper - return decorator \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/auth/email_server_cache.py b/deploy-package-20260223-151231/shared/auth/email_server_cache.py deleted file mode 100644 index c8ab659..0000000 --- a/deploy-package-20260223-151231/shared/auth/email_server_cache.py +++ /dev/null @@ -1,362 +0,0 @@ -""" -Email-Server Cache for Multi-Oracle Auto-Discovery - -Builds and maintains a cache mapping emails to server IDs: -- At startup, connects to each Oracle server and extracts emails from CONTAFIN_ORACLE.UTILIZATORI -- Cache structure: {email: [server_ids]} -- Auto-refresh every 15 minutes (configurable) -- Thread-safe with asyncio.Lock - -US-003: Auto-Discovery Email-Server Cache -US-013: Added username lookup support (direct query, no caching) -""" - -import asyncio -import logging -from datetime import datetime, timedelta -from typing import Dict, List, Optional, Set - -logger = logging.getLogger(__name__) - - -class EmailServerCache: - """ - Cache for email-to-server mapping. - - Builds a dictionary {email: [server_ids]} by querying CONTAFIN_ORACLE.UTILIZATORI - on each configured Oracle server. - - Features: - - Lazy initialization (build on first access or explicit call) - - Auto-refresh at configurable intervals - - Thread-safe operations - - Graceful handling of server connection failures - """ - - _instance: Optional['EmailServerCache'] = None - - def __new__(cls): - if cls._instance is None: - cls._instance = super(EmailServerCache, cls).__new__(cls) - cls._instance._cache: Dict[str, List[str]] = {} - cls._instance._last_refresh: Optional[datetime] = None - cls._instance._refresh_interval = timedelta(minutes=15) - cls._instance._lock = asyncio.Lock() - cls._instance._initialized = False - cls._instance._refresh_task: Optional[asyncio.Task] = None - return cls._instance - - def set_refresh_interval(self, minutes: int) -> None: - """ - Set the cache refresh interval. - - Args: - minutes: Refresh interval in minutes (default: 15) - """ - self._refresh_interval = timedelta(minutes=minutes) - logger.info(f"Email cache refresh interval set to {minutes} minutes") - - async def build_cache(self) -> None: - """ - Build the email-server cache by querying all configured Oracle servers. - - Connects to each server and extracts active user emails from - CONTAFIN_ORACLE.UTILIZATORI table. - """ - from shared.database.oracle_pool import oracle_pool - from backend.config import settings - - async with self._lock: - logger.info("[EMAIL-CACHE] Building email-server cache...") - new_cache: Dict[str, Set[str]] = {} # Use set to avoid duplicates - - servers = settings.get_oracle_servers() - if not servers: - logger.warning("[EMAIL-CACHE] No Oracle servers configured") - self._cache = {} - self._last_refresh = datetime.now() - self._initialized = True - return - - for server in servers: - try: - logger.info(f"[EMAIL-CACHE] Querying server '{server.id}' ({server.name})...") - - # Get connection from the multi-pool - async with oracle_pool.get_connection(server.id) as connection: - with connection.cursor() as cursor: - # Query emails from UTILIZATORI table - # Only active users (INACTIV=0, STERS=0) with valid emails - cursor.execute(""" - SELECT LOWER(EMAIL) as email - FROM CONTAFIN_ORACLE.UTILIZATORI - WHERE EMAIL IS NOT NULL - AND TRIM(EMAIL) IS NOT NULL - AND INACTIV = 0 - AND STERS = 0 - """) - - rows = cursor.fetchall() - email_count = 0 - - for row in rows: - email = row[0].strip().lower() if row[0] else None - if email and '@' in email: # Basic email validation - if email not in new_cache: - new_cache[email] = set() - new_cache[email].add(server.id) - email_count += 1 - - logger.info(f"[EMAIL-CACHE] Found {email_count} valid emails on server '{server.id}'") - - except Exception as e: - # Log error but continue with other servers - logger.error(f"[EMAIL-CACHE] Failed to query server '{server.id}': {e}") - continue - - # Convert sets to sorted lists for consistent ordering - self._cache = {email: sorted(list(server_ids)) for email, server_ids in new_cache.items()} - self._last_refresh = datetime.now() - self._initialized = True - - total_emails = len(self._cache) - multi_server_emails = sum(1 for servers in self._cache.values() if len(servers) > 1) - - logger.info(f"[EMAIL-CACHE] ✅ Cache built: {total_emails} unique emails") - logger.info(f"[EMAIL-CACHE] {multi_server_emails} emails exist on multiple servers") - - async def refresh_if_needed(self) -> bool: - """ - Refresh cache if the refresh interval has passed. - - Returns: - True if cache was refreshed, False otherwise - """ - if not self._initialized: - await self.build_cache() - return True - - if self._last_refresh is None: - await self.build_cache() - return True - - time_since_refresh = datetime.now() - self._last_refresh - if time_since_refresh >= self._refresh_interval: - await self.build_cache() - return True - - return False - - def get_servers_for_email(self, email: str) -> List[str]: - """ - Get list of server IDs where the email exists. - - Args: - email: User email address - - Returns: - List of server_ids where this email exists. - Empty list if email not found (NOT an error). - """ - if not email: - return [] - - normalized_email = email.strip().lower() - servers = self._cache.get(normalized_email, []) - - if servers: - logger.debug(f"[EMAIL-CACHE] Email '{normalized_email}' found on servers: {servers}") - else: - logger.debug(f"[EMAIL-CACHE] Email '{normalized_email}' not found in cache") - - return servers.copy() # Return a copy to prevent external modification - - def is_initialized(self) -> bool: - """Check if cache has been built at least once.""" - return self._initialized - - def get_cache_stats(self) -> Dict: - """ - Get cache statistics. - - Returns: - Dict with cache stats (total_emails, multi_server_count, last_refresh, etc.) - """ - if not self._initialized: - return { - 'initialized': False, - 'total_emails': 0, - 'last_refresh': None, - 'refresh_interval_minutes': self._refresh_interval.total_seconds() / 60 - } - - multi_server = sum(1 for servers in self._cache.values() if len(servers) > 1) - server_distribution = {} - for servers in self._cache.values(): - count = len(servers) - server_distribution[count] = server_distribution.get(count, 0) + 1 - - return { - 'initialized': True, - 'total_emails': len(self._cache), - 'multi_server_count': multi_server, - 'server_distribution': server_distribution, - 'last_refresh': self._last_refresh.isoformat() if self._last_refresh else None, - 'refresh_interval_minutes': self._refresh_interval.total_seconds() / 60 - } - - async def start_auto_refresh(self) -> None: - """ - Start background task for automatic cache refresh. - - Runs refresh at the configured interval (default: 15 minutes). - """ - if self._refresh_task and not self._refresh_task.done(): - logger.warning("[EMAIL-CACHE] Auto-refresh task already running") - return - - async def refresh_loop(): - while True: - try: - await asyncio.sleep(self._refresh_interval.total_seconds()) - logger.info("[EMAIL-CACHE] Auto-refresh triggered") - await self.build_cache() - except asyncio.CancelledError: - logger.info("[EMAIL-CACHE] Auto-refresh task cancelled") - break - except Exception as e: - logger.error(f"[EMAIL-CACHE] Auto-refresh error: {e}") - # Continue running, will retry on next interval - - self._refresh_task = asyncio.create_task(refresh_loop()) - logger.info(f"[EMAIL-CACHE] Auto-refresh started (every {self._refresh_interval.total_seconds() / 60:.0f} minutes)") - - async def stop_auto_refresh(self) -> None: - """Stop the auto-refresh background task.""" - if self._refresh_task and not self._refresh_task.done(): - self._refresh_task.cancel() - try: - await self._refresh_task - except asyncio.CancelledError: - pass - self._refresh_task = None - logger.info("[EMAIL-CACHE] Auto-refresh stopped") - - def clear_cache(self) -> None: - """Clear the cache (useful for testing).""" - self._cache = {} - self._initialized = False - self._last_refresh = None - logger.info("[EMAIL-CACHE] Cache cleared") - - async def get_servers_for_username(self, username: str) -> List[str]: - """ - Get list of server IDs where the username exists (US-013). - - Unlike email lookup which uses the cache, username lookup queries - Oracle directly on each server. This is because: - - Usernames are less commonly used for login - - Direct query ensures fresh data - - Avoids bloating the cache with both email and username mappings - - Args: - username: Username to look up (case-insensitive, converted to uppercase) - - Returns: - List of server_ids where this username exists. - Empty list if username not found (NOT an error). - """ - if not username: - return [] - - from shared.database.oracle_pool import oracle_pool - from backend.config import settings - - normalized_username = username.strip().upper() - found_servers: List[str] = [] - - servers = settings.get_oracle_servers() - if not servers: - logger.warning("[EMAIL-CACHE] No Oracle servers configured for username lookup") - return [] - - for server in servers: - try: - async with oracle_pool.get_connection(server.id) as connection: - with connection.cursor() as cursor: - # Query for username in UTILIZATORI table - # Only active users (INACTIV=0, STERS=0) - cursor.execute(""" - SELECT 1 - FROM CONTAFIN_ORACLE.UTILIZATORI - WHERE UPPER(UTILIZATOR) = :username - AND INACTIV = 0 - AND STERS = 0 - AND ROWNUM = 1 - """, {"username": normalized_username}) - - row = cursor.fetchone() - if row: - found_servers.append(server.id) - logger.debug(f"[EMAIL-CACHE] Username '{normalized_username}' found on server '{server.id}'") - - except Exception as e: - logger.error(f"[EMAIL-CACHE] Failed to query username on server '{server.id}': {e}") - continue - - if found_servers: - logger.info(f"[EMAIL-CACHE] Username '{normalized_username}' found on {len(found_servers)} server(s): {found_servers}") - else: - logger.debug(f"[EMAIL-CACHE] Username '{normalized_username}' not found on any server") - - return sorted(found_servers) - - -# Global singleton instance -email_server_cache = EmailServerCache() - - -# Convenience functions for external use -def get_servers_for_email(email: str) -> List[str]: - """ - Get list of server IDs where the email exists. - - This is a convenience function that wraps the singleton instance. - - Args: - email: User email address - - Returns: - List of server_ids. Empty list if email not found (NOT an error). - """ - return email_server_cache.get_servers_for_email(email) - - -async def build_email_cache() -> None: - """Build/refresh the email-server cache.""" - await email_server_cache.build_cache() - - -async def start_email_cache_refresh() -> None: - """Start automatic cache refresh.""" - await email_server_cache.start_auto_refresh() - - -async def stop_email_cache_refresh() -> None: - """Stop automatic cache refresh.""" - await email_server_cache.stop_auto_refresh() - - -async def get_servers_for_username(username: str) -> List[str]: - """ - Get list of server IDs where the username exists (US-013). - - This is a convenience function that wraps the singleton instance. - - Args: - username: Username to look up (case-insensitive) - - Returns: - List of server_ids. Empty list if username not found (NOT an error). - """ - return await email_server_cache.get_servers_for_username(username) diff --git a/deploy-package-20260223-151231/shared/auth/jwt_handler.py b/deploy-package-20260223-151231/shared/auth/jwt_handler.py deleted file mode 100644 index 98acb60..0000000 --- a/deploy-package-20260223-151231/shared/auth/jwt_handler.py +++ /dev/null @@ -1,264 +0,0 @@ -""" -JWT Authentication Handler - Shared între toate aplicațiile ROA2WEB - -Acest modul gestionează crearea, validarea și refresh-ul token-urilor JWT -pentru autentificarea utilizatorilor în ecosistemul ROA2WEB. - -Payload structure: -{ - "username": "string", - "user_id": "integer", - "companies": ["schema1", "schema2"], - "permissions": ["read", "write", "admin"], - "server_id": "string|null", // ID-ul serverului Oracle (multi-server mode) - "exp": "timestamp", - "iat": "timestamp", - "type": "access|refresh" -} -""" -from jose import jwt -import os -from datetime import datetime, timedelta -from typing import Optional, Dict, Any, List -from pydantic import BaseModel, Field -import logging - -logger = logging.getLogger(__name__) - - -class TokenData(BaseModel): - """Date conținute în token""" - username: str = Field(description="Numele utilizatorului") - user_id: Optional[int] = Field(default=None, description="ID-ul utilizatorului") - companies: List[str] = Field(default_factory=list, description="Lista firmelor accesibile") - permissions: List[str] = Field(default_factory=list, description="Lista permisiunilor") - server_id: Optional[str] = Field(default=None, description="ID-ul serverului Oracle (pentru multi-server mode)") - exp: datetime = Field(description="Data expirării") - iat: datetime = Field(description="Data creării") - token_type: str = Field(alias="type", description="Tipul token-ului (access/refresh)") - - -class TokenResponse(BaseModel): - """Răspuns pentru token-uri""" - access_token: str = Field(description="JWT access token") - refresh_token: Optional[str] = Field(default=None, description="JWT refresh token") - token_type: str = Field(default="bearer", description="Tipul token-ului") - expires_in: int = Field(description="Timpul de expirare în secunde") - - -class JWTHandler: - """ - Gestionarea JWT tokens pentru autentificare - - Această clasă oferă funcționalități pentru: - - Crearea token-urilor access și refresh - - Validarea și decodificarea token-urilor - - Gestionarea expirării token-urilor - """ - - def __init__(self, secret_key: Optional[str] = None, algorithm: str = "HS256"): - """ - Inițializează JWT handler - - Args: - secret_key: Cheia secretă pentru semnarea token-urilor - algorithm: Algoritmul de criptare (default: HS256) - """ - self.secret_key = secret_key or os.getenv('JWT_SECRET_KEY', 'your-secret-key-change-in-production') - self.algorithm = algorithm - self.access_token_expire_minutes = int(os.getenv('ACCESS_TOKEN_EXPIRE_MINUTES', 30)) - self.refresh_token_expire_days = int(os.getenv('REFRESH_TOKEN_EXPIRE_DAYS', 7)) - - # Warning pentru development - if self.secret_key == 'your-secret-key-change-in-production': - logger.warning("Using default JWT secret key! Change JWT_SECRET_KEY in production!") - - def create_access_token( - self, - username: str, - companies: List[str], - user_id: Optional[int] = None, - permissions: Optional[List[str]] = None, - server_id: Optional[str] = None - ) -> str: - """ - Creează un JWT access token - - Args: - username: Numele utilizatorului - companies: Lista firmelor la care utilizatorul are acces - user_id: ID-ul utilizatorului în baza de date - permissions: Lista permisiunilor utilizatorului - server_id: ID-ul serverului Oracle (pentru multi-server mode) - - Returns: - Token JWT ca string - """ - now = datetime.utcnow() - expire = now + timedelta(minutes=self.access_token_expire_minutes) - - payload = { - "username": username, - "user_id": user_id, - "companies": companies or [], - "permissions": permissions or ["read"], - "server_id": server_id, - "exp": expire, - "iat": now, - "type": "access" - } - - token = jwt.encode(payload, self.secret_key, algorithm=self.algorithm) - logger.debug(f"Created access token for user {username} on server {server_id or 'default'} with companies: {companies}") - - return token - - def create_refresh_token( - self, - username: str, - user_id: Optional[int] = None, - server_id: Optional[str] = None - ) -> str: - """ - Creează un refresh token cu durată mai mare - - Args: - username: Numele utilizatorului - user_id: ID-ul utilizatorului - server_id: ID-ul serverului Oracle (pentru multi-server mode) - - Returns: - Refresh token JWT ca string - """ - now = datetime.utcnow() - expire = now + timedelta(days=self.refresh_token_expire_days) - - payload = { - "username": username, - "user_id": user_id, - "server_id": server_id, - "exp": expire, - "iat": now, - "type": "refresh" - } - - token = jwt.encode(payload, self.secret_key, algorithm=self.algorithm) - logger.debug(f"Created refresh token for user {username} on server {server_id or 'default'}") - - return token - - def verify_token(self, token: str) -> Optional[TokenData]: - """ - Verifică și decodează un JWT token - - Args: - token: Token-ul JWT de verificat - - Returns: - TokenData cu informațiile din token sau None dacă token-ul e invalid - """ - try: - logger.debug(f"Using JWT secret key (first 10 chars): {self.secret_key[:10]}...") - payload = jwt.decode(token, self.secret_key, algorithms=[self.algorithm]) - token_data = TokenData(**payload) - logger.debug(f"Token verified successfully for user {token_data.username}") - return token_data - except jwt.ExpiredSignatureError: - logger.warning("Token has expired") - return None - except jwt.JWTError as e: - logger.warning(f"Invalid token: {str(e)}") - logger.debug(f"Token that failed verification: {token[:50]}...") - return None - - def refresh_access_token( - self, - refresh_token: str, - companies: List[str], - permissions: Optional[List[str]] = None - ) -> Optional[str]: - """ - Creează un nou access token folosind refresh token-ul - - Args: - refresh_token: Refresh token-ul valid - companies: Lista actualizată a firmelor (poate fi modificată între refresh-uri) - permissions: Lista actualizată a permisiunilor - - Returns: - Noul access token sau None dacă refresh token-ul e invalid - """ - token_data = self.verify_token(refresh_token) - - if not token_data or token_data.token_type != "refresh": - logger.warning("Invalid refresh token") - return None - - # Creează nou access token cu datele din refresh token - # Păstrează server_id din refresh token pentru consistență multi-server - return self.create_access_token( - username=token_data.username, - companies=companies, - user_id=token_data.user_id, - permissions=permissions, - server_id=token_data.server_id - ) - - def create_token_response( - self, - username: str, - companies: List[str], - user_id: Optional[int] = None, - permissions: Optional[List[str]] = None, - include_refresh: bool = True, - server_id: Optional[str] = None - ) -> TokenResponse: - """ - Creează un răspuns complet cu access și refresh token - - Args: - username: Numele utilizatorului - companies: Lista firmelor accesibile - user_id: ID-ul utilizatorului - permissions: Lista permisiunilor - include_refresh: Dacă să includă și refresh token - server_id: ID-ul serverului Oracle (pentru multi-server mode) - - Returns: - TokenResponse cu toate token-urile - """ - access_token = self.create_access_token( - username, companies, user_id, permissions, server_id - ) - refresh_token = self.create_refresh_token( - username, user_id, server_id - ) if include_refresh else None - - return TokenResponse( - access_token=access_token, - refresh_token=refresh_token, - token_type="bearer", - expires_in=self.access_token_expire_minutes * 60 - ) - - def decode_token_payload(self, token: str) -> Optional[Dict[str, Any]]: - """ - Decodează token-ul fără verificare (pentru debugging) - - Args: - token: Token-ul de decodat - - Returns: - Payload-ul token-ului sau None - """ - try: - # Decodare fără verificare - doar pentru debugging - payload = jwt.decode(token, key="", algorithms=[self.algorithm], options={"verify_signature": False}) - return payload - except Exception as e: - logger.error(f"Error decoding token payload: {str(e)}") - return None - - -# Instance globală pentru folosire în toate aplicațiile -jwt_handler = JWTHandler() \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/auth/middleware.py b/deploy-package-20260223-151231/shared/auth/middleware.py deleted file mode 100644 index 19b4d64..0000000 --- a/deploy-package-20260223-151231/shared/auth/middleware.py +++ /dev/null @@ -1,375 +0,0 @@ -""" -FastAPI Authentication Middleware pentru ROA2WEB - -Acest modul oferă middleware pentru autentificarea automată în aplicațiile FastAPI, -incluzând extragerea token-urilor, validarea și injectarea datelor utilizatorului -în contextul request-ului. - -Funcționalități: -- Extragere automată token JWT din header Authorization -- Validare token și user data injection -- Rate limiting pentru endpoint-urile de autentificare -- Logging pentru securitate și monitoring -""" - -import logging -import time -from typing import Optional, Callable, Dict, Any, List, Set -from collections import defaultdict, deque -from datetime import datetime, timedelta - -from fastapi import Request, Response, HTTPException, status -from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials -from starlette.middleware.base import BaseHTTPMiddleware -from starlette.responses import JSONResponse - -from .jwt_handler import jwt_handler, TokenData -from .auth_service import auth_service -from .models import CurrentUser, AuthError - -logger = logging.getLogger(__name__) - - -class RateLimiter: - """ - Rate limiter pentru protejarea endpoint-urilor de autentificare - """ - - def __init__(self, max_requests: int = 5, time_window: int = 300): - """ - Inițializează rate limiter - - Args: - max_requests: Numărul maxim de request-uri permise - time_window: Fereastra de timp în secunde - """ - self.max_requests = max_requests - self.time_window = time_window - self.requests: Dict[str, deque] = defaultdict(deque) - - def is_allowed(self, client_ip: str) -> bool: - """ - Verifică dacă request-ul este permis pentru acest IP - - Args: - client_ip: Adresa IP a clientului - - Returns: - True dacă request-ul este permis - """ - now = time.time() - client_requests = self.requests[client_ip] - - # Șterge request-urile vechi - while client_requests and client_requests[0] < now - self.time_window: - client_requests.popleft() - - # Verifică dacă putem accepta încă un request - if len(client_requests) >= self.max_requests: - return False - - # Adaugă request-ul curent - client_requests.append(now) - return True - - def get_reset_time(self, client_ip: str) -> int: - """ - Returnează timpul când rate limiting se resetează pentru acest IP - - Args: - client_ip: Adresa IP a clientului - - Returns: - Timestamp când se resetează - """ - client_requests = self.requests[client_ip] - if not client_requests: - return int(time.time()) - - return int(client_requests[0] + self.time_window) - - -class AuthenticationMiddleware(BaseHTTPMiddleware): - """ - Middleware pentru autentificarea automată în FastAPI - - Acest middleware: - - Extrage token-ul JWT din header-ul Authorization - - Validează token-ul și obține datele utilizatorului - - Injectează utilizatorul curent în request.state - - Aplică rate limiting pentru endpoint-urile sensibile - """ - - def __init__( - self, - app, - excluded_paths: Optional[List[str]] = None, - rate_limit_paths: Optional[List[str]] = None, - rate_limiter: Optional[RateLimiter] = None - ): - """ - Inițializează middleware-ul - - Args: - app: Aplicația FastAPI - excluded_paths: Căile care nu necesită autentificare - rate_limit_paths: Căile cu rate limiting - rate_limiter: Instance de rate limiter personalizat - """ - super().__init__(app) - - self.excluded_paths = excluded_paths or [ - "/docs", "/redoc", "/openapi.json", "/health", "/", - "/auth/login", "/auth/register" - ] - - self.rate_limit_paths = rate_limit_paths or [ - "/auth/login", "/auth/register", "/auth/forgot-password" - ] - - self.rate_limiter = rate_limiter or RateLimiter(max_requests=5, time_window=300) - - logger.info(f"Authentication middleware initialized with {len(self.excluded_paths)} excluded paths") - - def _get_client_ip(self, request: Request) -> str: - """Obține adresa IP a clientului""" - # Verifică header-ele proxy - forwarded_for = request.headers.get("X-Forwarded-For") - if forwarded_for: - return forwarded_for.split(",")[0].strip() - - real_ip = request.headers.get("X-Real-IP") - if real_ip: - return real_ip - - # Fallback la client IP direct - return request.client.host if request.client else "unknown" - - def _should_exclude_path(self, path: str) -> bool: - """Verifică dacă path-ul trebuie exclus de la autentificare""" - # Special case for root path to avoid excluding all paths that start with "/" - if "/" in self.excluded_paths and path == "/": - return True - # Check other excluded paths (excluding "/" to avoid matching all paths) - excluded_paths_no_root = [p for p in self.excluded_paths if p != "/"] - return any(path.startswith(excluded) for excluded in excluded_paths_no_root) - - def _should_rate_limit_path(self, path: str) -> bool: - """Verifică dacă path-ul necesită rate limiting""" - return any(path.startswith(limited) for limited in self.rate_limit_paths) - - def _extract_token_from_header(self, request: Request) -> Optional[str]: - """ - Extrage token-ul JWT în header-ul Authorization - - Args: - request: Request-ul HTTP - - Returns: - Token-ul JWT sau None - """ - authorization = request.headers.get("Authorization") - if not authorization: - return None - - if not authorization.startswith("Bearer "): - return None - - return authorization[7:] # Elimină "Bearer " - - async def _create_current_user(self, token_data: TokenData) -> CurrentUser: - """ - Creează obiectul CurrentUser din token data - - Args: - token_data: Datele din token - - Returns: - Obiectul CurrentUser - """ - return CurrentUser( - username=token_data.username, - user_id=token_data.user_id, - companies=token_data.companies, - permissions=token_data.permissions, - last_login=datetime.now() - ) - - async def _handle_rate_limiting(self, request: Request, path: str) -> Optional[Response]: - """ - Gestionează rate limiting pentru căile sensibile - - Args: - request: Request-ul HTTP - path: Calea request-ului - - Returns: - Response cu eroare dacă este rate limited, None altfel - """ - if not self._should_rate_limit_path(path): - return None - - client_ip = self._get_client_ip(request) - - if not self.rate_limiter.is_allowed(client_ip): - reset_time = self.rate_limiter.get_reset_time(client_ip) - - logger.warning(f"Rate limit exceeded for IP {client_ip} on path {path}") - - error = AuthError( - error="rate_limit_exceeded", - error_description="Too many requests. Please try again later.", - error_code="RATE_LIMIT_001" - ) - - return JSONResponse( - status_code=status.HTTP_429_TOO_MANY_REQUESTS, - content=error.dict(), - headers={ - "X-RateLimit-Limit": str(self.rate_limiter.max_requests), - "X-RateLimit-Remaining": "0", - "X-RateLimit-Reset": str(reset_time), - "Retry-After": str(reset_time - int(time.time())) - } - ) - - return None - - async def dispatch(self, request: Request, call_next: Callable) -> Response: - """ - Procesează request-ul prin middleware - - Args: - request: Request-ul HTTP - call_next: Următorul handler din pipeline - - Returns: - Response-ul HTTP - """ - start_time = time.time() - path = request.url.path - - # IMPORTANT: Allow OPTIONS requests (CORS preflight) to pass through - if request.method == "OPTIONS": - response = await call_next(request) - return response - - # Rate limiting pentru căile sensibile - rate_limit_response = await self._handle_rate_limiting(request, path) - if rate_limit_response: - return rate_limit_response - - # Skip autentificare pentru căile excluse - if self._should_exclude_path(path): - request.state.user = None - request.state.is_authenticated = False - response = await call_next(request) - return response - - # Extrage token-ul - token = self._extract_token_from_header(request) - - if not token: - # Nu există token - pentru endpoint-urile protejate returnează 401 - logger.warning(f"No token provided for protected path {path}") - - error = AuthError( - error="authentication_required", - error_description="Authentication required", - error_code="AUTH_003" - ) - - return JSONResponse( - status_code=status.HTTP_401_UNAUTHORIZED, - content=error.dict(), - headers={"WWW-Authenticate": "Bearer"} - ) - - # Validează token-ul - token_data = jwt_handler.verify_token(token) - - if not token_data: - # Token invalid - logger.warning(f"Invalid token used for path {path}") - - error = AuthError( - error="invalid_token", - error_description="The provided token is invalid or expired.", - error_code="AUTH_001" - ) - - return JSONResponse( - status_code=status.HTTP_401_UNAUTHORIZED, - content=error.dict(), - headers={"WWW-Authenticate": "Bearer"} - ) - - # Token valid - creează utilizatorul curent - try: - current_user = await self._create_current_user(token_data) - request.state.user = current_user - request.state.is_authenticated = True - request.state.token_data = token_data - # Extrage server_id din token pentru a fi folosit în query-uri Oracle - request.state.server_id = token_data.server_id - - logger.debug(f"User {current_user.username} authenticated successfully for path {path} (server: {token_data.server_id or 'default'})") - - except Exception as e: - logger.error(f"Error creating current user: {str(e)}") - - error = AuthError( - error="authentication_error", - error_description="Authentication processing error.", - error_code="AUTH_002" - ) - - return JSONResponse( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - content=error.dict() - ) - - # Procesează request-ul - response = await call_next(request) - - # Adaugă header-e de securitate - response.headers["X-Content-Type-Options"] = "nosniff" - response.headers["X-Frame-Options"] = "DENY" - response.headers["X-XSS-Protection"] = "1; mode=block" - - # Log timpul de procesare - process_time = time.time() - start_time - response.headers["X-Process-Time"] = str(process_time) - - return response - - -class HTTPBearerOptional(HTTPBearer): - """ - Versiune opțională pentru autentificare care nu aruncă excepții - dacă token-ul lipsește - utile pentru endpoint-urile care - pot funcționa atât cu cât și fără autentificare - """ - - async def __call__(self, request: Request) -> Optional[HTTPAuthorizationCredentials]: - """ - Extrage credențialele de autentificare fără să arunce excepții - - Args: - request: Request-ul HTTP - - Returns: - Credențialele sau None - """ - try: - return await super().__call__(request) - except HTTPException: - return None - - -# Instance predefinite pentru folosire rapidă -security_optional = HTTPBearerOptional(auto_error=False) -security_required = HTTPBearer() - -# Rate limiter default -default_rate_limiter = RateLimiter(max_requests=5, time_window=300) \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/auth/models.py b/deploy-package-20260223-151231/shared/auth/models.py deleted file mode 100644 index f47333a..0000000 --- a/deploy-package-20260223-151231/shared/auth/models.py +++ /dev/null @@ -1,344 +0,0 @@ -""" -Authentication Pydantic Models pentru ROA2WEB - -Acest modul definește toate modelele de date folosite în sistemul de autentificare, -incluzând request/response models și modele pentru user data. - -Modelele acoperă: -- Login request și response -- Token data și management -- User information și permisiuni -- Company access control -""" - -from pydantic import BaseModel, Field, validator, EmailStr -from typing import List, Optional, Dict, Any -from datetime import datetime -from enum import Enum - - -class PermissionType(str, Enum): - """Tipurile de permisiuni disponibile în sistem""" - READ = "read" - WRITE = "write" - DELETE = "delete" - ADMIN = "admin" - REPORTS = "reports" - EXPORT = "export" - - -class TokenType(str, Enum): - """Tipurile de token-uri JWT""" - ACCESS = "access" - REFRESH = "refresh" - - -class LoginRequest(BaseModel): - """Model pentru request-ul de login""" - username: str = Field( - ..., - min_length=3, - max_length=50, - description="Numele utilizatorului", - example="admin" - ) - password: str = Field( - ..., - min_length=1, - description="Parola utilizatorului" - ) - remember_me: bool = Field( - default=False, - description="Dacă să păstreze utilizatorul autentificat mai mult timp" - ) - server_id: Optional[str] = Field( - default=None, - description="ID-ul serverului Oracle pentru autentificare (opțional în modul single-server)", - example="romfast" - ) - - @validator('username') - def username_alphanumeric(cls, v): - """Validează că username-ul conține doar caractere permise (inclusiv email-uri) - - Pentru backward compatibility: - - Permite username-uri clasice: litere, cifre, spații, _, - - - Permite email-uri pentru noul flow multi-server: @, . - """ - # Permitem litere, cifre, spații, _, -, @, și . (pentru email-uri) - allowed_chars = v.replace(' ', '').replace('_', '').replace('-', '').replace('@', '').replace('.', '') - if not allowed_chars.isalnum(): - raise ValueError('Username-ul poate conține doar litere, cifre, spații, _, -, @ și .') - - # Detectăm dacă este email sau username clasic - if '@' in v: - # Email: păstrăm lowercase pentru consistență cu email-urile - return v.lower().strip() - else: - # Username clasic: uppercase pentru consistență cu Oracle - return v.upper().strip() - - -class TokenResponse(BaseModel): - """Model pentru răspunsul de autentificare cu token-uri""" - access_token: str = Field(description="JWT access token") - refresh_token: Optional[str] = Field( - default=None, - description="JWT refresh token (opțional)" - ) - token_type: str = Field( - default="bearer", - description="Tipul token-ului (întotdeauna 'bearer')" - ) - expires_in: int = Field( - description="Timpul de expirare al access token-ului în secunde" - ) - user: 'CurrentUser' = Field(description="Informațiile utilizatorului autentificat") - - -class RefreshTokenRequest(BaseModel): - """Model pentru request-ul de refresh token""" - refresh_token: str = Field(description="Refresh token-ul valid") - - -class LogoutRequest(BaseModel): - """Model pentru request-ul de logout""" - refresh_token: Optional[str] = Field( - default=None, - description="Refresh token de invalidat (opțional)" - ) - - -class CurrentUser(BaseModel): - """Model pentru utilizatorul curent autentificat""" - username: str = Field(description="Numele utilizatorului") - user_id: Optional[int] = Field( - default=None, - description="ID-ul utilizatorului în baza de date" - ) - email: Optional[EmailStr] = Field( - default=None, - description="Email-ul utilizatorului" - ) - companies: List[str] = Field( - default_factory=list, - description="Lista codurilor firmelor la care utilizatorul are acces" - ) - permissions: List[PermissionType] = Field( - default_factory=lambda: [PermissionType.READ], - description="Lista permisiunilor utilizatorului" - ) - is_active: bool = Field( - default=True, - description="Dacă utilizatorul este activ" - ) - last_login: Optional[datetime] = Field( - default=None, - description="Data ultimei autentificări" - ) - - @validator('companies') - def companies_not_empty_if_active(cls, v, values): - """Validează că utilizatorii activi au cel puțin o firmă""" - if values.get('is_active', True) and not v: - raise ValueError('Utilizatorii activi trebuie să aibă acces la cel puțin o firmă') - return v - - -class UserCompany(BaseModel): - """Model pentru o firmă la care utilizatorul are acces""" - code: str = Field(description="Codul firmei (schema Oracle)") - name: Optional[str] = Field( - default=None, - description="Numele firmei (dacă este disponibil)" - ) - permissions: List[PermissionType] = Field( - default_factory=lambda: [PermissionType.READ], - description="Permisiunile utilizatorului pentru această firmă" - ) - is_default: bool = Field( - default=False, - description="Dacă aceasta este firma implicită pentru utilizator" - ) - - -class CompanyAccessRequest(BaseModel): - """Model pentru verificarea accesului la o firmă""" - company_code: str = Field(description="Codul firmei de verificat") - required_permissions: Optional[List[PermissionType]] = Field( - default=None, - description="Permisiunile necesare (opțional)" - ) - - -class CompanyAccessResponse(BaseModel): - """Model pentru răspunsul de verificare acces firmă""" - has_access: bool = Field(description="Dacă utilizatorul are acces") - company: Optional[UserCompany] = Field( - default=None, - description="Detaliile firmei dacă utilizatorul are acces" - ) - missing_permissions: Optional[List[PermissionType]] = Field( - default=None, - description="Permisiunile lipsă (dacă aplicabil)" - ) - - -class AuthError(BaseModel): - """Model pentru erorile de autentificare""" - error: str = Field(description="Tipul erorii") - error_description: str = Field(description="Descrierea detaliată a erorii") - error_code: Optional[str] = Field( - default=None, - description="Codul de eroare pentru procesare automată" - ) - - -class AuthStats(BaseModel): - """Model pentru statisticile de autentificare""" - total_users: int = Field(description="Numărul total de utilizatori") - active_sessions: int = Field(description="Sesiuni active curente") - cache_hit_ratio: float = Field( - description="Rata de hit a cache-ului pentru date utilizatori" - ) - last_cleanup: Optional[datetime] = Field( - default=None, - description="Ultima curățare a cache-ului" - ) - - -class PasswordChangeRequest(BaseModel): - """Model pentru schimbarea parolei (pentru viitor)""" - current_password: str = Field(description="Parola curentă") - new_password: str = Field( - min_length=8, - description="Noua parolă (minim 8 caractere)" - ) - confirm_password: str = Field(description="Confirmarea noii parole") - - @validator('confirm_password') - def passwords_match(cls, v, values): - """Validează că parolele coincid""" - if 'new_password' in values and v != values['new_password']: - raise ValueError('Parolele nu coincid') - return v - - -class SessionInfo(BaseModel): - """Model pentru informațiile despre sesiune""" - session_id: str = Field(description="ID-ul sesiunii") - username: str = Field(description="Numele utilizatorului") - created_at: datetime = Field(description="Data creării sesiunii") - last_activity: datetime = Field(description="Ultima activitate") - ip_address: Optional[str] = Field( - default=None, - description="Adresa IP a utilizatorului" - ) - user_agent: Optional[str] = Field( - default=None, - description="User agent-ul browserului" - ) - is_active: bool = Field( - default=True, - description="Dacă sesiunea este încă activă" - ) - - -# ============================================================================ -# MULTI-ORACLE IDENTITY CHECK MODELS (US-004, US-013) -# ============================================================================ - -class CheckIdentityRequest(BaseModel): - """ - Model pentru verificarea identității în sistemul multi-Oracle (US-013) - - Suportă atât email cât și username: - - Cu '@': tratează ca email și caută în EmailServerCache - - Fără '@': tratează ca username și caută în Oracle pe toate serverele - """ - identity: str = Field( - ..., - min_length=2, - max_length=100, - description="Email sau username de verificat", - example="user@example.com sau MARIUS" - ) - - @validator('identity') - def validate_identity(cls, v): - """Validează și normalizează identitatea""" - stripped = v.strip() - if not stripped: - raise ValueError('Identitatea nu poate fi goală') - # Pentru email-uri, normalizăm la lowercase - if '@' in stripped: - return stripped.lower() - # Pentru username-uri, normalizăm la uppercase (convenție Oracle) - return stripped.upper() - - -class CheckEmailRequest(BaseModel): - """ - Model pentru verificarea email-ului în sistemul multi-Oracle (US-004) - - DEPRECATED: Folosește CheckIdentityRequest pentru suport dual email/username - Păstrat pentru backward compatibility. - """ - email: EmailStr = Field( - ..., - description="Adresa email a utilizatorului de verificat", - example="user@example.com" - ) - - -class ServerInfo(BaseModel): - """Informații despre un server Oracle disponibil pentru utilizator""" - id: str = Field(description="ID-ul serverului (ex: 'romfast')") - name: str = Field(description="Numele human-readable al serverului (ex: 'Romfast - Producție')") - - -class CheckIdentityResponse(BaseModel): - """ - Răspunsul pentru verificarea identității (email sau username) (US-013). - - SECURITATE: - - Pentru identitate validă: returnează exists=True și lista serverelor - - Pentru identitate invalidă: returnează exists=False și listă goală de servere - (NU expunem serverele disponibile pentru a preveni enumerarea!) - """ - exists: bool = Field( - description="True dacă identitatea există în sistem pe cel puțin un server" - ) - servers: List[ServerInfo] = Field( - default_factory=list, - description="Lista serverelor pe care există identitatea (goală pentru identitate invalidă)" - ) - identity_type: str = Field( - default="unknown", - description="Tipul identității: 'email' sau 'username'" - ) - - -class CheckEmailResponse(BaseModel): - """ - Răspunsul pentru verificarea email-ului (US-004). - - DEPRECATED: Folosește CheckIdentityResponse pentru suport dual email/username - Păstrat pentru backward compatibility. - - SECURITATE: - - Pentru email valid: returnează exists=True și lista serverelor - - Pentru email invalid: returnează exists=False și listă goală de servere - (NU expunem serverele disponibile pentru a preveni enumerarea!) - """ - exists: bool = Field( - description="True dacă email-ul există în sistem pe cel puțin un server" - ) - servers: List[ServerInfo] = Field( - default_factory=list, - description="Lista serverelor pe care există email-ul (goală pentru email invalid)" - ) - - -# Update la forward references pentru TokenResponse -TokenResponse.model_rebuild() \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/auth/routes.py b/deploy-package-20260223-151231/shared/auth/routes.py deleted file mode 100644 index 5b62501..0000000 --- a/deploy-package-20260223-151231/shared/auth/routes.py +++ /dev/null @@ -1,681 +0,0 @@ -""" -Authentication Routes Template pentru ROA2WEB FastAPI Applications - -Acest modul oferă rute predefinite pentru autentificare care pot fi integrate -în orice aplicație FastAPI din ecosistemul ROA2WEB. - -Endpoints disponibile: -- POST /auth/login - Autentificare utilizator -- POST /auth/refresh - Refresh access token -- POST /auth/logout - Deconectare utilizator -- GET /auth/me - Informații utilizator curent -- GET /auth/companies - Firmele utilizatorului -- GET /auth/status - Status autentificare -""" - -import logging -from typing import List, Optional -from datetime import datetime - -from fastapi import APIRouter, Depends, HTTPException, status, Request, Response -from fastapi.security import HTTPAuthorizationCredentials - -from .models import ( - LoginRequest, TokenResponse, RefreshTokenRequest, LogoutRequest, - CurrentUser, UserCompany, CompanyAccessRequest, CompanyAccessResponse, - AuthError, AuthStats, CheckEmailRequest, CheckEmailResponse, ServerInfo, - CheckIdentityRequest, CheckIdentityResponse -) -from .auth_service import auth_service, AuthenticationError -from .jwt_handler import jwt_handler -from .dependencies import ( - get_current_user, get_optional_user, - security_required, security_optional -) -from .middleware import default_rate_limiter, RateLimiter - -logger = logging.getLogger(__name__) - - -def create_auth_router( - prefix: str = "/auth", - tags: Optional[List[str]] = None, - include_admin_routes: bool = False -) -> APIRouter: - """ - Creează un router FastAPI cu toate rutele de autentificare - - Args: - prefix: Prefix-ul pentru toate rutele - tags: Tag-urile pentru documentația OpenAPI - include_admin_routes: Dacă să includă rutele de administrare - - Returns: - Router-ul FastAPI configurat - """ - router = APIRouter(prefix=prefix, tags=tags or ["authentication"]) - - # Rate limiter pentru check-identity/check-email: 5 requests per minut per IP - check_identity_rate_limiter = RateLimiter(max_requests=5, time_window=60) - - @router.post("/check-identity", response_model=CheckIdentityResponse, status_code=status.HTTP_200_OK) - async def check_identity( - check_data: CheckIdentityRequest, - request: Request - ) -> CheckIdentityResponse: - """ - Verifică dacă un email sau username există în sistem și pe câte servere Oracle (US-013). - - Acest endpoint suportă dual login: - - Input cu '@': tratează ca email și caută în EmailServerCache - - Input fără '@': tratează ca username și caută direct în Oracle - - SECURITATE: - - Rate limited: max 5 requests/minut per IP - - NU expune serverele disponibile pentru identități invalide - - Identități invalide returnează {exists: false, servers: []} - - Args: - check_data: Identitatea de verificat (email sau username) - request: Request-ul HTTP (pentru rate limiting) - - Returns: - CheckIdentityResponse cu exists, servers[] și identity_type - - Raises: - HTTPException 429: Rate limit exceeded - """ - # Rate limiting - 5 req/min per IP - client_ip = request.client.host if request.client else "unknown" - - if not check_identity_rate_limiter.is_allowed(client_ip): - reset_time = check_identity_rate_limiter.get_reset_time(client_ip) - logger.warning(f"Rate limit exceeded for check-identity from IP {client_ip}") - raise HTTPException( - status_code=status.HTTP_429_TOO_MANY_REQUESTS, - detail="Too many requests. Please try again later.", - headers={ - "X-RateLimit-Limit": "5", - "X-RateLimit-Remaining": "0", - "X-RateLimit-Reset": str(reset_time), - "Retry-After": str(max(1, reset_time - int(__import__('time').time()))) - } - ) - - try: - from .email_server_cache import email_server_cache - from backend.config import settings - - identity = check_data.identity # Already normalized by validator - is_email = '@' in identity - - identity_type = "email" if is_email else "username" - logger.info(f"Check-identity request for '{identity}' (type: {identity_type}) from IP {client_ip}") - - # Get server IDs based on identity type - if is_email: - # Email lookup from cache - server_ids = email_server_cache.get_servers_for_email(identity) - else: - # Username lookup directly from Oracle (async) - server_ids = await email_server_cache.get_servers_for_username(identity) - - if not server_ids: - # Identity not found - return empty response (don't expose available servers!) - logger.info(f"Identity '{identity}' not found in any server") - return CheckIdentityResponse(exists=False, servers=[], identity_type=identity_type) - - # Build server info list with human-readable names - servers: List[ServerInfo] = [] - for server_id in server_ids: - server_config = settings.get_oracle_server(server_id) - if server_config: - servers.append(ServerInfo( - id=server_config.id, - name=server_config.name - )) - else: - # Fallback if server config not found (shouldn't happen) - logger.warning(f"Server '{server_id}' not found in config") - servers.append(ServerInfo(id=server_id, name=server_id)) - - logger.info(f"Identity '{identity}' found on {len(servers)} server(s): {[s.id for s in servers]}") - return CheckIdentityResponse(exists=True, servers=servers, identity_type=identity_type) - - except Exception as e: - logger.error(f"Error checking identity '{check_data.identity}': {str(e)}") - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail="Error checking identity" - ) - - @router.post("/check-email", response_model=CheckEmailResponse, status_code=status.HTTP_200_OK) - async def check_email( - check_data: CheckEmailRequest, - request: Request - ) -> CheckEmailResponse: - """ - Verifică dacă un email există în sistem și pe câte servere Oracle. - - DEPRECATED: Folosește /check-identity pentru suport dual email/username. - Păstrat pentru backward compatibility. - - Args: - check_data: Email-ul de verificat - request: Request-ul HTTP (pentru rate limiting) - - Returns: - CheckEmailResponse cu exists și servers[] - """ - # Rate limiting - shared with check-identity - client_ip = request.client.host if request.client else "unknown" - - if not check_identity_rate_limiter.is_allowed(client_ip): - reset_time = check_identity_rate_limiter.get_reset_time(client_ip) - logger.warning(f"Rate limit exceeded for check-email from IP {client_ip}") - raise HTTPException( - status_code=status.HTTP_429_TOO_MANY_REQUESTS, - detail="Too many requests. Please try again later.", - headers={ - "X-RateLimit-Limit": "5", - "X-RateLimit-Remaining": "0", - "X-RateLimit-Reset": str(reset_time), - "Retry-After": str(max(1, reset_time - int(__import__('time').time()))) - } - ) - - try: - from .email_server_cache import email_server_cache - from backend.config import settings - - email = check_data.email.lower().strip() - logger.info(f"Check-email request for '{email}' from IP {client_ip}") - - # Get server IDs from cache - server_ids = email_server_cache.get_servers_for_email(email) - - if not server_ids: - # Email not found - return empty response (don't expose available servers!) - logger.info(f"Email '{email}' not found in any server") - return CheckEmailResponse(exists=False, servers=[]) - - # Build server info list with human-readable names - servers: List[ServerInfo] = [] - for server_id in server_ids: - server_config = settings.get_oracle_server(server_id) - if server_config: - servers.append(ServerInfo( - id=server_config.id, - name=server_config.name - )) - else: - # Fallback if server config not found (shouldn't happen) - logger.warning(f"Server '{server_id}' not found in config") - servers.append(ServerInfo(id=server_id, name=server_id)) - - logger.info(f"Email '{email}' found on {len(servers)} server(s): {[s.id for s in servers]}") - return CheckEmailResponse(exists=True, servers=servers) - - except Exception as e: - logger.error(f"Error checking email '{check_data.email}': {str(e)}") - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail="Error checking email" - ) - - @router.post("/login", response_model=TokenResponse, status_code=status.HTTP_200_OK) - async def login( - login_data: LoginRequest, - request: Request, - response: Response - ) -> TokenResponse: - """ - Autentifică un utilizator și returnează token-urile JWT - - Acest endpoint: - - Validează credențialele utilizatorului în Oracle - - Obține firmele la care utilizatorul are acces - - Generează access și refresh token-uri JWT - - Aplică rate limiting pentru securitate - - Suportă modul multi-server (server_id opțional) - - Args: - login_data: Datele de autentificare (username, password, server_id opțional) - request: Request-ul HTTP (pentru rate limiting) - response: Response-ul HTTP (pentru header-e) - - Returns: - Token-urile JWT și informațiile utilizatorului - - Raises: - HTTPException 400: Pentru server_id invalid - HTTPException 401: Pentru credențiale invalide - HTTPException 500: Pentru erori de sistem - """ - try: - # Log tentativa de autentificare - client_ip = request.client.host if request.client else "unknown" - server_info = f" on server {login_data.server_id}" if login_data.server_id else "" - logger.info(f"Login attempt for user {login_data.username}{server_info} from IP {client_ip}") - - # Validare server_id dacă specificat (multi-server mode) - if login_data.server_id: - from backend.config import settings - from shared.database.oracle_pool import oracle_pool - - # Verifică dacă serverul există în configurație - server_config = settings.get_oracle_server(login_data.server_id) - if not server_config: - logger.warning(f"Invalid server_id '{login_data.server_id}' in login request") - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail=f"Invalid server_id: '{login_data.server_id}'. Server not found in configuration." - ) - - # Verifică dacă serverul este înregistrat în pool - if not oracle_pool.is_server_registered(login_data.server_id): - logger.warning(f"Server '{login_data.server_id}' not registered in pool") - raise HTTPException( - status_code=status.HTTP_400_BAD_REQUEST, - detail=f"Server '{login_data.server_id}' is not available." - ) - - # Autentifică și creează token-urile - success, token_response, error_message = await auth_service.authenticate_and_create_tokens( - login_data.username, - login_data.password, - login_data.server_id - ) - - if not success: - logger.warning(f"Failed login attempt for user {login_data.username}{server_info}: {error_message}") - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail=error_message or "Authentication failed" - ) - - # token_response.user este deja populat corect de auth_service.authenticate_and_create_tokens - # cu username-ul Oracle rezolvat (nu email-ul) și lista de firme - - # Header-e de securitate - response.headers["X-Content-Type-Options"] = "nosniff" - response.headers["X-Frame-Options"] = "DENY" - - logger.info(f"Successful login for user {login_data.username}{server_info}") - return token_response - - except HTTPException: - # Re-raise HTTP exceptions as-is (e.g., 401 for invalid credentials) - raise - except AuthenticationError as e: - logger.error(f"Authentication error for user {login_data.username}: {str(e)}") - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail=str(e) - ) - except Exception as e: - logger.error(f"Unexpected error during login for user {login_data.username}: {str(e)}") - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail="Internal authentication error" - ) - - @router.post("/refresh", response_model=TokenResponse, status_code=status.HTTP_200_OK) - async def refresh_token(refresh_data: RefreshTokenRequest) -> TokenResponse: - """ - Reîmprospătează access token-ul folosind refresh token-ul - - Args: - refresh_data: Refresh token-ul valid - - Returns: - Noul access token și informațiile utilizatorului - - Raises: - HTTPException: Pentru refresh token-uri invalide - """ - try: - # Validează refresh token-ul - token_data = jwt_handler.verify_token(refresh_data.refresh_token) - - if not token_data or token_data.token_type != "refresh": - logger.warning("Invalid refresh token provided") - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="Invalid refresh token" - ) - - # Obține datele actualizate ale utilizatorului - companies = await auth_service.get_user_companies(token_data.username) - permissions = ["read", "reports"] # Poate fi extins în viitor - - # Creează noul access token - new_access_token = jwt_handler.create_access_token( - username=token_data.username, - companies=companies, - user_id=token_data.user_id, - permissions=permissions - ) - - # Informațiile utilizatorului - current_user = CurrentUser( - username=token_data.username, - user_id=token_data.user_id, - companies=companies, - permissions=permissions - ) - - token_response = TokenResponse( - access_token=new_access_token, - token_type="bearer", - expires_in=jwt_handler.access_token_expire_minutes * 60, - user=current_user - ) - - logger.info(f"Token refreshed for user {token_data.username}") - return token_response - - except Exception as e: - logger.error(f"Error refreshing token: {str(e)}") - raise HTTPException( - status_code=status.HTTP_401_UNAUTHORIZED, - detail="Token refresh failed" - ) - - @router.post("/logout", status_code=status.HTTP_200_OK) - async def logout( - logout_data: Optional[LogoutRequest] = None, - current_user: CurrentUser = Depends(get_current_user) - ) -> dict: - """ - Deconectează utilizatorul (invalidează token-urile) - - Note: În implementarea curentă, token-urile JWT sunt stateless, - deci nu pot fi invalidate direct. În viitor poate fi implementat - un blacklist pentru token-uri. - - Args: - logout_data: Date pentru logout (opțional) - current_user: Utilizatorul curent autentificat - - Returns: - Confirmarea deconectării - """ - logger.info(f"User {current_user.username} logged out") - - # În viitor, aici se poate implementa: - # - Adăugarea token-ului într-un blacklist - # - Invalidarea tuturor sesiunilor utilizatorului - # - Notificări de securitate - - return { - "message": "Successfully logged out", - "username": current_user.username, - "logout_time": datetime.now().isoformat() - } - - @router.get("/me", response_model=CurrentUser) - async def get_current_user_info( - current_user: CurrentUser = Depends(get_current_user) - ) -> CurrentUser: - """ - Returnează informațiile despre utilizatorul curent - - Args: - current_user: Utilizatorul curent autentificat - - Returns: - Informațiile complete ale utilizatorului - """ - logger.debug(f"User info requested for {current_user.username}") - return current_user - - @router.get("/companies", response_model=List[UserCompany]) - async def get_user_companies( - current_user: CurrentUser = Depends(get_current_user) - ) -> List[UserCompany]: - """ - Returnează lista firmelor la care utilizatorul are acces - - Args: - current_user: Utilizatorul curent autentificat - - Returns: - Lista firmelor cu permisiunile asociate - """ - try: - # Obține firmele actualizate din baza de date - companies = await auth_service.get_user_companies(current_user.username) - - user_companies = [] - for i, company_code in enumerate(companies): - # Obține permisiunile pentru fiecare firmă - permissions = await auth_service.get_user_permissions( - current_user.username, - company_code - ) - - user_company = UserCompany( - code=company_code, - permissions=permissions, - is_default=(i == 0) # Prima firmă ca default - ) - user_companies.append(user_company) - - logger.debug(f"Returned {len(user_companies)} companies for user {current_user.username}") - return user_companies - - except Exception as e: - logger.error(f"Error getting companies for user {current_user.username}: {str(e)}") - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail="Error retrieving user companies" - ) - - @router.post("/check-company-access", response_model=CompanyAccessResponse) - async def check_company_access( - access_request: CompanyAccessRequest, - current_user: CurrentUser = Depends(get_current_user) - ) -> CompanyAccessResponse: - """ - Verifică dacă utilizatorul are acces la o firmă specifică - - Args: - access_request: Request-ul de verificare acces - current_user: Utilizatorul curent autentificat - - Returns: - Răspunsul cu informații despre acces - """ - try: - has_access = await auth_service.validate_user_company_access( - current_user.username, - access_request.company_code - ) - - if not has_access: - return CompanyAccessResponse( - has_access=False, - company=None, - missing_permissions=None - ) - - # Obține permisiunile pentru firmă - permissions = await auth_service.get_user_permissions( - current_user.username, - access_request.company_code - ) - - # Verifică permisiunile cerute - missing_permissions = [] - if access_request.required_permissions: - missing_permissions = [ - perm for perm in access_request.required_permissions - if perm not in permissions - ] - - user_company = UserCompany( - code=access_request.company_code, - permissions=permissions - ) - - return CompanyAccessResponse( - has_access=True, - company=user_company, - missing_permissions=missing_permissions if missing_permissions else None - ) - - except Exception as e: - logger.error(f"Error checking company access: {str(e)}") - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail="Error checking company access" - ) - - @router.get("/my-servers", response_model=dict) - async def get_my_servers( - current_user: CurrentUser = Depends(get_current_user) - ) -> dict: - """ - Returnează lista serverelor la care utilizatorul autentificat are acces (US-006). - - Acest endpoint este folosit de frontend pentru a popula dropdown-ul de server switch. - Lookup-ul se face pe baza email-ului sau username-ului utilizatorului curent. - - Args: - current_user: Utilizatorul curent autentificat - - Returns: - Dict cu lista de servere: {servers: [{id: string, name: string}, ...]} - """ - try: - from .email_server_cache import email_server_cache - from backend.config import settings - - logger.info(f"Get my-servers request for user '{current_user.username}'") - - # Try email lookup first (faster, from cache) - server_ids: List[str] = [] - if current_user.email: - server_ids = email_server_cache.get_servers_for_email(current_user.email) - logger.debug(f"Email lookup for '{current_user.email}': {server_ids}") - - # If no email or no results, try username lookup (queries Oracle directly) - if not server_ids: - server_ids = await email_server_cache.get_servers_for_username(current_user.username) - logger.debug(f"Username lookup for '{current_user.username}': {server_ids}") - - # Build server info list with human-readable names - servers: List[ServerInfo] = [] - for server_id in server_ids: - server_config = settings.get_oracle_server(server_id) - if server_config: - servers.append(ServerInfo( - id=server_config.id, - name=server_config.name - )) - else: - # Fallback if server config not found - logger.warning(f"Server '{server_id}' not found in config") - servers.append(ServerInfo(id=server_id, name=server_id)) - - logger.info(f"User '{current_user.username}' has access to {len(servers)} server(s)") - return {"servers": [s.model_dump() for s in servers]} - - except Exception as e: - logger.error(f"Error getting servers for user '{current_user.username}': {str(e)}") - raise HTTPException( - status_code=status.HTTP_500_INTERNAL_SERVER_ERROR, - detail="Error retrieving user servers" - ) - - @router.get("/status") - async def get_auth_status( - current_user: Optional[CurrentUser] = Depends(get_optional_user) - ) -> dict: - """ - Returnează statusul de autentificare (endpoint public) - - Args: - current_user: Utilizatorul curent (opțional) - - Returns: - Statusul de autentificare - """ - if current_user: - return { - "authenticated": True, - "username": current_user.username, - "companies_count": len(current_user.companies), - "permissions": current_user.permissions - } - else: - return { - "authenticated": False, - "username": None, - "companies_count": 0, - "permissions": [] - } - - # Rute de administrare (opționale) - if include_admin_routes: - - @router.get("/admin/stats", response_model=AuthStats) - async def get_auth_stats( - current_user: CurrentUser = Depends(get_current_user) - ) -> AuthStats: - """ - Returnează statistici despre sistemul de autentificare - - Necesită permisiuni de admin. - """ - # Verifică permisiuni admin - if "admin" not in current_user.permissions: - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, - detail="Admin permissions required" - ) - - cache_stats = auth_service.get_cache_stats() - - return AuthStats( - total_users=1, # Placeholder - poate fi implementat - active_sessions=1, # Placeholder - poate fi implementat - cache_hit_ratio=cache_stats.get('cache_hit_ratio', 0), - last_cleanup=datetime.now() - ) - - @router.post("/admin/refresh-cache") - async def refresh_user_cache( - username: Optional[str] = None, - current_user: CurrentUser = Depends(get_current_user) - ) -> dict: - """ - Reîmprospătează cache-ul utilizatorilor - - Necesită permisiuni de admin. - """ - if "admin" not in current_user.permissions: - raise HTTPException( - status_code=status.HTTP_403_FORBIDDEN, - detail="Admin permissions required" - ) - - if username: - success = await auth_service.refresh_user_data(username) - return { - "message": f"Cache refreshed for user {username}", - "success": success - } - else: - auth_service.clear_cache() - return {"message": "All user cache cleared"} - - return router - - -# Router implicit pentru folosire rapidă -auth_router = create_auth_router() - -# Router cu rute de admin incluse -auth_router_with_admin = create_auth_router(include_admin_routes=True) \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/auth/test_auth.py b/deploy-package-20260223-151231/shared/auth/test_auth.py deleted file mode 100644 index 78258c5..0000000 --- a/deploy-package-20260223-151231/shared/auth/test_auth.py +++ /dev/null @@ -1,559 +0,0 @@ -""" -Comprehensive Authentication Tests pentru ROA2WEB - -Acest modul conține teste pentru toate componentele sistemului de autentificare: -- JWT Handler functionality -- Oracle authentication service -- FastAPI dependencies și middleware -- Rate limiting și security features - -Testele acoperă: -- Unit tests pentru funcționalitatea de bază -- Integration tests cu Oracle database (mock) -- Security tests pentru vulnerabilități comune -- Performance tests pentru scalabilitate -""" - -import pytest -import asyncio -import os -import time -from datetime import datetime, timedelta -from unittest.mock import Mock, AsyncMock, patch, MagicMock -from typing import List, Dict, Any, Optional - -import jwt as pyjwt -from fastapi import FastAPI, HTTPException, status -from fastapi.testclient import TestClient -from httpx import AsyncClient - -# Import modulele de testat -from .jwt_handler import JWTHandler, TokenData, TokenResponse -from .auth_service import UserAuthService, AuthenticationError -from .models import ( - LoginRequest, CurrentUser, PermissionType, - CompanyAccessRequest, CompanyAccessResponse -) -from .middleware import AuthenticationMiddleware, RateLimiter -from .dependencies import ( - get_current_user_from_token, require_company_access, - require_permissions, get_current_company_from_header -) -from .routes import create_auth_router - - -class TestJWTHandler: - """Test suite pentru JWT Handler""" - - @pytest.fixture - def jwt_handler(self): - """Fixture pentru JWT handler cu configurare de test""" - return JWTHandler( - secret_key="test-secret-key", - algorithm="HS256" - ) - - def test_create_access_token(self, jwt_handler): - """Test pentru crearea access token-urilor""" - username = "testuser" - companies = ["COMP1", "COMP2"] - permissions = ["read", "write"] - - token = jwt_handler.create_access_token( - username=username, - companies=companies, - user_id=123, - permissions=permissions - ) - - assert isinstance(token, str) - assert len(token) > 0 - - # Verifică că token-ul poate fi decodat - payload = pyjwt.decode(token, "test-secret-key", algorithms=["HS256"]) - assert payload["username"] == username - assert payload["companies"] == companies - assert payload["permissions"] == permissions - assert payload["user_id"] == 123 - assert payload["type"] == "access" - - def test_create_refresh_token(self, jwt_handler): - """Test pentru crearea refresh token-urilor""" - username = "testuser" - user_id = 123 - - token = jwt_handler.create_refresh_token(username, user_id) - - assert isinstance(token, str) - assert len(token) > 0 - - # Verifică payload-ul - payload = pyjwt.decode(token, "test-secret-key", algorithms=["HS256"]) - assert payload["username"] == username - assert payload["user_id"] == user_id - assert payload["type"] == "refresh" - - def test_verify_valid_token(self, jwt_handler): - """Test pentru verificarea token-urilor valide""" - username = "testuser" - companies = ["COMP1"] - - token = jwt_handler.create_access_token(username, companies) - token_data = jwt_handler.verify_token(token) - - assert token_data is not None - assert isinstance(token_data, TokenData) - assert token_data.username == username - assert token_data.companies == companies - assert token_data.token_type == "access" - - def test_verify_expired_token(self, jwt_handler): - """Test pentru token-uri expirate""" - # Creează token cu expirare în trecut - past_time = datetime.utcnow() - timedelta(minutes=10) - payload = { - "username": "testuser", - "companies": ["COMP1"], - "permissions": ["read"], - "exp": past_time, - "iat": past_time - timedelta(minutes=5), - "type": "access" - } - - expired_token = pyjwt.encode(payload, "test-secret-key", algorithm="HS256") - token_data = jwt_handler.verify_token(expired_token) - - assert token_data is None - - def test_verify_invalid_token(self, jwt_handler): - """Test pentru token-uri invalide""" - invalid_tokens = [ - "invalid.token.here", - "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.invalid", - "", - None - ] - - for invalid_token in invalid_tokens: - if invalid_token is not None: - token_data = jwt_handler.verify_token(invalid_token) - assert token_data is None - - def test_create_token_response(self, jwt_handler): - """Test pentru crearea răspunsului complet cu token-uri""" - username = "testuser" - companies = ["COMP1", "COMP2"] - permissions = ["read", "reports"] - - response = jwt_handler.create_token_response( - username=username, - companies=companies, - permissions=permissions, - include_refresh=True - ) - - assert isinstance(response, TokenResponse) - assert response.access_token is not None - assert response.refresh_token is not None - assert response.token_type == "bearer" - assert response.expires_in > 0 - - def test_refresh_access_token(self, jwt_handler): - """Test pentru refresh-ul access token-urilor""" - username = "testuser" - refresh_token = jwt_handler.create_refresh_token(username, 123) - companies = ["COMP1", "COMP2"] - - new_access_token = jwt_handler.refresh_access_token( - refresh_token, companies, ["read", "write"] - ) - - assert new_access_token is not None - - # Verifică noul token - token_data = jwt_handler.verify_token(new_access_token) - assert token_data.username == username - assert token_data.companies == companies - assert token_data.token_type == "access" - - -class TestUserAuthService: - """Test suite pentru User Authentication Service""" - - @pytest.fixture - def auth_service(self): - """Fixture pentru auth service cu mock database""" - return UserAuthService() - - @pytest.fixture - def mock_oracle_pool(self): - """Mock pentru Oracle connection pool""" - with patch('roa2web.shared.auth.auth_service.oracle_pool') as mock_pool: - yield mock_pool - - @pytest.mark.asyncio - async def test_verify_user_credentials_success(self, auth_service, mock_oracle_pool): - """Test pentru verificarea cu succes a credențialelor""" - # Mock pentru conexiunea Oracle - mock_connection = AsyncMock() - mock_cursor = MagicMock() - mock_cursor.fetchone.return_value = [1] # Success - mock_connection.__aenter__.return_value = mock_connection - mock_connection.cursor.return_value.__enter__.return_value = mock_cursor - mock_oracle_pool.get_connection.return_value = mock_connection - - result = await auth_service.verify_user_credentials("testuser", "password") - - assert result is True - mock_cursor.execute.assert_called_once() - - @pytest.mark.asyncio - async def test_verify_user_credentials_failure(self, auth_service, mock_oracle_pool): - """Test pentru verificarea eșuată a credențialelor""" - # Mock pentru conexiunea Oracle - mock_connection = AsyncMock() - mock_cursor = MagicMock() - mock_cursor.fetchone.return_value = [0] # Failure - mock_connection.__aenter__.return_value = mock_connection - mock_connection.cursor.return_value.__enter__.return_value = mock_cursor - mock_oracle_pool.get_connection.return_value = mock_connection - - result = await auth_service.verify_user_credentials("testuser", "wrongpassword") - - assert result is False - - @pytest.mark.asyncio - async def test_get_user_companies(self, auth_service, mock_oracle_pool): - """Test pentru obținerea firmelor utilizatorului""" - # Mock pentru conexiunea Oracle - mock_connection = AsyncMock() - mock_cursor = MagicMock() - mock_cursor.fetchall.return_value = [["COMP1"], ["COMP2"], ["COMP3"]] - mock_connection.__aenter__.return_value = mock_connection - mock_connection.cursor.return_value.__enter__.return_value = mock_cursor - mock_oracle_pool.get_connection.return_value = mock_connection - - companies = await auth_service.get_user_companies("testuser") - - assert companies == ["COMP1", "COMP2", "COMP3"] - mock_cursor.execute.assert_called_once() - - @pytest.mark.asyncio - async def test_authenticate_and_create_tokens_success(self, auth_service, mock_oracle_pool): - """Test pentru autentificare completă cu succes""" - # Mock pentru conexiunea Oracle - mock_connection = AsyncMock() - mock_cursor = MagicMock() - - # Prima chiamată pentru verificare credențiale (succes) - # A doua chiamată pentru obținerea firmelor - mock_cursor.fetchone.return_value = [1] - mock_cursor.fetchall.return_value = [["COMP1"], ["COMP2"]] - - mock_connection.__aenter__.return_value = mock_connection - mock_connection.cursor.return_value.__enter__.return_value = mock_cursor - mock_oracle_pool.get_connection.return_value = mock_connection - - success, token_response, error = await auth_service.authenticate_and_create_tokens( - "testuser", "password" - ) - - assert success is True - assert token_response is not None - assert isinstance(token_response, TokenResponse) - assert error is None - - @pytest.mark.asyncio - async def test_authenticate_and_create_tokens_failure(self, auth_service, mock_oracle_pool): - """Test pentru autentificare eșuată""" - # Mock pentru conexiunea Oracle - mock_connection = AsyncMock() - mock_cursor = MagicMock() - mock_cursor.fetchone.return_value = [0] # Credențiale invalide - mock_connection.__aenter__.return_value = mock_connection - mock_connection.cursor.return_value.__enter__.return_value = mock_cursor - mock_oracle_pool.get_connection.return_value = mock_connection - - success, token_response, error = await auth_service.authenticate_and_create_tokens( - "testuser", "wrongpassword" - ) - - assert success is False - assert token_response is None - assert error is not None - - @pytest.mark.asyncio - async def test_validate_user_company_access(self, auth_service, mock_oracle_pool): - """Test pentru validarea accesului la firmă""" - # Mock pentru conexiunea Oracle - mock_connection = AsyncMock() - mock_cursor = MagicMock() - mock_cursor.fetchall.return_value = [["COMP1"], ["COMP2"]] - mock_connection.__aenter__.return_value = mock_connection - mock_connection.cursor.return_value.__enter__.return_value = mock_cursor - mock_oracle_pool.get_connection.return_value = mock_connection - - # Test acces valid - has_access = await auth_service.validate_user_company_access("testuser", "COMP1") - assert has_access is True - - # Test acces invalid - has_access = await auth_service.validate_user_company_access("testuser", "COMP3") - assert has_access is False - - def test_cache_functionality(self, auth_service): - """Test pentru funcționalitatea de cache""" - # Test cache stats - stats = auth_service.get_cache_stats() - assert isinstance(stats, dict) - assert 'total_entries' in stats - assert 'valid_entries' in stats - assert 'cache_hit_ratio' in stats - - # Test clear cache - auth_service.clear_cache() - stats_after_clear = auth_service.get_cache_stats() - assert stats_after_clear['total_entries'] == 0 - - -class TestRateLimiter: - """Test suite pentru Rate Limiter""" - - @pytest.fixture - def rate_limiter(self): - """Fixture pentru rate limiter""" - return RateLimiter(max_requests=3, time_window=5) - - def test_rate_limiting_within_limit(self, rate_limiter): - """Test pentru request-uri în limita permisă""" - client_ip = "192.168.1.1" - - # Primele 3 request-uri trebuie să fie permise - for i in range(3): - assert rate_limiter.is_allowed(client_ip) is True - - # Al 4-lea request trebuie refuzat - assert rate_limiter.is_allowed(client_ip) is False - - def test_rate_limiting_reset_after_time(self, rate_limiter): - """Test pentru resetarea rate limiting după expirarea ferestrei""" - client_ip = "192.168.1.2" - - # Consumă toate request-urile - for i in range(3): - assert rate_limiter.is_allowed(client_ip) is True - - # Request-ul următor trebuie refuzat - assert rate_limiter.is_allowed(client_ip) is False - - # Simulează trecerea timpului - time.sleep(6) - - # Acum ar trebui să funcționeze din nou - assert rate_limiter.is_allowed(client_ip) is True - - def test_rate_limiting_different_ips(self, rate_limiter): - """Test pentru rate limiting pe IP-uri diferite""" - ip1 = "192.168.1.1" - ip2 = "192.168.1.2" - - # Consumă toate request-urile pentru primul IP - for i in range(3): - assert rate_limiter.is_allowed(ip1) is True - assert rate_limiter.is_allowed(ip1) is False - - # Al doilea IP ar trebui să funcționeze normal - for i in range(3): - assert rate_limiter.is_allowed(ip2) is True - - -class TestAuthenticationRoutes: - """Test suite pentru rutele de autentificare""" - - @pytest.fixture - def app(self): - """Fixture pentru aplicația FastAPI de test""" - app = FastAPI() - auth_router = create_auth_router() - app.include_router(auth_router) - return app - - @pytest.fixture - def client(self, app): - """Fixture pentru client de test""" - return TestClient(app) - - @pytest.fixture - def mock_auth_service(self): - """Mock pentru auth service""" - with patch('roa2web.shared.auth.routes.auth_service') as mock_service: - yield mock_service - - def test_login_success(self, client, mock_auth_service): - """Test pentru login cu succes""" - # Mock pentru autentificare cu succes - mock_token_response = TokenResponse( - access_token="test-access-token", - refresh_token="test-refresh-token", - token_type="bearer", - expires_in=1800, - user=CurrentUser( - username="testuser", - companies=["COMP1", "COMP2"], - permissions=[PermissionType.READ, PermissionType.REPORTS] - ) - ) - - mock_auth_service.authenticate_and_create_tokens.return_value = ( - True, mock_token_response, None - ) - mock_auth_service.get_user_companies.return_value = ["COMP1", "COMP2"] - - response = client.post("/auth/login", json={ - "username": "testuser", - "password": "password" - }) - - assert response.status_code == 200 - data = response.json() - assert data["access_token"] == "test-access-token" - assert data["token_type"] == "bearer" - assert data["user"]["username"] == "testuser" - - def test_login_failure(self, client, mock_auth_service): - """Test pentru login eșuat""" - mock_auth_service.authenticate_and_create_tokens.return_value = ( - False, None, "Invalid credentials" - ) - - response = client.post("/auth/login", json={ - "username": "testuser", - "password": "wrongpassword" - }) - - assert response.status_code == 401 - assert "Invalid credentials" in response.json()["detail"] - - def test_protected_endpoint_without_token(self, client): - """Test pentru endpoint protejat fără token""" - response = client.get("/auth/me") - assert response.status_code == 401 - - def test_protected_endpoint_with_valid_token(self, client): - """Test pentru endpoint protejat cu token valid""" - # Creează un token de test - jwt_handler = JWTHandler(secret_key="test-secret-key") - token = jwt_handler.create_access_token( - username="testuser", - companies=["COMP1"], - permissions=["read"] - ) - - with patch('roa2web.shared.auth.dependencies.jwt_handler', jwt_handler): - response = client.get("/auth/me", headers={ - "Authorization": f"Bearer {token}" - }) - - assert response.status_code == 200 - data = response.json() - assert data["username"] == "testuser" - - -class TestSecurityFeatures: - """Test suite pentru funcții de securitate""" - - def test_jwt_token_tampering(self): - """Test pentru detectarea modificării token-urilor JWT""" - jwt_handler = JWTHandler(secret_key="test-secret-key") - token = jwt_handler.create_access_token("testuser", ["COMP1"]) - - # Modifică token-ul - tampered_token = token[:-5] + "XXXXX" - - # Token-ul modificat trebuie să fie invalid - token_data = jwt_handler.verify_token(tampered_token) - assert token_data is None - - def test_jwt_secret_key_different(self): - """Test pentru token-uri semnate cu chei diferite""" - jwt_handler1 = JWTHandler(secret_key="secret1") - jwt_handler2 = JWTHandler(secret_key="secret2") - - token = jwt_handler1.create_access_token("testuser", ["COMP1"]) - - # Token-ul nu trebuie să fie valid cu o cheie diferită - token_data = jwt_handler2.verify_token(token) - assert token_data is None - - @pytest.mark.asyncio - async def test_sql_injection_prevention(self): - """Test pentru prevenirea SQL injection""" - auth_service = UserAuthService() - - with patch('roa2web.shared.auth.auth_service.oracle_pool') as mock_pool: - mock_connection = AsyncMock() - mock_cursor = MagicMock() - mock_connection.__aenter__.return_value = mock_connection - mock_connection.cursor.return_value.__enter__.return_value = mock_cursor - mock_oracle_pool.get_connection.return_value = mock_connection - - # Încearcă SQL injection în username - malicious_username = "admin'; DROP TABLE users; --" - - await auth_service.verify_user_credentials(malicious_username, "password") - - # Verifică că query-ul folosește parametri legați - mock_cursor.execute.assert_called_once() - call_args = mock_cursor.execute.call_args - assert ':username' in call_args[0][0] # Query cu parametri - assert malicious_username.upper() == call_args[1]['username'] # Parametri legați - - -@pytest.mark.performance -class TestPerformance: - """Test suite pentru performanță""" - - def test_jwt_token_creation_performance(self): - """Test pentru performanța creării token-urilor""" - jwt_handler = JWTHandler(secret_key="test-secret-key") - - start_time = time.time() - - # Creează 1000 de token-uri - for i in range(1000): - jwt_handler.create_access_token(f"user{i}", ["COMP1"]) - - end_time = time.time() - total_time = end_time - start_time - - # Ar trebui să dureze mai puțin de 1 secundă - assert total_time < 1.0 - print(f"Created 1000 tokens in {total_time:.4f} seconds") - - def test_jwt_token_verification_performance(self): - """Test pentru performanța verificării token-urilor""" - jwt_handler = JWTHandler(secret_key="test-secret-key") - - # Creează 100 de token-uri - tokens = [] - for i in range(100): - token = jwt_handler.create_access_token(f"user{i}", ["COMP1"]) - tokens.append(token) - - start_time = time.time() - - # Verifică toate token-urile - for token in tokens: - jwt_handler.verify_token(token) - - end_time = time.time() - total_time = end_time - start_time - - # Ar trebui să dureze mai puțin de 0.5 secunde - assert total_time < 0.5 - print(f"Verified 100 tokens in {total_time:.4f} seconds") - - -if __name__ == "__main__": - # Rulează testele - pytest.main([__file__, "-v", "--tb=short"]) \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/database/README.md b/deploy-package-20260223-151231/shared/database/README.md deleted file mode 100644 index dde30ce..0000000 --- a/deploy-package-20260223-151231/shared/database/README.md +++ /dev/null @@ -1,124 +0,0 @@ -# ROA2WEB Shared Database Pool - -Sistem de pool de conexiuni Oracle partajat între toate microserviciile ROA2WEB. - -## Componente - -### 📦 oracle_pool.py -Clasa singleton `OraclePool` pentru gestionarea pool-ului de conexiuni Oracle. - -### 📋 models.py -Modele Pydantic comune: -- `User` - Model pentru utilizatori -- `Company` - Model pentru firme/scheme Oracle -- `DatabaseConfig` - Configurare conexiune database - -### ⚙️ config.py (în utils/) -Configurări partajate prin environment variables. - -### ❌ exceptions.py (în utils/) -Exception handlers personalizate pentru ROA2WEB. - -## Utilizare - -### Inițializare în aplicații FastAPI - -```python -from contextlib import asynccontextmanager -from fastapi import FastAPI -import sys -import os - -# Import shared pool -sys.path.append(os.path.join(os.path.dirname(__file__), '../../../shared')) -from database.oracle_pool import oracle_pool - -@asynccontextmanager -async def lifespan(app: FastAPI): - # Startup - inițializare pool - await oracle_pool.initialize() - print("📊 Oracle pool initialized") - - yield - - # Shutdown - închidere pool - await oracle_pool.close_pool() - print("📊 Oracle pool closed") - -app = FastAPI(lifespan=lifespan) -``` - -### Utilizare conexiune în endpoint-uri - -```python -from fastapi import APIRouter, HTTPException -from database.oracle_pool import oracle_pool - -router = APIRouter() - -@router.get("/companies") -async def get_companies(): - try: - async with oracle_pool.get_connection() as conn: - with conn.cursor() as cursor: - cursor.execute("SELECT schema, firma FROM vdef_util_grup WHERE id_firma <> 0") - results = cursor.fetchall() - - companies = [] - for row in results: - companies.append({ - "code": row[0], - "name": row[1] - }) - - return companies - - except Exception as e: - raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") -``` - -### Configurare Environment Variables - -```bash -# Oracle Database -ORACLE_USER=your_oracle_username -ORACLE_PASSWORD=your_oracle_password -ORACLE_DSN=your_oracle_dsn - -# Pool Settings -DB_MIN_CONNECTIONS=2 -DB_MAX_CONNECTIONS=10 -DB_CONNECTION_INCREMENT=1 - -# JWT (pentru autentificare) -JWT_SECRET_KEY=your-super-secret-key -ACCESS_TOKEN_EXPIRE_MINUTES=30 -``` - -## Testare - -Pentru a testa pool-ul de conexiuni: - -```bash -cd roa2web/shared/database -python test_pool.py -``` - -**Notă**: Testul necesită configurarea variabilelor de environment pentru Oracle. - -## Caracteristici - -✅ **Singleton Pattern** - O singură instanță de pool pentru toată aplicația -✅ **Async Context Manager** - Gestionare automată a conexiunilor -✅ **Connection Pooling** - Performanță optimizată prin reutilizarea conexiunilor -✅ **Configurabil** - Setări flexibile prin environment variables -✅ **Logging** - Urmărirea operațiilor de pool -✅ **Error Handling** - Excepții personalizate pentru debugging - -## Următorii Pași - -👉 **ZIUA 3**: Implementarea sistemului JWT partajat (`shared/auth/`) - ---- - -*Documentație generată pentru ROA2WEB Shared Database Pool - ZIUA 2* 🚀 \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/database/__init__.py b/deploy-package-20260223-151231/shared/database/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/shared/database/models.py b/deploy-package-20260223-151231/shared/database/models.py deleted file mode 100644 index dba5dc7..0000000 --- a/deploy-package-20260223-151231/shared/database/models.py +++ /dev/null @@ -1,30 +0,0 @@ -""" -Modele comune pentru toate aplicațiile ROA2WEB -""" -from pydantic import BaseModel, Field -from typing import List, Optional, Dict -from datetime import datetime - -class Company(BaseModel): - """Model pentru firma/schema Oracle""" - code: str = Field(description="Codul firmei (schema Oracle)") - name: str = Field(description="Numele firmei") - fiscal_code: Optional[str] = Field(description="Codul fiscal") - is_active: bool = Field(default=True, description="Firma activă") - -class User(BaseModel): - """Model pentru utilizator""" - username: str = Field(description="Numele utilizatorului") - email: Optional[str] = Field(description="Email utilizator") - companies: List[str] = Field(description="Lista codurilor firmelor la care are acces") - is_active: bool = Field(default=True, description="Utilizator activ") - last_login: Optional[datetime] = Field(description="Ultima autentificare") - -class DatabaseConfig(BaseModel): - """Configurare conexiune bază de date""" - user: str - password: str - dsn: str - min_connections: int = 2 - max_connections: int = 10 - increment: int = 1 \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/database/oracle_pool.py b/deploy-package-20260223-151231/shared/database/oracle_pool.py deleted file mode 100644 index d44b994..0000000 --- a/deploy-package-20260223-151231/shared/database/oracle_pool.py +++ /dev/null @@ -1,276 +0,0 @@ -""" -Oracle Database Connection Pool - Multi-Server Support for ROA2WEB - -Uses ORACLE_SERVERS from .env for server configuration. -Pool-uri sunt create lazy (la prima conexiune pe fiecare server) pentru optimizare. -""" -import asyncio -import oracledb -from contextlib import asynccontextmanager -from typing import Optional, Dict, Any -import logging - -logger = logging.getLogger(__name__) - - -class OracleMultiPool: - """ - Multi-tenant Oracle connection pool manager. - - Supports: - - Multiple Oracle servers with separate pools: {server_id: pool} - - Lazy pool creation (created on first connection) - - First registered server used when no server_id specified - - Graceful shutdown of all pools - """ - _instance: Optional['OracleMultiPool'] = None - _pools: Dict[str, oracledb.ConnectionPool] - _pool_configs: Dict[str, Dict[str, Any]] - _pool_lock: asyncio.Lock - _initialized: bool - - def __new__(cls): - if cls._instance is None: - cls._instance = super(OracleMultiPool, cls).__new__(cls) - cls._instance._pools = {} - cls._instance._pool_configs = {} - cls._instance._pool_lock = asyncio.Lock() - cls._instance._initialized = False - return cls._instance - - async def initialize(self): - """ - Initialize pool manager. - - Call this after registering servers with register_server(). - Pools are created lazily on first connection. - """ - if self._initialized: - logger.debug("Pool manager already initialized") - return - - self._initialized = True - logger.info("Oracle pool manager initialized") - - def register_server( - self, - server_id: str, - host: str, - port: int, - user: str, - password: str, - sid: Optional[str] = None, - service_name: Optional[str] = None, - min_connections: int = 2, - max_connections: int = 10, - **kwargs - ) -> None: - """ - Register a server configuration for lazy pool creation. - - Pool will be created on first get_connection(server_id) call. - """ - self._pool_configs[server_id] = { - 'host': host, - 'port': port, - 'user': user, - 'password': password, - 'sid': sid, - 'service_name': service_name, - 'min_connections': min_connections, - 'max_connections': max_connections, - } - logger.info(f"Registered server '{server_id}' ({host}:{port}) for lazy pool creation") - - async def _get_or_create_pool(self, server_id: str) -> oracledb.ConnectionPool: - """ - Get existing pool or create new one (lazy loading). - - Thread-safe: uses asyncio.Lock to prevent duplicate pool creation. - """ - # Fast path: pool already exists - if server_id in self._pools: - return self._pools[server_id] - - # Slow path: need to create pool - async with self._pool_lock: - # Double-check after acquiring lock - if server_id in self._pools: - return self._pools[server_id] - - # Check if server is registered - if server_id not in self._pool_configs: - raise ValueError(f"Server '{server_id}' not registered. Call register_server() first.") - - config = self._pool_configs[server_id] - logger.info(f"Creating pool for server '{server_id}' (lazy initialization)...") - - pool_params = { - 'user': config['user'], - 'password': config['password'], - 'host': config['host'], - 'port': config['port'], - 'min': config['min_connections'], - 'max': config['max_connections'], - 'increment': 1, - 'getmode': oracledb.POOL_GETMODE_WAIT - } - - if config.get('service_name'): - pool_params['service_name'] = config['service_name'] - elif config.get('sid'): - pool_params['sid'] = config['sid'] - else: - pool_params['service_name'] = 'ROA' - - pool = oracledb.create_pool(**pool_params) - self._pools[server_id] = pool - - logger.info(f"Pool created for server '{server_id}' with {pool.opened} connections") - return pool - - def _get_first_server_id(self) -> str: - """Get the first registered server ID.""" - if not self._pool_configs: - raise RuntimeError("No servers registered. Call register_server() first.") - return next(iter(self._pool_configs)) - - @asynccontextmanager - async def get_connection(self, server_id: Optional[str] = None): - """ - Context manager pentru obținerea unei conexiuni din pool. - - Args: - server_id: ID-ul serverului. Dacă None, folosește primul server înregistrat. - - Usage: - # Explicit server - async with oracle_pool.get_connection('romfast') as conn: - ... - - # First registered server (when only one server configured) - async with oracle_pool.get_connection() as conn: - ... - """ - connection = None - pool = None - - try: - if server_id is None: - # Use first registered server - server_id = self._get_first_server_id() - logger.debug(f"No server_id specified, using first registered: '{server_id}'") - - pool = await self._get_or_create_pool(server_id) - connection = pool.acquire() - logger.debug(f"Connection acquired from pool (server_id={server_id})") - yield connection - - finally: - if connection is not None: - connection.close() - logger.debug(f"Connection returned to pool (server_id={server_id})") - - async def execute_query(self, query: str, parameters=None, server_id: Optional[str] = None): - """ - Execute a SQL query and return all results. - - Args: - query: SQL query string - parameters: Query parameters (dict or tuple) - server_id: Server ID (optional, uses first server if not specified) - """ - async with self.get_connection(server_id) as connection: - logger.debug(f"Executing query on server '{server_id}': {query[:100]}...") - - with connection.cursor() as cursor: - if parameters: - cursor.execute(query, parameters) - else: - cursor.execute(query) - - # Check if this is a SELECT statement - if query.strip().upper().startswith('SELECT') or query.strip().upper().startswith('WITH'): - return cursor.fetchall() - else: - # For DML statements, return affected row count - connection.commit() - return cursor.rowcount - - async def close_pool(self, server_id: Optional[str] = None): - """ - Close a specific pool or all pools. - - Args: - server_id: Close specific pool. If None, close all pools. - """ - if server_id is not None: - # Close specific pool - if server_id in self._pools: - self._pools[server_id].close() - del self._pools[server_id] - logger.info(f"Closed pool for server '{server_id}'") - else: - # Close all pools (graceful shutdown) - for srv_id, pool in list(self._pools.items()): - pool.close() - logger.info(f"Closed pool for server '{srv_id}'") - - self._pools.clear() - self._initialized = False - logger.info("All Oracle pools closed") - - def get_pool_stats(self, server_id: Optional[str] = None) -> Dict[str, Any]: - """ - Get statistics for pool(s). - - Args: - server_id: Get stats for specific server. If None, get all stats. - - Returns: - Dict with pool statistics (opened, busy, min, max connections) - """ - stats = {} - - if server_id is not None: - pool = self._pools.get(server_id) - if pool: - stats[server_id] = { - 'opened': pool.opened, - 'busy': pool.busy, - 'min': pool.min, - 'max': pool.max, - } - else: - for srv_id, pool in self._pools.items(): - stats[srv_id] = { - 'opened': pool.opened, - 'busy': pool.busy, - 'min': pool.min, - 'max': pool.max, - } - - return stats - - def is_server_registered(self, server_id: str) -> bool: - """Check if a server is registered (config exists).""" - return server_id in self._pool_configs - - def is_pool_active(self, server_id: str) -> bool: - """Check if a pool is active (created) for a server.""" - return server_id in self._pools - - def get_registered_servers(self) -> list: - """Get list of registered server IDs.""" - return list(self._pool_configs.keys()) - - def get_active_pools(self) -> list: - """Get list of server IDs with active pools.""" - return list(self._pools.keys()) - - -# Backward compatibility alias -OraclePool = OracleMultiPool - -# Global instance -oracle_pool = OracleMultiPool() diff --git a/deploy-package-20260223-151231/shared/database/test_pool.py b/deploy-package-20260223-151231/shared/database/test_pool.py deleted file mode 100644 index 38478e2..0000000 --- a/deploy-package-20260223-151231/shared/database/test_pool.py +++ /dev/null @@ -1,69 +0,0 @@ -""" -Test script pentru verificarea conexiunii Oracle pool -""" -import asyncio -import sys -import os -from datetime import datetime - -# Load environment variables -try: - from dotenv import load_dotenv - # Load .env from roa2web root directory - env_path = os.path.join(os.path.dirname(__file__), '../../.env') - load_dotenv(env_path) - print(f"📄 Loaded environment from: {env_path}") -except ImportError: - print("⚠️ python-dotenv not available, using system environment variables") - -# Adăugare path pentru shared modules -sys.path.append(os.path.dirname(__file__)) - -from oracle_pool import oracle_pool - -async def test_oracle_pool(): - """Test simplu pentru verificarea pool-ului Oracle""" - print("🔄 Testing Oracle connection pool...") - - try: - # Inițializare pool - print("📊 Initializing Oracle pool...") - await oracle_pool.initialize() - print("✅ Pool initialized successfully") - - # Test conexiune - print("🔍 Testing database connection...") - async with oracle_pool.get_connection() as conn: - with conn.cursor() as cursor: - cursor.execute("SELECT 1 FROM DUAL") - result = cursor.fetchone() - print(f"✅ Database connection test successful: {result}") - - print("🎯 Testing connection pool info...") - if oracle_pool._pool: - print(f"📈 Pool connections opened: {oracle_pool._pool.opened}") - print(f"📊 Pool connections busy: {oracle_pool._pool.busy}") - - # Cleanup - print("🧹 Closing pool...") - await oracle_pool.close_pool() - print("✅ Pool closed successfully") - - print("\n🎉 All tests passed! Oracle pool is working correctly.") - - except Exception as e: - print(f"❌ Error testing Oracle pool: {str(e)}") - print(f"💡 Make sure environment variables are set:") - print(f" - ORACLE_USER: {'✅ SET' if os.getenv('ORACLE_USER') else '❌ NOT SET'}") - print(f" - ORACLE_PASSWORD: {'✅ SET' if os.getenv('ORACLE_PASSWORD') else '❌ NOT SET'}") - print(f" - ORACLE_DSN: {'✅ SET' if os.getenv('ORACLE_DSN') else '❌ NOT SET'}") - return False - - return True - -if __name__ == "__main__": - print(f"🚀 ROA2WEB Oracle Pool Test - {datetime.now()}") - print("=" * 50) - - success = asyncio.run(test_oracle_pool()) - sys.exit(0 if success else 1) \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/docs/MULTI_TENANT_UPGRADE_PLAN.md b/deploy-package-20260223-151231/shared/docs/MULTI_TENANT_UPGRADE_PLAN.md deleted file mode 100644 index 369a211..0000000 --- a/deploy-package-20260223-151231/shared/docs/MULTI_TENANT_UPGRADE_PLAN.md +++ /dev/null @@ -1,2501 +0,0 @@ -# Plan Upgrade Multi-Tenant Architecture - ROA2WEB - -**Version:** 1.0 -**Created:** 2025-10-25 -**Status:** Planning Phase - ---- - -## 📋 Sumar Executiv - -ROA2WEB va fi transformat de la o aplicație **single-tenant** (un singur client, o singură bază de date Oracle) la o arhitectură **multi-tenant SaaS** care suportă: - -- **Multiple clienți simultaneous** cu izolare completă între tenants (pool-uri, cache, audit logs) -- **Conexiuni hibride**: SSH tunnel pentru clienți remote SAU direct TCP pentru clienți în LAN -- **Deployment flexibil**: Development (WSL), Docker (Proxmox LXC), Windows IIS -- **Backward compatibility**: Tenant "default" funcționează exact ca single-tenant actual (zero breaking changes) -- **Gradual migration**: Fiecare fază testabilă independent, rollout incremental -- **Security-first**: Passwords encrypted în tenant DB, SSH keys read-only, JWT signing per tenant -- **Performance**: < 10% overhead vs single-tenant, izolare pool-uri per tenant - ---- - -## 🏗️ Arhitectură Target - -### Single-Tenant (Actual) - -``` -┌─────────────────────────────────────────────────────┐ -│ FastAPI Backend │ -│ │ -│ ┌─────────────────────────────────────────────┐ │ -│ │ OraclePool (Singleton) │ │ -│ │ - Hardcoded credentials din .env │ │ -│ │ - Min: 2, Max: 10 connections │ │ -│ │ - Shared pentru toți userii │ │ -│ └─────────────────────────────────────────────┘ │ -│ ▼ │ -└──────────────────────┼──────────────────────────────┘ - │ - ┌─────────────┴───────────┐ - │ │ - SSH Tunnel Direct Connection - (Development) (Windows Production) - │ │ - ▼ ▼ -┌─────────────────┐ ┌──────────────────┐ -│ Oracle Server │ │ Oracle Server │ -│ (Remote) │ │ (Local LAN) │ -└─────────────────┘ └──────────────────┘ - -JWT Token Structure (Actual): -{ - "username": "john.doe", - "user_id": 123, - "companies": ["COMP1", "COMP2"], - "permissions": ["read", "reports"], - "exp": 1234567890, - "iat": 1234567800, - "type": "access" -} -``` - -### Multi-Tenant (Target) - -``` -┌────────────────────────────────────────────────────────────────────┐ -│ FastAPI Backend │ -│ │ -│ ┌──────────────────────────────────────────────────────────────┐ │ -│ │ MultiTenantPoolManager (New) │ │ -│ │ │ │ -│ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ -│ │ │ Client A │ │ Client B │ │ Client C │ │ │ -│ │ │ Pool (2-10) │ │ Pool (2-10) │ │ Pool (2-10) │ │ │ -│ │ │ SSH Tunnel │ │ Direct Conn │ │ SSH Tunnel │ │ │ -│ │ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │ │ -│ │ │ │ │ │ │ -│ └─────────┼─────────────────┼─────────────────┼──────────────┘ │ -│ │ │ │ │ -└────────────┼─────────────────┼─────────────────┼────────────────┘ - │ │ │ - ┌────────┴─────┐ ┌────────┴─────┐ ┌────────┴─────┐ - │ SSH Process │ │ Direct │ │ SSH Process │ - │ localhost: │ │ 192.168.1.50 │ │ localhost: │ - │ 15261 │ │ :1521 │ │ 15262 │ - └────────┬─────┘ └────────┬─────┘ └────────┬─────┘ - │ │ │ - ▼ ▼ ▼ - ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ - │ Oracle │ │ Oracle │ │ Oracle │ - │ Client A │ │ Client B │ │ Client C │ - │ (Remote) │ │ (LAN) │ │ (Remote) │ - └──────────────┘ └──────────────┘ └──────────────┘ - - ┌──────────────────────┐ - │ Tenant Config DB │ - │ (PostgreSQL/SQLite) │ - │ │ - │ - tenants │ - │ - tenant_users │ - │ - audit_logs │ - └──────────────────────┘ - -JWT Token Structure (Target): -{ - "username": "john.doe", - "user_id": 123, - "tenant_id": "client-a-uuid", ← NEW - "companies": ["COMP1", "COMP2"], - "permissions": ["read", "reports"], - "exp": 1234567890, - "iat": 1234567800, - "type": "access" -} - -Redis Cache Keys: -cache:{tenant_id}:dashboard:{company_id} ← Already prepared! -cache:{tenant_id}:invoices:{filters_hash} -``` - -### Key Architectural Decisions - -1. **Lazy Pool Initialization**: Pool-uri create doar când tenant-ul e accesat prima dată (economie memorie) -2. **SSH Tunnel per Tenant**: Subprocess separat pentru fiecare tenant remote (izolare, resilience) -3. **Tenant Config DB Separate**: Nu stocăm tenant config în Oracle (evităm dependențe circulare) -4. **JWT Tenant ID Signed**: Tenant ID e în token signed, nu poate fi modificat de client -5. **Pool Cleanup**: Pool-uri inactive > 1h se închid automat (economie resurse) -6. **Backward Compatible**: Tenant "default" mapează la .env actual (zero migration pain) - ---- - -## 🗂️ Structura Fișierelor - -### Fișiere Noi - -``` -shared/ -├── database/ -│ ├── multi_tenant_pool.py ✅ NEW - MultiTenantPoolManager class -│ ├── tenant_config.py ✅ NEW - Tenant configuration loader -│ ├── ssh_tunnel_manager.py ✅ NEW - SSH tunnel per tenant management -│ └── tenant_models.py ✅ NEW - Pydantic models for tenants -│ -├── middleware/ -│ └── tenant_middleware.py ✅ NEW - Tenant identification middleware -│ -├── schemas/ -│ └── tenant_config_schema.sql ✅ NEW - PostgreSQL/SQLite schema -│ -└── utils/ - ├── encryption.py ✅ NEW - Fernet encryption for passwords - └── tenant_utils.py ✅ NEW - Tenant helper functions - -deployment/ -├── docker/ -│ └── tenant-config-db.dockerfile ✅ NEW - PostgreSQL tenant config container -│ -└── windows/ - └── tenant-config-setup.ps1 ✅ NEW - SQL Server Express setup for tenants -``` - -### Fișiere Modificate - -``` -shared/ -├── database/ -│ └── oracle_pool.py ⚠️ MODIFY - Add DEPRECATED warning -│ -├── auth/ -│ ├── jwt_handler.py ⚠️ MODIFY - Add tenant_id to JWT payload -│ └── middleware.py ⚠️ MODIFY - Extract tenant_id, validate access -│ -└── cache/ - └── redis_client.py ⚠️ MODIFY - Use real tenant_id (not "default") - -backend/ -├── app/ -│ ├── main.py ⚠️ MODIFY - Initialize MultiTenantPoolManager -│ └── routers/ -│ ├── companies.py ⚠️ MODIFY - Use tenant_id from request.state -│ ├── dashboard.py ⚠️ MODIFY - Use tenant_id from request.state -│ ├── invoices.py ⚠️ MODIFY - Use tenant_id from request.state -│ └── treasury.py ⚠️ MODIFY - Use tenant_id from request.state -│ -└── .env.example ⚠️ MODIFY - Add tenant config DB variables - -docker-compose.yml ⚠️ MODIFY - Add tenant-config-db service - -deployment/windows/ -└── scripts/ - └── Install-ROA2WEB.ps1 ⚠️ MODIFY - Add tenant DB setup -``` - -### Database Schema (Tenant Config DB) - -**PostgreSQL/SQLite Compatible Schema** - -```sql --- shared/schemas/tenant_config_schema.sql - --- Tenants configuration table -CREATE TABLE IF NOT EXISTS tenants ( - id VARCHAR(36) PRIMARY KEY, -- UUID - name VARCHAR(255) NOT NULL, -- Display name (ex: "Client A - Retail SRL") - connection_type VARCHAR(20) NOT NULL, -- 'ssh_tunnel' | 'direct' - - -- Oracle connection details - oracle_host VARCHAR(255) NOT NULL, -- Oracle server IP/hostname - oracle_port INTEGER NOT NULL DEFAULT 1521, - oracle_sid VARCHAR(50) NOT NULL DEFAULT 'ROA', - oracle_user VARCHAR(100) NOT NULL, - oracle_password_encrypted TEXT NOT NULL, -- Fernet encrypted password - - -- SSH tunnel configuration (NULL if connection_type='direct') - ssh_host VARCHAR(255), -- SSH server IP - ssh_port INTEGER DEFAULT 22, - ssh_user VARCHAR(100), - ssh_key_path VARCHAR(500), -- Path to SSH private key - ssh_tunnel_local_port INTEGER, -- Local port for tunnel (ex: 15261) - - -- Pool configuration - min_connections INTEGER NOT NULL DEFAULT 2, - max_connections INTEGER NOT NULL DEFAULT 10, - - -- Status - is_active BOOLEAN NOT NULL DEFAULT TRUE, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - - -- Constraints - CONSTRAINT chk_connection_type CHECK (connection_type IN ('ssh_tunnel', 'direct')), - CONSTRAINT chk_ssh_config CHECK ( - (connection_type = 'direct') OR - (connection_type = 'ssh_tunnel' AND ssh_host IS NOT NULL AND ssh_key_path IS NOT NULL) - ) -); - --- Tenant users mapping (which users have access to which tenants) -CREATE TABLE IF NOT EXISTS tenant_users ( - id SERIAL PRIMARY KEY, -- Auto-increment ID - tenant_id VARCHAR(36) NOT NULL REFERENCES tenants(id) ON DELETE CASCADE, - user_id INTEGER NOT NULL, -- Oracle user ID from CONTAFIN_ORACLE.UTILIZATORI - username VARCHAR(100) NOT NULL, -- Oracle username - is_admin BOOLEAN NOT NULL DEFAULT FALSE, -- Tenant admin (can manage tenant config) - granted_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - granted_by INTEGER, -- User ID who granted access - - UNIQUE(tenant_id, user_id) -); - --- Audit logs per tenant -CREATE TABLE IF NOT EXISTS audit_logs ( - id SERIAL PRIMARY KEY, - tenant_id VARCHAR(36) NOT NULL REFERENCES tenants(id) ON DELETE CASCADE, - user_id INTEGER NOT NULL, - username VARCHAR(100) NOT NULL, - action VARCHAR(100) NOT NULL, -- 'login', 'query', 'export', etc. - resource VARCHAR(255), -- Resource accessed (ex: 'dashboard', 'invoices') - status VARCHAR(20) NOT NULL, -- 'success' | 'error' - error_message TEXT, - ip_address VARCHAR(50), - user_agent TEXT, - created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, - - -- Index for fast queries - INDEX idx_tenant_user (tenant_id, user_id), - INDEX idx_created_at (created_at) -); - --- Insert default tenant (backward compatibility) --- This maps to existing .env credentials -INSERT INTO tenants ( - id, name, connection_type, - oracle_host, oracle_port, oracle_sid, oracle_user, oracle_password_encrypted, - min_connections, max_connections, is_active -) VALUES ( - 'default', - 'Default Tenant (Single-Tenant Legacy)', - 'ssh_tunnel', -- Will be read from environment - 'localhost', -- Will be overridden by environment if needed - 1526, - 'ROA', - 'CONTAFIN_ORACLE', - 'PLACEHOLDER_ENCRYPTED_PASSWORD', -- Will be replaced by migration script - 2, - 10, - TRUE -) ON CONFLICT (id) DO NOTHING; - --- Indexes for performance -CREATE INDEX IF NOT EXISTS idx_tenants_active ON tenants(is_active); -CREATE INDEX IF NOT EXISTS idx_tenant_users_user ON tenant_users(user_id); -CREATE INDEX IF NOT EXISTS idx_audit_tenant ON audit_logs(tenant_id); -``` - ---- - -## 🚀 Faze de Upgrade - -### FAZA 1: Tenant Configuration Database (2-3 zile) - -**Obiectiv:** Creează tenant configuration database și loader pentru citirea tenant configs la startup. - -#### Tasks - -1. **Creează PostgreSQL/SQLite schema pentru tenant config** - - **Fișier:** `shared/schemas/tenant_config_schema.sql` - - **Acțiune:** Define tables `tenants`, `tenant_users`, `audit_logs` - - **Deployment:** - - Dev: SQLite (`data/tenant_config.db`) - - Docker: PostgreSQL container (`roa-tenant-config-db`) - - Windows: SQL Server Express SAU PostgreSQL Windows service - -2. **Implementează TenantConfigLoader** - - **Fișier:** `shared/database/tenant_config.py` - - **Clasa:** `TenantConfigLoader(db_url: str)` - - **Metode:** - - `async def load_tenants() -> Dict[str, TenantConfig]` - Load all active tenants - - `async def get_tenant(tenant_id: str) -> Optional[TenantConfig]` - Get specific tenant - - `async def reload_tenant(tenant_id: str)` - Reload tenant config (for updates) - - **Pattern:** Async context manager pentru DB connections - -3. **Implementează Pydantic models pentru tenant config** - - **Fișier:** `shared/database/tenant_models.py` - - **Models:** - ```python - class TenantConfig(BaseModel): - id: str # UUID - name: str - connection_type: Literal['ssh_tunnel', 'direct'] - oracle_host: str - oracle_port: int - oracle_sid: str - oracle_user: str - oracle_password: str # Decrypted - ssh_host: Optional[str] = None - ssh_port: Optional[int] = 22 - ssh_user: Optional[str] = None - ssh_key_path: Optional[str] = None - ssh_tunnel_local_port: Optional[int] = None - min_connections: int = 2 - max_connections: int = 10 - is_active: bool = True - ``` - -4. **Implementează password encryption/decryption** - - **Fișier:** `shared/utils/encryption.py` - - **Funcții:** - - `encrypt_password(password: str, key: str) -> str` - Fernet encryption - - `decrypt_password(encrypted: str, key: str) -> str` - Fernet decryption - - **Environment:** `DB_ENCRYPTION_KEY` (generate with `Fernet.generate_key()`) - -5. **Creează migration script pentru tenant default** - - **Fișier:** `shared/scripts/create_default_tenant.py` - - **Acțiune:** - - Citește credențiale din `.env` actual - - Encrypt password cu `DB_ENCRYPTION_KEY` - - Insert tenant "default" în tenant DB - - Testează decryption și Oracle connection - -6. **Update Docker Compose cu tenant config DB** - - **Fișier:** `docker-compose.yml` - - **Service nou:** - ```yaml - roa-tenant-config-db: - image: postgres:15-alpine - container_name: roa-tenant-config-db - environment: - POSTGRES_DB: tenant_config - POSTGRES_USER: tenant_admin - POSTGRES_PASSWORD: ${TENANT_DB_PASSWORD} - volumes: - - tenant-config-data:/var/lib/postgresql/data - - ./shared/schemas/tenant_config_schema.sql:/docker-entrypoint-initdb.d/schema.sql:ro - networks: - - roa-network - ``` - -7. **Update .env.example cu tenant DB variables** - ```bash - # Tenant Configuration Database - TENANT_DB_URL=postgresql://tenant_admin:password@localhost:5432/tenant_config - # For SQLite (development): sqlite:///data/tenant_config.db - DB_ENCRYPTION_KEY=GENERATE_WITH_Fernet.generate_key() - ``` - -#### Output Verificabil - -- ✅ Tenant DB se creează cu succes (PostgreSQL/SQLite) -- ✅ Schema tables create (`tenants`, `tenant_users`, `audit_logs`) -- ✅ Default tenant se încarcă cu credențiale din `.env` actual -- ✅ Password encryption/decryption funcționează -- ✅ Test: `pytest shared/tests/test_tenant_config.py -v` -- ✅ Docker: `docker-compose up roa-tenant-config-db` pornește cu succes - ---- - -### FAZA 2: MultiTenantPoolManager (3-4 zile) - -**Obiectiv:** Implementează pool manager care creează pool-uri Oracle separate per tenant cu lazy initialization. - -#### Tasks - -1. **Implementează MultiTenantPoolManager class** - - **Fișier:** `shared/database/multi_tenant_pool.py` - - **Pattern:** Singleton (similar cu `OraclePool` actual) - - **Structură:** - ```python - class MultiTenantPoolManager: - _instance: Optional['MultiTenantPoolManager'] = None - _pools: Dict[str, oracledb.ConnectionPool] = {} # tenant_id -> pool - _tenant_configs: Dict[str, TenantConfig] = {} - _pool_locks: Dict[str, asyncio.Lock] = {} # Thread-safe pool creation - _last_access: Dict[str, datetime] = {} # For cleanup inactive pools - - async def initialize(self, tenant_db_url: str): - """Load tenant configs from tenant DB""" - - async def get_connection(self, tenant_id: str): - """Context manager - get connection from tenant pool (lazy init)""" - - async def _ensure_pool(self, tenant_id: str): - """Lazy initialize pool if not exists""" - - async def reload_tenant(self, tenant_id: str): - """Reload tenant config and recreate pool""" - - async def cleanup_inactive_pools(self, max_idle_hours: int = 1): - """Close pools inactive > max_idle_hours""" - - async def close_all_pools(self): - """Shutdown - close all pools""" - ``` - -2. **Implementează lazy pool initialization** - - **Logica:** - ```python - async def _ensure_pool(self, tenant_id: str): - if tenant_id in self._pools: - self._last_access[tenant_id] = datetime.utcnow() - return # Pool already exists - - # Acquire lock pentru thread-safety - async with self._pool_locks.setdefault(tenant_id, asyncio.Lock()): - # Double-check în lock - if tenant_id in self._pools: - return - - # Load tenant config - tenant_config = await self._load_tenant_config(tenant_id) - if not tenant_config.is_active: - raise ValueError(f"Tenant {tenant_id} is not active") - - # Create pool - pool = oracledb.create_pool( - user=tenant_config.oracle_user, - password=tenant_config.oracle_password, - host=tenant_config.oracle_host, - port=tenant_config.oracle_port, - sid=tenant_config.oracle_sid, - min=tenant_config.min_connections, - max=tenant_config.max_connections, - increment=1, - getmode=oracledb.POOL_GETMODE_WAIT - ) - - self._pools[tenant_id] = pool - self._tenant_configs[tenant_id] = tenant_config - self._last_access[tenant_id] = datetime.utcnow() - logger.info(f"Created pool for tenant {tenant_id} ({tenant_config.name})") - ``` - -3. **Implementează get_connection context manager** - - **Pattern:** Same as `OraclePool.get_connection()` dar per tenant - ```python - @asynccontextmanager - async def get_connection(self, tenant_id: str): - await self._ensure_pool(tenant_id) # Lazy init - - pool = self._pools[tenant_id] - connection = None - try: - connection = pool.acquire() - self._last_access[tenant_id] = datetime.utcnow() - logger.debug(f"Connection acquired for tenant {tenant_id}") - yield connection - finally: - if connection is not None: - connection.close() - logger.debug(f"Connection returned for tenant {tenant_id}") - ``` - -4. **Implementează pool cleanup pentru inactive tenants** - - **Scheduled task:** Run every hour, close pools inactive > 1h - ```python - async def cleanup_inactive_pools(self, max_idle_hours: int = 1): - now = datetime.utcnow() - inactive_tenants = [] - - for tenant_id, last_access in self._last_access.items(): - idle_hours = (now - last_access).total_seconds() / 3600 - if idle_hours > max_idle_hours: - inactive_tenants.append(tenant_id) - - for tenant_id in inactive_tenants: - logger.info(f"Closing inactive pool for tenant {tenant_id}") - pool = self._pools.pop(tenant_id, None) - if pool: - pool.close() - self._tenant_configs.pop(tenant_id, None) - self._last_access.pop(tenant_id, None) - ``` - -5. **Implementează tenant config reload (for dynamic updates)** - - **Use case:** Admin updates tenant config în DB, aplicația reloadează fără restart - ```python - async def reload_tenant(self, tenant_id: str): - # Close existing pool - old_pool = self._pools.pop(tenant_id, None) - if old_pool: - old_pool.close() - - # Reload config from DB - tenant_config = await self._tenant_config_loader.get_tenant(tenant_id) - if not tenant_config: - raise ValueError(f"Tenant {tenant_id} not found") - - # Pool will be recreated on next request (lazy init) - self._tenant_configs.pop(tenant_id, None) - self._last_access.pop(tenant_id, None) - logger.info(f"Reloaded tenant config for {tenant_id}") - ``` - -6. **Add backward compatibility layer** - - **Tenant "default"** mapează la credențiale din `.env` pentru zero breaking changes - ```python - async def _load_default_tenant_from_env(self) -> TenantConfig: - """Fallback: Load default tenant from .env if tenant DB is not available""" - return TenantConfig( - id='default', - name='Default Tenant (Legacy)', - connection_type='ssh_tunnel' if os.getenv('ORACLE_HOST') == 'localhost' else 'direct', - oracle_host=os.getenv('ORACLE_HOST', 'localhost'), - oracle_port=int(os.getenv('ORACLE_PORT', '1526')), - oracle_sid=os.getenv('ORACLE_SID', 'ROA'), - oracle_user=os.getenv('ORACLE_USER'), - oracle_password=os.getenv('ORACLE_PASSWORD'), - min_connections=2, - max_connections=10, - is_active=True - ) - ``` - -7. **Mark OraclePool as DEPRECATED** - - **Fișier:** `shared/database/oracle_pool.py` - - **Acțiune:** Add deprecation warning - ```python - import warnings - - class OraclePool: - """ - DEPRECATED: Use MultiTenantPoolManager instead. - This class is kept for backward compatibility only. - Will be removed in version 2.0. - """ - def __init__(self): - warnings.warn( - "OraclePool is deprecated. Use MultiTenantPoolManager for multi-tenant support.", - DeprecationWarning, - stacklevel=2 - ) - # ... rest of code - ``` - -#### Output Verificabil - -- ✅ `MultiTenantPoolManager` creează pool-uri per tenant -- ✅ Lazy initialization: Pool creat doar la prima cerere -- ✅ Tenant "default" funcționează cu credențiale din `.env` (backward compatible) -- ✅ Pool cleanup: Inactive pools se închid automat după 1h -- ✅ Reload tenant: Config update fără restart aplicație -- ✅ Test: `pytest shared/tests/test_multi_tenant_pool.py -v` -- ✅ Test: Connect la 3 tenants dummy simultaneous - ---- - -### FAZA 3: SSH Tunnel Management per Tenant (2-3 zile) - -**Obiectiv:** Implementează SSH tunnel manager care creează și monitorizează subprocess SSH per tenant remote. - -#### Tasks - -1. **Implementează SSHTunnelManager class** - - **Fișier:** `shared/database/ssh_tunnel_manager.py` - - **Responsabilități:** - - Start SSH tunnel subprocess per tenant - - Monitor tunnel health (periodic checks) - - Auto-restart on failure (exponential backoff) - - Cleanup la shutdown - - **Structură:** - ```python - class SSHTunnelManager: - _tunnels: Dict[str, subprocess.Popen] = {} # tenant_id -> SSH process - _tunnel_ports: Dict[str, int] = {} # tenant_id -> local port - _restart_attempts: Dict[str, int] = {} # For exponential backoff - - async def start_tunnel(self, tenant_config: TenantConfig) -> int: - """Start SSH tunnel for tenant, return local port""" - - async def stop_tunnel(self, tenant_id: str): - """Stop SSH tunnel subprocess""" - - async def check_tunnel_health(self, tenant_id: str) -> bool: - """Check if tunnel is alive and responding""" - - async def restart_tunnel(self, tenant_id: str): - """Restart tunnel with exponential backoff""" - - async def cleanup_all_tunnels(self): - """Shutdown - kill all SSH processes""" - ``` - -2. **Implementează SSH tunnel start logic** - - **Logica:** - ```python - async def start_tunnel(self, tenant_config: TenantConfig) -> int: - tenant_id = tenant_config.id - - # Generate unique local port for this tenant - local_port = tenant_config.ssh_tunnel_local_port or self._allocate_port() - - # Build SSH command - ssh_cmd = [ - 'ssh', '-f', '-N', - '-L', f'{local_port}:{tenant_config.oracle_host}:{tenant_config.oracle_port}', - '-p', str(tenant_config.ssh_port), - '-i', tenant_config.ssh_key_path, - '-o', 'ServerAliveInterval=60', - '-o', 'ServerAliveCountMax=3', - '-o', 'ExitOnForwardFailure=yes', - f'{tenant_config.ssh_user}@{tenant_config.ssh_host}' - ] - - # Start process - process = subprocess.Popen(ssh_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) - - # Wait for tunnel to establish (max 10 seconds) - for _ in range(10): - if self._check_port_open('localhost', local_port): - break - await asyncio.sleep(1) - else: - process.kill() - raise RuntimeError(f"SSH tunnel failed to start for tenant {tenant_id}") - - self._tunnels[tenant_id] = process - self._tunnel_ports[tenant_id] = local_port - logger.info(f"SSH tunnel started for tenant {tenant_id} on port {local_port}") - - return local_port - ``` - -3. **Implementează tunnel health checks** - - **Periodic check:** Every 60 seconds, verify tunnel is alive - ```python - async def check_tunnel_health(self, tenant_id: str) -> bool: - if tenant_id not in self._tunnels: - return False - - process = self._tunnels[tenant_id] - local_port = self._tunnel_ports[tenant_id] - - # Check process is alive - if process.poll() is not None: - logger.warning(f"SSH tunnel process died for tenant {tenant_id}") - return False - - # Check port is accessible - if not self._check_port_open('localhost', local_port): - logger.warning(f"SSH tunnel port {local_port} not accessible for tenant {tenant_id}") - return False - - return True - - def _check_port_open(self, host: str, port: int) -> bool: - import socket - try: - with socket.create_connection((host, port), timeout=2): - return True - except: - return False - ``` - -4. **Implementează auto-restart cu exponential backoff** - - **Logica:** Dacă tunnel moare, restart cu delay: 5s, 10s, 20s, 40s, max 60s - ```python - async def restart_tunnel(self, tenant_id: str): - attempts = self._restart_attempts.get(tenant_id, 0) - delay = min(5 * (2 ** attempts), 60) # Exponential backoff, max 60s - - logger.info(f"Restarting tunnel for tenant {tenant_id} (attempt {attempts+1}, delay {delay}s)") - await asyncio.sleep(delay) - - try: - await self.stop_tunnel(tenant_id) - tenant_config = await self._get_tenant_config(tenant_id) - await self.start_tunnel(tenant_config) - - # Reset attempts on success - self._restart_attempts[tenant_id] = 0 - logger.info(f"Tunnel restarted successfully for tenant {tenant_id}") - except Exception as e: - self._restart_attempts[tenant_id] = attempts + 1 - logger.error(f"Tunnel restart failed for tenant {tenant_id}: {e}") - raise - ``` - -5. **Integrate SSH tunnel manager în MultiTenantPoolManager** - - **Logica:** Dacă tenant are `connection_type='ssh_tunnel'`, start tunnel înainte de pool - ```python - # În MultiTenantPoolManager._ensure_pool() - - tenant_config = await self._load_tenant_config(tenant_id) - - # Start SSH tunnel if needed - if tenant_config.connection_type == 'ssh_tunnel': - if not await self._ssh_tunnel_manager.check_tunnel_health(tenant_id): - local_port = await self._ssh_tunnel_manager.start_tunnel(tenant_config) - # Override Oracle host/port to use tunnel - tenant_config.oracle_host = 'localhost' - tenant_config.oracle_port = local_port - - # Create pool (rest of code same as before) - pool = oracledb.create_pool(...) - ``` - -6. **Implementează cleanup la shutdown** - - **Logica:** Kill all SSH processes gracefully - ```python - async def cleanup_all_tunnels(self): - for tenant_id, process in self._tunnels.items(): - try: - process.terminate() # SIGTERM - await asyncio.sleep(2) - if process.poll() is None: - process.kill() # SIGKILL if not dead - logger.info(f"Stopped SSH tunnel for tenant {tenant_id}") - except Exception as e: - logger.error(f"Error stopping tunnel for tenant {tenant_id}: {e}") - - self._tunnels.clear() - self._tunnel_ports.clear() - ``` - -7. **Add background task pentru health monitoring** - - **Fișier:** `backend/app/main.py` - - **Task:** Run every 60 seconds - ```python - async def monitor_ssh_tunnels(): - while True: - await asyncio.sleep(60) - for tenant_id in multi_tenant_pool._tunnels.keys(): - if not await multi_tenant_pool._ssh_tunnel_manager.check_tunnel_health(tenant_id): - logger.warning(f"Tunnel unhealthy for tenant {tenant_id}, restarting...") - await multi_tenant_pool._ssh_tunnel_manager.restart_tunnel(tenant_id) - - # În lifespan startup - asyncio.create_task(monitor_ssh_tunnels()) - ``` - -#### Output Verificabil - -- ✅ SSH tunnel subprocess pornește per tenant remote -- ✅ Tunnel health check detectează tunnels moarte -- ✅ Auto-restart cu exponential backoff funcționează -- ✅ Multiple tenants cu SSH tunnels simultaneous (port allocation unique) -- ✅ Cleanup la shutdown: toate procesele SSH se opresc -- ✅ Test: `pytest shared/tests/test_ssh_tunnel_manager.py -v` -- ✅ Manual test: Kill SSH process, verifică auto-restart în < 60s - ---- - -### FAZA 4: JWT & Middleware Update (2-3 zile) - -**Obiectiv:** Update JWT tokens să includă `tenant_id` și middleware să extragă/valideze tenant access. - -#### Tasks - -1. **Update JWT handler să includă tenant_id** - - **Fișier:** `shared/auth/jwt_handler.py` - - **Modificări:** - ```python - # În TokenData model - class TokenData(BaseModel): - username: str - user_id: Optional[int] = None - tenant_id: str = Field(description="Tenant ID (UUID)") # NEW - companies: List[str] = Field(default_factory=list) - permissions: List[str] = Field(default_factory=list) - exp: datetime - iat: datetime - token_type: str = Field(alias="type") - - # În create_access_token() - def create_access_token( - self, - username: str, - tenant_id: str, # NEW parameter - companies: List[str], - user_id: Optional[int] = None, - permissions: Optional[List[str]] = None - ) -> str: - payload = { - "username": username, - "user_id": user_id, - "tenant_id": tenant_id, # NEW - "companies": companies or [], - "permissions": permissions or ["read"], - "exp": expire, - "iat": now, - "type": "access" - } - # ... rest same - ``` - -2. **Update login endpoint să determine tenant_id** - - **Fișier:** `backend/app/main.py` (auth router) - - **Logica:** - - Check `tenant_users` table pentru user_id - - Dacă user are access la multiple tenants, return primul (default) - - Sau user selectează tenant la login (future enhancement) - ```python - # În login endpoint - - # Get user's tenants from tenant_users table - tenants = await tenant_config_loader.get_user_tenants(user_id) - - if not tenants: - # Fallback: Use "default" tenant (backward compatibility) - tenant_id = "default" - else: - # Use first tenant (or let user select in future) - tenant_id = tenants[0]['tenant_id'] - - # Create JWT with tenant_id - access_token = jwt_handler.create_access_token( - username=credentials.username, - tenant_id=tenant_id, # NEW - companies=companies, - user_id=user_id, - permissions=["read", "reports"] - ) - ``` - -3. **Implementează TenantMiddleware pentru validare tenant access** - - **Fișier:** `shared/middleware/tenant_middleware.py` - - **Responsabilități:** - - Extract `tenant_id` din JWT token - - Validate user are acces la tenant-ul respectiv - - Inject `tenant_id` în `request.state.tenant_id` - ```python - class TenantMiddleware(BaseHTTPMiddleware): - async def dispatch(self, request: Request, call_next): - # Skip pentru excluded paths - if request.url.path in self.excluded_paths: - return await call_next(request) - - # Extract tenant_id from JWT token (already decoded by AuthMiddleware) - user = getattr(request.state, 'user', None) - if not user: - return JSONResponse( - status_code=401, - content={"detail": "Not authenticated"} - ) - - tenant_id = user.get('tenant_id') - if not tenant_id: - return JSONResponse( - status_code=400, - content={"detail": "Missing tenant_id in token"} - ) - - # Validate tenant exists and is active - tenant_config = await tenant_config_loader.get_tenant(tenant_id) - if not tenant_config or not tenant_config.is_active: - return JSONResponse( - status_code=403, - content={"detail": f"Tenant {tenant_id} is not active"} - ) - - # Validate user has access to this tenant - user_id = user.get('user_id') - has_access = await tenant_config_loader.check_user_tenant_access(user_id, tenant_id) - if not has_access: - return JSONResponse( - status_code=403, - content={"detail": f"User {user_id} does not have access to tenant {tenant_id}"} - ) - - # Inject tenant_id în request state - request.state.tenant_id = tenant_id - request.state.tenant_name = tenant_config.name - - # Continue request - response = await call_next(request) - - # Log audit (async background task) - await self._log_audit(request, response, tenant_id, user_id) - - return response - ``` - -4. **Update AuthenticationMiddleware să funcționeze cu TenantMiddleware** - - **Fișier:** `shared/auth/middleware.py` - - **Ordinea middleware-urilor:** - ```python - # În main.py - app.add_middleware(TenantMiddleware, excluded_paths=["/", "/docs", "/health", ...]) - app.add_middleware(AuthenticationMiddleware, excluded_paths=["/", "/docs", "/health", ...]) - ``` - - **Flow:** AuthMiddleware decode JWT → TenantMiddleware validate tenant access - -5. **Update toate router-urile să folosească tenant_id din request.state** - - **Fișiere:** `backend/app/routers/*.py` - - **Pattern:** - ```python - # Înainte (single-tenant) - async with oracle_pool.get_connection() as connection: - # query... - - # După (multi-tenant) - tenant_id = request.state.tenant_id # Injected by TenantMiddleware - async with multi_tenant_pool.get_connection(tenant_id) as connection: - # query... - ``` - - **Exemplu:** `dashboard.py` - ```python - @router.get("/{company_id}") - async def get_dashboard(company_id: str, request: Request): - tenant_id = request.state.tenant_id # NEW - - async with multi_tenant_pool.get_connection(tenant_id) as connection: - with connection.cursor() as cursor: - # ... rest same - ``` - -6. **Update Telegram bot pentru tenant support** - - **Fișier:** `backend/modules/telegram/app/auth/linking.py` - - **Modificări:** - - La linking, salvează și `tenant_id` în SQLite - - JWT token include `tenant_id` - - Toate requests la backend includ tenant_id corect - -7. **Add tenant selection endpoint (future enhancement)** - - **Endpoint:** `POST /api/auth/select-tenant` - - **Use case:** User cu access la multiple tenants poate switcha între ele - - **Response:** New JWT token cu alt tenant_id - -#### Output Verificabil - -- ✅ JWT token include `tenant_id` field -- ✅ Login endpoint generate token cu tenant_id corect -- ✅ TenantMiddleware extrage și validează tenant_id -- ✅ Router-uri folosesc `multi_tenant_pool.get_connection(tenant_id)` -- ✅ Request la tenant invalid returnează 403 Forbidden -- ✅ User fără access la tenant returnează 403 Forbidden -- ✅ Test: `pytest shared/tests/test_tenant_middleware.py -v` -- ✅ Test: Login cu user care are access la tenant A, request la tenant B → 403 - ---- - -### FAZA 5: Cache & Audit Logging Integration (1-2 zile) - -**Obiectiv:** Update Redis cache să folosească real tenant_id (nu "default") și implementează audit logging per tenant. - -#### Tasks - -1. **Update Redis cache să folosească real tenant_id** - - **Fișier:** `shared/cache/redis_client.py` (dacă există) sau inline în routers - - **Modificare:** Înlocuiește hardcoded `"default"` cu real `tenant_id` - - **Înainte:** - ```python - cache_key = f"cache:default:dashboard:{company_id}" - ``` - - **După:** - ```python - tenant_id = request.state.tenant_id - cache_key = f"cache:{tenant_id}:dashboard:{company_id}" - ``` - -2. **Implementează cache invalidation per tenant** - - **Use case:** Admin updates tenant data, invalidate doar cache-ul tenant-ului respectiv - - **Endpoint:** `DELETE /api/cache/{tenant_id}` (admin only) - - **Logica:** - ```python - pattern = f"cache:{tenant_id}:*" - keys = redis_client.keys(pattern) - if keys: - redis_client.delete(*keys) - ``` - -3. **Implementează audit logging în TenantMiddleware** - - **Fișier:** `shared/middleware/tenant_middleware.py` - - **Logica:** Log toate request-urile în `audit_logs` table - ```python - async def _log_audit(self, request: Request, response: Response, tenant_id: str, user_id: int): - # Extract info - action = f"{request.method} {request.url.path}" - status = "success" if response.status_code < 400 else "error" - error_message = None if status == "success" else response.body.decode() - - # Insert în audit_logs table (async background task) - await audit_logger.log( - tenant_id=tenant_id, - user_id=user_id, - username=request.state.user.get('username'), - action=action, - resource=request.url.path, - status=status, - error_message=error_message, - ip_address=request.client.host, - user_agent=request.headers.get('user-agent') - ) - ``` - -4. **Implementează AuditLogger helper class** - - **Fișier:** `shared/utils/audit_logger.py` - - **Metodă:** - ```python - class AuditLogger: - def __init__(self, tenant_db_url: str): - self.db_url = tenant_db_url - - async def log( - self, - tenant_id: str, - user_id: int, - username: str, - action: str, - resource: str, - status: str, - error_message: Optional[str] = None, - ip_address: Optional[str] = None, - user_agent: Optional[str] = None - ): - # Insert în audit_logs table (PostgreSQL/SQLite) - query = """ - INSERT INTO audit_logs ( - tenant_id, user_id, username, action, resource, - status, error_message, ip_address, user_agent - ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) - """ - await self._execute_query(query, [ - tenant_id, user_id, username, action, resource, - status, error_message, ip_address, user_agent - ]) - ``` - -5. **Add audit logs viewing endpoint** - - **Endpoint:** `GET /api/audit-logs/{tenant_id}` (tenant admin only) - - **Filters:** `?user_id=123&start_date=2025-10-01&end_date=2025-10-31&status=error` - - **Response:** Paginated audit logs for tenant - -6. **Add metrics per tenant (optional, future)** - - **Metrics:** - - Request count per tenant - - Response time per tenant - - Error rate per tenant - - Active users per tenant - - **Storage:** Time-series database (InfluxDB) sau Redis sorted sets - -#### Output Verificabil - -- ✅ Redis cache keys include real tenant_id (not "default") -- ✅ Cache isolation: Tenant A cache nu e vizibil pentru tenant B -- ✅ Cache invalidation per tenant funcționează -- ✅ Audit logs se salvează în `audit_logs` table -- ✅ Audit logs include tenant_id, user_id, action, status -- ✅ Audit logs viewing endpoint returnează logs filtered per tenant -- ✅ Test: `pytest shared/tests/test_audit_logging.py -v` - ---- - -### FAZA 6: Deployment & Testing (3-4 zile) - -**Obiectiv:** Deploy multi-tenant în toate environment-urile (dev, Docker, Windows) și test complet. - -#### Tasks - -1. **Update development environment (WSL)** - - **Setup:** - ```bash - # Create SQLite tenant DB - sqlite3 data/tenant_config.db < shared/schemas/tenant_config_schema.sql - - # Generate encryption key - python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" - - # Update .env - echo "TENANT_DB_URL=sqlite:///data/tenant_config.db" >> .env - echo "DB_ENCRYPTION_KEY=" >> .env - - # Create default tenant - python shared/scripts/create_default_tenant.py - - # Start app - ./start-dev.sh - ``` - - **Verificare:** Login funcționează cu tenant "default" - -2. **Update Docker deployment** - - **Fișier:** `docker-compose.yml` - - **Modificări:** - - Add `roa-tenant-config-db` service (PostgreSQL) - - Update `roa-backend` env vars (`TENANT_DB_URL`, `DB_ENCRYPTION_KEY`) - - Mount SSH keys volume read-only - - **Deployment:** - ```bash - # Build images - docker-compose build - - # Start services - docker-compose up -d - - # Initialize tenant DB - docker-compose exec roa-backend python shared/scripts/create_default_tenant.py - - # Verify - docker-compose logs roa-backend | grep "tenant" - ``` - -3. **Update Windows IIS deployment** - - **Script:** `deployment/windows/scripts/Setup-TenantDB.ps1` - - **Acțiuni:** - - Install SQL Server Express SAU PostgreSQL Windows service - - Create `tenant_config` database - - Run schema SQL - - Generate encryption key (store în Windows Credential Manager) - - Create default tenant - - **Manual steps:** - ```powershell - # Run setup - .\deployment\windows\scripts\Setup-TenantDB.ps1 - - # Update web.config cu TENANT_DB_URL - # Restart ROA2WEB-Backend service - Restart-Service ROA2WEB-Backend - ``` - -4. **Implementează comprehensive integration tests** - - **Fișier:** `shared/tests/integration/test_multi_tenant_flow.py` - - **Scenarios:** - - Login cu tenant A → Get dashboard → Cache hit tenant A - - Login cu tenant B → Get dashboard → Cache miss (different tenant) - - User cu access la tenant A încearcă tenant B → 403 Forbidden - - SSH tunnel tenant restart după kill → Auto-recovery - - Tenant inactive > 1h → Pool cleanup - - **Run:** - ```bash - pytest shared/tests/integration/ -v --tb=short - ``` - -5. **Implementează load testing cu multiple tenants** - - **Tool:** Locust sau Apache Bench - - **Scenario:** 3 tenants, 100 requests each, simultaneous - - **Script:** `shared/tests/load/test_multi_tenant_load.py` - - **Metrics:** - - Response time per tenant (< 200ms avg) - - Error rate (< 1%) - - Pool usage (max connections per tenant) - - SSH tunnel stability (no restarts) - -6. **Create tenant onboarding guide** - - **Fișier:** `shared/docs/TENANT_ONBOARDING.md` - - **Conținut:** - - How to add a new tenant (manual SQL sau admin UI) - - SSH key setup pentru tenant remote - - User assignment la tenant - - Testing tenant connection - - Troubleshooting common issues - -7. **Create monitoring dashboard (optional)** - - **Tools:** Grafana + Prometheus - - **Metrics:** - - Active tenants count - - Pool connections per tenant - - Request rate per tenant - - Error rate per tenant - - SSH tunnel uptime per tenant - -#### Output Verificabil - -- ✅ Development (WSL): Multi-tenant funcționează cu SQLite tenant DB -- ✅ Docker: Multi-tenant funcționează cu PostgreSQL tenant DB -- ✅ Windows IIS: Multi-tenant funcționează cu SQL Server Express -- ✅ Integration tests pass (100% success rate) -- ✅ Load tests: 3 tenants × 100 requests, < 200ms avg response time -- ✅ SSH tunnels: No crashes during 1h load test -- ✅ Cache isolation validated: Tenant A cache ≠ Tenant B cache -- ✅ Audit logs populated corect pentru toate requests -- ✅ Documentation complete (onboarding guide, troubleshooting) - ---- - -## 🔧 Connection Management - -### SSH Tunnel Configuration - -**Tenant cu SSH Tunnel (Client Remote)** - -```json -{ - "id": "client-a-uuid", - "name": "Client A - Retail SRL", - "connection_type": "ssh_tunnel", - - "oracle_host": "10.0.20.36", - "oracle_port": 1521, - "oracle_sid": "ROA", - "oracle_user": "CLIENT_A_USER", - "oracle_password_encrypted": "gAAAAABh...", - - "ssh_host": "83.103.197.79", - "ssh_port": 22122, - "ssh_user": "roa2web", - "ssh_key_path": "/app/ssh-keys/client-a.key", - "ssh_tunnel_local_port": 15261, - - "min_connections": 2, - "max_connections": 10, - "is_active": true -} -``` - -**SSH Tunnel Flow:** - -``` -Backend Process - ↓ -SSHTunnelManager.start_tunnel() - ↓ -subprocess: ssh -f -N -L 15261:10.0.20.36:1521 -p 22122 roa2web@83.103.197.79 - ↓ -Tunnel established: localhost:15261 → 10.0.20.36:1521 - ↓ -OraclePool connects to localhost:15261 - ↓ -Oracle queries routed prin SSH tunnel -``` - -### Direct Connection Configuration - -**Tenant cu Direct Connection (Client LAN)** - -```json -{ - "id": "client-b-uuid", - "name": "Client B - Import Export SA", - "connection_type": "direct", - - "oracle_host": "192.168.1.50", - "oracle_port": 1521, - "oracle_sid": "ROA", - "oracle_user": "CLIENT_B_USER", - "oracle_password_encrypted": "gAAAAABh...", - - "ssh_host": null, - "ssh_port": null, - "ssh_user": null, - "ssh_key_path": null, - "ssh_tunnel_local_port": null, - - "min_connections": 5, - "max_connections": 20, - "is_active": true -} -``` - -**Direct Connection Flow:** - -``` -Backend Process - ↓ -MultiTenantPoolManager.get_connection(tenant_id) - ↓ -Check connection_type: "direct" → Skip SSH tunnel - ↓ -OraclePool.create_pool(host=192.168.1.50, port=1521, ...) - ↓ -Oracle queries direct la 192.168.1.50:1521 -``` - -### Mixed Environment Setup - -**3 Tenants: 2 SSH, 1 Direct** - -| Tenant ID | Name | Type | Oracle Host | SSH Tunnel | Local Port | -|-----------|------|------|-------------|------------|------------| -| client-a-uuid | Client A - Retail SRL | ssh_tunnel | 10.0.20.36:1521 | 83.103.197.79:22122 | 15261 | -| client-b-uuid | Client B - Import SA | direct | 192.168.1.50:1521 | N/A | N/A | -| client-c-uuid | Client C - Distribution | ssh_tunnel | 10.0.20.36:1521 | 212.18.45.99:22 | 15262 | - -**Resource Usage:** - -``` -Backend Memory: -├── Pool Client A: 2-10 connections × ~5MB = 10-50MB -├── Pool Client B: 5-20 connections × ~5MB = 25-100MB -├── Pool Client C: 2-10 connections × ~5MB = 10-50MB -└── Total: ~50-200MB (vs single-tenant ~10-50MB) - -SSH Processes: -├── Tunnel Client A: ~10MB RAM -├── Tunnel Client C: ~10MB RAM -└── Total: ~20MB - -Total Overhead: ~70-220MB (acceptable for multi-tenant SaaS) -``` - ---- - -## 🔒 Security Model - -### Encryption Strategy - -**Password Encryption în Tenant DB** - -```python -from cryptography.fernet import Fernet - -# Generate encryption key (store în .env) -encryption_key = Fernet.generate_key() # Example: b'Xs3J7...' - -# Encrypt password -fernet = Fernet(encryption_key) -encrypted_password = fernet.encrypt(b"oracle_password_plaintext") -# Result: "gAAAAABh3J..." - -# Decrypt password (la runtime) -decrypted_password = fernet.decrypt(encrypted_password.encode()).decode() -``` - -**Security Properties:** - -- ✅ Symmetric encryption (Fernet - AES 128 CBC + HMAC) -- ✅ Encryption key în environment variable (`DB_ENCRYPTION_KEY`) -- ✅ Passwords encrypted at rest în tenant DB -- ✅ Decryption doar la pool initialization (memory only) -- ❌ **NOT**: Passwords în logs, error messages, audit trails - -### Tenant Isolation - -**Izolare Completă între Tenants** - -``` -┌─────────────────────────────────────────────────────────┐ -│ Tenant A │ -│ │ -│ ┌──────────────────────────────────────────────────┐ │ -│ │ Connection Pool (2-10 connections) │ │ -│ │ - oracle_host: 10.0.20.36 (via SSH tunnel) │ │ -│ │ - oracle_user: CLIENT_A_USER │ │ -│ │ - Schema: CLIENT_A_SCHEMA │ │ -│ └──────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────┐ │ -│ │ Redis Cache Namespace │ │ -│ │ - cache:client-a-uuid:* │ │ -│ └──────────────────────────────────────────────────┘ │ -│ │ -│ ┌──────────────────────────────────────────────────┐ │ -│ │ Audit Logs │ │ -│ │ - audit_logs WHERE tenant_id='client-a-uuid' │ │ -│ └──────────────────────────────────────────────────┘ │ -└─────────────────────────────────────────────────────────┘ - - ❌ ZERO SHARING ❌ - -┌─────────────────────────────────────────────────────────┐ -│ Tenant B │ -│ (Same structure, COMPLETELY ISOLATED) │ -└─────────────────────────────────────────────────────────┘ -``` - -**Isolation Guarantees:** - -1. **Connection Pool:** Tenant A connections NEVER folosite pentru tenant B queries -2. **Cache:** Redis keys namespaced per tenant (`cache:{tenant_id}:*`) -3. **Audit Logs:** Query filter `WHERE tenant_id = $1` (indexat pentru performance) -4. **SSH Tunnels:** Separate processes, separate local ports (no crosstalk) - -### JWT Token Structure - -**Token cu Tenant ID (Signed)** - -```json -{ - "username": "john.doe", - "user_id": 123, - "tenant_id": "client-a-uuid", - "companies": ["COMP1", "COMP2"], - "permissions": ["read", "reports"], - "exp": 1735142400, - "iat": 1735140600, - "type": "access" -} -``` - -**Security Checks în TenantMiddleware:** - -```python -# 1. Extract tenant_id from JWT (decoded by AuthMiddleware) -tenant_id = request.state.user.get('tenant_id') - -# 2. Validate tenant exists and is active -tenant_config = await tenant_config_loader.get_tenant(tenant_id) -if not tenant_config or not tenant_config.is_active: - raise HTTPException(403, "Tenant not active") - -# 3. Validate user has access to this tenant -user_id = request.state.user.get('user_id') -has_access = await tenant_config_loader.check_user_tenant_access(user_id, tenant_id) -if not has_access: - raise HTTPException(403, "User does not have access to this tenant") - -# 4. Inject tenant_id în request state (immutable) -request.state.tenant_id = tenant_id # Routers use this -``` - -**Attack Scenarios Prevented:** - -- ❌ **Tenant ID Tampering:** JWT signed, client nu poate modifica tenant_id fără invalid signature -- ❌ **Cross-Tenant Access:** User cu access la tenant A nu poate accesa tenant B (check în step 3) -- ❌ **Inactive Tenant Access:** Tenant deactivated → requests rejected (check în step 2) -- ❌ **SQL Injection via Tenant ID:** UUID validated, folosit în parameterized queries - ---- - -## 🧪 Testing Strategy - -### Unit Tests - -**Test Coverage per Component** - -```bash -shared/tests/ -├── test_tenant_config.py # TenantConfigLoader -│ ├── test_load_tenants() # Load all tenants from DB -│ ├── test_get_tenant() # Get specific tenant -│ ├── test_reload_tenant() # Reload tenant config -│ ├── test_encryption_decryption() # Password encryption/decryption -│ └── test_default_tenant_fallback() # Fallback la .env credențiale -│ -├── test_multi_tenant_pool.py # MultiTenantPoolManager -│ ├── test_lazy_pool_initialization() # Pool creat doar la prima cerere -│ ├── test_pool_per_tenant() # Pool-uri separate per tenant -│ ├── test_pool_cleanup_inactive() # Cleanup după 1h inactivity -│ ├── test_tenant_reload() # Reload tenant fără restart -│ └── test_connection_context_manager() # get_connection() pattern -│ -├── test_ssh_tunnel_manager.py # SSHTunnelManager -│ ├── test_start_tunnel() # Start SSH tunnel subprocess -│ ├── test_stop_tunnel() # Stop SSH tunnel gracefully -│ ├── test_tunnel_health_check() # Detect dead tunnels -│ ├── test_auto_restart() # Restart cu exponential backoff -│ └── test_cleanup_all_tunnels() # Kill all processes la shutdown -│ -├── test_tenant_middleware.py # TenantMiddleware -│ ├── test_extract_tenant_id() # Extract tenant_id din JWT -│ ├── test_validate_tenant_access() # User access validation -│ ├── test_inactive_tenant_blocked() # Inactive tenant → 403 -│ ├── test_cross_tenant_access_blocked() # User A tenant → User B tenant → 403 -│ └── test_audit_logging() # Audit logs salvate corect -│ -└── test_encryption.py # Encryption utils - ├── test_fernet_encryption() # Encrypt/decrypt passwords - └── test_key_rotation() # Future: Key rotation support -``` - -**Run Unit Tests:** - -```bash -cd shared/ -pytest tests/ -v --cov=database --cov=middleware --cov=utils --cov-report=html - -# Expected output: -# ✅ test_tenant_config.py::test_load_tenants PASSED -# ✅ test_multi_tenant_pool.py::test_lazy_pool_initialization PASSED -# ... -# Coverage: 85% (target: > 80%) -``` - -### Integration Tests - -**End-to-End Scenarios** - -```bash -shared/tests/integration/ -├── test_multi_tenant_flow.py # Complete multi-tenant flow -│ ├── test_login_with_tenant_a() # Login → JWT cu tenant A -│ ├── test_dashboard_tenant_a() # Dashboard query tenant A -│ ├── test_cache_hit_tenant_a() # Cache hit pentru tenant A -│ ├── test_cross_tenant_isolation() # Tenant A cache ≠ Tenant B cache -│ └── test_audit_logs_populated() # Audit logs salvate per tenant -│ -├── test_ssh_tunnel_resilience.py # SSH tunnel stability -│ ├── test_tunnel_auto_recovery() # Kill tunnel → Auto-restart -│ ├── test_multiple_tunnels_parallel() # 3 tenants SSH simultaneous -│ └── test_tunnel_port_conflicts() # Port allocation unique -│ -└── test_deployment_scenarios.py # Deployment compatibility - ├── test_development_sqlite() # Development cu SQLite tenant DB - ├── test_docker_postgresql() # Docker cu PostgreSQL tenant DB - └── test_backward_compatibility() # Tenant "default" funcționează -``` - -**Run Integration Tests:** - -```bash -# Requires: PostgreSQL tenant DB running + Redis + Oracle test server -docker-compose -f docker-compose.test.yml up -d - -pytest shared/tests/integration/ -v --tb=short - -# Expected output: -# ✅ test_multi_tenant_flow.py::test_login_with_tenant_a PASSED (0.5s) -# ✅ test_multi_tenant_flow.py::test_cache_hit_tenant_a PASSED (0.2s) -# ... -``` - -### Load Testing - -**Performance Validation cu Multiple Tenants** - -```python -# shared/tests/load/test_multi_tenant_load.py - -from locust import HttpUser, task, between -import random - -class MultiTenantUser(HttpUser): - wait_time = between(1, 3) - - def on_start(self): - # Login to random tenant - self.tenant = random.choice(['client-a-uuid', 'client-b-uuid', 'client-c-uuid']) - response = self.client.post('/api/auth/login', json={ - 'username': f'user_{self.tenant}', - 'password': 'test_password' - }) - self.token = response.json()['access_token'] - self.client.headers.update({'Authorization': f'Bearer {self.token}'}) - - @task(3) - def get_dashboard(self): - self.client.get(f'/api/dashboard/COMP1') - - @task(2) - def get_invoices(self): - self.client.get(f'/api/invoices/COMP1') - - @task(1) - def get_treasury(self): - self.client.get(f'/api/treasury/COMP1') -``` - -**Run Load Test:** - -```bash -locust -f shared/tests/load/test_multi_tenant_load.py --host=http://localhost:8001 - -# Scenario: 3 tenants × 100 users = 300 concurrent users -# Duration: 10 minutes -# Expected: -# - Response time: < 200ms (p95) -# - Error rate: < 1% -# - SSH tunnels: No restarts -# - Pool connections: Max 10 per tenant (no exhaustion) -``` - ---- - -## 📊 Migration Checklist - -### Pre-Migration - -- [ ] **Backup production database** - ```bash - # Backup Oracle database - expdp username/password@ROA directory=BACKUP dumpfile=pre_migration.dmp - - # Backup existing .env files - cp backend/.env backend/.env.backup - ``` - -- [ ] **Document current single-tenant config** - ```bash - # Save current credentials - cat backend/.env > docs/pre_migration_env.txt - - # Save current SSH tunnel config - ./ssh-tunnel-prod.sh status > docs/pre_migration_ssh.txt - ``` - -- [ ] **Test deployment în environment non-production** - ```bash - # Create staging environment - docker-compose -f docker-compose.staging.yml up -d - - # Deploy multi-tenant în staging - # ... follow migration steps ... - - # Validate staging works - curl http://staging.roa2web.local/api/health - ``` - -- [ ] **Generate DB encryption key** - ```bash - python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" - # Save în .env: DB_ENCRYPTION_KEY= - ``` - -- [ ] **Prepare tenant configuration** - - Create tenant DB (PostgreSQL/SQLite) - - Populate cu tenant "default" (credențiale existente) - - Add SSH keys pentru tenants remote - -### Migration Steps (Production) - -**Step 1: Deploy Tenant Config DB (30 min)** - -```bash -# Docker deployment -docker-compose up -d roa-tenant-config-db - -# Verify DB is running -docker-compose exec roa-tenant-config-db psql -U tenant_admin -d tenant_config -c '\dt' - -# Run schema -docker-compose exec roa-tenant-config-db psql -U tenant_admin -d tenant_config -f /docker-entrypoint-initdb.d/schema.sql -``` - -**Step 2: Populate Tenant "default" (15 min)** - -```bash -# Run migration script -docker-compose exec roa-backend python shared/scripts/create_default_tenant.py - -# Verify tenant created -docker-compose exec roa-tenant-config-db psql -U tenant_admin -d tenant_config -c 'SELECT id, name, connection_type FROM tenants;' -``` - -**Step 3: Deploy Backend cu MultiTenantPoolManager (45 min)** - -```bash -# Update .env with tenant DB URL -echo "TENANT_DB_URL=postgresql://tenant_admin:password@roa-tenant-config-db:5432/tenant_config" >> .env - -# Rebuild backend image -docker-compose build roa-backend - -# Deploy new backend (rolling update) -docker-compose up -d roa-backend - -# Wait for health check -watch -n 2 'curl -s http://localhost:8001/health | jq' -``` - -**Step 4: Verify Tenant "default" funcționează (15 min)** - -```bash -# Test login (should work exactly as before) -curl -X POST http://localhost:8001/api/auth/login \ - -H 'Content-Type: application/json' \ - -d '{"username": "test_user", "password": "test_password"}' - -# Response should include tenant_id: "default" -# { -# "access_token": "eyJ...", -# "user": { -# "tenant_id": "default", -# ... -# } -# } - -# Test dashboard (should work as before) -curl -H "Authorization: Bearer $TOKEN" http://localhost:8001/api/dashboard/COMP1 -``` - -**Step 5: Add Tenants Noi (One by One)** - -```bash -# Add tenant A (SSH tunnel) -docker-compose exec roa-backend python shared/scripts/add_tenant.py \ - --name "Client A - Retail SRL" \ - --connection-type ssh_tunnel \ - --oracle-host 10.0.20.36 \ - --oracle-user CLIENT_A_USER \ - --oracle-password "encrypted_password" \ - --ssh-host 83.103.197.79 \ - --ssh-port 22122 \ - --ssh-key /app/ssh-keys/client-a.key \ - --ssh-local-port 15261 - -# Add users la tenant A -docker-compose exec roa-tenant-config-db psql -U tenant_admin -d tenant_config -c \ - "INSERT INTO tenant_users (tenant_id, user_id, username) VALUES ('client-a-uuid', 123, 'john.doe');" - -# Test tenant A login -curl -X POST http://localhost:8001/api/auth/login \ - -H 'Content-Type: application/json' \ - -d '{"username": "john.doe", "password": "password"}' - -# Verify JWT includes tenant_id: "client-a-uuid" -``` - -**Step 6: Monitor Logs per Tenant (Ongoing)** - -```bash -# Monitor all tenant logs -docker-compose logs -f roa-backend | grep "tenant_id" - -# Monitor SSH tunnels -docker-compose logs -f roa-backend | grep "SSH tunnel" - -# Monitor pool connections -docker-compose logs -f roa-backend | grep "pool" - -# Check audit logs -docker-compose exec roa-tenant-config-db psql -U tenant_admin -d tenant_config -c \ - 'SELECT tenant_id, username, action, status, created_at FROM audit_logs ORDER BY created_at DESC LIMIT 20;' -``` - -**Step 7: Performance Validation (1-2h)** - -```bash -# Run load test -locust -f shared/tests/load/test_multi_tenant_load.py --host=http://localhost:8001 --users=100 --spawn-rate=10 --run-time=1h - -# Monitor metrics -# - Response time: < 200ms (p95) -# - Error rate: < 1% -# - Pool usage: < 80% per tenant -# - SSH tunnels: No restarts -``` - -### Post-Migration - -- [ ] **All tenants functional** - - Tenant "default" works (backward compatibility) - - Tenant A works (SSH tunnel) - - Tenant B works (direct connection) - -- [ ] **No performance degradation** - - Response time same as single-tenant (< 10% overhead) - - No connection pool exhaustion - - SSH tunnels stable (no auto-restarts) - -- [ ] **Audit logs populated** - ```bash - # Verify audit logs per tenant - SELECT tenant_id, COUNT(*) FROM audit_logs GROUP BY tenant_id; - ``` - -- [ ] **Documentation updated** - - Update `CLAUDE.md` cu multi-tenant architecture - - Update deployment guides (Docker, Windows) - - Create tenant onboarding guide - -- [ ] **Monitoring dashboards** - - Grafana dashboard per tenant - - Alerts pentru pool exhaustion, SSH tunnel failures - ---- - -## 🎯 Deployment Guides - -### Development Setup (WSL/Local) - -**Prerequisites:** -- Python 3.11+ -- SQLite3 -- Redis server -- SSH access la Oracle server (pentru tenants cu SSH tunnel) - -**Setup Steps:** - -```bash -# 1. Create SQLite tenant DB -mkdir -p data -sqlite3 data/tenant_config.db < shared/schemas/tenant_config_schema.sql - -# 2. Generate encryption key -python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" > .encryption_key -DB_ENCRYPTION_KEY=$(cat .encryption_key) - -# 3. Update .env -cat >> backend/.env << EOF -# Tenant Configuration -TENANT_DB_URL=sqlite:///data/tenant_config.db -DB_ENCRYPTION_KEY=$DB_ENCRYPTION_KEY -EOF - -# 4. Create default tenant -cd shared/ -python scripts/create_default_tenant.py - -# 5. Start Redis -redis-server --daemonize yes - -# 6. Start application -cd ../ -./start-dev.sh - -# 7. Verify -curl http://localhost:8001/health -# Should return: {"database": "connected", "tenants_loaded": 1} -``` - -**Add New Tenant (Development):** - -```bash -# Add tenant via SQL -sqlite3 data/tenant_config.db << EOF -INSERT INTO tenants ( - id, name, connection_type, - oracle_host, oracle_port, oracle_sid, oracle_user, oracle_password_encrypted, - ssh_host, ssh_port, ssh_user, ssh_key_path, ssh_tunnel_local_port -) VALUES ( - 'dev-tenant-uuid', - 'Dev Tenant - Test Company', - 'ssh_tunnel', - '10.0.20.36', - 1521, - 'ROA', - 'DEV_USER', - 'encrypted_password_here', - '83.103.197.79', - 22122, - 'roa2web', - '/tmp/roa_oracle_server', - 15263 -); - --- Add user to tenant -INSERT INTO tenant_users (tenant_id, user_id, username) -VALUES ('dev-tenant-uuid', 999, 'dev_user'); -EOF - -# Restart backend -pkill -f "uvicorn app.main:app" -./start-dev.sh -``` - ---- - -### Docker Deployment (Proxmox LXC) - -**Prerequisites:** -- Docker 24+ -- Docker Compose 2.20+ -- 4GB RAM minimum -- PostgreSQL 15 container - -**docker-compose.multi-tenant.yml:** - -```yaml -version: '3.8' - -services: - # Tenant Configuration Database - roa-tenant-config-db: - image: postgres:15-alpine - container_name: roa-tenant-config-db - restart: unless-stopped - environment: - POSTGRES_DB: tenant_config - POSTGRES_USER: tenant_admin - POSTGRES_PASSWORD: ${TENANT_DB_PASSWORD} - volumes: - - tenant-config-data:/var/lib/postgresql/data - - ./shared/schemas/tenant_config_schema.sql:/docker-entrypoint-initdb.d/schema.sql:ro - networks: - - roa-network - healthcheck: - test: ["CMD-SHELL", "pg_isready -U tenant_admin -d tenant_config"] - interval: 10s - timeout: 5s - retries: 5 - - # Backend (Multi-Tenant) - roa-backend: - build: - context: . - dockerfile: ./backend/Dockerfile - image: roa2web/backend:multi-tenant - container_name: roa-backend - restart: unless-stopped - environment: - # Tenant Configuration - - TENANT_DB_URL=postgresql://tenant_admin:${TENANT_DB_PASSWORD}@roa-tenant-config-db:5432/tenant_config - - DB_ENCRYPTION_KEY=${DB_ENCRYPTION_KEY} - - # JWT Configuration - - JWT_SECRET_KEY=${JWT_SECRET_KEY} - - # Redis Cache - - REDIS_URL=redis://:${REDIS_PASSWORD}@roa-redis:6379/0 - volumes: - # SSH keys for tenant tunnels (read-only) - - ./ssh-keys:/app/ssh-keys:ro - - backend-logs:/app/logs - networks: - - roa-network - depends_on: - roa-tenant-config-db: - condition: service_healthy - roa-redis: - condition: service_healthy - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8000/health"] - interval: 30s - timeout: 10s - retries: 3 - - # Redis Cache - roa-redis: - image: redis:7-alpine - container_name: roa-redis - restart: unless-stopped - command: redis-server --appendonly yes --requirepass ${REDIS_PASSWORD} - volumes: - - redis-data:/data - networks: - - roa-network - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 5s - retries: 5 - - # Frontend (unchanged) - roa-frontend: - build: - context: ./src - dockerfile: Dockerfile - image: roa2web/frontend:latest - container_name: roa-frontend - restart: unless-stopped - networks: - - roa-network - - # Nginx Gateway (unchanged) - roa-gateway: - build: - context: ./nginx - dockerfile: Dockerfile - image: roa2web/nginx-gateway:latest - container_name: roa-gateway - restart: unless-stopped - ports: - - "80:80" - - "443:443" - networks: - - roa-network - depends_on: - - roa-backend - - roa-frontend - -volumes: - tenant-config-data: - redis-data: - backend-logs: - -networks: - roa-network: - driver: bridge -``` - -**Deployment:** - -```bash -# 1. Create .env file -cat > .env << EOF -TENANT_DB_PASSWORD=$(openssl rand -base64 32) -DB_ENCRYPTION_KEY=$(python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())") -JWT_SECRET_KEY=$(openssl rand -base64 64) -REDIS_PASSWORD=$(openssl rand -base64 32) -EOF - -# 2. Prepare SSH keys directory -mkdir -p ssh-keys -chmod 700 ssh-keys -cp /path/to/client-a.key ssh-keys/client-a.key -chmod 400 ssh-keys/client-a.key - -# 3. Build and start services -docker-compose -f docker-compose.multi-tenant.yml build -docker-compose -f docker-compose.multi-tenant.yml up -d - -# 4. Wait for tenant DB initialization -docker-compose logs -f roa-tenant-config-db | grep "database system is ready" - -# 5. Create default tenant -docker-compose exec roa-backend python shared/scripts/create_default_tenant.py - -# 6. Verify deployment -curl http://localhost/api/health -# {"api": "healthy", "database": "connected", "tenants_loaded": 1} -``` - -**Add New Tenant:** - -```bash -# Connect to tenant DB -docker-compose exec roa-tenant-config-db psql -U tenant_admin -d tenant_config - -# Insert tenant (with encrypted password) -INSERT INTO tenants (id, name, connection_type, oracle_host, oracle_port, oracle_sid, oracle_user, oracle_password_encrypted, ssh_host, ssh_port, ssh_user, ssh_key_path, ssh_tunnel_local_port, is_active) -VALUES ( - 'client-a-uuid', - 'Client A - Retail SRL', - 'ssh_tunnel', - '10.0.20.36', - 1521, - 'ROA', - 'CLIENT_A_USER', - 'gAAAAABh...', -- Fernet encrypted password - '83.103.197.79', - 22122, - 'roa2web', - '/app/ssh-keys/client-a.key', - 15261, - TRUE -); - --- Add user to tenant -INSERT INTO tenant_users (tenant_id, user_id, username) -VALUES ('client-a-uuid', 123, 'john.doe'); - -\q - -# Reload backend (or wait for auto-reload) -docker-compose restart roa-backend -``` - ---- - -### Windows IIS Deployment - -**Prerequisites:** -- Windows Server 2019+ -- IIS 10+ -- SQL Server Express 2019+ SAU PostgreSQL 15 for Windows -- Python 3.11+ (Windows installer) -- Redis for Windows (MSI installer) - -**Setup Script:** `deployment/windows/scripts/Setup-MultiTenant.ps1` - -```powershell -# Run as Administrator -.\deployment\windows\scripts\Setup-MultiTenant.ps1 - -<# -This script will: -1. Install SQL Server Express 2019 -2. Create tenant_config database -3. Run schema SQL -4. Generate encryption key (save în Windows Credential Manager) -5. Create default tenant -6. Update ROA2WEB backend service -7. Restart IIS -#> -``` - -**Manual Setup:** - -```powershell -# 1. Install SQL Server Express -# Download from: https://www.microsoft.com/en-us/sql-server/sql-server-downloads -# Install with default instance name: SQLEXPRESS - -# 2. Create tenant database -sqlcmd -S localhost\SQLEXPRESS -E -Q "CREATE DATABASE tenant_config" - -# 3. Run schema -sqlcmd -S localhost\SQLEXPRESS -d tenant_config -E -i shared\schemas\tenant_config_schema.sql - -# 4. Generate encryption key -python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())" | Out-File -FilePath .encryption_key -NoNewline - -# 5. Store key în Windows Credential Manager -cmdkey /generic:ROA2WEB_DB_ENCRYPTION_KEY /user:system /pass:(Get-Content .encryption_key) - -# 6. Update backend .env -@" -TENANT_DB_URL=mssql+pyodbc://localhost\SQLEXPRESS/tenant_config?driver=ODBC+Driver+17+for+SQL+Server&trusted_connection=yes -DB_ENCRYPTION_KEY=$(Get-Content .encryption_key) -"@ | Add-Content -Path C:\inetpub\wwwroot\roa2web\backend\.env - -# 7. Create default tenant -cd C:\inetpub\wwwroot\roa2web -python shared\scripts\create_default_tenant.py - -# 8. Restart backend service -Restart-Service ROA2WEB-Backend - -# 9. Verify -curl http://localhost:8000/health -``` - -**Add New Tenant (Windows):** - -```powershell -# Connect to SQL Server -sqlcmd -S localhost\SQLEXPRESS -d tenant_config -E - --- Insert tenant -INSERT INTO tenants (id, name, connection_type, oracle_host, oracle_port, oracle_sid, oracle_user, oracle_password_encrypted, is_active) -VALUES ( - 'client-b-uuid', - 'Client B - Import Export SA', - 'direct', - '192.168.1.50', - 1521, - 'ROA', - 'CLIENT_B_USER', - 'gAAAAABh...', -- Encrypted password - 1 -); - --- Add user to tenant -INSERT INTO tenant_users (tenant_id, user_id, username) -VALUES ('client-b-uuid', 456, 'jane.smith'); - -GO -EXIT - -# Restart backend -Restart-Service ROA2WEB-Backend -``` - ---- - -## 📝 Configuration Examples - -### Tenant Config: SSH Tunnel (Development) - -```json -{ - "id": "dev-client-uuid", - "name": "Development Client - Test Company", - "connection_type": "ssh_tunnel", - - "oracle_host": "10.0.20.36", - "oracle_port": 1521, - "oracle_sid": "ROA", - "oracle_user": "DEV_USER", - "oracle_password_encrypted": "gAAAAABhXj7Ks3J...", - - "ssh_host": "83.103.197.79", - "ssh_port": 22122, - "ssh_user": "roa2web", - "ssh_key_path": "/tmp/roa_oracle_server", - "ssh_tunnel_local_port": 15260, - - "min_connections": 2, - "max_connections": 5, - "is_active": true -} -``` - -### Tenant Config: Direct Connection (Production) - -```json -{ - "id": "prod-client-uuid", - "name": "Production Client - Enterprise Corp", - "connection_type": "direct", - - "oracle_host": "192.168.100.50", - "oracle_port": 1521, - "oracle_sid": "ROA", - "oracle_user": "PROD_USER", - "oracle_password_encrypted": "gAAAAABhXj8Nm4K...", - - "ssh_host": null, - "ssh_port": null, - "ssh_user": null, - "ssh_key_path": null, - "ssh_tunnel_local_port": null, - - "min_connections": 5, - "max_connections": 20, - "is_active": true -} -``` - -### Tenant Config: Docker Deployment (PostgreSQL Tenant DB) - -**.env for Docker Compose:** - -```bash -# Tenant Configuration Database -TENANT_DB_PASSWORD=SecurePostgresPassword123! -DB_ENCRYPTION_KEY=Xs3J7vN2pQ8kR9mT1wY5zC6bA4dF0gH= - -# Backend -JWT_SECRET_KEY=YourVerySecureJWTSecretKeyHere123456789 - -# Redis -REDIS_PASSWORD=SecureRedisPassword456! -``` - -### User-Tenant Mapping Example - -```sql --- User john.doe has access to 2 tenants -INSERT INTO tenant_users (tenant_id, user_id, username, is_admin) VALUES -('client-a-uuid', 123, 'john.doe', TRUE), -('client-b-uuid', 123, 'john.doe', FALSE); - --- User jane.smith has access to 1 tenant -INSERT INTO tenant_users (tenant_id, user_id, username, is_admin) VALUES -('client-b-uuid', 456, 'jane.smith', FALSE); - --- Query: Get all tenants for user -SELECT t.id, t.name, tu.is_admin -FROM tenants t -JOIN tenant_users tu ON t.id = tu.tenant_id -WHERE tu.user_id = 123 AND t.is_active = TRUE; - --- Result: --- | id | name | is_admin | --- |----------------|-------------------------------|----------| --- | client-a-uuid | Client A - Retail SRL | TRUE | --- | client-b-uuid | Client B - Import Export SA | FALSE | -``` - ---- - -## 🎯 Success Criteria - -### Definition of Done - -**Funcțional:** -- ✅ Aplicația suportă minimum 3 tenants simultaneous -- ✅ Tenant identification din JWT funcționează corect -- ✅ SSH tunnels pornesc/opresc automat per tenant -- ✅ Connection pools izolate per tenant (zero sharing) -- ✅ Cache isolation între tenants (namespace per tenant) -- ✅ No cross-tenant data leakage în audit logs sau cache - -**Deployment:** -- ✅ Funcționează în toate deployment scenarios (dev/WSL, Docker, Windows IIS) -- ✅ Backward compatibility: Tenant "default" funcționează exact ca single-tenant -- ✅ Zero downtime pentru existing tenant când adaugi tenant nou (lazy loading) -- ✅ Migration script successful în < 2h (staging environment) - -**Performance:** -- ✅ Overhead < 10% vs single-tenant (measured în load testing) -- ✅ Response time < 200ms (p95) cu 3 tenants × 100 requests -- ✅ No connection pool exhaustion (max 80% usage per tenant) -- ✅ SSH tunnels stable (zero auto-restarts în 1h load test) - -**Security:** -- ✅ Passwords encrypted at rest în tenant DB (Fernet AES-128) -- ✅ SSH keys mounted read-only în Docker volumes -- ✅ JWT tenant_id signed (nu poate fi modificat de client) -- ✅ Tenant access validation în middleware (403 pentru unauthorized) -- ✅ Audit logging TOATE operațiile per tenant - -**Testing:** -- ✅ Unit tests: > 80% code coverage -- ✅ Integration tests: All scenarios pass (login, dashboard, cross-tenant isolation) -- ✅ Load tests: 3 tenants × 100 users, 10 minutes, < 1% error rate -- ✅ Manual testing: Tenant onboarding guide validated - -**Documentation:** -- ✅ CLAUDE.md updated cu multi-tenant architecture -- ✅ Deployment guides (dev, Docker, Windows) complete -- ✅ Tenant onboarding guide created -- ✅ Troubleshooting guide created -- ✅ API documentation updated (Swagger/ReDoc) - ---- - -## ⚠️ Risks & Mitigations - -### Risk: SSH Tunnel Instability - -**Scenario:** SSH tunnel process crashes sau network interruption între backend și SSH server. - -**Impact:** Tenant-ul afectat nu poate accesa Oracle DB (requests fail cu connection error). - -**Mitigation:** -1. **Health Checks:** Background task checks tunnel health every 60s -2. **Auto-Restart:** Restart tunnel automat cu exponential backoff (5s, 10s, 20s, max 60s) -3. **Monitoring:** Alert dacă tunnel e down > 5 minutes -4. **Fallback:** Graceful degradation - alți tenants continuă să funcționeze normal - -**Detection:** -```python -async def monitor_ssh_tunnels(): - for tenant_id in ssh_tunnel_manager.tunnels: - if not await ssh_tunnel_manager.check_tunnel_health(tenant_id): - logger.error(f"Tunnel down for tenant {tenant_id}, restarting...") - await ssh_tunnel_manager.restart_tunnel(tenant_id) -``` - ---- - -### Risk: Connection Pool Exhaustion - -**Scenario:** Tenant face burst de requests, pool ajunge la max connections (ex: 10), noi requests block sau timeout. - -**Impact:** Slow response time sau 503 Service Unavailable pentru tenant-ul respectiv. - -**Mitigation:** -1. **Pool Limits:** Set realistic limits per tenant (min=2, max=10 default, configurable) -2. **Queue Timeout:** `getmode=POOL_GETMODE_WAIT` cu timeout (ex: 30s) -3. **Rate Limiting:** Limit requests per user/tenant (ex: 100 req/min) -4. **Monitoring:** Alert dacă pool usage > 80% pentru > 5 minutes -5. **Scaling:** Increase `max_connections` pentru high-traffic tenants - -**Configuration:** -```python -# În tenant config DB -UPDATE tenants SET max_connections = 20 WHERE id = 'high-traffic-tenant-uuid'; - -# Reload tenant -await multi_tenant_pool.reload_tenant('high-traffic-tenant-uuid') -``` - ---- - -### Risk: Tenant Credential Leak - -**Scenario:** Attacker obține acces la tenant DB sau logs și vede Oracle passwords. - -**Impact:** Data breach - attacker poate accesa Oracle DB direct. - -**Mitigation:** -1. **Encryption at Rest:** Passwords encrypted cu Fernet în tenant DB -2. **Encryption Key Security:** `DB_ENCRYPTION_KEY` în environment variables (nu în git) -3. **Access Control:** Tenant DB access restricted (firewall, VPN) -4. **No Plaintext Logs:** NEVER log decrypted passwords (check code reviews) -5. **Audit Logging:** Log all access la tenant config (who/when) -6. **Key Rotation:** Support key rotation (encrypt cu new key, decrypt cu old key) - -**Validation:** -```bash -# Check logs pentru password leaks -docker-compose logs roa-backend | grep -i "password" | grep -v "encrypted" -# Should return ZERO results - -# Check tenant DB -docker-compose exec roa-tenant-config-db psql -U tenant_admin -d tenant_config -c 'SELECT id, name, oracle_password_encrypted FROM tenants LIMIT 5;' -# oracle_password_encrypted should start with "gAAAAA..." (Fernet token) -``` - ---- - -### Risk: Cross-Tenant Data Leakage - -**Scenario:** Bug în middleware sau router permite user din tenant A să acceseze date din tenant B. - -**Impact:** CRITICAL data breach - confidențialitate compromisă. - -**Mitigation:** -1. **Mandatory Middleware:** TenantMiddleware validează tenant access pentru TOATE requests -2. **Explicit Tenant ID:** Routers MUST use `request.state.tenant_id` (no global state) -3. **Code Reviews:** TOATE modificările în routers reviewed pentru tenant isolation -4. **Integration Tests:** Test cross-tenant access blocked (403 Forbidden) -5. **Audit Logging:** Log tenant_id în TOATE audit entries pentru forensics - -**Test Scenario:** -```python -# Test: User cu tenant A încearcă să acceseze tenant B -def test_cross_tenant_access_blocked(): - # Login cu tenant A - token_a = login(user_id=123, tenant_id='client-a-uuid') - - # Modify JWT tenant_id → tenant B (attack simulation) - forged_token = jwt.encode({ - 'user_id': 123, - 'tenant_id': 'client-b-uuid', # FORGED - 'exp': datetime.utcnow() + timedelta(hours=1) - }, secret_key, algorithm='HS256') - - # Request cu forged token - response = client.get('/api/dashboard/COMP1', headers={'Authorization': f'Bearer {forged_token}'}) - - # MUST return 403 Forbidden (not 200 OK) - assert response.status_code == 403 - assert 'does not have access to tenant' in response.json()['detail'] -``` - ---- - -### Risk: Performance Degradation cu Multiple Tenants - -**Scenario:** Cu 10+ tenants, response time crește sau backend consumă prea multă memorie. - -**Impact:** Poor user experience, server overload. - -**Mitigation:** -1. **Lazy Loading:** Pool-uri create doar când tenant e accesat (economie memorie) -2. **Pool Cleanup:** Inactive pools > 1h se închid automat -3. **Resource Limits:** Set `max_connections` realistic per tenant (evită OOM) -4. **Monitoring:** Track memory usage, response time per tenant -5. **Horizontal Scaling:** Add more backend replicas (Docker Swarm, Kubernetes) -6. **Connection Pooling:** Reuse connections (oracle `create_pool` already does this) - -**Performance Baseline:** -``` -Single-Tenant: -- Memory: 50MB (1 pool × 2-10 connections) -- Response time: 50ms (p95) - -Multi-Tenant (3 tenants): -- Memory: 150MB (3 pools × 2-10 connections) -- Response time: 55ms (p95) -- Overhead: 10% (acceptable) - -Multi-Tenant (10 tenants): -- Memory: 500MB (10 pools × 2-10 connections) -- Response time: 65ms (p95) -- Overhead: 30% (needs optimization if > 10% target) -``` - -**Optimization:** -- Reduce `min_connections` de la 2 la 1 pentru low-traffic tenants -- Aggressive cleanup: Idle > 30 min (instead of 1h) -- Cache more aggressively (reduce Oracle queries) - ---- - -## 📚 Referințe - -### Current Implementation - -- **OraclePool:** `shared/database/oracle_pool.py` - Singleton pattern for single-tenant -- **JWT Handler:** `shared/auth/jwt_handler.py` - Token creation/validation (needs tenant_id) -- **Auth Middleware:** `shared/auth/middleware.py` - JWT verification (needs tenant validation) -- **Backend Main:** `backend/app/main.py` - Startup logic (needs MultiTenantPoolManager) -- **SSH Tunnel Script:** `ssh-tunnel-prod.sh` - Single tunnel script (needs per-tenant manager) - -### Inspiration & Patterns - -- **Redis Implementation Plan:** `shared/docs/REDIS_IMPLEMENTATION_PLAN.md` - Good structure for this plan -- **Docker Compose:** `docker-compose.yml` - Current deployment (needs tenant-config-db service) -- **Windows Deployment:** `deployment/windows/scripts/` - Deployment patterns for Windows -- **Python oracledb Docs:** https://python-oracledb.readthedocs.io/en/latest/user_guide/connection_handling.html -- **Fernet Encryption:** https://cryptography.io/en/latest/fernet/ - -### Multi-Tenant Best Practices - -- **Tenant Isolation Patterns:** https://docs.microsoft.com/en-us/azure/architecture/guide/multitenant/ -- **Connection Pooling:** https://python-oracledb.readthedocs.io/en/latest/user_guide/connection_handling.html#connection-pooling -- **SSH Tunnel Management:** https://www.ssh.com/academy/ssh/tunneling-example -- **JWT Security:** https://jwt.io/introduction - -### Testing Resources - -- **pytest-asyncio:** https://pytest-asyncio.readthedocs.io/ -- **Locust Load Testing:** https://docs.locust.io/en/stable/ -- **Docker Compose Testing:** https://docs.docker.com/compose/ - ---- - -## 📅 Timeline Summary - -| Faza | Durată | Obiectiv | Output Verificabil | -|------|--------|----------|-------------------| -| **Faza 1** | 2-3 zile | Tenant Config DB | Tenant DB funcționează, default tenant creat | -| **Faza 2** | 3-4 zile | MultiTenantPoolManager | Pool-uri per tenant, lazy loading | -| **Faza 3** | 2-3 zile | SSH Tunnel Manager | SSH tunnels per tenant, auto-restart | -| **Faza 4** | 2-3 zile | JWT & Middleware | JWT cu tenant_id, tenant validation | -| **Faza 5** | 1-2 zile | Cache & Audit | Redis cache per tenant, audit logs | -| **Faza 6** | 3-4 zile | Deployment & Testing | Deploy în toate env-urile, tests pass | -| **TOTAL** | **14-20 zile** | **Multi-Tenant Production-Ready** | All success criteria met | - ---- - -## 🚀 Next Steps - -1. **Review acest plan** cu team/stakeholders -2. **Prioritizează fazele** (poate Faza 1+2 first, restul după) -3. **Setup development environment** pentru testing -4. **Creează branch:** `feature/multi-tenant-architecture` -5. **Start Faza 1:** Tenant Configuration Database -6. **Iterate:** Test după fiecare fază, adjust plan dacă e nevoie - ---- - -**Document Version:** 1.0 -**Last Updated:** 2025-10-25 -**Author:** Claude Code (Anthropic) -**Status:** Ready for Implementation - diff --git a/deploy-package-20260223-151231/shared/docs/REDIS_IMPLEMENTATION_PLAN.md b/deploy-package-20260223-151231/shared/docs/REDIS_IMPLEMENTATION_PLAN.md deleted file mode 100644 index ef371b9..0000000 --- a/deploy-package-20260223-151231/shared/docs/REDIS_IMPLEMENTATION_PLAN.md +++ /dev/null @@ -1,910 +0,0 @@ -# Plan Implementare Redis Caching - ROA2WEB - -**Data Creare:** 2025-01-25 -**Status:** DRAFT - Ready for Implementation -**Durata Estimată:** 2-3 ore - ---- - -## 📋 Sumar Executiv - -- **Obiectiv:** Implementare Redis caching layer pentru reducerea query-urilor repetitive la Oracle DB -- **Target:** 60-80% reducere în numărul de query-uri pentru date frecvent accesate -- **Strategie:** Caching simplu la nivel de Service layer cu invalidation manuală -- **Backward Compatibility:** ✅ Aplicația funcționează fără Redis (graceful degradation) -- **Multi-Tenant Ready:** ✅ Cache keys pregătite pentru viitoare multi-tenancy - -**Infrastructure Status:** -- ✅ Redis container configurat în `docker-compose.yml` (lines 147-163) -- ✅ Backend `depends_on: roa-redis` -- ❌ Redis client library LIPSĂ -- ❌ Cod de caching LIPSĂ - ---- - -## 🗂️ Structura Fișierelor - -### Fișiere Noi (6 fișiere) - -- [ ] `shared/cache/__init__.py` - Package initialization -- [ ] `shared/cache/redis_client.py` - Redis connection client (90 lines) -- [ ] `shared/cache/decorators.py` - Cache decorators (60 lines) -- [ ] `shared/cache/utils.py` - Cache key generators, helpers (40 lines) -- [ ] `shared/tests/test_redis_client.py` - Unit tests pentru Redis client (120 lines) -- [ ] `shared/tests/test_cache_decorators.py` - Unit tests pentru decorators (80 lines) - -### Fișiere Modificate (7 fișiere) - -- [ ] `backend/requirements.txt` - Adaugă redis>=5.0.0 -- [ ] `backend/.env.example` - Adaugă REDIS_* env vars -- [ ] `backend/app/main.py` - Initialize Redis at startup -- [ ] `backend/app/services/dashboard_service.py` - Apply caching -- [ ] `backend/app/services/invoice_service.py` - Apply caching -- [ ] `backend/app/routers/dashboard.py` - Cache invalidation on mutations -- [ ] `backend/app/routers/invoices.py` - Cache invalidation on mutations - ---- - -## 🚀 Faze de Implementare - -### FAZA 1: Setup Redis Client și Connection (30 min) - -**Obiectiv:** Creează Redis client singleton cu connection pooling, similar cu `OraclePool` pattern. - -**Tasks:** - -1. [ ] **Adaugă dependency în requirements.txt** - - Fișier: `backend/requirements.txt` - - Acțiune: Adaugă linia `redis>=5.0.0` după `httpx>=0.27.0` - - Motivație: redis 5.0+ are async support nativ - -2. [ ] **Creează package cache în shared/** - - Fișiere: `shared/cache/__init__.py` - - Acțiune: Creează directorul și fișierul de init cu exports: - ```python - from .redis_client import redis_cache - from .decorators import cached, invalidate_cache - - __all__ = ['redis_cache', 'cached', 'invalidate_cache'] - ``` - -3. [ ] **Implementează RedisCache singleton client** - - Fișier: `shared/cache/redis_client.py` - - Acțiune: Creează clasa `RedisCache` similar cu `OraclePool`: - - Singleton pattern (nu multi-instance) - - Async redis client cu connection pooling - - Methods: `initialize()`, `get()`, `set()`, `delete()`, `delete_pattern()`, `close()` - - Graceful degradation: dacă Redis e down, log warning și return None - - Connection retry cu exponential backoff - - Template (vezi secțiunea Code Templates mai jos) - -4. [ ] **Adaugă env variables în .env.example** - - Fișier: `backend/.env.example` - - Acțiune: Adaugă la sfârșitul fișierului: - ```bash - # Redis Configuration - REDIS_URL=redis://roa-redis:6379/0 - REDIS_PASSWORD=roa2web_redis_password - REDIS_ENABLED=true - CACHE_DEFAULT_TTL=300 - ``` - -5. [ ] **Initialize Redis la startup în main.py** - - Fișier: `backend/app/main.py` - - Acțiune: În funcția `startup_event()`: - ```python - from shared.cache import redis_cache - - @app.on_event("startup") - async def startup_event(): - # ... existing oracle pool init ... - - # Initialize Redis cache - if os.getenv('REDIS_ENABLED', 'false').lower() == 'true': - await redis_cache.initialize( - url=os.getenv('REDIS_URL'), - password=os.getenv('REDIS_PASSWORD') - ) - - @app.on_event("shutdown") - async def shutdown_event(): - # ... existing oracle pool close ... - await redis_cache.close() - ``` - -**Output Verificabil:** - -- [ ] `pip install -r requirements.txt` rulează fără erori -- [ ] Redis client se conectează cu succes la container -- [ ] Test manual: `python -c "import asyncio; from shared.cache import redis_cache; asyncio.run(redis_cache.initialize())"` -- [ ] Log message: "✅ Redis cache initialized successfully" - ---- - -### FAZA 2: Cache Decorator și Helpers (30 min) - -**Obiectiv:** Creează decorator `@cached()` pentru aplicare ușoară în Services. - -**Tasks:** - -1. [ ] **Implementează cache key generator** - - Fișier: `shared/cache/utils.py` - - Acțiune: Funcții helper pentru key generation: - ```python - import hashlib - import json - from typing import Any, Dict - - def make_cache_key(tenant_id: str, resource: str, **params) -> str: - """ - Generate tenant-aware cache key - Format: cache:{tenant_id}:{resource}:{params_hash} - """ - params_str = json.dumps(params, sort_keys=True) - params_hash = hashlib.md5(params_str.encode()).hexdigest()[:12] - return f"cache:{tenant_id}:{resource}:{params_hash}" - - def extract_tenant_id(kwargs: Dict[str, Any]) -> str: - """ - Extract tenant_id from function kwargs - For now returns 'default', later extract from JWT token - """ - # TODO: Extract from request.state.tenant_id when multi-tenant implemented - return kwargs.get('tenant_id', 'default') - ``` - -2. [ ] **Implementează @cached decorator** - - Fișier: `shared/cache/decorators.py` - - Acțiune: Decorator pentru auto-caching de funcții async: - ```python - from functools import wraps - from typing import Callable, Optional - import logging - from .redis_client import redis_cache - from .utils import make_cache_key, extract_tenant_id - - logger = logging.getLogger(__name__) - - def cached(resource: str, ttl: int = 300): - """ - Cache decorator pentru funcții async - - Usage: - @cached(resource="dashboard_summary", ttl=300) - async def get_dashboard_summary(company: str, username: str): - # ... query Oracle ... - return data - - Args: - resource: Resource name (e.g., 'dashboard_summary', 'invoices_list') - ttl: Time-to-live în secunde (default: 5 min) - """ - def decorator(func: Callable): - @wraps(func) - async def wrapper(*args, **kwargs): - # Skip cache dacă Redis e disabled - if not redis_cache.is_enabled(): - return await func(*args, **kwargs) - - # Extract tenant_id și params pentru cache key - tenant_id = extract_tenant_id(kwargs) - cache_params = {k: v for k, v in kwargs.items() - if k not in ['username', 'current_user']} - - cache_key = make_cache_key(tenant_id, resource, **cache_params) - - # Try cache GET - cached_value = await redis_cache.get(cache_key) - if cached_value is not None: - logger.debug(f"Cache HIT: {cache_key}") - return cached_value - - # Cache MISS - execute function - logger.debug(f"Cache MISS: {cache_key}") - result = await func(*args, **kwargs) - - # Save to cache - await redis_cache.set(cache_key, result, ttl=ttl) - - return result - - return wrapper - return decorator - ``` - -3. [ ] **Implementează invalidate_cache helper** - - Fișier: `shared/cache/decorators.py` (same file) - - Acțiune: Helper function pentru manual invalidation: - ```python - async def invalidate_cache( - tenant_id: str = "default", - resource: Optional[str] = None - ): - """ - Invalidate cache entries - - Examples: - await invalidate_cache(resource="dashboard_summary") # clear specific resource - await invalidate_cache() # clear all for default tenant - """ - if not redis_cache.is_enabled(): - return - - if resource: - pattern = f"cache:{tenant_id}:{resource}:*" - else: - pattern = f"cache:{tenant_id}:*" - - await redis_cache.delete_pattern(pattern) - logger.info(f"Cache invalidated: {pattern}") - ``` - -**Output Verificabil:** - -- [ ] Decorator funcționează fără erori -- [ ] Cache key format: `cache:default:dashboard_summary:abc123` -- [ ] Test unit: `pytest shared/tests/test_cache_decorators.py -v` - ---- - -### FAZA 3: Aplicare în Endpoint-uri (45 min) - -**Obiectiv:** Aplică caching în Service layer pentru dashboard și invoices. - -**Tasks:** - -1. [ ] **Apply @cached în DashboardService.get_complete_summary()** - - Fișier: `backend/app/services/dashboard_service.py` - - Acțiune: Adaugă decorator la metoda `get_complete_summary`: - ```python - from shared.cache import cached - - class DashboardService: - @staticmethod - @cached(resource="dashboard_summary", ttl=300) # 5 min - async def get_complete_summary(company: str, username: str): - # ... existing implementation ... - ``` - - Motivație: Dashboard e accesat des, datele se schimbă rar - -2. [ ] **Apply @cached în DashboardService.get_trends()** - - Fișier: `backend/app/services/dashboard_service.py` - - Acțiune: Similar, TTL=180 (3 min pentru trends) - - Cache key va include period: `cache:default:dashboard_trends:company-X:period-30d:abc123` - -3. [ ] **Apply @cached în DashboardService.get_detailed_data()** - - Fișier: `backend/app/services/dashboard_service.py` - - Acțiune: TTL=60 (1 min pentru tabel detalii - se refreshează des) - - Cache key include page, page_size, search - -4. [ ] **Apply @cached în InvoiceService.get_invoices()** - - Fișier: `backend/app/services/invoice_service.py` - - Acțiune: TTL=60 (1 min) - - Cache key include filter params (partner_type, date_from, date_to, etc.) - -5. [ ] **Apply @cached în InvoiceService.get_invoice_summary()** - - Fișier: `backend/app/services/invoice_service.py` - - Acțiune: TTL=180 (3 min pentru summary) - -6. [ ] **Cache invalidation în dashboard mutations (viitor)** - - Fișier: `backend/app/routers/dashboard.py` - - Acțiune: Pregătește cod pentru invalidation (de activat când există POST/PUT/DELETE): - ```python - # TODO: Activate când implementăm mutations - # from shared.cache import invalidate_cache - # - # @router.post("/...") - # async def update_dashboard_data(...): - # # ... update logic ... - # await invalidate_cache(resource="dashboard_summary") - # await invalidate_cache(resource="dashboard_trends") - ``` - -7. [ ] **Cache invalidation în invoice mutations** - - Fișier: `backend/app/routers/invoices.py` - - Acțiune: Când se implementează POST/PUT/DELETE pentru invoices, invalidează: - - `invoices_list` - - `invoices_summary` - - `dashboard_summary` (afectează dashboard) - -**Output Verificabil:** - -- [ ] Backend pornește fără erori -- [ ] First request: Cache MISS + Oracle query (măsoară timp: ~500-1000ms) -- [ ] Second request (same params): Cache HIT (măsoară timp: ~10-20ms) -- [ ] Cache hit rate > 80% după 100 requests repetitive -- [ ] Logs arată `Cache HIT/MISS` messages - ---- - -### FAZA 4: Testing, Monitoring și Cleanup (45 min) - -**Obiectiv:** Validare funcționare corectă, performance benchmarks, și documentare. - -**Tasks:** - -1. [ ] **Unit tests pentru RedisCache client** - - Fișier: `shared/tests/test_redis_client.py` - - Acțiune: Testează: - - Connection success/failure - - Get/Set/Delete operations - - Pattern matching delete - - Graceful degradation când Redis e down - - Run: `pytest shared/tests/test_redis_client.py -v` - -2. [ ] **Unit tests pentru cache decorators** - - Fișier: `shared/tests/test_cache_decorators.py` - - Acțiune: Testează: - - Decorator aplică caching corect - - Cache key generation - - TTL respectat - - Invalidation funcționează - - Run: `pytest shared/tests/test_cache_decorators.py -v` - -3. [ ] **Integration test în Docker** - - Acțiune: Pornește stack complet cu `docker-compose up` - - Verifică: - - Backend se conectează la Redis - - Cache funcționează end-to-end - - Logs arată cache hits/misses - -4. [ ] **Performance benchmark** - - Tool: Apache Bench sau Python requests loop - - Test case: 100 requests la `/api/dashboard/summary?company=X` - - Măsoară: - - **Without cache** (REDIS_ENABLED=false): - - Avg response time: ~800ms - - Total time: ~80 seconds - - **With cache** (REDIS_ENABLED=true): - - First request: ~800ms (MISS) - - Next 99 requests: ~15ms (HIT) - - Total time: ~2 seconds - - **Improvement: 97.5%** - - Salvează results în `shared/docs/REDIS_PERFORMANCE_BENCHMARK.md` - -5. [ ] **Manual testing checklist** - - [ ] Dashboard: Refresh multiple ori (verify cache HIT în logs) - - [ ] Invoices: Filtrare diferită (verify cache keys unice) - - [ ] Redis failure test: Stop Redis container, verify app funcționează (fallback la Oracle) - - [ ] Cache invalidation: Manual invalidate via Redis CLI, verify re-query - -6. [ ] **Update CLAUDE.md documentation** - - Fișier: `CLAUDE.md` - - Acțiune: Adaugă secțiune "Redis Caching": - ```markdown - ## 💾 Redis Caching - - ROA2WEB folosește Redis pentru caching layer: - - - **Client**: `shared/cache/redis_client.py` (singleton pattern) - - **Decorator**: `@cached(resource="name", ttl=300)` în Services - - **Cache Keys**: `cache:{tenant_id}:{resource}:{params_hash}` - - **TTL Defaults**: - - Dashboard summary: 5 min - - Dashboard trends: 3 min - - Invoices list: 1 min - - Invoices summary: 3 min - - **Toggle cache:** Set `REDIS_ENABLED=false` în `.env` - - **Invalidate manual:** - ```python - from shared.cache import invalidate_cache - await invalidate_cache(resource="dashboard_summary") - ``` - - **Performance:** 60-80% reduction în query time pentru repetitive requests - ``` - -**Output Verificabil:** - -- [ ] All tests pass: `pytest shared/tests/ -v` -- [ ] Performance benchmark shows >60% improvement -- [ ] Manual testing checklist complet -- [ ] Documentation updated -- [ ] Ready for code review - ---- - -## 📊 Cache Strategy - -### Resource TTLs - -| Resource | TTL | Motivație | -|----------|-----|-----------| -| `dashboard_summary` | 300s (5 min) | Date agregate, se schimbă rar | -| `dashboard_trends` | 180s (3 min) | Trends calculation expensive | -| `dashboard_detailed_data` | 60s (1 min) | Tabel interactiv, refresh frecvent | -| `dashboard_performance` | 180s (3 min) | Performance metrics stabile | -| `dashboard_cashflow` | 180s (3 min) | Forecast calculation expensive | -| `dashboard_maturity` | 180s (3 min) | Maturity analysis complex | -| `invoices_list` | 60s (1 min) | Listing cu filtre, refresh frecvent | -| `invoices_summary` | 180s (3 min) | Summary stats stabile | -| `companies_list` | 600s (10 min) | Lista rareori se schimbă | -| `treasury_data` | 120s (2 min) | Trezorerie moderate changes | - -**Raționament TTL:** -- Scurt (60s): Date interactive, tabel listings -- Mediu (180-300s): Calculații expensive, agregări -- Lung (600s+): Date aproape statice (companies, permissions) - -### Cache Keys Pattern - -**Format:** `cache:{tenant_id}:{resource}:{params_hash}` - -**Exemplu concret:** -``` -cache:default:dashboard_summary:company-123:abc456def789 -cache:default:invoices_list:company-123:partner-CLIENTI:unpaid-true:xyz890 -cache:default:dashboard_trends:company-456:period-30d:compare-true:def123 -``` - -**Componente:** -- `cache:` - Prefix constant (pentru separare de alte Redis keys) -- `{tenant_id}` - Tenant ID (deocamdată "default", viitor: din JWT token) -- `{resource}` - Resource name (dashboard_summary, invoices_list, etc.) -- `{params_hash}` - MD5 hash (primele 12 caractere) al parametrilor sortați JSON - -**Multi-Tenant Ready:** -Când se implementează multi-tenant: -1. Modifică `extract_tenant_id()` în `utils.py` să citească din `request.state.tenant_id` -2. JWT token va include `tenant_id` field -3. Cache keys automat vor fi per-tenant -4. Invalidation per-tenant: `await invalidate_cache(tenant_id="client-a")` - -### Invalidation Rules - -**Trigger:** Când se schimbă date în Oracle DB - -| Mutation | Invalidate Resources | -|----------|---------------------| -| Invoice created/updated | `invoices_list`, `invoices_summary`, `dashboard_summary`, `dashboard_trends` | -| Payment recorded | `invoices_list`, `dashboard_summary`, `treasury_data`, `dashboard_cashflow` | -| Treasury transaction | `treasury_data`, `dashboard_summary`, `dashboard_cashflow` | -| Company settings changed | `companies_list`, `dashboard_*` (pentru acea companie) | - -**Implementare:** -```python -# În router după mutation -from shared.cache import invalidate_cache - -@router.post("/invoices/{invoice_id}/pay") -async def mark_invoice_paid(...): - # ... update DB ... - - # Invalidate affected caches - await invalidate_cache(resource="invoices_list") - await invalidate_cache(resource="invoices_summary") - await invalidate_cache(resource="dashboard_summary") - await invalidate_cache(resource="treasury_data") - - return {"status": "ok"} -``` - -**Pattern Matching:** -```python -# Invalidate toate cache-urile pentru dashboard -await invalidate_cache(resource="dashboard") # matches dashboard_* - -# Invalidate tot pentru un tenant -await invalidate_cache(tenant_id="client-a") # matches cache:client-a:* -``` - ---- - -## 🧪 Testing Plan - -### Unit Tests - -**File:** `shared/tests/test_redis_client.py` - -- [ ] `test_redis_connection_success()` - Verify successful connection -- [ ] `test_redis_connection_failure_graceful()` - Redis down, no exception thrown -- [ ] `test_redis_get_set_delete()` - Basic operations -- [ ] `test_redis_delete_pattern()` - Pattern matching deletion -- [ ] `test_redis_ttl_expiration()` - Verify TTL works -- [ ] `test_redis_connection_retry()` - Exponential backoff retry - -**File:** `shared/tests/test_cache_decorators.py` - -- [ ] `test_cached_decorator_hit()` - Second call returns cached value -- [ ] `test_cached_decorator_miss()` - First call queries function -- [ ] `test_cache_key_generation()` - Keys format correct -- [ ] `test_cache_key_unique_params()` - Different params = different keys -- [ ] `test_invalidate_cache_pattern()` - Invalidation works -- [ ] `test_cached_disabled()` - Works when REDIS_ENABLED=false - -### Integration Tests - -**Setup:** `docker-compose up -d` - -**Test Scenarios:** - -1. **Full Stack Test:** - - Start backend + Redis - - Call `/api/dashboard/summary?company=123` - - Verify: Oracle query executed (check logs) - - Call again same endpoint - - Verify: Cache hit (no Oracle query) - -2. **Cache Invalidation Test:** - - Call endpoint (cache populated) - - Invalidate via `redis-cli KEYS "cache:*"` + `DEL` - - Call endpoint again - - Verify: Oracle query executed (cache miss) - -3. **Redis Failure Test:** - - `docker-compose stop roa-redis` - - Call endpoint - - Verify: App works (fallback to Oracle) - - No error thrown - - Logs show warning: "Redis unavailable, fallback to DB" - -### Performance Benchmarks - -**Tool:** Apache Bench or Python script - -**Baseline (No Cache):** -```bash -# Stop Redis or set REDIS_ENABLED=false -ab -n 100 -c 10 http://localhost:8001/api/dashboard/summary?company=123 -# Expected: ~800ms avg response time, 80s total -``` - -**With Cache:** -```bash -# Start Redis and set REDIS_ENABLED=true -ab -n 100 -c 10 http://localhost:8001/api/dashboard/summary?company=123 -# Expected: ~15ms avg (after first request), ~2s total -``` - -**Target Metrics:** -- Cache hit rate: >90% (după warmup) -- Avg response time reduction: >60% -- Total time reduction: >75% -- Memory usage: +50-200MB (Redis) - -**Save Results:** `shared/docs/REDIS_PERFORMANCE_BENCHMARK.md` - -### Manual Testing Checklist - -- [ ] **Dashboard Summary:** - - [ ] First load → check logs for "Cache MISS" - - [ ] Refresh page → check logs for "Cache HIT" - - [ ] Change company → new cache key, "Cache MISS" - -- [ ] **Invoices List:** - - [ ] Filter: toate facturile → "Cache MISS" first time - - [ ] Refresh → "Cache HIT" - - [ ] Filter: doar neplatite → new key, "Cache MISS" - - [ ] Refresh → "Cache HIT" - -- [ ] **Cache Invalidation:** - - [ ] Load dashboard (cached) - - [ ] Redis CLI: `redis-cli KEYS "cache:*"` → see keys - - [ ] Delete: `redis-cli DEL cache:default:dashboard_summary:*` - - [ ] Refresh dashboard → "Cache MISS" (re-queries Oracle) - -- [ ] **Redis Failure Graceful:** - - [ ] Stop Redis: `docker-compose stop roa-redis` - - [ ] Access dashboard → works (no crash) - - [ ] Check logs: "Redis unavailable, using direct DB query" - - [ ] Start Redis: `docker-compose start roa-redis` - - [ ] Access dashboard → caching resume - -- [ ] **Multi-Tenant Simulation:** - - [ ] Load dashboard company=123 (tenant=default) - - [ ] Load dashboard company=456 (tenant=default) - - [ ] Verify different cache keys in Redis - ---- - -## 🔧 Configurare Env Variables - -**File:** `backend/.env` - -```bash -# ============================================================================ -# REDIS CONFIGURATION -# ============================================================================ - -# Redis Connection URL -# Development: redis://roa-redis:6379/0 (Docker network) -# Production: redis://redis-host:6379/0 or redis://localhost:6379/0 -REDIS_URL=redis://roa-redis:6379/0 - -# Redis Password (from docker-compose secrets) -# Match with REDIS_PASSWORD in docker-compose.yml -REDIS_PASSWORD=roa2web_redis_password - -# Enable/Disable Redis Caching -# Set to 'false' to disable caching (fallback to direct DB queries) -REDIS_ENABLED=true - -# Default Cache TTL (seconds) -# Used when no specific TTL provided to @cached decorator -CACHE_DEFAULT_TTL=300 - -# Redis Connection Pool Settings (optional, defaults shown) -REDIS_MAX_CONNECTIONS=50 -REDIS_SOCKET_CONNECT_TIMEOUT=5 -REDIS_SOCKET_KEEPALIVE=true -``` - -**Docker Compose Integration:** - -No changes needed! Redis container already configured in `docker-compose.yml:147-163`. - -**Verify:** -```bash -docker-compose exec roa-backend env | grep REDIS -# Should show REDIS_URL, REDIS_PASSWORD, REDIS_ENABLED -``` - ---- - -## 📝 Checklist Final - -### Pre-Implementation - -- [ ] Read și înțeles planul complet -- [ ] Backup codebase: `git commit -am "Backup before Redis implementation"` -- [ ] Redis container rulează: `docker-compose up -d roa-redis` -- [ ] Test connection: `docker-compose exec roa-redis redis-cli ping` → PONG - -### Faza 1 (Setup) - -- [ ] Dependency added: `redis>=5.0.0` în requirements.txt -- [ ] Package created: `shared/cache/__init__.py` -- [ ] Redis client: `shared/cache/redis_client.py` -- [ ] Env vars added: `backend/.env.example` -- [ ] Main.py updated: Redis initialize at startup -- [ ] Test: `python -c "import asyncio; from shared.cache import redis_cache; asyncio.run(redis_cache.initialize())"` - -### Faza 2 (Decorators) - -- [ ] Utils created: `shared/cache/utils.py` -- [ ] Decorator created: `shared/cache/decorators.py` -- [ ] Unit tests: `shared/tests/test_cache_decorators.py` -- [ ] Test: `pytest shared/tests/test_cache_decorators.py -v` - -### Faza 3 (Integration) - -- [ ] Cached applied: DashboardService.get_complete_summary -- [ ] Cached applied: DashboardService.get_trends -- [ ] Cached applied: DashboardService.get_detailed_data -- [ ] Cached applied: InvoiceService.get_invoices -- [ ] Cached applied: InvoiceService.get_invoice_summary -- [ ] Backend starts: `uvicorn app.main:app --reload` -- [ ] Test: First request slow, second fast - -### Faza 4 (Validation) - -- [ ] Unit tests pass: `pytest shared/tests/ -v` -- [ ] Integration tests pass (Docker stack) -- [ ] Performance benchmark run (save results) -- [ ] Manual testing checklist completed -- [ ] Documentation updated: `CLAUDE.md` -- [ ] Git commit: `git add . && git commit -m "feat: implement Redis caching layer"` - -### Ready for Production - -- [ ] All tests green -- [ ] Performance improvement >60% -- [ ] Graceful degradation tested (Redis failure) -- [ ] Code review requested -- [ ] Merge to main branch - ---- - -## 📚 Referințe - -### Documentație Existentă - -- **Docker Compose Redis Config:** `docker-compose.yml:147-163` -- **Oracle Pool Pattern:** `shared/database/oracle_pool.py` (reference for singleton pattern) -- **Backend Services:** `backend/app/services/` (where to apply caching) -- **Backend Routers:** `backend/app/routers/` (where to invalidate cache) - -### Documentație Externă - -- Redis Python Client: https://redis.readthedocs.io/en/stable/ -- Redis Commands: https://redis.io/commands/ -- FastAPI Async: https://fastapi.tiangolo.com/async/ - -### Debugging - -**Redis CLI Access:** -```bash -docker-compose exec roa-redis redis-cli -a roa2web_redis_password -> KEYS cache:* -> GET cache:default:dashboard_summary:abc123 -> DEL cache:default:dashboard_summary:abc123 -> FLUSHDB # Delete all keys (WARNING: destructive) -``` - -**Monitor Redis Operations:** -```bash -docker-compose exec roa-redis redis-cli -a roa2web_redis_password MONITOR -``` - -**Check Cache Stats:** -```bash -docker-compose exec roa-redis redis-cli -a roa2web_redis_password INFO stats -``` - ---- - -## 🎯 Code Templates - -### Template: RedisCache Client (`shared/cache/redis_client.py`) - -```python -""" -Redis Cache Client - Singleton pattern similar to OraclePool -Provides async Redis operations with graceful degradation -""" -import redis.asyncio as redis -import logging -import json -from typing import Optional, Any -import os - -logger = logging.getLogger(__name__) - -class RedisCache: - """Singleton Redis cache client with connection pooling""" - - _instance: Optional['RedisCache'] = None - _client: Optional[redis.Redis] = None - _enabled: bool = False - - def __new__(cls): - if cls._instance is None: - cls._instance = super(RedisCache, cls).__new__(cls) - return cls._instance - - async def initialize( - self, - url: str = None, - password: str = None, - max_connections: int = 50 - ): - """Initialize Redis connection pool""" - if self._client is not None: - return - - try: - url = url or os.getenv('REDIS_URL', 'redis://localhost:6379/0') - password = password or os.getenv('REDIS_PASSWORD') - - self._client = await redis.from_url( - url, - password=password, - encoding="utf-8", - decode_responses=True, - max_connections=max_connections, - socket_connect_timeout=5, - socket_keepalive=True - ) - - # Test connection - await self._client.ping() - - self._enabled = True - logger.info("✅ Redis cache initialized successfully") - - except Exception as e: - logger.warning(f"⚠️ Redis initialization failed: {e}. Caching disabled.") - self._enabled = False - self._client = None - - def is_enabled(self) -> bool: - """Check if Redis caching is enabled""" - return self._enabled and self._client is not None - - async def get(self, key: str) -> Optional[Any]: - """Get value from cache""" - if not self.is_enabled(): - return None - - try: - value = await self._client.get(key) - if value: - return json.loads(value) - return None - except Exception as e: - logger.error(f"Redis GET error for key {key}: {e}") - return None - - async def set(self, key: str, value: Any, ttl: int = 300): - """Set value in cache with TTL""" - if not self.is_enabled(): - return - - try: - value_json = json.dumps(value, default=str) - await self._client.setex(key, ttl, value_json) - except Exception as e: - logger.error(f"Redis SET error for key {key}: {e}") - - async def delete(self, key: str): - """Delete single key""" - if not self.is_enabled(): - return - - try: - await self._client.delete(key) - except Exception as e: - logger.error(f"Redis DELETE error for key {key}: {e}") - - async def delete_pattern(self, pattern: str): - """Delete all keys matching pattern (e.g., 'cache:default:dashboard*')""" - if not self.is_enabled(): - return - - try: - async for key in self._client.scan_iter(match=pattern): - await self._client.delete(key) - logger.debug(f"Deleted keys matching pattern: {pattern}") - except Exception as e: - logger.error(f"Redis DELETE_PATTERN error for {pattern}: {e}") - - async def close(self): - """Close Redis connection""" - if self._client: - await self._client.close() - self._client = None - self._enabled = False - logger.info("✅ Redis connection closed") - -# Global singleton instance -redis_cache = RedisCache() -``` - ---- - -## ⚠️ Known Limitations & Future Work - -### Current Limitations - -1. **No Cache Warming:** Cache is cold on startup (first requests slow) - - Future: Implement background task to pre-populate hot keys - -2. **Manual Invalidation:** Invalidation must be coded manually in routers - - Future: Auto-invalidation via database triggers or event system - -3. **Single Tenant:** All cache keys use `tenant_id="default"` - - Future: Extract tenant_id from JWT token when multi-tenant implemented - -4. **No Cache Monitoring:** No dashboard/metrics for cache performance - - Future: Integrate Prometheus metrics (hit/miss rate, latency, memory) - -5. **Simple Serialization:** Uses JSON (no support for binary data, datetime needs str conversion) - - Future: Consider msgpack for faster serialization - -### Future Enhancements - -- [ ] **Cache Warming:** Background task to pre-load hot keys at startup -- [ ] **Smart Invalidation:** Event-driven invalidation based on DB changes -- [ ] **Cache Monitoring Dashboard:** Redis metrics + hit/miss rates -- [ ] **Cache Compression:** Compress large values (>10KB) before storing -- [ ] **Multi-Level Cache:** L1 (in-memory LRU) + L2 (Redis) for ultra-fast access -- [ ] **Cache Tagging:** Tag-based invalidation instead of pattern matching - ---- - -## 📞 Support & Questions - -**Dacă întâmpini probleme:** - -1. **Redis nu pornește:** Check `docker-compose logs roa-redis` -2. **Connection failed:** Verify REDIS_URL și REDIS_PASSWORD în .env -3. **Cache nu funcționează:** Verify REDIS_ENABLED=true și logs pentru errors -4. **Performance nu se îmbunătățește:** Check cache hit rate în logs - -**Contact:** Claude Code Implementation Team - ---- - -**Planul este gata pentru implementare! Începe cu FAZA 1 și urmează pașii exact cum sunt descriși.** diff --git a/deploy-package-20260223-151231/shared/frontend/components/CompanySelector.vue b/deploy-package-20260223-151231/shared/frontend/components/CompanySelector.vue deleted file mode 100644 index ef88168..0000000 --- a/deploy-package-20260223-151231/shared/frontend/components/CompanySelector.vue +++ /dev/null @@ -1,577 +0,0 @@ - - - - - diff --git a/deploy-package-20260223-151231/shared/frontend/components/LoginView.vue b/deploy-package-20260223-151231/shared/frontend/components/LoginView.vue deleted file mode 100644 index 2660572..0000000 --- a/deploy-package-20260223-151231/shared/frontend/components/LoginView.vue +++ /dev/null @@ -1,212 +0,0 @@ - - - - - diff --git a/deploy-package-20260223-151231/shared/frontend/components/PeriodSelector.vue b/deploy-package-20260223-151231/shared/frontend/components/PeriodSelector.vue deleted file mode 100644 index 94b4d6f..0000000 --- a/deploy-package-20260223-151231/shared/frontend/components/PeriodSelector.vue +++ /dev/null @@ -1,467 +0,0 @@ - - - - - diff --git a/deploy-package-20260223-151231/shared/frontend/components/layout/AppHeader.vue b/deploy-package-20260223-151231/shared/frontend/components/layout/AppHeader.vue deleted file mode 100644 index a71bc70..0000000 --- a/deploy-package-20260223-151231/shared/frontend/components/layout/AppHeader.vue +++ /dev/null @@ -1,132 +0,0 @@ - - - diff --git a/deploy-package-20260223-151231/shared/frontend/components/layout/SlideMenu.vue b/deploy-package-20260223-151231/shared/frontend/components/layout/SlideMenu.vue deleted file mode 100644 index edb2689..0000000 --- a/deploy-package-20260223-151231/shared/frontend/components/layout/SlideMenu.vue +++ /dev/null @@ -1,101 +0,0 @@ - - - diff --git a/deploy-package-20260223-151231/shared/frontend/stores/accountingPeriod.js b/deploy-package-20260223-151231/shared/frontend/stores/accountingPeriod.js deleted file mode 100644 index 7470e45..0000000 --- a/deploy-package-20260223-151231/shared/frontend/stores/accountingPeriod.js +++ /dev/null @@ -1,158 +0,0 @@ -/** - * Shared Accounting Period Store Factory - * - * Creates a Pinia store for accounting period selection that can be used by any ROA2WEB application. - * Each app passes its own apiService and store references. - * - * Usage: - * import { createAccountingPeriodStore } from '@shared/frontend/stores/accountingPeriod'; - * import { apiService } from '../services/api'; - * import { useAuthStore } from './auth'; - * import { useCompanyStore } from './companies'; - * export const useAccountingPeriodStore = createAccountingPeriodStore(apiService, useAuthStore, useCompanyStore); - */ - -import { defineStore } from "pinia"; -import { ref, computed } from "vue"; - -/** - * Factory function to create an accounting period store - * @param {Object} apiService - Axios instance configured for the app's API - * @param {Function} useAuthStore - Reference to the auth store function - * @param {Function} useCompanyStore - Reference to the company store function - * @returns {Function} Pinia store definition - */ -export function createAccountingPeriodStore(apiService, useAuthStore, useCompanyStore) { - return defineStore("accountingPeriod", () => { - // State - const periods = ref([]); - const selectedPeriod = ref(null); - const isLoading = ref(false); - const error = ref(null); - - // Getters - const hasPeriods = computed(() => periods.value.length > 0); - const currentPeriod = computed(() => selectedPeriod.value); - - // Computed date range for current period (first/last day of month) - const dateRange = computed(() => { - if (!selectedPeriod.value) return { dateFrom: null, dateTo: null }; - - const { an, luna } = selectedPeriod.value; - const firstDay = new Date(an, luna - 1, 1); - const lastDay = new Date(an, luna, 0); - - return { - dateFrom: firstDay, - dateTo: lastDay, - }; - }); - - // localStorage helpers - const getStorageKey = () => { - const authStore = useAuthStore(); - const companyStore = useCompanyStore(); - const username = authStore.user?.username; - const companyId = companyStore.selectedCompany?.id_firma; - if (!username || !companyId) return null; - return `selected_period_${username}_${companyId}`; - }; - - const initializeSelectedPeriod = () => { - const key = getStorageKey(); - if (!key) return null; - - const saved = localStorage.getItem(key); - if (saved) { - try { - return JSON.parse(saved); - } catch (e) { - localStorage.removeItem(key); - } - } - return null; - }; - - const persistSelectedPeriod = (period) => { - const key = getStorageKey(); - if (key && period) { - localStorage.setItem(key, JSON.stringify(period)); - } - }; - - // Actions - const loadPeriods = async (companyId) => { - if (!companyId) return { success: false }; - - isLoading.value = true; - error.value = null; - - try { - const response = await apiService.get("/calendar/periods", { - params: { company: companyId }, - }); - - periods.value = response.data.periods || []; - - // Try to restore saved period or use most recent - const saved = initializeSelectedPeriod(); - if (saved) { - const exists = periods.value.find( - (p) => p.an === saved.an && p.luna === saved.luna - ); - if (exists) { - selectedPeriod.value = exists; - } else if (response.data.current_period) { - setSelectedPeriod(response.data.current_period); - } - } else if (response.data.current_period) { - setSelectedPeriod(response.data.current_period); - } - - return { success: true }; - } catch (err) { - error.value = err.response?.data?.detail || "Failed to load periods"; - return { success: false, error: error.value }; - } finally { - isLoading.value = false; - } - }; - - const setSelectedPeriod = (period) => { - selectedPeriod.value = period; - persistSelectedPeriod(period); - }; - - const resetToLatest = () => { - if (periods.value.length > 0) { - setSelectedPeriod(periods.value[0]); - } - }; - - const reset = () => { - periods.value = []; - selectedPeriod.value = null; - isLoading.value = false; - error.value = null; - }; - - return { - // State - periods, - selectedPeriod, - isLoading, - error, - - // Getters - hasPeriods, - currentPeriod, - dateRange, - - // Actions - loadPeriods, - setSelectedPeriod, - resetToLatest, - reset, - }; - }); -} diff --git a/deploy-package-20260223-151231/shared/frontend/stores/auth.js b/deploy-package-20260223-151231/shared/frontend/stores/auth.js deleted file mode 100644 index fa89962..0000000 --- a/deploy-package-20260223-151231/shared/frontend/stores/auth.js +++ /dev/null @@ -1,133 +0,0 @@ -/** - * Shared Auth Store Factory - * - * Creates a Pinia auth store that can be used by any ROA2WEB application. - * Each app passes its own apiService instance configured with the correct baseURL. - * - * Usage: - * import { createAuthStore } from '@shared/frontend/stores/auth'; - * import { apiService } from '../services/api'; - * export const useAuthStore = createAuthStore(apiService); - */ - -import { defineStore } from "pinia"; -import { ref, computed } from "vue"; - -/** - * Factory function to create an auth store with the provided API service - * @param {Object} apiService - Axios instance configured for the app's API - * @returns {Function} Pinia store definition - */ -export function createAuthStore(apiService) { - return defineStore("auth", () => { - // State - const accessToken = ref(localStorage.getItem("access_token")); - const refreshToken = ref(localStorage.getItem("refresh_token")); - const user = ref(JSON.parse(localStorage.getItem("user") || "null")); - const isLoading = ref(false); - const error = ref(null); - - // Getters - const isAuthenticated = computed(() => !!accessToken.value); - const currentUser = computed(() => user.value); - - // Actions - const login = async (credentials) => { - isLoading.value = true; - error.value = null; - - try { - const response = await apiService.post("/auth/login", { - username: credentials.username, - password: credentials.password, - }); - const { access_token, refresh_token, user: userData } = response.data; - - accessToken.value = access_token; - refreshToken.value = refresh_token; - user.value = userData; - - localStorage.setItem("access_token", access_token); - localStorage.setItem("refresh_token", refresh_token); - localStorage.setItem("user", JSON.stringify(userData)); - - apiService.defaults.headers.common["Authorization"] = `Bearer ${access_token}`; - - return { success: true }; - } catch (err) { - error.value = err.response?.data?.detail || "Login failed"; - return { success: false, error: error.value }; - } finally { - isLoading.value = false; - } - }; - - const logout = () => { - accessToken.value = null; - refreshToken.value = null; - user.value = null; - error.value = null; - - localStorage.removeItem("access_token"); - localStorage.removeItem("refresh_token"); - localStorage.removeItem("user"); - - delete apiService.defaults.headers.common["Authorization"]; - }; - - const refreshAccessToken = async () => { - if (!refreshToken.value) { - logout(); - return false; - } - - try { - const response = await apiService.post("/auth/refresh", { - refresh_token: refreshToken.value, - }); - - const { access_token } = response.data; - accessToken.value = access_token; - localStorage.setItem("access_token", access_token); - apiService.defaults.headers.common["Authorization"] = `Bearer ${access_token}`; - - return true; - } catch (err) { - console.error("Token refresh failed:", err); - logout(); - return false; - } - }; - - const initializeAuth = () => { - if (accessToken.value) { - apiService.defaults.headers.common["Authorization"] = `Bearer ${accessToken.value}`; - } - }; - - const clearError = () => { - error.value = null; - }; - - // Initialize on store creation - initializeAuth(); - - return { - // State - accessToken, - refreshToken, - user, - isLoading, - error, - // Getters - isAuthenticated, - currentUser, - // Actions - login, - logout, - refreshAccessToken, - initializeAuth, - clearError, - }; - }); -} diff --git a/deploy-package-20260223-151231/shared/frontend/stores/companies.js b/deploy-package-20260223-151231/shared/frontend/stores/companies.js deleted file mode 100644 index 35f9bbb..0000000 --- a/deploy-package-20260223-151231/shared/frontend/stores/companies.js +++ /dev/null @@ -1,196 +0,0 @@ -/** - * Shared Companies Store Factory - * - * Creates a Pinia store for company selection that can be used by any ROA2WEB application. - * Each app passes its own apiService and auth store instances. - * - * Usage: - * import { createCompaniesStore } from '@shared/frontend/stores/companies'; - * import { apiService } from '../services/api'; - * import { useAuthStore } from './auth'; - * export const useCompanyStore = createCompaniesStore(apiService, useAuthStore); - */ - -import { defineStore } from "pinia"; -import { ref, computed, watch } from "vue"; - -/** - * Factory function to create a companies store - * @param {Object} apiService - Axios instance configured for the app's API - * @param {Function} useAuthStore - Reference to the auth store function - * @returns {Function} Pinia store definition - */ -export function createCompaniesStore(apiService, useAuthStore) { - return defineStore("companies", () => { - // State - const companies = ref([]); - const selectedCompany = ref(null); - const isLoading = ref(false); - const error = ref(null); - - // Initialize from localStorage - per user - const initializeSelectedCompany = () => { - const authStore = useAuthStore(); - const username = authStore.user?.username; - - if (!username) { - console.log("[Companies] No username available for initialization"); - return null; - } - - const key = `selected_company_${username}`; - const saved = localStorage.getItem(key); - if (saved) { - try { - const company = JSON.parse(saved); - console.log(`[Companies] Loaded saved company for ${username}:`, company.name); - return company; - } catch (e) { - console.error("Failed to parse saved company", e); - localStorage.removeItem(key); - } - } - return null; - }; - - // Watch for auth user changes to restore selected company - const authStore = useAuthStore(); - watch( - () => authStore.user, - (newUser) => { - if (newUser && newUser.username && !selectedCompany.value) { - const restoredCompany = initializeSelectedCompany(); - if (restoredCompany) { - selectedCompany.value = restoredCompany; - console.log("[Companies] Restored selected company:", restoredCompany.name); - } - } - }, - { immediate: true } - ); - - // Getters - const companyList = computed(() => companies.value); - const hasCompanies = computed(() => companies.value.length > 0); - const selectedCompanyId = computed(() => selectedCompany.value?.id_firma || null); - - const companyListFormatted = computed(() => { - return companies.value.map((company) => ({ - ...company, - displayName: company.fiscal_code - ? `${company.name} (${company.fiscal_code})` - : company.name, - })); - }); - - // Actions - const loadCompanies = async () => { - isLoading.value = true; - error.value = null; - - try { - console.log("[Companies] Loading companies..."); - const response = await apiService.get("/companies"); - companies.value = response.data.companies || []; - console.log("[Companies] Loaded", companies.value.length, "companies"); - - // Validate saved company is still accessible - if (selectedCompany.value) { - const exists = companies.value.find( - (c) => c.id_firma === selectedCompany.value.id_firma - ); - if (!exists) { - console.warn("[Companies] Saved company not accessible, clearing"); - clearSelectedCompany(); - } - } - - return { success: true }; - } catch (err) { - error.value = err.response?.data?.detail || "Failed to load companies"; - console.error("Failed to load companies:", err); - return { success: false, error: error.value }; - } finally { - isLoading.value = false; - } - }; - - const setSelectedCompany = (company) => { - selectedCompany.value = company; - - const authStore = useAuthStore(); - const username = authStore.user?.username; - - if (!username) { - console.warn("[Companies] Cannot save - no username"); - return; - } - - const key = `selected_company_${username}`; - if (company) { - localStorage.setItem(key, JSON.stringify(company)); - console.log(`[Companies] Saved company for ${username}:`, company.name); - } else { - localStorage.removeItem(key); - } - }; - - const clearSelectedCompany = () => { - selectedCompany.value = null; - - const authStore = useAuthStore(); - const username = authStore.user?.username; - - if (username) { - const key = `selected_company_${username}`; - localStorage.removeItem(key); - } - }; - - const getCompanyById = (id_firma) => { - return companies.value.find( - (company) => company.id_firma === parseInt(id_firma) - ); - }; - - const clearError = () => { - error.value = null; - }; - - const reset = () => { - companies.value = []; - selectedCompany.value = null; - isLoading.value = false; - error.value = null; - - const authStore = useAuthStore(); - const username = authStore.user?.username; - if (username) { - const key = `selected_company_${username}`; - localStorage.removeItem(key); - } - }; - - return { - // State - companies, - selectedCompany, - isLoading, - error, - - // Getters - companyList, - companyListFormatted, - hasCompanies, - selectedCompanyId, - - // Actions - loadCompanies, - setSelectedCompany, - clearSelectedCompany, - getCompanyById, - clearError, - reset, - }; - }); -} diff --git a/deploy-package-20260223-151231/shared/frontend/styles/layout/header.css b/deploy-package-20260223-151231/shared/frontend/styles/layout/header.css deleted file mode 100644 index 9ccb715..0000000 --- a/deploy-package-20260223-151231/shared/frontend/styles/layout/header.css +++ /dev/null @@ -1,167 +0,0 @@ -/* Shared Header Styles - ROA2WEB */ - -/* Header Container */ -.header-container { - position: sticky; - top: 0; - z-index: var(--z-header, 100); - background: var(--color-bg, #fff); - border-bottom: 1px solid var(--color-border, #e5e7eb); - height: var(--header-height, 60px); - padding: 0 var(--space-lg, 24px); -} - -/* Gradient Header Variant */ -.header-container--gradient { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - border-bottom: none; -} - -.header-container--gradient .header-brand { - color: white; -} - -.header-container--gradient .hamburger-line { - background-color: white; -} - -/* Header Navigation */ -.header-nav { - display: flex; - align-items: center; - justify-content: space-between; - width: 100%; - height: 100%; - max-width: 1600px; - margin: 0 auto; -} - -/* Header Left Section */ -.header-left { - display: flex; - align-items: center; - gap: var(--space-md, 16px); -} - -/* Brand/Logo */ -.header-brand { - display: flex; - align-items: center; - gap: var(--space-sm, 8px); - font-size: var(--text-lg, 18px); - font-weight: var(--font-semibold, 600); - color: var(--color-primary, #2563eb); - text-decoration: none; - white-space: nowrap; -} - -.header-brand:hover { - opacity: 0.9; -} - -/* Header Actions (right side) */ -.header-actions { - display: flex; - align-items: center; - gap: var(--space-md, 16px); -} - -/* Hamburger Button */ -.hamburger-btn { - display: flex; - flex-direction: column; - justify-content: space-around; - width: 32px; - height: 32px; - background: transparent; - border: none; - cursor: pointer; - padding: 4px; - z-index: 10; - transition: all 0.3s ease; -} - -.hamburger-btn:hover { - opacity: 0.7; -} - -.hamburger-line { - width: 100%; - height: 3px; - background-color: var(--color-primary, #2563eb); - border-radius: 2px; - transition: all 0.3s ease; - transform-origin: center; -} - -/* Hamburger Animation - X state */ -.hamburger-btn.active .hamburger-line:nth-child(1) { - transform: translateY(9px) rotate(45deg); -} - -.hamburger-btn.active .hamburger-line:nth-child(2) { - opacity: 0; -} - -.hamburger-btn.active .hamburger-line:nth-child(3) { - transform: translateY(-9px) rotate(-45deg); -} - -/* Header User Menu */ -.header-user { - display: flex; - align-items: center; - gap: var(--space-sm, 8px); - padding: var(--space-sm, 8px); - border-radius: var(--radius-md, 6px); - cursor: pointer; - transition: background-color 0.15s ease; - color: var(--color-text, #111827); -} - -.header-user:hover { - background-color: var(--color-bg-secondary, #f9fafb); -} - -/* Gradient header user menu */ -.header-container--gradient .header-user { - color: white; -} - -.header-container--gradient .header-user:hover { - background-color: rgba(255, 255, 255, 0.1); -} - -/* Mobile Responsive */ -@media (max-width: 768px) { - .header-container { - padding: 0 var(--space-md, 12px); - } - - .header-left { - gap: var(--space-sm, 8px); - } - - .header-actions { - gap: var(--space-sm, 8px); - } - - .header-brand { - font-size: var(--text-base, 16px); - } - - /* Hide text-only elements on mobile */ - .desktop-only { - display: none; - } -} - -@media (max-width: 480px) { - .header-brand span { - display: none; - } - - .header-brand i { - font-size: 1.5rem; - } -} diff --git a/deploy-package-20260223-151231/shared/frontend/styles/layout/navigation.css b/deploy-package-20260223-151231/shared/frontend/styles/layout/navigation.css deleted file mode 100644 index 2814d7f..0000000 --- a/deploy-package-20260223-151231/shared/frontend/styles/layout/navigation.css +++ /dev/null @@ -1,151 +0,0 @@ -/* Shared Navigation Styles - ROA2WEB */ - -/* Slide-out Menu */ -.slide-menu { - position: fixed; - top: var(--header-height, 60px); - left: 0; - width: var(--sidebar-width, 280px); - height: calc(100vh - var(--header-height, 60px)); - background: var(--color-bg, #fff); - border-right: 1px solid var(--color-border, #e5e7eb); - box-shadow: var(--shadow-lg, 0 10px 15px -3px rgba(0, 0, 0, 0.1)); - transform: translateX(-100%); - transition: transform 0.3s ease; - z-index: var(--z-modal, 1000); - overflow-y: auto; - /* Flex container for profile section at bottom */ - display: flex; - flex-direction: column; -} - -.slide-menu.open { - transform: translateX(0); -} - -/* Menu Overlay */ -.slide-menu-overlay { - position: fixed; - top: var(--header-height, 60px); - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.5); - opacity: 0; - visibility: hidden; - transition: all 0.3s ease; - z-index: var(--z-modal-backdrop, 999); -} - -.slide-menu-overlay.open { - opacity: 1; - visibility: visible; -} - -/* Menu Sections */ -.menu-section { - padding: var(--space-lg, 24px); - border-bottom: 1px solid var(--color-border, #e5e7eb); -} - -.menu-section:last-child { - border-bottom: none; -} - -/* Profile section at bottom */ -.menu-section.menu-profile { - margin-top: auto; - border-top: 1px solid var(--color-border, #e5e7eb); - border-bottom: none; -} - -.menu-title { - font-size: var(--text-sm, 14px); - font-weight: var(--font-semibold, 600); - color: var(--color-text-secondary, #6b7280); - text-transform: uppercase; - letter-spacing: 0.05em; - margin-bottom: var(--space-md, 12px); -} - -.menu-list { - list-style: none; - margin: 0; - padding: 0; -} - -.menu-item { - margin-bottom: var(--space-xs, 4px); -} - -.menu-link { - display: flex; - align-items: center; - gap: var(--space-sm, 8px); - padding: var(--space-sm, 8px) var(--space-md, 12px); - color: var(--color-text, #111827); - text-decoration: none; - border-radius: var(--radius-md, 6px); - transition: all 0.15s ease; - font-size: var(--text-sm, 14px); -} - -.menu-link:hover, -.menu-link.active { - background-color: var(--color-bg-secondary, #f9fafb); - color: var(--color-primary, #2563eb); -} - -.menu-icon { - width: 18px; - height: 18px; - flex-shrink: 0; - font-size: 16px; -} - -/* Profile Info */ -.profile-info { - display: flex; - align-items: center; - gap: var(--space-sm, 8px); - padding: var(--space-sm, 8px) var(--space-md, 12px); - margin-bottom: var(--space-sm, 8px); - font-weight: var(--font-medium, 500); - color: var(--color-text, #111827); -} - -.profile-info i { - font-size: 1.25rem; - color: var(--color-primary, #2563eb); -} - -/* Badge for menu items */ -.menu-badge { - margin-left: auto; - background: var(--color-danger, #ef4444); - color: white; - font-size: var(--text-xs, 12px); - font-weight: var(--font-semibold, 600); - padding: 2px 6px; - border-radius: var(--radius-full, 9999px); - min-width: 20px; - text-align: center; -} - -/* Mobile Responsive */ -@media (max-width: 768px) { - .slide-menu { - width: 280px; - } - - .menu-section { - padding: var(--space-md, 12px); - } -} - -@media (max-width: 480px) { - .slide-menu { - width: 100vw; - max-width: 320px; - } -} diff --git a/deploy-package-20260223-151231/shared/frontend/styles/login.css b/deploy-package-20260223-151231/shared/frontend/styles/login.css deleted file mode 100644 index 7b27e83..0000000 --- a/deploy-package-20260223-151231/shared/frontend/styles/login.css +++ /dev/null @@ -1,179 +0,0 @@ -/* Shared Login Page Styles */ - -.login-container { - min-height: 100vh; - display: flex; - align-items: center; - justify-content: center; - background: linear-gradient( - 135deg, - var(--color-primary-light) 0%, - var(--color-primary) 100% - ); - padding: 1rem; -} - -.login-wrapper { - width: 100%; - max-width: 400px; -} - -.login-card { - box-shadow: 0 25px 50px rgba(0, 0, 0, 0.15); - border-radius: 16px; - overflow: hidden; - border: 1px solid rgba(255, 255, 255, 0.1); - background: var(--surface-card); -} - -.login-header { - text-align: center; - padding: 2rem 2rem 1rem 2rem; - background: var(--surface-card); -} - -.login-title { - margin: 1rem 0 0.5rem 0; - color: var(--primary-color); - font-size: 2rem; - font-weight: 700; -} - -.login-subtitle { - margin: 0; - color: var(--text-color-secondary); - font-size: 0.95rem; -} - -.login-form { - padding: 0 2rem 2rem 2rem; - background: var(--surface-card); -} - -.login-button { - margin-top: 1rem; - padding: 0.75rem; - font-size: 1.1rem; - font-weight: 600; - background: var(--color-primary-light) !important; - color: white !important; - border: none !important; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - transition: all 0.3s ease; -} - -.login-button:hover { - background: var(--color-primary) !important; - box-shadow: 0 6px 12px rgba(0, 0, 0, 0.15); - transform: translateY(-2px); -} - -.login-button:active { - transform: translateY(0); - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1); -} - -.login-error-message { - display: flex; - align-items: center; - gap: 0.5rem; - padding: 0.75rem; - margin-bottom: 1rem; - background-color: var(--red-50); - color: var(--red-800); - border: 1px solid var(--red-200); - border-radius: 6px; - font-size: 0.9rem; -} - -.login-footer { - text-align: center; - padding: 1rem 2rem; - background-color: var(--surface-50); - border-top: 1px solid var(--surface-200); -} - -/* Responsive design */ -@media (max-width: 768px) { - .login-container { - padding: 0.5rem; - } - - .login-wrapper { - max-width: 100%; - padding: 0 1rem; - } - - .login-card { - border-radius: 8px; - } - - .login-header { - padding: 1.5rem 1rem; - } - - .login-title { - font-size: 1.5rem; - } - - .login-form { - padding: 0 1rem 1.5rem 1rem; - } - - /* Ensure inputs are touch-friendly */ - .login-container .p-inputtext, - .login-container .p-password input { - min-height: 44px; - font-size: 16px; /* Prevents zoom on iOS */ - } - - .login-footer { - padding: 1rem; - } -} - -@media (max-width: 480px) { - .login-container { - padding: 0.25rem; - } - - .login-card { - margin: 0; - } - - .login-header { - padding: 1rem 0.5rem; - } - - .login-title { - font-size: 1.25rem; - } - - .login-subtitle { - font-size: 0.875rem; - } - - .login-form { - padding: 0 0.5rem 1rem 0.5rem; - } - - .login-footer { - padding: 0.75rem 0.5rem; - } -} - -/* Animation for smooth transitions */ -.login-card { - animation: loginFadeInUp 0.6s ease-out; -} - -@keyframes loginFadeInUp { - from { - opacity: 0; - transform: translateY(30px); - } - to { - opacity: 1; - transform: translateY(0); - } -} diff --git a/deploy-package-20260223-151231/shared/models/__init__.py b/deploy-package-20260223-151231/shared/models/__init__.py deleted file mode 100644 index d78bbbc..0000000 --- a/deploy-package-20260223-151231/shared/models/__init__.py +++ /dev/null @@ -1,11 +0,0 @@ -"""Shared Pydantic models for ROA2WEB applications.""" - -from .company import Company, CompanyListResponse -from .calendar import CalendarPeriod, CalendarPeriodsResponse - -__all__ = [ - "Company", - "CompanyListResponse", - "CalendarPeriod", - "CalendarPeriodsResponse", -] diff --git a/deploy-package-20260223-151231/shared/models/calendar.py b/deploy-package-20260223-151231/shared/models/calendar.py deleted file mode 100644 index 5de6969..0000000 --- a/deploy-package-20260223-151231/shared/models/calendar.py +++ /dev/null @@ -1,18 +0,0 @@ -"""Calendar/accounting period models for ROA2WEB applications.""" - -from typing import List, Optional -from pydantic import BaseModel - - -class CalendarPeriod(BaseModel): - """Model for an accounting period.""" - an: int # Year - luna: int # Month (1-12) - display_name: str # Format: "Decembrie 2025" - - -class CalendarPeriodsResponse(BaseModel): - """Response model for calendar periods list.""" - periods: List[CalendarPeriod] - current_period: Optional[CalendarPeriod] = None - total_count: int diff --git a/deploy-package-20260223-151231/shared/models/company.py b/deploy-package-20260223-151231/shared/models/company.py deleted file mode 100644 index ffdfaae..0000000 --- a/deploy-package-20260223-151231/shared/models/company.py +++ /dev/null @@ -1,19 +0,0 @@ -"""Company models for ROA2WEB applications.""" - -from typing import List, Optional -from pydantic import BaseModel - - -class Company(BaseModel): - """Model for a company/firma.""" - id_firma: int - name: str - schema_name: str - fiscal_code: Optional[str] = None - is_active: bool = True - - -class CompanyListResponse(BaseModel): - """Response model for list of companies.""" - companies: List[Company] - total_count: int diff --git a/deploy-package-20260223-151231/shared/routes/__init__.py b/deploy-package-20260223-151231/shared/routes/__init__.py deleted file mode 100644 index 385afc9..0000000 --- a/deploy-package-20260223-151231/shared/routes/__init__.py +++ /dev/null @@ -1,21 +0,0 @@ -""" -Shared Routes for ROA2WEB Applications - -This module provides factory functions for creating common API routers -that can be mounted in both the unified monolith backend. - -Usage: - from shared.routes import create_companies_router, create_calendar_router - - # In main.py - companies_router = create_companies_router(oracle_pool) - app.include_router(companies_router, prefix="/api/companies") -""" - -from .companies import create_companies_router -from .calendar import create_calendar_router - -__all__ = [ - "create_companies_router", - "create_calendar_router", -] diff --git a/deploy-package-20260223-151231/shared/routes/calendar.py b/deploy-package-20260223-151231/shared/routes/calendar.py deleted file mode 100644 index 8672d9f..0000000 --- a/deploy-package-20260223-151231/shared/routes/calendar.py +++ /dev/null @@ -1,151 +0,0 @@ -""" -Shared Calendar Router Factory for ROA2WEB Applications - -Creates a FastAPI router for /api/calendar endpoints that can be used -by both the unified monolith backend. - -Usage: - from shared.routes.calendar import create_calendar_router - - calendar_router = create_calendar_router(oracle_pool, cache_decorator=cached) - app.include_router(calendar_router, prefix="/api/calendar") -""" - -import logging -from typing import Optional, Callable, List - -from fastapi import APIRouter, Depends, HTTPException, Query, Request - -from auth.dependencies import get_current_user -from auth.models import CurrentUser -from models.calendar import CalendarPeriod, CalendarPeriodsResponse - -logger = logging.getLogger(__name__) - -# Romanian month names -MONTH_NAMES_RO = [ - "Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", - "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie" -] - - -def create_calendar_router( - oracle_pool, - cache_decorator: Optional[Callable] = None, - tags: Optional[List[str]] = None -) -> APIRouter: - """ - Factory function to create a calendar router. - - Args: - oracle_pool: The Oracle connection pool instance - cache_decorator: Optional caching decorator (e.g., @cached) - tags: OpenAPI tags for the router - - Returns: - Configured FastAPI router for calendar endpoints - """ - router = APIRouter( - redirect_slashes=False, - tags=tags or ["calendar"] - ) - - # Helper to get schema for company - async def _get_schema_for_company(company_id: int, server_id: Optional[str] = None) -> Optional[str]: - """Get Oracle schema for company ID. - - Args: - company_id: The company ID to get schema for - server_id: The Oracle server ID (for multi-server mode) - """ - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - cursor.execute(""" - SELECT SCHEMA FROM CONTAFIN_ORACLE.V_NOM_FIRME - WHERE ID_FIRMA = :company_id - """, {'company_id': company_id}) - result = cursor.fetchone() - return result[0] if result else None - - # Apply cache to schema lookup if decorator provided - # Include server_id in cache key for multi-server mode - if cache_decorator: - _get_schema_for_company = cache_decorator( - cache_type='schema', - key_params=['company_id', 'server_id'] - )(_get_schema_for_company) - - # Helper to get periods - can be cached - async def _get_available_periods(company_id: int, server_id: Optional[str] = None) -> CalendarPeriodsResponse: - """Get available accounting periods for a company. - - Args: - company_id: The company ID to get periods for - server_id: The Oracle server ID (for multi-server mode) - """ - schema = await _get_schema_for_company(company_id, server_id) - if not schema: - logger.warning(f"Schema not found for company {company_id}") - return CalendarPeriodsResponse(periods=[], current_period=None, total_count=0) - - try: - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - cursor.execute(f""" - SELECT ANUL, LUNA - FROM {schema}.CALENDAR - ORDER BY ANUL DESC, LUNA DESC - """) - rows = cursor.fetchall() - - periods = [] - for row in rows: - an, luna = row[0], row[1] - month_name = MONTH_NAMES_RO[luna - 1] - periods.append(CalendarPeriod( - an=an, - luna=luna, - display_name=f"{month_name} {an}" - )) - - current_period = periods[0] if periods else None - - logger.info(f"Loaded {len(periods)} periods for company {company_id}") - - return CalendarPeriodsResponse( - periods=periods, - current_period=current_period, - total_count=len(periods) - ) - - except Exception as e: - logger.error(f"Error fetching periods for company {company_id}: {e}") - return CalendarPeriodsResponse(periods=[], current_period=None, total_count=0) - - # Apply cache decorator if provided - # Include server_id in cache key for multi-server mode - if cache_decorator: - _get_available_periods = cache_decorator( - cache_type='calendar_periods', - key_params=['company_id', 'server_id'] - )(_get_available_periods) - - @router.get("/periods", response_model=CalendarPeriodsResponse) - async def get_calendar_periods( - request: Request, - company: int = Query(..., description="Company ID"), - current_user: CurrentUser = Depends(get_current_user) - ) -> CalendarPeriodsResponse: - """ - Get available accounting periods for a company. - Returns periods ordered by year DESC, month DESC with Romanian month names. - """ - # Validate company access - if str(company) not in current_user.companies: - raise HTTPException(403, f"Nu aveți acces la firma {company}") - - # Get server_id from request state (injected by auth middleware from JWT) - server_id = getattr(request.state, 'server_id', None) - return await _get_available_periods(company, server_id) - - return router diff --git a/deploy-package-20260223-151231/shared/routes/companies.py b/deploy-package-20260223-151231/shared/routes/companies.py deleted file mode 100644 index 26079f0..0000000 --- a/deploy-package-20260223-151231/shared/routes/companies.py +++ /dev/null @@ -1,185 +0,0 @@ -""" -Shared Companies Router Factory for ROA2WEB Applications - -Creates a FastAPI router for /api/companies endpoints that can be used -by both the unified monolith backend. - -Usage: - from shared.routes.companies import create_companies_router - - companies_router = create_companies_router(oracle_pool, cache_decorator=cached) - app.include_router(companies_router, prefix="/api/companies") -""" - -import logging -from typing import Optional, Callable, List - -from fastapi import APIRouter, Depends, HTTPException, Request - -from auth.dependencies import get_current_user -from auth.models import CurrentUser -from models.company import Company, CompanyListResponse - -logger = logging.getLogger(__name__) - - -def create_companies_router( - oracle_pool, - cache_decorator: Optional[Callable] = None, - tags: Optional[List[str]] = None -) -> APIRouter: - """ - Factory function to create a companies router. - - Args: - oracle_pool: The Oracle connection pool instance - cache_decorator: Optional caching decorator (e.g., @cached) - tags: OpenAPI tags for the router - - Returns: - Configured FastAPI router for company endpoints - """ - router = APIRouter( - redirect_slashes=False, - tags=tags or ["companies"] - ) - - # Helper function to get companies - can be cached - async def _get_user_companies_data(username: str, server_id: Optional[str] = None) -> List[Company]: - """ - Get list of companies for a user from Oracle. - - Args: - username: The username to get companies for - server_id: The Oracle server ID (for multi-server mode) - """ - companies = [] - - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - try: - # Get user ID - cursor.execute(""" - SELECT ID_UTIL, UTILIZATOR - FROM UTILIZATORI - WHERE UPPER(UTILIZATOR) = :username - """, {'username': username.upper()}) - - user_row = cursor.fetchone() - if not user_row: - logger.warning(f"User {username} not found in UTILIZATORI") - return [] - - user_id = user_row[0] - - # Get companies for user (program 2 = data entry/reports) - cursor.execute(""" - SELECT A.ID_FIRMA, A.FIRMA, A.SCHEMA, A.COD_FISCAL - FROM V_NOM_FIRME A - WHERE A.ID_FIRMA IN ( - SELECT ID_FIRMA - FROM VDEF_UTIL_FIRME - WHERE ID_PROGRAM = 2 AND ID_UTIL = :user_id - ) - ORDER BY A.FIRMA - """, {'user_id': user_id}) - - for row in cursor.fetchall(): - companies.append(Company( - id_firma=row[0], - name=row[1], - schema_name=row[2], - fiscal_code=row[3], - is_active=True - )) - - logger.info(f"Found {len(companies)} companies for user {username}") - - except Exception as e: - logger.error(f"Error fetching companies: {e}") - - return companies - - # Apply cache decorator if provided - # Include server_id in cache key for multi-server mode - if cache_decorator: - _get_user_companies_data = cache_decorator( - cache_type='companies', - key_params=['username', 'server_id'] - )(_get_user_companies_data) - - @router.get("", response_model=CompanyListResponse) - @router.get("/", response_model=CompanyListResponse) - async def get_user_companies( - request: Request, - current_user: CurrentUser = Depends(get_current_user) - ): - """Get list of companies the user has access to.""" - try: - # Get server_id from request state (injected by auth middleware from JWT) - server_id = getattr(request.state, 'server_id', None) - companies = await _get_user_companies_data(current_user.username, server_id) - - return CompanyListResponse( - companies=companies, - total_count=len(companies) - ) - except Exception as e: - logger.error(f"Error in get_user_companies: {e}") - raise HTTPException(500, f"Eroare la obținerea listei de firme: {str(e)}") - - @router.get("/{company_id}", response_model=Company) - async def get_company_details( - company_id: str, - request: Request, - current_user: CurrentUser = Depends(get_current_user) - ): - """Get details of a specific company.""" - # Validate access - if company_id not in current_user.companies: - raise HTTPException(403, f"Nu aveți acces la firma {company_id}") - - try: - # Get server_id from request state (injected by auth middleware from JWT) - server_id = getattr(request.state, 'server_id', None) - async with oracle_pool.get_connection(server_id) as connection: - with connection.cursor() as cursor: - cursor.execute(""" - SELECT ID_FIRMA, FIRMA, SCHEMA, COD_FISCAL - FROM V_NOM_FIRME - WHERE ID_FIRMA = :company_id - """, {'company_id': int(company_id)}) - row = cursor.fetchone() - - if not row: - raise HTTPException(404, f"Firma {company_id} nu a fost găsită") - - return Company( - id_firma=row[0], - name=row[1], - schema_name=row[2], - fiscal_code=row[3] or "", - is_active=True - ) - - except HTTPException: - raise - except Exception as e: - raise HTTPException(500, f"Eroare la obținerea detaliilor firmei: {str(e)}") - - @router.get("/{company_id}/validate") - async def validate_company_access( - company_id: str, - current_user: CurrentUser = Depends(get_current_user) - ): - """Validate if user has access to a company.""" - has_access = company_id in current_user.companies - - return { - "company_id": company_id, - "has_access": has_access, - "user": current_user.username, - "message": "Acces validat" if has_access else "Acces refuzat" - } - - return router diff --git a/deploy-package-20260223-151231/shared/routes/system.py b/deploy-package-20260223-151231/shared/routes/system.py deleted file mode 100644 index ea798e3..0000000 --- a/deploy-package-20260223-151231/shared/routes/system.py +++ /dev/null @@ -1,192 +0,0 @@ -""" -System routes for server monitoring and logs. -""" - -import os -from pathlib import Path -from typing import Optional -from collections import deque - -from fastapi import APIRouter, Depends, Query, HTTPException -from pydantic import BaseModel - -from shared.auth.dependencies import get_current_user, CurrentUser - - -class AuthModeResponse(BaseModel): - """Response for auth mode endpoint.""" - mode: str # "single-server" or "multi-server" - supports_email_login: bool # True if email-based login is available - - -class LogEntry(BaseModel): - """Single log entry.""" - line: str - level: Optional[str] = None - - -class LogsResponse(BaseModel): - """Response with log entries.""" - file: str - lines: list[str] - total_lines: int - showing: int - logs_path: Optional[str] = None - file_exists: bool = True - file_size_kb: Optional[float] = None - - -def create_system_router() -> APIRouter: - """ - Create system router for logs and monitoring. - """ - router = APIRouter() - - @router.get("/auth-mode", response_model=AuthModeResponse) - async def get_auth_mode(): - """ - Get the authentication mode configuration. - - This is a PUBLIC endpoint (no auth required) that tells the frontend - whether to use the email-based multi-server login flow or the classic - username/password single-server flow. - - Returns: - - mode: "single-server" for legacy config, "multi-server" for ORACLE_SERVERS - - supports_email_login: True only in multi-server mode with email cache - """ - from backend.config import settings - - servers = settings.get_oracle_servers() - - # Multi-server mode: ANY servers configured via ORACLE_SERVERS - # Shows server dropdown even with 1 server (explicit server selection) - if servers and len(servers) >= 1: - return AuthModeResponse( - mode="multi-server", - supports_email_login=len(servers) > 1 # Email lookup only for 2+ servers - ) - - # Single-server mode: legacy config (no ORACLE_SERVERS, uses env vars) - return AuthModeResponse( - mode="single-server", - supports_email_login=False - ) - - def get_logs_path() -> Path: - """Get logs directory path based on environment.""" - # Windows production: C:\inetpub\wwwroot\roa2web\logs - # Development: backend/logs or ./logs - if os.name == 'nt': # Windows - prod_path = Path(r"C:\inetpub\wwwroot\roa2web\logs") - if prod_path.exists(): - return prod_path - - # Development fallback - dev_paths = [ - Path(__file__).parent.parent.parent / "backend" / "logs", - Path(__file__).parent.parent.parent / "logs", - Path("./logs"), - ] - for path in dev_paths: - if path.exists(): - return path - - return Path("./logs") - - @router.get("/logs", response_model=LogsResponse) - async def get_logs( - file: str = Query(default="backend-stderr", description="Log file: backend-stderr or backend-stdout"), - lines: int = Query(default=100, ge=10, le=1000, description="Number of lines to return"), - filter: Optional[str] = Query(default=None, description="Filter text (case-insensitive)"), - current_user: CurrentUser = Depends(get_current_user) - ): - """ - Get server log entries. - - Args: - file: Log file name (backend-stderr or backend-stdout) - lines: Number of lines to return (10-1000) - filter: Optional filter text - - Returns: - LogsResponse with log lines - """ - # Validate file name to prevent path traversal - allowed_files = ["backend-stderr", "backend-stdout"] - if file not in allowed_files: - raise HTTPException(status_code=400, detail=f"Invalid file. Allowed: {allowed_files}") - - logs_path = get_logs_path() - log_file = logs_path / f"{file}.log" - logs_path_str = str(logs_path.resolve()) - - if not log_file.exists(): - return LogsResponse( - file=file, - lines=[f"Log file not found: {log_file}"], - total_lines=0, - showing=0, - logs_path=logs_path_str, - file_exists=False, - file_size_kb=0 - ) - - try: - # Get file size - file_size_kb = round(log_file.stat().st_size / 1024, 2) - - # Read file and get last N lines efficiently - with open(log_file, 'r', encoding='utf-8', errors='replace') as f: - # Use deque for efficient tail operation - all_lines = deque(f, maxlen=lines * 2 if filter else lines) - - # Apply filter if provided - if filter: - filter_lower = filter.lower() - filtered_lines = [line.rstrip() for line in all_lines if filter_lower in line.lower()] - result_lines = list(filtered_lines)[-lines:] - else: - result_lines = [line.rstrip() for line in all_lines][-lines:] - - return LogsResponse( - file=file, - lines=result_lines, - total_lines=len(result_lines), - showing=len(result_lines), - logs_path=logs_path_str, - file_exists=True, - file_size_kb=file_size_kb - ) - - except Exception as e: - raise HTTPException(status_code=500, detail=f"Error reading logs: {str(e)}") - - @router.get("/logs/available") - async def get_available_logs( - current_user: CurrentUser = Depends(get_current_user) - ): - """ - Get list of available log files. - """ - logs_path = get_logs_path() - - if not logs_path.exists(): - return {"logs_path": str(logs_path), "files": [], "exists": False} - - log_files = [] - for f in logs_path.glob("*.log"): - stat = f.stat() - log_files.append({ - "name": f.stem, - "size_kb": round(stat.st_size / 1024, 1), - "modified": stat.st_mtime - }) - - return { - "logs_path": str(logs_path), - "files": sorted(log_files, key=lambda x: x["name"]), - "exists": True - } - - return router diff --git a/deploy-package-20260223-151231/shared/utils/__init__.py b/deploy-package-20260223-151231/shared/utils/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/deploy-package-20260223-151231/shared/utils/config.py b/deploy-package-20260223-151231/shared/utils/config.py deleted file mode 100644 index 7874174..0000000 --- a/deploy-package-20260223-151231/shared/utils/config.py +++ /dev/null @@ -1,39 +0,0 @@ -""" -Configurări comune pentru toate aplicațiile ROA2WEB -""" -import os -from typing import List, Dict, Any -from pydantic import BaseSettings - -class SharedConfig(BaseSettings): - """Configurări partajate între microservicii""" - - # Database - oracle_user: str = os.getenv('ORACLE_USER', '') - oracle_password: str = os.getenv('ORACLE_PASSWORD', '') - oracle_dsn: str = os.getenv('ORACLE_DSN', '') - - # Database Pool - db_min_connections: int = int(os.getenv('DB_MIN_CONNECTIONS', 2)) - db_max_connections: int = int(os.getenv('DB_MAX_CONNECTIONS', 10)) - db_connection_increment: int = int(os.getenv('DB_CONNECTION_INCREMENT', 1)) - - # JWT Authentication - jwt_secret_key: str = os.getenv('JWT_SECRET_KEY', 'your-super-secret-jwt-key-change-in-production') - jwt_algorithm: str = os.getenv('JWT_ALGORITHM', 'HS256') - access_token_expire_minutes: int = int(os.getenv('ACCESS_TOKEN_EXPIRE_MINUTES', 30)) - refresh_token_expire_days: int = int(os.getenv('REFRESH_TOKEN_EXPIRE_DAYS', 7)) - - # Authentication Settings - auth_cache_ttl_minutes: int = int(os.getenv('AUTH_CACHE_TTL_MINUTES', 15)) - rate_limit_max_requests: int = int(os.getenv('RATE_LIMIT_MAX_REQUESTS', 5)) - rate_limit_time_window: int = int(os.getenv('RATE_LIMIT_TIME_WINDOW', 300)) - - # Logging - log_level: str = os.getenv('LOG_LEVEL', 'INFO') - - class Config: - env_file = '.env' - -# Instance globală -shared_config = SharedConfig() \ No newline at end of file diff --git a/deploy-package-20260223-151231/shared/utils/exceptions.py b/deploy-package-20260223-151231/shared/utils/exceptions.py deleted file mode 100644 index d70f344..0000000 --- a/deploy-package-20260223-151231/shared/utils/exceptions.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -Exception handlers comune pentru ROA2WEB -""" -from typing import Any, Dict, Optional - -class ROAException(Exception): - """Exception de bază pentru aplicațiile ROA""" - def __init__(self, message: str, details: Optional[Dict[str, Any]] = None): - self.message = message - self.details = details or {} - super().__init__(self.message) - -class DatabaseException(ROAException): - """Excepții legate de baza de date""" - pass - -class AuthenticationException(ROAException): - """Excepții legate de autentificare""" - pass - -class AuthorizationException(ROAException): - """Excepții legate de autorizare""" - pass - -class ValidationException(ROAException): - """Excepții legate de validare date""" - pass \ No newline at end of file